From 9dbb1f3ca6a0e1559a5df09303a65014280a9825 Mon Sep 17 00:00:00 2001 From: Marcus Kammer <2262664-marcuskammer@users.noreply.gitlab.com> Date: Mon, 13 Apr 2020 16:04:39 +0200 Subject: [PATCH 1/4] Update fonts --- bundle/display.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle/display.el b/bundle/display.el index adab89ab..e35a248e 100644 --- a/bundle/display.el +++ b/bundle/display.el @@ -17,7 +17,7 @@ (display-time-mode -1) ; Display time in the mode line (add-to-list 'default-frame-alist '(fullscreen . maximized)) ; Maximize Window -(add-to-list 'default-frame-alist '(font . "Iosevka Term-13")) +(add-to-list 'default-frame-alist '(font . "Iosevka Term Medium-13")) (when (eq system-type 'gnu/linux) (add-to-list 'default-frame-alist '(undecorated . t))) From 720dc3c7d8617e1fe816977d96f46d69946b5e80 Mon Sep 17 00:00:00 2001 From: Marcus Kammer <2262664-marcuskammer@user.noreply.gitlab.com> Date: Mon, 20 Apr 2020 08:59:33 +0200 Subject: [PATCH 2/4] Add ob-dart package --- bundle/custom.el | 2 +- elpa/archives/gnu/archive-contents | 15 +- .../ob-dart-autoloads.el | 22 ++ elpa/ob-dart-20170106.1624/ob-dart-pkg.el | 2 + elpa/ob-dart-20170106.1624/ob-dart.el | 251 ++++++++++++++++++ elpa/ob-dart-20170106.1624/ob-dart.elc | Bin 0 -> 6975 bytes 6 files changed, 287 insertions(+), 5 deletions(-) create mode 100644 elpa/ob-dart-20170106.1624/ob-dart-autoloads.el create mode 100644 elpa/ob-dart-20170106.1624/ob-dart-pkg.el create mode 100644 elpa/ob-dart-20170106.1624/ob-dart.el create mode 100644 elpa/ob-dart-20170106.1624/ob-dart.elc diff --git a/bundle/custom.el b/bundle/custom.el index a98fcc04..8fd8806a 100644 --- a/bundle/custom.el +++ b/bundle/custom.el @@ -69,7 +69,7 @@ '(package-enable-at-startup t) '(package-selected-packages (quote - (dart-mode dart-server projectile python-django ivy elpy olivetti ace-window graphviz-dot-mode dot-mode plantuml-mode elisp-format elisp-lint flymake-racket google-translate org-pomodoro elm-mode dashboard pickle poet-theme flymake-eslint json-mode darkroom dockerfile-mode ein spacemacs-theme flucui-themes leuven-theme htmlize scss-mode berrys-theme web-mode python-docstring sphinx-doc sphinx-frontend sphinx-mode ox-nikola racket-mode slime gherkin-mode powershell typescript-mode ob-http ob-ipython ob-restclient nord-theme restclient request restclient-test yaml-mode magit))) + (ob-dart dart-mode dart-server projectile python-django ivy elpy olivetti ace-window graphviz-dot-mode dot-mode plantuml-mode elisp-format elisp-lint flymake-racket google-translate org-pomodoro elm-mode dashboard pickle poet-theme flymake-eslint json-mode darkroom dockerfile-mode ein spacemacs-theme flucui-themes leuven-theme htmlize scss-mode berrys-theme web-mode python-docstring sphinx-doc sphinx-frontend sphinx-mode ox-nikola racket-mode slime gherkin-mode powershell typescript-mode ob-http ob-ipython ob-restclient nord-theme restclient request restclient-test yaml-mode magit))) '(python-shell-interpreter "python3") '(register-preview-delay 2) '(register-separator 43) diff --git a/elpa/archives/gnu/archive-contents b/elpa/archives/gnu/archive-contents index 34dab016..08f6e561 100644 --- a/elpa/archives/gnu/archive-contents +++ b/elpa/archives/gnu/archive-contents @@ -581,7 +581,7 @@ ("Leo Liu" . "sdl.web@gmail.com")) (:keywords "killing" "convenience"))]) (ebdb . - [(0 6 13) + [(0 6 14) ((emacs (25 1)) (cl-lib @@ -635,7 +635,7 @@ ("Eduardo Ochs" . "eduardoochs@gmail.com")) (:keywords "lisp" "e-scripts"))]) (eglot . - [(1 5) + [(1 6) ((emacs (26 1)) (jsonrpc @@ -1549,7 +1549,7 @@ ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:url . "http://elpa.gnu.org/packages/persist.html"))]) (phps-mode . - [(0 3 39) + [(0 3 42) ((emacs (26))) "Major mode for PHP with Semantic integration" tar @@ -1871,10 +1871,17 @@ ("Ralph Amissah & Ambrose Kofi Laing")) (:maintainer "Ralph Amissah" . "ralph.amissah@gmail.com") (:url . "http://www.sisudoc.org/"))]) + (sm-c-mode . + [(1 0) + nil "C major mode based on SMIE" single + ((:url . "http://elpa.gnu.org/packages/sm-c-mode.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) (smalltalk-mode . [(3 2 92) nil "Major mode for the GNU Smalltalk programming language" tar - ((:maintainer "Derek Zhou" . "derek@shannon-data.com") + ((:maintainer "Derek Zhou" . "derek@3qin.us") (:authors ("Steve Byrne")) (:url . "http://elpa.gnu.org/packages/smalltalk-mode.html"))]) diff --git a/elpa/ob-dart-20170106.1624/ob-dart-autoloads.el b/elpa/ob-dart-20170106.1624/ob-dart-autoloads.el new file mode 100644 index 00000000..a7ade136 --- /dev/null +++ b/elpa/ob-dart-20170106.1624/ob-dart-autoloads.el @@ -0,0 +1,22 @@ +;;; ob-dart-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "ob-dart" "ob-dart.el" (0 0 0 0)) +;;; Generated autoloads from ob-dart.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-dart" '("org-babel-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; ob-dart-autoloads.el ends here diff --git a/elpa/ob-dart-20170106.1624/ob-dart-pkg.el b/elpa/ob-dart-20170106.1624/ob-dart-pkg.el new file mode 100644 index 00000000..354f129e --- /dev/null +++ b/elpa/ob-dart-20170106.1624/ob-dart-pkg.el @@ -0,0 +1,2 @@ +;;; -*- no-byte-compile: t -*- +(define-package "ob-dart" "20170106.1624" "org-babel functions for Dart evaluation" 'nil :commit "04d63b922a5469506560ca0c00678e57131e0269" :keywords '("literate programming" "reproducible research" "emacs" "org" "babel" "dart") :authors '(("Milan Zimmermann")) :maintainer '("Milan Zimmermann") :url "http://github.org/mzimmerm/ob-dart") diff --git a/elpa/ob-dart-20170106.1624/ob-dart.el b/elpa/ob-dart-20170106.1624/ob-dart.el new file mode 100644 index 00000000..cc285f16 --- /dev/null +++ b/elpa/ob-dart-20170106.1624/ob-dart.el @@ -0,0 +1,251 @@ +;;; ob-dart.el --- org-babel functions for Dart evaluation + +;; Copyright (C) 2016 Free Software Foundation, Inc. + +;; Author: Milan Zimmermann +;; Keywords: literate programming, reproducible research, emacs, org, babel, dart +;; Package-Version: 20170106.1624 +;; Homepage: http://github.org/mzimmerm/ob-dart + +;; This is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; For the GNU General Public License, see . + +;;; Commentary: +;; - Currently only supports execution of Dart code that can be wrapped +;; in Dart main() method body. +;; Todo: +;; - Support any valid Dart code, including class definitions and +;; the main() method +;; - Session support + +;;; Requirements: +;; - Dart language installed - An implementation can be downloaded from +;; https://www.dartlang.org/downloads/ +;; - The dart executable is on the PATH +;; - (Optional) Dart major mode - Can be installed from MELPA + +;; Notes: +;; - Code follows / inspired by these previously supported org-languages, +;; roughly in this order: +;; - ob-io.el +;; - ob-scala.el +;; - ob-groovy.el +;; - ob-R.el +;; - ob-python.el + +;;; Code: + +(require 'ob) +(eval-when-compile (require 'cl)) + +(defvar org-babel-tangle-lang-exts) +(add-to-list 'org-babel-tangle-lang-exts '("dart" . "dart")) +(defvar org-babel-default-header-args:dart '()) +(defvar org-babel-dart-command "dart" + "Name of the command to use for executing Dart code. todo - Windows") + +(defun org-babel-execute:dart (body params) + " +Execute a block of Dart code with org-babel. This function is +called by `org-babel-execute-src-block' + +Args: + BODY - String - Dart code from org file, between #+begin_src and #+end_src + - should be named: dart-src + PARAMS - List - Org parameters after #+begin_src and #+end_src + - todo - document better, is this correct? +" + (message "executing Dart source code block") + (let* ((processed-params (org-babel-process-params params)) + (session (org-babel-dart-initiate-session (nth 0 processed-params))) + (vars (nth 1 processed-params)) + (result-params (nth 2 processed-params)) + (result-type (cdr (assoc :result-type params))) + (full-body (org-babel-expand-body:generic + body params)) + (result (org-babel-dart-evaluate + session full-body result-type result-params))) + + (org-babel-reassemble-table + result + (org-babel-pick-name + (cdr (assoc :colname-names params)) (cdr (assoc :colnames params))) + (org-babel-pick-name + (cdr (assoc :rowname-names params)) (cdr (assoc :rownames params)))))) + + +(defun org-babel-dart-table-or-string (results) + " +Convert RESULTS into an appropriate elisp value. + +The default core implementation org-babel-script-escape behaves as follows: + - If RESULTS look like a table (grouped using () or {} or [] and delimited by comme), + then convert them into an Emacs-lisp table (list of lists), + - otherwise return the results unchanged as a string. + +Args: + RESULTS - String - String resulting from Dart invocation, and printed to stdio + by stdout.write() or print() +" + (org-babel-script-escape results)) + +;; Variable which returns Dart code in String. +;; +;; The Dart code wraps Dart source between the org document's #+begin_src and #+end_src, +;; in a Dart main() method. There are some added runZoned() tricks to either use +;; the printed strings or returned value as results of the #+begin_src and #+end_src +;; code. +;; +;; The above behaviour is controlled by an argument passed from elisp +;; to the during 'org-babel-eval dart-code argument'. +;; +;; In particular, if the passed argument (named results_collection_type in code) is: +;; - "output": +;; - Strings from Dart print() is send to the standart output, +;; and becomes the result +;; - "value": +;; - Value of the last statement converted to String is send to the standart output, +;; and becomes the result. + +(defvar org-babel-dart-wrapper-method + + " +//import 'dart:analysis_server'; +//import 'dart:analyzer'; +import 'dart:async'; +import 'dart:collection'; +import 'dart:convert'; +import 'dart:core'; +//import 'dart:developer'; +//import 'dart:html'; +//import 'dart:indexed_db'; +//import 'dart:internal'; +import 'dart:io'; +import 'dart:isolate'; +//import 'dart:js'; +import 'dart:math'; +import 'dart:mirrors'; +//import 'dart:profiler'; +//import 'dart:svg'; +//import 'dart:typed_data'; +//import 'dart:web_audio'; +//import 'dart:web_gl'; +//import 'dart:web_sql'; + + +//// Helper class allows to run Dart code wrapped in emacs org mode +//// Also see: +//// https://gist.github.com/0e1dd60ca06369f7990d0ecfda8ed6a7 +//// https://dartpad.dartlang.org/0e1dd60ca06369f7990d0ecfda8ed6a7 +class Gen { + + // Wrapped code from the org file, between #+begin_src and #+end_src + + runSrc() { + // print(\"from print - for :results output\"); + // return \"returning - for :result value\"; + // Code from begin_src .. end_src inserted here by elisp format. + // See (format org-babel-dart-wrapper-method body) + %s + } + + // run, allow print to stdout, and ignore return value + runSrcResultsOutput() { + runSrc(); + } + + // run, ignore print to stdout, and use return value (which will be printed to stdout) + runSrcResultsValue() { + // ignore prints to stdout + var retval; + runZoned(() { + retval = runSrc(); + }, zoneSpecification: new ZoneSpecification( + print: (self, parent, zone, message) { + // Ignore argument message passed to print. + })); + + return retval; + } +} + +void main(List args) { + + // new Gen().runSrcResultsOutput(); + // print(\"${new Gen().runSrcResultsValue()}\"); + + var results_collection_type = null; + if (args != null && args.length > 0) { + results_collection_type = args.elementAt(0); + } + + if (results_collection_type == \"output\") { + // generate this for :results output + new Gen().runSrcResultsOutput(); + } else if (results_collection_type == \"value\") { + // generate this for :results value (use return value and print it) + // this works because in Dart print inside print still goes to stdout + stdout.write(\"${new Gen().runSrcResultsValue()}\"); // print with no newline. Needed for + } else { + throw new Exception(\"Invalid collection type in results: ${results_collection_type}. Only one of [output/value] allowed.\"); + } + +} +" + ) + + +(defun org-babel-dart-evaluate + (session body &optional result-type result-params) + " +Evaluate BODY in external Dart process. +If RESULT-TYPE equals 'output then return standard output as a string. +If RESULT-TYPE equals 'value then return the value of the last statement +in BODY as elisp. + +Args: + SESSION - TODO DOCUMENT + BODY - String from org file, between #+begin_src and #+end_src + - should be named: dart-src + RESULT-TYPE - Symbol with value (output|value) that follows #+begin_src :results TODO DOCUMENT + - should be named: results-collection - Symbol - (output|value) - + RESULT-PARAMS - Symbol TODO DOCUMENT likely the 'format' type from docs + - should be named: results-format +" + (when session (error "Session is not (yet) supported for Dart.")) + + (let* ((src-file (org-babel-temp-file "dart-")) + (wrapper (format org-babel-dart-wrapper-method body))) + + (with-temp-file src-file (insert wrapper)) + (let ((raw (org-babel-eval + (concat org-babel-dart-command " " src-file " " (symbol-name result-type)) ""))) + ;; result-type: both 'value and 'output formats results as table, unless raw is specified + (org-babel-result-cond result-params + raw + (org-babel-dart-table-or-string raw))))) + +(defun org-babel-prep-session:dart (session params) + "Prepare SESSION according to the header arguments specified in PARAMS." + (error "Session is not (yet) supported for Dart.")) + +(defun org-babel-dart-initiate-session (&optional session) + " +If there is not a current inferior-process-buffer in SESSION +then create. Return the initialized session. Sessions are not +supported in Dart. +" + nil) + +(provide 'ob-dart) + +;;; ob-dart.el ends here diff --git a/elpa/ob-dart-20170106.1624/ob-dart.elc b/elpa/ob-dart-20170106.1624/ob-dart.elc new file mode 100644 index 0000000000000000000000000000000000000000..4b7a7bcfb4ef6af2b6a2b2a3244dddfde374c7b4 GIT binary patch literal 6975 zcmbtZZFAek5%!l(Eq0=BO{Q()u1MP=6M-T@ij?GWW7XEQo^dQskLv!>8jVPUMyhiPb(#nGc$yEqL(HV!$@$}_PbnM)SrF!6 zaZip9(ujnAx;!SD#(&pWt5Nbq2IFSLIuC+A2aY<|CLImYX2%%UZ^8Q z629eDgHW8L77_oaVT6dcylyq&n6kO&5X=H<0`ApGRh-rwKSx1fNmSF|oFp6@2~TUwNRr3i#%9tkRs>29Z5z2RDkJP-mG6^KVP`mVzV>4DGII%UVU{Rkg39 zE6bCqiS2e^s$FNh&BpDWKlNJ8=GLQ~KX08p`U}SX*5Q|Uz@nS&+r9G1R~Q^@{}IDG zpJUkRrQ4r>)*IZt^9A0z+xYe21^m6=$^70SJGrT%;8GNLs@lT3%o z7!`SL0(d1r2RAU3DZ|F^mfTx@HBmIiXTcE8`GI*GJ$qSl`D(m8uK~yI2*H>M}^CAh|T3DG*iTKF}Z! z@Vm4$iNiM@TOA#TI^lu5nfWV5nVu~#xK~4R>w{^M2tQ777j#J0XFErSwF`FIcK47< zk97(V&guKp^Be#9x&N~P7+`ZJF!Pk2lK-dt=~`*zhMlq8mSI5J)Hm+riNjw zS_64{f6c$IF2sc+a5s)~iyRD6sWWShND-WjvQo0x1LYq&UZd^Z=)u+*k@8 zX>7`7G0-zp`7}!fSFHsY0(2o*4RJ6e3dlxN=%;|ELZeIg7@=u zfqNnrRG+d?xDAs>v9=O@h*1DbtmmUXY6<8rfa<*-`Q2O)9$iiZ3tWpo3jiig|G#99O(#Xl)tz{f4zsK2A1F zBbow^qSsM><04=k;_}i8%duXcGCF}1ZlLmCv-a^g$VcmwahB;!KK?-EaBReTbZS+OGpJ_8Y1hMV&?% zG&-%$(V%;D)QB1?97MsPiaJ4ejR2eLB#7$#)MRHZIlgq4tY;b6XGGHm9z?BOp-~-lLpPx%~t`t@6 z^b*<#Tzvo@9N}tq=RL#EYyROs7GRnJLfLAp0vv=wREw+>4^s|XPEZMJywxi3dr33Q znJ8wV%|g2(_1bBUqE)d)?D=t=doLeFRGp3DaDOc>=VgWxcL`{-UTxd za`{AY4jTqo4#Ev(d?X|TyIUgJzjdmjYC(eMWSt()?M5Wqy56IA`1E|D!gvtdfOJf$ znh{f2nXcNywuJvcgwQymG0M{FGtSDnLUKp*PMpkwzyYhZ`ig#w+kU{>E9^*k zsP@Wt-`}vy-O9CfA3nh-+8&*kk+vG!T-29MwWmuZ^eTx`;F_OA+#wXRrCZvFnTQ{g< zu0+$RAJg6UH{ADiozBwair~Rql)th!zc0E( z63tMlqIwYpoCV=gmaam#jnbaKWy6q~8;7ECAsI}eOR3!IrFkyzz5MCLDWMe-BwV42 zsd4tq>`EqW&;|jtM=k`d=Fm5gv6sJ0g(Ib%bxjYX3^`I_u*wBV37iVY$k3&TSxV2( zPtVVvo;_!kN0^MYYmzm`C{)(OhlhCEeHlsH8-FBS5A?v`p~ z;m(6RaVSgKwFOWM-9{PIx_t|Mlhxh{Ivq`EpZLA>554l2TekJlY~y*bv-8!R3I-i? z2|L+mKTET45b~o|yrO?1{Sm*}+{U-uDe;^4_>(=1{O!B=ZGo!K&6W1{J=9~J#_upb zKr`n4_U@f3#+~hI&u<-k3nmYGe!C4m{jQzER2yq8Otl*8Q_b}$e|@U8KGj~II#{0a znTeKT%rar8R``;s_JXe#xNl%%dxbAdZQlnC-^teYx9{)lVS*d2#bu%&=ShDXUg=t_ zH|31v@<^&QA6AZm5fiUJ9Sl%wC@ztxeD2yk=(TZ^yLzP%Ow4q`WvWAL4j%R8PLhxj z2BbCWl^NKP+9I0fj=UG5)dTb_;;V;HP%KH4r%Ycn8Oiv+E~6SpOII3pwhlkof@&K6 zye6+SD`XkBJ)$>=TaF&;@e7EFW`LKW)rrJ(Qn1r+$mX#$pv(|j@i`&?A zk459zd8YN!U{-joYY0|apy4^cy`ZjZO0>HN(v+w?>iYB|Q=Fbs0sTRU{#C>k4#GWS zlI^T>E+&boA!GAkTsi6bv0;BK5X-GIU=n#E`$$0-avMysc2c{-DaL{1SU>_nqXY_tv}U-Y_cA2f;I zK?6<}eBitUwK>j%pOh9J0;1v|ABE(#?kb>pfyVBfLRr??VZ;~IEIOFoW>Y#%km!=r Nw_V-$*s^M+{{#HVyP5z1 literal 0 HcmV?d00001 From 2f026009d0aa01a43f5e8bad7aeef14096d1ef8e Mon Sep 17 00:00:00 2001 From: Marcus Kammer <2262664-marcuskammer@user.noreply.gitlab.com> Date: Mon, 20 Apr 2020 10:21:29 +0200 Subject: [PATCH 3/4] Remove packages from repo --- .../ace-window-autoloads.el | 81 - .../ace-window-pkg.el | 2 - elpa/ace-window-20200311.1025/ace-window.el | 953 - elpa/ace-window-20200311.1025/ace-window.elc | Bin 28501 -> 0 bytes elpa/ace-window-readme.txt | 34 - elpa/alert-20200303.2118/alert-autoloads.el | 100 - elpa/alert-20200303.2118/alert-pkg.el | 2 - elpa/alert-20200303.2118/alert.el | 1175 - elpa/alert-20200303.2118/alert.elc | Bin 42573 -> 0 bytes .../anaphora-autoloads.el | 228 - elpa/anaphora-20180618.2200/anaphora-pkg.el | 2 - elpa/anaphora-20180618.2200/anaphora.el | 461 - elpa/anaphora-20180618.2200/anaphora.elc | Bin 10810 -> 0 bytes elpa/archives/gnu/archive-contents | 2406 -- elpa/archives/gnu/archive-contents.signed | 1 - elpa/async-20200113.1745/async-autoloads.el | 174 - elpa/async-20200113.1745/async-bytecomp.el | 210 - elpa/async-20200113.1745/async-bytecomp.elc | Bin 7322 -> 0 bytes elpa/async-20200113.1745/async-pkg.el | 8 - elpa/async-20200113.1745/async.el | 408 - elpa/async-20200113.1745/async.elc | Bin 11497 -> 0 bytes elpa/async-20200113.1745/dired-async.el | 408 - elpa/async-20200113.1745/dired-async.elc | Bin 13978 -> 0 bytes elpa/async-20200113.1745/smtpmail-async.el | 73 - elpa/async-20200113.1745/smtpmail-async.elc | Bin 1587 -> 0 bytes elpa/atom-one-dark-theme-readme.txt | 1 - elpa/avy-20200311.1106/avy-autoloads.el | 272 - elpa/avy-20200311.1106/avy-pkg.el | 2 - elpa/avy-20200311.1106/avy.el | 2197 -- elpa/avy-20200311.1106/avy.elc | Bin 79009 -> 0 bytes .../berrys-theme-autoloads.el | 24 - .../berrys-theme-pkg.el | 2 - .../berrys-theme.el | 399 - elpa/company-20200324.2145/company-abbrev.el | 50 - elpa/company-20200324.2145/company-abbrev.elc | Bin 1170 -> 0 bytes .../company-autoloads.el | 383 - elpa/company-20200324.2145/company-bbdb.el | 63 - elpa/company-20200324.2145/company-bbdb.elc | Bin 1758 -> 0 bytes elpa/company-20200324.2145/company-capf.el | 208 - elpa/company-20200324.2145/company-capf.elc | Bin 4943 -> 0 bytes elpa/company-20200324.2145/company-clang.el | 385 - elpa/company-20200324.2145/company-clang.elc | Bin 14858 -> 0 bytes elpa/company-20200324.2145/company-cmake.el | 206 - elpa/company-20200324.2145/company-cmake.elc | Bin 6062 -> 0 bytes elpa/company-20200324.2145/company-css.el | 446 - elpa/company-20200324.2145/company-css.elc | Bin 16945 -> 0 bytes .../company-dabbrev-code.el | 104 - .../company-dabbrev-code.elc | Bin 3595 -> 0 bytes elpa/company-20200324.2145/company-dabbrev.el | 206 - .../company-20200324.2145/company-dabbrev.elc | Bin 6950 -> 0 bytes elpa/company-20200324.2145/company-eclim.el | 186 - elpa/company-20200324.2145/company-eclim.elc | Bin 5476 -> 0 bytes elpa/company-20200324.2145/company-elisp.el | 226 - elpa/company-20200324.2145/company-elisp.elc | Bin 6686 -> 0 bytes elpa/company-20200324.2145/company-etags.el | 108 - elpa/company-20200324.2145/company-etags.elc | Bin 3108 -> 0 bytes elpa/company-20200324.2145/company-files.el | 148 - elpa/company-20200324.2145/company-files.elc | Bin 4376 -> 0 bytes elpa/company-20200324.2145/company-gtags.el | 119 - elpa/company-20200324.2145/company-gtags.elc | Bin 3683 -> 0 bytes elpa/company-20200324.2145/company-ispell.el | 82 - elpa/company-20200324.2145/company-ispell.elc | Bin 1972 -> 0 bytes .../company-20200324.2145/company-keywords.el | 314 - .../company-keywords.elc | Bin 18533 -> 0 bytes elpa/company-20200324.2145/company-nxml.el | 143 - elpa/company-20200324.2145/company-nxml.elc | Bin 4220 -> 0 bytes elpa/company-20200324.2145/company-oddmuse.el | 57 - .../company-20200324.2145/company-oddmuse.elc | Bin 1423 -> 0 bytes elpa/company-20200324.2145/company-pkg.el | 12 - .../company-20200324.2145/company-semantic.el | 168 - .../company-semantic.elc | Bin 5237 -> 0 bytes .../company-20200324.2145/company-template.el | 272 - .../company-template.elc | Bin 8444 -> 0 bytes elpa/company-20200324.2145/company-tempo.el | 71 - elpa/company-20200324.2145/company-tempo.elc | Bin 2233 -> 0 bytes elpa/company-20200324.2145/company-tng.el | 194 - elpa/company-20200324.2145/company-tng.elc | Bin 4259 -> 0 bytes elpa/company-20200324.2145/company-xcode.el | 123 - elpa/company-20200324.2145/company-xcode.elc | Bin 3741 -> 0 bytes .../company-yasnippet.el | 176 - .../company-yasnippet.elc | Bin 4444 -> 0 bytes elpa/company-20200324.2145/company.el | 3239 --- elpa/company-20200324.2145/company.elc | Bin 106701 -> 0 bytes elpa/darkroom-0.2.signed | 1 - elpa/darkroom-0.2/darkroom-autoloads.el | 36 - elpa/darkroom-0.2/darkroom-pkg.el | 2 - elpa/darkroom-0.2/darkroom.el | 399 - elpa/darkroom-0.2/darkroom.elc | Bin 12627 -> 0 bytes elpa/darkroom-readme.txt | 20 - .../dart-mode-autoloads.el | 34 - elpa/dart-mode-20190827.2102/dart-mode-pkg.el | 2 - elpa/dart-mode-20190827.2102/dart-mode.el | 625 - elpa/dart-mode-20190827.2102/dart-mode.elc | Bin 17191 -> 0 bytes elpa/dart-mode-readme.txt | 3 - .../dart-server-autoloads.el | 31 - .../dart-server-pkg.el | 2 - elpa/dart-server-20190817.1254/dart-server.el | 1454 - .../dart-server-20190817.1254/dart-server.elc | Bin 55567 -> 0 bytes elpa/dart-server-readme.txt | 4 - elpa/dash-20200119.2310/dash-autoloads.el | 26 - elpa/dash-20200119.2310/dash-pkg.el | 9 - elpa/dash-20200119.2310/dash.el | 3072 --- elpa/dash-20200119.2310/dash.elc | Bin 102271 -> 0 bytes elpa/dash-20200119.2310/dash.info | 3410 --- elpa/dash-20200119.2310/dir | 18 - .../dash-functional-autoloads.el | 23 - .../dash-functional-pkg.el | 2 - .../dash-functional.el | 219 - .../dash-functional.elc | Bin 9070 -> 0 bytes elpa/dashboard-20200306.1344/banners/1.txt | 8 - elpa/dashboard-20200306.1344/banners/2.txt | 6 - elpa/dashboard-20200306.1344/banners/3.txt | 8 - .../dashboard-20200306.1344/banners/emacs.png | Bin 43759 -> 0 bytes elpa/dashboard-20200306.1344/banners/logo.png | Bin 32305 -> 0 bytes .../dashboard-autoloads.el | 41 - elpa/dashboard-20200306.1344/dashboard-pkg.el | 13 - .../dashboard-widgets.el | 729 - .../dashboard-widgets.elc | Bin 28252 -> 0 bytes elpa/dashboard-20200306.1344/dashboard.el | 258 - elpa/dashboard-20200306.1344/dashboard.elc | Bin 7752 -> 0 bytes .../deferred-autoloads.el | 22 - elpa/deferred-20170901.1330/deferred-pkg.el | 2 - elpa/deferred-20170901.1330/deferred.el | 972 - elpa/deferred-20170901.1330/deferred.elc | Bin 39152 -> 0 bytes .../dockerfile-mode-autoloads.el | 45 - .../dockerfile-mode-pkg.el | 2 - .../dockerfile-mode.el | 234 - .../dockerfile-mode.elc | Bin 10084 -> 0 bytes .../dot-mode-autoloads.el | 76 - elpa/dot-mode-20180312.2300/dot-mode-pkg.el | 2 - elpa/dot-mode-20180312.2300/dot-mode.el | 514 - elpa/dot-mode-20180312.2300/dot-mode.elc | Bin 11248 -> 0 bytes elpa/ein-20200415.238/ein-autoloads.el | 439 - elpa/ein-20200415.238/ein-cell.el | 1054 - elpa/ein-20200415.238/ein-cell.elc | Bin 39837 -> 0 bytes elpa/ein-20200415.238/ein-classes.el | 345 - elpa/ein-20200415.238/ein-classes.elc | Bin 86041 -> 0 bytes elpa/ein-20200415.238/ein-completer.el | 34 - elpa/ein-20200415.238/ein-completer.elc | Bin 587 -> 0 bytes elpa/ein-20200415.238/ein-contents-api.el | 402 - elpa/ein-20200415.238/ein-contents-api.elc | Bin 21262 -> 0 bytes elpa/ein-20200415.238/ein-core.el | 361 - elpa/ein-20200415.238/ein-core.elc | Bin 14043 -> 0 bytes elpa/ein-20200415.238/ein-dev.el | 330 - elpa/ein-20200415.238/ein-dev.elc | Bin 13086 -> 0 bytes elpa/ein-20200415.238/ein-events.el | 63 - elpa/ein-20200415.238/ein-events.elc | Bin 1842 -> 0 bytes elpa/ein-20200415.238/ein-file.el | 64 - elpa/ein-20200415.238/ein-file.elc | Bin 2433 -> 0 bytes elpa/ein-20200415.238/ein-ipdb.el | 151 - elpa/ein-20200415.238/ein-ipdb.elc | Bin 13787 -> 0 bytes elpa/ein-20200415.238/ein-ipynb-mode.el | 54 - elpa/ein-20200415.238/ein-ipynb-mode.elc | Bin 3365 -> 0 bytes elpa/ein-20200415.238/ein-jupyter.el | 358 - elpa/ein-20200415.238/ein-jupyter.elc | Bin 13478 -> 0 bytes elpa/ein-20200415.238/ein-jupyterhub.el | 209 - elpa/ein-20200415.238/ein-jupyterhub.elc | Bin 41339 -> 0 bytes elpa/ein-20200415.238/ein-kernel.el | 798 - elpa/ein-20200415.238/ein-kernel.elc | Bin 37745 -> 0 bytes elpa/ein-20200415.238/ein-kernelinfo.el | 56 - elpa/ein-20200415.238/ein-kernelinfo.elc | Bin 2270 -> 0 bytes elpa/ein-20200415.238/ein-kill-ring.el | 55 - elpa/ein-20200415.238/ein-kill-ring.elc | Bin 1245 -> 0 bytes elpa/ein-20200415.238/ein-log.el | 119 - elpa/ein-20200415.238/ein-log.elc | Bin 3551 -> 0 bytes elpa/ein-20200415.238/ein-markdown-mode.el | 8084 ------ elpa/ein-20200415.238/ein-markdown-mode.elc | Bin 270910 -> 0 bytes elpa/ein-20200415.238/ein-node.el | 65 - elpa/ein-20200415.238/ein-node.elc | Bin 6076 -> 0 bytes elpa/ein-20200415.238/ein-notebook.el | 1346 - elpa/ein-20200415.238/ein-notebook.elc | Bin 212905 -> 0 bytes elpa/ein-20200415.238/ein-notebooklist.el | 781 - elpa/ein-20200415.238/ein-notebooklist.elc | Bin 43747 -> 0 bytes elpa/ein-20200415.238/ein-notification.el | 315 - elpa/ein-20200415.238/ein-notification.elc | Bin 12443 -> 0 bytes elpa/ein-20200415.238/ein-output-area.el | 163 - elpa/ein-20200415.238/ein-output-area.elc | Bin 4825 -> 0 bytes elpa/ein-20200415.238/ein-pager.el | 98 - elpa/ein-20200415.238/ein-pager.elc | Bin 4324 -> 0 bytes elpa/ein-20200415.238/ein-pkg.el | 11 - elpa/ein-20200415.238/ein-process.el | 214 - elpa/ein-20200415.238/ein-process.elc | Bin 13702 -> 0 bytes elpa/ein-20200415.238/ein-python-send.el | 160 - elpa/ein-20200415.238/ein-python-send.elc | Bin 4612 -> 0 bytes elpa/ein-20200415.238/ein-pytools.el | 54 - elpa/ein-20200415.238/ein-pytools.elc | Bin 1461 -> 0 bytes elpa/ein-20200415.238/ein-query.el | 131 - elpa/ein-20200415.238/ein-query.elc | Bin 5211 -> 0 bytes elpa/ein-20200415.238/ein-scratchsheet.el | 53 - elpa/ein-20200415.238/ein-scratchsheet.elc | Bin 2132 -> 0 bytes elpa/ein-20200415.238/ein-shared-output.el | 232 - elpa/ein-20200415.238/ein-shared-output.elc | Bin 12378 -> 0 bytes elpa/ein-20200415.238/ein-traceback.el | 200 - elpa/ein-20200415.238/ein-traceback.elc | Bin 10925 -> 0 bytes elpa/ein-20200415.238/ein-utils.el | 748 - elpa/ein-20200415.238/ein-utils.elc | Bin 27807 -> 0 bytes elpa/ein-20200415.238/ein-websocket.el | 149 - elpa/ein-20200415.238/ein-websocket.elc | Bin 6458 -> 0 bytes elpa/ein-20200415.238/ein-worksheet.el | 1182 - elpa/ein-20200415.238/ein-worksheet.elc | Bin 50866 -> 0 bytes elpa/ein-20200415.238/ein.el | 50 - elpa/ein-20200415.238/ein.elc | Bin 547 -> 0 bytes elpa/ein-20200415.238/ob-ein.el | 410 - elpa/ein-20200415.238/ob-ein.elc | Bin 16739 -> 0 bytes elpa/ein-20200415.238/poly-ein.el | 412 - elpa/ein-20200415.238/poly-ein.elc | Bin 20158 -> 0 bytes .../elisp-format-autoloads.el | 68 - .../elisp-format-pkg.el | 2 - .../elisp-format-20160508.952/elisp-format.el | 1242 - .../elisp-format.elc | Bin 24315 -> 0 bytes .../elisp-lint-autoloads.el | 22 - .../elisp-lint-pkg.el | 2 - elpa/elisp-lint-20200324.2217/elisp-lint.el | 496 - elpa/elisp-lint-20200324.2217/elisp-lint.elc | Bin 13932 -> 0 bytes elpa/elm-mode-20200406.214/elm-font-lock.el | 210 - elpa/elm-mode-20200406.214/elm-font-lock.elc | Bin 6706 -> 0 bytes elpa/elm-mode-20200406.214/elm-format.el | 66 - elpa/elm-mode-20200406.214/elm-format.elc | Bin 4814 -> 0 bytes elpa/elm-mode-20200406.214/elm-imenu.el | 22 - elpa/elm-mode-20200406.214/elm-imenu.elc | Bin 1142 -> 0 bytes elpa/elm-mode-20200406.214/elm-indent.el | 1234 - elpa/elm-mode-20200406.214/elm-indent.elc | Bin 29906 -> 0 bytes elpa/elm-mode-20200406.214/elm-interactive.el | 1162 - .../elm-mode-20200406.214/elm-interactive.elc | Bin 46418 -> 0 bytes .../elm-mode-autoloads.el | 267 - elpa/elm-mode-20200406.214/elm-mode-pkg.el | 14 - elpa/elm-mode-20200406.214/elm-mode.el | 181 - elpa/elm-mode-20200406.214/elm-mode.elc | Bin 6771 -> 0 bytes elpa/elm-mode-20200406.214/elm-tags.el | 62 - elpa/elm-mode-20200406.214/elm-tags.elc | Bin 1475 -> 0 bytes elpa/elm-mode-20200406.214/elm-util.el | 154 - elpa/elm-mode-20200406.214/elm-util.elc | Bin 4962 -> 0 bytes elpa/elm-mode-20200406.214/elm.tags | 4 - elpa/elpy-20191120.1927/elpy/__init__.pyc | Bin 776 -> 0 bytes elpa/elpy-20191120.1927/elpy/auto_pep8.pyc | Bin 862 -> 0 bytes elpa/elpy-20191120.1927/elpy/blackutil.pyc | Bin 2036 -> 0 bytes elpa/elpy-20191120.1927/elpy/compat.pyc | Bin 1074 -> 0 bytes elpa/elpy-20191120.1927/elpy/jedibackend.pyc | Bin 11528 -> 0 bytes elpa/elpy-20191120.1927/elpy/pydocutils.pyc | Bin 3303 -> 0 bytes elpa/elpy-20191120.1927/elpy/rpc.pyc | Bin 5435 -> 0 bytes elpa/elpy-20191120.1927/elpy/server.pyc | Bin 10875 -> 0 bytes elpa/elpy-20191120.1927/elpy/yapfutil.pyc | Bin 1331 -> 0 bytes elpa/elpy-20200329.1830/elpy-autoloads.el | 91 - elpa/elpy-20200329.1830/elpy-django.el | 335 - elpa/elpy-20200329.1830/elpy-django.elc | Bin 10850 -> 0 bytes elpa/elpy-20200329.1830/elpy-pkg.el | 10 - elpa/elpy-20200329.1830/elpy-profile.el | 114 - elpa/elpy-20200329.1830/elpy-profile.elc | Bin 3530 -> 0 bytes elpa/elpy-20200329.1830/elpy-refactor.el | 297 - elpa/elpy-20200329.1830/elpy-refactor.elc | Bin 10366 -> 0 bytes elpa/elpy-20200329.1830/elpy-rpc.el | 1170 - elpa/elpy-20200329.1830/elpy-rpc.elc | Bin 38801 -> 0 bytes elpa/elpy-20200329.1830/elpy-shell.el | 1343 - elpa/elpy-20200329.1830/elpy-shell.elc | Bin 53346 -> 0 bytes elpa/elpy-20200329.1830/elpy.el | 4033 --- elpa/elpy-20200329.1830/elpy.elc | Bin 119818 -> 0 bytes .../snippets/python-mode/.yas-setup.el | 68 - .../snippets/python-mode/.yas-setup.elc | Bin 2503 -> 0 bytes .../snippets/python-mode/__abs__ | 7 - .../snippets/python-mode/__add__ | 7 - .../snippets/python-mode/__and__ | 7 - .../snippets/python-mode/__bool__ | 7 - .../snippets/python-mode/__call__ | 7 - .../snippets/python-mode/__cmp__ | 7 - .../snippets/python-mode/__coerce__ | 7 - .../snippets/python-mode/__complex__ | 7 - .../snippets/python-mode/__contains__ | 7 - .../snippets/python-mode/__del__ | 7 - .../snippets/python-mode/__delattr__ | 7 - .../snippets/python-mode/__delete__ | 7 - .../snippets/python-mode/__delitem__ | 7 - .../snippets/python-mode/__div__ | 7 - .../snippets/python-mode/__divmod__ | 7 - .../snippets/python-mode/__enter__ | 9 - .../snippets/python-mode/__eq__ | 7 - .../snippets/python-mode/__exit__ | 7 - .../snippets/python-mode/__float__ | 7 - .../snippets/python-mode/__floordiv__ | 7 - .../snippets/python-mode/__ge__ | 7 - .../snippets/python-mode/__get__ | 7 - .../snippets/python-mode/__getattr__ | 7 - .../snippets/python-mode/__getattribute__ | 7 - .../snippets/python-mode/__getitem__ | 7 - .../snippets/python-mode/__gt__ | 7 - .../snippets/python-mode/__hash__ | 7 - .../snippets/python-mode/__hex__ | 7 - .../snippets/python-mode/__iadd__ | 7 - .../snippets/python-mode/__iand__ | 7 - .../snippets/python-mode/__idiv__ | 7 - .../snippets/python-mode/__ifloordiv__ | 7 - .../snippets/python-mode/__ilshift__ | 7 - .../snippets/python-mode/__imod__ | 7 - .../snippets/python-mode/__imul__ | 7 - .../snippets/python-mode/__index__ | 7 - .../snippets/python-mode/__init__ | 10 - .../snippets/python-mode/__instancecheck__ | 7 - .../snippets/python-mode/__int__ | 7 - .../snippets/python-mode/__invert__ | 7 - .../snippets/python-mode/__ior__ | 7 - .../snippets/python-mode/__ipow__ | 7 - .../snippets/python-mode/__irshift__ | 7 - .../snippets/python-mode/__isub__ | 7 - .../snippets/python-mode/__iter__ | 7 - .../snippets/python-mode/__itruediv__ | 7 - .../snippets/python-mode/__ixor__ | 7 - .../snippets/python-mode/__le__ | 7 - .../snippets/python-mode/__len__ | 7 - .../snippets/python-mode/__long__ | 7 - .../snippets/python-mode/__lshift__ | 7 - .../snippets/python-mode/__lt__ | 7 - .../snippets/python-mode/__mod__ | 7 - .../snippets/python-mode/__mul__ | 7 - .../snippets/python-mode/__ne__ | 7 - .../snippets/python-mode/__neg__ | 7 - .../snippets/python-mode/__new__ | 10 - .../snippets/python-mode/__nonzero__ | 7 - .../snippets/python-mode/__oct__ | 7 - .../snippets/python-mode/__or__ | 7 - .../snippets/python-mode/__pos__ | 7 - .../snippets/python-mode/__pow__ | 7 - .../snippets/python-mode/__radd__ | 7 - .../snippets/python-mode/__rand__ | 7 - .../snippets/python-mode/__rdivmod__ | 7 - .../snippets/python-mode/__repr__ | 7 - .../snippets/python-mode/__reversed__ | 7 - .../snippets/python-mode/__rfloordiv__ | 7 - .../snippets/python-mode/__rlshift__ | 7 - .../snippets/python-mode/__rmod__ | 7 - .../snippets/python-mode/__rmul__ | 7 - .../snippets/python-mode/__ror__ | 7 - .../snippets/python-mode/__rpow__ | 7 - .../snippets/python-mode/__rrshift__ | 7 - .../snippets/python-mode/__rshift__ | 7 - .../snippets/python-mode/__rsub__ | 7 - .../snippets/python-mode/__rtruediv__ | 7 - .../snippets/python-mode/__rxor__ | 7 - .../snippets/python-mode/__set__ | 7 - .../snippets/python-mode/__setattr__ | 7 - .../snippets/python-mode/__setitem__ | 7 - .../snippets/python-mode/__slots__ | 7 - .../snippets/python-mode/__str__ | 7 - .../snippets/python-mode/__sub__ | 7 - .../snippets/python-mode/__subclasscheck__ | 7 - .../snippets/python-mode/__truediv__ | 7 - .../snippets/python-mode/__unicode__ | 7 - .../snippets/python-mode/__xor__ | 7 - .../snippets/python-mode/_abs | 7 - .../snippets/python-mode/_add | 7 - .../snippets/python-mode/_and | 7 - .../snippets/python-mode/_bool | 7 - .../snippets/python-mode/_call | 7 - .../snippets/python-mode/_cmp | 7 - .../snippets/python-mode/_coerce | 7 - .../snippets/python-mode/_complex | 7 - .../snippets/python-mode/_contains | 7 - .../snippets/python-mode/_del | 7 - .../snippets/python-mode/_delattr | 7 - .../snippets/python-mode/_delete | 7 - .../snippets/python-mode/_delitem | 7 - .../snippets/python-mode/_div | 7 - .../snippets/python-mode/_divmod | 7 - .../snippets/python-mode/_enter | 9 - .../snippets/python-mode/_eq | 7 - .../snippets/python-mode/_exit | 7 - .../snippets/python-mode/_float | 7 - .../snippets/python-mode/_floordiv | 7 - .../snippets/python-mode/_ge | 7 - .../snippets/python-mode/_get | 7 - .../snippets/python-mode/_getattr | 7 - .../snippets/python-mode/_getattribute | 7 - .../snippets/python-mode/_getitem | 7 - .../snippets/python-mode/_gt | 7 - .../snippets/python-mode/_hash | 7 - .../snippets/python-mode/_hex | 7 - .../snippets/python-mode/_iadd | 7 - .../snippets/python-mode/_iand | 7 - .../snippets/python-mode/_idiv | 7 - .../snippets/python-mode/_ifloordiv | 7 - .../snippets/python-mode/_ilshift | 7 - .../snippets/python-mode/_imod | 7 - .../snippets/python-mode/_imul | 7 - .../snippets/python-mode/_index | 7 - .../snippets/python-mode/_init | 10 - .../snippets/python-mode/_instancecheck | 7 - .../snippets/python-mode/_int | 7 - .../snippets/python-mode/_invert | 7 - .../snippets/python-mode/_ior | 7 - .../snippets/python-mode/_ipow | 7 - .../snippets/python-mode/_irshift | 7 - .../snippets/python-mode/_isub | 7 - .../snippets/python-mode/_iter | 7 - .../snippets/python-mode/_itruediv | 7 - .../snippets/python-mode/_ixor | 7 - .../snippets/python-mode/_le | 7 - .../snippets/python-mode/_len | 7 - .../snippets/python-mode/_long | 7 - .../snippets/python-mode/_lshift | 7 - .../snippets/python-mode/_lt | 7 - .../snippets/python-mode/_mod | 7 - .../snippets/python-mode/_mul | 7 - .../snippets/python-mode/_ne | 7 - .../snippets/python-mode/_neg | 7 - .../snippets/python-mode/_new | 10 - .../snippets/python-mode/_nonzero | 7 - .../snippets/python-mode/_oct | 7 - .../snippets/python-mode/_or | 7 - .../snippets/python-mode/_pos | 7 - .../snippets/python-mode/_pow | 7 - .../snippets/python-mode/_radd | 7 - .../snippets/python-mode/_rand | 7 - .../snippets/python-mode/_rdivmod | 7 - .../snippets/python-mode/_repr | 7 - .../snippets/python-mode/_reversed | 7 - .../snippets/python-mode/_rfloordiv | 7 - .../snippets/python-mode/_rlshift | 7 - .../snippets/python-mode/_rmod | 7 - .../snippets/python-mode/_rmul | 7 - .../snippets/python-mode/_ror | 7 - .../snippets/python-mode/_rpow | 7 - .../snippets/python-mode/_rrshift | 7 - .../snippets/python-mode/_rshift | 7 - .../snippets/python-mode/_rsub | 7 - .../snippets/python-mode/_rtruediv | 7 - .../snippets/python-mode/_rxor | 7 - .../snippets/python-mode/_set | 7 - .../snippets/python-mode/_setattr | 7 - .../snippets/python-mode/_setitem | 7 - .../snippets/python-mode/_slots | 7 - .../snippets/python-mode/_str | 7 - .../snippets/python-mode/_sub | 7 - .../snippets/python-mode/_subclasscheck | 7 - .../snippets/python-mode/_truediv | 7 - .../snippets/python-mode/_unicode | 7 - .../snippets/python-mode/_xor | 7 - .../snippets/python-mode/ase | 6 - .../snippets/python-mode/asne | 6 - .../snippets/python-mode/asr | 7 - .../snippets/python-mode/class | 13 - .../snippets/python-mode/def | 7 - .../snippets/python-mode/defs | 7 - .../snippets/python-mode/enc | 6 - .../snippets/python-mode/env | 6 - .../snippets/python-mode/from | 7 - .../snippets/python-mode/pdb | 6 - .../snippets/python-mode/py3 | 7 - .../snippets/python-mode/super | 7 - elpa/epl-20180205.2049/epl-autoloads.el | 22 - elpa/epl-20180205.2049/epl-pkg.el | 2 - elpa/epl-20180205.2049/epl.el | 711 - elpa/epl-20180205.2049/epl.elc | Bin 32645 -> 0 bytes elpa/f-20191110.1357/f-autoloads.el | 22 - elpa/f-20191110.1357/f-pkg.el | 2 - elpa/f-20191110.1357/f.el | 624 - elpa/f-20191110.1357/f.elc | Bin 20520 -> 0 bytes elpa/faceup-20170925.1946/faceup-autoloads.el | 57 - elpa/faceup-20170925.1946/faceup-pkg.el | 2 - elpa/faceup-20170925.1946/faceup.el | 1182 - elpa/faceup-20170925.1946/faceup.elc | Bin 17366 -> 0 bytes .../flucui-dark-theme.el | 294 - .../flucui-light-theme.el | 294 - .../flucui-themes-autoloads.el | 56 - .../flucui-themes-pkg.el | 12 - .../flucui-themes.el | 60 - .../flucui-themes.elc | Bin 1274 -> 0 bytes .../flycheck-autoloads.el | 273 - .../flycheck-buttercup.el | 157 - elpa/flycheck-20200405.2310/flycheck-ert.el | 495 - elpa/flycheck-20200405.2310/flycheck-ert.elc | Bin 24583 -> 0 bytes elpa/flycheck-20200405.2310/flycheck-pkg.el | 16 - elpa/flycheck-20200405.2310/flycheck.el | 11791 -------- elpa/flycheck-20200405.2310/flycheck.elc | Bin 526885 -> 0 bytes .../flymake-eslint-autoloads.el | 28 - .../flymake-eslint-pkg.el | 2 - .../flymake-eslint.el | 190 - .../flymake-eslint.elc | Bin 5824 -> 0 bytes .../flymake-racket-autoloads.el | 33 - .../flymake-racket-pkg.el | 2 - .../flymake-racket.el | 235 - .../flymake-racket.elc | Bin 5510 -> 0 bytes .../gherkin-mode-autoloads.el | 22 - .../gherkin-mode-pkg.el | 2 - .../gherkin-mode.el | 64 - .../gherkin-mode.elc | Bin 3545 -> 0 bytes .../git-commit-autoloads.el | 53 - .../git-commit-pkg.el | 2 - elpa/git-commit-20200207.1819/git-commit.el | 1014 - elpa/git-commit-20200207.1819/git-commit.elc | Bin 35478 -> 0 bytes elpa/gntp-20141025.250/gntp-autoloads.el | 28 - elpa/gntp-20141025.250/gntp-pkg.el | 2 - elpa/gntp-20141025.250/gntp.el | 243 - elpa/gntp-20141025.250/gntp.elc | Bin 5974 -> 0 bytes elpa/gnupg/pubring.kbx | Bin 2413 -> 0 bytes elpa/gnupg/trustdb.gpg | Bin 1200 -> 0 bytes .../.bump-version.el | 10 - .../.bump-version.elc | Bin 684 -> 0 bytes .../google-translate-autoloads.el | 151 - .../google-translate-backend.el | 142 - .../google-translate-backend.elc | Bin 3937 -> 0 bytes .../google-translate-core-ui.el | 848 - .../google-translate-core-ui.elc | Bin 35065 -> 0 bytes .../google-translate-core.el | 265 - .../google-translate-core.elc | Bin 7763 -> 0 bytes .../google-translate-default-ui.el | 302 - .../google-translate-default-ui.elc | Bin 7393 -> 0 bytes .../google-translate-pkg.el | 4 - .../google-translate-smooth-ui.el | 323 - .../google-translate-smooth-ui.elc | Bin 7423 -> 0 bytes .../google-translate-tk.el | 176 - .../google-translate-tk.elc | Bin 4859 -> 0 bytes .../google-translate.el | 84 - .../google-translate.elc | Bin 509 -> 0 bytes .../company-graphviz-dot.el | 108 - .../company-graphviz-dot.elc | Bin 3518 -> 0 bytes .../graphviz-dot-mode-autoloads.el | 86 - .../graphviz-dot-mode-pkg.el | 10 - .../graphviz-dot-mode.el | 843 - .../graphviz-dot-mode.elc | Bin 29642 -> 0 bytes .../highlight-indentation-autoloads.el | 41 - .../highlight-indentation-pkg.el | 2 - .../highlight-indentation.el | 313 - .../highlight-indentation.elc | Bin 12256 -> 0 bytes .../htmlize-autoloads.el | 82 - elpa/htmlize-20191111.2130/htmlize-pkg.el | 2 - elpa/htmlize-20191111.2130/htmlize.el | 1883 -- elpa/htmlize-20191111.2130/htmlize.elc | Bin 60075 -> 0 bytes elpa/ivy-20200319.1247/colir.el | 124 - elpa/ivy-20200319.1247/colir.elc | Bin 3433 -> 0 bytes elpa/ivy-20200319.1247/dir | 18 - elpa/ivy-20200319.1247/elpa.el | 6 - elpa/ivy-20200319.1247/elpa.elc | Bin 648 -> 0 bytes elpa/ivy-20200319.1247/ivy-autoloads.el | 169 - elpa/ivy-20200319.1247/ivy-help.org | 138 - elpa/ivy-20200319.1247/ivy-overlay.el | 154 - elpa/ivy-20200319.1247/ivy-overlay.elc | Bin 3730 -> 0 bytes elpa/ivy-20200319.1247/ivy-pkg.el | 12 - elpa/ivy-20200319.1247/ivy.el | 5334 ---- elpa/ivy-20200319.1247/ivy.elc | Bin 202406 -> 0 bytes elpa/ivy-20200319.1247/ivy.info | 1954 -- elpa/ivy-gitlab-readme.txt | 1 - .../json-mode-autoloads.el | 65 - elpa/json-mode-20190123.422/json-mode-pkg.el | 2 - elpa/json-mode-20190123.422/json-mode.el | 223 - elpa/json-mode-20190123.422/json-mode.elc | Bin 8271 -> 0 bytes .../json-reformat-autoloads.el | 31 - .../json-reformat-pkg.el | 2 - .../json-reformat.el | 221 - .../json-reformat.elc | Bin 5137 -> 0 bytes .../json-snatcher-autoloads.el | 27 - .../json-snatcher-pkg.el | 2 - .../json-snatcher.el | 351 - .../json-snatcher.elc | Bin 8486 -> 0 bytes elpa/let-alist-1.0.6.signed | 1 - elpa/let-alist-1.0.6/let-alist-autoloads.el | 55 - elpa/let-alist-1.0.6/let-alist-pkg.el | 2 - elpa/let-alist-1.0.6/let-alist.el | 184 - elpa/let-alist-1.0.6/let-alist.elc | Bin 3115 -> 0 bytes .../leuven-dark-theme.el | 1067 - .../leuven-theme-autoloads.el | 38 - .../leuven-theme-pkg.el | 10 - .../leuven-theme-20200416.728/leuven-theme.el | 1067 - elpa/log4e-20200419.933/log4e-autoloads.el | 35 - elpa/log4e-20200419.933/log4e-pkg.el | 2 - elpa/log4e-20200419.933/log4e.el | 590 - elpa/log4e-20200419.933/log4e.elc | Bin 21114 -> 0 bytes .../macrostep-autoloads.el | 67 - elpa/macrostep-20161120.2106/macrostep-c.el | 187 - elpa/macrostep-20161120.2106/macrostep-c.elc | Bin 4658 -> 0 bytes elpa/macrostep-20161120.2106/macrostep-pkg.el | 12 - elpa/macrostep-20161120.2106/macrostep.el | 1129 - elpa/macrostep-20161120.2106/macrostep.elc | Bin 28992 -> 0 bytes elpa/magit-20200418.939/AUTHORS.md | 347 - elpa/magit-20200418.939/LICENSE | 676 - elpa/magit-20200418.939/dir | 18 - elpa/magit-20200418.939/git-rebase.el | 804 - elpa/magit-20200418.939/git-rebase.elc | Bin 27665 -> 0 bytes elpa/magit-20200418.939/magit-apply.el | 739 - elpa/magit-20200418.939/magit-apply.elc | Bin 31993 -> 0 bytes elpa/magit-20200418.939/magit-autoloads.el | 2523 -- elpa/magit-20200418.939/magit-autorevert.el | 269 - elpa/magit-20200418.939/magit-autorevert.elc | Bin 12573 -> 0 bytes elpa/magit-20200418.939/magit-bisect.el | 239 - elpa/magit-20200418.939/magit-bisect.elc | Bin 15636 -> 0 bytes elpa/magit-20200418.939/magit-blame.el | 943 - elpa/magit-20200418.939/magit-blame.elc | Bin 37623 -> 0 bytes elpa/magit-20200418.939/magit-bookmark.el | 203 - elpa/magit-20200418.939/magit-bookmark.elc | Bin 5676 -> 0 bytes elpa/magit-20200418.939/magit-branch.el | 893 - elpa/magit-20200418.939/magit-branch.elc | Bin 37364 -> 0 bytes elpa/magit-20200418.939/magit-clone.el | 269 - elpa/magit-20200418.939/magit-clone.elc | Bin 11294 -> 0 bytes elpa/magit-20200418.939/magit-commit.el | 570 - elpa/magit-20200418.939/magit-commit.elc | Bin 22559 -> 0 bytes elpa/magit-20200418.939/magit-core.el | 128 - elpa/magit-20200418.939/magit-core.elc | Bin 3032 -> 0 bytes elpa/magit-20200418.939/magit-diff.el | 3263 --- elpa/magit-20200418.939/magit-diff.elc | Bin 163222 -> 0 bytes elpa/magit-20200418.939/magit-ediff.el | 509 - elpa/magit-20200418.939/magit-ediff.elc | Bin 18902 -> 0 bytes elpa/magit-20200418.939/magit-extras.el | 671 - elpa/magit-20200418.939/magit-extras.elc | Bin 22725 -> 0 bytes elpa/magit-20200418.939/magit-fetch.el | 186 - elpa/magit-20200418.939/magit-fetch.elc | Bin 7044 -> 0 bytes elpa/magit-20200418.939/magit-files.el | 551 - elpa/magit-20200418.939/magit-files.elc | Bin 26812 -> 0 bytes elpa/magit-20200418.939/magit-git.el | 2309 -- elpa/magit-20200418.939/magit-git.elc | Bin 91254 -> 0 bytes elpa/magit-20200418.939/magit-gitignore.el | 197 - elpa/magit-20200418.939/magit-gitignore.elc | Bin 7378 -> 0 bytes elpa/magit-20200418.939/magit-imenu.el | 245 - elpa/magit-20200418.939/magit-imenu.elc | Bin 6830 -> 0 bytes elpa/magit-20200418.939/magit-log.el | 1782 -- elpa/magit-20200418.939/magit-log.elc | Bin 98534 -> 0 bytes elpa/magit-20200418.939/magit-margin.el | 241 - elpa/magit-20200418.939/magit-margin.elc | Bin 8237 -> 0 bytes elpa/magit-20200418.939/magit-merge.el | 302 - elpa/magit-20200418.939/magit-merge.elc | Bin 13564 -> 0 bytes elpa/magit-20200418.939/magit-mode.el | 1431 - elpa/magit-20200418.939/magit-mode.elc | Bin 54047 -> 0 bytes elpa/magit-20200418.939/magit-notes.el | 200 - elpa/magit-20200418.939/magit-notes.elc | Bin 9045 -> 0 bytes elpa/magit-20200418.939/magit-obsolete.el | 109 - elpa/magit-20200418.939/magit-obsolete.elc | Bin 3993 -> 0 bytes elpa/magit-20200418.939/magit-patch.el | 331 - elpa/magit-20200418.939/magit-patch.elc | Bin 17901 -> 0 bytes elpa/magit-20200418.939/magit-pkg.el | 12 - elpa/magit-20200418.939/magit-process.el | 1156 - elpa/magit-20200418.939/magit-process.elc | Bin 46012 -> 0 bytes elpa/magit-20200418.939/magit-pull.el | 164 - elpa/magit-20200418.939/magit-pull.elc | Bin 6212 -> 0 bytes elpa/magit-20200418.939/magit-push.el | 331 - elpa/magit-20200418.939/magit-push.elc | Bin 12755 -> 0 bytes elpa/magit-20200418.939/magit-reflog.el | 213 - elpa/magit-20200418.939/magit-reflog.elc | Bin 9997 -> 0 bytes elpa/magit-20200418.939/magit-refs.el | 758 - elpa/magit-20200418.939/magit-refs.elc | Bin 40348 -> 0 bytes elpa/magit-20200418.939/magit-remote.el | 341 - elpa/magit-20200418.939/magit-remote.elc | Bin 14858 -> 0 bytes elpa/magit-20200418.939/magit-repos.el | 338 - elpa/magit-20200418.939/magit-repos.elc | Bin 14493 -> 0 bytes elpa/magit-20200418.939/magit-reset.el | 127 - elpa/magit-20200418.939/magit-reset.elc | Bin 5544 -> 0 bytes elpa/magit-20200418.939/magit-section.el | 1733 -- elpa/magit-20200418.939/magit-section.elc | Bin 65928 -> 0 bytes elpa/magit-20200418.939/magit-sequence.el | 1041 - elpa/magit-20200418.939/magit-sequence.elc | Bin 52852 -> 0 bytes elpa/magit-20200418.939/magit-stash.el | 546 - elpa/magit-20200418.939/magit-stash.elc | Bin 35517 -> 0 bytes elpa/magit-20200418.939/magit-status.el | 811 - elpa/magit-20200418.939/magit-status.elc | Bin 59204 -> 0 bytes elpa/magit-20200418.939/magit-submodule.el | 664 - elpa/magit-20200418.939/magit-submodule.elc | Bin 38439 -> 0 bytes elpa/magit-20200418.939/magit-subtree.el | 182 - elpa/magit-20200418.939/magit-subtree.elc | Bin 9095 -> 0 bytes elpa/magit-20200418.939/magit-tag.el | 210 - elpa/magit-20200418.939/magit-tag.elc | Bin 7839 -> 0 bytes elpa/magit-20200418.939/magit-transient.el | 202 - elpa/magit-20200418.939/magit-transient.elc | Bin 8360 -> 0 bytes elpa/magit-20200418.939/magit-utils.el | 1195 - elpa/magit-20200418.939/magit-utils.elc | Bin 39815 -> 0 bytes elpa/magit-20200418.939/magit-wip.el | 456 - elpa/magit-20200418.939/magit-wip.elc | Bin 27556 -> 0 bytes elpa/magit-20200418.939/magit-worktree.el | 184 - elpa/magit-20200418.939/magit-worktree.elc | Bin 8597 -> 0 bytes elpa/magit-20200418.939/magit.el | 596 - elpa/magit-20200418.939/magit.elc | Bin 20441 -> 0 bytes elpa/magit-20200418.939/magit.info | 192 - elpa/magit-20200418.939/magit.info-1 | 7776 ------ elpa/magit-20200418.939/magit.info-2 | 3571 --- .../nord-theme-autoloads.el | 24 - .../nord-theme-20200108.833/nord-theme-pkg.el | 2 - elpa/nord-theme-20200108.833/nord-theme.el | 723 - .../ob-dart-autoloads.el | 22 - elpa/ob-dart-20170106.1624/ob-dart-pkg.el | 2 - elpa/ob-dart-20170106.1624/ob-dart.el | 251 - elpa/ob-dart-20170106.1624/ob-dart.elc | Bin 6975 -> 0 bytes .../ob-http-autoloads.el | 33 - elpa/ob-http-20180707.1448/ob-http-mode.el | 66 - elpa/ob-http-20180707.1448/ob-http-mode.elc | Bin 3613 -> 0 bytes elpa/ob-http-20180707.1448/ob-http-pkg.el | 11 - elpa/ob-http-20180707.1448/ob-http.el | 287 - elpa/ob-http-20180707.1448/ob-http.elc | Bin 21734 -> 0 bytes elpa/ob-ipython-20180224.953/client.py | 87 - .../ob-ipython-autoloads.el | 26 - .../ob-ipython-20180224.953/ob-ipython-pkg.el | 16 - elpa/ob-ipython-20180224.953/ob-ipython.el | 734 - elpa/ob-ipython-20180224.953/ob-ipython.elc | Bin 24042 -> 0 bytes .../ob-restclient-autoloads.el | 28 - .../ob-restclient-pkg.el | 2 - .../ob-restclient.el | 120 - .../ob-restclient.elc | Bin 3137 -> 0 bytes .../olivetti-autoloads.el | 30 - elpa/olivetti-20200417.607/olivetti-pkg.el | 2 - elpa/olivetti-20200417.607/olivetti.el | 384 - elpa/olivetti-20200417.607/olivetti.elc | Bin 10248 -> 0 bytes elpa/org-9.3.6.signed | 1 - elpa/org-9.3.6/COPYING | 674 - elpa/org-9.3.6/README_ELPA | 41 - elpa/org-9.3.6/dir | 19 - elpa/org-9.3.6/etc/ORG-NEWS | 5202 ---- .../etc/styles/OrgOdtContentTemplate.xml | 275 - elpa/org-9.3.6/etc/styles/OrgOdtStyles.xml | 861 - elpa/org-9.3.6/etc/styles/README | 36 - elpa/org-9.3.6/ob-C.el | 467 - elpa/org-9.3.6/ob-C.elc | Bin 13337 -> 0 bytes elpa/org-9.3.6/ob-J.el | 186 - elpa/org-9.3.6/ob-J.elc | Bin 5529 -> 0 bytes elpa/org-9.3.6/ob-R.el | 469 - elpa/org-9.3.6/ob-R.elc | Bin 15981 -> 0 bytes elpa/org-9.3.6/ob-abc.el | 90 - elpa/org-9.3.6/ob-abc.elc | Bin 2481 -> 0 bytes elpa/org-9.3.6/ob-asymptote.el | 139 - elpa/org-9.3.6/ob-asymptote.elc | Bin 3787 -> 0 bytes elpa/org-9.3.6/ob-awk.el | 111 - elpa/org-9.3.6/ob-awk.elc | Bin 3220 -> 0 bytes elpa/org-9.3.6/ob-calc.el | 110 - elpa/org-9.3.6/ob-calc.elc | Bin 2384 -> 0 bytes elpa/org-9.3.6/ob-clojure.el | 285 - elpa/org-9.3.6/ob-clojure.elc | Bin 7175 -> 0 bytes elpa/org-9.3.6/ob-comint.el | 156 - elpa/org-9.3.6/ob-comint.elc | Bin 5268 -> 0 bytes elpa/org-9.3.6/ob-coq.el | 78 - elpa/org-9.3.6/ob-coq.elc | Bin 2286 -> 0 bytes elpa/org-9.3.6/ob-core.el | 3162 --- elpa/org-9.3.6/ob-core.elc | Bin 101510 -> 0 bytes elpa/org-9.3.6/ob-css.el | 48 - elpa/org-9.3.6/ob-css.elc | Bin 888 -> 0 bytes elpa/org-9.3.6/ob-ditaa.el | 124 - elpa/org-9.3.6/ob-ditaa.elc | Bin 3130 -> 0 bytes elpa/org-9.3.6/ob-dot.el | 92 - elpa/org-9.3.6/ob-dot.elc | Bin 2146 -> 0 bytes elpa/org-9.3.6/ob-ebnf.el | 81 - elpa/org-9.3.6/ob-ebnf.elc | Bin 1456 -> 0 bytes elpa/org-9.3.6/ob-emacs-lisp.el | 113 - elpa/org-9.3.6/ob-emacs-lisp.elc | Bin 3301 -> 0 bytes elpa/org-9.3.6/ob-eshell.el | 109 - elpa/org-9.3.6/ob-eshell.elc | Bin 3123 -> 0 bytes elpa/org-9.3.6/ob-eval.el | 149 - elpa/org-9.3.6/ob-eval.elc | Bin 3345 -> 0 bytes elpa/org-9.3.6/ob-exp.el | 412 - elpa/org-9.3.6/ob-exp.elc | Bin 10860 -> 0 bytes elpa/org-9.3.6/ob-forth.el | 87 - elpa/org-9.3.6/ob-forth.elc | Bin 2030 -> 0 bytes elpa/org-9.3.6/ob-fortran.el | 167 - elpa/org-9.3.6/ob-fortran.elc | Bin 5394 -> 0 bytes elpa/org-9.3.6/ob-gnuplot.el | 283 - elpa/org-9.3.6/ob-gnuplot.elc | Bin 8675 -> 0 bytes elpa/org-9.3.6/ob-groovy.el | 116 - elpa/org-9.3.6/ob-groovy.elc | Bin 3713 -> 0 bytes elpa/org-9.3.6/ob-haskell.el | 220 - elpa/org-9.3.6/ob-haskell.elc | Bin 8155 -> 0 bytes elpa/org-9.3.6/ob-hledger.el | 70 - elpa/org-9.3.6/ob-hledger.elc | Bin 1894 -> 0 bytes elpa/org-9.3.6/ob-io.el | 108 - elpa/org-9.3.6/ob-io.elc | Bin 3222 -> 0 bytes elpa/org-9.3.6/ob-java.el | 85 - elpa/org-9.3.6/ob-java.elc | Bin 2753 -> 0 bytes elpa/org-9.3.6/ob-js.el | 206 - elpa/org-9.3.6/ob-js.elc | Bin 6838 -> 0 bytes elpa/org-9.3.6/ob-latex.el | 226 - elpa/org-9.3.6/ob-latex.elc | Bin 6315 -> 0 bytes elpa/org-9.3.6/ob-ledger.el | 70 - elpa/org-9.3.6/ob-ledger.elc | Bin 1825 -> 0 bytes elpa/org-9.3.6/ob-lilypond.el | 417 - elpa/org-9.3.6/ob-lilypond.elc | Bin 14302 -> 0 bytes elpa/org-9.3.6/ob-lisp.el | 127 - elpa/org-9.3.6/ob-lisp.elc | Bin 3624 -> 0 bytes elpa/org-9.3.6/ob-lob.el | 164 - elpa/org-9.3.6/ob-lob.elc | Bin 5009 -> 0 bytes elpa/org-9.3.6/ob-lua.el | 402 - elpa/org-9.3.6/ob-lua.elc | Bin 13063 -> 0 bytes elpa/org-9.3.6/ob-makefile.el | 48 - elpa/org-9.3.6/ob-makefile.elc | Bin 920 -> 0 bytes elpa/org-9.3.6/ob-matlab.el | 47 - elpa/org-9.3.6/ob-matlab.elc | Bin 500 -> 0 bytes elpa/org-9.3.6/ob-maxima.el | 133 - elpa/org-9.3.6/ob-maxima.elc | Bin 3850 -> 0 bytes elpa/org-9.3.6/ob-mscgen.el | 84 - elpa/org-9.3.6/ob-mscgen.elc | Bin 1355 -> 0 bytes elpa/org-9.3.6/ob-ocaml.el | 171 - elpa/org-9.3.6/ob-ocaml.elc | Bin 5726 -> 0 bytes elpa/org-9.3.6/ob-octave.el | 264 - elpa/org-9.3.6/ob-octave.elc | Bin 9665 -> 0 bytes elpa/org-9.3.6/ob-org.el | 72 - elpa/org-9.3.6/ob-org.elc | Bin 1710 -> 0 bytes elpa/org-9.3.6/ob-perl.el | 157 - elpa/org-9.3.6/ob-perl.elc | Bin 4592 -> 0 bytes elpa/org-9.3.6/ob-picolisp.el | 187 - elpa/org-9.3.6/ob-picolisp.elc | Bin 4648 -> 0 bytes elpa/org-9.3.6/ob-plantuml.el | 132 - elpa/org-9.3.6/ob-plantuml.elc | Bin 3991 -> 0 bytes elpa/org-9.3.6/ob-processing.el | 195 - elpa/org-9.3.6/ob-processing.elc | Bin 4721 -> 0 bytes elpa/org-9.3.6/ob-python.el | 374 - elpa/org-9.3.6/ob-python.elc | Bin 13190 -> 0 bytes elpa/org-9.3.6/ob-ref.el | 246 - elpa/org-9.3.6/ob-ref.elc | Bin 5908 -> 0 bytes elpa/org-9.3.6/ob-ruby.el | 268 - elpa/org-9.3.6/ob-ruby.elc | Bin 9642 -> 0 bytes elpa/org-9.3.6/ob-sass.el | 70 - elpa/org-9.3.6/ob-sass.elc | Bin 1585 -> 0 bytes elpa/org-9.3.6/ob-scheme.el | 236 - elpa/org-9.3.6/ob-scheme.elc | Bin 6600 -> 0 bytes elpa/org-9.3.6/ob-screen.el | 143 - elpa/org-9.3.6/ob-screen.elc | Bin 4335 -> 0 bytes elpa/org-9.3.6/ob-sed.el | 105 - elpa/org-9.3.6/ob-sed.elc | Bin 2811 -> 0 bytes elpa/org-9.3.6/ob-shell.el | 282 - elpa/org-9.3.6/ob-shell.elc | Bin 11102 -> 0 bytes elpa/org-9.3.6/ob-shen.el | 78 - elpa/org-9.3.6/ob-shen.elc | Bin 1997 -> 0 bytes elpa/org-9.3.6/ob-sql.el | 370 - elpa/org-9.3.6/ob-sql.elc | Bin 10071 -> 0 bytes elpa/org-9.3.6/ob-sqlite.el | 157 - elpa/org-9.3.6/ob-sqlite.elc | Bin 4622 -> 0 bytes elpa/org-9.3.6/ob-stan.el | 85 - elpa/org-9.3.6/ob-stan.elc | Bin 2341 -> 0 bytes elpa/org-9.3.6/ob-table.el | 152 - elpa/org-9.3.6/ob-table.elc | Bin 3408 -> 0 bytes elpa/org-9.3.6/ob-tangle.el | 582 - elpa/org-9.3.6/ob-tangle.elc | Bin 18148 -> 0 bytes elpa/org-9.3.6/ob-vala.el | 116 - elpa/org-9.3.6/ob-vala.elc | Bin 3147 -> 0 bytes elpa/org-9.3.6/ob.el | 43 - elpa/org-9.3.6/ob.elc | Bin 692 -> 0 bytes elpa/org-9.3.6/ol-bbdb.el | 543 - elpa/org-9.3.6/ol-bbdb.elc | Bin 12443 -> 0 bytes elpa/org-9.3.6/ol-bibtex.el | 763 - elpa/org-9.3.6/ol-bibtex.elc | Bin 25947 -> 0 bytes elpa/org-9.3.6/ol-docview.el | 104 - elpa/org-9.3.6/ol-docview.elc | Bin 2021 -> 0 bytes elpa/org-9.3.6/ol-eshell.el | 68 - elpa/org-9.3.6/ol-eshell.elc | Bin 1543 -> 0 bytes elpa/org-9.3.6/ol-eww.el | 176 - elpa/org-9.3.6/ol-eww.elc | Bin 3193 -> 0 bytes elpa/org-9.3.6/ol-gnus.el | 265 - elpa/org-9.3.6/ol-gnus.elc | Bin 7865 -> 0 bytes elpa/org-9.3.6/ol-info.el | 148 - elpa/org-9.3.6/ol-info.elc | Bin 4263 -> 0 bytes elpa/org-9.3.6/ol-irc.el | 269 - elpa/org-9.3.6/ol-irc.elc | Bin 5942 -> 0 bytes elpa/org-9.3.6/ol-mhe.el | 219 - elpa/org-9.3.6/ol-mhe.elc | Bin 5431 -> 0 bytes elpa/org-9.3.6/ol-rmail.el | 115 - elpa/org-9.3.6/ol-rmail.elc | Bin 2670 -> 0 bytes elpa/org-9.3.6/ol-w3m.el | 184 - elpa/org-9.3.6/ol-w3m.elc | Bin 3914 -> 0 bytes elpa/org-9.3.6/ol.el | 1898 -- elpa/org-9.3.6/ol.elc | Bin 55981 -> 0 bytes elpa/org-9.3.6/org | 23015 ---------------- elpa/org-9.3.6/org-agenda.el | 10588 ------- elpa/org-9.3.6/org-agenda.elc | Bin 379545 -> 0 bytes elpa/org-9.3.6/org-archive.el | 607 - elpa/org-9.3.6/org-archive.elc | Bin 17615 -> 0 bytes elpa/org-9.3.6/org-attach-git.el | 119 - elpa/org-9.3.6/org-attach-git.elc | Bin 3752 -> 0 bytes elpa/org-9.3.6/org-attach.el | 767 - elpa/org-9.3.6/org-attach.elc | Bin 26964 -> 0 bytes elpa/org-9.3.6/org-autoloads.el | 1745 -- elpa/org-9.3.6/org-capture.el | 1925 -- elpa/org-9.3.6/org-capture.elc | Bin 60244 -> 0 bytes elpa/org-9.3.6/org-clock.el | 3034 -- elpa/org-9.3.6/org-clock.elc | Bin 92249 -> 0 bytes elpa/org-9.3.6/org-colview.el | 1707 -- elpa/org-9.3.6/org-colview.elc | Bin 55862 -> 0 bytes elpa/org-9.3.6/org-compat.el | 1102 - elpa/org-9.3.6/org-compat.elc | Bin 41803 -> 0 bytes elpa/org-9.3.6/org-crypt.el | 275 - elpa/org-9.3.6/org-crypt.elc | Bin 6496 -> 0 bytes elpa/org-9.3.6/org-ctags.el | 534 - elpa/org-9.3.6/org-ctags.elc | Bin 12132 -> 0 bytes elpa/org-9.3.6/org-datetree.el | 249 - elpa/org-9.3.6/org-datetree.elc | Bin 7425 -> 0 bytes elpa/org-9.3.6/org-duration.el | 444 - elpa/org-9.3.6/org-duration.elc | Bin 11783 -> 0 bytes elpa/org-9.3.6/org-element.el | 6081 ---- elpa/org-9.3.6/org-element.elc | Bin 172926 -> 0 bytes elpa/org-9.3.6/org-entities.el | 599 - elpa/org-9.3.6/org-entities.elc | Bin 27374 -> 0 bytes elpa/org-9.3.6/org-faces.el | 659 - elpa/org-9.3.6/org-faces.elc | Bin 24207 -> 0 bytes elpa/org-9.3.6/org-feed.el | 719 - elpa/org-9.3.6/org-feed.elc | Bin 19506 -> 0 bytes elpa/org-9.3.6/org-footnote.el | 1014 - elpa/org-9.3.6/org-footnote.elc | Bin 28810 -> 0 bytes elpa/org-9.3.6/org-goto.el | 312 - elpa/org-9.3.6/org-goto.elc | Bin 9458 -> 0 bytes elpa/org-9.3.6/org-habit.el | 467 - elpa/org-9.3.6/org-habit.elc | Bin 13749 -> 0 bytes elpa/org-9.3.6/org-id.el | 708 - elpa/org-9.3.6/org-id.elc | Bin 21520 -> 0 bytes elpa/org-9.3.6/org-indent.el | 420 - elpa/org-9.3.6/org-indent.elc | Bin 15033 -> 0 bytes elpa/org-9.3.6/org-inlinetask.el | 348 - elpa/org-9.3.6/org-inlinetask.elc | Bin 8730 -> 0 bytes elpa/org-9.3.6/org-install.el | 17 - elpa/org-9.3.6/org-keys.el | 928 - elpa/org-9.3.6/org-keys.elc | Bin 27134 -> 0 bytes elpa/org-9.3.6/org-lint.el | 1262 - elpa/org-9.3.6/org-lint.elc | Bin 51342 -> 0 bytes elpa/org-9.3.6/org-list.el | 3503 --- elpa/org-9.3.6/org-list.elc | Bin 90411 -> 0 bytes elpa/org-9.3.6/org-loaddefs.el | 4279 --- elpa/org-9.3.6/org-macro.el | 422 - elpa/org-9.3.6/org-macro.elc | Bin 11619 -> 0 bytes elpa/org-9.3.6/org-macs.el | 1208 - elpa/org-9.3.6/org-macs.elc | Bin 40328 -> 0 bytes elpa/org-9.3.6/org-mobile.el | 1130 - elpa/org-9.3.6/org-mobile.elc | Bin 36846 -> 0 bytes elpa/org-9.3.6/org-mouse.el | 1100 - elpa/org-9.3.6/org-mouse.elc | Bin 32273 -> 0 bytes elpa/org-9.3.6/org-num.el | 471 - elpa/org-9.3.6/org-num.elc | Bin 12966 -> 0 bytes elpa/org-9.3.6/org-pcomplete.el | 441 - elpa/org-9.3.6/org-pcomplete.elc | Bin 12892 -> 0 bytes elpa/org-9.3.6/org-pkg.el | 2 - elpa/org-9.3.6/org-plot.el | 354 - elpa/org-9.3.6/org-plot.elc | Bin 9901 -> 0 bytes elpa/org-9.3.6/org-protocol.el | 732 - elpa/org-9.3.6/org-protocol.elc | Bin 20645 -> 0 bytes elpa/org-9.3.6/org-src.el | 1190 - elpa/org-9.3.6/org-src.elc | Bin 38450 -> 0 bytes elpa/org-9.3.6/org-table.el | 6270 ----- elpa/org-9.3.6/org-table.elc | Bin 202270 -> 0 bytes elpa/org-9.3.6/org-tempo.el | 188 - elpa/org-9.3.6/org-tempo.elc | Bin 5027 -> 0 bytes elpa/org-9.3.6/org-timer.el | 494 - elpa/org-9.3.6/org-timer.elc | Bin 14240 -> 0 bytes elpa/org-9.3.6/org-version.el | 24 - elpa/org-9.3.6/org.el | 21261 -------------- elpa/org-9.3.6/org.elc | Bin 710131 -> 0 bytes elpa/org-9.3.6/orgcard.pdf | Bin 118688 -> 0 bytes elpa/org-9.3.6/ox-ascii.el | 2201 -- elpa/org-9.3.6/ox-ascii.elc | Bin 66709 -> 0 bytes elpa/org-9.3.6/ox-beamer.el | 1157 - elpa/org-9.3.6/ox-beamer.elc | Bin 34719 -> 0 bytes elpa/org-9.3.6/ox-html.el | 3894 --- elpa/org-9.3.6/ox-html.elc | Bin 131902 -> 0 bytes elpa/org-9.3.6/ox-icalendar.el | 1024 - elpa/org-9.3.6/ox-icalendar.elc | Bin 37290 -> 0 bytes elpa/org-9.3.6/ox-latex.el | 3743 --- elpa/org-9.3.6/ox-latex.elc | Bin 117422 -> 0 bytes elpa/org-9.3.6/ox-man.el | 1143 - elpa/org-9.3.6/ox-man.elc | Bin 31503 -> 0 bytes elpa/org-9.3.6/ox-md.el | 735 - elpa/org-9.3.6/ox-md.elc | Bin 23220 -> 0 bytes elpa/org-9.3.6/ox-odt.el | 4339 --- elpa/org-9.3.6/ox-odt.elc | Bin 132420 -> 0 bytes elpa/org-9.3.6/ox-org.el | 356 - elpa/org-9.3.6/ox-org.elc | Bin 12538 -> 0 bytes elpa/org-9.3.6/ox-publish.el | 1379 - elpa/org-9.3.6/ox-publish.elc | Bin 50074 -> 0 bytes elpa/org-9.3.6/ox-texinfo.el | 1719 -- elpa/org-9.3.6/ox-texinfo.elc | Bin 57886 -> 0 bytes elpa/org-9.3.6/ox.el | 6982 ----- elpa/org-9.3.6/ox.elc | Bin 241477 -> 0 bytes .../org-pomodoro-autoloads.el | 43 - .../org-pomodoro-pidgin.el | 149 - .../org-pomodoro-pidgin.elc | Bin 3866 -> 0 bytes .../org-pomodoro-pkg.el | 11 - .../org-pomodoro.el | 655 - .../org-pomodoro.elc | Bin 21621 -> 0 bytes .../resources/bell.wav | Bin 35850 -> 0 bytes .../resources/bell_multiple.wav | Bin 42762 -> 0 bytes .../resources/tick.wav | Bin 37616 -> 0 bytes .../ox-nikola-autoloads.el | 43 - elpa/ox-nikola-20151114.1116/ox-nikola-pkg.el | 2 - elpa/ox-nikola-20151114.1116/ox-nikola.el | 282 - elpa/ox-nikola-20151114.1116/ox-nikola.elc | Bin 6984 -> 0 bytes elpa/ox-rst-20191013.551/ox-rst-autoloads.el | 90 - elpa/ox-rst-20191013.551/ox-rst-pkg.el | 2 - elpa/ox-rst-20191013.551/ox-rst.el | 1743 -- elpa/ox-rst-20191013.551/ox-rst.elc | Bin 55388 -> 0 bytes .../data/stdlib-changes | 110 - .../package-lint-autoloads.el | 59 - .../package-lint-pkg.el | 15 - .../package-lint-20200419.406/package-lint.el | 1209 - .../package-lint.elc | Bin 43931 -> 0 bytes .../page-break-lines-autoloads.el | 62 - .../page-break-lines-pkg.el | 2 - .../page-break-lines.el | 181 - .../page-break-lines.elc | Bin 10025 -> 0 bytes elpa/pickle-20190923.354/pickle-autoloads.el | 32 - elpa/pickle-20190923.354/pickle-pkg.el | 2 - elpa/pickle-20190923.354/pickle.el | 101 - elpa/pickle-20190923.354/pickle.elc | Bin 4038 -> 0 bytes .../pkg-info-autoloads.el | 127 - elpa/pkg-info-20150517.1143/pkg-info-pkg.el | 2 - elpa/pkg-info-20150517.1143/pkg-info.el | 331 - elpa/pkg-info-20150517.1143/pkg-info.elc | Bin 9914 -> 0 bytes .../plantuml-mode-autoloads.el | 32 - .../plantuml-mode-pkg.el | 2 - .../plantuml-mode.el | 762 - .../plantuml-mode.elc | Bin 30921 -> 0 bytes .../poet-dark-monochrome-theme.el | 276 - .../poet-dark-monochrome-theme.elc | Bin 11401 -> 0 bytes .../poet-dark-theme.el | 276 - .../poet-dark-theme.elc | Bin 12010 -> 0 bytes .../poet-monochrome-theme.el | 276 - .../poet-monochrome-theme.elc | Bin 11374 -> 0 bytes .../poet-theme-autoloads.el | 58 - .../poet-theme-20191215.201/poet-theme-pkg.el | 8 - elpa/poet-theme-20191215.201/poet-theme.el | 276 - elpa/poet-theme-20191215.201/poet-theme.elc | Bin 11395 -> 0 bytes elpa/polymode-20200411.915/poly-lock.el | 562 - elpa/polymode-20200411.915/poly-lock.elc | Bin 10944 -> 0 bytes .../polymode-autoloads.el | 274 - elpa/polymode-20200411.915/polymode-base.el | 122 - elpa/polymode-20200411.915/polymode-base.elc | Bin 9056 -> 0 bytes .../polymode-20200411.915/polymode-classes.el | 488 - .../polymode-classes.elc | Bin 20056 -> 0 bytes elpa/polymode-20200411.915/polymode-compat.el | 388 - .../polymode-20200411.915/polymode-compat.elc | Bin 8669 -> 0 bytes elpa/polymode-20200411.915/polymode-core.el | 2139 -- elpa/polymode-20200411.915/polymode-core.elc | Bin 53647 -> 0 bytes elpa/polymode-20200411.915/polymode-debug.el | 557 - elpa/polymode-20200411.915/polymode-debug.elc | Bin 20448 -> 0 bytes elpa/polymode-20200411.915/polymode-export.el | 449 - .../polymode-20200411.915/polymode-export.elc | Bin 18628 -> 0 bytes .../polymode-20200411.915/polymode-methods.el | 684 - .../polymode-methods.elc | Bin 18440 -> 0 bytes elpa/polymode-20200411.915/polymode-pkg.el | 12 - elpa/polymode-20200411.915/polymode-tangle.el | 35 - .../polymode-20200411.915/polymode-tangle.elc | Bin 550 -> 0 bytes .../polymode-test-utils.el | 464 - .../polymode-test-utils.elc | Bin 13765 -> 0 bytes elpa/polymode-20200411.915/polymode-weave.el | 281 - elpa/polymode-20200411.915/polymode-weave.elc | Bin 12582 -> 0 bytes elpa/polymode-20200411.915/polymode.el | 690 - elpa/polymode-20200411.915/polymode.elc | Bin 26100 -> 0 bytes .../pos-tip-autoloads.el | 22 - elpa/pos-tip-20191227.1356/pos-tip-pkg.el | 2 - elpa/pos-tip-20191227.1356/pos-tip.el | 981 - elpa/pos-tip-20191227.1356/pos-tip.elc | Bin 25349 -> 0 bytes .../powershell-autoloads.el | 53 - .../powershell-pkg.el | 2 - elpa/powershell-20190421.2038/powershell.el | 1386 - elpa/powershell-20190421.2038/powershell.elc | Bin 33635 -> 0 bytes .../projectile-autoloads.el | 635 - .../projectile-pkg.el | 2 - elpa/projectile-20200329.1908/projectile.el | 4773 ---- elpa/projectile-20200329.1908/projectile.elc | Bin 174672 -> 0 bytes .../python-django-autoloads.el | 47 - .../python-django-pkg.el | 2 - .../python-django.el | 2558 -- .../python-django.elc | Bin 161109 -> 0 bytes .../docstring_wrap.py | 664 - .../python-docstring-autoloads.el | 45 - .../python-docstring-pkg.el | 4 - .../python-docstring.el | 182 - .../python-docstring.elc | Bin 6203 -> 0 bytes elpa/pyvenv-20191202.1039/pyvenv-autoloads.el | 82 - elpa/pyvenv-20191202.1039/pyvenv-pkg.el | 2 - elpa/pyvenv-20191202.1039/pyvenv.el | 567 - elpa/pyvenv-20191202.1039/pyvenv.elc | Bin 19134 -> 0 bytes elpa/racket-mode-20200417.1741/dir | 18 - .../racket-bug-report.el | 84 - .../racket-bug-report.elc | Bin 2597 -> 0 bytes elpa/racket-mode-20200417.1741/racket-cmd.el | 223 - elpa/racket-mode-20200417.1741/racket-cmd.elc | Bin 8327 -> 0 bytes .../racket-collection.el | 327 - .../racket-collection.elc | Bin 8253 -> 0 bytes .../racket-common.el | 401 - .../racket-common.elc | Bin 10201 -> 0 bytes .../racket-complete.el | 52 - .../racket-complete.elc | Bin 1185 -> 0 bytes .../racket-custom.el | 526 - .../racket-custom.elc | Bin 17268 -> 0 bytes .../racket-mode-20200417.1741/racket-debug.el | 321 - .../racket-debug.elc | Bin 12836 -> 0 bytes .../racket-describe.el | 122 - .../racket-describe.elc | Bin 5447 -> 0 bytes elpa/racket-mode-20200417.1741/racket-edit.el | 405 - .../racket-mode-20200417.1741/racket-edit.elc | Bin 11702 -> 0 bytes .../racket-mode-20200417.1741/racket-eldoc.el | 47 - .../racket-eldoc.elc | Bin 928 -> 0 bytes .../racket-font-lock.el | 379 - .../racket-font-lock.elc | Bin 47843 -> 0 bytes .../racket-mode-20200417.1741/racket-imenu.el | 89 - .../racket-imenu.elc | Bin 2304 -> 0 bytes .../racket-indent.el | 515 - .../racket-indent.elc | Bin 12692 -> 0 bytes .../racket-keywords-and-builtins.el | 2819 -- .../racket-keywords-and-builtins.elc | Bin 50837 -> 0 bytes .../racket-logger.el | 263 - .../racket-logger.elc | Bin 10966 -> 0 bytes .../racket-mode-autoloads.el | 578 - .../racket-mode-pkg.el | 12 - elpa/racket-mode-20200417.1741/racket-mode.el | 212 - .../racket-mode-20200417.1741/racket-mode.elc | Bin 8428 -> 0 bytes .../racket-mode.info | 2729 -- .../racket-parens.el | 166 - .../racket-parens.elc | Bin 4585 -> 0 bytes elpa/racket-mode-20200417.1741/racket-ppss.el | 79 - .../racket-mode-20200417.1741/racket-ppss.elc | Bin 2705 -> 0 bytes .../racket-profile.el | 175 - .../racket-profile.elc | Bin 7343 -> 0 bytes .../racket-repl-buffer-name.el | 101 - .../racket-repl-buffer-name.elc | Bin 3006 -> 0 bytes elpa/racket-mode-20200417.1741/racket-repl.el | 997 - .../racket-mode-20200417.1741/racket-repl.elc | Bin 34856 -> 0 bytes elpa/racket-mode-20200417.1741/racket-show.el | 69 - .../racket-mode-20200417.1741/racket-show.elc | Bin 2236 -> 0 bytes .../racket-smart-open.el | 253 - .../racket-smart-open.elc | Bin 7025 -> 0 bytes .../racket-stepper.el | 212 - .../racket-stepper.elc | Bin 8779 -> 0 bytes .../racket-unicode-input-method.el | 256 - .../racket-unicode-input-method.elc | Bin 11664 -> 0 bytes elpa/racket-mode-20200417.1741/racket-util.el | 186 - .../racket-mode-20200417.1741/racket-util.elc | Bin 6009 -> 0 bytes .../racket-mode-20200417.1741/racket-visit.el | 124 - .../racket-visit.elc | Bin 3090 -> 0 bytes elpa/racket-mode-20200417.1741/racket-wsl.el | 53 - elpa/racket-mode-20200417.1741/racket-wsl.elc | Bin 1581 -> 0 bytes .../racket-xp-complete.el | 112 - .../racket-xp-complete.elc | Bin 3936 -> 0 bytes elpa/racket-mode-20200417.1741/racket-xp.el | 804 - elpa/racket-mode-20200417.1741/racket-xp.elc | Bin 28683 -> 0 bytes .../racket/command-server.rkt | 192 - .../racket/commands/check-syntax.rkt | 360 - .../racket/commands/coverage.rkt | 50 - .../racket/commands/describe.rkt | 127 - .../racket/commands/find-module.rkt | 46 - .../racket/commands/help.rkt | 51 - .../racket/commands/macro.rkt | 169 - .../racket/commands/module-names.rkt | 90 - .../racket/commands/profile.rkt | 19 - .../racket/commands/requires.rkt | 459 - .../racket/debug-annotator.rkt | 381 - .../racket/debug.rkt | 363 - .../racket/elisp.rkt | 57 - .../racket/error.rkt | 209 - .../racket/example/example.rkt | 355 - .../racket/example/example.rkt.faceup | 355 - .../racket/example/indent.rkt | 325 - .../racket/example/indent.rkt.faceup | 325 - .../racket/find-module-path-completions.rkt | 45 - .../racket-mode-20200417.1741/racket/find.rkt | 338 - .../racket/fresh-line.rkt | 37 - elpa/racket-mode-20200417.1741/racket/gui.rkt | 42 - .../racket/identifier.rkt | 190 - .../racket/image.rkt | 26 - .../racket/imports.rkt | 268 - .../racket/instrument.rkt | 218 - .../racket/interactions.rkt | 76 - .../racket/keywords.rkt | 98 - .../racket/logger.rkt | 93 - .../racket-mode-20200417.1741/racket/main.rkt | 35 - elpa/racket-mode-20200417.1741/racket/mod.rkt | 151 - .../racket/print.rkt | 41 - .../racket/repl-session.rkt | 86 - .../racket-mode-20200417.1741/racket/repl.rkt | 387 - .../racket/scribble.rkt | 241 - .../racket/syntax.rkt | 227 - .../racket/test/find-examples.rkt | 61 - .../racket/test/find.rkt | 136 - .../racket-mode-20200417.1741/racket/util.rkt | 110 - .../reformatter-autoloads.el | 74 - .../reformatter-pkg.el | 2 - elpa/reformatter-20200327.2358/reformatter.el | 223 - .../reformatter-20200327.2358/reformatter.elc | Bin 5186 -> 0 bytes .../request-autoloads.el | 22 - elpa/request-20200219.2257/request-pkg.el | 2 - elpa/request-20200219.2257/request.el | 1304 - elpa/request-20200219.2257/request.elc | Bin 69406 -> 0 bytes .../restclient-autoloads.el | 44 - .../restclient-pkg.el | 2 - elpa/restclient-20191009.1208/restclient.el | 631 - elpa/restclient-20191009.1208/restclient.elc | Bin 23927 -> 0 bytes .../restclient-test-autoloads.el | 43 - .../restclient-test-pkg.el | 2 - .../restclient-test.el | 146 - .../restclient-test.elc | Bin 5701 -> 0 bytes elpa/s-20180406.808/s-autoloads.el | 22 - elpa/s-20180406.808/s-pkg.el | 2 - elpa/s-20180406.808/s.el | 747 - elpa/s-20180406.808/s.elc | Bin 28393 -> 0 bytes .../scss-mode-autoloads.el | 31 - elpa/scss-mode-20180123.1708/scss-mode-pkg.el | 2 - elpa/scss-mode-20180123.1708/scss-mode.el | 127 - elpa/scss-mode-20180123.1708/scss-mode.elc | Bin 5500 -> 0 bytes elpa/slime-20200414.1444/contrib/README.md | 14 - elpa/slime-20200414.1444/contrib/bridge.el | 472 - elpa/slime-20200414.1444/contrib/bridge.elc | Bin 9009 -> 0 bytes .../contrib/inferior-slime.el | 133 - .../contrib/inferior-slime.elc | Bin 6114 -> 0 bytes .../slime-20200414.1444/contrib/slime-asdf.el | 313 - .../contrib/slime-asdf.elc | Bin 15831 -> 0 bytes .../contrib/slime-autodoc.el | 219 - .../contrib/slime-autodoc.elc | Bin 9187 -> 0 bytes .../contrib/slime-banner.el | 35 - .../contrib/slime-banner.elc | Bin 1825 -> 0 bytes .../contrib/slime-buffer-streams.el | 36 - .../contrib/slime-buffer-streams.elc | Bin 2004 -> 0 bytes .../contrib/slime-c-p-c.el | 305 - .../contrib/slime-c-p-c.elc | Bin 10903 -> 0 bytes .../contrib/slime-cl-indent.el | 1821 -- .../contrib/slime-cl-indent.elc | Bin 40324 -> 0 bytes .../contrib/slime-clipboard.el | 172 - .../contrib/slime-clipboard.elc | Bin 8345 -> 0 bytes .../contrib/slime-compiler-notes-tree.el | 184 - .../contrib/slime-compiler-notes-tree.elc | Bin 19100 -> 0 bytes .../contrib/slime-editing-commands.el | 183 - .../contrib/slime-editing-commands.elc | Bin 5665 -> 0 bytes .../contrib/slime-enclosing-context.el | 226 - .../contrib/slime-enclosing-context.elc | Bin 7340 -> 0 bytes .../contrib/slime-fancy-inspector.el | 42 - .../contrib/slime-fancy-inspector.elc | Bin 2120 -> 0 bytes .../contrib/slime-fancy-trace.el | 68 - .../contrib/slime-fancy-trace.elc | Bin 2835 -> 0 bytes .../contrib/slime-fancy.el | 40 - .../contrib/slime-fancy.elc | Bin 2836 -> 0 bytes .../contrib/slime-fontifying-fu.el | 231 - .../contrib/slime-fontifying-fu.elc | Bin 6876 -> 0 bytes .../contrib/slime-fuzzy.el | 604 - .../contrib/slime-fuzzy.elc | Bin 24742 -> 0 bytes .../contrib/slime-highlight-edits.el | 81 - .../contrib/slime-highlight-edits.elc | Bin 4654 -> 0 bytes .../contrib/slime-hyperdoc.el | 48 - .../contrib/slime-hyperdoc.elc | Bin 2185 -> 0 bytes .../contrib/slime-indentation.el | 31 - .../contrib/slime-indentation.elc | Bin 1513 -> 0 bytes .../contrib/slime-listener-hooks.el | 11 - .../contrib/slime-listener-hooks.elc | Bin 1082 -> 0 bytes .../contrib/slime-macrostep.el | 129 - .../contrib/slime-macrostep.elc | Bin 4416 -> 0 bytes .../contrib/slime-mdot-fu.el | 31 - .../contrib/slime-mdot-fu.elc | Bin 1773 -> 0 bytes .../contrib/slime-media.el | 46 - .../contrib/slime-media.elc | Bin 2634 -> 0 bytes .../contrib/slime-mrepl.el | 150 - .../contrib/slime-mrepl.elc | Bin 8543 -> 0 bytes .../contrib/slime-package-fu.el | 320 - .../contrib/slime-package-fu.elc | Bin 11011 -> 0 bytes .../contrib/slime-parse.el | 358 - .../contrib/slime-parse.elc | Bin 10811 -> 0 bytes .../contrib/slime-presentation-streams.el | 18 - .../contrib/slime-presentation-streams.elc | Bin 1307 -> 0 bytes .../contrib/slime-presentations.el | 872 - .../contrib/slime-presentations.elc | Bin 37143 -> 0 bytes .../contrib/slime-quicklisp.el | 51 - .../contrib/slime-quicklisp.elc | Bin 2714 -> 0 bytes .../contrib/slime-references.el | 156 - .../contrib/slime-references.elc | Bin 6423 -> 0 bytes .../slime-20200414.1444/contrib/slime-repl.el | 1805 -- .../contrib/slime-repl.elc | Bin 78118 -> 0 bytes .../contrib/slime-sbcl-exts.el | 34 - .../contrib/slime-sbcl-exts.elc | Bin 2085 -> 0 bytes .../contrib/slime-scheme.el | 40 - .../contrib/slime-scheme.elc | Bin 1215 -> 0 bytes .../contrib/slime-scratch.el | 48 - .../contrib/slime-scratch.elc | Bin 2255 -> 0 bytes .../contrib/slime-snapshot.el | 34 - .../contrib/slime-snapshot.elc | Bin 1707 -> 0 bytes .../contrib/slime-sprof.el | 224 - .../contrib/slime-sprof.elc | Bin 9956 -> 0 bytes .../contrib/slime-trace-dialog.el | 837 - .../contrib/slime-trace-dialog.elc | Bin 52508 -> 0 bytes .../contrib/slime-tramp.el | 121 - .../contrib/slime-tramp.elc | Bin 5201 -> 0 bytes .../contrib/slime-typeout-frame.el | 92 - .../contrib/slime-typeout-frame.elc | Bin 4028 -> 0 bytes .../contrib/slime-xref-browser.el | 99 - .../contrib/slime-xref-browser.elc | Bin 3989 -> 0 bytes .../contrib/swank-arglists.lisp | 1618 -- .../contrib/swank-asdf.lisp | 533 - .../contrib/swank-buffer-streams.lisp | 39 - .../contrib/swank-c-p-c.lisp | 298 - .../contrib/swank-clipboard.lisp | 71 - .../contrib/swank-fancy-inspector.lisp | 1006 - .../contrib/swank-fuzzy.lisp | 706 - .../slime-20200414.1444/contrib/swank-goo.goo | 995 - .../contrib/swank-hyperdoc.lisp | 18 - .../contrib/swank-ikarus.ss | 86 - .../contrib/swank-indentation.lisp | 140 - elpa/slime-20200414.1444/contrib/swank-jolt.k | 998 - .../contrib/swank-kawa.scm | 2504 -- .../contrib/swank-larceny.scm | 176 - .../contrib/swank-listener-hooks.lisp | 91 - .../contrib/swank-macrostep.lisp | 227 - .../contrib/swank-media.lisp | 25 - .../contrib/swank-mit-scheme.scm | 870 - .../contrib/swank-mlworks.sml | 348 - .../contrib/swank-mrepl.lisp | 162 - .../contrib/swank-package-fu.lisp | 65 - .../contrib/swank-presentation-streams.lisp | 334 - .../contrib/swank-presentations.lisp | 246 - .../contrib/swank-quicklisp.lisp | 17 - .../contrib/swank-r6rs.scm | 416 - .../contrib/swank-repl.lisp | 441 - .../contrib/swank-sbcl-exts.lisp | 67 - .../contrib/swank-snapshot.lisp | 67 - .../contrib/swank-sprof.lisp | 154 - .../contrib/swank-trace-dialog.lisp | 264 - .../contrib/swank-util.lisp | 63 - elpa/slime-20200414.1444/contrib/swank.rb | 385 - elpa/slime-20200414.1444/dir | 18 - elpa/slime-20200414.1444/lib/hyperspec.el | 2511 -- elpa/slime-20200414.1444/lib/hyperspec.elc | Bin 84726 -> 0 bytes elpa/slime-20200414.1444/metering.lisp | 1213 - elpa/slime-20200414.1444/nregex.lisp | 523 - elpa/slime-20200414.1444/packages.lisp | 202 - .../sbcl-pprint-patch.lisp | 332 - elpa/slime-20200414.1444/slime-autoloads.el | 69 - elpa/slime-20200414.1444/slime-pkg.el | 9 - elpa/slime-20200414.1444/slime-tests.el | 1459 - elpa/slime-20200414.1444/slime-tests.elc | Bin 97154 -> 0 bytes elpa/slime-20200414.1444/slime.el | 7660 ----- elpa/slime-20200414.1444/slime.elc | Bin 323201 -> 0 bytes elpa/slime-20200414.1444/slime.info | 3723 --- elpa/slime-20200414.1444/start-swank.lisp | 20 - elpa/slime-20200414.1444/swank-loader.lisp | 376 - elpa/slime-20200414.1444/swank.asd | 36 - elpa/slime-20200414.1444/swank.lisp | 3800 --- elpa/slime-20200414.1444/swank/abcl.lisp | 1532 - elpa/slime-20200414.1444/swank/allegro.lisp | 1086 - elpa/slime-20200414.1444/swank/backend.lisp | 1581 -- elpa/slime-20200414.1444/swank/ccl.lisp | 868 - elpa/slime-20200414.1444/swank/clasp.lisp | 716 - elpa/slime-20200414.1444/swank/clisp.lisp | 930 - elpa/slime-20200414.1444/swank/cmucl.lisp | 2470 -- elpa/slime-20200414.1444/swank/corman.lisp | 583 - elpa/slime-20200414.1444/swank/ecl.lisp | 1098 - elpa/slime-20200414.1444/swank/gray.lisp | 207 - elpa/slime-20200414.1444/swank/lispworks.lisp | 1020 - elpa/slime-20200414.1444/swank/match.lisp | 242 - elpa/slime-20200414.1444/swank/mezzano.lisp | 700 - elpa/slime-20200414.1444/swank/mkcl.lisp | 933 - elpa/slime-20200414.1444/swank/rpc.lisp | 162 - elpa/slime-20200414.1444/swank/sbcl.lisp | 2037 -- elpa/slime-20200414.1444/swank/scl.lisp | 1726 -- .../swank/source-file-cache.lisp | 136 - .../swank/source-path-parser.lisp | 242 - elpa/slime-20200414.1444/xref.lisp | 2906 -- .../spacemacs-common.el | 1019 - .../spacemacs-dark-theme.el | 7 - .../spacemacs-dark-theme.elc | Bin 647 -> 0 bytes .../spacemacs-light-theme.el | 7 - .../spacemacs-light-theme.elc | Bin 651 -> 0 bytes .../spacemacs-theme-autoloads.el | 45 - .../spacemacs-theme-pkg.el | 6 - .../sphinx-doc-autoloads.el | 27 - .../sphinx-doc-pkg.el | 2 - elpa/sphinx-doc-20160116.1117/sphinx-doc.el | 455 - elpa/sphinx-doc-20160116.1117/sphinx-doc.elc | Bin 32908 -> 0 bytes .../sphinx-frontend-autoloads.el | 50 - .../sphinx-frontend-pkg.el | 2 - .../sphinx-frontend.el | 123 - .../sphinx-frontend.elc | Bin 3916 -> 0 bytes .../sphinx-mode-autoloads.el | 38 - .../sphinx-mode-pkg.el | 6 - elpa/sphinx-mode-20180620.915/sphinx-mode.el | 166 - elpa/sphinx-mode-20180620.915/sphinx-mode.elc | Bin 6046 -> 0 bytes elpa/sphinx-mode-20180620.915/sphinx-src.el | 90 - elpa/sphinx-mode-20180620.915/sphinx-src.elc | Bin 2386 -> 0 bytes elpa/transient-20200226.1612/dir | 18 - .../transient-autoloads.el | 26 - elpa/transient-20200226.1612/transient-pkg.el | 12 - elpa/transient-20200226.1612/transient.el | 3198 --- elpa/transient-20200226.1612/transient.elc | Bin 127025 -> 0 bytes elpa/transient-20200226.1612/transient.info | 2441 -- .../typescript-mode-autoloads.el | 49 - .../typescript-mode-pkg.el | 8 - .../typescript-mode-test-utilities.el | 63 - .../typescript-mode-test-utilities.elc | Bin 3504 -> 0 bytes .../typescript-mode.el | 2914 -- .../typescript-mode.elc | Bin 80265 -> 0 bytes .../typescript-mode-autoloads.el | 49 - .../typescript-mode-pkg.el | 8 - .../typescript-mode-test-utilities.el | 63 - .../typescript-mode-test-utilities.elc | Bin 3495 -> 0 bytes .../typescript-mode.el | 2935 -- .../typescript-mode.elc | Bin 80634 -> 0 bytes elpa/web-beautify-readme.txt | 36 - .../web-mode-autoloads.el | 27 - elpa/web-mode-20200418.2218/web-mode-pkg.el | 2 - elpa/web-mode-20200418.2218/web-mode.el | 14226 ---------- elpa/web-mode-20200418.2218/web-mode.elc | Bin 328392 -> 0 bytes .../websocket-autoloads.el | 22 - elpa/websocket-20200102.637/websocket-pkg.el | 2 - elpa/websocket-20200102.637/websocket.el | 1067 - elpa/websocket-20200102.637/websocket.elc | Bin 63033 -> 0 bytes .../websocket-autoloads.el | 22 - elpa/websocket-20200321.102/websocket-pkg.el | 2 - elpa/websocket-20200321.102/websocket.el | 1068 - elpa/websocket-20200321.102/websocket.elc | Bin 63033 -> 0 bytes elpa/with-editor-20200217.1015/dir | 18 - .../with-editor-autoloads.el | 99 - .../with-editor-pkg.el | 13 - elpa/with-editor-20200217.1015/with-editor.el | 874 - .../with-editor-20200217.1015/with-editor.elc | Bin 31929 -> 0 bytes .../with-editor.info | 343 - .../yaml-mode-autoloads.el | 33 - elpa/yaml-mode-20191127.2314/yaml-mode-pkg.el | 2 - elpa/yaml-mode-20191127.2314/yaml-mode.el | 472 - elpa/yaml-mode-20191127.2314/yaml-mode.elc | Bin 14096 -> 0 bytes .../yasnippet-autoloads.el | 61 - elpa/yasnippet-20200413.2221/yasnippet-pkg.el | 2 - elpa/yasnippet-20200413.2221/yasnippet.el | 5310 ---- elpa/yasnippet-20200413.2221/yasnippet.elc | Bin 234854 -> 0 bytes 1400 files changed, 459270 deletions(-) delete mode 100644 elpa/ace-window-20200311.1025/ace-window-autoloads.el delete mode 100644 elpa/ace-window-20200311.1025/ace-window-pkg.el delete mode 100644 elpa/ace-window-20200311.1025/ace-window.el delete mode 100644 elpa/ace-window-20200311.1025/ace-window.elc delete mode 100644 elpa/ace-window-readme.txt delete mode 100644 elpa/alert-20200303.2118/alert-autoloads.el delete mode 100644 elpa/alert-20200303.2118/alert-pkg.el delete mode 100644 elpa/alert-20200303.2118/alert.el delete mode 100644 elpa/alert-20200303.2118/alert.elc delete mode 100644 elpa/anaphora-20180618.2200/anaphora-autoloads.el delete mode 100644 elpa/anaphora-20180618.2200/anaphora-pkg.el delete mode 100644 elpa/anaphora-20180618.2200/anaphora.el delete mode 100644 elpa/anaphora-20180618.2200/anaphora.elc delete mode 100644 elpa/archives/gnu/archive-contents delete mode 100644 elpa/archives/gnu/archive-contents.signed delete mode 100644 elpa/async-20200113.1745/async-autoloads.el delete mode 100644 elpa/async-20200113.1745/async-bytecomp.el delete mode 100644 elpa/async-20200113.1745/async-bytecomp.elc delete mode 100644 elpa/async-20200113.1745/async-pkg.el delete mode 100644 elpa/async-20200113.1745/async.el delete mode 100644 elpa/async-20200113.1745/async.elc delete mode 100644 elpa/async-20200113.1745/dired-async.el delete mode 100644 elpa/async-20200113.1745/dired-async.elc delete mode 100644 elpa/async-20200113.1745/smtpmail-async.el delete mode 100644 elpa/async-20200113.1745/smtpmail-async.elc delete mode 100644 elpa/atom-one-dark-theme-readme.txt delete mode 100644 elpa/avy-20200311.1106/avy-autoloads.el delete mode 100644 elpa/avy-20200311.1106/avy-pkg.el delete mode 100644 elpa/avy-20200311.1106/avy.el delete mode 100644 elpa/avy-20200311.1106/avy.elc delete mode 100644 elpa/berrys-theme-20191201.1609/berrys-theme-autoloads.el delete mode 100644 elpa/berrys-theme-20191201.1609/berrys-theme-pkg.el delete mode 100644 elpa/berrys-theme-20191201.1609/berrys-theme.el delete mode 100644 elpa/company-20200324.2145/company-abbrev.el delete mode 100644 elpa/company-20200324.2145/company-abbrev.elc delete mode 100644 elpa/company-20200324.2145/company-autoloads.el delete mode 100644 elpa/company-20200324.2145/company-bbdb.el delete mode 100644 elpa/company-20200324.2145/company-bbdb.elc delete mode 100644 elpa/company-20200324.2145/company-capf.el delete mode 100644 elpa/company-20200324.2145/company-capf.elc delete mode 100644 elpa/company-20200324.2145/company-clang.el delete mode 100644 elpa/company-20200324.2145/company-clang.elc delete mode 100644 elpa/company-20200324.2145/company-cmake.el delete mode 100644 elpa/company-20200324.2145/company-cmake.elc delete mode 100644 elpa/company-20200324.2145/company-css.el delete mode 100644 elpa/company-20200324.2145/company-css.elc delete mode 100644 elpa/company-20200324.2145/company-dabbrev-code.el delete mode 100644 elpa/company-20200324.2145/company-dabbrev-code.elc delete mode 100644 elpa/company-20200324.2145/company-dabbrev.el delete mode 100644 elpa/company-20200324.2145/company-dabbrev.elc delete mode 100644 elpa/company-20200324.2145/company-eclim.el delete mode 100644 elpa/company-20200324.2145/company-eclim.elc delete mode 100644 elpa/company-20200324.2145/company-elisp.el delete mode 100644 elpa/company-20200324.2145/company-elisp.elc delete mode 100644 elpa/company-20200324.2145/company-etags.el delete mode 100644 elpa/company-20200324.2145/company-etags.elc delete mode 100644 elpa/company-20200324.2145/company-files.el delete mode 100644 elpa/company-20200324.2145/company-files.elc delete mode 100644 elpa/company-20200324.2145/company-gtags.el delete mode 100644 elpa/company-20200324.2145/company-gtags.elc delete mode 100644 elpa/company-20200324.2145/company-ispell.el delete mode 100644 elpa/company-20200324.2145/company-ispell.elc delete mode 100644 elpa/company-20200324.2145/company-keywords.el delete mode 100644 elpa/company-20200324.2145/company-keywords.elc delete mode 100644 elpa/company-20200324.2145/company-nxml.el delete mode 100644 elpa/company-20200324.2145/company-nxml.elc delete mode 100644 elpa/company-20200324.2145/company-oddmuse.el delete mode 100644 elpa/company-20200324.2145/company-oddmuse.elc delete mode 100644 elpa/company-20200324.2145/company-pkg.el delete mode 100644 elpa/company-20200324.2145/company-semantic.el delete mode 100644 elpa/company-20200324.2145/company-semantic.elc delete mode 100644 elpa/company-20200324.2145/company-template.el delete mode 100644 elpa/company-20200324.2145/company-template.elc delete mode 100644 elpa/company-20200324.2145/company-tempo.el delete mode 100644 elpa/company-20200324.2145/company-tempo.elc delete mode 100644 elpa/company-20200324.2145/company-tng.el delete mode 100644 elpa/company-20200324.2145/company-tng.elc delete mode 100644 elpa/company-20200324.2145/company-xcode.el delete mode 100644 elpa/company-20200324.2145/company-xcode.elc delete mode 100644 elpa/company-20200324.2145/company-yasnippet.el delete mode 100644 elpa/company-20200324.2145/company-yasnippet.elc delete mode 100644 elpa/company-20200324.2145/company.el delete mode 100644 elpa/company-20200324.2145/company.elc delete mode 100644 elpa/darkroom-0.2.signed delete mode 100644 elpa/darkroom-0.2/darkroom-autoloads.el delete mode 100644 elpa/darkroom-0.2/darkroom-pkg.el delete mode 100644 elpa/darkroom-0.2/darkroom.el delete mode 100644 elpa/darkroom-0.2/darkroom.elc delete mode 100644 elpa/darkroom-readme.txt delete mode 100644 elpa/dart-mode-20190827.2102/dart-mode-autoloads.el delete mode 100644 elpa/dart-mode-20190827.2102/dart-mode-pkg.el delete mode 100644 elpa/dart-mode-20190827.2102/dart-mode.el delete mode 100644 elpa/dart-mode-20190827.2102/dart-mode.elc delete mode 100644 elpa/dart-mode-readme.txt delete mode 100644 elpa/dart-server-20190817.1254/dart-server-autoloads.el delete mode 100644 elpa/dart-server-20190817.1254/dart-server-pkg.el delete mode 100644 elpa/dart-server-20190817.1254/dart-server.el delete mode 100644 elpa/dart-server-20190817.1254/dart-server.elc delete mode 100644 elpa/dart-server-readme.txt delete mode 100644 elpa/dash-20200119.2310/dash-autoloads.el delete mode 100644 elpa/dash-20200119.2310/dash-pkg.el delete mode 100644 elpa/dash-20200119.2310/dash.el delete mode 100644 elpa/dash-20200119.2310/dash.elc delete mode 100644 elpa/dash-20200119.2310/dash.info delete mode 100644 elpa/dash-20200119.2310/dir delete mode 100644 elpa/dash-functional-20191109.1327/dash-functional-autoloads.el delete mode 100644 elpa/dash-functional-20191109.1327/dash-functional-pkg.el delete mode 100644 elpa/dash-functional-20191109.1327/dash-functional.el delete mode 100644 elpa/dash-functional-20191109.1327/dash-functional.elc delete mode 100644 elpa/dashboard-20200306.1344/banners/1.txt delete mode 100644 elpa/dashboard-20200306.1344/banners/2.txt delete mode 100644 elpa/dashboard-20200306.1344/banners/3.txt delete mode 100644 elpa/dashboard-20200306.1344/banners/emacs.png delete mode 100644 elpa/dashboard-20200306.1344/banners/logo.png delete mode 100644 elpa/dashboard-20200306.1344/dashboard-autoloads.el delete mode 100644 elpa/dashboard-20200306.1344/dashboard-pkg.el delete mode 100644 elpa/dashboard-20200306.1344/dashboard-widgets.el delete mode 100644 elpa/dashboard-20200306.1344/dashboard-widgets.elc delete mode 100644 elpa/dashboard-20200306.1344/dashboard.el delete mode 100644 elpa/dashboard-20200306.1344/dashboard.elc delete mode 100644 elpa/deferred-20170901.1330/deferred-autoloads.el delete mode 100644 elpa/deferred-20170901.1330/deferred-pkg.el delete mode 100644 elpa/deferred-20170901.1330/deferred.el delete mode 100644 elpa/deferred-20170901.1330/deferred.elc delete mode 100644 elpa/dockerfile-mode-20200106.2126/dockerfile-mode-autoloads.el delete mode 100644 elpa/dockerfile-mode-20200106.2126/dockerfile-mode-pkg.el delete mode 100644 elpa/dockerfile-mode-20200106.2126/dockerfile-mode.el delete mode 100644 elpa/dockerfile-mode-20200106.2126/dockerfile-mode.elc delete mode 100644 elpa/dot-mode-20180312.2300/dot-mode-autoloads.el delete mode 100644 elpa/dot-mode-20180312.2300/dot-mode-pkg.el delete mode 100644 elpa/dot-mode-20180312.2300/dot-mode.el delete mode 100644 elpa/dot-mode-20180312.2300/dot-mode.elc delete mode 100644 elpa/ein-20200415.238/ein-autoloads.el delete mode 100644 elpa/ein-20200415.238/ein-cell.el delete mode 100644 elpa/ein-20200415.238/ein-cell.elc delete mode 100644 elpa/ein-20200415.238/ein-classes.el delete mode 100644 elpa/ein-20200415.238/ein-classes.elc delete mode 100644 elpa/ein-20200415.238/ein-completer.el delete mode 100644 elpa/ein-20200415.238/ein-completer.elc delete mode 100644 elpa/ein-20200415.238/ein-contents-api.el delete mode 100644 elpa/ein-20200415.238/ein-contents-api.elc delete mode 100644 elpa/ein-20200415.238/ein-core.el delete mode 100644 elpa/ein-20200415.238/ein-core.elc delete mode 100644 elpa/ein-20200415.238/ein-dev.el delete mode 100644 elpa/ein-20200415.238/ein-dev.elc delete mode 100644 elpa/ein-20200415.238/ein-events.el delete mode 100644 elpa/ein-20200415.238/ein-events.elc delete mode 100644 elpa/ein-20200415.238/ein-file.el delete mode 100644 elpa/ein-20200415.238/ein-file.elc delete mode 100644 elpa/ein-20200415.238/ein-ipdb.el delete mode 100644 elpa/ein-20200415.238/ein-ipdb.elc delete mode 100644 elpa/ein-20200415.238/ein-ipynb-mode.el delete mode 100644 elpa/ein-20200415.238/ein-ipynb-mode.elc delete mode 100644 elpa/ein-20200415.238/ein-jupyter.el delete mode 100644 elpa/ein-20200415.238/ein-jupyter.elc delete mode 100644 elpa/ein-20200415.238/ein-jupyterhub.el delete mode 100644 elpa/ein-20200415.238/ein-jupyterhub.elc delete mode 100644 elpa/ein-20200415.238/ein-kernel.el delete mode 100644 elpa/ein-20200415.238/ein-kernel.elc delete mode 100644 elpa/ein-20200415.238/ein-kernelinfo.el delete mode 100644 elpa/ein-20200415.238/ein-kernelinfo.elc delete mode 100644 elpa/ein-20200415.238/ein-kill-ring.el delete mode 100644 elpa/ein-20200415.238/ein-kill-ring.elc delete mode 100644 elpa/ein-20200415.238/ein-log.el delete mode 100644 elpa/ein-20200415.238/ein-log.elc delete mode 100644 elpa/ein-20200415.238/ein-markdown-mode.el delete mode 100644 elpa/ein-20200415.238/ein-markdown-mode.elc delete mode 100644 elpa/ein-20200415.238/ein-node.el delete mode 100644 elpa/ein-20200415.238/ein-node.elc delete mode 100644 elpa/ein-20200415.238/ein-notebook.el delete mode 100644 elpa/ein-20200415.238/ein-notebook.elc delete mode 100644 elpa/ein-20200415.238/ein-notebooklist.el delete mode 100644 elpa/ein-20200415.238/ein-notebooklist.elc delete mode 100644 elpa/ein-20200415.238/ein-notification.el delete mode 100644 elpa/ein-20200415.238/ein-notification.elc delete mode 100644 elpa/ein-20200415.238/ein-output-area.el delete mode 100644 elpa/ein-20200415.238/ein-output-area.elc delete mode 100644 elpa/ein-20200415.238/ein-pager.el delete mode 100644 elpa/ein-20200415.238/ein-pager.elc delete mode 100644 elpa/ein-20200415.238/ein-pkg.el delete mode 100644 elpa/ein-20200415.238/ein-process.el delete mode 100644 elpa/ein-20200415.238/ein-process.elc delete mode 100644 elpa/ein-20200415.238/ein-python-send.el delete mode 100644 elpa/ein-20200415.238/ein-python-send.elc delete mode 100644 elpa/ein-20200415.238/ein-pytools.el delete mode 100644 elpa/ein-20200415.238/ein-pytools.elc delete mode 100644 elpa/ein-20200415.238/ein-query.el delete mode 100644 elpa/ein-20200415.238/ein-query.elc delete mode 100644 elpa/ein-20200415.238/ein-scratchsheet.el delete mode 100644 elpa/ein-20200415.238/ein-scratchsheet.elc delete mode 100644 elpa/ein-20200415.238/ein-shared-output.el delete mode 100644 elpa/ein-20200415.238/ein-shared-output.elc delete mode 100644 elpa/ein-20200415.238/ein-traceback.el delete mode 100644 elpa/ein-20200415.238/ein-traceback.elc delete mode 100644 elpa/ein-20200415.238/ein-utils.el delete mode 100644 elpa/ein-20200415.238/ein-utils.elc delete mode 100644 elpa/ein-20200415.238/ein-websocket.el delete mode 100644 elpa/ein-20200415.238/ein-websocket.elc delete mode 100644 elpa/ein-20200415.238/ein-worksheet.el delete mode 100644 elpa/ein-20200415.238/ein-worksheet.elc delete mode 100644 elpa/ein-20200415.238/ein.el delete mode 100644 elpa/ein-20200415.238/ein.elc delete mode 100644 elpa/ein-20200415.238/ob-ein.el delete mode 100644 elpa/ein-20200415.238/ob-ein.elc delete mode 100644 elpa/ein-20200415.238/poly-ein.el delete mode 100644 elpa/ein-20200415.238/poly-ein.elc delete mode 100644 elpa/elisp-format-20160508.952/elisp-format-autoloads.el delete mode 100644 elpa/elisp-format-20160508.952/elisp-format-pkg.el delete mode 100644 elpa/elisp-format-20160508.952/elisp-format.el delete mode 100644 elpa/elisp-format-20160508.952/elisp-format.elc delete mode 100644 elpa/elisp-lint-20200324.2217/elisp-lint-autoloads.el delete mode 100644 elpa/elisp-lint-20200324.2217/elisp-lint-pkg.el delete mode 100644 elpa/elisp-lint-20200324.2217/elisp-lint.el delete mode 100644 elpa/elisp-lint-20200324.2217/elisp-lint.elc delete mode 100644 elpa/elm-mode-20200406.214/elm-font-lock.el delete mode 100644 elpa/elm-mode-20200406.214/elm-font-lock.elc delete mode 100644 elpa/elm-mode-20200406.214/elm-format.el delete mode 100644 elpa/elm-mode-20200406.214/elm-format.elc delete mode 100644 elpa/elm-mode-20200406.214/elm-imenu.el delete mode 100644 elpa/elm-mode-20200406.214/elm-imenu.elc delete mode 100644 elpa/elm-mode-20200406.214/elm-indent.el delete mode 100644 elpa/elm-mode-20200406.214/elm-indent.elc delete mode 100644 elpa/elm-mode-20200406.214/elm-interactive.el delete mode 100644 elpa/elm-mode-20200406.214/elm-interactive.elc delete mode 100644 elpa/elm-mode-20200406.214/elm-mode-autoloads.el delete mode 100644 elpa/elm-mode-20200406.214/elm-mode-pkg.el delete mode 100644 elpa/elm-mode-20200406.214/elm-mode.el delete mode 100644 elpa/elm-mode-20200406.214/elm-mode.elc delete mode 100644 elpa/elm-mode-20200406.214/elm-tags.el delete mode 100644 elpa/elm-mode-20200406.214/elm-tags.elc delete mode 100644 elpa/elm-mode-20200406.214/elm-util.el delete mode 100644 elpa/elm-mode-20200406.214/elm-util.elc delete mode 100644 elpa/elm-mode-20200406.214/elm.tags delete mode 100644 elpa/elpy-20191120.1927/elpy/__init__.pyc delete mode 100644 elpa/elpy-20191120.1927/elpy/auto_pep8.pyc delete mode 100644 elpa/elpy-20191120.1927/elpy/blackutil.pyc delete mode 100644 elpa/elpy-20191120.1927/elpy/compat.pyc delete mode 100644 elpa/elpy-20191120.1927/elpy/jedibackend.pyc delete mode 100644 elpa/elpy-20191120.1927/elpy/pydocutils.pyc delete mode 100644 elpa/elpy-20191120.1927/elpy/rpc.pyc delete mode 100644 elpa/elpy-20191120.1927/elpy/server.pyc delete mode 100644 elpa/elpy-20191120.1927/elpy/yapfutil.pyc delete mode 100644 elpa/elpy-20200329.1830/elpy-autoloads.el delete mode 100644 elpa/elpy-20200329.1830/elpy-django.el delete mode 100644 elpa/elpy-20200329.1830/elpy-django.elc delete mode 100644 elpa/elpy-20200329.1830/elpy-pkg.el delete mode 100644 elpa/elpy-20200329.1830/elpy-profile.el delete mode 100644 elpa/elpy-20200329.1830/elpy-profile.elc delete mode 100644 elpa/elpy-20200329.1830/elpy-refactor.el delete mode 100644 elpa/elpy-20200329.1830/elpy-refactor.elc delete mode 100644 elpa/elpy-20200329.1830/elpy-rpc.el delete mode 100644 elpa/elpy-20200329.1830/elpy-rpc.elc delete mode 100644 elpa/elpy-20200329.1830/elpy-shell.el delete mode 100644 elpa/elpy-20200329.1830/elpy-shell.elc delete mode 100644 elpa/elpy-20200329.1830/elpy.el delete mode 100644 elpa/elpy-20200329.1830/elpy.elc delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/.yas-setup.el delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/.yas-setup.elc delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__abs__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__add__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__and__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__bool__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__call__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__cmp__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__coerce__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__complex__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__contains__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__del__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__delattr__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__delete__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__delitem__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__div__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__divmod__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__enter__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__eq__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__exit__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__float__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__floordiv__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__ge__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__get__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__getattr__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__getattribute__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__getitem__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__gt__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__hash__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__hex__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__iadd__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__iand__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__idiv__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__ifloordiv__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__ilshift__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__imod__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__imul__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__index__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__init__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__instancecheck__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__int__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__invert__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__ior__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__ipow__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__irshift__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__isub__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__iter__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__itruediv__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__ixor__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__le__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__len__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__long__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__lshift__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__lt__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__mod__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__mul__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__ne__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__neg__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__new__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__nonzero__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__oct__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__or__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__pos__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__pow__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__radd__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rand__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rdivmod__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__repr__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__reversed__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rfloordiv__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rlshift__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rmod__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rmul__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__ror__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rpow__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rrshift__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rshift__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rsub__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rtruediv__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__rxor__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__set__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__setattr__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__setitem__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__slots__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__str__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__sub__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__subclasscheck__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__truediv__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__unicode__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/__xor__ delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_abs delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_add delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_and delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_bool delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_call delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_cmp delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_coerce delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_complex delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_contains delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_del delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_delattr delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_delete delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_delitem delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_div delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_divmod delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_enter delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_eq delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_exit delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_float delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_floordiv delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_ge delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_get delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_getattr delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_getattribute delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_getitem delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_gt delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_hash delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_hex delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_iadd delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_iand delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_idiv delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_ifloordiv delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_ilshift delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_imod delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_imul delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_index delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_init delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_instancecheck delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_int delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_invert delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_ior delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_ipow delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_irshift delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_isub delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_iter delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_itruediv delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_ixor delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_le delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_len delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_long delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_lshift delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_lt delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_mod delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_mul delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_ne delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_neg delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_new delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_nonzero delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_oct delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_or delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_pos delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_pow delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_radd delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rand delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rdivmod delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_repr delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_reversed delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rfloordiv delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rlshift delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rmod delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rmul delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_ror delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rpow delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rrshift delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rshift delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rsub delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rtruediv delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_rxor delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_set delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_setattr delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_setitem delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_slots delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_str delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_sub delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_subclasscheck delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_truediv delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_unicode delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/_xor delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/ase delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/asne delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/asr delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/class delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/def delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/defs delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/enc delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/env delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/from delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/pdb delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/py3 delete mode 100644 elpa/elpy-20200329.1830/snippets/python-mode/super delete mode 100644 elpa/epl-20180205.2049/epl-autoloads.el delete mode 100644 elpa/epl-20180205.2049/epl-pkg.el delete mode 100644 elpa/epl-20180205.2049/epl.el delete mode 100644 elpa/epl-20180205.2049/epl.elc delete mode 100644 elpa/f-20191110.1357/f-autoloads.el delete mode 100644 elpa/f-20191110.1357/f-pkg.el delete mode 100644 elpa/f-20191110.1357/f.el delete mode 100644 elpa/f-20191110.1357/f.elc delete mode 100644 elpa/faceup-20170925.1946/faceup-autoloads.el delete mode 100644 elpa/faceup-20170925.1946/faceup-pkg.el delete mode 100644 elpa/faceup-20170925.1946/faceup.el delete mode 100644 elpa/faceup-20170925.1946/faceup.elc delete mode 100644 elpa/flucui-themes-20200204.1930/flucui-dark-theme.el delete mode 100644 elpa/flucui-themes-20200204.1930/flucui-light-theme.el delete mode 100644 elpa/flucui-themes-20200204.1930/flucui-themes-autoloads.el delete mode 100644 elpa/flucui-themes-20200204.1930/flucui-themes-pkg.el delete mode 100644 elpa/flucui-themes-20200204.1930/flucui-themes.el delete mode 100644 elpa/flucui-themes-20200204.1930/flucui-themes.elc delete mode 100644 elpa/flycheck-20200405.2310/flycheck-autoloads.el delete mode 100644 elpa/flycheck-20200405.2310/flycheck-buttercup.el delete mode 100644 elpa/flycheck-20200405.2310/flycheck-ert.el delete mode 100644 elpa/flycheck-20200405.2310/flycheck-ert.elc delete mode 100644 elpa/flycheck-20200405.2310/flycheck-pkg.el delete mode 100644 elpa/flycheck-20200405.2310/flycheck.el delete mode 100644 elpa/flycheck-20200405.2310/flycheck.elc delete mode 100644 elpa/flymake-eslint-20191129.1558/flymake-eslint-autoloads.el delete mode 100644 elpa/flymake-eslint-20191129.1558/flymake-eslint-pkg.el delete mode 100644 elpa/flymake-eslint-20191129.1558/flymake-eslint.el delete mode 100644 elpa/flymake-eslint-20191129.1558/flymake-eslint.elc delete mode 100644 elpa/flymake-racket-20180912.109/flymake-racket-autoloads.el delete mode 100644 elpa/flymake-racket-20180912.109/flymake-racket-pkg.el delete mode 100644 elpa/flymake-racket-20180912.109/flymake-racket.el delete mode 100644 elpa/flymake-racket-20180912.109/flymake-racket.elc delete mode 100644 elpa/gherkin-mode-20171224.1353/gherkin-mode-autoloads.el delete mode 100644 elpa/gherkin-mode-20171224.1353/gherkin-mode-pkg.el delete mode 100644 elpa/gherkin-mode-20171224.1353/gherkin-mode.el delete mode 100644 elpa/gherkin-mode-20171224.1353/gherkin-mode.elc delete mode 100644 elpa/git-commit-20200207.1819/git-commit-autoloads.el delete mode 100644 elpa/git-commit-20200207.1819/git-commit-pkg.el delete mode 100644 elpa/git-commit-20200207.1819/git-commit.el delete mode 100644 elpa/git-commit-20200207.1819/git-commit.elc delete mode 100644 elpa/gntp-20141025.250/gntp-autoloads.el delete mode 100644 elpa/gntp-20141025.250/gntp-pkg.el delete mode 100644 elpa/gntp-20141025.250/gntp.el delete mode 100644 elpa/gntp-20141025.250/gntp.elc delete mode 100644 elpa/gnupg/pubring.kbx delete mode 100644 elpa/gnupg/trustdb.gpg delete mode 100644 elpa/google-translate-20190620.1416/.bump-version.el delete mode 100644 elpa/google-translate-20190620.1416/.bump-version.elc delete mode 100644 elpa/google-translate-20190620.1416/google-translate-autoloads.el delete mode 100644 elpa/google-translate-20190620.1416/google-translate-backend.el delete mode 100644 elpa/google-translate-20190620.1416/google-translate-backend.elc delete mode 100644 elpa/google-translate-20190620.1416/google-translate-core-ui.el delete mode 100644 elpa/google-translate-20190620.1416/google-translate-core-ui.elc delete mode 100644 elpa/google-translate-20190620.1416/google-translate-core.el delete mode 100644 elpa/google-translate-20190620.1416/google-translate-core.elc delete mode 100644 elpa/google-translate-20190620.1416/google-translate-default-ui.el delete mode 100644 elpa/google-translate-20190620.1416/google-translate-default-ui.elc delete mode 100644 elpa/google-translate-20190620.1416/google-translate-pkg.el delete mode 100644 elpa/google-translate-20190620.1416/google-translate-smooth-ui.el delete mode 100644 elpa/google-translate-20190620.1416/google-translate-smooth-ui.elc delete mode 100644 elpa/google-translate-20190620.1416/google-translate-tk.el delete mode 100644 elpa/google-translate-20190620.1416/google-translate-tk.elc delete mode 100644 elpa/google-translate-20190620.1416/google-translate.el delete mode 100644 elpa/google-translate-20190620.1416/google-translate.elc delete mode 100644 elpa/graphviz-dot-mode-20200304.432/company-graphviz-dot.el delete mode 100644 elpa/graphviz-dot-mode-20200304.432/company-graphviz-dot.elc delete mode 100644 elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode-autoloads.el delete mode 100644 elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode-pkg.el delete mode 100644 elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode.el delete mode 100644 elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode.elc delete mode 100644 elpa/highlight-indentation-20181204.839/highlight-indentation-autoloads.el delete mode 100644 elpa/highlight-indentation-20181204.839/highlight-indentation-pkg.el delete mode 100644 elpa/highlight-indentation-20181204.839/highlight-indentation.el delete mode 100644 elpa/highlight-indentation-20181204.839/highlight-indentation.elc delete mode 100644 elpa/htmlize-20191111.2130/htmlize-autoloads.el delete mode 100644 elpa/htmlize-20191111.2130/htmlize-pkg.el delete mode 100644 elpa/htmlize-20191111.2130/htmlize.el delete mode 100644 elpa/htmlize-20191111.2130/htmlize.elc delete mode 100644 elpa/ivy-20200319.1247/colir.el delete mode 100644 elpa/ivy-20200319.1247/colir.elc delete mode 100644 elpa/ivy-20200319.1247/dir delete mode 100644 elpa/ivy-20200319.1247/elpa.el delete mode 100644 elpa/ivy-20200319.1247/elpa.elc delete mode 100644 elpa/ivy-20200319.1247/ivy-autoloads.el delete mode 100644 elpa/ivy-20200319.1247/ivy-help.org delete mode 100644 elpa/ivy-20200319.1247/ivy-overlay.el delete mode 100644 elpa/ivy-20200319.1247/ivy-overlay.elc delete mode 100644 elpa/ivy-20200319.1247/ivy-pkg.el delete mode 100644 elpa/ivy-20200319.1247/ivy.el delete mode 100644 elpa/ivy-20200319.1247/ivy.elc delete mode 100644 elpa/ivy-20200319.1247/ivy.info delete mode 100644 elpa/ivy-gitlab-readme.txt delete mode 100644 elpa/json-mode-20190123.422/json-mode-autoloads.el delete mode 100644 elpa/json-mode-20190123.422/json-mode-pkg.el delete mode 100644 elpa/json-mode-20190123.422/json-mode.el delete mode 100644 elpa/json-mode-20190123.422/json-mode.elc delete mode 100644 elpa/json-reformat-20160212.853/json-reformat-autoloads.el delete mode 100644 elpa/json-reformat-20160212.853/json-reformat-pkg.el delete mode 100644 elpa/json-reformat-20160212.853/json-reformat.el delete mode 100644 elpa/json-reformat-20160212.853/json-reformat.elc delete mode 100644 elpa/json-snatcher-20150512.347/json-snatcher-autoloads.el delete mode 100644 elpa/json-snatcher-20150512.347/json-snatcher-pkg.el delete mode 100644 elpa/json-snatcher-20150512.347/json-snatcher.el delete mode 100644 elpa/json-snatcher-20150512.347/json-snatcher.elc delete mode 100644 elpa/let-alist-1.0.6.signed delete mode 100644 elpa/let-alist-1.0.6/let-alist-autoloads.el delete mode 100644 elpa/let-alist-1.0.6/let-alist-pkg.el delete mode 100644 elpa/let-alist-1.0.6/let-alist.el delete mode 100644 elpa/let-alist-1.0.6/let-alist.elc delete mode 100644 elpa/leuven-theme-20200416.728/leuven-dark-theme.el delete mode 100644 elpa/leuven-theme-20200416.728/leuven-theme-autoloads.el delete mode 100644 elpa/leuven-theme-20200416.728/leuven-theme-pkg.el delete mode 100644 elpa/leuven-theme-20200416.728/leuven-theme.el delete mode 100644 elpa/log4e-20200419.933/log4e-autoloads.el delete mode 100644 elpa/log4e-20200419.933/log4e-pkg.el delete mode 100644 elpa/log4e-20200419.933/log4e.el delete mode 100644 elpa/log4e-20200419.933/log4e.elc delete mode 100644 elpa/macrostep-20161120.2106/macrostep-autoloads.el delete mode 100644 elpa/macrostep-20161120.2106/macrostep-c.el delete mode 100644 elpa/macrostep-20161120.2106/macrostep-c.elc delete mode 100644 elpa/macrostep-20161120.2106/macrostep-pkg.el delete mode 100644 elpa/macrostep-20161120.2106/macrostep.el delete mode 100644 elpa/macrostep-20161120.2106/macrostep.elc delete mode 100644 elpa/magit-20200418.939/AUTHORS.md delete mode 100644 elpa/magit-20200418.939/LICENSE delete mode 100644 elpa/magit-20200418.939/dir delete mode 100644 elpa/magit-20200418.939/git-rebase.el delete mode 100644 elpa/magit-20200418.939/git-rebase.elc delete mode 100644 elpa/magit-20200418.939/magit-apply.el delete mode 100644 elpa/magit-20200418.939/magit-apply.elc delete mode 100644 elpa/magit-20200418.939/magit-autoloads.el delete mode 100644 elpa/magit-20200418.939/magit-autorevert.el delete mode 100644 elpa/magit-20200418.939/magit-autorevert.elc delete mode 100644 elpa/magit-20200418.939/magit-bisect.el delete mode 100644 elpa/magit-20200418.939/magit-bisect.elc delete mode 100644 elpa/magit-20200418.939/magit-blame.el delete mode 100644 elpa/magit-20200418.939/magit-blame.elc delete mode 100644 elpa/magit-20200418.939/magit-bookmark.el delete mode 100644 elpa/magit-20200418.939/magit-bookmark.elc delete mode 100644 elpa/magit-20200418.939/magit-branch.el delete mode 100644 elpa/magit-20200418.939/magit-branch.elc delete mode 100644 elpa/magit-20200418.939/magit-clone.el delete mode 100644 elpa/magit-20200418.939/magit-clone.elc delete mode 100644 elpa/magit-20200418.939/magit-commit.el delete mode 100644 elpa/magit-20200418.939/magit-commit.elc delete mode 100644 elpa/magit-20200418.939/magit-core.el delete mode 100644 elpa/magit-20200418.939/magit-core.elc delete mode 100644 elpa/magit-20200418.939/magit-diff.el delete mode 100644 elpa/magit-20200418.939/magit-diff.elc delete mode 100644 elpa/magit-20200418.939/magit-ediff.el delete mode 100644 elpa/magit-20200418.939/magit-ediff.elc delete mode 100644 elpa/magit-20200418.939/magit-extras.el delete mode 100644 elpa/magit-20200418.939/magit-extras.elc delete mode 100644 elpa/magit-20200418.939/magit-fetch.el delete mode 100644 elpa/magit-20200418.939/magit-fetch.elc delete mode 100644 elpa/magit-20200418.939/magit-files.el delete mode 100644 elpa/magit-20200418.939/magit-files.elc delete mode 100644 elpa/magit-20200418.939/magit-git.el delete mode 100644 elpa/magit-20200418.939/magit-git.elc delete mode 100644 elpa/magit-20200418.939/magit-gitignore.el delete mode 100644 elpa/magit-20200418.939/magit-gitignore.elc delete mode 100644 elpa/magit-20200418.939/magit-imenu.el delete mode 100644 elpa/magit-20200418.939/magit-imenu.elc delete mode 100644 elpa/magit-20200418.939/magit-log.el delete mode 100644 elpa/magit-20200418.939/magit-log.elc delete mode 100644 elpa/magit-20200418.939/magit-margin.el delete mode 100644 elpa/magit-20200418.939/magit-margin.elc delete mode 100644 elpa/magit-20200418.939/magit-merge.el delete mode 100644 elpa/magit-20200418.939/magit-merge.elc delete mode 100644 elpa/magit-20200418.939/magit-mode.el delete mode 100644 elpa/magit-20200418.939/magit-mode.elc delete mode 100644 elpa/magit-20200418.939/magit-notes.el delete mode 100644 elpa/magit-20200418.939/magit-notes.elc delete mode 100644 elpa/magit-20200418.939/magit-obsolete.el delete mode 100644 elpa/magit-20200418.939/magit-obsolete.elc delete mode 100644 elpa/magit-20200418.939/magit-patch.el delete mode 100644 elpa/magit-20200418.939/magit-patch.elc delete mode 100644 elpa/magit-20200418.939/magit-pkg.el delete mode 100644 elpa/magit-20200418.939/magit-process.el delete mode 100644 elpa/magit-20200418.939/magit-process.elc delete mode 100644 elpa/magit-20200418.939/magit-pull.el delete mode 100644 elpa/magit-20200418.939/magit-pull.elc delete mode 100644 elpa/magit-20200418.939/magit-push.el delete mode 100644 elpa/magit-20200418.939/magit-push.elc delete mode 100644 elpa/magit-20200418.939/magit-reflog.el delete mode 100644 elpa/magit-20200418.939/magit-reflog.elc delete mode 100644 elpa/magit-20200418.939/magit-refs.el delete mode 100644 elpa/magit-20200418.939/magit-refs.elc delete mode 100644 elpa/magit-20200418.939/magit-remote.el delete mode 100644 elpa/magit-20200418.939/magit-remote.elc delete mode 100644 elpa/magit-20200418.939/magit-repos.el delete mode 100644 elpa/magit-20200418.939/magit-repos.elc delete mode 100644 elpa/magit-20200418.939/magit-reset.el delete mode 100644 elpa/magit-20200418.939/magit-reset.elc delete mode 100644 elpa/magit-20200418.939/magit-section.el delete mode 100644 elpa/magit-20200418.939/magit-section.elc delete mode 100644 elpa/magit-20200418.939/magit-sequence.el delete mode 100644 elpa/magit-20200418.939/magit-sequence.elc delete mode 100644 elpa/magit-20200418.939/magit-stash.el delete mode 100644 elpa/magit-20200418.939/magit-stash.elc delete mode 100644 elpa/magit-20200418.939/magit-status.el delete mode 100644 elpa/magit-20200418.939/magit-status.elc delete mode 100644 elpa/magit-20200418.939/magit-submodule.el delete mode 100644 elpa/magit-20200418.939/magit-submodule.elc delete mode 100644 elpa/magit-20200418.939/magit-subtree.el delete mode 100644 elpa/magit-20200418.939/magit-subtree.elc delete mode 100644 elpa/magit-20200418.939/magit-tag.el delete mode 100644 elpa/magit-20200418.939/magit-tag.elc delete mode 100644 elpa/magit-20200418.939/magit-transient.el delete mode 100644 elpa/magit-20200418.939/magit-transient.elc delete mode 100644 elpa/magit-20200418.939/magit-utils.el delete mode 100644 elpa/magit-20200418.939/magit-utils.elc delete mode 100644 elpa/magit-20200418.939/magit-wip.el delete mode 100644 elpa/magit-20200418.939/magit-wip.elc delete mode 100644 elpa/magit-20200418.939/magit-worktree.el delete mode 100644 elpa/magit-20200418.939/magit-worktree.elc delete mode 100644 elpa/magit-20200418.939/magit.el delete mode 100644 elpa/magit-20200418.939/magit.elc delete mode 100644 elpa/magit-20200418.939/magit.info delete mode 100644 elpa/magit-20200418.939/magit.info-1 delete mode 100644 elpa/magit-20200418.939/magit.info-2 delete mode 100644 elpa/nord-theme-20200108.833/nord-theme-autoloads.el delete mode 100644 elpa/nord-theme-20200108.833/nord-theme-pkg.el delete mode 100644 elpa/nord-theme-20200108.833/nord-theme.el delete mode 100644 elpa/ob-dart-20170106.1624/ob-dart-autoloads.el delete mode 100644 elpa/ob-dart-20170106.1624/ob-dart-pkg.el delete mode 100644 elpa/ob-dart-20170106.1624/ob-dart.el delete mode 100644 elpa/ob-dart-20170106.1624/ob-dart.elc delete mode 100644 elpa/ob-http-20180707.1448/ob-http-autoloads.el delete mode 100644 elpa/ob-http-20180707.1448/ob-http-mode.el delete mode 100644 elpa/ob-http-20180707.1448/ob-http-mode.elc delete mode 100644 elpa/ob-http-20180707.1448/ob-http-pkg.el delete mode 100644 elpa/ob-http-20180707.1448/ob-http.el delete mode 100644 elpa/ob-http-20180707.1448/ob-http.elc delete mode 100644 elpa/ob-ipython-20180224.953/client.py delete mode 100644 elpa/ob-ipython-20180224.953/ob-ipython-autoloads.el delete mode 100644 elpa/ob-ipython-20180224.953/ob-ipython-pkg.el delete mode 100644 elpa/ob-ipython-20180224.953/ob-ipython.el delete mode 100644 elpa/ob-ipython-20180224.953/ob-ipython.elc delete mode 100644 elpa/ob-restclient-20200316.759/ob-restclient-autoloads.el delete mode 100644 elpa/ob-restclient-20200316.759/ob-restclient-pkg.el delete mode 100644 elpa/ob-restclient-20200316.759/ob-restclient.el delete mode 100644 elpa/ob-restclient-20200316.759/ob-restclient.elc delete mode 100644 elpa/olivetti-20200417.607/olivetti-autoloads.el delete mode 100644 elpa/olivetti-20200417.607/olivetti-pkg.el delete mode 100644 elpa/olivetti-20200417.607/olivetti.el delete mode 100644 elpa/olivetti-20200417.607/olivetti.elc delete mode 100644 elpa/org-9.3.6.signed delete mode 100644 elpa/org-9.3.6/COPYING delete mode 100644 elpa/org-9.3.6/README_ELPA delete mode 100644 elpa/org-9.3.6/dir delete mode 100644 elpa/org-9.3.6/etc/ORG-NEWS delete mode 100644 elpa/org-9.3.6/etc/styles/OrgOdtContentTemplate.xml delete mode 100644 elpa/org-9.3.6/etc/styles/OrgOdtStyles.xml delete mode 100644 elpa/org-9.3.6/etc/styles/README delete mode 100644 elpa/org-9.3.6/ob-C.el delete mode 100644 elpa/org-9.3.6/ob-C.elc delete mode 100644 elpa/org-9.3.6/ob-J.el delete mode 100644 elpa/org-9.3.6/ob-J.elc delete mode 100644 elpa/org-9.3.6/ob-R.el delete mode 100644 elpa/org-9.3.6/ob-R.elc delete mode 100644 elpa/org-9.3.6/ob-abc.el delete mode 100644 elpa/org-9.3.6/ob-abc.elc delete mode 100644 elpa/org-9.3.6/ob-asymptote.el delete mode 100644 elpa/org-9.3.6/ob-asymptote.elc delete mode 100644 elpa/org-9.3.6/ob-awk.el delete mode 100644 elpa/org-9.3.6/ob-awk.elc delete mode 100644 elpa/org-9.3.6/ob-calc.el delete mode 100644 elpa/org-9.3.6/ob-calc.elc delete mode 100644 elpa/org-9.3.6/ob-clojure.el delete mode 100644 elpa/org-9.3.6/ob-clojure.elc delete mode 100644 elpa/org-9.3.6/ob-comint.el delete mode 100644 elpa/org-9.3.6/ob-comint.elc delete mode 100644 elpa/org-9.3.6/ob-coq.el delete mode 100644 elpa/org-9.3.6/ob-coq.elc delete mode 100644 elpa/org-9.3.6/ob-core.el delete mode 100644 elpa/org-9.3.6/ob-core.elc delete mode 100644 elpa/org-9.3.6/ob-css.el delete mode 100644 elpa/org-9.3.6/ob-css.elc delete mode 100644 elpa/org-9.3.6/ob-ditaa.el delete mode 100644 elpa/org-9.3.6/ob-ditaa.elc delete mode 100644 elpa/org-9.3.6/ob-dot.el delete mode 100644 elpa/org-9.3.6/ob-dot.elc delete mode 100644 elpa/org-9.3.6/ob-ebnf.el delete mode 100644 elpa/org-9.3.6/ob-ebnf.elc delete mode 100644 elpa/org-9.3.6/ob-emacs-lisp.el delete mode 100644 elpa/org-9.3.6/ob-emacs-lisp.elc delete mode 100644 elpa/org-9.3.6/ob-eshell.el delete mode 100644 elpa/org-9.3.6/ob-eshell.elc delete mode 100644 elpa/org-9.3.6/ob-eval.el delete mode 100644 elpa/org-9.3.6/ob-eval.elc delete mode 100644 elpa/org-9.3.6/ob-exp.el delete mode 100644 elpa/org-9.3.6/ob-exp.elc delete mode 100644 elpa/org-9.3.6/ob-forth.el delete mode 100644 elpa/org-9.3.6/ob-forth.elc delete mode 100644 elpa/org-9.3.6/ob-fortran.el delete mode 100644 elpa/org-9.3.6/ob-fortran.elc delete mode 100644 elpa/org-9.3.6/ob-gnuplot.el delete mode 100644 elpa/org-9.3.6/ob-gnuplot.elc delete mode 100644 elpa/org-9.3.6/ob-groovy.el delete mode 100644 elpa/org-9.3.6/ob-groovy.elc delete mode 100644 elpa/org-9.3.6/ob-haskell.el delete mode 100644 elpa/org-9.3.6/ob-haskell.elc delete mode 100644 elpa/org-9.3.6/ob-hledger.el delete mode 100644 elpa/org-9.3.6/ob-hledger.elc delete mode 100644 elpa/org-9.3.6/ob-io.el delete mode 100644 elpa/org-9.3.6/ob-io.elc delete mode 100644 elpa/org-9.3.6/ob-java.el delete mode 100644 elpa/org-9.3.6/ob-java.elc delete mode 100644 elpa/org-9.3.6/ob-js.el delete mode 100644 elpa/org-9.3.6/ob-js.elc delete mode 100644 elpa/org-9.3.6/ob-latex.el delete mode 100644 elpa/org-9.3.6/ob-latex.elc delete mode 100644 elpa/org-9.3.6/ob-ledger.el delete mode 100644 elpa/org-9.3.6/ob-ledger.elc delete mode 100644 elpa/org-9.3.6/ob-lilypond.el delete mode 100644 elpa/org-9.3.6/ob-lilypond.elc delete mode 100644 elpa/org-9.3.6/ob-lisp.el delete mode 100644 elpa/org-9.3.6/ob-lisp.elc delete mode 100644 elpa/org-9.3.6/ob-lob.el delete mode 100644 elpa/org-9.3.6/ob-lob.elc delete mode 100644 elpa/org-9.3.6/ob-lua.el delete mode 100644 elpa/org-9.3.6/ob-lua.elc delete mode 100644 elpa/org-9.3.6/ob-makefile.el delete mode 100644 elpa/org-9.3.6/ob-makefile.elc delete mode 100644 elpa/org-9.3.6/ob-matlab.el delete mode 100644 elpa/org-9.3.6/ob-matlab.elc delete mode 100644 elpa/org-9.3.6/ob-maxima.el delete mode 100644 elpa/org-9.3.6/ob-maxima.elc delete mode 100644 elpa/org-9.3.6/ob-mscgen.el delete mode 100644 elpa/org-9.3.6/ob-mscgen.elc delete mode 100644 elpa/org-9.3.6/ob-ocaml.el delete mode 100644 elpa/org-9.3.6/ob-ocaml.elc delete mode 100644 elpa/org-9.3.6/ob-octave.el delete mode 100644 elpa/org-9.3.6/ob-octave.elc delete mode 100644 elpa/org-9.3.6/ob-org.el delete mode 100644 elpa/org-9.3.6/ob-org.elc delete mode 100644 elpa/org-9.3.6/ob-perl.el delete mode 100644 elpa/org-9.3.6/ob-perl.elc delete mode 100644 elpa/org-9.3.6/ob-picolisp.el delete mode 100644 elpa/org-9.3.6/ob-picolisp.elc delete mode 100644 elpa/org-9.3.6/ob-plantuml.el delete mode 100644 elpa/org-9.3.6/ob-plantuml.elc delete mode 100644 elpa/org-9.3.6/ob-processing.el delete mode 100644 elpa/org-9.3.6/ob-processing.elc delete mode 100644 elpa/org-9.3.6/ob-python.el delete mode 100644 elpa/org-9.3.6/ob-python.elc delete mode 100644 elpa/org-9.3.6/ob-ref.el delete mode 100644 elpa/org-9.3.6/ob-ref.elc delete mode 100644 elpa/org-9.3.6/ob-ruby.el delete mode 100644 elpa/org-9.3.6/ob-ruby.elc delete mode 100644 elpa/org-9.3.6/ob-sass.el delete mode 100644 elpa/org-9.3.6/ob-sass.elc delete mode 100644 elpa/org-9.3.6/ob-scheme.el delete mode 100644 elpa/org-9.3.6/ob-scheme.elc delete mode 100644 elpa/org-9.3.6/ob-screen.el delete mode 100644 elpa/org-9.3.6/ob-screen.elc delete mode 100644 elpa/org-9.3.6/ob-sed.el delete mode 100644 elpa/org-9.3.6/ob-sed.elc delete mode 100644 elpa/org-9.3.6/ob-shell.el delete mode 100644 elpa/org-9.3.6/ob-shell.elc delete mode 100644 elpa/org-9.3.6/ob-shen.el delete mode 100644 elpa/org-9.3.6/ob-shen.elc delete mode 100644 elpa/org-9.3.6/ob-sql.el delete mode 100644 elpa/org-9.3.6/ob-sql.elc delete mode 100644 elpa/org-9.3.6/ob-sqlite.el delete mode 100644 elpa/org-9.3.6/ob-sqlite.elc delete mode 100644 elpa/org-9.3.6/ob-stan.el delete mode 100644 elpa/org-9.3.6/ob-stan.elc delete mode 100644 elpa/org-9.3.6/ob-table.el delete mode 100644 elpa/org-9.3.6/ob-table.elc delete mode 100644 elpa/org-9.3.6/ob-tangle.el delete mode 100644 elpa/org-9.3.6/ob-tangle.elc delete mode 100644 elpa/org-9.3.6/ob-vala.el delete mode 100644 elpa/org-9.3.6/ob-vala.elc delete mode 100644 elpa/org-9.3.6/ob.el delete mode 100644 elpa/org-9.3.6/ob.elc delete mode 100644 elpa/org-9.3.6/ol-bbdb.el delete mode 100644 elpa/org-9.3.6/ol-bbdb.elc delete mode 100644 elpa/org-9.3.6/ol-bibtex.el delete mode 100644 elpa/org-9.3.6/ol-bibtex.elc delete mode 100644 elpa/org-9.3.6/ol-docview.el delete mode 100644 elpa/org-9.3.6/ol-docview.elc delete mode 100644 elpa/org-9.3.6/ol-eshell.el delete mode 100644 elpa/org-9.3.6/ol-eshell.elc delete mode 100644 elpa/org-9.3.6/ol-eww.el delete mode 100644 elpa/org-9.3.6/ol-eww.elc delete mode 100644 elpa/org-9.3.6/ol-gnus.el delete mode 100644 elpa/org-9.3.6/ol-gnus.elc delete mode 100644 elpa/org-9.3.6/ol-info.el delete mode 100644 elpa/org-9.3.6/ol-info.elc delete mode 100644 elpa/org-9.3.6/ol-irc.el delete mode 100644 elpa/org-9.3.6/ol-irc.elc delete mode 100644 elpa/org-9.3.6/ol-mhe.el delete mode 100644 elpa/org-9.3.6/ol-mhe.elc delete mode 100644 elpa/org-9.3.6/ol-rmail.el delete mode 100644 elpa/org-9.3.6/ol-rmail.elc delete mode 100644 elpa/org-9.3.6/ol-w3m.el delete mode 100644 elpa/org-9.3.6/ol-w3m.elc delete mode 100644 elpa/org-9.3.6/ol.el delete mode 100644 elpa/org-9.3.6/ol.elc delete mode 100644 elpa/org-9.3.6/org delete mode 100644 elpa/org-9.3.6/org-agenda.el delete mode 100644 elpa/org-9.3.6/org-agenda.elc delete mode 100644 elpa/org-9.3.6/org-archive.el delete mode 100644 elpa/org-9.3.6/org-archive.elc delete mode 100644 elpa/org-9.3.6/org-attach-git.el delete mode 100644 elpa/org-9.3.6/org-attach-git.elc delete mode 100644 elpa/org-9.3.6/org-attach.el delete mode 100644 elpa/org-9.3.6/org-attach.elc delete mode 100644 elpa/org-9.3.6/org-autoloads.el delete mode 100644 elpa/org-9.3.6/org-capture.el delete mode 100644 elpa/org-9.3.6/org-capture.elc delete mode 100644 elpa/org-9.3.6/org-clock.el delete mode 100644 elpa/org-9.3.6/org-clock.elc delete mode 100644 elpa/org-9.3.6/org-colview.el delete mode 100644 elpa/org-9.3.6/org-colview.elc delete mode 100644 elpa/org-9.3.6/org-compat.el delete mode 100644 elpa/org-9.3.6/org-compat.elc delete mode 100644 elpa/org-9.3.6/org-crypt.el delete mode 100644 elpa/org-9.3.6/org-crypt.elc delete mode 100644 elpa/org-9.3.6/org-ctags.el delete mode 100644 elpa/org-9.3.6/org-ctags.elc delete mode 100644 elpa/org-9.3.6/org-datetree.el delete mode 100644 elpa/org-9.3.6/org-datetree.elc delete mode 100644 elpa/org-9.3.6/org-duration.el delete mode 100644 elpa/org-9.3.6/org-duration.elc delete mode 100644 elpa/org-9.3.6/org-element.el delete mode 100644 elpa/org-9.3.6/org-element.elc delete mode 100644 elpa/org-9.3.6/org-entities.el delete mode 100644 elpa/org-9.3.6/org-entities.elc delete mode 100644 elpa/org-9.3.6/org-faces.el delete mode 100644 elpa/org-9.3.6/org-faces.elc delete mode 100644 elpa/org-9.3.6/org-feed.el delete mode 100644 elpa/org-9.3.6/org-feed.elc delete mode 100644 elpa/org-9.3.6/org-footnote.el delete mode 100644 elpa/org-9.3.6/org-footnote.elc delete mode 100644 elpa/org-9.3.6/org-goto.el delete mode 100644 elpa/org-9.3.6/org-goto.elc delete mode 100644 elpa/org-9.3.6/org-habit.el delete mode 100644 elpa/org-9.3.6/org-habit.elc delete mode 100644 elpa/org-9.3.6/org-id.el delete mode 100644 elpa/org-9.3.6/org-id.elc delete mode 100644 elpa/org-9.3.6/org-indent.el delete mode 100644 elpa/org-9.3.6/org-indent.elc delete mode 100644 elpa/org-9.3.6/org-inlinetask.el delete mode 100644 elpa/org-9.3.6/org-inlinetask.elc delete mode 100644 elpa/org-9.3.6/org-install.el delete mode 100644 elpa/org-9.3.6/org-keys.el delete mode 100644 elpa/org-9.3.6/org-keys.elc delete mode 100644 elpa/org-9.3.6/org-lint.el delete mode 100644 elpa/org-9.3.6/org-lint.elc delete mode 100644 elpa/org-9.3.6/org-list.el delete mode 100644 elpa/org-9.3.6/org-list.elc delete mode 100644 elpa/org-9.3.6/org-loaddefs.el delete mode 100644 elpa/org-9.3.6/org-macro.el delete mode 100644 elpa/org-9.3.6/org-macro.elc delete mode 100644 elpa/org-9.3.6/org-macs.el delete mode 100644 elpa/org-9.3.6/org-macs.elc delete mode 100644 elpa/org-9.3.6/org-mobile.el delete mode 100644 elpa/org-9.3.6/org-mobile.elc delete mode 100644 elpa/org-9.3.6/org-mouse.el delete mode 100644 elpa/org-9.3.6/org-mouse.elc delete mode 100644 elpa/org-9.3.6/org-num.el delete mode 100644 elpa/org-9.3.6/org-num.elc delete mode 100644 elpa/org-9.3.6/org-pcomplete.el delete mode 100644 elpa/org-9.3.6/org-pcomplete.elc delete mode 100644 elpa/org-9.3.6/org-pkg.el delete mode 100644 elpa/org-9.3.6/org-plot.el delete mode 100644 elpa/org-9.3.6/org-plot.elc delete mode 100644 elpa/org-9.3.6/org-protocol.el delete mode 100644 elpa/org-9.3.6/org-protocol.elc delete mode 100644 elpa/org-9.3.6/org-src.el delete mode 100644 elpa/org-9.3.6/org-src.elc delete mode 100644 elpa/org-9.3.6/org-table.el delete mode 100644 elpa/org-9.3.6/org-table.elc delete mode 100644 elpa/org-9.3.6/org-tempo.el delete mode 100644 elpa/org-9.3.6/org-tempo.elc delete mode 100644 elpa/org-9.3.6/org-timer.el delete mode 100644 elpa/org-9.3.6/org-timer.elc delete mode 100644 elpa/org-9.3.6/org-version.el delete mode 100644 elpa/org-9.3.6/org.el delete mode 100644 elpa/org-9.3.6/org.elc delete mode 100644 elpa/org-9.3.6/orgcard.pdf delete mode 100644 elpa/org-9.3.6/ox-ascii.el delete mode 100644 elpa/org-9.3.6/ox-ascii.elc delete mode 100644 elpa/org-9.3.6/ox-beamer.el delete mode 100644 elpa/org-9.3.6/ox-beamer.elc delete mode 100644 elpa/org-9.3.6/ox-html.el delete mode 100644 elpa/org-9.3.6/ox-html.elc delete mode 100644 elpa/org-9.3.6/ox-icalendar.el delete mode 100644 elpa/org-9.3.6/ox-icalendar.elc delete mode 100644 elpa/org-9.3.6/ox-latex.el delete mode 100644 elpa/org-9.3.6/ox-latex.elc delete mode 100644 elpa/org-9.3.6/ox-man.el delete mode 100644 elpa/org-9.3.6/ox-man.elc delete mode 100644 elpa/org-9.3.6/ox-md.el delete mode 100644 elpa/org-9.3.6/ox-md.elc delete mode 100644 elpa/org-9.3.6/ox-odt.el delete mode 100644 elpa/org-9.3.6/ox-odt.elc delete mode 100644 elpa/org-9.3.6/ox-org.el delete mode 100644 elpa/org-9.3.6/ox-org.elc delete mode 100644 elpa/org-9.3.6/ox-publish.el delete mode 100644 elpa/org-9.3.6/ox-publish.elc delete mode 100644 elpa/org-9.3.6/ox-texinfo.el delete mode 100644 elpa/org-9.3.6/ox-texinfo.elc delete mode 100644 elpa/org-9.3.6/ox.el delete mode 100644 elpa/org-9.3.6/ox.elc delete mode 100644 elpa/org-pomodoro-20190530.1445/org-pomodoro-autoloads.el delete mode 100644 elpa/org-pomodoro-20190530.1445/org-pomodoro-pidgin.el delete mode 100644 elpa/org-pomodoro-20190530.1445/org-pomodoro-pidgin.elc delete mode 100644 elpa/org-pomodoro-20190530.1445/org-pomodoro-pkg.el delete mode 100644 elpa/org-pomodoro-20190530.1445/org-pomodoro.el delete mode 100644 elpa/org-pomodoro-20190530.1445/org-pomodoro.elc delete mode 100644 elpa/org-pomodoro-20190530.1445/resources/bell.wav delete mode 100644 elpa/org-pomodoro-20190530.1445/resources/bell_multiple.wav delete mode 100644 elpa/org-pomodoro-20190530.1445/resources/tick.wav delete mode 100644 elpa/ox-nikola-20151114.1116/ox-nikola-autoloads.el delete mode 100644 elpa/ox-nikola-20151114.1116/ox-nikola-pkg.el delete mode 100644 elpa/ox-nikola-20151114.1116/ox-nikola.el delete mode 100644 elpa/ox-nikola-20151114.1116/ox-nikola.elc delete mode 100644 elpa/ox-rst-20191013.551/ox-rst-autoloads.el delete mode 100644 elpa/ox-rst-20191013.551/ox-rst-pkg.el delete mode 100644 elpa/ox-rst-20191013.551/ox-rst.el delete mode 100644 elpa/ox-rst-20191013.551/ox-rst.elc delete mode 100644 elpa/package-lint-20200419.406/data/stdlib-changes delete mode 100644 elpa/package-lint-20200419.406/package-lint-autoloads.el delete mode 100644 elpa/package-lint-20200419.406/package-lint-pkg.el delete mode 100644 elpa/package-lint-20200419.406/package-lint.el delete mode 100644 elpa/package-lint-20200419.406/package-lint.elc delete mode 100644 elpa/page-break-lines-20200305.244/page-break-lines-autoloads.el delete mode 100644 elpa/page-break-lines-20200305.244/page-break-lines-pkg.el delete mode 100644 elpa/page-break-lines-20200305.244/page-break-lines.el delete mode 100644 elpa/page-break-lines-20200305.244/page-break-lines.elc delete mode 100644 elpa/pickle-20190923.354/pickle-autoloads.el delete mode 100644 elpa/pickle-20190923.354/pickle-pkg.el delete mode 100644 elpa/pickle-20190923.354/pickle.el delete mode 100644 elpa/pickle-20190923.354/pickle.elc delete mode 100644 elpa/pkg-info-20150517.1143/pkg-info-autoloads.el delete mode 100644 elpa/pkg-info-20150517.1143/pkg-info-pkg.el delete mode 100644 elpa/pkg-info-20150517.1143/pkg-info.el delete mode 100644 elpa/pkg-info-20150517.1143/pkg-info.elc delete mode 100644 elpa/plantuml-mode-20191102.2056/plantuml-mode-autoloads.el delete mode 100644 elpa/plantuml-mode-20191102.2056/plantuml-mode-pkg.el delete mode 100644 elpa/plantuml-mode-20191102.2056/plantuml-mode.el delete mode 100644 elpa/plantuml-mode-20191102.2056/plantuml-mode.elc delete mode 100644 elpa/poet-theme-20191215.201/poet-dark-monochrome-theme.el delete mode 100644 elpa/poet-theme-20191215.201/poet-dark-monochrome-theme.elc delete mode 100644 elpa/poet-theme-20191215.201/poet-dark-theme.el delete mode 100644 elpa/poet-theme-20191215.201/poet-dark-theme.elc delete mode 100644 elpa/poet-theme-20191215.201/poet-monochrome-theme.el delete mode 100644 elpa/poet-theme-20191215.201/poet-monochrome-theme.elc delete mode 100644 elpa/poet-theme-20191215.201/poet-theme-autoloads.el delete mode 100644 elpa/poet-theme-20191215.201/poet-theme-pkg.el delete mode 100644 elpa/poet-theme-20191215.201/poet-theme.el delete mode 100644 elpa/poet-theme-20191215.201/poet-theme.elc delete mode 100644 elpa/polymode-20200411.915/poly-lock.el delete mode 100644 elpa/polymode-20200411.915/poly-lock.elc delete mode 100644 elpa/polymode-20200411.915/polymode-autoloads.el delete mode 100644 elpa/polymode-20200411.915/polymode-base.el delete mode 100644 elpa/polymode-20200411.915/polymode-base.elc delete mode 100644 elpa/polymode-20200411.915/polymode-classes.el delete mode 100644 elpa/polymode-20200411.915/polymode-classes.elc delete mode 100644 elpa/polymode-20200411.915/polymode-compat.el delete mode 100644 elpa/polymode-20200411.915/polymode-compat.elc delete mode 100644 elpa/polymode-20200411.915/polymode-core.el delete mode 100644 elpa/polymode-20200411.915/polymode-core.elc delete mode 100644 elpa/polymode-20200411.915/polymode-debug.el delete mode 100644 elpa/polymode-20200411.915/polymode-debug.elc delete mode 100644 elpa/polymode-20200411.915/polymode-export.el delete mode 100644 elpa/polymode-20200411.915/polymode-export.elc delete mode 100644 elpa/polymode-20200411.915/polymode-methods.el delete mode 100644 elpa/polymode-20200411.915/polymode-methods.elc delete mode 100644 elpa/polymode-20200411.915/polymode-pkg.el delete mode 100644 elpa/polymode-20200411.915/polymode-tangle.el delete mode 100644 elpa/polymode-20200411.915/polymode-tangle.elc delete mode 100644 elpa/polymode-20200411.915/polymode-test-utils.el delete mode 100644 elpa/polymode-20200411.915/polymode-test-utils.elc delete mode 100644 elpa/polymode-20200411.915/polymode-weave.el delete mode 100644 elpa/polymode-20200411.915/polymode-weave.elc delete mode 100644 elpa/polymode-20200411.915/polymode.el delete mode 100644 elpa/polymode-20200411.915/polymode.elc delete mode 100644 elpa/pos-tip-20191227.1356/pos-tip-autoloads.el delete mode 100644 elpa/pos-tip-20191227.1356/pos-tip-pkg.el delete mode 100644 elpa/pos-tip-20191227.1356/pos-tip.el delete mode 100644 elpa/pos-tip-20191227.1356/pos-tip.elc delete mode 100644 elpa/powershell-20190421.2038/powershell-autoloads.el delete mode 100644 elpa/powershell-20190421.2038/powershell-pkg.el delete mode 100644 elpa/powershell-20190421.2038/powershell.el delete mode 100644 elpa/powershell-20190421.2038/powershell.elc delete mode 100644 elpa/projectile-20200329.1908/projectile-autoloads.el delete mode 100644 elpa/projectile-20200329.1908/projectile-pkg.el delete mode 100644 elpa/projectile-20200329.1908/projectile.el delete mode 100644 elpa/projectile-20200329.1908/projectile.elc delete mode 100644 elpa/python-django-20150822.404/python-django-autoloads.el delete mode 100644 elpa/python-django-20150822.404/python-django-pkg.el delete mode 100644 elpa/python-django-20150822.404/python-django.el delete mode 100644 elpa/python-django-20150822.404/python-django.elc delete mode 100644 elpa/python-docstring-20190716.921/docstring_wrap.py delete mode 100644 elpa/python-docstring-20190716.921/python-docstring-autoloads.el delete mode 100644 elpa/python-docstring-20190716.921/python-docstring-pkg.el delete mode 100644 elpa/python-docstring-20190716.921/python-docstring.el delete mode 100644 elpa/python-docstring-20190716.921/python-docstring.elc delete mode 100644 elpa/pyvenv-20191202.1039/pyvenv-autoloads.el delete mode 100644 elpa/pyvenv-20191202.1039/pyvenv-pkg.el delete mode 100644 elpa/pyvenv-20191202.1039/pyvenv.el delete mode 100644 elpa/pyvenv-20191202.1039/pyvenv.elc delete mode 100644 elpa/racket-mode-20200417.1741/dir delete mode 100644 elpa/racket-mode-20200417.1741/racket-bug-report.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-bug-report.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-cmd.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-cmd.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-collection.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-collection.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-common.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-common.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-complete.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-complete.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-custom.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-custom.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-debug.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-debug.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-describe.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-describe.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-edit.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-edit.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-eldoc.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-eldoc.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-font-lock.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-font-lock.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-imenu.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-imenu.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-indent.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-indent.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-keywords-and-builtins.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-keywords-and-builtins.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-logger.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-logger.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-mode-autoloads.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-mode-pkg.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-mode.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-mode.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-mode.info delete mode 100644 elpa/racket-mode-20200417.1741/racket-parens.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-parens.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-ppss.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-ppss.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-profile.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-profile.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-repl-buffer-name.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-repl-buffer-name.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-repl.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-repl.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-show.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-show.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-smart-open.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-smart-open.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-stepper.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-stepper.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-unicode-input-method.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-unicode-input-method.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-util.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-util.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-visit.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-visit.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-wsl.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-wsl.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-xp-complete.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-xp-complete.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket-xp.el delete mode 100644 elpa/racket-mode-20200417.1741/racket-xp.elc delete mode 100644 elpa/racket-mode-20200417.1741/racket/command-server.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/commands/check-syntax.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/commands/coverage.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/commands/describe.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/commands/find-module.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/commands/help.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/commands/macro.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/commands/module-names.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/commands/profile.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/commands/requires.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/debug-annotator.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/debug.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/elisp.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/error.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/example/example.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/example/example.rkt.faceup delete mode 100644 elpa/racket-mode-20200417.1741/racket/example/indent.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/example/indent.rkt.faceup delete mode 100644 elpa/racket-mode-20200417.1741/racket/find-module-path-completions.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/find.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/fresh-line.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/gui.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/identifier.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/image.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/imports.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/instrument.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/interactions.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/keywords.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/logger.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/main.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/mod.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/print.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/repl-session.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/repl.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/scribble.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/syntax.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/test/find-examples.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/test/find.rkt delete mode 100644 elpa/racket-mode-20200417.1741/racket/util.rkt delete mode 100644 elpa/reformatter-20200327.2358/reformatter-autoloads.el delete mode 100644 elpa/reformatter-20200327.2358/reformatter-pkg.el delete mode 100644 elpa/reformatter-20200327.2358/reformatter.el delete mode 100644 elpa/reformatter-20200327.2358/reformatter.elc delete mode 100644 elpa/request-20200219.2257/request-autoloads.el delete mode 100644 elpa/request-20200219.2257/request-pkg.el delete mode 100644 elpa/request-20200219.2257/request.el delete mode 100644 elpa/request-20200219.2257/request.elc delete mode 100644 elpa/restclient-20191009.1208/restclient-autoloads.el delete mode 100644 elpa/restclient-20191009.1208/restclient-pkg.el delete mode 100644 elpa/restclient-20191009.1208/restclient.el delete mode 100644 elpa/restclient-20191009.1208/restclient.elc delete mode 100644 elpa/restclient-test-20180106.2046/restclient-test-autoloads.el delete mode 100644 elpa/restclient-test-20180106.2046/restclient-test-pkg.el delete mode 100644 elpa/restclient-test-20180106.2046/restclient-test.el delete mode 100644 elpa/restclient-test-20180106.2046/restclient-test.elc delete mode 100644 elpa/s-20180406.808/s-autoloads.el delete mode 100644 elpa/s-20180406.808/s-pkg.el delete mode 100644 elpa/s-20180406.808/s.el delete mode 100644 elpa/s-20180406.808/s.elc delete mode 100644 elpa/scss-mode-20180123.1708/scss-mode-autoloads.el delete mode 100644 elpa/scss-mode-20180123.1708/scss-mode-pkg.el delete mode 100644 elpa/scss-mode-20180123.1708/scss-mode.el delete mode 100644 elpa/scss-mode-20180123.1708/scss-mode.elc delete mode 100644 elpa/slime-20200414.1444/contrib/README.md delete mode 100644 elpa/slime-20200414.1444/contrib/bridge.el delete mode 100644 elpa/slime-20200414.1444/contrib/bridge.elc delete mode 100644 elpa/slime-20200414.1444/contrib/inferior-slime.el delete mode 100644 elpa/slime-20200414.1444/contrib/inferior-slime.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-asdf.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-asdf.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-autodoc.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-autodoc.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-banner.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-banner.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-buffer-streams.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-buffer-streams.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-c-p-c.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-c-p-c.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-cl-indent.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-cl-indent.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-clipboard.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-clipboard.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-compiler-notes-tree.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-compiler-notes-tree.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-editing-commands.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-editing-commands.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-enclosing-context.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-enclosing-context.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fancy-inspector.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fancy-inspector.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fancy-trace.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fancy-trace.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fancy.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fancy.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fontifying-fu.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fontifying-fu.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fuzzy.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-fuzzy.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-highlight-edits.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-highlight-edits.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-hyperdoc.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-hyperdoc.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-indentation.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-indentation.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-listener-hooks.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-listener-hooks.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-macrostep.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-macrostep.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-mdot-fu.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-mdot-fu.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-media.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-media.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-mrepl.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-mrepl.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-package-fu.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-package-fu.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-parse.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-parse.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-presentation-streams.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-presentation-streams.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-presentations.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-presentations.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-quicklisp.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-quicklisp.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-references.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-references.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-repl.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-repl.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-sbcl-exts.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-sbcl-exts.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-scheme.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-scheme.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-scratch.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-scratch.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-snapshot.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-snapshot.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-sprof.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-sprof.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-trace-dialog.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-trace-dialog.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-tramp.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-tramp.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-typeout-frame.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-typeout-frame.elc delete mode 100644 elpa/slime-20200414.1444/contrib/slime-xref-browser.el delete mode 100644 elpa/slime-20200414.1444/contrib/slime-xref-browser.elc delete mode 100644 elpa/slime-20200414.1444/contrib/swank-arglists.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-asdf.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-buffer-streams.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-c-p-c.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-clipboard.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-fancy-inspector.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-fuzzy.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-goo.goo delete mode 100644 elpa/slime-20200414.1444/contrib/swank-hyperdoc.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-ikarus.ss delete mode 100644 elpa/slime-20200414.1444/contrib/swank-indentation.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-jolt.k delete mode 100644 elpa/slime-20200414.1444/contrib/swank-kawa.scm delete mode 100644 elpa/slime-20200414.1444/contrib/swank-larceny.scm delete mode 100644 elpa/slime-20200414.1444/contrib/swank-listener-hooks.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-macrostep.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-media.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-mit-scheme.scm delete mode 100644 elpa/slime-20200414.1444/contrib/swank-mlworks.sml delete mode 100644 elpa/slime-20200414.1444/contrib/swank-mrepl.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-package-fu.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-presentation-streams.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-presentations.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-quicklisp.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-r6rs.scm delete mode 100644 elpa/slime-20200414.1444/contrib/swank-repl.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-sbcl-exts.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-snapshot.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-sprof.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-trace-dialog.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank-util.lisp delete mode 100644 elpa/slime-20200414.1444/contrib/swank.rb delete mode 100644 elpa/slime-20200414.1444/dir delete mode 100644 elpa/slime-20200414.1444/lib/hyperspec.el delete mode 100644 elpa/slime-20200414.1444/lib/hyperspec.elc delete mode 100644 elpa/slime-20200414.1444/metering.lisp delete mode 100644 elpa/slime-20200414.1444/nregex.lisp delete mode 100644 elpa/slime-20200414.1444/packages.lisp delete mode 100644 elpa/slime-20200414.1444/sbcl-pprint-patch.lisp delete mode 100644 elpa/slime-20200414.1444/slime-autoloads.el delete mode 100644 elpa/slime-20200414.1444/slime-pkg.el delete mode 100644 elpa/slime-20200414.1444/slime-tests.el delete mode 100644 elpa/slime-20200414.1444/slime-tests.elc delete mode 100644 elpa/slime-20200414.1444/slime.el delete mode 100644 elpa/slime-20200414.1444/slime.elc delete mode 100644 elpa/slime-20200414.1444/slime.info delete mode 100644 elpa/slime-20200414.1444/start-swank.lisp delete mode 100644 elpa/slime-20200414.1444/swank-loader.lisp delete mode 100644 elpa/slime-20200414.1444/swank.asd delete mode 100644 elpa/slime-20200414.1444/swank.lisp delete mode 100644 elpa/slime-20200414.1444/swank/abcl.lisp delete mode 100644 elpa/slime-20200414.1444/swank/allegro.lisp delete mode 100644 elpa/slime-20200414.1444/swank/backend.lisp delete mode 100644 elpa/slime-20200414.1444/swank/ccl.lisp delete mode 100644 elpa/slime-20200414.1444/swank/clasp.lisp delete mode 100644 elpa/slime-20200414.1444/swank/clisp.lisp delete mode 100644 elpa/slime-20200414.1444/swank/cmucl.lisp delete mode 100644 elpa/slime-20200414.1444/swank/corman.lisp delete mode 100644 elpa/slime-20200414.1444/swank/ecl.lisp delete mode 100644 elpa/slime-20200414.1444/swank/gray.lisp delete mode 100644 elpa/slime-20200414.1444/swank/lispworks.lisp delete mode 100644 elpa/slime-20200414.1444/swank/match.lisp delete mode 100644 elpa/slime-20200414.1444/swank/mezzano.lisp delete mode 100644 elpa/slime-20200414.1444/swank/mkcl.lisp delete mode 100644 elpa/slime-20200414.1444/swank/rpc.lisp delete mode 100644 elpa/slime-20200414.1444/swank/sbcl.lisp delete mode 100644 elpa/slime-20200414.1444/swank/scl.lisp delete mode 100644 elpa/slime-20200414.1444/swank/source-file-cache.lisp delete mode 100644 elpa/slime-20200414.1444/swank/source-path-parser.lisp delete mode 100644 elpa/slime-20200414.1444/xref.lisp delete mode 100644 elpa/spacemacs-theme-20200324.1107/spacemacs-common.el delete mode 100644 elpa/spacemacs-theme-20200324.1107/spacemacs-dark-theme.el delete mode 100644 elpa/spacemacs-theme-20200324.1107/spacemacs-dark-theme.elc delete mode 100644 elpa/spacemacs-theme-20200324.1107/spacemacs-light-theme.el delete mode 100644 elpa/spacemacs-theme-20200324.1107/spacemacs-light-theme.elc delete mode 100644 elpa/spacemacs-theme-20200324.1107/spacemacs-theme-autoloads.el delete mode 100644 elpa/spacemacs-theme-20200324.1107/spacemacs-theme-pkg.el delete mode 100644 elpa/sphinx-doc-20160116.1117/sphinx-doc-autoloads.el delete mode 100644 elpa/sphinx-doc-20160116.1117/sphinx-doc-pkg.el delete mode 100644 elpa/sphinx-doc-20160116.1117/sphinx-doc.el delete mode 100644 elpa/sphinx-doc-20160116.1117/sphinx-doc.elc delete mode 100644 elpa/sphinx-frontend-20161025.758/sphinx-frontend-autoloads.el delete mode 100644 elpa/sphinx-frontend-20161025.758/sphinx-frontend-pkg.el delete mode 100644 elpa/sphinx-frontend-20161025.758/sphinx-frontend.el delete mode 100644 elpa/sphinx-frontend-20161025.758/sphinx-frontend.elc delete mode 100644 elpa/sphinx-mode-20180620.915/sphinx-mode-autoloads.el delete mode 100644 elpa/sphinx-mode-20180620.915/sphinx-mode-pkg.el delete mode 100644 elpa/sphinx-mode-20180620.915/sphinx-mode.el delete mode 100644 elpa/sphinx-mode-20180620.915/sphinx-mode.elc delete mode 100644 elpa/sphinx-mode-20180620.915/sphinx-src.el delete mode 100644 elpa/sphinx-mode-20180620.915/sphinx-src.elc delete mode 100644 elpa/transient-20200226.1612/dir delete mode 100644 elpa/transient-20200226.1612/transient-autoloads.el delete mode 100644 elpa/transient-20200226.1612/transient-pkg.el delete mode 100644 elpa/transient-20200226.1612/transient.el delete mode 100644 elpa/transient-20200226.1612/transient.elc delete mode 100644 elpa/transient-20200226.1612/transient.info delete mode 100644 elpa/typescript-mode-20200303.1301/typescript-mode-autoloads.el delete mode 100644 elpa/typescript-mode-20200303.1301/typescript-mode-pkg.el delete mode 100644 elpa/typescript-mode-20200303.1301/typescript-mode-test-utilities.el delete mode 100644 elpa/typescript-mode-20200303.1301/typescript-mode-test-utilities.elc delete mode 100644 elpa/typescript-mode-20200303.1301/typescript-mode.el delete mode 100644 elpa/typescript-mode-20200303.1301/typescript-mode.elc delete mode 100644 elpa/typescript-mode-20200312.2235/typescript-mode-autoloads.el delete mode 100644 elpa/typescript-mode-20200312.2235/typescript-mode-pkg.el delete mode 100644 elpa/typescript-mode-20200312.2235/typescript-mode-test-utilities.el delete mode 100644 elpa/typescript-mode-20200312.2235/typescript-mode-test-utilities.elc delete mode 100644 elpa/typescript-mode-20200312.2235/typescript-mode.el delete mode 100644 elpa/typescript-mode-20200312.2235/typescript-mode.elc delete mode 100644 elpa/web-beautify-readme.txt delete mode 100644 elpa/web-mode-20200418.2218/web-mode-autoloads.el delete mode 100644 elpa/web-mode-20200418.2218/web-mode-pkg.el delete mode 100644 elpa/web-mode-20200418.2218/web-mode.el delete mode 100644 elpa/web-mode-20200418.2218/web-mode.elc delete mode 100644 elpa/websocket-20200102.637/websocket-autoloads.el delete mode 100644 elpa/websocket-20200102.637/websocket-pkg.el delete mode 100644 elpa/websocket-20200102.637/websocket.el delete mode 100644 elpa/websocket-20200102.637/websocket.elc delete mode 100644 elpa/websocket-20200321.102/websocket-autoloads.el delete mode 100644 elpa/websocket-20200321.102/websocket-pkg.el delete mode 100644 elpa/websocket-20200321.102/websocket.el delete mode 100644 elpa/websocket-20200321.102/websocket.elc delete mode 100644 elpa/with-editor-20200217.1015/dir delete mode 100644 elpa/with-editor-20200217.1015/with-editor-autoloads.el delete mode 100644 elpa/with-editor-20200217.1015/with-editor-pkg.el delete mode 100644 elpa/with-editor-20200217.1015/with-editor.el delete mode 100644 elpa/with-editor-20200217.1015/with-editor.elc delete mode 100644 elpa/with-editor-20200217.1015/with-editor.info delete mode 100644 elpa/yaml-mode-20191127.2314/yaml-mode-autoloads.el delete mode 100644 elpa/yaml-mode-20191127.2314/yaml-mode-pkg.el delete mode 100644 elpa/yaml-mode-20191127.2314/yaml-mode.el delete mode 100644 elpa/yaml-mode-20191127.2314/yaml-mode.elc delete mode 100644 elpa/yasnippet-20200413.2221/yasnippet-autoloads.el delete mode 100644 elpa/yasnippet-20200413.2221/yasnippet-pkg.el delete mode 100644 elpa/yasnippet-20200413.2221/yasnippet.el delete mode 100644 elpa/yasnippet-20200413.2221/yasnippet.elc diff --git a/elpa/ace-window-20200311.1025/ace-window-autoloads.el b/elpa/ace-window-20200311.1025/ace-window-autoloads.el deleted file mode 100644 index e720b3a2..00000000 --- a/elpa/ace-window-20200311.1025/ace-window-autoloads.el +++ /dev/null @@ -1,81 +0,0 @@ -;;; ace-window-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "ace-window" "ace-window.el" (0 0 0 0)) -;;; Generated autoloads from ace-window.el - -(autoload 'ace-select-window "ace-window" "\ -Ace select window. - -\(fn)" t nil) - -(autoload 'ace-delete-window "ace-window" "\ -Ace delete window. - -\(fn)" t nil) - -(autoload 'ace-swap-window "ace-window" "\ -Ace swap window. - -\(fn)" t nil) - -(autoload 'ace-delete-other-windows "ace-window" "\ -Ace delete other windows. - -\(fn)" t nil) - -(autoload 'ace-display-buffer "ace-window" "\ -Make `display-buffer' and `pop-to-buffer' select using `ace-window'. -See sample config for `display-buffer-base-action' and `display-buffer-alist': -https://github.com/abo-abo/ace-window/wiki/display-buffer. - -\(fn BUFFER ALIST)" nil nil) - -(autoload 'ace-window "ace-window" "\ -Select a window. -Perform an action based on ARG described below. - -By default, behaves like extended `other-window'. -See `aw-scope' which extends it to work with frames. - -Prefixed with one \\[universal-argument], does a swap between the -selected window and the current window, so that the selected -buffer moves to current window (and current buffer moves to -selected window). - -Prefixed with two \\[universal-argument]'s, deletes the selected -window. - -\(fn ARG)" t nil) - -(defvar ace-window-display-mode nil "\ -Non-nil if Ace-Window-Display mode is enabled. -See the `ace-window-display-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 `ace-window-display-mode'.") - -(custom-autoload 'ace-window-display-mode "ace-window" nil) - -(autoload 'ace-window-display-mode "ace-window" "\ -Minor mode for showing the ace window key in the mode line. - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ace-window" '("ace-window-mode" "aw-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; ace-window-autoloads.el ends here diff --git a/elpa/ace-window-20200311.1025/ace-window-pkg.el b/elpa/ace-window-20200311.1025/ace-window-pkg.el deleted file mode 100644 index 9462228e..00000000 --- a/elpa/ace-window-20200311.1025/ace-window-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "ace-window" "20200311.1025" "Quickly switch windows." '((avy "0.5.0")) :commit "7003c88cd9cad58dc35c7cd13ebc61c355fb5be7" :keywords '("window" "location") :authors '(("Oleh Krehel" . "ohwoeowho@gmail.com")) :maintainer '("Oleh Krehel" . "ohwoeowho@gmail.com") :url "https://github.com/abo-abo/ace-window") diff --git a/elpa/ace-window-20200311.1025/ace-window.el b/elpa/ace-window-20200311.1025/ace-window.el deleted file mode 100644 index 53593a05..00000000 --- a/elpa/ace-window-20200311.1025/ace-window.el +++ /dev/null @@ -1,953 +0,0 @@ -;;; ace-window.el --- Quickly switch windows. -*- lexical-binding: t -*- - -;; Copyright (C) 2015-2020 Free Software Foundation, Inc. - -;; Author: Oleh Krehel -;; Maintainer: Oleh Krehel -;; URL: https://github.com/abo-abo/ace-window -;; Package-Version: 20200311.1025 -;; Version: 0.10.0 -;; Package-Requires: ((avy "0.5.0")) -;; Keywords: window, location - -;; This file is part of GNU Emacs. - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; For a full copy of the GNU General Public License -;; see . - -;;; Commentary: -;; -;; The main function, `ace-window' is meant to replace `other-window' -;; by assigning each window a short, unique label. When there are only -;; two windows present, `other-window' is called (unless -;; aw-dispatch-always is set non-nil). If there are more, each -;; window will have its first label character highlighted. Once a -;; unique label is typed, ace-window will switch to that window. -;; -;; To setup this package, just add to your .emacs: -;; -;; (global-set-key (kbd "M-o") 'ace-window) -;; -;; replacing "M-o" with an appropriate shortcut. -;; -;; By default, ace-window uses numbers for window labels so the window -;; labeling is intuitively ordered. But if you prefer to type keys on -;; your home row for quicker access, use this setting: -;; -;; (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l)) -;; -;; Whenever ace-window prompts for a window selection, it grays out -;; all the window characters, highlighting window labels in red. To -;; disable this behavior, set this: -;; -;; (setq aw-background nil) -;; -;; If you want to know the selection characters ahead of time, turn on -;; `ace-window-display-mode'. -;; -;; When prefixed with one `universal-argument', instead of switching -;; to the selected window, the selected window is swapped with the -;; current one. -;; -;; When prefixed with two `universal-argument', the selected window is -;; deleted instead. - -;;; Code: -(require 'avy) -(require 'ring) -(require 'subr-x) - -;;* Customization -(defgroup ace-window nil - "Quickly switch current window." - :group 'convenience - :prefix "aw-") - -(defcustom aw-keys '(?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9) - "Keys for selecting window." - :type '(repeat character)) - -(defcustom aw-scope 'global - "The scope used by `ace-window'." - :type '(choice - (const :tag "visible frames" visible) - (const :tag "global" global) - (const :tag "frame" frame))) - -(defcustom aw-translate-char-function #'identity - "Function to translate user input key into another key. -For example, to make SPC do the same as ?a, use -\(lambda (c) (if (= c 32) ?a c))." - :type '(choice - (const :tag "Off" #'identity) - (const :tag "Ignore Case" #'downcase) - (function :tag "Custom"))) - -(defcustom aw-minibuffer-flag nil - "When non-nil, also display `ace-window-mode' string in the minibuffer when ace-window is active." - :type 'boolean) - -(defcustom aw-ignored-buffers '("*Calc Trail*" " *LV*") - "List of buffers and major-modes to ignore when choosing a window from the window list. -Active only when `aw-ignore-on' is non-nil." - :type '(repeat string)) - -(defcustom aw-ignore-on t - "When t, `ace-window' will ignore buffers and major-modes in `aw-ignored-buffers'. -Use M-0 `ace-window' to toggle this value." - :type 'boolean) - -(defcustom aw-ignore-current nil - "When t, `ace-window' will ignore `selected-window'." - :type 'boolean) - -(defcustom aw-background t - "When t, `ace-window' will dim out all buffers temporarily when used." - :type 'boolean) - -(defcustom aw-leading-char-style 'char - "Style of the leading char overlay." - :type '(choice - (const :tag "single char" 'char) - (const :tag "full path" 'path))) - -(defcustom aw-dispatch-always nil - "When non-nil, `ace-window' will issue a `read-char' even for one window. -This will make `ace-window' act different from `other-window' for - one or two windows." - :type 'boolean) - -(defcustom aw-dispatch-when-more-than 2 - "If the number of windows is more than this, activate ace-window-ness." - :type 'integer) - -(defcustom aw-reverse-frame-list nil - "When non-nil `ace-window' will order frames for selection in -the reverse of `frame-list'" - :type 'boolean) - -(defcustom aw-frame-offset '(13 . 23) - "Increase in pixel offset for new ace-window frames relative to the selected frame. -Its value is an (x-offset . y-offset) pair in pixels." - :type '(cons integer integer)) - -(defcustom aw-frame-size nil - "Frame size to make new ace-window frames. -Its value is a (width . height) pair in pixels or nil for the default frame size. -(0 . 0) is special and means make the frame size the same as the last selected frame size." - :type '(cons integer integer)) - -(defcustom aw-char-position 'top-left - "Window positions of the character overlay. -Consider changing this if the overlay tends to overlap with other things." - :type '(choice - (const :tag "top left corner only" 'top-left) - (const :tag "both left corners" 'left))) - -;; Must be defined before `aw-make-frame-char' since its :set function references this. -(defvar aw-dispatch-alist - '((?x aw-delete-window "Delete Window") - (?m aw-swap-window "Swap Windows") - (?M aw-move-window "Move Window") - (?c aw-copy-window "Copy Window") - (?j aw-switch-buffer-in-window "Select Buffer") - (?n aw-flip-window) - (?u aw-switch-buffer-other-window "Switch Buffer Other Window") - (?e aw-execute-command-other-window "Execute Command Other Window") - (?F aw-split-window-fair "Split Fair Window") - (?v aw-split-window-vert "Split Vert Window") - (?b aw-split-window-horz "Split Horz Window") - (?o delete-other-windows "Delete Other Windows") - (?T aw-transpose-frame "Transpose Frame") - ;; ?i ?r ?t are used by hyperbole.el - (?? aw-show-dispatch-help)) - "List of actions for `aw-dispatch-default'. -Each action is a list of either: - (char function description) where function takes a single window argument -or - (char function) where function takes no argument and the description is omitted.") - -(defun aw-set-make-frame-char (option value) - ;; Signal an error if `aw-make-frame-char' is ever set to an invalid - ;; or conflicting value. - (when value - (cond ((not (characterp value)) - (user-error "`aw-make-frame-char' must be a character, not `%s'" value)) - ((memq value aw-keys) - (user-error "`aw-make-frame-char' is `%c'; this conflicts with the same character in `aw-keys'" value)) - ((assq value aw-dispatch-alist) - (user-error "`aw-make-frame-char' is `%c'; this conflicts with the same character in `aw-dispatch-alist'" value)))) - (set option value)) - -(defcustom aw-make-frame-char ?z - "Non-existing ace window label character that triggers creation of a new single-window frame for display." - :set 'aw-set-make-frame-char - :type 'character) - -(defface aw-leading-char-face - '((((class color)) (:foreground "red")) - (((background dark)) (:foreground "gray100")) - (((background light)) (:foreground "gray0")) - (t (:foreground "gray100" :underline nil))) - "Face for each window's leading char.") - -(defface aw-minibuffer-leading-char-face - '((t :inherit aw-leading-char-face)) - "Face for minibuffer leading char.") - -(defface aw-background-face - '((t (:foreground "gray40"))) - "Face for whole window background during selection.") - -(defface aw-mode-line-face - '((t (:inherit mode-line-buffer-id))) - "Face used for displaying the ace window key in the mode-line.") - -(defface aw-key-face - '((t :inherit font-lock-builtin-face)) - "Face used by `aw-show-dispatch-help'.") - -;;* Implementation -(defun aw-ignored-p (window) - "Return t if WINDOW should be ignored when choosing from the window list." - (or (and aw-ignore-on - ;; Ignore major-modes and buffer-names in `aw-ignored-buffers'. - (or (memq (buffer-local-value 'major-mode (window-buffer window)) - aw-ignored-buffers) - (member (buffer-name (window-buffer window)) aw-ignored-buffers))) - ;; ignore child frames - (and (fboundp 'frame-parent) (frame-parent (window-frame window))) - ;; Ignore selected window if `aw-ignore-current' is non-nil. - (and aw-ignore-current - (equal window (selected-window))) - ;; When `ignore-window-parameters' is nil, ignore windows whose - ;; `no-other-window’ or `no-delete-other-windows' parameter is non-nil. - (unless ignore-window-parameters - (cl-case this-command - (ace-select-window (window-parameter window 'no-other-window)) - (ace-delete-window (window-parameter window 'no-delete-other-windows)) - (ace-delete-other-windows (window-parameter - window 'no-delete-other-windows)))))) - -(defun aw-window-list () - "Return the list of interesting windows." - (sort - (cl-remove-if - (lambda (w) - (let ((f (window-frame w))) - (or (not (and (frame-live-p f) - (frame-visible-p f))) - (string= "initial_terminal" (terminal-name f)) - (aw-ignored-p w)))) - (cl-case aw-scope - (visible - (cl-mapcan #'window-list (visible-frame-list))) - (global - (cl-mapcan #'window-list (frame-list))) - (frame - (window-list)) - (t - (error "Invalid `aw-scope': %S" aw-scope)))) - 'aw-window<)) - -(defvar aw-overlays-back nil - "Hold overlays for when `aw-background' is t.") - -(defvar ace-window-mode nil - "Minor mode during the selection process.") - -;; register minor mode -(or (assq 'ace-window-mode minor-mode-alist) - (nconc minor-mode-alist - (list '(ace-window-mode ace-window-mode)))) - -(defvar aw-empty-buffers-list nil - "Store the read-only empty buffers which had to be modified. -Modify them back eventually.") - -(defvar aw--windows-hscroll nil - "List of (window . hscroll-columns) items, each listing a window whose - horizontal scroll will be restored upon ace-window action completion.") - -(defvar aw--windows-points nil - "List of (window . point) items. The point position had to be - moved in order to display the overlay.") - -(defun aw--done () - "Clean up mode line and overlays." - ;; mode line - (aw-set-mode-line nil) - ;; background - (mapc #'delete-overlay aw-overlays-back) - (setq aw-overlays-back nil) - (avy--remove-leading-chars) - (dolist (b aw-empty-buffers-list) - (with-current-buffer b - (when (string= (buffer-string) " ") - (let ((inhibit-read-only t)) - (delete-region (point-min) (point-max)))))) - (setq aw-empty-buffers-list nil) - (aw--restore-windows-hscroll) - (let (c) - (while (setq c (pop aw--windows-points)) - (with-selected-window (car c) - (goto-char (cdr c)))))) - -(defun aw--restore-windows-hscroll () - "Restore horizontal scroll of windows from `aw--windows-hscroll' list." - (let (wnd hscroll) - (mapc (lambda (wnd-and-hscroll) - (setq wnd (car wnd-and-hscroll) - hscroll (cdr wnd-and-hscroll)) - (when (window-live-p wnd) - (set-window-hscroll wnd hscroll))) - aw--windows-hscroll)) - (setq aw--windows-hscroll nil)) - -(defun aw--overlay-str (wnd pos path) - "Return the replacement text for an overlay in WND at POS, -accessible by typing PATH." - (let ((old-str (or - (ignore-errors - (with-selected-window wnd - (buffer-substring pos (1+ pos)))) - ""))) - (concat - (cl-case aw-leading-char-style - (char - (string (avy--key-to-char (car (last path))))) - (path - (mapconcat - (lambda (x) (string (avy--key-to-char x))) - (reverse path) - "")) - (t - (error "Bad `aw-leading-char-style': %S" - aw-leading-char-style))) - (cond ((string-equal old-str "\t") - (make-string (1- tab-width) ?\ )) - ((string-equal old-str "\n") - "\n") - (t - (make-string - (max 0 (1- (string-width old-str))) - ?\ )))))) - -(defun aw--point-visible-p () - "Return non-nil if point is visible in the selected window. -Return nil when horizontal scrolling has moved it off screen." - (and (>= (- (current-column) (window-hscroll)) 0) - (< (- (current-column) (window-hscroll)) - (window-width)))) - -(defun aw--lead-overlay (path leaf) - "Create an overlay using PATH at LEAF. -LEAF is (PT . WND)." - ;; Properly adds overlay in visible region of most windows except for any one - ;; receiving output while this function is executing, since that moves point, - ;; potentially shifting the added overlay outside the window's visible region. - (let ((wnd (cdr leaf)) - ;; Prevent temporary movement of point from scrolling any window. - (scroll-margin 0)) - (with-selected-window wnd - (when (= 0 (buffer-size)) - (push (current-buffer) aw-empty-buffers-list) - (let ((inhibit-read-only t)) - (insert " "))) - ;; If point is not visible due to horizontal scrolling of the - ;; window, this next expression temporarily scrolls the window - ;; right until point is visible, so that the leading-char can be - ;; seen when it is inserted. When ace-window's action finishes, - ;; the horizontal scroll is restored by (aw--done). - (while (and (not (aw--point-visible-p)) - (not (zerop (window-hscroll))) - (progn (push (cons (selected-window) (window-hscroll)) aw--windows-hscroll) t) - (not (zerop (scroll-right))))) - (let* ((ws (window-start)) - (prev nil) - (vertical-pos (if (eq aw-char-position 'left) -1 0)) - (horizontal-pos (if (zerop (window-hscroll)) 0 (1+ (window-hscroll)))) - (old-pt (point)) - (pt - (progn - ;; If leading-char is to be displayed at the top-left, move - ;; to the first visible line in the window, otherwise, move - ;; to the last visible line. - (move-to-window-line vertical-pos) - (move-to-column horizontal-pos) - ;; Find a nearby point that is not at the end-of-line but - ;; is visible so have space for the overlay. - (setq prev (1- (point))) - (while (and (>= prev ws) (/= prev (point)) (eolp)) - (setq prev (point)) - (unless (bobp) - (line-move -1 t) - (move-to-column horizontal-pos))) - (recenter vertical-pos) - (point))) - (ol (make-overlay pt (1+ pt) (window-buffer wnd)))) - (if (= (aw--face-rel-height) 1) - (goto-char old-pt) - (when (/= pt old-pt) - (goto-char (+ pt 1)) - (push (cons wnd old-pt) aw--windows-points))) - (overlay-put ol 'display (aw--overlay-str wnd pt path)) - (if (window-minibuffer-p wnd) - (overlay-put ol 'face 'aw-minibuffer-leading-char-face) - (overlay-put ol 'face 'aw-leading-char-face)) - (overlay-put ol 'window wnd) - (push ol avy--overlays-lead))))) - -(defun aw--make-backgrounds (wnd-list) - "Create a dim background overlay for each window on WND-LIST." - (when aw-background - (setq aw-overlays-back - (mapcar (lambda (w) - (let ((ol (make-overlay - (window-start w) - (window-end w) - (window-buffer w)))) - (overlay-put ol 'face 'aw-background-face) - ol)) - wnd-list)))) - -(defvar aw-dispatch-function 'aw-dispatch-default - "Function to call when a character not in `aw-keys' is pressed.") - -(defvar aw-action nil - "Function to call at the end of `aw-select'.") - -(defun aw-set-mode-line (str) - "Set mode line indicator to STR." - (setq ace-window-mode str) - (when (and aw-minibuffer-flag ace-window-mode) - (message "%s" (string-trim-left str))) - (force-mode-line-update)) - -(defun aw--dispatch-action (char) - "Return item from `aw-dispatch-alist' matching CHAR." - (assoc char aw-dispatch-alist)) - -(defun aw-make-frame () - "Make a new Emacs frame using the values of `aw-frame-size' and `aw-frame-offset'." - (make-frame - (delq nil - (list - ;; This first parameter is important because an - ;; aw-dispatch-alist command may not want to leave this - ;; frame with input focus. If it is given focus, the - ;; command may not be able to return focus to a different - ;; frame since this is done asynchronously by the window - ;; manager. - '(no-focus-on-map . t) - (when aw-frame-size - (cons 'width - (if (zerop (car aw-frame-size)) - (frame-width) - (car aw-frame-size)))) - (when aw-frame-size - (cons 'height - (if (zerop (cdr aw-frame-size)) - (frame-height) - (car aw-frame-size)))) - (cons 'left (+ (car aw-frame-offset) - (car (frame-position)))) - (cons 'top (+ (cdr aw-frame-offset) - (cdr (frame-position)))))))) - -(defun aw-use-frame (window) - "Create a new frame using the contents of WINDOW. - -The new frame is set to the same size as the previous frame, offset by -`aw-frame-offset' (x . y) pixels." - (aw-switch-to-window window) - (aw-make-frame)) - -(defun aw-clean-up-avy-current-path () - "Edit `avy-current-path' so only window label characters remain." - ;; Remove any possible ace-window command char that may - ;; precede the last specified window label, so - ;; functions can use `avy-current-path' as the chosen - ;; window label. - (when (and (> (length avy-current-path) 0) - (assq (aref avy-current-path 0) aw-dispatch-alist)) - (setq avy-current-path (substring avy-current-path 1)))) - -(defun aw-dispatch-default (char) - "Perform an action depending on CHAR." - (cond ((and (fboundp 'avy-mouse-event-window) - (avy-mouse-event-window char))) - ((= char (aref (kbd "C-g") 0)) - (throw 'done 'exit)) - ((and aw-make-frame-char (= char aw-make-frame-char)) - ;; Make a new frame and perform any action on its window. - (let ((start-win (selected-window)) - (end-win (frame-selected-window (aw-make-frame)))) - (if aw-action - ;; Action must be called from the start-win. The action - ;; determines which window to leave selected. - (progn (select-frame-set-input-focus (window-frame start-win)) - (funcall aw-action end-win)) - ;; Select end-win when no action - (aw-switch-to-window end-win))) - (throw 'done 'exit)) - (t - (let ((action (aw--dispatch-action char))) - (if action - (cl-destructuring-bind (_key fn &optional description) action - (if (and fn description) - (prog1 (setq aw-action fn) - (aw-set-mode-line (format " Ace - %s" description))) - (if (commandp fn) - (call-interactively fn) - (funcall fn)) - (throw 'done 'exit))) - (aw-clean-up-avy-current-path) - ;; Prevent any char from triggering an avy dispatch command. - (let ((avy-dispatch-alist)) - (avy-handler-default char))))))) - -(defcustom aw-display-mode-overlay t - "When nil, don't display overlays. Rely on the mode line instead." - :type 'boolean) - -(defvar ace-window-display-mode) - -(defun aw-select (mode-line &optional action) - "Return a selected other window. -Amend MODE-LINE to the mode line for the duration of the selection." - (setq aw-action action) - (let ((start-window (selected-window)) - (next-window-scope (cl-case aw-scope - ('visible 'visible) - ('global 'visible) - ('frame 'frame))) - (wnd-list (aw-window-list)) - window) - (setq window - (cond ((<= (length wnd-list) 1) - (when aw-dispatch-always - (setq aw-action - (unwind-protect - (catch 'done - (funcall aw-dispatch-function (read-char))) - (aw--done))) - (when (eq aw-action 'exit) - (setq aw-action nil))) - (or (car wnd-list) start-window)) - ((and (<= (+ (length wnd-list) (if (aw-ignored-p start-window) 1 0)) - aw-dispatch-when-more-than) - (not aw-dispatch-always) - (not aw-ignore-current)) - (let ((wnd (next-window nil nil next-window-scope))) - (while (and (or (not (memq wnd wnd-list)) - (aw-ignored-p wnd)) - (not (equal wnd start-window))) - (setq wnd (next-window wnd nil next-window-scope))) - wnd)) - (t - (let ((candidate-list - (mapcar (lambda (wnd) - (cons (aw-offset wnd) wnd)) - wnd-list))) - (aw--make-backgrounds wnd-list) - (aw-set-mode-line mode-line) - ;; turn off helm transient map - (remove-hook 'post-command-hook 'helm--maybe-update-keymap) - (unwind-protect - (let* ((avy-handler-function aw-dispatch-function) - (avy-translate-char-function aw-translate-char-function) - (transient-mark-mode nil) - (res (avy-read (avy-tree candidate-list aw-keys) - (if (and ace-window-display-mode - (null aw-display-mode-overlay)) - (lambda (_path _leaf)) - #'aw--lead-overlay) - #'avy--remove-leading-chars))) - (if (eq res 'exit) - (setq aw-action nil) - (or (cdr res) - start-window))) - (aw--done)))))) - (if aw-action - (funcall aw-action window) - window))) - -;;* Interactive -;;;###autoload -(defun ace-select-window () - "Ace select window." - (interactive) - (aw-select " Ace - Window" - #'aw-switch-to-window)) - -;;;###autoload -(defun ace-delete-window () - "Ace delete window." - (interactive) - (aw-select " Ace - Delete Window" - #'aw-delete-window)) - -;;;###autoload -(defun ace-swap-window () - "Ace swap window." - (interactive) - (aw-select " Ace - Swap Window" - #'aw-swap-window)) - -;;;###autoload -(defun ace-delete-other-windows () - "Ace delete other windows." - (interactive) - (aw-select " Ace - Delete Other Windows" - #'delete-other-windows)) - -;;;###autoload -(defun ace-display-buffer (buffer alist) - "Make `display-buffer' and `pop-to-buffer' select using `ace-window'. -See sample config for `display-buffer-base-action' and `display-buffer-alist': -https://github.com/abo-abo/ace-window/wiki/display-buffer." - (let* ((aw-ignore-current (cdr (assq 'inhibit-same-window alist))) - (rf (cdr (assq 'reusable-frames alist))) - (aw-scope (cl-case rf - ((nil) 'frame) - (visible 'visible) - ((0 t) 'global)))) - (unless (or (<= (length (aw-window-list)) 1) - (not aw-scope)) - (window--display-buffer - buffer (aw-select "Ace - Display Buffer") 'reuse)))) - -(declare-function transpose-frame "ext:transpose-frame") -(defun aw-transpose-frame (w) - "Select any window on frame and `tranpose-frame'." - (transpose-frame (window-frame w))) - -;;;###autoload -(defun ace-window (arg) - "Select a window. -Perform an action based on ARG described below. - -By default, behaves like extended `other-window'. -See `aw-scope' which extends it to work with frames. - -Prefixed with one \\[universal-argument], does a swap between the -selected window and the current window, so that the selected -buffer moves to current window (and current buffer moves to -selected window). - -Prefixed with two \\[universal-argument]'s, deletes the selected -window." - (interactive "p") - (setq avy-current-path "") - (cl-case arg - (0 - (let ((aw-ignore-on (not aw-ignore-on))) - (ace-select-window))) - (4 (ace-swap-window)) - (16 (ace-delete-window)) - (t (ace-select-window)))) - -;;* Utility -(unless (fboundp 'frame-position) - (defun frame-position (&optional frame) - (let ((pl (frame-parameter frame 'left)) - (pt (frame-parameter frame 'top))) - (when (consp pl) - (setq pl (eval pl))) - (when (consp pt) - (setq pt (eval pt))) - (cons pl pt)))) - -(defun aw-window< (wnd1 wnd2) - "Return true if WND1 is less than WND2. -This is determined by their respective window coordinates. -Windows are numbered top down, left to right." - (let* ((f1 (window-frame wnd1)) - (f2 (window-frame wnd2)) - (e1 (window-edges wnd1)) - (e2 (window-edges wnd2)) - (p1 (frame-position f1)) - (p2 (frame-position f2)) - (nl (or (null (car p1)) (null (car p2))))) - (cond ((and (not nl) (< (car p1) (car p2))) - (not aw-reverse-frame-list)) - ((and (not nl) (> (car p1) (car p2))) - aw-reverse-frame-list) - ((< (car e1) (car e2)) - t) - ((> (car e1) (car e2)) - nil) - ((< (cadr e1) (cadr e2)) - t)))) - -(defvar aw--window-ring (make-ring 10) - "Hold the window switching history.") - -(defun aw--push-window (window) - "Store WINDOW to `aw--window-ring'." - (when (or (zerop (ring-length aw--window-ring)) - (not (equal - (ring-ref aw--window-ring 0) - window))) - (ring-insert aw--window-ring (selected-window)))) - -(defun aw--pop-window () - "Return the removed top of `aw--window-ring'." - (let (res) - (condition-case nil - (while (or (not (window-live-p - (setq res (ring-remove aw--window-ring 0)))) - (equal res (selected-window)))) - (error - (if (= (length (aw-window-list)) 2) - (progn - (other-window 1) - (setq res (selected-window))) - (error "No previous windows stored")))) - res)) - -(defun aw-switch-to-window (window) - "Switch to the window WINDOW." - (let ((frame (window-frame window))) - (aw--push-window (selected-window)) - (when (and (frame-live-p frame) - (not (eq frame (selected-frame)))) - (select-frame-set-input-focus frame)) - (if (window-live-p window) - (select-window window) - (error "Got a dead window %S" window)))) - -(defun aw-flip-window () - "Switch to the window you were previously in." - (interactive) - (aw-switch-to-window (aw--pop-window))) - -(defun aw-show-dispatch-help () - "Display action shortucts in echo area." - (interactive) - (message "%s" (mapconcat - (lambda (action) - (cl-destructuring-bind (key fn &optional description) action - (format "%s: %s" - (propertize - (char-to-string key) - 'face 'aw-key-face) - (or description fn)))) - aw-dispatch-alist - "\n")) - ;; Prevent this from replacing any help display - ;; in the minibuffer. - (let (aw-minibuffer-flag) - (mapc #'delete-overlay aw-overlays-back) - (call-interactively 'ace-window))) - -(defun aw-delete-window (window &optional kill-buffer) - "Delete window WINDOW. -When KILL-BUFFER is non-nil, also kill the buffer." - (let ((frame (window-frame window))) - (when (and (frame-live-p frame) - (not (eq frame (selected-frame)))) - (select-frame-set-input-focus (window-frame window))) - (if (= 1 (length (window-list))) - (delete-frame frame) - (if (window-live-p window) - (let ((buffer (window-buffer window))) - (delete-window window) - (when kill-buffer - (kill-buffer buffer))) - (error "Got a dead window %S" window))))) - -(defun aw-switch-buffer-in-window (window) - "Select buffer in WINDOW." - (aw-switch-to-window window) - (aw--switch-buffer)) - -(declare-function ivy-switch-buffer "ext:ivy") - -(defun aw--switch-buffer () - (cond ((bound-and-true-p ivy-mode) - (ivy-switch-buffer)) - ((bound-and-true-p ido-mode) - (ido-switch-buffer)) - (t - (call-interactively 'switch-to-buffer)))) - -(defcustom aw-swap-invert nil - "When non-nil, the other of the two swapped windows gets the point." - :type 'boolean) - -(defun aw-swap-window (window) - "Swap buffers of current window and WINDOW." - (cl-labels ((swap-windows (window1 window2) - "Swap the buffers of WINDOW1 and WINDOW2." - (let ((buffer1 (window-buffer window1)) - (buffer2 (window-buffer window2))) - (set-window-buffer window1 buffer2) - (set-window-buffer window2 buffer1) - (select-window window2)))) - (let ((frame (window-frame window)) - (this-window (selected-window))) - (when (and (frame-live-p frame) - (not (eq frame (selected-frame)))) - (select-frame-set-input-focus (window-frame window))) - (when (and (window-live-p window) - (not (eq window this-window))) - (aw--push-window this-window) - (if aw-swap-invert - (swap-windows window this-window) - (swap-windows this-window window)))))) - -(defun aw-move-window (window) - "Move the current buffer to WINDOW. -Switch the current window to the previous buffer." - (let ((buffer (current-buffer))) - (switch-to-buffer (other-buffer)) - (aw-switch-to-window window) - (switch-to-buffer buffer))) - -(defun aw-copy-window (window) - "Copy the current buffer to WINDOW." - (let ((buffer (current-buffer))) - (aw-switch-to-window window) - (switch-to-buffer buffer))) - -(defun aw-split-window-vert (window) - "Split WINDOW vertically." - (select-window window) - (split-window-vertically)) - -(defun aw-split-window-horz (window) - "Split WINDOW horizontally." - (select-window window) - (split-window-horizontally)) - -(defcustom aw-fair-aspect-ratio 2 - "The aspect ratio to aim for when splitting windows. -Sizes are based on the number of characters, not pixels. -Increase to prefer wider windows, or decrease for taller windows." - :type 'number) - -(defun aw-split-window-fair (window) - "Split WINDOW vertically or horizontally, based on its current dimensions. -Modify `aw-fair-aspect-ratio' to tweak behavior." - (let ((w (window-body-width window)) - (h (window-body-height window))) - (if (< (* h aw-fair-aspect-ratio) w) - (aw-split-window-horz window) - (aw-split-window-vert window)))) - -(defun aw-switch-buffer-other-window (window) - "Switch buffer in WINDOW." - (aw-switch-to-window window) - (unwind-protect - (aw--switch-buffer) - (aw-flip-window))) - -(defun aw-execute-command-other-window (window) - "Execute a command in WINDOW." - (aw-switch-to-window window) - (unwind-protect - (funcall - (key-binding - (read-key-sequence - "Enter key sequence: "))) - (aw-flip-window))) - -(defun aw--face-rel-height () - (let ((h (face-attribute 'aw-leading-char-face :height))) - (cond - ((eq h 'unspecified) - 1) - ((floatp h) - (max (floor h) 1)) - ((integerp h) - 1) - (t - (error "unexpected: %s" h))))) - -(defun aw-offset (window) - "Return point in WINDOW that's closest to top left corner. -The point is writable, i.e. it's not part of space after newline." - (let ((h (window-hscroll window)) - (beg (window-start window)) - (end (window-end window)) - (inhibit-field-text-motion t)) - (with-current-buffer (window-buffer window) - (save-excursion - (goto-char beg) - (forward-line (1- - (min - (count-lines - (point) - (point-max)) - (aw--face-rel-height)))) - (while (and (< (point) end) - (< (- (line-end-position) - (line-beginning-position)) - h)) - (forward-line)) - (+ (point) h))))) - -(defun aw--after-make-frame (f) - (aw-update) - (make-frame-visible f)) - -;;* Mode line -;;;###autoload -(define-minor-mode ace-window-display-mode - "Minor mode for showing the ace window key in the mode line." - :global t - (if ace-window-display-mode - (progn - (aw-update) - (set-default - 'mode-line-format - `((ace-window-display-mode - (:eval (window-parameter (selected-window) 'ace-window-path))) - ,@(assq-delete-all - 'ace-window-display-mode - (default-value 'mode-line-format)))) - (force-mode-line-update t) - (add-hook 'window-configuration-change-hook 'aw-update) - ;; Add at the end so does not precede select-frame call. - (add-hook 'after-make-frame-functions #'aw--after-make-frame t)) - (set-default - 'mode-line-format - (assq-delete-all - 'ace-window-display-mode - (default-value 'mode-line-format))) - (remove-hook 'window-configuration-change-hook 'aw-update) - (remove-hook 'after-make-frame-functions 'aw--after-make-frame))) - -(defun aw-update () - "Update ace-window-path window parameter for all windows. - -Ensure all windows are labeled so the user can select a specific -one, even from the set of windows typically ignored when making a -window list." - (let ((aw-ignore-on) - (aw-ignore-current) - (ignore-window-parameters t)) - (avy-traverse - (avy-tree (aw-window-list) aw-keys) - (lambda (path leaf) - (set-window-parameter - leaf 'ace-window-path - (propertize - (apply #'string (reverse path)) - 'face 'aw-mode-line-face)))))) - -(provide 'ace-window) - -;;; ace-window.el ends here diff --git a/elpa/ace-window-20200311.1025/ace-window.elc b/elpa/ace-window-20200311.1025/ace-window.elc deleted file mode 100644 index 417c46c7064c9ae936971084812c0c8625291da9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28501 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 -;; Created: 24 Aug 2011 -;; Updated: 16 Mar 2015 -;; Version: 1.2 -;; Package-Version: 20200303.2118 -;; Package-Requires: ((gntp "0.1") (log4e "0.3.0") (cl-lib "0.5")) -;; Keywords: notification emacs message -;; X-URL: https://github.com/jwiegley/alert - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2, or (at -;; your option) any later version. - -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Alert is a Growl-workalike for Emacs which uses a common notification -;; interface and multiple, selectable "styles", whose use is fully -;; customizable by the user. -;; -;; * For module writers -;; -;; Just use `alert' instead of `message' as follows: -;; -;; (require 'alert) -;; -;; ;; This is the most basic form usage -;; (alert "This is an alert") -;; -;; ;; You can adjust the severity for more important messages -;; (alert "This is an alert" :severity 'high) -;; -;; ;; Or decrease it for purely informative ones -;; (alert "This is an alert" :severity 'trivial) -;; -;; ;; Alerts can have optional titles. Otherwise, the title is the -;; ;; buffer-name of the (current-buffer) where the alert originated. -;; (alert "This is an alert" :title "My Alert") -;; -;; ;; Further, alerts can have categories. This allows users to -;; ;; selectively filter on them. -;; (alert "This is an alert" :title "My Alert" :category 'debug) -;; -;; * For users -;; -;; For the user, there are several variables to control when and how alerts -;; are presented. By default, they appear in the minibuffer much the same -;; as a normal Emacs message. But there are many more possibilities: -;; -;; `alert-fade-time' -;; Normally alerts disappear after this many seconds, if the style -;; supports it. The default is 5 seconds. -;; -;; `alert-default-style' -;; Pick the style to use if no other config rule matches. The -;; default is `message', but `growl' works well too. -;; -;; `alert-reveal-idle-time' -;; If a config rule choose to match on `idle', this is how many -;; seconds idle the user has to be. Defaults to 5 so that users -;; don't miss any alerts, but 120 is also good. -;; -;; `alert-persist-idle-time' -;; After this many idle seconds, alerts will become sticky, and not -;; fade away more. The default is 15 minutes. -;; -;; `alert-log-messages' -;; By default, all alerts are logged to *Alerts* (and to *Messages*, -;; if the `message' style is being used). Set to nil to disable. -;; -;; `alert-hide-all-notifications' -;; Want alerts off entirely? They still get logged, however, unless -;; you've turned that off too. -;; -;; `alert-user-configuration' -;; This variable lets you control exactly how and when a particular -;; alert, a class of alerts, or all alerts, get reported -- or if at -;; all. Use this to make some alerts use Growl, while others are -;; completely silent. -;; -;; * Programmatically adding rules -;; -;; Users can also programmatically add configuration rules, in addition to -;; customizing `alert-user-configuration'. Here is one that the author -;; currently uses with ERC, so that the fringe gets colored whenever people -;; chat on BitlBee: -;; -;; (alert-add-rule :status '(buried visible idle) -;; :severity '(moderate high urgent) -;; :mode 'erc-mode -;; :predicate -;; #'(lambda (info) -;; (string-match (concat "\\`[^&].*@BitlBee\\'") -;; (erc-format-target-and/or-network))) -;; :persistent -;; #'(lambda (info) -;; ;; If the buffer is buried, or the user has been -;; ;; idle for `alert-reveal-idle-time' seconds, -;; ;; make this alert persistent. Normally, alerts -;; ;; become persistent after -;; ;; `alert-persist-idle-time' seconds. -;; (memq (plist-get info :status) '(buried idle))) -;; :style 'fringe -;; :continue t) -;; -;; * Builtin alert styles -;; -;; There are several builtin styles, and it is trivial to create new ones. -;; The builtins are: -;; -;; fringe - Changes the current frame's fringe background color -;; mode-line - Changes the current frame's mode-line background color -;; gntp - Uses gntp, it requires gntp.el (see https://github.com/tekai/gntp.el) -;; growl - Uses Growl on OS X, if growlnotify is on the PATH -;; ignore - Ignores the alert entirely -;; libnotify - Uses libnotify if notify-send is on the PATH -;; log - Logs the alert text to *Alerts*, with a timestamp -;; message - Uses the Emacs `message' facility -;; momentary - Uses the Emacs `momentary-string-display' facility -;; notifications - Uses notifications library via D-Bus -;; notifier - Uses terminal-notifier on OS X, if it is on the PATH -;; osx-notifier - Native OSX notifier using AppleScript -;; toaster - Use the toast notification system -;; x11 - Changes the urgency property of the window in the X Window System -;; -;; * Defining new styles -;; -;; To create a new style, you need to at least write a "notifier", which is -;; a function that receives the details of the alert. These details are -;; given in a plist which uses various keyword to identify the parts of the -;; alert. Here is a prototypical style definition: -;; -;; (alert-define-style 'style-name :title "My Style's title" -;; :notifier -;; (lambda (info) -;; ;; The message text is :message -;; (plist-get info :message) -;; ;; The :title of the alert -;; (plist-get info :title) -;; ;; The :category of the alert -;; (plist-get info :category) -;; ;; The major-mode this alert relates to -;; (plist-get info :mode) -;; ;; The buffer the alert relates to -;; (plist-get info :buffer) -;; ;; Severity of the alert. It is one of: -;; ;; `urgent' -;; ;; `high' -;; ;; `moderate' -;; ;; `normal' -;; ;; `low' -;; ;; `trivial' -;; (plist-get info :severity) -;; ;; Whether this alert should persist, or fade away -;; (plist-get info :persistent) -;; ;; Data which was passed to `alert'. Can be -;; ;; anything. -;; (plist-get info :data)) -;; -;; ;; Removers are optional. Their job is to remove -;; ;; the visual or auditory effect of the alert. -;; :remover -;; (lambda (info) -;; ;; It is the same property list that was passed to -;; ;; the notifier function. -;; )) -;; -;; You can test a specific style with something like this: -;; -;; (let ((alert-user-configuration '((((:severity high)) momentary nil)))) -;; (alert "Same buffer momentary alert" :title "My Alert" :severity 'high) -;; (alert "This is a momentary alert in another visible buffer" :title "My Alert" -;; :severity 'high :buffer (other-buffer (current-buffer) t))) - -;;; Code: - -(require 'cl-lib) -(require 'gntp nil t) -(eval-when-compile - ;; if not available, silence the byte compiler - (defvar gntp-server)) -(declare-function gntp-notify "gntp") -(require 'notifications nil t) -(require 'log4e nil t) - -;; shut up the byte compiler -(declare-function alert-gntp-notify "alert") -(declare-function alert-notifications-notify "alert") - -(defgroup alert nil - "Notification system for Emacs similar to Growl" - :group 'emacs) - -(defcustom alert-severity-faces - '((urgent . alert-urgent-face) - (high . alert-high-face) - (moderate . alert-moderate-face) - (normal . alert-normal-face) - (low . alert-low-face) - (trivial . alert-trivial-face)) - "Faces associated by default with alert severities." - :type '(alist :key-type symbol :value-type color) - :group 'alert) - -(defcustom alert-severity-colors - '((urgent . "red") - (high . "orange") - (moderate . "yellow") - (normal . "green") - (low . "blue") - (trivial . "purple")) - "Colors associated by default with alert severities. -This is used by styles external to Emacs that don't understand faces." - :type '(alist :key-type symbol :value-type color) - :group 'alert) - -(defcustom alert-log-severity-functions - '((urgent . alert--log-fatal) - (high . alert--log-error) - (moderate . alert--log-warn) - (normal . alert--log-info) - (low . alert--log-debug) - (trivial . alert--log-trace)) - "Log4e logging functions." - :type '(alist :key-type symbol :value-type color) - :group 'alert) - -(defcustom alert-log-level - 'normal - "Minimum level of messages to log." - :type 'symbol - :group 'alert) - -(defcustom alert-reveal-idle-time 15 - "If idle this many seconds, rules will match the `idle' property." - :type 'integer - :group 'alert) - -(defcustom alert-persist-idle-time 900 - "If idle this many seconds, all alerts become persistent. -This can be overridden with the Never Persist option (:never-persist)." - :type 'integer - :group 'alert) - -(defcustom alert-fade-time 5 - "If not idle, alerts disappear after this many seconds. -The amount of idle time is governed by `alert-persist-idle-time'." - :type 'integer - :group 'alert) - -(defcustom alert-hide-all-notifications nil - "If non-nil, no alerts are ever shown to the user." - :type 'boolean - :group 'alert) - -(defcustom alert-log-messages t - "If non-nil, all alerts are logged to the *Alerts* buffer." - :type 'boolean - :group 'alert) - -(defcustom alert-default-icon - (concat data-directory - "images/icons/hicolor/scalable/apps/emacs.svg") - "Filename of default icon to show for libnotify-alerts." - :type 'string - :group 'alert) - -(defvar alert-styles nil) - -(defun alert-styles-radio-type (widget-name) - (append - (list widget-name :tag "Style") - (mapcar #'(lambda (style) - (list 'const - :tag (or (plist-get (cdr style) :title) - (symbol-name (car style))) - (car style))) - (setq alert-styles - (sort alert-styles - #'(lambda (l r) - (string< (symbol-name (car l)) - (symbol-name (car r))))))))) - -(defcustom alert-default-style 'message - "The style to use if no rules match in the current configuration. -If a configured rule does match an alert, this style is not used; -it is strictly a fallback." - :type (alert-styles-radio-type 'radio) - :group 'alert) - -(defun alert-configuration-type () - (list 'repeat - (list - 'list :tag "Select style if alert matches selector" - '(repeat - :tag "Selector" - (choice - (cons :tag "Severity" - (const :format "" :severity) - (set (const :tag "Urgent" urgent) - (const :tag "High" high) - (const :tag "Moderate" moderate) - (const :tag "Normal" normal) - (const :tag "Low" low) - (const :tag "Trivial" trivial))) - (cons :tag "User Status" - (const :format "" :status) - (set (const :tag "Buffer not visible" buried) - (const :tag "Buffer visible" visible) - (const :tag "Buffer selected" selected) - (const :tag "Buffer selected, user idle" idle))) - (cons :tag "Major Mode" - (const :format "" :mode) - regexp) - (cons :tag "Category" - (const :format "" :category) - regexp) - (cons :tag "Title" - (const :format "" :title) - regexp) - (cons :tag "Message" - (const :format "" :message) - regexp) - (cons :tag "Predicate" - (const :format "" :predicate) - function) - (cons :tag "Icon" - (const :format "" :icon) - regexp))) - (alert-styles-radio-type 'choice) - '(set :tag "Options" - (cons :tag "Make alert persistent" - (const :format "" :persistent) - (choice :value t (const :tag "Yes" t) - (function :tag "Predicate"))) - (cons :tag "Never persist" - (const :format "" :never-persist) - (choice :value t (const :tag "Yes" t) - (function :tag "Predicate"))) - (cons :tag "Continue to next rule" - (const :format "" :continue) - (choice :value t (const :tag "Yes" t) - (function :tag "Predicate"))) - ;;(list :tag "Change Severity" - ;; (radio :tag "From" - ;; (const :tag "Urgent" urgent) - ;; (const :tag "High" high) - ;; (const :tag "Moderate" moderate) - ;; (const :tag "Normal" normal) - ;; (const :tag "Low" low) - ;; (const :tag "Trivial" trivial)) - ;; (radio :tag "To" - ;; (const :tag "Urgent" urgent) - ;; (const :tag "High" high) - ;; (const :tag "Moderate" moderate) - ;; (const :tag "Normal" normal) - ;; (const :tag "Low" low) - ;; (const :tag "Trivial" trivial))) - )))) - -(defcustom alert-user-configuration nil - "Rules that determine how and when alerts get displayed." - :type (alert-configuration-type) - :group 'alert) - -(defvar alert-internal-configuration nil - "Rules added by `alert-add-rule'. -For user customization, see `alert-user-configuration'.") - -(defface alert-urgent-face - '((t (:foreground "Red" :bold t))) - "Urgent alert face." - :group 'alert) - -(defface alert-high-face - '((t (:foreground "Dark Orange" :bold t))) - "High alert face." - :group 'alert) - -(defface alert-moderate-face - '((t (:foreground "Gold" :bold t))) - "Moderate alert face." - :group 'alert) - -(defface alert-normal-face - '((t)) - "Normal alert face." - :group 'alert) - -(defface alert-low-face - '((t (:foreground "Dark Blue"))) - "Low alert face." - :group 'alert) - -(defface alert-trivial-face - '((t (:foreground "Dark Violet"))) - "Trivial alert face." - :group 'alert) - -(defun alert-define-style (name &rest plist) - "Define a new style for notifying the user of alert messages. -To create a new style, you need to at least write a \"notifier\", -which is a function that receives the details of the alert. -These details are given in a plist which uses various keyword to -identify the parts of the alert. Here is a prototypical style -definition: - -\(alert-define-style 'style-name :title \"My Style's title\" - :notifier - (lambda (info) - ;; The message text is :message - (plist-get info :message) - ;; The :title of the alert - (plist-get info :title) - ;; The :category of the alert - (plist-get info :category) - ;; The major-mode this alert relates to - (plist-get info :mode) - ;; The buffer the alert relates to - (plist-get info :buffer) - ;; Severity of the alert. It is one of: - ;; `urgent' - ;; `high' - ;; `moderate' - ;; `normal' - ;; `low' - ;; `trivial' - (plist-get info :severity) - ;; Whether this alert should persist, or fade away - (plist-get info :persistent) - ;; Data which was passed to `alert'. Can be - ;; anything. - (plist-get info :data)) - - ;; Removers are optional. Their job is to remove - ;; the visual or auditory effect of the alert. - :remover - (lambda (info) - ;; It is the same property list that was passed to - ;; the notifier function. - ))" - (add-to-list 'alert-styles (cons name plist)) - (put 'alert-user-configuration 'custom-type (alert-configuration-type)) - (put 'alert-define-style 'custom-type (alert-styles-radio-type 'radio))) - -(alert-define-style 'ignore :title "Ignore Alert" - :notifier #'ignore - :remover #'ignore) - -;;;###autoload -(cl-defun alert-add-rule (&key severity status mode category title - message predicate icon (style alert-default-style) - persistent continue never-persist append) - "Programmatically add an alert configuration rule. - -Normally, users should custoimze `alert-user-configuration'. -This facility is for module writers and users that need to do -things the Lisp way. - -Here is a rule the author currently uses with ERC, so that the -fringe gets colored whenever people chat on BitlBee: - -\(alert-add-rule :status \\='(buried visible idle) - :severity \\='(moderate high urgent) - :mode \\='erc-mode - :predicate - #\\='(lambda (info) - (string-match (concat \"\\\\`[^&].*@BitlBee\\\\\\='\") - (erc-format-target-and/or-network))) - :persistent - #\\='(lambda (info) - ;; If the buffer is buried, or the user has been - ;; idle for `alert-reveal-idle-time' seconds, - ;; make this alert persistent. Normally, alerts - ;; become persistent after - ;; `alert-persist-idle-time' seconds. - (memq (plist-get info :status) \\='(buried idle))) - :style \\='fringe - :continue t)" - (let ((rule (list (list t) style (list t)))) - (if severity - (nconc (nth 0 rule) - (list (cons :severity - (if (listp severity) - severity - (list severity)))))) - (if status - (nconc (nth 0 rule) - (list (cons :status - (if (listp status) - status - (list status)))))) - (if mode - (nconc (nth 0 rule) - (list (cons :mode - (if (stringp mode) - mode - (concat "\\`" (symbol-name mode) - "\\'")))))) - (if category - (nconc (nth 0 rule) (list (cons :category category)))) - (if title - (nconc (nth 0 rule) (list (cons :title title)))) - (if message - (nconc (nth 0 rule) (list (cons :message message)))) - (if predicate - (nconc (nth 0 rule) (list (cons :predicate predicate)))) - (if icon - (nconc (nth 0 rule) (list (cons :icon icon)))) - (setcar rule (cdr (nth 0 rule))) - - (if persistent - (nconc (nth 2 rule) (list (cons :persistent persistent)))) - (if never-persist - (nconc (nth 2 rule) (list (cons :never-persist never-persist)))) - (if continue - (nconc (nth 2 rule) (list (cons :continue continue)))) - (setcdr (cdr rule) (list (cdr (nth 2 rule)))) - - (if (null alert-internal-configuration) - (setq alert-internal-configuration (list rule)) - (if append - (nconc alert-internal-configuration (list rule)) - (setq alert-internal-configuration - (cons rule alert-internal-configuration)))) - - rule)) - -(alert-define-style 'ignore :title "Don't display alerts") - -(defun alert-log-notify (info) - (let* ((mes (plist-get info :message)) - (sev (plist-get info :severity)) - (len (length mes)) - (func (cdr (assoc sev alert-log-severity-functions)))) - (if (not (featurep 'log4e)) - (alert-legacy-log-notify mes sev len) - ;; when we get here you better be using log4e or have your logging - ;; functions defined - (unless (fboundp func) - (when (fboundp 'log4e:deflogger) - (log4e:deflogger "alert" "%t [%l] %m" "%H:%M:%S") - (when (functionp 'alert--log-set-level) - (alert--log-set-level alert-log-level))) - (alert--log-enable-logging)) - (when (fboundp func) - (apply func (list mes)))))) - -(defun alert-legacy-log-notify (mes sev len) - (with-current-buffer - (get-buffer-create "*Alerts*") - (goto-char (point-max)) - (insert (format-time-string "%H:%M %p - ")) - (insert mes) - (set-text-properties (- (point) len) (point) - (list 'face (cdr (assq sev - alert-severity-faces)))) - (insert ?\n))) - -(defun alert-log-clear (info) - (if (functionp 'alert--log-clear-log) - (alert--log-clear-log) - (if (bufferp "*Alerts*") - (with-current-buffer - (get-buffer-create "*Alerts*") - (goto-char (point-max)) - (insert (format-time-string "%H:%M %p - ") - "Clear: " (plist-get info :message) - ?\n))))) - -(alert-define-style 'log :title "Log to *Alerts* buffer" - :notifier #'alert-log-notify - ;;:remover #'alert-log-clear - ) - -(defun alert-message-notify (info) - ;; the message text might contain `%' and we don't want them to be - ;; interpreted as format specifiers: - (message "%s" (plist-get info :message)) - ;;(if (memq (plist-get info :severity) '(high urgency)) - ;; (ding)) - ) - -(defun alert-message-remove (_info) - (message "")) - -(alert-define-style 'message :title "Display message in minibuffer" - :notifier #'alert-message-notify - :remover #'alert-message-remove) - -(defun alert-momentary-notify (info) - (save-excursion - (with-current-buffer (or (plist-get info :buffer) (current-buffer)) - (momentary-string-display - (format "%s: %s (%s/%s/%s)" - (or (plist-get info :title) "untitled") - (or (plist-get info :message) "no message") - (or (plist-get info :severity) "no priority") - (or (plist-get info :category) "no category") - (or (plist-get info :mode) "no mode")) - (progn - (beginning-of-line) - (point)))))) - -(alert-define-style 'momentary :title "Display message momentarily in buffer" - :notifier #'alert-momentary-notify - ;; explicitly, we don't need a remover - :remover #'ignore) - -(copy-face 'fringe 'alert-saved-fringe-face) - -(defun alert-fringe-notify (info) - (set-face-background 'fringe (cdr (assq (plist-get info :severity) - alert-severity-colors)))) - -(defun alert-fringe-restore (_info) - (copy-face 'alert-saved-fringe-face 'fringe)) - -(alert-define-style 'fringe :title "Change the fringe color" - :notifier #'alert-fringe-notify - :remover #'alert-fringe-restore) - - -(defun alert-mode-line-notify (info) - (copy-face 'mode-line 'alert-saved-mode-line-face) - (set-face-background 'mode-line (cdr (assq (plist-get info :severity) - alert-severity-colors))) - (set-face-foreground 'mode-line "white")) - -(defun alert-mode-line-restore (_info) - (copy-face 'alert-saved-mode-line-face 'mode-line)) - -(alert-define-style 'mode-line :title "Change the mode-line color" - :notifier #'alert-mode-line-notify - :remover #'alert-mode-line-restore) - - - -(defcustom alert-growl-command (executable-find "growlnotify") - "Path to the growlnotify command. -This is found in the Growl Extras: http://growl.info/extras.php." - :type 'file - :group 'alert) - -(defcustom alert-growl-priorities - '((urgent . 2) - (high . 2) - (moderate . 1) - (normal . 0) - (low . -1) - (trivial . -2)) - "A mapping of alert severities onto Growl priority values." - :type '(alist :key-type symbol :value-type integer) - :group 'alert) - -(defsubst alert-encode-string (str) - (encode-coding-string str (keyboard-coding-system))) - -(defun alert-growl-notify (info) - (if alert-growl-command - (let ((args - (list "--appIcon" "Emacs" - "--name" "Emacs" - "--title" (alert-encode-string (plist-get info :title)) - "--message" (alert-encode-string (plist-get info :message)) - "--priority" (number-to-string - (cdr (assq (plist-get info :severity) - alert-growl-priorities)))))) - (if (and (plist-get info :persistent) - (not (plist-get info :never-persist))) - (nconc args (list "--sticky"))) - (apply #'call-process alert-growl-command nil nil nil args)) - (alert-message-notify info))) - -(alert-define-style 'growl :title "Notify using Growl" - :notifier #'alert-growl-notify) - - -(defcustom alert-libnotify-command (executable-find "notify-send") - "Path to the notify-send command. -This is found in the libnotify-bin package in Debian based -systems." - :type 'file - :group 'alert) - -(defcustom alert-libnotify-additional-args - nil - "Additional args to pass to notify-send. -Must be a list of strings." - :type '(repeat string) - :group 'alert) - -(defcustom alert-libnotify-priorities - '((urgent . critical) - (high . critical) - (moderate . normal) - (normal . normal) - (low . low) - (trivial . low)) - "A mapping of alert severities onto libnotify priority values." - :type '(alist :key-type symbol :value-type symbol) - :group 'alert) - -(defun alert-libnotify-notify (info) - "Send INFO using notify-send. -Handles :ICON, :CATEGORY, :SEVERITY, :PERSISTENT, :NEVER-PERSIST, :TITLE -and :MESSAGE keywords from the INFO plist. :CATEGORY can be -passed as a single symbol, a string or a list of symbols or -strings." - (if alert-libnotify-command - (let* ((args - (append - (list "--icon" (or (plist-get info :icon) - alert-default-icon) - "--app-name" "Emacs" - "--urgency" (let ((urgency (cdr (assq - (plist-get info :severity) - alert-libnotify-priorities)))) - (if urgency - (symbol-name urgency) - "normal"))) - (copy-tree alert-libnotify-additional-args))) - (category (plist-get info :category))) - (nconc args - (list "--expire-time" - (number-to-string - (* 1000 ; notify-send takes msecs - (if (and (plist-get info :persistent) - (not (plist-get info :never-persist))) - 0 ; 0 indicates persistence - alert-fade-time))))) - (when category - (nconc args - (list "--category" - (cond ((symbolp category) - (symbol-name category)) - ((stringp category) category) - ((listp category) - (mapconcat (if (symbolp (car category)) - #'symbol-name - #'identity) - category ",")))))) - (nconc args (list - (alert-encode-string (plist-get info :title)) - (alert-encode-string (plist-get info :message)))) - (apply #'call-process alert-libnotify-command nil - (list (get-buffer-create " *libnotify output*") t) nil args)) - (alert-message-notify info))) - -(alert-define-style 'libnotify :title "Notify using libnotify" - :notifier #'alert-libnotify-notify) - - -(defcustom alert-gntp-icon - "http://cvs.savannah.gnu.org/viewvc/*checkout*/emacs/emacs/etc/images/icons/hicolor/48x48/apps/emacs.png" - "Icon file using gntp." - :type 'string - :group 'alert) - -(when (featurep 'gntp) - (defun alert-gntp-notify (info) - (gntp-notify 'alert - (alert-encode-string (plist-get info :title)) - (alert-encode-string (plist-get info :message)) - gntp-server nil - (number-to-string - (cdr (assq (plist-get info :severity) - alert-growl-priorities))) - (if (eq (plist-get info :icon) nil) - alert-gntp-icon - (plist-get info :icon))) - (alert-message-notify info)) - - (alert-define-style 'gntp :title "Notify using gntp" - :notifier #'alert-gntp-notify)) - - -(defcustom alert-notifications-priorities - '((urgent . critical) - (high . critical) - (moderate . normal) - (normal . normal) - (low . low) - (trivial . low)) - "A mapping of alert severities onto Growl priority values." - :type '(alist :key-type symbol :value-type symbol) - :group 'alert) - -(defvar alert-notifications-ids (make-hash-table :test #'equal) - "Internal store of notification ids returned by the `notifications' backend. -Used for replacing notifications with the same id. The key is -the value of the :id keyword to `alert'. An id is only stored -here if there `alert' was called with an :id keyword and handled -by the `notifications' style.") - -(when (featurep 'notifications) - (defun alert-notifications-notify (info) - "Show the alert defined by INFO with `notifications-notify'." - (let ((id (notifications-notify :title (plist-get info :title) - :body (plist-get info :message) - :app-icon (plist-get info :icon) - :timeout (if (plist-get info :persistent) 0 -1) - :replaces-id (gethash (plist-get info :id) alert-notifications-ids) - :urgency (cdr (assq (plist-get info :severity) - alert-notifications-priorities)) - :actions '("default" "Open corresponding buffer") - :on-action (lambda (id action) - (when (string= action "default") - (switch-to-buffer (plist-get info :buffer))))))) - (when (plist-get info :id) - (puthash (plist-get info :id) id alert-notifications-ids))) - (alert-message-notify info)) - - (defun alert-notifications-remove (info) - "Remove the `notifications-notify' message based on INFO :id." - (let ((id (and (plist-get info :id) - (gethash (plist-get info :id) alert-notifications-ids)))) - (when id - (notifications-close-notification id) - (remhash (plist-get info :id) alert-notifications-ids)))) - - (alert-define-style 'notifications :title "Notify using notifications" - :notifier #'alert-notifications-notify)) - - -(defcustom alert-notifier-command (executable-find "terminal-notifier") - "Path to the terminal-notifier command. -From https://github.com/julienXX/terminal-notifier." - :type 'file - :group 'alert) - -(defcustom alert-notifier-default-icon - (concat data-directory - "images/icons/hicolor/128x128/apps/emacs.png") - "Filename of default icon to show for terminal-notifier alerts." - :type 'string - :group 'alert) - -(defun alert-notifier-notify (info) - (if alert-notifier-command - (let ((args - (list "-title" (alert-encode-string (plist-get info :title)) - "-appIcon" (or (plist-get info :icon) alert-notifier-default-icon) - "-message" (alert-encode-string (plist-get info :message))))) - (apply #'call-process alert-notifier-command nil nil nil args)) - (alert-message-notify info))) - -(alert-define-style 'notifier :title "Notify using terminal-notifier" - :notifier #'alert-notifier-notify) - -(defun alert-osx-notifier-notify (info) - (apply #'call-process "osascript" nil nil nil "-e" - (list (format "display notification %S with title %S" - (alert-encode-string (plist-get info :message)) - (alert-encode-string (plist-get info :title))))) - (alert-message-notify info)) - -(when (fboundp 'mac-do-applescript) - ;; Use built-in AppleScript support when possible. - (defun alert-osx-notifier-notify (info) - (mac-do-applescript (format "display notification %S with title %S" - (alert-encode-string (plist-get info :message)) - (alert-encode-string (plist-get info :title)))) - (alert-message-notify info))) - -(alert-define-style 'osx-notifier :title "Notify using native OSX notification" :notifier #'alert-osx-notifier-notify) - -(defun alert-frame-notify (info) - (let ((buf (plist-get info :buffer))) - (if (eq (alert-buffer-status buf) 'buried) - (let ((current-frame (selected-frame))) - (with-selected-frame - (make-frame '((width . 80) - (height . 20) - (top . -1) - (left . 0) - (left-fringe . 0) - (right-fringe . 0) - (tool-bar-lines . nil) - (menu-bar-lines . nil) - (vertical-scroll-bars . nil) - (unsplittable . t) - (has-modeline-p . nil) - (minibuffer . nil))) - (switch-to-buffer buf) - ;;(set (make-local-variable 'mode-line-format) nil) - (nconc info (list :frame (selected-frame)))) - (select-frame current-frame))))) - -(defun alert-frame-remove (info) - (unless (eq this-command 'handle-switch-frame) - (delete-frame (plist-get info :frame) t))) - -;; This code was kindly borrowed from Arne Babenhauserheide: -;; http://www.draketo.de/proj/babcore/#sec-3-14-2 -(defun x-urgency-hint (frame arg &optional source) - "Set the x-urgency hint for FRAME to ARG. - -- If arg is nil, unset the urgency. -- If arg is any other value, set the urgency. - -If you unset the urgency, you still have to visit the frame to make the urgency -setting disappear (at least in KDE)." - (let* ((wm-hints (append (x-window-property - "WM_HINTS" frame "WM_HINTS" - source nil t) nil)) - (flags (car wm-hints))) - (setcar wm-hints - (if arg - (logior flags #x00000100) - (logand flags #x1ffffeff))) - (x-change-window-property "WM_HINTS" wm-hints frame "WM_HINTS" 32 t))) - -(defun x-urgent (&optional arg) - "Mark the current Emacs frame as requiring urgent attention. - -With non-nil ARG, remove the urgency flag (which might or might -not change display, depending on the window manager)." - (interactive "P") - (let ((frame (car (car (cdr (current-frame-configuration)))))) - (x-urgency-hint frame (not arg)))) - -(defun alert-x11-notify (_info) - "Call `x-urgent'." - (x-urgent)) - -(alert-define-style 'x11 :title "Set the X11 window property" - :notifier #'alert-x11-notify) - - -(defcustom alert-toaster-default-icon - (let ((exec-bin (executable-find "emacs.exe"))) - (cond (exec-bin - (concat (file-name-directory exec-bin) "../share/icons/hicolor/128x128/apps/emacs.png")) - (t nil))) - "Icon file using toaster." - :type 'string - :group 'alert - ) - -(defcustom alert-toaster-command (executable-find "toast") - "Path to the toast command. -This is found at https://github.com/nels-o/toaster." - :type 'file - :group 'alert - ) - -(defun alert-toaster-notify (info) - (if alert-toaster-command - (let ((args (list - "-t" (alert-encode-string (plist-get info :title)) - "-m" (alert-encode-string (plist-get info :message)) - "-p" (expand-file-name (or (plist-get info :icon) alert-toaster-default-icon)) - ))) - (apply #'call-process alert-toaster-command nil nil nil args)) - (alert-message-notify info))) - -(alert-define-style 'toaster :title "Notify using Toaster" - :notifier #'alert-toaster-notify) - -;; jww (2011-08-25): Not quite working yet -;;(alert-define-style 'frame :title "Popup buffer in a frame" -;; :notifier #'alert-frame-notify -;; :remover #'alert-frame-remove) - -(defun alert-buffer-status (&optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (let ((wind (get-buffer-window))) - (if wind - (if (eq wind (selected-window)) - (if (and (current-idle-time) - (> (float-time (current-idle-time)) - alert-reveal-idle-time)) - 'idle - 'selected) - 'visible) - 'buried)))) - -(defvar alert-active-alerts nil) - -(defun alert-remove-when-active (remover info) - (let ((idle-time (and (current-idle-time) - (float-time (current-idle-time))))) - (cond - ((and idle-time (> idle-time alert-persist-idle-time))) - ((and idle-time (> idle-time alert-reveal-idle-time)) - (run-with-timer alert-fade-time nil - #'alert-remove-when-active remover info)) - (t - (funcall remover info))))) - -(defun alert-remove-on-command () - (let (to-delete) - (dolist (alert alert-active-alerts) - (when (eq (current-buffer) (nth 0 alert)) - (push alert to-delete) - (if (nth 2 alert) - (funcall (nth 2 alert) (nth 1 alert))))) - (dolist (alert to-delete) - (setq alert-active-alerts (delq alert alert-active-alerts))))) - -(defun alert-send-notification - (alert-buffer info style-def &optional persist never-per) - (let ((notifier (plist-get style-def :notifier))) - (if notifier - (funcall notifier info))) - (let ((remover (plist-get style-def :remover))) - (add-to-list 'alert-active-alerts (list alert-buffer info remover)) - (with-current-buffer alert-buffer - (add-hook 'post-command-hook #'alert-remove-on-command nil t)) - (if (and remover (or (not persist) never-per)) - (run-with-timer alert-fade-time nil - #'alert-remove-when-active - remover info)))) - -;;;###autoload -(cl-defun alert (message &key (severity 'normal) title icon category - buffer mode data style persistent never-persist - id) - "Alert the user that something has happened. -MESSAGE is what the user will see. You may also use keyword -arguments to specify additional details. Here is a full example: - -\(alert \"This is a message\" - :severity \\='high ;; The default severity is `normal' - :title \"Title\" ;; An optional title - :category \\='example ;; A symbol to identify the message - :mode \\='text-mode ;; Normally determined automatically - :buffer (current-buffer) ;; This is the default - :data nil ;; Unused by alert.el itself - :persistent nil ;; Force the alert to be persistent; - ;; it is best not to use this - :never-persist nil ;; Force this alert to never persist - :id \\='my-id) ;; Used to replace previous message of - ;; the same id in styles that support it - :style \\='fringe) ;; Force a given style to be used; - ;; this is only for debugging! - -If no :title is given, the buffer-name of :buffer is used. If -:buffer is nil, it is the current buffer at the point of call. - -:data is an opaque value which modules can pass through to their -own styles if they wish. - -Here are some more typical examples of usage: - - ;; This is the most basic form usage - (alert \"This is an alert\") - - ;; You can adjust the severity for more important messages - (alert \"This is an alert\" :severity \\='high) - - ;; Or decrease it for purely informative ones - (alert \"This is an alert\" :severity \\='trivial) - - ;; Alerts can have optional titles. Otherwise, the title is the - ;; buffer-name of the (current-buffer) where the alert originated. - (alert \"This is an alert\" :title \"My Alert\") - - ;; Further, alerts can have categories. This allows users to - ;; selectively filter on them. - (alert \"This is an alert\" :title \"My Alert\" - :category \\='some-category-or-other)" - (cl-destructuring-bind - (alert-buffer current-major-mode current-buffer-status - current-buffer-name) - (with-current-buffer (or buffer (current-buffer)) - (list (current-buffer) - (or mode major-mode) - (alert-buffer-status) - (buffer-name))) - - (let ((base-info (list :message message - :title (or title current-buffer-name) - :icon icon - :severity severity - :category category - :buffer alert-buffer - :mode current-major-mode - :id id - :data data)) - matched) - - (if alert-log-messages - (alert-log-notify base-info)) - - (unless alert-hide-all-notifications - (catch 'finish - (dolist (config (append alert-user-configuration - alert-internal-configuration)) - (let* ((style-def (cdr (assq (or style (nth 1 config)) - alert-styles))) - (options (nth 2 config)) - (persist-p (or persistent - (cdr (assq :persistent options)))) - (persist (if (functionp persist-p) - (funcall persist-p base-info) - persist-p)) - (never-persist-p - (or never-persist - (cdr (assq :never-persist options)))) - (never-per (if (functionp never-persist-p) - (funcall never-persist-p base-info) - never-persist-p)) - (continue (cdr (assq :continue options))) - info) - (setq info (if (not (memq :persistent base-info)) - (append base-info (list :persistent persist)) - base-info) - info (if (not (memq :never-persist info)) - (append info (list :never-persist never-per)) - info)) - (when - (or style ; :style always "matches", for testing - (not - (memq - nil - (mapcar - #'(lambda (condition) - (cl-case (car condition) - (:severity - (memq severity (cdr condition))) - (:status - (memq current-buffer-status (cdr condition))) - (:mode - (string-match - (cdr condition) - (symbol-name current-major-mode))) - (:category - (and category (string-match - (cdr condition) - (if (stringp category) - category - (symbol-name category))))) - (:title - (and title - (string-match (cdr condition) title))) - (:message - (string-match (cdr condition) message)) - (:predicate - (funcall (cdr condition) info)) - (:icon - (string-match (cdr condition) icon)))) - (nth 0 config))))) - - (alert-send-notification alert-buffer info style-def - persist never-per) - (setq matched t) - (if (or style (not (if (functionp continue) - (funcall continue info) - continue))) - (throw 'finish t))))))) - - (if (and (not matched) alert-default-style) - (alert-send-notification alert-buffer base-info - (cdr (assq alert-default-style - alert-styles))))))) - -(provide 'alert) - -;;; alert.el ends here diff --git a/elpa/alert-20200303.2118/alert.elc b/elpa/alert-20200303.2118/alert.elc deleted file mode 100644 index 4dae11a9d8bb327e2b028980a87aa29801d0ef04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42573 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 -;; Homepage: http://github.com/rolandwalker/anaphora -;; URL: http://raw.githubusercontent.com/rolandwalker/anaphora/master/anaphora.el -;; Package-Version: 20180618.2200 -;; Version: 1.0.4 -;; Last-Updated: 18 Jun 2018 -;; EmacsWiki: Anaphora -;; Keywords: extensions -;; -;;; Commentary: -;; -;; Quickstart -;; -;; (require 'anaphora) -;; -;; (awhen (big-long-calculation) -;; (foo it) ; `it' is provided as -;; (bar it)) ; a temporary variable -;; -;; ;; anonymous function to compute factorial using `self' -;; (alambda (x) (if (= x 0) 1 (* x (self (1- x))))) -;; -;; ;; to fontify `it' and `self' -;; (with-eval-after-load "lisp-mode" -;; (anaphora-install-font-lock-keywords)) -;; -;; Explanation -;; -;; Anaphoric expressions implicitly create one or more temporary -;; variables which can be referred to during the expression. This -;; technique can improve clarity in certain cases. It also enables -;; recursion for anonymous functions. -;; -;; To use anaphora, place the anaphora.el library somewhere -;; Emacs can find it, and add the following to your ~/.emacs file: -;; -;; (require 'anaphora) -;; -;; The following macros are made available -;; -;; `aand' -;; `ablock' -;; `acase' -;; `acond' -;; `aecase' -;; `aetypecase' -;; `aif' -;; `alambda' -;; `alet' -;; `aprog1' -;; `aprog2' -;; `atypecase' -;; `awhen' -;; `awhile' -;; `a+' -;; `a-' -;; `a*' -;; `a/' -;; -;; See Also -;; -;; M-x customize-group RET anaphora RET -;; http://en.wikipedia.org/wiki/On_Lisp -;; http://en.wikipedia.org/wiki/Anaphoric_macro -;; -;; Notes -;; -;; Partially based on examples from the book "On Lisp", by Paul -;; Graham. -;; -;; Compatibility and Requirements -;; -;; GNU Emacs version 26.1 : yes -;; GNU Emacs version 25.x : yes -;; GNU Emacs version 24.x : yes -;; GNU Emacs version 23.x : yes -;; GNU Emacs version 22.x : yes -;; GNU Emacs version 21.x and lower : unknown -;; -;; Bugs -;; -;; TODO -;; -;; better face for it and self -;; -;;; License -;; -;; All code contributed by the author to this library is placed in the -;; public domain. It is the author's belief that the portions adapted -;; from examples in "On Lisp" are in the public domain. -;; -;; Regardless of the copyright status of individual functions, all -;; code herein is free software, and is provided without any express -;; or implied warranties. -;; -;;; Code: -;; - -;;; requirements - -;; for declare, labels, do, block, case, ecase, typecase, etypecase -(require 'cl-lib) - -;;; customizable variables - -;;;###autoload -(defgroup anaphora nil - "Anaphoric macros providing implicit temp variables" - :version "1.0.4" - :link '(emacs-commentary-link :tag "Commentary" "anaphora") - :link '(url-link :tag "GitHub" "http://github.com/rolandwalker/anaphora") - :link '(url-link :tag "EmacsWiki" "http://emacswiki.org/emacs/Anaphora") - :prefix "anaphora-" - :group 'extensions) - -;;;###autoload -(defcustom anaphora-use-long-names-only nil - "Use only long names such as `anaphoric-if' instead of traditional `aif'." - :type 'boolean - :group 'anaphora) - -;;; font-lock - -(defun anaphora-install-font-lock-keywords nil - "Fontify keywords `it' and `self'." - (font-lock-add-keywords 'emacs-lisp-mode `((,(concat "\\<" (regexp-opt '("it" "self") 'paren) "\\>") - 1 font-lock-variable-name-face)) 'append)) - -;;; aliases - -;;;###autoload -(progn - (defun anaphora--install-traditional-aliases (&optional arg) - "Install traditional short aliases for anaphoric macros. - -With negative numeric ARG, remove traditional aliases." - (let ((syms '( - (if . t) - (prog1 . t) - (prog2 . t) - (when . when) - (while . t) - (and . t) - (cond . cond) - (lambda . lambda) - (block . block) - (case . case) - (ecase . ecase) - (typecase . typecase) - (etypecase . etypecase) - (let . let) - (+ . t) - (- . t) - (* . t) - (/ . t) - ))) - (cond - ((and (numberp arg) - (< arg 0)) - (dolist (cell syms) - (when (ignore-errors - (eq (symbol-function (intern-soft (format "a%s" (car cell)))) - (intern-soft (format "anaphoric-%s" (car cell))))) - (fmakunbound (intern (format "a%s" (car cell))))))) - (t - (dolist (cell syms) - (let* ((builtin (car cell)) - (traditional (intern (format "a%s" builtin))) - (long (intern (format "anaphoric-%s" builtin)))) - (defalias traditional long) - (put traditional 'lisp-indent-function - (get builtin 'lisp-indent-function)) - (put traditional 'edebug-form-spec (cdr cell))))))))) - -;;;###autoload -(unless anaphora-use-long-names-only - (anaphora--install-traditional-aliases)) - -;;; macros - -;;;###autoload -(defmacro anaphoric-if (cond then &rest else) - "Like `if', but the result of evaluating COND is bound to `it'. - -The variable `it' is available within THEN and ELSE. - -COND, THEN, and ELSE are otherwise as documented for `if'." - (declare (debug t) - (indent 2)) - `(let ((it ,cond)) - (if it ,then ,@else))) - -;;;###autoload -(defmacro anaphoric-prog1 (first &rest body) - "Like `prog1', but the result of evaluating FIRST is bound to `it'. - -The variable `it' is available within BODY. - -FIRST and BODY are otherwise as documented for `prog1'." - (declare (debug t) - (indent 1)) - `(let ((it ,first)) - (progn ,@body) - it)) - -;;;###autoload -(defmacro anaphoric-prog2 (form1 form2 &rest body) - "Like `prog2', but the result of evaluating FORM2 is bound to `it'. - -The variable `it' is available within BODY. - -FORM1, FORM2, and BODY are otherwise as documented for `prog2'." - (declare (debug t) - (indent 2)) - `(progn - ,form1 - (let ((it ,form2)) - (progn ,@body) - it))) - -;;;###autoload -(defmacro anaphoric-when (cond &rest body) - "Like `when', but the result of evaluating COND is bound to `it'. - -The variable `it' is available within BODY. - -COND and BODY are otherwise as documented for `when'." - (declare (debug when) - (indent 1)) - `(anaphoric-if ,cond - (progn ,@body))) - -;;;###autoload -(defmacro anaphoric-while (test &rest body) - "Like `while', but the result of evaluating TEST is bound to `it'. - -The variable `it' is available within BODY. - -TEST and BODY are otherwise as documented for `while'." - (declare (debug t) - (indent 1)) - `(do ((it ,test ,test)) - ((not it)) - ,@body)) - -;;;###autoload -(defmacro anaphoric-and (&rest conditions) - "Like `and', but the result of the previous condition is bound to `it'. - -The variable `it' is available within all CONDITIONS after the -initial one. - -CONDITIONS are otherwise as documented for `and'. - -Note that some implementations of this macro bind only the first -condition to `it', rather than each successive condition." - (declare (debug t)) - (cond - ((null conditions) - t) - ((null (cdr conditions)) - (car conditions)) - (t - `(anaphoric-if ,(car conditions) (anaphoric-and ,@(cdr conditions)))))) - -;;;###autoload -(defmacro anaphoric-cond (&rest clauses) - "Like `cond', but the result of each condition is bound to `it'. - -The variable `it' is available within the remainder of each of CLAUSES. - -CLAUSES are otherwise as documented for `cond'." - (declare (debug cond)) - (if (null clauses) - nil - (let ((cl1 (car clauses)) - (sym (gensym))) - `(let ((,sym ,(car cl1))) - (if ,sym - (if (null ',(cdr cl1)) - ,sym - (let ((it ,sym)) ,@(cdr cl1))) - (anaphoric-cond ,@(cdr clauses))))))) - -;;;###autoload -(defmacro anaphoric-lambda (args &rest body) - "Like `lambda', but the function may refer to itself as `self'. - -ARGS and BODY are otherwise as documented for `lambda'." - (declare (debug lambda) - (indent defun)) - `(cl-labels ((self ,args ,@body)) - #'self)) - -;;;###autoload -(defmacro anaphoric-block (name &rest body) - "Like `block', but the result of the previous expression is bound to `it'. - -The variable `it' is available within all expressions of BODY -except the initial one. - -NAME and BODY are otherwise as documented for `block'." - (declare (debug block) - (indent 1)) - `(cl-block ,name - ,(funcall (anaphoric-lambda (body) - (cl-case (length body) - (0 nil) - (1 (car body)) - (t `(let ((it ,(car body))) - ,(self (cdr body)))))) - body))) - -;;;###autoload -(defmacro anaphoric-case (expr &rest clauses) - "Like `case', but the result of evaluating EXPR is bound to `it'. - -The variable `it' is available within CLAUSES. - -EXPR and CLAUSES are otherwise as documented for `case'." - (declare (debug case) - (indent 1)) - `(let ((it ,expr)) - (cl-case it ,@clauses))) - -;;;###autoload -(defmacro anaphoric-ecase (expr &rest clauses) - "Like `ecase', but the result of evaluating EXPR is bound to `it'. - -The variable `it' is available within CLAUSES. - -EXPR and CLAUSES are otherwise as documented for `ecase'." - (declare (debug ecase) - (indent 1)) - `(let ((it ,expr)) - (cl-ecase it ,@clauses))) - -;;;###autoload -(defmacro anaphoric-typecase (expr &rest clauses) - "Like `typecase', but the result of evaluating EXPR is bound to `it'. - -The variable `it' is available within CLAUSES. - -EXPR and CLAUSES are otherwise as documented for `typecase'." - (declare (debug typecase) - (indent 1)) - `(let ((it ,expr)) - (cl-typecase it ,@clauses))) - -;;;###autoload -(defmacro anaphoric-etypecase (expr &rest clauses) - "Like `etypecase', but result of evaluating EXPR is bound to `it'. - -The variable `it' is available within CLAUSES. - -EXPR and CLAUSES are otherwise as documented for `etypecase'." - (declare (debug etypecase) - (indent 1)) - `(let ((it ,expr)) - (cl-etypecase it ,@clauses))) - -;;;###autoload -(defmacro anaphoric-let (form &rest body) - "Like `let', but the result of evaluating FORM is bound to `it'. - -FORM and BODY are otherwise as documented for `let'." - (declare (debug let) - (indent 1)) - `(let ((it ,form)) - (progn ,@body))) - -;;;###autoload -(defmacro anaphoric-+ (&rest numbers-or-markers) - "Like `+', but the result of evaluating the previous expression is bound to `it'. - -The variable `it' is available within all expressions after the -initial one. - -NUMBERS-OR-MARKERS are otherwise as documented for `+'." - (declare (debug t)) - (cond - ((null numbers-or-markers) - 0) - (t - `(let ((it ,(car numbers-or-markers))) - (+ it (anaphoric-+ ,@(cdr numbers-or-markers))))))) - -;;;###autoload -(defmacro anaphoric-- (&optional number-or-marker &rest numbers-or-markers) - "Like `-', but the result of evaluating the previous expression is bound to `it'. - -The variable `it' is available within all expressions after the -initial one. - -NUMBER-OR-MARKER and NUMBERS-OR-MARKERS are otherwise as -documented for `-'." - (declare (debug t)) - (cond - ((null number-or-marker) - 0) - ((null numbers-or-markers) - `(- ,number-or-marker)) - (t - `(let ((it ,(car numbers-or-markers))) - (- ,number-or-marker (+ it (anaphoric-+ ,@(cdr numbers-or-markers)))))))) - -;;;###autoload -(defmacro anaphoric-* (&rest numbers-or-markers) - "Like `*', but the result of evaluating the previous expression is bound to `it'. - -The variable `it' is available within all expressions after the -initial one. - -NUMBERS-OR-MARKERS are otherwise as documented for `*'." - (declare (debug t)) - (cond - ((null numbers-or-markers) - 1) - (t - `(let ((it ,(car numbers-or-markers))) - (* it (anaphoric-* ,@(cdr numbers-or-markers))))))) - -;;;###autoload -(defmacro anaphoric-/ (dividend divisor &rest divisors) - "Like `/', but the result of evaluating the previous divisor is bound to `it'. - -The variable `it' is available within all expressions after the -first divisor. - -DIVIDEND, DIVISOR, and DIVISORS are otherwise as documented for `/'." - (declare (debug t)) - (cond - ((null divisors) - `(/ ,dividend ,divisor)) - (t - `(let ((it ,divisor)) - (/ ,dividend (* it (anaphoric-* ,@divisors))))))) - -(provide 'anaphora) - -;; -;; Emacs -;; -;; Local Variables: -;; indent-tabs-mode: nil -;; mangle-whitespace: t -;; require-final-newline: t -;; coding: utf-8 -;; byte-compile-warnings: (not cl-functions redefine) -;; End: -;; -;; LocalWords: Anaphora EXPR awhen COND ARGS alambda ecase typecase -;; LocalWords: etypecase aprog aand acond ablock acase aecase alet -;; LocalWords: atypecase aetypecase -;; - -;;; anaphora.el ends here diff --git a/elpa/anaphora-20180618.2200/anaphora.elc b/elpa/anaphora-20180618.2200/anaphora.elc deleted file mode 100644 index 52398f355f310d3690732be62fa2667f8e5bf07d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10810 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 diff --git a/elpa/archives/gnu/archive-contents b/elpa/archives/gnu/archive-contents deleted file mode 100644 index c7016138..00000000 --- a/elpa/archives/gnu/archive-contents +++ /dev/null @@ -1,2406 +0,0 @@ -(1 - (ace-window . - [(0 9 0) - ((avy - (0 2 0))) - "Quickly switch windows." single - ((:keywords "window" "location") - (:authors - ("Oleh Krehel" . "ohwoeowho@gmail.com")) - (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") - (:url . "https://github.com/abo-abo/ace-window"))]) - (ack . - [(1 8) - nil "interface to ack-like tools" tar - ((:url . "https://github.com/leoliu/ack-el") - (:maintainer "João Távora" . "joaotavora@gmail.com") - (:authors - ("Leo Liu" . "sdl.web@gmail.com")) - (:keywords "tools" "processes" "convenience"))]) - (ada-mode . - [(7 0 1) - ((uniquify-files - (1 0 1)) - (wisi - (3 0 1)) - (emacs - (25 0))) - "major-mode for editing Ada sources" tar - ((:url . "http://www.nongnu.org/ada-mode/") - (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") - (:authors - ("Stephen Leake" . "stephen_leake@stephe-leake.org")) - (:keywords "languages" "ada"))]) - (ada-ref-man . - [(2012 5) - nil "Ada Reference Manual 2012" tar - ((:url . "http://stephe-leake.org/ada/arm.html") - (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org") - (:authors - ("Stephen Leake" . "stephen_leake@member.fsf.org")) - (:keywords "languages" "ada"))]) - (adaptive-wrap . - [(0 7) - nil "Smart line-wrapping with wrap-prefix" single - ((:url . "http://elpa.gnu.org/packages/adaptive-wrap.html") - (:authors - ("Stephen Berman" . "stephen.berman@gmx.net") - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stephen Berman" . "stephen.berman@gmx.net"))]) - (adjust-parens . - [(3 1) - nil "Indent and dedent Lisp code, automatically adjust close parens" tar - ((:maintainer "Barry O'Reilly" . "gundaetiapo@gmail.com") - (:authors - ("Barry O'Reilly" . "gundaetiapo@gmail.com")) - (:url . "http://elpa.gnu.org/packages/adjust-parens.html"))]) - (advice-patch . - [(0 1) - ((emacs - (24 4))) - "Use patches to advise the inside of functions" single - ((:url . "http://elpa.gnu.org/packages/advice-patch.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (aggressive-indent . - [(1 8 3) - ((emacs - (24 1)) - (cl-lib - (0 5))) - "Minor mode to aggressively keep your code always indented" single - ((:keywords "indent" "lisp" "maint" "tools") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") - (:url . "https://github.com/Malabarba/aggressive-indent-mode"))]) - (ahungry-theme . - [(1 10 0) - ((emacs - (24))) - "Ahungry color theme for Emacs. Make sure to (load-theme 'ahungry)." tar - ((:url . "https://github.com/ahungry/color-theme-ahungry") - (:maintainer "Matthew Carter" . "m@ahungry.com") - (:authors - ("Matthew Carter" . "m@ahungry.com")) - (:keywords "ahungry" "palette" "color" "theme" "emacs" "color-theme" "deftheme"))]) - (all . - [(1 0) - nil "Edit all lines matching a given regexp" single - ((:url . "http://elpa.gnu.org/packages/all.html") - (:keywords "matching") - (:authors - ("Per Abrahamsen" . "abraham@dina.kvl.dk")) - (:maintainer "Per Abrahamsen" . "abraham@dina.kvl.dk"))]) - (ampc . - [(0 2) - nil "Asynchronous Music Player Controller" single - ((:url . "http://elpa.gnu.org/packages/ampc.html") - (:keywords "ampc" "mpc" "mpd") - (:authors - ("Christopher Schmidt" . "christopher@ch.ristopher.com")) - (:maintainer nil . "emacs-devel@gnu.org"))]) - (arbitools . - [(0 977) - ((cl-lib - (0 5))) - "Package for chess tournaments administration" single - ((:url . "http://elpa.gnu.org/packages/arbitools.html") - (:authors - ("David Gonzalez Gandara" . "dggandara@member.fsf.org")) - (:maintainer "David Gonzalez Gandara" . "dggandara@member.fsf.org"))]) - (ascii-art-to-unicode . - [(1 12) - nil "a small artist adjunct" single - ((:keywords "ascii" "unicode" "box-drawing") - (:authors - ("Thien-Thi Nguyen" . "ttn@gnu.org")) - (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org") - (:url . "http://www.gnuvola.org/software/aa2u/"))]) - (async . - [(1 9 3) - ((cl-lib - (0 5)) - (nadvice - (0 3))) - "Asynchronous processing in Emacs" tar - ((:url . "https://github.com/jwiegley/emacs-async") - (:maintainer "John Wiegley" . "jwiegley@gmail.com") - (:authors - ("John Wiegley" . "jwiegley@gmail.com")) - (:keywords "async"))]) - (auctex . - [(12 2 0) - ((emacs - (24 1)) - (cl-lib - (0 5))) - "Integrated environment for *TeX*" tar - ((:url . "http://www.gnu.org/software/auctex/") - (:maintainer nil . "auctex-devel@gnu.org") - (:keywords "tex" "latex" "texinfo" "context" "doctex" "preview-latex"))]) - (aumix-mode . - [(7) - nil "run the aumix program in a buffer" single - ((:keywords "multimedia" "mixer" "aumix") - (:authors - ("Kevin Ryde" . "user42_kevin@yahoo.com.au")) - (:maintainer "Kevin Ryde" . "user42_kevin@yahoo.com.au") - (:url . "http://user42.tuxfamily.org/aumix-mode/index.html"))]) - (auto-correct . - [(1 1 4) - nil "Remembers and automatically fixes past corrections" single - ((:url . "http://elpa.gnu.org/packages/auto-correct.html") - (:keywords "editing") - (:authors - ("Ian Dunn" . "dunni@gnu.org")) - (:maintainer "Ian Dunn" . "dunni@gnu.org"))]) - (auto-overlays . - [(0 10 9) - nil "Automatic regexp-delimited overlays" tar - ((:url . "http://www.dr-qubit.org/emacs.php") - (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") - (:authors - ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) - (:keywords "extensions"))]) - (avy . - [(0 5 0) - ((emacs - (24 1)) - (cl-lib - (0 5))) - "Jump to arbitrary positions in visible text and select text quickly." tar - ((:url . "https://github.com/abo-abo/avy") - (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") - (:authors - ("Oleh Krehel" . "ohwoeowho@gmail.com")) - (:keywords "point" "location"))]) - (bbdb . - [(3 2) - ((emacs - (24))) - "core of BBDB" tar - ((:maintainer "Roland Winkler" . "winkler@gnu.org") - (:url . "http://elpa.gnu.org/packages/bbdb.html"))]) - (beacon . - [(1 3 3) - ((seq - (2 14))) - "Highlight the cursor whenever the window scrolls" single - ((:keywords "convenience") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") - (:url . "https://github.com/Malabarba/beacon"))]) - (bluetooth . - [(0 1 2) - ((emacs - (25 1)) - (dash - (2 12 0))) - "A Major mode for Bluetooth devices" single - ((:keywords "hardware") - (:authors - ("Raffael Stocker" . "r.stocker@mnet-mail.de")) - (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de") - (:url . "https://gitlab.com/rstocker/emacs-bluetooth"))]) - (bnf-mode . - [(0 4 4) - ((cl-lib - (0 5)) - (emacs - (24 3))) - "Major mode for editing BNF grammars." tar - ((:url . "https://github.com/sergeyklay/bnf-mode") - (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") - (:authors - ("Serghei Iakovlev" . "egrep@protonmail.ch")) - (:keywords "languages"))]) - (brief . - [(5 87) - nil "Brief Editor Emulator (Brief Mode)" tar - ((:maintainer "Luke Lee" . "luke.yx.lee@gmail.com") - (:authors - ("Luke Lee" . "luke.yx.lee@gmail.com")) - (:keywords "brief" "emulations" "crisp") - (:url . "http://elpa.gnu.org/packages/brief.html"))]) - (buffer-expose . - [(0 4 3) - ((emacs - (25)) - (cl-lib - (0 5))) - "Visual buffer switching using a window grid" single - ((:keywords "convenience") - (:authors - ("Clemens Radermacher" . "clemera@posteo.net")) - (:maintainer "Clemens Radermacher" . "clemera@posteo.net") - (:url . "https://github.com/clemera/buffer-expose"))]) - (bug-hunter . - [(1 3 1) - ((seq - (1 3)) - (cl-lib - (0 5))) - "Hunt down errors by bisecting elisp files" single - ((:keywords "lisp") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") - (:url . "https://github.com/Malabarba/elisp-bug-hunter"))]) - (caps-lock . - [(1 0) - nil "Caps-lock as a minor mode" single - ((:url . "http://elpa.gnu.org/packages/caps-lock.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (captain . - [(1 0 3) - nil "CAPiTalization is Automatic IN emacs" single - ((:url . "http://elpa.gnu.org/packages/captain.html") - (:keywords "editing") - (:authors - ("Ian Dunn" . "dunni@gnu.org")) - (:maintainer "Ian Dunn" . "dunni@gnu.org"))]) - (chess . - [(2 0 4) - ((cl-lib - (0 5))) - "Play chess in GNU Emacs" tar - ((:maintainer "Mario Lang" . "mlang@delysid.org") - (:authors - ("John Wiegley" . "johnw@gnu.org")) - (:keywords "games") - (:url . "http://elpa.gnu.org/packages/chess.html"))]) - (cl-generic . - [(0 3) - nil "Forward cl-generic compatibility for Emacs<25" single - ((:url . "http://elpa.gnu.org/packages/cl-generic.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (cl-lib . - [(0 6 1) - nil "Forward cl-lib compatibility library for Emacs<24.3" single - ((:url . "http://elpa.gnu.org/packages/cl-lib.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (cl-print . - [(1 0) - ((emacs - (25))) - "CL-style generic printing" single - ((:url . "http://elpa.gnu.org/packages/cl-print.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (clipboard-collector . - [(0 2) - ((emacs - (25))) - "Collect clipboard entries according to regex rules" single - ((:keywords "convenience") - (:authors - ("Clemens Radermacher" . "clemera@posteo.net")) - (:maintainer "Clemens Radermacher" . "clemera@posteo.net") - (:url . "https://github.com/clemera/clipboard-collector"))]) - (cobol-mode . - [(1 0 0) - ((cl-lib - (0 5))) - "Mode for editing COBOL code" single - ((:url . "http://elpa.gnu.org/packages/cobol-mode.html") - (:keywords "languages") - (:authors - ("Edward Hart" . "edward.dan.hart@gmail.com")) - (:maintainer "Edward Hart" . "edward.dan.hart@gmail.com"))]) - (coffee-mode . - [(0 4 1 1) - nil "Major mode for CoffeeScript files" single - ((:keywords "coffeescript" "major" "mode") - (:authors - ("Chris Wanstrath" . "chris@ozmm.org")) - (:maintainer "Chris Wanstrath" . "chris@ozmm.org") - (:url . "http://github.com/defunkt/coffee-mode"))]) - (compact-docstrings . - [(0 1) - nil "Shrink blank lines in docstrings and doc comments" single - ((:keywords "convenience" "faces" "lisp" "maint" "c") - (:authors - ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) - (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") - (:url . "https://github.com/cpitclaudel/compact-docstrings"))]) - (company . - [(0 9 12) - ((emacs - (24 3))) - "Modular text completion framework" tar - ((:url . "http://company-mode.github.io/") - (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") - (:authors - ("Nikolaj Schumacher")) - (:keywords "abbrev" "convenience" "matching"))]) - (company-ebdb . - [(1 1) - ((company - (0 9 4)) - (ebdb - (0 2))) - "company-mode completion backend for EBDB in message-mode" single - ((:url . "http://elpa.gnu.org/packages/company-ebdb.html") - (:authors - ("Jan Tatarik" . "jan.tatarik@gmail.com")) - (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net"))]) - (company-math . - [(1 3) - ((company - (0 8 0)) - (math-symbol-lists - (1 2))) - "Completion backends for unicode math symbols and latex tags" tar - ((:url . "https://github.com/vspinu/company-math") - (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") - (:authors - ("Vitalie Spinu" . "spinuvit@gmail.com")) - (:keywords "unicode" "symbols" "completion"))]) - (company-statistics . - [(0 2 3) - ((emacs - (24 3)) - (company - (0 8 5))) - "Sort candidates using completion history" tar - ((:url . "https://github.com/company-mode/company-statistics") - (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com") - (:authors - ("Ingo Lohmar" . "i.lohmar@gmail.com")) - (:keywords "abbrev" "convenience" "matching"))]) - (context-coloring . - [(8 1 0) - ((emacs - (24 3))) - "Highlight by scope" tar - ((:url . "https://github.com/jacksonrayhamilton/context-coloring") - (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com") - (:authors - ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) - (:keywords "convenience" "faces" "tools"))]) - (crisp . - [(1 3 6) - nil "CRiSP/Brief Emacs emulator" single - ((:url . "http://elpa.gnu.org/packages/crisp.html") - (:keywords "emulations" "brief" "crisp") - (:authors - ("Gary D. Foster" . "Gary.Foster@Corp.Sun.COM")) - (:maintainer "Luke Lee" . "luke.yx.lee@gmail.com"))]) - (csv-mode . - [(1 12) - ((emacs - (24 1)) - (cl-lib - (0 5))) - "Major mode for editing comma/char separated values" tar - ((:maintainer nil . "emacs-devel@gnu.org") - (:authors - ("\"Francis J. Wright\"" . "F.J.Wright@qmul.ac.uk")) - (:keywords "convenience") - (:url . "http://elpa.gnu.org/packages/csv-mode.html"))]) - (cycle-quotes . - [(0 1) - nil "Cycle between quote styles" tar - ((:maintainer "Simen Heggestøyl" . "simenheg@gmail.com") - (:authors - ("Simen Heggestøyl" . "simenheg@gmail.com")) - (:keywords "convenience") - (:url . "http://elpa.gnu.org/packages/cycle-quotes.html"))]) - (darkroom . - [(0 2) - ((cl-lib - (0 5))) - "Remove visual distractions and focus on writing" single - ((:url . "http://elpa.gnu.org/packages/darkroom.html") - (:keywords "convenience" "emulations") - (:authors - ("João Távora" . "joaotavora@gmail.com")) - (:maintainer "João Távora" . "joaotavora@gmail.com"))]) - (dash . - [(2 12 0) - nil "A modern list library for Emacs" tar - ((:maintainer "Magnar Sveen" . "magnars@gmail.com") - (:authors - ("Magnar Sveen" . "magnars@gmail.com")) - (:keywords "lists") - (:url . "http://elpa.gnu.org/packages/dash.html"))]) - (dbus-codegen . - [(0 1) - ((cl-lib - (0 5))) - "Lisp code generation for D-Bus." single - ((:url . "http://elpa.gnu.org/packages/dbus-codegen.html") - (:keywords "comm" "dbus" "convenience") - (:authors - ("Daiki Ueno" . "ueno@gnu.org")) - (:maintainer nil . "emacs-devel@gnu.org"))]) - (debbugs . - [(0 22) - ((emacs - (25 1)) - (soap-client - (3 1 5))) - "SOAP library to access debbugs servers" tar - ((:maintainer "Michael Albinus" . "michael.albinus@gmx.de") - (:authors - ("Michael Albinus" . "michael.albinus@gmx.de")) - (:keywords "comm" "hypermedia") - (:url . "http://elpa.gnu.org/packages/debbugs.html"))]) - (delight . - [(1 5) - ((cl-lib - (0 5)) - (nadvice - (0 3))) - "A dimmer switch for your lighter text" single - ((:keywords "convenience") - (:authors - ("Phil Sainty" . "psainty@orcon.net.nz")) - (:maintainer "Phil Sainty" . "psainty@orcon.net.nz") - (:url . "https://savannah.nongnu.org/projects/delight"))]) - (dict-tree . - [(0 14) - ((trie - (0 3)) - (tNFA - (0 1 1)) - (heap - (0 3))) - "Dictionary data structure" single - ((:keywords "extensions" "matching" "data structures trie" "tree" "dictionary" "completion" "regexp") - (:authors - ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) - (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") - (:url . "http://www.dr-qubit.org/emacs.php"))]) - (diff-hl . - [(1 8 7) - ((cl-lib - (0 2)) - (emacs - (24 3))) - "Highlight uncommitted changes using VC" tar - ((:url . "https://github.com/dgutov/diff-hl") - (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") - (:authors - ("Dmitry Gutov" . "dgutov@yandex.ru")) - (:keywords "vc" "diff"))]) - (diffview . - [(1 0) - nil "View diffs in side-by-side format" single - ((:keywords "convenience" "diff") - (:authors - ("Mitchel Humpherys" . "mitch.special@gmail.com")) - (:maintainer "Mitchel Humpherys" . "mitch.special@gmail.com") - (:url . "https://github.com/mgalgs/diffview-mode"))]) - (dired-du . - [(0 5 2) - ((emacs - (24 4)) - (cl-lib - (0 5))) - "Dired with recursive directory sizes" tar - ((:maintainer "Tino Calancha" . "tino.calancha@gmail.com") - (:authors - ("Tino Calancha" . "tino.calancha@gmail.com")) - (:keywords "files" "unix" "convenience") - (:url . "http://elpa.gnu.org/packages/dired-du.html"))]) - (dired-git-info . - [(0 3 1) - ((emacs - (25))) - "Show git info in dired" single - ((:keywords "dired" "files") - (:authors - ("Clemens Radermacher" . "clemera@posteo.net")) - (:maintainer "Clemens Radermacher" . "clemera@posteo.net") - (:url . "https://github.com/clemera/dired-git-info"))]) - (disk-usage . - [(1 3 3) - ((emacs - (26 1))) - "Sort and browse disk usage listings" single - ((:keywords "files" "convenience" "tools") - (:authors - ("Pierre Neidhardt" . "mail@ambrevar.xyz")) - (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") - (:url . "https://gitlab.com/Ambrevar/emacs-disk-usage"))]) - (dismal . - [(1 5) - ((cl-lib - (0))) - "Dis Mode Ain't Lotus: Spreadsheet program Emacs" tar - ((:maintainer "UnMaintainer" . "emacs-devel@gnu.org") - (:authors - (nil . "David Fox, fox@cs.nyu.edu") - (nil . "Frank E. Ritter, ritter@cs.cmu.edu")) - (:url . "http://elpa.gnu.org/packages/dismal.html"))]) - (djvu . - [(1 1) - nil "Edit and view Djvu files via djvused" single - ((:url . "http://elpa.gnu.org/packages/djvu.html") - (:keywords "files" "wp") - (:authors - ("Roland Winkler" . "winkler@gnu.org")) - (:maintainer "Roland Winkler" . "winkler@gnu.org"))]) - (docbook . - [(0 1) - nil "Info-like viewer for DocBook" single - ((:url . "http://elpa.gnu.org/packages/docbook.html") - (:keywords "docs" "help") - (:authors - ("Chong Yidong" . "cyd@gnu.org")) - (:maintainer "Chong Yidong" . "cyd@gnu.org"))]) - (dts-mode . - [(0 1 0) - nil "Major mode for Device Tree source files" single - ((:url . "http://elpa.gnu.org/packages/dts-mode.html") - (:keywords "languages") - (:authors - ("Ben Gamari" . "ben@smart-cactus.org")) - (:maintainer "Ben Gamari" . "ben@smart-cactus.org"))]) - (easy-kill . - [(0 9 3) - ((emacs - (24)) - (cl-lib - (0 5))) - "kill & mark things easily" tar - ((:url . "https://github.com/leoliu/easy-kill") - (:maintainer "Leo Liu" . "sdl.web@gmail.com") - (:authors - ("Leo Liu" . "sdl.web@gmail.com")) - (:keywords "killing" "convenience"))]) - (ebdb . - [(0 6 16) - ((emacs - (25 1)) - (cl-lib - (0 5)) - (seq - (2 15))) - "Contact management package" tar - ((:url . "https://github.com/girzel/ebdb") - (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") - (:authors - ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) - (:keywords "convenience" "mail"))]) - (ebdb-gnorb . - [(1 0 2) - ((gnorb - (1 1 0)) - (ebdb - (0 2))) - "Utilities for connecting EBDB to Gnorb" single - ((:url . "http://elpa.gnu.org/packages/ebdb-gnorb.html") - (:authors - ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) - (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net"))]) - (ebdb-i18n-chn . - [(1 3) - ((pyim - (1 6 0)) - (ebdb - (0 6 17))) - "China-specific internationalization support for EBDB" single - ((:url . "http://elpa.gnu.org/packages/ebdb-i18n-chn.html") - (:authors - ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) - (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net"))]) - (ediprolog . - [(1 2) - nil "Emacs Does Interactive Prolog" single - ((:keywords "languages" "processes") - (:authors - ("Markus Triska" . "triska@metalevel.at")) - (:maintainer "Markus Triska" . "triska@metalevel.at") - (:url . "https://www.metalevel.at/ediprolog/"))]) - (eev . - [(20200224) - ((emacs - (24 1))) - "Support for e-scripts (eepitch blocks, elisp hyperlinks, etc)" tar - ((:url . "http://angg.twu.net/#eev") - (:maintainer "Eduardo Ochs" . "eduardoochs@gmail.com") - (:authors - ("Eduardo Ochs" . "eduardoochs@gmail.com")) - (:keywords "lisp" "e-scripts"))]) - (eglot . - [(1 6) - ((emacs - (26 1)) - (jsonrpc - (1 0 7)) - (flymake - (1 0 5))) - "Client for Language Server Protocol (LSP) servers" tar - ((:url . "https://github.com/joaotavora/eglot") - (:maintainer "João Távora" . "joaotavora@gmail.com") - (:authors - ("João Távora" . "joaotavora@gmail.com")) - (:keywords "convenience" "languages"))]) - (el-search . - [(1 12 6 1) - ((emacs - (25)) - (stream - (2 2 4)) - (cl-print - (1 0))) - "Expression based interactive search for Emacs Lisp" tar - ((:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") - (:authors - ("Michael Heerdegen" . "michael_heerdegen@web.de")) - (:keywords "lisp") - (:url . "http://elpa.gnu.org/packages/el-search.html"))]) - (eldoc-eval . - [(0 1) - nil "Enable eldoc support when minibuffer is in use." single - ((:url . "http://elpa.gnu.org/packages/eldoc-eval.html") - (:authors - ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) - (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))]) - (electric-spacing . - [(5 0) - nil "Insert operators with surrounding spaces smartly" single - ((:url . "http://elpa.gnu.org/packages/electric-spacing.html") - (:authors - ("William Xu" . "william.xwl@gmail.com")) - (:maintainer "William Xu" . "william.xwl@gmail.com"))]) - (elisp-benchmarks . - [(1 4) - nil "elisp benchmarks collection" tar - ((:maintainer "Andrea Corallo" . "akrl@sdf.org") - (:authors - ("Andrea Corallo" . "akrl@sdf.org")) - (:keywords "languages" "lisp") - (:url . "http://elpa.gnu.org/packages/elisp-benchmarks.html"))]) - (enwc . - [(2 0) - ((emacs - (25 1))) - "The Emacs Network Client" tar - ((:url . "https://savannah.nongnu.org/p/enwc") - (:maintainer "Ian Dunn" . "dunni@gnu.org") - (:authors - ("Ian Dunn" . "dunni@gnu.org")) - (:keywords "external" "network" "wicd" "manager" "nm"))]) - (epoch-view . - [(0 0 1) - nil "Minor mode to visualize epoch timestamps" single - ((:url . "http://elpa.gnu.org/packages/epoch-view.html") - (:keywords "data" "timestamp" "epoch" "unix") - (:authors - ("Ted Zlatanov" . "tzz@lifelogs.com")) - (:maintainer "Ted Zlatanov" . "tzz@lifelogs.com"))]) - (ergoemacs-mode . - [(5 16 10 12) - ((emacs - (24 1)) - (undo-tree - (0 6 5)) - (cl-lib - (0 5))) - "Emacs mode based on common modern interface and ergonomics." tar - ((:url . "https://github.com/ergoemacs/ergoemacs-mode") - (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") - (:authors - ("Xah Lee" . "xah@xahlee.org") - ("David Capello" . "davidcapello@gmail.com") - ("Matthew L. Fidler" . "matthew.fidler@gmail.com")) - (:keywords "convenience"))]) - (excorporate . - [(0 8 3) - ((emacs - (24 1)) - (fsm - (0 2 1)) - (soap-client - (3 1 5)) - (url-http-ntlm - (2 0 4)) - (nadvice - (0 3))) - "Exchange Web Services (EWS) integration" tar - ((:url . "https://www.fitzsim.org/blog/") - (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") - (:authors - ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) - (:keywords "calendar"))]) - (expand-region . - [(0 11 0) - nil "Increase selected region by semantic units." tar - ((:url . "https://github.com/magnars/expand-region.el") - (:maintainer "Magnar Sveen" . "magnars@gmail.com") - (:authors - ("Magnar Sveen" . "magnars@gmail.com")) - (:keywords "marking" "region"))]) - (exwm . - [(0 23) - ((xelb - (0 18))) - "Emacs X Window Manager" tar - ((:url . "https://github.com/ch11ng/exwm") - (:maintainer "Chris Feng" . "chris.w.feng@gmail.com") - (:authors - ("Chris Feng" . "chris.w.feng@gmail.com")) - (:keywords "unix"))]) - (f90-interface-browser . - [(1 1) - nil "Parse and browse f90 interfaces" single - ((:authors - ("Lawrence Mitchell" . "wence@gmx.li")) - (:maintainer "Lawrence Mitchell" . "wence@gmx.li") - (:url . "http://github.com/wence-/f90-iface/"))]) - (filladapt . - [(2 12 2) - ((emacs - (24 4))) - "Adaptive fill" single - ((:url . "http://elpa.gnu.org/packages/filladapt.html") - (:authors - ("Kyle E. Jones" . "kyle_jones@wonderworks.com")) - (:maintainer nil . "emacs-devel@gnu.org"))]) - (flylisp . - [(0 2) - ((emacs - (24 1)) - (cl-lib - (0 4))) - "Color unbalanced parentheses and parentheses inconsistent with indentation" single - ((:url . "http://elpa.gnu.org/packages/flylisp.html") - (:authors - ("Barry O'Reilly" . "gundaetiapo@gmail.com")) - (:maintainer "Barry O'Reilly" . "gundaetiapo@gmail.com"))]) - (flymake . - [(1 0 8) - ((emacs - (26 1))) - "A universal on-the-fly syntax checker" single - ((:url . "http://elpa.gnu.org/packages/flymake.html") - (:keywords "c" "languages" "tools") - (:authors - ("Pavel Kobyakov" . "pk_at_work@yahoo.com")) - (:maintainer "João Távora" . "joaotavora@gmail.com"))]) - (fountain-mode . - [(2 7 3) - ((emacs - (24 5))) - "Major mode for screenwriting in Fountain markup" single - ((:keywords "wp" "text") - (:authors - ("Paul W. Rankin" . "pwr@sdf.org")) - (:maintainer "Paul W. Rankin" . "pwr@sdf.org") - (:url . "https://fountain-mode.org"))]) - (frame-tabs . - [(1 1) - nil "show buffer tabs in side window" single - ((:url . "http://elpa.gnu.org/packages/frame-tabs.html") - (:keywords "frames" "tabs") - (:authors - ("Martin Rudalics" . "rudalics@gmx.at")) - (:maintainer "Martin Rudalics" . "rudalics@gmx.at"))]) - (frog-menu . - [(0 2 10) - ((emacs - (26)) - (avy - (0 4)) - (posframe - (0 4))) - "Quickly pick items from ad hoc menus" single - ((:keywords "convenience") - (:authors - ("Clemens Radermacher" . "clemera@posteo.net")) - (:maintainer "Clemens Radermacher" . "clemera@posteo.net") - (:url . "https://github.com/clemera/frog-menu"))]) - (fsm . - [(0 2 1) - ((emacs - (24 1)) - (cl-lib - (0 5))) - "state machine library" single - ((:url . "http://elpa.gnu.org/packages/fsm.html") - (:keywords "extensions") - (:authors - ("Magnus Henoch" . "magnus.henoch@gmail.com")) - (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))]) - (ggtags . - [(0 8 13) - ((emacs - (24)) - (cl-lib - (0 5))) - "emacs frontend to GNU Global source code tagging system" single - ((:keywords "tools" "convenience") - (:authors - ("Leo Liu" . "sdl.web@gmail.com")) - (:maintainer "Leo Liu" . "sdl.web@gmail.com") - (:url . "https://github.com/leoliu/ggtags"))]) - (gited . - [(0 6 0) - ((emacs - (24 4)) - (cl-lib - (0 5))) - "Operate on Git branches like dired" tar - ((:maintainer "Tino Calancha" . "tino.calancha@gmail.com") - (:authors - ("Tino Calancha" . "tino.calancha@gmail.com")) - (:keywords "git" "vc" "convenience") - (:url . "http://elpa.gnu.org/packages/gited.html"))]) - (gle-mode . - [(1 1) - ((cl-lib - (0 5))) - "Major mode to edit Graphics Layout Engine files" single - ((:url . "http://elpa.gnu.org/packages/gle-mode.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (gnome-c-style . - [(0 1) - nil "minor mode for editing GNOME-style C source code" tar - ((:maintainer "Daiki Ueno" . "ueno@gnu.org") - (:authors - ("Daiki Ueno" . "ueno@gnu.org")) - (:keywords "gnome" "c" "coding style") - (:url . "http://elpa.gnu.org/packages/gnome-c-style.html"))]) - (gnorb . - [(1 6 6) - ((cl-lib - (0 5))) - "Glue code between Gnus, Org, and BBDB" tar - ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") - (:authors - ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) - (:keywords "mail" "org" "gnus" "bbdb" "todo" "task") - (:url . "http://elpa.gnu.org/packages/gnorb.html"))]) - (gnu-elpa-keyring-update . - [(2019 3) - nil "Update Emacs's GPG keyring for GNU ELPA" tar - ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:keywords "maint" "tools") - (:url . "http://elpa.gnu.org/packages/gnu-elpa-keyring-update.html"))]) - (gnugo . - [(3 1 0) - ((ascii-art-to-unicode - (1 5)) - (xpm - (1 0 1)) - (cl-lib - (0 5))) - "play GNU Go in a buffer" tar - ((:url . "http://www.gnuvola.org/software/gnugo/") - (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org") - (:authors - ("Thien-Thi Nguyen" . "ttn@gnu.org")) - (:keywords "games" "processes"))]) - (gnus-mock . - [(0 4 4) - nil "Mock Gnus installation for testing" tar - ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") - (:authors - ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) - (:url . "http://elpa.gnu.org/packages/gnus-mock.html"))]) - (gpastel . - [(0 5 0) - ((emacs - (25 1))) - "Integrates GPaste with the kill-ring" single - ((:keywords "tools") - (:authors - ("Damien Cassou" . "damien@cassou.me")) - (:maintainer "Damien Cassou" . "damien@cassou.me") - (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))]) - (greader . - [(0 1) - ((emacs - (25))) - "gnamù reader, a reader with espeak tts" tar - ((:maintainer "Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com") - (:authors - ("Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com")) - (:keywords "tools" "accessibility") - (:url . "http://elpa.gnu.org/packages/greader.html"))]) - (guess-language . - [(0 0 1) - ((cl-lib - (0 5)) - (emacs - (24)) - (nadvice - (0 1))) - "Robust automatic language detection" single - ((:authors - ("Titus von der Malsburg" . "malsburg@posteo.de")) - (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") - (:url . "https://github.com/tmalsburg/guess-language.el"))]) - (heap . - [(0 5) - nil "Heap (a.k.a. priority queue) data structure" single - ((:keywords "extensions" "data structures" "heap" "priority queue") - (:authors - ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) - (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") - (:url . "http://www.dr-qubit.org/emacs.php"))]) - (highlight-escape-sequences . - [(0 4) - nil "Highlight escape sequences" single - ((:keywords "convenience") - (:authors - ("Dmitry Gutov" . "dgutov@yandex.ru") - ("Pavel Matcula" . "dev.plvlml@gmail.com")) - (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") - (:url . "https://github.com/dgutov/highlight-escape-sequences"))]) - (hook-helpers . - [(1 1 1) - ((emacs - (25 1))) - "Anonymous, modifiable hook functions" tar - ((:url . "https://savannah.nongnu.org/projects/hook-helpers-el/") - (:maintainer "Ian Dunn" . "dunni@gnu.org") - (:authors - ("Ian Dunn" . "dunni@gnu.org")) - (:keywords "development" "hooks"))]) - (html5-schema . - [(0 1) - nil "Add HTML5 schemas for use by nXML" tar - ((:url . "https://github.com/validator/validator") - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:keywords "html" "xml"))]) - (hydra . - [(0 14 0) - ((cl-lib - (0 5))) - "Make bindings that stick around." tar - ((:url . "https://github.com/abo-abo/hydra") - (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") - (:authors - ("Oleh Krehel" . "ohwoeowho@gmail.com")) - (:keywords "bindings"))]) - (hyperbole . - [(7 0 6) - ((emacs - (24 4))) - "GNU Hyperbole: The Everyday Hypertextual Information Manager" tar - ((:url . "http://www.gnu.org/software/hyperbole") - (:maintainer "Bob Weiner , Mats Lidell" . "matsl@gnu.org") - (:authors - ("Bob Weiner")) - (:keywords "comm" "convenience" "files" "frames" "hypermedia" "languages" "mail" "matching" "mouse" "multimedia" "outlines" "tools" "wp"))]) - (ioccur . - [(2 4) - ((emacs - (24)) - (cl-lib - (0 5))) - "Incremental occur" single - ((:authors - ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) - (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") - (:url . "https://github.com/thierryvolpiatto/ioccur"))]) - (iterators . - [(0 1 1) - ((emacs - (25))) - "Functions for working with iterators" single - ((:url . "http://elpa.gnu.org/packages/iterators.html") - (:keywords "extensions" "elisp") - (:authors - ("Michael Heerdegen" . "michael_heerdegen@web.de")) - (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de"))]) - (ivy . - [(0 13 0) - ((emacs - (24 5))) - "Incremental Vertical completYon" tar - ((:url . "https://github.com/abo-abo/swiper") - (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") - (:authors - ("Oleh Krehel" . "ohwoeowho@gmail.com")) - (:keywords "matching"))]) - (ivy-explorer . - [(0 3 2) - ((emacs - (25)) - (ivy - (0 10 0))) - "Dynamic file browsing grid using ivy" single - ((:keywords "convenience" "files" "matching") - (:authors - ("Clemens Radermacher" . "clemera@posteo.net")) - (:maintainer "Clemens Radermacher" . "clemera@posteo.net") - (:url . "https://github.com/clemera/ivy-explorer"))]) - (javaimp . - [(0 7 1) - nil "Add and reorder Java import statements in Maven/Gradle projects" tar - ((:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm") - (:authors - ("Filipp Gunbin" . "fgunbin@fastmail.fm")) - (:keywords "java" "maven" "gradle" "programming") - (:url . "http://elpa.gnu.org/packages/javaimp.html"))]) - (jgraph-mode . - [(1 1) - ((cl-lib - (0 5))) - "Major mode for Jgraph files" single - ((:url . "http://elpa.gnu.org/packages/jgraph-mode.html") - (:keywords "tex" "wp") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (js2-mode . - [(20190219) - ((emacs - (24 1)) - (cl-lib - (0 5))) - "Improved JavaScript editing mode" tar - ((:url . "https://github.com/mooz/js2-mode/") - (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") - (:authors - ("Steve Yegge" . "steve.yegge@gmail.com") - ("mooz" . "stillpedant@gmail.com") - ("Dmitry Gutov" . "dgutov@yandex.ru")) - (:keywords "languages" "javascript"))]) - (json-mode . - [(0 1) - ((emacs - (25 1))) - "Major mode for editing JSON files" single - ((:url . "http://elpa.gnu.org/packages/json-mode.html") - (:keywords "data") - (:authors - ("Simen Heggestøyl" . "simenheg@gmail.com")) - (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com"))]) - (jsonrpc . - [(1 0 9) - ((emacs - (25 2))) - "JSON-RPC library" single - ((:url . "http://elpa.gnu.org/packages/jsonrpc.html") - (:keywords "processes" "languages" "extensions") - (:authors - ("João Távora" . "joaotavora@gmail.com")) - (:maintainer "João Távora" . "joaotavora@gmail.com"))]) - (jumpc . - [(3 0) - nil "jump to previous insertion points" single - ((:url . "http://elpa.gnu.org/packages/jumpc.html") - (:authors - ("Ivan Kanis" . "ivan@kanis.fr")) - (:maintainer "Ivan Kanis" . "ivan@kanis.fr"))]) - (kmb . - [(0 1) - ((emacs - (24 1))) - "Kill buffers matching a regexp w/o confirmation" single - ((:url . "http://elpa.gnu.org/packages/kmb.html") - (:keywords "lisp" "convenience") - (:authors - ("Tino Calancha" . "tino.calancha@gmail.com")) - (:maintainer "Tino Calancha"))]) - (landmark . - [(1 0) - nil "Neural-network robot that learns landmarks" single - ((:url . "http://elpa.gnu.org/packages/landmark.html") - (:keywords "games" "neural network" "adaptive search" "chemotaxis") - (:authors - ("Terrence Brannon" . "metaperl@gmail.com")) - (:maintainer nil . "emacs-devel@gnu.org"))]) - (let-alist . - [(1 0 6) - ((emacs - (24 1))) - "Easily let-bind values of an assoc-list by their names" single - ((:url . "http://elpa.gnu.org/packages/let-alist.html") - (:keywords "extensions" "lisp") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) - (lex . - [(1 1) - nil "Lexical analyser construction" tar - ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:url . "http://elpa.gnu.org/packages/lex.html"))]) - (lmc . - [(1 4) - ((emacs - (24)) - (cl-lib - (0 5))) - "Little Man Computer in Elisp" single - ((:url . "http://elpa.gnu.org/packages/lmc.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (load-dir . - [(0 0 5) - ((cl-lib - (0 5))) - "Load all Emacs Lisp files in a given directory" single - ((:url . "http://elpa.gnu.org/packages/load-dir.html") - (:keywords "lisp" "files" "convenience") - (:maintainer "Teodor Zlatanov" . "tzz@lifelogs.com"))]) - (load-relative . - [(1 3 1) - nil "Relative file load (within a multi-file Emacs package)" single - ((:keywords "internal") - (:authors - ("Rocky Bernstein" . "rocky@gnu.org")) - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:url . "http://github.com/rocky/emacs-load-relative"))]) - (loc-changes . - [(1 2) - nil "keep track of positions even after buffer changes" single - ((:authors - ("Rocky Bernstein" . "rocky@gnu.org")) - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:url . "http://github.com/rocky/emacs-loc-changes"))]) - (loccur . - [(1 2 4) - ((emacs - (24 3))) - "Perform an occur-like folding in current buffer" single - ((:keywords "matching") - (:authors - ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) - (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") - (:url . "https://github.com/fourier/loccur"))]) - (map . - [(2 1) - ((emacs - (25))) - "Map manipulation functions" single - ((:url . "http://elpa.gnu.org/packages/map.html") - (:keywords "convenience" "map" "hash-table" "alist" "array") - (:authors - ("Nicolas Petton" . "nicolas@petton.fr")) - (:maintainer nil . "emacs-devel@gnu.org"))]) - (markchars . - [(0 2 1) - nil "Mark chars fitting certain characteristics" single - ((:url . "http://elpa.gnu.org/packages/markchars.html") - (:authors - ("Lennart Borgman" . "lennart.borgman@gmail.com")) - (:maintainer "Lennart Borgman" . "lennart.borgman@gmail.com"))]) - (math-symbol-lists . - [(1 2 1) - nil "Lists of Unicode math symbols and latex commands" single - ((:keywords "unicode" "symbols" "mathematics") - (:authors - ("Vitalie Spinu" . "spinuvit@gmail.com")) - (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") - (:url . "https://github.com/vspinu/math-symbol-lists"))]) - (memory-usage . - [(0 2) - nil "Analyze the memory usage of Emacs in various ways" single - ((:url . "http://elpa.gnu.org/packages/memory-usage.html") - (:keywords "maint") - (:authors - ("Stefan Monnier" . "monnier@cs.yale.edu")) - (:maintainer "Stefan Monnier" . "monnier@cs.yale.edu"))]) - (metar . - [(0 3) - ((cl-lib - (0 5))) - "Retrieve and decode METAR weather information" single - ((:url . "http://elpa.gnu.org/packages/metar.html") - (:keywords "comm") - (:authors - ("Mario Lang" . "mlang@delysid.org")) - (:maintainer "Mario Lang" . "mlang@delysid.org"))]) - (midi-kbd . - [(0 2) - ((emacs - (25))) - "Create keyboard events from Midi input" single - ((:url . "http://elpa.gnu.org/packages/midi-kbd.html") - (:keywords "convenience" "hardware" "multimedia") - (:authors - ("David Kastrup" . "dak@gnu.org")) - (:maintainer "David Kastrup" . "dak@gnu.org"))]) - (mines . - [(1 6) - ((emacs - (24 4)) - (cl-lib - (0 5))) - "Minesweeper game" tar - ((:url . "https://github.com/calancha/Minesweeper") - (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") - (:authors - ("Tino Calancha" . "tino.calancha@gmail.com")) - (:keywords "games"))]) - (minibuffer-line . - [(0 1) - nil "Display status info in the minibuffer window" single - ((:url . "http://elpa.gnu.org/packages/minibuffer-line.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (minimap . - [(1 2) - nil "Sidebar showing a \"mini-map\" of a buffer" single - ((:url . "http://elpa.gnu.org/packages/minimap.html") - (:authors - ("David Engster" . "deng@randomsample.de")) - (:maintainer "David Engster" . "deng@randomsample.de"))]) - (mmm-mode . - [(0 5 7) - ((cl-lib - (0 2))) - "Allow Multiple Major Modes in a buffer" tar - ((:url . "https://github.com/purcell/mmm-mode") - (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") - (:authors - ("Michael Abraham Shulman" . "viritrilbia@gmail.com")) - (:keywords "convenience" "faces" "languages" "tools"))]) - (modus-operandi-theme . - [(0 7 0) - ((emacs - (26 1))) - "Accessible light theme (WCAG AAA)" single - ((:keywords "faces" "theme" "accessibility") - (:authors - ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") - (:url . "https://gitlab.com/protesilaos/modus-themes"))]) - (modus-vivendi-theme . - [(0 7 0) - ((emacs - (26 1))) - "Accessible dark theme (WCAG AAA)" single - ((:keywords "faces" "theme" "accessibility") - (:authors - ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") - (:url . "https://gitlab.com/protesilaos/modus-themes"))]) - (multishell . - [(1 1 5) - ((cl-lib - (0 5))) - "Easily use multiple shell buffers, local and remote" tar - ((:url . "https://github.com/kenmanheimer/EmacsMultishell") - (:maintainer "Ken Manheimer" . "ken.manheimer@gmail.com") - (:authors - ("Ken Manheimer" . "ken.manheimer@gmail.com")) - (:keywords "processes"))]) - (muse . - [(3 20 2) - nil "Authoring and publishing tool for Emacs" tar - ((:url . "http://mwolson.org/projects/EmacsMuse.html") - (:maintainer "Michael Olson" . "mwolson@gnu.org") - (:authors - ("John Wiegley" . "johnw@gnu.org")) - (:keywords "hypermedia"))]) - (myers . - [(0 1) - ((emacs - (25))) - "Random-access singly-linked lists" single - ((:url . "http://elpa.gnu.org/packages/myers.html") - (:keywords "list" "containers") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (nadvice . - [(0 3) - nil "Forward compatibility for Emacs-24.4's nadvice" single - ((:url . "http://elpa.gnu.org/packages/nadvice.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (nameless . - [(1 0 2) - ((emacs - (24 4))) - "Hide package namespace in your emacs-lisp code" single - ((:keywords "convenience" "lisp") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") - (:url . "https://github.com/Malabarba/nameless"))]) - (names . - [(20151201 0) - ((emacs - (24 1)) - (cl-lib - (0 5)) - (nadvice - (0 3))) - "Namespaces for emacs-lisp. Avoid name clobbering without hiding symbols." tar - ((:url . "https://github.com/Malabarba/names") - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:keywords "extensions" "lisp"))]) - (nhexl-mode . - [(1 5) - ((emacs - (24 4)) - (cl-lib - (0 5))) - "Minor mode to edit files via hex-dump format" single - ((:url . "http://elpa.gnu.org/packages/nhexl-mode.html") - (:keywords "data") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (nlinum . - [(1 9) - nil "Show line numbers in the margin" single - ((:url . "http://elpa.gnu.org/packages/nlinum.html") - (:keywords "convenience") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (notes-mode . - [(1 30) - nil "Indexing system for on-line note-taking" tar - ((:maintainer nil . ".") - (:authors - (nil . ".")) - (:url . "http://elpa.gnu.org/packages/notes-mode.html"))]) - (ntlm . - [(2 1 0) - nil "NTLM (NT LanManager) authentication support" single - ((:url . "http://elpa.gnu.org/packages/ntlm.html") - (:keywords "ntlm" "sasl" "comm") - (:authors - ("Taro Kawagishi" . "tarok@transpulse.org")) - (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))]) - (num3-mode . - [(1 3) - nil "highlight groups of digits in long numbers" single - ((:url . "http://elpa.gnu.org/packages/num3-mode.html") - (:keywords "faces" "minor-mode") - (:authors - ("Felix Lee , Michal Nazarewicz" . "mina86@mina86.com")) - (:maintainer "Michal Nazarewicz" . "mina86@mina86.com"))]) - (oauth2 . - [(0 13) - nil "OAuth 2.0 Authorization Protocol" single - ((:url . "http://elpa.gnu.org/packages/oauth2.html") - (:keywords "comm") - (:authors - ("Julien Danjou" . "julien@danjou.info")) - (:maintainer "Julien Danjou" . "julien@danjou.info"))]) - (objed . - [(0 8 3) - ((emacs - (25)) - (cl-lib - (0 5))) - "Navigate and edit text objects." tar - ((:url . "https://github.com/clemera/objed") - (:maintainer "Clemens Radermacher" . "clemera@posteo.net") - (:authors - ("Clemens Radermacher" . "clemera@posteo.net")) - (:keywords "convenience"))]) - (olivetti . - [(1 7 1) - ((emacs - (24 5))) - "Minor mode for a nice writing environment" single - ((:url . "http://elpa.gnu.org/packages/olivetti.html") - (:keywords "wp" "text") - (:authors - ("Paul W. Rankin" . "pwr@sdf.org")) - (:maintainer "Paul W. Rankin" . "pwr@sdf.org"))]) - (omn-mode . - [(1 2) - nil "Support for OWL Manchester Notation" single - ((:url . "http://elpa.gnu.org/packages/omn-mode.html") - (:authors - ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) - (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) - (on-screen . - [(1 3 3) - ((cl-lib - (0))) - "guide your eyes while scrolling" single - ((:keywords "convenience") - (:authors - ("Michael Heerdegen" . "michael_heerdegen@web.de")) - (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") - (:url . "https://github.com/michael-heerdegen/on-screen.el"))]) - (org . - [(9 3 6) - nil "Outline-based notes management and organizer" tar - ((:url . "https://orgmode.org") - (:maintainer "Bastien Guerry" . "bzg@gnu.org") - (:authors - ("Carsten Dominik ")) - (:keywords "outlines" "hypermedia" "calendar" "wp"))]) - (org-edna . - [(1 1 1) - ((emacs - (25 1)) - (seq - (2 19)) - (org - (9 0 5))) - "Extensible Dependencies 'N' Actions" tar - ((:url . "https://savannah.nongnu.org/projects/org-edna-el/") - (:maintainer "Ian Dunn" . "dunni@gnu.org") - (:authors - ("Ian Dunn" . "dunni@gnu.org")) - (:keywords "convenience" "text" "org"))]) - (orgalist . - [(1 12) - ((emacs - (24 4))) - "Manage Org-like lists in non-Org buffers" single - ((:url . "http://elpa.gnu.org/packages/orgalist.html") - (:keywords "convenience") - (:authors - ("Nicolas Goaziou" . "mail@nicolasgoaziou.fr")) - (:maintainer "Nicolas Goaziou" . "mail@nicolasgoaziou.fr"))]) - (osc . - [(0 2) - nil "Open Sound Control protocol library" single - ((:url . "http://elpa.gnu.org/packages/osc.html") - (:keywords "comm" "processes" "multimedia") - (:authors - ("Mario Lang" . "mlang@blind.guru")) - (:maintainer "Mario Lang" . "mlang@blind.guru"))]) - (other-frame-window . - [(1 0 6) - ((emacs - (24 4))) - "Minor mode to enable global prefix keys for other frame/window buffer placement" single - ((:url . "http://elpa.gnu.org/packages/other-frame-window.html") - (:keywords "frame" "window") - (:authors - ("Stephen Leake" . "stephen_leake@member.fsf.org")) - (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org"))]) - (pabbrev . - [(4 2 1) - nil "Predictive abbreviation expansion" single - ((:url . "http://elpa.gnu.org/packages/pabbrev.html") - (:authors - ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) - (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) - (paced . - [(1 1 3) - ((emacs - (25 1)) - (async - (1 9 1))) - "Predictive Abbreviation Completion and Expansion using Dictionaries" tar - ((:url . "https://savannah.nongnu.org/projects/paced-el/") - (:maintainer "Ian Dunn" . "dunni@gnu.org") - (:authors - ("Ian Dunn" . "dunni@gnu.org")) - (:keywords "convenience" "completion"))]) - (parsec . - [(0 1 3) - ((emacs - (24)) - (cl-lib - (0 5))) - "Parser combinator library" tar - ((:url . "https://github.com/cute-jumper/parsec.el") - (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") - (:authors - ("Junpeng Qiu" . "qjpchmail@gmail.com")) - (:keywords "extensions"))]) - (path-iterator . - [(1 0) - ((emacs - (25 0))) - "An iterator for traversing a directory path." tar - ((:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") - (:authors - ("Stephen Leake" . "stephen_leake@stephe-leake.org")) - (:url . "http://elpa.gnu.org/packages/path-iterator.html"))]) - (peg . - [(1 0) - ((emacs - (25))) - "Parsing Expression Grammars in Emacs Lisp" tar - ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") - (:authors - ("Helmut Eller" . "eller.helmut@gmail.com")) - (:url . "http://elpa.gnu.org/packages/peg.html"))]) - (persist . - [(0 4) - nil "Persist Variables between Emacs Sessions" tar - ((:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk") - (:authors - ("Phillip Lord" . "phillip.lord@russet.org.uk")) - (:url . "http://elpa.gnu.org/packages/persist.html"))]) - (phps-mode . - [(0 3 42) - ((emacs - (26))) - "Major mode for PHP with Semantic integration" tar - ((:url . "https://github.com/cjohansson/emacs-phps-mode") - (:maintainer "Christian Johansson" . "christian@cvj.se") - (:authors - ("Christian Johansson" . "christian@cvj.se")) - (:keywords "tools" "convenience"))]) - (pinentry . - [(0 1) - nil "GnuPG Pinentry server implementation" single - ((:url . "http://elpa.gnu.org/packages/pinentry.html") - (:keywords "gnupg") - (:authors - ("Daiki Ueno" . "ueno@gnu.org")) - (:maintainer "Daiki Ueno" . "ueno@gnu.org"))]) - (poker . - [(0 2) - nil "Texas hold 'em poker" single - ((:url . "http://elpa.gnu.org/packages/poker.html") - (:keywords "games") - (:authors - ("Mario Lang" . "mlang@delysid.org")) - (:maintainer "Mario Lang" . "mlang@delysid.org"))]) - (posframe . - [(0 7 0) - ((emacs - (26))) - "Pop a posframe (just a frame) at point" single - ((:keywords "convenience" "tooltip") - (:authors - ("Feng Shu" . "tumashu@163.com")) - (:maintainer "Feng Shu" . "tumashu@163.com") - (:url . "https://github.com/tumashu/posframe"))]) - (psgml . - [(1 3 4) - nil "SGML-editing mode with parsing support" tar - ((:maintainer "Lennart Staflin" . "lstaflin@gmail.com") - (:authors - ("Lennart Staflin" . "lenst@lysator.liu.se") - ("James Clark" . "jjc@clark.com")) - (:keywords "languages") - (:url . "http://elpa.gnu.org/packages/psgml.html"))]) - (python . - [(0 26 1) - ((emacs - (24 1)) - (cl-lib - (1 0))) - "Python's flying circus support for Emacs" single - ((:keywords "languages") - (:authors - ("Fabián E. Gallina" . "fgallina@gnu.org")) - (:maintainer nil . "emacs-devel@gnu.org") - (:url . "https://github.com/fgallina/python.el"))]) - (quarter-plane . - [(0 1) - nil "Minor mode for quarter-plane style editing" single - ((:url . "http://elpa.gnu.org/packages/quarter-plane.html") - (:keywords "convenience" "wp") - (:authors - ("Peter J. Weisberg")) - (:maintainer "Peter J. Weisberg"))]) - (queue . - [(0 2) - nil "Queue data structure" single - ((:keywords "extensions" "data structures" "queue") - (:authors - ("Inge Wallin" . "inge@lysator.liu.se") - ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) - (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") - (:url . "http://www.dr-qubit.org/emacs.php"))]) - (rainbow-mode . - [(1 0 4) - nil "Colorize color names in buffers" single - ((:url . "http://elpa.gnu.org/packages/rainbow-mode.html") - (:keywords "faces") - (:authors - ("Julien Danjou" . "julien@danjou.info")) - (:maintainer "Julien Danjou" . "julien@danjou.info"))]) - (rbit . - [(0 1) - nil "Red-black persistent interval trees" single - ((:url . "http://elpa.gnu.org/packages/rbit.html") - (:keywords "data structures" "binary tree" "intervals") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (rcirc-color . - [(0 4 1) - ((emacs - (24 4))) - "color nicks" single - ((:url . "http://elpa.gnu.org/packages/rcirc-color.html") - (:keywords "comm") - (:authors - ("Alex Schroeder" . "alex@gnu.org")) - (:maintainer "Alex Schroeder" . "alex@gnu.org"))]) - (rcirc-menu . - [(1 1) - nil "A menu of all your rcirc connections" single - ((:url . "http://elpa.gnu.org/packages/rcirc-menu.html") - (:keywords "comm") - (:authors - ("Alex Schroeder" . "alex@gnu.org")) - (:maintainer "Alex Schroeder" . "alex@gnu.org"))]) - (realgud . - [(1 5 1) - ((load-relative - (1 3 1)) - (loc-changes - (1 2)) - (test-simple - (1 3 0)) - (emacs - (25))) - "A modular front-end for interacting with external debuggers" tar - ((:url . "http://github.com/realgud/realgud/") - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:authors - ("Rocky Bernstein" . "rocky@gnu.org")) - (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb"))]) - (realgud-ipdb . - [(1 0 0) - ((realgud - (1 5 0)) - (load-relative - (1 3 1)) - (emacs - (25))) - "Realgud front-end to ipdb" tar - ((:url . "http://github.com/rocky/realgud-ipdb") - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:authors - ("Rocky Bernstein" . "rocky@gnu.org")))]) - (realgud-jdb . - [(1 0 0) - ((realgud - (1 4 5)) - (load-relative - (1 2)) - (cl-lib - (0 5)) - (emacs - (25))) - "Realgud front-end to Java's jdb debugger\"" tar - ((:url . "http://github.com/realgud/realgud-jdb") - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:authors - ("Rocky Bernstein" . "rocky@gnu.org")))]) - (realgud-lldb . - [(1 0 2) - ((load-relative - (1 3 1)) - (realgud - (1 5 0)) - (emacs - (25))) - "Realgud front-end to lldb" tar - ((:url . "http://github.com/realgud/realgud-lldb") - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:authors - ("Rocky Bernstein" . "rocky@gnu.org")))]) - (realgud-node-debug . - [(1 0 0) - ((realgud - (1 4 5)) - (load-relative - (1 2)) - (cl-lib - (0 5)) - (emacs - (25))) - "Realgud front-end to older \"node debug\"" tar - ((:url . "http://github.com/realgud/realgud-node-debug") - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:authors - ("Rocky Bernstein" . "rocky@gnu.org")))]) - (realgud-node-inspect . - [(1 0 0) - ((realgud - (1 4 5)) - (load-relative - (1 2)) - (cl-lib - (0 5)) - (emacs - (24))) - "Realgud front-end to newer \"node inspect\"" tar - ((:url . "http://github.com/realgud/realgud-node-inspect") - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:authors - ("Rocky Bernstein" . "rocky@gnu.org")))]) - (realgud-trepan-ni . - [(1 0 1) - ((load-relative - (1 2)) - (realgud - (1 5 0)) - (cl-lib - (0 5)) - (emacs - (25))) - "Realgud front-end to trepan-ni" tar - ((:url . "http://github.com/realgud/realgud-trepan-ni") - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:authors - ("Rocky Bernstein" . "rocky@gnu.org")))]) - (register-list . - [(0 1) - nil "Interactively list/edit registers" single - ((:url . "http://elpa.gnu.org/packages/register-list.html") - (:keywords "register") - (:authors - ("Bastien Guerry" . "bzg@gnu.org")) - (:maintainer "Bastien Guerry" . "bzg@gnu.org"))]) - (relint . - [(1 15) - ((xr - (1 17)) - (emacs - (26 1))) - "Elisp regexp mistake finder" tar - ((:url . "https://github.com/mattiase/relint") - (:maintainer "Mattias Engdegård" . "mattiase@acm.org") - (:authors - ("Mattias Engdegård" . "mattiase@acm.org")) - (:keywords "lisp" "regexps"))]) - (rich-minority . - [(1 0 1) - ((cl-lib - (0 5))) - "Clean-up and Beautify the list of minor-modes." single - ((:keywords "mode-line" "faces") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") - (:url . "https://github.com/Malabarba/rich-minority"))]) - (rnc-mode . - [(0 2) - nil "Emacs mode to edit Relax-NG Compact files" single - ((:url . "http://elpa.gnu.org/packages/rnc-mode.html") - (:keywords "xml" "relaxng") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (rudel . - [(0 3 1) - ((emacs - (24)) - (cl-lib - (0 5)) - (cl-generic - (0 3)) - (cl-print - (1 0))) - "A collaborative editing framework for Emacs" tar - ((:url . "http://rudel.sourceforge.net/") - (:maintainer "Jan Moringen" . "scymtym@users.sourceforge.net") - (:authors - ("Jan Moringen" . "scymtym@users.sourceforge.net")) - (:keywords "rudel" "collaboration"))]) - (scanner . - [(0 1) - ((emacs - (25 1)) - (dash - (2 12 0))) - "Scan documents and images" tar - ((:url . "https://gitlab.com/rstocker/scanner.git") - (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de") - (:authors - ("Raffael Stocker" . "r.stocker@mnet-mail.de")) - (:keywords "hardware" "multimedia"))]) - (scroll-restore . - [(1 0) - nil "restore original position after scrolling" single - ((:url . "http://elpa.gnu.org/packages/scroll-restore.html") - (:keywords "scrolling") - (:authors - ("Martin Rudalics" . "rudalics@gmx.at")) - (:maintainer "Martin Rudalics" . "rudalics@gmx.at"))]) - (sed-mode . - [(1 0) - nil "Major mode to edit sed scripts" single - ((:url . "http://elpa.gnu.org/packages/sed-mode.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (seq . - [(2 20) - nil "Sequence manipulation functions" tar - ((:maintainer nil . "emacs-devel@gnu.org") - (:authors - ("Nicolas Petton" . "nicolas@petton.fr")) - (:keywords "sequences") - (:url . "http://elpa.gnu.org/packages/seq.html"))]) - (shelisp . - [(0 9 1) - nil "execute elisp in shell" single - ((:url . "http://elpa.gnu.org/packages/shelisp.html") - (:keywords "terminals" "lisp" "processes") - (:authors - ("Michael R. Mauger" . "michael@mauger.com")) - (:maintainer "Michael R. Mauger" . "michael@mauger.com"))]) - (shen-mode . - [(0 1) - nil "A major mode for editing shen source code" tar - ((:maintainer "Eric Schulte" . "schulte.eric@gmail.com") - (:authors - ("Eric Schulte" . "schulte.eric@gmail.com")) - (:keywords "languages" "shen") - (:url . "http://elpa.gnu.org/packages/shen-mode.html"))]) - (sisu-mode . - [(7 1 8) - nil "Major mode for SiSU markup text" single - ((:keywords "text" "syntax" "processes" "tools") - (:authors - ("Ralph Amissah & Ambrose Kofi Laing")) - (:maintainer "Ralph Amissah" . "ralph.amissah@gmail.com") - (:url . "http://www.sisudoc.org/"))]) - (sm-c-mode . - [(1 0) - nil "C major mode based on SMIE" single - ((:url . "http://elpa.gnu.org/packages/sm-c-mode.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (smalltalk-mode . - [(3 2 92) - nil "Major mode for the GNU Smalltalk programming language" tar - ((:maintainer "Derek Zhou" . "derek@3qin.us") - (:authors - ("Steve Byrne")) - (:url . "http://elpa.gnu.org/packages/smalltalk-mode.html"))]) - (smart-yank . - [(0 1 1) - ((emacs - (24))) - "A different approach of yank pointer handling" single - ((:url . "http://elpa.gnu.org/packages/smart-yank.html") - (:keywords "convenience") - (:authors - ("Michael Heerdegen" . "michael_heerdegen@web.de")) - (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de"))]) - (sml-mode . - [(6 10) - ((emacs - (24 3)) - (cl-lib - (0 5))) - "Major mode for editing (Standard) ML" single - ((:url . "http://elpa.gnu.org/packages/sml-mode.html") - (:keywords "sml") - (:authors - ("Lars Bo Nielsen") - (" Olin Shivers") - (" Fritz Knabe (?)") - (" Steven Gilmore (?)") - (" Matthew Morley" . "mjm@scs.leeds.ac.uk") - (" Matthias Blume" . "blume@cs.princeton.edu") - (" (Stefan Monnier)" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (soap-client . - [(3 1 5) - ((cl-lib - (0 6 1))) - "Access SOAP web services" tar - ((:url . "https://github.com/alex-hhh/emacs-soap-client") - (:maintainer "Alexandru Harsanyi" . "AlexHarsanyi@gmail.com") - (:authors - ("Alexandru Harsanyi" . "AlexHarsanyi@gmail.com")) - (:keywords "soap" "web-services" "comm" "hypermedia"))]) - (sokoban . - [(1 4 8) - ((emacs - (23 1)) - (cl-lib - (0 5))) - "Implementation of Sokoban for Emacs." tar - ((:maintainer "Dieter Deyke" . "dieter.deyke@gmail.com") - (:authors - ("Glynn Clements" . "glynn.clements@xemacs.org")) - (:keywords "games") - (:url . "http://elpa.gnu.org/packages/sokoban.html"))]) - (sotlisp . - [(1 6 2) - ((emacs - (24 1))) - "Write lisp at the speed of thought." single - ((:keywords "convenience" "lisp") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") - (:url . "https://github.com/Malabarba/speed-of-thought-lisp"))]) - (spinner . - [(1 7 3) - nil "Add spinners and progress-bars to the mode-line for ongoing operations" single - ((:keywords "processes" "mode-line") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") - (:url . "https://github.com/Malabarba/spinner.el"))]) - (sql-indent . - [(1 5) - ((cl-lib - (0 5))) - "Support for indenting code in SQL files." tar - ((:url . "https://github.com/alex-hhh/emacs-sql-indent") - (:maintainer "Alex Harsanyi" . "AlexHarsanyi@gmail.com") - (:authors - ("Alex Harsanyi" . "AlexHarsanyi@gmail.com")) - (:keywords "languages" "sql"))]) - (ssh-deploy . - [(3 1 11) - ((emacs - (25))) - "Deployment via Tramp, global or per directory." tar - ((:url . "https://github.com/cjohansson/emacs-ssh-deploy") - (:maintainer "Christian Johansson" . "christian@cvj.se") - (:authors - ("Christian Johansson" . "christian@cvj.se")) - (:keywords "tools" "convenience"))]) - (stream . - [(2 2 5) - ((emacs - (25))) - "Implementation of streams" tar - ((:maintainer nil . "nicolas@petton.fr") - (:authors - ("Nicolas Petton" . "nicolas@petton.fr")) - (:keywords "stream" "laziness" "sequences") - (:url . "http://elpa.gnu.org/packages/stream.html"))]) - (svg . - [(1 0) - ((emacs - (25))) - "SVG image creation functions" single - ((:url . "http://elpa.gnu.org/packages/svg.html") - (:keywords "image") - (:authors - ("Lars Magne Ingebrigtsen" . "larsi@gnus.org") - ("Felix E. Klee" . "felix.klee@inka.de")) - (:maintainer "Lars Magne Ingebrigtsen" . "larsi@gnus.org"))]) - (svg-clock . - [(1 1) - ((svg - (1 0)) - (emacs - (27 0))) - "Analog clock using Scalable Vector Graphics" single - ((:url . "http://elpa.gnu.org/packages/svg-clock.html") - (:keywords "demo" "svg" "clock") - (:authors - ("Ulf Jasper" . "ulf.jasper@web.de")) - (:maintainer "Ulf Jasper" . "ulf.jasper@web.de"))]) - (system-packages . - [(1 0 11) - ((emacs - (24 3))) - "functions to manage system packages" tar - ((:url . "https://gitlab.com/jabranham/system-packages") - (:maintainer "J. Alexander Branham" . "alex.branham@gmail.com") - (:authors - ("J. Alexander Branham" . "alex.branham@gmail.com")))]) - (tNFA . - [(0 1 1) - ((queue - (0 1))) - "Tagged non-deterministic finite-state automata" single - ((:keywords "extensions" "matching" "data structures tnfa" "nfa" "dfa" "finite state automata" "automata" "regexp") - (:authors - ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) - (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") - (:url . "http://www.dr-qubit.org/emacs.php"))]) - (temp-buffer-browse . - [(1 5) - ((emacs - (24))) - "temp buffer browse mode" single - ((:url . "http://elpa.gnu.org/packages/temp-buffer-browse.html") - (:keywords "convenience") - (:authors - ("Leo Liu" . "sdl.web@gmail.com")) - (:maintainer "Leo Liu" . "sdl.web@gmail.com"))]) - (test-simple . - [(1 3 0) - ((cl-lib - (0))) - "Simple Unit Test Framework for Emacs Lisp" single - ((:keywords "unit-test") - (:authors - ("Rocky Bernstein" . "rocky@gnu.org")) - (:maintainer "Rocky Bernstein" . "rocky@gnu.org") - (:url . "http://github.com/rocky/emacs-test-simple"))]) - (timerfunctions . - [(1 4 2) - ((cl-lib - (0 5)) - (emacs - (24))) - "Enhanced versions of some timer.el functions" single - ((:url . "http://elpa.gnu.org/packages/timerfunctions.html") - (:authors - ("Dave Goel" . "deego3@gmail.com")) - (:maintainer "Dave Goel" . "deego3@gmail.com"))]) - (tiny . - [(0 2 1) - nil "Quickly generate linear ranges in Emacs" tar - ((:url . "https://github.com/abo-abo/tiny") - (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") - (:authors - ("Oleh Krehel" . "ohwoeowho@gmail.com")) - (:keywords "convenience"))]) - (tramp . - [(2 4 3 3) - ((emacs - (24 4))) - "Transparent Remote Access, Multiple Protocol" tar - ((:url . "https://savannah.gnu.org/projects/tramp") - (:maintainer "Michael Albinus" . "michael.albinus@gmx.de") - (:authors - ("Kai Großjohann" . "kai.grossjohann@gmx.net") - ("Michael Albinus" . "michael.albinus@gmx.de")) - (:keywords "comm" "processes"))]) - (tramp-theme . - [(0 2) - ((emacs - (24 1))) - "Custom theme for remote buffers" single - ((:url . "http://elpa.gnu.org/packages/tramp-theme.html") - (:keywords "convenience" "faces") - (:authors - ("Michael Albinus" . "michael.albinus@gmx.de")) - (:maintainer "Michael Albinus" . "michael.albinus@gmx.de"))]) - (transcribe . - [(1 5 2) - nil "Package for audio transcriptions" single - ((:url . "http://elpa.gnu.org/packages/transcribe.html") - (:authors - ("David Gonzalez Gandara" . "dggandara@member.fsf.org")) - (:maintainer "David Gonzalez Gandara" . "dggandara@member.fsf.org"))]) - (trie . - [(0 4) - ((tNFA - (0 1 1)) - (heap - (0 3))) - "Trie data structure" single - ((:keywords "extensions" "matching" "data structures trie" "ternary search tree" "tree" "completion" "regexp") - (:authors - ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) - (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") - (:url . "http://www.dr-qubit.org/emacs.php"))]) - (undo-tree . - [(0 7 4) - nil "Treat undo history as a tree" single - ((:keywords "convenience" "files" "undo" "redo" "history" "tree") - (:authors - ("Toby Cubitt" . "toby-undo-tree@dr-qubit.org")) - (:maintainer "Toby Cubitt" . "toby-undo-tree@dr-qubit.org") - (:url . "http://www.dr-qubit.org/emacs.php"))]) - (uni-confusables . - [(0 1) - nil "Unicode confusables table" tar - ((:maintainer "Teodor Zlatanov" . "tzz@lifelogs.com") - (:url . "http://elpa.gnu.org/packages/uni-confusables.html"))]) - (uniquify-files . - [(1 0 2) - ((emacs - (25 0))) - "Completion style for files, minimizing directories" tar - ((:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") - (:authors - ("Stephen Leake" . "stephen_leake@stephe-leake.org")) - (:keywords "completion" "table" "uniquify") - (:url . "http://elpa.gnu.org/packages/uniquify-files.html"))]) - (url-http-ntlm . - [(2 0 4) - ((cl-lib - (0 5)) - (ntlm - (2 1 0))) - "NTLM authentication for the url library" single - ((:keywords "comm" "data" "processes" "hypermedia") - (:authors - ("Tom Schutzer-Weissmann" . "tom.weissmann@gmail.com")) - (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") - (:url . "https://code.google.com/p/url-http-ntlm/"))]) - (validate . - [(1 0 4) - ((emacs - (24 1)) - (cl-lib - (0 5)) - (seq - (2 16))) - "Schema validation for Emacs-lisp" single - ((:url . "http://elpa.gnu.org/packages/validate.html") - (:keywords "lisp") - (:authors - ("Artur Malabarba" . "emacs@endlessparentheses.com")) - (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) - (vcard . - [(0 1) - ((emacs - (27 1))) - "Package for handling vCard files" tar - ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") - (:authors - ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) - (:url . "http://elpa.gnu.org/packages/vcard.html"))]) - (vcl-mode . - [(1 1) - nil "Major mode for Varnish Configuration Language" single - ((:url . "http://elpa.gnu.org/packages/vcl-mode.html") - (:keywords "varnish" "vcl") - (:authors - ("Sergey Poznyakoff" . "gray@gnu.org.ua")) - (:maintainer "Sergey Poznyakoff" . "gray@gnu.org.ua"))]) - (vdiff . - [(0 2 3) - ((emacs - (24 4)) - (hydra - (0 13 0))) - "A diff tool similar to vimdiff" single - ((:keywords "diff") - (:authors - ("Justin Burkett" . "justin@burkett.cc")) - (:maintainer "Justin Burkett" . "justin@burkett.cc") - (:url . "https://github.com/justbur/emacs-vdiff"))]) - (verilog-mode . - [(2020 2 23 232634261) - nil "major mode for editing verilog source in Emacs" single - ((:keywords "languages") - (:authors - ("Michael McNamara" . "mac@verilog.com") - ("Wilson Snyder" . "wsnyder@wsnyder.org")) - (:maintainer "Michael McNamara" . "mac@verilog.com") - (:url . "https://www.veripool.org"))]) - (vigenere . - [(1 0) - ((emacs - (25 1))) - "Run a vigenere cipher on a block of text ;" single - ((:keywords "data" "vigenere" "cipher") - (:authors - ("Ian Dunn" . "dunni@gnu.org")) - (:maintainer "Ian Dunn" . "dunni@gnu.org") - (:url . "https://elpa.gnu.org/packages/vigenere.html"))]) - (visual-filename-abbrev . - [(1 0) - ((emacs - (26 1))) - "Visually abbreviate filenames" single - ((:url . "http://elpa.gnu.org/packages/visual-filename-abbrev.html") - (:keywords "tools") - (:authors - ("Tassilo Horn" . "tsdh@gnu.org")) - (:maintainer "Tassilo Horn" . "tsdh@gnu.org"))]) - (visual-fill . - [(0 1) - nil "Auto-refill paragraphs without modifying the buffer" single - ((:url . "http://elpa.gnu.org/packages/visual-fill.html") - (:authors - ("Stefan Monnier" . "monnier@iro.umontreal.ca")) - (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) - (vlf . - [(1 7 1) - nil "View Large Files" tar - ((:url . "https://github.com/m00natic/vlfi") - (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") - (:keywords "large files" "utilities"))]) - (wcheck-mode . - [(2019 6 17) - nil "General interface for text checkers" single - ((:keywords "text" "spell" "check" "languages" "ispell") - (:authors - ("Teemu Likonen" . "tlikonen@iki.fi")) - (:maintainer "Teemu Likonen" . "tlikonen@iki.fi") - (:url . "https://github.com/tlikonen/wcheck-mode"))]) - (wconf . - [(0 2 1) - ((emacs - (24 4))) - "Minimal window layout manager" single - ((:keywords "windows" "frames" "layout") - (:authors - ("Ingo Lohmar" . "i.lohmar@gmail.com")) - (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com") - (:url . "https://github.com/ilohmar/wconf"))]) - (web-server . - [(0 1 2) - ((emacs - (24 3))) - "Emacs Web Server" tar - ((:url . "https://github.com/eschulte/emacs-web-server") - (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") - (:authors - ("Eric Schulte" . "schulte.eric@gmail.com")) - (:keywords "http" "server" "network"))]) - (webfeeder . - [(1 0 0) - ((emacs - (25 1))) - "Build RSS and Atom webfeeds from HTML files" tar - ((:url . "https://gitlab.com/Ambrevar/emacs-webfeeder") - (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") - (:authors - ("Pierre Neidhardt" . "mail@ambrevar.xyz")) - (:keywords "news" "hypermedia" "blog" "feed" "rss" "atom"))]) - (websocket . - [(1 12) - ((cl-lib - (0 5))) - "Emacs WebSocket client and server" tar - ((:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") - (:authors - ("Andrew Hyatt" . "ahyatt@gmail.com")) - (:keywords "communication" "websocket" "server") - (:url . "http://elpa.gnu.org/packages/websocket.html"))]) - (which-key . - [(3 3 0) - ((emacs - (24 4))) - "Display available keybindings in popup" tar - ((:url . "https://github.com/justbur/emacs-which-key") - (:maintainer "Justin Burkett" . "justin@burkett.cc") - (:authors - ("Justin Burkett" . "justin@burkett.cc")))]) - (windower . - [(0 0 1) - ((emacs - (25))) - "Helper functions for window manipulation." single - ((:keywords "convenience" "tools") - (:authors - ("Pierre Neidhardt" . "mail@ambrevar.xyz")) - (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") - (:url . "https://gitlab.com/ambrevar/windower"))]) - (windresize . - [(0 1) - nil "Resize windows interactively" single - ((:url . "http://elpa.gnu.org/packages/windresize.html") - (:keywords "window") - (:authors - ("Bastien" . "bzg@gnu.org")) - (:maintainer "Bastien" . "bzg@gnu.org"))]) - (wisi . - [(3 0 1) - ((emacs - (25 0)) - (seq - (2 20))) - "Utilities for implementing an indentation/navigation engine using a generalized LALR parser" tar - ((:url . "http://stephe-leake.org/ada/wisitoken.html") - (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") - (:authors - ("Stephen Leake" . "stephen_leake@stephe-leake.org")) - (:keywords "parser" "indentation" "navigation"))]) - (wisitoken-grammar-mode . - [(1 0 3) - ((wisi - (2 2 1)) - (emacs - (25 0)) - (mmm-mode - (0 5 7))) - "Major mode for editing WisiToken grammar files" tar - ((:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") - (:authors - ("Stephen Leake" . "stephen_leake@stephe-leake.org")) - (:keywords "languages") - (:url . "http://elpa.gnu.org/packages/wisitoken-grammar-mode.html"))]) - (wpuzzle . - [(1 1) - nil "find as many word in a given time" single - ((:url . "http://elpa.gnu.org/packages/wpuzzle.html") - (:authors - ("Ivan Kanis" . "ivan@kanis.fr")) - (:maintainer "Ivan Kanis" . "ivan@kanis.fr"))]) - (xclip . - [(1 10) - nil "Copy&paste GUI clipboard from text terminal" single - ((:url . "http://elpa.gnu.org/packages/xclip.html") - (:keywords "convenience" "tools") - (:authors - ("Leo Liu" . "sdl.web@gmail.com")) - (:maintainer "Leo Liu" . "sdl.web@gmail.com"))]) - (xelb . - [(0 18) - ((emacs - (24 4)) - (cl-generic - (0 2))) - "X protocol Emacs Lisp Binding" tar - ((:url . "https://github.com/ch11ng/xelb") - (:maintainer "Chris Feng" . "chris.w.feng@gmail.com") - (:authors - ("Chris Feng" . "chris.w.feng@gmail.com")) - (:keywords "unix"))]) - (xpm . - [(1 0 4) - nil "edit XPM images" tar - ((:url . "http://www.gnuvola.org/software/xpm/") - (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org") - (:authors - ("Thien-Thi Nguyen" . "ttn@gnu.org")) - (:keywords "multimedia" "xpm"))]) - (xr . - [(1 18) - ((emacs - (26 1))) - "Convert string regexp to rx notation" tar - ((:url . "https://github.com/mattiase/xr") - (:maintainer "Mattias Engdegård" . "mattiase@acm.org") - (:authors - ("Mattias Engdegård" . "mattiase@acm.org")) - (:keywords "lisp" "regexps"))]) - (yasnippet . - [(0 14 0) - ((cl-lib - (0 5))) - "Yet another snippet extension for Emacs" tar - ((:url . "http://github.com/joaotavora/yasnippet") - (:maintainer "Noam Postavsky" . "npostavs@gmail.com") - (:keywords "convenience" "emulation"))]) - (yasnippet-classic-snippets . - [(1 0 2) - ((yasnippet - (0 9 1))) - "\"Classic\" yasnippet snippets" tar - ((:maintainer "Noam Postavsky" . "npostavs@gmail.com") - (:keywords "snippets") - (:url . "http://elpa.gnu.org/packages/yasnippet-classic-snippets.html"))]) - (zones . - [(2019 7 13) - nil "Zones of text - like multiple regions" single - ((:keywords "narrow" "restriction" "widen" "region" "zone") - (:authors - ("Drew Adams")) - (:maintainer "Drew Adams" . "drew.adams@oracle.com") - (:url . "https://elpa.gnu.org/packages/zones.html"))]) - (ztree . - [(1 0 5) - ((cl-lib - (0))) - "Text mode directory tree" tar - ((:url . "https://github.com/fourier/ztree") - (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") - (:authors - ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) - (:keywords "files" "tools"))])) diff --git a/elpa/archives/gnu/archive-contents.signed b/elpa/archives/gnu/archive-contents.signed deleted file mode 100644 index 34e3f86b..00000000 --- a/elpa/archives/gnu/archive-contents.signed +++ /dev/null @@ -1 +0,0 @@ -Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) (trust undefined) created at 2020-04-13T11:05:02+0200 using RSA \ No newline at end of file diff --git a/elpa/async-20200113.1745/async-autoloads.el b/elpa/async-20200113.1745/async-autoloads.el deleted file mode 100644 index de07d21f..00000000 --- a/elpa/async-20200113.1745/async-autoloads.el +++ /dev/null @@ -1,174 +0,0 @@ -;;; async-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "async" "async.el" (0 0 0 0)) -;;; Generated autoloads from async.el - -(autoload 'async-start-process "async" "\ -Start the executable PROGRAM asynchronously named NAME. See `async-start'. -PROGRAM is passed PROGRAM-ARGS, calling FINISH-FUNC with the -process object when done. If FINISH-FUNC is nil, the future -object will return the process object when the program is -finished. Set DEFAULT-DIRECTORY to change PROGRAM's current -working directory. - -\(fn NAME PROGRAM FINISH-FUNC &rest PROGRAM-ARGS)" nil nil) - -(autoload 'async-start "async" "\ -Execute START-FUNC (often a lambda) in a subordinate Emacs process. -When done, the return value is passed to FINISH-FUNC. Example: - - (async-start - ;; What to do in the child process - (lambda () - (message \"This is a test\") - (sleep-for 3) - 222) - - ;; What to do when it finishes - (lambda (result) - (message \"Async process done, result should be 222: %s\" - result))) - -If FINISH-FUNC is nil or missing, a future is returned that can -be inspected using `async-get', blocking until the value is -ready. Example: - - (let ((proc (async-start - ;; What to do in the child process - (lambda () - (message \"This is a test\") - (sleep-for 3) - 222)))) - - (message \"I'm going to do some work here\") ;; .... - - (message \"Waiting on async process, result should be 222: %s\" - (async-get proc))) - -If you don't want to use a callback, and you don't care about any -return value from the child process, pass the `ignore' symbol as -the second argument (if you don't, and never call `async-get', it -will leave *emacs* process buffers hanging around): - - (async-start - (lambda () - (delete-file \"a remote file on a slow link\" nil)) - 'ignore) - -Note: Even when FINISH-FUNC is present, a future is still -returned except that it yields no value (since the value is -passed to FINISH-FUNC). Call `async-get' on such a future always -returns nil. It can still be useful, however, as an argument to -`async-ready' or `async-wait'. - -\(fn START-FUNC &optional FINISH-FUNC)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "async" '("async-"))) - -;;;*** - -;;;### (autoloads nil "async-bytecomp" "async-bytecomp.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from async-bytecomp.el - -(autoload 'async-byte-recompile-directory "async-bytecomp" "\ -Compile all *.el files in DIRECTORY asynchronously. -All *.elc files are systematically deleted before proceeding. - -\(fn DIRECTORY &optional QUIET)" nil nil) - -(defvar async-bytecomp-package-mode nil "\ -Non-nil if Async-Bytecomp-Package mode is enabled. -See the `async-bytecomp-package-mode' command -for a description of this minor mode. -Setting this variable directly does not take effect; -either customize it (see the info node `Easy Customization') -or call the function `async-bytecomp-package-mode'.") - -(custom-autoload 'async-bytecomp-package-mode "async-bytecomp" nil) - -(autoload 'async-bytecomp-package-mode "async-bytecomp" "\ -Byte compile asynchronously packages installed with package.el. -Async compilation of packages can be controlled by -`async-bytecomp-allowed-packages'. - -\(fn &optional ARG)" t nil) - -(autoload 'async-byte-compile-file "async-bytecomp" "\ -Byte compile Lisp code FILE asynchronously. - -Same as `byte-compile-file' but asynchronous. - -\(fn FILE)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "async-bytecomp" '("async-byte"))) - -;;;*** - -;;;### (autoloads nil "dired-async" "dired-async.el" (0 0 0 0)) -;;; Generated autoloads from dired-async.el - -(defvar dired-async-mode nil "\ -Non-nil if Dired-Async mode is enabled. -See the `dired-async-mode' command -for a description of this minor mode. -Setting this variable directly does not take effect; -either customize it (see the info node `Easy Customization') -or call the function `dired-async-mode'.") - -(custom-autoload 'dired-async-mode "dired-async" nil) - -(autoload 'dired-async-mode "dired-async" "\ -Do dired actions asynchronously. - -\(fn &optional ARG)" t nil) - -(autoload 'dired-async-do-copy "dired-async" "\ -Run ‘dired-do-copy’ asynchronously. - -\(fn &optional ARG)" t nil) - -(autoload 'dired-async-do-symlink "dired-async" "\ -Run ‘dired-do-symlink’ asynchronously. - -\(fn &optional ARG)" t nil) - -(autoload 'dired-async-do-hardlink "dired-async" "\ -Run ‘dired-do-hardlink’ asynchronously. - -\(fn &optional ARG)" t nil) - -(autoload 'dired-async-do-rename "dired-async" "\ -Run ‘dired-do-rename’ asynchronously. - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dired-async" '("dired-async-"))) - -;;;*** - -;;;### (autoloads nil "smtpmail-async" "smtpmail-async.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from smtpmail-async.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "smtpmail-async" '("async-smtpmail-"))) - -;;;*** - -;;;### (autoloads nil nil ("async-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; async-autoloads.el ends here diff --git a/elpa/async-20200113.1745/async-bytecomp.el b/elpa/async-20200113.1745/async-bytecomp.el deleted file mode 100644 index 1198497f..00000000 --- a/elpa/async-20200113.1745/async-bytecomp.el +++ /dev/null @@ -1,210 +0,0 @@ -;;; async-bytecomp.el --- Compile elisp files asynchronously -*- lexical-binding: t -*- - -;; Copyright (C) 2014-2016 Free Software Foundation, Inc. - -;; Authors: John Wiegley -;; Thierry Volpiatto - -;; Keywords: dired async byte-compile -;; X-URL: https://github.com/jwiegley/dired-async - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2, or (at -;; your option) any later version. - -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: -;; -;; This package provide the `async-byte-recompile-directory' function -;; which allows, as the name says to recompile a directory outside of -;; your running emacs. -;; The benefit is your files will be compiled in a clean environment without -;; the old *.el files loaded. -;; Among other things, this fix a bug in package.el which recompile -;; the new files in the current environment with the old files loaded, creating -;; errors in most packages after upgrades. -;; -;; NB: This package is advicing the function `package--compile'. - -;;; Code: - -(require 'cl-lib) -(require 'async) - -(defcustom async-bytecomp-allowed-packages - ;; FIXME: Arguably the default should be `all', but currently - ;; this minor mode is silently/forcefully enabled by Helm and Magit to ensure - ;; they get compiled asynchronously, so this conservative default value is - ;; here to make sure that the mode can be enabled without the user's - ;; explicit consent. - '(async forge helm helm-core helm-ls-git helm-ls-hg magit) - "Packages in this list will be compiled asynchronously by `package--compile'. -All the dependencies of these packages will be compiled async too, -so no need to add dependencies to this list. -The value of this variable can also be the symbol `all', in this case -all packages are always compiled asynchronously." - :group 'async - :type '(choice - (const :tag "All packages" all) - (repeat symbol))) - -(defvar async-byte-compile-log-file - (concat user-emacs-directory "async-bytecomp.log")) - -;;;###autoload -(defun async-byte-recompile-directory (directory &optional quiet) - "Compile all *.el files in DIRECTORY asynchronously. -All *.elc files are systematically deleted before proceeding." - (cl-loop with dir = (directory-files directory t "\\.elc\\'") - unless dir return nil - for f in dir - when (file-exists-p f) do (delete-file f)) - ;; Ensure async is reloaded when async.elc is deleted. - ;; This happen when recompiling its own directory. - (load "async") - (let ((call-back - (lambda (&optional _ignore) - (if (file-exists-p async-byte-compile-log-file) - (let ((buf (get-buffer-create byte-compile-log-buffer)) - (n 0)) - (with-current-buffer buf - (goto-char (point-max)) - (let ((inhibit-read-only t)) - (insert-file-contents async-byte-compile-log-file) - (compilation-mode)) - (display-buffer buf) - (delete-file async-byte-compile-log-file) - (unless quiet - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "^.*:Error:" nil t) - (cl-incf n))) - (if (> n 0) - (message "Failed to compile %d files in directory `%s'" n directory) - (message "Directory `%s' compiled asynchronously with warnings" directory))))) - (unless quiet - (message "Directory `%s' compiled asynchronously with success" directory)))))) - (async-start - `(lambda () - (require 'bytecomp) - ,(async-inject-variables "\\`\\(load-path\\)\\|byte\\'") - (let ((default-directory (file-name-as-directory ,directory)) - error-data) - (add-to-list 'load-path default-directory) - (byte-recompile-directory ,directory 0 t) - (when (get-buffer byte-compile-log-buffer) - (setq error-data (with-current-buffer byte-compile-log-buffer - (buffer-substring-no-properties (point-min) (point-max)))) - (unless (string= error-data "") - (with-temp-file ,async-byte-compile-log-file - (erase-buffer) - (insert error-data)))))) - call-back) - (unless quiet (message "Started compiling asynchronously directory %s" directory)))) - -(defvar package-archive-contents) -(defvar package-alist) -(declare-function package-desc-reqs "package.el" (cl-x)) - -(defun async-bytecomp--get-package-deps (pkgs) - ;; Same as `package--get-deps' but parse instead `package-archive-contents' - ;; because PKG is not already installed and not present in `package-alist'. - ;; However fallback to `package-alist' in case PKG no more present - ;; in `package-archive-contents' due to modification to `package-archives'. - ;; See issue #58. - (let ((seen '())) - (while pkgs - (let ((pkg (pop pkgs))) - (unless (memq pkg seen) - (let ((pkg-desc (cadr (or (assq pkg package-archive-contents) - (assq pkg package-alist))))) - (when pkg-desc - (push pkg seen) - (setq pkgs (append (mapcar #'car (package-desc-reqs pkg-desc)) - pkgs))))))) - seen)) - -(defadvice package--compile (around byte-compile-async) - (let ((cur-package (package-desc-name pkg-desc)) - (pkg-dir (package-desc-dir pkg-desc))) - (if (or (member async-bytecomp-allowed-packages '(t all (all))) - (memq cur-package (async-bytecomp--get-package-deps - async-bytecomp-allowed-packages))) - (progn - (when (eq cur-package 'async) - (fmakunbound 'async-byte-recompile-directory)) - ;; Add to `load-path' the latest version of async and - ;; reload it when reinstalling async. - (when (string= cur-package "async") - (cl-pushnew pkg-dir load-path) - (load "async-bytecomp")) - ;; `async-byte-recompile-directory' will add directory - ;; as needed to `load-path'. - (async-byte-recompile-directory (package-desc-dir pkg-desc) t)) - ad-do-it))) - -;;;###autoload -(define-minor-mode async-bytecomp-package-mode - "Byte compile asynchronously packages installed with package.el. -Async compilation of packages can be controlled by -`async-bytecomp-allowed-packages'." - :group 'async - :global t - (if async-bytecomp-package-mode - (ad-activate 'package--compile) - (ad-deactivate 'package--compile))) - -;;;###autoload -(defun async-byte-compile-file (file) - "Byte compile Lisp code FILE asynchronously. - -Same as `byte-compile-file' but asynchronous." - (interactive "fFile: ") - (let ((call-back - (lambda (&optional _ignore) - (let ((bn (file-name-nondirectory file))) - (if (file-exists-p async-byte-compile-log-file) - (let ((buf (get-buffer-create byte-compile-log-buffer)) - start) - (with-current-buffer buf - (goto-char (setq start (point-max))) - (let ((inhibit-read-only t)) - (insert-file-contents async-byte-compile-log-file) - (compilation-mode)) - (display-buffer buf) - (delete-file async-byte-compile-log-file) - (save-excursion - (goto-char start) - (if (re-search-forward "^.*:Error:" nil t) - (message "Failed to compile `%s'" bn) - (message "`%s' compiled asynchronously with warnings" bn))))) - (message "`%s' compiled asynchronously with success" bn)))))) - (async-start - `(lambda () - (require 'bytecomp) - ,(async-inject-variables "\\`load-path\\'") - (let ((default-directory ,(file-name-directory file))) - (add-to-list 'load-path default-directory) - (byte-compile-file ,file) - (when (get-buffer byte-compile-log-buffer) - (setq error-data (with-current-buffer byte-compile-log-buffer - (buffer-substring-no-properties (point-min) (point-max)))) - (unless (string= error-data "") - (with-temp-file ,async-byte-compile-log-file - (erase-buffer) - (insert error-data)))))) - call-back))) - -(provide 'async-bytecomp) - -;;; async-bytecomp.el ends here diff --git a/elpa/async-20200113.1745/async-bytecomp.elc b/elpa/async-20200113.1745/async-bytecomp.elc deleted file mode 100644 index 1a350c76d405a49ab926c10d3efb061fbd3127f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7322 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 Wc0_}UcSMS_1n|00@R7(`8~+0gZ87Ko diff --git a/elpa/async-20200113.1745/async-pkg.el b/elpa/async-20200113.1745/async-pkg.el deleted file mode 100644 index dbce789b..00000000 --- a/elpa/async-20200113.1745/async-pkg.el +++ /dev/null @@ -1,8 +0,0 @@ -(define-package "async" "20200113.1745" "Asynchronous processing in Emacs" - '((emacs "24.3")) - :keywords - '("async") - :url "https://github.com/jwiegley/emacs-async") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/async-20200113.1745/async.el b/elpa/async-20200113.1745/async.el deleted file mode 100644 index 6437a301..00000000 --- a/elpa/async-20200113.1745/async.el +++ /dev/null @@ -1,408 +0,0 @@ -;;; async.el --- Asynchronous processing -*- lexical-binding: t -*- - -;; Copyright (C) 2012-2016 Free Software Foundation, Inc. - -;; Author: John Wiegley -;; Created: 18 Jun 2012 -;; Version: 1.9.4 -;; Package-Requires: ((emacs "24.3")) -;; Keywords: convenience async -;; URL: https://github.com/jwiegley/emacs-async - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2, or (at -;; your option) any later version. - -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Adds the ability to call asynchronous functions and process with ease. See -;; the documentation for `async-start' and `async-start-process'. - -;;; Code: - -(eval-when-compile (require 'cl-lib)) - -(defgroup async nil - "Simple asynchronous processing in Emacs" - :group 'emacs) - -(defcustom async-variables-noprops-function #'async--purecopy - "Default function to remove text properties in variables." - :group 'async - :type 'function) - -(defvar async-debug nil) -(defvar async-send-over-pipe t) -(defvar async-in-child-emacs nil) -(defvar async-callback nil) -(defvar async-callback-for-process nil) -(defvar async-callback-value nil) -(defvar async-callback-value-set nil) -(defvar async-current-process nil) -(defvar async--procvar nil) - -(defun async--purecopy (object) - "Remove text properties in OBJECT. - -Argument OBJECT may be a list or a string, if anything else it -is returned unmodified." - (cond ((stringp object) - (substring-no-properties object)) - ((consp object) - (cl-loop for elm in object - ;; A string. - if (stringp elm) - collect (substring-no-properties elm) - else - ;; Proper lists. - if (and (consp elm) (null (cdr (last elm)))) - collect (async--purecopy elm) - else - ;; Dotted lists. - ;; We handle here only dotted list where car and cdr - ;; are atoms i.e. (x . y) and not (x . (x . y)) or - ;; (x . (x y)) which should fit most cases. - if (and (consp elm) (cdr (last elm))) - collect (let ((key (car elm)) - (val (cdr elm))) - (cons (if (stringp key) - (substring-no-properties key) - key) - (if (stringp val) - (substring-no-properties val) - val))) - else - collect elm)) - (t object))) - -(defun async-inject-variables - (include-regexp &optional predicate exclude-regexp noprops) - "Return a `setq' form that replicates part of the calling environment. - -It sets the value for every variable matching INCLUDE-REGEXP and -also PREDICATE. It will not perform injection for any variable -matching EXCLUDE-REGEXP (if present) or representing a `syntax-table' -i.e. ending by \"-syntax-table\". -When NOPROPS is non nil it tries to strip out text properties of each -variable's value with `async-variables-noprops-function'. - -It is intended to be used as follows: - - (async-start - `(lambda () - (require 'smtpmail) - (with-temp-buffer - (insert ,(buffer-substring-no-properties (point-min) (point-max))) - ;; Pass in the variable environment for smtpmail - ,(async-inject-variables \"\\`\\(smtpmail\\|\\(user-\\)?mail\\)-\") - (smtpmail-send-it))) - 'ignore)" - `(setq - ,@(let (bindings) - (mapatoms - (lambda (sym) - (let* ((sname (and (boundp sym) (symbol-name sym))) - (value (and sname (symbol-value sym)))) - (when (and sname - (or (null include-regexp) - (string-match include-regexp sname)) - (or (null exclude-regexp) - (not (string-match exclude-regexp sname))) - (not (string-match "-syntax-table\\'" sname))) - (unless (or (stringp value) - (memq value '(nil t)) - (numberp value) - (vectorp value)) - (setq value `(quote ,value))) - (when noprops - (setq value (funcall async-variables-noprops-function - value))) - (when (or (null predicate) - (funcall predicate sym)) - (setq bindings (cons value bindings) - bindings (cons sym bindings))))))) - bindings))) - -(defalias 'async-inject-environment 'async-inject-variables) - -(defun async-handle-result (func result buf) - (if (null func) - (progn - (set (make-local-variable 'async-callback-value) result) - (set (make-local-variable 'async-callback-value-set) t)) - (unwind-protect - (if (and (listp result) - (eq 'async-signal (nth 0 result))) - (signal (car (nth 1 result)) - (cdr (nth 1 result))) - (funcall func result)) - (unless async-debug - (kill-buffer buf))))) - -(defun async-when-done (proc &optional _change) - "Process sentinel used to retrieve the value from the child process." - (when (eq 'exit (process-status proc)) - (with-current-buffer (process-buffer proc) - (let ((async-current-process proc)) - (if (= 0 (process-exit-status proc)) - (if async-callback-for-process - (if async-callback - (prog1 - (funcall async-callback proc) - (unless async-debug - (kill-buffer (current-buffer)))) - (set (make-local-variable 'async-callback-value) proc) - (set (make-local-variable 'async-callback-value-set) t)) - (goto-char (point-max)) - (backward-sexp) - (async-handle-result async-callback (read (current-buffer)) - (current-buffer))) - (set (make-local-variable 'async-callback-value) - (list 'error - (format "Async process '%s' failed with exit code %d" - (process-name proc) (process-exit-status proc)))) - (set (make-local-variable 'async-callback-value-set) t)))))) - -(defun async--receive-sexp (&optional stream) - (let ((sexp (decode-coding-string (base64-decode-string - (read stream)) 'utf-8-auto)) - ;; Parent expects UTF-8 encoded text. - (coding-system-for-write 'utf-8-auto)) - (if async-debug - (message "Received sexp {{{%s}}}" (pp-to-string sexp))) - (setq sexp (read sexp)) - (if async-debug - (message "Read sexp {{{%s}}}" (pp-to-string sexp))) - (eval sexp))) - -(defun async--insert-sexp (sexp) - (let (print-level - print-length - (print-escape-nonascii t) - (print-circle t)) - (prin1 sexp (current-buffer)) - ;; Just in case the string we're sending might contain EOF - (encode-coding-region (point-min) (point-max) 'utf-8-auto) - (base64-encode-region (point-min) (point-max) t) - (goto-char (point-min)) (insert ?\") - (goto-char (point-max)) (insert ?\" ?\n))) - -(defun async--transmit-sexp (process sexp) - (with-temp-buffer - (if async-debug - (message "Transmitting sexp {{{%s}}}" (pp-to-string sexp))) - (async--insert-sexp sexp) - (process-send-region process (point-min) (point-max)))) - -(defun async-batch-invoke () - "Called from the child Emacs process' command line." - ;; Make sure 'message' and 'prin1' encode stuff in UTF-8, as parent - ;; process expects. - (let ((coding-system-for-write 'utf-8-auto)) - (setq async-in-child-emacs t - debug-on-error async-debug) - (if debug-on-error - (prin1 (funcall - (async--receive-sexp (unless async-send-over-pipe - command-line-args-left)))) - (condition-case err - (prin1 (funcall - (async--receive-sexp (unless async-send-over-pipe - command-line-args-left)))) - (error - (prin1 (list 'async-signal err))))))) - -(defun async-ready (future) - "Query a FUTURE to see if it is ready. - -I.e., if no blocking -would result from a call to `async-get' on that FUTURE." - (and (memq (process-status future) '(exit signal)) - (let ((buf (process-buffer future))) - (if (buffer-live-p buf) - (with-current-buffer buf - async-callback-value-set) - t)))) - -(defun async-wait (future) - "Wait for FUTURE to become ready." - (while (not (async-ready future)) - (sleep-for 0.05))) - -(defun async-get (future) - "Get the value from process FUTURE when it is ready. -FUTURE is returned by `async-start' or `async-start-process' when -its FINISH-FUNC is nil." - (and future (async-wait future)) - (let ((buf (process-buffer future))) - (when (buffer-live-p buf) - (with-current-buffer buf - (async-handle-result - #'identity async-callback-value (current-buffer)))))) - -(defun async-message-p (value) - "Return non-nil of VALUE is an async.el message packet." - (and (listp value) - (plist-get value :async-message))) - -(defun async-send (&rest args) - "Send the given messages to the asychronous Emacs PROCESS." - (let ((args (append args '(:async-message t)))) - (if async-in-child-emacs - (if async-callback - (funcall async-callback args)) - (async--transmit-sexp (car args) (list 'quote (cdr args)))))) - -(defun async-receive () - "Send the given messages to the asychronous Emacs PROCESS." - (async--receive-sexp)) - -;;;###autoload -(defun async-start-process (name program finish-func &rest program-args) - "Start the executable PROGRAM asynchronously named NAME. See `async-start'. -PROGRAM is passed PROGRAM-ARGS, calling FINISH-FUNC with the -process object when done. If FINISH-FUNC is nil, the future -object will return the process object when the program is -finished. Set DEFAULT-DIRECTORY to change PROGRAM's current -working directory." - (let* ((buf (generate-new-buffer (concat "*" name "*"))) - (proc (let ((process-connection-type nil)) - (apply #'start-process name buf program program-args)))) - (with-current-buffer buf - (set (make-local-variable 'async-callback) finish-func) - (set-process-sentinel proc #'async-when-done) - (unless (string= name "emacs") - (set (make-local-variable 'async-callback-for-process) t)) - proc))) - -(defvar async-quiet-switch "-Q" - "The Emacs parameter to use to call emacs without config. -Can be one of \"-Q\" or \"-q\". -Default is \"-Q\" but it is sometimes useful to use \"-q\" to have a -enhanced config or some more variables loaded.") - -;;;###autoload -(defun async-start (start-func &optional finish-func) - "Execute START-FUNC (often a lambda) in a subordinate Emacs process. -When done, the return value is passed to FINISH-FUNC. Example: - - (async-start - ;; What to do in the child process - (lambda () - (message \"This is a test\") - (sleep-for 3) - 222) - - ;; What to do when it finishes - (lambda (result) - (message \"Async process done, result should be 222: %s\" - result))) - -If FINISH-FUNC is nil or missing, a future is returned that can -be inspected using `async-get', blocking until the value is -ready. Example: - - (let ((proc (async-start - ;; What to do in the child process - (lambda () - (message \"This is a test\") - (sleep-for 3) - 222)))) - - (message \"I'm going to do some work here\") ;; .... - - (message \"Waiting on async process, result should be 222: %s\" - (async-get proc))) - -If you don't want to use a callback, and you don't care about any -return value from the child process, pass the `ignore' symbol as -the second argument (if you don't, and never call `async-get', it -will leave *emacs* process buffers hanging around): - - (async-start - (lambda () - (delete-file \"a remote file on a slow link\" nil)) - 'ignore) - -Note: Even when FINISH-FUNC is present, a future is still -returned except that it yields no value (since the value is -passed to FINISH-FUNC). Call `async-get' on such a future always -returns nil. It can still be useful, however, as an argument to -`async-ready' or `async-wait'." - (let ((sexp start-func) - ;; Subordinate Emacs will send text encoded in UTF-8. - (coding-system-for-read 'utf-8-auto)) - (setq async--procvar - (async-start-process - "emacs" (file-truename - (expand-file-name invocation-name - invocation-directory)) - finish-func - async-quiet-switch "-l" - ;; Using `locate-library' ensure we use the right file - ;; when the .elc have been deleted. - (locate-library "async") - "-batch" "-f" "async-batch-invoke" - (if async-send-over-pipe - "" - (with-temp-buffer - (async--insert-sexp (list 'quote sexp)) - (buffer-string))))) - (if async-send-over-pipe - (async--transmit-sexp async--procvar (list 'quote sexp))) - async--procvar)) - -(defmacro async-sandbox(func) - "Evaluate FUNC in a separate Emacs process, synchronously." - `(async-get (async-start ,func))) - -(defun async--fold-left (fn forms bindings) - (let ((res forms)) - (dolist (binding bindings) - (setq res (funcall fn res - (if (listp binding) - binding - (list binding))))) - res)) - -(defmacro async-let (bindings &rest forms) - "Implements `let', but each binding is established asynchronously. -For example: - - (async-let ((x (foo)) - (y (bar))) - (message \"%s %s\" x y)) - - expands to ==> - - (async-start (foo) - (lambda (x) - (async-start (bar) - (lambda (y) - (message \"%s %s\" x y)))))" - (declare (indent 1)) - (async--fold-left - (lambda (acc binding) - (let ((fun (pcase (cadr binding) - ((and (pred functionp) f) f) - (f `(lambda () ,f))))) - `(async-start ,fun - (lambda (,(car binding)) - ,acc)))) - `(progn ,@forms) - (reverse bindings))) - -(provide 'async) - -;;; async.el ends here diff --git a/elpa/async-20200113.1745/async.elc b/elpa/async-20200113.1745/async.elc deleted file mode 100644 index c19fa6b3192363bf87939dba42f8379bdc4e4982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11497 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 diff --git a/elpa/async-20200113.1745/dired-async.el b/elpa/async-20200113.1745/dired-async.el deleted file mode 100644 index 1dba956b..00000000 --- a/elpa/async-20200113.1745/dired-async.el +++ /dev/null @@ -1,408 +0,0 @@ -;;; dired-async.el --- Asynchronous dired actions -*- lexical-binding: t -*- - -;; Copyright (C) 2012-2016 Free Software Foundation, Inc. - -;; Authors: John Wiegley -;; Thierry Volpiatto - -;; Keywords: dired async network -;; X-URL: https://github.com/jwiegley/dired-async - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2, or (at -;; your option) any later version. - -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This file provide a redefinition of `dired-create-file' function, -;; performs copies, moves and all what is handled by `dired-create-file' -;; in the background using a slave Emacs process, -;; by means of the async.el module. -;; To use it, put this in your .emacs: - -;; (dired-async-mode 1) - -;; This will enable async copy/rename etc... -;; in dired and helm. - -;;; Code: - -(require 'cl-lib) -(require 'dired-aux) -(require 'async) - -(eval-when-compile - (defvar async-callback)) - -(defgroup dired-async nil - "Copy rename files asynchronously from dired." - :group 'dired) - -(defcustom dired-async-env-variables-regexp - "\\`\\(tramp-\\(default\\|connection\\|remote\\)\\|ange-ftp\\)-.*" - "Variables matching this regexp will be loaded on Child Emacs." - :type 'regexp - :group 'dired-async) - -(defcustom dired-async-message-function 'dired-async-mode-line-message - "Function to use to notify result when operation finish. -Should take same args as `message'." - :group 'dired-async - :type 'function) - -(defcustom dired-async-log-file "/tmp/dired-async.log" - "File use to communicate errors from Child Emacs to host Emacs." - :group 'dired-async - :type 'string) - -(defcustom dired-async-mode-lighter '(:eval - (when (eq major-mode 'dired-mode) - " Async")) - "Mode line lighter used for `dired-async-mode'." - :group 'dired-async - :risky t - :type 'sexp) - -(defface dired-async-message - '((t (:foreground "yellow"))) - "Face used for mode-line message." - :group 'dired-async) - -(defface dired-async-failures - '((t (:foreground "red"))) - "Face used for mode-line message." - :group 'dired-async) - -(defface dired-async-mode-message - '((t (:foreground "Gold"))) - "Face used for `dired-async--modeline-mode' lighter." - :group 'dired-async) - -(define-minor-mode dired-async--modeline-mode - "Notify mode-line that an async process run." - :group 'dired-async - :global t - :lighter (:eval (propertize (format " [%s Async job(s) running]" - (length (dired-async-processes))) - 'face 'dired-async-mode-message)) - (unless dired-async--modeline-mode - (let ((visible-bell t)) (ding)))) - -(defun dired-async-mode-line-message (text face &rest args) - "Notify end of operation in `mode-line'." - (message nil) - (let ((mode-line-format (concat - " " (propertize - (if args - (apply #'format text args) - text) - 'face face)))) - (force-mode-line-update) - (sit-for 3) - (force-mode-line-update))) - -(defun dired-async-processes () - (cl-loop for p in (process-list) - when (cl-loop for c in (process-command p) thereis - (string= "async-batch-invoke" c)) - collect p)) - -(defun dired-async-kill-process () - (interactive) - (let* ((processes (dired-async-processes)) - (proc (car (last processes)))) - (and proc (delete-process proc)) - (unless (> (length processes) 1) - (dired-async--modeline-mode -1)))) - -(defun dired-async-after-file-create (total operation failures skipped) - "Callback function used for operation handled by `dired-create-file'." - (unless (dired-async-processes) - ;; Turn off mode-line notification - ;; only when last process end. - (dired-async--modeline-mode -1)) - (when operation - (if (file-exists-p dired-async-log-file) - (progn - (pop-to-buffer (get-buffer-create dired-log-buffer)) - (goto-char (point-max)) - (setq inhibit-read-only t) - (insert "Error: ") - (insert-file-contents dired-async-log-file) - (special-mode) - (shrink-window-if-larger-than-buffer) - (delete-file dired-async-log-file)) - (run-with-timer - 0.1 nil - (lambda () - ;; First send error messages. - (cond (failures - (funcall dired-async-message-function - "%s failed for %d of %d file%s -- See *Dired log* buffer" - 'dired-async-failures - (car operation) (length failures) - total (dired-plural-s total))) - (skipped - (funcall dired-async-message-function - "%s: %d of %d file%s skipped -- See *Dired log* buffer" - 'dired-async-failures - (car operation) (length skipped) total - (dired-plural-s total)))) - (when dired-buffers - (cl-loop for (_f . b) in dired-buffers - when (buffer-live-p b) - do (with-current-buffer b - (when (and (not (file-remote-p default-directory nil t)) - (file-exists-p default-directory)) - (revert-buffer nil t))))) - ;; Finally send the success message. - (funcall dired-async-message-function - "Asynchronous %s of %s on %s file%s done" - 'dired-async-message - (car operation) (cadr operation) - total (dired-plural-s total))))))) - -(defun dired-async-maybe-kill-ftp () - "Return a form to kill ftp process in child emacs." - (quote - (progn - (require 'cl-lib) - (let ((buf (cl-loop for b in (buffer-list) - thereis (and (string-match - "\\`\\*ftp.*" - (buffer-name b)) b)))) - (when buf (kill-buffer buf)))))) - -(defvar overwrite-query) -(defun dired-async-create-files (file-creator operation fn-list name-constructor - &optional _marker-char) - "Same as `dired-create-files' but asynchronous. - -See `dired-create-files' for the behavior of arguments." - (setq overwrite-query nil) - (let ((total (length fn-list)) - failures async-fn-list skipped callback - async-quiet-switch) - (let (to) - (dolist (from fn-list) - (setq to (funcall name-constructor from)) - (if (and (equal to from) - (null (eq file-creator 'backup-file))) - (progn - (setq to nil) - (dired-log "Cannot %s to same file: %s\n" - (downcase operation) from))) - (if (not to) - (setq skipped (cons (dired-make-relative from) skipped)) - (let* ((overwrite (and (null (eq file-creator 'backup-file)) - (file-exists-p to))) - (dired-overwrite-confirmed ; for dired-handle-overwrite - (and overwrite - (let ((help-form `(format "\ -Type SPC or `y' to overwrite file `%s', -DEL or `n' to skip to next, -ESC or `q' to not overwrite any of the remaining files, -`!' to overwrite all remaining files with no more questions." ,to))) - (dired-query 'overwrite-query "Overwrite `%s'?" to))))) - ;; Handle the `dired-copy-file' file-creator specially - ;; When copying a directory to another directory or - ;; possibly to itself or one of its subdirectories. - ;; e.g "~/foo/" => "~/test/" - ;; or "~/foo/" =>"~/foo/" - ;; or "~/foo/ => ~/foo/bar/") - ;; In this case the 'name-constructor' have set the destination - ;; TO to "~/test/foo" because the old emacs23 behavior - ;; of `copy-directory' was to not create the subdirectory - ;; and instead copy the contents. - ;; With the new behavior of `copy-directory' - ;; (similar to the `cp' shell command) we don't - ;; need such a construction of the target directory, - ;; so modify the destination TO to "~/test/" instead of "~/test/foo/". - (let ((destname (file-name-directory to))) - (when (and (file-directory-p from) - (file-directory-p to) - (eq file-creator 'dired-copy-file)) - (setq to destname)) - ;; If DESTNAME is a subdirectory of FROM, not a symlink, - ;; and the method in use is copying, signal an error. - (and (eq t (car (file-attributes destname))) - (eq file-creator 'dired-copy-file) - (file-in-directory-p destname from) - (error "Cannot copy `%s' into its subdirectory `%s'" - from to))) - (if overwrite - (or (and dired-overwrite-confirmed - (push (cons from to) async-fn-list)) - (progn - (push (dired-make-relative from) failures) - (dired-log "%s `%s' to `%s' failed\n" - operation from to))) - (push (cons from to) async-fn-list))))) - ;; Fix tramp issue #80 with emacs-26, use "-q" only when needed. - (setq async-quiet-switch - (if (and (boundp 'tramp-cache-read-persistent-data) - async-fn-list - (cl-loop for (_from . to) in async-fn-list - thereis (file-remote-p to))) - "-q" "-Q")) - ;; When failures have been printed to dired log add the date at bob. - (when (or failures skipped) (dired-log t)) - ;; When async-fn-list is empty that's mean only one file - ;; had to be copied and user finally answer NO. - ;; In this case async process will never start and callback - ;; will have no chance to run, so notify failures here. - (unless async-fn-list - (cond (failures - (funcall dired-async-message-function - "%s failed for %d of %d file%s -- See *Dired log* buffer" - 'dired-async-failures - operation (length failures) - total (dired-plural-s total))) - (skipped - (funcall dired-async-message-function - "%s: %d of %d file%s skipped -- See *Dired log* buffer" - 'dired-async-failures - operation (length skipped) total - (dired-plural-s total))))) - ;; Setup callback. - (setq callback - (lambda (&optional _ignore) - (dired-async-after-file-create - total (list operation (length async-fn-list)) failures skipped) - (when (string= (downcase operation) "rename") - (cl-loop for (file . to) in async-fn-list - for bf = (get-file-buffer file) - for destp = (file-exists-p to) - do (and bf destp - (with-current-buffer bf - (set-visited-file-name to t t)))))))) - ;; Start async process. - (when async-fn-list - (async-start `(lambda () - (require 'cl-lib) (require 'dired-aux) (require 'dired-x) - ,(async-inject-variables dired-async-env-variables-regexp) - (let ((dired-recursive-copies (quote always)) - (dired-copy-preserve-time - ,dired-copy-preserve-time)) - (setq overwrite-backup-query nil) - ;; Inline `backup-file' as long as it is not - ;; available in emacs. - (defalias 'backup-file - ;; Same feature as "cp -f --backup=numbered from to" - ;; Symlinks are copied as file from source unlike - ;; `dired-copy-file' which is same as cp -d. - ;; Directories are omitted. - (lambda (from to ok) - (cond ((file-directory-p from) (ignore)) - (t (let ((count 0)) - (while (let ((attrs (file-attributes to))) - (and attrs (null (nth 0 attrs)))) - (cl-incf count) - (setq to (concat (file-name-sans-versions to) - (format ".~%s~" count))))) - (condition-case err - (copy-file from to ok dired-copy-preserve-time) - (file-date-error - (dired-log "Can't set date on %s:\n%s\n" from err))))))) - ;; Now run the FILE-CREATOR function on files. - (cl-loop with fn = (quote ,file-creator) - for (from . dest) in (quote ,async-fn-list) - do (condition-case err - (funcall fn from dest t) - (file-error - (dired-log "%s: %s\n" (car err) (cdr err))) - nil)) - (when (get-buffer dired-log-buffer) - (dired-log t) - (with-current-buffer dired-log-buffer - (write-region (point-min) (point-max) - ,dired-async-log-file)))) - ,(dired-async-maybe-kill-ftp)) - callback) - ;; Run mode-line notifications while process running. - (dired-async--modeline-mode 1) - (message "%s proceeding asynchronously..." operation)))) - -(defvar wdired-use-interactive-rename) -(defun dired-async-wdired-do-renames (old-fn &rest args) - ;; Perhaps a better fix would be to ask for renaming BEFORE starting - ;; OLD-FN when `wdired-use-interactive-rename' is non-nil. For now - ;; just bind it to nil to ensure no questions will be asked between - ;; each rename. - (let (wdired-use-interactive-rename) - (apply old-fn args))) - -(defadvice wdired-do-renames (around wdired-async) - (let (wdired-use-interactive-rename) - ad-do-it)) - -(defadvice dired-create-files (around dired-async) - (dired-async-create-files file-creator operation fn-list - name-constructor marker-char)) - -;;;###autoload -(define-minor-mode dired-async-mode - "Do dired actions asynchronously." - :group 'dired-async - :lighter dired-async-mode-lighter - :global t - (if dired-async-mode - (if (fboundp 'advice-add) - (progn (advice-add 'dired-create-files :override #'dired-async-create-files) - (advice-add 'wdired-do-renames :around #'dired-async-wdired-do-renames)) - (ad-activate 'dired-create-files) - (ad-activate 'wdired-do-renames)) - (if (fboundp 'advice-remove) - (progn (advice-remove 'dired-create-files #'dired-async-create-files) - (advice-remove 'wdired-do-renames #'dired-async-wdired-do-renames)) - (ad-deactivate 'dired-create-files) - (ad-deactivate 'wdired-do-renames)))) - -(defmacro dired-async--with-async-create-files (&rest body) - "Evaluate BODY with ‘dired-create-files’ set to ‘dired-async-create-files’." - (declare (indent 0)) - `(cl-letf (((symbol-function 'dired-create-files) #'dired-async-create-files)) - ,@body)) - -;;;###autoload -(defun dired-async-do-copy (&optional arg) - "Run ‘dired-do-copy’ asynchronously." - (interactive "P") - (dired-async--with-async-create-files - (dired-do-copy arg))) - -;;;###autoload -(defun dired-async-do-symlink (&optional arg) - "Run ‘dired-do-symlink’ asynchronously." - (interactive "P") - (dired-async--with-async-create-files - (dired-do-symlink arg))) - -;;;###autoload -(defun dired-async-do-hardlink (&optional arg) - "Run ‘dired-do-hardlink’ asynchronously." - (interactive "P") - (dired-async--with-async-create-files - (dired-do-hardlink arg))) - -;;;###autoload -(defun dired-async-do-rename (&optional arg) - "Run ‘dired-do-rename’ asynchronously." - (interactive "P") - (dired-async--with-async-create-files - (dired-do-rename arg))) - -(provide 'dired-async) - -;;; dired-async.el ends here diff --git a/elpa/async-20200113.1745/dired-async.elc b/elpa/async-20200113.1745/dired-async.elc deleted file mode 100644 index 5f57380c9a85a617dbe91f7539d899adf051870d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13978 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 CE6RKT diff --git a/elpa/async-20200113.1745/smtpmail-async.el b/elpa/async-20200113.1745/smtpmail-async.el deleted file mode 100644 index ac269231..00000000 --- a/elpa/async-20200113.1745/smtpmail-async.el +++ /dev/null @@ -1,73 +0,0 @@ -;;; smtpmail-async.el --- Send e-mail with smtpmail.el asynchronously -*- lexical-binding: t -*- - -;; Copyright (C) 2012-2016 Free Software Foundation, Inc. - -;; Author: John Wiegley -;; Created: 18 Jun 2012 - -;; Keywords: email async -;; X-URL: https://github.com/jwiegley/emacs-async - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2, or (at -;; your option) any later version. - -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Send e-mail with smtpmail.el asynchronously. To use: -;; -;; (require 'smtpmail-async) -;; -;; (setq send-mail-function 'async-smtpmail-send-it -;; message-send-mail-function 'async-smtpmail-send-it) -;; -;; This assumes you already have smtpmail.el working. - -;;; Code: - -(defgroup smtpmail-async nil - "Send e-mail with smtpmail.el asynchronously" - :group 'smptmail) - -(require 'async) -(require 'smtpmail) -(require 'message) - -(defvar async-smtpmail-before-send-hook nil - "Hook running in the child emacs in `async-smtpmail-send-it'. -It is called just before calling `smtpmail-send-it'.") - -(defun async-smtpmail-send-it () - (let ((to (message-field-value "To")) - (buf-content (buffer-substring-no-properties - (point-min) (point-max)))) - (message "Delivering message to %s..." to) - (async-start - `(lambda () - (require 'smtpmail) - (with-temp-buffer - (insert ,buf-content) - (set-buffer-multibyte nil) - ;; Pass in the variable environment for smtpmail - ,(async-inject-variables - "\\`\\(smtpmail\\|async-smtpmail\\|\\(user-\\)?mail\\)-\\|auth-sources\\|epg\\|nsm" - nil "\\`\\(mail-header-format-function\\|smtpmail-address-buffer\\|mail-mode-abbrev-table\\)") - (run-hooks 'async-smtpmail-before-send-hook) - (smtpmail-send-it))) - (lambda (&optional _ignore) - (message "Delivering message to %s...done" to))))) - -(provide 'smtpmail-async) - -;;; smtpmail-async.el ends here diff --git a/elpa/async-20200113.1745/smtpmail-async.elc b/elpa/async-20200113.1745/smtpmail-async.elc deleted file mode 100644 index 9eb611a1eaf8f957fff2b95f9ceee04753bd61bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmbtU!EW3(5H%3MDD(q8b|TmD3J8Uj*1H?mhop7f#z4>jNp6+_b0x}RLXiqdZQ&vx z-$!X>CvlNW1W*(?!+E25k8^td`t0Yuy}ju4^pws_+esy=VIei0x4d+;71l|kDPN_F z!Savv4RNK&bY8adU+!UcX*3w$H_}m!DAYUQsJhj>l_gcCblysR?F-k9>k~&Vrb*3G}?1G_r7M&u%p@U@6IkRsBF09rALZS2Y9Y4a)wH-X(LD({uRjX zR~!j$l@ykI1IK(Z;-UmU^n?U{^ogQqwz>6!m8KFD7mN8EBg4os78u7E%flkif?sIu9I)b3FRd8;?!r?moZ~m*idIQ<@FL5W^valzWP7clhoAu8 z2oNb1pa;ca>v{lV6FhTBj7fi#Mi-u-uoC)%d_LgEKy+;Y8@58g>xYMaiDs3kx7?1o z-G?2Ij?tTtRj9)3;8#j%m7gTZaE>d<9Uc9DMs#pFzvt;O_{c?71mXs=9^rGOYB|wW zECO{IIL-3?{g;^FnSs_UxU4a+4)9w4f#=U+k;6HMa}ELI@XU|*e*#Rt3?MlKkgpE| z$UyY2)~uF7Rcy;u4-vgLF>U&~7M8hwGhRcc4ePAwg!K|vY7D-8N|c9Xgf9{gJuUTnmOTjTdeJsmqF|yO0tVC^#@UU zq;4hOD5Mq_#dT54rqD(4`D-Gu0W+G7Wkr!Z4@$(0@6WvV4RfZqrEpk^?gnq|+IWgN zsJ{{D5tczhE%&VMbs5?jJSRkkPGzCtUD~h==UQA)#y1-)w#Iq9vBxqdk}2Sh}3(`W}Uq(IUR0V?@-2 np4FP3gdT1*S9I~$-*4WYCopG=D+nLz*h=)EJ5t9!kwpIi&FlO> diff --git a/elpa/atom-one-dark-theme-readme.txt b/elpa/atom-one-dark-theme-readme.txt deleted file mode 100644 index bc3d7cb8..00000000 --- a/elpa/atom-one-dark-theme-readme.txt +++ /dev/null @@ -1 +0,0 @@ -An Emacs port of the Atom One Dark theme from Atom.io. diff --git a/elpa/avy-20200311.1106/avy-autoloads.el b/elpa/avy-20200311.1106/avy-autoloads.el deleted file mode 100644 index 28a10e8f..00000000 --- a/elpa/avy-20200311.1106/avy-autoloads.el +++ /dev/null @@ -1,272 +0,0 @@ -;;; avy-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "avy" "avy.el" (0 0 0 0)) -;;; Generated autoloads from avy.el - -(autoload 'avy-goto-char "avy" "\ -Jump to the currently visible CHAR. -The window scope is determined by `avy-all-windows' (ARG negates it). - -\(fn CHAR &optional ARG)" t nil) - -(autoload 'avy-goto-char-in-line "avy" "\ -Jump to the currently visible CHAR in the current line. - -\(fn CHAR)" t nil) - -(autoload 'avy-goto-char-2 "avy" "\ -Jump to the currently visible CHAR1 followed by CHAR2. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched. - -\(fn CHAR1 CHAR2 &optional ARG BEG END)" t nil) - -(autoload 'avy-goto-char-2-above "avy" "\ -Jump to the currently visible CHAR1 followed by CHAR2. -This is a scoped version of `avy-goto-char-2', where the scope is -the visible part of the current buffer up to point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. - -\(fn CHAR1 CHAR2 &optional ARG)" t nil) - -(autoload 'avy-goto-char-2-below "avy" "\ -Jump to the currently visible CHAR1 followed by CHAR2. -This is a scoped version of `avy-goto-char-2', where the scope is -the visible part of the current buffer following point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. - -\(fn CHAR1 CHAR2 &optional ARG)" t nil) - -(autoload 'avy-isearch "avy" "\ -Jump to one of the current isearch candidates. - -\(fn)" t nil) - -(autoload 'avy-goto-word-0 "avy" "\ -Jump to a word start. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched. - -\(fn ARG &optional BEG END)" t nil) - -(autoload 'avy-goto-whitespace-end "avy" "\ -Jump to the end of a whitespace sequence. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched. - -\(fn ARG &optional BEG END)" t nil) - -(autoload 'avy-goto-word-1 "avy" "\ -Jump to the currently visible CHAR at a word start. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched. -When SYMBOL is non-nil, jump to symbol start instead of word start. - -\(fn CHAR &optional ARG BEG END SYMBOL)" t nil) - -(autoload 'avy-goto-word-1-above "avy" "\ -Jump to the currently visible CHAR at a word start. -This is a scoped version of `avy-goto-word-1', where the scope is -the visible part of the current buffer up to point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. - -\(fn CHAR &optional ARG)" t nil) - -(autoload 'avy-goto-word-1-below "avy" "\ -Jump to the currently visible CHAR at a word start. -This is a scoped version of `avy-goto-word-1', where the scope is -the visible part of the current buffer following point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. - -\(fn CHAR &optional ARG)" t nil) - -(autoload 'avy-goto-symbol-1 "avy" "\ -Jump to the currently visible CHAR at a symbol start. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. - -\(fn CHAR &optional ARG)" t nil) - -(autoload 'avy-goto-symbol-1-above "avy" "\ -Jump to the currently visible CHAR at a symbol start. -This is a scoped version of `avy-goto-symbol-1', where the scope is -the visible part of the current buffer up to point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. - -\(fn CHAR &optional ARG)" t nil) - -(autoload 'avy-goto-symbol-1-below "avy" "\ -Jump to the currently visible CHAR at a symbol start. -This is a scoped version of `avy-goto-symbol-1', where the scope is -the visible part of the current buffer following point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. - -\(fn CHAR &optional ARG)" t nil) - -(autoload 'avy-goto-subword-0 "avy" "\ -Jump to a word or subword start. -The window scope is determined by `avy-all-windows' (ARG negates it). - -When PREDICATE is non-nil it's a function of zero parameters that -should return true. - -BEG and END narrow the scope where candidates are searched. - -\(fn &optional ARG PREDICATE BEG END)" t nil) - -(autoload 'avy-goto-subword-1 "avy" "\ -Jump to the currently visible CHAR at a subword start. -The window scope is determined by `avy-all-windows' (ARG negates it). -The case of CHAR is ignored. - -\(fn CHAR &optional ARG)" t nil) - -(autoload 'avy-goto-word-or-subword-1 "avy" "\ -Forward to `avy-goto-subword-1' or `avy-goto-word-1'. -Which one depends on variable `subword-mode'. - -\(fn)" t nil) - -(autoload 'avy-goto-line "avy" "\ -Jump to a line start in current buffer. - -When ARG is 1, jump to lines currently visible, with the option -to cancel to `goto-line' by entering a number. - -When ARG is 4, negate the window scope determined by -`avy-all-windows'. - -Otherwise, forward to `goto-line' with ARG. - -\(fn &optional ARG)" t nil) - -(autoload 'avy-goto-line-above "avy" "\ -Goto visible line above the cursor. -OFFSET changes the distance between the closest key to the cursor and -the cursor -When BOTTOM-UP is non-nil, display avy candidates from top to bottom - -\(fn &optional OFFSET BOTTOM-UP)" t nil) - -(autoload 'avy-goto-line-below "avy" "\ -Goto visible line below the cursor. -OFFSET changes the distance between the closest key to the cursor and -the cursor -When BOTTOM-UP is non-nil, display avy candidates from top to bottom - -\(fn &optional OFFSET BOTTOM-UP)" t nil) - -(autoload 'avy-goto-end-of-line "avy" "\ -Call `avy-goto-line' and move to the end of the line. - -\(fn &optional ARG)" t nil) - -(autoload 'avy-copy-line "avy" "\ -Copy a selected line above the current line. -ARG lines can be used. - -\(fn ARG)" t nil) - -(autoload 'avy-move-line "avy" "\ -Move a selected line above the current line. -ARG lines can be used. - -\(fn ARG)" t nil) - -(autoload 'avy-copy-region "avy" "\ -Select two lines and copy the text between them to point. - -The window scope is determined by `avy-all-windows' or -`avy-all-windows-alt' when ARG is non-nil. - -\(fn ARG)" t nil) - -(autoload 'avy-move-region "avy" "\ -Select two lines and move the text between them above the current line. - -\(fn)" t nil) - -(autoload 'avy-kill-region "avy" "\ -Select two lines and kill the region between them. - -The window scope is determined by `avy-all-windows' or -`avy-all-windows-alt' when ARG is non-nil. - -\(fn ARG)" t nil) - -(autoload 'avy-kill-ring-save-region "avy" "\ -Select two lines and save the region between them to the kill ring. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. - -\(fn ARG)" t nil) - -(autoload 'avy-kill-whole-line "avy" "\ -Select line and kill the whole selected line. - -With a numerical prefix ARG, kill ARG line(s) starting from the -selected line. If ARG is negative, kill backward. - -If ARG is zero, kill the selected line but exclude the trailing -newline. - -\\[universal-argument] 3 \\[avy-kil-whole-line] kill three lines -starting from the selected line. \\[universal-argument] -3 - -\\[avy-kill-whole-line] kill three lines backward including the -selected line. - -\(fn ARG)" t nil) - -(autoload 'avy-kill-ring-save-whole-line "avy" "\ -Select line and save the whole selected line as if killed, but don’t kill it. - -This command is similar to `avy-kill-whole-line', except that it -saves the line(s) as if killed, but does not kill it(them). - -With a numerical prefix ARG, kill ARG line(s) starting from the -selected line. If ARG is negative, kill backward. - -If ARG is zero, kill the selected line but exclude the trailing -newline. - -\(fn ARG)" t nil) - -(autoload 'avy-setup-default "avy" "\ -Setup the default shortcuts. - -\(fn)" nil nil) - -(autoload 'avy-goto-char-timer "avy" "\ -Read one or many consecutive chars and jump to the first one. -The window scope is determined by `avy-all-windows' (ARG negates it). - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "avy" '("avy-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; avy-autoloads.el ends here diff --git a/elpa/avy-20200311.1106/avy-pkg.el b/elpa/avy-20200311.1106/avy-pkg.el deleted file mode 100644 index 441d8fe8..00000000 --- a/elpa/avy-20200311.1106/avy-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "avy" "20200311.1106" "Jump to arbitrary positions in visible text and select text quickly." '((emacs "24.1") (cl-lib "0.5")) :commit "3bf83140fad4c28f2dc4c7107b9d8fef84d17cb9" :keywords '("point" "location") :authors '(("Oleh Krehel" . "ohwoeowho@gmail.com")) :maintainer '("Oleh Krehel" . "ohwoeowho@gmail.com") :url "https://github.com/abo-abo/avy") diff --git a/elpa/avy-20200311.1106/avy.el b/elpa/avy-20200311.1106/avy.el deleted file mode 100644 index 75c61874..00000000 --- a/elpa/avy-20200311.1106/avy.el +++ /dev/null @@ -1,2197 +0,0 @@ -;;; avy.el --- Jump to arbitrary positions in visible text and select text quickly. -*- lexical-binding: t -*- - -;; Copyright (C) 2015-2019 Free Software Foundation, Inc. - -;; Author: Oleh Krehel -;; URL: https://github.com/abo-abo/avy -;; Package-Version: 20200311.1106 -;; Version: 0.5.0 -;; Package-Requires: ((emacs "24.1") (cl-lib "0.5")) -;; Keywords: point, location - -;; This file is part of GNU Emacs. - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; For a full copy of the GNU General Public License -;; see . - -;;; Commentary: -;; -;; With Avy, you can move point to any position in Emacs – even in a -;; different window – using very few keystrokes. For this, you look at -;; the position where you want point to be, invoke Avy, and then enter -;; the sequence of characters displayed at that position. -;; -;; If the position you want to jump to can be determined after only -;; issuing a single keystroke, point is moved to the desired position -;; immediately after that keystroke. In case this isn't possible, the -;; sequence of keystrokes you need to enter is comprised of more than -;; one character. Avy uses a decision tree where each candidate position -;; is a leaf and each edge is described by a character which is distinct -;; per level of the tree. By entering those characters, you navigate the -;; tree, quickly arriving at the desired candidate position, such that -;; Avy can move point to it. -;; -;; Note that this only makes sense for positions you are able to see -;; when invoking Avy. These kinds of positions are supported: -;; -;; * character positions -;; * word or subword start positions -;; * line beginning positions -;; * link positions -;; * window positions -;; -;; If you're familiar with the popular `ace-jump-mode' package, this -;; package does all that and more, without the implementation -;; headache. - -;;; Code: -(require 'cl-lib) -(require 'ring) - -;;* Customization -(defgroup avy nil - "Jump to things tree-style." - :group 'convenience - :prefix "avy-") - -(defcustom avy-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l) - "Default keys for jumping. -Any key is either a character representing a self-inserting -key (letters, digits, punctuation, etc.) or a symbol denoting a -non-printing key like an arrow key (left, right, up, down). For -non-printing keys, a corresponding entry in -`avy-key-to-char-alist' must exist in order to visualize the key -in the avy overlays. - -If `avy-style' is set to words, make sure there are at least three -keys different than the following: a, e, i, o, u, y" - :type '(repeat :tag "Keys" (choice - (character :tag "char") - (symbol :tag "non-printing key")))) - -(defconst avy--key-type - '(choice :tag "Command" - (const avy-goto-char) - (const avy-goto-char-2) - (const avy-isearch) - (const avy-goto-line) - (const avy-goto-subword-0) - (const avy-goto-subword-1) - (const avy-goto-word-0) - (const avy-goto-word-1) - (const avy-copy-line) - (const avy-copy-region) - (const avy-move-line) - (const avy-move-region) - (const avy-kill-whole-line) - (const avy-kill-region) - (const avy-kill-ring-save-whole-line) - (const avy-kill-ring-save-region) - (function :tag "Other command"))) - -(defcustom avy-keys-alist nil - "Alist of avy-jump commands to `avy-keys' overriding the default `avy-keys'." - :type `(alist - :key-type ,avy--key-type - :value-type (repeat :tag "Keys" character))) - -(defcustom avy-orders-alist '((avy-goto-char . avy-order-closest)) - "Alist of candidate ordering functions. -Usually, candidates appear in their point position order." - :type `(alist - :key-type ,avy--key-type - :value-type function)) - -(defcustom avy-words - '("am" "by" "if" "is" "it" "my" "ox" "up" - "ace" "act" "add" "age" "ago" "aim" "air" "ale" "all" "and" "ant" "any" - "ape" "apt" "arc" "are" "arm" "art" "ash" "ate" "awe" "axe" "bad" "bag" - "ban" "bar" "bat" "bay" "bed" "bee" "beg" "bet" "bid" "big" "bit" "bob" - "bot" "bow" "box" "boy" "but" "cab" "can" "cap" "car" "cat" "cog" "cop" - "cow" "cry" "cup" "cut" "day" "dew" "did" "die" "dig" "dim" "dip" "dog" - "dot" "dry" "dub" "dug" "dye" "ear" "eat" "eel" "egg" "ego" "elf" "eve" - "eye" "fan" "far" "fat" "fax" "fee" "few" "fin" "fit" "fix" "flu" "fly" - "foe" "fog" "for" "fox" "fry" "fun" "fur" "gag" "gap" "gas" "gel" "gem" - "get" "gig" "gin" "gnu" "god" "got" "gum" "gun" "gut" "guy" "gym" "had" - "hag" "ham" "has" "hat" "her" "hid" "him" "hip" "his" "hit" "hop" "hot" - "how" "hub" "hue" "hug" "hut" "ice" "icy" "imp" "ink" "inn" "ion" "ire" - "ivy" "jab" "jam" "jar" "jaw" "jet" "job" "jog" "joy" "key" "kid" "kit" - "lag" "lap" "lay" "let" "lid" "lie" "lip" "lit" "lob" "log" "lot" "low" - "mad" "man" "map" "mat" "may" "men" "met" "mix" "mob" "mop" "mud" "mug" - "nag" "nap" "new" "nil" "nod" "nor" "not" "now" "nun" "oak" "odd" "off" - "oil" "old" "one" "orb" "ore" "ork" "our" "out" "owl" "own" "pad" "pan" - "par" "pat" "paw" "pay" "pea" "pen" "pet" "pig" "pin" "pit" "pod" "pot" - "pry" "pub" "pun" "put" "rag" "ram" "ran" "rat" "raw" "ray" "red" "rib" - "rim" "rip" "rob" "rod" "rot" "row" "rub" "rug" "rum" "run" "sad" "sat" - "saw" "say" "sea" "see" "sew" "she" "shy" "sin" "sip" "sit" "six" "ski" - "sky" "sly" "sob" "son" "soy" "spy" "sum" "sun" "tab" "tad" "tag" "tan" - "tap" "tar" "tax" "tea" "the" "tie" "tin" "tip" "toe" "ton" "too" "top" - "toy" "try" "tub" "two" "urn" "use" "van" "war" "was" "wax" "way" "web" - "wed" "wet" "who" "why" "wig" "win" "wit" "woe" "won" "wry" "you" "zap" - "zip" "zoo") - "Words to use in case `avy-style' is set to `words'. -Every word should contain at least one vowel i.e. one of the following -characters: a, e, i, o, u, y -They do not have to be sorted but no word should be a prefix of another one." - :type '(repeat string)) - -(defcustom avy-style 'at-full - "The default method of displaying the overlays. -Use `avy-styles-alist' to customize this per-command." - :type '(choice - (const :tag "Pre" pre) - (const :tag "At" at) - (const :tag "At Full" at-full) - (const :tag "Post" post) - (const :tag "De Bruijn" de-bruijn) - (const :tag "Words" words))) - -(defcustom avy-styles-alist nil - "Alist of avy-jump commands to the style for each command. -If the commands isn't on the list, `avy-style' is used." - :type '(alist - :key-type (choice :tag "Command" - (const avy-goto-char) - (const avy-goto-char-2) - (const avy-isearch) - (const avy-goto-line) - (const avy-goto-subword-0) - (const avy-goto-subword-1) - (const avy-goto-word-0) - (const avy-goto-word-1) - (const avy-copy-line) - (const avy-copy-region) - (const avy-move-line) - (const avy-move-region) - (const avy-kill-whole-line) - (const avy-kill-region) - (const avy-kill-ring-save-whole-line) - (const avy-kill-ring-save-region) - (function :tag "Other command")) - :value-type (choice - (const :tag "Pre" pre) - (const :tag "At" at) - (const :tag "At Full" at-full) - (const :tag "Post" post) - (const :tag "De Bruijn" de-bruijn) - (const :tag "Words" words)))) - -(defcustom avy-dispatch-alist - '((?x . avy-action-kill-move) - (?X . avy-action-kill-stay) - (?t . avy-action-teleport) - (?m . avy-action-mark) - (?n . avy-action-copy) - (?y . avy-action-yank) - (?i . avy-action-ispell) - (?z . avy-action-zap-to-char)) - "List of actions for `avy-handler-default'. - -Each item is (KEY . ACTION). When KEY not on `avy-keys' is -pressed during the dispatch, ACTION is set to replace the default -`avy-action-goto' once a candidate is finally selected." - :type - '(alist - :key-type (choice (character :tag "Char")) - :value-type (choice - (const :tag "Mark" avy-action-mark) - (const :tag "Copy" avy-action-copy) - (const :tag "Kill and move point" avy-action-kill-move) - (const :tag "Kill" avy-action-kill-stay)))) - -(defcustom avy-background nil - "When non-nil, a gray background will be added during the selection." - :type 'boolean) - -(defcustom avy-all-windows t - "Determine the list of windows to consider in search of candidates." - :type - '(choice - (const :tag "All Frames" all-frames) - (const :tag "This Frame" t) - (const :tag "This Window" nil))) - -(defcustom avy-case-fold-search t - "Non-nil if searches should ignore case." - :type 'boolean) - -(defcustom avy-word-punc-regexp "[!-/:-@[-`{-~]" - "Regexp of punctuation chars that count as word starts for `avy-goto-word-1. -When nil, punctuation chars will not be matched. - -\"[!-/:-@[-`{-~]\" will match all printable punctuation chars." - :type 'regexp) - -(defcustom avy-goto-word-0-regexp "\\b\\sw" - "Regexp that determines positions for `avy-goto-word-0'." - :type '(choice - (const :tag "Default" "\\b\\sw") - (const :tag "Symbol" "\\_<\\(\\sw\\|\\s_\\)") - (const :tag "Not whitespace" "[^ \r\n\t]+") - (regexp :tag "Regex"))) - -(defcustom avy-ignored-modes '(image-mode doc-view-mode pdf-view-mode) - "List of modes to ignore when searching for candidates. -Typically, these modes don't use the text representation." - :type 'list) - -(defcustom avy-single-candidate-jump t - "In case there is only one candidate jumps directly to it." - :type 'boolean) - -(defcustom avy-del-last-char-by '(?\b ?\d) - "List of event types, i.e. key presses, that delete the last -character read. The default represents `C-h' and `DEL'. See -`event-convert-list'." - :type 'list) - -(defvar avy-ring (make-ring 20) - "Hold the window and point history.") - -(defvar avy-translate-char-function #'identity - "Function to translate user input key into another key. -For example, to make SPC do the same as ?a, use -\(lambda (c) (if (= c 32) ?a c)).") - -(defface avy-lead-face-0 - '((t (:foreground "white" :background "#4f57f9"))) - "Face used for first non-terminating leading chars.") - -(defface avy-lead-face-1 - '((t (:foreground "white" :background "gray"))) - "Face used for matched leading chars.") - -(defface avy-lead-face-2 - '((t (:foreground "white" :background "#f86bf3"))) - "Face used for leading chars.") - -(defface avy-lead-face - '((t (:foreground "white" :background "#e52b50"))) - "Face used for the leading chars.") - -(defface avy-background-face - '((t (:foreground "gray40"))) - "Face for whole window background during selection.") - -(defface avy-goto-char-timer-face - '((t (:inherit highlight))) - "Face for matches during reading chars using `avy-goto-char-timer'.") - -(defconst avy-lead-faces '(avy-lead-face - avy-lead-face-0 - avy-lead-face-2 - avy-lead-face - avy-lead-face-0 - avy-lead-face-2) - "Face sequence for `avy--overlay-at-full'.") - -(defvar avy-key-to-char-alist '((left . ?◀) - (right . ?▶) - (up . ?▲) - (down . ?▼) - (prior . ?△) - (next . ?▽)) - "An alist from non-character keys to printable chars used in avy overlays. -This alist must contain all keys used in `avy-keys' which are not -self-inserting keys and thus aren't read as characters.") - -;;* Internals -;;** Tree -(defmacro avy-multipop (lst n) - "Remove LST's first N elements and return them." - `(if (<= (length ,lst) ,n) - (prog1 ,lst - (setq ,lst nil)) - (prog1 ,lst - (setcdr - (nthcdr (1- ,n) (prog1 ,lst (setq ,lst (nthcdr ,n ,lst)))) - nil)))) - -(defun avy--de-bruijn (keys n) - "De Bruijn sequence for alphabet KEYS and subsequences of length N." - (let* ((k (length keys)) - (a (make-list (* n k) 0)) - sequence) - (cl-labels ((db (T p) - (if (> T n) - (if (eq (% n p) 0) - (setq sequence - (append sequence - (cl-subseq a 1 (1+ p))))) - (setf (nth T a) (nth (- T p) a)) - (db (1+ T) p) - (cl-loop for j from (1+ (nth (- T p) a)) to (1- k) do - (setf (nth T a) j) - (db (1+ T) T))))) - (db 1 1) - (mapcar (lambda (n) - (nth n keys)) - sequence)))) - -(defun avy--path-alist-1 (lst seq-len keys) - "Build a De Bruin sequence from LST. -SEQ-LEN is how many elements of KEYS it takes to identify a match." - (let ((db-seq (avy--de-bruijn keys seq-len)) - prev-pos prev-seq prev-win path-alist) - ;; The De Bruijn seq is cyclic, so append the seq-len - 1 first chars to - ;; the end. - (setq db-seq (nconc db-seq (cl-subseq db-seq 0 (1- seq-len)))) - (cl-labels ((subseq-and-pop () - (when (nth (1- seq-len) db-seq) - (prog1 (cl-subseq db-seq 0 seq-len) - (pop db-seq))))) - (while lst - (let* ((cur (car lst)) - (pos (cond - ;; ace-window has matches of the form (pos . wnd) - ((integerp (car cur)) (car cur)) - ;; avy-jump have form ((start . end) . wnd) - ((consp (car cur)) (caar cur)) - (t (error "Unexpected match representation: %s" cur)))) - (win (cdr cur)) - (path (if prev-pos - (let ((diff (if (eq win prev-win) - (- pos prev-pos) - 0))) - (when (and (> diff 0) (< diff seq-len)) - (while (and (nth (1- seq-len) db-seq) - (not - (eq 0 - (cl-search - (cl-subseq prev-seq diff) - (cl-subseq db-seq 0 seq-len))))) - (pop db-seq))) - (subseq-and-pop)) - (subseq-and-pop)))) - (if (not path) - (setq lst nil - path-alist nil) - (push (cons path (car lst)) path-alist) - (setq prev-pos pos - prev-seq path - prev-win win - lst (cdr lst)))))) - (nreverse path-alist))) - -(defun avy-order-closest (x) - (abs (- (caar x) (point)))) - -(defvar avy-command nil - "Store the current command symbol. -E.g. 'avy-goto-line or 'avy-goto-char.") - -(defun avy-tree (lst keys) - "Coerce LST into a balanced tree. -The degree of the tree is the length of KEYS. -KEYS are placed appropriately on internal nodes." - (let* ((len (length keys)) - (order-fn (cdr (assq avy-command avy-orders-alist))) - (lst (if order-fn - (cl-sort lst #'< :key order-fn) - lst))) - (cl-labels - ((rd (ls) - (let ((ln (length ls))) - (if (< ln len) - (cl-pairlis keys - (mapcar (lambda (x) (cons 'leaf x)) ls)) - (let ((ks (copy-sequence keys)) - res) - (dolist (s (avy-subdiv ln len)) - (push (cons (pop ks) - (if (eq s 1) - (cons 'leaf (pop ls)) - (rd (avy-multipop ls s)))) - res)) - (nreverse res)))))) - (rd lst)))) - -(defun avy-subdiv (n b) - "Distribute N in B terms in a balanced way." - (let* ((p (1- (floor (+ (log n b) 1e-6)))) - (x1 (expt b p)) - (x2 (* b x1)) - (delta (- n x2)) - (n2 (/ delta (- x2 x1))) - (n1 (- b n2 1))) - (append - (make-list n1 x1) - (list - (- n (* n1 x1) (* n2 x2))) - (make-list n2 x2)))) - -(defun avy-traverse (tree walker &optional recur-key) - "Traverse TREE generated by `avy-tree'. -WALKER is a function that takes KEYS and LEAF. - -RECUR-KEY is used in recursion. - -LEAF is a member of LST argument of `avy-tree'. - -KEYS is the path from the root of `avy-tree' to LEAF." - (dolist (br tree) - (let ((key (cons (car br) recur-key))) - (if (eq (cadr br) 'leaf) - (funcall walker key (cddr br)) - (avy-traverse (cdr br) walker key))))) - -(defvar avy-action nil - "Function to call at the end of select.") - -(defun avy-handler-default (char) - "The default handler for a bad CHAR." - (let (dispatch) - (cond ((setq dispatch (assoc char avy-dispatch-alist)) - (unless (eq avy-style 'words) - (setq avy-action (cdr dispatch))) - (throw 'done 'restart)) - ((memq char '(?\e ?\C-g)) - ;; exit silently - (throw 'done 'abort)) - ((eq char ??) - (avy-show-dispatch-help) - (throw 'done 'restart)) - ((mouse-event-p char) - (signal 'user-error (list "Mouse event not handled" char))) - (t - (message "No such candidate: %s, hit `C-g' to quit." - (if (characterp char) (string char) char)))))) - -(defun avy-show-dispatch-help () - "Display action shortucts in echo area." - (let ((len (length "avy-action-"))) - (message "%s" (mapconcat - (lambda (x) - (format "%s: %s" - (propertize - (char-to-string (car x)) - 'face 'aw-key-face) - (substring (symbol-name (cdr x)) len))) - avy-dispatch-alist - " ")))) - -(defvar avy-handler-function 'avy-handler-default - "A function to call for a bad `read-key' in `avy-read'.") - -(defvar avy-current-path "" - "Store the current incomplete path during `avy-read'.") - -(defun avy-mouse-event-window (char) - "If CHAR is a mouse event, return the window of the event if any or the selected window. -Return nil if not a mouse event." - (when (mouse-event-p char) - (cond ((windowp (posn-window (event-start char))) - (posn-window (event-start char))) - ((framep (posn-window (event-start char))) - (frame-selected-window (posn-window (event-start char)))) - (t (selected-window))))) - -(defun avy-read (tree display-fn cleanup-fn) - "Select a leaf from TREE using consecutive `read-key'. - -DISPLAY-FN should take CHAR and LEAF and signify that LEAFs -associated with CHAR will be selected if CHAR is pressed. This is -commonly done by adding a CHAR overlay at LEAF position. - -CLEANUP-FN should take no arguments and remove the effects of -multiple DISPLAY-FN invocations." - (catch 'done - (setq avy-current-path "") - (while tree - (let ((avy--leafs nil)) - (avy-traverse tree - (lambda (path leaf) - (push (cons path leaf) avy--leafs))) - (dolist (x avy--leafs) - (funcall display-fn (car x) (cdr x)))) - (let ((char (funcall avy-translate-char-function (read-key))) - window - branch) - (funcall cleanup-fn) - (if (setq window (avy-mouse-event-window char)) - (throw 'done (cons char window)) - (if (setq branch (assoc char tree)) - (progn - ;; Ensure avy-current-path stores the full path prior to - ;; exit so other packages can utilize its value. - (setq avy-current-path - (concat avy-current-path (string (avy--key-to-char char)))) - (if (eq (car (setq tree (cdr branch))) 'leaf) - (throw 'done (cdr tree)))) - (funcall avy-handler-function char))))))) - -(defun avy-read-de-bruijn (lst keys) - "Select from LST dispatching on KEYS." - ;; In theory, the De Bruijn sequence B(k,n) has k^n subsequences of length n - ;; (the path length) usable as paths, thus that's the lower bound. Due to - ;; partially overlapping matches, not all subsequences may be usable, so it's - ;; possible that the path-len must be incremented, e.g., if we're matching - ;; for x and a buffer contains xaxbxcx only every second subsequence is - ;; usable for the four matches. - (catch 'done - (let* ((path-len (ceiling (log (length lst) (length keys)))) - (alist (avy--path-alist-1 lst path-len keys))) - (while (not alist) - (cl-incf path-len) - (setq alist (avy--path-alist-1 lst path-len keys))) - (let* ((len (length (caar alist))) - (i 0)) - (setq avy-current-path "") - (while (< i len) - (dolist (x (reverse alist)) - (avy--overlay-at-full (reverse (car x)) (cdr x))) - (let ((char (funcall avy-translate-char-function (read-key)))) - (avy--remove-leading-chars) - (setq alist - (delq nil - (mapcar (lambda (x) - (when (eq (caar x) char) - (cons (cdr (car x)) (cdr x)))) - alist))) - (setq avy-current-path - (concat avy-current-path (string (avy--key-to-char char)))) - (cl-incf i) - (unless alist - (funcall avy-handler-function char)))) - (cdar alist))))) - -(defun avy-read-words (lst words) - "Select from LST using WORDS." - (catch 'done - (let ((num-words (length words)) - (num-entries (length lst)) - alist) - ;; If there are not enough words to cover all the candidates, - ;; we use a De Bruijn sequence to generate the remaining ones. - (when (< num-words num-entries) - (let ((keys avy-keys) - (bad-keys '(?a ?e ?i ?o ?u ?y)) - (path-len 1) - (num-remaining (- num-entries num-words)) - tmp-alist) - ;; Delete all keys which could lead to duplicates. - ;; We want at least three keys left to work with. - (dolist (x bad-keys) - (when (memq x keys) - (setq keys (delq ?a keys)))) - (when (< (length keys) 3) - (signal 'user-error - '("Please add more keys to the variable `avy-keys'."))) - ;; Generate the sequence and add the keys to the existing words. - (while (not tmp-alist) - (cl-incf path-len) - (setq tmp-alist (avy--path-alist-1 lst path-len keys))) - (while (>= (cl-decf num-remaining) 0) - (push (mapconcat 'string (caar tmp-alist) nil) (cdr (last words))) - (setq tmp-alist (cdr tmp-alist))))) - (dolist (x lst) - (push (cons (string-to-list (pop words)) x) alist)) - (setq avy-current-path "") - (while (or (> (length alist) 1) - (caar alist)) - (dolist (x (reverse alist)) - (avy--overlay-at-full (reverse (car x)) (cdr x))) - (let ((char (funcall avy-translate-char-function (read-key)))) - (avy--remove-leading-chars) - (setq alist - (delq nil - (mapcar (lambda (x) - (when (eq (caar x) char) - (cons (cdr (car x)) (cdr x)))) - alist))) - (setq avy-current-path - (concat avy-current-path (string (avy--key-to-char char)))) - (unless alist - (funcall avy-handler-function char)))) - (cdar alist)))) - -;;** Rest -(defun avy-window-list () - "Return a list of windows depending on `avy-all-windows'." - (cond ((eq avy-all-windows 'all-frames) - (cl-mapcan #'window-list (frame-list))) - - ((eq avy-all-windows t) - (window-list)) - - ((null avy-all-windows) - (list (selected-window))) - - (t - (error "Unrecognized option: %S" avy-all-windows)))) - -(defcustom avy-all-windows-alt nil - "The alternative `avy-all-windows' for use with \\[universal-argument]." - :type '(choice - (const :tag "Current window" nil) - (const :tag "All windows on the current frame" t) - (const :tag "All windows on all frames" all-frames))) - -(defmacro avy-dowindows (flip &rest body) - "Depending on FLIP and `avy-all-windows' run BODY in each or selected window." - (declare (indent 1) - (debug (form body))) - `(let ((avy-all-windows (if ,flip - avy-all-windows-alt - avy-all-windows))) - (dolist (wnd (avy-window-list)) - (with-selected-window wnd - (unless (memq major-mode avy-ignored-modes) - ,@body))))) - -(defun avy-resume () - "Stub to hold last avy command. -Commands using `avy-with' macro can be resumed." - (interactive)) - -(defmacro avy-with (command &rest body) - "Set `avy-keys' according to COMMAND and execute BODY. -Set `avy-style' according to COMMAND as well." - (declare (indent 1) - (debug (form body))) - `(let ((avy-keys (or (cdr (assq ',command avy-keys-alist)) - avy-keys)) - (avy-style (or (cdr (assq ',command avy-styles-alist)) - avy-style)) - (avy-command ',command)) - (setq avy-action nil) - (setf (symbol-function 'avy-resume) - (lambda () - (interactive) - ,@(if (eq command 'avy-goto-char-timer) - (cdr body) - body))) - ,@body)) - -(defun avy-action-goto (pt) - "Goto PT." - (let ((frame (window-frame (selected-window)))) - (unless (equal frame (selected-frame)) - (select-frame-set-input-focus frame) - (raise-frame frame)) - (goto-char pt))) - -(defun avy-forward-item () - (if (eq avy-command 'avy-goto-line) - (end-of-line) - (forward-sexp)) - (point)) - -(defun avy-action-mark (pt) - "Mark sexp at PT." - (goto-char pt) - (set-mark (point)) - (avy-forward-item)) - -(defun avy-action-copy (pt) - "Copy sexp starting on PT." - (save-excursion - (let (str) - (goto-char pt) - (avy-forward-item) - (setq str (buffer-substring pt (point))) - (kill-new str) - (message "Copied: %s" str))) - (let ((dat (ring-ref avy-ring 0))) - (select-frame-set-input-focus - (window-frame (cdr dat))) - (select-window (cdr dat)) - (goto-char (car dat)))) - -(defun avy-action-yank (pt) - "Yank sexp starting at PT at the current point." - (avy-action-copy pt) - (yank) - t) - -(defun avy-action-kill-move (pt) - "Kill sexp at PT and move there." - (goto-char pt) - (avy-forward-item) - (kill-region pt (point)) - (message "Killed: %s" (current-kill 0)) - (point)) - -(defun avy-action-kill-stay (pt) - "Kill sexp at PT." - (save-excursion - (goto-char pt) - (avy-forward-item) - (kill-region pt (point)) - (just-one-space)) - (message "Killed: %s" (current-kill 0)) - (select-window - (cdr - (ring-ref avy-ring 0))) - t) - -(defun avy-action-zap-to-char (pt) - "Kill from point up to PT." - (if (> pt (point)) - (kill-region (point) pt) - (kill-region pt (point)))) - -(defun avy-action-teleport (pt) - "Kill sexp starting on PT and yank into the current location." - (avy-action-kill-stay pt) - (select-window - (cdr - (ring-ref avy-ring 0))) - (save-excursion - (yank)) - t) - -(declare-function flyspell-correct-word-before-point "flyspell") - -(defcustom avy-flyspell-correct-function #'flyspell-correct-word-before-point - "Function called to correct word by `avy-action-ispell' when -`flyspell-mode' is enabled." - :type 'function) - -(defun avy-action-ispell (pt) - "Auto correct word at PT." - (save-excursion - (goto-char pt) - (cond - ((eq avy-command 'avy-goto-line) - (ispell-region - (line-beginning-position) - (line-end-position))) - ((bound-and-true-p flyspell-mode) - (funcall avy-flyspell-correct-function)) - ((looking-at-p "\\b") - (ispell-word)) - (t - (progn - (backward-word) - (when (looking-at-p "\\b") - (ispell-word))))))) - -(defvar avy-pre-action #'avy-pre-action-default - "Function to call before `avy-action' is called.") - -(defun avy-pre-action-default (res) - (avy-push-mark) - (when (and (consp res) - (windowp (cdr res))) - (let* ((window (cdr res)) - (frame (window-frame window))) - (unless (equal frame (selected-frame)) - (select-frame-set-input-focus frame)) - (select-window window)))) - -(defun avy--process-1 (candidates overlay-fn &optional cleanup-fn) - (let ((len (length candidates))) - (cond ((= len 0) - nil) - ((and (= len 1) avy-single-candidate-jump) - (car candidates)) - (t - (unwind-protect - (progn - (avy--make-backgrounds - (avy-window-list)) - (cond ((eq avy-style 'de-bruijn) - (avy-read-de-bruijn - candidates avy-keys)) - ((eq avy-style 'words) - (avy-read-words - candidates avy-words)) - (t - (avy-read (avy-tree candidates avy-keys) - overlay-fn - (or cleanup-fn #'avy--remove-leading-chars))))) - (avy--done)))))) - -(defvar avy-last-candidates nil - "Store the last candidate list.") - -(defun avy--last-candidates-cycle (advancer) - (let* ((avy-last-candidates - (cl-remove-if-not - (lambda (x) (equal (cdr x) (selected-window))) - avy-last-candidates)) - (min-dist - (apply #'min - (mapcar (lambda (x) (abs (- (caar x) (point)))) avy-last-candidates))) - (pos - (cl-position-if - (lambda (x) - (= (- (caar x) (point)) min-dist)) - avy-last-candidates))) - (funcall advancer pos avy-last-candidates))) - -(defun avy-prev () - "Go to the previous candidate of the last `avy-read'." - (interactive) - (avy--last-candidates-cycle - (lambda (pos lst) - (when (> pos 0) - (goto-char (caar (nth (1- pos) lst))))))) - -(defun avy-next () - "Go to the next candidate of the last `avy-read'." - (interactive) - (avy--last-candidates-cycle - (lambda (pos lst) - (when (< pos (1- (length lst))) - (goto-char (caar (nth (1+ pos) lst))))))) - -(defun avy-process (candidates &optional overlay-fn cleanup-fn) - "Select one of CANDIDATES using `avy-read'. -Use OVERLAY-FN to visualize the decision overlay. -CLEANUP-FN should take no arguments and remove the effects of -multiple OVERLAY-FN invocations." - (setq overlay-fn (or overlay-fn (avy--style-fn avy-style))) - (setq cleanup-fn (or cleanup-fn #'avy--remove-leading-chars)) - (unless (and (consp (car candidates)) - (windowp (cdar candidates))) - (setq candidates - (mapcar (lambda (x) (cons x (selected-window))) - candidates))) - (setq avy-last-candidates (copy-sequence candidates)) - (let ((original-cands (copy-sequence candidates)) - (res (avy--process-1 candidates overlay-fn cleanup-fn))) - (cond - ((null res) - (if (and (eq avy-style 'words) candidates) - (avy-process original-cands overlay-fn cleanup-fn) - (message "zero candidates") - t)) - ((eq res 'restart) - (avy-process original-cands overlay-fn cleanup-fn)) - ;; ignore exit from `avy-handler-function' - ((eq res 'exit)) - ((eq res 'abort) - nil) - (t - (funcall avy-pre-action res) - (setq res (car res)) - (funcall (or avy-action 'avy-action-goto) - (if (consp res) - (car res) - res)) - res)))) - -(define-obsolete-function-alias 'avy--process 'avy-process - "0.4.0") - -(defvar avy--overlays-back nil - "Hold overlays for when `avy-background' is t.") - -(defun avy--make-backgrounds (wnd-list) - "Create a dim background overlay for each window on WND-LIST." - (when avy-background - (setq avy--overlays-back - (mapcar (lambda (w) - (let ((ol (make-overlay - (window-start w) - (window-end w) - (window-buffer w)))) - (overlay-put ol 'face 'avy-background-face) - (overlay-put ol 'window w) - ol)) - wnd-list)))) - -(defun avy--done () - "Clean up overlays." - (mapc #'delete-overlay avy--overlays-back) - (setq avy--overlays-back nil) - (avy--remove-leading-chars)) - -(defun avy--visible-p (s) - (let ((invisible (get-char-property s 'invisible))) - (or (null invisible) - (eq t buffer-invisibility-spec) - (null (assoc invisible buffer-invisibility-spec))))) - -(defun avy--next-visible-point () - "Return the next closest point without 'invisible property." - (let ((s (point))) - (while (and (not (= (point-max) (setq s (next-char-property-change s)))) - (not (avy--visible-p s)))) - s)) - -(defun avy--next-invisible-point () - "Return the next closest point with 'invisible property." - (let ((s (point))) - (while (and (not (= (point-max) (setq s (next-char-property-change s)))) - (avy--visible-p s))) - s)) - -(defun avy--find-visible-regions (rbeg rend) - "Return a list of all visible regions between RBEG and REND." - (setq rbeg (max rbeg (point-min))) - (setq rend (min rend (point-max))) - (when (< rbeg rend) - (let (visibles beg) - (save-excursion - (save-restriction - (narrow-to-region rbeg rend) - (setq beg (goto-char (point-min))) - (while (not (= (point) (point-max))) - (goto-char (avy--next-invisible-point)) - (push (cons beg (point)) visibles) - (setq beg (goto-char (avy--next-visible-point)))) - (nreverse visibles)))))) - -(defun avy--regex-candidates (regex &optional beg end pred group) - "Return all elements that match REGEX. -Each element of the list is ((BEG . END) . WND) -When PRED is non-nil, it's a filter for matching point positions. -When GROUP is non-nil, (BEG . END) should delimit that regex group." - (setq group (or group 0)) - (let ((case-fold-search (or avy-case-fold-search - (string= regex (downcase regex)))) - candidates) - (avy-dowindows current-prefix-arg - (dolist (pair (avy--find-visible-regions - (or beg (window-start)) - (or end (window-end (selected-window) t)))) - (save-excursion - (goto-char (car pair)) - (while (re-search-forward regex (cdr pair) t) - (when (avy--visible-p (1- (point))) - (when (or (null pred) - (funcall pred)) - (push (cons - (if (numberp group) - (cons (match-beginning group) - (match-end group)) - (funcall group)) - wnd) candidates))))))) - (nreverse candidates))) - -(defvar avy--overlay-offset 0 - "The offset to apply in `avy--overlay'.") - -(defvar avy--overlays-lead nil - "Hold overlays for leading chars.") - -(defun avy--remove-leading-chars () - "Remove leading char overlays." - (mapc #'delete-overlay avy--overlays-lead) - (setq avy--overlays-lead nil)) - -(defun avy--old-str (pt wnd) - "Return a one-char string at PT in WND." - (let ((old-str (with-selected-window wnd - (buffer-substring pt (1+ pt))))) - (if avy-background - (propertize old-str 'face 'avy-background-face) - old-str))) - -(defun avy--overlay (str beg end wnd &optional compose-fn) - "Create an overlay with STR from BEG to END in WND. -COMPOSE-FN is a lambda that concatenates the old string at BEG with STR." - (let ((eob (with-selected-window wnd (point-max)))) - (when (<= beg eob) - (let* ((beg (+ beg avy--overlay-offset)) - (ol (make-overlay beg (or end (1+ beg)) (window-buffer wnd))) - (old-str (if (eq beg eob) "" (avy--old-str beg wnd))) - (os-line-prefix (get-text-property 0 'line-prefix old-str)) - (os-wrap-prefix (get-text-property 0 'wrap-prefix old-str)) - other-ol) - (when os-line-prefix - (add-text-properties 0 1 `(line-prefix ,os-line-prefix) str)) - (when os-wrap-prefix - (add-text-properties 0 1 `(wrap-prefix ,os-wrap-prefix) str)) - (when (setq other-ol (cl-find-if - (lambda (o) (overlay-get o 'goto-address)) - (overlays-at beg))) - (add-text-properties - 0 (length old-str) - `(face ,(overlay-get other-ol 'face)) old-str)) - (overlay-put ol 'window wnd) - (overlay-put ol 'category 'avy) - (overlay-put ol (if (eq beg eob) - 'after-string - 'display) - (funcall - (or compose-fn #'concat) - str old-str)) - (push ol avy--overlays-lead))))) - -(defcustom avy-highlight-first nil - "When non-nil highlight the first decision char with `avy-lead-face-0'. -Do this even when the char is terminating." - :type 'boolean) - -(defun avy--key-to-char (c) - "If C is no character, translate it using `avy-key-to-char-alist'." - (cond ((characterp c) c) - ((cdr (assoc c avy-key-to-char-alist))) - ((mouse-event-p c) c) - (t - (error "Unknown key %s" c)))) - -(defun avy-candidate-beg (leaf) - "Return the start position for LEAF." - (cond ((numberp leaf) - leaf) - ((consp (car leaf)) - (caar leaf)) - (t - (car leaf)))) - -(defun avy-candidate-end (leaf) - "Return the end position for LEAF." - (cond ((numberp leaf) - leaf) - ((consp (car leaf)) - (cdar leaf)) - (t - (car leaf)))) - -(defun avy-candidate-wnd (leaf) - "Return the window for LEAF." - (if (consp leaf) - (cdr leaf) - (selected-window))) - -(defun avy--overlay-pre (path leaf) - "Create an overlay with PATH at LEAF. -PATH is a list of keys from tree root to LEAF. -LEAF is normally ((BEG . END) . WND)." - (let* ((path (mapcar #'avy--key-to-char path)) - (str (propertize (apply #'string (reverse path)) - 'face 'avy-lead-face))) - (when (or avy-highlight-first (> (length str) 1)) - (set-text-properties 0 1 '(face avy-lead-face-0) str)) - (setq str (concat - (propertize avy-current-path - 'face 'avy-lead-face-1) - str)) - (avy--overlay - str - (avy-candidate-beg leaf) nil - (avy-candidate-wnd leaf)))) - -(defun avy--overlay-at (path leaf) - "Create an overlay with PATH at LEAF. -PATH is a list of keys from tree root to LEAF. -LEAF is normally ((BEG . END) . WND)." - (let* ((path (mapcar #'avy--key-to-char path)) - (str (propertize - (string (car (last path))) - 'face 'avy-lead-face))) - (avy--overlay - str - (avy-candidate-beg leaf) nil - (avy-candidate-wnd leaf) - (lambda (str old-str) - (cond ((string= old-str "\n") - (concat str "\n")) - ;; add padding for wide-width character - ((eq (string-width old-str) 2) - (concat str " ")) - (t - str)))))) - -(defun avy--overlay-at-full (path leaf) - "Create an overlay with PATH at LEAF. -PATH is a list of keys from tree root to LEAF. -LEAF is normally ((BEG . END) . WND)." - (let* ((path (mapcar #'avy--key-to-char path)) - (str (propertize - (apply #'string (reverse path)) - 'face 'avy-lead-face)) - (len (length path)) - (beg (avy-candidate-beg leaf)) - (wnd (cdr leaf)) - end) - (dotimes (i len) - (set-text-properties i (1+ i) - `(face ,(nth i avy-lead-faces)) - str)) - (when (eq avy-style 'de-bruijn) - (setq str (concat - (propertize avy-current-path - 'face 'avy-lead-face-1) - str)) - (setq len (length str))) - (with-selected-window wnd - (save-excursion - (goto-char beg) - (let* ((lep (if (bound-and-true-p visual-line-mode) - (save-excursion - (end-of-visual-line) - (point)) - (line-end-position))) - ;; `end-of-visual-line' is bugged sometimes - (lep (if (< lep beg) - (line-end-position) - lep)) - (len-and-str (avy--update-offset-and-str len str lep))) - (setq len (car len-and-str)) - (setq str (cdr len-and-str)) - (setq end (if (= beg lep) - (1+ beg) - (min (+ beg - (if (eq (char-after) ?\t) - 1 - len)) - lep))) - (when (and (bound-and-true-p visual-line-mode) - (> len (- end beg)) - (not (eq lep beg))) - (setq len (- end beg)) - (let ((old-str (apply #'string (reverse path)))) - (setq str - (substring - (propertize - old-str - 'face - (if (= (length old-str) 1) - 'avy-lead-face - 'avy-lead-face-0)) - 0 len))))))) - (avy--overlay - str beg end wnd - (lambda (str old-str) - (cond ((string= old-str "\n") - (concat str "\n")) - ((string= old-str "\t") - (concat str (make-string (max (- tab-width len) 0) ?\ ))) - (t - ;; add padding for wide-width character - (if (eq (string-width old-str) 2) - (concat str " ") - str))))))) - -(defun avy--overlay-post (path leaf) - "Create an overlay with PATH at LEAF. -PATH is a list of keys from tree root to LEAF. -LEAF is normally ((BEG . END) . WND)." - (let* ((path (mapcar #'avy--key-to-char path)) - (str (propertize (apply #'string (reverse path)) - 'face 'avy-lead-face))) - (when (or avy-highlight-first (> (length str) 1)) - (set-text-properties 0 1 '(face avy-lead-face-0) str)) - (setq str (concat - (propertize avy-current-path - 'face 'avy-lead-face-1) - str)) - (avy--overlay - str - (avy-candidate-end leaf) nil - (avy-candidate-wnd leaf)))) - -(defun avy--update-offset-and-str (offset str lep) - "Recalculate the length of the new overlay at point. - -OFFSET is the previous overlay length. -STR is the overlay string that we wish to add. -LEP is the line end position. - -We want to add an overlay between point and END=point+OFFSET. -When other overlays already exist between point and END, set -OFFSET to be the difference between the start of the first -overlay and point. This is equivalent to truncating our new -overlay, so that it doesn't intersect with overlays that already -exist." - (let* ((wnd (selected-window)) - (beg (point)) - (oov (delq nil - (mapcar - (lambda (o) - (and (eq (overlay-get o 'category) 'avy) - (eq (overlay-get o 'window) wnd) - (overlay-start o))) - (overlays-in beg (min (+ beg offset) lep)))))) - (when oov - (setq offset (- (apply #'min oov) beg)) - (setq str (substring str 0 offset))) - (let ((other-ov (cl-find-if - (lambda (o) - (and (eq (overlay-get o 'category) 'avy) - (eq (overlay-start o) beg) - (not (eq (overlay-get o 'window) wnd)))) - (overlays-in (point) (min (+ (point) offset) lep))))) - (when (and other-ov - (> (overlay-end other-ov) - (+ beg offset))) - (setq str (concat str (buffer-substring - (+ beg offset) - (overlay-end other-ov)))) - (setq offset (- (overlay-end other-ov) - beg)))) - (cons offset str))) - -(defun avy--style-fn (style) - "Transform STYLE symbol to a style function." - (cl-case style - (pre #'avy--overlay-pre) - (at #'avy--overlay-at) - (at-full 'avy--overlay-at-full) - (post #'avy--overlay-post) - (de-bruijn #'avy--overlay-at-full) - (words #'avy--overlay-at-full) - (ignore #'ignore) - (t (error "Unexpected style %S" style)))) - -(cl-defun avy-jump (regex &key window-flip beg end action pred group) - "Jump to REGEX. -The window scope is determined by `avy-all-windows'. -When WINDOW-FLIP is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched. -ACTION is a function that takes point position as an argument. -When PRED is non-nil, it's a filter for matching point positions. -When GROUP is non-nil, it's either a match group in REGEX, or a function -that returns a cons of match beginning and end." - (setq avy-action (or action avy-action)) - (let ((avy-all-windows - (if window-flip - (not avy-all-windows) - avy-all-windows))) - (avy-process - (avy--regex-candidates regex beg end pred group)))) - -(defun avy--generic-jump (regex window-flip &optional beg end) - "Jump to REGEX. -The window scope is determined by `avy-all-windows'. -When WINDOW-FLIP is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched." - (declare (obsolete avy-jump "0.4.0")) - (let ((avy-all-windows - (if window-flip - (not avy-all-windows) - avy-all-windows))) - (avy-process - (avy--regex-candidates regex beg end)))) - -;;* Commands -;;;###autoload -(defun avy-goto-char (char &optional arg) - "Jump to the currently visible CHAR. -The window scope is determined by `avy-all-windows' (ARG negates it)." - (interactive (list (read-char "char: " t) - current-prefix-arg)) - (avy-with avy-goto-char - (avy-jump - (if (= 13 char) - "\n" - (regexp-quote (string char))) - :window-flip arg))) - -;;;###autoload -(defun avy-goto-char-in-line (char) - "Jump to the currently visible CHAR in the current line." - (interactive (list (read-char "char: " t))) - (avy-with avy-goto-char - (avy-jump - (regexp-quote (string char)) - :beg (line-beginning-position) - :end (line-end-position)))) - -;;;###autoload -(defun avy-goto-char-2 (char1 char2 &optional arg beg end) - "Jump to the currently visible CHAR1 followed by CHAR2. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched." - (interactive (list (read-char "char 1: " t) - (read-char "char 2: " t) - current-prefix-arg - nil nil)) - (when (eq char1 ? ) - (setq char1 ?\n)) - (when (eq char2 ? ) - (setq char2 ?\n)) - (avy-with avy-goto-char-2 - (avy-jump - (regexp-quote (string char1 char2)) - :window-flip arg - :beg beg - :end end))) - -;;;###autoload -(defun avy-goto-char-2-above (char1 char2 &optional arg) - "Jump to the currently visible CHAR1 followed by CHAR2. -This is a scoped version of `avy-goto-char-2', where the scope is -the visible part of the current buffer up to point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive (list (read-char "char 1: " t) - (read-char "char 2: " t) - current-prefix-arg)) - (avy-with avy-goto-char-2-above - (avy-goto-char-2 - char1 char2 arg - (window-start) (point)))) - -;;;###autoload -(defun avy-goto-char-2-below (char1 char2 &optional arg) - "Jump to the currently visible CHAR1 followed by CHAR2. -This is a scoped version of `avy-goto-char-2', where the scope is -the visible part of the current buffer following point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive (list (read-char "char 1: " t) - (read-char "char 2: " t) - current-prefix-arg)) - (avy-with avy-goto-char-2-below - (avy-goto-char-2 - char1 char2 arg - (point) (window-end (selected-window) t)))) - -;;;###autoload -(defun avy-isearch () - "Jump to one of the current isearch candidates." - (interactive) - (avy-with avy-isearch - (let ((avy-background nil) - (avy-case-fold-search case-fold-search)) - (prog1 - (avy-process - (avy--regex-candidates (if isearch-regexp - isearch-string - (regexp-quote isearch-string)))) - (isearch-done))))) - -;;;###autoload -(defun avy-goto-word-0 (arg &optional beg end) - "Jump to a word start. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched." - (interactive "P") - (avy-with avy-goto-word-0 - (avy-jump avy-goto-word-0-regexp - :window-flip arg - :beg beg - :end end))) - -;;;###autoload -(defun avy-goto-whitespace-end (arg &optional beg end) - "Jump to the end of a whitespace sequence. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched." - (interactive "P") - (avy-with avy-goto-whitespace-end - (avy-jump "[ \t]+\\|\n[ \t]*" - :window-flip arg - :beg beg - :end end - :group (lambda () (cons (point) (1+ (point))))))) - -(defun avy-goto-word-0-above (arg) - "Jump to a word start between window start and point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive "P") - (avy-with avy-goto-word-0 - (avy-goto-word-0 arg (window-start) (point)))) - -(defun avy-goto-word-0-below (arg) - "Jump to a word start between point and window end. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive "P") - (avy-with avy-goto-word-0 - (avy-goto-word-0 arg (point) (window-end (selected-window) t)))) - -(defun avy-goto-whitespace-end-above (arg) - "Jump to the end of a whitespace sequence between point and window end. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive "P") - (avy-with avy-goto-whitespace-end - (avy-goto-whitespace-end arg (window-start) (point)))) - -(defun avy-goto-whitespace-end-below (arg) - "Jump to the end of a whitespace sequence between window start and point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive "P") - (avy-with avy-goto-whitespace-end - (avy-goto-whitespace-end arg (point) (window-end (selected-window) t)))) - -;;;###autoload -(defun avy-goto-word-1 (char &optional arg beg end symbol) - "Jump to the currently visible CHAR at a word start. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched. -When SYMBOL is non-nil, jump to symbol start instead of word start." - (interactive (list (read-char "char: " t) - current-prefix-arg)) - (avy-with avy-goto-word-1 - (let* ((str (string char)) - (regex (cond ((string= str ".") - "\\.") - ((and avy-word-punc-regexp - (string-match avy-word-punc-regexp str)) - (regexp-quote str)) - ((<= char 26) - str) - (t - (concat - (if symbol "\\_<" "\\b") - str))))) - (avy-jump regex - :window-flip arg - :beg beg - :end end)))) - -;;;###autoload -(defun avy-goto-word-1-above (char &optional arg) - "Jump to the currently visible CHAR at a word start. -This is a scoped version of `avy-goto-word-1', where the scope is -the visible part of the current buffer up to point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive (list (read-char "char: " t) - current-prefix-arg)) - (avy-with avy-goto-word-1 - (avy-goto-word-1 char arg (window-start) (point)))) - -;;;###autoload -(defun avy-goto-word-1-below (char &optional arg) - "Jump to the currently visible CHAR at a word start. -This is a scoped version of `avy-goto-word-1', where the scope is -the visible part of the current buffer following point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive (list (read-char "char: " t) - current-prefix-arg)) - (avy-with avy-goto-word-1 - (avy-goto-word-1 char arg (point) (window-end (selected-window) t)))) - -;;;###autoload -(defun avy-goto-symbol-1 (char &optional arg) - "Jump to the currently visible CHAR at a symbol start. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive (list (read-char "char: " t) - current-prefix-arg)) - (avy-with avy-goto-symbol-1 - (avy-goto-word-1 char arg nil nil t))) - -;;;###autoload -(defun avy-goto-symbol-1-above (char &optional arg) - "Jump to the currently visible CHAR at a symbol start. -This is a scoped version of `avy-goto-symbol-1', where the scope is -the visible part of the current buffer up to point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive (list (read-char "char: " t) - current-prefix-arg)) - (avy-with avy-goto-symbol-1-above - (avy-goto-word-1 char arg (window-start) (point) t))) - -;;;###autoload -(defun avy-goto-symbol-1-below (char &optional arg) - "Jump to the currently visible CHAR at a symbol start. -This is a scoped version of `avy-goto-symbol-1', where the scope is -the visible part of the current buffer following point. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive (list (read-char "char: " t) - current-prefix-arg)) - (avy-with avy-goto-symbol-1-below - (avy-goto-word-1 char arg (point) (window-end (selected-window) t) t))) - -(declare-function subword-backward "subword") -(defvar subword-backward-regexp) - -(defcustom avy-subword-extra-word-chars '(?{ ?= ?} ?* ?: ?> ?<) - "A list of characters that should temporarily match \"\\w\". -This variable is used by `avy-goto-subword-0' and `avy-goto-subword-1'." - :type '(repeat character)) - -;;;###autoload -(defun avy-goto-subword-0 (&optional arg predicate beg end) - "Jump to a word or subword start. -The window scope is determined by `avy-all-windows' (ARG negates it). - -When PREDICATE is non-nil it's a function of zero parameters that -should return true. - -BEG and END narrow the scope where candidates are searched." - (interactive "P") - (require 'subword) - (avy-with avy-goto-subword-0 - (let ((case-fold-search nil) - (subword-backward-regexp - "\\(\\(\\W\\|[[:lower:][:digit:]]\\)\\([!-/:@`~[:upper:]]+\\W*\\)\\|\\W\\w+\\)") - candidates) - (avy-dowindows arg - (let ((syn-tbl (copy-syntax-table))) - (dolist (char avy-subword-extra-word-chars) - (modify-syntax-entry char "w" syn-tbl)) - (with-syntax-table syn-tbl - (let ((ws (or beg (window-start))) - window-cands) - (save-excursion - (goto-char (or end (window-end (selected-window) t))) - (subword-backward) - (while (> (point) ws) - (when (or (null predicate) - (and predicate (funcall predicate))) - (unless (not (avy--visible-p (point))) - (push (cons (cons (point) (1+ (point))) - (selected-window)) window-cands))) - (subword-backward)) - (and (= (point) ws) - (or (null predicate) - (and predicate (funcall predicate))) - (not (get-char-property (point) 'invisible)) - (push (cons (cons (point) (1+ (point))) - (selected-window)) window-cands))) - (setq candidates (nconc candidates window-cands)))))) - (avy-process candidates)))) - -;;;###autoload -(defun avy-goto-subword-1 (char &optional arg) - "Jump to the currently visible CHAR at a subword start. -The window scope is determined by `avy-all-windows' (ARG negates it). -The case of CHAR is ignored." - (interactive (list (read-char "char: " t) - current-prefix-arg)) - (avy-with avy-goto-subword-1 - (let ((char (downcase char))) - (avy-goto-subword-0 - arg (lambda () - (and (char-after) - (eq (downcase (char-after)) char))))))) - -;;;###autoload -(defun avy-goto-word-or-subword-1 () - "Forward to `avy-goto-subword-1' or `avy-goto-word-1'. -Which one depends on variable `subword-mode'." - (interactive) - (if (bound-and-true-p subword-mode) - (call-interactively #'avy-goto-subword-1) - (call-interactively #'avy-goto-word-1))) - -(defvar visual-line-mode) - -(defcustom avy-indent-line-overlay nil - "When non-nil, `avy-goto-line' will display the line overlay next to the first non-whitespace character of each line." - :type 'boolean) - -(defun avy--line-cands (&optional arg beg end bottom-up) - "Get candidates for selecting a line. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched. -When BOTTOM-UP is non-nil, display avy candidates from top to bottom" - (let (candidates) - (avy-dowindows arg - (let ((ws (or beg (window-start)))) - (save-excursion - (save-restriction - (narrow-to-region ws (or end (window-end (selected-window) t))) - (goto-char (point-min)) - (while (< (point) (point-max)) - (when (member (get-char-property - (max (1- (point)) ws) 'invisible) '(nil org-link)) - (push (cons - (if (eq avy-style 'post) - (line-end-position) - (save-excursion - (when avy-indent-line-overlay - (skip-chars-forward " \t")) - (point))) - (selected-window)) candidates)) - (if visual-line-mode - (progn - (setq temporary-goal-column 0) - (line-move-visual 1 t)) - (forward-line 1))))))) - (if bottom-up - candidates - (nreverse candidates)))) - -(defun avy--linum-strings () - "Get strings for `avy-linum-mode'." - (let* ((lines (mapcar #'car (avy--line-cands))) - (line-tree (avy-tree lines avy-keys)) - (line-list nil)) - (avy-traverse - line-tree - (lambda (path _leaf) - (let ((str (propertize (apply #'string (reverse path)) - 'face 'avy-lead-face))) - (when (> (length str) 1) - (set-text-properties 0 1 '(face avy-lead-face-0) str)) - (push str line-list)))) - (nreverse line-list))) - -(defvar linum-available) -(defvar linum-overlays) -(defvar linum-format) -(declare-function linum--face-width "linum") - -(define-minor-mode avy-linum-mode - "Minor mode that uses avy hints for `linum-mode'." - :group 'avy - (if avy-linum-mode - (progn - (require 'linum) - (advice-add 'linum-update-window :around 'avy--linum-update-window) - (linum-mode 1)) - (advice-remove 'linum-update-window 'avy--linum-update-window) - (linum-mode -1))) - -(defun avy--linum-update-window (_ win) - "Update line numbers for the portion visible in window WIN." - (goto-char (window-start win)) - (let ((line (line-number-at-pos)) - (limit (window-end win t)) - (fmt (cond ((stringp linum-format) linum-format) - ((eq linum-format 'dynamic) - (let ((w (length (number-to-string - (count-lines (point-min) (point-max)))))) - (concat "%" (number-to-string w) "d"))))) - (width 0) - (avy-strs (when avy-linum-mode - (avy--linum-strings)))) - (run-hooks 'linum-before-numbering-hook) - ;; Create an overlay (or reuse an existing one) for each - ;; line visible in this window, if necessary. - (while (and (not (eobp)) (< (point) limit)) - (let* ((str - (cond (avy-linum-mode - (pop avy-strs)) - (fmt - (propertize (format fmt line) 'face 'linum)) - (t - (funcall linum-format line)))) - (visited (catch 'visited - (dolist (o (overlays-in (point) (point))) - (when (equal-including-properties - (overlay-get o 'linum-str) str) - (unless (memq o linum-overlays) - (push o linum-overlays)) - (setq linum-available (delq o linum-available)) - (throw 'visited t)))))) - (setq width (max width (length str))) - (unless visited - (let ((ov (if (null linum-available) - (make-overlay (point) (point)) - (move-overlay (pop linum-available) (point) (point))))) - (push ov linum-overlays) - (overlay-put ov 'before-string - (propertize " " 'display `((margin left-margin) ,str))) - (overlay-put ov 'linum-str str)))) - ;; Text may contain those nasty intangible properties, but that - ;; shouldn't prevent us from counting those lines. - (let ((inhibit-point-motion-hooks t)) - (forward-line)) - (setq line (1+ line))) - (when (display-graphic-p) - (setq width (ceiling - (/ (* width 1.0 (linum--face-width 'linum)) - (frame-char-width))))) - (set-window-margins win width (cdr (window-margins win))))) - -(defun avy--line (&optional arg beg end bottom-up) - "Select a line. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'. -BEG and END narrow the scope where candidates are searched. -When BOTTOM-UP is non-nil, display avy candidates from top to bottom" - (setq avy-action (or avy-action #'identity)) - (let ((avy-style (if avy-linum-mode - (progn - (message "Goto line:") - 'ignore) - avy-style))) - (avy-process - (avy--line-cands arg beg end bottom-up)))) - -;;;###autoload -(defun avy-goto-line (&optional arg) - "Jump to a line start in current buffer. - -When ARG is 1, jump to lines currently visible, with the option -to cancel to `goto-line' by entering a number. - -When ARG is 4, negate the window scope determined by -`avy-all-windows'. - -Otherwise, forward to `goto-line' with ARG." - (interactive "p") - (setq arg (or arg 1)) - (if (not (memq arg '(1 4))) - (progn - (goto-char (point-min)) - (forward-line (1- arg))) - (avy-with avy-goto-line - (let* ((avy-handler-old avy-handler-function) - (avy-handler-function - (lambda (char) - (if (or (< char ?0) - (> char ?9)) - (funcall avy-handler-old char) - (let ((line (read-from-minibuffer - "Goto line: " (string char)))) - (when line - (avy-push-mark) - (save-restriction - (widen) - (goto-char (point-min)) - (forward-line (1- (string-to-number line)))) - (throw 'done 'exit)))))) - (r (avy--line (eq arg 4)))) - (when (and (not (memq r '(t nil))) (eq avy-action #'identity)) - (avy-action-goto r)))))) - -;;;###autoload -(defun avy-goto-line-above (&optional offset bottom-up) - "Goto visible line above the cursor. -OFFSET changes the distance between the closest key to the cursor and -the cursor -When BOTTOM-UP is non-nil, display avy candidates from top to bottom" - (interactive) - (if offset - (setq offset (+ 2 (- offset)))) - (let* ((avy-all-windows nil) - (r (avy--line nil (window-start) - (line-beginning-position (or offset 1)) - bottom-up))) - (unless (eq r t) - (avy-action-goto r)))) - -;;;###autoload -(defun avy-goto-line-below (&optional offset bottom-up) - "Goto visible line below the cursor. -OFFSET changes the distance between the closest key to the cursor and -the cursor -When BOTTOM-UP is non-nil, display avy candidates from top to bottom" - (interactive) - (if offset - (setq offset (+ offset 1))) - (let* ((avy-all-windows nil) - (r (avy--line - nil (line-beginning-position (or offset 2)) - (window-end (selected-window) t) - bottom-up))) - (unless (eq r t) - (avy-action-goto r)))) - -(defcustom avy-line-insert-style 'above - "How to insert the newly copied/cut line." - :type '(choice - (const :tag "Above" above) - (const :tag "Below" below))) - -;;;###autoload -(defun avy-goto-end-of-line (&optional arg) - "Call `avy-goto-line' and move to the end of the line." - (interactive "p") - (avy-goto-line arg) - (end-of-line)) - -;;;###autoload -(defun avy-copy-line (arg) - "Copy a selected line above the current line. -ARG lines can be used." - (interactive "p") - (let ((initial-window (selected-window))) - (avy-with avy-copy-line - (let* ((start (avy--line)) - (str (buffer-substring-no-properties - start - (save-excursion - (goto-char start) - (move-end-of-line arg) - (point))))) - (select-window initial-window) - (cond ((eq avy-line-insert-style 'above) - (beginning-of-line) - (save-excursion - (insert str "\n"))) - ((eq avy-line-insert-style 'below) - (end-of-line) - (insert "\n" str) - (beginning-of-line)) - (t - (user-error "Unexpected `avy-line-insert-style'"))))))) - -;;;###autoload -(defun avy-move-line (arg) - "Move a selected line above the current line. -ARG lines can be used." - (interactive "p") - (let ((initial-window (selected-window))) - (avy-with avy-move-line - (let ((start (avy--line))) - (save-excursion - (goto-char start) - (kill-whole-line arg)) - (select-window initial-window) - (cond ((eq avy-line-insert-style 'above) - (beginning-of-line) - (save-excursion - (insert - (current-kill 0)))) - ((eq avy-line-insert-style 'below) - (end-of-line) - (newline) - (save-excursion - (insert (substring (current-kill 0) 0 -1)))) - (t - (user-error "Unexpected `avy-line-insert-style'"))))))) - -;;;###autoload -(defun avy-copy-region (arg) - "Select two lines and copy the text between them to point. - -The window scope is determined by `avy-all-windows' or -`avy-all-windows-alt' when ARG is non-nil." - (interactive "P") - (let ((initial-window (selected-window))) - (avy-with avy-copy-region - (let* ((beg (save-selected-window - (avy--line arg))) - (end (avy--line arg)) - (str (buffer-substring-no-properties - beg - (save-excursion - (goto-char end) - (line-end-position))))) - (select-window initial-window) - (cond ((eq avy-line-insert-style 'above) - (beginning-of-line) - (save-excursion - (insert str "\n"))) - ((eq avy-line-insert-style 'below) - (end-of-line) - (newline) - (save-excursion - (insert str))) - (t - (user-error "Unexpected `avy-line-insert-style'"))))))) - -;;;###autoload -(defun avy-move-region () - "Select two lines and move the text between them above the current line." - (interactive) - (avy-with avy-move-region - (let* ((initial-window (selected-window)) - (beg (avy--line)) - (end (avy--line)) - text) - (when (> beg end) - (cl-rotatef beg end)) - (setq end (save-excursion - (goto-char end) - (1+ (line-end-position)))) - (setq text (buffer-substring beg end)) - (move-beginning-of-line nil) - (delete-region beg end) - (select-window initial-window) - (insert text)))) - -;;;###autoload -(defun avy-kill-region (arg) - "Select two lines and kill the region between them. - -The window scope is determined by `avy-all-windows' or -`avy-all-windows-alt' when ARG is non-nil." - (interactive "P") - (let ((initial-window (selected-window))) - (avy-with avy-kill-region - (let* ((beg (save-selected-window - (list (avy--line arg) (selected-window)))) - (end (list (avy--line arg) (selected-window)))) - (cond - ((not (numberp (car beg))) - (user-error "Fail to select the beginning of region")) - ((not (numberp (car end))) - (user-error "Fail to select the end of region")) - ;; Restrict operation to same window. It's better if it can be - ;; different windows but same buffer; however, then the cloned - ;; buffers with different narrowed regions might cause problem. - ((not (equal (cdr beg) (cdr end))) - (user-error "Selected points are not in the same window")) - ((< (car beg) (car end)) - (save-excursion - (kill-region - (car beg) - (progn (goto-char (car end)) (forward-visible-line 1) (point))))) - (t - (save-excursion - (kill-region - (progn (goto-char (car beg)) (forward-visible-line 1) (point)) - (car end))))))) - (select-window initial-window))) - -;;;###autoload -(defun avy-kill-ring-save-region (arg) - "Select two lines and save the region between them to the kill ring. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, do the opposite of `avy-all-windows'." - (interactive "P") - (let ((initial-window (selected-window))) - (avy-with avy-kill-ring-save-region - (let* ((beg (save-selected-window - (list (avy--line arg) (selected-window)))) - (end (list (avy--line arg) (selected-window)))) - (cond - ((not (numberp (car beg))) - (user-error "Fail to select the beginning of region")) - ((not (numberp (car end))) - (user-error "Fail to select the end of region")) - ((not (equal (cdr beg) (cdr end))) - (user-error "Selected points are not in the same window")) - ((< (car beg) (car end)) - (save-excursion - (kill-ring-save - (car beg) - (progn (goto-char (car end)) (forward-visible-line 1) (point))))) - (t - (save-excursion - (kill-ring-save - (progn (goto-char (car beg)) (forward-visible-line 1) (point)) - (car end))))))) - (select-window initial-window))) - -;;;###autoload -(defun avy-kill-whole-line (arg) - "Select line and kill the whole selected line. - -With a numerical prefix ARG, kill ARG line(s) starting from the -selected line. If ARG is negative, kill backward. - -If ARG is zero, kill the selected line but exclude the trailing -newline. - -\\[universal-argument] 3 \\[avy-kil-whole-line] kill three lines -starting from the selected line. \\[universal-argument] -3 - -\\[avy-kill-whole-line] kill three lines backward including the -selected line." - (interactive "P") - (let ((initial-window (selected-window))) - (avy-with avy-kill-whole-line - (let* ((start (avy--line))) - (if (not (numberp start)) - (user-error "Fail to select the line to kill") - (save-excursion (goto-char start) - (kill-whole-line arg))))) - (select-window initial-window))) - -;;;###autoload -(defun avy-kill-ring-save-whole-line (arg) - "Select line and save the whole selected line as if killed, but don’t kill it. - -This command is similar to `avy-kill-whole-line', except that it -saves the line(s) as if killed, but does not kill it(them). - -With a numerical prefix ARG, kill ARG line(s) starting from the -selected line. If ARG is negative, kill backward. - -If ARG is zero, kill the selected line but exclude the trailing -newline." - (interactive "P") - (let ((initial-window (selected-window))) - (avy-with avy-kill-ring-save-whole-line - (let* ((start (avy--line))) - (if (not (numberp start)) - (user-error "Fail to select the line to kill") - (save-excursion - (let ((kill-read-only-ok t) - (buffer-read-only t)) - (goto-char start) - (kill-whole-line arg)))))) - (select-window initial-window))) - -;;;###autoload -(defun avy-setup-default () - "Setup the default shortcuts." - (eval-after-load "isearch" - '(define-key isearch-mode-map (kbd "C-'") 'avy-isearch))) - -(defcustom avy-timeout-seconds 0.5 - "How many seconds to wait for the second char." - :type 'float) - -(defcustom avy-enter-times-out t - "Whether enter exits avy-goto-char-timer early. If nil it matches newline" - :type 'boolean) - -(defun avy--read-candidates (&optional re-builder) - "Read as many chars as possible and return their occurrences. -At least one char must be read, and then repeatedly one next char -may be read if it is entered before `avy-timeout-seconds'. DEL -deletes the last char entered, and RET exits with the currently -read string immediately instead of waiting for another char for -`avy-timeout-seconds'. -The format of the result is the same as that of `avy--regex-candidates'. -This function obeys `avy-all-windows' setting. -RE-BUILDER is a function that takes a string and returns a regex. -When nil, `regexp-quote' is used. -If a group is captured, the first group is highlighted. -Otherwise, the whole regex is highlighted." - (let ((str "") - (re-builder (or re-builder #'regexp-quote)) - char break overlays regex) - (unwind-protect - (progn - (avy--make-backgrounds - (avy-window-list)) - (while (and (not break) - (setq char - (read-char (format "%d char%s: " - (length overlays) - (if (string= str "") - str - (format " (%s)" str))) - t - (and (not (string= str "")) - avy-timeout-seconds)))) - ;; Unhighlight - (dolist (ov overlays) - (delete-overlay ov)) - (setq overlays nil) - (cond - ;; Handle RET - ((= char 13) - (if avy-enter-times-out - (setq break t) - (setq str (concat str (list ?\n))))) - ;; Handle C-h, DEL - ((memq char avy-del-last-char-by) - (let ((l (length str))) - (when (>= l 1) - (setq str (substring str 0 (1- l)))))) - ;; Handle ESC - ((= char 27) - (keyboard-quit)) - (t - (setq str (concat str (list char))))) - ;; Highlight - (when (>= (length str) 1) - (let ((case-fold-search - (or avy-case-fold-search (string= str (downcase str)))) - found) - (avy-dowindows current-prefix-arg - (dolist (pair (avy--find-visible-regions - (window-start) - (window-end (selected-window) t))) - (save-excursion - (goto-char (car pair)) - (setq regex (funcall re-builder str)) - (while (re-search-forward regex (cdr pair) t) - (unless (not (avy--visible-p (1- (point)))) - (let* ((idx (if (= (length (match-data)) 4) 1 0)) - (ov (make-overlay - (match-beginning idx) (match-end idx)))) - (setq found t) - (push ov overlays) - (overlay-put - ov 'window (selected-window)) - (overlay-put - ov 'face 'avy-goto-char-timer-face))))))) - ;; No matches at all, so there's surely a typo in the input. - (unless found (beep))))) - (nreverse (mapcar (lambda (ov) - (cons (cons (overlay-start ov) - (overlay-end ov)) - (overlay-get ov 'window))) - overlays))) - (dolist (ov overlays) - (delete-overlay ov)) - (avy--done)))) - -(defvar avy--old-cands nil) - -;;;###autoload -(defun avy-goto-char-timer (&optional arg) - "Read one or many consecutive chars and jump to the first one. -The window scope is determined by `avy-all-windows' (ARG negates it)." - (interactive "P") - (let ((avy-all-windows (if arg - (not avy-all-windows) - avy-all-windows))) - (avy-with avy-goto-char-timer - (setq avy--old-cands (avy--read-candidates)) - (avy-process avy--old-cands)))) - -(defun avy-push-mark () - "Store the current point and window." - (let ((inhibit-message t)) - (ring-insert avy-ring - (cons (point) (selected-window))) - (unless (region-active-p) - (push-mark)))) - -(defun avy-pop-mark () - "Jump back to the last location of `avy-push-mark'." - (interactive) - (let (res) - (condition-case nil - (progn - (while (not (window-live-p - (cdr (setq res (ring-remove avy-ring 0)))))) - (let* ((window (cdr res)) - (frame (window-frame window))) - (when (and (frame-live-p frame) - (not (eq frame (selected-frame)))) - (select-frame-set-input-focus frame)) - (select-window window) - (goto-char (car res)))) - (error - (set-mark-command 4))))) - -;; ** Org-mode -(defvar org-reverse-note-order) -(declare-function org-refile "org") -(declare-function org-back-to-heading "org") -(declare-function org-reveal "org") - -(defvar org-after-refile-insert-hook) - -(defun avy-org-refile-as-child () - "Refile current heading as first child of heading selected with `avy.'" - ;; Inspired by `org-teleport': http://kitchingroup.cheme.cmu.edu/blog/2016/03/18/Org-teleport-headlines/ - (interactive) - (let* ((org-reverse-note-order t) - (marker (save-excursion - (avy-with avy-goto-line - (unless (eq 't (avy-jump (rx bol (1+ "*") (1+ space)))) - ;; `avy-jump' returns t when aborted with C-g. - (point-marker))))) - (filename (buffer-file-name (or (buffer-base-buffer (marker-buffer marker)) - (marker-buffer marker)))) - (rfloc (list nil filename nil marker)) - ;; Ensure the refiled heading is visible. - (org-after-refile-insert-hook (if (member 'org-reveal org-after-refile-insert-hook) - org-after-refile-insert-hook - (cons #'org-reveal org-after-refile-insert-hook)))) - (when marker - ;; Only attempt refile if avy session was not aborted. - (org-refile nil nil rfloc)))) - -(defun avy-org-goto-heading-timer (&optional arg) - "Read one or many characters and jump to matching Org headings. -The window scope is determined by `avy-all-windows' (ARG negates it)." - (interactive "P") - (let ((avy-all-windows (if arg - (not avy-all-windows) - avy-all-windows))) - (avy-with avy-goto-char-timer - (avy-process - (avy--read-candidates - (lambda (input) - (format "^\\*+ .*\\(%s\\)" input)))) - (org-back-to-heading)))) - -(provide 'avy) - -;;; avy.el ends here diff --git a/elpa/avy-20200311.1106/avy.elc b/elpa/avy-20200311.1106/avy.elc deleted file mode 100644 index 13c6a7768da57bc9c5bae2069a14bb47054afd14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79009 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%0Dl;4}Caiyb{KyB}&pUJTJJSJblxNY%WU`+1!;V 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 diff --git a/elpa/berrys-theme-20191201.1609/berrys-theme-autoloads.el b/elpa/berrys-theme-20191201.1609/berrys-theme-autoloads.el deleted file mode 100644 index 9bcc80a1..00000000 --- a/elpa/berrys-theme-20191201.1609/berrys-theme-autoloads.el +++ /dev/null @@ -1,24 +0,0 @@ -;;; berrys-theme-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "berrys-theme" "berrys-theme.el" (0 0 0 0)) -;;; Generated autoloads from berrys-theme.el - -(when (and (boundp 'custom-theme-load-path) load-file-name) (add-to-list 'custom-theme-load-path (file-name-as-directory (file-name-directory load-file-name)))) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "berrys-theme" '("berrys"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; berrys-theme-autoloads.el ends here diff --git a/elpa/berrys-theme-20191201.1609/berrys-theme-pkg.el b/elpa/berrys-theme-20191201.1609/berrys-theme-pkg.el deleted file mode 100644 index e460e5e9..00000000 --- a/elpa/berrys-theme-20191201.1609/berrys-theme-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "berrys-theme" "20191201.1609" "A light, clean and elegant theme" '((emacs "24.1")) :commit "888a14206b2fb3dc45b5273aeb05075f3e0b5f60" :authors '(("Slava Buzin" . "v8v.buzin@gmail.com")) :maintainer '("Slava Buzin" . "v8v.buzin@gmail.com") :url "https://github.com/vbuzin/berrys-theme") diff --git a/elpa/berrys-theme-20191201.1609/berrys-theme.el b/elpa/berrys-theme-20191201.1609/berrys-theme.el deleted file mode 100644 index 1e2aeac6..00000000 --- a/elpa/berrys-theme-20191201.1609/berrys-theme.el +++ /dev/null @@ -1,399 +0,0 @@ -;;; berrys-theme.el --- A light, clean and elegant theme -*- lexical-binding: t; -*- - -;; Copyright © 2019-present Slava Buzin - -;; Title: Berrys Theme -;; Project: berrys-theme -;; Version: 0.1.0 -;; Package-Version: 20191201.1609 -;; URL: https://github.com/vbuzin/berrys-theme -;; Author: Slava Buzin -;; Package-Requires: ((emacs "24.1")) -;; License: MIT - -;;; Commentary: - -;; Berrys is a 9 colorspace theme build to run in GUI mode -;; with support for some third-party syntax- and UI packages. - -;;; Code: - -(deftheme berrys "A light, clean and elegant theme") - -;;;; Colors -(let* ((class '((class color) (min-colors 89))) - (berrys00 nil) - - (berrys01 "#FAFAFA") - (berrys02 "#2C302E") - (berrys03 "#646881") - (berrys04 "#E2E3E8") - - (berrys05 "#1098F7") - (berrys06 "#B2EAFF") - - (berrys07 nil) - - (berrys08 "#00AC00") - - (berrys09 "#D89800") - - (berrys10 "#B80C09") - - (berrys-cursor berrys05) - (berrys-comment berrys03) - (berrys-string berrys03) - - (berrys-warning berrys09) - (berrys-error berrys10)) - - (custom-theme-set-faces - 'berrys - - ;;; Core - ;; ============================================================================= - ;; => Base - `(bold ((,class (:weight bold)))) - `(bold-italic ((,class (:weight bold :slant italic)))) - `(default ((,class (:foreground ,berrys02 :background ,berrys01)))) - `(error ((,class (:foreground ,berrys-error)))) - `(fixed-pitch-serif ((,class (:family unspecified)))) - `(font-lock-builtin-face ((,class (:foreground ,berrys02 :weight bold)))) - `(font-lock-comment-face ((,class (:foreground ,berrys-comment :slant italic)))) - `(font-lock-comment-delimiter-face ((,class (:foreground ,berrys-comment :slant italic)))) - `(font-lock-constant-face ((,class (:foreground ,berrys02 :weight bold)))) - `(font-lock-doc-face ((,class (:inherit (font-lock-comment-face))))) - `(font-lock-function-name-face ((,class (:foreground ,berrys02 :weight bold)))) - `(font-lock-keyword-face ((,class (:foreground ,berrys02 :weight bold)))) - `(font-lock-string-face ((,class (:foreground ,berrys-string)))) - `(font-lock-type-face ((,class (:foreground ,berrys02 :slant italic)))) - `(font-lock-variable-name-face ((,class (:foreground ,berrys02)))) - `(font-lock-warning-face ((,class (:inherit warning)))) - `(shadow ((,class (:foreground ,berrys03)))) - `(warning ((,class (:foreground ,berrys-warning)))) - - ;; => Core UI - `(cursor ((,class (:background ,berrys-cursor :inverse-video t)))) - `(custom-button ((,class (:background ,berrys05 :foreground ,berrys01)))) - `(custom-variable-tag ((,class (:foreground ,berrys02 :weight bold)))) - `(custom-visibility ((,class (:inherit link)))) - `(diff-added ((,class (:foreground ,berrys08)))) - `(diff-context ((,class (:foreground ,berrys-string)))) - `(diff-file-header ((,class (:inherit diff-header)))) - `(diff-header ((,class (:foreground ,berrys03)))) - `(diff-hunk-header ((,class (:inherit diff-header)))) - `(diff-indicator-added ((,class (:foreground ,berrys08)))) - `(diff-refine-added ((,class (:foreground ,berrys08)))) - `(diff-refine-changed ((,class (:foreground ,berrys09)))) - `(diff-refine-removed ((,class (:foreground ,berrys10)))) - `(diff-removed ((,class (:foreground ,berrys10)))) - `(dired-directory ((,class :foreground ,berrys02 :weight bold))) - `(header-line ((,class :foreground ,berrys02 :weight bold))) - `(highlight ((,class (:background ,berrys04)))) - `(hl-line ((,class (:background ,berrys04)))) - `(info-node ((,class (:foreground ,berrys05 :weight bold)))) - `(info-menu-header ((,class (:foreground ,berrys02 :weight bold)))) - `(info-menu-star ((,class (:foreground ,berrys05)))) - `(info-title-4 ((,class (:foreground ,berrys02 :weight bold)))) - `(isearch ((,class (:foreground ,berrys05 :weight bold)))) - `(isearch-fail ((,class (:foreground ,berrys01 :background ,berrys-error)))) - `(lazy-highlight ((,class (:inherit isearch)))) - `(link ((,class (:underline t)))) - `(link-visited ((,class (:underline t)))) - `(match ((,class (:inherit isearch)))) - - `(message-cited-text ((,class (:inherit font-lock-comment-face)))) - `(message-header-cc ((,class (:foreground ,berrys-string)))) - `(message-header-name ((,class (:foreground ,berrys-string)))) - `(message-header-newsgroups ((,class (:foreground ,berrys-string :slant italic :weight bold)))) - `(message-header-other ((,class (:foreground ,berrys-string)))) - `(message-header-subject ((,class (:foreground ,berrys-string)))) - `(message-header-to ((,class (:foreground ,berrys-string)))) - `(message-header-xheader ((,class (:foreground ,berrys-string)))) - `(message-mml ((,class (:foreground ,berrys-string)))) - `(message-separator ((,class (:inherit font-lock-comment-face)))) - - `(minibuffer-prompt ((,class (:foreground ,berrys02 :weight bold)))) - `(mode-line ((,class (:foreground ,berrys02 :background ,berrys04)))) - `(mode-line-buffer-id ((,class (:weight bold)))) - `(mode-line-highlight ((,class (:inherit highlight)))) - `(mode-line-inactive ((,class (:foreground ,berrys02 :background ,berrys01 :box (:color ,berrys04))))) - `(outline-1 ((,class (:foreground ,berrys02 :weight bold)))) - `(outline-2 ((,class (:inherit outline-1)))) - `(outline-3 ((,class (:inherit outline-1)))) - `(outline-4 ((,class (:inherit outline-1)))) - `(outline-5 ((,class (:inherit outline-1)))) - `(outline-6 ((,class (:inherit outline-1)))) - `(outline-7 ((,class (:inherit outline-1)))) - `(outline-8 ((,class (:inherit outline-1)))) - `(region ((,class (:background ,berrys06)))) - `(secondary-selection ((,class (:background ,berrys04 :foreground ,berrys02)))) - `(show-paren-match ((,class (:weight bold)))) - `(show-paren-mismatch ((,class (:foreground ,berrys-error :weight bold)))) - `(success ((,class (:foreground ,berrys08)))) - `(whitespace-big-indent ((,class (:foreground ,berrys01 :background ,berrys10)))) - `(whitespace-line ((,class (:background ,berrys01)))) - `(whitespace-trailing ((,class (:foreground ,berrys01 :background ,berrys10)))) - - ;;; Packages - ;; ============================================================================= - ;; => Ace jump - `(ace-jump-face-foreground ((,class (:foreground ,berrys05 :weight bold)))) - - ;; => Anzu - `(anzu-match-1 ((,class (:foreground ,berrys05 :weight bold :box (:color ,berrys05))))) - `(anzu-match-2 ((,class (:foreground ,berrys01 :background ,berrys05 :weight bold :box (:color ,berrys05))))) - `(anzu-match-3 ((,class (:foreground ,berrys01 :background ,berrys03 :weight bold :box (:color ,berrys03))))) - `(anzu-mode-line ((,class (:foreground ,berrys02 :weight bold)))) - `(anzu-mode-line-no-match ((,class (:foreground ,berrys10 :weight bold)))) - `(anzu-replace-to ((,class (:foreground ,berrys-string :weight bold)))) - - ;; => Company - `(company-echo-common ((,class (:foreground ,berrys01 :background ,berrys10)))) - `(company-scrollbar-bg ((,class (:foreground ,berrys04 :background ,berrys04)))) - `(company-scrollbar-fg ((,class (:foreground ,berrys02 :background ,berrys02)))) - `(company-template-field ((,class (:inherit region)))) - `(company-tooltip ((,class (:foreground ,berrys02 :background ,berrys04)))) - `(company-tooltip-annotation ((,class (:foreground ,berrys-string)))) - `(company-tooltip-common ((,class (:inherit company-tooltip)))) - `(company-tooltip-common-selection ((,class (:inherit company-tooltip-selection)))) - `(company-tooltip-mouse ((,class (:inherit highlight)))) - `(company-tooltip-search ((,class (:inherit isearch)))) - `(company-tooltip-search-selection ((,class (:inherit company-tooltip-search)))) - `(company-tooltip-selection ((,class (:background ,berrys06)))) - - ;; => bm - `(bm-face ((,class (:foreground ,berrys05 :background ,berrys01)))) - `(bm-fringe-face ((,class (:inherit bm-face)))) - `(bm-persistent-face ((,class (:foreground ,berrys01 :background ,berrys05)))) - `(bm-fringe-persistent-face ((,class (:inherit bm-persistent-face)))) - - ;; => Flx - `(flx-highlight-face ((,class (:foreground ,berrys05 :weight bold)))) - - ;; => Flycheck - `(flycheck-error ((,class (:underline (:style wave :color ,berrys-error))))) - `(flycheck-fringe-error ((,class (:foreground ,berrys-error :weight bold)))) - `(flycheck-fringe-info ((,class (:foreground ,berrys02 :weight bold)))) - `(flycheck-fringe-warning ((,class (:foreground ,berrys-warning :weight bold)))) - `(flycheck-info ((,class (:underline (:style wave :color ,berrys05))))) - `(flycheck-warning ((,class (:underline (:style wave :color ,berrys-warning))))) - - ;; => Gnus - `(gnus-header-content ((,class (:foreground ,berrys-string :italic t)))) - `(gnus-header-from ((,class (:foreground ,berrys-string)))) - `(gnus-header-name ((,class (:foreground ,berrys-string :weight bold)))) - `(gnus-header-subject ((,class (:foreground ,berrys-string)))) - - ;; => Haskell-mode - `(haskell-error-face ((,class (:underline (:style wave :color ,berrys-error))))) - `(haskell-hole-face ((,class (:underline (:style wave :color ,berrys05))))) - `(haskell-warning-face ((,class (:underline (:style wave :color ,berrys-warning))))) - - ;; => Helm - `(helm-M-x-key ((,class (:foreground ,berrys03 :underline t)))) - `(helm-buffer-directory ((,class (:inherit helm-buffer-file)))) - `(helm-buffer-not-saved ((,class (:foreground ,berrys03 :slant italic)))) - `(helm-buffer-process ((,class (:foreground ,berrys03)))) - `(helm-candidate-number ((,class (:weight bold)))) - `(helm-candidate-number-suspended ((,class (:foreground ,berrys03 :weight bold)))) - `(helm-ff-directory ((,class (:foreground ,berrys02 :weight bold)))) - `(helm-ff-dirs ((,class (:inherit helm-ff-file)))) - `(helm-ff-dotted-directory ((,class (:inherit helm-ff-directory)))) - `(helm-ff-dotted-symlink-directory ((,class (:inherit helm-ff-dotted-directory)))) - `(helm-ff-file ((,class (:foreground ,berrys02)))) - `(helm-ff-executable ((,class (:foreground ,berrys08)))) - `(helm-ff-invalid-symlink ((,class (:foreground ,berrys01 :background ,berrys10)))) - `(helm-ff-pipe ((,class (:foreground ,berrys09 :background ,berrys02)))) - `(helm-ff-prefix ((,class (:foreground ,berrys02 :background ,berrys06)))) - `(helm-ff-socket ((,class (:foreground ,berrys10 :box (:color ,berrys10))))) - `(helm-grep-file ((,class (:foreground ,berrys02 :weight bold)))) - `(helm-grep-finish ((,class (:foreground ,berrys08 :weight bold)))) - `(helm-grep-lineno ((,class (:foreground ,berrys03)))) - `(helm-grep-match ((,class (:inherit isearch)))) - `(helm-header ((,class (:inherit helm-source-header :background ,berrys01)))) - `(helm-header-line-left-margin ((,class (:foreground ,berrys01 :background ,berrys09)))) - `(helm-helper ((,class (:foreground ,berrys02)))) - `(helm-history-deleted ((,class (:foreground ,berrys01 :background ,berrys10)))) - `(helm-history-remote ((,class (:foreground ,berrys10)))) - `(helm-lisp-completion-info ((,class (:foreground ,berrys04 :weight bold)))) - `(helm-lisp-show-completion ((,class (:inherit isearch)))) - `(helm-locate-finish ((,class (:foreground ,berrys08)))) - `(helm-match ((,class (:foreground ,berrys05 :weight bold)))) - `(helm-match-item ((,class (:inherit isearch)))) - `(helm-moccur-buffer ((,class (:foreground ,berrys02)))) - `(helm-mode-prefix ((,class (:foreground ,berrys01 :background ,berrys06)))) - `(helm-resume-need-update ((,class (:foreground ,berrys01 :background ,berrys10)))) - `(helm-selection ((,class (:inherit highlight)))) - `(helm-selection-line ((,class (:inherit highlight)))) - `(helm-source-header ((,class (:foreground ,berrys02 :weight bold :height 1.2)))) - `(helm-separator ((,class (:foreground ,berrys02)))) - `(helm-visible-mark ((,class (:background ,berrys06)))) - `(helm-yas-key ((,class (:inherit helm-M-x-key)))) - - ;; => Ido - `(ido-indicator ((,class (:foreground ,berrys01 :background ,berrys10)))) - `(ido-only-match ((,class (:foreground ,berrys05 :weight bold)))) - `(ido-subdir ((,class (:foreground ,berrys02 :weight bold)))) - `(ido-virtual ((,class (:foreground ,berrys-string :weight bold)))) - - ;; => Indent guide - `(indent-guide-face ((,class (:foreground ,berrys-comment)))) - - ;; => Ivy - `(ivy-confirm-face ((,class (:foreground ,berrys08 :weight bold)))) - `(ivy-current-match ((,class (:inherit hl-line)))) - `(ivy-cursor ((,class (:foreground ,berrys01 :background ,berrys02)))) - `(ivy-match-required-face ((,class (:foreground ,berrys10 :weight bold)))) - `(ivy-remote ((,class (:foreground ,berrys02 :underline t)))) - `(ivy-minibuffer-match-face-2 ((,class (:foreground ,berrys05 :weight bold)))) - `(ivy-minibuffer-match-face-3 ((,class (:inherit ivy-minibuffer-match-face-2 :underline t)))) - `(ivy-minibuffer-match-face-4 ((,class (:inherit ivy-minibuffer-match-face-2 :box (:color ,berrys05))))) - - ;; => Markdown - `(markdown-code-face ((,class (:family unspecified)))) - `(markdown-header-face ((,class (:foreground ,berrys02 :weight bold)))) - `(markdown-header-face-1 ((,class (:inherit markdown-header-face :height 1.4)))) - `(markdown-header-face-2 ((,class (:inherit markdown-header-face :height 1.3)))) - `(markdown-header-face-3 ((,class (:inherit markdown-header-face :height 1.2)))) - `(markdown-header-face-4 ((,class (:inherit markdown-header-face :height 1.1)))) - `(markdown-inline-code-face ((,class (:inherit markdown-code-face)))) - `(markdown-italic-face ((,class (:inherit italic)))) - - ;; => Magit - `(magit-bisect-bad ((,class (:foreground ,berrys-error)))) - `(magit-bisect-good ((,class (:foreground ,berrys08)))) - `(magit-bisect-skip ((,class (:foreground ,berrys09)))) - `(magit-blame-highlight ((,class (:foreground ,berrys03 :background ,berrys04)))) - `(magit-branch-local ((,class (:foreground ,berrys05)))) - `(magit-branch-remote ((,class (:foreground ,berrys08)))) - `(magit-reflog-checkout ((,class (:foreground ,berrys05)))) - `(magit-diff-base ((,class (:foreground ,berrys09)))) - `(magit-diff-base-highlight ((,class (:inherit magit-diff-base)))) - `(magit-diff-context ((,class (:foreground ,berrys-string)))) - `(magit-diff-context-highlight ((,class (:inherit magit-diff-context)))) - `(magit-diff-added ((,class (:foreground ,berrys08)))) - `(magit-diff-added-highlight ((,class (:inherit magit-diff-added)))) - `(magit-diff-file-heading ((,class (:foreground ,berrys-string)))) - `(magit-diff-file-heading-selection ((,class (:inherit magit-diff-file-heading)))) - `(magit-diff-hunk-heading ((,class (:foreground ,berrys03)))) - `(magit-diff-hunk-heading-highlight ((,class (:inherit magit-diff-hunk-heading)))) - `(magit-diff-hunk-heading-selection ((,class (:inherit magit-diff-hunk-heading)))) - `(magit-diff-lines-boundary((,class (:inherit unspecified)))) - `(magit-diff-lines-heading ((,class (:inherit unspecified)))) - `(magit-diff-our-highlight ((,class (:inherit magit-diff-removed)))) - `(magit-diff-removed ((,class (:foreground ,berrys10)))) - `(magit-diff-removed-highlight ((,class (:inherit magit-diff-removed)))) - `(magit-diffstat-added ((,class (:foreground ,berrys08)))) - `(magit-diffstat-removed ((,class (:foreground ,berrys10)))) - `(magit-diff-their-highlight ((,class (:inherit magit-diff-added)))) - `(magit-diff-whitespace-warning ((,class (:foreground ,berrys01 :background ,berrys10)))) - `(magit-log-author ((,class (:foreground ,berrys02)))) - `(magit-log-date ((,class (:foreground ,berrys-comment)))) - `(magit-log-graph ((,class (:foreground ,berrys-comment)))) - `(magit-hash ((,class (:foreground ,berrys-comment)))) - `(magit-header-line ((,class (:foreground ,berrys-string)))) - `(magit-header-line-log-select ((,class (:foreground ,berrys02)))) - `(magit-process-ok ((,class (:foreground ,berrys08)))) - `(magit-reflog-cherry-pick ((,class (:foreground ,berrys08)))) - `(magit-reflog-commit ((,class (:foreground ,berrys08)))) - `(magit-reflog-merge ((,class (:foreground ,berrys08)))) - `(magit-reflog-reset ((,class (:foreground ,berrys10)))) - `(magit-refname ((,class (:foreground ,berrys-comment)))) - `(magit-section-heading ((,class (:foreground ,berrys02)))) - `(magit-section-heading-selection ((,class (:inherit magit-section-heading)))) - `(magit-section-highlight ((,class (:inherit unspecified)))) - `(magit-section-secondary-heading ((,class (:foreground ,berrys02)))) - `(magit-signature-bad ((,class (:foreground ,berrys-error)))) - `(magit-signature-error ((,class (:foreground ,berrys-error)))) - `(magit-signature-expired ((,class (:foreground ,berrys-warning)))) - `(magit-signature-expired-key ((,class (:inherit magit-signature-expired)))) - `(magit-signature-good ((,class (:foreground ,berrys08)))) - `(magit-signature-revoked ((,class (:foreground ,berrys10)))) - `(magit-signature-untrusted ((,class (:foreground ,berrys10)))) - `(magit-tag ((,class (:foreground ,berrys05)))) - - ;; => Mu4e - `(mu4e-attach-number-face ((,class (:foreground ,berrys05)))) - `(mu4e-contact-face ((,class (:foreground ,berrys-string :slant italic)))) - `(mu4e-context-face ((,class (:foreground ,berrys-string)))) - `(mu4e-flagged-face ((,class (:foreground ,berrys09)))) - `(mu4e-header-face ((,class (:foreground ,berrys02)))) - `(mu4e-header-highlight-face ((,class (:inherit highlight)))) - `(mu4e-header-key-face ((,class (:foreground ,berrys-string :weight bold)))) - `(mu4e-header-marks-face ((,class (:foreground ,berrys05 :weight bold)))) - `(mu4e-header-value-face ((,class (:foreground ,berrys-string :slant italic)))) - `(mu4e-highlight-face ((,class (:foreground ,berrys05)))) - `(mu4e-special-header-value-face ((,class (:foreground ,berrys-string :slant italic)))) - `(mu4e-region-code ((,class (:box (:color ,berrys05))))) - `(mu4e-replied-face ((,class :slant italic))) - `(mu4e-url-number-face ((,class (:foreground ,berrys05)))) - - ;; => Org mode - `(org-agenda-date ((,class (:foreground ,berrys02)))) - `(org-agenda-diary ((,class (:foreground ,berrys-string :slant italic)))) - `(org-agenda-dimmed-todo-face ((,class (:foreground ,berrys-comment :slant italic)))) - `(org-agenda-done ((,class (:foreground ,berrys-string :slant italic :strike-through t)))) - `(org-agenda-restriction-lock ((,class (:background ,berrys04)))) - `(org-agenda-structure ((,class (:foreground ,berrys02 :weight bold :height 1.2)))) - `(org-block ((,class (:inherit berrys02)))) - `(org-clock-overlay ((,class (:inherit secondary-selection)))) - `(org-column ((,class (:foreground ,berrys-string :slant normal)))) - `(org-column-title ((,class (:foreground ,berrys02 :weight bold)))) - `(org-date ((,class (:foreground ,berrys02 :slant italic)))) - `(org-date-selected ((,class (:foreground ,berrys05 :weight bold)))) - `(org-document-info ((,class (:foreground ,berrys03)))) - `(org-document-title ((,class (:foreground ,berrys03 :weight bold)))) - `(org-done ((,class(:inherit org-level-1 :foreground ,berrys08)))) - `(org-ellipsis ((,class (:inherit unspecified)))) - `(org-footnote ((,class (:foreground ,berrys02 :underline t)))) - `(org-formula ((,class (:foreground ,berrys-string)))) - `(org-headline-done ((,class (:inherit org-level-1 :strike-through t)))) - `(org-latex-and-related ((,class (:foreground ,berrys-string)))) - `(org-level-1 ((,class (:foreground ,berrys02 :weight bold)))) - `(org-level-2 ((,class (:inherit org-level-1)))) - `(org-level-3 ((,class (:inherit org-level-1)))) - `(org-level-4 ((,class (:inherit org-level-1)))) - `(org-level-5 ((,class (:inherit org-level-1)))) - `(org-level-6 ((,class (:inherit org-level-1)))) - `(org-level-7 ((,class (:inherit org-level-1)))) - `(org-level-8 ((,class (:inherit org-level-1)))) - `(org-link ((,class (:inherit unspecified :underline t)))) - `(org-mode-line-clock ((,class (:inherit mode-line)))) - `(org-mode-line-clock-overrun ((,class (:foreground ,berrys09)))) - `(org-priority ((,class(:inherit org-level-1 :foreground ,berrys05)))) - `(org-scheduled ((,class (:foreground ,berrys02 :slant italic)))) - `(org-scheduled-previously ((,class (:foreground ,berrys10 :slant italic)))) - `(org-scheduled-today ((,class (:inherit org-scheduled)))) - `(org-sexp-date ((,class (:foreground ,berrys-string :slant italic)))) - `(org-special-keyword ((,class (:foreground ,berrys-string)))) - `(org-table ((,class (:foreground ,berrys02)))) - `(org-tag ((,class(:inherit org-level-1 :foreground ,berrys05)))) - `(org-time-grid ((,class (:foreground ,berrys-string :slant italic)))) - `(org-todo ((,class (:inherit org-level-1 :foreground ,berrys05)))) - `(org-upcoming-deadline ((,class (:foreground ,berrys09 :slant italic)))) - `(org-warning ((,class (:foreground ,berrys09 :slant italic)))) - `(org-verbatim ((,class (:inherit default)))) - - ;; Org Pomodoro - `(org-pomodoro-mode-line ((,class (:foreground ,berrys05 :weight bold)))) - `(org-pomodoro-mode-line-break ((,class (:foreground ,berrys08 :weight bold)))) - `(org-pomodoro-mode-line-overtime ((,class (:foreground ,berrys-error :weight bold)))) - - ;; => Which key - `(which-key-key-face ((,class (:foreground ,berrys05 :weight bold)))))) - -;;;###autoload -(when (and (boundp 'custom-theme-load-path) load-file-name) - (add-to-list 'custom-theme-load-path - (file-name-as-directory (file-name-directory load-file-name)))) - -(provide-theme 'berrys) -(provide 'berrys-theme) - -;; Local Variables: -;; no-byte-compile: t -;; indent-tabs-mode: nil -;; End: - -;;; berrys-theme.el ends here diff --git a/elpa/company-20200324.2145/company-abbrev.el b/elpa/company-20200324.2145/company-abbrev.el deleted file mode 100644 index 24ec3b77..00000000 --- a/elpa/company-20200324.2145/company-abbrev.el +++ /dev/null @@ -1,50 +0,0 @@ -;;; company-abbrev.el --- company-mode completion backend for abbrev - -;; Copyright (C) 2009-2011, 2015 Free Software Foundation, Inc. - -;; Author: Nikolaj Schumacher - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - - -;;; Commentary: -;; - -;;; Code: - -(require 'company) -(require 'cl-lib) -(require 'abbrev) - -(defun company-abbrev-insert (match) - "Replace MATCH with the expanded abbrev." - (expand-abbrev)) - -;;;###autoload -(defun company-abbrev (command &optional arg &rest ignored) - "`company-mode' completion backend for abbrev." - (interactive (list 'interactive)) - (cl-case command - (interactive (company-begin-backend 'company-abbrev - 'company-abbrev-insert)) - (prefix (company-grab-symbol)) - (candidates (nconc - (delete "" (all-completions arg global-abbrev-table)) - (delete "" (all-completions arg local-abbrev-table)))) - (meta (abbrev-expansion arg)))) - -(provide 'company-abbrev) -;;; company-abbrev.el ends here diff --git a/elpa/company-20200324.2145/company-abbrev.elc b/elpa/company-20200324.2145/company-abbrev.elc deleted file mode 100644 index bf5377acccc094558c1465cd1cda6057383a5b1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1170 zcmbtUO>f&U49#)%?%Q!(Ig!Ppa0Uw0kP|3_e_hf(#Q~vJk}UWw zC#G3*FSp=TD*$-yilS(c?>)tZ5d{5ZHXgGjAD3woK7yr(n~XQ(Ss(5#Jv>TF+^Dib zy@x`@O6GuhZfUoIbQm39O%nJ-F8@Gt^A_Edf38q0p)(fAk?52wJ0(=-{+1 z88@+5YDd&=BNU z{3K>@ZR~#_2@tqc88|-)S~MCJpxwZUC03Z+Xk$q<04Hy_b?3`I!_1cJ9&e^>vt`D8 z4Nm?Vhnys7a^7)DlGd;4B3ToOLuA5s&Ne+-YIZYG2d=lZC!I_V>(1)a=QBQ?j*mLp zI{X3kMwuK{*Jh7750Ns(OBX#T9vhZC>t61j8INYW T4-f|-3@U4Ok|q8^UBl=PiUnis diff --git a/elpa/company-20200324.2145/company-autoloads.el b/elpa/company-20200324.2145/company-autoloads.el deleted file mode 100644 index c440326a..00000000 --- a/elpa/company-20200324.2145/company-autoloads.el +++ /dev/null @@ -1,383 +0,0 @@ -;;; company-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "company" "company.el" (0 0 0 0)) -;;; Generated autoloads from company.el - -(autoload 'company-mode "company" "\ -\"complete anything\"; is an in-buffer completion framework. -Completion starts automatically, depending on the values -`company-idle-delay' and `company-minimum-prefix-length'. - -Completion can be controlled with the commands: -`company-complete-common', `company-complete-selection', `company-complete', -`company-select-next', `company-select-previous'. If these commands are -called before `company-idle-delay', completion will also start. - -Completions can be searched with `company-search-candidates' or -`company-filter-candidates'. These can be used while completion is -inactive, as well. - -The completion data is retrieved using `company-backends' and displayed -using `company-frontends'. If you want to start a specific backend, call -it interactively or use `company-begin-backend'. - -By default, the completions list is sorted alphabetically, unless the -backend chooses otherwise, or `company-transformers' changes it later. - -regular keymap (`company-mode-map'): - -\\{company-mode-map} -keymap during active completions (`company-active-map'): - -\\{company-active-map} - -\(fn &optional ARG)" t nil) - -(defvar global-company-mode nil "\ -Non-nil if Global Company mode is enabled. -See the `global-company-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-company-mode'.") - -(custom-autoload 'global-company-mode "company" nil) - -(autoload 'global-company-mode "company" "\ -Toggle Company mode in all buffers. -With prefix ARG, enable Global Company mode if ARG is positive; -otherwise, disable it. If called from Lisp, enable the mode if -ARG is omitted or nil. - -Company mode is enabled in all buffers where -`company-mode-on' would do it. -See `company-mode' for more information on Company mode. - -\(fn &optional ARG)" t nil) - -(autoload 'company-manual-begin "company" "\ - - -\(fn)" t nil) - -(autoload 'company-complete "company" "\ -Insert the common part of all candidates or the current selection. -The first time this is called, the common part is inserted, the second -time, or when the selection has been changed, the selected candidate is -inserted. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company" '("company-"))) - -;;;*** - -;;;### (autoloads nil "company-abbrev" "company-abbrev.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from company-abbrev.el - -(autoload 'company-abbrev "company-abbrev" "\ -`company-mode' completion backend for abbrev. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-abbrev" '("company-abbrev-insert"))) - -;;;*** - -;;;### (autoloads nil "company-bbdb" "company-bbdb.el" (0 0 0 0)) -;;; Generated autoloads from company-bbdb.el - -(autoload 'company-bbdb "company-bbdb" "\ -`company-mode' completion backend for BBDB. - -\(fn COMMAND &optional ARG &rest IGNORE)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-bbdb" '("company-bbdb-"))) - -;;;*** - -;;;### (autoloads nil "company-capf" "company-capf.el" (0 0 0 0)) -;;; Generated autoloads from company-capf.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-capf" '("company-"))) - -;;;*** - -;;;### (autoloads nil "company-clang" "company-clang.el" (0 0 0 0)) -;;; Generated autoloads from company-clang.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-clang" '("company-clang"))) - -;;;*** - -;;;### (autoloads nil "company-cmake" "company-cmake.el" (0 0 0 0)) -;;; Generated autoloads from company-cmake.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-cmake" '("company-cmake"))) - -;;;*** - -;;;### (autoloads nil "company-css" "company-css.el" (0 0 0 0)) -;;; Generated autoloads from company-css.el - -(autoload 'company-css "company-css" "\ -`company-mode' completion backend for `css-mode'. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-css" '("company-css-"))) - -;;;*** - -;;;### (autoloads nil "company-dabbrev" "company-dabbrev.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from company-dabbrev.el - -(autoload 'company-dabbrev "company-dabbrev" "\ -dabbrev-like `company-mode' completion backend. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-dabbrev" '("company-dabbrev-"))) - -;;;*** - -;;;### (autoloads nil "company-dabbrev-code" "company-dabbrev-code.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from company-dabbrev-code.el - -(autoload 'company-dabbrev-code "company-dabbrev-code" "\ -dabbrev-like `company-mode' backend for code. -The backend looks for all symbols in the current buffer that aren't in -comments or strings. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-dabbrev-code" '("company-dabbrev-code-"))) - -;;;*** - -;;;### (autoloads nil "company-eclim" "company-eclim.el" (0 0 0 0)) -;;; Generated autoloads from company-eclim.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-eclim" '("company-eclim"))) - -;;;*** - -;;;### (autoloads nil "company-elisp" "company-elisp.el" (0 0 0 0)) -;;; Generated autoloads from company-elisp.el - -(autoload 'company-elisp "company-elisp" "\ -`company-mode' completion backend for Emacs Lisp. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-elisp" '("company-elisp-"))) - -;;;*** - -;;;### (autoloads nil "company-etags" "company-etags.el" (0 0 0 0)) -;;; Generated autoloads from company-etags.el - -(autoload 'company-etags "company-etags" "\ -`company-mode' completion backend for etags. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-etags" '("company-etags-"))) - -;;;*** - -;;;### (autoloads nil "company-files" "company-files.el" (0 0 0 0)) -;;; Generated autoloads from company-files.el - -(autoload 'company-files "company-files" "\ -`company-mode' completion backend existing file names. -Completions works for proper absolute and relative files paths. -File paths with spaces are only supported inside strings. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-files" '("company-file"))) - -;;;*** - -;;;### (autoloads nil "company-gtags" "company-gtags.el" (0 0 0 0)) -;;; Generated autoloads from company-gtags.el - -(autoload 'company-gtags "company-gtags" "\ -`company-mode' completion backend for GNU Global. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-gtags" '("company-gtags-"))) - -;;;*** - -;;;### (autoloads nil "company-ispell" "company-ispell.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from company-ispell.el - -(autoload 'company-ispell "company-ispell" "\ -`company-mode' completion backend using Ispell. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-ispell" '("company-ispell-"))) - -;;;*** - -;;;### (autoloads nil "company-keywords" "company-keywords.el" (0 -;;;;;; 0 0 0)) -;;; Generated autoloads from company-keywords.el - -(autoload 'company-keywords "company-keywords" "\ -`company-mode' backend for programming language keywords. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-keywords" '("company-keywords-"))) - -;;;*** - -;;;### (autoloads nil "company-nxml" "company-nxml.el" (0 0 0 0)) -;;; Generated autoloads from company-nxml.el - -(autoload 'company-nxml "company-nxml" "\ -`company-mode' completion backend for `nxml-mode'. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-nxml" '("company-nxml-"))) - -;;;*** - -;;;### (autoloads nil "company-oddmuse" "company-oddmuse.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from company-oddmuse.el - -(autoload 'company-oddmuse "company-oddmuse" "\ -`company-mode' completion backend for `oddmuse-mode'. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-oddmuse" '("company-oddmuse-"))) - -;;;*** - -;;;### (autoloads nil "company-semantic" "company-semantic.el" (0 -;;;;;; 0 0 0)) -;;; Generated autoloads from company-semantic.el - -(autoload 'company-semantic "company-semantic" "\ -`company-mode' completion backend using CEDET Semantic. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-semantic" '("company-semantic-"))) - -;;;*** - -;;;### (autoloads nil "company-template" "company-template.el" (0 -;;;;;; 0 0 0)) -;;; Generated autoloads from company-template.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-template" '("company-template-"))) - -;;;*** - -;;;### (autoloads nil "company-tempo" "company-tempo.el" (0 0 0 0)) -;;; Generated autoloads from company-tempo.el - -(autoload 'company-tempo "company-tempo" "\ -`company-mode' completion backend for tempo. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-tempo" '("company-tempo-"))) - -;;;*** - -;;;### (autoloads nil "company-tng" "company-tng.el" (0 0 0 0)) -;;; Generated autoloads from company-tng.el - -(autoload 'company-tng-frontend "company-tng" "\ -When the user changes the selection at least once, this -frontend will display the candidate in the buffer as if it's -already there and any key outside of `company-active-map' will -confirm the selection and finish the completion. - -\(fn COMMAND)" nil nil) - -(autoload 'company-tng-configure-default "company-tng" "\ -Applies the default configuration to enable company-tng. - -\(fn)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-tng" '("company-tng--"))) - -;;;*** - -;;;### (autoloads nil "company-xcode" "company-xcode.el" (0 0 0 0)) -;;; Generated autoloads from company-xcode.el - -(autoload 'company-xcode "company-xcode" "\ -`company-mode' completion backend for Xcode projects. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-xcode" '("company-xcode-"))) - -;;;*** - -;;;### (autoloads nil "company-yasnippet" "company-yasnippet.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from company-yasnippet.el - -(autoload 'company-yasnippet "company-yasnippet" "\ -`company-mode' backend for `yasnippet'. - -This backend should be used with care, because as long as there are -snippets defined for the current major mode, this backend will always -shadow backends that come after it. Recommended usages: - -* In a buffer-local value of `company-backends', grouped with a backend or - several that provide actual text completions. - - (add-hook 'js-mode-hook - (lambda () - (set (make-local-variable 'company-backends) - '((company-dabbrev-code company-yasnippet))))) - -* After keyword `:with', grouped with other backends. - - (push '(company-semantic :with company-yasnippet) company-backends) - -* Not in `company-backends', just bound to a key. - - (global-set-key (kbd \"C-c y\") 'company-yasnippet) - -\(fn COMMAND &optional ARG &rest IGNORE)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-yasnippet" '("company-yasnippet-"))) - -;;;*** - -;;;### (autoloads nil nil ("company-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; company-autoloads.el ends here diff --git a/elpa/company-20200324.2145/company-bbdb.el b/elpa/company-20200324.2145/company-bbdb.el deleted file mode 100644 index a68c34ec..00000000 --- a/elpa/company-20200324.2145/company-bbdb.el +++ /dev/null @@ -1,63 +0,0 @@ -;;; company-bbdb.el --- company-mode completion backend for BBDB in message-mode - -;; Copyright (C) 2013-2014, 2016 Free Software Foundation, Inc. - -;; Author: Jan Tatarik - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -(require 'company) -(require 'cl-lib) - -(declare-function bbdb-record-get-field "bbdb") -(declare-function bbdb-records "bbdb") -(declare-function bbdb-dwim-mail "bbdb-com") -(declare-function bbdb-search "bbdb-com") - -(defgroup company-bbdb nil - "Completion backend for BBDB." - :group 'company) - -(defcustom company-bbdb-modes '(message-mode) - "Major modes in which `company-bbdb' may complete." - :type '(repeat (symbol :tag "Major mode")) - :package-version '(company . "0.8.8")) - -(defun company-bbdb--candidates (arg) - (cl-mapcan (lambda (record) - (mapcar (lambda (mail) (bbdb-dwim-mail record mail)) - (bbdb-record-get-field record 'mail))) - (eval '(bbdb-search (bbdb-records) arg nil arg)))) - -;;;###autoload -(defun company-bbdb (command &optional arg &rest ignore) - "`company-mode' completion backend for BBDB." - (interactive (list 'interactive)) - (cl-case command - (interactive (company-begin-backend 'company-bbdb)) - (prefix (and (memq major-mode company-bbdb-modes) - (featurep 'bbdb-com) - (let ((case-fold-search t)) - (looking-back - "^\\([^ :]*-\\)?\\(To\\|B?Cc\\|From\\):.*? *\\([^,;]*\\)" - (line-beginning-position))) - (match-string-no-properties 3))) - (candidates (company-bbdb--candidates arg)) - (sorted t) - (no-cache t))) - -(provide 'company-bbdb) -;;; company-bbdb.el ends here diff --git a/elpa/company-20200324.2145/company-bbdb.elc b/elpa/company-20200324.2145/company-bbdb.elc deleted file mode 100644 index a1f9ab584149b815a2608ef5392a8700d885e249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1758 zcmbtVTW{Mo6wcdP?+5H*4?9)1L<&N~lI+Bdfn`nB0RgtB^(}HSilS|JNJucZ-2f2=H%pLFq_Tj-qfwqvg$6Xp|>>`jyBRdWg5z^hIz+% zQhr5TYcj1@wfdWTu-$ObG2g9}qXo3k+DS*%w&ArBR2kvCRn5{}f@_^8URAQ9XDjLJ zVfOkH9hHHO#&{B@@f_f_U$7}&8usS*`-cY-D{i^)aPhJ;&zp*zA;B9eC27NtjO;>j zB)Qc}TJkFZv%I&96nxPa9Qe|2Fc`$;)=MT#B`GTM(Fl~jDzY>j0%iM4j>{M{0bPNv zLFo@YGN98Glz{+D0Zai*0ZgyYzACcObwrO=eq1Xnk>0xH&6b2_T9qW$&YPN5QfO`^ zTUxVj_ZU`|RY{G~6or1#GE|>REPuxV`s8c$7)3D z=sd2ab9^bgdqUA~{7>lXnJE6#N{JQyaVU9CHHX{1BQjX^+g4I+Wh=R-*lp|5XuR^} zp}HtZ=%$6w!PvgR4N^5%x|hjby!;e~ znuOx8>PgkGrSzQgdH>X_VoT}SLP=dgX<$$0BsW}B+{rnN1rpp}dI^^h;_AvB;+xZW zo(xWZ8c+T!LnzPrz677`h420^g&`)Sv<_2y7Pg6L;7l-hW+irnS~kYYKH^Ep&Q%w5 z{`CpYX!mr4S?KycaMAA}b2&SCSu{W5GSCkwP%f4 z)@z(XPnH*pBVMQ!ti1^~#)m?ajMvSg1lE{@z6F3FkCkXXU=4S26umEs`0+j6%r96` zB)7P|Gez;w-R-@=&o9>0c)l54+|osdyqwK(NFvgzk*o|JG(lTyoa**K&AnK$e$}(a zu-2MZTCXr7dDzPPc{z0VXpo$-9{&pv6 - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - - -;;; Commentary: -;; -;; The CAPF back-end provides a bridge to the standard -;; completion-at-point-functions facility, and thus can support any major mode -;; that defines a proper completion function, including emacs-lisp-mode, -;; css-mode and nxml-mode. - -;;; Code: - -(require 'company) -(require 'cl-lib) - -;; Amortizes several calls to a c-a-p-f from the same position. -(defvar company--capf-cache nil) - -;; FIXME: Provide a way to save this info once in Company itself -;; (https://github.com/company-mode/company-mode/pull/845). -(defvar-local company-capf--current-completion-data nil - "Value last returned by `company-capf' when called with `candidates'. -For most properties/actions, this is just what we need: the exact values -that accompanied the completion table that's currently is use. - -`company-capf', however, could be called at some different positions during -a completion session (most importantly, by `company-sort-by-occurrence'), -so we can't just use the preceding variable instead.") - -(defun company--capf-data () - (let ((cache company--capf-cache)) - (if (and (equal (current-buffer) (car cache)) - (equal (point) (car (setq cache (cdr cache)))) - (equal (buffer-chars-modified-tick) (car (setq cache (cdr cache))))) - (cadr cache) - (let ((data (company--capf-data-real))) - (setq company--capf-cache - (list (current-buffer) (point) (buffer-chars-modified-tick) data)) - data)))) - -(defun company--capf-data-real () - (cl-letf* (((default-value 'completion-at-point-functions) - ;; Ignore tags-completion-at-point-function because it subverts - ;; company-etags in the default value of company-backends, where - ;; the latter comes later. - (remove 'tags-completion-at-point-function - (default-value 'completion-at-point-functions))) - (completion-at-point-functions (company--capf-workaround)) - (data (run-hook-wrapped 'completion-at-point-functions - ;; Ignore misbehaving functions. - #'completion--capf-wrapper 'optimist))) - (when (and (consp (cdr data)) (integer-or-marker-p (nth 1 data))) data))) - -(declare-function python-shell-get-process "python") - -(defun company--capf-workaround () - ;; For http://debbugs.gnu.org/cgi/bugreport.cgi?bug=18067 - (if (or (not (listp completion-at-point-functions)) - (not (memq 'python-completion-complete-at-point completion-at-point-functions)) - (python-shell-get-process)) - completion-at-point-functions - (remq 'python-completion-complete-at-point completion-at-point-functions))) - -(defun company-capf--save-current-data (data) - (setq company-capf--current-completion-data data) - (add-hook 'company-after-completion-hook - #'company-capf--clear-current-data nil t)) - -(defun company-capf--clear-current-data (_ignored) - (setq company-capf--current-completion-data nil)) - -(defvar-local company-capf--sorted nil) - -(defun company-capf (command &optional arg &rest _args) - "`company-mode' backend using `completion-at-point-functions'." - (interactive (list 'interactive)) - (pcase command - (`interactive (company-begin-backend 'company-capf)) - (`prefix - (let ((res (company--capf-data))) - (when res - (let ((length (plist-get (nthcdr 4 res) :company-prefix-length)) - (prefix (buffer-substring-no-properties (nth 1 res) (point)))) - (cond - ((> (nth 2 res) (point)) 'stop) - (length (cons prefix length)) - (t prefix)))))) - (`candidates - (company-capf--candidates arg)) - (`sorted - company-capf--sorted) - (`match - ;; Ask the for the `:company-match' function. If that doesn't help, - ;; fallback to sniffing for face changes to get a suitable value. - (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) - :company-match))) - (if f (funcall f arg) - (let* ((match-start nil) (pos -1) - (prop-value nil) (faces nil) - (has-face-p nil) chunks - (limit (length arg))) - (while (< pos limit) - (setq pos - (if (< pos 0) 0 (next-property-change pos arg limit))) - (setq prop-value (or - (get-text-property pos 'face arg) - (get-text-property pos 'font-lock-face arg)) - faces (if (listp prop-value) prop-value (list prop-value)) - has-face-p (memq 'completions-common-part faces)) - (cond ((and (not match-start) has-face-p) - (setq match-start pos)) - ((and match-start (not has-face-p)) - (push (cons match-start pos) chunks) - (setq match-start nil)))) - (nreverse chunks))))) - (`duplicates t) - (`no-cache t) ;Not much can be done here, as long as we handle - ;non-prefix matches. - (`meta - (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) - :company-docsig))) - (when f (funcall f arg)))) - (`doc-buffer - (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) - :company-doc-buffer))) - (when f (funcall f arg)))) - (`location - (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) - :company-location))) - (when f (funcall f arg)))) - (`annotation - (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) - :annotation-function))) - (when f (funcall f arg)))) - (`require-match - (plist-get (nthcdr 4 (company--capf-data)) :company-require-match)) - (`init nil) ;Don't bother: plenty of other ways to initialize the code. - (`post-completion - (company--capf-post-completion arg)) - )) - -(defun company-capf--candidates (input) - (let ((res (company--capf-data))) - (company-capf--save-current-data res) - (when res - (let* ((table (nth 3 res)) - (pred (plist-get (nthcdr 4 res) :predicate)) - (meta (completion-metadata - (buffer-substring (nth 1 res) (nth 2 res)) - table pred)) - (candidates (completion-all-completions input table pred - (length input) - meta)) - (sortfun (cdr (assq 'display-sort-function meta))) - (last (last candidates)) - (base-size (and (numberp (cdr last)) (cdr last)))) - (when base-size - (setcdr last nil)) - (setq company-capf--sorted (functionp sortfun)) - (when sortfun - (setq candidates (funcall sortfun candidates))) - (if (not (zerop (or base-size 0))) - (let ((before (substring input 0 base-size))) - (mapcar (lambda (candidate) - (concat before candidate)) - candidates)) - candidates))))) - -(defun company--capf-post-completion (arg) - (let* ((res company-capf--current-completion-data) - (exit-function (plist-get (nthcdr 4 res) :exit-function)) - (table (nth 3 res))) - (if exit-function - ;; We can more or less know when the user is done with completion, - ;; so we do something different than `completion--done'. - (funcall exit-function arg - ;; FIXME: Should probably use an additional heuristic: - ;; completion-at-point doesn't know when the user picked a - ;; particular candidate explicitly (it only checks whether - ;; further completions exist). Whereas company user can press - ;; RET (or use implicit completion with company-tng). - (if (= (car (completion-boundaries arg table nil "")) - (length arg)) - 'sole - 'finished))))) - -(provide 'company-capf) - -;;; company-capf.el ends here diff --git a/elpa/company-20200324.2145/company-capf.elc b/elpa/company-20200324.2145/company-capf.elc deleted file mode 100644 index 7c8d51628a6945602a77cb34ca57a419ca829f5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4943 zcmbtYZByIW6}B;WsXNnV`lb7=7f6=SK~%buWfHbKcnQg5+D)>X?Dhj@hHL2>tH_cf z$q?G|~Zfw(k3RdCqgr_0j1+PyXC$wR%TKN8%)%Wl^j{ZbXSVovEM@ z*E%nvG!fE2aCzh=DyKrlu}HHrnnnLnC5DTG9uK~oMunJQ7cnn%A;Q~4&7werX;74T zlw2137|n}Ps4&!_Se)WKIgn58?GdKfBS}jUq)DkTd0tMeL-Zup@a@UVmm-*|Tm>aW z+~?y}5{e=ffl9@r#P*u#$p1a$U~z1RfdRii>JTUbQQ3raFN|V<1DY?=N89FbY+v zi`|3X^E4N;6kB9@n(4fZbn!R1gfOuW0|O5D|MwgdZl($!kU;D3DTcJrA23r~lNd!0 z&HyX|b9jWqXa==nO}mLwjR7l~wOfc_p65C#<6GJtP=gCs#oiaw^hU$u``BY1LosY- zl)y1XI@2PICKFA&h%7B4mRN*yLTOJm4+fAq0v@xP(JV{zQqkG_E7mH|ZH;fOG%&&i zdUtQX2Q)%uSZud6R)DaqS(fWShd2!S=Mn1`B}J)Kc<`5d4rKpXmC^u5Z4?V$P~=ka zc;}%w5PiqqgZpRdN?Y}|)_6{OT5$^f#ctEN0EV&S-7O7-R2->dxx%1`Puw}P#r9^_ zJ|0O|0*~&a)0}jvbppWC%@x<5Yq*aJyo-o)URfkWZXP>Mf?e_4PBAi;4 zIop42SiuB?rAjMHqolMZ^TY%jLU@*516%5{Xu9*>OaXFG^SA^+DEt{KOU{8`AzrPx zO`;RqT!VoF1kSY%N(B5_p-ZdUrx7Y25$jyI;_l?7Yi`o~O6BPsw4KirYnrB4)=jRm z4B_8ExpBK0$g8{qLV^DJ639+-Yo_umyk+O&@N+J1oM#~XE!1-#5d56Y?-uV;(CeRC zo1{F($c@fsZHu#pWcRFFi0rnUB0)7KRj+zso_bC()p2ZH!j>S<05n5Rd=HaBhn-`` z6-Wn@L_8b58}1oWxD%3w7YcQaj8R2$6`!&{fG2^V2Mu?U9*kSylXD13M&9^5zaUq$ zYZh^(CP=wW4asqf(Q308S$0(_;;9lrSdo?Uq%Zf3rhcXA%NMU+|8)B7bIJzy_uV-& z+7fPA<1bMTLJ>v{e@f@jCz0+Z(8|tWcmR{s!1F~sOUXfp>{SrmMQwM`mfjU(6~{Z%noM?UAbu>U`EG4^e8J4;b`CFop*;^U)$#Bq zpR|a@-9zTHweL+=#ce*d@C>no z(ErBzIuYn2yn}|M>kskfQjDOg1?Lg{^g+I+$!ECVAt7*X@Q8q^67F}l9x&n;!4^78C!W-tGh`ZYp?N%c$8QU+Fx?J*X?eh*=Ko)()~vu&TZPWjSb}c z7F1d?. - - -;;; Commentary: -;; - -;;; Code: - -(require 'company) -(require 'company-template) -(require 'cl-lib) - -(defgroup company-clang nil - "Completion backend for Clang." - :group 'company) - -(defcustom company-clang-executable - (executable-find "clang") - "Location of clang executable." - :type 'file) - -(defcustom company-clang-begin-after-member-access t - "When non-nil, automatic completion will start whenever the current -symbol is preceded by \".\", \"->\" or \"::\", ignoring -`company-minimum-prefix-length'. - -If `company-begin-commands' is a list, it should include `c-electric-lt-gt' -and `c-electric-colon', for automatic completion right after \">\" and -\":\"." - :type 'boolean) - -(defcustom company-clang-use-compile-flags-txt nil - "When non-nil, use flags from compile_flags.txt if present. - -The lines from that files will be appended to `company-clang-arguments'. - -And if such file is found, Clang is called from the directory containing -it. That allows the flags use relative file names within the project." - :type 'boolean - :safe 'booleanp) - -(defcustom company-clang-arguments nil - "Additional arguments to pass to clang when completing. -Prefix files (-include ...) can be selected with `company-clang-set-prefix' -or automatically through a custom `company-clang-prefix-guesser'." - :type '(repeat (string :tag "Argument"))) - -(defcustom company-clang-prefix-guesser 'company-clang-guess-prefix - "A function to determine the prefix file for the current buffer." - :type '(function :tag "Guesser function" nil)) - -(defvar company-clang-modes '(c-mode c++-mode objc-mode) - "Major modes which clang may complete.") - -(defcustom company-clang-insert-arguments t - "When non-nil, insert function arguments as a template after completion." - :type 'boolean - :package-version '(company . "0.8.0")) - -;; prefix ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defvar company-clang--prefix nil) - -(defsubst company-clang--guess-pch-file (file) - (let ((dir (directory-file-name (file-name-directory file)))) - (when (equal (file-name-nondirectory dir) "Classes") - (setq dir (file-name-directory dir))) - (car (directory-files dir t "\\([^.]h\\|[^h]\\).pch\\'" t)))) - -(defsubst company-clang--file-substring (file beg end) - (with-temp-buffer - (insert-file-contents-literally file nil beg end) - (buffer-string))) - -(defun company-clang-guess-prefix () - "Try to guess the prefix file for the current buffer." - ;; Prefixes seem to be called .pch. Pre-compiled headers do, too. - ;; So we look at the magic number to rule them out. - (let* ((file (company-clang--guess-pch-file buffer-file-name)) - (magic-number (and file (company-clang--file-substring file 0 4)))) - (unless (member magic-number '("CPCH" "gpch")) - file))) - -(defun company-clang-set-prefix (&optional prefix) - "Use PREFIX as a prefix (-include ...) file for clang completion." - (interactive (let ((def (funcall company-clang-prefix-guesser))) - (unless (stringp def) - (setq def default-directory)) - (list (read-file-name "Prefix file: " - (when def (file-name-directory def)) - def t (when def (file-name-nondirectory def)))))) - ;; TODO: pre-compile? - (setq company-clang--prefix (and (stringp prefix) - (file-regular-p prefix) - prefix))) - -;; Clean-up on exit. -(add-hook 'kill-emacs-hook 'company-clang-set-prefix) - -;; parsing ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; TODO: Handle Pattern (syntactic hints would be neat). -;; Do we ever see OVERLOAD (or OVERRIDE)? -(defconst company-clang--completion-pattern - "^COMPLETION: \\_<\\(%s[a-zA-Z0-9_:]*\\)\\(?:\\(?: (InBase)\\)? : \\(.*\\)$\\)?$") - -(defconst company-clang--error-buffer-name "*clang-error*") - -(defun company-clang--lang-option () - (if (eq major-mode 'objc-mode) - (if (string= "m" (file-name-extension buffer-file-name)) - "objective-c" "objective-c++") - (substring (symbol-name major-mode) 0 -5))) - -(defun company-clang--parse-output (prefix _objc) - (goto-char (point-min)) - (let ((pattern (format company-clang--completion-pattern - (regexp-quote prefix))) - (case-fold-search nil) - lines match) - (while (re-search-forward pattern nil t) - (setq match (match-string-no-properties 1)) - (unless (equal match "Pattern") - (save-match-data - (when (string-match ":" match) - (setq match (substring match 0 (match-beginning 0))))) - (let ((meta (match-string-no-properties 2))) - (when (and meta (not (string= match meta))) - (put-text-property 0 1 'meta - (company-clang--strip-formatting meta) - match))) - (push match lines))) - lines)) - -(defun company-clang--meta (candidate) - (get-text-property 0 'meta candidate)) - -(defun company-clang--annotation (candidate) - (let ((ann (company-clang--annotation-1 candidate))) - (if (not (and ann (string-prefix-p "(*)" ann))) - ann - (with-temp-buffer - (insert ann) - (search-backward ")") - (let ((pt (1+ (point)))) - (re-search-forward ".\\_>" nil t) - (delete-region pt (point))) - (buffer-string))))) - -(defun company-clang--annotation-1 (candidate) - (let ((meta (company-clang--meta candidate))) - (cond - ((null meta) nil) - ((string-match "[^:]:[^:]" meta) - (substring meta (1+ (match-beginning 0)))) - ((string-match "(anonymous)" meta) nil) - ((string-match "\\((.*)[ a-z]*\\'\\)" meta) - (let ((paren (match-beginning 1))) - (if (not (eq (aref meta (1- paren)) ?>)) - (match-string 1 meta) - (with-temp-buffer - (insert meta) - (goto-char paren) - (substring meta (1- (search-backward "<")))))))))) - -(defun company-clang--strip-formatting (text) - (replace-regexp-in-string - "#]" " " - (replace-regexp-in-string "[<{[]#\\|#[>}]" "" text t) - t)) - -(defun company-clang--handle-error (res args) - (goto-char (point-min)) - (let* ((buf (get-buffer-create company-clang--error-buffer-name)) - (cmd (concat company-clang-executable " " (mapconcat 'identity args " "))) - (pattern (format company-clang--completion-pattern "")) - (message-truncate-lines t) - (err (if (re-search-forward pattern nil t) - (buffer-substring-no-properties (point-min) - (1- (match-beginning 0))) - ;; Warn the user more aggressively if no match was found. - (message "clang failed with error %d: %s" res cmd) - (buffer-string)))) - - (with-current-buffer buf - (let ((inhibit-read-only t)) - (erase-buffer) - (insert (current-time-string) - (format "\nclang failed with error %d:\n" res) - cmd "\n\n") - (insert err) - (setq buffer-read-only t) - (goto-char (point-min)))))) - -(defun company-clang--start-process (prefix callback &rest args) - (let* ((objc (derived-mode-p 'objc-mode)) - (buf (get-buffer-create "*clang-output*")) - ;; Looks unnecessary in Emacs 25.1 and later. - (process-adaptive-read-buffering nil) - (existing-process (get-buffer-process buf))) - (when existing-process - (kill-process existing-process)) - (with-current-buffer buf - (erase-buffer) - (setq buffer-undo-list t)) - (let* ((process-connection-type nil) - (process (apply #'start-file-process "company-clang" buf - company-clang-executable args))) - (set-process-sentinel - process - (lambda (proc status) - (unless (string-match-p "hangup\\|killed" status) - (funcall - callback - (let ((res (process-exit-status proc))) - (with-current-buffer buf - (unless (eq 0 res) - (company-clang--handle-error res args)) - ;; Still try to get any useful input. - (company-clang--parse-output prefix objc))))))) - (unless (company-clang--auto-save-p) - (send-region process (point-min) (point-max)) - (send-string process "\n") - (process-send-eof process))))) - -(defsubst company-clang--build-location (pos) - (save-excursion - (goto-char pos) - (format "%s:%d:%d" - (if (company-clang--auto-save-p) buffer-file-name "-") - (line-number-at-pos) - (1+ (length - (encode-coding-region - (line-beginning-position) - (point) - 'utf-8 - t)))))) - -(defsubst company-clang--build-complete-args (pos) - (append '("-fsyntax-only" "-Xclang" "-code-completion-macros") - (unless (company-clang--auto-save-p) - (list "-x" (company-clang--lang-option))) - (company-clang--arguments) - (when (stringp company-clang--prefix) - (list "-include" (expand-file-name company-clang--prefix))) - (list "-Xclang" (format "-code-completion-at=%s" - (company-clang--build-location pos))) - (list (if (company-clang--auto-save-p) buffer-file-name "-")))) - -(defun company-clang--arguments () - (let ((fname "compile_flags.txt") - (args company-clang-arguments) - current-dir-rel) - (when company-clang-use-compile-flags-txt - (let ((dir (locate-dominating-file default-directory fname))) - (when dir - (setq current-dir-rel (file-relative-name default-directory dir)) - (setq default-directory dir) - (with-temp-buffer - (insert-file-contents fname) - (setq args - (append - args - (split-string (buffer-substring-no-properties - (point-min) (point-max)) - "[\n\r]+" - t - "[ \t]+")))) - (unless (equal current-dir-rel "./") - (push (format "-I%s" current-dir-rel) args))))) - args)) - -(defun company-clang--candidates (prefix callback) - (and (company-clang--auto-save-p) - (buffer-modified-p) - (basic-save-buffer)) - (when (null company-clang--prefix) - (company-clang-set-prefix (or (funcall company-clang-prefix-guesser) - 'none))) - (let ((default-directory default-directory)) - (apply 'company-clang--start-process - prefix - callback - (company-clang--build-complete-args - (if (company-clang--check-version 4.0 9.0) - (point) - (- (point) (length prefix))))))) - -(defun company-clang--prefix () - (if company-clang-begin-after-member-access - (company-grab-symbol-cons "\\.\\|->\\|::" 2) - (company-grab-symbol))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defconst company-clang-required-version 1.1) - -(defvar company-clang--version nil) - -(defun company-clang--auto-save-p () - (not - (company-clang--check-version 2.9 3.1))) - -(defun company-clang--check-version (min apple-min) - (pcase company-clang--version - (`(apple . ,ver) (>= ver apple-min)) - (`(normal . ,ver) (>= ver min)) - (_ (error "pcase-exhaustive is not in Emacs 24.3!")))) - -(defsubst company-clang-version () - "Return the version of `company-clang-executable'." - (with-temp-buffer - (call-process company-clang-executable nil t nil "--version") - (goto-char (point-min)) - (if (re-search-forward - "\\(clang\\|Apple LLVM\\|bcc32x\\|bcc64\\) version \\([0-9.]+\\)" nil t) - (cons - (if (equal (match-string-no-properties 1) "Apple LLVM") - 'apple - 'normal) - (string-to-number (match-string-no-properties 2))) - 0))) - -(defun company-clang (command &optional arg &rest ignored) - "`company-mode' completion backend for Clang. -Clang is a parser for C and ObjC. Clang version 1.1 or newer is required. - -Additional command line arguments can be specified in -`company-clang-arguments'. Prefix files (-include ...) can be selected -with `company-clang-set-prefix' or automatically through a custom -`company-clang-prefix-guesser'. - -With Clang versions before 2.9, we have to save the buffer before -performing completion. With Clang 2.9 and later, buffer contents are -passed via standard input." - (interactive (list 'interactive)) - (cl-case command - (interactive (company-begin-backend 'company-clang)) - (init (when (memq major-mode company-clang-modes) - (unless company-clang-executable - (error "Company found no clang executable")) - (setq company-clang--version (company-clang-version)) - (unless (company-clang--check-version - company-clang-required-version - company-clang-required-version) - (error "Company requires clang version %s" - company-clang-required-version)))) - (prefix (and (memq major-mode company-clang-modes) - buffer-file-name - company-clang-executable - (not (company-in-string-or-comment)) - (or (company-clang--prefix) 'stop))) - (candidates (cons :async - (lambda (cb) (company-clang--candidates arg cb)))) - (meta (company-clang--meta arg)) - (annotation (company-clang--annotation arg)) - (post-completion (let ((anno (company-clang--annotation arg))) - (when (and company-clang-insert-arguments anno) - (insert anno) - (if (string-match "\\`:[^:]" anno) - (company-template-objc-templatify anno) - (company-template-c-like-templatify - (concat arg anno)))))))) - -(provide 'company-clang) -;;; company-clang.el ends here diff --git a/elpa/company-20200324.2145/company-clang.elc b/elpa/company-20200324.2145/company-clang.elc deleted file mode 100644 index 4407fdc08dd728018b08059d606071b58682de7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14858 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 -;; Version: 0.2 - -;; 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 . - -;;; Commentary: -;; -;; company-cmake offers completions for module names, variable names and -;; commands used by CMake. And their descriptions. - -;;; Code: - -(require 'company) -(require 'cl-lib) - -(defgroup company-cmake nil - "Completion backend for CMake." - :group 'company) - -(defcustom company-cmake-executable - (executable-find "cmake") - "Location of cmake executable." - :type 'file) - -(defvar company-cmake-executable-arguments - '("--help-command-list" - "--help-module-list" - "--help-variable-list") - "The arguments we pass to cmake, separately. -They affect which types of symbols we get completion candidates for.") - -(defvar company-cmake--completion-pattern - "^\\(%s[a-zA-Z0-9_<>]%s\\)$" - "Regexp to match the candidates.") - -(defvar company-cmake-modes '(cmake-mode) - "Major modes in which cmake may complete.") - -(defvar company-cmake--candidates-cache nil - "Cache for the raw candidates.") - -(defvar company-cmake--meta-command-cache nil - "Cache for command arguments to retrieve descriptions for the candidates.") - -(defun company-cmake--replace-tags (rlt) - (setq rlt (replace-regexp-in-string - "\\(.*?\\(IS_GNU\\)?\\)\\(.*\\)" - (lambda (_match) - (mapconcat 'identity - (if (match-beginning 2) - '("\\1CXX\\3" "\\1C\\3" "\\1G77\\3") - '("\\1CXX\\3" "\\1C\\3" "\\1Fortran\\3")) - "\n")) - rlt t)) - (setq rlt (replace-regexp-in-string - "\\(.*\\)\\(.*\\)" - (mapconcat 'identity '("\\1DEBUG\\2" "\\1RELEASE\\2" - "\\1RELWITHDEBINFO\\2" "\\1MINSIZEREL\\2") - "\n") - rlt)) - rlt) - -(defun company-cmake--fill-candidates-cache (arg) - "Fill candidates cache if needed." - (let (rlt) - (unless company-cmake--candidates-cache - (setq company-cmake--candidates-cache (make-hash-table :test 'equal))) - - ;; If hash is empty, fill it. - (unless (gethash arg company-cmake--candidates-cache) - (with-temp-buffer - (let ((res (call-process company-cmake-executable nil t nil arg))) - (unless (zerop res) - (message "cmake executable exited with error=%d" res))) - (setq rlt (buffer-string))) - (setq rlt (company-cmake--replace-tags rlt)) - (puthash arg rlt company-cmake--candidates-cache)) - )) - -(defun company-cmake--parse (prefix content cmd) - (let ((start 0) - (pattern (format company-cmake--completion-pattern - (regexp-quote prefix) - (if (zerop (length prefix)) "+" "*"))) - (lines (split-string content "\n")) - match - rlt) - (dolist (line lines) - (when (string-match pattern line) - (let ((match (match-string 1 line))) - (when match - (puthash match cmd company-cmake--meta-command-cache) - (push match rlt))))) - rlt)) - -(defun company-cmake--candidates (prefix) - (let (results - cmd-opts - str) - - (unless company-cmake--meta-command-cache - (setq company-cmake--meta-command-cache (make-hash-table :test 'equal))) - - (dolist (arg company-cmake-executable-arguments) - (company-cmake--fill-candidates-cache arg) - (setq cmd-opts (replace-regexp-in-string "-list$" "" arg) ) - - (setq str (gethash arg company-cmake--candidates-cache)) - (when str - (setq results (nconc results - (company-cmake--parse prefix str cmd-opts))))) - results)) - -(defun company-cmake--unexpand-candidate (candidate) - (cond - ((string-match "^CMAKE_\\(C\\|CXX\\|Fortran\\)\\(_.*\\)$" candidate) - (setq candidate (concat "CMAKE_" (match-string 2 candidate)))) - - ;; C flags - ((string-match "^\\(.*_\\)IS_GNU\\(C\\|CXX\\|G77\\)$" candidate) - (setq candidate (concat (match-string 1 candidate) "IS_GNU"))) - - ;; C flags - ((string-match "^\\(.*_\\)OVERRIDE_\\(C\\|CXX\\|Fortran\\)$" candidate) - (setq candidate (concat (match-string 1 candidate) "OVERRIDE_"))) - - ((string-match "^\\(.*\\)\\(_DEBUG\\|_RELEASE\\|_RELWITHDEBINFO\\|_MINSIZEREL\\)\\(.*\\)$" candidate) - (setq candidate (concat (match-string 1 candidate) - "_" - (match-string 3 candidate))))) - candidate) - -(defun company-cmake--meta (candidate) - (let ((cmd-opts (gethash candidate company-cmake--meta-command-cache)) - result) - (setq candidate (company-cmake--unexpand-candidate candidate)) - - ;; Don't cache the documentation of every candidate (command) - ;; Cache in this case will cost too much memory. - (with-temp-buffer - (call-process company-cmake-executable nil t nil cmd-opts candidate) - ;; Go to the third line, trim it and return the result. - ;; Tested with cmake 2.8.9. - (goto-char (point-min)) - (forward-line 2) - (setq result (buffer-substring-no-properties (line-beginning-position) - (line-end-position))) - (setq result (replace-regexp-in-string "^[ \t\n\r]+" "" result)) - result))) - -(defun company-cmake--doc-buffer (candidate) - (let ((cmd-opts (gethash candidate company-cmake--meta-command-cache))) - - (setq candidate (company-cmake--unexpand-candidate candidate)) - (with-temp-buffer - (call-process company-cmake-executable nil t nil cmd-opts candidate) - ;; Go to the third line, trim it and return the doc buffer. - ;; Tested with cmake 2.8.9. - (goto-char (point-min)) - (forward-line 2) - (company-doc-buffer - (buffer-substring-no-properties (line-beginning-position) - (point-max)))))) - -(defun company-cmake-prefix-dollar-brace-p () - "Test if the current symbol follows ${." - (save-excursion - (skip-syntax-backward "w_") - (and (eq (char-before (point)) ?\{) - (eq (char-before (1- (point))) ?$)))) - -(defun company-cmake (command &optional arg &rest ignored) - "`company-mode' completion backend for CMake. -CMake is a cross-platform, open-source make system." - (interactive (list 'interactive)) - (cl-case command - (interactive (company-begin-backend 'company-cmake)) - (init (when (memq major-mode company-cmake-modes) - (unless company-cmake-executable - (error "Company found no cmake executable")))) - (prefix (and (memq major-mode company-cmake-modes) - (or (not (company-in-string-or-comment)) - (company-cmake-prefix-dollar-brace-p)) - (company-grab-symbol))) - (candidates (company-cmake--candidates arg)) - (meta (company-cmake--meta arg)) - (doc-buffer (company-cmake--doc-buffer arg)) - )) - -(provide 'company-cmake) -;;; company-cmake.el ends here diff --git a/elpa/company-20200324.2145/company-cmake.elc b/elpa/company-20200324.2145/company-cmake.elc deleted file mode 100644 index 2c0c6dde4ace213960e24650c80ebbd8280820ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6062 zcmc&&X>-&_675eLKEhsO&gI&)n!|07Lq{KY7#NJlFpdQ?!!b(?GDfYgwza4wA*nH* z<;U;KDoNdz-CiapV%HIBm#RuxN50H_nfEuJZCtF?YBTrm-=~de5c`4X$rnGQ&4KHs z^jRdSABAMKS8X|R;Ai{f1_4EJ<`4Ye-3-I&>WmzGz3->ghZGv7BBkD8=nj03dXblA zi68EzcQKlz8M(cl=ux?fxwdMp9h1?EAR~-2@}e+vF?pEv^?T?E_4QX9TU+GqyNT;% z*y3Heyc_l?jmUFD>Iw=X_sAmoQBo3a68IvaY#$RXTdj*L_)~wpfj|2Vo`T=Q-lR&W6sq1RDZXe1R3mtEglby+_0zc)4Z{eca1p( zP2~hBGOdiG+>rhr067kn1e3uKa-CtyjBGx8FePcxin9Y<>IbLpg>w zjkmEYfu?rC&PnaYvYJ@No~`k|(6XF9H>I<}E~F0{xG|hM%$ocjEY!~q$)aVfY;L@L z>o_)Sf!k&4X{W<&;9~NeCsC3mZm8yIPN?lrbBD70JbZ$U7u!#^#?NrVHsk_7Za#kV z)Nw4ejhCCxHrHQmj=%qN>-A5Vw6*=@McMs)Yx~vKZ=0CSU3@FNh0cyN&n7+b5j00o zL6h<9_bC(taVoctll6~~8UVkA$H}1#4Zx?U>u+D0#??0Er6UyN5kNbGrsagwj`jnF zTMwZK6%dxLB(tCLXwkxdgb+M^=!sh#OxjM!;l#Y=*p~5zg&X+Vf{ra~&e8bW2HG|) z+`+%*)DpmFwVZHjy57jO4478j;qgP@1XMR4)W6HbAlAD>xZ%k@6rcqofCaM?*Z19Y zA11+J1z&?zAh5Xs!BO)F{)d8HydH{!La;_Fyv_>4S4J}&)SN<0HCodQQcJcuO4iLf zsom%xF@ip_3RK4qSvyc4-s2?l1jiLJXn=;hhp=4@Q6#?j8Q6|wP9jO7*aXCVLNadrZK%V{glBaK|f41296 zLC~3Bgn2twv$;6GpfttunwM%TPIxC*6>g1>tRq24*5bpFixur|4y=e6^Bj>bJ4f?@P*$i~r$rkPK)EAy<%JP-|O)^de0 zdECTfwlMz7!c-20a_4l!l(hF7&)5I4xeGFZ5dT$%{I6yBZlHU2bp-*N^`K@d@}Vh< zE{xDpJau&if*J)^8IveU0}C-pQ^SQA$#2znFMi#8`Eu*WiJRd)lyfTIV_Dv7&KADz zmPA1|k8p&qyW{kLKPykTTksN%>>X;I3J|uN6Clx^LWF1KUcSP*m9bbQfJ;{sr(Xnm zurV3vn{eIIK`>A3%ue0<3kD3)36}FejsI2|&xhR{>tV$FAQnmHBmQt?(7R&K4?`3} z^f*d=nM2EdB+;Xu$N(od-D4i0qOcQyQ3j1aj);oz|1TOCo*D9)VpC(9 z$Qfn&$3RkK5lw?$GtWiRAd~xHk}#=LMGEknAczi9y7BMRatRfPn4zG|qjyn16M77n zqS&y-C8M#b(+8*#i9qecD^3lp2Y78=!5ep9%zNzz1>a9U`mvrKqFDDu=i1PLo1l(! zunP~2Ji%^*IOhzuWi)MOu=Pi4_vk}$QJnhUme)41z%(Q4OoTF{OI{MCsg5i*V`_I7 z6-j|4HX0_LkO=}VCI#C+IHf@X)C z#Y&c;zI=iarqSb4;iaY2UwF)}jHwl+L?mnKJ4LU#4uxw&DMyxIO7xDZGF28g;%M^9 z#HRq|AJmUflJ!w5DYPn`p2P#!3X5KqCHbL`w2gBjRaoSDWIq~WUYM8akUbSOLXAp} zuc{+u%|gefA()GOM;Cwx=KQA$_hJ)!iQ5HWxyE-SHJ?Q0kmMo$7GJBIks*#t+=aKT k439>3$S&Y-wOXiUaFRf`$L>rfbqE@tQ5C5aff_Ua0a1ZMI{*Lx diff --git a/elpa/company-20200324.2145/company-css.el b/elpa/company-20200324.2145/company-css.el deleted file mode 100644 index d3ece74d..00000000 --- a/elpa/company-20200324.2145/company-css.el +++ /dev/null @@ -1,446 +0,0 @@ -;;; company-css.el --- company-mode completion backend for css-mode -*- lexical-binding: t -*- - -;; Copyright (C) 2009, 2011, 2014, 2018 Free Software Foundation, Inc. - -;; Author: Nikolaj Schumacher - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: -;; -;; In Emacs >= 26, company-capf is used instead. - -;;; Code: - -(require 'company) -(require 'cl-lib) - -(declare-function web-mode-language-at-pos "web-mode" (&optional pos)) - -(defconst company-css-property-alist - ;; see http://www.w3.org/TR/CSS21/propidx.html - '(("azimuth" angle "left-side" "far-left" "left" "center-left" "center" - "center-right" "right" "far-right" "right-side" "behind" "leftwards" - "rightwards") - ("background" background-color background-image background-repeat - background-attachment background-position - background-clip background-origin background-size) - ("background-attachment" "scroll" "fixed") - ("background-color" color "transparent") - ("background-image" uri "none") - ("background-position" percentage length "left" "center" "right" percentage - length "top" "center" "bottom" "left" "center" "right" "top" "center" - "bottom") - ("background-repeat" "repeat" "repeat-x" "repeat-y" "no-repeat") - ("border" border-width border-style border-color) - ("border-bottom" border) - ("border-bottom-color" border-color) - ("border-bottom-style" border-style) - ("border-bottom-width" border-width) - ("border-collapse" "collapse" "separate") - ("border-color" color "transparent") - ("border-left" border) - ("border-left-color" border-color) - ("border-left-style" border-style) - ("border-left-width" border-width) - ("border-right" border) - ("border-right-color" border-color) - ("border-right-style" border-style) - ("border-right-width" border-width) - ("border-spacing" length length) - ("border-style" border-style) - ("border-top" border) - ("border-top-color" border-color) - ("border-top-style" border-style) - ("border-top-width" border-width) - ("border-width" border-width) - ("bottom" length percentage "auto") - ("caption-side" "top" "bottom") - ("clear" "none" "left" "right" "both") - ("clip" shape "auto") - ("color" color) - ("content" "normal" "none" string uri counter "attr()" "open-quote" - "close-quote" "no-open-quote" "no-close-quote") - ("counter-increment" identifier integer "none") - ("counter-reset" identifier integer "none") - ("cue" cue-before cue-after) - ("cue-after" uri "none") - ("cue-before" uri "none") - ("cursor" uri "*" "auto" "crosshair" "default" "pointer" "move" "e-resize" - "ne-resize" "nw-resize" "n-resize" "se-resize" "sw-resize" "s-resize" - "w-resize" "text" "wait" "help" "progress") - ("direction" "ltr" "rtl") - ("display" "inline" "block" "list-item" "run-in" "inline-block" "table" - "inline-table" "table-row-group" "table-header-group" "table-footer-group" - "table-row" "table-column-group" "table-column" "table-cell" - "table-caption" "none") - ("elevation" angle "below" "level" "above" "higher" "lower") - ("empty-cells" "show" "hide") - ("float" "left" "right" "none") - ("font" font-style font-weight font-size "/" line-height - font-family "caption" "icon" "menu" "message-box" "small-caption" - "status-bar" "normal" "small-caps" - ;; CSS3 - font-stretch) - ("font-family" family-name generic-family) - ("font-size" absolute-size relative-size length percentage) - ("font-style" "normal" "italic" "oblique") - ("font-weight" "normal" "bold" "bolder" "lighter" "100" "200" "300" "400" - "500" "600" "700" "800" "900") - ("height" length percentage "auto") - ("left" length percentage "auto") - ("letter-spacing" "normal" length) - ("line-height" "normal" number length percentage) - ("list-style" list-style-type list-style-position list-style-image) - ("list-style-image" uri "none") - ("list-style-position" "inside" "outside") - ("list-style-type" "disc" "circle" "square" "decimal" "decimal-leading-zero" - "lower-roman" "upper-roman" "lower-greek" "lower-latin" "upper-latin" - "armenian" "georgian" "lower-alpha" "upper-alpha" "none") - ("margin" margin-width) - ("margin-bottom" margin-width) - ("margin-left" margin-width) - ("margin-right" margin-width) - ("margin-top" margin-width) - ("max-height" length percentage "none") - ("max-width" length percentage "none") - ("min-height" length percentage) - ("min-width" length percentage) - ("orphans" integer) - ("outline" outline-color outline-style outline-width) - ("outline-color" color "invert") - ("outline-style" border-style) - ("outline-width" border-width) - ("overflow" "visible" "hidden" "scroll" "auto" - ;; CSS3: - "no-display" "no-content") - ("padding" padding-width) - ("padding-bottom" padding-width) - ("padding-left" padding-width) - ("padding-right" padding-width) - ("padding-top" padding-width) - ("page-break-after" "auto" "always" "avoid" "left" "right") - ("page-break-before" "auto" "always" "avoid" "left" "right") - ("page-break-inside" "avoid" "auto") - ("pause" time percentage) - ("pause-after" time percentage) - ("pause-before" time percentage) - ("pitch" frequency "x-low" "low" "medium" "high" "x-high") - ("pitch-range" number) - ("play-during" uri "mix" "repeat" "auto" "none") - ("position" "static" "relative" "absolute" "fixed") - ("quotes" string string "none") - ("richness" number) - ("right" length percentage "auto") - ("speak" "normal" "none" "spell-out") - ("speak-header" "once" "always") - ("speak-numeral" "digits" "continuous") - ("speak-punctuation" "code" "none") - ("speech-rate" number "x-slow" "slow" "medium" "fast" "x-fast" "faster" - "slower") - ("stress" number) - ("table-layout" "auto" "fixed") - ("text-align" "left" "right" "center" "justify") - ("text-indent" length percentage) - ("text-transform" "capitalize" "uppercase" "lowercase" "none") - ("top" length percentage "auto") - ("unicode-bidi" "normal" "embed" "bidi-override") - ("vertical-align" "baseline" "sub" "super" "top" "text-top" "middle" - "bottom" "text-bottom" percentage length) - ("visibility" "visible" "hidden" "collapse") - ("voice-family" specific-voice generic-voice "*" specific-voice - generic-voice) - ("volume" number percentage "silent" "x-soft" "soft" "medium" "loud" - "x-loud") - ("white-space" "normal" "pre" "nowrap" "pre-wrap" "pre-line") - ("widows" integer) - ("width" length percentage "auto") - ("word-spacing" "normal" length) - ("z-index" "auto" integer) - ;; CSS3 - ("align-content" align-stretch "space-between" "space-around") - ("align-items" align-stretch "baseline") - ("align-self" align-items "auto") - ("animation" animation-name animation-duration animation-timing-function - animation-delay animation-iteration-count animation-direction - animation-fill-mode) - ("animation-delay" time) - ("animation-direction" "normal" "reverse" "alternate" "alternate-reverse") - ("animation-duration" time) - ("animation-fill-mode" "none" "forwards" "backwards" "both") - ("animation-iteration-count" integer "infinite") - ("animation-name" "none") - ("animation-play-state" "paused" "running") - ("animation-timing-function" transition-timing-function - "step-start" "step-end" "steps(,)") - ("backface-visibility" "visible" "hidden") - ("background-clip" background-origin) - ("background-origin" "border-box" "padding-box" "content-box") - ("background-size" length percentage "auto" "cover" "contain") - ("border-image" border-image-outset border-image-repeat border-image-source - border-image-slice border-image-width) - ("border-image-outset" length) - ("border-image-repeat" "stretch" "repeat" "round" "space") - ("border-image-source" uri "none") - ("border-image-slice" length) - ("border-image-width" length percentage) - ("border-radius" length) - ("border-top-left-radius" length) - ("border-top-right-radius" length) - ("border-bottom-left-radius" length) - ("border-bottom-right-radius" length) - ("box-decoration-break" "slice" "clone") - ("box-shadow" length color) - ("box-sizing" "content-box" "border-box") - ("break-after" "auto" "always" "avoid" "left" "right" "page" "column" - "avoid-page" "avoid-column") - ("break-before" break-after) - ("break-inside" "avoid" "auto") - ("columns" column-width column-count) - ("column-count" integer) - ("column-fill" "auto" "balance") - ("column-gap" length "normal") - ("column-rule" column-rule-width column-rule-style column-rule-color) - ("column-rule-color" color) - ("column-rule-style" border-style) - ("column-rule-width" border-width) - ("column-span" "all" "none") - ("column-width" length "auto") - ("filter" url "blur()" "brightness()" "contrast()" "drop-shadow()" - "grayscale()" "hue-rotate()" "invert()" "opacity()" "saturate()" "sepia()") - ("flex" flex-grow flex-shrink flex-basis) - ("flex-basis" percentage length "auto") - ("flex-direction" "row" "row-reverse" "column" "column-reverse") - ("flex-flow" flex-direction flex-wrap) - ("flex-grow" number) - ("flex-shrink" number) - ("flex-wrap" "nowrap" "wrap" "wrap-reverse") - ("font-feature-setting" normal string number) - ("font-kerning" "auto" "normal" "none") - ("font-language-override" "normal" string) - ("font-size-adjust" "none" number) - ("font-stretch" "normal" "ultra-condensed" "extra-condensed" "condensed" - "semi-condensed" "semi-expanded" "expanded" "extra-expanded" "ultra-expanded") - ("font-synthesis" "none" "weight" "style") - ("font-variant" font-variant-alternates font-variant-caps - font-variant-east-asian font-variant-ligatures font-variant-numeric - font-variant-position) - ("font-variant-alternates" "normal" "historical-forms" "stylistic()" - "styleset()" "character-variant()" "swash()" "ornaments()" "annotation()") - ("font-variant-caps" "normal" "small-caps" "all-small-caps" "petite-caps" - "all-petite-caps" "unicase" "titling-caps") - ("font-variant-east-asian" "jis78" "jis83" "jis90" "jis04" "simplified" - "traditional" "full-width" "proportional-width" "ruby") - ("font-variant-ligatures" "normal" "none" "common-ligatures" - "no-common-ligatures" "discretionary-ligatures" "no-discretionary-ligatures" - "historical-ligatures" "no-historical-ligatures" "contextual" "no-contextual") - ("font-variant-numeric" "normal" "ordinal" "slashed-zero" - "lining-nums" "oldstyle-nums" "proportional-nums" "tabular-nums" - "diagonal-fractions" "stacked-fractions") - ("font-variant-position" "normal" "sub" "super") - ("hyphens" "none" "manual" "auto") - ("justify-content" align-common "space-between" "space-around") - ("line-break" "auto" "loose" "normal" "strict") - ("marquee-direction" "forward" "reverse") - ("marquee-play-count" integer "infinite") - ("marquee-speed" "slow" "normal" "fast") - ("marquee-style" "scroll" "slide" "alternate") - ("opacity" number) - ("order" number) - ("outline-offset" length) - ("overflow-x" overflow) - ("overflow-y" overflow) - ("overflow-style" "auto" "marquee-line" "marquee-block") - ("overflow-wrap" "normal" "break-word") - ("perspective" "none" length) - ("perspective-origin" percentage length "left" "center" "right" "top" "bottom") - ("resize" "none" "both" "horizontal" "vertical") - ("tab-size" integer length) - ("text-align-last" "auto" "start" "end" "left" "right" "center" "justify") - ("text-decoration" text-decoration-color text-decoration-line text-decoration-style) - ("text-decoration-color" color) - ("text-decoration-line" "none" "underline" "overline" "line-through" "blink") - ("text-decoration-style" "solid" "double" "dotted" "dashed" "wavy") - ("text-overflow" "clip" "ellipsis") - ("text-shadow" color length) - ("text-underline-position" "auto" "under" "left" "right") - ("transform" "matrix(,,,,,)" "translate(,)" "translateX()" "translateY()" - "scale()" "scaleX()" "scaleY()" "rotate()" "skewX()" "skewY()" "none") - ("transform-origin" perspective-origin) - ("transform-style" "flat" "preserve-3d") - ("transition" transition-property transition-duration - transition-timing-function transition-delay) - ("transition-delay" time) - ("transition-duration" time) - ("transition-timing-function" - "ease" "linear" "ease-in" "ease-out" "ease-in-out" "cubic-bezier(,,,)") - ("transition-property" "none" "all" identifier) - ("word-wrap" overflow-wrap) - ("word-break" "normal" "break-all" "keep-all")) - "A list of CSS properties and their possible values.") - -(defconst company-css-value-classes - '((absolute-size "xx-small" "x-small" "small" "medium" "large" "x-large" - "xx-large") - (align-common "flex-start" "flex-end" "center") - (align-stretch align-common "stretch") - (border-style "none" "hidden" "dotted" "dashed" "solid" "double" "groove" - "ridge" "inset" "outset") - (border-width "thick" "medium" "thin") - (color "aqua" "black" "blue" "fuchsia" "gray" "green" "lime" "maroon" "navy" - "olive" "orange" "purple" "red" "silver" "teal" "white" "yellow") - (counter "counter(,)") - (family-name "Courier" "Helvetica" "Times") - (generic-family "serif" "sans-serif" "cursive" "fantasy" "monospace") - (generic-voice "male" "female" "child") - (margin-width "auto") ;; length percentage - (relative-size "larger" "smaller") - (shape "rect(,,,)") - (uri "url()")) - "A list of CSS property value classes and their contents.") -;; missing, because not completable -;; -;;

O+~$64Bi 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 L1J-$i#IU~uEu78h diff --git a/elpa/darkroom-readme.txt b/elpa/darkroom-readme.txt deleted file mode 100644 index 4b595b17..00000000 --- a/elpa/darkroom-readme.txt +++ /dev/null @@ -1,20 +0,0 @@ -The main entrypoints to this extension are two minor modes: - - M-x darkroom-mode - M-x darkroom-tentative-mode - -`darkroom-mode' makes visual distractions disappear: the -mode-line is temporarily elided, text is enlarged and margins are -adjusted so that it's centered on the window. - -`darkroom-tentative-mode' is similar, but it doesn't immediately -turn-on `darkroom-mode', unless the current buffer lives in the -sole window of the Emacs frame (i.e. all other windows are -deleted). Whenever the frame is split to display more windows and -more buffers, the buffer exits `darkroom-mode'. Whenever they are -deleted, the buffer re-enters `darkroom-mode'. - -Personally, I always use `darkroom-tentative-mode'. - -See also the customization options `darkroom-margins' and -`darkroom-fringes-outside-margins', which affect both modes. diff --git a/elpa/dart-mode-20190827.2102/dart-mode-autoloads.el b/elpa/dart-mode-20190827.2102/dart-mode-autoloads.el deleted file mode 100644 index 1e32c6a8..00000000 --- a/elpa/dart-mode-20190827.2102/dart-mode-autoloads.el +++ /dev/null @@ -1,34 +0,0 @@ -;;; dart-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dart-mode" "dart-mode.el" (0 0 0 0)) -;;; Generated autoloads from dart-mode.el - (add-to-list 'auto-mode-alist '("\\.dart\\'" . dart-mode)) - -(autoload 'dart-mode "dart-mode" "\ -Major mode for editing Dart files. - -The hook `dart-mode-hook' is run with no args at mode -initialization. - -Key bindings: -\\{dart-mode-map} - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dart-mode" '("dart-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dart-mode-autoloads.el ends here diff --git a/elpa/dart-mode-20190827.2102/dart-mode-pkg.el b/elpa/dart-mode-20190827.2102/dart-mode-pkg.el deleted file mode 100644 index 3a022fbb..00000000 --- a/elpa/dart-mode-20190827.2102/dart-mode-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "dart-mode" "20190827.2102" "Major mode for editing Dart files" '((emacs "24.3")) :commit "04fcd649f19d49390079fbf2920a10bf37f6a634" :keywords '("languages") :authors '(("Brady Trainor" . "mail@bradyt.net")) :maintainer '("Brady Trainor" . "mail@bradyt.net") :url "https://github.com/bradyt/dart-mode") diff --git a/elpa/dart-mode-20190827.2102/dart-mode.el b/elpa/dart-mode-20190827.2102/dart-mode.el deleted file mode 100644 index f4284a17..00000000 --- a/elpa/dart-mode-20190827.2102/dart-mode.el +++ /dev/null @@ -1,625 +0,0 @@ -;;; dart-mode.el --- Major mode for editing Dart files -*- lexical-binding: t; -*- - -;; Author: Brady Trainor -;; URL: https://github.com/bradyt/dart-mode -;; Package-Version: 20190827.2102 -;; Version: 1.0.4 -;; Package-Requires: ((emacs "24.3")) -;; Keywords: languages - -;;; Commentary: - -;; Major mode for editing Dart files. - -;; Provides basic syntax highlighting and indentation. - -;;; Code: - -;;; Configuration - -(defvar dart-mode-map (make-sparse-keymap) - "Keymap used in dart-mode buffers.") -(define-key dart-mode-map (kbd "") 'dart-dedent-simple) -(define-key dart-mode-map (kbd "C-c C-i") 'indent-according-to-mode) - - -;;; Indentation - -(defcustom dart-indent-trigger-commands - '(indent-for-tab-command yas-expand yas/expand dart-dedent-simple) - "Commands that might trigger a `dart-indent-line' call." - :type '(repeat symbol) - :group 'dart) - -(defun dart-indent-line-function () - "`indent-line-function' for Dart mode. -When the variable `last-command' is equal to one of the symbols -inside `dart-indent-trigger-commands' it cycles possible -indentation levels from right to left." - (if (and (memq this-command dart-indent-trigger-commands) - (eq last-command this-command)) - (dart-indent-simple) - (dart-indent-line-relative))) - -(defun dart-indent-simple (&optional backwards) - (interactive) - (save-excursion - (indent-line-to - (max 0 (indent-next-tab-stop (current-indentation) backwards)))) - (when (< (current-column) (current-indentation)) - (back-to-indentation))) - -(defun dart-dedent-simple () - (interactive) - (dart-indent-simple 'backwards)) - -(defun dart-depth-of-line () - (save-excursion - (back-to-indentation) - (let ((depth (car (syntax-ppss)))) - (when (and (char-after) - (= (char-syntax (char-after)) ?\))) - (while (and (char-after) - (/= (char-syntax (char-after)) ?\() - (/= (char-after) ?\C-j)) - (when (= (char-syntax (char-after)) ?\)) - (setq depth (1- depth))) - (forward-char))) - depth))) - -(defun dart-indent-line-relative () - (let ((curr-depth (dart-depth-of-line)) - prev-line - prev-depth - prev-indent) - (save-excursion - (beginning-of-line) - (catch 'done - (while t - (when (= (point) 1) - (throw 'done t)) - (forward-line -1) - (unless (looking-at (rx (and bol (zero-or-more space) eol))) - (setq prev-line t) - (setq prev-indent (current-indentation)) - (setq prev-depth (dart-depth-of-line)) - (throw 'done t))))) - (save-excursion - (if prev-line - (indent-line-to (max 0 (+ prev-indent - (* (- curr-depth prev-depth) - tab-width)))) - (indent-line-to 0))) - (when (< (current-column) (current-indentation)) - (back-to-indentation)))) - - -;;; Fontification - -(defvar dart--file-directives - '("as" "deferred" "export" "hide" "import" "library" "of" "part" - "show")) - -(defvar dart--builtins - ;; ECMA 408; Section: Identifier Reference - ;; "Built-in identifiers" - '("abstract" "as" "covariant" "deferred" "dynamic" "export" - "external" "factory" "Function" "get" "implements" "import" - "interface" "library" "mixin" "operator" "part" "set" "static" - "typedef")) - -(defvar dart--keywords - ;; ECMA 408; Section: Reserved Words - '("assert" "break" "case" "catch" "class" "const" "continue" - "default" "do" "else" "enum" "extends" "final" "finally" "for" - "if" "in" "is" "new" "rethrow" "return" "super" "switch" "this" - "throw" "try" "var" "while" "with")) - -(defvar dart--types '("bool" "double" "int" "num" "void")) - -(defvar dart--constants '("false" "null" "true")) - -(defvar dart--async-keywords-re (rx word-start - (or "async" "await" "sync" "yield") - word-end - (zero-or-one ?*))) - -(defvar dart--number-re (rx symbol-start - (zero-or-one ?-) - (group (or (and (one-or-more digit) - (zero-or-one - (and ?. (one-or-more digit)))) - (and ?. (one-or-more digit))) - (zero-or-one (and (or ?e ?E) - (zero-or-one (or ?+ ?-)) - (one-or-more digit)))))) - -(defvar dart--hex-number-re (rx symbol-start - (zero-or-one ?-) - (group (or "0x" "0X") - (one-or-more (any (?a . ?f) - (?A . ?F) - digit))))) - -(defvar dart--operator-declaration-re (rx "operator" - (one-or-more space) - (group - (one-or-more (not (any ?\()))))) - -(eval-and-compile (defun dart--identifier (&optional case) - `(and (or word-start symbol-start) - (zero-or-more (any ?$ ?_)) - ,(if case - case - 'alpha) - (zero-or-more (or ?$ ?_ alnum))))) - -(defvar dart--metadata-re (rx ?@ (eval (dart--identifier)))) - -(defvar dart--types-re (rx (eval (dart--identifier 'upper)))) - -(defvar dart--constants-re (rx (and word-start - upper - (>= 2 (or upper ?_)) - word-end))) - -(defun dart--string-interpolation-id-func (limit) - "Font-lock matcher for string interpolation identifiers. - -These have the form $variableName. - -Can fontify entire match with group 0, or using group 1 for sigil, -group 2 for variableName." - (catch 'result - (let (data end syntax) - (while (re-search-forward (rx (group ?$) - (group (zero-or-more ?_) - lower - (zero-or-more (or ?_ alnum)))) - limit t) - (setq data (match-data)) - (setq end (match-end 2)) - (setq syntax (syntax-ppss)) - ;; Check that we are in a string and not in a raw string - (when (and (nth 3 syntax) - (or (= (nth 8 syntax) 1) - (not (eq (char-before (nth 8 syntax)) ?r)))) - (set-match-data data) - (goto-char end) - (throw 'result t)) - (when end - (goto-char end))) - (throw 'result nil)))) - -(defun dart--string-interpolation-exp-func (limit) - "Font-lock matcher for string interpolation expressions. - -These have the form ${expression}. - -Can fontify entire match with group 0, or using group 1 for sigil, -groups 2 and 4 for curly brackets, and 3 for contents." - (catch 'result - (let (sigil beg open close end depth) - ;; Loop and put point after ${ - (while (and (search-forward "${" limit t) - ;; Check that we are in a string and not in a raw string - (save-excursion - (and (nth 3 (syntax-ppss)) - (not (eq (char-before (nth 8 (syntax-ppss))) ?r))))) - ;; "a string with ${someInterpolation + aValue} inside of it." - ;; ^^^ ^^ - ;; ||| || - ;; sigil -+|+- open close -++- end - ;; +- beg - (setq open (point)) - (setq beg (- open 1)) - (setq sigil (- open 2)) - (setq depth 1) - ;; Move forward until limit, while depth is positive and we - ;; are inside string. - (while (and (> depth 0) - (< (point) limit) - (nth 3 (syntax-ppss))) - (setq depth (+ depth (pcase (char-after) - (?\{ 1) - (?\} -1) - (_ 0)))) - (forward-char)) - (setq end (point)) - ;; If depth is zero, we have found a closing } within string - ;; and before limit. Set `match-data', `point', and return `t'. - (when (= depth 0) - (setq close (1- end)) - (set-match-data (list sigil end - sigil beg - beg open - open close - close end)) - (goto-char end) - (throw 'result t)) - ;; If the candidate did not meet criteria, put point at end - ;; and search again. - (goto-char end)) - ;; When there are no more candidate "${", return nil. - (throw 'result nil)))) - -(defun dart--function-declaration-func (limit) - "Font-lock matcher function for function declarations. - -Matches function declarations before LIMIT that look like, - - \"lowercaseIdentifier([...]) [[a]sync[*], {, =>]\" - -For example, \"main\" in \"void main() async\" would be matched." - (catch 'result - (let (beg end) - (while (re-search-forward - (rx (group (eval (dart--identifier 'lower))) ?\() limit t) - (setq beg (match-beginning 1)) - (setq end (match-end 1)) - (condition-case nil - (progn - (up-list) - (when (looking-at (rx (one-or-more space) - (or "async" "async*" "sync*" "{" "=>"))) - (set-match-data (list beg end)) - (goto-char end) - (throw 'result t))) - (scan-error nil)) - (goto-char end)) - (throw 'result nil)))) - -(defun dart--abstract-method-func (limit) - "Font-lock matcher function for abstract methods. - -Matches function declarations before LIMIT that look like, - - \" [^ ][^=]* lowercaseIdentifier([...]);\" - -For example, \"compareTo\" in \" int compareTo(num other);\" would be -matched." - (catch 'result - (let (beg end) - (while (re-search-forward - (rx (and (not (any ?\.)) (group (eval (dart--identifier 'lower)))) ?\() limit t) - (setq beg (match-beginning 1)) - (setq end (match-end 1)) - (condition-case nil - (progn - (up-list) - (when (and (< (point) (point-max)) - (= (char-after (point)) ?\;)) - (goto-char beg) - (back-to-indentation) - (when (and (= (current-column) 2) - (not (looking-at "return")) - (string-match-p - " " (buffer-substring-no-properties - (point) beg)) - (not (string-match-p - "=" (buffer-substring-no-properties - (point) beg)))) - (goto-char end) - (set-match-data (list beg end)) - (throw 'result t)))) - (scan-error nil)) - (goto-char end))) - (throw 'result nil))) - -(defun dart--declared-identifier-func (limit) - "Font-lock matcher function for declared identifiers. - -Matches declared identifiers before LIMIT that look like, - - \"finalConstVarOrType lowercaseIdentifier\" - -For example, \"height\" in \"const int height\" would be matched." - (catch 'result - (let (beg end) - (while (re-search-forward - (rx - (and (group (or (or "const" "final" - "bool" "double" "dynamic" "int" "num" "void" - "var" - "get" "set") - (eval (dart--identifier 'upper))) - (zero-or-more ?>)) - (one-or-more (or space ?\C-j)) - (group (eval (dart--identifier 'lower))) - (not (any ?\( alnum ?$ ?_)))) - limit t) - (setq beg (match-beginning 2)) - (setq end (match-end 2)) - ;; Check for false positives - (when (not (member (match-string 2) - '("bool" "double" "dynamic" "int" "num" "void" - "var" - "get" "set"))) - (goto-char end) - (unless (nth 3 (syntax-ppss)) - (set-match-data (list beg end)) - (throw 'result t))) - (goto-char (match-end 1))) - (throw 'result nil)))) - -(defun dart--in-parenthesized-expression-or-formal-parameter-list-p () - "Returns `t' if `point' is in parentheses, otherwise `nil'. - -In particular, parenthesized expressions or formal parameter lists." - (save-excursion - (catch 'result - ;; Attempt to jump out of parentheses. - (condition-case nil - (backward-up-list) - (scan-error (throw 'result nil))) - ;; If we've only jumped out of optional or named section of - ;; formal parameters, try to jump again. - (when (member (char-after (point)) '(?\[ ?\{)) - (condition-case nil - (backward-up-list) - (scan-error (throw 'result nil)))) - (throw 'result (= (char-after (point)) ?\())))) - -(defun dart--declared-identifier-anchor-func (limit) - "Font-lock matcher for declared identifier. - -Uses `dart--declared-identifier-func' to find candidates before -LIMIT, and checks that they are not in parentheses. - -This matcher is an anchor to match multiple identifiers in a -single variable declaration. From ECMA-408, - - variableDeclaration: - declaredIdentifier (', ' identifier)* - ; - -After this function sets anchor, font-lock will use the function -`dart--declared-identifier-next-func' to find subsequent -identifiers." - (catch 'result - (let (data) - (while (dart--declared-identifier-func limit) - (setq data (match-data)) - (unless (dart--in-parenthesized-expression-or-formal-parameter-list-p) - (set-match-data data) - (goto-char (match-end 0)) - (throw 'result t)) - (goto-char (match-end 0))) - (throw 'result nil)))) - -(defun dart--declared-identifier-next-func (limit) - "Font-lock matcher for subsequent identifiers. - -For use after `dart--declared-identifier-anchor-func' sets -anchor, this function will look for subsequent identifers to -fontify as declared variables. From ECMA-408, - - variableDeclaration: - declaredIdentifier (', ' identifier)* - ;" - (catch 'result - (let ((depth (car (syntax-ppss)))) - (while t - (cond - ;; If point is followed by semi-colon, we are done. - ((or (> (point) limit) - (= (char-after (point)) ?\;) - (< (car (syntax-ppss)) depth)) - (throw 'result nil)) - ;; If point is followed by comma, and we are still at same - ;; depth, then attempt to match another identifier, otherwise - ;; return nil. - ((and (= (char-after (point)) ?\x2c) ; ?, - (= (car (syntax-ppss)) depth)) - (if (looking-at (rx ?\x2c - (one-or-more space) - (group (eval (dart--identifier 'lower))))) - (progn (set-match-data (list (match-beginning 1) - (match-end 1))) - (goto-char (match-end 0)) - (throw 'result t)) - (throw 'result nil))) - ;; Otherwise, if we are still before `point-max' (shouldn't - ;; this be `limit'? May be a bad attempt to deal with - ;; multiline searches. Should research how this is done with - ;; font-lock.), move forward. - ((< (point) (point-max)) - (forward-char)) - ;; Otherwise, return nil. - (t (throw 'result nil))))))) - -(defun dart--anonymous-function-matcher (limit) - "Font-lock matcher for start of anonymous functions. - -Looks for opening parenthesis, tries to jump to opening -parenthesis, ensure it is not preceded by for, while, etc. Then -tries to jump to closing parenthesis and check if followed by \" -{\" or \" =>\". - -Used with `dart--untyped-parameter-anchored-matcher' to fontify -untyped parameters. For example, in - - (untypedParameter) => untypedParameter.length" - (catch 'result - (let (beg end) - (while (search-forward "(" limit t) - (setq beg (match-beginning 0)) - (setq end (match-end 0)) - (unless (looking-back (rx (or (and (or "do" "for" "if" "switch" "while") - space) - "super") - ?\() - (point-at-bol)) - (condition-case nil - (up-list) - (scan-error (throw 'result nil))) - (when (looking-at (rx space (or ?\{ "=>"))) - (set-match-data (list beg end)) - (goto-char end) - (throw 'result t)) - (goto-char end))) - (throw 'result nil)))) - -(defun dart--untyped-parameter-anchored-matcher (limit) - "Font-lock anchored-matcher for untyped parameters. - -Searches forward for for lowercase idenitifer and ensures depth -is still same. - -Used with `dart--anonymous-function-matcher' to fontify -untyped parameters. For example, in - - (untypedParameter) => untypedParameter.length" - (let (beg end) - (catch 'result - (if (equal (char-after) ?\)) - (throw 'result nil)) - (let ((depth (car (syntax-ppss)))) - (while (re-search-forward - (rx (and (group (or (one-or-more (char ?_)) - (eval (dart--identifier 'lower)))) - (or ?, ?\))))) - (setq beg (match-beginning 1)) - (setq end (match-end 1)) - (goto-char end) - (if (or (> (point) limit) - (< (car (syntax-ppss)) depth)) - (throw 'result nil) - (set-match-data (list beg end)) - (throw 'result t)))) - (throw 'result nil)))) - -(defun dart--get-point-at-end-of-list () - (let (pt) - (save-excursion - (up-list) - (setq pt (point))) - pt)) - -(defvar dart-font-lock-defaults - '((dart-font-lock-keywords-1 dart-font-lock-keywords-1 - dart-font-lock-keywords-2 - dart-font-lock-keywords-3))) - -(defvar dart-font-lock-keywords-1 - `((,(regexp-opt dart--file-directives 'words) . font-lock-builtin-face) - (dart--function-declaration-func . font-lock-function-name-face) - (,dart--operator-declaration-re . (1 font-lock-function-name-face)) - (dart--abstract-method-func . font-lock-function-name-face))) - -(defvar dart-font-lock-keywords-2 - `(,dart--async-keywords-re - ,(regexp-opt dart--keywords 'words) - (,(regexp-opt dart--builtins 'words) . font-lock-builtin-face) - (,(regexp-opt dart--constants 'words) . font-lock-constant-face) - (,dart--hex-number-re . (1 font-lock-constant-face)) - (,dart--number-re . (1 font-lock-constant-face)) - (,dart--metadata-re . font-lock-constant-face) - (,dart--constants-re . font-lock-constant-face) - (,(regexp-opt dart--types 'words) . font-lock-type-face) - (,dart--types-re . font-lock-type-face) - (dart--function-declaration-func . font-lock-function-name-face) - (,dart--operator-declaration-re . (1 font-lock-function-name-face)) - (dart--abstract-method-func . font-lock-function-name-face))) - -(defvar dart-font-lock-keywords-3 - (append - dart-font-lock-keywords-2 - `((dart--declared-identifier-func . font-lock-variable-name-face) - (dart--declared-identifier-anchor-func - . (dart--declared-identifier-next-func - nil - nil - (0 font-lock-variable-name-face))) - (dart--anonymous-function-matcher - . (dart--untyped-parameter-anchored-matcher - (dart--get-point-at-end-of-list) - nil - (0 font-lock-variable-name-face))) - (dart--string-interpolation-id-func (0 font-lock-variable-name-face t)) - (dart--string-interpolation-exp-func (0 font-lock-variable-name-face t))))) - -(defun dart-syntax-propertize-function (beg end) - "Sets syntax-table text properties for raw and/or multiline strings. - -We use fences uniformly for consistency. - -In raw strings, we modify backslash characters to have punctuation -syntax rather than escape syntax. - -String interpolation is not handled correctly yet, but the fixes to -quote characters in multiline strings, and escape characters in raw -strings, ensures that code outside of strings is not highlighted as -strings." - (goto-char beg) - ;; We rely on syntax-propertize-extend-region-functions that `beg` - ;; will be at beginning of line, but we ensure here that we are not - ;; in a string - (while (nth 3 (syntax-ppss)) - (goto-char (nth 8 (syntax-ppss))) - (beginning-of-line)) - ;; Search for string opening - (while (re-search-forward (rx (group (optional ?r)) - (group (or (repeat 3 ?\") - (repeat 3 ?\') - ?\" - ?\'))) - end t) - (let ((bos (match-beginning 2)) - (rawp (equal (match-string-no-properties 1) "r")) - (string-delimiter (match-string-no-properties 2))) - ;; Set string fence syntax at beginning of string - (put-text-property bos (1+ bos) 'syntax-table (string-to-syntax "|") nil) - ;; Look for the end of string delimiter, depending on rawp and - ;; string-delimiter - ;; Unless rawp, ensure an even number of backslashes - (when (or (looking-at (concat (unless rawp (rx (zero-or-more ?\\ ?\\))) - string-delimiter)) - (re-search-forward (concat (unless rawp (rx (not (any ?\\)) (zero-or-more ?\\ ?\\))) - string-delimiter) - end t)) - (let ((eos (match-end 0))) - ;; Set end of string fence delimiter - (put-text-property (1- eos) eos 'syntax-table (string-to-syntax "|") nil) - ;; For all strings, remove fence property between fences - ;; For raw strings, set all backslashes to punctuation syntax - (dolist (pt (number-sequence (1+ bos) (- eos 2))) - (when (equal (get-text-property pt 'syntax-table) (string-to-syntax "|")) - (remove-text-properties pt (1+ pt) 'syntax-table)) - (when (and rawp (equal (char-after pt) ?\\)) - (put-text-property pt (1+ pt) 'syntax-table (string-to-syntax ".") nil))) - (goto-char eos)))))) - - -;;; Initialization - -;;;###autoload (add-to-list 'auto-mode-alist '("\\.dart\\'" . dart-mode)) - -;;;###autoload -(define-derived-mode dart-mode prog-mode "Dart" - "Major mode for editing Dart files. - -The hook `dart-mode-hook' is run with no args at mode -initialization. - -Key bindings: -\\{dart-mode-map}" - (modify-syntax-entry ?/ "_ 124b") - (modify-syntax-entry ?* ". 23") - (modify-syntax-entry ?\n "> b") - (modify-syntax-entry ?\' "\"") - (modify-syntax-entry ?\> ".") - (modify-syntax-entry ?\< ".") - (setq-local electric-indent-chars '(?\n ?\) ?\] ?\})) - (setq-local comment-start "//") - (setq-local comment-end "") - (setq fill-column 80) - (setq font-lock-defaults dart-font-lock-defaults) - (setq-local indent-line-function 'dart-indent-line-function) - (setq indent-tabs-mode nil) - (setq tab-width 2) - (setq-local syntax-propertize-function 'dart-syntax-propertize-function)) - -(provide 'dart-mode) - -;;; dart-mode.el ends here diff --git a/elpa/dart-mode-20190827.2102/dart-mode.elc b/elpa/dart-mode-20190827.2102/dart-mode.elc deleted file mode 100644 index 22c4e6e8583ee208529c95218a4ed364a5813038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17191 zcmdU1i*p;teWoN^w&AhbrmmWqW+rP;F#&}~-wOaKS(f#3<2rUcmK?VsDDem!$cunG z7zc==rTp*xzTfWN0{|ttai>$w5IF4a?eq8eevj472Yy{NtP8kk4mHdYo^gc9zdoG#ti5RgB{8?f82ueGD`7k!Eu>$kKU)#*6vL*+og} z+8v21A7hCXm z{o@4w-hYioWApQ%qrQsICef68D0?)FW^-qf4P$k*7>%&no!>TE!+7*8nyI4B;Tx?< z^fY$zX*A1Y=c)A4R;|rzYDb0cZoA!R9i7c%XTZLi{lN9!#fOi-V6*Rgt}O}i(6J?5 z{OI)q)_NZP{QLLu8Q>4iybk`*!s~tfPTzNXO|@U25vG}>G8eUf6b+uvqoV^oX`D@* z&Ye7&OhGTrOYb#74^k8j2H9)~a&hLFUiV;;&$Ed$j0fXr7CTsY5*^_!8Oyu{0y{pA zXIR{10zv>CF46%BmER;%wYl%gs$DbFmU(lO%^b|jzNyZl+=-u0NlkeC#5~GawMn-R zly{(-U>rRl=xMGd$??ftnaQX~9aiT!#$IfJKF8yorn)gdo5rd&i>EQ(%g-i9*|@E4 z9M7`FR91GNcH1BbZ*NZ>nyIn_$1Z3~Vdm;Ss6&xDb{apN#3`scR>cM#j-z~T7q+Fq zo$-&0XsqU$%FS zb4VP!zE_h&bth^q4F#@DXcmvLqG$1e@(mB|1-tD79*MuJ8jaQ{RUcCdW+`^`?wxyI z{cz{I`w!ciIoB-H479oLce)@%-y`P<)8SjVP`%Y}9(+VrY$qrS)DKv1=U+CeE3Q%k zcGk6Alg7{ILdIZ~sTwS1GqP9pWXOMHsY=;_>YBBALFl$snvAhP3YY5qYgAuhBM1;o zw&Z#!hqP@vH(P^4)ZGTlTn)OK3p;(JRGhc)GZz8!R3#kp%I97TEKz(217z7cXCa`!DZ4>Gw62 zqSF6UQCSc!#u38(FIIIilI$Nv>}fItd=OR}#?^D@<{ibyNt#mbTWT0mNO_P^v+PvO zmE%FFXHVGz60`YufByz_-5|bkaB%%vb1ltRw_Lbo%_$zJJ#$!vMs)~coMAGHp*o&H z)NQqzQQlNda7GNy8sZUpA)C$dZ~~!;FDNqodz>82qS+aWvJpO@joB(c$xfS8!Bx%e z94(UZ9CB9%I08xnoy!D5Vm^^&K z;|VB3FQ4CI?mcuPJ`bkihvgo5MB&|*Gs3$5r~Q8G_6_-ncrpcNNjx4(2?{^!_pje> zF4HHbdjwFWJAU%1a~mB>pWwY=a-7V;d%u^0et)N4)<)ZxtEHwfW*DRXfebIxMK>=U z{Jg!|O?zctC-HOV+_|~?|M~m?J?-CdzKEPrZKkVTSrRw!Qc#R6*j7};441n9xWy&2 zBOrlb1qs}{^YFnM5a2*cfT~BdJS+sLsQ*h8wC`{5%kPgUwE?l+@Gkxt`AIz50^s9O zJK#USJ`LRT4*>n2;#uYZ%uX_#S1U@-RM1s>opu`r+w>$-t)&*|Od6mXd)aOS&{{YU z1bc#Y>e6Zw&!b^9k7Rp3Hzx^l!!bX>S9|~3lY{HnE*TD#VOm^63+RlOQiGACrhR?o zP=$32tqDn>&zDPGFQ#DBpWk)CTBiF?F_&6bwcngASmK4h-S7VmtRY8D9R39alQYf+ zPt}B?3r9%^u8ms&F-X#BM$`yvqdaa}$B$0pJXR;svse%}-kPXu7N&m_O@Q7T_h62W zDEUTbill-=lu?w}+}bX1w-p9lL0)S`pZY_Xj88M z$gr{k5UhZ5q1K+Zocu?mOp8zeGc;~}o1_YZ(G9+4eMi6r00%IN?{_TH=t(hfmgipB zW#fCq2OgebRSG`q*#h6~x*LZNN2m!1|3hgSUJ{6L;mE)o7@vZlLydqgu+MikOf~rE z9d>6Md2H0hgxtUyfU`J9&UZ$Tz6KLNLeZpI!Ym!D+krX>E_Cd>1|L$%Y>T_@1CjJlPwL?=Z4skG^YJ>5&G;}?fH1b9$Hg3O9f<;%Ze{7m~9jT#0 zfS*NI(EB2z_4OAPU)U`-VI`mruwBoDY=zcAxN$+I%~|&@U%qttUF-?kTz*eJ`>A}r zkKOF`(;Aogv{3nHxlD5()l`aE71bqwb=UCMGIL#fK~@QB`~mI&Z}{L5m{3rxp5Gzl zU(YO_<(9DH^$fSb`dY&+*8M|CZCxiyyOKmwlNi4iX|8=nBE75iFih}ntfeQ!H*61@ zA!?jFjkg;O1>8)@Kur5(q2pWoJ3BiEZMDB29T0BqUq9GZFSgaK&kmZ6#uu1N{5+!T zYg;uZaBkB3rJBTr5Fkm~g3jh^O{n|Dcu0Sy2#k36I@YmEtic%;*5vpXBuULPMuxw| zBNiEcn{|-deyB-F|3HB@9lIW^W-yBa$%xenk`g~a$3;0z#*6obfJjkRQWMJ<8X|G{ zyCiRU+A~kKEh;aw8~a8{R-iO(NWOvCJ`X+AM7T)zb-)CIyhZZ#R4a!w*@4BE&Dv@) zg^vQx>#7Y3wO~z94TEn1N57P#Bc8^y#@g5M^gYFPR45us1!}t+QG?K9*7J}Q}6t;l*R0hZ7tbMa2 z=*Alov|Xj6SGlYLL|zg&80U!r&Ln60uqpjq5~g60f}#sxLbp%PTae^jq3FY*_%43j zI3)V;C_pa1X{pVl%LW&p=e@tUt+ql+s^Pm-eq4r4?{ z;EOq~f|OTt-TvbpqJ0DS*WmVFg!4LkYK{K}Dx=Dhu^K^}CxU=hqdxkrM;C0+-q7?|?6iT7Wq3fz&uW7{3agT12KS#4a z%^op?u!d1r81y8jD_(P_*h0dgw)E%f7(4fhO}osNu78J2caDk?$LuRq45|4ee86)V zpqU#6q~t=KQ0;gE+*nc7Ii=z-a0RtsdcRYkmS0M{K*i9*1Gz5yiEp@4P$=#m{L-;c zF&|#asi6#hIDA4j;uA6vpU?*Qd?s&3GduzS$UAh?oX<@))Adz)>@z4H8ZftSR5TU4 zPEk&cb^aJ{%(45AueF}g=+~w_HK%W^AY&P~n#<0x(us-PsJq30g2c_HotD_3W_t-J zu2Z25#aSiV-RpHUn|l79`cC9Qt`6sjU5(V?G{cY*3xlen)=Ht75Uz%0O%-*Tz)(Mg zKY9yD>q}_?Pv-)G$L+Fp@)JU{r74xuC8yr>U}ihTxa^71 zMq{|qeWN>K6Wx)Z4rgj21tvCvcmUbULxc>PPl@3FP>Xx50V|N5nv8%>SSi@%8(r_? z%8S20=S4IW93~y~zK5cqF+@#av_TCY*?^B@fs*#y)3x8)gW>B3@KIF(RfsrAXhdso z4-p3mu7$gub)pqJY{gDRqT-CcXR3jYS=tEka9J>IF$f7R95Ojzn7}y4I~vwE#3`bU zRCsg-Pje0NK?`RJ)FBxNbxOgYlIfrU%#2}GxNf3!aDqutL5QiVJQRjj-M>GO7ia;Ct+I(qhLqF)H!KC!iA$(R%w&i&wK^`+SimX`>+eKLfIaP1!Qgxf2j`Cx|$B zxUg0^J*Vp@T$le<_a?x3De%LvhRL@p=;Iec9V=j+Zlih04tw6NRVau@ukj0!EG3G9 zESLyMWoMIYQA$TL#UJ72K?xedVqjpp0ssIPU{OGeK;Hj#F`4q)v}%;f9j)RtUqFi> zYX-8H*=$ht1B6WB(>Y_`+e+ezXgDA2s7FZQX{>ZS7-!<~uXKzlLzz)u5!8&bG2xo@ z*=)eKhB-IkYier!IMg8o!`6#bg0>Zap;;I}#Aq}v$aN^9VVak~hJ1`InRlOTFGitWD++N ztHAT9MPT9!nsN*%s=K0u3AMdXHoeOiy03A0X|A&7%g^(0Ejv!dG36G_Ma(6k3KQ@h zW&rn~Dtsm*eCT*K9)!q%`74abYKFa0ie3d4JJH-h8d@Eu)!|&#)UI^~8v`D$mvn$3 z4pP@wB{tvN>jp+k?N+taG6@RXts%We#Z*Q__$3T# zQ21(OqNH-q-QD#`=F6#c4y;d0~S0HtWh^+LO||Q)(Iw0CgIO z#7%Z8Zx+!NWVRy{7w^NSWeDDOy|#fFVy!3pHN7JzBYcBxMT%-AwVPYoO5^BncAxLrZakFde3WmQFG*vndz+Ur%20qgN~>nHa`!cydTo}WOO$&gW(RF zBbyV(5vfapGlX@s=#&WV6FiDLO>)HbENGzpAQz3)C{72!gNro5I}@ay@Kv%a9I&W5 zLrXYv*_U}0HW%XQ*^rr5M9?|%Pfse>iD=A8uGW<9uZ8G>hMp|Cp_dro11`T9-b@5w zbPYy%C_yHMR;r0$+U!I7A+A?pUdSIF%rVQec)pDY6)s5N%El;pF2-cz$3-@et8;ackx>$w8^lD9{U{@Vie$BbbjF>=CsnYAH4O5bM5^_kSxI( zUq#>V+jV@GJ$wmYl*SEe&w7nCkToH zDzE~@KojCX{swy<>cn1>y>=>t=H<*$Ak;4OD3?3fM$9mL_iP*MeHJxSj#=m;+_PLT zzhC4Pw^cR&z)8&(h&qU47nL#N;FVir{q&oRVizKKl3VKvE+uj2+ODmPILa33aHpRh z;sU2EcuPeKT+PFXywwJ2iWo}{XV(rKLJ}i^wawIZ5y`xbC%a_3&38Z}(x<-hCb#|I z>cKDG8-xiD&kwb_R-9Zi;cy*e$VQxZ`*GzkXc7Bz7+1hbg^|hq)<xUwEzc zx#?{Jrs(Uh`c9T!Rr8_zQu^2GOe-U9t{bGbMS2jKe(cn0h!2~0WIN9tY6#AIMjtDM zh4$o+v$ddM%-J|U)Fy7A;gZirnzKjSsF!jxC;0+Lfv+;XO0D-{a_f3%TJkmixg~ zh=TwF5nBW{l%h*mBOS{dY=gZBihFo`D@0$R^=ipmA^Hhx{eYeJ8Y)ovYjU*}aPN`cCiap04gv z?(p5NcNM|>po>{`1C(jefGe+Onm{S1b1)QWQ3`}0mt?V))U?@!rfUpYl2VOPghO$G zA{v*sxCQlVHYnx1YTlQ7bJDZi4-a-pg)djdW7rY1WMD4z%ItIC6_?jg_auM1 z%_K}h0&`)g`N=1^CuxdkgQLUU;tFx?cDX)^>itRU+7fHHyxOn^_{-s&1zU@*Y8XI5 zRjI6`6+s7j->O^6|5IWNztDIwN%g!+w*ka4F9=rMdqt6%J%oR*i5O4%4r&=E^g6w6 Ux48L?**-(Yg1Mhg;%hhl8`G=D*#H0l diff --git a/elpa/dart-mode-readme.txt b/elpa/dart-mode-readme.txt deleted file mode 100644 index 4d77bdfa..00000000 --- a/elpa/dart-mode-readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -Major mode for editing Dart files. - -Provides basic syntax highlighting and indentation. diff --git a/elpa/dart-server-20190817.1254/dart-server-autoloads.el b/elpa/dart-server-20190817.1254/dart-server-autoloads.el deleted file mode 100644 index 89c12e59..00000000 --- a/elpa/dart-server-20190817.1254/dart-server-autoloads.el +++ /dev/null @@ -1,31 +0,0 @@ -;;; dart-server-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dart-server" "dart-server.el" (0 0 0 0)) -;;; Generated autoloads from dart-server.el - -(autoload 'dart-server "dart-server" "\ -Toggle Dart-Server mode on or off. -With a prefix argument ARG, enable Dart-Server mode if ARG is -positive, and disable it otherwise. If called from Lisp, enable -the mode if ARG is omitted or nil, and toggle it if ARG is `toggle'. -\\{dart-server-map} - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dart-server" '("dart-server-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dart-server-autoloads.el ends here diff --git a/elpa/dart-server-20190817.1254/dart-server-pkg.el b/elpa/dart-server-20190817.1254/dart-server-pkg.el deleted file mode 100644 index 148679b1..00000000 --- a/elpa/dart-server-20190817.1254/dart-server-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "dart-server" "20190817.1254" "Minor mode for editing Dart files" '((emacs "24.5") (cl-lib "0.5") (dash "2.10.0") (flycheck "0.23") (s "1.10")) :commit "aba838e8ee2f30309f366e8a91c17616549003ce" :keywords '("languages") :authors '(("Natalie Weizenbaum") ("Brady Trainor" . "mail@bradyt.com")) :maintainer '("Brady Trainor" . "mail@bradyt.com") :url "https://github.com/bradyt/dart-server") diff --git a/elpa/dart-server-20190817.1254/dart-server.el b/elpa/dart-server-20190817.1254/dart-server.el deleted file mode 100644 index 55a35398..00000000 --- a/elpa/dart-server-20190817.1254/dart-server.el +++ /dev/null @@ -1,1454 +0,0 @@ -;;; dart-server.el --- Minor mode for editing Dart files -*- lexical-binding: t; -*- - -;; Author: Natalie Weizenbaum -;; Brady Trainor -;; Maintainer: Brady Trainor -;; URL: https://github.com/bradyt/dart-server -;; Package-Version: 20190817.1254 -;; Version: 0.1.0 -;; Package-Requires: ((emacs "24.5") (cl-lib "0.5") (dash "2.10.0") (flycheck "0.23") (s "1.10")) -;; Keywords: languages - -;; Copyright (C) 2011 Google Inc. -;; -;; 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 . - -;; This file contains several functions and variables adapted from the -;; code in https://github.com/dominikh/go-mode.el - -;; Definitions adapted from go-mode.el are -;; -;; gofmt-command gofmt-args gofmt-show-errors gofmt go--apply-rcs-patch -;; gofmt--kill-error-buffer gofmt--process-errors gofmt-before-save -;; go--goto-line go--delete-whole-line - -;; go-mode.el uses this license: -;; -;; Copyright (c) 2014 The go-mode Authors. All rights reserved. -;; -;; Redistribution and use in source and binary forms, with or without -;; modification, are permitted provided that the following conditions are -;; met: -;; -;; * Redistributions of source code must retain the above copyright -;; notice, this list of conditions and the following disclaimer. -;; * Redistributions in binary form must reproduce the above -;; copyright notice, this list of conditions and the following disclaimer -;; in the documentation and/or other materials provided with the -;; distribution. -;; * Neither the name of the copyright holder nor the names of its -;; contributors may be used to endorse or promote products derived from -;; this software without specific prior written permission. -;; -;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -;; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -;;; Commentary: - -;; Minor mode for editing Dart files. - -;; Provides dart server features, such as formatting, analysis, -;; flycheck, etc. - -;;; Code: - -(require 'cl-lib) -(require 'compile) -(require 'dash) -(ignore-errors - (require 'flycheck)) -(require 'help-mode) -(require 'json) -(require 'rx) -(require 's) -(require 'subr-x) - -;;; Utility functions and macros - -(defun dart-server-beginning-of-statement () - "Moves to the beginning of a Dart statement. - -Unlike `c-beginning-of-statement', this handles maps correctly -and will move to the top level of a bracketed statement." - (while - (progn - (back-to-indentation) - (while (eq (char-after) ?}) - (forward-char) - (forward-sexp -1) - (back-to-indentation)) - (unless (dart-server--beginning-of-statement-p)) (forward-line -1)))) - -(defun dart-server--beginning-of-statement-p () - "Returns whether the point is at the beginning of a statement. - -Statements are assumed to begin on their own lines. This returns -true for positions before the start of the statement, but on its line." - (and - (save-excursion - (skip-syntax-forward " ") - (not (or (bolp) (eq (char-after) ?})))) - (save-excursion - (skip-syntax-backward " ") - (when (bolp) - (cl-loop do (forward-char -1) - while (looking-at "^ *$")) - (skip-syntax-backward " ") - (cl-case (char-before) - ((?} ?\;) t)))))) - -(defun dart-server--delete-whole-line (&optional arg) - "Delete the current line without putting it in the `kill-ring'. -Derived from function `kill-whole-line'. ARG is defined as for that -function." - (setq arg (or arg 1)) - (if (and (> arg 0) - (eobp) - (save-excursion (forward-visible-line 0) (eobp))) - (signal 'end-of-buffer nil)) - (if (and (< arg 0) - (bobp) - (save-excursion (end-of-visible-line) (bobp))) - (signal 'beginning-of-buffer nil)) - (cond ((zerop arg) - (delete-region (progn (forward-visible-line 0) (point)) - (progn (end-of-visible-line) (point)))) - ((< arg 0) - (delete-region (progn (end-of-visible-line) (point)) - (progn (forward-visible-line (1+ arg)) - (unless (bobp) - (backward-char)) - (point)))) - (t - (delete-region (progn (forward-visible-line 0) (point)) - (progn (forward-visible-line arg) (point)))))) - -(defconst dart-server--identifier-re - "[a-zA-Z_$][a-zA-Z0-9_$]*" - "A regular expression that matches keywords.") - -(defun dart-server--forward-identifier () - "Moves the point forward through a Dart identifier." - (when (looking-at dart-server--identifier-re) - (goto-char (match-end 0)))) - -(defun dart-server--kill-buffer-and-window (buffer) - "Kills BUFFER, and its window if it has one. - -This is different than `kill-buffer' because, if the buffer has a -window, it respects the `quit-restore' window parameter. See -`quit-window' for details." - (-if-let (window (get-buffer-window buffer)) - (quit-window t window) - (kill-buffer buffer))) - -(defun dart-server--get (alist &rest keys) - "Recursively calls `cdr' and `assoc' on ALIST with KEYS. -Returns the value rather than the full alist cell." - (--reduce-from (cdr (assoc it acc)) alist keys)) - -(defmacro dart-server--json-let (json fields &rest body) - "Assigns variables named FIELDS to the corresponding fields in JSON. -FIELDS may be either identifiers or (ELISP-IDENTIFIER JSON-IDENTIFIER) pairs." - (declare (indent 2)) - (let ((json-value (make-symbol "json"))) - `(let ((,json-value ,json)) - (let ,(--map (if (symbolp it) - `(,it (dart-server--get ,json-value ',it)) - (-let [(variable key) it] - `(,variable (dart-server--get ,json-value ',key)))) - fields) - ,@body)))) - -(defun dart-server--property-string (text prop value) - "Returns a copy of TEXT with PROP set to VALUE. - -Converts TEXT to a string if it's not already." - (let ((copy (substring (format "%s" text) 0))) - (put-text-property 0 (length copy) prop value copy) - copy)) - -(defun dart-server--face-string (text face) - "Returns a copy of TEXT with its font face set to FACE. - -Converts TEXT to a string if it's not already." - (dart-server--property-string text 'face face)) - -(defmacro dart-server--fontify-excursion (face &rest body) - "Applies FACE to the region moved over by BODY." - (declare (indent 1)) - (-let [start (make-symbol "start")] - `(-let [,start (point)] - ,@body - (put-text-property ,start (point) 'face ,face)))) - -(defun dart-server--flash-highlight (offset length) - "Briefly highlights the text defined by OFFSET and LENGTH. -OFFSET and LENGTH are expected to come from the analysis server, -rather than Elisp." - (-let [overlay (make-overlay (+ 1 offset) (+ 1 offset length))] - (overlay-put overlay 'face 'highlight) - (run-at-time "1 sec" nil (lambda () (delete-overlay overlay))))) - -(defun dart-server--read-file (filename) - "Returns the contents of FILENAME." - (with-temp-buffer - (insert-file-contents filename) - (buffer-string))) - -(defmacro dart-server--with-temp-file (name-variable &rest body) - "Creates a temporary file for the duration of BODY. -Assigns the filename to NAME-VARIABLE. Doesn't change the current buffer. -Returns the value of the last form in BODY." - (declare (indent 1)) - `(-let [,name-variable (make-temp-file "dart-server.")] - (unwind-protect - (progn ,@body) - (delete-file ,name-variable)))) - -(defun dart-server--run-process (executable &rest args) - "Runs EXECUTABLE with ARGS synchronously. -Returns (STDOUT STDERR EXIT-CODE)." - (dart-server--with-temp-file stderr-file - (with-temp-buffer - (-let [exit-code - (apply #'call-process - executable nil (list t stderr-file) nil args)] - (list - (buffer-string) - (dart-server--read-file stderr-file) - exit-code))))) - -(defun dart-server--try-process (executable &rest args) - "Like `dart-server--run-process', but only returns stdout. -Any stderr is logged using dart-server-log. Returns nil if the exit code is non-0." - (-let [result (apply #'dart-server--run-process executable args)] - (unless (string-empty-p (nth 1 result)) - (dart-server-log (format "Error running %S:\n%s" (cons executable args) (nth 1 result)))) - (if (eq (nth 2 result) 0) (nth 0 result)))) - -(defvar dart-server--do-it-again-callback nil - "A callback to call when `dart-server-do-it-again' is invoked. - -Only set in `dart-server-popup-mode'.") -(make-variable-buffer-local 'dart-server--do-it-again-callback) - - -;;; General configuration - -(defcustom dart-server-sdk-path - ;; Use Platform.resolvedExecutable so that this logic works through symlinks - ;; and wrapper scripts. - (-when-let (dart (or (executable-find "dart") - (let ((flutter (executable-find "flutter"))) - (when flutter - (expand-file-name "cache/dart-sdk/bin/dart" - (file-name-directory flutter)))))) - (dart-server--with-temp-file input - (with-temp-file input (insert " - import 'dart:io'; - - void main() { - print(Platform.resolvedExecutable); - } - ")) - (-when-let (result (dart-server--try-process dart input)) - (file-name-directory - (directory-file-name - (file-name-directory (string-trim result))))))) - "The absolute path to the root of the Dart SDK." - :group 'dart-server - :type 'directory - :package-version '(dart-server . "0.1.0")) - -(defun dart-server-executable-path () - "The absolute path to the 'dart' executable. - -Returns nil if `dart-server-sdk-path' is nil." - (when dart-server-sdk-path - (concat dart-server-sdk-path - (file-name-as-directory "bin") - (if (memq system-type '(ms-dos windows-nt)) - "dart.exe" - "dart")))) - - -;;; Configuration - -(defvar dart-server-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-c ?") 'dart-server-show-hover) - ;; (define-key map (kbd "C-c C-g") 'dart-server-goto) - (define-key map (kbd "C-c C-f") 'dart-server-find-refs) - (define-key map (kbd "C-c C-e") 'dart-server-find-member-decls) - (define-key map (kbd "C-c C-r") 'dart-server-find-member-refs) - (define-key map (kbd "C-c C-t") 'dart-server-find-top-level-decls) - (define-key map (kbd "C-c C-o") 'dart-server-format) - (define-key map (kbd "M-/") 'dart-server-expand) - (define-key map (kbd "M-?") 'dart-server-expand-parameters) - map) - "Keymap used in dart-server buffers.") - - -;;; Dart analysis server - -(cl-defstruct - (dart-server--analysis-server - (:constructor dart-server--make-analysis-server)) - "Struct containing data for an instance of a Dart analysis server. - -The slots are: -- `process': the process of the running server. -- `buffer': the buffer where responses from the server are written." - process buffer) - -(defgroup dart-server nil - "Major mode for editing Dart code." - :group 'languages) - -(defvar dart-server-debug nil - "If non-nil, enables writing debug messages for dart-server.") - -(defcustom dart-server-enable-analysis-server nil - "If non-nil, enables support for Dart analysis server. - -The Dart analysis server adds support for error checking, code completion, -navigation, and more." - :group 'dart-server - :type 'boolean - :package-version '(dart-server . "0.1.0")) - -(defvar dart-server--analysis-server nil - "The instance of the Dart analysis server we are communicating with.") - -(defun dart-server--analysis-server-snapshot-path () - "The absolute path to the snapshot file that runs the Dart analysis server." - (when dart-server-sdk-path - (concat dart-server-sdk-path - (file-name-as-directory "bin") - (file-name-as-directory "snapshots") - "analysis_server.dart.snapshot"))) - -(defvar dart-server-analysis-roots nil - "The list of analysis roots that are known to the analysis server. - -All Dart files underneath the analysis roots are analyzed by the analysis -server.") - -(defvar dart-server--analysis-server-next-id 0 - "The ID to use for the next request to the Dart analysis server.") - -(defvar dart-server--analysis-server-callbacks nil - "An alist of ID to callback to be called when the analysis server responds. - -Each request to the analysis server has an associated ID. When the analysis -server sends a response to a request, it tags the response with the ID of the -request. We look up the callback for the request in this alist and run it with -the JSON decoded server response.") - -(defvar dart-server--analysis-server-subscriptions nil - "An alist of event names to lists of callbacks to be called for those events. - -These callbacks take the event object and an opaque subcription -object which can be passed to `dart-server--analysis-server-unsubscribe'.") - -(defun dart-server-info (msg) - "Logs MSG to the dart log if `dart-server-debug' is non-nil." - (when dart-server-debug (dart-server-log msg))) - -(defun dart-server-log (msg) - "Logs MSG to the dart log." - (let* ((log-buffer (get-buffer-create "*dart-server-debug*")) - (iso-format-string "%Y-%m-%dT%T%z") - (timestamp-and-log-string - (format-time-string iso-format-string (current-time)))) - (with-current-buffer log-buffer - (goto-char (point-max)) - (insert "\n\n\n") - (insert (concat timestamp-and-log-string - "\n" - msg)) - (insert "\n")))) - -(defun dart-server--normalize-path (path) - (if (equal system-type 'windows-nt) - (replace-regexp-in-string (rx "/") (rx "\\") path) - path)) - -(defun dart-server--start-analysis-server-for-current-buffer () - "Initialize Dart analysis server for current buffer. - -This starts Dart analysis server and adds either the pub root -directory or the current file directory to the analysis roots." - (unless dart-server--analysis-server (dart-server-start-analysis-server)) - ;; TODO(hterkelsen): Add this file to the priority files. - (dart-server-add-analysis-root-for-file) - (add-hook 'first-change-hook #'dart-server-add-analysis-overlay t t) - (add-hook 'after-change-functions #'dart-server-change-analysis-overlay t t) - (add-hook 'after-save-hook #'dart-server-remove-analysis-overlay t t) - (when (boundp 'flycheck-checkers) - (add-to-list 'flycheck-checkers 'dart-server-analysis-server))) - -(defun dart-server-start-analysis-server () - "Start the Dart analysis server. - -Initializes analysis server support for all `dart-server' buffers." - (when dart-server--analysis-server - (-let [process (dart-server--analysis-server-process dart-server--analysis-server)] - (when (process-live-p process) (kill-process process))) - (kill-buffer (dart-server--analysis-server-buffer dart-server--analysis-server))) - - (let* ((process-connection-type nil) - (dart-server-process - (start-process "dart-server-analysis-server" - "*dart-server-analysis-server*" - (dart-server-executable-path) - (dart-server--analysis-server-snapshot-path)))) - (set-process-query-on-exit-flag dart-server-process nil) - (setq dart-server--analysis-server - (dart-server--analysis-server-create dart-server-process))) - - (dolist (buffer (buffer-list)) - (with-current-buffer buffer - (when (bound-and-true-p dart-server) - (dart-server--start-analysis-server-for-current-buffer) - (when (buffer-modified-p buffer) (dart-server-add-analysis-overlay)))))) - -(defun dart-server--analysis-server-create (process) - "Create a Dart analysis server from PROCESS." - (-let [instance (dart-server--make-analysis-server - :process process - :buffer (generate-new-buffer (process-name process)))] - (buffer-disable-undo (dart-server--analysis-server-buffer instance)) - (set-process-filter - process - (lambda (_ string) - (dart-server--analysis-server-process-filter instance string))) - instance)) - -(defun dart-server-add-analysis-overlay () - "Report to the Dart analysis server that it should overlay this buffer. - -The Dart analysis server allows clients to 'overlay' file contents with -a client-supplied string. This is needed because we want Emacs to report -errors for the current contents of the buffer, not whatever is saved to disk." - ;; buffer-file-name can be nil within revert-buffer, but in that case the - ;; buffer is just being reverted to its format on disk anyway. - (when buffer-file-name - (dart-server--analysis-server-send - "analysis.updateContent" - `((files - . ((,(dart-server--normalize-path buffer-file-name) - . ((type . "add") - (content - . ,(save-restriction (widen) (buffer-string))))))))))) - -(defun dart-server-change-analysis-overlay - (change-begin change-end change-before-length) - "Report to analysis server that it should change the overlay for this buffer. - -The region that changed ranges from CHANGE-BEGIN to CHANGE-END, and the -length of the text before the change is CHANGE-BEFORE-LENGTH. See also -`dart-server-add-analysis-overlay'." - (dart-server--analysis-server-send - "analysis.updateContent" - `((files - . ((,(dart-server--normalize-path buffer-file-name) - . ((type . "change") - (edits - . (((offset . ,(- change-begin 1)) - (length . ,change-before-length) - (replacement - . ,(buffer-substring change-begin change-end)))))))))))) - -(defun dart-server-remove-analysis-overlay () - "Remove the overlay for the current buffer since it has been saved. - -See also `dart-server-add-analysis-overlay'." - (dart-server--analysis-server-send - "analysis.updateContent" - `((files . ((,(dart-server--normalize-path buffer-file-name) . ((type . "remove")))))))) - -(defun dart-server-add-analysis-root-for-file (&optional file) - "Add the given FILE's root to the analysis server's analysis roots. - -A file's root is the pub root if it is in a pub package, or the file's directory -otherwise. If no FILE is given, then this will default to the variable -`buffer-file-name'." - (let* ((file-to-add (or file buffer-file-name)) - (pub-root (locate-dominating-file file-to-add "pubspec.yaml")) - (current-dir (file-name-directory file-to-add))) - (if pub-root - (dart-server-add-to-analysis-roots (directory-file-name (expand-file-name pub-root))) - (dart-server-add-to-analysis-roots (directory-file-name (expand-file-name current-dir)))))) - -(defun dart-server-add-to-analysis-roots (dir) - "Add DIR to the analysis server's analysis roots. - -The analysis roots are directories that contain Dart files. The analysis server -analyzes all Dart files under the analysis roots and provides information about -them when requested." - (add-to-list 'dart-server-analysis-roots (dart-server--normalize-path dir)) - (dart-server--send-analysis-roots)) - -(defun dart-server--send-analysis-roots () - "Send the current list of analysis roots to the analysis server." - (dart-server--analysis-server-send - "analysis.setAnalysisRoots" - `(("included" . ,dart-server-analysis-roots) - ("excluded" . nil)))) - -(defun dart-server--analysis-server-send (method &optional params callback) - "Send the METHOD request to the server with optional PARAMS. - -PARAMS should be JSON-encodable. If you provide a CALLBACK, it will be called -with the JSON decoded response. Otherwise, the output will just be checked." - (-let [req-without-id (dart-server--analysis-server-make-request method params)] - (dart-server--analysis-server-enqueue req-without-id callback))) - -(defun dart-server--analysis-server-make-request (method &optional params) - "Construct a request for the analysis server. - -The constructed request will call METHOD with optional PARAMS." - `((method . ,method) (params . ,params))) - -(defun dart-server--analysis-server-on-error-callback (response) - "If RESPONSE has an error, report it." - (-when-let (resp-err (assoc-default 'error response)) - (error "Analysis server error: %s" (assoc-default 'message resp-err)))) - -(defun dart-server--analysis-server-enqueue (req-without-id callback) - "Send REQ-WITHOUT-ID to the analysis server, call CALLBACK with the result." - (setq dart-server--analysis-server-next-id (1+ dart-server--analysis-server-next-id)) - (-let [request - (json-encode (cons (cons 'id (format "%s" dart-server--analysis-server-next-id)) - req-without-id))] - - ;; Enqueue the request so that we can be sure all requests are processed in - ;; order. - (push (cons dart-server--analysis-server-next-id - (or callback #'dart-server--analysis-server-on-error-callback)) - dart-server--analysis-server-callbacks) - - (cond - ((not dart-server--analysis-server) - (message "Starting Dart analysis server.") - (dart-server-start-analysis-server)) - ((not (process-live-p (dart-server--analysis-server-process dart-server--analysis-server))) - (message "Dart analysis server crashed, restarting.") - (dart-server-start-analysis-server))) - - (dart-server-info (concat "Sent: " request)) - (process-send-string (dart-server--analysis-server-process dart-server--analysis-server) - (concat request "\n")))) - -(cl-defun dart-server--analysis-server-process-filter (das string) - "Handle the event or method response from the dart analysis server. - -The server DAS has STRING added to the buffer associated with it. -Method responses are paired according to their pending request and -the callback for that request is given the json decoded response." - (-let [buf (dart-server--analysis-server-buffer das)] - ;; The buffer may have been killed if the server was restarted - (unless (buffer-live-p buf) - (cl-return-from dart-server--analysis-server-process-filter)) - - ;; We use a buffer here because emacs might call the filter before the - ;; entire line has been written out. In this case we store the - ;; unterminated line in a buffer to be read when the rest of the line is - ;; output. - (with-current-buffer buf - (goto-char (point-max)) - (insert string) - (-let [buf-lines (s-lines (buffer-string))] - (delete-region (point-min) (point-max)) - (insert (-last-item buf-lines)) - - (-let [messages - (--filter (and it (not (string-empty-p it))) - (-butlast buf-lines))] - (dolist (message messages) - (dart-server-info (concat "Received: " message)) - (dart-server--analysis-server-handle-msg - (-let [json-array-type 'list] - (json-read-from-string message))))))))) - -(defun dart-server--analysis-server-handle-msg (msg) - "Handle the parsed MSG from the analysis server." - (-if-let* ((raw-id (dart-server--get msg 'id)) - (id (string-to-number raw-id))) - ;; This is a response to a request, so we should invoke a callback in - ;; dart-server--analysis-server-callbacks. - (-if-let (resp-closure (dart-server--get dart-server--analysis-server-callbacks id)) - (progn - (setq dart-server--analysis-server-callbacks - (assq-delete-all id dart-server--analysis-server-callbacks)) - (funcall resp-closure msg)) - (-if-let (err (dart-server--get msg 'error)) - (dart-server--analysis-server-on-error-callback msg) - (dart-server-info (format "No callback was associated with id %s" raw-id)))) - - ;; This is a notification, so we should invoke callbacks in - ;; dart-server--analysis-server-subscriptions. - (-when-let* ((event (dart-server--get msg 'event)) - (params (dart-server--get msg 'params)) - (callbacks (dart-server--get dart-server--analysis-server-subscriptions event))) - (dolist (callback callbacks) - (-let [subscription (cons event callback)] - (funcall callback params subscription)))))) - -(defun dart-server--analysis-server-subscribe (event callback) - "Registers CALLBACK to be called for each EVENT of the given type. - -CALLBACK should take two parameters: the event object and an -opaque subscription object that can be passed to -`dart-server--analysis-server-unsubscribe'. Returns the same opaque -subscription object." - (-if-let (cell (assoc event dart-server--analysis-server-subscriptions)) - (nconc cell (list callback)) - (push (cons event (list callback)) dart-server--analysis-server-subscriptions)) - (cons event callback)) - -(defun dart-server--analysis-server-unsubscribe (subscription) - "Unregisters the analysis server SUBSCRIPTION. - -SUBSCRIPTION is an opaque object provided by -`dart-server--analysis-server-subscribe'." - (-let [(event . callback) subscription] - (delq callback (assoc event dart-server--analysis-server-subscriptions)))) - -;;;; Flycheck Error Reporting - -(defun dart-server--flycheck-start (_ callback) - "Run the CHECKER and report the errors to the CALLBACK." - (dart-server-info (format "Checking syntax for %s" (current-buffer))) - (dart-server--analysis-server-send - "analysis.getErrors" - `((file . ,(dart-server--normalize-path (buffer-file-name)))) - (-let [buffer (current-buffer)] - (lambda (response) - (dart-server--report-errors response buffer callback))))) - -(when (fboundp 'flycheck-define-generic-checker) - (flycheck-define-generic-checker - 'dart-server-analysis-server - "Checks Dart source code for errors using Dart analysis server." - :start 'dart-server--flycheck-start - :modes '(dart-server))) - -(defun dart-server--report-errors (response buffer callback) - "Report the errors returned from the analysis server. - -The errors contained in RESPONSE from Dart analysis server run on BUFFER are -reported to CALLBACK." - (dart-server-info (format "Reporting to flycheck: %s" response)) - (-let [fly-errors (--map (dart-server--to-flycheck-err it buffer) - (dart-server--get response 'result 'errors))] - (dart-server-info (format "Parsed errors: %s" fly-errors)) - (funcall callback 'finished fly-errors))) - -(defun dart-server--to-flycheck-err (err buffer) - "Create a flycheck error from a dart ERR in BUFFER." - (when (fboundp 'flycheck-error-new) - (flycheck-error-new - :buffer buffer - :checker 'dart-server-analysis-server - :filename (dart-server--get err 'location 'file) - :line (dart-server--get err 'location 'startLine) - :column (dart-server--get err 'location 'startColumn) - :message (dart-server--get err 'message) - :level (dart-server--severity-to-level (dart-server--get err 'severity))))) - -(defun dart-server--severity-to-level (severity) - "Convert SEVERITY to a flycheck level." - (cond - ((string= severity "INFO") 'info) - ((string= severity "WARNING") 'warning) - ((string= severity "ERROR") 'error))) - -;;;; Hover - -(defun dart-server-show-hover (&optional show-in-buffer) - "Displays hover information for the current point. - -With a prefix argument, opens a new buffer rather than using the -minibuffer." - (interactive "P") - (-when-let (filename (dart-server--normalize-path (buffer-file-name))) - (let ((show-in-buffer show-in-buffer) - (buffer (current-buffer)) - (pos (point))) - (dart-server--analysis-server-send - "analysis.getHover" - `(("file" . ,filename) ("offset" . ,pos)) - (lambda (response) - (-when-let (hover (car (dart-server--get response 'result 'hovers))) - (dart-server--json-let hover - (offset - length - dartdoc - (element-description elementDescription) - (element-kind elementKind) - (is-deprecated isDeprecated) - parameter) - (setq is-deprecated (not (eq is-deprecated :json-false))) - - ;; Briefly highlight the region that's being shown. - (with-current-buffer buffer - (dart-server--flash-highlight offset length)) - - (with-temp-buffer - (when is-deprecated - (insert (dart-server--face-string "DEPRECATED" 'font-lock-warning-face) ?\n)) - - (when element-description - (insert (dart-server--highlight-description element-description) - (dart-server--face-string (concat " (" element-kind ")") 'italic)) - (when (or dartdoc parameter) (insert ?\n))) - (when parameter - (insert - (dart-server--highlight-description parameter) - (dart-server--face-string " (parameter type)" 'italic)) - (when dartdoc) (insert ?\n)) - (when dartdoc - (when (or element-description parameter) (insert ?\n)) - (insert (dart-server--highlight-dartdoc dartdoc (not show-in-buffer)))) - - (let ((text (buffer-string))) - (if show-in-buffer - (with-current-buffer-window - "*Dart Analysis*" nil nil - (insert text) - (dart-server-popup-mode) - - (setq dart-server--do-it-again-callback - (lambda () - (save-excursion - (with-current-buffer buffer - (goto-char pos) - (dart-server-show-hover t)))))) - (message "%s" text))))))))))) - -(defconst dart-server--highlight-keyword-re - (regexp-opt - '("get" "set" "as" "abstract" "class" "extends" "implements" "enum" "typedef" - "const" "covariant" "deferred" "factory" "final" "import" "library" "new" - "operator" "part" "static" "async" "sync" "var") - 'words) - "A regular expression that matches keywords.") - -(defun dart-server--highlight-description (description) - "Returns a highlighted copy of DESCRIPTION." - (with-temp-buffer - (insert description) - (goto-char (point-min)) - - (while (not (eq (point) (point-max))) - (cond - ;; A keyword. - ((looking-at dart-server--highlight-keyword-re) - (dart-server--fontify-excursion 'font-lock-keyword-face - (goto-char (match-end 0)))) - - ;; An identifier could be a function name or a type name. - ((looking-at dart-server--identifier-re) - (goto-char (match-end 0)) - (put-text-property - (match-beginning 0) (point) 'face - (if (dart-server--at-end-of-function-name-p) 'font-lock-function-name-face - 'font-lock-type-face)) - - (cl-case (char-after) - ;; Foo.bar() - (?. - (forward-char) - (dart-server--fontify-excursion 'font-lock-function-name-face - (dart-server--forward-identifier))) - - ;; Foo bar - (?\s - (forward-char) - (dart-server--fontify-excursion 'font-lock-variable-name-face - (dart-server--forward-identifier))))) - - ;; Anything else is punctuation that we ignore. - (t (forward-char)))) - - (buffer-string))) - -(defun dart-server--at-end-of-function-name-p () - "Returns whether the point is at the end of a function name." - (cl-case (char-after) - (?\( t) - (?< - (and (looking-at (concat "\\(" dart-server--identifier-re "\\|[<>]\\)*")) - (eq (char-after (match-end 0)) ?\())))) - -(defun dart-server--highlight-dartdoc (dartdoc truncate) - "Returns a higlighted copy of DARTDOC." - (with-temp-buffer - (insert dartdoc) - - ;; Cut off long dartdocs so that the full signature is always visible. - (when truncate - (forward-line 11) - (delete-region (- (point) 1) (point-max))) - - (goto-char (point-min)) - - (while (re-search-forward "\\[.*?\\]" nil t) - (put-text-property (match-beginning 0) (match-end 0) - 'face 'font-lock-reference-face)) - - (buffer-string))) - -;;;; Navigation - -(defun dart-server-goto () - (interactive) - (-when-let (filename (dart-server--normalize-path (buffer-file-name))) - (dart-server--analysis-server-send - "analysis.getNavigation" - `(("file" . ,filename) ("offset" . ,(point)) ("length" . 0)) - (lambda (response) - (-when-let (result (dart-server--get response 'result)) - (dart-server--json-let result (files targets regions) - (-when-let (region (car regions)) - (let* ((target-index (car (dart-server--get region 'targets))) - (target (elt targets target-index)) - - (file-index (dart-server--get target 'fileIndex)) - (offset (dart-server--get target 'offset)) - (length (dart-server--get target 'length)) - - (file (elt files file-index))) - (find-file file) - (goto-char (+ 1 offset)) - (dart-server--flash-highlight offset length))))))))) - -;;;; Search - -(defun dart-server-find-refs (pos &optional include-potential) - (interactive "dP") - (-when-let (filename (dart-server--normalize-path (buffer-file-name))) - (dart-server--analysis-server-send - "search.findElementReferences" - `(("file" . ,filename) - ("offset" . ,pos) - ("includePotential" . ,(or include-potential json-false))) - (let ((buffer (current-buffer)) - (include-potential include-potential)) - (lambda (response) - (-when-let (result (dart-server--get response 'result)) - (let ((name (dart-server--get result 'element 'name)) - (location (dart-server--get result 'element 'location))) - (dart-server--display-search-results - (dart-server--get result 'id) - (lambda () - (setq dart-server--do-it-again-callback - (lambda () - (with-current-buffer buffer - (dart-server-find-refs pos include-potential)))) - - (insert "References to ") - (insert-button - name - 'action (lambda (_) (dart-server--goto-location location))) - (insert ":\n\n")))))))))) - -(defun dart-server-find-member-decls (name) - "Find member declarations named NAME." - (interactive "sMember name: ") - (dart-server--find-by-name - "search.findMemberDeclarations" "name" name "Members named ")) - -(defun dart-server-find-member-refs (name) - "Find member references named NAME." - (interactive "sMember name: ") - (dart-server--find-by-name - "search.findMemberReferences" "name" name "References to ")) - -(defun dart-server-find-top-level-decls (name) - "Find top-level declarations named NAME." - (interactive "sDeclaration name: ") - (dart-server--find-by-name - "search.findTopLevelDeclarations" "pattern" name "Declarations matching ")) - -(defun dart-server--find-by-name (method argument name header) - "A helper function for running an analysis server search for NAME. - -Calls the given analysis server METHOD passing NAME to the given -ARGUMENT. Displays a header beginning with HEADER in the results." - (dart-server--analysis-server-send - method - (list (cons argument name)) - (lambda (response) - (-when-let (id (dart-server--get response 'result 'id)) - (dart-server--display-search-results - id - (lambda () - (setq dart-server--do-it-again-callback - (lambda () - (dart-server--find-by-name method argument name header))) - (insert header name ":\n\n"))))))) - -(defun dart-server--display-search-results (search-id callback) - "Displays search results with the given SEARCH-ID. - -CALLBACK is called with no arguments in the search result buffer -to add a header and otherwise prepare it for displaying results." - (let (buffer - beginning-of-results - (total-results 0)) - (with-current-buffer-window - "*Dart Search*" nil nil - (dart-server-popup-mode) - (setq buffer (current-buffer)) - (funcall callback) - (setq beginning-of-results (point)) - - (dart-server--analysis-server-subscribe - "search.results" - (lambda (event subscription) - (with-current-buffer buffer - (dart-server--json-let event (id results (is-last isLast)) - (when (equal id search-id) - (-let [buffer-read-only nil] - (save-excursion - (goto-char (point-max)) - (dolist (result results) - (let ((location (dart-server--get result 'location)) - (path (dart-server--get result 'path)) - (start (point))) - (dart-server--fontify-excursion '(compilation-info underline) - (when (cl-some - (lambda (element) - (equal (dart-server--get element 'kind) "CONSTRUCTOR")) - path) - (insert "new ")) - - (insert - (->> path - (--remove (member (dart-server--get it 'kind) - '("COMPILATION_UNIT" "FILE" "LIBRARY" "PARAMETER"))) - (--map (dart-server--get it 'name)) - (-remove 'string-empty-p) - nreverse - (s-join "."))) - - (make-text-button - start (point) - 'action (lambda (_) (dart-server--goto-location location)))) - - (dart-server--json-let location (file (line startLine) (column startColumn)) - (insert " " file ":" - (dart-server--face-string line 'compilation-line-number) ":" - (dart-server--face-string column 'compilation-column-number) ?\n))))) - - (setq total-results (+ total-results (length results))) - - (when (eq is-last t) - (dart-server--analysis-server-unsubscribe subscription) - (save-excursion - (goto-char (point-max)) - (insert "\nFound " (dart-server--face-string total-results 'bold) " results.")))))))))) - - (select-window (get-buffer-window buffer)) - (goto-char beginning-of-results))) - -(defun dart-server--goto-location (location) - "Sends the user to the analysis server LOCATION." - (dart-server--json-let location (file offset length) - (find-file file) - (goto-char (+ 1 offset)) - (dart-server--flash-highlight offset length))) - -;;;; Auto-complete - -(defcustom dart-server-expand-fallback (key-binding (kbd "M-/")) - "The fallback command to use for `dart-server-expand'. - -This is used when the analysis server isn't available. It -defaults to the command globally bound to M-/." - :group 'dart-server - :type 'function - :package-version '(dart-server . "0.1.0")) - -(defvar dart-server--last-expand-results nil - "The results of the last call to `dart-server-expand'.") - -(defvar dart-server--last-expand-beginning nil - "The marker for the beginning of the text inserted by the last call to `dart-server-expand'.") - -(defvar dart-server--last-expand-end nil - "The marker for the end of the text inserted by the last call to `dart-server-expand'.") - -(defvar dart-server--last-expand-index nil - "The index into `dart-server--last-expand-results' for the last call to `dart-server-expand'.") - -(defvar dart-server--last-expand-parameters-index nil - "The index into for the last parameter suggestion from `dart-server-expand-parameters'. - -This is an index into the paramaterNames and parameterTypes list -in the suggestion identified by `dart-server--last-expand-index', and -into `dart-server--last-expand-parameters-ranges'.") - -(defvar dart-server--last-expand-parameters-ranges nil - "The list of parameter ranges for the last call to `dart-server-expand-parameters'. - -This is a list of pairs of markers. Each pair identifies the -beginning and end of a parameter in the parameter list generated -by `dart-server-expand-parameters'`. - -Note that the end markers are placed one character after the -actual ending of the parameter. This ensures that if the marker -stayas in place when the parameter is overwritten.") - -(defvar dart-server--last-expand-subscription nil - "The last analysis server subscription from a call to `dart-server-expand'.") - -(cl-defun dart-server-expand () - "Expand previous word using Dart's autocompletion." - (interactive "*") - (unless dart-server-enable-analysis-server - (call-interactively dart-server-expand-fallback t) - (cl-return-from dart-server-expand)) - - (when (and (memq last-command '(dart-server-expand dart-server-expand-parameters)) - dart-server--last-expand-results) - (cl-incf dart-server--last-expand-index) - (when (>= dart-server--last-expand-index (length dart-server--last-expand-results)) - (setq dart-server--last-expand-index 0)) - (dart-server--use-expand-suggestion - dart-server--last-expand-beginning - dart-server--last-expand-end - (elt dart-server--last-expand-results dart-server--last-expand-index)) - (cl-return-from dart-server-expand)) - - (when dart-server--last-expand-subscription - (dart-server--analysis-server-unsubscribe dart-server--last-expand-subscription)) - (setq dart-server--last-expand-results nil) - (setq dart-server--last-expand-beginning nil) - (setq dart-server--last-expand-end nil) - (setq dart-server--last-expand-index nil) - (setq dart-server--last-expand-subscription nil) - - (-when-let (filename (dart-server--normalize-path (buffer-file-name))) - (dart-server--analysis-server-send - "completion.getSuggestions" - `(("file" . ,filename) - ("offset" . ,(- (point) 1))) - (let ((buffer (current-buffer)) - (first t)) - (lambda (response) - (-when-let (completion-id (dart-server--get response 'result 'id)) - (dart-server--analysis-server-subscribe - "completion.results" - (setq dart-server--last-expand-subscription - (lambda (event subscription) - (dart-server--json-let event - (id results - (offset replacementOffset) - (length replacementLength) - (is-last isLast)) - (when is-last (dart-server--analysis-server-unsubscribe subscription)) - - (when (equal id completion-id) - (with-current-buffer buffer - (dart-server--handle-completion-event results offset length first)) - (setq first nil)))))))))))) - -(defun dart-server--handle-completion-event (results offset length first) - "Handles a completion results event. - -If FIRST is non-nil, this is the first completion event for this completion." - ;; Get rid of any suggestions that don't match existing characters. The - ;; analysis server provides extra suggestions to support search-as-you-type, - ;; but we don't do that. - (when (> length 0) - (-let [text (buffer-substring (+ offset 1) (+ offset length 1))] - (setq results - (--remove (string-prefix-p text (dart-server--get it 'completion) t) - results)))) - - (when (> (length results) 0) - ;; Fill the first result so the first call does something. Just save later - ;; results for future calls. - (when first - (setq dart-server--last-expand-index 0) - (setq dart-server--last-expand-beginning (copy-marker (+ offset 1))) - (dart-server--use-expand-suggestion (+ offset 1) (+ offset length 1) (car results))) - - (setq first nil) - (setq dart-server--last-expand-results results))) - -(defun dart-server--use-expand-suggestion (beginning end suggestion) - "Inserts SUGGESTION between BEGINNING and END." - (dart-server--json-let suggestion - (completion element - (selection-offset selectionOffset) - (is-deprecated isDeprecated) - (doc-summary docSummary)) - (goto-char beginning) - (delete-region beginning end) - (save-excursion - (insert completion) - (setq dart-server--last-expand-end (point-marker))) - (forward-char selection-offset) - - (with-temp-buffer - (when (eq is-deprecated t) - (insert (dart-server--face-string "DEPRECATED" 'font-lock-warning-face) ?\n)) - - (insert (dart-server--highlight-description (dart-server--description-of-element element))) - (when doc-summary - (insert ?\n ?\n (dart-server--highlight-dartdoc doc-summary nil))) - - (message "%s" (buffer-string))))) - -(defun dart-server--description-of-element (element) - "Returns a textual description of an analysis server ELEMENT." - (dart-server--json-let element - (kind name parameters - (return-type returnType) - (type-parameters typeParameters)) - (with-temp-buffer - (if (equal kind "CONSTRUCTOR") - (progn - (insert "new " return-type) - (unless (string-empty-p name) - (insert "." name)) - (insert parameters) - (insert " → " return-type)) - - (cl-case kind - ("GETTER" (insert "get ")) - ("SETTER" (insert "set "))) - (insert name) - (when type-parameters (insert type-parameters)) - (when parameters (insert parameters)) - (when return-type (insert " → " return-type))) - (buffer-string)))) - -(cl-defun dart-server-expand-parameters () - "Adds parameters to the currently-selected `dart-server-expand' completion. - -This will select the first parameter, if one exists." - (interactive "*") - (cond - ((and (eq last-command 'dart-server-expand) - dart-server--last-expand-results) - - ;; If this is called directly after `dart-server-expand', create the parameter list - ;; and highlight the first entry. - (setq dart-server--last-expand-parameters-index 0) - (dart-server--json-let (elt dart-server--last-expand-results dart-server--last-expand-index) - ((parameter-names parameterNames) - (argument-string defaultArgumentListString) - (argument-ranges defaultArgumentListTextRanges)) - (unless parameter-names (cl-return-from dart-server-expand-parameters)) - - (unless argument-string - (insert ?\() - (save-excursion - (insert ?\)) - (setq dart-server--last-expand-end (point-marker))) - (cl-return-from dart-server-expand-parameters)) - - (save-excursion - (insert ?\( argument-string ?\)) - (setq dart-server--last-expand-end (point-marker))) - - (setq dart-server--last-expand-parameters-ranges - (cl-loop for i below (length argument-ranges) by 2 - collect (let* ((beginning (+ (point) 1 (elt argument-ranges i))) - (end (+ beginning (elt argument-ranges (+ i 1)) 1))) - (list (copy-marker beginning) (copy-marker end))))) - - (dart-server--expand-select-parameter))) - - ((and (< dart-server--last-expand-beginning (point) dart-server--last-expand-end) - dart-server--last-expand-parameters-index) - - ;; If this is called when the point is within the text generated by the - ;; last `dart-server-expand-parameters' call, move to the next parameter in the - ;; list. - (cl-incf dart-server--last-expand-parameters-index) - (when (>= dart-server--last-expand-parameters-index (length dart-server--last-expand-parameters-ranges)) - (setq dart-server--last-expand-parameters-index 0)) - - (dart-server--expand-select-parameter)))) - -(defun dart-server--expand-select-parameter () - "Selects the parameter indicated by expansion variables." - (-let [(beginning end) (elt dart-server--last-expand-parameters-ranges - dart-server--last-expand-parameters-index)] - (dart-server--delsel-range beginning (- end 1))) - - (dart-server--json-let (elt dart-server--last-expand-results dart-server--last-expand-index) - ((parameter-names parameterNames) - (parameter-types parameterTypes)) - (message "%s" (dart-server--highlight-description - (concat (elt parameter-types dart-server--last-expand-parameters-index) " " - (elt parameter-names dart-server--last-expand-parameters-index)))))) - -(defun dart-server--delsel-range (beginning end) - "Highlights the range between BEGINNING and END and enables `delete-selection-mode' temporarily." - (setq transient-mark-mode nil) - (goto-char beginning) - (push-mark nil t) - (goto-char end) - - ;; Run this in a timer because `activate-mark' doesn't seem to work - ;; directly, and because we don't want to disable `delete-selection-mode' - ;; when `post-command-hook' is invoked after the calling command finishes. - (run-at-time - "0 sec" nil - (lambda () - (activate-mark) - - ;; Overwrite the current selection, but don't globally enable - ;; delete-selection-mode. - (unless delete-selection-mode - (delete-selection-mode 1) - (add-hook 'post-command-hook #'dart-server--disable-delsel t t))))) - -(defun dart-server--disable-delsel () - "Disables `delete-selection-mode' and deactivates the mark. - -Also removes this function from `post-command-hook'." - (deactivate-mark) - (delete-selection-mode 0) - (remove-hook 'post-command-hook 'dart-server--disable-delsel t)) - - -;;; Popup Mode - -(define-derived-mode dart-server-popup-mode fundamental-mode "DartPopup" - "Major mode for popups." - :mode 'dart-server-popup - (use-local-map dart-server-popup-mode-map)) - -(put 'dart-server-popup-mode 'mode-class 'special) - -(defvar dart-server-popup-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map help-mode-map) - (define-key map (kbd "g") 'dart-server-do-it-again) - ;; Unbind help-specific keys. - (define-key map (kbd "RET") nil) - (define-key map (kbd "l") nil) - (define-key map (kbd "r") nil) - (define-key map (kbd "") nil) - (define-key map (kbd "") nil) - (define-key map (kbd "") nil) - (define-key map (kbd "C-c C-b") nil) - (define-key map (kbd "C-c C-c") nil) - (define-key map (kbd "C-c C-f") nil) - map) - "Keymap used in Dart popup buffers.") - -(defun dart-server-do-it-again () - "Re-runs the logic that generated the current buffer." - (interactive) - (when dart-server--do-it-again-callback - (funcall dart-server--do-it-again-callback))) - - -;;; Formatting - -(defcustom dart-server-formatter-command-override nil - "The command for running the Dart formatter. - -Don't read this variable; call `dart-server-formatter-command' instead." - :type 'string - :group 'dart-server - :package-version '(dart-server . "0.1.0")) - -(defcustom dart-server-formatter-line-length 80 - "The line length to use when running the Dart formatter." - :type 'integer - :group 'dart-server - :package-version '(dart-server . "0.1.0")) - -(defcustom dart-server-format-on-save nil - "Whether to run the Dart formatter before saving." - :type 'boolean - :group 'dart-server - :package-version '(dart-server . "0.1.0")) - -(defcustom dart-server-formatter-show-errors 'buffer - "Where to display Dart formatter error output. -It can either be displayed in its own buffer, in the echo area, or not at all. - -Please note that Emacs outputs to the echo area when writing -files and will overwrite the formatter's echo output if used from -inside a `before-save-hook'." - :type '(choice - (const :tag "Own buffer" buffer) - (const :tag "Echo area" echo) - (const :tag "None" nil)) - :group 'dart-server) - -(defun dart-server-formatter-command () - "The command for running the Dart formatter. - -This can be customized by setting `dart-server-formatter-command-override'." - (or dart-server-formatter-command-override - (when dart-server-sdk-path - (concat dart-server-sdk-path - (file-name-as-directory "bin") - "dartfmt")))) - -(defvar dart-server--formatter-compilation-regexp - '("^line \\([0-9]+\\), column \\([0-9]+\\) of \\([^ \n]+\\):" 3 1 2) - "Regular expresion to match errors in the formatter's output. -See `compilation-error-regexp-alist' for help on their format.") - -(add-to-list 'compilation-error-regexp-alist-alist - (cons 'dart-server-formatter dart-server--formatter-compilation-regexp)) -(add-to-list 'compilation-error-regexp-alist 'dart-server-formatter) - -(cl-defun dart-server-format () - "Format the current buffer using the Dart formatter. - -By default, this uses the formatter in `dart-server-sdk-path'. However, -this can be overridden by customizing -`dart-server-formatter-command-override'." - (interactive) - (let* ((file (make-temp-file "format" nil ".dart")) - (patch-buffer (get-buffer-create "*Dart formatter patch*")) - (error-buffer (when dart-server-formatter-show-errors - (get-buffer-create "*Dart formatter errors*"))) - (coding-system-for-read 'utf-8) - (coding-system-for-write 'utf-8) - (args `("--line-length" ,(number-to-string dart-server-formatter-line-length) - "--overwrite" ,file))) - (unwind-protect - (save-restriction - (widen) - - (when error-buffer - (with-current-buffer error-buffer - (setq buffer-read-only nil) - (erase-buffer))) - - (write-region nil nil file nil 'no-message) - (dart-server-info (format "%s %s" (dart-server-formatter-command) args)) - - (unless (zerop (apply #'call-process (dart-server-formatter-command) nil error-buffer nil args)) - (message "Formatting failed") - (when error-buffer - (dart-server--formatter-show-errors error-buffer file (buffer-file-name))) - (cl-return-from dart-server-format)) - - ;; Apply the format as a diff so that only portions of the buffer that - ;; actually change are marked as modified. - (if (zerop (call-process-region (point-min) (point-max) - "diff" nil patch-buffer nil "--rcs" "-" file)) - (message "Buffer is already formatted") - (dart-server--apply-rcs-patch patch-buffer) - (message "Formatted buffer")) - (when error-buffer (dart-server--kill-buffer-and-window error-buffer))) - (kill-buffer patch-buffer) - (delete-file file)))) - -(defun dart-server--do-format-on-save () - "Format the buffer if `dart-server-format-on-save' is non-nil." - (when dart-server-format-on-save - (dart-server-format))) - -(defun dart-server--apply-rcs-patch (patch-buffer) - "Apply an RCS diff from PATCH-BUFFER to the current buffer." - (let ((target-buffer (current-buffer)) - ;; The relative offset between line numbers in the buffer and in patch. - ;; - ;; Line numbers in the patch are based on the source file, so we have to - ;; keep an offset when making changes to the buffer. - ;; - ;; Appending lines decrements the offset (possibly making it negative), - ;; deleting lines increments it. This order simplifies the forward-line - ;; invocations. - (line-offset 0)) - (save-excursion - (with-current-buffer patch-buffer - (goto-char (point-min)) - (while (not (eobp)) - (unless (looking-at "^\\([ad]\\)\\([0-9]+\\) \\([0-9]+\\)") - (error "Invalid RCS patch or internal error in dart-server--apply-rcs-patch")) - - (forward-line) - (let ((action (match-string 1)) - (from (string-to-number (match-string 2))) - (len (string-to-number (match-string 3)))) - (cond - ((equal action "a") - (-let [start (point)] - (forward-line len) - (-let [text (buffer-substring start (point))] - (with-current-buffer target-buffer - (cl-decf line-offset len) - (goto-char (point-min)) - (forward-line (- from len line-offset)) - (insert text))))) - - ((equal action "d") - (with-current-buffer target-buffer - (goto-char (point-min)) - (forward-line (- from line-offset 1)) - (cl-incf line-offset len) - (dart-server--delete-whole-line len))) - - (t - (error "Invalid RCS patch or internal error in dart-server--apply-rcs-patch"))))))))) - -(defun dart-server--formatter-show-errors (error-buffer temp-file real-file) - "Display formatter errors in `error-buffer'. -This replaces references to TEMP-FILE with REAL-FILE." - (with-current-buffer error-buffer - (-let [echo (eq dart-server-formatter-show-errors 'echo)] - (goto-char (point-min)) - (-let [regexp (concat "\\(" (regexp-quote temp-file) "\\):")] - (while (search-forward-regexp regexp nil t) - (replace-match (file-name-nondirectory real-file) t t nil 1))) - - (if echo - (progn - (message "%s" (buffer-string)) - (dart-server--kill-buffer-and-window error-buffer)) - (compilation-mode) - (temp-buffer-window-show error-buffer) - (select-window (get-buffer-window error-buffer)))))) - - -;;; Initialization - -;;;###autoload -(define-minor-mode dart-server nil nil nil nil - (if dart-server - (add-hook 'before-save-hook #'dart-server--do-format-on-save nil t) - (remove-hook 'before-save-hook #'dart-server--do-format-on-save t))) - -(provide 'dart-server) - -;;; dart-server.el ends here diff --git a/elpa/dart-server-20190817.1254/dart-server.elc b/elpa/dart-server-20190817.1254/dart-server.elc deleted file mode 100644 index 752076b85a4503a65376ce9d1011765ca567b2b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55567 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 z

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 diff --git a/elpa/dart-server-readme.txt b/elpa/dart-server-readme.txt deleted file mode 100644 index 9d367996..00000000 --- a/elpa/dart-server-readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -Minor mode for editing Dart files. - -Provides dart server features, such as formatting, analysis, -flycheck, etc. diff --git a/elpa/dash-20200119.2310/dash-autoloads.el b/elpa/dash-20200119.2310/dash-autoloads.el deleted file mode 100644 index c5e79028..00000000 --- a/elpa/dash-20200119.2310/dash-autoloads.el +++ /dev/null @@ -1,26 +0,0 @@ -;;; dash-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dash" "dash.el" (0 0 0 0)) -;;; Generated autoloads from dash.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dash" '("dash-" "-keep" "-butlast" "-non" "-only-some" "-zip" "-e" "->" "-a" "-gr" "-when-let" "-d" "-l" "-s" "-p" "-r" "-m" "-i" "-f" "-u" "-value-to-list" "-t" "--" "-c" "!cons" "!cdr"))) - -;;;*** - -;;;### (autoloads nil nil ("dash-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dash-autoloads.el ends here diff --git a/elpa/dash-20200119.2310/dash-pkg.el b/elpa/dash-20200119.2310/dash-pkg.el deleted file mode 100644 index 91f8535f..00000000 --- a/elpa/dash-20200119.2310/dash-pkg.el +++ /dev/null @@ -1,9 +0,0 @@ -(define-package "dash" "20200119.2310" "A modern list library for Emacs" 'nil :keywords - '("lists") - :authors - '(("Magnar Sveen" . "magnars@gmail.com")) - :maintainer - '("Magnar Sveen" . "magnars@gmail.com")) -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/dash-20200119.2310/dash.el b/elpa/dash-20200119.2310/dash.el deleted file mode 100644 index bc713ce2..00000000 --- a/elpa/dash-20200119.2310/dash.el +++ /dev/null @@ -1,3072 +0,0 @@ -;;; dash.el --- A modern list library for Emacs -*- lexical-binding: t -*- - -;; Copyright (C) 2012-2016 Free Software Foundation, Inc. - -;; Author: Magnar Sveen -;; Version: 2.17.0 -;; Keywords: lists - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; A modern list api for Emacs. -;; -;; See documentation on https://github.com/magnars/dash.el#functions -;; -;; **Please note** The lexical binding in this file is not utilised at the -;; moment. We will take full advantage of lexical binding in an upcoming 3.0 -;; release of Dash. In the meantime, we've added the pragma to avoid a bug that -;; you can read more about in https://github.com/magnars/dash.el/issues/130. -;; - -;;; Code: - -;; TODO: `gv' was introduced in Emacs 24.3, so remove this and all -;; calls to `defsetf' when support for earlier versions is dropped. -(eval-when-compile - (unless (fboundp 'gv-define-setter) - (require 'cl))) - -(defgroup dash () - "Customize group for dash.el" - :group 'lisp - :prefix "dash-") - -(defun dash--enable-fontlock (symbol value) - (when value - (dash-enable-font-lock)) - (set-default symbol value)) - -(defcustom dash-enable-fontlock nil - "If non-nil, enable fontification of dash functions, macros and -special values." - :type 'boolean - :set 'dash--enable-fontlock - :group 'dash) - -(defmacro !cons (car cdr) - "Destructive: Set CDR to the cons of CAR and CDR." - `(setq ,cdr (cons ,car ,cdr))) - -(defmacro !cdr (list) - "Destructive: Set LIST to the cdr of LIST." - `(setq ,list (cdr ,list))) - -(defmacro --each (list &rest body) - "Anaphoric form of `-each'." - (declare (debug (form body)) - (indent 1)) - (let ((l (make-symbol "list"))) - `(let ((,l ,list) - (it-index 0)) - (while ,l - (let ((it (car ,l))) - ,@body) - (setq it-index (1+ it-index)) - (!cdr ,l))))) - -(defmacro -doto (eval-initial-value &rest forms) - "Eval a form, then insert that form as the 2nd argument to other forms. -The EVAL-INITIAL-VALUE form is evaluated once. Its result is -passed to FORMS, which are then evaluated sequentially. Returns -the target form." - (declare (indent 1)) - (let ((retval (make-symbol "value"))) - `(let ((,retval ,eval-initial-value)) - ,@(mapcar (lambda (form) - (if (sequencep form) - `(,(-first-item form) ,retval ,@(cdr form)) - `(funcall form ,retval))) - forms) - ,retval))) - -(defmacro --doto (eval-initial-value &rest forms) - "Anaphoric form of `-doto'. -Note: `it' is not required in each form." - (declare (indent 1)) - `(let ((it ,eval-initial-value)) - ,@forms - it)) - -(defun -each (list fn) - "Call FN with every item in LIST. Return nil, used for side-effects only." - (--each list (funcall fn it))) - -(put '-each 'lisp-indent-function 1) - -(defalias '--each-indexed '--each) - -(defun -each-indexed (list fn) - "Call (FN index item) for each item in LIST. - -In the anaphoric form `--each-indexed', the index is exposed as symbol `it-index'. - -See also: `-map-indexed'." - (--each list (funcall fn it-index it))) -(put '-each-indexed 'lisp-indent-function 1) - -(defmacro --each-while (list pred &rest body) - "Anaphoric form of `-each-while'." - (declare (debug (form form body)) - (indent 2)) - (let ((l (make-symbol "list")) - (c (make-symbol "continue"))) - `(let ((,l ,list) - (,c t) - (it-index 0)) - (while (and ,l ,c) - (let ((it (car ,l))) - (if (not ,pred) (setq ,c nil) ,@body)) - (setq it-index (1+ it-index)) - (!cdr ,l))))) - -(defun -each-while (list pred fn) - "Call FN with every item in LIST while (PRED item) is non-nil. -Return nil, used for side-effects only." - (--each-while list (funcall pred it) (funcall fn it))) - -(put '-each-while 'lisp-indent-function 2) - -(defmacro --each-r (list &rest body) - "Anaphoric form of `-each-r'." - (declare (debug (form body)) - (indent 1)) - (let ((v (make-symbol "vector"))) - ;; Implementation note: building vector is considerably faster - ;; than building a reversed list (vector takes less memory, so - ;; there is less GC), plus length comes naturally. In-place - ;; 'nreverse' would be faster still, but BODY would be able to see - ;; that, even if modification was reversed before we return. - `(let* ((,v (vconcat ,list)) - (it-index (length ,v)) - it) - (while (> it-index 0) - (setq it-index (1- it-index)) - (setq it (aref ,v it-index)) - ,@body)))) - -(defun -each-r (list fn) - "Call FN with every item in LIST in reversed order. - Return nil, used for side-effects only." - (--each-r list (funcall fn it))) - -(defmacro --each-r-while (list pred &rest body) - "Anaphoric form of `-each-r-while'." - (declare (debug (form form body)) - (indent 2)) - (let ((v (make-symbol "vector"))) - `(let* ((,v (vconcat ,list)) - (it-index (length ,v)) - it) - (while (> it-index 0) - (setq it-index (1- it-index)) - (setq it (aref ,v it-index)) - (if (not ,pred) - (setq it-index -1) - ,@body))))) - -(defun -each-r-while (list pred fn) - "Call FN with every item in reversed LIST while (PRED item) is non-nil. -Return nil, used for side-effects only." - (--each-r-while list (funcall pred it) (funcall fn it))) - -(defmacro --dotimes (num &rest body) - "Repeatedly executes BODY (presumably for side-effects) with symbol `it' bound to integers from 0 through NUM-1." - (declare (debug (form body)) - (indent 1)) - (let ((n (make-symbol "num"))) - `(let ((,n ,num) - (it 0)) - (while (< it ,n) - ,@body - (setq it (1+ it)))))) - -(defun -dotimes (num fn) - "Repeatedly calls FN (presumably for side-effects) passing in integers from 0 through NUM-1." - (--dotimes num (funcall fn it))) - -(put '-dotimes 'lisp-indent-function 1) - -(defun -map (fn list) - "Return a new list consisting of the result of applying FN to the items in LIST." - (mapcar fn list)) - -(defmacro --map (form list) - "Anaphoric form of `-map'." - (declare (debug (form form))) - `(mapcar (lambda (it) ,form) ,list)) - -(defmacro --reduce-from (form initial-value list) - "Anaphoric form of `-reduce-from'." - (declare (debug (form form form))) - `(let ((acc ,initial-value)) - (--each ,list (setq acc ,form)) - acc)) - -(defun -reduce-from (fn initial-value list) - "Return the result of applying FN to INITIAL-VALUE and the -first item in LIST, then applying FN to that result and the 2nd -item, etc. If LIST contains no items, return INITIAL-VALUE and -do not call FN. - -In the anaphoric form `--reduce-from', the accumulated value is -exposed as symbol `acc'. - -See also: `-reduce', `-reduce-r'" - (--reduce-from (funcall fn acc it) initial-value list)) - -(defmacro --reduce (form list) - "Anaphoric form of `-reduce'." - (declare (debug (form form))) - (let ((lv (make-symbol "list-value"))) - `(let ((,lv ,list)) - (if ,lv - (--reduce-from ,form (car ,lv) (cdr ,lv)) - (let (acc it) ,form))))) - -(defun -reduce (fn list) - "Return the result of applying FN to the first 2 items in LIST, -then applying FN to that result and the 3rd item, etc. If LIST -contains no items, return the result of calling FN with no -arguments. If LIST contains a single item, return that item -and do not call FN. - -In the anaphoric form `--reduce', the accumulated value is -exposed as symbol `acc'. - -See also: `-reduce-from', `-reduce-r'" - (if list - (-reduce-from fn (car list) (cdr list)) - (funcall fn))) - -(defmacro --reduce-r-from (form initial-value list) - "Anaphoric version of `-reduce-r-from'." - (declare (debug (form form form))) - `(--reduce-from ,form ,initial-value (reverse ,list))) - -(defun -reduce-r-from (fn initial-value list) - "Replace conses with FN, nil with INITIAL-VALUE and evaluate -the resulting expression. If LIST is empty, INITIAL-VALUE is -returned and FN is not called. - -Note: this function works the same as `-reduce-from' but the -operation associates from right instead of from left. - -See also: `-reduce-r', `-reduce'" - (--reduce-r-from (funcall fn it acc) initial-value list)) - -(defmacro --reduce-r (form list) - "Anaphoric version of `-reduce-r'." - (declare (debug (form form))) - `(--reduce ,form (reverse ,list))) - -(defun -reduce-r (fn list) - "Replace conses with FN and evaluate the resulting expression. -The final nil is ignored. If LIST contains no items, return the -result of calling FN with no arguments. If LIST contains a single -item, return that item and do not call FN. - -The first argument of FN is the new item, the second is the -accumulated value. - -Note: this function works the same as `-reduce' but the operation -associates from right instead of from left. - -See also: `-reduce-r-from', `-reduce'" - (if list - (--reduce-r (funcall fn it acc) list) - (funcall fn))) - -(defun -reductions-from (fn init list) - "Return a list of the intermediate values of the reduction. - -See `-reduce-from' for explanation of the arguments. - -See also: `-reductions', `-reductions-r', `-reduce-r'" - (nreverse (--reduce-from (cons (funcall fn (car acc) it) acc) (list init) list))) - -(defun -reductions (fn list) - "Return a list of the intermediate values of the reduction. - -See `-reduce' for explanation of the arguments. - -See also: `-reductions-from', `-reductions-r', `-reduce-r'" - (and list (-reductions-from fn (car list) (cdr list)))) - -(defun -reductions-r-from (fn init list) - "Return a list of the intermediate values of the reduction. - -See `-reduce-r-from' for explanation of the arguments. - -See also: `-reductions-r', `-reductions', `-reduce'" - (--reduce-r-from (cons (funcall fn it (car acc)) acc) (list init) list)) - -(defun -reductions-r (fn list) - "Return a list of the intermediate values of the reduction. - -See `-reduce-r' for explanation of the arguments. - -See also: `-reductions-r-from', `-reductions', `-reduce'" - (when list - (let ((rev (reverse list))) - (--reduce-from (cons (funcall fn it (car acc)) acc) - (list (car rev)) - (cdr rev))))) - -(defmacro --filter (form list) - "Anaphoric form of `-filter'. - -See also: `--remove'." - (declare (debug (form form))) - (let ((r (make-symbol "result"))) - `(let (,r) - (--each ,list (when ,form (!cons it ,r))) - (nreverse ,r)))) - -(defun -filter (pred list) - "Return a new list of the items in LIST for which PRED returns a non-nil value. - -Alias: `-select' - -See also: `-keep', `-remove'." - (--filter (funcall pred it) list)) - -(defalias '-select '-filter) -(defalias '--select '--filter) - -(defmacro --remove (form list) - "Anaphoric form of `-remove'. - -See also `--filter'." - (declare (debug (form form))) - `(--filter (not ,form) ,list)) - -(defun -remove (pred list) - "Return a new list of the items in LIST for which PRED returns nil. - -Alias: `-reject' - -See also: `-filter'." - (--remove (funcall pred it) list)) - -(defalias '-reject '-remove) -(defalias '--reject '--remove) - -(defun -remove-first (pred list) - "Return a new list with the first item matching PRED removed. - -Alias: `-reject-first' - -See also: `-remove', `-map-first'" - (let (front) - (while (and list (not (funcall pred (car list)))) - (push (car list) front) - (!cdr list)) - (if list - (-concat (nreverse front) (cdr list)) - (nreverse front)))) - -(defmacro --remove-first (form list) - "Anaphoric form of `-remove-first'." - (declare (debug (form form))) - `(-remove-first (lambda (it) ,form) ,list)) - -(defalias '-reject-first '-remove-first) -(defalias '--reject-first '--remove-first) - -(defun -remove-last (pred list) - "Return a new list with the last item matching PRED removed. - -Alias: `-reject-last' - -See also: `-remove', `-map-last'" - (nreverse (-remove-first pred (reverse list)))) - -(defmacro --remove-last (form list) - "Anaphoric form of `-remove-last'." - (declare (debug (form form))) - `(-remove-last (lambda (it) ,form) ,list)) - -(defalias '-reject-last '-remove-last) -(defalias '--reject-last '--remove-last) - -(defun -remove-item (item list) - "Remove all occurrences of ITEM from LIST. - -Comparison is done with `equal'." - (declare (pure t) (side-effect-free t)) - (--remove (equal it item) list)) - -(defmacro --keep (form list) - "Anaphoric form of `-keep'." - (declare (debug (form form))) - (let ((r (make-symbol "result")) - (m (make-symbol "mapped"))) - `(let (,r) - (--each ,list (let ((,m ,form)) (when ,m (!cons ,m ,r)))) - (nreverse ,r)))) - -(defun -keep (fn list) - "Return a new list of the non-nil results of applying FN to the items in LIST. - -If you want to select the original items satisfying a predicate use `-filter'." - (--keep (funcall fn it) list)) - -(defun -non-nil (list) - "Return all non-nil elements of LIST." - (declare (pure t) (side-effect-free t)) - (-remove 'null list)) - -(defmacro --map-indexed (form list) - "Anaphoric form of `-map-indexed'." - (declare (debug (form form))) - (let ((r (make-symbol "result"))) - `(let (,r) - (--each ,list - (!cons ,form ,r)) - (nreverse ,r)))) - -(defun -map-indexed (fn list) - "Return a new list consisting of the result of (FN index item) for each item in LIST. - -In the anaphoric form `--map-indexed', the index is exposed as symbol `it-index'. - -See also: `-each-indexed'." - (--map-indexed (funcall fn it-index it) list)) - -(defmacro --map-when (pred rep list) - "Anaphoric form of `-map-when'." - (declare (debug (form form form))) - (let ((r (make-symbol "result"))) - `(let (,r) - (--each ,list (!cons (if ,pred ,rep it) ,r)) - (nreverse ,r)))) - -(defun -map-when (pred rep list) - "Return a new list where the elements in LIST that do not match the PRED function -are unchanged, and where the elements in LIST that do match the PRED function are mapped -through the REP function. - -Alias: `-replace-where' - -See also: `-update-at'" - (--map-when (funcall pred it) (funcall rep it) list)) - -(defalias '-replace-where '-map-when) -(defalias '--replace-where '--map-when) - -(defun -map-first (pred rep list) - "Replace first item in LIST satisfying PRED with result of REP called on this item. - -See also: `-map-when', `-replace-first'" - (let (front) - (while (and list (not (funcall pred (car list)))) - (push (car list) front) - (!cdr list)) - (if list - (-concat (nreverse front) (cons (funcall rep (car list)) (cdr list))) - (nreverse front)))) - -(defmacro --map-first (pred rep list) - "Anaphoric form of `-map-first'." - `(-map-first (lambda (it) ,pred) (lambda (it) (ignore it) ,rep) ,list)) - -(defun -map-last (pred rep list) - "Replace last item in LIST satisfying PRED with result of REP called on this item. - -See also: `-map-when', `-replace-last'" - (nreverse (-map-first pred rep (reverse list)))) - -(defmacro --map-last (pred rep list) - "Anaphoric form of `-map-last'." - `(-map-last (lambda (it) ,pred) (lambda (it) (ignore it) ,rep) ,list)) - -(defun -replace (old new list) - "Replace all OLD items in LIST with NEW. - -Elements are compared using `equal'. - -See also: `-replace-at'" - (declare (pure t) (side-effect-free t)) - (--map-when (equal it old) new list)) - -(defun -replace-first (old new list) - "Replace the first occurrence of OLD with NEW in LIST. - -Elements are compared using `equal'. - -See also: `-map-first'" - (declare (pure t) (side-effect-free t)) - (--map-first (equal old it) new list)) - -(defun -replace-last (old new list) - "Replace the last occurrence of OLD with NEW in LIST. - -Elements are compared using `equal'. - -See also: `-map-last'" - (declare (pure t) (side-effect-free t)) - (--map-last (equal old it) new list)) - -(defmacro --mapcat (form list) - "Anaphoric form of `-mapcat'." - (declare (debug (form form))) - `(apply 'append (--map ,form ,list))) - -(defun -mapcat (fn list) - "Return the concatenation of the result of mapping FN over LIST. -Thus function FN should return a list." - (--mapcat (funcall fn it) list)) - -(defun -flatten (l) - "Take a nested list L and return its contents as a single, flat list. - -Note that because `nil' represents a list of zero elements (an -empty list), any mention of nil in L will disappear after -flattening. If you need to preserve nils, consider `-flatten-n' -or map them to some unique symbol and then map them back. - -Conses of two atoms are considered \"terminals\", that is, they -aren't flattened further. - -See also: `-flatten-n'" - (declare (pure t) (side-effect-free t)) - (if (and (listp l) (listp (cdr l))) - (-mapcat '-flatten l) - (list l))) - -(defmacro --iterate (form init n) - "Anaphoric version of `-iterate'." - (declare (debug (form form form))) - `(-iterate (lambda (it) ,form) ,init ,n)) - -(defun -flatten-n (num list) - "Flatten NUM levels of a nested LIST. - -See also: `-flatten'" - (declare (pure t) (side-effect-free t)) - (-last-item (--iterate (--mapcat (-list it) it) list (1+ num)))) - -(defun -concat (&rest lists) - "Return a new list with the concatenation of the elements in the supplied LISTS." - (declare (pure t) (side-effect-free t)) - (apply 'append lists)) - -(defalias '-copy 'copy-sequence - "Create a shallow copy of LIST. - -\(fn LIST)") - -(defun -splice (pred fun list) - "Splice lists generated by FUN in place of elements matching PRED in LIST. - -FUN takes the element matching PRED as input. - -This function can be used as replacement for `,@' in case you -need to splice several lists at marked positions (for example -with keywords). - -See also: `-splice-list', `-insert-at'" - (let (r) - (--each list - (if (funcall pred it) - (let ((new (funcall fun it))) - (--each new (!cons it r))) - (!cons it r))) - (nreverse r))) - -(defmacro --splice (pred form list) - "Anaphoric form of `-splice'." - `(-splice (lambda (it) ,pred) (lambda (it) ,form) ,list)) - -(defun -splice-list (pred new-list list) - "Splice NEW-LIST in place of elements matching PRED in LIST. - -See also: `-splice', `-insert-at'" - (-splice pred (lambda (_) new-list) list)) - -(defmacro --splice-list (pred new-list list) - "Anaphoric form of `-splice-list'." - `(-splice-list (lambda (it) ,pred) ,new-list ,list)) - -(defun -cons* (&rest args) - "Make a new list from the elements of ARGS. - -The last 2 members of ARGS are used as the final cons of the -result so if the final member of ARGS is not a list the result is -a dotted list." - (declare (pure t) (side-effect-free t)) - (-reduce-r 'cons args)) - -(defun -snoc (list elem &rest elements) - "Append ELEM to the end of the list. - -This is like `cons', but operates on the end of list. - -If ELEMENTS is non nil, append these to the list as well." - (-concat list (list elem) elements)) - -(defmacro --first (form list) - "Anaphoric form of `-first'." - (declare (debug (form form))) - (let ((n (make-symbol "needle"))) - `(let (,n) - (--each-while ,list (not ,n) - (when ,form (setq ,n it))) - ,n))) - -(defun -first (pred list) - "Return the first x in LIST where (PRED x) is non-nil, else nil. - -To get the first item in the list no questions asked, use `car'. - -Alias: `-find'" - (--first (funcall pred it) list)) - -(defalias '-find '-first) -(defalias '--find '--first) - -(defmacro --some (form list) - "Anaphoric form of `-some'." - (declare (debug (form form))) - (let ((n (make-symbol "needle"))) - `(let (,n) - (--each-while ,list (not ,n) - (setq ,n ,form)) - ,n))) - -(defun -some (pred list) - "Return (PRED x) for the first LIST item where (PRED x) is non-nil, else nil. - -Alias: `-any'" - (--some (funcall pred it) list)) - -(defalias '-any '-some) -(defalias '--any '--some) - -(defmacro --last (form list) - "Anaphoric form of `-last'." - (declare (debug (form form))) - (let ((n (make-symbol "needle"))) - `(let (,n) - (--each ,list - (when ,form (setq ,n it))) - ,n))) - -(defun -last (pred list) - "Return the last x in LIST where (PRED x) is non-nil, else nil." - (--last (funcall pred it) list)) - -(defalias '-first-item 'car - "Return the first item of LIST, or nil on an empty list. - -See also: `-second-item', `-last-item'. - -\(fn LIST)") - -;; Ensure that calls to `-first-item' are compiled to a single opcode, -;; just like `car'. -(put '-first-item 'byte-opcode 'byte-car) -(put '-first-item 'byte-compile 'byte-compile-one-arg) - -(defalias '-second-item 'cadr - "Return the second item of LIST, or nil if LIST is too short. - -See also: `-third-item'. - -\(fn LIST)") - -(defalias '-third-item - (if (fboundp 'caddr) - #'caddr - (lambda (list) (car (cddr list)))) - "Return the third item of LIST, or nil if LIST is too short. - -See also: `-fourth-item'. - -\(fn LIST)") - -(defun -fourth-item (list) - "Return the fourth item of LIST, or nil if LIST is too short. - -See also: `-fifth-item'." - (declare (pure t) (side-effect-free t)) - (car (cdr (cdr (cdr list))))) - -(defun -fifth-item (list) - "Return the fifth item of LIST, or nil if LIST is too short. - -See also: `-last-item'." - (declare (pure t) (side-effect-free t)) - (car (cdr (cdr (cdr (cdr list)))))) - -(defun -last-item (list) - "Return the last item of LIST, or nil on an empty list." - (declare (pure t) (side-effect-free t)) - (car (last list))) - -;; Use `with-no-warnings' to suppress unbound `-last-item' or -;; undefined `gv--defsetter' warnings arising from both -;; `gv-define-setter' and `defsetf' in certain Emacs versions. -(with-no-warnings - (if (fboundp 'gv-define-setter) - (gv-define-setter -last-item (val x) `(setcar (last ,x) ,val)) - (defsetf -last-item (x) (val) `(setcar (last ,x) ,val)))) - -(defun -butlast (list) - "Return a list of all items in list except for the last." - ;; no alias as we don't want magic optional argument - (declare (pure t) (side-effect-free t)) - (butlast list)) - -(defmacro --count (pred list) - "Anaphoric form of `-count'." - (declare (debug (form form))) - (let ((r (make-symbol "result"))) - `(let ((,r 0)) - (--each ,list (when ,pred (setq ,r (1+ ,r)))) - ,r))) - -(defun -count (pred list) - "Counts the number of items in LIST where (PRED item) is non-nil." - (--count (funcall pred it) list)) - -(defun ---truthy? (val) - (declare (pure t) (side-effect-free t)) - (not (null val))) - -(defmacro --any? (form list) - "Anaphoric form of `-any?'." - (declare (debug (form form))) - `(---truthy? (--some ,form ,list))) - -(defun -any? (pred list) - "Return t if (PRED x) is non-nil for any x in LIST, else nil. - -Alias: `-any-p', `-some?', `-some-p'" - (--any? (funcall pred it) list)) - -(defalias '-some? '-any?) -(defalias '--some? '--any?) -(defalias '-any-p '-any?) -(defalias '--any-p '--any?) -(defalias '-some-p '-any?) -(defalias '--some-p '--any?) - -(defmacro --all? (form list) - "Anaphoric form of `-all?'." - (declare (debug (form form))) - (let ((a (make-symbol "all"))) - `(let ((,a t)) - (--each-while ,list ,a (setq ,a ,form)) - (---truthy? ,a)))) - -(defun -all? (pred list) - "Return t if (PRED x) is non-nil for all x in LIST, else nil. - -Alias: `-all-p', `-every?', `-every-p'" - (--all? (funcall pred it) list)) - -(defalias '-every? '-all?) -(defalias '--every? '--all?) -(defalias '-all-p '-all?) -(defalias '--all-p '--all?) -(defalias '-every-p '-all?) -(defalias '--every-p '--all?) - -(defmacro --none? (form list) - "Anaphoric form of `-none?'." - (declare (debug (form form))) - `(--all? (not ,form) ,list)) - -(defun -none? (pred list) - "Return t if (PRED x) is nil for all x in LIST, else nil. - -Alias: `-none-p'" - (--none? (funcall pred it) list)) - -(defalias '-none-p '-none?) -(defalias '--none-p '--none?) - -(defmacro --only-some? (form list) - "Anaphoric form of `-only-some?'." - (declare (debug (form form))) - (let ((y (make-symbol "yes")) - (n (make-symbol "no"))) - `(let (,y ,n) - (--each-while ,list (not (and ,y ,n)) - (if ,form (setq ,y t) (setq ,n t))) - (---truthy? (and ,y ,n))))) - -(defun -only-some? (pred list) - "Return `t` if at least one item of LIST matches PRED and at least one item of LIST does not match PRED. -Return `nil` both if all items match the predicate or if none of the items match the predicate. - -Alias: `-only-some-p'" - (--only-some? (funcall pred it) list)) - -(defalias '-only-some-p '-only-some?) -(defalias '--only-some-p '--only-some?) - -(defun -slice (list from &optional to step) - "Return copy of LIST, starting from index FROM to index TO. - -FROM or TO may be negative. These values are then interpreted -modulo the length of the list. - -If STEP is a number, only each STEPth item in the resulting -section is returned. Defaults to 1." - (declare (pure t) (side-effect-free t)) - (let ((length (length list)) - (new-list nil)) - ;; to defaults to the end of the list - (setq to (or to length)) - (setq step (or step 1)) - ;; handle negative indices - (when (< from 0) - (setq from (mod from length))) - (when (< to 0) - (setq to (mod to length))) - - ;; iterate through the list, keeping the elements we want - (--each-while list (< it-index to) - (when (and (>= it-index from) - (= (mod (- from it-index) step) 0)) - (push it new-list))) - (nreverse new-list))) - -(defun -take (n list) - "Return a new list of the first N items in LIST, or all items if there are fewer than N. - -See also: `-take-last'" - (declare (pure t) (side-effect-free t)) - (let (result) - (--dotimes n - (when list - (!cons (car list) result) - (!cdr list))) - (nreverse result))) - -(defun -take-last (n list) - "Return the last N items of LIST in order. - -See also: `-take'" - (declare (pure t) (side-effect-free t)) - (copy-sequence (last list n))) - -(defalias '-drop 'nthcdr - "Return the tail of LIST without the first N items. - -See also: `-drop-last' - -\(fn N LIST)") - -(defun -drop-last (n list) - "Remove the last N items of LIST and return a copy. - -See also: `-drop'" - ;; No alias because we don't want magic optional argument - (declare (pure t) (side-effect-free t)) - (butlast list n)) - -(defmacro --take-while (form list) - "Anaphoric form of `-take-while'." - (declare (debug (form form))) - (let ((r (make-symbol "result"))) - `(let (,r) - (--each-while ,list ,form (!cons it ,r)) - (nreverse ,r)))) - -(defun -take-while (pred list) - "Return a new list of successive items from LIST while (PRED item) returns a non-nil value." - (--take-while (funcall pred it) list)) - -(defmacro --drop-while (form list) - "Anaphoric form of `-drop-while'." - (declare (debug (form form))) - (let ((l (make-symbol "list"))) - `(let ((,l ,list)) - (while (and ,l (let ((it (car ,l))) ,form)) - (!cdr ,l)) - ,l))) - -(defun -drop-while (pred list) - "Return the tail of LIST starting from the first item for which (PRED item) returns nil." - (--drop-while (funcall pred it) list)) - -(defun -split-at (n list) - "Return a list of ((-take N LIST) (-drop N LIST)), in no more than one pass through the list." - (declare (pure t) (side-effect-free t)) - (let (result) - (--dotimes n - (when list - (!cons (car list) result) - (!cdr list))) - (list (nreverse result) list))) - -(defun -rotate (n list) - "Rotate LIST N places to the right. With N negative, rotate to the left. -The time complexity is O(n)." - (declare (pure t) (side-effect-free t)) - (when list - (let* ((len (length list)) - (n-mod-len (mod n len)) - (new-tail-len (- len n-mod-len))) - (append (-drop new-tail-len list) (-take new-tail-len list))))) - -(defun -insert-at (n x list) - "Return a list with X inserted into LIST at position N. - -See also: `-splice', `-splice-list'" - (declare (pure t) (side-effect-free t)) - (let ((split-list (-split-at n list))) - (nconc (car split-list) (cons x (cadr split-list))))) - -(defun -replace-at (n x list) - "Return a list with element at Nth position in LIST replaced with X. - -See also: `-replace'" - (declare (pure t) (side-effect-free t)) - (let ((split-list (-split-at n list))) - (nconc (car split-list) (cons x (cdr (cadr split-list)))))) - -(defun -update-at (n func list) - "Return a list with element at Nth position in LIST replaced with `(func (nth n list))`. - -See also: `-map-when'" - (let ((split-list (-split-at n list))) - (nconc (car split-list) (cons (funcall func (car (cadr split-list))) (cdr (cadr split-list)))))) - -(defmacro --update-at (n form list) - "Anaphoric version of `-update-at'." - (declare (debug (form form form))) - `(-update-at ,n (lambda (it) ,form) ,list)) - -(defun -remove-at (n list) - "Return a list with element at Nth position in LIST removed. - -See also: `-remove-at-indices', `-remove'" - (declare (pure t) (side-effect-free t)) - (-remove-at-indices (list n) list)) - -(defun -remove-at-indices (indices list) - "Return a list whose elements are elements from LIST without -elements selected as `(nth i list)` for all i -from INDICES. - -See also: `-remove-at', `-remove'" - (declare (pure t) (side-effect-free t)) - (let* ((indices (-sort '< indices)) - (diffs (cons (car indices) (-map '1- (-zip-with '- (cdr indices) indices)))) - r) - (--each diffs - (let ((split (-split-at it list))) - (!cons (car split) r) - (setq list (cdr (cadr split))))) - (!cons list r) - (apply '-concat (nreverse r)))) - -(defmacro --split-with (pred list) - "Anaphoric form of `-split-with'." - (declare (debug (form form))) - (let ((l (make-symbol "list")) - (r (make-symbol "result")) - (c (make-symbol "continue"))) - `(let ((,l ,list) - (,r nil) - (,c t)) - (while (and ,l ,c) - (let ((it (car ,l))) - (if (not ,pred) - (setq ,c nil) - (!cons it ,r) - (!cdr ,l)))) - (list (nreverse ,r) ,l)))) - -(defun -split-with (pred list) - "Return a list of ((-take-while PRED LIST) (-drop-while PRED LIST)), in no more than one pass through the list." - (--split-with (funcall pred it) list)) - -(defmacro -split-on (item list) - "Split the LIST each time ITEM is found. - -Unlike `-partition-by', the ITEM is discarded from the results. -Empty lists are also removed from the result. - -Comparison is done by `equal'. - -See also `-split-when'" - (declare (debug (form form))) - `(-split-when (lambda (it) (equal it ,item)) ,list)) - -(defmacro --split-when (form list) - "Anaphoric version of `-split-when'." - (declare (debug (form form))) - `(-split-when (lambda (it) ,form) ,list)) - -(defun -split-when (fn list) - "Split the LIST on each element where FN returns non-nil. - -Unlike `-partition-by', the \"matched\" element is discarded from -the results. Empty lists are also removed from the result. - -This function can be thought of as a generalization of -`split-string'." - (let (r s) - (while list - (if (not (funcall fn (car list))) - (push (car list) s) - (when s (push (nreverse s) r)) - (setq s nil)) - (!cdr list)) - (when s (push (nreverse s) r)) - (nreverse r))) - -(defmacro --separate (form list) - "Anaphoric form of `-separate'." - (declare (debug (form form))) - (let ((y (make-symbol "yes")) - (n (make-symbol "no"))) - `(let (,y ,n) - (--each ,list (if ,form (!cons it ,y) (!cons it ,n))) - (list (nreverse ,y) (nreverse ,n))))) - -(defun -separate (pred list) - "Return a list of ((-filter PRED LIST) (-remove PRED LIST)), in one pass through the list." - (--separate (funcall pred it) list)) - -(defun ---partition-all-in-steps-reversed (n step list) - "Private: Used by -partition-all-in-steps and -partition-in-steps." - (when (< step 1) - (error "Step must be a positive number, or you're looking at some juicy infinite loops.")) - (let ((result nil)) - (while list - (!cons (-take n list) result) - (setq list (-drop step list))) - result)) - -(defun -partition-all-in-steps (n step list) - "Return a new list with the items in LIST grouped into N-sized sublists at offsets STEP apart. -The last groups may contain less than N items." - (declare (pure t) (side-effect-free t)) - (nreverse (---partition-all-in-steps-reversed n step list))) - -(defun -partition-in-steps (n step list) - "Return a new list with the items in LIST grouped into N-sized sublists at offsets STEP apart. -If there are not enough items to make the last group N-sized, -those items are discarded." - (declare (pure t) (side-effect-free t)) - (let ((result (---partition-all-in-steps-reversed n step list))) - (while (and result (< (length (car result)) n)) - (!cdr result)) - (nreverse result))) - -(defun -partition-all (n list) - "Return a new list with the items in LIST grouped into N-sized sublists. -The last group may contain less than N items." - (declare (pure t) (side-effect-free t)) - (-partition-all-in-steps n n list)) - -(defun -partition (n list) - "Return a new list with the items in LIST grouped into N-sized sublists. -If there are not enough items to make the last group N-sized, -those items are discarded." - (declare (pure t) (side-effect-free t)) - (-partition-in-steps n n list)) - -(defmacro --partition-by (form list) - "Anaphoric form of `-partition-by'." - (declare (debug (form form))) - (let ((r (make-symbol "result")) - (s (make-symbol "sublist")) - (v (make-symbol "value")) - (n (make-symbol "new-value")) - (l (make-symbol "list"))) - `(let ((,l ,list)) - (when ,l - (let* ((,r nil) - (it (car ,l)) - (,s (list it)) - (,v ,form) - (,l (cdr ,l))) - (while ,l - (let* ((it (car ,l)) - (,n ,form)) - (unless (equal ,v ,n) - (!cons (nreverse ,s) ,r) - (setq ,s nil) - (setq ,v ,n)) - (!cons it ,s) - (!cdr ,l))) - (!cons (nreverse ,s) ,r) - (nreverse ,r)))))) - -(defun -partition-by (fn list) - "Apply FN to each item in LIST, splitting it each time FN returns a new value." - (--partition-by (funcall fn it) list)) - -(defmacro --partition-by-header (form list) - "Anaphoric form of `-partition-by-header'." - (declare (debug (form form))) - (let ((r (make-symbol "result")) - (s (make-symbol "sublist")) - (h (make-symbol "header-value")) - (b (make-symbol "seen-body?")) - (n (make-symbol "new-value")) - (l (make-symbol "list"))) - `(let ((,l ,list)) - (when ,l - (let* ((,r nil) - (it (car ,l)) - (,s (list it)) - (,h ,form) - (,b nil) - (,l (cdr ,l))) - (while ,l - (let* ((it (car ,l)) - (,n ,form)) - (if (equal ,h ,n) - (when ,b - (!cons (nreverse ,s) ,r) - (setq ,s nil) - (setq ,b nil)) - (setq ,b t)) - (!cons it ,s) - (!cdr ,l))) - (!cons (nreverse ,s) ,r) - (nreverse ,r)))))) - -(defun -partition-by-header (fn list) - "Apply FN to the first item in LIST. That is the header -value. Apply FN to each item in LIST, splitting it each time FN -returns the header value, but only after seeing at least one -other value (the body)." - (--partition-by-header (funcall fn it) list)) - -(defun -partition-after-pred (pred list) - "Partition directly after each time PRED is true on an element of LIST." - (when list - (let ((rest (-partition-after-pred pred - (cdr list)))) - (if (funcall pred (car list)) - ;;split after (car list) - (cons (list (car list)) - rest) - - ;;don't split after (car list) - (cons (cons (car list) - (car rest)) - (cdr rest)))))) - -(defun -partition-before-pred (pred list) - "Partition directly before each time PRED is true on an element of LIST." - (nreverse (-map #'reverse - (-partition-after-pred pred (reverse list))))) - -(defun -partition-after-item (item list) - "Partition directly after each time ITEM appears in LIST." - (-partition-after-pred (lambda (ele) (equal ele item)) - list)) - -(defun -partition-before-item (item list) - "Partition directly before each time ITEM appears in LIST." - (-partition-before-pred (lambda (ele) (equal ele item)) - list)) - -(defmacro --group-by (form list) - "Anaphoric form of `-group-by'." - (declare (debug t)) - (let ((n (make-symbol "n")) - (k (make-symbol "k")) - (grp (make-symbol "grp"))) - `(nreverse - (-map - (lambda (,n) - (cons (car ,n) - (nreverse (cdr ,n)))) - (--reduce-from - (let* ((,k (,@form)) - (,grp (assoc ,k acc))) - (if ,grp - (setcdr ,grp (cons it (cdr ,grp))) - (push - (list ,k it) - acc)) - acc) - nil ,list))))) - -(defun -group-by (fn list) - "Separate LIST into an alist whose keys are FN applied to the -elements of LIST. Keys are compared by `equal'." - (--group-by (funcall fn it) list)) - -(defun -interpose (sep list) - "Return a new list of all elements in LIST separated by SEP." - (declare (pure t) (side-effect-free t)) - (let (result) - (when list - (!cons (car list) result) - (!cdr list)) - (while list - (setq result (cons (car list) (cons sep result))) - (!cdr list)) - (nreverse result))) - -(defun -interleave (&rest lists) - "Return a new list of the first item in each list, then the second etc." - (declare (pure t) (side-effect-free t)) - (when lists - (let (result) - (while (-none? 'null lists) - (--each lists (!cons (car it) result)) - (setq lists (-map 'cdr lists))) - (nreverse result)))) - -(defmacro --zip-with (form list1 list2) - "Anaphoric form of `-zip-with'. - -The elements in list1 are bound as symbol `it', the elements in list2 as symbol `other'." - (declare (debug (form form form))) - (let ((r (make-symbol "result")) - (l1 (make-symbol "list1")) - (l2 (make-symbol "list2"))) - `(let ((,r nil) - (,l1 ,list1) - (,l2 ,list2)) - (while (and ,l1 ,l2) - (let ((it (car ,l1)) - (other (car ,l2))) - (!cons ,form ,r) - (!cdr ,l1) - (!cdr ,l2))) - (nreverse ,r)))) - -(defun -zip-with (fn list1 list2) - "Zip the two lists LIST1 and LIST2 using a function FN. This -function is applied pairwise taking as first argument element of -LIST1 and as second argument element of LIST2 at corresponding -position. - -The anaphoric form `--zip-with' binds the elements from LIST1 as symbol `it', -and the elements from LIST2 as symbol `other'." - (--zip-with (funcall fn it other) list1 list2)) - -(defun -zip-lists (&rest lists) - "Zip LISTS together. Group the head of each list, followed by the -second elements of each list, and so on. The lengths of the returned -groupings are equal to the length of the shortest input list. - -The return value is always list of lists, which is a difference -from `-zip-pair' which returns a cons-cell in case two input -lists are provided. - -See also: `-zip'" - (declare (pure t) (side-effect-free t)) - (when lists - (let (results) - (while (-none? 'null lists) - (setq results (cons (mapcar 'car lists) results)) - (setq lists (mapcar 'cdr lists))) - (nreverse results)))) - -(defun -zip (&rest lists) - "Zip LISTS together. Group the head of each list, followed by the -second elements of each list, and so on. The lengths of the returned -groupings are equal to the length of the shortest input list. - -If two lists are provided as arguments, return the groupings as a list -of cons cells. Otherwise, return the groupings as a list of lists. - -Use `-zip-lists' if you need the return value to always be a list -of lists. - -Alias: `-zip-pair' - -See also: `-zip-lists'" - (declare (pure t) (side-effect-free t)) - (when lists - (let (results) - (while (-none? 'null lists) - (setq results (cons (mapcar 'car lists) results)) - (setq lists (mapcar 'cdr lists))) - (setq results (nreverse results)) - (if (= (length lists) 2) - ;; to support backward compatibility, return - ;; a cons cell if two lists were provided - (--map (cons (car it) (cadr it)) results) - results)))) - -(defalias '-zip-pair '-zip) - -(defun -zip-fill (fill-value &rest lists) - "Zip LISTS, with FILL-VALUE padded onto the shorter lists. The -lengths of the returned groupings are equal to the length of the -longest input list." - (declare (pure t) (side-effect-free t)) - (apply '-zip (apply '-pad (cons fill-value lists)))) - -(defun -unzip (lists) - "Unzip LISTS. - -This works just like `-zip' but takes a list of lists instead of -a variable number of arguments, such that - - (-unzip (-zip L1 L2 L3 ...)) - -is identity (given that the lists are the same length). - -Note in particular that calling this on a list of two lists will -return a list of cons-cells such that the aboce identity works. - -See also: `-zip'" - (apply '-zip lists)) - -(defun -cycle (list) - "Return an infinite copy of LIST that will cycle through the -elements and repeat from the beginning." - (declare (pure t) (side-effect-free t)) - (let ((newlist (-map 'identity list))) - (nconc newlist newlist))) - -(defun -pad (fill-value &rest lists) - "Appends FILL-VALUE to the end of each list in LISTS such that they -will all have the same length." - (let* ((annotations (-annotate 'length lists)) - (n (-max (-map 'car annotations)))) - (--map (append (cdr it) (-repeat (- n (car it)) fill-value)) annotations))) - -(defun -annotate (fn list) - "Return a list of cons cells where each cell is FN applied to each -element of LIST paired with the unmodified element of LIST." - (-zip (-map fn list) list)) - -(defmacro --annotate (form list) - "Anaphoric version of `-annotate'." - (declare (debug (form form))) - `(-annotate (lambda (it) ,form) ,list)) - -(defun dash--table-carry (lists restore-lists &optional re) - "Helper for `-table' and `-table-flat'. - -If a list overflows, carry to the right and reset the list." - (while (not (or (car lists) - (equal lists '(nil)))) - (setcar lists (car restore-lists)) - (pop (cadr lists)) - (!cdr lists) - (!cdr restore-lists) - (when re - (push (nreverse (car re)) (cadr re)) - (setcar re nil) - (!cdr re)))) - -(defun -table (fn &rest lists) - "Compute outer product of LISTS using function FN. - -The function FN should have the same arity as the number of -supplied lists. - -The outer product is computed by applying fn to all possible -combinations created by taking one element from each list in -order. The dimension of the result is (length lists). - -See also: `-table-flat'" - (let ((restore-lists (copy-sequence lists)) - (last-list (last lists)) - (re (make-list (length lists) nil))) - (while (car last-list) - (let ((item (apply fn (-map 'car lists)))) - (push item (car re)) - (setcar lists (cdar lists)) ;; silence byte compiler - (dash--table-carry lists restore-lists re))) - (nreverse (car (last re))))) - -(defun -table-flat (fn &rest lists) - "Compute flat outer product of LISTS using function FN. - -The function FN should have the same arity as the number of -supplied lists. - -The outer product is computed by applying fn to all possible -combinations created by taking one element from each list in -order. The results are flattened, ignoring the tensor structure -of the result. This is equivalent to calling: - - (-flatten-n (1- (length lists)) (apply \\='-table fn lists)) - -but the implementation here is much more efficient. - -See also: `-flatten-n', `-table'" - (let ((restore-lists (copy-sequence lists)) - (last-list (last lists)) - re) - (while (car last-list) - (let ((item (apply fn (-map 'car lists)))) - (push item re) - (setcar lists (cdar lists)) ;; silence byte compiler - (dash--table-carry lists restore-lists))) - (nreverse re))) - -(defun -partial (fn &rest args) - "Take a function FN and fewer than the normal arguments to FN, -and return a fn that takes a variable number of additional ARGS. -When called, the returned function calls FN with ARGS first and -then additional args." - (apply 'apply-partially fn args)) - -(defun -elem-index (elem list) - "Return the index of the first element in the given LIST which -is equal to the query element ELEM, or nil if there is no -such element." - (declare (pure t) (side-effect-free t)) - (car (-elem-indices elem list))) - -(defun -elem-indices (elem list) - "Return the indices of all elements in LIST equal to the query -element ELEM, in ascending order." - (declare (pure t) (side-effect-free t)) - (-find-indices (-partial 'equal elem) list)) - -(defun -find-indices (pred list) - "Return the indices of all elements in LIST satisfying the -predicate PRED, in ascending order." - (apply 'append (--map-indexed (when (funcall pred it) (list it-index)) list))) - -(defmacro --find-indices (form list) - "Anaphoric version of `-find-indices'." - (declare (debug (form form))) - `(-find-indices (lambda (it) ,form) ,list)) - -(defun -find-index (pred list) - "Take a predicate PRED and a LIST and return the index of the -first element in the list satisfying the predicate, or nil if -there is no such element. - -See also `-first'." - (car (-find-indices pred list))) - -(defmacro --find-index (form list) - "Anaphoric version of `-find-index'." - (declare (debug (form form))) - `(-find-index (lambda (it) ,form) ,list)) - -(defun -find-last-index (pred list) - "Take a predicate PRED and a LIST and return the index of the -last element in the list satisfying the predicate, or nil if -there is no such element. - -See also `-last'." - (-last-item (-find-indices pred list))) - -(defmacro --find-last-index (form list) - "Anaphoric version of `-find-last-index'." - `(-find-last-index (lambda (it) ,form) ,list)) - -(defun -select-by-indices (indices list) - "Return a list whose elements are elements from LIST selected -as `(nth i list)` for all i from INDICES." - (declare (pure t) (side-effect-free t)) - (let (r) - (--each indices - (!cons (nth it list) r)) - (nreverse r))) - -(defun -select-columns (columns table) - "Select COLUMNS from TABLE. - -TABLE is a list of lists where each element represents one row. -It is assumed each row has the same length. - -Each row is transformed such that only the specified COLUMNS are -selected. - -See also: `-select-column', `-select-by-indices'" - (declare (pure t) (side-effect-free t)) - (--map (-select-by-indices columns it) table)) - -(defun -select-column (column table) - "Select COLUMN from TABLE. - -TABLE is a list of lists where each element represents one row. -It is assumed each row has the same length. - -The single selected column is returned as a list. - -See also: `-select-columns', `-select-by-indices'" - (declare (pure t) (side-effect-free t)) - (--mapcat (-select-by-indices (list column) it) table)) - -(defmacro -> (x &optional form &rest more) - "Thread the expr through the forms. Insert X as the second item -in the first form, making a list of it if it is not a list -already. If there are more forms, insert the first form as the -second item in second form, etc." - (declare (debug (form &rest [&or symbolp (sexp &rest form)]))) - (cond - ((null form) x) - ((null more) (if (listp form) - `(,(car form) ,x ,@(cdr form)) - (list form x))) - (:else `(-> (-> ,x ,form) ,@more)))) - -(defmacro ->> (x &optional form &rest more) - "Thread the expr through the forms. Insert X as the last item -in the first form, making a list of it if it is not a list -already. If there are more forms, insert the first form as the -last item in second form, etc." - (declare (debug ->)) - (cond - ((null form) x) - ((null more) (if (listp form) - `(,@form ,x) - (list form x))) - (:else `(->> (->> ,x ,form) ,@more)))) - -(defmacro --> (x &rest forms) - "Starting with the value of X, thread each expression through FORMS. - -Insert X at the position signified by the symbol `it' in the first -form. If there are more forms, insert the first form at the position -signified by `it' in in second form, etc." - (declare (debug (form body))) - `(-as-> ,x it ,@forms)) - -(defmacro -as-> (value variable &rest forms) - "Starting with VALUE, thread VARIABLE through FORMS. - -In the first form, bind VARIABLE to VALUE. In the second form, bind -VARIABLE to the result of the first form, and so forth." - (declare (debug (form symbolp body))) - (if (null forms) - `,value - `(let ((,variable ,value)) - (-as-> ,(if (symbolp (car forms)) - (list (car forms) variable) - (car forms)) - ,variable - ,@(cdr forms))))) - -(defmacro -some-> (x &optional form &rest more) - "When expr is non-nil, thread it through the first form (via `->'), -and when that result is non-nil, through the next form, etc." - (declare (debug ->) - (indent 1)) - (if (null form) x - (let ((result (make-symbol "result"))) - `(-some-> (-when-let (,result ,x) - (-> ,result ,form)) - ,@more)))) - -(defmacro -some->> (x &optional form &rest more) - "When expr is non-nil, thread it through the first form (via `->>'), -and when that result is non-nil, through the next form, etc." - (declare (debug ->) - (indent 1)) - (if (null form) x - (let ((result (make-symbol "result"))) - `(-some->> (-when-let (,result ,x) - (->> ,result ,form)) - ,@more)))) - -(defmacro -some--> (x &optional form &rest more) - "When expr in non-nil, thread it through the first form (via `-->'), -and when that result is non-nil, through the next form, etc." - (declare (debug ->) - (indent 1)) - (if (null form) x - (let ((result (make-symbol "result"))) - `(-some--> (-when-let (,result ,x) - (--> ,result ,form)) - ,@more)))) - -(defun -grade-up (comparator list) - "Grade elements of LIST using COMPARATOR relation, yielding a -permutation vector such that applying this permutation to LIST -sorts it in ascending order." - ;; ugly hack to "fix" lack of lexical scope - (let ((comp `(lambda (it other) (funcall ',comparator (car it) (car other))))) - (->> (--map-indexed (cons it it-index) list) - (-sort comp) - (-map 'cdr)))) - -(defun -grade-down (comparator list) - "Grade elements of LIST using COMPARATOR relation, yielding a -permutation vector such that applying this permutation to LIST -sorts it in descending order." - ;; ugly hack to "fix" lack of lexical scope - (let ((comp `(lambda (it other) (funcall ',comparator (car other) (car it))))) - (->> (--map-indexed (cons it it-index) list) - (-sort comp) - (-map 'cdr)))) - -(defvar dash--source-counter 0 - "Monotonic counter for generated symbols.") - -(defun dash--match-make-source-symbol () - "Generate a new dash-source symbol. - -All returned symbols are guaranteed to be unique." - (prog1 (make-symbol (format "--dash-source-%d--" dash--source-counter)) - (setq dash--source-counter (1+ dash--source-counter)))) - -(defun dash--match-ignore-place-p (symbol) - "Return non-nil if SYMBOL is a symbol and starts with _." - (and (symbolp symbol) - (eq (aref (symbol-name symbol) 0) ?_))) - -(defun dash--match-cons-skip-cdr (skip-cdr source) - "Helper function generating idiomatic shifting code." - (cond - ((= skip-cdr 0) - `(pop ,source)) - (t - `(prog1 ,(dash--match-cons-get-car skip-cdr source) - (setq ,source ,(dash--match-cons-get-cdr (1+ skip-cdr) source)))))) - -(defun dash--match-cons-get-car (skip-cdr source) - "Helper function generating idiomatic code to get nth car." - (cond - ((= skip-cdr 0) - `(car ,source)) - ((= skip-cdr 1) - `(cadr ,source)) - (t - `(nth ,skip-cdr ,source)))) - -(defun dash--match-cons-get-cdr (skip-cdr source) - "Helper function generating idiomatic code to get nth cdr." - (cond - ((= skip-cdr 0) - source) - ((= skip-cdr 1) - `(cdr ,source)) - (t - `(nthcdr ,skip-cdr ,source)))) - -(defun dash--match-cons (match-form source) - "Setup a cons matching environment and call the real matcher." - (let ((s (dash--match-make-source-symbol)) - (n 0) - (m match-form)) - (while (and (consp m) - (dash--match-ignore-place-p (car m))) - (setq n (1+ n)) (!cdr m)) - (cond - ;; when we only have one pattern in the list, we don't have to - ;; create a temporary binding (--dash-source--) for the source - ;; and just use the input directly - ((and (consp m) - (not (cdr m))) - (dash--match (car m) (dash--match-cons-get-car n source))) - ;; handle other special types - ((> n 0) - (dash--match m (dash--match-cons-get-cdr n source))) - ;; this is the only entry-point for dash--match-cons-1, that's - ;; why we can't simply use the above branch, it would produce - ;; infinite recursion - (t - (cons (list s source) (dash--match-cons-1 match-form s)))))) - -(defun dash--get-expand-function (type) - "Get expand function name for TYPE." - (intern-soft (format "dash-expand:%s" type))) - -(defun dash--match-cons-1 (match-form source &optional props) - "Match MATCH-FORM against SOURCE. - -MATCH-FORM is a proper or improper list. Each element of -MATCH-FORM is either a symbol, which gets bound to the respective -value in source or another match form which gets destructured -recursively. - -If the cdr of last cons cell in the list is `nil', matching stops -there. - -SOURCE is a proper or improper list." - (let ((skip-cdr (or (plist-get props :skip-cdr) 0))) - (cond - ((consp match-form) - (cond - ((cdr match-form) - (cond - ((and (symbolp (car match-form)) - (functionp (dash--get-expand-function (car match-form)))) - (dash--match-kv (dash--match-kv-normalize-match-form match-form) (dash--match-cons-get-cdr skip-cdr source))) - ((dash--match-ignore-place-p (car match-form)) - (dash--match-cons-1 (cdr match-form) source - (plist-put props :skip-cdr (1+ skip-cdr)))) - (t - (-concat (dash--match (car match-form) (dash--match-cons-skip-cdr skip-cdr source)) - (dash--match-cons-1 (cdr match-form) source))))) - (t ;; Last matching place, no need for shift - (dash--match (car match-form) (dash--match-cons-get-car skip-cdr source))))) - ((eq match-form nil) - nil) - (t ;; Handle improper lists. Last matching place, no need for shift - (dash--match match-form (dash--match-cons-get-cdr skip-cdr source)))))) - -(defun dash--vector-tail (seq start) - "Return the tail of SEQ starting at START." - (cond - ((vectorp seq) - (let* ((re-length (- (length seq) start)) - (re (make-vector re-length 0))) - (--dotimes re-length (aset re it (aref seq (+ it start)))) - re)) - ((stringp seq) - (substring seq start)))) - -(defun dash--match-vector (match-form source) - "Setup a vector matching environment and call the real matcher." - (let ((s (dash--match-make-source-symbol))) - (cond - ;; don't bind `s' if we only have one sub-pattern - ((= (length match-form) 1) - (dash--match (aref match-form 0) `(aref ,source 0))) - ;; if the source is a symbol, we don't need to re-bind it - ((symbolp source) - (dash--match-vector-1 match-form source)) - ;; don't bind `s' if we only have one sub-pattern which is not ignored - ((let* ((ignored-places (mapcar 'dash--match-ignore-place-p match-form)) - (ignored-places-n (length (-remove 'null ignored-places)))) - (when (= ignored-places-n (1- (length match-form))) - (let ((n (-find-index 'null ignored-places))) - (dash--match (aref match-form n) `(aref ,source ,n)))))) - (t - (cons (list s source) (dash--match-vector-1 match-form s)))))) - -(defun dash--match-vector-1 (match-form source) - "Match MATCH-FORM against SOURCE. - -MATCH-FORM is a vector. Each element of MATCH-FORM is either a -symbol, which gets bound to the respective value in source or -another match form which gets destructured recursively. - -If second-from-last place in MATCH-FORM is the symbol &rest, the -next element of the MATCH-FORM is matched against the tail of -SOURCE, starting at index of the &rest symbol. This is -conceptually the same as the (head . tail) match for improper -lists, where dot plays the role of &rest. - -SOURCE is a vector. - -If the MATCH-FORM vector is shorter than SOURCE vector, only -the (length MATCH-FORM) places are bound, the rest of the SOURCE -is discarded." - (let ((i 0) - (l (length match-form)) - (re)) - (while (< i l) - (let ((m (aref match-form i))) - (push (cond - ((and (symbolp m) - (eq m '&rest)) - (prog1 (dash--match - (aref match-form (1+ i)) - `(dash--vector-tail ,source ,i)) - (setq i l))) - ((and (symbolp m) - ;; do not match symbols starting with _ - (not (eq (aref (symbol-name m) 0) ?_))) - (list (list m `(aref ,source ,i)))) - ((not (symbolp m)) - (dash--match m `(aref ,source ,i)))) - re) - (setq i (1+ i)))) - (-flatten-n 1 (nreverse re)))) - -(defun dash--match-kv-normalize-match-form (pattern) - "Normalize kv PATTERN. - -This method normalizes PATTERN to the format expected by -`dash--match-kv'. See `-let' for the specification." - (let ((normalized (list (car pattern))) - (skip nil) - (fill-placeholder (make-symbol "--dash-fill-placeholder--"))) - (-each (apply '-zip (-pad fill-placeholder (cdr pattern) (cddr pattern))) - (lambda (pair) - (let ((current (car pair)) - (next (cdr pair))) - (if skip - (setq skip nil) - (if (or (eq fill-placeholder next) - (not (or (and (symbolp next) - (not (keywordp next)) - (not (eq next t)) - (not (eq next nil))) - (and (consp next) - (not (eq (car next) 'quote))) - (vectorp next)))) - (progn - (cond - ((keywordp current) - (push current normalized) - (push (intern (substring (symbol-name current) 1)) normalized)) - ((stringp current) - (push current normalized) - (push (intern current) normalized)) - ((and (consp current) - (eq (car current) 'quote)) - (push current normalized) - (push (cadr current) normalized)) - (t (error "-let: found key `%s' in kv destructuring but its pattern `%s' is invalid and can not be derived from the key" current next))) - (setq skip nil)) - (push current normalized) - (push next normalized) - (setq skip t)))))) - (nreverse normalized))) - -(defun dash--match-kv (match-form source) - "Setup a kv matching environment and call the real matcher. - -kv can be any key-value store, such as plist, alist or hash-table." - (let ((s (dash--match-make-source-symbol))) - (cond - ;; don't bind `s' if we only have one sub-pattern (&type key val) - ((= (length match-form) 3) - (dash--match-kv-1 (cdr match-form) source (car match-form))) - ;; if the source is a symbol, we don't need to re-bind it - ((symbolp source) - (dash--match-kv-1 (cdr match-form) source (car match-form))) - (t - (cons (list s source) (dash--match-kv-1 (cdr match-form) s (car match-form))))))) - -(defun dash-expand:&hash (key source) - "Generate extracting KEY from SOURCE for &hash destructuring." - `(gethash ,key ,source)) - -(defun dash-expand:&plist (key source) - "Generate extracting KEY from SOURCE for &plist destructuring." - `(plist-get ,source ,key)) - -(defun dash-expand:&alist (key source) - "Generate extracting KEY from SOURCE for &alist destructuring." - `(cdr (assoc ,key ,source))) - -(defun dash-expand:&hash? (key source) - "Generate extracting KEY from SOURCE for &hash? destructuring. -Similar to &hash but check whether the map is not nil." - (let ((src (make-symbol "src"))) - `(let ((,src ,source)) - (when ,src (gethash ,key ,src))))) - -(defalias 'dash-expand:&keys 'dash-expand:&plist) - -(defun dash--match-kv-1 (match-form source type) - "Match MATCH-FORM against SOURCE of type TYPE. - -MATCH-FORM is a proper list of the form (key1 place1 ... keyN -placeN). Each placeK is either a symbol, which gets bound to the -value of keyK retrieved from the key-value store, or another -match form which gets destructured recursively. - -SOURCE is a key-value store of type TYPE, which can be a plist, -an alist or a hash table. - -TYPE is a token specifying the type of the key-value store. -Valid values are &plist, &alist and &hash." - (-flatten-n 1 (-map - (lambda (kv) - (let* ((k (car kv)) - (v (cadr kv)) - (getter - (funcall (dash--get-expand-function type) k source))) - (cond - ((symbolp v) - (list (list v getter))) - (t (dash--match v getter))))) - (-partition 2 match-form)))) - -(defun dash--match-symbol (match-form source) - "Bind a symbol. - -This works just like `let', there is no destructuring." - (list (list match-form source))) - -(defun dash--match (match-form source) - "Match MATCH-FORM against SOURCE. - -This function tests the MATCH-FORM and dispatches to specific -matchers based on the type of the expression. - -Key-value stores are disambiguated by placing a token &plist, -&alist or &hash as a first item in the MATCH-FORM." - (cond - ((symbolp match-form) - (dash--match-symbol match-form source)) - ((consp match-form) - (cond - ;; Handle the "x &as" bindings first. - ((and (consp (cdr match-form)) - (symbolp (car match-form)) - (eq '&as (cadr match-form))) - (let ((s (car match-form))) - (cons (list s source) - (dash--match (cddr match-form) s)))) - ((functionp (dash--get-expand-function (car match-form))) - (dash--match-kv (dash--match-kv-normalize-match-form match-form) source)) - (t (dash--match-cons match-form source)))) - ((vectorp match-form) - ;; We support the &as binding in vectors too - (cond - ((and (> (length match-form) 2) - (symbolp (aref match-form 0)) - (eq '&as (aref match-form 1))) - (let ((s (aref match-form 0))) - (cons (list s source) - (dash--match (dash--vector-tail match-form 2) s)))) - (t (dash--match-vector match-form source)))))) - -(defun dash--normalize-let-varlist (varlist) - "Normalize VARLIST so that every binding is a list. - -`let' allows specifying a binding which is not a list but simply -the place which is then automatically bound to nil, such that all -three of the following are identical and evaluate to nil. - - (let (a) a) - (let ((a)) a) - (let ((a nil)) a) - -This function normalizes all of these to the last form." - (--map (if (consp it) it (list it nil)) varlist)) - -(defmacro -let* (varlist &rest body) - "Bind variables according to VARLIST then eval BODY. - -VARLIST is a list of lists of the form (PATTERN SOURCE). Each -PATTERN is matched against the SOURCE structurally. SOURCE is -only evaluated once for each PATTERN. - -Each SOURCE can refer to the symbols already bound by this -VARLIST. This is useful if you want to destructure SOURCE -recursively but also want to name the intermediate structures. - -See `-let' for the list of all possible patterns." - (declare (debug ((&rest [&or (sexp form) sexp]) body)) - (indent 1)) - (let* ((varlist (dash--normalize-let-varlist varlist)) - (bindings (--mapcat (dash--match (car it) (cadr it)) varlist))) - `(let* ,bindings - ,@body))) - -(defmacro -let (varlist &rest body) - "Bind variables according to VARLIST then eval BODY. - -VARLIST is a list of lists of the form (PATTERN SOURCE). Each -PATTERN is matched against the SOURCE \"structurally\". SOURCE -is only evaluated once for each PATTERN. Each PATTERN is matched -recursively, and can therefore contain sub-patterns which are -matched against corresponding sub-expressions of SOURCE. - -All the SOURCEs are evalled before any symbols are -bound (i.e. \"in parallel\"). - -If VARLIST only contains one (PATTERN SOURCE) element, you can -optionally specify it using a vector and discarding the -outer-most parens. Thus - - (-let ((PATTERN SOURCE)) ..) - -becomes - - (-let [PATTERN SOURCE] ..). - -`-let' uses a convention of not binding places (symbols) starting -with _ whenever it's possible. You can use this to skip over -entries you don't care about. However, this is not *always* -possible (as a result of implementation) and these symbols might -get bound to undefined values. - -Following is the overview of supported patterns. Remember that -patterns can be matched recursively, so every a, b, aK in the -following can be a matching construct and not necessarily a -symbol/variable. - -Symbol: - - a - bind the SOURCE to A. This is just like regular `let'. - -Conses and lists: - - (a) - bind `car' of cons/list to A - - (a . b) - bind car of cons to A and `cdr' to B - - (a b) - bind car of list to A and `cadr' to B - - (a1 a2 a3 ...) - bind 0th car of list to A1, 1st to A2, 2nd to A3 ... - - (a1 a2 a3 ... aN . rest) - as above, but bind the Nth cdr to REST. - -Vectors: - - [a] - bind 0th element of a non-list sequence to A (works with - vectors, strings, bit arrays...) - - [a1 a2 a3 ...] - bind 0th element of non-list sequence to A0, 1st to - A1, 2nd to A2, ... - If the PATTERN is shorter than SOURCE, the values at - places not in PATTERN are ignored. - If the PATTERN is longer than SOURCE, an `error' is - thrown. - - [a1 a2 a3 ... &rest rest] - as above, but bind the rest of - the sequence to REST. This is - conceptually the same as improper list - matching (a1 a2 ... aN . rest) - -Key/value stores: - - (&plist key0 a0 ... keyN aN) - bind value mapped by keyK in the - SOURCE plist to aK. If the - value is not found, aK is nil. - Uses `plist-get' to fetch values. - - (&alist key0 a0 ... keyN aN) - bind value mapped by keyK in the - SOURCE alist to aK. If the - value is not found, aK is nil. - Uses `assoc' to fetch values. - - (&hash key0 a0 ... keyN aN) - bind value mapped by keyK in the - SOURCE hash table to aK. If the - value is not found, aK is nil. - Uses `gethash' to fetch values. - -Further, special keyword &keys supports \"inline\" matching of -plist-like key-value pairs, similarly to &keys keyword of -`cl-defun'. - - (a1 a2 ... aN &keys key1 b1 ... keyN bK) - -This binds N values from the list to a1 ... aN, then interprets -the cdr as a plist (see key/value matching above). - -A shorthand notation for kv-destructuring exists which allows the -patterns be optionally left out and derived from the key name in -the following fashion: - -- a key :foo is converted into `foo' pattern, -- a key 'bar is converted into `bar' pattern, -- a key \"baz\" is converted into `baz' pattern. - -That is, the entire value under the key is bound to the derived -variable without any further destructuring. - -This is possible only when the form following the key is not a -valid pattern (i.e. not a symbol, a cons cell or a vector). -Otherwise the matching proceeds as usual and in case of an -invalid spec fails with an error. - -Thus the patterns are normalized as follows: - - ;; derive all the missing patterns - (&plist :foo 'bar \"baz\") => (&plist :foo foo 'bar bar \"baz\" baz) - - ;; we can specify some but not others - (&plist :foo 'bar explicit-bar) => (&plist :foo foo 'bar explicit-bar) - - ;; nothing happens, we store :foo in x - (&plist :foo x) => (&plist :foo x) - - ;; nothing happens, we match recursively - (&plist :foo (a b c)) => (&plist :foo (a b c)) - -You can name the source using the syntax SYMBOL &as PATTERN. -This syntax works with lists (proper or improper), vectors and -all types of maps. - - (list &as a b c) (list 1 2 3) - -binds A to 1, B to 2, C to 3 and LIST to (1 2 3). - -Similarly: - - (bounds &as beg . end) (cons 1 2) - -binds BEG to 1, END to 2 and BOUNDS to (1 . 2). - - (items &as first . rest) (list 1 2 3) - -binds FIRST to 1, REST to (2 3) and ITEMS to (1 2 3) - - [vect &as _ b c] [1 2 3] - -binds B to 2, C to 3 and VECT to [1 2 3] (_ avoids binding as usual). - - (plist &as &plist :b b) (list :a 1 :b 2 :c 3) - -binds B to 2 and PLIST to (:a 1 :b 2 :c 3). Same for &alist and &hash. - -This is especially useful when we want to capture the result of a -computation and destructure at the same time. Consider the -form (function-returning-complex-structure) returning a list of -two vectors with two items each. We want to capture this entire -result and pass it to another computation, but at the same time -we want to get the second item from each vector. We can achieve -it with pattern - - (result &as [_ a] [_ b]) (function-returning-complex-structure) - -Note: Clojure programmers may know this feature as the \":as -binding\". The difference is that we put the &as at the front -because we need to support improper list binding." - (declare (debug ([&or (&rest [&or (sexp form) sexp]) - (vector [&rest [sexp form]])] - body)) - (indent 1)) - (if (vectorp varlist) - `(let* ,(dash--match (aref varlist 0) (aref varlist 1)) - ,@body) - (let* ((varlist (dash--normalize-let-varlist varlist)) - (inputs (--map-indexed (list (make-symbol (format "input%d" it-index)) (cadr it)) varlist)) - (new-varlist (--map (list (caar it) (cadr it)) (-zip varlist inputs)))) - `(let ,inputs - (-let* ,new-varlist ,@body))))) - -(defmacro -lambda (match-form &rest body) - "Return a lambda which destructures its input as MATCH-FORM and executes BODY. - -Note that you have to enclose the MATCH-FORM in a pair of parens, -such that: - - (-lambda (x) body) - (-lambda (x y ...) body) - -has the usual semantics of `lambda'. Furthermore, these get -translated into normal lambda, so there is no performance -penalty. - -See `-let' for the description of destructuring mechanism." - (declare (doc-string 2) (indent defun) - (debug (&define sexp - [&optional stringp] - [&optional ("interactive" interactive)] - def-body))) - (cond - ((not (consp match-form)) - (signal 'wrong-type-argument "match-form must be a list")) - ;; no destructuring, so just return regular lambda to make things faster - ((-all? 'symbolp match-form) - `(lambda ,match-form ,@body)) - (t - (let* ((inputs (--map-indexed (list it (make-symbol (format "input%d" it-index))) match-form))) - ;; TODO: because inputs to the lambda are evaluated only once, - ;; -let* need not to create the extra bindings to ensure that. - ;; We should find a way to optimize that. Not critical however. - `(lambda ,(--map (cadr it) inputs) - (-let* ,inputs ,@body)))))) - -(defmacro -setq (&rest forms) - "Bind each MATCH-FORM to the value of its VAL. - -MATCH-FORM destructuring is done according to the rules of `-let'. - -This macro allows you to bind multiple variables by destructuring -the value, so for example: - - (-setq (a b) x - (&plist :c c) plist) - -expands roughly speaking to the following code - - (setq a (car x) - b (cadr x) - c (plist-get plist :c)) - -Care is taken to only evaluate each VAL once so that in case of -multiple assignments it does not cause unexpected side effects. - -\(fn [MATCH-FORM VAL]...)" - (declare (debug (&rest sexp form)) - (indent 1)) - (when (= (mod (length forms) 2) 1) - (error "Odd number of arguments")) - (let* ((forms-and-sources - ;; First get all the necessary mappings with all the - ;; intermediate bindings. - (-map (lambda (x) (dash--match (car x) (cadr x))) - (-partition 2 forms))) - ;; To preserve the logic of dynamic scoping we must ensure - ;; that we `setq' the variables outside of the `let*' form - ;; which holds the destructured intermediate values. For - ;; this we generate for each variable a placeholder which is - ;; bound to (lexically) the result of the destructuring. - ;; Then outside of the helper `let*' form we bind all the - ;; original variables to their respective placeholders. - ;; TODO: There is a lot of room for possible optimization, - ;; for start playing with `special-variable-p' to eliminate - ;; unnecessary re-binding. - (variables-to-placeholders - (-mapcat - (lambda (bindings) - (-map - (lambda (binding) - (let ((var (car binding))) - (list var (make-symbol (concat "--dash-binding-" (symbol-name var) "--"))))) - (--filter (not (string-prefix-p "--" (symbol-name (car it)))) bindings))) - forms-and-sources))) - `(let ,(-map 'cadr variables-to-placeholders) - (let* ,(-flatten-n 1 forms-and-sources) - (setq ,@(-flatten (-map 'reverse variables-to-placeholders)))) - (setq ,@(-flatten variables-to-placeholders))))) - -(defmacro -if-let* (vars-vals then &rest else) - "If all VALS evaluate to true, bind them to their corresponding -VARS and do THEN, otherwise do ELSE. VARS-VALS should be a list -of (VAR VAL) pairs. - -Note: binding is done according to `-let*'. VALS are evaluated -sequentially, and evaluation stops after the first nil VAL is -encountered." - (declare (debug ((&rest (sexp form)) form body)) - (indent 2)) - (->> vars-vals - (--mapcat (dash--match (car it) (cadr it))) - (--reduce-r-from - (let ((var (car it)) - (val (cadr it))) - `(let ((,var ,val)) - (if ,var ,acc ,@else))) - then))) - -(defmacro -if-let (var-val then &rest else) - "If VAL evaluates to non-nil, bind it to VAR and do THEN, -otherwise do ELSE. - -Note: binding is done according to `-let'. - -\(fn (VAR VAL) THEN &rest ELSE)" - (declare (debug ((sexp form) form body)) - (indent 2)) - `(-if-let* (,var-val) ,then ,@else)) - -(defmacro --if-let (val then &rest else) - "If VAL evaluates to non-nil, bind it to symbol `it' and do THEN, -otherwise do ELSE." - (declare (debug (form form body)) - (indent 2)) - `(-if-let (it ,val) ,then ,@else)) - -(defmacro -when-let* (vars-vals &rest body) - "If all VALS evaluate to true, bind them to their corresponding -VARS and execute body. VARS-VALS should be a list of (VAR VAL) -pairs. - -Note: binding is done according to `-let*'. VALS are evaluated -sequentially, and evaluation stops after the first nil VAL is -encountered." - (declare (debug ((&rest (sexp form)) body)) - (indent 1)) - `(-if-let* ,vars-vals (progn ,@body))) - -(defmacro -when-let (var-val &rest body) - "If VAL evaluates to non-nil, bind it to VAR and execute body. - -Note: binding is done according to `-let'. - -\(fn (VAR VAL) &rest BODY)" - (declare (debug ((sexp form) body)) - (indent 1)) - `(-if-let ,var-val (progn ,@body))) - -(defmacro --when-let (val &rest body) - "If VAL evaluates to non-nil, bind it to symbol `it' and -execute body." - (declare (debug (form body)) - (indent 1)) - `(--if-let ,val (progn ,@body))) - -(defvar -compare-fn nil - "Tests for equality use this function or `equal' if this is nil. -It should only be set using dynamic scope with a let, like: - - (let ((-compare-fn #\\='=)) (-union numbers1 numbers2 numbers3)") - -(defun -distinct (list) - "Return a new list with all duplicates removed. -The test for equality is done with `equal', -or with `-compare-fn' if that's non-nil. - -Alias: `-uniq'" - ;; Implementation note: The speedup gained from hash table lookup - ;; starts to outweigh its overhead for lists of length greater than - ;; 32. See discussion in PR #305. - (let* ((len (length list)) - (lut (and (> len 32) - ;; Check that `-compare-fn' is a valid hash-table - ;; lookup function or `nil'. - (memq -compare-fn '(nil equal eq eql)) - (make-hash-table :test (or -compare-fn #'equal) - :size len)))) - (if lut - (--filter (unless (gethash it lut) - (puthash it t lut)) - list) - (--each list (unless (-contains? lut it) (!cons it lut))) - (nreverse lut)))) - -(defalias '-uniq '-distinct) - -(defun -union (list list2) - "Return a new list containing the elements of LIST and elements of LIST2 that are not in LIST. -The test for equality is done with `equal', -or with `-compare-fn' if that's non-nil." - ;; We fall back to iteration implementation if the comparison - ;; function isn't one of `eq', `eql' or `equal'. - (let* ((result (reverse list)) - ;; TODO: get rid of this dynamic variable, pass it as an - ;; argument instead. - (-compare-fn (if (bound-and-true-p -compare-fn) - -compare-fn - 'equal))) - (if (memq -compare-fn '(eq eql equal)) - (let ((ht (make-hash-table :test -compare-fn))) - (--each list (puthash it t ht)) - (--each list2 (unless (gethash it ht) (!cons it result)))) - (--each list2 (unless (-contains? result it) (!cons it result)))) - (nreverse result))) - -(defun -intersection (list list2) - "Return a new list containing only the elements that are members of both LIST and LIST2. -The test for equality is done with `equal', -or with `-compare-fn' if that's non-nil." - (--filter (-contains? list2 it) list)) - -(defun -difference (list list2) - "Return a new list with only the members of LIST that are not in LIST2. -The test for equality is done with `equal', -or with `-compare-fn' if that's non-nil." - (--filter (not (-contains? list2 it)) list)) - -(defun -powerset (list) - "Return the power set of LIST." - (if (null list) '(()) - (let ((last (-powerset (cdr list)))) - (append (mapcar (lambda (x) (cons (car list) x)) last) - last)))) - -(defun -permutations (list) - "Return the permutations of LIST." - (if (null list) '(()) - (apply #'append - (mapcar (lambda (x) - (mapcar (lambda (perm) (cons x perm)) - (-permutations (remove x list)))) - list)))) - -(defun -inits (list) - "Return all prefixes of LIST." - (let ((res (list list))) - (setq list (reverse list)) - (while list - (push (reverse (!cdr list)) res)) - res)) - -(defun -tails (list) - "Return all suffixes of LIST" - (-reductions-r-from 'cons nil list)) - -(defun -common-prefix (&rest lists) - "Return the longest common prefix of LISTS." - (declare (pure t) (side-effect-free t)) - (--reduce (--take-while (and acc (equal (pop acc) it)) it) - lists)) - -(defun -common-suffix (&rest lists) - "Return the longest common suffix of LISTS." - (nreverse (apply #'-common-prefix (mapcar #'reverse lists)))) - -(defun -contains? (list element) - "Return non-nil if LIST contains ELEMENT. - -The test for equality is done with `equal', or with `-compare-fn' -if that's non-nil. - -Alias: `-contains-p'" - (not - (null - (cond - ((null -compare-fn) (member element list)) - ((eq -compare-fn 'eq) (memq element list)) - ((eq -compare-fn 'eql) (memql element list)) - (t - (let ((lst list)) - (while (and lst - (not (funcall -compare-fn element (car lst)))) - (setq lst (cdr lst))) - lst)))))) - -(defalias '-contains-p '-contains?) - -(defun -same-items? (list list2) - "Return true if LIST and LIST2 has the same items. - -The order of the elements in the lists does not matter. - -Alias: `-same-items-p'" - (let ((length-a (length list)) - (length-b (length list2))) - (and - (= length-a length-b) - (= length-a (length (-intersection list list2)))))) - -(defalias '-same-items-p '-same-items?) - -(defun -is-prefix? (prefix list) - "Return non-nil if PREFIX is prefix of LIST. - -Alias: `-is-prefix-p'" - (declare (pure t) (side-effect-free t)) - (--each-while list (equal (car prefix) it) - (!cdr prefix)) - (not prefix)) - -(defun -is-suffix? (suffix list) - "Return non-nil if SUFFIX is suffix of LIST. - -Alias: `-is-suffix-p'" - (declare (pure t) (side-effect-free t)) - (-is-prefix? (reverse suffix) (reverse list))) - -(defun -is-infix? (infix list) - "Return non-nil if INFIX is infix of LIST. - -This operation runs in O(n^2) time - -Alias: `-is-infix-p'" - (declare (pure t) (side-effect-free t)) - (let (done) - (while (and (not done) list) - (setq done (-is-prefix? infix list)) - (!cdr list)) - done)) - -(defalias '-is-prefix-p '-is-prefix?) -(defalias '-is-suffix-p '-is-suffix?) -(defalias '-is-infix-p '-is-infix?) - -(defun -sort (comparator list) - "Sort LIST, stably, comparing elements using COMPARATOR. -Return the sorted list. LIST is NOT modified by side effects. -COMPARATOR is called with two elements of LIST, and should return non-nil -if the first element should sort before the second." - (sort (copy-sequence list) comparator)) - -(defmacro --sort (form list) - "Anaphoric form of `-sort'." - (declare (debug (form form))) - `(-sort (lambda (it other) ,form) ,list)) - -(defun -list (&rest args) - "Return a list with ARGS. - -If first item of ARGS is already a list, simply return ARGS. If -not, return a list with ARGS as elements." - (declare (pure t) (side-effect-free t)) - (let ((arg (car args))) - (if (listp arg) arg args))) - -(defun -repeat (n x) - "Return a list with X repeated N times. -Return nil if N is less than 1." - (declare (pure t) (side-effect-free t)) - (let (ret) - (--dotimes n (!cons x ret)) - ret)) - -(defun -sum (list) - "Return the sum of LIST." - (declare (pure t) (side-effect-free t)) - (apply '+ list)) - -(defun -running-sum (list) - "Return a list with running sums of items in LIST. - -LIST must be non-empty." - (declare (pure t) (side-effect-free t)) - (unless (consp list) - (error "LIST must be non-empty")) - (-reductions '+ list)) - -(defun -product (list) - "Return the product of LIST." - (declare (pure t) (side-effect-free t)) - (apply '* list)) - -(defun -running-product (list) - "Return a list with running products of items in LIST. - -LIST must be non-empty." - (declare (pure t) (side-effect-free t)) - (unless (consp list) - (error "LIST must be non-empty")) - (-reductions '* list)) - -(defun -max (list) - "Return the largest value from LIST of numbers or markers." - (declare (pure t) (side-effect-free t)) - (apply 'max list)) - -(defun -min (list) - "Return the smallest value from LIST of numbers or markers." - (declare (pure t) (side-effect-free t)) - (apply 'min list)) - -(defun -max-by (comparator list) - "Take a comparison function COMPARATOR and a LIST and return -the greatest element of the list by the comparison function. - -See also combinator `-on' which can transform the values before -comparing them." - (--reduce (if (funcall comparator it acc) it acc) list)) - -(defun -min-by (comparator list) - "Take a comparison function COMPARATOR and a LIST and return -the least element of the list by the comparison function. - -See also combinator `-on' which can transform the values before -comparing them." - (--reduce (if (funcall comparator it acc) acc it) list)) - -(defmacro --max-by (form list) - "Anaphoric version of `-max-by'. - -The items for the comparator form are exposed as \"it\" and \"other\"." - (declare (debug (form form))) - `(-max-by (lambda (it other) ,form) ,list)) - -(defmacro --min-by (form list) - "Anaphoric version of `-min-by'. - -The items for the comparator form are exposed as \"it\" and \"other\"." - (declare (debug (form form))) - `(-min-by (lambda (it other) ,form) ,list)) - -(defun -iterate (fun init n) - "Return a list of iterated applications of FUN to INIT. - -This means a list of form: - - (init (fun init) (fun (fun init)) ...) - -N is the length of the returned list." - (if (= n 0) nil - (let ((r (list init))) - (--dotimes (1- n) - (push (funcall fun (car r)) r)) - (nreverse r)))) - -(defun -fix (fn list) - "Compute the (least) fixpoint of FN with initial input LIST. - -FN is called at least once, results are compared with `equal'." - (let ((re (funcall fn list))) - (while (not (equal list re)) - (setq list re) - (setq re (funcall fn re))) - re)) - -(defmacro --fix (form list) - "Anaphoric form of `-fix'." - `(-fix (lambda (it) ,form) ,list)) - -(defun -unfold (fun seed) - "Build a list from SEED using FUN. - -This is \"dual\" operation to `-reduce-r': while -reduce-r -consumes a list to produce a single value, `-unfold' takes a -seed value and builds a (potentially infinite!) list. - -FUN should return `nil' to stop the generating process, or a -cons (A . B), where A will be prepended to the result and B is -the new seed." - (let ((last (funcall fun seed)) r) - (while last - (push (car last) r) - (setq last (funcall fun (cdr last)))) - (nreverse r))) - -(defmacro --unfold (form seed) - "Anaphoric version of `-unfold'." - (declare (debug (form form))) - `(-unfold (lambda (it) ,form) ,seed)) - -(defun -cons-pair? (con) - "Return non-nil if CON is true cons pair. -That is (A . B) where B is not a list. - -Alias: `-cons-pair-p'" - (declare (pure t) (side-effect-free t)) - (and (listp con) - (not (listp (cdr con))))) - -(defalias '-cons-pair-p '-cons-pair?) - -(defun -cons-to-list (con) - "Convert a cons pair to a list with `car' and `cdr' of the pair respectively." - (declare (pure t) (side-effect-free t)) - (list (car con) (cdr con))) - -(defun -value-to-list (val) - "Convert a value to a list. - -If the value is a cons pair, make a list with two elements, `car' -and `cdr' of the pair respectively. - -If the value is anything else, wrap it in a list." - (declare (pure t) (side-effect-free t)) - (cond - ((-cons-pair? val) (-cons-to-list val)) - (t (list val)))) - -(defun -tree-mapreduce-from (fn folder init-value tree) - "Apply FN to each element of TREE, and make a list of the results. -If elements of TREE are lists themselves, apply FN recursively to -elements of these nested lists. - -Then reduce the resulting lists using FOLDER and initial value -INIT-VALUE. See `-reduce-r-from'. - -This is the same as calling `-tree-reduce-from' after `-tree-map' -but is twice as fast as it only traverse the structure once." - (cond - ((not tree) nil) - ((-cons-pair? tree) (funcall fn tree)) - ((listp tree) - (-reduce-r-from folder init-value (mapcar (lambda (x) (-tree-mapreduce-from fn folder init-value x)) tree))) - (t (funcall fn tree)))) - -(defmacro --tree-mapreduce-from (form folder init-value tree) - "Anaphoric form of `-tree-mapreduce-from'." - (declare (debug (form form form form))) - `(-tree-mapreduce-from (lambda (it) ,form) (lambda (it acc) ,folder) ,init-value ,tree)) - -(defun -tree-mapreduce (fn folder tree) - "Apply FN to each element of TREE, and make a list of the results. -If elements of TREE are lists themselves, apply FN recursively to -elements of these nested lists. - -Then reduce the resulting lists using FOLDER and initial value -INIT-VALUE. See `-reduce-r-from'. - -This is the same as calling `-tree-reduce' after `-tree-map' -but is twice as fast as it only traverse the structure once." - (cond - ((not tree) nil) - ((-cons-pair? tree) (funcall fn tree)) - ((listp tree) - (-reduce-r folder (mapcar (lambda (x) (-tree-mapreduce fn folder x)) tree))) - (t (funcall fn tree)))) - -(defmacro --tree-mapreduce (form folder tree) - "Anaphoric form of `-tree-mapreduce'." - (declare (debug (form form form))) - `(-tree-mapreduce (lambda (it) ,form) (lambda (it acc) ,folder) ,tree)) - -(defun -tree-map (fn tree) - "Apply FN to each element of TREE while preserving the tree structure." - (cond - ((not tree) nil) - ((-cons-pair? tree) (funcall fn tree)) - ((listp tree) - (mapcar (lambda (x) (-tree-map fn x)) tree)) - (t (funcall fn tree)))) - -(defmacro --tree-map (form tree) - "Anaphoric form of `-tree-map'." - (declare (debug (form form))) - `(-tree-map (lambda (it) ,form) ,tree)) - -(defun -tree-reduce-from (fn init-value tree) - "Use FN to reduce elements of list TREE. -If elements of TREE are lists themselves, apply the reduction recursively. - -FN is first applied to INIT-VALUE and first element of the list, -then on this result and second element from the list etc. - -The initial value is ignored on cons pairs as they always contain -two elements." - (cond - ((not tree) nil) - ((-cons-pair? tree) tree) - ((listp tree) - (-reduce-r-from fn init-value (mapcar (lambda (x) (-tree-reduce-from fn init-value x)) tree))) - (t tree))) - -(defmacro --tree-reduce-from (form init-value tree) - "Anaphoric form of `-tree-reduce-from'." - (declare (debug (form form form))) - `(-tree-reduce-from (lambda (it acc) ,form) ,init-value ,tree)) - -(defun -tree-reduce (fn tree) - "Use FN to reduce elements of list TREE. -If elements of TREE are lists themselves, apply the reduction recursively. - -FN is first applied to first element of the list and second -element, then on this result and third element from the list etc. - -See `-reduce-r' for how exactly are lists of zero or one element handled." - (cond - ((not tree) nil) - ((-cons-pair? tree) tree) - ((listp tree) - (-reduce-r fn (mapcar (lambda (x) (-tree-reduce fn x)) tree))) - (t tree))) - -(defmacro --tree-reduce (form tree) - "Anaphoric form of `-tree-reduce'." - (declare (debug (form form))) - `(-tree-reduce (lambda (it acc) ,form) ,tree)) - -(defun -tree-map-nodes (pred fun tree) - "Call FUN on each node of TREE that satisfies PRED. - -If PRED returns nil, continue descending down this node. If PRED -returns non-nil, apply FUN to this node and do not descend -further." - (if (funcall pred tree) - (funcall fun tree) - (if (and (listp tree) - (not (-cons-pair? tree))) - (-map (lambda (x) (-tree-map-nodes pred fun x)) tree) - tree))) - -(defmacro --tree-map-nodes (pred form tree) - "Anaphoric form of `-tree-map-nodes'." - `(-tree-map-nodes (lambda (it) ,pred) (lambda (it) ,form) ,tree)) - -(defun -tree-seq (branch children tree) - "Return a sequence of the nodes in TREE, in depth-first search order. - -BRANCH is a predicate of one argument that returns non-nil if the -passed argument is a branch, that is, a node that can have children. - -CHILDREN is a function of one argument that returns the children -of the passed branch node. - -Non-branch nodes are simply copied." - (cons tree - (when (funcall branch tree) - (-mapcat (lambda (x) (-tree-seq branch children x)) - (funcall children tree))))) - -(defmacro --tree-seq (branch children tree) - "Anaphoric form of `-tree-seq'." - `(-tree-seq (lambda (it) ,branch) (lambda (it) ,children) ,tree)) - -(defun -clone (list) - "Create a deep copy of LIST. -The new list has the same elements and structure but all cons are -replaced with new ones. This is useful when you need to clone a -structure such as plist or alist." - (declare (pure t) (side-effect-free t)) - (-tree-map 'identity list)) - -(defun dash-enable-font-lock () - "Add syntax highlighting to dash functions, macros and magic values." - (eval-after-load 'lisp-mode - '(progn - (let ((new-keywords '( - "!cons" - "!cdr" - "-each" - "--each" - "-each-indexed" - "--each-indexed" - "-each-while" - "--each-while" - "-doto" - "-dotimes" - "--dotimes" - "-map" - "--map" - "-reduce-from" - "--reduce-from" - "-reduce" - "--reduce" - "-reduce-r-from" - "--reduce-r-from" - "-reduce-r" - "--reduce-r" - "-reductions-from" - "-reductions-r-from" - "-reductions" - "-reductions-r" - "-filter" - "--filter" - "-select" - "--select" - "-remove" - "--remove" - "-reject" - "--reject" - "-remove-first" - "--remove-first" - "-reject-first" - "--reject-first" - "-remove-last" - "--remove-last" - "-reject-last" - "--reject-last" - "-remove-item" - "-non-nil" - "-keep" - "--keep" - "-map-indexed" - "--map-indexed" - "-splice" - "--splice" - "-splice-list" - "--splice-list" - "-map-when" - "--map-when" - "-replace-where" - "--replace-where" - "-map-first" - "--map-first" - "-map-last" - "--map-last" - "-replace" - "-replace-first" - "-replace-last" - "-flatten" - "-flatten-n" - "-concat" - "-mapcat" - "--mapcat" - "-copy" - "-cons*" - "-snoc" - "-first" - "--first" - "-find" - "--find" - "-some" - "--some" - "-any" - "--any" - "-last" - "--last" - "-first-item" - "-second-item" - "-third-item" - "-fourth-item" - "-fifth-item" - "-last-item" - "-butlast" - "-count" - "--count" - "-any?" - "--any?" - "-some?" - "--some?" - "-any-p" - "--any-p" - "-some-p" - "--some-p" - "-some->" - "-some->>" - "-some-->" - "-all?" - "-all-p" - "--all?" - "--all-p" - "-every?" - "--every?" - "-all-p" - "--all-p" - "-every-p" - "--every-p" - "-none?" - "--none?" - "-none-p" - "--none-p" - "-only-some?" - "--only-some?" - "-only-some-p" - "--only-some-p" - "-slice" - "-take" - "-drop" - "-drop-last" - "-take-last" - "-take-while" - "--take-while" - "-drop-while" - "--drop-while" - "-split-at" - "-rotate" - "-insert-at" - "-replace-at" - "-update-at" - "--update-at" - "-remove-at" - "-remove-at-indices" - "-split-with" - "--split-with" - "-split-on" - "-split-when" - "--split-when" - "-separate" - "--separate" - "-partition-all-in-steps" - "-partition-in-steps" - "-partition-all" - "-partition" - "-partition-after-item" - "-partition-after-pred" - "-partition-before-item" - "-partition-before-pred" - "-partition-by" - "--partition-by" - "-partition-by-header" - "--partition-by-header" - "-group-by" - "--group-by" - "-interpose" - "-interleave" - "-unzip" - "-zip-with" - "--zip-with" - "-zip" - "-zip-fill" - "-zip-lists" - "-zip-pair" - "-cycle" - "-pad" - "-annotate" - "--annotate" - "-table" - "-table-flat" - "-partial" - "-elem-index" - "-elem-indices" - "-find-indices" - "--find-indices" - "-find-index" - "--find-index" - "-find-last-index" - "--find-last-index" - "-select-by-indices" - "-select-columns" - "-select-column" - "-grade-up" - "-grade-down" - "->" - "->>" - "-->" - "-as->" - "-when-let" - "-when-let*" - "--when-let" - "-if-let" - "-if-let*" - "--if-let" - "-let*" - "-let" - "-lambda" - "-distinct" - "-uniq" - "-union" - "-intersection" - "-difference" - "-powerset" - "-permutations" - "-inits" - "-tails" - "-common-prefix" - "-common-suffix" - "-contains?" - "-contains-p" - "-same-items?" - "-same-items-p" - "-is-prefix-p" - "-is-prefix?" - "-is-suffix-p" - "-is-suffix?" - "-is-infix-p" - "-is-infix?" - "-sort" - "--sort" - "-list" - "-repeat" - "-sum" - "-running-sum" - "-product" - "-running-product" - "-max" - "-min" - "-max-by" - "--max-by" - "-min-by" - "--min-by" - "-iterate" - "--iterate" - "-fix" - "--fix" - "-unfold" - "--unfold" - "-cons-pair?" - "-cons-pair-p" - "-cons-to-list" - "-value-to-list" - "-tree-mapreduce-from" - "--tree-mapreduce-from" - "-tree-mapreduce" - "--tree-mapreduce" - "-tree-map" - "--tree-map" - "-tree-reduce-from" - "--tree-reduce-from" - "-tree-reduce" - "--tree-reduce" - "-tree-seq" - "--tree-seq" - "-tree-map-nodes" - "--tree-map-nodes" - "-clone" - "-rpartial" - "-juxt" - "-applify" - "-on" - "-flip" - "-const" - "-cut" - "-orfn" - "-andfn" - "-iteratefn" - "-fixfn" - "-prodfn" - )) - (special-variables '( - "it" - "it-index" - "acc" - "other" - ))) - (font-lock-add-keywords 'emacs-lisp-mode `((,(concat "\\_<" (regexp-opt special-variables 'paren) "\\_>") - 1 font-lock-variable-name-face)) 'append) - (font-lock-add-keywords 'emacs-lisp-mode `((,(concat "(\\s-*" (regexp-opt new-keywords 'paren) "\\_>") - 1 font-lock-keyword-face)) 'append)) - (--each (buffer-list) - (with-current-buffer it - (when (and (eq major-mode 'emacs-lisp-mode) - (boundp 'font-lock-mode) - font-lock-mode) - (font-lock-refresh-defaults))))))) - -(provide 'dash) -;;; dash.el ends here diff --git a/elpa/dash-20200119.2310/dash.elc b/elpa/dash-20200119.2310/dash.elc deleted file mode 100644 index 3f28baeff4be13c1423a4533ab413f4cb9a2cf68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102271 zcmeFa`+pn9eKyLwZRC?C={@It+pehCq8vfRE^eff#-b?7)+e^)N_3jk@~I#alu(lZ z1CX+mU(UaNp6B__%+3Of3oSb7c|WI(MF6`yJM*3I{Wiba|9tNsmX?+(zxvg$lD)y{ zS?{EKq%XaGvVYn+93`*2!%=V0PqNnSx~_cJJAajQPEL}+*?I4@_ovP|E{|?kbn)O- zZI?VRAG$9Gwq){gWp3`{oYBkxu@&BKXntkbUYX)yn4HPvYFg*x1aPzXUUzjVfVQACfVfW>gLVL^}AV` z;1$RHM8C> z>mPmKUOWc3*PUUHOAu@(mUDd3KO_$GFYy=atGTz^G63ptlJuKo^Wm}Z4c~7iwycCe z=^ghDh550&?p9%B!d0qS&ZZGYbZ7qk4MhW{pMyWQJqw6S}fRkLJPpFezh z5TbfJ^24+b*)6}oyL(T2= z*~NL{0MR|_zPNY^E-*Z;5|NWF0rkb;=JHDzgwJiSzl02+e%fmx=wDQ$eXvGHtkZSUD8FweMG0nx;H4AVMiXI((|v~xz>(p@?8 z^%R#bU&Ao+|0E4PcCvk0EfOH#BWU?BVZlft1n`HnoT(pB|%X#7HO;)YqqbB;ic`Gfo%(LGtN$sfoB3T8odC)O66f+ ztgllPUeAl~xFN>r#{;u_b2cEj!8e^y0ovMxDD9qhyU^1|17LF%6z^wR5QL>0;qUYc zLB1hB=Z2WFx5$=kJDSdRYTH25$`+w}LoznJ<3>50rR}7pgi82TB_s<=`SQvB{W*f& zo+_~4RwFBlcdDNmnO=QmW8?k`J~SxLo096%K-VG9#Rp9h-FP2TUkn-Sc;iRV4bsNO z2ly9{Z2ainy?eMj#e-=Zcg|A>Hfibf`WIcN8JyoN*AA%NISrvl1@%0Up0EWP#1o6? z3@x`e^{l=KzcodF0iD6Yc#7sg)(PErG4&zy)RblOn2=MNwuA&mYU1AgDj;&ZVgmd! z97+R~Q-|qi*S~JJ(`1tfVkQt7*3BjHt(!|Lch@CF8$Xv6CBs@J!}_PCHU19FvHu)P zTMP#hj->FvmzJMOPOq$dCb2C+PQM*n1iO#Zf94E|38FusHd|?A&`I+Pve(=7BS(`%n1shQEj!1P`1Vi zMG~UcxJJoQ5326Q(p&;csxY{{&ea6s84acN2I&5*OSAaoEwsk&;l()|t8{-PTksK% zE>7Vodpn`FgR9clo9mW0Ai6K0dBBA2_0PL6!CR8!;ouaK>iiY_lrLW;kG}e%nmSb< zpJym!u(x`rn8s9lh)P(&*@Ev<)}?>7Vf4}!xH(01^e;}G4h7a8`Bi>Ry~!I>9{UsX ztK7Uv?5{cOZ?+u)o?@r$Z|D{6j%9e%p!%wRFHAGhugd-x&N^hD6LU0t?+=? zwCL_Adm9b30wtKY-RYJjgth&ZTt$-m=A?7_;;19_=bI#ewXyA3w%J-X@C4f3Fh?HM zak+3?%~ClFugAq9q5z=r!U~Gcw-V@8qbCdNlG2RzNM|m1JfJ;nybp&n4KDLGA(}wv zN9XX+`yiwYqul4`mf+;oRN}PT3V2+g zPm@%J&2{?k8XNE7-zNS42wTDKe}KP?6SOxz*ng1I@mM&Z8o6qrpH)3vC1dHag}Xo5 zB0b0pm}X8=wHq~BhT{~F+?a*@!h1Zp5Z;q049l}354}aFcz=@BP9l1JNSDPpqF3nf zKxnrF(Tjvg>~_3dT1kIU@j-%73E6bufb73i9EGoRw4+!9Cs85!U6yXHie!wRmeb8t zN(sWqMPQ#DD+If;a(8tX?#xNgC-Ih`~s;h~G|8&o$WXbh`|ztNsMj zhI1uN_(=43gWyOXrOx22JG2lq^tu6p%v9>dDu%t6uMjlo zkIuUt*#5`%>q+9M)+s z;~ZA=pWv_uL5_IlP4qO%Ait+xZ$g6KMqSJuQbXiWnNU?OO+c_;jdqZ`~2Y%CAX54QYB8nvSOe8F+2BtcO=z4-H_I88z7{wbz7*8ZGJ8w=V2_Gpdgis4tDuRg zpm(8zuEBXXi+8O}z`WjeGA?FbJMA_TRlvN`?fR90@`eQ!zYi40PI5s9C5iTsq$Y-05xbM!# zHTuqr7EhquNKU4;`Zk?cSBz^Qt#^TD8NQW*bSADv!3WcYo3)60-rXxnGtEm*oql9}yfm{_&`3!|s1i;*f#RQ|UC+ zag&~dI*ltuot@U~tm#Ei$CjM)3r9`TU1FZf2rRpmE_J3BP3$bYOz3Gt2Lu#04HRYp8K*#E-3VN?VFSQb5@Qe=b@ z5V#qR2K}zN2cIM9w{zn8zaA@59o#Mn6(fwu^@nTVKvWwLtOnO0Px`wnR3qxmOa|rb z4Kgi)6if=Tgl7B7_dE(Al9Iz^*Vs#8eunuo2tX}ab>wKht@ zq<-62=d{;1K2Ux%f-3mh+W27OM^JMaE^My{k8-J=y9uds);*f0@J8CMFHB17+uJTF z(nV2i(i7-99!5>ukzF4IrqfNl5^MUm&~YL@I2oZvK=AG0BKfXk#Sl)%qxeOU%S$=_ zh<-=`h6`nMtax`PftUJ-1xl*JE7&5EMWqpMt+5n~WuHn7w(2j#;dM#Y^O@wULu7*tO&^FU zB^!p`oq1@MVMHiCMJ8>u(_-wsFsHfn0?rt=e6gI4cTT8}CI}nR+?TAp0{1Tod;6?V z?uECLXm=_HeSDuvsVaJ3QB(CM=0DNIWKR7%nU*;@?QFZeuV%S&$_dfl_vj@Z`^o;7 zWfUcaT+V@5uLuD>Fy9G31b%CRIU@nShUDLS4%sf@i*RlTrR3g>eG#ET2&rw8NN2O0 zg>iH*ShfosXeDTe5v&j_2`tAY3IR06nzw92}Qut$m z5vPo%nl$Vb7*{XOjvxrC9V);t?~A-bGN+kskM{oqE7|udBYE)hKgLvuE6dKSlq6)XZrwynP-GE*X}c(H(Oza&pOac?)@7C`*+q87(BLLUiyZ*II#1G5FL=L)Jn% zw#!*c=$2qb=F0yC17g_<{sq5Dvk%ws**hoj8jtggcBG;pd$}f!G;7wy29+KYX3$B#rOa+ZMjoE zGa4Y@@}l2E>knV_n+dl=AM%IDt=k`6jH0X)(+>_wQxCbOdGpc`${ z(Exz;FcZA&Ep5gA4Kxw4so>t@iy{?8lVAgIj z-bsS}MtEm|I|WCSd~m7*^P#cTxI$z9C3zcIuWOC?C`45FAB zU7)P22b$%MJawYMis$vq7>(MP*r7Dr&O1#wTEyPOEI%hd7z`=vxTbqTrm6Tr(ooEJ ztyhK8GzC&o*!FO6_7<%3>@8AD*bfOQ^qYG_7LrmFyn-Dz_)gb}&cb5f)<@Wi zwmvP|ZU~nrPXRMLPD~jkFS~uw=uz_GZSvqNwn$0L1i?4~-o@B%ZcXrkb4V^rl6SX{ zMS>x$dVR!huszn2&`WsN8c=O&aFes;)M^Uu!Q}a^yXgDVha(4K4DzJn<;lqAKVtGX za;M7O;YDNfiP4W4=r2mWMY?-FM*(SV~yxs+Vi{>l<{H*t)qD z>sCL_x-q#iX}z*nj%(cYU+UWBJI{ez?TB9?-z+XK8sAmJcE>cewX;_1(A<_gXOAO! zZi}<0qW#UKPnI@!{MI5QpM2rC0_cAtDoZhzn{;tY!F=?j*?yNlBQ zJY(V0R+a&7t6T7kFSbC7Qk3`Qx7a{o9C(h|(Z?m(^ET&YMnzEvVF)O_rmZ_Tn(*QL zCS}j)_|dkp3Q$K8K)@RUy@MoY^828X>9F95@LFXbbw zyZWws!bCwIZPoy;p@AQ34B(^w;1KW*O{G>>_i~!UT%l`6SO_$98N>)YAr?&Ocj9_cxn5+}L4)|Ih?`Yp zTREx^&}CV}XP&wA2{*<07CrjCxDpei4z>zLY!)UUS+2#?tb50sn{FT3;R(glC)huH zB8Cj0V5mec&QQb{9*eO13Dg;M4IpWDMiAg?TnBXOC|^5-)j+{Vv9G>_Biqs<1zdud zFkb-|t>3m}!`tWxg(~J+{U4R8PRT3Dip&ZhP{T)>X1oN4F`>oOhkMc(8 z_Er%9&cs4PXkd95?#vf@M=ufM`Q|(LEJoWoXCz zd=Z4*VCi&_-;1LuF*I_4WKfHX9TIFd^Kr8lY=?k>R2g$bHMM|giHjj>Kr?tf=3trT zI2Fl0HYEFa3X=V^!?AZota@F+v*|X;B8Wu~PgTpQR`pq5W+Rn6#Pisoyq*gql`qgI z7X<&y6~j4*HOcjS5q?&0?YMq1j_cWs<|39#K$Yt%2F2Xg%d)%>I4)sOn#DNkAVy)O zxvse3uLJM7Os@s<9&nzZG1qtIAc%}sV?K;YG2kM56?UpPlK)Y?ZvBr);xbn${vvxZ z@U9ehr+7SV(a%x;1vo4EZoypnke@I_7VO`=X{T72xkA`bVRJ&-z`LWa(S+nJQx8?e25!j%!4zvJU1qdsW@(}9{hzbRV1ZW zQ4$HV$=?DC6}=$h>HA{YviU>XH0A`Gc>qTz8f2eOtN|$t!=v&^SMzJhv3fwAaRQiu z_Xj~B?e5-nGU=NnG8BZ8a0SG3)o_-<4ehP~>V>9yJfOd{bgoci>2t^(J>t*0{}L}8 z^TYOz!`pIwa7_1$=2V1A0W8*7Eo-zFX;Pc}=H^6j<9APS>$uF_olwzXatjOl-e8H4 zd^%JD=*ECj29;*b3S_U!=bXQLHc(mxpon2E#s;P?JAfvv8hg2X%@YVO(_!kcp^5fG zCC)xt^2}i6<~NzP?SEh!TKynCDek8}qwczKOXHMahd0O$>(unq1pj3C$5`hF_n-Cm zf8iJ^I?avyir=u_E(FKqJDdW?z!YA-<}nXFFf6EDaKtD00cn*8qu}%PuM2HMIhVCH zykGCdjeOKS7I~~A(ZwaK++X!^MchjsZop)helTTnTC{{ue(&7P;m7-ro#`e!8T`mz zcFZ=Q`6xT&9jKUdVj-_{XU++6Lir{#5W8>C{^e6P&*$`)+n|T&_!lC=^4N%>7u}Jlk-}YtkV}b5kL|19Q${~4R(&Er z)A`XB={}PA%e8xRez<0S=<4c{l5_Jj{U!AKKuoPvMG<+Ws+-$}3?OSP5&@)iwus zjOtxuP#}mge5_V+h{*Y?x6eKa3Stgi0gcMGjX^FaYEjMu!*4|eoeFFiNzTue&SkY9|TFEW{h5e1KhYMp8S z1XaJ_!-!48sueSHa-T@KJfLH~1 zvVU3HcyAfPWtQ1!U3+l5IWBm+Ns$Py!9x*xie#;wHvO-cv?PPmf;I!szX+y)js|KJ zeqrfi;T~sT;3>^8Hwg$%pbM>0{t*`FgZlx0syNMp*ZJ3=@9wLf&9+=2HWonFlapEK zY7RUs$1_jkp7Mv_*VdFe4!qj&Otiy#&3y9=d4A?t_7e~i!bhW=c?;Ycrw*I8*mRQvXp^g3GxMH(B7RcjZ z#7F02O1O0vx{yOgMWZW>aHwij&ZUj_Hr|84mzD|Br>4U>QXWj;K4x%syfW@>cZ7u9{vfU-bq&oGuY->q!d~2UiwAdz@5Wr#*Oz9sjj>{I7ITwes z2D`?|W%&I3IbX_bye>V5z{`R?Z+Q`jib+pkI@|PH!*PpNl*A{((HYMn#h;`7H{Atz zU9g7iR{9e1l2ecn?ja)h*qy1+CHI0+1XU-%U@l>WJAo7tbx{kUhC{caMPGJI!`b0^ z9OVBve#8FY4g^>n+pjuBhw?#>;{xinYZ=O7IND4C^coNdkRqnJyA;HNQ+$eIAyEP(% z#JY03gFK3X-iOD@(*x90AzF(}Iay=y$AWX%0ZP2)eOE5FXNDruK`ZcuDuoo!;$`TX z%zlVCI#CBu(g&LO9`&;6w33f_p6P&%6tN(VK4vnFT*eK;N62ei<#87^>dCG5iDYOG z$L(+F)HKtfsitLYiw?BI$NIXp-plaUU%06YYwp4t3*G7LG30$^$omS&yS(u}2Wsr` z{v2_iJzHAd_}~wG1wP_ZedB}G|3pw1*~PW&EB`ylBGhU_3&vMV_F35tBybD{i&j9|L4bU9#a>a$^ulvO8Q z$k^q$^00MGf+2Z#rpyHJ=D|(Cje!RQNmr0~>W#-@#-X|QeCHHMajQYRv_C?+0AA%| zOJbzO#K^Gq(~?!9+{mNh;4JB%zhX=7LTIDIc#(^@F#m7hT8dH<8)h^jFr`(7(m`;h{^info-WJ9btUjPA1TdOmv&{`j#r3i15r zs)Ojw=jpY`8b=q0=zBAQM0T7}0^PYWdB|*h5RPGvgzZ?jy;;%aXrhrOMyos5!fu%$ zy9Gh!l3g1At0>44Fv9sl%G)}V?6QymgD9{X7r_HM1yO`&iy=yW>pVnp?f;1e|2&RGH=KJv&C_oY)4 zVbppay7qtYJP{x9q;~7lKn*p7FHm=Vmm9Pjk++Ie?Ctx&n?WCip$jmB(fy0~l?$2et`7J70h>q0UCx=22dBPy>Enrrn0LbYOFy zW3HMN(&)sD!&`txddmsc7e=}_{rY3278l!1J^J;#X)O~UwbkCHrTuHHa@evnEYug)Ks8Fk4k z4AD$?OzbVVf4)m=Z2r0?fE^u&ijpm+*RyLs?+qkCsu^>Sgy#wpa4#=(b7O!)*x-yK z=k0*&jqFMdiF`71Fh93+J?6i{k=l9PM+ZtlC<2MJXS3@n;gYrG15-xXz;n?+&uHLz zh$!?bdj8>~`w#c_SxHg~^+{;E2g>jZy!@U8A(q<4A zNIgt`t+q@_T1~2d>VYRvS*R-0vW5Vw*F>x|GW6dK%`xiejZu~_<-JW>>LuJylVF^U zHB+n#n>W|uImxuxyj!A{JvB>#=4S|M@I#%yG*;K|(|_2!$A4S*WL0p}Ha65J37$3s zJ2Gl?EIAyOfS1Q?hqq-p4+FNi4_{^$CWl9>aIr zH5uEo=wANTxz>3z?yFW%Q}Wk)?lQf+MhsN>aWmH$9Vr@tFkW3`Ww)TamXRUDIy3bY zwQ51e&p4uC7ldnG&9uZi^jPtZCQvdLG0qmZKOCPvJFZOT&E%w~Jq3NP1QP@_5@DEoEw< zJ8$_p5~D8I!FXqm68#Vf!FJ=1(Kv zZYEz2d#`~pcapD05ENkQkwihf4$5p54T;V`S8#$x*Zl9`2<977e7FqPqKD!E0b}x1 zywv$MprqDnir78t(<3dP^)-M(`j(&s(xOKfnzW}pC|_vAxJfc3eP%f8%IJ#JlP2Ba z5JB< z9d6F*DhsGXL>gI(<gnzN029hy#*f8R%ISiw@=yR zHXANND(_O#6v)-SC2qTUdN1u=LktcOB$_|bjyXy8hVwcgSa?Gaqs_|eACaD%H7-uSDHzsemSKfAy2*ZfxB_!<6fFi(`9 zH-3h)Gq_0bO>V7?pYo<=@SNE1aGb!^vhibH%fdBZuvT!R1pkQ>xkxQ_$G>kva{Hs; zH_h9^!x&^B;KRpoveU=n!oyozQeDx4m8FFCWN@Nx(yAbowoeh!QXE_Xlg-5kg zv#BsO&*daaBzBtjsJYeP(!_6j>nrGXZi0r6PJX((@&59)RVaCOFwZUKhSu8~@5zE< zRhld)Ff|0RH+Z&H)=Jn3OCEojf~e- zeT5Ue?GQ<-ybIBsd*W{-hRTo@b62sM$Pnr8tK9+okzCz2oua50ef$0qXsw@+%zTFw1~eZ1#U)! zOzR=a1##4T8)?3<6X0;+bpuYt2)FR`W!M0EWHDhk9@38ebX}g90Ic?}U}IfpHigvp z3i8vD*QqHW{~nX#?)YQ^@R(Vm8nVrkP6;=8JjPAPAJzj$x$ij22g}#iJV&WFEDN;F z2Jm1kzTuu@EX*hqhXKz}i#?j3;xii?VnG{4M)OmShGE=Ajp;ZIxs7w(6!LT%wH<#7 zFwRx}(z|V;4BL!Q8 z?;1;A!SXiUNsVZWw2Xs$v22)2__%!c-tw-10AOlqvDwGwzZy9YAU1HytP&2c-`(CR zTj`4~v>C+mf_M80muh1d*UG(h{)9DtSm*hGo7_OZAa)*h{)pJgk;5(bDC3B%ZI|NI zZj`Og2qIsc{NK!J>7YHGC)U}n@$sFL)b?}`tpWN_V3?k+|eoY$kpoKXSyx)3PvlN z_wGqkH!U9iU&FNwtdmBqN?nLc-r|c`aN4_f#9ArVidWc|C;6>! zzk#Rk^1*r=FOYm;_l?jiX8KK zAa{g&zM7&@x1-dq%0-&bd$!kXr_4pi$Fn)g)-zB|$!n2f$HnOoyvpi)ej&6q}JZ>r34E3+fe{i`o_z8(Ka47LV z$Q%nKu7}JS6Dlxgoj6Kq+VV>sRxAV)#T3L6f6*W1%-~BCamUiIV{q~aLJ&0ko4LLW zAjO-`=8Mw(&4h_EW4u@b7YcOSsOfm1Tx9s&nQhzUIfL~^JNeI^&b~-^f(7R_61cIC z2)j|LWbVkUPUryzw+=)FBjOcbIi>ncCtc1uz2SE~a4jU<%QQpsh&qU(d)|Mkbb+!WrP2A^Z0yFb)fP4yN;%k++G6tDWpCc;_`TrB>9vqlh64*M>GHX- zf#`X|-R8XvER^eys)uOxOhZY1|49#;L&d0qaj~=E;581AVIEYRw~4)VDM!;~5cl5( z8WTa+%0!UW3WGH@3L$6OT+QzxS|C@XyqW?V8O%+bFmZ)}vwV@WrAwpT`ac9Q8C435 zGe!||6wkK9tzm5!jNw}9El>|kyfTG}$Cyhm z+8-~_CZUXpS55{v{&<{+%XrM^F`HE)H;O^)@m7&i=hh(_Hv`0I)FOF^paP;EMgFo@ z(@Fv_y)CposiIG823nwFTC;guy`3gs^*J4FfP@#s5e|R(c7&`RK*c4{;udHntP4kK zhUWx#NCI3y@cQ;@?9$|bIV zJZ2jh06Zl-x25p}ZflM)`Dqtucvg3Z+1rR^vrn0_msi};TJ%tgR?@Dw<(s%7w72QZ z#(ADe$o!`l%RvRkvPP(kl>q=1WNL7a@$EDB>y$ifW4w{#mMf-{?miUPxf_!)zc(zdGutz2&tpa=oK17az0gi3ys%W zvbh4E7+W6E-KB^PTgEo`mJrATgQ8!y1_Kq%;PDmt>$|jG?Pog4R%Og)tHD93OpW@I zv^6|YXCWFMMr=?e#u(3cC8DD)jD%a{=)}7-J}m0Apt$^-zSO0$jlHFngG1<$+QgEQ z3s5gwvH<2V>EO$k1!=&s1H!%Nr?102UC}T8c-SJFf{2Dth1yR7339p;P73s@^#Lvy z-wnx0e>>(Q$FSrRWh!z#q^3jV7@&a%wxNRi;K)#Y0UpvRe0s+DT9_y92~ysTnCarA zQ)H3Ib;A@-xMF<$D`#v@Dq7B4j<0FLOjqS}cg%{H$#v5e{+p?L z7I-W@tn|9#x42&)8KV#ZSOqnl_yY$k9sen-5FI{2+h1Q_Lw2wV5|xLI7c5^B9yy$t zY$c?0SUVex9)710P@vLIp1}L44M1ai+r%q4QGF*M69F=|tB!X*b^fymfBw(JC_^A9 zvQQx1Nt`@VsrRxEkDN3_$aLTwm>lY1Kyw$vE)Cxt`J7jgI0)kcSd zrr+krd~Tt3w1}+?vB@BK_HQ?gbCHS+lcD}f-3GGv*lB{kNUPM5OvGDHsfVfuNcZ@- zci6)X*sECa4DVKnuCZ#Tn9QXEvGHldU_`Jb6Ly`HfdAMWUD^S7C@27x29wy|T3@IB z;IRKaut9Ru;2SJK{mUZ!PNU@xD9h>%e_C{e&5|}zD>bpd!SEEuVX#rSi4Pv#l3Ufe zA>dE;wuiHS%8Z<&Bh?sUEIWDcKUir-bRcRO=2&OH+&j&yQfg%R@-gp!?jNxT4Dr!? zRLl@XiKbcl4JPpoYx=WneP z9T}LP+%s^f$-Kj?G^t^7ZqkM;*xoqB3<`jMiigsnMWP*90~Zj6072rJ{s6KF`0Z|V ztLE)e+=`;V%DY%l-hG2b2i<4|S{k`E&8Toov5LQ0YhGzGel(FeMhH3+76HqNQH8}` z_*I8Qm=X{Mt=B*Z@OMUs(7?&Oe49I(AoD<`*G51CB`ds$=5~>i%hS|C#lFWGn^lZA z+d8B2szS3Kn401|aE{~YOmL3CNk_+T9iy-0ePEelrS?kYz?_ytRsc^4F!Q8>Um$2= zJ?d-Czg=41n-{4qBnXgE(mep|^Ej+V;RkGdktiHIF;`SZ03eCYm{wqcmv$9GlE2A8S zV=2azykl_0w8*AC(=sPP&a}KVhNYx;co@$^q#2AXhD{zEX{PPEKcjeRLAHOi`^L{> zYIb&h>*aSElP}-rtTtwO#&4O(8@jQjY7YLRg6tIiBo9~^hSEgX_dT3U+KqZd&);Pg zlexX2TZi)MiZ_|B@UWe^$GmY;Vv+gMy>QJ-ExV1?2s+Txv*3v5qN}_Mpf=-b=SeEh z-{>bed-L=AFNp!sgHzC;sq{xn3kzcKQr&EP^O_1Q*lEpc%#WEjuc0)Y(V51EWJWbu z!?;wW@4!ls|2G&o)za8^0f{yFhv^V#gXftq?{YWQQFu0 zT**Yp+X3ZpaB^|lmn}2_Cg&gUgK61gN@ih{QLJcsoe6&zN;IDBb*1_RkCYSg<9=2& zCEyw(Jf$~%%-8DkG@EcZ(ARfW8rc{K=Ac%yT|}+FAZ8s9WuWdM`eADTRv9`Fx6R1I zPYi<#zk!Tibl-vOF0Ok43^Mweg+TN02T0&rM!@}q>`^-Rgx{&0C(Tiz4u-m1yi~I#{ z7Ct}87Z|!p*%b2Z(BDUXZb@l#T7CgP_!v(8rXZYKh^NpES!--C=?WDNaT7O$hlqJy?2ink*=(J30g#{G z6C|;hoda`fG|KR~kl@NM`zFYdyf4X~XW@D!U1U@t?!f7KS-LB}uTpp)Q+@f8ncIjZ zovV!X=@{)*iyIfxKcpK_>J1k$he30|{{3RumXEAh?TC-b1wW5sVdr@JMi z8(Egvuk%;fdg|Sl%@c+&E+O0)gQ-9jM><;#9?b06nCEI#kk(XUpRV5BA!GYF&aGG{ zJInqTKdpnsq0ykhpOxrU4xE=@p`To{;Bv6{PUC8xm4&THTlGZVU81~62zCAndjYxO zccBQLWb1XW1C`=8H*T7TSvB&?PH_;GyvavXXB3Xn@4nI5tq@kYn?27i;NUv5=E2gGxKR1>~=<2!jZ9kd#I zBmTM`nAXXN5d|v3%6Yi1yKFO=XKM!<{wA5&E|8h`^(!Y0rplSD?EZPxUr17S-geq* zyz3tRg*Nfeu#3fQEbL>ezC+b-o>8&*K3?%gvNwKCK2#Iu660Tp8pj044?&K2MMRHe zfjL38wwo>y9|W<{5&Ks1 zw%0vT*rQWHUdri(3zNQvl}s%(Wa}y3WiEfP*!Wh&`}mRyqP_54Q01Q%O^GJJC&q-= zOU@k~x2M^55K!Qy6iiVv7h(f!g-i2}ntL5bEXu*Oa&Ml4>95BfOcon}v{ZB;cfKVm z(77qz$ner1FPI;>wZ-%S6?*c6-Gg&il~};aQGz3c75rh<%{IzjLH=yrhTPr%Dcg0_ zEscIHvR_Ao@B05=+A+78e)ksGv9^`vp`JQRz8D}MaL`B9kxoO!z*hS=ffw&aG z#NRr)f?s?8;HQov?CG(U#JUVk45Y?vR;$t6s~;X!tEjH^9fz9Rna?pmdYKF2I*~({ z!P7r{aqscx<}-EkQr!_Xcce5j!~MUUT5Pu#xk$W3rK8}~){_oEPqq@e4^ZiCK0B5v zXlY8HVZGVExs}>`t9_}QWN=Qj(*X6z~}Pe90Z*{=+b?^R@mq(AB=LG7du^>0-bj42Yl@i)X1Z1?zi(#Lsj#Ljg`>mxu!I*6#oLi zm{JrJ+;)eSqs7SgUEa|+8Egb766ZvS;}IOwZ@lf=g~8`-IFR-C}s$NtNHVPEVX?0r_1 zn{5$f_Bf1b*AgxRJ#NzU4pvpy5nYkj5C3iJmRo zR-muwCLVS$syfn|d;->1u5s=(YA!nqwY;B#f?z&#dxC8yh6OI19Q@%+hM(v=;Kwo+ z$yeI*xozh;WMoxF;Zzlrqf_tT*bHg1dacBUx%1%&Y(7V`Z9CutiMYVCFNiZqge#qw zXdnyEkl_sG8eM~a$sqNBdD2)668P*hLuc@@D9+`hW+<5{KG}tYz;hiZGkujPmODak zC^WVw`=LVshBu;MJiXRBSjmkgG0m5DAm=%bkljj*t=v=tL0|G|jYp_yjJ{|}Olw1n6yyVYYdXs-+{3wU3pVpO(DH=vL?w=+Uh(%CYn320q>YcjWZ4vl!z&AmD@DCkKw#@S47t zF&wifk*JGIt0>6}`Qg|sm~Efh`E5i$oOWS^yjA5>ulTF#L{;x+zWZX9VDZ>Ind}2Bpcmp zBETdoEO#|AkHZp4h+GjBRpByP9T{!?`_i%q(%P)GtW|j}`*%L0Vkd??UHB6L%uflr z^-rHte`tynNpBdOsy~i_S>eju zwVMTeH4s!&Y?4aYV~ic63)D&JWLz~<3AsJpH!&jT34Cbi|2+hdO=nWx#8M1A+{>Ga z84Zib8{gLe(JwD=kS)Eayn)~vlQ$M^s50}!j#`$*LwObn227Qr$C*?LA<*64t;jK+ zi&NcId``H}_`Z|b9LKQ(C#2BjHDU>Ia-fS`+G_z!9j<|HBII4&vvZUcqoP+6qp{`k zTDI6(GP$jn+{{IA&;+ba13}Hy!6URl$BNM(g5wMa$Wnmh)e6U?sN2#Yq@!gz`U8}F zku-t|eW#uzb`@ERXhuo-94Zm=5pMc(F&WU7q9O27%}~V=pEBXhr0(&q>-jiyO+uRs z$Ry$w#wu2fS9X@xRzD+|iYxq56id>URK!;>5vaQdj?597c(w^8yah=NPWqK@*OL!; zYg6WNjW@SAKm)&GXnaLuN}QL2FjD@MO2aS$-azh)*18&f1zZ9J4XaYi*^-0FpXv6;TpG^V1$3zVKz`;1iNVhs%yT^Fwu=bAk7 z0y=^4{&M%=VE>8Leqn1)(K!VNga#Qt@;7+J(YZOG^(tEm=UG&qM-#1n`}zhDoe40{ z8OOPyT0fzRy#XcYJ>|wRMd0Ji# zPEdLVpHEU%SX++cylCH^&RyogC&T`1TtLS6)#~VDX3N2;t*rloQjoRKZ}p8fM;1&r^7p60KW6J<&#|5 z<*ifZgn3KxR-p?QBV?L@{*PFzGcBi8h z5>ojL=86kPt&ptlfUIcEVSwcMha)8-P!kW98TC`vfc0SbopsJNn%&645F}yrAkpO9 zV8~0Swg7Ko#zjY&VQ|>A+j)ZEm%9(2uvcK}-I=Ydo%zG4QE=-0DVWKnHAXyh2$91c zE&aD#m$jXSXhkDiNLYqqARuJ`AWc9mUqq@|Y=>_)+Qw?GJno4BIF6w(8pr*Q24mlY7Py z!yk5Fvtw(2yZ;Bvh;$Y&-5wti7DW_rFyY;HV+p5q{tJ6Lf=BL5g9*r?bN2>+Pm*RL3=!!;qt0?_nBFUdB$_ZDXSK1y38C6u?lo_86eu@(HzN0R#!te zR{A7ek4>M?(`qzpuKFUaHy4K{x8##?Xg=+o_SCUt;Lw3Q0RGCuZ>cUq3^UykDTi#R zVX28=Lzh_~-}>y6m~Oa2vg!=UWE8^nRs7R{@`K|9{r(hW=4g0m9RZcS5|Ar+`dT>Y z-43}q>K+52A$H?270khhbNo+20LB$j9x%_^QQFblv#$3OMjQh$3BEVuFfK!hE{rX_ zmmUbjQ&M)BA(MJk(f3C;y``kDza?m})um?TG!tP(i^ykciG!bJ(2^zD4z^<=Oj6 zx#XNM$1;h4V{g7)`5iX;$V@{kto}$_dMo+JNQ$ybEXpBkv}tZd(_Fnlku*Oal3anG zUcgINA->|j&?1HUpj5#)bJ{BiIxN`yda4Z#b<&79DEuv4FW2y>fAEdzHPcWw&2@pq z+GVpO6a+vRgW4yB$hgj6GG&fSj>)$nr~kLVy9rfPRlN$*Wsu%JoY!jX>^QSvrrL0xLtNk-N|9N|(X@z9Fhijlfji>rz*mJF8cE^YyyQiPXXoKu0Ag&6z2G`9Y?-SH zIQ_OrM25W>x`X}|h)cUx7vu}_8RAu>4Ts(phu%SagV~{8TwO$co;Tl~&wLvGPld4O z)y_?(m?=&pFce#sBE7$~ysHm2sME53@j=>hD!YL{$9m4L_k97EWoqHTPB}8~Qg0F+ ztpde`#Q34@-$pY*)16JoR1l%AjxP;KbR$-bg=aKQ|f>UcM z{%1Tcc{=6~bt2e@1&I=L0x7)%=vYzdo!?%vRJ6UL$s!kt8yk~UY|}kOy#s!7Dy*)3 zqikWU*NSLdI8%xLc!OIX-s*g;XhzdLzBuu{LBB(K5J$?TRd7f~9%Y%#I;h*!5`MFP~fL!J^o zBP6nk|EI%p4S|u^04>K`b4$4rk1<>YVlLmMv&1POF*hx#7vwY}mIa3ZP1mc)@D%_i zvO>4E3}UJivicyR?oH(FygB>krX7J4*!%ocZuB&5{12w7O^<6Ns?9)EbfYgsRW4&- zl7QpLz13Zin(OXLmcbOZN~-c1*f$!%S(n0VRh-R|B_HZdpYv%LRglTEvjbKq%75OEW? zLgI0T=Cgy5`a8Iw$Eh+nqhd_xdilsKUdtIqKT^vCcIqM$wv5vva-_~?)zbk29GDK; zJ&E^RjI4DNa2H9k9_qGKNGS9sMQ|re z?ylf%Fhxg#)X|`S1D*tichI%;f|)3vp?5lNqcwmh@juS#W9zm2F&oyaksE|JXK#fb z6gtI@R1oCQ#DR5~f#31d9?qJtz{<%}R^aRGqTvHDggS!Q?gMpiclr)FH0S)fhul%T zguUpHfsFe->SDrA&ARIR{@OLDRhyRs|n zGC1eGb%))TYEUaJ5993N%|sS}RI=Urh(UXDV?M_Q-XMH{Orw95l;YSz*$zUEFT$O; z(ced;*wvWN;l8@TulL*&6ZeN9-Tg=_j32=912|Qno~TK$pH$5IL0Eiq zb}PwQA68$ipN0>SzjhsEP?FCT5&d+1@8L=yQ#FxPNhGEzg60rK6D0?Ij zeckyco=p@FMm91ELNu=tdQq{*zNV6FnQ2T4gJNp`XUqbfDzW`Q1blb_R)VgT2+y)D zF{l1@Cz|@Sx0b)N=7ADk=wFP#y8xMo6F`R7mEGm?vpl~6K9vM~Ep%&yh9sA=aU9Db zZi68FaO4h_tAK+8qPh8xlW$l5Z2BZ2dJNeqijwC#RUT1|QQ0soj{Ak%!-X_Kxt#MbsH;4@Ur6SgGe}@3TZS=3OqbsQECkHZLL`RB zTjp1we+_viHKKvsl%SD7+V&8XzB3A3#aaSeiy%<`(Qzd6#ezFvgmEgb!@MF2!I(H4^RI zyPJ8W5z7HBryohC2x z&_VLzw~z=jS1G1O$s_OoRu>&|ATJLwnvuU)Gi%Nf(1j23T=}vRY|^rfEMXMM!|vEa zU?h@@R4jLm>x1bs)5F!g(H=(_GB=Q^%5>kzMc~wa^CDqlx$=Z~ZKOb-bdenm?NHLc zES{Xmp6>OPMwIJN$3R&q;gH2(+uX6_&hY@J(y(1Hv|cH4So0uxj-PLMo$gk+`^F2X zDlCFgC zlPhyjCN={|&a?qOJjQ75AS(B#zC}!c2rEzxtJfpxRmT$l1D=!zQ@1NhWGfl zF8r0>9N)I=35@At<|l8>S`sOb^ah+^0m}mIkMinD+4@Ci;LzzA3Y^-c}O<>>`H&)1J{Yla$3 z%R^KCF9PM8yuBPhqa zY7aZes0C{wR_5-84m-)CU_fbynn^C<;LCuGNhIb3&e13yli9;YBQ7EKuD&tJmJcT& z@tQqA0UVSUu(9@=s`t)yZ{nTqA}~`(3blYo!#JzZsyB7mns9->Z@lh5$`-)&O5VUp zH@Y}6d3pw|kFF^ohR>IdmS*&HVx+K=J$ODMPNO9oQp%H2ITH=@_Sh z@D99(6W_ek8HvEL0rZ3(;J5tfI|@(5oUmjTi0}!q3HykZ_Rr~h>(JSSd-|?g*lC0z zz1sH95dnzTTF_X$ZI-Wos;eHkj>;#K!=A}8_0LfIQ)_&NF3IMsr{f-RQRFcq5b914 z-eJrYu~S4gEwvKW$cV|_pI6xbb3~X5og-PpprlMoa9net0>n%4Gs=hF%bVR84&W?k zMjoQTWE8p#a=Q=)gZYN7V@b6&V4}7HRNU0Df*&4H$yQNA6b`$KjMuw905%!@vXohR zQ56S?lbN?s+i-OehRL=QTNYWE9c9=uSS4S(+tjCw%l_sYoR^|rKbMF>G_tsrDKZC+ zI?mM|F)I>3{?loZpolyrKwPc+289twb?^bdM{Ls|dZ44*4)B08vwwKPbCyXQ(Ew2D zkoN>ThfX;2X5X?N>Kwu3B8n?CuPtaIS|5dR{$ujioO*Vt0s~PmF~xDzJw^PjcPLT* z+y-KrxHHz+0Z&>sW(F=*QU6Y~=zxDhTE8KkYYZ%>Eanfs0E+Jq*o{N@2A>O>c)*i? z&Pv3Rs2pHN~#jeICLg3ffRH;BY7rxc@8Rz>5PrCNZ9EmY^z zAuMA;(KYnc!)0VH1U{gHm3b^ot-kHDE<6Vy6{Ak~+FTa!f0eQT=4H4XXNC&X=IVM* z`Rr^41^+uR$(L28x>Ws%2Fa!rNvq;J<*9Dr7)2x&K^`L;(5OC~Ax~~lyDUFIywSpz z-$027=}UI}(>M!2Pl_F;9nT9g=6PPq??R5h`eJfB#8;Wy%T%Kv-&I)X@cd|SNa;>t z--QIuC>JIhLdoWryqOGCeq=EV1t!5Lyq)a4!#MOQ`fUrm5;i^4dtbvT5q$wW!8ldX z6}rGF$+2Fuh^6A^5vD>lAZ4483KS>9K>IY1Lv&LS??FR|?LfxHX#^Z(cyR)5fu9o19tj&f0J~Amqj}+b&3N(eNGU@~{M9 zJbBOJ3;u%GK=jig>=V96<*}yu-hrir2#b8&;BAn0eXhL_gtdeQK-^Lse0ol9GgktX zpv-~h*knLT-O&KRrp;;k$pz}tT!9Uh(FCWoK*RT`17AnGiI;r?-_Tg@fL0pwB_3SI z1c9245#=$QNJUf=g})*T5>G-3mnt7ZA|x)PUR{t9!u%F1@DMXW_7%Q@wo*QV>PdY^ z>seGDD-SHIFlM?+;V4(u>Wv*)O8BcnIYINX9#ssG&rkZOXEjDG=wbi?Jw=c=Pd!8EmeE5OIXoqi zgC9aSDx^3t9@mQ#COA0jkOx9- z;WFP3rbZt#SS+=+JHY}k<;`NpA5(kMxa3EE_D5(D%oydl>|{pL&^Fyx2B^@*bOyJ{ zG31QIgn1%}As7kD6axOPMU%RqJHyA#pG$NBHZE<9-}H_r)0NbHlLk#daUwYWYgi67 z@x3X!YdKAaCINnIt*oe$puL7n>>pV(PG5vQi~iWsD7Sqi*&SZGbI-0M->D{==p6&s zeY+1FN~v@A=IJBGUddj_c*JI@ld!&zYKXKC56MY%cX>}y$`df2ZsA3(4di||)O!t0 zuz~#CbdNa@Xvn$rtq+C!=4l{?5{-b-Lh{Nak}r<6{_uz#?-#+Uf?;hfT>-Pzz16r) zt^-@%c)Hzg>iD{=+mjLw6z#?L+zQm_F1i)YwtmjO!*jR9HO|$hO()x`fvp_EMANnV zB~XT18N+#}?b;FNMGw+69Ga`d0-Cl|i`lsEr!$HB!t?Ki>{!H=ae8NCi{NJQc52N5 z#}O<0pU&H-8n|?^PBQj950zWI3hmDLm)pLN<kTa+L@Z!Dn2yKuv~`%oa%IomL~3pmho0i$^lLiM{ahb3MX_&eFcupeWFum#AUy&u9{}FU9!+Dx>ksfoh-dxShAh zb9?FjHt)J`+=#2sb`CfQy5bVTwCx z^#qRBxb>(5$}JoxY|DEd&BMV8rvuY&SI=nZ@4GBl<*6@hK*>CJKK1y+ZA75KK!$Hd9+Am~8!dLhujrcY!*%Tej@cmO+ zvgisdn;aJGuW&=ENI-q#J^H=s_+#S; z`N{am(t#rgCw178+->a+{>A@J*boPC2Ie2RQ*ZBR7ww)qBeWfJHm}POqHoT!m54=3 zX&*iNB#I}rced;5VXy@^8?q?ixW1w7!yms-!m*up^2Clajd08jNe?oeW-fD7elrC; zWrEoWyy3?Tx55=c%Z(l%c!zlF4~3G{1T_`@la1MJMuU01x;wBM$W*&VB>5T8F#O5T zG@6JAwE0JTXb?H;|Ha>gjqvo)l@d9xg^j4w+t>icxuBHV;4DX86Nh0yC->-o8aidm zaCYMjjYmSKbva+qr3ZQ>CNMF~uZ2#lcz_L5&}1Zx_y5>}6%Fz^K| zI70~HrjX(acPpDvI;PcXgT|fKs1VlF9OfT4+hUhLkGvHXSl;yqU9M1M$}%J z_7PzRf$6!^7+=z@R5c<2iJipJR3K~lOYk>c-lY$zw1%I;Y2$rdW|c7h#Z77bLpZDr zmq^N#El7$EuPSOI!frAhI7BKSxZ57O~UIImzC@>BB z3jzPj{U=|j>p=`JQ~V0;jK(&JjWb~%Re-iRqlNZpUUQ3u&BoeZp8>aMXZE;SWOgt@ zAiWIP8T@6JjEujoUE_*eduM;9y#!70sCy^lcGmC>IvcsRi}{T%j^WkM=Qow8*fuVo z9`^w>g#WTtDuj}5I2-pu9C=h7s->bTg{V>GopsQ{zV7I|mBrYsVh(83$VxheW^Zuw zwEooLwb{6Y<5*u_N>)5pb&p;D+Co+W6oFN%zYzb2lbA3RI89aH>8i#CAUts20|d2CgR9|xOZ?~-gr!C6;m^e-;g{Azt9n(w zsuov_|A-*go)GT8&_rZAYq!;BX=|qYFUK~z0PC^ayBK{hV!`ZFLT93%k;SFa&pqbR zFQ2!VoMV-tA)qnJG1PTDEKsoT^t4@Xq^^%i+6wK3o$*N1Tl$1IQV>Df|6>0Uh2+8F zwko@KoADZHsy8aK>!;bO{*BeM$YS-c9}~>}-n<7CDNMO8Ks=CN9WC!_*&Ug$*1!Yp zdwGf0g8SW?ab72y)|VMX))kPX(Rq96{go9fKW|vSLQx*B*Ro$|Fj3GaY`7_|#Wcu{ zxfh)F4JGZ5U|Bijn>u%@65DuwDTs&Oh?H;HdN^OwD=vrzhP??IGaDbt;8W(Pl6&1g zq0|IQ4iub%A`Tmm-|3cMzJ-hRBeMpvI6N5K1{|)c;fk9<%ow-b@_X~mSpF3MzpUoQ zKLhIk_O8Q<`jkHiQnAvV7wx0lT*_k|3*gCz7l87w&psiD(AM5TC_-QyTmInT@99M; zGXHpqy^&+_VTJA~u5k?8!oB$lg(QwD#qB>f7Wwhg%H8$5z!78Xh}e^rdWQYaOY6cR za?QwoT+xqW>1H;pE_P&+WI6K9HlNvMWKeh+c;B%5orTGqeq$^aE+HXBfBx?O^l4<9)|_4?40 zyg(4S0#SL+g5`z}FOcC6LVdi||G%@FN(YZ96WgWd11N3Sa!BgVF+dt~Yy7>Tt9qKF zGaz9K^)K>=EISS-NYiYsMwk+@w8lguKCuADWX4yxzo?8h&R&Vl>Jzfj=m7tN$7 zr9CvT#wlCEq&4%V}*^)&~Y(nOA?P=axKG&1?Q zaVytMu##SN9bWpkIE>tC*duMe+3>wa8;xYQ-#L3V7{aTskOP*41Iz(3AGy~_HzhN$ z^WNf6N;Boj@{#(46QV<)P!sa`#7HzyQUMYjgSTJQAx!_LA2Jz_XxlJ|bX|LP|Xe^(3i-$)n`=W5BS1 zU^WMop)XkWkhOIGyCozcI8p9Bzkp0u@bm?CS<7=1wp$i>u3Qnc+)QV~s~!|1QSrrT zBypyAyGFRldkunW16HgxnThesydC0p3(LAfMTBpky(ApZ=k_*60mw_1Lc#xl$~F*_ zmAHjyMn%lkXN;2rc2Ccgnm+{!ZaheY92y`C_DySiKy^<3ifc}0$sEg_c`l2z{GCW5 z%^e#_0hG|{t`L;*5@v%mci|9A5LTw&Wj?0(8|PpP8glvOaocUztNDs(z|Uaz^5Rg1 zc#PPj#~3%pm12#bmxs&`fjI@RHfnN$T@hG4=J;jI25)|Lq^wG0OEZ$K%zA4JE;;~B zy68H+0;iqfx5&|TY`8>*pQ4P{LvIQf!YwgowVPL|=kxt@mK}tNC!p7)LMQt^;2aRFL8RI zManH2O`llt>^_Ol`X!#>;x3{yV>pGuh**kCANtY++c|+lU^p5rV z-+Ra8fB7c|<*V5-YR=d$+qgM9mYyD2MY(=p(wmXyQ&g>5N!|14{2C(Wqkz`y6LDgTc7 z_S6iJXvhCNATi`x93*!COpw&&5RO3N-Z38}69y451Q=mQU{hOXsu?gx>dk|%U>*&U zhmRhbBOf-=X}5!GPLsy7L>jAqWBgD>^l(GzY;~~s=sVj-vWc85D`MVBxBn8!9F8v- zvj@`2xnX_-zMk(+9*r4YZo*)(?KWHDlfyyif2BjLZY(YDEkBjUjo-}(ySB8Ba;Q=} ztXOvu!ePcBBQNt#t1V?4r@z;C&}V^d8LSi;U7o?{P|nZ;-M~l9B|Ug#wmU(AdKQ3$ z$Vwp6z|ym5yb04hGiFFe=|<{QErZg|{p8ZC7f_V7`CD4N#Y!Z;Uw z)My@|i5FBGJb~gRY?LXnR9;?io*ZfG3{_FCs0nC*KA^zfYd1Zf6UU40w&!r0sy7%b zp2VZ0v&k_ZHseIO7MdVw!pYVyI{ z+o{!6cfoXpoe0AUV#`6;&y09hGBvjmi=&!b%M@(e*10=5XLWbqn9o_$kbM=!l=dDQ zzhfMZ=%rdY=2wC2fue5j+}3eZlvHW>hlPjG8lOc$Xm1!i_!xO?lfpgn-G{^3=$UK6 z1%d6@{k0Deu}RAO{zDg04%8KzM3_6VeX`LONP24 z%UP@TFP{P=2aXg4201*8(*#%mSKuEek=q3zQUo)eQ!N85_h!V-f3PzG5vSuU0K|#c z^xq=sULlMT7~^+Cp3bDa;DE)1I}1hsr4XXkM5})79`NKV;37yAQ3HxpUvLz3n(pCO z#qR_&?k__vF#zLjYMCW-McY)I>+F4EJCt3eph3=KgVg3AvVsnt?C)EcCEk>v21)#* zcH!7tPSV8qkaPm>pn~_OqwdM;E+m1uSn;l?_cPvG@$P)5VWDuM4}XKxu;@uS;7J&A zEt(!<;(=RfFR@V6gU6rW-?uVKugnM<6>4Uz4*qKYHqOrDiJ3N*%e^w)8hD8R5ic2n zr$xaC6yNc@dXAGd{4=>!Ecqo<62YiN6fH;6PWJ?yB9k zSNMb7)xf~ZjYo-FLO$Vy;2c9o%?9sui;!x8AV*ED2PDcS5;%pYKV4eQaa2)|+lt;J zI?8l&WSZkY&nnfpW8>Me{SSFW(7y5nPb52BCz87X5j#-?wSeyh7=x_UnP^JFA>SU- zP;ZHbL2_ddci>w)HaK(Lumq3=U2&n^D4SJ5#Ji1&7KkI; zuwEJhI3sr-ouVKCk#TQ4qhwOCzKNcbK&!(;D4ssCdMDe?+*uIL?kpQ)re0uSNJ2*8 zy+#cH`~Mlkr5M8x%@gJ_f`W}XnZxZ^fQ%~SB!Ewd1?Z?|^wpTk0s0%r3#P1!PrdDzzvT@ca@QHF7| zWsDpzA(A;2$rykrqF3OvjoOaOE5+&FWhopU7zMm40a`$Z0xHdPJNThvS&%1k>@*rG zuA9V|*|;J!sW)25S5Uf433O^!tdmI>=Q1v@>=BzZqRNjVy$?u*_d(;bOcD9>%>Iv* zAFBCwJ<>`!BxiJsUIF-x5fx!6ZR9erlpe2@TBOcDm7tHkX_RvQ(c=~D5O<~mhomNB z-D0T2;bD|%oP3A#C3uDB^{C~j2U1QU(d0|^U7J``+j6(y6qfyC*uxRU+?=Pf{b=Jy z6YScnYfi^_H(hN(ejP2dgk$?4-%g`tHvRRxtr<#MG+2SQW`oZ5jXv5E(zC#&fRn?WIYQiMgd9}# zP=B(2A7}#?20uZDu(h;$GBD*8zVJT0q3mZ0?=+R8BOHih;)bItSy4}-f3$nj_jYo= z4$MO?Z3rmMgAxrro>;@`hOM}h3LN%o9-Mv&41PkoIS|I7&JuY5Fv&_U)8yRguhi@vu)0_5nrPO=PEV!ndH705#6eUm+|tgbQiZ?F@19j_O^2Bln){KHB?? ziW5&z$2pnox51IrTy*#nQ6ZkdNi-kBNozX7Get%UnfrS+)Qe%KfB1@AT<(7O>I`4? zotY=ZyzCr3Dg5A)dj?BVD4pP*Nr9uGM(Gbcj6?}uPtK7MzzvG?np82k~aDEb9! zg$QuT!pN^i_PC=K2aPb9k}Vg}0OX!rXnU-(RUvgW6ev2p&6gn)UKkU$7{v}+CL!J0(^7{nw00`M>rAV9t^^7GjlXy0zR zzTqe)s5O&4B}4(Aj=J45Fx9iS#8!(h9{>Ru){}uzDE0E1wW%835_RXso|t+LqyXR5 z5oxYYfMbCU?1)GpCjNI39b&*Xy1pGf`g5}zZzWi{$gky*o6!0-8%8bp!68~n9-oa6 zMFYq!f_?dQU^VXa<@2|BYTN(Y+Li1!4MkD5@D(K+2FZwmxiqeZ1v2joEqrfR=AMrJKjG_Wr>`H2$@yrzaFe zgp$^^t??+L&!onNU4J!<_Q&$J82WVfm^;ha3CiV&qT>>UWdbC?1!{>%TL|dyjFun) z83YtN(dBS6kc<*(Hh7_~g)wM}n5pHP1A?PyZw%+jkV@fMB;U+^iJ9$m1 zGg7H6;!!Q#vh`*QGaxB15Z{>a{ZzyPEf|4_1&*t$kSx&HHsv<*MKICAaUZCr2(E#t z&RYe6yLg~cJ#ep0i#OKx@A3q{Vc3+y0JwN+-;X2wK*K16Hphc6&>(#{Za9fk1!K*L z*CIZ=k~x~rI~0m*rIM8sBP;$O<1#1WN?0TGWu+iQ#WfNXz$}Hb4t7G&kFfM18JZnx zKu$Ddvb#MeaJU{8Qo>agfoe4@U977G!0c2K2>^+bg?kxo%Ri*n%b}QJwlz*vJK)5S zj}e*43f-(5jEa+mFN$#?#S2yo5<*knMVkb$twu=*GM&9V36bZt0tKC`>13Z5*a^gz zN}5rIKBq7}H*3FyZC zg?@qT2Yc*yCDS5u^rsCnIYM9}$;=WnSbP26=R`fHpa#G`5vWea5u0U9%j>5tLK5K9htCfE$pV(}(%3~b*l43kqr;H#gk zo@_(Kv{8&pn39;%Y>LJWZLj3S#jw5IX^n(ekdr#ba8jrX39ObY^o@dfB125$lnq=y zW*w}I7^)NsSQA2GG^(y zO1NaDQ>Hg!+6J{5IKQoE)DJH=8nk8m<_{b1~4XX&|;TWj>l%f>KHH12%{#RmlvxK^B80%@H6vkpC#HpPx zoOuE+{ePiP$@fUMIw$O8+r>xaL#g$W_14Bo-bqOy!4@kI<66%cn@|J%u^EB~W&qy}KsbJr3kZHVsA%kg zoeUJ2KL~^P`xdq9mrJaxm9H4iuRPepMI!ijZQfQ5^$eP&~e6X-66n keAT>U!sDK%_BdPo+*l66>POM;nBwyXv)4S~hWy#1KSt@X-~a#s diff --git a/elpa/dash-20200119.2310/dash.info b/elpa/dash-20200119.2310/dash.info deleted file mode 100644 index ee791c47..00000000 --- a/elpa/dash-20200119.2310/dash.info +++ /dev/null @@ -1,3410 +0,0 @@ -This is dash.info, produced by makeinfo version 6.5 from dash.texi. - -This manual is for ‘dash.el’ version 2.12.1. - - Copyright © 2012-2015 Magnar Sveen - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see - . -INFO-DIR-SECTION Emacs -START-INFO-DIR-ENTRY -* Dash: (dash.info). A modern list library for GNU Emacs -END-INFO-DIR-ENTRY - - -File: dash.info, Node: Top, Next: Installation, Up: (dir) - -dash -**** - -This manual is for ‘dash.el’ version 2.12.1. - - Copyright © 2012-2015 Magnar Sveen - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see - . - -* Menu: - -* Installation:: -* Functions:: -* Development:: -* Index:: - -— The Detailed Node Listing — - -Installation - -* Using in a package:: -* Syntax highlighting of dash functions:: - -Functions - -* Maps:: -* Sublist selection:: -* List to list:: -* Reductions:: -* Unfolding:: -* Predicates:: -* Partitioning:: -* Indexing:: -* Set operations:: -* Other list operations:: -* Tree operations:: -* Threading macros:: -* Binding:: -* Side-effects:: -* Destructive operations:: -* Function combinators:: - -Development - -* Contribute:: How to contribute -* Changes:: List of significant changes by version -* Contributors:: List of contributors - - -File: dash.info, Node: Installation, Next: Functions, Prev: Top, Up: Top - -1 Installation -************** - -It’s available on Melpa (https://melpa.org/); use ‘M-x package-install’: - -‘M-x package-install dash’ - Install the dash library. - -‘M-x package-install dash-functional’ - Optional, if you want the function combinators. - - Alternatively, you can just dump dash.el or dash-functional.el in -your load path somewhere. - -* Menu: - -* Using in a package:: -* Syntax highlighting of dash functions:: - - -File: dash.info, Node: Using in a package, Next: Syntax highlighting of dash functions, Up: Installation - -1.1 Using in a package -====================== - -Add this to the big comment block at the top: - - ;; Package-Requires: ((dash "2.12.1")) - -To get function combinators: - - ;; Package-Requires: ((dash "2.12.1") (dash-functional "1.2.0") (emacs "24")) - - -File: dash.info, Node: Syntax highlighting of dash functions, Prev: Using in a package, Up: Installation - -1.2 Syntax highlighting of dash functions -========================================= - -Font lock of dash functions in emacs lisp buffers is now optional. -Include this in your emacs settings to get syntax highlighting: - - (eval-after-load 'dash '(dash-enable-font-lock)) - - -File: dash.info, Node: Functions, Next: Development, Prev: Installation, Up: Top - -2 Functions -*********** - -This chapter contains reference documentation for the dash application -programming interface (API). All functions and constructs in the library -are prefixed with a dash (-). - - There are also anaphoric versions of functions where that makes -sense, prefixed with two dashes instead of one. - - For instance, while ‘-map’ takes a function to map over the list, one -can also use the anaphoric form with double dashes - which will then be -executed with ‘it’ exposed as the list item. Here’s an example: - - (-map (lambda (n) (* n n)) '(1 2 3 4)) ;; normal version - - (--map (* it it) '(1 2 3 4)) ;; anaphoric version - -Of course, the original can also be written like - - (defun square (n) (* n n)) - - (-map 'square '(1 2 3 4)) - -which demonstrates the usefulness of both versions. - -* Menu: - -* Maps:: -* Sublist selection:: -* List to list:: -* Reductions:: -* Unfolding:: -* Predicates:: -* Partitioning:: -* Indexing:: -* Set operations:: -* Other list operations:: -* Tree operations:: -* Threading macros:: -* Binding:: -* Side-effects:: -* Destructive operations:: -* Function combinators:: - - -File: dash.info, Node: Maps, Next: Sublist selection, Up: Functions - -2.1 Maps -======== - -Functions in this category take a transforming function, which is then -applied sequentially to each or selected elements of the input list. -The results are collected in order and returned as new list. - - -- Function: -map (fn list) - Return a new list consisting of the result of applying FN to the - items in LIST. - - (-map (lambda (num) (* num num)) '(1 2 3 4)) - ⇒ '(1 4 9 16) - (-map 'square '(1 2 3 4)) - ⇒ '(1 4 9 16) - (--map (* it it) '(1 2 3 4)) - ⇒ '(1 4 9 16) - - -- Function: -map-when (pred rep list) - Return a new list where the elements in LIST that do not match the - PRED function are unchanged, and where the elements in LIST that do - match the PRED function are mapped through the REP function. - - Alias: ‘-replace-where’ - - See also: ‘-update-at’ (*note -update-at::) - - (-map-when 'even? 'square '(1 2 3 4)) - ⇒ '(1 4 3 16) - (--map-when (> it 2) (* it it) '(1 2 3 4)) - ⇒ '(1 2 9 16) - (--map-when (= it 2) 17 '(1 2 3 4)) - ⇒ '(1 17 3 4) - - -- Function: -map-first (pred rep list) - Replace first item in LIST satisfying PRED with result of REP - called on this item. - - See also: ‘-map-when’ (*note -map-when::), ‘-replace-first’ (*note - -replace-first::) - - (-map-first 'even? 'square '(1 2 3 4)) - ⇒ '(1 4 3 4) - (--map-first (> it 2) (* it it) '(1 2 3 4)) - ⇒ '(1 2 9 4) - (--map-first (= it 2) 17 '(1 2 3 2)) - ⇒ '(1 17 3 2) - - -- Function: -map-last (pred rep list) - Replace last item in LIST satisfying PRED with result of REP called - on this item. - - See also: ‘-map-when’ (*note -map-when::), ‘-replace-last’ (*note - -replace-last::) - - (-map-last 'even? 'square '(1 2 3 4)) - ⇒ '(1 2 3 16) - (--map-last (> it 2) (* it it) '(1 2 3 4)) - ⇒ '(1 2 3 16) - (--map-last (= it 2) 17 '(1 2 3 2)) - ⇒ '(1 2 3 17) - - -- Function: -map-indexed (fn list) - Return a new list consisting of the result of (FN index item) for - each item in LIST. - - In the anaphoric form ‘--map-indexed’, the index is exposed as - symbol ‘it-index’. - - See also: ‘-each-indexed’ (*note -each-indexed::). - - (-map-indexed (lambda (index item) (- item index)) '(1 2 3 4)) - ⇒ '(1 1 1 1) - (--map-indexed (- it it-index) '(1 2 3 4)) - ⇒ '(1 1 1 1) - - -- Function: -annotate (fn list) - Return a list of cons cells where each cell is FN applied to each - element of LIST paired with the unmodified element of LIST. - - (-annotate '1+ '(1 2 3)) - ⇒ '((2 . 1) (3 . 2) (4 . 3)) - (-annotate 'length '(("h" "e" "l" "l" "o") ("hello" "world"))) - ⇒ '((5 "h" "e" "l" "l" "o") (2 "hello" "world")) - (--annotate (< 1 it) '(0 1 2 3)) - ⇒ '((nil . 0) (nil . 1) (t . 2) (t . 3)) - - -- Function: -splice (pred fun list) - Splice lists generated by FUN in place of elements matching PRED in - LIST. - - FUN takes the element matching PRED as input. - - This function can be used as replacement for ‘,@’ in case you need - to splice several lists at marked positions (for example with - keywords). - - See also: ‘-splice-list’ (*note -splice-list::), ‘-insert-at’ - (*note -insert-at::) - - (-splice 'even? (lambda (x) (list x x)) '(1 2 3 4)) - ⇒ '(1 2 2 3 4 4) - (--splice 't (list it it) '(1 2 3 4)) - ⇒ '(1 1 2 2 3 3 4 4) - (--splice (equal it :magic) '((list of) (magical) (code)) '((foo) (bar) :magic (baz))) - ⇒ '((foo) (bar) (list of) (magical) (code) (baz)) - - -- Function: -splice-list (pred new-list list) - Splice NEW-LIST in place of elements matching PRED in LIST. - - See also: ‘-splice’ (*note -splice::), ‘-insert-at’ (*note - -insert-at::) - - (-splice-list 'keywordp '(a b c) '(1 :foo 2)) - ⇒ '(1 a b c 2) - (-splice-list 'keywordp nil '(1 :foo 2)) - ⇒ '(1 2) - (--splice-list (keywordp it) '(a b c) '(1 :foo 2)) - ⇒ '(1 a b c 2) - - -- Function: -mapcat (fn list) - Return the concatenation of the result of mapping FN over LIST. - Thus function FN should return a list. - - (-mapcat 'list '(1 2 3)) - ⇒ '(1 2 3) - (-mapcat (lambda (item) (list 0 item)) '(1 2 3)) - ⇒ '(0 1 0 2 0 3) - (--mapcat (list 0 it) '(1 2 3)) - ⇒ '(0 1 0 2 0 3) - - -- Function: -copy (arg) - Create a shallow copy of LIST. - - (fn LIST) - - (-copy '(1 2 3)) - ⇒ '(1 2 3) - (let ((a '(1 2 3))) (eq a (-copy a))) - ⇒ nil - - -File: dash.info, Node: Sublist selection, Next: List to list, Prev: Maps, Up: Functions - -2.2 Sublist selection -===================== - -Functions returning a sublist of the original list. - - -- Function: -filter (pred list) - Return a new list of the items in LIST for which PRED returns a - non-nil value. - - Alias: ‘-select’ - - See also: ‘-keep’ (*note -keep::), ‘-remove’ (*note -remove::). - - (-filter (lambda (num) (= 0 (% num 2))) '(1 2 3 4)) - ⇒ '(2 4) - (-filter 'even? '(1 2 3 4)) - ⇒ '(2 4) - (--filter (= 0 (% it 2)) '(1 2 3 4)) - ⇒ '(2 4) - - -- Function: -remove (pred list) - Return a new list of the items in LIST for which PRED returns nil. - - Alias: ‘-reject’ - - See also: ‘-filter’ (*note -filter::). - - (-remove (lambda (num) (= 0 (% num 2))) '(1 2 3 4)) - ⇒ '(1 3) - (-remove 'even? '(1 2 3 4)) - ⇒ '(1 3) - (--remove (= 0 (% it 2)) '(1 2 3 4)) - ⇒ '(1 3) - - -- Function: -remove-first (pred list) - Return a new list with the first item matching PRED removed. - - Alias: ‘-reject-first’ - - See also: ‘-remove’ (*note -remove::), ‘-map-first’ (*note - -map-first::) - - (-remove-first 'even? '(1 3 5 4 7 8 10)) - ⇒ '(1 3 5 7 8 10) - (-remove-first 'stringp '(1 2 "first" "second" "third")) - ⇒ '(1 2 "second" "third") - (--remove-first (> it 3) '(1 2 3 4 5 6 7 8 9 10)) - ⇒ '(1 2 3 5 6 7 8 9 10) - - -- Function: -remove-last (pred list) - Return a new list with the last item matching PRED removed. - - Alias: ‘-reject-last’ - - See also: ‘-remove’ (*note -remove::), ‘-map-last’ (*note - -map-last::) - - (-remove-last 'even? '(1 3 5 4 7 8 10 11)) - ⇒ '(1 3 5 4 7 8 11) - (-remove-last 'stringp '(1 2 "last" "second" "third")) - ⇒ '(1 2 "last" "second") - (--remove-last (> it 3) '(1 2 3 4 5 6 7 8 9 10)) - ⇒ '(1 2 3 4 5 6 7 8 9) - - -- Function: -remove-item (item list) - Remove all occurrences of ITEM from LIST. - - Comparison is done with ‘equal’. - - (-remove-item 3 '(1 2 3 2 3 4 5 3)) - ⇒ '(1 2 2 4 5) - (-remove-item 'foo '(foo bar baz foo)) - ⇒ '(bar baz) - (-remove-item "bob" '("alice" "bob" "eve" "bob" "dave")) - ⇒ '("alice" "eve" "dave") - - -- Function: -non-nil (list) - Return all non-nil elements of LIST. - - (-non-nil '(1 nil 2 nil nil 3 4 nil 5 nil)) - ⇒ '(1 2 3 4 5) - - -- Function: -slice (list from &optional to step) - Return copy of LIST, starting from index FROM to index TO. - - FROM or TO may be negative. These values are then interpreted - modulo the length of the list. - - If STEP is a number, only each STEPth item in the resulting section - is returned. Defaults to 1. - - (-slice '(1 2 3 4 5) 1) - ⇒ '(2 3 4 5) - (-slice '(1 2 3 4 5) 0 3) - ⇒ '(1 2 3) - (-slice '(1 2 3 4 5 6 7 8 9) 1 -1 2) - ⇒ '(2 4 6 8) - - -- Function: -take (n list) - Return a new list of the first N items in LIST, or all items if - there are fewer than N. - - See also: ‘-take-last’ (*note -take-last::) - - (-take 3 '(1 2 3 4 5)) - ⇒ '(1 2 3) - (-take 17 '(1 2 3 4 5)) - ⇒ '(1 2 3 4 5) - - -- Function: -take-last (n list) - Return the last N items of LIST in order. - - See also: ‘-take’ (*note -take::) - - (-take-last 3 '(1 2 3 4 5)) - ⇒ '(3 4 5) - (-take-last 17 '(1 2 3 4 5)) - ⇒ '(1 2 3 4 5) - (-take-last 1 '(1 2 3 4 5)) - ⇒ '(5) - - -- Function: -drop (n list) - Return the tail of LIST without the first N items. - - See also: ‘-drop-last’ (*note -drop-last::) - - (fn N LIST) - - (-drop 3 '(1 2 3 4 5)) - ⇒ '(4 5) - (-drop 17 '(1 2 3 4 5)) - ⇒ '() - - -- Function: -drop-last (n list) - Remove the last N items of LIST and return a copy. - - See also: ‘-drop’ (*note -drop::) - - (-drop-last 3 '(1 2 3 4 5)) - ⇒ '(1 2) - (-drop-last 17 '(1 2 3 4 5)) - ⇒ '() - - -- Function: -take-while (pred list) - Return a new list of successive items from LIST while (PRED item) - returns a non-nil value. - - (-take-while 'even? '(1 2 3 4)) - ⇒ '() - (-take-while 'even? '(2 4 5 6)) - ⇒ '(2 4) - (--take-while (< it 4) '(1 2 3 4 3 2 1)) - ⇒ '(1 2 3) - - -- Function: -drop-while (pred list) - Return the tail of LIST starting from the first item for which - (PRED item) returns nil. - - (-drop-while 'even? '(1 2 3 4)) - ⇒ '(1 2 3 4) - (-drop-while 'even? '(2 4 5 6)) - ⇒ '(5 6) - (--drop-while (< it 4) '(1 2 3 4 3 2 1)) - ⇒ '(4 3 2 1) - - -- Function: -select-by-indices (indices list) - Return a list whose elements are elements from LIST selected as - ‘(nth i list)‘ for all i from INDICES. - - (-select-by-indices '(4 10 2 3 6) '("v" "e" "l" "o" "c" "i" "r" "a" "p" "t" "o" "r")) - ⇒ '("c" "o" "l" "o" "r") - (-select-by-indices '(2 1 0) '("a" "b" "c")) - ⇒ '("c" "b" "a") - (-select-by-indices '(0 1 2 0 1 3 3 1) '("f" "a" "r" "l")) - ⇒ '("f" "a" "r" "f" "a" "l" "l" "a") - - -- Function: -select-columns (columns table) - Select COLUMNS from TABLE. - - TABLE is a list of lists where each element represents one row. It - is assumed each row has the same length. - - Each row is transformed such that only the specified COLUMNS are - selected. - - See also: ‘-select-column’ (*note -select-column::), - ‘-select-by-indices’ (*note -select-by-indices::) - - (-select-columns '(0 2) '((1 2 3) (a b c) (:a :b :c))) - ⇒ '((1 3) (a c) (:a :c)) - (-select-columns '(1) '((1 2 3) (a b c) (:a :b :c))) - ⇒ '((2) (b) (:b)) - (-select-columns nil '((1 2 3) (a b c) (:a :b :c))) - ⇒ '(nil nil nil) - - -- Function: -select-column (column table) - Select COLUMN from TABLE. - - TABLE is a list of lists where each element represents one row. It - is assumed each row has the same length. - - The single selected column is returned as a list. - - See also: ‘-select-columns’ (*note -select-columns::), - ‘-select-by-indices’ (*note -select-by-indices::) - - (-select-column 1 '((1 2 3) (a b c) (:a :b :c))) - ⇒ '(2 b :b) - - -File: dash.info, Node: List to list, Next: Reductions, Prev: Sublist selection, Up: Functions - -2.3 List to list -================ - -Functions returning a modified copy of the input list. - - -- Function: -keep (fn list) - Return a new list of the non-nil results of applying FN to the - items in LIST. - - If you want to select the original items satisfying a predicate use - ‘-filter’ (*note -filter::). - - (-keep 'cdr '((1 2 3) (4 5) (6))) - ⇒ '((2 3) (5)) - (-keep (lambda (num) (when (> num 3) (* 10 num))) '(1 2 3 4 5 6)) - ⇒ '(40 50 60) - (--keep (when (> it 3) (* 10 it)) '(1 2 3 4 5 6)) - ⇒ '(40 50 60) - - -- Function: -concat (&rest lists) - Return a new list with the concatenation of the elements in the - supplied LISTS. - - (-concat '(1)) - ⇒ '(1) - (-concat '(1) '(2)) - ⇒ '(1 2) - (-concat '(1) '(2 3) '(4)) - ⇒ '(1 2 3 4) - - -- Function: -flatten (l) - Take a nested list L and return its contents as a single, flat - list. - - Note that because ‘nil’ represents a list of zero elements (an - empty list), any mention of nil in L will disappear after - flattening. If you need to preserve nils, consider ‘-flatten-n’ - (*note -flatten-n::) or map them to some unique symbol and then map - them back. - - Conses of two atoms are considered "terminals", that is, they - aren’t flattened further. - - See also: ‘-flatten-n’ (*note -flatten-n::) - - (-flatten '((1))) - ⇒ '(1) - (-flatten '((1 (2 3) (((4 (5))))))) - ⇒ '(1 2 3 4 5) - (-flatten '(1 2 (3 . 4))) - ⇒ '(1 2 (3 . 4)) - - -- Function: -flatten-n (num list) - Flatten NUM levels of a nested LIST. - - See also: ‘-flatten’ (*note -flatten::) - - (-flatten-n 1 '((1 2) ((3 4) ((5 6))))) - ⇒ '(1 2 (3 4) ((5 6))) - (-flatten-n 2 '((1 2) ((3 4) ((5 6))))) - ⇒ '(1 2 3 4 (5 6)) - (-flatten-n 3 '((1 2) ((3 4) ((5 6))))) - ⇒ '(1 2 3 4 5 6) - - -- Function: -replace (old new list) - Replace all OLD items in LIST with NEW. - - Elements are compared using ‘equal’. - - See also: ‘-replace-at’ (*note -replace-at::) - - (-replace 1 "1" '(1 2 3 4 3 2 1)) - ⇒ '("1" 2 3 4 3 2 "1") - (-replace "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo")) - ⇒ '("a" "nice" "bar" "sentence" "about" "bar") - (-replace 1 2 nil) - ⇒ nil - - -- Function: -replace-first (old new list) - Replace the first occurrence of OLD with NEW in LIST. - - Elements are compared using ‘equal’. - - See also: ‘-map-first’ (*note -map-first::) - - (-replace-first 1 "1" '(1 2 3 4 3 2 1)) - ⇒ '("1" 2 3 4 3 2 1) - (-replace-first "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo")) - ⇒ '("a" "nice" "bar" "sentence" "about" "foo") - (-replace-first 1 2 nil) - ⇒ nil - - -- Function: -replace-last (old new list) - Replace the last occurrence of OLD with NEW in LIST. - - Elements are compared using ‘equal’. - - See also: ‘-map-last’ (*note -map-last::) - - (-replace-last 1 "1" '(1 2 3 4 3 2 1)) - ⇒ '(1 2 3 4 3 2 "1") - (-replace-last "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo")) - ⇒ '("a" "nice" "foo" "sentence" "about" "bar") - (-replace-last 1 2 nil) - ⇒ nil - - -- Function: -insert-at (n x list) - Return a list with X inserted into LIST at position N. - - See also: ‘-splice’ (*note -splice::), ‘-splice-list’ (*note - -splice-list::) - - (-insert-at 1 'x '(a b c)) - ⇒ '(a x b c) - (-insert-at 12 'x '(a b c)) - ⇒ '(a b c x) - - -- Function: -replace-at (n x list) - Return a list with element at Nth position in LIST replaced with X. - - See also: ‘-replace’ (*note -replace::) - - (-replace-at 0 9 '(0 1 2 3 4 5)) - ⇒ '(9 1 2 3 4 5) - (-replace-at 1 9 '(0 1 2 3 4 5)) - ⇒ '(0 9 2 3 4 5) - (-replace-at 4 9 '(0 1 2 3 4 5)) - ⇒ '(0 1 2 3 9 5) - - -- Function: -update-at (n func list) - Return a list with element at Nth position in LIST replaced with - ‘(func (nth n list))‘. - - See also: ‘-map-when’ (*note -map-when::) - - (-update-at 0 (lambda (x) (+ x 9)) '(0 1 2 3 4 5)) - ⇒ '(9 1 2 3 4 5) - (-update-at 1 (lambda (x) (+ x 8)) '(0 1 2 3 4 5)) - ⇒ '(0 9 2 3 4 5) - (--update-at 2 (length it) '("foo" "bar" "baz" "quux")) - ⇒ '("foo" "bar" 3 "quux") - - -- Function: -remove-at (n list) - Return a list with element at Nth position in LIST removed. - - See also: ‘-remove-at-indices’ (*note -remove-at-indices::), - ‘-remove’ (*note -remove::) - - (-remove-at 0 '("0" "1" "2" "3" "4" "5")) - ⇒ '("1" "2" "3" "4" "5") - (-remove-at 1 '("0" "1" "2" "3" "4" "5")) - ⇒ '("0" "2" "3" "4" "5") - (-remove-at 2 '("0" "1" "2" "3" "4" "5")) - ⇒ '("0" "1" "3" "4" "5") - - -- Function: -remove-at-indices (indices list) - Return a list whose elements are elements from LIST without - elements selected as ‘(nth i list)‘ for all i from INDICES. - - See also: ‘-remove-at’ (*note -remove-at::), ‘-remove’ (*note - -remove::) - - (-remove-at-indices '(0) '("0" "1" "2" "3" "4" "5")) - ⇒ '("1" "2" "3" "4" "5") - (-remove-at-indices '(0 2 4) '("0" "1" "2" "3" "4" "5")) - ⇒ '("1" "3" "5") - (-remove-at-indices '(0 5) '("0" "1" "2" "3" "4" "5")) - ⇒ '("1" "2" "3" "4") - - -File: dash.info, Node: Reductions, Next: Unfolding, Prev: List to list, Up: Functions - -2.4 Reductions -============== - -Functions reducing lists into single value. - - -- Function: -reduce-from (fn initial-value list) - Return the result of applying FN to INITIAL-VALUE and the first - item in LIST, then applying FN to that result and the 2nd item, - etc. If LIST contains no items, return INITIAL-VALUE and do not - call FN. - - In the anaphoric form ‘--reduce-from’, the accumulated value is - exposed as symbol ‘acc’. - - See also: ‘-reduce’ (*note -reduce::), ‘-reduce-r’ (*note - -reduce-r::) - - (-reduce-from '- 10 '(1 2 3)) - ⇒ 4 - (-reduce-from (lambda (memo item) (format "(%s - %d)" memo item)) "10" '(1 2 3)) - ⇒ "(((10 - 1) - 2) - 3)" - (--reduce-from (concat acc " " it) "START" '("a" "b" "c")) - ⇒ "START a b c" - - -- Function: -reduce-r-from (fn initial-value list) - Replace conses with FN, nil with INITIAL-VALUE and evaluate the - resulting expression. If LIST is empty, INITIAL-VALUE is returned - and FN is not called. - - Note: this function works the same as ‘-reduce-from’ (*note - -reduce-from::) but the operation associates from right instead of - from left. - - See also: ‘-reduce-r’ (*note -reduce-r::), ‘-reduce’ (*note - -reduce::) - - (-reduce-r-from '- 10 '(1 2 3)) - ⇒ -8 - (-reduce-r-from (lambda (item memo) (format "(%d - %s)" item memo)) "10" '(1 2 3)) - ⇒ "(1 - (2 - (3 - 10)))" - (--reduce-r-from (concat it " " acc) "END" '("a" "b" "c")) - ⇒ "a b c END" - - -- Function: -reduce (fn list) - Return the result of applying FN to the first 2 items in LIST, then - applying FN to that result and the 3rd item, etc. If LIST contains - no items, return the result of calling FN with no arguments. If - LIST contains a single item, return that item and do not call FN. - - In the anaphoric form ‘--reduce’, the accumulated value is exposed - as symbol ‘acc’. - - See also: ‘-reduce-from’ (*note -reduce-from::), ‘-reduce-r’ (*note - -reduce-r::) - - (-reduce '- '(1 2 3 4)) - ⇒ -8 - (-reduce 'list '(1 2 3 4)) - ⇒ '(((1 2) 3) 4) - (--reduce (format "%s-%d" acc it) '(1 2 3)) - ⇒ "1-2-3" - - -- Function: -reduce-r (fn list) - Replace conses with FN and evaluate the resulting expression. The - final nil is ignored. If LIST contains no items, return the result - of calling FN with no arguments. If LIST contains a single item, - return that item and do not call FN. - - The first argument of FN is the new item, the second is the - accumulated value. - - Note: this function works the same as ‘-reduce’ (*note -reduce::) - but the operation associates from right instead of from left. - - See also: ‘-reduce-r-from’ (*note -reduce-r-from::), ‘-reduce’ - (*note -reduce::) - - (-reduce-r '- '(1 2 3 4)) - ⇒ -2 - (-reduce-r (lambda (item memo) (format "%s-%d" memo item)) '(1 2 3)) - ⇒ "3-2-1" - (--reduce-r (format "%s-%d" acc it) '(1 2 3)) - ⇒ "3-2-1" - - -- Function: -reductions-from (fn init list) - Return a list of the intermediate values of the reduction. - - See ‘-reduce-from’ (*note -reduce-from::) for explanation of the - arguments. - - See also: ‘-reductions’ (*note -reductions::), ‘-reductions-r’ - (*note -reductions-r::), ‘-reduce-r’ (*note -reduce-r::) - - (-reductions-from (lambda (a i) (format "(%s FN %d)" a i)) "INIT" '(1 2 3 4)) - ⇒ '("INIT" "(INIT FN 1)" "((INIT FN 1) FN 2)" "(((INIT FN 1) FN 2) FN 3)" "((((INIT FN 1) FN 2) FN 3) FN 4)") - (-reductions-from 'max 0 '(2 1 4 3)) - ⇒ '(0 2 2 4 4) - (-reductions-from '* 1 '(1 2 3 4)) - ⇒ '(1 1 2 6 24) - - -- Function: -reductions-r-from (fn init list) - Return a list of the intermediate values of the reduction. - - See ‘-reduce-r-from’ (*note -reduce-r-from::) for explanation of - the arguments. - - See also: ‘-reductions-r’ (*note -reductions-r::), ‘-reductions’ - (*note -reductions::), ‘-reduce’ (*note -reduce::) - - (-reductions-r-from (lambda (i a) (format "(%d FN %s)" i a)) "INIT" '(1 2 3 4)) - ⇒ '("(1 FN (2 FN (3 FN (4 FN INIT))))" "(2 FN (3 FN (4 FN INIT)))" "(3 FN (4 FN INIT))" "(4 FN INIT)" "INIT") - (-reductions-r-from 'max 0 '(2 1 4 3)) - ⇒ '(4 4 4 3 0) - (-reductions-r-from '* 1 '(1 2 3 4)) - ⇒ '(24 24 12 4 1) - - -- Function: -reductions (fn list) - Return a list of the intermediate values of the reduction. - - See ‘-reduce’ (*note -reduce::) for explanation of the arguments. - - See also: ‘-reductions-from’ (*note -reductions-from::), - ‘-reductions-r’ (*note -reductions-r::), ‘-reduce-r’ (*note - -reduce-r::) - - (-reductions (lambda (a i) (format "(%s FN %d)" a i)) '(1 2 3 4)) - ⇒ '(1 "(1 FN 2)" "((1 FN 2) FN 3)" "(((1 FN 2) FN 3) FN 4)") - (-reductions '+ '(1 2 3 4)) - ⇒ '(1 3 6 10) - (-reductions '* '(1 2 3 4)) - ⇒ '(1 2 6 24) - - -- Function: -reductions-r (fn list) - Return a list of the intermediate values of the reduction. - - See ‘-reduce-r’ (*note -reduce-r::) for explanation of the - arguments. - - See also: ‘-reductions-r-from’ (*note -reductions-r-from::), - ‘-reductions’ (*note -reductions::), ‘-reduce’ (*note -reduce::) - - (-reductions-r (lambda (i a) (format "(%d FN %s)" i a)) '(1 2 3 4)) - ⇒ '("(1 FN (2 FN (3 FN 4)))" "(2 FN (3 FN 4))" "(3 FN 4)" 4) - (-reductions-r '+ '(1 2 3 4)) - ⇒ '(10 9 7 4) - (-reductions-r '* '(1 2 3 4)) - ⇒ '(24 24 12 4) - - -- Function: -count (pred list) - Counts the number of items in LIST where (PRED item) is non-nil. - - (-count 'even? '(1 2 3 4 5)) - ⇒ 2 - (--count (< it 4) '(1 2 3 4)) - ⇒ 3 - - -- Function: -sum (list) - Return the sum of LIST. - - (-sum '()) - ⇒ 0 - (-sum '(1)) - ⇒ 1 - (-sum '(1 2 3 4)) - ⇒ 10 - - -- Function: -running-sum (list) - Return a list with running sums of items in LIST. - - LIST must be non-empty. - - (-running-sum '(1 2 3 4)) - ⇒ '(1 3 6 10) - (-running-sum '(1)) - ⇒ '(1) - (-running-sum '()) - ⇒ error - - -- Function: -product (list) - Return the product of LIST. - - (-product '()) - ⇒ 1 - (-product '(1)) - ⇒ 1 - (-product '(1 2 3 4)) - ⇒ 24 - - -- Function: -running-product (list) - Return a list with running products of items in LIST. - - LIST must be non-empty. - - (-running-product '(1 2 3 4)) - ⇒ '(1 2 6 24) - (-running-product '(1)) - ⇒ '(1) - (-running-product '()) - ⇒ error - - -- Function: -inits (list) - Return all prefixes of LIST. - - (-inits '(1 2 3 4)) - ⇒ '(nil (1) (1 2) (1 2 3) (1 2 3 4)) - (-inits nil) - ⇒ '(nil) - (-inits '(1)) - ⇒ '(nil (1)) - - -- Function: -tails (list) - Return all suffixes of LIST - - (-tails '(1 2 3 4)) - ⇒ '((1 2 3 4) (2 3 4) (3 4) (4) nil) - (-tails nil) - ⇒ '(nil) - (-tails '(1)) - ⇒ '((1) nil) - - -- Function: -common-prefix (&rest lists) - Return the longest common prefix of LISTS. - - (-common-prefix '(1)) - ⇒ '(1) - (-common-prefix '(1 2) '(3 4) '(1 2)) - ⇒ nil - (-common-prefix '(1 2) '(1 2 3) '(1 2 3 4)) - ⇒ '(1 2) - - -- Function: -common-suffix (&rest lists) - Return the longest common suffix of LISTS. - - (-common-suffix '(1)) - ⇒ '(1) - (-common-suffix '(1 2) '(3 4) '(1 2)) - ⇒ nil - (-common-suffix '(1 2 3 4) '(2 3 4) '(3 4)) - ⇒ '(3 4) - - -- Function: -min (list) - Return the smallest value from LIST of numbers or markers. - - (-min '(0)) - ⇒ 0 - (-min '(3 2 1)) - ⇒ 1 - (-min '(1 2 3)) - ⇒ 1 - - -- Function: -min-by (comparator list) - Take a comparison function COMPARATOR and a LIST and return the - least element of the list by the comparison function. - - See also combinator ‘-on’ (*note -on::) which can transform the - values before comparing them. - - (-min-by '> '(4 3 6 1)) - ⇒ 1 - (--min-by (> (car it) (car other)) '((1 2 3) (2) (3 2))) - ⇒ '(1 2 3) - (--min-by (> (length it) (length other)) '((1 2 3) (2) (3 2))) - ⇒ '(2) - - -- Function: -max (list) - Return the largest value from LIST of numbers or markers. - - (-max '(0)) - ⇒ 0 - (-max '(3 2 1)) - ⇒ 3 - (-max '(1 2 3)) - ⇒ 3 - - -- Function: -max-by (comparator list) - Take a comparison function COMPARATOR and a LIST and return the - greatest element of the list by the comparison function. - - See also combinator ‘-on’ (*note -on::) which can transform the - values before comparing them. - - (-max-by '> '(4 3 6 1)) - ⇒ 6 - (--max-by (> (car it) (car other)) '((1 2 3) (2) (3 2))) - ⇒ '(3 2) - (--max-by (> (length it) (length other)) '((1 2 3) (2) (3 2))) - ⇒ '(1 2 3) - - -File: dash.info, Node: Unfolding, Next: Predicates, Prev: Reductions, Up: Functions - -2.5 Unfolding -============= - -Operations dual to reductions, building lists from seed value rather -than consuming a list to produce a single value. - - -- Function: -iterate (fun init n) - Return a list of iterated applications of FUN to INIT. - - This means a list of form: - - (init (fun init) (fun (fun init)) ...) - - N is the length of the returned list. - - (-iterate '1+ 1 10) - ⇒ '(1 2 3 4 5 6 7 8 9 10) - (-iterate (lambda (x) (+ x x)) 2 5) - ⇒ '(2 4 8 16 32) - (--iterate (* it it) 2 5) - ⇒ '(2 4 16 256 65536) - - -- Function: -unfold (fun seed) - Build a list from SEED using FUN. - - This is "dual" operation to ‘-reduce-r’ (*note -reduce-r::): while - -reduce-r consumes a list to produce a single value, ‘-unfold’ - (*note -unfold::) takes a seed value and builds a (potentially - infinite!) list. - - FUN should return ‘nil’ to stop the generating process, or a cons - (A . B), where A will be prepended to the result and B is the new - seed. - - (-unfold (lambda (x) (unless (= x 0) (cons x (1- x)))) 10) - ⇒ '(10 9 8 7 6 5 4 3 2 1) - (--unfold (when it (cons it (cdr it))) '(1 2 3 4)) - ⇒ '((1 2 3 4) (2 3 4) (3 4) (4)) - (--unfold (when it (cons it (butlast it))) '(1 2 3 4)) - ⇒ '((1 2 3 4) (1 2 3) (1 2) (1)) - - -File: dash.info, Node: Predicates, Next: Partitioning, Prev: Unfolding, Up: Functions - -2.6 Predicates -============== - - -- Function: -any? (pred list) - Return t if (PRED x) is non-nil for any x in LIST, else nil. - - Alias: ‘-any-p’, ‘-some?’, ‘-some-p’ - - (-any? 'even? '(1 2 3)) - ⇒ t - (-any? 'even? '(1 3 5)) - ⇒ nil - (-any? 'null '(1 3 5)) - ⇒ nil - - -- Function: -all? (pred list) - Return t if (PRED x) is non-nil for all x in LIST, else nil. - - Alias: ‘-all-p’, ‘-every?’, ‘-every-p’ - - (-all? 'even? '(1 2 3)) - ⇒ nil - (-all? 'even? '(2 4 6)) - ⇒ t - (--all? (= 0 (% it 2)) '(2 4 6)) - ⇒ t - - -- Function: -none? (pred list) - Return t if (PRED x) is nil for all x in LIST, else nil. - - Alias: ‘-none-p’ - - (-none? 'even? '(1 2 3)) - ⇒ nil - (-none? 'even? '(1 3 5)) - ⇒ t - (--none? (= 0 (% it 2)) '(1 2 3)) - ⇒ nil - - -- Function: -only-some? (pred list) - Return ‘t‘ if at least one item of LIST matches PRED and at least - one item of LIST does not match PRED. Return ‘nil‘ both if all - items match the predicate or if none of the items match the - predicate. - - Alias: ‘-only-some-p’ - - (-only-some? 'even? '(1 2 3)) - ⇒ t - (-only-some? 'even? '(1 3 5)) - ⇒ nil - (-only-some? 'even? '(2 4 6)) - ⇒ nil - - -- Function: -contains? (list element) - Return non-nil if LIST contains ELEMENT. - - The test for equality is done with ‘equal’, or with ‘-compare-fn’ - if that’s non-nil. - - Alias: ‘-contains-p’ - - (-contains? '(1 2 3) 1) - ⇒ t - (-contains? '(1 2 3) 2) - ⇒ t - (-contains? '(1 2 3) 4) - ⇒ nil - - -- Function: -same-items? (list list2) - Return true if LIST and LIST2 has the same items. - - The order of the elements in the lists does not matter. - - Alias: ‘-same-items-p’ - - (-same-items? '(1 2 3) '(1 2 3)) - ⇒ t - (-same-items? '(1 2 3) '(3 2 1)) - ⇒ t - (-same-items? '(1 2 3) '(1 2 3 4)) - ⇒ nil - - -- Function: -is-prefix? (prefix list) - Return non-nil if PREFIX is prefix of LIST. - - Alias: ‘-is-prefix-p’ - - (-is-prefix? '(1 2 3) '(1 2 3 4 5)) - ⇒ t - (-is-prefix? '(1 2 3 4 5) '(1 2 3)) - ⇒ nil - (-is-prefix? '(1 3) '(1 2 3 4 5)) - ⇒ nil - - -- Function: -is-suffix? (suffix list) - Return non-nil if SUFFIX is suffix of LIST. - - Alias: ‘-is-suffix-p’ - - (-is-suffix? '(3 4 5) '(1 2 3 4 5)) - ⇒ t - (-is-suffix? '(1 2 3 4 5) '(3 4 5)) - ⇒ nil - (-is-suffix? '(3 5) '(1 2 3 4 5)) - ⇒ nil - - -- Function: -is-infix? (infix list) - Return non-nil if INFIX is infix of LIST. - - This operation runs in O(n^2) time - - Alias: ‘-is-infix-p’ - - (-is-infix? '(1 2 3) '(1 2 3 4 5)) - ⇒ t - (-is-infix? '(2 3 4) '(1 2 3 4 5)) - ⇒ t - (-is-infix? '(3 4 5) '(1 2 3 4 5)) - ⇒ t - - -File: dash.info, Node: Partitioning, Next: Indexing, Prev: Predicates, Up: Functions - -2.7 Partitioning -================ - -Functions partitioning the input list into a list of lists. - - -- Function: -split-at (n list) - Return a list of ((-take N LIST) (-drop N LIST)), in no more than - one pass through the list. - - (-split-at 3 '(1 2 3 4 5)) - ⇒ '((1 2 3) (4 5)) - (-split-at 17 '(1 2 3 4 5)) - ⇒ '((1 2 3 4 5) nil) - - -- Function: -split-with (pred list) - Return a list of ((-take-while PRED LIST) (-drop-while PRED LIST)), - in no more than one pass through the list. - - (-split-with 'even? '(1 2 3 4)) - ⇒ '(nil (1 2 3 4)) - (-split-with 'even? '(2 4 5 6)) - ⇒ '((2 4) (5 6)) - (--split-with (< it 4) '(1 2 3 4 3 2 1)) - ⇒ '((1 2 3) (4 3 2 1)) - - -- Macro: -split-on (item list) - Split the LIST each time ITEM is found. - - Unlike ‘-partition-by’ (*note -partition-by::), the ITEM is - discarded from the results. Empty lists are also removed from the - result. - - Comparison is done by ‘equal’. - - See also ‘-split-when’ (*note -split-when::) - - (-split-on '| '(Nil | Leaf a | Node [Tree a])) - ⇒ '((Nil) (Leaf a) (Node [Tree a])) - (-split-on ':endgroup '("a" "b" :endgroup "c" :endgroup "d" "e")) - ⇒ '(("a" "b") ("c") ("d" "e")) - (-split-on ':endgroup '("a" "b" :endgroup :endgroup "d" "e")) - ⇒ '(("a" "b") ("d" "e")) - - -- Function: -split-when (fn list) - Split the LIST on each element where FN returns non-nil. - - Unlike ‘-partition-by’ (*note -partition-by::), the "matched" - element is discarded from the results. Empty lists are also - removed from the result. - - This function can be thought of as a generalization of - ‘split-string’. - - (-split-when 'even? '(1 2 3 4 5 6)) - ⇒ '((1) (3) (5)) - (-split-when 'even? '(1 2 3 4 6 8 9)) - ⇒ '((1) (3) (9)) - (--split-when (memq it '(&optional &rest)) '(a b &optional c d &rest args)) - ⇒ '((a b) (c d) (args)) - - -- Function: -separate (pred list) - Return a list of ((-filter PRED LIST) (-remove PRED LIST)), in one - pass through the list. - - (-separate (lambda (num) (= 0 (% num 2))) '(1 2 3 4 5 6 7)) - ⇒ '((2 4 6) (1 3 5 7)) - (--separate (< it 5) '(3 7 5 9 3 2 1 4 6)) - ⇒ '((3 3 2 1 4) (7 5 9 6)) - (-separate 'cdr '((1 2) (1) (1 2 3) (4))) - ⇒ '(((1 2) (1 2 3)) ((1) (4))) - - -- Function: -partition (n list) - Return a new list with the items in LIST grouped into N-sized - sublists. If there are not enough items to make the last group - N-sized, those items are discarded. - - (-partition 2 '(1 2 3 4 5 6)) - ⇒ '((1 2) (3 4) (5 6)) - (-partition 2 '(1 2 3 4 5 6 7)) - ⇒ '((1 2) (3 4) (5 6)) - (-partition 3 '(1 2 3 4 5 6 7)) - ⇒ '((1 2 3) (4 5 6)) - - -- Function: -partition-all (n list) - Return a new list with the items in LIST grouped into N-sized - sublists. The last group may contain less than N items. - - (-partition-all 2 '(1 2 3 4 5 6)) - ⇒ '((1 2) (3 4) (5 6)) - (-partition-all 2 '(1 2 3 4 5 6 7)) - ⇒ '((1 2) (3 4) (5 6) (7)) - (-partition-all 3 '(1 2 3 4 5 6 7)) - ⇒ '((1 2 3) (4 5 6) (7)) - - -- Function: -partition-in-steps (n step list) - Return a new list with the items in LIST grouped into N-sized - sublists at offsets STEP apart. If there are not enough items to - make the last group N-sized, those items are discarded. - - (-partition-in-steps 2 1 '(1 2 3 4)) - ⇒ '((1 2) (2 3) (3 4)) - (-partition-in-steps 3 2 '(1 2 3 4)) - ⇒ '((1 2 3)) - (-partition-in-steps 3 2 '(1 2 3 4 5)) - ⇒ '((1 2 3) (3 4 5)) - - -- Function: -partition-all-in-steps (n step list) - Return a new list with the items in LIST grouped into N-sized - sublists at offsets STEP apart. The last groups may contain less - than N items. - - (-partition-all-in-steps 2 1 '(1 2 3 4)) - ⇒ '((1 2) (2 3) (3 4) (4)) - (-partition-all-in-steps 3 2 '(1 2 3 4)) - ⇒ '((1 2 3) (3 4)) - (-partition-all-in-steps 3 2 '(1 2 3 4 5)) - ⇒ '((1 2 3) (3 4 5) (5)) - - -- Function: -partition-by (fn list) - Apply FN to each item in LIST, splitting it each time FN returns a - new value. - - (-partition-by 'even? '()) - ⇒ '() - (-partition-by 'even? '(1 1 2 2 2 3 4 6 8)) - ⇒ '((1 1) (2 2 2) (3) (4 6 8)) - (--partition-by (< it 3) '(1 2 3 4 3 2 1)) - ⇒ '((1 2) (3 4 3) (2 1)) - - -- Function: -partition-by-header (fn list) - Apply FN to the first item in LIST. That is the header value. - Apply FN to each item in LIST, splitting it each time FN returns - the header value, but only after seeing at least one other value - (the body). - - (--partition-by-header (= it 1) '(1 2 3 1 2 1 2 3 4)) - ⇒ '((1 2 3) (1 2) (1 2 3 4)) - (--partition-by-header (> it 0) '(1 2 0 1 0 1 2 3 0)) - ⇒ '((1 2 0) (1 0) (1 2 3 0)) - (-partition-by-header 'even? '(2 1 1 1 4 1 3 5 6 6 1)) - ⇒ '((2 1 1 1) (4 1 3 5) (6 6 1)) - - -- Function: -partition-after-pred (pred list) - Partition directly after each time PRED is true on an element of - LIST. - - (-partition-after-pred #'odd? '()) - ⇒ '() - (-partition-after-pred #'odd? '(1)) - ⇒ '((1)) - (-partition-after-pred #'odd? '(0 1)) - ⇒ '((0 1)) - - -- Function: -partition-before-pred (pred list) - Partition directly before each time PRED is true on an element of - LIST. - - (-partition-before-pred #'odd? '()) - ⇒ '() - (-partition-before-pred #'odd? '(1)) - ⇒ '((1)) - (-partition-before-pred #'odd? '(0 1)) - ⇒ '((0) (1)) - - -- Function: -partition-before-item (item list) - Partition directly before each time ITEM appears in LIST. - - (-partition-before-item 3 '()) - ⇒ '() - (-partition-before-item 3 '(1)) - ⇒ '((1)) - (-partition-before-item 3 '(3)) - ⇒ '((3)) - - -- Function: -partition-after-item (item list) - Partition directly after each time ITEM appears in LIST. - - (-partition-after-item 3 '()) - ⇒ '() - (-partition-after-item 3 '(1)) - ⇒ '((1)) - (-partition-after-item 3 '(3)) - ⇒ '((3)) - - -- Function: -group-by (fn list) - Separate LIST into an alist whose keys are FN applied to the - elements of LIST. Keys are compared by ‘equal’. - - (-group-by 'even? '()) - ⇒ '() - (-group-by 'even? '(1 1 2 2 2 3 4 6 8)) - ⇒ '((nil 1 1 3) (t 2 2 2 4 6 8)) - (--group-by (car (split-string it "/")) '("a/b" "c/d" "a/e")) - ⇒ '(("a" "a/b" "a/e") ("c" "c/d")) - - -File: dash.info, Node: Indexing, Next: Set operations, Prev: Partitioning, Up: Functions - -2.8 Indexing -============ - -Return indices of elements based on predicates, sort elements by indices -etc. - - -- Function: -elem-index (elem list) - Return the index of the first element in the given LIST which is - equal to the query element ELEM, or nil if there is no such - element. - - (-elem-index 2 '(6 7 8 2 3 4)) - ⇒ 3 - (-elem-index "bar" '("foo" "bar" "baz")) - ⇒ 1 - (-elem-index '(1 2) '((3) (5 6) (1 2) nil)) - ⇒ 2 - - -- Function: -elem-indices (elem list) - Return the indices of all elements in LIST equal to the query - element ELEM, in ascending order. - - (-elem-indices 2 '(6 7 8 2 3 4 2 1)) - ⇒ '(3 6) - (-elem-indices "bar" '("foo" "bar" "baz")) - ⇒ '(1) - (-elem-indices '(1 2) '((3) (1 2) (5 6) (1 2) nil)) - ⇒ '(1 3) - - -- Function: -find-index (pred list) - Take a predicate PRED and a LIST and return the index of the first - element in the list satisfying the predicate, or nil if there is no - such element. - - See also ‘-first’ (*note -first::). - - (-find-index 'even? '(2 4 1 6 3 3 5 8)) - ⇒ 0 - (--find-index (< 5 it) '(2 4 1 6 3 3 5 8)) - ⇒ 3 - (-find-index (-partial 'string-lessp "baz") '("bar" "foo" "baz")) - ⇒ 1 - - -- Function: -find-last-index (pred list) - Take a predicate PRED and a LIST and return the index of the last - element in the list satisfying the predicate, or nil if there is no - such element. - - See also ‘-last’ (*note -last::). - - (-find-last-index 'even? '(2 4 1 6 3 3 5 8)) - ⇒ 7 - (--find-last-index (< 5 it) '(2 7 1 6 3 8 5 2)) - ⇒ 5 - (-find-last-index (-partial 'string-lessp "baz") '("q" "foo" "baz")) - ⇒ 1 - - -- Function: -find-indices (pred list) - Return the indices of all elements in LIST satisfying the predicate - PRED, in ascending order. - - (-find-indices 'even? '(2 4 1 6 3 3 5 8)) - ⇒ '(0 1 3 7) - (--find-indices (< 5 it) '(2 4 1 6 3 3 5 8)) - ⇒ '(3 7) - (-find-indices (-partial 'string-lessp "baz") '("bar" "foo" "baz")) - ⇒ '(1) - - -- Function: -grade-up (comparator list) - Grade elements of LIST using COMPARATOR relation, yielding a - permutation vector such that applying this permutation to LIST - sorts it in ascending order. - - (-grade-up '< '(3 1 4 2 1 3 3)) - ⇒ '(1 4 3 0 5 6 2) - (let ((l '(3 1 4 2 1 3 3))) (-select-by-indices (-grade-up '< l) l)) - ⇒ '(1 1 2 3 3 3 4) - - -- Function: -grade-down (comparator list) - Grade elements of LIST using COMPARATOR relation, yielding a - permutation vector such that applying this permutation to LIST - sorts it in descending order. - - (-grade-down '< '(3 1 4 2 1 3 3)) - ⇒ '(2 0 5 6 3 1 4) - (let ((l '(3 1 4 2 1 3 3))) (-select-by-indices (-grade-down '< l) l)) - ⇒ '(4 3 3 3 2 1 1) - - -File: dash.info, Node: Set operations, Next: Other list operations, Prev: Indexing, Up: Functions - -2.9 Set operations -================== - -Operations pretending lists are sets. - - -- Function: -union (list list2) - Return a new list containing the elements of LIST and elements of - LIST2 that are not in LIST. The test for equality is done with - ‘equal’, or with ‘-compare-fn’ if that’s non-nil. - - (-union '(1 2 3) '(3 4 5)) - ⇒ '(1 2 3 4 5) - (-union '(1 2 3 4) '()) - ⇒ '(1 2 3 4) - (-union '(1 1 2 2) '(3 2 1)) - ⇒ '(1 1 2 2 3) - - -- Function: -difference (list list2) - Return a new list with only the members of LIST that are not in - LIST2. The test for equality is done with ‘equal’, or with - ‘-compare-fn’ if that’s non-nil. - - (-difference '() '()) - ⇒ '() - (-difference '(1 2 3) '(4 5 6)) - ⇒ '(1 2 3) - (-difference '(1 2 3 4) '(3 4 5 6)) - ⇒ '(1 2) - - -- Function: -intersection (list list2) - Return a new list containing only the elements that are members of - both LIST and LIST2. The test for equality is done with ‘equal’, - or with ‘-compare-fn’ if that’s non-nil. - - (-intersection '() '()) - ⇒ '() - (-intersection '(1 2 3) '(4 5 6)) - ⇒ '() - (-intersection '(1 2 3 4) '(3 4 5 6)) - ⇒ '(3 4) - - -- Function: -powerset (list) - Return the power set of LIST. - - (-powerset '()) - ⇒ '(nil) - (-powerset '(x y z)) - ⇒ '((x y z) (x y) (x z) (x) (y z) (y) (z) nil) - - -- Function: -permutations (list) - Return the permutations of LIST. - - (-permutations '()) - ⇒ '(nil) - (-permutations '(1 2)) - ⇒ '((1 2) (2 1)) - (-permutations '(a b c)) - ⇒ '((a b c) (a c b) (b a c) (b c a) (c a b) (c b a)) - - -- Function: -distinct (list) - Return a new list with all duplicates removed. The test for - equality is done with ‘equal’, or with ‘-compare-fn’ if that’s - non-nil. - - Alias: ‘-uniq’ - - (-distinct '()) - ⇒ '() - (-distinct '(1 2 2 4)) - ⇒ '(1 2 4) - (-distinct '(t t t)) - ⇒ '(t) - - -File: dash.info, Node: Other list operations, Next: Tree operations, Prev: Set operations, Up: Functions - -2.10 Other list operations -========================== - -Other list functions not fit to be classified elsewhere. - - -- Function: -rotate (n list) - Rotate LIST N places to the right. With N negative, rotate to the - left. The time complexity is O(n). - - (-rotate 3 '(1 2 3 4 5 6 7)) - ⇒ '(5 6 7 1 2 3 4) - (-rotate -3 '(1 2 3 4 5 6 7)) - ⇒ '(4 5 6 7 1 2 3) - (-rotate 16 '(1 2 3 4 5 6 7)) - ⇒ '(6 7 1 2 3 4 5) - - -- Function: -repeat (n x) - Return a list with X repeated N times. Return nil if N is less - than 1. - - (-repeat 3 :a) - ⇒ '(:a :a :a) - (-repeat 1 :a) - ⇒ '(:a) - (-repeat 0 :a) - ⇒ nil - - -- Function: -cons* (&rest args) - Make a new list from the elements of ARGS. - - The last 2 members of ARGS are used as the final cons of the result - so if the final member of ARGS is not a list the result is a dotted - list. - - (-cons* 1 2) - ⇒ '(1 . 2) - (-cons* 1 2 3) - ⇒ '(1 2 . 3) - (-cons* 1) - ⇒ 1 - - -- Function: -snoc (list elem &rest elements) - Append ELEM to the end of the list. - - This is like ‘cons’, but operates on the end of list. - - If ELEMENTS is non nil, append these to the list as well. - - (-snoc '(1 2 3) 4) - ⇒ '(1 2 3 4) - (-snoc '(1 2 3) 4 5 6) - ⇒ '(1 2 3 4 5 6) - (-snoc '(1 2 3) '(4 5 6)) - ⇒ '(1 2 3 (4 5 6)) - - -- Function: -interpose (sep list) - Return a new list of all elements in LIST separated by SEP. - - (-interpose "-" '()) - ⇒ '() - (-interpose "-" '("a")) - ⇒ '("a") - (-interpose "-" '("a" "b" "c")) - ⇒ '("a" "-" "b" "-" "c") - - -- Function: -interleave (&rest lists) - Return a new list of the first item in each list, then the second - etc. - - (-interleave '(1 2) '("a" "b")) - ⇒ '(1 "a" 2 "b") - (-interleave '(1 2) '("a" "b") '("A" "B")) - ⇒ '(1 "a" "A" 2 "b" "B") - (-interleave '(1 2 3) '("a" "b")) - ⇒ '(1 "a" 2 "b") - - -- Function: -zip-with (fn list1 list2) - Zip the two lists LIST1 and LIST2 using a function FN. This - function is applied pairwise taking as first argument element of - LIST1 and as second argument element of LIST2 at corresponding - position. - - The anaphoric form ‘--zip-with’ binds the elements from LIST1 as - symbol ‘it’, and the elements from LIST2 as symbol ‘other’. - - (-zip-with '+ '(1 2 3) '(4 5 6)) - ⇒ '(5 7 9) - (-zip-with 'cons '(1 2 3) '(4 5 6)) - ⇒ '((1 . 4) (2 . 5) (3 . 6)) - (--zip-with (concat it " and " other) '("Batman" "Jekyll") '("Robin" "Hyde")) - ⇒ '("Batman and Robin" "Jekyll and Hyde") - - -- Function: -zip (&rest lists) - Zip LISTS together. Group the head of each list, followed by the - second elements of each list, and so on. The lengths of the - returned groupings are equal to the length of the shortest input - list. - - If two lists are provided as arguments, return the groupings as a - list of cons cells. Otherwise, return the groupings as a list of - lists. - - Use ‘-zip-lists’ (*note -zip-lists::) if you need the return value - to always be a list of lists. - - Alias: ‘-zip-pair’ - - See also: ‘-zip-lists’ (*note -zip-lists::) - - (-zip '(1 2 3) '(4 5 6)) - ⇒ '((1 . 4) (2 . 5) (3 . 6)) - (-zip '(1 2 3) '(4 5 6 7)) - ⇒ '((1 . 4) (2 . 5) (3 . 6)) - (-zip '(1 2) '(3 4 5) '(6)) - ⇒ '((1 3 6)) - - -- Function: -zip-lists (&rest lists) - Zip LISTS together. Group the head of each list, followed by the - second elements of each list, and so on. The lengths of the - returned groupings are equal to the length of the shortest input - list. - - The return value is always list of lists, which is a difference - from ‘-zip-pair’ which returns a cons-cell in case two input lists - are provided. - - See also: ‘-zip’ (*note -zip::) - - (-zip-lists '(1 2 3) '(4 5 6)) - ⇒ '((1 4) (2 5) (3 6)) - (-zip-lists '(1 2 3) '(4 5 6 7)) - ⇒ '((1 4) (2 5) (3 6)) - (-zip-lists '(1 2) '(3 4 5) '(6)) - ⇒ '((1 3 6)) - - -- Function: -zip-fill (fill-value &rest lists) - Zip LISTS, with FILL-VALUE padded onto the shorter lists. The - lengths of the returned groupings are equal to the length of the - longest input list. - - (-zip-fill 0 '(1 2 3 4 5) '(6 7 8 9)) - ⇒ '((1 . 6) (2 . 7) (3 . 8) (4 . 9) (5 . 0)) - - -- Function: -unzip (lists) - Unzip LISTS. - - This works just like ‘-zip’ (*note -zip::) but takes a list of - lists instead of a variable number of arguments, such that - - (-unzip (-zip L1 L2 L3 ...)) - - is identity (given that the lists are the same length). - - Note in particular that calling this on a list of two lists will - return a list of cons-cells such that the aboce identity works. - - See also: ‘-zip’ (*note -zip::) - - (-unzip (-zip '(1 2 3) '(a b c) '("e" "f" "g"))) - ⇒ '((1 2 3) (a b c) ("e" "f" "g")) - (-unzip '((1 2) (3 4) (5 6) (7 8) (9 10))) - ⇒ '((1 3 5 7 9) (2 4 6 8 10)) - (-unzip '((1 2) (3 4))) - ⇒ '((1 . 3) (2 . 4)) - - -- Function: -cycle (list) - Return an infinite copy of LIST that will cycle through the - elements and repeat from the beginning. - - (-take 5 (-cycle '(1 2 3))) - ⇒ '(1 2 3 1 2) - (-take 7 (-cycle '(1 "and" 3))) - ⇒ '(1 "and" 3 1 "and" 3 1) - (-zip (-cycle '(1 2 3)) '(1 2)) - ⇒ '((1 . 1) (2 . 2)) - - -- Function: -pad (fill-value &rest lists) - Appends FILL-VALUE to the end of each list in LISTS such that they - will all have the same length. - - (-pad 0 '()) - ⇒ '(nil) - (-pad 0 '(1)) - ⇒ '((1)) - (-pad 0 '(1 2 3) '(4 5)) - ⇒ '((1 2 3) (4 5 0)) - - -- Function: -table (fn &rest lists) - Compute outer product of LISTS using function FN. - - The function FN should have the same arity as the number of - supplied lists. - - The outer product is computed by applying fn to all possible - combinations created by taking one element from each list in order. - The dimension of the result is (length lists). - - See also: ‘-table-flat’ (*note -table-flat::) - - (-table '* '(1 2 3) '(1 2 3)) - ⇒ '((1 2 3) (2 4 6) (3 6 9)) - (-table (lambda (a b) (-sum (-zip-with '* a b))) '((1 2) (3 4)) '((1 3) (2 4))) - ⇒ '((7 15) (10 22)) - (apply '-table 'list (-repeat 3 '(1 2))) - ⇒ '((((1 1 1) (2 1 1)) ((1 2 1) (2 2 1))) (((1 1 2) (2 1 2)) ((1 2 2) (2 2 2)))) - - -- Function: -table-flat (fn &rest lists) - Compute flat outer product of LISTS using function FN. - - The function FN should have the same arity as the number of - supplied lists. - - The outer product is computed by applying fn to all possible - combinations created by taking one element from each list in order. - The results are flattened, ignoring the tensor structure of the - result. This is equivalent to calling: - - (-flatten-n (1- (length lists)) (apply ’-table fn lists)) - - but the implementation here is much more efficient. - - See also: ‘-flatten-n’ (*note -flatten-n::), ‘-table’ (*note - -table::) - - (-table-flat 'list '(1 2 3) '(a b c)) - ⇒ '((1 a) (2 a) (3 a) (1 b) (2 b) (3 b) (1 c) (2 c) (3 c)) - (-table-flat '* '(1 2 3) '(1 2 3)) - ⇒ '(1 2 3 2 4 6 3 6 9) - (apply '-table-flat 'list (-repeat 3 '(1 2))) - ⇒ '((1 1 1) (2 1 1) (1 2 1) (2 2 1) (1 1 2) (2 1 2) (1 2 2) (2 2 2)) - - -- Function: -first (pred list) - Return the first x in LIST where (PRED x) is non-nil, else nil. - - To get the first item in the list no questions asked, use ‘car’. - - Alias: ‘-find’ - - (-first 'even? '(1 2 3)) - ⇒ 2 - (-first 'even? '(1 3 5)) - ⇒ nil - (-first 'null '(1 3 5)) - ⇒ nil - - -- Function: -some (pred list) - Return (PRED x) for the first LIST item where (PRED x) is non-nil, - else nil. - - Alias: ‘-any’ - - (-some 'even? '(1 2 3)) - ⇒ t - (-some 'null '(1 2 3)) - ⇒ nil - (-some 'null '(1 2 nil)) - ⇒ t - - -- Function: -last (pred list) - Return the last x in LIST where (PRED x) is non-nil, else nil. - - (-last 'even? '(1 2 3 4 5 6 3 3 3)) - ⇒ 6 - (-last 'even? '(1 3 7 5 9)) - ⇒ nil - (--last (> (length it) 3) '("a" "looong" "word" "and" "short" "one")) - ⇒ "short" - - -- Function: -first-item (list) - Return the first item of LIST, or nil on an empty list. - - See also: ‘-second-item’ (*note -second-item::), ‘-last-item’ - (*note -last-item::). - - (fn LIST) - - (-first-item '(1 2 3)) - ⇒ 1 - (-first-item nil) - ⇒ nil - (let ((list (list 1 2 3))) (setf (-first-item list) 5) list) - ⇒ '(5 2 3) - - -- Function: -second-item (arg1) - Return the second item of LIST, or nil if LIST is too short. - - See also: ‘-third-item’ (*note -third-item::). - - (fn LIST) - - (-second-item '(1 2 3)) - ⇒ 2 - (-second-item nil) - ⇒ nil - - -- Function: -third-item (arg1) - Return the third item of LIST, or nil if LIST is too short. - - See also: ‘-fourth-item’ (*note -fourth-item::). - - (fn LIST) - - (-third-item '(1 2 3)) - ⇒ 3 - (-third-item nil) - ⇒ nil - - -- Function: -fourth-item (list) - Return the fourth item of LIST, or nil if LIST is too short. - - See also: ‘-fifth-item’ (*note -fifth-item::). - - (-fourth-item '(1 2 3 4)) - ⇒ 4 - (-fourth-item nil) - ⇒ nil - - -- Function: -fifth-item (list) - Return the fifth item of LIST, or nil if LIST is too short. - - See also: ‘-last-item’ (*note -last-item::). - - (-fifth-item '(1 2 3 4 5)) - ⇒ 5 - (-fifth-item nil) - ⇒ nil - - -- Function: -last-item (list) - Return the last item of LIST, or nil on an empty list. - - (-last-item '(1 2 3)) - ⇒ 3 - (-last-item nil) - ⇒ nil - (let ((list (list 1 2 3))) (setf (-last-item list) 5) list) - ⇒ '(1 2 5) - - -- Function: -butlast (list) - Return a list of all items in list except for the last. - - (-butlast '(1 2 3)) - ⇒ '(1 2) - (-butlast '(1 2)) - ⇒ '(1) - (-butlast '(1)) - ⇒ nil - - -- Function: -sort (comparator list) - Sort LIST, stably, comparing elements using COMPARATOR. Return the - sorted list. LIST is NOT modified by side effects. COMPARATOR is - called with two elements of LIST, and should return non-nil if the - first element should sort before the second. - - (-sort '< '(3 1 2)) - ⇒ '(1 2 3) - (-sort '> '(3 1 2)) - ⇒ '(3 2 1) - (--sort (< it other) '(3 1 2)) - ⇒ '(1 2 3) - - -- Function: -list (&rest args) - Return a list with ARGS. - - If first item of ARGS is already a list, simply return ARGS. If - not, return a list with ARGS as elements. - - (-list 1) - ⇒ '(1) - (-list 1 2 3) - ⇒ '(1 2 3) - (-list '(1 2 3)) - ⇒ '(1 2 3) - - -- Function: -fix (fn list) - Compute the (least) fixpoint of FN with initial input LIST. - - FN is called at least once, results are compared with ‘equal’. - - (-fix (lambda (l) (-non-nil (--mapcat (-split-at (/ (length it) 2) it) l))) '((1 2 3 4 5 6))) - ⇒ '((1) (2) (3) (4) (5) (6)) - (let ((data '(("starwars" "scifi") ("jedi" "starwars" "warrior")))) (--fix (-uniq (--mapcat (cons it (cdr (assoc it data))) it)) '("jedi" "book"))) - ⇒ '("jedi" "starwars" "warrior" "scifi" "book") - - -File: dash.info, Node: Tree operations, Next: Threading macros, Prev: Other list operations, Up: Functions - -2.11 Tree operations -==================== - -Functions pretending lists are trees. - - -- Function: -tree-seq (branch children tree) - Return a sequence of the nodes in TREE, in depth-first search - order. - - BRANCH is a predicate of one argument that returns non-nil if the - passed argument is a branch, that is, a node that can have - children. - - CHILDREN is a function of one argument that returns the children of - the passed branch node. - - Non-branch nodes are simply copied. - - (-tree-seq 'listp 'identity '(1 (2 3) 4 (5 (6 7)))) - ⇒ '((1 (2 3) 4 (5 (6 7))) 1 (2 3) 2 3 4 (5 (6 7)) 5 (6 7) 6 7) - (-tree-seq 'listp 'reverse '(1 (2 3) 4 (5 (6 7)))) - ⇒ '((1 (2 3) 4 (5 (6 7))) (5 (6 7)) (6 7) 7 6 5 4 (2 3) 3 2 1) - (--tree-seq (vectorp it) (append it nil) [1 [2 3] 4 [5 [6 7]]]) - ⇒ '([1 [2 3] 4 [5 [6 7]]] 1 [2 3] 2 3 4 [5 [6 7]] 5 [6 7] 6 7) - - -- Function: -tree-map (fn tree) - Apply FN to each element of TREE while preserving the tree - structure. - - (-tree-map '1+ '(1 (2 3) (4 (5 6) 7))) - ⇒ '(2 (3 4) (5 (6 7) 8)) - (-tree-map '(lambda (x) (cons x (expt 2 x))) '(1 (2 3) 4)) - ⇒ '((1 . 2) ((2 . 4) (3 . 8)) (4 . 16)) - (--tree-map (length it) '("" ("

" "text" "

") "")) - ⇒ '(6 (3 4 4) 7) - - -- Function: -tree-map-nodes (pred fun tree) - Call FUN on each node of TREE that satisfies PRED. - - If PRED returns nil, continue descending down this node. If PRED - returns non-nil, apply FUN to this node and do not descend further. - - (-tree-map-nodes 'vectorp (lambda (x) (-sum (append x nil))) '(1 [2 3] 4 (5 [6 7] 8))) - ⇒ '(1 5 4 (5 13 8)) - (-tree-map-nodes 'keywordp (lambda (x) (symbol-name x)) '(1 :foo 4 ((5 6 :bar) :baz 8))) - ⇒ '(1 ":foo" 4 ((5 6 ":bar") ":baz" 8)) - (--tree-map-nodes (eq (car-safe it) 'add-mode) (-concat it (list :mode 'emacs-lisp-mode)) '(with-mode emacs-lisp-mode (foo bar) (add-mode a b) (baz (add-mode c d)))) - ⇒ '(with-mode emacs-lisp-mode (foo bar) (add-mode a b :mode emacs-lisp-mode) (baz (add-mode c d :mode emacs-lisp-mode))) - - -- Function: -tree-reduce (fn tree) - Use FN to reduce elements of list TREE. If elements of TREE are - lists themselves, apply the reduction recursively. - - FN is first applied to first element of the list and second - element, then on this result and third element from the list etc. - - See ‘-reduce-r’ (*note -reduce-r::) for how exactly are lists of - zero or one element handled. - - (-tree-reduce '+ '(1 (2 3) (4 5))) - ⇒ 15 - (-tree-reduce 'concat '("strings" (" on" " various") ((" levels")))) - ⇒ "strings on various levels" - (--tree-reduce (cond ((stringp it) (concat it " " acc)) (t (let ((sn (symbol-name it))) (concat "<" sn ">" acc "")))) '(body (p "some words") (div "more" (b "bold") "words"))) - ⇒ "

some words

more bold words
" - - -- Function: -tree-reduce-from (fn init-value tree) - Use FN to reduce elements of list TREE. If elements of TREE are - lists themselves, apply the reduction recursively. - - FN is first applied to INIT-VALUE and first element of the list, - then on this result and second element from the list etc. - - The initial value is ignored on cons pairs as they always contain - two elements. - - (-tree-reduce-from '+ 1 '(1 (1 1) ((1)))) - ⇒ 8 - (--tree-reduce-from (-concat acc (list it)) nil '(1 (2 3 (4 5)) (6 7))) - ⇒ '((7 6) ((5 4) 3 2) 1) - - -- Function: -tree-mapreduce (fn folder tree) - Apply FN to each element of TREE, and make a list of the results. - If elements of TREE are lists themselves, apply FN recursively to - elements of these nested lists. - - Then reduce the resulting lists using FOLDER and initial value - INIT-VALUE. See ‘-reduce-r-from’ (*note -reduce-r-from::). - - This is the same as calling ‘-tree-reduce’ (*note -tree-reduce::) - after ‘-tree-map’ (*note -tree-map::) but is twice as fast as it - only traverse the structure once. - - (-tree-mapreduce 'list 'append '(1 (2 (3 4) (5 6)) (7 (8 9)))) - ⇒ '(1 2 3 4 5 6 7 8 9) - (--tree-mapreduce 1 (+ it acc) '(1 (2 (4 9) (2 1)) (7 (4 3)))) - ⇒ 9 - (--tree-mapreduce 0 (max acc (1+ it)) '(1 (2 (4 9) (2 1)) (7 (4 3)))) - ⇒ 3 - - -- Function: -tree-mapreduce-from (fn folder init-value tree) - Apply FN to each element of TREE, and make a list of the results. - If elements of TREE are lists themselves, apply FN recursively to - elements of these nested lists. - - Then reduce the resulting lists using FOLDER and initial value - INIT-VALUE. See ‘-reduce-r-from’ (*note -reduce-r-from::). - - This is the same as calling ‘-tree-reduce-from’ (*note - -tree-reduce-from::) after ‘-tree-map’ (*note -tree-map::) but is - twice as fast as it only traverse the structure once. - - (-tree-mapreduce-from 'identity '* 1 '(1 (2 (3 4) (5 6)) (7 (8 9)))) - ⇒ 362880 - (--tree-mapreduce-from (+ it it) (cons it acc) nil '(1 (2 (4 9) (2 1)) (7 (4 3)))) - ⇒ '(2 (4 (8 18) (4 2)) (14 (8 6))) - (concat "{" (--tree-mapreduce-from (cond ((-cons-pair? it) (concat (symbol-name (car it)) " -> " (symbol-name (cdr it)))) (t (concat (symbol-name it) " : {"))) (concat it (unless (or (equal acc "}") (equal (substring it (1- (length it))) "{")) ", ") acc) "}" '((elips-mode (foo (bar . booze)) (baz . qux)) (c-mode (foo . bla) (bum . bam))))) - ⇒ "{elips-mode : {foo : {bar -> booze{, baz -> qux{, c-mode : {foo -> bla, bum -> bam}}" - - -- Function: -clone (list) - Create a deep copy of LIST. The new list has the same elements and - structure but all cons are replaced with new ones. This is useful - when you need to clone a structure such as plist or alist. - - (let* ((a '(1 2 3)) (b (-clone a))) (nreverse a) b) - ⇒ '(1 2 3) - - -File: dash.info, Node: Threading macros, Next: Binding, Prev: Tree operations, Up: Functions - -2.12 Threading macros -===================== - - -- Macro: -> (x &optional form &rest more) - Thread the expr through the forms. Insert X as the second item in - the first form, making a list of it if it is not a list already. - If there are more forms, insert the first form as the second item - in second form, etc. - - (-> '(2 3 5)) - ⇒ '(2 3 5) - (-> '(2 3 5) (append '(8 13))) - ⇒ '(2 3 5 8 13) - (-> '(2 3 5) (append '(8 13)) (-slice 1 -1)) - ⇒ '(3 5 8) - - -- Macro: ->> (x &optional form &rest more) - Thread the expr through the forms. Insert X as the last item in - the first form, making a list of it if it is not a list already. - If there are more forms, insert the first form as the last item in - second form, etc. - - (->> '(1 2 3) (-map 'square)) - ⇒ '(1 4 9) - (->> '(1 2 3) (-map 'square) (-remove 'even?)) - ⇒ '(1 9) - (->> '(1 2 3) (-map 'square) (-reduce '+)) - ⇒ 14 - - -- Macro: --> (x &rest forms) - Starting with the value of X, thread each expression through FORMS. - - Insert X at the position signified by the symbol ‘it’ in the first - form. If there are more forms, insert the first form at the - position signified by ‘it’ in in second form, etc. - - (--> "def" (concat "abc" it "ghi")) - ⇒ "abcdefghi" - (--> "def" (concat "abc" it "ghi") (upcase it)) - ⇒ "ABCDEFGHI" - (--> "def" (concat "abc" it "ghi") upcase) - ⇒ "ABCDEFGHI" - - -- Macro: -as-> (value variable &rest forms) - Starting with VALUE, thread VARIABLE through FORMS. - - In the first form, bind VARIABLE to VALUE. In the second form, - bind VARIABLE to the result of the first form, and so forth. - - (-as-> 3 my-var (1+ my-var) (list my-var) (mapcar (lambda (ele) (* 2 ele)) my-var)) - ⇒ '(8) - (-as-> 3 my-var 1+) - ⇒ 4 - (-as-> 3 my-var) - ⇒ 3 - - -- Macro: -some-> (x &optional form &rest more) - When expr is non-nil, thread it through the first form (via ‘->’ - (*note ->::)), and when that result is non-nil, through the next - form, etc. - - (-some-> '(2 3 5)) - ⇒ '(2 3 5) - (-some-> 5 square) - ⇒ 25 - (-some-> 5 even? square) - ⇒ nil - - -- Macro: -some->> (x &optional form &rest more) - When expr is non-nil, thread it through the first form (via ‘->>’ - (*note ->>::)), and when that result is non-nil, through the next - form, etc. - - (-some->> '(1 2 3) (-map 'square)) - ⇒ '(1 4 9) - (-some->> '(1 3 5) (-last 'even?) (+ 100)) - ⇒ nil - (-some->> '(2 4 6) (-last 'even?) (+ 100)) - ⇒ 106 - - -- Macro: -some--> (x &optional form &rest more) - When expr in non-nil, thread it through the first form (via ‘-->’ - (*note -->::)), and when that result is non-nil, through the next - form, etc. - - (-some--> "def" (concat "abc" it "ghi")) - ⇒ "abcdefghi" - (-some--> nil (concat "abc" it "ghi")) - ⇒ nil - (-some--> '(1 3 5) (-filter 'even? it) (append it it) (-map 'square it)) - ⇒ nil - - -File: dash.info, Node: Binding, Next: Side-effects, Prev: Threading macros, Up: Functions - -2.13 Binding -============ - -Convenient versions of ‘let‘ and ‘let*‘ constructs combined with flow -control. - - -- Macro: -when-let (var-val &rest body) - If VAL evaluates to non-nil, bind it to VAR and execute body. - - Note: binding is done according to ‘-let’ (*note -let::). - - (fn (VAR VAL) &rest BODY) - - (-when-let (match-index (string-match "d" "abcd")) (+ match-index 2)) - ⇒ 5 - (-when-let ((&plist :foo foo) (list :foo "foo")) foo) - ⇒ "foo" - (-when-let ((&plist :foo foo) (list :bar "bar")) foo) - ⇒ nil - - -- Macro: -when-let* (vars-vals &rest body) - If all VALS evaluate to true, bind them to their corresponding VARS - and execute body. VARS-VALS should be a list of (VAR VAL) pairs. - - Note: binding is done according to ‘-let*’ (*note -let*::). VALS - are evaluated sequentially, and evaluation stops after the first - nil VAL is encountered. - - (-when-let* ((x 5) (y 3) (z (+ y 4))) (+ x y z)) - ⇒ 15 - (-when-let* ((x 5) (y nil) (z 7)) (+ x y z)) - ⇒ nil - - -- Macro: -if-let (var-val then &rest else) - If VAL evaluates to non-nil, bind it to VAR and do THEN, otherwise - do ELSE. - - Note: binding is done according to ‘-let’ (*note -let::). - - (fn (VAR VAL) THEN &rest ELSE) - - (-if-let (match-index (string-match "d" "abc")) (+ match-index 3) 7) - ⇒ 7 - (--if-let (even? 4) it nil) - ⇒ t - - -- Macro: -if-let* (vars-vals then &rest else) - If all VALS evaluate to true, bind them to their corresponding VARS - and do THEN, otherwise do ELSE. VARS-VALS should be a list of (VAR - VAL) pairs. - - Note: binding is done according to ‘-let*’ (*note -let*::). VALS - are evaluated sequentially, and evaluation stops after the first - nil VAL is encountered. - - (-if-let* ((x 5) (y 3) (z 7)) (+ x y z) "foo") - ⇒ 15 - (-if-let* ((x 5) (y nil) (z 7)) (+ x y z) "foo") - ⇒ "foo" - (-if-let* (((_ _ x) '(nil nil 7))) x) - ⇒ 7 - - -- Macro: -let (varlist &rest body) - Bind variables according to VARLIST then eval BODY. - - VARLIST is a list of lists of the form (PATTERN SOURCE). Each - PATTERN is matched against the SOURCE "structurally". SOURCE is - only evaluated once for each PATTERN. Each PATTERN is matched - recursively, and can therefore contain sub-patterns which are - matched against corresponding sub-expressions of SOURCE. - - All the SOURCEs are evalled before any symbols are bound (i.e. "in - parallel"). - - If VARLIST only contains one (PATTERN SOURCE) element, you can - optionally specify it using a vector and discarding the outer-most - parens. Thus - - (-let ((PATTERN SOURCE)) ..) - - becomes - - (-let [PATTERN SOURCE] ..). - - ‘-let’ (*note -let::) uses a convention of not binding places - (symbols) starting with _ whenever it’s possible. You can use this - to skip over entries you don’t care about. However, this is not - *always* possible (as a result of implementation) and these symbols - might get bound to undefined values. - - Following is the overview of supported patterns. Remember that - patterns can be matched recursively, so every a, b, aK in the - following can be a matching construct and not necessarily a - symbol/variable. - - Symbol: - - a - bind the SOURCE to A. This is just like regular ‘let’. - - Conses and lists: - - (a) - bind ‘car’ of cons/list to A - - (a . b) - bind car of cons to A and ‘cdr’ to B - - (a b) - bind car of list to A and ‘cadr’ to B - - (a1 a2 a3 ...) - bind 0th car of list to A1, 1st to A2, 2nd to A3 - ... - - (a1 a2 a3 ... aN . rest) - as above, but bind the Nth cdr to - REST. - - Vectors: - - [a] - bind 0th element of a non-list sequence to A (works with - vectors, strings, bit arrays...) - - [a1 a2 a3 ...] - bind 0th element of non-list sequence to A0, 1st - to A1, 2nd to A2, ... If the PATTERN is shorter than SOURCE, the - values at places not in PATTERN are ignored. If the PATTERN is - longer than SOURCE, an ‘error’ is thrown. - - [a1 a2 a3 ... &rest rest] - as above, but bind the rest of the - sequence to REST. This is conceptually the same as improper list - matching (a1 a2 ... aN . rest) - - Key/value stores: - - (&plist key0 a0 ... keyN aN) - bind value mapped by keyK in the - SOURCE plist to aK. If the value is not found, aK is nil. Uses - ‘plist-get’ to fetch values. - - (&alist key0 a0 ... keyN aN) - bind value mapped by keyK in the - SOURCE alist to aK. If the value is not found, aK is nil. Uses - ‘assoc’ to fetch values. - - (&hash key0 a0 ... keyN aN) - bind value mapped by keyK in the - SOURCE hash table to aK. If the value is not found, aK is nil. - Uses ‘gethash’ to fetch values. - - Further, special keyword &keys supports "inline" matching of - plist-like key-value pairs, similarly to &keys keyword of - ‘cl-defun’. - - (a1 a2 ... aN &keys key1 b1 ... keyN bK) - - This binds N values from the list to a1 ... aN, then interprets - the cdr as a plist (see key/value matching above). - - A shorthand notation for kv-destructuring exists which allows the - patterns be optionally left out and derived from the key name in - the following fashion: - - - a key :foo is converted into ‘foo’ pattern, - a key ’bar is - converted into ‘bar’ pattern, - a key "baz" is converted into ‘baz’ - pattern. - - That is, the entire value under the key is bound to the derived - variable without any further destructuring. - - This is possible only when the form following the key is not a - valid pattern (i.e. not a symbol, a cons cell or a vector). - Otherwise the matching proceeds as usual and in case of an invalid - spec fails with an error. - - Thus the patterns are normalized as follows: - - ;; derive all the missing patterns (&plist :foo ’bar "baz") => - (&plist :foo foo ’bar bar "baz" baz) - - ;; we can specify some but not others (&plist :foo ’bar - explicit-bar) => (&plist :foo foo ’bar explicit-bar) - - ;; nothing happens, we store :foo in x (&plist :foo x) => (&plist - :foo x) - - ;; nothing happens, we match recursively (&plist :foo (a b c)) => - (&plist :foo (a b c)) - - You can name the source using the syntax SYMBOL &as PATTERN. This - syntax works with lists (proper or improper), vectors and all types - of maps. - - (list &as a b c) (list 1 2 3) - - binds A to 1, B to 2, C to 3 and LIST to (1 2 3). - - Similarly: - - (bounds &as beg . end) (cons 1 2) - - binds BEG to 1, END to 2 and BOUNDS to (1 . 2). - - (items &as first . rest) (list 1 2 3) - - binds FIRST to 1, REST to (2 3) and ITEMS to (1 2 3) - - [vect &as _ b c] [1 2 3] - - binds B to 2, C to 3 and VECT to [1 2 3] (_ avoids binding as - usual). - - (plist &as &plist :b b) (list :a 1 :b 2 :c 3) - - binds B to 2 and PLIST to (:a 1 :b 2 :c 3). Same for &alist and - &hash. - - This is especially useful when we want to capture the result of a - computation and destructure at the same time. Consider the form - (function-returning-complex-structure) returning a list of two - vectors with two items each. We want to capture this entire result - and pass it to another computation, but at the same time we want to - get the second item from each vector. We can achieve it with - pattern - - (result &as [_ a] [_ b]) (function-returning-complex-structure) - - Note: Clojure programmers may know this feature as the ":as - binding". The difference is that we put the &as at the front - because we need to support improper list binding. - - (-let (([a (b c) d] [1 (2 3) 4])) (list a b c d)) - ⇒ '(1 2 3 4) - (-let [(a b c . d) (list 1 2 3 4 5 6)] (list a b c d)) - ⇒ '(1 2 3 (4 5 6)) - (-let [(&plist :foo foo :bar bar) (list :baz 3 :foo 1 :qux 4 :bar 2)] (list foo bar)) - ⇒ '(1 2) - - -- Macro: -let* (varlist &rest body) - Bind variables according to VARLIST then eval BODY. - - VARLIST is a list of lists of the form (PATTERN SOURCE). Each - PATTERN is matched against the SOURCE structurally. SOURCE is only - evaluated once for each PATTERN. - - Each SOURCE can refer to the symbols already bound by this VARLIST. - This is useful if you want to destructure SOURCE recursively but - also want to name the intermediate structures. - - See ‘-let’ (*note -let::) for the list of all possible patterns. - - (-let* (((a . b) (cons 1 2)) ((c . d) (cons 3 4))) (list a b c d)) - ⇒ '(1 2 3 4) - (-let* (((a . b) (cons 1 (cons 2 3))) ((c . d) b)) (list a b c d)) - ⇒ '(1 (2 . 3) 2 3) - (-let* (((&alist "foo" foo "bar" bar) (list (cons "foo" 1) (cons "bar" (list 'a 'b 'c)))) ((a b c) bar)) (list foo a b c bar)) - ⇒ '(1 a b c (a b c)) - - -- Macro: -lambda (match-form &rest body) - Return a lambda which destructures its input as MATCH-FORM and - executes BODY. - - Note that you have to enclose the MATCH-FORM in a pair of parens, - such that: - - (-lambda (x) body) (-lambda (x y ...) body) - - has the usual semantics of ‘lambda’. Furthermore, these get - translated into normal lambda, so there is no performance penalty. - - See ‘-let’ (*note -let::) for the description of destructuring - mechanism. - - (-map (-lambda ((x y)) (+ x y)) '((1 2) (3 4) (5 6))) - ⇒ '(3 7 11) - (-map (-lambda ([x y]) (+ x y)) '([1 2] [3 4] [5 6])) - ⇒ '(3 7 11) - (funcall (-lambda ((_ . a) (_ . b)) (-concat a b)) '(1 2 3) '(4 5 6)) - ⇒ '(2 3 5 6) - - -- Macro: -setq (&rest forms) - Bind each MATCH-FORM to the value of its VAL. - - MATCH-FORM destructuring is done according to the rules of ‘-let’ - (*note -let::). - - This macro allows you to bind multiple variables by destructuring - the value, so for example: - - (-setq (a b) x (&plist :c c) plist) - - expands roughly speaking to the following code - - (setq a (car x) b (cadr x) c (plist-get plist :c)) - - Care is taken to only evaluate each VAL once so that in case of - multiple assignments it does not cause unexpected side effects. - - (fn [MATCH-FORM VAL]...) - - (progn (-setq a 1) a) - ⇒ 1 - (progn (-setq (a b) (list 1 2)) (list a b)) - ⇒ '(1 2) - (progn (-setq (&plist :c c) (list :c "c")) c) - ⇒ "c" - - -File: dash.info, Node: Side-effects, Next: Destructive operations, Prev: Binding, Up: Functions - -2.14 Side-effects -================= - -Functions iterating over lists for side-effect only. - - -- Function: -each (list fn) - Call FN with every item in LIST. Return nil, used for side-effects - only. - - (let (s) (-each '(1 2 3) (lambda (item) (setq s (cons item s))))) - ⇒ nil - (let (s) (-each '(1 2 3) (lambda (item) (setq s (cons item s)))) s) - ⇒ '(3 2 1) - (let (s) (--each '(1 2 3) (setq s (cons it s))) s) - ⇒ '(3 2 1) - - -- Function: -each-while (list pred fn) - Call FN with every item in LIST while (PRED item) is non-nil. - Return nil, used for side-effects only. - - (let (s) (-each-while '(2 4 5 6) 'even? (lambda (item) (!cons item s))) s) - ⇒ '(4 2) - (let (s) (--each-while '(1 2 3 4) (< it 3) (!cons it s)) s) - ⇒ '(2 1) - - -- Function: -each-indexed (list fn) - Call (FN index item) for each item in LIST. - - In the anaphoric form ‘--each-indexed’, the index is exposed as - symbol ‘it-index’. - - See also: ‘-map-indexed’ (*note -map-indexed::). - - (let (s) (-each-indexed '(a b c) (lambda (index item) (setq s (cons (list item index) s)))) s) - ⇒ '((c 2) (b 1) (a 0)) - (let (s) (--each-indexed '(a b c) (setq s (cons (list it it-index) s))) s) - ⇒ '((c 2) (b 1) (a 0)) - - -- Function: -each-r (list fn) - Call FN with every item in LIST in reversed order. Return nil, - used for side-effects only. - - (let (s) (-each-r '(1 2 3) (lambda (item) (setq s (cons item s))))) - ⇒ nil - (let (s) (-each-r '(1 2 3) (lambda (item) (setq s (cons item s)))) s) - ⇒ '(1 2 3) - (let (s) (--each-r '(1 2 3) (setq s (cons it s))) s) - ⇒ '(1 2 3) - - -- Function: -each-r-while (list pred fn) - Call FN with every item in reversed LIST while (PRED item) is - non-nil. Return nil, used for side-effects only. - - (let (s) (-each-r-while '(2 4 5 6) 'even? (lambda (item) (!cons item s))) s) - ⇒ '(6) - (let (s) (--each-r-while '(1 2 3 4) (>= it 3) (!cons it s)) s) - ⇒ '(3 4) - - -- Function: -dotimes (num fn) - Repeatedly calls FN (presumably for side-effects) passing in - integers from 0 through NUM-1. - - (let (s) (-dotimes 3 (lambda (n) (!cons n s))) s) - ⇒ '(2 1 0) - (let (s) (--dotimes 5 (!cons it s)) s) - ⇒ '(4 3 2 1 0) - - -- Macro: -doto (eval-initial-value &rest forms) - Eval a form, then insert that form as the 2nd argument to other - forms. The EVAL-INITIAL-VALUE form is evaluated once. Its result - is passed to FORMS, which are then evaluated sequentially. Returns - the target form. - - (-doto '(1 2 3) (!cdr) (!cdr)) - ⇒ '(3) - (-doto '(1 . 2) (setcar 3) (setcdr 4)) - ⇒ '(3 . 4) - - -- Macro: --doto (eval-initial-value &rest forms) - Anaphoric form of ‘-doto’ (*note -doto::). Note: ‘it’ is not - required in each form. - - (gethash "key" (--doto (make-hash-table :test 'equal) (puthash "key" "value" it))) - ⇒ "value" - - -File: dash.info, Node: Destructive operations, Next: Function combinators, Prev: Side-effects, Up: Functions - -2.15 Destructive operations -=========================== - - -- Macro: !cons (car cdr) - Destructive: Set CDR to the cons of CAR and CDR. - - (let (l) (!cons 5 l) l) - ⇒ '(5) - (let ((l '(3))) (!cons 5 l) l) - ⇒ '(5 3) - - -- Macro: !cdr (list) - Destructive: Set LIST to the cdr of LIST. - - (let ((l '(3))) (!cdr l) l) - ⇒ '() - (let ((l '(3 5))) (!cdr l) l) - ⇒ '(5) - - -File: dash.info, Node: Function combinators, Prev: Destructive operations, Up: Functions - -2.16 Function combinators -========================= - -These combinators require Emacs 24 for its lexical scope. So they are -offered in a separate package: ‘dash-functional‘. - - -- Function: -partial (fn &rest args) - Takes a function FN and fewer than the normal arguments to FN, and - returns a fn that takes a variable number of additional ARGS. When - called, the returned function calls FN with ARGS first and then - additional args. - - (funcall (-partial '- 5) 3) - ⇒ 2 - (funcall (-partial '+ 5 2) 3) - ⇒ 10 - - -- Function: -rpartial (fn &rest args) - Takes a function FN and fewer than the normal arguments to FN, and - returns a fn that takes a variable number of additional ARGS. When - called, the returned function calls FN with the additional args - first and then ARGS. - - (funcall (-rpartial '- 5) 8) - ⇒ 3 - (funcall (-rpartial '- 5 2) 10) - ⇒ 3 - - -- Function: -juxt (&rest fns) - Takes a list of functions and returns a fn that is the - juxtaposition of those fns. The returned fn takes a variable - number of args, and returns a list containing the result of - applying each fn to the args (left-to-right). - - (funcall (-juxt '+ '-) 3 5) - ⇒ '(8 -2) - (-map (-juxt 'identity 'square) '(1 2 3)) - ⇒ '((1 1) (2 4) (3 9)) - - -- Function: -compose (&rest fns) - Takes a list of functions and returns a fn that is the composition - of those fns. The returned fn takes a variable number of - arguments, and returns the result of applying each fn to the result - of applying the previous fn to the arguments (right-to-left). - - (funcall (-compose 'square '+) 2 3) - ⇒ (square (+ 2 3)) - (funcall (-compose 'identity 'square) 3) - ⇒ (square 3) - (funcall (-compose 'square 'identity) 3) - ⇒ (square 3) - - -- Function: -applify (fn) - Changes an n-arity function FN to a 1-arity function that expects a - list with n items as arguments - - (-map (-applify '+) '((1 1 1) (1 2 3) (5 5 5))) - ⇒ '(3 6 15) - (-map (-applify (lambda (a b c) `(,a (,b (,c))))) '((1 1 1) (1 2 3) (5 5 5))) - ⇒ '((1 (1 (1))) (1 (2 (3))) (5 (5 (5)))) - (funcall (-applify '<) '(3 6)) - ⇒ t - - -- Function: -on (operator transformer) - Return a function of two arguments that first applies TRANSFORMER - to each of them and then applies OPERATOR on the results (in the - same order). - - In types: (b -> b -> c) -> (a -> b) -> a -> a -> c - - (-sort (-on '< 'length) '((1 2 3) (1) (1 2))) - ⇒ '((1) (1 2) (1 2 3)) - (-min-by (-on '> 'length) '((1 2 3) (4) (1 2))) - ⇒ '(4) - (-min-by (-on 'string-lessp 'number-to-string) '(2 100 22)) - ⇒ 22 - - -- Function: -flip (func) - Swap the order of arguments for binary function FUNC. - - In types: (a -> b -> c) -> b -> a -> c - - (funcall (-flip '<) 2 1) - ⇒ t - (funcall (-flip '-) 3 8) - ⇒ 5 - (-sort (-flip '<) '(4 3 6 1)) - ⇒ '(6 4 3 1) - - -- Function: -const (c) - Return a function that returns C ignoring any additional arguments. - - In types: a -> b -> a - - (funcall (-const 2) 1 3 "foo") - ⇒ 2 - (-map (-const 1) '("a" "b" "c" "d")) - ⇒ '(1 1 1 1) - (-sum (-map (-const 1) '("a" "b" "c" "d"))) - ⇒ 4 - - -- Macro: -cut (&rest params) - Take n-ary function and n arguments and specialize some of them. - Arguments denoted by <> will be left unspecialized. - - See SRFI-26 for detailed description. - - (funcall (-cut list 1 <> 3 <> 5) 2 4) - ⇒ '(1 2 3 4 5) - (-map (-cut funcall <> 5) '(1+ 1- (lambda (x) (/ 1.0 x)))) - ⇒ '(6 4 0.2) - (-map (-cut <> 1 2 3) (list 'list 'vector 'string)) - ⇒ '((1 2 3) [1 2 3] "") - - -- Function: -not (pred) - Take a unary predicate PRED and return a unary predicate that - returns t if PRED returns nil and nil if PRED returns non-nil. - - (funcall (-not 'even?) 5) - ⇒ t - (-filter (-not (-partial '< 4)) '(1 2 3 4 5 6 7 8)) - ⇒ '(1 2 3 4) - - -- Function: -orfn (&rest preds) - Take list of unary predicates PREDS and return a unary predicate - with argument x that returns non-nil if at least one of the PREDS - returns non-nil on x. - - In types: [a -> Bool] -> a -> Bool - - (-filter (-orfn 'even? (-partial (-flip '<) 5)) '(1 2 3 4 5 6 7 8 9 10)) - ⇒ '(1 2 3 4 6 8 10) - (funcall (-orfn 'stringp 'even?) "foo") - ⇒ t - - -- Function: -andfn (&rest preds) - Take list of unary predicates PREDS and return a unary predicate - with argument x that returns non-nil if all of the PREDS returns - non-nil on x. - - In types: [a -> Bool] -> a -> Bool - - (funcall (-andfn (-cut < <> 10) 'even?) 6) - ⇒ t - (funcall (-andfn (-cut < <> 10) 'even?) 12) - ⇒ nil - (-filter (-andfn (-not 'even?) (-cut >= 5 <>)) '(1 2 3 4 5 6 7 8 9 10)) - ⇒ '(1 3 5) - - -- Function: -iteratefn (fn n) - Return a function FN composed N times with itself. - - FN is a unary function. If you need to use a function of higher - arity, use ‘-applify’ (*note -applify::) first to turn it into a - unary function. - - With n = 0, this acts as identity function. - - In types: (a -> a) -> Int -> a -> a. - - This function satisfies the following law: - - (funcall (-iteratefn fn n) init) = (-last-item (-iterate fn init - (1+ n))). - - (funcall (-iteratefn (lambda (x) (* x x)) 3) 2) - ⇒ 256 - (funcall (-iteratefn '1+ 3) 1) - ⇒ 4 - (funcall (-iteratefn 'cdr 3) '(1 2 3 4 5)) - ⇒ '(4 5) - - -- Function: -fixfn (fn &optional equal-test halt-test) - Return a function that computes the (least) fixpoint of FN. - - FN must be a unary function. The returned lambda takes a single - argument, X, the initial value for the fixpoint iteration. The - iteration halts when either of the following conditions is - satisfied: - - 1. Iteration converges to the fixpoint, with equality being tested - using EQUAL-TEST. If EQUAL-TEST is not specified, ‘equal’ is used. - For functions over the floating point numbers, it may be necessary - to provide an appropriate appoximate comparison test. - - 2. HALT-TEST returns a non-nil value. HALT-TEST defaults to a - simple counter that returns t after ‘-fixfn-max-iterations’, to - guard against infinite iteration. Otherwise, HALT-TEST must be a - function that accepts a single argument, the current value of X, - and returns non-nil as long as iteration should continue. In this - way, a more sophisticated convergence test may be supplied by the - caller. - - The return value of the lambda is either the fixpoint or, if - iteration halted before converging, a cons with car ‘halted’ and - cdr the final output from HALT-TEST. - - In types: (a -> a) -> a -> a. - - (funcall (-fixfn 'cos 'approx-equal) 0.7) - ⇒ 0.7390851332151607 - (funcall (-fixfn (lambda (x) (expt (+ x 10) 0.25))) 2.0) - ⇒ 1.8555845286409378 - (funcall (-fixfn 'sin 'approx-equal) 0.1) - ⇒ '(halted . t) - - -- Function: -prodfn (&rest fns) - Take a list of n functions and return a function that takes a list - of length n, applying i-th function to i-th element of the input - list. Returns a list of length n. - - In types (for n=2): ((a -> b), (c -> d)) -> (a, c) -> (b, d) - - This function satisfies the following laws: - - (-compose (-prodfn f g ...) (-prodfn f’ g’ ...)) = (-prodfn - (-compose f f’) (-compose g g’) ...) (-prodfn f g ...) = (-juxt - (-compose f (-partial ’nth 0)) (-compose g (-partial ’nth 1)) ...) - (-compose (-prodfn f g ...) (-juxt f’ g’ ...)) = (-juxt (-compose - f f’) (-compose g g’) ...) (-compose (-partial ’nth n) (-prod f1 - f2 ...)) = (-compose fn (-partial ’nth n)) - - (funcall (-prodfn '1+ '1- 'number-to-string) '(1 2 3)) - ⇒ '(2 1 "3") - (-map (-prodfn '1+ '1-) '((1 2) (3 4) (5 6) (7 8))) - ⇒ '((2 1) (4 3) (6 5) (8 7)) - (apply '+ (funcall (-prodfn 'length 'string-to-number) '((1 2 3) "15"))) - ⇒ 18 - - -File: dash.info, Node: Development, Next: Index, Prev: Functions, Up: Top - -3 Development -************* - -The dash repository is hosted on GitHub: - - -* Menu: - -* Contribute:: How to contribute -* Changes:: List of significant changes by version -* Contributors:: List of contributors - - -File: dash.info, Node: Contribute, Next: Changes, Up: Development - -3.1 Contribute -============== - -Yes, please do. Pure functions in the list manipulation realm only, -please. There’s a suite of tests in dev/examples.el, so remember to add -tests for your function, or it might get broken later. - - Run the tests with ‘./run-tests.sh’. Create the docs with -‘./create-docs.sh’. I highly recommend that you install these as a -pre-commit hook, so that the tests are always running and the docs are -always in sync: - -cp pre-commit.sh .git/hooks/pre-commit - - Oh, and don’t edit ‘README.md’ directly, it is auto-generated. -Change ‘readme-template.md’ or ‘examples-to-docs.el’ instead. The same -goes for the info manual. - - -File: dash.info, Node: Changes, Next: Contributors, Prev: Contribute, Up: Development - -3.2 Changes -=========== - -Changes in 2.10: - - • Add ‘-let’ destructuring to ‘-if-let’ and ‘-when-let’ (Fredrik - Bergroth) - -Changes in 2.9: - - • Add ‘-let’, ‘-let*’ and ‘-lambda’ with destructuring - • Add ‘-tree-seq’ and ‘-tree-map-nodes’ - • Add ‘-non-nil’ - • Add ‘-fix’ - • Add ‘-fixfn’ (dash-functional 1.2) - • Add ‘-copy’ (Wilfred Hughes) - -Changes in 2.8: - - • Add ‘-butlast’ - -Changes in 2.7: - - • ‘-zip’ now supports more than two lists (Steve Lamb) - • Add ‘-cycle’, ‘-pad’, ‘-annotate’, ‘-zip-fill’ (Steve Lamb) - • Add ‘-table’, ‘-table-flat’ (finite cartesian product) - • Add ‘-flatten-n’ - • ‘-slice’ now supports "step" argument - • Add functional combinators ‘-iteratefn’, ‘-prodfn’ - • Add ‘-replace’, ‘-splice’, ‘-splice-list’ which generalize - ‘-replace-at’ and ‘-insert-at’ - • Add ‘-compose’, ‘-iteratefn’ and ‘-prodfn’ (dash-functional 1.1) - -Changes in 2.6: - - • Add ‘-is-prefix-p’, ‘-is-suffix-p’, ‘-is-infix-p’ (Matus Goljer) - • Add ‘-iterate’, ‘-unfold’ (Matus Goljer) - • Add ‘-split-on’, ‘-split-when’ (Matus Goljer) - • Add ‘-find-last-index’ (Matus Goljer) - • Add ‘-list’ (Johan Andersson) - -Changes in 2.5: - - • Add ‘-same-items?’ (Johan Andersson) - • A few bugfixes - -Changes in 2.4: - - • Add ‘-snoc’ (Matus Goljer) - • Add ‘-replace-at’, ‘-update-at’, ‘-remove-at’, and - ‘-remove-at-indices’ (Matus Goljer) - -Changes in 2.3: - - • Add tree operations (Matus Goljer) - • Make font-lock optional - -Changes in 2.2: - - • Add ‘-compose’ (Christina Whyte) - -Changes in 2.1: - - • Add indexing operations (Matus Goljer) - -Changes in 2.0: - - • Split out ‘dash-functional.el’ (Matus Goljer) - • Add ‘-andfn’, ‘-orfn’, ‘-not’, ‘-cut’, ‘-const’, ‘-flip’ and ‘-on’. - (Matus Goljer) - • Fix ‘-min’, ‘-max’, ‘-min-by’ and ‘-max-by’ (Matus Goljer) - -Changes in 1.8: - - • Add ‘-first-item’ and ‘-last-item’ (Wilfred Hughes) - -Changes in 1.7: - - • Add ‘-rotate’ (Matus Goljer) - -Changes in 1.6: - - • Add ‘-min’, ‘-max’, ‘-min-by’ and ‘-max-by’ (Johan Andersson) - -Changes in 1.5: - - • Add ‘-sum’ and ‘-product’ (Johan Andersson) - -Changes in 1.4: - - • Add ‘-sort’ - • Add ‘-reduce-r’ (Matus Goljer) - • Add ‘-reduce-r-from’ (Matus Goljer) - -Changes in 1.3: - - • Add ‘-partition-in-steps’ - • Add ‘-partition-all-in-steps’ - -Changes in 1.2: - - • Add ‘-last’ (Matus Goljer) - • Add ‘-insert-at’ (Emanuel Evans) - • Add ‘-when-let’ and ‘-if-let’ (Emanuel Evans) - • Add ‘-when-let*’ and ‘-if-let*’ (Emanuel Evans) - • Some bugfixes - - -File: dash.info, Node: Contributors, Prev: Changes, Up: Development - -3.3 Contributors -================ - - • Matus Goljer (https://github.com/Fuco1) contributed lots of - features and functions. - • Takafumi Arakaki (https://github.com/tkf) contributed ‘-group-by’. - • tali713 (https://github.com/tali713) is the author of ‘-applify’. - • Víctor M. Valenzuela (https://github.com/vemv) contributed - ‘-repeat’. - • Nic Ferrier (https://github.com/nicferrier) contributed ‘-cons*’. - • Wilfred Hughes (https://github.com/Wilfred) contributed ‘-slice’, - ‘-first-item’ and ‘-last-item’. - • Emanuel Evans (https://github.com/shosti) contributed ‘-if-let’, - ‘-when-let’ and ‘-insert-at’. - • Johan Andersson (https://github.com/rejeep) contributed ‘-sum’, - ‘-product’ and ‘-same-items?’ - • Christina Whyte (https://github.com/kurisuwhyte) contributed - ‘-compose’ - • Steve Lamb (https://github.com/steventlamb) contributed ‘-cycle’, - ‘-pad’, ‘-annotate’, ‘-zip-fill’ and an n-ary version of ‘-zip’. - • Fredrik Bergroth (https://github.com/fbergroth) made the ‘-if-let’ - family use ‘-let’ destructuring and improved script for generating - documentation. - • Mark Oteiza (https://github.com/holomorph) contributed the script - to create an info manual. - • Vasilij Schneidermann (https://github.com/wasamasa) contributed - ‘-some’. - • William West (https://github.com/occidens) made ‘-fixfn’ more - robust at handling floats. - - Thanks! - - -File: dash.info, Node: Index, Prev: Development, Up: Top - -Index -***** - -[index] -* Menu: - -* !cdr: Destructive operations. - (line 14) -* !cons: Destructive operations. - (line 6) -* -->: Threading macros. (line 32) -* --doto: Side-effects. (line 81) -* ->: Threading macros. (line 6) -* ->>: Threading macros. (line 19) -* -all?: Predicates. (line 18) -* -andfn: Function combinators. - (line 138) -* -annotate: Maps. (line 79) -* -any?: Predicates. (line 6) -* -applify: Function combinators. - (line 55) -* -as->: Threading macros. (line 46) -* -butlast: Other list operations. - (line 340) -* -clone: Tree operations. (line 122) -* -common-prefix: Reductions. (line 223) -* -common-suffix: Reductions. (line 233) -* -compose: Function combinators. - (line 42) -* -concat: List to list. (line 22) -* -cons*: Other list operations. - (line 30) -* -const: Function combinators. - (line 92) -* -contains?: Predicates. (line 57) -* -copy: Maps. (line 134) -* -count: Reductions. (line 151) -* -cut: Function combinators. - (line 104) -* -cycle: Other list operations. - (line 168) -* -difference: Set operations. (line 20) -* -distinct: Set operations. (line 62) -* -dotimes: Side-effects. (line 61) -* -doto: Side-effects. (line 70) -* -drop: Sublist selection. (line 124) -* -drop-last: Sublist selection. (line 136) -* -drop-while: Sublist selection. (line 157) -* -each: Side-effects. (line 8) -* -each-indexed: Side-effects. (line 28) -* -each-r: Side-effects. (line 41) -* -each-r-while: Side-effects. (line 52) -* -each-while: Side-effects. (line 19) -* -elem-index: Indexing. (line 9) -* -elem-indices: Indexing. (line 21) -* -fifth-item: Other list operations. - (line 320) -* -filter: Sublist selection. (line 8) -* -find-index: Indexing. (line 32) -* -find-indices: Indexing. (line 60) -* -find-last-index: Indexing. (line 46) -* -first: Other list operations. - (line 234) -* -first-item: Other list operations. - (line 271) -* -fix: Other list operations. - (line 376) -* -fixfn: Function combinators. - (line 175) -* -flatten: List to list. (line 33) -* -flatten-n: List to list. (line 55) -* -flip: Function combinators. - (line 80) -* -fourth-item: Other list operations. - (line 310) -* -grade-down: Indexing. (line 81) -* -grade-up: Indexing. (line 71) -* -group-by: Partitioning. (line 187) -* -if-let: Binding. (line 36) -* -if-let*: Binding. (line 49) -* -inits: Reductions. (line 203) -* -insert-at: List to list. (line 109) -* -interleave: Other list operations. - (line 68) -* -interpose: Other list operations. - (line 58) -* -intersection: Set operations. (line 32) -* -is-infix?: Predicates. (line 110) -* -is-prefix?: Predicates. (line 86) -* -is-suffix?: Predicates. (line 98) -* -iterate: Unfolding. (line 9) -* -iteratefn: Function combinators. - (line 152) -* -juxt: Function combinators. - (line 31) -* -keep: List to list. (line 8) -* -lambda: Binding. (line 252) -* -last: Other list operations. - (line 261) -* -last-item: Other list operations. - (line 330) -* -let: Binding. (line 65) -* -let*: Binding. (line 232) -* -list: Other list operations. - (line 363) -* -map: Maps. (line 10) -* -map-first: Maps. (line 37) -* -map-indexed: Maps. (line 65) -* -map-last: Maps. (line 51) -* -map-when: Maps. (line 21) -* -mapcat: Maps. (line 123) -* -max: Reductions. (line 267) -* -max-by: Reductions. (line 277) -* -min: Reductions. (line 243) -* -min-by: Reductions. (line 253) -* -non-nil: Sublist selection. (line 79) -* -none?: Predicates. (line 30) -* -not: Function combinators. - (line 117) -* -on: Function combinators. - (line 66) -* -only-some?: Predicates. (line 42) -* -orfn: Function combinators. - (line 126) -* -pad: Other list operations. - (line 179) -* -partial: Function combinators. - (line 9) -* -partition: Partitioning. (line 74) -* -partition-after-item: Partitioning. (line 177) -* -partition-after-pred: Partitioning. (line 145) -* -partition-all: Partitioning. (line 86) -* -partition-all-in-steps: Partitioning. (line 109) -* -partition-before-item: Partitioning. (line 167) -* -partition-before-pred: Partitioning. (line 156) -* -partition-by: Partitioning. (line 121) -* -partition-by-header: Partitioning. (line 132) -* -partition-in-steps: Partitioning. (line 97) -* -permutations: Set operations. (line 52) -* -powerset: Set operations. (line 44) -* -prodfn: Function combinators. - (line 209) -* -product: Reductions. (line 181) -* -reduce: Reductions. (line 46) -* -reduce-from: Reductions. (line 8) -* -reduce-r: Reductions. (line 65) -* -reduce-r-from: Reductions. (line 27) -* -reductions: Reductions. (line 119) -* -reductions-from: Reductions. (line 87) -* -reductions-r: Reductions. (line 135) -* -reductions-r-from: Reductions. (line 103) -* -remove: Sublist selection. (line 23) -* -remove-at: List to list. (line 145) -* -remove-at-indices: List to list. (line 158) -* -remove-first: Sublist selection. (line 37) -* -remove-item: Sublist selection. (line 67) -* -remove-last: Sublist selection. (line 52) -* -repeat: Other list operations. - (line 19) -* -replace: List to list. (line 67) -* -replace-at: List to list. (line 120) -* -replace-first: List to list. (line 81) -* -replace-last: List to list. (line 95) -* -rotate: Other list operations. - (line 8) -* -rpartial: Function combinators. - (line 20) -* -running-product: Reductions. (line 191) -* -running-sum: Reductions. (line 169) -* -same-items?: Predicates. (line 72) -* -second-item: Other list operations. - (line 286) -* -select-by-indices: Sublist selection. (line 168) -* -select-column: Sublist selection. (line 198) -* -select-columns: Sublist selection. (line 179) -* -separate: Partitioning. (line 63) -* -setq: Binding. (line 274) -* -slice: Sublist selection. (line 85) -* -snoc: Other list operations. - (line 44) -* -some: Other list operations. - (line 248) -* -some-->: Threading macros. (line 83) -* -some->: Threading macros. (line 59) -* -some->>: Threading macros. (line 71) -* -sort: Other list operations. - (line 350) -* -splice: Maps. (line 90) -* -splice-list: Maps. (line 110) -* -split-at: Partitioning. (line 8) -* -split-on: Partitioning. (line 28) -* -split-when: Partitioning. (line 46) -* -split-with: Partitioning. (line 17) -* -sum: Reductions. (line 159) -* -table: Other list operations. - (line 190) -* -table-flat: Other list operations. - (line 209) -* -tails: Reductions. (line 213) -* -take: Sublist selection. (line 101) -* -take-last: Sublist selection. (line 112) -* -take-while: Sublist selection. (line 146) -* -third-item: Other list operations. - (line 298) -* -tree-map: Tree operations. (line 28) -* -tree-map-nodes: Tree operations. (line 39) -* -tree-mapreduce: Tree operations. (line 84) -* -tree-mapreduce-from: Tree operations. (line 103) -* -tree-reduce: Tree operations. (line 52) -* -tree-reduce-from: Tree operations. (line 69) -* -tree-seq: Tree operations. (line 8) -* -unfold: Unfolding. (line 25) -* -union: Set operations. (line 8) -* -unzip: Other list operations. - (line 146) -* -update-at: List to list. (line 132) -* -when-let: Binding. (line 9) -* -when-let*: Binding. (line 23) -* -zip: Other list operations. - (line 95) -* -zip-fill: Other list operations. - (line 138) -* -zip-lists: Other list operations. - (line 119) -* -zip-with: Other list operations. - (line 79) - - - -Tag Table: -Node: Top946 -Node: Installation2425 -Node: Using in a package2958 -Node: Syntax highlighting of dash functions3322 -Node: Functions3705 -Node: Maps4916 -Ref: -map5211 -Ref: -map-when5552 -Ref: -map-first6130 -Ref: -map-last6608 -Ref: -map-indexed7081 -Ref: -annotate7561 -Ref: -splice8051 -Ref: -splice-list8832 -Ref: -mapcat9294 -Ref: -copy9670 -Node: Sublist selection9874 -Ref: -filter10067 -Ref: -remove10519 -Ref: -remove-first10925 -Ref: -remove-last11452 -Ref: -remove-item11973 -Ref: -non-nil12368 -Ref: -slice12527 -Ref: -take13059 -Ref: -take-last13367 -Ref: -drop13690 -Ref: -drop-last13963 -Ref: -take-while14223 -Ref: -drop-while14573 -Ref: -select-by-indices14929 -Ref: -select-columns15443 -Ref: -select-column16149 -Node: List to list16613 -Ref: -keep16805 -Ref: -concat17308 -Ref: -flatten17605 -Ref: -flatten-n18364 -Ref: -replace18751 -Ref: -replace-first19214 -Ref: -replace-last19711 -Ref: -insert-at20201 -Ref: -replace-at20528 -Ref: -update-at20918 -Ref: -remove-at21409 -Ref: -remove-at-indices21897 -Node: Reductions22479 -Ref: -reduce-from22648 -Ref: -reduce-r-from23414 -Ref: -reduce24181 -Ref: -reduce-r24910 -Ref: -reductions-from25781 -Ref: -reductions-r-from26496 -Ref: -reductions27221 -Ref: -reductions-r27846 -Ref: -count28481 -Ref: -sum28705 -Ref: -running-sum28894 -Ref: -product29187 -Ref: -running-product29396 -Ref: -inits29709 -Ref: -tails29957 -Ref: -common-prefix30204 -Ref: -common-suffix30501 -Ref: -min30798 -Ref: -min-by31024 -Ref: -max31547 -Ref: -max-by31772 -Node: Unfolding32300 -Ref: -iterate32539 -Ref: -unfold32984 -Node: Predicates33792 -Ref: -any?33916 -Ref: -all?34236 -Ref: -none?34566 -Ref: -only-some?34868 -Ref: -contains?35353 -Ref: -same-items?35742 -Ref: -is-prefix?36127 -Ref: -is-suffix?36450 -Ref: -is-infix?36773 -Node: Partitioning37127 -Ref: -split-at37315 -Ref: -split-with37600 -Ref: -split-on38003 -Ref: -split-when38679 -Ref: -separate39319 -Ref: -partition39761 -Ref: -partition-all40213 -Ref: -partition-in-steps40641 -Ref: -partition-all-in-steps41138 -Ref: -partition-by41623 -Ref: -partition-by-header42005 -Ref: -partition-after-pred42609 -Ref: -partition-before-pred42953 -Ref: -partition-before-item43304 -Ref: -partition-after-item43615 -Ref: -group-by43921 -Node: Indexing44358 -Ref: -elem-index44560 -Ref: -elem-indices44955 -Ref: -find-index45338 -Ref: -find-last-index45827 -Ref: -find-indices46331 -Ref: -grade-up46739 -Ref: -grade-down47142 -Node: Set operations47552 -Ref: -union47735 -Ref: -difference48177 -Ref: -intersection48594 -Ref: -powerset49031 -Ref: -permutations49244 -Ref: -distinct49544 -Node: Other list operations49922 -Ref: -rotate50147 -Ref: -repeat50517 -Ref: -cons*50780 -Ref: -snoc51167 -Ref: -interpose51580 -Ref: -interleave51878 -Ref: -zip-with52247 -Ref: -zip52964 -Ref: -zip-lists53796 -Ref: -zip-fill54497 -Ref: -unzip54820 -Ref: -cycle55565 -Ref: -pad55938 -Ref: -table56261 -Ref: -table-flat57050 -Ref: -first58058 -Ref: -some58430 -Ref: -last58739 -Ref: -first-item59073 -Ref: -second-item59489 -Ref: -third-item59769 -Ref: -fourth-item60047 -Ref: -fifth-item60313 -Ref: -last-item60575 -Ref: -butlast60867 -Ref: -sort61114 -Ref: -list61603 -Ref: -fix61934 -Node: Tree operations62474 -Ref: -tree-seq62670 -Ref: -tree-map63528 -Ref: -tree-map-nodes63971 -Ref: -tree-reduce64821 -Ref: -tree-reduce-from65703 -Ref: -tree-mapreduce66304 -Ref: -tree-mapreduce-from67164 -Ref: -clone68450 -Node: Threading macros68778 -Ref: ->68923 -Ref: ->>69414 -Ref: -->69919 -Ref: -as->70475 -Ref: -some->70930 -Ref: -some->>71304 -Ref: -some-->71740 -Node: Binding72211 -Ref: -when-let72423 -Ref: -when-let*72908 -Ref: -if-let73431 -Ref: -if-let*73826 -Ref: -let74443 -Ref: -let*80533 -Ref: -lambda81473 -Ref: -setq82270 -Node: Side-effects83086 -Ref: -each83280 -Ref: -each-while83687 -Ref: -each-indexed84047 -Ref: -each-r84565 -Ref: -each-r-while84998 -Ref: -dotimes85373 -Ref: -doto85676 -Ref: --doto86104 -Node: Destructive operations86379 -Ref: !cons86552 -Ref: !cdr86758 -Node: Function combinators86953 -Ref: -partial87227 -Ref: -rpartial87623 -Ref: -juxt88026 -Ref: -compose88458 -Ref: -applify89011 -Ref: -on89442 -Ref: -flip89968 -Ref: -const90280 -Ref: -cut90619 -Ref: -not91105 -Ref: -orfn91415 -Ref: -andfn91849 -Ref: -iteratefn92344 -Ref: -fixfn93047 -Ref: -prodfn94609 -Node: Development95677 -Node: Contribute96026 -Node: Changes96774 -Node: Contributors99772 -Node: Index101391 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: diff --git a/elpa/dash-20200119.2310/dir b/elpa/dash-20200119.2310/dir deleted file mode 100644 index 49b1700d..00000000 --- a/elpa/dash-20200119.2310/dir +++ /dev/null @@ -1,18 +0,0 @@ -This is the file .../info/dir, which contains the -topmost node of the Info hierarchy, called (dir)Top. -The first time you invoke Info you start off looking at this node. - -File: dir, Node: Top This is the top of the INFO tree - - This (the Directory node) gives a menu of major topics. - Typing "q" exits, "H" lists all Info commands, "d" returns here, - "h" gives a primer for first-timers, - "mEmacs" visits the Emacs manual, etc. - - In Emacs, you can click mouse button 2 on a menu item or cross reference - to select it. - -* Menu: - -Emacs -* Dash: (dash.info). A modern list library for GNU Emacs diff --git a/elpa/dash-functional-20191109.1327/dash-functional-autoloads.el b/elpa/dash-functional-20191109.1327/dash-functional-autoloads.el deleted file mode 100644 index 20a86e88..00000000 --- a/elpa/dash-functional-20191109.1327/dash-functional-autoloads.el +++ /dev/null @@ -1,23 +0,0 @@ -;;; dash-functional-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dash-functional" "dash-functional.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from dash-functional.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dash-functional" '("-rpartial" "-juxt" "-not" "-o" "-a" "-iteratefn" "-c" "-f" "-p"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dash-functional-autoloads.el ends here diff --git a/elpa/dash-functional-20191109.1327/dash-functional-pkg.el b/elpa/dash-functional-20191109.1327/dash-functional-pkg.el deleted file mode 100644 index f3c8396f..00000000 --- a/elpa/dash-functional-20191109.1327/dash-functional-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "dash-functional" "20191109.1327" "Collection of useful combinators for Emacs Lisp" '((dash "2.0.0") (emacs "24")) :commit "e85ed7aa93ef0959b630607bca17af90c74b34be" :keywords '("lisp" "functions" "combinators")) diff --git a/elpa/dash-functional-20191109.1327/dash-functional.el b/elpa/dash-functional-20191109.1327/dash-functional.el deleted file mode 100644 index 53c54d51..00000000 --- a/elpa/dash-functional-20191109.1327/dash-functional.el +++ /dev/null @@ -1,219 +0,0 @@ -;;; dash-functional.el --- Collection of useful combinators for Emacs Lisp -*- lexical-binding: t -*- - -;; Copyright (C) 2013-2014 Free Software Foundation, Inc. - -;; Authors: Matus Goljer -;; Magnar Sveen -;; Version: 1.2.0 -;; Package-Version: 20191109.1327 -;; Package-Requires: ((dash "2.0.0") (emacs "24")) -;; Keywords: lisp functions combinators - -;; 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 . - -;;; Commentary: - -;; Collection of useful combinators for Emacs Lisp -;; -;; See documentation on https://github.com/magnars/dash.el#functions - -;;; Code: - -(require 'dash) - -(defun -partial (fn &rest args) - "Takes a function FN and fewer than the normal arguments to FN, -and returns a fn that takes a variable number of additional ARGS. -When called, the returned function calls FN with ARGS first and -then additional args." - (apply 'apply-partially fn args)) - -(defun -rpartial (fn &rest args) - "Takes a function FN and fewer than the normal arguments to FN, -and returns a fn that takes a variable number of additional ARGS. -When called, the returned function calls FN with the additional -args first and then ARGS." - (lambda (&rest args-before) (apply fn (append args-before args)))) - -(defun -juxt (&rest fns) - "Takes a list of functions and returns a fn that is the -juxtaposition of those fns. The returned fn takes a variable -number of args, and returns a list containing the result of -applying each fn to the args (left-to-right)." - (lambda (&rest args) (mapcar (lambda (x) (apply x args)) fns))) - -(defun -compose (&rest fns) - "Takes a list of functions and returns a fn that is the -composition of those fns. The returned fn takes a variable -number of arguments, and returns the result of applying -each fn to the result of applying the previous fn to -the arguments (right-to-left)." - (lambda (&rest args) - (car (-reduce-r-from (lambda (fn xs) (list (apply fn xs))) - args fns)))) - -(defun -applify (fn) - "Changes an n-arity function FN to a 1-arity function that -expects a list with n items as arguments" - (apply-partially 'apply fn)) - -(defun -on (operator transformer) - "Return a function of two arguments that first applies -TRANSFORMER to each of them and then applies OPERATOR on the -results (in the same order). - -In types: (b -> b -> c) -> (a -> b) -> a -> a -> c" - (lambda (x y) (funcall operator (funcall transformer x) (funcall transformer y)))) - -(defun -flip (func) - "Swap the order of arguments for binary function FUNC. - -In types: (a -> b -> c) -> b -> a -> c" - (lambda (x y) (funcall func y x))) - -(defun -const (c) - "Return a function that returns C ignoring any additional arguments. - -In types: a -> b -> a" - (lambda (&rest _) c)) - -(defmacro -cut (&rest params) - "Take n-ary function and n arguments and specialize some of them. -Arguments denoted by <> will be left unspecialized. - -See SRFI-26 for detailed description." - (let* ((i 0) - (args (mapcar (lambda (_) (setq i (1+ i)) (make-symbol (format "D%d" i))) - (-filter (-partial 'eq '<>) params)))) - `(lambda ,args - ,(let ((body (--map (if (eq it '<>) (pop args) it) params))) - (if (eq (car params) '<>) - (cons 'funcall body) - body))))) - -(defun -not (pred) - "Take a unary predicate PRED and return a unary predicate -that returns t if PRED returns nil and nil if PRED returns -non-nil." - (lambda (x) (not (funcall pred x)))) - -(defun -orfn (&rest preds) - "Take list of unary predicates PREDS and return a unary -predicate with argument x that returns non-nil if at least one of -the PREDS returns non-nil on x. - -In types: [a -> Bool] -> a -> Bool" - (lambda (x) (-any? (-cut funcall <> x) preds))) - -(defun -andfn (&rest preds) - "Take list of unary predicates PREDS and return a unary -predicate with argument x that returns non-nil if all of the -PREDS returns non-nil on x. - -In types: [a -> Bool] -> a -> Bool" - (lambda (x) (-all? (-cut funcall <> x) preds))) - -(defun -iteratefn (fn n) - "Return a function FN composed N times with itself. - -FN is a unary function. If you need to use a function of higher -arity, use `-applify' first to turn it into a unary function. - -With n = 0, this acts as identity function. - -In types: (a -> a) -> Int -> a -> a. - -This function satisfies the following law: - - (funcall (-iteratefn fn n) init) = (-last-item (-iterate fn init (1+ n)))." - (lambda (x) (--dotimes n (setq x (funcall fn x))) x)) - -(defun -counter (&optional beg end inc) - "Return a closure that counts from BEG to END, with increment INC. - -The closure will return the next value in the counting sequence -each time it is called, and nil after END is reached. BEG -defaults to 0, INC defaults to 1, and if END is nil, the counter -will increment indefinitely. - -The closure accepts any number of arguments, which are discarded." - (let ((inc (or inc 1)) - (n (or beg 0))) - (lambda (&rest _) - (when (or (not end) (< n end)) - (prog1 n - (setq n (+ n inc))))))) - -(defvar -fixfn-max-iterations 1000 - "The default maximum number of iterations performed by `-fixfn' - unless otherwise specified.") - -(defun -fixfn (fn &optional equal-test halt-test) - "Return a function that computes the (least) fixpoint of FN. - -FN must be a unary function. The returned lambda takes a single -argument, X, the initial value for the fixpoint iteration. The -iteration halts when either of the following conditions is satisfied: - - 1. Iteration converges to the fixpoint, with equality being - tested using EQUAL-TEST. If EQUAL-TEST is not specified, - `equal' is used. For functions over the floating point - numbers, it may be necessary to provide an appropriate - appoximate comparison test. - - 2. HALT-TEST returns a non-nil value. HALT-TEST defaults to a - simple counter that returns t after `-fixfn-max-iterations', - to guard against infinite iteration. Otherwise, HALT-TEST - must be a function that accepts a single argument, the - current value of X, and returns non-nil as long as iteration - should continue. In this way, a more sophisticated - convergence test may be supplied by the caller. - -The return value of the lambda is either the fixpoint or, if -iteration halted before converging, a cons with car `halted' and -cdr the final output from HALT-TEST. - -In types: (a -> a) -> a -> a." - (let ((eqfn (or equal-test 'equal)) - (haltfn (or halt-test - (-not - (-counter 0 -fixfn-max-iterations))))) - (lambda (x) - (let ((re (funcall fn x)) - (halt? (funcall haltfn x))) - (while (and (not halt?) (not (funcall eqfn x re))) - (setq x re - re (funcall fn re) - halt? (funcall haltfn re))) - (if halt? (cons 'halted halt?) - re))))) - -(defun -prodfn (&rest fns) - "Take a list of n functions and return a function that takes a -list of length n, applying i-th function to i-th element of the -input list. Returns a list of length n. - -In types (for n=2): ((a -> b), (c -> d)) -> (a, c) -> (b, d) - -This function satisfies the following laws: - - (-compose (-prodfn f g ...) (-prodfn f\\=' g\\=' ...)) = (-prodfn (-compose f f\\=') (-compose g g\\=') ...) - (-prodfn f g ...) = (-juxt (-compose f (-partial \\='nth 0)) (-compose g (-partial \\='nth 1)) ...) - (-compose (-prodfn f g ...) (-juxt f\\=' g\\=' ...)) = (-juxt (-compose f f\\=') (-compose g g\\=') ...) - (-compose (-partial \\='nth n) (-prod f1 f2 ...)) = (-compose fn (-partial \\='nth n))" - (lambda (x) (-zip-with 'funcall fns x))) - -(provide 'dash-functional) - -;;; dash-functional.el ends here diff --git a/elpa/dash-functional-20191109.1327/dash-functional.elc b/elpa/dash-functional-20191109.1327/dash-functional.elc deleted file mode 100644 index 750219277da1053ea816ffa71567d05e404038b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9070 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 R@xcH9002ovPDHLkV1oEFC}RKs diff --git a/elpa/dashboard-20200306.1344/banners/logo.png b/elpa/dashboard-20200306.1344/banners/logo.png deleted file mode 100644 index c9de00c705e2f4f16d2dc36ba7a7952d88c865ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32305 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 Q_y7O^07*qoM6N<$f@+AI_y7O^ diff --git a/elpa/dashboard-20200306.1344/dashboard-autoloads.el b/elpa/dashboard-20200306.1344/dashboard-autoloads.el deleted file mode 100644 index cc682f5d..00000000 --- a/elpa/dashboard-20200306.1344/dashboard-autoloads.el +++ /dev/null @@ -1,41 +0,0 @@ -;;; dashboard-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dashboard" "dashboard.el" (0 0 0 0)) -;;; Generated autoloads from dashboard.el - -(autoload 'dashboard-setup-startup-hook "dashboard" "\ -Setup post initialization hooks. -If a command line argument is provided, -assume a filename and skip displaying Dashboard. - -\(fn)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dashboard" '("dashboard-"))) - -;;;*** - -;;;### (autoloads nil "dashboard-widgets" "dashboard-widgets.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from dashboard-widgets.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dashboard-widgets" '("dashboard-" "recentf-list"))) - -;;;*** - -;;;### (autoloads nil nil ("dashboard-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dashboard-autoloads.el ends here diff --git a/elpa/dashboard-20200306.1344/dashboard-pkg.el b/elpa/dashboard-20200306.1344/dashboard-pkg.el deleted file mode 100644 index aff26768..00000000 --- a/elpa/dashboard-20200306.1344/dashboard-pkg.el +++ /dev/null @@ -1,13 +0,0 @@ -(define-package "dashboard" "20200306.1344" "A startup screen extracted from Spacemacs" - '((emacs "25.3") - (page-break-lines "0.11")) - :keywords - '("startup" "screen" "tools" "dashboard") - :authors - '(("Rakan Al-Hneiti")) - :maintainer - '("Rakan Al-Hneiti") - :url "https://github.com/emacs-dashboard/emacs-dashboard") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/dashboard-20200306.1344/dashboard-widgets.el b/elpa/dashboard-20200306.1344/dashboard-widgets.el deleted file mode 100644 index a045ce78..00000000 --- a/elpa/dashboard-20200306.1344/dashboard-widgets.el +++ /dev/null @@ -1,729 +0,0 @@ -;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- - -;; Copyright (c) 2016-2020 Rakan Al-Hneiti & Contributors -;; -;; Author: Rakan Al-Hneiti -;; URL: https://github.com/emacs-dashboard/emacs-dashboard -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 -;; -;; Created: October 05, 2016 -;; Package-Version: 1.8.0-SNAPSHOT -;; Keywords: startup, screen, tools, dashboard -;; Package-Requires: ((emacs "25.3") (page-break-lines "0.11")) -;;; Commentary: - -;; An extensible Emacs dashboard, with sections for -;; bookmarks, projectile projects, org-agenda and more. - -;;; Code: - -(require 'cl-lib) - -;; Compiler pacifier -(declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el") -(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") -(declare-function bookmark-get-filename "ext:bookmark.el") -(declare-function bookmark-all-names "ext:bookmark.el") -(declare-function calendar-date-compare "ext:calendar.el") -(declare-function projectile-cleanup-known-projects "ext:projectile.el") -(declare-function projectile-load-known-projects "ext:projectile.el") -(declare-function projectile-mode "ext:projectile.el") -(declare-function projectile-relevant-known-projects "ext:projectile.el") -(declare-function org-agenda-format-item "ext:org-agenda.el") -(declare-function org-compile-prefix-format "ext:org-agenda.el") -(declare-function org-entry-is-done-p "ext:org.el") -(declare-function org-get-category "ext:org.el") -(declare-function org-get-deadline-time "ext:org.el") -(declare-function org-get-heading "ext:org.el") -(declare-function org-get-scheduled-time "ext:org.el") -(declare-function org-get-tags "ext:org.el") -(declare-function org-map-entries "ext:org.el") -(declare-function org-outline-level "ext:org.el") -(defvar all-the-icons-dir-icon-alist) -(defvar package-activated-list) - -(defcustom dashboard-page-separator "\n\f\n" - "Separator to use between the different pages." - :type 'string - :group 'dashboard) - -(defcustom dashboard-image-banner-max-height 0 - "Maximum height of banner image. - -This setting applies only if Emacs is compiled with Imagemagick -support. When value is non-zero the image banner will be resized -to the specified height, with aspect ratio preserved." - :type 'integer - :group 'dashboard) - -(defcustom dashboard-image-banner-max-width 0 - "Maximum width of banner image. - -This setting applies if Emacs is compiled with Imagemagick -support. When value is non-zero the image banner will be resized -to the specified width, with aspect ratio preserved." - :type 'integer - :group 'dashboard) - -(defcustom dashboard-set-heading-icons nil - "When non nil, heading sections will have icons." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-file-icons nil - "When non nil, file lists will have icons." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-navigator nil - "When non nil, a navigator will be displayed under the banner." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-init-info t - "When non nil, init info will be displayed under the banner." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-set-footer t - "When non nil, a footer will be displayed at the bottom." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-footer-messages - '("The one true editor, Emacs!" - "Who the hell uses VIM anyway? Go Evil!" - "Free as free speech, free as free Beer" - "Richard Stallman is proud of you" - "Happy coding!" - "Vi Vi Vi, the editor of the beast" - "Welcome to the church of Emacs" - "While any text editor can save your files,\ - only Emacs can save your soul" - "I showed you my source code, pls respond") - "A list of messages, one of which dashboard chooses to display." - :type 'list - :group 'dashboard) - -(defcustom dashboard-show-shortcuts t - "Whether to show shortcut keys for each section." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-org-agenda-categories nil - "Specify the Categories to consider when using agenda in dashboard. -Example: -'(\"Tasks\" \"Habits\")" - :type 'list - :group 'dashboard) - -(defconst dashboard-banners-directory - (concat (file-name-directory - (locate-library "dashboard")) - "/banners/")) - -(defconst dashboard-banner-official-png - (expand-file-name (concat dashboard-banners-directory "emacs.png")) - "Emacs banner image.") - -(defconst dashboard-banner-logo-png - (expand-file-name (concat dashboard-banners-directory "logo.png")) - "Emacs banner image.") - -(defconst dashboard-banner-length 75 - "Width of a banner.") - -(defcustom dashboard-banner-logo-title "Welcome to Emacs!" - "Specify the startup banner." - :type 'string - :group 'dashboard) - -(defcustom dashboard-navigator-buttons nil - "Specify the navigator buttons. -The format is: 'icon title help action face prefix suffix'. - -Example: -'((\"☆\" \"Star\" \"Show stars\" (lambda (&rest _) (show-stars)) 'warning \"[\" \"]\"))" - :type '(repeat (repeat (list string string string function symbol string string))) - :group 'dashboard) - -(defcustom dashboard-init-info - ;; Check if package.el was loaded and if package loading was enabled - (if (bound-and-true-p package-alist) - (format "%d packages loaded in %s" - (length package-activated-list) (emacs-init-time)) - (if (and (boundp 'straight--profile-cache) (hash-table-p straight--profile-cache)) - (format "%d packages loaded in %s" - (hash-table-size straight--profile-cache) (emacs-init-time)) - (format "Emacs started in %s" (emacs-init-time)))) - "Init info with packages loaded and init time." - :type 'boolean - :group 'dashboard) - -(defcustom dashboard-footer - (let ((list '("The one true editor, Emacs!" - "Who the hell uses VIM anyway? Go Evil!" - "Free as free speech, free as free Beer" - "Richard Stallman is proud of you" - "Happy coding!" - "Vi Vi Vi, the editor of the beast" - "Welcome to the church of Emacs" - "While any text editor can save your files,\ - only Emacs can save your soul" - "I showed you my source code, pls respond" - ))) - (nth (random (1- (1+ (length list)))) list)) - "A footer with some short message." - :type 'string - :group 'dashboard) - -(defcustom dashboard-footer-icon - (if (and (display-graphic-p) - (or (fboundp 'all-the-icons-fileicon) - (require 'all-the-icons nil 'noerror))) - (all-the-icons-fileicon "emacs" - :height 1.1 - :v-adjust -0.05 - :face 'font-lock-keyword-face) - (propertize ">" 'face 'dashboard-footer)) - "Footer's icon." - :type 'string - :group 'dashboard) - -(defcustom dashboard-startup-banner 'official - "Specify the startup banner. -Default value is `official', it displays -the Emacs logo. `logo' displays Emacs alternative logo. -An integer value is the index of text -banner. A string value must be a path to a .PNG file. -If the value is nil then no banner is displayed." - :type '(choice (const :tag "offical" official) - (const :tag "logo" logo) - (string :tag "a png path")) - :group 'dashboard) - -(defcustom dashboard-buffer-last-width nil - "Previous width of dashboard-buffer." - :type 'integer - :group 'dashboard) - -(defcustom dashboard-item-generators '((recents . dashboard-insert-recents) - (bookmarks . dashboard-insert-bookmarks) - (projects . dashboard-insert-projects) - (agenda . dashboard-insert-agenda) - (registers . dashboard-insert-registers)) - "Association list of items to how to generate in the startup buffer. -Will be of the form `(list-type . list-function)'. -Possible values for list-type are: `recents', `bookmarks', `projects', -`agenda' ,`registers'." - :type '(repeat (alist :key-type symbol :value-type function)) - :group 'dashboard) - -(defcustom dashboard-items '((recents . 5) - (bookmarks . 5) - (agenda . 5)) - "Association list of items to show in the startup buffer. -Will be of the form `(list-type . list-size)'. -If nil it is disabled. Possible values for list-type are: -`recents' `bookmarks' `projects' `agenda' `registers'." - :type '(repeat (alist :key-type symbol :value-type integer)) - :group 'dashboard) - -(defcustom dashboard-items-default-length 20 - "Length used for startup lists with otherwise unspecified bounds. -Set to nil for unbounded." - :type 'integer - :group 'dashboard) - -(defcustom dashboard-heading-icons '((recents . "history") - (bookmarks . "bookmark") - (agenda . "calendar") - (projects . "rocket") - (registers . "database")) - "Association list for the icons of the heading sections. -Will be of the form `(list-type . icon-name-string)`. -If nil it is disabled. Possible values for list-type are: -`recents' `bookmarks' `projects' `agenda' `registers'" - :type '(repeat (alist :key-type symbol :value-type string)) - :group 'dashboard) - -(defvar recentf-list nil) - -;; -;; Faces -;; -(defface dashboard-text-banner - '((t (:inherit font-lock-keyword-face))) - "Face used for text banners." - :group 'dashboard) - -(defface dashboard-banner-logo-title - '((t :inherit default)) - "Face used for the banner title." - :group 'dashboard) - -(defface dashboard-navigator - '((t (:inherit font-lock-keyword-face))) - "Face used for the navigator." - :group 'dashboard) - -(defface dashboard-heading - '((t (:inherit font-lock-keyword-face))) - "Face used for widget headings." - :group 'dashboard) - -(defface dashboard-footer - '((t (:inherit font-lock-doc-face))) - "Face used for widget headings." - :group 'dashboard) - -(define-obsolete-face-alias - 'dashboard-text-banner-face 'dashboard-text-banner "1.2.6") -(define-obsolete-face-alias - 'dashboard-banner-logo-title-face 'dashboard-banner-logo-title "1.2.6") -(define-obsolete-face-alias - 'dashboard-heading-face 'dashboard-heading "1.2.6") - -;; -;; Generic widget helpers -;; -(defun dashboard-subseq (seq start end) - "Return the subsequence of SEQ from START to END.. -Uses `cl-subseq`, but accounts for end points greater than the size of the -list. -Return entire list if `END' is omitted." - (let ((len (length seq))) - (cl-subseq seq start (and (number-or-marker-p end) - (min len end))))) - -(defmacro dashboard-insert-shortcut (shortcut-char - search-label - &optional no-next-line) - "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL. -Optionally, provide NO-NEXT-LINE to move the cursor forward a line." - `(progn - (eval-when-compile (defvar dashboard-mode-map)) - (let ((sym (make-symbol (format "Jump to \"%s\"" ,search-label)))) - (fset sym (lambda () - (interactive) - (unless (search-forward ,search-label (point-max) t) - (search-backward ,search-label (point-min) t)) - ,@(unless no-next-line - '((forward-line 1))) - (back-to-indentation))) - (eval-after-load 'dashboard - (define-key dashboard-mode-map ,shortcut-char sym))))) - -(defun dashboard-append (msg &optional _messagebuf) - "Append MSG to dashboard buffer. -If MESSAGEBUF is not nil then MSG is also written in message buffer." - (with-current-buffer (get-buffer-create "*dashboard*") - (goto-char (point-max)) - (let ((buffer-read-only nil)) - (insert msg)))) - -(defun dashboard-modify-heading-icons (alist) - "Append ALIST items to `dashboard-heading-icons' to modify icons." - (dolist (icon alist) - (add-to-list 'dashboard-heading-icons icon))) - -(defun dashboard-insert-page-break () - "Insert a page break line in dashboard buffer." - (dashboard-append dashboard-page-separator)) - -(defun dashboard-insert-heading (heading &optional shortcut) - "Insert a widget HEADING in dashboard buffer, adding SHORTCUT if provided." - (when (and (display-graphic-p) - dashboard-set-heading-icons) - ;; Try loading `all-the-icons' - (unless (or (fboundp 'all-the-icons-octicon) - (require 'all-the-icons nil 'noerror)) - (error "Package `all-the-icons' isn't installed")) - - (insert (cond - ((string-equal heading "Recent Files:") - (all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - ((string-equal heading "Bookmarks:") - (all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - ((or (string-equal heading "Agenda for today:") - (string-equal heading "Agenda for the coming week:")) - (all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - ((string-equal heading "Registers:") - (all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - ((string-equal heading "Projects:") - (all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons)) - :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) - (t " "))) - (insert " ")) - - (insert (propertize heading 'face 'dashboard-heading)) - (if shortcut (insert (format " (%s)" shortcut)))) - -(defun dashboard-center-line (string) - "Center a STRING accoring to it's size." - (insert (make-string (max 0 (floor (/ (- dashboard-banner-length - (+ (length string) 1)) 2))) ?\ ))) - -;; -;; BANNER -;; -(defun dashboard-insert-ascii-banner-centered (file) - "Insert banner from FILE." - (let ((ascii-banner - (with-temp-buffer - (insert-file-contents file) - (let ((banner-width 0)) - (while (not (eobp)) - (let ((line-length (- (line-end-position) (line-beginning-position)))) - (if (< banner-width line-length) - (setq banner-width line-length))) - (forward-line 1)) - (goto-char 0) - (let ((margin - (max 0 (floor (/ (- dashboard-banner-length banner-width) 2))))) - (while (not (eobp)) - (insert (make-string margin ?\ )) - (forward-line 1)))) - (buffer-string)))) - (put-text-property 0 (length ascii-banner) 'face 'dashboard-text-banner ascii-banner) - (insert ascii-banner))) - -(defun dashboard-insert-image-banner (banner) - "Display an image BANNER." - (when (file-exists-p banner) - (let* ((title dashboard-banner-logo-title) - (spec - (if (image-type-available-p 'imagemagick) - (apply 'create-image banner 'imagemagick nil - (append (when (> dashboard-image-banner-max-width 0) - (list :max-width dashboard-image-banner-max-width)) - (when (> dashboard-image-banner-max-height 0) - (list :max-height dashboard-image-banner-max-height)))) - (create-image banner))) - (size (image-size spec)) - (width (car size)) - (left-margin (max 0 (floor (- dashboard-banner-length width) 2)))) - (goto-char (point-min)) - (insert "\n") - (insert (make-string left-margin ?\ )) - (insert-image spec) - (insert "\n\n") - (when title - (dashboard-center-line title) - (insert (format "%s\n\n" (propertize title 'face 'dashboard-banner-logo-title))))))) - -;; -;; INIT INFO -;; -(defun dashboard-insert-init-info () - "Insert init info when `dashboard-set-init-info' is t." - (when dashboard-set-init-info - (dashboard-center-line dashboard-init-info) - (insert - (propertize dashboard-init-info 'face 'font-lock-comment-face)))) - -(defun dashboard-get-banner-path (index) - "Return the full path to banner with index INDEX." - (concat dashboard-banners-directory (format "%d.txt" index))) - -(defun dashboard-choose-banner () - "Return the full path of a banner based on the dotfile value." - (when dashboard-startup-banner - (cond ((eq 'official dashboard-startup-banner) - (if (and (display-graphic-p) (image-type-available-p 'png)) - dashboard-banner-official-png - (dashboard-get-banner-path 1))) - ((eq 'logo dashboard-startup-banner) - (if (and (display-graphic-p) (image-type-available-p 'png)) - dashboard-banner-logo-png - (dashboard-get-banner-path 1))) - ((integerp dashboard-startup-banner) - (dashboard-get-banner-path dashboard-startup-banner)) - ((and dashboard-startup-banner - (image-type-available-p (intern (file-name-extension - dashboard-startup-banner))) - (display-graphic-p)) - (if (file-exists-p dashboard-startup-banner) - dashboard-startup-banner - (message (format "could not find banner %s" - dashboard-startup-banner)) - (dashboard-get-banner-path 1))) - (t (dashboard-get-banner-path 1))))) - -(defun dashboard-insert-banner () - "Insert Banner at the top of the dashboard." - (goto-char (point-max)) - (let ((banner (dashboard-choose-banner)) - (buffer-read-only nil)) - (progn - (when banner - (if (image-type-available-p (intern (file-name-extension banner))) - (dashboard-insert-image-banner banner) - (dashboard-insert-ascii-banner-centered banner)) - (dashboard-insert-navigator) - (dashboard-insert-init-info))))) - -(defun dashboard-insert-navigator () - "Insert Navigator of the dashboard." - (when (and dashboard-set-navigator dashboard-navigator-buttons) - (dolist (line dashboard-navigator-buttons) - (dolist (btn line) - (let* ((icon (car btn)) - (title (cadr btn)) - (help (or (cadr (cdr btn)) "")) - (action (or (cadr (cddr btn)) #'ignore)) - (face (or (cadr (cddr (cdr btn))) 'dashboard-navigator)) - (prefix (or (cadr (cddr (cddr btn))) (propertize "[" 'face face))) - (suffix (or (cadr (cddr (cddr (cdr btn)))) (propertize "]" 'face face)))) - (widget-create 'item - :tag (concat - (when icon - (propertize icon 'face `(:inherit - ,(get-text-property 0 'face icon) - :inherit - ,face))) - (when (and icon title - (not (string-equal icon "")) - (not (string-equal title ""))) - (propertize " " 'face 'variable-pitch)) - (when title (propertize title 'face face))) - :help-echo help - :action action - :button-face `(:underline nil) - :mouse-face 'highlight - :button-prefix prefix - :button-suffix suffix - :format "%[%t%]") - (insert " "))) - (let* ((width (current-column))) - (beginning-of-line) - (dashboard-center-line (make-string width ?\s)) - (end-of-line)) - (insert "\n")) - (insert "\n"))) - -(defmacro dashboard-insert-section (section-name list list-size shortcut action &rest widget-params) - "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard. -SHORTCUT is the keyboard shortcut used to access the section. -ACTION is theaction taken when the user activates the widget button. -WIDGET-PARAMS are passed to the \"widget-create\" function." - `(progn - (dashboard-insert-heading ,section-name - (if (and ,list dashboard-show-shortcuts) ,shortcut)) - (if ,list - (when (dashboard-insert-section-list - ,section-name - (dashboard-subseq ,list 0 ,list-size) - ,action - ,@widget-params) - (dashboard-insert-shortcut ,shortcut ,section-name)) - (insert "\n --- No items ---")))) - -;; -;; Section list -;; -(defmacro dashboard-insert-section-list (section-name list action &rest rest) - "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST to widget creation." - `(when (car ,list) - (mapc - (lambda (el) - (let ((tag ,@rest)) - (insert "\n ") - - (when (and (display-graphic-p) - dashboard-set-file-icons - (or (fboundp 'all-the-icons-icon-for-dir) - (require 'all-the-icons nil 'noerror))) - (let* ((path (car (last (split-string ,@rest " - ")))) - (icon (if (and (not (file-remote-p path)) - (file-directory-p path)) - (all-the-icons-icon-for-dir path nil "") - (cond - ((string-equal ,section-name "Agenda for today:") - (all-the-icons-octicon "primitive-dot" :height 1.0 :v-adjust 0.01)) - ((file-remote-p path) - (all-the-icons-octicon "radio-tower" :height 1.0 :v-adjust 0.01)) - (t (all-the-icons-icon-for-file (file-name-nondirectory path) - :v-adjust -0.05)))))) - (setq tag (concat icon " " ,@rest)))) - - (widget-create 'item - :tag tag - :action ,action - :button-face `(:underline nil) - :mouse-face 'highlight - :button-prefix "" - :button-suffix "" - :format "%[%t%]"))) - ,list))) - -;; Footer -(defun dashboard-random-footer () - "Return a random footer from `dashboard-footer-messages'." - (nth (random (length dashboard-footer-messages)) dashboard-footer-messages)) - -(defun dashboard-insert-footer () - "Insert footer of dashboard." - (let ((footer (and dashboard-set-footer (dashboard-random-footer)))) - (when footer - (insert "\n") - (dashboard-center-line footer) - (insert dashboard-footer-icon) - (insert " ") - (insert (propertize footer 'face 'dashboard-footer)) - (insert "\n")))) - -;; -;; Recentf -;; -(defun dashboard-insert-recents (list-size) - "Add the list of LIST-SIZE items from recently edited files." - (recentf-mode) - (dashboard-insert-section - "Recent Files:" - recentf-list - list-size - "r" - `(lambda (&rest ignore) (find-file-existing ,el)) - (abbreviate-file-name el))) - -;; -;; Bookmarks -;; -(defun dashboard-insert-bookmarks (list-size) - "Add the list of LIST-SIZE items of bookmarks." - (require 'bookmark) - (dashboard-insert-section - "Bookmarks:" - (dashboard-subseq (bookmark-all-names) - 0 list-size) - list-size - "m" - `(lambda (&rest ignore) (bookmark-jump ,el)) - (let ((file (bookmark-get-filename el))) - (if file - (format "%s - %s" el (abbreviate-file-name file)) - el)))) - -;; -;; Projectile -;; -(defun dashboard-insert-projects (list-size) - "Add the list of LIST-SIZE items of projects." - (require 'projectile) - (let ((inhibit-message t) (message-log-max nil)) - (projectile-cleanup-known-projects)) - (projectile-load-known-projects) - (dashboard-insert-section - "Projects:" - (dashboard-subseq (projectile-relevant-known-projects) - 0 list-size) - list-size - "p" - `(lambda (&rest ignore) (projectile-switch-project-by-name ,el)) - (abbreviate-file-name el))) - -;; -;; Org Agenda -;; -(defun dashboard-timestamp-to-gregorian-date (timestamp) - "Convert TIMESTAMP to a gregorian date. - -The result can be used with functions like -`calendar-date-compare'." - (let ((decoded-timestamp (decode-time timestamp))) - (list (nth 4 decoded-timestamp) - (nth 3 decoded-timestamp) - (nth 5 decoded-timestamp)))) - -(defun dashboard-date-due-p (timestamp &optional due-date) - "Check if TIMESTAMP is today or in the past. - -If DUE-DATE is nil, compare TIMESTAMP to today; otherwise, -compare to the date in DUE-DATE. - -The time part of both TIMESTAMP and DUE-DATE is ignored, only the -date part is considered." - (unless due-date - (setq due-date (current-time))) - (setq due-date (time-add due-date 86400)) - (let* ((gregorian-date (dashboard-timestamp-to-gregorian-date timestamp)) - (gregorian-due-date (dashboard-timestamp-to-gregorian-date due-date))) - (calendar-date-compare (list gregorian-date) - (list gregorian-due-date)))) - -(defun dashboard-get-agenda () - "Get agenda items for today or for a week from now." - (org-compile-prefix-format 'agenda) - (let ((due-date nil)) - (if (and (boundp 'show-week-agenda-p) show-week-agenda-p) - (setq due-date (time-add (current-time) (* 86400 7))) - (setq due-date nil) - ) - (let* ((filtered-entries nil)) - (org-map-entries - (lambda () - (let* ((schedule-time (org-get-scheduled-time (point))) - (deadline-time (org-get-deadline-time (point))) - (item (org-agenda-format-item - (format-time-string "%Y-%m-%d" schedule-time) - (org-get-heading t t) - (org-outline-level) - (org-get-category) - (org-get-tags) - t)) - (loc (point)) - (file (buffer-file-name))) - (if (or (equal dashboard-org-agenda-categories nil) - (member (org-get-category) dashboard-org-agenda-categories)) - (when (and (not (org-entry-is-done-p)) - (or (and schedule-time (dashboard-date-due-p schedule-time due-date)) - (and deadline-time (dashboard-date-due-p deadline-time due-date)))) - (setq filtered-entries - (append filtered-entries - (list (list item schedule-time deadline-time loc file)))))))) - nil - 'agenda) - filtered-entries))) - -(defun dashboard-insert-agenda (list-size) - "Add the list of LIST-SIZE items of agenda." - (require 'org-agenda) - (require 'calendar) - (let ((agenda (dashboard-get-agenda))) - (dashboard-insert-section - (or (and (boundp 'show-week-agenda-p) show-week-agenda-p "Agenda for the coming week:") - "Agenda for today:") - agenda - list-size - "a" - `(lambda (&rest ignore) - (let ((buffer (find-file-other-window (nth 4 ',el)))) - (with-current-buffer buffer - (goto-char (nth 3 ',el))) - (switch-to-buffer buffer))) - (format "%s" (nth 0 el))))) - -;; -;; Registers -;; -(defun dashboard-insert-registers (list-size) - "Add the list of LIST-SIZE items of registers." - (require 'register) - (dashboard-insert-section - "Registers:" - register-alist - list-size - "e" - (lambda (&rest _ignore) (jump-to-register (car el))) - (format "%c - %s" (car el) (register-describe-oneline (car el))))) - -(provide 'dashboard-widgets) -;;; dashboard-widgets.el ends here diff --git a/elpa/dashboard-20200306.1344/dashboard-widgets.elc b/elpa/dashboard-20200306.1344/dashboard-widgets.elc deleted file mode 100644 index 61d4b31900f7e9312ada6c8031a6d8613385d345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28252 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 QtMctdyz2`GCSPCqA7iwGg#Z8m diff --git a/elpa/dashboard-20200306.1344/dashboard.el b/elpa/dashboard-20200306.1344/dashboard.el deleted file mode 100644 index 56b64180..00000000 --- a/elpa/dashboard-20200306.1344/dashboard.el +++ /dev/null @@ -1,258 +0,0 @@ -;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- - -;; Copyright (c) 2016-2020 Rakan Al-Hneiti & Contributors -;; -;; Author: Rakan Al-Hneiti -;; URL: https://github.com/emacs-dashboard/emacs-dashboard -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 -;; -;; Created: October 05, 2016 -;; Package-Version: 1.8.0-SNAPSHOT -;; Keywords: startup, screen, tools, dashboard -;; Package-Requires: ((emacs "25.3") (page-break-lines "0.11")) -;;; Commentary: - -;; An extensible Emacs dashboard, with sections for -;; bookmarks, projectile projects, org-agenda and more. - -;;; Code: - -(require 'seq) -(require 'page-break-lines) -(require 'recentf) - -(require 'dashboard-widgets) - -;; Custom splash screen -(defvar dashboard-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-p") 'dashboard-previous-line) - (define-key map (kbd "C-n") 'dashboard-next-line) - (define-key map (kbd "") 'dashboard-previous-line) - (define-key map (kbd "") 'dashboard-next-line) - (define-key map (kbd "k") 'dashboard-previous-line) - (define-key map (kbd "j") 'dashboard-next-line) - (define-key map [tab] 'widget-forward) - (define-key map (kbd "C-i") 'widget-forward) - (define-key map [backtab] 'widget-backward) - (define-key map (kbd "RET") 'dashboard-return) - (define-key map [down-mouse-1] 'widget-button-click) - (define-key map (kbd "g") #'dashboard-refresh-buffer) - (define-key map (kbd "}") #'dashboard-next-section) - (define-key map (kbd "{") #'dashboard-previous-section) - map) - "Keymap for dashboard mode.") - -(define-derived-mode dashboard-mode special-mode "Dashboard" - "Dashboard major mode for startup screen. -\\ -" - :group 'dashboard - :syntax-table nil - :abbrev-table nil - (buffer-disable-undo) - (whitespace-mode -1) - (linum-mode -1) - (when (>= emacs-major-version 26) - (display-line-numbers-mode -1)) - (page-break-lines-mode 1) - (setq inhibit-startup-screen t) - (setq buffer-read-only t - truncate-lines t)) - -(defgroup dashboard nil - "Extensible startup screen." - :group 'applications) - -(defcustom dashboard-center-content nil - "Whether to center content within the window." - :type 'boolean - :group 'dashboard) - -(defconst dashboard-buffer-name "*dashboard*" - "Dashboard's buffer name.") - -(defvar dashboard--section-starts nil - "List of section starting positions.") - -(defun dashboard-previous-section () - "Navigate back to previous section." - (interactive) - (let ((current-section-start nil) - (current-position (point)) - (previous-section-start nil)) - (dolist (elt dashboard--section-starts) - (when (and current-section-start - (not previous-section-start)) - (setq previous-section-start elt)) - (when (and (not current-section-start) - (< elt current-position)) - (setq current-section-start elt))) - (goto-char (if (eq current-position current-section-start) - previous-section-start - current-section-start)))) - -(defun dashboard-next-section () - "Navigate forward to next section." - (interactive) - (let ((current-position (point)) - (next-section-start nil) - (section-starts (reverse dashboard--section-starts))) - (dolist (elt section-starts) - (when (and (not next-section-start) - (> elt current-position)) - (setq next-section-start elt))) - (when next-section-start - (goto-char next-section-start)))) - -(defun dashboard-previous-line (arg) - "Move point up and position it at that line’s item. -Optional prefix ARG says how many lines to move; default is one line." - (interactive "^p") - (dashboard-next-line (- arg))) - -(defun dashboard-next-line (arg) - "Move point down and position it at that line’s item. -Optional prefix ARG says how many lines to move; default is one line." - ;; code heavily inspired by `dired-next-line' - (interactive "^p") - (let ((line-move-visual nil) - (goal-column nil)) - (line-move arg t)) - ;; We never want to move point into an invisible line. Dashboard doesn’t - ;; use invisible text currently but when it does we’re ready! - (while (and (invisible-p (point)) - (not (if (and arg (< arg 0)) (bobp) (eobp)))) - (forward-char (if (and arg (< arg 0)) -1 1))) - (beginning-of-line-text)) - -(defun dashboard-return () - "Hit return key in dashboard buffer." - (interactive) - (let ((start-ln (line-number-at-pos)) - (fd-cnt 0) - (diff-line nil) - (entry-pt nil)) - (save-excursion - (while (and (not diff-line) - (not (= (point) (point-min))) - (not (get-char-property (point) 'button)) - (not (= (point) (point-max)))) - (forward-char 1) - (setq fd-cnt (1+ fd-cnt)) - (unless (= start-ln (line-number-at-pos)) - (setq diff-line t))) - (unless (= (point) (point-max)) - (setq entry-pt (point)))) - (when (= fd-cnt 1) - (setq entry-pt (1- (point)))) - (if entry-pt - (widget-button-press entry-pt) - (call-interactively #'widget-button-press)))) - -(defun dashboard-maximum-section-length () - "For the just-inserted section, calculate the length of the longest line." - (let ((max-line-length 0)) - (save-excursion - (dashboard-previous-section) - (while (not (eobp)) - (setq max-line-length - (max max-line-length - (- (line-end-position) (line-beginning-position)))) - (forward-line))) - max-line-length)) - -(defun dashboard-insert-startupify-lists () - "Insert the list of widgets into the buffer." - (interactive) - (let ((buffer-exists (buffer-live-p (get-buffer dashboard-buffer-name))) - (recentf-is-on (recentf-enabled-p)) - (origial-recentf-list recentf-list) - (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0)) - (max-line-length 0)) - ;; disable recentf mode, - ;; so we don't flood the recent files list with org mode files - ;; do this by making a copy of the part of the list we'll use - ;; let dashboard widgets change that - ;; then restore the orginal list afterwards - ;; (this avoids many saves/loads that would result from - ;; disabling/enabling recentf-mode) - (if recentf-is-on - (setq recentf-list (seq-take recentf-list dashboard-num-recents))) - (when (or (not (eq dashboard-buffer-last-width (window-width))) - (not buffer-exists)) - (setq dashboard-banner-length (window-width) - dashboard-buffer-last-width dashboard-banner-length) - (with-current-buffer (get-buffer-create dashboard-buffer-name) - (let ((buffer-read-only nil)) - (erase-buffer) - (dashboard-insert-banner) - (dashboard-insert-page-break) - (setq dashboard--section-starts nil) - (mapc (lambda (els) - (let* ((el (or (car-safe els) els)) - (list-size - (or (cdr-safe els) - dashboard-items-default-length)) - (item-generator - (cdr-safe (assoc el dashboard-item-generators)))) - (add-to-list 'dashboard--section-starts (point)) - (funcall item-generator list-size) - (setq max-line-length - (max max-line-length (dashboard-maximum-section-length))) - (dashboard-insert-page-break))) - dashboard-items) - (when dashboard-center-content - (when dashboard--section-starts - (goto-char (car (last dashboard--section-starts)))) - (let ((margin (floor (/ (max (- (window-width) max-line-length) 0) 2)))) - (while (not (eobp)) - (and (not (eq ? (char-after))) - (insert (make-string margin ?\ ))) - (forward-line 1)))) - (dashboard-insert-footer)) - (dashboard-mode) - (goto-char (point-min)))) - (if recentf-is-on - (setq recentf-list origial-recentf-list)))) - -(add-hook 'window-setup-hook - (lambda () - (add-hook 'window-size-change-functions 'dashboard-resize-on-hook) - (dashboard-resize-on-hook))) - -(defun dashboard-refresh-buffer () - "Refresh buffer." - (interactive) - (kill-buffer dashboard-buffer-name) - (dashboard-insert-startupify-lists) - (switch-to-buffer dashboard-buffer-name)) - -(defun dashboard-resize-on-hook (&optional _) - "Re-render dashboard on window size change." - (let ((space-win (get-buffer-window dashboard-buffer-name)) - (frame-win (frame-selected-window))) - (when (and space-win - (not (window-minibuffer-p frame-win))) - (with-selected-window space-win - (dashboard-insert-startupify-lists))))) - -;;;###autoload -(defun dashboard-setup-startup-hook () - "Setup post initialization hooks. -If a command line argument is provided, -assume a filename and skip displaying Dashboard." - (when (< (length command-line-args) 2 ) - (add-hook 'after-init-hook (lambda () - ;; Display useful lists of items - (dashboard-insert-startupify-lists))) - (add-hook 'emacs-startup-hook '(lambda () - (switch-to-buffer "*dashboard*") - (goto-char (point-min)) - (redisplay))))) - -(provide 'dashboard) -;;; dashboard.el ends here diff --git a/elpa/dashboard-20200306.1344/dashboard.elc b/elpa/dashboard-20200306.1344/dashboard.elc deleted file mode 100644 index a79c1b71f9f63def2a7f1716f3cc9a4a47fd33d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7752 zcmd5>YjfMi6{X}y9eV0X-8xMsZE^+07U>!qyhzG%n#i@C#M3mHiPL5pQ>{Q?Ng^Tv z1OO!~nauQW^zZeT^xS;_pdL*=Rx=cV-NoYWz2~0$;G<`sJ^5{?)9F5X^oX8h%RE_# zSl%QlJzIuRNynlnlPo1~xa-TAlcbtcxL8n@SIIK@KCCcZ?snzmSM#K#DR!YKORF$R zOIlS^dympAwI9ED^87hP^RNh`3fn%AkA!JVWkyk$rddT3L5nPmMNCOrWm*Q$qpTni z7K=m_yWJi?(wk(fG|p*9u$ZwQ4Iun<#Po1~s=Q*R;C8BVY^)9?4`qsQjq zvMQ2vW-mlp=IiUo@_frI6GZ{3ti!wI4xNN0POS7tQw%HRc|Hri2yt4Aw%_abrIw)V zOa8juZf|m02|LPSLDtxJ9DLlZvFGvyf4ugM-@XZO>8wv=KQ}EzIkzXP=~TcU zer!)lnM)BdN09YHd#XOFo<5*KpL*Nx(Jl@A0IqTg)aF@sL}{|Xf(u;bb0|F+Pdfkx z!%n&nzH3NGnU8RI(Ia5ea$4q#lq7}!t3$wJt17Oj@>BuRgiuPU-W zWyy+FO5qd^PnZ-;B=pp{nsTCX`gulqkzto5`(wFURFq7qV(v8i6Rss6GRy6b)59>1 zr35<^uBvQ_*G3@WQ<@}cTvAf)g7qZ(;=!s|3F*E}(`#avyM2o^bDlXKyRgJ%!p5@G za4A~AWDOipaH&-!0h~uVoAEL$-7*HKjRYeETgD1(zH_G0gG>dki^MT>r$DECnHE^|GY+XYwaDUBv~a8o+{4zC*C#J>@ZEw!EJ@EouAT>SBwD$UqaeaR)ks*)yuQo*Kkj z5}4roumq|=ZYpru2Kb`Vq0Ed#tAe4Y-^Xmg0Ytr>?^JZK^Xy!~{vBT6#9EQKK$HTV6`omW>BCgGLghM6sQvU{J7S z8Ue>DK{}wJjzaE3XV~XRb8s<inmA$sZ5P5m!yPODSy;BB_Co6_8S%Y6z4?$n508@>Qy%9~tO1k6nAhpO z&oP@>XI@jYoO{SvxWR0}tkUoB)&5n!zSG&nS8zuTjlH3Fg@=Q&B?qp4&1>`x&tBVj zjISX^J^ozfRnEqhKk~9b@8NiZ&gKLoTqe|dw2f4)!ynMdoZlbSZU7Ar8YP%46MEo0 z@27OImJ3RF$+P49-VLTrC_pKJq_q22AZPHFyuS7~K83pGvtC_4>veTjtQqWdHh$Lm zkasbCBB!a(IrK-y-M9B$KcK&42$p$~4;`Zot)vE1!` zfvPy;APJLClUMZk%TK5bPfJAC6Hqe3wW`CQv?ca`#5q?eGr*Fv6xA=bL)h$1Q+~96 zNu;dt#LEFDZ!l8j;>OE5#27BO>%!rHd}GwTk<%yZAGrl`In9}ksy0a{c#W<21%q7}D!v%3Y(2(-hqoCnoM`z^IC%KK=lfusUKv}r$4K4X0m*RK>!?WT zc^LIRD3oD+JjM!nf=JUB3)zHr;ud4w$3_qdjuUv_;L<<97#XU##U~AH{C+Pkn8`Zcs zE8&%3N#(h+xn$l{qKs9qLw%A(x~a)jfS#vaq43cesD4qig^lu>{gf#Ko{t(uy{sjR zMxhev{CHD(Ae`rsDzlm%hl<3KOao5DhB7%p*V7Bw>_haXUW3O5n}DyygNLl}o6tS< z&ydBXa^EesnS1k3zg7dTy9p9xBciKi_6Lg+JU`$Oo*BZZY`J5k(5MB_y^ktTS1Z?( zRB1~jc)s(#!&oqUgW|2#yHuubvRRy$%9uRuqR zeGM6$O4vs9rI3BspP*DEq3!Oh5zv(xH;c)FNeO)(`YEr!%vp5np`q*&#b7kIt4#YB zeqGSn%y6)WY=*-KXP!e32eHvQK!2?G$`%>Phgi-?r{Xo{eDw1jy&{O;Icif_g3Gw-~BJb$79m~ diff --git a/elpa/deferred-20170901.1330/deferred-autoloads.el b/elpa/deferred-20170901.1330/deferred-autoloads.el deleted file mode 100644 index f3ec671c..00000000 --- a/elpa/deferred-20170901.1330/deferred-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; 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 diff --git a/elpa/deferred-20170901.1330/deferred-pkg.el b/elpa/deferred-20170901.1330/deferred-pkg.el deleted file mode 100644 index d60c4c30..00000000 --- a/elpa/deferred-20170901.1330/deferred-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- 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 ")) :maintainer '("SAKURAI Masashi ") :url "https://github.com/kiwanami/emacs-deferred") diff --git a/elpa/deferred-20170901.1330/deferred.el b/elpa/deferred-20170901.1330/deferred.el deleted file mode 100644 index af874452..00000000 --- a/elpa/deferred-20170901.1330/deferred.el +++ /dev/null @@ -1,972 +0,0 @@ -;;; deferred.el --- Simple asynchronous functions for emacs lisp -*- lexical-binding: t; -*- - -;; Copyright (C) 2010-2016 SAKURAI Masashi - -;; Author: SAKURAI Masashi -;; 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 . - -;;; 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" ) - (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" ) - (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" ) - (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" ) - (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 diff --git a/elpa/deferred-20170901.1330/deferred.elc b/elpa/deferred-20170901.1330/deferred.elc deleted file mode 100644 index 3c761a52ac02cb14ddb92f5abd65b0707ff92159..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39152 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 diff --git a/elpa/dockerfile-mode-20200106.2126/dockerfile-mode-autoloads.el b/elpa/dockerfile-mode-20200106.2126/dockerfile-mode-autoloads.el deleted file mode 100644 index 15510a84..00000000 --- a/elpa/dockerfile-mode-20200106.2126/dockerfile-mode-autoloads.el +++ /dev/null @@ -1,45 +0,0 @@ -;;; dockerfile-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dockerfile-mode" "dockerfile-mode.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from dockerfile-mode.el - -(autoload 'dockerfile-build-buffer "dockerfile-mode" "\ -Build an image called IMAGE-NAME based upon the buffer. - -If prefix arg NO-CACHE is set, don't cache the image. -The build string will be of the format: -`sudo docker build --no-cache --tag IMAGE-NAME --build-args arg1.. -f filename directory` - -\(fn IMAGE-NAME &optional NO-CACHE)" t nil) - -(autoload 'dockerfile-build-no-cache-buffer "dockerfile-mode" "\ -Build an image called IMAGE-NAME based upon the buffer without cache. - -\(fn IMAGE-NAME)" t nil) - -(autoload 'dockerfile-mode "dockerfile-mode" "\ -A major mode to edit Dockerfiles. -\\{dockerfile-mode-map} - -\(fn)" t nil) - -(add-to-list 'auto-mode-alist '("Dockerfile\\(?:\\..*\\)?\\'" . dockerfile-mode)) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dockerfile-mode" '("dockerfile-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dockerfile-mode-autoloads.el ends here diff --git a/elpa/dockerfile-mode-20200106.2126/dockerfile-mode-pkg.el b/elpa/dockerfile-mode-20200106.2126/dockerfile-mode-pkg.el deleted file mode 100644 index 6546768e..00000000 --- a/elpa/dockerfile-mode-20200106.2126/dockerfile-mode-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "dockerfile-mode" "20200106.2126" "Major mode for editing Docker's Dockerfiles" '((emacs "24") (s "1.12")) :commit "d31f7685ebc5832d957e25070a930aa42984327d" :url "https://github.com/spotify/dockerfile-mode") diff --git a/elpa/dockerfile-mode-20200106.2126/dockerfile-mode.el b/elpa/dockerfile-mode-20200106.2126/dockerfile-mode.el deleted file mode 100644 index af6e6538..00000000 --- a/elpa/dockerfile-mode-20200106.2126/dockerfile-mode.el +++ /dev/null @@ -1,234 +0,0 @@ -;;; dockerfile-mode.el --- Major mode for editing Docker's Dockerfiles -*- lexical-binding: t -*- - -;; Copyright (c) 2013 Spotify AB -;; Package-Requires: ((emacs "24") (s "1.12")) -;; Package-Version: 20200106.2126 -;; Homepage: https://github.com/spotify/dockerfile-mode -;; -;; Licensed under the Apache License, Version 2.0 (the "License"); you may not -;; use this file except in compliance with the License. You may obtain a copy of -;; the License at -;; -;; http://www.apache.org/licenses/LICENSE-2.0 -;; -;; Unless required by applicable law or agreed to in writing, software -;; distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -;; WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -;; License for the specific language governing permissions and limitations under -;; the License. - -;;; Commentary: - -;; Provides a major mode `dockerfile-mode' for use with the standard -;; `Dockerfile' file format. Additional convenience functions allow -;; images to be built easily. - -;;; Code: - -(require 'sh-script) -(require 'rx) -(require 's) - - -(declare-function cygwin-convert-file-name-to-windows "cygw32.c" (file &optional absolute-p)) - -(defgroup dockerfile nil - "dockerfile code editing commands for Emacs." - :link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces) - :prefix "dockerfile-" - :group 'languages) - -(defcustom dockerfile-mode-hook nil - "*Hook called by `dockerfile-mode'." - :type 'hook - :group 'dockerfile) - -(defcustom dockerfile-mode-command "docker" - "Which binary to use to build images" - :group 'dockerfile - :type 'string) - -(defcustom dockerfile-use-sudo nil - "Runs docker builder command with sudo." - :type 'boolean - :group 'dockerfile) - -(defcustom dockerfile-build-args nil - "List of --build-arg to pass to docker build. - -Each element of the list will be passed as a separate - --build-arg to the docker build command." - :type '(repeat string) - :group 'dockerfile) - -(defface dockerfile-image-name - '((t (:inherit (font-lock-type-face bold)))) - "Face to highlight the base image name after FROM instruction.") - -(defface dockerfile-image-alias - '((t (:inherit (font-lock-constant-face bold)))) - "Face to highlight the base image alias inf FROM ... AS construct.") - -(defconst dockerfile--from-regex - (rx "from " (group (+? nonl)) (or " " eol) (? "as " (group (1+ nonl))))) - -(defvar dockerfile-font-lock-keywords - `(,(cons (rx (or line-start "onbuild ") - (group (or "from" "maintainer" "run" "cmd" "expose" "env" "arg" - "add" "copy" "entrypoint" "volume" "user" "workdir" "onbuild" - "label" "stopsignal" "shell" "healthcheck")) - word-boundary) - font-lock-keyword-face) - (,dockerfile--from-regex - (1 'dockerfile-image-name) - (2 'dockerfile-image-alias nil t)) - ,@(sh-font-lock-keywords) - ,@(sh-font-lock-keywords-2) - ,@(sh-font-lock-keywords-1)) - "Default `font-lock-keywords' for `dockerfile mode'.") - -(defvar dockerfile-mode-map - (let ((map (make-sparse-keymap)) - (menu-map (make-sparse-keymap))) - (define-key map "\C-c\C-b" #'dockerfile-build-buffer) - (define-key map "\C-c\M-b" #'dockerfile-build-no-cache-buffer) - (define-key map "\C-c\C-c" #'comment-region) - (define-key map [menu-bar dockerfile-mode] (cons "Dockerfile" menu-map)) - (define-key menu-map [dfc] - '(menu-item "Comment Region" comment-region - :help "Comment Region")) - (define-key menu-map [dfb] - '(menu-item "Build" dockerfile-build-buffer - :help "Send the Dockerfile to docker build")) - (define-key menu-map [dfb] - '(menu-item "Build without cache" dockerfile-build-no-cache-buffer - :help "Send the Dockerfile to docker build without cache")) - map)) - -(defvar dockerfile-mode-syntax-table - (let ((table (make-syntax-table))) - (modify-syntax-entry ?# "<" table) - (modify-syntax-entry ?\n ">" table) - (modify-syntax-entry ?' "\"" table) - (modify-syntax-entry ?= "." table) - table) - "Syntax table for `dockerfile-mode'.") - -(define-abbrev-table 'dockerfile-mode-abbrev-table nil - "Abbrev table used while in `dockerfile-mode'.") - -(unless dockerfile-mode-abbrev-table - (define-abbrev-table 'dockerfile-mode-abbrev-table ())) - -(defun dockerfile-indent-line-function () - "Indent lines in a Dockerfile. - -Lines beginning with a keyword are ignored, and any others are -indented by one `tab-width'." - (unless (member (get-text-property (point-at-bol) 'face) - '(font-lock-comment-delimiter-face font-lock-keyword-face)) - (save-excursion - (beginning-of-line) - (skip-chars-forward "[ \t]" (point-at-eol)) - (unless (equal (point) (point-at-eol)) ; Ignore empty lines. - ;; Delete existing whitespace. - (delete-char (- (point-at-bol) (point))) - (indent-to tab-width))))) - -(defun dockerfile-build-arg-string () - "Create a --build-arg string for each element in `dockerfile-build-args'." - (mapconcat (lambda (arg) (concat "--build-arg " (shell-quote-argument arg))) - dockerfile-build-args " ")) - -(defun dockerfile-standard-filename (file) - "Convert the FILE name to OS standard. -If in Cygwin environment, uses Cygwin specific function to convert the -file name. Otherwise, uses Emacs' standard conversion function." - (if (fboundp 'cygwin-convert-file-name-to-windows) - (s-replace "\\" "\\\\" (cygwin-convert-file-name-to-windows file)) - (convert-standard-filename file))) - -(defun dockerfile-tag-string (image-name) - "Return a --tag shell-quoted IMAGE-NAME string or an empty string if image-name is blank." - (if (string= image-name "") "" (format "--tag %s " (shell-quote-argument image-name)))) - -(defvar dockerfile-image-name nil - "Name of the dockerfile currently being used. -This can be set in file or directory-local variables.") -(define-obsolete-variable-alias 'docker-image-name 'dockerfile-image-name) - -(defvar dockerfile-image-name-history nil - "History of image names read by `dockerfile-read-image-name'.") - -(defun dockerfile-read-image-name () - "Read a docker image name." - (read-string "Image name: " dockerfile-image-name 'dockerfile-image-name-history)) - - -;;;###autoload -(defun dockerfile-build-buffer (image-name &optional no-cache) - "Build an image called IMAGE-NAME based upon the buffer. - -If prefix arg NO-CACHE is set, don't cache the image. -The build string will be of the format: -`sudo docker build --no-cache --tag IMAGE-NAME --build-args arg1.. -f filename directory`" - - (interactive (list (dockerfile-read-image-name) prefix-arg)) - (save-buffer) - (compilation-start - (format - "%s%s build %s %s %s -f %s %s" - (if dockerfile-use-sudo "sudo " "") - dockerfile-mode-command - (if no-cache "--no-cache" "") - (dockerfile-tag-string image-name) - (dockerfile-build-arg-string) - (shell-quote-argument (dockerfile-standard-filename (buffer-file-name))) - (shell-quote-argument (dockerfile-standard-filename default-directory))) - nil - (lambda (_) (format "*docker-build-output: %s *" image-name)))) - -;;;###autoload -(defun dockerfile-build-no-cache-buffer (image-name) - "Build an image called IMAGE-NAME based upon the buffer without cache." - (interactive (list (dockerfile-read-image-name))) - (dockerfile-build-buffer image-name t)) - -(defun dockerfile--imenu-function () - "Find the previous headline from point. - -Search for a FROM instruction. If an alias is used this is -returned, otherwise the base image name is used." - (when (re-search-backward dockerfile--from-regex nil t) - (let ((data (match-data))) - (when (match-string 2) - ;; we drop the first match group because - ;; imenu-generic-expression can only use one offset, so we - ;; normalize to `1'. - (set-match-data (list (nth 0 data) (nth 1 data) (nth 4 data) (nth 5 data)))) - t))) - -;;;###autoload -(define-derived-mode dockerfile-mode prog-mode "Dockerfile" - "A major mode to edit Dockerfiles. -\\{dockerfile-mode-map} -" - (set-syntax-table dockerfile-mode-syntax-table) - (set (make-local-variable 'imenu-generic-expression) - `(("Stage" dockerfile--imenu-function 1))) - (set (make-local-variable 'require-final-newline) mode-require-final-newline) - (set (make-local-variable 'comment-start) "#") - (set (make-local-variable 'comment-end) "") - (set (make-local-variable 'comment-start-skip) "#+ *") - (set (make-local-variable 'parse-sexp-ignore-comments) t) - (set (make-local-variable 'font-lock-defaults) - '(dockerfile-font-lock-keywords nil t)) - (setq local-abbrev-table dockerfile-mode-abbrev-table) - (set (make-local-variable 'indent-line-function) #'dockerfile-indent-line-function)) - -;;;###autoload -(add-to-list 'auto-mode-alist '("Dockerfile\\(?:\\..*\\)?\\'" . dockerfile-mode)) - -(provide 'dockerfile-mode) - -;;; dockerfile-mode.el ends here diff --git a/elpa/dockerfile-mode-20200106.2126/dockerfile-mode.elc b/elpa/dockerfile-mode-20200106.2126/dockerfile-mode.elc deleted file mode 100644 index 8a8609e1477751111f9ea502ba4fcf07a9dd3092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10084 zcmbta`*YjI5%w#I%}m^Be^8T2r&)oqMLGtD0QivQB(@~miKdR7u{zV4nra0SM-mYU zFaRi-t^2?C+r0w`zS^|Wh$L{h=ictO-|pe@^OwiJzjp0f>G9*obR3T-;YbB?6GrrW z?DtZ-R7o1f5xK3JCr_@zY)JlSMDZjG$KgNx43E=VNgn=r7^c)mFEmY6O2I7h$6=3x zxR+*07!A^gc$%ac`9YupnvdcBPBO3F`0p-LzlqN3~RaUp_V^~V$VwST2jsnVTg z%I?L1BCF%o>-adk9oOLt{&|K=np`qU=EuPbaLT7b+3ujlvOGg?rf!6@(d77|J*vL(!n;aiWc+ zX3@bYj4r5RI+hM?DLTmf0a-7g!1NLW& zb3MV49}TAd0L@qCf9WTo--XdFrfiR)LH00?FQ`9_dTg)!%eG48w{@diT1Z&!898TU zJ@}sMb7k0OcSh$c{q6BWv)M$EbiDEuN-Kg{>%Z)LV}xm894b3yjP;jc*c(zejQnIq zS~tE$YlF-e@n#wUcw{eiZ!q+HW`bSZ91H2j@kqh` z3#*X9Z9f^L+q-`m0=?os+4j6P&wJvhDgPD+u63eL^xVfX)kuvMGyv_gA%KbdxC*f+ zKq+nsar-Ixl&T2;EmNInwSR6_>^ol)7E(#nMERK!R&`Z5ShI?Y6xrIqWkr=rMwNpw z8mc73)j}J2k3}URrBP7DA5@t8!3u}rU^v1jlcjWh?3;8+(xu-A8qtwx8Z^tBX!%brBfs>Zrlua+u- z>Pum9hIT&zJS1wMV2XTAold3p)ss%Aii;-)xPAX+euGuWQ@O7`v8tu=)22tyRNtSD zGCE&~^+L_A;v`7-1Uk+aA|bZcz1kNt8(4F3F6+%{#YecekL~~;y(4@HP!cX${MDxN z(UF0|wSKf@7n87;RxRuN8`c>|+9vgKrP!D6Ai&dPAm#6SQZ(kGcrw#vO3EVn&XU
1^K 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 -;; Maintainer: Robert Wyrick -;; Keywords: convenience -;; Package-Version: 20180312.2300 -;; Version: 1.13 -;; URL: https://github.com/wyrickre/dot-mode -;; Package-Requires: ((emacs "24.3")) - -;;; This program is free software; you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 1, 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. - -;;; A copy of the GNU General Public License can be obtained from -;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA -;;; 02139, USA. - -;;; Commentary: - -;; -;; Purpose of this package: minor mode to repeat typing or commands -;; -;; Installation instructions -;; -;; Install this file somewhere in your load path, byte-compile it and -;; add one of the following to your .emacs file (remove the comment -;; delimiters ;-) -;; -;; If you only want dot-mode to activate when you press "C-.", add the -;; the following to your .emacs: -;; -;; (autoload 'dot-mode "dot-mode" nil t) ; vi `.' command emulation -;; (global-set-key [(control ?.)] (lambda () (interactive) (dot-mode 1) -;; (message "Dot mode activated."))) -;; -;; If you want dot-mode all the time (like me), add the following to -;; your .emacs: -;; -;; (require 'dot-mode) -;; (add-hook 'find-file-hooks 'dot-mode-on) -;; -;; You may still want to use the global-set-key above.. especially if you -;; use the *scratch* buffer. -;; -;; To toggle dot mode on or off type `M-x dot-mode' -;; -;; There are only two variables that allow you to modify how dot-mode -;; behaves: -;; dot-mode-ignore-undo -;; dot-mode-global-mode -;; -;; dot-mode-ignore-undo - defaults to t. When nil, it will record keystrokes -;; that generate an undo just like any other keystroke that changed the -;; buffer. I personally find that annoying, but if you want dot-mode to -;; always remember your undo's: -;; (setq dot-mode-ignore-undo nil) -;; Besides, you can always use dot-mode-override to record an undo when -;; you need to (or even M-x undo). -;; -;; dot-mode-global-mode - defaults to t. When t, dot-mode only has one -;; keyboard command buffer. That means you can make a change in one -;; buffer, switch buffers, then repeat the change. When set to nil, -;; each buffer gets its own command buffer. That means that after -;; making a change in a buffer, if you switch buffers, that change -;; cannot repeated. If you switch back to the first buffer, your -;; change can then be repeated again. This has a nasty side effect -;; if your change yanks from the kill-ring (You could end up -;; yanking text you killed in a different buffer). -;; If you want to set this to nil, you should do so before dot-mode -;; is activated on any buffers. Otherwise, you may end up with some -;; buffers having a local command buffer and others using the global -;; one. -;; -;; Usage instructions: -;; -;; `C-.' is bound to dot-mode-execute, which executes the buffer of -;; stored commands as a keyboard macro. -;; -;; `C-M-.' is bound to dot-mode-override, which will cause dot-mode -;; to remember the next keystroke regardless of whether it -;; changes the buffer and regardless of the value of the -;; dot-mode-ignore-undo variable. -;; -;; `C-c-.' is bound to dot-mode-copy-to-last-kbd-macro, which will -;; copy the current dot mode keyboard macro to the last-kbd-macro -;; variable. It can then be executed via call-last-kbd-macro -;; (normally bound to `C-x-e'), named via name-last-kbd-macro, -;; and then inserted into your .emacs via insert-kbd-macro. -;; -;; Known bugs: -;; -;; none -;; - -;;; COMMENTARY -;;; -;;; This mode is written to address one argument in the emacs vs. vi -;;; jihad :-) It emulates the vi `redo' command, repeating the -;;; immediately preceding sequence of commands. This is done by -;;; recording input commands which change the buffer, i.e. not motion -;;; commands. - -;;; DESIGN -;;; -;;; The heart of this minor mode is a state machine. The function -;;; dot-mode-after-change is called from after-change-functions and -;;; sets a variable (is there one already? I couldn't find it) which -;;; is examined by dot-mode-loop, called from from post-command-hook. -;;; This variable, dot-mode-changed, is used in conjunction with -;;; dot-mode-state to move to the next state in the state machine. -;;; The state machine is hard coded into dot-mode-loop in the -;;; interests of speed; it uses two normal states (idle and store) -;;; and two corresponding override states which allow the user to -;;; forcibly store commands which do not change the buffer. -;;; -;;; TODO -;;; * Explore using recent-keys for this functionality - -;;; Code: - -(defconst dot-mode-version "1.13" - "Report bugs to: Robert Wyrick ") - -;;; CHANGE HISTORY -;;; -;;; 1.1 -;;; Wrote dot-mode.el -;;; -;;; 1.2 -;;; At the suggestion of Scott Evans , added -;;; 'dot-mode-override' to allow the user to force dot mode to store a -;;; motion command -;;; -;;; 1.3 -;;; Changed dot-mode-loop to use a state machine instead of several -;;; booleans -;;; -;;; 1.4 -;;; Hard coded the state machine into dot-mode-loop in the hope of -;;; speeding it up -;;; -;;; 1.5 -;;; Ported to GNU Emacs - nearly: the keymap doesn't seem to install -;;; correctly. -;;; -;;; 1.6 -;;; Rob Wyrick (that's me) took over maintenance of the package from -;;; Jim Gillespie. -;;; -;;; In some versions of Emacs, (this-command-keys) returns a empty -;;; vector by the time it is called from the 'post-command-hook. -;;; So, I split the functionality... now dot-mode-command-keys -;;; stores (this-command-keys) output in a temp variable to be used -;;; by dot-mode-loop and dot-mode-command-keys is called from the -;;; pre-command-hook. Also re/ported to XEmacs/GNU Emacs. It works -;;; on both now. dot-mode-command-keys could have been put on the -;;; after-change-functions hook, but I've begun preliminary work to -;;; capture what's going on in the minibuffer and I'm certain I need -;;; it where it is. -;;; -;;; 1.7 -;;; Added my first attempt to capture what the user is doing with -;;; execute-extended-command (M-x). It even works if the executed -;;; command prompts the user. -;;; Also added some error recovery if the user interrupts or there is -;;; an error during execution of the stored macro. -;;; -;;; 1.8 -;;; Second attempt to capture what the user is doing with -;;; execute-extended-command (M-x). The previous version didn't work -;;; in XEmacs. This version works in both XEmacs and GNUEmacs. -;;; -;;; 1.9 -;;; Third attempt to capture what the user is doing with -;;; execute-extended-command (M-x). Wow was I making things hard. -;;; It's cost me a lot of version numbers in a short amount of time, -;;; so we won't discuss my previous attempts. *grin* My second attempt -;;; worked just fine, but it was more complicated and maybe not as -;;; portable to older version of X/GNU Emacs. -;;; Other things: -;;; - Yet another restructuring of the code. By doing so, -;;; quoted-insert (C-q) is properly stored by dot-mode. -;;; (quoted-insert has been broken since ver 1.6) -;;; - Deleted an extraneous state and the "extended-state" added -;;; in ver 1.8. We're down to just two normal states and two -;;; override states. -;;; - Added dot-mode-ignore-undo and dot-mode-global-mode variables -;;; as well as the new function dot-mode-copy-to-last-kbd-macro. -;;; -;;; 1.10 -;;; Fixed a bug where the META key wasn't properly recorded on GNU -;;; Emacs. Actually, if you used ESC for META (like me), everything -;;; worked fine. But using ALT for META was broken. -;;; Now I'm using this-command-keys-vector when I can. -;;; I also added the dot-mode-event-to-string function to make the -;;; output a little prettier. -;;; Thanks to Scott Evans for reporting the bug! -;;; -;;; 1.11 -;;; Fixed a bug where dot-mode would give an error if you used -;;; dot-mode-override to record a and then tried to call -;;; dot-mode-execute. The bug was in dot-mode-event-to-string -;;; Thanks to Scott Evans for reporting the bug! -;;; -;;; 1.12 -;;; Make calls to make-local-hook optional for Emacs 24 compatibility. -;;; Use kmacro-display for displaying the macro string. -;;; -;;; 1.13 -;;; Misc updates to follow elisp progression and add tests. -;;; Remove XEmacs compatibility. - -(require 'kmacro) - -(defvar dot-mode-global-mode t - "Should dot-mode share its command buffer between buffers?") - -(defvar dot-mode-ignore-undo t - "Should dot-mode ignore undo?") - -(defvar dot-mode-changed nil - "Did last command change buffer?") - -(defvar dot-mode-cmd-buffer nil - "Saved commands.") - -(defvar dot-mode-cmd-keys nil - "Saved keys.") - -(defvar dot-mode-state 0 - "Current state of dot mode. -0 - Initial (no changes) -1 - Recording buffer changes -2 - Override from state 0 -3 - Override from state 1") - -(defvar dot-mode-minibuffer-input nil - "Global buffer to capture minibuffer input") - -(defvar dot-mode-verbose t - "Message the user every time a repeat happens") - -;; n.b. This is a little tricky ... when the prefix-argument is changed it -;; doesn't leave much of a trace. It resets `this-command' and -;; `real-this-command' to the previous ones. -;; Hence the best way (that I know of) to tell whether the last command was -;; changing the prefix is by adding a hook into -;; `prefix-command-preserve-state-hook'. -(defvar dot-mode-prefix-arg nil - "Marker variable to show the prefix argument has been changed.") - -(defvar dot-mode-argument-buffer nil - "Global buffer to store current digit argument.") - -(defun dot-mode-buffer-to-string () - "Return the macro buffer as a string." - (kmacro-display dot-mode-cmd-buffer)) - -(defun dot-mode-minibuffer-exit () - "Catch minibuffer exit" - ;; I'd really like to check `this-command' to see if it's `exit-minibuffer' - ;; and remove this function from the `minibuffer-exit-hook' if it is. - ;; Unfortunately, if an extended command asks for 2 or more arguments, - ;; the first arg would be the only one to get recorded since `exit-minibuffer' - ;; is called between each argument. - (push (minibuffer-contents) dot-mode-minibuffer-input)) - -(defun dot-mode-after-change (start end prevlen) - "Dot mode's `after-change-functions' hook" - ;; By the time we get here, `dot-mode-pre-hook' has already setup - ;; `dot-mode-cmd-keys.' It'll be a `vector', `t', or `nil'. - (cond ((vectorp dot-mode-cmd-keys) - ;; We just did `execute-extended-command' or an override. - ;; If we're in override, the keys have already been read and - ;; `dot-mode-changed' is `t' - (unless dot-mode-changed - (remove-hook 'minibuffer-exit-hook 'dot-mode-minibuffer-exit) - (unless (null dot-mode-minibuffer-input) - ;; The first item in this list is what was in the minibuffer - ;; after choosing the command from either - ;; `execute-extended-command' or `smex'. - ;; This may very well not be the name of the command, so we - ;; replace it with the head of the list - ;; `extended-command-history'. - (setq dot-mode-cmd-keys - (vconcat dot-mode-cmd-keys - (mapconcat - #'identity - (cons (car extended-command-history) - (cdr (nreverse dot-mode-minibuffer-input))) - "\r")))))) - ;; Normal mode - (dot-mode-cmd-keys - (setq dot-mode-cmd-keys (this-command-keys-vector)))) - ;; Else, do nothing `dot-mode-cmd-keys' will remain `nil'. - ;; (Only happens on `ignore-undo') - (when dot-mode-cmd-keys - (setq dot-mode-changed t))) - -(defun dot-mode-pre-hook () - "Dot mode's `pre-command-hook'" - - ;; remove hook (should already be removed... but double check) - ;; The only time this will ever do any good is if you did a - ;; quit out of the minibuffer. In that case, the hook will - ;; still be there. It won't really hurt anything, it will just - ;; continue to record everything you do in the minibuffer - ;; regardless of whether or not it is an `execute-extended-command'. - ;; And the `dot-mode-minibuffer-input' buffer could get quite large. - (remove-hook 'minibuffer-exit-hook 'dot-mode-minibuffer-exit) - - (cond - ;; Is this an `execute-extended-command' or `smex'? - ((member this-command '(execute-extended-command smex)) - (setq dot-mode-minibuffer-input nil - ;; Must get this (M-x) now! It's gone later. - dot-mode-cmd-keys (this-command-keys-vector) - ;; ignore an override - dot-mode-changed nil) - ;; Must be a global hook - (add-hook 'minibuffer-exit-hook 'dot-mode-minibuffer-exit)) - (dot-mode-changed ;; on override, `dot-mode-changed' is t - ;; Always read the keys here on override _UNLESS_ it's a `quoted-insert'. - ;; This is to make sure we capture keys that don't change the buffer. - ;; On `quoted-insert', all we get here is , but in `dot-mode-after-change', - ;; we get  plus the following key (and we're guaranteed to change the - ;; buffer) - (setq dot-mode-cmd-keys (or (eq this-command 'quoted-insert) - (this-command-keys-vector)))) - ;; Should we ignore this key sequence? (is it an undo?) - ((and dot-mode-ignore-undo - (member this-command '(advertised-undo undo undo-tree-undo undo-tree-redo))) - (setq dot-mode-cmd-keys nil)) - ;; signal to read later (in `dot-mode-after-change') - (t (setq dot-mode-cmd-keys t)))) - -;; (defun dot-mode--state-name () -;; (nth dot-mode-state '("Initial (no changes)" -;; "Recording buffer changes" -;; "Override from recording" -;; "Override from initial"))) - -(defun dot-mode-prefix-command-hook () (setq dot-mode-prefix-arg t)) -(defun dot-mode-loop () - "The heart of dot mode." - ;; (message "in:\tstate: \"%s\"\n\tcommand: \"%S\"" - ;; (dot-mode--state-name) this-command) - ;; (message "in: cmd-buffer is '%s'" (dot-mode-buffer-to-string)) - - ;; Record all digit-argument and universal-argument functions - (cond (dot-mode-prefix-arg - ;; Keep this keypress around, and don't change the current state - (setq dot-mode-prefix-arg nil - dot-mode-argument-buffer (vconcat dot-mode-argument-buffer (this-command-keys-vector)))) - ((= dot-mode-state 0) ; idle - (if dot-mode-changed - (setq dot-mode-state 1 - dot-mode-changed nil - dot-mode-cmd-buffer (vconcat dot-mode-argument-buffer dot-mode-cmd-keys))) - (setq dot-mode-argument-buffer nil)) - ((= dot-mode-state 1) ; recording - (if dot-mode-changed - (setq dot-mode-changed nil - dot-mode-cmd-buffer (vconcat dot-mode-cmd-buffer dot-mode-argument-buffer dot-mode-cmd-keys)) - (setq dot-mode-state 0)) - (setq dot-mode-argument-buffer nil)) - (t ; = 2 or 3 ; override - (setq dot-mode-state (- dot-mode-state 2) - dot-mode-changed t))) - ;; (message "out: state is \"%s\"" (dot-mode--state-name)) - ;; (message "out: cmd-buffer is '%s'" (dot-mode-buffer-to-string)) - ) - -(defun dot-mode-remove-hooks () - (remove-hook 'pre-command-hook 'dot-mode-pre-hook t) - (remove-hook 'post-command-hook 'dot-mode-loop t) - (remove-hook 'after-change-functions 'dot-mode-after-change t) - (remove-hook 'prefix-command-preserve-state-hook 'dot-mode-prefix-command-hook t)) - -(defun dot-mode-add-hooks () - (add-hook 'pre-command-hook 'dot-mode-pre-hook nil t) - (add-hook 'post-command-hook 'dot-mode-loop nil t) - (add-hook 'after-change-functions 'dot-mode-after-change nil t) - (add-hook 'prefix-command-preserve-state-hook 'dot-mode-prefix-command-hook nil t)) - -;;;###autoload -(defun dot-mode-copy-to-last-kbd-macro () - "Copy the current `dot-mode' command buffer to the `last-kbd-macro' variable. -Then it can be called with `call-last-kbd-macro', named with -`name-last-kbd-macro', or even saved for later use with -`name-last-kbd-macro'" - (interactive) - (if (null dot-mode-cmd-buffer) - (message "Nothing to copy.") - (setq last-kbd-macro dot-mode-cmd-buffer) - (message "Copied."))) - -;;;###autoload -(defun dot-mode-execute () - "Execute stored commands." - (interactive) - ;; Don't want execution to kick off infinite recursion - (if (null dot-mode-cmd-buffer) - (message "Nothing to repeat") - (dot-mode-remove-hooks) - ;; Do the business - (when dot-mode-verbose - (message "Repeating \"%s\"" (dot-mode-buffer-to-string))) - (condition-case nil - (execute-kbd-macro dot-mode-cmd-buffer) - ((error quit exit) - (setq dot-mode-cmd-buffer nil - dot-mode-state 0) - (message "Dot mode reset"))) - (if (and (not (null dot-mode-cmd-buffer)) - dot-mode-verbose) - ;; I message before AND after a macro execution. - ;; This way you'll know if your macro somehow - ;; hangs during execution. - (message "Repeated \"%s\"" (dot-mode-buffer-to-string))) - ;; Put the hooks back - (dot-mode-add-hooks))) - -;;;###autoload -(defun dot-mode-override () - "Unconditionally store next keystroke." - (interactive) - (setq dot-mode-state (+ dot-mode-state 2)) - ;; If dot-mode-argument-buffer is non nil then we were in the middle (or at - ;; the end of a argument chain). In that case we take care to not break it. - ;; If it is `nil', then `universal-argument--mode' was not previously active, - ;; and we don't activate it in order to avoid changing behaviour. - ;; n.b. We're checking `dot-mode-argument-buffer' as a variable that happens - ;; to be `nil' when we weren't in an argument chain, it's *not* the "thing - ;; we're interested in". - (when dot-mode-argument-buffer - ;; The docstring of `prefix-command-update' says we need to call it whenever - ;; we change the "prefix command state". - (progn(prefix-command-update) - (setq prefix-arg current-prefix-arg) - (universal-argument--mode))) - (message "dot-mode will remember the next keystroke...")) - -;;;###autoload -(define-minor-mode dot-mode - "Dot mode mimics the `.' function in vi, repeating sequences of -commands and/or typing delimited by motion events. Use `C-.' -rather than just `.'." nil " Dot" - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-.") 'dot-mode-execute) - (define-key map (kbd "C-M-.") 'dot-mode-override) - (define-key map (kbd "C-c .") 'dot-mode-copy-to-last-kbd-macro) - map) - (if (not dot-mode) - (dot-mode-remove-hooks) - (dot-mode-add-hooks) - (if dot-mode-global-mode - (progn - (kill-local-variable 'dot-mode-cmd-buffer) - (kill-local-variable 'dot-mode-cmd-keys) - (kill-local-variable 'dot-mode-state) - (kill-local-variable 'dot-mode-changed) - (kill-local-variable 'dot-mode-prefix-arg) - (kill-local-variable 'dot-mode-argument-buffer)) - ;; ELSE - (make-local-variable 'dot-mode-cmd-buffer) - (make-local-variable 'dot-mode-cmd-keys) - (make-local-variable 'dot-mode-state) - (make-local-variable 'dot-mode-changed) - (make-local-variable 'dot-mode-prefix-arg) - (make-local-variable 'dot-mode-argument-buffer) - (setq dot-mode-state 0 - dot-mode-changed nil - dot-mode-cmd-buffer nil - dot-mode-cmd-keys nil - dot-mode-prefix-arg nil - dot-mode-argument-buffer nil)))) - -;;;###autoload -(defun dot-mode-on () - "Turn on dot-mode." - (interactive) - ;; Ignore internal buffers -- this stops modifications in the echo area being - ;; recorded as a macro that gets used elsewhere. - (unless (or (eq ?\ (aref (buffer-name) 0)) - ;; Also ignore the *Messages* buffer -- when `dot-mode' is enabled - ;; here some recursion happens due to the `after-change-functions' - ;; in that buffer getting called. - (eq (current-buffer) (messages-buffer)) - ;; I suspect all minibuffers will have a space at the start of - ;; their buffer name, and hence I won't need this check. - ;; Unfortunately I can't find any documentation - ;; disproving/confirming this, so we include this check. - (minibufferp)) - (dot-mode 1))) - -;;;###autoload -(defalias 'turn-on-dot-mode 'dot-mode-on) -;;;###autoload -(define-global-minor-mode global-dot-mode dot-mode dot-mode-on) - -(provide 'dot-mode) - -;;; dot-mode.el ends here diff --git a/elpa/dot-mode-20180312.2300/dot-mode.elc b/elpa/dot-mode-20180312.2300/dot-mode.elc deleted file mode 100644 index 2a65a362047041b083b2b4d43f4d35d798545673..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11248 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 -;; Author: John Miller - -;; This file is NOT part of GNU Emacs. - -;; ein-cell.el is free software: you can redistribute 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. - -;; ein-cell.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-cell.el. If not, see . - -;;; Commentary: - -;; Implementation note. Current implementation of cell has redundant -;; and not-guaranteed-to-be consistent information: `element' and -;; `ein:$node'. This part must be moved to ein-node.el module to -;; make it well capsuled. - -;; IPython has cell.js, codecell.js and textcell.js. -;; But let's start with one file. - -;;; Code: - -(require 'ansi-color) -(require 'comint) -(require 'ein-core) -(require 'ein-classes) -(require 'ein-log) -(require 'ein-node) -(require 'ein-kernel) -(require 'ein-output-area) - -(autoload 'mm-encode-buffer "mm-encode") -(autoload 'mm-possibly-verify-or-decrypt "mm-decode") -(autoload 'mm-dissect-singlepart "mm-decode") -(autoload 'mm-display-external "mm-decode") -(autoload 'mm-handle-media-type "mm-decode") - -(defun ein:cell--ewoc-delete (ewoc &rest nodes) - "Delete NODES from EWOC." - (ewoc--set-buffer-bind-dll-let* ewoc - ((L nil) (R nil) (last (ewoc--last-node ewoc))) - (dolist (node nodes) - (let ((inhibit-read-only t) - (buffer-undo-list t)) - ;; If we are about to delete the node pointed at by last-node, - ;; set last-node to nil. - (when (eq last node) - (setf last nil (ewoc--last-node ewoc) nil)) - (delete-region (ewoc--node-start-marker node) - (ewoc--node-start-marker (ewoc--node-next dll node))) - (set-marker (ewoc--node-start-marker node) nil) - (setf L (ewoc--node-left node) - R (ewoc--node-right node) - ;; Link neighbors to each other. - (ewoc--node-right L) R - (ewoc--node-left R) L - ;; Forget neighbors. - (ewoc--node-left node) nil - (ewoc--node-right node) nil))))) - -(defun ein:cell--ewoc-invalidate (ewoc &rest nodes) - "Call EWOC's pretty-printer (`ein:worksheet-pp') for each element in NODES." - (ewoc--set-buffer-bind-dll-let* ewoc - ((pp (ewoc--pretty-printer ewoc))) - (save-excursion - (dolist (node nodes) - (let ((inhibit-read-only t) - (buffer-undo-list t) - (m (ewoc--node-start-marker node)) - (R (ewoc--node-right node))) - ;; First, remove the string from the buffer: - (delete-region m (ewoc--node-start-marker R)) - ;; Calculate and insert the string. - (goto-char m) - (funcall pp (ewoc--node-data node)) - (ewoc--adjust m (point) R dll)))))) - -;;; Faces - -(defface ein:cell-input-prompt - '((t :inherit header-line)) - "Face for cell input prompt" - :group 'ein) - -(defface ein:cell-input-area - '((((class color) (background light)) - :background "honeydew1") - (((class color) (background dark)) - :background "#383838")) - "Face for cell input area" - :group 'ein) - -(defface ein:cell-output-area - '() - "Face for cell output area" - :group 'ein) - -(defface ein:cell-output-area-error - '() - "Face for cell output area errors" - :group 'ein) - -(defface ein:cell-output-prompt - '((t :inherit header-line)) - "Face for cell output prompt" - :group 'ein) - -(defface ein:cell-output-stderr - '((((class color) (background light)) - :background "PeachPuff") - (((class color) (background dark)) - :background "#8c5353")) - "Face for stderr cell output" - :group 'ein) - -(defface ein:pos-tip-face - '((t (:inherit 'popup-tip-face))) - "Face for tooltip when using pos-tip backend." - :group 'ein) - -;;; Customization - -(make-obsolete-variable 'ein:enable-dynamic-javascript nil "0.17.0") - -(defcustom ein:cell-traceback-level 1 - "Number of traceback stack to show. -Hidden tracebacks are not discarded. -You can view them using \\[ein:tb-show]." - :type '(choice (integer :tag "Depth of stack to show" 1) - (const :tag "Show all traceback" nil)) - :group 'ein) - -(defcustom ein:cell-max-num-outputs nil - "Number of maximum outputs to be shown by default. -To view full output, use `ein:notebook-show-in-shared-output'." - :type '(choice (integer :tag "Number of outputs to show" 5) - (const :tag "Show all traceback" nil)) - :group 'ein) - -(defcustom ein:truncate-long-cell-output nil - "When nil do not truncate cells with long outputs. When set to -a number will limit the number of lines in a cell output." - :type '(choice (integer :tag "Number of lines to show in a cell" 5) - (const :tag "Do not truncate cells with long outputs" nil)) - :group 'ein) - -(defcustom ein:on-execute-reply-functions nil - "List of functions to call after receiving an \"execute_reply\" - message on the shell channel, just before updating the - worksheet. Each function should have the same call signature as - `ein:cell--handle-execute-reply'." - :type 'list - :group 'ein) - -;;; EIEIO related utils - -(defmacro ein:oset-if-empty (obj slot value) - `(unless (and (slot-boundp ,obj ,slot) (slot-value ,obj ,slot)) - (setf (slot-value ,obj, slot) ,value))) - -(defmacro ein:oref-safe (obj slot) - `(when (slot-boundp ,obj ,slot) - (slot-value ,obj ,slot))) - -(defun ein:make-mm-handle (image) - (let ((mime-type (mailcap-extension-to-mime - (symbol-name (plist-get (cdr image) :type))))) - (with-temp-buffer - (save-excursion (insert (plist-get (cdr image) :data))) - (let* ((encoding (mm-encode-buffer (list mime-type))) - (coded (decode-coding-string (buffer-string) 'us-ascii))) - (erase-buffer) - (insert "\n" coded) - (mm-possibly-verify-or-decrypt - (mm-dissect-singlepart (list mime-type) encoding) - (list mime-type)))))) - -(defun ein:external-image-viewer (image-type) - (let (major ; Major encoding (text, etc) - minor ; Minor encoding (html, etc) - info ; Other info - major-info ; (assoc major mailcap-mime-data) - viewers ; Possible viewers - passed ; Viewers that passed the test - viewer ; The one and only viewer - (ctl (mail-header-parse-content-type (concat "image/" image-type)))) - (mailcap-parse-mailcaps nil t) - (setq major (split-string (car ctl) "/")) - (setq minor (cadr major) - major (car major)) - (when (setq major-info (cdr (assoc major mailcap-mime-data))) - (when (setq viewers (mailcap-possible-viewers major-info minor)) - (setq info (mapcar (lambda (a) - (cons (symbol-name (car a)) (cdr a))) - (cdr ctl))) - (dolist (entry viewers) - (when (mailcap-viewer-passes-test entry info) - (push entry passed))) - (setq passed (sort (nreverse passed) 'mailcap-viewer-lessp)) - ;; When we want to prefer entries from the user's - ;; ~/.mailcap file, then we filter out the system entries - ;; and see whether we have anything left. - (when (if (boundp 'mailcap-prefer-mailcap-viewers) - mailcap-prefer-mailcap-viewers - t) - (when-let ((user-entry - (seq-find (lambda (elem) - (eq (cdr (assq 'source elem)) 'user)) - passed))) - (setq passed (list user-entry)))) - (setq viewer (car passed)))) - (when (and (stringp (cdr (assq 'viewer viewer))) - passed) - (setq viewer (car passed))) - (mailcap-unescape-mime-test (cdr (assq 'viewer viewer)) info))) - -(defun ein:insert-image (image) - (condition-case-unless-debug err - (let ((buffer-undo-list t)) - (insert-image image ".")) - (error (ein:log 'warn "Could not insert image: %s" (error-message-string err))))) - -(defun ein:cell-class-from-type (type) - (ein:case-equal type - (("code") 'ein:codecell) - (("text") 'ein:textcell) - (("html") 'ein:htmlcell) - (("markdown") 'ein:markdowncell) - (("raw") 'ein:rawcell) - (("shared-output") 'ein:shared-output-cell) - (t (error "No cell type called %S" type)))) - -(defun ein:cell-from-type (type &rest args) - (apply (ein:cell-class-from-type type) args)) - -(defun ein:cell--determine-cell-type (json-data) - (plist-get json-data :cell_type)) - -(defun ein:cell-from-json (data &rest args) - (let ((cell (ein:cell-init (apply #'ein:cell-from-type - (ein:cell--determine-cell-type data) args) - data))) - (aif (plist-get data :metadata) - (ein:oset-if-empty cell 'metadata it)) - cell)) - -(cl-defmethod ein:cell-init ((cell ein:codecell) data) - (ein:oset-if-empty cell 'outputs (mapcar (lambda (o) - (if (and (plist-member o :metadata) - (not (plist-get o :metadata))) - (plist-put o :metadata (make-hash-table)) - o)) - (plist-get data :outputs))) - (ein:oset-if-empty cell 'input (or (plist-get data :input) - (plist-get data :source))) - (aif (plist-get data :prompt_number) - (ein:oset-if-empty cell 'input-prompt-number it) - (aif (plist-get data :execution_count) - (ein:oset-if-empty cell 'input-prompt-number it))) - (ein:oset-if-empty cell 'collapsed - (let ((v (or (plist-get data :collapsed) - (plist-get (slot-value cell 'metadata) - :collapsed)))) - (if (eql v json-false) nil v))) - cell) - -(cl-defmethod ein:cell-init ((cell ein:textcell) data) - (aif (plist-get data :source) - (setf (slot-value cell 'input) it)) - cell) - -(cl-defmethod ein:cell-convert ((cell ein:basecell) type) - (let ((new (ein:cell-from-type type))) - ;; copy attributes - (cl-loop for k in '(read-only ewoc) - do (setf (slot-value new k) (slot-value cell k))) - ;; copy input - (setf (slot-value new 'input) (if (ein:cell-active-p cell) - (ein:cell-get-text cell) - (slot-value cell 'input))) - ;; copy output when the new cell has it - (when (memq :output (slot-value new 'element-names)) - (setf (slot-value new 'outputs) (mapcar 'identity (slot-value cell 'outputs)))) - new)) - -(cl-defmethod ein:cell-convert ((cell ein:codecell) type) - (let ((new (cl-call-next-method))) - (when (and (cl-typep new 'ein:codecell) - (slot-boundp cell :kernel)) - (setf (slot-value new 'kernel) (slot-value cell 'kernel))) - new)) - -(cl-defmethod ein:cell-copy ((cell ein:basecell)) - (ein:cell-convert cell (slot-value cell 'cell-type))) - -(cl-defmethod ein:cell-convert-inplace ((cell ein:basecell) type) - "Convert CELL to TYPE and redraw corresponding ewoc nodes." - (let ((new (ein:cell-convert cell type))) - ;; copy element attribute - (cl-loop for k in (slot-value new 'element-names) - with old-element = (slot-value cell 'element) - do (progn - (setf (slot-value new 'element) - (plist-put (slot-value new 'element) k - (plist-get old-element k))))) - ;; setting ewoc nodes - (cl-loop for en in (ein:cell-all-element cell) - for node = (ewoc-data en) - do (setf (ein:$node-data node) new)) - (let ((inhibit-read-only t) - (buffer-undo-list t)) ; disable undo recording - ;; delete ewoc nodes that is not copied - (apply - #'ewoc-delete (slot-value new 'ewoc) - (apply - #'append - (cl-loop for name in (slot-value cell 'element-names) - unless (memq name (slot-value new 'element-names)) - collect (let ((ens (ein:cell-element-get cell name))) - (if (listp ens) ens (list ens)))))) - ;; draw ewoc node - (cl-loop with ewoc = (slot-value new 'ewoc) - for en in (ein:cell-all-element new) - do (ein:cell--ewoc-invalidate ewoc en))) - new)) - -;;; Getter/setter - -(cl-defmethod ein:cell-num-outputs ((cell ein:codecell)) - (length (slot-value cell 'outputs))) - -(cl-defmethod ein:cell-num-outputs ((cell ein:textcell)) - 0) - -(cl-defmethod ein:cell-element-get ((cell ein:basecell) prop &rest args) - "Return ewoc node named PROP in CELL. - If PROP is `:output' a list of ewoc nodes is returned. - A specific node can be specified using optional ARGS." - (if (memq prop (slot-value cell 'element-names)) - (plist-get (slot-value cell 'element) prop) - (error "PROP %s is not supported." prop))) - -(cl-defmethod ein:cell-element-get ((cell ein:codecell) prop &optional index) - (let ((element (slot-value cell 'element))) - (if index - (progn - (assert (eql prop :output)) - (nth index (plist-get element prop))) - (case prop - (:after-input - (aif (nth 0 (plist-get element :output)) - it - (plist-get element :footer))) - (:after-output (plist-get element :footer)) - (:before-input (plist-get element :prompt)) - (:before-output (plist-get element :input)) - (:last-output - (aif (plist-get element :output) - (car (last it)) - (plist-get element :input))) - (t (cl-call-next-method)))))) - -(cl-defmethod ein:cell-element-get ((cell ein:textcell) prop &rest args) - (let ((element (slot-value cell 'element))) - (case prop - (:after-input (plist-get element :footer)) - (:before-input (plist-get element :prompt)) - (t (cl-call-next-method))))) - -(cl-defmethod ein:cell-all-element ((cell ein:basecell)) - (list (ein:cell-element-get cell :prompt) - (ein:cell-element-get cell :input) - (ein:cell-element-get cell :footer))) - -(cl-defmethod ein:cell-all-element ((cell ein:codecell)) - (append (cl-call-next-method) - (ein:cell-element-get cell :output))) - -(cl-defmethod ein:cell-language ((cell ein:basecell)) - "Programming language used for CELL. -Return language name as a string or `nil' when not defined. - (fn cell)") - -(cl-defmethod ein:cell-language ((cell ein:codecell)) - (ein:and-let* ((kernel (ein:oref-safe cell 'kernel)) - (kernelspec (ein:$kernel-kernelspec kernel))) - (ein:$kernelspec-language kernelspec))) -(cl-defmethod ein:cell-language ((cell ein:markdowncell)) nil "markdown") -(cl-defmethod ein:cell-language ((cell ein:htmlcell)) nil "html") -(cl-defmethod ein:cell-language ((cell ein:rawcell)) nil "rst") - -(defun ein:cell-make-element (make-node num-outputs) - (let ((buffer-undo-list t)) ; disable undo recording - (list - :prompt (funcall make-node 'prompt) - :input (funcall make-node 'input) - :output (cl-loop for i from 0 below num-outputs - collect (funcall make-node 'output i)) - :footer (funcall make-node 'footer)))) - -(cl-defmethod ein:cell-enter-last ((cell ein:basecell)) - (let* ((ewoc (slot-value cell 'ewoc)) - ;; Use `cell' as data for ewoc. Use the whole cell data even - ;; if it is not used, to access it from the notebook buffer. - ;; It is equivalent to `this.element.data("cell", this)' in - ;; IPython.Cell (see cell.js). - (make-node - (lambda (&rest path) - (ewoc-enter-last ewoc (ein:node-new `(cell ,@path) cell)))) - (element (ein:cell-make-element make-node - (ein:cell-num-outputs cell)))) - (setf (slot-value cell 'element) element) - cell)) - -(cl-defmethod ein:cell-enter-first ((cell ein:basecell)) - (let* ((ewoc (slot-value cell 'ewoc)) - (node nil) - (make-node - (lambda (&rest path) - (let ((ewoc-data (ein:node-new `(cell ,@path) cell))) - (setq node - (if node - (ewoc-enter-after ewoc node ewoc-data) - (ewoc-enter-first ewoc ewoc-data)))))) - (element (ein:cell-make-element make-node - (ein:cell-num-outputs cell)))) - (setf (slot-value cell 'element) element) - cell)) - -(cl-defmethod ein:cell-insert-below ((base-cell ein:basecell) other-cell) - (let* ((ewoc (slot-value base-cell 'ewoc)) - (node (ein:cell-element-get base-cell :footer)) - (make-node - (lambda (&rest path) - (setq node (ewoc-enter-after - ewoc node (ein:node-new `(cell ,@path) other-cell))))) - (element (ein:cell-make-element make-node - (ein:cell-num-outputs other-cell)))) - (setf (slot-value other-cell 'element) element) - other-cell)) - -(defun ein:cell-pp (path data) - (case (car path) - (prompt (ein:cell-insert-prompt data)) - (input (ein:cell-insert-input data)) - (output (ein:cell-insert-output (cadr path) data)) - (footer (ein:cell-insert-footer data)))) - -(cl-defmethod ein:cell-insert-prompt ((cell ein:codecell)) - "Insert prompt of the CELL in the buffer. - Called from ewoc pretty printer via `ein:cell-pp'." - ;; Newline is inserted in `ein:cell-insert-input'. - (ein:insert-read-only - (format "In [%s]:" (or (ein:oref-safe cell 'input-prompt-number) " ")) - 'font-lock-face 'ein:cell-input-prompt)) - -(cl-defmethod ein:cell-insert-prompt ((cell ein:textcell)) - (ein:insert-read-only - (format "%s:" (slot-value cell 'cell-type)) - 'font-lock-face 'ein:cell-input-prompt)) - -(cl-defmethod ein:cell-insert-input ((cell ein:basecell)) - "Insert input of the CELL in the buffer. - Called from ewoc pretty printer via `ein:cell-pp'." - (let ((start (1+ (point)))) - ;; Newlines must allow insertion before/after its position. - (insert (propertize "\n" 'read-only t 'rear-nonsticky t)) - (insert (or (ein:oref-safe cell 'input) "") - (propertize "\n" 'read-only t)) - ;; Highlight background using overlay. - (let ((ol (make-overlay start (point)))) - (overlay-put ol 'face (ein:cell-get-input-area-face cell)) - ;; `evaporate' = `t': Overlay is deleted when the region become empty. - (overlay-put ol 'evaporate t)))) - -(cl-defmethod ein:cell-get-input-area-face ((cell ein:basecell)) - "Return the face (symbol) for input area." - 'ein:cell-input-area) - -(cl-defmethod ein:cell-get-output-area-face-for-output-type (output-type) - "Return the face (symbol) for output area." - (ein:case-equal output-type - (("pyout") 'ein:cell-output-area) - (("pyerr") 'ein:cell-output-area-error) - (("error") 'ein:cell-output-area-error) - (("display_data") 'ein:cell-output-area) - (("execute_result") 'ein:cell-output-area) - (("stream") 'ein:cell-output-area))) - -(defun ein:cell-insert-output (index cell) - "Insert INDEX-th output of the CELL in the buffer. - Called from ewoc pretty printer via `ein:cell-pp'." - (if (or (slot-value cell 'collapsed) - (and ein:cell-max-num-outputs - (>= index ein:cell-max-num-outputs))) - (progn - (when (and (not (slot-value cell 'collapsed)) - (= index ein:cell-max-num-outputs) - (> (point) (point-at-bol))) - ;; The first output which exceeds `ein:cell-max-num-outputs'. - (ein:insert-read-only "\n")) - (ein:insert-read-only ".")) - (let ((out (nth index (slot-value cell 'outputs)))) - ;; Handle newline for previous stream output. - ;; In IPython JS, it is handled in `append_stream' because JS - ;; does not need to care about newline (DOM does it for JS). - ;; FIXME: Maybe I should abstract ewoc in some way and get rid - ;; of this. - (let ((last-out (and (> index 0) - (nth (1- index) (slot-value cell 'outputs))))) - ;; If previous output is stream type, consider adding newline - (when (and last-out - (equal (plist-get last-out :output_type) "stream")) - ;; Check if the last output is from the same stream. - ;; If so, do *NOT* insert newline, otherwise insert newline. - (unless (and (equal (plist-get out :output_type) "stream") - (equal (plist-get out :stream) - (plist-get last-out :stream))) - (ein:cell-append-stream-text-fontified "\n" last-out)))) - ;; Finally insert real data - (let ((start (point)) - (output-type (plist-get out :output_type))) - (ein:case-equal output-type - (("pyout") (ein:cell-append-pyout cell out)) - (("pyerr") (ein:cell-append-pyerr cell out)) - (("error") (ein:cell-append-pyerr cell out)) - (("display_data") (ein:cell-append-display-data cell out)) - (("execute_result") (ein:cell-append-pyout cell out)) - (("stream") (ein:cell-append-stream cell out))) - (let ((ol (make-overlay start (point)))) - (overlay-put ol 'face (ein:cell-get-output-area-face-for-output-type output-type)) - (overlay-put ol 'evaporate t)))))) - -(cl-defmethod ein:cell-insert-footer ((cell ein:basecell)) - "Insert footer (just a new line) of the CELL in the buffer. - Called from ewoc pretty printer via `ein:cell-pp'." - (ein:insert-read-only "\n")) - -(cl-defmethod ein:cell-insert-footer :before ((cell ein:codecell)) - (if (or (slot-value cell 'collapsed) - (and ein:cell-max-num-outputs - (> (ein:cell-num-outputs cell) ein:cell-max-num-outputs))) - ;; Add a newline after the last ".". - (ein:insert-read-only "\n") - (let ((last-out (car (last (slot-value cell 'outputs))))) - (when (equal (plist-get last-out :output_type) "stream") - (ein:cell-append-stream-text-fontified "\n" last-out))))) - -(defun ein:cell-node-p (node &optional element-name) - (let* ((path (ein:$node-path node)) - (p0 (car path)) - (p1 (cadr path)) - (cell (ein:$node-path node))) - (and cell (eql p0 'cell) (or (not element-name) (eql p1 element-name))))) - -(defun ein:cell-ewoc-node-p (ewoc-node &optional element-name) - (ein:cell-node-p (ewoc-data ewoc-node) element-name)) - -(defun ein:cell-from-ewoc-node (ewoc-node) - (ein:aand ewoc-node (ewoc-data it) (ein:$node-data it))) - -(cl-defmethod ein:cell-input-pos-min ((cell ein:basecell)) - "Return editable minimum point in the input area of the CELL. - If the input area of the CELL does not exist, return `nil'" - (let* ((input-node (ein:cell-element-get cell :input))) - ;; 1+ for skipping newline - (when input-node (1+ (ewoc-location input-node))))) - -(cl-defmethod ein:cell-input-pos-max ((cell ein:basecell)) - "Return editable maximum point in the input area of the CELL. - If the input area of the CELL does not exist, return `nil'" - (let* ((ewoc (slot-value cell 'ewoc)) - (input-node (ein:cell-element-get cell :input))) - ;; 1- for skipping newline - (when input-node (1- (ewoc-location (ewoc-next ewoc input-node)))))) - -(cl-defmethod ein:cell-get-text ((cell ein:basecell)) - "Grab text in the input area of the cell at point." - (if (ein:cell-active-p cell) - (let* ((beg (ein:cell-input-pos-min cell)) - (end (ein:cell-input-pos-max cell))) - (buffer-substring beg end)) - (slot-value cell 'input))) - -(cl-defmethod ein:cell-set-text ((cell ein:basecell) text) - (let* ((input-node (ein:cell-element-get cell :input)) - (ewoc (slot-value cell 'ewoc)) - ;; 1+/1- is for skipping newline - (beg (1+ (ewoc-location input-node))) - (end (1- (ewoc-location (ewoc-next ewoc input-node))))) - (save-excursion - ;; probably it is better to set :input and update via ewoc? - (goto-char beg) - (delete-region beg end) - (insert text)))) - -(cl-defmethod ein:cell-save-text ((cell ein:basecell)) - (setf (slot-value cell 'input) (ein:cell-get-text cell))) - -(cl-defmethod ein:cell-deactivate ((cell ein:basecell)) - (setf (slot-value cell 'element) nil) - cell) - -(cl-defmethod ein:cell-active-p ((cell ein:basecell)) - (slot-value cell 'element)) - -(cl-defmethod ein:cell-running-set ((cell ein:codecell) running) - "FIXME: change the appearance of the cell" - (setf (slot-value cell 'running) running)) - -(cl-defmethod ein:cell-set-collapsed ((cell ein:codecell) collapsed) - "Set `:collapsed' slot of CELL and invalidate output ewoc nodes." - (unless (eq (slot-value cell 'collapsed) collapsed) - (setf (slot-value cell 'collapsed) collapsed) - (let ((inhibit-read-only t) - (buffer-undo-list t)) - (apply #'ein:cell--ewoc-invalidate - (slot-value cell 'ewoc) - (append (ein:cell-element-get cell :output) - (list (ein:cell-element-get cell :footer))))))) - -(cl-defmethod ein:cell-collapse ((cell ein:codecell)) - (ein:cell-set-collapsed cell t)) - -(cl-defmethod ein:cell-expand ((cell ein:codecell)) - (ein:cell-set-collapsed cell nil)) - -(cl-defmethod ein:cell-toggle-output ((cell ein:codecell)) - "Toggle `:collapsed' slot of CELL and invalidate output ewoc nodes." - (ein:cell-set-collapsed cell (not (slot-value cell 'collapsed)))) - -(cl-defmethod ein:cell-invalidate-prompt ((cell ein:codecell)) - (let ((inhibit-read-only t) - (buffer-undo-list t)) ; disable undo recording - (ein:cell--ewoc-invalidate (slot-value cell 'ewoc) - (ein:cell-element-get cell :prompt)))) - -(cl-defmethod ein:cell-set-input-prompt ((cell ein:codecell) &optional number) - (setf (slot-value cell 'input-prompt-number) number) - (ein:cell-invalidate-prompt cell)) - -(cl-defmethod ein:cell-goto ((cell ein:basecell) &optional relpos prop) - "Go to the input area of the given CELL. -RELPOS is the position relative to the input area. Default is 0. -PROP is a name of cell element. Default is `:input'. - -\(fn cell relpos prop)" - (unless relpos (setq relpos 0)) - (unless prop (setq prop :input)) - (ewoc-goto-node (slot-value cell 'ewoc) (ein:cell-element-get cell prop)) - (let ((offset (case prop - ((:input :before-output) 1) - (:after-input -1) - (t 0)))) - (forward-char (+ relpos offset)))) - -(cl-defmethod ein:cell-goto-line ((cell ein:basecell) &optional inputline prop) - "Go to the input area of the given CELL. -INPUTLINE is the line number relative to the input area. Default is 1. -PROP is a name of cell element. Default is `:input'. - -\(fn cell inputline prop)" - (unless inputline (setq inputline 1)) - (unless prop (setq prop :input)) - (let ((goal-column nil)) - (ewoc-goto-node (slot-value cell 'ewoc) (ein:cell-element-get cell prop))) - (let ((offset (case prop - ((:input :before-output) 1) - (:after-input -1) - (t 0)))) - (forward-char offset) - (forward-line (- inputline 1)))) - - -(cl-defmethod ein:cell-relative-point ((cell ein:basecell) &optional pos) - "Return the point relative to the input area of CELL. -If the position POS is not given, current point is considered." - (unless pos (setq pos (point))) - (- pos (1+ (ewoc-location (ein:cell-element-get cell :input))))) - -(cl-defmethod ein:cell-location ((cell ein:basecell) &optional elm end) - "Return the starting location of CELL. -ELM is a name (keyword) of element that `ein:cell-element-get' -understands. Note that you can't use `:output' since it returns -a list. Use `:after-input' instead. -If END is non-`nil', return the location of next element." - (unless elm (setq elm :prompt)) - (let ((element (slot-value cell 'element))) - (when end - (setq elm (case elm - (:prompt :input) - (:input :after-input) - (:output :after-output))) - (unless elm - (setq cell (ein:cell-next cell)) - (setq elm :prompt))) - (if cell - (ewoc-location (ein:cell-element-get cell elm)) - (assert end) - (point-max)))) - -(cl-defmethod ein:cell-buffer ((cell ein:basecell)) - "Return a buffer associated by CELL (if any)." - (ein:aand (ein:oref-safe cell 'ewoc) (ewoc-buffer it))) - -(cl-defmethod ein:cell-clear-output ((cell ein:codecell) stdout stderr other) - "codecell.js in IPython implements it using timeout and callback. - As it is unclear why timeout is needed, just clear output - instantaneously for now." - (ein:log 'debug "cell-clear-output stdout=%s stderr=%s other=%s" - stdout stderr other) - (setf (slot-value cell 'traceback) nil) - (let ((ewoc (slot-value cell 'ewoc)) - (output-nodes (ein:cell-element-get cell :output))) - (if (and stdout stderr other) - (progn - ;; clear all - (apply #'ein:cell--ewoc-delete ewoc output-nodes) - (plist-put (slot-value cell 'element) :output nil) - (setf (slot-value cell 'outputs) nil)) - (let* ((ewoc-node-list - (append - (when stdout (ein:node-filter output-nodes :is 'output-stdout)) - (when stderr (ein:node-filter output-nodes :is 'output-stderr)) - (when stdout (ein:node-filter output-nodes - :is 'output-subarea - :not 'output-stderr - :not 'output-stdout)))) - (indices - (mapcar (lambda (n) (last (ein:$node-path (ewoc-data n)))) - ewoc-node-list))) - ;; remove from buffer - (apply #'ein:cell--ewoc-delete ewoc ewoc-node-list) - ;; remove from `:element' - (let* ((element (slot-value cell 'element)) - (old-output (plist-get element :output)) - (new-ouptut (ein:remove-by-index old-output indices))) - (plist-put element :output new-ouptut)) - ;; remove cleared outputs from internal data - (setf (slot-value cell 'outputs) - (ein:remove-by-index (slot-value cell 'outputs) indices)))) - ;; Footer may have extra (possibly colored) newline due to the - ;; last output type. So invalidate it here. - ;; See `ein:cell-insert-footer' (for codecell). - (ein:cell--ewoc-invalidate ewoc (ein:cell-element-get cell :footer)))) - -(defun ein:cell-output-json-to-class (json) - (ein:case-equal (plist-get json :output_type) - (("pyout") - '(output-subarea)) - (("pyerr") - '(output-subarea)) - (("error") - '(output-subarea)) - (("display_data") - '(output-subarea)) - (("execute_result") - '(output-subarea)) - (("stream") - (list 'output-stream 'output-subarea - (intern (format "output-%s" (plist-get json :stream))))))) - -(cl-defmethod ein:cell-append-output ((cell ein:codecell) json) - "When there is a python error, we actually get two identical tracebacks back - from the kernel, one from the \"shell\" channel, and one from the \"iopub\" - channel. As a workaround, we remember the cell's traceback and ignore - traceback outputs that are identical to the one we already have." - (let ((new-tb (plist-get json :traceback)) - (old-tb (slot-value cell 'traceback))) - (when (or - (null old-tb) - (null new-tb) - (not (cl-equalp new-tb old-tb))) - (ein:cell-actually-append-output cell json)) - (setf (slot-value cell 'traceback) new-tb))) - -(cl-defmethod ein:cell-actually-append-output ((cell ein:codecell) json) - (ein:cell-expand cell) - (setf (slot-value cell 'outputs) - (append (slot-value cell 'outputs) (list json))) - (let* ((ewoc (slot-value cell 'ewoc)) - (index (1- (ein:cell-num-outputs cell))) - (path `(cell output ,index)) - (class (ein:cell-output-json-to-class json)) - (data (ein:node-new path cell class)) - (last-node (ein:cell-element-get cell :last-output)) - (ewoc-node (ewoc-enter-after ewoc last-node data)) - (element (slot-value cell 'element))) - (plist-put element :output - (append (plist-get element :output) (list ewoc-node))) - (ein:cell--ewoc-invalidate ewoc (ein:cell-element-get cell :footer)))) - -(cl-defmethod ein:cell-append-pyout ((cell ein:codecell) json) - "Insert pyout type output in the buffer. -Called from ewoc pretty printer via `ein:cell-insert-output'." - (ein:insert-read-only (format "Out [%s]:" - (or (plist-get json :prompt_number) - (plist-get json :execution_count) - " ")) - 'font-lock-face 'ein:cell-output-prompt) - (ein:insert-read-only "\n") - (ein:cell-append-mime-type json (not (ein:oref-safe cell 'kernel))) - (ein:insert-read-only "\n")) - -(cl-defmethod ein:cell-append-pyerr ((cell ein:codecell) json) - "Insert pyerr type output in the buffer. -Called from ewoc pretty printer via `ein:cell-insert-output'." - (mapc (lambda (tb) - (ein:cell-append-text tb) - (ein:cell-append-text "\n")) - (let ((tb (plist-get json :traceback)) - (level ein:cell-traceback-level)) - (if (and level (> (- (length tb) 2) level)) - (cons (substitute-command-keys - "\nTruncated Traceback (Use \\[ein:tb-show-km] to view full TB):") - (last tb (1+ level))) - tb))) - (ein:insert-read-only "\n")) - -(ein:deflocal ein:%cell-append-stream-last-cell% nil - "The last cell in which `ein:cell-append-stream' is used.") - -(cl-defmethod ein:cell-append-stream ((cell ein:codecell) json) - "Insert stream type output in the buffer. -Called from ewoc pretty printer `ein:worksheet-pp'." - (unless (eq cell ein:%cell-append-stream-last-cell%) - ;; Avoid applying unclosed ANSI escape code in the cell. Note - ;; that I don't need to distinguish stdout/stderr because it looks - ;; like normal terminal does not. - (setq ansi-color-context nil)) - (ein:cell-append-stream-text-fontified (or (plist-get json :text) "") json) - - ;; NOTE: newlines for stream is handled in `ein:cell-insert-output'. - ;; So do not insert newline here. - (setq ein:%cell-append-stream-last-cell% cell)) - -(defun ein:cell-append-stream-text-fontified (text json) - "Insert TEXT with font properties defined by JSON data." - (if (equal (plist-get json :stream) "stderr") - (ein:cell-append-text text 'font-lock-face 'ein:cell-output-stderr) - (ein:cell-append-text text))) - -(cl-defmethod ein:cell-append-display-data ((cell ein:codecell) json) - "Insert display-data type output in the buffer. -Called from ewoc pretty printer via `ein:cell-insert-output'." - (ein:cell-append-mime-type json (not (ein:oref-safe cell 'kernel))) - (ein:insert-read-only "\n")) - -(make-obsolete-variable 'ein:output-type-preference nil "0.17.0") - -(defun ein:cell-extract-image-format (mime-type) - "From :image/svg+xml to \"svg\"." - (let* ((mime-str (if (symbolp mime-type) (symbol-name mime-type) mime-type)) - (minor-kw (car (nreverse (split-string mime-str "/")))) - (minor (car (nreverse (split-string minor-kw ":"))))) - (cl-subseq minor 0 (cl-search "+" minor)))) - -(defun ein:cell-append-mime-type (json starting-p) - (ein:output-area-case-type - json - (cl-case type - ((:text/html) - (funcall (ein:output-area-get-html-renderer) value)) - ((:image/svg+xml :image/png :image/jpeg) - (let ((image (create-image (condition-case nil - (base64-decode-string value) - (error value)) - (intern-soft (ein:cell-extract-image-format type)) - t))) - (if ein:output-area-inlined-images - (ein:insert-image image) - (unless starting-p ;; don't display on ein:worksheet-render - (let* ((handle (ein:make-mm-handle image)) - (type (mm-handle-media-type handle)) - (method (seq-some (lambda (i) (cdr (assoc 'viewer i))) - (mailcap-mime-info type 'all)))) - (when (and (stringp method) (string-match "^[^% \t]+$" method)) - (setq method (concat method " %s"))) - (if (and (stringp method) (> (length method) 0)) - (mm-display-external handle method) - (ein:log 'warn "ein:cell-append-mime-type: %s" - "no viewer method found in mailcap"))))))) - (otherwise - (ein:insert-read-only value))))) - -(defun ein:cell-append-text (data &rest properties) - "escape ANSI in plaintext:" - (apply #'ein:insert-read-only (ansi-color-apply data) properties)) - -(defun ein:cell-safe-read-eval-insert (text) - (ein:insert-read-only - (condition-case err - (save-excursion - ;; given code can be `pop-to-buffer' or something. - (format "%S" (eval (read text)))) - (error - (ein:log 'warn "Got an error while executing: '%s'" - text) - (format "Error: %S" err))))) - -(cl-defmethod ein:cell-to-json ((cell ein:codecell)) - "Return json-ready alist." - `((input . ,(ein:cell-get-text cell)) - (cell_type . "code") - ,@(aif (ein:oref-safe cell 'input-prompt-number) - `((prompt_number . ,it))) - (outputs . ,(apply #'vector (slot-value cell 'outputs))) - (language . ,(or (ein:cell-language cell) "python")) - (collapsed . ,(if (slot-value cell 'collapsed) t json-false)))) - -(cl-defmethod ein:cell-to-nb4-json ((cell ein:codecell) wsidx) - (let ((execute-count (aif (ein:oref-safe cell 'input-prompt-number) - (and (numberp it) it))) - (metadata (slot-value cell 'metadata))) - `((source . ,(ein:cell-get-text cell)) - (cell_type . "code") - (execution_count . ,execute-count) - (outputs . ,(apply #'vector (slot-value cell 'outputs))) - (metadata . ,(plist-put metadata :collapsed (if (slot-value cell 'collapsed) t - json-false)))))) - - -(cl-defmethod ein:cell-to-json ((cell ein:textcell)) - `((cell_type . ,(slot-value cell 'cell-type)) - (source . ,(ein:cell-get-text cell)))) - -(cl-defmethod ein:cell-to-nb4-json ((cell ein:textcell) wsidx) - (let ((metadata (slot-value cell 'metadata))) - `((cell_type . ,(slot-value cell 'cell-type)) - (source . ,(ein:cell-get-text cell)) - (metadata . ,(plist-put metadata :collapsed json-false))))) - -(cl-defmethod ein:cell-next ((cell ein:basecell)) - "Return next cell of the given CELL or nil if CELL is the last one." - (aif (ewoc-next (slot-value cell 'ewoc) - (ein:cell-element-get cell :footer)) - (let ((cell (ein:$node-data (ewoc-data it)))) - (when (cl-typep cell 'ein:basecell) - cell)))) - -(cl-defmethod ein:cell-prev ((cell ein:basecell)) - "Return previous cell of the given CELL or nil if CELL is the first one." - (aif (ewoc-prev (slot-value cell 'ewoc) - (ein:cell-element-get cell :prompt)) - (let ((cell (ein:$node-data (ewoc-data it)))) - (when (cl-typep cell 'ein:basecell) - cell)))) - -(cl-defmethod ein:cell-set-kernel ((cell ein:codecell) kernel) - (setf (slot-value cell 'kernel) kernel)) - - -(cl-defmethod ein:cell-execute ((cell ein:codecell)) - (ein:cell-execute-internal cell - (slot-value cell 'kernel) - (ein:cell-get-text cell) - :silent nil)) - -(cl-defmethod ein:cell-execute-internal ((cell ein:codecell) - kernel code &rest args) - (ein:cell-running-set cell t) - (ein:cell-clear-output cell t t t) - (ein:cell-set-input-prompt cell "*") - (apply #'ein:kernel-execute kernel code (ein:cell-make-callbacks cell) args)) - -(cl-defmethod ein:cell-make-callbacks ((cell ein:codecell)) - (list - :execute_reply (cons #'ein:cell--handle-execute-reply cell) - :output (cons #'ein:cell--handle-output cell) - :clear_output (cons #'ein:cell--handle-clear-output cell) - :set_next_input (cons #'ein:cell--handle-set-next-input cell))) - -(cl-defmethod ein:cell--handle-execute-reply ((cell ein:codecell) content metadata) - (run-hook-with-args 'ein:on-execute-reply-functions cell content metadata) - (ein:cell-set-input-prompt cell (plist-get content :execution_count)) - (ein:cell-running-set cell nil) - (if (equal (plist-get content :status) "error") - (ein:cell--handle-output cell "error" content metadata) - (let ((events (slot-value cell 'events))) - (ein:events-trigger events 'set_dirty.Worksheet (list :value t :cell cell)) - (ein:events-trigger events 'maybe_reset_undo.Worksheet cell)))) - -(cl-defmethod ein:cell--handle-set-next-input ((cell ein:codecell) text) - (let ((events (slot-value cell 'events))) - (ein:events-trigger events 'set_next_input.Worksheet - (list :cell cell :text text)) - (ein:events-trigger events 'maybe_reset_undo.Worksheet cell))) - -(cl-defmethod ein:cell--handle-output ((cell ein:codecell) msg-type content _metadata) - (ein:log 'debug "ein:cell--handle-output (cell ein:codecell): %s" msg-type) - (let ((json `(:output_type ,msg-type))) - (cl-macrolet ((copy-props - (src tgt props) - `(mapc (lambda (kw) - (let ((val (plist-get ,src kw))) - (when (and (null val) (plist-member ,src kw)) - (setq val (make-hash-table))) - (setq ,tgt (plist-put ,tgt kw val)))) - ,props))) - (ein:case-equal msg-type - (("stream") - (copy-props content json '(:name :text))) - (("display_data") - (copy-props content json '(:data :metadata))) - (("execute_result" "pyout") - (copy-props content json '(:execution_count :data :metadata))) - (("error" "pyerr") - (copy-props content json '(:ename :evalue :traceback))) - (t - (ein:log 'error "ein:cell--handle-output: unhandled msg_type '%s'" msg-type) - (setq json nil)))) - (when json - (ein:cell-append-output cell json) - (ein:events-trigger (slot-value cell 'events) 'maybe_reset_undo.Worksheet cell)))) - -(cl-defmethod ein:cell--handle-clear-output ((cell ein:codecell) content - _metadata) - "Jupyter messaging spec 5.0 no longer has stdout, stderr, or other fields for clear_output" - (ein:cell-clear-output cell t t t) - (ein:events-trigger (slot-value cell 'events) 'maybe_reset_undo.Worksheet cell)) - -(cl-defmethod ein:cell-has-image-output-p ((cell ein:codecell)) - "Return `t' if given cell has image output, `nil' otherwise." - (seq-some (lambda (out) - (or (plist-member out :image/svg+xml) - (plist-member out :image/png) - (plist-member out :image/jpeg))) - (slot-value cell 'outputs))) - -(cl-defmethod ein:cell-has-image-output-p ((cell ein:textcell)) - nil) - -(cl-defmethod ein:cell-get-tb-data ((cell ein:codecell)) - (cl-loop for out in (slot-value cell 'outputs) - when (and (plist-get out :traceback) - (member (plist-get out :output_type) '("pyerr" "error"))) - return (plist-get out :traceback))) - -(provide 'ein-cell) - -;;; ein-cell.el ends here diff --git a/elpa/ein-20200415.238/ein-cell.elc b/elpa/ein-20200415.238/ein-cell.elc deleted file mode 100644 index 2a7d9ceb9a06989f29e52c21e14a7ec91cb7d3b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39837 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 - -;; This file is NOT part of GNU Emacs. - -;; ein-classes.el is free software: you can redistribute 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. - -;; ein-classes.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-worksheet.el. If not, see . - -;;; Commentary: - -;;; Content -(require 'eieio) - -(defstruct ein:$content - "Content returned from the Jupyter notebook server: -`ein:$content-url-or-port' - URL or port of Jupyter server. - -`ein:$content-name' - The name/filename of the content. Always equivalent to the last - part of the path field - -`ein:$content-path' - The full file path. It will not start with /, and it will be /-delimited. - -`ein:$content-type' - One of three values: :directory, :file, :notebook. - -`ein:$content-writable' - Indicates if requester has permission to modified the requested content. - -`ein:$content-created' - -`ein:$content-last-modified' - -`ein:$content-mimetype' - Specify the mime-type of :file content, null otherwise. - -`ein:$content-raw-content' - Contents of resource as returned by Jupyter. Depending on content-type will hold: - :directory : JSON list of models for each item in the directory. - :file : Text of file as a string or base64 encoded string if mimetype - is other than 'text/plain'. - :notebook : JSON structure of the file. - -`ein:$content-format' - Value will depend on content-type: - :directory : :json. - :file : Either :text or :base64 - :notebook : :json. - -" - url-or-port - notebook-version - name - path - type - writable - created - last-modified - mimetype - raw-content - format - session-p) -;;; Websockets - -(defstruct ein:$websocket - "A wrapper object of `websocket'. - -`ein:$websocket-ws' : an instance returned by `websocket-open' -`ein:$websocket-kernel' : kernel at the time of instantiation -`ein:$websocket-closed-by-client' : t/nil' -" - ws - kernel - closed-by-client) - -;;; Notebook -(defstruct ein:$notebook - "Hold notebook variables. - -`ein:$notebook-url-or-port' - URL or port of IPython server. - -`ein:$notebook-notebook-id' : string - uuid string (as of ipython 2.0 this is the same is notebook-name). - -`ein:$notebook-notebook-path' : string - Path to notebook. - -`ein:$notebook-kernel' : `ein:$kernel' - `ein:$kernel' instance. - -`ein:$notebook-kernelspec' : `ein:$kernelspec' - Jupyter kernel specification for the notebook. - -`ein:$notebook-kernelinfo' : `ein:kernelinfo' - `ein:kernelinfo' instance. - -`ein:$notebook-pager' - Variable for `ein:pager-*' functions. See ein-pager.el. - -`ein:$notebook-dirty' : boolean - Set to `t' if notebook has unsaved changes. Otherwise `nil'. - -`ein:$notebook-metadata' : plist - Notebook meta data (e.g., notebook name). - -`ein:$notebook-name' : string - Notebook name. - -`ein:$notebook-nbformat' : integer - Notebook file format version. - -`ein:$notebook-nbformat-minor' : integer - Notebook file format version. - -`ein:$notebook-events' : `ein:$events' - Event handler instance. - -`ein:$notebook-worksheets' : list of `ein:worksheet' - List of worksheets. - -`ein:$notebook-scratchsheets' : list of `ein:worksheet' - List of scratch worksheets. - -`ein:$notebook-api-version' : integer - Major version of the IPython notebook server we are talking to. -" - url-or-port - notebook-id ;; In IPython-2.0 this is "[:path]/[:name].ipynb" - notebook-path - kernel - kernelinfo - kernelspec - pager - dirty - metadata - notebook-name - nbformat - nbformat-minor - events - worksheets - scratchsheets - api-version) - - -;;; Worksheet -(defclass ein:worksheet () - ((nbformat :initarg :nbformat :type integer) - (get-notebook-name :initarg :get-notebook-name :type cons - :accessor ein:worksheet--notebook-name) - (saved-cells :initarg :saved-cells :initform nil - :accessor ein:worksheet--saved-cells - :documentation - "Slot to cache cells for worksheet without buffer") - (dont-save-cells :initarg :dont-save-cells :initform nil :type boolean - :accessor ein:worksheet--dont-save-cells-p - :documentation "Don't cache cells when this flag is on.") - (ewoc :initarg :ewoc :type ewoc :accessor ein:worksheet--ewoc) - (kernel :initarg :kernel :type ein:$kernel :accessor ein:worksheet--kernel) - (dirty :initarg :dirty :type boolean :initform nil :accessor ein:worksheet--dirty-p) - (metadata :initarg :metadata :initform nil :accessor ein:worksheet--metadata) - (events :initarg :events :accessor ein:worksheet--events))) - -;;; Kernel -(defstruct ein:$kernelspec - "Kernel specification as return by the Jupyter notebook server. - -`ein:$kernelspec-name' : string - Name used to identify the kernel (like python2, or python3). - -`ein:$kernelspec-display-name' : string - Name used to display kernel to user. - -`ein:$kernelspec-language' : string - Programming language supported by kernel, like 'python'. - -`ein:$kernelspec-resources' : plist - Resources, if any, used by the kernel. - -`ein:$kernelspec-spec' : plist - How the outside world defines kernelspec: - https://ipython.org/ipython-doc/dev/development/kernels.html#kernelspecs -" - name - display-name - resources - spec - language) - -;; FIXME: Rewrite `ein:$kernel' using `defclass'. It should ease -;; testing since I can mock I/O using method overriding. -(defstruct ein:$kernel - "Should perhaps be named ein:$session. We glom session and kernel as defined by the server as just ein:$kernel in the client. - -" - url-or-port - path - kernelspec - events - api-version - session-id - kernel-id - shell-channel - iopub-channel - websocket ; For IPython 3.x+ - base-url ; /api/kernels/ - kernel-url ; /api/kernels/ - ws-url ; ws://[:] - stdin-activep - username - msg-callbacks - oinfo-cache - ;; FIXME: Use event instead of hook. - after-start-hook - after-execute-hook) - - -;;; Cells - -(defclass ein:basecell () - ((cell-type :initarg :cell-type :type string :accessor ein:cell-type) - (read-only :initarg :read-only :initform nil :type boolean) - (ewoc :initarg :ewoc :type ewoc :accessor ein:basecell--ewoc) - (element :initarg :element :initform nil :type list - :documentation "ewoc nodes") - (element-names :initarg :element-names) - (input :initarg :input :type string - :documentation "Place to hold data until it is rendered via `ewoc'.") - (outputs :initarg :outputs :initform nil :type list) - (metadata :initarg :metadata :initform nil :type list :accessor ein:cell-metadata) - (events :initarg :events :type ein:events) - (cell-id :initarg :cell-id :initform (ein:utils-uuid) :type string - :accessor ein:cell-id)) - "Notebook cell base class") - -(defclass ein:codecell (ein:basecell) - ((traceback :initform nil :initarg :traceback :type list) - (cell-type :initarg :cell-type :initform "code") - (kernel :initarg :kernel :type ein:$kernel :accessor ein:cell-kernel) - (element-names :initform (:prompt :input :output :footer)) - (input-prompt-number :initarg :input-prompt-number - :documentation "\ -Integer or \"*\" (running state). -Implementation note: -Typed `:input-prompt-number' becomes a problem when reading a -notebook that saved "*". So don't add `:type'!") - (collapsed :initarg :collapsed :initform nil :type boolean) - (running :initarg :running :initform nil :type boolean))) - -(defclass ein:textcell (ein:basecell) - ((cell-type :initarg :cell-type :initform "text") - (element-names :initform (:prompt :input :footer)))) - -(defclass ein:htmlcell (ein:textcell) - ((cell-type :initarg :cell-type :initform "html"))) - -(defclass ein:markdowncell (ein:textcell) - ((cell-type :initarg :cell-type :initform "markdown"))) - -(defclass ein:rawcell (ein:textcell) - ((cell-type :initarg :cell-type :initform "raw"))) - -;;; Notifications - -(defclass ein:notification-status () - ((status :initarg :status :initform nil) - (message :initarg :message :initform nil) - (s2m :initarg :s2m)) - "Hold status and its string representation (message).") - -(defclass ein:notification-tab () - ((get-list :initarg :get-list :type function) - (get-current :initarg :get-current :type function) - (get-name :initarg :get-name :type function) - (get-buffer :initarg :get-buffer :type function) - (delete :initarg :delete :type function) - (insert-prev :initarg :insert-prev :type function) - (insert-next :initarg :insert-next :type function) - (move-prev :initarg :move-prev :type function) - (move-next :initarg :move-next :type function) - ) - ;; These "methods" are for not depending on what the TABs for. - ;; Probably I'd want change this to be a separated Emacs lisp - ;; library at some point. - "See `ein:notification-setup' for explanation.") - -(defclass ein:notification () - ((buffer :initarg :buffer :type buffer :document "Notebook buffer") - (tab :initarg :tab :type ein:notification-tab) - (execution-count - :initform "y" :initarg :execution-count - :documentation "Last `execution_count' sent by `execute_reply'.") - (notebook - :initarg :notebook - :initform - (ein:notification-status - "NotebookStatus" - :s2m - '((notebook_saving.Notebook . "Saving notebook...") - (notebook_saved.Notebook . "Notebook saved") - (notebook_save_failed.Notebook . "Failed saving notebook!"))) - :type ein:notification-status) - (kernel - :initarg :kernel - :initform - (ein:notification-status - "KernelStatus" - :s2m - '((status_idle.Kernel . nil) - (status_busy.Kernel . "Kernel busy...") - (status_restarting.Kernel . "Kernel restarting...") - (status_restarted.Kernel . "Kernel restarted") - (status_dead.Kernel . "Kernel requires restart \\\\[ein:notebook-restart-session-command-km]") - (status_reconnecting.Kernel . "Kernel reconnecting...") - (status_reconnected.Kernel . "Kernel reconnected") - (status_disconnected.Kernel . "Kernel requires reconnect \\\\[ein:notebook-reconnect-session-command-km]"))) - :type ein:notification-status)) - "Notification widget for Notebook.") - -;;; Events - -(defclass ein:events () - ((callbacks :initarg :callbacks :type hash-table - :initform (make-hash-table :test 'eq))) - "Event handler class.") - - -(provide 'ein-classes) - -;;; ein-classes.el ends here diff --git a/elpa/ein-20200415.238/ein-classes.elc b/elpa/ein-20200415.238/ein-classes.elc deleted file mode 100644 index 1f91f11c4dc3dadf224cad496ef4a2e8bd5f53c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86041 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 diff --git a/elpa/ein-20200415.238/ein-completer.el b/elpa/ein-20200415.238/ein-completer.el deleted file mode 100644 index 41d98c8e..00000000 --- a/elpa/ein-20200415.238/ein-completer.el +++ /dev/null @@ -1,34 +0,0 @@ -;;; -*- mode: emacs-lisp; lexical-binding: t -*- -;;; ein-completer.el --- Completion module - -;; Copyright (C) 2018- Takafumi Arakaki / John Miller - -;; Author: Takafumi Arakaki / John Miller - -;; This file is NOT part of GNU Emacs. - -;; ein-completer.el is free software: you can redistribute 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. - -;; ein-completer.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-completer.el. If not, see . - -;;; Commentary: - -;; This needs to get re-written. - -;;; Code: - -(make-obsolete-variable 'ein:complete-on-dot nil "0.15.0") -(make-obsolete-variable 'ein:completion-backend nil "0.17.0") - -(provide 'ein-completer) - -;;; ein-completer.el ends here diff --git a/elpa/ein-20200415.238/ein-completer.elc b/elpa/ein-20200415.238/ein-completer.elc deleted file mode 100644 index 3ae325ee1222fe9c0e83875c27e5cd016041923e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmbtRJx{|h5bc~lzMUU`s5gB=NwR`}q^y!$b;&Idp#m4qLce32H5e;U%VhOq&JH34~eA2!K7 zBPMx#Uar?5T68D^M;s6KXe4+G0u3|@w8cLr=dXBB=rkz@q2cd zZF3AN5mqXQ>oUu@bMAt>ys3-42l}3z!Ra?RV_<$=7uh_9*ABNTv5mJ{vDyJ0VZ%pJ zWF7>cc|duKl6PxJL!71gG|l4Q1ANt_L9tc5)1IIA{La|}aWod -;; John M. Miller - -;; This file is NOT part of GNU Emacs. - -;; ein-contents-api.el is free software: you can redistribute 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. - -;; ein-contents-api.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-notebooklist.el. If not, see . - -;;; Commentary: -;;; -;;; An interface to the Jupyter Contents API as described in -;;; https://github.com/ipython/ipython/wiki/IPEP-27%3A-Contents-Service. -;;; - -;; - -;;; Code: - -(require 'ein-core) -(require 'ein-classes) -(require 'ein-utils) -(require 'ein-log) -(require 'ein-query) - -(declare-function ein:notebook-to-json "ein-notebook") -(declare-function ein:notebooklist-url "ein-notebooklist") - -(defcustom ein:content-query-max-depth 2 - "Don't recurse the directory tree deeper than this." - :type 'integer - :group 'ein) - -(defcustom ein:content-query-max-branch 6 - "Don't descend into more than this number of directories per depth. The total number of parallel queries should therefore be O({max_branch}^{max_depth})" - :type 'integer - :group 'ein) - -(make-obsolete-variable 'ein:content-query-timeout nil "0.17.0") - -(defcustom ein:force-sync nil - "When non-nil, force synchronous http requests." - :type 'boolean - :group 'ein) - -(defun ein:content-query-contents (url-or-port path callback errback &optional iteration) - "Register CALLBACK of arity 1 for the contents at PATH from the URL-OR-PORT. -ERRBACK of arity 1 for the contents." - (unless iteration - (setq iteration 0)) - (ein:query-singleton-ajax - (ein:notebooklist-url url-or-port path) - :type "GET" - :parser #'ein:json-read - :complete (apply-partially #'ein:content-query-contents--complete url-or-port path) - :success (apply-partially #'ein:content-query-contents--success url-or-port path callback) - :error (apply-partially #'ein:content-query-contents--error url-or-port path callback errback iteration))) - -(cl-defun ein:content-query-contents--complete (url-or-port path - &key data symbol-status response - &allow-other-keys - &aux (resp-string (format "STATUS: %s DATA: %s" (request-response-status-code response) data))) - (ein:log 'debug "ein:query-contents--complete %s" resp-string)) - -(cl-defun ein:content-query-contents--error (url-or-port path callback errback iteration &key symbol-status response error-thrown data &allow-other-keys) - (let ((status-code (request-response-status-code response))) ; may be nil! - (case status-code - (404 (ein:log 'error "ein:content-query-contents--error %s %s" - status-code (plist-get data :message)) - (when errback (funcall errback url-or-port status-code))) - (t (if (< iteration (if noninteractive 6 3)) - (progn - (ein:log 'verbose "Retry content-query-contents #%s in response to %s" iteration status-code) - (sleep-for 0 (* (1+ iteration) 500)) - (ein:content-query-contents url-or-port path callback errback (1+ iteration))) - (let ((notice - (format "ein:content-query-contents--error %s REQUEST-STATUS %s DATA %s" - (concat (file-name-as-directory url-or-port) path) - symbol-status (cdr error-thrown)))) - (if (and (eql status-code 403) noninteractive) - (progn - (ein:log 'info notice) - (when callback - (funcall callback (ein:new-content url-or-port path data)))) - (ein:log 'error notice) - (when errback (funcall errback url-or-port status-code))))))))) - -(cl-defun ein:content-query-contents--success (url-or-port path callback - &key data symbol-status response - &allow-other-keys) - (let (content) - (if (< (ein:notebook-version-numeric url-or-port) 3) - (setq content (ein:new-content-legacy url-or-port path data)) - (setq content (ein:new-content url-or-port path data))) - (when callback - (funcall callback content)))) - -(defun ein:fix-legacy-content-data (data) - (if (listp (car data)) - (cl-loop for item in data - collecting - (ein:fix-legacy-content-data item)) - (if (string= (plist-get data :path) "") - (plist-put data :path (plist-get data :name)) - (plist-put data :path (format "%s/%s" (plist-get data :path) (plist-get data :name)))))) - -(defun ein:content-to-json (content) - (let ((path (if (>= (ein:$content-notebook-version content) 3) - (ein:$content-path content) - (substring (ein:$content-path content) - 0 - (or (cl-position ?/ (ein:$content-path content) :from-end t) - 0))))) - (json-encode `((:type . ,(ein:$content-type content)) - (:name . ,(ein:$content-name content)) - (:path . ,path) - (:format . ,(or (ein:$content-format content) "json")) - (:content ,@(ein:$content-raw-content content)))))) - -(defun ein:content-from-notebook (nb) - (let ((nb-content (ein:notebook-to-json nb))) - (make-ein:$content :name (ein:$notebook-notebook-name nb) - :path (ein:$notebook-notebook-path nb) - :url-or-port (ein:$notebook-url-or-port nb) - :type "notebook" - :notebook-version (ein:$notebook-api-version nb) - :raw-content nb-content))) - -;;; Managing/listing the content hierarchy - -(defvar *ein:content-hierarchy* (make-hash-table :test #'equal) - "Content tree keyed by URL-OR-PORT.") - -(defun ein:content-need-hierarchy (url-or-port) - "Callers assume ein:content-query-hierarchy succeeded. If not, nil." - (aif (gethash url-or-port *ein:content-hierarchy*) it - (ein:log 'warn "No recorded content hierarchy for %s" url-or-port) - nil)) - -(defun ein:new-content-legacy (url-or-port path data) - "Content API in 2.x a bit inconsistent." - (if (plist-get data :type) - (ein:new-content url-or-port path data) - (let ((content (make-ein:$content - :url-or-port url-or-port - :notebook-version (ein:notebook-version-numeric url-or-port) - :path path))) - (setf (ein:$content-name content) (substring path (or (cl-position ?/ path) 0)) - (ein:$content-path content) path - (ein:$content-type content) "directory" - ;;(ein:$content-created content) (plist-get data :created) - ;;(ein:$content-last-modified content) (plist-get data :last_modified) - (ein:$content-format content) nil - (ein:$content-writable content) nil - (ein:$content-mimetype content) nil - (ein:$content-raw-content content) (ein:fix-legacy-content-data data)) - content))) - -(defun ein:new-content (url-or-port path data) - ;; data is like (:size 72 :content nil :writable t :path Untitled7.ipynb :name Untitled7.ipynb :type notebook) - (let ((content (make-ein:$content - :url-or-port url-or-port - :notebook-version (ein:notebook-version-numeric url-or-port) - :path path))) - (setf (ein:$content-name content) (plist-get data :name) - (ein:$content-path content) (plist-get data :path) - (ein:$content-type content) (plist-get data :type) - (ein:$content-created content) (plist-get data :created) - (ein:$content-last-modified content) (plist-get data :last_modified) - (ein:$content-format content) (plist-get data :format) - (ein:$content-writable content) (plist-get data :writable) - (ein:$content-mimetype content) (plist-get data :mimetype) - (ein:$content-raw-content content) (plist-get data :content)) - content)) - -(defun ein:content-query-hierarchy* (url-or-port path callback sessions depth content) - "Returns list (tree) of content objects. CALLBACK accepts tree." - (lexical-let* ((url-or-port url-or-port) - (path path) - (callback callback) - (items (ein:$content-raw-content content)) - (directories (if (< depth ein:content-query-max-depth) - (cl-loop for item in items - with result - until (>= (length result) ein:content-query-max-branch) - if (string= "directory" (plist-get item :type)) - collect (ein:new-content url-or-port path item) - into result - end - finally return result))) - (others (cl-loop for item in items - with c0 - if (not (string= "directory" (plist-get item :type))) - do (setf c0 (ein:new-content url-or-port path item)) - (setf (ein:$content-session-p c0) - (gethash (ein:$content-path c0) sessions)) - and collect c0 - end))) - (deferred:$ - (apply - #'deferred:parallel - (cl-loop for c0 in directories - collect - (lexical-let - ((c0 c0) - (d0 (deferred:new #'identity))) - (ein:content-query-contents - url-or-port - (ein:$content-path c0) - (apply-partially #'ein:content-query-hierarchy* - url-or-port - (ein:$content-path c0) - (lambda (tree) - (deferred:callback-post d0 (cons c0 tree))) - sessions (1+ depth)) - (lambda (&rest _args) (deferred:callback-post d0 (cons c0 nil)))) - d0))) - (deferred:nextc it - (lambda (tree) - (let ((result (append others tree))) - (when (string= path "") - (setf (gethash url-or-port *ein:content-hierarchy*) (-flatten result))) - (funcall callback result))))))) - -(defun ein:content-query-hierarchy (url-or-port callback) - "Send for content hierarchy of URL-OR-PORT with CALLBACK arity 1 for content hierarchy" - (ein:content-query-sessions - url-or-port - (apply-partially (lambda (url-or-port* callback* sessions) - (ein:content-query-contents url-or-port* "" - (apply-partially #'ein:content-query-hierarchy* - url-or-port* - "" - callback* sessions 0) - (lambda (&rest ignore) - (when callback* (funcall callback* nil))))) - url-or-port callback) - callback)) - -;;; Save Content - -(defsubst ein:content-url (content) - (ein:notebooklist-url (ein:$content-url-or-port content) - (ein:$content-path content))) - -(defun ein:content-save (content &optional callback cbargs errcb errcbargs) - (ein:query-singleton-ajax - (ein:content-url content) - :type "PUT" - :headers '(("Content-Type" . "application/json")) - :data (encode-coding-string (ein:content-to-json content) buffer-file-coding-system) - :success (apply-partially #'ein:content-save-success callback cbargs) - :error (apply-partially #'ein:content-save-error - (ein:content-url content) errcb errcbargs))) - -(cl-defun ein:content-save-success (callback cbargs &key status response &allow-other-keys) - (when callback - (apply callback cbargs))) - -(cl-defun ein:content-save-error (url errcb errcbargs &key response data &allow-other-keys) - (ein:log 'error - "Content save %s failed %s %s." - url (request-response-error-thrown response) (plist-get data :message)) - (when errcb - (apply errcb errcbargs))) - -(defun ein:content-legacy-rename (content new-path callback cbargs) - (let ((path (substring new-path 0 (or (cl-position ?/ new-path :from-end t) 0))) - (name (substring new-path (or (cl-position ?/ new-path :from-end t) 0)))) - (ein:query-singleton-ajax - (ein:content-url content) - :type "PATCH" - :data (json-encode `((name . ,name) - (path . ,path))) - :parser #'ein:json-read - :success (apply-partially #'update-content-path-legacy content callback cbargs) - :error (apply-partially #'ein:content-rename-error new-path)))) - -(cl-defun update-content-path-legacy (content callback cbargs &key data &allow-other-keys) - (setf (ein:$content-path content) (ein:trim-left (format "%s/%s" (plist-get data :path) (plist-get data :name)) - "/") - (ein:$content-name content) (plist-get data :name) - (ein:$content-last-modified content) (plist-get data :last_modified)) - (when callback - (apply callback cbargs))) - -(defun ein:content-rename (content new-path &optional callback cbargs) - (if (>= (ein:$content-notebook-version content) 3) - (ein:query-singleton-ajax - (ein:content-url content) - :type "PATCH" - :data (json-encode `((path . ,new-path))) - :parser #'ein:json-read - :success (apply-partially #'update-content-path content callback cbargs) - :error (apply-partially #'ein:content-rename-error (ein:$content-path content))) - (ein:content-legacy-rename content new-path callback cbargs))) - -(defun ein:session-rename (url-or-port session-id new-path) - (ein:query-singleton-ajax - (ein:url url-or-port "api/sessions" session-id) - :type "PATCH" - :data (json-encode `((path . ,new-path))) - :complete #'ein:session-rename--complete)) - -(cl-defun ein:session-rename--complete (&key data response symbol-status - &allow-other-keys - &aux (resp-string (format "STATUS: %s DATA: %s" (request-response-status-code response) data))) - (ein:log 'debug "ein:session-rename--complete %s" resp-string)) - -(cl-defun update-content-path (content callback cbargs &key data &allow-other-keys) - (setf (ein:$content-path content) (plist-get data :path) - (ein:$content-name content) (plist-get data :name) - (ein:$content-last-modified content) (plist-get data :last_modified)) - (when callback - (apply callback cbargs))) - -(cl-defun ein:content-rename-error (path &key response data &allow-other-keys) - (ein:log 'error - "Renaming content %s failed %s %s." - path (request-response-error-thrown response) (plist-get data :message))) - -;;; Sessions - -(defun ein:content-query-sessions (url-or-port callback errback &optional iteration) - "Register CALLBACK of arity 1 to retrieve the sessions. -Call ERRBACK of arity 1 (contents) upon failure." - (declare (indent defun)) - (unless iteration - (setq iteration 0)) - (unless callback - (setq callback #'ignore)) - (unless errback - (setq errback #'ignore)) - (ein:query-singleton-ajax - (ein:url url-or-port "api/sessions") - :type "GET" - :parser #'ein:json-read - :complete (apply-partially #'ein:content-query-sessions--complete url-or-port callback) - :success (apply-partially #'ein:content-query-sessions--success url-or-port callback) - :error (apply-partially #'ein:content-query-sessions--error url-or-port callback errback iteration))) - -(cl-defun ein:content-query-sessions--success (url-or-port callback &key data &allow-other-keys) - (cl-flet ((read-name (nb-json) - (if (< (ein:notebook-version-numeric url-or-port) 3) - (if (string= (plist-get nb-json :path) "") - (plist-get nb-json :name) - (format "%s/%s" (plist-get nb-json :path) (plist-get nb-json :name))) - (plist-get nb-json :path)))) - (let ((session-hash (make-hash-table :test 'equal))) - (dolist (s data (funcall callback session-hash)) - (setf (gethash (read-name (plist-get s :notebook)) session-hash) - (cons (plist-get s :id) (plist-get s :kernel))))))) - -(cl-defun ein:content-query-sessions--error (url-or-port callback errback iteration - &key response error-thrown - &allow-other-keys) - (if (< iteration (if noninteractive 6 3)) - (progn - (ein:log 'verbose "Retry sessions #%s in response to %s" iteration (request-response-status-code response)) - (sleep-for 0 (* (1+ iteration) 500)) - (ein:content-query-sessions url-or-port callback errback (1+ iteration))) - (ein:log 'error "ein:content-query-sessions--error %s: ERROR %s DATA %s" url-or-port (car error-thrown) (cdr error-thrown)) - (when errback (funcall errback nil)))) - -(cl-defun ein:content-query-sessions--complete (url-or-port callback - &key data response - &allow-other-keys - &aux (resp-string (format "STATUS: %s DATA: %s" (request-response-status-code response) data))) - (ein:log 'debug "ein:query-sessions--complete %s" resp-string)) - -;;; Uploads - - -(defun ein:get-local-file (path) - "If path exists, get contents and try to guess type of file (one of file, notebook, or directory) -and content format (one of json, text, or base64)." - (unless (file-readable-p path) - (error "File %s is not accessible and cannot be uploaded." path)) - (let ((name (file-name-nondirectory path)) - (type (file-name-extension path))) - (with-temp-buffer - (insert-file-contents path) - (cond ((string= type "ipynb") - (list name "notebook" "json" (buffer-string))) - ((eql buffer-file-coding-system 'no-conversion) - (list name "file" "base64" (buffer-string))) - (t (list name "file" "text" (buffer-string))))))) - -(provide 'ein-contents-api) diff --git a/elpa/ein-20200415.238/ein-contents-api.elc b/elpa/ein-20200415.238/ein-contents-api.elc deleted file mode 100644 index c4096a4f27ff0d3bd5b559e8d0459e859928115e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21262 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 diff --git a/elpa/ein-20200415.238/ein-core.el b/elpa/ein-20200415.238/ein-core.el deleted file mode 100644 index 409072e0..00000000 --- a/elpa/ein-20200415.238/ein-core.el +++ /dev/null @@ -1,361 +0,0 @@ -;;; ein-core.el --- EIN core - -;; Copyright (C) 2012 Takafumi Arakaki - -;; Author: Takafumi Arakaki - -;; This file is NOT part of GNU Emacs. - -;; ein-core.el is free software: you can redistribute 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. - -;; ein-core.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-core.el. -;; If not, see . - -;;; Commentary: - -;; - -;;; Code: - -;; Optional dependency on tramp: -(declare-function tramp-make-tramp-file-name "tramp") -(declare-function tramp-file-name-localname "tramp") -(declare-function tramp-dissect-file-name "tramp") - - -(require 'ein) ; get autoloaded functions into namespace -(require 'ein-utils) -(require 'anaphora) - -(defgroup ein nil - "IPython notebook client in Emacs" - :group 'applications - :prefix "ein:") - -;;; Configuration - -(defcustom ein:urls nil - "List of default url-or-port values. -This will be used for completion. So put your IPython servers. -You can connect to servers not in this list \(but you will need -to type every time)." - :type '(repeat (choice (integer :tag "Port number" 8888))) - :group 'ein) - -(make-obsolete-variable 'ein:default-url-or-port nil "0.17.0") -(define-obsolete-variable-alias 'ein:url-or-port 'ein:urls "0.17.0") - -(defcustom ein:filename-translations nil - "Convert file paths between Emacs and Python process. - -This value can take these form: - -alist - Its key specifies URL-OR-PORT and value must be a list of two - functions: (TO-PYTHON FROM-PYTHON). Key (URL-OR-PORT) can be - string (URL), integer (port), or `default' (symbol). The - value of `default' is used when other key does not much. -function - Called with an argument URL-OR-PORT (integer or string). - This function must return a list of two functions: - (TO-PYTHON FROM-PYTHON). - -Here, the functions TO-PYTHON and FROM-PYTHON are defined as: - -TO-PYTHON - A function which converts a file name (returned by - `buffer-file-name') to the one Python understands. -FROM-PYTHON - A function which converts a file path returned by - Python process to the one Emacs understands. - -Use `ein:tramp-create-filename-translator' to easily generate the -pair of TO-PYTHON and FROM-PYTHON." - ;; I've got the idea from `slime-filename-translations'. - :type '(choice - (alist :tag "Translations mapping" - :key-type (choice :tag "URL or PORT" - (string :tag "URL" "http://127.0.0.1:8888") - (integer :tag "PORT" 8888) - (const default)) - :value-type (list (function :tag "TO-PYTHON") - (function :tag "FROM-PYTHON"))) - (function :tag "Translations getter")) - :group 'ein) - - -(defconst ein:source-dir (file-name-directory load-file-name) - "Directory in which `ein*.el` files are located.") - -(defun ein:version (&optional interactively copy-to-kill) - "Return a longer version string. -With prefix argument, copy the string to kill ring. -The result contains `ein:version' and either git revision (if -the source is in git repository) or elpa version." - (interactive (list t current-prefix-arg)) - (let* ((version - (or (and (ein:git-root-p - (concat (file-name-as-directory ein:source-dir) "..")) - (let ((default-directory ein:source-dir)) - (ein:git-revision-dirty))) - (and (string-match "/ein-\\([0-9\\.]*\\)/$" ein:source-dir) - (match-string 1 ein:source-dir))))) - (when interactively - (message "EIN version is %s" version)) - (when copy-to-kill - (kill-new version)) - version)) - -;;; Server attribute getters. These should be moved to ein-open.el - -(defvar *ein:notebook-version* (make-hash-table :test #'equal) - "url-or-port to major notebook version") - -(defvar *ein:kernelspecs* (make-hash-table :test #'equal) - "url-or-port to kernelspecs") - -(defun ein:get-kernelspec (url-or-port name &optional lang) - (let* ((kernelspecs (ein:need-kernelspecs url-or-port)) - (name (if (stringp name) - (intern (format ":%s" name)) - name)) - (ks (or (plist-get kernelspecs name) - (cl-loop for (key spec) on (ein:plist-exclude kernelspecs '(:default)) by 'cddr - if (string= (ein:$kernelspec-language spec) lang) - return spec - end)))) - (cond ((stringp ks) - (ein:get-kernelspec url-or-port ks)) - (t ks)))) - -(defun ein:need-kernelspecs (url-or-port) - "Callers assume ein:query-kernelspecs succeeded. If not, nil." - (aif (gethash url-or-port *ein:kernelspecs*) it - (ein:log 'warn "No recorded kernelspecs for %s" url-or-port) - nil)) - -(defun ein:query-kernelspecs (url-or-port callback &optional iteration) - "Send for kernelspecs of URL-OR-PORT with CALLBACK arity 0 (just a semaphore)" - (unless iteration - (setq iteration 0)) - (ein:query-singleton-ajax - (ein:url url-or-port "api/kernelspecs") - :type "GET" - :parser 'ein:json-read - :complete (apply-partially #'ein:query-kernelspecs--complete url-or-port) - :success (apply-partially #'ein:query-kernelspecs--success url-or-port callback) - :error (apply-partially #'ein:query-kernelspecs--error url-or-port callback iteration))) - -(defun ein:normalize-kernelspec-language (name) - "Normalize the kernelspec language string" - (if (stringp name) - (replace-regexp-in-string "[ ]" "-" name) - name)) - -(cl-defun ein:query-kernelspecs--success (url-or-port callback - &key data symbol-status response - &allow-other-keys) - (let ((ks (list :default (plist-get data :default))) - (specs (ein:plist-iter (plist-get data :kernelspecs)))) - (setf (gethash url-or-port *ein:kernelspecs*) - (ein:flatten (dolist (spec specs ks) - (let ((name (car spec)) - (info (cdr spec))) - (push (list name (make-ein:$kernelspec :name (plist-get info :name) - :display-name (plist-get (plist-get info :spec) - :display_name) - :resources (plist-get info :resources) - :language (ein:normalize-kernelspec-language - (plist-get (plist-get info :spec) - :language)) - :spec (plist-get info :spec))) - ks)))))) - (when callback (funcall callback))) - -(cl-defun ein:query-kernelspecs--error (url-or-port callback iteration - &key response error-thrown - &allow-other-keys) - (if (< iteration 3) - (progn - (ein:log 'verbose "Retry kernelspecs #%s in response to %s" iteration (request-response-status-code response)) - (ein:query-kernelspecs url-or-port callback (1+ iteration))) - (ein:log 'error - "ein:query-kernelspecs--error %s: ERROR %s DATA %s" url-or-port (car error-thrown) (cdr error-thrown)) - (when callback (funcall callback)))) - -(cl-defun ein:query-kernelspecs--complete (url-or-port &key data response - &allow-other-keys - &aux (resp-string (format "STATUS: %s DATA: %s" (request-response-status-code response) data))) - (ein:log 'debug "ein:query-kernelspecs--complete %s" resp-string)) - -(defsubst ein:notebook-version-numeric (url-or-port) - (truncate (string-to-number (ein:need-notebook-version url-or-port)))) - -(defun ein:need-notebook-version (url-or-port) - "Callers assume ein:query-notebook-version succeeded. If not, we hardcode a guess." - (aif (gethash url-or-port *ein:notebook-version*) it - (ein:log 'warn "No recorded notebook version for %s" url-or-port) - "5.7.0")) - -(defun ein:query-notebook-version (url-or-port callback) - "Send for notebook version of URL-OR-PORT with CALLBACK arity 0 (just a semaphore)" - (ein:query-singleton-ajax - (ein:url url-or-port "api") - :parser #'ein:json-read - :complete (apply-partially #'ein:query-notebook-version--complete url-or-port callback))) - -(cl-defun ein:query-notebook-version--complete (url-or-port callback - &key data response - &allow-other-keys - &aux (resp-string (format "STATUS: %s DATA: %s" (request-response-status-code response) data))) - (ein:log 'debug "ein:query-notebook-version--complete %s" resp-string) - (aif (plist-get data :version) - (setf (gethash url-or-port *ein:notebook-version*) it) - (case (request-response-status-code response) - (404 (ein:log 'warn "notebook version api not implemented") - (setf (gethash url-or-port *ein:notebook-version*) "2.0.0")) - (t (ein:log 'warn "notebook version currently unknowable")))) - (when callback (funcall callback))) - -;;; File name translation (tramp support) - -;; Probably it's better to define `ein:filename-translations-get' as -;; an EIEIO method so that I don't have to re-define functions such as -;; `ein:kernel-filename-to-python' and `ein:kernel-filename-from-python'. - -(defun ein:filename-translations-get (url-or-port) - (ein:choose-setting 'ein:filename-translations url-or-port)) - -(defun ein:filename-to-python (url-or-port filename) - (aif (car (ein:filename-translations-get url-or-port)) - (funcall it filename) - filename)) - -(defun ein:filename-from-python (url-or-port filename) - (aif (cadr (ein:filename-translations-get url-or-port)) - (funcall it filename) - filename)) - -(defun ein:make-tramp-file-name (username remote-host python-filename) - (if (>= emacs-major-version 26) - (tramp-make-tramp-file-name "ssh" - username - nil - remote-host - nil - python-filename) - (tramp-make-tramp-file-name "ssh" - username - remote-host - python-filename))) - -(defun ein:tramp-create-filename-translator (remote-host &optional username) - "Generate a pair of TO-PYTHON and FROM-PYTHON for -`ein:filename-translations'. - -Usage:: - - (setq ein:filename-translations - `((8888 - . ,(ein:tramp-create-filename-translator \"MY-HOSTNAME\")))) - ;; Equivalently: - (setq ein:filename-translations - (lambda (url-or-port) - (when (equal url-or-port 8888) - (ein:tramp-create-filename-translator \"MY-HOSTNAME\")))) - -This setting assumes that the IPython server which can be -connected using the port 8888 in localhost is actually running in -the host named MY-HOSTNAME. - -Adapted from `slime-create-filename-translator'." - (require 'tramp) - (lexical-let ((remote-host remote-host) - (username (or username (user-login-name)))) - (list (lambda (emacs-filename) - (tramp-file-name-localname - (tramp-dissect-file-name emacs-filename))) - (lambda (python-filename) - (ein:make-tramp-file-name username remote-host python-filename))))) - - - -;;; Generic getter - -(defun ein:generic-getter (func-list) - "Internal function for generic getter functions (`ein:get-*'). - -FUNC-LIST is a list of function which takes no argument and -return what is desired or nil. Each function in FUNC-LIST is -called one by one and the first non-nil result will be used. The -function is not called when it is not bound. So, it is safe to -give functions defined in lazy-loaded sub-modules. - -This is something similar to dispatching in generic function such -as `defgeneric' in EIEIO, but it takes no argument. Actual -implementation is chosen based on context (buffer, point, etc.). -This helps writing generic commands which requires same object -but can operate in different contexts." - (cl-loop for func in func-list - if (and (functionp func) (funcall func)) - return it)) - -(defun ein:get-url-or-port () - (ein:generic-getter '(ein:get-url-or-port--notebooklist - ein:get-url-or-port--notebook - ein:get-url-or-port--worksheet - ein:get-url-or-port--shared-output))) - -(defun ein:get-kernel () - (ein:generic-getter '(ein:get-kernel--notebook - ein:get-kernel--worksheet - ein:get-kernel--shared-output - ein:get-kernel--connect))) - -(defun ein:get-kernel-or-error () - (or (ein:get-kernel) - (error "No kernel related to the current buffer."))) - -(defun ein:get-cell-at-point () - (ein:generic-getter '(ein:get-cell-at-point--worksheet - ein:get-cell-at-point--shared-output))) - -(defun ein:get-traceback-data () - (ein:generic-getter '(ein:get-traceback-data--worksheet - ein:get-traceback-data--shared-output - ein:get-traceback-data--connect))) - - - -;;; Emacs utilities - -(defun ein:clean-compiled-files () - (let* ((files (directory-files ein:source-dir 'full "^ein-.*\\.elc$"))) - (mapc #'delete-file files) - (message "Removed %s byte-compiled files." (length files)))) - -(defun ein:byte-compile-ein () - "Byte compile EIN files." - (interactive) - (ein:clean-compiled-files) - (let* ((files (directory-files ein:source-dir 'full "^ein-.*\\.el$")) - (errors (cl-mapcan (lambda (f) (unless (byte-compile-file f) (list f))) - files))) - (aif errors - (error "Got %s errors while compiling these files: %s" - (length errors) - (ein:join-str " " (mapcar #'file-name-nondirectory it)))) - (message "Compiled %s files" (length files)))) - -(provide 'ein-core) - -;;; ein-core.el ends here diff --git a/elpa/ein-20200415.238/ein-core.elc b/elpa/ein-20200415.238/ein-core.elc deleted file mode 100644 index 250ce1706f592b020cdadeb2a34532d648694785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14043 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 Z4cZ0?ky$T^!ZROjbgY>GwP<`Q{2x`IMH&DA diff --git a/elpa/ein-20200415.238/ein-dev.el b/elpa/ein-20200415.238/ein-dev.el deleted file mode 100644 index 41e39388..00000000 --- a/elpa/ein-20200415.238/ein-dev.el +++ /dev/null @@ -1,330 +0,0 @@ -;;; ein-dev.el --- Development tools - -;; Copyright (C) 2012- Takafumi Arakaki - -;; Author: Takafumi Arakaki - -;; This file is NOT part of GNU Emacs. - -;; ein-dev.el is free software: you can redistribute 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. - -;; ein-dev.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-dev.el. If not, see . - -;;; Commentary: - -;; - -;;; Code: - -(declare-function rst-shift-region "rst") - -(require 'ein-notebook) - -;;;###autoload -(defun ein:dev-insert-mode-map (map-string) - "Insert mode-map into rst document. For README.rst." - (save-excursion - (insert "\n\n::\n\n") - (let ((beg (point))) - (search-forward ".. // KEYS END //") - (move-beginning-of-line nil) - (delete-region beg (point)) - (insert "\n") - (goto-char beg) - (insert (substitute-command-keys map-string)) - (rst-shift-region beg (point) 1)))) - -(defun ein:load-files (&optional regex dir ignore-compiled) - (let* ((dir (or dir ein:source-dir)) - (regex (or regex ".+")) - (files (-remove #'(lambda (x) - (string-match-p "ein-pkg\\.el" x)) - (and - (file-accessible-directory-p dir) - (directory-files dir 'full regex))))) - (unless ignore-compiled - (setq files (mapcar #'file-name-sans-extension files))) - (mapc #'load files))) - -(defun ein:dev-reload () - "Reload ein-*.el modules." - (interactive) - (makunbound 'ein:notebook-mode-map) ; so defvar works. - (load "ein-notebook") ; ... but make sure it will be defined first. - (ein:load-files "^ein-.*\\.el$")) - -(cl-defun ein:dev-require-all (&key (ignore-p #'ignore)) - (cl-loop for f in (directory-files ein:source-dir nil "^ein-.*\\.el$") - unless (or (equal f "ein-pkg.el") - (equal f "ein-autoloads.el") - (funcall ignore-p f)) - do (require (intern (file-name-sans-extension f)) nil t)) - ;; For `widget-button-press': - (require 'wid-edit nil t)) - -(defadvice backtrace (around ein:dev-short-backtrace) - "A hack to shorten backtrace. - -As code cells hold base64-encoded image data, backtrace tends to -be VERY long. So I am setting `print-level' to *1*. Note that -setting it globally via `setq' does not work because the value -for debugger is hard-coded. See `debugger-setup-buffer'." - (let ((print-level 1) - (print-length 1) - (print-circle t)) - ad-do-it)) - -(defun ein:dev-patch-backtrace () - "Monkey patch `backtrace' function to make it shorter." - (interactive) - (ad-enable-advice 'backtrace 'around 'ein:dev-short-backtrace) - (ad-activate 'backtrace)) - -(defun ein:dev-depatch-backtrace () - "Undo `ein:dev-patch-backtrace'." - (interactive) - (ad-deactivate 'backtrace) - (ad-disable-advice 'backtrace 'around 'ein:dev-short-backtrace) - ;; In case it has other advices. - (ad-activate 'backtrace)) - -(defun ein:dev-show-debug-setting () - "Show variables related to EIN debugging." - (interactive) - (message (concat "debug-on-error=%s websocket-debug=%s " - "websocket-callback-debug-on-error=%s " - "ein:debug=%s ein:log-level=%s ein:log-message-level=%s") - debug-on-error websocket-debug websocket-callback-debug-on-error - ein:debug - (ein:log-level-int-to-name ein:log-level) - (ein:log-level-int-to-name ein:log-message-level))) - -;;;###autoload -(defun ein:dev-start-debug () - "Enable EIN debugging support. -When the prefix argument is given, debugging support for websocket -callback (`websocket-callback-debug-on-error') is enabled." - (interactive) - (setq debug-on-error t) -;; only use these with deferred:sync! they cause strange failures otherwise! -;; (setq deferred:debug-on-signal t) -;; (setq deferred:debug t) - (setq request-log-level (quote debug)) - (lexical-let ((curl-trace (concat temporary-file-directory "curl-trace"))) - (nconc request-curl-options `("--trace-ascii" ,curl-trace)) - (add-function :after - (symbol-function 'request--curl-callback) - (lambda (&rest args) - (if (file-readable-p curl-trace) - (with-temp-buffer - (insert-file-contents curl-trace) - (request-log 'debug (buffer-string))) - (request-log 'debug "%s unreadable" curl-trace))))) - (setq request-message-level (quote verbose)) - (setq websocket-debug t) - (setq websocket-callback-debug-on-error t) - (setq ein:debug t) - (ein:log-set-level 'debug) - (ein:log-set-message-level 'verbose) - (ein:dev-patch-backtrace) - (ein:dev-show-debug-setting)) - -;;;###autoload -(defun ein:dev-stop-debug () - "Inverse of `ein:dev-start-debug'. Hard to maintain because it needs to match start" - (interactive) - (setq debug-on-error nil) - (setq websocket-debug nil) - (setq deferred:debug-on-signal nil) - (setq deferred:debug nil) - (setq request-log-level -1) - (setq request-message-level 'warn) - (setq websocket-callback-debug-on-error nil) - (setq ein:debug nil) - (ein:log-set-level 'verbose) - (ein:log-set-message-level 'info) - (ein:dev-depatch-backtrace) - (ein:dev-show-debug-setting)) - -(defun ein:dev-pop-to-debug-channels () - "Open notebook communication channels websocket log buffer." - (interactive) - (-when-let* ((kernel (ein:get-kernel--notebook)) - (websocket (ein:$kernel-websocket kernel))) - (pop-to-buffer - (websocket-get-debug-buffer-create - (ein:$websocket-ws websocket))))) - -(defun ein:dev-pop-to-debug-shell () - "Legacy diagnostic for shell channel that got folded into ein:$kernel-websocket." - (interactive) - (-when-let* ((kernel (ein:get-kernel--notebook)) - (channel (ein:$kernel-shell-channel kernel))) - (pop-to-buffer - (websocket-get-debug-buffer-create - (ein:$websocket-ws channel))))) - -(defun ein:dev-pop-to-debug-iopub () - "Legacy diagnostic for iopub channel that got folded into ein:$kernel-websocket." - (interactive) - (-when-let* ((kernel (ein:get-kernel--notebook)) - (channel (ein:$kernel-shell-channel kernel))) - (pop-to-buffer - (websocket-get-debug-buffer-create - (ein:$websocket-ws channel))))) - -(defun ein:dev-sys-info--lib (name) - (let* ((libsym (intern-soft name)) - (version-var (cl-loop for fmt in '("%s-version" "%s:version") - if (intern-soft (format fmt name)) - return it)) - (version (symbol-value version-var))) - (list :name name - :path (ein:aand (locate-library name) (abbreviate-file-name it)) - :featurep (featurep libsym) - :version-var version-var - :version version))) - -(defun ein:dev-dump-vars (names) - (cl-loop for var in names - collect (intern (format ":%s" var)) - collect (symbol-value (intern (format "ein:%s" var))))) - -(defun ein:dev-stdout-program (command args) - "Safely call COMMAND with ARGS and return its stdout." - (ein:aand (executable-find command) - (with-temp-buffer - (erase-buffer) - (apply #'call-process it nil t nil args) - (buffer-string)))) - -(defsubst ein:dev-packages () - (lexical-let (result) - (cl-letf (((symbol-function 'define-package) - (lambda (&rest args) - (setq result (mapcar (lambda (x) (symbol-name (first x))) (nth 3 args)))))) - (load "ein-pkg") - result))) - -(defun ein:dev-sys-info () - (list - "EIN system info" - :emacs-version (emacs-version) - :emacs-bzr-version (ein:eval-if-bound 'emacs-bzr-version) - :window-system window-system - ;; Emacs variant detection - ;; http://coderepos.org/share/browser/lang/elisp/init-loader/init-loader.el - :emacs-variant - (cond ((featurep 'meadow) 'meadow) - ((featurep 'core-spacemacs) 'spacemacs) - ((featurep 'carbon-emacs-package) 'carbon)) - :os (list - :uname (ein:dev-stdout-program "uname" '("-a")) - :lsb-release (ein:dev-stdout-program "lsb_release" '("-a"))) - :notebook (ein:dev-stdout-program "pip" '("show" "notebook")) - :ipython (ein:dev-stdout-program "ipython" '("--version")) - :image-types (ein:eval-if-bound 'image-types) - :image-types-available (seq-filter #'image-type-available-p - (ein:eval-if-bound 'image-types)) - :request (list :backend request-backend) - :ein (append (list :version (ein:version)) - (ein:dev-dump-vars '("source-dir"))) - :lib (seq-filter (lambda (info) (plist-get info :path)) - (mapcar #'ein:dev-sys-info--lib - (ein:dev-packages))))) - -(defun ein:dev-show-sys-info (&optional show-in-buffer) - "Show Emacs and library information." - (interactive (list t)) - (let ((info (ein:dev-sys-info))) - (if show-in-buffer - (let ((buffer (get-buffer-create "*ein:sys-info*"))) - (with-current-buffer buffer - (erase-buffer) - (pp info buffer) - (pop-to-buffer buffer))) - (message "EIN INFO:\n%s" (pp-to-string info))))) - -;;;###autoload -(defun ein:dev-bug-report-template () - "Open a buffer with bug report template." - (interactive) - (let ((buffer (generate-new-buffer "*ein:bug-report*"))) - (with-current-buffer buffer - (erase-buffer) - (insert "## Problem description\n\n## Steps to reproduce the problem\n\n") - (insert "\n") - (insert "## System info:\n\n```cl\n") - (condition-case err - (ein:dev-print-sys-info buffer) - (error (insert (format "`ein:dev-sys-info' produce: %S" err)))) - (insert "```\n") - (goto-char (point-min)) - (pop-to-buffer buffer)))) - -(defun ein:dev-print-sys-info (&optional stream) - (princ (ein:dev--pp-to-string (ein:dev-sys-info)) - (or stream standard-output))) - -(defun ein:dev--pp-to-string (object) - "`pp-to-string' with additional prettifier." - (with-temp-buffer - (erase-buffer) - (let ((pp-escape-newlines nil)) - (pp object (current-buffer))) - (goto-char (point-min)) - (let ((emacs-lisp-mode-hook nil)) - (emacs-lisp-mode)) - (ein:dev--prettify-sexp) - (buffer-string))) - -(defun ein:dev--prettify-sexp () - "Prettify s-exp at point recursively. -Use this function in addition to `pp' (see `ein:dev--pp-to-string')." - (down-list) - (condition-case nil - (while t - (forward-sexp) - ;; Prettify nested s-exp. - (when (looking-back ")" (1- (point))) - (save-excursion - (backward-sexp) - (ein:dev--prettify-sexp))) - ;; Add newline before keyword symbol. - (when (looking-at-p " :") - (newline-and-indent)) - ;; Add newline before long string literal. - (when (and (looking-at-p " \"") - (let ((end (save-excursion - (forward-sexp) - (point)))) - (> (- end (point)) 80))) - (newline-and-indent))) - (scan-error))) - -(defun ein:debug-notebook-to-json-buffer () - "Create a new buffer with the json representation of the current notebook." - (interactive) - (when-let ((notebook (ein:get-notebook))) - (let ((content-data (ein:notebook-to-json notebook)) - (bufname (format "*notebook-json:%s" (ein:$notebook-notebook-name notebook)))) - (with-current-buffer (get-buffer-create bufname) - (barf-if-buffer-read-only) - (erase-buffer) - (save-excursion - (insert (json-encode content-data)) - (json-pretty-print (point-min) (point-max)))) - (pop-to-buffer bufname)))) - -(provide 'ein-dev) - -;;; ein-dev.el ends here diff --git a/elpa/ein-20200415.238/ein-dev.elc b/elpa/ein-20200415.238/ein-dev.elc deleted file mode 100644 index 669ffea5b3abfd7d3ce0d6c26bcdaf0e681a1c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13086 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 diff --git a/elpa/ein-20200415.238/ein-events.el b/elpa/ein-20200415.238/ein-events.el deleted file mode 100644 index 9331c52f..00000000 --- a/elpa/ein-20200415.238/ein-events.el +++ /dev/null @@ -1,63 +0,0 @@ -;;; ein-events.el --- Event module - -;; Copyright (C) 2012- Takafumi Arakaki - -;; Author: Takafumi Arakaki - -;; This file is NOT part of GNU Emacs. - -;; ein-events.el is free software: you can redistribute 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. - -;; ein-events.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-events.el. If not, see . - -;;; Commentary: - -;; - -;;; Code: - -(require 'eieio) - -(require 'ein-core) -(require 'ein-classes) -(require 'ein-log) - -(defun ein:events-new () - "Return a new event handler instance." - (make-instance 'ein:events)) - -(defun ein:events-trigger (events event-type &optional data) - "Trigger EVENT-TYPE and let event handler EVENTS handle that event." - (ein:log 'debug "Event: %S" event-type) - (aif (gethash event-type (slot-value events 'callbacks)) - (mapc (lambda (cb-arg) (ein:funcall-packed cb-arg data)) it) - (ein:log 'info "Unknown event: %S" event-type))) - - -(cl-defmethod ein:events-on ((events ein:events) event-type - callback &optional arg) - "Set event trigger hook. - -When EVENT-TYPE is triggered on the event handler EVENTS, -CALLBACK is called. CALLBACK must take two arguments: -ARG as the first argument and DATA, which is passed via -`ein:events-trigger', as the second." - (assert (symbolp event-type) t "%s not symbol" event-type) - (let* ((table (slot-value events 'callbacks)) - (cbs (gethash event-type table))) - (push (cons callback arg) cbs) - (puthash event-type cbs table))) - - -(provide 'ein-events) - -;;; ein-events.el ends here diff --git a/elpa/ein-20200415.238/ein-events.elc b/elpa/ein-20200415.238/ein-events.elc deleted file mode 100644 index 20f0e5797340012517b849daf3fac9173b08963a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1842 zcmbtVU5^?!6x~Nc)V$=ORZ^)pL$-kkBbWj9>m@8jRn%1!WofHw2PtN37;8QDbnF3b zetoY!17X|Uhbl-0{B`c}xyRQRv#aU%M@L7^i;D}G>MR$MGv5&kW*JQkYeW+DNm6JraZ)~1WIg|R>x;|%su z24}tS>^~SxBZkrz60I!7#id=5Qyfubay@%&vUz-UOQf+Yv3>AfKJ zQ4DZeNWlxRDJ~47DlSU!O&>?#TR+Wav%S2toFtlY2;!*U$2NEshXeP=weYYL9d?G; z>7N8}Q}Dk_QE=db3yt3j;d~eWNNQYS+@RF!1%#bu>s@pTpSUdx1r!wD0^e|D0mWew zRT9crsuJG&so7?HMWvty-XOxcUuTHh(z;PX-ec^kWb~Gk9e|5k@4>*(ZoP&cjKZ+9 za3sd3FfYV`da9uNWX{;AKN)gTHky|(IigX1?>|M^` zXXj+Cs02nW?f6qfDD@EAC=P1z#|`YBJc%PrMc_vVFHrF4ha(&sU<+gAhWp`4<5{1w$9=B zI#@uofHg-wObSM7OEy%N9PfjaOPbso$Y`D*csp4VTCA(1hK(nC_-fqi;F+yT(e)VV~?wl$YL23m8Fgy}yRL+mvd3+e7~9&y?eP z@%7f?BT%nF7O1^Vu^QbgD%B0{#%emby1JZ9e*@g(6y>Z3upi7yd@C##5wKhB4q9et zc5@!9$){fd>ySgPUzB>%myBN~^GO%BsYp@>oI7b4Yy^$f=dV?W)Fj_@cTk4oQ^R_A Ulk!4u1QuajO{&|9j_ox60cUwRa{vGU diff --git a/elpa/ein-20200415.238/ein-file.el b/elpa/ein-20200415.238/ein-file.el deleted file mode 100644 index 5399ef88..00000000 --- a/elpa/ein-20200415.238/ein-file.el +++ /dev/null @@ -1,64 +0,0 @@ -;;; ein-file.el --- Editing files downloaded from jupyter - -;; Copyright (C) 2017- John M. Miller - -;; Authors: Takafumi Arakaki -;; John M. Miller - -;; This file is NOT part of GNU Emacs. - -;; ein-file.el is free software: you can redistribute 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. - -;; ein-file.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-notebooklist.el. If not, see . - -;;; Commentary: - -(defvar *ein:file-buffername-template* "'/ein:%s:%s") -(ein:deflocal ein:content-file-buffer--content nil) - -;; (push '("^ein:.*" . ein:content-file-handler) -;; file-name-handler-alist) - -(defun ein:file-buffer-name (urlport path) - (format *ein:file-buffername-template* - urlport - path)) - -(defun ein:file-open (url-or-port path) - (interactive (ein:notebooklist-parse-nbpath (ein:notebooklist-ask-path "file"))) - (ein:content-query-contents url-or-port path #'ein:file-open-finish nil)) - -(defun ein:file-open-finish (content) - (with-current-buffer (get-buffer-create (ein:file-buffer-name (ein:$content-url-or-port content) - (ein:$content-path content))) - (setq ein:content-file-buffer--content content) - (let ((raw-content (ein:$content-raw-content content))) - (if (eq system-type 'windows-nt) - (insert (decode-coding-string raw-content 'utf-8)) - (insert raw-content))) - (set-visited-file-name (buffer-name)) - (set-auto-mode) - (add-hook 'write-contents-functions 'ein:content-file-save) ;; FIXME Brittle, will not work - ;; if user changes major mode. - (ein:log 'verbose "Opened file %s" (ein:$content-name content)) - (set-buffer-modified-p nil) - (goto-char (point-min)) - (pop-to-buffer (buffer-name)))) - -(defun ein:content-file-save () - (when (boundp 'ein:content-file-buffer--content) - (setf (ein:$content-raw-content ein:content-file-buffer--content) (buffer-string)) - (ein:content-save ein:content-file-buffer--content) - (set-buffer-modified-p nil) - t)) - -(provide 'ein-file) diff --git a/elpa/ein-20200415.238/ein-file.elc b/elpa/ein-20200415.238/ein-file.elc deleted file mode 100644 index d182c3d89017600da5dc06d7d33519db8c219ddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2433 zcmbtV-*4MC5YD6PzH9}C4cp5_$&k1xGfVQ1wOI!YS%Cx?P+;3zl?Pg)ZKATMijPnk*TGvs;o8z zMYD_8uk5s2lgx86rPCYzk91hJ7el}J_gY(8;uNZ_vXtEwa-&nqOln=FiOaa`~re6`fvbW`WX&~=b2h=Wkt`GE?zN`Vo@)bssfNo zIJGHr>C|%y&VJ$zKU#c)(cX&Z7%Wvd(K8mJouoqN{J>&y=M<(hML`meLp;%O5`|+7 zVt&Ch!81K+Cuak^&6D6O{Dnz0o(J@f-Q^~gxj@KTE^^dsBj2n2Ya6`qo9Myl%Gyz> zs*Nl-fyM}2DNBXIoBoa7Nr6m# zRu4emx2B~*v<{AMKkeBd^wy;?mH40A2yPp=C#S7*oPMzJ0JIOas_wd4g2!Ec>;?5M zv|V#`Z)xfa{izy%*Ez)hbdYfEXM&XYJCpN_x*4?@QxcULO!2s%^?W8UZ5I#J5X zDp4#LK?)e-pbZoRRSrrQm6BNt4+U=-29TASZ3kzy2f8)14t4^}+2}K9c6p+XZHy>k z#o2HwoXFt#$*;&_^6ZFH!UJ-L(cpI^3x0#fVSL@+cY5!>$#oJOfACh%`WC<3Ycak4 zAz8x1>@^~Y-}1is(j(am@%jO(#loCp>CqDm5yap$=!Zz?<`u7 z@SIpF*Qq;2tzE;C{t;eoyjPedS-mP`PP@v08-7w&t9k>Sd*XCKQAiUC$F$Q$W_DI! zIaA!FxK%N&ntPiz>bp7shfgVaBqCxLtDFoOI;-8l~@1vPZr#NcD&UH65mr z5UxxH7)lE0vB1XA)h#g|Ej~a*FEx-Wz3xg=3gFZ%-qQSI2_DeIyl~RJOk21fx&S^)^po)Q$*V0bOkHHb0e+LX~OE3?&LA>T`$uA|| - -;; This file is NOT part of GNU Emacs. - -;; ein-ipdb.el is free software: you can redistribute 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. - -;; ein-ipdb.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-kernel.el. If not, see . - -;;; Commentary: - -;; - -;;; Code: - -(defvar *ein:ipdb-sessions* (make-hash-table)) -(defconst *ein:ipdb-prompt* "(Pdb) ") -(defvar ein:ipdb-buffer-active-kernel nil) -(defvar ein:ipdb-buffer-prompt nil) - -(defstruct ein:$ipdb-session - buffer - notebook-buffer - kernel - current-payload) - -(defun ein:find-or-create-ipdb-session (kernel &optional buffer) - (aif (gethash (ein:$kernel-kernel-id kernel) *ein:ipdb-sessions*) - it - (let ((db-session (make-ein:$ipdb-session - :kernel kernel - :notebook-buffer buffer - :current-payload "Debugger started."))) - (setf (gethash (ein:$kernel-kernel-id kernel) *ein:ipdb-sessions*) db-session) - db-session))) - -(defun ein:pdb-session-id (session) - (ein:$kernel-kernel-id (ein:$ipdb-session-kernel session))) - -(defun ein:run-ipdb-session (kernel prompt) - (unless (gethash (ein:$kernel-kernel-id kernel) *ein:ipdb-sessions*) - (let ((pdb-session (ein:find-or-create-ipdb-session kernel (current-buffer)))) - (setf (ein:$kernel-stdin-activep kernel) t) - (ein:prepare-ipdb-session pdb-session prompt)))) - -(defun ein:prepare-ipdb-session (session prompt) - (with-current-buffer (setf (ein:$ipdb-session-buffer session) - (get-buffer-create (format "*ipdb: %s*" (ein:pdb-session-id session)))) - (setq-local ein:ipdb-buffer-active-kernel (ein:pdb-session-id session)) - (put 'ein:ipdb-buffer-active-kernel 'permanent-local t) - (setq-local ein:ipdb-buffer-prompt prompt) - (put 'ein:ipdb-buffer-prompt 'permanent-local t) - (add-hook 'kill-buffer-hook 'ein:ipdb-on-stop) - (ein:ipdb-mode) - (pop-to-buffer (ein:$ipdb-session-buffer session)))) - -(defun ein:ipdb-on-stop () - (when ein:ipdb-buffer-active-kernel - (let* ((kernel (ein:$ipdb-session-kernel - (gethash ein:ipdb-buffer-active-kernel *ein:ipdb-sessions*))) - (msg (ein:kernel--get-msg kernel "input_reply" (list :value "q")))) - (ein:websocket-send-stdin-channel kernel msg) - (setf (ein:$kernel-stdin-activep kernel) nil) - (remhash ein:ipdb-buffer-active-kernel *ein:ipdb-sessions*)))) - -(defun ein:ipdb--handle-iopub-reply (kernel packet) - (destructuring-bind - (&key content metadata parent_header header &allow-other-keys) - (ein:json-read-from-string packet) - (let ((msg-type (plist-get header :msg_type))) - (cond ((string-equal msg-type "stream") - (let* ((session (ein:find-or-create-ipdb-session kernel)) - (buf (ein:$ipdb-session-buffer session)) - (text (plist-get content :text))) - (with-current-buffer buf - (setf (ein:$ipdb-session-current-payload session) text) - (let ((buffer-read-only nil) - (proc (get-buffer-process buf))) - (comint-output-filter proc text) - (comint-output-filter proc ein:ipdb-buffer-prompt))))) - (t - (let* ((session (ein:find-or-create-ipdb-session kernel)) - (buf (ein:$ipdb-session-buffer session))) - (with-current-buffer buf - (when ein:ipdb--received-quit-p - (kill-buffer) - (aif (ein:$ipdb-session-notebook-buffer session) - (pop-to-buffer it)))))))))) - - -;;; Now try with comint - -(defun ein:ipdb-input-sender (proc input) - (with-current-buffer (process-buffer proc) - (assert (not (null ein:ipdb-buffer-active-kernel)) t "No active kernel associated with this buffer %s.") - (let* ((session (gethash ein:ipdb-buffer-active-kernel *ein:ipdb-sessions*)) - (buffer-read-only nil) - (kernel (ein:$ipdb-session-kernel session)) - (content (list :value input)) - (msg (ein:kernel--get-msg kernel "input_reply" content))) - (ein:websocket-send-stdin-channel kernel msg) - (when (or (string= input "q") - (string= input "quit")) - (setq ein:ipdb--received-quit-p t))))) - -(defun ein:ipdb-buffer-initialize () - "Helper function to initialize a newly minted ein:ipdb buffer." - (setq comint-use-prompt-regexp t)) - -(defvar ein:ipdb--received-quit-p nil) - -(define-derived-mode ein:ipdb-mode comint-mode "EIN:IPDB" - "Run an EIN debug session. - -\\" - ;:syntax-table python-mode-syntax-table - (setq comint-prompt-regexp (concat "^" (regexp-quote ein:ipdb-buffer-prompt))) - (setq comint-input-sender 'ein:ipdb-input-sender) - (setq comint-prompt-read-only t) - (set (make-local-variable 'comint-output-filter-functions) - '(ansi-color-process-output - python-pdbtrack-comint-output-filter-function)) - (set (make-local-variable 'ein:ipdb--received-quit-p) nil) - - (unless (comint-check-proc (current-buffer)) - ;; Was cat, but on non-Unix platforms that might not exist, so - ;; use hexl instead, which is part of the Emacs distribution. - (let ((fake-proc - (condition-case nil - (start-process "ein:ipdb" (current-buffer) "cat") - (file-error (start-process "ein:ipdb" (current-buffer) "hexl"))))) - (set-process-query-on-exit-flag fake-proc nil) - (insert "=== EIN IPython Debugger ===\n") - (set-marker (process-mark fake-proc) (point)) - (comint-output-filter fake-proc ein:ipdb-buffer-prompt)))) - -(add-hook 'ein:ipdb-mode-hook 'ein:ipdb-buffer-initialize) - -(provide 'ein-ipdb) diff --git a/elpa/ein-20200415.238/ein-ipdb.elc b/elpa/ein-20200415.238/ein-ipdb.elc deleted file mode 100644 index 11ec8974dec1878b275ad846f02a5f0c48288bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13787 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 - -;; This file is NOT part of GNU Emacs. - -;; ein-ipynb-mode.el is free software: you can redistribute 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. - -;; ein-ipynb-mode.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-ipynb-mode.el. -;; If not, see . - -;;; Commentary: - -;; - -;;; Code: - -(require 'ein-process) - -(defvar ein:ipynb-parent-mode 'js-mode - "A mode (a symbol) to use for parent mode for `ein:ipynb-mode'. -Note that this variable must be set *before* compiling EIN.") - -(defalias 'ein:ipynb-parent-mode ein:ipynb-parent-mode) - -;;;###autoload -(define-derived-mode ein:ipynb-mode ein:ipynb-parent-mode "ein:ipynb" - "A simple mode for ipynb file.") - -(let ((map ein:ipynb-mode-map)) - (define-key map "\C-c\C-z" 'ein:process-find-file-callback) - (define-key map "\C-c\C-o" 'ein:process-find-file-callback) - (easy-menu-define ein:ipynb-menu map "EIN IPyNB Mode Menu" - `("EIN IPyNB File" - ,@(ein:generate-menu - '(("Open notebook" ein:process-find-file-callback)))))) - -;;;###autoload -(add-to-list 'auto-mode-alist '(".*\\.ipynb\\'" . ein:ipynb-mode)) - -(provide 'ein-ipynb-mode) - -;;; ein-ipynb-mode.el ends here diff --git a/elpa/ein-20200415.238/ein-ipynb-mode.elc b/elpa/ein-20200415.238/ein-ipynb-mode.elc deleted file mode 100644 index 12fd4cd7458e0168774d6d5b2767fb4bfc90e2e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3365 zcmbtX-*4MC5Du`H&c!lp4_nuC=v6LYyNC=+a_qKQfwe)01zWQM9rjWMC@s;k8vXD@ zDw{X#f8Tec6iaE^4QK$$5_!Bk-re^dbNKw{qpx>%c6x`0hjdhA>m-%2`ABklo{31& zg)CK46OwPhTA!A5*jvrHC|K+&AV$ z9+N645;-j-rG@AisgI&aiZV@PNqPlAKd^QYf{*%R2R`<%*Xs>S`FoX=k_Ix#-E~<+ zQmIj||Gno==_zGJENLi6ZL&p?jz||AX<8N~twkwwZ6)~o4HP_1)|-6c@~*+ScT#A{ zht_x?PZy$0!~(g>Dr5u!Q&Q7|g~Vq005RusK+fp-@yYmZZy3uZcFC zG+gfB-EZdb8}vipV}U8g!95nb)yN!RYKAdyWF}aiJM?<%*Vb?oEf>XHWr(yXd|FqU zoFCbSbG>!Tq|D94nvmQiPZ-KB zASfHoOq@$sA+<`n=W>HNPJcH`9wP0VEbVdv0t_>SUz?jI3nnEdQ+FG| zc^GgKJ+GGWkYX<&2$|esxmNAAc9=SVYHxb4t$JcqKWhY8ZAUe#!ebYBavnNt;znZ# zbG4zDt^JK5e{yLEr}J<+pN9|Y*Oir6EJ}IdYJ1Qg={saHW|FCL))zkwhRp@OU_oBR^mc3 z%k1|IeH&Z&1nO7Pg1xo>lDG!@1OjFeAY7nrqf^Kn%#(mh!1-FPdvRsx$}j*3+xB!g z9{#;OxlxF+{KvL}cX-{n(|>K^43roIHL#iAVvvzVtLJ@zFaJxP!U&iWf<3^=W2^!& z9)rg&HE=(;X+S$*so70D=46oxcum43+ws0-J+qz97*x0IJ z;#Da6w?%22qKVx#ylSZTN{Bn~sq4?+CoRDHj6B=4b&I20#nPHJ8F4PvJEl6_C>07- zhqh&j+O2J%`PbCl%tTemHwxDpW=7)smZgnGMrqu+L>apsw^`RUvTXurgVR03#pAK{ zLs4gi{lo>Q4>i!r`>LL;~VY+ zpW?w?Y}#}eGsBmP%bBK?nR4cm_OQt|FZ^=7AKZI(pUVsN#9ap+hb!829lV+L(Nx%# zlW{_L)NF@rlJm)J#~il4H@bj)j7N&g5^e+w5uHQk^A5BA4^{_V5SW$v{u2k6K{|f9 zIeA7enCo6(%>lzR?4?iu04C6|T - -;; This file is NOT part of GNU Emacs. - -;; ein-jupyter.el is free software: you can redistribute 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. - -;; ein-jupyter.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-jupyter.el. If not, see . - -;;; Commentary: - -;;; Code: - -(require 'ein-core) -(require 'ein-notebooklist) -(require 'ein-dev) - -(defcustom ein:jupyter-use-containers nil - "Take EIN in a different direcsh." - :group 'ein - :type 'boolean) - -(defcustom ein:jupyter-docker-image "jupyter/datascience-notebook" - "Docker pull whichever jupyter image you prefer. This defaults to -the 'jupyter docker stacks' on hub.docker.com. - -Optionally append ':tag', e.g., ':latest' in the customary way." - :group 'ein - :type 'string) - -(defcustom ein:jupyter-docker-mount-point "/home/jovyan/ipynb" - "Directory in docker image where to mount `ein:jupyter-default-notebook-directory'." - :group 'ein - :type 'string) - -(defcustom ein:jupyter-docker-additional-switches "-e JUPYTER_ENABLE_LAB=no --rm" - "Additional options to the 'docker run' call. - -Note some options like '-v' and '-network' are imposed by EIN." - :group 'ein - :type 'string) - -(defcustom ein:jupyter-server-command "jupyter" - "The default command to start a jupyter notebook server. - -Changing this to `jupyter-notebook' requires customizing `ein:jupyter-server-use-subcommand' to nil." - :group 'ein - :type 'string) - -(defcustom ein:jupyter-default-server-command ein:jupyter-server-command - "Obsolete alias for `ein:jupyter-server-command'" - :group 'ein - :type 'string - :set (lambda (_symbol value) - (setq ein:jupyter-server-command value))) - -(defcustom ein:jupyter-server-use-subcommand "notebook" - "Users of \"jupyter-notebook\" (as opposed to \"jupyter notebook\") need to Omit." - :group 'ein - :type '(choice (string :tag "Subcommand" "notebook") - (const :tag "Omit" nil))) - -(defcustom ein:jupyter-server-args '("--no-browser") - "Add any additional command line options you wish to include -with the call to the jupyter notebook." - :group 'ein - :type '(repeat string)) - -(defcustom ein:jupyter-default-notebook-directory nil - "Default location of ipynb files." - :group 'ein - :type 'directory) - -(defcustom ein:jupyter-default-kernel 'first-alphabetically - "With which of ${XDG_DATA_HOME}/jupyter/kernels to create new notebooks." - :group 'ein - :type (append - '(choice (other :tag "First alphabetically" first-alphabetically)) - (condition-case err - (mapcar - (lambda (x) `(const :tag ,(cdr x) ,(car x))) - (cl-loop - for (k . spec) in - (alist-get - 'kernelspecs - (let ((json-object-type 'alist)) - (json-read-from-string - (shell-command-to-string - (format "%s kernelspec list --json" - ein:jupyter-server-command))))) - collect `(,k . ,(alist-get 'display_name (alist-get 'spec spec))))) - (error (ein:log 'warn "ein:jupyter-default-kernel: %s" err) - '((string :tag "Ask")))))) - -(defvar *ein:jupyter-server-process-name* "ein server") -(defvar *ein:jupyter-server-buffer-name* - (format "*%s*" *ein:jupyter-server-process-name*)) - -(defun ein:jupyter-get-default-kernel (kernels) - (cond (ein:%notebooklist-new-kernel% - (ein:$kernelspec-name ein:%notebooklist-new-kernel%)) - ((eq ein:jupyter-default-kernel 'first-alphabetically) - (car (car kernels))) - ((stringp ein:jupyter-default-kernel) - ein:jupyter-default-kernel) - (t - (symbol-name ein:jupyter-default-kernel)))) - -(defun ein:jupyter-process-lines (url-or-port command &rest args) - "If URL-OR-PORT registered as a k8s url, preface COMMAND ARGS with `kubectl exec'." - (condition-case err - (apply #'process-lines command args) - (error (ein:log 'info "ein:jupyter-process-lines: %s" (error-message-string err)) - nil))) - -(defsubst ein:jupyter-server-process () - "Return the emacs process object of our session." - (get-buffer-process (get-buffer *ein:jupyter-server-buffer-name*))) - -(defun ein:jupyter-server--run (buf user-cmd dir &optional args) - (let* ((cmd (if ein:jupyter-use-containers "docker" user-cmd)) - (vargs (cond (ein:jupyter-use-containers - (split-string - (format "run --network host -v %s:%s %s %s" - dir - ein:jupyter-docker-mount-point - ein:jupyter-docker-additional-switches - ein:jupyter-docker-image))) - (t - (append (aif ein:jupyter-server-use-subcommand (list it)) - (list (format "--notebook-dir=%s" - (convert-standard-filename dir))) - args - (let ((copy ein:jupyter-server-args)) - (when ein:debug - (add-to-list 'copy "--debug")) - copy))))) - (proc (apply #'start-process - *ein:jupyter-server-process-name* buf cmd vargs))) - (ein:log 'info "ein:jupyter-server--run: %s %s" cmd (ein:join-str " " vargs)) - (set-process-query-on-exit-flag proc nil) - proc)) - -(defun ein:jupyter-server-conn-info (&optional buffer-name) - "Return the url-or-port and password for BUFFER or the global session." - (unless buffer-name - (setq buffer-name *ein:jupyter-server-buffer-name*)) - (let ((buffer (get-buffer buffer-name)) - (result '(nil nil))) - (if buffer - (with-current-buffer buffer - (save-excursion - (goto-char (point-max)) - (re-search-backward (format "Process %s" *ein:jupyter-server-process-name*) - nil "") ;; important if we start-stop-start - (when (re-search-forward "\\([[:alnum:]]+\\) is\\( now\\)? running" nil t) - (let ((hub-p (cl-search "jupyterhub" (downcase (match-string 1))))) - (when (re-search-forward "\\(https?://[^:]*:[0-9]+\\)\\(?:/\\?token=\\([[:alnum:]]+\\)\\)?" nil t) - (let ((raw-url (match-string 1)) - (token (or (match-string 2) (and (not hub-p) "")))) - (setq result (list (ein:url raw-url) token))))))))) - result)) - -(defun ein:jupyter-server-login-and-open (&optional callback) - "Log in and open a notebooklist buffer for a running jupyter notebook server. - -Determine if there is a running jupyter server (started via a -call to `ein:jupyter-server-start') and then try to guess if -token authentication is enabled. If a token is found use it to generate a -call to `ein:notebooklist-login' and once authenticated open the notebooklist buffer -via a call to `ein:notebooklist-open'." - (interactive) - (when (ein:jupyter-server-process) - (multiple-value-bind (url-or-port password) (ein:jupyter-server-conn-info) - (if-let ((token (ein:notebooklist-token-or-password url-or-port))) - (ein:notebooklist-login url-or-port callback nil token) - (ein:log 'error "`(ein:notebooklist-token-or-password %s)` must return non-nil" - url-or-port))))) - -(defsubst ein:set-process-sentinel (proc url-or-port) - "URL-OR-PORT might get redirected from (ein:jupyter-server-conn-info). -This is currently only the case for jupyterhub. -Once login handshake provides the new URL-OR-PORT, we set various state as pertains -our singleton jupyter server process here." - - ;; Would have used `add-function' if it didn't produce gv-ref warnings. - (set-process-sentinel - proc - (apply-partially (lambda (url-or-port* sentinel proc* event) - (aif sentinel (funcall it proc* event)) - (funcall #'ein:notebooklist-sentinel url-or-port* proc* event)) - url-or-port (process-sentinel proc)))) - -;;;###autoload -(defun ein:jupyter-crib-token (url-or-port) - "Shell out to jupyter for its credentials knowledge. Return list of (PASSWORD TOKEN)." - (aif (cl-loop for line in - (apply #'ein:jupyter-process-lines url-or-port - ein:jupyter-server-command - (split-string - (format "%s%s %s" - (aif ein:jupyter-server-use-subcommand - (concat it " ") "") - "list" "--json"))) - with token0 - with password0 - when (destructuring-bind - (&key password url token &allow-other-keys) - (ein:json-read-from-string line) - (prog1 (or (equal (ein:url url) url-or-port) - (equal (url-host (url-generic-parse-url url)) - "0.0.0.0")) - (setq password0 password) ;; t or :json-false - (setq token0 token))) - return (list password0 token0)) - it (list nil nil))) - -;;;###autoload -(defun ein:jupyter-crib-running-servers () - "Shell out to jupyter for running servers." - (cl-loop for line in - (apply #'ein:jupyter-process-lines nil - ein:jupyter-server-command - (split-string - (format "%s%s %s" - (aif ein:jupyter-server-use-subcommand - (concat it " ") "") - "list" "--json"))) - collecting (destructuring-bind - (&key url &allow-other-keys) - (ein:json-read-from-string line) - (ein:url url)))) - -;;;###autoload -(defun ein:jupyter-server-start (server-command - notebook-directory - &optional no-login-p login-callback port) - "Start SERVER-COMMAND with `--notebook-dir' NOTEBOOK-DIRECTORY. - -Login after connection established unless NO-LOGIN-P is set. -LOGIN-CALLBACK takes two arguments, the buffer created by -`ein:notebooklist-open--finish', and the url-or-port argument -of `ein:notebooklist-open*'. - -With \\[universal-argument] prefix arg, prompt the user for the -server command." - (interactive - (list (let ((default-command (executable-find ein:jupyter-server-command))) - (if (and (not ein:jupyter-use-containers) - (or current-prefix-arg (not default-command))) - (let (command result) - (while (not (setq - result - (executable-find - (setq - command - (read-string - (format - "%sServer command: " - (if command - (format "[%s not executable] " command) - "")) - nil nil ein:jupyter-server-command)))))) - result) - default-command)) - (let (result - (default-dir ein:jupyter-default-notebook-directory)) - (while (or (not result) (not (file-directory-p result))) - (setq result (read-directory-name - (format "%sNotebook directory: " - (if result - (format "[%s not a directory]" result) - "")) - default-dir default-dir t))) - result) - nil - (lambda (buffer url-or-port) - (pop-to-buffer buffer)) - nil)) - (if (ein:jupyter-server-process) - (error "ein:jupyter-server-start: please first M-x ein:stop")) - (add-hook 'kill-emacs-hook #'(lambda () - (ignore-errors (ein:jupyter-server-stop t)))) - (let ((proc (ein:jupyter-server--run *ein:jupyter-server-buffer-name* - server-command - notebook-directory - (if (numberp port) - `("--port" ,(format "%s" port) - "--port-retries" "0"))))) - (cl-loop repeat 30 - until (car (ein:jupyter-server-conn-info *ein:jupyter-server-buffer-name*)) - do (sleep-for 0 500) - finally do - (unless (car (ein:jupyter-server-conn-info *ein:jupyter-server-buffer-name*)) - (ein:log 'warn "Jupyter server failed to start, cancelling operation") - (ein:jupyter-server-stop t))) - (when (and (not no-login-p) (ein:jupyter-server-process)) - (unless login-callback - (setq login-callback #'ignore)) - (add-function :after login-callback - (apply-partially (lambda (proc* buffer url-or-port) - (ein:set-process-sentinel proc* url-or-port)) - proc)) - (ein:jupyter-server-login-and-open login-callback)))) - -;;;###autoload -(defalias 'ein:run 'ein:jupyter-server-start) - -;;;###autoload -(defalias 'ein:stop 'ein:jupyter-server-stop) - -;;;###autoload -(defun ein:jupyter-server-stop (&optional force log) - (interactive) - (ein:and-let* ((url-or-port (first (ein:jupyter-server-conn-info))) - (_ok (or force (y-or-n-p "Stop server and close notebooks?")))) - (ein:notebook-close-notebooks t) - (cl-loop repeat 10 - until (not (seq-some (lambda (proc) - (cl-search "request curl" - (process-name proc))) - (process-list))) - do (sleep-for 0 500)) - (lexical-let* ((proc (ein:jupyter-server-process)) - (pid (process-id proc))) - (if (eq system-type 'windows-nt) - (ein:query-singleton-ajax - (ein:url url-or-port "api/shutdown") - :type "POST") - (ein:log 'info "Signaled %s with pid %s" proc pid) - (signal-process pid 15)) - (run-at-time 2 nil - (lambda () - (ein:log 'info "Resignaled %s with pid %s" proc pid) - (signal-process pid (if (eq system-type 'windows-nt) 9 15))))) - - ;; `ein:notebooklist-sentinel' frequently does not trigger - (ein:notebooklist-list-remove url-or-port) - (kill-buffer (ein:notebooklist-get-buffer url-or-port)) - (when (ein:shared-output-healthy-p) - (kill-buffer (ein:shared-output-buffer))) - (when log - (with-current-buffer *ein:jupyter-server-buffer-name* - (write-region (point-min) (point-max) log))))) - -(provide 'ein-jupyter) diff --git a/elpa/ein-20200415.238/ein-jupyter.elc b/elpa/ein-20200415.238/ein-jupyter.elc deleted file mode 100644 index 0a0a79aac973d2ce20d4dd148dd5a47598d7e2ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13478 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 -;; John M. Miller - -;; This file is NOT part of GNU Emacs. - -;; ein-jupyterhub.el is free software: you can redistribute 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. - -;; ein-jupyterhub.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-jupyter.el. If not, see . - -;;; Commentary: -;; Deprecated. -;;; -;;; An interface to the Jupyterhub login and management API as described in -;;; http://jupyterhub.readthedocs.io/en/latest/api/index.html -;;; - -;; - -;;; Code: -(require 'ein-query) -(require 'ein-websocket) -(require 'ein-notebooklist) -(require 'anaphora) - -(defvar *ein:jupyterhub-connections* (make-hash-table :test #'equal)) - -(defstruct ein:$jh-conn - "Data representing a connection to a jupyterhub server." - url-or-port - version - user - token) - -(defstruct ein:$jh-user - "A jupyterhub user, per https://jupyterhub.readthedocs.io/en/latest/_static/rest-api/index.html#/definitions/User" - name - admin - groups - server - pending - last-activity) - -(defsubst ein:jupyterhub-user-path (url-or-port &rest paths) - "Goes from URL-OR-PORT/PATHS to URL-OR-PORT/user/someone/PATHS" - (let ((user-base (aif (gethash url-or-port *ein:jupyterhub-connections*) - (ein:$jh-user-server (ein:$jh-conn-user it))))) - (apply #'ein:url url-or-port user-base paths))) - -(defsubst ein:jupyterhub-api-path (url-or-port &rest paths) - (apply #'ein:url url-or-port "hub/api" paths)) - -(defun ein:jupyterhub--store-cookies (conn) - "Websockets use the url-cookie API" - (let* ((url-or-port (ein:$jh-conn-url-or-port conn)) - (parsed-url (url-generic-parse-url url-or-port)) - (host-port (if (url-port-if-non-default parsed-url) - (format "%s:%s" (url-host parsed-url) (url-port parsed-url)) - (url-host parsed-url))) - (securep (string= (url-type parsed-url) "https")) - (cookies (append - (request-cookie-alist (url-host parsed-url) "/hub/" securep) - (ein:aand (ein:$jh-conn-user conn) (ein:$jh-user-server it) - (request-cookie-alist (url-host parsed-url) it securep))))) - (dolist (c cookies) - (ein:websocket-store-cookie c host-port - (car (url-path-and-query parsed-url)) securep)))) - -(cl-defun ein:jupyterhub--login-complete (dobj conn &key response &allow-other-keys) - (deferred:callback-post dobj (list conn response))) - -(defmacro ein:jupyterhub--add-header (header) - `(setq my-settings - (plist-put my-settings :headers - (append (plist-get my-settings :headers) (list ,header))))) - -(defmacro ein:jupyterhub-query (conn-key url cb cbargs &rest settings) - `(let ((my-settings (list ,@settings))) - (ein:and-let* ((conn (gethash ,conn-key *ein:jupyterhub-connections*))) - (ein:jupyterhub--add-header - (cons "Referer" (ein:url (ein:$jh-conn-url-or-port conn) "hub/login"))) - (aif (ein:$jh-conn-token conn) - (ein:jupyterhub--add-header - (cons "Authorization" (format "token %s" it))))) - (apply #'ein:query-singleton-ajax - ,url - :error - (lambda (&rest args) - (ein:log 'error "ein:jupyterhub-query--error (%s) %s (%s)" ,url - (request-response-status-code (plist-get args :response)) - (plist-get args :symbol-status))) - :complete - (lambda (&rest args) - (ein:log 'debug "ein:jupyterhub-query--complete (%s) %s (%s)" ,url - (request-response-status-code (plist-get args :response)) - (plist-get args :symbol-status))) - :success - (lambda (&rest args) - (apply ,cb (request-response-data (plist-get args :response)) ,cbargs)) - my-settings))) - -(defsubst ein:jupyterhub--query-login (callback username password conn) - (ein:jupyterhub-query - (ein:$jh-conn-url-or-port conn) - (ein:url (ein:$jh-conn-url-or-port conn) "hub/login") - #'ein:jupyterhub--receive-login - `(,callback ,username ,password ,conn) - ;; :type "POST" ;; no type here else redirect will use POST - :parser #'ignore - :data `(("username" . ,username) - ("password" . ,password)))) - -(defun ein:jupyterhub--receive-version (data url-or-port callback username password) - (let ((conn (make-ein:$jh-conn - :url-or-port url-or-port - :version (plist-get data :version)))) - (setf (gethash url-or-port *ein:jupyterhub-connections*) conn) - (ein:jupyterhub--query-login callback username password conn))) - -(defun ein:jupyterhub--receive-user (data callback username password conn iteration) - (let ((user (make-ein:$jh-user :name (plist-get data :name) - :admin (plist-get data :admin) - :groups (plist-get data :groups) - :server (plist-get data :server) - :pending (plist-get data :pending) - :last-activity (plist-get data :last_activity)))) - (setf (ein:$jh-conn-user conn) user) - (ein:jupyterhub--store-cookies conn) - (if (not (ein:$jh-user-server user)) - (if (<= iteration 0) - (ein:jupyterhub--query-token callback username password conn) - (ein:display-warning "jupyterhub cannot start single-user server" :error)) - (ein:notebooklist-open* - (ein:jupyterhub-user-path (ein:$jh-conn-url-or-port conn)) - nil nil callback)))) - -(defsubst ein:jupyterhub--query-user (callback username password conn iteration) - (ein:jupyterhub-query - (ein:$jh-conn-url-or-port conn) - (ein:jupyterhub-api-path (ein:$jh-conn-url-or-port conn) "users" username) - #'ein:jupyterhub--receive-user - `(,callback ,username ,password ,conn ,iteration) - :type "GET" - :parser #'ein:json-read)) - -(defun ein:jupyterhub--receive-login (_data callback username password conn) - (ein:jupyterhub--store-cookies conn) - (ein:jupyterhub--query-user callback username password conn 0)) - -(defsubst ein:jupyterhub--query-server (callback username password conn) - (ein:jupyterhub-query - (ein:$jh-conn-url-or-port conn) - (ein:jupyterhub-api-path (ein:$jh-conn-url-or-port conn) - "users" username "server") - #'ein:jupyterhub--receive-server - `(,callback ,username ,password ,conn) - :type "POST" - :parser #'ein:json-read)) - -(defun ein:jupyterhub--receive-token (data callback username password conn) - (setf (ein:$jh-conn-token conn) (plist-get data :token)) - (ein:jupyterhub--query-server callback username password conn)) - -(defun ein:jupyterhub--receive-server (_data callback username password conn) - (ein:jupyterhub--query-user callback username password conn 1)) - -(defun ein:jupyterhub--query-token (callback username password conn) - (ein:jupyterhub-query - (ein:$jh-conn-url-or-port conn) - (ein:jupyterhub-api-path (ein:$jh-conn-url-or-port conn) - "authorizations/token") - #'ein:jupyterhub--receive-token - `(,callback ,username ,password ,conn) - :type "POST" - :data (json-encode `((:username . ,username) - (:password . ,password))) - :parser #'ein:json-read)) - -(defsubst ein:jupyterhub--query-version (url-or-port callback username password) - (ein:jupyterhub-query - url-or-port - (ein:jupyterhub-api-path url-or-port) - #'ein:jupyterhub--receive-version - `(,url-or-port ,callback ,username ,password) - :type "GET" - :parser #'ein:json-read)) - -;;;###autoload -(defun ein:jupyterhub-connect (url-or-port username password callback) - "Log on to a jupyterhub server using PAM authentication. Requires jupyterhub version 0.8 or greater. CALLBACK takes two arguments, the resulting buffer and the singleuser url-or-port" - (interactive (let ((url-or-port (ein:notebooklist-ask-url-or-port)) - (pam-plist (ein:notebooklist-ask-user-pw-pair "User" "Password"))) - (cl-loop for (user pw) on pam-plist by (function cddr) - return (list url-or-port (symbol-name user) pw (lambda (buffer _url-or-port) (pop-to-buffer buffer)))))) - (ein:jupyterhub--query-version url-or-port callback username password)) - -(provide 'ein-jupyterhub) diff --git a/elpa/ein-20200415.238/ein-jupyterhub.elc b/elpa/ein-20200415.238/ein-jupyterhub.elc deleted file mode 100644 index 4a5b221f6adaaee9ff2e13d48a69582c3853436e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41339 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 R10f1}=!28*G_`p9{{cA(@Lm7_ diff --git a/elpa/ein-20200415.238/ein-kernel.el b/elpa/ein-20200415.238/ein-kernel.el deleted file mode 100644 index 0b982e80..00000000 --- a/elpa/ein-20200415.238/ein-kernel.el +++ /dev/null @@ -1,798 +0,0 @@ -;;; ein-kernel.el --- Communicate with IPython notebook server - -;; Copyright (C) 2012- Takafumi Arakaki - -;; Author: Takafumi Arakaki - -;; This file is NOT part of GNU Emacs. - -;; ein-kernel.el is free software: you can redistribute 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. - -;; ein-kernel.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-kernel.el. If not, see . - -;;; Commentary: -;; `ein:kernel' is the proxy class of notebook server state. -;; It agglomerates both the "kernel" and "session" objects of server described here -;; https://github.com/jupyter/jupyter/wiki/Jupyter-Notebook-Server-API -;; It may have been better to keep them separate to allow parallel reasoning with -;; the notebook server, but that time is past. - -;;; Code: - -(require 'ansi-color) - -(require 'ein-core) -(require 'ein-classes) -(require 'ein-log) -(require 'ein-websocket) -(require 'ein-events) -(require 'ein-query) -(require 'ein-ipdb) - -(declare-function ein:notebook-get-opened-notebook "ein-notebook") -(declare-function ein:notebooklist-get-buffer "ein-notebooklist") -(declare-function ein:notebooklist-reload "ein-notebooklist") - -(defun ein:$kernel-session-url (kernel) - (concat "/api/sessions/" (ein:$kernel-session-id kernel))) - -;;;###autoload -(defalias 'ein:kernel-url-or-port 'ein:$kernel-url-or-port) - -;;;###autoload -(defalias 'ein:kernel-id 'ein:$kernel-kernel-id) - -(defcustom ein:pre-kernel-execute-functions nil - "List of functions to call before sending a message to the kernel for execution. Each function is called with the message (see `ein:kernel--get-msg') about to be sent." - :type 'list - :group 'ein) - -(defcustom ein:on-shell-reply-functions nil - "List of functions to call when the kernel responds on the shell channel. - Each function should have the call signature: msg-id header content metadata" - :type 'list - :group 'ein) - -(defcustom ein:on-kernel-connect-functions nil - "Abnormal hook that is run after a websocket connection is made -to a jupyter kernel. Functions defined here must accept a single -argument, which is the kernel that was just connected." - :type 'list - :group 'ein) - - -;;; Initialization and connection. - -(defun ein:kernel-new (url-or-port path kernelspec base-url events &optional api-version) - (make-ein:$kernel - :url-or-port url-or-port - :path path - :kernelspec kernelspec - :events events - :api-version (or api-version 5) - :session-id (ein:utils-uuid) - :kernel-id nil - :websocket nil - :base-url base-url - :stdin-activep nil - :oinfo-cache (make-hash-table :test #'equal) - :username "username" - :msg-callbacks (make-hash-table :test 'equal))) - - -(defun ein:kernel-del (kernel) - "Destructor for `ein:$kernel'." - (ein:kernel-disconnect kernel)) - - -(defun ein:kernel--get-msg (kernel msg-type content) - (list - :header (list - :msg_id (ein:utils-uuid) - :username (ein:$kernel-username kernel) - :session (ein:$kernel-session-id kernel) - :version "5.0" - :date (format-time-string "%Y-%m-%dT%T" (current-time)) ; ISO 8601 timestamp - :msg_type msg-type) - :metadata (make-hash-table) - :content content - :parent_header (make-hash-table))) - -(cl-defun ein:kernel-session-p (kernel callback &optional iteration) - "Don't make any changes on the server side. CALLBACK with arity 2, kernel and a boolean whether session exists on server." - (unless iteration - (setq iteration 0)) - (let ((session-id (ein:$kernel-session-id kernel))) - (ein:query-singleton-ajax - (ein:url (ein:$kernel-url-or-port kernel) "api/sessions" session-id) - :type "GET" - :parser #'ein:json-read - :complete (apply-partially #'ein:kernel-session-p--complete session-id) - :success (apply-partially #'ein:kernel-session-p--success kernel session-id callback) - :error (apply-partially #'ein:kernel-session-p--error kernel callback iteration)))) - -(cl-defun ein:kernel-session-p--complete (session-id - &key data response - &allow-other-keys - &aux (resp-string (format "STATUS: %s DATA: %s" (request-response-status-code response) data))) - (ein:log 'debug "ein:kernel-session-p--complete %s" resp-string)) - -(cl-defun ein:kernel-session-p--error (kernel callback iteration - &key error-thrown symbol-status data - &allow-other-keys) - (if (ein:aand (plist-get data :message) (cl-search "not found" it)) - (when callback (funcall callback kernel nil)) - (let* ((max-tries 3) - (tries-left (1- (- max-tries iteration)))) - (ein:log 'verbose "ein:kernel-session-p--error [%s], %s tries left" - (car error-thrown) tries-left) - (if (> tries-left 0) - (ein:kernel-session-p kernel callback (1+ iteration)))))) - -(cl-defun ein:kernel-session-p--success (kernel session-id callback - &key data &allow-other-keys) - (let ((session-p (equal (plist-get data :id) session-id))) - (ein:log 'verbose "ein:kernel-session-p--success: session-id=%s session-p=%s" - session-id session-p) - (when callback (funcall callback kernel session-p)))) - -(cl-defun ein:kernel-restart-session (kernel) - "Server side delete of KERNEL session and subsequent restart with all new state" - (ein:kernel-delete-session - (lambda (kernel) - (ein:events-trigger (ein:$kernel-events kernel) 'status_restarting.Kernel) - (ein:kernel-retrieve-session kernel 0 - (lambda (kernel) - (ein:events-trigger (ein:$kernel-events kernel) - 'status_restarted.Kernel)))) - :kernel kernel)) - -(cl-defun ein:kernel-retrieve-session (kernel &optional iteration callback) - "Formerly ein:kernel-start, but that was misnomer because 1. the server really starts a session (and an accompanying kernel), and 2. it may not even start a session if one exists for the same path. - -If 'picking up from where we last left off', that is, we restart emacs and reconnect to same server, jupyter will hand us back the original, still running session. - -The server logic is here (could not find other documentation) -https://github.com/jupyter/notebook/blob/04a686dbaf9dfe553324a03cb9e6f778cf1e3da1/notebook/services/sessions/handlers.py#L56-L81 - -CALLBACK of arity 1, the kernel. -" - (unless iteration - (setq iteration 0)) - (if (<= (ein:$kernel-api-version kernel) 2) - (error "Api %s unsupported" (ein:$kernel-api-version kernel)) - (let ((kernel-id (ein:$kernel-kernel-id kernel)) - (kernelspec (ein:$kernel-kernelspec kernel)) - (path (ein:$kernel-path kernel))) - (ein:query-singleton-ajax - (ein:url (ein:$kernel-url-or-port kernel) "api/sessions") - :type "POST" - :data (json-encode - (cond ((<= (ein:$kernel-api-version kernel) 4) - `(("notebook" . - (("path" . ,path))) - ,@(if kernelspec - `(("kernel" . - (("name" . ,(ein:$kernelspec-name kernelspec)))))))) - (t `(("path" . ,path) - ("type" . "notebook") - ,@(if kernelspec - `(("kernel" . - (("name" . ,(ein:$kernelspec-name kernelspec)) - ,@(if kernel-id - `(("id" . ,kernel-id))))))))))) - :parser #'ein:json-read - :complete (apply-partially #'ein:kernel-retrieve-session--complete kernel callback) - :success (apply-partially #'ein:kernel-retrieve-session--success kernel callback) - :error (apply-partially #'ein:kernel-retrieve-session--error kernel iteration callback))))) - -(cl-defun ein:kernel-retrieve-session--complete - (kernel callback - &key data response - &allow-other-keys - &aux (resp-string (format "STATUS: %s DATA: %s" (request-response-status-code response) data))) - (ein:log 'debug "ein:kernel-retrieve-session--complete %s" resp-string)) - -(cl-defun ein:kernel-retrieve-session--error - (kernel iteration callback - &key error-thrown symbol-status &allow-other-keys) - (let* ((max-tries 3) - (tries-left (1- (- max-tries iteration)))) - (ein:log 'verbose "ein:kernel-retrieve-session--error [%s], %s tries left" - (car error-thrown) tries-left) - (sleep-for 0 (* (1+ iteration) 500)) - (if (> tries-left 0) - (ein:kernel-retrieve-session kernel (1+ iteration) callback)))) - -(cl-defun ein:kernel-retrieve-session--success (kernel callback &key data &allow-other-keys) - (let ((session-id (plist-get data :id))) - (if (plist-get data :kernel) - (setq data (plist-get data :kernel))) - (cl-destructuring-bind (&key id &allow-other-keys) data - (ein:log 'verbose "ein:kernel-retrieve-session--success: kernel-id=%s session-id=%s" - id session-id) - (setf (ein:$kernel-kernel-id kernel) id) - (setf (ein:$kernel-session-id kernel) session-id) - (setf (ein:$kernel-ws-url kernel) (ein:kernel--ws-url (ein:$kernel-url-or-port kernel))) - (setf (ein:$kernel-kernel-url kernel) - (concat (file-name-as-directory (ein:$kernel-base-url kernel)) id))) - (ein:kernel-start-websocket kernel callback))) - -(defun ein:kernel-reconnect-session (kernel &optional callback) - "Check if session still exists. If it does, retrieve it. If it doesn't, ask the user to create a new session (ein:kernel-retrieve-session both retrieves and creates). - -CALLBACK takes one argument kernel (e.g., execute cell now that we're reconnected)" - (ein:kernel-disconnect kernel) - (ein:kernel-session-p - kernel - (apply-partially - (lambda (callback* kernel session-p) - (when (or session-p - (and (not noninteractive) (y-or-n-p "Session not found. Restart?"))) - (ein:events-trigger (ein:$kernel-events kernel) 'status_reconnecting.Kernel) - (ein:kernel-retrieve-session - kernel 0 - (apply-partially - (lambda (callback** kernel) - (ein:events-trigger (ein:$kernel-events kernel) - 'status_reconnected.Kernel) - (when callback** (funcall callback** kernel))) - callback*)))) - callback))) - -(defun ein:kernel--ws-url (url-or-port) - "Assuming URL-OR-PORT already normalized by `ein:url' - -See https://github.com/ipython/ipython/pull/3307" - (let* ((parsed-url (url-generic-parse-url url-or-port)) - (protocol (if (string= (url-type parsed-url) "https") "wss" "ws"))) - (format "%s://%s:%s%s" - protocol - (url-host parsed-url) - (url-port parsed-url) - (url-filename parsed-url)))) - -(defun ein:kernel-send-cookie (channel host) - ;; cookie can be an empty string for IPython server with no password, - ;; but something must be sent to start channel. - (let ((cookie (ein:query-get-cookie host "/"))) - (ein:websocket-send channel cookie))) - -(defun ein:kernel--handle-websocket-reply (kernel ws frame) - (ein:and-let* ((packet (websocket-frame-payload frame)) - (channel (plist-get (ein:json-read-from-string packet) :channel))) - (cond ((string-equal channel "iopub") - (ein:kernel--handle-iopub-reply kernel packet)) - ((string-equal channel "shell") - (ein:kernel--handle-shell-reply kernel packet)) - ((string-equal channel "stdin") - (ein:kernel--handle-stdin-reply kernel packet)) - (t (ein:log 'warn "Received reply from unforeseen channel %s" channel))))) - -(defun ein:start-single-websocket (kernel open-callback) - "OPEN-CALLBACK (kernel) (e.g., execute cell)" - (let ((ws-url (concat (ein:$kernel-ws-url kernel) - (ein:$kernel-kernel-url kernel) - "/channels?session_id=" - (ein:$kernel-session-id kernel)))) - (ein:log 'verbose "WS start: %s" ws-url) - (setf (ein:$kernel-websocket kernel) - (ein:websocket ws-url kernel - (apply-partially #'ein:kernel--handle-websocket-reply kernel) - (lambda (ws) - (let* ((websocket (websocket-client-data ws)) - (kernel (ein:$websocket-kernel websocket))) - (unless (ein:$websocket-closed-by-client websocket) - (ein:log 'verbose "WS closed unexpectedly: %s" (websocket-url ws)) - (ein:kernel-disconnect kernel)))) - (apply-partially - (lambda (cb ws) - (let* ((websocket (websocket-client-data ws)) - (kernel (ein:$websocket-kernel websocket))) - (when (ein:kernel-live-p kernel) - (ein:log 'debug "ein:start-single-websocket: Running on-connect abnormal hooks.") - (run-hook-with-args 'ein:on-kernel-connect-functions kernel) - (when cb - (funcall cb kernel))) - (ein:log 'verbose "WS opened: %s" (websocket-url ws)))) - open-callback))))) - -(defun ein:kernel-start-websocket (kernel callback) - (cond ((<= (ein:$kernel-api-version kernel) 2) - (error "Api version %s unsupported" (ein:$kernel-api-version kernel))) - (t (ein:start-single-websocket kernel callback)))) - -(defun ein:kernel-on-connect (kernel content -metadata-not-used-) - (ein:log 'info "Kernel connect_request_reply received.")) - -(defun ein:kernel-disconnect (kernel) - "Close websocket connection to running kernel, but do not -delete the kernel on the server side" - (ein:events-trigger (ein:$kernel-events kernel) 'status_disconnected.Kernel) - (aif (ein:$kernel-websocket kernel) - (progn (ein:websocket-close it) - (setf (ein:$kernel-websocket kernel) nil)))) - -(defun ein:kernel-live-p (kernel) - (and (ein:$kernel-p kernel) - (ein:aand (ein:$kernel-websocket kernel) (ein:websocket-open-p it)))) - -(defun ein:kernel-when-ready (kernel callback) - "Execute CALLBACK of arity 1 (the kernel) when KERNEL is ready. Warn user otherwise." - (if (ein:kernel-live-p kernel) - (funcall callback kernel) - (ein:log 'verbose "Kernel %s unavailable" (ein:$kernel-kernel-id kernel)) - (ein:kernel-reconnect-session kernel callback))) - -(defun ein:kernel-object-info-request (kernel objname callbacks &optional cursor-pos detail-level) - "Send object info request of OBJNAME to KERNEL. - -When calling this method pass a CALLBACKS structure of the form: - - (:object_info_reply (FUNCTION . ARGUMENT)) - -Call signature:: - - (`funcall' FUNCTION ARGUMENT CONTENT METADATA) - -CONTENT and METADATA are given by `object_info_reply' message. - -`object_info_reply' message is documented here: -http://ipython.org/ipython-doc/dev/development/messaging.html#object-information -" - (assert (ein:kernel-live-p kernel) nil "object_info_reply: Kernel is not active.") - (when objname - (if (<= (ein:$kernel-api-version kernel) 2) - (error "Api version %s unsupported" (ein:$kernel-api-version kernel))) - (let* ((content (if (< (ein:$kernel-api-version kernel) 5) - (list - ;; :text "" - :oname (format "%s" objname) - :cursor_pos (or cursor-pos 0) - :detail_level (or detail-level 0)) - (list - :code (format "%s" objname) - :cursor_pos (or cursor-pos 0) - :detail_level (or detail-level 0)))) - (msg (ein:kernel--get-msg kernel "inspect_request" - (append content (list :detail_level 1)))) - (msg-id (plist-get (plist-get msg :header) :msg_id))) - (ein:websocket-send-shell-channel kernel msg) - (ein:kernel-set-callbacks-for-msg kernel msg-id callbacks)))) - -(cl-defun ein:kernel-execute (kernel code &optional callbacks - &key - (silent t) - (store-history t) - (user-expressions (make-hash-table)) - (allow-stdin t) - (stop-on-error nil)) - "Execute CODE on KERNEL. - -The CALLBACKS plist looks like: - - (:execute_reply EXECUTE-REPLY-CALLBACK - :output OUTPUT-CALLBACK - :clear_output CLEAR-OUTPUT-CALLBACK - :set_next_input SET-NEXT-INPUT) - -Right hand sides ending -CALLBACK above are of the form (FUNCTION ARG1 ... ARGN). -(Hindsight: this was all much better implemented using `apply-partially') - -Return randomly generated MSG-ID tag uniquely identifying expectation of a kernel response. -" - (assert (ein:kernel-live-p kernel) nil "execute_reply: Kernel is not active.") - (let* ((content (list - :code code - :silent (or silent json-false) - :store_history (or store-history json-false) - :user_expressions user-expressions - :allow_stdin allow-stdin - :stop_on_error (or stop-on-error json-false))) - (msg (ein:kernel--get-msg kernel "execute_request" content)) - (msg-id (plist-get (plist-get msg :header) :msg_id))) - (ein:log 'debug "ein:kernel-execute: code=%s msg_id=%s" code msg-id) - (run-hook-with-args 'ein:pre-kernel-execute-functions msg) - (ein:websocket-send-shell-channel kernel msg) - (ein:kernel-set-callbacks-for-msg kernel msg-id callbacks) - (unless silent - (mapc #'ein:funcall-packed - (ein:$kernel-after-execute-hook kernel))) - msg-id)) - -(defun ein:kernel-complete (kernel line cursor-pos callbacks errback) - "Complete code at CURSOR-POS in a string LINE on KERNEL. - -CURSOR-POS is the position in the string LINE, not in the buffer. - -ERRBACK takes a string (error message). - -When calling this method pass a CALLBACKS structure of the form: - - (:complete_reply (FUNCTION . ARGUMENT)) - -Call signature:: - - (funcall FUNCTION ARGUMENT CONTENT METADATA) - -CONTENT and METADATA are given by `complete_reply' message. - -`complete_reply' message is documented here: -http://ipython.org/ipython-doc/dev/development/messaging.html#complete -" - (condition-case err - (let* ((content (if (< (ein:$kernel-api-version kernel) 4) - (list - ;; :text "" - :line line - :cursor_pos cursor-pos) - (list - :code line - :cursor_pos cursor-pos))) - (msg (ein:kernel--get-msg kernel "complete_request" content)) - (msg-id (plist-get (plist-get msg :header) :msg_id))) - (assert (ein:kernel-live-p kernel) nil "kernel not live") - (ein:websocket-send-shell-channel kernel msg) - (ein:kernel-set-callbacks-for-msg kernel msg-id callbacks) - msg-id) - (error (if errback (funcall errback (error-message-string err)) - (ein:display-warning (error-message-string err) :error))))) - - -(cl-defun ein:kernel-history-request (kernel callbacks - &key - (output nil) - (raw t) - (hist-access-type "tail") - session - start - stop - (n 10) - pattern - unique) - "Request execution history to KERNEL. - -When calling this method pass a CALLBACKS structure of the form: - - (:history_reply (FUNCTION . ARGUMENT)) - -Call signature:: - - (`funcall' FUNCTION ARGUMENT CONTENT METADATA) - -CONTENT and METADATA are given by `history_reply' message. - -`history_reply' message is documented here: -http://ipython.org/ipython-doc/dev/development/messaging.html#history - -Relevant Python code: - -* :py:method:`IPython.zmq.ipkernel.Kernel.history_request` -* :py:class:`IPython.core.history.HistoryAccessor` -" - (assert (ein:kernel-live-p kernel) nil "history_reply: Kernel is not active.") - (let* ((content (list - :output (ein:json-any-to-bool output) - :raw (ein:json-any-to-bool raw) - :hist_access_type hist-access-type - :session session - :start start - :stop stop - :n n - :pattern pattern - :unique unique)) - (msg (ein:kernel--get-msg kernel "history_request" content)) - (msg-id (plist-get (plist-get msg :header) :msg_id))) - (ein:websocket-send-shell-channel kernel msg) - (ein:kernel-set-callbacks-for-msg kernel msg-id callbacks) - msg-id)) - -(defun ein:kernel-connect-request (kernel callbacks) - "Request basic information for a KERNEL. - -When calling this method pass a CALLBACKS structure of the form:: - - (:connect_reply (FUNCTION . ARGUMENT)) - -Call signature:: - - (`funcall' FUNCTION ARGUMENT CONTENT METADATA) - -CONTENT and METADATA are given by `kernel_info_reply' message. - -`connect_request' message is documented here: -http://ipython.org/ipython-doc/dev/development/messaging.html#connect - -Example:: - - (ein:kernel-connect-request - (ein:get-kernel) - '(:kernel_connect_reply (message . \"CONTENT: %S\\nMETADATA: %S\"))) -" - ;(assert (ein:kernel-live-p kernel) nil "connect_reply: Kernel is not active.") - (let* ((msg (ein:kernel--get-msg kernel "connect_request" (make-hash-table))) - (msg-id (plist-get (plist-get msg :header) :msg_id))) - (ein:websocket-send-shell-channel kernel msg) - (ein:kernel-set-callbacks-for-msg kernel msg-id callbacks) - msg-id)) - -(defun ein:kernel-interrupt (kernel) - (when (ein:kernel-live-p kernel) - (ein:log 'info "Interrupting kernel") - (ein:query-singleton-ajax - (ein:url (ein:$kernel-url-or-port kernel) - (ein:$kernel-kernel-url kernel) - "interrupt") - :type "POST" - :success (lambda (&rest ignore) - (ein:log 'info "Sent interruption command."))))) - -(cl-defun ein:kernel-delete-session (&optional callback - &key url-or-port path kernel - &aux (session-id)) - "Regardless of success or error, we clear all state variables of kernel and funcall CALLBACK (kernel)" - (cond (kernel - (setq url-or-port (ein:$kernel-url-or-port kernel)) - (setq path (ein:$kernel-path kernel)) - (setq session-id (ein:$kernel-session-id kernel))) - ((and url-or-port path) - (aif (ein:notebook-get-opened-notebook url-or-port path) - (progn - (setq kernel (ein:$notebook-kernel it)) - (setq session-id (ein:$kernel-session-id kernel))) - (let ((ein:force-sync t)) - (ein:content-query-sessions - url-or-port - (lambda (session-hash) - (setq session-id (car (gethash path session-hash)))) - nil)))) - (t (error "ein:kernel-delete-session: need kernel, or url-or-port and path"))) - (if session-id - (ein:query-singleton-ajax - (ein:url url-or-port "api/sessions" session-id) - :type "DELETE" - :complete (apply-partially #'ein:kernel-delete-session--complete kernel session-id callback) - :error (apply-partially #'ein:kernel-delete-session--error session-id nil) - :success (apply-partially #'ein:kernel-delete-session--success session-id - (aif (ein:notebooklist-get-buffer url-or-port) - (buffer-local-value 'ein:%notebooklist% it)) - nil)) - (ein:log 'verbose "ein:kernel-delete-session: no sessions found for %s" path) - (when callback - (funcall callback kernel)))) - -(cl-defun ein:kernel-delete-session--error (session-id callback - &key response error-thrown - &allow-other-keys) - (ein:log 'error "ein:kernel-delete-session--error %s: ERROR %s DATA %s" - session-id (car error-thrown) (cdr error-thrown))) - -(cl-defun ein:kernel-delete-session--success (session-id nblist callback - &key data symbol-status response - &allow-other-keys) - (ein:log 'verbose "ein:kernel-delete-session--success: %s deleted" session-id) - (when nblist - (ein:notebooklist-reload nblist))) - -(cl-defun ein:kernel-delete-session--complete (kernel session-id callback - &key data response - &allow-other-keys - &aux (resp-string (format "STATUS: %s DATA: %s" (request-response-status-code response) data))) - (ein:log 'verbose "ein:kernel-delete-session--complete %s" resp-string) - (when kernel - (ein:kernel-disconnect kernel)) - (when callback (funcall callback kernel))) - -;; Reply handlers. -(defun ein:kernel-get-callbacks-for-msg (kernel msg-id) - (gethash msg-id (ein:$kernel-msg-callbacks kernel))) - -(defun ein:kernel-set-callbacks-for-msg (kernel msg-id callbacks) - "Set up promise for MSG-ID." - (puthash msg-id callbacks (ein:$kernel-msg-callbacks kernel))) - -(defun ein:kernel--handle-stdin-reply (kernel packet) - (setf (ein:$kernel-stdin-activep kernel) t) - (cl-destructuring-bind - (&key header parent_header metadata content &allow-other-keys) - (ein:json-read-from-string packet) - (let ((msg-type (plist-get header :msg_type)) - (msg-id (plist-get header :msg_id)) - (password (plist-get content :password))) - (ein:log 'debug "ein:kernel--handle-stdin-reply: msg_type=%s msg_id=%s" - msg-type msg-id) - (cond ((string-equal msg-type "input_request") - (if (not (eql password :json-false)) - (let* ((passwd (read-passwd (plist-get content :prompt))) - (content (list :value passwd)) - (msg (ein:kernel--get-msg kernel "input_reply" content))) - (ein:websocket-send-stdin-channel kernel msg) - (setf (ein:$kernel-stdin-activep kernel) nil)) - (cond ((string-match "ipdb>" (plist-get content :prompt)) (ein:run-ipdb-session kernel "ipdb> ")) - ((string-match "(Pdb)" (plist-get content :prompt)) (ein:run-ipdb-session kernel "(Pdb) ")) - (t (let* ((in (read-string (plist-get content :prompt))) - (content (list :value in)) - (msg (ein:kernel--get-msg kernel "input_reply" content))) - (ein:websocket-send-stdin-channel kernel msg) - (setf (ein:$kernel-stdin-activep kernel) nil)))))))))) - -(defun ein:kernel--handle-payload (kernel callbacks payload) - (cl-loop with events = (ein:$kernel-events kernel) - for p in payload - for text = (or (plist-get p :text) (plist-get (plist-get p :data) :text/plain)) - for source = (plist-get p :source) - if (member source '("IPython.kernel.zmq.page.page" - "IPython.zmq.page.page" - "page")) - do (when (not (equal (ein:trim text) "")) - (ein:events-trigger - events 'open_with_text.Pager (list :text text))) - else if - (member - source - '("IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.set_next_input" - "IPython.zmq.zmqshell.ZMQInteractiveShell.set_next_input" - "set_next_input")) - do (let ((cb (plist-get callbacks :set_next_input))) - (when cb (ein:funcall-packed cb text))))) - -(defun ein:kernel--handle-shell-reply (kernel packet) - (cl-destructuring-bind - (&key header content metadata parent_header &allow-other-keys) - (ein:json-read-from-string packet) - (let* ((msg-type (plist-get header :msg_type)) - (msg-id (plist-get parent_header :msg_id)) - (callbacks (ein:kernel-get-callbacks-for-msg kernel msg-id))) - (ein:log 'debug "ein:kernel--handle-shell-reply: msg_type=%s msg_id=%s" - msg-type msg-id) - (run-hook-with-args 'ein:on-shell-reply-functions msg-type header content metadata) - (aif (plist-get callbacks (intern-soft (format ":%s" msg-type))) - (ein:funcall-packed it content metadata) - (ein:log 'info "ein:kernel--handle-shell-reply: No :%s callback for msg_id=%s" - msg-type msg-id)) - (aif (plist-get content :payload) - (ein:kernel--handle-payload kernel callbacks it)) - (let ((events (ein:$kernel-events kernel))) - (ein:case-equal msg-type - (("execute_reply") - (aif (plist-get content :execution_count) - (ein:events-trigger events 'execution_count.Kernel it)))))))) - -(defun ein:kernel--handle-iopub-reply (kernel packet) - (if (ein:$kernel-stdin-activep kernel) - (ein:ipdb--handle-iopub-reply kernel packet) - (cl-destructuring-bind - (&key content metadata parent_header header &allow-other-keys) - (ein:json-read-from-string packet) - (let* ((msg-type (plist-get header :msg_type)) - (msg-id (plist-get header :msg_id)) - (parent-id (plist-get parent_header :msg_id)) - (callbacks (ein:kernel-get-callbacks-for-msg kernel parent-id)) - (events (ein:$kernel-events kernel))) - (ein:log 'debug - "ein:kernel--handle-iopub-reply: msg_type=%s msg_id=%s parent_id=%s" - msg-type msg-id parent-id) - (ein:case-equal msg-type - (("stream" "display_data" "pyout" "pyerr" "error" "execute_result") - (aif (plist-get callbacks :output) ;; ein:cell--handle-output - (ein:funcall-packed it msg-type content metadata) - (ein:log 'warn (concat "ein:kernel--handle-iopub-reply: " - "No :output callback for parent_id=%s") - parent-id))) - (("status") - (ein:case-equal (plist-get content :execution_state) - (("busy") - (ein:events-trigger events 'status_busy.Kernel)) - (("idle") - (ein:events-trigger events 'status_idle.Kernel)) - (("dead") - (ein:kernel-disconnect kernel)))) - (("data_pub") - (ein:log 'verbose "ein:kernel--handle-iopub-reply: data_pub %S" packet)) - (("clear_output") - (aif (plist-get callbacks :clear_output) - (ein:funcall-packed it content metadata) - (ein:log 'info (concat "ein:kernel--handle-iopub-reply: " - "No :clear_output callback for parent_id=%s") - parent-id)))))))) - -(defun ein:kernel-filename-to-python (kernel filename) - "See: `ein:filename-to-python'." - (ein:filename-to-python (ein:$kernel-url-or-port kernel) filename)) - -(defun ein:kernel-filename-from-python (kernel filename) - "See: `ein:filename-from-python'." - (ein:filename-from-python (ein:$kernel-url-or-port kernel) filename)) - -(defun ein:kernel-construct-defstring (content) - "Construct call signature from CONTENT of ``:object_info_reply``. -Used in `ein:pytools-finish-tooltip', etc." - (or (plist-get content :call_def) - (plist-get content :init_definition) - (plist-get content :definition))) - -(defun ein:kernel-construct-help-string (content) - "Construct help string from CONTENT of ``:object_info_reply``. -Used in `ein:pytools-finish-tooltip', etc." - (let* ((defstring (ein:aand - (ein:kernel-construct-defstring content) - (ansi-color-apply it) - (ein:string-fill-paragraph it))) - (docstring (ein:aand - (or (plist-get content :call_docstring) - (plist-get content :init_docstring) - (plist-get content :docstring) - ;; "" - ) - (ansi-color-apply it))) - (help (ein:aand - (delete nil (list defstring docstring)) - (ein:join-str "\n" it)))) - help)) - -(defun ein:kernel-request-stream (kernel code func &optional args) - "Run lisp callback FUNC with the output stream returned by Python CODE. - -The first argument to the lisp function FUNC is the stream output -as a string and the rest of the argument is the optional ARGS." - (ein:kernel-execute - kernel - code - (list :output (cons (lambda (packed msg-type content -metadata-not-used-) - (let ((func (car packed)) - (args (cdr packed))) - (when (equal msg-type "stream") - (aif (plist-get content :text) - (apply func it args))))) - (cons func args))))) - -(cl-defun ein:kernel-history-request-synchronously - (kernel &rest args &key (timeout 0.5) (tick-time 0.05) &allow-other-keys) - "Send the history request and wait TIMEOUT seconds. -Return a list (CONTENT METADATA). -This function checks the request reply every TICK-TIME seconds. -See `ein:kernel-history-request' for other usable options." - ;; As `result' and `finished' are set in callback, make sure they - ;; won't be trapped in other let-bindings. - (lexical-let (result finished) - (apply - #'ein:kernel-history-request - kernel - (list :history_reply - (cons (lambda (-ignore- content metadata) - (setq result (list content metadata)) - (setq finished t)) - nil)) - args) - (cl-loop repeat (floor (/ timeout tick-time)) - do (sit-for tick-time) - when finished - return t - finally (error "Timeout")) - result)) - -(defun ein:kernel-history-search-synchronously (kernel pattern &rest args) - "Search execution history in KERNEL using PATTERN. -Return matched history as a list of strings. -See `ein:kernel-history-request-synchronously' and -`ein:kernel-history-request' for usable options." - (let ((reply - (apply #'ein:kernel-history-request-synchronously - kernel - :hist-access-type "search" - :pattern pattern - args))) - (mapcar #'caddr (plist-get (car reply) :history)))) - -(provide 'ein-kernel) - -;;; ein-kernel.el ends here diff --git a/elpa/ein-20200415.238/ein-kernel.elc b/elpa/ein-20200415.238/ein-kernel.elc deleted file mode 100644 index fe56efbc8224e55745c8aee574f83505bdb501d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37745 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 k5 - -;; This file is NOT part of GNU Emacs. - -;; ein-kernelinfo.el is free software: you can redistribute 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. - -;; ein-kernelinfo.el is distributed in the hope that it will be -;; useful, but WITHOUT ANY WARRANTY; without even the implied warranty -;; of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-kernelinfo.el. If not, see . - -;;; Commentary: - -;; - -;;; Code: - -(require 'eieio) -(require 'ein-kernel) - -(defclass ein:kernelinfo () - ((kernel - :initarg :kernel :type ein:$kernel - :documentation "Kernel instance.") - (get-buffers - :initarg :get-buffers - :documentation "A packed function to get buffers associated -with the kernel. The buffer local `default-directory' variable -in these buffer will be synced with the kernel's cwd.") - (hostname - :initarg :hostname :type string - :documentation "Host name of the machine where the kernel is running on.") - (ccwd - :initarg :ccwd :type string - :documentation "cached CWD (last time checked CWD).")) - :documentation "Info related (but unimportant) to kernel") - -(defun ein:kernelinfo-new (kernel get-buffers) - "Make a new `ein:kernelinfo' instance based on KERNEL and GET-BUFFERS." - (let ((kerinfo (make-instance 'ein:kernelinfo))) - (setf (slot-value kerinfo 'kernel) kernel) - (setf (slot-value kerinfo 'get-buffers) get-buffers) - kerinfo)) -(provide 'ein-kernelinfo) - -;;; ein-kernelinfo.el ends here diff --git a/elpa/ein-20200415.238/ein-kernelinfo.elc b/elpa/ein-20200415.238/ein-kernelinfo.elc deleted file mode 100644 index 6e58bc995c7207fde9688be71f5bfc9ca1bb410f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2270 zcmbtVU2oeq6wRaK{eW%Q!*1nlv4GNuWII_B6mXKdThML;nhblW1C*BNn2StmBo)v5 z^*f~G#rD>`RDf*p^74M3dw4#6clG7o-d_9s{G6`zqLhWm!$K+=FL-9@Q5Y+=qV%}e z4?9cg=ERGFbm`>e>ZLb|RZ|Bm|3|6SJ!cx9cd?7Q+b!MHB>fXM@uCb1Io{OCR z^^%ubv9-0;jH#FxQ6S2?bm)$g3o$<0H6D`+wJaj}>_HeM3d+Td7m}mOQk~T@sb-p$wJKZi2jo|9YguVTE;H`D zl}+89C1b$}%jUAkx6OFTC(YCc;5fL{Q>zOBUlE{5-K=14Rf>{&y&g>_uMW3Eh=EP( z1kWRi(qS)&d|pxsW><@;F5pv_1RIcgGt6QP>`Vf$b*zxrIZ6e1DqfJ11$Dbkk;a=Ut5g;YJ54x1YcuGJ&Ln!0PgEFnHy2cg)FZmZqSnN8WytEIZ+BHVmIDl#(`I!@ zkK9N;EyP4&WN{qjZq6(vcmtDZSI8iz9s7rtvSl6;n``Sp9bzM^Cs8O>%_nrWliyD` zNa3WOdEe+gV50;r=K^SbN`^pGrcwy;p0o;1GkD){STCP*mccgCxcdDybpdEcAVdLD z5~0En$FPew?FM;`c_1SSUuEh}D@T=*i&7hO*2RR5)CG^?J35ZrozbvQS4Q|j;iSZp z^z;uDn~-7v8HFG}ZX@`x_ielDyAy_S2j0~A(EZ*Bglr4#Y#g}8^8;AnsNVt|gdq=` z#LKc+)kCyK-_C^I(SW+01L{#S7$)&u{J%7|HV<9_mDL{BFk~gFu$=%{KU_!#l#!Xh zF`InCxW5Ooum}He`Ke^trmD|;IR_KacK)r=IYJt=_V#^b>rnAOXpQzqo&6C$hpo}; z*2U$eC)W-7I*?zydA&)W&Do(ZTRE(mRT49@WIq&0g=-^jed9%6;Ab$IHKMqw5Da?ur%v*! ubN1NanmTD%ZMbr^hwYK*f(J8F`2|mymZExBmeMHrS~E diff --git a/elpa/ein-20200415.238/ein-kill-ring.el b/elpa/ein-20200415.238/ein-kill-ring.el deleted file mode 100644 index 9d762a9e..00000000 --- a/elpa/ein-20200415.238/ein-kill-ring.el +++ /dev/null @@ -1,55 +0,0 @@ -;;; ein-kill-ring.el --- Kill-ring for cells - -;; Copyright (C) 2012- Takafumi Arakaki - -;; Author: Takafumi Arakaki - -;; This file is NOT part of GNU Emacs. - -;; ein-kill-ring.el is free software: you can redistribute 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. - -;; ein-kill-ring.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-kill-ring.el. If not, see . - -;;; Commentary: - -;; Stolen from simple.el. - -;;; Code: - -(defvar ein:kill-ring nil) -(defvar ein:kill-ring-yank-pointer nil) -(defvar ein:kill-ring-max kill-ring-max) - -(defun ein:kill-new (obj) - "Make OBJ the latest kill in the kill ring `ein:kill-ring'. -Set `ein:kill-ring-yank-pointer' to point to it." - (push obj ein:kill-ring) - (if (> (length ein:kill-ring) ein:kill-ring-max) - (setcdr (nthcdr (1- ein:kill-ring-max) ein:kill-ring) nil)) - (setq ein:kill-ring-yank-pointer ein:kill-ring)) - -(defun ein:current-kill (n &optional do-not-move) - "Rotate the yanking point by N places, and then return that kill. -If optional arg DO-NOT-MOVE is non-nil, then don't actually -move the yanking point; just return the Nth kill forward." - (unless ein:kill-ring (error "Kill ring is empty")) - (let ((ARGth-kill-element - (nthcdr (mod (- n (length ein:kill-ring-yank-pointer)) - (length ein:kill-ring)) - ein:kill-ring))) - (unless do-not-move - (setq ein:kill-ring-yank-pointer ARGth-kill-element)) - (car ARGth-kill-element))) - -(provide 'ein-kill-ring) - -;;; ein-kill-ring.el ends here diff --git a/elpa/ein-20200415.238/ein-kill-ring.elc b/elpa/ein-20200415.238/ein-kill-ring.elc deleted file mode 100644 index ecb66f4ec34618268934f41eecd5cac6df1e3826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1245 zcmbu9QE%EX5XX6h^l9D0H0@zGmPsUjgE&=RaP zv*6nMXzxH0PBN(Og9)~Q%56vpmM)^e_umX6aT5j2@URexNhu1#FbbQkC}{a; zZsLaTzeRhy47YgjKV19JMz*<7F6J3f$PS?A3}<#qq#y|pbq`<1?r41NUXE}2fP-Qh8M8Nb z$Eg%m9E@16aJsfmD%a1X?!v$6YAV1(mnOEi;eLlk`qIbJEngm$eLf)?<_%&t{M zrHcdRnq&q(5^WU=Ncsrh<4*=PF50C?41N{|k#Pva57Er{y)PUb9-P%5i;zPO;w9kc zR|7q_YFw7E6s6%0VlM-jQc^+ryJ - -;; This file is NOT part of GNU Emacs. - -;; ein-log.el is free software: you can redistribute 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. - -;; ein-log.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with ein-log.el. If not, see . - -;;; Commentary: - -;; - -;;; Code: - -(require 'ein-core) - -(defvar ein:log-all-buffer-name "*ein:log-all*") - -(defvar ein:log-level-def - '(;; debugging - (blather . 60) (trace . 50) (debug . 40) - ;; information - (verbose . 30) (info . 20) - ;; errors - (warn . 10) (error . 0)) - "Named logging levels.") -;; Some names are stolen from supervisord (http://supervisord.org/logging.html) - -(defvar ein:log-level 30) -(defvar ein:log-message-level 20) - -(defvar ein:log-print-length 10 "`print-length' for `ein:log'") -(defvar ein:log-print-level 1 "`print-level' for `ein:log'") -(defvar ein:log-max-string 1000) - - -(defun ein:log-set-level (level) - (setq ein:log-level (ein:log-level-name-to-int level))) - -(defun ein:log-set-message-level (level) - (setq ein:log-message-level (ein:log-level-name-to-int level))) - -(defun ein:log-level-int-to-name (int) - (cl-loop for (n . i) in ein:log-level-def - when (>= int i) - return n - finally 'error)) - -(defun ein:log-level-name-to-int (name) - (cdr (assq name ein:log-level-def))) - -(defsubst ein:log-strip-timestamp (msg) - (replace-regexp-in-string "^[0-9: ]+" "" msg)) - -(defun ein:log-wrapper (level func) - (setq level (ein:log-level-name-to-int level)) - (when (<= level ein:log-level) - (let* ((levname (ein:log-level-int-to-name level)) - (print-level ein:log-print-level) - (print-length ein:log-print-length) - (msg (format "%s: [%s] %s" (format-time-string "%H:%M:%S:%3N") levname (funcall func))) - (orig-buffer (current-buffer))) - (if (and ein:log-max-string - (> (length msg) ein:log-max-string)) - (setq msg (substring msg 0 ein:log-max-string))) - (ein:with-read-only-buffer (get-buffer-create ein:log-all-buffer-name) - (goto-char (point-max)) - (insert msg (format " @%S" orig-buffer) "\n")) - (when (<= level ein:log-message-level) - (message "ein: %s" (ein:log-strip-timestamp msg)))))) - -(defmacro ein:log (level string &rest args) - (declare (indent 1)) - `(ein:log-wrapper ,level (lambda () (format ,string ,@args)))) - -;; FIXME: this variable must go to somewhere more central -(defvar ein:debug nil - "Set to non-`nil' to raise errors instead of suppressing it. -Change the behavior of `ein:log-ignore-errors'.") - -(defmacro ein:log-ignore-errors (&rest body) - "Execute BODY; if an error occurs, log the error and return nil. -Otherwise, return result of last form in BODY." - (declare (debug t) (indent 0)) - `(if ein:debug - (progn ,@body) - (condition-case err - (progn ,@body) - (error - (ein:log 'debug "Error: %S" err) - (ein:log 'error (error-message-string err)) - nil)))) - -(defun ein:log-pop-to-request-buffer () - (interactive) - (aif (get-buffer request-log-buffer-name) - (pop-to-buffer it) - (message "No buffer named \"%s\"" request-log-buffer-name))) - -(defun ein:log-pop-to-all-buffer () - (interactive) - (pop-to-buffer (get-buffer-create ein:log-all-buffer-name))) - -(provide 'ein-log) - -;;; ein-log.el ends here diff --git a/elpa/ein-20200415.238/ein-log.elc b/elpa/ein-20200415.238/ein-log.elc deleted file mode 100644 index 47510001228b327030c60883998c0736c250fc40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3551 zcmbtXZBN@)6ppknAyuQT+ghM4J2=gfw7tl&Nr0efEsSlIy7mLpv?ahbOO(A5Sc52ULmen=-1+eztCCaE8V zWb}7TwR7cXW3q#QqB!#>{@-?n?R2N6Hh&%aDUBe7rm0NHy$*k| z8j)j%G?WxX_JWeam6W8N1inlt8{?p1=6Vr=Px@g4KJ}+otF;sPe(EQZTG9`N6D6`! zYrArEX(xo0K@fQY(HFz%Xe1MX_)5~A&h0$aI<>|N!=yLZauEd2L*OZpmoi9qzF88c zHUu8>!Q(4C2{G>S zSSCrt()11{jVBoG?(KD!JyJ%ns3r3zGEHqyiu?o=z&TT=ix_aquo`;VxJ4sqxhR6r zTJ~}NFbpe9=^yOF6vXP_MjV3l(b901x`nL0m2OS!4u!(wE>(rjmp{!-nqxWUgGzz@nyYgh3|N? zRk`zZdG#wS80`w*FYdi8BWT>ISflT;+S{+(75K{`UG#t}pwa!VF%ZHD1j z#ZFQ$hffz_Fz}hxMj;$ql*l+hNsB~!@LodwcZ_3sq?7meKEi##_&-^(|%3pRmV(e#5A* zZ{fUQ;@id7tFJdYmR7=RMU65GFXXr+CNBT^afyL)jahC+|I2tPkLNq{6$WCQ*coZf zbUG)JjfMR_6bdJkWJ%?gi>PELwi%X42`@jClW`*E#3j z>pu~us8M;vuv5^Uhus|7#A3{(GFfn_MH)*7d{IJBVRR)nb%jmtZ*S!zj_|NWsN(li zR9#67jWb3N*G17CZ7|8#`GGLk&@So5Jszu^R4uJjWTKS9z4LtE>}PW{M}^A#zzx5> ziKtj&=61;fms;wHRK*K}RuYLQ#N7}U2&J@MRdjWmEuL>gZqDZI(V|65jEsh3-UOiQ O(g$s*e;nXyr}huEdq3|0 diff --git a/elpa/ein-20200415.238/ein-markdown-mode.el b/elpa/ein-20200415.238/ein-markdown-mode.el deleted file mode 100644 index 48387ff9..00000000 --- a/elpa/ein-20200415.238/ein-markdown-mode.el +++ /dev/null @@ -1,8084 +0,0 @@ -;;; ein:markdown-mode.el --- Major mode for Markdown-formatted text -*- lexical-binding: t; -*- - -;; Copyright (C) 2007-2017 Jason R. Blevins and markdown-mode -;; contributors. - -;; Author: Jason R. Blevins - -;; 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 . - -;;; Commentary: - -;; Pare markdown-mode for EIN (and fix some bugs) - -;;; Code: - -(require 'easymenu) -(require 'outline) -(require 'thingatpt) -(require 'cl-lib) -(require 'url-parse) -(require 'button) -(require 'color) -(require 'rx) - -(defvar jit-lock-start) -(defvar jit-lock-end) -(defvar flyspell-generic-check-word-predicate) - -(declare-function eww-open-file "eww") -(declare-function url-path-and-query "url-parse") - - -;;; Constants ================================================================= - -(defconst ein:markdown-mode-version "2.4-dev" - "ein:markdown mode version number.") - -(defconst ein:markdown-output-buffer-name "*markdown-output*" - "Name of temporary buffer for markdown command output.") - - -;;; Global Variables ========================================================== - -(defvar ein:markdown-reference-label-history nil - "History of used reference labels.") - -;;; Customizable Variables ==================================================== - -(defvar ein:markdown-mode-hook nil - "Hook run when entering Markdown mode.") - -(defgroup ein:markdown nil - "Major mode for editing text files in Markdown format." - :prefix "ein:markdown-" - :group 'text) - -(defcustom ein:markdown-command "ein:markdown" - "Command to run markdown." - :group 'ein:markdown - :type '(choice (string :tag "Shell command") function)) - -(defcustom ein:markdown-command-needs-filename nil - "Set to non-nil if `markdown-command' does not accept input from stdin. -Instead, it will be passed a filename as the final command line -option. As a result, you will only be able to run Markdown from -buffers which are visiting a file." - :group 'ein:markdown - :type 'boolean) - -(defcustom ein:markdown-open-command nil - "Command used for opening Markdown files directly. -For example, a standalone Markdown previewer. This command will -be called with a single argument: the filename of the current -buffer. It can also be a function, which will be called without -arguments." - :group 'ein:markdown - :type '(choice file function (const :tag "None" nil))) - -(defcustom ein:markdown-hr-strings - '("-------------------------------------------------------------------------------" - "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" - "---------------------------------------" - "* * * * * * * * * * * * * * * * * * * *" - "---------" - "* * * * *") - "Strings to use when inserting horizontal rules. -The first string in the list will be the default when inserting a -horizontal rule. Strings should be listed in decreasing order of -prominence (as in headings from level one to six) for use with -promotion and demotion functions." - :group 'ein:markdown - :type '(repeat string)) - -(defcustom ein:markdown-bold-underscore nil - "Use two underscores when inserting bold text instead of two asterisks." - :group 'ein:markdown - :type 'boolean) - -(defcustom ein:markdown-italic-underscore nil - "Use underscores when inserting italic text instead of asterisks." - :group 'ein:markdown - :type 'boolean) - -(defcustom ein:markdown-marginalize-headers nil - "When non-nil, put opening atx header markup in a left margin. - -This setting goes well with `markdown-asymmetric-header'. But -sadly it conflicts with `linum-mode' since they both use the -same margin." - :group 'ein:markdown - :type 'boolean - :safe 'booleanp - :package-version '(ein:markdown-mode . "2.4")) - -(defcustom ein:markdown-marginalize-headers-margin-width 6 - "Character width of margin used for marginalized headers. -The default value is based on there being six heading levels -defined by Markdown and HTML. Increasing this produces extra -whitespace on the left. Decreasing it may be preferred when -fewer than six nested heading levels are used." - :group 'ein:markdown - :type 'natnump - :safe 'natnump - :package-version '(ein:markdown-mode . "2.4")) - -(defcustom ein:markdown-asymmetric-header nil - "Determines if atx header style will be asymmetric. -Set to a non-nil value to use asymmetric header styling, placing -header markup only at the beginning of the line. By default, -balanced markup will be inserted at the beginning and end of the -line around the header title." - :group 'ein:markdown - :type 'boolean) - -(defcustom ein:markdown-indent-function 'ein:markdown-indent-line - "Function to use to indent." - :group 'ein:markdown - :type 'function) - -(defcustom ein:markdown-indent-on-enter t - "Determines indentation behavior when pressing \\[newline]. -Possible settings are nil, t, and 'indent-and-new-item. - -When non-nil, pressing \\[newline] will call `newline-and-indent' -to indent the following line according to the context using -`markdown-indent-function'. In this case, note that -\\[electric-newline-and-maybe-indent] can still be used to insert -a newline without indentation. - -When set to 'indent-and-new-item and the point is in a list item -when \\[newline] is pressed, the list will be continued on the next -line, where a new item will be inserted. - -When set to nil, simply call `newline' as usual. In this case, -you can still indent lines using \\[ein:markdown-cycle] and continue -lists with \\[ein:markdown-insert-list-item]. - -Note that this assumes the variable `electric-indent-mode' is -non-nil (enabled). When it is *disabled*, the behavior of -\\[newline] and `\\[electric-newline-and-maybe-indent]' are -reversed." - :group 'ein:markdown - :type '(choice (const :tag "Don't automatically indent" nil) - (const :tag "Automatically indent" t) - (const :tag "Automatically indent and insert new list items" indent-and-new-item))) - -(defcustom ein:markdown-uri-types - '("acap" "cid" "data" "dav" "fax" "file" "ftp" - "gopher" "http" "https" "imap" "ldap" "mailto" - "mid" "message" "modem" "news" "nfs" "nntp" - "pop" "prospero" "rtsp" "service" "sip" "tel" - "telnet" "tip" "urn" "vemmi" "wais") - "Link types for syntax highlighting of URIs." - :group 'ein:markdown - :type '(repeat (string :tag "URI scheme"))) - -(defcustom ein:markdown-url-compose-char - '(?∞ ?… ?⋯ ?# ?★ ?⚓) - "Placeholder character for hidden URLs. -This may be a single character or a list of characters. In case -of a list, the first one that satisfies `char-displayable-p' will -be used." - :type '(choice - (character :tag "Single URL replacement character") - (repeat :tag "List of possible URL replacement characters" - character)) - :package-version '(ein:markdown-mode . "2.3")) - -(defcustom ein:markdown-blockquote-display-char - '("▌" "┃" ">") - "String to display when hiding blockquote markup. -This may be a single string or a list of string. In case of a -list, the first one that satisfies `char-displayable-p' will be -used." - :type 'string - :type '(choice - (string :tag "Single blockquote display string") - (repeat :tag "List of possible blockquote display strings" string)) - :package-version '(ein:markdown-mode . "2.3")) - -(defcustom ein:markdown-hr-display-char - '(?─ ?┠?-) - "Character for hiding horizontal rule markup. -This may be a single character or a list of characters. In case -of a list, the first one that satisfies `char-displayable-p' will -be used." - :group 'ein:markdown - :type '(choice - (character :tag "Single HR display character") - (repeat :tag "List of possible HR display characters" character)) - :package-version '(ein:markdown-mode . "2.3")) - -(defcustom ein:markdown-definition-display-char - '(?☠?♠?≡ ?⌑ ?◊ ?:) - "Character for replacing definition list markup. -This may be a single character or a list of characters. In case -of a list, the first one that satisfies `char-displayable-p' will -be used." - :type '(choice - (character :tag "Single definition list character") - (repeat :tag "List of possible definition list characters" character)) - :package-version '(ein:markdown-mode . "2.3")) - -(defcustom ein:markdown-enable-math nil - "Syntax highlighting for inline LaTeX and itex expressions. -Set this to a non-nil value to turn on math support by default. -Math support can be enabled, disabled, or toggled later using -`markdown-toggle-math' or \\[ein:markdown-toggle-math]." - :group 'ein:markdown - :type 'boolean - :safe 'booleanp) -(make-variable-buffer-local 'ein:markdown-enable-math) - -(defcustom ein:markdown-enable-html t - "Enable font-lock support for HTML tags and attributes." - :group 'ein:markdown - :type 'boolean - :safe 'booleanp - :package-version '(ein:markdown-mode . "2.4")) - -(defcustom ein:markdown-css-paths nil - "URL of CSS file to link to in the output XHTML." - :group 'ein:markdown - :type '(repeat (string :tag "CSS File Path"))) - -(defcustom ein:markdown-content-type "text/html" - "Content type string for the http-equiv header in XHTML output. -When set to an empty string, this attribute is omitted. Defaults to -`text/html'." - :group 'ein:markdown - :type 'string) - -(defcustom ein:markdown-coding-system nil - "Character set string for the http-equiv header in XHTML output. -Defaults to `buffer-file-coding-system' (and falling back to -`utf-8' when not available). Common settings are `iso-8859-1' -and `iso-latin-1'. Use `list-coding-systems' for more choices." - :group 'ein:markdown - :type 'coding-system) - -(defcustom ein:markdown-xhtml-header-content "" - "Additional content to include in the XHTML block." - :group 'ein:markdown - :type 'string) - -(defcustom ein:markdown-xhtml-body-preamble "" - "Content to include in the XHTML block, before the output." - :group 'ein:markdown - :type 'string - :safe 'stringp - :package-version '(ein:markdown-mode . "2.4")) - -(defcustom ein:markdown-xhtml-body-epilogue "" - "Content to include in the XHTML block, after the output." - :group 'ein:markdown - :type 'string - :safe 'stringp - :package-version '(ein:markdown-mode . "2.4")) - -(defcustom ein:markdown-xhtml-standalone-regexp - "^\\(<\\?xml\\|\\[ein:markdown-follow-thing-at-point] and \\[ein:markdown-follow-link-at-point] -call this function with the filename as only argument whenever -they encounter a filename (instead of a URL) to be visited and -use its return value instead of the filename in the link. For -example, if absolute filenames are actually relative to a server -root directory, you can set -`markdown-translate-filename-function' to a function that -prepends the root directory to the given filename." - :group 'ein:markdown - :type 'function - :risky t - :package-version '(ein:markdown-mode . "2.4")) - -(defcustom ein:markdown-max-image-size nil - "Maximum width and height for displayed inline images. -This variable may be nil or a cons cell (MAX-WIDTH . MAX-HEIGHT). -When nil, use the actual size. Otherwise, use ImageMagick to -resize larger images to be of the given maximum dimensions. This -requires Emacs to be built with ImageMagick support." - :group 'ein:markdown - :package-version '(ein:markdown-mode . "2.4") - :type '(choice - (const :tag "Use actual image width" nil) - (cons (choice (sexp :tag "Maximum width in pixels") - (const :tag "No maximum width" nil)) - (choice (sexp :tag "Maximum height in pixels") - (const :tag "No maximum height" nil))))) - - -;;; Markdown-Specific `rx' Macro ============================================== - -;; Based on python-rx from python.el. -(eval-and-compile - (defconst ein:markdown-rx-constituents - `((newline . ,(rx "\n")) - (indent . ,(rx (or (repeat 4 " ") "\t"))) - (block-end . ,(rx (and (or (one-or-more (zero-or-more blank) "\n") line-end)))) - (numeral . ,(rx (and (one-or-more (any "0-9#")) "."))) - (bullet . ,(rx (any "*+:-"))) - (list-marker . ,(rx (or (and (one-or-more (any "0-9#")) ".") - (any "*+:-")))) - (checkbox . ,(rx "[" (any " xX") "]"))) - "ein:markdown-specific sexps for `markdown-rx'") - - (defun ein:markdown-rx-to-string (form &optional no-group) - "ein:markdown mode specialized `rx-to-string' function. -This variant supports named Markdown expressions in FORM. -NO-GROUP non-nil means don't put shy groups around the result." - (let ((rx-constituents (append ein:markdown-rx-constituents rx-constituents))) - (rx-to-string form no-group))) - - (defmacro ein:markdown-rx (&rest regexps) - "ein:markdown mode specialized rx macro. -This variant of `rx' supports common Markdown named REGEXPS." - (cond ((null regexps) - (error "No regexp")) - ((cdr regexps) - (ein:markdown-rx-to-string `(and ,@regexps) t)) - (t - (ein:markdown-rx-to-string (car regexps) t))))) - - -;;; Regular Expressions ======================================================= - -(defconst ein:markdown-regex-comment-start - "") - (setq-local comment-start-skip "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�cw7a&8>Ck1uCeR99nAbxBP#!?*cq7(i1=A?=g9i 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 L`u4n|CKdeyTQmEP diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__abs__ b/elpa/elpy-20200329.1830/snippets/python-mode/__abs__ deleted file mode 100644 index 12b1585a..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__abs__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __abs__ -# key: __abs__ -# group: Special methods -# -- -def __abs__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__add__ b/elpa/elpy-20200329.1830/snippets/python-mode/__add__ deleted file mode 100644 index a70f20f5..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__add__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __add__ -# key: __add__ -# group: Special methods -# -- -def __add__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__and__ b/elpa/elpy-20200329.1830/snippets/python-mode/__and__ deleted file mode 100644 index 56961d34..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__and__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __and__ -# key: __and__ -# group: Special methods -# -- -def __and__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__bool__ b/elpa/elpy-20200329.1830/snippets/python-mode/__bool__ deleted file mode 100644 index ba4ffe85..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__bool__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __bool__ -# key: __bool__ -# group: Special methods -# -- -def __bool__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__call__ b/elpa/elpy-20200329.1830/snippets/python-mode/__call__ deleted file mode 100644 index dea84632..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__call__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __call__ -# key: __call__ -# group: Special methods -# -- -def __call__(self, ${1:*args}): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__cmp__ b/elpa/elpy-20200329.1830/snippets/python-mode/__cmp__ deleted file mode 100644 index c2666214..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__cmp__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __cmp__ -# key: __cmp__ -# group: Special methods -# -- -def __cmp__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__coerce__ b/elpa/elpy-20200329.1830/snippets/python-mode/__coerce__ deleted file mode 100644 index 297138ca..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__coerce__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __coerce__ -# key: __coerce__ -# group: Special methods -# -- -def __coerce__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__complex__ b/elpa/elpy-20200329.1830/snippets/python-mode/__complex__ deleted file mode 100644 index 108e47ec..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__complex__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __complex__ -# key: __complex__ -# group: Special methods -# -- -def __complex__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__contains__ b/elpa/elpy-20200329.1830/snippets/python-mode/__contains__ deleted file mode 100644 index 5376c2dd..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__contains__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __contains__ -# key: __contains__ -# group: Special methods -# -- -def __contains__(self, item): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__del__ b/elpa/elpy-20200329.1830/snippets/python-mode/__del__ deleted file mode 100644 index a3a1a04b..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__del__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __del__ -# key: __del__ -# group: Special methods -# -- -def __del__(self): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__delattr__ b/elpa/elpy-20200329.1830/snippets/python-mode/__delattr__ deleted file mode 100644 index fe41a47a..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__delattr__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __delattr__ -# key: __delattr__ -# group: Special methods -# -- -def __delattr__(self, name): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__delete__ b/elpa/elpy-20200329.1830/snippets/python-mode/__delete__ deleted file mode 100644 index 7b216b47..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__delete__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __delete__ -# key: __delete__ -# group: Special methods -# -- -def __delete__(self, instance): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__delitem__ b/elpa/elpy-20200329.1830/snippets/python-mode/__delitem__ deleted file mode 100644 index fd79a02c..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__delitem__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __delitem__ -# key: __delitem__ -# group: Special methods -# -- -def __delitem__(self, key): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__div__ b/elpa/elpy-20200329.1830/snippets/python-mode/__div__ deleted file mode 100644 index 8da4ea92..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__div__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __div__ -# key: __div__ -# group: Special methods -# -- -def __div__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__divmod__ b/elpa/elpy-20200329.1830/snippets/python-mode/__divmod__ deleted file mode 100644 index 58632747..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__divmod__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __divmod__ -# key: __divmod__ -# group: Special methods -# -- -def __divmod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__enter__ b/elpa/elpy-20200329.1830/snippets/python-mode/__enter__ deleted file mode 100644 index 0ad587fc..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__enter__ +++ /dev/null @@ -1,9 +0,0 @@ -# -*- mode: snippet -*- -# name: __enter__ -# key: __enter__ -# group: Special methods -# -- -def __enter__(self): - $0 - - return self \ No newline at end of file diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__eq__ b/elpa/elpy-20200329.1830/snippets/python-mode/__eq__ deleted file mode 100644 index 0f772fff..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__eq__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __eq__ -# key: __eq__ -# group: Special methods -# -- -def __eq__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__exit__ b/elpa/elpy-20200329.1830/snippets/python-mode/__exit__ deleted file mode 100644 index e1945241..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__exit__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __exit__ -# key: __exit__ -# group: Special methods -# -- -def __exit__(self, exc_type, exc_value, traceback): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__float__ b/elpa/elpy-20200329.1830/snippets/python-mode/__float__ deleted file mode 100644 index 6f1ab4ae..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__float__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __float__ -# key: __float__ -# group: Special methods -# -- -def __float__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__floordiv__ b/elpa/elpy-20200329.1830/snippets/python-mode/__floordiv__ deleted file mode 100644 index 117f174d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__floordiv__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __floordiv__ -# key: __floordiv__ -# group: Special methods -# -- -def __floordiv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__ge__ b/elpa/elpy-20200329.1830/snippets/python-mode/__ge__ deleted file mode 100644 index a7f5c49b..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__ge__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __ge__ -# key: __ge__ -# group: Special methods -# -- -def __ge__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__get__ b/elpa/elpy-20200329.1830/snippets/python-mode/__get__ deleted file mode 100644 index 9d4a9fa9..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__get__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __get__ -# key: __get__ -# group: Special methods -# -- -def __get__(self, instance, owner): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__getattr__ b/elpa/elpy-20200329.1830/snippets/python-mode/__getattr__ deleted file mode 100644 index 07e9afcd..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__getattr__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __getattr__ -# key: __getattr__ -# group: Special methods -# -- -def __getattr__(self, name): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__getattribute__ b/elpa/elpy-20200329.1830/snippets/python-mode/__getattribute__ deleted file mode 100644 index e6bfedd7..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__getattribute__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __getattribute__ -# key: __getattribute__ -# group: Special methods -# -- -def __getattribute__(self, name): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__getitem__ b/elpa/elpy-20200329.1830/snippets/python-mode/__getitem__ deleted file mode 100644 index 6d73dc72..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__getitem__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __getitem__ -# key: __getitem__ -# group: Special methods -# -- -def __getitem__(self, key): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__gt__ b/elpa/elpy-20200329.1830/snippets/python-mode/__gt__ deleted file mode 100644 index 0fb0eb3b..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__gt__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __gt__ -# key: __gt__ -# group: Special methods -# -- -def __gt__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__hash__ b/elpa/elpy-20200329.1830/snippets/python-mode/__hash__ deleted file mode 100644 index a1171044..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__hash__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __hash__ -# key: __hash__ -# group: Special methods -# -- -def __hash__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__hex__ b/elpa/elpy-20200329.1830/snippets/python-mode/__hex__ deleted file mode 100644 index 62df1d71..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__hex__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __hex__ -# key: __hex__ -# group: Special methods -# -- -def __hex__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__iadd__ b/elpa/elpy-20200329.1830/snippets/python-mode/__iadd__ deleted file mode 100644 index fe1f2445..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__iadd__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __iadd__ -# key: __iadd__ -# group: Special methods -# -- -def __iadd__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__iand__ b/elpa/elpy-20200329.1830/snippets/python-mode/__iand__ deleted file mode 100644 index 6b027e91..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__iand__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __iand__ -# key: __iand__ -# group: Special methods -# -- -def __iand__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__idiv__ b/elpa/elpy-20200329.1830/snippets/python-mode/__idiv__ deleted file mode 100644 index fb32a864..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__idiv__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __idiv__ -# key: __idiv__ -# group: Special methods -# -- -def __idiv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__ifloordiv__ b/elpa/elpy-20200329.1830/snippets/python-mode/__ifloordiv__ deleted file mode 100644 index 8d200726..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__ifloordiv__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __ifloordiv__ -# key: __ifloordiv__ -# group: Special methods -# -- -def __ifloordiv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__ilshift__ b/elpa/elpy-20200329.1830/snippets/python-mode/__ilshift__ deleted file mode 100644 index e29895fb..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__ilshift__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __ilshift__ -# key: __ilshift__ -# group: Special methods -# -- -def __ilshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__imod__ b/elpa/elpy-20200329.1830/snippets/python-mode/__imod__ deleted file mode 100644 index 4d74b135..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__imod__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __imod__ -# key: __imod__ -# group: Special methods -# -- -def __imod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__imul__ b/elpa/elpy-20200329.1830/snippets/python-mode/__imul__ deleted file mode 100644 index ee848298..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__imul__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __imul__ -# key: __imul__ -# group: Special methods -# -- -def __imul__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__index__ b/elpa/elpy-20200329.1830/snippets/python-mode/__index__ deleted file mode 100644 index 7337f76d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__index__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __index__ -# key: __index__ -# group: Special methods -# -- -def __index__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__init__ b/elpa/elpy-20200329.1830/snippets/python-mode/__init__ deleted file mode 100644 index e1f6cded..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__init__ +++ /dev/null @@ -1,10 +0,0 @@ -# -*- mode: snippet -*- -# name: __init__ with assignment -# key: __init__ -# group: Special methods -# -- -def __init__(self${1:, args}): - """$2 - - """ - ${1:$(elpy-snippet-init-assignments yas-text)} diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__instancecheck__ b/elpa/elpy-20200329.1830/snippets/python-mode/__instancecheck__ deleted file mode 100644 index 4b567aa2..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__instancecheck__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __instancecheck__ -# key: __instancecheck__ -# group: Special methods -# -- -def __instancecheck__(self, instance): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__int__ b/elpa/elpy-20200329.1830/snippets/python-mode/__int__ deleted file mode 100644 index fa136df3..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__int__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __int__ -# key: __int__ -# group: Special methods -# -- -def __int__(self): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__invert__ b/elpa/elpy-20200329.1830/snippets/python-mode/__invert__ deleted file mode 100644 index bbf1df45..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__invert__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __invert__ -# key: __invert__ -# group: Special methods -# -- -def __invert__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__ior__ b/elpa/elpy-20200329.1830/snippets/python-mode/__ior__ deleted file mode 100644 index 045a0d54..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__ior__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __ior__ -# key: __ior__ -# group: Special methods -# -- -def __ior__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__ipow__ b/elpa/elpy-20200329.1830/snippets/python-mode/__ipow__ deleted file mode 100644 index ec62f49f..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__ipow__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __ipow__ -# key: __ipow__ -# group: Special methods -# -- -def __ipow__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__irshift__ b/elpa/elpy-20200329.1830/snippets/python-mode/__irshift__ deleted file mode 100644 index 193f790e..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__irshift__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __irshift__ -# key: __irshift__ -# group: Special methods -# -- -def __irshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__isub__ b/elpa/elpy-20200329.1830/snippets/python-mode/__isub__ deleted file mode 100644 index 70fd5747..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__isub__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __isub__ -# key: __isub__ -# group: Special methods -# -- -def __isub__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__iter__ b/elpa/elpy-20200329.1830/snippets/python-mode/__iter__ deleted file mode 100644 index a7002e0b..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__iter__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __iter__ -# key: __iter__ -# group: Special methods -# -- -def __iter__(self): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__itruediv__ b/elpa/elpy-20200329.1830/snippets/python-mode/__itruediv__ deleted file mode 100644 index 14caec60..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__itruediv__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __itruediv__ -# key: __itruediv__ -# group: Special methods -# -- -def __itruediv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__ixor__ b/elpa/elpy-20200329.1830/snippets/python-mode/__ixor__ deleted file mode 100644 index ffba3ede..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__ixor__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __ixor__ -# key: __ixor__ -# group: Special methods -# -- -def __ixor__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__le__ b/elpa/elpy-20200329.1830/snippets/python-mode/__le__ deleted file mode 100644 index f08aebe8..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__le__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __le__ -# key: __le__ -# group: Special methods -# -- -def __le__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__len__ b/elpa/elpy-20200329.1830/snippets/python-mode/__len__ deleted file mode 100644 index 7d15f93d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__len__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __len__ -# key: __len__ -# group: Special methods -# -- -def __len__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__long__ b/elpa/elpy-20200329.1830/snippets/python-mode/__long__ deleted file mode 100644 index 16c3cd20..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__long__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __long__ -# key: __long__ -# group: Special methods -# -- -def __long__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__lshift__ b/elpa/elpy-20200329.1830/snippets/python-mode/__lshift__ deleted file mode 100644 index 493a21f9..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__lshift__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __lshift__ -# key: __lshift__ -# group: Special methods -# -- -def __lshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__lt__ b/elpa/elpy-20200329.1830/snippets/python-mode/__lt__ deleted file mode 100644 index a47a2480..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__lt__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __lt__ -# key: __lt__ -# group: Special methods -# -- -def __lt__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__mod__ b/elpa/elpy-20200329.1830/snippets/python-mode/__mod__ deleted file mode 100644 index 94a5ff56..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__mod__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __mod__ -# key: __mod__ -# group: Special methods -# -- -def __mod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__mul__ b/elpa/elpy-20200329.1830/snippets/python-mode/__mul__ deleted file mode 100644 index f4a3d7a6..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__mul__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __mul__ -# key: __mul__ -# group: Special methods -# -- -def __mul__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__ne__ b/elpa/elpy-20200329.1830/snippets/python-mode/__ne__ deleted file mode 100644 index 684f9675..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__ne__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __ne__ -# key: __ne__ -# group: Special methods -# -- -def __ne__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__neg__ b/elpa/elpy-20200329.1830/snippets/python-mode/__neg__ deleted file mode 100644 index b430dcd4..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__neg__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __neg__ -# key: __neg__ -# group: Special methods -# -- -def __neg__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__new__ b/elpa/elpy-20200329.1830/snippets/python-mode/__new__ deleted file mode 100644 index aac14dcd..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__new__ +++ /dev/null @@ -1,10 +0,0 @@ -# -*- mode: snippet -*- -# name: __new__ -# key: __new__ -# group: Special methods -# -- -def __new__(cls${1:, args}): - """$2 - - """ - ${1:$(elpy-snippet-init-assignments yas-text)} diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__nonzero__ b/elpa/elpy-20200329.1830/snippets/python-mode/__nonzero__ deleted file mode 100644 index cef110ea..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__nonzero__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __nonzero__ -# key: __nonzero__ -# group: Special methods -# -- -def __nonzero__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__oct__ b/elpa/elpy-20200329.1830/snippets/python-mode/__oct__ deleted file mode 100644 index 7a46b56a..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__oct__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __oct__ -# key: __oct__ -# group: Special methods -# -- -def __oct__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__or__ b/elpa/elpy-20200329.1830/snippets/python-mode/__or__ deleted file mode 100644 index 6c14ea72..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__or__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __or__ -# key: __or__ -# group: Special methods -# -- -def __or__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__pos__ b/elpa/elpy-20200329.1830/snippets/python-mode/__pos__ deleted file mode 100644 index ac429b86..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__pos__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __pos__ -# key: __pos__ -# group: Special methods -# -- -def __pos__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__pow__ b/elpa/elpy-20200329.1830/snippets/python-mode/__pow__ deleted file mode 100644 index c7991023..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__pow__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __pow__ -# key: __pow__ -# group: Special methods -# -- -def __pow__(self, other, modulo=None): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__radd__ b/elpa/elpy-20200329.1830/snippets/python-mode/__radd__ deleted file mode 100644 index 761d63d8..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__radd__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __radd__ -# key: __radd__ -# group: Special methods -# -- -def __radd__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rand__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rand__ deleted file mode 100644 index be85670a..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rand__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rand__ -# key: __rand__ -# group: Special methods -# -- -def __rand__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rdivmod__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rdivmod__ deleted file mode 100644 index 2c06a873..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rdivmod__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rdivmod__ -# key: __rdivmod__ -# group: Special methods -# -- -def __rdivmod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__repr__ b/elpa/elpy-20200329.1830/snippets/python-mode/__repr__ deleted file mode 100644 index 45ae2f9a..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__repr__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __repr__ -# key: __repr__ -# group: Special methods -# -- -def __repr__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__reversed__ b/elpa/elpy-20200329.1830/snippets/python-mode/__reversed__ deleted file mode 100644 index 8f29b7bc..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__reversed__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __reversed__ -# key: __reversed__ -# group: Special methods -# -- -def __reversed__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rfloordiv__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rfloordiv__ deleted file mode 100644 index 317aeefa..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rfloordiv__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rfloordiv__ -# key: __rfloordiv__ -# group: Special methods -# -- -def __rfloordiv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rlshift__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rlshift__ deleted file mode 100644 index 5522f853..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rlshift__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rlshift__ -# key: __rlshift__ -# group: Special methods -# -- -def __rlshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rmod__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rmod__ deleted file mode 100644 index 562c07f6..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rmod__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rmod__ -# key: __rmod__ -# group: Special methods -# -- -def __rmod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rmul__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rmul__ deleted file mode 100644 index aae0b45f..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rmul__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rmul__ -# key: __rmul__ -# group: Special methods -# -- -def __rmul__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__ror__ b/elpa/elpy-20200329.1830/snippets/python-mode/__ror__ deleted file mode 100644 index 07895497..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__ror__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __ror__ -# key: __ror__ -# group: Special methods -# -- -def __ror__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rpow__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rpow__ deleted file mode 100644 index 7253b2e6..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rpow__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rpow__ -# key: __rpow__ -# group: Special methods -# -- -def __rpow__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rrshift__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rrshift__ deleted file mode 100644 index 5d62907d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rrshift__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rrshift__ -# key: __rrshift__ -# group: Special methods -# -- -def __rrshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rshift__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rshift__ deleted file mode 100644 index 1ec6af27..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rshift__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rshift__ -# key: __rshift__ -# group: Special methods -# -- -def __rshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rsub__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rsub__ deleted file mode 100644 index d58d7e81..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rsub__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rsub__ -# key: __rsub__ -# group: Special methods -# -- -def __rsub__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rtruediv__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rtruediv__ deleted file mode 100644 index 993d117a..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rtruediv__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rtruediv__ -# key: __rtruediv__ -# group: Special methods -# -- -def __rtruediv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__rxor__ b/elpa/elpy-20200329.1830/snippets/python-mode/__rxor__ deleted file mode 100644 index 4d1cc09f..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__rxor__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __rxor__ -# key: __rxor__ -# group: Special methods -# -- -def __rxor__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__set__ b/elpa/elpy-20200329.1830/snippets/python-mode/__set__ deleted file mode 100644 index bf87f574..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__set__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __set__ -# key: __set__ -# group: Special methods -# -- -def __set__(self, instance, value): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__setattr__ b/elpa/elpy-20200329.1830/snippets/python-mode/__setattr__ deleted file mode 100644 index 3482e8e2..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__setattr__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __setattr__ -# key: __setattr__ -# group: Special methods -# -- -def __setattr__(self, name, value): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__setitem__ b/elpa/elpy-20200329.1830/snippets/python-mode/__setitem__ deleted file mode 100644 index d229fa16..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__setitem__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __setitem__ -# key: __setitem__ -# group: Special methods -# -- -def __setitem__(self, key, value): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__slots__ b/elpa/elpy-20200329.1830/snippets/python-mode/__slots__ deleted file mode 100644 index c35d4880..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__slots__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __slots__ -# key: __slots__ -# group: Class attributes -# -- -__slots__ = ($1) -$0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__str__ b/elpa/elpy-20200329.1830/snippets/python-mode/__str__ deleted file mode 100644 index 3b390888..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__str__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __str__ -# key: __str__ -# group: Special methods -# -- -def __str__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__sub__ b/elpa/elpy-20200329.1830/snippets/python-mode/__sub__ deleted file mode 100644 index a1834590..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__sub__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __sub__ -# key: __sub__ -# group: Special methods -# -- -def __sub__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__subclasscheck__ b/elpa/elpy-20200329.1830/snippets/python-mode/__subclasscheck__ deleted file mode 100644 index 3918b4ca..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__subclasscheck__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __subclasscheck__ -# key: __subclasscheck__ -# group: Special methods -# -- -def __subclasscheck__(self, instance): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__truediv__ b/elpa/elpy-20200329.1830/snippets/python-mode/__truediv__ deleted file mode 100644 index c76e0553..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__truediv__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __truediv__ -# key: __truediv__ -# group: Special methods -# -- -def __truediv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__unicode__ b/elpa/elpy-20200329.1830/snippets/python-mode/__unicode__ deleted file mode 100644 index 62b82f66..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__unicode__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __unicode__ -# key: __unicode__ -# group: Special methods -# -- -def __unicode__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/__xor__ b/elpa/elpy-20200329.1830/snippets/python-mode/__xor__ deleted file mode 100644 index 3c7e694b..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/__xor__ +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: __xor__ -# key: __xor__ -# group: Special methods -# -- -def __xor__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_abs b/elpa/elpy-20200329.1830/snippets/python-mode/_abs deleted file mode 100644 index 7d06a28e..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_abs +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _abs -# key: _abs -# group: Special methods -# -- -def __abs__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_add b/elpa/elpy-20200329.1830/snippets/python-mode/_add deleted file mode 100644 index 3b04b552..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_add +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _add -# key: _add -# group: Special methods -# -- -def __add__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_and b/elpa/elpy-20200329.1830/snippets/python-mode/_and deleted file mode 100644 index d06e9767..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_and +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _and -# key: _and -# group: Special methods -# -- -def __and__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_bool b/elpa/elpy-20200329.1830/snippets/python-mode/_bool deleted file mode 100644 index ff2cd83d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_bool +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _bool -# key: _bool -# group: Special methods -# -- -def __bool__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_call b/elpa/elpy-20200329.1830/snippets/python-mode/_call deleted file mode 100644 index b926b158..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_call +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _call -# key: _call -# group: Special methods -# -- -def __call__(self, ${1:*args}): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_cmp b/elpa/elpy-20200329.1830/snippets/python-mode/_cmp deleted file mode 100644 index 0622ae81..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_cmp +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _cmp -# key: _cmp -# group: Special methods -# -- -def __cmp__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_coerce b/elpa/elpy-20200329.1830/snippets/python-mode/_coerce deleted file mode 100644 index 3b6a461a..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_coerce +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _coerce -# key: _coerce -# group: Special methods -# -- -def __coerce__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_complex b/elpa/elpy-20200329.1830/snippets/python-mode/_complex deleted file mode 100644 index 14970fa5..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_complex +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _complex -# key: _complex -# group: Special methods -# -- -def __complex__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_contains b/elpa/elpy-20200329.1830/snippets/python-mode/_contains deleted file mode 100644 index e74545f6..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_contains +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _contains -# key: _contains -# group: Special methods -# -- -def __contains__(self, item): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_del b/elpa/elpy-20200329.1830/snippets/python-mode/_del deleted file mode 100644 index 81c10bec..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_del +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _del -# key: _del -# group: Special methods -# -- -def __del__(self): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_delattr b/elpa/elpy-20200329.1830/snippets/python-mode/_delattr deleted file mode 100644 index 84594d65..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_delattr +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _delattr -# key: _delattr -# group: Special methods -# -- -def __delattr__(self, name): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_delete b/elpa/elpy-20200329.1830/snippets/python-mode/_delete deleted file mode 100644 index 39e46760..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_delete +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _delete -# key: _delete -# group: Special methods -# -- -def __delete__(self, instance): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_delitem b/elpa/elpy-20200329.1830/snippets/python-mode/_delitem deleted file mode 100644 index 8952685d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_delitem +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _delitem -# key: _delitem -# group: Special methods -# -- -def __delitem__(self, key): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_div b/elpa/elpy-20200329.1830/snippets/python-mode/_div deleted file mode 100644 index b6adc6fb..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_div +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _div -# key: _div -# group: Special methods -# -- -def __div__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_divmod b/elpa/elpy-20200329.1830/snippets/python-mode/_divmod deleted file mode 100644 index 0134a2fa..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_divmod +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _divmod -# key: _divmod -# group: Special methods -# -- -def __divmod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_enter b/elpa/elpy-20200329.1830/snippets/python-mode/_enter deleted file mode 100644 index 16b45f3b..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_enter +++ /dev/null @@ -1,9 +0,0 @@ -# -*- mode: snippet -*- -# name: _enter -# key: _enter -# group: Special methods -# -- -def __enter__(self): - $0 - - return self \ No newline at end of file diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_eq b/elpa/elpy-20200329.1830/snippets/python-mode/_eq deleted file mode 100644 index 59dd2335..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_eq +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _eq -# key: _eq -# group: Special methods -# -- -def __eq__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_exit b/elpa/elpy-20200329.1830/snippets/python-mode/_exit deleted file mode 100644 index c4dced1d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_exit +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _exit -# key: _exit -# group: Special methods -# -- -def __exit__(self, exc_type, exc_value, traceback): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_float b/elpa/elpy-20200329.1830/snippets/python-mode/_float deleted file mode 100644 index 017b3e47..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_float +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _float -# key: _float -# group: Special methods -# -- -def __float__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_floordiv b/elpa/elpy-20200329.1830/snippets/python-mode/_floordiv deleted file mode 100644 index 84c3dfb0..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_floordiv +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _floordiv -# key: _floordiv -# group: Special methods -# -- -def __floordiv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_ge b/elpa/elpy-20200329.1830/snippets/python-mode/_ge deleted file mode 100644 index 08e8debf..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_ge +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _ge -# key: _ge -# group: Special methods -# -- -def __ge__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_get b/elpa/elpy-20200329.1830/snippets/python-mode/_get deleted file mode 100644 index b4bbe164..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_get +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _get -# key: _get -# group: Special methods -# -- -def __get__(self, instance, owner): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_getattr b/elpa/elpy-20200329.1830/snippets/python-mode/_getattr deleted file mode 100644 index 899aac60..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_getattr +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _getattr -# key: _getattr -# group: Special methods -# -- -def __getattr__(self, name): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_getattribute b/elpa/elpy-20200329.1830/snippets/python-mode/_getattribute deleted file mode 100644 index 93a15682..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_getattribute +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _getattribute -# key: _getattribute -# group: Special methods -# -- -def __getattribute__(self, name): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_getitem b/elpa/elpy-20200329.1830/snippets/python-mode/_getitem deleted file mode 100644 index 58407fbd..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_getitem +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _getitem -# key: _getitem -# group: Special methods -# -- -def __getitem__(self, key): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_gt b/elpa/elpy-20200329.1830/snippets/python-mode/_gt deleted file mode 100644 index 18d4dddd..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_gt +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _gt -# key: _gt -# group: Special methods -# -- -def __gt__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_hash b/elpa/elpy-20200329.1830/snippets/python-mode/_hash deleted file mode 100644 index 5b1452c4..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_hash +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _hash -# key: _hash -# group: Special methods -# -- -def __hash__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_hex b/elpa/elpy-20200329.1830/snippets/python-mode/_hex deleted file mode 100644 index 20092cb2..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_hex +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _hex -# key: _hex -# group: Special methods -# -- -def __hex__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_iadd b/elpa/elpy-20200329.1830/snippets/python-mode/_iadd deleted file mode 100644 index 147ad43b..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_iadd +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _iadd -# key: _iadd -# group: Special methods -# -- -def __iadd__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_iand b/elpa/elpy-20200329.1830/snippets/python-mode/_iand deleted file mode 100644 index 540d0a50..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_iand +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _iand -# key: _iand -# group: Special methods -# -- -def __iand__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_idiv b/elpa/elpy-20200329.1830/snippets/python-mode/_idiv deleted file mode 100644 index a334c3ea..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_idiv +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _idiv -# key: _idiv -# group: Special methods -# -- -def __idiv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_ifloordiv b/elpa/elpy-20200329.1830/snippets/python-mode/_ifloordiv deleted file mode 100644 index 7eb3ce84..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_ifloordiv +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _ifloordiv -# key: _ifloordiv -# group: Special methods -# -- -def __ifloordiv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_ilshift b/elpa/elpy-20200329.1830/snippets/python-mode/_ilshift deleted file mode 100644 index f24582d5..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_ilshift +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _ilshift -# key: _ilshift -# group: Special methods -# -- -def __ilshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_imod b/elpa/elpy-20200329.1830/snippets/python-mode/_imod deleted file mode 100644 index deb96194..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_imod +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _imod -# key: _imod -# group: Special methods -# -- -def __imod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_imul b/elpa/elpy-20200329.1830/snippets/python-mode/_imul deleted file mode 100644 index 0938b0fa..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_imul +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _imul -# key: _imul -# group: Special methods -# -- -def __imul__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_index b/elpa/elpy-20200329.1830/snippets/python-mode/_index deleted file mode 100644 index 092869fb..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_index +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _index -# key: _index -# group: Special methods -# -- -def __index__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_init b/elpa/elpy-20200329.1830/snippets/python-mode/_init deleted file mode 100644 index d7ccea0d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_init +++ /dev/null @@ -1,10 +0,0 @@ -# -*- mode: snippet -*- -# name: _init with assignment -# key: _init -# group: Special methods -# -- -def __init__(self${1:, args}): - """$2 - - """ - ${1:$(elpy-snippet-init-assignments yas-text)} diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_instancecheck b/elpa/elpy-20200329.1830/snippets/python-mode/_instancecheck deleted file mode 100644 index 8bb35537..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_instancecheck +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _instancecheck -# key: _instancecheck -# group: Special methods -# -- -def __instancecheck__(self, instance): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_int b/elpa/elpy-20200329.1830/snippets/python-mode/_int deleted file mode 100644 index d287d978..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_int +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _int -# key: _int -# group: Special methods -# -- -def __int__(self): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_invert b/elpa/elpy-20200329.1830/snippets/python-mode/_invert deleted file mode 100644 index c27b9b0e..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_invert +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _invert -# key: _invert -# group: Special methods -# -- -def __invert__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_ior b/elpa/elpy-20200329.1830/snippets/python-mode/_ior deleted file mode 100644 index 1bd4115f..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_ior +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _ior -# key: _ior -# group: Special methods -# -- -def __ior__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_ipow b/elpa/elpy-20200329.1830/snippets/python-mode/_ipow deleted file mode 100644 index fe4dffa2..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_ipow +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _ipow -# key: _ipow -# group: Special methods -# -- -def __ipow__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_irshift b/elpa/elpy-20200329.1830/snippets/python-mode/_irshift deleted file mode 100644 index 33c26378..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_irshift +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _irshift -# key: _irshift -# group: Special methods -# -- -def __irshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_isub b/elpa/elpy-20200329.1830/snippets/python-mode/_isub deleted file mode 100644 index 485603f8..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_isub +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _isub -# key: _isub -# group: Special methods -# -- -def __isub__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_iter b/elpa/elpy-20200329.1830/snippets/python-mode/_iter deleted file mode 100644 index 85a0cb6e..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_iter +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _iter -# key: _iter -# group: Special methods -# -- -def __iter__(self): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_itruediv b/elpa/elpy-20200329.1830/snippets/python-mode/_itruediv deleted file mode 100644 index 7fa0931f..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_itruediv +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _itruediv -# key: _itruediv -# group: Special methods -# -- -def __itruediv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_ixor b/elpa/elpy-20200329.1830/snippets/python-mode/_ixor deleted file mode 100644 index 929033c4..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_ixor +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _ixor -# key: _ixor -# group: Special methods -# -- -def __ixor__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_le b/elpa/elpy-20200329.1830/snippets/python-mode/_le deleted file mode 100644 index aef06e61..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_le +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _le -# key: _le -# group: Special methods -# -- -def __le__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_len b/elpa/elpy-20200329.1830/snippets/python-mode/_len deleted file mode 100644 index 3cbe7561..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_len +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _len -# key: _len -# group: Special methods -# -- -def __len__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_long b/elpa/elpy-20200329.1830/snippets/python-mode/_long deleted file mode 100644 index 3966d390..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_long +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _long -# key: _long -# group: Special methods -# -- -def __long__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_lshift b/elpa/elpy-20200329.1830/snippets/python-mode/_lshift deleted file mode 100644 index b32b6fe2..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_lshift +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _lshift -# key: _lshift -# group: Special methods -# -- -def __lshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_lt b/elpa/elpy-20200329.1830/snippets/python-mode/_lt deleted file mode 100644 index d25f646e..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_lt +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _lt -# key: _lt -# group: Special methods -# -- -def __lt__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_mod b/elpa/elpy-20200329.1830/snippets/python-mode/_mod deleted file mode 100644 index dc97a0d9..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_mod +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _mod -# key: _mod -# group: Special methods -# -- -def __mod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_mul b/elpa/elpy-20200329.1830/snippets/python-mode/_mul deleted file mode 100644 index b651d601..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_mul +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _mul -# key: _mul -# group: Special methods -# -- -def __mul__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_ne b/elpa/elpy-20200329.1830/snippets/python-mode/_ne deleted file mode 100644 index 401fcc5b..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_ne +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _ne -# key: _ne -# group: Special methods -# -- -def __ne__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_neg b/elpa/elpy-20200329.1830/snippets/python-mode/_neg deleted file mode 100644 index ea09c1b4..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_neg +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _neg -# key: _neg -# group: Special methods -# -- -def __neg__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_new b/elpa/elpy-20200329.1830/snippets/python-mode/_new deleted file mode 100644 index c160c9fa..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_new +++ /dev/null @@ -1,10 +0,0 @@ -# -*- mode: snippet -*- -# name: _new -# key: _new -# group: Special methods -# -- -def __new__(cls${1:, args}): - """$2 - - """ - ${1:$(elpy-snippet-init-assignments yas-text)} diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_nonzero b/elpa/elpy-20200329.1830/snippets/python-mode/_nonzero deleted file mode 100644 index adf3432e..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_nonzero +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _nonzero -# key: _nonzero -# group: Special methods -# -- -def __nonzero__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_oct b/elpa/elpy-20200329.1830/snippets/python-mode/_oct deleted file mode 100644 index ff948bb8..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_oct +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _oct -# key: _oct -# group: Special methods -# -- -def __oct__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_or b/elpa/elpy-20200329.1830/snippets/python-mode/_or deleted file mode 100644 index 17da1692..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_or +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _or -# key: _or -# group: Special methods -# -- -def __or__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_pos b/elpa/elpy-20200329.1830/snippets/python-mode/_pos deleted file mode 100644 index 403ec373..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_pos +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _pos -# key: _pos -# group: Special methods -# -- -def __pos__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_pow b/elpa/elpy-20200329.1830/snippets/python-mode/_pow deleted file mode 100644 index bcd8d11d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_pow +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _pow -# key: _pow -# group: Special methods -# -- -def __pow__(self, other, modulo=None): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_radd b/elpa/elpy-20200329.1830/snippets/python-mode/_radd deleted file mode 100644 index ca0b1d3a..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_radd +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _radd -# key: _radd -# group: Special methods -# -- -def __radd__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rand b/elpa/elpy-20200329.1830/snippets/python-mode/_rand deleted file mode 100644 index 1396a6a4..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rand +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rand -# key: _rand -# group: Special methods -# -- -def __rand__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rdivmod b/elpa/elpy-20200329.1830/snippets/python-mode/_rdivmod deleted file mode 100644 index 7ea78de0..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rdivmod +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rdivmod -# key: _rdivmod -# group: Special methods -# -- -def __rdivmod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_repr b/elpa/elpy-20200329.1830/snippets/python-mode/_repr deleted file mode 100644 index 3eb8d827..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_repr +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _repr -# key: _repr -# group: Special methods -# -- -def __repr__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_reversed b/elpa/elpy-20200329.1830/snippets/python-mode/_reversed deleted file mode 100644 index 39b0711e..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_reversed +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _reversed -# key: _reversed -# group: Special methods -# -- -def __reversed__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rfloordiv b/elpa/elpy-20200329.1830/snippets/python-mode/_rfloordiv deleted file mode 100644 index 70f9c4fe..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rfloordiv +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rfloordiv -# key: _rfloordiv -# group: Special methods -# -- -def __rfloordiv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rlshift b/elpa/elpy-20200329.1830/snippets/python-mode/_rlshift deleted file mode 100644 index 311f5c43..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rlshift +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rlshift -# key: _rlshift -# group: Special methods -# -- -def __rlshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rmod b/elpa/elpy-20200329.1830/snippets/python-mode/_rmod deleted file mode 100644 index 71504bee..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rmod +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rmod -# key: _rmod -# group: Special methods -# -- -def __rmod__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rmul b/elpa/elpy-20200329.1830/snippets/python-mode/_rmul deleted file mode 100644 index bac8c96e..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rmul +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rmul -# key: _rmul -# group: Special methods -# -- -def __rmul__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_ror b/elpa/elpy-20200329.1830/snippets/python-mode/_ror deleted file mode 100644 index c9e2246d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_ror +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _ror -# key: _ror -# group: Special methods -# -- -def __ror__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rpow b/elpa/elpy-20200329.1830/snippets/python-mode/_rpow deleted file mode 100644 index 882da636..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rpow +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rpow -# key: _rpow -# group: Special methods -# -- -def __rpow__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rrshift b/elpa/elpy-20200329.1830/snippets/python-mode/_rrshift deleted file mode 100644 index 0876564e..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rrshift +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rrshift -# key: _rrshift -# group: Special methods -# -- -def __rrshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rshift b/elpa/elpy-20200329.1830/snippets/python-mode/_rshift deleted file mode 100644 index 13ef00bb..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rshift +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rshift -# key: _rshift -# group: Special methods -# -- -def __rshift__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rsub b/elpa/elpy-20200329.1830/snippets/python-mode/_rsub deleted file mode 100644 index e0d504e1..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rsub +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rsub -# key: _rsub -# group: Special methods -# -- -def __rsub__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rtruediv b/elpa/elpy-20200329.1830/snippets/python-mode/_rtruediv deleted file mode 100644 index 0a994653..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rtruediv +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rtruediv -# key: _rtruediv -# group: Special methods -# -- -def __rtruediv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_rxor b/elpa/elpy-20200329.1830/snippets/python-mode/_rxor deleted file mode 100644 index 549fb558..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_rxor +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _rxor -# key: _rxor -# group: Special methods -# -- -def __rxor__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_set b/elpa/elpy-20200329.1830/snippets/python-mode/_set deleted file mode 100644 index 122bdb10..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_set +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _set -# key: _set -# group: Special methods -# -- -def __set__(self, instance, value): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_setattr b/elpa/elpy-20200329.1830/snippets/python-mode/_setattr deleted file mode 100644 index 826b0052..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_setattr +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _setattr -# key: _setattr -# group: Special methods -# -- -def __setattr__(self, name, value): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_setitem b/elpa/elpy-20200329.1830/snippets/python-mode/_setitem deleted file mode 100644 index fc918780..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_setitem +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _setitem -# key: _setitem -# group: Special methods -# -- -def __setitem__(self, key, value): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_slots b/elpa/elpy-20200329.1830/snippets/python-mode/_slots deleted file mode 100644 index 04eea048..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_slots +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _slots -# key: _slots -# group: Class attributes -# -- -__slots__ = ($1) -$0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_str b/elpa/elpy-20200329.1830/snippets/python-mode/_str deleted file mode 100644 index 66e99cbd..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_str +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _str -# key: _str -# group: Special methods -# -- -def __str__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_sub b/elpa/elpy-20200329.1830/snippets/python-mode/_sub deleted file mode 100644 index 713b45db..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_sub +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _sub -# key: _sub -# group: Special methods -# -- -def __sub__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_subclasscheck b/elpa/elpy-20200329.1830/snippets/python-mode/_subclasscheck deleted file mode 100644 index 7faaa221..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_subclasscheck +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _subclasscheck -# key: _subclasscheck -# group: Special methods -# -- -def __subclasscheck__(self, instance): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_truediv b/elpa/elpy-20200329.1830/snippets/python-mode/_truediv deleted file mode 100644 index 152c7e30..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_truediv +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _truediv -# key: _truediv -# group: Special methods -# -- -def __truediv__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_unicode b/elpa/elpy-20200329.1830/snippets/python-mode/_unicode deleted file mode 100644 index 75fbef5d..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_unicode +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _unicode -# key: _unicode -# group: Special methods -# -- -def __unicode__(self): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/_xor b/elpa/elpy-20200329.1830/snippets/python-mode/_xor deleted file mode 100644 index 1188edf0..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/_xor +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: _xor -# key: _xor -# group: Special methods -# -- -def __xor__(self, other): - return $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/ase b/elpa/elpy-20200329.1830/snippets/python-mode/ase deleted file mode 100644 index 82389db5..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/ase +++ /dev/null @@ -1,6 +0,0 @@ -# -*- mode: snippet -*- -# name: Assert Equal -# key: ase -# group: Testing -# -- -self.assertEqual(${1:expected}, ${2:actual}) diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/asne b/elpa/elpy-20200329.1830/snippets/python-mode/asne deleted file mode 100644 index 7e766b6c..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/asne +++ /dev/null @@ -1,6 +0,0 @@ -# -*- mode: snippet -*- -# name: Assert Not Equal -# key: asne -# group: Testing -# -- -self.assertNotEqual(${1:expected}, ${2:actual}) diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/asr b/elpa/elpy-20200329.1830/snippets/python-mode/asr deleted file mode 100644 index 8aafd05c..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/asr +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: Assert Raises -# key: asr -# group: Testing -# -- -with self.assertRaises(${1:Exception}): - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/class b/elpa/elpy-20200329.1830/snippets/python-mode/class deleted file mode 100644 index b5c180de..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/class +++ /dev/null @@ -1,13 +0,0 @@ -# -*- mode: snippet -*- -# name: class(parent): ... -# key: class -# group: Definitions -# -- -class ${1:ClassName}(${2:object}): - """${3:Documentation for $1} - - """ - def __init__(self${4:, args}): - super($1, self).__init__($5) - ${4:$(elpy-snippet-init-assignments yas-text)} - $0 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/def b/elpa/elpy-20200329.1830/snippets/python-mode/def deleted file mode 100644 index 1d4a806f..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/def +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: def function(...): -# key: def -# group: Definitions -# -- -def ${1:funcname}(${2:arg}): - ${3:pass} diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/defs b/elpa/elpy-20200329.1830/snippets/python-mode/defs deleted file mode 100644 index 974ef404..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/defs +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: def method(self, ...): -# key: defs -# group: Definitions -# -- -def ${1:methodname}(self, ${2:arg}): - ${3:pass} diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/enc b/elpa/elpy-20200329.1830/snippets/python-mode/enc deleted file mode 100644 index 54aeebcf..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/enc +++ /dev/null @@ -1,6 +0,0 @@ -# -*- mode: snippet -*- -# name: # coding: utf-8 -# key: enc -# group: Header -# -- -# coding: utf-8 diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/env b/elpa/elpy-20200329.1830/snippets/python-mode/env deleted file mode 100644 index d4fb804a..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/env +++ /dev/null @@ -1,6 +0,0 @@ -# -*- mode: snippet -*- -# name: #!/usr/bin/env python -# key: env -# group: Header -# -- -#!/usr/bin/env python diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/from b/elpa/elpy-20200329.1830/snippets/python-mode/from deleted file mode 100644 index 0a706eb3..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/from +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: from MOD import SYM -# key: from -# group: Header -# -- -from ${1:module} import ${2:symbol} -$0 \ No newline at end of file diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/pdb b/elpa/elpy-20200329.1830/snippets/python-mode/pdb deleted file mode 100644 index 44577163..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/pdb +++ /dev/null @@ -1,6 +0,0 @@ -# -*- mode: snippet -*- -# name: pdb.set_trace() -# key: pdb -# group: Debug -# -- -__import__("pdb").set_trace() diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/py3 b/elpa/elpy-20200329.1830/snippets/python-mode/py3 deleted file mode 100644 index ae8eb7b8..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/py3 +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: from __future__ import ... -# key: py3 -# group: Python 3 -# -- -from __future__ import division, absolute_import -from __future__ import print_function, unicode_literals diff --git a/elpa/elpy-20200329.1830/snippets/python-mode/super b/elpa/elpy-20200329.1830/snippets/python-mode/super deleted file mode 100644 index 3b4e0d90..00000000 --- a/elpa/elpy-20200329.1830/snippets/python-mode/super +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: super() -# key: super -# group: Definitions -# -- -super`(elpy-snippet-super-form)`(${1:`(elpy-snippet-super-arguments)`}) -$0 \ No newline at end of file diff --git a/elpa/epl-20180205.2049/epl-autoloads.el b/elpa/epl-20180205.2049/epl-autoloads.el deleted file mode 100644 index c6221c54..00000000 --- a/elpa/epl-20180205.2049/epl-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; epl-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "epl" "epl.el" (0 0 0 0)) -;;; Generated autoloads from epl.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "epl" '("epl-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; epl-autoloads.el ends here diff --git a/elpa/epl-20180205.2049/epl-pkg.el b/elpa/epl-20180205.2049/epl-pkg.el deleted file mode 100644 index a977868d..00000000 --- a/elpa/epl-20180205.2049/epl-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "epl" "20180205.2049" "Emacs Package Library" '((cl-lib "0.3")) :commit "78ab7a85c08222cd15582a298a364774e3282ce6" :keywords '("convenience") :authors '(("Sebastian Wiesner" . "swiesner@lunaryorn.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :url "http://github.com/cask/epl") diff --git a/elpa/epl-20180205.2049/epl.el b/elpa/epl-20180205.2049/epl.el deleted file mode 100644 index 5bbd76a0..00000000 --- a/elpa/epl-20180205.2049/epl.el +++ /dev/null @@ -1,711 +0,0 @@ -;;; epl.el --- Emacs Package Library -*- lexical-binding: t; -*- - -;; Copyright (C) 2013-2015 Sebastian Wiesner -;; Copyright (C) 1985-1986, 1992, 1994-1995, 1999-2015 Free Software - -;; Author: Sebastian Wiesner -;; Maintainer: Johan Andersson -;; Sebastian Wiesner -;; Version: 0.10-cvs -;; Package-Version: 20180205.2049 -;; Package-Requires: ((cl-lib "0.3")) -;; Keywords: convenience -;; URL: http://github.com/cask/epl - -;; This file is NOT part of GNU Emacs. - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; A package management library for Emacs, based on package.el. - -;; The purpose of this library is to wrap all the quirks and hassle of -;; package.el into a sane API. - -;; The following functions comprise the public interface of this library: - -;;; Package directory selection - -;; `epl-package-dir' gets the directory of packages. - -;; `epl-default-package-dir' gets the default package directory. - -;; `epl-change-package-dir' changes the directory of packages. - -;;; Package system management - -;; `epl-initialize' initializes the package system and activates all -;; packages. - -;; `epl-reset' resets the package system. - -;; `epl-refresh' refreshes all package archives. - -;; `epl-add-archive' adds a new package archive. - -;;; Package objects - -;; Struct `epl-requirement' describes a requirement of a package with `name' and -;; `version' slots. - -;; `epl-requirement-version-string' gets a requirement version as string. - -;; Struct `epl-package' describes an installed or installable package with a -;; `name' and some internal `description'. - -;; `epl-package-version' gets the version of a package. - -;; `epl-package-version-string' gets the version of a package as string. - -;; `epl-package-summary' gets the summary of a package. - -;; `epl-package-requirements' gets the requirements of a package. - -;; `epl-package-directory' gets the installation directory of a package. - -;; `epl-package-from-buffer' creates a package object for the package contained -;; in the current buffer. - -;; `epl-package-from-file' creates a package object for a package file, either -;; plain lisp or tarball. - -;; `epl-package-from-descriptor-file' creates a package object for a package -;; description (i.e. *-pkg.el) file. - -;;; Package database access - -;; `epl-package-installed-p' determines whether a package is installed, either -;; built-in or explicitly installed. - -;; `epl-package-outdated-p' determines whether a package is outdated, that is, -;; whether a package with a higher version number is available. - -;; `epl-built-in-packages', `epl-installed-packages', `epl-outdated-packages' -;; and `epl-available-packages' get all packages built-in, installed, outdated, -;; or available for installation respectively. - -;; `epl-find-built-in-package', `epl-find-installed-packages' and -;; `epl-find-available-packages' find built-in, installed and available packages -;; by name. - -;; `epl-find-upgrades' finds all upgradable packages. - -;; `epl-built-in-p' return true if package is built-in to Emacs. - -;;; Package operations - -;; `epl-install-file' installs a package file. - -;; `epl-package-install' installs a package. - -;; `epl-package-delete' deletes a package. - -;; `epl-upgrade' upgrades packages. - -;;; Code: - -(require 'cl-lib) -(require 'package) - - -(unless (fboundp #'define-error) - ;; `define-error' for 24.3 and earlier, copied from subr.el - (defun define-error (name message &optional parent) - "Define NAME as a new error signal. -MESSAGE is a string that will be output to the echo area if such an error -is signaled without being caught by a `condition-case'. -PARENT is either a signal or a list of signals from which it inherits. -Defaults to `error'." - (unless parent (setq parent 'error)) - (let ((conditions - (if (consp parent) - (apply #'append - (mapcar (lambda (parent) - (cons parent - (or (get parent 'error-conditions) - (error "Unknown signal `%s'" parent)))) - parent)) - (cons parent (get parent 'error-conditions))))) - (put name 'error-conditions - (delete-dups (copy-sequence (cons name conditions)))) - (when message (put name 'error-message message))))) - -(defsubst epl--package-desc-p (package) - "Whether PACKAGE is a `package-desc' object. - -Like `package-desc-p', but return nil, if `package-desc-p' is not -defined as function." - (and (fboundp 'package-desc-p) (package-desc-p package))) - - -;;; EPL errors -(define-error 'epl-error "EPL error") - -(define-error 'epl-invalid-package "Invalid EPL package" 'epl-error) - -(define-error 'epl-invalid-package-file "Invalid EPL package file" - 'epl-invalid-package) - - -;;; Package directory -(defun epl-package-dir () - "Get the directory of packages." - package-user-dir) - -(defun epl-default-package-dir () - "Get the default directory of packages." - (eval (car (get 'package-user-dir 'standard-value)))) - -(defun epl-change-package-dir (directory) - "Change the directory of packages to DIRECTORY." - (setq package-user-dir directory) - (epl-initialize)) - - -;;; Package system management -(defvar epl--load-path-before-initialize nil - "Remember the load path for `epl-reset'.") - -(defun epl-initialize (&optional no-activate) - "Load Emacs Lisp packages and activate them. - -With NO-ACTIVATE non-nil, do not activate packages." - (setq epl--load-path-before-initialize load-path) - (package-initialize no-activate)) - -(defalias 'epl-refresh 'package-refresh-contents) - -(defun epl-add-archive (name url) - "Add a package archive with NAME and URL." - (add-to-list 'package-archives (cons name url))) - -(defun epl-reset () - "Reset the package system. - -Clear the list of installed and available packages, the list of -package archives and reset the package directory." - (setq package-alist nil - package-archives nil - package-archive-contents nil - load-path epl--load-path-before-initialize) - (when (boundp 'package-obsolete-alist) ; Legacy package.el - (setq package-obsolete-alist nil)) - (epl-change-package-dir (epl-default-package-dir))) - - -;;; Package structures -(cl-defstruct (epl-requirement - (:constructor epl-requirement-create)) - "Structure describing a requirement. - -Slots: - -`name' The name of the required package, as symbol. - -`version' The version of the required package, as version list." - name - version) - -(defun epl-requirement-version-string (requirement) - "The version of a REQUIREMENT, as string." - (package-version-join (epl-requirement-version requirement))) - -(cl-defstruct (epl-package (:constructor epl-package-create)) - "Structure representing a package. - -Slots: - -`name' The package name, as symbol. - -`description' The package description. - -The format package description varies between package.el -variants. For `package-desc' variants, it is simply the -corresponding `package-desc' object. For legacy variants, it is -a vector `[VERSION REQS DOCSTRING]'. - -Do not access `description' directly, but instead use the -`epl-package' accessors." - name - description) - -(defmacro epl-package-as-description (var &rest body) - "Cast VAR to a package description in BODY. - -VAR is a symbol, bound to an `epl-package' object. This macro -casts this object to the `description' object, and binds the -description to VAR in BODY." - (declare (indent 1)) - (unless (symbolp var) - (signal 'wrong-type-argument (list #'symbolp var))) - `(if (epl-package-p ,var) - (let ((,var (epl-package-description ,var))) - ,@body) - (signal 'wrong-type-argument (list #'epl-package-p ,var)))) - -(defsubst epl-package--package-desc-p (package) - "Whether the description of PACKAGE is a `package-desc'." - (epl--package-desc-p (epl-package-description package))) - -(defun epl-package-version (package) - "Get the version of PACKAGE, as version list." - (epl-package-as-description package - (cond - ((fboundp 'package-desc-version) (package-desc-version package)) - ;; Legacy - ((fboundp 'package-desc-vers) - (let ((version (package-desc-vers package))) - (if (listp version) version (version-to-list version)))) - (:else (error "Cannot get version from %S" package))))) - -(defun epl-package-version-string (package) - "Get the version from a PACKAGE, as string." - (package-version-join (epl-package-version package))) - -(defun epl-package-summary (package) - "Get the summary of PACKAGE, as string." - (epl-package-as-description package - (cond - ((fboundp 'package-desc-summary) (package-desc-summary package)) - ((fboundp 'package-desc-doc) (package-desc-doc package)) ; Legacy - (:else (error "Cannot get summary from %S" package))))) - -(defsubst epl-requirement--from-req (req) - "Create a `epl-requirement' from a `package-desc' REQ." - (let ((version (cadr req))) - (epl-requirement-create :name (car req) - :version (if (listp version) version - (version-to-list version))))) - -(defun epl-package-requirements (package) - "Get the requirements of PACKAGE. - -The requirements are a list of `epl-requirement' objects." - (epl-package-as-description package - (mapcar #'epl-requirement--from-req (package-desc-reqs package)))) - -(defun epl-package-directory (package) - "Get the directory PACKAGE is installed to. - -Return the absolute path of the installation directory of -PACKAGE, or nil, if PACKAGE is not installed." - (cond - ((fboundp 'package-desc-dir) - (package-desc-dir (epl-package-description package))) - ((fboundp 'package--dir) - (package--dir (symbol-name (epl-package-name package)) - (epl-package-version-string package))) - (:else (error "Cannot get package directory from %S" package)))) - -(defun epl-package-->= (pkg1 pkg2) - "Determine whether PKG1 is before PKG2 by version." - (not (version-list-< (epl-package-version pkg1) - (epl-package-version pkg2)))) - -(defun epl-package--from-package-desc (package-desc) - "Create an `epl-package' from a PACKAGE-DESC. - -PACKAGE-DESC is a `package-desc' object, from recent package.el -variants." - (if (and (fboundp 'package-desc-name) - (epl--package-desc-p package-desc)) - (epl-package-create :name (package-desc-name package-desc) - :description package-desc) - (signal 'wrong-type-argument (list 'epl--package-desc-p package-desc)))) - -(defun epl-package--parse-info (info) - "Parse a package.el INFO." - (if (epl--package-desc-p info) - (epl-package--from-package-desc info) - ;; For legacy package.el, info is a vector [NAME REQUIRES DESCRIPTION - ;; VERSION COMMENTARY]. We need to re-shape this vector into the - ;; `package-alist' format [VERSION REQUIRES DESCRIPTION] to attach it to the - ;; new `epl-package'. - (let ((name (intern (aref info 0))) - (info (vector (aref info 3) (aref info 1) (aref info 2)))) - (epl-package-create :name name :description info)))) - -(defun epl-package-from-buffer (&optional buffer) - "Create an `epl-package' object from BUFFER. - -BUFFER defaults to the current buffer. - -Signal `epl-invalid-package' if the buffer does not contain a -valid package file." - (let ((info (with-current-buffer (or buffer (current-buffer)) - (condition-case err - (package-buffer-info) - (error (signal 'epl-invalid-package (cdr err))))))) - (epl-package--parse-info info))) - -(defun epl-package-from-lisp-file (file-name) - "Parse the package headers the file at FILE-NAME. - -Return an `epl-package' object with the header metadata." - (with-temp-buffer - (insert-file-contents file-name) - (condition-case err - (epl-package-from-buffer (current-buffer)) - ;; Attach file names to invalid package errors - (epl-invalid-package - (signal 'epl-invalid-package-file (cons file-name (cdr err)))) - ;; Forward other errors - (error (signal (car err) (cdr err)))))) - -(defun epl-package-from-tar-file (file-name) - "Parse the package tarball at FILE-NAME. - -Return a `epl-package' object with the meta data of the tarball -package in FILE-NAME." - (condition-case nil - ;; In legacy package.el, `package-tar-file-info' takes the name of the tar - ;; file to parse as argument. In modern package.el, it has no arguments - ;; and works on the current buffer. Hence, we just try to call the legacy - ;; version, and if that fails because of a mismatch between formal and - ;; actual arguments, we use the modern approach. To avoid spurious - ;; signature warnings by the byte compiler, we suppress warnings when - ;; calling the function. - (epl-package--parse-info (with-no-warnings - (package-tar-file-info file-name))) - (wrong-number-of-arguments - (with-temp-buffer - (insert-file-contents-literally file-name) - ;; Switch to `tar-mode' to enable extraction of the file. Modern - ;; `package-tar-file-info' relies on `tar-mode', and signals an error if - ;; called in a buffer with a different mode. - (tar-mode) - (epl-package--parse-info (with-no-warnings - (package-tar-file-info))))))) - -(defun epl-package-from-file (file-name) - "Parse the package at FILE-NAME. - -Return an `epl-package' object with the meta data of the package -at FILE-NAME." - (if (string-match-p (rx ".tar" string-end) file-name) - (epl-package-from-tar-file file-name) - (epl-package-from-lisp-file file-name))) - -(defun epl-package--parse-descriptor-requirement (requirement) - "Parse a REQUIREMENT in a package descriptor." - ;; This function is only called on legacy package.el. On package-desc - ;; package.el, we just let package.el do the work. - (cl-destructuring-bind (name version-string) requirement - (list name (version-to-list version-string)))) - -(defun epl-package-from-descriptor-file (descriptor-file) - "Load a `epl-package' from a package DESCRIPTOR-FILE. - -A package descriptor is a file defining a new package. Its name -typically ends with -pkg.el." - (with-temp-buffer - (insert-file-contents descriptor-file) - (goto-char (point-min)) - (let ((sexp (read (current-buffer)))) - (unless (eq (car sexp) 'define-package) - (error "%S is no valid package descriptor" descriptor-file)) - (if (and (fboundp 'package-desc-from-define) - (fboundp 'package-desc-name)) - ;; In Emacs snapshot, we can conveniently call a function to parse the - ;; descriptor - (let ((desc (apply #'package-desc-from-define (cdr sexp)))) - (epl-package-create :name (package-desc-name desc) - :description desc)) - ;; In legacy package.el, we must manually deconstruct the descriptor, - ;; because the load function has eval's the descriptor and has a lot of - ;; global side-effects. - (cl-destructuring-bind - (name version-string summary requirements) (cdr sexp) - (epl-package-create - :name (intern name) - :description - (vector (version-to-list version-string) - (mapcar #'epl-package--parse-descriptor-requirement - ;; Strip the leading `quote' from the package list - (cadr requirements)) - summary))))))) - - -;;; Package database access -(defun epl-package-installed-p (package &optional min-version) - "Determine whether a PACKAGE, of MIN-VERSION or newer, is installed. - -PACKAGE is either a package name as symbol, or a package object. -When a explicit MIN-VERSION is provided it overwrites the version of the PACKAGE object." - (let ((name (if (epl-package-p package) - (epl-package-name package) - package)) - (min-version (or min-version (and (epl-package-p package) - (epl-package-version package))))) - (package-installed-p name min-version))) - -(defun epl--parse-built-in-entry (entry) - "Parse an ENTRY from the list of built-in packages. - -Return the corresponding `epl-package' object." - (if (fboundp 'package--from-builtin) - ;; In package-desc package.el, convert the built-in package to a - ;; `package-desc' and convert that to an `epl-package' - (epl-package--from-package-desc (package--from-builtin entry)) - (epl-package-create :name (car entry) :description (cdr entry)))) - -(defun epl-built-in-packages () - "Get all built-in packages. - -Return a list of `epl-package' objects." - ;; This looks mighty strange, but it's the only way to force package.el to - ;; build the list of built-in packages. Without this, `package--builtins' - ;; might be empty. - (package-built-in-p 'foo) - (mapcar #'epl--parse-built-in-entry package--builtins)) - -(defun epl-find-built-in-package (name) - "Find a built-in package with NAME. - -NAME is a package name, as symbol. - -Return the built-in package as `epl-package' object, or nil if -there is no built-in package with NAME." - (when (package-built-in-p name) - ;; We must call `package-built-in-p' *before* inspecting - ;; `package--builtins', because otherwise `package--builtins' might be - ;; empty. - (epl--parse-built-in-entry (assq name package--builtins)))) - -(defun epl-package-outdated-p (package) - "Determine whether a PACKAGE is outdated. - -A package is outdated, if there is an available package with a -higher version. - -PACKAGE is either a package name as symbol, or a package object. -In the former case, test the installed or built-in package with -the highest version number, in the later case, test the package -object itself. - -Return t, if the package is outdated, or nil otherwise." - (let* ((package (if (epl-package-p package) - package - (or (car (epl-find-installed-packages package)) - (epl-find-built-in-package package)))) - (available (car (epl-find-available-packages - (epl-package-name package))))) - (and package available (version-list-< (epl-package-version package) - (epl-package-version available))))) - -(defun epl--parse-package-list-entry (entry) - "Parse a list of packages from ENTRY. - -ENTRY is a single entry in a package list, e.g. `package-alist', -`package-archive-contents', etc. Typically it is a cons cell, -but the exact format varies between package.el versions. This -function tries to parse all known variants. - -Return a list of `epl-package' objects parsed from ENTRY." - (let ((descriptions (cdr entry))) - (cond - ((listp descriptions) - (sort (mapcar #'epl-package--from-package-desc descriptions) - #'epl-package-->=)) - ;; Legacy package.el has just a single package in an entry, which is a - ;; standard description vector - ((vectorp descriptions) - (list (epl-package-create :name (car entry) - :description descriptions))) - (:else (error "Cannot parse entry %S" entry))))) - -(defun epl-installed-packages () - "Get all installed packages. - -Return a list of package objects." - (apply #'append (mapcar #'epl--parse-package-list-entry package-alist))) - -(defsubst epl--filter-outdated-packages (packages) - "Filter outdated packages from PACKAGES." - (let (res) - (dolist (package packages) - (when (epl-package-outdated-p package) - (push package res))) - (nreverse res))) - -(defun epl-outdated-packages () - "Get all outdated packages, as in `epl-package-outdated-p'. - -Return a list of package objects." - (epl--filter-outdated-packages (epl-installed-packages))) - -(defsubst epl--find-package-in-list (name list) - "Find a package by NAME in a package LIST. - -Return a list of corresponding `epl-package' objects." - (let ((entry (assq name list))) - (when entry - (epl--parse-package-list-entry entry)))) - -(defun epl-find-installed-package (name) - "Find the latest installed package by NAME. - -NAME is a package name, as symbol. - -Return the installed package with the highest version number as -`epl-package' object, or nil, if no package with NAME is -installed." - (car (epl-find-installed-packages name))) -(make-obsolete 'epl-find-installed-package 'epl-find-installed-packages "0.7") - -(defun epl-find-installed-packages (name) - "Find all installed packages by NAME. - -NAME is a package name, as symbol. - -Return a list of all installed packages with NAME, sorted by -version number in descending order. Return nil, if there are no -packages with NAME." - (epl--find-package-in-list name package-alist)) - -(defun epl-available-packages () - "Get all packages available for installation. - -Return a list of package objects." - (apply #'append (mapcar #'epl--parse-package-list-entry - package-archive-contents))) - -(defun epl-find-available-packages (name) - "Find available packages for NAME. - -NAME is a package name, as symbol. - -Return a list of available packages for NAME, sorted by version -number in descending order. Return nil, if there are no packages -for NAME." - (epl--find-package-in-list name package-archive-contents)) - -(cl-defstruct (epl-upgrade - (:constructor epl-upgrade-create)) - "Structure describing an upgradable package. -Slots: - -`installed' The installed package - -`available' The package available for installation." - installed - available) - -(defun epl-find-upgrades (&optional packages) - "Find all upgradable PACKAGES. - -PACKAGES is a list of package objects to upgrade, defaulting to -all installed packages. - -Return a list of `epl-upgrade' objects describing all upgradable -packages." - (let ((packages (or packages (epl-installed-packages))) - upgrades) - (dolist (pkg packages) - (let* ((version (epl-package-version pkg)) - (name (epl-package-name pkg)) - ;; Find the latest available package for NAME - (available-pkg (car (epl-find-available-packages name))) - (available-version (when available-pkg - (epl-package-version available-pkg)))) - (when (and available-version (version-list-< version available-version)) - (push (epl-upgrade-create :installed pkg - :available available-pkg) - upgrades)))) - (nreverse upgrades))) - -(defalias 'epl-built-in-p 'package-built-in-p) - - -;;; Package operations - -(defun epl-install-file (file) - "Install a package from FILE, like `package-install-file'." - (interactive (advice-eval-interactive-spec - (cadr (interactive-form #'package-install-file)))) - (apply #'package-install-file (list file)) - (let ((package (epl-package-from-file file))) - (unless (epl-package--package-desc-p package) - (epl--kill-autoload-buffer package)))) - -(defun epl--kill-autoload-buffer (package) - "Kill the buffer associated with autoloads for PACKAGE." - (let* ((auto-name (format "%s-autoloads.el" (epl-package-name package))) - (generated-autoload-file (expand-file-name auto-name (epl-package-directory package))) - (buf (find-buffer-visiting generated-autoload-file))) - (when buf (kill-buffer buf)))) - -(defun epl-package-install (package &optional force) - "Install a PACKAGE. - -PACKAGE is a `epl-package' object. If FORCE is given and -non-nil, install PACKAGE, even if it is already installed." - (when (or force (not (epl-package-installed-p package))) - (if (epl-package--package-desc-p package) - (package-install (epl-package-description package)) - ;; The legacy API installs by name. We have no control over versioning, - ;; etc. - (package-install (epl-package-name package)) - (epl--kill-autoload-buffer package)))) - -(defun epl-package-delete (package) - "Delete a PACKAGE. - -PACKAGE is a `epl-package' object to delete." - ;; package-delete allows for packages being trashed instead of fully deleted. - ;; Let's prevent his silly behavior - (let ((delete-by-moving-to-trash nil)) - ;; The byte compiler will warn us that we are calling `package-delete' with - ;; the wrong number of arguments, since it can't infer that we guarantee to - ;; always call the correct version. Thus we suppress all warnings when - ;; calling `package-delete'. I wish there was a more granular way to - ;; disable just that specific warning, but it is what it is. - (if (epl-package--package-desc-p package) - (with-no-warnings - (package-delete (epl-package-description package))) - ;; The legacy API deletes by name (as string!) and version instead by - ;; descriptor. Hence `package-delete' takes two arguments. For some - ;; insane reason, the arguments are strings here! - (let ((name (symbol-name (epl-package-name package))) - (version (epl-package-version-string package))) - (with-no-warnings - (package-delete name version)) - ;; Legacy package.el does not remove the deleted package - ;; from the `package-alist', so we do it manually here. - (let ((pkg (assq (epl-package-name package) package-alist))) - (when pkg - (setq package-alist (delq pkg package-alist)))))))) - -(defun epl-upgrade (&optional packages preserve-obsolete) - "Upgrade PACKAGES. - -PACKAGES is a list of package objects to upgrade, defaulting to -all installed packages. - -The old versions of the updated packages are deleted, unless -PRESERVE-OBSOLETE is non-nil. - -Return a list of all performed upgrades, as a list of -`epl-upgrade' objects." - (let ((upgrades (epl-find-upgrades packages))) - (dolist (upgrade upgrades) - (epl-package-install (epl-upgrade-available upgrade) 'force) - (unless preserve-obsolete - (epl-package-delete (epl-upgrade-installed upgrade)))) - upgrades)) - -(provide 'epl) - -;;; epl.el ends here diff --git a/elpa/epl-20180205.2049/epl.elc b/elpa/epl-20180205.2049/epl.elc deleted file mode 100644 index cd17f2381d3e7d4d9735740f4a37ccd3fc8bc6a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32645 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 diff --git a/elpa/f-20191110.1357/f-autoloads.el b/elpa/f-20191110.1357/f-autoloads.el deleted file mode 100644 index 366a50c8..00000000 --- a/elpa/f-20191110.1357/f-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; 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 diff --git a/elpa/f-20191110.1357/f-pkg.el b/elpa/f-20191110.1357/f-pkg.el deleted file mode 100644 index 984e0b0b..00000000 --- a/elpa/f-20191110.1357/f-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "f" "20191110.1357" "Modern API for working with files and directories" '((s "1.7.0") (dash "2.2.0")) :commit "1814209e2ff43cf2e6d38c4cd476218915f550fb" :keywords '("files" "directories") :authors '(("Johan Andersson" . "johan.rejeep@gmail.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :url "http://github.com/rejeep/f.el") diff --git a/elpa/f-20191110.1357/f.el b/elpa/f-20191110.1357/f.el deleted file mode 100644 index 012727c3..00000000 --- a/elpa/f-20191110.1357/f.el +++ /dev/null @@ -1,624 +0,0 @@ -;;; f.el --- Modern API for working with files and directories -*- lexical-binding: t; -*- - -;; Copyright (C) 2013 Johan Andersson - -;; Author: Johan Andersson -;; Maintainer: Johan Andersson -;; Version: 0.20.0 -;; Package-Version: 20191110.1357 -;; 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 descendants 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 diff --git a/elpa/f-20191110.1357/f.elc b/elpa/f-20191110.1357/f.elc deleted file mode 100644 index a9a46f4ff4602e6138224888e95eada8ef780f16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20520 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 Vu>M_IeAU-0zQ%2c1lGas{{#Q80pS1u diff --git a/elpa/faceup-20170925.1946/faceup-autoloads.el b/elpa/faceup-20170925.1946/faceup-autoloads.el deleted file mode 100644 index 905e59ec..00000000 --- a/elpa/faceup-20170925.1946/faceup-autoloads.el +++ /dev/null @@ -1,57 +0,0 @@ -;;; faceup-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "faceup" "faceup.el" (0 0 0 0)) -;;; Generated autoloads from faceup.el - -(autoload 'faceup-view-buffer "faceup" "\ -Display the faceup representation of the current buffer. - -\(fn)" t nil) - -(autoload 'faceup-write-file "faceup" "\ -Save the faceup representation of the current buffer to the file FILE-NAME. - -Unless a name is given, the file will be named xxx.faceup, where -xxx is the file name associated with the buffer. - -If optional second arg CONFIRM is non-nil, this function -asks for confirmation before overwriting an existing file. -Interactively, confirmation is required unless you supply a prefix argument. - -\(fn &optional FILE-NAME CONFIRM)" t nil) - -(autoload 'faceup-render-view-buffer "faceup" "\ -Convert BUFFER containing Faceup markup to a new buffer and display it. - -\(fn &optional BUFFER)" t nil) - -(autoload 'faceup-clean-buffer "faceup" "\ -Remove faceup markup from buffer. - -\(fn)" t nil) - -(autoload 'faceup-defexplainer "faceup" "\ -Defines an Ert explainer function for FUNCTION. - -FUNCTION must return an explanation when the test fails and -`faceup-test-explain' is set. - -\(fn FUNCTION)" nil t) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "faceup" '("faceup-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; faceup-autoloads.el ends here diff --git a/elpa/faceup-20170925.1946/faceup-pkg.el b/elpa/faceup-20170925.1946/faceup-pkg.el deleted file mode 100644 index 2f51016b..00000000 --- a/elpa/faceup-20170925.1946/faceup-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "faceup" "20170925.1946" "Markup language for faces and font-lock regression testing" 'nil :commit "6c92dad56a133e14e7b27831e1bcf9b3a71ff154" :keywords '("faces" "languages") :authors '(("Anders Lindgren")) :maintainer '("Anders Lindgren") :url "https://github.com/Lindydancer/faceup") diff --git a/elpa/faceup-20170925.1946/faceup.el b/elpa/faceup-20170925.1946/faceup.el deleted file mode 100644 index 7e619ac6..00000000 --- a/elpa/faceup-20170925.1946/faceup.el +++ /dev/null @@ -1,1182 +0,0 @@ -;;; faceup.el --- Markup language for faces and font-lock regression testing - -;; Copyright (C) 2013-2017 Anders Lindgren - -;; Author: Anders Lindgren -;; Version: 0.0.5 -;; Package-Version: 20170925.1946 -;; Created: 2013-01-21 -;; Keywords: faces languages -;; URL: https://github.com/Lindydancer/faceup - -;; 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 . - -;;; Commentary: - -;; Emacs is capable of highlighting buffers based on language-specific -;; `font-lock' rules. This package makes it possible to perform -;; regression test for packages that provide font-lock rules. -;; -;; The underlying idea is to convert text with highlights ("faces") -;; into a plain text representation using the Faceup markup -;; language. This language is semi-human readable, for example: -;; -;; «k:this» is a keyword -;; -;; By comparing the current highlight with a highlight performed with -;; stable versions of a package, it's possible to automatically find -;; problems that otherwise would have been hard to spot. -;; -;; This package is designed to be used in conjunction with Ert, the -;; standard Emacs regression test system. -;; -;; The Faceup markup language is a generic markup language, regression -;; testing is merely one way to use it. - -;; Regression test examples: -;; -;; This section describes the two typical ways regression testing with -;; this package is performed. -;; -;; -;; Full source file highlighting: -;; -;; The most straight-forward way to perform regression testing is to -;; collect a number of representative source files. From each source -;; file, say `alpha.mylang', you can use `M-x faceup-write-file RET' -;; to generate a Faceup file named `alpha.mylang.faceup', this file -;; use the Faceup markup language to represent the text with -;; highlights and is used as a reference in future tests. -;; -;; An Ert test case can be defined as follows: -;; -;; (require 'faceup) -;; -;; (defvar mylang-font-lock-test-dir (faceup-this-file-directory)) -;; -;; (defun mylang-font-lock-test-apps (file) -;; "Test that the mylang FILE is fontifies as the .faceup file describes." -;; (faceup-test-font-lock-file 'mylang-mode -;; (concat mylang-font-lock-test-dir file))) -;; (faceup-defexplainer mylang-font-lock-test-apps) -;; -;; (ert-deftest mylang-font-lock-file-test () -;; (should (mylang-font-lock-test-apps "apps/FirstApp/alpha.mylang")) -;; ;; ... Add more test files here ... -;; ) -;; -;; To execute the tests, run something like `M-x ert RET t RET'. -;; -;; -;; Source snippets: -;; -;; To test smaller snippets of code, you can use the -;; `faceup-test-font-lock-string'. It takes a major mode and a string -;; written using the Faceup markup language. The functions strips away -;; the Faceup markup, inserts the plain text into a temporary buffer, -;; highlights it, converts the result back into the Faceup markup -;; language, and finally compares the result with the original Faceup -;; string. -;; -;; For example: -;; -;; (defun mylang-font-lock-test (faceup) -;; (faceup-test-font-lock-string 'mylang-mode faceup)) -;; (faceup-defexplainer mylang-font-lock-test) -;; -;; (ert-deftest mylang-font-lock-test-simple () -;; "Simple MyLang font-lock tests." -;; (should (mylang-font-lock-test "«k:this» is a keyword")) -;; (should (mylang-font-lock-test "«k:function» «f:myfunc» («v:var»)"))) -;; - -;; Executing the tests: -;; -;; Once the tests have been defined, you can use `M-x ert RET t RET' -;; to execute them. Hopefully, you will be given the "all clear". -;; However, if there is a problem, you will be presented with -;; something like: -;; -;; F mylang-font-lock-file-test -;; (ert-test-failed -;; ((should -;; (mylang-font-lock-test-apps "apps/FirstApp/alpha.mylang")) -;; :form -;; (mylang-font-lock-test-apps "apps/FirstApp/alpha.mylang") -;; :value nil :explanation -;; ((on-line 2 -;; ("but_«k:this»_is_not_a_keyword") -;; ("but_this_is_not_a_keyword"))))) -;; -;; You should read this that on line 2, the old font-lock rules -;; highlighted `this' inside `but_this_is_not_a_keyword' (which is -;; clearly wrong), whereas the new doesn't. Of course, if this is the -;; desired result (for example, the result of a recent change) you can -;; simply regenerate the .faceup file and store it as the reference -;; file for the future. - -;; The Faceup markup language: -;; -;; The Faceup markup language is designed to be human-readable and -;; minimalistic. -;; -;; The two special characters `«' and `»' marks the start and end of a -;; range of a face. -;; -;; -;; Compact format for special faces: -;; -;; The compact format `«:text»' is used for a number of common -;; faces. For example, `«U:abc»' means that the text `abc' is -;; underlined. -;; -;; See `faceup-face-short-alist' for the known faces and the -;; corresponding letter. -;; -;; -;; Full format: -;; -;; The format `«::text»' is used use to encode other -;; faces. -;; -;; For example `«:my-special-face:abc»' meanst that `abc' has the face -;; `my-special-face'. -;; -;; -;; Anonymous faces: -;; -;; An "anonymous face" is when the `face' property contains a property -;; list (plist) on the form `(:key value)'. This is represented using -;; a variant of the full format: `«:(:key value):text»'. -;; -;; For example, `«:(:background "red"):abc»' represent the text `abc' -;; with a red background. -;; -;; -;; Multiple properties: -;; -;; In case a text contains more than one face property, they are -;; represented using nested sections. -;; -;; For example: -;; -;; * `«B:abc«U:def»»' represent the text `abcdef' that is both *bold* -;; and *underlined*. -;; -;; * `«W:abc«U:def»ghi»' represent the text `abcdefghi' where the -;; entire text is in *warning* face and `def' is *underlined*. -;; -;; In case two faces partially overlap, the ranges will be split when -;; represented in Faceup. For example: -;; -;; * `«B:abc«U:def»»«U:ghi»' represent the text `abcdefghi' where -;; `abcdef' is bold and `defghi' is underlined. -;; -;; -;; Escaping start and end markers: -;; -;; Any occurrence of the start or end markers in the original text -;; will be escaped using the start marker in the Faceup -;; representation. In other words, the sequences `««' and `«»' -;; represent a start and end marker, respectively. -;; -;; -;; Other properties: -;; -;; In addition to representing the `face' property (or, more -;; correctly, the value of `faceup-default-property') other properties -;; can be encoded. The variable `faceup-properties' contains a list of -;; properties to track. If a property behaves like the `face' -;; property, it is encoded as described above, with the addition of -;; the property name placed in parentheses, for example: -;; `«(my-face)U:abd»'. -;; -;; The variable `faceup-face-like-properties' contains a list of -;; properties considered face-like. -;; -;; Properties that are not considered face-like are always encoded -;; using the full format and the don't nest. For example: -;; `«(my-fibonacci-property):(1 1 2 3 5 8):abd»'. -;; -;; Examples of properties that could be tracked are: -;; -;; * `font-lock-face' -- an alias to `face' when `font-lock-mode' is -;; enabled. -;; -;; * `syntax-table' -- used by a custom `syntax-propertize' to -;; override the default syntax table. -;; -;; * `help-echo' -- provides tooltip text displayed when the mouse is -;; held over a text. - -;; Reference section: -;; -;; Faceup commands and functions: -;; -;; `M-x faceup-write-file RET' - generate a Faceup file based on the -;; current buffer. -;; -;; `M-x faceup-view-file RET' - view the current buffer converted to -;; Faceup. -;; -;; `faceup-markup-{string,buffer}' - convert text with properties to -;; the Faceup markup language. -;; -;; `faceup-render-view-buffer' - convert buffer with Faceup markup to -;; a buffer with real text properties and display it. -;; -;; `faceup-render-string' - return string with real text properties -;; from a string with Faceup markup. -;; -;; `faceup-render-to-{buffer,string}' - convert buffer with Faceup -;; markup to a buffer/string with real text properties. -;; -;; `faceup-clean-{buffer,string}' - remove Faceup markup from buffer -;; or string. -;; -;; -;; Regression test support: -;; -;; The following functions can be used as Ert test functions, or can -;; be used to implement new Ert test functions. -;; -;; `faceup-test-equal' - Test function, work like Ert:s `equal', but -;; more ergonomically when reporting multi-line string errors. -;; Concretely, it breaks down multi-line strings into lines and -;; reports which line number the error occurred on and the content of -;; that line. -;; -;; `faceup-test-font-lock-buffer' - Test that a buffer is highlighted -;; according to a reference Faceup text, for a specific major mode. -;; -;; `faceup-test-font-lock-string' - Test that a text with Faceup -;; markup is refontified to match the original Faceup markup. -;; -;; `faceup-test-font-lock-file' - Test that a file is highlighted -;; according to a reference .faceup file. -;; -;; `faceup-defexplainer' - Macro, define an explainer function and set -;; the `ert-explainer' property on the original function, for -;; functions based on the above test functions. -;; -;; `faceup-this-file-directory' - Macro, the directory of the current -;; file. - -;; Real-world examples: -;; -;; The following are examples of real-world package that use faceup to -;; test their font-lock keywords. -;; -;; * [cmake-font-lock](https://github.com/Lindydancer/cmake-font-lock) -;; an advanced set of font-lock keywords for the CMake language -;; -;; * [objc-font-lock](https://github.com/Lindydancer/objc-font-lock) -;; highlight Objective-C function calls. -;; - -;; Other Font Lock Tools: -;; -;; This package is part of a suite of font-lock tools. The other -;; tools in the suite are: -;; -;; -;; Font Lock Studio: -;; -;; Interactive debugger for font-lock keywords (Emacs syntax -;; highlighting rules). -;; -;; Font Lock Studio lets you *single-step* Font Lock keywords -- -;; matchers, highlights, and anchored rules, so that you can see what -;; happens when a buffer is fontified. You can set *breakpoints* on -;; or inside rules and *run* until one has been hit. When inside a -;; rule, matches are *visualized* using a palette of background -;; colors. The *explainer* can describe a rule in plain-text English. -;; Tight integration with *Edebug* allows you to step into Lisp -;; expressions that are part of the Font Lock keywords. -;; -;; -;; Font Lock Profiler: -;; -;; A profiler for font-lock keywords. This package measures time and -;; counts the number of times each part of a font-lock keyword is -;; used. For matchers, it counts the total number and the number of -;; successful matches. -;; -;; The result is presented in table that can be sorted by count or -;; time. The table can be expanded to include each part of the -;; font-lock keyword. -;; -;; In addition, this package can generate a log of all font-lock -;; events. This can be used to verify font-lock implementations, -;; concretely, this is used for back-to-back tests of the real -;; font-lock engine and Font Lock Studio, an interactive debugger for -;; font-lock keywords. -;; -;; -;; Highlight Refontification: -;; -;; Minor mode that visualizes how font-lock refontifies a buffer. -;; This is useful when developing or debugging font-lock keywords, -;; especially for keywords that span multiple lines. -;; -;; The background of the buffer is painted in a rainbow of colors, -;; where each band in the rainbow represent a region of the buffer -;; that has been refontified. When the buffer is modified, the -;; rainbow is updated. -;; -;; -;; Face Explorer: -;; -;; Library and tools for faces and text properties. -;; -;; This library is useful for packages that convert syntax highlighted -;; buffers to other formats. The functions can be used to determine -;; how a face or a face text property looks, in terms of primitive -;; face attributes (e.g. foreground and background colors). Two sets -;; of functions are provided, one for existing frames and one for -;; fictitious displays, like 8 color tty. -;; -;; In addition, the following tools are provided: -;; -;; - `face-explorer-list-faces' -- list all available faces. Like -;; `list-faces-display' but with information on how a face is -;; defined. In addition, a sample for the selected frame and for a -;; fictitious display is shown. -;; -;; - `face-explorer-describe-face' -- Print detailed information on -;; how a face is defined, and list all underlying definitions. -;; -;; - `face-explorer-describe-face-prop' -- Describe the `face' text -;; property at the point in terms of primitive face attributes. -;; Also show how it would look on a fictitious display. -;; -;; - `face-explorer-list-display-features' -- Show which features a -;; display supports. Most graphical displays support all, or most, -;; features. However, many tty:s don't support, for example, -;; strike-through. Using specially constructed faces, the resulting -;; buffer will render differently in different displays, e.g. a -;; graphical frame and a tty connected using `emacsclient -nw'. -;; -;; - `face-explorer-list-face-prop-examples' -- Show a buffer with an -;; assortment of `face' text properties. A sample text is shown in -;; four variants: Native, a manually maintained reference vector, -;; the result of `face-explorer-face-prop-attributes' and -;; `face-explorer-face-prop-attributes-for-fictitious-display'. Any -;; package that convert a buffer to another format (like HTML, ANSI, -;; or LaTeX) could use this buffer to ensure that everything work as -;; intended. -;; -;; - `face-explorer-list-overlay-examples' -- Show a buffer with a -;; number of examples of overlays, some are mixed with `face' text -;; properties. Any package that convert a buffer to another format -;; (like HTML, ANSI, or LaTeX) could use this buffer to ensure that -;; everything work as intended. -;; -;; - `face-explorer-tooltip-mode' -- Minor mode that shows tooltips -;; containing text properties and overlays at the mouse pointer. -;; -;; - `face-explorer-simulate-display-mode' -- Minor mode for make a -;; buffer look like it would on a fictitious display. Using this -;; you can, for example, see how a theme would look in using dark or -;; light background, a 8 color tty, or on a grayscale graphical -;; monitor. -;; -;; -;; Font Lock Regression Suite: -;; -;; A collection of example source files for a large number of -;; programming languages, with ERT tests to ensure that syntax -;; highlighting does not accidentally change. -;; -;; For each source file, font-lock reference files are provided for -;; various Emacs versions. The reference files contains a plain-text -;; representation of source file with syntax highlighting, using the -;; format "faceup". -;; -;; Of course, the collection source file can be used for other kinds -;; of testing, not limited to font-lock regression testing. - -;;; Code: - -(eval-when-compile - (require 'cl)) - - -(defvar faceup-default-property 'face - "The property that should be represented in Faceup without the (prop) part.") - -(defvar faceup-properties '(face) - "List of properties that should be converted to the Faceup format. - -Only face-like property use the short format. All other use the -non-nesting full format. (See `faceup-face-like-properties'.)" ) - - -(defvar faceup-face-like-properties '(face font-lock-face) - "List of properties that behave like `face'. - -The following properties are assumed about face-like properties: - -* Elements are either symbols or property lists, or lists thereof. - -* A plain element and a list containing the same element are - treated as equal - -* Property lists and sequences of property lists are considered - equal. For example: - - ((:underline t :foreground \"red\")) - - and - - ((:underline t) (:foreground \"red\")) - -Face-like properties are converted to faceup in a nesting fashion. - -For example, the string AAAXXXAAA (where the property `prop' has -the value `(a)' on the A:s and `(a b)' on the X:s) is converted -as follows, when treated as a face-like property: - - «(prop):a:AAA«(prop):b:XXX»AAAA» - -When treated as a non-face-like property: - - «(prop):(a):AAA»«(prop):(a b):XXX»«(prop):(a):AAA»") - - -(defvar faceup-markup-start-char 171) ;; « -(defvar faceup-markup-end-char 187) ;; » - -(defvar faceup-face-short-alist - '(;; Generic faces (uppercase letters) - (bold . "B") - (bold-italic . "Q") - (default . "D") - (error . "E") - (highlight . "H") - (italic . "I") - (underline . "U") - (warning . "W") - ;; font-lock-specific faces (lowercase letters) - (font-lock-builtin-face . "b") - (font-lock-comment-delimiter-face . "m") - (font-lock-comment-face . "x") - (font-lock-constant-face . "c") - (font-lock-doc-face . "d") - (font-lock-function-name-face . "f") - (font-lock-keyword-face . "k") - (font-lock-negation-char-face . "n") - (font-lock-preprocessor-face . "p") - (font-lock-regexp-grouping-backslash . "h") - (font-lock-regexp-grouping-construct . "o") - (font-lock-string-face . "s") - (font-lock-type-face . "t") - (font-lock-variable-name-face . "v") - (font-lock-warning-face . "w")) - "Alist from faces to one-character representation.") - - -;; Plain: «W....» -;; Nested: «W...«W...»» - -;; Overlapping: xxxxxxxxxx -;; yyyyyyyyyyyy -;; «X..«Y..»»«Y...» - - -(defun faceup-markup-string (s) - "Return the faceup version of the string S." - (with-temp-buffer - (insert s) - (faceup-markup-buffer))) - - -;;;###autoload -(defun faceup-view-buffer () - "Display the faceup representation of the current buffer." - (interactive) - (let ((buffer (get-buffer-create "*FaceUp*"))) - (with-current-buffer buffer - (delete-region (point-min) (point-max))) - (faceup-markup-to-buffer buffer) - (display-buffer buffer))) - - -;;;###autoload -(defun faceup-write-file (&optional file-name confirm) - "Save the faceup representation of the current buffer to the file FILE-NAME. - -Unless a name is given, the file will be named xxx.faceup, where -xxx is the file name associated with the buffer. - -If optional second arg CONFIRM is non-nil, this function -asks for confirmation before overwriting an existing file. -Interactively, confirmation is required unless you supply a prefix argument." - (interactive - (let ((suggested-name (and (buffer-file-name) - (concat (buffer-file-name) - ".faceup")))) - (list (read-file-name "Write faceup file: " - default-directory - suggested-name - nil - (file-name-nondirectory suggested-name)) - (not current-prefix-arg)))) - (unless file-name - (setq file-name (concat (buffer-file-name) ".faceup"))) - (let ((buffer (current-buffer))) - (with-temp-buffer - (faceup-markup-to-buffer (current-buffer) buffer) - ;; Note: Must set `require-final-newline' inside - ;; `with-temp-buffer', otherwise the value will be overridden by - ;; the buffers local value. - ;; - ;; Clear `window-size-change-functions' as a workaround for - ;; Emacs bug#19576 (`write-file' saves the wrong buffer if a - ;; function in the list change current buffer). - (let ((require-final-newline nil) - (window-size-change-functions '())) - (write-file file-name confirm))))) - - -(defun faceup-markup-buffer () - "Return a string with the content of the buffer using faceup markup." - (let ((buf (current-buffer))) - (with-temp-buffer - (faceup-markup-to-buffer (current-buffer) buf) - (buffer-substring-no-properties (point-min) (point-max))))) - - -;; Idea: -;; -;; Typically, only one face is used. However, when two faces are used, -;; the one of top is typically shorter. Hence, the faceup variant -;; should treat the inner group of nested ranges the upper (i.e. the -;; one towards the front.) For example: -;; -;; «f:aaaaaaa«U:xxxx»aaaaaa» - -(defun faceup-copy-and-quote (start end to-buffer) - "Quote and insert the text between START and END into TO-BUFFER." - (let ((not-markup (concat "^" - (make-string 1 faceup-markup-start-char) - (make-string 1 faceup-markup-end-char)))) - (save-excursion - (goto-char start) - (while (< (point) end) - (let ((old (point))) - (skip-chars-forward not-markup end) - (let ((s (buffer-substring-no-properties old (point)))) - (with-current-buffer to-buffer - (insert s)))) - ;; Quote stray markup characters. - (unless (= (point) end) - (let ((next-char (following-char))) - (with-current-buffer to-buffer - (insert faceup-markup-start-char) - (insert next-char))) - (forward-char)))))) - - -;; A face (string or symbol) can be on the top level. -;; -;; A face text property can be a arbitrary deep lisp structure. Each -;; list in the tree structure contains faces (symbols or strings) up -;; to the first keyword, e.g. :foreground, thereafter the list is -;; considered a property list, regardless of the content. A special -;; case are `(foreground-color . COLOR)' and `(background-color -;; . COLOR)', old forms used to represent the foreground and -;; background colors, respectively. -;; -;; Some of this is undocumented, and took some effort to reverse -;; engineer. -(defun faceup-normalize-face-property (value) - "Normalize VALUES into a list of faces and (KEY VALUE) entries." - (cond ((null value) - '()) - ((symbolp value) - (list value)) - ((stringp value) - (list (intern value))) - ((consp value) - (cond ((eq (car value) 'foreground-color) - (list (list :foreground (cdr value)))) - ((eq (car value) 'background-color) - (list (list :background (cdr value)))) - (t - ;; A list - (if (keywordp (car value)) - ;; Once a keyword has been seen, the rest of the - ;; list is treated as a property list, regardless - ;; of what it contains. - (let ((res '())) - (while value - (let ((key (pop value)) - (val (pop value))) - (when (keywordp key) - (push (list key val) res)))) - res) - (append - (faceup-normalize-face-property (car value)) - (faceup-normalize-face-property (cdr value))))))) - (t - (error "Unexpected text property %s" value)))) - - -(defun faceup-get-text-properties (pos) - "Alist of properties and values at POS. - -Face-like properties are normalized -- value is a list of -faces (symbols) and short (KEY VALUE) lists. The list is -reversed to that later elements take precedence over earlier." - (let ((res '())) - (dolist (prop faceup-properties) - (let ((value (get-text-property pos prop))) - (when value - (when (memq prop faceup-face-like-properties) - ;; Normalize face-like properties. - (setq value (reverse (faceup-normalize-face-property value)))) - (push (cons prop value) res)))) - res)) - - -(defun faceup-markup-to-buffer (to-buffer &optional buffer) - "Convert content of BUFFER to faceup form and insert in TO-BUFFER." - (save-excursion - (if buffer - (set-buffer buffer)) - ;; Font-lock often only fontifies the visible sections. This - ;; ensures that the entire buffer is fontified before converting - ;; it. - (if (and font-lock-mode - ;; Prevent clearing out face attributes explicitly - ;; inserted by functions like `list-faces-display'. - ;; (Font-lock mode is enabled, for some reason, in those - ;; buffers.) - (not (and (eq major-mode 'help-mode) - (not font-lock-defaults)))) - (font-lock-fontify-region (point-min) (point-max))) - (let ((last-pos (point-min)) - (pos nil) - ;; List of (prop . value), representing open faceup blocks. - (state '())) - (while (setq pos (faceup-next-property-change pos)) - ;; Insert content. - (faceup-copy-and-quote last-pos pos to-buffer) - (setq last-pos pos) - (let ((prop-values (faceup-get-text-properties pos))) - (let ((next-state '())) - (setq state (reverse state)) - ;; Find all existing sequences that should continue. - (let ((cont t)) - (while (and state - prop-values - cont) - (let* ((prop (car (car state))) - (value (cdr (car state))) - (pair (assq prop prop-values))) - (if (memq prop faceup-face-like-properties) - ;; Element by element. - (if (equal value (car (cdr pair))) - (setcdr pair (cdr (cdr pair))) - (setq cont nil)) - ;; Full value. - ;; - ;; Note: Comparison is done by `eq', since (at - ;; least) the `display' property treats - ;; eq-identical values differently than when - ;; comparing using `equal'. See "Display Specs - ;; That Replace The Text" in the elisp manual. - (if (eq value (cdr pair)) - (setq prop-values (delq pair prop-values)) - (setq cont nil)))) - (when cont - (push (pop state) next-state)))) - ;; End values that should not be included in the next state. - (while state - (with-current-buffer to-buffer - (insert (make-string 1 faceup-markup-end-char))) - (pop state)) - ;; Start new ranges. - (with-current-buffer to-buffer - (while prop-values - (let ((pair (pop prop-values))) - (if (memq (car pair) faceup-face-like-properties) - ;; Face-like. - (dolist (element (cdr pair)) - (insert (make-string 1 faceup-markup-start-char)) - (unless (eq (car pair) faceup-default-property) - (insert "(") - (insert (symbol-name (car pair))) - (insert "):")) - (if (symbolp element) - (let ((short - (assq element faceup-face-short-alist))) - (if short - (insert (cdr short) ":") - (insert ":" (symbol-name element) ":"))) - (insert ":") - (prin1 element (current-buffer)) - (insert ":")) - (push (cons (car pair) element) next-state)) - ;; Not face-like. - (insert (make-string 1 faceup-markup-start-char)) - (insert "(") - (insert (symbol-name (car pair))) - (insert "):") - (prin1 (cdr pair) (current-buffer)) - (insert ":") - (push pair next-state))))) - ;; Insert content. - (setq state next-state)))) - ;; Insert whatever is left after the last face change. - (faceup-copy-and-quote last-pos (point-max) to-buffer)))) - - - -;; Some basic facts: -;; -;; (get-text-property (point-max) ...) always return nil. To check the -;; last character in the buffer, use (- (point-max) 1). -;; -;; If a text has more than one face, the first one in the list -;; takes precedence, when being viewed in Emacs. -;; -;; (let ((s "ABCDEF")) -;; (set-text-properties 1 4 -;; '(face (font-lock-warning-face font-lock-variable-name-face)) s) -;; (insert s)) -;; -;; => ABCDEF -;; -;; Where DEF is drawn in "warning" face. - - -(defun faceup-has-any-text-property (pos) - "True if any properties in `faceup-properties' are defined at POS." - (let ((res nil)) - (dolist (prop faceup-properties) - (when (get-text-property pos prop) - (setq res t))) - res)) - - -(defun faceup-next-single-property-change (pos) - "Next position a property in `faceup-properties' changes after POS, or nil." - (let ((res nil)) - (dolist (prop faceup-properties) - (let ((next (next-single-property-change pos prop))) - (when next - (setq res (if res - (min res next) - next))))) - res)) - - -(defun faceup-next-property-change (pos) - "Next position after POS where one of the tracked properties change. - -If POS is nil, also include `point-min' in the search. -If last character contains a tracked property, return `point-max'. - -See `faceup-properties' for a list of tracked properties." - (if (eq pos (point-max)) - ;; Last search returned `point-max'. There is no more to search - ;; for. - nil - (if (and (null pos) - (faceup-has-any-text-property (point-min))) - ;; `pos' is `nil' and the character at `point-min' contains a - ;; tracked property, return `point-min'. - (point-min) - (unless pos - ;; Start from the beginning. - (setq pos (point-min))) - ;; Do a normal search. Compensate for that - ;; `next-single-property-change' does not include the end of the - ;; buffer, even when a property reach it. - (let ((res (faceup-next-single-property-change pos))) - (if (and (not res) ; No more found. - (not (eq pos (point-max))) ; Not already at the end. - (not (eq (point-min) (point-max))) ; Not an empty buffer. - (faceup-has-any-text-property (- (point-max) 1))) - ;; If a property goes all the way to the end of the - ;; buffer, return `point-max'. - (point-max) - res))))) - - -;; ---------------------------------------------------------------------- -;; Renderer -;; - -;; Functions to convert from the faceup textual representation to text -;; with real properties. - -(defun faceup-render-string (faceup) - "Return string with properties from FACEUP written with Faceup markup." - (with-temp-buffer - (insert faceup) - (faceup-render-to-string))) - - -;;;###autoload -(defun faceup-render-view-buffer (&optional buffer) - "Convert BUFFER containing Faceup markup to a new buffer and display it." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (let ((dest-buffer (get-buffer-create "*FaceUp rendering*"))) - (with-current-buffer dest-buffer - (delete-region (point-min) (point-max))) - (faceup-render-to-buffer dest-buffer) - (display-buffer dest-buffer)))) - - -(defun faceup-render-to-string (&optional buffer) - "Convert BUFFER containing faceup markup to a string with faces." - (unless buffer - (setq buffer (current-buffer))) - (with-temp-buffer - (faceup-render-to-buffer (current-buffer) buffer) - (buffer-substring (point-min) (point-max)))) - - -(defun faceup-render-to-buffer (to-buffer &optional buffer) - "Convert BUFFER containing faceup markup into text with faces in TO-BUFFER." - (with-current-buffer (or buffer (current-buffer)) - (goto-char (point-min)) - (let ((last-point (point)) - (state '()) ; List of (prop . element) - (not-markup (concat - "^" - (make-string 1 faceup-markup-start-char) - (make-string 1 faceup-markup-end-char)))) - (while (progn - (skip-chars-forward not-markup) - (if (not (eq last-point (point))) - (let ((text (buffer-substring-no-properties - last-point (point))) - (prop-elements-alist '())) - ;; Accumulate all values for each property. - (dolist (prop-element state) - (let ((property (car prop-element)) - (element (cdr prop-element))) - (let ((pair (assq property prop-elements-alist))) - (unless pair - (setq pair (cons property '())) - (push pair prop-elements-alist)) - (push element (cdr pair))))) - ;; Apply all properties. - (dolist (pair prop-elements-alist) - (let ((property (car pair)) - (elements (reverse (cdr pair)))) - ;; Create one of: - ;; (property element) or - ;; (property (element element ...)) - (when (eq (length elements) 1) - ;; This ensures that non-face-like - ;; properties are restored to their - ;; original state. - (setq elements (car elements))) - (add-text-properties 0 (length text) - (list property elements) - text))) - (with-current-buffer to-buffer - (insert text)) - (setq last-point (point)))) - (not (eobp))) - (if (eq (following-char) faceup-markup-start-char) - ;; Start marker. - (progn - (forward-char) - (if (or (eq (following-char) faceup-markup-start-char) - (eq (following-char) faceup-markup-end-char)) - ;; Escaped markup character. - (progn - (setq last-point (point)) - (forward-char)) - ;; Markup sequence. - (let ((property faceup-default-property)) - (when (eq (following-char) ?\( ) - (forward-char) ; "(" - (let ((p (point))) - (forward-sexp) - (setq property (intern (buffer-substring p (point))))) - (forward-char)) ; ")" - (let ((element - (if (eq (following-char) ?:) - ;; :element: - (progn - (forward-char) - (prog1 - (let ((p (point))) - (forward-sexp) - ;; Note: (read (current-buffer)) - ;; doesn't work, as it reads more - ;; than a sexp. - (read (buffer-substring p (point)))) - (forward-char))) - ;; X: - (prog1 - (car (rassoc (buffer-substring-no-properties - (point) (+ (point) 1)) - faceup-face-short-alist)) - (forward-char 2))))) - (push (cons property element) state))) - (setq last-point (point)))) - ;; End marker. - (pop state) - (forward-char) - (setq last-point (point))))))) - -;; ---------------------------------------------------------------------- - -;;;###autoload -(defun faceup-clean-buffer () - "Remove faceup markup from buffer." - (interactive) - (goto-char (point-min)) - (let ((not-markup (concat - "^" - (make-string 1 faceup-markup-start-char) - (make-string 1 faceup-markup-end-char)))) - (while (progn (skip-chars-forward not-markup) - (not (eobp))) - (if (eq (following-char) faceup-markup-end-char) - ;; End markers are always on their own. - (delete-char 1) - ;; Start marker. - (delete-char 1) - (if (or (eq (following-char) faceup-markup-start-char) - (eq (following-char) faceup-markup-end-char)) - ;; Escaped markup character, delete the escape and skip - ;; the original character. - (forward-char) - ;; Property name (if present) - (if (eq (following-char) ?\( ) - (let ((p (point))) - (forward-sexp) - (delete-region p (point)))) - ;; Markup sequence. - (if (eq (following-char) ?:) - ;; :value: - (let ((p (point))) - (forward-char) - (forward-sexp) - (unless (eobp) - (forward-char)) - (delete-region p (point))) - ;; X: - (delete-char 1) ; The one-letter form. - (delete-char 1))))))) ; The colon. - - -(defun faceup-clean-string (s) - "Remove faceup markup from string S." - (with-temp-buffer - (insert s) - (faceup-clean-buffer) - (buffer-substring (point-min) (point-max)))) - - -;; ---------------------------------------------------------------------- -;; Regression test support -;; - -(defvar faceup-test-explain nil - "When non-nil, tester functions returns a text description on failure. - -Of course, this only work for test functions aware of this -variable, like `faceup-test-equal' and functions based on this -function. - -This is intended to be used to simplify `ert' explain functions, -which could be defined as: - - (defun my-test (args...) ...) - (defun my-test-explain (args...) - (let ((faceup-test-explain t)) - (the-test args...))) - (put 'my-test 'ert-explainer 'my-test-explain) - -Alternative, you can use the macro `faceup-defexplainer' as follows: - - (defun my-test (args...) ...) - (faceup-defexplainer my-test) - -Test functions, like `faceup-test-font-lock-buffer', built on top -of `faceup-test-equal', and other functions that adhere to this -variable, can easily define their own explainer functions.") - -;;;###autoload -(defmacro faceup-defexplainer (function) - "Defines an Ert explainer function for FUNCTION. - -FUNCTION must return an explanation when the test fails and -`faceup-test-explain' is set." - (let ((name (intern (concat (symbol-name function) "-explainer")))) - `(progn - (defun ,name (&rest args) - (let ((faceup-test-explain t)) - (apply (quote ,function) args))) - (put (quote ,function) 'ert-explainer (quote ,name))))) - - -;; ------------------------------ -;; Multi-line string support. -;; - -(defun faceup-test-equal (lhs rhs) - "Compares two (multi-line) strings, LHS and RHS, for equality. - -This is intended to be used in Ert regression test rules. - -When `faceup-test-explain' is non-nil, instead of returning nil -on inequality, a list is returned with a explanation what -differs. Currently, this function reports 1) if the number of -lines in the strings differ. 2) the lines and the line numbers on -which the string differed. - -For example: - (let ((a \"ABC\\nDEF\\nGHI\") - (b \"ABC\\nXXX\\nGHI\\nZZZ\") - (faceup-test-explain t)) - (message \"%s\" (faceup-test-equal a b))) - - ==> (4 3 number-of-lines-differ (on-line 2 (DEF) (XXX))) - -When used in an `ert' rule, the output is as below: - - (ert-deftest faceup-test-equal-example () - (let ((a \"ABC\\nDEF\\nGHI\") - (b \"ABC\\nXXX\\nGHI\\nZZZ\")) - (should (faceup-test-equal a b)))) - - F faceup-test-equal-example - (ert-test-failed - ((should - (faceup-test-equal a b)) - :form - (faceup-test-equal \"ABC\\nDEF\\nGHI\" \"ABC\\nXXX\\nGHI\\nZZZ\") - :value nil :explanation - (4 3 number-of-lines-differ - (on-line 2 - (\"DEF\") - (\"XXX\")))))" - (if (equal lhs rhs) - t - (if faceup-test-explain - (let ((lhs-lines (split-string lhs "\n")) - (rhs-lines (split-string rhs "\n")) - (explanation '()) - (line 1)) - (unless (= (length lhs-lines) (length rhs-lines)) - (setq explanation (list 'number-of-lines-differ - (length lhs-lines) (length rhs-lines)))) - (while lhs-lines - (let ((one (pop lhs-lines)) - (two (pop rhs-lines))) - (unless (equal one two) - (setq explanation - (cons (list 'on-line line (list one) (list two)) - explanation))) - (setq line (+ line 1)))) - (nreverse explanation)) - nil))) - -(faceup-defexplainer faceup-test-equal) - - -;; ------------------------------ -;; Font-lock regression test support. -;; - -(defun faceup-test-font-lock-buffer (mode faceup &optional buffer) - "Verify that BUFFER is fontified as FACEUP for major mode MODE. - -If BUFFER is not specified the current buffer is used. - -Note that the major mode of the buffer is set to MODE and that -the buffer is fontified. - -If MODE is a list, the first element is the major mode, the -remaining are additional functions to call, e.g. minor modes." - (save-excursion - (if buffer - (set-buffer buffer)) - (if (listp mode) - (dolist (m mode) - (funcall m)) - (funcall mode)) - (font-lock-fontify-region (point-min) (point-max)) - (let ((result (faceup-markup-buffer))) - (faceup-test-equal faceup result)))) - -(faceup-defexplainer faceup-test-font-lock-buffer) - - -(defun faceup-test-font-lock-string (mode faceup) - "True if FACEUP is re-fontified as the faceup markup for major mode MODE. - -The string FACEUP is stripped from markup, inserted into a -buffer, the requested major mode activated, the buffer is -fontified, the result is again converted to the faceup form, and -compared with the original string." - (with-temp-buffer - (insert faceup) - (faceup-clean-buffer) - (faceup-test-font-lock-buffer mode faceup))) - -(faceup-defexplainer faceup-test-font-lock-string) - - -(defun faceup-test-font-lock-file (mode file &optional faceup-file) - "Verify that FILE is fontified as FACEUP-FILE for major mode MODE. - -If FACEUP-FILE is omitted, FILE.faceup is used." - (unless faceup-file - (setq faceup-file (concat file ".faceup"))) - (let ((faceup (with-temp-buffer - (insert-file-contents faceup-file) - (buffer-substring-no-properties (point-min) (point-max))))) - (with-temp-buffer - (insert-file-contents file) - (faceup-test-font-lock-buffer mode faceup)))) - -(faceup-defexplainer faceup-test-font-lock-file) - - -;; ------------------------------ -;; Get current file directory. Test cases can use this to locate test -;; files. -;; - -(defun faceup-this-file-directory () - "The directory of the file where the call to this function is located in. -Intended to be called when a file is loaded." - (expand-file-name - (if load-file-name - ;; File is being loaded. - (file-name-directory load-file-name) - ;; File is being evaluated using, for example, `eval-buffer'. - default-directory))) - - -;; ---------------------------------------------------------------------- -;; The end -;; - -(provide 'faceup) - -;;; faceup.el ends here diff --git a/elpa/faceup-20170925.1946/faceup.elc b/elpa/faceup-20170925.1946/faceup.elc deleted file mode 100644 index c98e0ebc5d51956238343976f93ae6bf3d53d994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17366 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 diff --git a/elpa/flucui-themes-20200204.1930/flucui-dark-theme.el b/elpa/flucui-themes-20200204.1930/flucui-dark-theme.el deleted file mode 100644 index 72572b5b..00000000 --- a/elpa/flucui-themes-20200204.1930/flucui-dark-theme.el +++ /dev/null @@ -1,294 +0,0 @@ -;;; flucui-dark-theme.el --- Custom theme inspired by the FlatUI palette - -;; Copyright (C) 2018 MetroWind. - -;; This program is free software. It comes without any warranty, to -;; the extent permitted by applicable law. You can redistribute it -;; and/or modify it under the terms of the Do What the Fuck You Want -;; to Public License, Version 2, as published by Sam Hocevar. See -;; http://www.wtfpl.net/ for more details. - -;; Author: MetroWind -;; URL: https://github.com/MetroWind/flucui-theme -;; Keywords: lisp -;; Version: 1.0 -;; Package-Requires: ((emacs "24")) - -;;; Commentary: -;; -;; Fluc UI theme is a custom theme for Emacs, inspired by -;; http://flatuicolors.com. It Has both light and dark variants. This -;; file provides dark variant. - -;;; Code: - -;; Note: for every face that is customized here, a customization for -;; it should be also provided in the light version. Otherwise it could -;; be ugly when switching bwteen styles - -(deftheme flucui-dark - "Inspired by the color scheme from flatuicolors.com.") - -;; Colors -(let* - ((fui-turquoise "#1abc9c") - (fui-emerald "#2ecc71") - (fui-river "#3498db") - (fui-amethyst "#9b59b6") - (fui-deep-asphalt "#34495e") - (fui-asphalt "#425d78") - (fui-sunflower "#f1c40f") - (fui-carrot "#e67e22") - (fui-alizarin "#e74c3c") - (fui-clouds "#ecf0f1") - (fui-concrete "#95a5a6") - (fui-dark-turquoise "#16a085") - (fui-dark-emerald "#27ae60") - (fui-dark-river "#2980b9") - (fui-dark-amethyst "#8e44ad") - (fui-dark-asphalt "#2c3e50") - (fui-dark-sunflower "#f39c12") - (fui-dark-carrot "#d35400") - (fui-dark-alizarin "#c0392b") - (fui-dark-clouds "#bdc3c7") - (fui-deep-clouds "#dce0e1") - (fui-dark-concrete "#7f8c8d") - - (fui-bg fui-dark-asphalt) - (fui-fg fui-dark-clouds)) - - (custom-theme-set-faces - 'flucui-dark - `(default ((t (:background ,fui-bg - :foreground ,fui-fg)))) - `(cursor ((t (:background ,fui-carrot - :foreground ,fui-fg)))) - `(region ((t (:background ,fui-dark-sunflower - :foreground ,fui-bg)))) - `(mode-line ((t (:background ,fui-asphalt - :foreground ,fui-fg - :box nil)))) - `(mode-line-buffer-id ((t (:foreground ,fui-fg)))) - `(mode-line-inactive ((t (:background ,fui-bg - :foreground ,fui-fg)))) - `(fringe ((t (:background ,fui-bg)))) - `(minibuffer-prompt ((t (:slant italic :foreground ,fui-dark-concrete)))) - `(font-lock-builtin-face ((t (:foreground ,fui-deep-clouds)))) - `(font-lock-comment-face ((t (:slant italic :foreground ,fui-dark-concrete)))) - `(font-lock-constant-face ((t (:slant italic :foreground ,fui-deep-clouds)))) - `(font-lock-function-name-face ((t (:foreground ,fui-sunflower)))) - `(font-lock-keyword-face ((t (:foreground ,fui-deep-clouds :slant italic)))) - `(font-lock-string-face ((t (:foreground ,fui-turquoise)))) - `(font-lock-type-face ((t (:foreground ,fui-emerald)))) - `(font-lock-variable-name-face ((t (:foreground ,fui-river)))) - `(font-lock-warning-face ((t (:foreground ,fui-dark-carrot)))) - `(isearch ((t (:background ,fui-dark-concrete - :foreground ,fui-fg)))) - `(lazy-highlight ((t (:background ,fui-concrete)))) - `(link ((t (:foreground ,fui-river :underline t)))) - `(link-visited ((t (:foreground ,fui-dark-concrete :underline t)))) - `(button ((t (:background ,fui-bg :underline t :foreground nil)))) - `(header-line ((t (:background ,fui-asphalt - :foreground ,fui-fg)))) - `(shadow ((t (:foreground ,fui-dark-concrete)))) - `(show-paren-match ((t (:background ,fui-emerald :foreground ,fui-bg)))) - `(show-paren-mismatch ((t (:background ,fui-alizarin - :foreground ,fui-bg)))) - `(highlight ((t (:inverse-video nil :background ,fui-asphalt)))) - `(hl-line ((t (:inverse-video nil :background ,fui-asphalt)))) - `(widget-field ((t (:background ,fui-dark-concrete)))) - - ;; Face for specific prog modes - `(sh-heredoc ((t (:foreground nil :inherit font-lock-string-face)))) - - ;; Dired - `(dired-directory ((t (:foreground ,fui-river)))) - `(dired-symlink ((t (:foreground ,fui-turquoise)))) - `(dired-perm-write ((t (:foreground ,fui-dark-carrot)))) - - ;; Diff - `(diff-added ((t (:foreground ,fui-turquoise)))) - `(diff-removed ((t (:foreground ,fui-alizarin)))) - ;; `(diff-context ((t (:inherit default)))) - `(diff-file-header ((t (:bold t :background ,fui-asphalt :weight bold :foreground ,fui-clouds)))) - `(diff-header ((t (:foreground ,fui-concrete :background ,fui-bg)))) - - ;; Whitespace - `(whitespace-trailing ((t (:background ,fui-asphalt)))) - `(whitespace-line ((t (:background ,fui-asphalt :foreground ,fui-fg)))) - - ;; ERC - `(erc-notice-face ((t (:foreground ,fui-river - :weight unspecified)))) - `(erc-header-line ((t (:background ,fui-asphalt)))) - `(erc-timestamp-face ((t (:foreground ,fui-dark-concrete - :weight unspecified)))) - `(erc-current-nick-face ((t (:foreground ,fui-sunflower - :weight unspecified)))) - `(erc-input-face ((t (:foreground ,fui-fg)))) - `(erc-prompt-face ((t (:foreground ,fui-dark-concrete - :background nil - :slant italic - :weight unspecified)))) - `(erc-my-nick-face ((t (:foreground ,fui-sunflower)))) - `(erc-pal-face ((t (:foreground ,fui-emerald)))) - - ;; Rainbow delimiters - `(rainbow-delimiters-depth-1-face ((t (:foreground ,fui-fg)))) - `(rainbow-delimiters-depth-2-face ((t (:foreground ,fui-river)))) - `(rainbow-delimiters-depth-3-face ((t (:foreground ,fui-carrot)))) - `(rainbow-delimiters-depth-4-face ((t (:foreground ,fui-amethyst)))) - `(rainbow-delimiters-depth-5-face ((t (:foreground ,fui-sunflower)))) - `(rainbow-delimiters-depth-6-face ((t (:foreground ,fui-emerald)))) - `(rainbow-delimiters-depth-7-face ((t (:foreground ,fui-concrete)))) - `(rainbow-delimiters-unmatched-face ((t (:foreground ,fui-alizarin)))) - - ;; Magit - `(magit-branch-local ((t (:foreground ,fui-river :background nil)))) - `(magit-branch-remote ((t (:foreground ,fui-emerald :background nil)))) - `(magit-tag ((t (:foreground ,fui-river :background ,fui-bg)))) - `(magit-hash ((t (:foreground ,fui-concrete)))) - `(magit-section-title ((t (:foreground ,fui-dark-emerald :background ,fui-bg)))) - `(magit-section-heading ((t (:background ,fui-asphalt :foreground ,fui-fg)))) - `(magit-section-highlight ((t (:background ,fui-asphalt)))) - `(magit-item-highlight ((t (:foreground ,fui-fg :background ,fui-deep-clouds)))) - `(magit-log-author ((t (:foreground ,fui-sunflower)))) - `(magit-diff-added ((t (:inherit diff-added)))) - `(magit-diff-added-highlight ((t (:inherit magit-diff-added)))) - `(magit-diff-removed ((t (:inherit diff-removed)))) - `(magit-diff-removed-highlight ((t (:inherit magit-diff-removed)))) - `(magit-diff-context ((t (:inherit diff-context)))) - `(magit-diff-context-highlight ((t (:inherit magit-diff-context)))) - - ;; Git-gutter-fringe - `(git-gutter-fr:modified ((t (:foreground ,fui-sunflower)))) - `(git-gutter-fr:added ((t (:foreground ,fui-emerald)))) - `(git-gutter-fr:deleted ((t (:foreground ,fui-alizarin)))) - - ;; Company - `(company-preview ((t (:foreground ,fui-fg :background ,fui-sunflower)))) - `(company-preview-common ((t (:foreground ,fui-fg :background ,fui-carrot)))) - `(company-tooltip ((t (:foreground ,fui-fg :background ,fui-asphalt)))) - `(company-tooltip-common ((t (:foreground ,fui-sunflower)))) - `(company-tooltip-selection ((t (:background ,fui-deep-asphalt)))) - `(company-tooltip-common-selection ((t (:foreground ,fui-sunflower)))) - `(company-tooltip-annotation ((t (:foreground ,fui-emerald)))) - `(company-scrollbar-bg ((t (:background ,fui-bg)))) - `(company-scrollbar-fg ((t (:background ,fui-asphalt)))) - - ;; Cperl - `(cperl-array-face ((t (:weight bold :inherit font-lock-variable-name-face)))) - `(cperl-hash-face ((t (:weight bold :slant italic :inherit font-lock-variable-name-face)))) - `(cperl-nonoverridable-face ((t (:inherit font-lock-builtin-face)))) - - ;; Powerline - `(mode-line ((t (:box nil)))) - `(powerline-active2 ((t (:foreground ,fui-fg :background ,fui-dark-clouds)))) - `(powerline-active1 ((t (:foreground ,fui-bg :background ,fui-emerald)))) - `(powerline-inactive2 ((t (:foreground ,fui-bg :background ,fui-concrete)))) - `(powerline-inactive1 ((t (:foreground ,fui-fg :background ,fui-dark-clouds)))) - - ;; Smart mode line - `(sml/global ((t (:foreground ,fui-fg)))) - `(sml/charging ((t (:foreground ,fui-emerald)))) - `(sml/discharging ((t (:foreground ,fui-dark-alizarin)))) - `(sml/read-only ((t (:foreground ,fui-dark-emerald)))) - `(sml/filename ((t (:foreground ,fui-turquoise)))) - `(sml/prefix ((t (:foreground ,fui-amethyst :weight normal :slant italic)))) - `(sml/modes ((t (:foreground ,fui-fg :weight bold)))) - `(sml/modified ((t (:foreground ,fui-alizarin)))) - `(sml/outside-modified ((t (:foreground ,fui-bg :background ,fui-alizarin)))) - `(sml/position-percentage ((t (:foreground ,fui-river :slant normal)))) - - ;; Helm - `(helm-candidate-number ((t (:foreground ,fui-fg :background nil)))) - `(helm-source-header ((t (:foreground ,fui-fg :background ,fui-asphalt - :weight normal :slant italic)))) - `(helm-selection ((t (:background ,fui-dark-sunflower :foreground ,fui-bg)))) - `(helm-prefarg ((t (:foreground ,fui-dark-alizarin)))) - `(helm-ff-directory ((t (:foreground ,fui-river)))) - `(helm-ff-executable ((t (:foreground ,fui-emerald)))) - `(helm-ff-invalid-symlink ((t (:foreground ,fui-bg :background ,fui-dark-alizarin)))) - `(helm-ff-symlink ((t (:foreground ,fui-amethyst)))) - `(helm-ff-prefix ((t (:background ,fui-sunflower)))) - `(helm-ff-dotted-directory ((t (:background nil :foreground ,fui-dark-concrete)))) - `(helm-M-x-key ((t (:foreground ,fui-dark-emerald)))) - `(helm-buffer-file ((t (:foreground ,fui-fg)))) - `(helm-buffer-archive ((t (:inherit helm-buffer-file)))) - `(helm-buffer-directory ((t (:foreground ,fui-river :background nil)))) - `(helm-buffer-not-saved ((t (:foreground ,fui-dark-alizarin)))) - `(helm-buffer-modified ((t (:foreground ,fui-carrot)))) - `(helm-buffer-process ((t (:foreground ,fui-dark-emerald)))) - `(helm-buffer-size ((t (:foreground ,fui-dark-concrete)))) - `(helm-ff-file ((t (:inherit default)))) - - ;; TeX - `(font-latex-sedate-face ((t (:foreground ,fui-river)))) - `(font-latex-math-face ((t (:foreground ,fui-turquoise)))) - `(font-latex-script-char-face ((t (:inherit font-latex-math-face)))) - - ;; adoc-mode - `(markup-meta-hide-face ((t (:height 1.0 :foreground ,fui-fg)))) - `(markup-meta-face ((t (:height 1.0 :foreground ,fui-fg :family nil)))) - `(markup-reference-face ((t (:underline nil :foreground ,fui-river)))) - `(markup-gen-face ((t (:foreground ,fui-emerald)))) - `(markup-passthrough-face ((t (:inherit markup-gen-face)))) - `(markup-replacement-face ((t (:family nil :foreground ,fui-amethyst)))) - `(markup-list-face ((t (:weight bold)))) - `(markup-secondary-text-face ((t (:height 1.0 :foreground ,fui-emerald)))) - `(markup-verbatim-face ((t (:foreground ,fui-concrete)))) - `(markup-typewriter-face ((t (:inherit nil)))) - `(markup-title-0-face ((t (:height 1.2 :inherit markup-gen-face)))) - `(markup-title-1-face ((t (:height 1.0 :inherit markup-gen-face)))) - `(markup-title-2-face ((t (:height 1.0 :inherit markup-gen-face)))) - `(markup-title-3-face ((t (:height 1.0 :inherit markup-gen-face)))) - `(markup-title-4-face ((t (:height 1.0 :inherit markup-gen-face)))) - `(markup-title-5-face ((t (:height 1.0 :inherit markup-gen-face)))) - - ;; Org-mode - `(org-hide ((t (:foreground ,fui-bg)))) - `(org-table ((t (:foreground ,fui-fg)))) - `(org-date ((t (:foreground ,fui-emerald)))) - `(org-done ((t (:weight normal :foreground ,fui-dark-concrete)))) - `(org-todo ((t (:weight normal :foreground ,fui-carrot)))) - `(org-latex-and-related ((t (:foreground ,fui-concrete :italic t)))) - `(org-checkbox ((t (:weight normal :foreground ,fui-concrete)))) - `(org-mode-line-clock ((t (:background nil)))) - `(org-document-title ((t (:weight normal :foreground nil)))) - - ;; Message - `(message-header-name ((t (:foreground ,fui-concrete)))) - `(message-header-other ((t (:foreground ,fui-fg)))) - `(message-header-cc ((t (:inherit message-header-other)))) - `(message-header-newsgroups ((t (:inherit message-header-other)))) - `(message-header-xheader ((t (:inherit message-header-other)))) - `(message-header-subject ((t (:foreground ,fui-emerald)))) - `(message-header-to ((t (:foreground ,fui-river)))) - `(message-mml ((t (:foreground ,fui-dark-concrete)))) - - ;; Notmuch - `(notmuch-search-unread-face ((t (:foreground ,fui-river)))) - `(notmuch-tag-face ((t (:foreground ,fui-emerald)))) - `(notmuch-tree-match-author-face ((t (:foreground ,fui-river)))) - `(notmuch-tree-no-match-face ((t (:foreground ,fui-concrete)))) - `(notmuch-tree-match-tag-face ((t (:inherit notmuch-tree-match-author-face)))) - `(notmuch-tag-unread-face ((t (:foreground ,fui-carrot)))) - `(notmuch-message-summary-face ((t (:foreground ,fui-concrete)))) - - ;; Highlight-indent-guides - `(highlight-indent-guides-odd-face ((t (:background ,fui-deep-asphalt)))) - `(highlight-indent-guides-even-face ((t (:background nil)))) - - ;; Telega - `(telega-msg-heading ((t (:background nil :foreground ,fui-emerald :inherit nil)))) - `(telega-msg-inline-reply ((t (:foreground ,fui-dark-concrete :inherit nil)))) - `(telega-entity-type-texturl ((t (:inherit nil :foreground ,fui-river)))) - )) - -(provide-theme 'flucui-dark) - -;; Local Variables: -;; no-byte-compile: t -;; End: - -;;; flucui-dark-theme.el ends here diff --git a/elpa/flucui-themes-20200204.1930/flucui-light-theme.el b/elpa/flucui-themes-20200204.1930/flucui-light-theme.el deleted file mode 100644 index f30e93df..00000000 --- a/elpa/flucui-themes-20200204.1930/flucui-light-theme.el +++ /dev/null @@ -1,294 +0,0 @@ -;;; flucui-light-theme.el --- Custom theme inspired by the FlatUI palette - -;; Copyright (C) 2010--2018 MetroWind. - -;; This program is free software. It comes without any warranty, to -;; the extent permitted by applicable law. You can redistribute it -;; and/or modify it under the terms of the Do What the Fuck You Want -;; to Public License, Version 2, as published by Sam Hocevar. See -;; http://www.wtfpl.net/ for more details. - -;; Author: MetroWind -;; URL: https://github.com/MetroWind/flucui-theme -;; Keywords: lisp -;; Version: 1.0 -;; Package-Requires: ((emacs "24")) - -;;; Commentary: -;; -;; Fluc UI theme is a custom theme for Emacs, inspired by -;; http://flatuicolors.com. It Has both light and dark variants. This -;; file provides light variant. - -;;; Code: - -;; Note: for every face that is customized here, a customization for -;; it should be also provided in the dark version. Otherwise it could -;; be ugly when switching bwteen styles - -(deftheme flucui-light - "Inspired by the color scheme from flatuicolors.com.") - -;; Colors -(let* - ((fui-turquoise "#1abc9c") - (fui-emerald "#2ecc71") - (fui-river "#3498db") - (fui-amethyst "#9b59b6") - (fui-deep-asphalt "#34495e") - (fui-asphalt "#425d78") - (fui-sunflower "#f1c40f") - (fui-carrot "#e67e22") - (fui-alizarin "#e74c3c") - (fui-clouds "#ecf0f1") - (fui-concrete "#95a5a6") - (fui-dark-turquoise "#16a085") - (fui-dark-emerald "#27ae60") - (fui-dark-river "#2980b9") - (fui-dark-amethyst "#8e44ad") - (fui-dark-asphalt "#2c3e50") - (fui-dark-sunflower "#f39c12") - (fui-dark-carrot "#d35400") - (fui-dark-alizarin "#c0392b") - (fui-dark-clouds "#bdc3c7") - (fui-deep-clouds "#dce0e1") - (fui-dark-concrete "#7f8c8d") - - (fui-bg fui-clouds) - (fui-fg fui-asphalt)) - - (custom-theme-set-faces - 'flucui-light - `(default ((t (:background ,fui-bg - :foreground ,fui-fg)))) - `(cursor ((t (:background ,fui-carrot - :foreground ,fui-fg)))) - `(region ((t (:background ,fui-dark-sunflower - :foreground ,fui-fg)))) - `(mode-line ((t (:background ,fui-deep-clouds - :foreground ,fui-fg - :box nil)))) - `(mode-line-buffer-id ((t (:foreground ,fui-fg)))) - `(mode-line-inactive ((t (:background ,fui-dark-clouds - :foreground ,fui-fg)))) - `(fringe ((t (:background ,fui-bg)))) - `(minibuffer-prompt ((t (:slant italic :foreground ,fui-dark-concrete)))) - `(font-lock-builtin-face ((t (:foreground ,fui-dark-asphalt)))) - `(font-lock-comment-face ((t (:slant italic :foreground ,fui-concrete)))) - `(font-lock-constant-face ((t (:slant italic :foreground ,fui-dark-concrete)))) - `(font-lock-function-name-face ((t (:foreground ,fui-amethyst)))) - `(font-lock-keyword-face ((t (:foreground ,fui-dark-asphalt :slant italic)))) - `(font-lock-string-face ((t (:foreground ,fui-dark-turquoise)))) - `(font-lock-type-face ((t (:foreground ,fui-dark-emerald)))) - `(font-lock-variable-name-face ((t (:foreground ,fui-river)))) - `(font-lock-warning-face ((t (:foreground ,fui-dark-carrot)))) - `(isearch ((t (:background ,fui-dark-concrete - :foreground ,fui-fg)))) - `(lazy-highlight ((t (:background ,fui-concrete)))) - `(link ((t (:foreground ,fui-dark-river :underline t)))) - `(link-visited ((t (:foreground ,fui-dark-asphalt :underline t)))) - `(button ((t (:background ,fui-carrot :underline t :foreground nil)))) - `(header-line ((t (:background ,fui-deep-clouds - :foreground ,fui-fg)))) - `(shadow ((t (:foreground ,fui-concrete)))) - `(show-paren-match ((t (:background ,fui-emerald :foreground ,fui-clouds)))) - `(show-paren-mismatch ((t (:background ,fui-alizarin - :foreground ,fui-clouds)))) - `(highlight ((t (:inverse-video nil :background ,fui-deep-clouds)))) - `(hl-line ((t (:inverse-video nil :background ,fui-deep-clouds)))) - `(widget-field ((t (:background ,fui-concrete)))) - - ;; Face for specific prog modes - `(sh-heredoc ((t (:foreground nil :inherit font-lock-string-face)))) - - ;; Dired - `(dired-directory ((t (:foreground ,fui-river)))) - `(dired-symlink ((t (:foreground ,fui-dark-turquoise)))) - `(dired-perm-write ((t (:foreground ,fui-dark-carrot)))) - - ;; Diff - `(diff-added ((t (:foreground ,fui-river)))) - `(diff-removed ((t (:foreground ,fui-alizarin)))) - ;; `(diff-context ((t (:background nil)))) - `(diff-file-header ((t (:bold t :background ,fui-concrete :weight bold)))) - `(diff-header ((t (:background ,fui-deep-clouds :foreground ,fui-fg)))) - - ;; Whitespace - `(whitespace-trailing ((t (:background ,fui-dark-clouds)))) - `(whitespace-line ((t (:background ,fui-dark-clouds :foreground unspecified)))) - - ;; ERC - `(erc-notice-face ((t (:foreground ,fui-dark-river - :weight unspecified)))) - `(erc-header-line ((t (:foreground ,fui-bg :background ,fui-dark-clouds)))) - `(erc-timestamp-face ((t (:foreground ,fui-concrete - :weight unspecified)))) - `(erc-current-nick-face ((t (:foreground ,fui-dark-carrot - :weight unspecified)))) - `(erc-input-face ((t (:foreground ,fui-amethyst)))) - `(erc-prompt-face ((t (:foreground ,fui-dark-concrete - :background nil - :slant italic - :weight unspecified)))) - `(erc-my-nick-face ((t (:foreground ,fui-dark-carrot)))) - `(erc-pal-face ((t (:foreground ,fui-dark-amethyst)))) - - ;; Rainbow delimiters - `(rainbow-delimiters-depth-1-face ((t (:foreground ,fui-fg)))) - `(rainbow-delimiters-depth-2-face ((t (:foreground ,fui-turquoise)))) - `(rainbow-delimiters-depth-3-face ((t (:foreground ,fui-dark-river)))) - `(rainbow-delimiters-depth-4-face ((t (:foreground ,fui-dark-amethyst)))) - `(rainbow-delimiters-depth-5-face ((t (:foreground ,fui-dark-sunflower)))) - `(rainbow-delimiters-depth-6-face ((t (:foreground ,fui-dark-emerald)))) - `(rainbow-delimiters-depth-7-face ((t (:foreground ,fui-dark-concrete)))) - `(rainbow-delimiters-unmatched-face ((t (:foreground ,fui-alizarin)))) - - ;; Magit - `(magit-branch-local ((t (:foreground ,fui-river :background nil)))) - `(magit-branch-remote ((t (:foreground ,fui-dark-emerald :background nil)))) - `(magit-tag ((t (:foreground ,fui-river :background ,fui-bg)))) - `(magit-hash ((t (:foreground ,fui-concrete)))) - `(magit-section-title ((t (:foreground ,fui-dark-emerald :background ,fui-bg)))) - `(magit-section-heading ((t (:background ,fui-bg :foreground ,fui-fg)))) - `(magit-section-highlight ((t (:background ,fui-bg)))) - `(magit-item-highlight ((t (:foreground ,fui-fg :background ,fui-dark-clouds)))) - `(magit-log-author ((t (:foreground ,fui-amethyst)))) - `(magit-diff-added ((t (:inherit diff-added)))) - `(magit-diff-added-highlight ((t (:inherit magit-diff-added)))) - `(magit-diff-removed ((t (:inherit diff-removed)))) - `(magit-diff-removed-highlight ((t (:inherit magit-diff-removed)))) - `(magit-diff-context ((t (:inherit diff-context)))) - `(magit-diff-context-highlight ((t (:inherit magit-diff-context)))) - - ;; Git-gutter-fringe - `(git-gutter-fr:modified ((t (:foreground ,fui-amethyst)))) - `(git-gutter-fr:added ((t (:foreground ,fui-emerald)))) - `(git-gutter-fr:deleted ((t (:foreground ,fui-alizarin)))) - - ;; Company - `(company-preview ((t (:foreground ,fui-fg :background ,fui-sunflower)))) - `(company-preview-common ((t (:foreground ,fui-fg :background ,fui-carrot)))) - `(company-tooltip ((t (:foreground ,fui-fg :background ,fui-dark-clouds)))) - `(company-tooltip-common ((t (:foreground ,fui-dark-carrot)))) - `(company-tooltip-selection ((t (:background ,fui-deep-clouds)))) - `(company-tooltip-common-selection ((t (:foreground ,fui-dark-carrot)))) - `(company-tooltip-annotation ((t (:foreground ,fui-river)))) - `(company-scrollbar-bg ((t (:background ,fui-bg)))) - `(company-scrollbar-fg ((t (:background ,fui-dark-clouds)))) - - ;; Cperl - `(cperl-array-face ((t (:weight bold :inherit font-lock-variable-name-face)))) - `(cperl-hash-face ((t (:weight bold :slant italic :inherit font-lock-variable-name-face)))) - `(cperl-nonoverridable-face ((t (:inherit font-lock-builtin-face)))) - - ;; Powerline - `(mode-line ((t (:box nil)))) - `(powerline-active2 ((t (:foreground ,fui-fg :background ,fui-dark-clouds)))) - `(powerline-active1 ((t (:foreground ,fui-bg :background ,fui-emerald)))) - `(powerline-inactive2 ((t (:foreground ,fui-bg :background ,fui-concrete)))) - `(powerline-inactive1 ((t (:foreground ,fui-fg :background ,fui-dark-clouds)))) - - ;; Smart mode line - `(sml/global ((t (:foreground ,fui-fg)))) - `(sml/charging ((t (:foreground ,fui-emerald)))) - `(sml/discharging ((t (:foreground ,fui-dark-alizarin)))) - `(sml/read-only ((t (:foreground ,fui-dark-emerald)))) - `(sml/filename ((t (:foreground ,fui-river :weight bold)))) - `(sml/prefix ((t (:foreground ,fui-dark-amethyst :weight normal :slant italic)))) - `(sml/modes ((t (:foreground ,fui-fg :weight bold)))) - `(sml/modified ((t (:foreground ,fui-alizarin)))) - `(sml/outside-modified ((t (:foreground ,fui-bg :background ,fui-alizarin)))) - `(sml/position-percentage ((t (:foreground ,fui-amethyst :slant normal)))) - - ;; Helm - `(helm-candidate-number ((t (:foreground ,fui-fg :background nil)))) - `(helm-source-header ((t (:foreground ,fui-bg :background ,fui-river - :weight normal :slant italic)))) - `(helm-selection ((t (:background ,fui-dark-sunflower)))) - `(helm-prefarg ((t (:foreground ,fui-dark-alizarin)))) - `(helm-ff-directory ((t (:foreground ,fui-river)))) - `(helm-ff-executable ((t (:foreground ,fui-dark-emerald)))) - `(helm-ff-invalid-symlink ((t (:foreground ,fui-bg :background ,fui-dark-alizarin)))) - `(helm-ff-symlink ((t (:foreground ,fui-amethyst)))) - `(helm-ff-prefix ((t (:background ,fui-sunflower)))) - `(helm-ff-dotted-directory ((t (:background nil :foreground ,fui-dark-clouds)))) - `(helm-M-x-key ((t (:foreground ,fui-dark-emerald)))) - `(helm-buffer-file ((t (:foreground ,fui-fg)))) - `(helm-buffer-archive ((t (:inherit helm-buffer-file)))) - `(helm-buffer-directory ((t (:foreground ,fui-river :background nil)))) - `(helm-buffer-not-saved ((t (:foreground ,fui-dark-alizarin)))) - `(helm-buffer-modified ((t (:foreground ,fui-carrot)))) - `(helm-buffer-process ((t (:foreground ,fui-dark-emerald)))) - `(helm-buffer-size ((t (:foreground ,fui-concrete)))) - `(helm-ff-file ((t (:inherit default)))) - - ;; TeX - `(font-latex-sedate-face ((t (:foreground ,fui-river)))) - `(font-latex-math-face ((t (:foreground ,fui-dark-turquoise)))) - `(font-latex-script-char-face ((t (:inherit font-latex-math-face)))) - - ;; adoc-mode - `(markup-meta-hide-face ((t (:height 1.0 :foreground ,fui-fg)))) - `(markup-meta-face ((t (:height 1.0 :foreground ,fui-fg :family nil)))) - `(markup-reference-face ((t (:underline nil :foreground ,fui-dark-river)))) - `(markup-gen-face ((t (:foreground ,fui-dark-river)))) - `(markup-passthrough-face ((t (:inherit markup-gen-face)))) - `(markup-replacement-face ((t (:family nil :foreground ,fui-amethyst)))) - `(markup-list-face ((t (:weight bold)))) - `(markup-secondary-text-face ((t (:height 1.0 :foreground ,fui-dark-emerald)))) - `(markup-verbatim-face ((t (:foreground ,fui-dark-concrete)))) - `(markup-typewriter-face ((t (:inherit nil)))) - `(markup-title-0-face ((t (:height 1.2 :inherit markup-gen-face)))) - `(markup-title-1-face ((t (:height 1.0 :inherit markup-gen-face)))) - `(markup-title-2-face ((t (:height 1.0 :inherit markup-gen-face)))) - `(markup-title-3-face ((t (:height 1.0 :inherit markup-gen-face)))) - `(markup-title-4-face ((t (:height 1.0 :inherit markup-gen-face)))) - `(markup-title-5-face ((t (:height 1.0 :inherit markup-gen-face)))) - - ;; Org-mode - `(org-hide ((t (:foreground ,fui-bg)))) - `(org-table ((t (:foreground ,fui-fg)))) - `(org-date ((t (:foreground ,fui-emerald)))) - `(org-done ((t (:weight normal :foreground ,fui-dark-concrete)))) - `(org-todo ((t (:weight normal :foreground ,fui-carrot)))) - `(org-latex-and-related ((t (:foreground ,fui-concrete :italic t)))) - `(org-checkbox ((t (:weight normal :foreground ,fui-dark-concrete)))) - `(org-mode-line-clock ((t (:background nil)))) - `(org-document-title ((t (:weight normal :foreground nil)))) - - ;; Message - `(message-header-name ((t (:foreground ,fui-dark-concrete)))) - `(message-header-other ((t (:foreground ,fui-fg)))) - `(message-header-cc ((t (:inherit message-header-other)))) - `(message-header-newsgroups ((t (:inherit message-header-other)))) - `(message-header-xheader ((t (:inherit message-header-other)))) - `(message-header-subject ((t (:foreground ,fui-dark-emerald)))) - `(message-header-to ((t (:foreground ,fui-dark-river)))) - `(message-mml ((t (:foreground ,fui-concrete)))) - - ;; Notmuch - `(notmuch-search-unread-face ((t (:foreground ,fui-dark-river)))) - `(notmuch-tag-face ((t (:foreground ,fui-dark-emerald)))) - `(notmuch-tree-match-author-face ((t (:foreground ,fui-dark-river)))) - `(notmuch-tree-no-match-face ((t (:foreground ,fui-concrete)))) - `(notmuch-tree-match-tag-face ((t (:inherit notmuch-tree-match-author-face)))) - `(notmuch-tag-unread-face ((t (:foreground ,fui-carrot)))) - `(notmuch-message-summary-face ((t (:foreground ,fui-dark-concrete)))) - - ;; Highlight-indent-guides - `(highlight-indent-guides-odd-face ((t (:background ,fui-deep-clouds)))) - `(highlight-indent-guides-even-face ((t (:background nil)))) - - ;; Telega - `(telega-msg-heading ((t (:background nil :foreground ,fui-dark-emerald :inherit nil)))) - `(telega-msg-inline-reply ((t (:foreground ,fui-concrete :inherit nil)))) - `(telega-entity-type-texturl ((t (:inherit nil :foreground ,fui-dark-river)))) - )) - -(provide-theme 'flucui-light) - -;; Local Variables: -;; no-byte-compile: t -;; End: - -;;; flucui-light-theme.el ends here diff --git a/elpa/flucui-themes-20200204.1930/flucui-themes-autoloads.el b/elpa/flucui-themes-20200204.1930/flucui-themes-autoloads.el deleted file mode 100644 index dd44f397..00000000 --- a/elpa/flucui-themes-20200204.1930/flucui-themes-autoloads.el +++ /dev/null @@ -1,56 +0,0 @@ -;;; flucui-themes-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "flucui-dark-theme" "flucui-dark-theme.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from flucui-dark-theme.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flucui-dark-theme" '("flucui-dark"))) - -;;;*** - -;;;### (autoloads nil "flucui-light-theme" "flucui-light-theme.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from flucui-light-theme.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flucui-light-theme" '("flucui-light"))) - -;;;*** - -;;;### (autoloads nil "flucui-themes" "flucui-themes.el" (0 0 0 0)) -;;; Generated autoloads from flucui-themes.el - -(add-to-list 'custom-theme-load-path (file-name-directory load-file-name)) - -(autoload 'flucui-themes-load-style "flucui-themes" "\ -Load FlucUI theme variant STYLE. - -Argument STYLE can be either 'light or 'dark. - -\(fn STYLE)" t nil) - -(autoload 'flucui-themes-switch-style "flucui-themes" "\ -Toggle between the light and dark style of FlucUI theme. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flucui-themes" '("flucui-themes-current-style"))) - -;;;*** - -;;;### (autoloads nil nil ("flucui-themes-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; flucui-themes-autoloads.el ends here diff --git a/elpa/flucui-themes-20200204.1930/flucui-themes-pkg.el b/elpa/flucui-themes-20200204.1930/flucui-themes-pkg.el deleted file mode 100644 index 271db39f..00000000 --- a/elpa/flucui-themes-20200204.1930/flucui-themes-pkg.el +++ /dev/null @@ -1,12 +0,0 @@ -(define-package "flucui-themes" "20200204.1930" "Custom theme inspired by the Flat UI palette" - '((emacs "24")) - :keywords - '("lisp") - :authors - '(("MetroWind" . "chris.corsair@gmail.com")) - :maintainer - '("MetroWind" . "chris.corsair@gmail.com") - :url "https://github.com/MetroWind/flucui-theme") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/flucui-themes-20200204.1930/flucui-themes.el b/elpa/flucui-themes-20200204.1930/flucui-themes.el deleted file mode 100644 index 140ffacb..00000000 --- a/elpa/flucui-themes-20200204.1930/flucui-themes.el +++ /dev/null @@ -1,60 +0,0 @@ -;;; flucui-themes.el --- Custom theme inspired by the Flat UI palette -;; -;; Copyright (C) 2018 MetroWind. -;; -;; This program is free software. It comes without any warranty, to -;; the extent permitted by applicable law. You can redistribute it -;; and/or modify it under the terms of the Do What the Fuck You Want -;; to Public License, Version 2, as published by Sam Hocevar. See -;; http://www.wtfpl.net/ for more details. - -;; Author: MetroWind -;; URL: https://github.com/MetroWind/flucui-theme -;; Keywords: lisp -;; Version: 1.0 -;; Package-Requires: ((emacs "24")) - -;;; Commentary: -;; -;; Fluc UI theme is a custom theme for Emacs, inspired by -;; http://flatuicolors.com. It Has both light and dark variants. This -;; file provides some utilities to load and switch themes. - -;;; Code: -(defvar flucui-themes-current-style nil) - -;;;###autoload -(add-to-list 'custom-theme-load-path - (file-name-directory load-file-name)) - -;;;###autoload -(defun flucui-themes-load-style (style) - "Load FlucUI theme variant STYLE. - -Argument STYLE can be either 'light or 'dark." - - (interactive) - (cond ((equal style 'light) - (load-theme 'flucui-light t)) - ((equal style 'dark) - (load-theme 'flucui-dark t)) - - (t (error (format "Unknown FlucUI theme style: %S" style))))) - -;;;###autoload -(defun flucui-themes-switch-style () - "Toggle between the light and dark style of FlucUI theme." - (interactive) - (cond ((or (null flucui-themes-current-style) - (equal flucui-themes-current-style 'dark)) - (flucui-themes-load-style 'light) - (setq flucui-themes-current-style 'light)) - ((equal flucui-themes-current-style 'light) - (flucui-themes-load-style 'dark) - (setq flucui-themes-current-style 'dark)) - (t (error (format "Invalid FlucUI current style: %S" - flucui-themes-current-style))))) - -(provide 'flucui-themes) - -;;; FlatUI-theme-utils.el ends here diff --git a/elpa/flucui-themes-20200204.1930/flucui-themes.elc b/elpa/flucui-themes-20200204.1930/flucui-themes.elc deleted file mode 100644 index 72e98390e5332c2228d05c3f47480cf128df50bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmbu8!Ef3y6vjEC>@w}J9rqeG6{H4{q)<98t57E)^;UYAnjVZ}h}FbKwgX~+{hn>Y zh&JugNLC#C(|h0hy_ebj!~9dH(+Os?8O&w1 z3QU2*B=va_!J8gy;H^&(1pS834i&y>Pq)>2i(K=>qHh1`oaAQ$-?e0>ZN zBlLS;U{6n diff --git a/elpa/flycheck-20200405.2310/flycheck-autoloads.el b/elpa/flycheck-20200405.2310/flycheck-autoloads.el deleted file mode 100644 index 1ab2daf9..00000000 --- a/elpa/flycheck-20200405.2310/flycheck-autoloads.el +++ /dev/null @@ -1,273 +0,0 @@ -;;; flycheck-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "flycheck" "flycheck.el" (0 0 0 0)) -;;; Generated autoloads from flycheck.el - -(autoload 'flycheck-manual "flycheck" "\ -Open the Flycheck manual. - -\(fn)" t nil) - -(autoload 'flycheck-mode "flycheck" "\ -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 configuration files for the given syntax CHECKER. -CUSTOM-ARGS are forwarded to `defcustom'. - -FILE-NAME is the initial value of the new variable. If omitted, -the default value is nil. It can be either a string or a list of -strings. - -Use this together with the `config-file' form in the `:command' -argument to `flycheck-define-checker'. - -\(fn SYMBOL CHECKER &optional FILE-NAME &rest CUSTOM-ARGS)" nil t) - -(function-put 'flycheck-def-config-file-var 'lisp-indent-function '3) - -(autoload 'flycheck-def-option-var "flycheck" "\ -Define SYMBOL as option variable with INIT-VALUE for CHECKER. - -SYMBOL is declared as customizable variable using `defcustom', to -provide an option for the given syntax CHECKERS (a checker or a -list of checkers). INIT-VALUE is the initial value of the -variable, and DOCSTRING is its docstring. CUSTOM-ARGS are -forwarded to `defcustom'. - -Use this together with the `option', `option-list' and -`option-flag' forms in the `:command' argument to -`flycheck-define-checker'. - -\(fn SYMBOL INIT-VALUE CHECKERS DOCSTRING &rest CUSTOM-ARGS)" nil t) - -(function-put 'flycheck-def-option-var 'lisp-indent-function '3) - -(function-put 'flycheck-def-option-var 'doc-string-elt '4) - -(autoload 'flycheck-define-checker "flycheck" "\ -Define SYMBOL as command syntax checker with DOCSTRING and PROPERTIES. - -Like `flycheck-define-command-checker', but PROPERTIES must not -be quoted. Also, implicitly define the executable variable for -SYMBOL with `flycheck-def-executable-var'. - -\(fn SYMBOL DOCSTRING &rest PROPERTIES)" nil t) - -(function-put 'flycheck-define-checker 'lisp-indent-function '1) - -(function-put 'flycheck-define-checker 'doc-string-elt '2) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck" '("flycheck-" "list-flycheck-errors" "help-flycheck-checker-d"))) - -;;;*** - -;;;### (autoloads nil "flycheck-buttercup" "flycheck-buttercup.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from flycheck-buttercup.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck-buttercup" '("flycheck-buttercup-format-error-list"))) - -;;;*** - -;;;### (autoloads nil "flycheck-ert" "flycheck-ert.el" (0 0 0 0)) -;;; Generated autoloads from flycheck-ert.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck-ert" '("flycheck-er"))) - -;;;*** - -;;;### (autoloads nil nil ("flycheck-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; flycheck-autoloads.el ends here diff --git a/elpa/flycheck-20200405.2310/flycheck-buttercup.el b/elpa/flycheck-20200405.2310/flycheck-buttercup.el deleted file mode 100644 index 98022659..00000000 --- a/elpa/flycheck-20200405.2310/flycheck-buttercup.el +++ /dev/null @@ -1,157 +0,0 @@ -;;; flycheck-buttercup.el --- Flycheck: Extensions to Buttercup -*- lexical-binding: t; -*- - -;; Copyright (C) 2017 Flycheck contributors -;; Copyright (C) 2016 Sebastian Wiesner and Flycheck contributors - -;; Author: Sebastian Wiesner -;; Maintainer: Clément Pit-Claudel -;; fmdkdd -;; 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 . - -;;; Commentary: - -;; Extensions to Buttercup to write BDD tests for Flycheck. -;; -;; Buttercup is a BDD testing framework for Emacs, see URL -;; `https://github.com/jorgenschaefer/emacs-buttercup/'. Flycheck uses -;; Buttercup extensively for new tests. -;; -;; This library provides extensions to Buttercup to write Specs for Flycheck. -;; -;; * Custom matchers -;; -;; (expect 'foo :to-be-local) - Is `foo' a local variable in the current buffer? - -;;; Code: - -(require 'buttercup) -(require 'flycheck) -(require 'seq) - - -;;; Buttercup helpers - -(defun flycheck-buttercup-format-error-list (errors) - "Format ERRORS into a human-readable string." - (mapconcat (lambda (e) (flycheck-error-format e 'with-file-name)) - errors "\n")) - - -;;; Data matchers - -(buttercup-define-matcher :to-be-empty-string (s) - (let ((s (funcall s))) - (if (equal s "") - (cons t (format "Expected %S not be an empty string" s)) - (cons nil (format "Expected %S to be an empty string" s))))) - -(buttercup-define-matcher :to-match-with-group (re s index match) - (let* ((re (funcall re)) - (s (funcall s)) - (index (funcall index)) - (match (funcall match)) - (matches? (string-match re s)) - (result (and matches? (match-string index s)))) - (if (and matches? (equal result match)) - (cons t (format "Expected %S not to match %S with %S in group %s" - re s match index)) - - (cons nil (format "Expected %S to match %S with %S in group %s, %s" - re s match index - (if matches? - (format "but got %S" result) - "but did not match")))))) - - -;;; Emacs feature matchers - -(buttercup-define-matcher :to-be-live (buffer) - (let ((buffer (get-buffer (funcall buffer)))) - (if (buffer-live-p buffer) - (cons t (format "Expected %S not to be a live buffer, but it is" - buffer)) - (cons nil (format "Expected %S to be a live buffer, but it is not" - buffer))))) - -(buttercup-define-matcher :to-be-visible (buffer) - (let ((buffer (get-buffer (funcall buffer)))) - (cond - ((and buffer (get-buffer-window buffer)) - (cons t (format "Expected %S not to be a visible buffer, but it is" - buffer))) - ((not (bufferp buffer)) - (cons nil - (format "Expected %S to be a visible buffer, but it is not a buffer" - buffer))) - (t (cons - nil - (format "Expected %S to be a visible buffer, but it is not visible" - buffer)))))) - -(buttercup-define-matcher :to-be-local (symbol) - (let ((symbol (funcall symbol))) - (if (local-variable-p symbol) - (cons t (format "Expected %S not to be a local variable, but it is" - symbol)) - (cons nil (format "Expected %S to be a local variable, but it is not" - symbol))))) - -(buttercup-define-matcher :to-contain-match (buffer re) - (let ((buffer (funcall buffer)) - (re (funcall re))) - (if (not (get-buffer buffer)) - (cons nil (format "Expected %S to contain a match of %s, \ -but is not a buffer" buffer re)) - (with-current-buffer buffer - (save-excursion - (goto-char (point-min)) - (if (re-search-forward re nil 'noerror) - (cons t (format "Expected %S to contain a match \ -for %s, but it did not" buffer re)) - (cons nil (format "Expected %S not to contain a match for \ -%s but it did not." buffer re)))))))) - - -;;; Flycheck matchers - -(buttercup-define-matcher :to-be-equal-flycheck-errors (a b) - (let* ((a (funcall a)) - (b (funcall b)) - (a-formatted (flycheck-buttercup-format-error-list a)) - (b-formatted (flycheck-buttercup-format-error-list b))) - (if (equal a b) - (cons t (format "Expected -%s -not to be equal to -%s" a-formatted b-formatted)) - (cons nil (format "Expected -%s -to be equal to -%s" a-formatted b-formatted))))) - -(provide 'flycheck-buttercup) - -;; Disable byte compilation for this library, to prevent package.el choking on a -;; missing `buttercup' library. See -;; https://github.com/flycheck/flycheck/issues/860 - -;; Local Variables: -;; no-byte-compile: t -;; End: - -;;; flycheck-buttercup.el ends here diff --git a/elpa/flycheck-20200405.2310/flycheck-ert.el b/elpa/flycheck-20200405.2310/flycheck-ert.el deleted file mode 100644 index c58b2948..00000000 --- a/elpa/flycheck-20200405.2310/flycheck-ert.el +++ /dev/null @@ -1,495 +0,0 @@ -;;; flycheck-ert.el --- Flycheck: ERT extensions -*- lexical-binding: t; -*- - -;; Copyright (C) 2017-2018 Flycheck contributors -;; Copyright (C) 2013-2016 Sebastian Wiesner and Flycheck contributors - -;; Author: Sebastian Wiesner -;; Maintainer: Clément Pit-Claudel -;; fmdkdd -;; 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 . - -;;; Commentary: - -;; Unit testing library for Flycheck, the modern on-the-fly syntax checking -;; extension for GNU Emacs. - -;; Provide various utility functions and unit test helpers to test Flycheck and -;; Flycheck extensions. - -;;; Code: - -(require 'flycheck) -(require 'ert) -(require 'macroexp) ; For macro utilities - - -;;; Compatibility - -(eval-and-compile - ;; Provide `ert-skip' and friends for Emacs 24.3 - (defconst flycheck-ert-ert-can-skip (fboundp 'ert-skip) - "Whether ERT supports test skipping.") - - (unless (fboundp 'define-error) - ;; from Emacs `subr.el' - (defun define-error (name message &optional parent) - "Define NAME as a new error signal. -MESSAGE is a string that will be output to the echo area if such an error -is signaled without being caught by a `condition-case'. -PARENT is either a signal or a list of signals from which it inherits. -Defaults to `error'." - (unless parent (setq parent 'error)) - (let ((conditions - (if (consp parent) - (apply #'append - (mapcar - (lambda (parent) - (cons parent - (or (get parent 'error-conditions) - (error "Unknown signal `%s'" parent)))) - parent)) - (cons parent (get parent 'error-conditions))))) - (put name 'error-conditions - (delete-dups (copy-sequence (cons name conditions)))) - (when message (put name 'error-message message))))) - - (unless flycheck-ert-ert-can-skip - ;; Fake skipping - - (define-error 'flycheck-ert-skipped "Test skipped") - - (defun ert-skip (data) - (signal 'flycheck-ert-skipped data)) - - (defmacro skip-unless (form) - `(unless (ignore-errors ,form) - (signal 'flycheck-ert-skipped ',form))) - - (defun ert-test-skipped-p (result) - (and (ert-test-failed-p result) - (eq (car (ert-test-failed-condition result)) - 'flycheck-ert-skipped))))) - - -;;; Internal variables - -(defvar flycheck-ert--resource-directory nil - "The directory to get resources from in this test suite.") - - -;;; Resource management macros - -(defmacro flycheck-ert-with-temp-buffer (&rest body) - "Eval BODY within a temporary buffer. - -Like `with-temp-buffer', but resets the modification state of the -temporary buffer to make sure that it is properly killed even if -it has a backing file and is modified." - (declare (indent 0) (debug t)) - `(with-temp-buffer - (unwind-protect - ,(macroexp-progn body) - ;; Reset modification state of the buffer, and unlink it from its backing - ;; file, if any, because Emacs refuses to kill modified buffers with - ;; backing files, even if they are temporary. - (set-buffer-modified-p nil) - (set-visited-file-name nil 'no-query)))) - -(defmacro flycheck-ert-with-file-buffer (file-name &rest body) - "Create a buffer from FILE-NAME and eval BODY. - -BODY is evaluated with `current-buffer' being a buffer with the -contents FILE-NAME." - (declare (indent 1) (debug t)) - `(let ((file-name ,file-name)) - (unless (file-exists-p file-name) - (error "%s does not exist" file-name)) - (flycheck-ert-with-temp-buffer - (insert-file-contents file-name 'visit) - (set-visited-file-name file-name 'no-query) - (cd (file-name-directory file-name)) - ;; Mark the buffer as not modified, because we just loaded the file up to - ;; now. - (set-buffer-modified-p nil) - ,@body))) - -(defmacro flycheck-ert-with-help-buffer (&rest body) - "Execute BODY and kill the help buffer afterwards. - -Use this macro to test functions that create a Help buffer." - (declare (indent 0)) - `(unwind-protect - ,(macroexp-progn body) - (when (buffer-live-p (get-buffer (help-buffer))) - (kill-buffer (help-buffer))))) - -(defmacro flycheck-ert-with-global-mode (&rest body) - "Execute BODY with Global Flycheck Mode enabled. - -After BODY, restore the old state of Global Flycheck Mode." - (declare (indent 0)) - `(let ((old-state global-flycheck-mode)) - (unwind-protect - (progn - (global-flycheck-mode 1) - ,@body) - (global-flycheck-mode (if old-state 1 -1))))) - -(defmacro flycheck-ert-with-env (env &rest body) - "Add ENV to `process-environment' in BODY. - -Execute BODY with a `process-environment' which contains all -variables from ENV added. - -ENV is an alist, where each cons cell `(VAR . VALUE)' is a -environment variable VAR to be added to `process-environment' -with VALUE." - (declare (indent 1)) - `(let ((process-environment (copy-sequence process-environment))) - (pcase-dolist (`(,var . ,value) ,env) - (setenv var value)) - ,@body)) - - -;;; Test resources -(defun flycheck-ert-resource-filename (resource-file) - "Determine the absolute file name of a RESOURCE-FILE. - -Relative file names are expanded against -`flycheck-ert--resource-directory'." - (expand-file-name resource-file flycheck-ert--resource-directory)) - -(defmacro flycheck-ert-with-resource-buffer (resource-file &rest body) - "Create a temp buffer from a RESOURCE-FILE and execute BODY. - -The absolute file name of RESOURCE-FILE is determined with -`flycheck-ert-resource-filename'." - (declare (indent 1)) - `(flycheck-ert-with-file-buffer - (flycheck-ert-resource-filename ,resource-file) - ,@body)) - - -;;; Test suite initialization - -(defun flycheck-ert-initialize (resource-dir) - "Initialize a test suite with RESOURCE-DIR. - -RESOURCE-DIR is the directory, `flycheck-ert-resource-filename' -should use to lookup resource files." - (when flycheck-ert--resource-directory - (error "Test suite already initialized")) - (let ((tests (ert-select-tests t t))) - ;; Select all tests - (unless tests - (error "No tests defined. \ -Call `flycheck-ert-initialize' after defining all tests!")) - - (setq flycheck-ert--resource-directory resource-dir) - - ;; Emacs 24.3 don't support skipped tests, so we add poor man's test - ;; skipping: We mark skipped tests as expected failures by adjusting the - ;; expected result of all test cases. Not particularly pretty, but works :) - (unless flycheck-ert-ert-can-skip - (dolist (test tests) - (let ((result (ert-test-expected-result-type test))) - (setf (ert-test-expected-result-type test) - `(or ,result (satisfies ert-test-skipped-p)))))))) - - -;;; Test case definitions -(defmacro flycheck-ert-def-checker-test (checker language name - &rest keys-and-body) - "Define a test case for a syntax CHECKER for LANGUAGE. - -CHECKER is a symbol or a list of symbols denoting syntax checkers -being tested by the test. The test case is skipped, if any of -these checkers cannot be used. LANGUAGE is a symbol or a list of -symbols denoting the programming languages supported by the -syntax checkers. This is currently only used for tagging the -test appropriately. - -NAME is a symbol denoting the local name of the test. The test -itself is ultimately named -`flycheck-define-checker/CHECKER/NAME'. If CHECKER is a list, -the first checker in the list is used for naming the test. - -Optionally, the keyword arguments `:tags' and `:expected-result' -may be given. They have the same meaning as in `ert-deftest.', -and are added to the tags and result expectations set up by this -macro. - -The remaining forms KEYS-AND-BODY denote the body of the test -case, including assertions and setup code." - (declare (indent 3)) - (unless checker - (error "No syntax checkers specified")) - (unless language - (error "No languages specified")) - (let* ((checkers (if (symbolp checker) (list checker) checker)) - (checker (car checkers)) - (languages (if (symbolp language) (list language) language)) - (language-tags (mapcar (lambda (l) (intern (format "language-%s" l))) - languages)) - (checker-tags (mapcar (lambda (c) (intern (format "checker-%s" c))) - checkers)) - (local-name (or name 'default)) - (full-name (intern (format "flycheck-define-checker/%s/%s" - checker local-name))) - (keys-and-body (ert--parse-keys-and-body keys-and-body)) - (body (cadr keys-and-body)) - (keys (car keys-and-body)) - (default-tags '(syntax-checker external-tool))) - `(ert-deftest ,full-name () - :expected-result ,(or (plist-get keys :expected-result) :passed) - :tags (append ',(append default-tags language-tags checker-tags) - ,(plist-get keys :tags)) - ,@(mapcar (lambda (c) - `(skip-unless - ;; Ignore non-command checkers - (or (not (flycheck-checker-get ',c 'command)) - (executable-find (flycheck-checker-executable ',c))))) - checkers) - ,@body))) - - -;;; Test case results - -(defun flycheck-ert-syntax-check-timed-out-p (result) - "Whether RESULT denotes a timed-out test. - -RESULT is an ERT test result object." - (and (ert-test-failed-p result) - (eq (car (ert-test-failed-condition result)) - 'flycheck-ert-syntax-check-timed-out))) - - -;;; Syntax checking in tests - -(defvar-local flycheck-ert-syntax-checker-finished nil - "Non-nil if the current checker has finished.") - -(add-hook 'flycheck-after-syntax-check-hook - (lambda () (setq flycheck-ert-syntax-checker-finished t))) - -(defconst flycheck-ert-checker-wait-time 10 - "Time to wait until a checker is finished in seconds. - -After this time has elapsed, the checker is considered to have -failed, and the test aborted with failure.") - -(define-error 'flycheck-ert-syntax-check-timed-out "Syntax check timed out.") - -(defun flycheck-ert-wait-for-syntax-checker () - "Wait until the syntax check in the current buffer is finished." - (let ((starttime (float-time))) - (while (and (not flycheck-ert-syntax-checker-finished) - (< (- (float-time) starttime) flycheck-ert-checker-wait-time)) - (accept-process-output nil 0.02)) - (unless (< (- (float-time) starttime) flycheck-ert-checker-wait-time) - (flycheck-stop) - (signal 'flycheck-ert-syntax-check-timed-out nil))) - (setq flycheck-ert-syntax-checker-finished nil)) - -(defun flycheck-ert-buffer-sync () - "Like `flycheck-buffer', but synchronously." - (setq flycheck-ert-syntax-checker-finished nil) - (should (not (flycheck-running-p))) - (flycheck-mode) ;; This will only start a deferred check, - (should (flycheck-get-checker-for-buffer)) - (flycheck-buffer) ;; …so we need an explicit manual check - ;; After starting the check, the checker should either be running now, or - ;; already be finished (if it was fast). - (should (or flycheck-current-syntax-check - flycheck-ert-syntax-checker-finished)) - ;; Also there should be no deferred check pending anymore - (should-not (flycheck-deferred-check-p)) - (flycheck-ert-wait-for-syntax-checker)) - -(defun flycheck-ert-ensure-clear () - "Clear the current buffer. - -Raise an assertion error if the buffer is not clear afterwards." - (flycheck-clear) - (should (not flycheck-current-errors)) - (should (not (-any? (lambda (ov) (overlay-get ov 'flycheck-overlay)) - (overlays-in (point-min) (point-max)))))) - - -;;; Test assertions - -(defun flycheck-error-without-group (err) - "Return a copy ERR with the `group' property set to nil." - (let ((copy (copy-flycheck-error err))) - (setf (flycheck-error-group copy) nil) - copy)) - -(defun flycheck-ert-should-overlay (error) - "Test that ERROR has a proper overlay in the current buffer. - -ERROR is a Flycheck error object." - (let* ((overlay (-first (lambda (ov) - (equal (flycheck-error-without-group - (overlay-get ov 'flycheck-error)) - (flycheck-error-without-group error))) - (flycheck-overlays-in 0 (+ 1 (buffer-size))))) - (region - ;; Overlays of errors from other files are on the first line - (if (flycheck-relevant-error-other-file-p error) - (cons (point-min) - (save-excursion (goto-char (point-min)) (point-at-eol))) - (flycheck-error-region-for-mode error 'symbols))) - (level (flycheck-error-level error)) - (category (flycheck-error-level-overlay-category level)) - (face (get category 'face)) - (fringe-bitmap (flycheck-error-level-fringe-bitmap level)) - (fringe-face (flycheck-error-level-fringe-face level)) - (fringe-icon (list 'left-fringe fringe-bitmap fringe-face))) - (should overlay) - (should (overlay-get overlay 'flycheck-overlay)) - (should (= (overlay-start overlay) (car region))) - (should (= (overlay-end overlay) (cdr region))) - (should (eq (overlay-get overlay 'face) face)) - (should (equal (get-char-property 0 'display - (overlay-get overlay 'before-string)) - fringe-icon)) - (should (eq (overlay-get overlay 'category) category)) - (should (equal (flycheck-error-without-group (overlay-get overlay - 'flycheck-error)) - (flycheck-error-without-group error))))) - -(defun flycheck-ert-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-in-buffer (&rest errors) - "Test a syntax check in BUFFER, expecting ERRORS. - -This is like `flycheck-ert-should-syntax-check', but with a -buffer in the right mode instead of a file." - ;; Load safe file-local variables because some tests depend on them - (let ((enable-local-variables :safe) - ;; Disable all hooks at this place, to prevent 3rd party packages - ;; from interfering - (hack-local-variables-hook)) - (hack-local-variables)) - ;; Configure config file locating for unit tests - (let ((process-hook-called 0) - (suspicious nil)) - (add-hook 'flycheck-process-error-functions - (lambda (_err) - (setq process-hook-called (1+ process-hook-called)) - nil) - nil :local) - (add-hook 'flycheck-status-changed-functions - (lambda (status) - (when (eq status 'suspicious) - (setq suspicious t))) - nil :local) - (flycheck-ert-buffer-sync) - (when suspicious - (signal 'flycheck-ert-suspicious-checker nil)) - (apply #'flycheck-ert-should-errors errors) - (should (= process-hook-called (length errors)))) - (flycheck-ert-ensure-clear)) - -(defun flycheck-ert-should-syntax-check (resource-file modes &rest errors) - "Test a syntax check in RESOURCE-FILE with MODES. - -RESOURCE-FILE is the file to check. MODES is a single major mode -symbol or a list thereof, specifying the major modes to syntax -check with. If more than one major mode is specified, the test -is run for each mode separately, so if you give three major -modes, the entire test will run three times. ERRORS is the list -of expected errors, as in `flycheck-ert-should-errors'. If -omitted, the syntax check must not emit any errors. The errors -are cleared after each test. - -The syntax checker is selected via standard syntax checker -selection. To test a specific checker, you need to set -`flycheck-checker' or `flycheck-disabled-checkers' accordingly -before using this predicate, depending on whether you want to use -manual or automatic checker selection. - -During the syntax check, configuration files of syntax checkers -are also searched in the `config-files' sub-directory of the -resource directory." - (when (symbolp modes) - (setq modes (list modes))) - (dolist (mode modes) - (unless (fboundp mode) - (ert-skip (format "%S missing" mode))) - (flycheck-ert-with-resource-buffer resource-file - (funcall mode) - (apply #'flycheck-ert-should-syntax-check-in-buffer errors)))) - -(defun flycheck-ert-at-nth-error (n) - "Determine whether point is at the N'th Flycheck error. - -Return non-nil if the point is at the N'th Flycheck error in the -current buffer. Otherwise return nil." - (let* ((error (nth (1- n) flycheck-current-errors)) - (mode flycheck-highlighting-mode) - (region (flycheck-error-region-for-mode error mode))) - (and (member error (flycheck-overlay-errors-at (point))) - (= (point) (car region))))) - -(defun flycheck-ert-explain--at-nth-error (n) - "Explain a failed at-nth-error predicate at N." - (let ((errors (flycheck-overlay-errors-at (point)))) - (if (null errors) - (format "Expected to be at error %s, but no error at point %s" - n (point)) - (let ((pos (cl-position (car errors) flycheck-current-errors))) - (format "Expected to be at 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 diff --git a/elpa/flycheck-20200405.2310/flycheck-ert.elc b/elpa/flycheck-20200405.2310/flycheck-ert.elc deleted file mode 100644 index 3034725e8136691c9e3c3163510460bca35612ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24583 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 diff --git a/elpa/flycheck-20200405.2310/flycheck-pkg.el b/elpa/flycheck-20200405.2310/flycheck-pkg.el deleted file mode 100644 index bbeff654..00000000 --- a/elpa/flycheck-20200405.2310/flycheck-pkg.el +++ /dev/null @@ -1,16 +0,0 @@ -(define-package "flycheck" "20200405.2310" "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: diff --git a/elpa/flycheck-20200405.2310/flycheck.el b/elpa/flycheck-20200405.2310/flycheck.el deleted file mode 100644 index 1e1d2b0a..00000000 --- a/elpa/flycheck-20200405.2310/flycheck.el +++ /dev/null @@ -1,11791 +0,0 @@ -;;; flycheck.el --- On-the-fly syntax checking -*- lexical-binding: t; -*- - -;; Copyright (C) 2017-2019 Flycheck contributors -;; Copyright (C) 2012-2016 Sebastian Wiesner and Flycheck contributors -;; Copyright (C) 2013, 2014 Free Software Foundation, Inc. -;; -;; Author: Sebastian Wiesner -;; Maintainer: Clément Pit-Claudel -;; fmdkdd -;; URL: http://www.flycheck.org -;; Keywords: convenience, languages, tools -;; Version: 32-cvs -;; Package-Requires: ((dash "2.12.1") (pkg-info "0.4") (let-alist "1.0.4") (seq "1.11") (emacs "24.3")) - -;; This file is not part of GNU Emacs. - -;; This program is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; On-the-fly syntax checking for GNU Emacs 24. -;; -;; Flycheck is a modern on-the-fly syntax checking extension for GNU Emacs, -;; intended as replacement for the older Flymake extension which is part of GNU -;; Emacs. -;; -;; Flycheck automatically checks buffers for errors while you type, and reports -;; warnings and errors directly in the buffer and in an optional IDE-like error -;; list. -;; -;; It comes with a rich interface for custom syntax checkers and other -;; extensions, and has already many 3rd party extensions adding new features. -;; -;; Please read the online manual at http://www.flycheck.org for more -;; information. You can open the manual directly from Emacs with `M-x -;; flycheck-manual'. -;; -;; # Setup -;; -;; Flycheck works best on Unix systems. It does not officially support Windows, -;; but tries to maintain Windows compatibility and should generally work fine on -;; Windows, too. -;; -;; To enable Flycheck add the following to your init file: -;; -;; (add-hook 'after-init-hook #'global-flycheck-mode) -;; -;; Flycheck will then automatically check buffers in supported languages, as -;; long as all necessary tools are present. Use `flycheck-verify-setup' to -;; troubleshoot your Flycheck setup. - -;;; Code: - -(eval-when-compile - (require 'let-alist) ; `let-alist' - (require 'compile) ; Compile Mode integration - (require 'jka-compr) ; To inhibit compression of temp files - (require 'pcase) ; `pcase-dolist' (`pcase' itself is autoloaded) - ) - -(require 'dash) - -(require 'seq) ; Sequence functions -(require 'subr-x nil 'no-error) ; Additional utilities, Emacs 24.4 and upwards -(require 'cl-lib) ; `cl-defstruct' and CL utilities -(require 'tabulated-list) ; To list errors -(require 'easymenu) ; Flycheck Mode menu definition -(require 'rx) ; Regexp fanciness in `flycheck-define-checker' -(require 'help-mode) ; `define-button-type' -(require 'find-func) ; `find-function-regexp-alist' -(require 'json) ; `flycheck-parse-tslint' -(require 'ansi-color) ; `flycheck-parse-with-patterns-without-color' - - -;; Declare a bunch of dynamic variables that we need from other modes -(defvar sh-shell) ; For shell script checker predicates -(defvar ess-language) ; For r-lintr predicate - -;; Tell the byte compiler about autoloaded functions from packages -(declare-function pkg-info-version-info "pkg-info" (package)) - - -;;; Compatibility -(eval-and-compile - (unless (fboundp 'string-suffix-p) - ;; TODO: Remove when dropping support for Emacs 24.3 and earlier - (defun string-suffix-p (suffix string &optional ignore-case) - "Return non-nil if SUFFIX is a suffix of STRING. -If IGNORE-CASE is non-nil, the comparison is done without paying -attention to case differences." - (let ((start-pos (- (length string) (length suffix)))) - (and (>= start-pos 0) - (eq t (compare-strings suffix nil nil - string start-pos nil ignore-case)))))) - - ;; TODO: Remove when dropping support for Emacs 24.3 and earlier - (unless (featurep 'subr-x) - ;; `subr-x' function for Emacs 24.3 and below - (defsubst string-join (strings &optional separator) - "Join all STRINGS using SEPARATOR." - (mapconcat 'identity strings separator)) - - (defsubst string-trim-left (string) - "Remove leading whitespace from STRING." - (if (string-match "\\`[ \t\n\r]+" string) - (replace-match "" t t string) - string)) - - (defsubst string-trim-right (string) - "Remove trailing whitespace from STRING." - (if (string-match "[ \t\n\r]+\\'" string) - (replace-match "" t t string) - string)) - - (defsubst string-trim (string) - "Remove leading and trailing whitespace from STRING." - (string-trim-left (string-trim-right string))) - - (defsubst string-empty-p (string) - "Check whether STRING is empty." - (string= string "")))) - - -;;; Customization -(defgroup flycheck nil - "Modern on-the-fly syntax checking for GNU Emacs." - :prefix "flycheck-" - :group 'tools - :link '(url-link :tag "Website" "http://www.flycheck.org") - :link '(url-link :tag "Github" "https://github.com/flycheck/flycheck")) - -(defgroup flycheck-config-files nil - "Configuration files for on-the-fly syntax checkers." - :prefix "flycheck-" - :group 'flycheck) - -(defgroup flycheck-options nil - "Options for on-the-fly syntax checkers." - :prefix "flycheck-" - :group 'flycheck) - -(defgroup flycheck-executables nil - "Executables of syntax checkers." - :prefix "flycheck-" - :group 'flycheck) - -(defgroup flycheck-faces nil - "Faces used by on-the-fly syntax checking." - :prefix "flycheck-" - :group 'flycheck) - -(defcustom flycheck-checkers - '(ada-gnat - asciidoctor - asciidoc - awk-gawk - bazel-buildifier - c/c++-clang - c/c++-gcc - c/c++-cppcheck - cfengine - chef-foodcritic - coffee - coffee-coffeelint - coq - css-csslint - css-stylelint - cuda-nvcc - cwl - d-dmd - dockerfile-hadolint - elixir-credo - emacs-lisp - emacs-lisp-checkdoc - ember-template - erlang-rebar3 - erlang - eruby-erubis - eruby-ruumba - fortran-gfortran - go-gofmt - go-golint - go-vet - go-build - go-test - go-errcheck - go-unconvert - go-staticcheck - groovy - haml - handlebars - haskell-stack-ghc - haskell-ghc - haskell-hlint - html-tidy - javascript-eslint - javascript-jshint - javascript-standard - json-jsonlint - json-python-json - json-jq - jsonnet - less - less-stylelint - llvm-llc - lua-luacheck - lua - markdown-markdownlint-cli - markdown-mdl - nix - nix-linter - opam - perl - perl-perlcritic - php - php-phpmd - php-phpcs - processing - proselint - protobuf-protoc - protobuf-prototool - pug - puppet-parser - puppet-lint - python-flake8 - python-pylint - python-pycompile - python-mypy - r-lintr - racket - rpm-rpmlint - rst-sphinx - rst - ruby-rubocop - ruby-standard - ruby-reek - ruby-rubylint - ruby - ruby-jruby - rust-cargo - rust - rust-clippy - scala - scala-scalastyle - scheme-chicken - scss-lint - scss-stylelint - sass/scss-sass-lint - sass - scss - sh-bash - sh-posix-dash - sh-posix-bash - sh-zsh - sh-shellcheck - slim - slim-lint - sql-sqlint - systemd-analyze - tcl-nagelfar - terraform - terraform-tflint - tex-chktex - tex-lacheck - texinfo - textlint - typescript-tslint - verilog-verilator - vhdl-ghdl - xml-xmlstarlet - xml-xmllint - yaml-jsyaml - yaml-ruby - yaml-yamllint) - "Syntax checkers available for automatic selection. - -A list of Flycheck syntax checkers to choose from when syntax -checking a buffer. Flycheck will automatically select a suitable -syntax checker from this list, unless `flycheck-checker' is set, -either directly or with `flycheck-select-checker'. - -You should not need to change this variable normally. In order -to disable syntax checkers, please use -`flycheck-disabled-checkers'. This variable is intended for 3rd -party extensions to tell Flycheck about new syntax checkers. - -Syntax checkers in this list must be defined with -`flycheck-define-checker'." - :group 'flycheck - :type '(repeat (symbol :tag "Checker")) - :risky t) - -(defcustom flycheck-disabled-checkers nil - "Syntax checkers excluded from automatic selection. - -A list of Flycheck syntax checkers to exclude from automatic -selection. Flycheck will never automatically select a syntax -checker in this list, regardless of the value of -`flycheck-checkers'. - -However, syntax checkers in this list are still available for -manual selection with `flycheck-select-checker'. - -Use this variable to disable syntax checkers, instead of removing -the syntax checkers from `flycheck-checkers'. You may also use -this option as a file or directory local variable to disable -specific checkers in individual files and directories -respectively." - :group 'flycheck - :type '(repeat (symbol :tag "Checker")) - :package-version '(flycheck . "0.16") - :safe #'flycheck-symbol-list-p) -(make-variable-buffer-local 'flycheck-disabled-checkers) - -(defvar-local flycheck--automatically-disabled-checkers nil - "List of syntax checkers automatically disabled for this buffer. - -A checker can be automatically disabled in two cases: - -1. Its `:enabled' predicate returned false. -2. It returned too many errors (see `flycheck-checker-error-threshold'). - -To trigger a reverification from Emacs Lisp code, do not modify -this variable: use `flycheck-reset-enabled-checker'.") - -(defvar-local flycheck-checker nil - "Syntax checker to use for the current buffer. - -If unset or nil, automatically select a suitable syntax checker -from `flycheck-checkers' on every syntax check. - -If set to a syntax checker only use this syntax checker and never -select one from `flycheck-checkers' automatically. The syntax -checker is used regardless of whether it is contained in -`flycheck-checkers' or `flycheck-disabled-checkers'. If the -syntax checker is unusable in the current buffer an error is -signaled. - -A syntax checker assigned to this variable must be defined with -`flycheck-define-checker'. - -Use the command `flycheck-select-checker' to select a syntax -checker for the current buffer, or set this variable as file -local variable to always use a specific syntax checker for a -file. See Info Node `(emacs)Specifying File Variables' for more -information about file variables.") -(put 'flycheck-checker 'safe-local-variable 'flycheck-registered-checker-p) - -(defcustom flycheck-locate-config-file-functions nil - "Functions to locate syntax checker configuration files. - -Each function in this hook must accept two arguments: The value -of the configuration file variable, and the syntax checker -symbol. It must return either a string with an absolute path to -the configuration file, or nil, if it cannot locate the -configuration file. - -The functions in this hook are called in order of appearance, until a -function returns non-nil. The configuration file returned by that -function is then given to the syntax checker if it exists. - -This variable is an abnormal hook. See Info -node `(elisp)Hooks'." - :group 'flycheck - :type 'hook - :risky t) - -(defcustom flycheck-checker-error-threshold 400 - "Maximum errors allowed per syntax checker. - -The value of this variable is either an integer denoting the -maximum number of errors per syntax checker and buffer, or nil to -not limit the errors reported from a syntax checker. - -If this variable is a number and a syntax checker reports more -errors than the value of this variable, its errors are not -discarded, and not highlighted in the buffer or available in the -error list. The affected syntax checker is also disabled for -future syntax checks of the buffer." - :group 'flycheck - :type '(choice (const :tag "Do not limit reported errors" nil) - (integer :tag "Maximum number of errors")) - :risky t - :package-version '(flycheck . "0.22")) - -(defcustom flycheck-process-error-functions nil - "Functions to process errors. - -Each function in this hook must accept a single argument: A -Flycheck error to process. - -All functions in this hook are called in order of appearance, -until a function returns non-nil. Thus, a function in this hook -may return nil, to allow for further processing of the error, or -any non-nil value, to indicate that the error was fully processed -and inhibit any further processing. - -The functions are called for each newly parsed error immediately -after the corresponding syntax checker finished. At this stage, -the overlays from the previous syntax checks are still present, -and there may be further syntax checkers in the chain. - -This variable is an abnormal hook. See Info -node `(elisp)Hooks'." - :group 'flycheck - :type 'hook - :package-version '(flycheck . "0.13") - :risky t) - -(defcustom flycheck-display-errors-delay 0.9 - "Delay in seconds before displaying errors at point. - -Use floating point numbers to express fractions of seconds." - :group 'flycheck - :type 'number - :package-version '(flycheck . "0.15") - :safe #'numberp) - -(defcustom flycheck-display-errors-function #'flycheck-display-error-messages - "Function to display error messages. - -If set to a function, call the function with the list of errors -to display as single argument. Each error is an instance of the -`flycheck-error' struct. - -If set to nil, do not display errors at all." - :group 'flycheck - :type '(choice (const :tag "Display error messages" - flycheck-display-error-messages) - (const :tag "Display error messages only if no error list" - flycheck-display-error-messages-unless-error-list) - (function :tag "Error display function")) - :package-version '(flycheck . "0.13") - :risky t) - -(defcustom flycheck-help-echo-function #'flycheck-help-echo-all-error-messages - "Function to compute the contents of the error tooltips. - -If set to a function, call the function with the list of errors -to display as single argument. Each error is an instance of the -`flycheck-error' struct. The function is used to set the -help-echo property of flycheck error overlays. It should return -a string, which is displayed when the user hovers over an error -or presses \\[display-local-help]. - -If set to nil, do not show error tooltips." - :group 'flycheck - :type '(choice (const :tag "Concatenate error messages to form a tooltip" - flycheck-help-echo-all-error-messages) - (function :tag "Help echo function")) - :package-version '(flycheck . "0.25") - :risky t) - -(defcustom flycheck-command-wrapper-function #'identity - "Function to modify checker commands before execution. - -The value of this option is a function which is given a list -containing the full command of a syntax checker after -substitution through `flycheck-substitute-argument' but before -execution. The function may return a new command for Flycheck to -execute. - -The default value is `identity' which does not change the -command. You may provide your own function to run Flycheck -commands through `bundle exec', `nix-shell' or similar wrappers." - :group 'flycheck - :type '(choice (const :tag "Do not modify commands" identity) - (function :tag "Modify command with a custom function")) - :package-version '(flycheck . "0.25") - :risky t) - -(defcustom flycheck-executable-find #'flycheck-default-executable-find - "Function to search for executables. - -The value of this option is a function which is given the name or -path of an executable and shall return the full path to the -executable, or nil if the executable does not exit. - -The default is `flycheck-default-executable-find', which searches -variable `exec-path' when given a command name, and resolves -paths to absolute ones. You can customize this option to search -for checkers in other environments such as bundle or NixOS -sandboxes." - :group 'flycheck - :type '(choice - (const :tag "Search executables in `exec-path'" - flycheck-default-executable-find) - (function :tag "Search executables with a custom function")) - :package-version '(flycheck . "32") - :risky t) - -(defun flycheck-default-executable-find (executable) - "Resolve EXECUTABLE to a full path. - -Like `executable-find', but supports relative paths. - -Attempts invoking `executable-find' first; if that returns nil, -and EXECUTABLE contains a directory component, expands to a full -path and tries invoking `executable-find' again." - ;; file-name-directory returns non-nil iff the given path has a - ;; directory component. - (or - (executable-find executable) - (when (file-name-directory executable) - (executable-find (expand-file-name executable))))) - -(defcustom flycheck-indication-mode 'left-fringe - "The indication mode for Flycheck errors and warnings. - -This variable controls how Flycheck indicates errors in buffers. -May either be `left-fringe', `right-fringe', or nil. - -If set to `left-fringe' or `right-fringe', indicate errors and -warnings via icons in the left and right fringe respectively. - -If set to nil, do not indicate errors and warnings, but just -highlight them according to `flycheck-highlighting-mode'." - :group 'flycheck - :type '(choice (const :tag "Indicate in the left fringe" left-fringe) - (const :tag "Indicate in the right fringe" right-fringe) - (const :tag "Do not indicate" nil)) - :safe #'symbolp) - -(defcustom flycheck-highlighting-mode 'symbols - "The highlighting mode for Flycheck errors and warnings. - -The highlighting mode controls how Flycheck highlights errors in -buffers when a checker only reports the starting position of an -error. The following modes are known: - -`columns' - Highlight a single character. If the error does not have a column, - highlight the whole line. - -`symbols' - Highlight a full symbol if there is any, otherwise behave like `columns'. - This is the default. - -`sexps' - Highlight a full expression, if there is any, otherwise behave like - `columns'. Note that this mode can be *very* slow in some major modes. - -`lines' - Highlight the whole line. - -nil - Do not highlight errors at all. However, errors will still - be reported in the mode line and in error message popups, - and indicated according to `flycheck-indication-mode'." - :group 'flycheck - :type '(choice (const :tag "Highlight columns only" columns) - (const :tag "Highlight symbols" symbols) - (const :tag "Highlight expressions" sexps) - (const :tag "Highlight whole lines" lines) - (const :tag "Do not highlight errors" nil)) - :package-version '(flycheck . "0.14") - :safe #'symbolp) - -(defcustom flycheck-check-syntax-automatically '(save - idle-change - new-line - mode-enabled) - "When Flycheck should check syntax automatically. - -This variable is a list of events that may trigger syntax checks. -The following events are known: - -`save' - Check syntax immediately after the buffer was saved. - -`idle-change' - Check syntax a short time (see `flycheck-idle-change-delay') - after the last change to the buffer. - -`idle-buffer-switch' - Check syntax a short time (see `flycheck-idle-buffer-switch-delay') - after the user switches to a buffer. - -`new-line' - Check syntax immediately after a new line was inserted into - the buffer. - -`mode-enabled' - Check syntax immediately when variable `flycheck-mode' is - non-nil. - -Flycheck performs a syntax checks only on events, which are -contained in this list. For instance, if the value of this -variable is `(mode-enabled save)', Flycheck will only check if -the mode is enabled or the buffer was saved, but never after -changes to the buffer contents. - -If nil, never check syntax automatically. In this case, use -`flycheck-buffer' to start a syntax check manually." - :group 'flycheck - :type '(set (const :tag "After the buffer was saved" save) - (const :tag "After the buffer was changed and idle" idle-change) - (const - :tag "After switching the current buffer" idle-buffer-switch) - (const :tag "After a new line was inserted" new-line) - (const :tag "After `flycheck-mode' was enabled" mode-enabled)) - :package-version '(flycheck . "0.12") - :safe #'flycheck-symbol-list-p) - -(defcustom flycheck-idle-change-delay 0.5 - "How many seconds to wait after a change before checking syntax. - -After the buffer was changed, Flycheck will wait as many seconds -as the value of this variable before starting a syntax check. If -the buffer is modified during this time, Flycheck will wait -again. - -This variable has no effect, if `idle-change' is not contained in -`flycheck-check-syntax-automatically'." - :group 'flycheck - :type 'number - :package-version '(flycheck . "0.13") - :safe #'numberp) - -(defcustom flycheck-idle-buffer-switch-delay 0.5 - "How many seconds to wait after switching buffers before checking syntax. - -After the user switches to a new buffer, Flycheck will wait as -many seconds as the value of this variable before starting a -syntax check. If the user switches to another buffer during this -time, whether a syntax check is still performed depends on the -value of `flycheck-buffer-switch-check-intermediate-buffers'. - -This variable has no effect if `idle-buffer-switch' is not -contained in `flycheck-check-syntax-automatically'." - :group 'flycheck - :type 'number - :package-version '(flycheck . "32") - :safe #'numberp) - -(defcustom flycheck-buffer-switch-check-intermediate-buffers nil - "Whether to check syntax in a buffer you only visit briefly. - -If nil, then when you switch to a buffer but switch to another -buffer before the syntax check is performed, then the check is -canceled. If non-nil, then syntax checks due to switching -buffers are always performed. This only affects buffer switches -that happen less than `flycheck-idle-buffer-switch-delay' seconds -apart. - -This variable has no effect if `idle-buffer-switch' is not -contained in `flycheck-check-syntax-automatically'." - :group 'flycheck - :type 'boolean - :package-version '(flycheck . "32") - :safe #'booleanp) - -(defcustom flycheck-standard-error-navigation t - "Whether to support error navigation with `next-error'. - -If non-nil, enable navigation of Flycheck errors with -`next-error', `previous-error' and `first-error'. Otherwise, -these functions just navigate errors from compilation modes. - -Flycheck error navigation with `flycheck-next-error', -`flycheck-previous-error' and `flycheck-first-error' is always -enabled, regardless of the value of this variable. - -Note that this setting only takes effect when variable -`flycheck-mode' is non-nil. Changing it will not affect buffers -where variable `flycheck-mode' is already non-nil." - :group 'flycheck - :type 'boolean - :package-version '(flycheck . "0.15") - :safe #'booleanp) - -(define-widget 'flycheck-minimum-level 'lazy - "A radio-type choice of minimum error levels. - -See `flycheck-navigation-minimum-level' and -`flycheck-error-list-minimum-level'." - :type '(radio (const :tag "All locations" nil) - (const :tag "Informational messages" info) - (const :tag "Warnings" warning) - (const :tag "Errors" error) - (symbol :tag "Custom error level"))) - -(defcustom flycheck-navigation-minimum-level nil - "The minimum level of errors to navigate. - -If set to an error level, only navigate errors whose error level -is at least as severe as this one. If nil, navigate all errors." - :group 'flycheck - :type 'flycheck-minimum-level - :safe #'flycheck-error-level-p - :package-version '(flycheck . "0.21")) - -(defcustom flycheck-error-list-minimum-level nil - "The minimum level of errors to display in the error list. - -If set to an error level, only display errors whose error level -is at least as severe as this one in the error list. If nil, -display all errors. - -This is the default level, used when the error list is opened. -You can temporarily change the level using -\\[flycheck-error-list-set-filter], or reset it to this value -using \\[flycheck-error-list-reset-filter]." - :group 'flycheck - :type 'flycheck-minimum-level - :safe #'flycheck-error-level-p - :package-version '(flycheck . "0.24")) - -(defcustom flycheck-relevant-error-other-file-minimum-level 'error - "The minimum level of errors from other files to display in this buffer. - -If set to an error level, only display errors from other files -whose error level is at least as severe as this one. If nil, -display all errors from other files." - :group 'flycheck - :type 'flycheck-minimum-level - :safe #'flycheck-error-level-p - :package-version '(flycheck . "32")) - -(defcustom flycheck-relevant-error-other-file-show t - "Whether to show errors from other files." - :group 'flycheck - :type 'boolean - :package-version '(flycheck . "32") - :safe #'booleanp) - -(defcustom flycheck-completing-read-function #'completing-read - "Function to read from minibuffer with completion. - -The function must be compatible to the built-in `completing-read' -function." - :group 'flycheck - :type '(choice (const :tag "Default" completing-read) - (const :tag "IDO" ido-completing-read) - (function :tag "Custom function")) - :risky t - :package-version '(flycheck . "26")) - -(defcustom flycheck-temp-prefix "flycheck" - "Prefix for temporary files created by Flycheck." - :group 'flycheck - :type 'string - :package-version '(flycheck . "0.19") - :risky t) - -(defcustom flycheck-mode-hook nil - "Hooks to run after command `flycheck-mode' is toggled." - :group 'flycheck - :type 'hook - :risky t) - -(defcustom flycheck-after-syntax-check-hook nil - "Functions to run after each syntax check. - -This hook is run after a syntax check was finished. - -At this point, *all* chained checkers were run, and all errors -were parsed, highlighted and reported. The variable -`flycheck-current-errors' contains all errors from all syntax -checkers run during the syntax check, so you can apply any error -analysis functions. - -Note that this hook does *not* run after each individual syntax -checker in the syntax checker chain, but only after the *last -checker*. - -This variable is a normal hook. See Info node `(elisp)Hooks'." - :group 'flycheck - :type 'hook - :risky t) - -(defcustom flycheck-before-syntax-check-hook nil - "Functions to run before each syntax check. - -This hook is run right before a syntax check starts. - -Error information from the previous syntax check is *not* -cleared before this hook runs. - -Note that this hook does *not* run before each individual syntax -checker in the syntax checker chain, but only before the *first -checker*. - -This variable is a normal hook. See Info node `(elisp)Hooks'." - :group 'flycheck - :type 'hook - :risky t) - -(defcustom flycheck-syntax-check-failed-hook nil - "Functions to run if a syntax check failed. - -This hook is run whenever an error occurs during Flycheck's -internal processing. No information about the error is given to -this hook. - -You should use this hook to conduct additional cleanup actions -when Flycheck failed. - -This variable is a normal hook. See Info node `(elisp)Hooks'." - :group 'flycheck - :type 'hook - :risky t) - -(defcustom flycheck-status-changed-functions nil - "Functions to run if the Flycheck status changed. - -This hook is run whenever the status of Flycheck changes. Each -hook function takes the status symbol as single argument, as -given to `flycheck-report-status', which see. - -This variable is an abnormal hook. See Info -node `(elisp)Hooks'." - :group 'flycheck - :type 'hook - :risky t - :package-version '(flycheck . "0.20")) - -(defcustom flycheck-error-list-after-refresh-hook nil - "Functions to run after the error list was refreshed. - -This hook is run whenever the error list is refreshed. - -This variable is a normal hook. See Info node `(elisp)Hooks'." - :group 'flycheck - :type 'hook - :risky t - :package-version '(flycheck . "0.21")) - -(defface flycheck-error - '((((supports :underline (:style wave))) - :underline (:style wave :color "Red1")) - (t - :underline t :inherit error)) - "Flycheck face for errors." - :package-version '(flycheck . "0.13") - :group 'flycheck-faces) - -(defface flycheck-warning - '((((supports :underline (:style wave))) - :underline (:style wave :color "DarkOrange")) - (t - :underline t :inherit warning)) - "Flycheck face for warnings." - :package-version '(flycheck . "0.13") - :group 'flycheck-faces) - -(defface flycheck-info - '((((supports :underline (:style wave))) - :underline (:style wave :color "ForestGreen")) - (t - :underline t :inherit success)) - "Flycheck face for informational messages." - :package-version '(flycheck . "0.15") - :group 'flycheck-faces) - -(defface flycheck-fringe-error - '((t :inherit error)) - "Flycheck face for fringe error indicators." - :package-version '(flycheck . "0.13") - :group 'flycheck-faces) - -(defface flycheck-fringe-warning - '((t :inherit warning)) - "Flycheck face for fringe warning indicators." - :package-version '(flycheck . "0.13") - :group 'flycheck-faces) - -(defface flycheck-fringe-info - ;; Semantically `success' is probably not the right face, but it looks nice as - ;; a base face - '((t :inherit success)) - "Flycheck face for fringe info indicators." - :package-version '(flycheck . "0.15") - :group 'flycheck-faces) - -(defface flycheck-error-list-error - '((t :inherit error)) - "Flycheck face for error messages in the error list." - :package-version '(flycheck . "0.16") - :group 'flycheck-faces) - -(defface flycheck-error-list-warning - '((t :inherit warning)) - "Flycheck face for warning messages in the error list." - :package-version '(flycheck . "0.16") - :group 'flycheck-faces) - -(defface flycheck-error-list-info - '((t :inherit success)) - "Flycheck face for info messages in the error list." - :package-version '(flycheck . "0.16") - :group 'flycheck-faces) - -;; The base faces for the following two faces are inspired by Compilation Mode -(defface flycheck-error-list-line-number - '((t :inherit font-lock-constant-face)) - "Face for line numbers in the error list." - :group 'flycheck-faces - :package-version '(flycheck . "0.16")) - -(defface flycheck-error-list-column-number - '((t :inherit font-lock-constant-face)) - "Face for line numbers in the error list." - :group 'flycheck-faces - :package-version '(flycheck . "0.16")) - -(defface flycheck-error-list-filename - '((t :inherit font-lock-variable-name-face)) - "Face for filenames in the error list." - :group 'flycheck-faces - :package-version '(flycheck . "32")) - -(defface flycheck-error-list-id - '((t :inherit font-lock-type-face)) - "Face for the error ID in the error list." - :group 'flycheck-faces - :package-version '(flycheck . "0.22")) - -(defface flycheck-error-list-id-with-explainer - '((t :inherit flycheck-error-list-id - :box (:style released-button))) - "Face for the error ID in the error list, for errors that have an explainer." - :group 'flycheck-faces - :package-version '(flycheck . "30")) - -(defface flycheck-error-list-checker-name - '((t :inherit font-lock-function-name-face)) - "Face for the syntax checker name in the error list." - :group 'flycheck-faces - :package-version '(flycheck . "0.21")) - -(defface flycheck-error-list-highlight - '((t :inherit highlight)) - "Flycheck face to highlight errors in the error list." - :package-version '(flycheck . "0.15") - :group 'flycheck-faces) - -(defface flycheck-verify-select-checker - '((t :box (:style released-button))) - "Flycheck face for the 'select' button in the verify setup buffer." - :package-version '(flycheck . "32") - :group 'flycheck-faces) - -(defvar flycheck-command-map - (let ((map (make-sparse-keymap))) - (define-key map "c" #'flycheck-buffer) - (define-key map "C" #'flycheck-clear) - (define-key map (kbd "C-c") #'flycheck-compile) - (define-key map "n" #'flycheck-next-error) - (define-key map "p" #'flycheck-previous-error) - (define-key map "l" #'flycheck-list-errors) - (define-key map (kbd "C-w") #'flycheck-copy-errors-as-kill) - (define-key map "s" #'flycheck-select-checker) - (define-key map "?" #'flycheck-describe-checker) - (define-key map "h" #'flycheck-display-error-at-point) - (define-key map "e" #'flycheck-explain-error-at-point) - (define-key map "H" #'display-local-help) - (define-key map "i" #'flycheck-manual) - (define-key map "V" #'flycheck-version) - (define-key map "v" #'flycheck-verify-setup) - (define-key map "x" #'flycheck-disable-checker) - map) - "Keymap of Flycheck interactive commands.") - -(defcustom flycheck-keymap-prefix (kbd "C-c !") - "Prefix for key bindings of Flycheck. - -Changing this variable outside Customize does not have any -effect. To change the keymap prefix from Lisp, you need to -explicitly re-define the prefix key: - - (define-key flycheck-mode-map flycheck-keymap-prefix nil) - (setq flycheck-keymap-prefix (kbd \"C-c f\")) - (define-key flycheck-mode-map flycheck-keymap-prefix - flycheck-command-map) - -Please note that Flycheck's manual documents the default -keybindings. Changing this variable is at your own risk." - :group 'flycheck - :package-version '(flycheck . "0.19") - :type 'string - :risky t - :set - (lambda (variable key) - (when (and (boundp variable) (boundp 'flycheck-mode-map)) - (define-key flycheck-mode-map (symbol-value variable) nil) - (define-key flycheck-mode-map key flycheck-command-map)) - (set-default variable key))) - -(defcustom flycheck-mode-line '(:eval (flycheck-mode-line-status-text)) - "Mode line lighter for Flycheck. - -The value of this variable is a mode line template as in -`mode-line-format'. See Info Node `(elisp)Mode Line Format' for -more information. Note that it should contain a _single_ mode -line construct only. - -Customize this variable to change how Flycheck reports its status -in the mode line. You may use `flycheck-mode-line-status-text' -to obtain a human-readable status text, including an -error/warning count. - -You may also assemble your own status text. The current status -of Flycheck is available in `flycheck-last-status-change'. The -errors in the current buffer are stored in -`flycheck-current-errors', and the function -`flycheck-count-errors' may be used to obtain the number of -errors grouped by error level. - -Set this variable to nil to disable the mode line completely." - :group 'flycheck - :type 'sexp - :risky t - :package-version '(flycheck . "0.20")) - -(defcustom flycheck-mode-line-prefix "FlyC" - "Base mode line lighter for Flycheck. - -This will have an effect only with the default -`flycheck-mode-line'. - -If you've customized `flycheck-mode-line' then the customized -function must be updated to use this variable." - :group 'flycheck - :type 'string - :package-version '(flycheck . "26")) - -(defcustom flycheck-error-list-mode-line - `(,(propertized-buffer-identification "%12b") - " for buffer " - (:eval (flycheck-error-list-propertized-source-name)) - (:eval (flycheck-error-list-mode-line-filter-indicator))) - "Mode line construct for Flycheck error list. - -The value of this variable is a mode line template as in -`mode-line-format', to be used as -`mode-line-buffer-identification' in `flycheck-error-list-mode'. -See Info Node `(elisp)Mode Line Format' for more information. - -Customize this variable to change how the error list appears in -the mode line. The default shows the name of the buffer and the -name of the source buffer, i.e. the buffer whose errors are -currently listed." - :group 'flycheck - :type 'sexp - :risky t - :package-version '(flycheck . "0.20")) - -(defcustom flycheck-global-modes t - "Modes for which option `flycheck-mode' is turned on. - -If t, Flycheck Mode is turned on for all major modes. If a list, -Flycheck Mode is turned on for all `major-mode' symbols in that -list. If the `car' of the list is `not', Flycheck Mode is turned -on for all `major-mode' symbols _not_ in that list. If nil, -Flycheck Mode is never turned on by command -`global-flycheck-mode'. - -Note that Flycheck is never turned on for modes whose -`mode-class' property is `special' (see Info node `(elisp)Major -Mode Conventions'), regardless of the value of this option. - -Only has effect when variable `global-flycheck-mode' is non-nil." - :group 'flycheck - :type '(choice (const :tag "none" nil) - (const :tag "all" t) - (set :menu-tag "mode specific" :tag "modes" - :value (not) - (const :tag "Except" not) - (repeat :inline t (symbol :tag "mode")))) - :risky t - :package-version '(flycheck . "0.23")) - -;; Add built-in functions to our hooks, via `add-hook', to make sure that our -;; functions are really present, even if the variable was implicitly defined by -;; another call to `add-hook' that occurred before Flycheck was loaded. See -;; http://lists.gnu.org/archive/html/emacs-devel/2015-02/msg01271.html for why -;; we don't initialize the hook variables right away. We append our own -;; functions, because a user likely expects that their functions come first, -;; even if they added them before Flycheck was loaded. -(dolist (hook (list #'flycheck-locate-config-file-by-path - #'flycheck-locate-config-file-ancestor-directories - #'flycheck-locate-config-file-home)) - (add-hook 'flycheck-locate-config-file-functions hook 'append)) - -(add-hook 'flycheck-process-error-functions #'flycheck-add-overlay 'append) - - -;;; Global Flycheck menu -(defvar flycheck-mode-menu-map - (easy-menu-create-menu - "Syntax Checking" - '(["Enable on-the-fly syntax checking" flycheck-mode - :style toggle :selected flycheck-mode - :enable (or flycheck-mode - ;; Don't let users toggle the mode if there is no syntax - ;; checker for this buffer - (seq-find #'flycheck-checker-supports-major-mode-p - flycheck-checkers))] - ["Check current buffer" flycheck-buffer flycheck-mode] - ["Clear errors in buffer" flycheck-clear t] - "---" - ["Go to next error" flycheck-next-error flycheck-mode] - ["Go to previous error" flycheck-previous-error flycheck-mode] - ["Show all errors" flycheck-list-errors flycheck-mode] - "---" - ["Copy messages at point" flycheck-copy-errors-as-kill - (flycheck-overlays-at (point))] - ["Explain error at point" flycheck-explain-error-at-point] - "---" - ["Select syntax checker" flycheck-select-checker flycheck-mode] - ["Disable syntax checker" flycheck-disable-checker flycheck-mode] - ["Set executable of syntax checker" flycheck-set-checker-executable - flycheck-mode] - "---" - ["Describe syntax checker" flycheck-describe-checker t] - ["Verify setup" flycheck-verify-setup t] - ["Show Flycheck version" flycheck-version t] - ["Read the Flycheck manual" flycheck-info t])) - "Menu of command `flycheck-mode'.") - -(easy-menu-add-item nil '("Tools") flycheck-mode-menu-map "Spell Checking") - - -;;; Version information, manual and loading of Flycheck -(defun flycheck-version (&optional show-version) - "Get the Flycheck version as string. - -If called interactively or if SHOW-VERSION is non-nil, show the -version in the echo area and the messages buffer. - -The returned string includes both, the version from package.el -and the library version, if both a present and different. - -If the version number could not be determined, signal an error, -if called interactively, or if SHOW-VERSION is non-nil, otherwise -just return nil." - (interactive (list t)) - (let ((version (pkg-info-version-info 'flycheck))) - (when show-version - (message "Flycheck version: %s" version)) - version)) - -(defun flycheck-unload-function () - "Unload function for Flycheck." - (global-flycheck-mode -1) - (easy-menu-remove-item nil '("Tools") (cadr flycheck-mode-menu-map)) - (remove-hook 'kill-emacs-hook #'flycheck-global-teardown) - (setq find-function-regexp-alist - (assq-delete-all 'flycheck-checker find-function-regexp-alist))) - -;;;###autoload -(defun flycheck-manual () - "Open the Flycheck manual." - (interactive) - (browse-url "http://www.flycheck.org")) - -(define-obsolete-function-alias 'flycheck-info - 'flycheck-manual "26" "Open the Flycheck manual.") - - -;;; Utility functions -(defun flycheck-sexp-to-string (sexp) - "Convert SEXP to a string. - -Like `prin1-to-string' but ensure that the returned string -is loadable." - (let ((print-quoted t) - (print-length nil) - (print-level nil)) - (prin1-to-string sexp))) - -(defun flycheck-string-to-number-safe (string) - "Safely convert STRING to a number. - -If STRING is of string type and a numeric string, convert STRING -to a number and return it. Otherwise return nil." - (let ((number-re (rx string-start (one-or-more (any digit)) string-end))) - (when (and (stringp string) (string-match-p number-re string)) - (string-to-number string)))) - -(defun flycheck-string-or-nil-p (obj) - "Determine if OBJ is a string or nil." - (or (null obj) (stringp obj))) - -(defun flycheck-string-list-p (obj) - "Determine if OBJ is a list of strings." - (and (listp obj) (seq-every-p #'stringp obj))) - -(defun flycheck-string-or-string-list-p (obj) - "Determine if OBJ is a string or a list of strings." - (or (stringp obj) (flycheck-string-list-p obj))) - -(defun flycheck-symbol-list-p (obj) - "Determine if OBJ is a list of symbols." - (and (listp obj) (seq-every-p #'symbolp obj))) - -(defvar-local flycheck--file-truename-cache nil) - -(defun flycheck--file-truename (file) - "Memoize the result of `file-truename' on (directory-file-name FILE)." - ;; `file-truename' is slow, but alternatives are incomplete, so memoizing is - ;; our best bet. See https://github.com/flycheck/flycheck/pull/1698. - (unless flycheck--file-truename-cache - (setq-local flycheck--file-truename-cache (make-hash-table :test 'equal))) - (or (gethash file flycheck--file-truename-cache) - (puthash file (file-truename (directory-file-name file)) - flycheck--file-truename-cache))) - -(defun flycheck-same-files-p (file-a file-b) - "Determine whether FILE-A and FILE-B refer to the same file. - -Files are the same if (in the order checked) they are equal, or -if they resolve to the same canonical paths." - (or (string= file-a file-b) - (string= (flycheck--file-truename file-a) - (flycheck--file-truename file-b)))) - -(defvar-local flycheck-temporaries nil - "Temporary files and directories created by Flycheck.") - -(defun flycheck-temp-dir-system () - "Create a unique temporary directory. - -Use `flycheck-temp-prefix' as prefix, and add the directory to -`flycheck-temporaries'. - -Return the path of the directory" - (let* ((tempdir (make-temp-file flycheck-temp-prefix 'directory))) - (push tempdir flycheck-temporaries) - tempdir)) - -(defun flycheck-temp-file-system (filename &optional suffix) - "Create a temporary file named after FILENAME. - -If FILENAME is non-nil, this function creates a temporary -directory with `flycheck-temp-dir-system', and creates a file -with the same name as FILENAME in this directory. - -Otherwise this function creates a temporary file starting with -`flycheck-temp-prefix'. If present, SUFFIX is appended; -otherwise, a random suffix is used. The path of the file is -added to `flycheck-temporaries'. - -Return the path of the file." - (let ((tempfile (convert-standard-filename - (if filename - (expand-file-name (file-name-nondirectory filename) - (flycheck-temp-dir-system)) - (make-temp-file flycheck-temp-prefix nil suffix))))) - (push tempfile flycheck-temporaries) - tempfile)) - -(defun flycheck-temp-file-inplace (filename &optional suffix) - "Create an in-place copy of FILENAME. - -Prefix the file with `flycheck-temp-prefix' and add the path of -the file to `flycheck-temporaries'. - -If FILENAME is nil, fall back to `flycheck-temp-file-system' with -the specified SUFFIX. - -Return the path of the file." - (if filename - (let* ((tempname (format "%s_%s" - flycheck-temp-prefix - (file-name-nondirectory filename))) - (tempfile (convert-standard-filename - (expand-file-name tempname - (file-name-directory filename))))) - (push tempfile flycheck-temporaries) - tempfile) - (flycheck-temp-file-system filename suffix))) - -(defun flycheck-temp-directory (checker) - "Return the directory where CHECKER writes temporary files. - -Return nil if the CHECKER does not write temporary files." - (let ((args (flycheck-checker-arguments checker))) - (cond - ((memq 'source args) temporary-file-directory) - ((memq 'source-inplace args) - (if buffer-file-name (file-name-directory buffer-file-name) - temporary-file-directory)) - (t nil)))) - -(defun flycheck-temp-files-writable-p (checker) - "Whether CHECKER can write temporary files. - -If CHECKER has `source' or `source-inplace' in its `:command', -return whether flycheck has the permissions to create the -respective temporary files. - -Return t if CHECKER does not use temporary files." - (let ((dir (flycheck-temp-directory checker))) - (or (not dir) (file-writable-p dir)))) - -(defun flycheck-save-buffer-to-file (file-name) - "Save the contents of the current buffer to FILE-NAME." - (make-directory (file-name-directory file-name) t) - (let ((jka-compr-inhibit t)) - (write-region nil nil file-name nil 0))) - -(defun flycheck-save-buffer-to-temp (temp-file-fn) - "Save buffer to temp file returned by TEMP-FILE-FN. - -Return the name of the temporary file." - (let ((filename (funcall temp-file-fn (buffer-file-name)))) - ;; Do not flush short-lived temporary files onto disk - (let ((write-region-inhibit-fsync t)) - (flycheck-save-buffer-to-file filename)) - filename)) - -(defun flycheck-prepend-with-option (option items &optional prepend-fn) - "Prepend OPTION to each item in ITEMS, using PREPEND-FN. - -Prepend OPTION to each item in ITEMS. - -ITEMS is a list of strings to pass to the syntax checker. OPTION -is the option, as string. PREPEND-FN is a function called to -prepend OPTION to each item in ITEMS. It receives the option and -a single item from ITEMS as argument, and must return a string or -a list of strings with OPTION prepended to the item. If -PREPEND-FN is nil or omitted, use `list'. - -Return a list of strings where OPTION is prepended to each item -in ITEMS using PREPEND-FN. If PREPEND-FN returns a list, it is -spliced into the resulting list." - (unless (stringp option) - (error "Option %S is not a string" option)) - (unless prepend-fn - (setq prepend-fn #'list)) - (let ((prepend - (lambda (item) - (let ((result (funcall prepend-fn option item))) - (cond - ((and (listp result) (seq-every-p #'stringp result)) result) - ((stringp result) (list result)) - (t (error "Invalid result type for option: %S" result))))))) - (apply #'append (seq-map prepend items)))) - -(defun flycheck-find-in-buffer (pattern) - "Find PATTERN in the current buffer. - -Return the result of the first matching group of PATTERN, or nil, -if PATTERN did not match." - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (when (re-search-forward pattern nil 'no-error) - (match-string-no-properties 1))))) - -(defun flycheck-buffer-empty-p (&optional buffer) - "Check whether a BUFFER is empty, defaulting to the current one." - (= (buffer-size buffer) 0)) - -(defun flycheck-buffer-nonempty-p (&optional buffer) - "Check whether a BUFFER is nonempty, defaulting to the current one." - (> (buffer-size buffer) 0)) - -(defun flycheck-ephemeral-buffer-p () - "Determine whether the current buffer is an ephemeral buffer. - -See Info node `(elisp)Buffer Names' for information about -ephemeral buffers." - (string-prefix-p " " (buffer-name))) - -(defun flycheck-encrypted-buffer-p () - "Determine whether the current buffer is an encrypted file. - -See Info node `(epa)Top' for Emacs' interface to encrypted -files." - ;; The EPA file handler sets this variable locally to remember the recipients - ;; of the encrypted file for re-encryption. Hence, a local binding of this - ;; variable is a good indication that the buffer is encrypted. I haven't - ;; found any better indicator anyway. - (local-variable-p 'epa-file-encrypt-to)) - -(defun flycheck-autoloads-file-p () - "Determine whether the current buffer is an autoloads file. - -Autoloads are generated by package.el during installation." - (string-suffix-p "-autoloads.el" (buffer-name))) - -(defun flycheck-in-user-emacs-directory-p (filename) - "Whether FILENAME is in `user-emacs-directory'." - (string-prefix-p (file-name-as-directory - (flycheck--file-truename user-emacs-directory)) - (flycheck--file-truename filename))) - -(defun flycheck-safe-delete (file-or-dir) - "Safely delete FILE-OR-DIR." - (ignore-errors - (if (file-directory-p file-or-dir) - (delete-directory file-or-dir 'recursive) - (delete-file file-or-dir)))) - -(defun flycheck-safe-delete-temporaries () - "Safely delete all temp files and directories of Flycheck. - -Safely delete all files and directories listed in -`flycheck-temporaries' and set the variable's value to nil." - (seq-do #'flycheck-safe-delete flycheck-temporaries) - (setq flycheck-temporaries nil)) - -(defun flycheck-rx-file-name (form) - "Translate the `(file-name)' FORM into a regular expression." - (let ((body (or (cdr form) '((minimal-match - (one-or-more not-newline)))))) - (rx-to-string `(group-n 1 ,@body) t))) - -(defun flycheck-rx-message (form) - "Translate the `(message)' FORM into a regular expression." - (let ((body (or (cdr form) '((one-or-more not-newline))))) - (rx-to-string `(group-n 4 ,@body) t))) - -(defun flycheck-rx-id (form) - "Translate the `(id)' FORM into a regular expression." - (rx-to-string `(group-n 5 ,@(cdr form)) t)) - -(defun flycheck-rx-to-string (form &optional no-group) - "Like `rx-to-string' for FORM, but with special keywords: - -`line' - matches the initial line number. - -`column' - matches the initial column number. - -`end-line' - matches the final line number. - -`end-column' - matches the final column number (exclusive). - - -`(file-name SEXP ...)' - matches the file name. SEXP describes the file name. If no - SEXP is given, use a default body of `(minimal-match - (one-or-more not-newline))'. - -`(message SEXP ...)' - matches the message. SEXP constitutes the body of the - message. If no SEXP is given, use a default body - of `(one-or-more not-newline)'. - -`(id SEXP ...)' - matches an error ID. SEXP describes the ID. - -NO-GROUP is passed to `rx-to-string'. - -See `rx' for a complete list of all built-in `rx' forms." - (let ((rx-constituents - (append - `((file-name flycheck-rx-file-name 0 nil) ;; group 1 - (line . ,(rx (group-n 2 (one-or-more digit)))) - (column . ,(rx (group-n 3 (one-or-more digit)))) - (message flycheck-rx-message 0 nil) ;; group 4 - (id flycheck-rx-id 0 nil) ;; group 5 - (end-line . ,(rx (group-n 6 (one-or-more digit)))) - (end-column . ,(rx (group-n 7 (one-or-more digit))))) - rx-constituents nil))) - (rx-to-string form no-group))) - -(defun flycheck-current-load-file () - "Get the source file currently being loaded. - -Always return the name of the corresponding source file, never -any byte-compiled file. - -Return nil, if the currently loaded file cannot be determined." - (-when-let* ((this-file (cond - (load-in-progress load-file-name) - ((bound-and-true-p byte-compile-current-file)) - (t (buffer-file-name)))) - ;; A best guess for the source file of a compiled library. Works - ;; well in most cases, and especially for ELPA packages - (source-file (concat (file-name-sans-extension this-file) - ".el"))) - (when (file-exists-p source-file) - source-file))) - -(defun flycheck-module-root-directory (module &optional file-name) - "Get the root directory for a MODULE in FILE-NAME. - -MODULE is a qualified module name, either a string with -components separated by a dot, or as list of components. -FILE-NAME is the name of the file or directory containing the -module as string. When nil or omitted, defaults to the return -value of function `buffer-file-name'. - -Return the root directory of the module, that is, the directory, -from which FILE-NAME can be reached by descending directories -along each part of MODULE. - -If the MODULE name does not match the directory hierarchy upwards -from FILE-NAME, return the directory containing FILE-NAME. When -FILE-NAME is nil, return `default-directory'." - (let ((file-name (or file-name (buffer-file-name))) - (module-components (if (stringp module) - (split-string module (rx ".")) - (copy-sequence module)))) - (if (and module-components file-name) - (let ((parts (nreverse module-components)) - (base-directory (directory-file-name - (file-name-sans-extension file-name)))) - (while (and parts - (string= (file-name-nondirectory base-directory) - (car parts))) - (pop parts) - (setq base-directory (directory-file-name - (file-name-directory base-directory)))) - (file-name-as-directory base-directory)) - (if file-name - (file-name-directory file-name) - (expand-file-name default-directory))))) - -(defun flycheck-goto-line (line) - "Move point to beginning of line number LINE." - (goto-char (point-min)) - (forward-line (- line 1))) - -(defun flycheck-line-column-to-position (line column) - "Return the point closest to LINE, COLUMN on line LINE. - -COLUMN is one-based." - (save-excursion - (flycheck-goto-line line) - (min (+ (point) (1- column)) (line-end-position)))) - -(defun flycheck-line-column-at-point () - "Return the line and column number at point." - (cons (line-number-at-pos) (1+ (- (point) (line-beginning-position))))) - -(defun flycheck-line-column-at-pos (pos) - "Return the line and column number at position POS. - -COLUMN is one-based." - (let ((inhibit-field-text-motion t)) - (save-excursion - (goto-char pos) - (flycheck-line-column-at-point)))) - - -;;; Minibuffer tools -(defvar flycheck-read-checker-history nil - "`completing-read' history of `flycheck-read-checker'.") - -(defun flycheck-completing-read (prompt candidates default &optional history) - "Read a value from the minibuffer. - -Use `flycheck-completing-read-function' to read input from the -minibuffer with completion. - -Show PROMPT and read one of CANDIDATES, defaulting to DEFAULT. -HISTORY is passed to `flycheck-completing-read-function'. - -Note that `flycheck-completing-read-function' may return an empty -string instead of nil, even when \"\" isn't among the candidates. -See `completing-read' for more details." - (funcall flycheck-completing-read-function - prompt candidates nil 'require-match nil history default)) - -(defun flycheck-read-checker (prompt &optional default property candidates) - "Read a flycheck checker from minibuffer with PROMPT and DEFAULT. - -PROMPT is a string to show in the minibuffer as prompt. It -should end with a single space. DEFAULT is a symbol denoting the -default checker to use, if the user did not select any checker. -PROPERTY is a symbol denoting a syntax checker property. If -non-nil, only complete syntax checkers which have a non-nil value -for PROPERTY. CANDIDATES is an optional list of all syntax -checkers available for completion, defaulting to all defined -checkers. If given, PROPERTY is ignored. - -Return the checker as symbol, or DEFAULT if no checker was -chosen. If DEFAULT is nil and no checker was chosen, signal a -`user-error' if the underlying completion system does not provide -a default on its own." - (when (and default (not (flycheck-valid-checker-p default))) - (error "%S is no valid Flycheck checker" default)) - (let* ((candidates (seq-map #'symbol-name - (or candidates - (flycheck-defined-checkers property)))) - (default (and default (symbol-name default))) - (input (flycheck-completing-read - prompt candidates default - 'flycheck-read-checker-history))) - (when (string-empty-p input) - (unless default - (user-error "No syntax checker selected")) - (setq input default)) - (let ((checker (intern input))) - (unless (flycheck-valid-checker-p checker) - (error "%S is not a valid Flycheck syntax checker" checker)) - checker))) - -(defun flycheck-read-error-level (prompt) - "Read an error level from the user with PROMPT. - -Only offers level for which errors currently exist, in addition -to the default levels." - (let* ((levels (seq-map #'flycheck-error-level - (flycheck-error-list-current-errors))) - (levels-with-defaults (append '(info warning error) levels)) - (uniq-levels (seq-uniq levels-with-defaults)) - (level (flycheck-completing-read prompt uniq-levels nil))) - (when (string-empty-p level) (setq level nil)) - (and level (intern level)))) - - -;;; Checker API -(defun flycheck-defined-checkers (&optional property) - "Find all defined syntax checkers, optionally with PROPERTY. - -PROPERTY is a symbol. If given, only return syntax checkers with -a non-nil value for PROPERTY. - -The returned list is sorted alphapetically by the symbol name of -the syntax checkers." - (let (defined-checkers) - (mapatoms (lambda (symbol) - (when (and (flycheck-valid-checker-p symbol) - (or (null property) - (flycheck-checker-get symbol property))) - (push symbol defined-checkers)))) - (sort defined-checkers #'string<))) - -(defun flycheck-registered-checker-p (checker) - "Determine whether CHECKER is registered. - -A checker is registered if it is contained in -`flycheck-checkers'." - (and (flycheck-valid-checker-p checker) - (memq checker flycheck-checkers))) - -(defun flycheck-disabled-checker-p (checker) - "Determine whether CHECKER is disabled. - -A checker is disabled if it is contained in -`flycheck-disabled-checkers'." - (or (memq checker flycheck-disabled-checkers) - (flycheck-automatically-disabled-checker-p checker))) - -(defun flycheck-automatically-disabled-checker-p (checker) - "Determine whether CHECKER has been automatically disabled. - -A checker has been automatically disabled if it is contained in -`flycheck--automatically-disabled-checkers'." - (memq checker flycheck--automatically-disabled-checkers)) - - - -;;; Generic syntax checkers -(defconst flycheck-generic-checker-version 2 - "The internal version of generic syntax checker declarations. - -Flycheck will not use syntax checkers whose generic version is -less than this constant.") - -(defsubst flycheck--checker-property-name (property) - "Return the SYMBOL property for checker PROPERTY." - (intern (concat "flycheck-" (symbol-name property)))) - -(defun flycheck-checker-get (checker property) - "Get the value of CHECKER's PROPERTY." - (get checker (flycheck--checker-property-name property))) - -(gv-define-setter flycheck-checker-get (value checker property) - `(setf (get ,checker (flycheck--checker-property-name ,property)) ,value)) - -(defun flycheck-validate-next-checker (next &optional strict) - "Validate NEXT checker. - -With STRICT non-nil, also check whether the syntax checker and -the error level in NEXT are valid. Otherwise just check whether -these are symbols. - -Signal an error if NEXT is not a valid entry for -`:next-checkers'." - (when (symbolp next) - (setq next (cons t next))) - (pcase next - (`(,level . ,checker) - (if strict - (progn - (unless (or (eq level t) (flycheck-error-level-p level)) - (error "%S is not a valid Flycheck error level" level)) - (unless (flycheck-valid-checker-p checker) - (error "%s is not a valid Flycheck syntax checker" checker))) - (unless (symbolp level) - (error "Error level %S must be a symbol" level)) - (unless (symbolp checker) - (error "Checker %S must be a symbol" checker)))) - (_ (error "%S must be a symbol or cons cell" next))) - t) - -(defun flycheck-define-generic-checker (symbol docstring &rest properties) - "Define SYMBOL as generic syntax checker. - -Any syntax checker defined with this macro is eligible for manual -syntax checker selection with `flycheck-select-checker'. To make -the new syntax checker available for automatic selection, it must -be registered in `flycheck-checkers'. - -DOCSTRING is the documentation of the syntax checker, for -`flycheck-describe-checker'. The following PROPERTIES constitute -a generic syntax checker. Unless otherwise noted, all properties -are mandatory. - -`:start FUNCTION' - A function to start the syntax checker. - - FUNCTION shall take two arguments and return a context - object if the checker is started successfully. Otherwise it - shall signal an error. - - The first argument is the syntax checker being started. The - second is a callback function to report state changes to - Flycheck. The callback takes two arguments STATUS DATA, - where STATUS is a symbol denoting the syntax checker status - and DATA an optional argument with additional data for the - status report. See `flycheck-report-buffer-checker-status' - for more information about STATUS and DATA. - - FUNCTION may be synchronous or asynchronous, i.e. it may - call the given callback either immediately, or at some later - point (e.g. from a process sentinel). - - A syntax checker _must_ call CALLBACK at least once with a - STATUS that finishes the current syntax checker. Otherwise - Flycheck gets stuck at the current syntax check with this - syntax checker. - - The context object returned by FUNCTION is passed to - `:interrupt'. - -`:interrupt FUNCTION' - A function to interrupt the syntax check. - - FUNCTION is called with the syntax checker and the context - object returned by the `:start' function and shall try to - interrupt the syntax check. The context may be nil, if the - syntax check is interrupted before actually started. - FUNCTION should handle this situation. - - If it cannot interrupt the syntax check, it may either - signal an error or silently ignore the attempt to interrupt - the syntax checker, depending on the severity of the - situation. - - If interrupting the syntax check failed, Flycheck will let - the syntax check continue, but ignore any status reports. - Notably, it won't highlight any errors reported by the - syntax check in the buffer. - - This property is optional. If omitted, Flycheck won't - attempt to interrupt syntax checks wit this syntax checker, - and simply ignore their results. - -`:print-doc FUNCTION' - A function to print additional documentation into the Help - buffer of this checker. - - FUNCTION is called when creating the Help buffer for the - syntax checker, with the syntax checker as single argument, - after printing the name of the syntax checker and its modes - and predicate, but before printing DOCSTRING. It may insert - additional documentation into the current buffer. - - The call occurs within `with-help-window'. Hence - `standard-output' points to the current buffer, so you may - use `princ' and friends to add content. Also, the current - buffer is put into Help mode afterwards, which automatically - turns symbols into references, if possible. - - This property is optional. If omitted, no additional - documentation is printed for this syntax checker. - -:verify FUNCTION - A function to verify the checker for the current buffer. - - FUNCTION is called with the syntax checker as single - argument, and shall return a list of - `flycheck-verification-result' objects indicating whether - the syntax checker could be used in the current buffer, and - highlighting potential setup problems. - - This property is optional. If omitted, no additional - verification occurs for this syntax checker. It is however - absolutely recommended that you add a `:verify' function to - your syntax checker, because it will help users to spot - potential setup problems. - -`:modes MODES' - A major mode symbol or a list thereof, denoting major modes - to use this syntax checker in. - - This syntax checker will only be used in buffers whose - `major-mode' is contained in MODES. - - If `:predicate' is also given the syntax checker will only - be used in buffers for which the `:predicate' returns - non-nil. - -`:predicate FUNCTION' - A function to determine whether to use the syntax checker in - the current buffer. - - FUNCTION is called without arguments and shall return - non-nil if this syntax checker shall be used to check the - current buffer. Otherwise it shall return nil. - - If this checker has a `:working-directory' FUNCTION is - called with `default-directory' bound to the checker's - working directory. - - FUNCTION is only called in matching major modes. - - This property is optional. - -`:enabled FUNCTION' - A function to determine whether to use the syntax checker in - the current buffer. - - This property behaves as `:predicate', except that it's only - called the first time a syntax checker is to be used in a buffer. - - FUNCTION is called without arguments and shall return - non-nil if this syntax checker shall be used to check the - current buffer. Otherwise it shall return nil. - - If FUNCTION returns a non-nil value the checker is put in a - whitelist in `flycheck--automatically-enabled-checkers' to - prevent further invocations of `:enabled'. Otherwise it is - disabled via `flycheck--automatically-disabled-checkers' to - prevent any further use of it. - - If this checker has a `:working-directory' FUNCTION is - called with `default-directory' bound to the checker's - working directory. - - FUNCTION is only called in matching major modes. - - This property is optional. - -`:error-filter FUNCTION' - A function to filter the errors returned by this checker. - - FUNCTION is called with the list of `flycheck-error' objects - returned by the syntax checker and shall return another list - of `flycheck-error' objects, which is considered the final - result of this syntax checker. - - FUNCTION is free to add, remove or modify errors, whether in - place or by copying. - - This property is optional. The default filter is - `identity'. - -`:error-explainer FUNCTION' - A function to return an explanation text for errors - generated by this checker. - - FUNCTION is called with a `flycheck-error' object and shall - return an explanation message for this error as a string, or - nil if there is no explanation for this error. - - This property is optional. - -`:next-checkers NEXT-CHECKERS' - A list denoting syntax checkers to apply after this syntax - checker, in what we call \"chaining\" of syntax checkers. - - Each ITEM is a cons cell `(LEVEL . CHECKER)'. CHECKER is a - syntax checker to run after this syntax checker. LEVEL is - an error level. CHECKER will only be used if there are no - current errors of at least LEVEL. LEVEL may also be t, in - which case CHECKER is used regardless of the current errors. - - ITEM may also be a syntax checker symbol, which is - equivalent to `(t . ITEM)'. - - Flycheck tries all items in order of declaration, and uses - the first whose LEVEL matches and whose CHECKER is - registered and can be used for the current buffer. - - This feature is typically used to apply more than one syntax - checker to a buffer. For instance, you might first use a - compiler to check a buffer for syntax and type errors, and - then run a linting tool that checks for insecure code, or - questionable style. - - This property is optional. If omitted, it defaults to the - nil, i.e. no other syntax checkers are applied after this - syntax checker. - -`:working-directory FUNCTION' - The value of `default-directory' when invoking `:start'. - - FUNCTION is a function taking the syntax checker as sole - argument. It shall return the absolute path to an existing - directory to use as `default-directory' for `:start' or - nil to fall back to the `default-directory' of the current - buffer. - - This property is optional. If omitted, invoke `:start' - from the `default-directory' of the buffer being checked. - -Signal an error, if any property has an invalid value." - (declare (indent 1) - (doc-string 2)) - (let ((start (plist-get properties :start)) - (interrupt (plist-get properties :interrupt)) - (print-doc (plist-get properties :print-doc)) - (modes (plist-get properties :modes)) - (predicate (plist-get properties :predicate)) - (verify (plist-get properties :verify)) - (enabled (plist-get properties :enabled)) - (filter (or (plist-get properties :error-filter) #'identity)) - (explainer (plist-get properties :error-explainer)) - (next-checkers (plist-get properties :next-checkers)) - (file (flycheck-current-load-file)) - (working-directory (plist-get properties :working-directory))) - - (unless (listp modes) - (setq modes (list modes))) - - (unless (functionp start) - (error ":start %S of syntax checker %s is not a function" start symbol)) - (unless (or (null interrupt) (functionp interrupt)) - (error ":interrupt %S of syntax checker %s is not a function" - interrupt symbol)) - (unless (or (null print-doc) (functionp print-doc)) - (error ":print-doc %S of syntax checker %s is not a function" - print-doc symbol)) - (unless (or (null verify) (functionp verify)) - (error ":verify %S of syntax checker %S is not a function" - verify symbol)) - (unless (or (null enabled) (functionp enabled)) - (error ":enabled %S of syntax checker %S is not a function" - enabled symbol)) - (unless modes - (error "Missing :modes in syntax checker %s" symbol)) - (dolist (mode modes) - (unless (symbolp mode) - (error "Invalid :modes %s in syntax checker %s, %s must be a symbol" - modes symbol mode))) - (unless (or (null predicate) (functionp predicate)) - (error ":predicate %S of syntax checker %s is not a function" - predicate symbol)) - (unless (functionp filter) - (error ":error-filter %S of syntax checker %s is not a function" - filter symbol)) - (unless (or (null explainer) (functionp explainer)) - (error ":error-explainer %S of syntax checker %S is not a function" - explainer symbol)) - (dolist (checker next-checkers) - (flycheck-validate-next-checker checker)) - - (let ((real-predicate - (and predicate - (lambda () - ;; Run predicate in the checker's default directory - (let ((default-directory - (flycheck-compute-working-directory symbol))) - (funcall predicate))))) - (real-enabled - (lambda () - (if (flycheck-valid-checker-p symbol) - (or (null enabled) - ;; Run enabled in the checker's default directory - (let ((default-directory - (flycheck-compute-working-directory symbol))) - (funcall enabled))) - (lwarn 'flycheck - :warning "%S is no valid Flycheck syntax checker. -Try to reinstall the package defining this syntax checker." symbol) - nil)))) - (pcase-dolist (`(,prop . ,value) - `((start . ,start) - (interrupt . ,interrupt) - (print-doc . ,print-doc) - (modes . ,modes) - (predicate . ,real-predicate) - (verify . ,verify) - (enabled . ,real-enabled) - (error-filter . ,filter) - (error-explainer . ,explainer) - (next-checkers . ,next-checkers) - (documentation . ,docstring) - (file . ,file) - (working-directory . ,working-directory))) - (setf (flycheck-checker-get symbol prop) value))) - - ;; Track the version, to avoid breakage if the internal format changes - (setf (flycheck-checker-get symbol 'generic-checker-version) - flycheck-generic-checker-version))) - -(defun flycheck-valid-checker-p (checker) - "Check whether a CHECKER is valid. - -A valid checker is a symbol defined as syntax checker with -`flycheck-define-checker'." - (and (symbolp checker) - (= (or (get checker 'flycheck-generic-checker-version) 0) - flycheck-generic-checker-version))) - -(defun flycheck-checker-supports-major-mode-p (checker &optional mode) - "Whether CHECKER supports the given major MODE. - -CHECKER is a syntax checker symbol and MODE a major mode symbol. -Look at the `modes' property of CHECKER to determine whether -CHECKER supports buffers in the given major MODE. - -MODE defaults to the value of `major-mode' if omitted or nil. - -Return non-nil if CHECKER supports MODE and nil otherwise." - (let ((mode (or mode major-mode))) - (memq mode (flycheck-checker-get checker 'modes)))) - -(define-obsolete-variable-alias 'flycheck-enabled-checkers - 'flycheck--automatically-enabled-checkers "32") - -(defvar flycheck--automatically-enabled-checkers nil - "Syntax checkers included in automatic selection. - -A list of Flycheck syntax checkers included in automatic -selection for the current buffer.") -(make-variable-buffer-local 'flycheck--automatically-enabled-checkers) - -(defun flycheck-may-enable-checker (checker) - "Whether a generic CHECKER may be enabled for current buffer. - -Return non-nil if CHECKER may be used for the current buffer, and -nil otherwise." - (let* ((enabled (flycheck-checker-get checker 'enabled)) - (shall-enable - (and (not (flycheck-disabled-checker-p checker)) - (or (memq checker flycheck--automatically-enabled-checkers) - (null enabled) - (funcall enabled))))) - (if shall-enable - (cl-pushnew checker flycheck--automatically-enabled-checkers) - (cl-pushnew checker flycheck--automatically-disabled-checkers)) - shall-enable)) - -(defun flycheck-reset-enabled-checker (checker) - "Reset the `:enabled' test of CHECKER. - -Forget that CHECKER has been enabled or automatically disabled -from a previous `:enabled' test. Once a checker has been enabled -or automatically disabled, `flycheck-may-enable-checker' will -always be constant (t or nil respectively). - -If you wish to test the `:enabled' predicate again, you must -first reset its state using this function." - (when (memq checker flycheck--automatically-disabled-checkers) - (setq flycheck--automatically-disabled-checkers - (remq checker flycheck--automatically-disabled-checkers))) - (when (memq checker flycheck--automatically-enabled-checkers) - (setq flycheck--automatically-enabled-checkers - (remq checker flycheck--automatically-enabled-checkers)))) - -(defun flycheck-may-use-checker (checker) - "Whether a generic CHECKER may be used. - -Return non-nil if CHECKER may be used for the current buffer, and -nil otherwise." - (let ((predicate (flycheck-checker-get checker 'predicate))) - (and (flycheck-valid-checker-p checker) - (flycheck-checker-supports-major-mode-p checker) - (flycheck-may-enable-checker checker) - (or (null predicate) (funcall predicate))))) - -(defun flycheck-may-use-next-checker (next-checker) - "Determine whether NEXT-CHECKER may be used." - (when (symbolp next-checker) - (push t next-checker)) - (let ((level (car next-checker)) - (next-checker (cdr next-checker))) - (and (or (eq level t) - (flycheck-has-max-current-errors-p level)) - (flycheck-registered-checker-p next-checker) - (flycheck-may-use-checker next-checker)))) - - -;;; Help for generic syntax checkers -(define-button-type 'help-flycheck-checker-def - :supertype 'help-xref - 'help-function #'flycheck-goto-checker-definition - 'help-echo "mouse-1, RET: find Flycheck checker definition") - -(defconst flycheck-find-checker-regexp - (rx line-start (zero-or-more (syntax whitespace)) - "(" symbol-start - (or "flycheck-define-checker" "flycheck-define-command-checker") - symbol-end - (eval (list 'regexp find-function-space-re)) - (? "'") - symbol-start "%s" symbol-end - (or (syntax whitespace) line-end)) - "Regular expression to find a checker definition.") - -(add-to-list 'find-function-regexp-alist - '(flycheck-checker . flycheck-find-checker-regexp)) - -(defun flycheck-goto-checker-definition (checker file) - "Go to to the definition of CHECKER in FILE." - (let ((location (find-function-search-for-symbol - checker 'flycheck-checker file))) - (pop-to-buffer (car location)) - (if (cdr location) - (goto-char (cdr location)) - (message "Unable to find checker location in file")))) - -(defun flycheck-checker-at-point () - "Return the Flycheck checker found at or before point. - -Return nil if there is no checker." - (let ((symbol (variable-at-point 'any-symbol))) - (when (flycheck-valid-checker-p symbol) - symbol))) - -(defun flycheck-describe-checker (checker) - "Display the documentation of CHECKER. - -CHECKER is a checker symbol. - -Pop up a help buffer with the documentation of CHECKER." - (interactive - (let* ((enable-recursive-minibuffers t) - (default (or (flycheck-checker-at-point) - (ignore-errors (flycheck-get-checker-for-buffer)))) - (prompt (if default - (format "Describe syntax checker (default %s): " default) - "Describe syntax checker: "))) - (list (flycheck-read-checker prompt default)))) - (unless (flycheck-valid-checker-p checker) - (user-error "You didn't specify a Flycheck syntax checker")) - (help-setup-xref (list #'flycheck-describe-checker checker) - (called-interactively-p 'interactive)) - (save-excursion - (with-help-window (help-buffer) - (let ((filename (flycheck-checker-get checker 'file)) - (modes (flycheck-checker-get checker 'modes)) - (predicate (flycheck-checker-get checker 'predicate)) - (print-doc (flycheck-checker-get checker 'print-doc)) - (next-checkers (flycheck-checker-get checker 'next-checkers))) - (princ (format "%s is a Flycheck syntax checker" checker)) - (when filename - (princ (format " in `%s'" (file-name-nondirectory filename))) - (with-current-buffer standard-output - (save-excursion - (re-search-backward "`\\([^`']+\\)'" nil t) - (help-xref-button 1 'help-flycheck-checker-def - checker filename)))) - (princ ".\n\n") - - (let ((modes-start (with-current-buffer standard-output (point-max)))) - ;; Track the start of the modes documentation, to properly re-fill - ;; it later - (princ " This syntax checker checks syntax in the major mode(s) ") - (princ (string-join - (seq-map (apply-partially #'format "`%s'") modes) - ", ")) - (when predicate - (princ ", and uses a custom predicate")) - (princ ".") - (when next-checkers - (princ " It runs the following checkers afterwards:")) - (with-current-buffer standard-output - (save-excursion - (fill-region-as-paragraph modes-start (point-max)))) - (princ "\n") - - ;; Print the list of next checkers - (when next-checkers - (princ "\n") - (let ((beg-checker-list (with-current-buffer standard-output - (point)))) - (dolist (next-checker next-checkers) - (if (symbolp next-checker) - (princ (format " * `%s'\n" next-checker)) - (princ (format " * `%s' (maximum level `%s')\n" - (cdr next-checker) (car next-checker))))) - ;; - (with-current-buffer standard-output - (save-excursion - (while (re-search-backward "`\\([^`']+\\)'" - beg-checker-list t) - (when (flycheck-valid-checker-p - (intern-soft (match-string 1))) - (help-xref-button 1 'help-flycheck-checker-def checker - filename)))))))) - ;; Call the custom print-doc function of the checker, if present - (when print-doc - (funcall print-doc checker)) - ;; Ultimately, print the docstring - (princ "\nDocumentation:\n") - (princ (flycheck-checker-get checker 'documentation)))))) - - -;;; Syntax checker verification -(cl-defstruct (flycheck-verification-result - (:constructor flycheck-verification-result-new)) - "Structure for storing a single verification result. - -Slots: - -`label' - A label for this result, as string - -`message' - A message for this result, as string - -`face' - The face to use for the `message'. - - You can either use a face symbol, or a list of face symbols." - label message face) - -(defun flycheck-verify-generic-checker (checker) - "Verify a generic CHECKER in the current buffer. - -Return a list of `flycheck-verification-result' objects." - (let (results - (predicate (flycheck-checker-get checker 'predicate)) - (enabled (flycheck-checker-get checker 'enabled)) - (verify (flycheck-checker-get checker 'verify))) - (when enabled - (let ((result (flycheck-may-enable-checker checker))) - (push (flycheck-verification-result-new - :label "may enable" - :message (if result "yes" "Automatically disabled!") - :face (if result 'success '(bold warning))) - results))) - (when predicate - (let ((result (funcall predicate))) - (push (flycheck-verification-result-new - :label "predicate" - :message (prin1-to-string (not (null result))) - :face (if result 'success '(bold warning))) - results))) - (append (nreverse results) - (and verify (funcall verify checker))))) - -(define-button-type 'help-flycheck-checker-doc - :supertype 'help-xref - 'help-function #'flycheck-describe-checker - 'help-echo "mouse-1, RET: describe Flycheck checker") - -(define-button-type 'flycheck-checker-select - :supertype 'help-xref - 'help-function (lambda (buffer checker) - (with-current-buffer buffer - (flycheck-select-checker checker)) - ;; Revert the verify-setup buffer since it is now stale - (revert-buffer)) - 'help-echo "mouse-1, RET: select Flycheck checker" - 'face 'flycheck-verify-select-checker) - -(defun flycheck--verify-princ-checker (checker buffer - &optional with-mm with-select) - "Print verification result of CHECKER for BUFFER. - -When WITH-MM is given and non-nil, also include the major mode -into the verification results. - -When WITH-SELECT is non-nil, add a button to select this checker." - (princ " ") - (insert-button (symbol-name checker) - 'type 'help-flycheck-checker-doc - 'help-args (list checker)) - (when (with-current-buffer buffer (flycheck-disabled-checker-p checker)) - (insert (propertize " (disabled)" 'face '(bold error)))) - (when (eq checker (buffer-local-value 'flycheck-checker buffer)) - (insert (propertize " (explicitly selected)" 'face 'bold))) - (when with-select - (princ " ") - (insert-text-button "select" - 'type 'flycheck-checker-select - 'help-args (list buffer checker))) - (princ "\n") - (let ((results (with-current-buffer buffer - (append (flycheck-verify-generic-checker checker) - (flycheck--verify-next-checkers checker))))) - (when with-mm - (with-current-buffer buffer - (let ((message-and-face - (if (flycheck-checker-supports-major-mode-p checker) - (cons (format "`%s' supported" major-mode) 'success) - (cons (format "`%s' not supported" major-mode) 'error)))) - (push (flycheck-verification-result-new - :label "major mode" - :message (car message-and-face) - :face (cdr message-and-face)) - results)))) - (let* ((label-length - (seq-max (mapcar - (lambda (res) - (length (flycheck-verification-result-label res))) - results))) - (message-column (+ 8 label-length))) - (dolist (result results) - (princ " - ") - (princ (flycheck-verification-result-label result)) - (princ ": ") - (princ (make-string (- message-column (current-column)) ?\ )) - (let ((message (flycheck-verification-result-message result)) - (face (flycheck-verification-result-face result))) - ;; If face is nil, using propertize erases the face already contained - ;; by the message. We don't want that, since this would remove the - ;; button face from the checker chain result. - (insert (if face (propertize message 'face face) message))) - (princ "\n")))) - (princ "\n")) - -(defun flycheck--get-next-checker-symbol (next) - "Get the checker symmbol of NEXT checker. - -NEXT should be either a cons (NEXT-CHECKER . LEVEL) or a -symbol." - (if (consp next) (cdr next) next)) - -(defun flycheck-get-next-checkers (checker) - "Return the immediate next checkers of CHECKER. - -This is a list of checker symbols. The error levels of the -`:next-checker' property are ignored." - (mapcar #'flycheck--get-next-checker-symbol - (flycheck-checker-get checker 'next-checkers))) - -(defun flycheck-all-next-checkers (checker) - "Return all checkers that may follow CHECKER. - -Return the transitive closure of the next-checker relation. The -return value is a list of checkers, not including CHECKER." - (let ((next-checkers) - (visited) - (queue (list checker))) - (while queue - (let ((c (pop queue))) - (push c visited) - (dolist (n (flycheck-get-next-checkers c)) - (push n next-checkers) - (unless (memq n visited) - (cl-pushnew n queue))))) - (seq-uniq next-checkers))) - -(defun flycheck--verify-next-checkers (checker) - "Return a verification result for the next checkers of CHECKER." - (-when-let (next (flycheck-get-next-checkers checker)) - (list - (flycheck-verification-result-new - :label "next checkers" - ;; We use `make-text-button' to preserve the button properties in the - ;; string - :message (mapconcat - (lambda (checker) - (make-text-button (symbol-name checker) nil - 'type 'help-flycheck-checker-doc - 'help-args (list checker))) - next - ", "))))) - -(defun flycheck--verify-print-header (desc buffer) - "Print a title with DESC for BUFFER in the current buffer. - -DESC is an arbitrary string containing a description, and BUFFER -is the buffer being verified. The name and the major mode mode -of BUFFER are printed. - -DESC and information about BUFFER are printed in the current -buffer." - (princ desc) - (insert (propertize (buffer-name buffer) 'face 'bold)) - (princ " in ") - (let ((mode (buffer-local-value 'major-mode buffer))) - (insert-button (symbol-name mode) - 'type 'help-function - 'help-args (list mode))) - (princ ":\n\n")) - -(defun flycheck--verify-print-footer (buffer) - "Print a footer for BUFFER in the current buffer. - -BUFFER is the buffer being verified." - (princ "Flycheck Mode is ") - (let ((enabled (buffer-local-value 'flycheck-mode buffer))) - (insert (propertize (if enabled "enabled" "disabled") - 'face (if enabled 'success '(warning bold))))) - (princ - (with-current-buffer buffer - ;; Use key binding state in the verified buffer to print the help. - (substitute-command-keys - ". Use \\[universal-argument] \\[flycheck-disable-checker] \ -to enable disabled checkers."))) - (save-excursion - (let ((end (point))) - (backward-paragraph) - (fill-region-as-paragraph (point) end))) - - (princ "\n\n--------------------\n\n") - (princ (format "Flycheck version: %s\n" (flycheck-version))) - (princ (format "Emacs version: %s\n" emacs-version)) - (princ (format "System: %s\n" system-configuration)) - (princ (format "Window system: %S\n" window-system))) - -(defun flycheck-verify-checker (checker) - "Check whether a CHECKER can be used in this buffer. - -Show a buffer listing possible problems that prevent CHECKER from -being used for the current buffer. - -Note: Do not use this function to check whether a syntax checker -is applicable from Emacs Lisp code. Use -`flycheck-may-use-checker' instead." - (interactive (list (flycheck-read-checker "Checker to verify: "))) - (unless (flycheck-valid-checker-p checker) - (user-error "%s is not a syntax checker" checker)) - - ;; Save the buffer to make sure that all predicates are good - ;; FIXME: this may be surprising to users, with unintended side-effects. - (when (and (buffer-file-name) (buffer-modified-p)) - (save-buffer)) - - (let ((buffer (current-buffer))) - (with-help-window (get-buffer-create " *Flycheck checker*") - (with-current-buffer standard-output - (flycheck--verify-print-header "Syntax checker in buffer " buffer) - (flycheck--verify-princ-checker checker buffer 'with-mm) - (if (with-current-buffer buffer (flycheck-may-use-checker checker)) - (insert (propertize - "Flycheck can use this syntax checker for this buffer.\n" - 'face 'success)) - (insert (propertize - "Flycheck cannot use this syntax checker for this buffer.\n" - 'face 'error))) - (insert "\n") - (flycheck--verify-print-footer buffer))))) - -(defun flycheck-verify-setup () - "Check whether Flycheck can be used in this buffer. - -Display a new buffer listing all syntax checkers that could be -applicable in the current buffer. For each syntax checkers, -possible problems are shown." - (interactive) - ;; Save to make sure checkers that only work on saved buffers will pass the - ;; verification - (when (and (buffer-file-name) (buffer-modified-p)) - (save-buffer)) - - (let* ((buffer (current-buffer)) - (first-checker (flycheck-get-checker-for-buffer)) - (valid-checkers - (remq first-checker - (seq-filter #'flycheck-may-use-checker flycheck-checkers))) - (valid-next-checkers - (when first-checker - (seq-intersection valid-checkers - (flycheck-all-next-checkers first-checker)))) - (valid-remaining (seq-difference valid-checkers valid-next-checkers)) - (other-checkers - (seq-difference (seq-filter #'flycheck-checker-supports-major-mode-p - flycheck-checkers) - (cons first-checker valid-checkers))) - (help-buffer (get-buffer-create " *Flycheck checkers*"))) - - ;; Print all applicable checkers for this buffer - (with-help-window help-buffer - (with-current-buffer standard-output - (flycheck--verify-print-header "Syntax checkers for buffer " buffer) - - (if first-checker - (progn - (princ "First checker to run:\n\n") - (flycheck--verify-princ-checker first-checker buffer)) - (insert (propertize - "No checker to run in this buffer.\n\n" - 'face '(bold error)))) - - (when valid-next-checkers - (princ - "Checkers that may run as part of the first checker's chain:\n\n") - (dolist (checker valid-next-checkers) - (flycheck--verify-princ-checker checker buffer))) - - (when valid-remaining - (princ "Checkers that could run if selected:\n\n") - (dolist (checker valid-remaining) - (flycheck--verify-princ-checker checker buffer nil 'with-select))) - - (when other-checkers - (princ - "Checkers that are compatible with this mode, \ -but will not run until properly configured:\n\n") - (dolist (checker other-checkers) - (flycheck--verify-princ-checker checker buffer))) - - ;; If we have no checkers at all, that's worth mentioning - (unless (or first-checker valid-checkers other-checkers) - (insert (propertize - "No checkers are available for this buffer.\n\n" - 'face '(bold error)))) - - (let ((unregistered-checkers - (seq-difference (flycheck-defined-checkers) flycheck-checkers))) - (when unregistered-checkers - (insert (propertize - "\nThe following syntax checkers are not registered:\n\n" - 'face '(bold warning))) - (dolist (checker unregistered-checkers) - (princ " - ") - (princ checker) - (princ "\n")) - (princ - "\nTry adding these syntax checkers to `flycheck-checkers'.\n"))) - - (flycheck--verify-print-footer buffer))) - - (with-current-buffer help-buffer - (setq-local revert-buffer-function - (lambda (_ignore-auto _noconfirm) - (with-current-buffer buffer (flycheck-verify-setup))))))) - - -;;; Predicates for generic syntax checkers -(defun flycheck-buffer-saved-p (&optional buffer) - "Determine whether BUFFER is saved to a file. - -BUFFER is the buffer to check. If omitted or nil, use the -current buffer as BUFFER. - -Return non-nil if the BUFFER is backed by a file, and not -modified, or nil otherwise." - (let ((file-name (buffer-file-name buffer))) - (and file-name (file-exists-p file-name) (not (buffer-modified-p buffer))))) - - -;;; Extending generic checkers -(defun flycheck-remove-next-checker (checker next) - "After CHECKER remove a NEXT checker. - -CHECKER is a syntax checker symbol, from which to remove NEXT -checker. - -NEXT is a cons or a symbol, as documented in -`flycheck-add-next-checker'." - (unless (flycheck-valid-checker-p checker) - (error "%s is not a valid syntax checker" checker)) - (let* ((next-symbol (flycheck--get-next-checker-symbol next))) - (setf - (flycheck-checker-get checker 'next-checkers) - (seq-remove - (lambda (next) (eq (flycheck--get-next-checker-symbol next) next-symbol)) - (flycheck-checker-get checker 'next-checkers))))) - -(defun flycheck-add-next-checker (checker next &optional append) - "After CHECKER add a NEXT checker. - -CHECKER is a syntax checker symbol, to which to add NEXT checker. - -NEXT is a cons cell `(LEVEL . NEXT-CHECKER)'. NEXT-CHECKER is a -symbol denoting the syntax checker to run after CHECKER. LEVEL -is an error level. NEXT-CHECKER will only be used if there is no -current error whose level is more severe than LEVEL. LEVEL may -also be t, in which case NEXT-CHECKER is used regardless of the -current errors. - -NEXT can also be a syntax checker symbol only, which is -equivalent to `(t . NEXT)'. - -NEXT-CHECKER is prepended before other next checkers, unless -APPEND is non-nil." - (unless (flycheck-valid-checker-p checker) - (error "%s is not a valid syntax checker" checker)) - (flycheck-validate-next-checker next 'strict) - (flycheck-remove-next-checker checker next) - (let ((next-checkers (flycheck-checker-get checker 'next-checkers))) - (setf (flycheck-checker-get checker 'next-checkers) - (if append (append next-checkers (list next)) - (cons next next-checkers))))) - -(defun flycheck-add-mode (checker mode) - "To CHECKER add a new major MODE. - -CHECKER and MODE are symbols denoting a syntax checker and a -major mode respectively. - -Add MODE to the `:modes' property of CHECKER, so that CHECKER -will be used in buffers with MODE." - (unless (flycheck-valid-checker-p checker) - (error "%s is not a valid syntax checker" checker)) - (unless (symbolp mode) - (error "%s is not a symbol" mode)) - (push mode (flycheck-checker-get checker 'modes))) - - -;;; Generic syntax checks -(cl-defstruct (flycheck-syntax-check - (:constructor flycheck-syntax-check-new)) - "Structure for storing syntax check state. - -Slots: - -`buffer' - The buffer being checked. - -`checker' - The syntax checker being used. - -`context' - The context object. - -`working-directory' - Working directory for the syntax checker. Serve as a value for - `default-directory' for a checker." - buffer checker context working-directory) - -(defun flycheck-syntax-check-start (syntax-check callback) - "Start a SYNTAX-CHECK with CALLBACK." - (let ((checker (flycheck-syntax-check-checker syntax-check)) - (default-directory - (flycheck-syntax-check-working-directory syntax-check))) - (setf (flycheck-syntax-check-context syntax-check) - (funcall (flycheck-checker-get checker 'start) checker callback)))) - -(defun flycheck-syntax-check-interrupt (syntax-check) - "Interrupt a SYNTAX-CHECK." - (let* ((checker (flycheck-syntax-check-checker syntax-check)) - (interrupt-fn (flycheck-checker-get checker 'interrupt)) - (context (flycheck-syntax-check-context syntax-check))) - (when interrupt-fn - (funcall interrupt-fn checker context)))) - - -;;; Syntax checking mode - -(defvar flycheck-mode-map - (let ((map (make-sparse-keymap))) - (define-key map flycheck-keymap-prefix flycheck-command-map) - ;; We place the menu under a custom menu key. Since this menu key is not - ;; present in the menu of the global map, no top-level menu entry is added - ;; to the global menu bar. However, it still appears on the mode line - ;; lighter. - (define-key map [menu-bar flycheck] flycheck-mode-menu-map) - map) - "Keymap of command `flycheck-mode'.") - -(defvar-local flycheck-old-next-error-function nil - "Remember the old `next-error-function'.") - -(defconst flycheck-hooks-alist - '( - ;; Handle events that may start automatic syntax checks - (after-save-hook . flycheck-handle-save) - (after-change-functions . flycheck-handle-change) - ;; Handle events that may triggered pending deferred checks - (window-configuration-change-hook . flycheck-perform-deferred-syntax-check) - (post-command-hook . flycheck-perform-deferred-syntax-check) - ;; Teardown Flycheck whenever the buffer state is about to get lost, to - ;; clean up temporary files and directories. - (kill-buffer-hook . flycheck-teardown) - (change-major-mode-hook . flycheck-teardown) - (before-revert-hook . flycheck-teardown) - ;; Update the error list if necessary - (post-command-hook . flycheck-error-list-update-source) - (post-command-hook . flycheck-error-list-highlight-errors) - ;; Display errors. Show errors at point after commands (like movements) and - ;; when Emacs gets focus. Cancel the display timer when Emacs looses focus - ;; (as there's no need to display errors if the user can't see them), and - ;; hide the error buffer (for large error messages) if necessary. Note that - ;; the focus hooks only work on Emacs 24.4 and upwards, but since undefined - ;; hooks are perfectly ok we don't need a version guard here. They'll just - ;; not work silently. - (post-command-hook . flycheck-maybe-display-error-at-point-soon) - (focus-in-hook . flycheck-display-error-at-point-soon) - (focus-out-hook . flycheck-cancel-error-display-error-at-point-timer) - (post-command-hook . flycheck-hide-error-buffer) - ;; Immediately show error popups when navigating to an error - (next-error-hook . flycheck-display-error-at-point)) - "Hooks which Flycheck needs to hook in. - -The `car' of each pair is a hook variable, the `cdr' a function -to be added or removed from the hook variable if Flycheck mode is -enabled and disabled respectively.") - -;;;###autoload -(define-minor-mode flycheck-mode - "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}" - :init-value nil - :keymap flycheck-mode-map - :lighter flycheck-mode-line - :after-hook (flycheck-buffer-automatically 'mode-enabled 'force-deferred) - (cond - (flycheck-mode - (flycheck-clear) - - (pcase-dolist (`(,hook . ,fn) (reverse flycheck-hooks-alist)) - (add-hook hook fn nil 'local)) - - (setq flycheck-old-next-error-function - (if flycheck-standard-error-navigation - next-error-function - :unset)) - (when flycheck-standard-error-navigation - (setq next-error-function #'flycheck-next-error-function)) - - ;; This hook must be added globally since otherwise we cannot - ;; detect a change from a buffer where Flycheck is enabled to a - ;; buffer where Flycheck is not enabled, and therefore cannot - ;; notice that there has been any change when the user switches - ;; back to the buffer where Flycheck is enabled. - (add-hook 'buffer-list-update-hook #'flycheck-handle-buffer-switch)) - (t - (unless (eq flycheck-old-next-error-function :unset) - (setq next-error-function flycheck-old-next-error-function)) - - (pcase-dolist (`(,hook . ,fn) flycheck-hooks-alist) - (remove-hook hook fn 'local)) - - (flycheck-teardown)))) - - -;;; Syntax checker selection for the current buffer -(defun flycheck-get-checker-for-buffer () - "Find the checker for the current buffer. - -Use the selected checker for the current buffer, if any, -otherwise search for the best checker from `flycheck-checkers'. - -Return checker if there is a checker for the current buffer, or -nil otherwise." - (if flycheck-checker - (when (flycheck-may-use-checker flycheck-checker) - flycheck-checker) - (seq-find #'flycheck-may-use-checker flycheck-checkers))) - -(defun flycheck-get-next-checker-for-buffer (checker) - "Get the checker to run after CHECKER for the current buffer." - (let ((next (seq-find #'flycheck-may-use-next-checker - (flycheck-checker-get checker 'next-checkers)))) - (when next - (if (symbolp next) next (cdr next))))) - -(defun flycheck-select-checker (checker) - "Select CHECKER for the current buffer. - -CHECKER is a syntax checker symbol (see `flycheck-checkers') or -nil. In the former case, use CHECKER for the current buffer, -otherwise deselect the current syntax checker (if any) and use -automatic checker selection via `flycheck-checkers'. - -If called interactively prompt for CHECKER. With prefix arg -deselect the current syntax checker and enable automatic -selection again. - -Set `flycheck-checker' to CHECKER and automatically start a new -syntax check if the syntax checker changed. - -CHECKER will be used, even if it is not contained in -`flycheck-checkers', or if it is disabled via -`flycheck-disabled-checkers'." - (interactive - (if current-prefix-arg - (list nil) - (list (flycheck-read-checker "Select checker: " - (flycheck-get-checker-for-buffer))))) - (when (not (eq checker flycheck-checker)) - (unless (or (not checker) (flycheck-may-use-checker checker)) - (flycheck-verify-checker checker) - (user-error "Can't use syntax checker %S in this buffer" checker)) - (setq flycheck-checker checker) - (when flycheck-mode - (flycheck-buffer)))) - -(defun flycheck-disable-checker (checker &optional enable) - "Interactively disable CHECKER for the current buffer. - -Interactively, prompt for a syntax checker to disable, and add -the syntax checker to the buffer-local value of -`flycheck-disabled-checkers'. - -With non-nil ENABLE or with prefix arg, prompt for a disabled -syntax checker and re-enable it by removing it from the -buffer-local value of `flycheck-disabled-checkers'." - (declare - (interactive-only "Directly set `flycheck-disabled-checkers' instead")) - (interactive - (let* ((enable current-prefix-arg) - (candidates (if enable - (append flycheck-disabled-checkers - flycheck--automatically-disabled-checkers) - flycheck-checkers)) - (prompt (if enable "Enable syntax checker: " - "Disable syntax checker: "))) - (when (and enable (not candidates)) - (user-error "No syntax checkers disabled in this buffer")) - (list (flycheck-read-checker prompt nil nil candidates) enable))) - (unless checker - (user-error "No syntax checker given")) - (if enable - ;; We must use `remq' instead of `delq', because we must _not_ modify the - ;; list. Otherwise we could potentially modify the global default value, - ;; in case the list is the global default. - (progn - (when (memq checker flycheck-disabled-checkers) - (setq flycheck-disabled-checkers - (remq checker flycheck-disabled-checkers)) - (flycheck-buffer)) - (when (memq checker flycheck--automatically-disabled-checkers) - (setq flycheck--automatically-disabled-checkers - (remq checker flycheck--automatically-disabled-checkers)) - (flycheck-buffer))) - (unless (memq checker flycheck-disabled-checkers) - (push checker flycheck-disabled-checkers) - (flycheck-buffer)))) - - -;;; Syntax checks for the current buffer -(defvar-local flycheck-current-syntax-check nil - "The current syntax check in the this buffer.") -(put 'flycheck-current-syntax-check 'permanent-local t) - -(defun flycheck-start-current-syntax-check (checker) - "Start a syntax check in the current buffer with CHECKER. - -Set `flycheck-current-syntax-check' accordingly." - ;; Allocate the current syntax check *before* starting it. This allows for - ;; synchronous checks, which call the status callback immediately in their - ;; start function. - (let* ((check - (flycheck-syntax-check-new - :buffer (current-buffer) - :checker checker - :context nil - :working-directory (flycheck-compute-working-directory checker))) - (callback (flycheck-buffer-status-callback check))) - (setq flycheck-current-syntax-check check) - (flycheck-report-status 'running) - (flycheck-syntax-check-start check callback))) - -(defun flycheck-running-p () - "Determine whether a syntax check is running in the current buffer." - (not (null flycheck-current-syntax-check))) - -(defun flycheck-stop () - "Stop any ongoing syntax check in the current buffer." - (when (flycheck-running-p) - (flycheck-syntax-check-interrupt flycheck-current-syntax-check) - ;; Remove the current syntax check, to reset Flycheck into a non-running - ;; state, and to make `flycheck-report-buffer-checker-status' ignore any - ;; status reports from the current syntax check. - (setq flycheck-current-syntax-check nil) - (flycheck-report-status 'interrupted))) - -(defun flycheck-buffer-status-callback (syntax-check) - "Create a status callback for SYNTAX-CHECK in the current buffer." - (lambda (&rest args) - (apply #'flycheck-report-buffer-checker-status - syntax-check args))) - -(defun flycheck-buffer () - "Start checking syntax in the current buffer. - -Get a syntax checker for the current buffer with -`flycheck-get-checker-for-buffer', and start it." - (interactive) - (flycheck-clean-deferred-check) - (if flycheck-mode - (unless (flycheck-running-p) - ;; Clear error list and mark all overlays for deletion. We do not - ;; delete all overlays immediately to avoid excessive re-displays and - ;; flickering, if the same errors gets highlighted again after the check - ;; completed. - (run-hooks 'flycheck-before-syntax-check-hook) - (flycheck-clear-errors) - (flycheck-mark-all-overlays-for-deletion) - (condition-case err - (let* ((checker (flycheck-get-checker-for-buffer))) - (if checker - (flycheck-start-current-syntax-check checker) - (flycheck-clear) - (flycheck-report-status 'no-checker))) - (error - (flycheck-report-failed-syntax-check) - (signal (car err) (cdr err))))) - (user-error "Flycheck mode disabled"))) - -(defun flycheck-report-buffer-checker-status - (syntax-check status &optional data) - "In BUFFER, report a SYNTAX-CHECK STATUS with DATA. - -SYNTAX-CHECK is the `flycheck-syntax-check' which reported -STATUS. STATUS denotes the status of CHECKER, with an optional -DATA. STATUS may be one of the following symbols: - -`errored' - The syntax checker has errored. DATA is an optional error - message. - - This report finishes the current syntax check. - -`interrupted' - The syntax checker was interrupted. DATA is ignored. - - This report finishes the current syntax check. - -`finished' - The syntax checker has finished with a proper error report - for the current buffer. DATA is the (potentially empty) - list of `flycheck-error' objects reported by the syntax - check. - - This report finishes the current syntax check. - -`suspicious' - The syntax checker encountered a suspicious state, which the - user needs to be informed about. DATA is an optional - message. - -A syntax checker _must_ report a status at least once with any -symbol that finishes the current syntax checker. Otherwise -Flycheck gets stuck with the current syntax check. - -If CHECKER is not the currently used syntax checker in -`flycheck-current-syntax-check', the status report is largely -ignored. Notably, any errors reported by the checker are -discarded." - (let ((buffer (flycheck-syntax-check-buffer syntax-check))) - ;; Ignore the status report if the buffer is gone, or if this syntax check - ;; isn't the current one in buffer (which can happen if this is an old - ;; report of an interrupted syntax check, and a new syntax check was started - ;; since this check was interrupted) - (when (and (buffer-live-p buffer) - (eq syntax-check - (buffer-local-value 'flycheck-current-syntax-check buffer))) - (with-current-buffer buffer - (let ((checker (flycheck-syntax-check-checker syntax-check))) - (pcase status - ((or `errored `interrupted) - (flycheck-report-failed-syntax-check status) - (when (eq status 'errored) - ;; In case of error, show the error message - (message "Error from syntax checker %s: %s" - checker (or data "UNKNOWN!")))) - (`suspicious - (when flycheck-mode - (message "Suspicious state from syntax checker %s: %s" - checker (or data "UNKNOWN!"))) - (flycheck-report-status 'suspicious)) - (`finished - (when flycheck-mode - ;; Only report errors from the checker if Flycheck Mode is - ;; still enabled. - (flycheck-finish-current-syntax-check - data - (flycheck-syntax-check-working-directory syntax-check)))) - (_ - (error "Unknown status %s from syntax checker %s" - status checker)))))))) - -(defun flycheck-finish-current-syntax-check (errors working-dir) - "Finish the current syntax-check in the current buffer with ERRORS. - -ERRORS is a list of `flycheck-error' objects reported by the -current syntax check in `flycheck-current-syntax-check'. - -Report all ERRORS and potentially start any next syntax checkers. - -If the current syntax checker reported excessive errors, it is -disabled via `flycheck-disable-excessive-checker' for subsequent -syntax checks. - -Relative file names in ERRORS will be expanded relative to -WORKING-DIR." - (let* ((syntax-check flycheck-current-syntax-check) - (checker (flycheck-syntax-check-checker syntax-check)) - (errors (flycheck-relevant-errors - (flycheck-fill-and-expand-error-file-names - (flycheck-filter-errors - (flycheck-assert-error-list-p errors) checker) - working-dir)))) - (unless (flycheck-disable-excessive-checker checker errors) - (flycheck-report-current-errors errors)) - (let ((next-checker (flycheck-get-next-checker-for-buffer checker))) - (if next-checker - (flycheck-start-current-syntax-check next-checker) - (setq flycheck-current-syntax-check nil) - (flycheck-report-status 'finished) - ;; Delete overlays only after the very last checker has run, to avoid - ;; flickering on intermediate re-displays - (flycheck-delete-marked-overlays) - (flycheck-error-list-refresh) - (run-hooks 'flycheck-after-syntax-check-hook) - (when (eq (current-buffer) (window-buffer)) - (flycheck-display-error-at-point)) - ;; Immediately try to run any pending deferred syntax check, which - ;; were triggered by intermediate automatic check event, to make sure - ;; that we quickly refine outdated error information - (flycheck-perform-deferred-syntax-check))))) - -(defun flycheck-disable-excessive-checker (checker errors) - "Disable CHECKER if it reported excessive ERRORS. - -If ERRORS has more items than `flycheck-checker-error-threshold', -add CHECKER to `flycheck--automatically-disabled-checkers', and -show a warning. - -Return t when CHECKER was disabled, or nil otherwise." - (when (and flycheck-checker-error-threshold - (> (length errors) flycheck-checker-error-threshold)) - ;; Disable CHECKER for this buffer - ;; (`flycheck--automatically-disabled-checkers' is a local variable). - (lwarn '(flycheck syntax-checker) :warning - (substitute-command-keys - "Syntax checker %s reported too many errors (%s) and is disabled. -Use `\\[customize-variable] RET flycheck-checker-error-threshold' to -change the threshold or `\\[universal-argument] \ -\\[flycheck-disable-checker]' to re-enable the checker.") - checker (length errors)) - (push checker flycheck--automatically-disabled-checkers) - t)) - -(defun flycheck-clear (&optional shall-interrupt) - "Clear all errors in the current buffer. - -With prefix arg or SHALL-INTERRUPT non-nil, also interrupt the -current syntax check." - (interactive "P") - (when shall-interrupt - (flycheck-stop)) - (flycheck-delete-all-overlays) - (flycheck-clear-errors) - (flycheck-error-list-refresh) - (flycheck-hide-error-buffer)) - -(defun flycheck--empty-variables () - "Empty variables used by Flycheck." - (kill-local-variable 'flycheck--file-truename-cache) - (kill-local-variable 'flycheck--idle-trigger-timer) - (kill-local-variable 'flycheck--idle-trigger-conditions) - (kill-local-variable 'flycheck--last-error-display-tick)) - -(defun flycheck-teardown (&optional ignore-global) - "Teardown Flycheck in the current buffer. - -Completely clear the whole Flycheck state. Remove overlays, kill -running checks, and empty all variables used by Flycheck. - -Unless optional argument IGNORE-GLOBAL is non-nil, check to see -if no more Flycheck buffers remain (aside from the current -buffer), and if so then clean up global hooks." - (flycheck-safe-delete-temporaries) - (flycheck-stop) - (flycheck-clean-deferred-check) - (flycheck-clear) - (flycheck-cancel-error-display-error-at-point-timer) - (flycheck--clear-idle-trigger-timer) - (flycheck--empty-variables) - (unless (or ignore-global - (seq-some (lambda (buf) - (and (not (equal buf (current-buffer))) - (buffer-local-value 'flycheck-mode buf))) - (buffer-list))) - (flycheck-global-teardown 'ignore-local))) - - -;;; Automatic syntax checking in a buffer -(defun flycheck-may-check-automatically (&rest conditions) - "Determine whether the buffer may be checked under one of CONDITIONS. - -Read-only buffers may never be checked automatically. - -If CONDITIONS are given, determine whether syntax may be checked -under at least one of them, according to -`flycheck-check-syntax-automatically'." - (and (not (or buffer-read-only (flycheck-ephemeral-buffer-p))) - (file-exists-p default-directory) - (or (not conditions) - (seq-some - (lambda (condition) - (memq condition flycheck-check-syntax-automatically)) - conditions)))) - -(defvar-local flycheck--idle-trigger-timer nil - "Timer used to trigger a syntax check after an idle delay.") - -(defvar-local flycheck--idle-trigger-conditions nil - "List of conditions under which an idle syntax check will be triggered. -This will be some subset of the allowable values for -`flycheck-check-syntax-automatically'. - -For example, if the user switches to a buffer and then makes an -edit, this list will have the values `idle-change' and -`idle-buffer-switch' in it, at least until the idle timer -expires.") - -(defun flycheck-buffer-automatically (&optional condition force-deferred) - "Automatically check syntax at CONDITION. - -Syntax is not checked if `flycheck-may-check-automatically' -returns nil for CONDITION. (CONDITION may be a single condition -or a list of them.) - -The syntax check is deferred if FORCE-DEFERRED is non-nil, or if -`flycheck-must-defer-check' returns t." - (when (and flycheck-mode (if (listp condition) - (apply #'flycheck-may-check-automatically - condition) - (flycheck-may-check-automatically condition))) - (flycheck--clear-idle-trigger-timer) - (setq flycheck--idle-trigger-conditions nil) - (if (or force-deferred (flycheck-must-defer-check)) - (flycheck-buffer-deferred) - (with-demoted-errors "Error while checking syntax automatically: %S" - (flycheck-buffer))))) - -(defun flycheck--clear-idle-trigger-timer () - "Clear the idle trigger timer." - (when flycheck--idle-trigger-timer - (cancel-timer flycheck--idle-trigger-timer) - (setq flycheck--idle-trigger-timer nil))) - -(defun flycheck--handle-idle-trigger (buffer) - "Run a syntax check in BUFFER if appropriate. -This function is called by `flycheck--idle-trigger-timer'." - (let ((current-buffer (current-buffer))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (unless (or flycheck-buffer-switch-check-intermediate-buffers - (eq buffer current-buffer)) - (setq flycheck--idle-trigger-conditions - (delq 'idle-buffer-switch - flycheck--idle-trigger-conditions))) - (when flycheck--idle-trigger-conditions - (flycheck-buffer-automatically flycheck--idle-trigger-conditions) - (setq flycheck--idle-trigger-conditions nil)))))) - -(defun flycheck-handle-change (beg end _len) - "Handle a buffer change between BEG and END. - -BEG and END mark the beginning and end of the change text. _LEN -is ignored. - -Start a syntax check if a new line has been inserted into the -buffer." - ;; Save and restore the match data, as recommended in (elisp)Change Hooks - (save-match-data - (when flycheck-mode - (if (string-match-p (rx "\n") (buffer-substring beg end)) - (flycheck-buffer-automatically 'new-line 'force-deferred) - (when (memq 'idle-change flycheck-check-syntax-automatically) - (flycheck--clear-idle-trigger-timer) - (cl-pushnew 'idle-change flycheck--idle-trigger-conditions) - (setq flycheck--idle-trigger-timer - (run-at-time flycheck-idle-change-delay nil - #'flycheck--handle-idle-trigger - (current-buffer)))))))) - -(defvar flycheck--last-buffer (current-buffer) - "The current buffer or the buffer that was previously current. -This is usually equal to the current buffer, unless the user just -switched buffers. After a buffer switch, it is the previous -buffer.") - -(defun flycheck-handle-buffer-switch () - "Handle a possible switch to another buffer. - -If a buffer switch actually happened, schedule a syntax check." - ;; Switching buffers here is weird, but unfortunately necessary. It - ;; turns out that `with-temp-buffer' triggers - ;; `buffer-list-update-hook' twice, and the value of - ;; `current-buffer' is bogus in one of those triggers (the one just - ;; after the temp buffer is killed). If we rely on the bogus value, - ;; Flycheck will think that the user is switching back and forth - ;; between different buffers during the `with-temp-buffer' call - ;; (note: two different normal buffers, not the current buffer and - ;; the temp buffer!), and that would trigger spurious syntax checks. - ;; It seems that reading (window-buffer) gets us the correct current - ;; buffer in all important real-life situations (although it doesn't - ;; necessarily catch uses of `set-buffer'). - (with-current-buffer (window-buffer) - (unless (or (equal flycheck--last-buffer (current-buffer)) - ;; Don't bother keeping track of changes to and from - ;; the minibuffer, as they will never require us to - ;; run a syntax check. - (minibufferp)) - (setq flycheck--last-buffer (current-buffer)) - (when (and flycheck-mode - (memq 'idle-buffer-switch flycheck-check-syntax-automatically)) - (flycheck--clear-idle-trigger-timer) - (cl-pushnew 'idle-buffer-switch flycheck--idle-trigger-conditions) - (setq flycheck--idle-trigger-timer - (run-at-time flycheck-idle-buffer-switch-delay nil - #'flycheck--handle-idle-trigger - (current-buffer))))))) - -(defun flycheck-handle-save () - "Handle a save of the buffer." - (flycheck-buffer-automatically 'save)) - - -;;; Deferred syntax checking -(defvar-local flycheck-deferred-syntax-check nil - "If non-nil, a deferred syntax check is pending.") - -(defun flycheck-must-defer-check () - "Determine whether the syntax check has to be deferred. - -A check has to be deferred if the buffer is not visible, or if the buffer is -currently being reverted. - -Return t if the check is to be deferred, or nil otherwise." - (or (not (get-buffer-window)) - ;; We defer the syntax check if Flycheck is already running, to - ;; immediately start a new syntax check after the current one finished, - ;; because the result of the current check will most likely be outdated by - ;; the time it is finished. - (flycheck-running-p) - ;; We must defer checks while a buffer is being reverted, to avoid race - ;; conditions while the buffer contents are being restored. - revert-buffer-in-progress-p)) - -(defun flycheck-deferred-check-p () - "Determine whether the current buffer has a deferred check. - -Return t if so, or nil otherwise." - flycheck-deferred-syntax-check) - -(defun flycheck-buffer-deferred () - "Defer syntax check for the current buffer." - (setq flycheck-deferred-syntax-check t)) - -(defun flycheck-clean-deferred-check () - "Clean a deferred syntax checking state." - (setq flycheck-deferred-syntax-check nil)) - -(defun flycheck-perform-deferred-syntax-check () - "Perform the deferred syntax check." - (when (flycheck-deferred-check-p) - (flycheck-clean-deferred-check) - (flycheck-buffer-automatically))) - - -;;; Syntax checking in all buffers -(defun flycheck-may-enable-mode () - "Determine whether Flycheck mode may be enabled. - -Flycheck mode is not enabled for - -- the minibuffer, -- `fundamental-mode' -- major modes whose `mode-class' property is `special', -- ephemeral buffers (see `flycheck-ephemeral-buffer-p'), -- encrypted buffers (see `flycheck-encrypted-buffer-p'), -- remote files (see `file-remote-p'), -- and major modes excluded by `flycheck-global-modes'. - -Return non-nil if Flycheck mode may be enabled, and nil -otherwise." - (and (pcase flycheck-global-modes - ;; Whether `major-mode' is disallowed by `flycheck-global-modes' - (`t t) - (`(not . ,modes) (not (memq major-mode modes))) - (modes (memq major-mode modes))) - (not (or (minibufferp) - (eq major-mode 'fundamental-mode) - (eq (get major-mode 'mode-class) 'special) - (flycheck-ephemeral-buffer-p) - (flycheck-encrypted-buffer-p) - (and (buffer-file-name) - (file-remote-p (buffer-file-name) 'method)))))) - -(defun flycheck-mode-on-safe () - "Enable command `flycheck-mode' if it is safe to do so. - -Command `flycheck-mode' is only enabled if -`flycheck-may-enable-mode' returns a non-nil result." - (when (flycheck-may-enable-mode) - (flycheck-mode))) - -;;;###autoload -(define-globalized-minor-mode global-flycheck-mode flycheck-mode - flycheck-mode-on-safe - :init-value nil - ;; Do not expose Global Flycheck Mode on customize interface, because the - ;; interaction between package.el and customize is currently broken. See - ;; https://github.com/flycheck/flycheck/issues/595 - - ;; :require 'flycheck :group - ;; 'flycheck - ) - -(defun flycheck-global-teardown (&optional ignore-local) - "Teardown Flycheck in all buffers. - -Completely clear the whole Flycheck state in all buffers, stop -all running checks, remove all temporary files, and empty all -variables of Flycheck. - -Also remove global hooks. (If optional argument IGNORE-LOCAL is -non-nil, then only do this and skip per-buffer teardown.)" - (unless ignore-local - (dolist (buffer (buffer-list)) - (with-current-buffer buffer - (when flycheck-mode - (flycheck-teardown 'ignore-global))))) - (remove-hook 'buffer-list-update-hook #'flycheck-handle-buffer-switch)) - -;; Clean up the entire state of Flycheck when Emacs is killed, to get rid of any -;; pending temporary files. -(add-hook 'kill-emacs-hook #'flycheck-global-teardown) - - -;;; Errors from syntax checks -(cl-defstruct (flycheck-error - (:constructor nil) - (:constructor - flycheck-error-new - (&key - line column end-line end-column - buffer checker filename message level id group - &aux (-end-line end-line) (-end-column end-column))) - (:constructor - flycheck-error-new-at - (line - column - &optional level message - &key end-line end-column checker id group - (filename (buffer-file-name)) (buffer (current-buffer)) - &aux (-end-line end-line) (-end-column end-column))) - (:constructor - flycheck-error-new-at-pos - (pos - &optional level message - &key end-pos checker id group - (filename (buffer-file-name)) (buffer (current-buffer)) - &aux - ((line . column) - (if pos (flycheck-line-column-at-pos pos) - '(nil . nil))) - ((-end-line . -end-column) - (if end-pos (flycheck-line-column-at-pos end-pos) - '(nil . nil)))))) - "Structure representing an error reported by a syntax checker. -Slots: - -`buffer' - The buffer that the error was reported for, as buffer object. - -`checker' - The syntax checker which reported this error, as symbol. - -`filename' - The file name the error refers to, as string. - -`line' - The line on which the error starts, as number. - -`column' (optional) - The column at which the error starts, as number. - - For compatibility with external tools and unlike Emacs - itself (e.g. in Compile Mode) Flycheck uses _1-based_ - columns: The first character on a line is column 1. - - Occasionally some tools try to proactively adapt to Emacs - and emit 0-based columns automatically. In these cases, the - columns must be adjusted for Flycheck, see - `flycheck-increment-error-columns'. - - If nil, the whole line is highlighted. - -`end-line' (optional) - The line on which the error ends. If nil, this is computed according to - `flycheck-highlighting-mode'. - -`end-column' - The column at which the error ends. If nil, this is computed according to - `flycheck-highlighting-mode'. Error intervals are right-open: the - end-column points to the first character not included in the error. For - example, 1:1 is an empty range. and in \"line-number-at-pos\", the range - 6:12 covers the word \"number\". - -`message' (optional) - The error message as a string, if any. - -`level' - The error level, as either `info', `warning' or `error'. - -`id' (optional) - An ID identifying the kind of error. - -`group' (optional) - A symbol identifying the group the error belongs to. - - Some tools will emit multiple errors that relate to the same - issue (e.g., lifetime errors in Rust). All related errors - collected by a checker should have the same `group` value, - in order to be able to present them to the user. - - See `flycheck-related-errors`." - buffer checker filename line column message level id group - ;; The fields below are at the end of the record to preserve backwards - ;; compatibility; see https://github.com/flycheck/flycheck/pull/1400 and - ;; https://lists.gnu.org/archive/html/emacs-devel/2018-07/msg00436.html - -end-line -end-column) - -;; These accessors are defined for backwards compatibility -;; FIXME: Clean up once package.el learns how to recompile dependencies. - -(defun flycheck-error-end-line (err) - "Return the end line of a Flycheck error ERR." - (condition-case nil (flycheck-error--end-line err) - (args-out-of-range nil))) - -(defun flycheck-error-end-column (err) - "Return the end column of a Flycheck error ERR." - (condition-case nil (flycheck-error--end-column err) - (args-out-of-range nil))) - -(defun flycheck-error--set-end-line (err line) - "Set the end line of a Flycheck error ERR to LINE." - (condition-case nil (setf (flycheck-error--end-line err) line) - (args-out-of-range nil))) - -(defun flycheck-error--set-end-column (err column) - "Set the end column of a Flycheck error ERR to COLUMN." - (condition-case nil (setf (flycheck-error--end-column err) column) - (args-out-of-range nil))) - -(gv-define-simple-setter flycheck-error-end-line - flycheck-error--set-end-line) -(gv-define-simple-setter flycheck-error-end-column - flycheck-error--set-end-column) - -(defmacro flycheck-error-with-buffer (err &rest forms) - "Switch to the buffer of ERR and evaluate FORMS. - -If the buffer of ERR is not live, FORMS are not evaluated." - (declare (indent 1) (debug t)) - `(when (buffer-live-p (flycheck-error-buffer ,err)) - (with-current-buffer (flycheck-error-buffer ,err) - ,@forms))) - -(defun flycheck--exact-region (line col end-line end-col) - "Get the region of range LINE, COL, END-LINE, END-COL. - -Return a cons cell `(BEG . END)'. If the input range is empty, -it is expanded to cover at least one character so that END is -always greater than BEG." - (let ((beg (flycheck-line-column-to-position line col)) - (end (flycheck-line-column-to-position end-line end-col))) - (cond - ((< beg end) (cons beg end)) - ((= end (point-max)) (cons (1- end) end)) - (t (cons end (1+ end)))))) - -(defun flycheck--line-region (pos) - "Get the line region of position POS. - -Return a cons cell `(BEG . END)' where BEG is the first -non-whitespace character on the line ERR refers to, and END the -end of the line." - (save-excursion - (goto-char pos) - (forward-line 0) - (let ((bol (point)) - (end (line-end-position))) - ;; Move to the beginning of this line's indentation, similar to - ;; `back-to-indentation' - (skip-syntax-forward " " end) - (backward-prefix-chars) - ;; If the current line is blank, highlight it in full; if it's - ;; empty, include the previous line break character(s) to have - ;; any region at all (when called with 0, `line-end-position' - ;; gives us the end of the previous line). - (cons (if (eolp) (if (= bol end) (line-end-position 0) bol) (point)) - end)))) - -(defun flycheck--column-region (pos) - "Get the column region of position POS. - -Return a cons cell `(BEG . END)' where BEG is the character -before the column, and END the actual column." - (save-excursion - (goto-char pos) - ;; (eobp): No enough lines in the buffer - (if (eobp) (cons (1- (point-max)) (point-max)) - (cons pos (1+ pos))))) - -(defun flycheck-bounds-of-thing-at-point (thing pos) - "Get the region of THING at position POS. - -THING is a understood by `thing-at-point'. - -Return a cons cell `(BEG . END)' where BEG is the beginning of -the THING at the column, and END the end of the THING." - (save-excursion - (goto-char pos) - (bounds-of-thing-at-point thing))) - -(defun flycheck--approximate-region (line column mode) - "Compute the region of LINE, COLUMN based on MODE." - (let* ((beg (flycheck-line-column-to-position line (or column 1)))) - (if (or (null column) - (eq mode 'lines)) - (flycheck--line-region beg) - (or (pcase mode - (`symbols - ;; Ensure that we're on a word or symbol. See - ;; https://github.com/flycheck/flycheck/issues/1519 - (and (< beg (point-max)) - (memq (char-syntax (char-after beg)) '(?w ?_)) - (flycheck-bounds-of-thing-at-point 'symbol beg))) - (`sexps - (flycheck-bounds-of-thing-at-point 'sexp beg))) - (flycheck--column-region beg))))) - -(defun flycheck-error-region-for-mode (err mode) - "Get the region of ERR for the highlighting MODE. - -ERR is a Flycheck error. If its position is fully specified, use -that to compute a region; otherwise, use MODE, as documented in -`flycheck-highlighting-mode'. If MODE is nil, signal an error." - (flycheck-error-with-buffer err - (save-excursion - (save-restriction - (widen) - ;; Ignoring fields speeds up calls to `line-end-position'. - (let* ((inhibit-field-text-motion t) - (line (flycheck-error-line err)) - (column (flycheck-error-column err)) - (end-line (or (flycheck-error-end-line err) line)) - (end-column (flycheck-error-end-column err))) - (if (and line column end-line end-column) - (flycheck--exact-region line column end-line end-column) - (flycheck--approximate-region line column mode))))))) - -(defun flycheck-error-pos (err) - "Get the buffer position of ERR. - -ERR is a Flycheck error whose position to get. - -The error position is the error column, or the first -non-whitespace character of the error line, if ERR has no error column." - (car (flycheck-error-region-for-mode err 'columns))) - -(defun flycheck-error-format-message-and-id (err) - "Format the message and id of ERR as human-readable string." - (let ((id (flycheck-error-id err)) - (filename (flycheck-error-filename err))) - (concat (when (and filename (not (equal filename (buffer-file-name)))) - (format "In \"%s\":\n" - (file-relative-name filename default-directory))) - (flycheck-error-message err) - (when id - (format " [%s]" id))))) - -(defun flycheck-error-format-position (err) - "Format the position of ERR as a human-readable string." - (let ((line (flycheck-error-line err)) - (column (flycheck-error-column err)) - (end-line (flycheck-error-end-line err)) - (end-column (flycheck-error-end-column err))) - (if (and line column) - (if (or (null end-line) (equal line end-line)) - (if (or (null end-column) (equal column (1- end-column))) - (format "%d:%d" line column) - (format "%d:%d-%d" line column end-column)) - (format "(%d:%d)-(%d:%d)" line column end-line end-column)) - (if (or (null end-line) (equal line end-line)) - (format "%d" line) - (format "%d-%d" line end-line))))) - -(defun flycheck-error-format (err &optional with-file-name) - "Format ERR as human-readable string, optionally WITH-FILE-NAME. - -Return a string that represents the given ERR. If WITH-FILE-NAME -is given and non-nil, include the file-name as well, otherwise -omit it." - (let* ((level (symbol-name (flycheck-error-level err))) - (checker (symbol-name (flycheck-error-checker err))) - (format `(,@(when with-file-name - (list (flycheck-error-filename err) ":")) - ,(flycheck-error-format-position err) ":" - ,level ": " - ,(flycheck-error-format-message-and-id err) - " (" ,checker ")"))) - (apply #'concat format))) - -(defun flycheck-error-< (err1 err2) - "Determine whether ERR1 is less than ERR2 by location." - (let ((l1 (flycheck-error-line err1)) - (l2 (flycheck-error-line err2))) - (if (/= l1 l2) - (< l1 l2) - (let ((c1 (or (flycheck-error-column err1) 1)) - (c2 (or (flycheck-error-column err2) 1))) - (if (/= c1 c2) - (< c1 c2) - (let ((el1 (or (flycheck-error-end-line err1) l1)) - (el2 (or (flycheck-error-end-line err2) l2))) - (if (/= el1 el2) - (< el1 el2) - (let ((cl1 (or (flycheck-error-end-column err1) 1)) - (cl2 (or (flycheck-error-end-column err2) 1))) - (< cl1 cl2))))))))) - -(defun flycheck-error-level-< (err1 err2) - "Determine whether ERR1 is less than ERR2 by error level. - -Like `flycheck-error-<', but compares by error level severity -first. Levels of the same severity are compared by name." - (let* ((level1 (flycheck-error-level err1)) - (level2 (flycheck-error-level err2)) - (severity1 (flycheck-error-level-severity level1)) - (severity2 (flycheck-error-level-severity level2))) - (cond - ((= severity1 severity2) - (if (string= level1 level2) - (flycheck-error-< err1 err2) - (string< level1 level2))) - (t (< severity1 severity2))))) - -(defun flycheck-assert-error-list-p (errors) - "Assert that all items in ERRORS are of `flycheck-error' type. - -Signal an error if any item in ERRORS is not a `flycheck-error' -object, as by `flycheck-error-p'. Otherwise return ERRORS -again." - (unless (listp errors) - (signal 'wrong-type-argument (list 'listp errors))) - (dolist (err errors) - (unless (flycheck-error-p err) - (signal 'wrong-type-argument (list 'flycheck-error-p err)))) - errors) - - -;;; Errors in the current buffer -(defvar-local flycheck-current-errors nil - "A list of all errors and warnings in the current buffer.") - -(defun flycheck-report-current-errors (errors) - "Report ERRORS in the current buffer. - -Add ERRORS to `flycheck-current-errors' and process each error -with `flycheck-process-error-functions'." - (setq flycheck-current-errors (sort (append errors flycheck-current-errors) - #'flycheck-error-<)) - (overlay-recenter (point-max)) - (seq-do (lambda (err) - (run-hook-with-args-until-success 'flycheck-process-error-functions - err)) - errors)) - -(defun flycheck-clear-errors () - "Remove all error information from the current buffer." - (setq flycheck-current-errors nil) - (flycheck-report-status 'not-checked)) - -(defun flycheck-fill-and-expand-error-file-names (errors directory) - "Fill and expand file names in ERRORS relative to DIRECTORY. - -Expand all file names of ERRORS against DIRECTORY. If the file -name of an error is nil fill in the result of function -`buffer-file-name' in the current buffer. - -Return ERRORS, modified in-place." - (seq-do (lambda (err) - (setf (flycheck-error-filename err) - (-if-let (filename (flycheck-error-filename err)) - (expand-file-name filename directory) - (buffer-file-name)))) - errors) - errors) - -(defun flycheck-relevant-error-other-file-p (err) - "Determine whether ERR is a relevant error for another file." - (let ((file-name (flycheck-error-filename err))) - (and file-name - flycheck-relevant-error-other-file-show - (or (null buffer-file-name) - (not (flycheck-same-files-p buffer-file-name file-name))) - (<= (flycheck-error-level-severity - flycheck-relevant-error-other-file-minimum-level) - (flycheck-error-level-severity (flycheck-error-level err)))))) - -(defun flycheck-relevant-error-p (err) - "Determine whether ERR is relevant for the current buffer. - -Return t if ERR may be shown for the current buffer, or nil -otherwise." - (flycheck-error-with-buffer err - (let ((file-name (flycheck-error-filename err)) - (message (flycheck-error-message err))) - (and - (or - ;; Neither the error nor buffer have a file name - (and (not file-name) (not buffer-file-name)) - ;; Both have files, and they match - (and buffer-file-name file-name - (flycheck-same-files-p file-name buffer-file-name)) - ;; This is a significant error from another file - (flycheck-relevant-error-other-file-p err)) - message - (not (string-empty-p message)) - ;; Errors without line numbers are discarded. If a linter - ;; reports relevant errors without line numbers, use - ;; `flycheck-fill-empty-line-numbers' as the checker's - ;; `:error-filter' to set them to line 0. - (flycheck-error-line err))))) - -(defun flycheck-relevant-errors (errors) - "Filter the relevant errors from ERRORS. - -Return a list of all errors that are relevant for their -corresponding buffer." - (seq-filter #'flycheck-relevant-error-p errors)) - -(defun flycheck-related-errors (err &optional error-set) - "Get all the errors that are in the same group as ERR. - -Return a list of all errors (from ERROR-SET) that have the same -`flycheck-error-group' as ERR, including ERR itself. - -If ERROR-SET is nil, `flycheck-current-errors' is used instead." - (let ((group (flycheck-error-group err)) - (checker (flycheck-error-checker err))) - (if group - (seq-filter (lambda (e) - (and (eq (flycheck-error-checker e) checker) - (eq (flycheck-error-group e) group))) - (or error-set flycheck-current-errors)) - (list err)))) - - -;;; Status reporting for the current buffer -(defvar-local flycheck-last-status-change 'not-checked - "The last status change in the current buffer.") - -(defun flycheck-report-failed-syntax-check (&optional status) - "Report a failed Flycheck syntax check with STATUS. - -STATUS is a status symbol for `flycheck-report-status', -defaulting to `errored'. - -Clear Flycheck state, run `flycheck-syntax-check-failed-hook' and -report an error STATUS." - (flycheck-clear) - (setq flycheck-current-syntax-check nil) - (run-hooks 'flycheck-syntax-check-failed-hook) - (flycheck-report-status (or status 'errored))) - -(defun flycheck-report-status (status) - "Report Flycheck STATUS. - -STATUS is one of the following symbols: - -`not-checked' - The current buffer was not checked. - -`no-checker' - Automatic syntax checker selection did not find a suitable - syntax checker. - -`running' - A syntax check is now running in the current buffer. - -`errored' - The current syntax check has errored. - -`finished' - The current syntax check was finished normally. - -`interrupted' - The current syntax check was interrupted. - -`suspicious' - The last syntax check had a suspicious result. - -Set `flycheck-last-status-change' and call -`flycheck-status-changed-functions' with STATUS. Afterwards -refresh the mode line." - (setq flycheck-last-status-change status) - (run-hook-with-args 'flycheck-status-changed-functions status) - (force-mode-line-update)) - -(defun flycheck-mode-line-status-text (&optional status) - "Get a text describing STATUS for use in the mode line. - -STATUS defaults to `flycheck-last-status-change' if omitted or -nil." - (let ((text (pcase (or status flycheck-last-status-change) - (`not-checked "") - (`no-checker "-") - (`running "*") - (`errored "!") - (`finished - (let-alist (flycheck-count-errors flycheck-current-errors) - (if (or .error .warning) - (format ":%s/%s" (or .error 0) (or .warning 0)) - ""))) - (`interrupted ".") - (`suspicious "?")))) - (concat " " flycheck-mode-line-prefix text))) - - -;;; Error levels -;;;###autoload -(defun flycheck-define-error-level (level &rest properties) - "Define a new error LEVEL with PROPERTIES. - -The following PROPERTIES constitute an error level: - -`:severity SEVERITY' - A number denoting the severity of this level. The higher - the number, the more severe is this level compared to other - levels. Defaults to 0. - - 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'." - (declare (indent 1)) - (setf (get level 'flycheck-error-level) t) - (setf (get level 'flycheck-error-severity) - (or (plist-get properties :severity) 0)) - (setf (get level 'flycheck-compilation-level) - (plist-get properties :compilation-level)) - (setf (get level 'flycheck-overlay-category) - (plist-get properties :overlay-category)) - (setf (get level 'flycheck-fringe-bitmap-double-arrow) - (plist-get properties :fringe-bitmap)) - (setf (get level 'flycheck-fringe-face) - (plist-get properties :fringe-face)) - (setf (get level 'flycheck-error-list-face) - (plist-get properties :error-list-face))) - -(defun flycheck-error-level-p (level) - "Determine whether LEVEL is a Flycheck error level." - (get level 'flycheck-error-level)) - -(defun flycheck-error-level-severity (level) - "Get the numeric severity of LEVEL." - (or (get level 'flycheck-error-severity) 0)) - -(defun flycheck-error-level-compilation-level (level) - "Get the compilation level for LEVEL." - (get level 'flycheck-compilation-level)) - -(defun flycheck-error-level-overlay-category (level) - "Get the overlay category for LEVEL." - (get level 'flycheck-overlay-category)) - -(defun flycheck-error-level-fringe-bitmap (level) - "Get the fringe bitmap for LEVEL." - (get level 'flycheck-fringe-bitmap-double-arrow)) - -(defun flycheck-error-level-fringe-face (level) - "Get the fringe face for LEVEL." - (get level 'flycheck-fringe-face)) - -(defun flycheck-error-level-error-list-face (level) - "Get the error list face for LEVEL." - (get level 'flycheck-error-list-face)) - -(defun flycheck-error-level-make-fringe-icon (level side) - "Create the fringe icon for LEVEL at SIDE. - -Return a propertized string that shows a fringe bitmap according -to LEVEL and the given fringe SIDE. - -LEVEL is a Flycheck error level defined with -`flycheck-define-error-level', and SIDE is either `left-fringe' -or `right-fringe'. - -Return a propertized string representing the fringe icon, -intended for use as `before-string' of an overlay to actually -show the icon." - (unless (memq side '(left-fringe right-fringe)) - (error "Invalid fringe side: %S" side)) - (propertize "!" 'display - (list side - (flycheck-error-level-fringe-bitmap level) - (flycheck-error-level-fringe-face level)))) - - -;;; Built-in error levels -(when (fboundp 'define-fringe-bitmap) - (define-fringe-bitmap 'flycheck-fringe-bitmap-double-arrow - (vector #b00000000 - #b00000000 - #b00000000 - #b00000000 - #b00000000 - #b10011000 - #b01101100 - #b00110110 - #b00011011 - #b00110110 - #b01101100 - #b10011000 - #b00000000 - #b00000000 - #b00000000 - #b00000000 - #b00000000))) - -(setf (get 'flycheck-error-overlay 'face) 'flycheck-error) -(setf (get 'flycheck-error-overlay 'priority) 110) - -(flycheck-define-error-level 'error - :severity 100 - :compilation-level 2 - :overlay-category 'flycheck-error-overlay - :fringe-bitmap 'flycheck-fringe-bitmap-double-arrow - :fringe-face 'flycheck-fringe-error - :error-list-face 'flycheck-error-list-error) - -(setf (get 'flycheck-warning-overlay 'face) 'flycheck-warning) -(setf (get 'flycheck-warning-overlay 'priority) 100) - -(flycheck-define-error-level 'warning - :severity 10 - :compilation-level 1 - :overlay-category 'flycheck-warning-overlay - :fringe-bitmap 'flycheck-fringe-bitmap-double-arrow - :fringe-face 'flycheck-fringe-warning - :error-list-face 'flycheck-error-list-warning) - -(setf (get 'flycheck-info-overlay 'face) 'flycheck-info) -(setf (get 'flycheck-info-overlay 'priority) 90) - -(flycheck-define-error-level 'info - :severity -10 - :compilation-level 0 - :overlay-category 'flycheck-info-overlay - :fringe-bitmap 'flycheck-fringe-bitmap-double-arrow - :fringe-face 'flycheck-fringe-info - :error-list-face 'flycheck-error-list-info) - - -;;; Error filtering -(defun flycheck-filter-errors (errors checker) - "Filter ERRORS from CHECKER. - -Apply the error filter of CHECKER to ERRORs and return the -result. If CHECKER has no error filter, fall back to -`flycheck-sanitize-errors'." - (let ((filter (or (flycheck-checker-get checker 'error-filter) - #'flycheck-sanitize-errors))) - (funcall filter errors))) - -(defun flycheck-sanitize-errors (errors) - "Sanitize ERRORS. - -Sanitize ERRORS by trimming leading and trailing whitespace in -all error messages, and by replacing 0 columns and empty error -messages with nil. - -Returns sanitized ERRORS." - (dolist (err errors) - (flycheck-error-with-buffer err - (let ((message (flycheck-error-message err)) - (id (flycheck-error-id err))) - (when message - (setq message (string-trim message)) - (setf (flycheck-error-message err) - (if (string-empty-p message) nil message))) - (when (and id (string-empty-p id)) - (setf (flycheck-error-id err) nil)) - (when (eq (flycheck-error-column err) 0) - (setf (flycheck-error-column err) nil)) - (when (eq (flycheck-error-end-column err) 0) - (setf (flycheck-error-end-column err) nil))))) - errors) - -(defun flycheck-remove-error-file-names (file-name errors) - "Remove matching FILE-NAME from ERRORS. - -Use as `:error-filter' for syntax checkers that output faulty -filenames. Flycheck will later fill in the buffer file name. - -Return ERRORS." - (seq-do (lambda (err) - (when (and (flycheck-error-filename err) - (string= (flycheck-error-filename err) file-name)) - (setf (flycheck-error-filename err) nil))) - errors) - errors) - -(defun flycheck-increment-error-columns (errors &optional offset) - "Increment all columns of ERRORS by OFFSET (default: 1). - - Use this as `:error-filter' if a syntax checker outputs 0-based - columns." - (setq offset (or offset 1)) ;; Emacs bug #31715 - (seq-do (lambda (err) - (when (flycheck-error-column err) - (cl-incf (flycheck-error-column err) offset)) - (when (flycheck-error-end-column err) - (cl-incf (flycheck-error-end-column err) offset))) - errors) - errors) - -(defun flycheck-collapse-error-message-whitespace (errors) - "Collapse whitespace in all messages of ERRORS. - -Return ERRORS." - (dolist (err errors) - (-when-let (message (flycheck-error-message err)) - (setf (flycheck-error-message err) - (replace-regexp-in-string (rx (one-or-more (any space "\n" "\r"))) - " " message 'fixed-case 'literal)))) - errors) - -(defun flycheck-dedent-error-messages (errors) - "Dedent all messages of ERRORS. - -For each error in ERRORS, determine the indentation offset from -the leading whitespace of the first line, and dedent all further -lines accordingly. - -Return ERRORS, with in-place modifications." - (dolist (err errors) - (-when-let (message (flycheck-error-message err)) - (with-temp-buffer - (insert message) - ;; Determine the indentation offset - (goto-char (point-min)) - (back-to-indentation) - (let* ((indent-offset (- (point) (point-min)))) - ;; Now iterate over all lines and dedent each according to - ;; `indent-offset' - (while (not (eobp)) - (back-to-indentation) - ;; If the current line starts with sufficient whitespace, delete the - ;; indentation offset. Otherwise keep the line intact, as we might - ;; loose valuable information - (when (>= (- (point) (line-beginning-position)) indent-offset) - (delete-char (- indent-offset))) - (forward-line 1))) - (delete-trailing-whitespace (point-min) (point-max)) - (setf (flycheck-error-message err) - (buffer-substring-no-properties (point-min) (point-max)))))) - errors) - -(defun flycheck-fold-include-levels (errors sentinel-message) - "Fold levels of ERRORS from included files. - -ERRORS is a list of `flycheck-error' objects. SENTINEL-MESSAGE -is a regular expression matched against the error message to -determine whether the error denotes errors from an included -file. Alternatively, it is a function that is given an error and -shall return non-nil, if the error denotes errors from an -included file." - (unless (or (stringp sentinel-message) (functionp sentinel-message)) - (error "Sentinel must be string or function: %S" sentinel-message)) - (let ((sentinel (if (functionp sentinel-message) - sentinel-message - (lambda (err) - (string-match-p sentinel-message - (flycheck-error-message err))))) - (remaining-errors errors)) - (while remaining-errors - (let* ((current-error (pop remaining-errors))) - (when (funcall sentinel current-error) - ;; We found an error denoting errors in the included file: - ;; 1. process all subsequent errors until faulty include file is found - ;; 2. process again all subsequent errors until an error has the - ;; current file name again - ;; 3. find the most severe error level - (let ((current-filename (flycheck-error-filename current-error)) - (current-level nil) - (faulty-include-filename nil) - (filename nil) - (done (null remaining-errors))) - - (while (not done) - (setq filename (flycheck-error-filename (car remaining-errors))) - (unless faulty-include-filename - (unless (string= filename current-filename) - (setq faulty-include-filename filename))) - - (let* ((error-in-include (pop remaining-errors)) - (in-include-level (flycheck-error-level error-in-include))) - (unless (funcall sentinel error-in-include) - ;; Ignore nested "included file" errors, we are only - ;; interested in real errors because these define our level - (when (or (not current-level) - (> (flycheck-error-level-severity in-include-level) - (flycheck-error-level-severity current-level))) - (setq current-level in-include-level)))) - - (setq done (or (null remaining-errors) - (and faulty-include-filename - (string= filename current-filename))))) - - (setf (flycheck-error-level current-error) current-level - (flycheck-error-message current-error) - (format "In include %s" faulty-include-filename)))))) - errors)) - -(defun flycheck-dequalify-error-ids (errors) - "De-qualify error ids in ERRORS. - -Remove all qualifications from error ids in ERRORS, by stripping -all leading dotted components from error IDs. For instance, if -the error ID is com.foo.E100, replace it with E100. - -This error filter is mainly useful to simplify error IDs obtained -from parsing Checkstyle XML, which frequently has very verbose -IDs, that include the name of the tool." - (seq-do (lambda (err) - (let ((id (flycheck-error-id err))) - (when id - (setf (flycheck-error-id err) - (replace-regexp-in-string - (rx string-start - (group - (optional (zero-or-more not-newline) ".")) - (one-or-more (not (any "."))) - string-end) - "" id 'fixedcase 'literal 1))))) - errors) - errors) - -(defun flycheck-remove-error-ids (errors) - "Remove all error ids from ERRORS." - (seq-do (lambda (err) (setf (flycheck-error-id err) nil)) errors) - errors) - -(defun flycheck-fill-empty-line-numbers (errors) - "Set ERRORS without lines to line 0. - -Use as `:error-filter' for syntax checkers that output errors -without line numbers. - -Return ERRORS." - (seq-do (lambda (err) - (unless (flycheck-error-line err) - (setf (flycheck-error-line err) 0))) - errors) - errors) - - -;;; Error analysis -(defun flycheck-count-errors (errors) - "Count the number of ERRORS, grouped by level. - -Return an alist, where each ITEM is a cons cell whose `car' is an -error level, and whose `cdr' is the number of errors of that -level." - (let (counts-by-level) - (dolist (err errors) - (let* ((level (flycheck-error-level err)) - (item (assq level counts-by-level))) - (if item - (cl-incf (cdr item)) - (push (cons level 1) counts-by-level)))) - counts-by-level)) - -(defun flycheck-has-max-errors-p (errors level) - "Check if there is no error in ERRORS more severe than LEVEL." - (let ((severity (flycheck-error-level-severity level))) - (seq-every-p (lambda (e) (<= (flycheck-error-level-severity - (flycheck-error-level e)) - severity)) - errors))) - -(defun flycheck-has-max-current-errors-p (level) - "Check if there is no current error more severe than LEVEL." - (flycheck-has-max-errors-p flycheck-current-errors level)) - -(defun flycheck-has-errors-p (errors level) - "Determine if there are any ERRORS with LEVEL." - (seq-some (lambda (e) (eq (flycheck-error-level e) level)) errors)) - -(defun flycheck-has-current-errors-p (&optional level) - "Determine if the current buffer has errors with LEVEL. - -If LEVEL is omitted if the current buffer has any errors at all." - (if level - (flycheck-has-errors-p flycheck-current-errors level) - (and flycheck-current-errors t))) - - -;;; Error overlays in the current buffer -(defvar-local flycheck--last-overlay-index 0 - "Last index given to a Flycheck overlay. - -These indices are used to preserve error order (Emacs doesn't -preserve overlay order when calling `overlays-at').") - -(defun flycheck--next-overlay-index () - "Compute the index to assign to a new Flycheck overlay." - (cl-incf flycheck--last-overlay-index)) - -(defun flycheck-add-overlay (err) - "Add overlay for ERR. - -Return the created overlay." - ;; We must have a proper error region for the sake of fringe indication, - ;; error display and error navigation, even if the highlighting is disabled. - ;; We erase the highlighting later on in this case - (pcase-let* ((`(,beg . ,end) - (if (flycheck-relevant-error-other-file-p err) - ;; Display overlays for other-file errors on the first line - (cons (point-min) - (save-excursion (goto-char (point-min)) - (point-at-eol))) - (flycheck-error-region-for-mode - err (or flycheck-highlighting-mode 'lines)))) - (overlay (make-overlay beg end)) - (level (flycheck-error-level err)) - (category (flycheck-error-level-overlay-category level)) - (index (flycheck--next-overlay-index))) - (unless (flycheck-error-level-p level) - (error "Undefined error level: %S" level)) - (setf (overlay-get overlay 'flycheck-error-index) index) - (setf (overlay-get overlay 'flycheck-overlay) t) - (setf (overlay-get overlay 'flycheck-error) err) - (setf (overlay-get overlay 'category) category) - (unless flycheck-highlighting-mode - ;; Erase the highlighting from the overlay if requested by the user - (setf (overlay-get overlay 'face) nil)) - (when flycheck-indication-mode - (setf (overlay-get overlay 'before-string) - (flycheck-error-level-make-fringe-icon - level flycheck-indication-mode))) - (setf (overlay-get overlay 'help-echo) #'flycheck-help-echo) - overlay)) - -(defun flycheck-help-echo (_window object pos) - "Construct a tooltip message. - -Most of the actual work is done by calling -`flycheck-help-echo-function' with the appropriate list of -errors. Arguments WINDOW, OBJECT and POS are as described in -info node `(elisp)Special properties', as this function is -intended to be used as the 'help-echo property of flycheck error -overlays." - (-when-let (buf (cond ((bufferp object) object) - ((overlayp object) (overlay-buffer object)))) - (with-current-buffer buf - (-when-let* ((fn flycheck-help-echo-function) - (errs (flycheck-overlay-errors-at pos))) - (propertize (funcall fn errs) 'help-echo-inhibit-substitution t))))) - -(defun flycheck-help-echo-all-error-messages (errs) - "Concatenate error messages and ids from ERRS." - (mapconcat - (lambda (err) - (when err - (if (flycheck-error-message err) - (flycheck-error-format-message-and-id err) - (format "Unknown %s" (flycheck-error-level err))))) - errs "\n\n")) - -(defun flycheck-filter-overlays (overlays) - "Get all Flycheck overlays from OVERLAYS, in original order." - ;; The order of errors returned from overlays is not stable, so we sort - ;; them again using the internal index to guarantee errors are always - ;; displayed in the same order. - (seq-sort - (lambda (o1 o2) (< (overlay-get o1 'flycheck-error-index) - (overlay-get o2 'flycheck-error-index))) - (seq-filter (lambda (o) (overlay-get o 'flycheck-overlay)) overlays))) - -(defun flycheck-overlays-at (pos) - "Get all Flycheck overlays at POS." - (flycheck-filter-overlays (overlays-at pos))) - -(defun flycheck-overlays-in (beg end) - "Get all Flycheck overlays between BEG and END." - (flycheck-filter-overlays (overlays-in beg end))) - -(defun flycheck-overlay-errors-at (pos) - "Return a list of all flycheck errors overlaid at POS." - (seq-map (lambda (o) (overlay-get o 'flycheck-error)) - (flycheck-overlays-at pos))) - -(defun flycheck-overlay-errors-in (beg end) - "Return a list of all flycheck errors overlaid between BEG and END." - (seq-map (lambda (o) (overlay-get o 'flycheck-error)) - (flycheck-overlays-in beg end))) - -(defvar-local flycheck-overlays-to-delete nil - "Overlays mark for deletion after all syntax checks completed.") -(put 'flycheck-overlays-to-delete 'permanent-local t) - -(defun flycheck-delete-all-overlays () - "Remove all flycheck overlays in the current buffer." - (overlay-recenter (point-max)) - (flycheck-delete-marked-overlays) - (setq flycheck--last-overlay-index 0) - (save-restriction - (widen) - (seq-do #'delete-overlay (flycheck-overlays-in (point-min) (point-max))))) - -(defun flycheck-mark-all-overlays-for-deletion () - "Mark all current overlays for deletion." - (setq flycheck-overlays-to-delete - (append (flycheck-overlays-in (point-min) (point-max)) - flycheck-overlays-to-delete))) - -(defun flycheck-delete-marked-overlays () - "Delete all overlays marked for deletion." - (overlay-recenter (point-max)) - (seq-do #'delete-overlay flycheck-overlays-to-delete) - (setq flycheck-overlays-to-delete nil)) - - -;;; Error navigation in the current buffer -(defun flycheck-error-level-interesting-at-pos-p (pos) - "Check if error severity at POS passes `flycheck-error-level-interesting-p'." - (flycheck-error-level-interesting-p (get-char-property pos 'flycheck-error))) - -(defun flycheck-error-level-interesting-p (err) - "Check if ERR severity is >= `flycheck-navigation-minimum-level'. - -ERR is also interesting (the function returns true) if there are -no errors as or more severe than `flycheck-navigation-minimum-level'." - (when (flycheck-error-p err) - (-if-let (min-level flycheck-navigation-minimum-level) - (or (<= (flycheck-error-level-severity min-level) - (flycheck-error-level-severity (flycheck-error-level err))) - (not (flycheck-has-current-errors-p min-level))) - t))) - -(defun flycheck-next-error-pos (n &optional reset) - "Get the position of the N-th next error. - -With negative N, get the position of the (-N)-th previous error -instead. With non-nil RESET, search from `point-min', otherwise -search from the current point. - -Return the position of the next or previous error, or nil if -there is none. If N is zero, return `point', or `point-min' if -RESET is non-nil." - (let ((n (or n 1)) - (pos (if reset (point-min) (point)))) - (if (>= n 0) - ;; Search forwards - (while (and pos (> n 0)) - (setq n (1- n)) - (when (get-char-property pos 'flycheck-error) - ;; Move beyond from the current error if any - (setq pos (next-single-char-property-change pos 'flycheck-error))) - (while (not (or (= pos (point-max)) - (flycheck-error-level-interesting-at-pos-p pos))) - ;; Scan for the next error - (setq pos (next-single-char-property-change pos 'flycheck-error))) - (when (and (= pos (point-max)) - (not (flycheck-error-level-interesting-at-pos-p pos))) - ;; If we reached the end of the buffer, but no error, we didn't find - ;; any - (setq pos nil))) - ;; Search backwards - (while (and pos (< n 0)) - (setq n (1+ n)) - ;; Loop until we find an error. We need to check the position *before* - ;; the current one, because `previous-single-char-property-change' - ;; always moves to the position *of* the change. - (while (not (or (= pos (point-min)) - (flycheck-error-level-interesting-at-pos-p (1- pos)))) - (setq pos (previous-single-char-property-change pos 'flycheck-error))) - (when (and (= pos (point-min)) - (not (flycheck-error-level-interesting-at-pos-p pos))) - ;; We didn't find any error. - (setq pos nil)) - (when pos - ;; We found an error, so move to its beginning - (setq pos (previous-single-char-property-change pos - 'flycheck-error))))) - pos)) - -(defun flycheck-next-error-function (n reset) - "Visit the N-th error from the current point. - -N is the number of errors to advance by, where a negative N -advances backwards. With non-nil RESET, advance from the -beginning of the buffer, otherwise advance from the current -position. - -Intended for use with `next-error-function'." - (-if-let* ((pos (flycheck-next-error-pos n reset)) - (err (get-char-property pos 'flycheck-error))) - (flycheck-jump-to-error err) - (user-error "No more Flycheck errors"))) - -(defun flycheck-next-error (&optional n reset) - "Visit the N-th error from the current point. - -N is the number of errors to advance by, where a negative N -advances backwards. With non-nil RESET, advance from the -beginning of the buffer, otherwise advance from the current -position." - (interactive "P") - (when (consp n) - ;; Universal prefix argument means reset - (setq reset t n nil)) - (flycheck-next-error-function n reset) - (flycheck-display-error-at-point)) - -(defun flycheck-previous-error (&optional n) - "Visit the N-th previous error. - -If given, N specifies the number of errors to move backwards by. -If N is negative, move forwards instead." - (interactive "P") - (flycheck-next-error (- (or n 1)))) - -(defun flycheck-first-error (&optional n) - "Visit the N-th error from beginning of the buffer. - -If given, N specifies the number of errors to move forward from -the beginning of the buffer." - (interactive "P") - (flycheck-next-error n 'reset)) - - -;;; Listing errors in buffers -(defconst flycheck-error-list-buffer "*Flycheck errors*" - "The name of the buffer to show error lists.") - -(defvar flycheck-error-list-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "f") #'flycheck-error-list-set-filter) - (define-key map (kbd "F") #'flycheck-error-list-reset-filter) - (define-key map (kbd "n") #'flycheck-error-list-next-error) - (define-key map (kbd "p") #'flycheck-error-list-previous-error) - (define-key map (kbd "g") #'flycheck-error-list-check-source) - (define-key map (kbd "e") #'flycheck-error-list-explain-error) - (define-key map (kbd "RET") #'flycheck-error-list-goto-error) - map) - "The keymap of `flycheck-error-list-mode'.") - -(defun flycheck-error-list-make-last-column (message checker) - "Compute contents of the last error list cell. - -MESSAGE and CHECKER are displayed in a single column to allow the -message to stretch arbitrarily far." - (let ((checker-name (propertize (symbol-name checker) - 'face 'flycheck-error-list-checker-name))) - (format "%s (%s)" message checker-name))) - -(defconst flycheck-error-list-format - `[("File" 6) - ("Line" 5 flycheck-error-list-entry-< :right-align t) - ("Col" 3 nil :right-align t) - ("Level" 8 flycheck-error-list-entry-level-<) - ("ID" 6 t) - (,(flycheck-error-list-make-last-column "Message" 'Checker) 0 t)] - "Table format for the error list.") - -(defconst flycheck-error-list-padding 1 - "Padding used in error list.") - -(defconst flycheck--error-list-msg-offset - (seq-reduce - (lambda (offset fmt) - (pcase-let* ((`(,_ ,width ,_ . ,props) fmt) - (padding (or (plist-get props :pad-right) 1))) - (+ offset width padding))) - (seq-subseq flycheck-error-list-format 0 -1) - flycheck-error-list-padding) - "Amount of space to use in `flycheck-flush-multiline-message'.") - -(define-derived-mode flycheck-error-list-mode tabulated-list-mode - "Flycheck errors" - "Major mode for listing Flycheck errors. - -\\{flycheck-error-list-mode-map}" - (setq tabulated-list-format flycheck-error-list-format - ;; Sort by location initially - tabulated-list-sort-key (cons "Line" nil) - tabulated-list-padding flycheck-error-list-padding - tabulated-list-entries #'flycheck-error-list-entries - ;; `revert-buffer' updates the mode line for us, so all we need to do is - ;; set the corresponding mode line construct. - mode-line-buffer-identification flycheck-error-list-mode-line) - ;; Guard `truncate-string-ellipsis' for Emacs 24. - ;; TODO: Remove when dropping Emacs 24 compatibility - (when (boundp 'truncate-string-ellipsis) - ;; See https://github.com/flycheck/flycheck/issues/1101 - (setq-local truncate-string-ellipsis "…")) - (tabulated-list-init-header)) - -(defvar-local flycheck-error-list-source-buffer nil - "The current source buffer of the error list.") -;; Needs to permanently local to preserve the source buffer across buffer -;; reversions -(put 'flycheck-error-list-source-buffer 'permanent-local t) - -(defun flycheck-error-list-set-source (buffer) - "Set BUFFER as the source buffer of the error list." - (when (get-buffer flycheck-error-list-buffer) - (with-current-buffer flycheck-error-list-buffer - ;; Only update the source when required - (unless (eq buffer flycheck-error-list-source-buffer) - (setq flycheck-error-list-source-buffer buffer) - (flycheck-error-list-refresh))))) - -(defun flycheck-error-list-update-source () - "Update the source buffer of the error list." - (unless (eq (current-buffer) (get-buffer flycheck-error-list-buffer)) - ;; We must not update the source buffer, if the current buffer is the error - ;; list itself. - (flycheck-error-list-set-source (current-buffer)))) - -(defun flycheck-error-list-check-source () - "Trigger a syntax check in the source buffer of the error list." - (interactive) - (let ((buffer (get-buffer flycheck-error-list-source-buffer))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (flycheck-buffer))))) - -(define-button-type 'flycheck-error-list - 'action #'flycheck-error-list-button-goto-error - 'help-echo "mouse-1, RET: goto error" - 'face nil) - -(defun flycheck-error-list-button-goto-error (button) - "Go to the error at BUTTON." - (flycheck-error-list-goto-error (button-start button))) - -(define-button-type 'flycheck-error-list-explain-error - 'action #'flycheck-error-list-button-explain-error - 'help-echo "mouse-1, RET: explain error") - -(defun flycheck-error-list-button-explain-error (button) - "Explain the error at BUTTON." - (flycheck-error-list-explain-error (button-start button))) - -(defsubst flycheck-error-list-make-cell (text &optional face help-echo type) - "Make an error list cell with TEXT and FACE. - -If FACE is nil don't set a FACE on TEXT. If TEXT already has -face properties, do not specify a FACE. Note though, that if -TEXT gets truncated it will not inherit any previous face -properties. If you expect TEXT to be truncated in the error -list, do specify a FACE explicitly! - -If HELP-ECHO is non-nil, set a help-echo property on TEXT, with -value HELP-ECHO. This is convenient if you expect TEXT to be -truncated. - -The cell will have the type TYPE unless TYPE is nil, and the -default type `flycheck-error-list' will be used instead." - (append (list text 'type (if type type - 'flycheck-error-list)) - (and face (list 'face face)) - (and help-echo (list 'help-echo help-echo)))) - -(defsubst flycheck-error-list-make-number-cell (number face) - "Make a table cell for a NUMBER with FACE. - -Convert NUMBER to string, fontify it with FACE and return the -string with attached text properties." - (flycheck-error-list-make-cell - (if (numberp number) (number-to-string number) "") - face)) - -(defun flycheck-error-list-make-entry (error) - "Make a table cell for the given ERROR. - -Return a list with the contents of the table cell." - (let* ((level (flycheck-error-level error)) - (level-face (flycheck-error-level-error-list-face level)) - (filename (flycheck-error-filename error)) - (line (flycheck-error-line error)) - (column (flycheck-error-column error)) - (message (or (flycheck-error-message error) - (format "Unknown %s" (symbol-name level)))) - (flushed-msg (flycheck-flush-multiline-message message)) - (id (flycheck-error-id error)) - (id-str (if id (format "%s" id) "")) - (checker (flycheck-error-checker error)) - (msg-and-checker - (flycheck-error-list-make-last-column flushed-msg checker)) - (explainer (flycheck-checker-get checker 'error-explainer))) - (list error - (vector (flycheck-error-list-make-cell - (if filename - (file-name-nondirectory filename) - "") - 'flycheck-error-list-filename) - (flycheck-error-list-make-number-cell - line 'flycheck-error-list-line-number) - (flycheck-error-list-make-number-cell - column 'flycheck-error-list-column-number) - (flycheck-error-list-make-cell - (symbol-name (flycheck-error-level error)) level-face) - ;; Error ID use a different face when an error-explainer is - ;; present - (flycheck-error-list-make-cell - id-str (if explainer 'flycheck-error-list-id-with-explainer - 'flycheck-error-list-id) - id-str 'flycheck-error-list-explain-error) - (flycheck-error-list-make-cell - msg-and-checker nil msg-and-checker))))) - -(defun flycheck-flush-multiline-message (msg) - "Prepare error message MSG for display in the error list. - -Prepend all lines of MSG except the first with enough space to -ensure that they line up properly once the message is displayed." - (let* ((spc-spec `(space . (:width ,flycheck--error-list-msg-offset))) - (spc (propertize " " 'display spc-spec)) - (rep (concat "\\1" spc "\\2"))) - (replace-regexp-in-string "\\([\r\n]+\\)\\(.\\)" rep msg))) - -(defun flycheck-error-list-current-errors () - "Read the list of errors in `flycheck-error-list-source-buffer'." - (when (buffer-live-p flycheck-error-list-source-buffer) - (buffer-local-value 'flycheck-current-errors - flycheck-error-list-source-buffer))) - -(defun flycheck-error-list-entries () - "Create the entries for the error list." - (-when-let* ((errors (flycheck-error-list-current-errors)) - (filtered (flycheck-error-list-apply-filter errors))) - (seq-map #'flycheck-error-list-make-entry filtered))) - -(defun flycheck-error-list-entry-< (entry1 entry2) - "Determine whether ENTRY1 is before ENTRY2 by location. - -See `flycheck-error-<'." - (flycheck-error-< (car entry1) (car entry2))) - -(defun flycheck-error-list-entry-level-< (entry1 entry2) - "Determine whether ENTRY1 is before ENTRY2 by level. - -See `flycheck-error-level-<'." - (not (flycheck-error-level-< (car entry1) (car entry2)))) - -(defvar flycheck-error-list-mode-line-map - (let ((map (make-sparse-keymap))) - (define-key map [mode-line mouse-1] - #'flycheck-error-list-mouse-switch-to-source) - map) - "Keymap for error list mode line.") - -(defun flycheck-error-list-propertized-source-name () - "Get the name of the current source buffer for the mode line. - -Propertize the name of the current source buffer for use in the -mode line indication of `flycheck-error-list-mode'." - (let ((name (replace-regexp-in-string - (rx "%") "%%" - (buffer-name flycheck-error-list-source-buffer) - 'fixed-case 'literal))) - (propertize name 'face 'mode-line-buffer-id - 'mouse-face 'mode-line-highlight - 'help-echo "mouse-1: switch to source" - 'local-map flycheck-error-list-mode-line-map))) - -(defun flycheck-error-list-mouse-switch-to-source (event) - "Switch to the error list source buffer of the EVENT window." - (interactive "e") - (save-selected-window - (when (eventp event) - (select-window (posn-window (event-start event)))) - (when (buffer-live-p flycheck-error-list-source-buffer) - (switch-to-buffer flycheck-error-list-source-buffer)))) - -(defun flycheck-get-error-list-window-list (&optional all-frames) - "Get all windows displaying the error list. - -ALL-FRAMES specifies the frames to consider, as in -`get-buffer-window-list'." - (-when-let (buf (get-buffer flycheck-error-list-buffer)) - (get-buffer-window-list buf nil all-frames))) - -(defun flycheck-get-error-list-window (&optional all-frames) - "Get a window displaying the error list, or nil if none. - -ALL-FRAMES specifies the frames to consider, as in -`get-buffer-window'." - (-when-let (buf (get-buffer flycheck-error-list-buffer)) - (get-buffer-window buf all-frames))) - -(defun flycheck-error-list-recenter-at (pos) - "Recenter the error list at POS." - (dolist (window (flycheck-get-error-list-window-list t)) - (with-selected-window window - (goto-char pos) - (let ((recenter-redisplay nil)) - (recenter))))) - -(defun flycheck-error-list-refresh () - "Refresh the current error list. - -Add all errors currently reported for the current -`flycheck-error-list-source-buffer', and recenter the error -list." - ;; We only refresh the error list, when it is visible in a window, and we - ;; select this window while reverting, because Tabulated List mode attempts to - ;; recenter the error at the old location, so it must have the proper window - ;; selected. - (-when-let (window (flycheck-get-error-list-window t)) - (with-selected-window window - (revert-buffer)) - (run-hooks 'flycheck-error-list-after-refresh-hook) - (let ((preserve-pos (eq (current-buffer) - (get-buffer flycheck-error-list-buffer)))) - ;; If the error list is the current buffer, don't recenter when - ;; highlighting - (flycheck-error-list-highlight-errors preserve-pos)))) - -(defun flycheck-error-list-mode-line-filter-indicator () - "Create a string representing the current error list filter." - (if flycheck-error-list-minimum-level - (format " [>= %s]" flycheck-error-list-minimum-level) - "")) - -(defun flycheck-error-list-set-filter (level) - "Restrict the error list to errors at level LEVEL or higher. - -LEVEL is either an error level symbol, or nil, to remove the filter." - (interactive - (list (flycheck-read-error-level - "Minimum error level (errors at lower levels will be hidden): "))) - (when (and level (not (flycheck-error-level-p level))) - (user-error "Invalid level: %s" level)) - (-when-let (buf (get-buffer flycheck-error-list-buffer)) - (with-current-buffer buf - (setq-local flycheck-error-list-minimum-level level)) - (flycheck-error-list-refresh) - (flycheck-error-list-recenter-at (point-min)))) - -(defun flycheck-error-list-reset-filter () - "Remove filters and show all errors in the error list." - (interactive) - (kill-local-variable 'flycheck-error-list-minimum-level)) - -(defun flycheck-error-list-apply-filter (errors) - "Filter ERRORS according to `flycheck-error-list-minimum-level'." - (-if-let* ((min-level flycheck-error-list-minimum-level) - (min-severity (flycheck-error-level-severity min-level))) - (seq-filter (lambda (err) (>= (flycheck-error-level-severity - (flycheck-error-level err)) - min-severity)) - errors) - errors)) - -(defun flycheck-error-list-goto-error (&optional pos) - "Go to the location of the error at POS in the error list. - -POS defaults to `point'." - (interactive) - (-when-let* ((error (tabulated-list-get-id pos))) - (flycheck-jump-to-error error))) - -(defun flycheck-jump-to-error (error) - "Go to the location of ERROR." - (let* ((error-copy (copy-flycheck-error error)) - (filename (flycheck-error-filename error)) - (other-file-error (flycheck-relevant-error-other-file-p error)) - (buffer (if filename - (find-file-noselect filename) - (flycheck-error-buffer error)))) - (when (buffer-live-p buffer) - (setf (flycheck-error-buffer error-copy) buffer) - (flycheck-jump-in-buffer buffer error-copy) - ;; When jumping to an error in another file, it may not have - ;; this error available for highlighting yet, so we trigger a check - ;; if necessary. - (when other-file-error - (with-current-buffer buffer - ;; `seq-contains-p' is only in seq >= 2.21 - (unless (with-no-warnings - (seq-contains flycheck-current-errors error-copy 'equal)) - (when flycheck-mode - (flycheck-buffer)))))))) - -(defun flycheck-jump-in-buffer (buffer error) - "In BUFFER, jump to ERROR." - ;; FIXME: we assume BUFFER and the buffer of ERROR are the same. We don't - ;; need the first argument then. - (if (eq (window-buffer) (get-buffer flycheck-error-list-buffer)) - ;; When called from within the error list, keep the error list, - ;; otherwise replace the current buffer. - (pop-to-buffer buffer 'other-window) - (switch-to-buffer buffer)) - (let ((pos (flycheck-error-pos error))) - (unless (eq (goto-char pos) (point)) - ;; If widening gets in the way of moving to the right place, remove it - ;; and try again - (widen) - (goto-char pos))) - ;; Re-highlight the errors. We have post-command-hook for that, but calls to - ;; `flycheck-jump-in-buffer' that come from other buffers (e.g. from the error - ;; list) won't trigger it. - (flycheck-error-list-highlight-errors 'preserve-pos)) - -(defun flycheck-error-list-explain-error (&optional pos) - "Explain the error at POS in the error list. - -POS defaults to `point'." - (interactive) - (-when-let* ((error (tabulated-list-get-id pos)) - (explainer (flycheck-checker-get (flycheck-error-checker error) - 'error-explainer)) - (explanation (funcall explainer error))) - (flycheck-display-error-explanation explanation))) - -(defun flycheck-error-list-next-error-pos (pos &optional n) - "Starting from POS get the N'th next error in the error list. - -N defaults to 1. If N is negative, search for the previous error -instead. - -Get the beginning position of the N'th next error from POS, or -nil, if there is no next error." - (let ((n (or n 1))) - (if (>= n 0) - ;; Search forward - (while (and pos (/= n 0)) - (setq n (1- n)) - (setq pos (next-single-property-change pos 'tabulated-list-id))) - ;; Search backwards - (while (/= n 0) - (setq n (1+ n)) - ;; We explicitly give the limit here to explicitly have the minimum - ;; point returned, to be able to move to the first error (which starts - ;; at `point-min') - (setq pos (previous-single-property-change pos 'tabulated-list-id - nil (point-min))))) - pos)) - -(defun flycheck-error-list-previous-error (n) - "Go to the N'th previous error in the error list." - (interactive "P") - (flycheck-error-list-next-error (- (or n 1)))) - -(defun flycheck-error-list-next-error (n) - "Go to the N'th next error in the error list." - (interactive "P") - (let ((pos (flycheck-error-list-next-error-pos (point) n))) - (when (and pos (/= pos (point))) - (goto-char pos) - (save-selected-window - ;; Keep the error list selected, so that the user can navigate errors by - ;; repeatedly pressing n/p, without having to re-select the error list - ;; window. - (flycheck-error-list-goto-error))))) - -(defvar-local flycheck-error-list-highlight-overlays nil - "Error highlight overlays in the error list buffer.") -(put 'flycheck-error-list-highlight-overlays 'permanent-local t) - -(defun flycheck-error-list-highlight-errors (&optional preserve-pos) - "Highlight errors in the error list. - -Highlight all errors in the error lists that are at point in the -source buffer, and on the same line as point. Then recenter the -error list to the highlighted error, unless PRESERVE-POS is -non-nil." - (when (get-buffer flycheck-error-list-buffer) - (with-current-buffer flycheck-error-list-buffer - (let ((current-errors - (when (buffer-live-p flycheck-error-list-source-buffer) - (with-current-buffer flycheck-error-list-source-buffer - (flycheck-overlay-errors-in (line-beginning-position) - (line-end-position)))))) - (let ((old-overlays flycheck-error-list-highlight-overlays) - (min-point (point-max)) - (max-point (point-min))) - ;; Display the new overlays first, to avoid re-display flickering - (setq flycheck-error-list-highlight-overlays nil) - (when current-errors - (let ((next-error-pos (point-min))) - (while next-error-pos - (let* ((beg next-error-pos) - (end (flycheck-error-list-next-error-pos beg)) - (err (tabulated-list-get-id beg))) - (when (member err current-errors) - (setq min-point (min min-point beg) - max-point (max max-point beg)) - (let ((ov (make-overlay beg - ;; Extend overlay to the beginning - ;; of the next line, to highlight - ;; the whole line - (or end (point-max))))) - (push ov flycheck-error-list-highlight-overlays) - (setf (overlay-get ov 'flycheck-error-highlight-overlay) - t) - (setf (overlay-get ov 'face) - 'flycheck-error-list-highlight))) - (setq next-error-pos end))))) - ;; Delete the old overlays - (seq-do #'delete-overlay old-overlays) - (when (and (not preserve-pos) current-errors) - ;; Move point to the middle error - (goto-char (+ min-point (/ (- max-point min-point) 2))) - (beginning-of-line) - ;; And recenter the error list at this position - (flycheck-error-list-recenter-at (point)))))))) - -(defun flycheck-list-errors () - "Show the error list for the current buffer." - (interactive) - (unless flycheck-mode - (user-error "Flycheck mode not enabled")) - ;; Create and initialize the error list - (unless (get-buffer flycheck-error-list-buffer) - (with-current-buffer (get-buffer-create flycheck-error-list-buffer) - (flycheck-error-list-mode))) - (flycheck-error-list-set-source (current-buffer)) - ;; Reset the error filter - (flycheck-error-list-reset-filter) - ;; Show the error list in a window, and re-select the old window - (display-buffer flycheck-error-list-buffer) - ;; Finally, refresh the error list to show the most recent errors - (flycheck-error-list-refresh)) - -(defalias 'list-flycheck-errors 'flycheck-list-errors) - - -;;; Displaying errors in the current buffer -(defun flycheck-display-errors (errors) - "Display ERRORS using `flycheck-display-errors-function'." - (when flycheck-display-errors-function - (funcall flycheck-display-errors-function errors))) - -(defvar-local flycheck-display-error-at-point-timer nil - "Timer to automatically show errors.") - -(defun flycheck-cancel-error-display-error-at-point-timer () - "Cancel the error display timer for the current buffer." - (when flycheck-display-error-at-point-timer - (cancel-timer flycheck-display-error-at-point-timer) - (setq flycheck-display-error-at-point-timer nil))) - -(defun flycheck--error-display-tick () - "Return point and tick counter of current buffer." - (cons (point) (buffer-modified-tick))) - -(defvar-local flycheck--last-error-display-tick nil - "Value of `flycheck--error-display-tick' when errors were last displayed.") - -(defun flycheck-display-error-at-point () - "Display all the error messages at point." - (interactive) - ;; This function runs from a timer, so we must take care to not ignore any - ;; errors - (with-demoted-errors "Flycheck error display error: %s" - (flycheck-cancel-error-display-error-at-point-timer) - (setq flycheck--last-error-display-tick (flycheck--error-display-tick)) - (when flycheck-mode - (-when-let (errors (flycheck-overlay-errors-at (point))) - (flycheck-display-errors errors))))) - -(defun flycheck-display-error-at-point-soon () - "Display error messages at point, with a delay." - (setq flycheck--last-error-display-tick nil) - (flycheck-maybe-display-error-at-point-soon)) - -(defun flycheck-maybe-display-error-at-point-soon () - "Display error message at point with a delay, unless already displayed." - (flycheck-cancel-error-display-error-at-point-timer) - (when (and (not (equal flycheck--last-error-display-tick - (setq flycheck--last-error-display-tick - (flycheck--error-display-tick)))) - (flycheck-overlays-at (point))) - (setq flycheck-display-error-at-point-timer - (run-at-time flycheck-display-errors-delay nil - 'flycheck-display-error-at-point)))) - - -;;; Functions to display errors -(defconst flycheck-error-message-buffer "*Flycheck error messages*" - "The name of the buffer to show long error messages in.") - -(defun flycheck-error-message-buffer () - "Get the buffer object to show long error messages in. - -Get the buffer named by variable `flycheck-error-message-buffer', -or nil if the buffer does not exist." - (get-buffer flycheck-error-message-buffer)) - -(defun flycheck-may-use-echo-area-p () - "Determine whether the echo area may be used. - -The echo area may be used if the cursor is not in the echo area, -and if the echo area is not occupied by minibuffer input." - (not (or cursor-in-echo-area (active-minibuffer-window)))) - -(define-derived-mode flycheck-error-message-mode text-mode - "Flycheck error messages" - "Major mode for extended error messages.") - -(defun flycheck-display-error-messages (errors) - "Display the messages of ERRORS. - -Concatenate all non-nil messages of ERRORS separated by empty -lines, and display them with `display-message-or-buffer', which -shows the messages either in the echo area or in a separate -buffer, depending on the number of lines. See Info -node `(elisp)Displaying Messages' for more information. - -In the latter case, show messages in the buffer denoted by -variable `flycheck-error-message-buffer'." - (when (and errors (flycheck-may-use-echo-area-p)) - (let ((messages (seq-map #'flycheck-error-format-message-and-id errors))) - (display-message-or-buffer (string-join messages "\n\n") - flycheck-error-message-buffer - 'not-this-window) - ;; We cannot rely on `display-message-or-buffer' returning the right - ;; window. See URL `https://github.com/flycheck/flycheck/issues/1643'. - (-when-let ((buf (get-buffer flycheck-error-message-buffer))) - (with-current-buffer buf - (unless (derived-mode-p 'flycheck-error-message-mode) - (flycheck-error-message-mode))))))) - -(defun flycheck-display-error-messages-unless-error-list (errors) - "Show messages of ERRORS unless the error list is visible. - -Like `flycheck-display-error-messages', but only if the error -list (see `flycheck-list-errors') is not visible in any window in -the current frame." - (unless (flycheck-get-error-list-window 'current-frame) - (flycheck-display-error-messages errors))) - -(defun flycheck-hide-error-buffer () - "Hide the Flycheck error buffer if necessary. - -Hide the error buffer if there is no error under point." - (-when-let* ((buffer (flycheck-error-message-buffer)) - (window (get-buffer-window buffer))) - (unless (flycheck-overlays-at (point)) - ;; save-selected-window prevents `quit-window' from changing the current - ;; buffer (see https://github.com/flycheck/flycheck/issues/648). - (save-selected-window - (quit-window nil window))))) - - -;;; Working with errors -(defun flycheck-copy-errors-as-kill (pos &optional formatter) - "Copy each error at POS into kill ring, using FORMATTER. - -FORMATTER is a function to turn an error into a string, -defaulting to `flycheck-error-message'. - -Interactively, use `flycheck-error-format-message-and-id' as -FORMATTER with universal prefix arg, and `flycheck-error-id' with -normal prefix arg, i.e. copy the message and the ID with -universal prefix arg, and only the id with normal prefix arg." - (interactive (list (point) - (pcase current-prefix-arg - ((pred not) #'flycheck-error-message) - ((pred consp) #'flycheck-error-format-message-and-id) - (_ #'flycheck-error-id)))) - (let ((messages (delq nil (seq-map (or formatter #'flycheck-error-message) - (flycheck-overlay-errors-at pos))))) - (when messages - (seq-do #'kill-new (reverse messages)) - (message (string-join messages "\n"))))) - -(defun flycheck-explain-error-at-point () - "Display an explanation for the first explainable error at point. - -The first explainable error at point is the first error at point -with a non-nil `:error-explainer' function defined in its -checker. The `:error-explainer' function is then called with -this error to produce the explanation to display." - (interactive) - (-when-let* ((first-error - ;; Get the first error at point that has an `error-explainer'. - (seq-find (lambda (error) - (flycheck-checker-get - (flycheck-error-checker error) 'error-explainer)) - (flycheck-overlay-errors-at (point)))) - (explainer - (flycheck-checker-get (flycheck-error-checker first-error) - 'error-explainer)) - (explanation (funcall explainer first-error))) - (flycheck-display-error-explanation explanation))) - -(defconst flycheck-explain-error-buffer "*Flycheck error explanation*" - "The name of the buffer to show error explanations.") - -(defun flycheck-display-error-explanation (explanation) - "Display the EXPLANATION string in a help buffer." - (with-help-window (get-buffer-create flycheck-explain-error-buffer) - (princ explanation))) - - -;;; Syntax checkers using external commands -(defun flycheck-command-argument-p (arg) - "Check whether ARG is a valid command argument." - (pcase arg - ((pred stringp) t) - ((or `source `source-inplace `source-original) t) - (`(,(or `source `source-inplace) ,suffix) - (stringp suffix)) - ((or `temporary-directory `temporary-file-name) t) - (`null-device t) - (`(config-file ,option-name ,config-file-var) - (and (stringp option-name) - (symbolp config-file-var))) - (`(config-file ,option-name ,config-file-var ,prepender) - (and (stringp option-name) - (symbolp config-file-var) - (symbolp prepender))) - (`(,(or `option `option-list) ,option-name ,option-var) - (and (stringp option-name) - (symbolp option-var))) - (`(,(or `option `option-list) ,option-name ,option-var ,prepender) - (and (stringp option-name) - (symbolp option-var) - (symbolp prepender))) - (`(,(or `option `option-list) ,option-name ,option-var ,prepender ,filter) - (and (stringp option-name) - (symbolp option-var) - (symbolp prepender) - (symbolp filter))) - (`(option-flag ,option-name ,option-var) - (and (stringp option-name) - (symbolp option-var))) - (`(eval ,_) t) - (_ nil))) - -(defun flycheck-compute-working-directory (checker) - "Get the default working directory for CHECKER. - -Compute the value of `default-directory' for the invocation of -the syntax checker command, by calling the function in the -`working-directory' property of CHECKER, with CHECKER as sole -argument, and returning its value. Signal an error if the -function returns a non-existing working directory. - -If the property is undefined or if the function returns nil -return the `default-directory' of the current buffer." - (let* ((def-directory-fn (flycheck-checker-get checker 'working-directory)) - (directory (or (and def-directory-fn - (funcall def-directory-fn checker)) - ;; Default to the `default-directory' of the current - ;; buffer - default-directory))) - (unless (file-exists-p directory) - (error ":working-directory %s of syntax checker %S does not exist" - directory checker)) - directory)) - -;;;###autoload -(defun flycheck-define-command-checker (symbol docstring &rest properties) - "Define SYMBOL as syntax checker to run a command. - -Define SYMBOL as generic syntax checker via -`flycheck-define-generic-checker', which uses an external command -to check the buffer. SYMBOL and DOCSTRING are the same as for -`flycheck-define-generic-checker'. - -In addition to the properties understood by -`flycheck-define-generic-checker', the following PROPERTIES -constitute a command syntax checker. Unless otherwise noted, all -properties are mandatory. Note that the default `:error-filter' -of command checkers is `flycheck-sanitize-errors'. - -`:command COMMAND' - The command to run for syntax checking. - - COMMAND is a list of the form `(EXECUTABLE [ARG ...])'. - - EXECUTABLE is a string with the executable of this syntax - checker. It can be overridden with the variable - `flycheck-SYMBOL-executable'. Note that this variable is - NOT implicitly defined by this function. Use - `flycheck-def-executable-var' to define this variable. - - Each ARG is an argument to the executable, either as string, - or as special symbol or form for - `flycheck-substitute-argument', which see. - -`:error-patterns PATTERNS' - A list of patterns to parse the output of the `:command'. - - Each ITEM in PATTERNS is a list `(LEVEL SEXP ...)', where - LEVEL is a Flycheck error level (see - `flycheck-define-error-level'), followed by one or more RX - `SEXP's which parse an error of that level and extract line, - column, file name and the message. - - See `rx' for general information about RX, and - `flycheck-rx-to-string' for some special RX forms provided - by Flycheck. - - All patterns are applied in the order of declaration to the - whole output of the syntax checker. Output already matched - by a pattern will not be matched by subsequent patterns. In - other words, the first pattern wins. - - This property is optional. If omitted, however, an - `:error-parser' is mandatory. - -`:error-parser FUNCTION' - A function to parse errors with. - - The function shall accept three arguments OUTPUT CHECKER - BUFFER. OUTPUT is the syntax checker output as string, - CHECKER the syntax checker that was used, and BUFFER a - buffer object representing the checked buffer. The function - must return a list of `flycheck-error' objects parsed from - OUTPUT. - - This property is optional. If omitted, it defaults to - `flycheck-parse-with-patterns'. In this case, - `:error-patterns' is mandatory. - -`:standard-input t' - Whether to send the buffer contents on standard input. - - If this property is given and has a non-nil value, send the - contents of the buffer on standard input. - - Defaults to nil. - -Note that you may not give `:start', `:interrupt', and -`:print-doc' for a command checker. You can give a custom -`:verify' function, though, whose results will be appended to the -default `:verify' function of command checkers." - (declare (indent 1) - (doc-string 2)) - (dolist (prop '(:start :interrupt :print-doc)) - (when (plist-get properties prop) - (error "%s not allowed in definition of command syntax checker %s" - prop symbol))) - - (unless (plist-get properties :error-filter) - ;; Default to `flycheck-sanitize-errors' as error filter - (setq properties (plist-put properties :error-filter - #'flycheck-sanitize-errors))) - (let ((verify-fn (plist-get properties :verify))) - (setq properties - (plist-put properties :verify - (lambda (checker) - (append (flycheck-verify-command-checker checker) - (and verify-fn - (funcall verify-fn checker))))))) - - (let ((command (plist-get properties :command)) - (patterns (plist-get properties :error-patterns)) - (parser (or (plist-get properties :error-parser) - #'flycheck-parse-with-patterns)) - (enabled (plist-get properties :enabled)) - (standard-input (plist-get properties :standard-input))) - (unless command - (error "Missing :command in syntax checker %s" symbol)) - (unless (stringp (car command)) - (error "Command executable for syntax checker %s must be a string: %S" - symbol (car command))) - (dolist (arg (cdr command)) - (unless (flycheck-command-argument-p arg) - (error "Invalid command argument %S in syntax checker %s" arg symbol))) - (when (and (eq parser 'flycheck-parse-with-patterns) - (not patterns)) - (error "Missing :error-patterns in syntax checker %s" symbol)) - - (setq properties - ;; Automatically disable command checkers if the executable does not - ;; exist. - (plist-put properties :enabled - (lambda () - (and (flycheck-find-checker-executable symbol) - (flycheck-temp-files-writable-p symbol) - (or (not enabled) (funcall enabled)))))) - - (apply #'flycheck-define-generic-checker symbol docstring - :start #'flycheck-start-command-checker - :interrupt #'flycheck-interrupt-command-checker - :print-doc #'flycheck-command-checker-print-doc - properties) - - ;; Pre-compile all errors patterns into strings, so that we don't need to do - ;; that on each error parse - (let ((patterns (seq-map (lambda (p) - (cons (flycheck-rx-to-string `(and ,@(cdr p)) - 'no-group) - (car p))) - patterns))) - (pcase-dolist (`(,prop . ,value) - `((command . ,command) - (error-parser . ,parser) - (error-patterns . ,patterns) - (standard-input . ,standard-input))) - (setf (flycheck-checker-get symbol prop) value))))) - -(eval-and-compile - ;; Make this function available during byte-compilation, since we need it - ;; at macro expansion of `flycheck-def-executable-var'. - (defun flycheck-checker-executable-variable (checker) - "Get the executable variable of CHECKER. - -The executable variable is named `flycheck-CHECKER-executable'." - (intern (format "flycheck-%s-executable" checker)))) - -(defun flycheck-checker-default-executable (checker) - "Get the default executable of CHECKER." - (car (flycheck-checker-get checker 'command))) - -(defun flycheck-checker-executable (checker) - "Get the command executable of CHECKER. - -The executable is either the value of the variable -`flycheck-CHECKER-executable', or the default executable given in -the syntax checker definition, if the variable is nil." - (let ((var (flycheck-checker-executable-variable checker))) - (or (and (boundp var) (symbol-value var)) - (flycheck-checker-default-executable checker)))) - -(defun flycheck-find-checker-executable (checker) - "Get the full path of the executable of CHECKER. - -Return the full absolute path to the executable of CHECKER, or -nil if the executable does not exist." - (funcall flycheck-executable-find (flycheck-checker-executable checker))) - -(defun flycheck-checker-arguments (checker) - "Get the command arguments of CHECKER." - (cdr (flycheck-checker-get checker 'command))) - -(defun flycheck-substitute-argument (arg checker) - "Substitute ARG for CHECKER. - -Return a list of real arguments for the executable of CHECKER, -substituted for the symbolic argument ARG. Single arguments, -e.g. if ARG is a literal strings, are wrapped in a list. - -ARG may be one of the following forms: - -STRING - Return ARG unchanged. - -`source', `source-inplace' - Create a temporary file to check and return its path. With - `source-inplace' create the temporary file in the same - directory as the original file. The value of - `flycheck-temp-prefix' is used as prefix of the file name. - - With `source', try to retain the non-directory component of - the buffer's file name in the temporary file. - - `source' is the preferred way to pass the input file to a - syntax checker. `source-inplace' should only be used if the - syntax checker needs other files from the source directory, - such as include files in C. - -`(source SUFFIX)', `(source-inplace SUFFIX)' - Like `source' and `source-inplace', but ensure generated - file names end with the given suffix. Use this when the - checker requires that file names on its command line have a - certain suffix (file extension). - -`source-original' - Return the path of the actual file to check, or an empty - string if the buffer has no file name. - - Note that the contents of the file may not be up to date - with the contents of the buffer to check. Do not use this - as primary input to a checker, unless absolutely necessary. - - When using this symbol as primary input to the syntax - checker, add `flycheck-buffer-saved-p' to the `:predicate'. - -`temporary-directory' - Create a unique temporary directory and return its path. - -`temporary-file-name' - Return a unique temporary filename. The file is *not* - created. - - To ignore the output of syntax checkers, try `null-device' - first. - -`null-device' - Return the value of `null-device', i.e the system null - device. - - Use this option to ignore the output of a syntax checker. - If the syntax checker cannot handle the null device, or - won't write to an existing file, try `temporary-file-name' - instead. - -`(config-file OPTION VARIABLE [PREPEND-FN])' - Search the configuration file bound to VARIABLE with - `flycheck-locate-config-file' and return a list of arguments - that pass this configuration file to the syntax checker, or - nil if the configuration file was not found. - - PREPEND-FN is called with the OPTION and the located - configuration file, and should return OPTION prepended - before the file, either a string or as list. If omitted, - PREPEND-FN defaults to `list'. - -`(option OPTION VARIABLE [PREPEND-FN [FILTER]])' - Retrieve the value of VARIABLE and return a list of - arguments that pass this value as value for OPTION to the - syntax checker. - - PREPEND-FN is called with the OPTION and the value of - VARIABLE, and should return OPTION prepended before the - file, either a string or as list. If omitted, PREPEND-FN - defaults to `list'. - - FILTER is an optional function to be applied to the value of - VARIABLE before prepending. This function must return nil - or a string. In the former case, return nil. In the latter - case, return a list of arguments as described above. - -`(option-list OPTION VARIABLE [PREPEND-FN [FILTER]])' - Retrieve the value of VARIABLE, which must be a list, - and prepend OPTION before each item in this list, using - PREPEND-FN. - - PREPEND-FN is called with the OPTION and each item of the - list as second argument, and should return OPTION prepended - before the item, either as string or as list. If omitted, - PREPEND-FN defaults to `list'. - - FILTER is an optional function to be applied to each item in - the list before prepending OPTION. It shall return the - option value for each item as string, or nil, if the item is - to be ignored. - -`(option-flag OPTION VARIABLE)' - Retrieve the value of VARIABLE and return OPTION, if the - value is non-nil. Otherwise return nil. - -`(eval FORM)' - Return the result of evaluating FORM in the buffer to be - checked. FORM must either return a string or a list of - strings, or nil to indicate that nothing should be - substituted for CELL. For all other return types, signal an - error - - _No_ further substitutions are performed, neither in FORM - before it is evaluated, nor in the result of evaluating - FORM. - -In all other cases, signal an error. - -Note that substitution is *not* recursive. No symbols or cells -are substituted within the body of cells!" - (pcase arg - ((pred stringp) (list arg)) - (`source - (list (flycheck-save-buffer-to-temp #'flycheck-temp-file-system))) - (`source-inplace - (list (flycheck-save-buffer-to-temp #'flycheck-temp-file-inplace))) - (`(source ,suffix) - (list (flycheck-save-buffer-to-temp - (lambda (filename) (flycheck-temp-file-system filename suffix))))) - (`(source-inplace ,suffix) - (list (flycheck-save-buffer-to-temp - (lambda (filename) (flycheck-temp-file-inplace filename suffix))))) - (`source-original (list (or (buffer-file-name) ""))) - (`temporary-directory (list (flycheck-temp-dir-system))) - (`temporary-file-name - (let ((directory (flycheck-temp-dir-system))) - (list (make-temp-name (expand-file-name "flycheck" directory))))) - (`null-device (list null-device)) - (`(config-file ,option-name ,file-name-var) - (-when-let* ((value (symbol-value file-name-var)) - (file-name (flycheck-locate-config-file value checker))) - (flycheck-prepend-with-option option-name (list file-name)))) - (`(config-file ,option-name ,file-name-var ,prepend-fn) - (-when-let* ((value (symbol-value file-name-var)) - (file-name (flycheck-locate-config-file value checker))) - (flycheck-prepend-with-option option-name (list file-name) prepend-fn))) - (`(option ,option-name ,variable) - (-when-let (value (symbol-value variable)) - (unless (stringp value) - (error "Value %S of %S for option %s is not a string" - value variable option-name)) - (flycheck-prepend-with-option option-name (list value)))) - (`(option ,option-name ,variable ,prepend-fn) - (-when-let (value (symbol-value variable)) - (unless (stringp value) - (error "Value %S of %S for option %s is not a string" - value variable option-name)) - (flycheck-prepend-with-option option-name (list value) prepend-fn))) - (`(option ,option-name ,variable ,prepend-fn ,filter) - (-when-let (value (funcall filter (symbol-value variable))) - (unless (stringp value) - (error "Value %S of %S (filter: %S) for option %s is not a string" - value variable filter option-name)) - (flycheck-prepend-with-option option-name (list value) prepend-fn))) - (`(option-list ,option-name ,variable) - (let ((value (symbol-value variable))) - (unless (and (listp value) (seq-every-p #'stringp value)) - (error "Value %S of %S for option %S is not a list of strings" - value variable option-name)) - (flycheck-prepend-with-option option-name value))) - (`(option-list ,option-name ,variable ,prepend-fn) - (let ((value (symbol-value variable))) - (unless (and (listp value) (seq-every-p #'stringp value)) - (error "Value %S of %S for option %S is not a list of strings" - value variable option-name)) - (flycheck-prepend-with-option option-name value prepend-fn))) - (`(option-list ,option-name ,variable ,prepend-fn ,filter) - (let ((value (delq nil (seq-map filter (symbol-value variable))))) - (unless (and (listp value) (seq-every-p #'stringp value)) - (error "Value %S of %S for option %S is not a list of strings" - value variable option-name)) - (flycheck-prepend-with-option option-name value prepend-fn))) - (`(option-flag ,option-name ,variable) - (when (symbol-value variable) - (list option-name))) - (`(eval ,form) - (let ((result (eval form))) - (cond - ((and (listp result) (seq-every-p #'stringp result)) result) - ((stringp result) (list result)) - (t (error "Invalid result from evaluation of %S: %S" form result))))) - (_ (error "Unsupported argument %S" arg)))) - -(defun flycheck-checker-substituted-arguments (checker) - "Get the substituted arguments of a CHECKER. - -Substitute each argument of CHECKER using -`flycheck-substitute-argument'. This replaces any special -symbols in the command." - (apply #'append - (seq-map (lambda (arg) (flycheck-substitute-argument arg checker)) - (flycheck-checker-arguments checker)))) - -(defun flycheck--process-send-buffer-contents-chunked (process) - "Send contents of current buffer to PROCESS in small batches. - -Send the entire buffer to the standard input of PROCESS in chunks -of 4096 characters. Chunking is done in Emacs Lisp, hence this -function is probably far less efficient than -`send-process-region'. Use only when required." - (let ((from (point-min))) - (while (< from (point-max)) - (let ((to (min (+ from 4096) (point-max)))) - (process-send-region process from to) - (setq from to))))) - -(defvar flycheck-chunked-process-input - ;; Chunk process output on Windows to work around - ;; https://github.com/flycheck/flycheck/issues/794 and - ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22344. The presence of - ;; `w32-pipe-buffer-size' denotes an Emacs version (> Emacs 25.1) where pipe - ;; writes on Windows are fixed. - ;; - ;; TODO: Remove option and chunking when dropping Emacs 24 support, see - ;; https://github.com/flycheck/flycheck/issues/856 - (and (eq system-type 'windows-nt) (not (boundp 'w32-pipe-buffer-size))) - "If non-nil send process input in small chunks. - -If this variable is non-nil `flycheck-process-send-buffer' sends -buffer contents in small chunks. - -Defaults to nil, except on Windows to work around Emacs bug -#22344.") - -(defun flycheck-process-send-buffer (process) - "Send all contents of current buffer to PROCESS. - -Sends all contents of the current buffer to the standard input of -PROCESS, and terminates standard input with EOF. - -If `flycheck-chunked-process-input' is non-nil, send buffer -contents in chunks via -`flycheck--process-send-buffer-contents-chunked', which see. -Otherwise use `process-send-region' to send all contents at once -and rely on Emacs' own buffering and chunking." - (save-restriction - (widen) - (if flycheck-chunked-process-input - (flycheck--process-send-buffer-contents-chunked process) - (process-send-region process (point-min) (point-max)))) - (process-send-eof process)) - -(defun flycheck--wrap-command (prog args) - "Wrap PROG and ARGS using `flycheck-command-wrapper-function'." - ;; We don't call `flycheck-executable-find' on the output of the wrapper - ;; function, since it might not expect it (an executable-find function - ;; designed to find binaries in a sandbox could get confused if we asked it - ;; about the sandboxing program itself). - (funcall flycheck-command-wrapper-function (cons prog args))) - -(defun flycheck-start-command-checker (checker callback) - "Start a command CHECKER with CALLBACK." - (let (process) - (condition-case err - (let* ((program (flycheck-find-checker-executable checker)) - (args (flycheck-checker-substituted-arguments checker)) - (command (flycheck--wrap-command program args)) - (sentinel-events nil) - ;; Use pipes to receive output from the syntax checker. They are - ;; more efficient and more robust than PTYs, which Emacs uses by - ;; default, and since we don't need any job control features, we - ;; can easily use pipes. - (process-connection-type nil)) - ;; We pass do not associate the process with any buffer, by - ;; passing nil for the BUFFER argument of `start-process'. - ;; Instead, we just remember the buffer being checked in a - ;; process property (see below). This neatly avoids all - ;; side-effects implied by attached a process to a buffer, which - ;; may cause conflicts with other packages. - ;; - ;; See https://github.com/flycheck/flycheck/issues/298 for an - ;; example for such a conflict. - (setq process (apply 'start-process (format "flycheck-%s" checker) - nil command)) - ;; Process sentinels can be called while sending input to the process. - ;; We want to record errors raised by process-send before calling - ;; `flycheck-handle-signal', so initially just accumulate events. - (setf (process-sentinel process) - (lambda (_ event) (push event sentinel-events))) - (setf (process-filter process) #'flycheck-receive-checker-output) - (set-process-query-on-exit-flag process nil) - ;; Remember the syntax checker, the buffer and the callback - (process-put process 'flycheck-checker checker) - (process-put process 'flycheck-callback callback) - (process-put process 'flycheck-buffer (current-buffer)) - ;; The default directory is bound in the `flycheck-syntax-check-start' - ;; function. - (process-put process 'flycheck-working-directory default-directory) - ;; Track the temporaries created by argument substitution in the - ;; process itself, to get rid of the global state ASAP. - (process-put process 'flycheck-temporaries flycheck-temporaries) - (setq flycheck-temporaries nil) - ;; Send the buffer to the process on standard input, if enabled. - (when (flycheck-checker-get checker 'standard-input) - (condition-case err - (flycheck-process-send-buffer process) - ;; Some checkers exit before reading all input, causing errors - ;; such as a `file-error' for a closed pipe, or a plain “no longer - ;; connected to pipe; closed it†error for a disconnection. We - ;; report them if needed in `flycheck-finish-checker-process' (see - ;; `https://github.com/flycheck/flycheck/issues/1278'). - (error (process-put process 'flycheck-error err)))) - ;; Set the actual sentinel and process any events that might have - ;; happened while we were sending input. - (setf (process-sentinel process) #'flycheck-handle-signal) - (dolist (event (nreverse sentinel-events)) - (flycheck-handle-signal process event)) - ;; Return the process. - process) - (error - ;; In case of error, clean up our resources, and report the error back to - ;; Flycheck. - (flycheck-safe-delete-temporaries) - (when process - ;; No need to explicitly delete the temporary files of the process, - ;; because deleting runs the sentinel, which will delete them anyway. - (delete-process process)) - (signal (car err) (cdr err)))))) - -(defun flycheck-interrupt-command-checker (_checker process) - "Interrupt a PROCESS." - ;; Deleting the process always triggers the sentinel, which does the cleanup - (when process - (delete-process process))) - -(defun flycheck-command-checker-print-doc (checker) - "Print additional documentation for a command CHECKER." - (let ((executable (flycheck-checker-default-executable checker)) - (config-file-var (flycheck-checker-get checker 'config-file-var)) - (option-vars (seq-sort #'string< - (flycheck-checker-get checker 'option-vars)))) - (princ "\n") - - (let ((doc-start (with-current-buffer standard-output (point-max)))) - ;; Track the start of our documentation so that we can re-indent it - ;; properly - (princ " This syntax checker executes \"") - (princ executable) - (princ "\"") - (when config-file-var - (princ ", using a configuration file from `") - (princ (symbol-name config-file-var)) - (princ "'")) - (princ ". The executable can be overridden with `") - (princ (symbol-name (flycheck-checker-executable-variable checker))) - (princ "'.") - - (with-current-buffer standard-output - (save-excursion - (fill-region-as-paragraph doc-start (point-max))))) - (princ "\n") - (when option-vars - (princ - "\n This syntax checker can be configured with these options:\n\n") - (dolist (var option-vars) - (princ (format " * `%s'\n" var)))))) - -(defun flycheck-verify-command-checker (checker) - "Verify a command CHECKER in the current buffer. - -Return a list of `flycheck-verification-result' objects for -CHECKER." - (let ((executable (flycheck-find-checker-executable checker)) - (config-file-var (flycheck-checker-get checker 'config-file-var))) - `( - ,(flycheck-verification-result-new - :label "executable" - :message (if executable (format "Found at %s" executable) "Not found") - :face (if executable 'success '(bold error))) - ,@(when config-file-var - (let* ((value (symbol-value config-file-var)) - (path (and value (flycheck-locate-config-file value checker)))) - (list (flycheck-verification-result-new - :label "configuration file" - :message (if path (format "Found at %S" path) "Not found") - :face (if path 'success 'warning))))) - ,@(when (not (flycheck-temp-files-writable-p checker)) - (list (flycheck-verification-result-new - :label "temp directory" - :message (format "%s is not writable" - (flycheck-temp-directory checker)) - :face 'error)))))) - - -;;; Process management for command syntax checkers -(defun flycheck-receive-checker-output (process output) - "Receive a syntax checking PROCESS OUTPUT." - (push output (process-get process 'flycheck-pending-output))) - -(defun flycheck-get-output (process) - "Get the complete output of PROCESS." - (with-demoted-errors "Error while retrieving process output: %S" - (let ((pending-output (process-get process 'flycheck-pending-output))) - (apply #'concat (nreverse pending-output))))) - -(defun flycheck-handle-signal (process _event) - "Handle a signal from the syntax checking PROCESS. - -_EVENT is ignored." - (when (memq (process-status process) '(signal exit)) - (let ((files (process-get process 'flycheck-temporaries)) - (buffer (process-get process 'flycheck-buffer)) - (callback (process-get process 'flycheck-callback)) - (cwd (process-get process 'flycheck-working-directory)) - (err (process-get process 'flycheck-error))) - ;; Delete the temporary files - (seq-do #'flycheck-safe-delete files) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (condition-case err - (pcase (process-status process) - (`signal - (funcall callback 'interrupted)) - (`exit - (flycheck-finish-checker-process - (process-get process 'flycheck-checker) - (or err (process-exit-status process)) - files - (flycheck-get-output process) callback cwd))) - ((debug error) - (funcall callback 'errored (error-message-string err))))))))) - -(defun flycheck-finish-checker-process - (checker exit-status files output callback cwd) - "Finish a checker process from CHECKER with EXIT-STATUS. - -EXIT-STATUS can be a number or an arbitrary form (if it is not 0, -a `suspicious' status is reported to CALLBACK). - -FILES is a list of files given as input to the checker. OUTPUT -is the output of the syntax checker. CALLBACK is the status -callback to use for reporting. - -Parse the OUTPUT and report an appropriate error status. - -Resolve all errors in OUTPUT using CWD as working directory." - (let ((errors (flycheck-parse-output output checker (current-buffer)))) - (when (and (not (equal exit-status 0)) (null errors)) - ;; Warn about a suspicious result from the syntax checker. We do right - ;; after parsing the errors, before filtering, because a syntax checker - ;; might report errors from other files (e.g. includes) even if there - ;; are no errors in the file being checked. - (funcall callback 'suspicious - (format "Flycheck checker %S returned %S, but \ -its output contained no errors: %s\nTry installing a more \ -recent version of %S, and please open a bug report if the issue \ -persists in the latest release. Thanks!" checker exit-status -output checker))) - (funcall callback 'finished - ;; Fix error file names, by substituting them backwards from the - ;; temporaries. - (seq-map (lambda (e) (flycheck-fix-error-filename e files cwd)) - errors)))) - - -;;; Executables of command checkers. -(defmacro flycheck-def-executable-var (checker default-executable) - "Define the executable variable for CHECKER. - -DEFAULT-EXECUTABLE is the default executable. It is only used in -the docstring of the variable. - -The variable is defined with `defcustom' in the -`flycheck-executables' group. It's also defined to be risky as -file-local variable, to avoid arbitrary executables being used -for syntax checking." - (let ((executable-var (flycheck-checker-executable-variable checker))) - `(progn - (defcustom ,executable-var nil - ,(format "The executable of the %s syntax checker. - -Either a string containing the name or the path of the -executable, or nil to use the default executable from the syntax -checker declaration. - -The default executable is %S." checker default-executable) - :type '(choice (const :tag "Default executable" nil) - (string :tag "Name or path")) - :group 'flycheck-executables - :risky t)))) - -(defun flycheck-set-checker-executable (checker &optional executable) - "Set the executable of CHECKER in the current buffer. - -CHECKER is a syntax checker symbol. EXECUTABLE is a string with -the name of an executable or the path to an executable file, which -is to be used as executable for CHECKER. If omitted or nil, -reset the executable of CHECKER. - -Interactively, prompt for a syntax checker and an executable -file, and set the executable of the selected syntax checker. -With prefix arg, prompt for a syntax checker only, and reset the -executable of the select checker to the default. - -Set the executable variable of CHECKER, that is, -`flycheck-CHECKER-executable' to EXECUTABLE. Signal -`user-error', if EXECUTABLE does not denote a command or an -executable file. - -This command is intended for interactive use only. In Lisp, just -`let'-bind the corresponding variable, or set it directly. Use -`flycheck-checker-executable-variable' to obtain the executable -variable symbol for a syntax checker." - (declare (interactive-only "Set the executable variable directly instead")) - (interactive - (let* ((checker (flycheck-read-checker "Syntax checker: ")) - (default-executable (flycheck-checker-default-executable checker)) - (executable (if current-prefix-arg - nil - (read-file-name "Executable: " nil default-executable - nil nil flycheck-executable-find)))) - (list checker executable))) - (when (and executable (not (funcall flycheck-executable-find executable))) - (user-error "%s is no executable" executable)) - (let ((variable (flycheck-checker-executable-variable checker))) - (set (make-local-variable variable) executable))) - - -;;; Configuration files and options for command checkers -(defun flycheck-register-config-file-var (var checkers) - "Register VAR as config file var for CHECKERS. - -CHECKERS is a single syntax checker or a list thereof." - (when (symbolp checkers) - (setq checkers (list checkers))) - (dolist (checker checkers) - (setf (flycheck-checker-get checker 'config-file-var) var))) - -;;;###autoload -(defmacro flycheck-def-config-file-var (symbol checker &optional file-name - &rest custom-args) - "Define SYMBOL as config file variable for CHECKER, with default FILE-NAME. - -SYMBOL is declared as customizable variable using `defcustom', to -provide configuration files for the given syntax CHECKER. -CUSTOM-ARGS are forwarded to `defcustom'. - -FILE-NAME is the initial value of the new variable. If omitted, -the default value is nil. It can be either a string or a list of -strings. - -Use this together with the `config-file' form in the `:command' -argument to `flycheck-define-checker'." - (declare (indent 3)) - `(progn - (defcustom ,symbol ,file-name - ,(format "Configuration file for `%s'. - -If set to a string, locate the configuration file using the -functions from `flycheck-locate-config-file-functions'. If the -file is found pass it to the syntax checker as configuration -file. - -If no configuration file is found, or if this variable is set to -nil, invoke the syntax checker without a configuration file. - -Use this variable as file-local variable if you need a specific -configuration file for a buffer." checker) - :type '(choice (const :tag "No configuration file" nil) - (string :tag "File name or path") - (repeat :tag "File names or paths" string)) - :safe #'flycheck-string-or-string-list-p - :group 'flycheck-config-files - ,@custom-args) - (flycheck-register-config-file-var ',symbol ',checker))) - -(defun flycheck-locate-config-file (filenames checker) - "Locate the configuration file for CHECKER, based on FILENAMES. - -FILENAMES can be either a single file, or a list. Each filename -is passed to all `flycheck-locate-config-file-functions', until -one returns non-nil. - -Return the absolute path of the configuration file, or nil if no -configuration file was found." - (when (stringp filenames) - (setq filenames (list filenames))) - (let ((config-file nil)) - (while (and filenames (null config-file)) - (setq config-file (run-hook-with-args-until-success - 'flycheck-locate-config-file-functions - (pop filenames) checker))) - (when (and config-file (file-exists-p config-file)) - config-file))) - -(defun flycheck-locate-config-file-by-path (filepath _checker) - "Locate a configuration file by a FILEPATH. - -If FILEPATH is a contains a path separator, expand it against the -default directory and return it if it points to an existing file. -Otherwise return nil. - -_CHECKER is ignored." - ;; If the path is just a plain file name, skip it. - (unless (string= (file-name-nondirectory filepath) filepath) - (let ((file-name (expand-file-name filepath))) - (and (file-exists-p file-name) file-name)))) - -(defun flycheck-locate-config-file-ancestor-directories (filename _checker) - "Locate a configuration FILENAME in ancestor directories. - -If the current buffer has a file name, search FILENAME in the -directory of the current buffer and all ancestors thereof (see -`locate-dominating-file'). If the file is found, return its -absolute path. Otherwise return nil. - -_CHECKER is ignored." - (-when-let* ((basefile (buffer-file-name)) - (directory (locate-dominating-file basefile filename))) - (expand-file-name filename directory))) - -(defun flycheck-locate-config-file-home (filename _checker) - "Locate a configuration FILENAME in the home directory. - -Return the absolute path, if FILENAME exists in the user's home -directory, or nil otherwise." - (let ((path (expand-file-name filename "~"))) - (when (file-exists-p path) - path))) - -(seq-do (apply-partially #'custom-add-frequent-value - 'flycheck-locate-config-file-functions) - '(flycheck-locate-config-file-by-path - flycheck-locate-config-file-ancestor-directories - flycheck-locate-config-file-home)) - -(defun flycheck-register-option-var (var checkers) - "Register an option VAR with CHECKERS. - -VAR is an option symbol, and CHECKERS a syntax checker symbol or -a list thereof. Register VAR with all CHECKERS so that it -appears in the help output." - (when (symbolp checkers) - (setq checkers (list checkers))) - (dolist (checker checkers) - (cl-pushnew var (flycheck-checker-get checker 'option-vars)))) - -;;;###autoload -(defmacro flycheck-def-option-var (symbol init-value checkers docstring - &rest custom-args) - "Define SYMBOL as option variable with INIT-VALUE for CHECKER. - -SYMBOL is declared as customizable variable using `defcustom', to -provide an option for the given syntax CHECKERS (a checker or a -list of checkers). INIT-VALUE is the initial value of the -variable, and DOCSTRING is its docstring. CUSTOM-ARGS are -forwarded to `defcustom'. - -Use this together with the `option', `option-list' and -`option-flag' forms in the `:command' argument to -`flycheck-define-checker'." - (declare (indent 3) - (doc-string 4)) - `(progn - (defcustom ,symbol ,init-value - ,(concat docstring " - -This variable is an option for the following syntax checkers: - -" - (mapconcat (lambda (c) (format " - `%s'" c)) - (if (symbolp checkers) (list checkers) checkers) - "\n")) - :group 'flycheck-options - ,@custom-args) - (flycheck-register-option-var ',symbol ',checkers))) - -(defun flycheck-option-int (value) - "Convert an integral option VALUE to a string. - -If VALUE is nil, return nil. Otherwise return VALUE converted to -a string." - (and value (number-to-string value))) - -(defun flycheck-option-symbol (value) - "Convert a symbol option VALUE to string. - -If VALUE is nil return nil. Otherwise return VALUE converted to -a string." - (and value (symbol-name value))) - -(defun flycheck-option-comma-separated-list (value &optional separator filter) - "Convert VALUE into a list separated by SEPARATOR. - -SEPARATOR is a string to separate items in VALUE, defaulting to -\",\". FILTER is an optional function, which takes a single -argument and returns either a string or nil. - -If VALUE is a list, apply FILTER to each item in VALUE, remove -all nil items, and return a single string of all remaining items -separated by SEPARATOR. - -Otherwise, apply FILTER to VALUE and return the result. -SEPARATOR is ignored in this case." - (let ((filter (or filter #'identity)) - (separator (or separator ","))) - (if (listp value) - (-when-let (value (delq nil (seq-map filter value))) - (string-join value separator)) - (funcall filter value)))) - -(defmacro flycheck-def-args-var (symbol checkers &rest custom-args) - "Define SYMBOL as argument variable for CHECKERS. - -SYMBOL is declared as customizable, risky and buffer-local -variable using `defcustom' to provide an option for arbitrary -arguments for the given syntax CHECKERS (either a single checker -or a list of checkers). CUSTOM-ARGS is forwarded to `defcustom'. - -Use the `eval' form to splice this variable into the -`:command'." - (declare (indent 2)) - `(flycheck-def-option-var ,symbol nil ,checkers - "A list of additional command line arguments. - -The value of this variable is a list of strings with additional -command line arguments." - :risky t - :type '(repeat (string :tag "Argument")) - ,@custom-args)) - - -;;; Command syntax checkers as compile commands -(defun flycheck-checker-pattern-to-error-regexp (pattern) - "Convert PATTERN into an error regexp for compile.el. - -Return a list representing PATTERN, suitable as element in -`compilation-error-regexp-alist'." - (let* ((regexp (car pattern)) - (level (cdr pattern)) - (level-no (flycheck-error-level-compilation-level level))) - `(,regexp 1 (2 . 6) (3 . 7) ,level-no))) - -(defun flycheck-checker-compilation-error-regexp-alist (checker) - "Convert error patterns of CHECKER for use with compile.el. - -Return an alist of all error patterns of CHECKER, suitable for -use with `compilation-error-regexp-alist'." - (seq-map #'flycheck-checker-pattern-to-error-regexp - (flycheck-checker-get checker 'error-patterns))) - -(defun flycheck--substitute-shell-command-argument (arg checker) - "Substitute ARG for CHECKER. - -Like `flycheck-substitute-argument', except for source, -source-inplace, and source-original." - (if (memq arg '(source source-inplace source-original)) - (list buffer-file-name) - (flycheck-substitute-argument arg checker))) - -(defun flycheck--checker-substituted-shell-command-arguments (checker) - "Get the substituted arguments of a CHECKER to run as a shell command. - -Substitute each argument of CHECKER using -`flycheck-substitute-shell-command-argument'." - (apply #'append - (seq-map (lambda (arg) - (flycheck--substitute-shell-command-argument arg checker)) - (flycheck-checker-arguments checker)))) - -(defun flycheck-checker-shell-command (checker) - "Get a shell command for CHECKER. - -Perform substitution in the arguments of CHECKER, but with -`flycheck--substitute-shell-command-argument'. - -Return the command of CHECKER as single string, suitable for -shell execution." - ;; Note: Do NOT use `combine-and-quote-strings' here. Despite it's name it - ;; does not properly quote shell arguments, and actually breaks for special - ;; characters. See https://github.com/flycheck/flycheck/pull/522 - (let* ((args (flycheck--checker-substituted-shell-command-arguments checker)) - (program - (or (flycheck-find-checker-executable checker) - (user-error "Cannot find `%s' using `flycheck-executable-find'" - (flycheck-checker-executable checker)))) - (wrapped (flycheck--wrap-command program args)) - (abs-prog - ;; The executable path returned by `flycheck-command-wrapper-function' - ;; may not be absolute, so expand it here. See URL - ;; `https://github.com/flycheck/flycheck/issues/1461'. - (or (executable-find (car wrapped)) - (user-error "Cannot find `%s' using `executable-find'" - (car wrapped)))) - (command (mapconcat #'shell-quote-argument - (cons abs-prog (cdr wrapped)) " "))) - (if (flycheck-checker-get checker 'standard-input) - ;; If the syntax checker expects the source from standard input add an - ;; appropriate shell redirection - (concat command " < " (shell-quote-argument (buffer-file-name))) - command))) - -(defun flycheck-compile-name (_name) - "Get a name for a Flycheck compilation buffer. - -_NAME is ignored." - (format "*Flycheck %s*" (buffer-file-name))) - -(defun flycheck-compile (checker) - "Run CHECKER via `compile'. - -CHECKER must be a valid syntax checker. Interactively, prompt -for a syntax checker to run. - -Instead of highlighting errors in the buffer, this command pops -up a separate buffer with the entire output of the syntax checker -tool, just like `compile' (\\[compile])." - (interactive - (let ((default (flycheck-get-checker-for-buffer))) - (list (flycheck-read-checker "Run syntax checker as compile command: " - (when (flycheck-checker-get default 'command) - default) - 'command)))) - (unless (flycheck-valid-checker-p checker) - (user-error "%S is not a valid syntax checker" checker)) - (unless (buffer-file-name) - (user-error "Cannot compile a buffer without a backing file")) - (unless (flycheck-may-use-checker checker) - (user-error "Cannot use syntax checker %S in this buffer" checker)) - (unless (flycheck-checker-executable checker) - (user-error "Cannot run checker %S as shell command" checker)) - (save-some-buffers) - (let* ((default-directory (flycheck-compute-working-directory checker)) - (command (flycheck-checker-shell-command checker)) - (buffer (compilation-start command nil #'flycheck-compile-name))) - (with-current-buffer buffer - (setq-local compilation-error-regexp-alist - (flycheck-checker-compilation-error-regexp-alist checker))))) - - -;;; General error parsing for command checkers -(defun flycheck-parse-output (output checker buffer) - "Parse OUTPUT from CHECKER in BUFFER. - -OUTPUT is a string with the output from the checker symbol -CHECKER. BUFFER is the buffer which was checked. - -Return the errors parsed with the error patterns of CHECKER." - (funcall (flycheck-checker-get checker 'error-parser) output checker buffer)) - -(defun flycheck-fix-error-filename (err buffer-files cwd) - "Fix the file name of ERR from BUFFER-FILES. - -Resolves error file names relative to CWD directory. - -Make the file name of ERR absolute. If the absolute file name of -ERR is in BUFFER-FILES, replace it with the value of variable -`buffer-file-name'." - (flycheck-error-with-buffer err - (-when-let (filename (flycheck-error-filename err)) - (when (seq-some (apply-partially #'flycheck-same-files-p - (expand-file-name filename cwd)) - buffer-files) - (setf (flycheck-error-filename err) buffer-file-name) - (when (and buffer-file-name (flycheck-error-message err)) - (setf (flycheck-error-message err) - (replace-regexp-in-string - (regexp-quote filename) buffer-file-name - (flycheck-error-message err) 'fixed-case 'literal)))))) - err) - - -;;; Error parsers for command syntax checkers -(defun flycheck-parse-xml-region (beg end) - "Parse the xml region between BEG and END. - -Wrapper around `xml-parse-region' which transforms the return -value of this function into one compatible to -`libxml-parse-xml-region' by simply returning the first element -from the node list." - (ignore-errors (car (xml-parse-region beg end)))) - -(defun flycheck-parse-xml-region-with-fallback (beg end) - "Parse the xml region between BEG and END. - -Try parsing with libxml first; if that fails, revert to -`flycheck-parse-xml-region'. Failures can be caused by incorrect -XML (see URL `https://github.com/flycheck/flycheck/issues/1298'), -or on Windows by a missing libxml DLL with a libxml-enabled Emacs -\(see URL `https://github.com/flycheck/flycheck/issues/1330')." - ;; FIXME use `libxml-available-p' when it gets implemented. - (or (and (fboundp 'libxml-parse-xml-region) - (libxml-parse-xml-region beg end)) - (flycheck-parse-xml-region beg end))) - -(defvar flycheck-xml-parser 'flycheck-parse-xml-region-with-fallback - "Function used to parse an xml string from a region. - -The default uses libxml if available, and falls back to -`flycheck-parse-xml-region' otherwise.") - -(defun flycheck-parse-xml-string (xml) - "Parse an XML string. - -Return the document tree parsed from XML in the form `(ROOT ATTRS -BODY...)'. ROOT is a symbol identifying the name of the root -element. ATTRS is an alist of the attributes of the root node. -BODY is zero or more body elements, either as strings (in case of -text nodes) or as XML nodes, in the same for as the root node." - (with-temp-buffer - (insert xml) - (funcall flycheck-xml-parser (point-min) (point-max)))) - -(defun flycheck-parse-checkstyle (output checker buffer) - "Parse Checkstyle errors from OUTPUT. - -Parse Checkstyle-like XML output. Use this error parser for -checkers that have an option to output errors in this format. - -CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `http://checkstyle.sourceforge.net/' for information -about Checkstyle." - (pcase (flycheck-parse-xml-string output) - (`(checkstyle ,_ . ,file-nodes) - (let (errors) - (dolist (node file-nodes) - (pcase node - (`(file ,file-attrs . ,error-nodes) - (dolist (node error-nodes) - (pcase node - (`(error ,error-attrs . ,_) - (let-alist error-attrs - (push (flycheck-error-new-at - (flycheck-string-to-number-safe .line) - (flycheck-string-to-number-safe .column) - (pcase .severity - (`"error" 'error) - (`"warning" 'warning) - (`"info" 'info) - ;; Default to error for unknown .severity - (_ 'error)) - .message - :checker checker :id .source - :buffer buffer - :filename (cdr (assq 'name file-attrs))) - errors)))))))) - (nreverse errors))))) - -(defun flycheck-parse-cppcheck (output checker buffer) - "Parse Cppcheck errors from OUTPUT. - -Parse Cppcheck XML v2 output. - -CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `http://cppcheck.sourceforge.net/' for more information -about Cppcheck." - (pcase (flycheck-parse-xml-string output) - (`(results ,_ . ,body) - (let (errors) - (dolist (node body) - (pcase node - (`(errors ,_ . ,error-nodes) - (dolist (node error-nodes) - (pcase node - (`(error ,error-attrs . ,loc-nodes) - (let ((id (cdr (assq 'id error-attrs))) - (message (cdr (assq 'verbose error-attrs))) - (level (pcase (cdr (assq 'severity error-attrs)) - (`"error" 'error) - (`"style" 'info) - (`"information" 'info) - (_ 'warning)))) - (dolist (node loc-nodes) - (pcase node - (`(location ,loc-attrs . ,_) - (let-alist loc-attrs - (push (flycheck-error-new-at - (flycheck-string-to-number-safe .line) - nil - level - ;; cppcheck return newline characters as "\012" - (replace-regexp-in-string "\\\\012" "\n" - message) - :id id - :checker checker - :buffer buffer - :filename .file) - errors)))))))))))) - (nreverse errors))))) - -(defun flycheck-parse-phpmd (output checker buffer) - "Parse phpmd errors from OUTPUT. - -CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `http://phpmd.org/' for more information about phpmd." - (pcase (flycheck-parse-xml-string output) - (`(pmd ,_ . ,body) - (let (errors) - (dolist (node body) - (pcase node - (`(file ,file-attrs . ,violation-nodes) - (let ((filename (cdr (assq 'name file-attrs)))) - (dolist (node violation-nodes) - (pcase node - (`(violation ,vio-attrs ,(and message (pred stringp))) - (let-alist vio-attrs - (push - (flycheck-error-new-at - (flycheck-string-to-number-safe .beginline) - nil - 'warning (string-trim message) - ;; Ignore .endline (phpmd marks giant spans as errors) - ;; :end-line (flycheck-string-to-number-safe .endline) - :id .rule - :checker checker - :buffer buffer - :filename filename) - errors))))))))) - (nreverse errors))))) - -(defun flycheck-parse-reek (output checker buffer) - "Parse Reek warnings from JSON OUTPUT. - -CHECKER and BUFFER denote the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `https://github.com/troessner/reek' for more information -about Reek." - (let ((errors nil)) - (dolist (message (car (flycheck-parse-json output))) - (let-alist message - (dolist (line (delete-dups .lines)) - (push - (flycheck-error-new-at - line - nil - 'warning (concat .context " " .message) - :id .smell_type - :checker checker - :buffer buffer - :filename .source) - errors)))) - (nreverse errors))) - -(defun flycheck-parse-go-staticcheck (output checker buffer) - "Parse staticheck warnings from JSON OUTPUT. - -CHECKER and BUFFER denote the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `https://staticcheck.io/docs/formatters' for more -information about staticheck." - (let ((errors nil)) - (dolist (msg (flycheck-parse-json output)) - (let-alist msg - (push - (flycheck-error-new-at - .location.line - .location.column - (pcase .severity - (`"error" 'error) - (`"warning" 'warning) - (`"ignored" 'info) - ;; Default to warning for unknown .severity - (_ 'warning)) - .message - :id .code - :checker checker - :buffer buffer - :filename .location.file) - errors))) - (nreverse errors))) - -(defun flycheck-parse-tslint (output checker buffer) - "Parse TSLint errors from JSON OUTPUT. - -CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `https://palantir.github.io/tslint/' for more information -about TSLint." - (seq-map (lambda (message) - (let-alist message - (flycheck-error-new-at - (+ 1 .startPosition.line) - (+ 1 .startPosition.character) - (pcase .ruleSeverity - ("ERROR" 'error) - ("WARNING" 'warning) - (_ 'warning)) - .failure - :id .ruleName - :checker checker - :buffer buffer - :filename .name - :end-line (+ 1 .endPosition.line) - :end-column (+ 1 .endPosition.character)))) - (car (flycheck-parse-json output)))) - -(defun flycheck-parse-rust-collect-spans (span) - "Return a list of spans contained in a SPAN object." - (let ((spans)) - (let-alist span - ;; With macro expansion errors, some spans will point to phony file names - ;; to indicate an error inside the std rust lib. We skip these spans as - ;; they won't appear in flycheck anyway. - (unless (string= .file_name "") - (push span spans)) - - ;; Macro expansion errors will have a span in the 'expansion' field, so we - ;; recursively collect it. - (if .expansion.span - (append (flycheck-parse-rust-collect-spans .expansion.span) - spans) - spans)))) - -(defun flycheck-parse-rustc-diagnostic (diagnostic checker buffer) - "Turn a rustc DIAGNOSTIC into a `flycheck-error'. - -CHECKER and BUFFER denote the CHECKER that returned DIAGNOSTIC -and the BUFFER that was checked respectively. - -DIAGNOSTIC should be a parsed JSON object describing a rustc -diagnostic, following the format described there: - -https://github.com/rust-lang/rust/blob/master/src/librustc_errors/json.rs#L154" - (let ((error-message) - (error-level) - (error-code) - (primary-filename) - (primary-line) - (primary-column) - (primary-end-line) - (primary-end-column) - (group (make-symbol "group")) - (spans) - (children) - (errors)) - ;; The diagnostic format is described in the link above. The gist of it is - ;; that a diagnostic can have several causes in the source text; these - ;; causes are represented by spans. The diagnostic has a message and a - ;; level (error, warning), while the spans have a filename, line, column, - ;; and an optional label. The primary span points to the root cause of the - ;; error in the source text, while non-primary spans point to related - ;; causes. Spans may have an 'expansion' field for macro expansion errors; - ;; these expansion fields will contain another span (and so on). In - ;; addition, a diagnostic can also have children diagnostics that are used - ;; to provide additional information through their message field, but do not - ;; seem to contain any spans (yet). - ;; - ;; We first gather spans in order to turn every span into a flycheck error - ;; object, that we collect into the `errors' list. - - ;; Nested `let-alist' cause compilation warnings, hence we `setq' all - ;; these values here first to avoid nesting. - (let-alist diagnostic - (setq error-message .message - error-level (pcase .level - (`"error" 'error) - (`"warning" 'warning) - (`"note" 'info) - (_ 'error)) - ;; The 'code' field of the diagnostic contains the actual error - ;; code and an optional explanation that we ignore - error-code .code.code - ;; Collect all spans recursively - spans (seq-mapcat #'flycheck-parse-rust-collect-spans .spans) - children .children)) - - ;; Turn each span into a flycheck error - (dolist (span spans) - (let-alist span - ;; Children may not have filename/line/column information, so we use - ;; those from the primary span - (when .is_primary - (setq primary-filename .file_name - primary-line .line_start - primary-column .column_start - primary-end-line .line_end - primary-end-column .column_end)) - (push - (flycheck-error-new-at - .line_start - .column_start - ;; Non-primary spans are used for notes - (if .is_primary error-level 'info) - (if .is_primary - ;; Primary spans may have labels with additional information - (concat error-message (when .label - (format " (%s)" .label))) - ;; If the label is empty, fallback on the error message, - ;; otherwise we won't be able to display anything - (or .label error-message)) - :id error-code - :checker checker - :buffer buffer - :filename .file_name - :group group - :end-line .line_end - :end-column .column_end) - errors))) - - ;; Then we turn children messages into flycheck errors pointing to the - ;; location of the primary span. - (dolist (child children) - (let ((message (let-alist child .message))) - (let-alist (car (let-alist child .spans)) - (push - (flycheck-error-new-at - ;; Use the line/column from the first span if there is one, or - ;; fallback to the line/column information from the primary span of - ;; the diagnostic. - (or .line_start primary-line) - (or .column_start primary-column) - 'info - ;; Messages from `cargo clippy' may suggest replacement code. In - ;; these cases, the `message' field itself is an unhelpful `try' or - ;; `change this to'. We add the `suggested_replacement' field in - ;; these cases. - (if .suggested_replacement - (format "%s: `%s`" message .suggested_replacement) - message) - :id error-code - :checker checker - :buffer buffer - :filename primary-filename - :group group - :end-line (or .line_end primary-end-line) - :end-column (or .column_end primary-end-column)) - errors)))) - - ;; If there are no spans, the error is not associated with a specific - ;; file but with the project as a whole. We still need to report it to - ;; the user by emitting a corresponding flycheck-error object. - (unless spans - (push (flycheck-error-new-at - ;; We have no specific position to attach the error to, so - ;; let's use the top of the file. - 1 1 - error-level - error-message - :id error-code - :checker checker - :buffer buffer - :group group) - errors)) - (nreverse errors))) - -(defconst flycheck--json-parser - (if (and (functionp 'json-parse-buffer) - ;; json-parse-buffer only supports keyword arguments in Emacs 27+ - (>= emacs-major-version 27)) - (lambda () - (json-parse-buffer - :object-type 'alist :array-type 'list - :null-object nil :false-object nil)) - #'json-read) - "Function to use to parse JSON strings.") - -(defun flycheck-parse-json (output) - "Return parsed JSON data from OUTPUT. - -OUTPUT is a string that contains JSON data. Each line of OUTPUT -may be either plain text, a JSON array (starting with `['), or a -JSON object (starting with `{'). - -This function ignores the plain text lines, parses the JSON -lines, and returns the parsed JSON lines in a list." - (let ((objects nil) - (json-array-type 'list) - (json-false nil)) - (with-temp-buffer - (insert output) - (goto-char (point-min)) - (while (not (eobp)) - (when (memq (char-after) '(?\{ ?\[)) - (push (funcall flycheck--json-parser) objects)) - (forward-line))) - (nreverse objects))) - -(defun flycheck-parse-rustc (output checker buffer) - "Parse rustc errors from OUTPUT and return a list of `flycheck-error'. - -CHECKER and BUFFER denote the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -The expected format for OUTPUT is a mix of plain text lines and -JSON lines. This function ignores the plain text lines and -parses only JSON lines. Each JSON line is expected to be a JSON -object that corresponds to a diagnostic from the compiler. The -expected diagnostic format is described there: - -https://github.com/rust-lang/rust/blob/master/src/libsyntax/json.rs#L67-L139" - (seq-mapcat (lambda (msg) - (flycheck-parse-rustc-diagnostic msg checker buffer)) - (flycheck-parse-json output))) - -(defun flycheck-parse-cargo-rustc (output checker buffer) - "Parse Cargo errors from OUTPUT and return a list of `flycheck-error'. - -CHECKER and BUFFER denote the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -The expected format for OUTPUT is a mix of plain text lines and -JSON lines. This function ignores the plain text lines and -parses only JSON lines. Each JSON line is expected to be a JSON -object that represents a message from Cargo. The format of -messages emitted by Cargo is described in cargo's -machine_message.rs at URL `https://git.io/vh24R'." - (let ((errors)) - (dolist (msg (flycheck-parse-json output)) - (let-alist msg - ;; Errors and warnings from rustc are wrapped by cargo, so we filter and - ;; unwrap them, and delegate the actual construction of `flycheck-error' - ;; objects to `flycheck-parse-rustc-diagnostic'. - (when (string= .reason "compiler-message") - (push (flycheck-parse-rustc-diagnostic .message checker buffer) - errors)))) - (apply #'nconc errors))) - -;; Some checkers output ANSI terminal colors, which don't match up -;; with :error-patterns, so we strip those color codes from the output -;; here before passing it along to the default behavior. This is -;; originally only used in the rebar3 checker, but the systemd checker -;; now also makes use of it. -;; -;; The relevant discussion can be found at -;; https://github.com/flycheck/flycheck/pull/1144 -(defun flycheck-parse-with-patterns-without-color (output checker buffer) - "Strip color codes from OUTPUT before passing it to the default behavior. - -CHECKER and BUFFER are passed along as well." - (flycheck-parse-with-patterns - (and (fboundp 'ansi-color-filter-apply) (ansi-color-filter-apply output)) - checker buffer)) - - -;;; Error parsing with regular expressions -(defun flycheck-get-regexp (patterns) - "Create a single regular expression from PATTERNS." - (rx-to-string `(or ,@(seq-map (lambda (p) (list 'regexp (car p))) patterns)) - 'no-group)) - -(defun flycheck-tokenize-output-with-patterns (output patterns) - "Tokenize OUTPUT with PATTERNS. - -Split the output into error tokens, using all regular expressions -from the error PATTERNS. An error token is simply a string -containing a single error from OUTPUT. Such a token can then be -parsed into a structured error by applying the PATTERNS again, -see `flycheck-parse-errors-with-patterns'. - -Return a list of error tokens." - (let ((regexp (flycheck-get-regexp patterns)) - (last-match 0) - errors) - (while (string-match regexp output last-match) - (push (match-string 0 output) errors) - (setq last-match (match-end 0))) - (reverse errors))) - -(defun flycheck-try-parse-error-with-pattern (err pattern checker) - "Try to parse a single ERR with a PATTERN for CHECKER. - -Return the parsed error if PATTERN matched ERR, or nil -otherwise. - -`end-line' defaults to the value of `line' when `end-column' is -set, since checkers often omit redundant end lines (as in -::-)." - (let ((regexp (car pattern)) - (level (cdr pattern))) - (when (string-match regexp err) - (let ((filename (match-string 1 err)) - (line (flycheck-string-to-number-safe (match-string 2 err))) - (column (flycheck-string-to-number-safe (match-string 3 err))) - (message (match-string 4 err)) - (id (match-string 5 err)) - (end-line (flycheck-string-to-number-safe (match-string 6 err))) - (end-column (flycheck-string-to-number-safe (match-string 7 err)))) - (flycheck-error-new-at - line - column - level - (unless (string-empty-p message) message) - :id (unless (string-empty-p id) id) - :checker checker - :filename (if (or (null filename) (string-empty-p filename)) - (buffer-file-name) - filename) - :end-line (or end-line (and end-column line)) - :end-column end-column))))) - -(defun flycheck-parse-error-with-patterns (err patterns checker) - "Parse a single ERR with error PATTERNS for CHECKER. - -Apply each pattern in PATTERNS to ERR, in the given order, and -return the first parsed error." - ;; Try to parse patterns in the order of declaration to make sure that the - ;; first match wins. - (let (parsed-error) - (while (and patterns - (not (setq parsed-error - (flycheck-try-parse-error-with-pattern - err (car patterns) checker)))) - (setq patterns (cdr patterns))) - parsed-error)) - -(defun flycheck-parse-with-patterns (output checker buffer) - "Parse OUTPUT from CHECKER with error patterns. - -Uses the error patterns of CHECKER to tokenize the output and -tries to parse each error token with all patterns, in the order -of declaration. Hence an error is never matched twice by two -different patterns. The pattern declared first always wins. - -_BUFFER is ignored. - -Return a list of parsed errors and warnings (as `flycheck-error' -objects)." - (with-current-buffer buffer - (let ((patterns (flycheck-checker-get checker 'error-patterns))) - (seq-map (lambda (err) - (flycheck-parse-error-with-patterns err patterns checker)) - (flycheck-tokenize-output-with-patterns output patterns))))) - - -;;; Convenience definition of command-syntax checkers - -;; This macro is autoloaded to prevent `with-eval-after-load' from expanding its -;; arguments. See https://github.com/flycheck/flycheck/issues/1398. -;;;###autoload -(defmacro flycheck-define-checker (symbol docstring &rest properties) - "Define SYMBOL as command syntax checker with DOCSTRING and PROPERTIES. - -Like `flycheck-define-command-checker', but PROPERTIES must not -be quoted. Also, implicitly define the executable variable for -SYMBOL with `flycheck-def-executable-var'." - (declare (indent 1) - (doc-string 2)) - (let ((command (plist-get properties :command)) - (parser (plist-get properties :error-parser)) - (filter (plist-get properties :error-filter)) - (explainer (plist-get properties :error-explainer)) - (predicate (plist-get properties :predicate)) - (enabled-fn (plist-get properties :enabled)) - (verify-fn (plist-get properties :verify))) - - `(progn - (flycheck-def-executable-var ,symbol ,(car command)) - - (flycheck-define-command-checker ',symbol - ,docstring - :command ',command - ,@(when parser - `(:error-parser #',parser)) - :error-patterns ',(plist-get properties :error-patterns) - ,@(when filter - `(:error-filter #',filter)) - ,@(when explainer - `(:error-explainer #',explainer)) - :modes ',(plist-get properties :modes) - ,@(when predicate - `(:predicate #',predicate)) - :next-checkers ',(plist-get properties :next-checkers) - ,@(when enabled-fn - `(:enabled #',enabled-fn)) - ,@(when verify-fn - `(:verify #',verify-fn)) - :standard-input ',(plist-get properties :standard-input) - :working-directory ',(plist-get properties :working-directory))))) - - -;;; Built-in checkers -(flycheck-def-args-var flycheck-gnat-args ada-gnat - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gnat-include-path nil ada-gnat - "A list of include directories for GNAT. - -The value of this variable is a list of strings, where each -string is a directory to add to the include path of gcc. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gnat-language-standard "2012" ada-gnat - "The language standard to use in GNAT. - -The value of this variable is either a string denoting a language -standard, or nil, to use the default standard. When non-nil, pass -the language standard via the `-std' option." - :type '(choice (const :tag "Default standard" nil) - (string :tag "Language standard")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gnat-warnings - '("wa") ada-gnat - "A list of additional Ada warnings to enable in GNAT. - -The value of this variable is a list of strings, where each -string is the name of a warning category to enable. By default, -most optional warnings are recommended, as in `-gnata'. - -Refer to Info Node `(gnat_ugn_unw)Warning Message Control' for -more information about GNAT warnings." - :type '(repeat :tag "Warnings" (string :tag "Warning name")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.20")) - -(flycheck-define-checker ada-gnat - "An Ada syntax checker using GNAT. - -Uses the GNAT compiler from GCC. See URL -`https://www.adacore.com/community/'." - :command ("gnatmake" - "-c" ; Just compile, don't bind - "-f" ; Force re-compilation - "-u" ; Compile the main file only - "-gnatf" ; Full error information - "-gnatef" ; Full source file name - "-D" temporary-directory - (option-list "-gnat" flycheck-gnat-warnings concat) - (option-list "-I" flycheck-gnat-include-path concat) - (option "-gnat" flycheck-gnat-language-standard concat) - (eval flycheck-gnat-args) - source) - :error-patterns - ((error line-start - (message "In file included from") " " (file-name) ":" line ":" - column ":" - line-end) - (info line-start (file-name) ":" line ":" column - ": note: " (message) line-end) - (warning line-start (file-name) ":" line ":" column - ": warning: " (message) line-end) - ;; no specific error prefix in Ada - (error line-start (file-name) ":" line ":" column - ": " (message) line-end)) - :modes ada-mode) - -(flycheck-define-checker asciidoc - "A AsciiDoc syntax checker using the AsciiDoc compiler. - -See URL `http://www.methods.co.nz/asciidoc'." - :command ("asciidoc" "-o" null-device "-") - :standard-input t - :error-patterns - ((error line-start - "asciidoc: ERROR: : Line " line ": " (message) - line-end) - (warning line-start - "asciidoc: WARNING: : Line " line ": " (message) - line-end) - (info line-start - "asciidoc: DEPRECATED: : Line " line ": " (message) - line-end)) - :modes adoc-mode) - -(flycheck-define-checker asciidoctor - "An AsciiDoc syntax checker using the Asciidoctor compiler. - -See URL `http://asciidoctor.org'." - :command ("asciidoctor" "-o" null-device "-") - :standard-input t - :error-patterns - ((error line-start - "asciidoctor: ERROR: : Line " line ": " (message) - line-end) - (warning line-start - "asciidoctor: WARNING: : Line " line ": " (message) - line-end)) - :modes adoc-mode) - -(defun flycheck-awk-gawk-fix-message (err) - "Remove the repeated file-name/line from the error message of ERR." - (setf (flycheck-error-message err) - (replace-regexp-in-string - (rx line-start - (group (zero-or-more (any " " "\t"))) - (group (zero-or-more nonl) "\n") - (backref 1)) - "\\2" - (replace-regexp-in-string - (rx "\ngawk: " (zero-or-more (not (any " "))) ":") - "\n" - (flycheck-error-message err)))) - err) - -(defun flycheck-awk-gawk-error-filter (errors) - "Remove repeated file-name/line from ERRORS." - (seq-do #'flycheck-awk-gawk-fix-message errors) - errors) - -(flycheck-define-checker awk-gawk - "GNU awk's built-in --lint checker." - :command ("gawk" - ;; Avoid code execution. See https://github.com/w0rp/ale/pull/1411 - "--source" "'BEGIN{exit} END{exit 1}'" - "-f" source - "--lint" - "/dev/null") - :standard-input nil - :error-patterns - ((warning line-start - "gawk: " - (file-name) ":" line ":" (optional column ":") - (message (one-or-more not-newline) - (optional "\n" - (one-or-more not-newline) - " ^ " - (one-or-more not-newline))) - line-end)) - :error-filter flycheck-awk-gawk-error-filter - :modes awk-mode) - -(flycheck-define-checker bazel-buildifier - "An Bazel checker using the buildifier. - -See URL `https://github.com/bazelbuild/buildtools/blob/master/buildifier'." - :command ("buildifier" "-lint=warn") - :standard-input t - :error-patterns - ((error line-start - ":" line ":" column ": " (message) - line-end) - (warning line-start - ":" line ": " (id (one-or-more (in word "-"))) ": " (message) - line-end)) - :modes bazel-mode) - -(flycheck-def-args-var flycheck-clang-args c/c++-clang - :package-version '(flycheck . "0.22")) - -(flycheck-def-option-var flycheck-clang-blocks nil c/c++-clang - "Enable blocks in Clang. - -When non-nil, enable blocks in Clang with `-fblocks'. See URL -`http://clang.llvm.org/docs/BlockLanguageSpec.html' for more -information about blocks." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-clang-definitions nil c/c++-clang - "Additional preprocessor definitions for Clang. - -The value of this variable is a list of strings, where each -string is an additional definition to pass to Clang, via the `-D' -option." - :type '(repeat (string :tag "Definition")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.15")) - -(flycheck-def-option-var flycheck-clang-include-path nil c/c++-clang - "A list of include directories for Clang. - -The value of this variable is a list of strings, where each -string is a directory to add to the include path of Clang. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.14")) - -(flycheck-def-option-var flycheck-clang-includes nil c/c++-clang - "A list of additional include files for Clang. - -The value of this variable is a list of strings, where each -string is a file to include before syntax checking. Relative -paths are relative to the file being checked." - :type '(repeat (file :tag "Include file")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.15")) - -(flycheck-def-option-var flycheck-clang-language-standard nil c/c++-clang - "The language standard to use in Clang. - -The value of this variable is either a string denoting a language -standard, or nil, to use the default standard. When non-nil, -pass the language standard via the `-std' option." - :type '(choice (const :tag "Default standard" nil) - (string :tag "Language standard")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "0.15")) -(make-variable-buffer-local 'flycheck-clang-language-standard) - -(flycheck-def-option-var flycheck-clang-ms-extensions nil c/c++-clang - "Whether to enable Microsoft extensions to C/C++ in Clang. - -When non-nil, enable Microsoft extensions to C/C++ via -`-fms-extensions'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.16")) - -(flycheck-def-option-var flycheck-clang-no-exceptions nil c/c++-clang - "Whether to disable exceptions in Clang. - -When non-nil, disable exceptions for syntax checks, via -`-fno-exceptions'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-clang-no-rtti nil c/c++-clang - "Whether to disable RTTI in Clang. - -When non-nil, disable RTTI for syntax checks, via `-fno-rtti'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.15")) - -(flycheck-def-option-var flycheck-clang-pedantic nil c/c++-clang - "Whether to warn about language extensions in Clang. - -For ISO C, follows the version specified by any -std option used. -When non-nil, disable non-ISO extensions to C/C++ via -`-pedantic'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.23")) - -(flycheck-def-option-var flycheck-clang-pedantic-errors nil c/c++-clang - "Whether to error on language extensions in Clang. - -For ISO C, follows the version specified by any -std option used. -When non-nil, disable non-ISO extensions to C/C++ via -`-pedantic-errors'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.23")) - -(flycheck-def-option-var flycheck-clang-standard-library nil c/c++-clang - "The standard library to use for Clang. - -The value of this variable is the name of a standard library as -string, or nil to use the default standard library. - -Refer to the Clang manual at URL -`http://clang.llvm.org/docs/UsersManual.html' for more -information about the standard library." - :type '(choice (const :tag "Default standard library" nil) - (const "libc++") - (const :tag "GNU libstdc++" "libstdc++") - (string :tag "Library name")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "0.15")) - -(flycheck-def-option-var flycheck-clang-warnings '("all" "extra") c/c++-clang - "A list of additional warnings to enable in Clang. - -The value of this variable is a list of strings, where each string -is the name of a warning category to enable. By default, all -recommended warnings and some extra warnings are enabled (as by -`-Wall' and `-Wextra' respectively). - -Refer to the Clang manual at URL -`http://clang.llvm.org/docs/UsersManual.html' for more -information about warnings." - :type '(choice (const :tag "No additional warnings" nil) - (repeat :tag "Additional warnings" - (string :tag "Warning name"))) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.14")) - -(defun flycheck-c/c++-quoted-include-directory () - "Get the directory for quoted includes. - -C/C++ compiles typicall look up includes with quotation marks in -the directory of the file being compiled. However, since -Flycheck uses temporary copies for syntax checking, it needs to -explicitly determine the directory for quoted includes. - -This function determines the directory by looking at function -`buffer-file-name', or if that is nil, at `default-directory'." - (-if-let (fn (buffer-file-name)) - (file-name-directory fn) - ;; If the buffer has no file name, fall back to its default directory - default-directory)) - -(flycheck-define-checker c/c++-clang - "A C/C++ syntax checker using Clang. - -See URL `http://clang.llvm.org/'." - :command ("clang" - "-fsyntax-only" - "-fno-color-diagnostics" ; Do not include color codes in output - "-fno-caret-diagnostics" ; Do not visually indicate the source - ; location - "-fno-diagnostics-show-option" ; Do not show the corresponding - ; warning group - "-iquote" (eval (flycheck-c/c++-quoted-include-directory)) - (option "-std=" flycheck-clang-language-standard concat) - (option-flag "-pedantic" flycheck-clang-pedantic) - (option-flag "-pedantic-errors" flycheck-clang-pedantic-errors) - (option "-stdlib=" flycheck-clang-standard-library concat) - (option-flag "-fms-extensions" flycheck-clang-ms-extensions) - (option-flag "-fno-exceptions" flycheck-clang-no-exceptions) - (option-flag "-fno-rtti" flycheck-clang-no-rtti) - (option-flag "-fblocks" flycheck-clang-blocks) - (option-list "-include" flycheck-clang-includes) - (option-list "-W" flycheck-clang-warnings concat) - (option-list "-D" flycheck-clang-definitions concat) - (option-list "-I" flycheck-clang-include-path) - (eval flycheck-clang-args) - "-x" (eval - (pcase major-mode - (`c++-mode "c++") - (`c-mode "c"))) - ;; Read from standard input - "-") - :standard-input t - :error-patterns - ((info line-start (or "" (file-name)) ":" line ":" column - ": note: " (optional (message)) line-end) - (warning line-start (or "" (file-name)) ":" line ":" column - ": warning: " (optional (message)) line-end) - (error line-start (or "" (file-name)) ":" line ":" column - ": " (or "fatal error" "error") ": " (optional (message)) line-end)) - :error-filter - (lambda (errors) - (let ((errors (flycheck-sanitize-errors errors))) - (dolist (err errors) - ;; Clang will output empty messages for #error/#warning pragmas without - ;; messages. We fill these empty errors with a dummy message to get - ;; them past our error filtering - (setf (flycheck-error-message err) - (or (flycheck-error-message err) "no message"))) - errors)) - :modes (c-mode c++-mode) - :next-checkers ((warning . c/c++-cppcheck))) - -(flycheck-def-args-var flycheck-gcc-args c/c++-gcc - :package-version '(flycheck . "0.22")) - -(flycheck-def-option-var flycheck-gcc-definitions nil c/c++-gcc - "Additional preprocessor definitions for GCC. - -The value of this variable is a list of strings, where each -string is an additional definition to pass to GCC, via the `-D' -option." - :type '(repeat (string :tag "Definition")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gcc-include-path nil c/c++-gcc - "A list of include directories for GCC. - -The value of this variable is a list of strings, where each -string is a directory to add to the include path of gcc. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gcc-includes nil c/c++-gcc - "A list of additional include files for GCC. - -The value of this variable is a list of strings, where each -string is a file to include before syntax checking. Relative -paths are relative to the file being checked." - :type '(repeat (file :tag "Include file")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gcc-language-standard nil c/c++-gcc - "The language standard to use in GCC. - -The value of this variable is either a string denoting a language -standard, or nil, to use the default standard. When non-nil, -pass the language standard via the `-std' option." - :type '(choice (const :tag "Default standard" nil) - (string :tag "Language standard")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "0.20")) -(make-variable-buffer-local 'flycheck-gcc-language-standard) - -(flycheck-def-option-var flycheck-gcc-no-exceptions nil c/c++-gcc - "Whether to disable exceptions in GCC. - -When non-nil, disable exceptions for syntax checks, via -`-fno-exceptions'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gcc-no-rtti nil c/c++-gcc - "Whether to disable RTTI in GCC. - -When non-nil, disable RTTI for syntax checks, via `-fno-rtti'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gcc-openmp nil c/c++-gcc - "Whether to enable OpenMP in GCC. - -When non-nil, enable OpenMP for syntax checkers, via -`-fopenmp'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.21")) - -(flycheck-def-option-var flycheck-gcc-pedantic nil c/c++-gcc - "Whether to warn about language extensions in GCC. - -For ISO C, follows the version specified by any -std option used. -When non-nil, disable non-ISO extensions to C/C++ via -`-pedantic'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.23")) - -(flycheck-def-option-var flycheck-gcc-pedantic-errors nil c/c++-gcc - "Whether to error on language extensions in GCC. - -For ISO C, follows the version specified by any -std option used. -When non-nil, disable non-ISO extensions to C/C++ via -`-pedantic-errors'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.23")) - -(flycheck-def-option-var flycheck-gcc-warnings '("all" "extra") c/c++-gcc - "A list of additional warnings to enable in GCC. - -The value of this variable is a list of strings, where each string -is the name of a warning category to enable. By default, all -recommended warnings and some extra warnings are enabled (as by -`-Wall' and `-Wextra' respectively). - -Refer to the gcc manual at URL -`https://gcc.gnu.org/onlinedocs/gcc/' for more information about -warnings." - :type '(choice (const :tag "No additional warnings" nil) - (repeat :tag "Additional warnings" - (string :tag "Warning name"))) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.20")) - -(flycheck-define-checker c/c++-gcc - "A C/C++ syntax checker using GCC. - -Requires GCC 4.4 or newer. See URL `https://gcc.gnu.org/'." - :command ("gcc" - "-fshow-column" - "-iquote" (eval (flycheck-c/c++-quoted-include-directory)) - (option "-std=" flycheck-gcc-language-standard concat) - (option-flag "-pedantic" flycheck-gcc-pedantic) - (option-flag "-pedantic-errors" flycheck-gcc-pedantic-errors) - (option-flag "-fno-exceptions" flycheck-gcc-no-exceptions) - (option-flag "-fno-rtti" flycheck-gcc-no-rtti) - (option-flag "-fopenmp" flycheck-gcc-openmp) - (option-list "-include" flycheck-gcc-includes) - (option-list "-W" flycheck-gcc-warnings concat) - (option-list "-D" flycheck-gcc-definitions concat) - (option-list "-I" flycheck-gcc-include-path) - (eval flycheck-gcc-args) - "-x" (eval - (pcase major-mode - (`c++-mode "c++") - (`c-mode "c"))) - ;; GCC performs full checking only when actually compiling, so - ;; `-fsyntax-only' is not enough. Just let it generate assembly - ;; code. - "-S" "-o" null-device - ;; Read from standard input - "-") - :standard-input t - :error-patterns - ((info line-start (or "" (file-name)) ":" line ":" column - ": note: " (message) line-end) - (warning line-start (or "" (file-name)) ":" line ":" column - ": warning: " (message (one-or-more (not (any "\n[")))) - (optional "[" (id (one-or-more not-newline)) "]") line-end) - (error line-start (or "" (file-name)) ":" line ":" column - ": " (or "fatal error" "error") ": " (message) line-end)) - :modes (c-mode c++-mode) - :next-checkers ((warning . c/c++-cppcheck))) - -(flycheck-def-option-var flycheck-cppcheck-checks '("style") c/c++-cppcheck - "Enabled checks for Cppcheck. - -The value of this variable is a list of strings, where each -string is the name of an additional check to enable. By default, -all coding style checks are enabled. - -See section \"Enable message\" in the Cppcheck manual at URL -`http://cppcheck.sourceforge.net/manual.pdf', and the -documentation of the `--enable' option for more information, -including a list of supported checks." - :type '(repeat :tag "Additional checks" - (string :tag "Check name")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.14")) - -(flycheck-def-option-var flycheck-cppcheck-standards nil c/c++-cppcheck - "The standards to use in cppcheck. - -The value of this variable is either a list of strings denoting -the standards to use, or nil to pass nothing to cppcheck. When -non-nil, pass the standards via one or more `--std=' options." - :type '(choice (const :tag "Default" nil) - (repeat :tag "Custom standards" - (string :tag "Standard name"))) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "28")) -(make-variable-buffer-local 'flycheck-cppcheck-standards) - -(flycheck-def-option-var flycheck-cppcheck-suppressions-file nil c/c++-cppcheck - "The suppressions file to use in cppcheck. - -The value of this variable is a file with the suppressions to -use, or nil to pass nothing to cppcheck. When non-nil, pass the -suppressions file via the `--suppressions-list=' option." - :type '(choice (const :tag "Default" nil) - (file :tag "Suppressions file")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "32")) -(make-variable-buffer-local 'flycheck-cppcheck-suppressions-file) - -(flycheck-def-option-var flycheck-cppcheck-suppressions nil c/c++-cppcheck - "The suppressions to use in cppcheck. - -The value of this variable is either a list of strings denoting -the suppressions to use, or nil to pass nothing to cppcheck. -When non-nil, pass the suppressions via one or more `--suppress=' -options." - :type '(choice (const :tag "Default" nil) - (repeat :tag "Additional suppressions" - (string :tag "Suppression"))) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "28")) - -(flycheck-def-option-var flycheck-cppcheck-inconclusive nil c/c++-cppcheck - "Whether to enable Cppcheck inconclusive checks. - -When non-nil, enable Cppcheck inconclusive checks. This allows Cppcheck to -report warnings it's not certain of, but it may result in false positives. - -This will have no effect when using Cppcheck 1.53 and older." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.19")) - -(flycheck-def-option-var flycheck-cppcheck-include-path nil c/c++-cppcheck - "A list of include directories for cppcheck. - -The value of this variable is a list of strings, where each -string is a directory to add to the include path of cppcheck. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.24")) - -(flycheck-define-checker c/c++-cppcheck - "A C/C++ checker using cppcheck. - -See URL `http://cppcheck.sourceforge.net/'." - :command ("cppcheck" "--quiet" "--xml-version=2" "--inline-suppr" - (option "--enable=" flycheck-cppcheck-checks concat - flycheck-option-comma-separated-list) - (option-flag "--inconclusive" flycheck-cppcheck-inconclusive) - (option-list "-I" flycheck-cppcheck-include-path) - (option-list "--std=" flycheck-cppcheck-standards concat) - (option-list "--suppress=" flycheck-cppcheck-suppressions concat) - (option "--suppressions-list=" - flycheck-cppcheck-suppressions-file concat) - "-x" (eval - (pcase major-mode - (`c++-mode "c++") - (`c-mode "c"))) - source) - :error-parser flycheck-parse-cppcheck - :modes (c-mode c++-mode)) - -(flycheck-define-checker cfengine - "A CFEngine syntax checker using cf-promises. - -See URL `https://cfengine.com/'." - :command ("cf-promises" "-Wall" "-f" - ;; We must stay in the same directory to resolve @include - source-inplace) - :error-patterns - ((warning line-start (file-name) ":" line ":" column - ": warning: " (message) line-end) - (error line-start (file-name) ":" line ":" column - ": error: " (message) line-end)) - :modes (cfengine-mode cfengine3-mode)) - -(flycheck-def-option-var flycheck-foodcritic-tags nil chef-foodcritic - "A list of tags to select for Foodcritic. - -The value of this variable is a list of strings where each string -is a tag expression describing Foodcritic rules to enable or -disable, via the `--tags' option. To disable a tag, prefix it -with `~'." - :type '(repeat :tag "Tags" (string :tag "Tag expression")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.23")) - -(flycheck-define-checker chef-foodcritic - "A Chef cookbooks syntax checker using Foodcritic. - -See URL `http://www.foodcritic.io'." - ;; Use `source-inplace' to allow resource discovery with relative paths. - ;; foodcritic interprets these as relative to the source file, so we need to - ;; stay within the source tree. See - ;; https://github.com/flycheck/flycheck/pull/556 - :command ("foodcritic" - (option-list "--tags" flycheck-foodcritic-tags) - source-inplace) - :error-patterns - ((error line-start (id (one-or-more alnum)) ": " - (message) ": " (file-name) ":" line line-end)) - :modes (enh-ruby-mode ruby-mode) - :predicate - (lambda () - (let ((parent-dir (file-name-directory - (directory-file-name - (expand-file-name default-directory))))) - (or - ;; Chef CookBook - ;; http://docs.opscode.com/chef/knife.html#id38 - (locate-dominating-file parent-dir "recipes") - ;; Knife Solo - ;; http://matschaffer.github.io/knife-solo/#label-Init+command - (locate-dominating-file parent-dir "cookbooks"))))) - -(flycheck-define-checker coffee - "A CoffeeScript syntax checker using coffee. - -See URL `https://coffeescript.org/'." - ;; --print suppresses generation of compiled .js files - :command ("coffee" "--compile" "--print" "--stdio") - :standard-input t - :error-patterns - ((error line-start "[stdin]:" line ":" column - ": error: " (message) line-end)) - :modes coffee-mode - :next-checkers ((warning . coffee-coffeelint))) - -(flycheck-def-config-file-var flycheck-coffeelintrc coffee-coffeelint - ".coffeelint.json") - -(flycheck-define-checker coffee-coffeelint - "A CoffeeScript style checker using coffeelint. - -See URL `http://www.coffeelint.org/'." - :command - ("coffeelint" - (config-file "--file" flycheck-coffeelintrc) - "--stdin" "--reporter" "checkstyle") - :standard-input t - :error-parser flycheck-parse-checkstyle - :error-filter (lambda (errors) - (flycheck-remove-error-file-names - "stdin" (flycheck-remove-error-ids - (flycheck-sanitize-errors errors)))) - :modes coffee-mode) - -(defun flycheck-coq-error-filter (errors) - "Sanitize Coq ERRORS and compute end-lines and end-columns." - (flycheck-increment-error-columns errors) - (dolist (err errors) - (setf (flycheck-error-message err) - (replace-regexp-in-string (rx (1+ (syntax whitespace)) line-end) - "" (flycheck-error-message err) - 'fixedcase 'literal)) - (-when-let* ((end-col (flycheck-error-end-column err))) - ;; Coq reports an offset (potentially past eol), not an end column - (let* ((line (flycheck-error-line err)) - (end-lc (save-excursion - (flycheck-goto-line line) - (goto-char (+ (point) (1- end-col))) - (flycheck-line-column-at-point)))) - (setf (flycheck-error-end-line err) (car end-lc)) - (setf (flycheck-error-end-column err) (cdr end-lc))))) - (flycheck-sanitize-errors errors)) - -(flycheck-define-checker coq - "A Coq syntax checker using the Coq compiler. - -See URL `https://coq.inria.fr/'." - ;; We use coqtop in batch mode, because coqc is picky about file names. - :command ("coqtop" "-batch" "-load-vernac-source" source) - :error-patterns - ((error line-start "File \"" (file-name) "\", line " line - ", characters " column "-" end-column ":\n" - (or "Syntax error:" "Error:") - ;; Most Coq error messages span multiple lines, and end with a dot. - ;; There are simple one-line messages, too, though. - (message (or (and (one-or-more (or not-newline "\n")) ".") - (one-or-more not-newline))) - line-end)) - :error-filter flycheck-coq-error-filter - :modes coq-mode) - -(flycheck-define-checker css-csslint - "A CSS syntax and style checker using csslint. - -See URL `https://github.com/CSSLint/csslint'." - :command ("csslint" "--format=checkstyle-xml" source) - :error-parser flycheck-parse-checkstyle - :error-filter flycheck-dequalify-error-ids - :modes css-mode) - -(defconst flycheck-stylelint-args '("--formatter" "json") - "Common arguments to stylelint invocations.") - -(flycheck-def-config-file-var flycheck-stylelintrc - (css-stylelint scss-stylelint less-stylelint) nil) - -(flycheck-def-option-var flycheck-stylelint-quiet - nil (css-stylelint scss-stylelint less-stylelint) - "Whether to run stylelint in quiet mode. - -When non-nil, enable quiet mode, via `--quiet'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . 26)) - -(defconst flycheck-stylelint-error-re - (flycheck-rx-to-string - '(: line-start (id (one-or-more word)) ": " (message) line-end))) - -(defun flycheck-parse-stylelint (output checker buffer) - "Parse stylelint errors from OUTPUT. - -CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -The CHECKER usually returns the errors as JSON. - -If the CHECKER throws an Error it returns an Error message with a stacktrace." - (condition-case nil - (flycheck-parse-stylelint-json output checker buffer) - - ;; The output could not be parsed as JSON - (json-error - - ;; Extract a flycheck error from the output (with a regular expression) - ;; For match-string 4/5 see flycheck-rx-message/flycheck-rx-id - (when (string-match flycheck-stylelint-error-re output) - (list (flycheck-error-new-at - 1 nil 'error - (match-string 4 output) - :id (match-string 5 output) - :checker checker - :buffer buffer - :filename (buffer-file-name buffer))))))) - -(defun flycheck-parse-stylelint-json (output checker buffer) - "Parse stylelint JSON errors from OUTPUT. - -CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `http://stylelint.io/developer-guide/formatters/' for information -about the JSON format of stylelint." - (let ((json-object-type 'plist)) - - ;; stylelint returns a vector of result objects - ;; Since we only passed one file, the first element is enough - (let* ((stylelint-output (elt (json-read-from-string output) 0)) - (filename (buffer-file-name buffer)) - - ;; Turn all deprecations into warnings - (deprecations - (mapcar (lambda (d) - (flycheck-error-new-at - 1 nil 'warning - (plist-get d :text) - :id "Deprecation Warning" - :checker checker - :buffer buffer - :filename filename)) - (plist-get stylelint-output :deprecations))) - - ;; Turn all invalid options into errors - (invalid-options - (mapcar (lambda (io) - (flycheck-error-new-at - 1 nil 'error - (plist-get io :text) - :id "Invalid Option" - :checker checker - :buffer buffer - :filename filename)) - (plist-get stylelint-output :invalidOptionWarnings))) - - ;; Read all linting warnings - (warnings - (mapcar (lambda (w) - (flycheck-error-new-at - (plist-get w :line) (plist-get w :column) - (pcase (plist-get w :severity) - (`"error" 'error) - (`"warning" 'warning) - ;; Default to info for unknown .severity - (_ 'info)) - (plist-get w :text) - :id (plist-get w :rule) - :checker checker - :buffer buffer - :filename filename)) - (plist-get stylelint-output :warnings)))) - - ;; Return the combined errors (deprecations, invalid options, warnings) - (append deprecations invalid-options warnings)))) - -(flycheck-define-checker css-stylelint - "A CSS syntax and style checker using stylelint. - -See URL `http://stylelint.io/'." - :command ("stylelint" - (eval flycheck-stylelint-args) - (option-flag "--quiet" flycheck-stylelint-quiet) - (config-file "--config" flycheck-stylelintrc) - "--stdin-filename" (eval (or (buffer-file-name) "style.css"))) - :standard-input t - :error-parser flycheck-parse-stylelint - :predicate flycheck-buffer-nonempty-p - :modes (css-mode)) - -(flycheck-def-option-var flycheck-cuda-language-standard nil cuda-nvcc - "Our CUDA Language Standard." - :type '(choice (const :tag "Default standard" nil) - (string :tag "Language standard")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "32")) -(make-variable-buffer-local 'flycheck-cuda-language-standard) - -(flycheck-def-option-var flycheck-cuda-includes nil cuda-nvcc - "Our include directories to pass to nvcc." - :type '(repeat (file :tag "Include file")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "32")) - -(flycheck-def-option-var flycheck-cuda-definitions nil cuda-nvcc - "Additional preprocessor definitions for nvcc. -A list of strings to pass to cuda, a la flycheck-clang" - :type '(repeat (string :tag "Definitions")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "32")) - -(flycheck-def-option-var flycheck-cuda-include-path nil cuda-nvcc - "A list of include directories for nvcc." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "32")) - -(flycheck-define-checker cuda-nvcc - "A CUDA C/C++ syntax checker using nvcc. - -See URL `https://developer.nvidia.com/cuda-llvm-compiler'." - :command ("nvcc" - "-c" ;; Compile Only - "--output-file" "/dev/null" ;; avoid creating output .o - "--x=cu" ;; explicitly specify it's a CUDA language file - (option "-std=" flycheck-cuda-language-standard concat) - (option-list "-include" flycheck-cuda-includes) - (option-list "-D" flycheck-cuda-definitions concat) - (option-list "-I" flycheck-cuda-include-path) - source) - :error-patterns - ((error line-start - (message "In file included from") - " " (or "" (file-name)) - ":" line ":" line-end) - (error line-start (or "" (file-name)) - "(" line "): error: " (message) line-end) - (error line-start (or "" (file-name)) - ":" line ":" column - ": fatal error: " (optional (message)) line-end) - (warning line-start (or "" (file-name)) - "(" line "): warning: " (message) line-end)) - :modes cuda-mode) - - -(flycheck-def-option-var flycheck-cwl-schema-path nil cwl - "A path for the schema file for Common Workflow Language. - -The value of this variable is a string that denotes a path for -the schema file of Common Workflow Language." - :type '(choice (const :tag "None" nil) - (file :tag "Schema file")) - :safe #'flycheck-string-or-nil-p) - -(flycheck-define-checker cwl - "A CWL syntax checker using Schema Salad validator. - -Requires Schema Salad 2.6.20171101113912 or newer. -See URL `https://www.commonwl.org/v1.0/SchemaSalad.html'." - :command ("schema-salad-tool" - "--quiet" - "--print-oneline" - (eval flycheck-cwl-schema-path) - source-inplace) - :error-patterns - ((error line-start - (file-name) ":" line ":" column ":" (zero-or-more blank) - (message (one-or-more not-newline)) - line-end)) - :modes cwl-mode) - -(defconst flycheck-d-module-re - (rx "module" (one-or-more (syntax whitespace)) - (group (one-or-more (not (syntax whitespace)))) - (zero-or-more (syntax whitespace)) - ";") - "Regular expression to match a D module declaration.") - -(defun flycheck-d-base-directory () - "Get the relative base directory path for this module." - (let* ((file-name (buffer-file-name)) - (module-file (if (and file-name - (string= (file-name-nondirectory file-name) - "package.d")) - (directory-file-name (file-name-directory file-name)) - file-name))) - (flycheck-module-root-directory - (flycheck-find-in-buffer flycheck-d-module-re) - module-file))) - -(flycheck-def-option-var flycheck-dmd-include-path nil d-dmd - "A list of include directories for dmd. - -The value of this variable is a list of strings, where each -string is a directory to add to the include path of dmd. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.18")) - -(flycheck-def-args-var flycheck-dmd-args d-dmd - :package-version '(flycheck . "0.24")) - -(flycheck-define-checker d-dmd - "A D syntax checker using the DMD compiler. - -Requires DMD 2.066 or newer. See URL `https://dlang.org/'." - :command ("dmd" - "-debug" ; Compile in debug mode - "-o-" ; Don't generate an object file - "-vcolumns" ; Add columns in output - "-wi" ; Compilation will continue even if there are warnings - (eval (concat "-I" (flycheck-d-base-directory))) - (option-list "-I" flycheck-dmd-include-path concat) - (eval flycheck-dmd-args) - (source ".d")) - :error-patterns - ((error line-start - (file-name) "(" line "," column "): Error: " (message) - line-end) - (warning line-start (file-name) "(" line "," column "): " - (or "Warning" "Deprecation") ": " (message) line-end) - (info line-start (file-name) "(" line "," column "): " - (one-or-more " ") (message) line-end)) - :modes d-mode) - -(flycheck-define-checker dockerfile-hadolint - "A Dockerfile syntax checker using the hadolint. - -See URL `http://github.com/hadolint/hadolint/'." - :command ("hadolint" "-") - :standard-input t - :error-patterns - ((error line-start - (file-name) ":" line ":" column " " (message) - line-end) - (warning line-start - (file-name) ":" line " " (id (one-or-more alnum)) " " (message) - line-end)) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors - (flycheck-remove-error-file-names "/dev/stdin" errors))) - :modes dockerfile-mode) - -(defun flycheck-credo--working-directory (&rest _ignored) - "Check if `credo' is installed as dependency in the application." - (and buffer-file-name - (locate-dominating-file buffer-file-name "deps/credo"))) - -(flycheck-def-option-var flycheck-elixir-credo-strict nil elixir-credo - "Enable strict mode in `credo'. - -When non-nil, pass the `--strict' flag to credo." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "32")) - -(flycheck-define-checker elixir-credo - "An Elixir checker for static code analysis using Credo. - -See `http://credo-ci.org/'." - :command ("mix" "credo" - (option-flag "--strict" flycheck-elixir-credo-strict) - "--format" "flycheck" - "--read-from-stdin" source-original) - :standard-input t - :working-directory flycheck-credo--working-directory - :enabled flycheck-credo--working-directory - :error-patterns - ((info line-start - (file-name) ":" line (optional ":" column) ": " - (or "F" "R" "C") ": " (message) line-end) - (warning line-start - (file-name) ":" line (optional ":" column) ": " - (or "D" "W") ": " (message) line-end)) - :modes elixir-mode) - -(defconst flycheck-this-emacs-executable - (concat invocation-directory invocation-name) - "The path to the currently running Emacs executable.") - -(defconst flycheck-emacs-args '("-Q" "--batch") - "Common arguments to Emacs invocations.") - -(defmacro flycheck-prepare-emacs-lisp-form (&rest body) - "Prepare BODY for use as check form in a subprocess." - (declare (indent 0)) - `(flycheck-sexp-to-string - '(progn - (defvar jka-compr-inhibit) - (unwind-protect - ;; Flycheck inhibits compression of temporary files, thus we - ;; must not attempt to decompress. - (let ((jka-compr-inhibit t)) - ;; Strip option-argument separator from arguments, if present - (when (equal (car command-line-args-left) "--") - (setq command-line-args-left (cdr command-line-args-left))) - ,@body) - ;; Prevent Emacs from processing the arguments on its own, see - ;; https://github.com/flycheck/flycheck/issues/319 - (setq command-line-args-left nil))))) - -(defun flycheck-emacs-lisp-bytecomp-config-form () - "Prepare an Emacs Lisp form to set byte-compiler variables." - (flycheck-sexp-to-string - `(progn - (require 'bytecomp) - (setq byte-compile-root-dir - ,(if buffer-file-name - (file-name-directory buffer-file-name) - default-directory))))) - -(defconst flycheck-emacs-lisp-check-form - (flycheck-prepare-emacs-lisp-form - ;; Keep track of the generated bytecode files, to delete them after byte - ;; compilation. - (require 'bytecomp) - (defvar flycheck-byte-compiled-files nil) - (let ((byte-compile-dest-file-function - (lambda (source) - (let ((temp-file (make-temp-file (file-name-nondirectory source)))) - (push temp-file flycheck-byte-compiled-files) - temp-file)))) - (unwind-protect - (byte-compile-file (car command-line-args-left)) - (mapc (lambda (f) (ignore-errors (delete-file f))) - flycheck-byte-compiled-files)) - (when (bound-and-true-p flycheck-emacs-lisp-check-declare) - (check-declare-file (car command-line-args-left)))))) - -(flycheck-def-option-var flycheck-emacs-lisp-load-path nil emacs-lisp - "Load path to use in the Emacs Lisp syntax checker. - -When set to `inherit', use the `load-path' of the current Emacs -session during syntax checking. - -When set to a list of strings, add each directory in this list to -the `load-path' before invoking the byte compiler. Relative -paths in this list are expanded against the `default-directory' -of the buffer to check. - -When nil, do not explicitly set the `load-path' during syntax -checking. The syntax check only uses the built-in `load-path' of -Emacs in this case. - -Note that changing this variable can lead to wrong results of the -syntax check, e.g. if an unexpected version of a required library -is used." - :type '(choice (const :tag "Inherit current `load-path'" inherit) - (repeat :tag "Load path" directory)) - :risky t - :package-version '(flycheck . "0.14")) - -(flycheck-def-option-var flycheck-emacs-lisp-initialize-packages - 'auto emacs-lisp - "Whether to initialize packages in the Emacs Lisp syntax checker. - -When nil, never initialize packages. When `auto', initialize -packages only when checking `user-init-file' or files from -`user-emacs-directory'. For any other non-nil value, always -initialize packages. - -When initializing packages is enabled the `emacs-lisp' syntax -checker calls `package-initialize' before byte-compiling the file -to be checked. It also sets `package-user-dir' according to -`flycheck-emacs-lisp-package-user-dir'." - :type '(choice (const :tag "Do not initialize packages" nil) - (const :tag "Initialize packages for configuration only" auto) - (const :tag "Always initialize packages" t)) - :risky t - :package-version '(flycheck . "0.14")) - -(defconst flycheck-emacs-lisp-package-initialize-form - (flycheck-sexp-to-string - '(with-demoted-errors "Error during package initialization: %S" - (package-initialize))) - "Form used to initialize packages.") - -(defun flycheck-option-emacs-lisp-package-initialize (value) - "Option VALUE filter for `flycheck-emacs-lisp-initialize-packages'." - (let ((shall-initialize - (if (eq value 'auto) - (or (flycheck-in-user-emacs-directory-p - (or buffer-file-name default-directory)) - ;; `user-init-file' is nil in non-interactive sessions. Now, - ;; no user would possibly use Flycheck in a non-interactive - ;; session, but our unit tests run non-interactively, so we - ;; have to handle this case anyway - (and user-init-file buffer-file-name - (flycheck-same-files-p buffer-file-name user-init-file))) - value))) - (when shall-initialize - ;; If packages shall be initialized, return the corresponding form, - ;; otherwise make Flycheck ignore the option by returning nil. - flycheck-emacs-lisp-package-initialize-form))) - -(flycheck-def-option-var flycheck-emacs-lisp-package-user-dir nil emacs-lisp - "Package directory for the Emacs Lisp syntax checker. - -If set to a string set `package-user-dir' to the value of this -variable before initializing packages. If set to nil just inherit -the value of `package-user-dir' from the running Emacs session. - -This variable has no effect, if -`flycheck-emacs-lisp-initialize-packages' is nil." - :type '(choice (const :tag "Default package directory" nil) - (directory :tag "Custom package directory")) - :risky t - :package-version '(flycheck . "0.14")) - -(defun flycheck-option-emacs-lisp-package-user-dir (value) - "Option VALUE filter for `flycheck-emacs-lisp-package-user-dir'." - ;; Inherit the package directory from our Emacs session - (let ((value (or value (bound-and-true-p package-user-dir)))) - (when value - (flycheck-sexp-to-string `(setq package-user-dir ,value))))) - -(flycheck-def-option-var flycheck-emacs-lisp-check-declare nil emacs-lisp - "If non-nil, check ‘declare-function’ forms using ‘check-declare-file’." - :type '(choice (const :tag "Do not check declare forms" nil) - (const :tag "Check declare forms" t)) - :risky t - :package-version '(flycheck . "31")) - -(defun flycheck-option-emacs-lisp-check-declare (value) - "Option VALUE filter for `flycheck-emacs-lisp-check-declare'." - (when value - (flycheck-sexp-to-string - `(progn - (defvar flycheck-emacs-lisp-check-declare) - (setq flycheck-emacs-lisp-check-declare ,value))))) - -(defun flycheck--emacs-lisp-enabled-p () - "Check whether to enable Emacs Lisp checkers in the current buffer." - (not - (or - ;; Do not check buffers used for autoloads generation during package - ;; installation. These buffers are too short-lived for being checked, and - ;; doing so causes spurious errors. See - ;; https://github.com/flycheck/flycheck/issues/45 and - ;; https://github.com/bbatsov/prelude/issues/248. We must also not check - ;; compilation buffers, but as these are ephemeral, Flycheck won't check - ;; them anyway. - (flycheck-autoloads-file-p) - ;; Cask/Carton and dir-locals files contain data, not code, and don't need - ;; to follow Checkdoc conventions either. - (and (buffer-file-name) - (member (file-name-nondirectory (buffer-file-name)) - '("Cask" "Carton" ".dir-locals.el" ".dir-locals-2.el")))))) - -(flycheck-define-checker emacs-lisp - "An Emacs Lisp syntax checker using the Emacs Lisp Byte compiler. - -See Info Node `(elisp)Byte Compilation'." - :command ("emacs" (eval flycheck-emacs-args) - (eval - (let ((path (pcase flycheck-emacs-lisp-load-path - (`inherit load-path) - (p (seq-map #'expand-file-name p))))) - (flycheck-prepend-with-option "--directory" path))) - (option "--eval" flycheck-emacs-lisp-package-user-dir nil - flycheck-option-emacs-lisp-package-user-dir) - (option "--eval" flycheck-emacs-lisp-initialize-packages nil - flycheck-option-emacs-lisp-package-initialize) - (option "--eval" flycheck-emacs-lisp-check-declare nil - flycheck-option-emacs-lisp-check-declare) - "--eval" (eval (flycheck-emacs-lisp-bytecomp-config-form)) - "--eval" (eval flycheck-emacs-lisp-check-form) - "--" - source-inplace) - :error-patterns - ((error line-start (file-name) ":" line ":" column ":" - (zero-or-more whitespace) "Error:" (zero-or-more whitespace) - (message (zero-or-more not-newline) - (zero-or-more "\n " (zero-or-more not-newline))) - line-end) - (warning line-start (file-name) ":" line ":" column ":" - (zero-or-more whitespace) "Warning:" (zero-or-more whitespace) - (message (zero-or-more not-newline) - (zero-or-more "\n " (zero-or-more not-newline))) - line-end) - (warning line-start (file-name) ":" line (optional ":" column) ":" - (zero-or-more whitespace) "Warning (check-declare): said\n" - (message (zero-or-more " " (zero-or-more not-newline)) - (zero-or-more "\n " (zero-or-more not-newline))) - line-end) - ;; The following is for Emacs 24 ‘check-declare-file’, which uses a - ;; less informative format. - (warning line-start "Warning (check-declare): " (file-name) " said " - (message (zero-or-more not-newline)) - line-end)) - :error-filter - (lambda (errors) - (flycheck-fill-empty-line-numbers - (flycheck-collapse-error-message-whitespace - (flycheck-sanitize-errors errors)))) - :modes (emacs-lisp-mode lisp-interaction-mode) - :enabled flycheck--emacs-lisp-enabled-p - :predicate - (lambda () - ;; Do not check buffers that should not be byte-compiled. The checker - ;; process will refuse to compile these, which would confuse Flycheck - (not (bound-and-true-p no-byte-compile))) - :next-checkers (emacs-lisp-checkdoc)) - -(defconst flycheck-emacs-lisp-checkdoc-form - (flycheck-prepare-emacs-lisp-form - (unless (require 'elisp-mode nil 'no-error) - ;; TODO: Fallback for Emacs 24, remove when dropping support for 24 - (require 'lisp-mode)) - (require 'checkdoc) - - (let ((source (car command-line-args-left)) - ;; Remember the default directory of the process - (process-default-directory default-directory)) - ;; Note that we deliberately use our custom approach even despite of - ;; `checkdoc-file' which was added to Emacs 25.1. While it's conceptually - ;; the better thing, its implementation has too many flaws to be of use - ;; for us. - (with-temp-buffer - (insert-file-contents source 'visit) - (setq buffer-file-name source) - ;; And change back to the process default directory to make file-name - ;; back-substutition work - (setq default-directory process-default-directory) - (with-demoted-errors "Error in checkdoc: %S" - ;; Checkdoc needs the Emacs Lisp syntax table and comment syntax to - ;; parse sexps and identify docstrings correctly; see - ;; https://github.com/flycheck/flycheck/issues/833 - (delay-mode-hooks (emacs-lisp-mode)) - (setq delayed-mode-hooks nil) - (checkdoc-current-buffer t) - (with-current-buffer checkdoc-diagnostic-buffer - (princ (buffer-substring-no-properties (point-min) (point-max))) - (kill-buffer))))))) - -(defconst flycheck-emacs-lisp-checkdoc-variables - '(checkdoc-symbol-words - checkdoc-arguments-in-order-flag - checkdoc-force-history-flag - checkdoc-permit-comma-termination-flag - checkdoc-force-docstrings-flag - checkdoc-package-keywords-flag - checkdoc-spellcheck-documentation-flag - checkdoc-verb-check-experimental-flag - checkdoc-max-keyref-before-warn - sentence-end-double-space) - "Variables inherited by the checkdoc subprocess.") - -(defun flycheck-emacs-lisp-checkdoc-variables-form () - "Make a sexp to pass relevant variables to a checkdoc subprocess. - -Variables are taken from `flycheck-emacs-lisp-checkdoc-variables'." - `(progn - ,@(seq-map (lambda (opt) `(setq-default ,opt ',(symbol-value opt))) - (seq-filter #'boundp flycheck-emacs-lisp-checkdoc-variables)))) - -(flycheck-define-checker emacs-lisp-checkdoc - "An Emacs Lisp style checker using CheckDoc. - -The checker runs `checkdoc-current-buffer'." - :command ("emacs" (eval flycheck-emacs-args) - "--eval" (eval (flycheck-sexp-to-string - (flycheck-emacs-lisp-checkdoc-variables-form))) - "--eval" (eval flycheck-emacs-lisp-checkdoc-form) - "--" source) - :error-patterns - ((warning line-start (file-name) ":" line ": " (message) line-end)) - :modes (emacs-lisp-mode) - :enabled flycheck--emacs-lisp-enabled-p) - -(dolist (checker '(emacs-lisp emacs-lisp-checkdoc)) - (setf (car (flycheck-checker-get checker 'command)) - flycheck-this-emacs-executable)) - -(defun flycheck-ember-template--check-for-config (&rest _ignored) - "Check the required config file is available up the file system." - (and buffer-file-name - (locate-dominating-file buffer-file-name ".template-lintrc.js"))) - -(defun flycheck-ember-template--parse-error (output checker buffer) - "Parse Ember-template-lint errors/warnings from JSON OUTPUT. -CHECKER and BUFFER denote the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively." - (mapcar (lambda (err) - (let-alist err - (flycheck-error-new-at - .line - .column - (pcase .severity - (2 'error) - (1 'warning) - (_ 'warning)) - .message - :id .rule - :checker checker - :buffer buffer - :filename (buffer-file-name buffer)))) - (cdr (car (car (flycheck-parse-json output)))))) - -(flycheck-def-config-file-var flycheck-ember-template-lintrc - ember-template - ".template-lintrc.js") - -(flycheck-define-checker ember-template - "An Ember template checker using ember-template-lint." - :command ("ember-template-lint" - (config-file "--config-path" flycheck-ember-template-lintrc) - "--filename" source-original - "--json") - :standard-input t - :error-parser flycheck-ember-template--parse-error - :modes web-mode - :enabled flycheck-ember-template--check-for-config - :working-directory flycheck-ember-template--check-for-config) - -(flycheck-def-option-var flycheck-erlang-include-path nil erlang - "A list of include directories for Erlang. - -The value of this variable is a list of strings, where each -string is a directory to add to the include path of erlc. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.24")) - -(flycheck-def-option-var flycheck-erlang-library-path nil erlang - "A list of library directories for Erlang. - -The value of this variable is a list of strings, where each -string is a directory to add to the library path of erlc. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Library directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.24")) - -(flycheck-define-checker erlang - "An Erlang syntax checker using the Erlang interpreter. - -See URL `http://www.erlang.org/'." - :command ("erlc" - "-o" temporary-directory - (option-list "-I" flycheck-erlang-include-path) - (option-list "-pa" flycheck-erlang-library-path) - "-Wall" - source) - :error-patterns - ((warning line-start (file-name) ":" line ": Warning:" (message) line-end) - (error line-start (file-name) ":" line ": " (message) line-end)) - :modes erlang-mode - :enabled (lambda () (string-suffix-p ".erl" (buffer-file-name)))) - -(defun flycheck--contains-rebar-config (dir-name) - "Return DIR-NAME if rebar config file exists in DIR-NAME, nil otherwise." - (when (or (file-exists-p (expand-file-name "rebar.config" dir-name)) - (file-exists-p (expand-file-name "rebar.config.script" dir-name))) - dir-name)) - -(defun flycheck--locate-rebar3-project-root - (file-name &optional prev-file-name acc) - "Find the top-most rebar project root for source FILE-NAME. - -A project root directory is any directory containing a -rebar.config file. Find the top-most directory to move out of any -nested dependencies. - -FILE-NAME is a source file for which to find the project. - -PREV-FILE-NAME helps us prevent infinite looping - -ACC is an accumulator that keeps the list of results, the first -non-nil of which will be our project root. - -Return the absolute path to the directory" - (if (string= file-name prev-file-name) - (car (remove nil acc)) - (let ((current-dir (file-name-directory file-name))) - (flycheck--locate-rebar3-project-root - (directory-file-name current-dir) - file-name - (cons (flycheck--contains-rebar-config current-dir) acc))))) - -(defun flycheck-rebar3-project-root (&optional _checker) - "Return directory where rebar.config is located." - (flycheck--locate-rebar3-project-root buffer-file-name)) - -(flycheck-def-option-var flycheck-erlang-rebar3-profile nil erlang-rebar3 - "The rebar3 profile to use. - -The profile used when compiling, if VALUE is nil \"test\" will be used -when the file is located in test directory, otherwise \"default\" will be -used as profile." - :type '(choice (const :tag "Automatic" nil) - (string :tag "Profile")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "32")) - -(defun flycheck-erlang-rebar3-get-profile () - "Return rebar3 profile. - -Use flycheck-erlang-rebar3-profile if set, otherwise use test or eqc profile if -directory name is \"test\" or \"eqc\", or else \"default\"." - (or - flycheck-erlang-rebar3-profile - (with-no-warnings - ;; `seq-contains-p' is only in seq >= 2.21 - (seq-contains '("test" "eqc") - (and buffer-file-name - (file-name-base - (directory-file-name - (file-name-directory buffer-file-name)))))) - "default")) - -(flycheck-define-checker erlang-rebar3 - "An Erlang syntax checker using the rebar3 build tool." - :command ("rebar3" "as" (eval (flycheck-erlang-rebar3-get-profile)) "compile") - :error-parser flycheck-parse-with-patterns-without-color - :error-patterns - ((warning line-start - (file-name) ":" line ": Warning:" (message) line-end) - (error line-start - (file-name) ":" line ": " (message) line-end)) - :modes erlang-mode - :enabled flycheck-rebar3-project-root - :predicate flycheck-buffer-saved-p - :working-directory flycheck-rebar3-project-root) - -(flycheck-define-checker eruby-erubis - "An eRuby syntax checker using the `erubis' command. - -See URL `http://www.kuwata-lab.com/erubis/'." - :command ("erubis" "-z" source) - :error-patterns - ((error line-start (file-name) ":" line ": " (message) line-end)) - :modes (html-erb-mode rhtml-mode) - :next-checkers ((warning . eruby-ruumba))) - -(flycheck-def-config-file-var flycheck-ruumbarc eruby-ruumba ".ruumba.yml") - -(flycheck-def-option-var flycheck-ruumba-lint-only nil eruby-ruumba - "Whether to only report code issues in Ruumba. - -When non-nil, only report code issues in Ruumba, via `--lint'. -Otherwise report style issues as well." - :safe #'booleanp - :type 'boolean - :package-version '(flycheck . "32")) - -(flycheck-define-checker eruby-ruumba - "An eRuby syntax and style checker using the Ruumba tool. - -You need at least Ruumba 0.1.7 for this syntax checker. - -See URL `https://github.com/ericqweinstein/ruumba'." - :command ("ruumba" - "--display-cop-names" - "--force-exclusion" - "--format" "emacs" - "--cache" "false" - (config-file "--config" flycheck-ruumbarc) - (option-flag "--lint" flycheck-ruumba-lint-only) - ;; Ruumba takes the original file name as argument when reading - ;; from standard input - "--stdin" source-original) - :standard-input t - :working-directory flycheck-ruby--find-project-root - :error-patterns - ((info line-start (file-name) ":" line ":" column ": C: " - (optional (id (one-or-more (not (any ":")))) ": ") (message) line-end) - (warning line-start (file-name) ":" line ":" column ": W: " - (optional (id (one-or-more (not (any ":")))) ": ") (message) - line-end) - (error line-start (file-name) ":" line ":" column ": " (or "E" "F") ": " - (optional (id (one-or-more (not (any ":")))) ": ") (message) - line-end)) - :modes (html-erb-mode rhtml-mode)) - -(flycheck-def-args-var flycheck-gfortran-args fortran-gfortran - :package-version '(flycheck . "0.22")) - -(flycheck-def-option-var flycheck-gfortran-include-path nil fortran-gfortran - "A list of include directories for GCC Fortran. - -The value of this variable is a list of strings, where each -string is a directory to add to the include path of gcc. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gfortran-language-standard "f95" - fortran-gfortran - "The language standard to use in GFortran. - -The value of this variable is either a string denoting a language -standard, or nil, to use the default standard. When non-nil, -pass the language standard via the `-std' option." - :type '(choice (const :tag "Default standard" nil) - (string :tag "Language standard")) - :package-version '(flycheck . "0.20")) - -(flycheck-def-option-var flycheck-gfortran-layout nil fortran-gfortran - "The source code layout to use in GFortran. - -The value of this variable is one of the following symbols: - -nil - Let gfortran determine the layout from the extension - -`free' - Use free form layout - - -`fixed' - Use fixed form layout - -In any other case, an error is signaled." - :type '(choice (const :tag "Guess layout from extension" nil) - (const :tag "Free form layout" free) - (const :tag "Fixed form layout" fixed)) - :safe (lambda (value) (or (not value) (memq value '(free fixed)))) - :package-version '(flycheck . "0.20")) - -(defun flycheck-option-gfortran-layout (value) - "Option VALUE filter for `flycheck-gfortran-layout'." - (pcase value - (`nil nil) - (`free "free-form") - (`fixed "fixed-form") - (_ (error "Invalid value for flycheck-gfortran-layout: %S" value)))) - -(flycheck-def-option-var flycheck-gfortran-warnings '("all" "extra") - fortran-gfortran - "A list of warnings for GCC Fortran. - -The value of this variable is a list of strings, where each string -is the name of a warning category to enable. By default, all -recommended warnings and some extra warnings are enabled (as by -`-Wall' and `-Wextra' respectively). - -Refer to the gfortran manual at URL -`https://gcc.gnu.org/onlinedocs/gfortran/' for more information -about warnings" - :type '(choice (const :tag "No additional warnings" nil) - (repeat :tag "Additional warnings" - (string :tag "Warning name"))) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.20")) - -(flycheck-define-checker fortran-gfortran - "An Fortran syntax checker using GCC. - -Uses GCC's Fortran compiler gfortran. See URL -`https://gcc.gnu.org/onlinedocs/gfortran/'." - :command ("gfortran" - "-fsyntax-only" - "-fshow-column" - ;; Do not visually indicate the source location - "-fno-diagnostics-show-caret" - ;; Do not show the corresponding warning group - "-fno-diagnostics-show-option" - ;; Fortran has similar include processing as C/C++ - "-iquote" (eval (flycheck-c/c++-quoted-include-directory)) - (option "-std=" flycheck-gfortran-language-standard concat) - (option "-f" flycheck-gfortran-layout concat - flycheck-option-gfortran-layout) - (option-list "-W" flycheck-gfortran-warnings concat) - (option-list "-I" flycheck-gfortran-include-path concat) - (eval flycheck-gfortran-args) - source) - :error-patterns - ((error line-start (file-name) ":" line (or ":" ".") column (or ": " ":\n") - (or (= 3 (zero-or-more not-newline) "\n") "") - (or "Error" "Fatal Error") ": " - (message) line-end) - (warning line-start (file-name) ":" line (or ":" ".") column (or ": " ":\n") - (or (= 3 (zero-or-more not-newline) "\n") "") - "Warning: " (message) line-end)) - :modes (fortran-mode f90-mode)) - -(flycheck-define-checker go-gofmt - "A Go syntax and style checker using the gofmt utility. - -See URL `https://golang.org/cmd/gofmt/'." - :command ("gofmt") - :standard-input t - :error-patterns - ((error line-start ":" line ":" column ": " - (message) line-end)) - :modes go-mode - :next-checkers ((warning . go-golint) - ;; Fall back, if go-golint doesn't exist - (warning . go-vet) - ;; Fall back, if go-vet doesn't exist - (warning . go-build) (warning . go-test) - (warning . go-errcheck) - (warning . go-unconvert) - (warning . go-staticcheck))) - -(flycheck-define-checker go-golint - "A Go style checker using Golint. - -See URL `https://github.com/golang/lint'." - :command ("golint" source) - :error-patterns - ((warning line-start (file-name) ":" line ":" column ": " (message) line-end)) - :modes go-mode - :next-checkers (go-vet - ;; Fall back, if go-vet doesn't exist - go-build go-test go-errcheck go-unconvert)) - -(flycheck-def-option-var flycheck-go-vet-print-functions nil go-vet - "A list of print-like functions for `go vet'. - -Go vet will check these functions for format string problems and -issues, such as a mismatch between the number of formats used, -and the number of arguments given. - -Each entry is in the form Name:N where N is the zero-based -argument position of the first argument involved in the print: -either the format or the first print argument for non-formatted -prints. For example, if you have Warn and Warnf functions that -take an io.Writer as their first argument, like Fprintf, --printfuncs=Warn:1,Warnf:1 " - :type '(repeat :tag "print-like functions" - (string :tag "function")) - :safe #'flycheck-string-list-p) - -(flycheck-define-checker go-vet - "A Go syntax checker using the `go vet' command. - -See URL `https://golang.org/cmd/go/' and URL -`https://golang.org/cmd/vet/'." - :command ("go" "vet" - (option "-printf.funcs=" flycheck-go-vet-print-functions concat - flycheck-option-comma-separated-list) - source) - :error-patterns - ((warning line-start (file-name) ":" line ": " (message) line-end)) - :modes go-mode - :next-checkers (go-build - go-test - ;; Fall back if `go build' or `go test' can be used - go-errcheck - go-unconvert - go-staticcheck) - :verify (lambda (_) - (let* ((go (flycheck-checker-executable 'go-vet)) - (have-vet (member "vet" (ignore-errors - (process-lines go "tool"))))) - (list - (flycheck-verification-result-new - :label "go tool vet" - :message (if have-vet "present" "missing") - :face (if have-vet 'success '(bold error))))))) - -(flycheck-def-option-var flycheck-go-build-install-deps nil (go-build go-test) - "Whether to install dependencies in `go build' and `go test'. - -If non-nil automatically install dependencies with `go build' -while syntax checking." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.25")) - -(flycheck-def-option-var flycheck-go-build-tags nil - (go-build go-test go-errcheck go-staticcheck) - "A list of tags for `go build'. - -Each item is a string with a tag to be given to `go build'." - :type '(repeat (string :tag "Tag")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.25")) - - -(flycheck-def-option-var flycheck-go-version nil go-staticcheck - "The version of go that should be targeted by `staticcheck'. - -Should be a string representing a version, like 1.6 or 1.11.4. -See `https://staticcheck.io/docs/#targeting-go-versions' for -details." - :type '(choice (const :tag "Unspecified" nil) - (string :tag "Version")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "0.32")) - -(flycheck-define-checker go-build - "A Go syntax and type checker using the `go build' command. - -Requires Go 1.6 or newer. See URL `https://golang.org/cmd/go'." - :command ("go" "build" - (option-flag "-i" flycheck-go-build-install-deps) - ;; multiple tags are listed as "dev debug ..." - (option-list "-tags=" flycheck-go-build-tags concat) - "-o" null-device) - :error-patterns - ((error line-start (file-name) ":" line ":" - (optional column ":") " " - (message (one-or-more not-newline) - (zero-or-more "\n\t" (one-or-more not-newline))) - line-end) - ;; Catch error message about multiple packages in a directory, which doesn't - ;; follow the standard error message format. - (info line-start - (message "can't load package: package " - (one-or-more (not (any ?: ?\n))) - ": found packages " - (one-or-more not-newline)) - line-end)) - :error-filter - (lambda (errors) - (dolist (error errors) - (unless (flycheck-error-line error) - ;; Flycheck ignores errors without line numbers, but the error - ;; message about multiple packages in a directory doesn't come with a - ;; line number, so inject a fake one. - (setf (flycheck-error-line error) 1))) - errors) - :modes go-mode - :predicate (lambda () - (and (flycheck-buffer-saved-p) - (not (string-suffix-p "_test.go" (buffer-file-name))))) - :next-checkers ((warning . go-errcheck) - (warning . go-unconvert) - (warning . go-staticcheck))) - -(flycheck-define-checker go-test - "A Go syntax and type checker using the `go test' command. - -Requires Go 1.6 or newer. See URL `https://golang.org/cmd/go'." - :command ("go" "test" - (option-flag "-i" flycheck-go-build-install-deps) - (option-list "-tags=" flycheck-go-build-tags concat) - "-c" "-o" null-device) - :error-patterns - ((error line-start (file-name) ":" line ":" - (optional column ":") " " - (message (one-or-more not-newline) - (zero-or-more "\n\t" (one-or-more not-newline))) - line-end)) - :modes go-mode - :predicate - (lambda () (and (flycheck-buffer-saved-p) - (string-suffix-p "_test.go" (buffer-file-name)))) - :next-checkers ((warning . go-errcheck) - (warning . go-unconvert) - (warning . go-staticcheck))) - -(flycheck-define-checker go-errcheck - "A Go checker for unchecked errors. - -Requires errcheck newer than commit 8515d34 (Aug 28th, 2015). - -See URL `https://github.com/kisielk/errcheck'." - :command ("errcheck" - "-abspath" - (option-list "-tags=" flycheck-go-build-tags concat) - ".") - :error-patterns - ((warning line-start - (file-name) ":" line ":" column (or (one-or-more "\t") ": " ":\t") - (message) - line-end)) - :error-filter - (lambda (errors) - (let ((errors (flycheck-sanitize-errors errors))) - (dolist (err errors) - (-when-let (message (flycheck-error-message err)) - ;; Improve the messages reported by errcheck to make them more clear. - (setf (flycheck-error-message err) - (format "Ignored `error` returned from `%s`" message))))) - errors) - :modes go-mode - :predicate (lambda () (flycheck-buffer-saved-p)) - :next-checkers ((warning . go-unconvert) - (warning . go-staticcheck))) - -(flycheck-define-checker go-unconvert - "A Go checker looking for unnecessary type conversions. - -See URL `https://github.com/mdempsky/unconvert'." - :command ("unconvert" ".") - :error-patterns - ((warning line-start (file-name) ":" line ":" column ": " (message) line-end)) - :modes go-mode - :predicate (lambda () (flycheck-buffer-saved-p))) - -(flycheck-define-checker go-staticcheck - "A Go checker that performs static analysis and linting using -the `staticcheck' command. - -`staticcheck' is explicitly fully compatible with \"the last two -versions of go\". `staticheck' can target earlier versions (with -limited features) if `flycheck-go-version' is set. See URL -`https://staticcheck.io/'." - :command ("staticcheck" "-f" "json" - (option-list "-tags" flycheck-go-build-tags concat) - (option "-go" flycheck-go-version)) - - :error-parser flycheck-parse-go-staticcheck - :modes go-mode) - -(flycheck-define-checker groovy - "A groovy syntax checker using groovy compiler API. - -See URL `http://www.groovy-lang.org'." - :command ("groovy" "-e" - "import org.codehaus.groovy.control.* - -unit = new CompilationUnit() -unit.addSource(\"input\", System.in) - -try { - unit.compile(Phases.CONVERSION) -} catch (MultipleCompilationErrorsException e) { - e.errorCollector.write(new PrintWriter(System.out, true), null) -}") - :standard-input t - :error-patterns - ((error line-start "input: " line ":" (message) - " @ line " line ", column " column "." line-end)) - :modes groovy-mode) - -(flycheck-define-checker haml - "A Haml syntax checker using the Haml compiler. - -See URL `http://haml.info'." - :command ("haml" "-c" "--stdin") - :standard-input t - :error-patterns - ((error line-start "Syntax error on line " line ": " (message) line-end) - (error line-start ":" line ": syntax error, " (message) line-end)) - :modes haml-mode) - -(flycheck-define-checker handlebars - "A Handlebars syntax checker using the Handlebars compiler. - -See URL `http://handlebarsjs.com/'." - :command ("handlebars" "-i-") - :standard-input t - :error-patterns - ((error line-start - "Error: Parse error on line " line ":" (optional "\r") "\n" - (zero-or-more not-newline) "\n" (zero-or-more not-newline) "\n" - (message) line-end)) - :modes (handlebars-mode handlebars-sgml-mode web-mode) - :predicate - (lambda () - (if (eq major-mode 'web-mode) - ;; Check if this is a handlebars file since web-mode does not store the - ;; non-canonical engine name - (let* ((regexp-alist (bound-and-true-p web-mode-engine-file-regexps)) - (pattern (cdr (assoc "handlebars" regexp-alist)))) - (and pattern (buffer-file-name) - (string-match-p pattern (buffer-file-name)))) - t))) - -(defconst flycheck-haskell-module-re - (rx line-start (zero-or-more (or "\n" (any space))) - "module" (one-or-more (or "\n" (any space))) - (group (one-or-more (not (any space "(" "\n"))))) - "Regular expression for a Haskell module name.") - -(flycheck-def-args-var flycheck-ghc-args (haskell-stack-ghc haskell-ghc) - :package-version '(flycheck . "0.22")) - -(flycheck-def-option-var flycheck-ghc-stack-use-nix nil haskell-stack-ghc - "Whether to enable nix support in stack. - -When non-nil, stack will append '--nix' flag to any call." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "26")) - -(flycheck-def-option-var flycheck-ghc-stack-project-file nil haskell-stack-ghc - "Override project stack.yaml file. - -The value of this variable is a file path that refers to a yaml -file for the current stack project. Relative file paths are -resolved against the checker's working directory. When non-nil, -stack will get overridden value via `--stack-yaml'." - :type '(choice (const :tag "Unspecified" nil) - (file :tag "Project file")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "32")) - -(flycheck-def-option-var flycheck-ghc-no-user-package-database nil haskell-ghc - "Whether to disable the user package database in GHC. - -When non-nil, disable the user package database in GHC, via -`-no-user-package-db'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.16")) - -(flycheck-def-option-var flycheck-ghc-package-databases nil haskell-ghc - "Additional module databases for GHC. - -The value of this variable is a list of strings, where each -string is a directory of a package database. Each package -database is given to GHC via `-package-db'." - :type '(repeat (directory :tag "Package database")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.16")) - -(flycheck-def-option-var flycheck-ghc-search-path nil - (haskell-stack-ghc haskell-ghc) - "Module search path for (Stack) GHC. - -The value of this variable is a list of strings, where each -string is a directory containing Haskell modules. Each directory -is added to the GHC search path via `-i'." - :type '(repeat (directory :tag "Module directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.16")) - -(flycheck-def-option-var flycheck-ghc-language-extensions nil - (haskell-stack-ghc haskell-ghc) - "Language extensions for (Stack) GHC. - -The value of this variable is a list of strings, where each -string is a Haskell language extension, as in the LANGUAGE -pragma. Each extension is enabled via `-X'." - :type '(repeat (string :tag "Language extension")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.19")) - -(defvar flycheck-haskell-ghc-cache-directory nil - "The cache directory for `ghc' output.") - -(defun flycheck-haskell-ghc-cache-directory () - "Get the cache location for `ghc' output. - -If no cache directory exists yet, create one and return it. -Otherwise return the previously used cache directory." - (setq flycheck-haskell-ghc-cache-directory - (or flycheck-haskell-ghc-cache-directory - (make-temp-file "flycheck-haskell-ghc-cache" 'directory)))) - -(defun flycheck--locate-dominating-file-matching (directory regexp) - "Search for a file in directory hierarchy starting at DIRECTORY. - -Look up the directory hierarchy from DIRECTORY for a directory -containing a file that matches REGEXP." - (locate-dominating-file - directory - (lambda (dir) - (directory-files dir nil regexp t)))) - -(defun flycheck-haskell--find-stack-default-directory () - "Find a directory to run haskell-stack-ghc. - -Return a parent directory with a stack*.y[a]ml file, or the -directory returned by \"stack path --project-root\"." - (or - (when (buffer-file-name) - (flycheck--locate-dominating-file-matching - (file-name-directory (buffer-file-name)) - (rx "stack" (* any) "." (or "yml" "yaml") eos))) - (-when-let* ((stack (funcall flycheck-executable-find "stack")) - (output (ignore-errors - (process-lines stack - "--no-install-ghc" - "path" "--project-root"))) - (stack-dir (car output))) - (and (file-directory-p stack-dir) stack-dir)))) - -(defun flycheck-haskell--ghc-find-default-directory (_checker) - "Find a parent directory containing a cabal or package.yaml file." - (when (buffer-file-name) - (flycheck--locate-dominating-file-matching - (file-name-directory (buffer-file-name)) - "\\.cabal\\'\\|\\`package\\.yaml\\'"))) - -(flycheck-define-checker haskell-stack-ghc - "A Haskell syntax and type checker using `stack ghc'. - -See URL `https://github.com/commercialhaskell/stack'." - :command ("stack" - "--no-install-ghc" - (option "--stack-yaml" flycheck-ghc-stack-project-file) - (option-flag "--nix" flycheck-ghc-stack-use-nix) - "ghc" "--" "-Wall" "-no-link" - "-outputdir" (eval (flycheck-haskell-ghc-cache-directory)) - (option-list "-X" flycheck-ghc-language-extensions concat) - (option-list "-i" flycheck-ghc-search-path concat) - (eval (concat - "-i" - (flycheck-module-root-directory - (flycheck-find-in-buffer flycheck-haskell-module-re)))) - (eval flycheck-ghc-args) - "-x" (eval - (pcase major-mode - (`haskell-mode "hs") - (`literate-haskell-mode "lhs"))) - source) - :error-patterns - ((warning line-start (file-name) ":" line ":" column ":" - (or " " "\n ") (in "Ww") "arning:" - (optional " " "[" (id (one-or-more not-newline)) "]") - (optional "\n") - (message - (one-or-more " ") (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more (not (any ?\n ?|))))) - line-end) - (error line-start (file-name) ":" line ":" column ":" (optional " error:") - (or (message (one-or-more not-newline)) - (and "\n" - (message - (one-or-more " ") (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more (not (any ?\n ?|))))))) - line-end)) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors (flycheck-dedent-error-messages errors))) - :modes (haskell-mode literate-haskell-mode) - :next-checkers ((warning . haskell-hlint)) - :working-directory (lambda (_) - (flycheck-haskell--find-stack-default-directory)) - :enabled flycheck-haskell--find-stack-default-directory - :verify (lambda (_) - (let* ((stack (flycheck-haskell--find-stack-default-directory))) - (list - (flycheck-verification-result-new - :label "stack config" - :message (or stack "Not found") - :face (if stack 'success '(bold error))))))) - -(flycheck-define-checker haskell-ghc - "A Haskell syntax and type checker using ghc. - -See URL `https://www.haskell.org/ghc/'." - :command ("ghc" "-Wall" "-no-link" - "-outputdir" (eval (flycheck-haskell-ghc-cache-directory)) - (option-flag "-no-user-package-db" - flycheck-ghc-no-user-package-database) - (option-list "-package-db" flycheck-ghc-package-databases) - (option-list "-i" flycheck-ghc-search-path concat) - ;; Include the parent directory of the current module tree, to - ;; properly resolve local imports - (eval (concat - "-i" - (flycheck-module-root-directory - (flycheck-find-in-buffer flycheck-haskell-module-re)))) - (option-list "-X" flycheck-ghc-language-extensions concat) - (eval flycheck-ghc-args) - "-x" (eval - (pcase major-mode - (`haskell-mode "hs") - (`literate-haskell-mode "lhs"))) - source) - :error-patterns - ((warning line-start (file-name) ":" line ":" column ":" - (or " " "\n ") (in "Ww") "arning:" - (optional " " "[" (id (one-or-more not-newline)) "]") - (optional "\n") - (message - (one-or-more " ") (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more (not (any ?\n ?|))))) - line-end) - (error line-start (file-name) ":" line ":" column ":" (optional " error:") - (or (message (one-or-more not-newline)) - (and "\n" - (message - (one-or-more " ") (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more (not (any ?\n ?|))))))) - line-end)) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors (flycheck-dedent-error-messages errors))) - :modes (haskell-mode literate-haskell-mode) - :next-checkers ((warning . haskell-hlint)) - :working-directory flycheck-haskell--ghc-find-default-directory) - -(flycheck-def-config-file-var flycheck-hlintrc haskell-hlint "HLint.hs") - -(flycheck-def-args-var flycheck-hlint-args haskell-hlint - :package-version '(flycheck . "0.25")) - -(flycheck-def-option-var flycheck-hlint-language-extensions - nil haskell-hlint - "Extensions list to enable for hlint. - -The value of this variable is a list of strings, where each -string is a name of extension to enable in -hlint (e.g. \"QuasiQuotes\")." - :type '(repeat :tag "Extensions" (string :tag "Extension")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.24")) - -(flycheck-def-option-var flycheck-hlint-ignore-rules - nil haskell-hlint - "Ignore rules list for hlint checks. - -The value of this variable is a list of strings, where each -string is an ignore rule (e.g. \"Use fmap\")." - :type '(repeat :tag "Ignore rules" (string :tag "Ignore rule")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.24")) - -(flycheck-def-option-var flycheck-hlint-hint-packages - nil haskell-hlint - "Hint packages to include for hlint checks. - -The value of this variable is a list of strings, where each -string is a default hint package (e.g. (\"Generalise\" -\"Default\" \"Dollar\"))." - :type '(repeat :tag "Hint packages" (string :tag "Hint package")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.24")) - -(flycheck-define-checker haskell-hlint - "A Haskell style checker using hlint. - -See URL `https://github.com/ndmitchell/hlint'." - :command ("hlint" - (option-list "-X" flycheck-hlint-language-extensions concat) - (option-list "-i=" flycheck-hlint-ignore-rules concat) - (option-list "-h" flycheck-hlint-hint-packages concat) - (config-file "-h" flycheck-hlintrc) - (eval flycheck-hlint-args) - source-inplace) - :error-patterns - ((info line-start - (file-name) ":" line ":" column - ": Suggestion: " - (message (one-or-more (and (one-or-more (not (any ?\n))) ?\n))) - line-end) - (warning line-start - (file-name) ":" line ":" column - ": Warning: " - (message (one-or-more (and (one-or-more (not (any ?\n))) ?\n))) - line-end) - (error line-start - (file-name) ":" line ":" column - ": Error: " - (message (one-or-more (and (one-or-more (not (any ?\n))) ?\n))) - line-end)) - :modes (haskell-mode literate-haskell-mode)) - -(flycheck-def-config-file-var flycheck-tidyrc html-tidy ".tidyrc") - -(flycheck-define-checker html-tidy - "A HTML syntax and style checker using Tidy. - -See URL `https://github.com/htacg/tidy-html5'." - :command ("tidy" (config-file "-config" flycheck-tidyrc) - "-lang" "en" - "-e" "-q") - :standard-input t - :error-patterns - ((error line-start - "line " line - " column " column - " - Error: " (message) line-end) - (warning line-start - "line " line - " column " column - " - Warning: " (message) line-end)) - :modes (html-mode mhtml-mode nxhtml-mode)) - -(flycheck-def-config-file-var flycheck-jshintrc javascript-jshint ".jshintrc") - -(flycheck-def-option-var flycheck-jshint-extract-javascript nil - javascript-jshint - "Whether jshint should extract Javascript from HTML. - -If nil no extract rule is given to jshint. If `auto' only -extract Javascript if a HTML file is detected. If `always' or -`never' extract Javascript always or never respectively. - -Refer to the jshint manual at the URL -`http://jshint.com/docs/cli/#flags' for more information." - :type - '(choice (const :tag "No extraction rule" nil) - (const :tag "Try to extract Javascript when detecting HTML files" - auto) - (const :tag "Always try to extract Javascript" always) - (const :tag "Never try to extract Javascript" never)) - :safe #'symbolp - :package-version '(flycheck . "26")) - -(flycheck-define-checker javascript-jshint - "A Javascript syntax and style checker using jshint. - -See URL `http://www.jshint.com'." - :command ("jshint" "--reporter=checkstyle" - "--filename" source-original - (config-file "--config" flycheck-jshintrc) - (option "--extract=" flycheck-jshint-extract-javascript - concat flycheck-option-symbol) - "-") - :standard-input t - :error-parser flycheck-parse-checkstyle - :error-filter - (lambda (errors) - (flycheck-remove-error-file-names - "stdin" (flycheck-dequalify-error-ids errors))) - :modes (js-mode js2-mode js3-mode rjsx-mode)) - -(flycheck-def-args-var flycheck-eslint-args javascript-eslint - :package-version '(flycheck . "32")) - -(flycheck-def-option-var flycheck-eslint-rules-directories nil javascript-eslint - "A list of directories with custom rules for ESLint. - -The value of this variable is a list of strings, where each -string is a directory with custom rules for ESLint. - -Refer to the ESLint manual at URL -`http://eslint.org/docs/user-guide/command-line-interface#--rulesdir' -for more information about the custom directories." - :type '(repeat (directory :tag "Custom rules directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "29")) - -(defun flycheck-eslint-config-exists-p () - "Whether there is a valid eslint config for the current buffer." - (let* ((executable (flycheck-find-checker-executable 'javascript-eslint)) - (exitcode (and executable - (call-process executable nil nil nil - "--print-config" (or buffer-file-name - "index.js"))))) - (eq exitcode 0))) - -(defun flycheck-parse-eslint (output checker buffer) - "Parse ESLint errors/warnings from JSON OUTPUT. - -CHECKER and BUFFER denote the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `https://eslint.org' for more information about ESLint." - (mapcar (lambda (err) - (let-alist err - (flycheck-error-new-at - .line - .column - (pcase .severity - (2 'error) - (1 'warning) - (_ 'warning)) - .message - :id .ruleId - :checker checker - :buffer buffer - :filename (buffer-file-name buffer) - :end-line .endLine - :end-column .endColumn))) - (let-alist (caar (flycheck-parse-json output)) - .messages))) - -(defun flycheck-eslint--find-working-directory (_checker) - "Look for a working directory to run ESLint CHECKER in. - -This will be the directory that contains the `node_modules' -directory. If no such directory is found in the directory -hierarchy, it looks first for `.eslintignore' and then for -`.eslintrc' files to detect the project root." - (let* ((regex-config (concat "\\`\\.eslintrc" - "\\(\\.\\(js\\|ya?ml\\|json\\)\\)?\\'"))) - (when buffer-file-name - (or (locate-dominating-file buffer-file-name "node_modules") - (locate-dominating-file buffer-file-name ".eslintignore") - (locate-dominating-file - (file-name-directory buffer-file-name) - (lambda (directory) - (> (length (directory-files directory nil regex-config t)) 0))))))) - -(flycheck-define-checker javascript-eslint - "A Javascript syntax and style checker using eslint. - -See URL `https://eslint.org/'." - :command ("eslint" "--format=json" - (option-list "--rulesdir" flycheck-eslint-rules-directories) - (eval flycheck-eslint-args) - "--stdin" "--stdin-filename" source-original) - :standard-input t - :error-parser flycheck-parse-eslint - :enabled (lambda () (flycheck-eslint-config-exists-p)) - :modes (js-mode js-jsx-mode js2-mode js2-jsx-mode js3-mode rjsx-mode - typescript-mode) - :working-directory flycheck-eslint--find-working-directory - :verify - (lambda (_) - (let* ((default-directory - (flycheck-compute-working-directory 'javascript-eslint)) - (have-config (flycheck-eslint-config-exists-p))) - (list - (flycheck-verification-result-new - :label "config file" - :message (if have-config "found" "missing or incorrect") - :face (if have-config 'success '(bold error))))))) - -(flycheck-define-checker javascript-standard - "A Javascript code and style checker for the (Semi-)Standard Style. - -This checker works with `standard' and `semistandard', defaulting -to the former. To use it with the latter, set -`flycheck-javascript-standard-executable' to `semistandard'. - -See URL `https://github.com/standard/standard' and URL -`https://github.com/Flet/semistandard'." - :command ("standard" "--stdin") - :standard-input t - :error-patterns - ((error line-start " :" line ":" column ":" (message) line-end)) - :modes (js-mode js-jsx-mode js2-mode js2-jsx-mode js3-mode rjsx-mode)) - -(flycheck-define-checker json-jsonlint - "A JSON syntax and style checker using jsonlint. - -See URL `https://github.com/zaach/jsonlint'." - ;; We can't use standard input for jsonlint, because it doesn't output errors - ;; anymore when using -c -q with standard input :/ - :command ("jsonlint" "-c" "-q" source) - :error-patterns - ((error line-start - (file-name) - ": line " line - ", col " column ", " - (message) line-end)) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors (flycheck-increment-error-columns errors))) - :modes json-mode) - -(flycheck-define-checker json-python-json - "A JSON syntax checker using Python json.tool module. - -See URL `https://docs.python.org/3.5/library/json.html#command-line-interface'." - :command ("python3" "-m" "json.tool" source - ;; Send the pretty-printed output to the null device - null-device) - :error-patterns - ((error line-start - (message) ": line " line " column " column - ;; Ignore the rest of the line which shows the char position. - (one-or-more not-newline) - line-end)) - :modes json-mode - ;; The JSON parser chokes if the buffer is empty and has no JSON inside - :predicate flycheck-buffer-nonempty-p) - -(flycheck-define-checker json-jq - "JSON checker using the jq tool. - -This checker accepts multiple consecutive JSON values in a -single input, which is useful for jsonlines data. - -See URL `https://stedolan.github.io/jq/'." - :command ("jq" "." source null-device) - ;; Example error message: - ;; parse error: Expected another key-value pair at line 3, column 1 - :error-patterns - ((error line-start - (optional "parse error: ") - (message) "at line " line ", column " column - (zero-or-more not-newline) line-end)) - :modes json-mode) - -(flycheck-define-checker jsonnet - "A Jsonnet syntax checker using the jsonnet binary. - -See URL `https://jsonnet.org'." - :command ("jsonnet" source-inplace) - :error-patterns - ((error line-start "STATIC ERROR: " (file-name) ":" - (or (seq line ":" column (zero-or-one (seq "-" end-column))) - (seq "(" line ":" column ")" "-" - "(" end-line ":" end-column ")")) - ": " (message) line-end) - (error line-start "RUNTIME ERROR: " (message) "\n" - (? "\t" (file-name) ":" ;; first line of the backtrace - (or (seq line ":" column (zero-or-one (seq "-" end-column))) - (seq "(" line ":" column ")" "-" - "(" end-line ":" end-column ")"))))) - :error-filter - (lambda (errs) - ;; Some errors are missing line numbers. See URL - ;; `https://github.com/google/jsonnet/issues/786'. - (dolist (err errs) - (unless (flycheck-error-line err) - (setf (flycheck-error-line err) 1))) - (flycheck-sanitize-errors errs)) - :modes jsonnet-mode) - -(flycheck-define-checker less - "A LESS syntax checker using lessc. - -Requires lessc 1.4 or newer. - -See URL `http://lesscss.org'." - :command ("lessc" "--lint" "--no-color" - "-") - :standard-input t - :error-patterns - ((error line-start (one-or-more word) ":" - (message) - " in - on line " line - ", column " column ":" - line-end)) - :modes less-css-mode) - -(flycheck-define-checker less-stylelint - "A LESS syntax and style checker using stylelint. - -See URL `http://stylelint.io/'." - :command ("stylelint" - (eval flycheck-stylelint-args) - "--syntax" "less" - (option-flag "--quiet" flycheck-stylelint-quiet) - (config-file "--config" flycheck-stylelintrc)) - :standard-input t - :error-parser flycheck-parse-stylelint - :predicate flycheck-buffer-nonempty-p - :modes (less-css-mode)) - -(flycheck-define-checker llvm-llc - "Flycheck LLVM IR checker using llc. - -See URL `http://llvm.org/docs/CommandGuide/llc.html'." - :command ("llc" "-o" null-device source) - :error-patterns - ((error line-start - ;; llc prints the executable path - (zero-or-one (minimal-match (one-or-more not-newline)) ": ") - (file-name) ":" line ":" column ": error: " (message) - line-end)) - :error-filter - (lambda (errors) - ;; sanitize errors occurring in inline assembly - (flycheck-sanitize-errors - (flycheck-remove-error-file-names "" errors))) - :modes llvm-mode) - -(flycheck-def-config-file-var flycheck-luacheckrc lua-luacheck ".luacheckrc") - -(flycheck-def-option-var flycheck-luacheck-standards nil lua-luacheck - "The standards to use in luacheck. - -The value of this variable is either a list of strings denoting -the standards to use, or nil to pass nothing to luacheck. When -non-nil, pass the standards via one or more `--std' options." - :type '(choice (const :tag "Default" nil) - (repeat :tag "Custom standards" - (string :tag "Standard name"))) - :safe #'flycheck-string-list-p) -(make-variable-buffer-local 'flycheck-luacheck-standards) - -(flycheck-define-checker lua-luacheck - "A Lua syntax checker using luacheck. - -See URL `https://github.com/mpeterv/luacheck'." - :command ("luacheck" - "--formatter" "plain" - "--codes" ; Show warning codes - "--no-color" - (option-list "--std" flycheck-luacheck-standards) - (config-file "--config" flycheck-luacheckrc) - "--filename" source-original - ;; Read from standard input - "-") - :standard-input t - :error-patterns - ((warning line-start - (optional (file-name)) - ":" line ":" column - ": (" (id "W" (one-or-more digit)) ") " - (message) line-end) - (error line-start - (optional (file-name)) - ":" line ":" column ":" - ;; `luacheck' before 0.11.0 did not output codes for errors, hence - ;; the ID is optional here - (optional " (" (id "E" (one-or-more digit)) ") ") - (message) line-end)) - :modes lua-mode) - -(flycheck-define-checker lua - "A Lua syntax checker using the Lua compiler. - -See URL `http://www.lua.org/'." - :command ("luac" "-p" "-") - :standard-input t - :error-patterns - ((error line-start - ;; Skip the name of the luac executable. - (minimal-match (zero-or-more not-newline)) - ": stdin:" line ": " (message) line-end)) - :modes lua-mode) - -(flycheck-define-checker opam - "A Opam syntax and style checker using opam lint. - -See URL `https://opam.ocaml.org/doc/man/opam-lint.html'." - :command ("opam" "lint" "-") - :standard-input t - :error-patterns - ((error line-start ; syntax error - (one-or-more space) "error " (id ?2) - ": File format error" - (or (and " at line " line ", column " column ": " (message)) - (and ": " (message))) - line-end) - (error line-start - (one-or-more space) "error " (id ?3) - (minimal-match (zero-or-more not-newline)) - "at line " line ", column " column ": " (message) - line-end) - (error line-start - (one-or-more space) "error " (id (one-or-more num)) - ": " (message (one-or-more not-newline)) - line-end) - (warning line-start - (one-or-more space) "warning " (id (one-or-more num)) - ": " (message) - line-end)) - :error-filter - (lambda (errors) - (flycheck-increment-error-columns - (flycheck-fill-empty-line-numbers errors))) - :modes tuareg-opam-mode) - -(flycheck-def-option-var flycheck-perl-include-path nil perl - "A list of include directories for Perl. - -The value of this variable is a list of strings, where each -string is a directory to add to the include path of Perl. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.24")) - -(flycheck-def-option-var flycheck-perl-module-list nil perl - "A list of modules to use for Perl. - -The value of this variable is a list of strings, where each -string is a module to 'use' in Perl." - :type '(repeat :tag "Module") - :safe #'flycheck-string-list-p - :package-version '(flycheck . "32")) - -(flycheck-define-checker perl - "A Perl syntax checker using the Perl interpreter. - -See URL `https://www.perl.org'." - :command ("perl" "-w" "-c" - (option-list "-I" flycheck-perl-include-path) - (option-list "-M" flycheck-perl-module-list concat)) - :standard-input t - :error-patterns - ((error line-start (minimal-match (message)) - " at - line " line - (or "." (and ", " (zero-or-more not-newline))) line-end)) - :modes (perl-mode cperl-mode) - :next-checkers (perl-perlcritic)) - -(flycheck-def-option-var flycheck-perlcritic-severity nil perl-perlcritic - "The message severity for Perl Critic. - -The value of this variable is a severity level as integer, for -the `--severity' option to Perl Critic." - :type '(integer :tag "Severity level") - :safe #'integerp - :package-version '(flycheck . "0.18")) - -(flycheck-def-option-var flycheck-perlcritic-theme nil perl-perlcritic - "The theme expression for Perl Critic. - -The value of this variable is passed as the `--theme' option to -`Perl::Critic'. See the documentation of `Perl::Critic' for -details." - :type '(choice (const :tag "None" nil) - (string :tag "Theme expression")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "32-csv")) - -(flycheck-def-config-file-var flycheck-perlcriticrc perl-perlcritic - ".perlcriticrc" - :package-version '(flycheck . "26")) - -(flycheck-define-checker perl-perlcritic - "A Perl syntax checker using Perl::Critic. - -See URL `https://metacpan.org/pod/Perl::Critic'." - :command ("perlcritic" "--no-color" "--verbose" "%f/%l/%c/%s/%p/%m (%e)\n" - (config-file "--profile" flycheck-perlcriticrc) - (option "--severity" flycheck-perlcritic-severity nil - flycheck-option-int) - (option "--theme" flycheck-perlcritic-theme)) - :standard-input t - :error-patterns - ((info line-start - "STDIN/" line "/" column "/" (any "1") "/" - (id (one-or-more (not (any "/")))) "/" (message) - line-end) - (warning line-start - "STDIN/" line "/" column "/" (any "234") "/" - (id (one-or-more (not (any "/")))) "/" (message) - line-end) - (error line-start - "STDIN/" line "/" column "/" (any "5") "/" - (id (one-or-more (not (any "/")))) "/" (message) - line-end)) - :modes (cperl-mode perl-mode)) - -(flycheck-define-checker php - "A PHP syntax checker using the PHP command line interpreter. - -See URL `http://php.net/manual/en/features.commandline.php'." - :command ("php" "-l" "-d" "error_reporting=E_ALL" "-d" "display_errors=1" - "-d" "log_errors=0" source) - :error-patterns - ((error line-start (or "Parse" "Fatal" "syntax") " error" (any ":" ",") " " - (message) " in " (file-name) " on line " line line-end)) - :modes (php-mode php+-mode) - :next-checkers ((warning . php-phpmd) - (warning . php-phpcs))) - -(flycheck-def-option-var flycheck-phpmd-rulesets - '("cleancode" "codesize" "controversial" "design" "naming" "unusedcode") - php-phpmd - "The rule sets for PHP Mess Detector. - -Set default rule sets and custom rule set files. - -See section \"Using multiple rule sets\" in the PHP Mess Detector -manual at URL `https://phpmd.org/documentation/index.html'." - :type '(repeat :tag "rule sets" - (string :tag "A filename or rule set")) - :safe #'flycheck-string-list-p) - -(flycheck-define-checker php-phpmd - "A PHP style checker using PHP Mess Detector. - -See URL `https://phpmd.org/'." - :command ("phpmd" source "xml" - (eval (flycheck-option-comma-separated-list - flycheck-phpmd-rulesets))) - :error-parser flycheck-parse-phpmd - :modes (php-mode php+-mode) - :next-checkers (php-phpcs)) - -(flycheck-def-option-var flycheck-phpcs-standard nil php-phpcs - "The coding standard for PHP CodeSniffer. - -When nil, use the default standard from the global PHP -CodeSniffer configuration. When set to a string, pass the string -to PHP CodeSniffer which will interpret it as name as a standard, -or as path to a standard specification." - :type '(choice (const :tag "Default standard" nil) - (string :tag "Standard name or file")) - :safe #'flycheck-string-or-nil-p) - -(flycheck-define-checker php-phpcs - "A PHP style checker using PHP Code Sniffer. - -Needs PHP Code Sniffer 2.6 or newer. - -See URL `http://pear.php.net/package/PHP_CodeSniffer/'." - :command ("phpcs" "--report=checkstyle" - ;; Use -q flag to force quiet mode - ;; Quiet mode prevents errors from extra output when phpcs has - ;; been configured with show_progress enabled - "-q" - (option "--standard=" flycheck-phpcs-standard concat) - ;; Some files are not detected correctly - ;; so it is necessary to pass the extension. - (eval - (-when-let* ((fname buffer-file-name) - (ext (file-name-extension fname))) - (concat "--extensions=" ext))) - - ;; Pass original file name to phpcs. We need to concat explicitly - ;; here, because phpcs really insists to get option and argument as - ;; a single command line argument :| - (eval (when (buffer-file-name) - (concat "--stdin-path=" (buffer-file-name)))) - ;; Read from standard input - "-") - :standard-input t - :error-parser flycheck-parse-checkstyle - :error-filter - (lambda (errors) - (flycheck-sanitize-errors - (flycheck-remove-error-file-names "STDIN" errors))) - :modes (php-mode php+-mode) - ;; phpcs seems to choke on empty standard input, hence skip phpcs if the - ;; buffer is empty, see https://github.com/flycheck/flycheck/issues/907 - :predicate flycheck-buffer-nonempty-p) - -(flycheck-define-checker processing - "Processing command line tool. - -See https://github.com/processing/processing/wiki/Command-Line" - :command ("processing-java" "--force" - ;; Don't change the order of these arguments, processing is pretty - ;; picky - (eval (concat "--sketch=" (file-name-directory (buffer-file-name)))) - (eval (concat "--output=" (flycheck-temp-dir-system))) - "--build") - :error-patterns - ((error line-start (file-name) ":" line ":" column - (zero-or-more (or digit ":")) (message) line-end)) - :modes processing-mode - ;; This syntax checker needs a file name - :predicate (lambda () (buffer-file-name))) - -(defun flycheck-proselint-parse-errors (output checker buffer) - "Parse proselint json output errors from OUTPUT. - -CHECKER and BUFFER denoted the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `http://proselint.com/' for more information about proselint." - (mapcar (lambda (err) - (let-alist err - (flycheck-error-new-at-pos - .start - (pcase .severity - (`"suggestion" 'info) - (`"warning" 'warning) - (`"error" 'error) - ;; Default to error - (_ 'error)) - .message - :id .check - :buffer buffer - :checker checker - ;; See https://github.com/amperser/proselint/issues/1048 - :end-pos .end))) - (let-alist (car (flycheck-parse-json output)) - .data.errors))) - -(flycheck-define-checker proselint - "Flycheck checker using Proselint. - -See URL `http://proselint.com/'." - :command ("proselint" "--json" "-") - :standard-input t - :error-parser flycheck-proselint-parse-errors - :modes (text-mode markdown-mode gfm-mode message-mode org-mode)) - -(flycheck-def-option-var flycheck-protoc-import-path nil protobuf-protoc - "A list of directories to resolve import directives. - -The value of this variable is a list of strings, where each -string is a directory to add to the import path. Relative paths -are relative to the file being checked." - :type '(repeat (directory :tag "Import directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "32")) - -(flycheck-define-checker protobuf-protoc - "A protobuf syntax checker using the protoc compiler. - -See URL `https://developers.google.com/protocol-buffers/'." - :command ("protoc" "--error_format" "gcc" - (eval (concat "--java_out=" (flycheck-temp-dir-system))) - ;; Add the current directory to resolve imports - (eval (concat "--proto_path=" - (file-name-directory (buffer-file-name)))) - ;; Add other import paths; this needs to be after the current - ;; directory to produce the right output. See URL - ;; `https://github.com/flycheck/flycheck/pull/1655' - (option-list "--proto_path=" flycheck-protoc-import-path concat) - source-inplace) - :error-patterns - ((info line-start (file-name) ":" line ":" column - ": note: " (message) line-end) - (error line-start (file-name) ":" line ":" column - ": " (message) line-end) - (error line-start - (message "In file included from") " " (file-name) ":" line ":" - column ":" line-end)) - :modes protobuf-mode - :predicate (lambda () (buffer-file-name))) - -(defun flycheck-prototool-project-root (&optional _checker) - "Return the nearest directory holding the prototool.yaml configuration." - (and buffer-file-name - (locate-dominating-file buffer-file-name "prototool.yaml"))) - -(flycheck-define-checker protobuf-prototool - "A protobuf syntax checker using prototool. - -See URL `https://github.com/uber/prototool'." - :command ("prototool" "lint" source-original) - :error-patterns - ((warning line-start (file-name) ":" line ":" column ":" (message) line-end)) - :modes protobuf-mode - :enabled flycheck-prototool-project-root - :predicate flycheck-buffer-saved-p) - -(flycheck-define-checker pug - "A Pug syntax checker using the pug compiler. - -See URL `https://pugjs.org/'." - :command ("pug" "-p" (eval (expand-file-name (buffer-file-name)))) - :standard-input t - :error-patterns - ;; errors with includes/extends (e.g. missing files) - ((error "Error: " (message) (zero-or-more not-newline) "\n" - (zero-or-more not-newline) "at " - (zero-or-more not-newline) " line " line) - ;; error when placing anything other than a mixin or - ;; block at the top-level of an extended template - ;; also unknown filters - (error line-start "Error: " (file-name) ":" - line ":" column "\n\n" (message) line-end) - ;; syntax/runtime errors (e.g. type errors, bad indentation, etc.) - (error line-start - (optional "Type") "Error: " (file-name) ":" - line (optional ":" column) - (zero-or-more not-newline) "\n" - (one-or-more (or (zero-or-more not-newline) "|" - (zero-or-more not-newline) "\n") - (zero-or-more "-") (zero-or-more not-newline) "|" - (zero-or-more not-newline) "\n") - (zero-or-more not-newline) "\n" - (one-or-more - (zero-or-more not-newline) "|" - (zero-or-more not-newline) "\n") - (zero-or-more not-newline) "\n" - (message) - line-end)) - :modes pug-mode) - -(flycheck-define-checker puppet-parser - "A Puppet DSL syntax checker using puppet's own parser. - -See URL `https://puppet.com/'." - :command ("puppet" "parser" "validate" "--color=false") - :standard-input t - :error-patterns - ( - ;; Patterns for Puppet 4 - (error line-start "Error: Could not parse for environment " - (one-or-more (in "a-z" "0-9" "_")) ":" - (message) "(line: " line ", column: " column ")" line-end) - ;; Errors from Puppet < 4 - (error line-start "Error: Could not parse for environment " - (one-or-more (in "a-z" "0-9" "_")) ":" - (message (minimal-match (one-or-more anything))) - " at line " line line-end) - (error line-start - ;; Skip over the path of the Puppet executable - (minimal-match (zero-or-more not-newline)) - ": Could not parse for environment " (one-or-more word) - ": " (message (minimal-match (zero-or-more anything))) - " at " (file-name "/" (zero-or-more not-newline)) ":" line line-end)) - :modes puppet-mode - :next-checkers ((warning . puppet-lint))) - -(flycheck-def-config-file-var flycheck-puppet-lint-rc puppet-lint - ".puppet-lint.rc" - :package-version '(flycheck . "26")) - -(flycheck-def-option-var flycheck-puppet-lint-disabled-checks nil puppet-lint - "Disabled checkers for `puppet-lint'. - -The value of this variable is a list of strings, where each -string is the name of a check to disable (e.g. \"80chars\" or -\"double_quoted_strings\"). - -See URL `http://puppet-lint.com/checks/' for a list of all checks -and their names." - :type '(repeat (string :tag "Check Name")) - :package-version '(flycheck . "26")) - -(defun flycheck-puppet-lint-disabled-arg-name (check) - "Create an argument to disable a puppetlint CHECK." - (concat "--no-" check "-check")) - -(flycheck-define-checker puppet-lint - "A Puppet DSL style checker using puppet-lint. - -See URL `http://puppet-lint.com/'." - ;; We must check the original file, because Puppetlint is quite picky on the - ;; names of files and there place in the directory structure, to comply with - ;; Puppet's autoload directory layout. For instance, a class foo::bar is - ;; required to be in a file foo/bar.pp. Any other place, such as a Flycheck - ;; temporary file will cause an error. - :command ("puppet-lint" - (config-file "--config" flycheck-puppet-lint-rc) - "--log-format" - "%{path}:%{line}:%{kind}: %{message} (%{check})" - (option-list "" flycheck-puppet-lint-disabled-checks concat - flycheck-puppet-lint-disabled-arg-name) - source-original) - :error-patterns - ((warning line-start (file-name) ":" line ":warning: " (message) line-end) - (error line-start (file-name) ":" line ":error: " (message) line-end)) - :modes puppet-mode - ;; Since we check the original file, we can only use this syntax checker if - ;; the buffer is actually linked to a file, and if it is not modified. - :predicate flycheck-buffer-saved-p) - -(defun flycheck-python-find-module (checker module) - "Check if a Python MODULE is available. -CHECKER's executable is assumed to be a Python REPL." - (-when-let* ((py (flycheck-find-checker-executable checker)) - (script (concat "import sys; sys.path.pop(0);" - (format "import %s; print(%s.__file__)" - module module)))) - (with-temp-buffer - (and (eq (ignore-errors (call-process py nil t nil "-c" script)) 0) - (string-trim (buffer-string)))))) - -(defun flycheck-python-needs-module-p (checker) - "Determines whether CHECKER needs to be invoked through Python. -Previous versions of Flycheck called pylint and flake8 directly; -this check ensures that we don't break existing code." - (not (string-match-p (rx (or "pylint" "flake8") - (or "-script.pyw" ".exe" ".bat" "") - eos) - (flycheck-checker-executable checker)))) - -(defun flycheck-python-verify-module (checker module) - "Verify that a Python MODULE is available. -Return nil if CHECKER's executable is not a Python REPL. This -function's is suitable for a checker's :verify." - (when (flycheck-python-needs-module-p checker) - (let ((mod-path (flycheck-python-find-module checker module))) - (list (flycheck-verification-result-new - :label (format "`%s' module" module) - :message (if mod-path (format "Found at %S" mod-path) "Missing") - :face (if mod-path 'success '(bold error))))))) - -(defun flycheck-python-module-args (checker module-name) - "Compute arguments to pass to CHECKER's executable to run MODULE-NAME. -Return nil if CHECKER's executable is not a Python REPL. -Otherwise, return a list starting with -c (-m is not enough -because it adds the current directory to Python's path)." - (when (flycheck-python-needs-module-p checker) - `("-c" ,(concat "import sys;sys.path.pop(0);import runpy;" - (format "runpy.run_module(%S)" module-name))))) - -(flycheck-def-config-file-var flycheck-flake8rc python-flake8 ".flake8rc") - -(flycheck-def-option-var flycheck-flake8-error-level-alist - '(("^E9.*$" . error) ; Syntax errors from pep8 - ("^F82.*$" . error) ; undefined variables from pyflakes - ("^F83.*$" . error) ; Duplicate arguments from flake8 - ("^D.*$" . info) ; Docstring issues from flake8-pep257 - ("^N.*$" . info) ; Naming issues from pep8-naming - ) - python-flake8 - "An alist mapping flake8 error IDs to Flycheck error levels. - -Each item in this list is a cons cell `(PATTERN . LEVEL)' where -PATTERN is a regular expression matched against the error ID, and -LEVEL is a Flycheck error level symbol. - -Each PATTERN is matched in the order of appearance in this list -against the error ID. If it matches the ID, the level of the -corresponding error is set to LEVEL. An error that is not -matched by any PATTERN defaults to warning level. - -The default value of this option matches errors from flake8 -itself and from the following flake8 plugins: - -- pep8-naming -- flake8-pep257 - -You may add your own mappings to this option in order to support -further flake8 plugins." - :type '(repeat (cons (regexp :tag "Error ID pattern") - (symbol :tag "Error level"))) - :package-version '(flycheck . "0.22")) - -(flycheck-def-option-var flycheck-flake8-maximum-complexity nil python-flake8 - "The maximum McCabe complexity of methods. - -If nil, do not check the complexity of methods. If set to an -integer, report any complexity greater than the value of this -variable as warning. - -If set to an integer, this variable overrules any similar setting -in the configuration file denoted by `flycheck-flake8rc'." - :type '(choice (const :tag "Do not check McCabe complexity" nil) - (integer :tag "Maximum complexity")) - :safe #'integerp) - -(flycheck-def-option-var flycheck-flake8-maximum-line-length nil python-flake8 - "The maximum length of lines. - -If set to an integer, the value of this variable denotes the -maximum length of lines, overruling any similar setting in the -configuration file denoted by `flycheck-flake8rc'. An error will -be reported for any line longer than the value of this variable. - -If set to nil, use the maximum line length from the configuration -file denoted by `flycheck-flake8rc', or the PEP 8 recommendation -of 79 characters if there is no configuration with this setting." - :type '(choice (const :tag "Default value") - (integer :tag "Maximum line length in characters")) - :safe #'integerp) - -(defun flycheck-flake8-fix-error-level (err) - "Fix the error level of ERR. - -Update the error level of ERR according to -`flycheck-flake8-error-level-alist'." - (pcase-dolist (`(,pattern . ,level) flycheck-flake8-error-level-alist) - (when (string-match-p pattern (flycheck-error-id err)) - (setf (flycheck-error-level err) level))) - err) - -(defun flycheck-flake8--find-project-root (_checker) - "Find setup.cfg in a parent directory of the current buffer." - ;; This is a workaround for `https://gitlab.com/pycqa/flake8/issues/517'; see - ;; also `https://github.com/flycheck/flycheck/issues/1722' - (locate-dominating-file (or buffer-file-name default-directory) "setup.cfg")) - -(flycheck-define-checker python-flake8 - "A Python syntax and style checker using Flake8. - -Requires Flake8 3.0 or newer. See URL -`https://flake8.readthedocs.io/'." - ;; Not calling flake8 directly makes it easier to switch between different - ;; Python versions; see https://github.com/flycheck/flycheck/issues/1055. - :command ("python3" - (eval (flycheck-python-module-args 'python-flake8 "flake8")) - "--format=default" - (config-file "--append-config" flycheck-flake8rc) - (option "--max-complexity" flycheck-flake8-maximum-complexity nil - flycheck-option-int) - (option "--max-line-length" flycheck-flake8-maximum-line-length nil - flycheck-option-int) - (eval (when buffer-file-name - (concat "--stdin-display-name=" buffer-file-name))) - "-") - :standard-input t - :working-directory flycheck-flake8--find-project-root - :error-filter (lambda (errors) - (let ((errors (flycheck-sanitize-errors errors))) - (seq-map #'flycheck-flake8-fix-error-level errors))) - :error-patterns - ((warning line-start - (file-name) ":" line ":" (optional column ":") " " - (id (one-or-more (any alpha)) (one-or-more digit)) " " - (message (one-or-more not-newline)) - line-end)) - :enabled (lambda () - (or (not (flycheck-python-needs-module-p 'python-flake8)) - (flycheck-python-find-module 'python-flake8 "flake8"))) - :verify (lambda (_) (flycheck-python-verify-module 'python-flake8 "flake8")) - :modes python-mode - :next-checkers ((warning . python-pylint) - (warning . python-mypy))) - -(flycheck-def-config-file-var flycheck-pylintrc python-pylint ".pylintrc") - -(flycheck-def-option-var flycheck-pylint-use-symbolic-id t python-pylint - "Whether to use pylint message symbols or message codes. - -A pylint message has both an opaque identifying code (such as `F0401') and a -more meaningful symbolic code (such as `import-error'). This option governs -which should be used and reported to the user." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.25")) - -(defun flycheck-parse-pylint (output checker buffer) - "Parse JSON OUTPUT of CHECKER on BUFFER as Pylint errors." - (mapcar (lambda (err) - (let-alist err - ;; Pylint can return -1 as a line or a column, hence the call to - ;; `max'. See `https://github.com/flycheck/flycheck/issues/1383'. - (flycheck-error-new-at - (and .line (max .line 1)) - (and .column (max (1+ .column) 1)) - (pcase .type - ;; See "pylint/utils.py" - ((or "fatal" "error") 'error) - ((or "info" "convention") 'info) - ((or "warning" "refactor" _) 'warning)) - ;; Drop lines showing the error in context - (and (string-match (rx (*? nonl) eol) .message) - (match-string 0 .message)) - :id (if flycheck-pylint-use-symbolic-id .symbol .message-id) - :checker checker - :buffer buffer - :filename .path))) - (car (flycheck-parse-json output)))) - -(flycheck-define-checker python-pylint - "A Python syntax and style checker using Pylint. - -This syntax checker requires Pylint 1.0 or newer. - -See URL `https://www.pylint.org/'." - ;; --reports=n disables the scoring report. - ;; Not calling pylint directly makes it easier to switch between different - ;; Python versions; see https://github.com/flycheck/flycheck/issues/1055. - :command ("python3" - (eval (flycheck-python-module-args 'python-pylint "pylint")) - "--reports=n" - "--output-format=json" - (config-file "--rcfile=" flycheck-pylintrc concat) - ;; Need `source-inplace' for relative imports (e.g. `from .foo - ;; import bar'), see https://github.com/flycheck/flycheck/issues/280 - source-inplace) - :error-parser flycheck-parse-pylint - :enabled (lambda () - (or (not (flycheck-python-needs-module-p 'python-pylint)) - (flycheck-python-find-module 'python-pylint "pylint"))) - :verify (lambda (_) (flycheck-python-verify-module 'python-pylint "pylint")) - :modes python-mode - :next-checkers ((warning . python-mypy))) - -(flycheck-define-checker python-pycompile - "A Python syntax checker using Python's builtin compiler. - -See URL `https://docs.python.org/3.4/library/py_compile.html'." - :command ("python3" "-m" "py_compile" source) - :error-patterns - ;; Python 2.7 - ((error line-start " File \"" (file-name) "\", line " line "\n" - (>= 2 (zero-or-more not-newline) "\n") - "SyntaxError: " (message) line-end) - (error line-start "Sorry: IndentationError: " - (message) "(" (file-name) ", line " line ")" - line-end) - ;; 2.6 - (error line-start "SyntaxError: ('" (message (one-or-more (not (any "'")))) - "', ('" (file-name (one-or-more (not (any "'")))) "', " - line ", " column ", " (one-or-more not-newline) line-end)) - :modes python-mode - :next-checkers ((warning . python-mypy))) - -(define-obsolete-variable-alias 'flycheck-python-mypy-ini - 'flycheck-python-mypy-config "32") - -(flycheck-def-config-file-var flycheck-python-mypy-config python-mypy - '("mypy.ini" "setup.cfg")) - -(flycheck-def-option-var flycheck-python-mypy-cache-dir nil python-mypy - "Directory used to write .mypy_cache directories." - :type '(choice - (const :tag "Write to the working directory" nil) - (const :tag "Never write .mypy_cache directories" null-device) - (string :tag "Path")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "32")) - -(flycheck-define-checker python-mypy - "Mypy syntax and type checker. Requires mypy>=0.580. - -See URL `http://mypy-lang.org/'." - :command ("mypy" - "--show-column-numbers" - (config-file "--config-file" flycheck-python-mypy-config) - (option "--cache-dir" flycheck-python-mypy-cache-dir) - source-original) - :error-patterns - ((error line-start (file-name) ":" line (optional ":" column) - ": error:" (message) line-end) - (warning line-start (file-name) ":" line (optional ":" column) - ": warning:" (message) line-end) - (info line-start (file-name) ":" line (optional ":" column) - ": note:" (message) line-end)) - :modes python-mode - ;; Ensure the file is saved, to work around - ;; https://github.com/python/mypy/issues/4746. - :predicate flycheck-buffer-saved-p) - -(flycheck-def-option-var flycheck-lintr-caching t r-lintr - "Whether to enable caching in lintr. - -By default, lintr caches all expressions in a file and re-checks -only those that have changed. Setting this option to nil -disables caching in case there are problems." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.23")) - -(flycheck-def-option-var flycheck-lintr-linters "default_linters" r-lintr - "Linters to use with lintr. - -The value of this variable is a string containing an R -expression, which selects linters for lintr." - :type 'string - :risky t - :package-version '(flycheck . "0.23")) - -(defun flycheck-r-has-lintr (R) - "Whether R has installed the `lintr' library." - (with-temp-buffer - (let ((process-environment (append '("LC_ALL=C") process-environment))) - (call-process R nil t nil - "--slave" "--restore" "--no-save" "-e" - "library('lintr')") - (goto-char (point-min)) - (not (re-search-forward "there is no package called 'lintr'" - nil 'no-error))))) - -(flycheck-define-checker r-lintr - "An R style and syntax checker using the lintr package. - -See URL `https://github.com/jimhester/lintr'." - :command ("R" "--slave" "--restore" "--no-save" "-e" - (eval (concat - "library(lintr);" - "try(lint(commandArgs(TRUE)" - ", cache=" (if flycheck-lintr-caching "TRUE" "FALSE") - ", " flycheck-lintr-linters - "))")) - "--args" source) - :error-patterns - ((info line-start (file-name) ":" line ":" column ": style: " (message) - line-end) - (warning line-start (file-name) ":" line ":" column ": warning: " (message) - line-end) - (error line-start (file-name) ":" line ":" column ": error: " (message) - line-end)) - :modes (ess-mode ess-r-mode) - :predicate - ;; Don't check ESS files which do not contain R, and make sure that lintr is - ;; actually available - (lambda () - (and (equal ess-language "S") - (flycheck-r-has-lintr (flycheck-checker-executable 'r-lintr)))) - :verify (lambda (checker) - (let ((has-lintr (flycheck-r-has-lintr - (flycheck-checker-executable checker)))) - (list - (flycheck-verification-result-new - :label "lintr library" - :message (if has-lintr "present" "missing") - :face (if has-lintr 'success '(bold error))))))) - -(defun flycheck-racket-has-expand-p (checker) - "Whether the executable of CHECKER provides the `expand' command." - (let ((raco (flycheck-find-checker-executable checker))) - (when raco - (with-temp-buffer - (call-process raco nil t nil "expand") - (goto-char (point-min)) - (not (looking-at-p (rx bol (1+ not-newline) - "Unrecognized command: expand" - eol))))))) - -(flycheck-define-checker racket - "A Racket syntax checker with `raco expand'. - -The `compiler-lib' racket package is required for this syntax -checker. - -See URL `https://racket-lang.org/'." - :command ("raco" "expand" source-inplace) - :predicate - (lambda () - (and (or (not (eq major-mode 'scheme-mode)) - ;; In `scheme-mode' we must check the current Scheme implementation - ;; being used - (and (boundp 'geiser-impl--implementation) - (eq geiser-impl--implementation 'racket))) - (flycheck-racket-has-expand-p 'racket))) - :verify - (lambda (checker) - (let ((has-expand (flycheck-racket-has-expand-p checker)) - (in-scheme-mode (eq major-mode 'scheme-mode)) - (geiser-impl (bound-and-true-p geiser-impl--implementation))) - (list - (flycheck-verification-result-new - :label "compiler-lib package" - :message (if has-expand "present" "missing") - :face (if has-expand 'success '(bold error))) - (flycheck-verification-result-new - :label "Geiser Implementation" - :message (cond - ((not in-scheme-mode) "Using Racket Mode") - ((eq geiser-impl 'racket) "Racket") - (geiser-impl (format "Other: %s" geiser-impl)) - (t "Geiser not active")) - :face (cond - ((or (not in-scheme-mode) (eq geiser-impl 'racket)) 'success) - (t '(bold error))))))) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors - (flycheck-increment-error-columns - (seq-remove - (lambda (err) - (string-suffix-p - "/share/racket/pkgs/compiler-lib/compiler/commands/expand.rkt" - (flycheck-error-filename err))) - errors)))) - :error-patterns - ((error line-start (zero-or-more space) - (file-name) ":" line ":" column ":" (message) line-end)) - :modes (racket-mode scheme-mode)) - -(flycheck-define-checker rpm-rpmlint - "A RPM SPEC file syntax checker using rpmlint. - -See URL `https://sourceforge.net/projects/rpmlint/'." - :command ("rpmlint" source) - :error-patterns - ((error line-start - (file-name) ":" (optional line ":") " E: " (message) - line-end) - (warning line-start - (file-name) ":" (optional line ":") " W: " (message) - line-end)) - :error-filter - ;; Add fake line numbers if they are missing in the lint output - (lambda (errors) - (dolist (err errors) - (unless (flycheck-error-line err) - (setf (flycheck-error-line err) 1))) - errors) - :error-explainer - (lambda (error) - (-when-let* ((error-message (flycheck-error-message error)) - (message-id (save-match-data - (string-match "\\([^ ]+\\)" error-message) - (match-string 1 error-message)))) - (with-output-to-string - (call-process "rpmlint" nil standard-output nil "-I" message-id)))) - :modes (sh-mode rpm-spec-mode) - :predicate (lambda () (or (not (eq major-mode 'sh-mode)) - ;; In `sh-mode', we need the proper shell - (eq sh-shell 'rpm)))) - -(flycheck-def-config-file-var flycheck-markdown-markdownlint-cli-config - markdown-markdownlint-cli nil - :package-version '(flycheck . "32")) - -(flycheck-define-checker markdown-markdownlint-cli - "Markdown checker using markdownlint-cli. - -See URL `https://github.com/igorshubovych/markdownlint-cli'." - :command ("markdownlint" - (config-file "--config" flycheck-markdown-markdownlint-cli-config) - source) - :error-patterns - ((error line-start - (file-name) ":" line " " (id (one-or-more (not (any space)))) - " " (message) line-end)) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors - (flycheck-remove-error-file-names "(string)" errors))) - :modes (markdown-mode gfm-mode)) - -(flycheck-def-option-var flycheck-markdown-mdl-rules nil markdown-mdl - "Rules to enable for mdl. - -The value of this variable is a list of strings each of which is -the name of a rule to enable. - -By default all rules are enabled. - -See URL `https://git.io/vhi2t'." - :type '(repeat :tag "Enabled rules" - (string :tag "rule name")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "27")) - -(flycheck-def-option-var flycheck-markdown-mdl-tags nil markdown-mdl - "Rule tags to enable for mdl. - -The value of this variable is a list of strings each of which is -the name of a rule tag. Only rules with these tags are enabled. - -By default all rules are enabled. - -See URL `https://git.io/vhi2t'." - :type '(repeat :tag "Enabled tags" - (string :tag "tag name")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "27")) - -(flycheck-def-config-file-var flycheck-markdown-mdl-style markdown-mdl nil - :package-version '(flycheck . "27")) - -(flycheck-define-checker markdown-mdl - "Markdown checker using mdl. - -See URL `https://github.com/markdownlint/markdownlint'." - :command ("mdl" - (config-file "--style" flycheck-markdown-mdl-style) - (option "--tags=" flycheck-markdown-mdl-rules concat - flycheck-option-comma-separated-list) - (option "--rules=" flycheck-markdown-mdl-rules concat - flycheck-option-comma-separated-list)) - :standard-input t - :error-patterns - ((error line-start - (file-name) ":" line ": " (id (one-or-more alnum)) " " (message) - line-end)) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors - (flycheck-remove-error-file-names "(stdin)" errors))) - :modes (markdown-mode gfm-mode)) - -(flycheck-define-checker nix - "Nix checker using nix-instantiate. - -See URL `https://nixos.org/nix/manual/#sec-nix-instantiate'." - :command ("nix-instantiate" "--parse" "-") - :standard-input t - :error-patterns - ((error line-start - "error: " (message) " at " (file-name) ":" line ":" column - line-end)) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors - (flycheck-remove-error-file-names "(string)" errors))) - :next-checkers ((warning . nix-linter)) - :modes nix-mode) - -(defun flycheck-parse-nix-linter (output checker buffer) - "Parse nix-linter warnings from JSON OUTPUT. - -CHECKER and BUFFER denote the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `https://github.com/Synthetica9/nix-linter' for more -information about nix-linter." - (mapcar (lambda (err) - (let-alist err - (flycheck-error-new-at - .pos.spanBegin.sourceLine - .pos.spanBegin.sourceColumn - 'warning - .description - :id .offense - :checker checker - :buffer buffer - :filename (buffer-file-name buffer) - :end-line .pos.spanEnd.sourceLine - :end-column .pos.spanEnd.sourceColumn))) - (flycheck-parse-json output))) - -(flycheck-define-checker nix-linter - "Nix checker using nix-linter. - -See URL `https://github.com/Synthetica9/nix-linter'." - :command ("nix-linter" "--json-stream" "-") - :standard-input t - :error-parser flycheck-parse-nix-linter - :error-explainer - (lambda (error) - (-when-let (error-code (flycheck-error-id error)) - (with-output-to-string - (call-process "nix-linter" nil standard-output nil "--help-for" - error-code)))) - :modes nix-mode) - -(defun flycheck-locate-sphinx-source-directory () - "Locate the Sphinx source directory for the current buffer. - -Return the source directory, or nil, if the current buffer is not -part of a Sphinx project." - (-when-let* ((filename (buffer-file-name)) - (dir (locate-dominating-file filename "conf.py"))) - (expand-file-name dir))) - -(flycheck-define-checker rst - "A ReStructuredText (RST) syntax checker using Docutils. - -See URL `http://docutils.sourceforge.net/'." - ;; include:: directives - :command ("rst2pseudoxml.py" "--report=2" "--halt=5" - ;; Read from standard input and throw output away - "-" null-device) - :standard-input t - :error-patterns - ((warning line-start ":" line ": (WARNING/2) " (message) line-end) - (error line-start ":" line - ": (" (or "ERROR/3" "SEVERE/4") ") " - (message) line-end)) - :modes rst-mode) - -(flycheck-def-option-var flycheck-sphinx-warn-on-missing-references t rst-sphinx - "Whether to warn about missing references in Sphinx. - -When non-nil (the default), warn about all missing references in -Sphinx via `-n'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.17")) - -(flycheck-define-checker rst-sphinx - "A ReStructuredText (RST) syntax checker using Sphinx. - -Requires Sphinx 1.2 or newer. See URL `http://sphinx-doc.org'." - :command ("sphinx-build" "-b" "pseudoxml" - "-q" "-N" ; Reduced output and no colors - (option-flag "-n" flycheck-sphinx-warn-on-missing-references) - (eval (flycheck-locate-sphinx-source-directory)) - temporary-directory ; Redirect the output to a temporary - ; directory - source-original) ; Sphinx needs the original document - :error-patterns - ((warning line-start (file-name) ":" line ": WARNING: " (message) line-end) - (error line-start - (file-name) ":" line - ": " (or "ERROR" "SEVERE") ": " - (message) line-end)) - :modes rst-mode - :predicate (lambda () (and (flycheck-buffer-saved-p) - (flycheck-locate-sphinx-source-directory)))) - -(defun flycheck-ruby--find-project-root (_checker) - "Compute an appropriate working-directory for flycheck-ruby. - -This is either a parent directory containing a Gemfile, or nil." - (and - buffer-file-name - (locate-dominating-file buffer-file-name "Gemfile"))) - -(flycheck-def-config-file-var flycheck-rubocoprc ruby-rubocop ".rubocop.yml") - -(flycheck-def-option-var flycheck-rubocop-lint-only nil - (ruby-rubocop ruby-standard) - "Whether to only report code issues in Rubocop and Standard. - -When non-nil, only report code issues, via `--lint'. Otherwise -report style issues as well." - :safe #'booleanp - :type 'boolean - :package-version '(flycheck . "0.16")) - -(defconst flycheck-ruby-rubocop-error-patterns - '((info line-start (file-name) ":" line ":" column ": C: " - (optional (id (one-or-more (not (any ":")))) ": ") (message) line-end) - (warning line-start (file-name) ":" line ":" column ": W: " - (optional (id (one-or-more (not (any ":")))) ": ") (message) - line-end) - (error line-start (file-name) ":" line ":" column ": " (or "E" "F") ": " - (optional (id (one-or-more (not (any ":")))) ": ") (message) - line-end))) - -(flycheck-def-executable-var ruby-rubocop "rubocop") -(flycheck-define-command-checker 'ruby-rubocop - "A Ruby syntax and style checker using the RuboCop tool. - -You need at least RuboCop 0.34 for this syntax checker. - -See URL `http://batsov.com/rubocop/'." - ;; ruby-standard is defined based on this checker - :command '("rubocop" - "--display-cop-names" - "--force-exclusion" - "--format" "emacs" - ;; Explicitly disable caching to prevent Rubocop 0.35.1 and earlier - ;; from caching standard input. Later versions of Rubocop - ;; automatically disable caching with --stdin, see - ;; https://github.com/flycheck/flycheck/issues/844 and - ;; https://github.com/bbatsov/rubocop/issues/2576 - "--cache" "false" - (config-file "--config" flycheck-rubocoprc) - (option-flag "--lint" flycheck-rubocop-lint-only) - ;; Rubocop takes the original file name as argument when reading - ;; from standard input - "--stdin" source-original) - :standard-input t - :working-directory #'flycheck-ruby--find-project-root - :error-patterns flycheck-ruby-rubocop-error-patterns - :modes '(enh-ruby-mode ruby-mode) - :next-checkers '((warning . ruby-reek) - (warning . ruby-rubylint))) - -(flycheck-def-config-file-var flycheck-ruby-standardrc ruby-standard - ".standard.yml") - -(flycheck-def-executable-var ruby-standard "standardrb") -(flycheck-define-command-checker 'ruby-standard - "A Ruby syntax and style checker using the StandardRB gem. - -See URL `https://github.com/testdouble/standard' for more information." - ;; This checker is derived from ruby-rubocop; see above - :command '("standardrb" - "--display-cop-names" - "--force-exclusion" - "--format" "emacs" - "--cache" "false" - (config-file "--config" flycheck-ruby-standardrc) - (option-flag "--lint" flycheck-rubocop-lint-only) - "--stdin" source-original) - :standard-input t - :working-directory #'flycheck-ruby--find-project-root - :error-patterns flycheck-ruby-rubocop-error-patterns - :modes '(enh-ruby-mode ruby-mode) - :next-checkers '((warning . ruby-reek) - (warning . ruby-rubylint))) - -;; Default to `nil' to let Reek find its configuration file by itself -(flycheck-def-config-file-var flycheck-reekrc ruby-reek nil - :safe #'string-or-null-p - :package-version '(flycheck . "30")) - -(flycheck-define-checker ruby-reek - "A Ruby smell checker using reek. - -See URL `https://github.com/troessner/reek'." - :command ("reek" "--format" "json" - (config-file "--config" flycheck-reekrc) - source) - :error-parser flycheck-parse-reek - :modes (enh-ruby-mode ruby-mode) - :next-checkers ((warning . ruby-rubylint))) - -;; Default to `nil' to let Rubylint find its configuration file by itself, and -;; to maintain backwards compatibility with older Rubylint and Flycheck releases -(flycheck-def-config-file-var flycheck-rubylintrc ruby-rubylint nil) - -(flycheck-define-checker ruby-rubylint - "A Ruby syntax and code analysis checker using ruby-lint. - -Requires ruby-lint 2.0.2 or newer. See URL -`https://github.com/YorickPeterse/ruby-lint'." - :command ("ruby-lint" "--presenter=syntastic" - (config-file "--config" flycheck-rubylintrc) - source) - ;; Ruby Lint can't read from standard input - :error-patterns - ((info line-start - (file-name) ":I:" line ":" column ": " (message) line-end) - (warning line-start - (file-name) ":W:" line ":" column ": " (message) line-end) - (error line-start - (file-name) ":E:" line ":" column ": " (message) line-end)) - :modes (enh-ruby-mode ruby-mode)) - -(flycheck-define-checker ruby - "A Ruby syntax checker using the standard Ruby interpreter. - -Please note that the output of different Ruby versions and -implementations varies wildly. This syntax checker supports -current versions of MRI and JRuby, but may break when used with -other implementations or future versions of these -implementations. - -Please consider using `ruby-rubocop' or `ruby-reek' instead. - -See URL `https://www.ruby-lang.org/'." - :command ("ruby" "-w" "-c") - :standard-input t - :error-patterns - ;; These patterns support output from JRuby, too, to deal with RVM or Rbenv - ((error line-start "SyntaxError in -:" line ": " (message) line-end) - (warning line-start "-:" line ":" (optional column ":") - " warning: " (message) line-end) - (error line-start "-:" line ": " (message) line-end)) - :modes (enh-ruby-mode ruby-mode) - :next-checkers ((warning . ruby-rubylint))) - -(flycheck-define-checker ruby-jruby - "A Ruby syntax checker using the JRuby interpreter. - -This syntax checker is very primitive, and may break on future -versions of JRuby. - -Please consider using `ruby-rubocop' or `ruby-rubylint' instead. - -See URL `http://jruby.org/'." - :command ("jruby" "-w" "-c") - :standard-input t - :error-patterns - ((error line-start "SyntaxError in -:" line ": " (message) line-end) - (warning line-start "-:" line ": warning: " (message) line-end) - (error line-start "-:" line ": " (message) line-end)) - :modes (enh-ruby-mode ruby-mode) - :next-checkers ((warning . ruby-rubylint))) - -(flycheck-def-args-var flycheck-cargo-check-args (rust-cargo) - :package-version '(flycheck . "32")) - -(flycheck-def-args-var flycheck-rust-args (rust) - :package-version '(flycheck . "0.24")) - -(flycheck-def-option-var flycheck-rust-check-tests t (rust-cargo rust) - "Whether to check test code in Rust. - -For the `rust' checker: When non-nil, `rustc' is passed the -`--test' flag, which will check any code marked with the -`#[cfg(test)]' attribute and any functions marked with -`#[test]'. Otherwise, `rustc' is not passed `--test' and test -code will not be checked. Skipping `--test' is necessary when -using `#![no_std]', because compiling the test runner requires -`std'. - -For the `rust-cargo' checker: When non-nil, calls `cargo test ---no-run' instead of `cargo check'." - :type 'boolean - :safe #'booleanp - :package-version '("flycheck" . "0.19")) - -(flycheck-def-option-var flycheck-rust-crate-root nil rust - "A path to the crate root for the current buffer. - -The value of this variable is either a string with the path to -the crate root for the current buffer, or nil if the current buffer -is a crate. A relative path is relative to the current buffer. - -If this variable is non nil the current buffer will only be checked -if it is not modified, i.e. after it has been saved." - :type '(choice (const :tag "Unspecified" nil) - (file :tag "Root")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "0.20")) -(make-variable-buffer-local 'flycheck-rust-crate-root) - -(flycheck-def-option-var flycheck-rust-crate-type "lib" (rust-cargo rust) - "The type of the Rust Crate to check. - -For `rust-cargo', the value should be a string denoting the -target type passed to Cargo. See -`flycheck-rust-valid-crate-type-p' for the list of allowed -values. - -For `rust', the value should be a string denoting the crate type -for the `--crate-type' flag of rustc." - :type '(choice (const :tag "nil (rust/rust-cargo)" nil) - (const :tag "lib (rust/rust-cargo)" "lib") - (const :tag "bin (rust/rust-cargo)" "bin") - (const :tag "example (rust-cargo)" "example") - (const :tag "test (rust-cargo)" "test") - (const :tag "bench (rust-cargo)" "bench") - (const :tag "rlib (rust)" "rlib") - (const :tag "dylib (rust)" "dylib") - (const :tag "cdylib (rust)" "cdylib") - (const :tag "staticlib (rust)" "staticlib") - (const :tag "metadata (rust)" "metadata")) - :safe #'stringp - :package-version '(flycheck . "0.20")) -(make-variable-buffer-local 'flycheck-rust-crate-type) - -(flycheck-def-option-var flycheck-rust-binary-name nil rust-cargo - "The name of the binary to pass to `cargo check --CRATE-TYPE'. - -The value of this variable is a string denoting the name of the -target to check: usually the name of the crate, or the name of -one of the files under `src/bin', `tests', `examples' or -`benches'. - -This always requires a non-nil value, unless -`flycheck-rust-crate-type' is `lib' or nil, in which case it is -ignored." - :type '(choice (const :tag "Unspecified" nil) - (string :tag "Binary name")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "28")) -(make-variable-buffer-local 'flycheck-rust-binary-name) - -(flycheck-def-option-var flycheck-rust-features nil rust-cargo - "List of features to activate during build or check. - -The value of this variable is a list of strings denoting features -that will be activated to build the target to check. Features will -be passed to `cargo check --features=FEATURES'." - :type '(repeat :tag "Features to activate" - (string :tag "Feature")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "32")) -(make-variable-buffer-local 'flycheck-rust-features) - -(flycheck-def-option-var flycheck-rust-library-path nil rust - "A list of library directories for Rust. - -The value of this variable is a list of strings, where each -string is a directory to add to the library path of Rust. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Library directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.18")) - -(defun flycheck-rust-error-explainer (error) - "Return an explanation text for the given `flycheck-error' ERROR." - (-when-let (error-code (flycheck-error-id error)) - (with-output-to-string - (call-process "rustc" nil standard-output nil "--explain" error-code)))) - -(defun flycheck-rust-error-filter (errors) - "Filter ERRORS from rustc output that have no explanatory value." - (seq-remove - (lambda (err) - (or - ;; Macro errors emit a diagnostic in a phony file, - ;; e.g. "". - (-when-let (filename (flycheck-error-filename err)) - (string-match-p (rx "macros>" line-end) filename)) - ;; Redundant message giving the number of failed errors - (-when-let (msg (flycheck-error-message err)) - (string-match-p - (rx - (or (: "aborting due to " (optional (one-or-more num) " ") - "previous error") - (: "For more information about this error, try `rustc --explain " - (one-or-more alnum) "`."))) - msg)))) - errors)) - -(defun flycheck-rust-manifest-directory () - "Return the nearest directory holding the Cargo manifest. - -Return the nearest directory containing the `Cargo.toml' manifest -file, starting from the current buffer and using -`locate-dominating-file'. Return nil if there is no such file, -or if the current buffer has no file name." - (and buffer-file-name - (locate-dominating-file buffer-file-name "Cargo.toml"))) - -(defun flycheck-rust-cargo-metadata () - "Run 'cargo metadata' and return the result as parsed JSON object." - (car (flycheck-parse-json - (with-output-to-string - (call-process "cargo" nil standard-output nil - "metadata" "--no-deps" "--format-version" "1"))))) - -(defun flycheck-rust-cargo-workspace-root () - "Return the path to the workspace root of a Rust Cargo project. - -Return nil if the workspace root does not exist (for Rust -versions inferior to 1.25)." - (let-alist (flycheck-rust-cargo-metadata) - .workspace_root)) - -(defun flycheck-rust-cargo-has-command-p (command) - "Whether Cargo has COMMAND in its list of commands. - -Execute `cargo --list' to find out whether COMMAND is present." - (let ((cargo (funcall flycheck-executable-find "cargo"))) - (member command (mapcar #'string-trim-left - (ignore-errors (process-lines cargo "--list")))))) - -(defun flycheck-rust-valid-crate-type-p (crate-type) - "Whether CRATE-TYPE is a valid target type for Cargo. - -A valid Cargo target type is one of `lib', `bin', `example', -`test' or `bench'." - (member crate-type '(nil "lib" "bin" "example" "test" "bench"))) - -(flycheck-define-checker rust-cargo - "A Rust syntax checker using Cargo. - -This syntax checker requires Rust 1.17 or newer. See URL -`https://www.rust-lang.org'." - :command ("cargo" - (eval (if flycheck-rust-check-tests - "test" - "check")) - (eval (when flycheck-rust-check-tests - "--no-run")) - (eval (when flycheck-rust-crate-type - (concat "--" flycheck-rust-crate-type))) - ;; All crate targets except "lib" need a binary name - (eval (when (and flycheck-rust-crate-type - (not (string= flycheck-rust-crate-type "lib"))) - flycheck-rust-binary-name)) - (option "--features=" flycheck-rust-features concat - flycheck-option-comma-separated-list) - (eval flycheck-cargo-check-args) - "--message-format=json") - :error-parser flycheck-parse-cargo-rustc - :error-filter (lambda (errors) - ;; In Rust 1.25+, filenames are relative to the workspace - ;; root. - (let ((root (flycheck-rust-cargo-workspace-root))) - (seq-do (lambda (err) - ;; Some errors are crate level and do not have a - ;; filename - (when (flycheck-error-filename err) - (setf (flycheck-error-filename err) - (expand-file-name - (flycheck-error-filename err) root)))) - (flycheck-rust-error-filter errors)))) - :error-explainer flycheck-rust-error-explainer - :modes rust-mode - :predicate flycheck-buffer-saved-p - :enabled flycheck-rust-manifest-directory - :working-directory (lambda (_) (flycheck-rust-manifest-directory)) - :verify - (lambda (_) - (and buffer-file-name - (let* ((has-toml (flycheck-rust-manifest-directory)) - (valid-crate-type (flycheck-rust-valid-crate-type-p - flycheck-rust-crate-type)) - (need-binary-name - (and flycheck-rust-crate-type - (not (string= flycheck-rust-crate-type "lib"))))) - (list - (flycheck-verification-result-new - :label "Cargo.toml" - :message (if has-toml "Found" "Missing") - :face (if has-toml 'success '(bold warning))) - (flycheck-verification-result-new - :label "Crate type" - :message (if valid-crate-type - (format "%s" flycheck-rust-crate-type) - (format "%s (invalid, should be one of 'lib', 'bin', \ -'test', 'example' or 'bench')" - flycheck-rust-crate-type)) - :face (if valid-crate-type 'success '(bold error))) - (flycheck-verification-result-new - :label "Binary name" - :message (cond - ((not need-binary-name) "Not required") - ((not flycheck-rust-binary-name) "Required") - (t (format "%s" flycheck-rust-binary-name))) - :face (cond - ((not need-binary-name) 'success) - ((not flycheck-rust-binary-name) '(bold error)) - (t 'success)))))))) - -(flycheck-define-checker rust - "A Rust syntax checker using Rust compiler. - -This syntax checker needs Rust 1.18 or newer. See URL -`https://www.rust-lang.org'." - :command ("rustc" - (option "--crate-type" flycheck-rust-crate-type) - "--emit=mir" "-o" "/dev/null" ; avoid creating binaries - "--error-format=json" - (option-flag "--test" flycheck-rust-check-tests) - (option-list "-L" flycheck-rust-library-path concat) - (eval flycheck-rust-args) - (eval (or flycheck-rust-crate-root - (flycheck-substitute-argument 'source-original 'rust)))) - :error-parser flycheck-parse-rustc - :error-filter flycheck-rust-error-filter - :error-explainer flycheck-rust-error-explainer - :modes rust-mode - :predicate flycheck-buffer-saved-p) - -(flycheck-define-checker rust-clippy - "A Rust syntax checker using clippy. - -See URL `https://github.com/rust-lang-nursery/rust-clippy'." - :command ("cargo" "clippy" "--message-format=json") - :error-parser flycheck-parse-cargo-rustc - :error-filter flycheck-rust-error-filter - :error-explainer flycheck-rust-error-explainer - :modes rust-mode - :predicate flycheck-buffer-saved-p - :enabled (lambda () - (and (flycheck-rust-cargo-has-command-p "clippy") - (flycheck-rust-manifest-directory))) - :working-directory (lambda (_) (flycheck-rust-manifest-directory)) - :verify - (lambda (_) - (and buffer-file-name - (let ((has-toml (flycheck-rust-manifest-directory)) - (has-clippy (flycheck-rust-cargo-has-command-p "clippy"))) - (list - (flycheck-verification-result-new - :label "Clippy" - :message (if has-clippy "Found" - "Cannot find the `cargo clippy' command") - :face (if has-clippy 'success '(bold warning))) - (flycheck-verification-result-new - :label "Cargo.toml" - :message (if has-toml "Found" "Missing") - :face (if has-toml 'success '(bold warning)))))))) - -(defvar flycheck-sass-scss-cache-directory nil - "The cache directory for `sass' and `scss'.") - -(defun flycheck-sass-scss-cache-location () - "Get the cache location for `sass' and `scss'. - -If no cache directory exists yet, create one and return it. -Otherwise return the previously used cache directory." - (setq flycheck-sass-scss-cache-directory - (or flycheck-sass-scss-cache-directory - (make-temp-file "flycheck-sass-scss-cache" 'directory)))) - -(flycheck-def-option-var flycheck-sass-compass nil sass - "Whether to enable the Compass CSS framework. - -When non-nil, enable the Compass CSS framework, via `--compass'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.16")) - -(flycheck-define-checker sass - "A Sass syntax checker using the Sass compiler. - -See URL `http://sass-lang.com'." - :command ("sass" - "--cache-location" (eval (flycheck-sass-scss-cache-location)) - (option-flag "--compass" flycheck-sass-compass) - "--check" "--stdin") - :standard-input t - :error-patterns - ((error line-start - (or "Syntax error: " "Error: ") - (message (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more not-newline))) - (optional "\r") "\n" (one-or-more " ") "on line " line - " of standard input" - line-end) - (warning line-start - "WARNING: " - (message (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more not-newline))) - (optional "\r") "\n" (one-or-more " ") "on line " line - " of " (one-or-more not-newline) - line-end)) - :modes sass-mode) - -(flycheck-def-config-file-var flycheck-sass-lintrc sass/scss-sass-lint - ".sass-lint.yml" - :package-version '(flycheck . "30")) - -(flycheck-define-checker sass/scss-sass-lint - "A SASS/SCSS syntax checker using sass-Lint. - -See URL `https://github.com/sasstools/sass-lint'." - :command ("sass-lint" - "--verbose" - "--no-exit" - "--format" "Checkstyle" - (config-file "--config" flycheck-sass-lintrc) - source) - :error-parser flycheck-parse-checkstyle - :modes (sass-mode scss-mode)) - -(flycheck-define-checker scala - "A Scala syntax checker using the Scala compiler. - -See URL `https://www.scala-lang.org/'." - :command ("scalac" "-Ystop-after:parser" source) - :error-patterns - ((error line-start (file-name) ":" line ": error: " (message) line-end)) - :modes scala-mode - :next-checkers ((warning . scala-scalastyle))) - -(flycheck-def-config-file-var flycheck-scalastylerc scala-scalastyle nil - :package-version '(flycheck . "0.20")) - -(flycheck-define-checker scala-scalastyle - "A Scala style checker using scalastyle. - -Note that this syntax checker is not used if -`flycheck-scalastylerc' is nil or refers to a non-existing file. - -See URL `http://www.scalastyle.org'." - :command ("scalastyle" - (config-file "-c" flycheck-scalastylerc) - source) - :error-patterns - ((error line-start "error file=" (file-name) " message=" - (message) " line=" line (optional " column=" column) line-end) - (warning line-start "warning file=" (file-name) " message=" - (message) " line=" line (optional " column=" column) line-end)) - :error-filter (lambda (errors) - (flycheck-sanitize-errors - (flycheck-increment-error-columns errors))) - :modes scala-mode - :predicate - ;; Inhibit this syntax checker if the JAR or the configuration are unset or - ;; missing - (lambda () (and flycheck-scalastylerc - (flycheck-locate-config-file flycheck-scalastylerc - 'scala-scalastyle))) - :verify (lambda (checker) - (let ((config-file (and flycheck-scalastylerc - (flycheck-locate-config-file - flycheck-scalastylerc checker)))) - (list - (flycheck-verification-result-new - :label "Configuration file" - :message (cond - ((not flycheck-scalastylerc) - "`flycheck-scalastyletrc' not set") - ((not config-file) - (format "file %s not found" flycheck-scalastylerc)) - (t (format "found at %s" config-file))) - :face (cond - ((not flycheck-scalastylerc) '(bold warning)) - ((not config-file) '(bold error)) - (t 'success))))))) - -(flycheck-def-args-var flycheck-scheme-chicken-args scheme-chicken - :package-version '(flycheck . "32")) - -(flycheck-define-checker scheme-chicken - "A CHICKEN Scheme syntax checker using the CHICKEN compiler `csc'. - -See URL `http://call-cc.org/'." - :command ("csc" "-analyze-only" "-local" - (eval flycheck-scheme-chicken-args) - source) - :error-patterns - ((info line-start - "Note: " (zero-or-more not-newline) ":\n" - (one-or-more (any space)) "(" (file-name) ":" line ") " (message) - line-end) - (warning line-start - "Warning: " (zero-or-more not-newline) ",\n" - (one-or-more (any space)) (zero-or-more not-newline) ":\n" - (one-or-more (any space)) "(" (file-name) ":" line ") " (message) - line-end) - (warning line-start - "Warning: " (zero-or-more not-newline) ":\n" - (one-or-more (any space)) "(" (file-name) ":" line ") " (message) - line-end) - (error line-start "Error: (line " line ") " (message) line-end) - (error line-start "Syntax error: (" (file-name) ":" line ")" - (zero-or-more not-newline) " - " - (message (one-or-more not-newline) - (zero-or-more "\n" - (zero-or-more space) - (zero-or-more not-newline)) - (one-or-more space) "<--") - line-end) - ;; A of version 4.12.0, the chicken compiler doesn't provide a - ;; line number for this error. - (error line-start "Syntax error: " - (message (one-or-more not-newline) - (zero-or-more "\n" - (zero-or-more space) - (zero-or-more not-newline)) - (one-or-more space) "<--") - line-end) - (error line-start - "Error: " (zero-or-more not-newline) ":\n" - (one-or-more (any space)) "(" (file-name) ":" line ") " (message) - line-end) - ;; A of version 4.12.0, the chicken compiler doesn't provide a - ;; line number for this error. - (error line-start "Error: " - (message (one-or-more not-newline) - (zero-or-more "\n" - (zero-or-more space) - (zero-or-more not-newline)) - (one-or-more space) "<--"))) - :error-filter flycheck-fill-empty-line-numbers - :predicate - (lambda () - ;; In `scheme-mode' we must check the current Scheme implementation - ;; being used - (and (boundp 'geiser-impl--implementation) - (eq geiser-impl--implementation 'chicken))) - :verify - (lambda (_checker) - (let ((geiser-impl (bound-and-true-p geiser-impl--implementation))) - (list - (flycheck-verification-result-new - :label "Geiser Implementation" - :message (cond - ((eq geiser-impl 'chicken) "Chicken Scheme") - (geiser-impl (format "Other: %s" geiser-impl)) - (t "Geiser not active")) - :face (cond - ((eq geiser-impl 'chicken) 'success) - (t '(bold error))))))) - :modes scheme-mode) - -(defconst flycheck-scss-lint-checkstyle-re - (rx "cannot load such file" (1+ not-newline) "scss_lint_reporter_checkstyle") - "Regular expression to parse missing checkstyle error.") - -(defun flycheck-parse-scss-lint (output checker buffer) - "Parse SCSS-Lint OUTPUT from CHECKER and BUFFER. - -Like `flycheck-parse-checkstyle', but catches errors about -missing checkstyle reporter from SCSS-Lint." - (if (string-match-p flycheck-scss-lint-checkstyle-re output) - (list (flycheck-error-new-at - 1 nil 'error "Checkstyle reporter for SCSS-Lint missing. -Please run gem install scss_lint_reporter_checkstyle" - :checker checker - :buffer buffer - :filename (buffer-file-name buffer))) - (flycheck-parse-checkstyle output checker buffer))) - -(flycheck-def-config-file-var flycheck-scss-lintrc scss-lint ".scss-lint.yml" - :package-version '(flycheck . "0.23")) - -(flycheck-define-checker scss-lint - "A SCSS syntax checker using SCSS-Lint. - -Needs SCSS-Lint 0.43.2 or newer. - -See URL `https://github.com/brigade/scss-lint'." - :command ("scss-lint" - "--require=scss_lint_reporter_checkstyle" - "--format=Checkstyle" - (config-file "--config" flycheck-scss-lintrc) - "--stdin-file-path" source-original "-") - :standard-input t - ;; We cannot directly parse Checkstyle XML, since for some mysterious reason - ;; SCSS-Lint doesn't have a built-in Checkstyle reporter, and instead ships it - ;; as an addon which might not be installed. We use a custom error parser to - ;; check whether the addon is missing and turn that into a special kind of - ;; Flycheck error. - :error-parser flycheck-parse-scss-lint - :modes scss-mode - :verify - (lambda (checker) - (let* ((executable (flycheck-find-checker-executable checker)) - (reporter-missing - (and executable - (with-temp-buffer - (call-process executable nil t nil - "--require=scss_lint_reporter_checkstyle") - (goto-char (point-min)) - (re-search-forward - flycheck-scss-lint-checkstyle-re - nil 'no-error))))) - (when executable - (list - (flycheck-verification-result-new - :label "checkstyle reporter" - :message (if reporter-missing - "scss_lint_reporter_checkstyle missing" - "present") - :face (if reporter-missing - '(bold error) - 'success))))))) - -(flycheck-define-checker scss-stylelint - "A SCSS syntax and style checker using stylelint. - -See URL `http://stylelint.io/'." - :command ("stylelint" - (eval flycheck-stylelint-args) - "--syntax" "scss" - (option-flag "--quiet" flycheck-stylelint-quiet) - (config-file "--config" flycheck-stylelintrc)) - :standard-input t - :error-parser flycheck-parse-stylelint - :predicate flycheck-buffer-nonempty-p - :modes (scss-mode)) - -(flycheck-def-option-var flycheck-scss-compass nil scss - "Whether to enable the Compass CSS framework. - -When non-nil, enable the Compass CSS framework, via `--compass'." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "0.16")) - -(flycheck-define-checker scss - "A SCSS syntax checker using the SCSS compiler. - -See URL `http://sass-lang.com'." - :command ("scss" - "--cache-location" (eval (flycheck-sass-scss-cache-location)) - (option-flag "--compass" flycheck-scss-compass) - "--check" "--stdin") - :standard-input t - :error-patterns - ((error line-start - (or "Syntax error: " "Error: ") - (message (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more not-newline))) - (optional "\r") "\n" (one-or-more " ") "on line " line - " of standard input" - line-end) - (warning line-start - "WARNING: " - (message (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more not-newline))) - (optional "\r") "\n" (one-or-more " ") "on line " line - " of an unknown file" - line-end)) - :modes scss-mode) - -(flycheck-def-args-var flycheck-sh-bash-args (sh-bash) - :package-version '(flycheck . "32")) - -(flycheck-define-checker sh-bash - "A Bash syntax checker using the Bash shell. - -See URL `http://www.gnu.org/software/bash/'." - :command ("bash" "--norc" "-n" - (eval flycheck-sh-bash-args) - "--") - :standard-input t - :error-patterns - ((error line-start - ;; The name/path of the bash executable - (one-or-more (not (any ":"))) ":" - ;; A label "line", possibly localized - (one-or-more (not (any digit))) - line (zero-or-more " ") ":" (zero-or-more " ") - (message) line-end)) - :modes sh-mode - :predicate (lambda () (eq sh-shell 'bash)) - :next-checkers ((warning . sh-shellcheck))) - -(flycheck-define-checker sh-posix-dash - "A POSIX Shell syntax checker using the Dash shell. - -See URL `http://gondor.apana.org.au/~herbert/dash/'." - :command ("dash" "-n") - :standard-input t - :error-patterns - ((error line-start (one-or-more (not (any ":"))) ": " line ": " (message))) - :modes sh-mode - :predicate (lambda () (eq sh-shell 'sh)) - :next-checkers ((warning . sh-shellcheck))) - -(flycheck-define-checker sh-posix-bash - "A POSIX Shell syntax checker using the Bash shell. - -See URL `http://www.gnu.org/software/bash/'." - :command ("bash" "--posix" "--norc" "-n" "--") - :standard-input t - :error-patterns - ((error line-start - ;; The name/path of the bash executable - (one-or-more (not (any ":"))) ":" - ;; A label "line", possibly localized - (one-or-more (not (any digit))) - line (zero-or-more " ") ":" (zero-or-more " ") - (message) line-end)) - :modes sh-mode - :predicate (lambda () (eq sh-shell 'sh)) - :next-checkers ((warning . sh-shellcheck))) - -(flycheck-define-checker sh-zsh - "A Zsh syntax checker using the Zsh shell. - -See URL `http://www.zsh.org/'." - :command ("zsh" "--no-exec" "--no-globalrcs" "--no-rcs" source) - :error-patterns - ((error line-start (file-name) ":" line ": " (message) line-end)) - :modes sh-mode - :predicate (lambda () (eq sh-shell 'zsh)) - :next-checkers ((warning . sh-shellcheck))) - -(defconst flycheck-shellcheck-supported-shells '(bash ksh88 sh) - "Shells supported by ShellCheck.") - -(flycheck-def-option-var flycheck-shellcheck-excluded-warnings nil sh-shellcheck - "A list of excluded warnings for ShellCheck. - -The value of this variable is a list of strings, where each -string is a warning code to be excluded from ShellCheck reports. -By default, no warnings are excluded." - :type '(repeat :tag "Excluded warnings" - (string :tag "Warning code")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.21")) - -(flycheck-def-option-var flycheck-shellcheck-follow-sources t sh-shellcheck - "Whether to follow external sourced files in scripts. - -Shellcheck will follow and parse sourced files so long as a -pre-runtime resolvable path to the file is present. This can -either be part of the source command itself: - source /full/path/to/file.txt -or added as a shellcheck directive before the source command: - # shellcheck source=/full/path/to/file.txt." - :type 'boolean - :safe #'booleanp - :package-version '(flycheck . "31")) - -(flycheck-define-checker sh-shellcheck - "A shell script syntax and style checker using Shellcheck. - -See URL `https://github.com/koalaman/shellcheck/'." - :command ("shellcheck" - "--format" "checkstyle" - "--shell" (eval (symbol-name sh-shell)) - (option-flag "--external-sources" - flycheck-shellcheck-follow-sources) - (option "--exclude" flycheck-shellcheck-excluded-warnings list - flycheck-option-comma-separated-list) - "-") - :standard-input t - :error-parser flycheck-parse-checkstyle - :error-filter - (lambda (errors) - (flycheck-remove-error-file-names - "-" (flycheck-dequalify-error-ids errors))) - :modes sh-mode - :predicate (lambda () (memq sh-shell flycheck-shellcheck-supported-shells)) - :verify (lambda (_) - (let ((supports-shell (memq sh-shell - flycheck-shellcheck-supported-shells))) - (list - (flycheck-verification-result-new - :label (format "Shell %s supported" sh-shell) - :message (if supports-shell "yes" "no") - :face (if supports-shell 'success '(bold warning))))))) - -(flycheck-define-checker slim - "A Slim syntax checker using the Slim compiler. - -See URL `http://slim-lang.com'." - :command ("slimrb" "--compile") - :standard-input t - :error-patterns - ((error line-start - "Slim::Parser::SyntaxError:" (message) (optional "\r") "\n " - "STDIN, Line " line (optional ", Column " column) - line-end)) - :modes slim-mode - :next-checkers ((warning . slim-lint))) - -(flycheck-define-checker slim-lint - "A Slim linter. - -See URL `https://github.com/sds/slim-lint'." - :command ("slim-lint" "--reporter=checkstyle" source) - :error-parser flycheck-parse-checkstyle - :modes slim-mode) - -(flycheck-define-checker sql-sqlint - "A SQL syntax checker using the sqlint tool. - -See URL `https://github.com/purcell/sqlint'." - :command ("sqlint") - :standard-input t - :error-patterns - ((warning line-start "stdin:" line ":" column ":WARNING " - (message (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more not-newline))) - line-end) - (error line-start "stdin:" line ":" column ":ERROR " - (message (one-or-more not-newline) - (zero-or-more "\n" - (one-or-more " ") - (one-or-more not-newline))) - line-end)) - :modes (sql-mode)) - -(flycheck-define-checker systemd-analyze - "A systemd unit checker using systemd-analyze(1). - -See URL -`https://www.freedesktop.org/software/systemd/man/systemd-analyze.html'." - :command ("systemd-analyze" "verify" source) - :error-parser flycheck-parse-with-patterns-without-color - :error-patterns - ((error line-start (file-name) ":" (optional line ":") (message) line-end) - (error line-start "[" (file-name) ":" line "]" (message) line-end)) - :error-filter flycheck-fill-empty-line-numbers - :modes (systemd-mode)) - -(flycheck-def-config-file-var flycheck-chktexrc tex-chktex ".chktexrc") - -(flycheck-define-checker tcl-nagelfar - "An extensible tcl syntax checker - -See URL `http://nagelfar.sourceforge.net/'." - :command ("nagelfar" "-H" source) - :error-patterns - ;; foo.tcl: 29: E Wrong number of arguments (4) to "set" - ;; foo.tcl: 29: W Expr without braces - ((info line-start (file-name) ": " line ": N " (message) line-end) - (warning line-start (file-name) ": " line ": W " (message) line-end) - (error line-start (file-name) ": " line ": E " (message) line-end)) - :modes tcl-mode) - -(flycheck-define-checker terraform - "A Terraform syntax checker with `terraform fmt'. - -See URL `https://www.terraform.io/docs/commands/fmt.html'." - :command ("terraform" "fmt" "-no-color" "-") - :standard-input t - :error-patterns - ((error line-start "Error: " (one-or-more not-newline) - "\n\n on line " line ":\n (source code not available)\n\n" - (message (one-or-more (and (one-or-more (not (any ?\n))) ?\n))) - line-end)) - :next-checkers ((warning . terraform-tflint)) - :modes terraform-mode) - -(flycheck-def-option-var flycheck-tflint-variable-files nil terraform-tflint - "A list of files to resolve terraform variables. - -The value of this variable is a list of strings, where each -string is a file to add to the terraform variables files. -Relative files are relative to the file being checked." - :type '(repeat (directory :tag "Variable file")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "32")) - -(defun flycheck-parse-tflint-linter (output checker buffer) - "Parse tflint warnings from JSON OUTPUT. - -CHECKER and BUFFER denote the CHECKER that returned OUTPUT and -the BUFFER that was checked respectively. - -See URL `https://github.com/wata727/tflint' for more -information about tflint." - (mapcar (lambda (err) - (let-alist err - (flycheck-error-new-at - .line - nil - (pcase .type - ("ERROR" 'error) - ("WARNING" 'warning) - (_ 'error)) - .message - :id .detector - :checker checker - :buffer buffer - :filename (buffer-file-name buffer)))) - (car (flycheck-parse-json output)))) - -(flycheck-define-checker terraform-tflint - "A Terraform checker using tflint. - -See URL `https://github.com/wata727/tflint'." - :command ("tflint" "--format=json" - (option-list "--var-file=" flycheck-tflint-variable-files concat) - source-original) - :error-parser flycheck-parse-tflint-linter - :predicate flycheck-buffer-saved-p - :modes terraform-mode) - -(flycheck-define-checker tex-chktex - "A TeX and LaTeX syntax and style checker using chktex. - -See URL `http://www.nongnu.org/chktex/'." - :command ("chktex" - (config-file "--localrc" flycheck-chktexrc) - ;; Compact error messages, and no version information, and execute - ;; \input statements - "--verbosity=0" "--quiet" "--inputfiles") - :standard-input t - :error-patterns - ((warning line-start "stdin:" line ":" column ":" - (id (one-or-more digit)) ":" (message) line-end)) - :error-filter - (lambda (errors) - (flycheck-sanitize-errors (flycheck-increment-error-columns errors))) - :modes (latex-mode plain-tex-mode)) - -(flycheck-define-checker tex-lacheck - "A LaTeX syntax and style checker using lacheck. - -See URL `http://www.ctan.org/pkg/lacheck'." - :command ("lacheck" source-inplace) - :error-patterns - ((warning line-start - "\"" (file-name) "\", line " line ": " (message) - line-end)) - :modes latex-mode) - -(flycheck-define-checker texinfo - "A Texinfo syntax checker using makeinfo. - -See URL `http://www.gnu.org/software/texinfo/'." - :command ("makeinfo" "-o" null-device "-") - :standard-input t - :error-patterns - ((warning line-start - "-:" line (optional ":" column) ": " "warning: " (message) - line-end) - (error line-start - "-:" line (optional ":" column) ": " (message) - line-end)) - :modes texinfo-mode) - -(flycheck-def-config-file-var flycheck-textlint-config - textlint "textlintrc.json") - -;; This needs to be set because textlint plugins are installed separately, -;; and there is no way to check their installation status -- textlint simply -;; prints a backtrace. -(flycheck-def-option-var flycheck-textlint-plugin-alist - '((markdown-mode . "@textlint/markdown") - (gfm-mode . "@textlint/markdown") - (t . "@textlint/text")) - textlint - "An alist mapping major modes to textlint plugins. - -Each item is a cons cell `(MAJOR-MODE . PLUGIN)', where MAJOR-MODE is a mode -`flycheck-textlint' supports and PLUGIN is a textlint plugin. As a catch-all, -when MAJOR-MODE is t, that PLUGIN will be used for any supported mode that -isn't specified. - -See URL `https://npms.io/search?q=textlint-plugin' for all textlint plugins -published on NPM." - :type '(repeat (choice (cons symbol string) - (cons (const t) string)))) - -(defun flycheck--textlint-get-plugin () - "Return the textlint plugin for the current mode." - (cdr (-first - (lambda (arg) - (pcase-let ((`(,mode . _) arg)) - (or (and (booleanp mode) mode) ; mode is t - (derived-mode-p mode)))) - flycheck-textlint-plugin-alist))) - -(flycheck-define-checker textlint - "A text prose linter using textlint. - -See URL `https://textlint.github.io/'." - :command ("textlint" - (config-file "--config" flycheck-textlint-config) - "--format" "json" - ;; get the first matching plugin from plugin-alist - "--plugin" - (eval (flycheck--textlint-get-plugin)) - source) - ;; textlint seems to say that its json output is compatible with ESLint. - ;; https://textlint.github.io/docs/formatter.html - :error-parser flycheck-parse-eslint - ;; textlint can support different formats with textlint plugins, but - ;; only text and markdown formats are installed by default. Ask the - ;; user to add mode->plugin mappings manually in - ;; `flycheck-textlint-plugin-alist'. - :modes - (text-mode markdown-mode gfm-mode message-mode adoc-mode - mhtml-mode latex-mode org-mode rst-mode) - :enabled - (lambda () (flycheck--textlint-get-plugin)) - :verify - (lambda (_) - (let ((plugin (flycheck--textlint-get-plugin))) - (list - (flycheck-verification-result-new - :label "textlint plugin" - :message plugin - :face 'success))))) - -(flycheck-def-config-file-var flycheck-typescript-tslint-config - typescript-tslint "tslint.json" - :package-version '(flycheck . "27")) - -(flycheck-def-option-var flycheck-typescript-tslint-rulesdir - nil typescript-tslint - "The directory of custom rules for TSLint. - -The value of this variable is either a string containing the path -to a directory with custom rules, or nil, to not give any custom -rules to TSLint. - -Refer to the TSLint manual at URL -`http://palantir.github.io/tslint/usage/cli/' -for more information about the custom directory." - :type '(choice (const :tag "No custom rules directory" nil) - (directory :tag "Custom rules directory")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "27")) - -(flycheck-def-args-var flycheck-tslint-args (typescript-tslint) - :package-version '(flycheck . "31")) - -(flycheck-define-checker typescript-tslint - "TypeScript style checker using TSLint. - -Note that this syntax checker is not used if -`flycheck-typescript-tslint-config' is nil or refers to a -non-existing file. - -See URL `https://github.com/palantir/tslint'." - :command ("tslint" "--format" "json" - (config-file "--config" flycheck-typescript-tslint-config) - (option "--rules-dir" flycheck-typescript-tslint-rulesdir) - (eval flycheck-tslint-args) - source-inplace) - :error-parser flycheck-parse-tslint - :modes (typescript-mode)) - -(flycheck-def-option-var flycheck-verilator-include-path nil verilog-verilator - "A list of include directories for Verilator. - -The value of this variable is a list of strings, where each -string is a directory to add to the include path of Verilator. -Relative paths are relative to the file being checked." - :type '(repeat (directory :tag "Include directory")) - :safe #'flycheck-string-list-p - :package-version '(flycheck . "0.24")) - -(flycheck-define-checker verilog-verilator - "A Verilog syntax checker using the Verilator Verilog HDL simulator. - -See URL `https://www.veripool.org/wiki/verilator'." - :command ("verilator" "--lint-only" "-Wall" - (option-list "-I" flycheck-verilator-include-path concat) - source) - :error-patterns - ((warning line-start "%Warning-" (zero-or-more not-newline) ": " - (file-name) ":" line ": " (message) line-end) - (error line-start "%Error: " (file-name) ":" - line ": " (message) line-end)) - :modes verilog-mode) - -(flycheck-def-option-var flycheck-ghdl-language-standard nil vhdl-ghdl - "The language standard to use in GHDL. - -The value of this variable is either a string denoting a language -standard, or nil, to use the default standard. When non-nil, -pass the language standard via the `--std' option." - :type '(choice (const :tag "Default standard" nil) - (string :tag "Language standard")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "32")) -(make-variable-buffer-local 'flycheck-ghdl-language-standard) - -(flycheck-def-option-var flycheck-ghdl-workdir nil vhdl-ghdl - "The directory to use for the file library. - -The value of this variable is either a string with the directory -to use for the file library, or nil, to use the default value. -When non-nil, pass the directory via the `--workdir' option." - :type '(choice (const :tag "Default directory" nil) - (string :tag "Directory for the file library")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "32")) -(make-variable-buffer-local 'flycheck-ghdl-workdir) - -(flycheck-def-option-var flycheck-ghdl-ieee-library nil vhdl-ghdl - "The standard to use for the IEEE library. - -The value of this variable is either a string denoting an ieee library -standard, or nil, to use the default standard. When non-nil, -pass the ieee library standard via the `--ieee' option." - :type '(choice (const :tag "Default standard" nil) - (const :tag "No IEEE Library" "none") - (const :tag "IEEE standard" "standard") - (const :tag "Synopsys standard" "synopsys") - (const :tag "Mentor standard" "mentor")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "32")) -(make-variable-buffer-local 'flycheck-ghdl-ieee-library) - -(flycheck-define-checker vhdl-ghdl - "A VHDL syntax checker using GHDL. - -See URL `https://github.com/ghdl/ghdl'." - :command ("ghdl" - "-s" ; only do the syntax checking - (option "--std=" flycheck-ghdl-language-standard concat) - (option "--workdir=" flycheck-ghdl-workdir concat) - (option "--ieee=" flycheck-ghdl-ieee-library concat) - source) - :error-patterns - ((error line-start (file-name) ":" line ":" column ": " (message) line-end)) - :modes vhdl-mode) - -(flycheck-def-option-var flycheck-xml-xmlstarlet-xsd-path nil xml-xmlstarlet - "An XSD schema to validate against." - :type '(choice (const :tag "None" nil) - (file :tag "XSD schema")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "31")) - -(flycheck-define-checker xml-xmlstarlet - "A XML syntax checker and validator using the xmlstarlet utility. - -See URL `http://xmlstar.sourceforge.net/'." - ;; Validate standard input with verbose error messages, and do not dump - ;; contents to standard output - :command ("xmlstarlet" "val" "--err" "--quiet" - (option "--xsd" flycheck-xml-xmlstarlet-xsd-path) - "-") - :standard-input t - :error-patterns - ((error line-start "-:" line "." column ": " (message) line-end)) - :modes (xml-mode nxml-mode)) - -(flycheck-def-option-var flycheck-xml-xmllint-xsd-path nil xml-xmllint - "An XSD schema to validate against." - :type '(choice (const :tag "None" nil) - (file :tag "XSD schema")) - :safe #'flycheck-string-or-nil-p - :package-version '(flycheck . "31")) - -(flycheck-define-checker xml-xmllint - "A XML syntax checker and validator using the xmllint utility. - -The xmllint is part of libxml2, see URL -`http://www.xmlsoft.org/'." - :command ("xmllint" "--noout" - (option "--schema" flycheck-xml-xmllint-xsd-path) - "-") - :standard-input t - :error-patterns - ((error line-start "-:" line ": " (message) line-end)) - :modes (xml-mode nxml-mode)) - -(flycheck-define-checker yaml-jsyaml - "A YAML syntax checker using JS-YAML. - -See URL `https://github.com/nodeca/js-yaml'." - :command ("js-yaml") - :standard-input t - :error-patterns - ((error line-start - (or "JS-YAML" "YAMLException") ": " - (message) " at line " line ", column " column ":" - line-end)) - :modes yaml-mode - :next-checkers ((warning . cwl))) - -(flycheck-define-checker yaml-ruby - "A YAML syntax checker using Ruby's YAML parser. - -This syntax checker uses the YAML parser from Ruby's standard -library. - -See URL `http://www.ruby-doc.org/stdlib-2.0.0/libdoc/yaml/rdoc/YAML.html'." - :command ("ruby" "-ryaml" "-e" "begin; - YAML.load(STDIN); \ - rescue Exception => e; \ - STDERR.puts \"stdin:#{e}\"; \ - end") - :standard-input t - :error-patterns - ((error line-start "stdin:" (zero-or-more not-newline) ":" (message) - "at line " line " column " column line-end)) - :modes yaml-mode - :next-checkers ((warning . cwl))) - -(flycheck-def-config-file-var flycheck-yamllintrc yaml-yamllint ".yamllint") - -(flycheck-define-checker yaml-yamllint - "A YAML syntax checker using YAMLLint. -See URL `https://github.com/adrienverge/yamllint'." - :standard-input t - :command ("yamllint" "-f" "parsable" "-" - (config-file "-c" flycheck-yamllintrc)) - :error-patterns - ((error line-start - "stdin:" line ":" column ": [error] " (message) line-end) - (warning line-start - "stdin:" line ":" column ": [warning] " (message) line-end)) - :modes yaml-mode) - -(provide 'flycheck) - -;; Local Variables: -;; coding: utf-8 -;; indent-tabs-mode: nil -;; End: - -;;; flycheck.el ends here diff --git a/elpa/flycheck-20200405.2310/flycheck.elc b/elpa/flycheck-20200405.2310/flycheck.elc deleted file mode 100644 index 2fe9a200e68416daf3dfdd5686dfe7609211b7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 526885 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 LDNIrA%NPHDG^!Zx diff --git a/elpa/flymake-eslint-20191129.1558/flymake-eslint-autoloads.el b/elpa/flymake-eslint-20191129.1558/flymake-eslint-autoloads.el deleted file mode 100644 index 407f8e8c..00000000 --- a/elpa/flymake-eslint-20191129.1558/flymake-eslint-autoloads.el +++ /dev/null @@ -1,28 +0,0 @@ -;;; flymake-eslint-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "flymake-eslint" "flymake-eslint.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from flymake-eslint.el - -(autoload 'flymake-eslint-enable "flymake-eslint" "\ -Enable Flymake and add flymake-eslint as a buffer-local Flymake backend. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flymake-eslint" '("flymake-eslint-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; flymake-eslint-autoloads.el ends here diff --git a/elpa/flymake-eslint-20191129.1558/flymake-eslint-pkg.el b/elpa/flymake-eslint-20191129.1558/flymake-eslint-pkg.el deleted file mode 100644 index 944f6b44..00000000 --- a/elpa/flymake-eslint-20191129.1558/flymake-eslint-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "flymake-eslint" "20191129.1558" "A Flymake backend for Javascript using eslint" '((emacs "26.0")) :commit "6e2d376f84ddf9af593072954c97e9c82ab85331" :authors '(("Dan Orzechowski")) :maintainer '("Dan Orzechowski") :url "https://github.com/orzechowskid/flymake-eslint") diff --git a/elpa/flymake-eslint-20191129.1558/flymake-eslint.el b/elpa/flymake-eslint-20191129.1558/flymake-eslint.el deleted file mode 100644 index 8f4011f2..00000000 --- a/elpa/flymake-eslint-20191129.1558/flymake-eslint.el +++ /dev/null @@ -1,190 +0,0 @@ -;;; flymake-eslint.el --- A Flymake backend for Javascript using eslint -*- lexical-binding: t; -*- - -;;; Version: 1.5.0 -;; Package-Version: 20191129.1558 - -;;; Author: Dan Orzechowski -;;; Contributor: Terje Larsen - -;;; URL: https://github.com/orzechowskid/flymake-eslint - -;;; Package-Requires: ((emacs "26.0")) - -;;; Commentary: -;; A backend for Flymake which uses eslint. Enable it with `M-x flymake-eslint-enable [RET]'. -;; Alternately, configure a mode-hook for your Javascript major mode of choice: -;; -;; (add-hook 'some-js-major-mode-hook -;; (lambda () (flymake-eslint-enable)) -;; -;; A handful of configurable options can be found in the `flymake-eslint' customization group: view and modify them with the command `M-x customize-group [RET] flymake-eslint [RET]'. - -;;; License: MIT - -;;; Code: - - -;; our own customization group - - -(defgroup flymake-eslint nil - "Flymake checker for Javascript using eslint" - :group 'programming - :prefix "flymake-eslint-") - - -;; useful variables - - -(defcustom flymake-eslint-executable-name "eslint" - "Name of executable to run when checker is called. Must be present in variable `exec-path'." - :type 'string - :group 'flymake-eslint) - -(defcustom flymake-eslint-executable-args nil - "Extra arguments to pass to eslint." - :type 'string - :group 'flymake-eslint) - -(defcustom flymake-eslint-show-rule-name t - "Set to t to append rule name to end of warning or error message, nil otherwise." - :type 'boolean - :group 'flymake-eslint) - -(defcustom flymake-eslint-defer-binary-check nil - "Set to t to bypass the initial check which ensures eslint is present. - -Useful when the value of variable `exec-path' is set dynamically and the location of eslint might not be known ahead of time." - :type 'boolean - :group 'flymake-eslint) - - -;; useful buffer-local variables - - -(defcustom flymake-eslint-project-root nil - "Buffer-local. Set to a filesystem path to use that path as the current working directory of the linting process." - :type 'string - :group 'flymake-eslint) - - -;; internal variables - - -(defvar flymake-eslint--message-regex "^[[:space:]]*\\([0-9]+\\):\\([0-9]+\\)[[:space:]]+\\(warning\\|error\\)[[:space:]]+\\(.+?\\)[[:space:]]\\{2,\\}\\(.*\\)$" - "Internal variable. -Regular expression definition to match eslint messages.") - -(defvar-local flymake-eslint--process nil - "Internal variable. -Handle to the linter process for the current buffer.") - - -;; internal functions - - -(defun flymake-eslint--ensure-binary-exists () - "Internal function. -Throw an error and tell REPORT-FN to disable itself if `flymake-eslint-executable-name' can't be found on variable `exec-path'" - (unless (executable-find flymake-eslint-executable-name) - (error (message "can't find '%s' in exec-path - try M-x set-variable flymake-eslint-executable-name maybe?" flymake-eslint-executable-name)))) - -(defun flymake-eslint--report (eslint-stdout-buffer source-buffer) - "Internal function. -Create Flymake diag messages from contents of ESLINT-STDOUT-BUFFER, to be reported against SOURCE-BUFFER. Returns a list of results" - (with-current-buffer eslint-stdout-buffer - ;; start at the top and check each line for an eslint message - (goto-char (point-min)) - (if (looking-at-p "Error:") - (let ((diag (flymake-make-diagnostic source-buffer (point-min) (point-max) :error (thing-at-point 'line t)))) - ;; ehhhhh point-min and point-max here are of the eslint output buffer - ;; containing the error message, not source-buffer - (list diag)) - (let ((results '())) - (while (not (eobp)) - (when (looking-at flymake-eslint--message-regex) - (let* ((row (string-to-number (match-string 1))) - (column (string-to-number (match-string 2))) - (type (match-string 3)) - (msg (match-string 4)) - (lint-rule (match-string 5)) - (msg-text (if flymake-eslint-show-rule-name - (format "%s: %s [%s]" type msg lint-rule) - (format "%s: %s" type msg))) - (type-symbol (if (string-equal "warning" type) :warning :error)) - (src-pos (flymake-diag-region source-buffer row column))) - ;; new Flymake diag message - (push (flymake-make-diagnostic source-buffer - (car src-pos) - ;; buffer might have changed size - (min (buffer-size source-buffer) (cdr src-pos)) - type-symbol - msg-text) - results))) - (forward-line 1)) - results)))) - -;; heavily based on the example found at -;; https://www.gnu.org/software/emacs/manual/html_node/flymake/An-annotated-example-backend.html -(defun flymake-eslint--create-process (source-buffer callback) - "Internal function. -Create linter process for SOURCE-BUFFER which invokes CALLBACK once linter is finished. CALLBACK is passed one argument, which is a buffer containing stdout from linter." - (when (process-live-p flymake-eslint--process) - (kill-process flymake-eslint--process)) - (let ((default-directory (or flymake-eslint-project-root default-directory))) - (setq flymake-eslint--process - (make-process - :name "flymake-eslint" - :connection-type 'pipe - :noquery t - :buffer (generate-new-buffer " *flymake-eslint*") - :command (list flymake-eslint-executable-name "--no-color" "--no-ignore" "--stdin" "--stdin-filename" (buffer-file-name source-buffer) (or flymake-eslint-executable-args "")) - :sentinel (lambda (proc &rest ignored) - ;; do stuff upon child process termination - (when (and (eq 'exit (process-status proc)) - ;; make sure we're not using a deleted buffer - (buffer-live-p source-buffer) - ;; make sure we're using the latest lint process - (with-current-buffer source-buffer (eq proc flymake-eslint--process))) - ;; read from eslint output then destroy temp buffer when done - (let ((proc-buffer (process-buffer proc))) - (funcall callback proc-buffer) - (kill-buffer proc-buffer)))))))) - -(defun flymake-eslint--check-and-report (source-buffer flymake-report-fn) - "Internal function. -Run eslint against SOURCE-BUFFER and use FLYMAKE-REPORT-FN to report results." - (if flymake-eslint-defer-binary-check - (flymake-eslint--ensure-binary-exists)) - (flymake-eslint--create-process - source-buffer - (lambda (eslint-stdout) - (funcall flymake-report-fn (flymake-eslint--report eslint-stdout source-buffer)))) - (with-current-buffer source-buffer - (process-send-string flymake-eslint--process (buffer-string)) - (process-send-eof flymake-eslint--process))) - -(defun flymake-eslint--checker (flymake-report-fn &rest ignored) - "Internal function. -Run eslint on the current buffer, and report results using FLYMAKE-REPORT-FN. All other parameters are currently IGNORED." - (flymake-eslint--check-and-report (current-buffer) flymake-report-fn)) - - -;; module entry point - - -;;;###autoload -(defun flymake-eslint-enable () - "Enable Flymake and add flymake-eslint as a buffer-local Flymake backend." - (interactive) - (if (not flymake-eslint-defer-binary-check) - (flymake-eslint--ensure-binary-exists)) - (make-local-variable 'flymake-eslint-project-root) - (flymake-mode t) - (add-hook 'flymake-diagnostic-functions 'flymake-eslint--checker nil t)) - - -(provide 'flymake-eslint) - - -;;; flymake-eslint.el ends here diff --git a/elpa/flymake-eslint-20191129.1558/flymake-eslint.elc b/elpa/flymake-eslint-20191129.1558/flymake-eslint.elc deleted file mode 100644 index a6a9ab0acd160c2f1de10d46d0956d1de287ef64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5824 zcmbtYZByLH5e6T@K|UGt<-kbobMG(Rq9FrHr>TJth8{z!q}`nR>UwcnlO zk_SmoGRyaD8<&I2#pU5@;A-M(;c7p9?7I#m)CDOAQVyh?#_QMkg`5L9r>*BX^YSju z)AFuE@-97nUY^!9@@jooukVsBq}Ss5*wx5;Hm&cGhLBw@@6pF5-ZK zhyGLGu$@a=JK9x8+i||Nv_e&c)TGa5tFb&`X%VyAp^T@eL+sJwvR7y9 z9ZW<)fCFR_=0NmJb^MXm;bV~x_v$!yJ{e0^#^(d-i*%6P(-uaCme8VE9UA2Zo6qSA>_5gv*P<>+OuqRAPop_3{cJz8{R# z=%oRu6Tpde>xwVO6PuE0rq{T~J~qa`J;V zN{NcB{@1O2h+&zk5x52pPvt-&@IPH%9%W+@$fK*PXTHCGY4gLYZ+yRYH2*Lsgt2{% zM&JKMff3Rbf%-Qu7hn4Rf7}D#|1T!ju}$rX#rAieusUefg*%p z0MjAMY0If>H*fN;a@_-GHxns$>g^9(ZEU}>lsgowvLtW#);8W!VR~4> zx%|xm(cWUJVpgfX8rj>;_9$mhGd1HZM~uAVca#LUaYYrr6_Wt{ldgP;5Nc?Lx=!P; zcBOoC*jVP9lT?aavQu3-d!ZPZWD07RCL_hhRFX%)c0Rm)^ZtT=xOjc`@q)klczW77 zKOpZR>7;U;q&aAw7>F=NIr?z+@%*HtrI0($WnQFl#sq+iVJwFbE}}dG4eEn{E?IkV zjoO2*Ecb`=nofgR>FQ6!mSnf&Or`7o3?DXEw`;!Ja#!I)?+JOfwJLk~M+}Bo67jEw zZ|!2Db7CZ2!U2RGcZ9nJE|;b@Hwg;fFEpZ<82&f6x96T(>WR2bn_lC_watyQjjDj@ zXP8cO%=OmR)}GMX7v@c4ZEfcZj5K}Mvq|<7jkHMSU$`Ts-S+zC`o{Xk4jxp8C9-pKM++*67)h)Xx0$MH_0_v!^!d6x37**zDFht zrrBL}SaFyQ70;WB5VZi~LbxTci(z61W<`p!Qg_o$QH{;=UQ)pD6xO9~Xoe{E7PT^) zJREO<${Z&Bo4BK(*ib>?#{|$8JvjCz5Z3y`iXZ=_1g(iQ(*sao%y%#5lV91AF86k~Q$@kt**|=w^fobV49^@fn|~NLN$y=Z6*5)>V{8;f>^Db{$61R1Xy( zrdS^-DqQJMfMPVwF_;xV%N4^PhoJdKaq?3kQAl!jq~S1-u}qQjc`R>rWoH(9wy54S zwcuz(rP|^=PSB!8Ns6#h4Ins-=8M3e_H75w<2tkY9 zZPxsH&zq_*@*W{M+Kq4F-X;=M+5IA6s>c-1wo2=(eq5W$wA3VLRUwV=MR#R}N0q*T zWk8qlX@hv@y`nv}vhhHci@X4ZzYD=FH2W=`VkERBm5<8%E94uCC_V+#59enm>?vwn z&ffg({n>fvbqy8Sb#(IZ8ctJ}WN(h+&gjxP8a+*5mzGl11`ydkef!UM$KQAO0*}&V zP?y%F@qKUJuLL@E(;QGhQlt`ZLVW{X@g9?tT&9W&2+|`wA@F7&EfCf=RVNBR6d?LV zfI8kTZjl#snZ}#OCVrZ%e2v@ICe`U>G;2xkwus)(MlfGW_o|aCiLHWEWE+K4q6sb? z*PimhUqf1Hz6Go-ke-@lxI9Ok^tdi*8ie}EfKW-uq>r*>kkx3~wno--XIWXALl$*Q zbM0BV$AN;@B7*c+lY5u}p*yC}f>;GD2tLe>Bz>7fDVjEY=vZ|CXc*pGq!K0%@;mcU zXXnx+3w!(p!DSgn%AS4>v}EQ O_PhzPL#0`(ZT$~Y1}c>R diff --git a/elpa/flymake-racket-20180912.109/flymake-racket-autoloads.el b/elpa/flymake-racket-20180912.109/flymake-racket-autoloads.el deleted file mode 100644 index 201c3ac5..00000000 --- a/elpa/flymake-racket-20180912.109/flymake-racket-autoloads.el +++ /dev/null @@ -1,33 +0,0 @@ -;;; flymake-racket-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "flymake-racket" "flymake-racket.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from flymake-racket.el - -(autoload 'flymake-racket-setup "flymake-racket" "\ -Set up Flymake for Racket. - -\(fn)" t nil) - -(autoload 'flymake-racket-add-hook "flymake-racket" "\ -Add `flymake-racket-lint' to `flymake-diagnostic-functions'. - -\(fn)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flymake-racket" '("flymake-racket-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; flymake-racket-autoloads.el ends here diff --git a/elpa/flymake-racket-20180912.109/flymake-racket-pkg.el b/elpa/flymake-racket-20180912.109/flymake-racket-pkg.el deleted file mode 100644 index c98b1cad..00000000 --- a/elpa/flymake-racket-20180912.109/flymake-racket-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "flymake-racket" "20180912.109" "Flymake extension for Racket." '((emacs "26.1")) :commit "d20fa60d66db3f7c2df0133814564ee5b36d2aba" :keywords '("languages" "racket" "scheme") :maintainer '("James Nguyen" . "james@jojojames.com") :url "https://github.com/jojojames/flymake-racket") diff --git a/elpa/flymake-racket-20180912.109/flymake-racket.el b/elpa/flymake-racket-20180912.109/flymake-racket.el deleted file mode 100644 index 5966b701..00000000 --- a/elpa/flymake-racket-20180912.109/flymake-racket.el +++ /dev/null @@ -1,235 +0,0 @@ -;;; flymake-racket.el --- Flymake extension for Racket. -*- lexical-binding: t -*- - -;; Copyright (C) 2018 James Nguyen - -;; Authors: James Nguyen -;; Maintainer: James Nguyen -;; URL: https://github.com/jojojames/flymake-racket -;; Package-Version: 20180912.109 -;; Version: 1.0 -;; Package-Requires: ((emacs "26.1")) -;; Keywords: languages racket scheme - -;; 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 . - -;;; Commentary: -;; Flymake extension for Racket. -;; -;; (with-eval-after-load 'flymake -;; (flymake-racket-setup)) - -;;; Code: - -(require 'flymake) -(require 'cl-lib) -(eval-when-compile (require 'subr-x)) - -;;; Flymake - -(defcustom flymake-racket-executable "raco" - "Executable for racket." - :type 'string - :group 'flymake-racket) - -(defcustom flymake-racket-args '("expand") - "Args to pass to racket." - :type 'list - :group 'flymake-racket) - -(defvar-local flymake-racket--lint-process nil - "Buffer-local process started for linting the buffer.") - -(defvar flymake-racket-raco-has-expand-p nil - "Boolean to check if `flymake-racket-executable' contains expand.") - -;;;###autoload -(defun flymake-racket-setup () - "Set up Flymake for Racket." - (interactive) - (add-hook 'racket-mode-hook #'flymake-racket-add-hook) - (add-hook 'scheme-mode-hook #'flymake-racket-add-hook)) - -;;;###autoload -(defun flymake-racket-add-hook () - "Add `flymake-racket-lint' to `flymake-diagnostic-functions'." - ;; Checking if raco expand exists is really slow (200ms~), so - ;; try to do it using the `async' library. - (if (and (fboundp 'async-start) - (eq flymake-racket-raco-has-expand-p nil)) - (let ((buffer (current-buffer))) - (async-start - `(lambda () - (load ,(locate-library "flymake-racket")) - (require 'flymake-racket) - (flymake-racket--check-shell-raco-expand)) - `(lambda (result) - (setq flymake-racket-raco-has-expand-p (if result 'yes 'no)) - (with-current-buffer ,buffer - (flymake-racket-add-hook) - ;; Because we did this asynchronously, we should explicitly - ;; start a syntax check.. but only if `flymake-start-on-flymake-mode' - ;; is t. - (when flymake-start-on-flymake-mode - (flymake-start)))))) - (when (flymake-racket--raco-has-expand) - (add-hook 'flymake-diagnostic-functions - 'flymake-racket-lint-if-possible nil t)))) - -(defun flymake-racket-lint-if-possible (report-fn &rest args) - "Run `flymake-racket-lint' if possible. - -REPORT-FN is called when `flymake-racket-lint' runs. - -ARGS is passed straight through to `flymake-racket-lint'." - (when (or - (eq major-mode 'racket-mode) - (and (eq major-mode 'scheme-mode) - (boundp 'geiser-impl--implementation) - (eq geiser-impl--implementation 'racket))) - (apply #'flymake-racket-lint report-fn args))) - -(defun flymake-racket-lint (report-fn &rest _args) - "A Flymake backend for racket check. - -REPORT-FN will be called when racket process finishes." - (when (and flymake-racket--lint-process - (process-live-p flymake-racket--lint-process)) - (kill-process flymake-racket--lint-process)) - (let ((source-buffer (current-buffer)) - (output-buffer (generate-new-buffer " *flymake-racket-lint*"))) - (setq flymake-racket--lint-process - (make-process - :name "flymake-racket-lint" - :buffer output-buffer - :command `(,flymake-racket-executable - ,@flymake-racket-args - ,buffer-file-name) - :connection-type 'pipe - :sentinel - (lambda (proc _event) - (when (eq (process-status proc) 'exit) - (unwind-protect - (cond - ((not (and (buffer-live-p source-buffer) - (eq proc (with-current-buffer source-buffer - flymake-racket--lint-process)))) - (flymake-log :warning - "racket process %s obsolete" proc)) - ((zerop (process-exit-status proc)) - ;; No racket errors/warnings.. - (funcall report-fn nil)) - ((= 1 (process-exit-status proc)) - (flymake-racket--lint-done report-fn - source-buffer - output-buffer)) - (:error - (funcall report-fn - :panic - :explanation - (format "racket process %s errored." proc)))) - (kill-buffer output-buffer)))))))) - -;; Helpers -(defun flymake-racket--lint-done (report-fn - source-buffer - output-buffer) - "Process racket result and call REPORT-FN. - -SOURCE-BUFFER is the buffer to apply flymake to. -OUTPUT-BUFFER is the result of running racket on SOURCE-BUFFER." - (with-current-buffer - source-buffer - (save-excursion - (save-restriction - (widen) - (funcall - report-fn - (with-current-buffer output-buffer - (let* ((result '()) ;; Accumulate results here. - (lines (split-string (buffer-string) "\n" t)) - (numLines (length lines)) - (i 0) - (source-buffer-name - (with-current-buffer source-buffer - (file-name-nondirectory buffer-file-name)))) - ;; Example error message: - ;; racket_file.rkt:24:0: read-syntax: expected a `)` to close `(` - ;; possible cause: indentation suggests a missing `)` before line 34 - (while (< i numLines) - ;; Filter out messages that don't match buffer name. - (when (string-prefix-p source-buffer-name (nth i lines)) - (let* ((line (nth i lines)) - (split (split-string line ":" t)) - (_ (nth 0 split)) ; filename - (line (string-to-number (nth 1 split))) - (column (string-to-number (nth 2 split))) - (message (mapconcat (lambda (str) str) - (cdddr split) - "")) - (point (flymake-racket--find-point - source-buffer - line - column))) - (when (and (< (1+ i) numLines) - (string-match-p "possible cause" - (nth (1+ i) lines))) - (setq message (concat message "\n" (nth (1+ i) lines))) - ;; Skip next line when processing. - (setq i (1+ i))) - ;; Accumulate the result. - (push (flymake-make-diagnostic source-buffer - point - (1+ point) - :warning - message) - result))) - (setq i (1+ i))) - result))))))) - -(defun flymake-racket--find-point (source-buffer line column) - "Return point given LINE and COLUMN in SOURCE-BUFFER." - (with-current-buffer source-buffer - (save-excursion - (goto-char (point-min)) - (forward-line (1- line)) - (move-to-column column) - (point)))) - -(defun flymake-racket--raco-has-expand () - "Check if raco has expand." - (cond - ((eq flymake-racket-raco-has-expand-p 'yes) t) - ((eq flymake-racket-raco-has-expand-p 'no) nil) - (:default - (setq flymake-racket-raco-has-expand-p - (flymake-racket--check-shell-raco-expand)) - (if flymake-racket-raco-has-expand-p - (setq flymake-racket-raco-has-expand-p 'yes) - (setq flymake-racket-raco-has-expand-p 'no)) - (flymake-racket--raco-has-expand)))) - -(defun flymake-racket--check-shell-raco-expand () - "Check if raco has expand using `call-process'." - (with-temp-buffer - (call-process flymake-racket-executable nil t nil "expand") - (goto-char (point-min)) - (not (looking-at-p - (rx bol (1+ not-newline) - "Unrecognized command: expand" - eol))))) - -(provide 'flymake-racket) -;;; flymake-racket.el ends here diff --git a/elpa/flymake-racket-20180912.109/flymake-racket.elc b/elpa/flymake-racket-20180912.109/flymake-racket.elc deleted file mode 100644 index e8671ba9699cdf376e86264a593f9725cb4c88bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5510 zcmbtYYjfMi6_sR}k(Fuc^h?^AKCVF9BAq}3EclY#Of4x=#xsuP>XCe~)G-JyNmSs1 z20+WohyM1SyIAl6N}f)m8H&KZ?(V(ko_m%rj$R*rv$C?X`QpV3I*do-Fp@p}5-K_x z`9Vq_Ws-)mBGKCMbk9wg4atupipNJiIZ8^>PohvJlnpUZc)4A;;5Ys827c?`=H_Otdz(o+ zh(=p-;5QizH`jkgtk<5zqc?gwywyfs$0Dx>u7FzoKU{#jzxRf z?O0NdCE6P#@nl@GTza+rWRNadtXcBY7+|sLFbQ+}JSdB4?5FyBYA*`Y?20<|&Faf$ zgAOMBzD(>W#(8L*#DT={H1m@TSngw=QK&MY9Ke#))q{8bwpr`RKHOB^7`&-6yI4hq z5!I?sXoos(vtHklm`6Q{# zFlmMlU>}GTm)2YYFz$7W#twMI9>(#tfrvdq;^Ymb!%hdL@W)8b240b8Jny=0qt3^< z(oPh#-|H9w7y1Jgr&$=-1;o?s&mMESm*S-Qlt^sHd%CiL^LgLr&trYo zJkR;u(_G)uxqfhPfJTtOEafW|yfqFEj@f4pXLpnE&~#St2%2!w#L4bpIpIFxG063j zua;xn@5U3=8hQMc!7rp3R&2X%oY5t^ zYs}i|P(~3mN^He8+P+0O*;X-D;UZ=SlO&PI!92OJ zztS#>Fu~T%P^zgdeS8~5s2IRPRDkc@@nXVc#Cd zX&N%|f}eH^00Rhh4PLk7(CI|YKx+1oqZckIrlaJGx`kC$%vP$=UjO=H7uRG z`p)Y#$>MYooGy(&&QhoO7rXiZ>BDvMPcDpeK*9czA+C~Mbn^Rzq>4nFibBlE8E<&-V*DjHv-Z#{YVV=Dp9*tPL0y-RiyelQOShBU?8HZ3kdntezDjDSl zW;(IyHng55%<#M%%0^@itQrU#{Oqi7&mdj5rx(@I34huT?d33Hw7%f*I zqlh}>*uZva@5WCQtG=S$BqM8D@P2_SdYV$)O(DxNX%&sAYhhMwm4%dBTE)%}*NYVZ z0KtXJ)E<;q};M~oWH#| zFHJBOVwCEM(!MmNaa&lhutaDJy|l3SXUoZ)TdVKdZ5JL~)u0FP1wM`ca0aXujVw8} zW^x*Y2d%>ZUf2B*Z|$T~$>$=~Hn!@k4}Jlvyi4I})#a`}s8l*ykD*PtE34}rUThU9 z$g8&WLN7Tj*Y;oL>51fA@9-lmxvhu$`}_EAGdVhyuh!SAm5uYtr7~t5HY421BeeB- zX}#*7&?X+B#vzGXt$ahgDU60?r-}LJmEU##iC(dW_4pfnExgL_*Z5@Tcy3fGPqF3! z_g(gRoiA4PK#Xt%t*mns9-H;8Z}G)aa*0+$H4M7|IqvFefHbjz*I;P({LI%9G95=c z1^DNIBGJqR52&>$BS-(Dph?=s-M@!hDf7Usxd(!zWk37`%C`2bqAiPUH5qkr$rs4} zu_2J^JJD<-8S<@iW=|92?EI87!m^eU5XBVNoEY3rRw0{^2>5|xYE2($I#KigOv_CP z0``ilhSzf1dA@a8bc$O~q9DoG!~oSt(d$=lj))WP@Z|NyPf%ue=fNWS^`v~l=dnL` zq5}MDQ}D|!BY*YmmcIZLXH{4F_s@;jMls4G+#AHvWTdXBX(*)8!0k_qPtm5s;?9XY zjtQD~@m_hi#9I=``g+6y&(-Zs}OM(}2Lq{rOW;5K~oRVUX9-k-VMW!WJ9%8%Y- z{A=-5=zqHJ@J%7Z4^0}Oi@bjC8&YjugD=YbNsz zu)=I3R-galZcoo?vd{6tJ#s6Pqj90HX7Z<0&6|&MnA~674Mk~TRx0%K&epL<&YPc# z$okjLw-*ZB6Ax7QEABi-we1;fKe2EHj<1>Gd|b-fMPBUg>b$5yn0yRzQ7qqnH~$Nu CIFc;@ diff --git a/elpa/gherkin-mode-20171224.1353/gherkin-mode-autoloads.el b/elpa/gherkin-mode-20171224.1353/gherkin-mode-autoloads.el deleted file mode 100644 index 97e6bb8d..00000000 --- a/elpa/gherkin-mode-20171224.1353/gherkin-mode-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; gherkin-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "gherkin-mode" "gherkin-mode.el" (0 0 0 0)) -;;; Generated autoloads from gherkin-mode.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "gherkin-mode" '("gherkin-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; gherkin-mode-autoloads.el ends here diff --git a/elpa/gherkin-mode-20171224.1353/gherkin-mode-pkg.el b/elpa/gherkin-mode-20171224.1353/gherkin-mode-pkg.el deleted file mode 100644 index 679962e1..00000000 --- a/elpa/gherkin-mode-20171224.1353/gherkin-mode-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "gherkin-mode" "20171224.1353" "An emacs major mode for editing gherkin files." 'nil :commit "0313492e7da152f0aa73ddf96c0287ded8f51253" :keywords '("languages") :authors '(("Craig Andera")) :maintainer '("Craig Andera")) diff --git a/elpa/gherkin-mode-20171224.1353/gherkin-mode.el b/elpa/gherkin-mode-20171224.1353/gherkin-mode.el deleted file mode 100644 index 0c9d41e5..00000000 --- a/elpa/gherkin-mode-20171224.1353/gherkin-mode.el +++ /dev/null @@ -1,64 +0,0 @@ -;;; gherkin-mode.el --- An emacs major mode for editing gherkin files. - -;; Copyright (C) 2017 Craig Andera - -;; Author: Craig Andera -;; Keywords: languages -;; Package-Version: 20171224.1353 -;; Version: 0.0.1 - -;; Licensed under the Apache License, Version 2.0 (the "License"); -;; you may not use this file except in compliance with the License. -;; You may obtain a copy of the License at -;; -;; http://www.apache.org/licenses/LICENSE-2.0 -;; -;; Unless required by applicable law or agreed to in writing, software -;; distributed under the License is distributed on an "AS IS" BASIS, -;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -;; See the License for the specific language governing permissions and -;; limitations under the License. - -;;; Commentary: - -;; A mode for editing gherkin files. -;; -;; For more about gherkin, see https://github.com/alandipert/gherkin. - -;;; Code: - -;; TODO: Oh so many things - -(defconst gherkin-keywords-re - (regexp-opt - '("&" "nil" "t" - "quote" "fn" "if" "set!" "def" "do" "recur" - "eq?" "nil?" "car" "cdr" "cons" "list" "eval" - "apply" "read" "+" "-" "/" "mod" "<" ">" - "cons?" "symbol?" "number?" "string?" "fn?" - "gensym" "random" "exit" "println" "sh" "sh!" - "load-file" "gc" "error" "type" "str") - 'words)) - -(defconst gherkin-keywords - `(("<.*>" . font-lock-constant-face) - ("#.*$" . font-lock-comment-face) - ,gherkin-keywords-re - ("\\?\\w+" . font-lock-variable-name-face) - ("\"[^\"]*\"" . font-lock-string-face) - ("'[^']*'" . font-lock-string-face))) - -(define-derived-mode gherkin-mode lisp-mode - "GK" - :group 'gherkin-mode - ;; Comments - (make-local-variable 'comment-start) - (setq comment-start "# ") - ;; Font-lock support - (setq font-lock-defaults '(gherkin-keywords)) - ;; Key maps - ;;(define-key gherkin-mode-map (kbd "C-c C-x") 'whatever) - ) - -(provide 'gherkin-mode) -;;; gherkin-mode.el ends here diff --git a/elpa/gherkin-mode-20171224.1353/gherkin-mode.elc b/elpa/gherkin-mode-20171224.1353/gherkin-mode.elc deleted file mode 100644 index d73f0f3c66c57b9a436873aed35ee6a7790cb2ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3545 zcmbtX-A~*`5a%(vs7UQYnyP9Td{OU?;Op7PM*<{iKv9a)MwMFi1rxDn?{O}+*Rj`- zYp?%%f3tfAJ0y7tl705f?0nD9!~V-(kG@@5S?TQW@6(Y=^Ei=_d5JT6nToKaOIeh$ z%E;dt`i65A>luk8A(iVmjsFoE>~h#K%s*#wNmFQ{s+1)~^Gu|1NRbLlUBuaWxe0Dj zY7$W-Bf7TYJsJ8>Zs~{=bYx0Xs4^`eTvogrTXk6mN0vUF>+?Jgx*jzvZ^C8BbEUI)OVQA@8 zjxNv%L>BKVrEzWn9>S|u^=o6NxhEe**dG$_8fZ3>So$JohUYI z&**v1`cHm*^wYsJ?VcLyGiUIb6jOgP*U}AD#Hk*SJY4=A+{TB8hk-xZb?D?{W$8Ny z!;NPS4QYx_brTg{KnaQ{@HQ2p98lls4mTctD3Ye~Mxu}E!uP93ZK+F9#A1?27qcX< zwFS<}+rT;92%NUGowIAP-pSkE=|=C z3E2v!E1V--hQ_Jt2ENBHTe!B@S?GQ(vklS?uH9N@^g&W@%w9(g?5H?P24^U*G&#Sp zUqzLXm}2$`Ov&IvuU-=?7zWuJMR}o+w6vr`mQ|uDo?_mCPPJmfGh@p{Rat~1XMiLV zagRi$RSJ6{U~W#6IEzY(^^mA<@C^rbQAyOgFhFS1RI4qA1IOyj+sRBtPMGaDiy1IY zF)kV$^9jH87=Fs|9z1 zF;~s=mNFh{>Wv9PrkG%le52ZJoG^ulYHw@3sd{8oAJ&4bwxt?v;IRu#+zlKyai=x} z+S1VPjq|l3e{^jK(Rql@=gY6H*F^IRVrybebBW2Mke9CJiE8EFWEUKKJ_ z`J9~BCjF-TXEhqI?%wd@l`rS$-uFwBpKAf?CnB9hg8E(WX?G8zu1<3oP60pgcB?a5 zn!8?iFd*9}O^ePS=8bH~+_bm6ZrJU9!c;47)|3fFx-AaSf}9s7$DcD8VPG$16jmh$&@#^pRpqC&J?M0Q-g>-4zlpyQ0iVM(86`9=R7z*p$9puH)7jFw zrlH=ja||5F@Li2{X?GX~1xeO}9%veC%B0c~iwb^dCV28oQdb$-soU(>c$d+cjiZs@ zy-tVP`Q^UqZGJ#&<_vg)wWU=Pw^`U;r*k!n!x@4uq^k-yk!4BcOhoGHCTVa!R0Xgu zS6RehXv)od*)ec3iVW(IRxmavMl2iHGWRB*X?#B8kS`^J>t@HmrQzTen1@6esB62* zB*ceAu>kN*U^Of#ml;qu28>E7wahzFWiZ;{pGcN_BisxAZO#y9>%TRFgAjt!UXx4R z6VqV82!kIrXzbo+h#`wrp7%B0{BM|qYs{!M{vKfBF;W38JVpo0s=;piu7Ru`OYPjn zZI>)A0bEAGli4{+aR1*5IMR#qRZuCX{C zLEf><)wQFgZGV?-vp?gdrP1nxduuktu~+l_d*4A~e2-vZj6lZb)5;4;Boi^W!(!{2 z@`%_;GV{fI12xlVpsqz|_Sz m2^71Q_q-2ty -;; Sebastian Wiesner -;; Florian Ragwitz -;; Marius Vollmer -;; Maintainer: Jonas Bernoulli - -;; Package-Requires: ((emacs "25.1") (dash "20180910") (transient "20190812") (with-editor "20181103")) -;; Package-Version: 20200207.1819 -;; Keywords: git tools vc -;; Homepage: https://github.com/magit/magit - -;; This file is not part of GNU Emacs. - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this file. If not, see . - -;;; Commentary: - -;; This package assists the user in writing good Git commit messages. - -;; While Git allows for the message to be provided on the command -;; line, it is preferable to tell Git to create the commit without -;; actually passing it a message. Git then invokes the `$GIT_EDITOR' -;; (or if that is undefined `$EDITOR') asking the user to provide the -;; message by editing the file ".git/COMMIT_EDITMSG" (or another file -;; in that directory, e.g. ".git/MERGE_MSG" for merge commits). - -;; When `global-git-commit-mode' is enabled, which it is by default, -;; then opening such a file causes the features described below, to -;; be enabled in that buffer. Normally this would be done using a -;; major-mode but to allow the use of any major-mode, as the user sees -;; fit, it is done here by running a setup function, which among other -;; things turns on the preferred major-mode, by default `text-mode'. - -;; Git waits for the `$EDITOR' to finish and then either creates the -;; commit using the contents of the file as commit message, or, if the -;; editor process exited with a non-zero exit status, aborts without -;; creating a commit. Unfortunately Emacsclient (which is what Emacs -;; users should be using as `$EDITOR' or at least as `$GIT_EDITOR') -;; does not differentiate between "successfully" editing a file and -;; aborting; not out of the box that is. - -;; By making use of the `with-editor' package this package provides -;; both ways of finish an editing session. In either case the file -;; is saved, but Emacseditor's exit code differs. -;; -;; C-c C-c Finish the editing session successfully by returning -;; with exit code 0. Git then creates the commit using -;; the message it finds in the file. -;; -;; C-c C-k Aborts the edit editing session by returning with exit -;; code 1. Git then aborts the commit. - -;; Aborting the commit does not cause the message to be lost, but -;; relying solely on the file not being tampered with is risky. This -;; package additionally stores all aborted messages for the duration -;; of the current session (i.e. until you close Emacs). To get back -;; an aborted message use M-p and M-n while editing a message. -;; -;; M-p Replace the buffer contents with the previous message -;; from the message ring. Of course only after storing -;; the current content there too. -;; -;; M-n Replace the buffer contents with the next message from -;; the message ring, after storing the current content. - -;; Some support for pseudo headers as used in some projects is -;; provided by these commands: -;; -;; C-c C-s Insert a Signed-off-by header. -;; C-c C-a Insert a Acked-by header. -;; C-c C-m Insert a Modified-by header. -;; C-c C-t Insert a Tested-by header. -;; C-c C-r Insert a Reviewed-by header. -;; C-c C-o Insert a Cc header. -;; C-c C-p Insert a Reported-by header. -;; C-c C-i Insert a Suggested-by header. - -;; When Git requests a commit message from the user, it does so by -;; having her edit a file which initially contains some comments, -;; instructing her what to do, and providing useful information, such -;; as which files were modified. These comments, even when left -;; intact by the user, do not become part of the commit message. This -;; package ensures these comments are propertizes as such and further -;; prettifies them by using different faces for various parts, such as -;; files. - -;; Finally this package highlights style errors, like lines that are -;; too long, or when the second line is not empty. It may even nag -;; you when you attempt to finish the commit without having fixed -;; these issues. The style checks and many other settings can easily -;; be configured: -;; -;; M-x customize-group RET git-commit RET - -;;; Code: -;;;; Dependencies - -(require 'dash) -(require 'log-edit) -(require 'magit-git nil t) -(require 'magit-utils nil t) -(require 'ring) -(require 'server) -(require 'transient) -(require 'with-editor) - -(eval-when-compile - (require 'recentf) - (require 'subr-x)) - -;;;; Declarations - -(defvar diff-default-read-only) -(defvar flyspell-generic-check-word-predicate) -(defvar font-lock-beg) -(defvar font-lock-end) - -(declare-function magit-completing-read "magit-utils" - (prompt collection &optional predicate require-match - initial-input hist def fallback)) -(declare-function magit-expand-git-file-name "magit-git" (filename)) -(declare-function magit-git-lines "magit-git" (&rest args)) -(declare-function magit-list-local-branch-names "magit-git" ()) -(declare-function magit-list-remote-branch-names "magit-git" - (&optional remote relative)) - -;;; Options -;;;; Variables - -(defgroup git-commit nil - "Edit Git commit messages." - :prefix "git-commit-" - :link '(info-link "(magit)Editing Commit Messages") - :group 'tools) - -;;;###autoload -(define-minor-mode global-git-commit-mode - "Edit Git commit messages. -This global mode arranges for `git-commit-setup' to be called -when a Git commit message file is opened. That usually happens -when Git uses the Emacsclient as $GIT_EDITOR to have the user -provide such a commit message." - :group 'git-commit - :type 'boolean - :global t - :init-value t - :initialize (lambda (symbol exp) - (custom-initialize-default symbol exp) - (when global-git-commit-mode - (add-hook 'find-file-hook 'git-commit-setup-check-buffer))) - (if global-git-commit-mode - (add-hook 'find-file-hook 'git-commit-setup-check-buffer) - (remove-hook 'find-file-hook 'git-commit-setup-check-buffer))) - -(defcustom git-commit-major-mode 'text-mode - "Major mode used to edit Git commit messages. -The major mode configured here is turned on by the minor mode -`git-commit-mode'." - :group 'git-commit - :type '(choice (function-item text-mode) - (const :tag "No major mode"))) - -(defcustom git-commit-setup-hook - '(git-commit-save-message - git-commit-setup-changelog-support - git-commit-turn-on-auto-fill - git-commit-propertize-diff - bug-reference-mode - with-editor-usage-message) - "Hook run at the end of `git-commit-setup'." - :group 'git-commit - :type 'hook - :get (and (featurep 'magit-utils) 'magit-hook-custom-get) - :options '(git-commit-save-message - git-commit-setup-changelog-support - git-commit-turn-on-auto-fill - git-commit-turn-on-flyspell - git-commit-propertize-diff - bug-reference-mode - with-editor-usage-message)) - -(defcustom git-commit-post-finish-hook nil - "Hook run after the user finished writing a commit message. - -\\\ -This hook is only run after pressing \\[with-editor-finish] in a buffer used -to edit a commit message. If a commit is created without the -user typing a message into a buffer, then this hook is not run. - -This hook is not run until the new commit has been created. If -doing so takes Git longer than one second, then this hook isn't -run at all. For certain commands such as `magit-rebase-continue' -this hook is never run because doing so would lead to a race -condition. - -This hook is only run if `magit' is available. - -Also see `magit-post-commit-hook'." - :group 'git-commit - :type 'hook - :get (and (featurep 'magit-utils) 'magit-hook-custom-get)) - -(defcustom git-commit-finish-query-functions - '(git-commit-check-style-conventions) - "List of functions called to query before performing commit. - -The commit message buffer is current while the functions are -called. If any of them returns nil, then the commit is not -performed and the buffer is not killed. The user should then -fix the issue and try again. - -The functions are called with one argument. If it is non-nil, -then that indicates that the user used a prefix argument to -force finishing the session despite issues. Functions should -usually honor this wish and return non-nil." - :options '(git-commit-check-style-conventions) - :type 'hook - :group 'git-commit) - -(defcustom git-commit-style-convention-checks '(non-empty-second-line) - "List of checks performed by `git-commit-check-style-conventions'. -Valid members are `non-empty-second-line' and `overlong-summary-line'. -That function is a member of `git-commit-finish-query-functions'." - :options '(non-empty-second-line overlong-summary-line) - :type '(list :convert-widget custom-hook-convert-widget) - :group 'git-commit) - -(defcustom git-commit-summary-max-length 68 - "Column beyond which characters in the summary lines are highlighted. - -The highlighting indicates that the summary is getting too long -by some standards. It does in no way imply that going over the -limit a few characters or in some cases even many characters is -anything that deserves shaming. It's just a friendly reminder -that if you can make the summary shorter, then you might want -to consider doing so." - :group 'git-commit - :safe 'numberp - :type 'number) - -(defcustom git-commit-fill-column nil - "Override `fill-column' in commit message buffers. - -If this is non-nil, then it should be an integer. If that is the -case and the buffer-local value of `fill-column' is not already -set by the time `git-commit-turn-on-auto-fill' is called as a -member of `git-commit-setup-hook', then that function sets the -buffer-local value of `fill-column' to the value of this option. - -This option exists mostly for historic reasons. If you are not -already using it, then you probably shouldn't start doing so." - :group 'git-commit - :safe 'numberp - :type '(choice (const :tag "use regular fill-column") - number)) - -(make-obsolete-variable 'git-commit-fill-column 'fill-column - "Magit 2.11.0" 'set) - -(defcustom git-commit-known-pseudo-headers - '("Signed-off-by" "Acked-by" "Modified-by" "Cc" - "Suggested-by" "Reported-by" "Tested-by" "Reviewed-by" - "Co-authored-by") - "A list of Git pseudo headers to be highlighted." - :group 'git-commit - :safe (lambda (val) (and (listp val) (-all-p 'stringp val))) - :type '(repeat string)) - -;;;; Faces - -(defgroup git-commit-faces nil - "Faces used for highlighting Git commit messages." - :prefix "git-commit-" - :group 'git-commit - :group 'faces) - -(defface git-commit-summary - '((t :inherit font-lock-type-face)) - "Face used for the summary in commit messages." - :group 'git-commit-faces) - -(defface git-commit-overlong-summary - '((t :inherit font-lock-warning-face)) - "Face used for the tail of overlong commit message summaries." - :group 'git-commit-faces) - -(defface git-commit-nonempty-second-line - '((t :inherit font-lock-warning-face)) - "Face used for non-whitespace on the second line of commit messages." - :group 'git-commit-faces) - -(defface git-commit-keyword - '((t :inherit font-lock-string-face)) - "Face used for keywords in commit messages. -In this context a \"keyword\" is text surrounded be brackets." - :group 'git-commit-faces) - -(define-obsolete-face-alias 'git-commit-note - 'git-commit-keyword "Git-Commit 3.0.0") - -(defface git-commit-pseudo-header - '((t :inherit font-lock-string-face)) - "Face used for pseudo headers in commit messages." - :group 'git-commit-faces) - -(defface git-commit-known-pseudo-header - '((t :inherit font-lock-keyword-face)) - "Face used for the keywords of known pseudo headers in commit messages." - :group 'git-commit-faces) - -(defface git-commit-comment-branch-local - (if (featurep 'magit) - '((t :inherit magit-branch-local)) - '((t :inherit font-lock-variable-name-face))) - "Face used for names of local branches in commit message comments." - :group 'git-commit-faces) - -(define-obsolete-face-alias 'git-commit-comment-branch - 'git-commit-comment-branch-local "Git-Commit 2.12.0") - -(defface git-commit-comment-branch-remote - (if (featurep 'magit) - '((t :inherit magit-branch-remote)) - '((t :inherit font-lock-variable-name-face))) - "Face used for names of remote branches in commit message comments. -This is only used if Magit is available." - :group 'git-commit-faces) - -(defface git-commit-comment-detached - '((t :inherit git-commit-comment-branch-local)) - "Face used for detached `HEAD' in commit message comments." - :group 'git-commit-faces) - -(defface git-commit-comment-heading - '((t :inherit git-commit-known-pseudo-header)) - "Face used for headings in commit message comments." - :group 'git-commit-faces) - -(defface git-commit-comment-file - '((t :inherit git-commit-pseudo-header)) - "Face used for file names in commit message comments." - :group 'git-commit-faces) - -(defface git-commit-comment-action - '((t :inherit bold)) - "Face used for actions in commit message comments." - :group 'git-commit-faces) - -;;; Keymap - -(defvar git-commit-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "M-p") 'git-commit-prev-message) - (define-key map (kbd "M-n") 'git-commit-next-message) - (define-key map (kbd "C-c C-i") 'git-commit-insert-pseudo-header) - (define-key map (kbd "C-c C-a") 'git-commit-ack) - (define-key map (kbd "C-c M-i") 'git-commit-suggested) - (define-key map (kbd "C-c C-m") 'git-commit-modified) - (define-key map (kbd "C-c C-o") 'git-commit-cc) - (define-key map (kbd "C-c C-p") 'git-commit-reported) - (define-key map (kbd "C-c C-r") 'git-commit-review) - (define-key map (kbd "C-c C-s") 'git-commit-signoff) - (define-key map (kbd "C-c C-t") 'git-commit-test) - (define-key map (kbd "C-c M-s") 'git-commit-save-message) - map) - "Key map used by `git-commit-mode'.") - -;;; Menu - -(require 'easymenu) -(easy-menu-define git-commit-mode-menu git-commit-mode-map - "Git Commit Mode Menu" - '("Commit" - ["Previous" git-commit-prev-message t] - ["Next" git-commit-next-message t] - "-" - ["Ack" git-commit-ack :active t - :help "Insert an 'Acked-by' header"] - ["Sign-Off" git-commit-signoff :active t - :help "Insert a 'Signed-off-by' header"] - ["Modified-by" git-commit-modified :active t - :help "Insert a 'Modified-by' header"] - ["Tested-by" git-commit-test :active t - :help "Insert a 'Tested-by' header"] - ["Reviewed-by" git-commit-review :active t - :help "Insert a 'Reviewed-by' header"] - ["CC" git-commit-cc t - :help "Insert a 'Cc' header"] - ["Reported" git-commit-reported :active t - :help "Insert a 'Reported-by' header"] - ["Suggested" git-commit-suggested t - :help "Insert a 'Suggested-by' header"] - ["Co-authored-by" git-commit-co-authored t - :help "Insert a 'Co-authored-by' header"] - "-" - ["Save" git-commit-save-message t] - ["Cancel" with-editor-cancel t] - ["Commit" with-editor-finish t])) - -;;; Hooks - -;;;###autoload -(defconst git-commit-filename-regexp "/\\(\ -\\(\\(COMMIT\\|NOTES\\|PULLREQ\\|MERGEREQ\\|TAG\\)_EDIT\\|MERGE_\\|\\)MSG\ -\\|\\(BRANCH\\|EDIT\\)_DESCRIPTION\\)\\'") - -(eval-after-load 'recentf - '(add-to-list 'recentf-exclude git-commit-filename-regexp)) - -(add-to-list 'with-editor-file-name-history-exclude git-commit-filename-regexp) - -(defun git-commit-setup-font-lock-in-buffer () - (and buffer-file-name - (string-match-p git-commit-filename-regexp buffer-file-name) - (git-commit-setup-font-lock))) - -(add-hook 'after-change-major-mode-hook 'git-commit-setup-font-lock-in-buffer) - -;;;###autoload -(defun git-commit-setup-check-buffer () - (and buffer-file-name - (string-match-p git-commit-filename-regexp buffer-file-name) - (git-commit-setup))) - -(defvar git-commit-mode) - -(defun git-commit-file-not-found () - ;; cygwin git will pass a cygwin path (/cygdrive/c/foo/.git/...), - ;; try to handle this in window-nt Emacs. - (--when-let - (and (or (string-match-p git-commit-filename-regexp buffer-file-name) - (and (boundp 'git-rebase-filename-regexp) - (string-match-p git-rebase-filename-regexp - buffer-file-name))) - (not (file-accessible-directory-p - (file-name-directory buffer-file-name))) - (if (require 'magit-git nil t) - ;; Emacs prepends a "c:". - (magit-expand-git-file-name (substring buffer-file-name 2)) - ;; Fallback if we can't load `magit-git'. - (and (string-match "\\`[a-z]:/\\(cygdrive/\\)?\\([a-z]\\)/\\(.*\\)" - buffer-file-name) - (concat (match-string 2 buffer-file-name) ":/" - (match-string 3 buffer-file-name))))) - (when (file-accessible-directory-p (file-name-directory it)) - (let ((inhibit-read-only t)) - (insert-file-contents it t) - t)))) - -(when (eq system-type 'windows-nt) - (add-hook 'find-file-not-found-functions #'git-commit-file-not-found)) - -(defconst git-commit-usage-message "\ -Type \\[with-editor-finish] to finish, \ -\\[with-editor-cancel] to cancel, and \ -\\[git-commit-prev-message] and \\[git-commit-next-message] \ -to recover older messages") - -;;;###autoload -(defun git-commit-setup () - (when (fboundp 'magit-toplevel) - ;; `magit-toplevel' is autoloaded and defined in magit-git.el, - ;; That library declares this functions without loading - ;; magit-process.el, which defines it. - (require 'magit-process nil t)) - ;; Pretend that git-commit-mode is a major-mode, - ;; so that directory-local settings can be used. - (let ((default-directory - (or (and (not (file-exists-p ".dir-locals.el")) - ;; When $GIT_DIR/.dir-locals.el doesn't exist, - ;; fallback to $GIT_WORK_TREE/.dir-locals.el, - ;; because the maintainer can use the latter - ;; to enforce conventions, while s/he has no - ;; control over the former. - (fboundp 'magit-toplevel) ; silence byte-compiler - (magit-toplevel)) - default-directory))) - (let ((buffer-file-name nil) ; trick hack-dir-local-variables - (major-mode 'git-commit-mode)) ; trick dir-locals-collect-variables - (hack-dir-local-variables) - (hack-local-variables-apply))) - (when git-commit-major-mode - (let ((auto-mode-alist (list (cons (concat "\\`" - (regexp-quote buffer-file-name) - "\\'") - git-commit-major-mode))) - ;; The major-mode hook might want to consult these minor - ;; modes, while the minor-mode hooks might want to consider - ;; the major mode. - (git-commit-mode t) - (with-editor-mode t)) - (normal-mode t))) - ;; Show our own message using our hook. - (setq with-editor-show-usage nil) - (setq with-editor-usage-message git-commit-usage-message) - (unless with-editor-mode - ;; Maybe already enabled when using `shell-command' or an Emacs shell. - (with-editor-mode 1)) - (add-hook 'with-editor-finish-query-functions - 'git-commit-finish-query-functions nil t) - (add-hook 'with-editor-pre-finish-hook - 'git-commit-save-message nil t) - (add-hook 'with-editor-pre-cancel-hook - 'git-commit-save-message nil t) - (when (and (fboundp 'magit-rev-parse) - (not (memq last-command - '(magit-sequencer-continue - magit-sequencer-skip - magit-am-continue - magit-am-skip - magit-rebase-continue - magit-rebase-skip)))) - (add-hook 'with-editor-post-finish-hook - (apply-partially 'git-commit-run-post-finish-hook - (magit-rev-parse "HEAD")) - nil t) - (when (fboundp 'magit-wip-maybe-add-commit-hook) - (magit-wip-maybe-add-commit-hook))) - (setq with-editor-cancel-message - 'git-commit-cancel-message) - (make-local-variable 'log-edit-comment-ring-index) - (git-commit-mode 1) - (git-commit-setup-font-lock) - (when (boundp 'save-place) - (setq save-place nil)) - (save-excursion - (goto-char (point-min)) - (when (looking-at "\\`\\(\\'\\|\n[^\n]\\)") - (open-line 1))) - (with-demoted-errors "Error running git-commit-setup-hook: %S" - (run-hooks 'git-commit-setup-hook)) - (set-buffer-modified-p nil)) - -(defun git-commit-run-post-finish-hook (previous) - (when (and git-commit-post-finish-hook - (require 'magit nil t) - (fboundp 'magit-rev-parse)) - (cl-block nil - (let ((break (time-add (current-time) - (seconds-to-time 1)))) - (while (equal (magit-rev-parse "HEAD") previous) - (if (time-less-p (current-time) break) - (sit-for 0.01) - (message "No commit created after 1 second. Not running %s." - 'git-commit-post-finish-hook) - (cl-return)))) - (run-hooks 'git-commit-post-finish-hook)))) - -(define-minor-mode git-commit-mode - "Auxiliary minor mode used when editing Git commit messages. -This mode is only responsible for setting up some key bindings. -Don't use it directly, instead enable `global-git-commit-mode'." - :lighter "") - -(put 'git-commit-mode 'permanent-local t) - -(defun git-commit-setup-changelog-support () - "Treat ChangeLog entries as unindented paragraphs." - (setq-local fill-indent-according-to-mode t) - (setq-local paragraph-start (concat paragraph-start "\\|\\*\\|("))) - -(defun git-commit-turn-on-auto-fill () - "Unconditionally turn on Auto Fill mode. -If `git-commit-fill-column' is non-nil, and `fill-column' -doesn't already have a buffer-local value, then set that -to `git-commit-fill-column'." - (when (and (numberp git-commit-fill-column) - (not (local-variable-p 'fill-column))) - (setq fill-column git-commit-fill-column)) - (setq-local comment-auto-fill-only-comments nil) - (turn-on-auto-fill)) - -(defun git-commit-turn-on-flyspell () - "Unconditionally turn on Flyspell mode. -Also prevent comments from being checked and -finally check current non-comment text." - (require 'flyspell) - (turn-on-flyspell) - (setq flyspell-generic-check-word-predicate - 'git-commit-flyspell-verify) - (let ((end) - (comment-start-regex (format "^\\(%s\\|$\\)" comment-start))) - (save-excursion - (goto-char (point-max)) - (while (and (not (bobp)) (looking-at comment-start-regex)) - (forward-line -1)) - (unless (looking-at comment-start-regex) - (forward-line)) - (setq end (point))) - (flyspell-region (point-min) end))) - -(defun git-commit-flyspell-verify () - (not (= (char-after (line-beginning-position)) - (aref comment-start 0)))) - -(defun git-commit-finish-query-functions (force) - (run-hook-with-args-until-failure - 'git-commit-finish-query-functions force)) - -(defun git-commit-check-style-conventions (force) - "Check for violations of certain basic style conventions. - -For each violation ask the user if she wants to proceed anyway. -Option `git-commit-check-style-conventions' controls which -conventions are checked." - (or force - (save-excursion - (goto-char (point-min)) - (re-search-forward (git-commit-summary-regexp) nil t) - (if (equal (match-string 1) "") - t ; Just try; we don't know whether --allow-empty-message was used. - (and (or (not (memq 'overlong-summary-line - git-commit-style-convention-checks)) - (equal (match-string 2) "") - (y-or-n-p "Summary line is too long. Commit anyway? ")) - (or (not (memq 'non-empty-second-line - git-commit-style-convention-checks)) - (not (match-string 3)) - (y-or-n-p "Second line is not empty. Commit anyway? "))))))) - -(defun git-commit-cancel-message () - (message - (concat "Commit canceled" - (and (memq 'git-commit-save-message with-editor-pre-cancel-hook) - ". Message saved to `log-edit-comment-ring'")))) - -;;; History - -(defun git-commit-prev-message (arg) - "Cycle backward through message history, after saving current message. -With a numeric prefix ARG, go back ARG comments." - (interactive "*p") - (when (and (git-commit-save-message) (> arg 0)) - (setq log-edit-comment-ring-index - (log-edit-new-comment-index - arg (ring-length log-edit-comment-ring)))) - (save-restriction - (goto-char (point-min)) - (narrow-to-region (point) - (if (re-search-forward (concat "^" comment-start) nil t) - (max 1 (- (point) 2)) - (point-max))) - (log-edit-previous-comment arg))) - -(defun git-commit-next-message (arg) - "Cycle forward through message history, after saving current message. -With a numeric prefix ARG, go forward ARG comments." - (interactive "*p") - (git-commit-prev-message (- arg))) - -(defun git-commit-save-message () - "Save current message to `log-edit-comment-ring'." - (interactive) - (when-let ((message (git-commit-buffer-message))) - (when-let ((index (ring-member log-edit-comment-ring message))) - (ring-remove log-edit-comment-ring index)) - (ring-insert log-edit-comment-ring message))) - -(defun git-commit-buffer-message () - (let ((flush (concat "^" comment-start)) - (str (buffer-substring-no-properties (point-min) (point-max)))) - (with-temp-buffer - (insert str) - (goto-char (point-min)) - (when (re-search-forward (concat flush " -+ >8 -+$") nil t) - (delete-region (point-at-bol) (point-max))) - (goto-char (point-min)) - (flush-lines flush) - (goto-char (point-max)) - (unless (eq (char-before) ?\n) - (insert ?\n)) - (setq str (buffer-string))) - (unless (string-match "\\`[ \t\n\r]*\\'" str) - (when (string-match "\\`\n\\{2,\\}" str) - (setq str (replace-match "\n" t t str))) - (when (string-match "\n\\{2,\\}\\'" str) - (setq str (replace-match "\n" t t str))) - str))) - -;;; Headers - -(define-transient-command git-commit-insert-pseudo-header () - "Insert a commit message pseudo header." - [["Insert ... by yourself" - ("a" "Ack" git-commit-ack) - ("m" "Modified" git-commit-modified) - ("r" "Reviewed" git-commit-review) - ("s" "Signed-off" git-commit-signoff) - ("t" "Tested" git-commit-test)] - ["Insert ... by someone" - ("C-c" "Cc" git-commit-cc) - ("C-r" "Reported" git-commit-reported) - ("C-i" "Suggested" git-commit-suggested) - ("C-a" "Co-authored" git-commit-co-authored)]]) - -(defun git-commit-ack (name mail) - "Insert a header acknowledging that you have looked at the commit." - (interactive (git-commit-self-ident)) - (git-commit-insert-header "Acked-by" name mail)) - -(defun git-commit-modified (name mail) - "Insert a header to signal that you have modified the commit." - (interactive (git-commit-self-ident)) - (git-commit-insert-header "Modified-by" name mail)) - -(defun git-commit-review (name mail) - "Insert a header acknowledging that you have reviewed the commit." - (interactive (git-commit-self-ident)) - (git-commit-insert-header "Reviewed-by" name mail)) - -(defun git-commit-signoff (name mail) - "Insert a header to sign off the commit." - (interactive (git-commit-self-ident)) - (git-commit-insert-header "Signed-off-by" name mail)) - -(defun git-commit-test (name mail) - "Insert a header acknowledging that you have tested the commit." - (interactive (git-commit-self-ident)) - (git-commit-insert-header "Tested-by" name mail)) - -(defun git-commit-cc (name mail) - "Insert a header mentioning someone who might be interested." - (interactive (git-commit-read-ident "Cc")) - (git-commit-insert-header "Cc" name mail)) - -(defun git-commit-reported (name mail) - "Insert a header mentioning the person who reported the issue." - (interactive (git-commit-read-ident "Reported-by")) - (git-commit-insert-header "Reported-by" name mail)) - -(defun git-commit-suggested (name mail) - "Insert a header mentioning the person who suggested the change." - (interactive (git-commit-read-ident "Suggested-by")) - (git-commit-insert-header "Suggested-by" name mail)) - -(defun git-commit-co-authored (name mail) - "Insert a header mentioning the person who co-authored the commit." - (interactive (git-commit-read-ident "Co-authored-by")) - (git-commit-insert-header "Co-authored-by" name mail)) - -(defun git-commit-self-ident () - (list (or (getenv "GIT_AUTHOR_NAME") - (getenv "GIT_COMMITTER_NAME") - (ignore-errors (car (process-lines "git" "config" "user.name"))) - user-full-name - (read-string "Name: ")) - (or (getenv "GIT_AUTHOR_EMAIL") - (getenv "GIT_COMMITTER_EMAIL") - (getenv "EMAIL") - (ignore-errors (car (process-lines "git" "config" "user.email"))) - (read-string "Email: ")))) - -(defvar git-commit-read-ident-history nil) - -(defun git-commit-read-ident (prompt) - (if (require 'magit-git nil t) - (let ((str (magit-completing-read - prompt - (sort (delete-dups - (magit-git-lines "log" "-n9999" "--format=%aN <%ae>")) - 'string<) - nil nil nil 'git-commit-read-ident-history))) - (save-match-data - (if (string-match "\\`\\([^<]+\\) *<\\([^>]+\\)>\\'" str) - (list (save-match-data (string-trim (match-string 1 str))) - (string-trim (match-string 2 str))) - (user-error "Invalid input")))) - (list (read-string "Name: ") - (read-string "Email: ")))) - -(defun git-commit-insert-header (header name email) - (setq header (format "%s: %s <%s>" header name email)) - (save-excursion - (goto-char (point-max)) - (cond ((re-search-backward "^[-a-zA-Z]+: [^<]+? <[^>]+>" nil t) - (end-of-line) - (insert ?\n header) - (unless (= (char-after) ?\n) - (insert ?\n))) - (t - (while (re-search-backward (concat "^" comment-start) nil t)) - (unless (looking-back "\n\n" nil) - (insert ?\n)) - (insert header ?\n))) - (unless (or (eobp) (= (char-after) ?\n)) - (insert ?\n)))) - -;;; Font-Lock - -(defvar-local git-commit-need-summary-line t - "Whether the text should have a heading that is separated from the body. - -For commit messages that is a convention that should not -be violated. For notes it is up to the user. If you do -not want to insist on an empty second line here, then use -something like: - - (add-hook \\='git-commit-setup-hook - (lambda () - (when (equal (file-name-nondirectory (buffer-file-name)) - \"NOTES_EDITMSG\") - (setq git-commit-need-summary-line nil))))") - -(defun git-commit-summary-regexp () - (if git-commit-need-summary-line - (concat - ;; Leading empty lines and comments - (format "\\`\\(?:^\\(?:\\s-*\\|%s.*\\)\n\\)*" comment-start) - ;; Summary line - (format "\\(.\\{0,%d\\}\\)\\(.*\\)" git-commit-summary-max-length) - ;; Non-empty non-comment second line - (format "\\(?:\n%s\\|\n\\(.+\\)\\)?" comment-start)) - "\\(EASTER\\) \\(EGG\\)")) - -(defun git-commit-extend-region-summary-line () - "Identify the multiline summary-regexp construct. -Added to `font-lock-extend-region-functions'." - (save-excursion - (save-match-data - (goto-char (point-min)) - (when (looking-at (git-commit-summary-regexp)) - (let ((summary-beg (match-beginning 0)) - (summary-end (match-end 0))) - (when (or (< summary-beg font-lock-beg summary-end) - (< summary-beg font-lock-end summary-end)) - (setq font-lock-beg (min font-lock-beg summary-beg)) - (setq font-lock-end (max font-lock-end summary-end)))))))) - -(defvar-local git-commit--branch-name-regexp nil) - -(defconst git-commit-comment-headings - '("Changes to be committed:" - "Untracked files:" - "Changed but not updated:" - "Changes not staged for commit:" - "Unmerged paths:" - "Author:" - "Date:")) - -(defconst git-commit-font-lock-keywords-1 - '(;; Pseudo headers - (eval . `(,(format "^\\(%s:\\)\\( .*\\)" - (regexp-opt git-commit-known-pseudo-headers)) - (1 'git-commit-known-pseudo-header) - (2 'git-commit-pseudo-header))) - ("^[-a-zA-Z]+: [^<]+? <[^>]+>" - (0 'git-commit-pseudo-header)) - ;; Summary - (eval . `(,(git-commit-summary-regexp) - (1 'git-commit-summary))) - ;; - Keyword [aka "text in brackets"] (overrides summary) - ("\\[.+?\\]" - (0 'git-commit-keyword t)) - ;; - Non-empty second line (overrides summary and note) - (eval . `(,(git-commit-summary-regexp) - (2 'git-commit-overlong-summary t t) - (3 'git-commit-nonempty-second-line t t))))) - -(defconst git-commit-font-lock-keywords-2 - `(,@git-commit-font-lock-keywords-1 - ;; Comments - (eval . `(,(format "^%s.*" comment-start) - (0 'font-lock-comment-face append))) - (eval . `(,(format "^%s On branch \\(.*\\)" comment-start) - (1 'git-commit-comment-branch-local t))) - (eval . `(,(format "^%s \\(HEAD\\) detached at" comment-start) - (1 'git-commit-comment-detached t))) - (eval . `(,(format "^%s %s" comment-start - (regexp-opt git-commit-comment-headings t)) - (1 'git-commit-comment-heading t))) - (eval . `(,(format "^%s\t\\(?:\\([^:\n]+\\):\\s-+\\)?\\(.*\\)" comment-start) - (1 'git-commit-comment-action t t) - (2 'git-commit-comment-file t))))) - -(defconst git-commit-font-lock-keywords-3 - `(,@git-commit-font-lock-keywords-2 - ;; More comments - (eval - ;; Your branch is ahead of 'master' by 3 commits. - ;; Your branch is behind 'master' by 2 commits, and can be fast-forwarded. - . `(,(format - "^%s Your branch is \\(?:ahead\\|behind\\) of '%s' by \\([0-9]*\\)" - comment-start git-commit--branch-name-regexp) - (1 'git-commit-comment-branch-local t) - (2 'git-commit-comment-branch-remote t) - (3 'bold t))) - (eval - ;; Your branch is up to date with 'master'. - ;; Your branch and 'master' have diverged, - . `(,(format - "^%s Your branch \\(?:is up-to-date with\\|and\\) '%s'" - comment-start git-commit--branch-name-regexp) - (1 'git-commit-comment-branch-local t) - (2 'git-commit-comment-branch-remote t))) - (eval - ;; and have 1 and 2 different commits each, respectively. - . `(,(format - "^%s and have \\([0-9]*\\) and \\([0-9]*\\) commits each" - comment-start) - (1 'bold t) - (2 'bold t))))) - -(defvar git-commit-font-lock-keywords git-commit-font-lock-keywords-2 - "Font-Lock keywords for Git-Commit mode.") - -(defun git-commit-setup-font-lock () - (let ((table (make-syntax-table (syntax-table)))) - (when comment-start - (modify-syntax-entry (string-to-char comment-start) "." table)) - (modify-syntax-entry ?# "." table) - (modify-syntax-entry ?\" "." table) - (modify-syntax-entry ?\' "." table) - (modify-syntax-entry ?` "." table) - (set-syntax-table table)) - (setq-local comment-start - (or (ignore-errors - (car (process-lines "git" "config" "core.commentchar"))) - "#")) - (setq-local comment-start-skip (format "^%s+[\s\t]*" comment-start)) - (setq-local comment-end-skip "\n") - (setq-local comment-use-syntax nil) - (setq-local git-commit--branch-name-regexp - (if (and (featurep 'magit-git) - ;; When using cygwin git, we may end up in a - ;; non-existing directory, which would cause - ;; any git calls to signal an error. - (file-accessible-directory-p default-directory)) - (progn - ;; Make sure the below functions are available. - (require 'magit) - ;; Font-Lock wants every submatch to succeed, - ;; so also match the empty string. Do not use - ;; `regexp-quote' because that is slow if there - ;; are thousands of branches outweighing the - ;; benefit of an efficient regep. - (format "\\(\\(?:%s\\)\\|\\)\\(\\(?:%s\\)\\|\\)" - (mapconcat #'identity - (magit-list-local-branch-names) - "\\|") - (mapconcat #'identity - (magit-list-remote-branch-names) - "\\|"))) - "\\([^']*\\)")) - (setq-local font-lock-multiline t) - (add-hook 'font-lock-extend-region-functions - #'git-commit-extend-region-summary-line - t t) - (font-lock-add-keywords nil git-commit-font-lock-keywords)) - -(defun git-commit-propertize-diff () - (require 'diff-mode) - (save-excursion - (goto-char (point-min)) - (when (re-search-forward "^diff --git" nil t) - (beginning-of-line) - (let ((buffer (current-buffer))) - (insert - (with-temp-buffer - (insert - (with-current-buffer buffer - (prog1 (buffer-substring-no-properties (point) (point-max)) - (delete-region (point) (point-max))))) - (let ((diff-default-read-only nil)) - (diff-mode)) - (let (font-lock-verbose font-lock-support-mode) - (if (fboundp 'font-lock-ensure) - (font-lock-ensure) - (with-no-warnings - (font-lock-fontify-buffer)))) - (let (next (pos (point-min))) - (while (setq next (next-single-property-change pos 'face)) - (put-text-property pos next 'font-lock-face - (get-text-property pos 'face)) - (setq pos next)) - (put-text-property pos (point-max) 'font-lock-face - (get-text-property pos 'face))) - (buffer-string))))))) - -;;; Elisp Text Mode - -(define-derived-mode git-commit-elisp-text-mode text-mode "ElText" - "Major mode for editing commit messages of elisp projects. -This is intended for use as `git-commit-major-mode' for projects -that expect `symbols' to look like this. I.e. like they look in -Elisp doc-strings, including this one. Unlike in doc-strings, -\"strings\" also look different than the other text." - (setq font-lock-defaults '(git-commit-elisp-text-mode-keywords))) - -(defvar git-commit-elisp-text-mode-keywords - `((,(concat "[`‘]\\(" lisp-mode-symbol-regexp "\\)['’]") - (1 font-lock-constant-face prepend)) - ("\"[^\"]*\"" (0 font-lock-string-face prepend)))) - -;;; _ -(provide 'git-commit) -;;; git-commit.el ends here diff --git a/elpa/git-commit-20200207.1819/git-commit.elc b/elpa/git-commit-20200207.1819/git-commit.elc deleted file mode 100644 index dd75e9feb412976d6753393a51bb37ba2eccdc23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35478 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 Qrh~yhgCg(yMK;#{FX}xl!2kdN diff --git a/elpa/gntp-20141025.250/gntp-autoloads.el b/elpa/gntp-20141025.250/gntp-autoloads.el deleted file mode 100644 index 2cf59a2b..00000000 --- a/elpa/gntp-20141025.250/gntp-autoloads.el +++ /dev/null @@ -1,28 +0,0 @@ -;;; gntp-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "gntp" "gntp.el" (0 0 0 0)) -;;; Generated autoloads from gntp.el - -(autoload 'gntp-notify "gntp" "\ -Send notification NAME with TITLE, TEXT, PRIORITY and ICON to SERVER:PORT. -PORT defaults to `gntp-server-port' - -\(fn NAME TITLE TEXT SERVER &optional PORT PRIORITY ICON)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "gntp" '("gntp-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; gntp-autoloads.el ends here diff --git a/elpa/gntp-20141025.250/gntp-pkg.el b/elpa/gntp-20141025.250/gntp-pkg.el deleted file mode 100644 index 07dfec64..00000000 --- a/elpa/gntp-20141025.250/gntp-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "gntp" "20141025.250" "Growl Notification Protocol for Emacs" 'nil :commit "767571135e2c0985944017dc59b0be79af222ef5" :authors '(("Engelke Eschner" . "tekai@gmx.li")) :maintainer '("Engelke Eschner" . "tekai@gmx.li")) diff --git a/elpa/gntp-20141025.250/gntp.el b/elpa/gntp-20141025.250/gntp.el deleted file mode 100644 index d7c729fa..00000000 --- a/elpa/gntp-20141025.250/gntp.el +++ /dev/null @@ -1,243 +0,0 @@ -;;; gntp.el --- Growl Notification Protocol for Emacs -*- lexical-binding: t -*- - -;; Author: Engelke Eschner -;; Version: 0.1 -;; Package-Version: 20141025.250 -;; Created: 2013-03-21 - -;; LICENSE -;; Copyright (c) 2013 Engelke Eschner -;; All rights reserved. - -;; Redistribution and use in source and binary forms, with or without -;; modification, are permitted provided that the following conditions -;; are met: -;; * Redistributions of source code must retain the above copyright -;; notice, this list of conditions and the following disclaimer. -;; * Redistributions in binary form must reproduce the above -;; copyright notice, this list of conditions and the following -;; disclaimer in the documentation and/or other materials provided -;; with the distribution. -;; * Neither the name of the gntp.el nor the names of its -;; contributors may be used to endorse or promote products derived -;; from this software without specific prior written permission. - -;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -;; OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -;;; Commentary: -;; This package implements the Growl Notification Protocol GNTP -;; described at http://www.growlforwindows.com/gfw/help/gntp.aspx -;; It is incomplete as it only lets you send but not receive -;; notifications. - -;;; Code: - -(defgroup gntp nil - "GNTP, send/register growl notifications via GNTP from within emacs." - :group 'external) - -(defcustom gntp-application-name "Emacs/gntp.el" - "Name of the application gntp registers itself." - :type '(string)) - -(defcustom gntp-application-icon nil - "Icon to display as the application icon. -Either a URL or a path to a file." - :type '(string)) - -(defcustom gntp-server "localhost" - "Default port of the server. -Standard says can't be changed, but port-forwarding etc." - :type '(string)) - -(defcustom gntp-server-port 23053 - "Default port of the server. -Standard says can't be changed, but port-forwarding etc." - :type '(integer)) - -(defcustom gntp-register-alist nil - "Registration item list." - :type '(choice string (const nil))) - -(defun gntp-register (&optional notifications server port) - (interactive) - "Register NOTIFICATIONS at SERVER:PORT. -PORT defaults to `gntp-server-port'." - (let ((message (gntp-build-message-register (if notifications notifications gntp-register-alist)))) - (gntp-send message (if server server gntp-server) port))) - -;;;###autoload -(defun gntp-notify (name title text server &optional port priority icon) - "Send notification NAME with TITLE, TEXT, PRIORITY and ICON to SERVER:PORT. -PORT defaults to `gntp-server-port'" - (let ((message (gntp-build-message-notify name title text priority icon))) - (gntp-send message server port))) - -(defun gntp-build-message-register (notifications) - "Build the message to register NOTIFICATIONS types." - (let ((lines (list "GNTP/1.0 REGISTER NONE" - (format "Application-Name: %s" - gntp-application-name) - (format "Notifications-Count: %d" - (length notifications)))) - (icon-uri (gntp-app-icon-uri)) - (icon-data (gntp-app-icon-data)) - (icons (list))) - - ;; append icon uri - (when icon-uri - (nconc lines (list (format "Application-Icon: %s" icon-uri))) - ;; and data when it exists - (when icon-data - (setq icons (cons icon-data icons)))) - - (dolist (notice notifications) - ;; "For each notification being registered: - ;; Each notification being registered should be seperated by a - ;; blank line, including the first notification - (nconc lines (cons "" (gntp-notification-lines notice))) - ;; c - (let ((icon (gntp-notice-icon-data notice))) - (when icon - (nconc icons (list "" icon))))) - - ;; icon data must come last - (when icons - (nconc lines (cons "" icons))) - - (mapconcat 'identity (remove nil lines) "\r\n"))) - -(defun gntp-notification-lines (notice) - "Transform NOTICE into a list of strings." - (let ((display-name (gntp-notice-get notice :display)) - (enabled (gntp-notice-get notice :enabled)) - (icon-uri (gntp-notice-icon-uri notice))) - (list - ;; Required - The name (type) of the notification being registered - (concat "Notification-Name: " (gntp-notice-name notice)) - ;; Optional - The name of the notification that is displayed to - ;; the user (defaults to the same value as Notification-Name) - (when display-name - (concat "Notification-Display-Name: " display-name)) - ;; Optional - Indicates if the notification should be enabled by - ;; default (defaults to False) - (when enabled - "Notification-Enabled: True") - ;; Optional - The default icon to use for notifications of this type - (when icon-uri - (concat "Notification-Icon: " icon-uri))))) - -(defun gntp-build-message-notify (name title text &optional priority icon) - "Build a message of type NAME with TITLE and TEXT." - - (format - "GNTP/1.0 NOTIFY NONE\r\n\ -Application-Name: %s\r\n\ -Notification-Name: %s\r\n\ -Notification-Title: %s\r\n\ -Notification-Text: %s\r\n\ -Notification-Priority: %s\r\n\ -Notification-Icon: %s\r\n\ -\r\n" - gntp-application-name - (if (symbolp name) (symbol-name name) name) - title - ;; no CRLF in the text to avoid accidentel msg end - (replace-regexp-in-string "\r\n" "\n" text) - (if priority priority "0") - (if icon (gntp-icon-uri icon) ""))) - -;; notice -;;(list name ; everthing else is optional -;; :display "name to display" -;; :enabled nil -;; :icon "url or file") - - -(defun gntp-notice-icon-uri (notice) - "Get the icon URI from NOTICE." - (gntp-icon-uri (gntp-notice-get notice :icon))) - -(defun gntp-notice-icon-data (notice) - "Get icon data from NOTICE." - (gntp-icon-data (gntp-notice-get notice :icon))) - -(defun gntp-app-icon-uri () - "Return the value to be used in the Application-Icon header." - (gntp-icon-uri gntp-application-icon)) - -(defun gntp-app-icon-data () - "Return the value to be used in the Application-Icon header." - (gntp-icon-data gntp-application-icon)) - -(defun gntp-icon-uri (icon) - "Get the URI of ICON." - (when icon - (cond ((string-equal (substring icon 0 7) "http://") icon) - ((and (file-exists-p icon) (file-readable-p icon)) - (concat "x-growl-resource://" (md5 icon)))))) - -(defun gntp-icon-data (icon) - "Get the URI of ICON." - (when (and icon (not (string-equal (substring icon 0 7) "http://")) - (file-exists-p icon) (file-readable-p icon)) - (let ((id (md5 icon)) - (data (gntp-file-string icon))) - (format "Identifier: %s\r\nLength: %d\r\n\r\n%s" - id (length data) data)))) - -(defun gntp-notice-name (notice) - "Get the name of NOTICE. The name must be either a symbol or string." - (let ((name (car notice))) - (if (symbolp name) - (symbol-name name) - name))) - -(defun gntp-notice-get (notice property) - "Get PROPERTY from NOTICE." - (plist-get (cdr notice) property)) - -(defun gntp-send (message server &optional port) - "Send MESSAGE to SERVER:PORT. PORT defaults to `gntp-server-port'." - (let ((proc (make-network-process - :name "gntp" - :host server - :server nil - :service (if port port gntp-server-port) - ;;:sentinel 'gntp-sentinel - :filter 'gntp-filter))) - ;; hmm one CRLF too much? - (process-send-string proc (concat message "\r\n\r\n\r\n")))) - -(defun gntp-filter (proc string) - "Filter for PROC started by `gntp-send'. -Argument STRING reply from the server." - (when (string-equal "GNTP/1.0 -ERROR" (substring string 0 15)) - (error "GNTP: Something went wrong take a look at the reply:\n %s" - string))) - -;; (defun gntp-sentinel (proc msg) -;; (when (string= msg "connection broken by remote peer\n") -;; (message (format "client %s has quit" proc)))) - - -(defun gntp-file-string (file) - "Read the contents of a FILE and return as a string." - (with-temp-buffer - (insert-file-contents-literally file) - (buffer-string))) - -(provide 'gntp) - -;;; gntp.el ends here diff --git a/elpa/gntp-20141025.250/gntp.elc b/elpa/gntp-20141025.250/gntp.elc deleted file mode 100644 index bb1b17461664e22c57d866bbb9be351a3b66b752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5974 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 diff --git a/elpa/gnupg/trustdb.gpg b/elpa/gnupg/trustdb.gpg deleted file mode 100644 index 2138feef7598e7c17aa68a9f7264ca910c8df04c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1200 zcmZQfFGy!*W@Ke#Vql1U6uOB4J7DC(E{-8OstzMazyhP;G8!(R5ExAdl%)dzRssaL diff --git a/elpa/google-translate-20190620.1416/.bump-version.el b/elpa/google-translate-20190620.1416/.bump-version.el deleted file mode 100644 index 58fa1190..00000000 --- a/elpa/google-translate-20190620.1416/.bump-version.el +++ /dev/null @@ -1,10 +0,0 @@ -((:files - ("google-translate.el" - "google-translate-core.el" - "google-translate-tk.el" - "google-translate-core-ui.el" - "google-translate-default-ui.el" - "google-translate-pkg.el" - "google-translate-smooth-ui.el" - "Makefile")) - (:current-version "0.11.18")) diff --git a/elpa/google-translate-20190620.1416/.bump-version.elc b/elpa/google-translate-20190620.1416/.bump-version.elc deleted file mode 100644 index f08d7b8f8b220b5e290720826a0f1802da81adfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684 zcmbtSO>e?54CUNEu&e0_BwF=D+JK%W!~tnLZMU(5NlY7&CMaSi<=MO9V7%C<+PN%jwAVBMnd@J7xnYoNGI%N}`G+yH6~_Qp2i^YY8v_ZpI24M|jAa}e^ z=AmMe`=`}r1EN8Pg2RZj-X4tvZ$Y4e9f7v^$K-nz4}?xDa==X>7Uh?3IKfqM9^l%D zqG+-^F(txEf_PhIS;#zOF&=M=>@J3v$?|+(50kjIw$_xeL*q3vrKDrHs0J-J1o7dY zo}^O)sH8o1nuiI;Lp{*yTWh)b?R>-oo!5z{Q&@`5IWnC5e7QJF^E}Px@hg - -;; Author: Oleksandr Manzyuk -;; Maintainer: Andrey Tykhonov -;; URL: https://github.com/atykhonov/google-translate -;; Version: 0.11.17 -;; Keywords: convenience - -;; This file is NOT part of GNU Emacs. - -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Provide backend facilities to cope with google translate. - -;;; Code: - -(defvar google-translate-backend-method 'emacs - "The backend method for URL retrieve. - -Valid symbols are below: - - - emacs: use built in `url-retrieve-synchronously' - - curl: invoke curl command - - wget: invoke wget command - -and any other keys of `google-translate-backend-commands'.") - -(defvar google-translate-backend-user-agent "Emacs" - "The user agent string for HTTP request header.") - -(defvar google-translate-backend-commands - '((curl :args ("-s" "-L" "-A")) - (wget :args ("-q" "-O" "-" "-U"))) - "An alist of external program specifications. - -The form of each element is (KEY P-LIST). The variable -`google-translate-backend-method' may have one of KEYs and is -used for determine the command to execute. The P-LIST of each -element represents command specific information. - -Available properties: - - - Property `:name': the program name(optional) - - Property `:args': a list of arguments passed to the program - -If you omit the `:name' property, (symbol-name KEY) will be used -as the program name. The `:args' property must be composed to -satisfy all the following conditions: - - - Output content to standard output - - Suppress non-content(HTTP headers, progress messages, etc) - - Handle location response header - - Place User-Agent option at last - -So if you would like to use another program \"foo\", for example: - -\(push \\='(foo :name \"foo-x86\" - :args (\"-q\" \"--agent\")) - google-translate-backend-commands) - -\(setq google-translate-backend-method \\='foo) - -And the command line looks like: - -foo-x86 -q --agent ['google-translate-backend-user-agent] [URL]") - -(defvar google-translate-backend-debug nil - "Non-nil means log http activities to the *google-translate-debug* buffer.") - -(defun google-translate-backend--log (&rest args) - "Log http activities to the *google-translate-debug* buffer along with ARGS. - -Disabled if `google-translate-backend-debug' is nil." - (when google-translate-backend-debug - (let ((message (mapconcat 'identity - (list (current-time-string) - (prin1-to-string args) - "-- begin --" - (buffer-string) - "-- end --") - "\n"))) - (with-current-buffer - (get-buffer-create "*google-translate-backend-debug*") - (goto-char (point-max)) - (insert message) - (newline))))) - -(defun google-translate-backend--emacs (url) - "Get URL contents by `url-retrieve-synchronously'." - (insert - (let ((url-user-agent google-translate-backend-user-agent)) - (with-current-buffer (url-retrieve-synchronously url) - (set-buffer-multibyte t) - (google-translate-backend--log url 'emacs) - (goto-char (point-min)) - (re-search-forward "\n\n") - (prog1 (buffer-substring (point) - (point-max)) - (kill-buffer)))))) - -(defun google-translate-backend--process (url key spec) - "Get URL contents by `call-process'. - -\(KEY SPEC) would be exist in `google-translate-backend-commands'." - (let ((name (or (plist-get spec :name) - (symbol-name key))) - (args (plist-get spec :args)) - (agent google-translate-backend-user-agent)) - (apply 'call-process - (append (list name nil t nil) - args - (list agent url))) - (google-translate-backend--log url key spec))) - -(defun google-translate-backend-retrieve (url) - "Get URL contents via `google-translate-backend-method'." - (let ((method google-translate-backend-method)) - (if (eq method 'emacs) - (google-translate-backend--emacs url) - (let ((spec (cdr (assq method - google-translate-backend-commands)))) - (if (null spec) - (error "Unknown backend method: %s" method) - (google-translate-backend--process url method spec)))))) - -(provide 'google-translate-backend) -;;; google-translate-backend.el ends here diff --git a/elpa/google-translate-20190620.1416/google-translate-backend.elc b/elpa/google-translate-20190620.1416/google-translate-backend.elc deleted file mode 100644 index 3f00a9e69030b0131b23968d286cbf89ee9d64d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3937 zcmbtX@o&>c6z(sRsL>F=O>As?xNJ!}T*XO~lp>^6zyPfph?YrHQ>hpGl32BUuJ4?Z z?VsQG?(D9pq*No4lh}8;d++<+_ub2r7yHk?SzBB4o;-O%&s0_;}oF|&5ScNJrHO0$ZWJyG^inJ+{e5M~^ zwA6+~9Ltz4b_pME^&VeYBUV@=SB4^$8-dA{nFc#}k_USS&tAW#Xf8?-8HD)AZZGnf zw4zAlG?A1l@zExADw?Dy(?phJ=9t*)yL|z{7ri)uFMWBQxAAMQKcK_8q=|@5B@)V{ znX8zls-*Yt_NkOWQZ6K-{!^q05?*E#m1+_tej`(LzUz4ukYxIHnFpFwNopAEld4RE zW`RI2^JreGTva+r zHKmi8QnOSBrWCnOg^@v>Qc$m|TU$SR?O0A1qNJ6R>-<|bA!=_tq%GR+KJIjY)%K2s z3Q3kEW->SA>dd0`>hSO_;5w@$3T`e@4CPJsUXcD8XE$RFrB~ii~t2qhy*y7usMxL11QQi)c{`J$X@%oo(ajRzHjr>PK{Q$!-1SG}6&y`IuiRiv`S*nxV_CaC2j zYCF*cyfH)8q4NZm2Gd~7JfSZyNIa{C=w#Q1bFma<6>0##LrE9P1>k#(!lfc`+;Yh?rDEO zyqgQ7*X{M4YxYCh|KD3fOA7k2&Bxxmmj^JL=ZR*kfzw@g)Yy1h?6ZiewtpBm6uz3k zfFasAYX1zapjCnYbjZIo?sW$nYvX>mk82y(fbce4e}MPVxF2?L8;0ZFVDuHf^ftaN z@qxMF_Jgx=FYLw>ejn$N{pg1S+QgD0pN_7e-kg&TOb(zCHvGPT1whM`#PET{Ecu`= z@ijm@CWHF?E6{C)flN)JMMiFSdzm)gEGO>h)k(~aDeDc2N$E3CyN-2><#D0h(K zyCv#@gSUrX0>72dUTnVU>NOdG!I~~=X_3pG3M+P=U2VxG4&e?hQpzwAna~`nu7?fd;sr` zaB#GsD%*`5ynXQuN22w5oNe+0H#*!uuB_C?znYHjvl6SfWSOzup=Y#R6F3Az!&?na zOc^v6cCF0#IV6UZzq|iEGlk14>}z}(;2QGhZ{z9hJ9nRNU>*yuACB(aUB9*QOU)~bIBOj#5~3Qb;umGFr5#isZSy(0=NDhHa>6xnRI&(*Vb>3d;Q@a@D1TQSbKHD8W>|KAvuLI(Txe&($q{{lWFHlAET`Y_+&QIjbiJPBgMC(T(`; r^V3|N - -;; Author: Oleksandr Manzyuk -;; Maintainer: Andrey Tykhonov -;; URL: https://github.com/atykhonov/google-translate -;; Version: 0.11.18 -;; Keywords: convenience - -;; Contributors: -;; Tassilo Horn -;; Bernard Hurley -;; Chris Bilson -;; Takumi Kinjo -;; momomo5717 - -;; This file is NOT part of GNU Emacs. - -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This script provides the most common functions and variables for -;; UI. It does not contain any interactive functions and overall is -;; not going to be used directly by means of -;; `execute-extended-command' (M-x). Its purpose to provide the most -;; valuable and useful functionality for packages and scripts which -;; provide UI. -;; -;; The most important functions are the following: -;; -;; - `google-translate-translate' -;; -;; - `google-translate-read-source-language' -;; -;; - `google-translate-read-target-language' -;; -;; `google-translate-translate' translates the given text from source -;; language to target language and shows a translation. -;; -;; `google-translate-read-source-language' reads source language from -;; minibuffer and returns language -;; abbreviation. `google-translate-read-target-language' reads target -;; language from minibuffer and returns language abbreviation. - -;; Customization: - -;; You can customize the following variables: -;; -;; - `google-translate-output-destination' -;; -;; - `google-translate-enable-ido-completion' -;; -;; - `google-translate-show-phonetic' -;; -;; - `google-translate-listen-program' -;; -;; - `google-translate-pop-up-buffer-set-focus' -;; -;; - `google-translate-preferable-input-methods-alist' -;; -;; `google-translate-output-destination' determines translation output -;; destination. If `nil' the translation output will be displayed in -;; the pop up buffer. If value equal to `echo-area' then translation -;; outputs in the Echo Area. In case of `popup' the translation -;; outputs to the popup tooltip using `popup' package. In case of -;; `kill-ring' the translation outputs to the kill ring. And in case -;; of `current-buffer' the translation outputs to the current -;; buffer. If you would like output translation to the Echo Area you -;; would probably like to increase it because only part of translation -;; could visible there with the default settings. To increase Echo -;; Area you could increase the value of `max-mini-window-height' -;; variable, for example: `(setq max-mini-window-height 0.5)'. -;; -;; If `google-translate-enable-ido-completion' is non-NIL, the input -;; will be read with ido-style completion. -;; -;; The variable `google-translate-show-phonetic' controls whether the -;; phonetic spelling of the original text and its translation is -;; displayed if available. If you want to see the phonetics, set this -;; variable to t. -;; -;; The variable `google-translate-listen-program' determines the -;; program to use to listen translations. By default the program looks -;; for `mplayer' in the PATH, if `mplayer' is found then listening -;; function will be available and you'll see `Listen' button in the -;; buffer with the translation. You can use any other suitable -;; program. If you use Windows please download and unpack `mplayer' -;; and add its path (directory) to the system PATH variable. Please -;; note that translation listening is not available if -;; `google-translate-output-destination' is set to `echo-area' or -;; `popup'. -;; -;; The variable `google-translate-pop-up-buffer-set-focus' determines -;; whether window (buffer) with translation gets focus when it pop -;; ups. If `nil', it doesn't get focus and focus remains in the same -;; window as was before translation. If `t', window (buffer with -;; translation) gets focus. Please note that that setting works only -;; for pop up buffer, i.e. when `google-translate-output-destination' -;; is `nil'. -;; -;; The `google-translate-input-method-auto-toggling' variable -;; determines whether input method auto toggling is enabled or not. -;; -;; While switching among languages I noticed that I change input -;; method quite often. Input method auto toggling allows switch on -;; appropriate input method while switching among languages. Auto -;; toggling will work in case of -;; `google-translate-input-method-auto-toggling' is set to `t' and -;; `google-translate-preferable-input-methods-alist' is defined -;; properly. -;; -;; This variable may be defined as follow (just for example): -;; -;; (setq google-translate-preferable-input-methods-alist '((nil . ("en")) -;; (ukrainian-programmer-dvorak . ("ru" "uk")))) -;; -;; In this way, input method is disabled (because of nil) for the -;; minibuffer when source language is English. And -;; "ukrainian-programmer-dvorak" input method is enabled when source -;; language is Russian or Ukrainian. - -;; Customization of faces: - -;; - `google-translate-text-face', used to display the original text -;; (defaults to `default') -;; -;; - `google-translate-phonetic-face', used to display the phonetics -;; (defaults to `shadow') -;; -;; - `google-translate-translation-face', used to display the highest -;; ranking translation (defaults to `default' with the `weight' -;; attribute set to `bold') -;; -;; - `google-translate-suggestion-label-face' used to display the -;; label for suggestion (defaults to `default' with the `foreground' -;; attribute set to `red') -;; -;; - `google-translate-suggestion-face' used to display the suggestion -;; in case of word is misspelled (defaults to `default' with the -;; `slant' attribute set to `italic' and `underline' attribute set -;; to `t') -;; -;; - `google-translate-listen-button-face' used to display the "Listen" -;; button (defaults to `height' 0.8). -;; -;; For example, to show the translation in a larger font change the -;; `height' attribute of the face `google-translate-translation-face' -;; like so: -;; -;; (set-face-attribute 'google-translate-translation-face nil :height 1.4) -;; -;; -;;; Code: -;; - -(eval-when-compile (require 'cl)) -(require 'google-translate-core) -(require 'ido) - - -(defvar google-translate-supported-languages-alist - '(("Afrikaans" . "af") - ("Albanian" . "sq") - ("Amharic" . "am") - ("Arabic" . "ar") - ("Armenian" . "hy") - ("Azerbaijani" . "az") - ("Basque" . "eu") - ("Belarusian" . "be") - ("Bengali" . "bn") - ("Bosnian" . "bs") - ("Bulgarian" . "bg") - ("Catalan" . "ca") - ("Cebuano" . "ceb") - ("Chichewa" . "ny") - ("Chinese Simplified" . "zh-CN") - ("Chinese Traditional" . "zh-TW") - ("Corsican" . "co") - ("Croatian" . "hr") - ("Czech" . "cs") - ("Danish" . "da") - ("Dutch" . "nl") - ("English" . "en") - ("Esperanto" . "eo") - ("Estonian" . "et") - ("Filipino" . "tl") - ("Finnish" . "fi") - ("French" . "fr") - ("Frisian" . "fy") - ("Galician" . "gl") - ("Georgian" . "ka") - ("German" . "de") - ("Greek" . "el") - ("Gujarati" . "gu") - ("Haitian Creole" . "ht") - ("Hausa" . "ha") - ("Hawaiian" . "haw") - ("Hebrew" . "iw") - ("Hindi" . "hi") - ("Hmong" . "hmn") - ("Hungarian" . "hu") - ("Icelandic" . "is") - ("Igbo" . "ig") - ("Indonesian" . "id") - ("Irish" . "ga") - ("Italian" . "it") - ("Japanese" . "ja") - ("Javanese" . "jw") - ("Kannada" . "kn") - ("Kazakh" . "kk") - ("Khmer" . "km") - ("Korean" . "ko") - ("Kurdish (Kurmanji)" . "ku") - ("Kyrgyz" . "ky") - ("Lao" . "lo") - ("Latin" . "la") - ("Latvian" . "lv") - ("Lithuanian" . "lt") - ("Luxembourgish" . "lb") - ("Macedonian" . "mk") - ("Malagasy" . "mg") - ("Malay" . "ms") - ("Malayalam" . "ml") - ("Maltese" . "mt") - ("Maori" . "mi") - ("Marathi" . "mr") - ("Mongolian" . "mn") - ("Myanmar (Burmese)" . "my") - ("Nepali" . "ne") - ("Norwegian" . "no") - ("Pashto" . "ps") - ("Persian" . "fa") - ("Polish" . "pl") - ("Portuguese" . "pt") - ("Punjabi" . "pa") - ("Romanian" . "ro") - ("Russian" . "ru") - ("Samoan" . "sm") - ("Scots Gaelic" . "gd") - ("Serbian" . "sr") - ("Sesotho" . "st") - ("Shona" . "sn") - ("Sindhi" . "sd") - ("Sinhala" . "si") - ("Slovak" . "sk") - ("Slovenian" . "sl") - ("Somali" . "so") - ("Spanish" . "es") - ("Sundanese" . "su") - ("Swahili" . "sw") - ("Swedish" . "sv") - ("Tajik" . "tg") - ("Tamil" . "ta") - ("Telugu" . "te") - ("Thai" . "th") - ("Turkish" . "tr") - ("Ukrainian" . "uk") - ("Urdu" . "ur") - ("Uzbek" . "uz") - ("Vietnamese" . "vi") - ("Welsh" . "cy") - ("Xhosa" . "xh") - ("Yiddish" . "yi") - ("Yoruba" . "yo") - ("Zulu" . "zu")) - "Alist of the languages supported by Google Translate. - -Each element is a cons-cell of the form (NAME . CODE), where NAME -is a human-readable language name and CODE is its code used as a -query parameter in HTTP requests.") - -(defvar google-translate-translation-listening-debug nil - "For debug translation listening purposes.") - -(defstruct gtos - "google translate output structure contains miscellaneous - information which intended to be outputed to the buffer, echo - area or popup tooltip." - source-language target-language text - auto-detected-language text-phonetic translation - translation-phonetic detailed-translation suggestion detailed-definition) - -(defgroup google-translate-core-ui nil - "Emacs core UI script for the Google Translate package." - :group 'processes) - -(defcustom google-translate-enable-ido-completion nil - "If non-NIL, use `ido-completing-read' rather than - `completing-read' for reading input." - :group 'google-translate-core-ui - :type '(choice (const :tag "No" nil) - (other :tag "Yes" t))) - -(defcustom google-translate-show-phonetic nil - "If non-NIL, try to show the phonetic spelling." - :group 'google-translate-core-ui - :type '(choice (const :tag "No" nil) - (const :tag "Yes" t))) - -(defcustom google-translate-listen-program - (executable-find "mplayer") - "The program to use to listen translations. By default the -program looks for `mplayer' in the PATH, if `mplayer' is found -then listening function will be available and you'll see `Listen' -button in the buffer with the translation. You can use any other -suitable program." - :group 'google-translate-core-ui - :type '(string)) - -(defcustom google-translate-output-destination - nil - "Determines where translation output will be displayed. If -`nil' the translation output will be displayed in the pop up -buffer (default). If value equals to `echo-area' then translation -outputs in the Echo Area. And in case of `popup' the translation -outputs to the popup tooltip using `popup' package." - :group 'google-translate-core-ui - :type '(symbol)) - -(defcustom google-translate-pop-up-buffer-set-focus - nil - "Determines whether window (buffer) with translation gets focus -when it pop ups. If `nil', it doesn't get focus and focus remains -in the same window as was before translation. If `t', -window (buffer with translation) gets focus.") - -(defcustom google-translate-listen-button-label - "[Listen]" - "Label of the 'Listen' button." - :group 'google-translate-core-ui - :type 'string) - -(defface google-translate-text-face - '((t (:inherit default))) - "Face used to display the original text." - :group 'google-translate-core-ui) - -(defface google-translate-phonetic-face - '((t (:inherit shadow))) - "Face used to display the phonetic spelling." - :group 'google-translate-core-ui) - -(defface google-translate-translation-face - '((t (:weight bold))) - "Face used to display the probable translation." - :group 'google-translate-core-ui) - -(defface google-translate-suggestion-label-face - '((t (:foreground "red"))) - "Face used to display the suggestion label." - :group 'google-translate-core-ui) - -(defface google-translate-suggestion-face - '((t (:slant italic :underline t))) - "Face used to display the suggestion." - :group 'google-translate-core-ui) - -(defface google-translate-listen-button-face - '((t (:inherit button :height 0.8))) - "Face used to display button \"Listen\"." - :group 'google-translate-core-ui) - -(defvar google-translate-input-method-auto-toggling nil - "When `t' the current source language is compared with the -values from `google-translate-preferable-input-methods-alist' and -enables appropriate input method for the minibuffer. So this -feature may allow to avoid switching between input methods while -translating using different languages.") - -(defvar google-translate-preferable-input-methods-alist - '((nil . nil)) - "Alist of preferable input methods for certain languages. - -Each element is a cons-cell of the form (INPUT-METHOD -. LANGUAGES-LIST), where INPUT-METHOD is the input method which -will be switched on, when translation source language equals to -one of the language from the LANGUAGE-LIST. - -INPUT-METHOD could be specified as nil. In such case input method -disables. - -As example, this alist could looks like the following: - - '((nil . \"en\") - (ukrainian-programmer-dvorak . (\"ru\" \"uk\"))) - -In this way, `ukrainian-programmer-dvorak' will be auto enabled -for the minibuffer when Russian or Ukrainian (as source language) -is active.") - -(defun google-translate-supported-languages () - "Return a list of names of languages supported by Google Translate." - (mapcar #'car google-translate-supported-languages-alist)) - -(defun google-translate-language-abbreviation (language) - "Return the abbreviation of LANGUAGE." - (if (string-equal language "Detect language") - "auto" - (cdr (assoc language google-translate-supported-languages-alist)))) - -(defun google-translate-language-display-name (abbreviation) - "Return a name suitable for use in prompts of the language whose -abbreviation is ABBREVIATION." - (if (string-equal abbreviation "auto") - "unspecified language" - (car (rassoc abbreviation google-translate-supported-languages-alist)))) - -(defun google-translate-paragraph (text face &optional output-format) - "Return TEXT as a filled paragraph into the current buffer and -apply FACE to it. Optionally use OUTPUT-FORMAT." - (let ((beg (point)) - (output-format - (if output-format output-format "\n%s\n"))) - (with-temp-buffer - (insert (format output-format text)) - (facemenu-set-face face beg (point)) - (fill-region beg (point)) - (buffer-substring (point-min) (point-max))))) - -(defun google-translate-setup-preferable-input-method (source-language) - "Set input method which takes from the value of -`google-translate-preferable-input-methods-alist' variable." - (interactive) - (let* ((preferable-input-method - (google-translate-find-preferable-input-method source-language))) - (set-input-method preferable-input-method))) - -(defun google-translate-find-preferable-input-method (source-language) - "Look for the SOURCE-LANGUAGE in the -`google-translate-preferable-input-methods-alist' and return -input method for it." - (let ((input-method nil)) - (dolist (item google-translate-preferable-input-methods-alist) - (dolist (language (cdr item)) - (when (string-equal source-language language) - (setq input-method (car item))))) - input-method)) - -(defun google-translate--translation-title (gtos format) - "Return translation title which contains information about used -source and target languages." - (let ((source-language (gtos-source-language gtos)) - (target-language (gtos-target-language gtos)) - (auto-detected-language (gtos-auto-detected-language gtos))) - (format format - (if (string-equal source-language "auto") - (format "%s (detected)" - (google-translate-language-display-name - auto-detected-language)) - (google-translate-language-display-name - source-language)) - (google-translate-language-display-name - target-language)))) - -(defun google-translate--translating-text (gtos format) - "Outputs in buffer translating text." - (let ((text (gtos-text gtos))) - (let ((output-format format)) - (google-translate-paragraph - text - 'google-translate-text-face - output-format)))) - -(defun google-translate--text-phonetic (gtos format) - "Outputs in buffer text phonetic in case of -`google-translate-show-phonetic' is set to t." - (let ((text-phonetic (gtos-text-phonetic gtos))) - (if (and google-translate-show-phonetic - (not (string-equal text-phonetic ""))) - (google-translate-paragraph - text-phonetic - 'google-translate-phonetic-face - format) - ""))) - -(defun google-translate--translated-text (gtos format) - "Output in buffer translation." - (let ((translation (gtos-translation gtos))) - (google-translate-paragraph - translation - 'google-translate-translation-face - format))) - -(defun google-translate--translation-phonetic (gtos format) - "Output in buffer translation phonetic in case of -`google-translate-show-phonetic' is set to t." - (let ((translation-phonetic (gtos-translation-phonetic gtos))) - (if (and google-translate-show-phonetic - (not (string-equal translation-phonetic ""))) - (google-translate-paragraph - translation-phonetic - 'google-translate-phonetic-face - format) - ""))) - -(defun google-translate--detailed-translation (detailed-translation translation - format1 - format2) - "Return detailed translation." - (with-temp-buffer - (loop for item across detailed-translation do - (let ((index 0) - (label (aref item 0))) - (unless (string-equal label "") - (put-text-property 0 (length label) - 'font-lock-face - 'google-translate-translation-face - label) - (insert (format format1 label)) - (loop for translation across (aref item 2) do - (let ((content - (format "%s (%s)" - (aref translation 0) - (mapconcat 'identity - (aref translation 1) - ", ")))) - (insert (format format2 - (incf index) - content))))))) - (buffer-substring (point-min) (point-max)))) - -(defun google-translate--detailed-definition (detailed-definition definition - format1 - format2) - "Return detailed definition." - (with-temp-buffer - (let ((section "DEFINITION")) - (put-text-property 0 (length section) - 'font-lock-face - 'google-translate-translation-face - section) - (insert (format "\n%s\n" section))) - (loop for item across detailed-definition do - (let ((index 0) - (label (aref item 0))) - (unless (string-equal label "") - (put-text-property 0 (length label) - 'font-lock-face - 'google-translate-translation-face - label) - (insert (format format1 label)) - (loop for definition across (aref item 1) do - (insert (format format2 - (incf index) - (if (> (length definition) 2) - (format "%s\n \"%s\"" - (aref definition 0) - (aref definition 2)) - (format "%s" (aref definition 0))))))))) - (buffer-substring (point-min) (point-max)))) - -(defun google-translate--suggestion (gtos) - "Return suggestion." - (let ((source-language (gtos-source-language gtos)) - (target-language (gtos-target-language gtos)) - (suggestion (gtos-suggestion gtos))) - (if suggestion - (with-temp-buffer - (insert "\n") - (let ((beg (point))) - (insert "Did you mean: ") - (facemenu-set-face 'google-translate-suggestion-label-face - beg (point))) - (goto-char (+ (point) 1)) - (let ((beg (point))) - (insert-text-button suggestion - 'action 'google-translate--suggestion-action - 'follow-link t - 'suggestion suggestion - 'source-language source-language - 'target-language target-language) - (facemenu-set-face 'google-translate-suggestion-face - beg (point)) - (insert "\n")) - (buffer-substring (point-min) (point-max))) - ""))) - -(defun google-translate--suggestion-action (button) - "Suggestion action which occur when suggestion button is -clicked." - (interactive) - (let ((suggestion (button-get button 'suggestion)) - (source-language (button-get button 'source-language)) - (target-language (button-get button 'target-language))) - (google-translate-translate source-language - target-language - suggestion))) - -(defun google-translate--listen-button (language text) - "Return listen button." - (with-temp-buffer - (insert " ") - (insert-text-button google-translate-listen-button-label - 'action 'google-translate--listen-action - 'face 'google-translate-listen-button-face - 'follow-link t - 'text text - 'language language) - (insert "\n") - (buffer-substring (point-min) (point-max)))) - -(defun google-translate--listen-action (button) - "Do translation listening." - (interactive) - (let ((text (button-get button 'text)) - (language (button-get button 'language))) - (google-translate-listen-translation language text))) - -(defun google-translate-listen-translation (language text) - (let ((buf "*mplayer output*")) - (message "Retrieving audio message...") - (if google-translate-translation-listening-debug - (with-current-buffer (get-buffer-create buf) - (insert (format "Listen program: %s\r\n" google-translate-listen-program)) - (insert (format "Listen URL: %s\r\n" (google-translate-format-listen-url text language))) - (call-process google-translate-listen-program nil t nil - (format "%s" (google-translate-format-listen-url text language))) - (switch-to-buffer buf)) - (call-process google-translate-listen-program nil nil nil - (format "%s" (google-translate-format-listen-url text language)))))) - -(defun google-translate-translate (source-language target-language text &optional output-destination) - "Translate TEXT from SOURCE-LANGUAGE to TARGET-LANGUAGE. - -In case of `google-translate-output-destination' is nil pops up a -buffer named *Google Translate* with available translations of -TEXT. In case of `google-translate-output-destination' is -`echo-area' outputs translation in the echo area. If -`google-translate-output-destination' is `popup' outputs -translation in the popup tooltip using `popup' package. - -To deal with multi-line regions, sequences of white space -are replaced with a single space. If the region contains not text, a -message is printed." - (let* ((json (google-translate-request source-language - target-language - text))) - (if (null json) - (message "Nothing to translate.") - (let* ((detailed-translation - (google-translate-json-detailed-translation json)) - (detailed-definition - (google-translate-json-detailed-definition json)) - (gtos - (make-gtos - :source-language source-language - :target-language target-language - :auto-detected-language (aref json 2) - :text text - :text-phonetic (google-translate-json-text-phonetic json) - :translation (google-translate-json-translation json) - :translation-phonetic (google-translate-json-translation-phonetic json) - :detailed-translation detailed-translation - :detailed-definition detailed-definition - :suggestion (when (null detailed-translation) - (google-translate-json-suggestion json)))) - (output-destination (if (null output-destination) - google-translate-output-destination - output-destination))) - (cond - ((null output-destination) - (google-translate-buffer-output-translation gtos)) - ((equal output-destination 'echo-area) - (google-translate-echo-area-output-translation gtos)) - ((equal output-destination 'popup) - (google-translate-popup-output-translation gtos)) - ((equal output-destination 'kill-ring) - (google-translate-kill-ring-output-translation gtos)) - ((equal output-destination 'current-buffer) - (google-translate-current-buffer-output-translation gtos)) - ((equal output-destination 'help) - (let ((describe-func - (function - (lambda (gtos) - (google-translate-help-buffer-output-translation gtos))))) - (help-setup-xref (list 'google-translate-translate source-language target-language text) nil) - (with-help-window (help-buffer) - (funcall describe-func gtos))))))))) - -(defun google-translate-popup-output-translation (gtos) - "Output translation to the popup tooltip using `popup' -package." - (require 'popup) - (popup-tip - (with-temp-buffer - (google-translate-insert-translation gtos) - (google-translate--trim-string - (buffer-substring (point-min) (point-max)))))) - -(defun google-translate-echo-area-output-translation (gtos) - "Output translation to the echo area (See -http://www.gnu.org/software/emacs/manual/html_node/elisp/The-Echo-Area.html)" - (message - (with-temp-buffer - (google-translate-insert-translation gtos) - (google-translate--trim-string - (buffer-substring (point-min) (point-max)))))) - -(defun google-translate-kill-ring-output-translation (gtos) - "Output translation to the kill ring." - (kill-new - (with-temp-buffer - (insert - (gtos-translation gtos)) - (google-translate--trim-string - (buffer-substring (point-min) (point-max))))) - (message "Translated text was added to the kill ring.")) - -(defun google-translate-current-buffer-output-translation (gtos) - "Output translation to current buffer." - (insert - (gtos-translation gtos)) - (message "Translated text was added to current buffer.")) - -(defun google-translate-insert-translation (gtos) - "Insert translation to the current buffer." - (let ((translation (gtos-translation gtos)) - (detailed-translation (gtos-detailed-translation gtos))) - (insert - (google-translate--translation-title gtos "%s -> %s:") - (google-translate--translating-text gtos " %s") - (google-translate--text-phonetic gtos " [%s]") - " - " - (google-translate--translated-text gtos "%s") - (google-translate--translation-phonetic gtos " [%s]") - (if detailed-translation - (google-translate--detailed-translation - detailed-translation translation - "\n* %s " "%d. %s ") - (google-translate--suggestion gtos))))) - -(defun google-translate-buffer-output-translation (gtos) - "Output translation to the temp buffer." - (let ((buffer-name "*Google Translate*")) - (with-output-to-temp-buffer buffer-name - (if google-translate-pop-up-buffer-set-focus - (select-window (display-buffer buffer-name)) - (set-buffer buffer-name)) - (google-translate-buffer-insert-translation gtos)))) - -(defun google-translate-help-buffer-output-translation (gtos) - "Output translation to the help buffer." - (and google-translate-pop-up-buffer-set-focus - (select-window (display-buffer "*Help*"))) - (google-translate-buffer-insert-translation gtos)) - -(defun google-translate-buffer-insert-translation (gtos) - "Insert translation to the current temp buffer." - (let ((translation (gtos-translation gtos)) - (detailed-translation (gtos-detailed-translation gtos)) - (detailed-definition (gtos-detailed-definition gtos)) - (source-language (gtos-source-language gtos)) - (target-language (gtos-target-language gtos)) - (auto-detected-language (gtos-auto-detected-language gtos)) - (text (gtos-text gtos))) - (insert - (google-translate--translation-title gtos "Translate from %s to %s:\n") - "\n" - (google-translate--translating-text - gtos - (if (null google-translate-listen-program) - "%s\n" - "%s")) - (if google-translate-listen-program - (google-translate--listen-button - (if (string-equal source-language "auto") - auto-detected-language - source-language) text) "") - (google-translate--text-phonetic gtos "\n%s\n") - "\n" - (google-translate--translated-text - gtos - (if (null google-translate-listen-program) - "%s\n" - "%s")) - (if google-translate-listen-program - (google-translate--listen-button target-language translation) "") - (google-translate--translation-phonetic gtos "\n%s\n") - (if detailed-translation - (google-translate--detailed-translation - detailed-translation translation - "\n%s\n" "%2d. %s\n") - (google-translate--suggestion gtos)) - (if detailed-definition - (google-translate--detailed-definition - detailed-definition translation - "\n%s\n" "%2d. %s\n") - "")))) - -(defun google-translate-read-source-language (&optional prompt) - "Read a source language, with completion, and return its abbreviation. - -The null input is equivalent to \"Detect language\"." - (let ((completion-ignore-case t) - (prompt - (if (null prompt) - "Translate from: " - prompt))) - (google-translate-language-abbreviation - (google-translate-completing-read - prompt - (google-translate-supported-languages) - "Detect language")))) - -(defun google-translate-read-target-language (&optional prompt) - "Read a target language, with completion, and return its abbreviation. - -The input is guaranteed to be non-null." - (let ((completion-ignore-case t) - (prompt - (if (null prompt) - "Translate to: " - prompt))) - (cl-flet ((read-language () - (google-translate-completing-read - prompt - (google-translate-supported-languages)))) - (let ((target-language (read-language))) - (while (string-equal target-language "") - (setq target-language (read-language))) - (google-translate-language-abbreviation target-language))))) - -(defun google-translate-completing-read (prompt choices &optional def) - "Read a string in the minibuffer with completion. - -If `google-translate-enable-ido-completion' is non-NIL, use -ido-style completion." - (funcall (if google-translate-enable-ido-completion - #'ido-completing-read - #'completing-read) - prompt choices nil t nil nil def)) - -(provide 'google-translate-core-ui) - -;;; google-translate-core-ui.el ends here diff --git a/elpa/google-translate-20190620.1416/google-translate-core-ui.elc b/elpa/google-translate-20190620.1416/google-translate-core-ui.elc deleted file mode 100644 index 9d53330cf360e424b2d18cb6464aa85b49bca1fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35065 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 - -;; Author: Oleksandr Manzyuk -;; Maintainer: Andrey Tykhonov -;; URL: https://github.com/atykhonov/google-translate -;; Version: 0.11.18 -;; Keywords: convenience - -;; Contributors: -;; Tassilo Horn -;; Bernard Hurley -;; Chris Bilson -;; Takumi Kinjo -;; momomo5717 - -;; This file is NOT part of GNU Emacs. - -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This file is the core of `google-translate' package. It does contains -;; the most important and vital functions and variables for the -;; package functionality. -;; -;; The most important is the `google-translate-request' function which -;; is intended to be used by other scripts and packages, expecially by -;; the packages which provides UI. -;; -;; This, `google-translate-core', package doesn't provide any UI. -;; -;; `google-translate-request' function sends http request to the -;; google service and returns JSON response which contains translation -;; and other info. -;; -;; There are also a set of helper functions which are going to be -;; useful to retrieve data from the mentioned JSON response: -;; -;; `google-translate-json-text-phonetic' - retrieves text phonetic; -;; -;; `google-translate-json-translation' - retrieves translation; -;; -;; `google-translate-json-translation-phonetic' - retrieves -;; phonetic translation; -;; -;; `google-translate-json-detailed-translation' - retrieves -;; additional, detailed information which relates to the -;; translation. -;; - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'json) -(require 'url) -(require 'google-translate-tk) - -(defgroup google-translate-core nil - "Google Translate core script." - :group 'processes) - -(defvar google-translate-base-url - "http://translate.google.com/translate_a/single") - -(defvar google-translate-listen-url - "http://translate.google.com/translate_tts") - -(defun google-translate--format-query-string (query-params) - "Format QUERY-PARAMS as a query string. - -QUERY-PARAMS must be an alist of field-value pairs." - (mapconcat #'(lambda (p) - (format "%s=%s" - (url-hexify-string (car p)) - (url-hexify-string (cdr p)))) - query-params "&")) - -(defun google-translate--format-request-url (query-params) - "Format QUERY-PARAMS as a Google Translate HTTP request URL. - -QUERY-PARAMS must be an alist of field-value pairs." - (concat google-translate-base-url - "?" - (google-translate--format-query-string query-params))) - -(defun google-translate--format-listen-url (query-params) - "Format QUERY-PARAMS as a Google Translate HTTP request URL for listen translation. - -QUERY-PARAMS must be an alist of field-value pairs." - (concat google-translate-listen-url - "?" - (google-translate--format-query-string query-params))) - -(defun google-translate-format-listen-url (text language) - "Format listen url for TEXT and TARGET-LANGUAGE." - (google-translate--format-listen-url `(("ie" . "UTF-8") - ("q" . ,text) - ("tl" . ,language) - ("total" . "1") - ("idx" . "0") - ("textlen" . ,(number-to-string (length text))) - ("client" . "t") - ("prev" . "input") - ("tk" . ,(google-translate--gen-tk text))))) - -(defun google-translate--http-response-body (url &optional for-test-purposes) - "Retrieve URL and return the response body as a string." - (let ((google-translate-backend-debug (or for-test-purposes - google-translate-backend-debug))) - (with-temp-buffer - (save-excursion - (google-translate-backend-retrieve url)) - (set-buffer-multibyte t) - (buffer-string)))) - -(defun google-translate--insert-nulls (string) - "Google Translate responses with an almost valid JSON string -respresentation except that the nulls appear to be dropped. In -particular the response may contain the substrings \"[,\", -\",,\", and \",]\". This function undoes that." - (with-temp-buffer - (set-buffer-multibyte t) - (insert string) - (goto-char (point-min)) - (while (re-search-forward "\\(\\[,\\|,,\\|,\\]\\)" (point-max) t) - (backward-char) - (insert "null")) - (buffer-string))) - -(defun google-translate--trim-string (string) - "Remove whitespaces in beginning and ending of STRING. - White space here is any of: space, tab, emacs newline (line feed, ASCII 10)." - (replace-regexp-in-string "\\`[ \t\n\r]*" "" - (replace-regexp-in-string "[ \t\n\r]*\\'" "" string))) - -(defun google-translate--strip-string (string) - "Replace spaces, tabs, line feeds (ASCII 10) and carridge -returns (ASCII 13) by a single space symbol." - (replace-regexp-in-string "[[:space:]\n\r]+" " " string)) - -(defun google-translate-prepare-text-for-request (text) - "Make TEXT as clean as possible berofe sending it in the -request." - (google-translate--trim-string - (google-translate--strip-string text))) - -(defun google-translate-request (source-language target-language text) - "Send to the Google Translate http request which consigned to -translate TEXT from SOURCE-LANGUAGE to TARGET-LANGUAGE. Returns -response in json format." - (let ((cleaned-text (google-translate-prepare-text-for-request text))) - (when (and - (stringp cleaned-text) - (> (length cleaned-text) 0)) - (json-read-from-string - (google-translate--insert-nulls - (google-translate--request source-language target-language text)))))) - -(defun google-translate--request (source-language - target-language - text - &optional for-test-purposes) - "Send to the Google Translate http request which consigned to -translate TEXT from SOURCE-LANGUAGE to TARGET-LANGUAGE." - (google-translate--http-response-body - (google-translate--format-request-url - `(("client" . "t") - ("ie" . "UTF-8") - ("oe" . "UTF-8") - ("sl" . ,source-language) - ("tl" . ,target-language) - ("q" . ,text) - ("dt" . "bd") - ("dt" . "ex") - ("dt" . "ld") - ("dt" . "md") - ("dt" . "qc") - ("dt" . "rw") - ("dt" . "rm") - ("dt" . "ss") - ("dt" . "t") - ("dt" . "at") - ("pc" . "1") - ("otf" . "1") - ("srcrom" . "1") - ("ssel" . "0") - ("tsel" . "0") - ("tk" . ,(google-translate--gen-tk text)))) - for-test-purposes)) - -(defun google-translate-json-text-phonetic (json) - "Retrieve from the JSON (which returns by the -`google-translate-request' function) phonetic transcription of -the translating text." - (mapconcat (lambda (item) (if (> (length item) 3) (aref item 3) "")) - (aref json 0) "")) - -(defun google-translate-json-translation (json) - "Retrieve from the JSON (which returns by the -`google-translate-request' function) translation of the -translating text." - (mapconcat #'(lambda (item) (aref item 0)) - (aref json 0) "")) - -(defun google-translate-json-translation-phonetic (json) - "Retrieve from the JSON (which returns by the -`google-translate-request' function) phonetic transcription of -the translating text." - (mapconcat #'(lambda (item) (if (> (length item) 2) (aref item 2) "")) - (aref json 0) "")) - -(defun google-translate-json-detailed-translation (json) - "Retrieve from the JSON (which returns by the -`google-translate-request' function) a dictionary article -represented by a vector of items, where each item is a 2-element -vector whose zeroth element is the name of a part of speech and -whose first element is a vector of translations for that part of -speech." - (aref json 1)) - -(defun google-translate-json-detailed-definition (json) - "Retrieve the definition of translating text in source language from the JSON -which returned by the `google-translate-request' function. - -This function returns the definition if it's included within the JSON as 12th -element, or returns nil if not included. - -The definition is a dictionary article represented by a vector of items, where -each item is a 2-element vector whose zeroth element is the name of a part of -speech and whose first element is a vector of definitions for that part of -speech." - (if (> (length json) 12) - (aref json 12))) - -(defun google-translate-json-suggestion (json) - "Retrieve from JSON (which returns by the -`google-translate-request' function) suggestion. This function -does matter when translating misspelled word. So instead of -translation it is possible to get suggestion." - (let ((info (aref json 7))) - (when info - (aref info 1)))) - -(defun google-translate-version () - (interactive) - (message "Google Translate (version): %s" "0.11.18")) - - -(provide 'google-translate-core) - -;;; google-translate-core.el ends here diff --git a/elpa/google-translate-20190620.1416/google-translate-core.elc b/elpa/google-translate-20190620.1416/google-translate-core.elc deleted file mode 100644 index 71d1be05c1c5aa122326022f0e3c08ee9f9382a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7763 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 diff --git a/elpa/google-translate-20190620.1416/google-translate-default-ui.el b/elpa/google-translate-20190620.1416/google-translate-default-ui.el deleted file mode 100644 index c20daf5e..00000000 --- a/elpa/google-translate-20190620.1416/google-translate-default-ui.el +++ /dev/null @@ -1,302 +0,0 @@ -;;; google-translate-default-ui.el --- default UI for Google Translate -;;; package - -;; Copyright (C) 2012 Oleksandr Manzyuk - -;; Author: Oleksandr Manzyuk -;; Maintainer: Andrey Tykhonov -;; URL: https://github.com/atykhonov/google-translate -;; Version: 0.11.18 -;; Keywords: convenience - -;; Contributors: -;; Tassilo Horn -;; Bernard Hurley -;; Chris Bilson -;; Takumi Kinjo -;; momomo5717 - -;; This file is NOT part of GNU Emacs. - -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This file provides default UI for the Google Translate package. It -;; was originally written by Oleksandr Manzyuk and was part of -;; google-translate.el. It was extracted to this, -;; google-translate-default-ui.el file due to refactoring (the goal of -;; which is to separate backend from UI and provide better way for -;; having different UIs for Google Translate package). -;; -;; Invoking the function `google-translate-query-translate' queries the source -;; and target languages and text to translate, and shows a buffer with -;; available translations of the text. Invoking the function -;; `google-translate-at-point' translates the word at point or the active -;; region. - -;; Customization: - -;; You can customize the following variables: -;;;; -;; - `google-translate-default-source-language' -;; -;; - `google-translate-default-target-language' - -;; If the variable `google-translate-default-source-language' is set -;; to a non-NIL value, the source language won't be queried and that -;; value will be used instead. Analogously, if you set the variable -;; `google-translate-default-target-language' to some non-NIL value, -;; that value will be used without querying. - -;; You can always override this behavior by supplying a `C-u' prefix -;; argument to the function `google-translate-query-translate'. - -;; Here is an example. Suppose that your native language is Russian -;; and you frequently need to translate from various languages to -;; Russian. Then it is reasonable -;; -;; - to set the variable `google-translate-default-target-language' -;; to "ru", and -;; -;; - to leave `google-translate-default-source-language' set to its -;; default value, NIL. -;; -;; In this case, the function `google-translate-query-translate' is -;; only going to query the source language and text to translate. -;; If you need to translate to some language other than Russian, you -;; can override the default for the target language by supplying a -;; `C-u' prefix argument, in which case you will be queried for both -;; the source and target languages, as well as text to translate. - -;; If you frequently translate from some fixed language, it is also -;; reasonable to set `google-translate-default-source-language' to -;; an appropriate value. -;; -;; If you have both the default source and target languages specified, -;; you may like to bind functions `google-translate-at-point-reverse' -;; and `google-translate-query-translate-reverse' to some keys, e.g.: -;; -;; (global-set-key (kbd "C-c r") 'google-translate-at-point-reverse) -;; (global-set-key (kbd "C-c R") 'google-translate-query-translate-reverse) -;; -;; This will allow you to quickly translate in the reverse direction. -;; When the default source (resp. target) language is not set, the -;; target (resp. source) language of the reverse translation will be -;; queried interactively. - -;; The admitted values of `google-translate-default-source-language' -;; and `google-translate-default-target-language' are the codes of the -;; languages supported by Google Translate (like "ru" for Russian -;; above). See `google-translate-supported-languages' for the list of -;; the supported languages, or customize the defaults using the -;; customization mechanism of Emacs. Setting a default language to -;; NIL means that language will always be queried. Moreover, the -;; variable `google-translate-default-source-language' can be set to a -;; special value "auto" that is interpreted as the instruction for -;; Google Translate to detect the source language. This option is -;; also available when you are queried for the source language: simply -;; leave this parameter blank by pressing RET. (If you have enabled -;; the ido-style completion, "Detect language" is going to be the -;; first option, which you can select simply by hitting RET.) -;; - -;;; Code: - - -(require 'google-translate-core-ui) - - -(defgroup google-translate-default-ui nil - "Default UI interface to the Google Translate package." - :group 'processes) - -(defcustom google-translate-default-source-language nil - "Default source language. - -A string designating a language supported by Google Translate. -Set this variable to NIL (the default value) if you want to -always be queried for the source language, or to \"auto\" if you -want Google Translate to always detect the source language. - -See the variable `google-translate-supported-languages-alist' for -the list of available languages." - :group 'google-translate-manzyuk-ui - :type `(radio ,@(mapcar #'(lambda (lang) - `(const :tag ,(car lang) ,(cdr lang))) - google-translate-supported-languages-alist) - (const :tag "Detect language" "auto") - (other :tag "Always ask" nil))) - -(defcustom google-translate-default-target-language nil - "Default target language. - -A string designating a language supported by Google Translate. -Set this variable to NIL (the default value) if you want to -always be queried for the target language. - -See the variable `google-translate-supported-languages-alist' for -the list of available languages." - :group 'google-translate-manzyuk-ui - :type `(radio ,@(mapcar #'(lambda (lang) - `(const :tag ,(car lang) ,(cdr lang))) - google-translate-supported-languages-alist) - (other :tag "Always ask" nil))) - -(defun google-translate-read-args (override-p reverse-p) - "Query and return the language arguments of `google-translate-translate'. - -When OVERRIDE-P is NIL, the source (resp. target) language is queried -only if the variable `google-translate-default-source-language' (resp. -`google-translate-default-target-language') is NIL. If OVERRIDE-P is -non-NIL, both the source and target languages are queried, allowing -one to override the defaults if they are specified. - -REVERSE-P is used to reverse the default direction of translation: if -it's non-NIL, the value of `google-translate-default-source-language' -becomes the default target language and vice versa." - (let* ((default-source-language - (if reverse-p - google-translate-default-target-language - google-translate-default-source-language)) - (default-target-language - (if reverse-p - google-translate-default-source-language - google-translate-default-target-language)) - (source-language - (if (and default-source-language - (not override-p)) - default-source-language - (google-translate-read-source-language - "Translate from: "))) - (target-language - (if (and default-target-language - (not override-p)) - default-target-language - (google-translate-read-target-language - (format "Translate from %s to: " - (google-translate-language-display-name - source-language)))))) - (list source-language target-language))) - -(defun %google-translate-query-translate (override-p reverse-p) - (let* ((langs (google-translate-read-args override-p reverse-p)) - (source-language (car langs)) - (target-language (cadr langs))) - (google-translate-translate - source-language target-language - (if google-translate-input-method-auto-toggling - (minibuffer-with-setup-hook - (lambda () - (google-translate-setup-preferable-input-method source-language)) - (%google-translate-default-ui-read-from-minibuffer source-language target-language)) - (%google-translate-default-ui-read-from-minibuffer source-language target-language))))) - -(defun %google-translate-default-ui-read-from-minibuffer (source-language target-language) - (read-from-minibuffer - (format "Translate from %s to %s: " - (google-translate-language-display-name source-language) - (google-translate-language-display-name target-language)))) - -;;;###autoload -(defun google-translate-query-translate (&optional override-p) - "Interactively translate text with Google Translate. - -Query a text (a word or a phrase), and pop up a buffer named *Google -Translate* displaying available translations of the text. - -If no defaults for the source and target languages are specified (by -setting the variables `google-translate-default-source-language' and -`google-translate-default-target-language'), interactively query the -missing parts. For example, a reasonable option may be to specify a -default for the target language and always be queried for the source -language. - -With a `C-u' prefix argument, query the source and target languages, -even if any defaults are specified. For example, you may frequently -need to translate from English to Russian, and you may choose to set -the default source and target languages to \"en\" and \"ru\", resp. -However, occasionally you may also need to translate from Russian to -English. With a `C-u' prefix argument you can override the defaults -and specify the source and target languages explicitly. - -The languages are queried with completion, and the null input at the -source language prompt is considered as an instruction for Google -Translate to detect the source language." - (interactive "P") - (%google-translate-query-translate override-p nil)) - -;;;###autoload -(defun google-translate-query-translate-reverse (&optional override-p) - "Like `google-translate-query-translate', but performs translation -in the reverse direction. - -The value of the variable `google-translate-default-source-language' -\(if set) becomes the target language, and the value of the variable -`google-translate-default-target-language' (if also set) becomes the -source language. - -In particular, when both variables are set, translation is performed -in the reverse direction." - (interactive "P") - (%google-translate-query-translate override-p t)) - -(defun %google-translate-at-point (override-p reverse-p) - (let* ((langs (google-translate-read-args override-p reverse-p)) - (source-language (car langs)) - (target-language (cadr langs)) - (bounds nil)) - (google-translate-translate - source-language target-language - (if (use-region-p) - (buffer-substring-no-properties (region-beginning) (region-end)) - (or (and (setq bounds (bounds-of-thing-at-point 'word)) - (buffer-substring-no-properties (car bounds) (cdr bounds))) - (error "No word at point.")))))) - -;;;###autoload -(defun google-translate-at-point (&optional override-p) - "Translate the word at point or the words in the active region. - -For the meaning of OVERRIDE-P, see `google-translate-query-translate'." - (interactive "P") - (%google-translate-at-point override-p nil)) - -;;;###autoload -(defun google-translate-at-point-reverse (&optional override-p) - "Like `google-translate-at-point', but performs translation in the -reverse direction." - (interactive "P") - (%google-translate-at-point override-p t)) - -;;;###autoload -(defun google-translate-buffer (&optional override-p reverse-p) - "Translate current buffer. - -For the meaning of OVERRIDE-P, see `google-translate-query-translate'." - (interactive "P") - (let* ((langs (google-translate-read-args override-p reverse-p)) - (source-language (car langs)) - (target-language (cadr langs))) - (google-translate-translate - source-language target-language - (if (use-region-p) - (buffer-substring-no-properties (region-beginning) (region-end)) - (or (buffer-substring-no-properties (point-min) (point-max)) - (error "Translate current buffer error.")))))) - -(provide 'google-translate-default-ui) - - -;;; google-translate-default-ui.el ends here diff --git a/elpa/google-translate-20190620.1416/google-translate-default-ui.elc b/elpa/google-translate-20190620.1416/google-translate-default-ui.elc deleted file mode 100644 index 08747c6eee792219aa4f00fdbeb221b63670643f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7393 zcmd5>?{nM65!JU!$k^_*({`pwoE2F|WJ+iRP@*k)IwRLsQq6eM)OOnsre<;ij}%7W z9fBW{nZLeo4>*7VM9NN_Ozoj80(X0RyKi^juAiQ~eEz46jSc7N)2H-Y&*LzX6Z0ih zbTSt~N>?&TL#@ak?GDYG>oB_@5k;iqES!fwiVUyQUB|q9a}lOAg%rwDnbKsT#5@dW zqJuO`LN!YVc$=gdiOEDxs5-?v-1QGzGA0@_l+Gy7Dic_oXH)kHo+$U(>*uGZ6kLcz z1Q}EunB#?-P^u{qiq0iPTHH9Kyh=(^BvB|6$}X_b9~S4r1V8H!EAVswIF8dhUu4n^ z^h8o;Jlyl}@wdmmw})Sb`0V3zfX@h@$K#>5_o#U3VWsC6FFjt!FR|FeVh@WweD@*5 z_cq56?EB-+-@p7#z1QbGSnKlvtM(ogdq?Hoy~iDTJJWg=NjFP`N+SW?(>#uKlF5l1 z2{p^bOs1}gLO4B1b)vD#5Af=j5h+o7XEe4OY&ri|9c=~p5N#W|qdQr9Yw z>O2W#bhr;fmj$ zzN8-Cvs4K$qg?hWoYF$)bS)G%>9G>gwOFJa6hGuL2@!fz&G?rH7rsNK#(?;_rg2B) z*w`s0jg=AAvL;rRq9-zw0c+S2X>R{o!X*Wk1#}nL^ z&!x&z0z%vPt}^5f3eJBoq@sWR=j7F^(-$Z1cZ9e`EDx6BrFI)NQumsSMtz-bx|;&OjO z0!>hS0;VhMAnOi%J%VT_%yyV;ly@jBid=fTFRgu=7In^Lpy#M1ONuw|Zt!yzBI&Y* zV)qND$Ks+;q_opYVTlwI7syIEPg%RTvAv%gBX4aYR}D8ew(yU?wJ}zong_qbZ~Wx< z8(W`!!YgRw9{$;<4gThLH&Eyei`afRp5iZ7c*P2D!+iCRu!M<+1Q?rcB2 zhhOgB8@#|K<^ZL!p;k+OYpDj3RxfOr)VkkY^}H!~$wn<@j4_*nIyE_%CVGBEw-gey zv3U}z(p+TJ*iVn(eSNDGnHA0oqUrRh(z;TxJ&qdq zW_mV@m{7IsQO8f~mCXPWMlwVaxA!(dwvEC~n6$R1C;_n>CvqwirXudLT4&^+8FpHW zW^z7c0u3_1Mdc}7?{D3sLehoSm(=y~eVQx8_Z%j3&BJ-9!t;EJbKH9A84b^t6^C@+ zNH^Mdz3zL8Kqt256lx>PMsyy!#<(0bZmlBm(OtiLMvw2p>Yb9__L^R31V=&IjAe0u z(;LBoXk@mwyQ>`85CJnG!!|FmF18Wj?;qZ0G=dqr$Da4Zqf>5A(6EMA5{0|QUnbvW zWE$&l8vP2&TS+>|Eb0lm*2#ofx}f+X5vlB>exkz0Iwo{Wf(oP%=avb5RS0yd9QPHf zph-Ta{itZP)rEU`Qyo!w`9PeHLa($bV?S4ww#_p$dKf+|750Q%d-*qLTwd_W&2Tq%e!| zcjHJ*K)`qulO&-QwYzSTrN(u+N95~GxibfIjTVlQ1%I-Dka(%*bfS=7Q_wn1uW}er zr~-9XLV!fYYzsz`nX}A()~L+OJ5qJbeW;VX27%xk3b#K=~tW$u`CkQJ3Igw#Zef9Fe6<0hTBy;09mHH zMWBNw0&xtm!jLRm~Q* zPdPmVAVQ#zlu>sAjaaQce(P}`kmrbxGvUxYvk4te4UB<(aPc2VQB|vVZUR-ZQgiWY(Bz?RIz2 zj-d}_&*wT#TF*P@QW)(p2B>E+1H|q7B$qoH_Uc+64ce8&8_98malS=$_xQ(MhF>O(9rIL9iqv4f;Xi7;{q0|*v3{>+856dT nk`Ky=U*$zI?@j!dbYS#ke`EpBL(;k831NF;W=nG(_MQI$KzznM diff --git a/elpa/google-translate-20190620.1416/google-translate-pkg.el b/elpa/google-translate-20190620.1416/google-translate-pkg.el deleted file mode 100644 index 2749c4c2..00000000 --- a/elpa/google-translate-20190620.1416/google-translate-pkg.el +++ /dev/null @@ -1,4 +0,0 @@ -(define-package "google-translate" "20190620.1416" "Emacs interface to Google Translate." 'nil) -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/google-translate-20190620.1416/google-translate-smooth-ui.el b/elpa/google-translate-20190620.1416/google-translate-smooth-ui.el deleted file mode 100644 index c021f86c..00000000 --- a/elpa/google-translate-20190620.1416/google-translate-smooth-ui.el +++ /dev/null @@ -1,323 +0,0 @@ -;;; google-translate-smooth-ui.el --- Just another UI to Google -;;; Translate package - -;; Copyright (C) 2012 Oleksandr Manzyuk - -;; Author: Oleksandr Manzyuk -;; Maintainer: Andrey Tykhonov -;; URL: https://github.com/atykhonov/google-translate -;; Version: 0.11.18 -;; Keywords: convenience - -;; Contributors: -;; Tassilo Horn -;; Bernard Hurley -;; Chris Bilson -;; Takumi Kinjo -;; momomo5717 - -;; This file is NOT part of GNU Emacs. - -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; `google-translate-smooth-ui' is a just alternative to the default -;; `google-translate-default-ui'. It was written with mind to provide -;; impoved user interface and, especially, to achieve better -;; supporting of many default languages. `google-translate-default-ui' -;; supports two default languages very well but there is no space for -;; the third one. -;; -;; Invoking the function `google-translate-smooth-translate' queries -;; text and (optionally) the source and target languages to translate, -;; and shows a buffer with available translations of the text. - -;; Installation: - -;; Assuming that the files `google-translate.el', -;; `google-translate-core.el', `google-translate-core-ui.el' and -;; `google-translate-smooth-ui.el' are somewhere on the load path, add -;; the following lines to your .emacs file: -;; -;; (require 'google-translate-smooth-ui) -;; (global-set-key "\C-ct" 'google-translate-smooth-translate) -;; -;; Change the key bindings to your liking. -;; -;; Configuration: -;; -;; `google-translate-translation-directions-alist' alist is intended -;; to contain translation directions. -;; -;; For example it could be defined (in your .emacs or init.el) as: -;; -;; (setq google-translate-translation-directions-alist '(("en" . "ru")) -;; -;; in this way one translation direction ("en" > "ru") is defined and -;; when `google-translate-smooth-translate' function executes it will -;; output the prompt (in minibuffer) which will looks like as the -;; following: -;; -;; [English > Russian] Translate: -;; -;; You may set as many translation directions as you would like -;; to. For example such piece of code will define four translation -;; directions: -;; -;; (setq google-translate-translation-directions-alist -;; '(("de" . "en") ("en" . "de") ("de" . "fr") ("fr" . "de"))) -;; -;; in this way, when `google-translate-smooth-translate' function -;; executes you'll be queried by the prompt which will looks like the -;; following: -;; -;; [German > English] Translate: -;; -;; and, also in this way, you'll be able to switch between different -;; translation directions directly from minibuffer by using "C-n" and -;; "C-p" key bindings. "C-n" key binding changes current translation -;; direction to the next direction defined in the -;; `google-translate-translation-directions-alist' variable. And "C-p" -;; key binding changes current translation direction to the previous -;; one. Thus, while executing `google-translate-smooth-translate' -;; function and having in minibuffer such prompt: -;; -;; [German > English] Translate: -;; -;; then after pressing "C-n" you'll get the following prompt: -;; -;; [English > German] Translate: -;; -;; By default `google-translate-translation-directions-alist' is empty -;; and thus during execution of `google-translate-smooth-translate' -;; you'll be queried (to input a text) by the prompt: -;; -;; Translate: -;; -;; And after inputed text you'll be queried also for the source and -;; target languages. To let the package to be known which languages -;; you would like to always use and to avoid repetitive language -;; quering it is reasonable to define them in the mentioned -;; `google-translate-translation-directions-alist' variable. - -;; Customization: - -;; `google-translate-smooth-ui' doesn't contain any customizable -;; variables. But `google-translate-smooth-ui' extends -;; `google-translate-core-ui' and thus it could be customized via this -;; package's variables. Please read documentation for the -;; `google-translate-core-ui' package. -;; - -;;; Code: - - -(require 'google-translate-core-ui) - - -(defgroup google-translate-smooth-ui nil - "Just Another UI for Google Translate package." - :group 'processes) - -(defvar google-translate-translation-directions-alist - '() - "Alist of translation directions. Each of direction could be -selected directly in the minibuffer during translation. - -Each element is a cons-cell of the form (SOURCE_CODE -. TARGET_CODE), where SOURCE_CODE is a source language code and -TARGET_CODE is a target language code. - -Language codes are defined in -`google-translate-supported-languages-alist' variable. - -As example, this alist could looks like the following: - - '((\"en\" . \"ru\") - (\"ru\" . \"en\") - (\"uk\" . \"ru\") - (\"ru\" . \"uk\"))") - -(defvar google-translate-current-translation-direction 0 - "Points to nth element of -`google-translate-translation-directions-alist' variable and -keeps current translation direction while changing translation -directions.") - -(defvar google-translate-translation-direction-query "" - "Temporal variable which keeps a minibuffer text while -switching translation directions.") - -(defvar google-translate-try-other-direction nil - "Indicates that other translation direction is going to be -used.") - -(defvar google-translate-minibuffer-keymap nil - "Keymap for minibuffer for changing translation directions.") - -(defun google-translate-change-translation-direction (direction) - "Change translation direction. If DIRECTION is 'next then -change current direction by the next one. Otherwise change it to -the previous one." - (let ((current google-translate-current-translation-direction) - (length (length google-translate-translation-directions-alist))) - (setq current - (if (equal direction 'next) - (+ current 1) - (- current 1))) - (when (< current 0) - (setq current (- length 1))) - (when (> current (- length 1)) - (setq current 0)) - (setq google-translate-current-translation-direction current) - (setq google-translate-translation-direction-query - (minibuffer-contents)))) - -(defun google-translate-next-translation-direction () - "Switch to the next translation direction. If current direction -is the last in the list of existing directions then switch to the -first one." - (interactive) - (google-translate-change-translation-direction 'next) - (setq google-translate-try-other-direction t) - (exit-minibuffer)) - -(defun google-translate-previous-translation-direction () - "Switch to the previous translation direction. If current -direction is the first in the list of existing directions then -switch to the last one." - (interactive) - (google-translate-change-translation-direction 'previous) - (setq google-translate-try-other-direction t) - (exit-minibuffer)) - -(defun google-translate-query-translate-using-directions () - "Tranlate query using translation directions described by -`google-translate-translation-directions-alist' variable. - -This function allows to select desired translation direction -directly in the minibuffer while translating a word or a -sentence. - -This function defines two key bindings for the minibuffer which -allow to select direction: -C-p - to select previous direction, -C-n - to select next direction." - (interactive) - (let ((text "")) - (setq google-translate-try-other-direction nil) - (setq text - (if google-translate-input-method-auto-toggling - (minibuffer-with-setup-hook - (lambda () - (google-translate-setup-preferable-input-method - (google-translate--current-direction-source-language))) - 'google-translate-setup-preferable-input-method - (google-translate--read-from-minibuffer)) - (google-translate--read-from-minibuffer))) - (if google-translate-try-other-direction - (call-interactively 'google-translate-query-translate-using-directions) - text))) - -(defun google-translate--setup-minibuffer-keymap () - "Setup additional key bindings for minibuffer." - (unless google-translate-minibuffer-keymap - (setq google-translate-minibuffer-keymap - (let ((map (make-sparse-keymap))) - (define-key map "\C-p" 'google-translate-previous-translation-direction) - (define-key map "\C-n" 'google-translate-next-translation-direction) - (define-key map "\C-l" 'google-translate-clear-minibuffer) - (set-keymap-parent map minibuffer-local-map) - map)))) - -(defun google-translate-clear-minibuffer () - "Delete minibuffer contents." - (interactive) - (delete-minibuffer-contents)) - -(defun google-translate--read-from-minibuffer () - "Read string from minibuffer." - (let* ((source-language - (google-translate--current-direction-source-language)) - (target-language - (google-translate--current-direction-target-language)) - (prompt (if (or (null source-language) - (null target-language)) - "Translate: " - (format "[%s > %s] Translate: " - (google-translate-language-display-name source-language) - (google-translate-language-display-name target-language))))) - (google-translate--setup-minibuffer-keymap) - (read-from-minibuffer - prompt - google-translate-translation-direction-query - google-translate-minibuffer-keymap nil nil - google-translate-translation-direction-query t))) - -(defun google-translate--current-direction-source-language () - "Retrieve source language from the current translation -direction." - (car (nth google-translate-current-translation-direction - google-translate-translation-directions-alist))) - -(defun google-translate--current-direction-target-language () - "Retrieve target language from the current translation -direction." - (cdr (nth google-translate-current-translation-direction - google-translate-translation-directions-alist))) - -;;;###autoload -(defun google-translate-smooth-translate () - "Translate a text using translation directions. - -Make a prompt in minibuffer for a text to translate. Default text -is word at point. - -In case of `google-translate-translation-directions-alist' is -empty list then after inputed translating text prompts for source -language and then for target languages. - -In case of `google-translate-translation-directions-alist' is not -empty list takes current translation direction and makes -appropriate translation. Current translation direction indicates -in the minibuffers' prompt. - -A current translation direction could be changed directly in the -minibuffer by means of key bindings such as C-n and C-p for -changing to the next translation direction and to the previous -one respectively." - (interactive) - - (setq google-translate-translation-direction-query - (if (use-region-p) - (google-translate--strip-string - (buffer-substring-no-properties (region-beginning) (region-end))) - (current-word t t))) - - (setq google-translate-current-translation-direction 0) - - (let* ((text (google-translate-query-translate-using-directions)) - (source-language (google-translate--current-direction-source-language)) - (target-language (google-translate--current-direction-target-language))) - (when (null source-language) - (setq source-language (google-translate-read-source-language))) - (when (null target-language) - (setq target-language (google-translate-read-target-language))) - (google-translate-translate source-language target-language text))) - - -(provide 'google-translate-smooth-ui) - -;;; google-translate-smooth-ui.el ends here diff --git a/elpa/google-translate-20190620.1416/google-translate-smooth-ui.elc b/elpa/google-translate-20190620.1416/google-translate-smooth-ui.elc deleted file mode 100644 index 1667b5a306982b443be17cb93d511d499b3ad434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7423 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 Y(Q#Sp9l)G70e+8Zk438=xVpx_0iNOI_5c6? diff --git a/elpa/google-translate-20190620.1416/google-translate-tk.el b/elpa/google-translate-20190620.1416/google-translate-tk.el deleted file mode 100644 index 09c93e41..00000000 --- a/elpa/google-translate-20190620.1416/google-translate-tk.el +++ /dev/null @@ -1,176 +0,0 @@ -;;; google-translate-tk.el --- functions for generation `tk' -;;; parameter. - -;; Copyright (C) 2012 Oleksandr Manzyuk - -;; Author: Oleksandr Manzyuk -;; Maintainer: Andrey Tykhonov -;; URL: https://github.com/atykhonov/google-translate -;; Version: 0.11.18 -;; Keywords: convenience - -;; Contributors: -;; Tassilo Horn -;; Bernard Hurley -;; Chris Bilson -;; Takumi Kinjo -;; momomo5717 - -;; This file is NOT part of GNU Emacs. - -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This file contains functions for generation `tk' parameter which is -;; required to make a valid request to the Google Translate. - -;;; Code: - -(require 'cl-lib) -(require 'google-translate-backend) - - -(defvar google-translate--bit-v-len 32) - -(defvar google-translate--tkk-url - "http://translate.google.com/") - - -(defun google-translate--bit-v-2comp (v) - "Return the two's complement of V." - (let* ((vc (vconcat v)) - (len (length vc))) - ;; Complement of v - (cl-loop for i from 0 below len do - (aset vc i (logxor (aref vc i) 1))) - ;; vc = complement of v + 1 - (cl-loop for i downfrom (1- len) to 0 - do (aset vc i (logxor (aref vc i) 1)) - when (> (aref vc i) 0) return nil) - vc)) - -(defun google-translate--number-to-bit-v (n) - "Return a bit vector from N." - (if (< n 0) (google-translate--bit-v-2comp - (google-translate--number-to-bit-v (abs n))) - (let ((v (make-vector google-translate--bit-v-len 0))) - (cl-loop for i downfrom (1- google-translate--bit-v-len) to 0 - with q - when (< n 1) return nil do - (setq q (ffloor (* n 0.5))) - (aset v i (floor (- n (* 2.0 q)))) - (setq n q)) - v))) - -(defun google-translate--bit-v-to-number (v) - "Return a floating-point number from V." - (if (and (> (aref v 0) 0) - ;; Exclude [1 0 ... 0] - (cl-loop for i from 1 below google-translate--bit-v-len - thereis (> (aref v i) 0))) - (- (google-translate--bit-v-to-number (google-translate--bit-v-2comp v))) - (funcall (if (> (aref v 0) 0) #'- #'+) - (cl-reduce (lambda (acc e) (+ (* acc 2.0) e)) - v :initial-value 0.0)))) - -(defun google-translate--logfn (fn n1 n2) - "Helper function for logical FN." - (let ((v1 (google-translate--number-to-bit-v n1)) - (v2 (google-translate--number-to-bit-v n2)) - (v (make-vector google-translate--bit-v-len 0))) - (cl-loop for i from 0 below google-translate--bit-v-len do - (aset v i (funcall fn (aref v1 i) (aref v2 i)))) - (google-translate--bit-v-to-number v))) - -(defun google-translate--logand (n1 n2) - "Return a floating-point number from N1 and N2." - (google-translate--logfn #'logand n1 n2)) - -(defun google-translate--logxor (n1 n2) - "Return a floating-point number from N1 and N2." - (google-translate--logfn #'logxor n1 n2)) - -(defun google-translate--lsh (n d) - "Return a floating-point number. -Shift the bits in N to the left or rihgt D places. -D is an integer." - (let ((v (google-translate--number-to-bit-v n)) - (v-result (make-vector google-translate--bit-v-len 0))) - (if (< d 0) ;; Shift Right Logical - ;; [x0 x1 ... xn-d ... xn] => [0 ... 0 x0 x1 ... xn-d] - (cl-loop for i from (abs d) below google-translate--bit-v-len - for j from 0 do - (aset v-result i (aref v j))) - ;; Shift Left Logical - ;; [x0 x1 ... xd ... xn] => [xd ... xn 0 ... 0] - (cl-loop for i from d below google-translate--bit-v-len - for j from 0 do - (aset v-result j (aref v i)))) - (google-translate--bit-v-to-number v-result))) - -(defun google-translate--search-tkk () - "Search TKK." - (let ((start nil) - (tkk nil) - (nums '())) - (setq start (search-forward ",tkk:'")) - (search-forward "',") - (backward-char 2) - (setq tkk (buffer-substring start (point))) - (setq nums (split-string tkk "\\.")) - (list (string-to-number (car nums)) - (string-to-number (car (cdr nums)))))) - -(defun google-translate--get-b-d1 () - "Return a list of b and d1 for `google-translate--gen-tk'." - (let ((url-request-extra-headers '(("Connection" . "close")))) - (with-temp-buffer - (save-excursion (google-translate-backend-retrieve - google-translate--tkk-url)) - (google-translate--search-tkk)))) - -(defun google-translate--gen-rl (a b) - (cl-loop for c from 0 below (- (length b) 2) by 3 - for d = (aref b (+ c 2)) do - (setq d (if (>= d ?a) (- d 87) (- d ?0))) - (setq d (if (= (aref b (1+ c)) ?+) - (google-translate--lsh a (- d)) - (google-translate--lsh a d))) - (setq a (if (= (aref b c) ?+) - (google-translate--logand (+ a d) 4294967295.0) - (google-translate--logxor a d)))) - a) - -(defun google-translate--gen-tk (text &optional b-d1) - (setq b-d1 (or b-d1 (google-translate--get-b-d1))) - (let* ((b (cl-first b-d1)) - (d1 (cl-second b-d1)) - (ub "+-3^+b+-f") - (vb "+-a^+6") - (a (cl-reduce (lambda (a e) (google-translate--gen-rl (+ a e) vb)) - (encode-coding-string text 'utf-8) :initial-value b))) - (setq a (google-translate--gen-rl a ub)) - (setq a (google-translate--logxor a d1)) - (when (< a 0) ;; (abs a) + 2^31 - (setq a (+ (google-translate--logand a 2147483647.0) 2147483648.0))) - (setq a (ffloor (mod a 1e6))) - (format "%s.%s" - (car (split-string (number-to-string a) "\\.")) - (car (split-string (number-to-string - (google-translate--logxor a b)) "\\."))))) - - -(provide 'google-translate-tk) -;;; google-translate-tk.el ends here diff --git a/elpa/google-translate-20190620.1416/google-translate-tk.elc b/elpa/google-translate-20190620.1416/google-translate-tk.elc deleted file mode 100644 index e7e5d0c04c4d1ba8d22bca4cae02902350d201bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4859 zcmcIo{d3#K5#>)EQ5tD%$964SR+pet>kBk+07+4vPL#@Nq0i!Wckq=RHQielN*50Rp8 zhJKLIM5bAkC=#uPqkBF?`GEX5reu^y!|30Bj_$0ns5_4bQAQ!W&^VJB^?q0WFbb%b z1X-R&s-NwkH_dYLdp+5s^I7apLv-eR^b+_`Nlrncav#RyJT!OFqRg+44qm^eVBn{I zkYkBEdU{{=C`%~t6?G-WiGOL5@>MdDei}zIrF;NG;S}=%g3tQ!0zUV%xVX5{{XLgv zkn|)Oo?}_K?3yQRzTr#Y!D<`yHkI$kQ7S2j%{b~(KS}zrH1pI~S?t3_*ALF5>Yb9< zT-@l%aN?))MrJq4&50RHMb1a<^0PB@oW^7f@_e-S;>Gzqjbh?PkPKfKn~U{*r%C^i z`8ZX8S5p2Vd7gp4;V70vsd7p}`mymRy&^x3{EVK@t-M^6;89e6yD{0+P_z~p2YdC~ z$AF>z#8YcaUicHxa6F?@UGf~;sxBSk$M%fZjM&mK+kXKI;f0kgPaQo$uXu_tXWa`i z!fOA_e`JgAD?EtZJ@i8UdB9%(&aI;Guyk}j*-m9e8(G`cEp#$j6Pg6X zC`VMc|5D#GP0$8LOq1&3^79129{4#~h~NHiNlG^5q@tMW&LzWBYSBjh88xWc>1>`d z^rAC`-X{=?+zoO#2-9RpZ*Bu!jfY*Cnt4*d&%i4HzW|h48s!zdt<}aGBMfbOp;pt8 z$Ou%~#xovQHNegq+S~%=dkk_*gZx7UuI#3EC1!BmJ4e&uMwik2f$v&u-hNlR?aRef`mL`bA!=7QW$%qVbM zjw-WClY7V%=_qe$hF3ksd15h*_S5Q;W^AjnP@Nhg`oCh=?r*w3bAj)|IweO9(^PNy*T`MIvNsMS=ZhZ%B+Hx;@2Z~1Z;tHO?F7bAj8ADVQc)iHod5Ay zA|%i}CEj*jw_x6J=upNZ>{8)a1-!>nhyX%Ohyp*RzulV8unZNi3g5~mC1zC=d{=8a znH4~{Jmbk4r>nK@DNn60t$1psVBM|g2QOSk+o2cg@1nTkR`dQ4W5E0a)K`SdQf<3@ zXFcUdnL|w!G_kL-xtdfL6YAy^ozXU5WJ7fU<4)5mvupR0vg?gaEG*uL+e#=PXG5-> zGr*Asma|Z;--1g)SK;B5+_De|Q1yRXD{n5Jw^n$#uvT|kwQS421=z;o(I5(QEfJ8* z87sjzlqb3&mgvFS(rD1n=@pG)KafzEuL$B2iVf9I_GNl28`(g=9`!CpejA$=hy3Fw z*rRc$t6Q6k5H^?E)9Shw5|9VWWe#9lQp-q#@KEnN%f}CJf2?JIB~~jO@8YE5g&4Zb z4)xGw?e=F3h4Iqzbwj_xP%e_HHWdlC>{uu?**M0oP7u!jbJp<2bW=H-WzN-V`mgyt z>O3@CO}hw9+o2;!>R>>}-+gx*E19-5p(jBO?~bf;wX)(Z<9Sou+?6niEu74U^uhW zXOAYIS3Hb`&SqmRk=xv8+%H5E#D;C(;XY5HwBVGYSq~72SF^fDK4g&4r;1LScH89c zlIvW9V2m0%hrC(tbFS#PomN|Pn$WV>TJa9!V2Ah=ymKxH8#yAA{>* zQPh8iUfAezgy50F@jTs)N+g=P9k|zY6HY)5s*z*k5-V${I}Q$@`_qq9QwTq!AX*5 zxXw8THfq=@NyUFM@IMV)-^!X-{K0ZXq2A=?8vlq4=KO|mU~wdDx9#paEw_!JIe*y2 zLwQ6RCOxt({o%$W9pW%-e3>=A%utOl7U-Ewyi~FMQ|fTQjnZTi;ct}rKN#|}&Bgx$ DN_TdH diff --git a/elpa/google-translate-20190620.1416/google-translate.el b/elpa/google-translate-20190620.1416/google-translate.el deleted file mode 100644 index 8845a1d8..00000000 --- a/elpa/google-translate-20190620.1416/google-translate.el +++ /dev/null @@ -1,84 +0,0 @@ -;;; google-translate.el --- Emacs interface to Google Translate - -;; Copyright (C) 2012 Oleksandr Manzyuk - -;; Author: Oleksandr Manzyuk -;; Maintainer: Andrey Tykhonov -;; URL: https://github.com/atykhonov/google-translate -;; Version: 0.11.18 -;; Keywords: convenience - -;; Contributors: -;; Tassilo Horn -;; Bernard Hurley -;; Chris Bilson -;; Takumi Kinjo -;; momomo5717 - -;; This file is NOT part of GNU Emacs. - -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Installation: - -;; From MELPA or Marmalade. - -;; Just run `M-x package-install RET google-translate RET` - -;; Manual installation. - -;; Assuming that the file `google-translate.el' and other files which -;; relates to this package is somewhere on the load path, add the -;; following lines to your `.emacs' file: - -;; (require 'google-translate) -;; (require 'google-translate-default-ui) -;; (global-set-key "\C-ct" 'google-translate-at-point) -;; (global-set-key "\C-cT" 'google-translate-query-translate) - -;; or - -;; (require 'google-translate) -;; (require 'google-translate-smooth-ui) -;; (global-set-key "\C-ct" 'google-translate-smooth-translate) -;; -;; Change the key bindings to your liking. - -;; The difference between these configurations is in UI which will be -;; used: Default UI or Smooth UI. -;; -;; Please read the source of `google-translate-default-ui.el' and -;; `google-translate-smooth-ui.el' for more details. - -;; Customization: - -;; Variables which are available for customization are depends on UI -;; package which is selected for the google-translate -;; package. google-translate-default-ui - is UI which is selected by -;; default. It loads by default and is available right after -;; google-translate installation and its initialization. Please read -;; documentation for the `google-translate-core-ui.el' and -;; `google-translate-default-ui.el' packages for more info about -;; customization. -;; - -;;; Code: - -(require 'google-translate-default-ui) - -(provide 'google-translate) - -;;; google-translate.el ends here diff --git a/elpa/google-translate-20190620.1416/google-translate.elc b/elpa/google-translate-20190620.1416/google-translate.elc deleted file mode 100644 index 5d4b324b291819fce551db34ad1f604c3da63538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmbtQ!Ab)`4DES;z-#PDperjDBB)0Lfn?sx zdzmz=hvmg+G%A{=fu(c@4&;Z1Bdj`f8IF`PON8oXS`Ww@YYP|x$U(W|cT|J(v>3pr zmNV>31^P@G{3&9`4!pRmiQ_&`3{6=9y(bUfF7w5-TKv)QVj58toJ2(<_qr?Z>?M}> zkIVHMT#E^v+KQ9G9;1gW;4s3LAPD|2`T9x*!W5ViXlul({`9pI{4352{5OiCxZ0kS zN++IRys2k1%lYM|nxBixvbJV+JBH^(uRSM%y~sXLsR?5aXtSPn*at0phC`Ago6>L2 I3sl#|2VtR>s{jB1 diff --git a/elpa/graphviz-dot-mode-20200304.432/company-graphviz-dot.el b/elpa/graphviz-dot-mode-20200304.432/company-graphviz-dot.el deleted file mode 100644 index a7fed4d9..00000000 --- a/elpa/graphviz-dot-mode-20200304.432/company-graphviz-dot.el +++ /dev/null @@ -1,108 +0,0 @@ -;;; company-graphviz-dot.el --- Company completion function for -;;; graphviz-dot-mode - -;; Copyright (C) Bjarte Johansen -;; Copyright (C) 2019 - 2020 Pieter Pareit - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2 of -;; the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be -;; useful, but WITHOUT ANY WARRANTY; without even the implied -;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -;; PURPOSE. See the GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public -;; License along with this program; if not, write to the Free -;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, -;; MA 02111-1307 USA - -;; Authors: Bjarte Johansen -;; Pieter Pareit -;; Homepage: http://ppareit.github.com/graphviz-dot-mode/ -;; Created: -;; Last modified: -;; Version: 0.0.1 -;; Keywords: mode dot dot-language dotlanguage graphviz graphs att company - -;;; Commentary: - -;;; Code: - -(require 'company) -(require 'graphviz-dot-mode) - -(eval-when-compile - (require 'cl-lib)) - -(defun company-gz-dot--candidates (arg) - "Return good candidates for the argument ARG for company." - (all-completions arg - (cl-case (company-graphviz-dot--syntax-at-point) - (compasspoint graphviz-values-type-portpos) - (color graphviz-dot-color-keywords) - (arrow graphviz-values-type-arrow) - (shape graphviz-values-type-shape) - (style graphviz-values-type-style) - (dir graphviz-values-type-dir) - (outputmode graphviz-values-type-outputmode) - (packmode graphviz-values-type-packmode) - (pagedir graphviz-values-type-pagedir) - (portpos graphviz-values-type-portpos) - (bool graphviz-values-type-bool) - (value graphviz-dot-value-keywords) - ((comment string) nil) - (t graphviz-dot-attr-keywords)))) - -(defun company-graphviz-dot--syntax-at-point () - "Return the syntax at point. -This can be one of comment, string, out, value, attribute, color, -arrow, shape, style, dir, outputmode or other." - (let ((state (syntax-ppss))) - (cond - ((nth 4 state) 'comment) - ((nth 3 state) 'string) - ((not (nth 1 state)) 'out) - (t (save-excursion - (skip-chars-backward "^[\\[,;=:\n]") - (backward-char) - (cond - ((looking-at "[\\[,;\n]") 'attribute) - ((looking-at ":") 'compasspoint) - ((looking-at "=") - (progn - (backward-word 1) - (cond - ((looking-at "[a-zA-Z]*color") 'color) - ((member (word-at-point) graphviz-attributes-type-arrow) 'arrow) - ((member (word-at-point) graphviz-attributes-type-shape) 'shape) - ((member (word-at-point) graphviz-attributes-type-style) 'style) - ((member (word-at-point) graphviz-attributes-type-dir) 'dir) - ((member (word-at-point) graphviz-attributes-type-outputmode) 'outputmode) - ((member (word-at-point) graphviz-attributes-type-packmode) 'packmode) - ((member (word-at-point) graphviz-attributes-type-pagedir) 'pagedir) - ((member (word-at-point) graphviz-attributes-type-portpos) 'portpos) - ((member (word-at-point) graphviz-attributes-type-bool) 'bool) - (t 'value)))) - (t 'other))))))) - - -;;;###autoload -(defun company-graphviz-dot-backend (command &optional arg &rest ignored) - "Company backend for `graphviz-dot-mode'. -In the signature, COMMAND, ARG and IGNORED are mandated by `company-mode'." - (interactive (list 'interactive)) - (cl-case command - (interactive (company-begin-backend 'company-graphviz-dot-backend)) - (prefix (and (eq major-mode 'graphviz-dot-mode) - (company-grab-symbol))) - (candidates (company-gz-dot--candidates arg)) - (no-cache t) - (require-match 'never))) - -(add-to-list 'company-backends 'company-graphviz-dot-backend) - -(provide 'company-graphviz-dot) -;;; company-graphviz-dot.el ends here diff --git a/elpa/graphviz-dot-mode-20200304.432/company-graphviz-dot.elc b/elpa/graphviz-dot-mode-20200304.432/company-graphviz-dot.elc deleted file mode 100644 index f3f7d7dc155ea448e331e18e0bb2d50a6d4a12b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3518 zcmb_f+iu%N5apwzAVS}g)NM17Qrjv-RlG>@1qNa`Mqr>xinM*HH=gc4l_w?D5grFQ?B9!)P2G9l@yxV?W@Y`r=1$7P4syH#|vw z5rIAIISRS;?IN0_ z5}4<44~ku^gPwg*^Wh2f5eW%X5lM!|OF1+5@l9l&{C0YN4$}oo*i>SOU9~-nJV*sh zSp*XffnaN!WT~XUSrYg>0l7d!+tK@C3BKxw0{GgWMx(JeSxIhAg~y>acKUt%Sg*&n zMGy3`@k@Wyf{TP-Fa3mLZNivEE0`xNUflTirYEEs;`&RlJB{|+!9INEa+yRh7s8|3 zc)rIZR(2++1RPj0UxqxAaPs-RdYQTGy=v@ve8vKwrLdd5H0OE;v*M_Iv4=i7D&XN3 z204P4W5?=0!C%(6g#kO?7~=^4+GE=p7&&HZY}L&rw* zMGYHj?A&O+tYIUK{b4k}-Nfv^#+cFEu3=erq0#)VhGp5^J&?JbrH5-=qxpSpX_n#G zw);l&hYD;Du%>pF3D(lVTH2$+p!uq!f~Eez6M?pM+&+{%jLYu0VZoB8rd-9`j71`2 zk(MB}&Qt^|xFc%M+Uj5rB#gLLQ>` zJq${&;xgW)VU;1uv|MQ1tI`_4!|T94$q<2P&A&gsE9a-8J!Cit_!+yU8;Xq*S3o* zk=-Xt$-8KW?bB_jGecwQ23mus)}>=p>+*9${t>u;@(9sX39Z&E?F%|OqR1h*JW$g?)SaPc#^)1+$+m)XMzN3Bon ztEbM&R=MPYFvZNyF@DAI*83EgtJdMpG_cn2rs8s-pkHa(u(He^!4o1&+V28Er@syo zooaMOXf+yKiiE1cYXbAMDI5feQZ@Pyq19j!MN-uu?l&UbUEjFbE)8r-M_E%1$A@+UQxWP#HO#Ox*O{x9^Z=J@gA*O{+~Jim+B z2K&_vHZQA91ENUOJQ>$n1INzD&KfCgOCo84Hw8zLNYdv^aoD+H+U+&YBPEGae;zRu zO-Nd&pFVsz`S`A@)Da2H^YKuTp`g_wEG`8Ee{6e6R|7# z-XT#fA{LM+gPnwLG=WRaFI5GTp&%itv>T^E^`u eQ+dh*%MwhhiIm#COkdpisBZFA)f!=>oyNZdv^XXJ diff --git a/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode-autoloads.el b/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode-autoloads.el deleted file mode 100644 index c8f0d100..00000000 --- a/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode-autoloads.el +++ /dev/null @@ -1,86 +0,0 @@ -;;; graphviz-dot-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "company-graphviz-dot" "company-graphviz-dot.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from company-graphviz-dot.el - -(autoload 'company-graphviz-dot-backend "company-graphviz-dot" "\ -Company backend for `graphviz-dot-mode'. -In the signature, COMMAND, ARG and IGNORED are mandated by `company-mode'. - -\(fn COMMAND &optional ARG &rest IGNORED)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "company-graphviz-dot" '("company-g"))) - -;;;*** - -;;;### (autoloads nil "graphviz-dot-mode" "graphviz-dot-mode.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from graphviz-dot-mode.el - -(autoload 'graphviz-dot-mode "graphviz-dot-mode" "\ -Major mode for the dot language. \\ -TAB indents for graph lines. - -\\[graphviz-dot-indent-graph] - Indentation function. -\\[graphviz-dot-preview] - Previews graph in a buffer. -\\[graphviz-dot-view] - Views graph in an external viewer. -\\[graphviz-dot-indent-line] - Indents current line of code. - -Variables specific to this mode: - - `graphviz-dot-dot-program' (default `dot') - Program used to compile the graphs. - `graphviz-dot-preview-extension' (default `png') - File type to use for output. - `graphviz-dot-view-command' (default `dotty %s') - Command to run when `graphviz-dot-view' is executed. - `graphviz-dot-view-edit-command' (default nil) - If the user should be asked to edit the view command. - `graphviz-dot-save-before-view' (default t) - Automatically save current buffer berore `graphviz-dot-view'. - -\(fn)" t nil) - -(autoload 'graphviz-dot-preview "graphviz-dot-mode" "\ -Compile the graph and preview it in an other buffer. - -\(fn)" t nil) - -(autoload 'graphviz-turn-on-live-preview "graphviz-dot-mode" "\ -Turn on live preview. -This will update the preview on every save. - -\(fn)" t nil) - -(autoload 'graphviz-turn-off-live-preview "graphviz-dot-mode" "\ -Turn off live preview. -Saving the file will no longer also update the preview. - -\(fn)" t nil) - -(add-to-list 'auto-mode-alist '("\\.dot\\'" . graphviz-dot-mode)) - -(add-to-list 'auto-mode-alist '("\\.gv\\'" . graphviz-dot-mode)) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "graphviz-dot-mode" '("graphviz-" "dot-menu"))) - -;;;*** - -;;;### (autoloads nil nil ("graphviz-dot-mode-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; graphviz-dot-mode-autoloads.el ends here diff --git a/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode-pkg.el b/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode-pkg.el deleted file mode 100644 index 5d40accc..00000000 --- a/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode-pkg.el +++ /dev/null @@ -1,10 +0,0 @@ -(define-package "graphviz-dot-mode" "20200304.432" "Mode for the dot-language used by graphviz (att)." - '((emacs "25.0")) - :keywords - '("mode" "dot" "dot-language" "dotlanguage" "graphviz" "graphs" "att") - :maintainer - '("Pieter Pareit" . "pieter.pareit@gmail.com") - :url "https://ppareit.github.io/graphviz-dot-mode/") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode.el b/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode.el deleted file mode 100644 index 7fcf2123..00000000 --- a/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode.el +++ /dev/null @@ -1,843 +0,0 @@ -;;; graphviz-dot-mode.el --- Mode for the dot-language used by graphviz (att). - -;; Copyright (C) 2002 - 2020 Pieter Pareit - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2 of -;; the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be -;; useful, but WITHOUT ANY WARRANTY; without even the implied -;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -;; PURPOSE. See the GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public -;; License along with this program; if not, write to the Free -;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, -;; MA 02111-1307 USA - -;; Authors: Pieter Pareit -;; Rubens Ramos -;; Eric Anderson http://www.ece.cmu.edu/~andersoe/ -;; Maintainer: Pieter Pareit -;; Homepage: https://ppareit.github.io/graphviz-dot-mode/ -;; Created: 28 Oct 2002 -;; Last modified: 25 Januari 2020 -;; Version: 0.4.2 -;; Package-Requires: ((emacs "25.0")) -;; Keywords: mode dot dot-language dotlanguage graphviz graphs att - -;;; Commentary: -;; Use this mode for editing files in the dot-language, see -;; https://www.graphviz.org. -;; -;; To use graphviz-dot-mode, add -;; (use-package graphviz-dot-mode -;; :ensure t) -;; to your ~/.emacs.el file. -;; -;; The graphviz-dot-mode will do font locking, indentation, preview of -;; graphs and eases compilation/error location. Font locking is -;; automatic, indentation uses the same commands as other modes, tab, -;; M-j and C-M-q. Insertion of comments uses the same commands as -;; other modes, M-; . You can compile a file using M-x compile or C-c -;; c, after that M-x next-error will also work. There is support for -;; viewing an generated image with C-c p. -;; -;;; Todo: -;; -;;; History: -;; Version 0.4.2 Pieter Pareit -;; 25/01/2020: * Fix issues -;; * Improve font-locking -;; * Improve completion by implementing company mode -;; * Rewrote basic documentation -;; Version 0.4.1 Pieter Pareit -;; 28/09/2019: * Maintenance, checking documentation, fixing flycheck errors. -;; * Solve next-error for gaphviz -;; * Tag new version -;; Version 0.3.11 Olli Piepponen -;; 29/01/2016: * use define-derived-mode for the mode-definition -;; * add support for a auto-loading live preview work flow -;; Version 0.3.10 Kevin Ryde -;; 25/05/2015: * shell-quote-argument for safety -;; * use read-shell-command whenever available, don't set novaproc -;; Version 0.3.9 Titus Barik -;; 28/08/2012: * compile-command uses -ofile instead of > -;; Version 0.3.8 new home -;; 27/06/2012: * put graphviz-dot-mode into git, updated links -;; Version 0.3.7 Tim Allen -;; 09/03/2011: * fix spaces in file names when compiling -;; Version 0.3.6 maintenance -;; 19/02/2011: * .gv is the new extension (Pander) -;; * comments can start with # (Pander) -;; * highlight of new keywords (Pander) -;; Version 0.3.5 bug (or at least feature I dislike) fix -;; 11/11/2010: Eric Anderson http://www.ece.cmu.edu/~andersoe/ -;; * Preserve indentation across blank (whitespace-only) lines -;; Version 0.3.4 bug fixes -;; 24/02/2005: * fixed a bug in graphviz-dot-preview -;; Version 0.3.3 bug fixes -;; 13/02/2005: Reuben Thomas -;; * add graphviz-dot-indent-width -;; Version 0.3.2 bug fixes -;; 25/03/2004: Rubens Ramos -;; * semi-colons and brackets are added when electric -;; behaviour is disabled. -;; * electric characters do not behave electrically inside -;; comments or strings. -;; * default for electric-braces is disabled now (makes more -;; sense I guess). -;; * using read-from-minibuffer instead of read-shell-command -;; for emacs. -;; * Fixed test for easymenu, so that it works on older -;; versions of XEmacs. -;; * Fixed indentation error when trying to indent last brace -;; of an empty graph. -;; * region-active-p does not exist in emacs (21.2 at least), -;; so removed from code -;; * Added uncomment menu option -;; Version 0.3.1 bug fixes -;; 03/03/2004: * backward-word needs argument for older emacs -;; Version 0.3 added features and fixed bugs -;; 10/01/2004: fixed a bug in graphviz-dot-indent-graph -;; 08/01/2004: Rubens Ramos -;; * added customization support -;; * Now it works on XEmacs and Emacs -;; * Added support to use an external Viewer -;; * Now things do not break when dot mode is entered -;; when there is no buffer name, but the side effect is -;; that in this case, the compilation command is not -;; correct. -;; * Preview works on XEmacs and emacs. -;; * Electric indentation on newline -;; * Minor changes to indentation -;; * Added keyword completion (but could be A LOT better) -;; * There are still a couple of ugly hacks. Look for 'RR'. -;; Version 0.2 added features -;; 11/11/2002: added preview support. -;; 10/11/2002: indent a graph or subgraph at once with C-M-q. -;; 08/11/2002: relaxed rules for indentation, the may now be extra chars -;; after beginning of graph (comment's for example). -;; Version 0.1.2 bug fixes and naming issues -;; 06/11/2002: renamed dot-font-lock-defaults to dot-font-lock-keywords. -;; added some documentation to dot-colors. -;; provided a much better way to handle my max-specpdl-size -;; problem. -;; added an extra autoload cookie (hope this helps, as I don't -;; yet use autoload myself) -;; Version 0.1.1 bug fixes -;; 06/11/2002: added an missing attribute, for font-locking to work. -;; fixed the regex generating, so that it only recognizes -;; whole words -;; 05/11/2002: there can now be extra whitespace chars after an '{'. -;; 04/11/2002: Why I use max-specpdl-size is now documented, and old value -;; gets restored. -;; Version 0.1 initial release -;; 02/11/2002: implemented parser for *compilation* of a .dot file. -;; 01/11/2002: implemented compilation of an .dot file. -;; 31/10/2002: added syntax-table to the mode. -;; 30/10/2002: implemented indentation code. -;; 29/10/2002: implemented all of font-lock. -;; 28/10/2002: derived graphviz-dot-mode from fundamental-mode, started -;; implementing font-lock. - -;;; Code: - -(require 'compile) -(require 'subr-x) - -(defconst graphviz-dot-mode-version "0.4.2" - "Version of `graphviz-dot-mode.el'.") - -(defgroup graphviz nil - "Major mode for editing Graphviz Dot files" - :group 'tools) - -(defun graphviz-dot-customize () - "Run \\[customize-group] for the `graphviz' group." - (interactive) - (customize-group 'graphviz)) - -(defvar graphviz-dot-mode-abbrev-table nil - "Abbrev table in use in Graphviz Dot mode buffers.") -(define-abbrev-table 'graphviz-dot-mode-abbrev-table ()) - -(defcustom graphviz-dot-dot-program "dot" - "*Location of the dot program. This is used by `compile'." - :type 'string - :group 'graphviz) - -(defcustom graphviz-dot-layout-programs - '("dot" "neato" "fdp" "sfdp" "twopi" "twopi" "circo") - "*List of layout programs for the user to choose from." - :type 'list - :group 'graphviz) - -(defcustom graphviz-dot-view-command "dotty %s" - "*External program to run on the buffer. -You can use `%s' in this string, and it will be substituted by the buffer name." - :type 'string - :group 'graphviz) - -(defcustom graphviz-dot-view-edit-command nil - "*Whether to allow the user to edit the command to run an external viewer." - :type 'boolean - :group 'graphviz) - -(defcustom graphviz-dot-save-before-view t - "*If not nil, \\[graphviz-dot-view] saves the current buffer before running the command." - :type 'boolean - :group 'graphviz) - -(defcustom graphviz-dot-indent-width tab-width - "*Indentation width in Graphviz Dot mode buffers." - :type 'integer - :group 'graphviz) - -(defcustom graphviz-dot-preview-extension "png" - "*The extension to use for the compilation and preview commands. -The default format for the compilation command is `dot -T png -file.dot -o file.png'." - :type 'string - :group 'graphviz) - -(defcustom graphviz-dot-auto-preview-on-save nil - "*Determines if saving the buffer should automatically trigger preview." - :type 'boolean - :group 'graphviz) - -(defcustom graphviz-dot-revert-delay 300 - "*Amount of time to sleep before attempting to display the rendered image." - :type 'number - :group 'graphviz) - -(defcustom graphviz-dot-attr-keywords - '("graph" "digraph" "subgraph" "node" "edge" "strict" "rankdir" - "size" "page" "Damping" "Epsilon" "URL" "arrowhead" "arrowsize" - "arrowtail" "bb" "bgcolor" "bottomlabel" "center" "clusterrank" - "color" "colorscheme" "comment" "compound" - "concentrate" "constraint" "decorate" - "dim" "dir" "distortion" "fillcolor" "fixedsize" "fontcolor" - "fontname" "fontpath" "fontsize" "group" "headURL" "headlabel" - "headport" "height" "label" "labelangle" "labeldistance" "labelfloat" - "labelfontcolor" "labelfontname" "labelfontsize" "labeljust" - "labelloc" "layer" "layers" "len" "lhead" "lp" "ltail" "margin" - "maxiter" "mclimit" "minlen" "model" "nodesep" "normalize" "nslimit" - "nslimit1" "ordering" "orientation" "overlap" "pack" "pagedir" - "pencolor" "peripheries" "pin" "pos" "quantum" "rank" "ranksep" - "ratio" "rects" "regular" "remincross" "rotate" "samehead" "sametail" - "samplepoint" "searchsize" "sep" "shape" "shapefile" "showboxes" - "sides" "skew" "splines" "start" "style" "stylesheet" "tailURL" - "taillabel" "tailport" "toplabel" "vertices" "voro_margin" "weight" - "z" "width" "penwidth" "mindist" "scale" "patch" "root") - "*Keywords for attribute names in a graph. -This is used by the auto completion code. The actual completion -tables are built when the mode is loaded, so changes to this are -not immediately visible." - :type '(repeat (string :tag "Keyword")) - :group 'graphviz) - -(defvar graphviz-attributes-type-arrow - '("arrowhead" "arrowtail") - "The attributes that are of type `arrow'. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html for -more information about possible attributes.") - -(defvar graphviz-values-type-arrow - '("box" "lbox" "rbox" "obox" "olbox" "orbox" - "crow" "lcrow" "rcrow" - "diamond" "ldiamond" "rdiamond" "odiamond" "oldiamond" "ordiamond" - "dot" "odot" - "inv" "linv" "rinv" "oinv" "olinv" "orinv" - "none" - "normal" "lnormal" "rnormal" "onormal" "olnormal" "ornormal" - "tee" "ltee" "rtee" - "vee" "lvee" "rvee" - "curve" "lcurve" "rcurve" "ocurve" "olcurve" "orcurve") - "The possible values that an attribute of type `arrow' can have. -See https://graphviz.gitlab.io/_pages/doc/info/arrows.html for -more information about the arrow shape.") - -(defvar graphviz-attributes-type-shape - '("shape") - "The attributes that are of type `shape'. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html for -more information about possible attributes.") - -(defvar graphviz-values-type-shape - '("box" "polygon" "ellipse" "oval" "circle" "point" "egg" "triangle" "plaintext" - "plain" "diamond" "trapezium" "parallelogram" "house" "pentagon" "hexagon" - "septagon" "octagon" "doublecircle" "doubleoctagon" "tripleoctagon" - "invtriangle" "invtrapezium" "invhouse" "Mdiamond" "Msquare" "Mcircle" "rect" - "rectangle" "square" "star" "none" "underline" "cylinder" "note" "tab" "folder" - "box3d" "component" "promoter" "cds" "terminator" "utr" "primersite" - "restrictionsite" "fivepoverhang" "threepoverhang" "noverhang" "assembly" - "signature" "insulator" "ribosite" "rnastab" "proteasesite" "proteinstab" - "rpromoter" "rarrow" "larrow" "lpromoter") - "The possible values that an attribute of type `shape' can have. -See https://graphviz.gitlab.io/_pages/doc/info/shape.html for -more information about the node shapes.") - -(defvar graphviz-attributes-type-style - '("style") - "The attributes that are of type `style'. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html for -more information about possible attributes.") - -(defvar graphviz-values-type-style - '("dashed" "dotted" "solid" "invis" "bold" "tapered" "filled" "striped" - "wedged" "diagonals" "rounded" "filled" "striped" "rounded" "radial") - "The possible values that an attribute of type `style' can have. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html#k:style for -more information about possible styles.") - -(defvar graphviz-attributes-type-dir - '("dir") - "The attributes that are of type `bool'. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html for -more information about possible attributes.") - -(defvar graphviz-values-type-dir - '("forward" "back" "both" "none") - "The possible values that an attribute of type `dir' can have. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html#k:dirType for -more information about the direction that edges can have.") - -(defvar graphviz-attributes-type-outputmode - '("outputorder") - "The attributes that are of type `outputMode'. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html for -more information about possible attributes.") - -(defvar graphviz-values-type-outputmode - '("breadthfirst" "nodesfirst" "edgesfirst") - "The possible values that an attribute of type `outputMode' can have. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html#k:outputMode for -more information.") - -(defvar graphviz-attributes-type-packmode - '("packmode") - "The attributes that are of type `packMode'. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html for -more information about possible attributes.") - -(defvar graphviz-values-type-packmode - '("node" "clust" "array") - "The possible values that an attribute of type `packMode' can have. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html#k:packMode for -more information.") - -(defvar graphviz-attributes-type-pagedir - '("pagedir") - "The attributes that are of type `pagedir'. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html for -more information about possible attributes.") - -(defvar graphviz-values-type-pagedir - '("BL" "BR" "TL" "TR" "RB" "RT" "LB" "LT") - "The possible values that an attribute of type `pagedir' can have. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html#k:pagedir for -more information.") - -(defvar graphviz-attributes-type-bool - '("center" "compound" "concentrate" "constraint" "decorate" - "diredgeconstraints" "fixedsize" "forcelabels" "headclip" "imagescale" - "labelfloat" "landscape" "mosek" "newrank" "nojustify" "normalize" - "notranslate" "overlap" "overlap_shrink" "pack" "pin" "quadtree" "regular" - "remincross" "root" "splines" "tailclip" "truecolor") - "The attributes that are of type `bool'. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html for -more information about possible attributes.") - -(defvar graphviz-values-type-bool - '("true" "false" "yes" "no" "1" "0") - "The possible values that an attribute of type `bool' can have.") - -(defvar graphviz-attributes-type-portpos - '("headport" "tailport") - "The attributes that are of type `portPos'. -See https://graphviz.gitlab.io/_pages/doc/info/attrs.html for -more information about possible attributes.") - -(defvar graphviz-values-type-portpos - '("n" "ne" "e" "se" "s" "sw" "w" "nw" "c" "_") - "The possible values that an attribute of type `portPos' can have. -The can also be used on the edge as a compass point. See -https://graphviz.gitlab.io/_pages/doc/info/attrs.html#k:portPos -for more information.") - -(defcustom graphviz-dot-value-keywords - '("true" "false" "normal" "inv" "dot" "invdot" "odot" "invodot" - "none" "tee" "empty" "invempty" "diamond" "odiamond" "box" "obox" - "open" "crow" "halfopen" "local" "global" "none" "forward" "back" - "both" "none" "BL" "BR" "TL" "TR" "RB" "RT" "LB" "LT" ":n" ":ne" ":e" - ":se" ":s" ":sw" ":w" ":nw" "same" "min" "source" "max" "sink" "LR" - "box" "polygon" "ellipse" "circle" "point" "egg" "triangle" - "plaintext" "diamond" "trapezium" "parallelogram" "house" "hexagon" - "octagon" "doublecircle" "doubleoctagon" "tripleoctagon" "invtriangle" - "invtrapezium" "invhouse" "Mdiamond" "Msquare" "Mcircle" "record" - "Mrecord" "dashed" "dotted" "solid" "invis" "bold" "filled" - "diagonals" "rounded" ) - "*Keywords for attribute values. -This is used by the auto completion code. The actual completion -tables are built when the mode is loaded, so changes to this are -not immediately visible." - :type '(repeat (string :tag "Keyword")) - :group 'graphviz) - -;;; Font-locking: -(defvar graphviz-dot-color-keywords - '("aliceblue" "antiquewhite" "antiquewhite1" "antiquewhite2" - "antiquewhite3" "antiquewhite4" "aquamarine" "aquamarine1" - "aquamarine2" "aquamarine3" "aquamarine4" "azure" "azure1" - "azure2" "azure3" "azure4" "beige" "bisque" "bisque1" "bisque2" - "bisque3" "bisque4" "black" "blanchedalmond" "blue" "blue1" - "blue2" "blue3" "blue4" "blueviolet" "brown" "brown1" "brown2" - "brown3" "brown4" "burlywood" "burlywood1" "burlywood2" - "burlywood3" "burlywood4" "cadetblue" "cadetblue1" - "cadetblue2" "cadetblue3" "cadetblue4" "chartreuse" - "chartreuse1" "chartreuse2" "chartreuse3" "chartreuse4" - "chocolate" "chocolate1" "chocolate2" "chocolate3" "chocolate4" - "coral" "coral1" "coral2" "coral3" "coral4" "cornflowerblue" - "cornsilk" "cornsilk1" "cornsilk2" "cornsilk3" "cornsilk4" - "crimson" "cyan" "cyan1" "cyan2" "cyan3" "cyan4" "darkgoldenrod" - "darkgoldenrod1" "darkgoldenrod2" "darkgoldenrod3" - "darkgoldenrod4" "darkgreen" "darkkhaki" "darkolivegreen" - "darkolivegreen1" "darkolivegreen2" "darkolivegreen3" - "darkolivegreen4" "darkorange" "darkorange1" "darkorange2" - "darkorange3" "darkorange4" "darkorchid" "darkorchid1" - "darkorchid2" "darkorchid3" "darkorchid4" "darksalmon" - "darkseagreen" "darkseagreen1" "darkseagreen2" - "darkseagreen3" "darkseagreen4" "darkslateblue" - "darkslategray" "darkslategray1" "darkslategray2" - "darkslategray3" "darkslategray4" "darkslategrey" - "darkturquoise" "darkviolet" "deeppink" "deeppink1" - "deeppink2" "deeppink3" "deeppink4" "deepskyblue" - "deepskyblue1" "deepskyblue2" "deepskyblue3" "deepskyblue4" - "dimgray" "dimgrey" "dodgerblue" "dodgerblue1" "dodgerblue2" - "dodgerblue3" "dodgerblue4" "firebrick" "firebrick1" - "firebrick2" "firebrick3" "firebrick4" "floralwhite" - "forestgreen" "gainsboro" "ghostwhite" "gold" "gold1" "gold2" - "gold3" "gold4" "goldenrod" "goldenrod1" "goldenrod2" - "goldenrod3" "goldenrod4" "gray" "gray0" "gray1" "gray10" "gray100" - "gray11" "gray12" "gray13" "gray14" "gray15" "gray16" "gray17" - "gray18" "gray19" "gray2" "gray20" "gray21" "gray22" "gray23" - "gray24" "gray25" "gray26" "gray27" "gray28" "gray29" "gray3" - "gray30" "gray31" "gray32" "gray33" "gray34" "gray35" "gray36" - "gray37" "gray38" "gray39" "gray4" "gray40" "gray41" "gray42" - "gray43" "gray44" "gray45" "gray46" "gray47" "gray48" "gray49" - "gray5" "gray50" "gray51" "gray52" "gray53" "gray54" "gray55" - "gray56" "gray57" "gray58" "gray59" "gray6" "gray60" "gray61" - "gray62" "gray63" "gray64" "gray65" "gray66" "gray67" "gray68" - "gray69" "gray7" "gray70" "gray71" "gray72" "gray73" "gray74" - "gray75" "gray76" "gray77" "gray78" "gray79" "gray8" "gray80" - "gray81" "gray82" "gray83" "gray84" "gray85" "gray86" "gray87" - "gray88" "gray89" "gray9" "gray90" "gray91" "gray92" "gray93" - "gray94" "gray95" "gray96" "gray97" "gray98" "gray99" "green" - "green1" "green2" "green3" "green4" "greenyellow" "grey" "grey0" - "grey1" "grey10" "grey100" "grey11" "grey12" "grey13" "grey14" - "grey15" "grey16" "grey17" "grey18" "grey19" "grey2" "grey20" - "grey21" "grey22" "grey23" "grey24" "grey25" "grey26" "grey27" - "grey28" "grey29" "grey3" "grey30" "grey31" "grey32" "grey33" - "grey34" "grey35" "grey36" "grey37" "grey38" "grey39" "grey4" - "grey40" "grey41" "grey42" "grey43" "grey44" "grey45" "grey46" - "grey47" "grey48" "grey49" "grey5" "grey50" "grey51" "grey52" - "grey53" "grey54" "grey55" "grey56" "grey57" "grey58" "grey59" - "grey6" "grey60" "grey61" "grey62" "grey63" "grey64" "grey65" - "grey66" "grey67" "grey68" "grey69" "grey7" "grey70" "grey71" - "grey72" "grey73" "grey74" "grey75" "grey76" "grey77" "grey78" - "grey79" "grey8" "grey80" "grey81" "grey82" "grey83" "grey84" - "grey85" "grey86" "grey87" "grey88" "grey89" "grey9" "grey90" - "grey91" "grey92" "grey93" "grey94" "grey95" "grey96" "grey97" - "grey98" "grey99" "honeydew" "honeydew1" "honeydew2" "honeydew3" - "honeydew4" "hotpink" "hotpink1" "hotpink2" "hotpink3" "hotpink4" - "indianred" "indianred1" "indianred2" "indianred3" "indianred4" - "indigo" "ivory" "ivory1" "ivory2" "ivory3" "ivory4" "khaki" "khaki1" - "khaki2" "khaki3" "khaki4" "lavender" "lavenderblush" - "lavenderblush1" "lavenderblush2" "lavenderblush3" - "lavenderblush4" "lawngreen" "lemonchiffon" "lemonchiffon1" - "lemonchiffon2" "lemonchiffon3" "lemonchiffon4" "lightblue" - "lightblue1" "lightblue2" "lightblue3" "lightblue4" - "lightcoral" "lightcyan" "lightcyan1" "lightcyan2" "lightcyan3" - "lightcyan4" "lightgoldenrod" "lightgoldenrod1" - "lightgoldenrod2" "lightgoldenrod3" "lightgoldenrod4" - "lightgoldenrodyellow" "lightgray" "lightgrey" "lightpink" - "lightpink1" "lightpink2" "lightpink3" "lightpink4" - "lightsalmon" "lightsalmon1" "lightsalmon2" "lightsalmon3" - "lightsalmon4" "lightseagreen" "lightskyblue" "lightskyblue1" - "lightskyblue2" "lightskyblue3" "lightskyblue4" - "lightslateblue" "lightslategray" "lightslategrey" - "lightsteelblue" "lightsteelblue1" "lightsteelblue2" - "lightsteelblue3" "lightsteelblue4" "lightyellow" - "lightyellow1" "lightyellow2" "lightyellow3" "lightyellow4" - "limegreen" "linen" "magenta" "magenta1" "magenta2" "magenta3" - "magenta4" "maroon" "maroon1" "maroon2" "maroon3" "maroon4" - "mediumaquamarine" "mediumblue" "mediumorchid" - "mediumorchid1" "mediumorchid2" "mediumorchid3" - "mediumorchid4" "mediumpurple" "mediumpurple1" - "mediumpurple2" "mediumpurple3" "mediumpurple4" - "mediumseagreen" "mediumslateblue" "mediumspringgreen" - "mediumturquoise" "mediumvioletred" "midnightblue" - "mintcream" "mistyrose" "mistyrose1" "mistyrose2" "mistyrose3" - "mistyrose4" "moccasin" "navajowhite" "navajowhite1" - "navajowhite2" "navajowhite3" "navajowhite4" "navy" "navyblue" - "oldlace" "olivedrab" "olivedrap" "olivedrab1" "olivedrab2" - "olivedrap3" "oragne" "palegoldenrod" "palegreen" "palegreen1" - "palegreen2" "palegreen3" "palegreen4" "paleturquoise" - "paleturquoise1" "paleturquoise2" "paleturquoise3" - "paleturquoise4" "palevioletred" "palevioletred1" - "palevioletred2" "palevioletred3" "palevioletred4" - "papayawhip" "peachpuff" "peachpuff1" "peachpuff2" - "peachpuff3" "peachpuff4" "peru" "pink" "pink1" "pink2" "pink3" - "pink4" "plum" "plum1" "plum2" "plum3" "plum4" "powderblue" - "purple" "purple1" "purple2" "purple3" "purple4" "red" "red1" "red2" - "red3" "red4" "rosybrown" "rosybrown1" "rosybrown2" "rosybrown3" - "rosybrown4" "royalblue" "royalblue1" "royalblue2" "royalblue3" - "royalblue4" "saddlebrown" "salmon" "salmon1" "salmon2" "salmon3" - "salmon4" "sandybrown" "seagreen" "seagreen1" "seagreen2" - "seagreen3" "seagreen4" "seashell" "seashell1" "seashell2" - "seashell3" "seashell4" "sienna" "sienna1" "sienna2" "sienna3" - "sienna4" "skyblue" "skyblue1" "skyblue2" "skyblue3" "skyblue4" - "slateblue" "slateblue1" "slateblue2" "slateblue3" "slateblue4" - "slategray" "slategray1" "slategray2" "slategray3" "slategray4" - "slategrey" "snow" "snow1" "snow2" "snow3" "snow4" "springgreen" - "springgreen1" "springgreen2" "springgreen3" "springgreen4" - "steelblue" "steelblue1" "steelblue2" "steelblue3" "steelblue4" - "tan" "tan1" "tan2" "tan3" "tan4" "thistle" "thistle1" "thistle2" - "thistle3" "thistle4" "tomato" "tomato1" "tomato2" "tomato3" - "tomato4" "transparent" "turquoise" "turquoise1" "turquoise2" - "turquoise3" "turquoise4" "violet" "violetred" "violetred1" - "violetred2" "violetred3" "violetred4" "wheat" "wheat1" "wheat2" - "wheat3" "wheat4" "white" "whitesmoke" "yellow" "yellow1" "yellow2" - "yellow3" "yellow4" "yellowgreen") - "Possible color constants in the dot language. -The list of constant is available at http://www.research.att.com/~erg/graphviz\ -/info/colors.html") - - -;;; Key map -(defvar graphviz-dot-mode-map - (let ((map (make-sparse-keymap))) - (define-key map "\C-\M-q" 'graphviz-dot-indent-graph) - (define-key map "\C-c\C-p" 'graphviz-dot-preview) - (define-key map "\C-c\C-c" 'compile) - (define-key map "\C-c\C-v" 'graphviz-dot-view) - map) - "Keymap used in Graphviz Dot mode.") - -;;; Syntax table -(defvar graphviz-dot-mode-syntax-table - (let ((st (make-syntax-table))) - (modify-syntax-entry ?/ ". 124b" st) - (modify-syntax-entry ?* ". 23" st) - (modify-syntax-entry ?\n "> b" st) - (modify-syntax-entry ?= "." st) - (modify-syntax-entry ?_ "_" st) - (modify-syntax-entry ?- "_" st) - (modify-syntax-entry ?> "." st) - (modify-syntax-entry ?\[ "(]" st) - (modify-syntax-entry ?\] ")[" st) - (modify-syntax-entry ?\" "\"" st) - st) - "Syntax table for `graphviz-dot-mode'.") - -(defvar graphviz-dot-syntax-propertize-function - (syntax-propertize-rules - ("^#" (0 "< b")))) - -(defvar graphviz-dot-font-lock-keywords - ;; See https://graphviz.gitlab.io/_pages/doc/info/lang.html. - `(;; Match ID, first case - ("\\(?:di\\|sub\\)?graph\\(?:[[:space:]]+\\)\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)" - (1 font-lock-function-name-face)) - ;; Match ID, second case - ("\\(?:di\\|sub\\)?graph\\(?:[[:space:]]+\\)\\(-?[0-9]*\\(\\.[0-9]*\\)?\\)" - (1 font-lock-function-name-face)) - (,(regexp-opt graphviz-dot-value-keywords 'words) - . font-lock-reference-face) - ;; to build the font-locking for the colors, - ;; we need more room for max-specpdl-size, - ;; after that we take the list of symbols, - ;; convert them to a list of strings, and make - ;; an optimized regexp from them - (,(let ((max-specpdl-size (max max-specpdl-size 1200))) - (regexp-opt graphviz-dot-color-keywords 'words)) - . font-lock-string-face) - (,(concat - (regexp-opt graphviz-dot-attr-keywords 'words) - "[ \\t\\n]*=") - ;; RR - ugly, really, but I don't know why xemacs does not work - ;; if I change the next car to "1"... - (0 font-lock-variable-name-face)) - ;; The 'graph' nonterminal - ("\\(\\_<\\(?:strict\\)?[[:space:]]*\\(?:\\(?:di\\)?graph\\)\\_>\\)" - (1 'font-lock-keyword-face)) - ;; The 'attr_stmt' - ("\\_<\\(edge\\|graph\\|node\\)\\_>[[:space:]]*\\[" - 1 'font-lock-keyword-face) - ;; The 'subgraph' nonterminal - ("\\_" . 'font-lock-keyword-face)) - "Keyword highlighting specification for `graphviz-dot-mode'.") - -(defun graphviz-output-file-name (f-name) - "Return the filename of the preview, using F-NAME." - (concat (file-name-sans-extension f-name) - "." graphviz-dot-preview-extension)) - -(defun graphviz-compile-command (f-name) - "Shell command to compile F-NAME. -By default this is `dot -T png file.dot -o file.png', the used -program to compile can be changed by setting -`graphviz-dot-dot-program', the output format and extension can -be changed with `graphviz-dot-preview-extension'." - (when f-name - (setq compile-command - (concat graphviz-dot-dot-program - " -T" graphviz-dot-preview-extension " " - (shell-quote-argument f-name) - " -o " - (shell-quote-argument - (graphviz-output-file-name f-name)))))) - -(defvar dot-menu nil - "Menu for Graphviz Dot Mode. -This menu will get created automatically if you have the `easymenu' -package.") - -;;;###autoload -(define-derived-mode graphviz-dot-mode prog-mode "dot" - "Major mode for the dot language. \\ -TAB indents for graph lines. - -\\[graphviz-dot-indent-graph]\t- Indentation function. -\\[graphviz-dot-preview]\t- Previews graph in a buffer. -\\[graphviz-dot-view]\t- Views graph in an external viewer. -\\[graphviz-dot-indent-line]\t- Indents current line of code. - -Variables specific to this mode: - - `graphviz-dot-dot-program' (default `dot') - Program used to compile the graphs. - `graphviz-dot-preview-extension' (default `png') - File type to use for output. - `graphviz-dot-view-command' (default `dotty %s') - Command to run when `graphviz-dot-view' is executed. - `graphviz-dot-view-edit-command' (default nil) - If the user should be asked to edit the view command. - `graphviz-dot-save-before-view' (default t) - Automatically save current buffer berore `graphviz-dot-view'." - :group 'graphviz - (setq-local font-lock-defaults '(graphviz-dot-font-lock-keywords)) - (setq-local comment-start "//") - (setq-local comment-start-skip "/\\*+ *\\|//+ *") - (setq-local indent-line-function 'graphviz-dot-indent-line) - (setq-local syntax-propertize-function - graphviz-dot-syntax-propertize-function) - (when (buffer-file-name) - (setq-local compile-command - (graphviz-compile-command (buffer-file-name)))) - (when dot-menu (easy-menu-add dot-menu)) - (add-to-list 'compilation-error-regexp-alist 'dot) - (add-to-list 'compilation-error-regexp-alist-alist - '(dot "^Error: \\(.+\\): .*error in line \\([0-9]+\\).*" 1 2)) - (add-hook 'after-save-hook 'graphviz-live-reload-hook) - (run-hooks 'graphviz-dot-mode-hook)) - -;;;; Menu definitions - -(and (condition-case nil - (require 'easymenu) - (error nil)) - (easy-menu-define - dot-menu graphviz-dot-mode-map "Graphviz Mode menu" - '("Graphviz" - ["Indent Graph" graphviz-dot-indent-graph t] - ["Comment Out Region" comment-region (mark)] - ["Uncomment Region" uncomment-region (mark)] - "-" - ["Compile" compile t] - ["Preview" graphviz-dot-preview - (and (buffer-file-name) - (not (buffer-modified-p)))] - ["External Viewer" graphviz-dot-view (buffer-file-name)] - "-" - ["Customize..." graphviz-dot-customize t] - ))) - -;;;; -;;;; Indentation -;;;; - -(defun graphviz-dot-indent-line () - "Indent current line of dot code." - (interactive) - (if (bolp) - (graphviz-dot-real-indent-line) - (save-excursion - (graphviz-dot-real-indent-line)))) - -(defun graphviz-dot-real-indent-line () - "Indent current line of dot code." - (beginning-of-line) - (cond - ((bobp) - ;; simple case, indent to 0 - (indent-line-to 0)) - ((looking-at "^[ \t]*}[ \t]*$") - ;; block closing, deindent relative to previous line - (indent-line-to (save-excursion - (forward-line -1) - (if (looking-at "\\(^.*{[^}]*$\\)") - ;; previous line opened a block - ;; use same indentation - (current-indentation) - (max 0 (- (current-indentation) graphviz-dot-indent-width)))))) - ;; other cases need to look at previous lines - (t - (indent-line-to (save-excursion - (forward-line -1) - (cond - ((looking-at "\\(^.*{[^}]*$\\)") - ;; previous line opened a block - ;; indent to that line - (+ (current-indentation) graphviz-dot-indent-width)) - ((and (not (looking-at ".*\\[.*\\].*")) - (looking-at ".*\\[.*")) ; TODO:PP : can be 1 regex - ;; previous line started filling - ;; attributes, intend to that start - (search-forward "[") - (current-column)) - ((and (not (looking-at ".*\\[.*\\].*")) - (looking-at ".*\\].*")) ; TODO:PP : " - ;; previous line stopped filling - ;; attributes, find the line that started - ;; filling them and indent to that line - (while (or (looking-at ".*\\[.*\\].*") - (not (looking-at ".*\\[.*"))) ; TODO:PP : " - (forward-line -1)) - (current-indentation)) - (t - ;; default case, indent the - ;; same as previous NON-BLANK line - ;; (or the first line, if there are no previous non-blank lines) - (while (and (< (point-min) (point)) - (looking-at "^\[ \t\]*$")) - (forward-line -1)) - ;; if we find a closing square bracket, don't indent - ;; to the level of its attributes, but instead - ;; find the opening bracket and indent to that - (if (looking-at ".*\\].*") - (while (not (looking-at ".*\\[.*")) - (forward-line -1))) - (current-indentation)) ))) ))) - -(defun graphviz-dot-indent-graph () - "Indent the graph/digraph/subgraph where point is at. -This will first teach the beginning of the graph were point is at, and -then indent this and each subgraph in it." - (interactive) - (save-excursion - ;; position point at start of graph - (while (not (or (looking-at "\\(^.*{[^}]*$\\)") (bobp))) - (forward-line -1)) - ;; bracket { one +; bracket } one - - (let ((bracket-count 0)) - (while - (progn - (cond - ;; update bracket-count - ((looking-at "\\(^.*{[^}]*$\\)") - (setq bracket-count (+ bracket-count 1))) - ;; update bracket-count - ((looking-at "^[ \t]*}[ \t]*$") - (setq bracket-count (- bracket-count 1)))) - ;; indent this line and move on - (graphviz-dot-indent-line) - (forward-line 1) - ;; as long as we are not completed or at end of buffer - (and (> bracket-count 0) (not (eobp)))))))) - -;;;###autoload -(defun graphviz-dot-preview () - "Compile the graph and preview it in an other buffer." - (interactive) - (save-buffer) - (let ((windows (window-list)) - (f-name (graphviz-output-file-name (buffer-file-name))) - (command-result (string-trim (shell-command-to-string compile-command)))) - (if (string-prefix-p "Error:" command-result) - (message command-result) - (progn - (sleep-for 0 graphviz-dot-revert-delay) - (with-selected-window (selected-window) - (switch-to-buffer-other-window (find-file-noselect f-name t)) - ;; I get "changed on disk; really edit the buffer?" prompt w/o this - (sleep-for 0 50) - (revert-buffer t t)))))) - -;;;###autoload -(defun graphviz-turn-on-live-preview () - "Turn on live preview. -This will update the preview on every save." - (interactive) - (setq graphviz-dot-auto-preview-on-save t) - (add-hook 'after-save-hook 'graphviz-live-reload-hook)) - -;;;###autoload -(defun graphviz-turn-off-live-preview () - "Turn off live preview. -Saving the file will no longer also update the preview." - (interactive) - (setq graphviz-dot-auto-preview-on-save nil) - (remove-hook 'after-save-hook 'graphviz-live-reload-hook)) - -(defun graphviz-live-reload-hook () - "Hook to run in `after-save-hook' for live preview to work." - (when (and (eq major-mode 'graphviz-dot-mode) graphviz-dot-auto-preview-on-save) - (graphviz-dot-preview))) - -;;;; -;;;; View -;;;; -(defun graphviz-dot-view () - "Run an external viewer. -This creates an external process every time it is executed. If -`graphviz-dot-save-before-view' is set, the current buffer is -saved before the command is executed." - (interactive) - (let ((cmd (if graphviz-dot-view-edit-command - (if (fboundp 'read-shell-command) - (read-shell-command "View command: " - (format graphviz-dot-view-command - (shell-quote-argument (buffer-file-name)))) - ;; read-shell-command not available in GNU Emacs 21 - (read-from-minibuffer "View command: " - (format graphviz-dot-view-command - (shell-quote-argument (buffer-file-name))))) - (format graphviz-dot-view-command - (shell-quote-argument (buffer-file-name)))))) - (if graphviz-dot-save-before-view - (save-buffer)) - (start-process-shell-command (downcase mode-name) nil cmd) - (message (format "Executing `%s'..." cmd)))) - -(defun graphviz-dot-set-layout () - "Change the value of `graphviz-dot-dot-program'." - (interactive) - (setq graphviz-dot-dot-program - (completing-read "Layout: " graphviz-dot-layout-programs))) - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.dot\\'" . graphviz-dot-mode)) -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.gv\\'" . graphviz-dot-mode)) - -;; Support org-mode, when adding a code block for dot, use this mode -(with-eval-after-load 'org-src - (defvar org-src-lang-modes) - (add-to-list 'org-src-lang-modes '("dot" . graphviz-dot))) - -(provide 'graphviz-dot-mode) -;;; graphviz-dot-mode.el ends here diff --git a/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode.elc b/elpa/graphviz-dot-mode-20200304.432/graphviz-dot-mode.elc deleted file mode 100644 index 112bfe5f4ec65c2cc7466a2da9c1182b69e5bc60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29642 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 diff --git a/elpa/highlight-indentation-20181204.839/highlight-indentation-autoloads.el b/elpa/highlight-indentation-20181204.839/highlight-indentation-autoloads.el deleted file mode 100644 index eb3b4d83..00000000 --- a/elpa/highlight-indentation-20181204.839/highlight-indentation-autoloads.el +++ /dev/null @@ -1,41 +0,0 @@ -;;; highlight-indentation-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "highlight-indentation" "highlight-indentation.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from highlight-indentation.el - -(autoload 'highlight-indentation-mode "highlight-indentation" "\ -Highlight indentation minor mode highlights indentation based on spaces - -\(fn &optional ARG)" t nil) - -(autoload 'highlight-indentation-set-offset "highlight-indentation" "\ -Set indentation offset localy in buffer, will prevent -highlight-indentation from trying to guess indentation offset -from major mode - -\(fn OFFSET)" t nil) - -(autoload 'highlight-indentation-current-column-mode "highlight-indentation" "\ -Hilight Indentation minor mode displays a vertical bar -corresponding to the indentation of the current line - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "highlight-indentation" '("highlight-indentation-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; highlight-indentation-autoloads.el ends here diff --git a/elpa/highlight-indentation-20181204.839/highlight-indentation-pkg.el b/elpa/highlight-indentation-20181204.839/highlight-indentation-pkg.el deleted file mode 100644 index 3098bc66..00000000 --- a/elpa/highlight-indentation-20181204.839/highlight-indentation-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "highlight-indentation" "20181204.839" "Minor modes for highlighting indentation" 'nil :commit "d03803f2c06749c430443a3d24e039cbafc9c58f" :authors '(("Anton Johansson" . "anton.johansson@gmail.com")) :maintainer '("Anton Johansson" . "anton.johansson@gmail.com") :url "https://github.com/antonj/Highlight-Indentation-for-Emacs") diff --git a/elpa/highlight-indentation-20181204.839/highlight-indentation.el b/elpa/highlight-indentation-20181204.839/highlight-indentation.el deleted file mode 100644 index b9446b9a..00000000 --- a/elpa/highlight-indentation-20181204.839/highlight-indentation.el +++ /dev/null @@ -1,313 +0,0 @@ -;;; highlight-indentation.el --- Minor modes for highlighting indentation -;; Author: Anton Johansson - http://antonj.se -;; Created: Dec 15 23:42:04 2010 -;; Version: 0.7.0 -;; Package-Version: 20181204.839 -;; URL: https://github.com/antonj/Highlight-Indentation-for-Emacs -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2 of -;; the License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be -;; useful, but WITHOUT ANY WARRANTY; without even the implied -;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -;; PURPOSE. See the GNU General Public License for more details. -;; -;;; Commentary: -;; Customize `highlight-indentation-face', and -;; `highlight-indentation-current-column-face' to suit your theme. - -;;; Code: - -(defgroup highlight-indentation nil - "Highlight Indentation" - :prefix "highlight-indentation-" - :group 'basic-faces) - -(defface highlight-indentation-face - ;; Fringe has non intrusive color in most color-themes - '((t :inherit fringe)) - "Basic face for highlighting indentation guides." - :group 'highlight-indentation) - -(defcustom highlight-indentation-offset - (if (and (boundp 'standard-indent) standard-indent) standard-indent 2) - "Default indentation offset, used if no other can be found from - major mode. This value is always used by - `highlight-indentation-mode' if set buffer local. Set buffer - local with `highlight-indentation-set-offset'" - :type 'integer - :group 'highlight-indentation) - -(defcustom highlight-indentation-blank-lines nil - "Show indentation guides on blank lines. Experimental. - -Known issues: -- Doesn't work well with completion popups that use overlays -- Overlays on blank lines sometimes aren't cleaned up or updated perfectly - Can be refershed by scrolling -- Not yet implemented for highlight-indentation-current-column-mode -- May not work perfectly near the bottom of the screen -- Point appears after indent guides on blank lines" - :group 'highlight-indentation) - -(defvar highlight-indentation-overlay-priority 1) -(defvar highlight-indentation-current-column-overlay-priority 2) - -(defconst highlight-indentation-hooks - '((after-change-functions (lambda (start end length) - (highlight-indentation-redraw-region - start end - 'highlight-indentation-overlay - 'highlight-indentation-put-overlays-region)) - t t) - (window-scroll-functions (lambda (win start) - (highlight-indentation-redraw-window - win - 'highlight-indentation-overlay - 'highlight-indentation-put-overlays-region - start)) - nil t))) - -(defun highlight-indentation-get-buffer-windows (&optional all-frames) - "Return a list of windows displaying the current buffer." - (get-buffer-window-list (current-buffer) 'no-minibuf all-frames)) - -(defun highlight-indentation-delete-overlays-buffer (overlay) - "Delete all overlays in the current buffer." - (save-restriction - (widen) - (highlight-indentation-delete-overlays-region (point-min) (point-max) overlay))) - -(defun highlight-indentation-delete-overlays-region (start end overlay) - "Delete overlays between START and END." - (mapc #'(lambda (o) - (if (overlay-get o overlay) (delete-overlay o))) - (overlays-in start end))) - -(defun highlight-indentation-redraw-window (win overlay func &optional start) - "Redraw win starting from START." - (highlight-indentation-redraw-region (or start (window-start win)) (window-end win t) overlay func)) - -(defun highlight-indentation-redraw-region (start end overlay func) - "Erease and read overlays between START and END." - (save-match-data - (save-excursion - (let ((inhibit-point-motion-hooks t) - (start (save-excursion (goto-char start) (beginning-of-line) (point))) - - (end (save-excursion (goto-char end) (line-beginning-position 2)))) - (highlight-indentation-delete-overlays-region start end overlay) - (funcall func start end overlay))))) - -(defun highlight-indentation-redraw-all-windows (overlay func &optional all-frames) - "Redraw the all windows showing the current buffer." - (dolist (win (highlight-indentation-get-buffer-windows all-frames)) - (highlight-indentation-redraw-window win overlay func))) - -(defun highlight-indentation-put-overlays-region (start end overlay) - "Place overlays between START and END." - (goto-char end) - (let (o ;; overlay - (last-indent 0) - (last-char 0) - (pos (point)) - (loop t)) - (while (and loop - (>= pos start)) - (save-excursion - (beginning-of-line) - (let ((c 0) - (cur-column (current-column))) - (while (and (setq c (char-after)) - (integerp c) - (not (= 10 c)) ;; newline - (= 32 c)) ;; space - (when (= 0 (% cur-column highlight-indentation-offset)) - (let ((p (point))) - (setq o (make-overlay p (+ p 1)))) - (overlay-put o overlay t) - (overlay-put o 'priority highlight-indentation-overlay-priority) - (overlay-put o 'face 'highlight-indentation-face)) - (forward-char) - (setq cur-column (current-column))) - (when (and highlight-indentation-blank-lines - (integerp c) - (or (= 10 c) - (= 13 c))) - (when (< cur-column last-indent) - (let ((column cur-column) - (s nil) - (show t) - num-spaces) - (while (< column last-indent) - (if (>= 0 - (setq num-spaces - (% - (- last-indent column) - highlight-indentation-offset))) - (progn - (setq num-spaces (1- highlight-indentation-offset)) - (setq show t)) - (setq show nil)) - (setq s (cons (concat - (if show - (propertize " " - 'face - 'highlight-indentation-face) - "") - (make-string num-spaces 32)) - s)) - (setq column (+ column num-spaces (if show 1 0)))) - (setq s (apply 'concat (reverse s))) - (let ((p (point))) - (setq o (make-overlay p p))) - (overlay-put o overlay t) - (overlay-put o 'priority highlight-indentation-overlay-priority) - (overlay-put o 'after-string s)) - (setq cur-column last-indent))) - (setq last-indent (* highlight-indentation-offset - (ceiling (/ (float cur-column) - highlight-indentation-offset)))))) - (when (= pos start) - (setq loop nil)) - (forward-line -1) ;; previous line - (setq pos (point))))) - -(defun highlight-indentation-guess-offset () - "Get indentation offset of current buffer." - (cond ((and (eq major-mode 'python-mode) (boundp 'python-indent)) - python-indent) - ((and (eq major-mode 'python-mode) (boundp 'py-indent-offset)) - py-indent-offset) - ((and (eq major-mode 'python-mode) (boundp 'python-indent-offset)) - python-indent-offset) - ((and (eq major-mode 'ruby-mode) (boundp 'ruby-indent-level)) - ruby-indent-level) - ((and (eq major-mode 'scala-mode) (boundp 'scala-indent:step)) - scala-indent:step) - ((and (eq major-mode 'scala-mode) (boundp 'scala-mode-indent:step)) - scala-mode-indent:step) - ((and (or (eq major-mode 'scss-mode) (eq major-mode 'css-mode)) (boundp 'css-indent-offset)) - css-indent-offset) - ((and (eq major-mode 'nxml-mode) (boundp 'nxml-child-indent)) - nxml-child-indent) - ((and (eq major-mode 'coffee-mode) (boundp 'coffee-tab-width)) - coffee-tab-width) - ((and (eq major-mode 'js-mode) (boundp 'js-indent-level)) - js-indent-level) - ((and (eq major-mode 'js2-mode) (boundp 'js2-basic-offset)) - js2-basic-offset) - ((and (fboundp 'derived-mode-class) (eq (derived-mode-class major-mode) 'sws-mode) (boundp 'sws-tab-width)) - sws-tab-width) - ((and (eq major-mode 'web-mode) (boundp 'web-mode-markup-indent-offset)) - web-mode-markup-indent-offset) ; other similar vars: web-mode-{css-indent,scripts}-offset - ((and (eq major-mode 'web-mode) (boundp 'web-mode-html-offset)) ; old var - web-mode-html-offset) - ((and (local-variable-p 'c-basic-offset) (boundp 'c-basic-offset)) - c-basic-offset) - ((and (eq major-mode 'yaml-mode) (boundp 'yaml-indent-offset)) - yaml-indent-offset) - ((and (eq major-mode 'elixir-mode) (boundp 'elixir-smie-indent-basic)) - elixir-smie-indent-basic) - (t - (default-value 'highlight-indentation-offset)))) - -;;;###autoload -(define-minor-mode highlight-indentation-mode - "Highlight indentation minor mode highlights indentation based on spaces" - :lighter " ||" - (when (not highlight-indentation-mode) ;; OFF - (highlight-indentation-delete-overlays-buffer 'highlight-indentation-overlay) - (dolist (hook highlight-indentation-hooks) - (remove-hook (car hook) (nth 1 hook) (nth 3 hook)))) - - (when highlight-indentation-mode ;; ON - (when (not (local-variable-p 'highlight-indentation-offset)) - (set (make-local-variable 'highlight-indentation-offset) - (highlight-indentation-guess-offset))) - - ;; Setup hooks - (dolist (hook highlight-indentation-hooks) - (apply 'add-hook hook)) - (highlight-indentation-redraw-all-windows 'highlight-indentation-overlay - 'highlight-indentation-put-overlays-region))) - -;;;###autoload -(defun highlight-indentation-set-offset (offset) - "Set indentation offset localy in buffer, will prevent -highlight-indentation from trying to guess indentation offset -from major mode" - (interactive - (if (and current-prefix-arg (not (consp current-prefix-arg))) - (list (prefix-numeric-value current-prefix-arg)) - (list (read-number "Indentation offset: ")))) - (set (make-local-variable 'highlight-indentation-offset) offset) - (when highlight-indentation-mode - (highlight-indentation-mode))) - -;;; This minor mode will highlight the indentation of the current line -;;; as a vertical bar (grey background color) aligned with the column of the -;;; first character of the current line. -(defface highlight-indentation-current-column-face - ;; Fringe has non intrusive color in most color-themes - '((t (:background "black"))) - "Basic face for highlighting indentation guides." - :group 'highlight-indentation) - -(defconst highlight-indentation-current-column-hooks - '((post-command-hook (lambda () - (highlight-indentation-redraw-all-windows 'highlight-indentation-current-column-overlay - 'highlight-indentation-current-column-put-overlays-region)) nil t))) - -(defun highlight-indentation-current-column-put-overlays-region (start end overlay) - "Place overlays between START and END." - (let (o ;; overlay - (last-indent 0) - (indent (save-excursion (back-to-indentation) (current-column))) - (pos start)) - (goto-char start) - ;; (message "doing it %d" indent) - (while (< pos end) - (beginning-of-line) - (while (and (integerp (char-after)) - (not (= 10 (char-after))) ;; newline - (= 32 (char-after))) ;; space - (when (= (current-column) indent) - (setq pos (point) - last-indent pos - o (make-overlay pos (+ pos 1))) - (overlay-put o overlay t) - (overlay-put o 'priority highlight-indentation-current-column-overlay-priority) - (overlay-put o 'face 'highlight-indentation-current-column-face)) - (forward-char)) - (forward-line) ;; Next line - (setq pos (point))))) - -;;;###autoload -(define-minor-mode highlight-indentation-current-column-mode - "Hilight Indentation minor mode displays a vertical bar -corresponding to the indentation of the current line" - :lighter " |" - - (when (not highlight-indentation-current-column-mode) ;; OFF - (highlight-indentation-delete-overlays-buffer 'highlight-indentation-current-column-overlay) - (dolist (hook highlight-indentation-current-column-hooks) - (remove-hook (car hook) (nth 1 hook) (nth 3 hook)))) - - (when highlight-indentation-current-column-mode ;; ON - (when (not (local-variable-p 'highlight-indentation-offset)) - (set (make-local-variable 'highlight-indentation-offset) - (highlight-indentation-guess-offset))) - - ;; Setup hooks - (dolist (hook highlight-indentation-current-column-hooks) - (apply 'add-hook hook)) - (highlight-indentation-redraw-all-windows 'highlight-indentation-current-column-overlay - 'highlight-indentation-current-column-put-overlays-region))) - -(provide 'highlight-indentation) - -;;; highlight-indentation.el ends here diff --git a/elpa/highlight-indentation-20181204.839/highlight-indentation.elc b/elpa/highlight-indentation-20181204.839/highlight-indentation.elc deleted file mode 100644 index e7aebcd68cacf9d20be9e9f8b92969cc298c00cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12256 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 I0Lga$3;srem;e9( diff --git a/elpa/htmlize-20191111.2130/htmlize-autoloads.el b/elpa/htmlize-20191111.2130/htmlize-autoloads.el deleted file mode 100644 index 2de24ed5..00000000 --- a/elpa/htmlize-20191111.2130/htmlize-autoloads.el +++ /dev/null @@ -1,82 +0,0 @@ -;;; htmlize-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "htmlize" "htmlize.el" (0 0 0 0)) -;;; Generated autoloads from htmlize.el - -(autoload 'htmlize-buffer "htmlize" "\ -Convert BUFFER to HTML, preserving colors and decorations. - -The generated HTML is available in a new buffer, which is returned. -When invoked interactively, the new buffer is selected in the current -window. The title of the generated document will be set to the buffer's -file name or, if that's not available, to the buffer's name. - -Note that htmlize doesn't fontify your buffers, it only uses the -decorations that are already present. If you don't set up font-lock or -something else to fontify your buffers, the resulting HTML will be -plain. Likewise, if you don't like the choice of colors, fix the mode -that created them, or simply alter the faces it uses. - -\(fn &optional BUFFER)" t nil) - -(autoload 'htmlize-region "htmlize" "\ -Convert the region to HTML, preserving colors and decorations. -See `htmlize-buffer' for details. - -\(fn BEG END)" t nil) - -(autoload 'htmlize-file "htmlize" "\ -Load FILE, fontify it, convert it to HTML, and save the result. - -Contents of FILE are inserted into a temporary buffer, whose major mode -is set with `normal-mode' as appropriate for the file type. The buffer -is subsequently fontified with `font-lock' and converted to HTML. Note -that, unlike `htmlize-buffer', this function explicitly turns on -font-lock. If a form of highlighting other than font-lock is desired, -please use `htmlize-buffer' directly on buffers so highlighted. - -Buffers currently visiting FILE are unaffected by this function. The -function does not change current buffer or move the point. - -If TARGET is specified and names a directory, the resulting file will be -saved there instead of to FILE's directory. If TARGET is specified and -does not name a directory, it will be used as output file name. - -\(fn FILE &optional TARGET)" t nil) - -(autoload 'htmlize-many-files "htmlize" "\ -Convert FILES to HTML and save the corresponding HTML versions. - -FILES should be a list of file names to convert. This function calls -`htmlize-file' on each file; see that function for details. When -invoked interactively, you are prompted for a list of files to convert, -terminated with RET. - -If TARGET-DIRECTORY is specified, the HTML files will be saved to that -directory. Normally, each HTML file is saved to the directory of the -corresponding source file. - -\(fn FILES &optional TARGET-DIRECTORY)" t nil) - -(autoload 'htmlize-many-files-dired "htmlize" "\ -HTMLize dired-marked files. - -\(fn ARG &optional TARGET-DIRECTORY)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "htmlize" '("htmlize-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; htmlize-autoloads.el ends here diff --git a/elpa/htmlize-20191111.2130/htmlize-pkg.el b/elpa/htmlize-20191111.2130/htmlize-pkg.el deleted file mode 100644 index bbc710ca..00000000 --- a/elpa/htmlize-20191111.2130/htmlize-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "htmlize" "20191111.2130" "Convert buffer text and decorations to HTML." 'nil :commit "86f22f211e9230857197c42a9823d3f05381deed" :keywords '("hypermedia" "extensions") :authors '(("Hrvoje Niksic" . "hniksic@gmail.com")) :maintainer '("Hrvoje Niksic" . "hniksic@gmail.com") :url "https://github.com/hniksic/emacs-htmlize") diff --git a/elpa/htmlize-20191111.2130/htmlize.el b/elpa/htmlize-20191111.2130/htmlize.el deleted file mode 100644 index 9aa19f34..00000000 --- a/elpa/htmlize-20191111.2130/htmlize.el +++ /dev/null @@ -1,1883 +0,0 @@ -;;; htmlize.el --- Convert buffer text and decorations to HTML. -*- lexical-binding: t -*- - -;; Copyright (C) 1997-2003,2005,2006,2009,2011,2012,2014,2017,2018 Hrvoje Niksic - -;; Author: Hrvoje Niksic -;; Homepage: https://github.com/hniksic/emacs-htmlize -;; Keywords: hypermedia, extensions -;; Package-Version: 20191111.2130 -;; Version: 1.56 - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This package converts the buffer text and the associated -;; decorations to HTML. Mail to to discuss -;; features and additions. All suggestions are more than welcome. - -;; To use it, just switch to the buffer you want HTML-ized and type -;; `M-x htmlize-buffer'. You will be switched to a new buffer that -;; contains the resulting HTML code. You can edit and inspect this -;; buffer, or you can just save it with C-x C-w. `M-x htmlize-file' -;; will find a file, fontify it, and save the HTML version in -;; FILE.html, without any additional intervention. `M-x -;; htmlize-many-files' allows you to htmlize any number of files in -;; the same manner. `M-x htmlize-many-files-dired' does the same for -;; files marked in a dired buffer. - -;; htmlize supports three types of HTML output, selected by setting -;; `htmlize-output-type': `css', `inline-css', and `font'. In `css' -;; mode, htmlize uses cascading style sheets to specify colors; it -;; generates classes that correspond to Emacs faces and uses ... to color parts of text. In this mode, the -;; produced HTML is valid under the 4.01 strict DTD, as confirmed by -;; the W3C validator. `inline-css' is like `css', except the CSS is -;; put directly in the STYLE attribute of the SPAN element, making it -;; possible to paste the generated HTML into existing HTML documents. -;; In `font' mode, htmlize uses ... to -;; colorize HTML, which is not standard-compliant, but works better in -;; older browsers. `css' mode is the default. - -;; You can also use htmlize from your Emacs Lisp code. When called -;; non-interactively, `htmlize-buffer' and `htmlize-region' will -;; return the resulting HTML buffer, but will not change current -;; buffer or move the point. htmlize will do its best to work on -;; non-windowing Emacs sessions but the result will be limited to -;; colors supported by the terminal. - -;; htmlize aims for compatibility with older Emacs versions. Please -;; let me know if it doesn't work on the version of GNU Emacs that you -;; are using. The package relies on the presence of CL extensions; -;; please don't try to remove that dependency. I see no practical -;; problems with using the full power of the CL extensions, except -;; that one might learn to like them too much. - -;; The latest version is available at: -;; -;; -;; -;; - -;; Thanks go to the many people who have sent reports and contributed -;; comments, suggestions, and fixes. They include Ron Gut, Bob -;; Weiner, Toni Drabik, Peter Breton, Ville Skytta, Thomas Vogels, -;; Juri Linkov, Maciek Pasternacki, and many others. - -;; User quotes: "You sir, are a sick, sick, _sick_ person. :)" -;; -- Bill Perry, author of Emacs/W3 - - -;;; Code: - -(require 'cl) -(eval-when-compile - (defvar font-lock-auto-fontify) - (defvar font-lock-support-mode) - (defvar global-font-lock-mode)) - -(defconst htmlize-version "1.56") - -(defgroup htmlize nil - "Convert buffer text and faces to HTML." - :group 'hypermedia) - -(defcustom htmlize-head-tags "" - "Additional tags to insert within HEAD of the generated document." - :type 'string - :group 'htmlize) - -(defcustom htmlize-output-type 'css - "Output type of generated HTML, one of `css', `inline-css', or `font'. -When set to `css' (the default), htmlize will generate a style sheet -with description of faces, and use it in the HTML document, specifying -the faces in the actual text with . - -When set to `inline-css', the style will be generated as above, but -placed directly in the STYLE attribute of the span ELEMENT: . This makes it easier to paste the resulting HTML to -other documents. - -When set to `font', the properties will be set using layout tags -, , , , and . - -`css' output is normally preferred, but `font' is still useful for -supporting old, pre-CSS browsers, and both `inline-css' and `font' for -easier embedding of colorized text in foreign HTML documents (no style -sheet to carry around)." - :type '(choice (const css) (const inline-css) (const font)) - :group 'htmlize) - -(defcustom htmlize-use-images t - "Whether htmlize generates `img' for images attached to buffer contents." - :type 'boolean - :group 'htmlize) - -(defcustom htmlize-force-inline-images nil - "Non-nil means generate all images inline using data URLs. -Normally htmlize converts image descriptors with :file properties to -relative URIs, and those with :data properties to data URIs. With this -flag set, the images specified as a file name are loaded into memory and -embedded in the HTML as data URIs." - :type 'boolean - :group 'htmlize) - -(defcustom htmlize-max-alt-text 100 - "Maximum size of text to use as ALT text in images. - -Normally when htmlize encounters text covered by the `display' property -that specifies an image, it generates an `alt' attribute containing the -original text. If the text is larger than `htmlize-max-alt-text' characters, -this will not be done." - :type 'integer - :group 'htmlize) - -(defcustom htmlize-transform-image 'htmlize-default-transform-image - "Function called to modify the image descriptor. - -The function is called with the image descriptor found in the buffer and -the text the image is supposed to replace. It should return a (possibly -different) image descriptor property list or a replacement string to use -instead of of the original buffer text. - -Returning nil is the same as returning the original text." - :type 'boolean - :group 'htmlize) - -(defcustom htmlize-generate-hyperlinks t - "Non-nil means auto-generate the links from URLs and mail addresses in buffer. - -This is on by default; set it to nil if you don't want htmlize to -autogenerate such links. Note that this option only turns off automatic -search for contents that looks like URLs and converting them to links. -It has no effect on whether htmlize respects the `htmlize-link' property." - :type 'boolean - :group 'htmlize) - -(defcustom htmlize-hyperlink-style " - a { - color: inherit; - background-color: inherit; - font: inherit; - text-decoration: inherit; - } - a:hover { - text-decoration: underline; - } -" - "The CSS style used for hyperlinks when in CSS mode." - :type 'string - :group 'htmlize) - -(defcustom htmlize-replace-form-feeds t - "Non-nil means replace form feeds in source code with HTML separators. -Form feeds are the ^L characters at line beginnings that are sometimes -used to separate sections of source code. If this variable is set to -`t', form feed characters are replaced with the
separator. If this -is a string, it specifies the replacement to use. Note that
 is
-temporarily closed before the separator is inserted, so the default
-replacement is effectively \"

\".  If you specify
-another replacement, don't forget to close and reopen the 
 if you
-want the output to remain valid HTML.
-
-If you need more elaborate processing, set this to nil and use
-htmlize-after-hook."
-  :type 'boolean
-  :group 'htmlize)
-
-(defcustom htmlize-html-charset nil
-  "The charset declared by the resulting HTML documents.
-When non-nil, causes htmlize to insert the following in the HEAD section
-of the generated HTML:
-
-  
-
-where CHARSET is the value you've set for htmlize-html-charset.  Valid
-charsets are defined by MIME and include strings like \"iso-8859-1\",
-\"iso-8859-15\", \"utf-8\", etc.
-
-If you are using non-Latin-1 charsets, you might need to set this for
-your documents to render correctly.  Also, the W3C validator requires
-submitted HTML documents to declare a charset.  So if you care about
-validation, you can use this to prevent the validator from bitching.
-
-Needless to say, if you set this, you should actually make sure that
-the buffer is in the encoding you're claiming it is in.  (This is
-normally achieved by using the correct file coding system for the
-buffer.)  If you don't understand what that means, you should probably
-leave this option in its default setting."
-  :type '(choice (const :tag "Unset" nil)
-		 string)
-  :group 'htmlize)
-
-(defcustom htmlize-convert-nonascii-to-entities t
-  "Whether non-ASCII characters should be converted to HTML entities.
-
-When this is non-nil, characters with codes in the 128-255 range will be
-considered Latin 1 and rewritten as \"&#CODE;\".  Characters with codes
-above 255 will be converted to \"&#UCS;\", where UCS denotes the Unicode
-code point of the character.  If the code point cannot be determined,
-the character will be copied unchanged, as would be the case if the
-option were nil.
-
-When the option is nil, the non-ASCII characters are copied to HTML
-without modification.  In that case, the web server and/or the browser
-must be set to understand the encoding that was used when saving the
-buffer.  (You might also want to specify it by setting
-`htmlize-html-charset'.)
-
-Note that in an HTML entity \"&#CODE;\", CODE is always a UCS code point,
-which has nothing to do with the charset the page is in.  For example,
-\"©\" *always* refers to the copyright symbol, regardless of charset
-specified by the META tag or the charset sent by the HTTP server.  In
-other words, \"©\" is exactly equivalent to \"©\".
-
-For most people htmlize will work fine with this option left at the
-default setting; don't change it unless you know what you're doing."
-  :type 'sexp
-  :group 'htmlize)
-
-(defcustom htmlize-ignore-face-size 'absolute
-  "Whether face size should be ignored when generating HTML.
-If this is nil, face sizes are used.  If set to t, sizes are ignored
-If set to `absolute', only absolute size specifications are ignored.
-Please note that font sizes only work with CSS-based output types."
-  :type '(choice (const :tag "Don't ignore" nil)
-		 (const :tag "Ignore all" t)
-		 (const :tag "Ignore absolute" absolute))
-  :group 'htmlize)
-
-(defcustom htmlize-css-name-prefix ""
-  "The prefix used for CSS names.
-The CSS names that htmlize generates from face names are often too
-generic for CSS files; for example, `font-lock-type-face' is transformed
-to `type'.  Use this variable to add a prefix to the generated names.
-The string \"htmlize-\" is an example of a reasonable prefix."
-  :type 'string
-  :group 'htmlize)
-
-(defcustom htmlize-use-rgb-txt t
-  "Whether `rgb.txt' should be used to convert color names to RGB.
-
-This conversion means determining, for instance, that the color
-\"IndianRed\" corresponds to the (205, 92, 92) RGB triple.  `rgb.txt'
-is the X color database that maps hundreds of color names to such RGB
-triples.  When this variable is non-nil, `htmlize' uses `rgb.txt' to
-look up color names.
-
-If this variable is nil, htmlize queries Emacs for RGB components of
-colors using `color-instance-rgb-components' and `color-values'.
-This can yield incorrect results on non-true-color displays.
-
-If the `rgb.txt' file is not found (which will be the case if you're
-running Emacs on non-X11 systems), this option is ignored."
-  :type 'boolean
-  :group 'htmlize)
-
-(defvar htmlize-face-overrides nil
-  "Overrides for face definitions.
-
-Normally face definitions are taken from Emacs settings for fonts
-in the current frame.  For faces present in this plist, the
-definitions will be used instead.  Keys in the plist are symbols
-naming the face and values are the overriding definitions.  For
-example:
-
-  (setq htmlize-face-overrides
-        '(font-lock-warning-face \"black\"
-          font-lock-function-name-face \"red\"
-          font-lock-comment-face \"blue\"
-          default (:foreground \"dark-green\" :background \"yellow\")))
-
-This variable can be also be `let' bound when running `htmlize-buffer'.")
-
-(defcustom htmlize-untabify t
-  "Non-nil means untabify buffer contents during htmlization."
-  :type 'boolean
-  :group 'htmlize)
-
-(defcustom htmlize-html-major-mode nil
-  "The mode the newly created HTML buffer will be put in.
-Set this to nil if you prefer the default (fundamental) mode."
-  :type '(radio (const :tag "No mode (fundamental)" nil)
-		 (function-item html-mode)
-		 (function :tag "User-defined major mode"))
-  :group 'htmlize)
-
-(defcustom htmlize-pre-style nil
-  "When non-nil, `
' tags will be decorated with style
-information in `font' and `inline-css' modes. This allows a
-consistent background for captures of regions."
-  :type 'boolean
-  :group 'htmlize)
-
-(defvar htmlize-before-hook nil
-  "Hook run before htmlizing a buffer.
-The hook functions are run in the source buffer (not the resulting HTML
-buffer).")
-
-(defvar htmlize-after-hook nil
-  "Hook run after htmlizing a buffer.
-Unlike `htmlize-before-hook', these functions are run in the generated
-HTML buffer.  You may use them to modify the outlook of the final HTML
-output.")
-
-(defvar htmlize-file-hook nil
-  "Hook run by `htmlize-file' after htmlizing a file, but before saving it.")
-
-(defvar htmlize-buffer-places)
-
-;;; Some cross-Emacs compatibility.
-
-;; We need a function that efficiently finds the next change of a
-;; property regardless of whether the change occurred because of a
-;; text property or an extent/overlay.
-(defun htmlize-next-change (pos prop &optional limit)
-  (if prop
-      (next-single-char-property-change pos prop nil limit)
-    (next-char-property-change pos limit)))
-
-(defun htmlize-overlay-faces-at (pos)
-  (delq nil (mapcar (lambda (o) (overlay-get o 'face)) (overlays-at pos))))
-
-(defun htmlize-next-face-change (pos &optional limit)
-  ;; (htmlize-next-change pos 'face limit) would skip over entire
-  ;; overlays that specify the `face' property, even when they
-  ;; contain smaller text properties that also specify `face'.
-  ;; Emacs display engine merges those faces, and so must we.
-  (or limit
-      (setq limit (point-max)))
-  (let ((next-prop (next-single-property-change pos 'face nil limit))
-        (overlay-faces (htmlize-overlay-faces-at pos)))
-    (while (progn
-             (setq pos (next-overlay-change pos))
-             (and (< pos next-prop)
-                  (equal overlay-faces (htmlize-overlay-faces-at pos)))))
-    (setq pos (min pos next-prop))
-    ;; Additionally, we include the entire region that specifies the
-    ;; `display' property.
-    (when (get-char-property pos 'display)
-      (setq pos (next-single-char-property-change pos 'display nil limit)))
-    pos))
-
-(defmacro htmlize-lexlet (&rest letforms)
-  (declare (indent 1) (debug let))
-  (if (and (boundp 'lexical-binding)
-           lexical-binding)
-      `(let ,@letforms)
-    ;; cl extensions have a macro implementing lexical let
-    `(lexical-let ,@letforms)))
-
-
-;;; Transformation of buffer text: HTML escapes, untabification, etc.
-
-(defvar htmlize-basic-character-table
-  ;; Map characters in the 0-127 range to either one-character strings
-  ;; or to numeric entities.
-  (let ((table (make-vector 128 ?\0)))
-    ;; Map characters in the 32-126 range to themselves, others to
-    ;; &#CODE entities;
-    (dotimes (i 128)
-      (setf (aref table i) (if (and (>= i 32) (<= i 126))
-			       (char-to-string i)
-			     (format "&#%d;" i))))
-    ;; Set exceptions manually.
-    (setf
-     ;; Don't escape newline, carriage return, and TAB.
-     (aref table ?\n) "\n"
-     (aref table ?\r) "\r"
-     (aref table ?\t) "\t"
-     ;; Escape &, <, and >.
-     (aref table ?&) "&"
-     (aref table ?<) "<"
-     (aref table ?>) ">"
-     ;; Not escaping '"' buys us a measurable speedup.  It's only
-     ;; necessary to quote it for strings used in attribute values,
-     ;; which htmlize doesn't typically do.
-     ;(aref table ?\") """
-     )
-    table))
-
-;; A cache of HTML representation of non-ASCII characters.  Depending
-;; on the setting of `htmlize-convert-nonascii-to-entities', this maps
-;; non-ASCII characters to either "&#;" or "" (mapconcat's
-;; mapper must always return strings).  It's only filled as characters
-;; are encountered, so that in a buffer with e.g. French text, it will
-;; only ever contain French accented characters as keys.  It's cleared
-;; on each entry to htmlize-buffer-1 to allow modifications of
-;; `htmlize-convert-nonascii-to-entities' to take effect.
-(defvar htmlize-extended-character-cache (make-hash-table :test 'eq))
-
-(defun htmlize-protect-string (string)
-  "HTML-protect string, escaping HTML metacharacters and I18N chars."
-  ;; Only protecting strings that actually contain unsafe or non-ASCII
-  ;; chars removes a lot of unnecessary funcalls and consing.
-  (if (not (string-match "[^\r\n\t -%'-;=?-~]" string))
-      string
-    (mapconcat (lambda (char)
-		 (cond
-		  ((< char 128)
-		   ;; ASCII: use htmlize-basic-character-table.
-		   (aref htmlize-basic-character-table char))
-		  ((gethash char htmlize-extended-character-cache)
-		   ;; We've already seen this char; return the cached
-		   ;; string.
-		   )
-		  ((not htmlize-convert-nonascii-to-entities)
-		   ;; If conversion to entities is not desired, always
-		   ;; copy the char literally.
-		   (setf (gethash char htmlize-extended-character-cache)
-			 (char-to-string char)))
-		  ((< char 256)
-		   ;; Latin 1: no need to call encode-char.
-		   (setf (gethash char htmlize-extended-character-cache)
-			 (format "&#%d;" char)))
-		  ((encode-char char 'ucs)
-                   ;; Must check if encode-char works for CHAR;
-                   ;; it fails for Arabic and possibly elsewhere.
-		   (setf (gethash char htmlize-extended-character-cache)
-			 (format "&#%d;" (encode-char char 'ucs))))
-		  (t
-		   ;; encode-char doesn't work for this char.  Copy it
-		   ;; unchanged and hope for the best.
-		   (setf (gethash char htmlize-extended-character-cache)
-			 (char-to-string char)))))
-	       string "")))
-
-(defun htmlize-attr-escape (string)
-  ;; Like htmlize-protect-string, but also escapes double-quoted
-  ;; strings to make it usable in attribute values.
-  (setq string (htmlize-protect-string string))
-  (if (not (string-match "\"" string))
-      string
-    (mapconcat (lambda (char)
-                 (if (eql char ?\")
-                     """
-                   (char-to-string char)))
-               string "")))
-
-(defsubst htmlize-concat (list)
-  (if (and (consp list) (null (cdr list)))
-      ;; Don't create a new string in the common case where the list only
-      ;; consists of one element.
-      (car list)
-    (apply #'concat list)))
-
-(defun htmlize-format-link (linkprops text)
-  (let ((uri (if (stringp linkprops)
-                 linkprops
-               (plist-get linkprops :uri)))
-        (escaped-text (htmlize-protect-string text)))
-    (if uri
-        (format "%s" (htmlize-attr-escape uri) escaped-text)
-      escaped-text)))
-
-(defun htmlize-escape-or-link (string)
-  ;; Escape STRING and/or add hyperlinks.  STRING comes from a
-  ;; `display' property.
-  (let ((pos 0) (end (length string)) outlist)
-    (while (< pos end)
-      (let* ((link (get-char-property pos 'htmlize-link string))
-             (next-link-change (next-single-property-change
-                                pos 'htmlize-link string end))
-             (chunk (substring string pos next-link-change)))
-        (push
-         (cond (link
-                (htmlize-format-link link chunk))
-               ((get-char-property 0 'htmlize-literal chunk)
-                chunk)
-               (t
-                (htmlize-protect-string chunk)))
-         outlist)
-        (setq pos next-link-change)))
-    (htmlize-concat (nreverse outlist))))
-
-(defun htmlize-display-prop-to-html (display text)
-  (let (desc)
-    (cond ((stringp display)
-           ;; Emacs ignores recursive display properties.
-           (htmlize-escape-or-link display))
-          ((not (eq (car-safe display) 'image))
-           (htmlize-protect-string text))
-          ((null (setq desc (funcall htmlize-transform-image
-                                     (cdr display) text)))
-           (htmlize-escape-or-link text))
-          ((stringp desc)
-           (htmlize-escape-or-link desc))
-          (t
-           (htmlize-generate-image desc text)))))
-
-(defun htmlize-string-to-html (string)
-  ;; Convert the string to HTML, including images attached as
-  ;; `display' property and links as `htmlize-link' property.  In a
-  ;; string without images or links, this is equivalent to
-  ;; `htmlize-protect-string'.
-  (let ((pos 0) (end (length string)) outlist)
-    (while (< pos end)
-      (let* ((display (get-char-property pos 'display string))
-             (next-display-change (next-single-property-change
-                                   pos 'display string end))
-             (chunk (substring string pos next-display-change)))
-        (push
-         (if display
-             (htmlize-display-prop-to-html display chunk)
-           (htmlize-escape-or-link chunk))
-         outlist)
-        (setq pos next-display-change)))
-    (htmlize-concat (nreverse outlist))))
-
-(defun htmlize-default-transform-image (imgprops _text)
-  "Default transformation of image descriptor to something usable in HTML.
-
-If `htmlize-use-images' is nil, the function always returns nil, meaning
-use original text.  Otherwise, it tries to find the image for images that
-specify a file name.  If `htmlize-force-inline-images' is non-nil, it also
-converts the :file attribute to :data and returns the modified property
-list."
-  (when htmlize-use-images
-    (when (plist-get imgprops :file)
-      (let ((location (plist-get (cdr (find-image (list imgprops))) :file)))
-        (when location
-          (setq imgprops (plist-put (copy-list imgprops) :file location)))))
-    (if htmlize-force-inline-images
-        (let ((location (plist-get imgprops :file))
-              data)
-          (when location
-            (with-temp-buffer
-              (condition-case nil
-                  (progn
-                    (insert-file-contents-literally location)
-                    (setq data (buffer-string)))
-                (error nil))))
-          ;; if successful, return the new plist, otherwise return
-          ;; nil, which will use the original text
-          (and data
-               (plist-put (plist-put imgprops :file nil)
-                          :data data)))
-      imgprops)))
-
-(defun htmlize-alt-text (_imgprops origtext)
-  (and (/= (length origtext) 0)
-       (<= (length origtext) htmlize-max-alt-text)
-       (not (string-match "[\0-\x1f]" origtext))
-       origtext))
-
-(defun htmlize-generate-image (imgprops origtext)
-  (let* ((alt-text (htmlize-alt-text imgprops origtext))
-         (alt-attr (if alt-text
-                       (format " alt=\"%s\"" (htmlize-attr-escape alt-text))
-                     "")))
-    (cond ((plist-get imgprops :file)
-           ;; Try to find the image in image-load-path
-           (let* ((found-props (cdr (find-image (list imgprops))))
-                  (file (or (plist-get found-props :file)
-                            (plist-get imgprops :file))))
-             (format ""
-                     (htmlize-attr-escape (file-relative-name file))
-                     alt-attr)))
-          ((plist-get imgprops :data)
-           (format ""
-                   (or (plist-get imgprops :type) "")
-                   (base64-encode-string (plist-get imgprops :data))
-                   alt-attr)))))
-
-(defconst htmlize-ellipsis "...")
-(put-text-property 0 (length htmlize-ellipsis) 'htmlize-ellipsis t htmlize-ellipsis)
-
-(defun htmlize-match-inv-spec (inv)
-  (member* inv buffer-invisibility-spec
-           :key (lambda (i)
-                  (if (symbolp i) i (car i)))))
-
-(defun htmlize-decode-invisibility-spec (invisible)
-  ;; Return t, nil, or `ellipsis', depending on how invisible text should be inserted.
-
-  (if (not (listp buffer-invisibility-spec))
-      ;; If buffer-invisibility-spec is not a list, then all
-      ;; characters with non-nil `invisible' property are visible.
-      (not invisible)
-
-    ;; Otherwise, the value of a non-nil `invisible' property can be:
-    ;; 1. a symbol -- make the text invisible if it matches
-    ;;    buffer-invisibility-spec.
-    ;; 2. a list of symbols -- make the text invisible if
-    ;;    any symbol in the list matches
-    ;;    buffer-invisibility-spec.
-    ;; If the match of buffer-invisibility-spec has a non-nil
-    ;; CDR, replace the invisible text with an ellipsis.
-    (let ((match (if (symbolp invisible)
-                     (htmlize-match-inv-spec invisible)
-                   (some #'htmlize-match-inv-spec invisible))))
-      (cond ((null match) t)
-            ((cdr-safe (car match)) 'ellipsis)
-            (t nil)))))
-
-(defun htmlize-add-before-after-strings (beg end text)
-  ;; Find overlays specifying before-string and after-string in [beg,
-  ;; pos).  If any are found, splice them into TEXT and return the new
-  ;; text.
-  (let (additions)
-    (dolist (overlay (overlays-in beg end))
-      (let ((before (overlay-get overlay 'before-string))
-            (after (overlay-get overlay 'after-string)))
-        (when after
-          (push (cons (- (overlay-end overlay) beg)
-                      after)
-                additions))
-        (when before
-          (push (cons (- (overlay-start overlay) beg)
-                      before)
-                additions))))
-    (if additions
-        (let ((textlist nil)
-              (strpos 0))
-          (dolist (add (stable-sort additions #'< :key #'car))
-            (let ((addpos (car add))
-                  (addtext (cdr add)))
-              (push (substring text strpos addpos) textlist)
-              (push addtext textlist)
-              (setq strpos addpos)))
-          (push (substring text strpos) textlist)
-          (apply #'concat (nreverse textlist)))
-      text)))
-
-(defun htmlize-copy-prop (prop beg end string)
-  ;; Copy the specified property from the specified region of the
-  ;; buffer to the target string.  We cannot rely on Emacs to copy the
-  ;; property because we want to handle properties coming from both
-  ;; text properties and overlays.
-  (let ((pos beg))
-    (while (< pos end)
-      (let ((value (get-char-property pos prop))
-            (next-change (htmlize-next-change pos prop end)))
-        (when value
-          (put-text-property (- pos beg) (- next-change beg)
-                             prop value string))
-        (setq pos next-change)))))
-
-(defun htmlize-get-text-with-display (beg end)
-  ;; Like buffer-substring-no-properties, except it copies the
-  ;; `display' property from the buffer, if found.
-  (let ((text (buffer-substring-no-properties beg end)))
-    (htmlize-copy-prop 'display beg end text)
-    (htmlize-copy-prop 'htmlize-link beg end text)
-    (setq text (htmlize-add-before-after-strings beg end text))
-    text))
-
-(defun htmlize-buffer-substring-no-invisible (beg end)
-  ;; Like buffer-substring-no-properties, but don't copy invisible
-  ;; parts of the region.  Where buffer-substring-no-properties
-  ;; mandates an ellipsis to be shown, htmlize-ellipsis is inserted.
-  (let ((pos beg)
-	visible-list invisible show last-show next-change)
-    ;; Iterate over the changes in the `invisible' property and filter
-    ;; out the portions where it's non-nil, i.e. where the text is
-    ;; invisible.
-    (while (< pos end)
-      (setq invisible (get-char-property pos 'invisible)
-	    next-change (htmlize-next-change pos 'invisible end)
-            show (htmlize-decode-invisibility-spec invisible))
-      (cond ((eq show t)
-	     (push (htmlize-get-text-with-display pos next-change)
-                   visible-list))
-            ((and (eq show 'ellipsis)
-                  (not (eq last-show 'ellipsis))
-                  ;; Conflate successive ellipses.
-                  (push htmlize-ellipsis visible-list))))
-      (setq pos next-change last-show show))
-    (htmlize-concat (nreverse visible-list))))
-
-(defun htmlize-trim-ellipsis (text)
-  ;; Remove htmlize-ellipses ("...") from the beginning of TEXT if it
-  ;; starts with it.  It checks for the special property of the
-  ;; ellipsis so it doesn't work on ordinary text that begins with
-  ;; "...".
-  (if (get-text-property 0 'htmlize-ellipsis text)
-      (substring text (length htmlize-ellipsis))
-    text))
-
-(defconst htmlize-tab-spaces
-  ;; A table of strings with spaces.  (aref htmlize-tab-spaces 5) is
-  ;; like (make-string 5 ?\ ), except it doesn't cons.
-  (let ((v (make-vector 32 nil)))
-    (dotimes (i (length v))
-      (setf (aref v i) (make-string i ?\ )))
-    v))
-
-(defun htmlize-untabify-string (text start-column)
-  "Untabify TEXT, assuming it starts at START-COLUMN."
-  (let ((column start-column)
-	(last-match 0)
-	(chunk-start 0)
-	chunks match-pos tab-size)
-    (while (string-match "[\t\n]" text last-match)
-      (setq match-pos (match-beginning 0))
-      (cond ((eq (aref text match-pos) ?\t)
-	     ;; Encountered a tab: create a chunk of text followed by
-	     ;; the expanded tab.
-	     (push (substring text chunk-start match-pos) chunks)
-	     ;; Increase COLUMN by the length of the text we've
-	     ;; skipped since last tab or newline.  (Encountering
-	     ;; newline resets it.)
-	     (incf column (- match-pos last-match))
-	     ;; Calculate tab size based on tab-width and COLUMN.
-	     (setq tab-size (- tab-width (% column tab-width)))
-	     ;; Expand the tab, carefully recreating the `display'
-	     ;; property if one was on the TAB.
-             (let ((display (get-text-property match-pos 'display text))
-                   (expanded-tab (aref htmlize-tab-spaces tab-size)))
-               (when display
-                 (put-text-property 0 tab-size 'display display expanded-tab))
-               (push expanded-tab chunks))
-	     (incf column tab-size)
-	     (setq chunk-start (1+ match-pos)))
-	    (t
-	     ;; Reset COLUMN at beginning of line.
-	     (setq column 0)))
-      (setq last-match (1+ match-pos)))
-    ;; If no chunks have been allocated, it means there have been no
-    ;; tabs to expand.  Return TEXT unmodified.
-    (if (null chunks)
-	text
-      (when (< chunk-start (length text))
-	;; Push the remaining chunk.
-	(push (substring text chunk-start) chunks))
-      ;; Generate the output from the available chunks.
-      (htmlize-concat (nreverse chunks)))))
-
-(defun htmlize-extract-text (beg end trailing-ellipsis)
-  ;; Extract buffer text, sans the invisible parts.  Then
-  ;; untabify it and escape the HTML metacharacters.
-  (let ((text (htmlize-buffer-substring-no-invisible beg end)))
-    (when trailing-ellipsis
-      (setq text (htmlize-trim-ellipsis text)))
-    ;; If TEXT ends up empty, don't change trailing-ellipsis.
-    (when (> (length text) 0)
-      (setq trailing-ellipsis
-            (get-text-property (1- (length text))
-                               'htmlize-ellipsis text)))
-    (when htmlize-untabify
-      (setq text (htmlize-untabify-string text (current-column))))
-    (setq text (htmlize-string-to-html text))
-    (values text trailing-ellipsis)))
-
-(defun htmlize-despam-address (string)
-  "Replace every occurrence of '@' in STRING with %40.
-This is used to protect mailto links without modifying their meaning."
-  ;; Suggested by Ville Skytta.
-  (while (string-match "@" string)
-    (setq string (replace-match "%40" nil t string)))
-  string)
-
-(defun htmlize-make-tmp-overlay (beg end props)
-  (let ((overlay (make-overlay beg end)))
-    (overlay-put overlay 'htmlize-tmp-overlay t)
-    (while props
-      (overlay-put overlay (pop props) (pop props)))
-    overlay))
-
-(defun htmlize-delete-tmp-overlays ()
-  (dolist (overlay (overlays-in (point-min) (point-max)))
-    (when (overlay-get overlay 'htmlize-tmp-overlay)
-      (delete-overlay overlay))))
-
-(defun htmlize-make-link-overlay (beg end uri)
-  (htmlize-make-tmp-overlay beg end `(htmlize-link (:uri ,uri))))
-
-(defun htmlize-create-auto-links ()
-  "Add `htmlize-link' property to all mailto links in the buffer."
-  (save-excursion
-    (goto-char (point-min))
-    (while (re-search-forward
-            "<\\(\\(mailto:\\)?\\([-=+_.a-zA-Z0-9]+@[-_.a-zA-Z0-9]+\\)\\)>"
-            nil t)
-      (let* ((address (match-string 3))
-             (beg (match-beginning 0)) (end (match-end 0))
-             (uri (concat "mailto:" (htmlize-despam-address address))))
-        (htmlize-make-link-overlay beg end uri)))
-    (goto-char (point-min))
-    (while (re-search-forward "<\\(\\(URL:\\)?\\([a-zA-Z]+://[^;]+\\)\\)>"
-                              nil t)
-      (htmlize-make-link-overlay
-       (match-beginning 0) (match-end 0) (match-string 3)))))
-
-;; Tests for htmlize-create-auto-links:
-
-;; 
-;; 
-;; 
-;; 
-;; 
-;; 
-
-(defun htmlize-shadow-form-feeds ()
-  (let ((s "\n
")) - (put-text-property 0 (length s) 'htmlize-literal t s) - (let ((disp `(display ,s))) - (while (re-search-forward "\n\^L" nil t) - (let* ((beg (match-beginning 0)) - (end (match-end 0)) - (form-feed-pos (1+ beg)) - ;; don't process ^L if invisible or covered by `display' - (show (and (htmlize-decode-invisibility-spec - (get-char-property form-feed-pos 'invisible)) - (not (get-char-property form-feed-pos 'display))))) - (when show - (htmlize-make-tmp-overlay beg end disp))))))) - -(defun htmlize-defang-local-variables () - ;; Juri Linkov reports that an HTML-ized "Local variables" can lead - ;; visiting the HTML to fail with "Local variables list is not - ;; properly terminated". He suggested changing the phrase to - ;; syntactically equivalent HTML that Emacs doesn't recognize. - (goto-char (point-min)) - (while (search-forward "Local Variables:" nil t) - (replace-match "Local Variables:" nil t))) - - -;;; Color handling. - -(defvar htmlize-x-library-search-path - `(,data-directory - "/etc/X11/rgb.txt" - "/usr/share/X11/rgb.txt" - ;; the remainder of this list really belongs in a museum - "/usr/X11R6/lib/X11/" - "/usr/X11R5/lib/X11/" - "/usr/lib/X11R6/X11/" - "/usr/lib/X11R5/X11/" - "/usr/local/X11R6/lib/X11/" - "/usr/local/X11R5/lib/X11/" - "/usr/local/lib/X11R6/X11/" - "/usr/local/lib/X11R5/X11/" - "/usr/X11/lib/X11/" - "/usr/lib/X11/" - "/usr/local/lib/X11/" - "/usr/X386/lib/X11/" - "/usr/x386/lib/X11/" - "/usr/XFree86/lib/X11/" - "/usr/unsupported/lib/X11/" - "/usr/athena/lib/X11/" - "/usr/local/x11r5/lib/X11/" - "/usr/lpp/Xamples/lib/X11/" - "/usr/openwin/lib/X11/" - "/usr/openwin/share/lib/X11/")) - -(defun htmlize-get-color-rgb-hash (&optional rgb-file) - "Return a hash table mapping X color names to RGB values. -The keys in the hash table are X11 color names, and the values are the -#rrggbb RGB specifications, extracted from `rgb.txt'. - -If RGB-FILE is nil, the function will try hard to find a suitable file -in the system directories. - -If no rgb.txt file is found, return nil." - (let ((rgb-file (or rgb-file (locate-file - "rgb.txt" - htmlize-x-library-search-path))) - (hash nil)) - (when rgb-file - (with-temp-buffer - (insert-file-contents rgb-file) - (setq hash (make-hash-table :test 'equal)) - (while (not (eobp)) - (cond ((looking-at "^\\s-*\\([!#]\\|$\\)") - ;; Skip comments and empty lines. - ) - ((looking-at - "[ \t]*\\([0-9]+\\)[ \t]+\\([0-9]+\\)[ \t]+\\([0-9]+\\)[ \t]+\\(.*\\)") - (setf (gethash (downcase (match-string 4)) hash) - (format "#%02x%02x%02x" - (string-to-number (match-string 1)) - (string-to-number (match-string 2)) - (string-to-number (match-string 3))))) - (t - (error - "Unrecognized line in %s: %s" - rgb-file - (buffer-substring (point) (progn (end-of-line) (point)))))) - (forward-line 1)))) - hash)) - -;; Compile the RGB map when loaded. On systems where rgb.txt is -;; missing, the value of the variable will be nil, and rgb.txt will -;; not be used. -(defvar htmlize-color-rgb-hash (htmlize-get-color-rgb-hash)) - -;;; Face handling. - -(defun htmlize-face-color-internal (face fg) - ;; Used only under GNU Emacs. Return the color of FACE, but don't - ;; return "unspecified-fg" or "unspecified-bg". If the face is - ;; `default' and the color is unspecified, look up the color in - ;; frame parameters. - (let* ((function (if fg #'face-foreground #'face-background)) - (color (funcall function face nil t))) - (when (and (eq face 'default) (null color)) - (setq color (cdr (assq (if fg 'foreground-color 'background-color) - (frame-parameters))))) - (when (or (eq color 'unspecified) - (equal color "unspecified-fg") - (equal color "unspecified-bg")) - (setq color nil)) - (when (and (eq face 'default) - (null color)) - ;; Assuming black on white doesn't seem right, but I can't think - ;; of anything better to do. - (setq color (if fg "black" "white"))) - color)) - -(defun htmlize-face-foreground (face) - ;; Return the name of the foreground color of FACE. If FACE does - ;; not specify a foreground color, return nil. - (htmlize-face-color-internal face t)) - -(defun htmlize-face-background (face) - ;; Return the name of the background color of FACE. If FACE does - ;; not specify a background color, return nil. - ;; GNU Emacs. - (htmlize-face-color-internal face nil)) - -;; Convert COLOR to the #RRGGBB string. If COLOR is already in that -;; format, it's left unchanged. - -(defun htmlize-color-to-rgb (color) - (let ((rgb-string nil)) - (cond ((null color) - ;; Ignore nil COLOR because it means that the face is not - ;; specifying any color. Hence (htmlize-color-to-rgb nil) - ;; returns nil. - ) - ((string-match "\\`#" color) - ;; The color is already in #rrggbb format. - (setq rgb-string color)) - ((and htmlize-use-rgb-txt - htmlize-color-rgb-hash) - ;; Use of rgb.txt is requested, and it's available on the - ;; system. Use it. - (setq rgb-string (gethash (downcase color) htmlize-color-rgb-hash))) - (t - ;; We're getting the RGB components from Emacs. - (let ((rgb (mapcar (lambda (arg) - (/ arg 256)) - (color-values color)))) - (when rgb - (setq rgb-string (apply #'format "#%02x%02x%02x" rgb)))))) - ;; If RGB-STRING is still nil, it means the color cannot be found, - ;; for whatever reason. In that case just punt and return COLOR. - ;; Most browsers support a decent set of color names anyway. - (or rgb-string color))) - -;; We store the face properties we care about into an -;; `htmlize-fstruct' type. That way we only have to analyze face -;; properties, which can be time consuming, once per each face. The -;; mapping between Emacs faces and htmlize-fstructs is established by -;; htmlize-make-face-map. The name "fstruct" refers to variables of -;; type `htmlize-fstruct', while the term "face" is reserved for Emacs -;; faces. - -(defstruct htmlize-fstruct - foreground ; foreground color, #rrggbb - background ; background color, #rrggbb - size ; size - boldp ; whether face is bold - italicp ; whether face is italic - underlinep ; whether face is underlined - overlinep ; whether face is overlined - strikep ; whether face is struck through - css-name ; CSS name of face - ) - -(defun htmlize-face-set-from-keyword-attr (fstruct attr value) - ;; For ATTR and VALUE, set the equivalent value in FSTRUCT. - (case attr - (:foreground - (setf (htmlize-fstruct-foreground fstruct) (htmlize-color-to-rgb value))) - (:background - (setf (htmlize-fstruct-background fstruct) (htmlize-color-to-rgb value))) - (:height - (setf (htmlize-fstruct-size fstruct) value)) - (:weight - (when (string-match (symbol-name value) "bold") - (setf (htmlize-fstruct-boldp fstruct) t))) - (:slant - (setf (htmlize-fstruct-italicp fstruct) (or (eq value 'italic) - (eq value 'oblique)))) - (:bold - (setf (htmlize-fstruct-boldp fstruct) value)) - (:italic - (setf (htmlize-fstruct-italicp fstruct) value)) - (:underline - (setf (htmlize-fstruct-underlinep fstruct) value)) - (:overline - (setf (htmlize-fstruct-overlinep fstruct) value)) - (:strike-through - (setf (htmlize-fstruct-strikep fstruct) value)))) - -(defun htmlize-face-size (face) - ;; The size (height) of FACE, taking inheritance into account. - ;; Only works in Emacs 21 and later. - (let* ((face-list (list face)) - (head face-list) - (tail face-list)) - (while head - (let ((inherit (face-attribute (car head) :inherit))) - (cond ((listp inherit) - (setcdr tail (copy-list inherit)) - (setq tail (last tail))) - ((eq inherit 'unspecified)) - (t - (setcdr tail (list inherit)) - (setq tail (cdr tail))))) - (pop head)) - (let ((size-list - (loop - for f in face-list - for h = (face-attribute f :height) - collect (if (eq h 'unspecified) nil h)))) - (reduce 'htmlize-merge-size (cons nil size-list))))) - -(defun htmlize-face-css-name (face) - ;; Generate the css-name property for the given face. Emacs places - ;; no restrictions on the names of symbols that represent faces -- - ;; any characters may be in the name, even control chars. We try - ;; hard to beat the face name into shape, both esthetically and - ;; according to CSS1 specs. - (let ((name (downcase (symbol-name face)))) - (when (string-match "\\`font-lock-" name) - ;; font-lock-FOO-face -> FOO. - (setq name (replace-match "" t t name))) - (when (string-match "-face\\'" name) - ;; Drop the redundant "-face" suffix. - (setq name (replace-match "" t t name))) - (while (string-match "[^-a-zA-Z0-9]" name) - ;; Drop the non-alphanumerics. - (setq name (replace-match "X" t t name))) - (when (string-match "\\`[-0-9]" name) - ;; CSS identifiers may not start with a digit. - (setq name (concat "X" name))) - ;; After these transformations, the face could come out empty. - (when (equal name "") - (setq name "face")) - ;; Apply the prefix. - (concat htmlize-css-name-prefix name))) - -(defun htmlize-face-to-fstruct-1 (face) - "Convert Emacs face FACE to fstruct, internal." - (let ((fstruct (make-htmlize-fstruct - :foreground (htmlize-color-to-rgb - (htmlize-face-foreground face)) - :background (htmlize-color-to-rgb - (htmlize-face-background face))))) - ;; GNU Emacs - (dolist (attr '(:weight :slant :underline :overline :strike-through)) - (let ((value (face-attribute face attr nil t))) - (when (and value (not (eq value 'unspecified))) - (htmlize-face-set-from-keyword-attr fstruct attr value)))) - (let ((size (htmlize-face-size face))) - (unless (eql size 1.0) ; ignore non-spec - (setf (htmlize-fstruct-size fstruct) size))) - (setf (htmlize-fstruct-css-name fstruct) (htmlize-face-css-name face)) - fstruct)) - -(defun htmlize-face-to-fstruct (face) - (let* ((face-list (or (and (symbolp face) - (cdr (assq face face-remapping-alist))) - (list face))) - (fstruct (htmlize-merge-faces - (mapcar (lambda (face) - (if (symbolp face) - (or (htmlize-get-override-fstruct face) - (htmlize-face-to-fstruct-1 face)) - (htmlize-attrlist-to-fstruct face))) - (nreverse face-list))))) - (when (symbolp face) - (setf (htmlize-fstruct-css-name fstruct) (htmlize-face-css-name face))) - fstruct)) - -(defmacro htmlize-copy-attr-if-set (attr-list dest source) - ;; Generate code with the following pattern: - ;; (progn - ;; (when (htmlize-fstruct-ATTR source) - ;; (setf (htmlize-fstruct-ATTR dest) (htmlize-fstruct-ATTR source))) - ;; ...) - ;; for the given list of boolean attributes. - (cons 'progn - (loop for attr in attr-list - for attr-sym = (intern (format "htmlize-fstruct-%s" attr)) - collect `(when (,attr-sym ,source) - (setf (,attr-sym ,dest) (,attr-sym ,source)))))) - -(defun htmlize-merge-size (merged next) - ;; Calculate the size of the merge of MERGED and NEXT. - (cond ((null merged) next) - ((integerp next) next) - ((null next) merged) - ((floatp merged) (* merged next)) - ((integerp merged) (round (* merged next))))) - -(defun htmlize-merge-two-faces (merged next) - (htmlize-copy-attr-if-set - (foreground background boldp italicp underlinep overlinep strikep) - merged next) - (setf (htmlize-fstruct-size merged) - (htmlize-merge-size (htmlize-fstruct-size merged) - (htmlize-fstruct-size next))) - merged) - -(defun htmlize-merge-faces (fstruct-list) - (cond ((null fstruct-list) - ;; Nothing to do, return a dummy face. - (make-htmlize-fstruct)) - ((null (cdr fstruct-list)) - ;; Optimize for the common case of a single face, simply - ;; return it. - (car fstruct-list)) - (t - (reduce #'htmlize-merge-two-faces - (cons (make-htmlize-fstruct) fstruct-list))))) - -;; GNU Emacs 20+ supports attribute lists in `face' properties. For -;; example, you can use `(:foreground "red" :weight bold)' as an -;; overlay's "face", or you can even use a list of such lists, etc. -;; We call those "attrlists". -;; -;; htmlize supports attrlist by converting them to fstructs, the same -;; as with regular faces. - -(defun htmlize-attrlist-to-fstruct (attrlist &optional name) - ;; Like htmlize-face-to-fstruct, but accepts an ATTRLIST as input. - (let ((fstruct (make-htmlize-fstruct))) - (cond ((eq (car attrlist) 'foreground-color) - ;; ATTRLIST is (foreground-color . COLOR) - (setf (htmlize-fstruct-foreground fstruct) - (htmlize-color-to-rgb (cdr attrlist)))) - ((eq (car attrlist) 'background-color) - ;; ATTRLIST is (background-color . COLOR) - (setf (htmlize-fstruct-background fstruct) - (htmlize-color-to-rgb (cdr attrlist)))) - (t - ;; ATTRLIST is a plist. - (while attrlist - (let ((attr (pop attrlist)) - (value (pop attrlist))) - (when (and value (not (eq value 'unspecified))) - (htmlize-face-set-from-keyword-attr fstruct attr value)))))) - (setf (htmlize-fstruct-css-name fstruct) (or name "custom")) - fstruct)) - -(defun htmlize-decode-face-prop (prop) - "Turn face property PROP into a list of face-like objects." - ;; PROP can be a symbol naming a face, a string naming such a - ;; symbol, a cons (foreground-color . COLOR) or (background-color - ;; COLOR), a property list (:attr1 val1 :attr2 val2 ...), or a list - ;; of any of those. - ;; - ;; (htmlize-decode-face-prop 'face) -> (face) - ;; (htmlize-decode-face-prop '(face1 face2)) -> (face1 face2) - ;; (htmlize-decode-face-prop '(:attr "val")) -> ((:attr "val")) - ;; (htmlize-decode-face-prop '((:attr "val") face (foreground-color "red"))) - ;; -> ((:attr "val") face (foreground-color "red")) - ;; - ;; Unrecognized atoms or non-face symbols/strings are silently - ;; stripped away. - (cond ((null prop) - nil) - ((symbolp prop) - (and (facep prop) - (list prop))) - ((stringp prop) - (and (facep (intern-soft prop)) - (list prop))) - ((atom prop) - nil) - ((and (symbolp (car prop)) - (eq ?: (aref (symbol-name (car prop)) 0))) - (list prop)) - ((or (eq (car prop) 'foreground-color) - (eq (car prop) 'background-color)) - (list prop)) - (t - (apply #'nconc (mapcar #'htmlize-decode-face-prop prop))))) - -(defun htmlize-get-override-fstruct (face) - (let* ((raw-def (plist-get htmlize-face-overrides face)) - (def (cond ((stringp raw-def) (list :foreground raw-def)) - ((listp raw-def) raw-def) - (t - (error (format (concat "face override must be an " - "attribute list or string, got %s") - raw-def)))))) - (and def - (htmlize-attrlist-to-fstruct def (symbol-name face))))) - -(defun htmlize-make-face-map (faces) - ;; Return a hash table mapping Emacs faces to htmlize's fstructs. - ;; The keys are either face symbols or attrlists, so the test - ;; function must be `equal'. - (let ((face-map (make-hash-table :test 'equal)) - css-names) - (dolist (face faces) - (unless (gethash face face-map) - ;; Haven't seen FACE yet; convert it to an fstruct and cache - ;; it. - (let ((fstruct (htmlize-face-to-fstruct face))) - (setf (gethash face face-map) fstruct) - (let* ((css-name (htmlize-fstruct-css-name fstruct)) - (new-name css-name) - (i 0)) - ;; Uniquify the face's css-name by using NAME-1, NAME-2, - ;; etc. - (while (member new-name css-names) - (setq new-name (format "%s-%s" css-name (incf i)))) - (unless (equal new-name css-name) - (setf (htmlize-fstruct-css-name fstruct) new-name)) - (push new-name css-names))))) - face-map)) - -(defun htmlize-unstringify-face (face) - "If FACE is a string, return it interned, otherwise return it unchanged." - (if (stringp face) - (intern face) - face)) - -(defun htmlize-faces-in-buffer () - "Return a list of faces used in the current buffer. -This is the set of faces specified by the `face' text property and by buffer -overlays that specify `face'." - (let (faces) - ;; Faces used by text properties. - (let ((pos (point-min)) face-prop next) - (while (< pos (point-max)) - (setq face-prop (get-text-property pos 'face) - next (or (next-single-property-change pos 'face) (point-max))) - (setq faces (nunion (htmlize-decode-face-prop face-prop) - faces :test 'equal)) - (setq pos next))) - ;; Faces used by overlays. - (dolist (overlay (overlays-in (point-min) (point-max))) - (let ((face-prop (overlay-get overlay 'face))) - (setq faces (nunion (htmlize-decode-face-prop face-prop) - faces :test 'equal)))) - faces)) - -(if (>= emacs-major-version 25) - (defun htmlize-sorted-overlays-at (pos) - (overlays-at pos t)) - - (defun htmlize-sorted-overlays-at (pos) - ;; Like OVERLAYS-AT with the SORTED argument, for older Emacsen. - (let ((overlays (overlays-at pos))) - (setq overlays (sort* overlays #'< - :key (lambda (o) - (- (overlay-end o) (overlay-start o))))) - (setq overlays - (stable-sort overlays #'< - :key (lambda (o) - (let ((prio (overlay-get o 'priority))) - (if (numberp prio) prio 0))))) - (nreverse overlays)))) - - -;; htmlize-faces-at-point returns the faces in use at point. The -;; faces are sorted by increasing priority, i.e. the last face takes -;; precedence. -;; -;; This returns all the faces in the `face' property and all the faces -;; in the overlays at point. - -(defun htmlize-faces-at-point () - (let (all-faces) - ;; Faces from text properties. - (let ((face-prop (get-text-property (point) 'face))) - ;; we need to reverse the `face' prop because we want - ;; more specific faces to come later - (setq all-faces (nreverse (htmlize-decode-face-prop face-prop)))) - ;; Faces from overlays. - (let ((overlays - ;; Collect overlays at point that specify `face'. - (delete-if-not (lambda (o) - (overlay-get o 'face)) - (nreverse (htmlize-sorted-overlays-at (point))))) - list face-prop) - (dolist (overlay overlays) - (setq face-prop (overlay-get overlay 'face) - list (nconc (htmlize-decode-face-prop face-prop) list))) - ;; Under "Merging Faces" the manual explicitly states - ;; that faces specified by overlays take precedence over - ;; faces specified by text properties. - (setq all-faces (nconc all-faces list))) - all-faces)) - -;; htmlize supports generating HTML in several flavors, some of which -;; use CSS, and others the element. We take an OO approach and -;; define "methods" that indirect to the functions that depend on -;; `htmlize-output-type'. The currently used methods are `doctype', -;; `insert-head', `body-tag', `pre-tag', and `text-markup'. Not all -;; output types define all methods. -;; -;; Methods are called either with (htmlize-method METHOD ARGS...) -;; special form, or by accessing the function with -;; (htmlize-method-function 'METHOD) and calling (funcall FUNCTION). -;; The latter form is useful in tight loops because `htmlize-method' -;; conses. - -(defmacro htmlize-method (method &rest args) - ;; Expand to (htmlize-TYPE-METHOD ...ARGS...). TYPE is the value of - ;; `htmlize-output-type' at run time. - `(funcall (htmlize-method-function ',method) ,@args)) - -(defun htmlize-method-function (method) - ;; Return METHOD's function definition for the current output type. - ;; The returned object can be safely funcalled. - (let ((sym (intern (format "htmlize-%s-%s" htmlize-output-type method)))) - (indirect-function (if (fboundp sym) - sym - (let ((default (intern (concat "htmlize-default-" - (symbol-name method))))) - (if (fboundp default) - default - 'ignore)))))) - -(defvar htmlize-memoization-table (make-hash-table :test 'equal)) - -(defmacro htmlize-memoize (key generator) - "Return the value of GENERATOR, memoized as KEY. -That means that GENERATOR will be evaluated and returned the first time -it's called with the same value of KEY. All other times, the cached -\(memoized) value will be returned." - (let ((value (gensym))) - `(let ((,value (gethash ,key htmlize-memoization-table))) - (unless ,value - (setq ,value ,generator) - (setf (gethash ,key htmlize-memoization-table) ,value)) - ,value))) - -;;; Default methods. - -(defun htmlize-default-doctype () - nil ; no doc-string - ;; Note that the `font' output is technically invalid under this DTD - ;; because the DTD doesn't allow embedding in
.
-  ""
-  )
-
-(defun htmlize-default-body-tag (face-map)
-  nil					; no doc-string
-  face-map ; shut up the byte-compiler
-  "")
-
-(defun htmlize-default-pre-tag (face-map)
-  nil					; no doc-string
-  face-map ; shut up the byte-compiler
-  "
")
-
-
-;;; CSS based output support.
-
-;; Internal function; not a method.
-(defun htmlize-css-specs (fstruct)
-  (let (result)
-    (when (htmlize-fstruct-foreground fstruct)
-      (push (format "color: %s;" (htmlize-fstruct-foreground fstruct))
-	    result))
-    (when (htmlize-fstruct-background fstruct)
-      (push (format "background-color: %s;"
-		    (htmlize-fstruct-background fstruct))
-	    result))
-    (let ((size (htmlize-fstruct-size fstruct)))
-      (when (and size (not (eq htmlize-ignore-face-size t)))
-	(cond ((floatp size)
-	       (push (format "font-size: %d%%;" (* 100 size)) result))
-	      ((not (eq htmlize-ignore-face-size 'absolute))
-	       (push (format "font-size: %spt;" (/ size 10.0)) result)))))
-    (when (htmlize-fstruct-boldp fstruct)
-      (push "font-weight: bold;" result))
-    (when (htmlize-fstruct-italicp fstruct)
-      (push "font-style: italic;" result))
-    (when (htmlize-fstruct-underlinep fstruct)
-      (push "text-decoration: underline;" result))
-    (when (htmlize-fstruct-overlinep fstruct)
-      (push "text-decoration: overline;" result))
-    (when (htmlize-fstruct-strikep fstruct)
-      (push "text-decoration: line-through;" result))
-    (nreverse result)))
-
-(defun htmlize-css-insert-head (buffer-faces face-map)
-  (insert "    \n"))
-
-(defun htmlize-css-text-markup (fstruct-list buffer)
-  ;; Open the markup needed to insert text colored with FACES into
-  ;; BUFFER.  Return the function that closes the markup.
-
-  ;; In CSS mode, this is easy: just nest the text in one  tag for each face in FSTRUCT-LIST.
-  (dolist (fstruct fstruct-list)
-    (princ "" buffer))
-  (htmlize-lexlet ((fstruct-list fstruct-list) (buffer buffer))
-    (lambda ()
-      (dolist (fstruct fstruct-list)
-        (ignore fstruct)                ; shut up the byte-compiler
-        (princ "" buffer)))))
-
-;; `inline-css' output support.
-
-(defun htmlize-inline-css-body-tag (face-map)
-  (format ""
-	  (mapconcat #'identity (htmlize-css-specs (gethash 'default face-map))
-		     " ")))
-
-(defun htmlize-inline-css-pre-tag (face-map)
-  (if htmlize-pre-style
-      (format "
"
-              (mapconcat #'identity (htmlize-css-specs (gethash 'default face-map))
-                         " "))
-    (format "
")))
-
-(defun htmlize-inline-css-text-markup (fstruct-list buffer)
-  (let* ((merged (htmlize-merge-faces fstruct-list))
-	 (style (htmlize-memoize
-		 merged
-		 (let ((specs (htmlize-css-specs merged)))
-		   (and specs
-			(mapconcat #'identity (htmlize-css-specs merged) " "))))))
-    (when style
-      (princ "" buffer))
-    (htmlize-lexlet ((style style) (buffer buffer))
-      (lambda ()
-        (when style
-          (princ "" buffer))))))
-
-;;; `font' tag based output support.
-
-(defun htmlize-font-body-tag (face-map)
-  (let ((fstruct (gethash 'default face-map)))
-    (format ""
-	    (htmlize-fstruct-foreground fstruct)
-	    (htmlize-fstruct-background fstruct))))
-
-(defun htmlize-font-pre-tag (face-map)
-  (if htmlize-pre-style
-      (let ((fstruct (gethash 'default face-map)))
-        (format "
"
-                (htmlize-fstruct-foreground fstruct)
-                (htmlize-fstruct-background fstruct)))
-    (format "
")))
-       
-(defun htmlize-font-text-markup (fstruct-list buffer)
-  ;; In `font' mode, we use the traditional HTML means of altering
-  ;; presentation:  tag for colors,  for bold,  for
-  ;; underline, and  for strike-through.
-  (let* ((merged (htmlize-merge-faces fstruct-list))
-	 (markup (htmlize-memoize
-		  merged
-		  (cons (concat
-			 (and (htmlize-fstruct-foreground merged)
-			      (format "" (htmlize-fstruct-foreground merged)))
-			 (and (htmlize-fstruct-boldp merged)      "")
-			 (and (htmlize-fstruct-italicp merged)    "")
-			 (and (htmlize-fstruct-underlinep merged) "")
-			 (and (htmlize-fstruct-strikep merged)    ""))
-			(concat
-			 (and (htmlize-fstruct-strikep merged)    "")
-			 (and (htmlize-fstruct-underlinep merged) "")
-			 (and (htmlize-fstruct-italicp merged)    "")
-			 (and (htmlize-fstruct-boldp merged)      "")
-			 (and (htmlize-fstruct-foreground merged) ""))))))
-    (princ (car markup) buffer)
-    (htmlize-lexlet ((markup markup) (buffer buffer))
-      (lambda ()
-        (princ (cdr markup) buffer)))))
-
-(defun htmlize-buffer-1 ()
-  ;; Internal function; don't call it from outside this file.  Htmlize
-  ;; current buffer, writing the resulting HTML to a new buffer, and
-  ;; return it.  Unlike htmlize-buffer, this doesn't change current
-  ;; buffer or use switch-to-buffer.
-  (save-excursion
-    ;; Protect against the hook changing the current buffer.
-    (save-excursion
-      (run-hooks 'htmlize-before-hook))
-    ;; Convince font-lock support modes to fontify the entire buffer
-    ;; in advance.
-    (htmlize-ensure-fontified)
-    (clrhash htmlize-extended-character-cache)
-    (clrhash htmlize-memoization-table)
-    ;; It's important that the new buffer inherits default-directory
-    ;; from the current buffer.
-    (let ((htmlbuf (generate-new-buffer (if (buffer-file-name)
-                                            (htmlize-make-file-name
-                                             (file-name-nondirectory
-                                              (buffer-file-name)))
-                                          "*html*")))
-          (completed nil))
-      (unwind-protect
-          (let* ((buffer-faces (htmlize-faces-in-buffer))
-                 (face-map (htmlize-make-face-map (adjoin 'default buffer-faces)))
-                 (places (gensym))
-                 (title (if (buffer-file-name)
-                            (file-name-nondirectory (buffer-file-name))
-                          (buffer-name))))
-            (when htmlize-generate-hyperlinks
-              (htmlize-create-auto-links))
-            (when htmlize-replace-form-feeds
-              (htmlize-shadow-form-feeds))
-
-            ;; Initialize HTMLBUF and insert the HTML prolog.
-            (with-current-buffer htmlbuf
-              (buffer-disable-undo)
-              (insert (htmlize-method doctype) ?\n
-                      (format "\n"
-                              htmlize-version htmlize-output-type)
-                      "\n  ")
-              (put places 'head-start (point-marker))
-              (insert "\n"
-                      "    " (htmlize-protect-string title) "\n"
-                      (if htmlize-html-charset
-                          (format (concat "    \n")
-                                  htmlize-html-charset)
-                        "")
-                      htmlize-head-tags)
-              (htmlize-method insert-head buffer-faces face-map)
-              (insert "  ")
-              (put places 'head-end (point-marker))
-              (insert "\n  ")
-              (put places 'body-start (point-marker))
-              (insert (htmlize-method body-tag face-map)
-                      "\n    ")
-              (put places 'content-start (point-marker))
-              (insert (htmlize-method pre-tag face-map) "\n"))
-            (let ((text-markup
-                   ;; Get the inserter method, so we can funcall it inside
-                   ;; the loop.  Not calling `htmlize-method' in the loop
-                   ;; body yields a measurable speed increase.
-                   (htmlize-method-function 'text-markup))
-                  ;; Declare variables used in loop body outside the loop
-                  ;; because it's faster to establish `let' bindings only
-                  ;; once.
-                  next-change text face-list trailing-ellipsis
-                  fstruct-list last-fstruct-list
-                  (close-markup (lambda ())))
-              ;; This loop traverses and reads the source buffer, appending
-              ;; the resulting HTML to HTMLBUF.  This method is fast
-              ;; because: 1) it doesn't require examining the text
-              ;; properties char by char (htmlize-next-face-change is used
-              ;; to move between runs with the same face), and 2) it doesn't
-              ;; require frequent buffer switches, which are slow because
-              ;; they rebind all buffer-local vars.
-              (goto-char (point-min))
-              (while (not (eobp))
-                (setq next-change (htmlize-next-face-change (point)))
-                ;; Get faces in use between (point) and NEXT-CHANGE, and
-                ;; convert them to fstructs.
-                (setq face-list (htmlize-faces-at-point)
-                      fstruct-list (delq nil (mapcar (lambda (f)
-                                                       (gethash f face-map))
-                                                     face-list)))
-                (multiple-value-setq (text trailing-ellipsis)
-                  (htmlize-extract-text (point) next-change trailing-ellipsis))
-                ;; Don't bother writing anything if there's no text (this
-                ;; happens in invisible regions).
-                (when (> (length text) 0)
-                  ;; Open the new markup if necessary and insert the text.
-                  (when (not (equalp fstruct-list last-fstruct-list))
-                    (funcall close-markup)
-                    (setq last-fstruct-list fstruct-list
-                          close-markup (funcall text-markup fstruct-list htmlbuf)))
-                  (princ text htmlbuf))
-                (goto-char next-change))
-
-              ;; We've gone through the buffer; close the markup from
-              ;; the last run, if any.
-              (funcall close-markup))
-
-            ;; Insert the epilog and post-process the buffer.
-            (with-current-buffer htmlbuf
-              (insert "
") - (put places 'content-end (point-marker)) - (insert "\n ") - (put places 'body-end (point-marker)) - (insert "\n\n") - (htmlize-defang-local-variables) - (goto-char (point-min)) - (when htmlize-html-major-mode - ;; What sucks about this is that the minor modes, most notably - ;; font-lock-mode, won't be initialized. Oh well. - (funcall htmlize-html-major-mode)) - (set (make-local-variable 'htmlize-buffer-places) - (symbol-plist places)) - (run-hooks 'htmlize-after-hook) - (buffer-enable-undo)) - (setq completed t) - htmlbuf) - - (when (not completed) - (kill-buffer htmlbuf)) - (htmlize-delete-tmp-overlays))))) - -;; Utility functions. - -(defmacro htmlize-with-fontify-message (&rest body) - ;; When forcing fontification of large buffers in - ;; htmlize-ensure-fontified, inform the user that he is waiting for - ;; font-lock, not for htmlize to finish. - `(progn - (if (> (buffer-size) 65536) - (message "Forcing fontification of %s..." - (buffer-name (current-buffer)))) - ,@body - (if (> (buffer-size) 65536) - (message "Forcing fontification of %s...done" - (buffer-name (current-buffer)))))) - -(defun htmlize-ensure-fontified () - ;; If font-lock is being used, ensure that the "support" modes - ;; actually fontify the buffer. If font-lock is not in use, we - ;; don't care because, except in htmlize-file, we don't force - ;; font-lock on the user. - (when font-lock-mode - ;; In part taken from ps-print-ensure-fontified in GNU Emacs 21. - (when (and (boundp 'jit-lock-mode) - (symbol-value 'jit-lock-mode)) - (htmlize-with-fontify-message - (jit-lock-fontify-now (point-min) (point-max)))) - - (if (fboundp 'font-lock-ensure) - (font-lock-ensure) - ;; Emacs prior to 25.1 - (with-no-warnings - (font-lock-mode 1) - (font-lock-fontify-buffer))))) - - -;;;###autoload -(defun htmlize-buffer (&optional buffer) - "Convert BUFFER to HTML, preserving colors and decorations. - -The generated HTML is available in a new buffer, which is returned. -When invoked interactively, the new buffer is selected in the current -window. The title of the generated document will be set to the buffer's -file name or, if that's not available, to the buffer's name. - -Note that htmlize doesn't fontify your buffers, it only uses the -decorations that are already present. If you don't set up font-lock or -something else to fontify your buffers, the resulting HTML will be -plain. Likewise, if you don't like the choice of colors, fix the mode -that created them, or simply alter the faces it uses." - (interactive) - (let ((htmlbuf (with-current-buffer (or buffer (current-buffer)) - (htmlize-buffer-1)))) - (when (interactive-p) - (switch-to-buffer htmlbuf)) - htmlbuf)) - -;;;###autoload -(defun htmlize-region (beg end) - "Convert the region to HTML, preserving colors and decorations. -See `htmlize-buffer' for details." - (interactive "r") - ;; Don't let zmacs region highlighting end up in HTML. - (when (fboundp 'zmacs-deactivate-region) - (zmacs-deactivate-region)) - (let ((htmlbuf (save-restriction - (narrow-to-region beg end) - (htmlize-buffer-1)))) - (when (interactive-p) - (switch-to-buffer htmlbuf)) - htmlbuf)) - -(defun htmlize-region-for-paste (beg end) - "Htmlize the region and return just the HTML as a string. -This forces the `inline-css' style and only returns the HTML body, -but without the BODY tag. This should make it useful for inserting -the text to another HTML buffer." - (let* ((htmlize-output-type 'inline-css) - (htmlbuf (htmlize-region beg end))) - (unwind-protect - (with-current-buffer htmlbuf - (buffer-substring (plist-get htmlize-buffer-places 'content-start) - (plist-get htmlize-buffer-places 'content-end))) - (kill-buffer htmlbuf)))) - -(defun htmlize-region-save-screenshot (beg end) - "Save the htmlized (see `htmlize-region-for-paste') region in -the kill ring. Uses `inline-css', with style information in -`
' tags, so that the rendering of the marked up text
-approximates the buffer as closely as possible."
-  (interactive "r")
-  (let ((htmlize-pre-style t))
-    (kill-new (htmlize-region-for-paste beg end)))
-  (deactivate-mark))
-
-(defun htmlize-make-file-name (file)
-  "Make an HTML file name from FILE.
-
-In its default implementation, this simply appends `.html' to FILE.
-This function is called by htmlize to create the buffer file name, and
-by `htmlize-file' to create the target file name.
-
-More elaborate transformations are conceivable, such as changing FILE's
-extension to `.html' (\"file.c\" -> \"file.html\").  If you want them,
-overload this function to do it and htmlize will comply."
-  (concat file ".html"))
-
-;; Older implementation of htmlize-make-file-name that changes FILE's
-;; extension to ".html".
-;(defun htmlize-make-file-name (file)
-;  (let ((extension (file-name-extension file))
-;	(sans-extension (file-name-sans-extension file)))
-;    (if (or (equal extension "html")
-;	    (equal extension "htm")
-;	    (equal sans-extension ""))
-;	(concat file ".html")
-;      (concat sans-extension ".html"))))
-
-;;;###autoload
-(defun htmlize-file (file &optional target)
-  "Load FILE, fontify it, convert it to HTML, and save the result.
-
-Contents of FILE are inserted into a temporary buffer, whose major mode
-is set with `normal-mode' as appropriate for the file type.  The buffer
-is subsequently fontified with `font-lock' and converted to HTML.  Note
-that, unlike `htmlize-buffer', this function explicitly turns on
-font-lock.  If a form of highlighting other than font-lock is desired,
-please use `htmlize-buffer' directly on buffers so highlighted.
-
-Buffers currently visiting FILE are unaffected by this function.  The
-function does not change current buffer or move the point.
-
-If TARGET is specified and names a directory, the resulting file will be
-saved there instead of to FILE's directory.  If TARGET is specified and
-does not name a directory, it will be used as output file name."
-  (interactive (list (read-file-name
-		      "HTML-ize file: "
-		      nil nil nil (and (buffer-file-name)
-				       (file-name-nondirectory
-					(buffer-file-name))))))
-  (let ((output-file (if (and target (not (file-directory-p target)))
-			 target
-		       (expand-file-name
-			(htmlize-make-file-name (file-name-nondirectory file))
-			(or target (file-name-directory file)))))
-	;; Try to prevent `find-file-noselect' from triggering
-	;; font-lock because we'll fontify explicitly below.
-	(font-lock-mode nil)
-	(font-lock-auto-fontify nil)
-	(global-font-lock-mode nil)
-	;; Ignore the size limit for the purposes of htmlization.
-	(font-lock-maximum-size nil))
-    (with-temp-buffer
-      ;; Insert FILE into the temporary buffer.
-      (insert-file-contents file)
-      ;; Set the file name so normal-mode and htmlize-buffer-1 pick it
-      ;; up.  Restore it afterwards so with-temp-buffer's kill-buffer
-      ;; doesn't complain about killing a modified buffer.
-      (let ((buffer-file-name file))
-	;; Set the major mode for the sake of font-lock.
-	(normal-mode)
-	;; htmlize the buffer and save the HTML.
-	(with-current-buffer (htmlize-buffer-1)
-	  (unwind-protect
-	      (progn
-		(run-hooks 'htmlize-file-hook)
-		(write-region (point-min) (point-max) output-file))
-	    (kill-buffer (current-buffer)))))))
-  ;; I haven't decided on a useful return value yet, so just return
-  ;; nil.
-  nil)
-
-;;;###autoload
-(defun htmlize-many-files (files &optional target-directory)
-  "Convert FILES to HTML and save the corresponding HTML versions.
-
-FILES should be a list of file names to convert.  This function calls
-`htmlize-file' on each file; see that function for details.  When
-invoked interactively, you are prompted for a list of files to convert,
-terminated with RET.
-
-If TARGET-DIRECTORY is specified, the HTML files will be saved to that
-directory.  Normally, each HTML file is saved to the directory of the
-corresponding source file."
-  (interactive
-   (list
-    (let (list file)
-      ;; Use empty string as DEFAULT because setting DEFAULT to nil
-      ;; defaults to the directory name, which is not what we want.
-      (while (not (equal (setq file (read-file-name
-				     "HTML-ize file (RET to finish): "
-				     (and list (file-name-directory
-						(car list)))
-				     "" t))
-			 ""))
-	(push file list))
-      (nreverse list))))
-  ;; Verify that TARGET-DIRECTORY is indeed a directory.  If it's a
-  ;; file, htmlize-file will use it as target, and that doesn't make
-  ;; sense.
-  (and target-directory
-       (not (file-directory-p target-directory))
-       (error "target-directory must name a directory: %s" target-directory))
-  (dolist (file files)
-    (htmlize-file file target-directory)))
-
-;;;###autoload
-(defun htmlize-many-files-dired (arg &optional target-directory)
-  "HTMLize dired-marked files."
-  (interactive "P")
-  (htmlize-many-files (dired-get-marked-files nil arg) target-directory))
-
-(provide 'htmlize)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions unresolved obsolete)
-;; End:
-
-;;; htmlize.el ends here
diff --git a/elpa/htmlize-20191111.2130/htmlize.elc b/elpa/htmlize-20191111.2130/htmlize.elc
deleted file mode 100644
index beafddf395d700b84253a5a6ee8431dd56c82b4d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 60075
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
W$7p&Ym&h_C_(ln1La@ln;{OZ%e}~lo

diff --git a/elpa/ivy-20200319.1247/colir.el b/elpa/ivy-20200319.1247/colir.el
deleted file mode 100644
index 9e61273b..00000000
--- a/elpa/ivy-20200319.1247/colir.el
+++ /dev/null
@@ -1,124 +0,0 @@
-;;; colir.el --- Color blending library -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015-2019  Free Software Foundation, Inc.
-
-;; Author: Oleh Krehel 
-
-;; This file is part of GNU Emacs.
-
-;; This file is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; For a full copy of the GNU General Public License
-;; see .
-
-;;; Commentary:
-
-;; This package solves the problem of adding a face with a background
-;; to text which may already have a background.  In all conflicting
-;; areas, instead of choosing either the original or the new
-;; background face, their blended sum is used.
-;;
-;; The blend mode functions are taken from URL
-;; `https://en.wikipedia.org/wiki/Blend_modes'.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'color)
-
-(defcustom colir-compose-method #'colir-compose-alpha
-  "Select a method to compose two color channels."
-  :group 'ivy
-  :type '(radio
-          (function-item colir-compose-alpha)
-          (function-item colir-compose-overlay)
-          (function-item colir-compose-soft-light)))
-
-(defun colir-compose-soft-light (a b)
-  "Compose A and B channels."
-  (if (< b 0.5)
-      (+ (* 2 a b) (* a a (- 1 b b)))
-    (+ (* 2 a (- 1 b)) (* (sqrt a) (- (* 2 b) 1)))))
-
-(defun colir-compose-overlay (a b)
-  "Compose A and B channels."
-  (if (< a 0.5)
-      (* 2 a b)
-    (- 1 (* 2 (- 1 a) (- 1 b)))))
-
-(defun colir-compose-alpha (a b &optional alpha gamma)
-  "Compose A and B channels.
-Optional argument ALPHA is a number between 0.0 and 1.0 which corresponds
-to the influence of A on the result.  Default value is 0.5.
-Optional argument GAMMA is used for gamma correction.  Default value is 2.2."
-  (setq alpha (or alpha 0.5))
-  (setq gamma (or gamma 2.2))
-  (+ (* (expt a gamma) alpha) (* (expt b gamma) (- 1 alpha))))
-
-(defun colir-blend (c1 c2)
-  "Blend the two colors C1 and C2 using `colir-compose-method'.
-C1 and C2 are triples of floats in [0.0 1.0] range."
-  (apply #'color-rgb-to-hex
-         (cl-mapcar
-          (if (eq (frame-parameter nil 'background-mode) 'dark)
-              ;; this method works nicely for dark themes
-              'colir-compose-soft-light
-            colir-compose-method)
-          c1 c2)))
-
-(defun colir-color-parse (color)
-  "Convert string COLOR to triple of floats in [0.0 1.0]."
-  (if (string-match "#\\([[:xdigit:]]\\{2\\}\\)\\([[:xdigit:]]\\{2\\}\\)\\([[:xdigit:]]\\{2\\}\\)" color)
-      (mapcar (lambda (v) (/ (string-to-number v 16) 255.0))
-              (list (match-string 1 color) (match-string 2 color) (match-string 3 color)))
-    ;; does not work properly in terminal (maps color to nearest color
-    ;; from available color palette).
-    (color-name-to-rgb color)))
-
-(defun colir--blend-background (start next prevn face object)
-  (let ((background-prev (face-background prevn)))
-    (progn
-      (put-text-property
-       start next 'face
-       (if background-prev
-           (cons `(background-color
-                   . ,(colir-blend
-                       (colir-color-parse background-prev)
-                       (colir-color-parse (face-background face nil t))))
-                 prevn)
-         (list face prevn))
-       object))))
-
-(defun colir-blend-face-background (start end face &optional object)
-  "Append to the face property of the text from START to END the face FACE.
-When the text already has a face with a non-plain background,
-blend it with the background of FACE.
-Optional argument OBJECT is the string or buffer containing the text.
-See also `font-lock-append-text-property'."
-  (let (next prev prevn)
-    (while (/= start end)
-      (setq next (next-single-property-change start 'face object end))
-      (setq prev (get-text-property start 'face object))
-      (setq prevn (if (listp prev)
-                      (cl-find-if #'atom prev)
-                    prev))
-      (cond
-        ((or (keywordp (car-safe prev)) (consp (car-safe prev)))
-         (put-text-property start next 'face (cons face prev) object))
-        ((facep prevn)
-         (colir--blend-background start next prevn face object))
-        (t
-         (put-text-property start next 'face face object)))
-      (setq start next))))
-
-(provide 'colir)
-
-;;; colir.el ends here
diff --git a/elpa/ivy-20200319.1247/colir.elc b/elpa/ivy-20200319.1247/colir.elc
deleted file mode 100644
index 820dac68520aaaa7d34e79695a77030f05a6d930..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3433
zcmb_e?{m{e5DiIiQuj;yiRq^hQ&)lo`PvPfc8kRHQObnLze!Ds#0fzSQb>-CM{Oe-hILPZU~ELA(R~J_gSAT!s@35KY;S#uD;cebt^M%`Q&~c&OPUAvRkT^*^L`ajY
zpkP|+Y~q9}NMxa$Q(44v2=p)-7w}?|XQgr`N{_RUqG=j1@chr9Q}fuZoU~gk&XP$!
zmM7$$P~%V~DgfwIt)zjGU7Pe7KO0|wMyiss-JqROkxg@oPiM5FXSt${LWXfh8}qH5
zSgXlSn81JR&eVw&wS`K-SHElTlu
zuk~$xBUF)0Vp-Ci#b{itiLiCOO$1IbQm*>~0CjFG;n7=O#$7b|aitnIFxP7Q)@=Gd
zgJ~>r+gy1$H}9_8G*e$4zOps|+--O1dlKZ3N9Ef>0}7WmnzyJ;TVAJi^1mFb3h4Yy
z*Wi#nkRL6a$hysk;WKwu*>igr&6gEJ=MIB0{mN0#6qT4LA=5Y2*X3bAg%_IU4LGXIixQ6KVt}_^}FM49x@Cu(QfcP7uCRUgI#_}uk
zwBob$0G>rM!7Wnna?L5dH3!Js-nIaF*laIRNDYqEd0Lk=@JzS|0yP08fL<>qhLwan
z?fQisq=-;1@&xja@JA4GU2?Gir(FVWCsfFEq^clc;y_##5GWbknWvkj9)!_dlukZt
z{|8ROuMj0DsBp#COY7IKHxY)bgsl=WndixjH7F~bVl;Gg=8V-l*4K&516fd1$cb`t
zlqk#q0n<34p$y)zxTT>pVT})E@rKv9q_!7IaVg9_uV=&D+d>+okTFfRq|)HY!za&(
zd22%Uk%-M>#l}~~%ANzxLgAXnqT9bHKOhE2=NsnGLikn
zH54pUfULU+jz-Egpk*7!$2;%BcogfMlM~v}c?WzS!(8
z`T(dZQSf>sx?N@zD{|_moORDzjT0;hKbxii;X2rUf-|PzN>-}$v|D+E}v>gt9RPTi!2Ah
zX2cekDQiel(bXo`oVuI@mORXIt~GOo5S?wWij3&eZk`*7uqtcTKi>_hZlnV)Aa}9}
z*$9H!2aos7kg?}5w(Bp(kn(eLnG{NfGa94tO6#`mQ%$p&C)_+<1om#-Iv;B?R=mu`
zC?}BJ<3l~S=&|7QoQfP!_2D#%kl|II$|^T^tzAD<3jH$L($^8%SSQJXHx9G|VOWed
zB+zKSJvATM5avSuKTaLXocHlG6=0sn+-%@t0{#9Y2+%ElVGBS+&Qg`z{f87*2JmnEj>DSg)%?|6e8i)w$
zS%FP3SZPB?@-sYHU8$|VXL5PIos7MDf_qxAvV=Q#w#>McdCTP`f#O#5b+|(tDNBcu
zdY{}7>L>;XaYPbLFuhT;v#bbnx;hW?iuWI+DY)LLs-fsv71)3ar!nN+Hi51BKZ3*T
AmjD0&

diff --git a/elpa/ivy-20200319.1247/dir b/elpa/ivy-20200319.1247/dir
deleted file mode 100644
index b68b0837..00000000
--- a/elpa/ivy-20200319.1247/dir
+++ /dev/null
@@ -1,18 +0,0 @@
-This is the file .../info/dir, which contains the
-topmost node of the Info hierarchy, called (dir)Top.
-The first time you invoke Info you start off looking at this node.
-
-File: dir,	Node: Top	This is the top of the INFO tree
-
-  This (the Directory node) gives a menu of major topics.
-  Typing "q" exits, "H" lists all Info commands, "d" returns here,
-  "h" gives a primer for first-timers,
-  "mEmacs" visits the Emacs manual, etc.
-
-  In Emacs, you can click mouse button 2 on a menu item or cross reference
-  to select it.
-
-* Menu:
-
-Emacs
-* Ivy: (ivy).                   Using Ivy for completion.
diff --git a/elpa/ivy-20200319.1247/elpa.el b/elpa/ivy-20200319.1247/elpa.el
deleted file mode 100644
index e49b8d41..00000000
--- a/elpa/ivy-20200319.1247/elpa.el
+++ /dev/null
@@ -1,6 +0,0 @@
-(setq package-user-dir
-      (expand-file-name
-       (format "~/.elpa/%s/elpa"
-               (concat emacs-version (when (getenv "MELPA_STABLE") "-stable")))))
-(package-initialize)
-(add-to-list 'load-path default-directory)
diff --git a/elpa/ivy-20200319.1247/elpa.elc b/elpa/ivy-20200319.1247/elpa.elc
deleted file mode 100644
index ded2f756462fa10107f8b971a7df869ac54ad225..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 648
zcmbtRO=}x55cRQaPCey15foa8{IT0O4L&)>hky%#Oypi5)xmp|#27_WYo53Qso%3W52Nz)3qRH?`DZ3b;oDQo4^W?Yz^d4fz
zu5~ZSLg!&|Aa5I&VIy5&mnnnY2W*`I8%^fq!Zx1@n=%7hOBVjCOfH7y#k(FhN{ZzlSVlZO$YZdOBNz;@Ch!s8i2Qp>2EybWCE!L1%j&PL
ze8GpJAK;@=6vfx|o=KZ%2~=H;E5Ucc*(X`1g7cHQ9G@Kx>S{8+uGPtBNhVO2ld&YF
zpsGWyq~=_~9rYIKR|`8dzi>-htV!Cs1eP|q^W5iTIHo<&b0>eOdk3{xN3e;hMF#bI
zG$h~Q=t~~;yMiq-g-1|7m#gdf!_DpdaTbY@(8Qt&F~f@6o?y-@GD=BT|B|9fwA
Lhuqx5^jq-~ (=ivy-end-of-buffer=) :: last candidate.
-
-*** Key bindings for single selection
-
-When selecting a candidate, an action is called on it. You can think
-of an action as a function that takes the selected candidate as an
-argument and does something with it.
-
-Ivy can offer several actions from which to choose. This can be
-independently composed with whether you want to end completion when
-the action is called. Depending on this, the short term is either
-"calling an action" or "exiting with action".
-
-~C-m~ or ~RET~ (=ivy-done=) - exit with the current action.
-
-~M-o~ (=ivy-dispatching-done=) - select an action and exit with it.
-
-~C-j~ (=ivy-alt-done=) - when the candidate is a directory, enter
-it. Otherwise, exit with the current action.
-
-~TAB~ (=ivy-partial-or-done=) - attempt partial completion, extending
-the current input as much as possible. ~TAB TAB~ is the same as ~C-j~.
-
-~C-M-j~ (=ivy-immediate-done=) - exit with the current action, calling
-it on the /current input/ instead of the current candidate. This is
-useful especially when creating new files or directories - often the
-input will match an existing file, which you don't want to select.
-
-~C-'~ (=ivy-avy=) - select a candidate from the current page with avy
-and exit with the current action.
-
-** Advanced Operations
-*** Key bindings for multiple selection
-
-For repeatedly applying multiple actions or acting on multiple
-candidates, Ivy does not close the minibuffer between commands. It
-keeps the minibuffer open for applying subsequent actions.
-
-Adding an extra meta key to the normal key chord invokes the special
-version of the regular commands that enables applying multiple
-actions.
-
-~C-M-m~ (=ivy-call=) is the non-exiting version of ~C-m~ (=ivy-done=).
-
-~C-M-n~ (=ivy-next-line-and-call=) combines ~C-n~ and ~C-M-m~.
-
-~C-M-p~ (=ivy-previous-line-and-call=) combines ~C-p~ and ~C-M-m~.
-
-~C-M-o~ (=ivy-dispatching-call=) is a non-exiting version of ~M-o~
-(=ivy-dispatching-done=).
-
-*** Key bindings that alter the minibuffer input
-
-~M-n~ (=ivy-next-history-element=) select the next history element or
-symbol/URL at point.
-
-~M-p~ (=ivy-previous-history-element=) select the previous history
-element.
-
-~C-r~ (=ivy-reverse-i-search=) start a recursive completion session to
-select a history element.
-
-~M-i~ (=ivy-insert-current=) insert the current candidate into the
-minibuffer. Useful for copying and renaming files, for example: ~M-i~
-to insert the original file name string, edit it, and then ~C-m~ to
-complete the renaming.
-
-~M-j~ (=ivy-yank-word=) insert the sub-word at point into the
-minibuffer.
-
-~S-SPC~ (=ivy-restrict-to-matches=) deletes the current input, and
-resets the candidates list to the currently restricted matches. This
-is how Ivy provides narrowing in successive tiers.
-
-*** Other key bindings
-
-~M-w~ (=ivy-kill-ring-save=) copies the selected candidates to the
-kill ring; when the region is active, copies the active region.
-
-*** Saving the current completion session to a buffer
-
-~C-c C-o~ (=ivy-occur=) saves the current candidates to a new buffer;
-the list is active in the new buffer.
-
-~RET~ or ~mouse-1~ in the new buffer calls the appropriate action on
-the selected candidate.
-
-Ivy has no limit on the number of active buffers like these.
-
-Ivy takes care of making these buffer names unique. It applies
-descriptive names, for example: =*ivy-occur counsel-describe-variable
-"function$*=.
-
-*** Global key bindings
-
-=ivy-resume= recalls the state of the completion session just before
-its last exit. Useful after an accidental ~C-m~ (=ivy-done=).
-Recommended global binding: ~C-c C-r~.
-
-*** Hydra in the minibuffer
-
-~C-o~ (=hydra-ivy/body=) invokes Hydra menus with key shortcuts.
-
-When in Hydra, ~C-o~ or ~i~ resumes editing.
-
-Hydra reduces key strokes, for example: ~C-n C-n C-n C-n~ is ~C-o
-jjjj~ in Hydra. Besides certain shorter keys, Hydra shows useful info
-such as case folding and the current action.
-
-Additionally, here are the keys that are otherwise not bound:
-
-- ~<~ and ~>~ adjust the height of the minibuffer.
-- ~c~ (=ivy-toggle-calling=) - toggle calling the current action each
-  time a different candidate is selected.
-- ~M~ (=ivy-rotate-preferred-builders=) - rotate regex matcher.
-- ~w~ and ~s~ scroll the actions list.
-
-Minibuffer editing is disabled when Hydra is active.
diff --git a/elpa/ivy-20200319.1247/ivy-overlay.el b/elpa/ivy-20200319.1247/ivy-overlay.el
deleted file mode 100644
index 9c7ff846..00000000
--- a/elpa/ivy-20200319.1247/ivy-overlay.el
+++ /dev/null
@@ -1,154 +0,0 @@
-;;; ivy-overlay.el --- Overlay display functions for Ivy  -*- lexical-binding: t -*-
-
-;; Copyright (C) 2016-2019  Free Software Foundation, Inc.
-
-;; Author: Oleh Krehel 
-;; Keywords: convenience
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see .
-
-;;; Commentary:
-
-;; This package allows to setup Ivy's completion at point to actually
-;; show the candidates and the input at point, instead of in the
-;; minibuffer.
-
-;;; Code:
-
-(defface ivy-cursor
-  '((((class color) (background light))
-     :background "black" :foreground "white")
-    (((class color) (background dark))
-     :background "white" :foreground "black"))
-  "Cursor face for inline completion."
-  :group 'ivy-faces)
-
-(defvar ivy--old-cursor-type t)
-
-(defvar ivy-overlay-at nil
-  "Overlay variable for `ivy-display-function-overlay'.")
-
-(declare-function ivy--truncate-string "ivy")
-
-(defun ivy-left-pad (str width)
-  "Return STR, but with each line indented by WIDTH spaces.
-Lines are truncated to the window width."
-  (let ((padding (make-string width ?\s)))
-    (mapconcat (lambda (x)
-                 (ivy--truncate-string (concat padding x)
-                                       (1- (+ (window-width)
-                                              (window-hscroll)))))
-               (split-string str "\n")
-               "\n")))
-
-(defun ivy-overlay-cleanup ()
-  "Clean up after `ivy-display-function-overlay'."
-  (when (overlayp ivy-overlay-at)
-    (delete-overlay ivy-overlay-at)
-    (setq ivy-overlay-at nil))
-  (unless cursor-type
-    (setq cursor-type ivy--old-cursor-type))
-  (when (fboundp 'company-abort)
-    (company-abort)))
-
-(defvar ivy-height)
-
-(defun ivy-overlay-show-after (str)
-  "Display STR in an overlay at point.
-
-First, fill each line of STR with spaces to the current column.
-Then attach the overlay to the character before point."
-  (if ivy-overlay-at
-      (progn
-        (move-overlay ivy-overlay-at (1- (point)) (line-end-position))
-        (overlay-put ivy-overlay-at 'invisible nil))
-    (let ((available-height (- (window-height) (count-lines (window-start) (point)) 1)))
-      (unless (>= available-height ivy-height)
-        (recenter (- (window-height) ivy-height 2))))
-    (setq ivy-overlay-at (make-overlay (1- (point)) (line-end-position)))
-    ;; Specify face to avoid clashing with other overlays.
-    (overlay-put ivy-overlay-at 'face 'default)
-    (overlay-put ivy-overlay-at 'priority 9999))
-  (overlay-put ivy-overlay-at 'display str)
-  (overlay-put ivy-overlay-at 'after-string ""))
-
-(declare-function org-current-level "org")
-(declare-function org-at-heading-p "org")
-(defvar org-indent-indentation-per-level)
-(defvar ivy-height)
-(defvar ivy-last)
-(defvar ivy-text)
-(defvar ivy-completion-beg)
-(declare-function ivy-add-face-text-property "ivy")
-(declare-function ivy--get-window "ivy")
-(declare-function ivy-state-current "ivy")
-(declare-function ivy-state-window "ivy")
-(declare-function ivy--remove-prefix "ivy")
-
-(defun ivy-overlay-impossible-p (_str)
-  (or
-   (and (eq major-mode 'org-mode)
-        (plist-get (text-properties-at (point)) 'src-block))
-   (<= (window-height) (+ ivy-height 2))
-   (= (point) (point-min))
-   (< (- (+ (window-width) (window-hscroll)) (current-column))
-      30)))
-
-(defun ivy-display-function-overlay (str)
-  "Called from the minibuffer, display STR in an overlay in Ivy window.
-Hide the minibuffer contents and cursor."
-  (if (save-selected-window
-        (select-window (ivy-state-window ivy-last))
-        (ivy-overlay-impossible-p str))
-      (let ((buffer-undo-list t))
-        (save-excursion
-          (forward-line 1)
-          (insert str)))
-    (ivy-add-face-text-property (minibuffer-prompt-end) (point-max)
-                                '(:foreground "white"))
-    (setq cursor-type nil)
-    (with-selected-window (ivy--get-window ivy-last)
-      (when cursor-type
-        (setq ivy--old-cursor-type cursor-type))
-      (setq cursor-type nil)
-      (let ((overlay-str
-             (apply
-              #'concat
-              (buffer-substring (max (point-min) (1- (point))) (point))
-              ivy-text
-              (and (eolp) " ")
-              (buffer-substring (point) (line-end-position))
-              (and (> (length str) 0)
-                   (list "\n"
-                         (ivy-left-pad
-                          (ivy--remove-prefix "\n" str)
-                          (+
-                           (if (and (eq major-mode 'org-mode)
-                                    (bound-and-true-p org-indent-mode))
-                               (if (org-at-heading-p)
-                                   (1- (org-current-level))
-                                 (* org-indent-indentation-per-level (or (org-current-level) 1)))
-                             0)
-                           (save-excursion
-                             (when ivy-completion-beg
-                               (goto-char ivy-completion-beg))
-                             (current-column)))))))))
-        (let ((cursor-offset (1+ (length ivy-text))))
-          (ivy-add-face-text-property cursor-offset (1+ cursor-offset)
-                                      'ivy-cursor overlay-str t))
-        (ivy-overlay-show-after overlay-str)))))
-
-(provide 'ivy-overlay)
-
-;;; ivy-overlay.el ends here
diff --git a/elpa/ivy-20200319.1247/ivy-overlay.elc b/elpa/ivy-20200319.1247/ivy-overlay.elc
deleted file mode 100644
index eb1d702f193077307eca341ad2d98103d289a433..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3730
zcmbtX|8LvI6?an9b2K#TS`+5iPQ)ZW_FH0l$1w638@
z;&@W3^`GzO-I20gJKKQDAg#Oi?tOoscY5~uSI6(~?d=VoJ$pvS^{UaO%H2X&^!Z9=
zEp3!(bzPB|O=3rRrR|brSyJ6tz0&`Y7UXs^aKzK4ZmED2TDPjDd|Szt&M2?5)*4-1
zwogDcttFY~DyN;6=;=f}y(J^BA)~4-Wp!mGnAf%lj<8b&e?2*V@q)6YG%~X=@rhF}
ztDM@JGFj0=QCZ6yN;+3sQqq)K8L~?-irDK#2!7Lt4fw5}!C)}T)~&5qL9Vh=8Wj{W
zQ}kGGwn4TwZEfiB2p`be7GWuCGp5l(W-l*Iy@vOtzFgYzm_EI>H(Zop7}BRjZB)lM
ze6`e84RQFt2+O5;`D=#<
za#d_3*x_bSmwD%FV7HATJ02W`>L4h!kuy@?#sBZSeS26
z=L|3FRW%u$E)_&u%YDEV-K*#dd#+aT-6r#;%VCjn9?}$+R%_RYa9ui)z_UXdae9S!2gMV}KCg4IVAYG300p8O?
zpI|3Bnsu7e;oIP1JrP(%cwMuAbRll+#BbbKLW7uM$F&+~z4sEC;N?;=G}8*(J;|X;
zpsGA*>Q*yy^|1{appULLy48$yj8?&}gS?;&Wnu%yrM9QERvJqY8I>_k85E6c?LJ`+
zmI1YLU7|XSu8p=^dWsKq5bC>X*M?}qd0%(QystY!I~aR?ZuJU2IqL)NvM#&G>t8s<
zf8fkHB)b53A*~E6v&XzUBV-7=E*L|x4RX+`(m^0R89t8YPiC!c6A!vh?G_qQwC$+Bh1w}
zxt)jC&BQ(zF4D$DnukZ%KKLKM$>YS2j_F5eBY>WJ<_C{DSQO#?N1vo(Chj2t@d#NH
z(FfqfcoJgk`W4-mfrWccAkQM99B=LqRwice;00P7Lg;I)h~3nSuB^EC8IA}p7D%aB
z`PV?^cRPVG6vc_UI61%gIW0<%r$4~9czS`?jDFt#-4}2r{1+2aF%?XM4G9cN(BAQU
z|M%(eEi8PErXpsR1X7cPK|gjo4-u2@D+p5_0U$&(W}VRqmI8e7-ovrmzVuhT^?dV;O#Fbm!HWQ5O^RW)yf{-iiV%WPs_dJG(mOy}awxIey3hscVyy
zY?^Y*9nQD0A^sTFZw>~&5;@0qH$$4vfVGh0GN7R#O}tA^0~xaF7DAXKAQ9WWrXl=
N80Oq>n@-Jm@C(B@fJy)W

diff --git a/elpa/ivy-20200319.1247/ivy-pkg.el b/elpa/ivy-20200319.1247/ivy-pkg.el
deleted file mode 100644
index c57cb9dc..00000000
--- a/elpa/ivy-20200319.1247/ivy-pkg.el
+++ /dev/null
@@ -1,12 +0,0 @@
-(define-package "ivy" "20200319.1247" "Incremental Vertical completYon"
-  '((emacs "24.5"))
-  :keywords
-  '("matching")
-  :authors
-  '(("Oleh Krehel" . "ohwoeowho@gmail.com"))
-  :maintainer
-  '("Oleh Krehel" . "ohwoeowho@gmail.com")
-  :url "https://github.com/abo-abo/swiper")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
diff --git a/elpa/ivy-20200319.1247/ivy.el b/elpa/ivy-20200319.1247/ivy.el
deleted file mode 100644
index e71fd272..00000000
--- a/elpa/ivy-20200319.1247/ivy.el
+++ /dev/null
@@ -1,5334 +0,0 @@
-;;; ivy.el --- Incremental Vertical completYon -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015-2019  Free Software Foundation, Inc.
-
-;; Author: Oleh Krehel 
-;; URL: https://github.com/abo-abo/swiper
-;; Version: 0.13.0
-;; Package-Requires: ((emacs "24.5"))
-;; Keywords: matching
-
-;; This file is part of GNU Emacs.
-
-;; This file is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; For a full copy of the GNU General Public License
-;; see .
-
-;;; Commentary:
-
-;; This package provides `ivy-read' as an alternative to
-;; `completing-read' and similar functions.
-;;
-;; There's no intricate code to determine the best candidate.
-;; Instead, the user can navigate to it with `ivy-next-line' and
-;; `ivy-previous-line'.
-;;
-;; The matching is done by splitting the input text by spaces and
-;; re-building it into a regex.
-;; So "for example" is transformed into "\\(for\\).*\\(example\\)".
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'ivy-overlay)
-(require 'colir)
-(require 'ring)
-
-;;* Customization
-(defgroup ivy nil
-  "Incremental vertical completion."
-  :group 'convenience)
-
-(defgroup ivy-faces nil
-  "Font-lock faces for `ivy'."
-  :group 'ivy
-  :group 'faces)
-
-(defface ivy-current-match
-  '((((class color) (background light))
-     :background "#1a4b77" :foreground "white" :extend t)
-    (((class color) (background dark))
-     :background "#65a7e2" :foreground "black" :extend t))
-  "Face used by Ivy for highlighting the current match.")
-
-(defface ivy-minibuffer-match-highlight
-  '((t :inherit highlight))
-  "Face used by Ivy for highlighting the match under the cursor.")
-
-(defface ivy-minibuffer-match-face-1
-  '((((class color) (background light))
-     :background "#d3d3d3")
-    (((class color) (background dark))
-     :background "#555555"))
-  "The background face for `ivy' minibuffer matches.")
-
-(defface ivy-minibuffer-match-face-2
-  '((((class color) (background light))
-     :background "#e99ce8" :weight bold)
-    (((class color) (background dark))
-     :background "#777777" :weight bold))
-  "Face for `ivy' minibuffer matches numbered 1 modulo 3.")
-
-(defface ivy-minibuffer-match-face-3
-  '((((class color) (background light))
-     :background "#bbbbff" :weight bold)
-    (((class color) (background dark))
-     :background "#7777ff" :weight bold))
-  "Face for `ivy' minibuffer matches numbered 2 modulo 3.")
-
-(defface ivy-minibuffer-match-face-4
-  '((((class color) (background light))
-     :background "#ffbbff" :weight bold)
-    (((class color) (background dark))
-     :background "#8a498a" :weight bold))
-  "Face for `ivy' minibuffer matches numbered 3 modulo 3.")
-
-(defface ivy-confirm-face
-  '((t :foreground "ForestGreen" :inherit minibuffer-prompt))
-  "Face used by Ivy for a confirmation prompt.")
-
-(defface ivy-match-required-face
-  '((t :foreground "red" :inherit minibuffer-prompt))
-  "Face used by Ivy for a match required prompt.")
-
-(defface ivy-subdir
-  '((t :inherit dired-directory))
-  "Face used by Ivy for highlighting subdirs in the alternatives.")
-
-(defface ivy-org
-  '((t :inherit org-level-4))
-  "Face used by Ivy for highlighting Org buffers in the alternatives.")
-
-(defface ivy-modified-buffer
-  '((t :inherit default))
-  "Face used by Ivy for highlighting modified file visiting buffers.")
-
-(defface ivy-modified-outside-buffer
-  '((t :inherit default))
-  "Face used by Ivy for highlighting file visiting buffers modified outside Emacs.")
-
-(defface ivy-remote
-  '((((class color) (background light))
-     :foreground "#110099")
-    (((class color) (background dark))
-     :foreground "#7B6BFF"))
-  "Face used by Ivy for highlighting remotes in the alternatives.")
-
-(defface ivy-virtual
-  '((t :inherit font-lock-builtin-face))
-  "Face used by Ivy for matching virtual buffer names.")
-
-(defface ivy-action
-  '((t :inherit font-lock-builtin-face))
-  "Face used by Ivy for displaying keys in `ivy-read-action'.")
-
-(defface ivy-highlight-face
-  '((t :inherit highlight))
-  "Face used by Ivy to highlight certain candidates.")
-
-(defface ivy-prompt-match
-  '((t :inherit ivy-current-match))
-  "Face used by Ivy for highlighting the selected prompt line.")
-
-(defface ivy-separator
-  '((t :inherit font-lock-doc-face))
-  "Face for multiline source separator.")
-
-(defface ivy-grep-info
-  '((t :inherit compilation-info))
-  "Face for highlighting grep information such as file names.")
-
-(defface ivy-grep-line-number
-  '((t :inherit compilation-line-number))
-  "Face for displaying line numbers in grep messages.")
-
-(defface ivy-completions-annotations
-  '((t :inherit completions-annotations))
-  "Face for displaying completion annotations.")
-
-(defface ivy-yanked-word
-  '((t :inherit highlight))
-  "Face used to highlight yanked word.")
-
-;; Set default customization `:group' to `ivy' for the rest of the file.
-(setcdr (assoc load-file-name custom-current-group-alist) 'ivy)
-
-(defcustom ivy-height 10
-  "Number of lines for the minibuffer window.
-
-See also `ivy-height-alist'."
-  :type 'integer)
-
-(defcustom ivy-count-format "%-4d "
-  "The style to use for displaying the current candidate count for `ivy-read'.
-Set this to \"\" to suppress the count visibility.
-Set this to \"(%d/%d) \" to display both the index and the count."
-  :type '(choice
-          (const :tag "Count disabled" "")
-          (const :tag "Count matches" "%-4d ")
-          (const :tag "Count matches and show current match" "(%d/%d) ")
-          string))
-
-(defcustom ivy-pre-prompt-function nil
-  "When non-nil, add strings before the `ivy-read' prompt."
-  :type '(choice
-          (const :tag "Do nothing" nil)
-          (function :tag "Custom function")))
-
-(defcustom ivy-add-newline-after-prompt nil
-  "When non-nil, add a newline after the `ivy-read' prompt."
-  :type 'boolean)
-
-(defcustom ivy-wrap nil
-  "When non-nil, wrap around after the first and the last candidate."
-  :type 'boolean)
-
-(defcustom ivy-display-style (and (fboundp 'add-face-text-property) 'fancy)
-  "The style for formatting the minibuffer.
-
-By default, the matched strings are copied as is.
-
-The fancy display style highlights matching parts of the regexp,
-a behavior similar to `swiper'.
-
-This setting depends on `add-face-text-property' - a C function
-available since Emacs 24.4.  Fancy style will render poorly in
-earlier versions of Emacs."
-  :type '(choice
-          (const :tag "Plain" nil)
-          (const :tag "Fancy" fancy)))
-
-(defcustom ivy-on-del-error-function #'abort-recursive-edit
-  "Function to call when deletion fails during completion.
-The usual reason for `ivy-backward-delete-char' to fail is when
-there is no text left to delete, i.e., when it is called at the
-beginning of the minibuffer.
-The default setting provides a quick exit from completion."
-  :type '(choice
-          (const :tag "Exit completion" abort-recursive-edit)
-          (const :tag "Do nothing" ignore)
-          (function :tag "Custom function")))
-
-(defcustom ivy-extra-directories '("../" "./")
-  "Add this to the front of the list when completing file names.
-Only \"./\" and \"../\" apply here.  They appear in reverse order."
-  :type '(repeat :tag "Dirs"
-          (choice
-           (const :tag "Parent Directory" "../")
-           (const :tag "Current Directory" "./"))))
-
-(defcustom ivy-use-virtual-buffers nil
-  "When non-nil, add recent files and/or bookmarks to `ivy-switch-buffer'.
-The value `recentf' includes only recent files to the virtual
-buffers list, whereas the value `bookmarks' does the same for
-bookmarks.  Any other non-nil value includes both."
-  :type '(choice
-          (const :tag "Don't use virtual buffers" nil)
-          (const :tag "Recent files" recentf)
-          (const :tag "Bookmarks" bookmarks)
-          (const :tag "All virtual buffers" t)))
-
-(defvar ivy--display-function nil
-  "The display-function is used in current.")
-
-(defvar ivy-display-functions-props
-  '((ivy-display-function-overlay :cleanup ivy-overlay-cleanup))
-  "Map Ivy display functions to their property lists.
-Examples of properties include associated `:cleanup' functions.")
-
-(defcustom ivy-display-functions-alist
-  '((ivy-completion-in-region . ivy-display-function-overlay)
-    (t . nil))
-  "An alist for customizing where to display the candidates.
-
-Each key is a caller symbol. When the value is nil (the default),
-the candidates are shown in the minibuffer. Otherwise, the value
-is a function which takes a string argument comprising the
-current matching candidates and displays it somewhere.
-
-See also `https://github.com/abo-abo/swiper/wiki/ivy-display-function'."
-  :type '(alist
-          :key-type symbol
-          :value-type (choice
-                       (const :tag "Minibuffer" nil)
-                       (const :tag "LV" ivy-display-function-lv)
-                       (const :tag "Popup" ivy-display-function-popup)
-                       (const :tag "Overlay" ivy-display-function-overlay)
-                       (function :tag "Custom function"))))
-
-(defvar ivy-completing-read-dynamic-collection nil
-  "Run `ivy-completing-read' with `:dynamic-collection t`.")
-
-(defcustom ivy-completing-read-handlers-alist
-  '((tmm-menubar . completing-read-default)
-    (tmm-shortcut . completing-read-default)
-    (bbdb-create . ivy-completing-read-with-empty-string-def)
-    (auto-insert . ivy-completing-read-with-empty-string-def)
-    (Info-on-current-buffer . ivy-completing-read-with-empty-string-def)
-    (Info-follow-reference . ivy-completing-read-with-empty-string-def)
-    (Info-menu . ivy-completing-read-with-empty-string-def)
-    (Info-index . ivy-completing-read-with-empty-string-def)
-    (Info-virtual-index . ivy-completing-read-with-empty-string-def)
-    (info-display-manual . ivy-completing-read-with-empty-string-def))
-  "An alist of handlers to replace `completing-read' in `ivy-mode'."
-  :type '(alist :key-type symbol :value-type function))
-
-(defcustom ivy-height-alist nil
-  "An alist to customize `ivy-height'.
-
-It is a list of (CALLER . HEIGHT).  CALLER is a caller of
-`ivy-read' and HEIGHT is the number of lines displayed.
-HEIGHT can also be a function that returns the number of lines."
-  :type '(alist
-          :key-type function
-          :value-type (choice integer function)))
-
-(defvar ivy-completing-read-ignore-handlers-depth -1
-  "Used to avoid infinite recursion.
-
-If `(minibuffer-depth)' equals this, `ivy-completing-read' will
-act as if `ivy-completing-read-handlers-alist' is empty.")
-
-(defvar ivy-highlight-grep-commands nil
-  "List of grep-like commands.")
-
-(defvar ivy--actions-list nil
-  "A list of extra actions per command.")
-
-(defun ivy-set-actions (cmd actions)
-  "Set CMD extra exit points to ACTIONS."
-  (setq ivy--actions-list
-        (plist-put ivy--actions-list cmd actions)))
-
-(defun ivy-add-actions (cmd actions)
-  "Add extra exit points ACTIONS to CMD.
-Existing exit points of CMD are overwritten by those in
-ACTIONS that have the same key."
-  (setq ivy--actions-list
-        (plist-put ivy--actions-list cmd
-                   (cl-delete-duplicates
-                    (append (plist-get ivy--actions-list cmd) actions)
-                    :key #'car :test #'equal))))
-
-(defun ivy--compute-extra-actions (action caller)
-  "Add extra actions to ACTION based on CALLER."
-  (let* ((extra-actions (cl-delete-duplicates
-                         (append (plist-get ivy--actions-list t)
-                                 (plist-get ivy--actions-list this-command)
-                                 (plist-get ivy--actions-list caller))
-                         :key #'car :test #'equal))
-         (override-default (assoc "o" extra-actions)))
-    (cond (override-default
-           (cons 1 (cons override-default (assoc-delete-all "o" extra-actions))))
-          ((not extra-actions)
-           action)
-          ((functionp action)
-           `(1
-             ("o" ,action "default")
-             ,@extra-actions))
-          ((null action)
-           `(1
-             ("o" identity "default")
-             ,@extra-actions))
-          (t
-           (delete-dups (append action extra-actions))))))
-
-(defvar ivy--prompts-list nil)
-
-(defun ivy-set-prompt (caller prompt-fn)
-  "Associate CALLER with PROMPT-FN.
-PROMPT-FN is a function of no arguments that returns a prompt string."
-  (setq ivy--prompts-list
-        (plist-put ivy--prompts-list caller prompt-fn)))
-
-(defvar ivy--display-transformers-list nil
-  "A list of str->str transformers per command.")
-
-(defun ivy-set-display-transformer (cmd transformer)
-  "Set CMD a displayed candidate TRANSFORMER.
-
-It's a lambda that takes a string one of the candidates in the
-collection and returns a string for display, the same candidate
-plus some extra information.
-
-This lambda is called only on the `ivy-height' candidates that
-are about to be displayed, not on the whole collection."
-  (setq ivy--display-transformers-list
-        (plist-put ivy--display-transformers-list cmd transformer)))
-
-(defvar ivy--sources-list nil
-  "A list of extra sources per command.")
-
-(defun ivy-set-sources (cmd sources)
-  "Attach to CMD a list of extra SOURCES.
-
-Each static source is a function that takes no argument and
-returns a list of strings.
-
-The (original-source) determines the position of the original
-dynamic source.
-
-Extra dynamic sources aren't supported yet.
-
-Example:
-
-    (defun small-recentf ()
-      (cl-subseq recentf-list 0 20))
-
-    (ivy-set-sources
-     'counsel-locate
-     '((small-recentf)
-       (original-source)))"
-  (setq ivy--sources-list
-        (plist-put ivy--sources-list cmd sources)))
-
-(defun ivy--compute-extra-candidates (caller)
-  (let ((extra-sources (or (plist-get ivy--sources-list caller)
-                           '((original-source))))
-        (result nil))
-    (dolist (source extra-sources)
-      (cond ((equal source '(original-source))
-             (push source result))
-            ((null (cdr source))
-             (push (list (car source) (funcall (car source))) result))))
-    result))
-
-(defvar ivy-current-prefix-arg nil
-  "Prefix arg to pass to actions.
-This is a global variable that is set by ivy functions for use in
-action functions.")
-
-;;* Keymap
-(require 'delsel)
-(defvar ivy-minibuffer-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "C-m") 'ivy-done)
-    (define-key map [down-mouse-1] 'ignore)
-    (define-key map [mouse-1] 'ivy-mouse-done)
-    (define-key map [mouse-3] 'ivy-mouse-dispatching-done)
-    (define-key map (kbd "C-M-m") 'ivy-call)
-    (define-key map (kbd "C-j") 'ivy-alt-done)
-    (define-key map (kbd "C-M-j") 'ivy-immediate-done)
-    (define-key map (kbd "TAB") 'ivy-partial-or-done)
-    (define-key map [remap next-line] 'ivy-next-line)
-    (define-key map [remap previous-line] 'ivy-previous-line)
-    (define-key map (kbd "C-r") 'ivy-reverse-i-search)
-    (define-key map (kbd "SPC") 'self-insert-command)
-    (define-key map [remap delete-backward-char] 'ivy-backward-delete-char)
-    (define-key map [remap backward-delete-char-untabify] 'ivy-backward-delete-char)
-    (define-key map [remap backward-kill-word] 'ivy-backward-kill-word)
-    (define-key map [remap delete-char] 'ivy-delete-char)
-    (define-key map [remap forward-char] 'ivy-forward-char)
-    (define-key map (kbd "") 'ivy-forward-char)
-    (define-key map [remap kill-word] 'ivy-kill-word)
-    (define-key map [remap beginning-of-buffer] 'ivy-beginning-of-buffer)
-    (define-key map [remap end-of-buffer] 'ivy-end-of-buffer)
-    (define-key map (kbd "M-n") 'ivy-next-history-element)
-    (define-key map (kbd "M-p") 'ivy-previous-history-element)
-    (define-key map (kbd "C-g") 'minibuffer-keyboard-quit)
-    (define-key map [remap scroll-up-command] 'ivy-scroll-up-command)
-    (define-key map [remap scroll-down-command] 'ivy-scroll-down-command)
-    (define-key map (kbd "") 'ivy-scroll-up-command)
-    (define-key map (kbd "") 'ivy-scroll-down-command)
-    (define-key map (kbd "C-v") 'ivy-scroll-up-command)
-    (define-key map (kbd "M-v") 'ivy-scroll-down-command)
-    (define-key map (kbd "C-M-n") 'ivy-next-line-and-call)
-    (define-key map (kbd "C-M-p") 'ivy-previous-line-and-call)
-    (define-key map (kbd "M-a") 'ivy-toggle-marks)
-    (define-key map (kbd "M-r") 'ivy-toggle-regexp-quote)
-    (define-key map (kbd "M-j") 'ivy-yank-word)
-    (define-key map (kbd "M-i") 'ivy-insert-current)
-    (define-key map (kbd "C-M-y") 'ivy-insert-current-full)
-    (define-key map (kbd "C-o") 'hydra-ivy/body)
-    (define-key map (kbd "M-o") 'ivy-dispatching-done)
-    (define-key map (kbd "C-M-o") 'ivy-dispatching-call)
-    (define-key map [remap kill-line] 'ivy-kill-line)
-    (define-key map [remap kill-whole-line] 'ivy-kill-whole-line)
-    (define-key map (kbd "S-SPC") 'ivy-restrict-to-matches)
-    (define-key map [remap kill-ring-save] 'ivy-kill-ring-save)
-    (define-key map (kbd "C-'") 'ivy-avy)
-    (define-key map (kbd "C-M-a") 'ivy-read-action)
-    (define-key map (kbd "C-c C-o") 'ivy-occur)
-    (define-key map (kbd "C-c C-a") 'ivy-toggle-ignore)
-    (define-key map (kbd "C-c C-s") 'ivy-rotate-sort)
-    (define-key map [remap describe-mode] 'ivy-help)
-    (define-key map "$" 'ivy-magic-read-file-env)
-    map)
-  "Keymap used in the minibuffer.")
-(autoload 'hydra-ivy/body "ivy-hydra" "" t)
-(autoload 'ivy-hydra-read-action "ivy-hydra" "" t)
-
-(defvar ivy-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [remap switch-to-buffer]
-      'ivy-switch-buffer)
-    (define-key map [remap switch-to-buffer-other-window]
-      'ivy-switch-buffer-other-window)
-    map)
-  "Keymap for `ivy-mode'.")
-
-;;* Globals
-(cl-defstruct ivy-state
-  prompt collection
-  predicate require-match initial-input
-  history preselect keymap update-fn sort
-  ;; The frame in which `ivy-read' was called
-  frame
-  ;; The window in which `ivy-read' was called
-  window
-  ;; The buffer in which `ivy-read' was called
-  buffer
-  ;; The value of `ivy-text' to be used by `ivy-occur'
-  text
-  action
-  unwind
-  re-builder
-  matcher
-  ;; When this is non-nil, call it for each input change to get new candidates
-  dynamic-collection
-  ;; A lambda that transforms candidates only for display
-  display-transformer-fn
-  directory
-  caller
-  current
-  def
-  ignore
-  multi-action
-  extra-props)
-
-(defvar ivy-last (make-ivy-state)
-  "The last parameters passed to `ivy-read'.
-
-This should eventually become a stack so that you could use
-`ivy-read' recursively.")
-
-(defvar ivy-recursive-last nil)
-
-(defvar ivy-recursive-restore t
-  "When non-nil, restore the above state when exiting the minibuffer.
-This variable is let-bound to nil by functions that take care of
-the restoring themselves.")
-
-(defsubst ivy-set-action (action)
-  "Set the current `ivy-last' field to ACTION."
-  (setf (ivy-state-action ivy-last) action))
-
-(defvar inhibit-message)
-
-(defvar ffap-machine-p-known)
-
-(defun ivy-thing-at-point ()
-  "Return a string that corresponds to the current thing at point."
-  (substring-no-properties
-   (cond
-     ((use-region-p)
-      (let* ((beg (region-beginning))
-             (end (region-end))
-             (eol (save-excursion (goto-char beg) (line-end-position))))
-        (buffer-substring-no-properties beg (min end eol))))
-     ((thing-at-point 'url))
-     ((and (eq (ivy-state-collection ivy-last) #'read-file-name-internal)
-           (let ((inhibit-message t)
-                 (ffap-machine-p-known 'reject))
-             (run-hook-with-args-until-success 'file-name-at-point-functions))))
-     ((let ((s (thing-at-point 'symbol)))
-        (and (stringp s)
-             (if (string-match "\\`[`']?\\(.*?\\)'?\\'" s)
-                 (match-string 1 s)
-               s))))
-     ((looking-at "(+\\(\\(?:\\sw\\|\\s_\\)+\\)\\_>")
-      (match-string-no-properties 1))
-     (t
-      ""))))
-
-(defvar ivy-history nil
-  "History list of candidates entered in the minibuffer.
-
-Maximum length of the history list is determined by the value
-of `history-length'.")
-
-(defvar ivy--directory nil
-  "Current directory when completing file names.")
-
-(defvar ivy--length 0
-  "Store the amount of viable candidates.")
-
-(defvar ivy-text ""
-  "Store the user's string as it is typed in.")
-
-(defvar ivy-regex ""
-  "Store the regex value that corresponds to `ivy-text'.")
-
-(defvar ivy--regex-function 'ivy--regex
-  "Current function for building a regex.")
-
-(defun ivy-set-text (str)
-  "Set `ivy-text' to STR."
-  (setq ivy-text str)
-  (setq ivy-regex (funcall ivy--regex-function ivy-text)))
-
-(defvar ivy--index 0
-  "Store the index of the current candidate.")
-
-(defvar ivy--window-index 0
-  "Store the index of the current candidate in the minibuffer window.
-
-This means it's between 0 and `ivy-height'.")
-
-(defvar ivy-exit nil
-  "Store `done' if the completion was successfully selected.
-Otherwise, store nil.")
-
-(defvar ivy--all-candidates nil
-  "Store the candidates passed to `ivy-read'.")
-
-(defvar ivy--extra-candidates '((original-source))
-  "Store candidates added by the extra sources.
-
-This is an internal-use alist.  Each key is a function name, or
-original-source (which represents where the current dynamic
-candidates should go).
-
-Each value is an evaluation of the function, in case of static
-sources.  These values will subsequently be filtered on `ivy-text'.
-
-This variable is set by `ivy-read' and used by `ivy--set-candidates'.")
-
-(defcustom ivy-use-ignore-default t
-  "The default policy for user-configured candidate filtering."
-  :type '(choice
-          (const :tag "Ignore ignored always" always)
-          (const :tag "Ignore ignored when others exist" t)
-          (const :tag "Don't ignore" nil)))
-
-(defvar ivy-use-ignore t
-  "Store policy for user-configured candidate filtering.
-This may be changed dynamically by `ivy-toggle-ignore'.
-Use `ivy-use-ignore-default' for a permanent configuration.")
-
-(defvar ivy--default nil
-  "Default initial input.")
-
-(defvar ivy--prompt nil
-  "Store the format-style prompt.
-When non-nil, it should contain at least one %d.")
-
-(defvar ivy--prompt-extra ""
-  "Temporary modifications to the prompt.")
-
-(defvar ivy--old-re nil
-  "Store the old regexp.
-Either a string or a list for `ivy-re-match'.")
-
-(defvar ivy--old-cands nil
-  "Store the candidates matched by `ivy--old-re'.")
-
-(defvar ivy--highlight-function 'ivy--highlight-default
-  "Current function for formatting the candidates.")
-
-(defvar ivy--subexps 0
-  "Number of groups in the current `ivy--regex'.")
-
-(defvar ivy--full-length nil
-  "The total amount of candidates when :dynamic-collection is non-nil.")
-
-(defvar ivy--old-text ""
-  "Store old `ivy-text' for dynamic completion.")
-
-(defvar ivy--trying-to-resume-dynamic-collection nil
-  "Non-nil if resuming from a dynamic collection.
-When non-nil, ivy will wait until the first chunk of asynchronous
-candidates has been received before selecting the last
-preselected candidate.")
-
-(defun ivy--set-index-dynamic-collection ()
-  (when ivy--trying-to-resume-dynamic-collection
-    (let ((preselect-index
-           (ivy--preselect-index (ivy-state-preselect ivy-last) ivy--all-candidates)))
-      (when preselect-index
-        (ivy-set-index preselect-index)))
-    (setq ivy--trying-to-resume-dynamic-collection nil)))
-
-(defcustom ivy-case-fold-search-default
-  (if search-upper-case
-      'auto
-    case-fold-search)
-  "The default value for `case-fold-search' in Ivy operations.
-The special value `auto' means case folding is performed so long
-as the entire input string comprises lower-case characters.  This
-corresponds to the default behaviour of most Emacs search
-functionality, e.g. as seen in `isearch'."
-  :link '(info-link "(emacs)Lax Search")
-  :type '(choice
-          (const :tag "Auto" auto)
-          (const :tag "Always" t)
-          (const :tag "Never" nil)))
-
-(defvar ivy-case-fold-search ivy-case-fold-search-default
-  "Store the current overriding `case-fold-search'.")
-
-(defvar ivy-more-chars-alist
-  '((t . 3))
-  "Map commands to their minimum required input length.
-That is the number of characters prompted for before fetching
-candidates.  The special key t is used as a fallback.")
-
-(defun ivy-more-chars ()
-  "Return two fake candidates prompting for at least N input.
-N is obtained from `ivy-more-chars-alist'."
-  (let ((diff (- (ivy-alist-setting ivy-more-chars-alist)
-                 (length ivy-text))))
-    (when (> diff 0)
-      (list "" (format "%d chars more" diff)))))
-
-(defun ivy--case-fold-p (string)
-  "Return nil if STRING should be matched case-sensitively."
-  (if (eq ivy-case-fold-search 'auto)
-      (string= string (downcase string))
-    ivy-case-fold-search))
-
-(defun ivy--case-fold-string= (s1 s2)
-  "Like `string=', but obeys `case-fold-search'."
-  (eq t (compare-strings s1 nil nil s2 nil nil case-fold-search)))
-
-(eval-and-compile
-  (unless (fboundp 'defvar-local)
-    (defmacro defvar-local (var val &optional docstring)
-      "Define VAR as a buffer-local variable with default value VAL."
-      (declare (debug defvar) (doc-string 3))
-      (list 'progn (list 'defvar var val docstring)
-            (list 'make-variable-buffer-local (list 'quote var)))))
-  (unless (fboundp 'setq-local)
-    (defmacro setq-local (var val)
-      "Set variable VAR to value VAL in current buffer."
-      (list 'set (list 'make-local-variable (list 'quote var)) val))))
-
-(defmacro ivy-quit-and-run (&rest body)
-  "Quit the minibuffer and run BODY afterwards."
-  (declare (indent 0))
-  `(progn
-     (put 'quit 'error-message "")
-     (run-at-time nil nil
-                  (lambda ()
-                    (put 'quit 'error-message "Quit")
-                    (with-demoted-errors "Error: %S"
-                      ,@body)))
-     (abort-recursive-edit)))
-
-(defun ivy-exit-with-action (action &optional exit-code)
-  "Quit the minibuffer and call ACTION afterwards."
-  (ivy-set-action
-   `(lambda (x)
-      (funcall ',action x)
-      (ivy-set-action ',(ivy-state-action ivy-last))))
-  (setq ivy-exit (or exit-code 'done))
-  (exit-minibuffer))
-
-(defmacro with-ivy-window (&rest body)
-  "Execute BODY in the window from which `ivy-read' was called."
-  (declare (indent 0)
-           (debug t))
-  `(with-selected-window (ivy--get-window ivy-last)
-     ,@body))
-
-(defun ivy--done (text)
-  "Insert TEXT and exit minibuffer."
-  (if (member (ivy-state-prompt ivy-last) '("Create directory: " "Make directory: "))
-      (ivy-immediate-done)
-    (if (stringp text)
-        (insert
-         (setf (ivy-state-current ivy-last)
-               (if (and ivy--directory
-                        (not (eq (ivy-state-history ivy-last) 'grep-files-history)))
-                   (expand-file-name text ivy--directory)
-                 text))))
-    (setq ivy-exit 'done)
-    (exit-minibuffer)))
-
-(defcustom ivy-use-selectable-prompt nil
-  "When non-nil, make the prompt line selectable like a candidate.
-
-The prompt line can be selected by calling `ivy-previous-line' when the first
-regular candidate is selected.  Both actions `ivy-done' and `ivy-alt-done',
-when called on a selected prompt, are forwarded to `ivy-immediate-done', which
-results to the same as calling `ivy-immediate-done' explicitly when a regular
-candidate is selected.
-
-Note that if `ivy-wrap' is set to t, calling `ivy-previous-line' when the
-prompt is selected wraps around to the last candidate, while calling
-`ivy-next-line' on the last candidate wraps around to the first
-candidate, not the prompt."
-  :type 'boolean)
-
-(defvar ivy--use-selectable-prompt nil
-  "Store the effective `ivy-use-selectable-prompt' for current session.")
-
-(defun ivy--prompt-selectable-p ()
-  "Return t if the prompt line is selectable."
-  (and ivy-use-selectable-prompt
-       (or (memq (ivy-state-require-match ivy-last)
-                 '(nil confirm confirm-after-completion))
-           ;; :require-match is t, but "" is in the collection
-           (let ((coll (ivy-state-collection ivy-last)))
-             (and (listp coll)
-                  (if (consp (car coll))
-                      (member '("") coll)
-                    (member "" coll)))))))
-
-(defun ivy--prompt-selected-p ()
-  "Return t if the prompt line is selected."
-  (and ivy--use-selectable-prompt
-       (= ivy--index -1)))
-
-;;* Commands
-(defun ivy-done ()
-  "Exit the minibuffer with the selected candidate."
-  (interactive)
-  (if (ivy--prompt-selected-p)
-      (ivy-immediate-done)
-    (setq ivy-current-prefix-arg current-prefix-arg)
-    (delete-minibuffer-contents)
-    (cond ((and (= ivy--length 0)
-                (eq this-command 'ivy-dispatching-done))
-           (ivy--done ivy-text))
-          ((or (> ivy--length 0)
-               ;; the action from `ivy-dispatching-done' may not need a
-               ;; candidate at all
-               (eq this-command 'ivy-dispatching-done))
-           (ivy--done (ivy-state-current ivy-last)))
-          ((and (memq (ivy-state-collection ivy-last)
-                      '(read-file-name-internal internal-complete-buffer))
-                (eq confirm-nonexistent-file-or-buffer t)
-                (not (string= " (confirm)" ivy--prompt-extra)))
-           (setq ivy--prompt-extra " (confirm)")
-           (insert ivy-text)
-           (ivy--exhibit))
-          ((memq (ivy-state-require-match ivy-last)
-                 '(nil confirm confirm-after-completion))
-           (ivy--done ivy-text))
-          (t
-           (setq ivy--prompt-extra " (match required)")
-           (insert ivy-text)
-           (ivy--exhibit)))))
-
-(defvar ivy-mouse-1-tooltip
-  "Exit the minibuffer with the selected candidate."
-  "The doc visible in the tooltip for mouse-1 binding in the minibuffer")
-(defvar ivy-mouse-3-tooltip
-  "Display alternative actions."
-  "The doc visible in the tooltip for mouse-3 binding in the minibuffer")
-
-(defun ivy-mouse-offset (event)
-  "Compute the offset between the candidate at point and the selected one."
-  (if event
-      (let* ((line-number-at-point
-              (max 2
-                   (line-number-at-pos (posn-point (event-start event)))))
-
-             (line-number-candidate ;; convert to 0 based index
-              (- line-number-at-point 2))
-             (offset
-              (- line-number-candidate
-                 ivy--window-index)))
-        offset)
-    nil))
-
-(defun ivy-mouse-done (event)
-  (interactive "@e")
-  (let ((offset (ivy-mouse-offset event)))
-    (when offset
-      (ivy-next-line offset)
-      (ivy--exhibit)
-      (ivy-alt-done))))
-
-(defun ivy-mouse-dispatching-done (event)
-  (interactive "@e")
-  (let ((offset (ivy-mouse-offset event)))
-    (when offset
-      (ivy-next-line offset)
-      (ivy--exhibit)
-      (ivy-dispatching-done))))
-
-(defcustom ivy-read-action-format-function 'ivy-read-action-format-default
-  "Function used to transform the actions list into a docstring."
-  :type '(radio
-          (function-item ivy-read-action-format-default)
-          (function-item ivy-read-action-format-columns)))
-
-(defun ivy-read-action-format-default (actions)
-  "Create a docstring from ACTIONS.
-
-ACTIONS is a list.  Each list item is a list of 3 items:
-key (a string), cmd and doc (a string)."
-  (format "%s\n%s\n"
-          (if (eq this-command 'ivy-read-action)
-              "Select action: "
-            (ivy-state-current ivy-last))
-          (mapconcat
-           (lambda (x)
-             (format "%s: %s"
-                     (propertize
-                      (car x)
-                      'face 'ivy-action)
-                     (nth 2 x)))
-           actions
-           "\n")))
-
-(defun ivy-read-action-format-columns (actions)
-  "Create a docstring from ACTIONS, using several columns if needed to preserve `ivy-height'.
-
-ACTIONS is a list.  Each list item is a list of 3 items: key (a
-string), cmd and doc (a string)."
-  (let ((length (length actions))
-        (i 0)
-        (max-rows (- ivy-height 1))
-        rows cols col lwidth rwidth)
-    (while (< i length)
-      (setq col (cl-subseq actions i (min length (cl-incf i max-rows))))
-      (setq lwidth (apply 'max (mapcar (lambda (x)
-                                         (length (nth 0 x)))
-                                       col)))
-      (setq rwidth (apply 'max (mapcar (lambda (x)
-                                         (length (nth 2 x)))
-                                       col)))
-      (setq col (mapcar (lambda (x)
-                          (format (format "%%%ds: %%-%ds" lwidth rwidth)
-                                  (propertize (car x) 'face 'ivy-action)
-                                  (nth 2 x)))
-                        col))
-      (cond
-        ((null rows)
-         (setq rows (length col)))
-        ((< (length col) rows)
-         (setq col (append col (make-list (- rows (length col)) "")))))
-      (push col cols))
-    (format "%s\n%s\n"
-            (if (eq this-command 'ivy-read-action)
-                "Select action: "
-              (ivy-state-current ivy-last))
-            (mapconcat 'identity
-                       (apply 'cl-mapcar
-                              (lambda (&rest args)
-                                (mapconcat 'identity args " | "))
-                              (nreverse cols))
-                       "\n"))))
-
-(defcustom ivy-read-action-function #'ivy-read-action-by-key
-  "Function used to read an action."
-  :type '(radio
-          (function-item ivy-read-action-by-key)
-          (function-item ivy-read-action-ivy)
-          (function-item ivy-hydra-read-action)))
-
-(defun ivy-read-action ()
-  "Change the action to one of the available ones.
-
-Return nil for `minibuffer-keyboard-quit' or wrong key during the
-selection, non-nil otherwise."
-  (interactive)
-  (let ((actions (ivy-state-action ivy-last)))
-    (if (not (ivy--actionp actions))
-        t
-      (let ((ivy--directory ivy--directory))
-        (funcall ivy-read-action-function actions)))))
-
-(defvar set-message-function)
-
-(defun ivy-read-action-by-key (actions)
-  (let* ((set-message-function nil)
-         (hint (funcall ivy-read-action-format-function (cdr actions)))
-         (resize-mini-windows t)
-         (key "")
-         action-idx)
-    (while (and (setq action-idx (cl-position-if
-                                  (lambda (x)
-                                    (string-prefix-p key (car x)))
-                                  (cdr actions)))
-                (not (string= key (car (nth action-idx (cdr actions))))))
-      (setq key (concat key (key-description (string (read-key hint))))))
-    (ivy-shrink-after-dispatching)
-    (cond ((member key '("" ""))
-           nil)
-          ((null action-idx)
-           (message "%s is not bound" key)
-           nil)
-          (t
-           (message "")
-           (setcar actions (1+ action-idx))
-           (ivy-set-action actions)))))
-
-(defvar ivy-marked-candidates nil
-  "List of marked candidates.
-Use `ivy-mark' to populate this.
-
-When this list is non-nil at the end of the session, the action
-will be called for each element of this list.")
-
-(defun ivy-read-action-ivy (actions)
-  "Select an action from ACTIONS using Ivy."
-  (let ((enable-recursive-minibuffers t))
-    (if (and (> (minibuffer-depth) 1)
-             (eq (ivy-state-caller ivy-last) 'ivy-read-action-ivy))
-        (minibuffer-keyboard-quit)
-      (let ((ivy-marked-candidates ivy-marked-candidates))
-        (ivy-read (format "action (%s): " (ivy-state-current ivy-last))
-                  (cl-mapcar
-                   (lambda (a i) (cons (format "[%s] %s" (nth 0 a) (nth 2 a)) i))
-                   (cdr actions) (number-sequence 1 (length (cdr actions))))
-                  :action (lambda (a)
-                            (setcar actions (cdr a))
-                            (ivy-set-action actions))
-                  :caller 'ivy-read-action-ivy)))))
-
-(defun ivy-shrink-after-dispatching ()
-  "Shrink the window after dispatching when action list is too large."
-  (window-resize nil (- ivy-height (window-height))))
-
-(defun ivy-dispatching-done ()
-  "Select one of the available actions and call `ivy-done'."
-  (interactive)
-  (let ((ivy-exit 'ivy-dispatching-done))
-    (when (ivy-read-action)
-      (ivy-done)))
-  (ivy-shrink-after-dispatching))
-
-(defun ivy-dispatching-call ()
-  "Select one of the available actions and call `ivy-call'."
-  (interactive)
-  (setq ivy-current-prefix-arg current-prefix-arg)
-  (let ((actions (copy-sequence (ivy-state-action ivy-last))))
-    (unwind-protect
-         (when (ivy-read-action)
-           (ivy-call))
-      (ivy-set-action actions)))
-  (ivy-shrink-after-dispatching))
-
-(defun ivy-build-tramp-name (x)
-  "Reconstruct X into a path.
-Is is a cons cell, related to `tramp-get-completion-function'."
-  (let ((user (car x))
-        (domain (cadr x)))
-    (if user
-        (concat user "@" domain)
-      domain)))
-
-(declare-function Info-find-node "info")
-(declare-function Info-read-node-name-1 "info")
-(declare-function tramp-get-completion-function "tramp")
-
-(defun ivy-alt-done (&optional arg)
-  "Exit the minibuffer with the selected candidate.
-When ARG is t, exit with current text, ignoring the candidates.
-When the current candidate during file name completion is a
-directory, continue completion from within that directory instead
-of exiting.  This function is otherwise like `ivy-done'."
-  (interactive "P")
-  (setq ivy-current-prefix-arg current-prefix-arg)
-  (cond ((or arg
-             (ivy--prompt-selected-p))
-         (ivy-immediate-done))
-        (ivy--directory
-         (ivy--directory-done))
-        ((eq (ivy-state-collection ivy-last) #'Info-read-node-name-1)
-         (if (member (ivy-state-current ivy-last) '("(./)" "(../)"))
-             (ivy-quit-and-run
-               (ivy-read "Go to file: " #'read-file-name-internal
-                         :action (lambda (x)
-                                   (Info-find-node
-                                    (expand-file-name x ivy--directory)
-                                    "Top"))))
-           (ivy-done)))
-        (t
-         (ivy-done))))
-
-(defvar ivy-auto-select-single-candidate nil
-  "When non-nil, auto-select the candidate if it is the only one.
-When t, it is the same as if the user were prompted and selected the candidate
-by calling the default action.  This variable has no use unless the collection
-contains a single candidate.")
-
-(defun ivy--directory-enter ()
-  (let (dir)
-    (when (and
-           (> ivy--length 0)
-           (not (string= (ivy-state-current ivy-last) "./"))
-           (setq dir (ivy-expand-file-if-directory (ivy-state-current ivy-last))))
-      (ivy--cd dir)
-      (ivy--exhibit))))
-
-(defun ivy--handle-directory (input)
-  "Detect the next directory based on special values of INPUT."
-  (cond ((string= input "/")
-         "/")
-        ((string= input "/sudo::")
-         (concat input ivy--directory))))
-
-(defun ivy--tramp-candidates ()
-  (let ((method (match-string 1 ivy-text))
-        (user (match-string 2 ivy-text))
-        (rest (match-string 3 ivy-text))
-        res)
-    (dolist (x (tramp-get-completion-function method))
-      (setq res (append res (funcall (car x) (cadr x)))))
-    (setq res (delq nil res))
-    (when user
-      (dolist (x res)
-        (setcar x user)))
-    (setq res (delete-dups res))
-    (let* ((old-ivy-last ivy-last)
-           (enable-recursive-minibuffers t)
-           (host (let ((ivy-auto-select-single-candidate nil))
-                   (ivy-read "user@host: "
-                             (mapcar #'ivy-build-tramp-name res)
-                             :initial-input rest))))
-      (setq ivy-last old-ivy-last)
-      (when host
-        (setq ivy--directory "/")
-        (ivy--cd (concat "/" method ":" host ":/"))))))
-
-(defun ivy--directory-done ()
-  "Handle exit from the minibuffer when completing file names."
-  (let ((dir (ivy--handle-directory ivy-text)))
-    (cond
-      ((equal (ivy-state-current ivy-last) (ivy-state-def ivy-last))
-       (ivy-done))
-      ((and (ivy-state-require-match ivy-last)
-            (equal ivy-text "")
-            (null ivy--old-cands))
-       (ivy-immediate-done))
-      (dir
-       (let ((inhibit-message t))
-         (ivy--cd dir)))
-      ((ivy--directory-enter))
-      ((unless (string= ivy-text "")
-         (with-no-warnings
-           (let* ((tramp-completion-mode t)
-                  (file (expand-file-name
-                         (if (> ivy--length 0) (ivy-state-current ivy-last) ivy-text)
-                         ivy--directory)))
-             (when (ignore-errors (file-exists-p file))
-               (if (file-directory-p file)
-                   (ivy--cd (file-name-as-directory file))
-                 (ivy-done))
-               ivy-text)))))
-      ((or (and (equal ivy--directory "/")
-                (string-match-p "\\`[^/]+:.*:.*\\'" ivy-text))
-           (string-match-p "\\`/[^/]+:.*:.*\\'" ivy-text))
-       (ivy-done))
-      ((ivy--tramp-prefix-p)
-       (ivy--tramp-candidates))
-      (t
-       (ivy-done)))))
-
-(defun ivy--tramp-prefix-p ()
-  (or (and (equal ivy--directory "/")
-           (cond ((string-match
-                   "\\`\\([^/]+?\\):\\(?:\\(.*\\)@\\)?\\(.*\\)\\'"
-                   ivy-text)
-                  (save-match-data
-                    (ivy-set-text (ivy-state-current ivy-last))))
-                 ((string-match
-                   "\\`\\([^/]+?\\):\\(?:\\(.*\\)@\\)?\\(.*\\)\\'"
-                   (ivy-state-current ivy-last))
-                  (save-match-data
-                    (ivy-set-text (ivy-state-current ivy-last))))))
-      (string-match
-       "\\`/\\([^/]+?\\):\\(?:\\(.*\\)@\\)?\\(.*\\)\\'"
-       ivy-text)))
-
-(defun ivy-expand-file-if-directory (file-name)
-  "Expand FILE-NAME as directory.
-When this directory doesn't exist, return nil."
-  (when (stringp file-name)
-    (let ((full-name
-           ;; Ignore host name must not match method "ssh"
-           (ignore-errors
-             (file-name-as-directory
-              (expand-file-name file-name ivy--directory)))))
-      (when (and full-name (file-directory-p full-name))
-        full-name))))
-
-(defcustom ivy-tab-space nil
-  "When non-nil, `ivy-partial-or-done' should insert a space."
-  :type 'boolean)
-
-(defun ivy-partial-or-done ()
-  "Complete the minibuffer text as much as possible.
-If the text hasn't changed as a result, forward to `ivy-alt-done'."
-  (interactive)
-  (cond
-    ((and (numberp completion-cycle-threshold)
-          (< (length ivy--all-candidates) completion-cycle-threshold))
-     (let ((ivy-wrap t))
-       (ivy-next-line)))
-    ((and (eq (ivy-state-collection ivy-last) #'read-file-name-internal)
-          (or (and (equal ivy--directory "/")
-                   (string-match-p "\\`[^/]+:.*\\'" ivy-text))
-              (= (string-to-char ivy-text) ?/)))
-     (let ((default-directory ivy--directory)
-           dir)
-       (minibuffer-complete)
-       (ivy-set-text (ivy--input))
-       (when (setq dir (ivy-expand-file-if-directory ivy-text))
-         (ivy--cd dir))))
-    (t
-     (or (ivy-partial)
-         (when (or (eq this-command last-command)
-                   (eq ivy--length 1))
-           (ivy-alt-done))))))
-
-(defun ivy--remove-prefix (prefix string)
-  "Compatibility shim for `string-remove-prefix'."
-  (if (string-prefix-p prefix string)
-      (substring string (length prefix))
-    string))
-
-(defun ivy--partial-cd-for-single-directory ()
-  (when (and
-         (eq (ivy-state-collection ivy-last) #'read-file-name-internal)
-         (= 1 (length
-               (ivy--re-filter ivy-regex ivy--all-candidates)))
-         (let ((default-directory ivy--directory))
-           (file-directory-p (ivy-state-current ivy-last))))
-    (ivy--directory-done)))
-
-(defun ivy-partial ()
-  "Complete the minibuffer text as much as possible."
-  (interactive)
-  (let* ((parts (or (ivy--split-spaces ivy-text) (list "")))
-         (tail (last parts))
-         (postfix (car tail))
-         (case-fold-search (ivy--case-fold-p ivy-text))
-         (completion-ignore-case case-fold-search)
-         (new (try-completion (ivy--remove-prefix "^" postfix)
-                              (if (ivy-state-dynamic-collection ivy-last)
-                                  ivy--all-candidates
-                                (mapcar (lambda (str)
-                                          (let ((i (string-match-p postfix str)))
-                                            (and i (substring str i))))
-                                        ivy--old-cands)))))
-    (cond ((eq new t) nil)
-          ((string= new ivy-text) nil)
-          ((string= (car tail) (car (ivy--split-spaces new))) nil)
-          (new
-           (delete-region (minibuffer-prompt-end) (point-max))
-           (setcar tail
-                   (if (= (string-to-char postfix) ?^)
-                       (concat "^" new)
-                     new))
-           (ivy-set-text
-            (concat
-             (mapconcat #'identity parts " ")
-             (and ivy-tab-space (not (= (length ivy--old-cands) 1)) " ")))
-           (insert ivy-text)
-           (ivy--partial-cd-for-single-directory)
-           t))))
-
-(defvar ivy-completion-beg nil
-  "Completion bounds start.")
-
-(defvar ivy-completion-end nil
-  "Completion bounds end.")
-
-(defun ivy-immediate-done ()
-  "Exit the minibuffer with current input instead of current candidate."
-  (interactive)
-  (delete-minibuffer-contents)
-  (setf (ivy-state-current ivy-last)
-        (cond ((or (not ivy--directory)
-                   (eq (ivy-state-history ivy-last) 'grep-files-history))
-               ivy-text)
-              ((and (string= ivy-text "")
-                    (eq (ivy-state-collection ivy-last)
-                        #'read-file-name-internal))
-               (if (ivy-state-def ivy-last)
-                   (if (and
-                        (file-exists-p (ivy-state-def ivy-last))
-                        (/= (length ivy--directory)
-                            (1+ (length (expand-file-name (ivy-state-def ivy-last))))))
-                       ivy--directory
-                     (copy-sequence (ivy-state-def ivy-last)))
-                 ivy--directory))
-              (t
-               (expand-file-name ivy-text ivy--directory))))
-  (insert (ivy-state-current ivy-last))
-  (setq ivy-completion-beg ivy-completion-end)
-  (setq ivy-exit 'done)
-  (exit-minibuffer))
-
-;;;###autoload
-(defun ivy-resume ()
-  "Resume the last completion session."
-  (interactive)
-  (if (null (ivy-state-action ivy-last))
-      (user-error "The last session isn't compatible with `ivy-resume'")
-    (when (memq (ivy-state-caller ivy-last)
-                '(swiper swiper-isearch swiper-backward swiper-isearch-backward))
-      (switch-to-buffer (ivy-state-buffer ivy-last)))
-    (with-current-buffer (ivy-state-buffer ivy-last)
-      (let ((default-directory (ivy-state-directory ivy-last))
-            (ivy-use-ignore-default (ivy-state-ignore ivy-last)))
-        (ivy-read
-         (ivy-state-prompt ivy-last)
-         (ivy-state-collection ivy-last)
-         :predicate (ivy-state-predicate ivy-last)
-         :require-match (ivy-state-require-match ivy-last)
-         :initial-input ivy-text
-         :history (ivy-state-history ivy-last)
-         :preselect (ivy-state-current ivy-last)
-         :keymap (ivy-state-keymap ivy-last)
-         :update-fn (ivy-state-update-fn ivy-last)
-         :sort (ivy-state-sort ivy-last)
-         :action (ivy-state-action ivy-last)
-         :unwind (ivy-state-unwind ivy-last)
-         :re-builder (ivy-state-re-builder ivy-last)
-         :matcher (ivy-state-matcher ivy-last)
-         :dynamic-collection (ivy-state-dynamic-collection ivy-last)
-         :extra-props (ivy-state-extra-props ivy-last)
-         :caller (ivy-state-caller ivy-last))))))
-
-(defvar-local ivy-calling nil
-  "When non-nil, call the current action when `ivy--index' changes.")
-
-(defun ivy-set-index (index)
-  "Set `ivy--index' to INDEX."
-  (setq ivy--index index)
-  (when ivy-calling
-    (ivy--exhibit)
-    (ivy-call)))
-
-(defun ivy-beginning-of-buffer ()
-  "Select the first completion candidate."
-  (interactive)
-  (ivy-set-index 0))
-
-(defun ivy-end-of-buffer ()
-  "Select the last completion candidate."
-  (interactive)
-  (ivy-set-index (1- ivy--length)))
-
-(defun ivy-scroll-up-command ()
-  "Scroll the candidates upward by the minibuffer height."
-  (interactive)
-  (ivy-set-index (min (1- (+ ivy--index ivy-height))
-                      (1- ivy--length))))
-
-(defun ivy-scroll-down-command ()
-  "Scroll the candidates downward by the minibuffer height."
-  (interactive)
-  (ivy-set-index (max (1+ (- ivy--index ivy-height))
-                      0)))
-
-(defun ivy-minibuffer-grow ()
-  "Grow the minibuffer window by 1 line."
-  (interactive)
-  (setq-local max-mini-window-height
-              (cl-incf ivy-height)))
-
-(defun ivy-minibuffer-shrink ()
-  "Shrink the minibuffer window by 1 line."
-  (interactive)
-  (when (> ivy-height 2)
-    (setq-local max-mini-window-height
-                (cl-decf ivy-height))
-    (window-resize nil -1)))
-
-(defun ivy-next-line (&optional arg)
-  "Move cursor vertically down ARG candidates."
-  (interactive "p")
-  (setq arg (or arg 1))
-  (let ((index (+ ivy--index arg)))
-    (if (> index (1- ivy--length))
-        (if ivy-wrap
-            (ivy-beginning-of-buffer)
-          (ivy-set-index (1- ivy--length)))
-      (ivy-set-index index))))
-
-(defun ivy-next-line-or-history (&optional arg)
-  "Move cursor vertically down ARG candidates.
-If the input is empty, select the previous history element instead."
-  (interactive "p")
-  (let ((orig-index ivy--index))
-    (ivy-next-line arg)
-    (when (and (string= ivy-text "") (eq ivy--index orig-index))
-      (ivy-previous-history-element 1))))
-
-(defun ivy-previous-line (&optional arg)
-  "Move cursor vertically up ARG candidates."
-  (interactive "p")
-  (setq arg (or arg 1))
-  (let ((index (- ivy--index arg))
-        (min-index (if ivy--use-selectable-prompt -1 0)))
-    (if (< index min-index)
-        (if ivy-wrap
-            (ivy-end-of-buffer)
-          (ivy-set-index min-index))
-      (ivy-set-index index))))
-
-(defun ivy-previous-line-or-history (arg)
-  "Move cursor vertically up ARG candidates.
-If the input is empty, select the previous history element instead."
-  (interactive "p")
-  (let ((orig-index ivy--index))
-    (ivy-previous-line arg)
-    (when (and (string= ivy-text "") (eq ivy--index orig-index))
-      (ivy-previous-history-element 1))))
-
-(defun ivy-toggle-calling ()
-  "Flip `ivy-calling'."
-  (interactive)
-  (when (setq ivy-calling (not ivy-calling))
-    (ivy-call)))
-
-(defun ivy-toggle-ignore ()
-  "Toggle user-configured candidate filtering."
-  (interactive)
-  (setq ivy-use-ignore
-        (if ivy-use-ignore
-            nil
-          (or ivy-use-ignore-default t)))
-  (setf (ivy-state-ignore ivy-last) ivy-use-ignore)
-  ;; invalidate cache
-  (setq ivy--old-cands nil))
-
-(defun ivy--get-action (state)
-  "Get the action function from STATE."
-  (let ((action (ivy-state-action state)))
-    (when action
-      (if (functionp action)
-          action
-        (cadr (nth (car action) action))))))
-
-(defun ivy--get-multi-action (state)
-  "Get the multi-action function from STATE."
-  (let* ((action (ivy-state-action state))
-         (multi-action
-          (and (listp action)
-               (not (eq (car action) 'lambda))
-               (nth 3 (nth (car action) action)))))
-    (if multi-action
-        multi-action
-      (ivy-state-multi-action state))))
-
-(defun ivy--get-window (state)
-  "Get the window from STATE."
-  (if (ivy-state-p state)
-      (let ((window (ivy-state-window state)))
-        (if (window-live-p window)
-            window
-          (next-window)))
-    (selected-window)))
-
-(defun ivy--actionp (x)
-  "Return non-nil when X is a list of actions."
-  (and (consp x) (not (memq (car x) '(closure lambda)))))
-
-(defcustom ivy-action-wrap nil
-  "When non-nil, `ivy-next-action' and `ivy-prev-action' wrap."
-  :type 'boolean)
-
-(defun ivy-next-action ()
-  "When the current action is a list, scroll it forwards."
-  (interactive)
-  (let ((action (ivy-state-action ivy-last)))
-    (when (ivy--actionp action)
-      (let ((len (1- (length action)))
-            (idx (car action)))
-        (if (>= idx len)
-            (when ivy-action-wrap
-              (setf (car action) 1))
-          (cl-incf (car action)))))))
-
-(defun ivy-prev-action ()
-  "When the current action is a list, scroll it backwards."
-  (interactive)
-  (let ((action (ivy-state-action ivy-last)))
-    (when (ivy--actionp action)
-      (if (<= (car action) 1)
-          (when ivy-action-wrap
-            (setf (car action) (1- (length action))))
-        (cl-decf (car action))))))
-
-(defun ivy-action-name ()
-  "Return the name associated with the current action."
-  (let ((action (ivy-state-action ivy-last)))
-    (if (ivy--actionp action)
-        (format "[%d/%d] %s"
-                (car action)
-                (1- (length action))
-                (nth 2 (nth (car action) action)))
-      "[1/1] default")))
-
-(defvar ivy-inhibit-action nil
-  "When non-nil, `ivy-call' does nothing.
-
-Example use:
-
-    (let* ((ivy-inhibit-action t)
-           (str (ivy-switch-buffer)))
-     ;; do whatever with str - the corresponding buffer will not be opened
-     )")
-
-(defun ivy-recursive-restore ()
-  "Restore the above state when exiting the minibuffer.
-See variable `ivy-recursive-restore' for further information."
-  (when (and ivy-recursive-last
-             ivy-recursive-restore
-             (not (eq ivy-last ivy-recursive-last)))
-    (ivy--reset-state (setq ivy-last ivy-recursive-last))))
-
-(defvar ivy-mark-prefix ">"
-  "Prefix used by `ivy-mark'.")
-
-(defun ivy-call ()
-  "Call the current action without exiting completion."
-  (interactive)
-  ;; Testing with `ivy-with' seems to call `ivy-call' again,
-  ;; in which case `this-command' is nil; so check for this.
-  (unless (memq this-command '(nil
-                               ivy-done
-                               ivy-alt-done
-                               ivy-dispatching-done))
-    (setq ivy-current-prefix-arg current-prefix-arg))
-  (let* ((action
-          (if (functionp ivy-inhibit-action)
-              ivy-inhibit-action
-            (and (not ivy-inhibit-action)
-                 (ivy--get-action ivy-last))))
-         (collection (ivy-state-collection ivy-last))
-         (current (ivy-state-current ivy-last))
-         (x (cond
-              ;; Alist type.
-              ((and (consp (car-safe collection))
-                    ;; Previously, the cdr of the selected
-                    ;; candidate would be returned.  Now, the
-                    ;; whole candidate is returned.
-                    (let ((idx (get-text-property 0 'idx current)))
-                      (if idx
-                          (progn
-                            (ivy--remove-props current 'idx)
-                            (nth idx collection))
-                        (assoc current collection)))))
-              (ivy--directory
-               (expand-file-name current ivy--directory))
-              ((equal current "")
-               ivy-text)
-              (t
-               current)))
-         (res
-          (cond
-            ((null action)
-             current)
-            ((eq action #'identity)
-             (prog1 x
-               (ivy-recursive-restore)))
-            (t
-             (select-window (ivy--get-window ivy-last))
-             (set-buffer (ivy-state-buffer ivy-last))
-             (prog1 (unwind-protect
-                         (if ivy-marked-candidates
-                             (let* ((prefix-len (length ivy-mark-prefix))
-                                    (marked-candidates
-                                     (mapcar
-                                      (lambda (s)
-                                        (let ((cand (substring s prefix-len)))
-                                          (if ivy--directory
-                                              (expand-file-name cand ivy--directory)
-                                            cand)))
-                                      ivy-marked-candidates))
-                                    (multi-action (ivy--get-multi-action ivy-last)))
-                               (if multi-action
-                                   (funcall multi-action marked-candidates)
-                                 (dolist (c marked-candidates)
-                                   (funcall action c))))
-                           (funcall action x))
-                      (ivy-recursive-restore))
-               (unless (or (eq ivy-exit 'done)
-                           (minibuffer-window-active-p (selected-window))
-                           (null (active-minibuffer-window)))
-                 (select-window (active-minibuffer-window))))))))
-    (if ivy-inhibit-action
-        res
-      current)))
-
-(defun ivy-call-and-recenter ()
-  "Call action and recenter window according to the selected candidate."
-  (interactive)
-  (ivy-call)
-  (with-ivy-window
-    (recenter-top-bottom)))
-
-(defun ivy-next-line-and-call (&optional arg)
-  "Move cursor vertically down ARG candidates.
-Call the permanent action if possible."
-  (interactive "p")
-  (ivy-next-line arg)
-  (ivy--exhibit)
-  (ivy-call))
-
-(defun ivy-previous-line-and-call (&optional arg)
-  "Move cursor vertically up ARG candidates.
-Call the permanent action if possible."
-  (interactive "p")
-  (ivy-previous-line arg)
-  (ivy--exhibit)
-  (ivy-call))
-
-(defun ivy-previous-history-element (arg)
-  "Forward to `previous-history-element' with ARG."
-  (interactive "p")
-  (previous-history-element arg)
-  (ivy--cd-maybe)
-  (move-end-of-line 1)
-  (ivy--maybe-scroll-history))
-
-(defun ivy--insert-symbol-boundaries ()
-  (undo-boundary)
-  (beginning-of-line)
-  (insert "\\_<")
-  (end-of-line)
-  (insert "\\_>"))
-
-(defun ivy-next-history-element (arg)
-  "Forward to `next-history-element' with ARG."
-  (interactive "p")
-  (if (and (= minibuffer-history-position 0)
-           (equal ivy-text ""))
-      (progn
-        (when minibuffer-default
-          (setq ivy--default (car minibuffer-default)))
-        (insert ivy--default)
-        (when (and (with-ivy-window (derived-mode-p 'prog-mode))
-                   (eq (ivy-state-caller ivy-last) 'swiper)
-                   (not (file-exists-p ivy--default))
-                   (not (ivy-ffap-url-p ivy--default))
-                   (not (ivy-state-dynamic-collection ivy-last))
-                   (> (point) (minibuffer-prompt-end)))
-          (ivy--insert-symbol-boundaries)))
-    (next-history-element arg))
-  (ivy--cd-maybe)
-  (move-end-of-line 1)
-  (ivy--maybe-scroll-history))
-
-(defvar ivy-ffap-url-functions nil
-  "List of functions that check if the point is on a URL.")
-
-(defun ivy--cd-maybe ()
-  "Check if the current input points to a different directory.
-If so, move to that directory, while keeping only the file name."
-  (when ivy--directory
-    (let ((input (ivy--input))
-          url)
-      (if (setq url (or (ivy-ffap-url-p input)
-                        (with-ivy-window
-                          (cl-reduce
-                           (lambda (a b)
-                             (or a (funcall b)))
-                           ivy-ffap-url-functions
-                           :initial-value nil))))
-          (ivy-exit-with-action
-           (lambda (_)
-             (ivy-ffap-url-fetcher url))
-           'no-update-history)
-        (setq input (expand-file-name input))
-        (let ((file (file-name-nondirectory input))
-              (dir (expand-file-name (file-name-directory input))))
-          (if (string= dir ivy--directory)
-              (progn
-                (delete-minibuffer-contents)
-                (insert file))
-            (ivy--cd dir)
-            (insert file)))))))
-
-(defun ivy--maybe-scroll-history ()
-  "If the selected history element has an index, scroll there."
-  (let ((idx (ignore-errors
-               (get-text-property
-                (minibuffer-prompt-end)
-                'ivy-index))))
-    (when idx
-      (ivy--exhibit)
-      (ivy-set-index idx))))
-
-(declare-function tramp-get-completion-methods "tramp")
-
-(defun ivy--cd (dir)
-  "When completing file names, move to directory DIR."
-  (if (null ivy--directory)
-      (error "Unexpected")
-    (setq ivy--old-cands nil)
-    (setq ivy--old-re nil)
-    (ivy-set-index 0)
-    (setq ivy--all-candidates
-          (append
-           (ivy--sorted-files (setq ivy--directory dir))
-           (when (and (string= dir "/") (featurep 'tramp))
-             (sort
-              (mapcar
-               (lambda (s) (substring s 1))
-               (tramp-get-completion-methods ""))
-              #'string<))))
-    (ivy-set-text "")
-    (setf (ivy-state-directory ivy-last) dir)
-    (delete-minibuffer-contents)))
-
-(defun ivy--parent-dir (filename)
-  "Return parent directory of absolute FILENAME."
-  (file-name-directory (directory-file-name filename)))
-
-(defun ivy-backward-delete-char ()
-  "Forward to `delete-backward-char'.
-Call `ivy-on-del-error-function' if an error occurs, usually when
-there is no more text to delete at the beginning of the
-minibuffer."
-  (interactive)
-  (if (and ivy--directory (= (minibuffer-prompt-end) (point)))
-      (progn
-        (ivy--cd (ivy--parent-dir (expand-file-name ivy--directory)))
-        (ivy--exhibit))
-    (setq prefix-arg current-prefix-arg)
-    (condition-case nil
-        (call-interactively #'delete-backward-char)
-      (error
-       (when ivy-on-del-error-function
-         (funcall ivy-on-del-error-function))))))
-
-(defun ivy-delete-char (arg)
-  "Forward to `delete-char' ARG."
-  (interactive "p")
-  (unless (eolp)
-    (delete-char arg)))
-
-(defun ivy-forward-char (arg)
-  "Forward to `forward-char' ARG."
-  (interactive "p")
-  (unless (eolp)
-    (forward-char arg)))
-
-(defun ivy-kill-word (arg)
-  "Forward to `kill-word' ARG."
-  (interactive "p")
-  (unless (eolp)
-    (kill-word arg)))
-
-(defun ivy-kill-line ()
-  "Forward to `kill-line'."
-  (interactive)
-  (if (eolp)
-      (kill-region (minibuffer-prompt-end) (point))
-    (kill-line)))
-
-(defun ivy-kill-whole-line ()
-  "Forward to `kill-whole-line'."
-  (interactive)
-  (kill-region (minibuffer-prompt-end) (line-end-position)))
-
-(defun ivy-backward-kill-word ()
-  "Forward to `backward-kill-word'."
-  (interactive)
-  (if (and ivy--directory (= (minibuffer-prompt-end) (point)))
-      (progn
-        (ivy--cd (ivy--parent-dir (expand-file-name ivy--directory)))
-        (ivy--exhibit))
-    (ignore-errors
-      (let ((pt (point))
-            (last-command (if (eq last-command 'ivy-backward-kill-word)
-                              'kill-region
-                            last-command)))
-        (forward-word -1)
-        (kill-region pt (point))))))
-
-(defvar ivy--regexp-quote #'regexp-quote
-  "Store the regexp quoting state.")
-
-(defun ivy-toggle-regexp-quote ()
-  "Toggle the regexp quoting."
-  (interactive)
-  (setq ivy--old-re nil)
-  (cl-rotatef ivy--regex-function ivy--regexp-quote)
-  (setq ivy-regex (funcall ivy--regex-function ivy-text)))
-
-(defvar avy-all-windows)
-(defvar avy-action)
-(defvar avy-keys)
-(defvar avy-keys-alist)
-(defvar avy-style)
-(defvar avy-styles-alist)
-(declare-function avy-process "ext:avy")
-(declare-function avy--style-fn "ext:avy")
-
-(defcustom ivy-format-functions-alist
-  '((t . ivy-format-function-default))
-  "An alist of functions that transform the list of candidates into a string.
-This string is inserted into the minibuffer."
-  :type '(alist
-          :key-type symbol
-          :value-type
-          (choice
-           (const :tag "Default" ivy-format-function-default)
-           (const :tag "Arrow prefix" ivy-format-function-arrow)
-           (const :tag "Full line" ivy-format-function-line)
-           (function :tag "Custom function"))))
-
-(defcustom ivy-avy-style 'pre
-  "The `avy-style' setting for `ivy-avy'."
-  :type '(choice
-          (const :tag "Pre" pre)
-          (const :tag "At" at)
-          (const :tag "At Full" at-full)
-          (const :tag "Post" post)
-          (const :tag "De Bruijn" de-bruijn)
-          (const :tag "Words" words)))
-
-(eval-after-load 'avy
-  '(add-to-list 'avy-styles-alist `(ivy-avy . ,ivy-avy-style)))
-
-(defun ivy--avy-candidates ()
-  (let (candidates)
-    (save-excursion
-      (save-restriction
-        (narrow-to-region
-         (window-start)
-         (window-end))
-        (goto-char (point-min))
-        (forward-line)
-        (while (< (point) (point-max))
-          (push
-           (cons (point)
-                 (selected-window))
-           candidates)
-          (forward-line))))
-    (nreverse candidates)))
-
-(defun ivy--avy-action (pt)
-  (when (number-or-marker-p pt)
-    (let ((bnd (ivy--minibuffer-index-bounds
-                ivy--index ivy--length ivy-height)))
-      (ivy--done
-       (substring-no-properties
-        (nth (+ (car bnd) (- (line-number-at-pos pt) 2)) ivy--old-cands))))))
-
-(defun ivy--avy-handler-function (char)
-  (let (cmd)
-    (cond ((memq char '(27 ?\C-g))
-           ;; exit silently
-           (throw 'done 'abort))
-          ((memq (setq cmd (lookup-key ivy-minibuffer-map (vector char)))
-                 '(ivy-scroll-up-command
-                   ivy-scroll-down-command))
-           (funcall cmd)
-           (ivy--exhibit)
-           (throw 'done 'exit))
-          ;; ignore wrong key
-          (t
-           (throw 'done 'restart)))))
-
-(defvar avy-handler-function)
-
-(defun ivy-avy ()
-  "Jump to one of the current ivy candidates."
-  (interactive)
-  (cond ((not (require 'avy nil 'noerror))
-         (error "Package avy isn't installed"))
-        ((= (minibuffer-depth) 0)
-         (user-error
-          "This command is intended to be called with \"C-'\" from `ivy-read'."))
-        (t
-         (let* ((avy-all-windows nil)
-                (avy-keys (or (cdr (assq 'ivy-avy avy-keys-alist))
-                              avy-keys))
-                (avy-style (or (cdr (assq 'ivy-avy avy-styles-alist))
-                               avy-style))
-                (avy-action #'identity)
-                (avy-handler-function #'ivy--avy-handler-function)
-                res)
-           (while (eq (setq res (avy-process (ivy--avy-candidates))) t))
-           (when res
-             (ivy--avy-action res))))))
-(put 'ivy-avy 'no-counsel-M-x t)
-
-(defun ivy-sort-file-function-default (x y)
-  "Compare two files X and Y.
-Prioritize directories."
-  (if (get-text-property 0 'dirp x)
-      (if (get-text-property 0 'dirp y)
-          (string< (directory-file-name x) (directory-file-name y))
-        t)
-    (if (get-text-property 0 'dirp y)
-        nil
-      (string< x y))))
-
-(defun ivy-string< (x y)
-  "Like `string<', but operate on CARs when given cons cells."
-  (string< (if (consp x) (car x) x)
-           (if (consp y) (car y) y)))
-
-(define-obsolete-function-alias 'ivy-sort-file-function-using-ido
-    'ido-file-extension-lessp "<2019-10-12 Sat>")
-
-(defcustom ivy-sort-functions-alist
-  '((t . ivy-string<))
-  "An alist of sorting functions for each collection function.
-Interactive functions that call completion fit in here as well.
-
-Nil means no sorting, which is useful to turn off the sorting for
-functions that have candidates in the natural buffer order, like
-`org-refile' or `Man-goto-section'.
-
-A list can be used to associate multiple sorting functions with a
-collection.  The car of the list is the current sort
-function.  This list can be rotated with `ivy-rotate-sort'.
-
-The entry associated with t is used for all fall-through cases.
-
-See also `ivy-sort-max-size'."
-  :type
-  '(alist
-    :key-type (choice
-               (const :tag "Fall-through" t)
-               (symbol :tag "Collection"))
-    :value-type (choice
-                 (const :tag "Plain sort" string-lessp)
-                 (const :tag "File sort" ivy-sort-file-function-default)
-                 (const :tag "File sort using Ido" ido-file-extension-lessp)
-                 (const :tag "No sort" nil)
-                 (function :tag "Custom function")
-                 (repeat (function :tag "Custom function")))))
-
-(defun ivy--sort-function (collection)
-  "Retrieve sort function for COLLECTION from `ivy-sort-functions-alist'."
-  (let ((entry (cdr (or (assq collection ivy-sort-functions-alist)
-                        (assq (ivy-state-caller ivy-last) ivy-sort-functions-alist)
-                        (assq t ivy-sort-functions-alist)))))
-    (and (or (functionp entry)
-             (functionp (setq entry (car-safe entry))))
-         entry)))
-
-(defun ivy-rotate-sort ()
-  "Rotate through sorting functions available for current collection.
-This only has an effect if multiple sorting functions are
-specified for the current collection in
-`ivy-sort-functions-alist'."
-  (interactive)
-  (let ((cell (or (assq (ivy-state-collection ivy-last) ivy-sort-functions-alist)
-                  (assq (ivy-state-caller ivy-last) ivy-sort-functions-alist))))
-    (when (consp (cdr cell))
-      (setcdr cell (nconc (cddr cell) (list (cadr cell))))
-      (ivy--reset-state ivy-last))))
-
-(defvar ivy-index-functions-alist
-  '((t . ivy-recompute-index-zero))
-  "An alist of index recomputing functions for each collection function.
-When the input changes, the appropriate function returns an
-integer - the index of the matched candidate that should be
-selected.")
-
-(defvar ivy-re-builders-alist
-  '((t . ivy--regex-plus))
-  "An alist of regex building functions for each collection function.
-
-Each key is (in order of priority):
-1. The actual collection function, e.g. `read-file-name-internal'.
-2. The symbol passed by :caller into `ivy-read'.
-3. `this-command'.
-4. t.
-
-Each value is a function that should take a string and return a
-valid regex or a regex sequence (see below).
-
-Possible choices: `ivy--regex', `regexp-quote',
-`ivy--regex-plus', `ivy--regex-fuzzy', `ivy--regex-ignore-order'.
-
-If a function returns a list, it should format like this:
-'((\"matching-regexp\" . t) (\"non-matching-regexp\") ...).
-
-The matches will be filtered in a sequence, you can mix the
-regexps that should match and that should not match as you
-like.")
-
-(defvar ivy-highlight-functions-alist
-  '((ivy--regex-ignore-order . ivy--highlight-ignore-order)
-    (ivy--regex-fuzzy . ivy--highlight-fuzzy)
-    (ivy--regex-plus . ivy--highlight-default))
-  "An alist of highlighting functions for each regex builder function.")
-
-(defcustom ivy-initial-inputs-alist
-  '((org-refile . "^")
-    (org-agenda-refile . "^")
-    (org-capture-refile . "^")
-    (Man-completion-table . "^")
-    (woman . "^"))
-  "An alist associating commands with their initial input.
-
-Each cdr is either a string or a function called in the context
-of a call to `ivy-read'."
-  :type '(alist
-          :key-type (symbol)
-          :value-type (choice (string) (function))))
-
-(defcustom ivy-hooks-alist nil
-  "An alist associating commands to setup functions.
-Examples: `toggle-input-method', (lambda () (insert \"^\")), etc.
-May supersede `ivy-initial-inputs-alist'."
-  :type '(alist :key-type symbol :value-type function))
-
-(defvar ivy--occurs-list nil
-  "A list of custom occur generators per command.")
-
-(defun ivy-set-occur (cmd occur)
-  "Assign CMD a custom OCCUR function."
-  (setq ivy--occurs-list
-        (plist-put ivy--occurs-list cmd occur)))
-
-(defcustom ivy-update-fns-alist nil
-  "An alist associating commands to their :update-fn values."
-  :type '(alist
-          :key-type symbol
-          :value-type
-          (radio
-           (const :tag "Off" nil)
-           (const :tag "Call action on change" auto))))
-
-(defvar ivy-unwind-fns-alist nil
-  "An alist associating commands to their :unwind values.")
-
-(defvar ivy-init-fns-alist nil
-  "An alist associating commands to their :init values.
-An :init is a function with no arguments.
-`ivy-read' calls it to initialize.")
-
-(defun ivy--alist-set (alist-sym key val)
-  (let ((cell (assoc key (symbol-value alist-sym))))
-    (if cell
-        (setcdr cell val)
-      (set alist-sym (cons (cons key val)
-                           (symbol-value alist-sym))))))
-
-(declare-function counsel-set-async-exit-code "counsel")
-
-(cl-defun ivy-configure (caller
-                         &key
-                         initial-input
-                         height
-                         occur
-                         update-fn
-                         init-fn
-                         unwind-fn
-                         index-fn
-                         sort-fn
-                         format-fn
-                         display-transformer-fn
-                         more-chars
-                         grep-p
-                         exit-codes)
-  "Configure `ivy-read' params for CALLER."
-  (declare (indent 1))
-  (when initial-input
-    (ivy--alist-set 'ivy-initial-inputs-alist caller initial-input))
-  (when height
-    (ivy--alist-set 'ivy-height-alist caller height))
-  (when occur
-    (ivy-set-occur caller occur))
-  (when update-fn
-    (ivy--alist-set 'ivy-update-fns-alist caller update-fn))
-  (when unwind-fn
-    (ivy--alist-set 'ivy-unwind-fns-alist caller unwind-fn))
-  (when init-fn
-    (ivy--alist-set 'ivy-init-fns-alist caller init-fn))
-  (when index-fn
-    (ivy--alist-set 'ivy-index-functions-alist caller index-fn))
-  (when sort-fn
-    (ivy--alist-set 'ivy-sort-functions-alist caller sort-fn))
-  (when format-fn
-    (ivy--alist-set 'ivy-format-functions-alist caller format-fn))
-  (when display-transformer-fn
-    (ivy-set-display-transformer caller display-transformer-fn))
-  (when more-chars
-    (ivy--alist-set 'ivy-more-chars-alist caller more-chars))
-  (when grep-p
-    (cl-pushnew caller ivy-highlight-grep-commands))
-  (when exit-codes
-    (let (code msg)
-      (while (and (setq code (pop exit-codes))
-                  (setq msg (pop exit-codes)))
-        (counsel-set-async-exit-code caller code msg)))))
-
-(defcustom ivy-sort-max-size 30000
-  "Sorting won't be done for collections larger than this."
-  :type 'integer)
-
-(defalias 'ivy--dirname-p
-  (if (fboundp 'directory-name-p)
-      #'directory-name-p
-    (lambda (name)
-      "Return non-nil if NAME ends with a directory separator."
-      (string-match-p "/\\'" name))))
-
-(defun ivy--sorted-files (dir)
-  "Return the list of files in DIR.
-Directories come first."
-  (let* ((default-directory dir)
-         (seq (condition-case nil
-                  (mapcar (lambda (s) (replace-regexp-in-string "\\$\\$" "$" s))
-                          (all-completions "" #'read-file-name-internal
-                                           (ivy-state-predicate ivy-last)))
-                (error
-                 (directory-files dir))))
-         sort-fn)
-    (setq seq (delete "./" (delete "../" seq)))
-    (when (eq (setq sort-fn (ivy--sort-function #'read-file-name-internal))
-              #'ivy-sort-file-function-default)
-      (setq seq (mapcar (lambda (x)
-                          (propertize x 'dirp (ivy--dirname-p x)))
-                        seq)))
-    (when sort-fn
-      (setq seq (sort seq sort-fn)))
-    (dolist (dir ivy-extra-directories)
-      (push dir seq))
-    (if (string= dir "/")
-        (cl-remove-if (lambda (s) (string-match ":$" s)) (delete "../" seq))
-      seq)))
-
-(defun ivy-alist-setting (alist &optional key)
-  "Return the value associated with KEY in ALIST, using `assq'.
-KEY defaults to the last caller of `ivy-read'; if no entry is
-found, it falls back to the key t."
-  (cdr (or (let ((caller (or key (ivy-state-caller ivy-last))))
-             (and caller (assq caller alist)))
-           (assq t alist))))
-
-(defun ivy--height (caller)
-  (let ((v (or (ivy-alist-setting ivy-height-alist caller)
-               ivy-height)))
-    (if (integerp v)
-        v
-      (if (functionp v)
-          (funcall v caller)
-        (error "Unexpected value: %S" v)))))
-
-(defun ivy--remove-props (str &rest props)
-  "Return STR with text PROPS destructively removed."
-  (ignore-errors
-    (remove-list-of-text-properties 0 (length str) props str))
-  str)
-
-(defun ivy--update-prompt (prompt)
-  (cond ((equal prompt "Keyword, C-h: ")
-         ;; auto-insert.el
-         "Keyword (C-M-j to end): ")
-        (t
-         ;; misearch.el
-         (replace-regexp-in-string "RET to end" "C-M-j to end" prompt))))
-
-;;** Entry Point
-;;;###autoload
-(cl-defun ivy-read (prompt collection
-                           &key
-                           predicate require-match initial-input
-                           history preselect def keymap update-fn sort
-                           action multi-action
-                           unwind re-builder matcher
-                           dynamic-collection
-                           extra-props
-                           caller)
-  "Read a string in the minibuffer, with completion.
-
-PROMPT is a string, normally ending in a colon and a space.
-`ivy-count-format' is prepended to PROMPT during completion.
-
-COLLECTION is either a list of strings, a function, an alist, or
-a hash table, supplied for `minibuffer-completion-table'.
-
-PREDICATE is applied to filter out the COLLECTION immediately.
-This argument is for compatibility with `completing-read'.
-
-When REQUIRE-MATCH is non-nil, only members of COLLECTION can be
-selected.
-
-If INITIAL-INPUT is non-nil, then insert that input in the
-minibuffer initially.
-
-HISTORY is a name of a variable to hold the completion session
-history.
-
-KEYMAP is composed with `ivy-minibuffer-map'.
-
-PRESELECT, when non-nil, determines which one of the candidates
-matching INITIAL-INPUT to select initially.  An integer stands
-for the position of the desired candidate in the collection,
-counting from zero.  Otherwise, use the first occurrence of
-PRESELECT in the collection.  Comparison is first done with
-`equal'.  If that fails, and when applicable, match PRESELECT as
-a regular expression.
-
-DEF is for compatibility with `completing-read'.
-
-UPDATE-FN is called each time the candidate list is re-displayed.
-
-When SORT is non-nil, `ivy-sort-functions-alist' determines how
-to sort candidates before displaying them.
-
-ACTION is a function to call after selecting a candidate.
-It takes one argument, the selected candidate. If COLLECTION is
-an alist, the argument is a cons cell, otherwise it's a string.
-
-MULTI-ACTION, when non-nil, is called instead of ACTION when
-there are marked candidates. It takes the list of candidates as
-its only argument. When it's nil, ACTION is called on each marked
-candidate.
-
-UNWIND is a function of no arguments to call before exiting.
-
-RE-BUILDER is a function transforming input text into a regex
-pattern.
-
-MATCHER is a function which can override how candidates are
-filtered based on user input.  It takes a regex pattern and a
-list of candidates, and returns the list of matching candidates.
-
-DYNAMIC-COLLECTION is a boolean specifying whether the list of
-candidates is updated after each input by calling COLLECTION.
-
-EXTRA-PROPS can be used to store collection-specific
-session-specific data.
-
-CALLER is a symbol to uniquely identify the caller to `ivy-read'.
-It is used, along with COLLECTION, to determine which
-customizations apply to the current completion session."
-  (let ((init-fn (ivy-alist-setting ivy-init-fns-alist caller)))
-    (when init-fn
-      (funcall init-fn)))
-  ;; get un-stuck from an existing `read-key' overriding minibuffer keys
-  (when (equal overriding-local-map '(keymap))
-    (keyboard-quit))
-  (setq caller (or caller this-command))
-  (let* ((ivy-recursive-last (and (active-minibuffer-window) ivy-last))
-         (ivy--display-function
-          (when (or ivy-recursive-last
-                    (not (window-minibuffer-p)))
-            (ivy-alist-setting ivy-display-functions-alist caller))))
-    (setq update-fn (or update-fn (ivy-alist-setting ivy-update-fns-alist caller)))
-    (setq unwind (or unwind (ivy-alist-setting ivy-unwind-fns-alist caller)))
-    (setq ivy-last
-          (make-ivy-state
-           :prompt (ivy--update-prompt prompt)
-           :collection collection
-           :predicate predicate
-           :require-match require-match
-           :initial-input initial-input
-           :history history
-           :preselect preselect
-           :keymap keymap
-           :update-fn (if (eq update-fn 'auto)
-                          (lambda ()
-                            (with-ivy-window
-                              (funcall
-                               (ivy--get-action ivy-last)
-                               (if (consp (car-safe (ivy-state-collection ivy-last)))
-                                   (assoc (ivy-state-current ivy-last)
-                                          (ivy-state-collection ivy-last))
-                                 (ivy-state-current ivy-last)))))
-                        update-fn)
-           :sort sort
-           :action (ivy--compute-extra-actions action caller)
-           :multi-action multi-action
-           :frame (selected-frame)
-           :window (selected-window)
-           :buffer (current-buffer)
-           :unwind unwind
-           :re-builder re-builder
-           :matcher matcher
-           :dynamic-collection dynamic-collection
-           :display-transformer-fn (plist-get ivy--display-transformers-list caller)
-           :directory default-directory
-           :extra-props extra-props
-           :caller caller
-           :def def))
-    (ivy--reset-state ivy-last)
-    (unwind-protect
-        (minibuffer-with-setup-hook
-            #'ivy--minibuffer-setup
-          (let* ((hist (or history 'ivy-history))
-                 (minibuffer-completion-table collection)
-                 (minibuffer-completion-predicate predicate)
-                 (ivy-height (ivy--height caller))
-                 (resize-mini-windows (unless (display-graphic-p)
-                                        'grow-only)))
-            (if (and ivy-auto-select-single-candidate
-                     ivy--all-candidates
-                     (null (cdr ivy--all-candidates)))
-                (progn
-                  (setf (ivy-state-current ivy-last)
-                        (car ivy--all-candidates))
-                  (setq ivy-exit 'done))
-              (read-from-minibuffer
-               prompt
-               (ivy-state-initial-input ivy-last)
-               (make-composed-keymap keymap ivy-minibuffer-map)
-               nil
-               hist)
-              (pop (symbol-value hist)))
-            (when (eq ivy-exit 'done)
-              (ivy--update-history hist))))
-      (ivy--cleanup))
-    (ivy-call)))
-
-(defun ivy--update-history (hist)
-  (let ((item (if ivy--directory
-                  (ivy-state-current ivy-last)
-                ivy-text)))
-    (unless (equal item "")
-      (set hist (cons (propertize item 'ivy-index ivy--index)
-                      (delete item (symbol-value hist)))))))
-
-(defun ivy--cleanup ()
-  ;; Fixes a bug in ESS, #1660
-  (put 'post-command-hook 'permanent-local nil)
-  (remove-hook 'post-command-hook #'ivy--queue-exhibit)
-  (remove-hook 'window-size-change-functions #'ivy--window-size-changed)
-  (let ((cleanup (ivy--display-function-prop :cleanup))
-        (unwind (ivy-state-unwind ivy-last)))
-    (when (functionp cleanup)
-      (funcall cleanup))
-    (when unwind
-      (funcall unwind)))
-  (ivy--pulse-cleanup)
-  (unless (eq ivy-exit 'done)
-    (ivy-recursive-restore)))
-
-(defun ivy--display-function-prop (prop)
-  "Return PROP associated with current `ivy--display-function'."
-  (plist-get (cdr (assq ivy--display-function
-                        ivy-display-functions-props))
-             prop))
-
-(defvar Info-complete-menu-buffer)
-
-(defun ivy--reset-state (state)
-  "Reset the ivy to STATE.
-This is useful for recursive `ivy-read'."
-  (setq ivy-marked-candidates nil)
-  (unless (equal (selected-frame) (ivy-state-frame state))
-    (select-window (active-minibuffer-window)))
-  (let* ((prompt (or (ivy-state-prompt state) ""))
-         (collection (ivy-state-collection state))
-         (predicate (ivy-state-predicate state))
-         (history (ivy-state-history state))
-         (preselect (ivy-state-preselect state))
-         (re-builder (ivy-state-re-builder state))
-         (dynamic-collection (ivy-state-dynamic-collection state))
-         (require-match (ivy-state-require-match state))
-         (caller (or (ivy-state-caller state) this-command))
-         (sort (or (ivy-state-sort state) (assoc caller ivy-sort-functions-alist)))
-         (initial-input
-          (or (ivy-state-initial-input state)
-              (let ((init (ivy-alist-setting ivy-initial-inputs-alist caller)))
-                (if (functionp init) (funcall init) init))))
-         (def (ivy-state-def state)))
-    (setq ivy--extra-candidates (ivy--compute-extra-candidates caller))
-    (setq ivy--directory nil)
-    (setq ivy-case-fold-search ivy-case-fold-search-default)
-    (setf (ivy-state-re-builder ivy-last)
-          (setq ivy--regex-function
-                (or re-builder
-                    (and (functionp collection)
-                         (cdr (assq collection ivy-re-builders-alist)))
-                    (ivy-alist-setting ivy-re-builders-alist)
-                    #'ivy--regex)))
-    (setq ivy--subexps 0)
-    (setq ivy--regexp-quote #'regexp-quote)
-    (setq ivy--old-text "")
-    (setq ivy--full-length nil)
-    (ivy-set-text (or initial-input ""))
-    (setq ivy--index 0)
-    (setq ivy-calling nil)
-    (setq ivy-use-ignore ivy-use-ignore-default)
-    (setf (ivy-state-ignore state) ivy-use-ignore)
-    (setq ivy--highlight-function
-          (or (cdr (assq ivy--regex-function ivy-highlight-functions-alist))
-              #'ivy--highlight-default))
-    (let ((ivy-recursive-restore nil)
-          coll sort-fn)
-      (cond ((eq collection #'Info-read-node-name-1)
-             (setq coll
-                   (if (equal (bound-and-true-p Info-current-file) "dir")
-                       (mapcar (lambda (x) (format "(%s)" x))
-                               (delete-dups
-                                (all-completions "(" collection predicate)))
-                     (all-completions "" collection predicate))))
-            ((eq collection #'read-file-name-internal)
-             (require 'tramp)
-             (when (and (equal def initial-input)
-                        (member "./" ivy-extra-directories))
-               (setq def nil))
-             (setq ivy--directory default-directory)
-             (when (and initial-input
-                        (not (equal initial-input "")))
-               (cond ((file-directory-p initial-input)
-                      (when (equal (file-name-nondirectory initial-input) "")
-                        (setf (ivy-state-preselect state) (setq preselect nil))
-                        (setq def nil))
-                      (setq ivy--directory (file-name-as-directory initial-input))
-                      (setq initial-input nil)
-                      (when preselect
-                        (let ((preselect-directory
-                               (file-name-directory preselect)))
-                          (when (and preselect-directory
-                                     (not (equal
-                                           (expand-file-name
-                                            preselect-directory)
-                                           (expand-file-name ivy--directory))))
-                            (setf (ivy-state-preselect state)
-                                  (setq preselect nil))))))
-                     ((ignore-errors
-                        (file-exists-p (file-name-directory initial-input)))
-                      (setq ivy--directory (file-name-directory initial-input))
-                      (setf (ivy-state-preselect state)
-                            (file-name-nondirectory initial-input)))))
-             (require 'dired)
-             (when preselect
-               (let ((preselect-directory (ivy--parent-dir preselect)))
-                 (when (and preselect-directory
-                            (not (string= preselect-directory
-                                          default-directory)))
-                   (setq ivy--directory preselect-directory))
-                 (setq preselect (file-relative-name preselect
-                                                     preselect-directory))
-                 (setf (ivy-state-preselect state) preselect)))
-             (setq sort nil)
-             (setq coll (ivy--sorted-files ivy--directory))
-             (when initial-input
-               (unless (or require-match
-                           (equal initial-input default-directory)
-                           (equal initial-input ""))
-                 (setq coll (cons initial-input coll)))
-               (when (or (not (ivy-state-action ivy-last))
-                         (equal (ivy--get-action ivy-last) 'identity))
-                 (setq initial-input nil))))
-            ((eq collection #'internal-complete-buffer)
-             (setq coll (ivy--buffer-list
-                         ""
-                         (and ivy-use-virtual-buffers
-                              (member caller '(ivy-switch-buffer
-                                               ivy-switch-buffer-other-window
-                                               counsel-switch-buffer)))
-                         predicate)))
-            (dynamic-collection
-             (setq coll (if (eq this-command 'ivy-resume)
-                            ivy--all-candidates
-                          (ivy--dynamic-collection-cands (or initial-input "")))))
-            ((consp (car-safe collection))
-             (setq collection (cl-remove-if-not predicate collection))
-             (when (and sort (setq sort-fn (ivy--sort-function caller)))
-               (setq collection (sort (copy-sequence collection) sort-fn))
-               (setq sort nil))
-             (setf (ivy-state-collection ivy-last) collection)
-             (setq coll (let ((i -1))
-                          (mapcar (lambda (x)
-                                    (propertize x 'idx (cl-incf i)))
-                                  (all-completions "" collection)))))
-            ((or (functionp collection)
-                 (byte-code-function-p collection)
-                 (vectorp collection)
-                 (hash-table-p collection)
-                 (and (listp collection) (symbolp (car collection))))
-             (let ((Info-complete-menu-buffer
-                    ;; FIXME: This is a temporary workaround for issue #1803.
-                    (or (bound-and-true-p Info-complete-menu-buffer)
-                        (ivy-state-buffer state))))
-               (setq coll (all-completions "" collection predicate))))
-            (t
-             (setq coll (all-completions "" collection predicate))))
-      (unless (ivy-state-dynamic-collection ivy-last)
-        (setq coll (delete "" coll)))
-      (when (and sort
-                 (or (functionp collection)
-                     (not (eq history 'org-refile-history)))
-                 (setq sort-fn (ivy--sort-function
-                                (if (functionp collection) collection caller)))
-                 (listp coll)
-                 (null (nthcdr ivy-sort-max-size coll)))
-        (setq coll (sort (copy-sequence coll) sort-fn)))
-      (when def
-        (cond ((stringp (car-safe def))
-               (setq coll
-                     (delete-dups
-                      (append def coll))))
-              ((and (stringp def) (not (member def coll)))
-               (push def coll))))
-      (setq coll (ivy--set-candidates coll))
-      (setq ivy--old-re nil)
-      (setq ivy--old-cands nil)
-      (when initial-input
-        ;; Needed for anchor to work
-        (setq ivy--old-cands coll)
-        (setq ivy--old-cands (ivy--filter initial-input coll)))
-      (unless (setq ivy--trying-to-resume-dynamic-collection
-                    (and preselect dynamic-collection))
-        (when (integerp preselect)
-          (setq ivy--old-re "")
-          (ivy-set-index preselect)))
-      (setq ivy--all-candidates coll)
-      (unless (integerp preselect)
-        (ivy-set-index (or
-                        (and dynamic-collection
-                             ivy--index)
-                        (and preselect
-                             (ivy--preselect-index
-                              preselect
-                              (if initial-input
-                                  ivy--old-cands
-                                coll)))
-                        0))))
-    (setq ivy-exit nil)
-    (setq ivy--default
-          (if (region-active-p)
-              (buffer-substring (region-beginning) (region-end))
-            (ivy-thing-at-point)))
-    (setq ivy--prompt (ivy-add-prompt-count (ivy--quote-format-string prompt)))
-    (setq ivy--use-selectable-prompt (ivy--prompt-selectable-p))
-    (setf (ivy-state-initial-input ivy-last) initial-input)))
-
-(defun ivy-add-prompt-count (prompt)
-  "Add count information to PROMPT."
-  (cond ((null ivy-count-format)
-         (error
-          "`ivy-count-format' can't be nil.  Set it to \"\" instead"))
-        ((string-match "%d.*\\(%d\\)" ivy-count-format)
-         (let* ((w
-                  (if (listp ivy--all-candidates)
-                      (1+ (floor (log (max 1 (length ivy--all-candidates)) 10)))
-                      1))
-                (s (replace-match (format "%%-%dd" w) t t ivy-count-format 1)))
-           (string-match "%d" s)
-           (concat (replace-match (format "%%%dd" w) t t s)
-                   prompt)))
-        ((string-match-p "%.*d" ivy-count-format)
-         (concat ivy-count-format prompt))
-        (ivy--directory
-         prompt)
-        (t
-         prompt)))
-
-(defun ivy--quote-format-string (str)
-  "Make STR suitable for `format' with no extra arguments."
-  (replace-regexp-in-string "%" "%%" str t t))
-
-;;;###autoload
-(defun ivy-completing-read (prompt collection
-                            &optional predicate require-match initial-input
-                              history def inherit-input-method)
-  "Read a string in the minibuffer, with completion.
-
-This interface conforms to `completing-read' and can be used for
-`completing-read-function'.
-
-PROMPT is a string that normally ends in a colon and a space.
-COLLECTION is either a list of strings, an alist, an obarray, or a hash table.
-PREDICATE limits completion to a subset of COLLECTION.
-REQUIRE-MATCH is a boolean value or a symbol.  See `completing-read'.
-INITIAL-INPUT is a string inserted into the minibuffer initially.
-HISTORY is a list of previously selected inputs.
-DEF is the default value.
-INHERIT-INPUT-METHOD is currently ignored."
-  (let ((handler
-         (and (< ivy-completing-read-ignore-handlers-depth (minibuffer-depth))
-              (assq this-command ivy-completing-read-handlers-alist))))
-    (if handler
-        (let ((completion-in-region-function #'completion--in-region)
-              (ivy-completing-read-ignore-handlers-depth (1+ (minibuffer-depth))))
-          (funcall (cdr handler)
-                   prompt collection
-                   predicate require-match
-                   initial-input history
-                   def inherit-input-method))
-      ;; See the doc of `completing-read'.
-      (when (consp history)
-        (when (numberp (cdr history))
-          (setq initial-input (nth (1- (cdr history))
-                                   (symbol-value (car history)))))
-        (setq history (car history)))
-      (when (consp def)
-        (setq def (car def)))
-      (let ((str (ivy-read
-                  prompt collection
-                  :predicate predicate
-                  :require-match (when (and collection require-match)
-                                   require-match)
-                  :initial-input (cond ((consp initial-input)
-                                        (car initial-input))
-                                       ((and (stringp initial-input)
-                                             (not (eq collection #'read-file-name-internal))
-                                             (string-match-p "\\+" initial-input))
-                                        (replace-regexp-in-string
-                                         "\\+" "\\\\+" initial-input))
-                                       (t
-                                        initial-input))
-                  :preselect def
-                  :def def
-                  :history history
-                  :keymap nil
-                  :dynamic-collection ivy-completing-read-dynamic-collection
-                  :caller (if (and collection (symbolp collection))
-                              collection
-                            this-command))))
-        (if (string= str "")
-            ;; For `completing-read' compat, return the first element of
-            ;; DEFAULT, if it is a list; "", if DEFAULT is nil; or DEFAULT.
-            (or def "")
-          str)))))
-
-(defun ivy-completing-read-with-empty-string-def
-    (prompt collection
-     &optional predicate require-match initial-input
-       history def inherit-input-method)
-  "Same as `ivy-completing-read' but with different handling of DEF.
-
-Specifically, if DEF is nil, it is treated the same as if DEF was
-the empty string. This mimics the behavior of
-`completing-read-default'. This function can therefore be used in
-place of `ivy-completing-read' for commands that rely on this
-behavior."
-  (ivy-completing-read
-   prompt collection predicate require-match initial-input
-   history (or def "") inherit-input-method))
-
-(declare-function mc/all-fake-cursors "ext:multiple-cursors-core")
-
-(defun ivy-completion-in-region-action (str)
-  "Insert STR, erasing the previous one.
-The previous string is between `ivy-completion-beg' and `ivy-completion-end'."
-  (when (consp str)
-    (setq str (cdr str)))
-  (when (stringp str)
-    (let ((fake-cursors (and (require 'multiple-cursors-core nil t)
-                             (mc/all-fake-cursors)))
-          (pt (point))
-          (beg ivy-completion-beg)
-          (end ivy-completion-end))
-      (when beg
-        (delete-region beg end))
-      (setq ivy-completion-beg (point))
-      (insert (substring-no-properties str))
-      (completion--done str 'exact)
-      (setq ivy-completion-end (point))
-      (save-excursion
-        (dolist (cursor fake-cursors)
-          (goto-char (overlay-start cursor))
-          (delete-region (+ (point) (- beg pt))
-                         (+ (point) (- end pt)))
-          (insert (substring-no-properties str))
-          ;; manually move the fake cursor
-          (move-overlay cursor (point) (1+ (point)))
-          (set-marker (overlay-get cursor 'point) (point))
-          (set-marker (overlay-get cursor 'mark) (point)))))))
-
-(defun ivy-completion-common-length (str)
-  "Return the amount of characters that match in  STR.
-
-`completion-all-completions' computes this and returns the result
-via text properties.
-
-The first non-matching part is propertized:
-- either with: (face (completions-first-difference))
-- or: (font-lock-face completions-first-difference)."
-  (let ((char-property-alias-alist '((face font-lock-face)))
-        (i (1- (length str))))
-    (catch 'done
-      (while (>= i 0)
-        (when (equal (get-text-property i 'face str)
-                     '(completions-first-difference))
-          (throw 'done i))
-        (cl-decf i))
-      (throw 'done (length str)))))
-
-(defun ivy-completion-in-region (start end collection &optional predicate)
-  "An Ivy function suitable for `completion-in-region-function'.
-The function completes the text between START and END using COLLECTION.
-PREDICATE (a function called with no arguments) says when to exit.
-See `completion-in-region' for further information."
-  (let* ((enable-recursive-minibuffers t)
-         (str (buffer-substring-no-properties start end))
-         (completion-ignore-case (ivy--case-fold-p str))
-         (comps
-          (completion-all-completions str collection predicate (- end start))))
-    (cond ((null comps)
-           (message "No matches"))
-          ((progn
-             (nconc comps nil)
-             (and (null (cdr comps))
-                  (string= str (car comps))))
-           (message "Sole match"))
-          (t
-           (when (eq collection 'crm--collection-fn)
-             (setq comps (delete-dups comps)))
-           (let* ((len (ivy-completion-common-length (car comps)))
-                  (initial (cond ((= len 0)
-                                  "")
-                                 ((let ((str-len (length str)))
-                                    (when (> len str-len)
-                                      (setq len str-len)
-                                      str)))
-                                 (t
-                                  (substring str (- len))))))
-             (setq ivy--old-re nil)
-             (unless (ivy--filter initial comps)
-               (setq initial nil))
-             (delete-region (- end len) end)
-             (setq ivy-completion-beg (- end len))
-             (setq ivy-completion-end ivy-completion-beg)
-             (if (null (cdr comps))
-                 (progn
-                   (unless (minibuffer-window-active-p (selected-window))
-                     (setf (ivy-state-window ivy-last) (selected-window)))
-                   (ivy-completion-in-region-action
-                    (substring-no-properties (car comps))))
-               (dolist (s comps)
-                 ;; Remove face `completions-first-difference'.
-                 (ivy--remove-props s 'face))
-               (ivy-read (format "(%s): " str) comps
-                         ;; Predicate was already applied by
-                         ;; `completion-all-completions'.
-                         :predicate nil
-                         :initial-input initial
-                         :action #'ivy-completion-in-region-action
-                         :unwind (lambda ()
-                                   (unless (eq ivy-exit 'done)
-                                     (goto-char ivy-completion-beg)
-                                     (when initial
-                                       (insert initial))))
-                         :caller 'ivy-completion-in-region)
-               t))))))
-
-(defun ivy-completion-in-region-prompt ()
-  "Prompt function for `ivy-completion-in-region'.
-See `ivy-set-prompt'."
-  (and (window-minibuffer-p (ivy-state-window ivy-last))
-       (ivy-add-prompt-count (ivy-state-prompt ivy-last))))
-
-(ivy-set-prompt #'ivy-completion-in-region #'ivy-completion-in-region-prompt)
-
-(defcustom ivy-do-completion-in-region t
-  "When non-nil `ivy-mode' will set `completion-in-region-function'."
-  :type 'boolean)
-
-;;;###autoload
-(define-minor-mode ivy-mode
-  "Toggle Ivy mode on or off.
-Turn Ivy mode on if ARG is positive, off otherwise.
-Turning on Ivy mode sets `completing-read-function' to
-`ivy-completing-read'.
-
-Global bindings:
-\\{ivy-mode-map}
-
-Minibuffer bindings:
-\\{ivy-minibuffer-map}"
-  :group 'ivy
-  :global t
-  :keymap ivy-mode-map
-  :lighter " ivy"
-  (if ivy-mode
-      (progn
-        (setq completing-read-function 'ivy-completing-read)
-        (when ivy-do-completion-in-region
-          (setq completion-in-region-function 'ivy-completion-in-region)))
-    (setq completing-read-function 'completing-read-default)
-    (setq completion-in-region-function 'completion--in-region)))
-
-(defun ivy--preselect-index (preselect candidates)
-  "Return the index of PRESELECT in CANDIDATES."
-  (cond ((integerp preselect)
-         (if (integerp (car candidates))
-             (cl-position preselect candidates)
-           preselect))
-        ((cl-position preselect candidates :test #'equal))
-        ((ivy--regex-p preselect)
-         (cl-position preselect candidates :test #'string-match-p))))
-
-;;* Implementation
-;;** Regex
-(defun ivy-re-match (re-seq str)
-  "Return non-nil if RE-SEQ is matched by STR.
-
-RE-SEQ is a list of (RE . MATCH-P).
-
-RE is a regular expression.
-
-MATCH-P is t when RE should match STR and nil when RE should not
-match STR.
-
-Each element of RE-SEQ must match for the function to return true.
-
-This concept is used to generalize regular expressions for
-`ivy--regex-plus' and `ivy--regex-ignore-order'."
-  (let ((res t)
-        re)
-    (while (and res (setq re (pop re-seq)))
-      (setq res
-            (if (cdr re)
-                (string-match-p (car re) str)
-              (not (string-match-p (car re) str)))))
-    res))
-
-(defvar ivy--regex-hash
-  (make-hash-table :test #'equal)
-  "Store pre-computed regex.")
-
-(defvar ivy--input-garbage nil)
-
-(defun ivy--split (str)
-  "Split STR into list of substrings bounded by spaces.
-Single spaces act as splitting points.  Consecutive spaces
-\"quote\" their preceding spaces, i.e., guard them from being
-split.  This allows the literal interpretation of N spaces by
-inputting N+1 spaces.  Any substring not constituting a valid
-regexp is passed to `regexp-quote'."
-  (let ((len (length str))
-        (i 0)
-        (start 0)
-        (res nil)
-        match-len
-        end
-        c)
-    (catch 'break
-      (while (< i len)
-        (setq c (aref str i))
-        (cond ((= ?\[ c)
-               (if (setq end (ivy--match-regex-brackets
-                              (substring str i)))
-                   (progn
-                     (push (substring str start (+ i end)) res)
-                     (cl-incf i end)
-                     (setq start i))
-                 (setq ivy--input-garbage (substring str i))
-                 (throw 'break nil)))
-              ((= ?\\ c)
-               (if (and (< (1+ i) len) (= ?\( (aref str (1+ i))))
-                   (progn
-                     (when (> i start)
-                       (push (substring str start i) res))
-                     (if (eq (string-match "\\\\([^\0]*?\\\\)" str i) i)
-                         (progn
-                           (push (match-string 0 str) res)
-                           (setq i (match-end 0))
-                           (setq start i))
-                       (setq ivy--input-garbage (substring str i))
-                       (throw 'break nil)))
-                 (cl-incf i)))
-              ((= ?\  c)
-               (string-match " +" str i)
-               (setq match-len (- (match-end 0) (match-beginning 0)))
-               (if (= match-len 1)
-                   (progn
-                     (when (> i start)
-                       (push (substring str start i) res))
-                     (setq start (1+ i)))
-                 (setq str (replace-match
-                            (make-string (1- match-len) ?\ )
-                            nil nil str))
-                 (setq len (length str))
-                 (cl-incf i (1- match-len)))
-               (cl-incf i))
-              (t
-               (cl-incf i)))))
-    (when (< start i)
-      (push (substring str start) res))
-    (mapcar #'ivy--regex-or-literal (nreverse res))))
-
-(defun ivy--match-regex-brackets (str)
-  (let ((len (length str))
-        (i 1)
-        (open-count 1)
-        c)
-    (while (and (< i len)
-                (> open-count 0))
-      (setq c (aref str i))
-      (cond ((= c ?\[)
-             (cl-incf open-count))
-            ((= c ?\])
-             (cl-decf open-count)))
-      (cl-incf i))
-    (when (= open-count 0)
-      (if (eq (string-match "[+*?]" str i) i)
-          (match-end 0)
-        i))))
-
-(defun ivy--trim-trailing-re (regex)
-  "Trim incomplete REGEX.
-If REGEX ends with \\|, trim it, since then it matches an empty string."
-  (if (string-match "\\`\\(.*\\)[\\]|\\'" regex)
-      (match-string 1 regex)
-    regex))
-
-(defun ivy--regex (str &optional greedy)
-  "Re-build regex pattern from STR in case it has a space.
-When GREEDY is non-nil, join words in a greedy way."
-  (let ((hashed (unless greedy
-                  (gethash str ivy--regex-hash))))
-    (if hashed
-        (progn
-          (setq ivy--subexps (car hashed))
-          (cdr hashed))
-      (when (string-match-p "\\(?:[^\\]\\|^\\)\\\\\\'" str)
-        (setq str (substring str 0 -1)))
-      (setq str (ivy--trim-trailing-re str))
-      (cdr (puthash str
-                    (let ((subs (ivy--split str)))
-                      (if (= (length subs) 1)
-                          (cons
-                           (setq ivy--subexps 0)
-                           (if (string-match-p "\\`\\.[^.]" (car subs))
-                               (concat "\\." (substring (car subs) 1))
-                             (car subs)))
-                        (cons
-                         (setq ivy--subexps (length subs))
-                         (replace-regexp-in-string
-                          "\\.\\*\\??\\\\( "
-                          "\\( "
-                          (mapconcat
-                           (lambda (x)
-                             (if (string-match-p "\\`\\\\([^?][^\0]*\\\\)\\'" x)
-                                 x
-                               (format "\\(%s\\)" x)))
-                           subs
-                           (if greedy ".*" ".*?"))
-                          nil t))))
-                    ivy--regex-hash)))))
-
-(defun ivy--regex-p (object)
-  "Return OBJECT if it is a valid regular expression, else nil."
-  (ignore-errors (string-match-p object "") object))
-
-(defun ivy--regex-or-literal (str)
-  "If STR isn't a legal regexp, escape it."
-  (or (ivy--regex-p str) (regexp-quote str)))
-
-(defun ivy--split-negation (str)
-  "Split STR into text before and after ! delimiter.
-Do not split if the delimiter is escaped as \\!.
-
-Assumes there is at most one un-escaped delimiter and discards
-text after delimiter if it is empty.  Modifies match data."
-  (unless (string= str "")
-    (let ((delim "\\(?:\\`\\|[^\\]\\)\\(!\\)"))
-      (mapcar (lambda (split)
-                ;; Store "\!" as "!".
-                (replace-regexp-in-string "\\\\!" "!" split t t))
-              (if (string-match delim str)
-                  ;; Ignore everything past first un-escaped ! rather than
-                  ;; crashing.  We can't warn or error because the minibuffer is
-                  ;; already active.
-                  (let* ((i (match-beginning 1))
-                         (j (and (string-match delim str (1+ i))
-                                 (match-beginning 1)))
-                         (neg (substring str (1+ i) j)))
-                    (cons (substring str 0 i)
-                          (and (not (string= neg ""))
-                               (list neg))))
-                (list str))))))
-
-(defun ivy--split-spaces (str)
-  "Split STR on spaces, unless they're preceded by \\.
-No un-escaped spaces are left in the output.  Any substring not
-constituting a valid regexp is passed to `regexp-quote'."
-  (when str
-    (let ((i 0) ; End of last search.
-          (j 0) ; End of last delimiter.
-          parts)
-      (while (string-match "\\(\\\\ \\)\\| +" str i)
-        (setq i (match-end 0))
-        (if (not (match-beginning 1))
-            ;; Un-escaped space(s).
-            (let ((delim (match-beginning 0)))
-              (when (< j delim)
-                (push (substring str j delim) parts))
-              (setq j i))
-          ;; Store "\ " as " ".
-          (setq str (replace-match " " t t str 1))
-          (setq i (1- i))))
-      (when (< j (length str))
-        (push (substring str j) parts))
-      (mapcar #'ivy--regex-or-literal (nreverse parts)))))
-
-(defun ivy--regex-ignore-order (str)
-  "Re-build regex from STR by splitting at spaces and using ! for negation.
-
-Examples:
-foo          -> matches \"foo\"
-foo bar      -> matches if both \"foo\" and \"bar\" match (any order)
-foo !bar     -> matches if \"foo\" matches and \"bar\" does not match
-foo !bar baz -> matches if \"foo\" matches and neither \"bar\" nor \"baz\" match
-foo[a-z]     -> matches \"foo[a-z]\"
-
-Escaping examples:
-foo\\!bar -> matches \"foo!bar\"
-foo\\ bar -> matches \"foo bar\"
-
-Returns a list suitable for `ivy-re-match'."
-  (setq str (ivy--trim-trailing-re str))
-  (let* (regex-parts
-         (raw-parts (ivy--split-negation str)))
-    (dolist (part (ivy--split-spaces (car raw-parts)))
-      (push (cons part t) regex-parts))
-    (when (cdr raw-parts)
-      (dolist (part (ivy--split-spaces (cadr raw-parts)))
-        (push (cons part nil) regex-parts)))
-    (if regex-parts (nreverse regex-parts)
-      "")))
-
-(defun ivy--regex-plus (str)
-  "Build a regex sequence from STR.
-Spaces are wild card characters, everything before \"!\" should
-match.  Everything after \"!\" should not match."
-  (let ((parts (ivy--split-negation str)))
-    (cl-case (length parts)
-      (0
-       "")
-      (1
-       (if (= (aref str 0) ?!)
-           (list (cons "" t)
-                 (list (ivy--regex (car parts))))
-         (ivy--regex (car parts))))
-      (2
-       (cons
-        (cons (ivy--regex (car parts)) t)
-        (mapcar #'list (split-string (cadr parts) " " t))))
-      (t (error "Unexpected: use only one !")))))
-
-(defun ivy--regex-fuzzy (str)
-  "Build a regex sequence from STR.
-Insert .* between each char."
-  (setq str (ivy--trim-trailing-re str))
-  (if (string-match "\\`\\(\\^?\\)\\(.*?\\)\\(\\$?\\)\\'" str)
-      (prog1
-          (concat (match-string 1 str)
-                  (let ((lst (string-to-list (match-string 2 str))))
-                    (apply #'concat
-                           (cl-mapcar
-                            #'concat
-                            (cons "" (cdr (mapcar (lambda (c) (format "[^%c\n]*" c))
-                                                  lst)))
-                            (mapcar (lambda (x) (format "\\(%s\\)" (regexp-quote (char-to-string x))))
-                                    lst))))
-                  (match-string 3 str))
-        (setq ivy--subexps (length (match-string 2 str))))
-    str))
-
-(defcustom ivy-fixed-height-minibuffer nil
-  "When non nil, fix the height of the minibuffer during ivy completion.
-This effectively sets the minimum height at this level to `ivy-height' and
-tries to ensure that it does not change depending on the number of candidates."
-  :type 'boolean)
-
-;;** Rest
-(defcustom ivy-truncate-lines t
-  "Minibuffer setting for `truncate-lines'."
-  :type 'boolean)
-
-(defun ivy--minibuffer-setup ()
-  "Setup ivy completion in the minibuffer."
-  (setq-local mwheel-scroll-up-function 'ivy-next-line)
-  (setq-local mwheel-scroll-down-function 'ivy-previous-line)
-  (setq-local completion-show-inline-help nil)
-  (setq-local line-spacing nil)
-  (setq-local minibuffer-default-add-function
-              (lambda ()
-                (list ivy--default)))
-  (setq-local inhibit-field-text-motion nil)
-  (setq truncate-lines ivy-truncate-lines)
-  (setq-local max-mini-window-height ivy-height)
-  (let ((height (cond ((and ivy-fixed-height-minibuffer
-                            (not (eq (ivy-state-caller ivy-last)
-                                     #'ivy-completion-in-region)))
-                       (+ ivy-height (if ivy-add-newline-after-prompt 1 0)))
-                      (ivy-add-newline-after-prompt 2))))
-    (when height
-      (set-window-text-height nil height)))
-  (add-hook 'post-command-hook #'ivy--queue-exhibit nil t)
-  (add-hook 'window-size-change-functions #'ivy--window-size-changed nil t)
-  (let ((hook (ivy-alist-setting ivy-hooks-alist)))
-    (when (functionp hook)
-      (funcall hook))))
-
-(defun ivy--input ()
-  "Return the current minibuffer input."
-  ;; assume one-line minibuffer input
-  (save-excursion
-    (goto-char (minibuffer-prompt-end))
-    (let ((inhibit-field-text-motion t))
-      (buffer-substring-no-properties
-       (point)
-       (line-end-position)))))
-
-(defun ivy--minibuffer-cleanup ()
-  "Delete the displayed completion candidates."
-  (save-excursion
-    (goto-char (minibuffer-prompt-end))
-    (delete-region (line-end-position) (point-max))))
-
-(defun ivy-cleanup-string (str)
-  "Destructively remove unwanted text properties from STR."
-  (ivy--remove-props str 'field))
-
-(defvar ivy-set-prompt-text-properties-function
-  #'ivy-set-prompt-text-properties-default
-  "Function to set the text properties of the default ivy prompt.
-Called with two arguments, PROMPT and PROPS, where PROMPT is the
-string to be propertized and PROPS is a plist of default text
-properties that may be applied to PROMPT.  The function should
-return the propertized PROMPT, which may be modified in-place.")
-
-(defun ivy-set-prompt-text-properties-default (prompt props)
-  "Propertize (confirm) and (match required) parts of PROMPT.
-PROPS is a plist of default text properties to apply to these
-parts beyond their respective faces `ivy-confirm-face' and
-`ivy-match-required-face'."
-  (dolist (pair '(("confirm" . ivy-confirm-face)
-                  ("match required" . ivy-match-required-face)))
-    (let ((i (string-match-p (car pair) prompt)))
-      (when i
-        (add-text-properties i (+ i (length (car pair)))
-                             `(face ,(cdr pair) ,@props)
-                             prompt))))
-  prompt)
-
-(defun ivy-prompt ()
-  "Return the current prompt."
-  (let* ((caller (ivy-state-caller ivy-last))
-         (fn (plist-get ivy--prompts-list caller)))
-    (if fn
-        (condition-case err
-            (funcall fn)
-          (wrong-number-of-arguments
-           (lwarn 'ivy :error "%s
-  Prompt function set via `ivy-set-prompt' for caller `%s'
-  should take no arguments."
-                  (error-message-string err)
-                  caller)
-           ;; Old behavior.
-           (funcall fn (ivy-state-prompt ivy-last))))
-      ivy--prompt)))
-
-(defun ivy--insert-prompt ()
-  "Update the prompt according to `ivy--prompt'."
-  (when (setq ivy--prompt (ivy-prompt))
-    (unless (memq this-command '(ivy-done ivy-alt-done ivy-partial-or-done
-                                 counsel-find-symbol))
-      (setq ivy--prompt-extra ""))
-    (let (head tail)
-      (if (string-match "\\(.*?\\)\\(:? ?\\)\\'" ivy--prompt)
-          (progn
-            (setq head (match-string 1 ivy--prompt))
-            (setq tail (match-string 2 ivy--prompt)))
-        (setq head ivy--prompt)
-        (setq tail ""))
-      (let ((inhibit-read-only t)
-            (std-props '(front-sticky t rear-nonsticky t field t read-only t))
-            (n-str
-             (concat
-              (if (and (bound-and-true-p minibuffer-depth-indicate-mode)
-                       (> (minibuffer-depth) 1))
-                  (format "[%d] " (minibuffer-depth))
-                "")
-              (concat
-               (if (string-match "%d.*%d" ivy-count-format)
-                   (format head
-                           (1+ ivy--index)
-                           (or (and (ivy-state-dynamic-collection ivy-last)
-                                    ivy--full-length)
-                               ivy--length))
-                 (format head
-                         (or (and (ivy-state-dynamic-collection ivy-last)
-                                  ivy--full-length)
-                             ivy--length)))
-               ivy--prompt-extra
-               tail)))
-            (d-str (if ivy--directory
-                       (abbreviate-file-name ivy--directory)
-                     "")))
-        (save-excursion
-          (goto-char (point-min))
-          (delete-region (point-min) (minibuffer-prompt-end))
-          (let ((len-n (length n-str))
-                (len-d (length d-str))
-                (ww (window-width)))
-            (setq n-str
-                  (cond ((> (+ len-n len-d) ww)
-                         (concat n-str "\n" d-str "\n"))
-                        ((> (+ len-n len-d (length ivy-text)) ww)
-                         (concat n-str d-str "\n"))
-                        (t
-                         (concat n-str d-str)))))
-          (when ivy-pre-prompt-function
-            (setq n-str (concat (funcall ivy-pre-prompt-function) n-str)))
-          (when ivy-add-newline-after-prompt
-            (setq n-str (concat n-str "\n")))
-          (let ((regex (format "\\([^\n]\\{%d\\}\\)[^\n]" (window-width))))
-            (while (string-match regex n-str)
-              (setq n-str (replace-match
-                           (concat (match-string 1 n-str) "\n")
-                           nil t n-str 1))))
-          (set-text-properties 0 (length n-str)
-                               `(face minibuffer-prompt ,@std-props)
-                               n-str)
-          (setq n-str (funcall ivy-set-prompt-text-properties-function
-                               n-str std-props))
-          (insert n-str))
-        ;; Mark prompt as selected if the user moves there or it is the only
-        ;; option left.  Since the user input stays put, we have to manually
-        ;; remove the face as well.
-        (when ivy--use-selectable-prompt
-          (if (= ivy--index -1)
-              (ivy-add-face-text-property
-               (minibuffer-prompt-end) (line-end-position) 'ivy-prompt-match)
-            (remove-list-of-text-properties
-             (minibuffer-prompt-end) (line-end-position) '(face))))
-        ;; get out of the prompt area
-        (constrain-to-field nil (point-max))))))
-
-(defun ivy--sort-maybe (collection)
-  "Sort COLLECTION if needed."
-  (let ((sort (ivy-state-sort ivy-last)))
-    (if (and sort
-             (or (functionp sort)
-                 (functionp (setq sort (ivy--sort-function
-                                        (ivy-state-collection ivy-last))))))
-        (sort (copy-sequence collection) sort)
-      collection)))
-
-(defcustom ivy-magic-slash-non-match-action 'ivy-magic-slash-non-match-cd-selected
-  "Action to take when a slash is added to the end of a non existing directory.
-Possible choices are 'ivy-magic-slash-non-match-cd-selected,
-'ivy-magic-slash-non-match-create, or nil"
-  :type '(choice
-          (const :tag "Use currently selected directory"
-           ivy-magic-slash-non-match-cd-selected)
-          (const :tag "Create and use new directory"
-           ivy-magic-slash-non-match-create)
-          (const :tag "Do nothing"
-           nil)))
-
-(defun ivy--create-and-cd (dir)
-  "When completing file names, create directory DIR and move there."
-  (make-directory dir)
-  (ivy--cd dir))
-
-(defun ivy--magic-file-doubleslash-directory ()
-  "Return an appropriate directory for when two slashes are entered."
-  (let (remote)
-    (cond
-      ;; Windows
-      ;; ((string-match "\\`[[:alpha:]]:/" ivy--directory)
-      ;;  (match-string 0 ivy--directory))
-      ;; Remote root if on remote
-      ((setq remote (file-remote-p ivy--directory))
-       (concat remote "/"))
-      ;; Local root
-      (t
-       "/"))))
-
-(defun ivy--magic-file-slash ()
-  "Handle slash when completing file names."
-  (when (or (and (eq this-command #'self-insert-command)
-                 (eolp))
-            (eq this-command #'ivy-partial-or-done))
-    (let ((canonical (expand-file-name ivy-text ivy--directory))
-          (magic (not (string= ivy-text "/"))))
-      (cond ((member ivy-text ivy--all-candidates)
-             (ivy--cd canonical))
-            ((and (eq system-type 'windows-nt) (string= ivy-text "//")))
-            ((string-match-p "//\\'" ivy-text)
-             (ivy--cd
-              (ivy--magic-file-doubleslash-directory)))
-            ((string-match-p "\\`/ssh:" ivy-text)
-             (ivy--cd (file-name-directory ivy-text)))
-            ((string-match "[[:alpha:]]:/\\'" ivy-text)
-             (let ((drive-root (match-string 0 ivy-text)))
-               (when (file-exists-p drive-root)
-                 (ivy--cd drive-root))))
-            ((and magic (file-directory-p canonical))
-             (ivy--cd canonical))
-            ((let ((default-directory ivy--directory))
-               (and (or (> ivy--index 0)
-                        (= ivy--length 1)
-                        magic)
-                    (not (ivy--prompt-selected-p))
-                    (not (equal (ivy-state-current ivy-last) ""))
-                    (file-directory-p (ivy-state-current ivy-last))
-                    (or (eq ivy-magic-slash-non-match-action
-                            'ivy-magic-slash-non-match-cd-selected)
-                        (eq this-command #'ivy-partial-or-done))))
-             (ivy--cd
-              (expand-file-name (ivy-state-current ivy-last) ivy--directory)))
-            ((and (eq ivy-magic-slash-non-match-action
-                      'ivy-magic-slash-non-match-create)
-                  magic)
-             (ivy--create-and-cd canonical))))))
-
-(defun ivy-magic-read-file-env ()
-  "If reading filename, jump to environment variable location."
-  (interactive)
-  (if (and ivy--directory
-           (equal ivy-text ""))
-      (let* ((cands (cl-loop for pair in process-environment
-                       for (var val) = (split-string pair "=" t)
-                       if (and val (not (equal "" val)))
-                       if (file-exists-p
-                           (if (file-name-absolute-p val)
-                               val
-                             (setq val
-                                   (expand-file-name val ivy--directory))))
-                       collect (cons var val)))
-             (enable-recursive-minibuffers t)
-             (x (ivy-read "Env: " cands))
-             (path (cdr (assoc x cands))))
-        (insert (if (file-accessible-directory-p path)
-                    (file-name-as-directory path)
-                  path))
-        (ivy--cd-maybe))
-    (insert last-input-event)))
-
-(defun ivy-make-magic-action (caller key)
-  "Return a command that does the equivalent of `ivy-read-action' and KEY.
-This happens only when the input is empty.
-The intention is to bind the result to keys that are typically
-bound to `self-insert-command'."
-  (let* ((alist (assoc key
-                       (plist-get
-                        ivy--actions-list
-                        caller)))
-         (doc (format "%s (`%S')"
-                      (nth 2 alist)
-                      (nth 1 alist))))
-    `(lambda (&optional arg)
-       ,doc
-       (interactive "p")
-       (if (string= "" ivy-text)
-           (execute-kbd-macro
-            (kbd ,(concat "M-o " key)))
-         (self-insert-command arg)))))
-
-(defcustom ivy-magic-tilde t
-  "When non-nil, ~ will move home when selecting files.
-Otherwise, ~/ will move home."
-  :type 'boolean)
-
-(defcustom ivy-dynamic-exhibit-delay-ms 0
-  "Delay in ms before dynamic collections are refreshed"
-  :type 'integer)
-
-(defvar ivy--exhibit-timer nil)
-
-(defun ivy--queue-exhibit ()
-  "Insert Ivy completions display, possibly after a timeout for
-dynamic collections.
-Should be run via minibuffer `post-command-hook'."
-  (if (and (> ivy-dynamic-exhibit-delay-ms 0)
-           (ivy-state-dynamic-collection ivy-last))
-      (progn
-        (when ivy--exhibit-timer (cancel-timer ivy--exhibit-timer))
-        (setq ivy--exhibit-timer
-              (run-with-timer
-               (/ ivy-dynamic-exhibit-delay-ms 1000.0)
-               nil
-               'ivy--exhibit)))
-    (ivy--exhibit)))
-
-(unless (fboundp 'file-local-name)
-  (defun file-local-name (file)
-    "Emacs has this function since 26.1."
-    (or (file-remote-p file 'localname) file)))
-
-(defun ivy--magic-tilde-directory (dir)
-  "Return an appropriate home for DIR for when ~ or ~/ are entered."
-  (file-name-as-directory
-   (expand-file-name
-    (let* ((home (expand-file-name (concat (file-remote-p dir) "~/")))
-           (dir-path (file-local-name dir))
-           (home-path (file-local-name home)))
-      (if (string= dir-path home-path)
-          "~"
-        home)))))
-
-(defun ivy-update-candidates (cands)
-  (ivy--insert-minibuffer
-   (ivy--format
-    (setq ivy--all-candidates cands))))
-
-(defun ivy--exhibit ()
-  "Insert Ivy completions display.
-Should be run via minibuffer `post-command-hook'."
-  (when (memq 'ivy--queue-exhibit post-command-hook)
-    (let ((inhibit-field-text-motion nil))
-      (constrain-to-field nil (point-max)))
-    (ivy-set-text (ivy--input))
-    (let ((new-minibuffer (ivy--update-minibuffer)))
-      (when new-minibuffer
-        (ivy--insert-minibuffer new-minibuffer)))
-    t))
-
-(defun ivy--dynamic-collection-cands (input)
-  (let ((coll (funcall (ivy-state-collection ivy-last) input)))
-    (if (listp coll)
-        (mapcar (lambda (x) (if (consp x) (car x) x)) coll)
-      coll)))
-
-(defun ivy--update-minibuffer ()
-  (prog1
-      (if (ivy-state-dynamic-collection ivy-last)
-          ;; while-no-input would cause annoying
-          ;; "Waiting for process to die...done" message interruptions
-          (let ((inhibit-message t)
-                coll in-progress)
-            (unless (or (equal ivy--old-text ivy-text)
-                        (eq this-command 'ivy-resume))
-              (while-no-input
-                (setq coll (ivy--dynamic-collection-cands ivy-text))
-                (when (eq coll 0)
-                  (setq coll nil)
-                  (setq ivy--old-re nil)
-                  (setq in-progress t))
-                (setq ivy--all-candidates (ivy--sort-maybe coll))))
-            (when (eq ivy--all-candidates 0)
-              (setq ivy--all-candidates nil)
-              (setq ivy--old-re nil)
-              (setq in-progress t))
-            (when (or ivy--all-candidates
-                      (and (not (get-process " *counsel*"))
-                           (not in-progress)))
-              (ivy--set-index-dynamic-collection)
-              (ivy--format ivy--all-candidates)))
-        (cond (ivy--directory
-               (cond ((or (string= "~/" ivy-text)
-                          (and (string= "~" ivy-text)
-                               ivy-magic-tilde))
-                      (ivy--cd (ivy--magic-tilde-directory ivy--directory)))
-                     ((string-match "/\\'" ivy-text)
-                      (ivy--magic-file-slash))))
-              ((eq (ivy-state-collection ivy-last) #'internal-complete-buffer)
-               (when (or (and (string-match "\\` " ivy-text)
-                              (not (string-match "\\` " ivy--old-text)))
-                         (and (string-match "\\` " ivy--old-text)
-                              (not (string-match "\\` " ivy-text))))
-                 (setq ivy--all-candidates
-                       (if (= (string-to-char ivy-text) ?\s)
-                           (ivy--buffer-list " ")
-                         (ivy--buffer-list "" ivy-use-virtual-buffers)))
-                 (setq ivy--old-re nil))))
-        (with-current-buffer (ivy-state-buffer ivy-last)
-          (ivy--format
-           (ivy--filter ivy-text ivy--all-candidates))))
-    (setq ivy--old-text ivy-text)))
-
-(defun ivy-display-function-fallback (str)
-  (let ((buffer-undo-list t))
-    (save-excursion
-      (forward-line 1)
-      (insert str))))
-
-(defun ivy--insert-minibuffer (text)
-  "Insert TEXT into minibuffer with appropriate cleanup."
-  (let ((resize-mini-windows nil)
-        (update-fn (ivy-state-update-fn ivy-last))
-        (old-mark (marker-position (mark-marker)))
-        (win (active-minibuffer-window))
-        deactivate-mark)
-    (when win
-      (with-selected-window win
-        (ivy--minibuffer-cleanup)
-        (when update-fn
-          (funcall update-fn))
-        (ivy--insert-prompt)
-        ;; Do nothing if while-no-input was aborted.
-        (when (stringp text)
-          (if ivy--display-function
-              (funcall ivy--display-function text)
-            (ivy-display-function-fallback text)))
-        (ivy--resize-minibuffer-to-fit)
-        ;; prevent region growing due to text remove/add
-        (when (region-active-p)
-          (set-mark old-mark))))))
-
-(defcustom ivy-auto-shrink-minibuffer nil
-  "When non-nil and the height < `ivy-height', auto-shrink the minibuffer."
-  :type 'boolean)
-
-(defun ivy--resize-minibuffer-to-fit ()
-  "Resize the minibuffer window size to fit the text in the minibuffer."
-  (unless (or (frame-root-window-p (minibuffer-window))
-              (memq this-command '(ivy-read-action
-                                   ivy-dispatching-done
-                                   ivy-dispatching-call)))
-    (with-selected-window (minibuffer-window)
-      (if (fboundp 'window-text-pixel-size)
-          (let ((text-height (cdr (window-text-pixel-size)))
-                (body-height (window-body-height nil t)))
-            (cond ((> text-height body-height)
-                   ;; Note: the size increment needs to be at least
-                   ;; frame-char-height, otherwise resizing won't do
-                   ;; anything.
-                   (let ((delta (max (- text-height body-height)
-                                     (frame-char-height))))
-                     (window-resize nil delta nil t t)))
-                  ((and ivy-auto-shrink-minibuffer
-                        (< ivy--length ivy-height))
-                   (shrink-window (-
-                                   (/ (window-body-height nil t)
-                                      (frame-char-height))
-                                   ivy--length 1)))))
-        (let ((text-height (count-screen-lines))
-              (body-height (window-body-height)))
-          (when (> text-height body-height)
-            (window-resize nil (- text-height body-height) nil t)))))))
-
-(defun ivy--window-size-changed (&rest _)
-  "Resize ivy window to fit with current frame's size."
-  (when ivy-mode
-    (ivy--resize-minibuffer-to-fit)))
-
-(defun ivy--add-face (str face)
-  "Propertize STR with FACE."
-  (let ((len (length str)))
-    (condition-case nil
-        (progn
-          (colir-blend-face-background 0 len face str)
-          (let ((foreground (face-foreground face)))
-            (when foreground
-              (ivy-add-face-text-property
-               0 len (list :foreground foreground) str))))
-      (error
-       (ignore-errors
-         (font-lock-append-text-property 0 len 'face face str)))))
-  str)
-
-(declare-function flx-make-string-cache "ext:flx")
-(declare-function flx-score "ext:flx")
-
-(defvar ivy--flx-cache nil)
-
-(eval-after-load 'flx
-  '(setq ivy--flx-cache (flx-make-string-cache)))
-
-(defun ivy-toggle-case-fold ()
-  "Toggle `case-fold-search' for Ivy operations.
-
-Instead of modifying `case-fold-search' directly, this command
-toggles `ivy-case-fold-search', which can take on more values
-than the former, between nil and either `auto' or t.  See
-`ivy-case-fold-search-default' for the meaning of these values.
-
-In any Ivy completion session, the case folding starts with
-`ivy-case-fold-search-default'."
-  (interactive)
-  (setq ivy-case-fold-search
-        (and (not ivy-case-fold-search)
-             (or ivy-case-fold-search-default 'auto)))
-  ;; Reset cache so that the candidate list updates.
-  (setq ivy--old-re nil))
-
-(defun ivy--re-filter (re candidates &optional mkpred)
-  "Return all RE matching CANDIDATES.
-RE is a list of cons cells, with a regexp car and a boolean cdr.
-When the cdr is t, the car must match.
-Otherwise, the car must not match."
-  (if (equal re "")
-      candidates
-    (ignore-errors
-      (dolist (re (if (stringp re) (list (cons re t)) re))
-        (let* ((re-str (car re))
-               (pred
-                (if mkpred
-                    (funcall mkpred re-str)
-                  (lambda (x) (string-match-p re-str x)))))
-          (setq candidates
-                (cl-remove nil candidates
-                           (if (cdr re) :if-not :if)
-                           pred))))
-      candidates)))
-
-(defun ivy--filter (name candidates)
-  "Return all items that match NAME in CANDIDATES.
-CANDIDATES are assumed to be static."
-  (let ((re (funcall ivy--regex-function name)))
-    (if (and
-         ivy--old-re
-         ivy--old-cands
-         (equal re ivy--old-re))
-        ;; quick caching for "C-n", "C-p" etc.
-        ivy--old-cands
-      (let* ((re-str (ivy-re-to-str re))
-             (matcher (ivy-state-matcher ivy-last))
-             (case-fold-search (ivy--case-fold-p name))
-             (cands (cond
-                      ((and ivy--old-re
-                            (stringp re)
-                            (stringp ivy--old-re)
-                            (not (string-match-p "\\\\" ivy--old-re))
-                            (not (equal ivy--old-re ""))
-                            (memq (cl-search
-                                   (if (string-match-p "\\\\)\\'" ivy--old-re)
-                                       (substring ivy--old-re 0 -2)
-                                     ivy--old-re)
-                                   re)
-                                  '(0 2))
-                            ivy--old-cands
-                            (ivy--re-filter re ivy--old-cands)))
-                      (matcher
-                       (funcall matcher re candidates))
-                      (t
-                       (ivy--re-filter re candidates)))))
-        (if (memq (cdr (assq (ivy-state-caller ivy-last)
-                             ivy-index-functions-alist))
-                  '(ivy-recompute-index-swiper
-                    ivy-recompute-index-swiper-async
-                    ivy-recompute-index-swiper-async-backward
-                    ivy-recompute-index-swiper-backward))
-            (progn
-              (ivy--recompute-index re-str cands)
-              (setq ivy--old-cands (ivy--sort name cands)))
-          (setq ivy--old-cands (ivy--sort name cands))
-          (ivy--recompute-index re-str ivy--old-cands))
-        (setq ivy--old-re re)
-        ivy--old-cands))))
-
-(defun ivy--set-candidates (x)
-  "Update `ivy--all-candidates' with X."
-  (let (res)
-    (dolist (source ivy--extra-candidates)
-      (if (equal source '(original-source))
-          (if (null res)
-              (setq res x)
-            (setq res (append x res)))
-        (setq ivy--old-re nil)
-        (setq res (append
-                   (ivy--filter ivy-text (cadr source))
-                   res))))
-    (setq ivy--all-candidates
-          (if (cdr ivy--extra-candidates)
-              (delete-dups res)
-            res))))
-
-(defun ivy--shorter-matches-first (_name cands)
-  "Sort CANDS according to their length."
-  (if (< (length cands) ivy-sort-max-size)
-      (cl-sort
-       (copy-sequence cands)
-       (lambda (s1 s2)
-         (< (length s1) (length s2))))
-    cands))
-
-(defcustom ivy-sort-matches-functions-alist
-  '((t . nil)
-    (ivy-completion-in-region . ivy--shorter-matches-first)
-    (ivy-switch-buffer . ivy-sort-function-buffer))
-  "An alist of functions for sorting matching candidates.
-
-Unlike `ivy-sort-functions-alist', which is used to sort the
-whole collection only once, this alist of functions are used to
-sort only matching candidates after each change in input.
-
-The alist KEY is either a collection function or t to match
-previously unmatched collection functions.
-
-The alist VAL is a sorting function with the signature of
-`ivy--prefix-sort'."
-  :type '(alist
-          :key-type (choice
-                     (const :tag "Fall-through" t)
-                     (symbol :tag "Collection"))
-          :value-type
-          (choice
-           (const :tag "Don't sort" nil)
-           (const :tag "Put prefix matches ahead" ivy--prefix-sort)
-           (function :tag "Custom sort function"))))
-
-(defun ivy--sort-files-by-date (_name candidates)
-  "Re-sort CANDIDATES according to file modification date."
-  (let ((default-directory ivy--directory))
-    (sort (copy-sequence candidates) #'file-newer-than-file-p)))
-
-(defvar ivy--flx-featurep (require 'flx nil 'noerror))
-
-(defun ivy--sort (name candidates)
-  "Re-sort candidates by NAME.
-All CANDIDATES are assumed to match NAME."
-  (let (fun)
-    (cond ((setq fun (ivy-alist-setting ivy-sort-matches-functions-alist))
-           (funcall fun name candidates))
-          ((and ivy--flx-featurep
-                (eq ivy--regex-function 'ivy--regex-fuzzy))
-           (ivy--flx-sort name candidates))
-          (t
-           candidates))))
-
-(defun ivy--prefix-sort (name candidates)
-  "Re-sort candidates by NAME.
-All CANDIDATES are assumed to match NAME.
-Prefix matches to NAME are put ahead of the list."
-  (if (or (string= name "")
-          (= (aref name 0) ?^))
-      candidates
-    (let ((re-prefix (concat "\\`" (funcall ivy--regex-function name)))
-          res-prefix
-          res-noprefix)
-      (dolist (s candidates)
-        (if (string-match-p re-prefix s)
-            (push s res-prefix)
-          (push s res-noprefix)))
-      (nconc
-       (nreverse res-prefix)
-       (nreverse res-noprefix)))))
-
-(defvar ivy--virtual-buffers nil
-  "Store the virtual buffers alist.")
-
-(defun ivy-re-to-str (re)
-  "Transform RE to a string.
-
-Functions like `ivy--regex-ignore-order' return a cons list.
-This function extracts a string from the cons list."
-  (if (consp re) (caar re) re))
-
-(defun ivy-sort-function-buffer (name candidates)
-  "Re-sort candidates by NAME.
-CANDIDATES is a list of buffer names each containing NAME.
-Sort open buffers before virtual buffers, and prefix matches
-before substring matches."
-  (if (or (string= name "")
-          (= (aref name 0) ?^))
-      candidates
-    (let* ((base-re (ivy-re-to-str (funcall ivy--regex-function name)))
-           (re-star-prefix (concat "\\`\\*" base-re))
-           (re-prefix (concat "\\`" base-re))
-           res-prefix
-           res-noprefix
-           res-virtual-prefix
-           res-virtual-noprefix)
-      (dolist (s candidates)
-        (cond
-          ((and (assoc s ivy--virtual-buffers)
-                (or (string-match-p re-star-prefix s)
-                    (string-match-p re-prefix s)))
-           (push s res-virtual-prefix))
-          ((assoc s ivy--virtual-buffers)
-           (push s res-virtual-noprefix))
-          ((or (string-match-p re-star-prefix s)
-               (string-match-p re-prefix s))
-           (push s res-prefix))
-          (t
-           (push s res-noprefix))))
-      (nconc
-       (nreverse res-prefix)
-       (nreverse res-noprefix)
-       (nreverse res-virtual-prefix)
-       (nreverse res-virtual-noprefix)))))
-
-(defvar ivy-flx-limit 200
-  "Used to conditionally turn off flx sorting.
-
-When the amount of matching candidates exceeds this limit, then
-no sorting is done.")
-
-(defvar ivy--recompute-index-inhibit nil
-  "When non-nil, `ivy--recompute-index' is a no-op.")
-
-(defun ivy--recompute-index (re-str cands)
-  "Recompute index of selected candidate matching RE-STR.
-CANDS are the current candidates."
-  (let ((caller (ivy-state-caller ivy-last))
-        (func (or (ivy-alist-setting ivy-index-functions-alist)
-                  #'ivy-recompute-index-zero))
-        (case-fold-search (ivy--case-fold-p re-str))
-        (preselect (ivy-state-preselect ivy-last))
-        (current (ivy-state-current ivy-last))
-        (empty (string= re-str "")))
-    (unless (or (memq this-command '(ivy-resume ivy-partial-or-done))
-                ivy--recompute-index-inhibit)
-      (ivy-set-index
-       (if (or (string= re-str "")
-               (and (> (length cands) 10000) (eq func #'ivy-recompute-index-zero)))
-           0
-         (or
-          (cl-position (ivy--remove-prefix "^" re-str)
-                       cands
-                       :test #'ivy--case-fold-string=)
-          (and ivy--directory
-               (cl-position (concat re-str "/")
-                            cands
-                            :test #'ivy--case-fold-string=))
-          (and (eq caller 'ivy-switch-buffer)
-               (not empty)
-               0)
-          (and (not empty)
-               (not (eq caller 'swiper))
-               (not (and ivy--flx-featurep
-                         (eq ivy--regex-function 'ivy--regex-fuzzy)
-                         ;; Limit to configured number of candidates
-                         (null (nthcdr ivy-flx-limit cands))))
-               ;; If there was a preselected candidate, don't try to
-               ;; keep it selected even if the regexp still matches it.
-               ;; See issue #1563.  See also `ivy--preselect-index',
-               ;; which this logic roughly mirrors.
-               (not (or
-                     (and (integerp preselect)
-                          (= ivy--index preselect))
-                     (equal current preselect)
-                     (and (ivy--regex-p preselect)
-                          (stringp current)
-                          (string-match-p preselect current))))
-               ivy--old-cands
-               (cl-position current cands :test #'equal))
-          (funcall func re-str cands)))))
-    (when (or empty (string= re-str "^"))
-      (ivy-set-index
-       (or (ivy--preselect-index preselect cands)
-           ivy--index)))))
-
-(defun ivy-recompute-index-swiper (_re-str cands)
-  "Recompute index of selected candidate when using `swiper'.
-CANDS are the current candidates."
-  (condition-case nil
-      (let ((tail (nthcdr ivy--index ivy--old-cands))
-            idx)
-        (if (and tail ivy--old-cands (not (equal "^" ivy--old-re)))
-            (progn
-              (while (and tail (null idx))
-                ;; Compare with eq to handle equal duplicates in cands
-                (setq idx (cl-position (pop tail) cands)))
-              (or
-               idx
-               (1- (length cands))))
-          (if ivy--old-cands
-              ivy--index
-            ;; already in ivy-state-buffer
-            (let ((n (line-number-at-pos))
-                  (res 0)
-                  (i 0))
-              (dolist (c cands)
-                (when (eq n (get-text-property 0 'swiper-line-number c))
-                  (setq res i))
-                (cl-incf i))
-              res))))
-    (error 0)))
-
-(defun ivy-recompute-index-swiper-backward (re-str cands)
-  "Recompute index of selected candidate when using `swiper-backward'.
-CANDS are the current candidates."
-  (let ((idx (ivy-recompute-index-swiper re-str cands)))
-    (if (or (= idx -1)
-            (<= (get-text-property 0 'swiper-line-number (nth idx cands))
-                (line-number-at-pos)))
-        idx
-      (- idx 1))))
-
-(defun ivy-recompute-index-swiper-async (_re-str cands)
-  "Recompute index of selected candidate when using `swiper' asynchronously.
-CANDS are the current candidates."
-  (if (null ivy--old-cands)
-      (let ((ln (with-ivy-window
-                  (line-number-at-pos))))
-        (or
-         ;; closest to current line going forwards
-         (cl-position-if (lambda (x)
-                           (>= (string-to-number x) ln))
-                         cands)
-         ;; closest to current line going backwards
-         (1- (length cands))))
-    (let ((tail (nthcdr ivy--index ivy--old-cands))
-          idx)
-      (if (and tail ivy--old-cands (not (equal "^" ivy--old-re)))
-          (progn
-            (while (and tail (null idx))
-              ;; Compare with `equal', since the collection is re-created
-              ;; each time with `split-string'
-              (setq idx (cl-position (pop tail) cands :test #'equal)))
-            (or idx 0))
-        ivy--index))))
-
-(defun ivy-recompute-index-swiper-async-backward (re-str cands)
-  "Recompute index of selected candidate when using `swiper-backward'
-asynchronously. CANDS are the current candidates."
-  (if (= (length cands) 0)
-      0
-    (let ((idx (ivy-recompute-index-swiper-async re-str cands)))
-      (if
-          (<= (string-to-number (nth idx cands))
-              (with-ivy-window (line-number-at-pos)))
-          idx
-        (- idx 1)))))
-
-(defun ivy-recompute-index-zero (_re-str _cands)
-  "Recompute index of selected candidate.
-This function serves as a fallback when nothing else is available."
-  0)
-
-(defcustom ivy-minibuffer-faces
-  '(ivy-minibuffer-match-face-1
-    ivy-minibuffer-match-face-2
-    ivy-minibuffer-match-face-3
-    ivy-minibuffer-match-face-4)
-  "List of `ivy' faces for minibuffer group matches."
-  :type '(repeat :tag "Faces"
-          (choice
-           (const ivy-minibuffer-match-face-1)
-           (const ivy-minibuffer-match-face-2)
-           (const ivy-minibuffer-match-face-3)
-           (const ivy-minibuffer-match-face-4)
-           (face :tag "Other face"))))
-
-(defun ivy--minibuffer-face (n)
-  "Return Nth face from `ivy-minibuffer-faces'.
-N wraps around, but skips the first element of the list."
-  (let ((tail (cdr ivy-minibuffer-faces)))
-    (nth (mod (+ n 2) (length tail)) tail)))
-
-(defun ivy--flx-propertize (x)
-  "X is (cons (flx-score STR ...) STR)."
-  (let ((str (copy-sequence (cdr x)))
-        (i 0)
-        (last-j -2))
-    (dolist (j (cdar x))
-      (unless (eq j (1+ last-j))
-        (cl-incf i))
-      (setq last-j j)
-      (ivy-add-face-text-property j (1+ j) (ivy--minibuffer-face i) str))
-    str))
-
-(defun ivy--flx-sort (name cands)
-  "Sort according to closeness to string NAME the string list CANDS."
-  (condition-case nil
-      (let* ((bolp (= (string-to-char name) ?^))
-             ;; An optimized regex for fuzzy matching
-             ;; "abc" → "^[^a]*a[^b]*b[^c]*c"
-             (fuzzy-regex (concat "\\`"
-                                  (and bolp (regexp-quote (substring name 1 2)))
-                                  (mapconcat
-                                   (lambda (x)
-                                     (setq x (char-to-string x))
-                                     (concat "[^" x "]*" (regexp-quote x)))
-                                   (if bolp (substring name 2) name)
-                                   "")))
-             ;; Strip off the leading "^" for flx matching
-             (flx-name (if bolp (substring name 1) name))
-             cands-left
-             cands-to-sort)
-
-        ;; Filter out non-matching candidates
-        (dolist (cand cands)
-          (when (string-match-p fuzzy-regex cand)
-            (push cand cands-left)))
-
-        ;; pre-sort the candidates by length before partitioning
-        (setq cands-left (cl-sort cands-left #'< :key #'length))
-
-        ;; partition the candidates into sorted and unsorted groups
-        (dotimes (_ (min (length cands-left) ivy-flx-limit))
-          (push (pop cands-left) cands-to-sort))
-
-        (nconc
-         ;; Compute all of the flx scores in one pass and sort
-         (mapcar #'car
-                 (sort (mapcar
-                        (lambda (cand)
-                          (cons cand
-                                (car (flx-score cand flx-name ivy--flx-cache))))
-                        cands-to-sort)
-                       (lambda (c1 c2)
-                         ;; Break ties by length
-                         (if (/= (cdr c1) (cdr c2))
-                             (> (cdr c1)
-                                (cdr c2))
-                           (< (length (car c1))
-                              (length (car c2)))))))
-
-         ;; Add the unsorted candidates
-         cands-left))
-    (error cands)))
-
-(defun ivy--truncate-string (str width)
-  "Truncate STR to WIDTH."
-  (truncate-string-to-width str width nil nil t))
-
-(defun ivy--format-function-generic (selected-fn other-fn cands separator)
-  "Transform candidates into a string for minibuffer.
-SELECTED-FN is called for the selected candidate, OTHER-FN for the others.
-Both functions take one string argument each.  CANDS is a list of candidates
-and SEPARATOR is used to join them."
-  (let ((i -1))
-    (mapconcat
-     (lambda (str)
-       (let ((curr (eq (cl-incf i) ivy--window-index)))
-         (if curr
-             (funcall selected-fn str)
-           (funcall other-fn str))))
-     cands
-     separator)))
-
-(defun ivy-format-function-default (cands)
-  "Transform CANDS into a string for minibuffer."
-  (ivy--format-function-generic
-   (lambda (str)
-     (ivy--add-face str 'ivy-current-match))
-   #'identity
-   cands
-   "\n"))
-
-(defun ivy-format-function-arrow (cands)
-  "Transform CANDS into a string for minibuffer."
-  (ivy--format-function-generic
-   (lambda (str)
-     (concat "> " (ivy--add-face str 'ivy-current-match)))
-   (lambda (str)
-     (concat "  " str))
-   cands
-   "\n"))
-
-(defun ivy-format-function-line (cands)
-  "Transform CANDS into a string for minibuffer.
-Note that since Emacs 27, `ivy-current-match' needs to have :extend t attribute.
-It has it by default, but the current theme also needs to set it."
-  (ivy--format-function-generic
-   (lambda (str)
-     (ivy--add-face (concat str "\n") 'ivy-current-match))
-   (lambda (str)
-     (concat str "\n"))
-   cands
-   ""))
-
-(defalias 'ivy-add-face-text-property
-  (if (fboundp 'add-face-text-property)
-      (lambda (start end face &optional object append)
-        (add-face-text-property start end face append object))
-    (lambda (start end face &optional object append)
-      (funcall (if append
-                   #'font-lock-append-text-property
-                 #'font-lock-prepend-text-property)
-               start end 'face face object)))
-  "Compatibility shim for `add-face-text-property'.
-Fall back on `font-lock-prepend-text-property' in Emacs versions
-prior to 24.4 (`font-lock-append-text-property' when APPEND is
-non-nil).
-Note: The usual last two arguments are flipped for convenience.")
-
-(defun ivy--highlight-ignore-order (str)
-  "Highlight STR, using the ignore-order method."
-  (when (consp ivy--old-re)
-    (let ((i 1))
-      (dolist (re ivy--old-re)
-        (when (string-match (car re) str)
-          (ivy-add-face-text-property
-           (match-beginning 0) (match-end 0)
-           (ivy--minibuffer-face i)
-           str))
-        (cl-incf i))))
-  str)
-
-(defun ivy--highlight-fuzzy (str)
-  "Highlight STR, using the fuzzy method."
-  (if (and ivy--flx-featurep
-           (eq (ivy-alist-setting ivy-re-builders-alist) 'ivy--regex-fuzzy))
-      (let ((flx-name (ivy--remove-prefix "^" ivy-text)))
-        (ivy--flx-propertize
-         (cons (flx-score str flx-name ivy--flx-cache) str)))
-    (ivy--highlight-default str)))
-
-(defcustom ivy-use-group-face-if-no-groups t
-  "If t, and the expression has no subgroups, highlight whole match as a group.
-
-It will then use the second face (first of the \"group\" faces)
-of `ivy-minibuffer-faces'.  Otherwise, always use the first face
-in this case."
-  :type 'boolean)
-
-(defun ivy--highlight-default (str)
-  "Highlight STR, using the default method."
-  (unless ivy--old-re
-    (setq ivy--old-re ivy-regex))
-  (let ((regexps
-         (if (listp ivy--old-re)
-             (mapcar #'car (cl-remove-if-not #'cdr ivy--old-re))
-           (list ivy--old-re)))
-        start)
-    (dolist (re regexps)
-      (ignore-errors
-        (while (and (string-match re str start)
-                    (> (- (match-end 0) (match-beginning 0)) 0))
-          (setq start (match-end 0))
-          (let ((i 0)
-                (n 0)
-                prev)
-            (while (<= i ivy--subexps)
-              (let ((beg (match-beginning i))
-                    (end (match-end i)))
-                (when (and beg end)
-                  (unless (and prev (= prev beg))
-                    (cl-incf n))
-                  (let ((face
-                         (cond ((and ivy-use-group-face-if-no-groups
-                                     (zerop ivy--subexps))
-                                (cadr ivy-minibuffer-faces))
-                               ((zerop i)
-                                (car ivy-minibuffer-faces))
-                               (t
-                                (ivy--minibuffer-face n)))))
-                    (ivy-add-face-text-property beg end face str))
-                  (unless (zerop i)
-                    (setq prev end))))
-              (cl-incf i)))))))
-  str)
-
-(defun ivy--format-minibuffer-line (str)
-  "Format line STR for use in minibuffer."
-  (let* ((str (ivy-cleanup-string (copy-sequence str)))
-         (str (if (eq ivy-display-style 'fancy)
-                  (if (memq (ivy-state-caller ivy-last)
-                            ivy-highlight-grep-commands)
-                      (let* ((start (if (string-match "\\`[^:]+:\\(?:[^:]+:\\)?" str)
-                                        (match-end 0) 0))
-                             (file (substring str 0 start))
-                             (match (substring str start)))
-                        (concat file (funcall ivy--highlight-function match)))
-                    (funcall ivy--highlight-function str))
-                str))
-         (olen (length str))
-         (annot (plist-get completion-extra-properties :annotation-function)))
-    (add-text-properties
-     0 olen
-     '(mouse-face
-       ivy-minibuffer-match-highlight
-       help-echo
-       (format
-        (if tooltip-mode
-            "mouse-1: %s\nmouse-3: %s"
-          "mouse-1: %s   mouse-3: %s")
-        ivy-mouse-1-tooltip ivy-mouse-3-tooltip))
-     str)
-    (when annot
-      (setq str (concat str (funcall annot str)))
-      (ivy-add-face-text-property
-       olen (length str) 'ivy-completions-annotations str))
-    str))
-
-(defun ivy-read-file-transformer (str)
-  "Transform candidate STR when reading files."
-  (if (ivy--dirname-p str)
-      (propertize str 'face 'ivy-subdir)
-    str))
-
-(defun ivy--minibuffer-index-bounds (idx len wnd-len)
-  (let* ((half-height (/ wnd-len 2))
-         (start (max 0
-                     (min (- idx half-height)
-                          (- len (1- wnd-len)))))
-         (end (min (+ start (1- wnd-len)) len)))
-    (list start end (- idx start))))
-
-(defun ivy--format (cands)
-  "Return a string for CANDS suitable for display in the minibuffer.
-CANDS is a list of candidates that :display-transformer can turn into strings."
-  (setq ivy--length (length cands))
-  (when (>= ivy--index ivy--length)
-    (ivy-set-index (max (1- ivy--length) 0)))
-  (if (null cands)
-      (setf (ivy-state-current ivy-last) "")
-    (let ((cur (nth ivy--index cands)))
-      (setf (ivy-state-current ivy-last) (if (stringp cur)
-                                             (copy-sequence cur)
-                                           cur)))
-    (let* ((bnd (ivy--minibuffer-index-bounds
-                 ivy--index ivy--length ivy-height))
-           (wnd-cands (cl-subseq cands (car bnd) (cadr bnd)))
-           (case-fold-search (ivy--case-fold-p ivy-text))
-           transformer-fn)
-      (setq ivy--window-index (nth 2 bnd))
-      (when (setq transformer-fn (ivy-state-display-transformer-fn ivy-last))
-        (with-ivy-window
-          (with-current-buffer (ivy-state-buffer ivy-last)
-            (setq wnd-cands (mapcar transformer-fn wnd-cands)))))
-      (ivy--wnd-cands-to-str wnd-cands))))
-
-(defun ivy--wnd-cands-to-str (wnd-cands)
-  (let ((str (concat "\n"
-                     (funcall (ivy-alist-setting ivy-format-functions-alist)
-                              (condition-case nil
-                                  (mapcar
-                                   #'ivy--format-minibuffer-line
-                                   wnd-cands)
-                                (error wnd-cands))))))
-    (put-text-property 0 (length str) 'read-only nil str)
-    str))
-
-(defvar recentf-list)
-(defvar bookmark-alist)
-
-(defcustom ivy-virtual-abbreviate 'name
-  "The mode of abbreviation for virtual buffer names."
-  :type '(choice
-          (const :tag "Only name" name)
-          (const :tag "Abbreviated path" abbreviate)
-          (const :tag "Full path" full)
-          ;; eventually, uniquify
-          ))
-(declare-function bookmark-maybe-load-default-file "bookmark")
-(declare-function bookmark-get-filename "bookmark")
-
-(defun ivy--virtual-buffers ()
-  "Adapted from `ido-add-virtual-buffers-to-list'."
-  (require 'bookmark)
-  (unless recentf-mode
-    (recentf-mode 1))
-  (bookmark-maybe-load-default-file)
-  (let* ((vb-bkm (delete "   - no file -"
-                         (delq nil (mapcar #'bookmark-get-filename
-                                           bookmark-alist))))
-         (vb-list (cond ((eq ivy-use-virtual-buffers 'recentf)
-                         recentf-list)
-                        ((eq ivy-use-virtual-buffers 'bookmarks)
-                         vb-bkm)
-                        (ivy-use-virtual-buffers
-                         (append recentf-list vb-bkm))
-                        (t nil)))
-         virtual-buffers)
-    (dolist (head vb-list)
-      (let* ((file-name (if (stringp head)
-                            head
-                          (cdr head)))
-             (name (cond ((eq ivy-virtual-abbreviate 'name)
-                          (file-name-nondirectory file-name))
-                         ((eq ivy-virtual-abbreviate 'abbreviate)
-                          (abbreviate-file-name file-name))
-                         (t
-                          (expand-file-name file-name)))))
-        (when (equal name "")
-          (setq name
-                (if (consp head)
-                    (car head)
-                  (file-name-nondirectory (directory-file-name file-name)))))
-        (unless (or (equal name "")
-                    (get-file-buffer file-name)
-                    (assoc name virtual-buffers))
-          (push (cons (copy-sequence name) file-name) virtual-buffers))))
-    (when virtual-buffers
-      (dolist (comp virtual-buffers)
-        (put-text-property 0 (length (car comp))
-                           'face 'ivy-virtual
-                           (car comp)))
-      (setq ivy--virtual-buffers (nreverse virtual-buffers))
-      (mapcar #'car ivy--virtual-buffers))))
-
-(defcustom ivy-ignore-buffers '("\\` " "\\`\\*tramp/")
-  "List of regexps or functions matching buffer names to ignore."
-  :type '(repeat (choice regexp function)))
-
-(defvar ivy-switch-buffer-faces-alist '((dired-mode . ivy-subdir)
-                                        (org-mode . ivy-org))
-  "Store face customizations for `ivy-switch-buffer'.
-Each KEY is `major-mode', each VALUE is a face name.")
-
-(defun ivy--buffer-list (str &optional virtual predicate)
-  "Return the buffers that match STR.
-If VIRTUAL is non-nil, add virtual buffers.
-If optional argument PREDICATE is non-nil, use it to test each
-possible match.  See `all-completions' for further information."
-  (delete-dups
-   (nconc
-    (mapcar
-     (lambda (x)
-       (let* ((buf (get-buffer x))
-              (dir (buffer-local-value 'default-directory buf))
-              (face (if (and dir
-                             (ignore-errors
-                               (file-remote-p dir)))
-                        'ivy-remote
-                      (cdr (assq (buffer-local-value 'major-mode buf)
-                                 ivy-switch-buffer-faces-alist)))))
-         (if face
-             (propertize x 'face face)
-           x)))
-     (all-completions str #'internal-complete-buffer predicate))
-    (and virtual
-         (ivy--virtual-buffers)))))
-
-(defvar ivy-views (and nil
-                       `(("ivy + *scratch* {}"
-                          (vert
-                           (file ,(expand-file-name "ivy.el"))
-                           (buffer "*scratch*")))
-                         ("swiper + *scratch* {}"
-                          (horz
-                           (file ,(expand-file-name "swiper.el"))
-                           (buffer "*scratch*")))))
-  "Store window configurations selectable by `ivy-switch-buffer'.
-
-The default value is given as an example.
-
-Each element is a list of (NAME VIEW). NAME is a string, it's
-recommended to end it with a distinctive snippet e.g. \"{}\" so
-that it's easy to distinguish the window configurations.
-
-VIEW is either a TREE or a window-configuration (see
-`ivy--get-view-config').
-
-TREE is a nested list with the following valid cars:
-- vert: split the window vertically
-- horz: split the window horizontally
-- file: open the specified file
-- buffer: open the specified buffer
-
-TREE can be nested multiple times to have multiple window splits.")
-
-(defun ivy-default-view-name ()
-  "Return default name for new view."
-  (let* ((default-view-name
-          (concat "{} "
-                  (mapconcat #'identity
-                             (sort
-                              (mapcar (lambda (w)
-                                        (let* ((b (window-buffer w))
-                                               (f (buffer-file-name b)))
-                                          (if f
-                                              (file-name-nondirectory f)
-                                            (buffer-name b))))
-                                      (window-list))
-                              #'string-lessp)
-                             " ")))
-         (view-name-re (concat "\\`"
-                               (regexp-quote default-view-name)
-                               " \\([0-9]+\\)"))
-         old-view)
-    (cond ((setq old-view
-                 (cl-find-if
-                  (lambda (x)
-                    (string-match view-name-re (car x)))
-                  ivy-views))
-           (format "%s %d"
-                   default-view-name
-                   (1+ (string-to-number
-                        (match-string 1 (car old-view))))))
-          ((assoc default-view-name ivy-views)
-           (concat default-view-name " 1"))
-          (t
-           default-view-name))))
-
-(defun ivy--get-view-config ()
-  "Get `current-window-configuration' for `ivy-views'."
-  (dolist (w (window-list))
-    (set-window-parameter w 'ivy-view-data
-                          (with-current-buffer (window-buffer w)
-                            (cond (buffer-file-name
-                                   (list 'file buffer-file-name (point)))
-                                  ((eq major-mode 'dired-mode)
-                                   (list 'file default-directory (point)))
-                                  (t
-                                   (list 'buffer (buffer-name) (point)))))))
-  (let ((window-persistent-parameters
-         (append window-persistent-parameters
-                 (list (cons 'ivy-view-data t)))))
-    (current-window-configuration)))
-
-(defun ivy-push-view (&optional arg)
-  "Push the current window tree on `ivy-views'.
-
-When ARG is non-nil, replace a selected item on `ivy-views'.
-
-Currently, the split configuration (i.e. horizontal or vertical)
-and point positions are saved, but the split positions aren't.
-Use `ivy-pop-view' to delete any item from `ivy-views'."
-  (interactive "P")
-  (let* ((view (ivy--get-view-config))
-         (view-name
-          (if arg
-              (ivy-read "Update view: " ivy-views)
-            (ivy-read "Name view: " nil
-                      :initial-input (ivy-default-view-name)))))
-    (when view-name
-      (let ((x (assoc view-name ivy-views)))
-        (if x
-            (setcdr x (list view))
-          (push (list view-name view) ivy-views))))))
-
-(defun ivy-pop-view-action (view)
-  "Delete VIEW from `ivy-views'."
-  (setq ivy-views (delete view ivy-views))
-  (setq ivy--all-candidates
-        (delete (car view) ivy--all-candidates))
-  (setq ivy--old-cands nil))
-
-(defun ivy-pop-view ()
-  "Delete a view to delete from `ivy-views'."
-  (interactive)
-  (ivy-read "Pop view: " ivy-views
-            :preselect (caar ivy-views)
-            :action #'ivy-pop-view-action
-            :caller 'ivy-pop-view))
-
-(defun ivy-source-views ()
-  "Return the name of the views saved in `ivy-views'."
-  (mapcar #'car ivy-views))
-
-(ivy-set-sources
- 'ivy-switch-buffer
- '((original-source)
-   (ivy-source-views)))
-
-(defun ivy-set-view-recur (view)
-  "Set VIEW recursively."
-  (cond  ((window-configuration-p view)
-          (set-window-configuration view)
-          (dolist (w (window-list))
-            (with-selected-window w
-              (ivy-set-view-recur
-               (window-parameter w 'ivy-view-data)))))
-         ((eq (car view) 'vert)
-         (let* ((wnd1 (selected-window))
-                (wnd2 (split-window-vertically))
-                (views (cdr view))
-                (v (pop views))
-                (temp-wnd))
-           (with-selected-window wnd1
-             (ivy-set-view-recur v))
-           (while (setq v (pop views))
-             (with-selected-window wnd2
-               (when views
-                 (setq temp-wnd (split-window-vertically)))
-               (ivy-set-view-recur v)
-               (when views
-                 (setq wnd2 temp-wnd))))))
-        ((eq (car view) 'horz)
-         (let* ((wnd1 (selected-window))
-                (wnd2 (split-window-horizontally))
-                (views (cdr view))
-                (v (pop views))
-                (temp-wnd))
-           (with-selected-window wnd1
-             (ivy-set-view-recur v))
-           (while (setq v (pop views))
-             (with-selected-window wnd2
-               (when views
-                 (setq temp-wnd (split-window-horizontally)))
-               (ivy-set-view-recur v)
-               (when views
-                 (setq wnd2 temp-wnd))))))
-        ((eq (car view) 'file)
-         (let* ((name (nth 1 view))
-                (virtual (assoc name ivy--virtual-buffers))
-                buffer)
-           (cond ((setq buffer (get-buffer name))
-                  (switch-to-buffer buffer nil 'force-same-window))
-                 (virtual
-                  (find-file (cdr virtual)))
-                 ((file-exists-p name)
-                  (find-file name))))
-         (when (and (> (length view) 2)
-                    (numberp (nth 2 view)))
-           (goto-char (nth 2 view))))
-        ((eq (car view) 'buffer)
-         (switch-to-buffer (nth 1 view))
-         (when (and (> (length view) 2)
-                    (numberp (nth 2 view)))
-           (goto-char (nth 2 view))))
-        ((eq (car view) 'sexp)
-         (eval (nth 1 view)))))
-
-(defun ivy--switch-buffer-action (buffer)
-  "Switch to BUFFER.
-BUFFER may be a string or nil."
-  (if (zerop (length buffer))
-      (switch-to-buffer
-       ivy-text nil 'force-same-window)
-    (let ((virtual (assoc buffer ivy--virtual-buffers))
-          (view (assoc buffer ivy-views)))
-      (cond ((and virtual
-                  (not (get-buffer buffer)))
-             (find-file (cdr virtual)))
-            (view
-             (delete-other-windows)
-             (let (
-                   ;; silence "Directory has changed on disk"
-                   (inhibit-message t))
-               (ivy-set-view-recur (cadr view))))
-            (t
-             (switch-to-buffer
-              buffer nil 'force-same-window))))))
-
-(defun ivy--switch-buffer-other-window-action (buffer)
-  "Switch to BUFFER in other window.
-BUFFER may be a string or nil."
-  (if (zerop (length buffer))
-      (switch-to-buffer-other-window ivy-text)
-    (let ((virtual (assoc buffer ivy--virtual-buffers)))
-      (if (and virtual
-               (not (get-buffer buffer)))
-          (find-file-other-window (cdr virtual))
-        (switch-to-buffer-other-window buffer)))))
-
-(defun ivy--rename-buffer-action (buffer)
-  "Rename BUFFER."
-  (let ((new-name (read-string "Rename buffer (to new name): ")))
-    (with-current-buffer buffer
-      (rename-buffer new-name))))
-
-(defun ivy--find-file-action (buffer)
-  "Find file from BUFFER's directory."
-  (let* ((virtual (assoc buffer ivy--virtual-buffers))
-         (default-directory (if virtual
-                                (file-name-directory (cdr virtual))
-                              (buffer-local-value 'default-directory
-                                                  (or (get-buffer buffer)
-                                                      (current-buffer))))))
-    (call-interactively (if (functionp 'counsel-find-file)
-                            #'counsel-find-file
-                          #'find-file))))
-
-(defun ivy--kill-buffer-or-virtual (buffer)
-  (if (get-buffer buffer)
-      (kill-buffer buffer)
-    (setq recentf-list (delete
-                        (cdr (assoc buffer ivy--virtual-buffers))
-                        recentf-list))))
-
-(defun ivy--kill-current-candidate ()
-  (setf (ivy-state-preselect ivy-last) ivy--index)
-  (setq ivy--old-re nil)
-  (setq ivy--all-candidates (delete (ivy-state-current ivy-last) ivy--all-candidates))
-  (let ((ivy--recompute-index-inhibit t))
-    (ivy--exhibit)))
-
-(defun ivy--kill-current-candidate-buffer ()
-  (setf (ivy-state-preselect ivy-last) ivy--index)
-  (setq ivy--old-re nil)
-  (setq ivy--all-candidates (ivy--buffer-list "" ivy-use-virtual-buffers nil))
-  (let ((ivy--recompute-index-inhibit t))
-    (ivy--exhibit)))
-
-(defun ivy--kill-buffer-action (buffer)
-  "Kill BUFFER."
-  (ivy--kill-buffer-or-virtual buffer)
-  (unless (buffer-live-p (ivy-state-buffer ivy-last))
-    (setf (ivy-state-buffer ivy-last)
-          (with-ivy-window (current-buffer))))
-  (ivy--kill-current-candidate-buffer))
-
-(defvar ivy-switch-buffer-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "C-k") 'ivy-switch-buffer-kill)
-    map))
-
-(defun ivy-switch-buffer-kill ()
-  "When at end-of-line, kill the current buffer in `ivy-switch-buffer'.
-Otherwise, forward to `ivy-kill-line'."
-  (interactive)
-  (if (not (eolp))
-      (ivy-kill-line)
-    (ivy--kill-buffer-action
-     (ivy-state-current ivy-last))))
-
-(ivy-set-actions
- 'ivy-switch-buffer
- '(("f"
-    ivy--find-file-action
-    "find file")
-   ("j"
-    ivy--switch-buffer-other-window-action
-    "other window")
-   ("k"
-    ivy--kill-buffer-action
-    "kill")
-   ("r"
-    ivy--rename-buffer-action
-    "rename")))
-
-(ivy-set-actions
- t
- `(("i" ,(lambda (x) (insert (if (stringp x) x (car x)))) "insert")
-   ("w" ,(lambda (x) (kill-new (if (stringp x) x (car x)))) "copy")))
-
-(defun ivy--switch-buffer-matcher (regexp candidates)
-  "Return REGEXP matching CANDIDATES.
-Skip buffers that match `ivy-ignore-buffers'."
-  (let ((res (ivy--re-filter regexp candidates)))
-    (if (or (null ivy-use-ignore)
-            (null ivy-ignore-buffers))
-        res
-      (or (cl-remove-if
-           (lambda (buf)
-             (cl-find-if
-              (lambda (f-or-r)
-                (if (functionp f-or-r)
-                    (funcall f-or-r buf)
-                  (string-match-p f-or-r buf)))
-              ivy-ignore-buffers))
-           res)
-          (and (eq ivy-use-ignore t)
-               res)))))
-
-(defun ivy-append-face (str face)
-  "Append to STR the property FACE."
-  (setq str (copy-sequence str))
-  (ivy-add-face-text-property 0 (length str) face str t)
-  str)
-
-(defun ivy-switch-buffer-transformer (str)
-  "Transform candidate STR when switching buffers."
-  (let ((b (get-buffer str)))
-    (if (and b (buffer-file-name b))
-        (cond
-          ((and (not (ignore-errors (file-remote-p (buffer-file-name b))))
-                (not (verify-visited-file-modtime b)))
-           (ivy-append-face str 'ivy-modified-outside-buffer))
-          ((buffer-modified-p b)
-           (ivy-append-face str 'ivy-modified-buffer))
-          (t str))
-      str)))
-
-(defun ivy-switch-buffer-occur (cands)
-  "Occur function for `ivy-switch-buffer' using `ibuffer'.
-CANDS are the candidates to be displayed."
-  (unless cands
-    (setq cands (all-completions ivy-text #'internal-complete-buffer)))
-  (ibuffer
-   nil (buffer-name)
-   `((or ,@(cl-mapcan
-            (lambda (cand)
-              (unless (eq (get-text-property 0 'face cand) 'ivy-virtual)
-                `((name . ,(format "\\_<%s\\_>" (regexp-quote cand))))))
-            cands)))))
-
-;;;###autoload
-(defun ivy-switch-buffer ()
-  "Switch to another buffer."
-  (interactive)
-  (ivy-read "Switch to buffer: " #'internal-complete-buffer
-            :keymap ivy-switch-buffer-map
-            :preselect (buffer-name (other-buffer (current-buffer)))
-            :action #'ivy--switch-buffer-action
-            :matcher #'ivy--switch-buffer-matcher
-            :caller 'ivy-switch-buffer))
-
-(ivy-configure 'ivy-switch-buffer
-  :occur #'ivy-switch-buffer-occur
-  :display-transformer-fn #'ivy-switch-buffer-transformer)
-
-;;;###autoload
-(defun ivy-switch-view ()
-  "Switch to one of the window views stored by `ivy-push-view'."
-  (interactive)
-  (let ((ivy-initial-inputs-alist
-         '((ivy-switch-buffer . "{}"))))
-    (ivy-switch-buffer)))
-
-;;;###autoload
-(defun ivy-switch-buffer-other-window ()
-  "Switch to another buffer in another window."
-  (interactive)
-  (ivy-read "Switch to buffer in other window: " #'internal-complete-buffer
-            :matcher #'ivy--switch-buffer-matcher
-            :preselect (buffer-name (other-buffer (current-buffer)))
-            :action #'ivy--switch-buffer-other-window-action
-            :keymap ivy-switch-buffer-map
-            :caller 'ivy-switch-buffer-other-window))
-
-(ivy-configure 'ivy-switch-buffer-other-window
-  :occur #'ivy-switch-buffer-occur)
-
-(defun ivy--yank-handle-case-fold (text)
-  (if (and (> (length ivy-text) 0)
-           (string= (downcase ivy-text) ivy-text))
-      (downcase text)
-    text))
-
-(defun ivy--yank-by (fn &rest args)
-  "Pull buffer text from current line into search string.
-The region to extract is determined by the respective values of
-point before and after applying FN to ARGS."
-  (let (text)
-    (with-ivy-window
-      (let ((beg (point))
-            (bol (line-beginning-position))
-            (eol (line-end-position))
-            end)
-        (unwind-protect
-             (progn (apply fn args)
-                    (setq end (goto-char (max bol (min (point) eol))))
-                    (setq text (buffer-substring-no-properties beg end))
-                    (ivy--pulse-region beg end))
-          (unless text
-            (goto-char beg)))))
-    (when text
-      (insert (replace-regexp-in-string
-               "  +" " "
-               (ivy--yank-handle-case-fold text)
-               t t)))))
-
-(defun ivy-yank-word (&optional arg)
-  "Pull next word from buffer into search string.
-If optional ARG is non-nil, pull in the next ARG
-words (previous if ARG is negative)."
-  (interactive "p")
-  (ivy--yank-by #'forward-word arg))
-
-(defun ivy-yank-symbol (&optional arg)
-  "Pull next symbol from buffer into search string.
-If optional ARG is non-nil, pull in the next ARG
-symbols (previous if ARG is negative)."
-  (interactive "p")
-  ;; Emacs < 24.4 compatibility
-  (unless (fboundp 'forward-symbol)
-    (require 'thingatpt))
-  (ivy--yank-by #'forward-symbol (or arg 1)))
-
-(defun ivy-yank-char (&optional arg)
-  "Pull next character from buffer into search string.
-If optional ARG is non-nil, pull in the next ARG
-characters (previous if ARG is negative)."
-  (interactive "p")
-  (ivy--yank-by #'forward-char arg))
-
-(defvar ivy--pulse-overlay nil
-  "Overlay used to highlight yanked word.")
-
-(defvar ivy--pulse-timer nil
-  "Timer used to dispose of `ivy--pulse-overlay'.")
-
-(defcustom ivy-pulse-delay 0.5
-  "Number of seconds to display `ivy-yanked-word' highlight.
-When nil, disable highlighting."
-  :type '(choice
-          (number :tag "Delay in seconds")
-          (const :tag "Disable" nil)))
-
-(defun ivy--pulse-region (start end)
-  "Temporarily highlight text between START and END.
-The \"pulse\" duration is determined by `ivy-pulse-delay'."
-  (when ivy-pulse-delay
-    (if ivy--pulse-overlay
-        (let ((ostart (overlay-start ivy--pulse-overlay))
-              (oend (overlay-end ivy--pulse-overlay)))
-          (when (< end start)
-            (cl-rotatef start end))
-          ;; Extend the existing overlay's region to include START..END,
-          ;; but only if the two regions are contiguous.
-          (move-overlay ivy--pulse-overlay
-                        (if (= start oend) ostart start)
-                        (if (= end ostart) oend end)))
-      (setq ivy--pulse-overlay (make-overlay start end))
-      (overlay-put ivy--pulse-overlay 'face 'ivy-yanked-word))
-    (when ivy--pulse-timer
-      (cancel-timer ivy--pulse-timer))
-    (setq ivy--pulse-timer
-          (run-at-time ivy-pulse-delay nil #'ivy--pulse-cleanup))))
-
-(defun ivy--pulse-cleanup ()
-  "Cancel `ivy--pulse-timer' and delete `ivy--pulse-overlay'."
-  (when ivy--pulse-timer
-    (cancel-timer ivy--pulse-timer)
-    (setq ivy--pulse-timer nil))
-  (when ivy--pulse-overlay
-    (delete-overlay ivy--pulse-overlay)
-    (setq ivy--pulse-overlay nil)))
-
-(defun ivy-kill-ring-save ()
-  "Store the current candidates into the kill ring.
-If the region is active, forward to `kill-ring-save' instead."
-  (interactive)
-  (if (region-active-p)
-      (call-interactively 'kill-ring-save)
-    (kill-new
-     (mapconcat
-      #'identity
-      ivy--old-cands
-      "\n"))))
-
-(defun ivy-insert-current ()
-  "Make the current candidate into current input.
-Don't finish completion."
-  (interactive)
-  (delete-minibuffer-contents)
-  (let ((end (and ivy--directory
-                  (ivy--dirname-p (ivy-state-current ivy-last))
-                  -1)))
-    (insert (substring-no-properties
-             (ivy-state-current ivy-last) 0 end))))
-
-(defun ivy-insert-current-full ()
-  "Insert the full Yank the current directory into the minibuffer."
-  (interactive)
-  (insert ivy--directory))
-
-(defcustom ivy-preferred-re-builders
-  '((ivy--regex-plus . "ivy")
-    (ivy--regex-ignore-order . "order")
-    (ivy--regex-fuzzy . "fuzzy"))
-  "Alist of preferred re-builders with display names.
-This list can be rotated with `ivy-rotate-preferred-builders'."
-  :type '(alist :key-type function :value-type string))
-
-(defun ivy-rotate-preferred-builders ()
-  "Switch to the next re builder in `ivy-preferred-re-builders'."
-  (interactive)
-  (when ivy-preferred-re-builders
-    (setq ivy--old-re nil)
-    (setq ivy--regex-function
-          (let ((cell (assq ivy--regex-function ivy-preferred-re-builders)))
-            (car (or (cadr (memq cell ivy-preferred-re-builders))
-                     (car ivy-preferred-re-builders)))))))
-
-(defun ivy-toggle-fuzzy ()
-  "Toggle the re builder between `ivy--regex-fuzzy' and `ivy--regex-plus'."
-  (interactive)
-  (setq ivy--old-re nil)
-  (if (eq ivy--regex-function 'ivy--regex-fuzzy)
-      (setq ivy--regex-function 'ivy--regex-plus)
-    (setq ivy--regex-function 'ivy--regex-fuzzy)))
-
-(defun ivy--label-and-delete-dups (entries)
-  "Label ENTRIES with history indices."
-  (let ((ht (make-hash-table :test 'equal))
-        (idx 0)
-        entry
-        accum)
-    (while (setq entry (pop entries))
-      (unless (gethash entry ht)
-        (puthash entry t ht)
-        (push `(,entry . ,idx) accum))
-      (cl-incf idx))
-    (nreverse accum)))
-
-(defvar ivy--reverse-i-search-symbol nil
-  "Store the history symbol.")
-
-(defun ivy-reverse-i-search-kill ()
-  "Remove the current item from history"
-  (interactive)
-  (if (not (eolp))
-      (ivy-kill-line)
-    (let ((current (ivy-state-current ivy-last)))
-      (if (symbolp ivy--reverse-i-search-symbol)
-          (set
-           ivy--reverse-i-search-symbol
-           (delete current (symbol-value ivy--reverse-i-search-symbol)))
-        (ring-remove
-         ivy--reverse-i-search-symbol
-         (ring-member ivy--reverse-i-search-symbol (ivy-state-current ivy-last)))))
-    (ivy--kill-current-candidate)))
-
-(defvar ivy-reverse-i-search-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "C-k") 'ivy-reverse-i-search-kill)
-    map))
-
-(defun ivy-history-contents (history)
-  "Copy contents of HISTORY.
-A copy is necessary so that we don't clobber any string attributes.
-Also set `ivy--reverse-i-search-symbol' to HISTORY."
-  (setq ivy--reverse-i-search-symbol history)
-  (cond ((symbolp history)
-         (ivy--label-and-delete-dups
-          (copy-sequence (symbol-value history))))
-        ((ring-p history)
-         (ivy--label-and-delete-dups
-          (when (> (ring-size history) 0)
-            (ring-elements history))))
-        ((sequencep history)
-         (ivy--label-and-delete-dups
-          (copy-sequence history)))
-        (t
-         (error "Expected a symbol, ring, or sequence: %S" history))))
-
-(defun ivy-reverse-i-search ()
-  "Enter a recursive `ivy-read' session using the current history.
-The selected history element will be inserted into the minibuffer.
-\\
-You can also delete an element from history with \\[ivy-reverse-i-search-kill]."
-  (interactive)
-  (cond
-    ((= (minibuffer-depth) 0)
-     (user-error
-      "This command is intended to be called with \"C-r\" from `ivy-read'."))
-    ;; don't recur
-    ((and (> (minibuffer-depth) 1)
-          (eq (ivy-state-caller ivy-last) 'ivy-reverse-i-search)))
-    (t
-     (let ((enable-recursive-minibuffers t)
-           (old-last ivy-last))
-       (ivy-read "Reverse-i-search: "
-                 (ivy-history-contents (ivy-state-history ivy-last))
-                 :keymap ivy-reverse-i-search-map
-                 :action (lambda (x)
-                           (ivy--reset-state
-                            (setq ivy-last old-last))
-                           (delete-minibuffer-contents)
-                           (insert (substring-no-properties (car x)))
-                           (ivy--cd-maybe))
-                 :caller 'ivy-reverse-i-search)))))
-
-(defun ivy-restrict-to-matches ()
-  "Restrict candidates to current input and erase input."
-  (interactive)
-  (delete-minibuffer-contents)
-  (if (ivy-state-dynamic-collection ivy-last)
-      (progn
-        (setf (ivy-state-dynamic-collection ivy-last) nil)
-        (setf (ivy-state-collection ivy-last)
-              (setq ivy--all-candidates ivy--old-cands)))
-    (setq ivy--all-candidates
-          (ivy--filter ivy-text ivy--all-candidates))))
-
-;;* Occur
-(defvar-local ivy-occur-last nil
-  "Buffer-local value of `ivy-last'.
-Can't re-use `ivy-last' because using e.g. `swiper' in the same
-buffer would modify `ivy-last'.")
-
-(defvar ivy-occur-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [mouse-1] 'ivy-occur-click)
-    (define-key map (kbd "RET") 'ivy-occur-press-and-switch)
-    (define-key map (kbd "j") 'ivy-occur-next-line)
-    (define-key map (kbd "k") 'ivy-occur-previous-line)
-    (define-key map (kbd "h") 'backward-char)
-    (define-key map (kbd "l") 'forward-char)
-    (define-key map (kbd "f") 'ivy-occur-press)
-    (define-key map (kbd "g") 'ivy-occur-revert-buffer)
-    (define-key map (kbd "a") 'ivy-occur-read-action)
-    (define-key map (kbd "o") 'ivy-occur-dispatch)
-    (define-key map (kbd "c") 'ivy-occur-toggle-calling)
-    (define-key map (kbd "q") 'quit-window)
-    (define-key map (kbd "R") 'read-only-mode)
-    (define-key map (kbd "C-d") 'ivy-occur-delete-candidate)
-    map)
-  "Keymap for Ivy Occur mode.")
-
-(defun ivy-occur-toggle-calling ()
-  "Toggle `ivy-calling'."
-  (interactive)
-  (if (setq ivy-calling (not ivy-calling))
-      (progn
-        (setq mode-name "Ivy-Occur [calling]")
-        (ivy-occur-press))
-    (setq mode-name "Ivy-Occur"))
-  (force-mode-line-update))
-
-(defun ivy--find-occur-buffer ()
-  (let ((cb (current-buffer)))
-    (cl-find-if
-     (lambda (b)
-       (with-current-buffer b
-         (and (eq major-mode 'ivy-occur-grep-mode)
-              (equal cb (ivy-state-buffer ivy-occur-last)))))
-     (buffer-list))))
-
-(defun ivy--select-occur-buffer ()
-  (let* ((ob (ivy--find-occur-buffer))
-         (ow (cl-find-if (lambda (w) (equal ob (window-buffer w)))
-                         (window-list))))
-    (if ow
-        (select-window ow)
-      (pop-to-buffer ob))))
-
-(defun ivy-occur-next-line (&optional arg)
-  "Move the cursor down ARG lines.
-When `ivy-calling' isn't nil, call `ivy-occur-press'."
-  (interactive "p")
-  (let ((offset (cond ((derived-mode-p 'ivy-occur-grep-mode) 5)
-                      ((derived-mode-p 'ivy-occur-mode) 2))))
-    (if offset
-        (progn
-          (if (< (line-number-at-pos) offset)
-              (progn
-                (goto-char (point-min))
-                (forward-line (1- offset)))
-            (forward-line arg)
-            (when (eolp)
-              (forward-line -1)))
-          (when ivy-calling
-            (ivy-occur-press)))
-      (ivy--select-occur-buffer)
-      (ivy-occur-next-line arg)
-      (ivy-occur-press-and-switch))))
-
-(defun ivy-occur-previous-line (&optional arg)
-  "Move the cursor up ARG lines.
-When `ivy-calling' isn't nil, call `ivy-occur-press'."
-  (interactive "p")
-  (let ((offset (cond ((derived-mode-p 'ivy-occur-grep-mode) 5)
-                      ((derived-mode-p 'ivy-occur-mode) 2))))
-    (if offset
-        (progn
-          (forward-line (- arg))
-          (when (< (line-number-at-pos) offset)
-            (goto-char (point-min))
-            (forward-line (1- offset)))
-          (when ivy-calling
-            (ivy-occur-press)))
-      (ivy--select-occur-buffer)
-      (ivy-occur-previous-line arg)
-      (ivy-occur-press-and-switch))))
-
-(defun ivy-occur-next-error (n &optional reset)
-  "A `next-error-function' for `ivy-occur-mode'."
-  (interactive "p")
-  (when reset
-    (goto-char (point-min)))
-  (setq n (or n 1))
-  (let ((ivy-calling t))
-    (cond ((< n 0) (ivy-occur-previous-line (- n)))
-          (t (ivy-occur-next-line n)))))
-
-(define-derived-mode ivy-occur-mode fundamental-mode "Ivy-Occur"
-  "Major mode for output from \\[ivy-occur].
-
-\\{ivy-occur-mode-map}"
-  (setq-local view-read-only nil))
-
-(defvar ivy-occur-grep-mode-map
-  (let ((map (copy-keymap ivy-occur-mode-map)))
-    (define-key map (kbd "C-x C-q") 'ivy-wgrep-change-to-wgrep-mode)
-    (define-key map "w" 'ivy-wgrep-change-to-wgrep-mode)
-    map)
-  "Keymap for Ivy Occur Grep mode.")
-
-(defun ivy-occur-delete-candidate ()
-  (interactive)
-  (let ((inhibit-read-only t))
-    (delete-region (line-beginning-position)
-                   (1+ (line-end-position)))))
-
-(define-derived-mode ivy-occur-grep-mode grep-mode "Ivy-Occur"
-  "Major mode for output from \\[ivy-occur].
-
-\\{ivy-occur-grep-mode-map}"
-  (setq-local view-read-only nil)
-  (when (fboundp 'wgrep-setup)
-    (wgrep-setup)))
-
-(defun ivy--starts-with-dotslash (str)
-  (string-match-p "\\`\\.[/\\]" str))
-
-(defun ivy--occur-insert-lines (cands)
-  "Insert CANDS into `ivy-occur' buffer."
-  (font-lock-mode -1)
-  (dolist (cand cands)
-    (setq cand
-          (if (string-match "\\`\\(.*:[0-9]+:\\)\\(.*\\)\\'" cand)
-              (let ((file-and-line (match-string 1 cand))
-                    (grep-line (match-string 2 cand)))
-                (concat
-                 (propertize file-and-line 'face 'ivy-grep-info)
-                 (ivy--highlight-fuzzy grep-line)))
-            (ivy--highlight-fuzzy (copy-sequence cand))))
-    (add-text-properties
-     0 (length cand)
-     '(mouse-face
-       highlight
-       help-echo "mouse-1: call ivy-action")
-     cand)
-    (insert (if (string-match-p "\\`.[/\\]" cand) "" "    ")
-            cand ?\n)))
-
-(defun ivy--occur-default (cands)
-  "Insert CANDS into the current occur buffer."
-  (unless cands
-    (let ((coll (ivy-state-collection ivy-last)))
-      (when (arrayp coll)
-        (setq coll (all-completions "" coll (ivy-state-predicate ivy-last))))
-      (setq cands (ivy--filter (ivy-state-text ivy-last) coll))))
-  (ivy-occur-mode)
-  (insert (format "%d candidates:\n" (length cands)))
-  (ivy--occur-insert-lines cands)
-  (read-only-mode))
-
-(defun ivy-occur ()
-  "Stop completion and put the current candidates into a new buffer.
-
-The new buffer remembers current action(s).
-
-While in the *ivy-occur* buffer, selecting a candidate with RET or
-a mouse click will call the appropriate action for that candidate.
-
-There is no limit on the number of *ivy-occur* buffers."
-  (interactive)
-  (if (not (window-minibuffer-p))
-      (user-error "No completion session is active")
-    (let* ((caller (ivy-state-caller ivy-last))
-           (occur-fn (or (plist-get ivy--occurs-list caller)
-                         #'ivy--occur-default))
-           (buffer
-            (generate-new-buffer
-             (format "*ivy-occur%s \"%s\"*"
-                     (if caller
-                         (concat " " (prin1-to-string caller))
-                       "")
-                     ivy-text))))
-      (with-current-buffer buffer
-        (funcall occur-fn ivy--old-cands)
-        (setf (ivy-state-text ivy-last) ivy-text)
-        (setq ivy-occur-last ivy-last))
-      (ivy-exit-with-action
-       (lambda (_)
-         (pop-to-buffer buffer)
-         (setq next-error-last-buffer buffer)
-         (setq-local next-error-function #'ivy-occur-next-error))))))
-
-(defun ivy-occur-revert-buffer ()
-  "Refresh the buffer making it up-to date with the collection.
-
-Currently only works for `swiper'.  In that specific case, the
-*ivy-occur* buffer becomes nearly useless as the original buffer
-is updated, since the line numbers no longer match.
-
-Calling this function is as if you called `ivy-occur' on the
-updated original buffer."
-  (interactive)
-  (let ((caller (ivy-state-caller ivy-occur-last))
-        (ivy-last ivy-occur-last))
-    (let ((inhibit-read-only t)
-          (line (line-number-at-pos)))
-      (erase-buffer)
-      (funcall (or (plist-get ivy--occurs-list caller)
-                   #'ivy--occur-default) nil)
-      (goto-char (point-min))
-      (forward-line (1- line)))
-    (setq ivy-occur-last ivy-last)))
-
-(declare-function wgrep-change-to-wgrep-mode "ext:wgrep")
-
-(defun ivy-wgrep-change-to-wgrep-mode ()
-  "Forward to `wgrep-change-to-wgrep-mode'."
-  (interactive)
-  (if (require 'wgrep nil 'noerror)
-      (wgrep-change-to-wgrep-mode)
-    (error "Package wgrep isn't installed")))
-
-(defun ivy-occur-read-action ()
-  "Select one of the available actions as the current one."
-  (interactive)
-  (let ((ivy-last ivy-occur-last))
-    (ivy-read-action)))
-
-(defun ivy-occur-dispatch ()
-  "Call one of the available actions on the current item."
-  (interactive)
-  (let* ((state-action (ivy-state-action ivy-occur-last))
-         (actions (if (symbolp state-action)
-                      state-action
-                    (copy-sequence state-action))))
-    (unwind-protect
-         (progn
-           (ivy-occur-read-action)
-           (ivy-occur-press))
-      (setf (ivy-state-action ivy-occur-last) actions))))
-
-(defun ivy-occur-click (event)
-  "Execute action for the current candidate.
-EVENT gives the mouse position."
-  (interactive "e")
-  (let ((window (posn-window (event-end event)))
-        (pos (posn-point (event-end event))))
-    (with-current-buffer (window-buffer window)
-      (goto-char pos)
-      (ivy-occur-press))))
-
-(declare-function swiper--cleanup "swiper")
-(declare-function swiper--add-overlays "swiper")
-(defvar ivy-occur-timer nil)
-
-(defun ivy--occur-press-update-window ()
-  (cond
-    ((memq (ivy-state-caller ivy-occur-last)
-           (append '(swiper swiper-isearch) ivy-highlight-grep-commands))
-     (let ((window (ivy-state-window ivy-occur-last))
-           (buffer (ivy-state-buffer ivy-occur-last)))
-       (when (buffer-live-p buffer)
-         (cond ((or (not (window-live-p window))
-                    (equal window (selected-window)))
-                (save-selected-window
-                  (setf (ivy-state-window ivy-occur-last)
-                        (display-buffer buffer))))
-               ((not (equal (window-buffer window) buffer))
-                (with-selected-window window
-                  (switch-to-buffer buffer)))))))
-
-    ((memq (ivy-state-caller ivy-occur-last)
-           '(counsel-describe-function counsel-describe-variable))
-     (setf (ivy-state-window ivy-occur-last)
-           (selected-window))
-     (selected-window))))
-
-(defun ivy--occur-press-buffer ()
-  (let ((buffer (ivy-state-buffer ivy-last)))
-    (if (buffer-live-p buffer)
-        buffer
-      (current-buffer))))
-
-(defun ivy-occur-press ()
-  "Execute action for the current candidate."
-  (interactive)
-  (ivy--occur-press-update-window)
-  (when (save-excursion
-          (beginning-of-line)
-          (looking-at "\\(?:./\\|    \\)\\(.*\\)$"))
-    (let* ((ivy-last ivy-occur-last)
-           (ivy-text (ivy-state-text ivy-last))
-           (str (buffer-substring
-                 (match-beginning 1)
-                 (match-end 1)))
-           (offset (or (get-text-property 0 'offset str) 0))
-           (coll (ivy-state-collection ivy-last))
-           (action (ivy--get-action ivy-last))
-           (ivy-exit 'done))
-      (with-ivy-window
-        (with-current-buffer (ivy--occur-press-buffer)
-          (save-restriction
-            (widen)
-            (funcall action
-                     (if (and (consp coll)
-                              (consp (car coll)))
-                         (assoc str coll)
-                       (substring str offset)))))
-        (if (memq (ivy-state-caller ivy-last)
-                  (append '(swiper swiper-isearch) ivy-highlight-grep-commands))
-            (with-current-buffer (window-buffer (selected-window))
-              (swiper--cleanup)
-              (swiper--add-overlays
-               (ivy--regex ivy-text)
-               (line-beginning-position)
-               (line-end-position)
-               (selected-window))
-              (when (timerp ivy-occur-timer)
-                (cancel-timer ivy-occur-timer))
-              (setq ivy-occur-timer
-                    (run-at-time 1.0 nil 'swiper--cleanup))))))))
-
-(defun ivy-occur-press-and-switch ()
-  "Execute action for the current candidate and switch window."
-  (interactive)
-  (ivy-occur-press)
-  (select-window (ivy--get-window ivy-occur-last)))
-
-(defun ivy--marked-p ()
-  (member (ivy-state-current ivy-last) ivy-marked-candidates))
-
-(defun ivy--unmark (cand)
-  (setcar (member cand ivy--all-candidates)
-          (setcar (member cand ivy--old-cands)
-                  (substring cand (length ivy-mark-prefix))))
-  (setq ivy-marked-candidates
-        (delete cand ivy-marked-candidates)))
-
-(defun ivy--mark (cand)
-  (let ((marked-cand (concat ivy-mark-prefix cand)))
-    (setcar (member cand ivy--all-candidates)
-            (setcar (member cand ivy--old-cands) marked-cand))
-    (setq ivy-marked-candidates
-          (append ivy-marked-candidates (list marked-cand)))))
-
-(defun ivy-mark ()
-  "Mark the selected candidate and move to the next one.
-
-In `ivy-call', :action will be called in turn for all marked
-candidates.
-
-However, if :multi-action was supplied to `ivy-read', then it
-will be called with `ivy-marked-candidates'. This way, it can
-make decisions based on the whole marked list."
-  (interactive)
-  (unless (ivy--marked-p)
-    (ivy--mark (ivy-state-current ivy-last)))
-  (ivy-next-line))
-
-(defun ivy-unmark ()
-  "Unmark the selected candidate and move to the next one."
-  (interactive)
-  (when (ivy--marked-p)
-    (ivy--unmark (ivy-state-current ivy-last)))
-  (ivy-next-line))
-
-(defun ivy-unmark-backward ()
-  "Move to the previous candidate and unmark it."
-  (interactive)
-  (ivy-previous-line)
-  (ivy--exhibit)
-  (when (ivy--marked-p)
-    (ivy--unmark (ivy-state-current ivy-last))))
-
-(defun ivy-toggle-marks ()
-  "Toggle mark for all narrowed candidates."
-  (interactive)
-  (dolist (cand ivy--old-cands)
-    (if (member cand ivy-marked-candidates)
-        (ivy--unmark cand)
-      (ivy--mark cand))))
-
-(defconst ivy-help-file (let ((default-directory
-                               (if load-file-name
-                                   (file-name-directory load-file-name)
-                                 default-directory)))
-                          (if (file-exists-p "ivy-help.org")
-                              (expand-file-name "ivy-help.org")
-                            (if (file-exists-p "doc/ivy-help.org")
-                                (expand-file-name "doc/ivy-help.org"))))
-  "The file for `ivy-help'.")
-
-(defvar org-hide-emphasis-markers)
-
-(defun ivy-help ()
-  "Help for `ivy'."
-  (interactive)
-  (let ((buf (get-buffer "*Ivy Help*"))
-        (inhibit-read-only t))
-    (unless buf
-      (setq buf (get-buffer-create "*Ivy Help*"))
-      (cl-letf (((symbol-function #'help-buffer) (lambda () buf)))
-        (describe-mode))
-      (with-current-buffer buf
-        (goto-char (point-min))
-        (insert "* describe-mode\n")
-        (goto-char (point-min))
-        (insert-file-contents ivy-help-file)
-        (org-mode)
-        (setq-local org-hide-emphasis-markers t)
-        (view-mode)
-        (goto-char (point-min))
-        (let ((inhibit-message t))
-          (org-cycle '(64)))))
-    (if (eq this-command 'ivy-help)
-        (switch-to-buffer buf)
-      (with-ivy-window
-        (pop-to-buffer buf)))
-    (view-mode)
-    (goto-char (point-min))))
-
-(declare-function ffap-url-p "ffap")
-(defvar ffap-url-fetcher)
-
-(defun ivy-ffap-url-p (string)
-  "Forward to `ffap-url-p'."
-  (require 'ffap)
-  (ffap-url-p string))
-
-(defun ivy-ffap-url-fetcher (url)
-  "Calls `ffap-url-fetcher'."
-  (require 'ffap)
-  (funcall ffap-url-fetcher url))
-
-(ivy-configure 'read-file-name-internal
-  :sort-fn #'ivy-sort-file-function-default
-  :display-transformer-fn #'ivy-read-file-transformer)
-
-(ivy-configure 'internal-complete-buffer
-  :display-transformer-fn #'ivy-switch-buffer-transformer)
-
-(provide 'ivy)
-
-;;; ivy.el ends here
diff --git a/elpa/ivy-20200319.1247/ivy.elc b/elpa/ivy-20200319.1247/ivy.elc
deleted file mode 100644
index a94b9169d2f160a5cca497bf4266c883ec5e091d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 202406
zcmeFa3tL>rl`agDjV1iVaqcsjnVhXwWMD>(dtbU6$Ynr)Bof^sq1cXbq6Ql1QPbV-
zi)8%eobRun_g$;1cJ194(L#*oc}|=N*n8K#R;_!j^_%Sno4=TunVJ91Z+;VOwof~a
zX8lke8m(aaw06)7Ue&w3M!OY6mE~Bzyl(VQf?Bf~v^)LAY2*7^AD?^6^YU@`q|pnG
z&`L1q)qBC=S*v#1I0z2g2fco`(K_zk#@BAIAJh&H>xY5sC0t#OR)^X+Y@>};wlVwQlX8k0IWc?rW{Xpw|u#YOP?u9yHsvOebb4y`Wy}
zHXHSB&_6-JDAsLW_
zeW>omEFOmVhx%cRf5|P=20xbZj~^@e$B!(`-__4P(ozxLL?{uVdKBOEUM6^f>QTji
zi8f=@h(qsXjH)pjjT8SRs>bLwu6i#MR87!X68SGtH9==d*?)d=E9k7^kF$cR6?9hd$5}zu3OcL!4s_Ft2#
zy&S66G}TVMYOQ>4?V)NNQ|()?S~p**zkOOf7<9Y!R=;@MZ4WxdTC)KZ-mQN-XmnAeS!_1;gT||~VjC#7
zSvv#1ZZ^6B5x#BUuzt|2b?e#y%Lc7RGbrq|4!ZSIv|MYF()1e#_~QVCs97gjSuO-?
z(j_Utt9q+ZZynU7r=!{dXhY#H2t%>iK6n}Ei=%coc!AazP*dNS3E2MmQW~%`I<55&
zPJ%`JhXM9_9D2LE6fEx74qmcrP?Tol_@uwI6s&pg3OB=AvR}oDt)b7lDOq@Z(&*Rm
zuKr!Wj+%WmG@;?cTKDBpyOnaST90z=?l&|7x8#Hw(cP8+Sp{^01S-Yv@OqN|1B_Jg%X>!jXo^wY*L$a8k5%ZXJJ@+#f;
z+TC&eayN?M+pPX!%>NbMVtvc
zV_(+^WWj#BdH5D{s>*-4X6&9#no-aiobK1VfT1urZ66Mr?I4~w%lK_(xsU&jj&j3e
zLt~HJ$dkcI4mC5~ETi+yGI^U>9v!`tS+3NQ)sX+LBHKS8#^V35Q#>$p&q3bV$@m_0!IsTedRDhyL+7N
z2QP}v`m1`gn4GVV$7n%O@}z!nL>os9%s`7~`#h{4)dtP++mxA;ZApc-SB+ky	Ur
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’, instead of highlighting the selected candidate - with the ‘ivy-current-match’ face (see - ‘ivy-format-functions-alist’). Or take the customization of - actions, say after the candidate function is selected. ‘RET’ uses - ‘counsel-describe-function’ to describe the function, whereas ‘M-o - d’ jumps to that function’s definition in the code. The ‘M-o’ - prefix can be uniformly used with characters like ‘d’ to group - similar actions. - -Discoverability -............... - - Ivy displays easily discoverable commands through the hydra - facility. ‘C-o’ in the minibuffer displays a hydra menu. It opens - up within an expanded minibuffer area. Each menu item comes with - short documentation strings and highlighted one-key completions. - So discovering even seldom used keys is simply a matter of ‘C-o’ in - the minibuffer while in the midst of the Ivy interaction. This - discoverability minimizes exiting Ivy interface for documentation - look-ups. - - -File: ivy.info, Node: Installation, Next: Getting started, Prev: Introduction, Up: Top - -2 Installation -************** - -Install Ivy automatically through Emacs’s package manager, or manually -from Ivy’s development repository. - - Emacs 24.3 is the oldest version to run Ivy. Emacs 24.4 is the -oldest version that runs Ivy with fancy faces display. - -* Menu: - -* Installing from Emacs Package Manager:: -* Installing from the Git repository:: - - -File: ivy.info, Node: Installing from Emacs Package Manager, Next: Installing from the Git repository, Up: Installation - -2.1 Installing from Emacs Package Manager -========================================= - -‘M-x’ ‘package-install’ ‘RET’ ‘ivy’ ‘RET’ - - Ivy is installed as part of ‘ivy’ package, which is available from -two different package archives, GNU ELPA and MELPA. For the latest -stable version, use the GNU ELPA archives using the above M-x command. - - For current hourly builds, use the MELPA archives. In MELPA, Ivy is -split into three packages: ‘ivy’, ‘swiper’ and ‘counsel’; you can simply -install ‘counsel’ which will bring in the other two as dependencies. -See the code below for adding MELPA to the list of package archives: - - (require 'package) - (add-to-list 'package-archives - '("melpa" . "https://melpa.org/packages/")) - - After this do ‘M-x’ ‘package-refresh-contents’ ‘RET’, followed by -‘M-x’ ‘package-install’ ‘RET’ ‘counsel’ ‘RET’. - - For package manager details, see *note (emacs)Packages::. - - -File: ivy.info, Node: Installing from the Git repository, Prev: Installing from Emacs Package Manager, Up: Installation - -2.2 Installing from the Git repository -====================================== - -Why install from Git? -..................... - - • No need to wait for MELPA’s hourly builds - • Easy to revert to previous versions - • Contribute to Ivy’s development; send patches; pull requests - -Configuration steps -................... - - First clone the Swiper repository with: - - cd ~/git && git clone https://github.com/abo-abo/swiper - cd swiper && make compile - - Second, add these lines to the Emacs init file: - - (add-to-list 'load-path "~/git/swiper/") - (require 'ivy) - - Then, update the code with: - - git pull - make - - -File: ivy.info, Node: Getting started, Next: Key bindings, Prev: Installation, Up: Top - -3 Getting started -***************** - -First enable Ivy completion everywhere: - - (ivy-mode 1) - - Note: ‘ivy-mode’ can be toggled on and off with ‘M-x’ ‘ivy-mode’. - -* Menu: - -* Basic customization:: - - -File: ivy.info, Node: Basic customization, Up: Getting started - -3.1 Basic customization -======================= - -Here are some basic settings particularly useful for new Ivy users: - - (setq ivy-use-virtual-buffers t) - (setq ivy-count-format "(%d/%d) ") - - If you want, you can go without any customizations at all. The above -settings are the most bang for the buck in terms of customization. So -users that typically don’t like customize a lot are advised to look at -these settings first. - - For more advanced customizations, refer to ‘M-x describe-variable’ -documentation. - - -File: ivy.info, Node: Key bindings, Next: Completion Styles, Prev: Getting started, Up: Top - -4 Key bindings -************** - -* Menu: - -* Global key bindings:: -* Minibuffer key bindings:: - - -File: ivy.info, Node: Global key bindings, Next: Minibuffer key bindings, Up: Key bindings - -4.1 Global key bindings -======================= - -Here is a list of commands that are useful to be bound globally, along -with some sample bindings: - -Ivy-based interface to standard commands -........................................ - - (global-set-key (kbd "C-s") 'swiper-isearch) - (global-set-key (kbd "M-x") 'counsel-M-x) - (global-set-key (kbd "C-x C-f") 'counsel-find-file) - (global-set-key (kbd "M-y") 'counsel-yank-pop) - (global-set-key (kbd " f") 'counsel-describe-function) - (global-set-key (kbd " v") 'counsel-describe-variable) - (global-set-key (kbd " l") 'counsel-find-library) - (global-set-key (kbd " i") 'counsel-info-lookup-symbol) - (global-set-key (kbd " u") 'counsel-unicode-char) - (global-set-key (kbd " j") 'counsel-set-variable) - (global-set-key (kbd "C-x b") 'ivy-switch-buffer) - (global-set-key (kbd "C-c v") 'ivy-push-view) - (global-set-key (kbd "C-c V") 'ivy-pop-view) - -Ivy-based interface to shell and system tools -............................................. - - (global-set-key (kbd "C-c c") 'counsel-compile) - (global-set-key (kbd "C-c g") 'counsel-git) - (global-set-key (kbd "C-c j") 'counsel-git-grep) - (global-set-key (kbd "C-c L") 'counsel-git-log) - (global-set-key (kbd "C-c k") 'counsel-rg) - (global-set-key (kbd "C-c m") 'counsel-linux-app) - (global-set-key (kbd "C-c n") 'counsel-fzf) - (global-set-key (kbd "C-x l") 'counsel-locate) - (global-set-key (kbd "C-c J") 'counsel-file-jump) - (global-set-key (kbd "C-S-o") 'counsel-rhythmbox) - (global-set-key (kbd "C-c w") 'counsel-wmctrl) - -Ivy-resume and other commands -............................. - - ‘ivy-resume’ resumes the last Ivy-based completion. - - (global-set-key (kbd "C-c C-r") 'ivy-resume) - (global-set-key (kbd "C-c b") 'counsel-bookmark) - (global-set-key (kbd "C-c d") 'counsel-descbinds) - (global-set-key (kbd "C-c g") 'counsel-git) - (global-set-key (kbd "C-c o") 'counsel-outline) - (global-set-key (kbd "C-c t") 'counsel-load-theme) - (global-set-key (kbd "C-c F") 'counsel-org-file) - - You can also enable ‘counsel-mode’ to make some global key binding -remapping for you. - - -File: ivy.info, Node: Minibuffer key bindings, Prev: Global key bindings, Up: Key bindings - -4.2 Minibuffer key bindings -=========================== - -Ivy includes several minibuffer bindings, which are defined in the -‘ivy-minibuffer-map’ keymap variable. The most frequently used ones are -described here. - - ‘swiper’ or ‘counsel-M-x’ add more key bindings through the ‘keymap’ -argument to ‘ivy-read’. These keys, also active in the minibuffer, are -described under their respective commands. - - A key feature of ‘ivy-minibuffer-map’ is its full editing capability -where the familiar ‘C-a’, ‘C-f’, ‘M-d’, ‘M-DEL’, ‘M-b’, ‘M-w’, ‘C-k’, -‘C-y’ key bindings work the same as in ‘fundamental-mode’. - -* Menu: - -* Key bindings for navigation:: -* Key bindings for single selection, action, then exit minibuffer: Key bindings for single selection action then exit minibuffer. -* Key bindings for multiple selections and actions, keep minibuffer open: Key bindings for multiple selections and actions keep minibuffer open. -* Key bindings that alter the minibuffer input:: -* Other key bindings:: -* Hydra in the minibuffer:: -* Saving the current completion session to a buffer:: - - -File: ivy.info, Node: Key bindings for navigation, Next: Key bindings for single selection action then exit minibuffer, Up: Minibuffer key bindings - -4.2.1 Key bindings for navigation ---------------------------------- - - • ‘C-n’ (‘ivy-next-line’) selects the next candidate - • ‘C-p’ (‘ivy-previous-line’) selects the previous candidate - • ‘M-<’ (‘ivy-beginning-of-buffer’) selects the first candidate - • ‘M->’ (‘ivy-end-of-buffer’) selects the last candidate - • ‘C-v’ (‘ivy-scroll-up-command’) scrolls up by ‘ivy-height’ lines - • ‘M-v’ (‘ivy-scroll-down-command’) scrolls down by ‘ivy-height’ - lines - - -- User Option: ivy-wrap - Specifies the wrap-around behavior for ‘C-n’ and ‘C-p’. When - ‘ivy-wrap’ is set to ‘t’, ‘ivy-next-line’ and ‘ivy-previous-line’ - will cycle past the last and the first candidates respectively. - - Wrap-around behavior is off by default. - - -- User Option: ivy-height - Use this option to adjust the minibuffer height, which also affects - scroll size when using ‘C-v’ and ‘M-v’ key bindings. - - ‘ivy-height’ is 10 lines by default. - - -File: ivy.info, Node: Key bindings for single selection action then exit minibuffer, Next: Key bindings for multiple selections and actions keep minibuffer open, Prev: Key bindings for navigation, Up: Minibuffer key bindings - -4.2.2 Key bindings for single selection, action, then exit minibuffer ---------------------------------------------------------------------- - -Ivy can offer several actions from which to choose which action to run. -This "calling an action" operates on the selected candidate. For -example, when viewing a list of files, one action could open it for -editing, one to view it, another to invoke a special function, and so -on. Custom actions can be added to this interface. The precise action -to call on the selected candidate can be delayed until after the -narrowing is completed. No need to exit the interface if unsure which -action to run. This delayed flexibility and customization of actions -extends usability of lists in Emacs. - -‘C-m’ or ‘RET’ (‘ivy-done’) -........................... - - Calls the default action and then exits the minibuffer. - -‘M-o’ (‘ivy-dispatching-done’) -.............................. - - Presents valid actions from which to choose. When only one action - is available, there is no difference between ‘M-o’ and ‘C-m’. - -‘C-j’ (‘ivy-alt-done’) -...................... - - When completing file names, selects the current directory candidate - and starts a new completion session there. Otherwise, it is the - same as ‘ivy-done’. - -‘TAB’ (‘ivy-partial-or-done’) -............................. - - Attempts partial completion, extending current input as much as - possible. ‘TAB TAB’ is the same as ‘C-j’ (‘ivy-alt-done’). - - Example ERT test: - - (should - (equal (ivy-with - '(progn - (ivy-read "Test: " '("can do" "can't, sorry" "other")) - ivy-text) - "c ") - "can")) - -‘C-M-j’ (‘ivy-immediate-done’) -.............................. - - Exits with _the current input_ instead of _the current candidate_ - (like other commands). - - This is useful e.g. when you call ‘find-file’ to create a new - file, but the desired name matches an existing file. In that case, - using ‘C-j’ would select that existing file, which isn’t what you - want - use this command instead. - -‘C-'’ (‘ivy-avy’) -................. - - Uses avy to select one of the candidates on the current candidate - page. This can often be faster than multiple ‘C-n’ or ‘C-p’ - keystrokes followed by ‘C-m’. - - -File: ivy.info, Node: Key bindings for multiple selections and actions keep minibuffer open, Next: Key bindings that alter the minibuffer input, Prev: Key bindings for single selection action then exit minibuffer, Up: Minibuffer key bindings - -4.2.3 Key bindings for multiple selections and actions, keep minibuffer open ----------------------------------------------------------------------------- - -For repeatedly applying multiple actions or acting on multiple -candidates, Ivy does not close the minibuffer between commands. It -keeps the minibuffer open for applying subsequent actions. - - Adding an extra meta key to the normal key chord invokes the special -version of the regular commands that enables applying multiple actions. - -‘C-M-m’ (‘ivy-call’) -.................... - - Is the non-exiting version of ‘C-m’ (‘ivy-done’). - - Instead of closing the minibuffer, ‘C-M-m’ allows selecting another - candidate or another action. For example, ‘C-M-m’ on functions - list invokes ‘describe-function’. When combined with ‘C-n’, - function descriptions can be invoked quickly in succession. - -‘C-M-o’ (‘ivy-dispatching-call’) -................................ - - Is the non-exiting version of ‘M-o’ (‘ivy-dispatching-done’). - - For example, during the ‘counsel-rhythmbox’ completion, press - ‘C-M-o e’ to en-queue the selected candidate, followed by ‘C-n C-m’ - to play the next candidate - the current action reverts to the - default one after ‘C-M-o’. - -‘C-M-n’ (‘ivy-next-line-and-call’) -.................................. - - Combines ‘C-n’ and ‘C-M-m’. Moves to next line and applies an - action. - - Comes in handy when opening multiple files from - ‘counsel-find-file’, ‘counsel-git-grep’, ‘counsel-ag’, - ‘counsel-rg’, or ‘counsel-locate’ lists. Just hold ‘C-M-n’ for - rapid-fire default action on each successive element of the list. - -‘C-M-p’ (‘ivy-previous-line-and-call’) -...................................... - - Combines ‘C-p’ and ‘C-M-m’. - - Similar to the above except it moves through the list in the other - direction. - -‘ivy-resume’ -............ - - Recalls the state of the completion session just before its last - exit. - - Useful after an accidental ‘C-m’ (‘ivy-done’). - - -File: ivy.info, Node: Key bindings that alter the minibuffer input, Next: Other key bindings, Prev: Key bindings for multiple selections and actions keep minibuffer open, Up: Minibuffer key bindings - -4.2.4 Key bindings that alter the minibuffer input --------------------------------------------------- - -‘M-n’ (‘ivy-next-history-element’) -.................................. - - Cycles forward through the Ivy command history. - - Ivy updates an internal history list after each action. When this - history list is empty, ‘M-n’ inserts symbol (or URL) at point into - the minibuffer. - -‘M-p’ (‘ivy-previous-history-element’) -...................................... - - Cycles forward through the Ivy command history. - -‘M-i’ (‘ivy-insert-current’) -............................ - - Inserts the current candidate into the minibuffer. - - Useful for copying and renaming files, for example: ‘M-i’ to insert - the original file name string, edit it, and then ‘C-m’ to complete - the renaming. - -‘M-j’ (‘ivy-yank-word’) -....................... - - Inserts the sub-word at point into the minibuffer. - - This is similar to ‘C-s C-w’ with ‘isearch’. Ivy reserves ‘C-w’ - for ‘kill-region’. See also ‘ivy-yank-symbol’ and ‘ivy-yank-char’. - -‘S-SPC’ (‘ivy-restrict-to-matches’) -................................... - - Deletes the current input, and resets the candidates list to the - currently restricted matches. - - This is how Ivy provides narrowing in successive tiers. - -‘C-r’ (‘ivy-reverse-i-search’) -.............................. - - Starts a recursive completion session through the command’s - history. - - This works just like ‘C-r’ at the bash command prompt, where the - completion candidates are the history items. Upon completion, the - selected candidate string is inserted into the minibuffer. - - -File: ivy.info, Node: Other key bindings, Next: Hydra in the minibuffer, Prev: Key bindings that alter the minibuffer input, Up: Minibuffer key bindings - -4.2.5 Other key bindings ------------------------- - -‘M-w’ (‘ivy-kill-ring-save’) -............................ - - Copies selected candidates to the kill ring. - - Copies the region if the region is active. - - -File: ivy.info, Node: Hydra in the minibuffer, Next: Saving the current completion session to a buffer, Prev: Other key bindings, Up: Minibuffer key bindings - -4.2.6 Hydra in the minibuffer ------------------------------ - -‘C-o’ (‘hydra-ivy/body’) -........................ - - Invokes the hydra menu with short key bindings. - - When Hydra is active, minibuffer editing is disabled and menus -display short aliases: - -Short Normal Command name ------------------------------------------------- -‘o’ ‘C-g’ ‘keyboard-escape-quit’ -‘j’ ‘C-n’ ‘ivy-next-line’ -‘k’ ‘C-p’ ‘ivy-previous-line’ -‘h’ ‘M-<’ ‘ivy-beginning-of-buffer’ -‘l’ ‘M->’ ‘ivy-end-of-buffer’ -‘d’ ‘C-m’ ‘ivy-done’ -‘f’ ‘C-j’ ‘ivy-alt-done’ -‘g’ ‘C-M-m’ ‘ivy-call’ -‘u’ ‘C-c C-o’ ‘ivy-occur’ - - Hydra reduces key strokes, for example: ‘C-n C-n C-n C-n’ is ‘C-o -jjjj’ in Hydra. - - Hydra menu offers these additional bindings: - -‘c’ (‘ivy-toggle-calling’) -.......................... - - Toggle calling the action after each candidate change. It modifies - ‘j’ to ‘jg’, ‘k’ to ‘kg’ etc. - -‘m’ (‘ivy-rotate-preferred-builders’) -..................................... - - Rotate the current regexp matcher. - -‘>’ (‘ivy-minibuffer-grow’) -........................... - - Increase ‘ivy-height’ for the current minibuffer. - -‘<’ (‘ivy-minibuffer-shrink’) -............................. - - Decrease ‘ivy-height’ for the current minibuffer. - -‘w’ (‘ivy-prev-action’) -....................... - - Select the previous action. - -‘s’ (‘ivy-next-action’) -....................... - - Select the next action. - -‘a’ (‘ivy-read-action’) -....................... - - Use a menu to select an action. - -‘C’ (‘ivy-toggle-case-fold’) -............................ - - Toggle case folding (match both upper and lower case characters for - lower case input). - - Hydra menu also offers bindings for marking multiple candidates: - -Key Command name --------------------------------- -‘m’ ‘ivy-mark’ -‘u’ ‘ivy-unmark’ -‘DEL’ ‘ivy-unmark-backward’ -‘t’ ‘ivy-toggle-marks’ - - The action is called on each marked candidate one by one. - - -File: ivy.info, Node: Saving the current completion session to a buffer, Prev: Hydra in the minibuffer, Up: Minibuffer key bindings - -4.2.7 Saving the current completion session to a buffer -------------------------------------------------------- - -‘C-c C-o’ (‘ivy-occur’) -....................... - - Saves the current candidates to a new buffer and exits completion. - - The new buffer is read-only and has a few useful bindings defined. - -‘RET’ or ‘f’ (‘ivy-occur-press’) -................................ - - Call the current action on the selected candidate. - -‘mouse-1’ (‘ivy-occur-click’) -............................. - - Call the current action on the selected candidate. - -‘j’ (‘next-line’) -................. - - Move to next line. - -‘k’ (‘previous-line’) -..................... - - Move to previous line. - -‘a’ (‘ivy-occur-read-action’) -............................. - - Read an action and make it current for this buffer. - -‘o’ (‘ivy-occur-dispatch’) -.......................... - - Read an action and call it on the selected candidate. - -‘q’ (‘quit-window’) -................... - - Bury the current buffer. - - Ivy has no limit on the number of active buffers like these. - - Ivy takes care of naming buffers uniquely by constructing descriptive -names. For example: ‘*ivy-occur counsel-describe-variable "function$*’. - - -File: ivy.info, Node: Completion Styles, Next: Customization, Prev: Key bindings, Up: Top - -5 Completion Styles -******************* - -Ivy’s completion functions rely on a regex builder - a function that -transforms a string input to a string regex. All current candidates -simply have to match this regex. Each collection can be assigned its -own regex builder by customizing ‘ivy-re-builders-alist’. - - The keys of this alist are collection names, and the values are one -of the following: - • ‘ivy--regex’ - • ‘ivy--regex-plus’ - • ‘ivy--regex-ignore-order’ - • ‘ivy--regex-fuzzy’ - • ‘regexp-quote’ - - A catch-all key, ‘t’, applies to all collections that don’t have -their own key. - - The default is: - - (setq ivy-re-builders-alist - '((t . ivy--regex-plus))) - - This example shows a custom regex builder assigned to file name -completion: - - (setq ivy-re-builders-alist - '((read-file-name-internal . ivy--regex-fuzzy) - (t . ivy--regex-plus))) - - Here, ‘read-file-name-internal’ is a function that is passed as the -second argument to ‘completing-read’ for file name completion. - - The regex builder resolves as follows (in order of priority): - 1. ‘re-builder’ argument passed to ‘ivy-read’. - 2. ‘collection’ argument passed to ‘ivy-read’ is a function and has an - entry on ‘ivy-re-builders-alist’. - 3. ‘caller’ argument passed to ‘ivy-read’ has an entry on - ‘ivy-re-builders-alist’. - 4. ‘this-command’ has an entry on ‘ivy-re-builders-alist’. - 5. ‘t’ has an entry on ‘ivy-re-builders-alist’. - 6. ‘ivy--regex’. - -* Menu: - -* ivy--regex-plus:: -* ivy--regex-ignore-order:: -* ivy--regex-fuzzy:: - - -File: ivy.info, Node: ivy--regex-plus, Next: ivy--regex-ignore-order, Up: Completion Styles - -5.1 ivy–regex-plus -================== - -‘ivy--regex-plus’ is Ivy’s default completion method. - - ‘ivy--regex-plus’ matches by splitting the input by spaces and -rebuilding it into a regex. - - As the search string is typed in Ivy’s minibuffer, it is transformed -into valid regex syntax. If the string is ‘"for example"’, it is -transformed into - - "\\(for\\).*\\(example\\)" - - which in regex terminology matches ‘"for"’ followed by a wild card -and then ‘"example"’. Note how Ivy uses the space character to build -wild cards. To match a literal white space, use an extra space. So to -match one space type two spaces, to match two spaces type three spaces, -and so on. - - As Ivy transforms typed characters into regex strings, it provides an -intuitive feedback through font highlights. - - Ivy supports regexp negation with ‘"!"’. For example, ‘"define key ! -ivy quit"’ first selects everything matching ‘"define.*key"’, then -removes everything matching ‘"ivy"’, and finally removes everything -matching ‘"quit"’. What remains is the final result set of the negation -regexp. - - Since Ivy treats minibuffer input as a regexp, the standard regexp -identifiers work: ‘"^"’, ‘"$"’, ‘"\b"’ or ‘"[a-z]"’. The exceptions are -spaces, which translate to ‘".*"’, and ‘"!"’ that signal the beginning -of a negation group. - - -File: ivy.info, Node: ivy--regex-ignore-order, Next: ivy--regex-fuzzy, Prev: ivy--regex-plus, Up: Completion Styles - -5.2 ivy–regex-ignore-order -========================== - -‘ivy--regex-ignore-order’ ignores the order of regexp tokens when -searching for matching candidates. For instance, the input ‘"for -example"’ will match ‘"example test for"’. - - -File: ivy.info, Node: ivy--regex-fuzzy, Prev: ivy--regex-ignore-order, Up: Completion Styles - -5.3 ivy–regex-fuzzy -=================== - -‘ivy--regex-fuzzy’ splits each character with a wild card. Searching -for ‘"for"’ returns all ‘"f.*o.*r"’ matches, resulting in a large number -of hits. Yet some searches need these extra hits. Ivy sorts such large -lists using ‘flx’ package’s scoring mechanism, if it’s installed. - - ‘C-o m’ toggles the current regexp builder. - - -File: ivy.info, Node: Customization, Next: Commands, Prev: Completion Styles, Up: Top - -6 Customization -*************** - -* Menu: - -* Faces:: -* Defcustoms:: -* Actions:: -* Packages:: - - -File: ivy.info, Node: Faces, Next: Defcustoms, Up: Customization - -6.1 Faces -========= - -‘ivy-current-match’ -................... - - Highlights the currently selected candidate. - -‘ivy-minibuffer-match-face-1’ -............................. - - Highlights the background of the match. - -‘ivy-minibuffer-match-face-2’ -............................. - - Highlights the first (modulo 3) matched group. - -‘ivy-minibuffer-match-face-3’ -............................. - - Highlights the second (modulo 3) matched group. - -‘ivy-minibuffer-match-face-4’ -............................. - - Highlights the third (modulo 3) matched group. - -‘ivy-confirm-face’ -.................. - - Highlights the "(confirm)" part of the prompt. - - When ‘confirm-nonexistent-file-or-buffer’ set to ‘t’, then - confirming non-existent files in ‘ivy-mode’ requires an additional - ‘RET’. - - The confirmation prompt will use this face. - - For example: - - (setq confirm-nonexistent-file-or-buffer t) - - Then call ‘find-file’, enter "eldorado" and press ‘RET’ - the - prompt will be appended with "(confirm)". Press ‘RET’ once more to - confirm, or any key to continue the completion. - -‘ivy-match-required-face’ -......................... - - Highlights the "(match required)" part of the prompt. - - When completions have to match available candidates and cannot take - random input, the "(match required)" prompt signals this - constraint. - - For example, call ‘describe-variable’, enter "waldo" and press - ‘RET’ - "(match required)" is prompted. Press any key for the - prompt to disappear. - -‘ivy-subdir’ -............ - - Highlights directories when completing file names. - -‘ivy-remote’ -............ - - Highlights remote files when completing file names. - -‘ivy-virtual’ -............. - - Highlights virtual buffers when completing buffer names. - - Virtual buffers correspond to bookmarks and recent files list, - ‘recentf’. - - Enable virtual buffers with: - - (setq ivy-use-virtual-buffers t) - -‘ivy-modified-buffer’ -..................... - - Highlights modified buffers when switching buffer. - -‘ivy-modified-outside-buffer’ -............................. - - Highlights buffers modified outside Emacs when switching buffer. - - This takes precedence over ‘ivy-modified-buffer’. - - -File: ivy.info, Node: Defcustoms, Next: Actions, Prev: Faces, Up: Customization - -6.2 Defcustoms -============== - - -- User Option: ivy-count-format - A string that specifies display of number of candidates and current - candidate, if one exists. - - The number of matching candidates by default is shown as a right- - padded integer value. - - To disable showing the number of candidates: - - (setq ivy-count-format "") - - To also display the current candidate: - - (setq ivy-count-format "(%d/%d) ") - - The ‘format’-style switches this variable uses are described in the - ‘format’ documentation. - - -- User Option: ivy-display-style - Specifies highlighting candidates in the minibuffer. - - The default setting is ‘'fancy’ in Emacs versions 24.4 or newer. - - Set ‘ivy-display-style’ to ‘nil’ for a plain minibuffer. - - -- User Option: ivy-on-del-error-function - Specifies what to do when ‘DEL’ (‘ivy-backward-delete-char’) fails. - - This is usually the case when there is no text left to delete, - i.e., when ‘DEL’ is typed at the beginning of the minibuffer. - - The default behavior is to quit the completion after ‘DEL’ – a - handy key to invoke after mistakenly triggering a completion. - - -File: ivy.info, Node: Actions, Next: Packages, Prev: Defcustoms, Up: Customization - -6.3 Actions -=========== - -* Menu: - -* What are actions?:: -* How can different actions be called?:: -* How to modify the actions list?:: -* Example - add two actions to each command:: -* Example - define a new command with several actions:: - - -File: ivy.info, Node: What are actions?, Next: How can different actions be called?, Up: Actions - -6.3.1 What are actions? ------------------------ - -An action is a function that is called after you select a candidate -during completion. This function takes a single string argument, which -is the selected candidate. - -Window context when calling an action -..................................... - - Currently, the action is executed in the minibuffer window context. - This means e.g. that if you call ‘insert’ the text will be - inserted into the minibuffer. - - If you want to execute the action in the initial window from which - the completion started, use the ‘with-ivy-window’ wrapper macro. - - (defun ivy-insert-action (x) - (with-ivy-window - (insert x))) - - -File: ivy.info, Node: How can different actions be called?, Next: How to modify the actions list?, Prev: What are actions?, Up: Actions - -6.3.2 How can different actions be called? ------------------------------------------- - - • ‘C-m’ (‘ivy-done’) calls the current action. - • ‘M-o’ (‘ivy-dispatching-done’) presents available actions for - selection, calls it after selection, and then exits. - • ‘C-M-o’ (‘ivy-dispatching-call’) presents available actions for - selection, calls it after selection, and then does not exit. - - -File: ivy.info, Node: How to modify the actions list?, Next: Example - add two actions to each command, Prev: How can different actions be called?, Up: Actions - -6.3.3 How to modify the actions list? -------------------------------------- - -Currently, you can append any amount of your own actions to the default -list of actions. This can be done either for a specific command, or for -all commands at once. - - Usually, the command has only one default action. The convention is -to use single letters when selecting a command, and the letter ‘o’ is -designated for the default command. This way, ‘M-o o’ should be always -equivalent to ‘C-m’. - - -File: ivy.info, Node: Example - add two actions to each command, Next: Example - define a new command with several actions, Prev: How to modify the actions list?, Up: Actions - -6.3.4 Example - add two actions to each command ------------------------------------------------ - -The first action inserts the current candidate into the Ivy window - the -window from which ‘ivy-read’ was called. - - The second action copies the current candidate to the kill ring. - - (defun ivy-yank-action (x) - (kill-new x)) - - (defun ivy-copy-to-buffer-action (x) - (with-ivy-window - (insert x))) - - (ivy-set-actions - t - '(("i" ivy-copy-to-buffer-action "insert") - ("y" ivy-yank-action "yank"))) - - Then in any completion session, ‘M-o y’ invokes ‘ivy-yank-action’, -and ‘M-o i’ invokes ‘ivy-copy-to-buffer-action’. - -* Menu: - -* How to undo adding the two actions:: -* How to add actions to a specific command:: - - -File: ivy.info, Node: How to undo adding the two actions, Next: How to add actions to a specific command, Up: Example - add two actions to each command - -6.3.4.1 How to undo adding the two actions -.......................................... - -Since ‘ivy-set-actions’ modifies the internal dictionary with new data, -set the extra actions list to ‘nil’ by assigning ‘nil’ value to the ‘t’ -key as follows: - - (ivy-set-actions t nil) - - -File: ivy.info, Node: How to add actions to a specific command, Prev: How to undo adding the two actions, Up: Example - add two actions to each command - -6.3.4.2 How to add actions to a specific command -................................................ - -Use the command name as the key: - - (ivy-set-actions - 'swiper - '(("i" ivy-copy-to-buffer-action "insert") - ("y" ivy-yank-action "yank"))) - - -File: ivy.info, Node: Example - define a new command with several actions, Prev: Example - add two actions to each command, Up: Actions - -6.3.5 Example - define a new command with several actions ---------------------------------------------------------- - - (defun my-action-1 (x) - (message "action-1: %s" x)) - - (defun my-action-2 (x) - (message "action-2: %s" x)) - - (defun my-action-3 (x) - (message "action-3: %s" x)) - - (defun my-command-with-3-actions () - (interactive) - (ivy-read "test: " '("foo" "bar" "baz") - :action '(1 - ("o" my-action-1 "action 1") - ("j" my-action-2 "action 2") - ("k" my-action-3 "action 3")))) - - The number 1 above is the index of the default action. Each action -has its own string description for easy selection. - -* Menu: - -* Test the above function with ivy-occur:: - - -File: ivy.info, Node: Test the above function with ivy-occur, Up: Example - define a new command with several actions - -6.3.5.1 Test the above function with ‘ivy-occur’ -................................................ - -To examine each action with each candidate in a key-efficient way, try: - - • Call ‘my-command-with-3-actions’ - • Press ‘C-c C-o’ to close the completion window and move to an - ivy-occur buffer - • Press ‘kkk’ to move to the first candidate, since the point is most - likely at the end of the buffer - • Press ‘oo’ to call the first action - • Press ‘oj’ and ‘ok’ to call the second and the third actions - • Press ‘j’ to move to the next candidate - • Press ‘oo’, ‘oj’, ‘ok’ - • Press ‘j’ to move to the next candidate - • and so on... - - -File: ivy.info, Node: Packages, Prev: Actions, Up: Customization - -6.4 Packages -============ - -‘org-mode’ -.......... - - ‘org-mode’ versions 8.3.3 or later obey ‘completing-read-function’ - (which ‘ivy-mode’ sets). Try refiling headings with similar names - to appreciate ‘ivy-mode’. - -‘magit’ -....... - - Uses ivy by default if Ivy is installed. - -‘find-file-in-project’ -...................... - - Uses ivy by default if Ivy is installed. - -‘projectile’ -............ - - Projectile requires this setting for ivy completion: - - (setq projectile-completion-system 'ivy) - -‘helm-make’ -........... - - Helm-make requires this setting for ivy completion. - - (setq helm-make-completion-method 'ivy) - -automatically integrated packages -................................. - - Ivy re-uses the following packages if they are installed: ‘avy’, - ‘amx’ or ‘smex’, ‘flx’, and ‘wgrep’. - - -File: ivy.info, Node: Commands, Next: API, Prev: Customization, Up: Top - -7 Commands -********** - -* Menu: - -* File Name Completion:: -* Buffer Name Completion:: -* Counsel commands:: - - -File: ivy.info, Node: File Name Completion, Next: Buffer Name Completion, Up: Commands - -7.1 File Name Completion -======================== - -Since file name completion is ubiquitous, Ivy provides extra bindings -that work here: - -‘C-j’ (‘ivy-alt-done’) -...................... - - On a directory, restarts completion from that directory. - - On a file or ‘./’, exit completion with the selected candidate. - -‘DEL’ (‘ivy-backward-delete-char’) -.................................. - - Restart the completion in the parent directory if current input is - empty. - -‘//’ (‘self-insert-command’) -............................ - - Switch to the root directory. - -‘~’ (‘self-insert-command’) -........................... - - Switch to the home directory. - -‘/’ (‘self-insert-command’) -........................... - - If the current input matches an existing directory name exactly, - switch the completion to that directory. - -‘M-r’ (‘ivy-toggle-regexp-quote’) -................................. - - Toggle between input as regexp or not. - - Switch to matching literally since file names include ‘.’, which is - for matching any char in regexp mode. - -- User Option: ivy-extra-directories - Decide if you want to see ‘../’ and ‘./’ during file name - completion. - - Reason to remove: ‘../’ is the same as ‘DEL’. - - Reason not to remove: navigate anywhere with only ‘C-n’, ‘C-p’ and - ‘C-j’. - - Likewise, ‘./’ can be removed. - -History -....... - - File history works the same with ‘M-p’, ‘M-n’, and ‘C-r’, but uses - a custom code for file name completion that cycles through files - previously opened. It also works with TRAMP files. - -* Menu: - -* Using TRAMP:: - - -File: ivy.info, Node: Using TRAMP, Up: File Name Completion - -7.1.1 Using TRAMP ------------------ - -‘~’ (tilde) -........... - - Move to the home directory. Either the local or the remote one, - depending on the current directory. The boolean option - ‘ivy-magic-tilde’ decides whether the binding to do this is ‘~’ or - ‘~/’. - -‘//’ (double slash) -................... - - Move to the root directory. Either the local or the remote one, - depending on the current directory. Here, you can also select a - TRAMP connection method, such as ‘ssh’ or ‘scpx’. - -‘/ C-j’ -....... - - Move the the local root directory. - -‘~~’ -.... - - Move to the local home directory. - - From any directory, with the empty input, inputting ‘/ssh:’ and -pressing ‘C-j’ (or ‘RET’, which is the same thing) completes for host -and user names. - - For ‘/ssh:user@’ input, completes the domain name. - - ‘C-i’ works in a similar way to the default completion. - - You can also get sudo access for the current directory by inputting -‘/sudo::’ ‘RET’. Using ‘/sudo:’ (i.e. single colon instead of double) -will result in a completion session for the desired user. - - Multi-hopping is possible, although a bit complex. - -Example : connect to a remote host ‘cloud’ and open a file with ‘sudo’ there -............................................................................ - - • ‘C-x C-f’ ‘/ssh:cloud|sudo:root:/’. - - -File: ivy.info, Node: Buffer Name Completion, Next: Counsel commands, Prev: File Name Completion, Up: Commands - -7.2 Buffer Name Completion -========================== - - -- User Option: ivy-use-virtual-buffers - When non-nil, add ‘recentf-mode’ and bookmarks to - ‘ivy-switch-buffer’ completion candidates. - - Adding this to Emacs init file: - - (setq ivy-use-virtual-buffers t) - will add additional virtual buffers to the buffers list for recent - files. Selecting such virtual buffers, which are highlighted with - ‘ivy-virtual’ face, will open the corresponding file. - - -File: ivy.info, Node: Counsel commands, Prev: Buffer Name Completion, Up: Commands - -7.3 Counsel commands -==================== - -The main advantages of ‘counsel-’ functions over their basic equivalents -in ‘ivy-mode’ are: - - 1. Multi-actions and non-exiting actions work. - 2. ‘ivy-resume’ can resume the last completion session. - 3. Customize ‘ivy-set-actions’, ‘ivy-re-builders-alist’. - 4. Customize individual keymaps, such as ‘counsel-describe-map’, - ‘counsel-git-grep-map’, or ‘counsel-find-file-map’, instead of - customizing ‘ivy-minibuffer-map’ that applies to all completion - sessions. - - -File: ivy.info, Node: API, Next: Variable Index, Prev: Commands, Up: Top - -8 API -***** - -The main (and only) entry point is the ‘ivy-read’ function. It takes -two required arguments and many optional arguments that can be passed by -a key. The optional ‘:action’ argument is highly recommended for -features such as multi-actions, non-exiting actions, ‘ivy-occur’ and -‘ivy-resume’. - -* Menu: - -* Required arguments for ivy-read:: -* Optional arguments for ivy-read:: -* Example - counsel-describe-function:: -* Example - counsel-locate:: -* Example - ivy-read-with-extra-properties:: - - -File: ivy.info, Node: Required arguments for ivy-read, Next: Optional arguments for ivy-read, Up: API - -8.1 Required arguments for ‘ivy-read’ -===================================== - -‘prompt’ -........ - - A prompt string normally ending in a colon and a space. - ‘ivy-count-format’ is prepended to it during completion. - -‘collection’ -............ - - Either a list of strings, a function, an alist or a hash table. - - If a function, then it has to be compatible with ‘all-completions’. - - -File: ivy.info, Node: Optional arguments for ivy-read, Next: Example - counsel-describe-function, Prev: Required arguments for ivy-read, Up: API - -8.2 Optional arguments for ‘ivy-read’ -===================================== - -‘predicate’ -........... - - Is a function to filter the initial collection. It has to be - compatible with ‘all-completions’. Tip: most of the time, it’s - simpler to just apply this filter to the ‘collection’ argument - itself, e.g. ‘(cl-remove-if-not predicate collection)’. - -‘require-match’ -............... - - When set to a non-nil value, input must match one of the - candidates. Custom input is not accepted. - -‘initial-input’ -............... - - This string argument is included for compatibility with - ‘completing-read’, which inserts it into the minibuffer. - - It’s recommended to use the ‘preselect’ argument instead of this. - -‘history’ -......... - - Name of the symbol to store history. See ‘completing-read’. - -‘preselect’ -........... - - Determines which one of the candidates to initially select. - - When set to an integer value, select the candidate with that index - value. - - When set to any other non-nil value, select the first candidate - matching this value. Comparison is first done with ‘equal’. If - this fails, and when applicable, match ‘preselect’ as a regular - expression. - - Every time the input becomes empty, the item corresponding to - ‘preselect’ is selected. - -‘keymap’ -........ - - A keymap to be composed with ‘ivy-minibuffer-map’. This keymap has - priority over ‘ivy-minibuffer-map’ and can be modified at any later - stage. - -‘update-fn’ -........... - - Is the function called each time the current candidate changes. - This function takes no arguments and is called in the minibuffer’s - ‘post-command-hook’. See ‘swiper’ for an example usage. - -‘sort’ -...... - - When non-nil, use ‘ivy-sort-functions-alist’ to sort the collection - as long as the collection is not larger than ‘ivy-sort-max-size’. - -‘action’ -........ - - Is the function to call after selection. It takes a string - argument. - -‘unwind’ -........ - - Is the function to call before exiting completion. It takes no - arguments. This function is called even if the completion is - interrupted with ‘C-g’. See ‘swiper’ for an example usage. - -‘re-builder’ -............ - - Is a function that takes a string and returns a valid regex. See - ‘Completion Styles’ for details. - -‘matcher’ -......... - - Is a function that takes a regex string and a list of strings and - returns a list of strings matching the regex. Any ordinary Emacs - matching function will suffice, yet finely tuned matching functions - can be used. See ‘counsel-find-file’ for an example usage. - -‘dynamic-collection’ -.................... - - When non-nil, ‘collection’ will be used to dynamically generate the - candidates each time the input changes, instead of being used once - statically with ‘all-completions’ to generate a list of strings. - See ‘counsel-locate’ for an example usage. - -‘caller’ -........ - - Is a symbol that uniquely identifies the function that called - ‘ivy-read’, which may be useful for further customizations. - - -File: ivy.info, Node: Example - counsel-describe-function, Next: Example - counsel-locate, Prev: Optional arguments for ivy-read, Up: API - -8.3 Example - ‘counsel-describe-function’ -========================================= - -This is a typical example of a function with a non-async collection, -which is a collection where all the strings in the collection are known -prior to any input from the user. - - Only the first two arguments (along with ‘action’) are essential - -the rest of the arguments are for fine-tuning, and could be omitted. - - The ‘action’ argument could also be omitted - but then ‘ivy-read’ -would do nothing except returning the string result, which you could -later use yourself. However, it’s recommended that you use the ‘action’ -argument. - - (defun counsel-describe-function () - "Forward to `describe-function'." - (interactive) - (ivy-read "Describe function: " - (let (cands) - (mapatoms - (lambda (x) - (when (fboundp x) - (push (symbol-name x) cands)))) - cands) - :keymap counsel-describe-map - :preselect (ivy-thing-at-point) - :history 'counsel-describe-symbol-history - :require-match t - :action (lambda (x) - (describe-function - (intern x))) - :caller 'counsel-describe-function)) - - Here are the interesting features of the above function, in the order -that they appear: - - • The ‘prompt’ argument is a simple string ending in ": ". - • The ‘collection’ argument evaluates to a (large) list of strings. - • The ‘keymap’ argument is for a custom keymap to supplement - ‘ivy-minibuffer-map’. - • The ‘preselect’ is provided by ‘ivy-thing-at-point’, which returns - a symbol near the point. Ivy then selects the first candidate from - the collection that matches this symbol. To select this - pre-selected candidate, a ‘RET’ will suffice. No further user - input is necessary. - • The ‘history’ argument is for keeping the history of this command - separate from the common history in ‘ivy-history’. - • The ‘require-match’ is set to ‘t’ since it doesn’t make sense to - call ‘describe-function’ on an un-interned symbol. - • The ‘action’ argument calls ‘describe-function’ on the interned - selected candidate. - • The ‘caller’ argument identifies this completion session. This is - important, since with the collection being a list of strings and - not a function name, the only other way for ‘ivy-read’ to identify - "who’s calling" and to apply the appropriate customizations is to - examine ‘this-command’. But ‘this-command’ would be modified if - another command called ‘counsel-describe-function’. - - -File: ivy.info, Node: Example - counsel-locate, Next: Example - ivy-read-with-extra-properties, Prev: Example - counsel-describe-function, Up: API - -8.4 Example - ‘counsel-locate’ -============================== - -This is a typical example of a function with an async collection. Since -the collection function cannot pre-compute all the locatable files in -memory within reasonable limits (time or memory), it relies on user -input to filter the universe of possible candidates to a manageable size -while also continuing to search asynchronously for possible candidates. -Both the filtering and searching continues with each character change of -the input with rapid updates to the collection presented without idle -waiting times. This live update will continue as long as there are -likely candidates. Eventually updates to the minibuffer will stop after -user input, filtering, and searching have exhausted looking for possible -candidates. - - Async collections suit long-running shell commands, such as ‘locate’. -With each new input, a new process starts while the old process is -killed. The collection is refreshed anew with each new process. -Meanwhile the user can provide more input characters (for further -narrowing) or select a candidate from the visible collection. - - (defun counsel-locate-function (str) - (or - (ivy-more-chars) - (progn - (counsel--async-command - (format "locate %s '%s'" - (mapconcat #'identity counsel-locate-options " ") - (counsel--elisp-to-pcre - (ivy--regex str)))) - '("" "working...")))) - - ;;;###autoload - (defun counsel-locate (&optional initial-input) - "Call the \"locate\" shell command. - INITIAL-INPUT can be given as the initial minibuffer input." - (interactive) - (ivy-read "Locate: " #'counsel-locate-function - :initial-input initial-input - :dynamic-collection t - :history 'counsel-locate-history - :action (lambda (file) - (with-ivy-window - (when file - (find-file file)))) - :unwind #'counsel-delete-process - :caller 'counsel-locate)) - - Here are the interesting features of the above functions, in the -order that they appear: - - • ‘counsel-locate-function’ takes a string argument and returns a - list of strings. Note that it’s not compatible with - ‘all-completions’, but since we’re not using that here, might as - well use one argument instead of three. - • ‘ivy-more-chars’ is a simple function that returns e.g. ‘'("2 - chars more")’ asking the user for more input. - • ‘counsel--async-command’ is a very easy API simplification that - takes a single string argument suitable for - ‘shell-command-to-string’. So you could prototype your function as - non-async using ‘shell-command-to-string’ and ‘split-string’ to - produce a collection, then decide that you want async and simply - swap in ‘counsel--async-command’. - • ‘counsel-locate’ is an interactive function with an optional - ‘initial-input’. - • ‘#'counsel-locate-function’ is passed as the ‘collection’ argument. - • ‘dynamic-collection’ is set to t, since this is an async - collection. - • ‘action’ argument uses ‘with-ivy-window’ wrapper, since we want to - open the selected file in the same window from which - ‘counsel-locate’ was called. - • ‘unwind’ argument is set to ‘#'counsel-delete-process’: when we - press ‘C-g’ we want to kill the running process created by - ‘counsel--async-command’. - • ‘caller’ argument identifies this command for easier customization. - - -File: ivy.info, Node: Example - ivy-read-with-extra-properties, Prev: Example - counsel-locate, Up: API - -8.5 Example - ‘ivy-read-with-extra-properties’ -============================================== - -This is another example to show how to associate additional values to -each displayed strings. - - (defun find-candidates-function (str pred _) - (let ((props '(1 2)) - (strs '("foo" "foo2"))) - (cl-mapcar (lambda (s p) (propertize s 'property p)) - strs - props))) - - (defun find-candidates () - (interactive) - (ivy-read "Find symbols: " - #'find-candidates-function - :action (lambda (x) - (message "Value: %s" (get-text-property 0 'property x) - )))) - - Here are the interesting features of the above function: - - • ‘find-candidates-function’ builds up a list of strings and - associates "foo" with the value 1 and "foo2" with 2. - • ‘find-candidates’ is an interactive function. - • ‘#'find-candidates’ is passed as the ‘collection’ argument. - • ‘action’ gets passed the selected string with the associated value. - It then retrieves that value and displays it. - - -File: ivy.info, Node: Variable Index, Next: Keystroke Index, Prev: API, Up: Top - -Variable Index -************** - -[index] -* Menu: - -* ivy-alt-done: Key bindings for single selection action then exit minibuffer. - (line 30) -* ivy-alt-done <1>: File Name Completion. (line 12) -* ivy-avy: Key bindings for single selection action then exit minibuffer. - (line 64) -* ivy-backward-delete-char: File Name Completion. (line 19) -* ivy-call: Key bindings for multiple selections and actions keep minibuffer open. - (line 16) -* ivy-confirm-face: Faces. (line 34) -* ivy-count-format: Defcustoms. (line 6) -* ivy-current-match: Faces. (line 9) -* ivy-dispatching-call: Key bindings for multiple selections and actions keep minibuffer open. - (line 26) -* ivy-dispatching-done: Key bindings for single selection action then exit minibuffer. - (line 24) -* ivy-display-style: Defcustoms. (line 24) -* ivy-done: Key bindings for single selection action then exit minibuffer. - (line 19) -* ivy-extra-directories: File Name Completion. (line 45) -* ivy-height: Key bindings for navigation. - (line 21) -* ivy-immediate-done: Key bindings for single selection action then exit minibuffer. - (line 53) -* ivy-insert-current: Key bindings that alter the minibuffer input. - (line 23) -* ivy-kill-ring-save: Other key bindings. (line 9) -* ivy-match-required-face: Faces. (line 53) -* ivy-minibuffer-grow: Hydra in the minibuffer. - (line 45) -* ivy-minibuffer-map: Minibuffer key bindings. - (line 6) -* ivy-minibuffer-match-face-1: Faces. (line 14) -* ivy-minibuffer-match-face-2: Faces. (line 19) -* ivy-minibuffer-match-face-3: Faces. (line 24) -* ivy-minibuffer-match-face-4: Faces. (line 29) -* ivy-minibuffer-shrink: Hydra in the minibuffer. - (line 50) -* ivy-modified-buffer: Faces. (line 88) -* ivy-modified-outside-buffer: Faces. (line 93) -* ivy-next-action: Hydra in the minibuffer. - (line 60) -* ivy-next-history-element: Key bindings that alter the minibuffer input. - (line 9) -* ivy-next-line-and-call: Key bindings for multiple selections and actions keep minibuffer open. - (line 36) -* ivy-occur: Saving the current completion session to a buffer. - (line 9) -* ivy-occur-click: Saving the current completion session to a buffer. - (line 21) -* ivy-occur-dispatch: Saving the current completion session to a buffer. - (line 41) -* ivy-occur-press: Saving the current completion session to a buffer. - (line 16) -* ivy-occur-read-action: Saving the current completion session to a buffer. - (line 36) -* ivy-on-del-error-function: Defcustoms. (line 31) -* ivy-partial-or-done: Key bindings for single selection action then exit minibuffer. - (line 37) -* ivy-prev-action: Hydra in the minibuffer. - (line 55) -* ivy-previous-history-element: Key bindings that alter the minibuffer input. - (line 18) -* ivy-previous-line-and-call: Key bindings for multiple selections and actions keep minibuffer open. - (line 47) -* ivy-read-action: Hydra in the minibuffer. - (line 65) -* ivy-remote: Faces. (line 71) -* ivy-restrict-to-matches: Key bindings that alter the minibuffer input. - (line 40) -* ivy-resume: Key bindings for multiple selections and actions keep minibuffer open. - (line 55) -* ivy-reverse-i-search: Key bindings that alter the minibuffer input. - (line 48) -* ivy-rotate-preferred-builders: Hydra in the minibuffer. - (line 40) -* ivy-subdir: Faces. (line 66) -* ivy-toggle-calling: Hydra in the minibuffer. - (line 34) -* ivy-toggle-case-fold: Hydra in the minibuffer. - (line 70) -* ivy-toggle-regexp-quote: File Name Completion. (line 41) -* ivy-use-virtual-buffers: Buffer Name Completion. - (line 6) -* ivy-virtual: Faces. (line 76) -* ivy-wrap: Key bindings for navigation. - (line 14) -* ivy-yank-word: Key bindings that alter the minibuffer input. - (line 32) - - -File: ivy.info, Node: Keystroke Index, Prev: Variable Index, Up: Top - -Keystroke Index -*************** - -[index] -* Menu: - -* /: File Name Completion. (line 35) -* / C-j: Using TRAMP. (line 24) -* //: File Name Completion. (line 25) -* // <1>: Using TRAMP. (line 17) -* <: Hydra in the minibuffer. - (line 50) -* >: Hydra in the minibuffer. - (line 45) -* ~: File Name Completion. (line 30) -* ~ <1>: Using TRAMP. (line 9) -* ~~: Using TRAMP. (line 29) -* a: Hydra in the minibuffer. - (line 65) -* a <1>: Saving the current completion session to a buffer. - (line 36) -* c: Hydra in the minibuffer. - (line 34) -* C: Hydra in the minibuffer. - (line 70) -* C-': Key bindings for single selection action then exit minibuffer. - (line 64) -* C-c C-o: Saving the current completion session to a buffer. - (line 9) -* C-j: Key bindings for single selection action then exit minibuffer. - (line 30) -* C-j <1>: File Name Completion. (line 12) -* C-m: Key bindings for single selection action then exit minibuffer. - (line 19) -* C-M-j: Key bindings for single selection action then exit minibuffer. - (line 53) -* C-M-m: Key bindings for multiple selections and actions keep minibuffer open. - (line 16) -* C-M-n: Key bindings for multiple selections and actions keep minibuffer open. - (line 36) -* C-M-o: Key bindings for multiple selections and actions keep minibuffer open. - (line 26) -* C-M-p: Key bindings for multiple selections and actions keep minibuffer open. - (line 47) -* C-o: Hydra in the minibuffer. - (line 9) -* C-r: Key bindings that alter the minibuffer input. - (line 48) -* DEL: File Name Completion. (line 19) -* f: Saving the current completion session to a buffer. - (line 16) -* j: Saving the current completion session to a buffer. - (line 26) -* k: Saving the current completion session to a buffer. - (line 31) -* m: Hydra in the minibuffer. - (line 40) -* M-i: Key bindings that alter the minibuffer input. - (line 23) -* M-j: Key bindings that alter the minibuffer input. - (line 32) -* M-n: Key bindings that alter the minibuffer input. - (line 9) -* M-o: Key bindings for single selection action then exit minibuffer. - (line 24) -* M-p: Key bindings that alter the minibuffer input. - (line 18) -* M-r: File Name Completion. (line 41) -* M-w: Other key bindings. (line 9) -* mouse-1: Saving the current completion session to a buffer. - (line 21) -* o: Saving the current completion session to a buffer. - (line 41) -* q: Saving the current completion session to a buffer. - (line 46) -* RET: Key bindings for single selection action then exit minibuffer. - (line 19) -* RET <1>: Saving the current completion session to a buffer. - (line 16) -* s: Hydra in the minibuffer. - (line 60) -* S-SPC: Key bindings that alter the minibuffer input. - (line 40) -* TAB: Key bindings for single selection action then exit minibuffer. - (line 37) -* w: Hydra in the minibuffer. - (line 55) - - - -Tag Table: -Node: Top1189 -Node: Introduction3100 -Node: Installation5623 -Node: Installing from Emacs Package Manager6073 -Node: Installing from the Git repository7187 -Node: Getting started8007 -Node: Basic customization8314 -Node: Key bindings8909 -Node: Global key bindings9101 -Node: Minibuffer key bindings11575 -Node: Key bindings for navigation12807 -Node: Key bindings for single selection action then exit minibuffer14014 -Node: Key bindings for multiple selections and actions keep minibuffer open16661 -Node: Key bindings that alter the minibuffer input19053 -Node: Other key bindings20998 -Node: Hydra in the minibuffer21376 -Node: Saving the current completion session to a buffer23794 -Node: Completion Styles25206 -Node: ivy--regex-plus26957 -Node: ivy--regex-ignore-order28443 -Node: ivy--regex-fuzzy28811 -Node: Customization29308 -Node: Faces29494 -Node: Defcustoms31923 -Node: Actions33217 -Node: What are actions?33543 -Node: How can different actions be called?34361 -Node: How to modify the actions list?34932 -Node: Example - add two actions to each command35592 -Node: How to undo adding the two actions36551 -Node: How to add actions to a specific command37003 -Node: Example - define a new command with several actions37419 -Node: Test the above function with ivy-occur38307 -Node: Packages39149 -Node: Commands40114 -Node: File Name Completion40299 -Node: Using TRAMP42095 -Node: Buffer Name Completion43597 -Node: Counsel commands44212 -Node: API44859 -Node: Required arguments for ivy-read45457 -Node: Optional arguments for ivy-read45976 -Node: Example - counsel-describe-function49402 -Node: Example - counsel-locate52260 -Node: Example - ivy-read-with-extra-properties56010 -Node: Variable Index57218 -Node: Keystroke Index64265 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: diff --git a/elpa/ivy-gitlab-readme.txt b/elpa/ivy-gitlab-readme.txt deleted file mode 100644 index 46813085..00000000 --- a/elpa/ivy-gitlab-readme.txt +++ /dev/null @@ -1 +0,0 @@ -Provides an Ivy interface to Gitlab diff --git a/elpa/json-mode-20190123.422/json-mode-autoloads.el b/elpa/json-mode-20190123.422/json-mode-autoloads.el deleted file mode 100644 index 9b1b0add..00000000 --- a/elpa/json-mode-20190123.422/json-mode-autoloads.el +++ /dev/null @@ -1,65 +0,0 @@ -;;; json-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "json-mode" "json-mode.el" (0 0 0 0)) -;;; Generated autoloads from json-mode.el - -(defconst json-mode-standard-file-ext '(".json" ".jsonld") "\ -List of JSON file extensions.") - -(defsubst json-mode--update-auto-mode (filenames) "\ -Update the `json-mode' entry of `auto-mode-alist'. - -FILENAMES should be a list of file as string. -Return the new `auto-mode-alist' entry" (let* ((new-regexp (rx-to-string (\` (seq (eval (cons (quote or) (append json-mode-standard-file-ext (quote (\, filenames))))) eot)))) (new-entry (cons new-regexp (quote json-mode))) (old-entry (when (boundp (quote json-mode--auto-mode-entry)) json-mode--auto-mode-entry))) (setq auto-mode-alist (delete old-entry auto-mode-alist)) (add-to-list (quote auto-mode-alist) new-entry) new-entry)) - -(defvar json-mode-auto-mode-list '(".babelrc" ".bowerrc" "composer.lock") "\ -List of filename as string to pass for the JSON entry of -`auto-mode-alist'. - -Note however that custom `json-mode' entries in `auto-mode-alist' -won’t be affected.") - -(custom-autoload 'json-mode-auto-mode-list "json-mode" nil) - -(defvar json-mode--auto-mode-entry (json-mode--update-auto-mode json-mode-auto-mode-list) "\ -Regexp generated from the `json-mode-auto-mode-list'.") - -(autoload 'json-mode "json-mode" "\ -Major mode for editing JSON files - -\(fn)" t nil) - -(add-to-list 'magic-fallback-mode-alist '("^[{[]$" . json-mode)) - -(autoload 'json-mode-show-path "json-mode" "\ -Print the path to the node at point to the minibuffer, and yank to the kill ring. - -\(fn)" t nil) - -(autoload 'json-mode-kill-path "json-mode" "\ - - -\(fn)" t nil) - -(autoload 'json-mode-beautify "json-mode" "\ -Beautify / pretty-print the active region (or the entire buffer if no active region). - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "json-mode" '("json-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; json-mode-autoloads.el ends here diff --git a/elpa/json-mode-20190123.422/json-mode-pkg.el b/elpa/json-mode-20190123.422/json-mode-pkg.el deleted file mode 100644 index 5dab6796..00000000 --- a/elpa/json-mode-20190123.422/json-mode-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "json-mode" "20190123.422" "Major mode for editing JSON files." '((json-reformat "0.0.5") (json-snatcher "1.0.0")) :commit "0e819e519ae17a2686e0881c4ca51fa873fa9b83" :authors '(("Josh Johnston")) :maintainer '("Josh Johnston") :url "https://github.com/joshwnj/json-mode") diff --git a/elpa/json-mode-20190123.422/json-mode.el b/elpa/json-mode-20190123.422/json-mode.el deleted file mode 100644 index cbc2d51f..00000000 --- a/elpa/json-mode-20190123.422/json-mode.el +++ /dev/null @@ -1,223 +0,0 @@ -;;; json-mode.el --- Major mode for editing JSON files. - -;; Copyright (C) 2011-2014 Josh Johnston - -;; Author: Josh Johnston -;; URL: https://github.com/joshwnj/json-mode -;; Package-Version: 20190123.422 -;; Version: 1.6.0 -;; Package-Requires: ((json-reformat "0.0.5") (json-snatcher "1.0.0")) - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; extend the builtin js-mode's syntax highlighting - -;;; Code: - -(require 'js) -(require 'rx) -(require 'json-snatcher) -(require 'json-reformat) - -(defgroup json-mode '() - "Major mode for editing JSON files." - :group 'js) - -;;;###autoload -(defconst json-mode-standard-file-ext '(".json" ".jsonld") - "List of JSON file extensions.") - -;; This is to be sure the customization is loaded. Otherwise, -;; autoload discards any defun or defcustom. -;;;###autoload -(defsubst json-mode--update-auto-mode (filenames) - "Update the `json-mode' entry of `auto-mode-alist'. - -FILENAMES should be a list of file as string. -Return the new `auto-mode-alist' entry" - (let* ((new-regexp - (rx-to-string - `(seq (eval - (cons 'or - (append json-mode-standard-file-ext - ',filenames))) eot))) - (new-entry (cons new-regexp 'json-mode)) - (old-entry (when (boundp 'json-mode--auto-mode-entry) - json-mode--auto-mode-entry))) - (setq auto-mode-alist (delete old-entry auto-mode-alist)) - (add-to-list 'auto-mode-alist new-entry) - new-entry)) - -;;;###autoload -(defcustom json-mode-auto-mode-list '( - ".babelrc" - ".bowerrc" - "composer.lock" - ) - "List of filename as string to pass for the JSON entry of -`auto-mode-alist'. - -Note however that custom `json-mode' entries in `auto-mode-alist' -won’t be affected." - :group 'json-mode - :type '(repeat string) - :set (lambda (symbol value) - "Update SYMBOL with a new regexp made from VALUE. - -This function calls `json-mode--update-auto-mode' to change the -`json-mode--auto-mode-entry' entry in `auto-mode-alist'." - (set-default symbol value) - (setq json-mode--auto-mode-entry (json-mode--update-auto-mode value)))) - -;; Autoload needed to initalize the the `auto-list-mode' entry. -;;;###autoload -(defvar json-mode--auto-mode-entry (json-mode--update-auto-mode json-mode-auto-mode-list) - "Regexp generated from the `json-mode-auto-mode-list'.") - -(defconst json-mode-quoted-string-re - (rx (group (char ?\") - (zero-or-more (or (seq ?\\ ?\\) - (seq ?\\ ?\") - (seq ?\\ (not (any ?\" ?\\))) - (not (any ?\" ?\\)))) - (char ?\")))) -(defconst json-mode-quoted-key-re - (rx (group (char ?\") - (zero-or-more (or (seq ?\\ ?\\) - (seq ?\\ ?\") - (seq ?\\ (not (any ?\" ?\\))) - (not (any ?\" ?\\)))) - (char ?\")) - (zero-or-more blank) - ?\:)) -(defconst json-mode-number-re (rx (group (one-or-more digit) - (optional ?\. (one-or-more digit))))) -(defconst json-mode-keyword-re (rx (group (or "true" "false" "null")))) - -(defconst json-font-lock-keywords-1 - (list - (list json-mode-quoted-key-re 1 font-lock-keyword-face) - (list json-mode-quoted-string-re 1 font-lock-string-face) - (list json-mode-keyword-re 1 font-lock-constant-face) - (list json-mode-number-re 1 font-lock-constant-face) - ) - "Level one font lock.") - -;;;###autoload -(define-derived-mode json-mode javascript-mode "JSON" - "Major mode for editing JSON files" - (set (make-local-variable 'font-lock-defaults) '(json-font-lock-keywords-1 t))) - -;; Well formatted JSON files almost always begin with “{†or “[â€. -;;;###autoload -(add-to-list 'magic-fallback-mode-alist '("^[{[]$" . json-mode)) - -;;;###autoload -(defun json-mode-show-path () - "Print the path to the node at point to the minibuffer, and yank to the kill ring." - (interactive) - (message (jsons-print-path))) - -(define-key json-mode-map (kbd "C-c C-p") 'json-mode-show-path) - -;;;###autoload -(defun json-mode-kill-path () - (interactive) - (kill-new (jsons-print-path))) - -(define-key json-mode-map (kbd "C-c P") 'json-mode-kill-path) - -;;;###autoload -(defun json-mode-beautify () - "Beautify / pretty-print the active region (or the entire buffer if no active region)." - (interactive) - (let ((json-reformat:indent-width js-indent-level) - (json-reformat:pretty-string? t)) - (if (use-region-p) - (json-reformat-region (region-beginning) (region-end)) - (json-reformat-region (buffer-end -1) (buffer-end 1))))) - -(define-key json-mode-map (kbd "C-c C-f") 'json-mode-beautify) - -(defun json-toggle-boolean () - "If point is on `true' or `false', toggle it." - (interactive) - (unless (nth 8 (syntax-ppss)) ; inside a keyword, string or comment - (let* ((bounds (bounds-of-thing-at-point 'symbol)) - (string (and bounds (buffer-substring-no-properties (car bounds) (cdr bounds)))) - (pt (point))) - (when (and bounds (member string '("true" "false"))) - (delete-region (car bounds) (cdr bounds)) - (cond - ((string= "true" string) - (insert "false") - (goto-char (if (= pt (cdr bounds)) (1+ pt) pt))) - (t - (insert "true") - (goto-char (if (= pt (cdr bounds)) (1- pt) pt)))))))) - -(define-key json-mode-map (kbd "C-c C-t") 'json-toggle-boolean) - -(defun json-nullify-sexp () - "Replace the sexp at point with `null'." - (interactive) - (let ((syntax (syntax-ppss)) symbol) - (cond - ((nth 4 syntax) nil) ; inside a comment - ((nth 3 syntax) ; inside a string - (goto-char (nth 8 syntax)) - (when (save-excursion (forward-sexp) (skip-chars-forward "[:space:]") (eq (char-after) ?:)) - ;; sexp is an object key, so we nullify the entire object - (goto-char (nth 1 syntax))) - (kill-sexp) - (insert "null")) - ((setq symbol (bounds-of-thing-at-point 'symbol)) - (cond - ((looking-at-p "null")) - ((save-excursion (skip-chars-backward "[0-9.]") (looking-at json-mode-number-re)) - (kill-region (match-beginning 0) (match-end 0)) - (insert "null")) - (t (kill-region (car symbol) (cdr symbol)) (insert "null")))) - ((< 0 (nth 0 syntax)) - (goto-char (nth 1 syntax)) - (kill-sexp) - (insert "null")) - (t nil)))) - -(define-key json-mode-map (kbd "C-c C-k") 'json-nullify-sexp) - -(defun json-increment-number-at-point (&optional delta) - "Add DELTA to the number at point; DELTA defaults to 1." - (interactive) - (when (save-excursion (skip-chars-backward "[0-9.]") (looking-at json-mode-number-re)) - (let ((num (+ (or delta 1) - (string-to-number (buffer-substring-no-properties (match-beginning 0) (match-end 0))))) - (pt (point))) - (delete-region (match-beginning 0) (match-end 0)) - (insert (number-to-string num)) - (goto-char pt)))) - -(define-key json-mode-map (kbd "C-c C-i") 'json-increment-number-at-point) - -(defun json-decrement-number-at-point () - "Decrement the number at point." - (interactive) - (json-increment-number-at-point -1)) - -(define-key json-mode-map (kbd "C-c C-d") 'json-decrement-number-at-point) - -(provide 'json-mode) -;;; json-mode.el ends here diff --git a/elpa/json-mode-20190123.422/json-mode.elc b/elpa/json-mode-20190123.422/json-mode.elc deleted file mode 100644 index 56a7b0804f432580ef226f982d106f294bbec734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8271 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 -;; URL: https://github.com/gongo/json-reformat -;; Package-Version: 20160212.853 -;; Version: 0.0.6 -;; Keywords: json - -;; Copyright (c) 2012 Wataru MIYAGUNI -;; -;; MIT License -;; -;; Permission is hereby granted, free of charge, to any person obtaining -;; a copy of this software and associated documentation files (the -;; "Software"), to deal in the Software without restriction, including -;; without limitation the rights to use, copy, modify, merge, publish, -;; distribute, sublicense, and/or sell copies of the Software, and to -;; permit persons to whom the Software is furnished to do so, subject to -;; the following conditions: -;; -;; The above copyright notice and this permission notice shall be -;; included in all copies or substantial portions of the Software. -;; -;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -;; LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -;; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -;; WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -;;; Commentary: - -;; json-reformat.el is a reformatting tool for JSON (http://json.org/). -;; -;; ## Usage -;; -;; 1. Specify region -;; 2. Call 'M-x json-reformat-region' -;; -;; ## Customize -;; -;; - `json-reformat:indent-width' -;; - `json-reformat:pretty-string?' -;; - -;;; Code: - -(require 'json) -(eval-when-compile (require 'cl)) - -(unless (require 'subr-x nil t) - ;; built-in subr-x from 24.4 - (defsubst hash-table-keys (hash-table) - "Return a list of keys in HASH-TABLE." - (let ((keys '())) - (maphash (lambda (k _v) (push k keys)) hash-table) - keys))) - -(put 'json-reformat-error 'error-message "JSON Reformat error") -(put 'json-reformat-error 'error-conditions '(json-reformat-error error)) - -(defconst json-reformat:special-chars-as-pretty-string - '((?\" . ?\") - (?\\ . ?\\))) - -(defcustom json-reformat:indent-width 4 - "How much indentation `json-reformat-region' should do at each level." - :type 'integer - :safe #'integerp - :group 'json-reformat) - -(defcustom json-reformat:pretty-string? nil - "Whether to decode the string. - -Example: - -{\"name\":\"foobar\",\"nick\":\"foo \\u00e4 bar\",\"description\":\"

\\nbaz\\n
\"} - -If nil: - - { - \"name\": \"foobar\", - \"nick\": \"foo \\u00e4 bar\", - \"description\": \"
\\nbaz\\n<\\/pre>\"
-    }
-
-Else t:
-
-    {
-        \"name\": \"foobar\",
-        \"nick\": \"foo ä bar\",
-        \"description\": \"
-    baz
-    
\" - }" - :type 'boolean - :safe #'booleanp - :group 'json-reformat) - -(defun json-reformat:indent (level) - (make-string (* level json-reformat:indent-width) ? )) - -(defun json-reformat:number-to-string (val) - (number-to-string val)) - -(defun json-reformat:symbol-to-string (val) - (cond ((equal 't val) "true") - ((equal json-false val) "false") - (t (symbol-name val)))) - -(defun json-reformat:encode-char-as-pretty (char) - (setq char (encode-char char 'ucs)) - (let ((special-char (car (rassoc char json-reformat:special-chars-as-pretty-string)))) - (if special-char - (format "\\%c" special-char) - (format "%c" char)))) - -(defun json-reformat:string-to-string (val) - (if json-reformat:pretty-string? - (format "\"%s\"" (mapconcat 'json-reformat:encode-char-as-pretty val "")) - (json-encode-string val))) - -(defun json-reformat:vector-to-string (val level) - (if (= (length val) 0) "[]" - (concat "[\n" - (mapconcat - 'identity - (loop for v across val - collect (concat - (json-reformat:indent (1+ level)) - (json-reformat:print-node v (1+ level)) - )) - (concat ",\n")) - "\n" (json-reformat:indent level) "]" - ))) - -(defun json-reformat:print-node (val level) - (cond ((hash-table-p val) (json-reformat:tree-to-string (json-reformat:tree-sibling-to-plist val) level)) - ((numberp val) (json-reformat:number-to-string val)) - ((vectorp val) (json-reformat:vector-to-string val level)) - ((null val) "null") - ((symbolp val) (json-reformat:symbol-to-string val)) - (t (json-reformat:string-to-string val)))) - -(defun json-reformat:tree-sibling-to-plist (root) - (let (pl) - (dolist (key (reverse (hash-table-keys root)) pl) - (setq pl (plist-put pl key (gethash key root)))))) - -(defun json-reformat:tree-to-string (root level) - (concat "{\n" - (let (key val str) - (while root - (setq key (car root) - val (cadr root) - root (cddr root)) - (setq str - (concat str (json-reformat:indent (1+ level)) - "\"" key "\"" - ": " - (json-reformat:print-node val (1+ level)) - (when root ",") - "\n" - ))) - str) - (json-reformat:indent level) - "}")) - -(defun json-reformat-from-string (string) - (with-temp-buffer - (insert string) - (goto-char (point-min)) - (condition-case errvar - (let ((json-key-type 'string) - (json-object-type 'hash-table) - json-tree) - (setq json-tree (json-read)) - (json-reformat:print-node json-tree 0)) - (json-error - (signal 'json-reformat-error - (list (error-message-string errvar) - (line-number-at-pos (point)) - (point))))))) - -;;;###autoload -(defun json-reformat-region (begin end) - "Reformat the JSON in the specified region. - -If you want to customize the reformat style, -please see the documentation of `json-reformat:indent-width' -and `json-reformat:pretty-string?'." - (interactive "*r") - (let ((start-line (line-number-at-pos begin)) - (start-pos begin)) - (save-excursion - (save-restriction - (narrow-to-region begin end) - (goto-char (point-min)) - (let (reformatted) - (condition-case errvar - (progn - (setq reformatted - (json-reformat-from-string - (buffer-substring-no-properties (point-min) (point-max)))) - (delete-region (point-min) (point-max)) - (insert reformatted)) - (json-reformat-error - (let ((reason (nth 1 errvar)) - (line (nth 2 errvar)) - (position (nth 3 errvar))) - (message - "JSON parse error [Reason] %s [Position] In buffer, line %d (char %d)" - reason - (+ start-line line -1) - (+ start-pos position -1)))))))))) - -(provide 'json-reformat) - -;;; json-reformat.el ends here diff --git a/elpa/json-reformat-20160212.853/json-reformat.elc b/elpa/json-reformat-20160212.853/json-reformat.elc deleted file mode 100644 index 3e15aafb8efbe724f8f119b99a884925e158ded7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5137 zcmb_gZF3XJ5q2e&izJsR-YN$qN7^GCOW<|(O%ezaFqG>cp^_^@av!{^V5qP$Z$Jq>AhYS3;csx9QGjMJH>opWRc)ECcfiMI0V6-?69v1_-K|h%3 z_;@<2jXb)?OZEgErt+tGluG(BgWuD5N;ba!Mw;7oef%d#|2bulJt5+}{-gn$3YJ)@XrNnVM>0EGtrRq@*R^&lpsE zU<w{Wc$jq(rV*oHN(D$23kT%;EHy6w4DC?+WVYr!&dKAdg_j zeily7YBTB|rOA9&m7`kgSCkn%*0>YjAItn0%YkihDE2#4$tZj`P=VTiA5Len>~s0& zK&Wsk1JMt}BuR#08i*aVMWeT68wJ7Kwxv&H=U8T=Gy+*BN{@L2G5#6^Y8ZaN`_Z3u zRea>-Urbmgy%W>e&w=7U{+;cM(qiM~ZX<%}UX@{KTvZwjUlAt=3W3btTCDvzgI0b4 zvHthpQY&AUNRMD0=|ZWdLMlPSB#C9H%KzDb9NYMnA*k&NxcUZn%q|*C1w+;9KWL5u zZ)$Msz7^0^pgaxV%F-D<7eq9;U{5ul4rOZPNjU?%pMZ|)uBvt7p$C} zPKQZ+-pV!Y_O9n*aj(X=gU8#{YeCU=ncIAB!+)nDgw`1NosCT*Pv=sQ&~-t@jtu@U z$R-s#k!G+3fwAJ5)6CgDmeLQzWi0}3hbK(*w^-!gv3Ot|hzD;$i+ihRaqL;H+UbHSFkn0(eVOVUuXvtDV$?r=-c)-So8`B*ZFi! zeK6L4uU>+niq=)4Vu+jxC$_Rc2*QPl8)O7|t8UUa$>Im(ky z@oVUqFX(UiH2>n0*7>A8lyE9@Vc_4b-Nf6wg%<$lIKTfxpk8y~YW>^qd6v6Y57hH( z=V;=@;S*H%}etPL7XWVI(4;&8YJmhsMU`ZU^E1ZmdF)!NTfDVG?istetjMMDHv zM?7ezqqORnRn9}I!FXHU=MxkPHIL&0&Sk9D|AY~%dle!5nWKJzxz86L)=85jHyq}3 zblYKn_MfrV@l>!6g?e9o#h?b!;f?sq>2CenM8fO@Fds58u<#QY+hd9;}O>|!oR~7_OI6Np~6<1#l+%qAWW7uPFUp#(W4kx=jc5} z6qSP8%Sc<_Ws7X1;~-AMiuSMg#nK`C_BC7tofK4Kj6sJ3>M*v>EXx&INtcFQd)#co*MnITJ)^#+=x^Fh$?Bmic5vDmd zm(!UwoKGf*nG4ahudx-)9g_@ygeO}%Sl3<9p{XHV0`~$JN~TDPEhXQTO9{HmE8j() ze8^~JC>n0+=*wlnPEDstW`B#r5qcZNaj^=ACPnV0Gqd(mp1N$ba3$44W^l&cHf7O~ zg5@g=a$Yi6T1ID(1)CvloF&LoJ1}eWiF3cV$Q3!Q(AguBRGngQt~ZJBsl#MG_=JM^ z|1_E7Yl6x-A2GRB^ueSgCD%dgr?K2=ASVgo&KcCs%Z-!Ke0r8!At8QKIY1Eso0M$3 z!P)N0fJ)HuczgGcI!iq-nl4f`hU5@Qn?gJ_E>Kz9tleZ11GPDRZT;gi9PJ*X&(@eU zpC;ru5S!QK_&*x2laWT^^EK3*Z}y&Gu(xp^Z-3+d?JKvh-qw)<>fK9RLWFn;Kz40J z22QVj>54Aj*|7=_Hlk&Dm};9qZCqkwvAj^aiKucIpupv)hSZ=rFPU$zz+>4{3vlAY ziSZA_1jyr)nN0IYX5`}YMfG#S49Px((%+K~4`9_q4QMN)!|#$ze^40E3uHRl=XUVH z11H$R7cd - -;; Author: Sterling Graham -;; URL: http://github.com/sterlingg/json-snatcher -;; Package-Version: 20150512.347 -;; Version: 1.0 -;; Package-Requires: ((emacs "24")) - -;; This file is not part of GNU Emacs. - -;;; Commentary: -;; -;; Well this was my first excursion into ELisp programmming. It didn't go too badly once -;; I fiddled around with a bunch of the functions. -;; -;; The process of getting the path to a JSON value at point starts with -;; a call to the jsons-print-path function. -;; -;; It works by parsing the current buffer into a list of parse tree nodes -;; if the buffer hasn't already been parsed in the current Emacs session. -;; While parsing, the region occupied by the node is recorded into the -;; jsons-parsed-regions hash table as a list.The list contains the location -;; of the first character occupied by the node, the location of the last -;; character occupied, and the path to the node. The parse tree is also stored -;; in the jsons-parsed list for possible future use. -;; -;; Once the buffer has been parsed, the node at point is looked up in the -;; jsons-curr-region list, which is the list of regions described in the -;; previous paragraph for the current buffer. If point is not in one of these -;; interval ranges nil is returned, otherwise the path to the value is returned -;; in the form [] for objects, and [] for arrays. -;; eg: ['value1'][0]['value2'] gets the array at with name value1, then gets the -;; 0th element of the array (another object), then gets the value at 'value2'. -;; - -;;; Installation: -;; -;; IMPORTANT: Works ONLY in Emacs 24 due to the use of the lexical-binding variable. -;; -;; To install add the json-snatcher.el file to your load-path, and -;; add the following lines to your .emacs file: -;;(require 'json-snatcher) -;; (defun js-mode-bindings () -;; "Sets a hotkey for using the json-snatcher plugin." -;; (when (string-match "\\.json$" (buffer-name)) -;; (local-set-key (kbd "C-c C-g") 'jsons-print-path))) -;; (add-hook 'js-mode-hook 'js-mode-bindings) -;; (add-hook 'js2-mode-hook 'js-mode-bindings) -;; -;; This binds the key to snatch the path to the JSON value to C-c C-g only -;; when either JS mode, or JS2 mode is active on a buffer ending with -;; the .json extension. - -;;; License: - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. - -;;; Code: - - -(defvar jsons-curr-token 0 - "The current character in the buffer being parsed.") -(defvar jsons-parsed (make-hash-table :test 'equal) - "Hashes each open buffer to the parse tree for that buffer.") -(defvar jsons-parsed-regions (make-hash-table :test 'equal) - "Hashes each open buffer to the ranges in the buffer for each of the parse trees nodes.") -(defvar jsons-curr-region () "The node ranges in the current buffer.") -(defvar jsons-path-printer 'jsons-print-path-python "Default jsons path printer") -(add-hook 'kill-buffer-hook 'jsons-remove-buffer) - -(defun jsons-consume-token () - "Return the next token in the stream." - (goto-char jsons-curr-token) - (let* ((delim_regex "\\([\][\\{\\}:,]\\)") - ;; TODO: Improve this regex. Although now it SEEMS to be working, and can be - ;; used to validate escapes if needed later. The second half of the string regex is pretty - ;; pointless at the moment. I did it this way, so that the code closely mirrors - ;; the RFC. - (string_regex "\\(\"\\(\\([^\"\\\\\r\s\t\n]\\)*\\([\r\s\t\n]\\)*\\|\\(\\(\\\\\\\\\\)*\\\\\\(\\([^\r\s\t\n]\\|\\(u[0-9A-Fa-f]\\{4\\}\\)\\)\\)\\)\\)+\"\\)") - (num_regex "\\(-?\\(0\\|\\([1-9][[:digit:]]*\\)\\)\\(\\.[[:digit:]]+\\)?\\([eE][-+]?[[:digit:]]+\\)?\\)") - (literal_regex "\\(true\\|false\\|null\\)") - (full_regex (concat "\\(" delim_regex "\\|" literal_regex "\\|" string_regex "\\|" num_regex "\\)"))) - - (if (re-search-forward full_regex (point-max) "Not nil") - (progn - (setq jsons-curr-token (match-end 0)) - (buffer-substring-no-properties (match-beginning 0) (match-end 0))) - (message "Reached EOF. Possibly invalid JSON.")))) - -(defun jsons-array (path) - "Create a new json array object that contain the identifier \"json-array\". -a list of the elements contained in the array, and the PATH to the array." - (let*( - (token (jsons-consume-token)) - (array "json-array") - (elements ()) - (i 0)) - (while (not (string= token "]")) - (if (not (string= token ",")) - (let ((json-val (jsons-value token path i))) - (setq i (+ i 1)) - (push json-val elements) - (setq token (jsons-consume-token))) - (setq token (jsons-consume-token)))) - (list array (reverse elements) path))) - -(defun jsons-literal (token path) - "Given a TOKEN and PATH, this function return the PATH to the literal." - (let ((match_start (match-beginning 0)) - (match_end (match-end 0))) - (progn - (setq jsons-curr-region (append (list (list match_start match_end path)) jsons-curr-region)) - (list "json-literal" token path (list match_start match_end))))) - -(defun jsons-member (token path) - "This function is called when a member in a JSON object needs to be parsed. -Given the current TOKEN, and the PATH to this member." - (let* ((member ()) - (value token) - (range_start (match-beginning 0)) - (range_end (match-end 0)) - ) - (setq member (list "json-member" token)) - (if (not (string= (jsons-consume-token) ":")) - (error "Encountered token other than : in jsons-member") - nil) - (let ((json-val (jsons-value (jsons-consume-token) (cons value path) nil))) - (setq member (list member (append json-val - (list range_start range_end)))) - (setq jsons-curr-region (append (list (list range_start range_end (elt json-val 2))) jsons-curr-region)) - member))) - -(defun jsons-number (token path) - "This function will return a json-number given by the current TOKEN. -PATH points to the path to this number. A json-number is defined as per -the num_regex in the `jsons-get-tokens' function." - (progn - (setq jsons-curr-region (append (list (list (match-beginning 0) (match-end 0) path)) jsons-curr-region)) - (list "json-number" token path))) - -(defun jsons-object (path) - "This function is called when a { is encountered while parsing. -PATH is the path in the tree to this object." - (let*( - (token (jsons-consume-token)) - (members (make-hash-table :test 'equal)) - (object (list "json-object" members path))) - (while (not (string= token "}")) - (if (not (string= token ",")) - (let ((json-mem (jsons-member token path))) - (puthash (elt (elt json-mem 0) 1) (elt json-mem 1) (elt object 1)) - (setq token (jsons-consume-token))) - (setq token (jsons-consume-token)))) - object)) - -(defun jsons-string (token path) - "This function is called when a string is encountered while parsing. -The TOKEN is the current token being examined. -The PATH is the path to this string." -(let ((match_start (match-beginning 0)) - (match_end (match-end 0))) - (progn - (setq jsons-curr-region (append (list (list match_start match_end path)) jsons-curr-region)) - (list "json-string" token path (list match_start match_end))))) - -(defun jsons-value (token path array-index) - "A value, which is either an object, array, string, number, or literal. -The is-array variable is nil if inside an array, or the index in -the array that it occupies. -TOKEN is the current token being parsed. -PATH is the path to this value. -ARRAY-INDEX is non-nil if the value is contained within an array, and -points to the index of this value in the containing array." -;;TODO: Refactor the if array-index statement. - (if array-index - (if (jsons-is-number token) - (list "json-value" (jsons-number token (cons array-index path)) (list (match-beginning 0) (match-end 0))) - (cond - ((string= token "{") (jsons-object (cons array-index path))) - ((string= token "[") (jsons-array (cons array-index path))) - ((string= (substring token 0 1) "\"") (jsons-string token (cons array-index path))) - (t (jsons-literal token (cons array-index path))))) - (if (jsons-is-number token) - (list "json-value" (jsons-number token path) path (list (match-beginning 0) (match-end 0))) - (cond - ((string= token "{") (jsons-object path)) - ((string= token "[") (jsons-array path)) - ((string= (substring token 0 1) "\"") (jsons-string token path)) - (t (jsons-literal token path)))))) - - -(defun jsons-get-path () - "Function to check whether we can grab the json path from the cursor position in the json file." - (let ((i 0) - (node nil)) - (setq jsons-curr-region (gethash (current-buffer) jsons-parsed-regions)) - (when (not (gethash (current-buffer) jsons-parsed)) - (jsons-parse)) - (while (< i (length jsons-curr-region)) - (let* - ((json_region (elt jsons-curr-region i)) - (min_token (elt json_region 0)) - (max_token (elt json_region 1))) - (when (and (> (point) min_token) (< (point) max_token)) - (setq node (elt json_region 2)))) - (setq i (+ i 1))) - node)) - -(defun jsons-is-number (str) - "Test to see whether STR is a valid JSON number." - (progn - (match-end 0) - (save-match-data - (if (string-match "^\\(-?\\(0\\|\\([1-9][[:digit:]]*\\)\\)\\(\\.[[:digit:]]+\\)?\\([eE][-+]?[[:digit:]]+\\)?\\)$" str) - (progn - (match-end 0) - t) - nil)))) - -(defun jsons-parse () - "Parse the file given in file, return a list of nodes representing the file." - (save-excursion - (setq jsons-curr-token 0) - (setq jsons-curr-region ()) - (if (not (gethash (current-buffer) jsons-parsed)) - (let* ((token (jsons-consume-token)) - (return_val nil)) - (cond - ((string= token "{") (setq return_val (jsons-object ()))) - ((string= token "[") (setq return_val (jsons-array ()))) - (t nil)) - (puthash (current-buffer) return_val jsons-parsed) - (puthash (current-buffer) jsons-curr-region jsons-parsed-regions) - return_val) - (gethash (current-buffer) jsons-parsed)))) - -(defun jsons-print-to-buffer (node buffer) - "Prints the given NODE to the BUFFER specified in buffer argument. -TODO: Remove extra comma printed after lists of object members, and lists of array members." - (let ((id (elt node 0))) - (cond - ((string= id "json-array") - (progn - (jsons-put-string buffer "[") - (mapc (lambda (x) (progn - (jsons-print-to-buffer buffer x) - (jsons-put-string buffer ",") )) (elt node 1)) - (jsons-put-string buffer "]"))) - ((string= id "json-literal") - (jsons-put-string buffer (elt node 1))) - ((string= id "json-member") - (jsons-put-string buffer (elt node 1)) - (jsons-put-string buffer ": ") - (jsons-print-to-buffer buffer (elt node 2))) - ((string= id "json-number") - (jsons-put-string buffer (elt node 1))) - ((string= id "json-object") - (progn - (jsons-put-string buffer "{") - (maphash (lambda (key value) - (progn - (jsons-put-string buffer key) - (jsons-put-string buffer ":") - (jsons-print-to-buffer buffer value) - (jsons-put-string buffer ","))) (elt node 1)) - (jsons-put-string buffer "}"))) - ((string= id "json-string") - (jsons-put-string buffer (elt node 1))) - ((string= id "json-value") - (jsons-print-to-buffer buffer (elt node 1))) - (t nil)))) - -(defun jsons-print-path-jq () - "Print the jq path to the JSON value under point, and save it in the kill ring." - (let* ((path (jsons-get-path)) - (i 0) - (jq_str ".") - key) - (setq path (reverse path)) - (while (< i (length path)) - (if (numberp (elt path i)) - (progn - (setq jq_str (concat jq_str "[" (number-to-string (elt path i)) "]")) - (setq i (+ i 1))) - (progn - (setq key (elt path i)) - (setq jq_str (concat jq_str (substring key 1 (- (length key) 1)))) - (setq i (+ i 1)))) - (when (elt path i) - (unless (numberp (elt path i)) - (setq jq_str (concat jq_str "."))))) - (progn (kill-new jq_str) - (princ jq_str)))) - -(defun jsons-print-path-python () - "Print the python path to the JSON value under point, and save it in the kill ring." - (let ((path (jsons-get-path)) - (i 0) - (python_str "")) - (setq path (reverse path)) - (while (< i (length path)) - (if (numberp (elt path i)) - (progn - (setq python_str (concat python_str "[" (number-to-string (elt path i)) "]")) - (setq i (+ i 1))) - (progn - (setq python_str (concat python_str "[" (elt path i) "]")) - (setq i (+ i 1))))) - (progn (kill-new python_str) - (princ python_str)))) - -;;;###autoload -(defun jsons-print-path () - "Print the path to the JSON value under point, and save it in the kill ring." - (interactive) - (funcall jsons-path-printer)) - -(defun jsons-put-string (buffer str) - "Append STR to the BUFFER specified in the argument." - (save-current-buffer - (set-buffer (get-buffer-create buffer)) - (insert (prin1-to-string str t)))) - -(defun jsons-remove-buffer () - "Used to clean up the token regions, and parse tree used by the parser." - (progn - (remhash (current-buffer) jsons-parsed) - (remhash (current-buffer) jsons-parsed-regions))) - -(provide 'json-snatcher) - -;; Local-Variables: -;; indent-tabs-mode: nil -;; End: - -;;; json-snatcher.el ends here diff --git a/elpa/json-snatcher-20150512.347/json-snatcher.elc b/elpa/json-snatcher-20150512.347/json-snatcher.elc deleted file mode 100644 index 1475828720ad8a4eeeae97d41299b72124d9bfb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8486 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 (trust undefined) created at 2019-09-21T19:55:43+0200 using RSA \ No newline at end of file diff --git a/elpa/let-alist-1.0.6/let-alist-autoloads.el b/elpa/let-alist-1.0.6/let-alist-autoloads.el deleted file mode 100644 index 1f6fb6bf..00000000 --- a/elpa/let-alist-1.0.6/let-alist-autoloads.el +++ /dev/null @@ -1,55 +0,0 @@ -;;; let-alist-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "let-alist" "let-alist.el" (0 0 0 0)) -;;; Generated autoloads from let-alist.el - -(autoload 'let-alist "let-alist" "\ -Let-bind dotted symbols to their cdrs in ALIST and execute BODY. -Dotted symbol is any symbol starting with a `.'. Only those present -in BODY are let-bound and this search is done at compile time. - -For instance, the following code - - (let-alist alist - (if (and .title .body) - .body - .site - .site.contents)) - -essentially expands to - - (let ((.title (cdr (assq \\='title alist))) - (.body (cdr (assq \\='body alist))) - (.site (cdr (assq \\='site alist))) - (.site.contents (cdr (assq \\='contents (cdr (assq \\='site alist)))))) - (if (and .title .body) - .body - .site - .site.contents)) - -If you nest `let-alist' invocations, the inner one can't access -the variables of the outer one. You can, however, access alists -inside the original alist by using dots inside the symbol, as -displayed in the example above. - -\(fn ALIST &rest BODY)" nil t) - -(function-put 'let-alist 'lisp-indent-function '1) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "let-alist" '("let-alist--"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; let-alist-autoloads.el ends here diff --git a/elpa/let-alist-1.0.6/let-alist-pkg.el b/elpa/let-alist-1.0.6/let-alist-pkg.el deleted file mode 100644 index aed02fc0..00000000 --- a/elpa/let-alist-1.0.6/let-alist-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "let-alist" "1.0.6" "Easily let-bind values of an assoc-list by their names" '((emacs "24.1")) :url "http://elpa.gnu.org/packages/let-alist.html" :keywords '("extensions" "lisp") :authors '(("Artur Malabarba" . "emacs@endlessparentheses.com")) :maintainer '("Artur Malabarba" . "emacs@endlessparentheses.com")) diff --git a/elpa/let-alist-1.0.6/let-alist.el b/elpa/let-alist-1.0.6/let-alist.el deleted file mode 100644 index 96b397f1..00000000 --- a/elpa/let-alist-1.0.6/let-alist.el +++ /dev/null @@ -1,184 +0,0 @@ -;;; let-alist.el --- Easily let-bind values of an assoc-list by their names -*- lexical-binding: t; -*- - -;; Copyright (C) 2014-2019 Free Software Foundation, Inc. - -;; Author: Artur Malabarba -;; Package-Requires: ((emacs "24.1")) -;; Version: 1.0.6 -;; Keywords: extensions lisp -;; Prefix: let-alist -;; Separator: - - -;; This is an Elpa :core package. Don't use functionality that is not -;; compatible with Emacs 24.1. - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This package offers a single macro, `let-alist'. This macro takes a -;; first argument (whose value must be an alist) and a body. -;; -;; The macro expands to a let form containing body, where each dotted -;; symbol inside body is let-bound to their cdrs in the alist. Dotted -;; symbol is any symbol starting with a `.'. Only those present in -;; the body are let-bound and this search is done at compile time. -;; -;; For instance, the following code -;; -;; (let-alist alist -;; (if (and .title .body) -;; .body -;; .site -;; .site.contents)) -;; -;; essentially expands to -;; -;; (let ((.title (cdr (assq 'title alist))) -;; (.body (cdr (assq 'body alist))) -;; (.site (cdr (assq 'site alist))) -;; (.site.contents (cdr (assq 'contents (cdr (assq 'site alist)))))) -;; (if (and .title .body) -;; .body -;; .site -;; .site.contents)) -;; -;; If you nest `let-alist' invocations, the inner one can't access -;; the variables of the outer one. You can, however, access alists -;; inside the original alist by using dots inside the symbol, as -;; displayed in the example above by the `.site.contents'. -;; -;;; Code: - - -(defun let-alist--deep-dot-search (data) - "Return alist of symbols inside DATA that start with a `.'. -Perform a deep search and return an alist where each car is the -symbol, and each cdr is the same symbol without the `.'." - (cond - ((symbolp data) - (let ((name (symbol-name data))) - (when (string-match "\\`\\." name) - ;; Return the cons cell inside a list, so it can be appended - ;; with other results in the clause below. - (list (cons data (intern (replace-match "" nil nil name))))))) - ((vectorp data) - (apply #'nconc (mapcar #'let-alist--deep-dot-search data))) - ((not (consp data)) nil) - ((eq (car data) 'let-alist) - ;; For nested ‘let-alist’ forms, ignore symbols appearing in the - ;; inner body because they don’t refer to the alist currently - ;; being processed. See Bug#24641. - (let-alist--deep-dot-search (cadr data))) - (t (append (let-alist--deep-dot-search (car data)) - (let-alist--deep-dot-search (cdr data)))))) - -(defun let-alist--access-sexp (symbol variable) - "Return a sexp used to access SYMBOL inside VARIABLE." - (let* ((clean (let-alist--remove-dot symbol)) - (name (symbol-name clean))) - (if (string-match "\\`\\." name) - clean - (let-alist--list-to-sexp - (mapcar #'intern (nreverse (split-string name "\\."))) - variable)))) - -(defun let-alist--list-to-sexp (list var) - "Turn symbols LIST into recursive calls to `cdr' `assq' on VAR." - `(cdr (assq ',(car list) - ,(if (cdr list) (let-alist--list-to-sexp (cdr list) var) - var)))) - -(defun let-alist--remove-dot (symbol) - "Return SYMBOL, sans an initial dot." - (let ((name (symbol-name symbol))) - (if (string-match "\\`\\." name) - (intern (replace-match "" nil nil name)) - symbol))) - - -;;; The actual macro. -;;;###autoload -(defmacro let-alist (alist &rest body) - "Let-bind dotted symbols to their cdrs in ALIST and execute BODY. -Dotted symbol is any symbol starting with a `.'. Only those present -in BODY are let-bound and this search is done at compile time. - -For instance, the following code - - (let-alist alist - (if (and .title .body) - .body - .site - .site.contents)) - -essentially expands to - - (let ((.title (cdr (assq \\='title alist))) - (.body (cdr (assq \\='body alist))) - (.site (cdr (assq \\='site alist))) - (.site.contents (cdr (assq \\='contents (cdr (assq \\='site alist)))))) - (if (and .title .body) - .body - .site - .site.contents)) - -If you nest `let-alist' invocations, the inner one can't access -the variables of the outer one. You can, however, access alists -inside the original alist by using dots inside the symbol, as -displayed in the example above." - (declare (indent 1) (debug t)) - (let ((var (make-symbol "alist"))) - `(let ((,var ,alist)) - (let ,(mapcar (lambda (x) `(,(car x) ,(let-alist--access-sexp (car x) var))) - (delete-dups (let-alist--deep-dot-search body))) - ,@body)))) - -;;;; ChangeLog: - -;; 2015-12-01 Artur Malabarba -;; -;; packages/let-alist: Define it as a :core package -;; -;; 2015-06-11 Artur Malabarba -;; -;; * let-alist (let-alist--deep-dot-search): Fix cons -;; -;; 2015-03-07 Artur Malabarba -;; -;; let-alist: Update copyright -;; -;; 2014-12-22 Artur Malabarba -;; -;; packages/let-alist: Use `make-symbol' instead of `gensym'. -;; -;; 2014-12-20 Artur Malabarba -;; -;; packages/let-alist: Enable access to deeper alists -;; -;; 2014-12-14 Artur Malabarba -;; -;; let-alist.el: Add lexical binding. Version bump. -;; -;; 2014-12-11 Artur Malabarba -;; -;; let-alist: New package -;; - - -(provide 'let-alist) - -;;; let-alist.el ends here diff --git a/elpa/let-alist-1.0.6/let-alist.elc b/elpa/let-alist-1.0.6/let-alist.elc deleted file mode 100644 index 4a0eb0910f356bb15ddc68de307be2e026776b94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 zcmb_eTTkOg6b2Sh>$j@6hgRw#Y@4LQQ5+LOinbzLDj`vAwTr5*2oe)}va#yScs&!? z^w;-0V>={t*_SPni9MHd`_B2!IXb^Q{dR3_%{w|eqEkK1l2pd-BT;ld6_KGknVUo_ z>KwE}w{xG^35hf%o!MlX{39&3P0MqeSChoh7*c3vq@j4O#59R0){(J!qTZT4?B>Rj zh+`SkLQBwZb^8C25o^d$+ES#I6*xSzWB(8<${)Nwy||!gB61N~n7HTE3l)>m6bVHm zNvReqN=jD@Ns*_C%*jr0uoD(~5rR+pV*@_*&-1+9}Bo_#!BJO_Mbd;9s$ z$te!>u+qaVNcb5Nf;Jx94?1|lO~_y=J-+e_UiJgl0tv;^F%Ip&;Jd%_-Ee(y%#t88 zfTkeaz$bp54R#7KHM%Y$7lV__b0k0GR&G|SPeNG80)UXed)*E8;WRMYaF{vd5cPIg zAQyfCptXsZwmG0-Z&+i95OG9y;id2Aa;onnXG@uIAB*?WJ+2tv>cYY@ zt|c5MOB3XtLyWO%)ov(gmtpMp4$3h0>56NwD!I#x*H;Xv2At6hWOyf0E-8u;OSe&+ z*XdRm^R7-{NyM)VsJn*GCnLFH=u#*VK9~HP$7h=Z&dV=3U&F1zmJ3totF>q6XJx#g zome-$n`sNednmPK={Iy(IvGGv;bpg7B};+)9%@?|6g^x`Y$8%{wq41MCmmTrsw(IY zRB`yVa|5nCBmydO>p53j=Np$OoC2RzTuYvI!_w2k!vnfRU`7cj5KdVXMTIR81brnr zA&^Y2G;pvnS<3f78!BM1or>h1W>TWCwf$ z13)BKL8X@(jZ#5_6SLtmbNHfOD0Mxc2`Q|S{~As&epe2&X@%*lXW6dDXWiNd-Vl4E zhKl>?U(FikFX%%Hn`LI1njcL;=s{sc&%J{~&~wvkJQ(KME8B#}g=H5nOrgBsW}#h7 zHW+z0Kpe%Qla6O9;=$a{FrqCoj?fk|A4G^M_NyZl5Fe7U9L?VPJUjX(lMz`Em%hWe I3CEh=zdJ>wmjD0& diff --git a/elpa/leuven-theme-20200416.728/leuven-dark-theme.el b/elpa/leuven-theme-20200416.728/leuven-dark-theme.el deleted file mode 100644 index 3bf8883b..00000000 --- a/elpa/leuven-theme-20200416.728/leuven-dark-theme.el +++ /dev/null @@ -1,1067 +0,0 @@ -;;; leuven-dark-theme.el --- Awesome Emacs color theme on dark background - -;; Copyright (C) 2003-2020 Free Software Foundation, Inc. - -;; Author: Fabrice Niessen <(concat "fniessen" at-sign "pirilampo.org")> -;; URL: https://github.com/fniessen/emacs-leuven-dark-theme -;; Version: 20200102.2050 -;; Keywords: color theme - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This elegant Org-enhancing color theme "leuven-dark" ROCKS! -;; ... and not just for Org mode. -;; -;; To use it, put the following in your Emacs configuration file: -;; -;; (load-theme 'leuven-dark t) -;; -;; Requirements: Emacs 24+. -;; -;; NOTE -- Would you like implement a version of this for dark backgrounds, -;; please do so! I'm willing to integrate it... - -;;; Code: - -;;; Options. - -(defgroup leuven-dark nil - "Leuven theme options. -The theme has to be reloaded after changing anything in this group." - :group 'faces) - -(defcustom leuven-dark-scale-outline-headlines t - "Scale `outline' (and `org') level-1 headlines. -This can be nil for unscaled, t for using the theme default, or a scaling number." - :type '(choice - (const :tag "Unscaled" nil) - (const :tag "Default provided by theme" t) - (number :tag "Set scaling")) - :group 'leuven-dark) - -(defcustom leuven-dark-scale-org-agenda-structure t - "Scale Org agenda structure lines, like dates. -This can be nil for unscaled, t for using the theme default, or a scaling number." - :type '(choice - (const :tag "Unscaled" nil) - (const :tag "Default provided by theme" t) - (number :tag "Set scaling")) - :group 'leuven-dark) - -(defun leuven-dark-scale-font (control default-height) - "Function for splicing optional font heights into face descriptions. -CONTROL can be a number, nil, or t. When t, use DEFAULT-HEIGHT." - (cond - ((numberp control) (list :height control)) - ((eq t control) (list :height default-height)) - (t nil))) - -;;; Theme Faces. - -(deftheme leuven-dark - "Face colors with a light background. -Basic, Font Lock, Isearch, Gnus, Message, Org mode, Diff, Ediff, -Flyspell, Semantic, and Ansi-Color faces are included -- and much -more...") - -(let ((class '((class color) (min-colors 89))) - - ;; Leuven generic colors. - (cancel '(:slant italic :strike-through t :foreground "#5b5660")) - (clock-line '(:box (:line-width 1 :color "#cfa161") :foreground "#ffffff" :background "#1636ff")) - (code-block '(:foreground "#ffff7f" :background "#252046" :extend t)) - (code-inline '(:foreground "#ff9bff" :background "#262031" :extend t)) - (column '(:height 1.0 :weight normal :slant normal :underline nil :strike-through nil :foreground "#1e52b8" :background "#252c48")) - (completion-inline '(:weight normal :foreground "#443f49" :inherit hl-line)) ; Like Google. - (completion-other-candidates '(:weight bold :foreground "#ffffff" :background "#372a2a")) - (completion-selected-candidate '(:weight bold :foreground "#25202a" :background "#ffad65")) - (diff-added '(:background "#442049")) - (diff-changed '(:foreground "#ffff0b" :background "#443f2a")) - (diff-header '(:weight bold :foreground "#83ffff" :background "#252073")) - (diff-hunk-header '(:foreground "#6bff6f" :background "#252f2a")) - (diff-none '(:foreground "#7b777f")) - (diff-refine-added '(:background "#6d0d73")) - (diff-refine-removed '(:background "#06494f")) - (diff-removed '(:background "#25353e")) - (directory '(:weight bold :foreground "#ffff0b" :background "#252053")) - (file '(:foreground "#ffffff")) - (function-param '(:foreground "#de8d83")) - (grep-file-name '(:weight bold :foreground "#d8b76b")) ; Used for grep hits. - (grep-line-number '(:weight bold :foreground "#5fca5b")) - (highlight-blue '(:background "#3c312a" :extend t)) - (highlight-blue2 '(:background "#3e2d2f" :extend t)) - (highlight-gray '(:background "#3e3944" :extend t)) - (highlight-green '(:background "#2f0e3a" :extend t)) - (highlight-red '(:background "#063741" :extend t)) - (highlight-yellow '(:background "#2d2058" :extend t)) - (link '(:weight normal :underline t :foreground "#ff925a")) - (link-no-underline '(:weight normal :foreground "#ff925a")) - (mail-header-name '(:family "Sans Serif" :weight normal :foreground "#615c67")) - (mail-header-other '(:family "Sans Serif" :slant normal :foreground "#9d99a1")) - (mail-read '(:foreground "#77737b")) - (mail-read-high '(:foreground "#837f87")) - (mail-ticked '(:foreground "#06ccff")) - (mail-to '(:family "Sans Serif" :underline nil :foreground "#ff925a")) - (mail-unread '(:weight bold :foreground "#ffffff")) - (mail-unread-high '(:weight bold :foreground "#eea682")) - (marked-line '(:foreground "#5affff" :background "#06555f")) - (match '(:weight bold :background "#0601ff")) ; occur patterns + match in helm for files + match in Org files. - (ol1 `(,@(leuven-dark-scale-font leuven-dark-scale-outline-headlines 1.3) :weight bold :overline "#5d5862" :foreground "#c7c3cb" :background "#322d37" :extend t)) - (ol2 '(:height 1.0 :weight bold :overline "#efcab2" :foreground "#efcab2" :background "#3d2a2d" :extend t)) - (ol3 '(:height 1.0 :weight bold :foreground "#ffaae3" :background "#332038" :extend t)) - (ol4 '(:height 1.0 :weight bold :slant normal :foreground "#1a9cff" :extend t)) - (ol5 '(:height 1.0 :weight bold :slant normal :foreground "#21da7a" :extend t)) - (ol6 '(:height 1.0 :weight bold :slant italic :foreground "#ff883d" :extend t)) - (ol7 '(:height 1.0 :weight bold :slant italic :foreground "#d451d9" :extend t)) - (ol8 '(:height 1.0 :weight bold :slant italic :foreground "#077ffa" :extend t)) - (paren-matched '(:background "#441746")) ; Or take that green for region? - (paren-unmatched '(:weight bold :underline "#06ffff" :foreground "#ffffff" :background "#065a64")) - (region '(:background "#752c0b" :extend t)) - (shadow '(:foreground "#848088")) - (string '(:foreground "#ff7fff")) ; or #34c8d8 - (subject '(:family "Sans Serif" :weight bold :foreground "#ffffff")) - (symlink '(:foreground "#e37233")) - (tab '(:foreground "#3a353f" :background "#25202a")) - (trailing '(:foreground "#3a353f" :background "#252076")) - (volatile-highlight '(:underline nil :foreground "#25202a" :background "#66c96f")) - (volatile-highlight-supersize '(:height 1.1 :underline nil :foreground "#25202a" :background "#66c96f")) ; flash-region - (vc-branch '(:box (:line-width 1 :color "#ff33d2") :foreground "#ffffff" :background "#5a015f")) - (xml-attribute '(:foreground "#119cd0")) - (xml-tag '(:foreground "#56e46f")) - (highlight-current-tag '(:background "#3a352a")) ; #342b32 or #0614df - ) - - (custom-theme-set-faces - 'leuven-dark - `(default ((,class (:foreground "#cfccd2" :background "#25202a")))) - `(bold ((,class (:weight bold :foreground "#ffffff")))) - `(bold-italic ((,class (:weight bold :slant italic :foreground "#ffffff")))) - `(italic ((,class (:slant italic :foreground "#e8e5eb")))) - `(underline ((,class (:underline t)))) - `(cursor ((,class (:background "#e1420b")))) - - ;; Lucid toolkit emacs menus. - `(menu ((,class (:foreground "#25202a" :background "#cfccd2")))) - - ;; Highlighting faces. - `(fringe ((,class (:foreground "#b76130" :background "#25202a")))) - `(highlight ((,class ,highlight-blue))) - `(region ((,class ,region))) - `(secondary-selection ((,class ,match))) ; Used by Org-mode for highlighting matched entries and keywords. - `(isearch ((,class (:underline "#ffffff" :foreground "#25202a" :background "#aa8b5e")))) - `(isearch-fail ((,class (:weight bold :foreground "#ffffff" :background "#06333d")))) - `(lazy-highlight ((,class (:foreground "#ffffff" :background "#0601ff")))) ; Isearch others (see `match'). - `(trailing-whitespace ((,class ,trailing))) - `(query-replace ((,class (:inherit isearch)))) - `(whitespace-hspace ((,class (:foreground "#322d37")))) ; see also `nobreak-space' - `(whitespace-indentation ((,class ,tab))) - `(whitespace-line ((,class (:foreground "#38ffff" :background "#06017f")))) - `(whitespace-tab ((,class ,tab))) - `(whitespace-trailing ((,class ,trailing))) - - ;; Mode line faces. - `(mode-line ((,class (:box (:line-width 1 :color "#e8d0b3") :foreground "#7e311e" :background "#cfa161")))) - `(mode-line-inactive ((,class (:box (:line-width 1 :color "#b5b1bb") :foreground "#322d38" :background "#696371")))) - `(mode-line-buffer-id ((,class (:weight bold :foreground "#25202a")))) - `(mode-line-emphasis ((,class (:weight bold :foreground "#25202a")))) - `(mode-line-highlight ((,class (:foreground "#0601ff")))) - - ;; Escape and prompt faces. - `(minibuffer-prompt ((,class (:weight bold :foreground "#ffffff" :background "#0628ff")))) - `(minibuffer-noticeable-prompt ((,class (:weight bold :foreground "#ffffff" :background "#0628ff")))) - `(escape-glyph ((,class (:foreground "#ff7138")))) - `(error ((,class (:foreground "#06ffff")))) - `(warning ((,class (:weight bold :foreground "#065aff")))) - `(success ((,class (:foreground "#ff01ff")))) - - ;; Font lock faces. - `(font-lock-builtin-face ((,class (:foreground "#ff9029")))) - `(font-lock-comment-delimiter-face ((,class (:foreground "#767283")))) ; #9a969e - `(font-lock-comment-face ((,class (:slant italic :foreground "#767283")))) ; #9a969e - `(font-lock-constant-face ((,class (:foreground "#34c8d8")))) - `(font-lock-doc-face ((,class (:foreground "#fd95fa")))) - ;; `(font-lock-doc-string-face ((,class (:foreground "#ff7fff")))) ; XEmacs only, but is used for HTML exports from org2html (and not interactively) - `(font-lock-function-name-face ((,class (:weight normal :foreground "#ff996f")))) - `(font-lock-keyword-face ((,class (:bold nil :foreground "#ffff0b")))) ; #ccab2d - `(font-lock-preprocessor-face ((,class (:foreground "#837f87")))) - `(font-lock-regexp-grouping-backslash ((,class (:weight bold :inherit nil)))) - `(font-lock-regexp-grouping-construct ((,class (:weight bold :inherit nil)))) - `(font-lock-string-face ((,class ,string))) - `(font-lock-type-face ((,class (:weight normal :foreground "#9fcb66")))) - `(font-lock-variable-name-face ((,class (:weight normal :foreground "#4ac964")))) ; #83ff87 - `(font-lock-warning-face ((,class (:weight bold :foreground "#06ffff")))) - - ;; Button and link faces. - `(link ((,class ,link))) - `(link-visited ((,class (:underline t :foreground "#1f879a")))) - `(button ((,class (:underline t :foreground "#ff925a")))) - `(header-line ((,class (:box (:line-width 1 :color "#ffffff") :foreground "#ffffff" :background "#322d37")))) - - ;; Gnus faces. - `(gnus-button ((,class (:weight normal)))) - `(gnus-cite-attribution-face ((,class (:foreground "#b3af59")))) - `(gnus-cite-1 ((,class (:foreground "#b3af59" :background "#2d2832")))) - `(gnus-cite-2 ((,class (:foreground "#9dffa1" :background "#2d2832")))) - `(gnus-cite-3 ((,class (:foreground "#ff8890" :background "#2d2832")))) - `(gnus-cite-4 ((,class (:foreground "#6bffff" :background "#2d2832")))) - `(gnus-cite-5 ((,class (:foreground "#ffff6f" :background "#2d2832")))) - `(gnus-cite-6 ((,class (:foreground "#4999ff" :background "#2d2832")))) - `(gnus-cite-7 ((,class (:foreground "#b3af59" :background "#2d2832")))) - `(gnus-cite-8 ((,class (:foreground "#9dffa1" :background "#2d2832")))) - `(gnus-cite-9 ((,class (:foreground "#ff8890" :background "#2d2832")))) - `(gnus-cite-10 ((,class (:foreground "#6bffff" :background "#2d2832")))) - `(gnus-emphasis-bold ((,class (:weight bold)))) - `(gnus-emphasis-highlight-words ((,class (:foreground "#0601ff" :background "#ffffff")))) - `(gnus-group-mail-1 ((,class (:weight bold :foreground "#06af59")))) - `(gnus-group-mail-1-empty ((,class (:foreground "#b3af59")))) - `(gnus-group-mail-2 ((,class (:weight bold :foreground "#06ffa1")))) - `(gnus-group-mail-2-empty ((,class (:foreground "#9dffa1")))) - `(gnus-group-mail-3 ((,class ,mail-unread))) - `(gnus-group-mail-3-empty ((,class ,mail-read))) - `(gnus-group-mail-low ((,class ,cancel))) - `(gnus-group-mail-low-empty ((,class ,cancel))) - `(gnus-group-news-1 ((,class (:weight bold :foreground "#06af59")))) - `(gnus-group-news-1-empty ((,class (:foreground "#b3af59")))) - `(gnus-group-news-2 ((,class (:weight bold :foreground "#06ffa1")))) - `(gnus-group-news-2-empty ((,class (:foreground "#9dffa1")))) - `(gnus-group-news-3 ((,class ,mail-unread))) - `(gnus-group-news-3-empty ((,class ,mail-read))) - `(gnus-group-news-4 ((,class (:weight bold :foreground "#06ffff")))) - `(gnus-group-news-4-empty ((,class (:foreground "#6bffff")))) - `(gnus-group-news-5 ((,class (:weight bold :foreground "#06ff6f")))) - `(gnus-group-news-5-empty ((,class (:foreground "#ffff6f")))) - `(gnus-group-news-6 ((,class (:weight bold :foreground "#848088")))) - `(gnus-group-news-6-empty ((,class (:foreground "#837f87")))) - `(gnus-header-content ((,class ,mail-header-other))) - `(gnus-header-from ((,class (:family "Sans Serif" :foreground "#ffffff")))) - `(gnus-header-name ((,class ,mail-header-name))) - `(gnus-header-newsgroups ((,class (:family "Sans Serif" :foreground "#cf663d")))) - `(gnus-header-subject ((,class ,subject))) - `(gnus-picon ((,class (:foreground "#0601ff" :background "#25202a")))) - `(gnus-picon-xbm ((,class (:foreground "#0601ff" :background "#25202a")))) - `(gnus-server-closed ((,class (:slant italic :foreground "#ffff0b" :background "#25202a")))) - `(gnus-server-denied ((,class (:weight bold :foreground "#06ffff" :background "#25202a")))) - `(gnus-server-opened ((,class (:family "Sans Serif" :foreground "#25202a" :foreground "#bd9432")))) - `(gnus-signature ((,class (:slant italic :foreground "#787279")))) - `(gnus-splash ((,class (:foreground "#0673ff")))) - `(gnus-summary-cancelled ((,class ,cancel))) - `(gnus-summary-high-ancient ((,class ,mail-unread-high))) - `(gnus-summary-high-read ((,class ,mail-read-high))) - `(gnus-summary-high-ticked ((,class ,mail-ticked))) - `(gnus-summary-high-unread ((,class ,mail-unread-high))) - `(gnus-summary-low-ancient ((,class (:slant italic :foreground "#ffffff")))) - `(gnus-summary-low-read ((,class (:slant italic :foreground "#6b666f" :background "#413c46")))) - `(gnus-summary-low-ticked ((,class ,mail-ticked))) - `(gnus-summary-low-unread ((,class (:slant italic :foreground "#ffffff")))) - `(gnus-summary-normal-ancient ((,class ,mail-read))) - `(gnus-summary-normal-read ((,class ,mail-read))) - `(gnus-summary-normal-ticked ((,class ,mail-ticked))) - `(gnus-summary-normal-unread ((,class ,mail-unread))) - `(gnus-summary-selected ((,class (:foreground "#25202a" :background "#ff7332")))) - `(gnus-x-face ((,class (:foreground "#ffffff" :background "#25202a")))) - - ;; Message faces. - `(message-header-name ((,class ,mail-header-name))) - `(message-header-cc ((,class ,mail-to))) - `(message-header-other ((,class ,mail-header-other))) - `(message-header-subject ((,class ,subject))) - `(message-header-to ((,class ,mail-to))) - `(message-cited-text ((,class (:foreground "#b3af59" :background "#2d2832")))) - `(message-separator ((,class (:family "Sans Serif" :weight normal :foreground "#473d43")))) - `(message-header-newsgroups ((,class (:family "Sans Serif" :foreground "#cf663d")))) - `(message-header-xheader ((,class ,mail-header-other))) - `(message-mml ((,class (:foreground "#e074e3")))) - - ;; Diff. - `(diff-added ((,class ,diff-added))) - `(diff-changed ((,class ,diff-changed))) - `(diff-context ((,class ,diff-none))) - `(diff-file-header ((,class ,diff-header))) - `(diff-file1-hunk-header ((,class (:foreground "#78ff7c" :background "#382c33")))) - `(diff-file2-hunk-header ((,class (:foreground "#d781db" :background "#382c33")))) - `(diff-function ((,class (:foreground "#38663d")))) - `(diff-header ((,class ,diff-header))) - `(diff-hunk-header ((,class ,diff-hunk-header))) - `(diff-index ((,class ,diff-header))) - `(diff-indicator-added ((,class (:foreground "#c966cc" :background "#53204e")))) - `(diff-indicator-changed ((,class (:background "#46302a")))) - `(diff-indicator-removed ((,class (:foreground "#38ccd2" :background "#254046")))) - `(diff-refine-added ((,class ,diff-refine-added))) - `(diff-refine-change ((,class (:background "#443f2a")))) - `(diff-refine-removed ((,class ,diff-refine-removed))) - `(diff-removed ((,class ,diff-removed))) - - ;; SMerge. - `(smerge-mine ((,class ,diff-changed))) - `(smerge-other ((,class ,diff-added))) - `(smerge-base ((,class ,diff-removed))) - `(smerge-markers ((,class (:background "#253859")))) - `(smerge-refined-change ((,class (:background "#5a550b")))) - - ;; Ediff. - `(ediff-current-diff-A ((,class (:background "#253f49" :extend t)))) - `(ediff-current-diff-B ((,class (:background "#442049" :extend t)))) - `(ediff-current-diff-C ((,class (:background "#ff010b" :extend t)))) - `(ediff-even-diff-A ((,class (:background "#312c36" :extend t)))) - `(ediff-even-diff-B ((,class (:background "#312c36" :extend t)))) - `(ediff-fine-diff-A ((,class (:background "#06555f" :extend t)))) - `(ediff-fine-diff-B ((,class (:background "#ae01b2" :extend t)))) - `(ediff-odd-diff-A ((,class (:background "#312c36" :extend t)))) - `(ediff-odd-diff-B ((,class (:background "#312c36" :extend t)))) - - ;; Flyspell. - (if (version< emacs-version "24.4") - `(flyspell-duplicate ((,class (:underline "#101487" :inherit nil)))) - `(flyspell-duplicate ((,class (:underline (:style wave :color "#101487") :background "#292759" :inherit nil))))) - (if (version< emacs-version "24.4") - `(flyspell-incorrect ((,class (:underline "#0a5864" :inherit nil)))) - `(flyspell-incorrect ((,class (:underline (:style wave :color "#0a5864") :background "#2f454c":inherit nil))))) - - ;; ;; Semantic faces. - ;; `(semantic-decoration-on-includes ((,class (:underline ,cham-4)))) - ;; `(semantic-decoration-on-private-members-face ((,class (:background ,alum-2)))) - ;; `(semantic-decoration-on-protected-members-face ((,class (:background ,alum-2)))) - `(semantic-decoration-on-unknown-includes ((,class (:background "#252630")))) - ;; `(semantic-decoration-on-unparsed-includes ((,class (:underline ,orange-3)))) - `(semantic-highlight-func-current-tag-face ((,class ,highlight-current-tag))) - `(semantic-tag-boundary-face ((,class (:overline "#8c8890")))) ; Method separator. - ;; `(semantic-unmatched-syntax-face ((,class (:underline ,red-1)))) - - `(Info-title-1-face ((,class ,ol1))) - `(Info-title-2-face ((,class ,ol2))) - `(Info-title-3-face ((,class ,ol3))) - `(Info-title-4-face ((,class ,ol4))) - `(ace-jump-face-foreground ((,class (:weight bold :foreground "#ffffff" :background "#065aff")))) - `(ahs-face ((,class (:background "#3e392a")))) - `(ahs-definition-face ((,class (:background "#064943")))) - `(ahs-plugin-defalt-face ((,class (:background "#25392a")))) ; Current. - `(anzu-match-1 ((,class (:foreground "#ffffff" :background "#840135")))) - `(anzu-match-2 ((,class (:foreground "#ffffff" :background "springgreen")))) - `(anzu-match-3 ((,class (:foreground "#ffffff" :background "#06ffff")))) - `(anzu-mode-line ((,class (:foreground "#ffffff" :background "#830187")))) - `(anzu-mode-line-no-match ((,class (:foreground "#ffffff" :background "#067f87")))) - `(anzu-replace-highlight ((,class (:inherit query-replace)))) - `(anzu-replace-to ((,class (:weight bold :foreground "#47cc0c" :background "#0742d2")))) - `(auto-dim-other-buffers-face ((,class (:background "#2c2731")))) - `(avy-background-face ((,class (:background "#5b5660")))) - `(avy-lead-face ((,class (:weight bold :foreground "#ffffff" :background "#065aff")))) - `(bbdb-company ((,class (:slant italic :foreground "#bd7d55")))) - `(bbdb-field-name ((,class (:weight bold :foreground "#bd7d55")))) - `(bbdb-field-value ((,class (:foreground "#bd7d55")))) - `(bbdb-name ((,class (:underline t :foreground "#0699d2")))) - `(bmkp-light-autonamed ((,class (:background "#322d37")))) - `(bmkp-light-fringe-autonamed ((,class (:foreground "#a9a5ad" :background "#302b35")))) - `(bmkp-light-fringe-non-autonamed ((,class (:foreground "#252059" :background "#fe010e")))) ; default - `(bmkp-light-non-autonamed ((,class (:background "#60202a")))) - `(bmkp-no-local ((,class (:background "#063f3e")))) - `(browse-kill-ring-separator-face ((,class (:foreground "#06ffff")))) - `(calendar-month-header ((,class (:weight bold :foreground "#b4b5ca" :background "#252059")))) - `(calendar-today ((,class (:weight bold :foreground "#b4b5ca" :background "#252059")))) - `(calendar-weekday-header ((,class (:weight bold :foreground "#ec9d5a")))) - `(calendar-weekend-header ((,class (:weight bold :foreground "#b5b1b9")))) - `(cfw:face-annotation ((,class (:foreground "#ff01ff" :background "#06ffff")))) - `(cfw:face-day-title ((,class (:foreground "#3b3640")))) - `(cfw:face-default-content ((,class (:foreground "#d9ad66")))) - `(cfw:face-default-day ((,class (:weight bold)))) - `(cfw:face-disable ((,class (:foreground "#5b5660")))) - `(cfw:face-grid ((,class (:foreground "#27222c")))) - `(cfw:face-header ((,class (:foreground "#ec9d5a" :background "#25202a" :weight bold)))) - `(cfw:face-holiday ((,class (:foreground "#8c8890" :background "#3e322a")))) - `(cfw:face-periods ((,class (:foreground "#25202a" :background "#9d7330" :slant italic)))) - `(cfw:face-saturday ((,class (:foreground "#b5b1b9" :background "#25202a" :weight bold)))) - `(cfw:face-select ((,class (:foreground "#b96a1e" :background "#352d2e")))) - `(cfw:face-sunday ((,class (:foreground "#b5b1b9" :background "#25202a" :weight bold)))) - `(cfw:face-title ((,class (:height 2.0 :foreground "#9c98a0" :weight bold :inherit variable-pitch)))) - `(cfw:face-today ((,class (:foreground "#b4b5ca" :background "#252059")))) - `(cfw:face-today-title ((,class (:foreground "#25202a" :background "#eb9958")))) - `(cfw:face-toolbar ((,class (:background "#25202a")))) - `(cfw:face-toolbar-button-off ((,class (:foreground "#35303a" :background "#25202a")))) - `(cfw:face-toolbar-button-on ((,class (:foreground "#a5a1a9" :background "#2d2832")))) - `(change-log-date ((,class (:foreground "#64df19")))) - `(change-log-file ((,class (:weight bold :foreground "#c27c45")))) - `(change-log-list ((,class (:foreground "#ffffff" :background "#8e1142")))) - `(change-log-name ((,class (:foreground "#ff7fff")))) - `(circe-highlight-all-nicks-face ((,class (:foreground "#ffff0b" :background "#322d37")))) ; other nick names - `(circe-highlight-nick-face ((,class (:foreground "#ff6cff" :background "#322d37")))) ; messages with my nick cited - `(circe-my-message-face ((,class (:foreground "#78747c" :background "#322d37")))) - `(circe-originator-face ((,class (:foreground "#ffff0b")))) - `(circe-prompt-face ((,class (:foreground "#06ffff")))) - `(circe-server-face ((,class (:foreground "#6b3524")))) - `(comint-highlight-input ((,class (:weight bold :foreground "#ffff0b" :inherit nil)))) - ;; `(comint-highlight-prompt ((,class (:weight bold :foreground "#ffffff" :background "#0628ff")))) - `(comint-highlight-prompt ((,class (:weight bold :foreground "#ffff0b" :inherit nil)))) - - ;; `(ac-selection-face ((,class ,completion-selected-candidate))) - `(ac-selection-face ((,class (:weight bold :foreground "#25202a" :background "#065aff")))) ; TEMP For diff'ing AC from Comp. - `(ac-candidate-face ((,class ,completion-other-candidates))) - `(ac-completion-face ((,class ,completion-inline))) - `(ac-candidate-mouse-face ((,class (:inherit highlight)))) - `(popup-scroll-bar-background-face ((,class (:background "#372a2a")))) - `(popup-scroll-bar-foreground-face ((,class (:background "#332525")))) ; Scrollbar (visible). - - `(company-tooltip-common-selection ((,class (:weight normal :foreground "#2a3159" :inherit company-tooltip-selection)))) ; Prefix + common part in tooltip (for selection). - `(company-tooltip-selection ((,class ,completion-selected-candidate))) ; Suffix in tooltip (for selection). - `(company-tooltip-annotation-selection ((,class (:weight normal :foreground "#2a3159")))) ; Annotation (for selection). - - `(company-tooltip-common ((,class (:weight normal :foreground "#54ff59" :inherit company-tooltip)))) ; Prefix + common part in tooltip. - `(company-tooltip ((,class ,completion-other-candidates))) ; Suffix in tooltip. - `(company-tooltip-annotation ((,class (:weight normal :foreground "#deea0b")))) ; Annotation. - - `(company-preview-common ((,class ,completion-inline))) - - `(company-scrollbar-bg ((,class (:background "#372a2a")))) - `(company-scrollbar-fg ((,class (:background "#332525")))) ; Scrollbar (visible). - - `(compare-windows ((,class (:background "#0601ff")))) - ;; `(completions-common-part ((,class (:foreground "#06ffff" :weight bold)))) - ;; `(completions-first-difference ((,class (:foreground "#ff01ff" :weight bold)))) - `(compilation-error ((,class (:weight bold :foreground "#06ffff")))) ; Used for grep error messages. - `(compilation-info ((,class ,grep-file-name))) - `(compilation-line-number ((,class ,grep-line-number))) - `(compilation-warning ((,class (:weight bold :foreground "#065aff")))) - `(compilation-mode-line-exit ((,class (:weight bold :foreground "#ff01ff")))) ; :exit[matched] - `(compilation-mode-line-fail ((,class (:weight bold :foreground "#167d1b")))) ; :exit[no match] - `(compilation-mode-line-run ((,class (:weight bold :foreground "#065aff")))) ; :run - `(css-property ((,class (:foreground "#ff55ff")))) - `(css-selector ((,class (:weight bold :foreground "#ffff0b")))) - `(custom-button ((,class (:box (:line-width 2 :style released-button) :foreground "#ffffff" :background "lightgrey")))) - `(custom-button-mouse ((,class (:box (:line-width 2 :style released-button) :foreground "#ffffff" :background "#3d3842")))) - `(custom-button-pressed ((,class (:box (:line-width 2 :style pressed-button) :foreground "#ffffff" :background "#312c36")))) - `(custom-button-pressed-unraised ((,class (:underline t :foreground "#78ff7c")))) - `(custom-button-unraised ((,class (:underline t)))) - `(custom-changed ((,class (:foreground "#25202a" :background "#ffff0b")))) - `(custom-comment ((,class (:background "#2b2630")))) - `(custom-comment-tag ((,class (:foreground "#ffff7c")))) - `(custom-documentation ((,class (nil)))) - `(custom-face-tag ((,class (:family "Sans Serif" :height 1.2 :weight bold)))) - `(custom-group-tag ((,class (:height 1.2 :weight bold :foreground "#ffff0b")))) - `(custom-group-tag-1 ((,class (:family "Sans Serif" :height 1.2 :weight bold :foreground "#06ffff")))) - `(custom-invalid ((,class (:foreground "#0601ff" :background "#06ffff")))) - `(custom-link ((,class (:underline t :foreground "#ffff0b")))) - `(custom-modified ((,class (:foreground "#25202a" :background "#ffff0b")))) - `(custom-rogue ((,class (:foreground "#063f3e" :background "#ffffff")))) - `(custom-saved ((,class (:underline t)))) - `(custom-set ((,class (:foreground "#ffff0b" :background "#25202a")))) - `(custom-state ((,class (:foreground "#ff74ff")))) - `(custom-themed ((,class (:foreground "#25202a" :background "#ffff0b")))) - `(custom-variable-button ((,class (:weight bold :underline t)))) - `(custom-variable-tag ((,class (:family "Sans Serif" :height 1.2 :weight bold :foreground "#ffff0b")))) - `(custom-visibility ((,class ,link))) - `(diff-hl-change ((,class (:foreground "#ffff3c" :background "#46302a")))) - `(diff-hl-delete ((,class (:foreground "#37ffff" :background "#254046")))) - `(diff-hl-dired-change ((,class (:weight bold :foreground "#ffffff" :background "#065cd0")))) - `(diff-hl-dired-delete ((,class (:weight bold :foreground "#2dc6ef")))) - `(diff-hl-dired-ignored ((,class (:weight bold :foreground "#25202a" :background "#44445e")))) - `(diff-hl-dired-insert ((,class (:weight bold :foreground "#4b464f")))) - `(diff-hl-dired-unknown ((,class (:foreground "#25202a" :background "#c4c455")))) - `(diff-hl-insert ((,class (:foreground "#ff74ff" :background "#53204e")))) - `(diff-hl-unknown ((,class (:foreground "#25202a" :background "#c4c455")))) - `(diary-face ((,class (:foreground "#7c360d")))) - `(dircolors-face-asm ((,class (:foreground "#ffffff")))) - `(dircolors-face-backup ((,class (:foreground "#ffffff")))) - `(dircolors-face-compress ((,class (:foreground "#06ffff")))) - `(dircolors-face-dir ((,class ,directory))) - `(dircolors-face-doc ((,class (:foreground "#ffffff")))) - `(dircolors-face-dos ((,class (:foreground "#e074e3")))) - `(dircolors-face-emacs ((,class (:foreground "#ffffff")))) - `(dircolors-face-exec ((,class (:foreground "#e074e3")))) - `(dircolors-face-html ((,class (:foreground "#ffffff")))) - `(dircolors-face-img ((,class (:foreground "#37ff3c")))) - `(dircolors-face-lang ((,class (:foreground "#ffffff")))) - `(dircolors-face-lang-interface ((,class (:foreground "#ffffff")))) - `(dircolors-face-make ((,class (:foreground "#ffffff")))) - `(dircolors-face-objet ((,class (:foreground "#ffffff")))) - `(dircolors-face-package ((,class (:foreground "#ffffff")))) - `(dircolors-face-paddb ((,class (:foreground "#ffffff")))) - `(dircolors-face-ps ((,class (:foreground "#ffffff")))) - `(dircolors-face-sound ((,class (:foreground "#ff400b")))) - `(dircolors-face-tar ((,class (:foreground "#06ffff")))) - `(dircolors-face-text ((,class (:foreground "#ffffff")))) - `(dircolors-face-yacc ((,class (:foreground "#ffffff")))) - `(dired-directory ((,class ,directory))) - `(dired-header ((,class ,directory))) - `(dired-ignored ((,class (:strike-through t :foreground "#06ffff")))) - `(dired-mark ((,class ,marked-line))) - `(dired-marked ((,class ,marked-line))) - `(dired-symlink ((,class ,symlink))) - `(diredp-compressed-file-suffix ((,class (:foreground "#06ffff")))) - `(diredp-date-time ((,class (:foreground "#64df19")))) - `(diredp-dir-heading ((,class ,directory))) - `(diredp-dir-name ((,class ,directory))) - `(diredp-dir-priv ((,class ,directory))) - `(diredp-exec-priv ((,class (:background "#fd3fcb")))) - `(diredp-executable-tag ((,class (:foreground "#e074e3" :background "#25202a")))) - `(diredp-file-name ((,class ,file))) - `(diredp-file-suffix ((,class (:foreground "#443f49")))) - `(diredp-flag-mark-line ((,class ,marked-line))) - `(diredp-ignored-file-name ((,class ,shadow))) - `(diredp-read-priv ((,class (:background "#f7660b")))) - `(diredp-write-priv ((,class (:foreground "#25202a" :background "#06bfc7")))) - `(eldoc-highlight-function-argument ((,class (:weight bold :foreground "#06ffff" :background "#25392a")))) - `(elfeed-search-filter-face ((,class (:foreground "#46414b")))) - ;; `(eww-form-checkbox ((,class ()))) - ;; `(eww-form-select ((,class ()))) - ;; `(eww-form-submit ((,class ()))) - `(eww-form-text ((,class (:weight bold :foreground "#c3a798" :background "#5d3218")))) - ;; `(eww-form-textarea ((,class ()))) - `(file-name-shadow ((,class ,shadow))) - `(flycheck-error ((,class (:underline (:color "#06dae7" :style wave) :weight bold :background "#253c46")))) - `(flycheck-error-list-line-number ((,class (:foreground "#5fca5b")))) - `(flycheck-fringe-error ((,class (:foreground "#06dae7")))) - `(flycheck-fringe-info ((,class (:foreground "#ed75ef")))) - `(flycheck-fringe-warning ((,class (:foreground "#1056cd")))) - `(flycheck-info ((,class (:underline (:color "#ed75ef" :style wave) :weight bold)))) - `(flycheck-warning ((,class (:underline (:color "#1056cd" :style wave) :weight bold :background "#252066")))) - `(font-latex-bold-face ((,class (:weight bold :foreground "#ffffff")))) - `(fancy-narrow-blocked-face ((,class (:foreground "#6b6765")))) - `(flycheck-color-mode-line-error-face ((, class (:background "#35a4b1")))) - `(flycheck-color-mode-line-warning-face ((, class (:background "#1938ff")))) - `(flycheck-color-mode-line-info-face ((, class (:background "#0601ff")))) - `(font-latex-italic-face ((,class (:slant italic :foreground "#e8e5eb")))) - `(font-latex-math-face ((,class (:foreground "#ffff0b")))) - `(font-latex-sectioning-1-face ((,class (:family "Sans Serif" :height 2.7 :weight bold :foreground "#9f6a1c")))) - `(font-latex-sectioning-2-face ((,class ,ol1))) - `(font-latex-sectioning-3-face ((,class ,ol2))) - `(font-latex-sectioning-4-face ((,class ,ol3))) - `(font-latex-sectioning-5-face ((,class ,ol4))) - `(font-latex-sedate-face ((,class (:foreground "#06aaff")))) - `(font-latex-string-face ((,class (:weight bold :foreground "#ff990b")))) - `(font-latex-verbatim-face ((,class (:foreground "#ffff7f" :background "#252046" :inherit nil)))) - `(git-commit-summary-face ((,class (:foreground "#ffffff")))) - `(git-commit-comment-face ((,class (:slant italic :foreground "#9a969e")))) - `(git-timemachine-commit ((,class ,diff-removed))) - `(git-timemachine-minibuffer-author-face ((,class ,diff-added))) - `(git-timemachine-minibuffer-detail-face ((,class ,diff-header))) - `(google-translate-text-face ((,class (:foreground "#8c8890" :background "#2e2933")))) - `(google-translate-phonetic-face ((,class (:inherit shadow)))) - `(google-translate-translation-face ((,class (:weight normal :foreground "#d2861c" :background "#3f3336")))) - `(google-translate-suggestion-label-face ((,class (:foreground "#06ffff")))) - `(google-translate-suggestion-face ((,class (:slant italic :underline t)))) - `(google-translate-listen-button-face ((,class (:height 0.8)))) - `(helm-action ((,class (:foreground "#ffffff")))) - `(helm-bookmark-file ((,class ,file))) - `(helm-bookmarks-su-face ((,class (:foreground "#06ffff")))) - `(helm-buffer-directory ((,class ,directory))) - ;; `(helm-non-file-buffer ((,class (:slant italic :foreground "#ffff0b")))) - ;; `(helm-buffer-file ((,class (:foreground "#cfccd2")))) - `(helm-buffer-modified ((,class (:slant italic :foreground "#4ac964")))) - `(helm-buffer-process ((,class (:foreground "#ff7dff")))) - `(helm-candidate-number ((,class (:foreground "#ffffff" :background "#0601a1")))) - `(helm-dir-heading ((,class (:foreground "#ffff0b" :background "#063f3e")))) - `(helm-dir-priv ((,class (:foreground "#78ffff" :background "#312c36")))) - `(helm-ff-directory ((,class ,directory))) - `(helm-ff-dotted-directory ((,class ,directory))) - `(helm-ff-executable ((,class (:foreground "#ff32ff" :background "#25202a")))) - `(helm-ff-file ((,class (:foreground "#ffffff")))) - `(helm-ff-invalid-symlink ((,class (:foreground "#0601ff" :background "#06ffff")))) - `(helm-ff-symlink ((,class ,symlink))) - `(helm-file-name ((,class (:foreground "#ffff0b")))) - `(helm-gentoo-match-face ((,class (:foreground "#06ffff")))) - `(helm-grep-file ((,class ,grep-file-name))) - `(helm-grep-lineno ((,class ,grep-line-number))) - `(helm-grep-match ((,class ,match))) - `(helm-grep-running ((,class (:weight bold :foreground "#25202a")))) - `(helm-isearch-match ((,class (:background "#38013d")))) - `(helm-lisp-show-completion ((,class ,volatile-highlight-supersize))) ; See `helm-dabbrev'. - ;; `(helm-ls-git-added-copied-face ((,class (:foreground "")))) - ;; `(helm-ls-git-added-modified-face ((,class (:foreground "")))) - ;; `(helm-ls-git-conflict-face ((,class (:foreground "")))) - ;; `(helm-ls-git-deleted-and-staged-face ((,class (:foreground "")))) - ;; `(helm-ls-git-deleted-not-staged-face ((,class (:foreground "")))) - ;; `(helm-ls-git-modified-and-staged-face ((,class (:foreground "")))) - `(helm-ls-git-modified-not-staged-face ((,class (:foreground "#4ac964")))) - ;; `(helm-ls-git-renamed-modified-face ((,class (:foreground "")))) - ;; `(helm-ls-git-untracked-face ((,class (:foreground "")))) - `(helm-match ((,class ,match))) - `(helm-moccur-buffer ((,class (:foreground "#ff993d")))) - `(helm-selection ((,class (:background "#cb8a33" :foreground "#25202a")))) - `(helm-selection-line ((,class ,highlight-gray))) ; ??? - `(helm-separator ((,class (:foreground "#06ffff")))) - `(helm-source-header ((,class (:weight bold :box (:line-width 1 :color "#3d3842") :background "#433e48" :foreground "#ffffff")))) - `(helm-swoop-target-line-block-face ((,class (:background "#3833ff" :foreground "#e0dde3")))) - `(helm-swoop-target-line-face ((,class (:background "#38330b")))) - `(helm-swoop-target-word-face ((,class (:weight bold :foreground nil :background "#0742d2")))) - `(helm-visible-mark ((,class ,marked-line))) - `(helm-w3m-bookmarks-face ((,class (:underline t :foreground "#ff010b")))) - `(highlight-changes ((,class (:foreground nil)))) ;; blue "#d4f754" - `(highlight-changes-delete ((,class (:strike-through nil :foreground nil)))) ;; red "#4ff7d7" - `(highlight-symbol-face ((,class (:background "#252080")))) - `(hl-line ((,class ,highlight-yellow))) ; Highlight current line. - `(hl-tags-face ((,class ,highlight-current-tag))) ; ~ Pair highlighting (matching tags). - `(holiday-face ((,class (:foreground "#8c8890" :background "#3e322a")))) - `(html-helper-bold-face ((,class (:weight bold :foreground "#ffffff")))) - `(html-helper-italic-face ((,class (:slant italic :foreground "#ffffff")))) - `(html-helper-underline-face ((,class (:underline t :foreground "#ffffff")))) - `(html-tag-face ((,class (:foreground "#ffff0b")))) - `(ilog-non-change-face ((,class (:height 2.0 :foreground "#9fcb66")))) - `(ilog-change-face ((,class (:height 2.0 :foreground "#ff7dff")))) - `(ilog-echo-face ((,class (:height 2.0 :foreground "#ff9029")))) - `(ilog-load-face ((,class (:foreground "#4ac964")))) - `(ilog-message-face ((,class (:foreground "#837f87")))) - `(indent-guide-face ((,class (:foreground "#312c36")))) - `(info-file ((,class (:family "Sans Serif" :height 1.8 :weight bold :box (:line-width 1 :color "#ffff3d") :foreground "#9f6a1c" :background "#563c2a")))) - `(info-header-node ((,class (:underline t :foreground "#065aff")))) ; nodes in header - `(info-header-xref ((,class (:underline t :foreground "#e46f0b")))) ; cross references in header - `(info-index-match ((,class (:weight bold :foreground nil :background "#0742d2")))) ; when using `i' - `(info-menu-header ((,class ,ol2))) ; menu titles (headers) -- major topics - `(info-menu-star ((,class (:foreground "#ffffff")))) ; every 3rd menu item - `(info-node ((,class (:underline t :foreground "#ffff0b")))) ; node names - `(info-quoted-name ((,class ,code-inline))) - `(info-string ((,class ,string))) - `(info-title-1 ((,class ,ol1))) - `(info-xref ((,class (:underline t :foreground "#ff925a")))) ; unvisited cross-references - `(info-xref-visited ((,class (:underline t :foreground "#78ff7c")))) ; previously visited cross-references - ;; js2-highlight-vars-face (~ auto-highlight-symbol) - `(js2-error ((,class (:box (:line-width 1 :color "#06c8cf") :background "#063741")))) ; DONE. - `(js2-external-variable ((,class (:foreground "#06ffff" :background "#252630")))) ; DONE. - `(js2-function-param ((,class ,function-param))) - `(js2-instance-member ((,class (:foreground "#6bcd3d")))) - `(js2-jsdoc-html-tag-delimiter ((,class (:foreground "#34c8d8")))) - `(js2-jsdoc-html-tag-name ((,class (:foreground "#34c8d8")))) - `(js2-jsdoc-tag ((,class (:weight normal :foreground "#9fcb66")))) - `(js2-jsdoc-type ((,class (:foreground "#bd7d55")))) - `(js2-jsdoc-value ((,class (:weight normal :foreground "#4ac964")))) ; #83ff87 - `(js2-magic-paren ((,class (:underline t)))) - `(js2-private-function-call ((,class (:foreground "#2a5ae5")))) - `(js2-private-member ((,class (:foreground "#375073")))) - `(js2-warning ((,class (:underline "#065aff")))) - - ;; Org non-standard faces. - `(leuven-dark-org-deadline-overdue ((,class (:foreground "#12d9ae")))) - `(leuven-dark-org-deadline-today ((,class (:weight bold :foreground "#b4b5ca" :background "#252059")))) - `(leuven-dark-org-deadline-tomorrow ((,class (:foreground "#c357f8")))) - `(leuven-dark-org-deadline-future ((,class (:foreground "#c357f8")))) - `(leuven-dark-gnus-unseen ((,class (:weight bold :foreground "#088dfd")))) - `(leuven-dark-gnus-date ((,class (:foreground "#067f4a")))) - `(leuven-dark-gnus-size ((,class (:foreground "#7440a7")))) - `(leuven-dark-todo-items-face ((,class (:weight bold :foreground "#06cee0" :background "#06017f")))) - - `(light-symbol-face ((,class (:background "#252080")))) - `(linum ((,class (:foreground "#6a656f" :background "#35303a")))) - `(log-view-file ((,class (:foreground "#ffff3d" :background "#382c33")))) - `(log-view-message ((,class (:foreground "#ffffff" :background "#171593")))) - `(lui-button-face ((,class ,link))) - `(lui-highlight-face ((,class (:box '(:line-width 1 :color "#38ffff") :foreground "#38ffff" :background "#06017f")))) ; my nickname - `(lui-time-stamp-face ((,class (:foreground "#64df19")))) - `(magit-blame-header ((,class (:inherit magit-diff-file-header)))) - `(magit-blame-heading ((,class (:overline "#5d5862" :foreground "#06ffff" :background "#3c3741")))) - `(magit-blame-hash ((,class (:overline "#5d5862" :foreground "#06ffff" :background "#3c3741")))) - `(magit-blame-name ((,class (:overline "#5d5862" :foreground "#fd95fa" :background "#3c3741")))) - `(magit-blame-date ((,class (:overline "#5d5862" :foreground "#ffff0b" :background "#3c3741")))) - `(magit-blame-summary ((,class (:overline "#5d5862" :weight bold :foreground "#938f97" :background "#3c3741")))) - `(magit-branch ((,class ,vc-branch))) - `(magit-diff-add ((,class ,diff-added))) - `(magit-diff-del ((,class ,diff-removed))) - `(magit-diff-file-header ((,class (:height 1.1 :weight bold :foreground "#c27c45")))) - `(magit-diff-hunk-header ((,class ,diff-hunk-header))) - `(magit-diff-none ((,class ,diff-none))) - `(magit-header ((,class (:foreground "#25202a" :background "#06bfc7")))) - `(magit-item-highlight ((,class (:background "#382c33")))) - `(magit-item-mark ((,class ,marked-line))) - `(magit-log-head-label ((,class (:box (:line-width 1 :color "#ffff0b" :style nil))))) - `(magit-log-tag-label ((,class (:box (:line-width 1 :color "#ff33ff" :style nil))))) - `(magit-section-title ((,class (:family "Sans Serif" :height 1.8 :weight bold :foreground "#9f6a1c" :inherit nil)))) - `(makefile-space-face ((,class (:background "#069655")))) - `(makefile-targets ((,class (:weight bold :foreground "#ffff0b")))) - ;; `(markdown-blockquote-face ((,class ()))) - `(markdown-bold-face ((,class (:inherit bold)))) - ;; `(markdown-comment-face ((,class ()))) - ;; `(markdown-footnote-face ((,class ()))) - ;; `(markdown-header-delimiter-face ((,class ()))) - ;; `(markdown-header-face ((,class ()))) - `(markdown-header-face-1 ((,class ,ol1))) - `(markdown-header-face-2 ((,class ,ol2))) - `(markdown-header-face-3 ((,class ,ol3))) - `(markdown-header-face-4 ((,class ,ol4))) - `(markdown-header-face-5 ((,class ,ol5))) - `(markdown-header-face-6 ((,class ,ol6))) - ;; `(markdown-header-rule-face ((,class ()))) - `(markdown-inline-code-face ((,class ,code-inline))) - `(markdown-italic-face ((,class (:inherit italic)))) - `(markdown-language-keyword-face ((,class (:inherit org-block-begin-line)))) - ;; `(markdown-line-break-face ((,class ()))) - `(markdown-link-face ((,class ,link-no-underline))) - ;; `(markdown-link-title-face ((,class ()))) - ;; `(markdown-list-face ((,class ()))) - ;; `(markdown-math-face ((,class ()))) - ;; `(markdown-metadata-key-face ((,class ()))) - ;; `(markdown-metadata-value-face ((,class ()))) - ;; `(markdown-missing-link-face ((,class ()))) - `(markdown-pre-face ((,class (:inherit org-block-background)))) - ;; `(markdown-reference-face ((,class ()))) - ;; `(markdown-strike-through-face ((,class ()))) - `(markdown-url-face ((,class ,link))) - `(match ((,class ,match))) ; Used for grep matches. - `(mc/cursor-bar-face ((,class (:height 1.0 :foreground "#ec9b45" :background "#ec9b45")))) - `(mc/cursor-face ((,class (:inverse-video t)))) - `(mc/region-face ((,class (:inherit region)))) - `(mm-uu-extract ((,class ,code-block))) - `(moccur-current-line-face ((,class (:foreground "#ffffff" :background "#252059")))) - `(moccur-face ((,class (:foreground "#ffffff" :background "#06016f")))) - `(next-error ((,class ,volatile-highlight-supersize))) - `(nobreak-space ((,class (:background "#543532")))) - `(nxml-attribute-local-name-face ((,class ,xml-attribute))) - `(nxml-attribute-value-delimiter-face ((,class (:foreground "#ff74ff")))) - `(nxml-attribute-value-face ((,class (:foreground "#ff74ff")))) - `(nxml-comment-content-face ((,class (:slant italic :foreground "#06ffff")))) - `(nxml-comment-delimiter-face ((,class (:foreground "#06ffff")))) - `(nxml-element-local-name ((,class ,xml-tag))) - `(nxml-element-local-name-face ((,class (:foreground "#ffff0b")))) - `(nxml-processing-instruction-target-face ((,class (:foreground "#69cf0b")))) - `(nxml-tag-delimiter-face ((,class (:foreground "#ffff0b")))) - `(nxml-tag-slash-face ((,class (:foreground "#ffff0b")))) - `(org-agenda-block-count ((,class (:weight bold :foreground "#5f5a64")))) - `(org-agenda-calendar-event ((,class (:weight bold :foreground "#cc8b3d" :background "#3e322a")))) - `(org-agenda-calendar-sexp ((,class (:foreground "#d0853c" :background "#30272c")))) - `(org-agenda-clocking ((,class (:foreground "#ffffff" :background "#1636ff")))) - `(org-agenda-column-dateline ((,class ,column))) - `(org-agenda-current-time ((,class (:underline t :foreground "#ec9d5a")))) - `(org-agenda-date ((,class (,@(leuven-dark-scale-font leuven-dark-scale-org-agenda-structure 1.6) :weight bold :foreground "#ec9d5a")))) - `(org-agenda-date-today ((,class (,@(leuven-dark-scale-font leuven-dark-scale-org-agenda-structure 1.6) :weight bold :foreground "#b4b5ca" :background "#252059")))) - `(org-agenda-date-weekend ((,class (,@(leuven-dark-scale-font leuven-dark-scale-org-agenda-structure 1.6) :weight bold :foreground "#b5b1b9")))) - `(org-agenda-diary ((,class (:weight bold :foreground "#ff74ff" :background "#572723")))) - `(org-agenda-dimmed-todo-face ((,class (:foreground "#1636ff")))) - `(org-agenda-done ((,class (:foreground "#aeaab2")))) - `(org-agenda-filter-category ((,class (:weight bold :foreground "#065aff")))) - `(org-agenda-filter-effort ((,class (:weight bold :foreground "#065aff")))) - `(org-agenda-filter-regexp ((,class (:weight bold :foreground "#065aff")))) - `(org-agenda-filter-tags ((,class (:weight bold :foreground "#065aff")))) - `(org-agenda-restriction-lock ((,class (:background "#1d82a4")))) - `(org-agenda-structure ((,class (,@(leuven-dark-scale-font leuven-dark-scale-org-agenda-structure 1.6) :weight bold :foreground "#e37233")))) - `(org-archived ((,class (:foreground "#514c56")))) - `(org-beamer-tag ((,class (:box (:line-width 1 :color "#0a43ed") :foreground "#d6d3d9" :background "#252655")))) - `(org-block ((,class ,code-block))) - `(org-block-background ((,class (:background "#252046" :extend t)))) ;; :inherit fixed-pitch)))) - `(org-block-begin-line ((,class (:underline "#5d595f" :foreground "#aeaab2" :background "#221e34" :extend t)))) - `(org-block-end-line ((,class (:overline "#5d595f" :foreground "#aeaab2" :background "#221e34" :extend t)))) - `(org-checkbox ((,class (:weight bold :box (:line-width 1 :style pressed-button) :foreground "#efcab2" :background "#615c66")))) - `(org-clock-overlay ((,class (:foreground "#25202a" :background "#b98f7c")))) - `(org-code ((,class ,code-inline))) - `(org-column ((,class ,column))) - `(org-column-title ((,class ,column))) - `(org-date ((,class (:underline t :foreground "#ffba6b")))) - `(org-default ((,class (:foreground "#cfccd2" :background "#25202a")))) - `(org-dim ((,class (:foreground "#5a555f")))) - `(org-document-info ((,class (:foreground "#bbb7bf")))) - `(org-document-info-keyword ((,class (:foreground "#ff7138" :background "#38332a")))) - `(org-document-title ((,class (:height 1.8 :weight bold :foreground "#ffffff")))) - `(org-done ((,class (:weight bold :box (:line-width 1 :color "#49444e") :foreground "#49444e" :background "#322d37")))) - `(org-drawer ((,class (:foreground "#7c310f")))) - `(org-ellipsis ((,class (:underline nil :foreground "#6b666f")))) ; #0611a5 - `(org-example ((,class (:foreground "#ffff0b" :background "#38203d")))) - `(org-footnote ((,class (:underline t :foreground "#ff7138")))) - `(org-formula ((,class (:foreground "#0680e1")))) - `(org-headline-done ((,class (:height 1.0 :weight normal :strike-through t :foreground "#57525c")))) - `(org-hide ((,class (:foreground "#403b45")))) - `(org-inlinetask ((,class (:box (:line-width 1 :color "#37323c") :foreground "#8c8890" :background "#252050")))) - `(org-latex-and-related ((,class (:foreground "#cf996f" :background "#25202a")))) - `(org-level-1 ((,class ,ol1))) - `(org-level-2 ((,class ,ol2))) - `(org-level-3 ((,class ,ol3))) - `(org-level-4 ((,class ,ol4))) - `(org-level-5 ((,class ,ol5))) - `(org-level-6 ((,class ,ol6))) - `(org-level-7 ((,class ,ol7))) - `(org-level-8 ((,class ,ol8))) - `(org-link ((,class ,link))) - `(org-list-dt ((,class (:weight bold :foreground "#cfa161")))) - `(org-macro ((,class (:weight bold :foreground "#1747fd")))) - `(org-meta-line ((,class (:slant normal :foreground "#ff7138" :background "#38332a")))) - `(org-mode-line-clock ((,class (:box (:line-width 1 :color "#cfa161") :foreground "#ffffff" :background "#065cd0")))) - `(org-mode-line-clock-overrun ((,class (:weight bold :box (:line-width 1 :color "#cfa161") :foreground "#25202a" :background "#06bfc7")))) - `(org-number-of-items ((,class (:weight bold :foreground "#25202a" :background "#8a458e")))) - `(org-property-value ((,class (:foreground "#ff5fff")))) - `(org-quote ((,class (:slant italic :foreground "#9a969e" :background "#252046")))) - `(org-scheduled ((,class (:foreground "#cfccd2")))) - `(org-scheduled-previously ((,class (:foreground "#ed9943")))) - `(org-scheduled-today ((,class (:weight bold :foreground "#b4b5ca" :background "#252059")))) - `(org-sexp-date ((,class (:foreground "#cc8b3d")))) - `(org-special-keyword ((,class (:weight bold :foreground "#ff44ff" :background "#38203d")))) - `(org-table ((,class (:foreground "#ff9bff" :background "#38203d")))) ;; :inherit fixed-pitch)))) - `(org-tag ((,class (:weight normal :slant italic :foreground "#6a6065" :background "#25202a")))) - `(org-target ((,class (:foreground "#06925a")))) - `(org-time-grid ((,class (:foreground "#35303a")))) - `(org-todo ((,class (:weight bold :box (:line-width 1 :color "#2c5462") :foreground "#2c5462" :background "#253743")))) - `(org-upcoming-deadline ((,class (:foreground "#06aab2")))) - `(org-verbatim ((,class (:foreground "#ff993d" :background "#2c212a")))) - `(org-verse ((,class (:slant italic :foreground "#9a969e" :background "#342f39")))) - `(org-warning ((,class (:weight bold :foreground "#ffffff" :background "#54362a")))) - `(outline-1 ((,class ,ol1))) - `(outline-2 ((,class ,ol2))) - `(outline-3 ((,class ,ol3))) - `(outline-4 ((,class ,ol4))) - `(outline-5 ((,class ,ol5))) - `(outline-6 ((,class ,ol6))) - `(outline-7 ((,class ,ol7))) - `(outline-8 ((,class ,ol8))) - `(pabbrev-debug-display-label-face ((,class (:foreground "#25202a" :background "#5edeb3")))) - `(pabbrev-suggestions-face ((,class (:weight bold :foreground "#25202a" :background "#06ffff")))) - `(pabbrev-suggestions-label-face ((,class (:weight bold :foreground "#25202a" :background "#64df19")))) - `(paren-face-match ((,class ,paren-matched))) - `(paren-face-mismatch ((,class ,paren-unmatched))) - `(paren-face-no-match ((,class ,paren-unmatched))) - `(persp-selected-face ((,class (:weight bold :foreground "#34292a")))) - `(powerline-active1 ((,class (:foreground "#7e311e" :background "#cbc7ce" :inherit mode-line)))) - `(powerline-active2 ((,class (:foreground "#7e311e" :background "#c38f53" :inherit mode-line)))) - `(powerline-inactive1 ((,class (:foreground "#322d38" :background "#9b979f" :inherit mode-line-inactive)))) - `(powerline-inactive2 ((,class (:foreground "#322d38" :background "#5b5660" :inherit mode-line-inactive)))) - `(rainbow-delimiters-depth-1-face ((,class (:foreground "#938e84")))) - `(rainbow-delimiters-depth-2-face ((,class (:foreground "#907733")))) - `(rainbow-delimiters-depth-3-face ((,class (:foreground "#736e84")))) - `(rainbow-delimiters-depth-4-face ((,class (:foreground "#936797")))) - `(rainbow-delimiters-depth-5-face ((,class (:foreground "#738c94")))) - `(rainbow-delimiters-depth-6-face ((,class (:foreground "#a1894f")))) - `(rainbow-delimiters-depth-7-face ((,class (:foreground "#7e7a87")))) - `(rainbow-delimiters-depth-8-face ((,class (:foreground "#835787")))) - `(rainbow-delimiters-depth-9-face ((,class (:foreground "#7b8f97")))) - `(rainbow-delimiters-mismatched-face ((,class ,paren-unmatched))) - `(rainbow-delimiters-unmatched-face ((,class ,paren-unmatched))) - `(recover-this-file ((,class (:weight bold :background "#06c0c8")))) - `(rng-error ((,class (:weight bold :foreground "#06ffff" :background "#283a43")))) - `(sh-heredoc ((,class (:foreground "#ffff0b" :background "#34292a")))) - `(sh-quoted-exec ((,class (:foreground "#06eb74")))) - `(shadow ((,class ,shadow))) ; Used for grep context lines. - `(shell-option-face ((,class (:foreground "#e074e3")))) - `(shell-output-2-face ((,class (:foreground "#ffff0b")))) - `(shell-output-3-face ((,class (:foreground "#64df19")))) - `(shell-output-face ((,class (:foreground "#ffffff")))) - ;; `(shell-prompt-face ((,class (:weight bold :foreground "#0601ff")))) - `(shm-current-face ((,class (:background "#343551")))) - `(shm-quarantine-face ((,class (:background "lemonchiffon")))) - `(show-paren-match ((,class ,paren-matched))) - `(show-paren-mismatch ((,class ,paren-unmatched))) - `(sml-modeline-end-face ((,class (:background "#985213")))) ; #cfa161 - `(sml-modeline-vis-face ((,class (:background "#e9863f")))) - `(term ((,class (:foreground "#cfccd2" :background "#25202a")))) - - ;; `(sp-pair-overlay-face ((,class ()))) - ;; `(sp-show-pair-enclosing ((,class ()))) - ;; `(sp-show-pair-match-face ((,class ()))) ; ~ Pair highlighting (matching tags). - ;; `(sp-show-pair-mismatch-face ((,class ()))) - ;; `(sp-wrap-overlay-closing-pair ((,class ()))) - ;; `(sp-wrap-overlay-face ((,class ()))) - ;; `(sp-wrap-overlay-opening-pair ((,class ()))) - ;; `(sp-wrap-tag-overlay-face ((,class ()))) - - `(speedbar-button-face ((,class (:foreground "#ff74ff")))) - `(speedbar-directory-face ((,class (:foreground "#ffff7c")))) - `(speedbar-file-face ((,class (:foreground "#ff747c")))) - `(speedbar-highlight-face ((,class ,volatile-highlight))) - `(speedbar-selected-face ((,class (:underline t :foreground "#06ffff")))) - `(speedbar-tag-face ((,class (:foreground "#5fd5db")))) - `(svn-status-directory-face ((,class ,directory))) - `(svn-status-filename-face ((,class (:weight bold :foreground "#c27c45")))) - `(svn-status-locked-face ((,class (:weight bold :foreground "#06ffff")))) - `(svn-status-marked-face ((,class ,marked-line))) - `(svn-status-marked-popup-face ((,class (:weight bold :foreground "#ff32ff")))) - `(svn-status-switched-face ((,class (:slant italic :foreground "#77737b")))) - `(svn-status-symlink-face ((,class ,symlink))) - `(svn-status-update-available-face ((,class (:foreground "#065aff")))) - `(tex-verbatim ((,class (:foreground "#ffff0b")))) - `(tool-bar ((,class (:box (:line-width 1 :style released-button) :foreground "#ffffff" :background "#45404a")))) - `(tooltip ((,class (:foreground "#ffffff" :background "#252046")))) - `(traverse-match-face ((,class (:weight bold :foreground "#79d427")))) - `(vc-annotate-face-3F3FFF ((,class (:foreground "#c4c00b" :background "#ffffff")))) - `(vc-annotate-face-3F6CFF ((,class (:foreground "#c4c00b" :background "#ffffff")))) - `(vc-annotate-face-3F99FF ((,class (:foreground "#c4660b" :background "#ffffff")))) - `(vc-annotate-face-3FC6FF ((,class (:foreground "#c4660b" :background "#ffffff")))) - `(vc-annotate-face-3FF3FF ((,class (:foreground "#c40c0b" :background "#ffffff")))) - `(vc-annotate-face-3FFF56 ((,class (:foreground "#b801bc" :background "#ffffff")))) - `(vc-annotate-face-3FFF83 ((,class (:foreground "#c40159" :background "#ffffff")))) - `(vc-annotate-face-3FFFB0 ((,class (:foreground "#c40159" :background "#ffffff")))) - `(vc-annotate-face-3FFFDD ((,class (:foreground "#c40c0b" :background "#ffffff")))) - `(vc-annotate-face-56FF3F ((,class (:foreground "#b801bc" :background "#ffffff")))) - `(vc-annotate-face-83FF3F ((,class (:foreground "#5401c8" :background "#ffffff")))) - `(vc-annotate-face-B0FF3F ((,class (:foreground "#5401c8" :background "#ffffff")))) - `(vc-annotate-face-DDFF3F ((,class (:foreground "#060cc8" :background "#ffffff")))) - `(vc-annotate-face-F6FFCC ((,class (:foreground "#ffffff" :background "#252064")))) - `(vc-annotate-face-FF3F3F ((,class (:foreground "#06c0c8" :background "#ffffff")))) - `(vc-annotate-face-FF6C3F ((,class (:foreground "#06c0c8" :background "#ffffff")))) - `(vc-annotate-face-FF993F ((,class (:foreground "#0666c8" :background "#ffffff")))) - `(vc-annotate-face-FFC63F ((,class (:foreground "#0666c8" :background "#ffffff")))) - `(vc-annotate-face-FFF33F ((,class (:foreground "#060cc8" :background "#ffffff")))) - - ;; ;; vc - ;; (vc-up-to-date-state ((,c :foreground ,(gc 'green-1)))) - ;; (vc-edited-state ((,c :foreground ,(gc 'yellow+1)))) - ;; (vc-missing-state ((,c :foreground ,(gc 'red)))) - ;; (vc-conflict-state ((,c :foreground ,(gc 'red+2) :weight bold))) - ;; (vc-locked-state ((,c :foreground ,(gc 'cyan-1)))) - ;; (vc-locally-added-state ((,c :foreground ,(gc 'blue)))) - ;; (vc-needs-update-state ((,c :foreground ,(gc 'magenta)))) - ;; (vc-removed-state ((,c :foreground ,(gc 'red-1)))) - - `(vhl/default-face ((,class ,volatile-highlight))) ; `volatile-highlights.el' (for undo, yank). - `(w3m-anchor ((,class ,link))) - `(w3m-arrived-anchor ((,class (:foreground "#69cf0b")))) - `(w3m-bitmap-image-face ((,class (:foreground "#f7f5f9" :background "#ff01ff")))) - `(w3m-bold ((,class (:weight bold :foreground "#ffffff")))) - `(w3m-current-anchor ((,class (:weight bold :underline t :foreground "#ffff0b")))) - `(w3m-form ((,class (:underline t :foreground "#065ab8")))) - `(w3m-form-button-face ((,class (:weight bold :underline t :foreground "#f7f5f9" :background "#312c36")))) - `(w3m-form-button-mouse-face ((,class (:underline t :foreground "#312c36" :background "#d781db")))) - `(w3m-form-button-pressed-face ((,class (:weight bold :underline t :foreground "#f7f5f9" :background "#312c36")))) - `(w3m-header-line-location-content-face ((,class (:foreground "#848088":background "#2c2731")))) - `(w3m-header-line-location-title-face ((,class (:foreground "#d6aa58" :background "#2c2731")))) - `(w3m-history-current-url-face ((,class (:foreground "#252458")))) - `(w3m-image-face ((,class (:weight bold :foreground "#501155")))) - `(w3m-link-numbering ((,class (:foreground "#50381e")))) ; mouseless browsing - `(w3m-strike-through-face ((,class (:strike-through t)))) - `(w3m-underline-face ((,class (:underline t)))) - - ;; `(web-mode-block-attr-name-face ((,class ()))) - ;; `(web-mode-block-attr-value-face ((,class ()))) - ;; `(web-mode-block-comment-face ((,class ()))) - ;; `(web-mode-block-control-face ((,class ()))) - ;; `(web-mode-block-delimiter-face ((,class ()))) - ;; `(web-mode-block-face ((,class ()))) - ;; `(web-mode-block-string-face ((,class ()))) - ;; `(web-mode-bold-face ((,class ()))) - ;; `(web-mode-builtin-face ((,class ()))) - ;; `(web-mode-comment-face ((,class ()))) - ;; `(web-mode-comment-keyword-face ((,class ()))) - ;; `(web-mode-constant-face ((,class ()))) - ;; `(web-mode-css-at-rule-face ((,class ()))) - ;; `(web-mode-css-color-face ((,class ()))) - ;; `(web-mode-css-comment-face ((,class ()))) - ;; `(web-mode-css-function-face ((,class ()))) - ;; `(web-mode-css-priority-face ((,class ()))) - ;; `(web-mode-css-property-name-face ((,class ()))) - ;; `(web-mode-css-pseudo-class-face ((,class ()))) - ;; `(web-mode-css-selector-face ((,class ()))) - ;; `(web-mode-css-string-face ((,class ()))) - ;; `(web-mode-css-variable-face ((,class ()))) - ;; `(web-mode-current-column-highlight-face ((,class ()))) - `(web-mode-current-element-highlight-face ((,class (:background "#6b330b")))) ; #061187 - ;; `(web-mode-doctype-face ((,class ()))) - ;; `(web-mode-error-face ((,class ()))) - ;; `(web-mode-filter-face ((,class ()))) - `(web-mode-folded-face ((,class (:box (:line-width 1 :color "#8c8890") :foreground "#6a659d" :background "#110cbe")))) - ;; `(web-mode-function-call-face ((,class ()))) - ;; `(web-mode-function-name-face ((,class ()))) - ;; `(web-mode-html-attr-custom-face ((,class ()))) - ;; `(web-mode-html-attr-engine-face ((,class ()))) - ;; `(web-mode-html-attr-equal-face ((,class ()))) - `(web-mode-html-attr-name-face ((,class ,xml-attribute))) - ;; `(web-mode-html-attr-value-face ((,class ()))) - ;; `(web-mode-html-entity-face ((,class ()))) - `(web-mode-html-tag-bracket-face ((,class ,xml-tag))) - ;; `(web-mode-html-tag-custom-face ((,class ()))) - `(web-mode-html-tag-face ((,class ,xml-tag))) - ;; `(web-mode-html-tag-namespaced-face ((,class ()))) - ;; `(web-mode-inlay-face ((,class ()))) - ;; `(web-mode-italic-face ((,class ()))) - ;; `(web-mode-javascript-comment-face ((,class ()))) - ;; `(web-mode-javascript-string-face ((,class ()))) - ;; `(web-mode-json-comment-face ((,class ()))) - ;; `(web-mode-json-context-face ((,class ()))) - ;; `(web-mode-json-key-face ((,class ()))) - ;; `(web-mode-json-string-face ((,class ()))) - ;; `(web-mode-jsx-depth-1-face ((,class ()))) - ;; `(web-mode-jsx-depth-2-face ((,class ()))) - ;; `(web-mode-jsx-depth-3-face ((,class ()))) - ;; `(web-mode-jsx-depth-4-face ((,class ()))) - ;; `(web-mode-keyword-face ((,class ()))) - ;; `(web-mode-param-name-face ((,class ()))) - ;; `(web-mode-part-comment-face ((,class ()))) - `(web-mode-part-face ((,class (:background "#252046")))) - ;; `(web-mode-part-string-face ((,class ()))) - ;; `(web-mode-preprocessor-face ((,class ()))) - `(web-mode-script-face ((,class (:background "#332d37")))) - ;; `(web-mode-sql-keyword-face ((,class ()))) - ;; `(web-mode-string-face ((,class ()))) - ;; `(web-mode-style-face ((,class ()))) - ;; `(web-mode-symbol-face ((,class ()))) - ;; `(web-mode-type-face ((,class ()))) - ;; `(web-mode-underline-face ((,class ()))) - ;; `(web-mode-variable-name-face ((,class ()))) - ;; `(web-mode-warning-face ((,class ()))) - ;; `(web-mode-whitespace-face ((,class ()))) - - `(which-func ((,class (:weight bold :slant italic :foreground "#25202a")))) - ;; `(which-key-command-description-face) - ;; `(which-key-group-description-face) - ;; `(which-key-highlighted-command-face) - ;; `(which-key-key-face) - `(which-key-local-map-description-face ((,class (:weight bold :background "#30272c" :inherit which-key-command-description-face)))) - ;; `(which-key-note-face) - ;; `(which-key-separator-face) - ;; `(which-key-special-key-face) - `(widget-button ((,class ,link))) - `(widget-button-pressed ((,class (:foreground "#06ffff")))) - `(widget-documentation ((,class (:foreground "#ff74ff")))) - `(widget-field ((,class (:background "#2b2630")))) - `(widget-inactive ((,class (:foreground "#9a969e")))) - `(widget-single-line-field ((,class (:background "#2b2630")))) - `(woman-bold ((,class (:weight bold :foreground "#13c2ca")))) - `(woman-italic ((,class (:weight bold :slant italic :foreground "#bd41ea")))) - `(woman-symbol ((,class (:weight bold :foreground "#64df19")))) - `(yas-field-debug-face ((,class (:foreground "#25202a" :background "#5edeb3")))) - `(yas-field-highlight-face ((,class (:box (:line-width 1 :color "#807c84") :foreground "#ffffff" :background "#302331")))) - - ;; `(ztreep-arrow-face ((,class ()))) - ;; `(ztreep-diff-header-face ((,class ()))) - ;; `(ztreep-diff-header-small-face ((,class ()))) - `(ztreep-diff-model-add-face ((,class (:weight bold :foreground "#ff77ff")))) - `(ztreep-diff-model-diff-face ((,class (:weight bold :foreground "#ffbb2c")))) - `(ztreep-diff-model-ignored-face ((,class (:strike-through t :foreground "#66616b")))) - `(ztreep-diff-model-normal-face ((,class (:foreground "#ffffff")))) - ;; `(ztreep-expand-sign-face ((,class ()))) - ;; `(ztreep-header-face ((,class ()))) - ;; `(ztreep-leaf-face ((,class ()))) - ;; `(ztreep-node-face ((,class ()))) - - )) - -(custom-theme-set-variables 'leuven-dark - - ;; highlight-sexp-mode. - '(hl-sexp-background-color "#33323e") - - '(ansi-color-faces-vector - [default default default italic underline success warning error]) - - ;; Colors used in Shell mode. - '(ansi-color-names-vector - ["#ffffff" "#37ffff" "#e074e3" "#3732ff" "#ffff0b" "#37ff3c" "#ff400b" "#848088"]) - ) - -;;;######autoload -(when (and (boundp 'custom-theme-load-path) - load-file-name) - ;; Add theme folder to `custom-theme-load-path' when installing over MELPA. - (add-to-list 'custom-theme-load-path - (file-name-as-directory (file-name-directory load-file-name)))) - -;;;######autoload -(when (string-match "/etc/themes/$" - (file-name-directory (or load-file-name (buffer-file-name)))) - (message "To stay up-to-date, you should better install and use leuven-dark-theme from MELPA.") - (sit-for 2)) - -(provide-theme 'leuven-dark) - -;; This is for the sake of Emacs. -;; Local Variables: -;; no-byte-compile: t -;; time-stamp-end: "$" -;; time-stamp-format: "%:y%02m%02d.%02H%02M" -;; time-stamp-start: "Version: " -;; End: - -;;; leuven-dark-theme.el ends here diff --git a/elpa/leuven-theme-20200416.728/leuven-theme-autoloads.el b/elpa/leuven-theme-20200416.728/leuven-theme-autoloads.el deleted file mode 100644 index 80eca07e..00000000 --- a/elpa/leuven-theme-20200416.728/leuven-theme-autoloads.el +++ /dev/null @@ -1,38 +0,0 @@ -;;; leuven-theme-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "leuven-dark-theme" "leuven-dark-theme.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from leuven-dark-theme.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "leuven-dark-theme" '("leuven-dark"))) - -;;;*** - -;;;### (autoloads nil "leuven-theme" "leuven-theme.el" (0 0 0 0)) -;;; Generated autoloads from leuven-theme.el - -(when (and (boundp 'custom-theme-load-path) load-file-name) (add-to-list 'custom-theme-load-path (file-name-as-directory (file-name-directory load-file-name)))) - -(when (string-match "/etc/themes/$" (file-name-directory (or load-file-name (buffer-file-name)))) (message "To stay up-to-date, you should better install and use leuven-theme from MELPA.") (sit-for 2)) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "leuven-theme" '("leuven"))) - -;;;*** - -;;;### (autoloads nil nil ("leuven-theme-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; leuven-theme-autoloads.el ends here diff --git a/elpa/leuven-theme-20200416.728/leuven-theme-pkg.el b/elpa/leuven-theme-20200416.728/leuven-theme-pkg.el deleted file mode 100644 index 21ffbeec..00000000 --- a/elpa/leuven-theme-20200416.728/leuven-theme-pkg.el +++ /dev/null @@ -1,10 +0,0 @@ -(define-package "leuven-theme" "20200416.728" "Awesome Emacs color theme on white background" 'nil :keywords - '("color" "theme") - :authors - '(("Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>")) - :maintainer - '("Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>") - :url "https://github.com/fniessen/emacs-leuven-theme") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/leuven-theme-20200416.728/leuven-theme.el b/elpa/leuven-theme-20200416.728/leuven-theme.el deleted file mode 100644 index 89c179ed..00000000 --- a/elpa/leuven-theme-20200416.728/leuven-theme.el +++ /dev/null @@ -1,1067 +0,0 @@ -;;; leuven-theme.el --- Awesome Emacs color theme on white background - -;; Copyright (C) 2003-2020 Free Software Foundation, Inc. - -;; Author: Fabrice Niessen <(concat "fniessen" at-sign "pirilampo.org")> -;; URL: https://github.com/fniessen/emacs-leuven-theme -;; Version: 20200406.1542 -;; Keywords: color theme - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This elegant Org-enhancing color theme "leuven" ROCKS! -;; ... and not just for Org mode. -;; -;; To use it, put the following in your Emacs configuration file: -;; -;; (load-theme 'leuven t) -;; -;; Requirements: Emacs 24+. -;; -;; NOTE -- Would you like implement a version of this for dark backgrounds, -;; please do so! I'm willing to integrate it... - -;;; Code: - -;;; Options. - -(defgroup leuven nil - "Leuven theme options. -The theme has to be reloaded after changing anything in this group." - :group 'faces) - -(defcustom leuven-scale-outline-headlines t - "Scale `outline' (and `org') level-1 headlines. -This can be nil for unscaled, t for using the theme default, or a scaling number." - :type '(choice - (const :tag "Unscaled" nil) - (const :tag "Default provided by theme" t) - (number :tag "Set scaling")) - :group 'leuven) - -(defcustom leuven-scale-org-agenda-structure t - "Scale Org agenda structure lines, like dates. -This can be nil for unscaled, t for using the theme default, or a scaling number." - :type '(choice - (const :tag "Unscaled" nil) - (const :tag "Default provided by theme" t) - (number :tag "Set scaling")) - :group 'leuven) - -(defun leuven-scale-font (control default-height) - "Function for splicing optional font heights into face descriptions. -CONTROL can be a number, nil, or t. When t, use DEFAULT-HEIGHT." - (cond - ((numberp control) (list :height control)) - ((eq t control) (list :height default-height)) - (t nil))) - -;;; Theme Faces. - -(deftheme leuven - "Face colors with a light background. -Basic, Font Lock, Isearch, Gnus, Message, Org mode, Diff, Ediff, -Flyspell, Semantic, and Ansi-Color faces are included -- and much -more...") - -(let ((class '((class color) (min-colors 89))) - - ;; Leuven generic colors. - (cancel '(:slant italic :strike-through t :foreground "#A9A9A9")) - (clock-line '(:box (:line-width 1 :color "#335EA8") :foreground "black" :background "#EEC900")) - (code-block '(:foreground "#000088" :background "#FFFFE0" :extend t)) - (code-inline '(:foreground "#006400" :background "#FDFFF7" :extend t)) - (column '(:height 1.0 :weight normal :slant normal :underline nil :strike-through nil :foreground "#E6AD4F" :background "#FFF2DE")) - (completion-inline '(:weight normal :foreground "#C0C0C0" :inherit hl-line)) ; Like Google. - (completion-other-candidates '(:weight bold :foreground "black" :background "#EBF4FE")) - (completion-selected-candidate '(:weight bold :foreground "white" :background "#0052A4")) - (diff-added '(:background "#DDFFDD")) - (diff-changed '(:foreground "#0000FF" :background "#DDDDFF")) - (diff-header '(:weight bold :foreground "#800000" :background "#FFFFAF")) - (diff-hunk-header '(:foreground "#990099" :background "#FFEEFF")) - (diff-none '(:foreground "#888888")) - (diff-refine-added '(:background "#97F295")) - (diff-refine-removed '(:background "#FFB6BA")) - (diff-removed '(:background "#FEE8E9")) - (directory '(:weight bold :foreground "blue" :background "#FFFFD2")) - (file '(:foreground "black")) - (function-param '(:foreground "#247284")) - (grep-file-name '(:weight bold :foreground "#2A489E")) ; Used for grep hits. - (grep-line-number '(:weight bold :foreground "#A535AE")) - (highlight-blue '(:background "#E6ECFF" :extend t)) - (highlight-blue2 '(:background "#E4F1F9" :extend t)) - (highlight-gray '(:background "#E4E4E3" :extend t)) - (highlight-green '(:background "#D5F1CF" :extend t)) - (highlight-red '(:background "#FFC8C8" :extend t)) - (highlight-yellow '(:background "#F6FECD" :extend t)) - (link '(:weight normal :underline t :foreground "#006DAF")) - (link-no-underline '(:weight normal :foreground "#006DAF")) - (mail-header-name '(:family "Sans Serif" :weight normal :foreground "#A3A3A2")) - (mail-header-other '(:family "Sans Serif" :slant normal :foreground "#666666")) - (mail-read '(:foreground "#8C8C8C")) - (mail-read-high '(:foreground "#808080")) - (mail-ticked '(:foreground "#FF3300")) - (mail-to '(:family "Sans Serif" :underline nil :foreground "#006DAF")) - (mail-unread '(:weight bold :foreground "#000000")) - (mail-unread-high '(:weight bold :foreground "#135985")) - (marked-line '(:foreground "#AA0000" :background "#FFAAAA")) - (match '(:weight bold :background "#FFFF00")) ; occur patterns + match in helm for files + match in Org files. - (ol1 `(,@(leuven-scale-font leuven-scale-outline-headlines 1.3) :weight bold :overline "#A7A7A7" :foreground "#3C3C3C" :background "#F0F0F0" :extend t)) - (ol2 '(:height 1.0 :weight bold :overline "#123555" :foreground "#123555" :background "#E5F4FB" :extend t)) - (ol3 '(:height 1.0 :weight bold :foreground "#005522" :background "#EFFFEF" :extend t)) - (ol4 '(:height 1.0 :weight bold :slant normal :foreground "#EA6300" :extend t)) - (ol5 '(:height 1.0 :weight bold :slant normal :foreground "#E3258D" :extend t)) - (ol6 '(:height 1.0 :weight bold :slant italic :foreground "#0077CC" :extend t)) - (ol7 '(:height 1.0 :weight bold :slant italic :foreground "#2EAE2C" :extend t)) - (ol8 '(:height 1.0 :weight bold :slant italic :foreground "#FD8008" :extend t)) - (paren-matched '(:background "#C0E8C3")) ; Or take that green for region? - (paren-unmatched '(:weight bold :underline "red" :foreground "black" :background "#FFA5A5")) - (region '(:background "#8ED3FF" :extend t)) - (shadow '(:foreground "#7F7F7F")) - (string '(:foreground "#008000")) ; or #D0372D - (subject '(:family "Sans Serif" :weight bold :foreground "black")) - (symlink '(:foreground "#1F8DD6")) - (tab '(:foreground "#E8E8E8" :background "white")) - (trailing '(:foreground "#E8E8E8" :background "#FFFFAB")) - (volatile-highlight '(:underline nil :foreground "white" :background "#9E3699")) - (volatile-highlight-supersize '(:height 1.1 :underline nil :foreground "white" :background "#9E3699")) ; flash-region - (vc-branch '(:box (:line-width 1 :color "#00CC33") :foreground "black" :background "#AAFFAA")) - (xml-attribute '(:foreground "#F36335")) - (xml-tag '(:foreground "#AE1B9A")) - (highlight-current-tag '(:background "#E8E8FF")) ; #EEF3F6 or #FFEB26 - ) - - (custom-theme-set-faces - 'leuven - `(default ((,class (:foreground "#333333" :background "#FFFFFF")))) - `(bold ((,class (:weight bold :foreground "black")))) - `(bold-italic ((,class (:weight bold :slant italic :foreground "black")))) - `(italic ((,class (:slant italic :foreground "#1A1A1A")))) - `(underline ((,class (:underline t)))) - `(cursor ((,class (:background "#21BDFF")))) - - ;; Lucid toolkit emacs menus. - `(menu ((,class (:foreground "#FFFFFF" :background "#333333")))) - - ;; Highlighting faces. - `(fringe ((,class (:foreground "#4C9ED9" :background "white")))) - `(highlight ((,class ,highlight-blue))) - `(region ((,class ,region))) - `(secondary-selection ((,class ,match))) ; Used by Org-mode for highlighting matched entries and keywords. - `(isearch ((,class (:underline "black" :foreground "white" :background "#5974AB")))) - `(isearch-fail ((,class (:weight bold :foreground "black" :background "#FFCCCC")))) - `(lazy-highlight ((,class (:foreground "black" :background "#FFFF00")))) ; Isearch others (see `match'). - `(trailing-whitespace ((,class ,trailing))) - `(query-replace ((,class (:inherit isearch)))) - `(whitespace-hspace ((,class (:foreground "#D2D2D2")))) ; see also `nobreak-space' - `(whitespace-indentation ((,class ,tab))) - `(whitespace-line ((,class (:foreground "#CC0000" :background "#FFFF88")))) - `(whitespace-tab ((,class ,tab))) - `(whitespace-trailing ((,class ,trailing))) - - ;; Mode line faces. - `(mode-line ((,class (:box (:line-width 1 :color "#1A2F54") :foreground "#85CEEB" :background "#335EA8")))) - `(mode-line-inactive ((,class (:box (:line-width 1 :color "#4E4E4C") :foreground "#F0F0EF" :background "#9B9C97")))) - `(mode-line-buffer-id ((,class (:weight bold :foreground "white")))) - `(mode-line-emphasis ((,class (:weight bold :foreground "white")))) - `(mode-line-highlight ((,class (:foreground "yellow")))) - - ;; Escape and prompt faces. - `(minibuffer-prompt ((,class (:weight bold :foreground "black" :background "gold")))) - `(minibuffer-noticeable-prompt ((,class (:weight bold :foreground "black" :background "gold")))) - `(escape-glyph ((,class (:foreground "#008ED1")))) - `(error ((,class (:foreground "red")))) - `(warning ((,class (:weight bold :foreground "orange")))) - `(success ((,class (:foreground "green")))) - - ;; Font lock faces. - `(font-lock-builtin-face ((,class (:foreground "#006FE0")))) - `(font-lock-comment-delimiter-face ((,class (:foreground "#8D8D84")))) ; #696969 - `(font-lock-comment-face ((,class (:slant italic :foreground "#8D8D84")))) ; #696969 - `(font-lock-constant-face ((,class (:foreground "#D0372D")))) - `(font-lock-doc-face ((,class (:foreground "#036A07")))) - ;; `(font-lock-doc-string-face ((,class (:foreground "#008000")))) ; XEmacs only, but is used for HTML exports from org2html (and not interactively) - `(font-lock-function-name-face ((,class (:weight normal :foreground "#006699")))) - `(font-lock-keyword-face ((,class (:bold nil :foreground "#0000FF")))) ; #3654DC - `(font-lock-preprocessor-face ((,class (:foreground "#808080")))) - `(font-lock-regexp-grouping-backslash ((,class (:weight bold :inherit nil)))) - `(font-lock-regexp-grouping-construct ((,class (:weight bold :inherit nil)))) - `(font-lock-string-face ((,class ,string))) - `(font-lock-type-face ((,class (:weight normal :foreground "#6434A3")))) - `(font-lock-variable-name-face ((,class (:weight normal :foreground "#BA36A5")))) ; #800080 - `(font-lock-warning-face ((,class (:weight bold :foreground "red")))) - - ;; Button and link faces. - `(link ((,class ,link))) - `(link-visited ((,class (:underline t :foreground "#E5786D")))) - `(button ((,class (:underline t :foreground "#006DAF")))) - `(header-line ((,class (:box (:line-width 1 :color "black") :foreground "black" :background "#F0F0F0")))) - - ;; Gnus faces. - `(gnus-button ((,class (:weight normal)))) - `(gnus-cite-attribution-face ((,class (:foreground "#5050B0")))) - `(gnus-cite-1 ((,class (:foreground "#5050B0" :background "#F6F6F6")))) - `(gnus-cite-2 ((,class (:foreground "#660066" :background "#F6F6F6")))) - `(gnus-cite-3 ((,class (:foreground "#007777" :background "#F6F6F6")))) - `(gnus-cite-4 ((,class (:foreground "#990000" :background "#F6F6F6")))) - `(gnus-cite-5 ((,class (:foreground "#000099" :background "#F6F6F6")))) - `(gnus-cite-6 ((,class (:foreground "#BB6600" :background "#F6F6F6")))) - `(gnus-cite-7 ((,class (:foreground "#5050B0" :background "#F6F6F6")))) - `(gnus-cite-8 ((,class (:foreground "#660066" :background "#F6F6F6")))) - `(gnus-cite-9 ((,class (:foreground "#007777" :background "#F6F6F6")))) - `(gnus-cite-10 ((,class (:foreground "#990000" :background "#F6F6F6")))) - `(gnus-emphasis-bold ((,class (:weight bold)))) - `(gnus-emphasis-highlight-words ((,class (:foreground "yellow" :background "black")))) - `(gnus-group-mail-1 ((,class (:weight bold :foreground "#FF50B0")))) - `(gnus-group-mail-1-empty ((,class (:foreground "#5050B0")))) - `(gnus-group-mail-2 ((,class (:weight bold :foreground "#FF0066")))) - `(gnus-group-mail-2-empty ((,class (:foreground "#660066")))) - `(gnus-group-mail-3 ((,class ,mail-unread))) - `(gnus-group-mail-3-empty ((,class ,mail-read))) - `(gnus-group-mail-low ((,class ,cancel))) - `(gnus-group-mail-low-empty ((,class ,cancel))) - `(gnus-group-news-1 ((,class (:weight bold :foreground "#FF50B0")))) - `(gnus-group-news-1-empty ((,class (:foreground "#5050B0")))) - `(gnus-group-news-2 ((,class (:weight bold :foreground "#FF0066")))) - `(gnus-group-news-2-empty ((,class (:foreground "#660066")))) - `(gnus-group-news-3 ((,class ,mail-unread))) - `(gnus-group-news-3-empty ((,class ,mail-read))) - `(gnus-group-news-4 ((,class (:weight bold :foreground "#FF0000")))) - `(gnus-group-news-4-empty ((,class (:foreground "#990000")))) - `(gnus-group-news-5 ((,class (:weight bold :foreground "#FF0099")))) - `(gnus-group-news-5-empty ((,class (:foreground "#000099")))) - `(gnus-group-news-6 ((,class (:weight bold :foreground "gray50")))) - `(gnus-group-news-6-empty ((,class (:foreground "#808080")))) - `(gnus-header-content ((,class ,mail-header-other))) - `(gnus-header-from ((,class (:family "Sans Serif" :foreground "black")))) - `(gnus-header-name ((,class ,mail-header-name))) - `(gnus-header-newsgroups ((,class (:family "Sans Serif" :foreground "#3399CC")))) - `(gnus-header-subject ((,class ,subject))) - `(gnus-picon ((,class (:foreground "yellow" :background "white")))) - `(gnus-picon-xbm ((,class (:foreground "yellow" :background "white")))) - `(gnus-server-closed ((,class (:slant italic :foreground "blue" :background "white")))) - `(gnus-server-denied ((,class (:weight bold :foreground "red" :background "white")))) - `(gnus-server-opened ((,class (:family "Sans Serif" :foreground "white" :foreground "#466BD7")))) - `(gnus-signature ((,class (:slant italic :foreground "#8B8D8E")))) - `(gnus-splash ((,class (:foreground "#FF8C00")))) - `(gnus-summary-cancelled ((,class ,cancel))) - `(gnus-summary-high-ancient ((,class ,mail-unread-high))) - `(gnus-summary-high-read ((,class ,mail-read-high))) - `(gnus-summary-high-ticked ((,class ,mail-ticked))) - `(gnus-summary-high-unread ((,class ,mail-unread-high))) - `(gnus-summary-low-ancient ((,class (:slant italic :foreground "black")))) - `(gnus-summary-low-read ((,class (:slant italic :foreground "#999999" :background "#E0E0E0")))) - `(gnus-summary-low-ticked ((,class ,mail-ticked))) - `(gnus-summary-low-unread ((,class (:slant italic :foreground "black")))) - `(gnus-summary-normal-ancient ((,class ,mail-read))) - `(gnus-summary-normal-read ((,class ,mail-read))) - `(gnus-summary-normal-ticked ((,class ,mail-ticked))) - `(gnus-summary-normal-unread ((,class ,mail-unread))) - `(gnus-summary-selected ((,class (:foreground "white" :background "#008CD7")))) - `(gnus-x-face ((,class (:foreground "black" :background "white")))) - - ;; Message faces. - `(message-header-name ((,class ,mail-header-name))) - `(message-header-cc ((,class ,mail-to))) - `(message-header-other ((,class ,mail-header-other))) - `(message-header-subject ((,class ,subject))) - `(message-header-to ((,class ,mail-to))) - `(message-cited-text ((,class (:foreground "#5050B0" :background "#F6F6F6")))) - `(message-separator ((,class (:family "Sans Serif" :weight normal :foreground "#BDC2C6")))) - `(message-header-newsgroups ((,class (:family "Sans Serif" :foreground "#3399CC")))) - `(message-header-xheader ((,class ,mail-header-other))) - `(message-mml ((,class (:foreground "forest green")))) - - ;; Diff. - `(diff-added ((,class ,diff-added))) - `(diff-changed ((,class ,diff-changed))) - `(diff-context ((,class ,diff-none))) - `(diff-file-header ((,class ,diff-header))) - `(diff-file1-hunk-header ((,class (:foreground "dark magenta" :background "#EAF2F5")))) - `(diff-file2-hunk-header ((,class (:foreground "#2B7E2A" :background "#EAF2F5")))) - `(diff-function ((,class (:foreground "#CC99CC")))) - `(diff-header ((,class ,diff-header))) - `(diff-hunk-header ((,class ,diff-hunk-header))) - `(diff-index ((,class ,diff-header))) - `(diff-indicator-added ((,class (:foreground "#3A993A" :background "#CDFFD8")))) - `(diff-indicator-changed ((,class (:background "#DBEDFF")))) - `(diff-indicator-removed ((,class (:foreground "#CC3333" :background "#FFDCE0")))) - `(diff-refine-added ((,class ,diff-refine-added))) - `(diff-refine-change ((,class (:background "#DDDDFF")))) - `(diff-refine-removed ((,class ,diff-refine-removed))) - `(diff-removed ((,class ,diff-removed))) - - ;; SMerge. - `(smerge-mine ((,class ,diff-changed))) - `(smerge-other ((,class ,diff-added))) - `(smerge-base ((,class ,diff-removed))) - `(smerge-markers ((,class (:background "#FFE5CC")))) - `(smerge-refined-change ((,class (:background "#AAAAFF")))) - - ;; Ediff. - `(ediff-current-diff-A ((,class (:background "#FFDDDD" :extend t)))) - `(ediff-current-diff-B ((,class (:background "#DDFFDD" :extend t)))) - `(ediff-current-diff-C ((,class (:background "cyan" :extend t)))) - `(ediff-even-diff-A ((,class (:background "light grey" :extend t)))) - `(ediff-even-diff-B ((,class (:background "light grey" :extend t)))) - `(ediff-fine-diff-A ((,class (:background "#FFAAAA" :extend t)))) - `(ediff-fine-diff-B ((,class (:background "#55FF55" :extend t)))) - `(ediff-odd-diff-A ((,class (:background "light grey" :extend t)))) - `(ediff-odd-diff-B ((,class (:background "light grey" :extend t)))) - - ;; Flyspell. - (if (version< emacs-version "24.4") - `(flyspell-duplicate ((,class (:underline "#F4EB80" :inherit nil)))) - `(flyspell-duplicate ((,class (:underline (:style wave :color "#F4EB80") :background "#FAF7CC" :inherit nil))))) - (if (version< emacs-version "24.4") - `(flyspell-incorrect ((,class (:underline "#FAA7A5" :inherit nil)))) - `(flyspell-incorrect ((,class (:underline (:style wave :color "#FAA7A5") :background "#F4D7DA":inherit nil))))) - - ;; ;; Semantic faces. - ;; `(semantic-decoration-on-includes ((,class (:underline ,cham-4)))) - ;; `(semantic-decoration-on-private-members-face ((,class (:background ,alum-2)))) - ;; `(semantic-decoration-on-protected-members-face ((,class (:background ,alum-2)))) - `(semantic-decoration-on-unknown-includes ((,class (:background "#FFF8F8")))) - ;; `(semantic-decoration-on-unparsed-includes ((,class (:underline ,orange-3)))) - `(semantic-highlight-func-current-tag-face ((,class ,highlight-current-tag))) - `(semantic-tag-boundary-face ((,class (:overline "#777777")))) ; Method separator. - ;; `(semantic-unmatched-syntax-face ((,class (:underline ,red-1)))) - - `(Info-title-1-face ((,class ,ol1))) - `(Info-title-2-face ((,class ,ol2))) - `(Info-title-3-face ((,class ,ol3))) - `(Info-title-4-face ((,class ,ol4))) - `(ace-jump-face-foreground ((,class (:weight bold :foreground "black" :background "#FEA500")))) - `(ahs-face ((,class (:background "#E4E4FF")))) - `(ahs-definition-face ((,class (:background "#FFB6C6")))) - `(ahs-plugin-defalt-face ((,class (:background "#FFE4FF")))) ; Current. - `(anzu-match-1 ((,class (:foreground "black" :background "aquamarine")))) - `(anzu-match-2 ((,class (:foreground "black" :background "springgreen")))) - `(anzu-match-3 ((,class (:foreground "black" :background "red")))) - `(anzu-mode-line ((,class (:foreground "black" :background "#80FF80")))) - `(anzu-mode-line-no-match ((,class (:foreground "black" :background "#FF8080")))) - `(anzu-replace-highlight ((,class (:inherit query-replace)))) - `(anzu-replace-to ((,class (:weight bold :foreground "#BD33FD" :background "#FDBD33")))) - `(auto-dim-other-buffers-face ((,class (:background "#F7F7F7")))) - `(avy-background-face ((,class (:background "#A9A9A9")))) - `(avy-lead-face ((,class (:weight bold :foreground "black" :background "#FEA500")))) - `(bbdb-company ((,class (:slant italic :foreground "steel blue")))) - `(bbdb-field-name ((,class (:weight bold :foreground "steel blue")))) - `(bbdb-field-value ((,class (:foreground "steel blue")))) - `(bbdb-name ((,class (:underline t :foreground "#FF6633")))) - `(bmkp-light-autonamed ((,class (:background "#F0F0F0")))) - `(bmkp-light-fringe-autonamed ((,class (:foreground "#5A5A5A" :background "#D4D4D4")))) - `(bmkp-light-fringe-non-autonamed ((,class (:foreground "#FFFFCC" :background "#01FFFB")))) ; default - `(bmkp-light-non-autonamed ((,class (:background "#BFFFFE")))) - `(bmkp-no-local ((,class (:background "pink")))) - `(browse-kill-ring-separator-face ((,class (:foreground "red")))) - `(calendar-month-header ((,class (:weight bold :foreground "#4F4A3D" :background "#FFFFCC")))) - `(calendar-today ((,class (:weight bold :foreground "#4F4A3D" :background "#FFFFCC")))) - `(calendar-weekday-header ((,class (:weight bold :foreground "#1662AF")))) - `(calendar-weekend-header ((,class (:weight bold :foreground "#4E4E4E")))) - `(cfw:face-annotation ((,class (:foreground "green" :background "red")))) - `(cfw:face-day-title ((,class (:foreground "#C9C9C9")))) - `(cfw:face-default-content ((,class (:foreground "#2952A3")))) - `(cfw:face-default-day ((,class (:weight bold)))) - `(cfw:face-disable ((,class (:foreground "DarkGray")))) - `(cfw:face-grid ((,class (:foreground "#DDDDDD")))) - `(cfw:face-header ((,class (:foreground "#1662AF" :background "white" :weight bold)))) - `(cfw:face-holiday ((,class (:foreground "#777777" :background "#E4EBFE")))) - `(cfw:face-periods ((,class (:foreground "white" :background "#668CD9" :slant italic)))) - `(cfw:face-saturday ((,class (:foreground "#4E4E4E" :background "white" :weight bold)))) - `(cfw:face-select ((,class (:foreground "#4A95EB" :background "#EDF1FA")))) - `(cfw:face-sunday ((,class (:foreground "#4E4E4E" :background "white" :weight bold)))) - `(cfw:face-title ((,class (:height 2.0 :foreground "#676767" :weight bold :inherit variable-pitch)))) - `(cfw:face-today ((,class (:foreground "#4F4A3D" :background "#FFFFCC")))) - `(cfw:face-today-title ((,class (:foreground "white" :background "#1766B1")))) - `(cfw:face-toolbar ((,class (:background "white")))) - `(cfw:face-toolbar-button-off ((,class (:foreground "#CFCFCF" :background "white")))) - `(cfw:face-toolbar-button-on ((,class (:foreground "#5E5E5E" :background "#F6F6F6")))) - `(change-log-date ((,class (:foreground "purple")))) - `(change-log-file ((,class (:weight bold :foreground "#4183C4")))) - `(change-log-list ((,class (:foreground "black" :background "#75EEC7")))) - `(change-log-name ((,class (:foreground "#008000")))) - `(circe-highlight-all-nicks-face ((,class (:foreground "blue" :background "#F0F0F0")))) ; other nick names - `(circe-highlight-nick-face ((,class (:foreground "#009300" :background "#F0F0F0")))) ; messages with my nick cited - `(circe-my-message-face ((,class (:foreground "#8B8B8B" :background "#F0F0F0")))) - `(circe-originator-face ((,class (:foreground "blue")))) - `(circe-prompt-face ((,class (:foreground "red")))) - `(circe-server-face ((,class (:foreground "#99CAE5")))) - `(comint-highlight-input ((,class (:weight bold :foreground "#0000FF" :inherit nil)))) - ;; `(comint-highlight-prompt ((,class (:weight bold :foreground "black" :background "gold")))) - `(comint-highlight-prompt ((,class (:weight bold :foreground "#0000FF" :inherit nil)))) - - ;; `(ac-selection-face ((,class ,completion-selected-candidate))) - `(ac-selection-face ((,class (:weight bold :foreground "white" :background "orange")))) ; TEMP For diff'ing AC from Comp. - `(ac-candidate-face ((,class ,completion-other-candidates))) - `(ac-completion-face ((,class ,completion-inline))) - `(ac-candidate-mouse-face ((,class (:inherit highlight)))) - `(popup-scroll-bar-background-face ((,class (:background "#EBF4FE")))) - `(popup-scroll-bar-foreground-face ((,class (:background "#D1DAE4")))) ; Scrollbar (visible). - - `(company-tooltip-common-selection ((,class (:weight normal :foreground "#F9ECCC" :inherit company-tooltip-selection)))) ; Prefix + common part in tooltip (for selection). - `(company-tooltip-selection ((,class ,completion-selected-candidate))) ; Suffix in tooltip (for selection). - `(company-tooltip-annotation-selection ((,class (:weight normal :foreground "#F9ECCC")))) ; Annotation (for selection). - - `(company-tooltip-common ((,class (:weight normal :foreground "#B000B0" :inherit company-tooltip)))) ; Prefix + common part in tooltip. - `(company-tooltip ((,class ,completion-other-candidates))) ; Suffix in tooltip. - `(company-tooltip-annotation ((,class (:weight normal :foreground "#2415FF")))) ; Annotation. - - `(company-preview-common ((,class ,completion-inline))) - - `(company-scrollbar-bg ((,class (:background "#EBF4FE")))) - `(company-scrollbar-fg ((,class (:background "#D1DAE4")))) ; Scrollbar (visible). - - `(compare-windows ((,class (:background "#FFFF00")))) - ;; `(completions-common-part ((,class (:foreground "red" :weight bold)))) - ;; `(completions-first-difference ((,class (:foreground "green" :weight bold)))) - `(compilation-error ((,class (:weight bold :foreground "red")))) ; Used for grep error messages. - `(compilation-info ((,class ,grep-file-name))) - `(compilation-line-number ((,class ,grep-line-number))) - `(compilation-warning ((,class (:weight bold :foreground "orange")))) - `(compilation-mode-line-exit ((,class (:weight bold :foreground "green")))) ; :exit[matched] - `(compilation-mode-line-fail ((,class (:weight bold :foreground "violet")))) ; :exit[no match] - `(compilation-mode-line-run ((,class (:weight bold :foreground "orange")))) ; :run - `(css-property ((,class (:foreground "#00AA00")))) - `(css-selector ((,class (:weight bold :foreground "blue")))) - `(custom-button ((,class (:box (:line-width 2 :style released-button) :foreground "black" :background "lightgrey")))) - `(custom-button-mouse ((,class (:box (:line-width 2 :style released-button) :foreground "black" :background "grey90")))) - `(custom-button-pressed ((,class (:box (:line-width 2 :style pressed-button) :foreground "black" :background "light grey")))) - `(custom-button-pressed-unraised ((,class (:underline t :foreground "magenta4")))) - `(custom-button-unraised ((,class (:underline t)))) - `(custom-changed ((,class (:foreground "white" :background "blue")))) - `(custom-comment ((,class (:background "gray85")))) - `(custom-comment-tag ((,class (:foreground "blue4")))) - `(custom-documentation ((,class (nil)))) - `(custom-face-tag ((,class (:family "Sans Serif" :height 1.2 :weight bold)))) - `(custom-group-tag ((,class (:height 1.2 :weight bold :foreground "blue1")))) - `(custom-group-tag-1 ((,class (:family "Sans Serif" :height 1.2 :weight bold :foreground "red1")))) - `(custom-invalid ((,class (:foreground "yellow" :background "red")))) - `(custom-link ((,class (:underline t :foreground "blue1")))) - `(custom-modified ((,class (:foreground "white" :background "blue")))) - `(custom-rogue ((,class (:foreground "pink" :background "black")))) - `(custom-saved ((,class (:underline t)))) - `(custom-set ((,class (:foreground "blue" :background "white")))) - `(custom-state ((,class (:foreground "green4")))) - `(custom-themed ((,class (:foreground "white" :background "blue1")))) - `(custom-variable-button ((,class (:weight bold :underline t)))) - `(custom-variable-tag ((,class (:family "Sans Serif" :height 1.2 :weight bold :foreground "blue1")))) - `(custom-visibility ((,class ,link))) - `(diff-hl-change ((,class (:foreground "blue3" :background "#DBEDFF")))) - `(diff-hl-delete ((,class (:foreground "red3" :background "#FFDCE0")))) - `(diff-hl-dired-change ((,class (:weight bold :foreground "black" :background "#FFA335")))) - `(diff-hl-dired-delete ((,class (:weight bold :foreground "#D73915")))) - `(diff-hl-dired-ignored ((,class (:weight bold :foreground "white" :background "#C0BBAB")))) - `(diff-hl-dired-insert ((,class (:weight bold :foreground "#B9B9BA")))) - `(diff-hl-dired-unknown ((,class (:foreground "white" :background "#3F3BB4")))) - `(diff-hl-insert ((,class (:foreground "green4" :background "#CDFFD8")))) - `(diff-hl-unknown ((,class (:foreground "white" :background "#3F3BB4")))) - `(diary-face ((,class (:foreground "#87C9FC")))) - `(dircolors-face-asm ((,class (:foreground "black")))) - `(dircolors-face-backup ((,class (:foreground "black")))) - `(dircolors-face-compress ((,class (:foreground "red")))) - `(dircolors-face-dir ((,class ,directory))) - `(dircolors-face-doc ((,class (:foreground "black")))) - `(dircolors-face-dos ((,class (:foreground "ForestGreen")))) - `(dircolors-face-emacs ((,class (:foreground "black")))) - `(dircolors-face-exec ((,class (:foreground "ForestGreen")))) - `(dircolors-face-html ((,class (:foreground "black")))) - `(dircolors-face-img ((,class (:foreground "magenta3")))) - `(dircolors-face-lang ((,class (:foreground "black")))) - `(dircolors-face-lang-interface ((,class (:foreground "black")))) - `(dircolors-face-make ((,class (:foreground "black")))) - `(dircolors-face-objet ((,class (:foreground "black")))) - `(dircolors-face-package ((,class (:foreground "black")))) - `(dircolors-face-paddb ((,class (:foreground "black")))) - `(dircolors-face-ps ((,class (:foreground "black")))) - `(dircolors-face-sound ((,class (:foreground "DeepSkyBlue")))) - `(dircolors-face-tar ((,class (:foreground "red")))) - `(dircolors-face-text ((,class (:foreground "black")))) - `(dircolors-face-yacc ((,class (:foreground "black")))) - `(dired-directory ((,class ,directory))) - `(dired-header ((,class ,directory))) - `(dired-ignored ((,class (:strike-through t :foreground "red")))) - `(dired-mark ((,class ,marked-line))) - `(dired-marked ((,class ,marked-line))) - `(dired-symlink ((,class ,symlink))) - `(diredp-compressed-file-suffix ((,class (:foreground "red")))) - `(diredp-date-time ((,class (:foreground "purple")))) - `(diredp-dir-heading ((,class ,directory))) - `(diredp-dir-name ((,class ,directory))) - `(diredp-dir-priv ((,class ,directory))) - `(diredp-exec-priv ((,class (:background "#03C03C")))) - `(diredp-executable-tag ((,class (:foreground "ForestGreen" :background "white")))) - `(diredp-file-name ((,class ,file))) - `(diredp-file-suffix ((,class (:foreground "#C0C0C0")))) - `(diredp-flag-mark-line ((,class ,marked-line))) - `(diredp-ignored-file-name ((,class ,shadow))) - `(diredp-read-priv ((,class (:background "#0A99FF")))) - `(diredp-write-priv ((,class (:foreground "white" :background "#FF4040")))) - `(eldoc-highlight-function-argument ((,class (:weight bold :foreground "red" :background "#FFE4FF")))) - `(elfeed-search-filter-face ((,class (:foreground "gray")))) - ;; `(eww-form-checkbox ((,class ()))) - ;; `(eww-form-select ((,class ()))) - ;; `(eww-form-submit ((,class ()))) - `(eww-form-text ((,class (:weight bold :foreground "#40586F" :background "#A7CDF1")))) - ;; `(eww-form-textarea ((,class ()))) - `(file-name-shadow ((,class ,shadow))) - `(flycheck-error ((,class (:underline (:color "#FE251E" :style wave) :weight bold :background "#FFE1E1")))) - `(flycheck-error-list-line-number ((,class (:foreground "#A535AE")))) - `(flycheck-fringe-error ((,class (:foreground "#FE251E")))) - `(flycheck-fringe-info ((,class (:foreground "#158A15")))) - `(flycheck-fringe-warning ((,class (:foreground "#F4A939")))) - `(flycheck-info ((,class (:underline (:color "#158A15" :style wave) :weight bold)))) - `(flycheck-warning ((,class (:underline (:color "#F4A939" :style wave) :weight bold :background "#FFFFBE")))) - `(font-latex-bold-face ((,class (:weight bold :foreground "black")))) - `(fancy-narrow-blocked-face ((,class (:foreground "#9998A4")))) - `(flycheck-color-mode-line-error-face ((, class (:background "#CF5B56")))) - `(flycheck-color-mode-line-warning-face ((, class (:background "#EBC700")))) - `(flycheck-color-mode-line-info-face ((, class (:background "yellow")))) - `(font-latex-italic-face ((,class (:slant italic :foreground "#1A1A1A")))) - `(font-latex-math-face ((,class (:foreground "blue")))) - `(font-latex-sectioning-1-face ((,class (:family "Sans Serif" :height 2.7 :weight bold :foreground "cornflower blue")))) - `(font-latex-sectioning-2-face ((,class ,ol1))) - `(font-latex-sectioning-3-face ((,class ,ol2))) - `(font-latex-sectioning-4-face ((,class ,ol3))) - `(font-latex-sectioning-5-face ((,class ,ol4))) - `(font-latex-sedate-face ((,class (:foreground "#FF5500")))) - `(font-latex-string-face ((,class (:weight bold :foreground "#0066FF")))) - `(font-latex-verbatim-face ((,class (:foreground "#000088" :background "#FFFFE0" :inherit nil)))) - `(git-commit-summary-face ((,class (:foreground "#000000")))) - `(git-commit-comment-face ((,class (:slant italic :foreground "#696969")))) - `(git-timemachine-commit ((,class ,diff-removed))) - `(git-timemachine-minibuffer-author-face ((,class ,diff-added))) - `(git-timemachine-minibuffer-detail-face ((,class ,diff-header))) - `(google-translate-text-face ((,class (:foreground "#777777" :background "#F5F5F5")))) - `(google-translate-phonetic-face ((,class (:inherit shadow)))) - `(google-translate-translation-face ((,class (:weight normal :foreground "#3079ED" :background "#E3EAF2")))) - `(google-translate-suggestion-label-face ((,class (:foreground "red")))) - `(google-translate-suggestion-face ((,class (:slant italic :underline t)))) - `(google-translate-listen-button-face ((,class (:height 0.8)))) - `(helm-action ((,class (:foreground "black")))) - `(helm-bookmark-file ((,class ,file))) - `(helm-bookmarks-su-face ((,class (:foreground "red")))) - `(helm-buffer-directory ((,class ,directory))) - ;; `(helm-non-file-buffer ((,class (:slant italic :foreground "blue")))) - ;; `(helm-buffer-file ((,class (:foreground "#333333")))) - `(helm-buffer-modified ((,class (:slant italic :foreground "#BA36A5")))) - `(helm-buffer-process ((,class (:foreground "#008200")))) - `(helm-candidate-number ((,class (:foreground "black" :background "#FFFF66")))) - `(helm-dir-heading ((,class (:foreground "blue" :background "pink")))) - `(helm-dir-priv ((,class (:foreground "dark red" :background "light grey")))) - `(helm-ff-directory ((,class ,directory))) - `(helm-ff-dotted-directory ((,class ,directory))) - `(helm-ff-executable ((,class (:foreground "green3" :background "white")))) - `(helm-ff-file ((,class (:foreground "black")))) - `(helm-ff-invalid-symlink ((,class (:foreground "yellow" :background "red")))) - `(helm-ff-symlink ((,class ,symlink))) - `(helm-file-name ((,class (:foreground "blue")))) - `(helm-gentoo-match-face ((,class (:foreground "red")))) - `(helm-grep-file ((,class ,grep-file-name))) - `(helm-grep-lineno ((,class ,grep-line-number))) - `(helm-grep-match ((,class ,match))) - `(helm-grep-running ((,class (:weight bold :foreground "white")))) - `(helm-isearch-match ((,class (:background "#CCFFCC")))) - `(helm-lisp-show-completion ((,class ,volatile-highlight-supersize))) ; See `helm-dabbrev'. - ;; `(helm-ls-git-added-copied-face ((,class (:foreground "")))) - ;; `(helm-ls-git-added-modified-face ((,class (:foreground "")))) - ;; `(helm-ls-git-conflict-face ((,class (:foreground "")))) - ;; `(helm-ls-git-deleted-and-staged-face ((,class (:foreground "")))) - ;; `(helm-ls-git-deleted-not-staged-face ((,class (:foreground "")))) - ;; `(helm-ls-git-modified-and-staged-face ((,class (:foreground "")))) - `(helm-ls-git-modified-not-staged-face ((,class (:foreground "#BA36A5")))) - ;; `(helm-ls-git-renamed-modified-face ((,class (:foreground "")))) - ;; `(helm-ls-git-untracked-face ((,class (:foreground "")))) - `(helm-match ((,class ,match))) - `(helm-moccur-buffer ((,class (:foreground "#0066CC")))) - `(helm-selection ((,class (:background "#3875D6" :foreground "white")))) - `(helm-selection-line ((,class ,highlight-gray))) ; ??? - `(helm-separator ((,class (:foreground "red")))) - `(helm-source-header ((,class (:weight bold :box (:line-width 1 :color "#C7C7C7") :background "#DEDEDE" :foreground "black")))) - `(helm-swoop-target-line-block-face ((,class (:background "#CCCC00" :foreground "#222222")))) - `(helm-swoop-target-line-face ((,class (:background "#CCCCFF")))) - `(helm-swoop-target-word-face ((,class (:weight bold :foreground nil :background "#FDBD33")))) - `(helm-visible-mark ((,class ,marked-line))) - `(helm-w3m-bookmarks-face ((,class (:underline t :foreground "cyan1")))) - `(highlight-changes ((,class (:foreground nil)))) ;; blue "#2E08B5" - `(highlight-changes-delete ((,class (:strike-through nil :foreground nil)))) ;; red "#B5082E" - `(highlight-symbol-face ((,class (:background "#FFFFA0")))) - `(hl-line ((,class ,highlight-yellow))) ; Highlight current line. - `(hl-tags-face ((,class ,highlight-current-tag))) ; ~ Pair highlighting (matching tags). - `(holiday-face ((,class (:foreground "#777777" :background "#E4EBFE")))) - `(html-helper-bold-face ((,class (:weight bold :foreground "black")))) - `(html-helper-italic-face ((,class (:slant italic :foreground "black")))) - `(html-helper-underline-face ((,class (:underline t :foreground "black")))) - `(html-tag-face ((,class (:foreground "blue")))) - `(ilog-non-change-face ((,class (:height 2.0 :foreground "#6434A3")))) - `(ilog-change-face ((,class (:height 2.0 :foreground "#008200")))) - `(ilog-echo-face ((,class (:height 2.0 :foreground "#006FE0")))) - `(ilog-load-face ((,class (:foreground "#BA36A5")))) - `(ilog-message-face ((,class (:foreground "#808080")))) - `(indent-guide-face ((,class (:foreground "#D3D3D3")))) - `(info-file ((,class (:family "Sans Serif" :height 1.8 :weight bold :box (:line-width 1 :color "#0000CC") :foreground "cornflower blue" :background "LightSteelBlue1")))) - `(info-header-node ((,class (:underline t :foreground "orange")))) ; nodes in header - `(info-header-xref ((,class (:underline t :foreground "dodger blue")))) ; cross references in header - `(info-index-match ((,class (:weight bold :foreground nil :background "#FDBD33")))) ; when using `i' - `(info-menu-header ((,class ,ol2))) ; menu titles (headers) -- major topics - `(info-menu-star ((,class (:foreground "black")))) ; every 3rd menu item - `(info-node ((,class (:underline t :foreground "blue")))) ; node names - `(info-quoted-name ((,class ,code-inline))) - `(info-string ((,class ,string))) - `(info-title-1 ((,class ,ol1))) - `(info-xref ((,class (:underline t :foreground "#006DAF")))) ; unvisited cross-references - `(info-xref-visited ((,class (:underline t :foreground "magenta4")))) ; previously visited cross-references - ;; js2-highlight-vars-face (~ auto-highlight-symbol) - `(js2-error ((,class (:box (:line-width 1 :color "#FF3737") :background "#FFC8C8")))) ; DONE. - `(js2-external-variable ((,class (:foreground "#FF0000" :background "#FFF8F8")))) ; DONE. - `(js2-function-param ((,class ,function-param))) - `(js2-instance-member ((,class (:foreground "DarkOrchid")))) - `(js2-jsdoc-html-tag-delimiter ((,class (:foreground "#D0372D")))) - `(js2-jsdoc-html-tag-name ((,class (:foreground "#D0372D")))) - `(js2-jsdoc-tag ((,class (:weight normal :foreground "#6434A3")))) - `(js2-jsdoc-type ((,class (:foreground "SteelBlue")))) - `(js2-jsdoc-value ((,class (:weight normal :foreground "#BA36A5")))) ; #800080 - `(js2-magic-paren ((,class (:underline t)))) - `(js2-private-function-call ((,class (:foreground "goldenrod")))) - `(js2-private-member ((,class (:foreground "PeachPuff3")))) - `(js2-warning ((,class (:underline "orange")))) - - ;; Org non-standard faces. - `(leuven-org-deadline-overdue ((,class (:foreground "#F22659")))) - `(leuven-org-deadline-today ((,class (:weight bold :foreground "#4F4A3D" :background "#FFFFCC")))) - `(leuven-org-deadline-tomorrow ((,class (:foreground "#40A80B")))) - `(leuven-org-deadline-future ((,class (:foreground "#40A80B")))) - `(leuven-gnus-unseen ((,class (:weight bold :foreground "#FC7202")))) - `(leuven-gnus-date ((,class (:foreground "#FF80BF")))) - `(leuven-gnus-size ((,class (:foreground "#8FBF60")))) - `(leuven-todo-items-face ((,class (:weight bold :foreground "#FF3125" :background "#FFFF88")))) - - `(light-symbol-face ((,class (:background "#FFFFA0")))) - `(linum ((,class (:foreground "#9A9A9A" :background "#EDEDED")))) - `(log-view-file ((,class (:foreground "#0000CC" :background "#EAF2F5")))) - `(log-view-message ((,class (:foreground "black" :background "#EDEA74")))) - `(lui-button-face ((,class ,link))) - `(lui-highlight-face ((,class (:box '(:line-width 1 :color "#CC0000") :foreground "#CC0000" :background "#FFFF88")))) ; my nickname - `(lui-time-stamp-face ((,class (:foreground "purple")))) - `(magit-blame-header ((,class (:inherit magit-diff-file-header)))) - `(magit-blame-heading ((,class (:overline "#A7A7A7" :foreground "red" :background "#E6E6E6")))) - `(magit-blame-hash ((,class (:overline "#A7A7A7" :foreground "red" :background "#E6E6E6")))) - `(magit-blame-name ((,class (:overline "#A7A7A7" :foreground "#036A07" :background "#E6E6E6")))) - `(magit-blame-date ((,class (:overline "#A7A7A7" :foreground "blue" :background "#E6E6E6")))) - `(magit-blame-summary ((,class (:overline "#A7A7A7" :weight bold :foreground "#707070" :background "#E6E6E6")))) - `(magit-branch ((,class ,vc-branch))) - `(magit-diff-add ((,class ,diff-added))) - `(magit-diff-del ((,class ,diff-removed))) - `(magit-diff-file-header ((,class (:height 1.1 :weight bold :foreground "#4183C4")))) - `(magit-diff-hunk-header ((,class ,diff-hunk-header))) - `(magit-diff-none ((,class ,diff-none))) - `(magit-header ((,class (:foreground "white" :background "#FF4040")))) - `(magit-item-highlight ((,class (:background "#EAF2F5")))) - `(magit-item-mark ((,class ,marked-line))) - `(magit-log-head-label ((,class (:box (:line-width 1 :color "blue" :style nil))))) - `(magit-log-tag-label ((,class (:box (:line-width 1 :color "#00CC00" :style nil))))) - `(magit-section-title ((,class (:family "Sans Serif" :height 1.8 :weight bold :foreground "cornflower blue" :inherit nil)))) - `(makefile-space-face ((,class (:background "hot pink")))) - `(makefile-targets ((,class (:weight bold :foreground "blue")))) - ;; `(markdown-blockquote-face ((,class ()))) - `(markdown-bold-face ((,class (:inherit bold)))) - ;; `(markdown-comment-face ((,class ()))) - ;; `(markdown-footnote-face ((,class ()))) - ;; `(markdown-header-delimiter-face ((,class ()))) - ;; `(markdown-header-face ((,class ()))) - `(markdown-header-face-1 ((,class ,ol1))) - `(markdown-header-face-2 ((,class ,ol2))) - `(markdown-header-face-3 ((,class ,ol3))) - `(markdown-header-face-4 ((,class ,ol4))) - `(markdown-header-face-5 ((,class ,ol5))) - `(markdown-header-face-6 ((,class ,ol6))) - ;; `(markdown-header-rule-face ((,class ()))) - `(markdown-inline-code-face ((,class ,code-inline))) - `(markdown-italic-face ((,class (:inherit italic)))) - `(markdown-language-keyword-face ((,class (:inherit org-block-begin-line)))) - ;; `(markdown-line-break-face ((,class ()))) - `(markdown-link-face ((,class ,link-no-underline))) - ;; `(markdown-link-title-face ((,class ()))) - ;; `(markdown-list-face ((,class ()))) - ;; `(markdown-math-face ((,class ()))) - ;; `(markdown-metadata-key-face ((,class ()))) - ;; `(markdown-metadata-value-face ((,class ()))) - ;; `(markdown-missing-link-face ((,class ()))) - `(markdown-pre-face ((,class (:inherit org-block-background)))) - ;; `(markdown-reference-face ((,class ()))) - ;; `(markdown-strike-through-face ((,class ()))) - `(markdown-url-face ((,class ,link))) - `(match ((,class ,match))) ; Used for grep matches. - `(mc/cursor-bar-face ((,class (:height 1.0 :foreground "#1664C4" :background "#1664C4")))) - `(mc/cursor-face ((,class (:inverse-video t)))) - `(mc/region-face ((,class (:inherit region)))) - `(mm-uu-extract ((,class ,code-block))) - `(moccur-current-line-face ((,class (:foreground "black" :background "#FFFFCC")))) - `(moccur-face ((,class (:foreground "black" :background "#FFFF99")))) - `(next-error ((,class ,volatile-highlight-supersize))) - `(nobreak-space ((,class (:background "#CCE8F6")))) - `(nxml-attribute-local-name-face ((,class ,xml-attribute))) - `(nxml-attribute-value-delimiter-face ((,class (:foreground "green4")))) - `(nxml-attribute-value-face ((,class (:foreground "green4")))) - `(nxml-comment-content-face ((,class (:slant italic :foreground "red")))) - `(nxml-comment-delimiter-face ((,class (:foreground "red")))) - `(nxml-element-local-name ((,class ,xml-tag))) - `(nxml-element-local-name-face ((,class (:foreground "blue")))) - `(nxml-processing-instruction-target-face ((,class (:foreground "purple1")))) - `(nxml-tag-delimiter-face ((,class (:foreground "blue")))) - `(nxml-tag-slash-face ((,class (:foreground "blue")))) - `(org-agenda-block-count ((,class (:weight bold :foreground "#A5A5A5")))) - `(org-agenda-calendar-event ((,class (:weight bold :foreground "#3774CC" :background "#E4EBFE")))) - `(org-agenda-calendar-sexp ((,class (:foreground "#327ACD" :background "#F3F7FC")))) - `(org-agenda-clocking ((,class (:foreground "black" :background "#EEC900")))) - `(org-agenda-column-dateline ((,class ,column))) - `(org-agenda-current-time ((,class (:underline t :foreground "#1662AF")))) - `(org-agenda-date ((,class (,@(leuven-scale-font leuven-scale-org-agenda-structure 1.6) :weight bold :foreground "#1662AF")))) - `(org-agenda-date-today ((,class (,@(leuven-scale-font leuven-scale-org-agenda-structure 1.6) :weight bold :foreground "#4F4A3D" :background "#FFFFCC")))) - `(org-agenda-date-weekend ((,class (,@(leuven-scale-font leuven-scale-org-agenda-structure 1.6) :weight bold :foreground "#4E4E4E")))) - `(org-agenda-diary ((,class (:weight bold :foreground "green4" :background "light blue")))) - `(org-agenda-dimmed-todo-face ((,class (:foreground "gold2")))) - `(org-agenda-done ((,class (:foreground "#555555")))) - `(org-agenda-filter-category ((,class (:weight bold :foreground "orange")))) - `(org-agenda-filter-effort ((,class (:weight bold :foreground "orange")))) - `(org-agenda-filter-regexp ((,class (:weight bold :foreground "orange")))) - `(org-agenda-filter-tags ((,class (:weight bold :foreground "orange")))) - `(org-agenda-restriction-lock ((,class (:background "#E77D63")))) - `(org-agenda-structure ((,class (,@(leuven-scale-font leuven-scale-org-agenda-structure 1.6) :weight bold :foreground "#1F8DD6")))) - `(org-archived ((,class (:foreground "gray70")))) - `(org-beamer-tag ((,class (:box (:line-width 1 :color "#FABC18") :foreground "#2C2C2C" :background "#FFF8D0")))) - `(org-block ((,class ,code-block))) - `(org-block-background ((,class (:background "#FFFFE0" :extend t)))) ;; :inherit fixed-pitch)))) - `(org-block-begin-line ((,class (:underline "#A7A6AA" :foreground "#555555" :background "#E2E1D5" :extend t)))) - `(org-block-end-line ((,class (:overline "#A7A6AA" :foreground "#555555" :background "#E2E1D5" :extend t)))) - `(org-checkbox ((,class (:weight bold :box (:line-width 1 :style pressed-button) :foreground "#123555" :background "#A3A3A3")))) - `(org-clock-overlay ((,class (:foreground "white" :background "SkyBlue4")))) - `(org-code ((,class ,code-inline))) - `(org-column ((,class ,column))) - `(org-column-title ((,class ,column))) - `(org-date ((,class (:underline t :foreground "#00459E")))) - `(org-default ((,class (:foreground "#333333" :background "#FFFFFF")))) - `(org-dim ((,class (:foreground "#AAAAAA")))) - `(org-document-info ((,class (:foreground "#484848")))) - `(org-document-info-keyword ((,class (:foreground "#008ED1" :background "#EAEAFF")))) - `(org-document-title ((,class (:height 1.8 :weight bold :foreground "black")))) - `(org-done ((,class (:weight bold :box (:line-width 1 :color "#BBBBBB") :foreground "#BBBBBB" :background "#F0F0F0")))) - `(org-drawer ((,class (:weight bold :foreground "#00BB00" :background "#EAFFEA" :extend nil)))) - `(org-ellipsis ((,class (:underline nil :foreground "#999999")))) ; #FFEE62 - `(org-example ((,class (:foreground "blue" :background "#EAFFEA")))) - `(org-footnote ((,class (:underline t :foreground "#008ED1")))) - `(org-formula ((,class (:foreground "chocolate1")))) - `(org-headline-done ((,class (:height 1.0 :weight normal :foreground "#ADADAD")))) - `(org-hide ((,class (:foreground "#E2E2E2")))) - `(org-inlinetask ((,class (:box (:line-width 1 :color "#EBEBEB") :foreground "#777777" :background "#FFFFD6")))) - `(org-latex-and-related ((,class (:foreground "#336699" :background "white")))) - `(org-level-1 ((,class ,ol1))) - `(org-level-2 ((,class ,ol2))) - `(org-level-3 ((,class ,ol3))) - `(org-level-4 ((,class ,ol4))) - `(org-level-5 ((,class ,ol5))) - `(org-level-6 ((,class ,ol6))) - `(org-level-7 ((,class ,ol7))) - `(org-level-8 ((,class ,ol8))) - `(org-link ((,class ,link))) - `(org-list-dt ((,class (:weight bold :foreground "#335EA8")))) - `(org-macro ((,class (:weight bold :foreground "#EDB802")))) - `(org-meta-line ((,class (:slant normal :foreground "#008ED1" :background "#EAEAFF")))) - `(org-mode-line-clock ((,class (:box (:line-width 1 :color "#335EA8") :foreground "black" :background "#FFA335")))) - `(org-mode-line-clock-overrun ((,class (:weight bold :box (:line-width 1 :color "#335EA8") :foreground "white" :background "#FF4040")))) - `(org-number-of-items ((,class (:weight bold :foreground "white" :background "#79BA79")))) - `(org-property-value ((,class (:foreground "#00A000")))) - `(org-quote ((,class (:slant italic :foreground "dim gray" :background "#FFFFE0")))) - `(org-scheduled ((,class (:foreground "#333333")))) - `(org-scheduled-previously ((,class (:foreground "#1466C6")))) - `(org-scheduled-today ((,class (:weight bold :foreground "#4F4A3D" :background "#FFFFCC")))) - `(org-sexp-date ((,class (:foreground "#3774CC")))) - `(org-special-keyword ((,class (:weight bold :foreground "#00BB00" :background "#EAFFEA")))) - `(org-table ((,class (:foreground "dark green" :background "#EAFFEA")))) ;; :inherit fixed-pitch)))) - `(org-tag ((,class (:weight normal :slant italic :foreground "#9A9FA4" :background "white")))) - `(org-target ((,class (:foreground "#FF6DAF")))) - `(org-time-grid ((,class (:foreground "#CFCFCF")))) - `(org-todo ((,class (:weight bold :box (:line-width 1 :color "#D8ABA7") :foreground "#D8ABA7" :background "#FFE6E4")))) - `(org-upcoming-deadline ((,class (:foreground "#FF5555")))) - `(org-verbatim ((,class (:foreground "#0066CC" :background "#F7FDFF")))) - `(org-verse ((,class (:slant italic :foreground "dim gray" :background "#EEEEEE")))) - `(org-warning ((,class (:weight bold :foreground "black" :background "#CCE7FF")))) - `(outline-1 ((,class ,ol1))) - `(outline-2 ((,class ,ol2))) - `(outline-3 ((,class ,ol3))) - `(outline-4 ((,class ,ol4))) - `(outline-5 ((,class ,ol5))) - `(outline-6 ((,class ,ol6))) - `(outline-7 ((,class ,ol7))) - `(outline-8 ((,class ,ol8))) - `(pabbrev-debug-display-label-face ((,class (:foreground "white" :background "#A62154")))) - `(pabbrev-suggestions-face ((,class (:weight bold :foreground "white" :background "red")))) - `(pabbrev-suggestions-label-face ((,class (:weight bold :foreground "white" :background "purple")))) - `(paren-face-match ((,class ,paren-matched))) - `(paren-face-mismatch ((,class ,paren-unmatched))) - `(paren-face-no-match ((,class ,paren-unmatched))) - `(persp-selected-face ((,class (:weight bold :foreground "#EEF5FE")))) - `(powerline-active1 ((,class (:foreground "#85CEEB" :background "#383838" :inherit mode-line)))) - `(powerline-active2 ((,class (:foreground "#85CEEB" :background "#4070B6" :inherit mode-line)))) - `(powerline-inactive1 ((,class (:foreground "#F0F0EF" :background "#686868" :inherit mode-line-inactive)))) - `(powerline-inactive2 ((,class (:foreground "#F0F0EF" :background "#A9A9A9" :inherit mode-line-inactive)))) - `(rainbow-delimiters-depth-1-face ((,class (:foreground "#707183")))) - `(rainbow-delimiters-depth-2-face ((,class (:foreground "#7388D6")))) - `(rainbow-delimiters-depth-3-face ((,class (:foreground "#909183")))) - `(rainbow-delimiters-depth-4-face ((,class (:foreground "#709870")))) - `(rainbow-delimiters-depth-5-face ((,class (:foreground "#907373")))) - `(rainbow-delimiters-depth-6-face ((,class (:foreground "#6276BA")))) - `(rainbow-delimiters-depth-7-face ((,class (:foreground "#858580")))) - `(rainbow-delimiters-depth-8-face ((,class (:foreground "#80A880")))) - `(rainbow-delimiters-depth-9-face ((,class (:foreground "#887070")))) - `(rainbow-delimiters-mismatched-face ((,class ,paren-unmatched))) - `(rainbow-delimiters-unmatched-face ((,class ,paren-unmatched))) - `(recover-this-file ((,class (:weight bold :background "#FF3F3F")))) - `(rng-error ((,class (:weight bold :foreground "red" :background "#FBE3E4")))) - `(sh-heredoc ((,class (:foreground "blue" :background "#EEF5FE")))) - `(sh-quoted-exec ((,class (:foreground "#FF1493")))) - `(shadow ((,class ,shadow))) ; Used for grep context lines. - `(shell-option-face ((,class (:foreground "forest green")))) - `(shell-output-2-face ((,class (:foreground "blue")))) - `(shell-output-3-face ((,class (:foreground "purple")))) - `(shell-output-face ((,class (:foreground "black")))) - ;; `(shell-prompt-face ((,class (:weight bold :foreground "yellow")))) - `(shm-current-face ((,class (:background "#EEE8D5")))) - `(shm-quarantine-face ((,class (:background "lemonchiffon")))) - `(show-paren-match ((,class ,paren-matched))) - `(show-paren-mismatch ((,class ,paren-unmatched))) - `(sml-modeline-end-face ((,class (:background "#6BADF6")))) ; #335EA8 - `(sml-modeline-vis-face ((,class (:background "#1979CA")))) - `(term ((,class (:foreground "#333333" :background "#FFFFFF")))) - - ;; `(sp-pair-overlay-face ((,class ()))) - ;; `(sp-show-pair-enclosing ((,class ()))) - ;; `(sp-show-pair-match-face ((,class ()))) ; ~ Pair highlighting (matching tags). - ;; `(sp-show-pair-mismatch-face ((,class ()))) - ;; `(sp-wrap-overlay-closing-pair ((,class ()))) - ;; `(sp-wrap-overlay-face ((,class ()))) - ;; `(sp-wrap-overlay-opening-pair ((,class ()))) - ;; `(sp-wrap-tag-overlay-face ((,class ()))) - - `(speedbar-button-face ((,class (:foreground "green4")))) - `(speedbar-directory-face ((,class (:foreground "blue4")))) - `(speedbar-file-face ((,class (:foreground "cyan4")))) - `(speedbar-highlight-face ((,class ,volatile-highlight))) - `(speedbar-selected-face ((,class (:underline t :foreground "red")))) - `(speedbar-tag-face ((,class (:foreground "brown")))) - `(svn-status-directory-face ((,class ,directory))) - `(svn-status-filename-face ((,class (:weight bold :foreground "#4183C4")))) - `(svn-status-locked-face ((,class (:weight bold :foreground "red")))) - `(svn-status-marked-face ((,class ,marked-line))) - `(svn-status-marked-popup-face ((,class (:weight bold :foreground "green3")))) - `(svn-status-switched-face ((,class (:slant italic :foreground "gray55")))) - `(svn-status-symlink-face ((,class ,symlink))) - `(svn-status-update-available-face ((,class (:foreground "orange")))) - `(tex-verbatim ((,class (:foreground "blue")))) - `(tool-bar ((,class (:box (:line-width 1 :style released-button) :foreground "black" :background "gray75")))) - `(tooltip ((,class (:foreground "black" :background "light yellow")))) - `(traverse-match-face ((,class (:weight bold :foreground "blue violet")))) - `(vc-annotate-face-3F3FFF ((,class (:foreground "#3F3FFF" :background "black")))) - `(vc-annotate-face-3F6CFF ((,class (:foreground "#3F3FFF" :background "black")))) - `(vc-annotate-face-3F99FF ((,class (:foreground "#3F99FF" :background "black")))) - `(vc-annotate-face-3FC6FF ((,class (:foreground "#3F99FF" :background "black")))) - `(vc-annotate-face-3FF3FF ((,class (:foreground "#3FF3FF" :background "black")))) - `(vc-annotate-face-3FFF56 ((,class (:foreground "#4BFF4B" :background "black")))) - `(vc-annotate-face-3FFF83 ((,class (:foreground "#3FFFB0" :background "black")))) - `(vc-annotate-face-3FFFB0 ((,class (:foreground "#3FFFB0" :background "black")))) - `(vc-annotate-face-3FFFDD ((,class (:foreground "#3FF3FF" :background "black")))) - `(vc-annotate-face-56FF3F ((,class (:foreground "#4BFF4B" :background "black")))) - `(vc-annotate-face-83FF3F ((,class (:foreground "#B0FF3F" :background "black")))) - `(vc-annotate-face-B0FF3F ((,class (:foreground "#B0FF3F" :background "black")))) - `(vc-annotate-face-DDFF3F ((,class (:foreground "#FFF33F" :background "black")))) - `(vc-annotate-face-F6FFCC ((,class (:foreground "black" :background "#FFFFC0")))) - `(vc-annotate-face-FF3F3F ((,class (:foreground "#FF3F3F" :background "black")))) - `(vc-annotate-face-FF6C3F ((,class (:foreground "#FF3F3F" :background "black")))) - `(vc-annotate-face-FF993F ((,class (:foreground "#FF993F" :background "black")))) - `(vc-annotate-face-FFC63F ((,class (:foreground "#FF993F" :background "black")))) - `(vc-annotate-face-FFF33F ((,class (:foreground "#FFF33F" :background "black")))) - - ;; ;; vc - ;; (vc-up-to-date-state ((,c :foreground ,(gc 'green-1)))) - ;; (vc-edited-state ((,c :foreground ,(gc 'yellow+1)))) - ;; (vc-missing-state ((,c :foreground ,(gc 'red)))) - ;; (vc-conflict-state ((,c :foreground ,(gc 'red+2) :weight bold))) - ;; (vc-locked-state ((,c :foreground ,(gc 'cyan-1)))) - ;; (vc-locally-added-state ((,c :foreground ,(gc 'blue)))) - ;; (vc-needs-update-state ((,c :foreground ,(gc 'magenta)))) - ;; (vc-removed-state ((,c :foreground ,(gc 'red-1)))) - - `(vhl/default-face ((,class ,volatile-highlight))) ; `volatile-highlights.el' (for undo, yank). - `(w3m-anchor ((,class ,link))) - `(w3m-arrived-anchor ((,class (:foreground "purple1")))) - `(w3m-bitmap-image-face ((,class (:foreground "gray4" :background "green")))) - `(w3m-bold ((,class (:weight bold :foreground "black")))) - `(w3m-current-anchor ((,class (:weight bold :underline t :foreground "blue")))) - `(w3m-form ((,class (:underline t :foreground "tan1")))) - `(w3m-form-button-face ((,class (:weight bold :underline t :foreground "gray4" :background "light grey")))) - `(w3m-form-button-mouse-face ((,class (:underline t :foreground "light grey" :background "#2B7E2A")))) - `(w3m-form-button-pressed-face ((,class (:weight bold :underline t :foreground "gray4" :background "light grey")))) - `(w3m-header-line-location-content-face ((,class (:foreground "#7F7F7F":background "#F7F7F7")))) - `(w3m-header-line-location-title-face ((,class (:foreground "#2C55B1" :background "#F7F7F7")))) - `(w3m-history-current-url-face ((,class (:foreground "lemon chiffon")))) - `(w3m-image-face ((,class (:weight bold :foreground "DarkSeaGreen2")))) - `(w3m-link-numbering ((,class (:foreground "#B4C7EB")))) ; mouseless browsing - `(w3m-strike-through-face ((,class (:strike-through t)))) - `(w3m-underline-face ((,class (:underline t)))) - - ;; `(web-mode-block-attr-name-face ((,class ()))) - ;; `(web-mode-block-attr-value-face ((,class ()))) - ;; `(web-mode-block-comment-face ((,class ()))) - ;; `(web-mode-block-control-face ((,class ()))) - ;; `(web-mode-block-delimiter-face ((,class ()))) - ;; `(web-mode-block-face ((,class ()))) - ;; `(web-mode-block-string-face ((,class ()))) - ;; `(web-mode-bold-face ((,class ()))) - ;; `(web-mode-builtin-face ((,class ()))) - ;; `(web-mode-comment-face ((,class ()))) - ;; `(web-mode-comment-keyword-face ((,class ()))) - ;; `(web-mode-constant-face ((,class ()))) - ;; `(web-mode-css-at-rule-face ((,class ()))) - ;; `(web-mode-css-color-face ((,class ()))) - ;; `(web-mode-css-comment-face ((,class ()))) - ;; `(web-mode-css-function-face ((,class ()))) - ;; `(web-mode-css-priority-face ((,class ()))) - ;; `(web-mode-css-property-name-face ((,class ()))) - ;; `(web-mode-css-pseudo-class-face ((,class ()))) - ;; `(web-mode-css-selector-face ((,class ()))) - ;; `(web-mode-css-string-face ((,class ()))) - ;; `(web-mode-css-variable-face ((,class ()))) - ;; `(web-mode-current-column-highlight-face ((,class ()))) - `(web-mode-current-element-highlight-face ((,class (:background "#99CCFF")))) ; #FFEE80 - ;; `(web-mode-doctype-face ((,class ()))) - ;; `(web-mode-error-face ((,class ()))) - ;; `(web-mode-filter-face ((,class ()))) - `(web-mode-folded-face ((,class (:box (:line-width 1 :color "#777777") :foreground "#9A9A6A" :background "#F3F349")))) - ;; `(web-mode-function-call-face ((,class ()))) - ;; `(web-mode-function-name-face ((,class ()))) - ;; `(web-mode-html-attr-custom-face ((,class ()))) - ;; `(web-mode-html-attr-engine-face ((,class ()))) - ;; `(web-mode-html-attr-equal-face ((,class ()))) - `(web-mode-html-attr-name-face ((,class ,xml-attribute))) - ;; `(web-mode-html-attr-value-face ((,class ()))) - ;; `(web-mode-html-entity-face ((,class ()))) - `(web-mode-html-tag-bracket-face ((,class ,xml-tag))) - ;; `(web-mode-html-tag-custom-face ((,class ()))) - `(web-mode-html-tag-face ((,class ,xml-tag))) - ;; `(web-mode-html-tag-namespaced-face ((,class ()))) - ;; `(web-mode-inlay-face ((,class ()))) - ;; `(web-mode-italic-face ((,class ()))) - ;; `(web-mode-javascript-comment-face ((,class ()))) - ;; `(web-mode-javascript-string-face ((,class ()))) - ;; `(web-mode-json-comment-face ((,class ()))) - ;; `(web-mode-json-context-face ((,class ()))) - ;; `(web-mode-json-key-face ((,class ()))) - ;; `(web-mode-json-string-face ((,class ()))) - ;; `(web-mode-jsx-depth-1-face ((,class ()))) - ;; `(web-mode-jsx-depth-2-face ((,class ()))) - ;; `(web-mode-jsx-depth-3-face ((,class ()))) - ;; `(web-mode-jsx-depth-4-face ((,class ()))) - ;; `(web-mode-keyword-face ((,class ()))) - ;; `(web-mode-param-name-face ((,class ()))) - ;; `(web-mode-part-comment-face ((,class ()))) - `(web-mode-part-face ((,class (:background "#FFFFE0")))) - ;; `(web-mode-part-string-face ((,class ()))) - ;; `(web-mode-preprocessor-face ((,class ()))) - `(web-mode-script-face ((,class (:background "#EFF0F1")))) - ;; `(web-mode-sql-keyword-face ((,class ()))) - ;; `(web-mode-string-face ((,class ()))) - ;; `(web-mode-style-face ((,class ()))) - ;; `(web-mode-symbol-face ((,class ()))) - ;; `(web-mode-type-face ((,class ()))) - ;; `(web-mode-underline-face ((,class ()))) - ;; `(web-mode-variable-name-face ((,class ()))) - ;; `(web-mode-warning-face ((,class ()))) - ;; `(web-mode-whitespace-face ((,class ()))) - - `(which-func ((,class (:weight bold :slant italic :foreground "white")))) - ;; `(which-key-command-description-face) - ;; `(which-key-group-description-face) - ;; `(which-key-highlighted-command-face) - ;; `(which-key-key-face) - `(which-key-local-map-description-face ((,class (:weight bold :background "#F3F7FC" :inherit which-key-command-description-face)))) - ;; `(which-key-note-face) - ;; `(which-key-separator-face) - ;; `(which-key-special-key-face) - `(widget-button ((,class ,link))) - `(widget-button-pressed ((,class (:foreground "red")))) - `(widget-documentation ((,class (:foreground "green4")))) - `(widget-field ((,class (:background "gray85")))) - `(widget-inactive ((,class (:foreground "dim gray")))) - `(widget-single-line-field ((,class (:background "gray85")))) - `(woman-bold ((,class (:weight bold :foreground "#F13D3D")))) - `(woman-italic ((,class (:weight bold :slant italic :foreground "#46BE1B")))) - `(woman-symbol ((,class (:weight bold :foreground "purple")))) - `(yas-field-debug-face ((,class (:foreground "white" :background "#A62154")))) - `(yas-field-highlight-face ((,class (:box (:line-width 1 :color "#838383") :foreground "black" :background "#D4DCD8")))) - - ;; `(ztreep-arrow-face ((,class ()))) - ;; `(ztreep-diff-header-face ((,class ()))) - ;; `(ztreep-diff-header-small-face ((,class ()))) - `(ztreep-diff-model-add-face ((,class (:weight bold :foreground "#008800")))) - `(ztreep-diff-model-diff-face ((,class (:weight bold :foreground "#0044DD")))) - `(ztreep-diff-model-ignored-face ((,class (:strike-through t :foreground "#9E9E9E")))) - `(ztreep-diff-model-normal-face ((,class (:foreground "#000000")))) - ;; `(ztreep-expand-sign-face ((,class ()))) - ;; `(ztreep-header-face ((,class ()))) - ;; `(ztreep-leaf-face ((,class ()))) - ;; `(ztreep-node-face ((,class ()))) - - )) - -(custom-theme-set-variables 'leuven - - ;; highlight-sexp-mode. - '(hl-sexp-background-color "#efebe9") - - '(ansi-color-faces-vector - [default default default italic underline success warning error]) - - ;; Colors used in Shell mode. - '(ansi-color-names-vector - ["black" "red3" "ForestGreen" "yellow3" "blue" "magenta3" "DeepSkyBlue" "gray50"]) - ) - -;;;###autoload -(when (and (boundp 'custom-theme-load-path) - load-file-name) - ;; Add theme folder to `custom-theme-load-path' when installing over MELPA. - (add-to-list 'custom-theme-load-path - (file-name-as-directory (file-name-directory load-file-name)))) - -;;;###autoload -(when (string-match "/etc/themes/$" - (file-name-directory (or load-file-name (buffer-file-name)))) - (message "To stay up-to-date, you should better install and use leuven-theme from MELPA.") - (sit-for 2)) - -(provide-theme 'leuven) - -;; This is for the sake of Emacs. -;; Local Variables: -;; no-byte-compile: t -;; time-stamp-end: "$" -;; time-stamp-format: "%:y%02m%02d.%02H%02M" -;; time-stamp-start: "Version: " -;; End: - -;;; leuven-theme.el ends here diff --git a/elpa/log4e-20200419.933/log4e-autoloads.el b/elpa/log4e-20200419.933/log4e-autoloads.el deleted file mode 100644 index 507e1846..00000000 --- a/elpa/log4e-20200419.933/log4e-autoloads.el +++ /dev/null @@ -1,35 +0,0 @@ -;;; log4e-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "log4e" "log4e.el" (0 0 0 0)) -;;; Generated autoloads from log4e.el - -(autoload 'log4e-mode "log4e" "\ -Major mode for browsing a buffer made by log4e. - -\\ -\\{log4e-mode-map} - -\(fn)" t nil) - -(autoload 'log4e:insert-start-log-quickly "log4e" "\ -Insert logging statment for trace level log at start of current function/macro. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "log4e" '("log4e"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; log4e-autoloads.el ends here diff --git a/elpa/log4e-20200419.933/log4e-pkg.el b/elpa/log4e-20200419.933/log4e-pkg.el deleted file mode 100644 index 0f7b4af1..00000000 --- a/elpa/log4e-20200419.933/log4e-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "log4e" "20200419.933" "provide logging framework for elisp" 'nil :commit "2540cb8d8fbb4b039a9fe41dfd956817d7ac0337" :keywords '("log") :authors '(("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) :maintainer '("Hiroaki Otsu" . "ootsuhiroaki@gmail.com") :url "https://github.com/aki2o/log4e") diff --git a/elpa/log4e-20200419.933/log4e.el b/elpa/log4e-20200419.933/log4e.el deleted file mode 100644 index 980393b1..00000000 --- a/elpa/log4e-20200419.933/log4e.el +++ /dev/null @@ -1,590 +0,0 @@ -;;; log4e.el --- provide logging framework for elisp - -;; Copyright (C) 2013 Hiroaki Otsu - -;; Author: Hiroaki Otsu -;; Keywords: log -;; Package-Version: 20200419.933 -;; URL: https://github.com/aki2o/log4e -;; Version: 0.3.2 - -;; 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 file is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: -;; -;; This extension provides logging framework for elisp. - -;;; Dependency: -;; -;; Nothing. - -;;; Installation: -;; -;; Put this to your load-path. -;; And put the following lines in your elisp file. -;; -;; (require 'log4e) - -;;; Configuration: -;; -;; See -;; Otherwise, eval following sexp. -;; (describe-function 'log4e:deflogger) - -;;; API: -;; -;; [EVAL] (autodoc-document-lisp-buffer :type 'command :prefix "log4e:" :docstring t) -;; `log4e:next-log' -;; Move to start of next log on log4e-mode. -;; `log4e:previous-log' -;; Move to start of previous log on log4e-mode. -;; `log4e:insert-start-log-quickly' -;; Insert logging statment for trace level log at start of current function/macro. -;; -;; *** END auto-documentation -;; -;; For detail, see -;; -;; [Note] Other than listed above, Those specifications may be changed without notice. - -;;; Tested On: -;; -;; - Emacs ... GNU Emacs 23.3.1 (i386-mingw-nt5.1.2600) of 2011-08-15 on GNUPACK - - -;; Enjoy!!! - - -;;; Code: -(eval-when-compile (require 'cl)) -(require 'rx) - - -(defconst log4e-log-level-alist '((fatal . 6) - (error . 5) - (warn . 4) - (info . 3) - (debug . 2) - (trace . 1)) - "Alist of log level value.") - -(defconst log4e-default-logging-function-name-alist '((fatal . "log-fatal") - (error . "log-error") - (warn . "log-warn") - (info . "log-info") - (debug . "log-debug") - (trace . "log-trace")) - "Alist of logging function name at default.") - - -(defmacro log4e--def-symmaker (symnm) - `(progn - (defsubst ,(intern (concat "log4e--make-symbol-" symnm)) (prefix) - (intern (concat ,(format "log4e--%s-" symnm) prefix))))) - -(log4e--def-symmaker "log-buffer") -(log4e--def-symmaker "msg-buffer") -(log4e--def-symmaker "log-template") -(log4e--def-symmaker "time-template") -(log4e--def-symmaker "min-level") -(log4e--def-symmaker "max-level") -(log4e--def-symmaker "toggle-logging") -(log4e--def-symmaker "toggle-debugging") -(log4e--def-symmaker "buffer-coding-system") -(log4e--def-symmaker "author-mail-address") - -(defmacro log4e--def-level-logger (prefix suffix level) - (let ((argform (if suffix - '(msg &rest msgargs) - '(level msg &rest msgargs))) - (buff (log4e--make-symbol-log-buffer prefix)) - (msgbuff (log4e--make-symbol-msg-buffer prefix)) - (codsys (log4e--make-symbol-buffer-coding-system prefix)) - (logtmpl (log4e--make-symbol-log-template prefix)) - (timetmpl (log4e--make-symbol-time-template prefix)) - (minlvl (log4e--make-symbol-min-level prefix)) - (maxlvl (log4e--make-symbol-max-level prefix)) - (logging-p (log4e--make-symbol-toggle-logging prefix))) - `(progn - - ;; Define logging function - (defun ,(intern (concat prefix "--" (or suffix "log"))) ,argform - ,(format "Do logging for %s level log. -%sMSG/MSGARGS are passed to `format'." - (if suffix level "any") - (if suffix "" "LEVEL is symbol as a log level in '(trace debug info warn error fatal).\n")) - (let ((log4e--current-msg-buffer ,msgbuff)) - (apply 'log4e--logging ,buff ,codsys ,logtmpl ,timetmpl ,minlvl ,maxlvl ,logging-p ,(if suffix level 'level) msg msgargs))) - - ;; Define logging macro - (defmacro ,(intern (concat prefix "--" (or suffix "log") "*")) ,argform - ,(format "Do logging for %s level log. -%sMSG/MSGARGS are passed to `format'. -Evaluation of MSGARGS is invoked only if %s level log should be printed." - (if suffix level "any") - (if suffix "" "LEVEL is symbol as a log level in '(trace debug info warn error fatal).\n") - (if suffix level "the")) - (let (,@(if suffix (list `(level ',level)) '()) - (buff (log4e--make-symbol-log-buffer ,prefix)) - (msgbuff (log4e--make-symbol-msg-buffer ,prefix)) - (codsys (log4e--make-symbol-buffer-coding-system ,prefix)) - (logtmpl (log4e--make-symbol-log-template ,prefix)) - (timetmpl (log4e--make-symbol-time-template ,prefix)) - (minlvl (log4e--make-symbol-min-level ,prefix)) - (maxlvl (log4e--make-symbol-max-level ,prefix)) - (logging-p (log4e--make-symbol-toggle-logging ,prefix))) - `(let ((log4e--current-msg-buffer ,msgbuff)) - (when (and ,logging-p - (log4e--logging-level-p ,minlvl ,maxlvl ,level)) - (log4e--logging ,buff ,codsys ,logtmpl ,timetmpl ,minlvl ,maxlvl ,logging-p ,level ,msg ,@msgargs))))) - - ))) - -(defsubst log4e--logging-level-p (minlevel maxlevel currlevel) - (let ((minlvlvalue (or (assoc-default minlevel log4e-log-level-alist) - 1)) - (maxlvlvalue (or (assoc-default maxlevel log4e-log-level-alist) - 6)) - (currlvlvalue (or (assoc-default currlevel log4e-log-level-alist) - 0))) - (and (>= currlvlvalue minlvlvalue) - (<= currlvlvalue maxlvlvalue)))) - -(defsubst log4e--get-or-create-log-buffer (buffnm &optional codesys) - (or (get-buffer buffnm) - (let ((buff (get-buffer-create buffnm))) - (with-current-buffer buff - (log4e-mode) - (when codesys - (setq buffer-file-coding-system codesys))) - buff))) - -(defvar log4e--regexp-msg-format - (rx-to-string `(and "%" - (* (any "+#-0")) ; flags - (* (any "0-9")) ; width - (? "." (+ (any "0-9"))) ; precision - (any "a-zA-Z")))) - -(defsubst log4e--insert-log (logtmpl timetmpl level msg msgargs propertize-p) - (let ((timetext (format-time-string timetmpl)) - (lvltext (format "%-05s" (upcase (symbol-name level)))) - (buffer-read-only nil)) - (when propertize-p - (put-text-property 0 (length timetext) 'face 'font-lock-doc-face timetext) - (put-text-property 0 (length lvltext) 'face 'font-lock-keyword-face lvltext)) - (let* ((logtext logtmpl) - (logtext (replace-regexp-in-string "%t" timetext logtext)) - (logtext (replace-regexp-in-string "%l" lvltext logtext)) - (logtext (replace-regexp-in-string "%m" msg logtext)) - (begin (point))) - (insert logtext "\n") - (when propertize-p - (put-text-property begin (+ begin 1) 'log4e--level level)) - (loop initially (goto-char begin) - while (and msgargs - (re-search-forward log4e--regexp-msg-format nil t)) - for currtype = (match-string-no-properties 0) - for currarg = (pop msgargs) - for failfmt = nil - for currtext = (condition-case e - (format currtype currarg) - (error (setq failfmt t) - (format "=%s=" (error-message-string e)))) - if propertize-p - do (ignore-errors - (cond (failfmt (put-text-property 0 (length currtext) 'face 'font-lock-warning-face currtext)) - (t (put-text-property 0 (length currtext) 'face 'font-lock-string-face currtext)))) - do (replace-match currtext t t)) - (goto-char begin)))) - -(defvar log4e--current-msg-buffer nil) - -;; We needs this signature be stay for other compiled plugins using old version -(defun log4e--logging (buffnm codsys logtmpl timetmpl minlevel maxlevel logging-p level msg &rest msgargs) - (when (and logging-p - (log4e--logging-level-p minlevel maxlevel level)) - (save-match-data - (with-current-buffer (log4e--get-or-create-log-buffer buffnm codsys) - (goto-char (point-max)) - (let* ((buffer-read-only nil) - (begin (point)) - (currlog (progn - (log4e--insert-log logtmpl timetmpl level msg msgargs t) - (goto-char (point-max)) - (buffer-substring-no-properties begin (point)))) - (msgbuf (or (when (and log4e--current-msg-buffer - (not (eq log4e--current-msg-buffer t))) - (ignore-errors (get-buffer log4e--current-msg-buffer))) - log4e--current-msg-buffer))) - (when msgbuf - (let ((standard-output (if (buffer-live-p msgbuf) - msgbuf - standard-output))) - (princ currlog)))) - nil)))) - -(defun log4e--get-current-log-line-level () - (save-excursion - (beginning-of-line) - (get-text-property (point) 'log4e--level))) - -;; We needs this signature be stay for other plugins compiled with this old version -(defun log4e--clear-log (buffnm) - (with-current-buffer (log4e--get-or-create-log-buffer buffnm) - (setq buffer-read-only nil) - (erase-buffer))) - -;; We needs this signature be stay for other plugins compiled with this old version -(defun log4e--open-log (buffnm) - (let* ((buff (get-buffer buffnm))) - (if (not (buffer-live-p buff)) - (message "[Log4E] Not exist log buffer.") - (with-current-buffer buff - (setq buffer-read-only t)) - (pop-to-buffer buff)))) - -;; We needs this signature be stay for other plugins compiled with this old version -(defun log4e--open-log-if-debug (buffnm dbg) - (when dbg - (log4e--open-log buffnm))) - -;; (defun log4e--send-report-if-not-debug (buffnm dbg addr prefix) -;; (let* ((buff (get-buffer buffnm))) -;; (when (and (not dbg) -;; (stringp addr) -;; (buffer-live-p buff)) -;; (reporter-submit-bug-report addr prefix nil nil nil nil)))) - - -(defmacro log4e:deflogger (prefix msgtmpl timetmpl &optional log-function-name-custom-alist) - "Define the functions of logging for your elisp. - -Specification: - After eval this, you can use the functions for supporting about logging. They are the following ... - - do logging for each log level. Log level are trace, debug, info, warn, error and fatal. - - set max and min log level. - - switch logging. - - switch debugging. - - open and clear log buffer. - - send bug report for you. - For details, see Functions section. - -Argument: - - PREFIX is string as your elisp prefix. - - MSGTMPL is string as format of log. The following words has a special meaning. - - %t ... Replaced with time string. About it, see TIMETMPL argument. - - %l ... Replaced with log level. They are 'TRACE', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL'. - - %m ... Replaced with log message that passed by you. - - TIMETMPL is string as format of time. This value is passed to `format-time-string'. - - LOG-FUNCTION-NAME-CUSTOM-ALIST is alist as the function name of logging. - - If this value is nil, define the following functions. - yourprefix--log-trace - yourprefix--log-debug - ... - yourprefix--log-fatal - - If you want to custom the name of them, give like the following value. - '((fatal . \"fatal\") - (error . \"error\") - (warn . \"warn\") - (info . \"info\") - (debug . \"debug\") - (trace . \"trace\")) - Then, define the following functions. - yourprefix--trace - yourprefix--debug - ... - yourprefix--fatal - -Functions: - List all functions defined below. PREFIX is your prefix. - - PREFIX--log-fatal ... #1 - - PREFIX--log-error ... #1 - - PREFIX--log-warn ... #1 - - PREFIX--log-info ... #1 - - PREFIX--log-debug ... #1 - - PREFIX--log-trace ... #1 - - PREFIX--log-fatal* ... #2 - - PREFIX--log-error* ... #2 - - PREFIX--log-warn* ... #2 - - PREFIX--log-info* ... #2 - - PREFIX--log-debug* ... #2 - - PREFIX--log-trace* ... #2 - - PREFIX--log - - PREFIX--log-set-level - - PREFIX--log-enable-logging ... #3 - - PREFIX--log-disable-logging ... #3 - - PREFIX--log-enable-messaging ... #3 - - PREFIX--log-disable-messaging ... #3 - - PREFIX--log-enable-debugging ... #3 - - PREFIX--log-disable-debugging ... #3 - - PREFIX--log-debugging-p - - PREFIX--log-set-coding-system - - PREFIX--log-set-author-mail-address - - PREFIX--log-clear-log ... #3 - - PREFIX--log-open-log ... #3 - - PREFIX--log-open-log-if-debug - - #1 : You can customize this name - #2 : Name is a #1 name + \"*\" - #3 : This is command - -Example: -;; If you develop elisp that has prefix \"hoge\", write and eval the following sexp in your elisp file. - - (require 'log4e) - (log4e:deflogger \"hoge\" \"%t [%l] %m\" \"%H:%M:%S\") - -;; Eval the following - (hoge--log-enable-logging) - -;; Then, write the following - - (defun hoge-do-hoge (hoge) - (if (not (stringp hoge)) - (hoge--log-fatal \"failed do hoge : hoge is '%s'\" hoge) - (hoge--log-debug \"start do hoge about '%s'\" hoge) - (message \"hoge!\") - (hoge--log-info \"done hoge about '%s'\" hoge))) - -;; Eval the following - (hoge-do-hoge \"HOGEGE\") - -;; Do M-x hoge--log-open-log -;; Open the buffer which name is \" *log4e-hoge*\". The buffer string is below -12:34:56 [INFO ] done hoge about 'HOGEGE' - -;; Eval the following - (hoge--log-set-level 'trace) - (hoge-do-hoge \"FUGAGA\") - -;; Do M-x hoge--log-open-log -;; Open the buffer. its string is below -12:34:56 [INFO ] done hoge about 'HOGEGE' -12:35:43 [DEBUG] start do hoge about 'FUGAGA' -12:35:43 [INFO ] done hoge about 'FUGAGA' - -" - (declare (indent 0)) - (if (or (not (stringp prefix)) (string= prefix "") - (not (stringp msgtmpl)) (string= msgtmpl "") - (not (stringp timetmpl)) (string= timetmpl "")) - (message "[LOG4E] invalid argument of deflogger") - (let* ((bufsym (log4e--make-symbol-log-buffer prefix)) - (msgbufsym (log4e--make-symbol-msg-buffer prefix)) - (logtmplsym (log4e--make-symbol-log-template prefix)) - (timetmplsym (log4e--make-symbol-time-template prefix)) - (minlvlsym (log4e--make-symbol-min-level prefix)) - (maxlvlsym (log4e--make-symbol-max-level prefix)) - (tglsym (log4e--make-symbol-toggle-logging prefix)) - (dbgsym (log4e--make-symbol-toggle-debugging prefix)) - (codsyssym (log4e--make-symbol-buffer-coding-system prefix)) - (addrsym (log4e--make-symbol-author-mail-address prefix)) - (funcnm-alist (loop with custom-alist = (car (cdr log-function-name-custom-alist)) - for lvl in '(fatal error warn info debug trace) - for lvlpair = (assq lvl custom-alist) - for fname = (or (cdr-safe lvlpair) "") - collect (or (if (string-match "\*" fname) - (progn - (message "[LOG4E] ignore %s level name in log-function-name-custom-alist. can't use '*' for the name." lvl) - nil) - lvlpair) - (assq lvl log4e-default-logging-function-name-alist))))) - `(progn - - ;; Define variable for prefix - (defvar ,bufsym (format " *log4e-%s*" ,prefix)) - (defvar ,logtmplsym ,msgtmpl) - (defvar ,timetmplsym ,timetmpl) - (defvar ,minlvlsym 'info) - (defvar ,maxlvlsym 'fatal) - (defvar ,tglsym nil) - (defvar ,msgbufsym nil) - (defvar ,dbgsym nil) - (defvar ,codsyssym nil) - (defvar ,addrsym nil) - - ;; Define level set function - (defun ,(intern (concat prefix "--log-set-level")) (minlevel &optional maxlevel) - "Set range for doing logging. - -MINLEVEL is symbol of lowest level for doing logging. its default is 'info. -MAXLEVEL is symbol of highest level for doing logging. its default is 'fatal." - (setq ,minlvlsym minlevel) - (setq ,maxlvlsym maxlevel)) - - ;; Define logging toggle function - (defun ,(intern (concat prefix "--log-enable-logging")) () - "Enable logging by logging functions." - (interactive) - (setq ,tglsym t)) - (defun ,(intern (concat prefix "--log-disable-logging")) () - "Disable logging by logging functions." - (interactive) - (setq ,tglsym nil)) - - ;; Define messaging toggle function - (defun ,(intern (concat prefix "--log-enable-messaging")) (&optional buffer) - "Enable dump the log into other buffer by logging functions. - -BUFFER is a buffer dumped log into. nil means *Messages* buffer." - (interactive) - (setq ,msgbufsym (or buffer t))) - (defun ,(intern (concat prefix "--log-disable-messaging")) () - "Disable dump the log into other buffer by logging functions." - (interactive) - (setq ,msgbufsym nil)) - - ;; Define debugging toggle function - (defun ,(intern (concat prefix "--log-enable-debugging")) () - "Enable debugging and logging. - -`PREFIX--log-debugging-p' will return t." - (interactive) - (setq ,tglsym t) - (setq ,dbgsym t)) - (defun ,(intern (concat prefix "--log-disable-debugging")) () - "Disable debugging. - -`PREFIX--log-debugging-p' will return nil." - (interactive) - (setq ,dbgsym nil)) - (defun ,(intern (concat prefix "--log-debugging-p")) () - ,dbgsym) - - ;; Define coding system set funtion - (defun ,(intern (concat prefix "--log-set-coding-system")) (coding-system) - "Set charset and linefeed of LOG-BUFFER. - -CODING-SYSTEM is symbol for setting to `buffer-file-coding-system'. -LOG-BUFFER is a buffer which name is \" *log4e-PREFIX*\"." - (setq ,codsyssym coding-system)) - - ;; ;; Define author mail set function - ;; (defun ,(intern (concat prefix "--log-set-author-mail-address")) (before-atmark after-atmark) - ;; "Set mail address of author for elisp that has PREFIX. This value is used SEND-REPORT. - - ;; BEFORE-ATMARK is string as part of mail address. If your address is \"hoge@example.co.jp\", it is \"hoge\". - ;; AFTER-ATMARK is string as part of mail address. If your address is \"hoge@example.co.jp\", it is \"example.co.jp\". - ;; SEND-REPORT is `PREFIX--log-send-report-if-not-debug'." - ;; (setq ,addrsym (concat before-atmark "@" after-atmark))) - - ;; Define log buffer handle function - (defun ,(intern (concat prefix "--log-clear-log")) () - "Clear buffer string of buffer which name is \" *log4e-PREFIX*\"." - (interactive) - (log4e--clear-log ,bufsym)) - (defun ,(intern (concat prefix "--log-open-log")) () - "Open buffer which name is \" *log4e-PREFIX*\"." - (interactive) - (log4e--open-log ,bufsym)) - (defun ,(intern (concat prefix "--log-open-log-if-debug")) () - "Open buffer which name is \" *log4e-PREFIX*\" if debugging is enabled." - (log4e--open-log-if-debug ,bufsym ,dbgsym)) - - ;; ;; Define report send function - ;; (defun ,(intern (concat prefix "--log-send-report-if-not-debug")) () - ;; "Send bug report to author if debugging is disabled. - - ;; The author mailaddress is set by `PREFIX--log-set-author-mail-address'. - ;; About the way of sending bug report, see `reporter-submit-bug-report'." - ;; (log4e--send-report-if-not-debug ,bufsym ,dbgsym ,addrsym ,prefix)) - - ;; Define each level logging function - (log4e--def-level-logger ,prefix nil nil) - (log4e--def-level-logger ,prefix ,(assoc-default 'fatal funcnm-alist) 'fatal) - (log4e--def-level-logger ,prefix ,(assoc-default 'error funcnm-alist) 'error) - (log4e--def-level-logger ,prefix ,(assoc-default 'warn funcnm-alist) 'warn) - (log4e--def-level-logger ,prefix ,(assoc-default 'info funcnm-alist) 'info) - (log4e--def-level-logger ,prefix ,(assoc-default 'debug funcnm-alist) 'debug) - (log4e--def-level-logger ,prefix ,(assoc-default 'trace funcnm-alist) 'trace) - - )))) - - -;;;###autoload -(define-derived-mode log4e-mode view-mode "Log4E" - "Major mode for browsing a buffer made by log4e. - -\\ -\\{log4e-mode-map}" - (define-key log4e-mode-map (kbd "J") 'log4e:next-log) - (define-key log4e-mode-map (kbd "K") 'log4e:previous-log)) - -(defun log4e:next-log () - "Move to start of next log on log4e-mode." - (interactive) - (let* ((level)) - (while (and (not level) - (< (point) (point-max))) - (forward-line 1) - (setq level (log4e--get-current-log-line-level))) - level)) - -(defun log4e:previous-log () - "Move to start of previous log on log4e-mode." - (interactive) - (let* ((level)) - (while (and (not level) - (> (point) (point-min))) - (forward-line -1) - (setq level (log4e--get-current-log-line-level))) - level)) - -;;;###autoload -(defun log4e:insert-start-log-quickly () - "Insert logging statment for trace level log at start of current function/macro." - (interactive) - (let* ((fstartpt (when (re-search-backward "(\\(?:defun\\|defmacro\\|defsubst\\)\\*? +\\([^ ]+\\) +(\\([^)]*\\))" nil t) - (point))) - (fncnm (when fstartpt (match-string-no-properties 1))) - (argtext (when fstartpt (match-string-no-properties 2))) - (prefix (save-excursion - (goto-char (point-min)) - (loop while (re-search-forward "(log4e:deflogger[ \n]+\"\\([^\"]+\\)\"" nil t) - for prefix = (match-string-no-properties 1) - for currface = (get-text-property (match-beginning 0) 'face) - if (not (eq currface 'font-lock-comment-face)) - return prefix)))) - (when (and fstartpt prefix) - (let* ((fncnm (replace-regexp-in-string (concat "\\`" prefix "[^a-zA-Z0-9]+") "" fncnm)) - (fncnm (replace-regexp-in-string "-" " " fncnm)) - (argtext (replace-regexp-in-string "\n" " " argtext)) - (argtext (replace-regexp-in-string "^ +" "" argtext)) - (argtext (replace-regexp-in-string " +$" "" argtext)) - (args (split-string argtext " +")) - (args (loop for arg in args - if (and (not (string= arg "")) - (not (string-match "\\`&" arg))) - collect arg)) - (logtext (loop with ret = (format "start %s." fncnm) - for arg in args - do (setq ret (concat ret " " arg "[%s]")) - finally return ret)) - (sexpformat (loop with ret = "(%s--log 'trace \"%s\"" - for arg in args - do (setq ret (concat ret " %s")) - finally return (concat ret ")"))) - (inserttext (apply 'format sexpformat prefix logtext args))) - (forward-char) - (forward-sexp 3) - (when (re-search-forward "\\=[ \n]+\"" nil t) - (forward-char -1) - (forward-sexp)) - (newline-and-indent) - (insert inserttext))))) - - -(provide 'log4e) -;;; log4e.el ends here diff --git a/elpa/log4e-20200419.933/log4e.elc b/elpa/log4e-20200419.933/log4e.elc deleted file mode 100644 index ba58fd86ebae47245f5ae1c67274553be8bc1f51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21114 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 P|3wEXwf^Progressively expand macro forms with \\[macrostep-expand], collapse them with \\[macrostep-collapse], -and move back and forth with \\[macrostep-next-macro] and \\[macrostep-prev-macro]. -Use \\[macrostep-collapse-all] or collapse all visible expansions to -quit and return to normal editing. - -\\{macrostep-keymap} - -\(fn &optional ARG)" t nil) - -(autoload 'macrostep-expand "macrostep" "\ -Expand the macro form following point by one step. - -Enters `macrostep-mode' if it is not already active, making the -buffer temporarily read-only. If macrostep-mode is active and the -form following point is not a macro form, search forward in the -buffer and expand the next macro form found, if any. - -With a prefix argument, the expansion is displayed in a separate -buffer instead of inline in the current buffer. Setting -`macrostep-expand-in-separate-buffer' to non-nil swaps these two -behaviors. - -\(fn &optional TOGGLE-SEPARATE-BUFFER)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "macrostep" '("macrostep-"))) - -;;;*** - -;;;### (autoloads nil "macrostep-c" "macrostep-c.el" (0 0 0 0)) -;;; Generated autoloads from macrostep-c.el - -(autoload 'macrostep-c-mode-hook "macrostep-c" "\ - - -\(fn)" nil nil) - -(add-hook 'c-mode-hook #'macrostep-c-mode-hook) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "macrostep-c" '("macrostep-c-"))) - -;;;*** - -;;;### (autoloads nil nil ("macrostep-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; macrostep-autoloads.el ends here diff --git a/elpa/macrostep-20161120.2106/macrostep-c.el b/elpa/macrostep-20161120.2106/macrostep-c.el deleted file mode 100644 index 8768bf53..00000000 --- a/elpa/macrostep-20161120.2106/macrostep-c.el +++ /dev/null @@ -1,187 +0,0 @@ -;;; macrostep-c.el --- macrostep interface to C preprocessor - -;; Copyright (C) 2015 Jon Oddie - -;; Author: Jon Oddie -;; Maintainer: Jon Oddie -;; Created: 27 November 2015 -;; Updated: 27 November 2015 -;; Version: 0.9 -;; Keywords: c, languages, macro, debugging -;; Url: https://github.com/joddie/macrostep - -;; This file is NOT part of GNU Emacs. - -;; This program is free software: you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation, either version 3 of the -;; License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see `http://www.gnu.org/licenses/'. - -;;; Commentary: - -;; A thin wrapper around Emacs's built-in `cmacexp' library to provide -;; basic support for expanding C macros using the `macrostep' user -;; interface. To use, position point on a macro use in a C buffer and -;; type `M-x macrostep-expand'. The variables `c-macro-preprocessor' -;; and especially `c-macro-cppflags' may need to be set correctly for -;; accurate expansion. - -;; This is fairly basic compared to the Emacs Lisp `macrostep'. In -;; particular, there is no step-by-step expansion, since C macros are -;; expanded in a single "cpp" pass, and no pretty-printing. - -;; To hide the buffer containing "cpp" warnings (not recommended), you -;; could do something like: -;; -;; (push `(,(regexp-quote macrostep-c-warning-buffer) -;; (display-buffer-no-window)) -;; display-buffer-alist) - -;;; Code: - -(require 'macrostep) -(require 'cmacexp) -(require 'cl-lib) - -(eval-and-compile - (if (require 'subr-x nil t) - (defalias 'macrostep-c-string-trim 'string-trim) - (defun macrostep-c-string-trim (string) - (when (string-match "\\`[ \t\n\r]+" string) - (setq string (replace-match "" t t string))) - (when (string-match "[ \t\n\r]+\\'" string) - (setq string (replace-match "" t t string))) - string))) - -(put 'macrostep-c-non-macro 'error-conditions - '(macrostep-c-non-macro error)) -(put 'macrostep-c-non-macro 'error-message - "Text around point is not a macro call.") - -(put 'macrostep-c-expansion-failed 'error-conditions - '(macrostep-c-expansion-failed error)) -(put 'macrostep-c-expansion-failed 'error-message - "Macro-expansion failed.") - -(defvar macrostep-c-warning-buffer "*Macroexpansion Warnings*") - -;;;###autoload -(defun macrostep-c-mode-hook () - (setq macrostep-sexp-bounds-function - #'macrostep-c-sexp-bounds) - (setq macrostep-sexp-at-point-function - #'macrostep-c-sexp-at-point) - (setq macrostep-environment-at-point-function - #'ignore) - (setq macrostep-expand-1-function - #'macrostep-c-expand-1) - (setq macrostep-print-function - #'macrostep-c-print-function) - (add-hook 'macrostep-mode-off-hook - #'macrostep-c-mode-off nil t)) - -(defun macrostep-c-mode-off (&rest ignore) - (when (derived-mode-p 'c-mode) - (let ((warning-window - (get-buffer-window macrostep-c-warning-buffer))) - (when warning-window - (quit-window nil warning-window))))) - -;;;###autoload -(add-hook 'c-mode-hook #'macrostep-c-mode-hook) - -(defun macrostep-c-sexp-bounds () - (save-excursion - (cl-loop - (let ((region (macrostep-c-sexp-bounds-1))) - (cond - ((null region) - (signal 'macrostep-c-non-macro nil)) - ((macrostep-c-expandable-p region) - (cl-return region)) - (t - (condition-case nil - (progn - (backward-up-list) - (skip-syntax-backward "-")) - (scan-error - (signal 'macrostep-c-non-macro nil))))))))) - -(defun macrostep-c-sexp-bounds-1 () - (let ((region (bounds-of-thing-at-point 'symbol))) - (when region - (cl-destructuring-bind (symbol-start . symbol-end) region - (save-excursion - (goto-char symbol-end) - (if (looking-at "[[:space:]]*(") - (cons symbol-start (scan-sexps symbol-end 1)) - region)))))) - -(defun macrostep-c-expandable-p (region) - (cl-destructuring-bind (start . end) region - (condition-case nil - (cl-destructuring-bind (expansion warnings) - (macrostep-c-expand-region start end) - (declare (ignore warnings)) - (and (cl-plusp (length expansion)) - (not (string= expansion (buffer-substring start end))))) - (macrostep-c-expansion-failed nil)))) - -(defun macrostep-c-sexp-at-point (start end) - (cons start end)) - -(defun macrostep-c-expand-1 (region _ignore) - (cl-destructuring-bind (start . end) region - (cl-destructuring-bind (expansion warnings) - (macrostep-c-expand-region start end) - (when (cl-plusp (length warnings)) - (with-current-buffer - (get-buffer-create macrostep-c-warning-buffer) - (let ((inhibit-read-only t)) - (erase-buffer) - (insert warnings) - (goto-char (point-min))) - (special-mode) - (display-buffer (current-buffer) - '(display-buffer-pop-up-window - (inhibit-same-window . t) - (allow-no-window . t))))) - expansion))) - -(defun macrostep-c-expand-region (start end) - (let ((expansion - (condition-case nil - (c-macro-expansion start end - (concat c-macro-preprocessor " " - c-macro-cppflags)) - (search-failed - (signal 'macrostep-c-expansion-failed nil))))) - (with-temp-buffer - (save-excursion - (insert expansion)) - (when (looking-at (regexp-quote "/*")) - (search-forward "*/")) - (let ((warnings (buffer-substring (point-min) (point))) - (expansion (buffer-substring (point) (point-max)))) - (mapcar #'macrostep-c-string-trim (list expansion warnings)))))) - -(defun macrostep-c-print-function (expansion &rest _ignore) - (with-temp-buffer - (insert expansion) - (let ((exit-code - (shell-command-on-region (point-min) (point-max) "indent" nil t))) - (when (zerop exit-code) - (setq expansion (macrostep-c-string-trim (buffer-string)))))) - (insert expansion)) - -(provide 'macrostep-c) - -;;; macrostep-c.el ends here diff --git a/elpa/macrostep-20161120.2106/macrostep-c.elc b/elpa/macrostep-20161120.2106/macrostep-c.elc deleted file mode 100644 index f7960ed1ef83eb949378a0416950962e58934b18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4658 zcmcIok8j&H7WO*q5T|Idw(D-UYX?T@t#(?bA{9Hg6vJ-U6-9yFuwlP|MZqddv@JxI zG*Zrw>py?rBPCmQe&DcS1*}ly(T1{D$WvnQxbe8@%sxWMJH|^jL)6}prys)`Zh9&2DG)rTa z6tSsvnorDAjA~P{C`nYp7PE-YcI9Umd?W>Y2wZ9ZElV&_Q!Q4Cq54LeIL8_`KaO>;6Cl zuz~{t2Z9{f&zerSk$$UF3TG+hdM8;1H2=QG4z>Dio@&LwBVCwEl`KY6o#AiBvvkDF ze5Cmq%hQZiEK%bqOCz&1=P`Gz;o#1UwcFc=J@?wTC}BOm+@Q_)!EM?gR_;4Iq!1gA z-p4E13~L(;&brM;y=>>WnQj(U@f4GUZw^^E%x@h%@t9U+hK=xg%){!vW;6^Rdq-?= z#L9WKvK3;jMS>}<3yl!xNosS4^%e+W%WHQ1+I*&ri6$V$59$o*ql-DXUKVLyF{B(N zN#v#j`?GA(Z2A4inpt2160wF?BY|DnL~#V~Up?_z&@{mmW%b`t58c}^pp zBg^?{J{}{#ydCRd>ELHKZgxEPy$kr`_V#CBKA#rFG21>QVo(wcD1O5`c1__C8ouqJ;zxseeeYK&L!0UqO?)mS&t&J;F2g(1RpkW3>I+=!my($vbXPU{RSHntHCF9NDr-c-HNGG*<96a)M>)Ny*j`^P+@r&x!3TgWwiM5IF6 zMwl)PR!*P6Ib9c|ySJz}Z{H+uAAE8jJt*AdUO2ve9}=W)7_SzC8}**#3+9Y zz37a~a-2mIT;-a|mRVV-)C|?0t3G=M_q=$z$mho4@)M6iP%oZ%3xlRwCQY8G99+QF zELW$^3?AE|33t3!tt#xfKIjst(zYqpx5YMd%i_2ZD|Vb_IFju;Dfw3v|5+HqW3%`| z(-DeN`Wcn<1)pD{{B7zW$?J`%(E!72EK#=^st&j9Z9d4YW2zS>; z8bd>s;AxKwa6|k9gW_W%jFpu`fFJ^f2Ph@Pjd#$p{JDW>4|_C<(?;xn_pZCTQ2`~P z9`=4I=#%$Q&=0{b-yY+icW`XD*Bj22l-AYD+La6%S3h6v3On%SFAGAFbV{(zAgI=ovyg8_P#g(yPHcXnqk - -;; Author: joddie -;; Maintainer: joddie -;; Created: 16 January 2012 -;; Updated: 07 December 2015 -;; Version: 0.9 -;; Keywords: lisp, languages, macro, debugging -;; Url: https://github.com/joddie/macrostep -;; Package-Requires: ((cl-lib "0.5")) - -;; 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: - -;; `macrostep' is an Emacs minor mode for interactively stepping through -;; the expansion of macros in Emacs Lisp source code. It lets you see -;; exactly what happens at each step of the expansion process by -;; pretty-printing the expanded forms inline in the source buffer, which is -;; temporarily read-only while macro expansions are visible. You can -;; expand and collapse macro forms one step at a time, and evaluate or -;; instrument the expansions for debugging with Edebug as normal (but see -;; "Bugs and known limitations", below). Single-stepping through the -;; expansion is particularly useful for debugging macros that expand into -;; another macro form. These can be difficult to debug with Emacs' -;; built-in `macroexpand', which continues expansion until the top-level -;; form is no longer a macro call. - -;; Both globally-visible macros as defined by `defmacro' and local macros -;; bound by `(cl-)macrolet' or another macro-defining form can be expanded. -;; Within macro expansions, calls to macros and compiler macros are -;; fontified specially: macro forms using `macrostep-macro-face', and -;; functions with compiler macros using `macrostep-compiler-macro-face'. -;; Uninterned symbols (gensyms) are fontified based on which step in the -;; expansion created them, to distinguish them both from normal symbols and -;; from other gensyms with the same print name. - -;; As of version 0.9, it is also possible to extend `macrostep' to work -;; with other languages with macro systems in addition to Emacs Lisp. An -;; extension for Common Lisp (via SLIME) is in the works; contributions for -;; other languages are welcome. See "Extending macrostep" below for -;; details. - - -;; 1 Key-bindings and usage -;; ======================== - -;; The standard keybindings in `macrostep-mode' are the following: - -;; e, =, RET : expand the macro form following point one step -;; c, u, DEL : collapse the form following point -;; q, C-c C-c: collapse all expanded forms and exit macrostep-mode -;; n, TAB : jump to the next macro form in the expansion -;; p, M-TAB : jump to the previous macro form in the expansion - -;; It's not very useful to enable and disable macrostep-mode directly. -;; Instead, bind `macrostep-expand' to a key in `emacs-lisp-mode-map', -;; for example C-c e: - -;; ,---- -;; | (define-key emacs-lisp-mode-map (kbd "C-c e") 'macrostep-expand) -;; `---- - -;; You can then enter macrostep-mode and expand a macro form completely -;; by typing `C-c e e e ...' as many times as necessary. - -;; Exit macrostep-mode by typing `q' or `C-c C-c', or by successively -;; typing `c' to collapse all surrounding expansions. - - -;; 2 Customization options -;; ======================= - -;; Type `M-x customize-group RET macrostep RET' to customize options and -;; faces. - -;; To display macro expansions in a separate window, instead of inline in -;; the source buffer, customize `macrostep-expand-in-separate-buffer' to -;; `t'. The default is `nil'. Whichever default behavior is selected, -;; the alternative behavior can be obtained temporarily by giving a -;; prefix argument to `macrostep-expand'. - -;; To have `macrostep' ignore compiler macros, customize -;; `macrostep-expand-compiler-macros' to `nil'. The default is `t'. - -;; Customize the faces `macrostep-macro-face', -;; `macrostep-compiler-macro-face', and `macrostep-gensym-1' through -;; `macrostep-gensym-5' to alter the appearance of macro expansions. - - -;; 3 Locally-bound macros -;; ====================== - -;; As of version 0.9, `macrostep' can expand calls to a locally-bound -;; macro, whether defined by a surrounding `(cl-)macrolet' form, or by -;; another macro-defining macro. In other words, it is possible to -;; expand the inner `local-macro' forms in both the following examples, -;; whether `local-macro' is defined by an enclosing `cl-macrolet' -- - -;; ,---- -;; | (cl-macrolet ((local-macro (&rest args) -;; | `(expansion of ,args))) -;; | (local-macro (do-something))) -;; `---- - -;; -- or by a macro which expands into `cl-macrolet', provided that its -;; definition of macro is evaluated prior to calling `macrostep-expand': - -;; ,---- -;; | (defmacro with-local-macro (&rest body) -;; | `(cl-macrolet ((local-macro (&rest args) -;; | `(expansion of ,args))) -;; | ,@body)) -;; | -;; | (with-local-macro -;; | (local-macro (do something (else))) -;; `---- - -;; See the `with-js' macro in Emacs's `js.el' for a real example of the -;; latter kind of macro. - -;; Expansion of locally-bound macros is implemented by instrumenting -;; Emacs Lisp's macro-expander to capture the environment at point. A -;; similar trick is used to detect macro- and compiler-macro calls within -;; expanded text so that they can be fontified accurately. - - -;; 4 Expanding sub-forms -;; ===================== - -;; By moving point around in the macro expansion using -;; `macrostep-next-macro' and `macrostep-prev-macro' (bound to the `n' -;; and `p' keys), it is possible to expand other macro calls within the -;; expansion before expanding the outermost form. This can sometimes be -;; useful, although it does not correspond to the real order of macro -;; expansion in Emacs Lisp, which proceeds by fully expanding the outer -;; form to a non-macro form before expanding sub-forms. - -;; The main reason to expand sub-forms out of order is to help with -;; debugging macros which programmatically expand their arguments in -;; order to rewrite them. Expanding the arguments of such a macro lets -;; you visualise what the macro definition would compute via -;; `macroexpand-all'. - - -;; 5 Extending macrostep for other languages -;; ========================================= - -;; Since version 0.9, it is possible to extend macrostep to work with -;; other languages besides Emacs Lisp. In typical Emacs fashion, this is -;; implemented by setting buffer-local variables to different function -;; values. Six buffer-local variables define the language-specific part -;; of the implementation: - -;; - `macrostep-sexp-bounds-function' -;; - `macrostep-sexp-at-point-function' -;; - `macrostep-environment-at-point-function' -;; - `macrostep-expand-1-function' -;; - `macrostep-print-function' -;; - `macrostep-macro-form-p-function' - -;; Typically, an implementation for another language would set these -;; variables in a major-mode hook. See the docstrings of each variable -;; for details on how each one is called and what it should return. At a -;; minimum, another language implementation needs to provide -;; `macrostep-sexp-at-point-function', `macrostep-expand-1-function', and -;; `macrostep-print-function'. Lisp-like languages may be able to reuse -;; the default `macrostep-sexp-bounds-function' if they provide another -;; implementation of `macrostep-macro-form-p-function'. Languages which -;; do not implement locally-defined macros can set -;; `macrostep-environment-at-point-function' to `ignore'. - -;; Note that the core `macrostep' machinery only interprets the return -;; value of `macrostep-sexp-bounds-function', so implementations for -;; other languages can use any internal representations of code and -;; environments which is convenient. Although the terminology is -;; Lisp-specific, there is no reason that implementations could not be -;; provided for non-Lisp languages with macro systems, provided there is -;; some way of identifying macro calls and calling the compiler / -;; preprocessor to obtain their expansions. - - -;; 6 Bugs and known limitations -;; ============================ - -;; You can evaluate and edebug macro-expanded forms and step through the -;; macro-expanded version, but the form that `eval-defun' and friends -;; read from the buffer won't have the uninterned symbols of the real -;; macro expansion. This will probably work OK with CL-style gensyms, -;; but may cause problems with `make-symbol' symbols if they have the -;; same print name as another symbol in the expansion. It's possible that -;; using `print-circle' and `print-gensym' could get around this. - -;; Please send other bug reports and feature requests to the author. - - -;; 7 Acknowledgements -;; ================== - -;; Thanks to: -;; - John Wiegley for fixing a bug with the face definitions under Emacs -;; 24 & for plugging macrostep in his [EmacsConf presentation]! -;; - George Kettleborough for bug reports, and patches to highlight the -;; expanded region and properly handle backquotes. -;; - Nic Ferrier for suggesting support for local definitions within -;; macrolet forms -;; - Luís Oliveira for suggesting and implementing SLIME support - -;; `macrostep' was originally inspired by J. V. Toups's 'Deep Emacs Lisp' -;; articles ([part 1], [part 2], [screencast]). - -;; [EmacsConf presentation] http://youtu.be/RvPFZL6NJNQ - -;; [part 1] -;; http://dorophone.blogspot.co.uk/2011/04/deep-emacs-part-1.html - -;; [part 2] -;; http://dorophone.blogspot.co.uk/2011/04/deep-emacs-lisp-part-2.html - -;; [screencast] -;; http://dorophone.blogspot.co.uk/2011/05/monadic-parser-combinators-in-elisp.html - - -;; 8 Changelog -;; =========== - -;; - v0.9, 2015-10-01: -;; - separate into Elisp-specific and generic components -;; - highlight and expand compiler macros -;; - improve local macro expansion and macro form identification by -;; instrumenting `macroexpand(-all)' -;; - v0.8, 2014-05-29: fix a bug with printing the first element of lists -;; - v0.7, 2014-05-11: expand locally-defined macros within -;; `(cl-)macrolet' forms -;; - v0.6, 2013-05-04: better handling of quote and backquote -;; - v0.5, 2013-04-16: highlight region, maintain cleaner buffer state -;; - v0.4, 2013-04-07: only enter macrostep-mode on successful -;; macro-expansion -;; - v0.3, 2012-10-30: print dotted lists correctly. autoload -;; definitions. - -;;; Code: - -(require 'pp) -(require 'ring) -(eval-and-compile - (require 'cl-lib nil t) - (require 'cl-lib "lib/cl-lib")) - - -;;; Constants and dynamically bound variables -(defvar macrostep-overlays nil - "List of all macro stepper overlays in the current buffer.") -(make-variable-buffer-local 'macrostep-overlays) - -(defvar macrostep-gensym-depth nil - "Number of macro expansion levels that have introduced gensyms so far.") -(make-variable-buffer-local 'macrostep-gensym-depth) - -(defvar macrostep-gensyms-this-level nil - "t if gensyms have been encountered during current level of macro expansion.") -(make-variable-buffer-local 'macrostep-gensyms-this-level) - -(defvar macrostep-saved-undo-list nil - "Saved value of buffer-undo-list upon entering macrostep mode.") -(make-variable-buffer-local 'macrostep-saved-undo-list) - -(defvar macrostep-saved-read-only nil - "Saved value of buffer-read-only upon entering macrostep mode.") -(make-variable-buffer-local 'macrostep-saved-read-only) - -(defvar macrostep-expansion-buffer nil - "Non-nil if the current buffer is a macro-expansion buffer.") -(make-variable-buffer-local 'macrostep-expansion-buffer) - -(defvar macrostep-outer-environment nil - "Outermost macro-expansion environment to use in a dedicated macro-expansion buffers. - -This variable is used to save information about any enclosing -`cl-macrolet' context when a macro form is expanded in a separate -buffer.") -(make-variable-buffer-local 'macrostep-outer-environment) - -;;; Customization options and faces -(defgroup macrostep nil - "Interactive macro stepper for Emacs Lisp." - :group 'lisp - :link '(emacs-commentary-link :tag "commentary" "macrostep.el") - :link '(emacs-library-link :tag "lisp file" "macrostep.el") - :link '(url-link :tag "web page" "https://github.com/joddie/macrostep")) - -(defface macrostep-gensym-1 - '((((min-colors 16581375)) :foreground "#8080c0" :box t :bold t) - (((min-colors 8)) :background "cyan") - (t :inverse-video t)) - "Face for gensyms created in the first level of macro expansion." - :group 'macrostep) - -(defface macrostep-gensym-2 - '((((min-colors 16581375)) :foreground "#8fbc8f" :box t :bold t) - (((min-colors 8)) :background "#00cd00") - (t :inverse-video t)) - "Face for gensyms created in the second level of macro expansion." - :group 'macrostep) - -(defface macrostep-gensym-3 - '((((min-colors 16581375)) :foreground "#daa520" :box t :bold t) - (((min-colors 8)) :background "yellow") - (t :inverse-video t)) - "Face for gensyms created in the third level of macro expansion." - :group 'macrostep) - -(defface macrostep-gensym-4 - '((((min-colors 16581375)) :foreground "#cd5c5c" :box t :bold t) - (((min-colors 8)) :background "red") - (t :inverse-video t)) - "Face for gensyms created in the fourth level of macro expansion." - :group 'macrostep) - -(defface macrostep-gensym-5 - '((((min-colors 16581375)) :foreground "#da70d6" :box t :bold t) - (((min-colors 8)) :background "magenta") - (t :inverse-video t)) - "Face for gensyms created in the fifth level of macro expansion." - :group 'macrostep) - -(defface macrostep-expansion-highlight-face - '((((min-colors 16581375) (background light)) :background "#eee8d5") - (((min-colors 16581375) (background dark)) :background "#222222")) - "Face for macro-expansion highlight." - :group 'macrostep) - -(defface macrostep-macro-face - '((t :underline t)) - "Face for macros in macro-expanded code." - :group 'macrostep) - -(defface macrostep-compiler-macro-face - '((t :slant italic)) - "Face for compiler macros in macro-expanded code." - :group 'macrostep) - -(defcustom macrostep-expand-in-separate-buffer nil - "When non-nil, show expansions in a separate buffer instead of inline." - :group 'macrostep - :type 'boolean) - -(defcustom macrostep-expand-compiler-macros t - "When non-nil, expand compiler macros as well as `defmacro' and `macrolet' macros." - :group 'macrostep - :type 'boolean) - -;; Need the following for making the ring of faces -(defun macrostep-make-ring (&rest items) - "Make a ring containing all of ITEMS with no empty slots." - (let ((ring (make-ring (length items)))) - (mapc (lambda (item) (ring-insert ring item)) (reverse items)) - ring)) - -(defvar macrostep-gensym-faces - (macrostep-make-ring - 'macrostep-gensym-1 'macrostep-gensym-2 'macrostep-gensym-3 - 'macrostep-gensym-4 'macrostep-gensym-5) - "Ring of all macrostepper faces for fontifying gensyms.") - -;; Other modes can enable macrostep by redefining these functions to -;; language-specific versions. -(defvar macrostep-sexp-bounds-function - #'macrostep-sexp-bounds - "Function to return the bounds of the macro form nearest point. - -It will be called with no arguments and should return a cons of -buffer positions, (START . END). It should use `save-excursion' -to avoid changing the position of point. - -The default value, `macrostep-sexp-bounds', implements this for -Emacs Lisp, and may be suitable for other Lisp-like languages.") -(make-variable-buffer-local 'macrostep-sexp-bounds-function) - -(defvar macrostep-sexp-at-point-function - #'macrostep-sexp-at-point - "Function to return the macro form at point for expansion. - -It will be called with two arguments, the values of START and END -returned by `macrostep-sexp-bounds-function', and with point -positioned at START. It should return a value suitable for -passing as the first argument to `macrostep-expand-1-function'. - -The default value, `macrostep-sexp-at-point', implements this for -Emacs Lisp, and may be suitable for other Lisp-like languages.") -(make-variable-buffer-local 'macrostep-sexp-at-point-function) - -(defvar macrostep-environment-at-point-function - #'macrostep-environment-at-point - "Function to return the local macro-expansion environment at point. - -It will be called with no arguments, and should return a value -suitable for passing as the second argument to -`macrostep-expand-1-function'. - -The default value, `macrostep-environment-at-point', is specific -to Emacs Lisp. For languages which do not implement local -macro-expansion environments, this should be set to `ignore' -or `(lambda () nil)'.") -(make-variable-buffer-local 'macrostep-environment-at-point-function) - -(defvar macrostep-expand-1-function - #'macrostep-expand-1 - "Function to perform one step of macro-expansion. - -It will be called with two arguments, FORM and ENVIRONMENT, the -return values of `macrostep-sexp-at-point-function' and -`macrostep-environment-at-point-function' respectively. It -should return the result of expanding FORM by one step as a value -which is suitable for passing as the argument to -`macrostep-print-function'. - -The default value, `macrostep-expand-1', is specific to Emacs Lisp.") -(make-variable-buffer-local 'macrostep-expand-1-function) - -(defvar macrostep-print-function - #'macrostep-pp - "Function to pretty-print macro expansions. - -It will be called with two arguments, FORM and ENVIRONMENT, the -return values of `macrostep-sexp-at-point-function' and -`macrostep-environment-at-point-function' respectively. It -should insert a pretty-printed representation at point in the -current buffer, leaving point just after the inserted -representation, without altering any other text in the current -buffer. - -The default value, `macrostep-pp', is specific to Emacs Lisp.") -(make-variable-buffer-local 'macrostep-print-function) - -(defvar macrostep-macro-form-p-function - #'macrostep-macro-form-p - "Function to check whether a form is a macro call. - -It will be called with two arguments, FORM and ENVIRONMENT -- the -return values of `macrostep-sexp-at-point-function' and -`macrostep-environment-at-point-function' respectively -- and -should return non-nil if FORM would undergo macro-expansion in -ENVIRONMENT. - -This is called only from `macrostep-sexp-bounds', so it need not -be provided if a different value is used for -`macrostep-sexp-bounds-function'. - -The default value, `macrostep-macro-form-p', is specific to Emacs Lisp.") -(make-variable-buffer-local 'macrostep-macro-form-p-function) - - -;;; Define keymap and minor mode -(defvar macrostep-keymap - (let ((map (make-sparse-keymap))) - (define-key map (kbd "RET") 'macrostep-expand) - (define-key map "=" 'macrostep-expand) - (define-key map "e" 'macrostep-expand) - - (define-key map (kbd "DEL") 'macrostep-collapse) - (define-key map "u" 'macrostep-collapse) - (define-key map "c" 'macrostep-collapse) - - (define-key map (kbd "TAB") 'macrostep-next-macro) - (define-key map "n" 'macrostep-next-macro) - (define-key map (kbd "M-TAB") 'macrostep-prev-macro) - (define-key map "p" 'macrostep-prev-macro) - - (define-key map "q" 'macrostep-collapse-all) - (define-key map (kbd "C-c C-c") 'macrostep-collapse-all) - map) - "Keymap for `macrostep-mode'.") - -;;;###autoload -(define-minor-mode macrostep-mode - "Minor mode for inline expansion of macros in Emacs Lisp source buffers. - -\\Progressively expand macro forms with \\[macrostep-expand], collapse them with \\[macrostep-collapse], -and move back and forth with \\[macrostep-next-macro] and \\[macrostep-prev-macro]. -Use \\[macrostep-collapse-all] or collapse all visible expansions to -quit and return to normal editing. - -\\{macrostep-keymap}" - nil " Macro-Stepper" - :keymap macrostep-keymap - :group macrostep - (if macrostep-mode - (progn - ;; Disable recording of undo information - (setq macrostep-saved-undo-list buffer-undo-list - buffer-undo-list t) - ;; Remember whether buffer was read-only - (setq macrostep-saved-read-only buffer-read-only - buffer-read-only t) - ;; Set up post-command hook to bail out on leaving read-only - (add-hook 'post-command-hook 'macrostep-command-hook nil t) - (message - (substitute-command-keys - "\\Entering macro stepper mode. Use \\[macrostep-expand] to expand, \\[macrostep-collapse] to collapse, \\[macrostep-collapse-all] to exit."))) - - ;; Exiting mode - (if macrostep-expansion-buffer - ;; Kill dedicated expansion buffers - (quit-window t) - ;; Collapse any remaining overlays - (when macrostep-overlays (macrostep-collapse-all)) - ;; Restore undo info & read-only state - (setq buffer-undo-list macrostep-saved-undo-list - buffer-read-only macrostep-saved-read-only - macrostep-saved-undo-list nil) - ;; Remove our post-command hook - (remove-hook 'post-command-hook 'macrostep-command-hook t)))) - -;; Post-command hook: bail out of macrostep-mode if the user types C-x -;; C-q to make the buffer writable again. -(defun macrostep-command-hook () - (if (not buffer-read-only) - (macrostep-mode 0))) - - -;;; Interactive functions -;;;###autoload -(defun macrostep-expand (&optional toggle-separate-buffer) - "Expand the macro form following point by one step. - -Enters `macrostep-mode' if it is not already active, making the -buffer temporarily read-only. If macrostep-mode is active and the -form following point is not a macro form, search forward in the -buffer and expand the next macro form found, if any. - -With a prefix argument, the expansion is displayed in a separate -buffer instead of inline in the current buffer. Setting -`macrostep-expand-in-separate-buffer' to non-nil swaps these two -behaviors." - (interactive "P") - (cl-destructuring-bind (start . end) - (funcall macrostep-sexp-bounds-function) - (goto-char start) - (let* ((sexp (funcall macrostep-sexp-at-point-function start end)) - (end (copy-marker end)) - (text (buffer-substring start end)) - (env (funcall macrostep-environment-at-point-function)) - (expansion (funcall macrostep-expand-1-function sexp env))) - - ;; Create a dedicated macro-expansion buffer and copy the text to - ;; be expanded into it, if required - (let ((separate-buffer-p - (if toggle-separate-buffer - (not macrostep-expand-in-separate-buffer) - macrostep-expand-in-separate-buffer))) - (when (and separate-buffer-p (not macrostep-expansion-buffer)) - (let ((mode major-mode) - (buffer - (get-buffer-create (generate-new-buffer-name "*macro expansion*")))) - (set-buffer buffer) - (funcall mode) - (setq macrostep-expansion-buffer t) - (setq macrostep-outer-environment env) - (save-excursion - (setq start (point)) - (insert text) - (setq end (point-marker))) - (pop-to-buffer buffer)))) - - (unless macrostep-mode (macrostep-mode t)) - (let ((existing-overlay (macrostep-overlay-at-point)) - (macrostep-gensym-depth macrostep-gensym-depth) - (macrostep-gensyms-this-level nil) - priority) - (if existing-overlay - (progn ; Expanding part of a previous macro-expansion - (setq priority (1+ (overlay-get existing-overlay 'priority))) - (setq macrostep-gensym-depth - (overlay-get existing-overlay 'macrostep-gensym-depth))) - ;; Expanding source buffer text - (setq priority 1) - (setq macrostep-gensym-depth -1)) - - (with-silent-modifications - (atomic-change-group - (let ((inhibit-read-only t)) - (save-excursion - ;; Insert expansion - (funcall macrostep-print-function expansion env) - ;; Delete the original form - (macrostep-collapse-overlays-in (point) end) - (delete-region (point) end) - ;; Create a new overlay - (let* ((overlay - (make-overlay start - (if (looking-at "\n") - (1+ (point)) - (point)))) - (highlight-overlay (unless macrostep-expansion-buffer - (copy-overlay overlay)))) - (unless macrostep-expansion-buffer - ;; Highlight the overlay in original source buffers only - (overlay-put highlight-overlay 'face 'macrostep-expansion-highlight-face) - (overlay-put highlight-overlay 'priority -1) - (overlay-put overlay 'macrostep-highlight-overlay highlight-overlay)) - (overlay-put overlay 'priority priority) - (overlay-put overlay 'macrostep-original-text text) - (overlay-put overlay 'macrostep-gensym-depth macrostep-gensym-depth) - (push overlay macrostep-overlays)))))))))) - -(defun macrostep-collapse () - "Collapse the innermost macro expansion near point to its source text. - -If no more macro expansions are visible after this, exit -`macrostep-mode'." - (interactive) - (let ((overlay (macrostep-overlay-at-point))) - (when (not overlay) (error "No macro expansion at point")) - (let ((inhibit-read-only t)) - (with-silent-modifications - (atomic-change-group - (macrostep-collapse-overlay overlay))))) - (if (not macrostep-overlays) - (macrostep-mode 0))) - -(defun macrostep-collapse-all () - "Collapse all visible macro expansions and exit `macrostep-mode'." - (interactive) - (let ((inhibit-read-only t)) - (with-silent-modifications - (dolist (overlay macrostep-overlays) - (let ((outermost (= (overlay-get overlay 'priority) 1))) - ;; We only need restore the original text for the outermost - ;; overlays - (macrostep-collapse-overlay overlay (not outermost)))))) - (setq macrostep-overlays nil) - (macrostep-mode 0)) - -(defun macrostep-next-macro () - "Move point forward to the next macro form in macro-expanded text." - (interactive) - (let* ((start - (if (get-text-property (point) 'macrostep-macro-start) - (1+ (point)) - (point))) - (next (next-single-property-change start 'macrostep-macro-start))) - (if next - (goto-char next) - (error "No more macro forms found")))) - -(defun macrostep-prev-macro () - "Move point back to the previous macro form in macro-expanded text." - (interactive) - (let (prev) - (save-excursion - (while - (progn - (setq prev - (previous-single-property-change (point) 'macrostep-macro-start)) - (if (or (not prev) - (get-text-property (1- prev) 'macrostep-macro-start)) - nil - (prog1 t (goto-char prev)))))) - (if prev - (goto-char (1- prev)) - (error "No previous macro form found")))) - - -;;; Utility functions (not language-specific) - -(defun macrostep-overlay-at-point () - "Return the innermost macro stepper overlay at point." - (let ((result - (get-char-property-and-overlay (point) 'macrostep-original-text))) - (cdr result))) - -(defun macrostep-collapse-overlay (overlay &optional no-restore-p) - "Collapse a macro-expansion overlay and restore the unexpanded source text. - -As a minor optimization, does not restore the original source -text if NO-RESTORE-P is non-nil. This is safe to do when -collapsing all the sub-expansions of an outer overlay, since the -outer overlay will restore the original source itself. - -Also removes the overlay from `macrostep-overlays'." - (with-current-buffer (overlay-buffer overlay) - ;; If we're cleaning up we don't need to bother restoring text - ;; or checking for inner overlays to delete - (unless no-restore-p - (let* ((start (overlay-start overlay)) - (end (overlay-end overlay)) - (text (overlay-get overlay 'macrostep-original-text)) - (sexp-end - (copy-marker - (if (equal (char-before end) ?\n) (1- end) end)))) - (macrostep-collapse-overlays-in start end) - (goto-char (overlay-start overlay)) - (save-excursion - (insert text) - (delete-region (point) sexp-end)))) - ;; Remove overlay from the list and delete it - (setq macrostep-overlays - (delq overlay macrostep-overlays)) - (let ((highlight-overlay (overlay-get overlay 'macrostep-highlight-overlay))) - (when highlight-overlay (delete-overlay highlight-overlay))) - (delete-overlay overlay))) - -(defun macrostep-collapse-overlays-in (start end) - "Collapse all macrostepper overlays that are strictly between START and END. - -Will not collapse overlays that begin at START and end at END." - (dolist (ol (overlays-in start end)) - (when (and (overlay-buffer ol) ; collapsing may delete other overlays - (> (overlay-start ol) start) - (< (overlay-end ol) end) - (overlay-get ol 'macrostep-original-text)) - (macrostep-collapse-overlay ol t)))) - - -;;; Emacs Lisp implementation - -(defun macrostep-sexp-bounds () - "Find the bounds of the macro form nearest point. - -If point is not before an open-paren, moves up to the nearest -enclosing list. If the form at point is not a macro call, -attempts to move forward to the next macro form as determined by -`macrostep-macro-form-p-function'. - -Returns a cons of buffer positions, (START . END)." - (save-excursion - (if (not (looking-at "[(`]")) - (backward-up-list 1)) - (if (equal (char-before) ?`) - (backward-char)) - (let ((sexp (funcall macrostep-sexp-at-point-function)) - (env (funcall macrostep-environment-at-point-function))) - ;; If this isn't a macro form, try to find the next one in the buffer - (unless (funcall macrostep-macro-form-p-function sexp env) - (condition-case nil - (macrostep-next-macro) - (error - (if (consp sexp) - (error "(%s ...) is not a macro form" (car sexp)) - (error "Text at point is not a macro form.")))))) - (cons (point) (scan-sexps (point) 1)))) - -(defun macrostep-sexp-at-point (&rest ignore) - "Return the sexp near point for purposes of macro-stepper expansion. - -If the sexp near point is part of a macro expansion, returns the -saved text of the macro expansion, and does not read from the -buffer. This preserves uninterned symbols in the macro -expansion, so that they can be fontified consistently. (See -`macrostep-print-sexp'.)" - (or (get-text-property (point) 'macrostep-expanded-text) - (sexp-at-point))) - -(defun macrostep-macro-form-p (form environment) - "Return non-nil if FORM would be evaluated via macro expansion. - -If FORM is an invocation of a macro defined by `defmacro' or an -enclosing `cl-macrolet' form, return the symbol `macro'. - -If `macrostep-expand-compiler-macros' is non-nil and FORM is a -call to a function with a compiler macro, return the symbol -`compiler-macro'. - -Otherwise, return nil." - (car (macrostep--macro-form-info form environment t))) - -(defun macrostep--macro-form-info (form environment &optional inhibit-autoload) - "Return information about macro definitions that apply to FORM. - -If no macros are involved in the evaluation of FORM within -ENVIRONMENT, returns nil. Otherwise, returns a cons (TYPE -. DEFINITION). - -If FORM would be evaluated by a macro defined by `defmacro', -`cl-macrolet', etc., TYPE is the symbol `macro' and DEFINITION is -the macro definition, as a function. - -If `macrostep-expand-compiler-macros' is non-nil and FORM would -be compiled using a compiler macro, TYPE is the symbol -`compiler-macro' and DEFINITION is the function that implements -the compiler macro. - -If FORM is an invocation of an autoloaded macro, the behavior -depends on the value of INHIBIT-AUTOLOAD. If INHIBIT-AUTOLOAD is -nil, the file containing the macro definition will be loaded -using `load-library' and the macro definition returned as normal. -If INHIBIT-AUTOLOAD is non-nil, no files will be loaded, and the -value of DEFINITION in the result will be nil." - (if (not (and (consp form) - (symbolp (car form)))) - `(nil . nil) - (let* ((head (car form)) - (local-definition (assoc-default head environment #'eq))) - (if local-definition - `(macro . ,local-definition) - (let ((compiler-macro-definition - (and macrostep-expand-compiler-macros - (or (get head 'compiler-macro) - (get head 'cl-compiler-macro))))) - (if (and compiler-macro-definition - (not (eq form - (apply compiler-macro-definition form (cdr form))))) - `(compiler-macro . ,compiler-macro-definition) - (condition-case nil - (let ((fun (indirect-function head))) - (cl-case (car-safe fun) - ((macro) - `(macro . ,(cdr fun))) - ((autoload) - (when (memq (nth 4 fun) '(macro t)) - (if inhibit-autoload - `(macro . nil) - (load-library (nth 1 fun)) - (macrostep--macro-form-info form nil)))) - (t - `(nil . nil)))) - (void-function nil)))))))) - -(defun macrostep-expand-1 (form environment) - "Return result of macro-expanding the top level of FORM by exactly one step. -Unlike `macroexpand', this function does not continue macro -expansion until a non-macro-call results." - (cl-destructuring-bind (type . definition) - (macrostep--macro-form-info form environment) - (cl-ecase type - ((nil) - form) - ((macro) - (apply definition (cdr form))) - ((compiler-macro) - (let ((expansion - (apply definition form (cdr form)))) - (if (equal form expansion) - (error "Form left unchanged by compiler macro") - expansion)))))) - -(put 'macrostep-grab-environment-failed 'error-conditions - '(macrostep-grab-environment-failed error)) - -(defun macrostep-environment-at-point () - "Return the local macro-expansion environment at point, if any. - -The local environment includes macros declared by any `macrolet' -or `cl-macrolet' forms surrounding point, as well as by any macro -forms which expand into a `macrolet'. - -The return value is an alist of elements (NAME . FUNCTION), where -NAME is the symbol locally bound to the macro and FUNCTION is the -lambda expression that returns its expansion." - ;; If point is on a macro form within an expansion inserted by - ;; `macrostep-print-sexp', a local environment may have been - ;; previously saved as a text property. - (let ((saved-environment - (get-text-property (point) 'macrostep-environment))) - (if saved-environment - saved-environment - ;; Otherwise, we (ab)use the macro-expander to return the - ;; environment at point. If point is not at an evaluated - ;; position in the containing form, - ;; `macrostep-environment-at-point-1' will raise an error, and - ;; we back up progressively through the containing forms until - ;; it succeeds. - (save-excursion - (catch 'done - (while t - (condition-case nil - (throw 'done (macrostep-environment-at-point-1)) - (macrostep-grab-environment-failed - (condition-case nil - (backward-sexp) - (scan-error (backward-up-list))))))))))) - -(defun macrostep-environment-at-point-1 () - "Attempt to extract the macro environment that would be active at point. - -If point is not at an evaluated position within the containing -form, raise an error." - ;; Macro environments are extracted using Emacs Lisp's builtin - ;; macro-expansion machinery. The form containing point is copied - ;; to a temporary buffer, and a call to - ;; `--macrostep-grab-environment--' is inserted at point. This - ;; altered form is then fully macro-expanded, in an environment - ;; where `--macrostep-grab-environment--' is defined as a macro - ;; which throws the environment to a uniquely-generated tag. - (let* ((point-at-top-level - (save-excursion - (while (ignore-errors (backward-up-list) t)) - (point))) - (enclosing-form - (buffer-substring point-at-top-level - (scan-sexps point-at-top-level 1))) - (position (- (point) point-at-top-level)) - (tag (make-symbol "macrostep-grab-environment-tag")) - (grab-environment '--macrostep-grab-environment--)) - (if (= position 0) - nil - (with-temp-buffer - (emacs-lisp-mode) - (insert enclosing-form) - (goto-char (+ (point-min) position)) - (prin1 `(,grab-environment) (current-buffer)) - (let ((form (read (copy-marker (point-min))))) - (catch tag - (cl-letf (((symbol-function #'message) (symbol-function #'format))) - (with-no-warnings - (ignore-errors - (macroexpand-all - `(cl-macrolet ((,grab-environment (&environment env) - (throw ',tag env))) - ,form))))) - (signal 'macrostep-grab-environment-failed nil))))))) - -(defun macrostep-collect-macro-forms (form &optional environment) - "Identify sub-forms of FORM which undergo macro-expansion. - -FORM is an Emacs Lisp form. ENVIRONMENT is a local environment of -macro definitions. - -The return value is a list of two elements, (MACRO-FORM-ALIST -COMPILER-MACRO-FORMS). - -MACRO-FORM-ALIST is an alist of elements of the form (SUBFORM -. ENVIRONMENT), where SUBFORM is a form which undergoes -macro-expansion in the course of expanding FORM, and ENVIRONMENT -is the local macro environment in force when it is expanded. - -COMPILER-MACRO-FORMS is a list of subforms which would be -compiled using a compiler macro. Since there is no standard way -to provide a local compiler-macro definition in Emacs Lisp, no -corresponding local environments are collected for these. - -Forms and environments are extracted from FORM by instrumenting -Emacs's builtin `macroexpand' function and calling -`macroexpand-all'." - (let ((real-macroexpand (indirect-function #'macroexpand)) - (macro-form-alist '()) - (compiler-macro-forms '())) - (cl-letf - (((symbol-function #'macroexpand) - (lambda (form environment &rest args) - (let ((expansion - (apply real-macroexpand form environment args))) - (cond ((not (eq expansion form)) - (setq macro-form-alist - (cons (cons form environment) - macro-form-alist))) - ((and (consp form) - (symbolp (car form)) - macrostep-expand-compiler-macros - (not (eq form - (cl-compiler-macroexpand form)))) - (setq compiler-macro-forms - (cons form compiler-macro-forms)))) - expansion)))) - (ignore-errors - (macroexpand-all form environment))) - (list macro-form-alist compiler-macro-forms))) - -(defvar macrostep-collected-macro-form-alist nil - "An alist of macro forms and environments. -Controls the printing of sub-forms in `macrostep-print-sexp'.") - -(defvar macrostep-collected-compiler-macro-forms nil - "A list of compiler-macro forms to be highlighted in `macrostep-print-sexp'.") - -(defun macrostep-pp (sexp environment) - "Pretty-print SEXP, fontifying macro forms and uninterned symbols." - (cl-destructuring-bind - (macrostep-collected-macro-form-alist - macrostep-collected-compiler-macro-forms) - (macrostep-collect-macro-forms sexp environment) - (let ((print-quoted t)) - (macrostep-print-sexp sexp) - ;; Point is now after the expanded form; pretty-print it - (save-restriction - (narrow-to-region (scan-sexps (point) -1) (point)) - (save-excursion - (pp-buffer) - ;; Remove the extra newline inserted by pp-buffer - (goto-char (point-max)) - (delete-region - (point) - (save-excursion (skip-chars-backward " \t\n") (point)))) - ;; Indent the newly-inserted form in context - (widen) - (save-excursion - (backward-sexp) - (indent-sexp)))))) - -;; This must be defined before `macrostep-print-sexp': -(defmacro macrostep-propertize (form &rest plist) - "Evaluate FORM, applying syntax properties in PLIST to any inserted text." - (declare (indent 1) - (debug (&rest form))) - (let ((start (make-symbol "start"))) - `(let ((,start (point))) - (prog1 - ,form - ,@(cl-loop for (key value) on plist by #'cddr - collect `(put-text-property ,start (point) - ,key ,value)))))) - -(defun macrostep-print-sexp (sexp) - "Insert SEXP like `print', fontifying macro forms and uninterned symbols. - -Fontifies uninterned symbols and macro forms using -`font-lock-face' property, and saves the actual text of SEXP's -sub-forms as the `macrostep-expanded-text' text property so that -any uninterned symbols can be reused in macro expansions of the -sub-forms. See also `macrostep-sexp-at-point'. - -Macro and compiler-macro forms within SEXP are identified by -comparison with the `macrostep-collected-macro-form-alist' and -`macrostep-collected-compiler-macro-forms' variables, which -should be dynamically let-bound around calls to this function." - (cond - ((symbolp sexp) - ;; Fontify gensyms - (if (not (eq sexp (intern-soft (symbol-name sexp)))) - (macrostep-propertize - (prin1 sexp (current-buffer)) - 'font-lock-face (macrostep-get-gensym-face sexp)) - ;; Print other symbols as normal - (prin1 sexp (current-buffer)))) - - ((listp sexp) - ;; Print quoted and quasiquoted forms nicely. - (let ((head (car sexp))) - (cond ((and (eq head 'quote) ; quote - (= (length sexp) 2)) - (insert "'") - (macrostep-print-sexp (cadr sexp))) - - ((and (eq head '\`) ; backquote - (= (length sexp) 2)) - (if (assq sexp macrostep-collected-macro-form-alist) - (macrostep-propertize - (insert "`") - 'macrostep-expanded-text sexp - 'macrostep-macro-start t - 'font-lock-face 'macrostep-macro-face) - (insert "`")) - (macrostep-print-sexp (cadr sexp))) - - ((and (memq head '(\, \,@)) ; unquote - (= (length sexp) 2)) - (princ head (current-buffer)) - (macrostep-print-sexp (cadr sexp))) - - (t ; other list form - (cl-destructuring-bind (macro? . environment) - (or (assq sexp macrostep-collected-macro-form-alist) - '(nil . nil)) - (let - ((compiler-macro? - (memq sexp macrostep-collected-compiler-macro-forms))) - (if (or macro? compiler-macro?) - (progn - ;; Save the real expansion as a text property on the - ;; opening paren - (macrostep-propertize - (insert "(") - 'macrostep-macro-start t - 'macrostep-expanded-text sexp - 'macrostep-environment environment) - ;; Fontify the head of the macro - (macrostep-propertize - (macrostep-print-sexp head) - 'font-lock-face - (if macro? - 'macrostep-macro-face - 'macrostep-compiler-macro-face))) - ;; Not a macro form - (insert "(") - (macrostep-print-sexp head)))) - - ;; Print remaining list elements - (setq sexp (cdr sexp)) - (when sexp (insert " ")) - (while sexp - (if (listp sexp) - (progn - (macrostep-print-sexp (car sexp)) - (when (cdr sexp) (insert " ")) - (setq sexp (cdr sexp))) - ;; Print tail of dotted list - (insert ". ") - (macrostep-print-sexp sexp) - (setq sexp nil))) - (insert ")"))))) - - ;; Print everything except symbols and lists as normal - (t (prin1 sexp (current-buffer))))) - -(defun macrostep-get-gensym-face (symbol) - "Return the face to use in fontifying SYMBOL in printed macro expansions. - -All symbols introduced in the same level of macro expansion are -fontified using the same face (modulo the number of faces; see -`macrostep-gensym-faces')." - (or (get symbol 'macrostep-gensym-face) - (progn - (if (not macrostep-gensyms-this-level) - (setq macrostep-gensym-depth (1+ macrostep-gensym-depth) - macrostep-gensyms-this-level t)) - (let ((face (ring-ref macrostep-gensym-faces macrostep-gensym-depth))) - (put symbol 'macrostep-gensym-face face) - face)))) - - -(provide 'macrostep) - -;;; macrostep.el ends here diff --git a/elpa/macrostep-20161120.2106/macrostep.elc b/elpa/macrostep-20161120.2106/macrostep.elc deleted file mode 100644 index 6086cedc189a17521fd51eb774e249c515a3e1f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28992 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 U79A!UW!Z(DAvjhZF#KP6z@K>z>% diff --git a/elpa/magit-20200418.939/AUTHORS.md b/elpa/magit-20200418.939/AUTHORS.md deleted file mode 100644 index 84141597..00000000 --- a/elpa/magit-20200418.939/AUTHORS.md +++ /dev/null @@ -1,347 +0,0 @@ -Authors -======= - -The following people have contributed to Magit, including the -libraries `git-commit.el`, `magit-popup.el`, and `with-editor.el` -which are distributed as separate Elpa packages. - -For statistics see https://magit.vc/stats/authors.html. - -Names below are sorted alphabetically. - -Author ------- - -- Marius Vollmer - -Maintainer ----------- - -- Jonas Bernoulli - -Developers ----------- - -- Kyle Meyer -- Noam Postavsky - -Retired Maintainers and Developers ----------------------------------- - -- Nicolas Dudebout -- Peter J. Weisberg -- Pieter Praet -- Phil Jackson -- Rémi Vanicat -- Yann Hodique - -Contributors ------------- - -- Aaron Culich -- Aaron Madlon-Kay -- Abdo Roig-Maranges -- Adam Benanti <0entropy@protonmail.com> -- Adam Kruszewski -- Adam Porter -- Adam Spiers -- Adeodato Simó -- Ævar Arnfjörð Bjarmason -- Alan Falloon -- Alban Gruin -- Aleksey Uimanov -- Alexander Gramiak -- Alexander Miller -- Alex Branham -- Alex Dunn -- Alexey Voinov -- Alex Kost -- Alex Ott -- Allen -- Allen Li -- Andreas Fuchs -- Andreas Liljeqvist -- Andreas Rottmann -- Andrei Chițu -- Andrew Eggenberger -- Andrew Kirkpatrick -- Andrew Schwartzmeyer -- Andrey Smirnov -- Andriy Kmit' -- Andy Sawyer -- Aria Edmonds -- Arialdo Martini -- Arnau Roig Ninerola -- Barak A. Pearlmutter -- Bar Magal -- Bart Bakker -- Basil L. Contovounesios -- Bastian Beischer -- Benjamin Motz -- Ben North -- Ben Walton -- Bob Uhl -- Bradley Wright -- Brandon W Maister -- Brian Warner -- Bryan Shell -- Buster Copley -- Carl Lieberman -- Chillar Anand -- Chris Bernard -- Chris Done -- Chris LaRose -- Chris Moore -- Chris Ring -- Chris Shoemaker -- Christian Dietrich -- Christian Kluge -- Christophe Junke -- Christopher Monsanto -- Clément Pit-Claudel -- Cornelius Mika -- Craig Andera -- Dale Hagglund -- Damien Cassou -- Dan Erikson -- Daniel Brockman -- Daniel Farina -- Daniel Gröber -- Daniel Hackney -- Daniel Kraus -- Daniel Mai -- Daniel Martín -- Dan LaManna -- Danny Zhu -- Dato Simó -- David Abrahams -- David Ellison -- David Ellison -- David Hull -- David L. Rager -- David Wallin -- Dean Kariniemi <8913263+d3k4r@users.noreply.github.com> -- Dennis Paskorz -- Divye Kapoor -- Dominique Quatravaux -- Dominique Quatravaux -- Duianto Vebotci -- Eli Barzilay -- Eric Davis -- Eric Prud'hommeaux -- Eric Schulte -- Erik Anderson -- Evan Torrie -- Evgkeni Sampelnikof -- Eyal Lotem -- Fabian Wiget -- Felix Geller -- Felix Yan -- Feng Li -- Florian Ragwitz -- Fritz Grabo -- Fritz Stelzer -- Geoff Shannon -- George Kadianakis -- Graham Clark -- Graham Dobbins -- Greg A. Woods -- Greg Lucas -- Greg Sexton -- Guillaume Martres -- Hannu Koivisto -- Hans-Peter Deifel -- Hussein Ait-Lahcen -- Ian Eure -- Ingo Lohmar -- Ioan-Adrian Ratiu -- Ivan Brennan -- Jan Tatarik -- Jasper St. Pierre -- Jeff Bellegarde -- Jeff Dairiki -- Jeremy Meng -- Jesse Alama -- Jim Blandy -- Joakim Jalap -- Johannes Altmanninger -- Johann Klähn -- John Mastro -- John Morris -- John Wiegley -- Jonas Bernoulli -- Jonathan Arnett -- Jonathan Leech-Pepin -- Jonathan Roes -- Jon Vanderwijk -- Jordan Galby -- Jordan Greenberg -- Josh Elsasser -- Josiah Schwab -- Julien Danjou -- Justin Burkett -- Justin Caratzas -- Justin Guenther -- Justin Thomas -- Kan-Ru Chen -- Kenny Ballou -- Keshav Kini -- Kevin Brubeck Unhammer -- Kevin J. Foley -- Kévin Le Gouguec -- Kimberly Wolk -- Knut Olav Bøhmer -- Kyle Meyer -- Laurent Laffont -- Laverne Schrock -- Leandro Facchinetti -- Lele Gaifax -- Leo Liu -- Leonardo Etcheverry -- Lingchao Xin -- Li-Yun Chang -- Lluís Vilanova -- Loic Dachary -- Louis Roché -- Luís Oliveira -- Luke Amdor -- Magnus Malm -- Mak Kolybabi -- Manuel Vázquez Acosta -- Marcel Wolf -- Marc Herbert -- Marcin Bachry -- Marco Craveiro -- Marco Wahl -- Marc Sherry -- Marian Schubert -- Mario Rodas -- Marius Vollmer -- Mark Hepburn -- Mark Karpov -- Mark Oteiza -- Matthew Fluet -- Matthieu Hauglustaine -- Matus Goljer -- Michael Fogleman -- Michael Griffiths -- Michael Heerdegen -- Michal Sojka -- Miciah Masters -- Miles Bader -- Miloš Mošić -- Mitchel Humpherys -- Moritz Bunkus -- Naoya Yamashita -- Natalie Weizenbaum -- Nguyễn Tuấn Anh -- Nic Ferier -- Nick Alcock -- Nick Alexander -- Nick Dimiduk -- Nicklas Lindgren -- Nicolas Dudebout -- Nicolas Petton -- Nicolas Richard -- Nikolay Martynov -- Noam Postavsky -- N. Troy de Freitas -- Ole Arndt -- Oleh Krehel -- Orivej Desh -- Óscar Fuentes -- Paul Stadig -- Pavel Holejsovsky -- Pekka Pessi -- Peter Eisentraut -- Peter Jaros -- Peter J. Weisberg -- Peter Vasil -- Philippe Vaucher -- Philipp Haselwarter -- Philipp Stephani -- Philip Weaver -- Phil Jackson -- Phil Sainty -- Pierre Neidhardt -- Pieter Praet -- Prathamesh Sonpatki -- rabio -- Radon Rosborough -- Rafael Laboissiere -- Raimon Grau -- Ramkumar Ramachandra -- Remco van 't Veer -- Rémi Vanicat -- René Stadler -- Richard Kim -- Robert Boone -- Robin Green -- Roey Darwish Dror -- Roger Crew -- Romain Francoise -- Ron Parker -- Roy Crihfield -- Rüdiger Sonderfeld -- Russell Black -- Ryan C. Thompson -- Samuel Bronson -- Samuel W. Flint -- Sanjoy Das -- Sean Allred -- Sean Bryant -- Sean Whitton -- Sebastian Wiesner -- Sébastien Gross -- Seong-Kook Shin -- Sergey Pashinin -- Sergey Vinokurov -- Servilio Afre Puentes -- Silent Sphere -- Štěpán Němec -- Steven Chow -- Steven E. Harris -- Steven Thomas -- Steven Vancoillie -- Steve Purcell -- Suhail Shergill -- Sylvain Rousseau -- Syohei Yoshida -- Takafumi Arakaki -- Tassilo Horn -- Teemu Likonen -- Teruki Shigitani -- Thierry Volpiatto -- Thomas A Caswell -- Thomas Fini Hansen -- Thomas Frössman -- Thomas Jost -- Thomas Riccardi -- Tibor Simko -- Timo Juhani Lindfors -- Tim Perkins -- Tim Wraight -- Ting-Yu Lin -- Tom Feist -- Topi Miettinen -- Troy Hinckley -- Tsuyoshi Kitamoto -- Tunc Uzlu -- Vineet Naik -- Vitaly Ostashov -- Vladimir Panteleev -- Wei Huang -- Wilfred Hughes -- Win Treese -- Wouter Bolsterlee -- Xavier Noria -- Xu Chunyang -- Yann Hodique -- Ynilu -- York Zhao -- Yuichi Higashi -- Yuri Khan -- Zach Latta -- zakora -- Zhu Zihao -- zilongshanren diff --git a/elpa/magit-20200418.939/LICENSE b/elpa/magit-20200418.939/LICENSE deleted file mode 100644 index 44325404..00000000 --- a/elpa/magit-20200418.939/LICENSE +++ /dev/null @@ -1,676 +0,0 @@ - - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - diff --git a/elpa/magit-20200418.939/dir b/elpa/magit-20200418.939/dir deleted file mode 100644 index dfdbd715..00000000 --- a/elpa/magit-20200418.939/dir +++ /dev/null @@ -1,18 +0,0 @@ -This is the file .../info/dir, which contains the -topmost node of the Info hierarchy, called (dir)Top. -The first time you invoke Info you start off looking at this node. - -File: dir, Node: Top This is the top of the INFO tree - - This (the Directory node) gives a menu of major topics. - Typing "q" exits, "H" lists all Info commands, "d" returns here, - "h" gives a primer for first-timers, - "mEmacs" visits the Emacs manual, etc. - - In Emacs, you can click mouse button 2 on a menu item or cross reference - to select it. - -* Menu: - -Emacs -* Magit: (magit). Using Git from Emacs with Magit. diff --git a/elpa/magit-20200418.939/git-rebase.el b/elpa/magit-20200418.939/git-rebase.el deleted file mode 100644 index 4ca8e9b5..00000000 --- a/elpa/magit-20200418.939/git-rebase.el +++ /dev/null @@ -1,804 +0,0 @@ -;;; git-rebase.el --- Edit Git rebase files -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Phil Jackson -;; Maintainer: Jonas Bernoulli - -;; This file is not part of GNU Emacs. - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this file. If not, see . - -;;; Commentary: - -;; This package assists the user in editing the list of commits to be -;; rewritten during an interactive rebase. - -;; When the user initiates an interactive rebase, e.g. using "r e" in -;; a Magit buffer or on the command line using "git rebase -i REV", -;; Git invokes the `$GIT_SEQUENCE_EDITOR' (or if that is undefined -;; `$GIT_EDITOR' or even `$EDITOR') letting the user rearrange, drop, -;; reword, edit, and squash commits. - -;; This package provides the major-mode `git-rebase-mode' which makes -;; doing so much more fun, by making the buffer more colorful and -;; providing the following commands: -;; -;; C-c C-c Tell Git to make it happen. -;; C-c C-k Tell Git that you changed your mind, i.e. abort. -;; -;; p Move point to previous line. -;; n Move point to next line. -;; -;; M-p Move the commit at point up. -;; M-n Move the commit at point down. -;; -;; k Drop the commit at point. -;; c Don't drop the commit at point. -;; r Change the message of the commit at point. -;; e Edit the commit at point. -;; s Squash the commit at point, into the one above. -;; f Like "s" but don't also edit the commit message. -;; b Break for editing at this point in the sequence. -;; x Add a script to be run with the commit at point -;; being checked out. -;; z Add noop action at point. -;; -;; SPC Show the commit at point in another buffer. -;; RET Show the commit at point in another buffer and -;; select its window. -;; C-/ Undo last change. -;; -;; Commands for --rebase-merges: -;; l Associate label with current HEAD in sequence. -;; MM Merge specified revisions into HEAD. -;; Mt Toggle whether the merge will invoke an editor -;; before committing. -;; t Reset HEAD to the specified label. - -;; You should probably also read the `git-rebase' manpage. - -;;; Code: - -(require 'dash) -(require 'easymenu) -(require 'server) -(require 'with-editor) -(require 'magit) - -(and (require 'async-bytecomp nil t) - (let ((pkgs (bound-and-true-p async-bytecomp-allowed-packages))) - (if (consp pkgs) - (cl-intersection '(all magit) pkgs) - (memq pkgs '(all t)))) - (fboundp 'async-bytecomp-package-mode) - (async-bytecomp-package-mode 1)) - -(eval-when-compile (require 'recentf)) - -;;; Options -;;;; Variables - -(defgroup git-rebase nil - "Edit Git rebase sequences." - :link '(info-link "(magit)Editing Rebase Sequences") - :group 'tools) - -(defcustom git-rebase-auto-advance t - "Whether to move to next line after changing a line." - :group 'git-rebase - :type 'boolean) - -(defcustom git-rebase-show-instructions t - "Whether to show usage instructions inside the rebase buffer." - :group 'git-rebase - :type 'boolean) - -(defcustom git-rebase-confirm-cancel t - "Whether confirmation is required to cancel." - :group 'git-rebase - :type 'boolean) - -;;;; Faces - -(defgroup git-rebase-faces nil - "Faces used by Git-Rebase mode." - :group 'faces - :group 'git-rebase) - -(defface git-rebase-hash '((t (:inherit magit-hash))) - "Face for commit hashes." - :group 'git-rebase-faces) - -(defface git-rebase-label '((t (:inherit magit-refname))) - "Face for labels in label, merge, and reset lines." - :group 'git-rebase-faces) - -(defface git-rebase-description nil - "Face for commit descriptions." - :group 'git-rebase-faces) - -(defface git-rebase-killed-action - '((t (:inherit font-lock-comment-face :strike-through t))) - "Face for commented commit action lines." - :group 'git-rebase-faces) - -(defface git-rebase-comment-hash - '((t (:inherit git-rebase-hash :weight bold))) - "Face for commit hashes in commit message comments." - :group 'git-rebase-faces) - -(defface git-rebase-comment-heading - '((t :inherit font-lock-keyword-face)) - "Face for headings in rebase message comments." - :group 'git-commit-faces) - -;;; Keymaps - -(defvar git-rebase-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map special-mode-map) - (define-key map (kbd "C-m") 'git-rebase-show-commit) - (define-key map (kbd "p") 'git-rebase-backward-line) - (define-key map (kbd "n") 'forward-line) - (define-key map (kbd "M-p") 'git-rebase-move-line-up) - (define-key map (kbd "M-n") 'git-rebase-move-line-down) - (define-key map (kbd "c") 'git-rebase-pick) - (define-key map (kbd "k") 'git-rebase-kill-line) - (define-key map (kbd "C-k") 'git-rebase-kill-line) - (define-key map (kbd "b") 'git-rebase-break) - (define-key map (kbd "e") 'git-rebase-edit) - (define-key map (kbd "l") 'git-rebase-label) - (define-key map (kbd "MM") 'git-rebase-merge) - (define-key map (kbd "Mt") 'git-rebase-merge-toggle-editmsg) - (define-key map (kbd "m") 'git-rebase-edit) - (define-key map (kbd "f") 'git-rebase-fixup) - (define-key map (kbd "q") 'undefined) - (define-key map (kbd "r") 'git-rebase-reword) - (define-key map (kbd "w") 'git-rebase-reword) - (define-key map (kbd "s") 'git-rebase-squash) - (define-key map (kbd "t") 'git-rebase-reset) - (define-key map (kbd "x") 'git-rebase-exec) - (define-key map (kbd "y") 'git-rebase-insert) - (define-key map (kbd "z") 'git-rebase-noop) - (define-key map (kbd "SPC") 'git-rebase-show-or-scroll-up) - (define-key map (kbd "DEL") 'git-rebase-show-or-scroll-down) - (define-key map (kbd "C-x C-t") 'git-rebase-move-line-up) - (define-key map [M-up] 'git-rebase-move-line-up) - (define-key map [M-down] 'git-rebase-move-line-down) - (define-key map [remap undo] 'git-rebase-undo) - map) - "Keymap for Git-Rebase mode.") - -(put 'git-rebase-reword :advertised-binding (kbd "r")) -(put 'git-rebase-move-line-up :advertised-binding (kbd "M-p")) -(put 'git-rebase-kill-line :advertised-binding (kbd "k")) - -(easy-menu-define git-rebase-mode-menu git-rebase-mode-map - "Git-Rebase mode menu" - '("Rebase" - ["Pick" git-rebase-pick t] - ["Reword" git-rebase-reword t] - ["Edit" git-rebase-edit t] - ["Squash" git-rebase-squash t] - ["Fixup" git-rebase-fixup t] - ["Kill" git-rebase-kill-line t] - ["Noop" git-rebase-noop t] - ["Execute" git-rebase-exec t] - ["Move Down" git-rebase-move-line-down t] - ["Move Up" git-rebase-move-line-up t] - "---" - ["Cancel" with-editor-cancel t] - ["Finish" with-editor-finish t])) - -(defvar git-rebase-command-descriptions - '((with-editor-finish . "tell Git to make it happen") - (with-editor-cancel . "tell Git that you changed your mind, i.e. abort") - (git-rebase-backward-line . "move point to previous line") - (forward-line . "move point to next line") - (git-rebase-move-line-up . "move the commit at point up") - (git-rebase-move-line-down . "move the commit at point down") - (git-rebase-show-or-scroll-up . "show the commit at point in another buffer") - (git-rebase-show-commit - . "show the commit at point in another buffer and select its window") - (undo . "undo last change") - (git-rebase-kill-line . "drop the commit at point") - (git-rebase-insert . "insert a line for an arbitrary commit") - (git-rebase-noop . "add noop action at point"))) - -;;; Commands - -(defun git-rebase-pick () - "Use commit on current line." - (interactive) - (git-rebase-set-action "pick")) - -(defun git-rebase-reword () - "Edit message of commit on current line." - (interactive) - (git-rebase-set-action "reword")) - -(defun git-rebase-edit () - "Stop at the commit on the current line." - (interactive) - (git-rebase-set-action "edit")) - -(defun git-rebase-squash () - "Meld commit on current line into previous commit, edit message." - (interactive) - (git-rebase-set-action "squash")) - -(defun git-rebase-fixup () - "Meld commit on current line into previous commit, discard its message." - (interactive) - (git-rebase-set-action "fixup")) - -(defvar-local git-rebase-comment-re nil) - -(defvar git-rebase-short-options - '((?b . "break") - (?e . "edit") - (?f . "fixup") - (?l . "label") - (?m . "merge") - (?p . "pick") - (?r . "reword") - (?s . "squash") - (?t . "reset") - (?x . "exec")) - "Alist mapping single key of an action to the full name.") - -(defclass git-rebase-action () - (;; action-type: commit, exec, bare, label, merge - (action-type :initarg :action-type :initform nil) - ;; Examples for each action type: - ;; | action | action options | target | trailer | - ;; |--------+----------------+---------+---------| - ;; | pick | | hash | subject | - ;; | exec | | command | | - ;; | noop | | | | - ;; | reset | | name | subject | - ;; | merge | -C hash | name | subject | - (action :initarg :action :initform nil) - (action-options :initarg :action-options :initform nil) - (target :initarg :target :initform nil) - (trailer :initarg :trailer :initform nil) - (comment-p :initarg :comment-p :initform nil))) - -(defvar git-rebase-line-regexps - `((commit . ,(concat - (regexp-opt '("e" "edit" - "f" "fixup" - "p" "pick" - "r" "reword" - "s" "squash") - "\\(?1:") - " \\(?3:[^ \n]+\\) \\(?4:.*\\)")) - (exec . "\\(?1:x\\|exec\\) \\(?3:.*\\)") - (bare . ,(concat (regexp-opt '("b" "break" "noop") "\\(?1:") - " *$")) - (label . ,(concat (regexp-opt '("l" "label" - "t" "reset") - "\\(?1:") - " \\(?3:[^ \n]+\\) ?\\(?4:.*\\)")) - (merge . ,(concat "\\(?1:m\\|merge\\) " - "\\(?:\\(?2:-[cC] [^ \n]+\\) \\)?" - "\\(?3:[^ \n]+\\)" - " ?\\(?4:.*\\)")))) - -;;;###autoload -(defun git-rebase-current-line () - "Parse current line into a `git-rebase-action' instance. -If the current line isn't recognized as a rebase line, an -instance with all nil values is returned." - (save-excursion - (goto-char (line-beginning-position)) - (if-let ((re-start (concat "^\\(?5:" (regexp-quote comment-start) - "\\)? *")) - (type (-some (lambda (arg) - (let ((case-fold-search nil)) - (and (looking-at (concat re-start (cdr arg))) - (car arg)))) - git-rebase-line-regexps))) - (git-rebase-action - :action-type type - :action (when-let ((action (match-string-no-properties 1))) - (or (cdr (assoc action git-rebase-short-options)) - action)) - :action-options (match-string-no-properties 2) - :target (match-string-no-properties 3) - :trailer (match-string-no-properties 4) - :comment-p (and (match-string 5) t)) - ;; Use default empty class rather than nil to ease handling. - (git-rebase-action)))) - -(defun git-rebase-set-action (action) - (goto-char (line-beginning-position)) - (with-slots (action-type target trailer) - (git-rebase-current-line) - (if (eq action-type 'commit) - (let ((inhibit-read-only t)) - (magit-delete-line) - (insert (concat action " " target " " trailer "\n")) - (unless git-rebase-auto-advance - (forward-line -1))) - (ding)))) - -(defun git-rebase-line-p (&optional pos) - (save-excursion - (when pos (goto-char pos)) - (and (oref (git-rebase-current-line) action-type) - t))) - -(defun git-rebase-region-bounds () - (when (use-region-p) - (let ((beg (save-excursion (goto-char (region-beginning)) - (line-beginning-position))) - (end (save-excursion (goto-char (region-end)) - (line-end-position)))) - (when (and (git-rebase-line-p beg) - (git-rebase-line-p end)) - (list beg (1+ end)))))) - -(defun git-rebase-move-line-down (n) - "Move the current commit (or command) N lines down. -If N is negative, move the commit up instead. With an active -region, move all the lines that the region touches, not just the -current line." - (interactive "p") - (pcase-let* ((`(,beg ,end) - (or (git-rebase-region-bounds) - (list (line-beginning-position) - (1+ (line-end-position))))) - (pt-offset (- (point) beg)) - (mark-offset (and mark-active (- (mark) beg)))) - (save-restriction - (narrow-to-region - (point-min) - (1- - (if git-rebase-show-instructions - (save-excursion - (goto-char (point-min)) - (while (or (git-rebase-line-p) - ;; The output for --rebase-merges has empty - ;; lines and "Branch" comments interspersed. - (looking-at-p "^$") - (looking-at-p (concat git-rebase-comment-re - " Branch"))) - (forward-line)) - (line-beginning-position)) - (point-max)))) - (if (or (and (< n 0) (= beg (point-min))) - (and (> n 0) (= end (point-max))) - (> end (point-max))) - (ding) - (goto-char (if (< n 0) beg end)) - (forward-line n) - (atomic-change-group - (let ((inhibit-read-only t)) - (insert (delete-and-extract-region beg end))) - (let ((new-beg (- (point) (- end beg)))) - (when (use-region-p) - (setq deactivate-mark nil) - (set-mark (+ new-beg mark-offset))) - (goto-char (+ new-beg pt-offset)))))))) - -(defun git-rebase-move-line-up (n) - "Move the current commit (or command) N lines up. -If N is negative, move the commit down instead. With an active -region, move all the lines that the region touches, not just the -current line." - (interactive "p") - (git-rebase-move-line-down (- n))) - -(defun git-rebase-highlight-region (start end window rol) - (let ((inhibit-read-only t) - (deactivate-mark nil) - (bounds (git-rebase-region-bounds))) - (mapc #'delete-overlay magit-section-highlight-overlays) - (when bounds - (magit-section-make-overlay (car bounds) (cadr bounds) - 'magit-section-heading-selection)) - (if (and bounds (not magit-keep-region-overlay)) - (funcall (default-value 'redisplay-unhighlight-region-function) rol) - (funcall (default-value 'redisplay-highlight-region-function) - start end window rol)))) - -(defun git-rebase-unhighlight-region (rol) - (mapc #'delete-overlay magit-section-highlight-overlays) - (funcall (default-value 'redisplay-unhighlight-region-function) rol)) - -(defun git-rebase-kill-line () - "Kill the current action line." - (interactive) - (goto-char (line-beginning-position)) - (unless (oref (git-rebase-current-line) comment-p) - (let ((inhibit-read-only t)) - (insert comment-start) - (insert " ")) - (goto-char (line-beginning-position)) - (when git-rebase-auto-advance - (forward-line)))) - -(defun git-rebase-insert (rev) - "Read an arbitrary commit and insert it below current line." - (interactive (list (magit-read-branch-or-commit "Insert revision"))) - (forward-line) - (--if-let (magit-rev-format "%h %s" rev) - (let ((inhibit-read-only t)) - (insert "pick " it ?\n)) - (user-error "Unknown revision"))) - -(defun git-rebase-set-noncommit-action (action value-fn arg) - (goto-char (line-beginning-position)) - (pcase-let* ((inhibit-read-only t) - (`(,initial ,trailer ,comment-p) - (and (not arg) - (with-slots ((ln-action action) - target trailer comment-p) - (git-rebase-current-line) - (and (equal ln-action action) - (list target trailer comment-p))))) - (value (funcall value-fn initial))) - (pcase (list value initial comment-p) - (`("" nil ,_) - (ding)) - (`("" ,_ ,_) - (magit-delete-line)) - (_ - (if initial - (magit-delete-line) - (forward-line)) - (insert (concat action " " value - (and (equal value initial) - trailer - (concat " " trailer)) - "\n")) - (unless git-rebase-auto-advance - (forward-line -1)))))) - -(defun git-rebase-exec (arg) - "Insert a shell command to be run after the current commit. - -If there already is such a command on the current line, then edit -that instead. With a prefix argument insert a new command even -when there already is one on the current line. With empty input -remove the command on the current line, if any." - (interactive "P") - (git-rebase-set-noncommit-action - "exec" - (lambda (initial) (read-shell-command "Execute: " initial)) - arg)) - -(defun git-rebase-label (arg) - "Add a label after the current commit. -If there already is a label on the current line, then edit that -instead. With a prefix argument, insert a new label even when -there is already a label on the current line. With empty input, -remove the label on the current line, if any." - (interactive "P") - (git-rebase-set-noncommit-action - "label" - (lambda (initial) - (read-from-minibuffer - "Label: " initial magit-minibuffer-local-ns-map)) - arg)) - -(defun git-rebase-buffer-labels () - (let (labels) - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "^\\(?:l\\|label\\) \\([^ \n]+\\)" nil t) - (push (match-string-no-properties 1) labels))) - (nreverse labels))) - -(defun git-rebase-reset (arg) - "Reset the current HEAD to a label. -If there already is a reset command on the current line, then -edit that instead. With a prefix argument, insert a new reset -line even when point is already on a reset line. With empty -input, remove the reset command on the current line, if any." - (interactive "P") - (git-rebase-set-noncommit-action - "reset" - (lambda (initial) - (or (magit-completing-read "Label" (git-rebase-buffer-labels) - nil t initial) - "")) - arg)) - -(defun git-rebase-merge (arg) - "Add a merge command after the current commit. -If there is already a merge command on the current line, then -replace that command instead. With a prefix argument, insert a -new merge command even when there is already one on the current -line. With empty input, remove the merge command on the current -line, if any." - (interactive "P") - (git-rebase-set-noncommit-action - "merge" - (lambda (_) - (or (magit-completing-read "Merge" (git-rebase-buffer-labels)) - "")) - arg)) - -(defun git-rebase-merge-toggle-editmsg () - "Toggle whether an editor is invoked when performing the merge at point. -When a merge command uses a lower-case -c, the message for the -specified commit will be opened in an editor before creating the -commit. For an upper-case -C, the message will be used as is." - (interactive) - (with-slots (action-type target action-options trailer) - (git-rebase-current-line) - (if (eq action-type 'merge) - (let ((inhibit-read-only t)) - (magit-delete-line) - (insert - (format "merge %s %s %s\n" - (replace-regexp-in-string - "-[cC]" (lambda (c) - (if (equal c "-c") "-C" "-c")) - action-options t t) - target - trailer))) - (ding)))) - -(defun git-rebase-set-bare-action (action arg) - (goto-char (line-beginning-position)) - (with-slots ((ln-action action) comment-p) - (git-rebase-current-line) - (let ((same-action-p (equal action ln-action)) - (inhibit-read-only t)) - (when (or arg - (not ln-action) - (not same-action-p) - (and same-action-p comment-p)) - (unless (or arg (not same-action-p)) - (magit-delete-line)) - (insert action ?\n) - (unless git-rebase-auto-advance - (forward-line -1)))))) - -(defun git-rebase-noop (&optional arg) - "Add noop action at point. - -If the current line already contains a noop action, leave it -unchanged. If there is a commented noop action present, remove -the comment. Otherwise add a new noop action. With a prefix -argument insert a new noop action regardless of what is already -present on the current line. - -A noop action can be used to make git perform a rebase even if -no commits are selected. Without the noop action present, git -would see an empty file and therefore do nothing." - (interactive "P") - (git-rebase-set-bare-action "noop" arg)) - -(defun git-rebase-break (&optional arg) - "Add break action at point. - -If there is a commented break action present, remove the comment. -If the current line already contains a break action, add another -break action only if a prefix argument is given. - -A break action can be used to interrupt the rebase at the -specified point. It is particularly useful for pausing before -the first commit in the sequence. For other cases, the -equivalent behavior can be achieved with `git-rebase-edit'." - (interactive "P") - (git-rebase-set-bare-action "break" arg)) - -(defun git-rebase-undo (&optional arg) - "Undo some previous changes. -Like `undo' but works in read-only buffers." - (interactive "P") - (let ((inhibit-read-only t)) - (undo arg))) - -(defun git-rebase--show-commit (&optional scroll) - (let ((disable-magit-save-buffers t)) - (save-excursion - (goto-char (line-beginning-position)) - (--if-let (with-slots (action-type target) (git-rebase-current-line) - (and (eq action-type 'commit) - target)) - (pcase scroll - (`up (magit-diff-show-or-scroll-up)) - (`down (magit-diff-show-or-scroll-down)) - (_ (apply #'magit-show-commit it - (magit-diff-arguments 'magit-revision-mode)))) - (ding))))) - -(defun git-rebase-show-commit () - "Show the commit on the current line if any." - (interactive) - (git-rebase--show-commit)) - -(defun git-rebase-show-or-scroll-up () - "Update the commit buffer for commit on current line. - -Either show the commit at point in the appropriate buffer, or if -that buffer is already being displayed in the current frame and -contains information about that commit, then instead scroll the -buffer up." - (interactive) - (git-rebase--show-commit 'up)) - -(defun git-rebase-show-or-scroll-down () - "Update the commit buffer for commit on current line. - -Either show the commit at point in the appropriate buffer, or if -that buffer is already being displayed in the current frame and -contains information about that commit, then instead scroll the -buffer down." - (interactive) - (git-rebase--show-commit 'down)) - -(defun git-rebase-backward-line (&optional n) - "Move N lines backward (forward if N is negative). -Like `forward-line' but go into the opposite direction." - (interactive "p") - (forward-line (- (or n 1)))) - -;;; Mode - -;;;###autoload -(define-derived-mode git-rebase-mode special-mode "Git Rebase" - "Major mode for editing of a Git rebase file. - -Rebase files are generated when you run 'git rebase -i' or run -`magit-interactive-rebase'. They describe how Git should perform -the rebase. See the documentation for git-rebase (e.g., by -running 'man git-rebase' at the command line) for details." - :group 'git-rebase - (setq comment-start (or (magit-get "core.commentChar") "#")) - (setq git-rebase-comment-re (concat "^" (regexp-quote comment-start))) - (setq font-lock-defaults (list (git-rebase-mode-font-lock-keywords) t t)) - (unless git-rebase-show-instructions - (let ((inhibit-read-only t)) - (flush-lines git-rebase-comment-re))) - (unless with-editor-mode - ;; Maybe already enabled when using `shell-command' or an Emacs shell. - (with-editor-mode 1)) - (when git-rebase-confirm-cancel - (add-hook 'with-editor-cancel-query-functions - 'git-rebase-cancel-confirm nil t)) - (setq-local redisplay-highlight-region-function 'git-rebase-highlight-region) - (setq-local redisplay-unhighlight-region-function 'git-rebase-unhighlight-region) - (add-hook 'with-editor-pre-cancel-hook 'git-rebase-autostash-save nil t) - (add-hook 'with-editor-post-cancel-hook 'git-rebase-autostash-apply nil t) - (setq imenu-prev-index-position-function - #'magit-imenu--rebase-prev-index-position-function) - (setq imenu-extract-index-name-function - #'magit-imenu--rebase-extract-index-name-function) - (when (boundp 'save-place) - (setq save-place nil))) - -(defun git-rebase-cancel-confirm (force) - (or (not (buffer-modified-p)) - force - (magit-confirm 'abort-rebase "Abort this rebase" nil 'noabort))) - -(defun git-rebase-autostash-save () - (--when-let (magit-file-line (magit-git-dir "rebase-merge/autostash")) - (push (cons 'stash it) with-editor-cancel-alist))) - -(defun git-rebase-autostash-apply () - (--when-let (cdr (assq 'stash with-editor-cancel-alist)) - (magit-stash-apply it))) - -(defun git-rebase-match-comment-line (limit) - (re-search-forward (concat git-rebase-comment-re ".*") limit t)) - -(defun git-rebase-mode-font-lock-keywords () - "Font lock keywords for Git-Rebase mode." - `((,(concat "^" (cdr (assq 'commit git-rebase-line-regexps))) - (1 'font-lock-keyword-face) - (3 'git-rebase-hash) - (4 'git-rebase-description)) - (,(concat "^" (cdr (assq 'exec git-rebase-line-regexps))) - (1 'font-lock-keyword-face) - (3 'git-rebase-description)) - (,(concat "^" (cdr (assq 'bare git-rebase-line-regexps))) - (1 'font-lock-keyword-face)) - (,(concat "^" (cdr (assq 'label git-rebase-line-regexps))) - (1 'font-lock-keyword-face) - (3 'git-rebase-label) - (4 'font-lock-comment-face)) - ("^\\(m\\(?:erge\\)?\\) -[Cc] \\([^ \n]+\\) \\([^ \n]+\\)\\( #.*\\)?" - (1 'font-lock-keyword-face) - (2 'git-rebase-hash) - (3 'git-rebase-label) - (4 'font-lock-comment-face)) - ("^\\(m\\(?:erge\\)?\\) \\([^ \n]+\\)" - (1 'font-lock-keyword-face) - (2 'git-rebase-label)) - (,(concat git-rebase-comment-re " *" - (cdr (assq 'commit git-rebase-line-regexps))) - 0 'git-rebase-killed-action t) - (git-rebase-match-comment-line 0 'font-lock-comment-face) - ("\\[[^[]*\\]" - 0 'magit-keyword t) - ("\\(?:fixup!\\|squash!\\)" - 0 'magit-keyword-squash t) - (,(format "^%s Rebase \\([^ ]*\\) onto \\([^ ]*\\)" comment-start) - (1 'git-rebase-comment-hash t) - (2 'git-rebase-comment-hash t)) - (,(format "^%s \\(Commands:\\)" comment-start) - (1 'git-rebase-comment-heading t)) - (,(format "^%s Branch \\(.*\\)" comment-start) - (1 'git-rebase-label t)))) - -(defun git-rebase-mode-show-keybindings () - "Modify the \"Commands:\" section of the comment Git generates -at the bottom of the file so that in place of the one-letter -abbreviation for the command, it shows the command's keybinding. -By default, this is the same except for the \"pick\" command." - (let ((inhibit-read-only t)) - (save-excursion - (goto-char (point-min)) - (when (and git-rebase-show-instructions - (re-search-forward - (concat git-rebase-comment-re "\\s-+p, pick") - nil t)) - (goto-char (line-beginning-position)) - (pcase-dolist (`(,cmd . ,desc) git-rebase-command-descriptions) - (insert (format "%s %-8s %s\n" - comment-start - (substitute-command-keys (format "\\[%s]" cmd)) - desc))) - (while (re-search-forward (concat git-rebase-comment-re - "\\( ?\\)\\([^\n,],\\) " - "\\([^\n ]+\\) ") - nil t) - (let ((cmd (intern (concat "git-rebase-" (match-string 3))))) - (if (not (fboundp cmd)) - (delete-region (line-beginning-position) (1+ (line-end-position))) - (replace-match " " t t nil 1) - (replace-match - (format "%-8s" - (mapconcat #'key-description - (--remove (eq (elt it 0) 'menu-bar) - (reverse (where-is-internal - cmd git-rebase-mode-map))) - ", ")) - t t nil 2)))))))) - -(add-hook 'git-rebase-mode-hook 'git-rebase-mode-show-keybindings t) - -(defun git-rebase-mode-disable-before-save-hook () - (set (make-local-variable 'before-save-hook) nil)) - -(add-hook 'git-rebase-mode-hook 'git-rebase-mode-disable-before-save-hook) - -;;;###autoload -(defconst git-rebase-filename-regexp "/git-rebase-todo\\'") -;;;###autoload -(add-to-list 'auto-mode-alist - (cons git-rebase-filename-regexp 'git-rebase-mode)) - -(add-to-list 'with-editor-server-window-alist - (cons git-rebase-filename-regexp 'switch-to-buffer)) - -(eval-after-load 'recentf - '(add-to-list 'recentf-exclude git-rebase-filename-regexp)) - -(add-to-list 'with-editor-file-name-history-exclude git-rebase-filename-regexp) - -;;; _ -(provide 'git-rebase) -;;; git-rebase.el ends here diff --git a/elpa/magit-20200418.939/git-rebase.elc b/elpa/magit-20200418.939/git-rebase.elc deleted file mode 100644 index de6f1586d5b9e0d7f7110c328e4bd4f6da0b42bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27665 zcmd^I`*$0+m6rTaZRI4V-P84Ech9CU6~|JlQRhWcQksor#YuhY*V;~VPDN!iB1aM{ ziex#YZFOJ&`hMR9Faz)*+sQ9`&Nh`ag8?osfQ$PE{KbPu`~R@Cw6yxg7hkCT!TGS; z%RBPY?W+gpS-ViL@=?(p^i|y0O61Gy?)X$?y`CBj$KCVp-?A}27h9|H@#Sf^P{)9x zCPiMT&P6{v@3vKE&@RTKZvUj%#Me_2>{+NaqlYmb5ArgWe6JE|C{cGg!%x#|rvuM;zrLgm@0*Ud+2e2R*3 zqWi@Z{H*^GfuH-o)z#JYql zYppm;_LlG%16+tYVSR1s2Ea$V{Pa71O7N3jY1L2=$4mT%g8IL<;zqn&wr`-U$@Ur? zdWZ>*-NdLL1HL>1Se)Xgjvus%o1gtc*Gf<`LCpj;6Vyu5ufN7`TaTrvpLq3CwlVe7 zi1kyv3EcVh3D?#a_~}CU#5(1u&_~MQ;JMDx5bM}tT}Q1tAl3o7&T-*u+PI^KBp=a1 zolOl0?_&e-2*1G@nr_(u*apBh=7DVhYy&MC^T0L%vI&q)Kp@y=0))b5O&w&#MZX=8 zqT1Np0e0=+b>0bvS^F$I!QL9>f1Pwkx$0!aDRxD1ah~@ls>ny!DvBFD$UEKfV5H8o zlP)%`2Tt|7JvCNGgGs+LRPA2S?QQAZbC;=n8yNdql(wJ8E& zp^ND$iFti}tk!qCeM~tBMMxmvhmDO5-Hkd1Sz}k6<1;@9^*H10Wk(q1JTRmD7*Z|w zAxZUu0!^Ma)p% z^G13MNg4D8?K6mwbL{4EAk(u;@q3mB<5TRWlT$VJu{U)w?Pf*{Y!c^G=N9aoS$0My zUw2>U-IG&th+b#5zjEF=X{Ouryb$^{oh<4)&pO;DT%2-=tAU^87q17Sjttye?Ni-O zR>`oA1s!U11VVABwl`MS?!`OmkNL%UHk37*Ce7chu6OcdFbj8iNwfi5Ov`jdp}u^B zB9`JHOqTHrY#+kdEdeVJn{Ej!ix4kcQI1E6R|jw+4^9L)kq0LRoS4c$35W7}ssy4a zPQ5xJJG~M}qa<`ov_$txD1$vXTE=^IfMMccNJ*c17*f)w-bho7bgBdxrVSS|C3)S$ zP)l&Pj+W(Ki3oA81aKN29Ln%U?AD?1_Sb@idV#Bgf)jsq%jmQhL$!bII(-D+`*BSPUNTOOF zTy`+33JxMDSy6L44G(?Vew9m$0K(bUNwyc%=?q?j!?nGBhu!v>s-1adAZj+Grt9!}bWVWy5mIvXDHEg(ZJtA=w-Y$pA!a9ZtsXpv=7PLgT_T zbfFvsN8P?ifT; zOd|AGZbo(2SspDA*mkB6b6uMfDuP2z-CeI~B?yaDdxlNpEvW1wsF(++MDp`KnwgW& z)PKE?vUB9q3n5SMqoG*&{0&Lp`>HpCeEcJJtoN;&U-|w7RO)>fvXxH{KMcV^-Z_mEl&OKSVoiq z3JHBy%9E=?%fot?%3Og(TX)Q-z<}5S3&>$BV4=kh08dw<1`UUKABKq6#wgleo6~Hp zE(Q~ADL`ApGi)<#hE3Jo%C}T@G#HHu$e}NvzXKfSMhyqB)`-M#l)vf@CWV+BZ0d3U znd+s@GS!PW;kFe`3L|uYxb709BgL zXa?i=f+Kon?s$}qF3cKCwU&*Dw(!KkqlONR&Tm($29;gwz2Cv;Hj@HFr9Bym zvO#rWOS8zV*Udol4$%o)s!URd1Nw^Sl5i?ffia!d*Z}M}HXOAc)weguVGoHz8Y!|b zFhp%0436IyAHxaX2P56Y#VOtiJ)B;QIcwNO6`5mx_rX**adEA0$JN|5{XMtINDQM^#*z5uz4*5(%Spt)dx}|3{i{D%9G<<|r3Qsq|&?v(X zYu7(Dj0%!o^EHQK>7@vUD(~jq0Sq%3W$;oKMF26{>9(`6=ZP{aHwz%p?c1l_9$cp` zFqT{fERZ(9K>8jW6>trr(;9qcY8^gUIt+(uYimojT3@;xS>v)Hu0QxeU^v9}t*B;g zM!0_Ara{kOX#j)46H-vXgI64P;hWP)qFj$xe7${8wrIiYW@5x$371TFoQ+P@?o26k zi*wm5a0zRwo~}%XPIo+0ucYYd`u+!}9Wj8{t*Y-9xb;RE!c`-;qFdtBwEK4G)SW6T zYi}H?26uNeRr@eou|gT#y|2~a=r2?eD8NWIN+#^b83MVBkktBdUwsA}ajafEdiwIk z#v)N`CUWf{inop9*;rp!tw9CO(!0fukGExPYxowieQw#83qCTA$>sZ zfZ>lPqdrxvb4dQ$Q@a7lk)d&&s5>vj#|`c)zIiyA@4TofIN1B+?)c(RHSHwByC#!7 zYf(_MLPsa)xtR7H3flL9tk~B0oAQOcu)zn6EDGp)P6=^oTm+IB`Z^N_Oq~E z?z^qkhsQH2A|fRHy9{Tw2PggR-(c85oz84DhUCCN!fLs9%Md)7@2jjg0e_Yt3u!a& zEY#$T>aIO(T04rhL{vw{8BB3lzj2%N^l#iYprZP35Ea&x1?mC^&`xLkO;=V>6QUE5 zYVBpdb5q1GnNoH%9Wu+84ATxZ- zc)&{nD?$Rge2Ea^Hj!ieW$-(!KL*I8@mcE_FY!z1UmHHQs) z+s-NXRVt}3T9Hc`n;xsVgL>yQoD-q zW1pf1HuFE?7seEZSN5LCNIsOwxMz@lg?Jj23nXK-8I3(?BMurIBdih>$Yp4siWKe* z24_SmgC`>e*nX=|8M62MTkKP3JXZ1=?yF_CDFjn%p9TyT0Z@M+`T(77Ag~BTSq$2x zRJS^2j3}j+wF#cA?6k8?MWq4>5d-9+hUI}fI}P$cZYaa=_x4{teEMXeuyahtwS#i@ zO6pA%<}d~MfFp8V8((74C95H9ehiWcK@Cxe?Ggz0_w4Cn zWkbd=gj|j54UibQhh`GV4Ix;|Mnp_;F*v=Lzh7a_!o+SttxFCNNOdR68@x-LLeJXM zx)aBdm723&2kbm-#XzzQoQOD=s(zRFQD{abwZsYtNm){sr6>dST#-$9hgjE_&GYi| z%dagnF^dnan}V914!Q58cgq{ZqZZ6z6{cd2(6G!W9x6WKP=lUqY-ZUaF))8DnFDk; z7zcxq?&~I&4Gm>OJrSr#zJj+*#LW{5hkkwnUH%m$iTM8@IC| zzRFiMs-_Lo9N3O{L3O1wlCQcBw4O;DQS?no*!l}{IQVhZBFZ*Ksa?Fgr(A*64wv25 z_<+mN1XW=lb19(IE$^8>%h!Hf{xcGp!n#7OC{kDcj4x?^6Gh2)vi7+lPMEMLOdqly z(Cuf8)>b3ZzKd@t>ADFaC=kR&GLIh2OL9 z!HPrIQSE#{?^+~QFtc05%H2P0u6w&g%D|`3wU@|7mx6i?7!5Ya!H7mY-jRTAu zwxE7{~mSO*%m-8oSdr%j_`TTSn><(}=?AwO~cI9W?r@$|N6N3^T_d8m+cW_@<@e!>jU zxY5dB6gBHRdT>dk7>O2r#Ht)xg%oXNp+#JU-E6SHQ3Wx+x*~nIYGMRXvw$6OQ)D72 zHq^oqg|<;2G-?zONaqFiffYGQZg^&t0nt5aDcC#@ah~=TzN6CJtsn;*m84#SxNf6y&23 zH0IiO{j)xlWbCO|T^@2k{Kxu0qd4A45TB@QbqZcFYi{qGrL`Tx@H-M=9w7C`Xymnr zdg2_=;!}miwe6X@>Q8%*zIzaS^F$2wMNVFdR5(dBaM6;$KGqJJ%}DzXO8X`Gm`azB zt5`273E0eN?OH2FIy^{pjZ-S6q6Wg=;q+1?4C^$CqgL$!7J&Kwu99uumal;&f543& zMOUsrK>c`Gjt?O9yuP%2kL4&#Om9$0>W!r*M?Bo%CGU*gvJdZE7Xnk!0}pNl6QCr_$;+P zgr*NQ88-iQ+0xqPmwxbpB&!VrbX^aZuC4qUsS=O`R3}% zOKF$S?kh(Uz7u!ylxV{%v~Oa@o1vyW6&2UADhBX_KHJBf!Sux_#NL8q3@WdzF(@@m z#K?fNTd(gYOZ0o!KVhY0Wd-X>;{L-vJOY;`~o{=8^}dULzp74n$1=u4*Dt;Js& z#|nKam8(shSL)^Sy@!t;JXa5&Jbd|Z?~&f&8(=OqgxjD27)~_{dkuis;H`n`Yh7d! zmMF0@E>(uBWC{uE5OT5y*I3I@r zJXdo%w$6zBd^iTKeFT@_j_{lp9QvG=NQPqI{KEJf=m1^BS0#E;Nhjg&q^~k`=8(r+ z9;_qTj*=uG^yw*TMPlB_Vu@rR#k*n>Wz4a=%o-govf?6xQn<(v2*Bhd^4$#`8i^CRdNu!ZRygqCnT!nvlZ zhN?Z{DheGiN@*PSbLk)j6SH){e3V(|r|p#>9p@+bW^6rQW%!mv%Ea6-`3G`JG30J9 z-!Fy6^(AOt)XS2l86BA)JQF(HKn05#;wI>^+e3s+rpH9ss+by;FE;=%9a8|MYny&2 zfgXw-=JB6DJlOl1yv-1gjh*@IgK;u8w47!xp^&;)8T=ILChcCz!=|WPI#?w)R3(X< zbVi57(Xquvv}5B;75;_&1pc)NR7(c-4p_f4d23h|Y5oL0CLmn$E@3DV3#sJ#9S}pK zbxe|h_GG+vmhji^Auebbpbqic zMSllI=&V$xPiMUY$-p7k_{g84T(fRMb(5%<9OcMOX7 z1`sid2{OlRpZk8F7BsMve1dMV&P5CG}P-1y7{wa=mlU$@n zPz!M8sTS;mT9b;;?b8;}-l;NuZORz(!?jT(3ZVspY3g9P_2lYc`CAp~VOfRgI)_z#3KJBFX5c*4zbY%yodEmmD+yPnNm&<9 zjM|}TsQnA@?f||GuM?Tx!lg-xz&oYJn)?#$r+~^A*_6HO_!IZ8Dp=6*acw zx;Dw`@b*z3pO-&hT3nvbtW=22l@??iPU}sDlimn`b;qkXPcC5~MrBKFo^5KK;MD`PUF=daGU=A0JTC?`+>dq~M=I^%0b zgDVlcYOtASo?&A4+`jE~9m1%f?a_r!7rZjO7}%QAx*|Kf$E$rDA{R!8*#L*s4t3-` zX^jg}CgI&KvgPCe?&|Bo1c~xRj=6vw5c5*5ED=kZhKulB9NXYg5l8}KM^+gUmsyn3 zD+MU?BaFweG6x-!q&eyC%ok;7c4wdVW_}PTaKiX6C@%aHvx3uwLvhF!q5_e3&wgo6gG+oK;gSILBZIYfaYAaWaHR0eoR_!h zOfD$fQ{B-y)x%PYI!B(_9>C9nS2zB!iHu4La^1G*szg zaeYU9H$?76Rm5HgP5cm(ZXG4R%w3=|BpK zO=^0oBro_9`J4$7Ynwvm%eaG&N0O=D@4%LjOSQPYwK~j@G)|C;_yignbK!e^)De$~ z(kIJ>7n-h-U2*A5d-P+C3UMynzI@JM+*Ahwqn)_vge{>y{y(2~$?ki{iI;8pUQ^E& z?&LSk&u&>k@^4-az-dRd1XRzeb{+73%*uyjq1FCv14;A7fJqfbti2LF6n01LuSl^Ew+$? zZZ7|t9w5EraA@<`7t?3uAk9=A_0OU9d!A7I^|DkSaTVy&lp_4q z3j{gL3`iat4CQXSR8BsyqRwoBY&Uh7H4KRk4kj&_c^3<4dN2gE6yce&KBb5+K}#A# zdf!$=kNi}DHYX8DMo8;~JspKOkfGZXJ>AhWr@c@VI>Hrvwj&@-|AfAaZ@Lg4H952 zq1JoZ`B5jsHjchr+ePhQj63dt9nv=Nh6h@aaOCjTIDM0j2Y)SE!wFPL*z(G2F9Zw3 zr+M!i>3QA=oZiC|>!9HG|;-s^_JOj2LwV`hT1ZokDbmIaL zdrdb%ix;rmsnYoL$Azla8wb<2PPR62jod0Q;87iQ7ol>e1~{5FEUD+v^k>ipcN79l zC&z80J(@TVp%HaBH`Fr`i0WSmVbML!$*=G${yY34Q%cC`l79vR5=#bbMv^!6C(9t~A5gtZ z#Ug4jogQvo;bmk~tz-5h<`YtI#FL8Lcd?be09YIrJH~HVOuB`j6sI4eOdOP9`h4lb zkHis;CzLki(?{vP={;_;cOr|UW71dn;Vm#oeLWcwYjn^qNp6AJCj3zUsDAs|EoQ>Q zpG|%bq#oRAezeU&aJZ-*Hb2=xh2}^4a@CEGXf)ts#9VlNW0~~&k7<` zo&M;tJmI@?IRaU>zGD;H-nsY8*{d2AUXWx|nwrK-AEKrjr0+zt7opL&=9iSFFt1|} z)Zz0OX-QMI!pZ0kZ$k4%L0EI@x{}HrSRkj)HERH`bhx}6kA_Q1UkM>N5VqHuW|Ra` zYr{{qMcxFBZXdWJkg$fIAEpi%PEYd8J&3rExi=|JMJwjTH07nPdQx$$&!~9bH*+ok z7psmg%H(4@?n;4bPY&pNK_zec9deUh2vv@-&a#H&u({2%dB`OaE`-@?-XP%LGPgSk zUArx*%_0F8^Fp_Z--@S2%;jF9-Kq|9T9QRPK}=k7R{-yo!=-I3oseZK!-VYb&4 z${pGH;IG-WU*W%^Msifmb2l_eLdO53k5`<=$8{eP|f%ez2XXT9s$A;LsI}9ObQb8haLB!S!suJaUHN<^oL!N>&O)j;ip@P23Bq$C#*;I0eYtii3ydk2_~7aZ)j4|$14m6Yed;gedE z+dRI)bsm?^W$aCxnM;3ye-5S|j_-wv?iD^fUbL_tdT8>5Pjy)~E}?htMx4V9(0aif zV~Sg?gM%Lq4srDf5JErq~l8?rYn(z?CSx%w-W&h(SBcgA|z~~6=3lR zSf@j=YApAo!5BVCTUBEC_}4#7mb%jFl7WNVx&Rr9@Qto&wFm(f8ujGDwjXH!NR<=c z!)tASbKX#Tw;1>~EBPB9vMu52iw%WW0np_PUKFgV zqbiBFAyG=5#fuXyOukHUxP)eEA6z*UUQTuo^SAtnGk{05G;zXGTiUR!@pMmq>9aOh z&=?FG>>lQ}+2X^?2-)4z^~j)4gu%ln8q4M0Tjl+U$QaWOVgNURq8o=8Ukgi6qMv&H*5E|7LHDB zQ5@)Dr(13&d%M*tg5M4|m0ag17Muv;IYDL1pqM5XY};J9VscdARx6z9wuc*Nb>rW0 z0H3^5fJNeAT|u{QZ3y>j^*0YU$v)?375 zah0w=(`25vh2cDm3^=^+Ko()9hlAOMRpG278M9cmTEkPd-#H)0gU+DUx?4kA|EwiP z2fY-EtX#+@T!&>)M@7S}$)@EdBsZdG(w3lB1XbR=>QId}FPxsI(c&!NA9fL&h<1*) zvbBxmG~?QM{sNqK0v!eV%3u5&JG7|^SX;Q00zgcZJV(}0AX(~g{~$viaT54-j*%3j z6A;X3f%9}w<}x%56x_zp?oB#5Z6OaewiV|cPQfEA09THw$w1&M{;Mz5z$D1_zn3Yc A%m4rY diff --git a/elpa/magit-20200418.939/magit-apply.el b/elpa/magit-20200418.939/magit-apply.el deleted file mode 100644 index 766a3ccc..00000000 --- a/elpa/magit-20200418.939/magit-apply.el +++ /dev/null @@ -1,739 +0,0 @@ -;;; magit-apply.el --- apply Git diffs -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements commands for applying Git diffs or parts -;; of such a diff. The supported "apply variants" are apply, stage, -;; unstage, discard, and reverse - more than Git itself knows about, -;; at least at the porcelain level. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit-core) -(require 'magit-diff) -(require 'magit-wip) - -(require 'transient) ; See #3732. - -;; For `magit-apply' -(declare-function magit-am "magit-sequence" ()) -(declare-function magit-patch-apply "magit-files" ()) -;; For `magit-discard-files' -(declare-function magit-checkout-stage "magit-merge" (file arg)) -(declare-function magit-checkout-read-stage "magit-merge" (file)) -(defvar auto-revert-verbose) -;; For `magit-stage-untracked' -(declare-function magit-submodule-add-1 "magit-submodule" - (url &optional path name args)) -(declare-function magit-submodule-read-name-for-path "magit-submodule" - (path &optional prefer-short)) -(declare-function borg--maybe-absorb-gitdir "borg" (pkg)) -(declare-function borg--sort-submodule-sections "borg" (file)) -(defvar borg-user-emacs-directory) - -;;; Options - -(defcustom magit-delete-by-moving-to-trash t - "Whether Magit uses the system's trash can. - -You should absolutely not disable this and also remove `discard' -from `magit-no-confirm'. You shouldn't do that even if you have -all of the Magit-Wip modes enabled, because those modes do not -track any files that are not tracked in the proper branch." - :package-version '(magit . "2.1.0") - :group 'magit-essentials - :type 'boolean) - -(defcustom magit-unstage-committed t - "Whether unstaging a committed change reverts it instead. - -A committed change cannot be unstaged, because staging and -unstaging are actions that are concerned with the differences -between the index and the working tree, not with committed -changes. - -If this option is non-nil (the default), then typing \"u\" -\(`magit-unstage') on a committed change, causes it to be -reversed in the index but not the working tree. For more -information see command `magit-reverse-in-index'." - :package-version '(magit . "2.4.1") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-reverse-atomically nil - "Whether to reverse changes atomically. - -If some changes can be reversed while others cannot, then nothing -is reversed if the value of this option is non-nil. But when it -is nil, then the changes that can be reversed are reversed and -for the other changes diff files are created that contain the -rejected reversals." - :package-version '(magit . "2.7.0") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-post-stage-hook nil - "Hook run after staging changes. -This hook is run by `magit-refresh' if `this-command' -is a member of `magit-post-stage-hook-commands'." - :package-version '(magit . "2.90.0") - :group 'magit-commands - :type 'hook) - -(defvar magit-post-stage-hook-commands - '(magit-stage magit-stage-file magit-stage-modified)) - -(defcustom magit-post-unstage-hook nil - "Hook run after unstaging changes. -This hook is run by `magit-refresh' if `this-command' -is a member of `magit-post-unstage-hook-commands'." - :package-version '(magit . "2.90.0") - :group 'magit-commands - :type 'hook) - -(defvar magit-post-unstage-hook-commands - '(magit-unstage magit-unstage-file magit-unstage-all)) - -;;; Commands -;;;; Apply - -(defun magit-apply (&rest args) - "Apply the change at point to the working tree. -With a prefix argument fallback to a 3-way merge. Doing -so causes the change to be applied to the index as well." - (interactive (and current-prefix-arg (list "--3way"))) - (--when-let (magit-apply--get-selection) - (pcase (list (magit-diff-type) (magit-diff-scope)) - (`(,(or `unstaged `staged) ,_) - (user-error "Change is already in the working tree")) - (`(untracked ,(or `file `files)) - (call-interactively 'magit-am)) - (`(,_ region) (magit-apply-region it args)) - (`(,_ hunk) (magit-apply-hunk it args)) - (`(,_ hunks) (magit-apply-hunks it args)) - (`(rebase-sequence file) - (call-interactively 'magit-patch-apply)) - (`(,_ file) (magit-apply-diff it args)) - (`(,_ files) (magit-apply-diffs it args))))) - -(defun magit-apply--section-content (section) - (buffer-substring-no-properties (if (magit-hunk-section-p section) - (oref section start) - (oref section content)) - (oref section end))) - -(defun magit-apply-diffs (sections &rest args) - (setq sections (magit-apply--get-diffs sections)) - (magit-apply-patch sections args - (mapconcat - (lambda (s) - (concat (magit-diff-file-header s) - (magit-apply--section-content s))) - sections ""))) - -(defun magit-apply-diff (section &rest args) - (setq section (car (magit-apply--get-diffs (list section)))) - (magit-apply-patch section args - (concat (magit-diff-file-header section) - (magit-apply--section-content section)))) - -(defun magit-apply--adjust-hunk-new-starts (hunks) - "Adjust new line numbers in headers of HUNKS for partial application. -HUNKS should be a list of ordered, contiguous hunks to be applied -from a file. For example, if there is a sequence of hunks with -the headers - - @@ -2,6 +2,7 @@ - @@ -10,6 +11,7 @@ - @@ -18,6 +20,7 @@ - -and only the second and third are to be applied, they would be -adjusted as \"@@ -10,6 +10,7 @@\" and \"@@ -18,6 +19,7 @@\"." - (let* ((first-hunk (car hunks)) - (offset (if (string-match diff-hunk-header-re-unified first-hunk) - (- (string-to-number (match-string 3 first-hunk)) - (string-to-number (match-string 1 first-hunk))) - (error "Hunk does not have expected header")))) - (if (= offset 0) - hunks - (mapcar (lambda (hunk) - (if (string-match diff-hunk-header-re-unified hunk) - (replace-match (number-to-string - (- (string-to-number (match-string 3 hunk)) - offset)) - t t hunk 3) - (error "Hunk does not have expected header"))) - hunks)))) - -(defun magit-apply--adjust-hunk-new-start (hunk) - (car (magit-apply--adjust-hunk-new-starts (list hunk)))) - -(defun magit-apply-hunks (sections &rest args) - (let ((section (oref (car sections) parent))) - (when (string-match "^diff --cc" (oref section value)) - (user-error "Cannot un-/stage resolution hunks. Stage the whole file")) - (magit-apply-patch - section args - (concat (oref section header) - (mapconcat #'identity - (magit-apply--adjust-hunk-new-starts - (mapcar #'magit-apply--section-content sections)) - ""))))) - -(defun magit-apply-hunk (section &rest args) - (when (string-match "^diff --cc" (magit-section-parent-value section)) - (user-error "Cannot un-/stage resolution hunks. Stage the whole file")) - (magit-apply-patch (oref section parent) args - (concat (magit-diff-file-header section) - (magit-apply--adjust-hunk-new-start - (magit-apply--section-content section))))) - -(defun magit-apply-region (section &rest args) - (when (string-match "^diff --cc" (magit-section-parent-value section)) - (user-error "Cannot un-/stage resolution hunks. Stage the whole file")) - (magit-apply-patch (oref section parent) args - (concat (magit-diff-file-header section) - (magit-apply--adjust-hunk-new-start - (magit-diff-hunk-region-patch section args))))) - -(defun magit-apply-patch (section:s args patch) - (let* ((files (if (atom section:s) - (list (oref section:s value)) - (--map (oref it value) section:s))) - (command (symbol-name this-command)) - (command (if (and command (string-match "^magit-\\([^-]+\\)" command)) - (match-string 1 command) - "apply")) - (ignore-context (magit-diff-ignore-any-space-p))) - (unless (magit-diff-context-p) - (user-error "Not enough context to apply patch. Increase the context")) - (when (and magit-wip-before-change-mode (not inhibit-magit-refresh)) - (magit-wip-commit-before-change files (concat " before " command))) - (with-temp-buffer - (insert patch) - (magit-run-git-with-input - "apply" args "-p0" - (and ignore-context "-C0") - "--ignore-space-change" "-")) - (unless inhibit-magit-refresh - (when magit-wip-after-apply-mode - (magit-wip-commit-after-apply files (concat " after " command))) - (magit-refresh)))) - -(defun magit-apply--get-selection () - (or (magit-region-sections '(hunk file module) t) - (let ((section (magit-current-section))) - (pcase (oref section type) - ((or `hunk `file `module) section) - ((or `staged `unstaged `untracked - `stashed-index `stashed-worktree `stashed-untracked) - (oref section children)) - (_ (user-error "Cannot apply this, it's not a change")))))) - -(defun magit-apply--get-diffs (sections) - (magit-section-case - ([file diffstat] - (--map (or (magit-get-section - (append `((file . ,(oref it value))) - (magit-section-ident magit-root-section))) - (error "Cannot get required diff headers")) - sections)) - (t sections))) - -(defun magit-apply--diff-ignores-whitespace-p () - (and (cl-intersection magit-buffer-diff-args - '("--ignore-space-at-eol" - "--ignore-space-change" - "--ignore-all-space" - "--ignore-blank-lines") - :test #'equal) - t)) - -;;;; Stage - -(defun magit-stage (&optional intent) - "Add the change at point to the staging area. -With a prefix argument, INTENT, and an untracked file (or files) -at point, stage the file but not its content." - (interactive "P") - (--if-let (and (derived-mode-p 'magit-mode) (magit-apply--get-selection)) - (pcase (list (magit-diff-type) - (magit-diff-scope) - (magit-apply--diff-ignores-whitespace-p)) - (`(untracked ,_ ,_) (magit-stage-untracked intent)) - (`(unstaged region ,_) (magit-apply-region it "--cached")) - (`(unstaged hunk ,_) (magit-apply-hunk it "--cached")) - (`(unstaged hunks ,_) (magit-apply-hunks it "--cached")) - (`(unstaged file t) (magit-apply-diff it "--cached")) - (`(unstaged files t) (magit-apply-diffs it "--cached")) - (`(unstaged list t) (magit-apply-diffs it "--cached")) - (`(unstaged file nil) (magit-stage-1 "-u" (list (oref it value)))) - (`(unstaged files nil) (magit-stage-1 "-u" (magit-region-values nil t))) - (`(unstaged list nil) (magit-stage-modified)) - (`(staged ,_ ,_) (user-error "Already staged")) - (`(committed ,_ ,_) (user-error "Cannot stage committed changes")) - (`(undefined ,_ ,_) (user-error "Cannot stage this change"))) - (call-interactively 'magit-stage-file))) - -;;;###autoload -(defun magit-stage-file (file) - "Stage all changes to FILE. -With a prefix argument or when there is no file at point ask for -the file to be staged. Otherwise stage the file at point without -requiring confirmation." - (interactive - (let* ((atpoint (magit-section-value-if 'file)) - (current (magit-file-relative-name)) - (choices (nconc (magit-unstaged-files) - (magit-untracked-files))) - (default (car (member (or atpoint current) choices)))) - (list (if (or current-prefix-arg (not default)) - (magit-completing-read "Stage file" choices - nil t nil nil default) - default)))) - (magit-with-toplevel - (magit-stage-1 nil (list file)))) - -;;;###autoload -(defun magit-stage-modified (&optional all) - "Stage all changes to files modified in the worktree. -Stage all new content of tracked files and remove tracked files -that no longer exist in the working tree from the index also. -With a prefix argument also stage previously untracked (but not -ignored) files." - (interactive "P") - (when (magit-anything-staged-p) - (magit-confirm 'stage-all-changes)) - (magit-with-toplevel - (magit-stage-1 (if all "--all" "-u") magit-buffer-diff-files))) - -(defun magit-stage-1 (arg &optional files) - (magit-wip-commit-before-change files " before stage") - (magit-run-git "add" arg (if files (cons "--" files) ".")) - (when magit-auto-revert-mode - (mapc #'magit-turn-on-auto-revert-mode-if-desired files)) - (magit-wip-commit-after-apply files " after stage")) - -(defun magit-stage-untracked (&optional intent) - (let* ((section (magit-current-section)) - (files (pcase (magit-diff-scope) - (`file (list (oref section value))) - (`files (magit-region-values nil t)) - (`list (magit-untracked-files)))) - plain repos) - (dolist (file files) - (if (and (not (file-symlink-p file)) - (magit-git-repo-p file t)) - (push file repos) - (push file plain))) - (magit-wip-commit-before-change files " before stage") - (when plain - (magit-run-git "add" (and intent "--intent-to-add") - "--" plain) - (when magit-auto-revert-mode - (mapc #'magit-turn-on-auto-revert-mode-if-desired plain))) - (dolist (repo repos) - (save-excursion - (goto-char (oref (magit-get-section - `((file . ,repo) (untracked) (status))) - start)) - (let* ((topdir (magit-toplevel)) - (package - (and (equal (bound-and-true-p borg-user-emacs-directory) - topdir) - (file-name-nondirectory (directory-file-name repo))))) - (magit-submodule-add-1 - (let ((default-directory - (file-name-as-directory (expand-file-name repo)))) - (or (magit-get "remote" (magit-get-some-remote) "url") - (concat (file-name-as-directory ".") repo))) - repo - (magit-submodule-read-name-for-path repo package)) - (when package - (borg--sort-submodule-sections - (expand-file-name ".gitmodules" topdir)) - (let ((default-directory borg-user-emacs-directory)) - (borg--maybe-absorb-gitdir package)) - (when (and (y-or-n-p - (format "Also build and activate `%s' drone?" package)) - (fboundp 'borg-build) - (fboundp 'borg-activate)) - (borg-build package) - (borg-activate package)))))) - (magit-wip-commit-after-apply files " after stage"))) - -;;;; Unstage - -(defun magit-unstage () - "Remove the change at point from the staging area." - (interactive) - (--when-let (magit-apply--get-selection) - (pcase (list (magit-diff-type) - (magit-diff-scope) - (magit-apply--diff-ignores-whitespace-p)) - (`(untracked ,_ ,_) (user-error "Cannot unstage untracked changes")) - (`(unstaged file ,_) (magit-unstage-intent (list (oref it value)))) - (`(unstaged files ,_) (magit-unstage-intent (magit-region-values nil t))) - (`(unstaged ,_ ,_) (user-error "Already unstaged")) - (`(staged region ,_) (magit-apply-region it "--reverse" "--cached")) - (`(staged hunk ,_) (magit-apply-hunk it "--reverse" "--cached")) - (`(staged hunks ,_) (magit-apply-hunks it "--reverse" "--cached")) - (`(staged file t) (magit-apply-diff it "--reverse" "--cached")) - (`(staged files t) (magit-apply-diffs it "--reverse" "--cached")) - (`(staged list t) (magit-apply-diffs it "--reverse" "--cached")) - (`(staged file nil) (magit-unstage-1 (list (oref it value)))) - (`(staged files nil) (magit-unstage-1 (magit-region-values nil t))) - (`(staged list nil) (magit-unstage-all)) - (`(committed ,_ ,_) (if magit-unstage-committed - (magit-reverse-in-index) - (user-error "Cannot unstage committed changes"))) - (`(undefined ,_ ,_) (user-error "Cannot unstage this change"))))) - -;;;###autoload -(defun magit-unstage-file (file) - "Unstage all changes to FILE. -With a prefix argument or when there is no file at point ask for -the file to be unstaged. Otherwise unstage the file at point -without requiring confirmation." - (interactive - (let* ((atpoint (magit-section-value-if 'file)) - (current (magit-file-relative-name)) - (choices (magit-staged-files)) - (default (car (member (or atpoint current) choices)))) - (list (if (or current-prefix-arg (not default)) - (magit-completing-read "Unstage file" choices - nil t nil nil default) - default)))) - (magit-with-toplevel - (magit-unstage-1 (list file)))) - -(defun magit-unstage-1 (files) - (magit-wip-commit-before-change files " before unstage") - (if (magit-no-commit-p) - (magit-run-git "rm" "--cached" "--" files) - (magit-run-git "reset" "HEAD" "--" files)) - (magit-wip-commit-after-apply files " after unstage")) - -(defun magit-unstage-intent (files) - (if-let ((staged (magit-staged-files)) - (intent (--filter (member it staged) files))) - (magit-unstage-1 intent) - (user-error "Already unstaged"))) - -;;;###autoload -(defun magit-unstage-all () - "Remove all changes from the staging area." - (interactive) - (when (or (magit-anything-unstaged-p) - (magit-untracked-files)) - (magit-confirm 'unstage-all-changes)) - (magit-wip-commit-before-change nil " before unstage") - (magit-run-git "reset" "HEAD" "--" magit-buffer-diff-files) - (magit-wip-commit-after-apply nil " after unstage")) - -;;;; Discard - -(defun magit-discard () - "Remove the change at point." - (interactive) - (--when-let (magit-apply--get-selection) - (pcase (list (magit-diff-type) (magit-diff-scope)) - (`(committed ,_) (user-error "Cannot discard committed changes")) - (`(undefined ,_) (user-error "Cannot discard this change")) - (`(,_ region) (magit-discard-region it)) - (`(,_ hunk) (magit-discard-hunk it)) - (`(,_ hunks) (magit-discard-hunks it)) - (`(,_ file) (magit-discard-file it)) - (`(,_ files) (magit-discard-files it)) - (`(,_ list) (magit-discard-files it))))) - -(defun magit-discard-region (section) - (magit-confirm 'discard "Discard region") - (magit-discard-apply section 'magit-apply-region)) - -(defun magit-discard-hunk (section) - (magit-confirm 'discard "Discard hunk") - (magit-discard-apply section 'magit-apply-hunk)) - -(defun magit-discard-apply (section apply) - (if (eq (magit-diff-type section) 'unstaged) - (funcall apply section "--reverse") - (if (magit-anything-unstaged-p - nil (if (magit-file-section-p section) - (oref section value) - (magit-section-parent-value section))) - (progn (let ((inhibit-magit-refresh t)) - (funcall apply section "--reverse" "--cached") - (funcall apply section "--reverse" "--reject")) - (magit-refresh)) - (funcall apply section "--reverse" "--index")))) - -(defun magit-discard-hunks (sections) - (magit-confirm 'discard (format "Discard %s hunks from %s" - (length sections) - (magit-section-parent-value (car sections)))) - (magit-discard-apply-n sections 'magit-apply-hunks)) - -(defun magit-discard-apply-n (sections apply) - (let ((section (car sections))) - (if (eq (magit-diff-type section) 'unstaged) - (funcall apply sections "--reverse") - (if (magit-anything-unstaged-p - nil (if (magit-file-section-p section) - (oref section value) - (magit-section-parent-value section))) - (progn (let ((inhibit-magit-refresh t)) - (funcall apply sections "--reverse" "--cached") - (funcall apply sections "--reverse" "--reject")) - (magit-refresh)) - (funcall apply sections "--reverse" "--index"))))) - -(defun magit-discard-file (section) - (magit-discard-files (list section))) - -(defun magit-discard-files (sections) - (let ((auto-revert-verbose nil) - (type (magit-diff-type (car sections))) - (status (magit-file-status)) - files delete resurrect rename discard discard-new resolve) - (dolist (section sections) - (let ((file (oref section value))) - (push file files) - (pcase (cons (pcase type - (`staged ?X) - (`unstaged ?Y) - (`untracked ?Z)) - (cddr (assoc file status))) - (`(?Z) (dolist (f (magit-untracked-files nil file)) - (push f delete))) - ((or `(?Z ?? ??) `(?Z ?! ?!)) (push file delete)) - ((or `(?Z ?D ? ) `(,_ ?D ?D)) (push file delete)) - ((or `(,_ ?U ,_) `(,_ ,_ ?U)) (push file resolve)) - (`(,_ ?A ?A) (push file resolve)) - (`(?X ?M ,(or ? ?M ?D)) (push section discard)) - (`(?Y ,_ ?M ) (push section discard)) - (`(?X ?A ?M ) (push file discard-new)) - (`(?X ?C ?M ) (push file discard-new)) - (`(?X ?A ,(or ? ?D)) (push file delete)) - (`(?X ?C ,(or ? ?D)) (push file delete)) - (`(?X ?D ,(or ? ?M )) (push file resurrect)) - (`(?Y ,_ ?D ) (push file resurrect)) - (`(?X ?R ,(or ? ?M ?D)) (push file rename))))) - (unwind-protect - (let ((inhibit-magit-refresh t)) - (magit-wip-commit-before-change files " before discard") - (when resolve - (magit-discard-files--resolve (nreverse resolve))) - (when resurrect - (magit-discard-files--resurrect (nreverse resurrect))) - (when delete - (magit-discard-files--delete (nreverse delete) status)) - (when rename - (magit-discard-files--rename (nreverse rename) status)) - (when (or discard discard-new) - (magit-discard-files--discard (nreverse discard) - (nreverse discard-new))) - (magit-wip-commit-after-apply files " after discard")) - (magit-refresh)))) - -(defun magit-discard-files--resolve (files) - (if-let ((arg (and (cdr files) - (magit-read-char-case - (format "For these %i files\n%s\ncheckout:\n" - (length files) - (mapconcat (lambda (file) - (concat " " file)) - files "\n")) - t - (?o "[o]ur stage" "--ours") - (?t "[t]heir stage" "--theirs") - (?c "[c]onflict" "--merge") - (?i "decide [i]ndividually" nil))))) - (dolist (file files) - (magit-checkout-stage file arg)) - (dolist (file files) - (magit-checkout-stage file (magit-checkout-read-stage file))))) - -(defun magit-discard-files--resurrect (files) - (magit-confirm-files 'resurrect files) - (if (eq (magit-diff-type) 'staged) - (magit-call-git "reset" "--" files) - (magit-call-git "checkout" "--" files))) - -(defun magit-discard-files--delete (files status) - (magit-confirm-files (if magit-delete-by-moving-to-trash 'trash 'delete) - files) - (let ((delete-by-moving-to-trash magit-delete-by-moving-to-trash)) - (dolist (file files) - (when (string-match-p "\\`\\\\?~" file) - (error "Refusing to delete %S, too dangerous" file)) - (pcase (nth 3 (assoc file status)) - ((guard (memq (magit-diff-type) '(unstaged untracked))) - (dired-delete-file file dired-recursive-deletes - magit-delete-by-moving-to-trash) - (dired-clean-up-after-deletion file)) - (?\s (delete-file file t) - (magit-call-git "rm" "--cached" "--" file)) - (?M (let ((temp (magit-git-string "checkout-index" "--temp" file))) - (string-match - (format "\\(.+?\\)\t%s" (regexp-quote file)) temp) - (rename-file (match-string 1 temp) - (setq temp (concat file ".~{index}~"))) - (delete-file temp t)) - (magit-call-git "rm" "--cached" "--force" "--" file)) - (?D (magit-call-git "checkout" "--" file) - (delete-file file t) - (magit-call-git "rm" "--cached" "--force" "--" file)))))) - -(defun magit-discard-files--rename (files status) - (magit-confirm 'rename "Undo rename %s" "Undo %i renames" nil - (mapcar (lambda (file) - (setq file (assoc file status)) - (format "%s -> %s" (cadr file) (car file))) - files)) - (dolist (file files) - (let ((orig (cadr (assoc file status)))) - (if (file-exists-p file) - (progn - (--when-let (file-name-directory orig) - (make-directory it t)) - (magit-call-git "mv" file orig)) - (magit-call-git "rm" "--cached" "--" file) - (magit-call-git "reset" "--" orig))))) - -(defun magit-discard-files--discard (sections new-files) - (let ((files (--map (oref it value) sections))) - (magit-confirm-files 'discard (append files new-files) - (format "Discard %s changes in" (magit-diff-type))) - (if (eq (magit-diff-type (car sections)) 'unstaged) - (magit-call-git "checkout" "--" files) - (when new-files - (magit-call-git "add" "--" new-files) - (magit-call-git "reset" "--" new-files)) - (let ((binaries (magit-binary-files "--cached"))) - (when binaries - (setq sections - (--remove (member (oref it value) binaries) - sections))) - (cond ((= (length sections) 1) - (magit-discard-apply (car sections) 'magit-apply-diff)) - (sections - (magit-discard-apply-n sections 'magit-apply-diffs))) - (when binaries - (let ((modified (magit-unstaged-files t))) - (setq binaries (--separate (member it modified) binaries))) - (when (cadr binaries) - (magit-call-git "reset" "--" (cadr binaries))) - (when (car binaries) - (user-error - (concat - "Cannot discard staged changes to binary files, " - "which also have unstaged changes. Unstage instead.")))))))) - -;;;; Reverse - -(defun magit-reverse (&rest args) - "Reverse the change at point in the working tree. -With a prefix argument fallback to a 3-way merge. Doing -so causes the change to be applied to the index as well." - (interactive (and current-prefix-arg (list "--3way"))) - (--when-let (magit-apply--get-selection) - (pcase (list (magit-diff-type) (magit-diff-scope)) - (`(untracked ,_) (user-error "Cannot reverse untracked changes")) - (`(unstaged ,_) (user-error "Cannot reverse unstaged changes")) - (`(,_ region) (magit-reverse-region it args)) - (`(,_ hunk) (magit-reverse-hunk it args)) - (`(,_ hunks) (magit-reverse-hunks it args)) - (`(,_ file) (magit-reverse-file it args)) - (`(,_ files) (magit-reverse-files it args)) - (`(,_ list) (magit-reverse-files it args))))) - -(defun magit-reverse-region (section args) - (magit-confirm 'reverse "Reverse region") - (magit-reverse-apply section 'magit-apply-region args)) - -(defun magit-reverse-hunk (section args) - (magit-confirm 'reverse "Reverse hunk") - (magit-reverse-apply section 'magit-apply-hunk args)) - -(defun magit-reverse-hunks (sections args) - (magit-confirm 'reverse - (format "Reverse %s hunks from %s" - (length sections) - (magit-section-parent-value (car sections)))) - (magit-reverse-apply sections 'magit-apply-hunks args)) - -(defun magit-reverse-file (section args) - (magit-reverse-files (list section) args)) - -(defun magit-reverse-files (sections args) - (pcase-let ((`(,binaries ,sections) - (let ((bs (magit-binary-files - (cond ((derived-mode-p 'magit-revision-mode) - magit-buffer-range) - ((derived-mode-p 'magit-diff-mode) - magit-buffer-range) - (t - "--cached"))))) - (--separate (member (oref it value) bs) - sections)))) - (magit-confirm-files 'reverse (--map (oref it value) sections)) - (cond ((= (length sections) 1) - (magit-reverse-apply (car sections) 'magit-apply-diff args)) - (sections - (magit-reverse-apply sections 'magit-apply-diffs args))) - (when binaries - (user-error "Cannot reverse binary files")))) - -(defun magit-reverse-apply (section:s apply args) - (funcall apply section:s "--reverse" args - (and (not magit-reverse-atomically) - (not (member "--3way" args)) - "--reject"))) - -(defun magit-reverse-in-index (&rest args) - "Reverse the change at point in the index but not the working tree. - -Use this command to extract a change from `HEAD', while leaving -it in the working tree, so that it can later be committed using -a separate commit. A typical workflow would be: - -0. Optionally make sure that there are no uncommitted changes. -1. Visit the `HEAD' commit and navigate to the change that should - not have been included in that commit. -2. Type \"u\" (`magit-unstage') to reverse it in the index. - This assumes that `magit-unstage-committed-changes' is non-nil. -3. Type \"c e\" to extend `HEAD' with the staged changes, - including those that were already staged before. -4. Optionally stage the remaining changes using \"s\" or \"S\" - and then type \"c c\" to create a new commit." - (interactive) - (magit-reverse (cons "--cached" args))) - -;;; _ -(provide 'magit-apply) -;;; magit-apply.el ends here diff --git a/elpa/magit-20200418.939/magit-apply.elc b/elpa/magit-20200418.939/magit-apply.elc deleted file mode 100644 index 8b68625c67a9625dd1948cfbffcfe03a5a200937..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31993 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 OR7jg;rB@VgZ~T96H>)ZD diff --git a/elpa/magit-20200418.939/magit-autoloads.el b/elpa/magit-20200418.939/magit-autoloads.el deleted file mode 100644 index 4689dfa2..00000000 --- a/elpa/magit-20200418.939/magit-autoloads.el +++ /dev/null @@ -1,2523 +0,0 @@ -;;; magit-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "git-rebase" "git-rebase.el" (0 0 0 0)) -;;; Generated autoloads from git-rebase.el - -(autoload 'git-rebase-current-line "git-rebase" "\ -Parse current line into a `git-rebase-action' instance. -If the current line isn't recognized as a rebase line, an -instance with all nil values is returned. - -\(fn)" nil nil) - -(autoload 'git-rebase-mode "git-rebase" "\ -Major mode for editing of a Git rebase file. - -Rebase files are generated when you run 'git rebase -i' or run -`magit-interactive-rebase'. They describe how Git should perform -the rebase. See the documentation for git-rebase (e.g., by -running 'man git-rebase' at the command line) for details. - -\(fn)" t nil) - -(defconst git-rebase-filename-regexp "/git-rebase-todo\\'") - -(add-to-list 'auto-mode-alist (cons git-rebase-filename-regexp 'git-rebase-mode)) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "git-rebase" '("git-rebase-"))) - -;;;*** - -;;;### (autoloads nil "magit" "magit.el" (0 0 0 0)) -;;; Generated autoloads from magit.el - (autoload 'magit-dispatch "magit" nil t) - (autoload 'magit-run "magit" nil t) - -(autoload 'magit-git-command "magit" "\ -Execute COMMAND asynchronously; display output. - -Interactively, prompt for COMMAND in the minibuffer. \"git \" is -used as initial input, but can be deleted to run another command. - -With a prefix argument COMMAND is run in the top-level directory -of the current working tree, otherwise in `default-directory'. - -\(fn COMMAND)" t nil) - -(autoload 'magit-git-command-topdir "magit" "\ -Execute COMMAND asynchronously; display output. - -Interactively, prompt for COMMAND in the minibuffer. \"git \" is -used as initial input, but can be deleted to run another command. - -COMMAND is run in the top-level directory of the current -working tree. - -\(fn COMMAND)" t nil) - -(autoload 'magit-shell-command "magit" "\ -Execute COMMAND asynchronously; display output. - -Interactively, prompt for COMMAND in the minibuffer. With a -prefix argument COMMAND is run in the top-level directory of -the current working tree, otherwise in `default-directory'. - -\(fn COMMAND)" t nil) - -(autoload 'magit-shell-command-topdir "magit" "\ -Execute COMMAND asynchronously; display output. - -Interactively, prompt for COMMAND in the minibuffer. COMMAND -is run in the top-level directory of the current working tree. - -\(fn COMMAND)" t nil) - -(autoload 'magit-version "magit" "\ -Return the version of Magit currently in use. -If optional argument PRINT-DEST is non-nil, output -stream (interactively, the echo area, or the current buffer with -a prefix argument), also print the used versions of Magit, Git, -and Emacs to it. - -\(fn &optional PRINT-DEST)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-apply" "magit-apply.el" (0 0 0 0)) -;;; Generated autoloads from magit-apply.el - -(autoload 'magit-stage-file "magit-apply" "\ -Stage all changes to FILE. -With a prefix argument or when there is no file at point ask for -the file to be staged. Otherwise stage the file at point without -requiring confirmation. - -\(fn FILE)" t nil) - -(autoload 'magit-stage-modified "magit-apply" "\ -Stage all changes to files modified in the worktree. -Stage all new content of tracked files and remove tracked files -that no longer exist in the working tree from the index also. -With a prefix argument also stage previously untracked (but not -ignored) files. - -\(fn &optional ALL)" t nil) - -(autoload 'magit-unstage-file "magit-apply" "\ -Unstage all changes to FILE. -With a prefix argument or when there is no file at point ask for -the file to be unstaged. Otherwise unstage the file at point -without requiring confirmation. - -\(fn FILE)" t nil) - -(autoload 'magit-unstage-all "magit-apply" "\ -Remove all changes from the staging area. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-apply" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-autorevert" "magit-autorevert.el" (0 -;;;;;; 0 0 0)) -;;; Generated autoloads from magit-autorevert.el - -(defvar magit-auto-revert-mode (not (or global-auto-revert-mode noninteractive)) "\ -Non-nil if Magit-Auto-Revert mode is enabled. -See the `magit-auto-revert-mode' command -for a description of this minor mode. -Setting this variable directly does not take effect; -either customize it (see the info node `Easy Customization') -or call the function `magit-auto-revert-mode'.") - -(custom-autoload 'magit-auto-revert-mode "magit-autorevert" nil) - -(autoload 'magit-auto-revert-mode "magit-autorevert" "\ -Toggle Auto-Revert mode in all buffers. -With prefix ARG, enable Magit-Auto-Revert mode if ARG is positive; -otherwise, disable it. If called from Lisp, enable the mode if -ARG is omitted or nil. - -Auto-Revert mode is enabled in all buffers where -`magit-turn-on-auto-revert-mode-if-desired' would do it. -See `auto-revert-mode' for more information on Auto-Revert mode. - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-autorevert" '("auto-revert-buffer" "magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-bisect" "magit-bisect.el" (0 0 0 0)) -;;; Generated autoloads from magit-bisect.el - (autoload 'magit-bisect "magit-bisect" nil t) - -(autoload 'magit-bisect-start "magit-bisect" "\ -Start a bisect session. - -Bisecting a bug means to find the commit that introduced it. -This command starts such a bisect session by asking for a know -good and a bad commit. To move the session forward use the -other actions from the bisect transient command (\\\\[magit-bisect]). - -\(fn BAD GOOD)" t nil) - -(autoload 'magit-bisect-reset "magit-bisect" "\ -After bisecting, cleanup bisection state and return to original `HEAD'. - -\(fn)" t nil) - -(autoload 'magit-bisect-good "magit-bisect" "\ -While bisecting, mark the current commit as good. -Use this after you have asserted that the commit does not contain -the bug in question. - -\(fn)" t nil) - -(autoload 'magit-bisect-bad "magit-bisect" "\ -While bisecting, mark the current commit as bad. -Use this after you have asserted that the commit does contain the -bug in question. - -\(fn)" t nil) - -(autoload 'magit-bisect-skip "magit-bisect" "\ -While bisecting, skip the current commit. -Use this if for some reason the current commit is not a good one -to test. This command lets Git choose a different one. - -\(fn)" t nil) - -(autoload 'magit-bisect-run "magit-bisect" "\ -Bisect automatically by running commands after each step. - -Unlike `git bisect run' this can be used before bisecting has -begun. In that case it behaves like `git bisect start; git -bisect run'. - -\(fn CMDLINE &optional BAD GOOD)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-bisect" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-blame" "magit-blame.el" (0 0 0 0)) -;;; Generated autoloads from magit-blame.el - (autoload 'magit-blame-echo "magit-blame" nil t) - (autoload 'magit-blame-addition "magit-blame" nil t) - (autoload 'magit-blame-removal "magit-blame" nil t) - (autoload 'magit-blame-reverse "magit-blame" nil t) - (autoload 'magit-blame "magit-blame" nil t) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-blame" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-bookmark" "magit-bookmark.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from magit-bookmark.el - -(autoload 'magit--handle-bookmark "magit-bookmark" "\ -Open a bookmark created by `magit--make-bookmark'. -Call the `magit-*-setup-buffer' function of the the major-mode -with the variables' values as arguments, which were recorded by -`magit--make-bookmark'. Ignore `magit-display-buffer-function'. - -\(fn BOOKMARK)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-bookmark" '("magit--make-bookmark"))) - -;;;*** - -;;;### (autoloads nil "magit-branch" "magit-branch.el" (0 0 0 0)) -;;; Generated autoloads from magit-branch.el - (autoload 'magit-branch "magit" nil t) - -(autoload 'magit-checkout "magit-branch" "\ -Checkout REVISION, updating the index and the working tree. -If REVISION is a local branch, then that becomes the current -branch. If it is something else, then `HEAD' becomes detached. -Checkout fails if the working tree or the staging area contain -changes. - -\(git checkout REVISION). - -\(fn REVISION)" t nil) - -(autoload 'magit-branch-create "magit-branch" "\ -Create BRANCH at branch or revision START-POINT. - -\(fn BRANCH START-POINT)" t nil) - -(autoload 'magit-branch-and-checkout "magit-branch" "\ -Create and checkout BRANCH at branch or revision START-POINT. - -\(fn BRANCH START-POINT)" t nil) - -(autoload 'magit-branch-or-checkout "magit-branch" "\ -Hybrid between `magit-checkout' and `magit-branch-and-checkout'. - -Ask the user for an existing branch or revision. If the user -input actually can be resolved as a branch or revision, then -check that out, just like `magit-checkout' would. - -Otherwise create and checkout a new branch using the input as -its name. Before doing so read the starting-point for the new -branch. This is similar to what `magit-branch-and-checkout' -does. - -\(fn ARG &optional START-POINT)" t nil) - -(autoload 'magit-branch-checkout "magit-branch" "\ -Checkout an existing or new local branch. - -Read a branch name from the user offering all local branches and -a subset of remote branches as candidates. Omit remote branches -for which a local branch by the same name exists from the list -of candidates. The user can also enter a completely new branch -name. - -- If the user selects an existing local branch, then check that - out. - -- If the user selects a remote branch, then create and checkout - a new local branch with the same name. Configure the selected - remote branch as push target. - -- If the user enters a new branch name, then create and check - that out, after also reading the starting-point from the user. - -In the latter two cases the upstream is also set. Whether it is -set to the chosen START-POINT or something else depends on the -value of `magit-branch-adjust-remote-upstream-alist', just like -when using `magit-branch-and-checkout'. - -\(fn BRANCH &optional START-POINT)" t nil) - -(autoload 'magit-branch-orphan "magit-branch" "\ -Create and checkout an orphan BRANCH with contents from revision START-POINT. - -\(fn BRANCH START-POINT)" t nil) - -(autoload 'magit-branch-spinout "magit-branch" "\ -Create new branch from the unpushed commits. -Like `magit-branch-spinoff' but remain on the current branch. -If there are any uncommitted changes, then behave exactly like -`magit-branch-spinoff'. - -\(fn BRANCH &optional FROM)" t nil) - -(autoload 'magit-branch-spinoff "magit-branch" "\ -Create new branch from the unpushed commits. - -Create and checkout a new branch starting at and tracking the -current branch. That branch in turn is reset to the last commit -it shares with its upstream. If the current branch has no -upstream or no unpushed commits, then the new branch is created -anyway and the previously current branch is not touched. - -This is useful to create a feature branch after work has already -began on the old branch (likely but not necessarily \"master\"). - -If the current branch is a member of the value of option -`magit-branch-prefer-remote-upstream' (which see), then the -current branch will be used as the starting point as usual, but -the upstream of the starting-point may be used as the upstream -of the new branch, instead of the starting-point itself. - -If optional FROM is non-nil, then the source branch is reset -to `FROM~', instead of to the last commit it shares with its -upstream. Interactively, FROM is only ever non-nil, if the -region selects some commits, and among those commits, FROM is -the commit that is the fewest commits ahead of the source -branch. - -The commit at the other end of the selection actually does not -matter, all commits between FROM and `HEAD' are moved to the new -branch. If FROM is not reachable from `HEAD' or is reachable -from the source branch's upstream, then an error is raised. - -\(fn BRANCH &optional FROM)" t nil) - -(autoload 'magit-branch-reset "magit-branch" "\ -Reset a branch to the tip of another branch or any other commit. - -When the branch being reset is the current branch, then do a -hard reset. If there are any uncommitted changes, then the user -has to confirm the reset because those changes would be lost. - -This is useful when you have started work on a feature branch but -realize it's all crap and want to start over. - -When resetting to another branch and a prefix argument is used, -then also set the target branch as the upstream of the branch -that is being reset. - -\(fn BRANCH TO &optional SET-UPSTREAM)" t nil) - -(autoload 'magit-branch-delete "magit-branch" "\ -Delete one or multiple branches. -If the region marks multiple branches, then offer to delete -those, otherwise prompt for a single branch to be deleted, -defaulting to the branch at point. - -\(fn BRANCHES &optional FORCE)" t nil) - -(autoload 'magit-branch-rename "magit-branch" "\ -Rename the branch named OLD to NEW. - -With a prefix argument FORCE, rename even if a branch named NEW -already exists. - -If `branch.OLD.pushRemote' is set, then unset it. Depending on -the value of `magit-branch-rename-push-target' (which see) maybe -set `branch.NEW.pushRemote' and maybe rename the push-target on -the remote. - -\(fn OLD NEW &optional FORCE)" t nil) - -(autoload 'magit-branch-shelve "magit-branch" "\ -Shelve a BRANCH. -Rename \"refs/heads/BRANCH\" to \"refs/shelved/BRANCH\", -and also rename the respective reflog file. - -\(fn BRANCH)" t nil) - -(autoload 'magit-branch-unshelve "magit-branch" "\ -Unshelve a BRANCH -Rename \"refs/shelved/BRANCH\" to \"refs/heads/BRANCH\", -and also rename the respective reflog file. - -\(fn BRANCH)" t nil) - (autoload 'magit-branch-configure "magit-branch" nil t) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-branch" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-clone" "magit-clone.el" (0 0 0 0)) -;;; Generated autoloads from magit-clone.el - (autoload 'magit-clone "magit-clone" nil t) - -(autoload 'magit-clone-regular "magit-clone" "\ -Create a clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository. - -\(fn REPOSITORY DIRECTORY ARGS)" t nil) - -(autoload 'magit-clone-shallow "magit-clone" "\ -Create a shallow clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository. -With a prefix argument read the DEPTH of the clone; -otherwise use 1. - -\(fn REPOSITORY DIRECTORY ARGS DEPTH)" t nil) - -(autoload 'magit-clone-shallow-since "magit-clone" "\ -Create a shallow clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository. -Exclude commits before DATE, which is read from the -user. - -\(fn REPOSITORY DIRECTORY ARGS DATE)" t nil) - -(autoload 'magit-clone-shallow-exclude "magit-clone" "\ -Create a shallow clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository. -Exclude commits reachable from EXCLUDE, which is a -branch or tag read from the user. - -\(fn REPOSITORY DIRECTORY ARGS EXCLUDE)" t nil) - -(autoload 'magit-clone-bare "magit-clone" "\ -Create a bare clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository. - -\(fn REPOSITORY DIRECTORY ARGS)" t nil) - -(autoload 'magit-clone-mirror "magit-clone" "\ -Create a mirror of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository. - -\(fn REPOSITORY DIRECTORY ARGS)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-clone" '("magit-clone"))) - -;;;*** - -;;;### (autoloads nil "magit-commit" "magit-commit.el" (0 0 0 0)) -;;; Generated autoloads from magit-commit.el - (autoload 'magit-commit "magit-commit" nil t) - -(autoload 'magit-commit-create "magit-commit" "\ -Create a new commit on `HEAD'. -With a prefix argument, amend to the commit at `HEAD' instead. - -\(git commit [--amend] ARGS) - -\(fn &optional ARGS)" t nil) - -(autoload 'magit-commit-amend "magit-commit" "\ -Amend the last commit. - -\(git commit --amend ARGS) - -\(fn &optional ARGS)" t nil) - -(autoload 'magit-commit-extend "magit-commit" "\ -Amend the last commit, without editing the message. - -With a prefix argument keep the committer date, otherwise change -it. The option `magit-commit-extend-override-date' can be used -to inverse the meaning of the prefix argument. -\(git commit ---amend --no-edit) - -\(fn &optional ARGS OVERRIDE-DATE)" t nil) - -(autoload 'magit-commit-reword "magit-commit" "\ -Reword the last commit, ignoring staged changes. - -With a prefix argument keep the committer date, otherwise change -it. The option `magit-commit-reword-override-date' can be used -to inverse the meaning of the prefix argument. - -Non-interactively respect the optional OVERRIDE-DATE argument -and ignore the option. - -\(git commit --amend --only) - -\(fn &optional ARGS OVERRIDE-DATE)" t nil) - -(autoload 'magit-commit-fixup "magit-commit" "\ -Create a fixup commit. - -With a prefix argument the target COMMIT has to be confirmed. -Otherwise the commit at point may be used without confirmation -depending on the value of option `magit-commit-squash-confirm'. - -\(fn &optional COMMIT ARGS)" t nil) - -(autoload 'magit-commit-squash "magit-commit" "\ -Create a squash commit, without editing the squash message. - -With a prefix argument the target COMMIT has to be confirmed. -Otherwise the commit at point may be used without confirmation -depending on the value of option `magit-commit-squash-confirm'. - -\(fn &optional COMMIT ARGS)" t nil) - -(autoload 'magit-commit-augment "magit-commit" "\ -Create a squash commit, editing the squash message. - -With a prefix argument the target COMMIT has to be confirmed. -Otherwise the commit at point may be used without confirmation -depending on the value of option `magit-commit-squash-confirm'. - -\(fn &optional COMMIT ARGS)" t nil) - -(autoload 'magit-commit-instant-fixup "magit-commit" "\ -Create a fixup commit targeting COMMIT and instantly rebase. - -\(fn &optional COMMIT ARGS)" t nil) - -(autoload 'magit-commit-instant-squash "magit-commit" "\ -Create a squash commit targeting COMMIT and instantly rebase. - -\(fn &optional COMMIT ARGS)" t nil) - -(autoload 'magit-commit-reshelve "magit-commit" "\ -Change the committer date and possibly the author date of `HEAD'. - -If you are the author of `HEAD', then both dates are changed, -otherwise only the committer date. The current time is used -as the initial minibuffer input and the original author (if -that is you) or committer date is available as the previous -history element. - -\(fn DATE)" t nil) - (autoload 'magit-commit-absorb "magit-commit" nil t) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-commit" '("magit"))) - -;;;*** - -;;;### (autoloads nil "magit-diff" "magit-diff.el" (0 0 0 0)) -;;; Generated autoloads from magit-diff.el - (autoload 'magit-diff "magit-diff" nil t) - (autoload 'magit-diff-refresh "magit-diff" nil t) - -(autoload 'magit-diff-dwim "magit-diff" "\ -Show changes for the thing at point. - -\(fn &optional ARGS FILES)" t nil) - -(autoload 'magit-diff-range "magit-diff" "\ -Show differences between two commits. - -REV-OR-RANGE should be a range or a single revision. If it is a -revision, then show changes in the working tree relative to that -revision. If it is a range, but one side is omitted, then show -changes relative to `HEAD'. - -If the region is active, use the revisions on the first and last -line of the region as the two sides of the range. With a prefix -argument, instead of diffing the revisions, choose a revision to -view changes along, starting at the common ancestor of both -revisions (i.e., use a \"...\" range). - -\(fn REV-OR-RANGE &optional ARGS FILES)" t nil) - -(autoload 'magit-diff-working-tree "magit-diff" "\ -Show changes between the current working tree and the `HEAD' commit. -With a prefix argument show changes between the working tree and -a commit read from the minibuffer. - -\(fn &optional REV ARGS FILES)" t nil) - -(autoload 'magit-diff-staged "magit-diff" "\ -Show changes between the index and the `HEAD' commit. -With a prefix argument show changes between the index and -a commit read from the minibuffer. - -\(fn &optional REV ARGS FILES)" t nil) - -(autoload 'magit-diff-unstaged "magit-diff" "\ -Show changes between the working tree and the index. - -\(fn &optional ARGS FILES)" t nil) - -(autoload 'magit-diff-unmerged "magit-diff" "\ -Show changes that are being merged. - -\(fn &optional ARGS FILES)" t nil) - -(autoload 'magit-diff-while-committing "magit-diff" "\ -While committing, show the changes that are about to be committed. -While amending, invoking the command again toggles between -showing just the new changes or all the changes that will -be committed. - -\(fn &optional ARGS)" t nil) - -(autoload 'magit-diff-buffer-file "magit-diff" "\ -Show diff for the blob or file visited in the current buffer. - -When the buffer visits a blob, then show the respective commit. -When the buffer visits a file, then show the differenced between -`HEAD' and the working tree. In both cases limit the diff to -the file or blob. - -\(fn)" t nil) - -(autoload 'magit-diff-paths "magit-diff" "\ -Show changes between any two files on disk. - -\(fn A B)" t nil) - -(autoload 'magit-show-commit "magit-diff" "\ -Visit the revision at point in another buffer. -If there is no revision at point or with a prefix argument prompt -for a revision. - -\(fn REV &optional ARGS FILES MODULE)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-diff" '("magit"))) - -;;;*** - -;;;### (autoloads nil "magit-ediff" "magit-ediff.el" (0 0 0 0)) -;;; Generated autoloads from magit-ediff.el - (autoload 'magit-ediff "magit-ediff" nil) - -(autoload 'magit-ediff-resolve "magit-ediff" "\ -Resolve outstanding conflicts in FILE using Ediff. -FILE has to be relative to the top directory of the repository. - -In the rare event that you want to manually resolve all -conflicts, including those already resolved by Git, use -`ediff-merge-revisions-with-ancestor'. - -\(fn FILE)" t nil) - -(autoload 'magit-ediff-stage "magit-ediff" "\ -Stage and unstage changes to FILE using Ediff. -FILE has to be relative to the top directory of the repository. - -\(fn FILE)" t nil) - -(autoload 'magit-ediff-compare "magit-ediff" "\ -Compare REVA:FILEA with REVB:FILEB using Ediff. - -FILEA and FILEB have to be relative to the top directory of the -repository. If REVA or REVB is nil, then this stands for the -working tree state. - -If the region is active, use the revisions on the first and last -line of the region. With a prefix argument, instead of diffing -the revisions, choose a revision to view changes along, starting -at the common ancestor of both revisions (i.e., use a \"...\" -range). - -\(fn REVA REVB FILEA FILEB)" t nil) - -(autoload 'magit-ediff-dwim "magit-ediff" "\ -Compare, stage, or resolve using Ediff. -This command tries to guess what file, and what commit or range -the user wants to compare, stage, or resolve using Ediff. It -might only be able to guess either the file, or range or commit, -in which case the user is asked about the other. It might not -always guess right, in which case the appropriate `magit-ediff-*' -command has to be used explicitly. If it cannot read the user's -mind at all, then it asks the user for a command to run. - -\(fn)" t nil) - -(autoload 'magit-ediff-show-staged "magit-ediff" "\ -Show staged changes using Ediff. - -This only allows looking at the changes; to stage, unstage, -and discard changes using Ediff, use `magit-ediff-stage'. - -FILE must be relative to the top directory of the repository. - -\(fn FILE)" t nil) - -(autoload 'magit-ediff-show-unstaged "magit-ediff" "\ -Show unstaged changes using Ediff. - -This only allows looking at the changes; to stage, unstage, -and discard changes using Ediff, use `magit-ediff-stage'. - -FILE must be relative to the top directory of the repository. - -\(fn FILE)" t nil) - -(autoload 'magit-ediff-show-working-tree "magit-ediff" "\ -Show changes between `HEAD' and working tree using Ediff. -FILE must be relative to the top directory of the repository. - -\(fn FILE)" t nil) - -(autoload 'magit-ediff-show-commit "magit-ediff" "\ -Show changes introduced by COMMIT using Ediff. - -\(fn COMMIT)" t nil) - -(autoload 'magit-ediff-show-stash "magit-ediff" "\ -Show changes introduced by STASH using Ediff. -`magit-ediff-show-stash-with-index' controls whether a -three-buffer Ediff is used in order to distinguish changes in the -stash that were staged. - -\(fn STASH)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-ediff" '("magit-ediff"))) - -;;;*** - -;;;### (autoloads nil "magit-extras" "magit-extras.el" (0 0 0 0)) -;;; Generated autoloads from magit-extras.el - -(autoload 'magit-run-git-gui "magit-extras" "\ -Run `git gui' for the current git repository. - -\(fn)" t nil) - -(autoload 'magit-run-git-gui-blame "magit-extras" "\ -Run `git gui blame' on the given FILENAME and COMMIT. -Interactively run it for the current file and the `HEAD', with a -prefix or when the current file cannot be determined let the user -choose. When the current buffer is visiting FILENAME instruct -blame to center around the line point is on. - -\(fn COMMIT FILENAME &optional LINENUM)" t nil) - -(autoload 'magit-run-gitk "magit-extras" "\ -Run `gitk' in the current repository. - -\(fn)" t nil) - -(autoload 'magit-run-gitk-branches "magit-extras" "\ -Run `gitk --branches' in the current repository. - -\(fn)" t nil) - -(autoload 'magit-run-gitk-all "magit-extras" "\ -Run `gitk --all' in the current repository. - -\(fn)" t nil) - -(autoload 'ido-enter-magit-status "magit-extras" "\ -Drop into `magit-status' from file switching. - -This command does not work in Emacs 26.1. -See https://github.com/magit/magit/issues/3634 -and https://debbugs.gnu.org/cgi/bugreport.cgi?bug=31707. - -To make this command available use something like: - - (add-hook \\='ido-setup-hook - (lambda () - (define-key ido-completion-map - (kbd \"C-x g\") \\='ido-enter-magit-status))) - -Starting with Emacs 25.1 the Ido keymaps are defined just once -instead of every time Ido is invoked, so now you can modify it -like pretty much every other keymap: - - (define-key ido-common-completion-map - (kbd \"C-x g\") \\='ido-enter-magit-status) - -\(fn)" t nil) - -(autoload 'magit-dired-jump "magit-extras" "\ -Visit file at point using Dired. -With a prefix argument, visit in another window. If there -is no file at point, then instead visit `default-directory'. - -\(fn &optional OTHER-WINDOW)" t nil) - -(autoload 'magit-dired-log "magit-extras" "\ -Show log for all marked files, or the current file. - -\(fn &optional FOLLOW)" t nil) - -(autoload 'magit-do-async-shell-command "magit-extras" "\ -Open FILE with `dired-do-async-shell-command'. -Interactively, open the file at point. - -\(fn FILE)" t nil) - -(autoload 'magit-previous-line "magit-extras" "\ -Like `previous-line' but with Magit-specific shift-selection. - -Magit's selection mechanism is based on the region but selects an -area that is larger than the region. This causes `previous-line' -when invoked while holding the shift key to move up one line and -thereby select two lines. When invoked inside a hunk body this -command does not move point on the first invocation and thereby -it only selects a single line. Which inconsistency you prefer -is a matter of preference. - -\(fn &optional ARG TRY-VSCROLL)" t nil) - -(function-put 'magit-previous-line 'interactive-only '"use `forward-line' with negative argument instead.") - -(autoload 'magit-next-line "magit-extras" "\ -Like `next-line' but with Magit-specific shift-selection. - -Magit's selection mechanism is based on the region but selects -an area that is larger than the region. This causes `next-line' -when invoked while holding the shift key to move down one line -and thereby select two lines. When invoked inside a hunk body -this command does not move point on the first invocation and -thereby it only selects a single line. Which inconsistency you -prefer is a matter of preference. - -\(fn &optional ARG TRY-VSCROLL)" t nil) - -(function-put 'magit-next-line 'interactive-only 'forward-line) - -(autoload 'magit-clean "magit-extras" "\ -Remove untracked files from the working tree. -With a prefix argument also remove ignored files, -with two prefix arguments remove ignored files only. - -\(git clean -f -d [-x|-X]) - -\(fn &optional ARG)" t nil) - -(autoload 'magit-add-change-log-entry "magit-extras" "\ -Find change log file and add date entry and item for current change. -This differs from `add-change-log-entry' (which see) in that -it acts on the current hunk in a Magit buffer instead of on -a position in a file-visiting buffer. - -\(fn &optional WHOAMI FILE-NAME OTHER-WINDOW)" t nil) - -(autoload 'magit-add-change-log-entry-other-window "magit-extras" "\ -Find change log file in other window and add entry and item. -This differs from `add-change-log-entry-other-window' (which see) -in that it acts on the current hunk in a Magit buffer instead of -on a position in a file-visiting buffer. - -\(fn &optional WHOAMI FILE-NAME)" t nil) - -(autoload 'magit-edit-line-commit "magit-extras" "\ -Edit the commit that added the current line. - -With a prefix argument edit the commit that removes the line, -if any. The commit is determined using `git blame' and made -editable using `git rebase --interactive' if it is reachable -from `HEAD', or by checking out the commit (or a branch that -points at it) otherwise. - -\(fn &optional TYPE)" t nil) - -(autoload 'magit-diff-edit-hunk-commit "magit-extras" "\ -From a hunk, edit the respective commit and visit the file. - -First visit the file being modified by the hunk at the correct -location using `magit-diff-visit-file'. This actually visits a -blob. When point is on a diff header, not within an individual -hunk, then this visits the blob the first hunk is about. - -Then invoke `magit-edit-line-commit', which uses an interactive -rebase to make the commit editable, or if that is not possible -because the commit is not reachable from `HEAD' by checking out -that commit directly. This also causes the actual worktree file -to be visited. - -Neither the blob nor the file buffer are killed when finishing -the rebase. If that is undesirable, then it might be better to -use `magit-rebase-edit-command' instead of this command. - -\(fn FILE)" t nil) - -(autoload 'magit-reshelve-since "magit-extras" "\ -Change the author and committer dates of the commits since REV. - -Ask the user for the first reachable commit whose dates should -be changed. Then read the new date for that commit. The initial -minibuffer input and the previous history element offer good -values. The next commit will be created one minute later and so -on. - -This command is only intended for interactive use and should only -be used on highly rearranged and unpublished history. - -\(fn REV)" t nil) - -(autoload 'magit-pop-revision-stack "magit-extras" "\ -Insert a representation of a revision into the current buffer. - -Pop a revision from the `magit-revision-stack' and insert it into -the current buffer according to `magit-pop-revision-stack-format'. -Revisions can be put on the stack using `magit-copy-section-value' -and `magit-copy-buffer-revision'. - -If the stack is empty or with a prefix argument, instead read a -revision in the minibuffer. By using the minibuffer history this -allows selecting an item which was popped earlier or to insert an -arbitrary reference or revision without first pushing it onto the -stack. - -When reading the revision from the minibuffer, then it might not -be possible to guess the correct repository. When this command -is called inside a repository (e.g. while composing a commit -message), then that repository is used. Otherwise (e.g. while -composing an email) then the repository recorded for the top -element of the stack is used (even though we insert another -revision). If not called inside a repository and with an empty -stack, or with two prefix arguments, then read the repository in -the minibuffer too. - -\(fn REV TOPLEVEL)" t nil) - -(autoload 'magit-copy-section-value "magit-extras" "\ -Save the value of the current section for later use. - -Save the section value to the `kill-ring', and, provided that -the current section is a commit, branch, or tag section, push -the (referenced) revision to the `magit-revision-stack' for use -with `magit-pop-revision-stack'. - -When `magit-copy-revision-abbreviated' is non-nil, save the -abbreviated revision to the `kill-ring' and the -`magit-revision-stack'. - -When the current section is a branch or a tag, and a prefix -argument is used, then save the revision at its tip to the -`kill-ring' instead of the reference name. - -When the region is active, then save that to the `kill-ring', -like `kill-ring-save' would, instead of behaving as described -above. If a prefix argument is used and the region is within a -hunk, strip the outer diff marker column. - -\(fn)" t nil) - -(autoload 'magit-copy-buffer-revision "magit-extras" "\ -Save the revision of the current buffer for later use. - -Save the revision shown in the current buffer to the `kill-ring' -and push it to the `magit-revision-stack'. - -This command is mainly intended for use in `magit-revision-mode' -buffers, the only buffers where it is always unambiguous exactly -which revision should be saved. - -Most other Magit buffers usually show more than one revision, in -some way or another, so this command has to select one of them, -and that choice might not always be the one you think would have -been the best pick. - -In such buffers it is often more useful to save the value of -the current section instead, using `magit-copy-section-value'. - -When the region is active, then save that to the `kill-ring', -like `kill-ring-save' would, instead of behaving as described -above. - -When `magit-copy-revision-abbreviated' is non-nil, save the -abbreviated revision to the `kill-ring' and the -`magit-revision-stack'. - -\(fn)" t nil) - -(autoload 'magit-abort-dwim "magit-extras" "\ -Abort current operation. -Depending on the context, this will abort a merge, a rebase, a -patch application, a cherry-pick, a revert, or a bisect. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-extras" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-fetch" "magit-fetch.el" (0 0 0 0)) -;;; Generated autoloads from magit-fetch.el - (autoload 'magit-fetch "magit-fetch" nil t) - (autoload 'magit-fetch-from-pushremote "magit-fetch" nil t) - (autoload 'magit-fetch-from-upstream "magit-fetch" nil t) - -(autoload 'magit-fetch-other "magit-fetch" "\ -Fetch from another repository. - -\(fn REMOTE ARGS)" t nil) - -(autoload 'magit-fetch-branch "magit-fetch" "\ -Fetch a BRANCH from a REMOTE. - -\(fn REMOTE BRANCH ARGS)" t nil) - -(autoload 'magit-fetch-refspec "magit-fetch" "\ -Fetch a REFSPEC from a REMOTE. - -\(fn REMOTE REFSPEC ARGS)" t nil) - -(autoload 'magit-fetch-all "magit-fetch" "\ -Fetch from all remotes. - -\(fn ARGS)" t nil) - -(autoload 'magit-fetch-all-prune "magit-fetch" "\ -Fetch from all remotes, and prune. -Prune remote tracking branches for branches that have been -removed on the respective remote. - -\(fn)" t nil) - -(autoload 'magit-fetch-all-no-prune "magit-fetch" "\ -Fetch from all remotes. - -\(fn)" t nil) - -(autoload 'magit-fetch-modules "magit-fetch" "\ -Fetch all submodules. - -Option `magit-fetch-modules-jobs' controls how many submodules -are being fetched in parallel. Also fetch the super-repository, -because `git-fetch' does not support not doing that. With a -prefix argument fetch all remotes. - -\(fn &optional ALL)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-fetch" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-files" "magit-files.el" (0 0 0 0)) -;;; Generated autoloads from magit-files.el - -(autoload 'magit-find-file "magit-files" "\ -View FILE from REV. -Switch to a buffer visiting blob REV:FILE, creating one if none -already exists. If prior to calling this command the current -buffer and/or cursor position is about the same file, then go -to the line and column corresponding to that location. - -\(fn REV FILE)" t nil) - -(autoload 'magit-find-file-other-window "magit-files" "\ -View FILE from REV, in another window. -Switch to a buffer visiting blob REV:FILE, creating one if none -already exists. If prior to calling this command the current -buffer and/or cursor position is about the same file, then go to -the line and column corresponding to that location. - -\(fn REV FILE)" t nil) - -(autoload 'magit-find-file-other-frame "magit-files" "\ -View FILE from REV, in another frame. -Switch to a buffer visiting blob REV:FILE, creating one if none -already exists. If prior to calling this command the current -buffer and/or cursor position is about the same file, then go to -the line and column corresponding to that location. - -\(fn REV FILE)" t nil) - (autoload 'magit-file-dispatch "magit" nil t) - -(defvar global-magit-file-mode t "\ -Non-nil if Global Magit-File mode is enabled. -See the `global-magit-file-mode' command -for a description of this minor mode. -Setting this variable directly does not take effect; -either customize it (see the info node `Easy Customization') -or call the function `global-magit-file-mode'.") - -(custom-autoload 'global-magit-file-mode "magit-files" nil) - -(autoload 'global-magit-file-mode "magit-files" "\ -Toggle Magit-File mode in all buffers. -With prefix ARG, enable Global Magit-File mode if ARG is positive; -otherwise, disable it. If called from Lisp, enable the mode if -ARG is omitted or nil. - -Magit-File mode is enabled in all buffers where -`magit-file-mode-turn-on' would do it. -See `magit-file-mode' for more information on Magit-File mode. - -\(fn &optional ARG)" t nil) - -(autoload 'magit-blob-visit-file "magit-files" "\ -View the file from the worktree corresponding to the current blob. -When visiting a blob or the version from the index, then go to -the same location in the respective file in the working tree. - -\(fn)" t nil) - -(autoload 'magit-file-checkout "magit-files" "\ -Checkout FILE from REV. - -\(fn REV FILE)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-files" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-git" "magit-git.el" (0 0 0 0)) -;;; Generated autoloads from magit-git.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-git" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-gitignore" "magit-gitignore.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from magit-gitignore.el - (autoload 'magit-gitignore "magit-gitignore" nil t) - -(autoload 'magit-gitignore-in-topdir "magit-gitignore" "\ -Add the Git ignore RULE to the top-level \".gitignore\" file. -Since this file is tracked, it is shared with other clones of the -repository. Also stage the file. - -\(fn RULE)" t nil) - -(autoload 'magit-gitignore-in-subdir "magit-gitignore" "\ -Add the Git ignore RULE to a \".gitignore\" file. -Prompted the user for a directory and add the rule to the -\".gitignore\" file in that directory. Since such files are -tracked, they are shared with other clones of the repository. -Also stage the file. - -\(fn RULE DIRECTORY)" t nil) - -(autoload 'magit-gitignore-in-gitdir "magit-gitignore" "\ -Add the Git ignore RULE to \"$GIT_DIR/info/exclude\". -Rules in that file only affects this clone of the repository. - -\(fn RULE)" t nil) - -(autoload 'magit-gitignore-on-system "magit-gitignore" "\ -Add the Git ignore RULE to the file specified by `core.excludesFile'. -Rules that are defined in that file affect all local repositories. - -\(fn RULE)" t nil) - -(autoload 'magit-skip-worktree "magit-gitignore" "\ -Call \"git update-index --skip-worktree -- FILE\". - -\(fn FILE)" t nil) - -(autoload 'magit-no-skip-worktree "magit-gitignore" "\ -Call \"git update-index --no-skip-worktree -- FILE\". - -\(fn FILE)" t nil) - -(autoload 'magit-assume-unchanged "magit-gitignore" "\ -Call \"git update-index --assume-unchanged -- FILE\". - -\(fn FILE)" t nil) - -(autoload 'magit-no-assume-unchanged "magit-gitignore" "\ -Call \"git update-index --no-assume-unchanged -- FILE\". - -\(fn FILE)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-gitignore" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-imenu" "magit-imenu.el" (0 0 0 0)) -;;; Generated autoloads from magit-imenu.el - -(autoload 'magit-imenu--log-prev-index-position-function "magit-imenu" "\ -Move point to previous line in current buffer. -This function is used as a value for -`imenu-prev-index-position-function'. - -\(fn)" nil nil) - -(autoload 'magit-imenu--log-extract-index-name-function "magit-imenu" "\ -Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line. - -\(fn)" nil nil) - -(autoload 'magit-imenu--diff-prev-index-position-function "magit-imenu" "\ -Move point to previous file line in current buffer. -This function is used as a value for -`imenu-prev-index-position-function'. - -\(fn)" nil nil) - -(autoload 'magit-imenu--diff-extract-index-name-function "magit-imenu" "\ -Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line. - -\(fn)" nil nil) - -(autoload 'magit-imenu--status-create-index-function "magit-imenu" "\ -Return an alist of all imenu entries in current buffer. -This function is used as a value for -`imenu-create-index-function'. - -\(fn)" nil nil) - -(autoload 'magit-imenu--refs-create-index-function "magit-imenu" "\ -Return an alist of all imenu entries in current buffer. -This function is used as a value for -`imenu-create-index-function'. - -\(fn)" nil nil) - -(autoload 'magit-imenu--cherry-create-index-function "magit-imenu" "\ -Return an alist of all imenu entries in current buffer. -This function is used as a value for -`imenu-create-index-function'. - -\(fn)" nil nil) - -(autoload 'magit-imenu--submodule-prev-index-position-function "magit-imenu" "\ -Move point to previous line in magit-submodule-list buffer. -This function is used as a value for -`imenu-prev-index-position-function'. - -\(fn)" nil nil) - -(autoload 'magit-imenu--submodule-extract-index-name-function "magit-imenu" "\ -Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line. - -\(fn)" nil nil) - -(autoload 'magit-imenu--repolist-prev-index-position-function "magit-imenu" "\ -Move point to previous line in magit-repolist buffer. -This function is used as a value for -`imenu-prev-index-position-function'. - -\(fn)" nil nil) - -(autoload 'magit-imenu--repolist-extract-index-name-function "magit-imenu" "\ -Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line. - -\(fn)" nil nil) - -(autoload 'magit-imenu--process-prev-index-position-function "magit-imenu" "\ -Move point to previous process in magit-process buffer. -This function is used as a value for -`imenu-prev-index-position-function'. - -\(fn)" nil nil) - -(autoload 'magit-imenu--process-extract-index-name-function "magit-imenu" "\ -Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line. - -\(fn)" nil nil) - -(autoload 'magit-imenu--rebase-prev-index-position-function "magit-imenu" "\ -Move point to previous commit in git-rebase buffer. -This function is used as a value for -`imenu-prev-index-position-function'. - -\(fn)" nil nil) - -(autoload 'magit-imenu--rebase-extract-index-name-function "magit-imenu" "\ -Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line. - -\(fn)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-imenu" '("magit-imenu--index-function"))) - -;;;*** - -;;;### (autoloads nil "magit-log" "magit-log.el" (0 0 0 0)) -;;; Generated autoloads from magit-log.el - (autoload 'magit-log "magit-log" nil t) - (autoload 'magit-log-refresh "magit-log" nil t) - -(autoload 'magit-log-current "magit-log" "\ -Show log for the current branch. -When `HEAD' is detached or with a prefix argument show log for -one or more revs read from the minibuffer. - -\(fn REVS &optional ARGS FILES)" t nil) - -(autoload 'magit-log-other "magit-log" "\ -Show log for one or more revs read from the minibuffer. -The user can input any revision or revisions separated by a -space, or even ranges, but only branches and tags, and a -representation of the commit at point, are available as -completion candidates. - -\(fn REVS &optional ARGS FILES)" t nil) - -(autoload 'magit-log-head "magit-log" "\ -Show log for `HEAD'. - -\(fn &optional ARGS FILES)" t nil) - -(autoload 'magit-log-branches "magit-log" "\ -Show log for all local branches and `HEAD'. - -\(fn &optional ARGS FILES)" t nil) - -(autoload 'magit-log-matching-branches "magit-log" "\ -Show log for all branches matching PATTERN and `HEAD'. - -\(fn PATTERN &optional ARGS FILES)" t nil) - -(autoload 'magit-log-matching-tags "magit-log" "\ -Show log for all tags matching PATTERN and `HEAD'. - -\(fn PATTERN &optional ARGS FILES)" t nil) - -(autoload 'magit-log-all-branches "magit-log" "\ -Show log for all local and remote branches and `HEAD'. - -\(fn &optional ARGS FILES)" t nil) - -(autoload 'magit-log-all "magit-log" "\ -Show log for all references and `HEAD'. - -\(fn &optional ARGS FILES)" t nil) - -(autoload 'magit-log-buffer-file "magit-log" "\ -Show log for the blob or file visited in the current buffer. -With a prefix argument or when `--follow' is an active log -argument, then follow renames. When the region is active, -restrict the log to the lines that the region touches. - -\(fn &optional FOLLOW BEG END)" t nil) - -(autoload 'magit-log-trace-definition "magit-log" "\ -Show log for the definition at point. - -\(fn FILE FN REV)" t nil) - -(autoload 'magit-log-merged "magit-log" "\ -Show log for the merge of COMMIT into BRANCH. - -More precisely, find merge commit M that brought COMMIT into -BRANCH, and show the log of the range \"M^1..M\". If COMMIT is -directly on BRANCH, then show approximately twenty surrounding -commits instead. - -This command requires git-when-merged, which is available from -https://github.com/mhagger/git-when-merged. - -\(fn COMMIT BRANCH &optional ARGS FILES)" t nil) - -(autoload 'magit-log-move-to-parent "magit-log" "\ -Move to the Nth parent of the current commit. - -\(fn &optional N)" t nil) - -(autoload 'magit-cherry "magit-log" "\ -Show commits in a branch that are not merged in the upstream branch. - -\(fn HEAD UPSTREAM)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-log" '("magit"))) - -;;;*** - -;;;### (autoloads nil "magit-margin" "magit-margin.el" (0 0 0 0)) -;;; Generated autoloads from magit-margin.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-margin" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-merge" "magit-merge.el" (0 0 0 0)) -;;; Generated autoloads from magit-merge.el - (autoload 'magit-merge "magit" nil t) - -(autoload 'magit-merge-plain "magit-merge" "\ -Merge commit REV into the current branch; using default message. - -Unless there are conflicts or a prefix argument is used create a -merge commit using a generic commit message and without letting -the user inspect the result. With a prefix argument pretend the -merge failed to give the user the opportunity to inspect the -merge. - -\(git merge --no-edit|--no-commit [ARGS] REV) - -\(fn REV &optional ARGS NOCOMMIT)" t nil) - -(autoload 'magit-merge-editmsg "magit-merge" "\ -Merge commit REV into the current branch; and edit message. -Perform the merge and prepare a commit message but let the user -edit it. - -\(git merge --edit --no-ff [ARGS] REV) - -\(fn REV &optional ARGS)" t nil) - -(autoload 'magit-merge-nocommit "magit-merge" "\ -Merge commit REV into the current branch; pretending it failed. -Pretend the merge failed to give the user the opportunity to -inspect the merge and change the commit message. - -\(git merge --no-commit --no-ff [ARGS] REV) - -\(fn REV &optional ARGS)" t nil) - -(autoload 'magit-merge-into "magit-merge" "\ -Merge the current branch into BRANCH and remove the former. - -Before merging, force push the source branch to its push-remote, -provided the respective remote branch already exists, ensuring -that the respective pull-request (if any) won't get stuck on some -obsolete version of the commits that are being merged. Finally -if `forge-branch-pullreq' was used to create the merged branch, -branch, then also remove the respective remote branch. - -\(fn BRANCH &optional ARGS)" t nil) - -(autoload 'magit-merge-absorb "magit-merge" "\ -Merge BRANCH into the current branch and remove the former. - -Before merging, force push the source branch to its push-remote, -provided the respective remote branch already exists, ensuring -that the respective pull-request (if any) won't get stuck on some -obsolete version of the commits that are being merged. Finally -if `forge-branch-pullreq' was used to create the merged branch, -then also remove the respective remote branch. - -\(fn BRANCH &optional ARGS)" t nil) - -(autoload 'magit-merge-squash "magit-merge" "\ -Squash commit REV into the current branch; don't create a commit. - -\(git merge --squash REV) - -\(fn REV)" t nil) - -(autoload 'magit-merge-preview "magit-merge" "\ -Preview result of merging REV into the current branch. - -\(fn REV)" t nil) - -(autoload 'magit-merge-abort "magit-merge" "\ -Abort the current merge operation. - -\(git merge --abort) - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-merge" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-mode" "magit-mode.el" (0 0 0 0)) -;;; Generated autoloads from magit-mode.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-mode" '("magit-" "disable-magit-save-buffers" "inhibit-magit-refresh"))) - -;;;*** - -;;;### (autoloads nil "magit-notes" "magit-notes.el" (0 0 0 0)) -;;; Generated autoloads from magit-notes.el - (autoload 'magit-notes "magit" nil t) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-notes" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-obsolete" "magit-obsolete.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from magit-obsolete.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-obsolete" '("magit--magit-popup-warning"))) - -;;;*** - -;;;### (autoloads nil "magit-patch" "magit-patch.el" (0 0 0 0)) -;;; Generated autoloads from magit-patch.el - (autoload 'magit-patch "magit-patch" nil t) - (autoload 'magit-patch-create "magit-patch" nil t) - (autoload 'magit-patch-apply "magit-patch" nil t) - -(autoload 'magit-patch-save "magit-patch" "\ -Write current diff into patch FILE. - -What arguments are used to create the patch depends on the value -of `magit-patch-save-arguments' and whether a prefix argument is -used. - -If the value is the symbol `buffer', then use the same arguments -as the buffer. With a prefix argument use no arguments. - -If the value is a list beginning with the symbol `exclude', then -use the same arguments as the buffer except for those matched by -entries in the cdr of the list. The comparison is done using -`string-prefix-p'. With a prefix argument use the same arguments -as the buffer. - -If the value is a list of strings (including the empty list), -then use those arguments. With a prefix argument use the same -arguments as the buffer. - -Of course the arguments that are required to actually show the -same differences as those shown in the buffer are always used. - -\(fn FILE &optional ARG)" t nil) - -(autoload 'magit-request-pull "magit-patch" "\ -Request upstream to pull from you public repository. - -URL is the url of your publicly accessible repository. -START is a commit that already is in the upstream repository. -END is the last commit, usually a branch name, which upstream -is asked to pull. START has to be reachable from that commit. - -\(fn URL START END)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-patch" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-process" "magit-process.el" (0 0 0 0)) -;;; Generated autoloads from magit-process.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-process" '("magit-" "tramp-sh-handle-"))) - -;;;*** - -;;;### (autoloads nil "magit-pull" "magit-pull.el" (0 0 0 0)) -;;; Generated autoloads from magit-pull.el - (autoload 'magit-pull "magit-pull" nil t) - (autoload 'magit-pull-from-pushremote "magit-pull" nil t) - (autoload 'magit-pull-from-upstream "magit-pull" nil t) - -(autoload 'magit-pull-branch "magit-pull" "\ -Pull from a branch read in the minibuffer. - -\(fn SOURCE ARGS)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-pull" '("magit-pull"))) - -;;;*** - -;;;### (autoloads nil "magit-push" "magit-push.el" (0 0 0 0)) -;;; Generated autoloads from magit-push.el - (autoload 'magit-push "magit-push" nil t) - (autoload 'magit-push-current-to-pushremote "magit-push" nil t) - (autoload 'magit-push-current-to-upstream "magit-push" nil t) - -(autoload 'magit-push-current "magit-push" "\ -Push the current branch to a branch read in the minibuffer. - -\(fn TARGET ARGS)" t nil) - -(autoload 'magit-push-other "magit-push" "\ -Push an arbitrary branch or commit somewhere. -Both the source and the target are read in the minibuffer. - -\(fn SOURCE TARGET ARGS)" t nil) - -(autoload 'magit-push-refspecs "magit-push" "\ -Push one or multiple REFSPECS to a REMOTE. -Both the REMOTE and the REFSPECS are read in the minibuffer. To -use multiple REFSPECS, separate them with commas. Completion is -only available for the part before the colon, or when no colon -is used. - -\(fn REMOTE REFSPECS ARGS)" t nil) - -(autoload 'magit-push-matching "magit-push" "\ -Push all matching branches to another repository. -If multiple remotes exist, then read one from the user. -If just one exists, use that without requiring confirmation. - -\(fn REMOTE &optional ARGS)" t nil) - -(autoload 'magit-push-tags "magit-push" "\ -Push all tags to another repository. -If only one remote exists, then push to that. Otherwise prompt -for a remote, offering the remote configured for the current -branch as default. - -\(fn REMOTE &optional ARGS)" t nil) - -(autoload 'magit-push-tag "magit-push" "\ -Push a tag to another repository. - -\(fn TAG REMOTE &optional ARGS)" t nil) - -(autoload 'magit-push-notes-ref "magit-push" "\ -Push a notes ref to another repository. - -\(fn REF REMOTE &optional ARGS)" t nil) - -(autoload 'magit-push-implicitly "magit-push" "\ -Push somewhere without using an explicit refspec. - -This command simply runs \"git push -v [ARGS]\". ARGS are the -arguments specified in the popup buffer. No explicit refspec -arguments are used. Instead the behavior depends on at least -these Git variables: `push.default', `remote.pushDefault', -`branch..pushRemote', `branch..remote', -`branch..merge', and `remote..push'. - -The function `magit-push-implicitly--desc' attempts to predict -what this command will do. The value it returns is displayed in -the popup buffer. - -\(fn ARGS)" t nil) - -(autoload 'magit-push-to-remote "magit-push" "\ -Push to REMOTE without using an explicit refspec. -The REMOTE is read in the minibuffer. - -This command simply runs \"git push -v [ARGS] REMOTE\". ARGS -are the arguments specified in the popup buffer. No refspec -arguments are used. Instead the behavior depends on at least -these Git variables: `push.default', `remote.pushDefault', -`branch..pushRemote', `branch..remote', -`branch..merge', and `remote..push'. - -\(fn REMOTE ARGS)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-push" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-reflog" "magit-reflog.el" (0 0 0 0)) -;;; Generated autoloads from magit-reflog.el - -(autoload 'magit-reflog-current "magit-reflog" "\ -Display the reflog of the current branch. -If `HEAD' is detached, then show the reflog for that instead. - -\(fn)" t nil) - -(autoload 'magit-reflog-other "magit-reflog" "\ -Display the reflog of a branch or another ref. - -\(fn REF)" t nil) - -(autoload 'magit-reflog-head "magit-reflog" "\ -Display the `HEAD' reflog. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-reflog" '("magit-reflog-"))) - -;;;*** - -;;;### (autoloads nil "magit-refs" "magit-refs.el" (0 0 0 0)) -;;; Generated autoloads from magit-refs.el - (autoload 'magit-show-refs "magit-refs" nil t) - -(autoload 'magit-show-refs-head "magit-refs" "\ -List and compare references in a dedicated buffer. -Compared with `HEAD'. - -\(fn &optional ARGS)" t nil) - -(autoload 'magit-show-refs-current "magit-refs" "\ -List and compare references in a dedicated buffer. -Compare with the current branch or `HEAD' if it is detached. - -\(fn &optional ARGS)" t nil) - -(autoload 'magit-show-refs-other "magit-refs" "\ -List and compare references in a dedicated buffer. -Compared with a branch read from the user. - -\(fn &optional REF ARGS)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-refs" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-remote" "magit-remote.el" (0 0 0 0)) -;;; Generated autoloads from magit-remote.el - (autoload 'magit-remote "magit-remote" nil t) - -(autoload 'magit-remote-add "magit-remote" "\ -Add a remote named REMOTE and fetch it. - -\(fn REMOTE URL &optional ARGS)" t nil) - -(autoload 'magit-remote-rename "magit-remote" "\ -Rename the remote named OLD to NEW. - -\(fn OLD NEW)" t nil) - -(autoload 'magit-remote-remove "magit-remote" "\ -Delete the remote named REMOTE. - -\(fn REMOTE)" t nil) - -(autoload 'magit-remote-prune "magit-remote" "\ -Remove stale remote-tracking branches for REMOTE. - -\(fn REMOTE)" t nil) - -(autoload 'magit-remote-prune-refspecs "magit-remote" "\ -Remove stale refspecs for REMOTE. - -A refspec is stale if there no longer exists at least one branch -on the remote that would be fetched due to that refspec. A stale -refspec is problematic because its existence causes Git to refuse -to fetch according to the remaining non-stale refspecs. - -If only stale refspecs remain, then offer to either delete the -remote or to replace the stale refspecs with the default refspec. - -Also remove the remote-tracking branches that were created due to -the now stale refspecs. Other stale branches are not removed. - -\(fn REMOTE)" t nil) - -(autoload 'magit-remote-set-head "magit-remote" "\ -Set the local representation of REMOTE's default branch. -Query REMOTE and set the symbolic-ref refs/remotes//HEAD -accordingly. With a prefix argument query for the branch to be -used, which allows you to select an incorrect value if you fancy -doing that. - -\(fn REMOTE &optional BRANCH)" t nil) - -(autoload 'magit-remote-unset-head "magit-remote" "\ -Unset the local representation of REMOTE's default branch. -Delete the symbolic-ref \"refs/remotes//HEAD\". - -\(fn REMOTE)" t nil) - (autoload 'magit-remote-configure "magit-remote" nil t) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-remote" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-repos" "magit-repos.el" (0 0 0 0)) -;;; Generated autoloads from magit-repos.el - -(autoload 'magit-list-repositories "magit-repos" "\ -Display a list of repositories. - -Use the options `magit-repository-directories' to control which -repositories are displayed. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-repos" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-reset" "magit-reset.el" (0 0 0 0)) -;;; Generated autoloads from magit-reset.el - (autoload 'magit-reset "magit" nil t) - -(autoload 'magit-reset-mixed "magit-reset" "\ -Reset the `HEAD' and index to COMMIT, but not the working tree. - -\(git reset --mixed COMMIT) - -\(fn COMMIT)" t nil) - -(autoload 'magit-reset-soft "magit-reset" "\ -Reset the `HEAD' to COMMIT, but not the index and working tree. - -\(git reset --soft REVISION) - -\(fn COMMIT)" t nil) - -(autoload 'magit-reset-hard "magit-reset" "\ -Reset the `HEAD', index, and working tree to COMMIT. - -\(git reset --hard REVISION) - -\(fn COMMIT)" t nil) - -(autoload 'magit-reset-index "magit-reset" "\ -Reset the index to COMMIT. -Keep the `HEAD' and working tree as-is, so if COMMIT refers to the -head this effectively unstages all changes. - -\(git reset COMMIT .) - -\(fn COMMIT)" t nil) - -(autoload 'magit-reset-worktree "magit-reset" "\ -Reset the worktree to COMMIT. -Keep the `HEAD' and index as-is. - -\(fn COMMIT)" t nil) - -(autoload 'magit-reset-quickly "magit-reset" "\ -Reset the `HEAD' and index to COMMIT, and possibly the working tree. -With a prefix argument reset the working tree otherwise don't. - -\(git reset --mixed|--hard COMMIT) - -\(fn COMMIT &optional HARD)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-reset" '("magit-reset"))) - -;;;*** - -;;;### (autoloads nil "magit-section" "magit-section.el" (0 0 0 0)) -;;; Generated autoloads from magit-section.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-section" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-sequence" "magit-sequence.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from magit-sequence.el - -(autoload 'magit-sequencer-continue "magit-sequence" "\ -Resume the current cherry-pick or revert sequence. - -\(fn)" t nil) - -(autoload 'magit-sequencer-skip "magit-sequence" "\ -Skip the stopped at commit during a cherry-pick or revert sequence. - -\(fn)" t nil) - -(autoload 'magit-sequencer-abort "magit-sequence" "\ -Abort the current cherry-pick or revert sequence. -This discards all changes made since the sequence started. - -\(fn)" t nil) - (autoload 'magit-cherry-pick "magit-sequence" nil t) - -(autoload 'magit-cherry-copy "magit-sequence" "\ -Copy COMMITS from another branch onto the current branch. -Prompt for a commit, defaulting to the commit at point. If -the region selects multiple commits, then pick all of them, -without prompting. - -\(fn COMMITS &optional ARGS)" t nil) - -(autoload 'magit-cherry-apply "magit-sequence" "\ -Apply the changes in COMMITS but do not commit them. -Prompt for a commit, defaulting to the commit at point. If -the region selects multiple commits, then apply all of them, -without prompting. - -\(fn COMMITS &optional ARGS)" t nil) - -(autoload 'magit-cherry-harvest "magit-sequence" "\ -Move COMMITS from another BRANCH onto the current branch. -Remove the COMMITS from BRANCH and stay on the current branch. -If a conflict occurs, then you have to fix that and finish the -process manually. - -\(fn COMMITS BRANCH &optional ARGS)" t nil) - -(autoload 'magit-cherry-donate "magit-sequence" "\ -Move COMMITS from the current branch onto another existing BRANCH. -Remove COMMITS from the current branch and stay on that branch. -If a conflict occurs, then you have to fix that and finish the -process manually. - -\(fn COMMITS BRANCH &optional ARGS)" t nil) - -(autoload 'magit-cherry-spinout "magit-sequence" "\ -Move COMMITS from the current branch onto a new BRANCH. -Remove COMMITS from the current branch and stay on that branch. -If a conflict occurs, then you have to fix that and finish the -process manually. - -\(fn COMMITS BRANCH START-POINT &optional ARGS)" t nil) - -(autoload 'magit-cherry-spinoff "magit-sequence" "\ -Move COMMITS from the current branch onto a new BRANCH. -Remove COMMITS from the current branch and checkout BRANCH. -If a conflict occurs, then you have to fix that and finish -the process manually. - -\(fn COMMITS BRANCH START-POINT &optional ARGS)" t nil) - (autoload 'magit-revert "magit-sequence" nil t) - -(autoload 'magit-revert-and-commit "magit-sequence" "\ -Revert COMMIT by creating a new commit. -Prompt for a commit, defaulting to the commit at point. If -the region selects multiple commits, then revert all of them, -without prompting. - -\(fn COMMIT &optional ARGS)" t nil) - -(autoload 'magit-revert-no-commit "magit-sequence" "\ -Revert COMMIT by applying it in reverse to the worktree. -Prompt for a commit, defaulting to the commit at point. If -the region selects multiple commits, then revert all of them, -without prompting. - -\(fn COMMIT &optional ARGS)" t nil) - (autoload 'magit-am "magit-sequence" nil t) - -(autoload 'magit-am-apply-patches "magit-sequence" "\ -Apply the patches FILES. - -\(fn &optional FILES ARGS)" t nil) - -(autoload 'magit-am-apply-maildir "magit-sequence" "\ -Apply the patches from MAILDIR. - -\(fn &optional MAILDIR ARGS)" t nil) - -(autoload 'magit-am-continue "magit-sequence" "\ -Resume the current patch applying sequence. - -\(fn)" t nil) - -(autoload 'magit-am-skip "magit-sequence" "\ -Skip the stopped at patch during a patch applying sequence. - -\(fn)" t nil) - -(autoload 'magit-am-abort "magit-sequence" "\ -Abort the current patch applying sequence. -This discards all changes made since the sequence started. - -\(fn)" t nil) - (autoload 'magit-rebase "magit-sequence" nil t) - (autoload 'magit-rebase-onto-pushremote "magit-sequence" nil t) - (autoload 'magit-rebase-onto-upstream "magit-sequence" nil t) - -(autoload 'magit-rebase-branch "magit-sequence" "\ -Rebase the current branch onto a branch read in the minibuffer. -All commits that are reachable from `HEAD' but not from the -selected branch TARGET are being rebased. - -\(fn TARGET ARGS)" t nil) - -(autoload 'magit-rebase-subset "magit-sequence" "\ -Rebase a subset of the current branch's history onto a new base. -Rebase commits from START to `HEAD' onto NEWBASE. -START has to be selected from a list of recent commits. - -\(fn NEWBASE START ARGS)" t nil) - -(autoload 'magit-rebase-interactive "magit-sequence" "\ -Start an interactive rebase sequence. - -\(fn COMMIT ARGS)" t nil) - -(autoload 'magit-rebase-autosquash "magit-sequence" "\ -Combine squash and fixup commits with their intended targets. - -\(fn ARGS)" t nil) - -(autoload 'magit-rebase-edit-commit "magit-sequence" "\ -Edit a single older commit using rebase. - -\(fn COMMIT ARGS)" t nil) - -(autoload 'magit-rebase-reword-commit "magit-sequence" "\ -Reword a single older commit using rebase. - -\(fn COMMIT ARGS)" t nil) - -(autoload 'magit-rebase-remove-commit "magit-sequence" "\ -Remove a single older commit using rebase. - -\(fn COMMIT ARGS)" t nil) - -(autoload 'magit-rebase-continue "magit-sequence" "\ -Restart the current rebasing operation. -In some cases this pops up a commit message buffer for you do -edit. With a prefix argument the old message is reused as-is. - -\(fn &optional NOEDIT)" t nil) - -(autoload 'magit-rebase-skip "magit-sequence" "\ -Skip the current commit and restart the current rebase operation. - -\(fn)" t nil) - -(autoload 'magit-rebase-edit "magit-sequence" "\ -Edit the todo list of the current rebase operation. - -\(fn)" t nil) - -(autoload 'magit-rebase-abort "magit-sequence" "\ -Abort the current rebase operation, restoring the original branch. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-sequence" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-stash" "magit-stash.el" (0 0 0 0)) -;;; Generated autoloads from magit-stash.el - (autoload 'magit-stash "magit-stash" nil t) - -(autoload 'magit-stash-both "magit-stash" "\ -Create a stash of the index and working tree. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'. - -\(fn MESSAGE &optional INCLUDE-UNTRACKED)" t nil) - -(autoload 'magit-stash-index "magit-stash" "\ -Create a stash of the index only. -Unstaged and untracked changes are not stashed. The stashed -changes are applied in reverse to both the index and the -worktree. This command can fail when the worktree is not clean. -Applying the resulting stash has the inverse effect. - -\(fn MESSAGE)" t nil) - -(autoload 'magit-stash-worktree "magit-stash" "\ -Create a stash of unstaged changes in the working tree. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'. - -\(fn MESSAGE &optional INCLUDE-UNTRACKED)" t nil) - -(autoload 'magit-stash-keep-index "magit-stash" "\ -Create a stash of the index and working tree, keeping index intact. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'. - -\(fn MESSAGE &optional INCLUDE-UNTRACKED)" t nil) - -(autoload 'magit-snapshot-both "magit-stash" "\ -Create a snapshot of the index and working tree. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'. - -\(fn &optional INCLUDE-UNTRACKED)" t nil) - -(autoload 'magit-snapshot-index "magit-stash" "\ -Create a snapshot of the index only. -Unstaged and untracked changes are not stashed. - -\(fn)" t nil) - -(autoload 'magit-snapshot-worktree "magit-stash" "\ -Create a snapshot of unstaged changes in the working tree. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'. - -\(fn &optional INCLUDE-UNTRACKED)" t nil) - -(autoload 'magit-stash-apply "magit-stash" "\ -Apply a stash to the working tree. -Try to preserve the stash index. If that fails because there -are staged changes, apply without preserving the stash index. - -\(fn STASH)" t nil) - -(autoload 'magit-stash-drop "magit-stash" "\ -Remove a stash from the stash list. -When the region is active offer to drop all contained stashes. - -\(fn STASH)" t nil) - -(autoload 'magit-stash-clear "magit-stash" "\ -Remove all stashes saved in REF's reflog by deleting REF. - -\(fn REF)" t nil) - -(autoload 'magit-stash-branch "magit-stash" "\ -Create and checkout a new BRANCH from STASH. - -\(fn STASH BRANCH)" t nil) - -(autoload 'magit-stash-branch-here "magit-stash" "\ -Create and checkout a new BRANCH and apply STASH. -The branch is created using `magit-branch-and-checkout', using the -current branch or `HEAD' as the start-point. - -\(fn STASH BRANCH)" t nil) - -(autoload 'magit-stash-format-patch "magit-stash" "\ -Create a patch from STASH - -\(fn STASH)" t nil) - -(autoload 'magit-stash-list "magit-stash" "\ -List all stashes in a buffer. - -\(fn)" t nil) - -(autoload 'magit-stash-show "magit-stash" "\ -Show all diffs of a stash in a buffer. - -\(fn STASH &optional ARGS FILES)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-stash" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-status" "magit-status.el" (0 0 0 0)) -;;; Generated autoloads from magit-status.el - -(autoload 'magit-init "magit-status" "\ -Initialize a Git repository, then show its status. - -If the directory is below an existing repository, then the user -has to confirm that a new one should be created inside. If the -directory is the root of the existing repository, then the user -has to confirm that it should be reinitialized. - -Non-interactively DIRECTORY is (re-)initialized unconditionally. - -\(fn DIRECTORY)" t nil) - -(autoload 'magit-status "magit-status" "\ -Show the status of the current Git repository in a buffer. - -If the current directory isn't located within a Git repository, -then prompt for an existing repository or an arbitrary directory, -depending on option `magit-repository-directories', and show the -status of the selected repository instead. - -* If that option specifies any existing repositories, then offer - those for completion and show the status buffer for the - selected one. - -* Otherwise read an arbitrary directory using regular file-name - completion. If the selected directory is the top-level of an - existing working tree, then show the status buffer for that. - -* Otherwise offer to initialize the selected directory as a new - repository. After creating the repository show its status - buffer. - -These fallback behaviors can also be forced using one or more -prefix arguments: - -* With two prefix arguments (or more precisely a numeric prefix - value of 16 or greater) read an arbitrary directory and act on - it as described above. The same could be accomplished using - the command `magit-init'. - -* With a single prefix argument read an existing repository, or - if none can be found based on `magit-repository-directories', - then fall back to the same behavior as with two prefix - arguments. - -\(fn &optional DIRECTORY CACHE)" t nil) - -(defalias 'magit 'magit-status "\ -An alias for `magit-status' for better discoverability. - -Instead of invoking this alias for `magit-status' using -\"M-x magit RET\", you should bind a key to `magit-status' -and read the info node `(magit)Getting Started', which -also contains other useful hints.") - -(autoload 'magit-status-here "magit-status" "\ -Like `magit-status' but with non-nil `magit-status-goto-file-position'. - -\(fn)" t nil) - -(autoload 'magit-status-setup-buffer "magit-status" "\ - - -\(fn &optional DIRECTORY)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-status" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-submodule" "magit-submodule.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from magit-submodule.el - (autoload 'magit-submodule "magit-submodule" nil t) - (autoload 'magit-submodule-add "magit-submodule" nil t) - -(autoload 'magit-submodule-read-name-for-path "magit-submodule" "\ - - -\(fn PATH &optional PREFER-SHORT)" nil nil) - (autoload 'magit-submodule-register "magit-submodule" nil t) - (autoload 'magit-submodule-populate "magit-submodule" nil t) - (autoload 'magit-submodule-update "magit-submodule" nil t) - (autoload 'magit-submodule-synchronize "magit-submodule" nil t) - (autoload 'magit-submodule-unpopulate "magit-submodule" nil t) - -(autoload 'magit-submodule-remove "magit-submodule" "\ -Unregister MODULES and remove their working directories. - -For safety reasons, do not remove the gitdirs and if a module has -uncomitted changes, then do not remove it at all. If a module's -gitdir is located inside the working directory, then move it into -the gitdir of the superproject first. - -With the \"--force\" argument offer to remove dirty working -directories and with a prefix argument offer to delete gitdirs. -Both actions are very dangerous and have to be confirmed. There -are additional safety precautions in place, so you might be able -to recover from making a mistake here, but don't count on it. - -\(fn MODULES ARGS TRASH-GITDIRS)" t nil) - -(autoload 'magit-insert-modules "magit-submodule" "\ -Insert submodule sections. -Hook `magit-module-sections-hook' controls which module sections -are inserted, and option `magit-module-sections-nested' controls -whether they are wrapped in an additional section. - -\(fn)" nil nil) - -(autoload 'magit-insert-modules-overview "magit-submodule" "\ -Insert sections for all modules. -For each section insert the path and the output of `git describe --tags', -or, failing that, the abbreviated HEAD commit hash. - -\(fn)" nil nil) - -(autoload 'magit-insert-modules-unpulled-from-upstream "magit-submodule" "\ -Insert sections for modules that haven't been pulled from the upstream. -These sections can be expanded to show the respective commits. - -\(fn)" nil nil) - -(autoload 'magit-insert-modules-unpulled-from-pushremote "magit-submodule" "\ -Insert sections for modules that haven't been pulled from the push-remote. -These sections can be expanded to show the respective commits. - -\(fn)" nil nil) - -(autoload 'magit-insert-modules-unpushed-to-upstream "magit-submodule" "\ -Insert sections for modules that haven't been pushed to the upstream. -These sections can be expanded to show the respective commits. - -\(fn)" nil nil) - -(autoload 'magit-insert-modules-unpushed-to-pushremote "magit-submodule" "\ -Insert sections for modules that haven't been pushed to the push-remote. -These sections can be expanded to show the respective commits. - -\(fn)" nil nil) - -(autoload 'magit-list-submodules "magit-submodule" "\ -Display a list of the current repository's submodules. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-submodule" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-subtree" "magit-subtree.el" (0 0 0 0)) -;;; Generated autoloads from magit-subtree.el - (autoload 'magit-subtree "magit-subtree" nil t) - (autoload 'magit-subtree-import "magit-subtree" nil t) - (autoload 'magit-subtree-export "magit-subtree" nil t) - -(autoload 'magit-subtree-add "magit-subtree" "\ -Add REF from REPOSITORY as a new subtree at PREFIX. - -\(fn PREFIX REPOSITORY REF ARGS)" t nil) - -(autoload 'magit-subtree-add-commit "magit-subtree" "\ -Add COMMIT as a new subtree at PREFIX. - -\(fn PREFIX COMMIT ARGS)" t nil) - -(autoload 'magit-subtree-merge "magit-subtree" "\ -Merge COMMIT into the PREFIX subtree. - -\(fn PREFIX COMMIT ARGS)" t nil) - -(autoload 'magit-subtree-pull "magit-subtree" "\ -Pull REF from REPOSITORY into the PREFIX subtree. - -\(fn PREFIX REPOSITORY REF ARGS)" t nil) - -(autoload 'magit-subtree-push "magit-subtree" "\ -Extract the history of the subtree PREFIX and push it to REF on REPOSITORY. - -\(fn PREFIX REPOSITORY REF ARGS)" t nil) - -(autoload 'magit-subtree-split "magit-subtree" "\ -Extract the history of the subtree PREFIX. - -\(fn PREFIX COMMIT ARGS)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-subtree" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-tag" "magit-tag.el" (0 0 0 0)) -;;; Generated autoloads from magit-tag.el - (autoload 'magit-tag "magit" nil t) - -(autoload 'magit-tag-create "magit-tag" "\ -Create a new tag with the given NAME at REV. -With a prefix argument annotate the tag. - -\(git tag [--annotate] NAME REV) - -\(fn NAME REV &optional ARGS)" t nil) - -(autoload 'magit-tag-delete "magit-tag" "\ -Delete one or more tags. -If the region marks multiple tags (and nothing else), then offer -to delete those, otherwise prompt for a single tag to be deleted, -defaulting to the tag at point. - -\(git tag -d TAGS) - -\(fn TAGS)" t nil) - -(autoload 'magit-tag-prune "magit-tag" "\ -Offer to delete tags missing locally from REMOTE, and vice versa. - -\(fn TAGS REMOTE-TAGS REMOTE)" t nil) - -(autoload 'magit-tag-release "magit-tag" "\ -Create an annotated release tag. - -Assume that release tags match `magit-release-tag-regexp'. - -First prompt for the name of the new tag using the highest -existing tag as initial input and leaving it to the user to -increment the desired part of the version string. - -Then prompt for the message of the new tag. Base the proposed -tag message on the message of the highest tag, provided that -that contains the corresponding version string and substituting -the new version string for that. Otherwise propose something -like \"Foo-Bar 1.2.3\", given, for example, a TAG \"v1.2.3\" and a -repository located at something like \"/path/to/foo-bar\". - -Then call \"git tag --annotate --sign -m MSG TAG\" to create the, -tag, regardless of whether these arguments are enabled in the -popup. Finally show the refs buffer to let the user quickly -review the result. - -\(fn TAG MSG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-tag" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-transient" "magit-transient.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from magit-transient.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-transient" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-utils" "magit-utils.el" (0 0 0 0)) -;;; Generated autoloads from magit-utils.el - -(autoload 'magit-emacs-Q-command "magit-utils" "\ -Show a shell command that runs an uncustomized Emacs with only Magit loaded. -See info node `(magit)Debugging Tools' for more information. - -\(fn)" t nil) - -(autoload 'Info-follow-nearest-node--magit-gitman "magit-utils" "\ - - -\(fn FN &optional FORK)" nil nil) - -(advice-add 'Info-follow-nearest-node :around 'Info-follow-nearest-node--magit-gitman) - -(autoload 'org-man-export--magit-gitman "magit-utils" "\ - - -\(fn FN LINK DESCRIPTION FORMAT)" nil nil) - -(advice-add 'org-man-export :around 'org-man-export--magit-gitman) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-utils" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-wip" "magit-wip.el" (0 0 0 0)) -;;; Generated autoloads from magit-wip.el - -(defvar magit-wip-after-save-mode nil "\ -Non-nil if Magit-Wip-After-Save mode is enabled. -See the `magit-wip-after-save-mode' command -for a description of this minor mode. -Setting this variable directly does not take effect; -either customize it (see the info node `Easy Customization') -or call the function `magit-wip-after-save-mode'.") - -(custom-autoload 'magit-wip-after-save-mode "magit-wip" nil) - -(autoload 'magit-wip-after-save-mode "magit-wip" "\ -Toggle Magit-Wip-After-Save-Local mode in all buffers. -With prefix ARG, enable Magit-Wip-After-Save mode if ARG is positive; -otherwise, disable it. If called from Lisp, enable the mode if -ARG is omitted or nil. - -Magit-Wip-After-Save-Local mode is enabled in all buffers where -`magit-wip-after-save-local-mode-turn-on' would do it. -See `magit-wip-after-save-local-mode' for more information on Magit-Wip-After-Save-Local mode. - -\(fn &optional ARG)" t nil) - -(defvar magit-wip-after-apply-mode nil "\ -Non-nil if Magit-Wip-After-Apply mode is enabled. -See the `magit-wip-after-apply-mode' command -for a description of this minor mode.") - -(custom-autoload 'magit-wip-after-apply-mode "magit-wip" nil) - -(autoload 'magit-wip-after-apply-mode "magit-wip" "\ -Commit to work-in-progress refs. - -After applying a change using any \"apply variant\" -command (apply, stage, unstage, discard, and reverse) commit the -affected files to the current wip refs. For each branch there -may be two wip refs; one contains snapshots of the files as found -in the worktree and the other contains snapshots of the entries -in the index. - -\(fn &optional ARG)" t nil) - -(defvar magit-wip-before-change-mode nil "\ -Non-nil if Magit-Wip-Before-Change mode is enabled. -See the `magit-wip-before-change-mode' command -for a description of this minor mode.") - -(custom-autoload 'magit-wip-before-change-mode "magit-wip" nil) - -(autoload 'magit-wip-before-change-mode "magit-wip" "\ -Commit to work-in-progress refs before certain destructive changes. - -Before invoking a revert command or an \"apply variant\" -command (apply, stage, unstage, discard, and reverse) commit the -affected tracked files to the current wip refs. For each branch -there may be two wip refs; one contains snapshots of the files -as found in the worktree and the other contains snapshots of the -entries in the index. - -Only changes to files which could potentially be affected by the -command which is about to be called are committed. - -\(fn &optional ARG)" t nil) - -(autoload 'magit-wip-commit-initial-backup "magit-wip" "\ -Before saving, commit current file to a worktree wip ref. - -The user has to add this function to `before-save-hook'. - -Commit the current state of the visited file before saving the -current buffer to that file. This backs up the same version of -the file as `backup-buffer' would, but stores the backup in the -worktree wip ref, which is also used by the various Magit Wip -modes, instead of in a backup file as `backup-buffer' would. - -This function ignores the variables that affect `backup-buffer' -and can be used along-side that function, which is recommended -because this function only backs up files that are tracked in -a Git repository. - -\(fn)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-wip" '("magit-"))) - -;;;*** - -;;;### (autoloads nil "magit-worktree" "magit-worktree.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from magit-worktree.el - (autoload 'magit-worktree "magit-worktree" nil t) - -(autoload 'magit-worktree-checkout "magit-worktree" "\ -Checkout BRANCH in a new worktree at PATH. - -\(fn PATH BRANCH)" t nil) - -(autoload 'magit-worktree-branch "magit-worktree" "\ -Create a new BRANCH and check it out in a new worktree at PATH. - -\(fn PATH BRANCH START-POINT &optional FORCE)" t nil) - -(autoload 'magit-worktree-move "magit-worktree" "\ -Move WORKTREE to PATH. - -\(fn WORKTREE PATH)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "magit-worktree" '("magit-"))) - -;;;*** - -;;;### (autoloads nil nil ("magit-core.el" "magit-pkg.el") (0 0 0 -;;;;;; 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; magit-autoloads.el ends here diff --git a/elpa/magit-20200418.939/magit-autorevert.el b/elpa/magit-20200418.939/magit-autorevert.el deleted file mode 100644 index 74c07210..00000000 --- a/elpa/magit-20200418.939/magit-autorevert.el +++ /dev/null @@ -1,269 +0,0 @@ -;;; magit-autorevert.el --- revert buffers when files in repository change -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Code: - -(require 'cl-lib) -(require 'dash) - -(require 'magit-git) - -(require 'autorevert) - -;;; Options - -(defgroup magit-auto-revert nil - "Revert buffers when files in repository change." - :link '(custom-group-link auto-revert) - :link '(info-link "(magit)Automatic Reverting of File-Visiting Buffers") - :group 'auto-revert - :group 'magit-essentials - :group 'magit-modes) - -(defcustom auto-revert-buffer-list-filter nil - "Filter that determines which buffers `auto-revert-buffers' reverts. - -This option is provided by Magit, which also advises -`auto-revert-buffers' to respect it. Magit users who do not turn -on the local mode `auto-revert-mode' themselves, are best served -by setting the value to `magit-auto-revert-repository-buffer-p'. - -However the default is nil, so as not to disturb users who do use -the local mode directly. If you experience delays when running -Magit commands, then you should consider using one of the -predicates provided by Magit - especially if you also use Tramp. - -Users who do turn on `auto-revert-mode' in buffers in which Magit -doesn't do that for them, should likely not use any filter. -Users who turn on `global-auto-revert-mode', do not have to worry -about this option, because it is disregarded if the global mode -is enabled." - :package-version '(magit . "2.4.2") - :group 'auto-revert - :group 'magit-auto-revert - :group 'magit-related - :type '(radio (const :tag "No filter" nil) - (function-item magit-auto-revert-buffer-p) - (function-item magit-auto-revert-repository-buffer-p) - function)) - -(defcustom magit-auto-revert-tracked-only t - "Whether `magit-auto-revert-mode' only reverts tracked files." - :package-version '(magit . "2.4.0") - :group 'magit-auto-revert - :type 'boolean - :set (lambda (var val) - (set var val) - (when (and (bound-and-true-p magit-auto-revert-mode) - (featurep 'magit-autorevert)) - (magit-auto-revert-mode -1) - (magit-auto-revert-mode)))) - -(defcustom magit-auto-revert-immediately t - "Whether Magit reverts buffers immediately. - -If this is non-nil and either `global-auto-revert-mode' or -`magit-auto-revert-mode' is enabled, then Magit immediately -reverts buffers by explicitly calling `auto-revert-buffers' -after running Git for side-effects. - -If `auto-revert-use-notify' is non-nil (and file notifications -are actually supported), then `magit-auto-revert-immediately' -does not have to be non-nil, because the reverts happen -immediately anyway. - -If `magit-auto-revert-immediately' and `auto-revert-use-notify' -are both nil, then reverts happen after `auto-revert-interval' -seconds of user inactivity. That is not desirable." - :package-version '(magit . "2.4.0") - :group 'magit-auto-revert - :type 'boolean) - -;;; Mode - -(defun magit-turn-on-auto-revert-mode-if-desired (&optional file) - (if file - (--when-let (find-buffer-visiting file) - (with-current-buffer it - (magit-turn-on-auto-revert-mode-if-desired))) - (when (and buffer-file-name - (file-readable-p buffer-file-name) - (or (< emacs-major-version 27) - (with-no-warnings - (condition-case nil - (executable-find magit-git-executable t) ; see #3684 - (wrong-number-of-arguments t)))) ; very old 27 built - (magit-toplevel) - (or (not magit-auto-revert-tracked-only) - (magit-file-tracked-p buffer-file-name)) - (not auto-revert-mode) ; see #3014 - (not global-auto-revert-mode)) ; see #3460 - (auto-revert-mode 1)))) - -;;;###autoload -(define-globalized-minor-mode magit-auto-revert-mode auto-revert-mode - magit-turn-on-auto-revert-mode-if-desired - :package-version '(magit . "2.4.0") - :link '(info-link "(magit)Automatic Reverting of File-Visiting Buffers") - :group 'magit-auto-revert - :group 'magit-essentials - ;; - When `global-auto-revert-mode' is enabled, then this mode is - ;; redundant. - ;; - In all other cases enable the mode because if buffers are not - ;; automatically reverted that would make many very common tasks - ;; much more cumbersome. - :init-value (not (or global-auto-revert-mode - noninteractive))) -;; - Unfortunately `:init-value t' only sets the value of the mode -;; variable but does not cause the mode function to be called. -;; - I don't think it works like this on purpose, but since one usually -;; should not enable global modes by default, it is understandable. -;; - If the user has set the variable `magit-auto-revert-mode' to nil -;; after loading magit (instead of doing so before loading magit or -;; by using the function), then we should still respect that setting. -;; - If the user sets one of these variables after loading magit and -;; after `after-init-hook' has run, then that won't have an effect -;; and there is nothing we can do about it. -(defun magit-auto-revert-mode--init-kludge () - "This is an internal kludge to be used on `after-init-hook'. -Do not use this function elsewhere, and don't remove it from -the `after-init-hook'. For more information see the comments -and code surrounding the definition of this function." - (if magit-auto-revert-mode - (let ((start (current-time))) - (magit-message "Turning on magit-auto-revert-mode...") - (magit-auto-revert-mode 1) - (magit-message - "Turning on magit-auto-revert-mode...done%s" - (let ((elapsed (float-time (time-subtract nil start)))) - (if (> elapsed 0.2) - (format " (%.3fs, %s buffers checked)" elapsed - (length (buffer-list))) - "")))) - (magit-auto-revert-mode -1))) -(if after-init-time - ;; Since `after-init-hook' has already been - ;; run, turn the mode on or off right now. - (magit-auto-revert-mode--init-kludge) - ;; By the time the init file has been fully loaded the - ;; values of the relevant variables might have changed. - (add-hook 'after-init-hook #'magit-auto-revert-mode--init-kludge t)) - -(put 'magit-auto-revert-mode 'function-documentation - "Toggle Magit Auto Revert mode. -If called interactively, enable Magit Auto Revert mode if ARG is -positive, and disable it if ARG is zero or negative. If called -from Lisp, also enable the mode if ARG is omitted or nil, and -toggle it if ARG is `toggle'; disable the mode otherwise. - -Magit Auto Revert mode is a global minor mode that reverts -buffers associated with a file that is located inside a Git -repository when the file changes on disk. Use `auto-revert-mode' -to revert a particular buffer. Or use `global-auto-revert-mode' -to revert all file-visiting buffers, not just those that visit -a file located inside a Git repository. - -This global mode works by turning on the buffer-local mode -`auto-revert-mode' at the time a buffer is first created. The -local mode is turned on if the visited file is being tracked in -a Git repository at the time when the buffer is created. - -If `magit-auto-revert-tracked-only' is non-nil (the default), -then only tracked files are reverted. But if you stage a -previously untracked file using `magit-stage', then this mode -notices that. - -Unlike `global-auto-revert-mode', this mode never reverts any -buffers that are not visiting files. - -The behavior of this mode can be customized using the options -in the `autorevert' and `magit-autorevert' groups. - -This function calls the hook `magit-auto-revert-mode-hook'. - -Like nearly every mode, this mode should be enabled or disabled -by calling the respective mode function, the reason being that -changing the state of a mode involves more than merely toggling -a single switch, so setting the mode variable is not enough. -Also, you should not use `after-init-hook' to disable this mode.") - -(defun magit-auto-revert-buffers () - (when (and magit-auto-revert-immediately - (or global-auto-revert-mode - (and magit-auto-revert-mode auto-revert-buffer-list))) - (let ((auto-revert-buffer-list-filter - (or auto-revert-buffer-list-filter - #'magit-auto-revert-repository-buffer-p))) - (auto-revert-buffers)))) - -(defvar magit-auto-revert-toplevel nil) - -(defvar magit-auto-revert-counter 1 - "Incremented each time `auto-revert-buffers' is called.") - -(defun magit-auto-revert-buffer-p (buffer) - "Return non-nil if BUFFER visits a file inside the current repository. -The current repository is the one containing `default-directory'. -If there is no current repository, then return t for any BUFFER." - (magit-auto-revert-repository-buffer-p buffer t)) - -(defun magit-auto-revert-repository-buffer-p (buffer &optional fallback) - "Return non-nil if BUFFER visits a file inside the current repository. -The current repository is the one containing `default-directory'. -If there is no current repository, then return FALLBACK (which -defaults to nil) for any BUFFER." - ;; Call `magit-toplevel' just once per cycle. - (unless (and magit-auto-revert-toplevel - (= (cdr magit-auto-revert-toplevel) - magit-auto-revert-counter)) - (setq magit-auto-revert-toplevel - (cons (or (magit-toplevel) 'no-repo) - magit-auto-revert-counter))) - (let ((top (car magit-auto-revert-toplevel))) - (if (eq top 'no-repo) - fallback - (let ((dir (buffer-local-value 'default-directory buffer))) - (and (equal (file-remote-p dir) - (file-remote-p top)) - ;; ^ `tramp-handle-file-in-directory-p' lacks this optimization. - (file-in-directory-p dir top)))))) - -(defun auto-revert-buffers--buffer-list-filter (fn) - (cl-incf magit-auto-revert-counter) - (if (or global-auto-revert-mode - (not auto-revert-buffer-list) - (not auto-revert-buffer-list-filter)) - (funcall fn) - (let ((auto-revert-buffer-list - (-filter auto-revert-buffer-list-filter - auto-revert-buffer-list))) - (funcall fn)) - (unless auto-revert-timer - (auto-revert-set-timer)))) - -(advice-add 'auto-revert-buffers :around - 'auto-revert-buffers--buffer-list-filter) - -;;; _ -(provide 'magit-autorevert) -;;; magit-autorevert.el ends here diff --git a/elpa/magit-20200418.939/magit-autorevert.elc b/elpa/magit-20200418.939/magit-autorevert.elc deleted file mode 100644 index d7c467fd4f37fc2b15bb6f70bb3be1ec18a1f17c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12573 zcmdT~ZI9c=wO%(VV9O|)uJ;amL zJO1|B%a<$pE*!JSdiJ8G+Ux&C39aa2szJUUHE4=)uh%PiN>1Sr+AD6_dY*6}RLwRf6l%Y_}uQJx)^CNtH3ZKj+o zCle@}x|r%z)V!by=X#M93Fux@A=6XcZL3GKBt26Hb`7BocJQc1x}y$~bds6p?E_)5 zbBv|uu&G#?HDNR=o2VDCDet=k%kaTd!$-TL9vQZ4RP7dYQRuWxqFG@d%%M`n=BCf1 zJc&+Vt~COl*(KO2N)NUS^HPq?^B&Bt#gj1xQ)s*?B@^KDkt1^DqxBMeHvFn4Bko zn^D?Kx6DAgSm?M^N!e9~00Bx)G6OmZ$dt<*3uC=*SQD zDjz~q;)qKDitrStm+R9g7dIucQ)Ug(yitlF8dTtv2`P&xK8sGZXZ@Hm zh@rZw9d!HM0BB$|EXQev8t8%$L zWxda~jSGfA5z_HOO>_ih(segucvc>;6Fd<54koGk?)WucuR87b4Tq7;=P)lE@%8dD zHtgh5*~yB4m>K{+@jn$>dUa zbQ?b4j$!=2GCQSS}V>4&&n1sy;%ZRw{KL8Fbt5`f?qG0Ac(_SfV_L}g251G6d>pgdf|W2P=~h|81wt! zv%Q=jf3S9bq&hTPG4a1)sNcIS_WifLJNV*%k01MeJ`emq@hyaTGTd$V@JrzD88UbP z(lUQQ7{Euwu)XjZrwkp%(c~}Yw_n+J!UqN%aYe?h7GkM_9>1jhj$IsrfXalLHLe=eO!4R{r4(|OCUN3~G zJMTN9D2QX#=02_HWXtq&SEg11?&e5($Srz9W*b`>R8#hZ%w;=gdhn?|)p>LVhi#*5 zCtMR;Ud8W5ZsG`7nQYG75uQ`8hrisrLxrP;?K*eBk=VD`u{I9(8|w!UpM5RoaLknG zwE%?)i&yv#T>4fc?g5B3K$G#$HjEr0-@!={8{#}M;k^WnpoT;Nzj3$_bP+UuskZNe zSj1blGEhRk%E0~OQEEMwkzVqXgjolL<&C)(pqCN-^QgE~&m{k|1&sX;LjPP`j%>sQ zL_2rHfQ-R|Jt=(jWCNb)+oL3f`2fDagB`JY0<?AIQ1Erm0oTotuk9SJhP zvH9oE%`c%04++!Z!z1-3J3WPa+*X8C%0bpKcU#}HK!glnlKiNSUw?II!+@Q7G~p;Z z4auUDbN#pl_oVX+hld;&%U~ltO&UVSZ&cD);y>&18V;q1qiH$kIeIt z)ZqUnW8ih&DPl)WJ~3JqDvaVe2Z(T00l)xQz1~Oo)BiI-Ap8_AN#L#bIYA-#9lsAh z{v3agz8leP_6Qnbm#zx|t}PwO5B7jR|pqx1#W%~ zh9oD8j)LHbUxpvuBg4Nie1=D6f3<1E?k$Wk$Gvs_@iNchU%ffN1GyqA5f$8&#(*vQ zz$>vZVGNZn8pVLvKJ2kR>rJx^^(sc$o~diqJgWJznJdr4{a%tj-> zT_X`;%!L;o+7uF<8dzSScGLbVZ2%f!lOmWF%!DP`T%mw)F6n9WvMl7G&Vu?E!r^(r z5~Nh|Y_9DVb=i_s2r%V?v%Gx?Xr&Y^spkny2<2uLFb||U3XfUluwaR(;JMcJQgl0Q zG2&WK(#$7aBkCcnPrO&dE5d0)Ni93)G;^d^#JKxg#n5Rq6fjAs={HpfFQ;dr(=&(FKAoAUJyqbk1pucK+A&~e+O|W=?pU|!@!XKrtR&w| zp~6KY^v&#ei_L8imf9MPW&q*Q&x)@dd?8-!37$))+zW$RmP`-ZNAjEAWdOlX6TF9q zG*-%s=_`%W7vC*zSyE;5_3mdI-uPpzH4JW9@m{mhtu3wV&bA~?t}H=d?c*jHqwvx} z0V2X(EQtDsmm9c<_i8|WqH5T}#O4AG{%?O%OLk0MvxgnxS@)7v!PJEfm0DL?yo1iR zg4Eq7g7Fe<$T^GuSGu${cHXP-I^nF1SN~MOFa)UN0p;`;HY~NpThUo(+cZd|w6*wP z>l|%LvkHd(bwVNQH2DW^Rq1!=L`iaGBc_prtvR;34fVjS<3cor4O$6Uume{853veagH-|xSnKtB zmVeg5j9-r090+6b{qKl)4?sn_=;1H$p|8Gz*XRZNe2QqEm?nw^Iz+=ECW{AYwmrmn zCQQc-3gsE9QECr>jsi0K zgkN2~jcC;z=uy55J!^Valh)OTzjC(gijN{AaeK$1IAz<21KYOn@in7v$<%FY-qosB zRf)B5zN$<#Ph{)U)G5#}<^2J;B5QM1$zwG}{iO3u3K{4Za;WL!nlu7cwN*JpTB!!x z#j0#g#1&cAYa+5Bdc`I)WK+^Hr9PO4`;V&wk) zOVBdga6qrzUZ{wQB8%D58Y^?Z$h2Z)FkpZMQ~s7n#~JlQbbHu661nl-gGs4uOzyk-1QAKtRPt9D=ic!gj$RUF_?C96-LtqHkGp+^tLL#ymJQ49@z=;-6 zH=SJ^8~4c$-D*dwzI=6jhI4Y^)~ANSz&>o-tZNFe^}F86BS(ynk#BVlsT5yM!Eg8RWTY}ubqUikr38gV+#@C{;z{NbEYAf`?cJ28zaPMrY$6u_`} zDmQhIvQ#&L-TGTwgNsi56D~**N^1hkCeqLb?M@&fXyM- zx~6r|b7)(|MuY#95^5hVIfc8$S9UJ(CRyI_xAfG5|H7Z4>6A7WBI}Ln9XP4BtyhGx z&727>c06~t(YC3raK-i5P)n=T#_i78+qx>xu6mD>W8Zs%Uh>NnNW{Pu=%ypwVH3Pu z^CgzJV32XhHeAJ7H|#t{%!?`#A~;ik^Zi~w>_{`*AHanYT-_A`0@BmBFJ3%-#Dwljt$>)tO3$>{;7^et0CO>voeEwGX;{RfU2ga_ zmoHepH0;_2hWT<`=fVgOc{sZlN9JDPEoj}U5OcE=N3F*-hkf54NOu^i((vC_sxOXT zy?T25?0?Zn=l#i+Jt&+a(zgT`x1{#hEcE(~3QOj?b7-<6UXBV?TO#?pd$*78yaht^ ze -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; Use a binary search to find the commit that introduced a bug. - -;;; Code: - -(require 'magit) - -;;; Options - -(defcustom magit-bisect-show-graph t - "Whether to use `--graph' in the log showing commits yet to be bisected." - :package-version '(magit . "2.8.0") - :group 'magit-status - :type 'boolean) - -(defface magit-bisect-good - '((t :foreground "DarkOliveGreen")) - "Face for good bisect revisions." - :group 'magit-faces) - -(defface magit-bisect-skip - '((t :foreground "DarkGoldenrod")) - "Face for skipped bisect revisions." - :group 'magit-faces) - -(defface magit-bisect-bad - '((t :foreground "IndianRed4")) - "Face for bad bisect revisions." - :group 'magit-faces) - -;;; Commands - -;;;###autoload (autoload 'magit-bisect "magit-bisect" nil t) -(define-transient-command magit-bisect () - "Narrow in on the commit that introduced a bug." - :man-page "git-bisect" - ["Actions" - :if-not magit-bisect-in-progress-p - ("B" "Start" magit-bisect-start) - ("s" "Start script" magit-bisect-run)] - ["Actions" - :if magit-bisect-in-progress-p - ("B" "Bad" magit-bisect-bad) - ("g" "Good" magit-bisect-good) - ("k" "Skip" magit-bisect-skip) - ("r" "Reset" magit-bisect-reset) - ("s" "Run script" magit-bisect-run)]) - -;;;###autoload -(defun magit-bisect-start (bad good) - "Start a bisect session. - -Bisecting a bug means to find the commit that introduced it. -This command starts such a bisect session by asking for a know -good and a bad commit. To move the session forward use the -other actions from the bisect transient command (\ -\\\\[magit-bisect])." - (interactive (if (magit-bisect-in-progress-p) - (user-error "Already bisecting") - (magit-bisect-start-read-args))) - (unless (magit-rev-ancestor-p good bad) - (user-error - "The good revision (%s) has to be an ancestor of the bad one (%s)" - good bad)) - (when (magit-anything-modified-p) - (user-error "Cannot bisect with uncommitted changes")) - (magit-git-bisect "start" (list bad good) t)) - -(defun magit-bisect-start-read-args () - (let ((b (magit-read-branch-or-commit "Start bisect with bad revision"))) - (list b (magit-read-other-branch-or-commit "Good revision" b)))) - -;;;###autoload -(defun magit-bisect-reset () - "After bisecting, cleanup bisection state and return to original `HEAD'." - (interactive) - (magit-confirm 'reset-bisect) - (magit-run-git "bisect" "reset") - (ignore-errors (delete-file (magit-git-dir "BISECT_CMD_OUTPUT")))) - -;;;###autoload -(defun magit-bisect-good () - "While bisecting, mark the current commit as good. -Use this after you have asserted that the commit does not contain -the bug in question." - (interactive) - (magit-git-bisect "good")) - -;;;###autoload -(defun magit-bisect-bad () - "While bisecting, mark the current commit as bad. -Use this after you have asserted that the commit does contain the -bug in question." - (interactive) - (magit-git-bisect "bad")) - -;;;###autoload -(defun magit-bisect-skip () - "While bisecting, skip the current commit. -Use this if for some reason the current commit is not a good one -to test. This command lets Git choose a different one." - (interactive) - (magit-git-bisect "skip")) - -;;;###autoload -(defun magit-bisect-run (cmdline &optional bad good) - "Bisect automatically by running commands after each step. - -Unlike `git bisect run' this can be used before bisecting has -begun. In that case it behaves like `git bisect start; git -bisect run'." - (interactive (let ((args (and (not (magit-bisect-in-progress-p)) - (magit-bisect-start-read-args)))) - (cons (read-shell-command "Bisect shell command: ") args))) - (when (and bad good) - (magit-bisect-start bad good)) - (magit-git-bisect "run" (list shell-file-name shell-command-switch cmdline))) - -(defun magit-git-bisect (subcommand &optional args no-assert) - (unless (or no-assert (magit-bisect-in-progress-p)) - (user-error "Not bisecting")) - (message "Bisecting...") - (magit-with-toplevel - (magit-run-git-async "bisect" subcommand args)) - (set-process-sentinel - magit-this-process - (lambda (process event) - (when (memq (process-status process) '(exit signal)) - (if (> (process-exit-status process) 0) - (magit-process-sentinel process event) - (process-put process 'inhibit-refresh t) - (magit-process-sentinel process event) - (when (buffer-live-p (process-buffer process)) - (with-current-buffer (process-buffer process) - (when-let ((section (get-text-property (point) 'magit-section)) - (output (buffer-substring-no-properties - (oref section content) - (oref section end)))) - (with-temp-file (magit-git-dir "BISECT_CMD_OUTPUT") - (insert output))))) - (magit-refresh)) - (message "Bisecting...done"))))) - -;;; Sections - -(defun magit-bisect-in-progress-p () - (file-exists-p (magit-git-dir "BISECT_LOG"))) - -(defun magit-insert-bisect-output () - "While bisecting, insert section with output from `git bisect'." - (when (magit-bisect-in-progress-p) - (let* ((lines - (or (magit-file-lines (magit-git-dir "BISECT_CMD_OUTPUT")) - (list "Bisecting: (no saved bisect output)" - "It appears you have invoked `git bisect' from a shell." - "There is nothing wrong with that, we just cannot display" - "anything useful here. Consult the shell output instead."))) - (done-re "^\\([a-z0-9]\\{40\\}\\) is the first bad commit$") - (bad-line (or (and (string-match done-re (car lines)) - (pop lines)) - (--first (string-match done-re it) lines)))) - (magit-insert-section ((eval (if bad-line 'commit 'bisect-output)) - (and bad-line (match-string 1 bad-line))) - (magit-insert-heading - (propertize (or bad-line (pop lines)) - 'font-lock-face 'magit-section-heading)) - (dolist (line lines) - (insert line "\n")))) - (insert "\n"))) - -(defun magit-insert-bisect-rest () - "While bisecting, insert section visualizing the bisect state." - (when (magit-bisect-in-progress-p) - (magit-insert-section (bisect-view) - (magit-insert-heading "Bisect Rest:") - (magit-git-wash (apply-partially 'magit-log-wash-log 'bisect-vis) - "bisect" "visualize" "git" "log" - "--format=%h%x00%D%x00%s" "--decorate=full" - (and magit-bisect-show-graph "--graph"))))) - -(defun magit-insert-bisect-log () - "While bisecting, insert section logging bisect progress." - (when (magit-bisect-in-progress-p) - (magit-insert-section (bisect-log) - (magit-insert-heading "Bisect Log:") - (magit-git-wash #'magit-wash-bisect-log "bisect" "log") - (insert ?\n)))) - -(defun magit-wash-bisect-log (_args) - (let (beg) - (while (progn (setq beg (point-marker)) - (re-search-forward "^\\(git bisect [^\n]+\n\\)" nil t)) - (magit-bind-match-strings (heading) nil - (magit-delete-match) - (save-restriction - (narrow-to-region beg (point)) - (goto-char (point-min)) - (magit-insert-section (bisect-item heading t) - (insert (propertize heading 'font-lock-face - 'magit-section-secondary-heading)) - (magit-insert-heading) - (magit-wash-sequence - (apply-partially 'magit-log-wash-rev 'bisect-log - (magit-abbrev-length))) - (insert ?\n))))) - (when (re-search-forward - "# first bad commit: \\[\\([a-z0-9]\\{40\\}\\)\\] [^\n]+\n" nil t) - (magit-bind-match-strings (hash) nil - (magit-delete-match) - (magit-insert-section (bisect-item) - (insert hash " is the first bad commit\n")))))) - -;;; _ -(provide 'magit-bisect) -;;; magit-bisect.el ends here diff --git a/elpa/magit-20200418.939/magit-bisect.elc b/elpa/magit-20200418.939/magit-bisect.elc deleted file mode 100644 index cd55c53ae067e47b43c86ddcb99b7235925f6646..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15636 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 -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; Annotates each line in file-visiting buffer with information from -;; the revision which last modified the line. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) - -;;; Options - -(defgroup magit-blame nil - "Blame support for Magit." - :link '(info-link "(magit)Blaming") - :group 'magit-modes) - -(defcustom magit-blame-styles - '((headings - (heading-format . "%-20a %C %s\n")) - (margin - (margin-format . (" %s%f" " %C %a" " %H")) - (margin-width . 42) - (margin-face . magit-blame-margin) - (margin-body-face . (magit-blame-dimmed))) - (highlight - (highlight-face . magit-blame-highlight)) - (lines - (show-lines . t) - (show-message . t))) - "List of styles used to visualize blame information. - -Each entry has the form (IDENT (KEY . VALUE)...). IDENT has -to be a symbol uniquely identifing the style. The following -KEYs are recognized: - - `show-lines' - Whether to prefix each chunk of lines with a thin line. - This has no effect if `heading-format' is non-nil. - `show-message' - Whether to display a commit's summary line in the echo area - when crossing chunks. - `highlight-face' - Face used to highlight the first line of each chunk. - If this is nil, then those lines are not highlighted. - `heading-format' - String specifying the information to be shown above each - chunk of lines. It must end with a newline character. - `margin-format' - String specifying the information to be shown in the left - buffer margin. It must NOT end with a newline character. - This can also be a list of formats used for the lines at - the same positions within the chunk. If the chunk has - more lines than formats are specified, then the last is - repeated. - `margin-width' - Width of the margin, provided `margin-format' is non-nil. - `margin-face' - Face used in the margin, provided `margin-format' is - non-nil. This face is used in combination with the faces - that are specific to the used %-specs. If this is nil, - then `magit-blame-margin' is used. - `margin-body-face' - Face used in the margin for all but first line of a chunk. - This face is used in combination with the faces that are - specific to the used %-specs. This can also be a list of - faces (usually one face), in which case only these faces - are used and the %-spec faces are ignored. A good value - might be `(magit-blame-dimmed)'. If this is nil, then - the same face as for the first line is used. - -The following %-specs can be used in `heading-format' and -`margin-format': - - %H hash using face `magit-blame-hash' - %s summary using face `magit-blame-summary' - %a author using face `magit-blame-name' - %A author time using face `magit-blame-date' - %c committer using face `magit-blame-name' - %C committer time using face `magit-blame-date' - -Additionally if `margin-format' ends with %f, then the string -that is displayed in the margin is made at least `margin-width' -characters wide, which may be desirable if the used face sets -the background color. - -The style used in the current buffer can be cycled from the blame -popup. Blame commands (except `magit-blame-echo') use the first -style as the initial style when beginning to blame in a buffer." - :package-version '(magit . "2.13.0") - :group 'magit-blame - :type 'string) - -(defcustom magit-blame-echo-style 'lines - "The blame visualization style used by `magit-blame-echo'. -A symbol that has to be used as the identifier for one of the -styles defined in `magit-blame-styles'." - :package-version '(magit . "2.13.0") - :group 'magit-blame - :type 'symbol) - -(defcustom magit-blame-time-format "%F %H:%M" - "Format for time strings in blame headings." - :group 'magit-blame - :type 'string) - -(defcustom magit-blame-read-only t - "Whether to initially make the blamed buffer read-only." - :package-version '(magit . "2.13.0") - :group 'magit-blame - :type 'boolean) - -(defcustom magit-blame-disable-modes '(fci-mode yascroll-bar-mode) - "List of modes not compatible with Magit-Blame mode. -This modes are turned off when Magit-Blame mode is turned on, -and then turned on again when turning off the latter." - :group 'magit-blame - :type '(repeat (symbol :tag "Mode"))) - -(defcustom magit-blame-mode-lighter " Blame" - "The mode-line lighter of the Magit-Blame mode." - :group 'magit-blame - :type '(choice (const :tag "No lighter" "") string)) - -(defcustom magit-blame-goto-chunk-hook - '(magit-blame-maybe-update-revision-buffer - magit-blame-maybe-show-message) - "Hook run after point entered another chunk." - :package-version '(magit . "2.13.0") - :group 'magit-blame - :type 'hook - :get 'magit-hook-custom-get - :options '(magit-blame-maybe-update-revision-buffer - magit-blame-maybe-show-message)) - -;;; Faces - -(defface magit-blame-highlight - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey80" - :foreground "black") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey25" - :foreground "white")) - "Face used for highlighting when blaming. -Also see option `magit-blame-styles'." - :group 'magit-faces) - -(defface magit-blame-margin - '((t :inherit magit-blame-highlight - :weight normal - :slant normal)) - "Face used for the blame margin by default when blaming. -Also see option `magit-blame-styles'." - :group 'magit-faces) - -(defface magit-blame-dimmed - '((t :inherit magit-dimmed - :weight normal - :slant normal)) - "Face used for the blame margin in some cases when blaming. -Also see option `magit-blame-styles'." - :group 'magit-faces) - -(defface magit-blame-heading - `((t ,@(and (>= emacs-major-version 27) '(:extend t)) - :inherit magit-blame-highlight - :weight normal - :slant normal)) - "Face used for blame headings by default when blaming. -Also see option `magit-blame-styles'." - :group 'magit-faces) - -(defface magit-blame-summary nil - "Face used for commit summaries when blaming." - :group 'magit-faces) - -(defface magit-blame-hash nil - "Face used for commit hashes when blaming." - :group 'magit-faces) - -(defface magit-blame-name nil - "Face used for author and committer names when blaming." - :group 'magit-faces) - -(defface magit-blame-date nil - "Face used for dates when blaming." - :group 'magit-faces) - -;;; Chunks - -(defclass magit-blame-chunk () - (;; - (orig-rev :initarg :orig-rev) - (orig-line :initarg :orig-line) - (final-line :initarg :final-line) - (num-lines :initarg :num-lines) - ;; previous - (prev-rev :initform nil) - (prev-file :initform nil) - ;; filename - (orig-file))) - -(defun magit-current-blame-chunk (&optional type) - (or (and (not (and type (not (eq type magit-blame-type)))) - (magit-blame-chunk-at (point))) - (and type - (let ((rev (or magit-buffer-refname magit-buffer-revision)) - (file (magit-file-relative-name nil (not magit-buffer-file-name))) - (line (format "%i,+1" (line-number-at-pos)))) - (unless file - (error "Buffer does not visit a tracked file")) - (with-temp-buffer - (magit-with-toplevel - (magit-git-insert - "blame" "--porcelain" - (if (memq magit-blame-type '(final removal)) - (cons "--reverse" (magit-blame-arguments)) - (magit-blame-arguments)) - "-L" line rev "--" file) - (goto-char (point-min)) - (car (magit-blame--parse-chunk type)))))))) - -(defun magit-blame-chunk-at (pos) - (--some (overlay-get it 'magit-blame-chunk) - (overlays-at pos))) - -(defun magit-blame--overlay-at (&optional pos key) - (unless pos - (setq pos (point))) - (--first (overlay-get it (or key 'magit-blame-chunk)) - (nconc (overlays-at pos) - (overlays-in pos pos)))) - -;;; Keymaps - -(defvar magit-blame-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-c C-q") 'magit-blame-quit) - map) - "Keymap for `magit-blame-mode'. -Note that most blaming key bindings are defined -in `magit-blame-read-only-mode-map' instead.") - -(defvar magit-blame-read-only-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-m") 'magit-show-commit) - (define-key map (kbd "p") 'magit-blame-previous-chunk) - (define-key map (kbd "P") 'magit-blame-previous-chunk-same-commit) - (define-key map (kbd "n") 'magit-blame-next-chunk) - (define-key map (kbd "N") 'magit-blame-next-chunk-same-commit) - (define-key map (kbd "b") 'magit-blame-addition) - (define-key map (kbd "r") 'magit-blame-removal) - (define-key map (kbd "f") 'magit-blame-reverse) - (define-key map (kbd "B") 'magit-blame) - (define-key map (kbd "c") 'magit-blame-cycle-style) - (define-key map (kbd "q") 'magit-blame-quit) - (define-key map (kbd "M-w") 'magit-blame-copy-hash) - (define-key map (kbd "SPC") 'magit-diff-show-or-scroll-up) - (define-key map (kbd "DEL") 'magit-diff-show-or-scroll-down) - map) - "Keymap for `magit-blame-read-only-mode'.") - -;;; Modes -;;;; Variables - -(defvar-local magit-blame-buffer-read-only nil) -(defvar-local magit-blame-cache nil) -(defvar-local magit-blame-disabled-modes nil) -(defvar-local magit-blame-process nil) -(defvar-local magit-blame-recursive-p nil) -(defvar-local magit-blame-type nil) -(defvar-local magit-blame-separator nil) -(defvar-local magit-blame-previous-chunk nil) - -(defvar-local magit-blame--style nil) - -(defsubst magit-blame--style-get (key) - (cdr (assoc key (cdr magit-blame--style)))) - -;;;; Base Mode - -(define-minor-mode magit-blame-mode - "Display blame information inline." - :lighter magit-blame-mode-lighter - (cond (magit-blame-mode - (when (called-interactively-p 'any) - (setq magit-blame-mode nil) - (user-error - (concat "Don't call `magit-blame-mode' directly; " - "instead use `magit-blame'"))) - (add-hook 'after-save-hook 'magit-blame--refresh t t) - (add-hook 'post-command-hook 'magit-blame-goto-chunk-hook t t) - (add-hook 'before-revert-hook 'magit-blame--remove-overlays t t) - (add-hook 'after-revert-hook 'magit-blame--refresh t t) - (add-hook 'read-only-mode-hook 'magit-blame-toggle-read-only t t) - (setq magit-blame-buffer-read-only buffer-read-only) - (when (or magit-blame-read-only magit-buffer-file-name) - (read-only-mode 1)) - (dolist (mode magit-blame-disable-modes) - (when (and (boundp mode) (symbol-value mode)) - (funcall mode -1) - (push mode magit-blame-disabled-modes))) - (setq magit-blame-separator (magit-blame--format-separator)) - (unless magit-blame--style - (setq magit-blame--style (car magit-blame-styles))) - (magit-blame--update-margin)) - (t - (when (process-live-p magit-blame-process) - (kill-process magit-blame-process) - (while magit-blame-process - (sit-for 0.01))) ; avoid racing the sentinel - (remove-hook 'after-save-hook 'magit-blame--refresh t) - (remove-hook 'post-command-hook 'magit-blame-goto-chunk-hook t) - (remove-hook 'before-revert-hook 'magit-blame--remove-overlays t) - (remove-hook 'after-revert-hook 'magit-blame--refresh t) - (remove-hook 'read-only-mode-hook 'magit-blame-toggle-read-only t) - (unless magit-blame-buffer-read-only - (read-only-mode -1)) - (magit-blame-read-only-mode -1) - (dolist (mode magit-blame-disabled-modes) - (funcall mode 1)) - (kill-local-variable 'magit-blame-disabled-modes) - (kill-local-variable 'magit-blame-type) - (kill-local-variable 'magit-blame--style) - (magit-blame--update-margin) - (magit-blame--remove-overlays)))) - -(defun magit-blame--refresh () - (magit-blame--run (magit-blame-arguments))) - -(defun magit-blame-goto-chunk-hook () - (let ((chunk (magit-blame-chunk-at (point)))) - (when (cl-typep chunk 'magit-blame-chunk) - (unless (eq chunk magit-blame-previous-chunk) - (run-hooks 'magit-blame-goto-chunk-hook)) - (setq magit-blame-previous-chunk chunk)))) - -(defun magit-blame-toggle-read-only () - (magit-blame-read-only-mode (if buffer-read-only 1 -1))) - -;;;; Read-Only Mode - -(define-minor-mode magit-blame-read-only-mode - "Provide keybindings for Magit-Blame mode. - -This minor-mode provides the key bindings for Magit-Blame mode, -but only when Read-Only mode is also enabled because these key -bindings would otherwise conflict badly with regular bindings. - -When both Magit-Blame mode and Read-Only mode are enabled, then -this mode gets automatically enabled too and when one of these -modes is toggled, then this mode also gets toggled automatically. - -\\{magit-blame-read-only-mode-map}") - -;;;; Kludges - -(defun magit-blame-put-keymap-before-view-mode () - "Put `magit-blame-read-only-mode' ahead of `view-mode' in `minor-mode-map-alist'." - (--when-let (assq 'magit-blame-read-only-mode - (cl-member 'view-mode minor-mode-map-alist :key #'car)) - (setq minor-mode-map-alist - (cons it (delq it minor-mode-map-alist)))) - (remove-hook 'view-mode-hook #'magit-blame-put-keymap-before-view-mode)) - -(add-hook 'view-mode-hook #'magit-blame-put-keymap-before-view-mode) - -;;; Process - -(defun magit-blame--run (args) - (magit-with-toplevel - (unless magit-blame-mode - (magit-blame-mode 1)) - (message "Blaming...") - (magit-blame-run-process - (or magit-buffer-refname magit-buffer-revision) - (magit-file-relative-name nil (not magit-buffer-file-name)) - (if (memq magit-blame-type '(final removal)) - (cons "--reverse" args) - args) - (list (line-number-at-pos (window-start)) - (line-number-at-pos (1- (window-end nil t))))) - (set-process-sentinel magit-this-process - 'magit-blame-process-quickstart-sentinel))) - -(defun magit-blame-run-process (revision file args &optional lines) - (let ((process (magit-parse-git-async - "blame" "--incremental" args - (and lines (list "-L" (apply #'format "%s,%s" lines))) - revision "--" file))) - (set-process-filter process 'magit-blame-process-filter) - (set-process-sentinel process 'magit-blame-process-sentinel) - (process-put process 'arguments (list revision file args)) - (setq magit-blame-cache (make-hash-table :test 'equal)) - (setq magit-blame-process process))) - -(defun magit-blame-process-quickstart-sentinel (process event) - (when (memq (process-status process) '(exit signal)) - (magit-blame-process-sentinel process event t) - (magit-blame-assert-buffer process) - (with-current-buffer (process-get process 'command-buf) - (when magit-blame-mode - (let ((default-directory (magit-toplevel))) - (apply #'magit-blame-run-process - (process-get process 'arguments))))))) - -(defun magit-blame-process-sentinel (process _event &optional quiet) - (let ((status (process-status process))) - (when (memq status '(exit signal)) - (kill-buffer (process-buffer process)) - (if (and (eq status 'exit) - (zerop (process-exit-status process))) - (unless quiet - (message "Blaming...done")) - (magit-blame-assert-buffer process) - (with-current-buffer (process-get process 'command-buf) - (if magit-blame-mode - (progn (magit-blame-mode -1) - (message "Blaming...failed")) - (message "Blaming...aborted")))) - (kill-local-variable 'magit-blame-process)))) - -(defun magit-blame-process-filter (process string) - (internal-default-process-filter process string) - (let ((buf (process-get process 'command-buf)) - (pos (process-get process 'parsed)) - (mark (process-mark process)) - type cache) - (with-current-buffer buf - (setq type magit-blame-type) - (setq cache magit-blame-cache)) - (with-current-buffer (process-buffer process) - (goto-char pos) - (while (and (< (point) mark) - (save-excursion (re-search-forward "^filename .+\n" nil t))) - (pcase-let* ((`(,chunk ,revinfo) - (magit-blame--parse-chunk type)) - (rev (oref chunk orig-rev))) - (if revinfo - (puthash rev revinfo cache) - (setq revinfo - (or (gethash rev cache) - (puthash rev (magit-blame--commit-alist rev) cache)))) - (magit-blame--make-overlays buf chunk revinfo)) - (process-put process 'parsed (point)))))) - -(defun magit-blame--parse-chunk (type) - (let (chunk revinfo) - (looking-at "^\\(.\\{40\\}\\) \\([0-9]+\\) \\([0-9]+\\) \\([0-9]+\\)") - (with-slots (orig-rev orig-file prev-rev prev-file) - (setq chunk (magit-blame-chunk - :orig-rev (match-string 1) - :orig-line (string-to-number (match-string 2)) - :final-line (string-to-number (match-string 3)) - :num-lines (string-to-number (match-string 4)))) - (forward-line) - (let (done) - (while (not done) - (cond ((looking-at "^filename \\(.+\\)") - (setq done t) - (setf orig-file (match-string 1))) - ((looking-at "^previous \\(.\\{40\\}\\) \\(.+\\)") - (setf prev-rev (match-string 1)) - (setf prev-file (match-string 2))) - ((looking-at "^\\([^ ]+\\) \\(.+\\)") - (push (cons (match-string 1) - (match-string 2)) revinfo))) - (forward-line))) - (when (and (eq type 'removal) prev-rev) - (cl-rotatef orig-rev prev-rev) - (cl-rotatef orig-file prev-file) - (setq revinfo nil))) - (list chunk revinfo))) - -(defun magit-blame--commit-alist (rev) - (cl-mapcar 'cons - '("summary" - "author" "author-time" "author-tz" - "committer" "committer-time" "committer-tz") - (split-string (magit-rev-format "%s\v%an\v%ad\v%cn\v%cd" rev - "--date=format:%s\v%z") - "\v"))) - -(defun magit-blame-assert-buffer (process) - (unless (buffer-live-p (process-get process 'command-buf)) - (kill-process process) - (user-error "Buffer being blamed has been killed"))) - -;;; Display - -(defun magit-blame--make-overlays (buf chunk revinfo) - (with-current-buffer buf - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (forward-line (1- (oref chunk final-line))) - (let ((beg (point)) - (end (save-excursion - (forward-line (oref chunk num-lines)) - (point)))) - (magit-blame--remove-overlays beg end) - (magit-blame--make-margin-overlays chunk revinfo beg end) - (magit-blame--make-heading-overlay chunk revinfo beg end) - (magit-blame--make-highlight-overlay chunk beg)))))) - -(defun magit-blame--make-margin-overlays (chunk revinfo _beg end) - (save-excursion - (let ((line 0)) - (while (< (point) end) - (magit-blame--make-margin-overlay chunk revinfo line) - (forward-line) - (cl-incf line))))) - -(defun magit-blame--make-margin-overlay (chunk revinfo line) - (let* ((end (line-end-position)) - ;; If possible avoid putting this on the first character - ;; of the line to avoid a conflict with the line overlay. - (beg (min (1+ (line-beginning-position)) end)) - (ov (make-overlay beg end))) - (overlay-put ov 'magit-blame-chunk chunk) - (overlay-put ov 'magit-blame-revinfo revinfo) - (overlay-put ov 'magit-blame-margin line) - (magit-blame--update-margin-overlay ov))) - -(defun magit-blame--make-heading-overlay (chunk revinfo beg end) - (let ((ov (make-overlay beg end))) - (overlay-put ov 'magit-blame-chunk chunk) - (overlay-put ov 'magit-blame-revinfo revinfo) - (overlay-put ov 'magit-blame-heading t) - (magit-blame--update-heading-overlay ov))) - -(defun magit-blame--make-highlight-overlay (chunk beg) - (let ((ov (make-overlay beg (1+ (line-end-position))))) - (overlay-put ov 'magit-blame-chunk chunk) - (overlay-put ov 'magit-blame-highlight t) - (magit-blame--update-highlight-overlay ov))) - -(defun magit-blame--update-margin () - (setq left-margin-width (or (magit-blame--style-get 'margin-width) 0)) - (set-window-buffer (selected-window) (current-buffer))) - -(defun magit-blame--update-overlays () - (save-restriction - (widen) - (dolist (ov (overlays-in (point-min) (point-max))) - (cond ((overlay-get ov 'magit-blame-heading) - (magit-blame--update-heading-overlay ov)) - ((overlay-get ov 'magit-blame-margin) - (magit-blame--update-margin-overlay ov)) - ((overlay-get ov 'magit-blame-highlight) - (magit-blame--update-highlight-overlay ov)))))) - -(defun magit-blame--update-margin-overlay (ov) - (overlay-put - ov 'before-string - (and (magit-blame--style-get 'margin-width) - (propertize - "o" 'display - (list (list 'margin 'left-margin) - (let ((line (overlay-get ov 'magit-blame-margin)) - (format (magit-blame--style-get 'margin-format)) - (face (magit-blame--style-get 'margin-face))) - (magit-blame--format-string - ov - (or (and (atom format) - format) - (nth line format) - (car (last format))) - (or (and (not (zerop line)) - (magit-blame--style-get 'margin-body-face)) - face - 'magit-blame-margin)))))))) - -(defun magit-blame--update-heading-overlay (ov) - (overlay-put - ov 'before-string - (--if-let (magit-blame--style-get 'heading-format) - (magit-blame--format-string ov it 'magit-blame-heading) - (and (magit-blame--style-get 'show-lines) - (or (not (magit-blame--style-get 'margin-format)) - (save-excursion - (goto-char (overlay-start ov)) - ;; Special case of the special case described in - ;; `magit-blame--make-margin-overlay'. For empty - ;; lines it is not possible to show both overlays - ;; without the line being to high. - (not (= (point) (line-end-position))))) - magit-blame-separator)))) - -(defun magit-blame--update-highlight-overlay (ov) - (overlay-put ov 'font-lock-face (magit-blame--style-get 'highlight-face))) - -(defun magit-blame--format-string (ov format face) - (let* ((chunk (overlay-get ov 'magit-blame-chunk)) - (revinfo (overlay-get ov 'magit-blame-revinfo)) - (key (list format face)) - (string (cdr (assoc key revinfo)))) - (unless string - (setq string - (and format - (magit-blame--format-string-1 (oref chunk orig-rev) - revinfo format face))) - (nconc revinfo (list (cons key string)))) - string)) - -(defun magit-blame--format-string-1 (rev revinfo format face) - (let ((str - (if (equal rev "0000000000000000000000000000000000000000") - (propertize (concat (if (string-prefix-p "\s" format) "\s" "") - "Not Yet Committed" - (if (string-suffix-p "\n" format) "\n" "")) - 'font-lock-face face) - (magit--format-spec - (propertize format 'font-lock-face face) - (cl-flet* ((p0 (s f) - (propertize s 'font-lock-face - (if face - (if (listp face) - face - (list f face)) - f))) - (p1 (k f) - (p0 (cdr (assoc k revinfo)) f)) - (p2 (k1 k2 f) - (p0 (magit-blame--format-time-string - (cdr (assoc k1 revinfo)) - (cdr (assoc k2 revinfo))) - f))) - `((?H . ,(p0 rev 'magit-blame-hash)) - (?s . ,(p1 "summary" 'magit-blame-summary)) - (?a . ,(p1 "author" 'magit-blame-name)) - (?c . ,(p1 "committer" 'magit-blame-name)) - (?A . ,(p2 "author-time" "author-tz" 'magit-blame-date)) - (?C . ,(p2 "committer-time" "committer-tz" 'magit-blame-date)) - (?f . ""))))))) - (if-let ((width (and (string-suffix-p "%f" format) - (magit-blame--style-get 'margin-width)))) - (concat str - (propertize (make-string (max 0 (- width (length str))) ?\s) - 'font-lock-face face)) - str))) - -(defun magit-blame--format-separator () - (propertize - (concat (propertize "\s" 'display '(space :height (2))) - (propertize "\n" 'line-height t)) - 'font-lock-face (list :background - (face-attribute 'magit-blame-heading - :background nil t)))) - -(defun magit-blame--format-time-string (time tz) - (let* ((time-format (or (magit-blame--style-get 'time-format) - magit-blame-time-format)) - (tz-in-second (and (string-match "%z" time-format) - (car (last (parse-time-string tz)))))) - (format-time-string time-format - (seconds-to-time (string-to-number time)) - tz-in-second))) - -(defun magit-blame--remove-overlays (&optional beg end) - (save-restriction - (widen) - (dolist (ov (overlays-in (or beg (point-min)) - (or end (point-max)))) - (when (overlay-get ov 'magit-blame-chunk) - (delete-overlay ov))))) - -(defun magit-blame-maybe-show-message () - (when (magit-blame--style-get 'show-message) - (let ((message-log-max 0)) - (if-let ((msg (cdr (assoc "summary" - (gethash (oref (magit-current-blame-chunk) - orig-rev) - magit-blame-cache))))) - (progn (set-text-properties 0 (length msg) nil msg) - (message msg)) - (message "Commit data not available yet. Still blaming."))))) - -;;; Commands - -;;;###autoload (autoload 'magit-blame-echo "magit-blame" nil t) -(define-suffix-command magit-blame-echo (args) - "For each line show the revision in which it was added. -Show the information about the chunk at point in the echo area -when moving between chunks. Unlike other blaming commands, do -not turn on `read-only-mode'." - :if (lambda () - (and buffer-file-name - (or (not magit-blame-mode) - buffer-read-only))) - (interactive (list (magit-blame-arguments))) - (when magit-buffer-file-name - (user-error "Blob buffers aren't supported")) - (setq-local magit-blame--style - (assq magit-blame-echo-style magit-blame-styles)) - (setq-local magit-blame-disable-modes - (cons 'eldoc-mode magit-blame-disable-modes)) - (if (not magit-blame-mode) - (let ((magit-blame-read-only nil)) - (magit-blame--pre-blame-assert 'addition) - (magit-blame--pre-blame-setup 'addition) - (magit-blame--run args)) - (read-only-mode -1) - (magit-blame--update-overlays))) - -;;;###autoload (autoload 'magit-blame-addition "magit-blame" nil t) -(define-suffix-command magit-blame-addition (args) - "For each line show the revision in which it was added." - (interactive (list (magit-blame-arguments))) - (magit-blame--pre-blame-assert 'addition) - (magit-blame--pre-blame-setup 'addition) - (magit-blame--run args)) - -;;;###autoload (autoload 'magit-blame-removal "magit-blame" nil t) -(define-suffix-command magit-blame-removal (args) - "For each line show the revision in which it was removed." - :if-nil 'buffer-file-name - (interactive (list (magit-blame-arguments))) - (unless magit-buffer-file-name - (user-error "Only blob buffers can be blamed in reverse")) - (magit-blame--pre-blame-assert 'removal) - (magit-blame--pre-blame-setup 'removal) - (magit-blame--run args)) - -;;;###autoload (autoload 'magit-blame-reverse "magit-blame" nil t) -(define-suffix-command magit-blame-reverse (args) - "For each line show the last revision in which it still exists." - :if-nil 'buffer-file-name - (interactive (list (magit-blame-arguments))) - (unless magit-buffer-file-name - (user-error "Only blob buffers can be blamed in reverse")) - (magit-blame--pre-blame-assert 'final) - (magit-blame--pre-blame-setup 'final) - (magit-blame--run args)) - -(defun magit-blame--pre-blame-assert (type) - (unless (magit-toplevel) - (magit--not-inside-repository-error)) - (if (and magit-blame-mode - (eq type magit-blame-type)) - (if-let ((chunk (magit-current-blame-chunk))) - (unless (oref chunk prev-rev) - (user-error "Chunk has no further history")) - (user-error "Commit data not available yet. Still blaming.")) - (unless (magit-file-relative-name nil (not magit-buffer-file-name)) - (if buffer-file-name - (user-error "Buffer isn't visiting a tracked file") - (user-error "Buffer isn't visiting a file"))))) - -(defun magit-blame--pre-blame-setup (type) - (when magit-blame-mode - (if (eq type magit-blame-type) - (let ((style magit-blame--style)) - (magit-blame-visit-other-file) - (setq-local magit-blame--style style) - (setq-local magit-blame-recursive-p t) - ;; Set window-start for the benefit of quickstart. - (redisplay)) - (magit-blame--remove-overlays))) - (setq magit-blame-type type)) - -(defun magit-blame-visit-other-file () - "Visit another blob related to the current chunk." - (interactive) - (with-slots (prev-rev prev-file orig-line) - (magit-current-blame-chunk) - (unless prev-rev - (user-error "Chunk has no further history")) - (magit-with-toplevel - (magit-find-file prev-rev prev-file)) - ;; TODO Adjust line like magit-diff-visit-file. - (goto-char (point-min)) - (forward-line (1- orig-line)))) - -(defun magit-blame-visit-file () - "Visit the blob related to the current chunk." - (interactive) - (with-slots (orig-rev orig-file orig-line) - (magit-current-blame-chunk) - (magit-with-toplevel - (magit-find-file orig-rev orig-file)) - (goto-char (point-min)) - (forward-line (1- orig-line)))) - -(define-suffix-command magit-blame-quit () - "Turn off Magit-Blame mode. -If the buffer was created during a recursive blame, -then also kill the buffer." - :if-non-nil 'magit-blame-mode - (interactive) - (magit-blame-mode -1) - (when magit-blame-recursive-p - (kill-buffer))) - -(defun magit-blame-next-chunk () - "Move to the next chunk." - (interactive) - (--if-let (next-single-char-property-change (point) 'magit-blame-chunk) - (goto-char it) - (user-error "No more chunks"))) - -(defun magit-blame-previous-chunk () - "Move to the previous chunk." - (interactive) - (--if-let (previous-single-char-property-change (point) 'magit-blame-chunk) - (goto-char it) - (user-error "No more chunks"))) - -(defun magit-blame-next-chunk-same-commit (&optional previous) - "Move to the next chunk from the same commit.\n\n(fn)" - (interactive) - (if-let ((rev (oref (magit-current-blame-chunk) orig-rev))) - (let ((pos (point)) ov) - (save-excursion - (while (and (not ov) - (not (= pos (if previous (point-min) (point-max)))) - (setq pos (funcall - (if previous - 'previous-single-char-property-change - 'next-single-char-property-change) - pos 'magit-blame-chunk))) - (--when-let (magit-blame--overlay-at pos) - (when (equal (oref (magit-blame-chunk-at pos) orig-rev) rev) - (setq ov it))))) - (if ov - (goto-char (overlay-start ov)) - (user-error "No more chunks from same commit"))) - (user-error "This chunk hasn't been blamed yet"))) - -(defun magit-blame-previous-chunk-same-commit () - "Move to the previous chunk from the same commit." - (interactive) - (magit-blame-next-chunk-same-commit 'previous-single-char-property-change)) - -(defun magit-blame-cycle-style () - "Change how blame information is visualized. -Cycle through the elements of option `magit-blame-styles'." - (interactive) - (setq magit-blame--style - (or (cadr (cl-member (car magit-blame--style) - magit-blame-styles :key #'car)) - (car magit-blame-styles))) - (magit-blame--update-margin) - (magit-blame--update-overlays)) - -(defun magit-blame-copy-hash () - "Save hash of the current chunk's commit to the kill ring. - -When the region is active, then save the region's content -instead of the hash, like `kill-ring-save' would." - (interactive) - (if (use-region-p) - (call-interactively #'copy-region-as-kill) - (kill-new (message "%s" (oref (magit-current-blame-chunk) orig-rev))))) - -;;; Popup - -;;;###autoload (autoload 'magit-blame "magit-blame" nil t) -(define-transient-command magit-blame () - "Show the commits that added or removed lines in the visited file." - :man-page "git-blame" - :value '("-w") - ["Arguments" - ("-w" "Ignore whitespace" "-w") - ("-r" "Do not treat root commits as boundaries" "--root") - (magit-blame:-M) - (magit-blame:-C)] - ["Actions" - ("b" "Show commits adding lines" magit-blame-addition) - ("r" "Show commits removing lines" magit-blame-removal) - ("f" "Show last commits that still have lines" magit-blame-reverse) - ("m" "Blame echo" magit-blame-echo) - ("q" "Quit blaming" magit-blame-quit)] - ["Refresh" - :if-non-nil magit-blame-mode - ("c" "Cycle style" magit-blame-cycle-style)]) - -(defun magit-blame-arguments () - (transient-args 'magit-blame)) - -(define-infix-argument magit-blame:-M () - :description "Detect lines moved or copied within a file" - :class 'transient-option - :argument "-M" - :reader 'transient-read-number-N+) - -(define-infix-argument magit-blame:-C () - :description "Detect lines moved or copied between files" - :class 'transient-option - :argument "-C" - :reader 'transient-read-number-N+) - -;;; Utilities - -(defun magit-blame-maybe-update-revision-buffer () - (when-let ((chunk (magit-current-blame-chunk)) - (commit (oref chunk orig-rev)) - (buffer (magit-get-mode-buffer 'magit-revision-mode nil t))) - (if magit--update-revision-buffer - (setq magit--update-revision-buffer (list commit buffer)) - (setq magit--update-revision-buffer (list commit buffer)) - (run-with-idle-timer - magit-update-other-window-delay nil - (lambda () - (pcase-let ((`(,rev ,buf) magit--update-revision-buffer)) - (setq magit--update-revision-buffer nil) - (when (buffer-live-p buf) - (let ((magit-display-buffer-noselect t)) - (apply #'magit-show-commit rev - (magit-diff-arguments 'magit-revision-mode)))))))))) - -;;; _ -(provide 'magit-blame) -;;; magit-blame.el ends here diff --git a/elpa/magit-20200418.939/magit-blame.elc b/elpa/magit-20200418.939/magit-blame.elc deleted file mode 100644 index 78b00d591279763a9537d3fe6f4b474c70b84021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37623 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�Kqn=1*o@i*?0){_!54=1 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 -;; Maintainer: Jonas Bernoulli - -;; Inspired by an earlier implementation by Yuri Khan. - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; Support for bookmarks for most Magit buffers. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) -(require 'bookmark) - -;;; Core - -(defun magit--make-bookmark () - "Create a bookmark for the current Magit buffer. -Input values are the major-mode's `magit-bookmark-name' method, -and the buffer-local values of the variables referenced in its -`magit-bookmark-variables' property." - (if (plist-member (symbol-plist major-mode) 'magit-bookmark-variables) - (let ((bookmark (bookmark-make-record-default 'no-file))) - (bookmark-prop-set bookmark 'handler 'magit--handle-bookmark) - (bookmark-prop-set bookmark 'mode major-mode) - (bookmark-prop-set bookmark 'filename (magit-toplevel)) - (bookmark-prop-set bookmark 'defaults (list (magit-bookmark-name))) - (dolist (var (get major-mode 'magit-bookmark-variables)) - (bookmark-prop-set bookmark var (symbol-value var))) - (bookmark-prop-set - bookmark 'magit-hidden-sections - (--keep (and (oref it hidden) - (cons (oref it type) - (if (derived-mode-p 'magit-stash-mode) - (replace-regexp-in-string - (regexp-quote magit-buffer-revision) - magit-buffer-revision-hash - (oref it value)) - (oref it value)))) - (oref magit-root-section children))) - bookmark) - (user-error "Bookmarking is not implemented for %s buffers" major-mode))) - -;;;###autoload -(defun magit--handle-bookmark (bookmark) - "Open a bookmark created by `magit--make-bookmark'. -Call the `magit-*-setup-buffer' function of the the major-mode -with the variables' values as arguments, which were recorded by -`magit--make-bookmark'. Ignore `magit-display-buffer-function'." - (let ((buffer (let ((default-directory (bookmark-get-filename bookmark)) - (mode (bookmark-prop-get bookmark 'mode)) - (magit-display-buffer-function #'identity) - (magit-display-buffer-noselect t)) - (apply (intern (format "%s-setup-buffer" - (substring (symbol-name mode) 0 -5))) - (--map (bookmark-prop-get bookmark it) - (get mode 'magit-bookmark-variables)))))) - (set-buffer buffer) ; That is the interface we have to adhere to. - (when-let ((hidden (bookmark-prop-get bookmark 'magit-hidden-sections))) - (with-current-buffer buffer - (dolist (child (oref magit-root-section children)) - (if (member (cons (oref child type) - (oref child value)) - hidden) - (magit-section-hide child) - (magit-section-show child))))) - nil)) - -(cl-defgeneric magit-bookmark-name () - "Return name for bookmark to current buffer." - (format "%s%s" - (substring (symbol-name major-mode) 0 -5) - (if-let ((vars (get major-mode 'magit-bookmark-variables))) - (cl-mapcan (lambda (var) - (let ((val (symbol-value var))) - (if (and val (atom val)) - (list val) - val))) - vars) - ""))) - -;;; Diff -;;;; Diff - -(put 'magit-diff-mode 'magit-bookmark-variables - '(magit-buffer-range-hashed - magit-buffer-typearg - magit-buffer-diff-args - magit-buffer-diff-files)) - -(cl-defmethod magit-bookmark-name (&context (major-mode magit-diff-mode)) - (format "magit-diff(%s%s)" - (pcase (magit-diff-type) - (`staged "staged") - (`unstaged "unstaged") - (`committed magit-buffer-range) - (`undefined - (delq nil (list magit-buffer-typearg magit-buffer-range-hashed)))) - (if magit-buffer-diff-files - (concat " -- " (mapconcat #'identity magit-buffer-diff-files " ")) - ""))) - -;;;; Revision - -(put 'magit-revision-mode 'magit-bookmark-variables - '(magit-buffer-revision-hash - magit-buffer-diff-args - magit-buffer-diff-files)) - -(cl-defmethod magit-bookmark-name (&context (major-mode magit-revision-mode)) - (format "magit-revision(%s %s)" - (magit-rev-abbrev magit-buffer-revision) - (if magit-buffer-diff-files - (mapconcat #'identity magit-buffer-diff-files " ") - (magit-rev-format "%s" magit-buffer-revision)))) - -;;;; Stash - -(put 'magit-stash-mode 'magit-bookmark-variables - '(magit-buffer-revision-hash - magit-buffer-diff-args - magit-buffer-diff-files)) - -(cl-defmethod magit-bookmark-name (&context (major-mode magit-stash-mode)) - (format "magit-stash(%s %s)" - (magit-rev-abbrev magit-buffer-revision) - (if magit-buffer-diff-files - (mapconcat #'identity magit-buffer-diff-files " ") - (magit-rev-format "%s" magit-buffer-revision)))) - -;;; Log -;;;; Log - -(put 'magit-log-mode 'magit-bookmark-variables - '(magit-buffer-revisions - magit-buffer-log-args - magit-buffer-log-files)) - -(cl-defmethod magit-bookmark-name (&context (major-mode magit-log-mode)) - (format "magit-log(%s%s)" - (mapconcat #'identity magit-buffer-revisions " ") - (if magit-buffer-log-files - (concat " -- " (mapconcat #'identity magit-buffer-log-files " ")) - ""))) - -;;;; Cherry - -(put 'magit-cherry-mode 'magit-bookmark-variables - '(magit-buffer-refname - magit-buffer-upstream)) - -(cl-defmethod magit-bookmark-name (&context (major-mode magit-cherry-mode)) - (format "magit-cherry(%s > %s)" - magit-buffer-refname - magit-buffer-upstream)) - -;;;; Reflog - -(put 'magit-reflog-mode 'magit-bookmark-variables - '(magit-buffer-refname)) - -(cl-defmethod magit-bookmark-name (&context (major-mode magit-reflog-mode)) - (format "magit-reflog(%s)" magit-buffer-refname)) - -;;; Misc - -(put 'magit-status-mode 'magit-bookmark-variables nil) - -(put 'magit-refs-mode 'magit-bookmark-variables - '(magit-buffer-upstream - magit-buffer-arguments)) - -(put 'magit-stashes-mode 'magit-bookmark-variables nil) - -(cl-defmethod magit-bookmark-name (&context (major-mode magit-stashes-mode)) - (format "magit-states(%s)" magit-buffer-refname)) - -;;; _ -(provide 'magit-bookmark) -;;; magit-bookmark.el ends here diff --git a/elpa/magit-20200418.939/magit-bookmark.elc b/elpa/magit-20200418.939/magit-bookmark.elc deleted file mode 100644 index da2deb49f0fa7aaf3db33168c702f1ba904f5634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5676 zcmc&&ZExeo5wo{lJojx4W5m}hl>$(wrVd=5$Gy!_|Y^|c7s zK^cTKTztmngDetNF2W!a3nh{~=om3use}s3Bvz%U*O(}MZ5JW6tGJu4Az%2H*u_*O67ESIXh=v`;UrWSWWvO&}XXr`%Y@IziYDcm`$#P@8= zv9=r>t~wK`s@Hk+tVhA8B@5Q)BzYJlR$ad2p}U}rgGB=UrGibBg*pl1y6WvKZ|0tf zqRb0b*4vBU_s%1=43apg#F=)+NrShlaY+o`xE!|;LNz{lir>kskBIp*DZL}SPG`R7 zLhgCT_>s8$fex>hj7~bQV@#NcjtCm0E3Q~}LI%FWdXH>;c|=cNk@Alo(c|BE((%ig zoJ=r5()Afl!b!3@=|LHskp2_=jNqy-$H&@VcY1UTUDAi6Qtx7Xi!Erul;---<5POL zeu5DnntXqjJ^h$wJ;n<(!Ub0ryzY^fTv~sBVt*gweIg%|kL>hodOc>RB?PYgE2f#T zne?YTtRtfLjez)wlRr7(P*Za5(njZ}Q|5W?R4OF0Fd~yDrMiomVN7!A?6Fd39aL*k zBym+csY(|>ZM97odE&6lsxsN{G)dDWz0QwPg?Sk{lsucH27@?EQcWgPhQYmBfDxhu zMoe<)*IjxM5SZU6_06O@FA{a95@EDg`%bmyu4C|CW&;6oixZ(@73WS4M1arYBmyji zEA&iJZwm#*WqhY1hM`j!^;M0?un1r(k|0!0saER8!iiyk*%kvVxZUI+0!B9Ra_OkD z1QqlzP1r!p0=!L38>iSz3UUB2i7rkngXgM07v5N$5B?x7#ArGl&Y5S%&&5pvhg&QY zGVerUv9*NJ#pu~Z?~3XNamDvK&Yw~2H-)29;!G?zna&i$8(k*qaS0+>bKGZ^Xg~}> zx!TYUP;1_;<8UqBfoTv5$^h(Yv9(mQ@0JkPs|@F0y^7)raorlP9P1SP@0~9*ad~s| z&9^UKeKS17O8bd3cq7MC%}mF{N@HM=smU$o0p8gEK-ggl6|3v5|924wsHTkf8&_&-;!4F5}u^IDy z&<8Px9a~#k^NET8bz&Z$$OHy2KLRI=iGk+CKvV3F=nduqypLS{-lf1xrof?gWkl4e zIRk~v*$aA>S1JK*n55quwMSy1ht)XeIxn|oeus7%w69dn_-9}?Qsw{*2?lu#oYrx@ z73fupBH5x>L7$NkDAJ%7{nM(GvwcfTtkV_F7#_F*bkRWaw?{b3fQ3_?4!S@i;Ta0|SD;?A zPT-@xg6cG_m>gOGM8FGRr?rAWL@T5`utFLevTZ{e8}g71LLJ!v@^<_1jSc^h4HRm< zqHTlfD0$@{vVqdeD@JV_fDf;5Z5u-Y91(|LVAK&3p+LBsxjP4cM9=VOWY1v)HDfeN z8kFHB-1tMBPT z)u;BdY3yhNlvzGEciiUPbi1(MfOm8jX?V#`Ai&0{tHD_tuCZ-x3(%+4K@<}!S>Ia? z20UeiXK+n}ni@XNW{}}8nKSF1*U$i z1uQj@+jDO?Yz~Q!1*b3(2Hn#yuxbAnbP!w{qz(j*g$F*R0q%~Q0iOqE{i72KTq7Q_ zm^yinpfY(f%l^V7N>iv((kXvT#!zHXH3{{&JnD$$;2)&x3ImdW(W*MO7p2H`qjNB1 z<$EK%i&~RdyD*)fR;N`%-8_{k7_Hn2N7dK&zSv||VxItvJWb=8+OkciQ5K=L3rh4@u9(aSf_;#JiZtshvjtI@$wE-Hg zdZg8p|E~hOGx`6HDtq!@4{4IGH2ED4=pJd&?E6$k(*J~BqrMC8aE*_H&wedW1e~MI%}icEiKK5>d?p;LCR`)pyswGe$d8f3#!^} S4BtR^yWZb+J##S`_Wlhnoz=Sl diff --git a/elpa/magit-20200418.939/magit-branch.el b/elpa/magit-20200418.939/magit-branch.el deleted file mode 100644 index b2d0a73a..00000000 --- a/elpa/magit-20200418.939/magit-branch.el +++ /dev/null @@ -1,893 +0,0 @@ -;;; magit-branch.el --- branch support -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for branches. It defines commands -;; for creating, checking out, manipulating, and configuring branches. -;; Commands defined here are mainly concerned with branches as -;; pointers, commands that deal with what a branch points at, are -;; defined elsewhere. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) -(require 'magit-reset) - -;;; Options - -(defcustom magit-branch-read-upstream-first t - "Whether to read upstream before name of new branch when creating a branch. - -`nil' Read the branch name first. -`t' Read the upstream first. -`fallback' Read the upstream first, but if it turns out that the chosen - value is not a valid upstream (because it cannot be resolved - as an existing revision), then treat it as the name of the - new branch and continue by reading the upstream next." - :package-version '(magit . "2.2.0") - :group 'magit-commands - :type '(choice (const :tag "read branch name first" nil) - (const :tag "read upstream first" t) - (const :tag "read upstream first, with fallback" fallback))) - -(defcustom magit-branch-prefer-remote-upstream nil - "Whether to favor remote upstreams when creating new branches. - -When a new branch is created, then the branch, commit, or stash -at point is suggested as the default starting point of the new -branch, or if there is no such revision at point the current -branch. In either case the user may choose another starting -point. - -If the chosen starting point is a branch, then it may also be set -as the upstream of the new branch, depending on the value of the -Git variable `branch.autoSetupMerge'. By default this is done -for remote branches, but not for local branches. - -You might prefer to always use some remote branch as upstream. -If the chosen starting point is (1) a local branch, (2) whose -name matches a member of the value of this option, (3) the -upstream of that local branch is a remote branch with the same -name, and (4) that remote branch can be fast-forwarded to the -local branch, then the chosen branch is used as starting point, -but its own upstream is used as the upstream of the new branch. - -Members of this option's value are treated as branch names that -have to match exactly unless they contain a character that makes -them invalid as a branch name. Recommended characters to use -to trigger interpretation as a regexp are \"*\" and \"^\". Some -other characters which you might expect to be invalid, actually -are not, e.g. \".+$\" are all perfectly valid. More precisely, -if `git check-ref-format --branch STRING' exits with a non-zero -status, then treat STRING as a regexp. - -Assuming the chosen branch matches these conditions you would end -up with with e.g.: - - feature --upstream--> origin/master - -instead of - - feature --upstream--> master --upstream--> origin/master - -Which you prefer is a matter of personal preference. If you do -prefer the former, then you should add branches such as \"master\", -\"next\", and \"maint\" to the value of this options." - :package-version '(magit . "2.4.0") - :group 'magit-commands - :type '(repeat string)) - -(defcustom magit-branch-adjust-remote-upstream-alist nil - "Alist of upstreams to be used when branching from remote branches. - -When creating a local branch from an ephemeral branch located -on a remote, e.g. a feature or hotfix branch, then that remote -branch should usually not be used as the upstream branch, since -the push-remote already allows accessing it and having both the -upstream and the push-remote reference the same related branch -would be wasteful. Instead a branch like \"maint\" or \"master\" -should be used as the upstream. - -This option allows specifying the branch that should be used as -the upstream when branching certain remote branches. The value -is an alist of the form ((UPSTREAM . RULE)...). The first -matching element is used, the following elements are ignored. - -UPSTREAM is the branch to be used as the upstream for branches -specified by RULE. It can be a local or a remote branch. - -RULE can either be a regular expression, matching branches whose -upstream should be the one specified by UPSTREAM. Or it can be -a list of the only branches that should *not* use UPSTREAM; all -other branches will. Matching is done after stripping the remote -part of the name of the branch that is being branched from. - -If you use a finite set of non-ephemeral branches across all your -repositories, then you might use something like: - - ((\"origin/master\" \"master\" \"next\" \"maint\")) - -Or if the names of all your ephemeral branches contain a slash, -at least in some repositories, then a good value could be: - - ((\"origin/master\" . \"/\")) - -Of course you can also fine-tune: - - ((\"origin/maint\" . \"\\\\\\=`hotfix/\") - (\"origin/master\" . \"\\\\\\=`feature/\")) - -If you use remote branches as UPSTREAM, then you might also want -to set `magit-branch-prefer-remote-upstream' to a non-nil value. -However, I recommend that you use local branches as UPSTREAM." - :package-version '(magit . "2.9.0") - :group 'magit-commands - :type '(repeat (cons (string :tag "Use upstream") - (choice :tag "for branches" - (regexp :tag "matching") - (repeat :tag "except" - (string :tag "branch")))))) - -(defcustom magit-branch-rename-push-target t - "Whether the push-remote setup is preserved when renaming a branch. - -The command `magit-branch-rename' renames a branch named OLD to -NEW. This option controls how much of the push-remote setup is -preserved when doing so. - -When nil, then preserve nothing and unset `branch.OLD.pushRemote'. - -When `local-only', then first set `branch.NEW.pushRemote' to the - same value as `branch.OLD.pushRemote', provided the latter is - actually set and unless the former already has another value. - -When t, then rename the branch named OLD on the remote specified - by `branch.OLD.pushRemote' to NEW, provided OLD exists on that - remote and unless NEW already exists on the remote. - -When `forge-only' and the `forge' package is available, then - behave like `t' if the remote points to a repository on a forge - (currently Github or Gitlab), otherwise like `local-only'. - -Another supported but obsolete value is `github-only'. It is a - misnomer because it now treated as an alias for `forge-only'." - :package-version '(magit . "2.90.0") - :group 'magit-commands - :type '(choice - (const :tag "Don't preserve push-remote setup" nil) - (const :tag "Preserve push-remote setup" local-only) - (const :tag "... and rename corresponding branch on remote" t) - (const :tag "... but only if remote is on a forge" forge-only))) - -(defcustom magit-branch-direct-configure t - "Whether the command `magit-branch' shows Git variables. -When set to nil, no variables are displayed by this transient -command, instead the sub-transient `magit-branch-configure' -has to be used to view and change branch related variables." - :package-version '(magit . "2.7.0") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-published-branches '("origin/master") - "List of branches that are considered to be published." - :package-version '(magit . "2.13.0") - :group 'magit-commands - :type '(repeat string)) - -;;; Commands - -;;;###autoload (autoload 'magit-branch "magit" nil t) -(define-transient-command magit-branch (branch) - "Add, configure or remove a branch." - :man-page "git-branch" - ["Variables" - :if (lambda () - (and magit-branch-direct-configure - (oref transient--prefix scope))) - ("d" magit-branch..description) - ("u" magit-branch..merge/remote) - ("r" magit-branch..rebase) - ("p" magit-branch..pushRemote)] - [["Checkout" - ("b" "branch/revision" magit-checkout) - ("l" "local branch" magit-branch-checkout) - (6 "o" "new orphan" magit-branch-orphan)] - ["" - ("c" "new branch" magit-branch-and-checkout) - ("s" "new spin-off" magit-branch-spinoff) - (5 "w" "new worktree" magit-worktree-checkout)] - ["Create" - ("n" "new branch" magit-branch-create) - ("S" "new spin-out" magit-branch-spinout) - (5 "W" "new worktree" magit-worktree-branch)] - ["Do" - ("C" "configure..." magit-branch-configure) - ("m" "rename" magit-branch-rename) - ("x" "reset" magit-branch-reset) - ("k" "delete" magit-branch-delete)] - ["" - (7 "h" "shelve" magit-branch-shelve) - (7 "H" "unshelve" magit-branch-unshelve)]] - (interactive (list (magit-get-current-branch))) - (transient-setup 'magit-branch nil nil :scope branch)) - -;;;###autoload -(defun magit-checkout (revision) - "Checkout REVISION, updating the index and the working tree. -If REVISION is a local branch, then that becomes the current -branch. If it is something else, then `HEAD' becomes detached. -Checkout fails if the working tree or the staging area contain -changes. -\n(git checkout REVISION)." - (interactive (list (magit-read-other-branch-or-commit "Checkout"))) - (when (string-match "\\`heads/\\(.+\\)" revision) - (setq revision (match-string 1 revision))) - (magit-run-git "checkout" revision)) - -;;;###autoload -(defun magit-branch-create (branch start-point) - "Create BRANCH at branch or revision START-POINT." - (interactive (magit-branch-read-args "Create branch")) - (magit-call-git "branch" branch start-point) - (magit-branch-maybe-adjust-upstream branch start-point) - (magit-refresh)) - -;;;###autoload -(defun magit-branch-and-checkout (branch start-point) - "Create and checkout BRANCH at branch or revision START-POINT." - (interactive (magit-branch-read-args "Create and checkout branch")) - (if (string-match-p "^stash@{[0-9]+}$" start-point) - (magit-run-git "stash" "branch" branch start-point) - (magit-call-git "checkout" "-b" branch start-point) - (magit-branch-maybe-adjust-upstream branch start-point) - (magit-refresh))) - -;;;###autoload -(defun magit-branch-or-checkout (arg &optional start-point) - "Hybrid between `magit-checkout' and `magit-branch-and-checkout'. - -Ask the user for an existing branch or revision. If the user -input actually can be resolved as a branch or revision, then -check that out, just like `magit-checkout' would. - -Otherwise create and checkout a new branch using the input as -its name. Before doing so read the starting-point for the new -branch. This is similar to what `magit-branch-and-checkout' -does." - (interactive - (let ((arg (magit-read-other-branch-or-commit "Checkout"))) - (list arg - (and (not (magit-commit-p arg)) - (magit-read-starting-point "Create and checkout branch" arg))))) - (when (string-match "\\`heads/\\(.+\\)" arg) - (setq arg (match-string 1 arg))) - (if start-point - (magit-branch-and-checkout arg start-point) - (magit-checkout arg))) - -;;;###autoload -(defun magit-branch-checkout (branch &optional start-point) - "Checkout an existing or new local branch. - -Read a branch name from the user offering all local branches and -a subset of remote branches as candidates. Omit remote branches -for which a local branch by the same name exists from the list -of candidates. The user can also enter a completely new branch -name. - -- If the user selects an existing local branch, then check that - out. - -- If the user selects a remote branch, then create and checkout - a new local branch with the same name. Configure the selected - remote branch as push target. - -- If the user enters a new branch name, then create and check - that out, after also reading the starting-point from the user. - -In the latter two cases the upstream is also set. Whether it is -set to the chosen START-POINT or something else depends on the -value of `magit-branch-adjust-remote-upstream-alist', just like -when using `magit-branch-and-checkout'." - (interactive - (let* ((current (magit-get-current-branch)) - (local (magit-list-local-branch-names)) - (remote (--filter (and (string-match "[^/]+/" it) - (not (member (substring it (match-end 0)) - (cons "HEAD" local)))) - (magit-list-remote-branch-names))) - (choices (nconc (delete current local) remote)) - (atpoint (magit-branch-at-point)) - (choice (magit-completing-read - "Checkout branch" choices - nil nil nil 'magit-revision-history - (or (car (member atpoint choices)) - (and atpoint - (car (member (and (string-match "[^/]+/" atpoint) - (substring atpoint (match-end 0))) - choices))))))) - (cond ((member choice remote) - (list (and (string-match "[^/]+/" choice) - (substring choice (match-end 0))) - choice)) - ((member choice local) - (list choice)) - (t - (list choice (magit-read-starting-point "Create" choice)))))) - (if (not start-point) - (magit-checkout branch) - (when (magit-anything-modified-p) - (user-error "Cannot checkout when there are uncommitted changes")) - (magit-branch-and-checkout branch start-point) - (when (magit-remote-branch-p start-point) - (pcase-let ((`(,remote . ,remote-branch) - (magit-split-branch-name start-point))) - (when (and (equal branch remote-branch) - (not (equal remote (magit-get "remote.pushDefault")))) - (magit-set remote "branch" branch "pushRemote")))))) - -(defun magit-branch-maybe-adjust-upstream (branch start-point) - (--when-let - (or (and (magit-get-upstream-branch branch) - (magit-get-indirect-upstream-branch start-point)) - (and (magit-remote-branch-p start-point) - (let ((name (cdr (magit-split-branch-name start-point)))) - (car (--first (if (listp (cdr it)) - (not (member name (cdr it))) - (string-match-p (cdr it) name)) - magit-branch-adjust-remote-upstream-alist))))) - (magit-call-git "branch" (concat "--set-upstream-to=" it) branch))) - -;;;###autoload -(defun magit-branch-orphan (branch start-point) - "Create and checkout an orphan BRANCH with contents from revision START-POINT." - (interactive (magit-branch-read-args "Create and checkout orphan branch")) - (magit-run-git "checkout" "--orphan" branch start-point)) - -(defun magit-branch-read-args (prompt &optional default-start) - (if magit-branch-read-upstream-first - (let ((choice (magit-read-starting-point prompt nil default-start))) - (if (magit-rev-verify choice) - (list (magit-read-string-ns - (if magit-completing-read--silent-default - (format "%s (starting at `%s')" prompt choice) - "Name for new branch") - (let ((def (mapconcat #'identity - (cdr (split-string choice "/")) - "/"))) - (and (member choice (magit-list-remote-branch-names)) - (not (member def (magit-list-local-branch-names))) - def))) - choice) - (if (eq magit-branch-read-upstream-first 'fallback) - (list choice - (magit-read-starting-point prompt choice default-start)) - (user-error "Not a valid starting-point: %s" choice)))) - (let ((branch (magit-read-string-ns (concat prompt " named")))) - (list branch (magit-read-starting-point prompt branch default-start))))) - -;;;###autoload -(defun magit-branch-spinout (branch &optional from) - "Create new branch from the unpushed commits. -Like `magit-branch-spinoff' but remain on the current branch. -If there are any uncommitted changes, then behave exactly like -`magit-branch-spinoff'." - (interactive (list (magit-read-string-ns "Spin out branch") - (car (last (magit-region-values 'commit))))) - (magit--branch-spinoff branch from nil)) - -;;;###autoload -(defun magit-branch-spinoff (branch &optional from) - "Create new branch from the unpushed commits. - -Create and checkout a new branch starting at and tracking the -current branch. That branch in turn is reset to the last commit -it shares with its upstream. If the current branch has no -upstream or no unpushed commits, then the new branch is created -anyway and the previously current branch is not touched. - -This is useful to create a feature branch after work has already -began on the old branch (likely but not necessarily \"master\"). - -If the current branch is a member of the value of option -`magit-branch-prefer-remote-upstream' (which see), then the -current branch will be used as the starting point as usual, but -the upstream of the starting-point may be used as the upstream -of the new branch, instead of the starting-point itself. - -If optional FROM is non-nil, then the source branch is reset -to `FROM~', instead of to the last commit it shares with its -upstream. Interactively, FROM is only ever non-nil, if the -region selects some commits, and among those commits, FROM is -the commit that is the fewest commits ahead of the source -branch. - -The commit at the other end of the selection actually does not -matter, all commits between FROM and `HEAD' are moved to the new -branch. If FROM is not reachable from `HEAD' or is reachable -from the source branch's upstream, then an error is raised." - (interactive (list (magit-read-string-ns "Spin off branch") - (car (last (magit-region-values 'commit))))) - (magit--branch-spinoff branch from t)) - -(defun magit--branch-spinoff (branch from checkout) - (when (magit-branch-p branch) - (user-error "Cannot spin off %s. It already exists" branch)) - (when (and (not checkout) - (magit-anything-modified-p)) - (message "Staying on HEAD due to uncommitted changes") - (setq checkout t)) - (if-let ((current (magit-get-current-branch))) - (let ((tracked (magit-get-upstream-branch current)) - base) - (when from - (unless (magit-rev-ancestor-p from current) - (user-error "Cannot spin off %s. %s is not reachable from %s" - branch from current)) - (when (and tracked - (magit-rev-ancestor-p from tracked)) - (user-error "Cannot spin off %s. %s is ancestor of upstream %s" - branch from tracked))) - (let ((magit-process-raise-error t)) - (if checkout - (magit-call-git "checkout" "-b" branch current) - (magit-call-git "branch" branch current))) - (--when-let (magit-get-indirect-upstream-branch current) - (magit-call-git "branch" "--set-upstream-to" it branch)) - (when (and tracked - (setq base - (if from - (concat from "^") - (magit-git-string "merge-base" current tracked))) - (not (magit-rev-eq base current))) - (if checkout - (magit-call-git "update-ref" "-m" - (format "reset: moving to %s" base) - (concat "refs/heads/" current) base) - (magit-call-git "reset" "--hard" base)))) - (if checkout - (magit-call-git "checkout" "-b" branch) - (magit-call-git "branch" branch))) - (magit-refresh)) - -;;;###autoload -(defun magit-branch-reset (branch to &optional set-upstream) - "Reset a branch to the tip of another branch or any other commit. - -When the branch being reset is the current branch, then do a -hard reset. If there are any uncommitted changes, then the user -has to confirm the reset because those changes would be lost. - -This is useful when you have started work on a feature branch but -realize it's all crap and want to start over. - -When resetting to another branch and a prefix argument is used, -then also set the target branch as the upstream of the branch -that is being reset." - (interactive - (let* ((atpoint (magit-local-branch-at-point)) - (branch (magit-read-local-branch "Reset branch" atpoint))) - (list branch - (magit-completing-read (format "Reset %s to" branch) - (delete branch (magit-list-branch-names)) - nil nil nil 'magit-revision-history - (or (and (not (equal branch atpoint)) atpoint) - (magit-get-upstream-branch branch))) - current-prefix-arg))) - (let ((inhibit-magit-refresh t)) - (if (equal branch (magit-get-current-branch)) - (if (and (magit-anything-modified-p) - (not (yes-or-no-p - "Uncommitted changes will be lost. Proceed? "))) - (user-error "Abort") - (magit-reset-hard to)) - (magit-call-git "update-ref" - "-m" (format "reset: moving to %s" to) - (magit-git-string "rev-parse" "--symbolic-full-name" - branch) - to)) - (when (and set-upstream (magit-branch-p to)) - (magit-set-upstream-branch branch to) - (magit-branch-maybe-adjust-upstream branch to))) - (magit-refresh)) - -(defvar magit-branch-delete-never-verify nil - "Whether `magit-branch-delete' always pushes with \"--no-verify\".") - -;;;###autoload -(defun magit-branch-delete (branches &optional force) - "Delete one or multiple branches. -If the region marks multiple branches, then offer to delete -those, otherwise prompt for a single branch to be deleted, -defaulting to the branch at point." - ;; One would expect this to be a command as simple as, for example, - ;; `magit-branch-rename'; but it turns out everyone wants to squeeze - ;; a bit of extra functionality into this one, including myself. - (interactive - (let ((branches (magit-region-values 'branch t)) - (force current-prefix-arg)) - (if (> (length branches) 1) - (magit-confirm t nil "Delete %i branches" nil branches) - (setq branches - (list (magit-read-branch-prefer-other - (if force "Force delete branch" "Delete branch"))))) - (unless force - (when-let ((unmerged (-remove #'magit-branch-merged-p branches))) - (if (magit-confirm 'delete-unmerged-branch - "Delete unmerged branch %s" - "Delete %i unmerged branches" - 'noabort unmerged) - (setq force branches) - (or (setq branches (-difference branches unmerged)) - (user-error "Abort"))))) - (list branches force))) - (let* ((refs (mapcar #'magit-ref-fullname branches)) - (ambiguous (--remove it refs))) - (when ambiguous - (user-error - "%s ambiguous. Please cleanup using git directly." - (let ((len (length ambiguous))) - (cond - ((= len 1) - (format "%s is" (-first #'magit-ref-ambiguous-p branches))) - ((= len (length refs)) - (format "These %s names are" len)) - (t - (format "%s of these names are" len)))))) - (cond - ((string-match "^refs/remotes/\\([^/]+\\)" (car refs)) - (let* ((remote (match-string 1 (car refs))) - (offset (1+ (length remote)))) - ;; Assume the branches actually still exists on the remote. - (magit-run-git-async - "push" - (and (or force magit-branch-delete-never-verify) "--no-verify") - remote - (--map (concat ":" (substring it offset)) branches)) - ;; If that is not the case, then this deletes the tracking branches. - (set-process-sentinel - magit-this-process - (apply-partially 'magit-delete-remote-branch-sentinel remote refs)))) - ((> (length branches) 1) - (setq branches (delete (magit-get-current-branch) branches)) - (mapc 'magit-branch-maybe-delete-pr-remote branches) - (mapc 'magit-branch-unset-pushRemote branches) - (magit-run-git "branch" (if force "-D" "-d") branches)) - (t ; And now for something completely different. - (let* ((branch (car branches)) - (prompt (format "Branch %s is checked out. " branch))) - (when (equal branch (magit-get-current-branch)) - (pcase (if (or (equal branch "master") - (not (magit-rev-verify "master"))) - (magit-read-char-case prompt nil - (?d "[d]etach HEAD & delete" 'detach) - (?a "[a]bort" 'abort)) - (magit-read-char-case prompt nil - (?d "[d]etach HEAD & delete" 'detach) - (?c "[c]heckout master & delete" 'master) - (?a "[a]bort" 'abort))) - (`detach (unless (or (equal force '(4)) - (member branch force) - (magit-branch-merged-p branch t)) - (magit-confirm 'delete-unmerged-branch - "Delete unmerged branch %s" "" - nil (list branch))) - (magit-call-git "checkout" "--detach")) - (`master (unless (or (equal force '(4)) - (member branch force) - (magit-branch-merged-p branch "master")) - (magit-confirm 'delete-unmerged-branch - "Delete unmerged branch %s" "" - nil (list branch))) - (magit-call-git "checkout" "master")) - (`abort (user-error "Abort"))) - (setq force t)) - (magit-branch-maybe-delete-pr-remote branch) - (magit-branch-unset-pushRemote branch) - (magit-run-git "branch" (if force "-D" "-d") branch)))))) - -(put 'magit-branch-delete 'interactive-only t) - -(defun magit-branch-maybe-delete-pr-remote (branch) - (when-let ((remote (magit-get "branch" branch "pullRequestRemote"))) - (let* ((variable (format "remote.%s.fetch" remote)) - (refspecs (magit-get-all variable))) - (unless (member (format "+refs/heads/*:refs/remotes/%s/*" remote) - refspecs) - (let ((refspec - (if (equal (magit-get "branch" branch "pushRemote") remote) - (format "+refs/heads/%s:refs/remotes/%s/%s" - branch remote branch) - (let ((merge (magit-get "branch" branch "merge"))) - (and merge - (string-prefix-p "refs/heads/" merge) - (setq merge (substring merge 11)) - (format "+refs/heads/%s:refs/remotes/%s/%s" - merge remote merge)))))) - (when (member refspec refspecs) - (if (and (= (length refspecs) 1) - (magit-confirm 'delete-pr-remote - (format "Also delete remote %s (%s)" remote - "no pull-request branch remains") - nil t)) - (magit-call-git "remote" "rm" remote) - (magit-call-git "config" "--unset-all" variable - (format "^%s$" (regexp-quote refspec)))))))))) - -(defun magit-branch-unset-pushRemote (branch) - (magit-set nil "branch" branch "pushRemote")) - -(defun magit-delete-remote-branch-sentinel (remote refs process event) - (when (memq (process-status process) '(exit signal)) - (if (= (process-exit-status process) 1) - (if-let ((on-remote (--map (concat "refs/remotes/" remote "/" it) - (magit-remote-list-branches remote))) - (rest (--filter (and (not (member it on-remote)) - (magit-ref-exists-p it)) - refs))) - (progn - (process-put process 'inhibit-refresh t) - (magit-process-sentinel process event) - (setq magit-this-error nil) - (message "Some remote branches no longer exist. %s" - "Deleting just the local tracking refs instead...") - (dolist (ref rest) - (magit-call-git "update-ref" "-d" ref)) - (magit-refresh) - (message "Deleting local remote-tracking refs...done")) - (magit-process-sentinel process event)) - (magit-process-sentinel process event)))) - -;;;###autoload -(defun magit-branch-rename (old new &optional force) - "Rename the branch named OLD to NEW. - -With a prefix argument FORCE, rename even if a branch named NEW -already exists. - -If `branch.OLD.pushRemote' is set, then unset it. Depending on -the value of `magit-branch-rename-push-target' (which see) maybe -set `branch.NEW.pushRemote' and maybe rename the push-target on -the remote." - (interactive - (let ((branch (magit-read-local-branch "Rename branch"))) - (list branch - (magit-read-string-ns (format "Rename branch '%s' to" branch) - nil 'magit-revision-history) - current-prefix-arg))) - (when (string-match "\\`heads/\\(.+\\)" old) - (setq old (match-string 1 old))) - (when (equal old new) - (user-error "Old and new branch names are the same")) - (magit-call-git "branch" (if force "-M" "-m") old new) - (when magit-branch-rename-push-target - (let ((remote (magit-get-push-remote old)) - (old-specific (magit-get "branch" old "pushRemote")) - (new-specific (magit-get "branch" new "pushRemote"))) - (when (and old-specific (or force (not new-specific))) - ;; Keep the target setting branch specific, even if that is - ;; redundant. But if a branch by the same name existed before - ;; and the rename isn't forced, then do not change a leftover - ;; setting. Such a leftover setting may or may not conform to - ;; what we expect here... - (magit-set old-specific "branch" new "pushRemote")) - (when (and (equal (magit-get-push-remote new) remote) - ;; ...and if it does not, then we must abort. - (not (eq magit-branch-rename-push-target 'local-only)) - (or (not (memq magit-branch-rename-push-target - '(forge-only github-only))) - (and (require (quote forge) nil t) - (fboundp 'forge--forge-remote-p) - (forge--forge-remote-p remote)))) - (let ((old-target (magit-get-push-branch old t)) - (new-target (magit-get-push-branch new t)) - (remote (magit-get-push-remote new))) - (when (and old-target - (not new-target) - (magit-y-or-n-p (format "Also rename %S to %S on \"%s\"" - old new remote))) - ;; Rename on (i.e. within) the remote, but only if the - ;; destination ref doesn't exist yet. If that ref already - ;; exists, then it probably is of some value and we better - ;; not touch it. Ignore what the local ref points at, - ;; i.e. if the local and the remote ref didn't point at - ;; the same commit before the rename then keep it that way. - (magit-call-git "push" "-v" remote - (format "%s:refs/heads/%s" old-target new) - (format ":refs/heads/%s" old))))))) - (magit-branch-unset-pushRemote old) - (magit-refresh)) - -;;;###autoload -(defun magit-branch-shelve (branch) - "Shelve a BRANCH. -Rename \"refs/heads/BRANCH\" to \"refs/shelved/BRANCH\", -and also rename the respective reflog file." - (interactive (list (magit-read-other-local-branch "Shelve branch"))) - (let ((old (concat "refs/heads/" branch)) - (new (concat "refs/shelved/" branch))) - (magit-git "update-ref" new old "") - (magit--rename-reflog-file old new) - (magit-branch-unset-pushRemote branch) - (magit-run-git "branch" "-D" branch))) - -;;;###autoload -(defun magit-branch-unshelve (branch) - "Unshelve a BRANCH -Rename \"refs/shelved/BRANCH\" to \"refs/heads/BRANCH\", -and also rename the respective reflog file." - (interactive - (list (magit-completing-read - "Unshelve branch" - (--map (substring it 8) - (magit-list-refnames "refs/shelved")) - nil t))) - (let ((old (concat "refs/shelved/" branch)) - (new (concat "refs/heads/" branch))) - (magit-git "update-ref" new old "") - (magit--rename-reflog-file old new) - (magit-run-git "update-ref" "-d" old))) - -(defun magit--rename-reflog-file (old new) - (let ((old (magit-git-dir (concat "logs/" old))) - (new (magit-git-dir (concat "logs/" new)))) - (when (file-exists-p old) - (make-directory (file-name-directory new) t) - (rename-file old new t)))) - -;;; Configure - -;;;###autoload (autoload 'magit-branch-configure "magit-branch" nil t) -(define-transient-command magit-branch-configure (branch) - "Configure a branch." - :man-page "git-branch" - [:description - (lambda () - (concat - (propertize "Configure " 'face 'transient-heading) - (propertize (oref transient--prefix scope) 'face 'magit-branch-local))) - ("d" magit-branch..description) - ("u" magit-branch..merge/remote) - ("r" magit-branch..rebase) - ("p" magit-branch..pushRemote)] - ["Configure repository defaults" - ("R" magit-pull.rebase) - ("P" magit-remote.pushDefault)] - ["Configure branch creation" - ("a m" magit-branch.autoSetupMerge) - ("a r" magit-branch.autoSetupRebase)] - (interactive - (list (or (and (not current-prefix-arg) - (not (and magit-branch-direct-configure - (eq current-transient-command 'magit-branch))) - (magit-get-current-branch)) - (magit--read-branch-scope)))) - (transient-setup 'magit-branch-configure nil nil :scope branch)) - -(defun magit--read-branch-scope (&optional obj) - (magit-read-local-branch - (if obj - (format "Set %s for branch" - (format (oref obj variable) "")) - "Configure branch"))) - -(define-suffix-command magit-branch..description (branch) - "Edit the description of BRANCH." - :class 'magit--git-variable - :transient nil - :variable "branch.%s.description" - (interactive (list (oref current-transient-prefix scope))) - (magit-run-git-with-editor "branch" "--edit-description" branch)) - -(add-hook 'find-file-hook 'magit-branch-description-check-buffers) - -(defun magit-branch-description-check-buffers () - (and buffer-file-name - (string-match-p "/\\(BRANCH\\|EDIT\\)_DESCRIPTION\\'" buffer-file-name))) - -(defclass magit--git-branch:upstream (magit--git-variable) - ((format :initform " %k %m %M\n %r %R"))) - -(define-infix-command magit-branch..merge/remote () - :class 'magit--git-branch:upstream) - -(cl-defmethod transient-init-value ((obj magit--git-branch:upstream)) - (when-let ((branch (oref transient--prefix scope)) - (remote (magit-get "branch" branch "remote")) - (merge (magit-get "branch" branch "merge"))) - (oset obj value (list remote merge)))) - -(cl-defmethod transient-infix-read ((obj magit--git-branch:upstream)) - (if (oref obj value) - (oset obj value nil) - (magit-read-upstream-branch (oref transient--prefix scope) "Upstream"))) - -(cl-defmethod transient-infix-set ((obj magit--git-branch:upstream) refname) - (magit-set-upstream-branch (oref transient--prefix scope) refname) - (oset obj value - (let ((branch (oref transient--prefix scope))) - (when-let ((r (magit-get "branch" branch "remote")) - (m (magit-get "branch" branch "merge"))) - (list r m)))) - (magit-refresh)) - -(cl-defmethod transient-format ((obj magit--git-branch:upstream)) - (let ((branch (oref transient--prefix scope))) - (format-spec - (oref obj format) - `((?k . ,(transient-format-key obj)) - (?r . ,(format "branch.%s.remote" branch)) - (?m . ,(format "branch.%s.merge" branch)) - (?R . ,(transient-format-value obj #'car)) - (?M . ,(transient-format-value obj #'cadr)))))) - -(cl-defmethod transient-format-value ((obj magit--git-branch:upstream) key) - (if-let ((value (funcall key (oref obj value)))) - (propertize value 'face 'transient-argument) - (propertize "unset" 'face 'transient-inactive-argument))) - -(define-infix-command magit-branch..rebase () - :class 'magit--git-variable:choices - :scope 'magit--read-branch-scope - :variable "branch.%s.rebase" - :fallback "pull.rebase" - :choices '("true" "false") - :default "false") - -(define-infix-command magit-branch..pushRemote () - :class 'magit--git-variable:choices - :scope 'magit--read-branch-scope - :variable "branch.%s.pushRemote" - :fallback "remote.pushDefault" - :choices 'magit-list-remotes) - -(define-infix-command magit-pull.rebase () - :class 'magit--git-variable:choices - :variable "pull.rebase" - :choices '("true" "false") - :default "false") - -(define-infix-command magit-remote.pushDefault () - :class 'magit--git-variable:choices - :variable "remote.pushDefault" - :choices 'magit-list-remotes) - -(define-infix-command magit-branch.autoSetupMerge () - :class 'magit--git-variable:choices - :variable "branch.autoSetupMerge" - :choices '("always" "true" "false") - :default "true") - -(define-infix-command magit-branch.autoSetupRebase () - :class 'magit--git-variable:choices - :variable "branch.autoSetupRebase" - :choices '("always" "local" "remote" "never") - :default "never") - -;;; _ -(provide 'magit-branch) -;;; magit-branch.el ends here diff --git a/elpa/magit-20200418.939/magit-branch.elc b/elpa/magit-20200418.939/magit-branch.elc deleted file mode 100644 index 08af3b22a42f1ec9d12a3af59c67304a6d68d4cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37364 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
`r$}lS|p7d{FGF9R~xIju*Vg##D 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 TpFUxQJiqqY^t-NAspWqIN^V3{ diff --git a/elpa/magit-20200418.939/magit-clone.el b/elpa/magit-20200418.939/magit-clone.el deleted file mode 100644 index 00bd8048..00000000 --- a/elpa/magit-20200418.939/magit-clone.el +++ /dev/null @@ -1,269 +0,0 @@ -;;; magit-clone.el --- clone a repository -*- lexical-binding: t -*- - -;; Copyright (C) 2008-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements clone commands. - -;;; Code: - -(require 'magit) - -;;; Options - -(defcustom magit-clone-set-remote-head nil - "Whether cloning creates the symbolic-ref `/HEAD'." - :package-version '(magit . "2.4.2") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-clone-set-remote.pushDefault 'ask - "Whether to set the value of `remote.pushDefault' after cloning. - -If t, then set without asking. If nil, then don't set. If -`ask', then ask." - :package-version '(magit . "2.4.0") - :group 'magit-commands - :type '(choice (const :tag "set" t) - (const :tag "ask" ask) - (const :tag "don't set" nil))) - -(defcustom magit-clone-default-directory nil - "Default directory to use when `magit-clone' reads destination. -If nil (the default), then use the value of `default-directory'. -If a directory, then use that. If a function, then call that -with the remote url as only argument and use the returned value." - :package-version '(magit . "2.90.0") - :group 'magit-commands - :type '(choice (const :tag "value of default-directory") - (directory :tag "constant directory") - (function :tag "function's value"))) - -(defcustom magit-clone-always-transient nil - "Whether `magit-clone' always acts as a transient prefix command. -If nil, then a prefix argument has to be used to show the transient -popup instead of invoking the default suffix `magit-clone-regular' -directly." - :package-version '(magit . "3.0.0") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-clone-name-alist - '(("\\`\\(?:github:\\|gh:\\)?\\([^:]+\\)\\'" "github.com" "github.user") - ("\\`\\(?:gitlab:\\|gl:\\)\\([^:]+\\)\\'" "gitlab.com" "gitlab.user")) - "Alist mapping repository names to repository urls. - -Each element has the form (REGEXP HOSTNAME USER). When the user -enters a name when a cloning command asks for a name or url, then -that is looked up in this list. The first element whose REGEXP -matches is used. - -The format specified by option `magit-clone-url-format' is used -to turn the name into an url, using HOSTNAME and the repository -name. If the provided name contains a slash, then that is used. -Otherwise if the name omits the owner of the repository, then the -default user specified in the matched entry is used. - -If USER contains a dot, then it is treated as a Git variable and -the value of that is used as the username. Otherwise it is used -as the username itself." - :package-version '(magit . "3.0.0") - :group 'magit-commands - :type '(repeat (list regexp - (string :tag "hostname") - (string :tag "user name or git variable")))) - -(defcustom magit-clone-url-format "git@%h:%n.git" - "Format used when turning repository names into urls. -%h is the hostname and %n is the repository name, including -the name of the owner. Also see `magit-clone-name-alist'." - :package-version '(magit . "3.0.0") - :group 'magit-commands - :type 'regexp) - -;;; Commands - -;;;###autoload (autoload 'magit-clone "magit-clone" nil t) -(define-transient-command magit-clone (&optional transient) - "Clone a repository." - :man-page "git-clone" - ["Fetch arguments" - ("-B" "Clone a single branch" "--single-branch") - ("-n" "Do not clone tags" "--no-tags") - ("-S" "Clones submodules" "--recurse-submodules" :level 6) - ("-l" "Do not optimize" "--no-local" :level 7)] - ["Setup arguments" - ("-o" "Set name of remote" ("-o" "--origin=")) - ("-b" "Set HEAD branch" ("-b" "--branch=")) - ("-g" "Separate git directory" "--separate-git-dir=" - transient-read-directory :level 7) - ("-t" "Use template directory" "--template=" - transient-read-existing-directory :level 6)] - ["Local sharing arguments" - ("-s" "Share objects" ("-s" "--shared" :level 7)) - ("-h" "Do not use hardlinks" "--no-hardlinks")] - ["Clone" - ("C" "regular" magit-clone-regular) - ("s" "shallow" magit-clone-shallow) - ("d" "shallow since date" magit-clone-shallow-since :level 7) - ("e" "shallow excluding" magit-clone-shallow-exclude :level 7) - ("b" "bare" magit-clone-bare) - ("m" "mirror" magit-clone-mirror)] - (interactive (list (or magit-clone-always-transient current-prefix-arg))) - (if transient - (transient-setup #'magit-clone) - (call-interactively #'magit-clone-regular))) - -;;;###autoload -(defun magit-clone-regular (repository directory args) - "Create a clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository." - (interactive (magit-clone-read-args)) - (magit-clone-internal repository directory args)) - -;;;###autoload -(defun magit-clone-shallow (repository directory args depth) - "Create a shallow clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository. -With a prefix argument read the DEPTH of the clone; -otherwise use 1." - (interactive (append (magit-clone-read-args) - (list (if current-prefix-arg - (read-number "Depth: " 1) - 1)))) - (magit-clone-internal repository directory - (cons (format "--depth=%s" depth) args))) - -;;;###autoload -(defun magit-clone-shallow-since (repository directory args date) - "Create a shallow clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository. -Exclude commits before DATE, which is read from the -user." - (interactive (append (magit-clone-read-args) - (list (transient-read-date "Exclude commits before: " - nil nil)))) - (magit-clone-internal repository directory - (cons (format "--shallow-since=%s" date) args))) - -;;;###autoload -(defun magit-clone-shallow-exclude (repository directory args exclude) - "Create a shallow clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository. -Exclude commits reachable from EXCLUDE, which is a -branch or tag read from the user." - (interactive (append (magit-clone-read-args) - (list (read-string "Exclude commits reachable from: ")))) - (magit-clone-internal repository directory - (cons (format "--shallow-exclude=%s" exclude) args))) - -;;;###autoload -(defun magit-clone-bare (repository directory args) - "Create a bare clone of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository." - (interactive (magit-clone-read-args)) - (magit-clone-internal repository directory (cons "--bare" args))) - -;;;###autoload -(defun magit-clone-mirror (repository directory args) - "Create a mirror of REPOSITORY in DIRECTORY. -Then show the status buffer for the new repository." - (interactive (magit-clone-read-args)) - (magit-clone-internal repository directory (cons "--mirror" args))) - -(defun magit-clone-internal (repository directory args) - (run-hooks 'magit-credential-hook) - (setq directory (file-name-as-directory (expand-file-name directory))) - (magit-run-git-async "clone" args "--" repository - (magit-convert-filename-for-git directory)) - ;; Don't refresh the buffer we're calling from. - (process-put magit-this-process 'inhibit-refresh t) - (set-process-sentinel - magit-this-process - (lambda (process event) - (when (memq (process-status process) '(exit signal)) - (let ((magit-process-raise-error t)) - (magit-process-sentinel process event))) - (when (and (eq (process-status process) 'exit) - (= (process-exit-status process) 0)) - (unless (memq (car args) '("--bare" "--mirror")) - (let ((default-directory directory)) - (when (or (eq magit-clone-set-remote.pushDefault t) - (and magit-clone-set-remote.pushDefault - (y-or-n-p "Set `remote.pushDefault' to \"origin\"? "))) - (setf (magit-get "remote.pushDefault") "origin")) - (unless magit-clone-set-remote-head - (magit-remote-unset-head "origin")))) - (with-current-buffer (process-get process 'command-buf) - (magit-status-setup-buffer directory)))))) - -(defun magit-clone-read-args () - (let ((repo (magit-clone-read-repository))) - (list repo - (read-directory-name - "Clone to: " - (if (functionp magit-clone-default-directory) - (funcall magit-clone-default-directory repo) - magit-clone-default-directory) - nil nil - (and (string-match "\\([^/:]+?\\)\\(/?\\.git\\)?$" repo) - (match-string 1 repo))) - (transient-args 'magit-clone)))) - -(defun magit-clone-read-repository () - (magit-read-char-case "Clone from " nil - (?u "[u]rl or name" - (let ((str (magit-read-string-ns "Clone from url or name"))) - (if (string-match-p "\\(://\\|@\\)" str) - str - (magit-clone--name-to-url str)))) - (?p "[p]ath" - (read-directory-name "Clone repository: ")) - (?l "or [l]ocal url" - (concat "file://" (read-directory-name "Clone repository: file://"))))) - -(defun magit-clone--name-to-url (name) - (or (-some - (pcase-lambda (`(,re ,host ,user)) - (and (string-match re name) - (let ((repo (match-string 1 name))) - (magit-clone--format-url host user repo)))) - magit-clone-name-alist) - (user-error "Not an url and no matching entry in `%s'" - 'magit-clone-name-alist))) - -(defun magit-clone--format-url (host user repo) - (format-spec - magit-clone-url-format - `((?h . ,host) - (?n . ,(if (string-match-p "/" repo) - repo - (if (string-match-p "\\." user) - (if-let ((user (magit-get user))) - (concat user "/" repo) - (user-error "Set %S or specify owner explicitly" user)) - (concat user "/" repo))))))) - -;;; _ -(provide 'magit-clone) -;;; magit-clone.el ends here diff --git a/elpa/magit-20200418.939/magit-clone.elc b/elpa/magit-20200418.939/magit-clone.elc deleted file mode 100644 index 369234b695e4815ab258f7b9cb102205b7adcb2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11294 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 -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements commands for creating Git commits. These -;; commands just initiate the commit, support for writing the commit -;; messages is implemented in `git-commit.el'. - -;;; Code: - -(require 'magit) -(require 'magit-sequence) - -(eval-when-compile (require 'epa)) ; for `epa-protocol' -(eval-when-compile (require 'epg)) -(eval-when-compile (require 'subr-x)) - -;;; Options - -(defcustom magit-commit-ask-to-stage 'verbose - "Whether to ask to stage all unstaged changes when committing and nothing is staged." - :package-version '(magit . "2.3.0") - :group 'magit-commands - :type '(choice (const :tag "Ask" t) - (const :tag "Ask showing diff" verbose) - (const :tag "Stage without confirmation" stage) - (const :tag "Don't ask" nil))) - -(defcustom magit-commit-show-diff t - "Whether the relevant diff is automatically shown when committing." - :package-version '(magit . "2.3.0") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-commit-extend-override-date t - "Whether using `magit-commit-extend' changes the committer date." - :package-version '(magit . "2.3.0") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-commit-reword-override-date t - "Whether using `magit-commit-reword' changes the committer date." - :package-version '(magit . "2.3.0") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-commit-squash-confirm t - "Whether the commit targeted by squash and fixup has to be confirmed. -When non-nil then the commit at point (if any) is used as default -choice, otherwise it has to be confirmed. This option only -affects `magit-commit-squash' and `magit-commit-fixup'. The -\"instant\" variants always require confirmation because making -an error while using those is harder to recover from." - :package-version '(magit . "2.1.0") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-post-commit-hook nil - "Hook run after creating a commit without the user editing a message. - -This hook is run by `magit-refresh' if `this-command' is a member -of `magit-post-stage-hook-commands'. This only includes commands -named `magit-commit-*' that do *not* require that the user edits -the commit message in a buffer and then finishes by pressing -\\\\[with-editor-finish]. - -Also see `git-commit-post-finish-hook'." - :package-version '(magit . "2.90.0") - :group 'magit-commands - :type 'hook) - -(defvar magit-post-commit-hook-commands - '(magit-commit-extend - magit-commit-fixup - magit-commit-augment - magit-commit-instant-fixup - magit-commit-instant-squash)) - -;;; Popup - -;;;###autoload (autoload 'magit-commit "magit-commit" nil t) -(define-transient-command magit-commit () - "Create a new commit or replace an existing commit." - :info-manual "(magit)Initiating a Commit" - :man-page "git-commit" - ["Arguments" - ("-a" "Stage all modified and deleted files" ("-a" "--all")) - ("-e" "Allow empty commit" "--allow-empty") - ("-v" "Show diff of changes to be committed" ("-v" "--verbose")) - ("-n" "Disable hooks" ("-n" "--no-verify")) - ("-R" "Claim authorship and reset author date" "--reset-author") - (magit:--author :description "Override the author") - (7 "-D" "Override the author date" "--date=" transient-read-date) - ("-s" "Add Signed-off-by line" ("-s" "--signoff")) - (5 magit:--gpg-sign) - (magit-commit:--reuse-message)] - [["Create" - ("c" "Commit" magit-commit-create)] - ["Edit HEAD" - ("e" "Extend" magit-commit-extend) - ("w" "Reword" magit-commit-reword) - ("a" "Amend" magit-commit-amend) - (6 "n" "Reshelve" magit-commit-reshelve)] - ["Edit" - ("f" "Fixup" magit-commit-fixup) - ("s" "Squash" magit-commit-squash) - ("A" "Augment" magit-commit-augment) - (6 "x" "Absorb changes" magit-commit-absorb)] - ["" - ("F" "Instant fixup" magit-commit-instant-fixup) - ("S" "Instant squash" magit-commit-instant-squash)]] - (interactive) - (if-let ((buffer (magit-commit-message-buffer))) - (switch-to-buffer buffer) - (transient-setup 'magit-commit))) - -(defun magit-commit-arguments nil - (transient-args 'magit-commit)) - -(define-infix-argument magit:--gpg-sign () - :description "Sign using gpg" - :class 'transient-option - :shortarg "-S" - :argument "--gpg-sign=" - :allow-empty t - :reader 'magit-read-gpg-secret-key) - -(defvar magit-gpg-secret-key-hist nil) - -(defun magit-read-gpg-secret-key (prompt &optional initial-input history) - (require 'epa) - (let* ((keys (mapcar - (lambda (obj) - (let ((key (epg-sub-key-id (car (epg-key-sub-key-list obj)))) - (author - (when-let ((id-obj (car (epg-key-user-id-list obj)))) - (let ((id-str (epg-user-id-string id-obj))) - (if (stringp id-str) - id-str - (epg-decode-dn id-obj)))))) - (propertize key 'display (concat key " " author)))) - (epg-list-keys (epg-make-context epa-protocol) nil t))) - (choice (completing-read prompt keys nil nil nil - history nil initial-input))) - (set-text-properties 0 (length choice) nil choice) - choice)) - -(define-infix-argument magit-commit:--reuse-message () - :description "Reuse commit message" - :class 'transient-option - :shortarg "-C" - :argument "--reuse-message=" - :reader 'magit-read-reuse-message - :history-key 'magit-revision-history) - -(defun magit-read-reuse-message (prompt &optional default history) - (magit-completing-read prompt (magit-list-refnames) - nil nil nil history - (or default - (and (magit-rev-verify "ORIG_HEAD") - "ORIG_HEAD")))) - -;;; Commands - -;;;###autoload -(defun magit-commit-create (&optional args) - "Create a new commit on `HEAD'. -With a prefix argument, amend to the commit at `HEAD' instead. -\n(git commit [--amend] ARGS)" - (interactive (if current-prefix-arg - (list (cons "--amend" (magit-commit-arguments))) - (list (magit-commit-arguments)))) - (when (member "--all" args) - (setq this-command 'magit-commit-all)) - (when (setq args (magit-commit-assert args)) - (let ((default-directory (magit-toplevel))) - (magit-run-git-with-editor "commit" args)))) - -;;;###autoload -(defun magit-commit-amend (&optional args) - "Amend the last commit. -\n(git commit --amend ARGS)" - (interactive (list (magit-commit-arguments))) - (magit-commit-amend-assert) - (magit-run-git-with-editor "commit" "--amend" args)) - -;;;###autoload -(defun magit-commit-extend (&optional args override-date) - "Amend the last commit, without editing the message. - -With a prefix argument keep the committer date, otherwise change -it. The option `magit-commit-extend-override-date' can be used -to inverse the meaning of the prefix argument. \n(git commit ---amend --no-edit)" - (interactive (list (magit-commit-arguments) - (if current-prefix-arg - (not magit-commit-extend-override-date) - magit-commit-extend-override-date))) - (when (setq args (magit-commit-assert args (not override-date))) - (magit-commit-amend-assert) - (let ((process-environment process-environment)) - (unless override-date - (push (magit-rev-format "GIT_COMMITTER_DATE=%cD") process-environment)) - (magit-run-git-with-editor "commit" "--amend" "--no-edit" args)))) - -;;;###autoload -(defun magit-commit-reword (&optional args override-date) - "Reword the last commit, ignoring staged changes. - -With a prefix argument keep the committer date, otherwise change -it. The option `magit-commit-reword-override-date' can be used -to inverse the meaning of the prefix argument. - -Non-interactively respect the optional OVERRIDE-DATE argument -and ignore the option. -\n(git commit --amend --only)" - (interactive (list (magit-commit-arguments) - (if current-prefix-arg - (not magit-commit-reword-override-date) - magit-commit-reword-override-date))) - (magit-commit-amend-assert) - (let ((process-environment process-environment)) - (unless override-date - (push (magit-rev-format "GIT_COMMITTER_DATE=%cD") process-environment)) - (cl-pushnew "--allow-empty" args :test #'equal) - (magit-run-git-with-editor "commit" "--amend" "--only" args))) - -;;;###autoload -(defun magit-commit-fixup (&optional commit args) - "Create a fixup commit. - -With a prefix argument the target COMMIT has to be confirmed. -Otherwise the commit at point may be used without confirmation -depending on the value of option `magit-commit-squash-confirm'." - (interactive (list (magit-commit-at-point) - (magit-commit-arguments))) - (magit-commit-squash-internal "--fixup" commit args)) - -;;;###autoload -(defun magit-commit-squash (&optional commit args) - "Create a squash commit, without editing the squash message. - -With a prefix argument the target COMMIT has to be confirmed. -Otherwise the commit at point may be used without confirmation -depending on the value of option `magit-commit-squash-confirm'." - (interactive (list (magit-commit-at-point) - (magit-commit-arguments))) - (magit-commit-squash-internal "--squash" commit args)) - -;;;###autoload -(defun magit-commit-augment (&optional commit args) - "Create a squash commit, editing the squash message. - -With a prefix argument the target COMMIT has to be confirmed. -Otherwise the commit at point may be used without confirmation -depending on the value of option `magit-commit-squash-confirm'." - (interactive (list (magit-commit-at-point) - (magit-commit-arguments))) - (magit-commit-squash-internal "--squash" commit args nil t)) - -;;;###autoload -(defun magit-commit-instant-fixup (&optional commit args) - "Create a fixup commit targeting COMMIT and instantly rebase." - (interactive (list (magit-commit-at-point) - (magit-commit-arguments))) - (magit-commit-squash-internal "--fixup" commit args t)) - -;;;###autoload -(defun magit-commit-instant-squash (&optional commit args) - "Create a squash commit targeting COMMIT and instantly rebase." - (interactive (list (magit-commit-at-point) - (magit-commit-arguments))) - (magit-commit-squash-internal "--squash" commit args t)) - -(defun magit-commit-squash-internal - (option commit &optional args rebase edit confirmed) - (when-let ((args (magit-commit-assert args t))) - (when commit - (when (and rebase (not (magit-rev-ancestor-p commit "HEAD"))) - (magit-read-char-case - (format "%s isn't an ancestor of HEAD. " commit) nil - (?c "[c]reate without rebasing" (setq rebase nil)) - (?s "[s]elect other" (setq commit nil)) - (?a "[a]bort" (user-error "Quit"))))) - (when commit - (setq commit (magit-rebase-interactive-assert commit t))) - (if (and commit - (or confirmed - (not (or rebase - current-prefix-arg - magit-commit-squash-confirm)))) - (let ((magit-commit-show-diff nil)) - (push (concat option "=" commit) args) - (unless edit - (push "--no-edit" args)) - (if rebase - (magit-with-editor - (magit-call-git - "commit" "--no-gpg-sign" - (-remove-first - (apply-partially #'string-match-p "\\`--gpg-sign=") - args))) - (magit-run-git-with-editor "commit" args)) - t) ; The commit was created; used by below lambda. - (magit-log-select - (lambda (commit) - (when (and (magit-commit-squash-internal option commit args - rebase edit t) - rebase) - (magit-commit-amend-assert commit) - (magit-rebase-interactive-1 commit - (list "--autosquash" "--autostash" "--keep-empty") - "" "true" nil t))) - (format "Type %%p on a commit to %s into it," - (substring option 2)) - nil nil nil commit) - (when magit-commit-show-diff - (let ((magit-display-buffer-noselect t)) - (apply #'magit-diff-staged nil (magit-diff-arguments))))))) - -(defun magit-commit-amend-assert (&optional commit) - (--when-let (magit-list-publishing-branches commit) - (let ((m1 "This commit has already been published to ") - (m2 ".\nDo you really want to modify it")) - (magit-confirm 'amend-published - (concat m1 "%s" m2) - (concat m1 "%i public branches" m2) - nil it)))) - -(defun magit-commit-assert (args &optional strict) - (cond - ((or (magit-anything-staged-p) - (and (magit-anything-unstaged-p) - ;; ^ Everything of nothing is still nothing. - (member "--all" args)) - (and (not strict) - ;; ^ For amend variants that don't make sense otherwise. - (or (member "--amend" args) - (member "--allow-empty" args)))) - (or args (list "--"))) - ((and (magit-rebase-in-progress-p) - (not (magit-anything-unstaged-p)) - (y-or-n-p "Nothing staged. Continue in-progress rebase? ")) - (setq this-command 'magit-rebase-continue) - (magit-run-git-sequencer "rebase" "--continue") - nil) - ((and (file-exists-p (magit-git-dir "MERGE_MSG")) - (not (magit-anything-unstaged-p))) - (or args (list "--"))) - ((not (magit-anything-unstaged-p)) - (user-error "Nothing staged (or unstaged)")) - (magit-commit-ask-to-stage - (when (eq magit-commit-ask-to-stage 'verbose) - (magit-diff-unstaged)) - (prog1 (when (or (eq magit-commit-ask-to-stage 'stage) - (y-or-n-p "Nothing staged. Stage and commit all unstaged changes? ")) - (magit-run-git "add" "-u" ".") - (or args (list "--"))) - (when (and (eq magit-commit-ask-to-stage 'verbose) - (derived-mode-p 'magit-diff-mode)) - (magit-mode-bury-buffer)))) - (t - (user-error "Nothing staged")))) - -(defvar magit--reshelve-history nil) - -;;;###autoload -(defun magit-commit-reshelve (date) - "Change the committer date and possibly the author date of `HEAD'. - -If you are the author of `HEAD', then both dates are changed, -otherwise only the committer date. The current time is used -as the initial minibuffer input and the original author (if -that is you) or committer date is available as the previous -history element." - (interactive - (let ((author-p (magit-rev-author-p "HEAD"))) - (push (magit-rev-format (if author-p "%ad" "%cd") "HEAD" - (concat "--date=format:%F %T %z")) - magit--reshelve-history) - (list (read-string (if author-p - "Change author and committer dates to: " - "Change committer date to: ") - (cons (format-time-string "%F %T %z") 17) - 'magit--reshelve-history)))) - (let ((process-environment process-environment)) - (push (concat "GIT_COMMITTER_DATE=" date) process-environment) - (magit-run-git "commit" "--amend" "--no-edit" - (and (magit-rev-author-p "HEAD") - (concat "--date=" date))))) - -;;;###autoload (autoload 'magit-commit-absorb "magit-commit" nil t) -(define-transient-command magit-commit-absorb (phase commit args) - "Spread unstaged changes across recent commits. -With a prefix argument use a transient command to select infix -arguments. This command requires the git-autofixup script, which -is available from https://github.com/torbiak/git-autofixup." - ["Arguments" - (magit-autofixup:--context) - (magit-autofixup:--strict)] - ["Actions" - ("x" "Absorb" magit-commit-absorb)] - (interactive (if current-prefix-arg - (list 'transient nil nil) - (list 'select - (magit-get-upstream-branch) - (transient-args 'magit-commit-absorb)))) - (if (eq phase 'transient) - (transient-setup 'magit-commit-absorb) - (unless (executable-find "git-autofixup") - (user-error "This command requires the git-autofixup script, which %s" - "is available from https://github.com/torbiak/git-autofixup")) - (when (magit-anything-staged-p) - (user-error "Cannot absorb when there are staged changes")) - (unless (magit-anything-unstaged-p) - (user-error "There are no unstaged changes that could be absorbed")) - (when commit - (setq commit (magit-rebase-interactive-assert commit t))) - (if (and commit (eq phase 'run)) - (progn (magit-run-git-async "autofixup" "-vv" args commit) t) - (magit-log-select - (lambda (commit) - (with-no-warnings ; about non-interactive use - (magit-commit-absorb 'run commit args))) - nil nil nil nil commit)))) - -(define-infix-argument magit-autofixup:--context () - :description "Diff context lines" - :class 'transient-option - :shortarg "-c" - :argument "--context=" - :reader 'transient-read-number-N0) - -(define-infix-argument magit-autofixup:--strict () - :description "Strictness" - :class 'transient-option - :shortarg "-s" - :argument "--strict=" - :reader 'transient-read-number-N0) - -;;; Pending Diff - -(defun magit-commit-diff () - (when (and git-commit-mode magit-commit-show-diff) - (when-let ((diff-buffer (magit-get-mode-buffer 'magit-diff-mode))) - ;; This window just started displaying the commit message - ;; buffer. Without this that buffer would immediately be - ;; replaced with the diff buffer. See #2632. - (unrecord-window-buffer nil diff-buffer)) - (condition-case nil - (let ((args (car (magit-diff-arguments))) - (magit-inhibit-save-previous-winconf 'unset) - (magit-display-buffer-noselect t) - (inhibit-quit nil)) - (message "Diffing changes to be committed (C-g to abort diffing)") - (cl-case last-command - (magit-commit - (magit-diff-staged nil args)) - (magit-commit-all - (magit-diff-working-tree nil args)) - ((magit-commit-amend - magit-commit-reword - magit-rebase-reword-commit) - (magit-diff-while-amending args)) - (t (if (magit-anything-staged-p) - (magit-diff-staged nil args) - (magit-diff-while-amending args))))) - (quit)))) - -;; Mention `magit-diff-while-committing' because that's -;; always what I search for when I try to find this line. -(add-hook 'server-switch-hook 'magit-commit-diff) - -(add-to-list 'with-editor-server-window-alist - (cons git-commit-filename-regexp 'switch-to-buffer)) - -;;; Message Utilities - -(defun magit-commit-message-buffer () - (let* ((find-file-visit-truename t) ; git uses truename of COMMIT_EDITMSG - (topdir (magit-toplevel))) - (--first (equal topdir (with-current-buffer it - (and git-commit-mode (magit-toplevel)))) - (append (buffer-list (selected-frame)) - (buffer-list))))) - -(defvar magit-commit-add-log-insert-function 'magit-commit-add-log-insert - "Used by `magit-commit-add-log' to insert a single entry.") - -(defun magit-commit-add-log () - "Add a stub for the current change into the commit message buffer. -If no commit is in progress, then initiate it. Use the function -specified by variable `magit-commit-add-log-insert-function' to -actually insert the entry." - (interactive) - (pcase-let* ((hunk (and (magit-section-match 'hunk) - (magit-current-section))) - (log (magit-commit-message-buffer)) - (`(,buf ,pos) (magit-diff-visit-file--noselect))) - (unless log - (unless (magit-commit-assert nil) - (user-error "Abort")) - (magit-commit-create) - (while (not (setq log (magit-commit-message-buffer))) - (sit-for 0.01))) - (magit--with-temp-position buf pos - (funcall magit-commit-add-log-insert-function log - (magit-file-relative-name) - (and hunk (add-log-current-defun)))))) - -(defun magit-commit-add-log-insert (buffer file defun) - (with-current-buffer buffer - (undo-boundary) - (goto-char (point-max)) - (while (re-search-backward (concat "^" comment-start) nil t)) - (save-restriction - (narrow-to-region (point-min) (point)) - (cond ((re-search-backward (format "* %s\\(?: (\\([^)]+\\))\\)?: " file) - nil t) - (when (equal (match-string 1) defun) - (setq defun nil)) - (re-search-forward ": ")) - (t - (when (re-search-backward "^[\\*(].+\n" nil t) - (goto-char (match-end 0))) - (while (re-search-forward "^[^\\*\n].*\n" nil t)) - (if defun - (progn (insert (format "* %s (%s): \n" file defun)) - (setq defun nil)) - (insert (format "* %s: \n" file))) - (backward-char) - (unless (looking-at "\n[\n\\']") - (insert ?\n) - (backward-char)))) - (when defun - (forward-line) - (let ((limit (save-excursion - (and (re-search-forward "^\\*" nil t) - (point))))) - (unless (or (looking-back (format "(%s): " defun) - (line-beginning-position)) - (re-search-forward (format "^(%s): " defun) limit t)) - (while (re-search-forward "^[^\\*\n].*\n" limit t)) - (insert (format "(%s): \n" defun)) - (backward-char))))))) - -;;; _ -(provide 'magit-commit) -;;; magit-commit.el ends here diff --git a/elpa/magit-20200418.939/magit-commit.elc b/elpa/magit-20200418.939/magit-commit.elc deleted file mode 100644 index 2b75604e8358d63f62e915bf39e06ec225ca31ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22559 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 -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library requires several other libraries, so that yet other -;; libraries can just require this one, instead of having to require -;; all the other ones. In other words this separates the low-level -;; stuff from the rest. It also defines some Custom groups. - -;;; Code: - -(require 'magit-utils) -(require 'magit-section) -(require 'magit-git) -(require 'magit-mode) -(require 'magit-margin) -(require 'magit-process) -(require 'magit-transient) -(require 'magit-autorevert) - -(when (magit--libgit-available-p) - (condition-case err - (require 'magit-libgit) - (error - (setq magit-inhibit-libgit 'error) - (message "Error while loading `magit-libgit': %S" err) - (message "That is not fatal. The `libegit2' module just won't be used.")))) - -(defgroup magit nil - "Controlling Git from Emacs." - :link '(url-link "https://magit.vc") - :link '(info-link "(magit)FAQ") - :link '(info-link "(magit)") - :group 'tools) - -(defgroup magit-essentials nil - "Options that every Magit user should briefly think about. - -Each of these options falls into one or more of these categories: - -* Options that affect Magit's behavior in fundamental ways. -* Options that affect safety. -* Options that affect performance. -* Options that are of a personal nature." - :link '(info-link "(magit)Essential Settings") - :group 'magit) - -(defgroup magit-miscellaneous nil - "Miscellaneous Magit options." - :group 'magit) - -(defgroup magit-commands nil - "Options controlling behavior of certain commands." - :group 'magit) - -(defgroup magit-modes nil - "Modes used or provided by Magit." - :group 'magit) - -(defgroup magit-buffers nil - "Options concerning Magit buffers." - :link '(info-link "(magit)Modes and Buffers") - :group 'magit) - -(defgroup magit-refresh nil - "Options controlling how Magit buffers are refreshed." - :link '(info-link "(magit)Automatic Refreshing of Magit Buffers") - :group 'magit - :group 'magit-buffers) - -(defgroup magit-faces nil - "Faces used by Magit." - :group 'magit - :group 'faces) - -(defgroup magit-extensions nil - "Extensions to Magit." - :group 'magit) - -(custom-add-to-group 'magit-modes 'git-commit 'custom-group) -(custom-add-to-group 'magit-faces 'git-commit-faces 'custom-group) -(custom-add-to-group 'magit-modes 'git-rebase 'custom-group) -(custom-add-to-group 'magit-faces 'git-rebase-faces 'custom-group) -(custom-add-to-group 'magit 'magit-section 'custom-group) -(custom-add-to-group 'magit-faces 'magit-section-faces 'custom-group) -(custom-add-to-group 'magit-process 'with-editor 'custom-group) - -(defgroup magit-related nil - "Options that are relevant to Magit but that are defined elsewhere." - :link '(custom-group-link vc) - :link '(custom-group-link smerge) - :link '(custom-group-link ediff) - :link '(custom-group-link auto-revert) - :group 'magit - :group 'magit-extensions - :group 'magit-essentials) - -(custom-add-to-group 'magit-related 'auto-revert-check-vc-info 'custom-variable) -(custom-add-to-group 'magit-auto-revert 'auto-revert-check-vc-info 'custom-variable) - -(custom-add-to-group 'magit-related 'ediff-window-setup-function 'custom-variable) -(custom-add-to-group 'magit-related 'smerge-refine-ignore-whitespace 'custom-variable) -(custom-add-to-group 'magit-related 'vc-follow-symlinks 'custom-variable) - -;;; _ -(provide 'magit-core) -;;; magit-core.el ends here diff --git a/elpa/magit-20200418.939/magit-core.elc b/elpa/magit-20200418.939/magit-core.elc deleted file mode 100644 index 53d77f1d2a9b59d0684b95d0b9c0f0cbb48fba51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3032 zcmbtWTaVjB6kd2iEHCiH>uFH;g6cG}b7^-$V!NcM5*32&8$s&C9>+s%Pna1egkR5h zJd?y>!&4(o>~p`&oNs(P`}zLsv$M1F+uK{Z*VRguGHVG{)2tGyrL{Cx>6+q6KWQZ! zgev_{>>Xo3t>d+km9p8yr?s>no?2ILQ<*4QIJrI zB`Hj)q#;*8F;0A3wBVzDoWRHa&d<-U7F#EyRA-WU^JFl@il5Bm;UEx6ml$=4ahI5M ziD`!z4!XoJ5W|?}@gVvBY@Q60;Q$YgJRCh4fE|Cw?D3cQn_x{po%eh~OvdbQ5`W@3 zF|6VkE5RCJjj>pZpHu%#P)Y*5B)<6KV3n{1RuZfdSg=+cUwqclVqdHUUtaq3ARNIl z3rFm{HSG#RRwK54B;=rM$!TJZ5ax045f=chF~@<{cpt}Wk46`tAF>&Tfa85YuQeWZ z3mS7o_PLK3avmet2recFHW_~7{W6pNPIz^httQ+YFI!P|RI@H46rffaw6gWM_gl0S#{(ysc zr0dytr`fMMY#864v5Ozia9#(~9{pa4rE-y~3$?(rR11(~{V`qs?`2 z7&2^mRKc}a0wZRuLYsmymjMqTOYeOK-r(|vo<8)b_pT6*fX48Yyi+3U0*szQ2=???@9+qXUP+T{Q;9m2Cv<$Of}mw}jZn34jgi=$6P=&!T1gMm zIlj2ja(}8SWm8#}qL#Wrqu(BpzQ_D!z~2PDV3O(zS!JDV;R}6tTK26#CsParU-UbR zy$hZ)j@CZ-NOJ!%Vr#`${37h`UVYJ^-R3wTeAj$BeU3rnboo9Ee@(pdj`r0XnHy<~ z!vX77Qs~XGcfzOuQd*OCicYlp4oFbpBPyleydvj_R`@jk8$TBS73#fiA8j8xwR@r8 zCi%CMKpZ}}z1iU%hqrZ%y2C`{ODu9a3^XPL-yT(kK?!0%W(R)cgD}I$g}{6qUW3dh z5b!ea_^UCJnF8vCLt$izfyoY?Y)92Mtdwg3sN5w>iv|QwGK({rs~U!~v~p8Oe}uc) zdJtKsz?8>qTS>E&Cq+mv&reDitx+z+^)+>fC@p0AAzG)nMsj?2dW>8PqZq+Mp&fl{ zLqr=@XL=J^>6%r9>Gv0l&kSL>yhtr;pi2Z`chat~-GnGP0G1866~n0A4ZwcPjQoR! IFRsu31qD;Lx&QzG diff --git a/elpa/magit-20200418.939/magit-diff.el b/elpa/magit-20200418.939/magit-diff.el deleted file mode 100644 index 6763e760..00000000 --- a/elpa/magit-20200418.939/magit-diff.el +++ /dev/null @@ -1,3263 +0,0 @@ -;;; magit-diff.el --- inspect Git diffs -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for looking at Git diffs and -;; commits. - -;;; Code: - -(eval-when-compile - (require 'ansi-color) - (require 'subr-x)) - -(require 'git-commit) -(require 'magit-core) - -;; For `magit-diff-popup' -(declare-function magit-stash-show "magit-stash" (stash &optional args files)) -;; For `magit-diff-visit-file' -(declare-function dired-jump "dired-x" (&optional other-window file-name)) -(declare-function magit-find-file-noselect "magit-files" (rev file)) -(declare-function magit-status-setup-buffer "magit-status" (directory)) -;; For `magit-diff-while-committing' -(declare-function magit-commit-message-buffer "magit-commit" ()) -;; For `magit-insert-revision-gravatar' -(defvar gravatar-size) -;; For `magit-show-commit' and `magit-diff-show-or-scroll' -(declare-function magit-current-blame-chunk "magit-blame" ()) -(declare-function magit-blame-mode "magit-blame" (&optional arg)) -(defvar magit-blame-mode) -;; For `magit-diff-show-or-scroll' -(declare-function git-rebase-current-line "git-rebase" ()) -;; For `magit-diff-unmerged' -(declare-function magit-merge-in-progress-p "magit-merge" ()) -(declare-function magit--merge-range "magit-merge" (&optional head)) -;; For `magit-diff--dwim' -(declare-function forge--pullreq-ref "forge-pullreq" (pullreq)) -;; For `magit-diff-wash-diff' -(declare-function ansi-color-apply-on-region "ansi-color" (begin end)) - -(eval-when-compile - (cl-pushnew 'base-ref eieio--known-slot-names) - (cl-pushnew 'orig-rev eieio--known-slot-names) - (cl-pushnew 'action-type eieio--known-slot-names) - (cl-pushnew 'target eieio--known-slot-names)) - -(require 'diff-mode) -(require 'smerge-mode) - -;;; Options -;;;; Diff Mode - -(defgroup magit-diff nil - "Inspect and manipulate Git diffs." - :link '(info-link "(magit)Diffing") - :group 'magit-modes) - -(defcustom magit-diff-mode-hook nil - "Hook run after entering Magit-Diff mode." - :group 'magit-diff - :type 'hook) - -(defcustom magit-diff-sections-hook - '(magit-insert-diff - magit-insert-xref-buttons) - "Hook run to insert sections into a `magit-diff-mode' buffer." - :package-version '(magit . "2.3.0") - :group 'magit-diff - :type 'hook) - -(defcustom magit-diff-expansion-threshold 60 - "After how many seconds not to expand anymore diffs. - -Except in status buffers, diffs are usually start out fully -expanded. Because that can take a long time, all diffs that -haven't been fontified during a refresh before the threshold -defined here are instead displayed with their bodies collapsed. - -Note that this can cause sections that were previously expanded -to be collapsed. So you should not pick a very low value here. - -The hook function `magit-diff-expansion-threshold' has to be a -member of `magit-section-set-visibility-hook' for this option -to have any effect." - :package-version '(magit . "2.9.0") - :group 'magit-diff - :type 'float) - -(defcustom magit-diff-highlight-hunk-body t - "Whether to highlight bodies of selected hunk sections. -This only has an effect if `magit-diff-highlight' is a -member of `magit-section-highlight-hook', which see." - :package-version '(magit . "2.1.0") - :group 'magit-diff - :type 'boolean) - -(defcustom magit-diff-highlight-hunk-region-functions - '(magit-diff-highlight-hunk-region-dim-outside - magit-diff-highlight-hunk-region-using-overlays) - "The functions used to highlight the hunk-internal region. - -`magit-diff-highlight-hunk-region-dim-outside' overlays the outside -of the hunk internal selection with a face that causes the added and -removed lines to have the same background color as context lines. -This function should not be removed from the value of this option. - -`magit-diff-highlight-hunk-region-using-overlays' and -`magit-diff-highlight-hunk-region-using-underline' emphasize the -region by placing delimiting horizontal lines before and after it. -The underline variant was implemented because Eli said that is -how we should do it. However the overlay variant actually works -better. Also see https://github.com/magit/magit/issues/2758. - -Instead of, or in addition to, using delimiting horizontal lines, -to emphasize the boundaries, you may which to emphasize the text -itself, using `magit-diff-highlight-hunk-region-using-face'. - -In terminal frames it's not possible to draw lines as the overlay -and underline variants normally do, so there they fall back to -calling the face function instead." - :package-version '(magit . "2.9.0") - :set-after '(magit-diff-show-lines-boundaries) - :group 'magit-diff - :type 'hook - :options '(magit-diff-highlight-hunk-region-dim-outside - magit-diff-highlight-hunk-region-using-underline - magit-diff-highlight-hunk-region-using-overlays - magit-diff-highlight-hunk-region-using-face)) - -(defcustom magit-diff-unmarked-lines-keep-foreground t - "Whether `magit-diff-highlight-hunk-region-dim-outside' preserves foreground. -When this is set to nil, then that function only adjusts the -foreground color but added and removed lines outside the region -keep their distinct foreground colors." - :package-version '(magit . "2.9.0") - :group 'magit-diff - :type 'boolean) - -(defcustom magit-diff-refine-hunk nil - "Whether to show word-granularity differences within diff hunks. - -nil Never show fine differences. -t Show fine differences for the current diff hunk only. -`all' Show fine differences for all displayed diff hunks." - :group 'magit-diff - :safe (lambda (val) (memq val '(nil t all))) - :type '(choice (const :tag "Never" nil) - (const :tag "Current" t) - (const :tag "All" all))) - -(defcustom magit-diff-refine-ignore-whitespace smerge-refine-ignore-whitespace - "Whether to ignore whitespace changes in word-granularity differences." - :package-version '(magit . "3.0.0") - :set-after '(smerge-refine-ignore-whitespace) - :group 'magit-diff - :safe 'booleanp - :type 'boolean) - -(put 'magit-diff-refine-hunk 'permanent-local t) - -(defcustom magit-diff-adjust-tab-width nil - "Whether to adjust the width of tabs in diffs. - -Determining the correct width can be expensive if it requires -opening large and/or many files, so the widths are cached in -the variable `magit-diff--tab-width-cache'. Set that to nil -to invalidate the cache. - -nil Never adjust tab width. Use `tab-width's value from - the Magit buffer itself instead. - -t If the corresponding file-visiting buffer exits, then - use `tab-width's value from that buffer. Doing this is - cheap, so this value is used even if a corresponding - cache entry exists. - -`always' If there is no such buffer, then temporarily visit the - file to determine the value. - -NUMBER Like `always', but don't visit files larger than NUMBER - bytes." - :package-version '(magit . "2.12.0") - :group 'magit-diff - :type '(choice (const :tag "Never" nil) - (const :tag "If file-visiting buffer exists" t) - (integer :tag "If file isn't larger than N bytes") - (const :tag "Always" always))) - -(defcustom magit-diff-paint-whitespace t - "Specify where to highlight whitespace errors. - -nil Never highlight whitespace errors. -t Highlight whitespace errors everywhere. -`uncommitted' Only highlight whitespace errors in diffs - showing uncommitted changes. - -For backward compatibility `status' is treated as a synonym -for `uncommitted'. - -The option `magit-diff-paint-whitespace-lines' controls for -what lines (added/remove/context) errors are highlighted. - -The options `magit-diff-highlight-trailing' and -`magit-diff-highlight-indentation' control what kind of -whitespace errors are highlighted." - :group 'magit-diff - :safe (lambda (val) (memq val '(t nil uncommitted status))) - :type '(choice (const :tag "In all diffs" t) - (const :tag "Only in uncommitted changes" uncommitted) - (const :tag "Never" nil))) - -(defcustom magit-diff-paint-whitespace-lines t - "Specify in what kind of lines to highlight whitespace errors. - -t Highlight only in added lines. -`both' Highlight in added and removed lines. -`all' Highlight in added, removed and context lines." - :package-version '(magit . "3.0.0") - :group 'magit-diff - :safe (lambda (val) (memq val '(t both all))) - :type '(choice (const :tag "in added lines" t) - (const :tag "in added and removed lines" both) - (const :tag "in added, removed and context lines" all))) - -(defcustom magit-diff-highlight-trailing t - "Whether to highlight whitespace at the end of a line in diffs. -Used only when `magit-diff-paint-whitespace' is non-nil." - :group 'magit-diff - :safe 'booleanp - :type 'boolean) - -(defcustom magit-diff-highlight-indentation nil - "Highlight the \"wrong\" indentation style. -Used only when `magit-diff-paint-whitespace' is non-nil. - -The value is an alist of the form ((REGEXP . INDENT)...). The -path to the current repository is matched against each element -in reverse order. Therefore if a REGEXP matches, then earlier -elements are not tried. - -If the used INDENT is `tabs', highlight indentation with tabs. -If INDENT is an integer, highlight indentation with at least -that many spaces. Otherwise, highlight neither." - :group 'magit-diff - :type `(repeat (cons (string :tag "Directory regexp") - (choice (const :tag "Tabs" tabs) - (integer :tag "Spaces" :value ,tab-width) - (const :tag "Neither" nil))))) - -(defcustom magit-diff-hide-trailing-cr-characters - (and (memq system-type '(ms-dos windows-nt)) t) - "Whether to hide ^M characters at the end of a line in diffs." - :package-version '(magit . "2.6.0") - :group 'magit-diff - :type 'boolean) - -(defcustom magit-diff-highlight-keywords t - "Whether to highlight bracketed keywords in commit messages." - :package-version '(magit . "2.12.0") - :group 'magit-diff - :type 'boolean) - -;;;; File Diff - -(defcustom magit-diff-buffer-file-locked t - "Whether `magit-diff-buffer-file' uses a dedicated buffer." - :package-version '(magit . "2.7.0") - :group 'magit-commands - :group 'magit-diff - :type 'boolean) - -;;;; Revision Mode - -(defgroup magit-revision nil - "Inspect and manipulate Git commits." - :link '(info-link "(magit)Revision Buffer") - :group 'magit-modes) - -(defcustom magit-revision-mode-hook '(bug-reference-mode) - "Hook run after entering Magit-Revision mode." - :group 'magit-revision - :type 'hook - :options '(bug-reference-mode)) - -(defcustom magit-revision-sections-hook - '(magit-insert-revision-tag - magit-insert-revision-headers - magit-insert-revision-message - magit-insert-revision-notes - magit-insert-revision-diff - magit-insert-xref-buttons) - "Hook run to insert sections into a `magit-revision-mode' buffer." - :package-version '(magit . "2.3.0") - :group 'magit-revision - :type 'hook) - -(defcustom magit-revision-headers-format "\ -Author: %aN <%aE> -AuthorDate: %ad -Commit: %cN <%cE> -CommitDate: %cd -" - "Format string used to insert headers in revision buffers. - -All headers in revision buffers are inserted by the section -inserter `magit-insert-revision-headers'. Some of the headers -are created by calling `git show --format=FORMAT' where FORMAT -is the format specified here. Other headers are hard coded or -subject to option `magit-revision-insert-related-refs'." - :package-version '(magit . "2.3.0") - :group 'magit-revision - :type 'string) - -(defcustom magit-revision-insert-related-refs t - "Whether to show related branches in revision buffers - -`nil' Don't show any related branches. -`t' Show related local branches. -`all' Show related local and remote branches. -`mixed' Show all containing branches and local merged branches." - :package-version '(magit . "2.1.0") - :group 'magit-revision - :type '(choice (const :tag "don't" nil) - (const :tag "local only" t) - (const :tag "all related" all) - (const :tag "all containing, local merged" mixed))) - -(defcustom magit-revision-use-hash-sections 'quicker - "Whether to turn hashes inside the commit message into sections. - -If non-nil, then hashes inside the commit message are turned into -`commit' sections. There is a trade off to be made between -performance and reliability: - -- `slow' calls git for every word to be absolutely sure. -- `quick' skips words less than seven characters long. -- `quicker' additionally skips words that don't contain a number. -- `quickest' uses all words that are at least seven characters - long and which contain at least one number as well as at least - one letter. - -If nil, then no hashes are turned into sections, but you can -still visit the commit at point using \"RET\"." - :package-version '(magit . "2.12.0") - :group 'magit-revision - :type '(choice (const :tag "Use sections, quickest" quickest) - (const :tag "Use sections, quicker" quicker) - (const :tag "Use sections, quick" quick) - (const :tag "Use sections, slow" slow) - (const :tag "Don't use sections" nil))) - -(defcustom magit-revision-show-gravatars nil - "Whether to show gravatar images in revision buffers. - -If nil, then don't insert any gravatar images. If t, then insert -both images. If `author' or `committer', then insert only the -respective image. - -If you have customized the option `magit-revision-header-format' -and want to insert the images then you might also have to specify -where to do so. In that case the value has to be a cons-cell of -two regular expressions. The car specifies where to insert the -author's image. The top half of the image is inserted right -after the matched text, the bottom half on the next line in the -same column. The cdr specifies where to insert the committer's -image, accordingly. Either the car or the cdr may be nil." - :package-version '(magit . "2.3.0") - :group 'magit-revision - :type '(choice (const :tag "Don't show gravatars" nil) - (const :tag "Show gravatars" t) - (const :tag "Show author gravatar" author) - (const :tag "Show committer gravatar" committer) - (cons :tag "Show gravatars using custom pattern." - (regexp :tag "Author regexp" "^Author: ") - (regexp :tag "Committer regexp" "^Commit: ")))) - -(defcustom magit-revision-use-gravatar-kludge nil - "Whether to work around a bug which affects display of gravatars. - -Gravatar images are spliced into two halves which are then -displayed on separate lines. On OS X the splicing has a bug in -some Emacs builds, which causes the top and bottom halves to be -interchanged. Enabling this option works around this issue by -interchanging the halves once more, which cancels out the effect -of the bug. - -See https://github.com/magit/magit/issues/2265 -and https://debbugs.gnu.org/cgi/bugreport.cgi?bug=7847. - -Starting with Emacs 26.1 this kludge should not be required for -any build." - :package-version '(magit . "2.3.0") - :group 'magit-revision - :type 'boolean) - -(defcustom magit-revision-fill-summary-line nil - "Whether to fill excessively long summary lines. - -If this is an integer, then the summary line is filled if it is -longer than either the limit specified here or `window-width'. - -You may want to only set this locally in \".dir-locals-2.el\" for -repositories known to contain bad commit messages. - -The body of the message is left alone because (a) most people who -write excessively long summary lines usually don't add a body and -(b) even people who have the decency to wrap their lines may have -a good reason to include a long line in the body sometimes." - :package-version '(magit . "2.90.0") - :group 'magit-revision - :type '(choice (const :tag "Don't fill" nil) - (integer :tag "Fill if longer than"))) - -(defcustom magit-revision-filter-files-on-follow nil - "Whether to honor file filter if log arguments include --follow. - -When a commit is displayed from a log buffer, the resulting -revision buffer usually shares the log's file arguments, -restricting the diff to those files. However, there's a -complication when the log arguments include --follow: if the log -follows a file across a rename event, keeping the file -restriction would mean showing an empty diff in revision buffers -for commits before the rename event. - -When this option is nil, the revision buffer ignores the log's -filter if the log arguments include --follow. If non-nil, the -log's file filter is always honored." - :package-version '(magit . "3.0.0") - :group 'magit-revision - :type 'boolean) - -;;;; Visit Commands - -(defcustom magit-diff-visit-previous-blob t - "Whether `magit-diff-visit-file' may visit the previous blob. - -When this is t and point is on a removed line in a diff for a -committed change, then `magit-diff-visit-file' visits the blob -from the last revision which still had that line. - -Currently this is only supported for committed changes, for -staged and unstaged changes `magit-diff-visit-file' always -visits the file in the working tree." - :package-version '(magit . "2.9.0") - :group 'magit-diff - :type 'boolean) - -(defcustom magit-diff-visit-avoid-head-blob nil - "Whether `magit-diff-visit-file' avoids visiting a blob from `HEAD'. - -By default `magit-diff-visit-file' always visits the blob that -added the current line, while `magit-diff-visit-worktree-file' -visits the respective file in the working tree. For the `HEAD' -commit, the former command used to visit the worktree file too, -but that made it impossible to visit a blob from `HEAD'. - -When point is on a removed line and that change has not been -committed yet, then `magit-diff-visit-file' now visits the last -blob that still had that line, which is a blob from `HEAD'. -Previously this function used to visit the worktree file not -only for added lines but also for such removed lines. - -If you prefer the old behaviors, then set this to t." - :package-version '(magit . "3.0.0") - :group 'magit-diff - :type 'boolean) - -;;; Faces - -(defface magit-diff-file-heading - `((t ,@(and (>= emacs-major-version 27) '(:extend t)) - :weight bold)) - "Face for diff file headings." - :group 'magit-faces) - -(defface magit-diff-file-heading-highlight - `((t ,@(and (>= emacs-major-version 27) '(:extend t)) - :inherit magit-section-highlight)) - "Face for current diff file headings." - :group 'magit-faces) - -(defface magit-diff-file-heading-selection - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :inherit magit-diff-file-heading-highlight - :foreground "salmon4") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :inherit magit-diff-file-heading-highlight - :foreground "LightSalmon3")) - "Face for selected diff file headings." - :group 'magit-faces) - -(defface magit-diff-hunk-heading - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey80" - :foreground "grey30") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey25" - :foreground "grey70")) - "Face for diff hunk headings." - :group 'magit-faces) - -(defface magit-diff-hunk-heading-highlight - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey75" - :foreground "grey30") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey35" - :foreground "grey70")) - "Face for current diff hunk headings." - :group 'magit-faces) - -(defface magit-diff-hunk-heading-selection - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :inherit magit-diff-hunk-heading-highlight - :foreground "salmon4") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :inherit magit-diff-hunk-heading-highlight - :foreground "LightSalmon3")) - "Face for selected diff hunk headings." - :group 'magit-faces) - -(defface magit-diff-hunk-region - `((t :inherit bold - ,@(and (>= emacs-major-version 27) - (list :extend (ignore-errors (face-attribute 'region :extend)))))) - "Face used by `magit-diff-highlight-hunk-region-using-face'. - -This face is overlaid over text that uses other hunk faces, -and those normally set the foreground and background colors. -The `:foreground' and especially the `:background' properties -should be avoided here. Setting the latter would cause the -loss of information. Good properties to set here are `:weight' -and `:slant'." - :group 'magit-faces) - -(defface magit-diff-revision-summary - '((t :inherit magit-diff-hunk-heading)) - "Face for commit message summaries." - :group 'magit-faces) - -(defface magit-diff-revision-summary-highlight - '((t :inherit magit-diff-hunk-heading-highlight)) - "Face for highlighted commit message summaries." - :group 'magit-faces) - -(defface magit-diff-lines-heading - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :inherit magit-diff-hunk-heading-highlight - :background "LightSalmon3") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :inherit magit-diff-hunk-heading-highlight - :foreground "grey80" - :background "salmon4")) - "Face for diff hunk heading when lines are marked." - :group 'magit-faces) - -(defface magit-diff-lines-boundary - `((t ,@(and (>= emacs-major-version 27) '(:extend t)) ; !important - :inherit magit-diff-lines-heading)) - "Face for boundary of marked lines in diff hunk." - :group 'magit-faces) - -(defface magit-diff-conflict-heading - '((t :inherit magit-diff-hunk-heading)) - "Face for conflict markers." - :group 'magit-faces) - -(defface magit-diff-added - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#ddffdd" - :foreground "#22aa22") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#335533" - :foreground "#ddffdd")) - "Face for lines in a diff that have been added." - :group 'magit-faces) - -(defface magit-diff-removed - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#ffdddd" - :foreground "#aa2222") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#553333" - :foreground "#ffdddd")) - "Face for lines in a diff that have been removed." - :group 'magit-faces) - -(defface magit-diff-our - '((t :inherit magit-diff-removed)) - "Face for lines in a diff for our side in a conflict." - :group 'magit-faces) - -(defface magit-diff-base - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#ffffcc" - :foreground "#aaaa11") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#555522" - :foreground "#ffffcc")) - "Face for lines in a diff for the base side in a conflict." - :group 'magit-faces) - -(defface magit-diff-their - '((t :inherit magit-diff-added)) - "Face for lines in a diff for their side in a conflict." - :group 'magit-faces) - -(defface magit-diff-context - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :foreground "grey50") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :foreground "grey70")) - "Face for lines in a diff that are unchanged." - :group 'magit-faces) - -(defface magit-diff-added-highlight - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#cceecc" - :foreground "#22aa22") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#336633" - :foreground "#cceecc")) - "Face for lines in a diff that have been added." - :group 'magit-faces) - -(defface magit-diff-removed-highlight - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#eecccc" - :foreground "#aa2222") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#663333" - :foreground "#eecccc")) - "Face for lines in a diff that have been removed." - :group 'magit-faces) - -(defface magit-diff-our-highlight - '((t :inherit magit-diff-removed-highlight)) - "Face for lines in a diff for our side in a conflict." - :group 'magit-faces) - -(defface magit-diff-base-highlight - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#eeeebb" - :foreground "#aaaa11") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "#666622" - :foreground "#eeeebb")) - "Face for lines in a diff for the base side in a conflict." - :group 'magit-faces) - -(defface magit-diff-their-highlight - '((t :inherit magit-diff-added-highlight)) - "Face for lines in a diff for their side in a conflict." - :group 'magit-faces) - -(defface magit-diff-context-highlight - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey95" - :foreground "grey50") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey20" - :foreground "grey70")) - "Face for lines in the current context in a diff." - :group 'magit-faces) - -(defface magit-diff-whitespace-warning - '((t :inherit trailing-whitespace)) - "Face for highlighting whitespace errors added lines." - :group 'magit-faces) - -(defface magit-diffstat-added - '((((class color) (background light)) :foreground "#22aa22") - (((class color) (background dark)) :foreground "#448844")) - "Face for plus sign in diffstat." - :group 'magit-faces) - -(defface magit-diffstat-removed - '((((class color) (background light)) :foreground "#aa2222") - (((class color) (background dark)) :foreground "#aa4444")) - "Face for minus sign in diffstat." - :group 'magit-faces) - -;;; Arguments -;;;; Prefix Classes - -(defclass magit-diff-prefix (transient-prefix) - ((history-key :initform 'magit-diff) - (major-mode :initform 'magit-diff-mode))) - -(defclass magit-diff-refresh-prefix (magit-diff-prefix) - ((history-key :initform 'magit-diff) - (major-mode :initform nil))) - -;;;; Prefix Methods - -(cl-defmethod transient-init-value ((obj magit-diff-prefix)) - (pcase-let ((`(,args ,files) - (magit-diff--get-value 'magit-diff-mode - magit-prefix-use-buffer-arguments))) - (unless (eq current-transient-command 'magit-dispatch) - (when-let ((file (magit-file-relative-name))) - (setq files (list file)))) - (oset obj value (if files `(("--" ,@files) ,args) args)))) - -(cl-defmethod transient-init-value ((obj magit-diff-refresh-prefix)) - (oset obj value (if magit-buffer-diff-files - `(("--" ,@magit-buffer-diff-files) - ,magit-buffer-diff-args) - magit-buffer-diff-args))) - -(cl-defmethod transient-set-value ((obj magit-diff-prefix)) - (magit-diff--set-value obj)) - -(cl-defmethod transient-save-value ((obj magit-diff-prefix)) - (magit-diff--set-value obj 'save)) - -;;;; Argument Access - -(defun magit-diff-arguments (&optional mode) - "Return the current diff arguments." - (if (memq current-transient-command '(magit-diff magit-diff-refresh)) - (pcase-let ((`(,args ,alist) - (-separate #'atom (transient-get-value)))) - (list args (cdr (assoc "--" alist)))) - (magit-diff--get-value (or mode 'magit-diff-mode)))) - -(defun magit-diff--get-value (mode &optional use-buffer-args) - (unless use-buffer-args - (setq use-buffer-args magit-direct-use-buffer-arguments)) - (let (args files) - (cond - ((and (memq use-buffer-args '(always selected current)) - (eq major-mode mode)) - (setq args magit-buffer-diff-args) - (setq files magit-buffer-diff-files)) - ((and (memq use-buffer-args '(always selected)) - (when-let ((buffer (magit-get-mode-buffer - mode nil - (eq use-buffer-args 'selected)))) - (setq args (buffer-local-value 'magit-buffer-diff-args buffer)) - (setq files (buffer-local-value 'magit-buffer-diff-files buffer)) - t))) - ((plist-member (symbol-plist mode) 'magit-diff-current-arguments) - (setq args (get mode 'magit-diff-current-arguments))) - ((when-let ((elt (assq (intern (format "magit-diff:%s" mode)) - transient-values))) - (setq args (cdr elt)) - t)) - (t - (setq args (get mode 'magit-diff-default-arguments)))) - (list args files))) - -(defun magit-diff--set-value (obj &optional save) - (pcase-let* ((obj (oref obj prototype)) - (mode (or (oref obj major-mode) major-mode)) - (key (intern (format "magit-diff:%s" mode))) - (`(,args ,alist) - (-separate #'atom (transient-get-value))) - (files (cdr (assoc "--" alist)))) - (put mode 'magit-diff-current-arguments args) - (when save - (setf (alist-get key transient-values) args) - (transient-save-values)) - (transient--history-push obj) - (setq magit-buffer-diff-args args) - (setq magit-buffer-diff-files files) - (magit-refresh))) - -;;; Section Classes - -(defclass magit-file-section (magit-section) - ((source :initform nil) - (header :initform nil))) - -(defclass magit-module-section (magit-file-section) - ()) - -(defclass magit-hunk-section (magit-section) - ((refined :initform nil) - (combined :initform nil) - (from-range :initform nil) - (from-ranges :initform nil) - (to-range :initform nil) - (about :initform nil))) - -(setf (alist-get 'hunk magit--section-type-alist) 'magit-hunk-section) -(setf (alist-get 'module magit--section-type-alist) 'magit-module-section) -(setf (alist-get 'file magit--section-type-alist) 'magit-file-section) - -;;; Commands -;;;; Prefix Commands - -;;;###autoload (autoload 'magit-diff "magit-diff" nil t) -(define-transient-command magit-diff () - "Show changes between different versions." - :man-page "git-diff" - :class 'magit-diff-prefix - ["Limit arguments" - (magit:--) - (magit-diff:--ignore-submodules) - ("-b" "Ignore whitespace changes" ("-b" "--ignore-space-change")) - ("-w" "Ignore all whitespace" ("-w" "--ignore-all-space")) - (5 "-D" "Omit preimage for deletes" ("-D" "--irreversible-delete"))] - ["Context arguments" - (magit-diff:-U) - ("-W" "Show surrounding functions" ("-W" "--function-context"))] - ["Tune arguments" - (magit-diff:--diff-algorithm) - (magit-diff:-M) - (magit-diff:-C) - ("-x" "Disallow external diff drivers" "--no-ext-diff") - ("-s" "Show stats" "--stat") - ("=g" "Show signature" "--show-signature") - (5 magit-diff:--color-moved) - (5 magit-diff:--color-moved-ws)] - ["Actions" - [("d" "Dwim" magit-diff-dwim) - ("r" "Diff range" magit-diff-range) - ("p" "Diff paths" magit-diff-paths)] - [("u" "Diff unstaged" magit-diff-unstaged) - ("s" "Diff staged" magit-diff-staged) - ("w" "Diff worktree" magit-diff-working-tree)] - [("c" "Show commit" magit-show-commit) - ("t" "Show stash" magit-stash-show)]]) - -;;;###autoload (autoload 'magit-diff-refresh "magit-diff" nil t) -(define-transient-command magit-diff-refresh () - "Change the arguments used for the diff(s) in the current buffer." - :man-page "git-diff" - :class 'magit-diff-refresh-prefix - ["Limit arguments" - (magit:--) - (magit-diff:--ignore-submodules) - ("-b" "Ignore whitespace changes" ("-b" "--ignore-space-change")) - ("-w" "Ignore all whitespace" ("-w" "--ignore-all-space")) - (5 "-D" "Omit preimage for deletes" ("-D" "--irreversible-delete"))] - ["Context arguments" - (magit-diff:-U) - ("-W" "Show surrounding functions" ("-W" "--function-context"))] - ["Tune arguments" - (magit-diff:--diff-algorithm) - (magit-diff:-M) - (magit-diff:-C) - ("-x" "Disallow external diff drivers" "--no-ext-diff") - ("-s" "Show stats" "--stat" - :if-derived magit-diff-mode) - ("=g" "Show signature" "--show-signature" - :if-derived magit-diff-mode) - (5 magit-diff:--color-moved) - (5 magit-diff:--color-moved-ws)] - [["Refresh" - ("g" "buffer" magit-diff-refresh) - ("s" "buffer and set defaults" transient-set :transient nil) - ("w" "buffer and save defaults" transient-save :transient nil)] - ["Toggle" - ("t" "hunk refinement" magit-diff-toggle-refine-hunk) - ("F" "file filter" magit-diff-toggle-file-filter) - ("b" "buffer lock" magit-toggle-buffer-lock - :if-mode (magit-diff-mode magit-revision-mode magit-stash-mode))] - [:if-mode magit-diff-mode - :description "Do" - ("r" "switch range type" magit-diff-switch-range-type) - ("f" "flip revisions" magit-diff-flip-revs)]] - (interactive) - (if (not (eq current-transient-command 'magit-diff-refresh)) - (transient-setup 'magit-diff-refresh) - (pcase-let ((`(,args ,files) (magit-diff-arguments))) - (setq magit-buffer-diff-args args) - (setq magit-buffer-diff-files files)) - (magit-refresh))) - -;;;; Infix Commands - -(define-infix-argument magit:-- () - :description "Limit to files" - :class 'transient-files - :key "--" - :argument "--" - :prompt "Limit to file(s): " - :reader 'magit-read-files - :multi-value t) - -(defun magit-read-files (prompt initial-input history) - (magit-completing-read-multiple* prompt - (magit-list-files) - nil nil initial-input history)) - -(define-infix-argument magit-diff:-U () - :description "Context lines" - :class 'transient-option - :argument "-U" - :reader 'transient-read-number-N+) - -(define-infix-argument magit-diff:-M () - :description "Detect renames" - :class 'transient-option - :argument "-M" - :reader 'transient-read-number-N+) - -(define-infix-argument magit-diff:-C () - :description "Detect copies" - :class 'transient-option - :argument "-C" - :reader 'transient-read-number-N+) - -(define-infix-argument magit-diff:--diff-algorithm () - :description "Diff algorithm" - :class 'transient-option - :key "-A" - :argument "--diff-algorithm=" - :reader 'magit-diff-select-algorithm) - -(defun magit-diff-select-algorithm (&rest _ignore) - (magit-read-char-case nil t - (?d "[d]efault" "default") - (?m "[m]inimal" "minimal") - (?p "[p]atience" "patience") - (?h "[h]istogram" "histogram"))) - -(define-infix-argument magit-diff:--ignore-submodules () - :description "Ignore submodules" - :class 'transient-option - :key "-i" - :argument "--ignore-submodules=" - :reader 'magit-diff-select-ignore-submodules) - -(defun magit-diff-select-ignore-submodules (&rest _ignored) - (magit-read-char-case "Ignore submodules " t - (?u "[u]ntracked" "untracked") - (?d "[d]irty" "dirty") - (?a "[a]ll" "all"))) - -(define-infix-argument magit-diff:--color-moved () - :description "Color moved lines" - :class 'transient-option - :key "-m" - :argument "--color-moved=" - :reader 'magit-diff-select-color-moved-mode) - -(defun magit-diff-select-color-moved-mode (&rest _ignore) - (magit-read-char-case "Color moved " t - (?d "[d]efault" "default") - (?p "[p]lain" "plain") - (?b "[b]locks" "blocks") - (?z "[z]ebra" "zebra") - (?Z "[Z] dimmed-zebra" "dimmed-zebra"))) - -(define-infix-argument magit-diff:--color-moved-ws () - :description "Whitespace treatment for --color-moved" - :class 'transient-option - :key "=w" - :argument "--color-moved-ws=" - :reader 'magit-diff-select-color-moved-ws-mode) - -(defun magit-diff-select-color-moved-ws-mode (&rest _ignore) - (magit-read-char-case "Ignore whitespace " t - (?i "[i]ndentation" "allow-indentation-change") - (?e "[e]nd of line" "ignore-space-at-eol") - (?s "[s]pace change" "ignore-space-change") - (?a "[a]ll space" "ignore-all-space") - (?n "[n]o" "no"))) - -;;;; Setup Commands - -;;;###autoload -(defun magit-diff-dwim (&optional args files) - "Show changes for the thing at point." - (interactive (magit-diff-arguments)) - (pcase (magit-diff--dwim) - (`unmerged (magit-diff-unmerged args files)) - (`unstaged (magit-diff-unstaged args files)) - (`staged - (let ((file (magit-file-at-point))) - (if (and file (equal (cddr (car (magit-file-status file))) '(?D ?U))) - ;; File was deleted by us and modified by them. Show the latter. - (magit-diff-unmerged args (list file)) - (magit-diff-staged nil args files)))) - (`(commit . ,value) - (magit-diff-range (format "%s^..%s" value value) args files)) - (`(stash . ,value) (magit-stash-show value args)) - ((and range (pred stringp)) - (magit-diff-range range args files)) - (_ - (call-interactively #'magit-diff-range)))) - -(defun magit-diff--dwim () - "Return information for performing DWIM diff. - -The information can be in three forms: -1. TYPE - A symbol describing a type of diff where no additional information - is needed to generate the diff. Currently, this includes `staged', - `unstaged' and `unmerged'. -2. (TYPE . VALUE) - Like #1 but the diff requires additional information, which is - given by VALUE. Currently, this includes `commit' and `stash', - where VALUE is the given commit or stash, respectively. -3. RANGE - A string indicating a diff range. - -If no DWIM context is found, nil is returned." - (cond - ((--when-let (magit-region-values '(commit branch) t) - (deactivate-mark) - (concat (car (last it)) ".." (car it)))) - (magit-buffer-refname - (cons 'commit magit-buffer-refname)) - ((derived-mode-p 'magit-stash-mode) - (cons 'commit - (magit-section-case - (commit (oref it value)) - (file (-> it - (oref parent) - (oref value))) - (hunk (-> it - (oref parent) - (oref parent) - (oref value)))))) - ((derived-mode-p 'magit-revision-mode) - (cons 'commit magit-buffer-revision)) - ((derived-mode-p 'magit-diff-mode) - magit-buffer-range) - (t - (magit-section-case - ([* unstaged] 'unstaged) - ([* staged] 'staged) - (unmerged 'unmerged) - (unpushed (oref it value)) - (unpulled (oref it value)) - (branch (let ((current (magit-get-current-branch)) - (atpoint (oref it value))) - (if (equal atpoint current) - (--if-let (magit-get-upstream-branch) - (format "%s...%s" it current) - (if (magit-anything-modified-p) - current - (cons 'commit current))) - (format "%s...%s" - (or current "HEAD") - atpoint)))) - (commit (cons 'commit (oref it value))) - (stash (cons 'stash (oref it value))) - (pullreq (let ((pullreq (oref it value))) - (format "%s...%s" - (oref pullreq base-ref) - (forge--pullreq-ref pullreq)))))))) - -(defun magit-diff-read-range-or-commit (prompt &optional secondary-default mbase) - "Read range or revision with special diff range treatment. -If MBASE is non-nil, prompt for which rev to place at the end of -a \"revA...revB\" range. Otherwise, always construct -\"revA..revB\" range." - (--if-let (magit-region-values '(commit branch) t) - (let ((revA (car (last it))) - (revB (car it))) - (deactivate-mark) - (if mbase - (let ((base (magit-git-string "merge-base" revA revB))) - (cond - ((string= (magit-rev-parse revA) base) - (format "%s..%s" revA revB)) - ((string= (magit-rev-parse revB) base) - (format "%s..%s" revB revA)) - (t - (let ((main (magit-completing-read "View changes along" - (list revA revB) - nil t nil nil revB))) - (format "%s...%s" - (if (string= main revB) revA revB) main))))) - (format "%s..%s" revA revB))) - (magit-read-range prompt - (or (pcase (magit-diff--dwim) - (`(commit . ,value) - (format "%s^..%s" value value)) - ((and range (pred stringp)) - range)) - secondary-default - (magit-get-current-branch))))) - -;;;###autoload -(defun magit-diff-range (rev-or-range &optional args files) - "Show differences between two commits. - -REV-OR-RANGE should be a range or a single revision. If it is a -revision, then show changes in the working tree relative to that -revision. If it is a range, but one side is omitted, then show -changes relative to `HEAD'. - -If the region is active, use the revisions on the first and last -line of the region as the two sides of the range. With a prefix -argument, instead of diffing the revisions, choose a revision to -view changes along, starting at the common ancestor of both -revisions (i.e., use a \"...\" range)." - (interactive (cons (magit-diff-read-range-or-commit "Diff for range" - nil current-prefix-arg) - (magit-diff-arguments))) - (magit-diff-setup-buffer rev-or-range nil args files)) - -;;;###autoload -(defun magit-diff-working-tree (&optional rev args files) - "Show changes between the current working tree and the `HEAD' commit. -With a prefix argument show changes between the working tree and -a commit read from the minibuffer." - (interactive - (cons (and current-prefix-arg - (magit-read-branch-or-commit "Diff working tree and commit")) - (magit-diff-arguments))) - (magit-diff-setup-buffer (or rev "HEAD") nil args files)) - -;;;###autoload -(defun magit-diff-staged (&optional rev args files) - "Show changes between the index and the `HEAD' commit. -With a prefix argument show changes between the index and -a commit read from the minibuffer." - (interactive - (cons (and current-prefix-arg - (magit-read-branch-or-commit "Diff index and commit")) - (magit-diff-arguments))) - (magit-diff-setup-buffer rev "--cached" args files)) - -;;;###autoload -(defun magit-diff-unstaged (&optional args files) - "Show changes between the working tree and the index." - (interactive (magit-diff-arguments)) - (magit-diff-setup-buffer nil nil args files)) - -;;;###autoload -(defun magit-diff-unmerged (&optional args files) - "Show changes that are being merged." - (interactive (magit-diff-arguments)) - (unless (magit-merge-in-progress-p) - (user-error "No merge is in progress")) - (magit-diff-setup-buffer (magit--merge-range) nil args files)) - -;;;###autoload -(defun magit-diff-while-committing (&optional args) - "While committing, show the changes that are about to be committed. -While amending, invoking the command again toggles between -showing just the new changes or all the changes that will -be committed." - (interactive (list (car (magit-diff-arguments)))) - (unless (magit-commit-message-buffer) - (user-error "No commit in progress")) - (let ((magit-display-buffer-noselect t)) - (if-let ((diff-buf (magit-get-mode-buffer 'magit-diff-mode 'selected))) - (with-current-buffer diff-buf - (cond ((and (equal magit-buffer-range "HEAD^") - (equal magit-buffer-typearg "--cached")) - (magit-diff-staged nil args)) - ((and (equal magit-buffer-range nil) - (equal magit-buffer-typearg "--cached")) - (magit-diff-while-amending args)) - ((magit-anything-staged-p) - (magit-diff-staged nil args)) - (t - (magit-diff-while-amending args)))) - (if (magit-anything-staged-p) - (magit-diff-staged nil args) - (magit-diff-while-amending args))))) - -(define-key git-commit-mode-map - (kbd "C-c C-d") 'magit-diff-while-committing) - -(defun magit-diff-while-amending (&optional args) - (magit-diff-setup-buffer "HEAD^" "--cached" args nil)) - -;;;###autoload -(defun magit-diff-buffer-file () - "Show diff for the blob or file visited in the current buffer. - -When the buffer visits a blob, then show the respective commit. -When the buffer visits a file, then show the differenced between -`HEAD' and the working tree. In both cases limit the diff to -the file or blob." - (interactive) - (require 'magit) - (if-let ((file (magit-file-relative-name))) - (if magit-buffer-refname - (magit-show-commit magit-buffer-refname - (car (magit-show-commit--arguments)) - (list file)) - (save-buffer) - (let ((line (line-number-at-pos)) - (col (current-column))) - (with-current-buffer - (magit-diff-setup-buffer (or (magit-get-current-branch) "HEAD") - nil - (car (magit-diff-arguments)) - (list file) - magit-diff-buffer-file-locked) - (magit-diff--goto-position file line col)))) - (user-error "Buffer isn't visiting a file"))) - -;;;###autoload -(defun magit-diff-paths (a b) - "Show changes between any two files on disk." - (interactive (list (read-file-name "First file: " nil nil t) - (read-file-name "Second file: " nil nil t))) - (magit-diff-setup-buffer nil "--no-index" - nil (list (magit-convert-filename-for-git - (expand-file-name a)) - (magit-convert-filename-for-git - (expand-file-name b))))) - -(defun magit-show-commit--arguments () - (pcase-let ((`(,args ,diff-files) - (magit-diff-arguments 'magit-revision-mode))) - (list args (if (derived-mode-p 'magit-log-mode) - (and (or magit-revision-filter-files-on-follow - (not (member "--follow" magit-buffer-log-args))) - magit-buffer-log-files) - diff-files)))) - -;;;###autoload -(defun magit-show-commit (rev &optional args files module) - "Visit the revision at point in another buffer. -If there is no revision at point or with a prefix argument prompt -for a revision." - (interactive - (pcase-let* ((mcommit (magit-section-value-if 'module-commit)) - (atpoint (or (and (bound-and-true-p magit-blame-mode) - (oref (magit-current-blame-chunk) orig-rev)) - mcommit - (magit-branch-or-commit-at-point))) - (`(,args ,files) (magit-show-commit--arguments))) - (list (or (and (not current-prefix-arg) atpoint) - (magit-read-branch-or-commit "Show commit" atpoint)) - args - files - (and mcommit - (magit-section-parent-value (magit-current-section)))))) - (require 'magit) - (let ((file (magit-file-relative-name))) - (magit-with-toplevel - (when module - (setq default-directory - (expand-file-name (file-name-as-directory module)))) - (unless (magit-commit-p rev) - (user-error "%s is not a commit" rev)) - (let ((buf (magit-revision-setup-buffer rev args files))) - (when file - (save-buffer) - (let ((line (magit-diff-visit--offset file (list "-R" rev) - (line-number-at-pos))) - (col (current-column))) - (with-current-buffer buf - (magit-diff--goto-position file line col)))))))) - -(defun magit-diff--locate-hunk (file line &optional parent) - (when-let ((diff (cl-find-if (lambda (section) - (and (cl-typep section 'magit-file-section) - (equal (oref section value) file))) - (oref (or parent magit-root-section) children)))) - (let (hunk (hunks (oref diff children))) - (cl-block nil - (while (setq hunk (pop hunks)) - (pcase-let* ((`(,beg ,len) (oref hunk to-range)) - (end (+ beg len))) - (cond ((> beg line) (cl-return (list diff nil))) - ((<= beg line end) (cl-return (list hunk t))) - ((null hunks) (cl-return (list hunk nil)))))))))) - -(defun magit-diff--goto-position (file line column &optional parent) - (when-let ((pos (magit-diff--locate-hunk file line parent))) - (pcase-let ((`(,section ,exact) pos)) - (cond ((cl-typep section 'magit-file-section) - (goto-char (oref section start))) - (exact - (goto-char (oref section content)) - (let ((pos (car (oref section to-range)))) - (while (or (< pos line) - (= (char-after) ?-)) - (unless (= (char-after) ?-) - (cl-incf pos)) - (forward-line))) - (forward-char (1+ column))) - (t - (goto-char (oref section start)) - (setq section (oref section parent)))) - (while section - (when (oref section hidden) - (magit-section-show section)) - (setq section (oref section parent)))) - (magit-section-update-highlight) - t)) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-revision-mode)) - (cons magit-buffer-range magit-buffer-diff-files)) - -;;;; Setting Commands - -(defun magit-diff-switch-range-type () - "Convert diff range type. -Change \"revA..revB\" to \"revA...revB\", or vice versa." - (interactive) - (if (and magit-buffer-range - (derived-mode-p 'magit-diff-mode) - (string-match magit-range-re magit-buffer-range)) - (setq magit-buffer-range - (replace-match (if (string= (match-string 2 magit-buffer-range) "..") - "..." - "..") - t t magit-buffer-range 2)) - (user-error "No range to change")) - (magit-refresh)) - -(defun magit-diff-flip-revs () - "Swap revisions in diff range. -Change \"revA..revB\" to \"revB..revA\"." - (interactive) - (if (and magit-buffer-range - (derived-mode-p 'magit-diff-mode) - (string-match magit-range-re magit-buffer-range)) - (progn - (setq magit-buffer-range - (concat (match-string 3 magit-buffer-range) - (match-string 2 magit-buffer-range) - (match-string 1 magit-buffer-range))) - (magit-refresh)) - (user-error "No range to swap"))) - -(defun magit-diff-toggle-file-filter () - "Toggle the file restriction of the current buffer's diffs. -If the current buffer's mode is derived from `magit-log-mode', -toggle the file restriction in the repository's revision buffer -instead." - (interactive) - (cl-flet ((toggle () - (if (or magit-buffer-diff-files - magit-buffer-diff-files-suspended) - (cl-rotatef magit-buffer-diff-files - magit-buffer-diff-files-suspended) - (setq magit-buffer-diff-files - (magit-read-files "Limit to file(s): " - (magit-file-at-point) - nil))) - (magit-refresh))) - (cond - ((derived-mode-p 'magit-log-mode - 'magit-cherry-mode - 'magit-reflog-mode) - (if-let ((buffer (magit-get-mode-buffer 'magit-revision-mode))) - (with-current-buffer buffer (toggle)) - (message "No revision buffer"))) - ((local-variable-p 'magit-buffer-diff-files) - (toggle)) - (t - (user-error "Cannot toggle file filter in this buffer"))))) - -(defun magit-diff-less-context (&optional count) - "Decrease the context for diff hunks by COUNT lines." - (interactive "p") - (magit-diff-set-context `(lambda (cur) (max 0 (- (or cur 0) ,count))))) - -(defun magit-diff-more-context (&optional count) - "Increase the context for diff hunks by COUNT lines." - (interactive "p") - (magit-diff-set-context `(lambda (cur) (+ (or cur 0) ,count)))) - -(defun magit-diff-default-context () - "Reset context for diff hunks to the default height." - (interactive) - (magit-diff-set-context #'ignore)) - -(defun magit-diff-set-context (fn) - (let* ((def (--if-let (magit-get "diff.context") (string-to-number it) 3)) - (val magit-buffer-diff-args) - (arg (--first (string-match "^-U\\([0-9]+\\)?$" it) val)) - (num (--if-let (and arg (match-string 1 arg)) (string-to-number it) def)) - (val (delete arg val)) - (num (funcall fn num)) - (arg (and num (not (= num def)) (format "-U%i" num))) - (val (if arg (cons arg val) val))) - (setq magit-buffer-diff-args val)) - (magit-refresh)) - -(defun magit-diff-context-p () - (if-let ((arg (--first (string-match "^-U\\([0-9]+\\)$" it) - magit-buffer-diff-args))) - (not (equal arg "-U0")) - t)) - -(defun magit-diff-ignore-any-space-p () - (--any-p (member it magit-buffer-diff-args) - '("--ignore-cr-at-eol" - "--ignore-space-at-eol" - "--ignore-space-change" "-b" - "--ignore-all-space" "-w" - "--ignore-blank-space"))) - -(defun magit-diff-toggle-refine-hunk (&optional style) - "Turn diff-hunk refining on or off. - -If hunk refining is currently on, then hunk refining is turned off. -If hunk refining is off, then hunk refining is turned on, in -`selected' mode (only the currently selected hunk is refined). - -With a prefix argument, the \"third choice\" is used instead: -If hunk refining is currently on, then refining is kept on, but -the refining mode (`selected' or `all') is switched. -If hunk refining is off, then hunk refining is turned on, in -`all' mode (all hunks refined). - -Customize variable `magit-diff-refine-hunk' to change the default mode." - (interactive "P") - (setq-local magit-diff-refine-hunk - (if style - (if (eq magit-diff-refine-hunk 'all) t 'all) - (not magit-diff-refine-hunk))) - (magit-diff-update-hunk-refinement)) - -;;;; Visit Commands -;;;;; Dwim Variants - -(defun magit-diff-visit-file (file &optional other-window) - "From a diff visit the appropriate version of FILE. - -Display the buffer in the selected window. With a prefix -argument OTHER-WINDOW display the buffer in another window -instead. - -Visit the worktree version of the appropriate file. The location -of point inside the diff determines which file is being visited. -The visited version depends on what changes the diff is about. - -1. If the diff shows uncommitted changes (i.e. stage or unstaged - changes), then visit the file in the working tree (i.e. the - same \"real\" file that `find-file' would visit. In all other - cases visit a \"blob\" (i.e. the version of a file as stored - in some commit). - -2. If point is on a removed line, then visit the blob for the - first parent of the commit that removed that line, i.e. the - last commit where that line still exists. - -3. If point is on an added or context line, then visit the blob - that adds that line, or if the diff shows from more than a - single commit, then visit the blob from the last of these - commits. - -In the file-visiting buffer also go to the line that corresponds -to the line that point is on in the diff. - -Note that this command only works if point is inside a diff. In -other cases `magit-find-file' (which see) had to be used." - (interactive (list (magit-file-at-point t t) current-prefix-arg)) - (magit-diff-visit-file--internal file nil - (if other-window - #'switch-to-buffer-other-window - #'pop-to-buffer-same-window))) - -(defun magit-diff-visit-file-other-window (file) - "From a diff visit the appropriate version of FILE in another window. -Like `magit-diff-visit-file' but use -`switch-to-buffer-other-window'." - (interactive (list (magit-file-at-point t t))) - (magit-diff-visit-file--internal file nil #'switch-to-buffer-other-window)) - -(defun magit-diff-visit-file-other-frame (file) - "From a diff visit the appropriate version of FILE in another frame. -Like `magit-diff-visit-file' but use -`switch-to-buffer-other-frame'." - (interactive (list (magit-file-at-point t t))) - (magit-diff-visit-file--internal file nil #'switch-to-buffer-other-frame)) - -;;;;; Worktree Variants - -(defun magit-diff-visit-worktree-file (file &optional other-window) - "From a diff visit the worktree version of FILE. - -Display the buffer in the selected window. With a prefix -argument OTHER-WINDOW display the buffer in another window -instead. - -Visit the worktree version of the appropriate file. The location -of point inside the diff determines which file is being visited. - -Unlike `magit-diff-visit-file' always visits the \"real\" file in -the working tree, i.e the \"current version\" of the file. - -In the file-visiting buffer also go to the line that corresponds -to the line that point is on in the diff. Lines that were added -or removed in the working tree, the index and other commits in -between are automatically accounted for." - (interactive (list (magit-file-at-point t t) current-prefix-arg)) - (magit-diff-visit-file--internal file t - (if other-window - #'switch-to-buffer-other-window - #'pop-to-buffer-same-window))) - -(defun magit-diff-visit-worktree-file-other-window (file) - "From a diff visit the worktree version of FILE in another window. -Like `magit-diff-visit-worktree-file' but use -`switch-to-buffer-other-window'." - (interactive (list (magit-file-at-point t t))) - (magit-diff-visit-file--internal file t #'switch-to-buffer-other-window)) - -(defun magit-diff-visit-worktree-file-other-frame (file) - "From a diff visit the worktree version of FILE in another frame. -Like `magit-diff-visit-worktree-file' but use -`switch-to-buffer-other-frame'." - (interactive (list (magit-file-at-point t t))) - (magit-diff-visit-file--internal file t #'switch-to-buffer-other-frame)) - -;;;;; Internal - -(defun magit-diff-visit-file--internal (file force-worktree fn) - "From a diff visit the appropriate version of FILE. -If FORCE-WORKTREE is non-nil, then visit the worktree version of -the file, even if the diff is about a committed change. USE FN -to display the buffer in some window." - (if (magit-file-accessible-directory-p file) - (magit-diff-visit-directory file force-worktree) - (pcase-let ((`(,buf ,pos) - (magit-diff-visit-file--noselect file force-worktree))) - (funcall fn buf) - (magit-diff-visit-file--setup buf pos) - buf))) - -(defun magit-diff-visit-directory (directory &optional other-window) - "Visit DIRECTORY in some window. -Display the buffer in the selected window unless OTHER-WINDOW is -non-nil. If DIRECTORY is the top-level directory of the current -repository, then visit the containing directory using Dired and -in the Dired buffer put point on DIRECTORY. Otherwise display -the Magit-Status buffer for DIRECTORY." - (if (equal (magit-toplevel directory) - (magit-toplevel)) - (dired-jump other-window (concat directory "/.")) - (let ((display-buffer-overriding-action - (if other-window - '(nil (inhibit-same-window t)) - '(display-buffer-same-window)))) - (magit-status-setup-buffer directory)))) - -(defun magit-diff-visit-file--setup (buf pos) - (if-let ((win (get-buffer-window buf 'visible))) - (with-selected-window win - (when pos - (unless (<= (point-min) pos (point-max)) - (widen)) - (goto-char pos)) - (when (and buffer-file-name - (magit-anything-unmerged-p buffer-file-name)) - (smerge-start-session)) - (run-hooks 'magit-diff-visit-file-hook)) - (error "File buffer is not visible"))) - -(defun magit-diff-visit-file--noselect (&optional file goto-worktree) - (unless file - (setq file (magit-file-at-point t t))) - (let* ((hunk (magit-diff-visit--hunk)) - (goto-from (and hunk - (magit-diff-visit--goto-from-p hunk goto-worktree))) - (line (and hunk (magit-diff-hunk-line hunk goto-from))) - (col (and hunk (magit-diff-hunk-column hunk goto-from))) - (spec (magit-diff--dwim)) - (rev (if goto-from - (magit-diff-visit--range-from spec) - (magit-diff-visit--range-to spec))) - (buf (if (or goto-worktree - (and (not (stringp rev)) - (or magit-diff-visit-avoid-head-blob - (not goto-from)))) - (or (get-file-buffer file) - (find-file-noselect file)) - (magit-find-file-noselect (if (stringp rev) rev "HEAD") - file)))) - (if line - (with-current-buffer buf - (cond ((eq rev 'staged) - (setq line (magit-diff-visit--offset file nil line))) - ((and goto-worktree - (stringp rev)) - (setq line (magit-diff-visit--offset file rev line)))) - (list buf (save-restriction - (widen) - (goto-char (point-min)) - (forward-line (1- line)) - (move-to-column col) - (point)))) - (list buf nil)))) - -(defun magit-diff-visit--hunk () - (when-let ((scope (magit-diff-scope))) - (let ((section (magit-current-section))) - (cl-case scope - ((file files) - (setq section (car (oref section children)))) - (list - (setq section (car (oref section children))) - (when section - (setq section (car (oref section children)))))) - (and - ;; Unmerged files appear in the list of staged changes - ;; but unlike in the list of unstaged changes no diffs - ;; are shown here. In that case `section' is nil. - section - ;; Currently the `hunk' type is also abused for file - ;; mode changes, which we are not interested in here. - ;; Such sections have no value. - (oref section value) - section)))) - -(defun magit-diff-visit--goto-from-p (section in-worktree) - (and magit-diff-visit-previous-blob - (not in-worktree) - (not (oref section combined)) - (not (< (point) (oref section content))) - (= (char-after (line-beginning-position)) ?-))) - -(defun magit-diff-hunk-line (section goto-from) - (save-excursion - (goto-char (line-beginning-position)) - (with-slots (content combined from-ranges from-range to-range) section - (when (< (point) content) - (goto-char content) - (re-search-forward "^[-+]")) - (+ (car (if goto-from from-range to-range)) - (let ((prefix (if combined (length from-ranges) 1)) - (target (point)) - (offset 0)) - (goto-char content) - (while (< (point) target) - (unless (string-match-p - (if goto-from "\\+" "-") - (buffer-substring (point) (+ (point) prefix))) - (cl-incf offset)) - (forward-line)) - offset))))) - -(defun magit-diff-hunk-column (section goto-from) - (if (or (< (point) - (oref section content)) - (and (not goto-from) - (= (char-after (line-beginning-position)) ?-))) - 0 - (max 0 (- (+ (current-column) 2) - (length (oref section value)))))) - -(defun magit-diff-visit--range-from (spec) - (cond ((consp spec) - (concat (cdr spec) "^")) - ((stringp spec) - (car (magit-split-range spec))) - (t - spec))) - -(defun magit-diff-visit--range-to (spec) - (if (symbolp spec) - spec - (let ((rev (if (consp spec) - (cdr spec) - (cdr (magit-split-range spec))))) - (if (and magit-diff-visit-avoid-head-blob - (magit-rev-head-p spec)) - 'unstaged - rev)))) - -(defun magit-diff-visit--offset (file rev line) - (let ((offset 0)) - (with-temp-buffer - (save-excursion - (magit-with-toplevel - (magit-git-insert "diff" rev "--" file))) - (catch 'found - (while (re-search-forward - "^@@ -\\([0-9]+\\),\\([0-9]+\\) \\+\\([0-9]+\\),\\([0-9]+\\) @@.*\n" - nil t) - (let ((from-beg (string-to-number (match-string 1))) - (from-len (string-to-number (match-string 2))) - ( to-len (string-to-number (match-string 4)))) - (if (<= from-beg line) - (if (< (+ from-beg from-len) line) - (cl-incf offset (- to-len from-len)) - (let ((rest (- line from-beg))) - (while (> rest 0) - (pcase (char-after) - (?\s (cl-decf rest)) - (?- (cl-decf offset) (cl-decf rest)) - (?+ (cl-incf offset))) - (forward-line)))) - (throw 'found nil)))))) - (+ line offset))) - -;;;; Scroll Commands - -(defun magit-diff-show-or-scroll-up () - "Update the commit or diff buffer for the thing at point. - -Either show the commit or stash at point in the appropriate -buffer, or if that buffer is already being displayed in the -current frame and contains information about that commit or -stash, then instead scroll the buffer up. If there is no -commit or stash at point, then prompt for a commit." - (interactive) - (magit-diff-show-or-scroll 'scroll-up)) - -(defun magit-diff-show-or-scroll-down () - "Update the commit or diff buffer for the thing at point. - -Either show the commit or stash at point in the appropriate -buffer, or if that buffer is already being displayed in the -current frame and contains information about that commit or -stash, then instead scroll the buffer down. If there is no -commit or stash at point, then prompt for a commit." - (interactive) - (magit-diff-show-or-scroll 'scroll-down)) - -(defun magit-diff-show-or-scroll (fn) - (let (rev cmd buf win) - (cond - (magit-blame-mode - (setq rev (oref (magit-current-blame-chunk) orig-rev)) - (setq cmd 'magit-show-commit) - (setq buf (magit-get-mode-buffer 'magit-revision-mode))) - ((derived-mode-p 'git-rebase-mode) - (with-slots (action-type target) - (git-rebase-current-line) - (if (not (eq action-type 'commit)) - (user-error "No commit on this line") - (setq rev target) - (setq cmd 'magit-show-commit) - (setq buf (magit-get-mode-buffer 'magit-revision-mode))))) - (t - (magit-section-case - (branch - (setq rev (magit-ref-maybe-qualify (oref it value))) - (setq cmd 'magit-show-commit) - (setq buf (magit-get-mode-buffer 'magit-revision-mode))) - (commit - (setq rev (oref it value)) - (setq cmd 'magit-show-commit) - (setq buf (magit-get-mode-buffer 'magit-revision-mode))) - (stash - (setq rev (oref it value)) - (setq cmd 'magit-stash-show) - (setq buf (magit-get-mode-buffer 'magit-stash-mode)))))) - (if rev - (if (and buf - (setq win (get-buffer-window buf)) - (with-current-buffer buf - (and (equal rev magit-buffer-revision) - (equal (magit-rev-parse rev) - magit-buffer-revision-hash)))) - (with-selected-window win - (condition-case nil - (funcall fn) - (error - (goto-char (pcase fn - (`scroll-up (point-min)) - (`scroll-down (point-max))))))) - (let ((magit-display-buffer-noselect t)) - (if (eq cmd 'magit-show-commit) - (apply #'magit-show-commit rev (magit-show-commit--arguments)) - (funcall cmd rev)))) - (call-interactively #'magit-show-commit)))) - -;;;; Section Commands - -(defun magit-section-cycle-diffs () - "Cycle visibility of diff-related sections in the current buffer." - (interactive) - (when-let ((sections - (cond ((derived-mode-p 'magit-status-mode) - (--mapcat - (when it - (when (oref it hidden) - (magit-section-show it)) - (oref it children)) - (list (magit-get-section '((staged) (status))) - (magit-get-section '((unstaged) (status)))))) - ((derived-mode-p 'magit-diff-mode) - (-filter #'magit-file-section-p - (oref magit-root-section children)))))) - (if (--any-p (oref it hidden) sections) - (dolist (s sections) - (magit-section-show s) - (magit-section-hide-children s)) - (let ((children (--mapcat (oref it children) sections))) - (cond ((and (--any-p (oref it hidden) children) - (--any-p (oref it children) children)) - (mapc 'magit-section-show-headings sections)) - ((-any-p 'magit-section-hidden-body children) - (mapc 'magit-section-show-children sections)) - (t - (mapc 'magit-section-hide sections))))))) - -;;; Diff Mode - -(defvar magit-diff-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-mode-map) - (define-key map (kbd "C-c C-d") 'magit-diff-while-committing) - (define-key map (kbd "C-c C-b") 'magit-go-backward) - (define-key map (kbd "C-c C-f") 'magit-go-forward) - (define-key map (kbd "SPC") 'scroll-up) - (define-key map (kbd "DEL") 'scroll-down) - (define-key map (kbd "j") 'magit-jump-to-diffstat-or-diff) - (define-key map [remap write-file] 'magit-patch-save) - map) - "Keymap for `magit-diff-mode'.") - -(define-derived-mode magit-diff-mode magit-mode "Magit Diff" - "Mode for looking at a Git diff. - -This mode is documented in info node `(magit)Diff Buffer'. - -\\\ -Type \\[magit-refresh] to refresh the current buffer. -Type \\[magit-section-toggle] to expand or hide the section at point. -Type \\[magit-visit-thing] to visit the hunk or file at point. - -Staging and applying changes is documented in info node -`(magit)Staging and Unstaging' and info node `(magit)Applying'. - -\\Type \ -\\[magit-apply] to apply the change at point, \ -\\[magit-stage] to stage, -\\[magit-unstage] to unstage, \ -\\[magit-discard] to discard, or \ -\\[magit-reverse] to reverse it. - -\\{magit-diff-mode-map}" - :group 'magit-diff - (hack-dir-local-variables-non-file-buffer) - (setq imenu-prev-index-position-function - 'magit-imenu--diff-prev-index-position-function) - (setq imenu-extract-index-name-function - 'magit-imenu--diff-extract-index-name-function)) - -(put 'magit-diff-mode 'magit-diff-default-arguments - '("--stat" "--no-ext-diff")) - -(defun magit-diff-setup-buffer (range typearg args files &optional locked) - (require 'magit) - (magit-setup-buffer #'magit-diff-mode locked - (magit-buffer-range range) - (magit-buffer-typearg typearg) - (magit-buffer-diff-args args) - (magit-buffer-diff-files files))) - -(defun magit-diff-refresh-buffer () - "Refresh the current `magit-diff-mode' buffer." - (magit-set-header-line-format - (if (equal magit-buffer-typearg "--no-index") - (apply #'format "Differences between %s and %s" magit-buffer-diff-files) - (concat (if magit-buffer-range - (if (string-match-p "\\(\\.\\.\\|\\^-\\)" - magit-buffer-range) - (format "Changes in %s" magit-buffer-range) - (format "Changes from %s to working tree" magit-buffer-range)) - (if (equal magit-buffer-typearg "--cached") - "Staged changes" - "Unstaged changes")) - (pcase (length magit-buffer-diff-files) - (0) - (1 (concat " in file " (car magit-buffer-diff-files))) - (_ (concat " in files " - (mapconcat #'identity magit-buffer-diff-files ", "))))))) - (setq magit-buffer-range-hashed - (and magit-buffer-range (magit-hash-range magit-buffer-range))) - (magit-insert-section (diffbuf) - (magit-run-section-hook 'magit-diff-sections-hook))) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-diff-mode)) - (nconc (cond (magit-buffer-range - (delq nil (list magit-buffer-range magit-buffer-typearg))) - ((equal magit-buffer-typearg "--cached") - (list 'staged)) - (t - (list 'unstaged magit-buffer-typearg))) - (and magit-buffer-diff-files (cons "--" magit-buffer-diff-files)))) - -(defvar magit-file-section-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-j") 'magit-diff-visit-worktree-file) - (define-key map [C-return] 'magit-diff-visit-worktree-file) - (define-key map [remap magit-visit-thing] 'magit-diff-visit-file) - (define-key map [remap magit-delete-thing] 'magit-discard) - (define-key map [remap magit-revert-no-commit] 'magit-reverse) - (define-key map "a" 'magit-apply) - (define-key map "C" 'magit-commit-add-log) - (define-key map "s" 'magit-stage) - (define-key map "u" 'magit-unstage) - (define-key map "&" 'magit-do-async-shell-command) - (define-key map "\C-c\C-t" 'magit-diff-trace-definition) - (define-key map "\C-c\C-e" 'magit-diff-edit-hunk-commit) - map) - "Keymap for `file' sections.") - -(defvar magit-hunk-section-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-j") 'magit-diff-visit-worktree-file) - (define-key map [C-return] 'magit-diff-visit-worktree-file) - (define-key map [remap magit-visit-thing] 'magit-diff-visit-file) - (define-key map [remap magit-delete-thing] 'magit-discard) - (define-key map [remap magit-revert-no-commit] 'magit-reverse) - (define-key map "a" 'magit-apply) - (define-key map "C" 'magit-commit-add-log) - (define-key map "s" 'magit-stage) - (define-key map "u" 'magit-unstage) - (define-key map "&" 'magit-do-async-shell-command) - (define-key map "\C-c\C-t" 'magit-diff-trace-definition) - (define-key map "\C-c\C-e" 'magit-diff-edit-hunk-commit) - map) - "Keymap for `hunk' sections.") - -(defconst magit-diff-headline-re - (concat "^\\(@@@?\\|diff\\|Submodule\\|" - "\\* Unmerged path\\|merged\\|changed in both\\|" - "added in remote\\|removed in remote\\)")) - -(defconst magit-diff-statline-re - (concat "^ ?" - "\\(.*\\)" ; file - "\\( +| +\\)" ; separator - "\\([0-9]+\\|Bin\\(?: +[0-9]+ -> [0-9]+ bytes\\)?$\\) ?" - "\\(\\+*\\)" ; add - "\\(-*\\)$")) ; del - -(defvar magit-diff--reset-non-color-moved - (list - "-c" "color.diff.context=normal" - "-c" "color.diff.plain=normal" ; historical synonym for context - "-c" "color.diff.meta=normal" - "-c" "color.diff.frag=normal" - "-c" "color.diff.func=normal" - "-c" "color.diff.old=normal" - "-c" "color.diff.new=normal" - "-c" "color.diff.commit=normal" - "-c" "color.diff.whitespace=normal" - ;; "git-range-diff" does not support "--color-moved", so we don't - ;; need to reset contextDimmed, oldDimmed, newDimmed, contextBold, - ;; oldBold, and newBold. - )) - -(defun magit-insert-diff () - "Insert the diff into this `magit-diff-mode' buffer." - (magit--insert-diff - "diff" magit-buffer-range "-p" "--no-prefix" - (and (member "--stat" magit-buffer-diff-args) "--numstat") - magit-buffer-typearg - magit-buffer-diff-args "--" - magit-buffer-diff-files)) - -(defun magit--insert-diff (&rest args) - (declare (indent 0)) - (let ((magit-git-global-arguments - (remove "--literal-pathspecs" magit-git-global-arguments))) - (setq args (-flatten args)) - ;; As of Git 2.19.0, we need to generate diffs with - ;; --ita-visible-in-index so that `magit-stage' can work with - ;; intent-to-add files (see #4026). Cache the result for each - ;; repo to avoid a `git version' call for every diff insertion. - (when (pcase (magit-repository-local-get 'diff-ita-kludge-p 'unset) - (`unset - (let ((val (version<= "2.19.0" (magit-git-version)))) - (magit-repository-local-set 'diff-ita-kludge-p val) - val)) - (val val)) - (push "--ita-visible-in-index" (cdr args))) - (when (cl-member-if (lambda (arg) (string-prefix-p "--color-moved" arg)) args) - (push "--color=always" (cdr args)) - (setq magit-git-global-arguments - (append magit-diff--reset-non-color-moved - magit-git-global-arguments))) - (magit-git-wash #'magit-diff-wash-diffs args))) - -(defun magit-diff-wash-diffs (args &optional limit) - (when (member "--show-signature" args) - (magit-diff-wash-signature)) - (when (member "--stat" args) - (magit-diff-wash-diffstat)) - (when (re-search-forward magit-diff-headline-re limit t) - (goto-char (line-beginning-position)) - (magit-wash-sequence (apply-partially 'magit-diff-wash-diff args)) - (insert ?\n))) - -(defun magit-jump-to-diffstat-or-diff () - "Jump to the diffstat or diff. -When point is on a file inside the diffstat section, then jump -to the respective diff section, otherwise jump to the diffstat -section or a child thereof." - (interactive) - (--if-let (magit-get-section - (append (magit-section-case - ([file diffstat] `((file . ,(oref it value)))) - (file `((file . ,(oref it value)) (diffstat))) - (t '((diffstat)))) - (magit-section-ident magit-root-section))) - (magit-section-goto it) - (user-error "No diffstat in this buffer"))) - -(defun magit-diff-wash-signature () - (when (looking-at "^gpg: ") - (magit-insert-section (signature) - (while (looking-at "^gpg: ") - (forward-line)) - (insert "\n")))) - -(defun magit-diff-wash-diffstat () - (let (heading (beg (point))) - (when (re-search-forward "^ ?\\([0-9]+ +files? change[^\n]*\n\\)" nil t) - (setq heading (match-string 1)) - (magit-delete-match) - (goto-char beg) - (magit-insert-section (diffstat) - (insert (propertize heading 'font-lock-face 'magit-diff-file-heading)) - (magit-insert-heading) - (let (files) - (while (looking-at "^[-0-9]+\t[-0-9]+\t\\(.+\\)$") - (push (magit-decode-git-path - (let ((f (match-string 1))) - (cond - ((string-match "\\`\\([^{]+\\){\\(.+\\) => \\(.+\\)}\\'" f) - (concat (match-string 1 f) - (match-string 3 f))) - ((string-match " => " f) - (substring f (match-end 0))) - (t f)))) - files) - (magit-delete-line)) - (setq files (nreverse files)) - (while (looking-at magit-diff-statline-re) - (magit-bind-match-strings (file sep cnt add del) nil - (magit-delete-line) - (when (string-match " +$" file) - (setq sep (concat (match-string 0 file) sep)) - (setq file (substring file 0 (match-beginning 0)))) - (let ((le (length file)) ld) - (setq file (magit-decode-git-path file)) - (setq ld (length file)) - (when (> le ld) - (setq sep (concat (make-string (- le ld) ?\s) sep)))) - (magit-insert-section (file (pop files)) - (insert (propertize file 'font-lock-face 'magit-filename) - sep cnt " ") - (when add - (insert (propertize add 'font-lock-face - 'magit-diffstat-added))) - (when del - (insert (propertize del 'font-lock-face - 'magit-diffstat-removed))) - (insert "\n"))))) - (if (looking-at "^$") (forward-line) (insert "\n")))))) - -(defun magit-diff-wash-diff (args) - (when (cl-member-if (lambda (arg) (string-prefix-p "--color-moved" arg)) args) - (require 'ansi-color) - (ansi-color-apply-on-region (point-min) (point-max))) - (cond - ((looking-at "^Submodule") - (magit-diff-wash-submodule)) - ((looking-at "^\\* Unmerged path \\(.*\\)") - (let ((file (magit-decode-git-path (match-string 1)))) - (magit-delete-line) - (unless (and (derived-mode-p 'magit-status-mode) - (not (member "--cached" args))) - (magit-insert-section (file file) - (insert (propertize - (format "unmerged %s%s" file - (pcase (cddr (car (magit-file-status file))) - (`(?D ?D) " (both deleted)") - (`(?D ?U) " (deleted by us)") - (`(?U ?D) " (deleted by them)") - (`(?A ?A) " (both added)") - (`(?A ?U) " (added by us)") - (`(?U ?A) " (added by them)") - (`(?U ?U) ""))) - 'font-lock-face 'magit-diff-file-heading)) - (insert ?\n)))) - t) - ((looking-at (concat "^\\(merged\\|changed in both\\|" - "added in remote\\|removed in remote\\)")) - (let ((status (pcase (match-string 1) - ("merged" "merged") - ("changed in both" "conflict") - ("added in remote" "new file") - ("removed in remote" "deleted"))) - file orig base modes) - (magit-delete-line) - (while (looking-at - "^ \\([^ ]+\\) +[0-9]\\{6\\} \\([a-z0-9]\\{40\\}\\) \\(.+\\)$") - (magit-bind-match-strings (side _blob name) nil - (pcase side - ("result" (setq file name)) - ("our" (setq orig name)) - ("their" (setq file name)) - ("base" (setq base name)))) - (magit-delete-line)) - (when orig (setq orig (magit-decode-git-path orig))) - (when file (setq file (magit-decode-git-path file))) - (magit-diff-insert-file-section (or file base) orig status modes nil))) - ((looking-at - "^diff --\\(?:\\(git\\) \\(?:\\(.+?\\) \\2\\)?\\|\\(cc\\|combined\\) \\(.+\\)\\)") - (let ((status (cond ((equal (match-string 1) "git") "modified") - ((derived-mode-p 'magit-revision-mode) "resolved") - (t "unmerged"))) - (file (or (match-string 2) (match-string 4))) - (beg (point)) - orig header modes) - (save-excursion - (forward-line 1) - (setq header (buffer-substring - beg (if (re-search-forward magit-diff-headline-re nil t) - (match-beginning 0) - (point-max))))) - (magit-delete-line) - (while (not (or (eobp) (looking-at magit-diff-headline-re))) - (if (looking-at "^old mode \\([^\n]+\\)\nnew mode \\([^\n]+\\)\n") - (progn (setq modes (match-string 0)) - (magit-delete-match)) - (cond - ((looking-at "^--- \\([^/].*?\\)\t?$") ; i.e. not /dev/null - (setq orig (match-string 1))) - ((looking-at "^\\+\\+\\+ \\([^/].*?\\)\t?$") - (setq file (match-string 1))) - ((looking-at "^\\(copy\\|rename\\) from \\(.+\\)$") - (setq orig (match-string 2))) - ((looking-at "^\\(copy\\|rename\\) to \\(.+\\)$") - (setq file (match-string 2)) - (setq status (if (equal (match-string 1) "copy") "new file" "renamed"))) - ((looking-at "^\\(new file\\|deleted\\)") - (setq status (match-string 1)))) - (magit-delete-line))) - (when orig - (setq orig (magit-decode-git-path orig))) - (setq file (magit-decode-git-path file)) - ;; KLUDGE `git-log' ignores `--no-prefix' when `-L' is used. - (when (and (derived-mode-p 'magit-log-mode) - (--first (string-match-p "\\`-L" it) magit-buffer-log-args)) - (setq file (substring file 2)) - (when orig - (setq orig (substring orig 2)))) - (magit-diff-insert-file-section file orig status modes header))))) - -(defun magit-diff-insert-file-section (file orig status modes header) - (magit-insert-section section - (file file (or (equal status "deleted") - (derived-mode-p 'magit-status-mode))) - (insert (propertize (format "%-10s %s\n" status - (if (or (not orig) (equal orig file)) - file - (format "%s -> %s" orig file))) - 'font-lock-face 'magit-diff-file-heading)) - (magit-insert-heading) - (unless (equal orig file) - (oset section source orig)) - (oset section header header) - (when modes - (magit-insert-section (hunk) - (insert modes) - (magit-insert-heading))) - (magit-wash-sequence #'magit-diff-wash-hunk))) - -(defun magit-diff-wash-submodule () - ;; See `show_submodule_summary' in submodule.c and "this" commit. - (when (looking-at "^Submodule \\([^ ]+\\)") - (let ((module (match-string 1)) - untracked modified) - (when (looking-at "^Submodule [^ ]+ contains untracked content$") - (magit-delete-line) - (setq untracked t)) - (when (looking-at "^Submodule [^ ]+ contains modified content$") - (magit-delete-line) - (setq modified t)) - (cond - ((and (looking-at "^Submodule \\([^ ]+\\) \\([^ :]+\\)\\( (rewind)\\)?:$") - (equal (match-string 1) module)) - (magit-bind-match-strings (_module range rewind) nil - (magit-delete-line) - (while (looking-at "^ \\([<>]\\) \\(.+\\)$") - (magit-delete-line)) - (when rewind - (setq range (replace-regexp-in-string "[^.]\\(\\.\\.\\)[^.]" - "..." range t t 1))) - (magit-insert-section (magit-module-section module t) - (magit-insert-heading - (propertize (concat "modified " module) - 'font-lock-face 'magit-diff-file-heading) - " (" - (cond (rewind "rewind") - ((string-match-p "\\.\\.\\." range) "non-ff") - (t "new commits")) - (and (or modified untracked) - (concat ", " - (and modified "modified") - (and modified untracked " and ") - (and untracked "untracked") - " content")) - ")") - (let ((default-directory - (file-name-as-directory - (expand-file-name module (magit-toplevel))))) - (magit-git-wash (apply-partially 'magit-log-wash-log 'module) - "log" "--oneline" "--left-right" range) - (delete-char -1))))) - ((and (looking-at "^Submodule \\([^ ]+\\) \\([^ ]+\\) (\\([^)]+\\))$") - (equal (match-string 1) module)) - (magit-bind-match-strings (_module _range msg) nil - (magit-delete-line) - (magit-insert-section (magit-module-section module) - (magit-insert-heading - (propertize (concat "submodule " module) - 'font-lock-face 'magit-diff-file-heading) - " (" msg ")")))) - (t - (magit-insert-section (magit-module-section module) - (magit-insert-heading - (propertize (concat "modified " module) - 'font-lock-face 'magit-diff-file-heading) - " (" - (and modified "modified") - (and modified untracked " and ") - (and untracked "untracked") - " content)"))))))) - -(defun magit-diff-wash-hunk () - (when (looking-at "^@\\{2,\\} \\(.+?\\) @\\{2,\\}\\(?: \\(.*\\)\\)?") - (let* ((heading (match-string 0)) - (ranges (mapcar (lambda (str) - (mapcar (lambda (n) (string-to-number n)) - (split-string (substring str 1) ","))) - (split-string (match-string 1)))) - (about (match-string 2)) - (combined (= (length ranges) 3)) - (value (cons about ranges))) - (magit-delete-line) - (magit-insert-section section (hunk value) - (insert (propertize (concat heading "\n") - 'font-lock-face 'magit-diff-hunk-heading)) - (magit-insert-heading) - (while (not (or (eobp) (looking-at "^[^-+\s\\]"))) - (forward-line)) - (oset section end (point)) - (oset section washer 'magit-diff-paint-hunk) - (oset section combined combined) - (if combined - (oset section from-ranges (butlast ranges)) - (oset section from-range (car ranges))) - (oset section to-range (car (last ranges))) - (oset section about about))) - t)) - -(defun magit-diff-expansion-threshold (section) - "Keep new diff sections collapsed if washing takes too long." - (and (magit-file-section-p section) - (> (float-time (time-subtract (current-time) magit-refresh-start-time)) - magit-diff-expansion-threshold) - 'hide)) - -(add-hook 'magit-section-set-visibility-hook #'magit-diff-expansion-threshold) - -;;; Revision Mode - -(define-derived-mode magit-revision-mode magit-diff-mode "Magit Rev" - "Mode for looking at a Git commit. - -This mode is documented in info node `(magit)Revision Buffer'. - -\\\ -Type \\[magit-refresh] to refresh the current buffer. -Type \\[magit-section-toggle] to expand or hide the section at point. -Type \\[magit-visit-thing] to visit the hunk or file at point. - -Staging and applying changes is documented in info node -`(magit)Staging and Unstaging' and info node `(magit)Applying'. - -\\Type \ -\\[magit-apply] to apply the change at point, \ -\\[magit-stage] to stage, -\\[magit-unstage] to unstage, \ -\\[magit-discard] to discard, or \ -\\[magit-reverse] to reverse it. - -\\{magit-revision-mode-map}" - :group 'magit-revision - (hack-dir-local-variables-non-file-buffer)) - -(put 'magit-revision-mode 'magit-diff-default-arguments - '("--stat" "--no-ext-diff")) - -(defun magit-revision-setup-buffer (rev args files) - (magit-setup-buffer #'magit-revision-mode nil - (magit-buffer-revision rev) - (magit-buffer-range (format "%s^..%s" rev rev)) - (magit-buffer-diff-args args) - (magit-buffer-diff-files files))) - -(defun magit-revision-refresh-buffer () - (magit-set-header-line-format - (concat (capitalize (magit-object-type magit-buffer-revision)) - " " magit-buffer-revision - (pcase (length magit-buffer-diff-files) - (0) - (1 (concat " limited to file " (car magit-buffer-diff-files))) - (_ (concat " limited to files " - (mapconcat #'identity magit-buffer-diff-files ", ")))))) - (setq magit-buffer-revision-hash (magit-rev-parse magit-buffer-revision)) - (magit-insert-section (commitbuf) - (magit-run-section-hook 'magit-revision-sections-hook))) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-revision-mode)) - (cons magit-buffer-revision magit-buffer-diff-files)) - -(defun magit-insert-revision-diff () - "Insert the diff into this `magit-revision-mode' buffer." - (magit--insert-diff - "show" "-p" "--cc" "--format=" "--no-prefix" - (and (member "--stat" magit-buffer-diff-args) "--numstat") - magit-buffer-diff-args - (concat magit-buffer-revision "^{commit}") - "--" magit-buffer-diff-files)) - -(defun magit-insert-revision-tag () - "Insert tag message and headers into a revision buffer. -This function only inserts anything when `magit-show-commit' is -called with a tag as argument, when that is called with a commit -or a ref which is not a branch, then it inserts nothing." - (when (equal (magit-object-type magit-buffer-revision) "tag") - (magit-insert-section (taginfo) - (let ((beg (point))) - ;; "git verify-tag -v" would output what we need, but the gpg - ;; output is send to stderr and we have no control over the - ;; order in which stdout and stderr are inserted, which would - ;; make parsing hard. We are forced to use "git cat-file tag" - ;; instead, which inserts the signature instead of verifying - ;; it. We remove that later and then insert the verification - ;; output using "git verify-tag" (without the "-v"). - (magit-git-insert "cat-file" "tag" magit-buffer-revision) - (goto-char beg) - (forward-line 3) - (delete-region beg (point))) - (looking-at "^tagger \\([^<]+\\) <\\([^>]+\\)") - (let ((heading (format "Tagger: %s <%s>" - (match-string 1) - (match-string 2)))) - (magit-delete-line) - (insert (propertize heading 'font-lock-face - 'magit-section-secondary-heading))) - (magit-insert-heading) - (if (re-search-forward "-----BEGIN PGP SIGNATURE-----" nil t) - (progn - (let ((beg (match-beginning 0))) - (re-search-forward "-----END PGP SIGNATURE-----") - (delete-region beg (point))) - (insert ?\n) - (process-file magit-git-executable nil t nil - "verify-tag" magit-buffer-revision)) - (goto-char (point-max))) - (insert ?\n)))) - -(defvar magit-commit-message-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-show-commit) - map) - "Keymap for `commit-message' sections.") - -(defun magit-insert-revision-message () - "Insert the commit message into a revision buffer." - (magit-insert-section section (commit-message) - (oset section heading-highlight-face 'magit-diff-revision-summary-highlight) - (let ((beg (point)) - (rev magit-buffer-revision)) - (insert (with-temp-buffer - (magit-rev-insert-format "%B" rev) - (magit-revision--wash-message))) - (if (= (point) (+ beg 2)) - (progn (backward-delete-char 2) - (insert "(no message)\n")) - (goto-char beg) - (save-excursion - (while (search-forward "\r\n" nil t) ; Remove trailing CRs. - (delete-region (match-beginning 0) (1+ (match-beginning 0))))) - (when magit-revision-fill-summary-line - (let ((fill-column (min magit-revision-fill-summary-line - (window-width)))) - (fill-region (point) (line-end-position)))) - (when magit-revision-use-hash-sections - (save-excursion - (while (not (eobp)) - (re-search-forward "\\_<" nil 'move) - (let ((beg (point))) - (re-search-forward "\\_>" nil t) - (when (> (point) beg) - (let ((text (buffer-substring-no-properties beg (point)))) - (when (pcase magit-revision-use-hash-sections - (`quickest ; false negatives and positives - (and (>= (length text) 7) - (string-match-p "[0-9]" text) - (string-match-p "[a-z]" text))) - (`quicker ; false negatives (number-less hashes) - (and (>= (length text) 7) - (string-match-p "[0-9]" text) - (magit-commit-p text))) - (`quick ; false negatives (short hashes) - (and (>= (length text) 7) - (magit-commit-p text))) - (`slow - (magit-commit-p text))) - (put-text-property beg (point) - 'font-lock-face 'magit-hash) - (let ((end (point))) - (goto-char beg) - (magit-insert-section (commit text) - (goto-char end)))))))))) - (save-excursion - (forward-line) - (magit--add-face-text-property - beg (point) 'magit-diff-revision-summary) - (magit-insert-heading)) - (when magit-diff-highlight-keywords - (save-excursion - (while (re-search-forward "\\[[^[]*\\]" nil t) - (let ((beg (match-beginning 0)) - (end (match-end 0))) - (put-text-property - beg end 'font-lock-face - (if-let ((face (get-text-property beg 'font-lock-face))) - (list face 'magit-keyword) - 'magit-keyword)))))) - (goto-char (point-max)))))) - -(defun magit-insert-revision-notes () - "Insert commit notes into a revision buffer." - (let* ((var "core.notesRef") - (def (or (magit-get var) "refs/notes/commits"))) - (dolist (ref (or (magit-list-active-notes-refs))) - (magit-insert-section section (notes ref (not (equal ref def))) - (oset section heading-highlight-face 'magit-diff-hunk-heading-highlight) - (let ((beg (point)) - (rev magit-buffer-revision)) - (insert (with-temp-buffer - (magit-git-insert "-c" (concat "core.notesRef=" ref) - "notes" "show" rev) - (magit-revision--wash-message))) - (if (= (point) beg) - (magit-cancel-section) - (goto-char beg) - (end-of-line) - (insert (format " (%s)" - (propertize (if (string-prefix-p "refs/notes/" ref) - (substring ref 11) - ref) - 'font-lock-face 'magit-refname))) - (forward-char) - (magit--add-face-text-property beg (point) 'magit-diff-hunk-heading) - (magit-insert-heading) - (goto-char (point-max)) - (insert ?\n))))))) - -(defun magit-revision--wash-message () - (let ((major-mode 'git-commit-mode)) - (hack-dir-local-variables) - (hack-local-variables-apply)) - (unless (memq git-commit-major-mode '(nil text-mode)) - (funcall git-commit-major-mode) - (font-lock-ensure)) - (buffer-string)) - -(defun magit-insert-revision-headers () - "Insert headers about the commit into a revision buffer." - (magit-insert-section (headers) - (--when-let (magit-rev-format "%D" magit-buffer-revision "--decorate=full") - (insert (magit-format-ref-labels it) ?\s)) - (insert (propertize - (magit-rev-parse (concat magit-buffer-revision "^{commit}")) - 'font-lock-face 'magit-hash)) - (magit-insert-heading) - (let ((beg (point))) - (magit-rev-insert-format magit-revision-headers-format - magit-buffer-revision) - (magit-insert-revision-gravatars magit-buffer-revision beg)) - (when magit-revision-insert-related-refs - (dolist (parent (magit-commit-parents magit-buffer-revision)) - (magit-insert-section (commit parent) - (let ((line (magit-rev-format "%h %s" parent))) - (string-match "^\\([^ ]+\\) \\(.*\\)" line) - (magit-bind-match-strings (hash msg) line - (insert "Parent: ") - (insert (propertize hash 'font-lock-face 'magit-hash)) - (insert " " msg "\n"))))) - (magit--insert-related-refs - magit-buffer-revision "--merged" "Merged" - (eq magit-revision-insert-related-refs 'all)) - (magit--insert-related-refs - magit-buffer-revision "--contains" "Contained" - (eq magit-revision-insert-related-refs '(all mixed))) - (when-let ((follows (magit-get-current-tag magit-buffer-revision t))) - (let ((tag (car follows)) - (cnt (cadr follows))) - (magit-insert-section (tag tag) - (insert - (format "Follows: %s (%s)\n" - (propertize tag 'font-lock-face 'magit-tag) - (propertize (number-to-string cnt) - 'font-lock-face 'magit-branch-local)))))) - (when-let ((precedes (magit-get-next-tag magit-buffer-revision t))) - (let ((tag (car precedes)) - (cnt (cadr precedes))) - (magit-insert-section (tag tag) - (insert (format "Precedes: %s (%s)\n" - (propertize tag 'font-lock-face 'magit-tag) - (propertize (number-to-string cnt) - 'font-lock-face 'magit-tag)))))) - (insert ?\n)))) - -(defun magit--insert-related-refs (rev arg title remote) - (when-let ((refs (magit-list-related-branches arg rev (and remote "-a")))) - (insert title ":" (make-string (- 10 (length title)) ?\s)) - (dolist (branch refs) - (if (<= (+ (current-column) 1 (length branch)) - (window-width)) - (insert ?\s) - (insert ?\n (make-string 12 ?\s))) - (magit-insert-section (branch branch) - (insert (propertize branch 'font-lock-face - (if (string-prefix-p "remotes/" branch) - 'magit-branch-remote - 'magit-branch-local))))) - (insert ?\n))) - -(defun magit-insert-revision-gravatars (rev beg) - (when (and magit-revision-show-gravatars - (window-system)) - (require 'gravatar) - (pcase-let ((`(,author . ,committer) - (pcase magit-revision-show-gravatars - (`t '("^Author: " . "^Commit: ")) - (`author '("^Author: " . nil)) - (`committer '(nil . "^Commit: ")) - (_ magit-revision-show-gravatars)))) - (--when-let (and author (magit-rev-format "%aE" rev)) - (magit-insert-revision-gravatar beg rev it author)) - (--when-let (and committer (magit-rev-format "%cE" rev)) - (magit-insert-revision-gravatar beg rev it committer))))) - -(defun magit-insert-revision-gravatar (beg rev email regexp) - (save-excursion - (goto-char beg) - (when (re-search-forward regexp nil t) - (when-let ((window (get-buffer-window))) - (let* ((column (length (match-string 0))) - (font-obj (query-font (font-at (point) window))) - (size (* 2 (+ (aref font-obj 4) - (aref font-obj 5)))) - (align-to (+ column - (ceiling (/ size (aref font-obj 7) 1.0)) - 1)) - (gravatar-size (- size 2))) - (ignore-errors ; service may be unreachable - (gravatar-retrieve email 'magit-insert-revision-gravatar-cb - (list rev (point-marker) align-to column)))))))) - -(defun magit-insert-revision-gravatar-cb (image rev marker align-to column) - (unless (eq image 'error) - (when-let ((buffer (marker-buffer marker))) - (with-current-buffer buffer - (save-excursion - (goto-char marker) - ;; The buffer might display another revision by now or - ;; it might have been refreshed, in which case another - ;; process might already have inserted the image. - (when (and (equal rev magit-buffer-revision) - (not (eq (car-safe - (car-safe - (get-text-property (point) 'display))) - 'image))) - (let ((top `((,@image :ascent center :relief 1) - (slice 0.0 0.0 1.0 0.5))) - (bot `((,@image :ascent center :relief 1) - (slice 0.0 0.5 1.0 1.0))) - (align `((space :align-to ,align-to)))) - (when magit-revision-use-gravatar-kludge - (cl-rotatef top bot)) - (let ((inhibit-read-only t)) - (insert (propertize " " 'display top)) - (insert (propertize " " 'display align)) - (forward-line) - (forward-char column) - (insert (propertize " " 'display bot)) - (insert (propertize " " 'display align)))))))))) - -;;; Merge-Preview Mode - -(define-derived-mode magit-merge-preview-mode magit-diff-mode "Magit Merge" - "Mode for previewing a merge." - :group 'magit-diff - (hack-dir-local-variables-non-file-buffer)) - -(put 'magit-merge-preview-mode 'magit-diff-default-arguments - '("--no-ext-diff")) - -(defun magit-merge-preview-setup-buffer (rev) - (magit-setup-buffer #'magit-merge-preview-mode nil - (magit-buffer-revision rev) - (magit-buffer-range (format "%s^..%s" rev rev)))) - -(defun magit-merge-preview-refresh-buffer () - (let* ((branch (magit-get-current-branch)) - (head (or branch (magit-rev-verify "HEAD")))) - (magit-set-header-line-format (format "Preview merge of %s into %s" - magit-buffer-revision - (or branch "HEAD"))) - (magit-insert-section (diffbuf) - (magit--insert-diff - "merge-tree" (magit-git-string "merge-base" head magit-buffer-revision) - head magit-buffer-revision)))) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-merge-preview-mode)) - magit-buffer-revision) - -;;; Diff Sections - -(defun magit-hunk-set-window-start (section) - "When SECTION is a `hunk', ensure that its beginning is visible. -It the SECTION has a different type, then do nothing." - (when (magit-hunk-section-p section) - (magit-section-set-window-start section))) - -(add-hook 'magit-section-movement-hook #'magit-hunk-set-window-start) - -(defun magit-hunk-goto-successor (section arg) - (and (magit-hunk-section-p section) - (when-let ((parent (magit-get-section - (magit-section-ident - (oref section parent))))) - (let* ((children (oref parent children)) - (siblings (magit-section-siblings section 'prev)) - (previous (nth (length siblings) children))) - (if (not arg) - (--when-let (or previous (car (last children))) - (magit-section-goto it) - t) - (when previous - (magit-section-goto previous)) - (if (and (stringp arg) - (re-search-forward arg (oref parent end) t)) - (goto-char (match-beginning 0)) - (goto-char (oref (car (last children)) end)) - (forward-line -1) - (while (looking-at "^ ") (forward-line -1)) - (while (looking-at "^[-+]") (forward-line -1)) - (forward-line))))))) - -(add-hook 'magit-section-goto-successor-hook #'magit-hunk-goto-successor) - -(defvar magit-unstaged-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-diff-unstaged) - (define-key map [remap magit-delete-thing] 'magit-discard) - (define-key map "s" 'magit-stage) - (define-key map "u" 'magit-unstage) - map) - "Keymap for the `unstaged' section.") - -(magit-define-section-jumper magit-jump-to-unstaged "Unstaged changes" unstaged) - -(defun magit-insert-unstaged-changes () - "Insert section showing unstaged changes." - (magit-insert-section (unstaged) - (magit-insert-heading "Unstaged changes:") - (magit--insert-diff - "diff" magit-buffer-diff-args "--no-prefix" - "--" magit-buffer-diff-files))) - -(defvar magit-staged-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-diff-staged) - (define-key map [remap magit-delete-thing] 'magit-discard) - (define-key map [remap magit-revert-no-commit] 'magit-reverse) - (define-key map "s" 'magit-stage) - (define-key map "u" 'magit-unstage) - map) - "Keymap for the `staged' section.") - -(magit-define-section-jumper magit-jump-to-staged "Staged changes" staged) - -(defun magit-insert-staged-changes () - "Insert section showing staged changes." - ;; Avoid listing all files as deleted when visiting a bare repo. - (unless (magit-bare-repo-p) - (magit-insert-section (staged) - (magit-insert-heading "Staged changes:") - (magit--insert-diff - "diff" "--cached" magit-buffer-diff-args "--no-prefix" - "--" magit-buffer-diff-files)))) - -;;; Diff Type - -(defun magit-diff-type (&optional section) - "Return the diff type of SECTION. - -The returned type is one of the symbols `staged', `unstaged', -`committed', or `undefined'. This type serves a similar purpose -as the general type common to all sections (which is stored in -the `type' slot of the corresponding `magit-section' struct) but -takes additional information into account. When the SECTION -isn't related to diffs and the buffer containing it also isn't -a diff-only buffer, then return nil. - -Currently the type can also be one of `tracked' and `untracked' -but these values are not handled explicitly everywhere they -should be and a possible fix could be to just return nil here. - -The section has to be a `diff' or `hunk' section, or a section -whose children are of type `diff'. If optional SECTION is nil, -return the diff type for the current section. In buffers whose -major mode is `magit-diff-mode' SECTION is ignored and the type -is determined using other means. In `magit-revision-mode' -buffers the type is always `committed'. - -Do not confuse this with `magit-diff-scope' (which see)." - (--when-let (or section (magit-current-section)) - (cond ((derived-mode-p 'magit-revision-mode 'magit-stash-mode) 'committed) - ((derived-mode-p 'magit-diff-mode) - (let ((range magit-buffer-range) - (const magit-buffer-typearg)) - (cond ((equal const "--no-index") 'undefined) - ((or (not range) - (magit-rev-eq range "HEAD")) - (if (equal const "--cached") - 'staged - 'unstaged)) - ((equal const "--cached") - (if (magit-rev-head-p range) - 'staged - 'undefined)) ; i.e. committed and staged - (t 'committed)))) - ((derived-mode-p 'magit-status-mode) - (let ((stype (oref it type))) - (if (memq stype '(staged unstaged tracked untracked)) - stype - (pcase stype - ((or `file `module) - (let* ((parent (oref it parent)) - (type (oref parent type))) - (if (memq type '(file module)) - (magit-diff-type parent) - type))) - (`hunk (-> it - (oref parent) - (oref parent) - (oref type))))))) - ((derived-mode-p 'magit-log-mode) - (if (or (and (magit-section-match 'commit section) - (oref section children)) - (magit-section-match [* file commit] section)) - 'committed - 'undefined)) - (t 'undefined)))) - -(cl-defun magit-diff-scope (&optional (section nil ssection) strict) - "Return the diff scope of SECTION or the selected section(s). - -A diff's \"scope\" describes what part of a diff is selected, it is -a symbol, one of `region', `hunk', `hunks', `file', `files', or -`list'. Do not confuse this with the diff \"type\", as returned by -`magit-diff-type'. - -If optional SECTION is non-nil, then return the scope of that, -ignoring the sections selected by the region. Otherwise return -the scope of the current section, or if the region is active and -selects a valid group of diff related sections, the type of these -sections, i.e. `hunks' or `files'. If SECTION, or if that is nil -the current section, is a `hunk' section; and the region region -starts and ends inside the body of a that section, then the type -is `region'. If the region is empty after a mouse click, then -`hunk' is returned instead of `region'. - -If optional STRICT is non-nil, then return nil if the diff type of -the section at point is `untracked' or the section at point is not -actually a `diff' but a `diffstat' section." - (let ((siblings (and (not ssection) (magit-region-sections nil t)))) - (setq section (or section (car siblings) (magit-current-section))) - (when (and section - (or (not strict) - (and (not (eq (magit-diff-type section) 'untracked)) - (not (eq (--when-let (oref section parent) - (oref it type)) - 'diffstat))))) - (pcase (list (oref section type) - (and siblings t) - (magit-diff-use-hunk-region-p) - ssection) - (`(hunk nil t ,_) - (if (magit-section-internal-region-p section) 'region 'hunk)) - (`(hunk t t nil) 'hunks) - (`(hunk ,_ ,_ ,_) 'hunk) - (`(file t t nil) 'files) - (`(file ,_ ,_ ,_) 'file) - (`(module t t nil) 'files) - (`(module ,_ ,_ ,_) 'file) - (`(,(or `staged `unstaged `untracked) - nil ,_ ,_) 'list))))) - -(defun magit-diff-use-hunk-region-p () - (and (region-active-p) - ;; TODO implement this from first principals - ;; currently it's trial-and-error - (not (and (or (eq this-command 'mouse-drag-region) - (eq last-command 'mouse-drag-region) - ;; When another window was previously - ;; selected then the last-command is - ;; some byte-code function. - (byte-code-function-p last-command)) - (eq (region-end) (region-beginning)))))) - -;;; Diff Highlight - -(add-hook 'magit-section-unhighlight-hook #'magit-diff-unhighlight) -(add-hook 'magit-section-highlight-hook #'magit-diff-highlight) - -(defun magit-diff-unhighlight (section selection) - "Remove the highlighting of the diff-related SECTION." - (when (magit-hunk-section-p section) - (magit-diff-paint-hunk section selection nil) - t)) - -(defun magit-diff-highlight (section selection) - "Highlight the diff-related SECTION. -If SECTION is not a diff-related section, then do nothing and -return nil. If SELECTION is non-nil, then it is a list of sections -selected by the region, including SECTION. All of these sections -are highlighted." - (if (and (magit-section-match 'commit section) - (oref section children)) - (progn (if selection - (dolist (section selection) - (magit-diff-highlight-list section selection)) - (magit-diff-highlight-list section)) - t) - (when-let ((scope (magit-diff-scope section t))) - (cond ((eq scope 'region) - (magit-diff-paint-hunk section selection t)) - (selection - (dolist (section selection) - (magit-diff-highlight-recursive section selection))) - (t - (magit-diff-highlight-recursive section))) - t))) - -(defun magit-diff-highlight-recursive (section &optional selection) - (pcase (magit-diff-scope section) - (`list (magit-diff-highlight-list section selection)) - (`file (magit-diff-highlight-file section selection)) - (`hunk (magit-diff-highlight-heading section selection) - (magit-diff-paint-hunk section selection t)) - (_ (magit-section-highlight section nil)))) - -(defun magit-diff-highlight-list (section &optional selection) - (let ((beg (oref section start)) - (cnt (oref section content)) - (end (oref section end))) - (when (or (eq this-command 'mouse-drag-region) - (not selection)) - (unless (and (region-active-p) - (<= (region-beginning) beg)) - (magit-section-make-overlay beg cnt 'magit-section-highlight)) - (unless (oref section hidden) - (dolist (child (oref section children)) - (when (or (eq this-command 'mouse-drag-region) - (not (and (region-active-p) - (<= (region-beginning) - (oref child start))))) - (magit-diff-highlight-recursive child selection))))) - (when magit-diff-highlight-hunk-body - (magit-section-make-overlay (1- end) end 'magit-section-highlight)))) - -(defun magit-diff-highlight-file (section &optional selection) - (magit-diff-highlight-heading section selection) - (unless (oref section hidden) - (dolist (child (oref section children)) - (magit-diff-highlight-recursive child selection)))) - -(defun magit-diff-highlight-heading (section &optional selection) - (magit-section-make-overlay - (oref section start) - (or (oref section content) - (oref section end)) - (pcase (list (oref section type) - (and (member section selection) - (not (eq this-command 'mouse-drag-region)))) - (`(file t) 'magit-diff-file-heading-selection) - (`(file nil) 'magit-diff-file-heading-highlight) - (`(module t) 'magit-diff-file-heading-selection) - (`(module nil) 'magit-diff-file-heading-highlight) - (`(hunk t) 'magit-diff-hunk-heading-selection) - (`(hunk nil) 'magit-diff-hunk-heading-highlight)))) - -;;; Hunk Paint - -(cl-defun magit-diff-paint-hunk - (section &optional selection - (highlight (magit-section-selected-p section selection))) - (let (paint) - (unless magit-diff-highlight-hunk-body - (setq highlight nil)) - (cond (highlight - (unless (oref section hidden) - (add-to-list 'magit-section-highlighted-sections section) - (cond ((memq section magit-section-unhighlight-sections) - (setq magit-section-unhighlight-sections - (delq section magit-section-unhighlight-sections))) - (magit-diff-highlight-hunk-body - (setq paint t))))) - (t - (cond ((and (oref section hidden) - (memq section magit-section-unhighlight-sections)) - (add-to-list 'magit-section-highlighted-sections section) - (setq magit-section-unhighlight-sections - (delq section magit-section-unhighlight-sections))) - (t - (setq paint t))))) - (when paint - (save-excursion - (goto-char (oref section start)) - (let ((end (oref section end)) - (merging (looking-at "@@@")) - (diff-type (magit-diff-type)) - (stage nil) - (tab-width (magit-diff-tab-width - (magit-section-parent-value section)))) - (forward-line) - (while (< (point) end) - (when (and magit-diff-hide-trailing-cr-characters - (char-equal ?\r (char-before (line-end-position)))) - (put-text-property (1- (line-end-position)) (line-end-position) - 'invisible t)) - (put-text-property - (point) (1+ (line-end-position)) 'font-lock-face - (cond - ((looking-at "^\\+\\+?\\([<=|>]\\)\\{7\\}") - (setq stage (pcase (list (match-string 1) highlight) - (`("<" nil) 'magit-diff-our) - (`("<" t) 'magit-diff-our-highlight) - (`("|" nil) 'magit-diff-base) - (`("|" t) 'magit-diff-base-highlight) - (`("=" nil) 'magit-diff-their) - (`("=" t) 'magit-diff-their-highlight) - (`(">" nil) nil))) - 'magit-diff-conflict-heading) - ((looking-at (if merging "^\\(\\+\\| \\+\\)" "^\\+")) - (magit-diff-paint-tab merging tab-width) - (magit-diff-paint-whitespace merging 'added diff-type) - (or stage - (if highlight 'magit-diff-added-highlight 'magit-diff-added))) - ((looking-at (if merging "^\\(-\\| -\\)" "^-")) - (magit-diff-paint-tab merging tab-width) - (magit-diff-paint-whitespace merging 'removed diff-type) - (if highlight 'magit-diff-removed-highlight 'magit-diff-removed)) - (t - (magit-diff-paint-tab merging tab-width) - (magit-diff-paint-whitespace merging 'context diff-type) - (if highlight 'magit-diff-context-highlight 'magit-diff-context)))) - (forward-line)))))) - (magit-diff-update-hunk-refinement section)) - -(defvar magit-diff--tab-width-cache nil) - -(defun magit-diff-tab-width (file) - (setq file (expand-file-name file)) - (cl-flet ((cache (value) - (let ((elt (assoc file magit-diff--tab-width-cache))) - (if elt - (setcdr elt value) - (setq magit-diff--tab-width-cache - (cons (cons file value) - magit-diff--tab-width-cache)))) - value)) - (cond - ((not magit-diff-adjust-tab-width) - tab-width) - ((--when-let (find-buffer-visiting file) - (cache (buffer-local-value 'tab-width it)))) - ((--when-let (assoc file magit-diff--tab-width-cache) - (or (cdr it) - tab-width))) - ((or (eq magit-diff-adjust-tab-width 'always) - (and (numberp magit-diff-adjust-tab-width) - (>= magit-diff-adjust-tab-width - (nth 7 (file-attributes file))))) - (cache (buffer-local-value 'tab-width (find-file-noselect file)))) - (t - (cache nil) - tab-width)))) - -(defun magit-diff-paint-tab (merging width) - (save-excursion - (forward-char (if merging 2 1)) - (while (= (char-after) ?\t) - (put-text-property (point) (1+ (point)) - 'display (list (list 'space :width width))) - (forward-char)))) - -(defun magit-diff-paint-whitespace (merging line-type diff-type) - (when (and magit-diff-paint-whitespace - (or (not (memq magit-diff-paint-whitespace '(uncommitted status))) - (memq diff-type '(staged unstaged))) - (cl-case line-type - (added t) - (removed (memq magit-diff-paint-whitespace-lines '(all both))) - (context (memq magit-diff-paint-whitespace-lines '(all))))) - (let ((prefix (if merging "^[-\\+\s]\\{2\\}" "^[-\\+\s]")) - (indent - (if (local-variable-p 'magit-diff-highlight-indentation) - magit-diff-highlight-indentation - (setq-local - magit-diff-highlight-indentation - (cdr (--first (string-match-p (car it) default-directory) - (nreverse - (default-value - 'magit-diff-highlight-indentation)))))))) - (when (and magit-diff-highlight-trailing - (looking-at (concat prefix ".*?\\([ \t]+\\)$"))) - (let ((ov (make-overlay (match-beginning 1) (match-end 1) nil t))) - (overlay-put ov 'font-lock-face 'magit-diff-whitespace-warning) - (overlay-put ov 'priority 2) - (overlay-put ov 'evaporate t))) - (when (or (and (eq indent 'tabs) - (looking-at (concat prefix "\\( *\t[ \t]*\\)"))) - (and (integerp indent) - (looking-at (format "%s\\([ \t]* \\{%s,\\}[ \t]*\\)" - prefix indent)))) - (let ((ov (make-overlay (match-beginning 1) (match-end 1) nil t))) - (overlay-put ov 'font-lock-face 'magit-diff-whitespace-warning) - (overlay-put ov 'priority 2) - (overlay-put ov 'evaporate t)))))) - -(defun magit-diff-update-hunk-refinement (&optional section) - (if section - (unless (oref section hidden) - (pcase (list magit-diff-refine-hunk - (oref section refined) - (eq section (magit-current-section))) - ((or `(all nil ,_) `(t nil t)) - (oset section refined t) - (save-excursion - (goto-char (oref section start)) - ;; `diff-refine-hunk' does not handle combined diffs. - (unless (looking-at "@@@") - (let ((smerge-refine-ignore-whitespace - magit-diff-refine-ignore-whitespace) - ;; Avoid fsyncing many small temp files - (write-region-inhibit-fsync t)) - (diff-refine-hunk))))) - ((or `(nil t ,_) `(t t nil)) - (oset section refined nil) - (remove-overlays (oref section start) - (oref section end) - 'diff-mode 'fine)))) - (cl-labels ((recurse (section) - (if (magit-section-match 'hunk section) - (magit-diff-update-hunk-refinement section) - (dolist (child (oref section children)) - (recurse child))))) - (recurse magit-root-section)))) - - -;;; Hunk Region - -(defun magit-diff-hunk-region-beginning () - (save-excursion (goto-char (region-beginning)) - (line-beginning-position))) - -(defun magit-diff-hunk-region-end () - (save-excursion (goto-char (region-end)) - (line-end-position))) - -(defun magit-diff-update-hunk-region (section) - "Highlight the hunk-internal region if any." - (when (eq (magit-diff-scope section t) 'region) - (magit-diff--make-hunk-overlay - (oref section start) - (1- (oref section content)) - 'font-lock-face 'magit-diff-lines-heading - 'display (magit-diff-hunk-region-header section) - 'after-string (magit-diff--hunk-after-string 'magit-diff-lines-heading)) - (run-hook-with-args 'magit-diff-highlight-hunk-region-functions section) - t)) - -(defun magit-diff-highlight-hunk-region-dim-outside (section) - "Dim the parts of the hunk that are outside the hunk-internal region. -This is done by using the same foreground and background color -for added and removed lines as for context lines." - (let ((face (if magit-diff-highlight-hunk-body - 'magit-diff-context-highlight - 'magit-diff-context))) - (when magit-diff-unmarked-lines-keep-foreground - (setq face `(,@(and (>= emacs-major-version 27) '(:extend t)) - :background ,(face-attribute face :background)))) - (magit-diff--make-hunk-overlay (oref section content) - (magit-diff-hunk-region-beginning) - 'font-lock-face face - 'priority 2) - (magit-diff--make-hunk-overlay (1+ (magit-diff-hunk-region-end)) - (oref section end) - 'font-lock-face face - 'priority 2))) - -(defun magit-diff-highlight-hunk-region-using-face (_section) - "Highlight the hunk-internal region by making it bold. -Or rather highlight using the face `magit-diff-hunk-region', though -changing only the `:weight' and/or `:slant' is recommended for that -face." - (magit-diff--make-hunk-overlay (magit-diff-hunk-region-beginning) - (1+ (magit-diff-hunk-region-end)) - 'font-lock-face 'magit-diff-hunk-region)) - -(defun magit-diff-highlight-hunk-region-using-overlays (section) - "Emphasize the hunk-internal region using delimiting horizontal lines. -This is implemented as single-pixel newlines places inside overlays." - (if (window-system) - (let ((beg (magit-diff-hunk-region-beginning)) - (end (magit-diff-hunk-region-end)) - (str (propertize - (concat (propertize "\s" 'display '(space :height (1))) - (propertize "\n" 'line-height t)) - 'font-lock-face 'magit-diff-lines-boundary))) - (magit-diff--make-hunk-overlay beg (1+ beg) 'before-string str) - (magit-diff--make-hunk-overlay end (1+ end) 'after-string str)) - (magit-diff-highlight-hunk-region-using-face section))) - -(defun magit-diff-highlight-hunk-region-using-underline (section) - "Emphasize the hunk-internal region using delimiting horizontal lines. -This is implemented by overlining and underlining the first and -last (visual) lines of the region." - (if (window-system) - (let* ((beg (magit-diff-hunk-region-beginning)) - (end (magit-diff-hunk-region-end)) - (beg-eol (save-excursion (goto-char beg) - (end-of-visual-line) - (point))) - (end-bol (save-excursion (goto-char end) - (beginning-of-visual-line) - (point))) - (color (face-background 'magit-diff-lines-boundary nil t))) - (cl-flet ((ln (b e &rest face) - (magit-diff--make-hunk-overlay - b e 'font-lock-face face 'after-string - (magit-diff--hunk-after-string face)))) - (if (= beg end-bol) - (ln beg beg-eol :overline color :underline color) - (ln beg beg-eol :overline color) - (ln end-bol end :underline color)))) - (magit-diff-highlight-hunk-region-using-face section))) - -(defun magit-diff--make-hunk-overlay (start end &rest args) - (let ((ov (make-overlay start end nil t))) - (overlay-put ov 'evaporate t) - (while args (overlay-put ov (pop args) (pop args))) - (push ov magit-section--region-overlays) - ov)) - -(defun magit-diff--hunk-after-string (face) - (propertize "\s" - 'font-lock-face face - 'display (list 'space :align-to - `(+ (0 . right) - ,(min (window-hscroll) - (- (line-end-position) - (line-beginning-position))))) - ;; This prevents the cursor from being rendered at the - ;; edge of the window. - 'cursor t)) - -;;; Hunk Utilities - -(defun magit-diff-inside-hunk-body-p () - "Return non-nil if point is inside the body of a hunk." - (and (magit-section-match 'hunk) - (when-let ((content (oref (magit-current-section) content))) - (> (point) content)))) - -;;; Diff Extract - -(defun magit-diff-file-header (section) - (when (magit-hunk-section-p section) - (setq section (oref section parent))) - (when (magit-file-section-p section) - (oref section header))) - -(defun magit-diff-hunk-region-header (section) - (let ((patch (magit-diff-hunk-region-patch section))) - (string-match "\n" patch) - (substring patch 0 (1- (match-end 0))))) - -(defun magit-diff-hunk-region-patch (section &optional args) - (let ((op (if (member "--reverse" args) "+" "-")) - (sbeg (oref section start)) - (rbeg (magit-diff-hunk-region-beginning)) - (rend (region-end)) - (send (oref section end)) - (patch nil)) - (save-excursion - (goto-char sbeg) - (while (< (point) send) - (looking-at "\\(.\\)\\([^\n]*\n\\)") - (cond ((or (string-match-p "[@ ]" (match-string-no-properties 1)) - (and (>= (point) rbeg) - (<= (point) rend))) - (push (match-string-no-properties 0) patch)) - ((equal op (match-string-no-properties 1)) - (push (concat " " (match-string-no-properties 2)) patch))) - (forward-line))) - (let ((buffer-list-update-hook nil)) ; #3759 - (with-temp-buffer - (insert (mapconcat #'identity (reverse patch) "")) - (diff-fixup-modifs (point-min) (point-max)) - (setq patch (buffer-string)))) - patch)) - -;;; _ -(provide 'magit-diff) -;;; magit-diff.el ends here diff --git a/elpa/magit-20200418.939/magit-diff.elc b/elpa/magit-20200418.939/magit-diff.elc deleted file mode 100644 index 5693a82dfe5d2920f7419fc368b957f83f800cb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163222 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 dOF~eBDk^7Q_D|+(y{|EQicV7Si diff --git a/elpa/magit-20200418.939/magit-ediff.el b/elpa/magit-20200418.939/magit-ediff.el deleted file mode 100644 index 058dd882..00000000 --- a/elpa/magit-20200418.939/magit-ediff.el +++ /dev/null @@ -1,509 +0,0 @@ -;;; magit-ediff.el --- Ediff extension for Magit -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library provides basic support for Ediff. - -;;; Code: - -(require 'magit) - -(require 'ediff) -(require 'smerge-mode) - -(defvar smerge-ediff-buf) -(defvar smerge-ediff-windows) - -;;; Options - -(defgroup magit-ediff nil - "Ediff support for Magit." - :link '(info-link "(magit)Ediffing") - :group 'magit-extensions) - -(defcustom magit-ediff-quit-hook - '(magit-ediff-cleanup-auxiliary-buffers - magit-ediff-restore-previous-winconf) - "Hooks to run after finishing Ediff, when that was invoked using Magit. -The hooks are run in the Ediff control buffer. This is similar -to `ediff-quit-hook' but takes the needs of Magit into account. -The `ediff-quit-hook' is ignored by Ediff sessions which were -invoked using Magit." - :package-version '(magit . "2.2.0") - :group 'magit-ediff - :type 'hook - :get 'magit-hook-custom-get - :options '(magit-ediff-cleanup-auxiliary-buffers - magit-ediff-restore-previous-winconf)) - -(defcustom magit-ediff-dwim-show-on-hunks nil - "Whether `magit-ediff-dwim' runs show variants on hunks. -If non-nil, `magit-ediff-show-staged' or -`magit-ediff-show-unstaged' are called based on what section the -hunk is in. Otherwise, `magit-ediff-dwim' runs -`magit-ediff-stage' when point is on an uncommitted hunk." - :package-version '(magit . "2.2.0") - :group 'magit-ediff - :type 'boolean) - -(defcustom magit-ediff-show-stash-with-index t - "Whether `magit-ediff-show-stash' shows the state of the index. - -If non-nil, use a third Ediff buffer to distinguish which changes -in the stash were staged. In cases where the stash contains no -staged changes, fall back to a two-buffer Ediff. - -More specifically, a stash is a merge commit, stash@{N}, with -potentially three parents. - -* stash@{N}^1 represents the `HEAD' commit at the time the stash - was created. - -* stash@{N}^2 records any changes that were staged when the stash - was made. - -* stash@{N}^3, if it exists, contains files that were untracked - when stashing. - -If this option is non-nil, `magit-ediff-show-stash' will run -Ediff on a file using three buffers: one for stash@{N}, another -for stash@{N}^1, and a third for stash@{N}^2. - -Otherwise, Ediff uses two buffers, comparing -stash@{N}^1..stash@{N}. Along with any unstaged changes, changes -in the index commit, stash@{N}^2, will be shown in this -comparison unless they conflicted with changes in the working -tree at the time of stashing." - :package-version '(magit . "2.6.0") - :group 'magit-ediff - :type 'boolean) - -;;; Commands - -(defvar magit-ediff-previous-winconf nil) - -;;;###autoload (autoload 'magit-ediff "magit-ediff" nil) -(define-transient-command magit-ediff () - "Show differences using the Ediff package." - :info-manual "(ediff)" - ["Ediff" - [("E" "Dwim" magit-ediff-dwim) - ("s" "Stage" magit-ediff-stage) - ("m" "Resolve" magit-ediff-resolve)] - [("u" "Show unstaged" magit-ediff-show-unstaged) - ("i" "Show staged" magit-ediff-show-staged) - ("w" "Show worktree" magit-ediff-show-working-tree)] - [("c" "Show commit" magit-ediff-show-commit) - ("r" "Show range" magit-ediff-compare) - ("z" "Show stash" magit-ediff-show-stash)]]) - -;;;###autoload -(defun magit-ediff-resolve (file) - "Resolve outstanding conflicts in FILE using Ediff. -FILE has to be relative to the top directory of the repository. - -In the rare event that you want to manually resolve all -conflicts, including those already resolved by Git, use -`ediff-merge-revisions-with-ancestor'." - (interactive - (let ((current (magit-current-file)) - (unmerged (magit-unmerged-files))) - (unless unmerged - (user-error "There are no unresolved conflicts")) - (list (magit-completing-read "Resolve file" unmerged nil t nil nil - (car (member current unmerged)))))) - (magit-with-toplevel - (with-current-buffer (find-file-noselect file) - (smerge-ediff) - (setq-local - ediff-quit-hook - (lambda () - (let ((bufC ediff-buffer-C) - (bufS smerge-ediff-buf)) - (with-current-buffer bufS - (when (yes-or-no-p (format "Conflict resolution finished; save %s? " - buffer-file-name)) - (erase-buffer) - (insert-buffer-substring bufC) - (save-buffer)))) - (when (buffer-live-p ediff-buffer-A) (kill-buffer ediff-buffer-A)) - (when (buffer-live-p ediff-buffer-B) (kill-buffer ediff-buffer-B)) - (when (buffer-live-p ediff-buffer-C) (kill-buffer ediff-buffer-C)) - (when (buffer-live-p ediff-ancestor-buffer) - (kill-buffer ediff-ancestor-buffer)) - (let ((magit-ediff-previous-winconf smerge-ediff-windows)) - (run-hooks 'magit-ediff-quit-hook))))))) - -;;;###autoload -(defun magit-ediff-stage (file) - "Stage and unstage changes to FILE using Ediff. -FILE has to be relative to the top directory of the repository." - (interactive - (let ((files (magit-tracked-files))) - (list (magit-completing-read "Selectively stage file" files nil t nil nil - (car (member (magit-current-file) files)))))) - (magit-with-toplevel - (let* ((conf (current-window-configuration)) - (bufA (magit-get-revision-buffer "HEAD" file)) - (bufB (magit-get-revision-buffer "{index}" file)) - (bufBrw (and bufB (with-current-buffer bufB (not buffer-read-only)))) - (bufC (get-file-buffer file)) - (fileBufC (or bufC (find-file-noselect file))) - (coding-system-for-read - (with-current-buffer fileBufC buffer-file-coding-system))) - (ediff-buffers3 - (or bufA (magit-find-file-noselect "HEAD" file)) - (with-current-buffer (magit-find-file-index-noselect file t) - (setq buffer-read-only nil) - (current-buffer)) - fileBufC - `((lambda () - (setq-local - ediff-quit-hook - (lambda () - (and (buffer-live-p ediff-buffer-B) - (buffer-modified-p ediff-buffer-B) - (with-current-buffer ediff-buffer-B - (magit-update-index))) - (and (buffer-live-p ediff-buffer-C) - (buffer-modified-p ediff-buffer-C) - (with-current-buffer ediff-buffer-C - (when (y-or-n-p - (format "Save file %s? " buffer-file-name)) - (save-buffer)))) - ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A))) - ,@(if bufB - (unless bufBrw '((with-current-buffer ediff-buffer-B - (setq buffer-read-only t)))) - '((ediff-kill-buffer-carefully ediff-buffer-B))) - ,@(unless bufC '((ediff-kill-buffer-carefully ediff-buffer-C))) - (let ((magit-ediff-previous-winconf ,conf)) - (run-hooks 'magit-ediff-quit-hook)))))) - 'ediff-buffers3)))) - -;;;###autoload -(defun magit-ediff-compare (revA revB fileA fileB) - "Compare REVA:FILEA with REVB:FILEB using Ediff. - -FILEA and FILEB have to be relative to the top directory of the -repository. If REVA or REVB is nil, then this stands for the -working tree state. - -If the region is active, use the revisions on the first and last -line of the region. With a prefix argument, instead of diffing -the revisions, choose a revision to view changes along, starting -at the common ancestor of both revisions (i.e., use a \"...\" -range)." - (interactive - (pcase-let ((`(,revA ,revB) (magit-ediff-compare--read-revisions - nil current-prefix-arg))) - (nconc (list revA revB) - (magit-ediff-read-files revA revB)))) - (magit-with-toplevel - (let ((conf (current-window-configuration)) - (bufA (if revA - (magit-get-revision-buffer revA fileA) - (get-file-buffer fileA))) - (bufB (if revB - (magit-get-revision-buffer revB fileB) - (get-file-buffer fileB)))) - (ediff-buffers - (or bufA (if revA - (magit-find-file-noselect revA fileA) - (find-file-noselect fileA))) - (or bufB (if revB - (magit-find-file-noselect revB fileB) - (find-file-noselect fileB))) - `((lambda () - (setq-local - ediff-quit-hook - (lambda () - ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A))) - ,@(unless bufB '((ediff-kill-buffer-carefully ediff-buffer-B))) - (let ((magit-ediff-previous-winconf ,conf)) - (run-hooks 'magit-ediff-quit-hook)))))) - 'ediff-revision)))) - -(defun magit-ediff-compare--read-revisions (&optional arg mbase) - (let ((input (or arg (magit-diff-read-range-or-commit - "Compare range or commit" - nil mbase)))) - (--if-let (magit-split-range input) - (-cons-to-list it) - (list input nil)))) - -(defun magit-ediff-read-files (revA revB &optional fileB) - "Read file in REVB, return it and the corresponding file in REVA. -When FILEB is non-nil, use this as REVB's file instead of -prompting for it." - (unless fileB - (setq fileB (magit-read-file-choice - (format "File to compare between %s and %s" - revA (or revB "the working tree")) - (magit-changed-files revA revB) - (format "No changed files between %s and %s" - revA (or revB "the working tree"))))) - (list (or (car (member fileB (magit-revision-files revA))) - (cdr (assoc fileB (magit-renamed-files revB revA))) - (magit-read-file-choice - (format "File in %s to compare with %s in %s" - revA fileB (or revB "the working tree")) - (magit-changed-files revB revA) - (format "No files have changed between %s and %s" - revA revB))) - fileB)) - -;;;###autoload -(defun magit-ediff-dwim () - "Compare, stage, or resolve using Ediff. -This command tries to guess what file, and what commit or range -the user wants to compare, stage, or resolve using Ediff. It -might only be able to guess either the file, or range or commit, -in which case the user is asked about the other. It might not -always guess right, in which case the appropriate `magit-ediff-*' -command has to be used explicitly. If it cannot read the user's -mind at all, then it asks the user for a command to run." - (interactive) - (magit-section-case - (hunk (save-excursion - (goto-char (oref (oref it parent) start)) - (magit-ediff-dwim))) - (t - (let ((range (magit-diff--dwim)) - (file (magit-current-file)) - command revA revB) - (pcase range - ((and (guard (not magit-ediff-dwim-show-on-hunks)) - (or `unstaged `staged)) - (setq command (if (magit-anything-unmerged-p) - #'magit-ediff-resolve - #'magit-ediff-stage))) - (`unstaged (setq command #'magit-ediff-show-unstaged)) - (`staged (setq command #'magit-ediff-show-staged)) - (`(commit . ,value) - (setq command #'magit-ediff-show-commit) - (setq revB value)) - (`(stash . ,value) - (setq command #'magit-ediff-show-stash) - (setq revB value)) - ((pred stringp) - (pcase-let ((`(,a ,b) (magit-ediff-compare--read-revisions range))) - (setq command #'magit-ediff-compare) - (setq revA a) - (setq revB b))) - (_ - (when (derived-mode-p 'magit-diff-mode) - (pcase (magit-diff-type) - (`committed (pcase-let ((`(,a ,b) - (magit-ediff-compare--read-revisions - magit-buffer-range))) - (setq revA a) - (setq revB b))) - ((guard (not magit-ediff-dwim-show-on-hunks)) - (setq command #'magit-ediff-stage)) - (`unstaged (setq command #'magit-ediff-show-unstaged)) - (`staged (setq command #'magit-ediff-show-staged)) - (`undefined (setq command nil)) - (_ (setq command nil)))))) - (cond ((not command) - (call-interactively - (magit-read-char-case - "Failed to read your mind; do you want to " t - (?c "[c]ommit" 'magit-ediff-show-commit) - (?r "[r]ange" 'magit-ediff-compare) - (?s "[s]tage" 'magit-ediff-stage) - (?v "resol[v]e" 'magit-ediff-resolve)))) - ((eq command 'magit-ediff-compare) - (apply 'magit-ediff-compare revA revB - (magit-ediff-read-files revA revB file))) - ((eq command 'magit-ediff-show-commit) - (magit-ediff-show-commit revB)) - ((eq command 'magit-ediff-show-stash) - (magit-ediff-show-stash revB)) - (file - (funcall command file)) - (t - (call-interactively command))))))) - -;;;###autoload -(defun magit-ediff-show-staged (file) - "Show staged changes using Ediff. - -This only allows looking at the changes; to stage, unstage, -and discard changes using Ediff, use `magit-ediff-stage'. - -FILE must be relative to the top directory of the repository." - (interactive - (list (magit-read-file-choice "Show staged changes for file" - (magit-staged-files) - "No staged files"))) - (let ((conf (current-window-configuration)) - (bufA (magit-get-revision-buffer "HEAD" file)) - (bufB (get-buffer (concat file ".~{index}~")))) - (ediff-buffers - (or bufA (magit-find-file-noselect "HEAD" file)) - (or bufB (magit-find-file-index-noselect file t)) - `((lambda () - (setq-local - ediff-quit-hook - (lambda () - ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A))) - ,@(unless bufB '((ediff-kill-buffer-carefully ediff-buffer-B))) - (let ((magit-ediff-previous-winconf ,conf)) - (run-hooks 'magit-ediff-quit-hook)))))) - 'ediff-buffers))) - -;;;###autoload -(defun magit-ediff-show-unstaged (file) - "Show unstaged changes using Ediff. - -This only allows looking at the changes; to stage, unstage, -and discard changes using Ediff, use `magit-ediff-stage'. - -FILE must be relative to the top directory of the repository." - (interactive - (list (magit-read-file-choice "Show unstaged changes for file" - (magit-unstaged-files) - "No unstaged files"))) - (magit-with-toplevel - (let ((conf (current-window-configuration)) - (bufA (get-buffer (concat file ".~{index}~"))) - (bufB (get-file-buffer file))) - (ediff-buffers - (or bufA (magit-find-file-index-noselect file t)) - (or bufB (find-file-noselect file)) - `((lambda () - (setq-local - ediff-quit-hook - (lambda () - ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A))) - ,@(unless bufB '((ediff-kill-buffer-carefully ediff-buffer-B))) - (let ((magit-ediff-previous-winconf ,conf)) - (run-hooks 'magit-ediff-quit-hook)))))) - 'ediff-buffers)))) - -;;;###autoload -(defun magit-ediff-show-working-tree (file) - "Show changes between `HEAD' and working tree using Ediff. -FILE must be relative to the top directory of the repository." - (interactive - (list (magit-read-file-choice "Show changes in file" - (magit-changed-files "HEAD") - "No changed files"))) - (magit-with-toplevel - (let ((conf (current-window-configuration)) - (bufA (magit-get-revision-buffer "HEAD" file)) - (bufB (get-file-buffer file))) - (ediff-buffers - (or bufA (magit-find-file-noselect "HEAD" file)) - (or bufB (find-file-noselect file)) - `((lambda () - (setq-local - ediff-quit-hook - (lambda () - ,@(unless bufA '((ediff-kill-buffer-carefully ediff-buffer-A))) - ,@(unless bufB '((ediff-kill-buffer-carefully ediff-buffer-B))) - (let ((magit-ediff-previous-winconf ,conf)) - (run-hooks 'magit-ediff-quit-hook)))))) - 'ediff-buffers)))) - -;;;###autoload -(defun magit-ediff-show-commit (commit) - "Show changes introduced by COMMIT using Ediff." - (interactive (list (magit-read-branch-or-commit "Revision"))) - (let ((revA (concat commit "^")) - (revB commit)) - (apply #'magit-ediff-compare - revA revB - (magit-ediff-read-files revA revB (magit-current-file))))) - -;;;###autoload -(defun magit-ediff-show-stash (stash) - "Show changes introduced by STASH using Ediff. -`magit-ediff-show-stash-with-index' controls whether a -three-buffer Ediff is used in order to distinguish changes in the -stash that were staged." - (interactive (list (magit-read-stash "Stash"))) - (pcase-let* ((revA (concat stash "^1")) - (revB (concat stash "^2")) - (revC stash) - (`(,fileA ,fileC) (magit-ediff-read-files revA revC)) - (fileB fileC)) - (if (and magit-ediff-show-stash-with-index - (member fileA (magit-changed-files revB revA))) - (let ((conf (current-window-configuration)) - (bufA (magit-get-revision-buffer revA fileA)) - (bufB (magit-get-revision-buffer revB fileB)) - (bufC (magit-get-revision-buffer revC fileC))) - (ediff-buffers3 - (or bufA (magit-find-file-noselect revA fileA)) - (or bufB (magit-find-file-noselect revB fileB)) - (or bufC (magit-find-file-noselect revC fileC)) - `((lambda () - (setq-local - ediff-quit-hook - (lambda () - ,@(unless bufA - '((ediff-kill-buffer-carefully ediff-buffer-A))) - ,@(unless bufB - '((ediff-kill-buffer-carefully ediff-buffer-B))) - ,@(unless bufC - '((ediff-kill-buffer-carefully ediff-buffer-C))) - (let ((magit-ediff-previous-winconf ,conf)) - (run-hooks 'magit-ediff-quit-hook)))))) - 'ediff-buffers3)) - (magit-ediff-compare revA revC fileA fileC)))) - -(defun magit-ediff-cleanup-auxiliary-buffers () - (let* ((ctl-buf ediff-control-buffer) - (ctl-win (ediff-get-visible-buffer-window ctl-buf)) - (ctl-frm ediff-control-frame) - (main-frame (cond ((window-live-p ediff-window-A) - (window-frame ediff-window-A)) - ((window-live-p ediff-window-B) - (window-frame ediff-window-B))))) - (ediff-kill-buffer-carefully ediff-diff-buffer) - (ediff-kill-buffer-carefully ediff-custom-diff-buffer) - (ediff-kill-buffer-carefully ediff-fine-diff-buffer) - (ediff-kill-buffer-carefully ediff-tmp-buffer) - (ediff-kill-buffer-carefully ediff-error-buffer) - (ediff-kill-buffer-carefully ediff-msg-buffer) - (ediff-kill-buffer-carefully ediff-debug-buffer) - (when (boundp 'ediff-patch-diagnostics) - (ediff-kill-buffer-carefully ediff-patch-diagnostics)) - (cond ((and (ediff-window-display-p) - (frame-live-p ctl-frm)) - (delete-frame ctl-frm)) - ((window-live-p ctl-win) - (delete-window ctl-win))) - (ediff-kill-buffer-carefully ctl-buf) - (when (frame-live-p main-frame) - (select-frame main-frame)))) - -(defun magit-ediff-restore-previous-winconf () - (set-window-configuration magit-ediff-previous-winconf)) - -;;; _ -(provide 'magit-ediff) -;;; magit-ediff.el ends here diff --git a/elpa/magit-20200418.939/magit-ediff.elc b/elpa/magit-20200418.939/magit-ediff.elc deleted file mode 100644 index 11d7108f2b070a40e0fd9193aba15606b024d9f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18902 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 26.2 - (with-no-warnings (setq fallback 'magit-status)) ; for Emacs 25 - (exit-minibuffer)) - -;;;###autoload -(defun magit-dired-jump (&optional other-window) - "Visit file at point using Dired. -With a prefix argument, visit in another window. If there -is no file at point, then instead visit `default-directory'." - (interactive "P") - (dired-jump other-window - (when-let ((file (magit-file-at-point))) - (expand-file-name (if (file-directory-p file) - (file-name-as-directory file) - file))))) - -;;;###autoload -(defun magit-dired-log (&optional follow) - "Show log for all marked files, or the current file." - (interactive "P") - (if-let ((topdir (magit-toplevel default-directory))) - (let ((args (car (magit-log-arguments))) - (files (dired-get-marked-files nil nil #'magit-file-tracked-p))) - (unless files - (user-error "No marked file is being tracked by Git")) - (when (and follow - (not (member "--follow" args)) - (not (cdr files))) - (push "--follow" args)) - (magit-log-setup-buffer - (list (or (magit-get-current-branch) "HEAD")) - args - (let ((default-directory topdir)) - (mapcar #'file-relative-name files)) - magit-log-buffer-file-locked)) - (magit--not-inside-repository-error))) - -;;;###autoload -(defun magit-do-async-shell-command (file) - "Open FILE with `dired-do-async-shell-command'. -Interactively, open the file at point." - (interactive (list (or (magit-file-at-point) - (completing-read "Act on file: " - (magit-list-files))))) - (require 'dired-aux) - (dired-do-async-shell-command - (dired-read-shell-command "& on %s: " current-prefix-arg (list file)) - nil (list file))) - -;;; Shift Selection - -(defun magit--turn-on-shift-select-mode-p () - (and shift-select-mode - this-command-keys-shift-translated - (not mark-active) - (not (eq (car-safe transient-mark-mode) 'only)))) - -;;;###autoload -(defun magit-previous-line (&optional arg try-vscroll) - "Like `previous-line' but with Magit-specific shift-selection. - -Magit's selection mechanism is based on the region but selects an -area that is larger than the region. This causes `previous-line' -when invoked while holding the shift key to move up one line and -thereby select two lines. When invoked inside a hunk body this -command does not move point on the first invocation and thereby -it only selects a single line. Which inconsistency you prefer -is a matter of preference." - (declare (interactive-only - "use `forward-line' with negative argument instead.")) - (interactive "p\np") - (unless arg (setq arg 1)) - (let ((stay (or (magit-diff-inside-hunk-body-p) - (magit-section-position-in-heading-p)))) - (if (and stay (= arg 1) (magit--turn-on-shift-select-mode-p)) - (push-mark nil nil t) - (with-no-warnings - (handle-shift-selection) - (previous-line (if stay (max (1- arg) 1) arg) try-vscroll))))) - -;;;###autoload -(defun magit-next-line (&optional arg try-vscroll) - "Like `next-line' but with Magit-specific shift-selection. - -Magit's selection mechanism is based on the region but selects -an area that is larger than the region. This causes `next-line' -when invoked while holding the shift key to move down one line -and thereby select two lines. When invoked inside a hunk body -this command does not move point on the first invocation and -thereby it only selects a single line. Which inconsistency you -prefer is a matter of preference." - (declare (interactive-only forward-line)) - (interactive "p\np") - (unless arg (setq arg 1)) - (let ((stay (or (magit-diff-inside-hunk-body-p) - (magit-section-position-in-heading-p)))) - (if (and stay (= arg 1) (magit--turn-on-shift-select-mode-p)) - (push-mark nil nil t) - (with-no-warnings - (handle-shift-selection) - (next-line (if stay (max (1- arg) 1) arg) try-vscroll))))) - -;;; Clean - -;;;###autoload -(defun magit-clean (&optional arg) - "Remove untracked files from the working tree. -With a prefix argument also remove ignored files, -with two prefix arguments remove ignored files only. -\n(git clean -f -d [-x|-X])" - (interactive "p") - (when (yes-or-no-p (format "Remove %s files? " - (pcase arg - (1 "untracked") - (4 "untracked and ignored") - (_ "ignored")))) - (magit-wip-commit-before-change) - (magit-run-git "clean" "-f" "-d" (pcase arg (4 "-x") (16 "-X"))))) - -(put 'magit-clean 'disabled t) - -;;; ChangeLog - -;;;###autoload -(defun magit-add-change-log-entry (&optional whoami file-name other-window) - "Find change log file and add date entry and item for current change. -This differs from `add-change-log-entry' (which see) in that -it acts on the current hunk in a Magit buffer instead of on -a position in a file-visiting buffer." - (interactive (list current-prefix-arg - (prompt-for-change-log-name))) - (pcase-let ((`(,buf ,pos) (magit-diff-visit-file--noselect))) - (magit--with-temp-position buf pos - (let ((add-log-buffer-file-name-function - (lambda () - (or magit-buffer-file-name - (buffer-file-name))))) - (add-change-log-entry whoami file-name other-window))))) - -;;;###autoload -(defun magit-add-change-log-entry-other-window (&optional whoami file-name) - "Find change log file in other window and add entry and item. -This differs from `add-change-log-entry-other-window' (which see) -in that it acts on the current hunk in a Magit buffer instead of -on a position in a file-visiting buffer." - (interactive (and current-prefix-arg - (list current-prefix-arg - (prompt-for-change-log-name)))) - (magit-add-change-log-entry whoami file-name t)) - -;;; Edit Line Commit - -;;;###autoload -(defun magit-edit-line-commit (&optional type) - "Edit the commit that added the current line. - -With a prefix argument edit the commit that removes the line, -if any. The commit is determined using `git blame' and made -editable using `git rebase --interactive' if it is reachable -from `HEAD', or by checking out the commit (or a branch that -points at it) otherwise." - (interactive (list (and current-prefix-arg 'removal))) - (let* ((chunk (magit-current-blame-chunk (or type 'addition))) - (rev (oref chunk orig-rev))) - (if (equal rev "0000000000000000000000000000000000000000") - (message "This line has not been committed yet") - (let ((rebase (magit-rev-ancestor-p rev "HEAD")) - (file (expand-file-name (oref chunk orig-file) - (magit-toplevel)))) - (if rebase - (let ((magit--rebase-published-symbol 'edit-published)) - (magit-rebase-edit-commit rev (magit-rebase-arguments))) - (magit-checkout (or (magit-rev-branch rev) rev))) - (unless (and buffer-file-name - (file-equal-p file buffer-file-name)) - (let ((blame-type (and magit-blame-mode magit-blame-type))) - (if rebase - (set-process-sentinel - magit-this-process - (lambda (process event) - (magit-sequencer-process-sentinel process event) - (when (eq (process-status process) 'exit) - (find-file file) - (when blame-type - (magit-blame--pre-blame-setup blame-type) - (magit-blame--run (magit-blame-arguments)))))) - (find-file file) - (when blame-type - (magit-blame--pre-blame-setup blame-type) - (magit-blame--run (magit-blame-arguments)))))))))) - -(put 'magit-edit-line-commit 'disabled t) - -;;;###autoload -(defun magit-diff-edit-hunk-commit (file) - "From a hunk, edit the respective commit and visit the file. - -First visit the file being modified by the hunk at the correct -location using `magit-diff-visit-file'. This actually visits a -blob. When point is on a diff header, not within an individual -hunk, then this visits the blob the first hunk is about. - -Then invoke `magit-edit-line-commit', which uses an interactive -rebase to make the commit editable, or if that is not possible -because the commit is not reachable from `HEAD' by checking out -that commit directly. This also causes the actual worktree file -to be visited. - -Neither the blob nor the file buffer are killed when finishing -the rebase. If that is undesirable, then it might be better to -use `magit-rebase-edit-command' instead of this command." - (interactive (list (magit-file-at-point t t))) - (let ((magit-diff-visit-previous-blob nil)) - (with-current-buffer - (magit-diff-visit-file--internal file nil #'pop-to-buffer-same-window) - (magit-edit-line-commit)))) - -(put 'magit-diff-edit-hunk-commit 'disabled t) - -;;; Reshelve - -;;;###autoload -(defun magit-reshelve-since (rev) - "Change the author and committer dates of the commits since REV. - -Ask the user for the first reachable commit whose dates should -be changed. Then read the new date for that commit. The initial -minibuffer input and the previous history element offer good -values. The next commit will be created one minute later and so -on. - -This command is only intended for interactive use and should only -be used on highly rearranged and unpublished history." - (interactive (list nil)) - (cond - ((not rev) - (let ((backup (concat "refs/original/refs/heads/" - (magit-get-current-branch)))) - (when (and (magit-ref-p backup) - (not (magit-y-or-n-p - "Backup ref %s already exists. Override? " backup))) - (user-error "Abort"))) - (magit-log-select 'magit-reshelve-since - "Type %p on a commit to reshelve it and the commits above it,")) - (t - (cl-flet ((adjust (time offset) - (format-time-string - "%F %T %z" - (+ (floor time) - (* offset 60) - (- (car (decode-time time))))))) - (let* ((start (concat rev "^")) - (range (concat start ".." (magit-get-current-branch))) - (time-rev (adjust (float-time (string-to-number - (magit-rev-format "%at" start))) - 1)) - (time-now (adjust (float-time) - (- (string-to-number - (magit-git-string "rev-list" "--count" - range)))))) - (push time-rev magit--reshelve-history) - (let ((date (floor - (float-time - (date-to-time - (read-string "Date for first commit: " - time-now 'magit--reshelve-history)))))) - (magit-with-toplevel - (magit-run-git-async - "filter-branch" "--force" "--env-filter" - (format "case $GIT_COMMIT in %s\nesac" - (mapconcat (lambda (rev) - (prog1 (format "%s) \ -export GIT_AUTHOR_DATE=\"%s\"; \ -export GIT_COMMITTER_DATE=\"%s\";;" rev date date) - (cl-incf date 60))) - (magit-git-lines "rev-list" "--reverse" - range) - " ")) - range "--") - (set-process-sentinel - magit-this-process - (lambda (process event) - (when (memq (process-status process) '(exit signal)) - (if (> (process-exit-status process) 0) - (magit-process-sentinel process event) - (process-put process 'inhibit-refresh t) - (magit-process-sentinel process event) - (magit-run-git "update-ref" "-d" - (concat "refs/original/refs/heads/" - (magit-get-current-branch)))))))))))))) - -;;; Revision Stack - -(defvar magit-revision-stack nil) - -(defcustom magit-pop-revision-stack-format - '("[%N: %h] " "%N: %H\n %s\n" "\\[\\([0-9]+\\)[]:]") - "Control how `magit-pop-revision-stack' inserts a revision. - -The command `magit-pop-revision-stack' inserts a representation -of the revision last pushed to the `magit-revision-stack' into -the current buffer. It inserts text at point and/or near the end -of the buffer, and removes the consumed revision from the stack. - -The entries on the stack have the format (HASH TOPLEVEL) and this -option has the format (POINT-FORMAT EOB-FORMAT INDEX-REGEXP), all -of which may be nil or a string (though either one of EOB-FORMAT -or POINT-FORMAT should be a string, and if INDEX-REGEXP is -non-nil, then the two formats should be too). - -First INDEX-REGEXP is used to find the previously inserted entry, -by searching backward from point. The first submatch must match -the index number. That number is incremented by one, and becomes -the index number of the entry to be inserted. If you don't want -to number the inserted revisions, then use nil for INDEX-REGEXP. - -If INDEX-REGEXP is non-nil, then both POINT-FORMAT and EOB-FORMAT -should contain \"%N\", which is replaced with the number that was -determined in the previous step. - -Both formats, if non-nil and after removing %N, are then expanded -using `git show --format=FORMAT ...' inside TOPLEVEL. - -The expansion of POINT-FORMAT is inserted at point, and the -expansion of EOB-FORMAT is inserted at the end of the buffer (if -the buffer ends with a comment, then it is inserted right before -that)." - :package-version '(magit . "2.3.0") - :group 'magit-commands - :type '(list (choice (string :tag "Insert at point format") - (cons (string :tag "Insert at point format") - (repeat (string :tag "Argument to git show"))) - (const :tag "Don't insert at point" nil)) - (choice (string :tag "Insert at eob format") - (cons (string :tag "Insert at eob format") - (repeat (string :tag "Argument to git show"))) - (const :tag "Don't insert at eob" nil)) - (choice (regexp :tag "Find index regexp") - (const :tag "Don't number entries" nil)))) - -(defcustom magit-copy-revision-abbreviated nil - "Whether to save abbreviated revision to `kill-ring' and `magit-revision-stack'." - :package-version '(magit . "3.0.0") - :group 'magit-miscellaneous - :type 'boolean) - -;;;###autoload -(defun magit-pop-revision-stack (rev toplevel) - "Insert a representation of a revision into the current buffer. - -Pop a revision from the `magit-revision-stack' and insert it into -the current buffer according to `magit-pop-revision-stack-format'. -Revisions can be put on the stack using `magit-copy-section-value' -and `magit-copy-buffer-revision'. - -If the stack is empty or with a prefix argument, instead read a -revision in the minibuffer. By using the minibuffer history this -allows selecting an item which was popped earlier or to insert an -arbitrary reference or revision without first pushing it onto the -stack. - -When reading the revision from the minibuffer, then it might not -be possible to guess the correct repository. When this command -is called inside a repository (e.g. while composing a commit -message), then that repository is used. Otherwise (e.g. while -composing an email) then the repository recorded for the top -element of the stack is used (even though we insert another -revision). If not called inside a repository and with an empty -stack, or with two prefix arguments, then read the repository in -the minibuffer too." - (interactive - (if (or current-prefix-arg (not magit-revision-stack)) - (let ((default-directory - (or (and (not (= (prefix-numeric-value current-prefix-arg) 16)) - (or (magit-toplevel) - (cadr (car magit-revision-stack)))) - (magit-read-repository)))) - (list (magit-read-branch-or-commit "Insert revision") - default-directory)) - (push (caar magit-revision-stack) magit-revision-history) - (pop magit-revision-stack))) - (if rev - (pcase-let ((`(,pnt-format ,eob-format ,idx-format) - magit-pop-revision-stack-format)) - (let ((default-directory toplevel) - (idx (and idx-format - (save-excursion - (if (re-search-backward idx-format nil t) - (number-to-string - (1+ (string-to-number (match-string 1)))) - "1")))) - pnt-args eob-args) - (when (listp pnt-format) - (setq pnt-args (cdr pnt-format)) - (setq pnt-format (car pnt-format))) - (when (listp eob-format) - (setq eob-args (cdr eob-format)) - (setq eob-format (car eob-format))) - (when pnt-format - (when idx-format - (setq pnt-format - (replace-regexp-in-string "%N" idx pnt-format t t))) - (magit-rev-insert-format pnt-format rev pnt-args) - (backward-delete-char 1)) - (when eob-format - (when idx-format - (setq eob-format - (replace-regexp-in-string "%N" idx eob-format t t))) - (save-excursion - (goto-char (point-max)) - (skip-syntax-backward ">s-") - (beginning-of-line) - (if (and comment-start (looking-at comment-start)) - (while (looking-at comment-start) - (forward-line -1)) - (forward-line) - (unless (= (current-column) 0) - (insert ?\n))) - (insert ?\n) - (magit-rev-insert-format eob-format rev eob-args) - (backward-delete-char 1))))) - (user-error "Revision stack is empty"))) - -(define-key git-commit-mode-map - (kbd "C-c C-w") 'magit-pop-revision-stack) - -;;;###autoload -(defun magit-copy-section-value () - "Save the value of the current section for later use. - -Save the section value to the `kill-ring', and, provided that -the current section is a commit, branch, or tag section, push -the (referenced) revision to the `magit-revision-stack' for use -with `magit-pop-revision-stack'. - -When `magit-copy-revision-abbreviated' is non-nil, save the -abbreviated revision to the `kill-ring' and the -`magit-revision-stack'. - -When the current section is a branch or a tag, and a prefix -argument is used, then save the revision at its tip to the -`kill-ring' instead of the reference name. - -When the region is active, then save that to the `kill-ring', -like `kill-ring-save' would, instead of behaving as described -above. If a prefix argument is used and the region is within a -hunk, strip the outer diff marker column." - (interactive) - (cond - ((and current-prefix-arg - (magit-section-internal-region-p) - (magit-section-match 'hunk)) - (deactivate-mark) - (kill-new (replace-regexp-in-string - "^[ \\+\\-]" "" - (buffer-substring-no-properties - (region-beginning) (region-end))))) - ((use-region-p) - (call-interactively #'copy-region-as-kill)) - (t - (when-let ((section (magit-current-section)) - (value (oref section value))) - (magit-section-case - ((branch commit module-commit tag) - (let ((default-directory default-directory) ref) - (magit-section-case - ((branch tag) - (setq ref value)) - (module-commit - (setq default-directory - (file-name-as-directory - (expand-file-name (magit-section-parent-value section) - (magit-toplevel)))))) - (setq value (magit-rev-parse - (and magit-copy-revision-abbreviated "--short") - value)) - (push (list value default-directory) magit-revision-stack) - (kill-new (message "%s" (or (and current-prefix-arg ref) - value))))) - (t (kill-new (message "%s" value)))))))) - -;;;###autoload -(defun magit-copy-buffer-revision () - "Save the revision of the current buffer for later use. - -Save the revision shown in the current buffer to the `kill-ring' -and push it to the `magit-revision-stack'. - -This command is mainly intended for use in `magit-revision-mode' -buffers, the only buffers where it is always unambiguous exactly -which revision should be saved. - -Most other Magit buffers usually show more than one revision, in -some way or another, so this command has to select one of them, -and that choice might not always be the one you think would have -been the best pick. - -In such buffers it is often more useful to save the value of -the current section instead, using `magit-copy-section-value'. - -When the region is active, then save that to the `kill-ring', -like `kill-ring-save' would, instead of behaving as described -above. - -When `magit-copy-revision-abbreviated' is non-nil, save the -abbreviated revision to the `kill-ring' and the -`magit-revision-stack'." - (interactive) - (if (use-region-p) - (call-interactively #'copy-region-as-kill) - (when-let ((rev (or magit-buffer-revision - (cl-case major-mode - (magit-diff-mode - (if (string-match "\\.\\.\\.?\\(.+\\)" - magit-buffer-range) - (match-string 1 magit-buffer-range) - magit-buffer-range)) - (magit-status-mode "HEAD"))))) - (when (magit-commit-p rev) - (setq rev (magit-rev-parse - (and magit-copy-revision-abbreviated "--short") - rev)) - (push (list rev default-directory) magit-revision-stack) - (kill-new (message "%s" rev)))))) - -;;; Miscellaneous - -;;;###autoload -(defun magit-abort-dwim () - "Abort current operation. -Depending on the context, this will abort a merge, a rebase, a -patch application, a cherry-pick, a revert, or a bisect." - (interactive) - (cond ((magit-merge-in-progress-p) (magit-merge-abort)) - ((magit-rebase-in-progress-p) (magit-rebase-abort)) - ((magit-am-in-progress-p) (magit-am-abort)) - ((magit-sequencer-in-progress-p) (magit-sequencer-abort)) - ((magit-bisect-in-progress-p) (magit-bisect-reset)))) - -;;; _ -(provide 'magit-extras) -;;; magit-extras.el ends here diff --git a/elpa/magit-20200418.939/magit-extras.elc b/elpa/magit-20200418.939/magit-extras.elc deleted file mode 100644 index a68e8b075a2c402dc4d66cb2abc1c56c58b7f826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22725 zcmeHv`*+(`cCH-Tip^Q+P21JZOjjSrbQFmlK_&q{{HSLv+j8Qy;zw;wlGb#`APGqr zkpKrEC998n|MmNQd!GY<54)L6R@eREI*~*I2j{uZ-rxTAKDc-A&7+@hY;4r--MeQV zrITqqjz;n&PRzk19OmXM%JMi(jNjc05tI5s7lQ=g= zsKw0lC^w^vB%H)UGfIc~EQ^!ld>41Kd}hMYC>oifmDZg-|ISJsqZD-{>C6n%WEP_E ze0JpB#+Ag|fBop`Q!_jXvv4>=7k8!kFd3OVHN!A5gUF22aG?=9l-xvNHjbmr%uZ0y z542rO!JqVx9r#oK)oQh!!Nn}{hUq9W^?uN7;-__^@3;8D$4`KtHhwzz>Efrir8ili z)xr-7wNR+le*74}T`^uk@m8-N_$cYOzP#S|o4vYulSO}+$5~`1;c<+ap69c4;*Fx= zILspNI7{bKz2!ykXIY5#h{vYBKN`hc_i${E=E+b$#;&1?wksf$>_7rVJ!}(0EvVMx2YscJt(=_#K7<%hIh7kPi20pIL%omuI7H)Tb z&fC39m_qq1SG)cteC^)EEuA*r)vtVpvyxxrvuNVYE~b$=kCRb)o_oox?4qagZ0g>y zZtCGU4)eY5@85X8(=h*G&QIduiRstBX!YynKh5yscp75Uc#|XJ-827n&%DPo-{Xg4 z-NRVxvS%uz_NJzs0`CYN(8Be%rt{X+4^JZV6`rjW;(X`P%nOgO9n4NKmz7Ez=B|uK zyZ+X+nvL4c2koADHBZbt^u-*{<84{O85$VQvn;}xc_WLaX&%qg>|*a9YCEIoNJeb7 zwV7<5aM?UOuB*cpF?I!lzue%bU*KAB9lxCL@^5#mf%*3TO4bMu$kem;`FQ4yAeBQl zS(){6QtZW9Ivq!6(b#^SX6Z1>bIcgziINIYL9goewg+Y6#Sp_$^rp`0ne2{m0w8kT~kt+BA!f;`atmoS&ePmB*mx zs2!o|MiH8t#0hljIGRaGDB!F%JW10$+B4?6z zCPOtdXjBLSN{3JfwyR?_W~ONj0YM#U0wub0l-RMCReeb-A$sDQr_T?b|Mpqq?3Qfe#8^T?SM)C>&wxu>6y72DRaF0`G5)ewb*sx=uEsz8hxANch}f z*D&Zd_8Luu-}OJ?9N~wWvD2^XX5?j*`g@iV;{nAdMO#gjhr&cTD91}sk7`R=yDZwi zexr%!{5`IK8X`YHqs>m6(-@coe5Tg4D#KI3^}_7fsGP}$^Z*8QSJo-#Zsgnn*o|WV ziL*${z|ag&A?F zqBt6>n;qHl4Z}6?lKEs1WnMV*pyQwg8oKT86ubU(n?R+y`%2yM5p{T4=t8WGHBmS1 zL>20J!PI?7l-`=QU49?hs8mgzX4yyM*(r+hAKBgF`8EBv{ci(o$U^^d{inF=`b9Y` zn3H9{edl&Ln09AjFfjQ)b{s?t0us>ca_ax|A)wxB?|aRl?0vV>HjlG(3Q2*we5do1 z&%)Up%ONr@YSXxCVuD?W+_gZXj3cbv@k((L%w@HoDO3l!jNwuf)O!MFRs zh0Pwjlw!-BMv!&rbl0`;ER4qj#b8nZuO|_1!(5Ex)97xkX3P%2yaz*bYWnxL<5B7X zhs>vP1$WDTJJ_&;QD}A=3zty=Og?wwX>?)uJX(fTr`_--;dH4mik}VuhaP$F&2hcq z+7ttY;>003?~O*IR(m}QGcj&rQq`sLJ9{nJ&QC|FL7QkJhiRh~Wj99V_W;2#X~U>S zO9)+J(jxGP<*6qN2OT3{@A}paohM;nxSRyzibqfBfRRb*P2-bmaYhKAB=B{Z3c?wM$ewz!eqmL!6UO=wk$ebldXT z|LYBUCG?VwKmIk0S>`5qC|Jcj zpvd8;BiDgTU?ZhKTU|E*j3%FHUgiY;ih!d96ceC)vyHDPyl+49&O?W2FzY}jxYPCd zO#9L0tMEbS5VyKl`}M|kxQN{@?i0xPk6EV2;>0m4(qWMZ#^O~0%{Z;VlqFY$Wu5GT z36Z5ehJ&UvEUT!_bY-b6?!ihDy{lhh>d&c_i)Eqa8ARMJ4kZmP%vbRY?xg1(rQ>mW z?qCqRpt{(ieQk=pa7azfvMB)BbQoqTMvI6{pZvK0)N0y2-)`RNm11`1ws`^UD?WjG zHt%#cpjE>BA{l!5Ni-e{u7iAIBQ7{jkU~CfRxXm*lbs5#r0I)b z;X}cyT)XnnMYKyfwb4wN9&LzMGnKz*iV~*LFg^l1SsfEF2LwwBZ0APDiECyOfon|Sd?MQ~%+V)H0A$fI z3$Su64lI$>04G8W3VhFnDlk^OX>l9rA>j?-$8lol^5xPNpWoGB8+{+ys;ObUB#DwN#o}8LNIzp9L zk($GQ1vHgb)Lz@ME0@cPhC%}i{bAd!!N_x2%2_cq@)!ntD4ifn7AGKga|mFR3@-#i z(e8t~z`TW!&l!0Kz%RXuLeYu^+JE(xIehgm-nXwGy@D}XrwtY)0Rr1;`KEpe650Ng z+X>#Sdd#%k&F-J^T1jASZP1x+{uZ}_E#4Bdq92znSJUsY1TBfM5luD{v^OrlW)*Mo z#qVrfzFe66mfeCtj7N@{;yQR-2kb4~pgDFM(Xfzk{17MJ3HCGQvncb?Ejpd&C$e3H z6q^~y@(5n{lH_xe%MDY)hE5PrpHKVAl*nO;eIOxF=p!mmas}M!jKg$A(p z1wjVg0#T{c!*~ad_Yv>p7h+HPbwJf-=PtegW?SR35bnED zJPVqZehzB9vw^FvuGDy&S9^MuK|r`aqNOjQoUCe+!jd?4+AhYH#&YxD04cVhoZZ^g z!AF+g#OT}Eh7(eJQjLEePX*h79vDQZAF)jspJNy8v!NqXmzkmubHrbu#p@oTWZ=E) z9wKE7#uV|H9_%Z{RBRD#iw#5RWN(k+oNN^$DzpoJuVbDterB7cJ4(@#UW2$YBLGYT zGzoGCMiHz{G!bvug}?NPXbf_ z9h}`h!TKk2s6pYX5J3xipYVz)uqKLoi1Fzqwm+ zw}}qeAZM-WPYZS7U_%ud$#9kVfTUVPTlgK_P3{rFZmd}aZ@J!;NCX0)Z<&X%vV^$d z`1anN7BpfN@JQg?j5zKX3bKRmWjKx`Xta|ekg7cR1)^+XI zRbXai zxcdLWuWgoPz*O>OnmroO9>4l9yW%ni0m}JIXz+a)Y@Zwqb)LkP@ADpyl_l6At~orl z0mz^e@Y?ysWRQ+ml%`e6B1THRSZ&K-tftH81tE28RNOw~l%+mA6yt|Ip{6a0qc{Z+ ziD2`xm~<6lw#^^-4@4HSK0=@hq{cu*g#$TZvXZ1nfIifHK`QAY0#&MgL>nHW$`MkY zGN2zzg09f)(jUPLc4#i=L`1NdvZ7L%Nx5ftqiaoWl$@|$mL0?0;!2&_SgF7i57}Aa z7@cEok4rMhVGpqN$=07nUYRh~f!%_1G=1nq5lMUwAQ+_IC>4JPNs*ihCDidnghehh z9iT`wlUxeQ3lZWO2pZ5k$OL3Ijx(=0Iz~1I6K8X7ie42LB>X9%A&kXFF6=N>2AC+I z86V11FWzLvj82M{E@lo%P#9;@PndD?^3{t+2d`h7gKrO>A2ygt^^>;L>R3|yPP2Vy z846%duX0XXj)Qd~Ucm#RutUJtmN2Uoyt<;nmY{2|ciTK+dV^APyM_;lQq7_q!s%q?$jot}C zVJl{LS+(?A8A!#^Xmfy#gn=Jw#E;=w^G>_HJlV{$k~BRbU!~!KjH+1+NM=>T;l(_& z8rnXIjlm>3ikFH8Fg=fH7YEUhoUU}RG{`Jc*iP#~NWRyy-2|h8?Ped;@ZMPMJ2?`% zxKh1h0G)Pmk7pV31i17ybR0=xGG7d+)}BY0Utyr_)WJ2j(+5w;28S2{KaI!qoP>ME zMuI5-Dj>syo>O~aIVIMryf$*dqCC!YK2S&!+$QnyiR7dW5cX!9X-!x?r`{H|BjlE8 z9z~R07MerH4GRT67~vshD$B~{uc81O;Q2*{t%>j|)f^PzO?6hF49!2PX0x6`MWV59 zl>ik1V*=q?p|{Y8>95mt>djK;#pJYtinr~P%W_BE<}#87I-XdgNMbu@AH$ zBn4;zs-es@z$H!r2f*>T1vG#Gk~@k>6|)C08m2oQr|GD67LJiCV{0T+<@VY+q@NpS zi0%+7Fr0#x<{$_dhSF)uQ}{ljW3U^oq!Jbjflb7WO(A)H=vkpr7|)eH>I_I>P6IAW zAn62~2C5V7W{7Sb<01z%$IvVubK|jl0?V+@ae`eyC>2?Bx>!WS+zSc{+y6jQC6P|^ z5}!Jf6dnAMS0x!xKtr?53lh7qa6lkrnN}{KlK=rI8yNYe)J}}djrGr;0K!6qee5_N zsM8NNH$hzif&diPiI#z)^)3SOKAQD=o1fmi@dnWP+QZL*YWXmJO7wdb6*q6*xN+kV zt}-`85H8YHnn*sxmtW#C>QYEdB#a-lu9z2p0mj?7-$q+)bh6Xj{0!acFxN5Ypo^Vg z3%>~2QKHk?{9iZm2T2I^O=OsMdS7m$5!Bgj0&oOfJSI3F&37?RT}Fu%R5PbskTtoy z1!Qg4#7X3bk_)K%9GEh70O9-=k!K7ob4$L_VCJ_RcwH04cPjR%2nt;YwMT6G5V<>u z5E5U5)(gknaTmm9`HWlP1+tqmq(zhJBYdzr(N2=BGCvyusSoDTb0j zgwSJBR*{gu^~7u)nyr7Yn_rouaSG+sZNeGmi3%zB*4!z<B|%T&QafkFf6aUJv0aac?K(++d%V1AFG2pXgp<%EMI+-agC z4ms$~clTC2FyJVUK2MKVbnEjIq%Ucp(&M*eUdPMg#|-s4gaO6U?SbfTW~qz_FqW z`t+_~t16Gm3>4&;j*5YoVMmdyVjjrD$Arcj#!<0531Pt4NvpVjj>F676t)Xb=_R~moJ_^KlGlwc=c@m&>XyY=sqIz^x%8%)xlQ>-@k02*WGt{zS!+2lED;a zk~MFbfy~?xT_9O;i{sT==JNq8GSZ4BOyQP~DnMu{dT-Q%%M%b7YtMn*;o3kR&?4GJ zdzdwy1322|nF5QUg>f1Gf#LIzNnAPX~x}!oc6F3+! z4u_ZqjhAECMXxbq=ON~z5?GKZQpM?l8$XqvK4eF%T2ri5w7&axqwMYNiOvFOEjC-ZQJE?&=awP;3*s)TO~rvRI;EkD zjrIY2st=YEM+dK1GdxCl;BhXi+bn~!6CbIl*zYKj>qIIVhP1eBbcv)CH3H@fXMz!; z52Sw@0HJrMkam#To;|p1Pj%viV%^^h_L?~SuyDlIYU$h_^HjsRgCl@39QPf2VD;`S z1TcLny0e%7yHu!fhq~|w7lyRJQ(h{*Zxi;pEto#R)vMz$hSohp@7ROKvNv=Fihf9- zUrK(w(-GJ|m4^Se%Zo*S!VaV2mF^<369QyM_=MU`m4;q-eO;UayT7POU|MXI4d^an z)nPilC=o+A7|=utH{lLAIeY-6q1GNJJt3Xs-Aqo)RDH-9Sl)a`uFs>NqT#^xHW*^4 zXNf6wkU5b$?b{^IhsfIwlL#rc$Qw{zWZmy6XR+&xS)O`|OiYJCuwAsPLZ1w$Zvz!F2x z6HG4vfCYM7R?OvV3e&VL*?G3la$D6yv93IN0@couDWZU~iI778L&P&KJPN#=wFI4N zIaB(M;M$9owJNzJ$Y72hUcjzU)v}55j^mVY8R@=&7dYf@vvpaRoH&zV6mLNFlk1$) zGTYZDpm$g~w}qMW4F4hvkw^o_0jF`u7otqjH4cS=E;ZFefNTa!1!E)v zS{RCe$LKDi$f*Pombf;V@+JkHRaPAgzm^MG%yndP9e3Mk7_HCcpB4f39AYtIs#C%GFC(fm5{&mM+5w( zw+heIchO&X+H#di2;fuOm;{ox3CFkQyBzlRg9~{EGtl>a9{+B(l|d%00&Ew1e(Q5kA$?sLA{i@H69?B*8=N< zOwcM<`^s9XB`X46v*c8|?cSOwcKezf+-ZL)>xmRiK3SX?N;;we`^pSGZ>0^`Ju*(F1W z06Oe~q*+nRF1G*+&B+qAO<-;tK{c??qLFtBYd&f~^pzT-Rb|y5fMPUB=)GoL z+cK;3Lf|8&z6y?93tk1d!qHp?_q6 zEVf7A)UHf90lRt-y==~7@3xUNfM{$9CDHUC0-GgZh6#lEFpCFxAsEss&TQ!44ZCs> zM~5xwn^Rc!k0^ji9X64JIub)i5r9BAD3Sys2U{~Br}2D}tb3WpDxQXE$E#uZx|2X6 znsQ!UKO)Z8M8==HQ=Y=2n!-;(w&Qch;1^U|{iYZhe39e70f~JLVcP3{aT2WK^ImWX zzYxu&nnP2tv;jkbWiePVU#>`qQv(8e4G~4ZcL@>8O5uOyvkYM36)cQv1^nc#7!E&6Fr``W-`WJ55);KTO&-`<#hAN;xZ7L+OHRQ}>n3 zNY(s{6Cwi!9N4jHiogdx6%xGWIN@i%L2b#qN{Ui)VX+J|hvfA;3oj2~#0^kibML8( zmgaj3>JBig+Ork=d*-1Oyd1>XKn6)X*`;f4@r5wO!SUAZ-W|Xbav8LlcY=z|baugU zZqBG#u8kIFt<@}^BM&7RAdxT>QL+vnEvDnzkn->jVTOaf2Q$bk)&B)cE2T5Wqr8SdUTO zd_wY|7`ucvKs?F$aPsJOwI;jvh$8HhB_s=H-3<$!72|-1NS@PnoT`aJ#N>=wb>h4t zUkwSnW*QGqF|4PF$@yXxH(feWDPDqy+))k&(|$Au(zk3FTX5)WfgN(Y4Vay8eA&f= zw1e+-$ycpVfn8W*Y4iSvZSwyU_-Wx?GnM($HGvkikkL_=;!gzEVNUd=ZDMC>hPrZc ztpzIyOD#r@4vG54FlKV4U*{#*OE|-NiLWK2rQ=_ic|OgAeOP8*fGM|j`Z>QzPCQfY z@!7}A37VZ>^J5@JRje6|`qAUh9{v@sN*+J{c5z-?I=Otfs2JKL{5?|0xtFbabYrg^ zb^EZ{`;eh@)m!)I$C#Ap56-MecA)go+A_722psR}|Gz=}c#pATy08mAuQfQ5&aHzi z-WO7FhTLIw^m;|#7pAw!(-+0>QX#SQ?aIrvTJ5fp#G}GDkRT!Tp2<7oIm_}C0S=QVk80LTqw%JG^U z?F42M!lS9%!mykmQAsl3&CWKi;iVQVS4f}?jno712wvxfcV4>r*E>1|&R|K>?YhGD z+()%^I9XdQE>}yH`Ty&xE$>#J(WzWpyS>FI0a9CC3W)EwdN`=1cwommw$9JSn&W-6 HjoSYO_qL99 diff --git a/elpa/magit-20200418.939/magit-fetch.el b/elpa/magit-20200418.939/magit-fetch.el deleted file mode 100644 index a3a0cc65..00000000 --- a/elpa/magit-20200418.939/magit-fetch.el +++ /dev/null @@ -1,186 +0,0 @@ -;;; magit-fetch.el --- download objects and refs -*- lexical-binding: t -*- - -;; Copyright (C) 2008-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements fetch commands. - -;;; Code: - -(require 'magit) - -;;; Options - -(defcustom magit-fetch-modules-jobs 4 - "Number of submodules to fetch in parallel. -Ignored for Git versions before v2.8.0." - :package-version '(magit . "2.12.0") - :group 'magit-commands - :type '(choice (const :tag "one at a time" nil) number)) - -;;; Commands - -;;;###autoload (autoload 'magit-fetch "magit-fetch" nil t) -(define-transient-command magit-fetch () - "Fetch from another repository." - :man-page "git-fetch" - ["Arguments" - ("-p" "Prune deleted branches" ("-p" "--prune")) - ("-t" "Fetch all tags" ("-t" "--tags"))] - ["Fetch from" - ("p" magit-fetch-from-pushremote) - ("u" magit-fetch-from-upstream) - ("e" "elsewhere" magit-fetch-other) - ("a" "all remotes" magit-fetch-all)] - ["Fetch" - ("o" "another branch" magit-fetch-branch) - ("r" "explicit refspec" magit-fetch-refspec) - ("m" "submodules" magit-fetch-modules)] - ["Configure" - ("C" "variables..." magit-branch-configure)]) - -(defun magit-fetch-arguments () - (transient-args 'magit-fetch)) - -(defun magit-git-fetch (remote args) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "fetch" remote args)) - -;;;###autoload (autoload 'magit-fetch-from-pushremote "magit-fetch" nil t) -(define-suffix-command magit-fetch-from-pushremote (args) - "Fetch from the current push-remote. - -With a prefix argument or when the push-remote is either not -configured or unusable, then let the user first configure the -push-remote." - :description 'magit-fetch--pushremote-description - (interactive (list (magit-fetch-arguments))) - (let ((remote (magit-get-push-remote))) - (when (or current-prefix-arg - (not (member remote (magit-list-remotes)))) - (let ((var (magit--push-remote-variable))) - (setq remote - (magit-read-remote (format "Set %s and fetch from there" var))) - (magit-set remote var))) - (magit-git-fetch remote args))) - -(defun magit-fetch--pushremote-description () - (let* ((branch (magit-get-current-branch)) - (remote (magit-get-push-remote branch)) - (v (magit--push-remote-variable branch t))) - (cond - ((member remote (magit-list-remotes)) remote) - (remote - (format "%s, replacing invalid" v)) - (t - (format "%s, setting that" v))))) - -;;;###autoload (autoload 'magit-fetch-from-upstream "magit-fetch" nil t) -(define-suffix-command magit-fetch-from-upstream (remote args) - "Fetch from the \"current\" remote, usually the upstream. - -If the upstream is configured for the current branch and names -an existing remote, then use that. Otherwise try to use another -remote: If only a single remote is configured, then use that. -Otherwise if a remote named \"origin\" exists, then use that. - -If no remote can be determined, then this command is not available -from the `magit-fetch' transient prefix and invoking it directly -results in an error." - :if (lambda () (magit-get-current-remote t)) - :description (lambda () (magit-get-current-remote t)) - (interactive (list (magit-get-current-remote t) - (magit-fetch-arguments))) - (unless remote - (error "The \"current\" remote could not be determined")) - (magit-git-fetch remote args)) - -;;;###autoload -(defun magit-fetch-other (remote args) - "Fetch from another repository." - (interactive (list (magit-read-remote "Fetch remote") - (magit-fetch-arguments))) - (magit-git-fetch remote args)) - -;;;###autoload -(defun magit-fetch-branch (remote branch args) - "Fetch a BRANCH from a REMOTE." - (interactive - (let ((remote (magit-read-remote-or-url "Fetch from remote or url"))) - (list remote - (magit-read-remote-branch "Fetch branch" remote) - (magit-fetch-arguments)))) - (magit-git-fetch remote (cons branch args))) - -;;;###autoload -(defun magit-fetch-refspec (remote refspec args) - "Fetch a REFSPEC from a REMOTE." - (interactive - (let ((remote (magit-read-remote-or-url "Fetch from remote or url"))) - (list remote - (magit-read-refspec "Fetch using refspec" remote) - (magit-fetch-arguments)))) - (magit-git-fetch remote (cons refspec args))) - -;;;###autoload -(defun magit-fetch-all (args) - "Fetch from all remotes." - (interactive (list (magit-fetch-arguments))) - (magit-git-fetch nil (cons "--all" args))) - -;;;###autoload -(defun magit-fetch-all-prune () - "Fetch from all remotes, and prune. -Prune remote tracking branches for branches that have been -removed on the respective remote." - (interactive) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "remote" "update" "--prune")) - -;;;###autoload -(defun magit-fetch-all-no-prune () - "Fetch from all remotes." - (interactive) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "remote" "update")) - -;;;###autoload -(defun magit-fetch-modules (&optional all) - "Fetch all submodules. - -Option `magit-fetch-modules-jobs' controls how many submodules -are being fetched in parallel. Also fetch the super-repository, -because `git-fetch' does not support not doing that. With a -prefix argument fetch all remotes." - (interactive "P") - (magit-with-toplevel - (magit-run-git-async - "fetch" "--verbose" "--recurse-submodules" - (and magit-fetch-modules-jobs - (version<= "2.8.0" (magit-git-version)) - (list "-j" (number-to-string magit-fetch-modules-jobs))) - (and all "--all")))) - -;;; _ -(provide 'magit-fetch) -;;; magit-fetch.el ends here diff --git a/elpa/magit-20200418.939/magit-fetch.elc b/elpa/magit-20200418.939/magit-fetch.elc deleted file mode 100644 index 784165969b84eba7c36479f260ce2558f472aa8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7044 zcmc&(TW{OQ6?S4E*cGsE1=^QlPv}h|6{a9jH`{4}^*YWrK)MN%0DXuIEKQCqZYYk* zA)UCtzTcS(MM{xU$x^FG$pw#l11|Gu)u58ZRwZq=82*icA-)UMe$7*E|Q318L1*q zvMY6nx49}PjAIc~^_Bi{H#pwdBbL}BlLbXGD?&^zid%K+OiEG|W^^eim0{x}mK8-J%+o~VRLn6k7?|%u1i$N#3HZH#tyZgjc~b~KlCdCf zI_ULq^&d`yKHmhm2DpZ}M!3e$p5gywI^ehcJ}%7YV@4k{`lH9+PJ`aWqxZS^SDEC3 z7U5L_VV0_p3qKZ78s@^k4)Y|ugvRt+eMrNEG& z>!5qo?R7mmS%%Sv@CtNVLu?x^y5t4je$efC9Xh$nWx2ErL~^l!9Vj{}ZkB@D(Of1G z|H4WO42Ds)hcvRu8O-wZ1W^RlGhpUTM3>+SVHXVQrStKL#~%%d)5| z7FvL}z-5wa;ma(&p`uc&4=*hj;6r;fdC%DrXqL+bg>b?-RGW*XR7oN88)#<5x4+EA zEcsL$u>&Vo8FT`b_)DmfJeZ&{vc?W+cq2h-`+dK*OC-~Bkx~037AndU;0=t=JI${& znF^Y3x9js2un8o$Pd zcRAVy`o42Q^*Q**L{$e{pg&Om;K!gxi0iYA-kksA)w^>#ee?6%&i9)!rh*fEXw)BW ziU0fi4%>lD{#?or?xPU`D&RW_Q$1`+;aR+MsBW@|JRO(33mQ}V;0NkbFzg*e03fqJ zuw-tdPcL2fdC(e+CYshheS@eo{B94i456tP&@>o~c<9f2cpQ+6Yxo`SPd%hH9qeP3$&6 z(y>5B;Jp%4g32f-`>oNmK1_`Cs64exf3~!qKQ&$RPa{#vNXUM)q zeF>p*5LkgU1MoM^DhG{uMVXa~v(!UgmJuSjUXLmxw-rS-pI=O~Ix&q*LmBL-;<#@I zDwt?Qn7YDhkq+5&m67bijx9@8NWwnRzxNRTwI>Xw-aXt8o#zbxuy+rp6CCKD!T0P( zI`h{K!{c^fVg@+dHzc!%IQKD-=ZyAN*SXzKoS`=y%el%U6mv)j(=b9|hs5$433Kd` z$K&vkf=5wd6%00a!oeEOxU|3_A`4^q4Kv*=j0}KiI~REld-2}Ex~86$z|^x59hGF6 z#=53NffyqX%oj-}K(>|I%A-ftqX*;T$)-nx0+eNpanBmAT^GB>CMQJ0mU9Dz=z_#CJ34*4aMA$_(v_ zg1aa#Yr!qIK*H-VNf`mBnJ&p#P`}pD>B*{Yst^}~gImfE+CK}5(F2Hz^oFIN%Ct~i zle0+KW10os=Rp$uui5~$YIqZUtdI&$hnng8S8QO)^MfBpJ$k;1&$ra4UzBkfmo&9) zE$6DC$yQhxPVNE=^;E+a)T4{~R&?gc&D#*&$mFx5qe^sd&Y!=1eSWq}c5cdU;n~6nrhixI4Ti)2hxBxn z=VVzZJDl+Ln$=JG+r7TL;smOl+^?0Gc*sc1^UY( zYw@CMKtI}2jK_dg)YRNtvk2e4rOLDBnx>|;w1J|Von9BhzpCDIFyocWI4n@aR6VT= z8rl?RbTm3b15`IDQLc`*NNqPanfx+_Ty6JX;pTz{mWOeFT<2k2IX|?%YD~a(Uzs*y zJ$5$Q-B0vsLoQQAbNLZ@VRlp7poNw>bkBaI6$$0n8{0&uDGng?D{T_0T#6h;rt6y? zwk|~!a!T-PRqj8*`G`H}!1N_rkvihXlE1=EE78 zg(;oBe0f{1!C0Yd(zBfa|dKTZqOV+ zeEaa(g9kjsp$j))MWqw diff --git a/elpa/magit-20200418.939/magit-files.el b/elpa/magit-20200418.939/magit-files.el deleted file mode 100644 index 3f0758d2..00000000 --- a/elpa/magit-20200418.939/magit-files.el +++ /dev/null @@ -1,551 +0,0 @@ -;;; magit-files.el --- finding files -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for finding blobs, staged files, -;; and Git configuration files. It also implements modes useful in -;; buffers visiting files and blobs, and the commands used by those -;; modes. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) - -;;; Find Blob - -(defvar magit-find-file-hook nil) -(add-hook 'magit-find-file-hook #'magit-blob-mode) - -;;;###autoload -(defun magit-find-file (rev file) - "View FILE from REV. -Switch to a buffer visiting blob REV:FILE, creating one if none -already exists. If prior to calling this command the current -buffer and/or cursor position is about the same file, then go -to the line and column corresponding to that location." - (interactive (magit-find-file-read-args "Find file")) - (magit-find-file--internal rev file #'pop-to-buffer-same-window)) - -;;;###autoload -(defun magit-find-file-other-window (rev file) - "View FILE from REV, in another window. -Switch to a buffer visiting blob REV:FILE, creating one if none -already exists. If prior to calling this command the current -buffer and/or cursor position is about the same file, then go to -the line and column corresponding to that location." - (interactive (magit-find-file-read-args "Find file in other window")) - (magit-find-file--internal rev file #'switch-to-buffer-other-window)) - -;;;###autoload -(defun magit-find-file-other-frame (rev file) - "View FILE from REV, in another frame. -Switch to a buffer visiting blob REV:FILE, creating one if none -already exists. If prior to calling this command the current -buffer and/or cursor position is about the same file, then go to -the line and column corresponding to that location." - (interactive (magit-find-file-read-args "Find file in other frame")) - (magit-find-file--internal rev file #'switch-to-buffer-other-frame)) - -(defun magit-find-file-read-args (prompt) - (let ((pseudo-revs '("{worktree}" "{index}"))) - (if-let ((rev (magit-completing-read "Find file from revision" - (append pseudo-revs - (magit-list-refnames nil t)) - nil nil nil 'magit-revision-history - (or (magit-branch-or-commit-at-point) - (magit-get-current-branch))))) - (list rev (magit-read-file-from-rev (if (member rev pseudo-revs) - "HEAD" - rev) - prompt)) - (user-error "Nothing selected")))) - -(defun magit-find-file--internal (rev file fn) - (let ((buf (magit-find-file-noselect rev file)) - line col) - (when-let ((visited-file (magit-file-relative-name))) - (setq line (line-number-at-pos)) - (setq col (current-column)) - (cond - ((not (equal visited-file file))) - ((equal magit-buffer-revision rev)) - ((equal rev "{worktree}") - (setq line (magit-diff-visit--offset file magit-buffer-revision line))) - ((equal rev "{index}") - (setq line (magit-diff-visit--offset file nil line))) - (magit-buffer-revision - (setq line (magit-diff-visit--offset - file (concat magit-buffer-revision ".." rev) line))) - (t - (setq line (magit-diff-visit--offset file (list "-R" rev) line))))) - (funcall fn buf) - (when line - (with-current-buffer buf - (widen) - (goto-char (point-min)) - (forward-line (1- line)) - (move-to-column col))) - buf)) - -(defun magit-find-file-noselect (rev file) - "Read FILE from REV into a buffer and return the buffer. -REV is a revision or one of \"{worktree}\" or \"{index}\". -FILE must be relative to the top directory of the repository." - (magit-find-file-noselect-1 rev file)) - -(defun magit-find-file-noselect-1 (rev file &optional revert) - "Read FILE from REV into a buffer and return the buffer. -REV is a revision or one of \"{worktree}\" or \"{index}\". -FILE must be relative to the top directory of the repository. -Non-nil REVERT means to revert the buffer. If `ask-revert', -then only after asking. A non-nil value for REVERT is ignored if REV is -\"{worktree}\"." - (if (equal rev "{worktree}") - (find-file-noselect (expand-file-name file (magit-toplevel))) - (let ((topdir (magit-toplevel))) - (when (file-name-absolute-p file) - (setq file (file-relative-name file topdir))) - (with-current-buffer (magit-get-revision-buffer-create rev file) - (when (or (not magit-buffer-file-name) - (if (eq revert 'ask-revert) - (y-or-n-p (format "%s already exists; revert it? " - (buffer-name)))) - revert) - (setq magit-buffer-revision - (if (equal rev "{index}") - "{index}" - (magit-rev-format "%H" rev))) - (setq magit-buffer-refname rev) - (setq magit-buffer-file-name (expand-file-name file topdir)) - (setq default-directory - (let ((dir (file-name-directory magit-buffer-file-name))) - (if (file-exists-p dir) dir topdir))) - (setq-local revert-buffer-function #'magit-revert-rev-file-buffer) - (revert-buffer t t) - (run-hooks (if (equal rev "{index}") - 'magit-find-index-hook - 'magit-find-file-hook))) - (current-buffer))))) - -(defun magit-get-revision-buffer-create (rev file) - (magit-get-revision-buffer rev file t)) - -(defun magit-get-revision-buffer (rev file &optional create) - (funcall (if create 'get-buffer-create 'get-buffer) - (format "%s.~%s~" file (subst-char-in-string ?/ ?_ rev)))) - -(defun magit-revert-rev-file-buffer (_ignore-auto noconfirm) - (when (or noconfirm - (and (not (buffer-modified-p)) - (catch 'found - (dolist (regexp revert-without-query) - (when (string-match regexp magit-buffer-file-name) - (throw 'found t))))) - (yes-or-no-p (format "Revert buffer from Git %s? " - (if (equal magit-buffer-refname "{index}") - "index" - (concat "revision " magit-buffer-refname))))) - (let* ((inhibit-read-only t) - (default-directory (magit-toplevel)) - (file (file-relative-name magit-buffer-file-name)) - (coding-system-for-read (or coding-system-for-read 'undecided))) - (erase-buffer) - (magit-git-insert "cat-file" "-p" - (if (equal magit-buffer-refname "{index}") - (concat ":" file) - (concat magit-buffer-refname ":" file))) - (setq buffer-file-coding-system last-coding-system-used)) - (let ((buffer-file-name magit-buffer-file-name) - (after-change-major-mode-hook - (remq 'global-diff-hl-mode-enable-in-buffers - after-change-major-mode-hook))) - (normal-mode t)) - (setq buffer-read-only t) - (set-buffer-modified-p nil) - (goto-char (point-min)))) - -;;; Find Index - -(defvar magit-find-index-hook nil) - -(defun magit-find-file-index-noselect (file &optional revert) - "Read FILE from the index into a buffer and return the buffer. -FILE must to be relative to the top directory of the repository." - (magit-find-file-noselect-1 "{index}" file (or revert 'ask-revert))) - -(defun magit-update-index () - "Update the index with the contents of the current buffer. -The current buffer has to be visiting a file in the index, which -is done using `magit-find-index-noselect'." - (interactive) - (let ((file (magit-file-relative-name))) - (unless (equal magit-buffer-refname "{index}") - (user-error "%s isn't visiting the index" file)) - (if (y-or-n-p (format "Update index with contents of %s" (buffer-name))) - (let ((index (make-temp-file "index")) - (buffer (current-buffer))) - (when magit-wip-before-change-mode - (magit-wip-commit-before-change (list file) " before un-/stage")) - (let ((coding-system-for-write buffer-file-coding-system)) - (with-temp-file index - (insert-buffer-substring buffer))) - (magit-with-toplevel - (magit-call-git "update-index" "--cacheinfo" - (substring (magit-git-string "ls-files" "-s" file) - 0 6) - (magit-git-string "hash-object" "-t" "blob" "-w" - (concat "--path=" file) - "--" index) - file)) - (set-buffer-modified-p nil) - (when magit-wip-after-apply-mode - (magit-wip-commit-after-apply (list file) " after un-/stage"))) - (message "Abort"))) - (--when-let (magit-get-mode-buffer 'magit-status-mode) - (with-current-buffer it (magit-refresh))) - t) - -;;; Find Config File - -(defun magit-find-git-config-file (filename &optional wildcards) - "Edit a file located in the current repository's git directory. - -When \".git\", located at the root of the working tree, is a -regular file, then that makes it cumbersome to open a file -located in the actual git directory. - -This command is like `find-file', except that it temporarily -binds `default-directory' to the actual git directory, while -reading the FILENAME." - (interactive - (let ((default-directory (magit-git-dir))) - (find-file-read-args "Find file: " - (confirm-nonexistent-file-or-buffer)))) - (find-file filename wildcards)) - -(defun magit-find-git-config-file-other-window (filename &optional wildcards) - "Edit a file located in the current repository's git directory, in another window. - -When \".git\", located at the root of the working tree, is a -regular file, then that makes it cumbersome to open a file -located in the actual git directory. - -This command is like `find-file-other-window', except that it -temporarily binds `default-directory' to the actual git -directory, while reading the FILENAME." - (interactive - (let ((default-directory (magit-git-dir))) - (find-file-read-args "Find file in other window: " - (confirm-nonexistent-file-or-buffer)))) - (find-file-other-window filename wildcards)) - -(defun magit-find-git-config-file-other-frame (filename &optional wildcards) - "Edit a file located in the current repository's git directory, in another frame. - -When \".git\", located at the root of the working tree, is a -regular file, then that makes it cumbersome to open a file -located in the actual git directory. - -This command is like `find-file-other-frame', except that it -temporarily binds `default-directory' to the actual git -directory, while reading the FILENAME." - (interactive - (let ((default-directory (magit-git-dir))) - (find-file-read-args "Find file in other frame: " - (confirm-nonexistent-file-or-buffer)))) - (find-file-other-frame filename wildcards)) - -;;; File Mode - -(defvar magit-file-mode-map - (let ((map (make-sparse-keymap))) - (define-key map "\C-xg" 'magit-status) - (define-key map "\C-x\M-g" 'magit-dispatch) - (define-key map "\C-c\M-g" 'magit-file-dispatch) - map) - "Keymap for `magit-file-mode'.") - -;;;###autoload (autoload 'magit-file-dispatch "magit" nil t) -(define-transient-command magit-file-dispatch () - "Invoke a Magit command that acts on the visited file." - :info-manual "(magit) Minor Mode for Buffers Visiting Files" - ["Actions" - [("s" "Stage" magit-stage-file) - ("u" "Unstage" magit-unstage-file) - ("c" "Commit" magit-commit) - ("e" "Edit line" magit-edit-line-commit)] - [("D" "Diff..." magit-diff) - ("d" "Diff" magit-diff-buffer-file) - ("g" "Status" magit-status-here)] - [("L" "Log..." magit-log) - ("l" "Log" magit-log-buffer-file) - ("t" "Trace" magit-log-trace-definition)] - [("B" "Blame..." magit-blame) - ("b" "Blame" magit-blame-addition) - ("r" "...removal" magit-blame-removal) - ("f" "...reverse" magit-blame-reverse) - ("m" "Blame echo" magit-blame-echo) - ("q" "Quit blame" magit-blame-quit)] - [("p" "Prev blob" magit-blob-previous) - ("n" "Next blob" magit-blob-next) - ("v" "Goto blob" magit-find-file) - ("V" "Goto file" magit-blob-visit-file)] - [(5 "C-c r" "Rename file" magit-file-rename) - (5 "C-c d" "Delete file" magit-file-delete) - (5 "C-c u" "Untrack file" magit-file-untrack) - (5 "C-c c" "Checkout file" magit-file-checkout)]]) - -(defvar magit-file-mode-lighter "") - -(define-minor-mode magit-file-mode - "Enable some Magit features in a file-visiting buffer. - -Currently this only adds the following key bindings. -\n\\{magit-file-mode-map}" - :package-version '(magit . "2.2.0") - :lighter magit-file-mode-lighter - :keymap magit-file-mode-map) - -(defun magit-file-mode-turn-on () - (and buffer-file-name - (magit-inside-worktree-p t) - (magit-file-mode))) - -;;;###autoload -(define-globalized-minor-mode global-magit-file-mode - magit-file-mode magit-file-mode-turn-on - :package-version '(magit . "2.13.0") - :link '(info-link "(magit)Minor Mode for Buffers Visiting Files") - :group 'magit-essentials - :group 'magit-modes - :init-value t) -;; Unfortunately `:init-value t' only sets the value of the mode -;; variable but does not cause the mode function to be called, and we -;; cannot use `:initialize' to call that explicitly because the option -;; is defined before the functions, so we have to do it here. -(cl-eval-when (load eval) - (when global-magit-file-mode - (global-magit-file-mode 1))) - -;;; Blob Mode - -(defvar magit-blob-mode-map - (let ((map (make-sparse-keymap))) - (define-key map "p" 'magit-blob-previous) - (define-key map "n" 'magit-blob-next) - (define-key map "b" 'magit-blame-addition) - (define-key map "r" 'magit-blame-removal) - (define-key map "f" 'magit-blame-reverse) - (define-key map "q" 'magit-kill-this-buffer) - map) - "Keymap for `magit-blob-mode'.") - -(define-minor-mode magit-blob-mode - "Enable some Magit features in blob-visiting buffers. - -Currently this only adds the following key bindings. -\n\\{magit-blob-mode-map}" - :package-version '(magit . "2.3.0")) - -(defun magit-blob-next () - "Visit the next blob which modified the current file." - (interactive) - (if magit-buffer-file-name - (magit-blob-visit (or (magit-blob-successor magit-buffer-revision - magit-buffer-file-name) - magit-buffer-file-name)) - (if (buffer-file-name (buffer-base-buffer)) - (user-error "You have reached the end of time") - (user-error "Buffer isn't visiting a file or blob")))) - -(defun magit-blob-previous () - "Visit the previous blob which modified the current file." - (interactive) - (if-let ((file (or magit-buffer-file-name - (buffer-file-name (buffer-base-buffer))))) - (--if-let (magit-blob-ancestor magit-buffer-revision file) - (magit-blob-visit it) - (user-error "You have reached the beginning of time")) - (user-error "Buffer isn't visiting a file or blob"))) - -;;;###autoload -(defun magit-blob-visit-file () - "View the file from the worktree corresponding to the current blob. -When visiting a blob or the version from the index, then go to -the same location in the respective file in the working tree." - (interactive) - (if-let ((file (magit-file-relative-name))) - (magit-find-file--internal "{worktree}" file #'pop-to-buffer-same-window) - (user-error "Not visiting a blob"))) - -(defun magit-blob-visit (blob-or-file) - (if (stringp blob-or-file) - (find-file blob-or-file) - (pcase-let ((`(,rev ,file) blob-or-file)) - (magit-find-file rev file) - (apply #'message "%s (%s %s ago)" - (magit-rev-format "%s" rev) - (magit--age (magit-rev-format "%ct" rev)))))) - -(defun magit-blob-ancestor (rev file) - (let ((lines (magit-with-toplevel - (magit-git-lines "log" "-2" "--format=%H" "--name-only" - "--follow" (or rev "HEAD") "--" file)))) - (if rev (cddr lines) (butlast lines 2)))) - -(defun magit-blob-successor (rev file) - (let ((lines (magit-with-toplevel - (magit-git-lines "log" "--format=%H" "--name-only" "--follow" - "HEAD" "--" file)))) - (catch 'found - (while lines - (if (equal (nth 2 lines) rev) - (throw 'found (list (nth 0 lines) (nth 1 lines))) - (setq lines (nthcdr 2 lines))))))) - -;;; File Commands - -(defun magit-file-rename (file newname) - "Rename the FILE to NEWNAME. -If FILE isn't tracked in Git, fallback to using `rename-file'." - (interactive - (let* ((file (magit-read-file "Rename file")) - (dir (file-name-directory file)) - (newname (read-file-name (format "Rename %s to file: " file) - (and dir (expand-file-name dir))))) - (list (expand-file-name file (magit-toplevel)) - (expand-file-name newname)))) - (let ((oldbuf (get-file-buffer file))) - (when (and oldbuf (buffer-modified-p oldbuf)) - (user-error "Save %s before moving it" file)) - (when (file-exists-p newname) - (user-error "%s already exists" newname)) - (if (magit-file-tracked-p (magit-convert-filename-for-git file)) - (magit-call-git "mv" - (magit-convert-filename-for-git file) - (magit-convert-filename-for-git newname)) - (rename-file file newname current-prefix-arg)) - (when oldbuf - (with-current-buffer oldbuf - (let ((buffer-read-only buffer-read-only)) - (set-visited-file-name newname nil t)) - (if (fboundp 'vc-refresh-state) - (vc-refresh-state) - (with-no-warnings - (vc-find-file-hook)))))) - (magit-refresh)) - -(defun magit-file-untrack (files &optional force) - "Untrack the selected FILES or one file read in the minibuffer. - -With a prefix argument FORCE do so even when the files have -staged as well as unstaged changes." - (interactive (list (or (--if-let (magit-region-values 'file t) - (progn - (unless (magit-file-tracked-p (car it)) - (user-error "Already untracked")) - (magit-confirm-files 'untrack it "Untrack")) - (list (magit-read-tracked-file "Untrack file")))) - current-prefix-arg)) - (magit-with-toplevel - (magit-run-git "rm" "--cached" (and force "--force") "--" files))) - -(defun magit-file-delete (files &optional force) - "Delete the selected FILES or one file read in the minibuffer. - -With a prefix argument FORCE do so even when the files have -uncommitted changes. When the files aren't being tracked in -Git, then fallback to using `delete-file'." - (interactive (list (--if-let (magit-region-values 'file t) - (magit-confirm-files 'delete it "Delete") - (list (magit-read-file "Delete file"))) - current-prefix-arg)) - (if (magit-file-tracked-p (car files)) - (magit-call-git "rm" (and force "--force") "--" files) - (let ((topdir (magit-toplevel))) - (dolist (file files) - (delete-file (expand-file-name file topdir) t)))) - (magit-refresh)) - -;;;###autoload -(defun magit-file-checkout (rev file) - "Checkout FILE from REV." - (interactive - (let ((rev (magit-read-branch-or-commit - "Checkout from revision" magit-buffer-revision))) - (list rev (magit-read-file-from-rev rev "Checkout file")))) - (magit-with-toplevel - (magit-run-git "checkout" rev "--" file))) - -;;; Read File - -(defvar magit-read-file-hist nil) - -(defun magit-read-file-from-rev (rev prompt &optional default) - (let ((files (magit-revision-files rev))) - (magit-completing-read - prompt files nil t nil 'magit-read-file-hist - (car (member (or default (magit-current-file)) files))))) - -(defun magit-read-file (prompt &optional tracked-only) - (let ((choices (nconc (magit-list-files) - (unless tracked-only (magit-untracked-files))))) - (magit-completing-read - prompt choices nil t nil nil - (car (member (or (magit-section-value-if '(file submodule)) - (magit-file-relative-name nil tracked-only)) - choices))))) - -(defun magit-read-tracked-file (prompt) - (magit-read-file prompt t)) - -(defun magit-read-file-choice (prompt files &optional error default) - "Read file from FILES. - -If FILES has only one member, return that instead of prompting. -If FILES has no members, give a user error. ERROR can be given -to provide a more informative error. - -If DEFAULT is non-nil, use this as the default value instead of -`magit-current-file'." - (pcase (length files) - (0 (user-error (or error "No file choices"))) - (1 (car files)) - (_ (magit-completing-read - prompt files nil t nil 'magit-read-file-hist - (car (member (or default (magit-current-file)) files)))))) - -(defun magit-read-changed-file (rev-or-range prompt &optional default) - (magit-read-file-choice - prompt - (magit-changed-files rev-or-range) - default - (concat "No file changed in " rev-or-range))) - -;;; _ -(provide 'magit-files) -;;; magit-files.el ends here diff --git a/elpa/magit-20200418.939/magit-files.elc b/elpa/magit-20200418.939/magit-files.elc deleted file mode 100644 index 0717d0edb328c549223a78a8302a43224deed994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26812 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 diff --git a/elpa/magit-20200418.939/magit-git.el b/elpa/magit-20200418.939/magit-git.el deleted file mode 100644 index f5268757..00000000 --- a/elpa/magit-20200418.939/magit-git.el +++ /dev/null @@ -1,2309 +0,0 @@ -;;; magit-git.el --- Git functionality -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements wrappers for various Git plumbing commands. - -;;; Code: - -(require 'cl-lib) -(require 'dash) - -(eval-when-compile - (require 'subr-x)) - -(require 'magit-utils) -(require 'magit-section) - -;; From `magit-branch'. -(defvar magit-branch-prefer-remote-upstream) -(defvar magit-published-branches) - -;; From `magit-margin'. -(declare-function magit-maybe-make-margin-overlay "magit-margin" ()) - -;; From `magit-mode'. -(declare-function magit-get-mode-buffer "magit-mode" - (mode &optional value frame)) -(declare-function magit-refresh "magit-mode" ()) -(defvar magit-buffer-diff-args) -(defvar magit-buffer-file-name) -(defvar magit-buffer-log-args) -(defvar magit-buffer-log-files) -(defvar magit-buffer-refname) -(defvar magit-buffer-revision) - -;; From `magit-process'. -(declare-function magit-call-git "magit-process" (&rest args)) -(declare-function magit-process-buffer "magit-process" (&optional nodisplay)) -(declare-function magit-process-file "magit-process" (&rest args)) -(declare-function magit-process-insert-section "magit-process" - (pwd program args &optional errcode errlog)) -(defvar magit-this-error) -(defvar magit-process-error-message-regexps) - -;; From later in `magit-git'. -(defvar magit-tramp-process-environment nil) - -(eval-when-compile - (cl-pushnew 'number eieio--known-slot-names)) - -;;; Git implementations - -(defvar magit-inhibit-libgit nil - "Whether to inhibit the use of libgit.") - -(defvar magit--libgit-available-p eieio-unbound - "Whether libgit is available. -Use the function by the same name instead of this variable.") - -(defun magit--libgit-available-p () - (if (eq magit--libgit-available-p eieio-unbound) - (setq magit--libgit-available-p - (and module-file-suffix - (let ((libgit (locate-library "libgit"))) - (and libgit - (or (locate-library "libegit2") - (let ((load-path - (cons (expand-file-name - (convert-standard-filename "build") - (file-name-directory libgit)) - load-path))) - (locate-library "libegit2"))))))) - magit--libgit-available-p)) - -(defun magit-gitimpl () - "Return the Git implementation used in this repository." - (if (and (not magit-inhibit-libgit) - (not (file-remote-p default-directory)) - (magit--libgit-available-p)) - 'libgit - 'git)) - -;;; Options - -;; For now this is shared between `magit-process' and `magit-git'. -(defgroup magit-process nil - "Git and other external processes used by Magit." - :group 'magit) - -(defvar magit-git-environment - (list (format "INSIDE_EMACS=%s,magit" emacs-version)) - "Prepended to `process-environment' while running git.") - -(defcustom magit-git-output-coding-system - (and (eq system-type 'windows-nt) 'utf-8) - "Coding system for receiving output from Git. - -If non-nil, the Git config value `i18n.logOutputEncoding' should -be set via `magit-git-global-arguments' to value consistent with -this." - :package-version '(magit . "2.9.0") - :group 'magit-process - :type '(choice (coding-system :tag "Coding system to decode Git output") - (const :tag "Use system default" nil))) - -(defvar magit-git-w32-path-hack nil - "Alist of (EXE . (PATHENTRY)). -This specifies what additional PATH setting needs to be added to -the environment in order to run the non-wrapper git executables -successfully.") - -(defcustom magit-git-executable - ;; Git might be installed in a different location on a remote, so - ;; it is better not to use the full path to the executable, except - ;; on Window were we would otherwise end up using one one of the - ;; wrappers "cmd/git.exe" or "cmd/git.cmd", which are much slower - ;; than using "bin/git.exe" directly. - (or (and (eq system-type 'windows-nt) - (--when-let (executable-find "git") - (ignore-errors - ;; Git for Windows 2.x provides cygpath so we can - ;; ask it for native paths. - (let* ((core-exe - (car - (process-lines - it "-c" - "alias.X=!x() { which \"$1\" | cygpath -mf -; }; x" - "X" "git"))) - (hack-entry (assoc core-exe magit-git-w32-path-hack)) - ;; Running the libexec/git-core executable - ;; requires some extra PATH entries. - (path-hack - (list (concat "PATH=" - (car (process-lines - it "-c" - "alias.P=!cygpath -wp \"$PATH\"" - "P")))))) - ;; The defcustom STANDARD expression can be - ;; evaluated many times, so make sure it is - ;; idempotent. - (if hack-entry - (setcdr hack-entry path-hack) - (push (cons core-exe path-hack) magit-git-w32-path-hack)) - core-exe)))) - "git") - "The Git executable used by Magit." - :group 'magit-process - :type 'string) - -(defcustom magit-git-global-arguments - `("--no-pager" "--literal-pathspecs" - "-c" "core.preloadindex=true" - "-c" "log.showSignature=false" - "-c" "color.ui=false" - "-c" "color.diff=false" - ,@(and (eq system-type 'windows-nt) - (list "-c" "i18n.logOutputEncoding=UTF-8"))) - "Global Git arguments. - -The arguments set here are used every time the git executable is -run as a subprocess. They are placed right after the executable -itself and before the git command - as in `git HERE... COMMAND -REST'. See the manpage `git(1)' for valid arguments. - -Be careful what you add here, especially if you are using Tramp -to connect to servers with ancient Git versions. Never remove -anything that is part of the default value, unless you really -know what you are doing. And think very hard before adding -something; it will be used every time Magit runs Git for any -purpose." - :package-version '(magit . "2.9.0") - :group 'magit-commands - :group 'magit-process - :type '(repeat string)) - -(defvar magit-git-debug nil - "Whether to enable additional reporting of git errors. - -Magit basically calls git for one of these two reasons: for -side-effects or to do something with its standard output. - -When git is run for side-effects then its output, including error -messages, go into the process buffer which is shown when using \ -\\\\[magit-process]. - -When git's output is consumed in some way, then it would be too -expensive to also insert it into this buffer, but when this -option is non-nil and git returns with a non-zero exit status, -then at least its standard error is inserted into this buffer. - -This is only intended for debugging purposes. Do not enable this -permanently, that would negatively affect performance.") - - -(defcustom magit-prefer-remote-upstream nil - "Whether to favor remote branches when reading the upstream branch. - -This controls whether commands that read a branch from the user -and then set it as the upstream branch, offer a local or a remote -branch as default completion candidate, when they have the choice. - -This affects all commands that use `magit-read-upstream-branch' -or `magit-read-starting-point', which includes most commands -that change the upstream and many that create new branches." - :package-version '(magit . "2.4.2") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-list-refs-sortby nil - "How to sort the ref collection in the prompt. - -This affects commands that read a ref. More specifically, it -controls the order of refs returned by `magit-list-refs', which -is called by functions like `magit-list-branch-names' to generate -the collection of refs. By default, refs are sorted according to -their full refname (i.e., 'refs/...'). - -Any value accepted by the `--sort' flag of `git for-each-ref' can -be used. For example, \"-creatordate\" places refs with more -recent committer or tagger dates earlier in the list. A list of -strings can also be given in order to pass multiple sort keys to -`git for-each-ref'. - -Note that, depending on the completion framework you use, this -may not be sufficient to change the order in which the refs are -displayed. It only controls the order of the collection passed -to `magit-completing-read' or, for commands that support reading -multiple strings, `read-from-minibuffer'. The completion -framework ultimately determines how the collection is displayed." - :package-version '(magit . "2.11.0") - :group 'magit-miscellaneous - :type '(choice string (repeat string))) - -;;; Git - -(defvar magit--refresh-cache nil) - -(defmacro magit--with-refresh-cache (key &rest body) - (declare (indent 1) (debug (form body))) - (let ((k (cl-gensym))) - `(if magit--refresh-cache - (let ((,k ,key)) - (--if-let (assoc ,k (cdr magit--refresh-cache)) - (progn (cl-incf (caar magit--refresh-cache)) - (cdr it)) - (cl-incf (cdar magit--refresh-cache)) - (let ((value ,(macroexp-progn body))) - (push (cons ,k value) - (cdr magit--refresh-cache)) - value))) - ,@body))) - -(defvar magit-with-editor-envvar "GIT_EDITOR" - "The environment variable exported by `magit-with-editor'. -Set this to \"GIT_SEQUENCE_EDITOR\" if you do not want to use -Emacs to edit commit messages but would like to do so to edit -rebase sequences.") - -(defmacro magit-with-editor (&rest body) - "Like `with-editor' but let-bind some more variables. -Also respect the value of `magit-with-editor-envvar'." - (declare (indent 0) (debug (body))) - `(let ((magit-process-popup-time -1) - ;; The user may have customized `shell-file-name' to - ;; something which results in `w32-shell-dos-semantics' nil - ;; (which changes the quoting style used by - ;; `shell-quote-argument'), but Git for Windows expects shell - ;; quoting in the dos style. - (shell-file-name (if (and (eq system-type 'windows-nt) - ;; If we have Cygwin mount points, - ;; the git flavor is cygwin, so dos - ;; shell quoting is probably wrong. - (not magit-cygwin-mount-points)) - "cmdproxy" - shell-file-name))) - (with-editor* magit-with-editor-envvar - ,@body))) - -(defun magit-process-git-arguments (args) - "Prepare ARGS for a function that invokes Git. - -Magit has many specialized functions for running Git; they all -pass arguments through this function before handing them to Git, -to do the following. - -* Flatten ARGS, removing nil arguments. -* Prepend `magit-git-global-arguments' to ARGS. -* On w32 systems, encode to `w32-ansi-code-page'." - (setq args (append magit-git-global-arguments (-flatten args))) - (if (and (eq system-type 'windows-nt) (boundp 'w32-ansi-code-page)) - ;; On w32, the process arguments *must* be encoded in the - ;; current code-page (see #3250). - (mapcar (lambda (arg) - (encode-coding-string - arg (intern (format "cp%d" w32-ansi-code-page)))) - args) - args)) - -(defun magit-git-exit-code (&rest args) - "Execute Git with ARGS, returning its exit code." - (apply #'magit-process-file magit-git-executable nil nil nil - (magit-process-git-arguments args))) - -(defun magit-git-success (&rest args) - "Execute Git with ARGS, returning t if its exit code is 0." - (= (magit-git-exit-code args) 0)) - -(defun magit-git-failure (&rest args) - "Execute Git with ARGS, returning t if its exit code is 1." - (= (magit-git-exit-code args) 1)) - -(defun magit-git-string-p (&rest args) - "Execute Git with ARGS, returning the first line of its output. -If the exit code isn't zero or if there is no output, then return -nil. Neither of these results is considered an error; if that is -what you want, then use `magit-git-string-ng' instead. - -This is an experimental replacement for `magit-git-string', and -still subject to major changes." - (magit--with-refresh-cache (cons default-directory args) - (with-temp-buffer - (and (zerop (apply #'magit-process-file magit-git-executable nil t nil - (magit-process-git-arguments args))) - (not (bobp)) - (progn - (goto-char (point-min)) - (buffer-substring-no-properties (point) (line-end-position))))))) - -(defun magit-git-string-ng (&rest args) - "Execute Git with ARGS, returning the first line of its output. -If the exit code isn't zero or if there is no output, then that -is considered an error, but instead of actually signaling an -error, return nil. Additionally the output is put in the process -buffer (creating it if necessary) and the error message is shown -in the status buffer (provided it exists). - -This is an experimental replacement for `magit-git-string', and -still subject to major changes. Also see `magit-git-string-p'." - (magit--with-refresh-cache - (list default-directory 'magit-git-string-ng args) - (with-temp-buffer - (let* ((args (magit-process-git-arguments args)) - (status (apply #'magit-process-file magit-git-executable - nil t nil args))) - (if (zerop status) - (and (not (bobp)) - (progn - (goto-char (point-min)) - (buffer-substring-no-properties - (point) (line-end-position)))) - (let ((buf (current-buffer))) - (with-current-buffer (magit-process-buffer t) - (magit-process-insert-section default-directory - magit-git-executable args - status buf))) - (when-let ((status-buf (magit-get-mode-buffer 'magit-status-mode))) - (let ((msg (magit--locate-error-message))) - (with-current-buffer status-buf - (setq magit-this-error msg)))) - nil))))) - -(defun magit-git-str (&rest args) - "Execute Git with ARGS, returning the first line of its output. -If there is no output, return nil. If the output begins with a -newline, return an empty string. Like `magit-git-string' but -ignore `magit-git-debug'." - (setq args (-flatten args)) - (magit--with-refresh-cache (cons default-directory args) - (with-temp-buffer - (apply #'magit-process-file magit-git-executable nil (list t nil) nil - (magit-process-git-arguments args)) - (unless (bobp) - (goto-char (point-min)) - (buffer-substring-no-properties (point) (line-end-position)))))) - -(defun magit-git-output (&rest args) - "Execute Git with ARGS, returning its output." - (setq args (-flatten args)) - (magit--with-refresh-cache (cons default-directory args) - (with-temp-buffer - (apply #'magit-process-file magit-git-executable nil (list t nil) nil - (magit-process-git-arguments args)) - (buffer-substring-no-properties (point-min) (point-max))))) - -(define-error 'magit-invalid-git-boolean "Not a Git boolean") - -(defun magit-git-true (&rest args) - "Execute Git with ARGS, returning t if it prints \"true\". -If it prints \"false\", then return nil. For any other output -signal `magit-invalid-git-boolean'." - (pcase (magit-git-output args) - ((or "true" "true\n") t) - ((or "false" "false\n") nil) - (output (signal 'magit-invalid-git-boolean output)))) - -(defun magit-git-false (&rest args) - "Execute Git with ARGS, returning t if it prints \"false\". -If it prints \"true\", then return nil. For any other output -signal `magit-invalid-git-boolean'." - (pcase (magit-git-output args) - ((or "true" "true\n") nil) - ((or "false" "false\n") t) - (output (signal 'magit-invalid-git-boolean output)))) - -(defun magit-git-insert (&rest args) - "Execute Git with ARGS, inserting its output at point. -If Git exits with a non-zero exit status, then show a message and -add a section in the respective process buffer." - (setq args (magit-process-git-arguments args)) - (if magit-git-debug - (let (log) - (unwind-protect - (progn - (setq log (make-temp-file "magit-stderr")) - (delete-file log) - (let ((exit (apply #'magit-process-file magit-git-executable - nil (list t log) nil args))) - (when (> exit 0) - (let ((msg "Git failed")) - (when (file-exists-p log) - (setq msg (with-temp-buffer - (insert-file-contents log) - (goto-char (point-max)) - (if (functionp magit-git-debug) - (funcall magit-git-debug (buffer-string)) - (magit--locate-error-message)))) - (let ((magit-git-debug nil)) - (with-current-buffer (magit-process-buffer t) - (magit-process-insert-section default-directory - magit-git-executable - args exit log)))) - (message "%s" msg))) - exit)) - (ignore-errors (delete-file log)))) - (apply #'magit-process-file magit-git-executable - nil (list t nil) nil args))) - -(defun magit--locate-error-message () - (goto-char (point-max)) - (and (run-hook-wrapped 'magit-process-error-message-regexps - (lambda (re) (re-search-backward re nil t))) - (match-string-no-properties 1))) - -(defun magit-git-string (&rest args) - "Execute Git with ARGS, returning the first line of its output. -If there is no output, return nil. If the output begins with a -newline, return an empty string." - (setq args (-flatten args)) - (magit--with-refresh-cache (cons default-directory args) - (with-temp-buffer - (apply #'magit-git-insert args) - (unless (bobp) - (goto-char (point-min)) - (buffer-substring-no-properties (point) (line-end-position)))))) - -(defun magit-git-lines (&rest args) - "Execute Git with ARGS, returning its output as a list of lines. -Empty lines anywhere in the output are omitted. - -If Git exits with a non-zero exit status, then report show a -message and add a section in the respective process buffer." - (with-temp-buffer - (apply #'magit-git-insert args) - (split-string (buffer-string) "\n" t))) - -(defun magit-git-items (&rest args) - "Execute Git with ARGS, returning its null-separated output as a list. -Empty items anywhere in the output are omitted. - -If Git exits with a non-zero exit status, then report show a -message and add a section in the respective process buffer." - (with-temp-buffer - (apply #'magit-git-insert args) - (split-string (buffer-string) "\0" t))) - -(defun magit-git-wash (washer &rest args) - "Execute Git with ARGS, inserting washed output at point. -Actually first insert the raw output at point. If there is no -output, call `magit-cancel-section'. Otherwise temporarily narrow -the buffer to the inserted text, move to its beginning, and then -call function WASHER with ARGS as its sole argument." - (declare (indent 1)) - (let ((beg (point))) - (setq args (-flatten args)) - (magit-git-insert args) - (if (= (point) beg) - (magit-cancel-section) - (unless (bolp) - (insert "\n")) - (save-restriction - (narrow-to-region beg (point)) - (goto-char beg) - (funcall washer args)) - (when (or (= (point) beg) - (= (point) (1+ beg))) - (magit-cancel-section)) - (magit-maybe-make-margin-overlay)))) - -(defun magit-git-version (&optional raw) - (--when-let (let (magit-git-global-arguments) - (ignore-errors (substring (magit-git-string "version") 12))) - (if raw it (and (string-match "\\`\\([0-9]+\\(\\.[0-9]+\\)\\{1,2\\}\\)" it) - (match-string 1 it))))) - -;;; Variables - -(defun magit-config-get-from-cached-list (key) - (gethash - ;; `git config --list' downcases first and last components of the key. - (--> key - (replace-regexp-in-string "\\`[^.]+" #'downcase it t t) - (replace-regexp-in-string "[^.]+\\'" #'downcase it t t)) - (magit--with-refresh-cache (cons (magit-toplevel) 'config) - (let ((configs (make-hash-table :test 'equal))) - (dolist (conf (magit-git-items "config" "--list" "-z")) - (let* ((nl-pos (cl-position ?\n conf)) - (key (substring conf 0 nl-pos)) - (val (if nl-pos (substring conf (1+ nl-pos)) ""))) - (puthash key (nconc (gethash key configs) (list val)) configs))) - configs)))) - -(defun magit-get (&rest keys) - "Return the value of the Git variable specified by KEYS." - (car (last (apply 'magit-get-all keys)))) - -(defun magit-get-all (&rest keys) - "Return all values of the Git variable specified by KEYS." - (let ((magit-git-debug nil) - (arg (and (or (null (car keys)) - (string-prefix-p "--" (car keys))) - (pop keys))) - (key (mapconcat 'identity keys "."))) - (if (and magit--refresh-cache (not arg)) - (magit-config-get-from-cached-list key) - (magit-git-items "config" arg "-z" "--get-all" key)))) - -(defun magit-get-boolean (&rest keys) - "Return the boolean value of the Git variable specified by KEYS." - (let ((key (mapconcat 'identity keys "."))) - (if magit--refresh-cache - (equal "true" (car (last (magit-config-get-from-cached-list key)))) - (equal (magit-git-str "config" "--bool" key) "true")))) - -(defun magit-set (value &rest keys) - "Set the value of the Git variable specified by KEYS to VALUE." - (let ((arg (and (or (null (car keys)) - (string-prefix-p "--" (car keys))) - (pop keys))) - (key (mapconcat 'identity keys "."))) - (if value - (magit-git-success "config" arg key value) - (magit-git-success "config" arg "--unset" key)) - value)) - -(gv-define-setter magit-get (val &rest keys) - `(magit-set ,val ,@keys)) - -(defun magit-set-all (values &rest keys) - "Set all values of the Git variable specified by KEYS to VALUES." - (let ((arg (and (or (null (car keys)) - (string-prefix-p "--" (car keys))) - (pop keys))) - (var (mapconcat 'identity keys "."))) - (when (magit-get var) - (magit-call-git "config" arg "--unset-all" var)) - (dolist (v values) - (magit-call-git "config" arg "--add" var v)))) - -;;; Files - -(defun magit--safe-default-directory (&optional file) - (catch 'unsafe-default-dir - (let ((dir (file-name-as-directory - (expand-file-name (or file default-directory)))) - (previous nil)) - (while (not (magit-file-accessible-directory-p dir)) - (setq dir (file-name-directory (directory-file-name dir))) - (when (equal dir previous) - (throw 'unsafe-default-dir nil)) - (setq previous dir)) - dir))) - -(defmacro magit--with-safe-default-directory (file &rest body) - (declare (indent 1) (debug (form body))) - `(when-let ((default-directory (magit--safe-default-directory ,file))) - ,@body)) - -(defun magit-gitdir (&optional directory) - "Return the absolute and resolved path of the .git directory. - -If the `GIT_DIR' environment variable is define then return that. -Otherwise return the .git directory for DIRECTORY, or if that is -nil, then for `default-directory' instead. If the directory is -not located inside a Git repository, then return nil." - (let ((default-directory (or directory default-directory))) - (magit-git-dir))) - -(defun magit-git-dir (&optional path) - "Return the absolute and resolved path of the .git directory. - -If the `GIT_DIR' environment variable is define then return that. -Otherwise return the .git directory for `default-directory'. If -the directory is not located inside a Git repository, then return -nil." - (magit--with-refresh-cache (list default-directory 'magit-git-dir path) - (magit--with-safe-default-directory nil - (when-let ((dir (magit-rev-parse-safe "--git-dir"))) - (setq dir (file-name-as-directory (magit-expand-git-file-name dir))) - (unless (file-remote-p dir) - (setq dir (concat (file-remote-p default-directory) dir))) - (if path (expand-file-name (convert-standard-filename path) dir) dir))))) - -(defvar magit--separated-gitdirs nil) - -(defun magit--record-separated-gitdir () - (let ((topdir (magit-toplevel)) - (gitdir (magit-git-dir))) - ;; Kludge: git-annex converts submodule gitdirs to symlinks. See #3599. - (when (file-symlink-p (directory-file-name gitdir)) - (setq gitdir (file-truename gitdir))) - ;; We want to delete the entry for `topdir' here, rather than within - ;; (unless ...), in case a `--separate-git-dir' repository was switched to - ;; the standard structure (i.e., "topdir/.git/"). - (setq magit--separated-gitdirs (cl-delete topdir - magit--separated-gitdirs - :key #'car :test #'equal)) - (unless (equal (file-name-as-directory (expand-file-name ".git" topdir)) - gitdir) - (push (cons topdir gitdir) magit--separated-gitdirs)))) - -(defun magit-toplevel (&optional directory) - "Return the absolute path to the toplevel of the current repository. - -From within the working tree or control directory of a repository -return the absolute path to the toplevel directory of the working -tree. As a special case, from within a bare repository return -the control directory instead. When called outside a repository -then return nil. - -When optional DIRECTORY is non-nil then return the toplevel for -that directory instead of the one for `default-directory'. - -Try to respect the option `find-file-visit-truename', i.e. when -the value of that option is nil, then avoid needlessly returning -the truename. When a symlink to a sub-directory of the working -tree is involved, or when called from within a sub-directory of -the gitdir or from the toplevel of a gitdir, which itself is not -located within the working tree, then it is not possible to avoid -returning the truename." - (magit--with-refresh-cache - (cons (or directory default-directory) 'magit-toplevel) - (magit--with-safe-default-directory directory - (if-let ((topdir (magit-rev-parse-safe "--show-toplevel"))) - (let (updir) - (setq topdir (magit-expand-git-file-name topdir)) - (if (and - ;; Always honor these settings. - (not find-file-visit-truename) - (not (getenv "GIT_WORK_TREE")) - ;; `--show-cdup' is the relative path to the toplevel - ;; from `(file-truename default-directory)'. Here we - ;; pretend it is relative to `default-directory', and - ;; go to that directory. Then we check whether - ;; `--show-toplevel' still returns the same value and - ;; whether `--show-cdup' now is the empty string. If - ;; both is the case, then we are at the toplevel of - ;; the same working tree, but also avoided needlessly - ;; following any symlinks. - (progn - (setq updir (file-name-as-directory - (magit-rev-parse-safe "--show-cdup"))) - (setq updir (if (file-name-absolute-p updir) - (concat (file-remote-p default-directory) updir) - (expand-file-name updir))) - (let ((default-directory updir)) - (and (string-equal (magit-rev-parse-safe "--show-cdup") "") - (--when-let (magit-rev-parse-safe "--show-toplevel") - (string-equal (magit-expand-git-file-name it) - topdir)))))) - updir - (concat (file-remote-p default-directory) - (file-name-as-directory topdir)))) - (when-let ((gitdir (magit-rev-parse-safe "--git-dir"))) - (setq gitdir (file-name-as-directory - (if (file-name-absolute-p gitdir) - ;; We might have followed a symlink. - (concat (file-remote-p default-directory) - (magit-expand-git-file-name gitdir)) - (expand-file-name gitdir)))) - (if (magit-bare-repo-p) - gitdir - (let* ((link (expand-file-name "gitdir" gitdir)) - (wtree (and (file-exists-p link) - (magit-file-line link)))) - (cond - ((and wtree - ;; Ignore .git/gitdir files that result from a - ;; Git bug. See #2364. - (not (equal wtree ".git"))) - ;; Return the linked working tree. - (file-name-directory wtree)) - ;; The working directory may not be the parent directory of - ;; .git if it was set up with `git init --separate-git-dir'. - ;; See #2955. - ((car (rassoc gitdir magit--separated-gitdirs))) - (t - ;; Step outside the control directory to enter the working tree. - (file-name-directory (directory-file-name gitdir))))))))))) - -(defmacro magit-with-toplevel (&rest body) - (declare (indent defun) (debug (body))) - (let ((toplevel (cl-gensym "toplevel"))) - `(let ((,toplevel (magit-toplevel))) - (if ,toplevel - (let ((default-directory ,toplevel)) - ,@body) - (magit--not-inside-repository-error))))) - -(define-error 'magit-outside-git-repo "Not inside Git repository") -(define-error 'magit-git-executable-not-found - "Git executable cannot be found (see https://magit.vc/goto/e6a78ed2)") - -(defun magit--not-inside-repository-error () - (if (executable-find magit-git-executable) - (signal 'magit-outside-git-repo default-directory) - (signal 'magit-git-executable-not-found magit-git-executable))) - -(defun magit-inside-gitdir-p (&optional noerror) - "Return t if `default-directory' is below the repository directory. -If it is below the working directory, then return nil. -If it isn't below either, then signal an error unless NOERROR -is non-nil, in which case return nil." - (and (magit--assert-default-directory noerror) - ;; Below a repository directory that is not located below the - ;; working directory "git rev-parse --is-inside-git-dir" prints - ;; "false", which is wrong. - (let ((gitdir (magit-git-dir))) - (cond (gitdir (file-in-directory-p default-directory gitdir)) - (noerror nil) - (t (signal 'magit-outside-git-repo default-directory)))))) - -(defun magit-inside-worktree-p (&optional noerror) - "Return t if `default-directory' is below the working directory. -If it is below the repository directory, then return nil. -If it isn't below either, then signal an error unless NOERROR -is non-nil, in which case return nil." - (and (magit--assert-default-directory noerror) - (condition-case nil - (magit-rev-parse-true "--is-inside-work-tree") - (magit-invalid-git-boolean - (and (not noerror) - (signal 'magit-outside-git-repo default-directory)))))) - -(cl-defgeneric magit-bare-repo-p (&optional noerror) - "Return t if the current repository is bare. -If it is non-bare, then return nil. If `default-directory' -isn't below a Git repository, then signal an error unless -NOERROR is non-nil, in which case return nil." - (and (magit--assert-default-directory noerror) - (condition-case nil - (magit-rev-parse-true "--is-bare-repository") - (magit-invalid-git-boolean - (and (not noerror) - (signal 'magit-outside-git-repo default-directory)))))) - -(defun magit--assert-default-directory (&optional noerror) - (or (file-directory-p default-directory) - (and (not noerror) - (let ((exists (file-exists-p default-directory))) - (signal (if exists 'file-error 'file-missing) - (list "Running git in directory" - (if exists - "Not a directory" - "No such file or directory") - default-directory)))))) - -(defun magit-git-repo-p (directory &optional non-bare) - "Return t if DIRECTORY is a Git repository. -When optional NON-BARE is non-nil also return nil if DIRECTORY is -a bare repository." - (and (file-directory-p directory) ; Avoid archives, see #3397. - (or (file-regular-p (expand-file-name ".git" directory)) - (file-directory-p (expand-file-name ".git" directory)) - (and (not non-bare) - (file-regular-p (expand-file-name "HEAD" directory)) - (file-directory-p (expand-file-name "refs" directory)) - (file-directory-p (expand-file-name "objects" directory)))))) - -(defun magit-file-relative-name (&optional file tracked) - "Return the path of FILE relative to the repository root. - -If optional FILE is nil or omitted, return the relative path of -the file being visited in the current buffer, if any, else nil. -If the file is not inside a Git repository, then return nil. - -If TRACKED is non-nil, return the path only if it matches a -tracked file." - (unless file - (with-current-buffer (or (buffer-base-buffer) - (current-buffer)) - (setq file (or magit-buffer-file-name buffer-file-name - (and (derived-mode-p 'dired-mode) default-directory))))) - (when (and file (or (not tracked) - (magit-file-tracked-p (file-relative-name file)))) - (--when-let (magit-toplevel - (magit--safe-default-directory - (directory-file-name (file-name-directory file)))) - (file-relative-name file it)))) - -(defun magit-file-tracked-p (file) - (magit-git-success "ls-files" "--error-unmatch" file)) - -(defun magit-list-files (&rest args) - (apply #'magit-git-items "ls-files" "-z" "--full-name" args)) - -(defun magit-tracked-files () - (magit-list-files "--cached")) - -(defun magit-untracked-files (&optional all files) - (magit-list-files "--other" (unless all "--exclude-standard") "--" files)) - -(defun magit-unstaged-files (&optional nomodules files) - (magit-git-items "diff-files" "-z" "--name-only" - (and nomodules "--ignore-submodules") - "--" files)) - -(defun magit-staged-files (&optional nomodules files) - (magit-git-items "diff-index" "-z" "--name-only" "--cached" - (and nomodules "--ignore-submodules") - (magit-headish) "--" files)) - -(defun magit-binary-files (&rest args) - (--mapcat (and (string-match "^-\t-\t\\(.+\\)" it) - (list (match-string 1 it))) - (apply #'magit-git-items - "diff" "-z" "--numstat" "--ignore-submodules" - args))) - -(defun magit-unmerged-files () - (magit-git-items "diff-files" "-z" "--name-only" "--diff-filter=U")) - -(defun magit-ignored-files () - (magit-git-items "ls-files" "-z" "--others" "--ignored" - "--exclude-standard" "--directory")) - -(defun magit-skip-worktree-files () - (--keep (and (and (= (aref it 0) ?S) - (substring it 2))) - (magit-list-files "-t"))) - -(defun magit-assume-unchanged-files () - (--keep (and (and (memq (aref it 0) '(?h ?s ?m ?r ?c ?k)) - (substring it 2))) - (magit-list-files "-v"))) - -(defun magit-revision-files (rev) - (magit-with-toplevel - (magit-git-items "ls-tree" "-z" "-r" "--name-only" rev))) - -(defun magit-changed-files (rev-or-range &optional other-rev) - "Return list of files the have changed between two revisions. -If OTHER-REV is non-nil, REV-OR-RANGE should be a revision, not a -range. Otherwise, it can be any revision or range accepted by -\"git diff\" (i.e., , .., or ...)." - (magit-with-toplevel - (magit-git-items "diff" "-z" "--name-only" rev-or-range other-rev))) - -(defun magit-renamed-files (revA revB) - (--map (cons (nth 1 it) (nth 2 it)) - (-partition 3 (magit-git-items - "diff-tree" "-r" "--diff-filter=R" "-z" "-M" - revA revB)))) - -(defun magit-file-status (&rest args) - (with-temp-buffer - (save-excursion (magit-git-insert "status" "-z" args)) - (let ((pos (point)) status) - (while (> (skip-chars-forward "[:print:]") 0) - (let ((x (char-after pos)) - (y (char-after (1+ pos))) - (file (buffer-substring (+ pos 3) (point)))) - (forward-char) - (if (memq x '(?R ?C)) - (progn - (setq pos (point)) - (skip-chars-forward "[:print:]") - (push (list file (buffer-substring pos (point)) x y) status) - (forward-char)) - (push (list file nil x y) status))) - (setq pos (point))) - status))) - -(defcustom magit-cygwin-mount-points - (when (eq system-type 'windows-nt) - (cl-sort (--map (if (string-match "^\\(.*\\) on \\(.*\\) type" it) - (cons (file-name-as-directory (match-string 2 it)) - (file-name-as-directory (match-string 1 it))) - (lwarn '(magit) :error - "Failed to parse Cygwin mount: %S" it)) - ;; If --exec-path is not a native Windows path, - ;; then we probably have a cygwin git. - (let ((process-environment - (append magit-git-environment process-environment))) - (and (not (string-match-p - "\\`[a-zA-Z]:" - (car (process-lines - magit-git-executable "--exec-path")))) - (ignore-errors (process-lines "mount"))))) - #'> :key (pcase-lambda (`(,cyg . ,_win)) (length cyg)))) - "Alist of (CYGWIN . WIN32) directory names. -Sorted from longest to shortest CYGWIN name." - :package-version '(magit . "2.3.0") - :group 'magit-process - :type '(alist :key-type string :value-type directory)) - -(defun magit-expand-git-file-name (filename) - (unless (file-name-absolute-p filename) - (setq filename (expand-file-name filename))) - (-if-let ((cyg . win) - (cl-assoc filename magit-cygwin-mount-points - :test (lambda (f cyg) (string-prefix-p cyg f)))) - (concat win (substring filename (length cyg))) - filename)) - -(defun magit-convert-filename-for-git (filename) - "Convert FILENAME so that it can be passed to git. -1. If it's a remote filename, then remove the remote part. -2. Deal with an `windows-nt' Emacs vs. Cygwin Git incompatibility." - (if (file-name-absolute-p filename) - (-if-let ((cyg . win) - (cl-rassoc filename magit-cygwin-mount-points - :test (lambda (f win) (string-prefix-p win f)))) - (concat cyg (substring filename (length win))) - (or (file-remote-p filename 'localname) - filename)) - filename)) - -(defun magit-decode-git-path (path) - (if (eq (aref path 0) ?\") - (decode-coding-string (read path) - (or magit-git-output-coding-system - (car default-process-coding-system)) - t) - path)) - -(defun magit-file-at-point (&optional expand assert) - (if-let ((file (magit-section-case - (file (oref it value)) - (hunk (magit-section-parent-value it))))) - (if expand - (expand-file-name file (magit-toplevel)) - file) - (when assert - (user-error "No file at point")))) - -(defun magit-current-file () - (or (magit-file-relative-name) - (magit-file-at-point) - (and (derived-mode-p 'magit-log-mode) - (car magit-buffer-log-files)))) - -;;; Predicates - -(defun magit-no-commit-p () - "Return t if there is no commit in the current Git repository." - (not (magit-rev-verify "HEAD"))) - -(defun magit-merge-commit-p (commit) - "Return t if COMMIT is a merge commit." - (> (length (magit-commit-parents commit)) 1)) - -(defun magit-anything-staged-p (&optional ignore-submodules &rest files) - "Return t if there are any staged changes. -If optional FILES is non-nil, then only changes to those files -are considered." - (magit-git-failure "diff" "--quiet" "--cached" - (and ignore-submodules "--ignore-submodules") - "--" files)) - -(defun magit-anything-unstaged-p (&optional ignore-submodules &rest files) - "Return t if there are any unstaged changes. -If optional FILES is non-nil, then only changes to those files -are considered." - (magit-git-failure "diff" "--quiet" - (and ignore-submodules "--ignore-submodules") - "--" files)) - -(defun magit-anything-modified-p (&optional ignore-submodules &rest files) - "Return t if there are any staged or unstaged changes. -If optional FILES is non-nil, then only changes to those files -are considered." - (or (apply 'magit-anything-staged-p ignore-submodules files) - (apply 'magit-anything-unstaged-p ignore-submodules files))) - -(defun magit-anything-unmerged-p (&rest files) - "Return t if there are any merge conflicts. -If optional FILES is non-nil, then only conflicts in those files -are considered." - (and (magit-git-string "ls-files" "--unmerged" files) t)) - -(defun magit-module-worktree-p (module) - (magit-with-toplevel - (file-exists-p (expand-file-name (expand-file-name ".git" module))))) - -(defun magit-module-no-worktree-p (module) - (not (magit-module-worktree-p module))) - -(defun magit-ignore-submodules-p (&optional return-argument) - (or (cl-find-if (lambda (arg) - (string-prefix-p "--ignore-submodules" arg)) - magit-buffer-diff-args) - (when-let ((value (magit-get "diff.ignoreSubmodules"))) - (if return-argument - (concat "--ignore-submodules=" value) - (concat "diff.ignoreSubmodules=" value))))) - -;;; Revisions and References - -(defun magit-rev-parse (&rest args) - "Execute `git rev-parse ARGS', returning first line of output. -If there is no output, return nil." - (apply #'magit-git-string "rev-parse" args)) - -(defun magit-rev-parse-safe (&rest args) - "Execute `git rev-parse ARGS', returning first line of output. -If there is no output, return nil. Like `magit-rev-parse' but -ignore `magit-git-debug'." - (apply #'magit-git-str "rev-parse" args)) - -(defun magit-rev-parse-true (&rest args) - "Execute `git rev-parse ARGS', returning t if it prints \"true\". -If it prints \"false\", then return nil. For any other output -signal an error." - (magit-git-true "rev-parse" args)) - -(defun magit-rev-parse-false (&rest args) - "Execute `git rev-parse ARGS', returning t if it prints \"false\". -If it prints \"true\", then return nil. For any other output -signal an error." - (magit-git-false "rev-parse" args)) - -(defun magit-rev-parse-p (&rest args) - "Execute `git rev-parse ARGS', returning t if it prints \"true\". -Return t if the first (and usually only) output line is the -string \"true\", otherwise return nil." - (equal (magit-git-str "rev-parse" args) "true")) - -(defun magit-rev-verify (rev) - (magit-git-string-p "rev-parse" "--verify" rev)) - -(defun magit-commit-p (rev) - "Return full hash for REV if it names an existing commit." - (magit-rev-verify (concat rev "^{commit}"))) - -(defalias 'magit-rev-verify-commit 'magit-commit-p) - -(defalias 'magit-rev-hash 'magit-commit-p) - -(defun magit-rev-equal (a b) - "Return t if there are no differences between the commits A and B." - (magit-git-success "diff" "--quiet" a b)) - -(defun magit-rev-eq (a b) - "Return t if A and B refer to the same commit." - (let ((a (magit-commit-p a)) - (b (magit-commit-p b))) - (and a b (equal a b)))) - -(defun magit-rev-ancestor-p (a b) - "Return non-nil if commit A is an ancestor of commit B." - (magit-git-success "merge-base" "--is-ancestor" a b)) - -(defun magit-rev-head-p (rev) - (or (equal rev "HEAD") - (and rev - (not (string-match-p "\\.\\." rev)) - (equal (magit-rev-parse rev) - (magit-rev-parse "HEAD"))))) - -(defun magit-rev-author-p (rev) - "Return t if the user is the author of REV. -More precisely return t if `user.name' is equal to the author -name of REV and/or `user.email' is equal to the author email -of REV." - (or (equal (magit-get "user.name") (magit-rev-format "%an" rev)) - (equal (magit-get "user.email") (magit-rev-format "%ae" rev)))) - -(defun magit-rev-name (rev &optional pattern not-anchored) - "Return a symbolic name for REV using `git-name-rev'. - -PATTERN can be used to limit the result to a matching ref. -Unless NOT-ANCHORED is non-nil, the beginning of the ref must -match PATTERN. - -An anchored lookup is done using the arguments -\"--exclude=*/ --exclude=*/HEAD\" in addition to -\"--refs=\", provided at least version v2.13 of Git is -used. Older versions did not support the \"--exclude\" argument. -When \"--exclude\" cannot be used and `git-name-rev' returns a -ref that should have been excluded, then that is discarded and -this function returns nil instead. This is unfortunate because -there might be other refs that do match. To fix that, update -Git." - (if (version< (magit-git-version) "2.13") - (when-let - ((ref (magit-git-string "name-rev" "--name-only" "--no-undefined" - (and pattern (concat "--refs=" pattern)) - rev))) - (if (and pattern - (string-match-p "\\`refs/[^/]+/\\*\\'" pattern)) - (let ((namespace (substring pattern 0 -1))) - (and (not (or (string-suffix-p "HEAD" ref) - (and (string-match-p namespace ref) - (not (magit-rev-verify - (concat namespace ref)))))) - ref)) - ref)) - (magit-git-string "name-rev" "--name-only" "--no-undefined" - (and pattern (concat "--refs=" pattern)) - (and pattern - (not not-anchored) - (list "--exclude=*/HEAD" - (concat "--exclude=*/" pattern))) - rev))) - -(defun magit-rev-branch (rev) - (--when-let (magit-rev-name rev "refs/heads/*") - (unless (string-match-p "[~^]" it) it))) - -(defun magit-get-shortname (rev) - (let* ((fn (apply-partially 'magit-rev-name rev)) - (name (or (funcall fn "refs/tags/*") - (funcall fn "refs/heads/*") - (funcall fn "refs/remotes/*")))) - (cond ((not name) - (magit-rev-parse "--short" rev)) - ((string-match "^\\(?:tags\\|remotes\\)/\\(.+\\)" name) - (if (magit-ref-ambiguous-p (match-string 1 name)) - name - (match-string 1 name))) - (t (magit-ref-maybe-qualify name))))) - -(defun magit-name-branch (rev &optional lax) - (or (magit-name-local-branch rev) - (magit-name-remote-branch rev) - (and lax (or (magit-name-local-branch rev t) - (magit-name-remote-branch rev t))))) - -(defun magit-name-local-branch (rev &optional lax) - (--when-let (magit-rev-name rev "refs/heads/*") - (and (or lax (not (string-match-p "[~^]" it))) it))) - -(defun magit-name-remote-branch (rev &optional lax) - (--when-let (magit-rev-name rev "refs/remotes/*") - (and (or lax (not (string-match-p "[~^]" it))) - (substring it 8)))) - -(defun magit-name-tag (rev &optional lax) - (--when-let (magit-rev-name rev "refs/tags/*") - (and (or lax (not (string-match-p "[~^]" it))) - (substring it 5)))) - -(defun magit-ref-abbrev (refname) - "Return an unambiguous abbreviation of REFNAME." - (magit-rev-parse "--verify" "--abbrev-ref" refname)) - -(defun magit-ref-fullname (refname) - "Return fully qualified refname for REFNAME. -If REFNAME is ambiguous, return nil." - (magit-rev-parse "--verify" "--symbolic-full-name" refname)) - -(defun magit-ref-ambiguous-p (refname) - (save-match-data - (if (string-match "\\`\\([^^~]+\\)\\(.*\\)" refname) - (not (magit-ref-fullname (match-string 1 refname))) - (error "%S has an unrecognized format" refname)))) - -(defun magit-ref-maybe-qualify (refname &optional prefix) - "If REFNAME is ambiguous, try to disambiguate it by prepend PREFIX to it. -Return an unambiguous refname, either REFNAME or that prefixed -with PREFIX, nil otherwise. If REFNAME has an offset suffix -such as \"~1\", then that is preserved. If optional PREFIX is -nil, then use \"heads/\". " - (if (magit-ref-ambiguous-p refname) - (let ((refname (concat (or prefix "heads/") refname))) - (and (not (magit-ref-ambiguous-p refname)) refname)) - refname)) - -(defun magit-ref-exists-p (ref) - (magit-git-success "show-ref" "--verify" ref)) - -(defun magit-ref-equal (a b) - "Return t if the refnames A and B are `equal'. -A symbolic-ref pointing to some ref, is `equal' to that ref, -as are two symbolic-refs pointing to the same ref. Refnames -may be abbreviated." - (let ((a (magit-ref-fullname a)) - (b (magit-ref-fullname b))) - (and a b (equal a b)))) - -(defun magit-ref-eq (a b) - "Return t if the refnames A and B are `eq'. -A symbolic-ref is `eq' to itself, but not to the ref it points -to, or to some other symbolic-ref that points to the same ref." - (let ((symbolic-a (magit-symbolic-ref-p a)) - (symbolic-b (magit-symbolic-ref-p b))) - (or (and symbolic-a - symbolic-b - (equal a b)) - (and (not symbolic-a) - (not symbolic-b) - (magit-ref-equal a b))))) - -(defun magit-headish () - "Return \"HEAD\" or if that doesn't exist the hash of the empty tree." - (if (magit-no-commit-p) - (magit-git-string "mktree") - "HEAD")) - -(defun magit-branch-at-point () - (magit-section-case - (branch (oref it value)) - (commit (or (magit--painted-branch-at-point) - (magit-name-branch (oref it value)))))) - -(defun magit--painted-branch-at-point (&optional type) - (or (and (not (eq type 'remote)) - (memq (get-text-property (point) 'font-lock-face) - (list 'magit-branch-local - 'magit-branch-current)) - (when-let ((branch (thing-at-point 'git-revision t))) - (cdr (magit-split-branch-name branch)))) - (and (not (eq type 'local)) - (memq (get-text-property (point) 'font-lock-face) - (list 'magit-branch-remote - 'magit-branch-remote-head)) - (thing-at-point 'git-revision t)))) - -(defun magit-local-branch-at-point () - (magit-section-case - (branch (let ((branch (magit-ref-maybe-qualify (oref it value)))) - (when (member branch (magit-list-local-branch-names)) - branch))) - (commit (or (magit--painted-branch-at-point 'local) - (magit-name-local-branch (oref it value)))))) - -(defun magit-remote-branch-at-point () - (magit-section-case - (branch (let ((branch (oref it value))) - (when (member branch (magit-list-remote-branch-names)) - branch))) - (commit (or (magit--painted-branch-at-point 'remote) - (magit-name-remote-branch (oref it value)))))) - -(defun magit-commit-at-point () - (or (magit-section-value-if 'commit) - (and (derived-mode-p 'magit-stash-mode - 'magit-merge-preview-mode - 'magit-revision-mode) - magit-buffer-revision))) - -(defun magit-branch-or-commit-at-point () - (or (and magit-buffer-file-name - magit-buffer-refname) - (magit-section-case - (branch (magit-ref-maybe-qualify (oref it value))) - (commit (or (magit--painted-branch-at-point) - (let ((rev (oref it value))) - (or (magit-name-branch rev) rev)))) - (tag (magit-ref-maybe-qualify (oref it value) "tags/")) - (pullreq (or (and (fboundp 'forge--pullreq-branch) - (magit-branch-p - (forge--pullreq-branch (oref it value)))) - (magit-ref-p (format "refs/pullreqs/%s" - (oref (oref it value) number)))))) - (thing-at-point 'git-revision t) - (and (derived-mode-p 'magit-stash-mode - 'magit-merge-preview-mode - 'magit-revision-mode) - magit-buffer-revision))) - -(defun magit-tag-at-point () - (magit-section-case - (tag (oref it value)) - (commit (magit-name-tag (oref it value))))) - -(defun magit-stash-at-point () - (magit-section-value-if 'stash)) - -(defun magit-remote-at-point () - (magit-section-case - (remote (oref it value)) - (branch (magit-section-parent-value it)))) - -(defun magit-module-at-point (&optional predicate) - (when (magit-section-match 'magit-module-section) - (let ((module (oref (magit-current-section) value))) - (and (or (not predicate) - (funcall predicate module)) - module)))) - -(defun magit-get-current-branch () - "Return the refname of the currently checked out branch. -Return nil if no branch is currently checked out." - (magit-git-string "symbolic-ref" "--short" "HEAD")) - -(defvar magit-get-previous-branch-timeout 0.5 - "Maximum time to spend in `magit-get-previous-branch'. -Given as a number of seconds.") - -(defun magit-get-previous-branch () - "Return the refname of the previously checked out branch. -Return nil if no branch can be found in the `HEAD' reflog -which is different from the current branch and still exists. -The amount of time spent searching is limited by -`magit-get-previous-branch-timeout'." - (let ((t0 (float-time)) - (current (magit-get-current-branch)) - (i 1) prev) - (while (if (> (- (float-time) t0) magit-get-previous-branch-timeout) - (setq prev nil) ;; Timed out. - (and (setq prev (magit-rev-verify (format "@{-%i}" i))) - (or (not (setq prev (magit-rev-branch prev))) - (equal prev current)))) - (cl-incf i)) - prev)) - -(defun magit-set-upstream-branch (branch upstream) - "Set UPSTREAM as the upstream of BRANCH. -If UPSTREAM is nil, then unset BRANCH's upstream. -Otherwise UPSTREAM has to be an existing branch." - (if upstream - (magit-call-git "branch" "--set-upstream-to" upstream branch) - (magit-call-git "branch" "--unset-upstream" branch))) - -(defun magit-get-upstream-ref (&optional branch) - "Return the upstream branch of BRANCH as a fully qualified ref. -It BRANCH is nil, then return the upstream of the current branch, -if any, nil otherwise. If the upstream is not configured, the -configured remote is an url, or the named branch does not exist, -then return nil. I.e. return an existing local or -remote-tracking branch ref." - (when-let ((branch (or branch (magit-get-current-branch)))) - (magit-ref-fullname (concat branch "@{upstream}")))) - -(defun magit-get-upstream-branch (&optional branch) - "Return the name of the upstream branch of BRANCH. -It BRANCH is nil, then return the upstream of the current branch -if any, nil otherwise. If the upstream is not configured, the -configured remote is an url, or the named branch does not exist, -then return nil. I.e. return the name of an existing local or -remote-tracking branch. The returned string is colorized -according to the branch type." - (when-let ((branch (or branch (magit-get-current-branch))) - (upstream (magit-ref-abbrev (concat branch "@{upstream}")))) - (magit--propertize-face - upstream (if (equal (magit-get "branch" branch "remote") ".") - 'magit-branch-local - 'magit-branch-remote)))) - -(defun magit-get-indirect-upstream-branch (branch &optional force) - (let ((remote (magit-get "branch" branch "remote"))) - (and remote (not (equal remote ".")) - ;; The user has opted in... - (or force - (--some (if (magit-git-success "check-ref-format" "--branch" it) - (equal it branch) - (string-match-p it branch)) - magit-branch-prefer-remote-upstream)) - ;; and local BRANCH tracks a remote branch... - (let ((upstream (magit-get-upstream-branch branch))) - ;; whose upstream... - (and upstream - ;; has the same name as BRANCH... - (equal (substring upstream (1+ (length remote))) branch) - ;; and can be fast-forwarded to BRANCH. - (magit-rev-ancestor-p upstream branch) - upstream))))) - -(defun magit-get-upstream-remote (&optional branch allow-unnamed) - (when-let ((branch (or branch (magit-get-current-branch))) - (remote (magit-get "branch" branch "remote"))) - (and (not (equal remote ".")) - (cond ((member remote (magit-list-remotes)) - (magit--propertize-face remote 'magit-branch-remote)) - ((and allow-unnamed - (string-match-p "\\(\\`.\\{0,2\\}/\\|[:@]\\)" remote)) - (magit--propertize-face remote 'bold)))))) - -(defun magit-get-unnamed-upstream (&optional branch) - (when-let ((branch (or branch (magit-get-current-branch))) - (remote (magit-get "branch" branch "remote")) - (merge (magit-get "branch" branch "merge"))) - (and (magit--unnamed-upstream-p remote merge) - (list (magit--propertize-face remote 'bold) - (magit--propertize-face merge 'magit-branch-remote))))) - -(defun magit--unnamed-upstream-p (remote merge) - (and remote (string-match-p "\\(\\`\\.\\{0,2\\}/\\|[:@]\\)" remote) - merge (string-prefix-p "refs/" merge))) - -(defun magit--valid-upstream-p (remote merge) - (and (or (equal remote ".") - (member remote (magit-list-remotes))) - (string-prefix-p "refs/" merge))) - -(defun magit-get-current-remote (&optional allow-unnamed) - (or (magit-get-upstream-remote nil allow-unnamed) - (when-let ((remotes (magit-list-remotes)) - (remote (if (= (length remotes) 1) - (car remotes) - (car (member "origin" remotes))))) - (magit--propertize-face remote 'magit-branch-remote)))) - -(defun magit-get-push-remote (&optional branch) - (when-let ((remote - (or (and (or branch (setq branch (magit-get-current-branch))) - (magit-get "branch" branch "pushRemote")) - (magit-get "remote.pushDefault")))) - (magit--propertize-face remote 'magit-branch-remote))) - -(defun magit-get-push-branch (&optional branch verify) - (when-let ((branch (or branch (setq branch (magit-get-current-branch)))) - (remote (magit-get-push-remote branch)) - (target (concat remote "/" branch))) - (and (or (not verify) - (magit-rev-verify target)) - (magit--propertize-face target 'magit-branch-remote)))) - -(defun magit-get-@{push}-branch (&optional branch) - (let ((ref (magit-rev-parse "--symbolic-full-name" - (concat branch "@{push}")))) - (when (and ref (string-prefix-p "refs/remotes/" ref)) - (substring ref 13)))) - -(defun magit-get-remote (&optional branch) - (when (or branch (setq branch (magit-get-current-branch))) - (let ((remote (magit-get "branch" branch "remote"))) - (unless (equal remote ".") - remote)))) - -(defun magit-get-some-remote (&optional branch) - (or (magit-get-remote branch) - (and (magit-branch-p "master") - (magit-get-remote "master")) - (let ((remotes (magit-list-remotes))) - (or (car (member "origin" remotes)) - (car remotes))))) - -(defun magit-branch-merged-p (branch &optional target) - "Return non-nil if BRANCH is merged into its upstream and TARGET. - -TARGET defaults to the current branch. If `HEAD' is detached and -TARGET is nil, then always return nil. As a special case, if -TARGET is t, then return non-nil if BRANCH is merged into any one -of the other local branches. - -If, and only if, BRANCH has an upstream, then only return non-nil -if BRANCH is merged into both TARGET (as described above) as well -as into its upstream." - (and (--if-let (and (magit-branch-p branch) - (magit-get-upstream-branch branch)) - (magit-git-success "merge-base" "--is-ancestor" branch it) - t) - (if (eq target t) - (delete (magit-name-local-branch branch) - (magit-list-containing-branches branch)) - (--when-let (or target (magit-get-current-branch)) - (magit-git-success "merge-base" "--is-ancestor" branch it))))) - -(defun magit-get-tracked (refname) - "Return the remote branch tracked by the remote-tracking branch REFNAME. -The returned value has the form (REMOTE . REF), where REMOTE is -the name of a remote and REF is the ref local to the remote." - (when-let ((ref (magit-ref-fullname refname))) - (save-match-data - (-some (lambda (line) - (and (string-match "\ -\\`remote\\.\\([^.]+\\)\\.fetch=\\+?\\([^:]+\\):\\(.+\\)" line) - (let ((rmt (match-string 1 line)) - (src (match-string 2 line)) - (dst (match-string 3 line))) - (and (string-match (format "\\`%s\\'" - (replace-regexp-in-string - "*" "\\(.+\\)" dst t t)) - ref) - (cons rmt (replace-regexp-in-string - "*" (match-string 1 ref) src)))))) - (magit-git-lines "config" "--local" "--list"))))) - -(defun magit-split-branch-name (branch) - (cond ((member branch (magit-list-local-branch-names)) - (cons "." branch)) - ((string-match "/" branch) - (or (-some (lambda (remote) - (and (string-match (format "\\`\\(%s\\)/\\(.+\\)\\'" remote) - branch) - (cons (match-string 1 branch) - (match-string 2 branch)))) - (magit-list-remotes)) - (error "Invalid branch name %s" branch))))) - -(defun magit-get-current-tag (&optional rev with-distance) - "Return the closest tag reachable from REV. - -If optional REV is nil, then default to `HEAD'. -If optional WITH-DISTANCE is non-nil then return (TAG COMMITS), -if it is `dirty' return (TAG COMMIT DIRTY). COMMITS is the number -of commits in `HEAD' but not in TAG and DIRTY is t if there are -uncommitted changes, nil otherwise." - (--when-let (magit-git-str "describe" "--long" "--tags" - (and (eq with-distance 'dirty) "--dirty") rev) - (save-match-data - (string-match - "\\(.+\\)-\\(?:0[0-9]*\\|\\([0-9]+\\)\\)-g[0-9a-z]+\\(-dirty\\)?$" it) - (if with-distance - `(,(match-string 1 it) - ,(string-to-number (or (match-string 2 it) "0")) - ,@(and (match-string 3 it) (list t))) - (match-string 1 it))))) - -(defun magit-get-next-tag (&optional rev with-distance) - "Return the closest tag from which REV is reachable. - -If optional REV is nil, then default to `HEAD'. -If no such tag can be found or if the distance is 0 (in which -case it is the current tag, not the next), return nil instead. -If optional WITH-DISTANCE is non-nil, then return (TAG COMMITS) -where COMMITS is the number of commits in TAG but not in REV." - (--when-let (magit-git-str "describe" "--contains" (or rev "HEAD")) - (save-match-data - (when (string-match "^[^^~]+" it) - (setq it (match-string 0 it)) - (unless (equal it (magit-get-current-tag rev)) - (if with-distance - (list it (car (magit-rev-diff-count it rev))) - it)))))) - -(defvar magit-list-refs-namespaces - '("refs/heads" "refs/remotes" "refs/tags" "refs/pull")) - -(defun magit-list-refs (&optional namespaces format sortby) - "Return list of references. - -When NAMESPACES is non-nil, list refs from these namespaces -rather than those from `magit-list-refs-namespaces'. - -FORMAT is passed to the `--format' flag of `git for-each-ref' -and defaults to \"%(refname)\". If the format is \"%(refname)\" -or \"%(refname:short)\", then drop the symbolic-ref \"HEAD\". - -SORTBY is a key or list of keys to pass to the `--sort' flag of -`git for-each-ref'. When nil, use `magit-list-refs-sortby'" - (unless format - (setq format "%(refname)")) - (let ((refs (magit-git-lines "for-each-ref" - (concat "--format=" format) - (--map (concat "--sort=" it) - (pcase (or sortby magit-list-refs-sortby) - ((and val (pred stringp)) (list val)) - ((and val (pred listp)) val))) - (or namespaces magit-list-refs-namespaces)))) - (if (member format '("%(refname)" "%(refname:short)")) - (--remove (string-match-p "\\(\\`\\|/\\)HEAD\\'" it) refs) - refs))) - -(defun magit-list-branches () - (magit-list-refs (list "refs/heads" "refs/remotes"))) - -(defun magit-list-local-branches () - (magit-list-refs "refs/heads")) - -(defun magit-list-remote-branches (&optional remote) - (magit-list-refs (concat "refs/remotes/" remote))) - -(defun magit-list-related-branches (relation &optional commit &rest args) - (--remove (string-match-p "\\(\\`(HEAD\\|HEAD -> \\)" it) - (--map (substring it 2) - (magit-git-lines "branch" args relation commit)))) - -(defun magit-list-containing-branches (&optional commit &rest args) - (magit-list-related-branches "--contains" commit args)) - -(defun magit-list-publishing-branches (&optional commit) - (--filter (magit-rev-ancestor-p commit it) - magit-published-branches)) - -(defun magit-list-merged-branches (&optional commit &rest args) - (magit-list-related-branches "--merged" commit args)) - -(defun magit-list-unmerged-branches (&optional commit &rest args) - (magit-list-related-branches "--no-merged" commit args)) - -(defun magit-list-unmerged-to-upstream-branches () - (--filter (when-let ((upstream (magit-get-upstream-branch it))) - (member it (magit-list-unmerged-branches upstream))) - (magit-list-local-branch-names))) - -(defun magit-list-branches-pointing-at (commit) - (let ((re (format "\\`%s refs/\\(heads\\|remotes\\)/\\(.*\\)\\'" - (magit-rev-verify commit)))) - (--keep (and (string-match re it) - (let ((name (match-string 2 it))) - (and (not (string-suffix-p "HEAD" name)) - name))) - (magit-git-lines "show-ref")))) - -(defun magit-list-refnames (&optional namespaces include-special) - (nconc (magit-list-refs namespaces "%(refname:short)") - (and include-special - (magit-list-special-refnames)))) - -(defvar magit-special-refnames - '("HEAD" "ORIG_HEAD" "FETCH_HEAD" "MERGE_HEAD" "CHERRY_PICK_HEAD")) - -(defun magit-list-special-refnames () - (let ((gitdir (magit-gitdir))) - (cl-mapcan (lambda (name) - (and (file-exists-p (expand-file-name name gitdir)) - (list name))) - magit-special-refnames))) - -(defun magit-list-branch-names () - (magit-list-refnames (list "refs/heads" "refs/remotes"))) - -(defun magit-list-local-branch-names () - (magit-list-refnames "refs/heads")) - -(defun magit-list-remote-branch-names (&optional remote relative) - (if (and remote relative) - (let ((regexp (format "^refs/remotes/%s/\\(.+\\)" remote))) - (--mapcat (when (string-match regexp it) - (list (match-string 1 it))) - (magit-list-remote-branches remote))) - (magit-list-refnames (concat "refs/remotes/" remote)))) - -(defun magit-format-refs (format &rest args) - (let ((lines (magit-git-lines - "for-each-ref" (concat "--format=" format) - (or args (list "refs/heads" "refs/remotes" "refs/tags"))))) - (if (string-match-p "\f" format) - (--map (split-string it "\f") lines) - lines))) - -(defun magit-list-remotes () - (magit-git-lines "remote")) - -(defun magit-list-tags () - (magit-git-lines "tag")) - -(defun magit-list-stashes (&optional format) - (magit-git-lines "stash" "list" (concat "--format=" (or format "%gd")))) - -(defun magit-list-active-notes-refs () - "Return notes refs according to `core.notesRef' and `notes.displayRef'." - (magit-git-lines "for-each-ref" "--format=%(refname)" - (or (magit-get "core.notesRef") "refs/notes/commits") - (magit-get-all "notes.displayRef"))) - -(defun magit-list-notes-refnames () - (--map (substring it 6) (magit-list-refnames "refs/notes"))) - -(defun magit-remote-list-tags (remote) - (--keep (and (not (string-match-p "\\^{}$" it)) - (substring it 51)) - (magit-git-lines "ls-remote" "--tags" remote))) - -(defun magit-remote-list-branches (remote) - (--keep (and (not (string-match-p "\\^{}$" it)) - (substring it 52)) - (magit-git-lines "ls-remote" "--heads" remote))) - -(defun magit-remote-list-refs (remote) - (--keep (and (not (string-match-p "\\^{}$" it)) - (substring it 41)) - (magit-git-lines "ls-remote" remote))) - -(defun magit-list-module-paths () - (--mapcat (and (string-match "^160000 [0-9a-z]\\{40\\} 0\t\\(.+\\)$" it) - (list (match-string 1 it))) - (magit-git-items "ls-files" "-z" "--stage"))) - -(defun magit-get-submodule-name (path) - "Return the name of the submodule at PATH. -PATH has to be relative to the super-repository." - (cadr (split-string - (car (or (magit-git-items - "config" "-z" - "-f" (expand-file-name ".gitmodules" (magit-toplevel)) - "--get-regexp" "^submodule\\..*\\.path$" - (concat "^" (regexp-quote (directory-file-name path)) "$")) - (error "No such submodule `%s'" path))) - "\n"))) - -(defun magit-list-worktrees () - (let (worktrees worktree) - (dolist (line (let ((magit-git-global-arguments - ;; KLUDGE At least in v2.8.3 this triggers a segfault. - (remove "--no-pager" magit-git-global-arguments))) - (magit-git-lines "worktree" "list" "--porcelain"))) - (cond ((string-prefix-p "worktree" line) - (push (setq worktree (list (substring line 9) nil nil nil)) - worktrees)) - ((string-equal line "bare") - (let* ((default-directory (car worktree)) - (wt (and (not (magit-get-boolean "core.bare")) - (magit-get "core.worktree")))) - (if (and wt (file-exists-p (expand-file-name wt))) - (progn (setf (nth 0 worktree) (expand-file-name wt)) - (setf (nth 2 worktree) (magit-rev-parse "HEAD")) - (setf (nth 3 worktree) (magit-get-current-branch))) - (setf (nth 1 worktree) t)))) - ((string-prefix-p "HEAD" line) - (setf (nth 2 worktree) (substring line 5))) - ((string-prefix-p "branch" line) - (setf (nth 3 worktree) (substring line 18))) - ((string-equal line "detached")))) - (nreverse worktrees))) - -(defun magit-symbolic-ref-p (name) - (magit-git-success "symbolic-ref" "--quiet" name)) - -(defun magit-ref-p (rev) - (or (car (member rev (magit-list-refs "refs/"))) - (car (member rev (magit-list-refnames "refs/"))))) - -(defun magit-branch-p (rev) - (or (car (member rev (magit-list-branches))) - (car (member rev (magit-list-branch-names))))) - -(defun magit-local-branch-p (rev) - (or (car (member rev (magit-list-local-branches))) - (car (member rev (magit-list-local-branch-names))))) - -(defun magit-remote-branch-p (rev) - (or (car (member rev (magit-list-remote-branches))) - (car (member rev (magit-list-remote-branch-names))))) - -(defun magit-branch-set-face (branch) - (magit--propertize-face branch (if (magit-local-branch-p branch) - 'magit-branch-local - 'magit-branch-remote))) - -(defun magit-tag-p (rev) - (car (member rev (magit-list-tags)))) - -(defun magit-remote-p (string) - (car (member string (magit-list-remotes)))) - -(defun magit-rev-diff-count (a b) - "Return the commits in A but not B and vice versa. -Return a list of two integers: (A>B B>A)." - (mapcar 'string-to-number - (split-string (magit-git-string "rev-list" - "--count" "--left-right" - (concat a "..." b)) - "\t"))) - -(defun magit-abbrev-length () - (--if-let (magit-get "core.abbrev") - (string-to-number it) - ;; Guess the length git will be using based on an example - ;; abbreviation. Actually HEAD's abbreviation might be an - ;; outlier, so use the shorter of the abbreviations for two - ;; commits. When a commit does not exist, then fall back - ;; to the default of 7. See #3034. - (min (--if-let (magit-rev-parse "--short" "HEAD") (length it) 7) - (--if-let (magit-rev-parse "--short" "HEAD~") (length it) 7)))) - -(defun magit-abbrev-arg (&optional arg) - (format "--%s=%d" (or arg "abbrev") (magit-abbrev-length))) - -(defun magit-rev-abbrev (rev) - (magit-rev-parse (magit-abbrev-arg "short") rev)) - -(defun magit-commit-children (commit &optional args) - (mapcar #'car - (--filter (member commit (cdr it)) - (--map (split-string it " ") - (magit-git-lines - "log" "--format=%H %P" - (or args (list "--branches" "--tags" "--remotes")) - "--not" commit))))) - -(defun magit-commit-parents (commit) - (--when-let (magit-git-string "rev-list" "-1" "--parents" commit) - (cdr (split-string it)))) - -(defun magit-patch-id (rev) - (with-temp-buffer - (magit-process-file - shell-file-name nil '(t nil) nil shell-command-switch - (let ((exec (shell-quote-argument magit-git-executable))) - (format "%s diff-tree -u %s | %s patch-id" exec rev exec))) - (car (split-string (buffer-string))))) - -(defun magit-rev-format (format &optional rev args) - (let ((str (magit-git-string "show" "--no-patch" - (concat "--format=" format) args - (if rev (concat rev "^{commit}") "HEAD") "--"))) - (unless (string-equal str "") - str))) - -(defun magit-rev-insert-format (format &optional rev args) - (magit-git-insert "show" "--no-patch" - (concat "--format=" format) args - (if rev (concat rev "^{commit}") "HEAD") "--")) - -(defun magit-format-rev-summary (rev) - (--when-let (magit-rev-format "%h %s" rev) - (string-match " " it) - (magit--put-face 0 (match-beginning 0) 'magit-hash it) - it)) - -(defvar magit-ref-namespaces - '(("\\`HEAD\\'" . magit-head) - ("\\`refs/tags/\\(.+\\)" . magit-tag) - ("\\`refs/heads/\\(.+\\)" . magit-branch-local) - ("\\`refs/remotes/\\(.+\\)" . magit-branch-remote) - ("\\`refs/bisect/\\(bad\\)" . magit-bisect-bad) - ("\\`refs/bisect/\\(skip.*\\)" . magit-bisect-skip) - ("\\`refs/bisect/\\(good.*\\)" . magit-bisect-good) - ("\\`refs/stash$" . magit-refname-stash) - ("\\`refs/wip/\\(.+\\)" . magit-refname-wip) - ("\\`refs/pullreqs/\\(.+\\)" . magit-refname-pullreq) - ("\\`\\(bad\\):" . magit-bisect-bad) - ("\\`\\(skip\\):" . magit-bisect-skip) - ("\\`\\(good\\):" . magit-bisect-good) - ("\\`\\(.+\\)" . magit-refname)) - "How refs are formatted for display. - -Each entry controls how a certain type of ref is displayed, and -has the form (REGEXP . FACE). REGEXP is a regular expression -used to match full refs. The first entry whose REGEXP matches -the reference is used. - -In log and revision buffers the first regexp submatch becomes the -\"label\" that represents the ref and is propertized with FONT. -In refs buffers the displayed text is controlled by other means -and this option only controls what face is used.") - -(defun magit-format-ref-labels (string) - (save-match-data - (let ((regexp "\\(, \\|tag: \\|HEAD -> \\)") - names) - (if (and (derived-mode-p 'magit-log-mode) - (member "--simplify-by-decoration" magit-buffer-log-args)) - (let ((branches (magit-list-local-branch-names)) - (re (format "^%s/.+" (regexp-opt (magit-list-remotes))))) - (setq names - (--map (cond ((string-equal it "HEAD") it) - ((string-prefix-p "refs/" it) it) - ((member it branches) (concat "refs/heads/" it)) - ((string-match re it) (concat "refs/remotes/" it)) - (t (concat "refs/" it))) - (split-string - (replace-regexp-in-string "tag: " "refs/tags/" string) - regexp t)))) - (setq names (split-string string regexp t))) - (let (state head upstream tags branches remotes other combined) - (dolist (ref names) - (let* ((face (cdr (--first (string-match (car it) ref) - magit-ref-namespaces))) - (name (magit--propertize-face - (or (match-string 1 ref) ref) face))) - (cl-case face - ((magit-bisect-bad magit-bisect-skip magit-bisect-good) - (setq state name)) - (magit-head - (setq head (magit--propertize-face "@" 'magit-head))) - (magit-tag (push name tags)) - (magit-branch-local (push name branches)) - (magit-branch-remote (push name remotes)) - (t (push name other))))) - (setq remotes - (-keep - (lambda (name) - (if (string-match "\\`\\([^/]*\\)/\\(.*\\)\\'" name) - (let ((r (match-string 1 name)) - (b (match-string 2 name))) - (and (not (equal b "HEAD")) - (if (equal (concat "refs/remotes/" name) - (magit-git-string - "symbolic-ref" - (format "refs/remotes/%s/HEAD" r))) - (magit--propertize-face - name 'magit-branch-remote-head) - name))) - name)) - remotes)) - (let* ((current (magit-get-current-branch)) - (target (magit-get-upstream-branch current))) - (dolist (name branches) - (let ((push (car (member (magit-get-push-branch name) remotes)))) - (when push - (setq remotes (delete push remotes)) - (string-match "^[^/]*/" push) - (setq push (substring push 0 (match-end 0)))) - (cond - ((equal name current) - (setq head - (concat push - (magit--propertize-face - name 'magit-branch-current)))) - ((equal name target) - (setq upstream - (concat push - (magit--propertize-face - name '(magit-branch-upstream - magit-branch-local))))) - (t - (push (concat push name) combined))))) - (when (and target (not upstream)) - (if (member target remotes) - (progn - (magit--add-face-text-property - 0 (length target) 'magit-branch-upstream nil target) - (setq upstream target) - (setq remotes (delete target remotes))) - (when-let ((target (car (member target combined)))) - (magit--add-face-text-property - 0 (length target) 'magit-branch-upstream nil target) - (setq upstream target) - (setq combined (delete target combined)))))) - (mapconcat #'identity - (-flatten `(,state - ,head - ,upstream - ,@(nreverse tags) - ,@(nreverse combined) - ,@(nreverse remotes) - ,@other)) - " "))))) - -(defun magit-object-type (object) - (magit-git-string "cat-file" "-t" object)) - -(defmacro magit-with-blob (commit file &rest body) - (declare (indent 2) - (debug (form form body))) - `(with-temp-buffer - (let ((buffer-file-name ,file)) - (save-excursion - (magit-git-insert "cat-file" "-p" - (concat ,commit ":" buffer-file-name))) - (decode-coding-inserted-region - (point-min) (point-max) buffer-file-name t nil nil t) - ,@body))) - -(defmacro magit-with-temp-index (tree arg &rest body) - (declare (indent 2) (debug (form form body))) - (let ((file (cl-gensym "file"))) - `(let ((magit--refresh-cache nil) - (,file (magit-convert-filename-for-git - (make-temp-name (magit-git-dir "index.magit."))))) - (unwind-protect - (magit-with-toplevel - (--when-let ,tree - (or (magit-git-success "read-tree" ,arg it - (concat "--index-output=" ,file)) - (error "Cannot read tree %s" it))) - (if (file-remote-p default-directory) - (let ((magit-tramp-process-environment - (cons (concat "GIT_INDEX_FILE=" ,file) - magit-tramp-process-environment))) - ,@body) - (let ((process-environment - (cons (concat "GIT_INDEX_FILE=" ,file) - process-environment))) - ,@body))) - (ignore-errors - (delete-file (concat (file-remote-p default-directory) ,file))))))) - -(defun magit-commit-tree (message &optional tree &rest parents) - (magit-git-string "commit-tree" "--no-gpg-sign" "-m" message - (--mapcat (list "-p" it) (delq nil parents)) - (or tree - (magit-git-string "write-tree") - (error "Cannot write tree")))) - -(defun magit-commit-worktree (message &optional arg &rest other-parents) - (magit-with-temp-index "HEAD" arg - (and (magit-update-files (magit-unstaged-files)) - (apply #'magit-commit-tree message nil "HEAD" other-parents)))) - -(defun magit-update-files (files) - (magit-git-success "update-index" "--add" "--remove" "--" files)) - -(defun magit-update-ref (ref message rev &optional stashish) - (let ((magit--refresh-cache nil)) - (or (if (not (version< (magit-git-version) "2.6.0")) - (zerop (magit-call-git "update-ref" "--create-reflog" - "-m" message ref rev - (or (magit-rev-verify ref) ""))) - ;; `--create-reflog' didn't exist before v2.6.0 - (let ((oldrev (magit-rev-verify ref)) - (logfile (magit-git-dir (concat "logs/" ref)))) - (unless (file-exists-p logfile) - (when oldrev - (magit-git-success "update-ref" "-d" ref oldrev)) - (make-directory (file-name-directory logfile) t) - (with-temp-file logfile) - (when (and oldrev (not stashish)) - (magit-git-success "update-ref" "-m" "enable reflog" - ref oldrev "")))) - (magit-git-success "update-ref" "-m" message ref rev - (or (magit-rev-verify ref) ""))) - (error "Cannot update %s with %s" ref rev)))) - -(defconst magit-range-re - (concat "\\`\\([^ \t]*[^.]\\)?" ; revA - "\\(\\.\\.\\.?\\)" ; range marker - "\\([^.][^ \t]*\\)?\\'")) ; revB - -(defun magit-split-range (range) - (and (string-match magit-range-re range) - (let ((beg (or (match-string 1 range) "HEAD")) - (end (or (match-string 3 range) "HEAD"))) - (cons (if (string-equal (match-string 2 range) "...") - (magit-git-string "merge-base" beg end) - beg) - end)))) - -(defun magit-hash-range (range) - (if (string-match magit-range-re range) - (concat (magit-rev-hash (match-string 1 range)) - (match-string 2 range) - (magit-rev-hash (match-string 3 range))) - (magit-rev-hash range))) - -(put 'git-revision 'thing-at-point 'magit-thingatpt--git-revision) -(defun magit-thingatpt--git-revision () - (--when-let - (let ((c "\s\n\t~^:?*[\\")) - (cl-letf (((get 'git-revision 'beginning-op) - (if (re-search-backward (format "[%s]" c) nil t) - (forward-char) - (goto-char (point-min)))) - ((get 'git-revision 'end-op) - (lambda () - (re-search-forward (format "\\=[^%s]*" c) nil t)))) - (bounds-of-thing-at-point 'git-revision))) - (let ((text (buffer-substring-no-properties (car it) (cdr it)))) - (and (magit-commit-p text) text)))) - -;;; Completion - -(defvar magit-revision-history nil) - -(defun magit-read-branch (prompt &optional secondary-default) - (magit-completing-read prompt (magit-list-branch-names) - nil t nil 'magit-revision-history - (or (magit-branch-at-point) - secondary-default - (magit-get-current-branch)))) - -(defun magit-read-branch-or-commit (prompt &optional secondary-default) - (or (magit-completing-read prompt (magit-list-refnames nil t) - nil nil nil 'magit-revision-history - (or (magit-branch-or-commit-at-point) - secondary-default - (magit-get-current-branch))) - (user-error "Nothing selected"))) - -(defun magit-read-range-or-commit (prompt &optional secondary-default) - (magit-read-range - prompt - (or (--when-let (magit-region-values '(commit branch) t) - (deactivate-mark) - (concat (car (last it)) ".." (car it))) - (magit-branch-or-commit-at-point) - secondary-default - (magit-get-current-branch)))) - -(defun magit-read-range (prompt &optional default) - (magit-completing-read-multiple prompt - (magit-list-refnames) - "\\.\\.\\.?" - default 'magit-revision-history)) - -(defun magit-read-remote-branch - (prompt &optional remote default local-branch require-match) - (let ((choice (magit-completing-read - prompt - (-union (and local-branch - (if remote - (concat remote "/" local-branch) - (--map (concat it "/" local-branch) - (magit-list-remotes)))) - (magit-list-remote-branch-names remote t)) - nil require-match nil 'magit-revision-history default))) - (if (or remote (string-match "\\`\\([^/]+\\)/\\(.+\\)" choice)) - choice - (user-error "`%s' doesn't have the form REMOTE/BRANCH" choice)))) - -(defun magit-read-refspec (prompt remote) - (magit-completing-read prompt - (prog2 (message "Determining available refs...") - (magit-remote-list-refs remote) - (message "Determining available refs...done")))) - -(defun magit-read-local-branch (prompt &optional secondary-default) - (magit-completing-read prompt (magit-list-local-branch-names) - nil t nil 'magit-revision-history - (or (magit-local-branch-at-point) - secondary-default - (magit-get-current-branch)))) - -(defun magit-read-local-branch-or-commit (prompt) - (let ((choices (nconc (magit-list-local-branch-names) - (magit-list-special-refnames))) - (commit (magit-commit-at-point))) - (when commit - (push commit choices)) - (or (magit-completing-read prompt choices - nil nil nil 'magit-revision-history - (or (magit-local-branch-at-point) commit)) - (user-error "Nothing selected")))) - -(defun magit-read-local-branch-or-ref (prompt &optional secondary-default) - (magit-completing-read prompt (nconc (magit-list-local-branch-names) - (magit-list-refs "refs/")) - nil t nil 'magit-revision-history - (or (magit-local-branch-at-point) - secondary-default - (magit-get-current-branch)))) - -(defun magit-read-other-branch - (prompt &optional exclude secondary-default no-require-match) - (let* ((current (magit-get-current-branch)) - (atpoint (magit-branch-at-point)) - (exclude (or exclude current)) - (default (or (and (not (equal atpoint exclude)) atpoint) - (and (not (equal current exclude)) current) - secondary-default - (magit-get-previous-branch)))) - (magit-completing-read prompt (delete exclude (magit-list-branch-names)) - nil (not no-require-match) - nil 'magit-revision-history default))) - -(defun magit-read-other-branch-or-commit - (prompt &optional exclude secondary-default) - (let* ((current (magit-get-current-branch)) - (atpoint (magit-branch-or-commit-at-point)) - (exclude (or exclude current)) - (default (or (and (not (equal atpoint exclude)) - (not (and (not current) - (magit-rev-equal atpoint "HEAD"))) - atpoint) - (and (not (equal current exclude)) current) - secondary-default - (magit-get-previous-branch)))) - (or (magit-completing-read prompt (delete exclude (magit-list-refnames)) - nil nil nil 'magit-revision-history default) - (user-error "Nothing selected")))) - -(defun magit-read-other-local-branch - (prompt &optional exclude secondary-default no-require-match) - (let* ((current (magit-get-current-branch)) - (atpoint (magit-local-branch-at-point)) - (exclude (or exclude current)) - (default (or (and (not (equal atpoint exclude)) atpoint) - (and (not (equal current exclude)) current) - secondary-default - (magit-get-previous-branch)))) - (magit-completing-read prompt - (delete exclude (magit-list-local-branch-names)) - nil (not no-require-match) - nil 'magit-revision-history default))) - -(defun magit-read-branch-prefer-other (prompt) - (let* ((current (magit-get-current-branch)) - (commit (magit-commit-at-point)) - (atrev (and commit (magit-list-branches-pointing-at commit))) - (atpoint (magit--painted-branch-at-point))) - (magit-completing-read prompt (magit-list-branch-names) - nil t nil 'magit-revision-history - (or (magit-section-value-if 'branch) - atpoint - (and (not (cdr atrev)) (car atrev)) - (--first (not (equal it current)) atrev) - (magit-get-previous-branch) - (car atrev))))) - -(defun magit-read-upstream-branch (&optional branch prompt) - "Read the upstream for BRANCH using PROMPT. -If optional BRANCH is nil, then read the upstream for the -current branch, or raise an error if no branch is checked -out. Only existing branches can be selected." - (unless branch - (setq branch (or (magit-get-current-branch) - (error "Need a branch to set its upstream")))) - (let ((branches (delete branch (magit-list-branch-names)))) - (magit-completing-read - (or prompt (format "Change upstream of %s to" branch)) - branches nil t nil 'magit-revision-history - (or (let ((r (car (member (magit-remote-branch-at-point) branches))) - (l (car (member (magit-local-branch-at-point) branches)))) - (if magit-prefer-remote-upstream (or r l) (or l r))) - (let ((r (car (member "origin/master" branches))) - (l (car (member "master" branches)))) - (if magit-prefer-remote-upstream (or r l) (or l r))) - (car (member (magit-get-previous-branch) branches)))))) - -(defun magit-read-starting-point (prompt &optional branch default) - (or (magit-completing-read - (concat prompt - (and branch - (if (bound-and-true-p ivy-mode) - ;; Ivy-mode strips faces from prompt. - (format " `%s'" branch) - (concat " " (magit--propertize-face - branch 'magit-branch-local)))) - " starting at") - (nconc (list "HEAD") - (magit-list-refnames) - (directory-files (magit-git-dir) nil "_HEAD\\'")) - nil nil nil 'magit-revision-history - (or default (magit--default-starting-point))) - (user-error "Nothing selected"))) - -(defun magit--default-starting-point () - (or (let ((r (magit-remote-branch-at-point)) - (l (magit-local-branch-at-point))) - (if magit-prefer-remote-upstream (or r l) (or l r))) - (magit-commit-at-point) - (magit-stash-at-point) - (magit-get-current-branch))) - -(defun magit-read-tag (prompt &optional require-match) - (magit-completing-read prompt (magit-list-tags) nil - require-match nil 'magit-revision-history - (magit-tag-at-point))) - -(defun magit-read-stash (prompt) - (let ((stashes (magit-list-stashes))) - (magit-completing-read prompt stashes nil t nil nil - (magit-stash-at-point) - (car stashes)))) - -(defun magit-read-remote (prompt &optional default use-only) - (let ((remotes (magit-list-remotes))) - (if (and use-only (= (length remotes) 1)) - (car remotes) - (magit-completing-read prompt remotes - nil t nil nil - (or default - (magit-remote-at-point) - (magit-get-remote)))))) - -(defun magit-read-remote-or-url (prompt &optional default) - (magit-completing-read prompt - (nconc (magit-list-remotes) - (list "https://" "git://" "git@")) - nil nil nil nil - (or default - (magit-remote-at-point) - (magit-get-remote)))) - -(defun magit-read-module-path (prompt &optional predicate) - (magit-completing-read prompt (magit-list-module-paths) - predicate t nil nil - (magit-module-at-point predicate))) - -(defun magit-module-confirm (verb &optional predicate) - (let (modules) - (if current-prefix-arg - (progn - (setq modules (magit-list-module-paths)) - (when predicate - (setq modules (-filter predicate modules))) - (unless modules - (if predicate - (user-error "No modules satisfying %s available" predicate) - (user-error "No modules available")))) - (setq modules (magit-region-values 'magit-module-section)) - (when modules - (when predicate - (setq modules (-filter predicate modules))) - (unless modules - (user-error "No modules satisfying %s selected" predicate)))) - (if (> (length modules) 1) - (magit-confirm t nil (format "%s %%i modules" verb) nil modules) - (list (magit-read-module-path (format "%s module" verb) predicate))))) - -;;; _ -(provide 'magit-git) -;;; magit-git.el ends here diff --git a/elpa/magit-20200418.939/magit-git.elc b/elpa/magit-20200418.939/magit-git.elc deleted file mode 100644 index 7fcc8c5c637e311a99aae67d0fea6c40ef3489dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91254 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

1JVX$ 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 diff --git a/elpa/magit-20200418.939/magit-gitignore.el b/elpa/magit-20200418.939/magit-gitignore.el deleted file mode 100644 index ad1ac91d..00000000 --- a/elpa/magit-20200418.939/magit-gitignore.el +++ /dev/null @@ -1,197 +0,0 @@ -;;; magit-gitignore.el --- intentionally untracked files -*- lexical-binding: t -*- - -;; Copyright (C) 2008-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements gitignore commands. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) - -;;; Transient - -;;;###autoload (autoload 'magit-gitignore "magit-gitignore" nil t) -(define-transient-command magit-gitignore () - "Instruct Git to ignore a file or pattern." - :man-page "gitignore" - ["Gitignore" - ("t" "shared at toplevel (.gitignore)" - magit-gitignore-in-topdir) - ("s" "shared in subdirectory (path/to/.gitignore)" - magit-gitignore-in-subdir) - ("p" "privately (.git/info/exclude)" - magit-gitignore-in-gitdir) - ("g" magit-gitignore-on-system - :if (lambda () (magit-get "core.excludesfile")) - :description (lambda () - (format "privately for all repositories (%s)" - (magit-get "core.excludesfile"))))] - ["Skip worktree" - (7 "w" "do skip worktree" magit-skip-worktree) - (7 "W" "do not skip worktree" magit-no-skip-worktree)] - ["Assume unchanged" - (7 "u" "do assume unchanged" magit-assume-unchanged) - (7 "U" "do not assume unchanged" magit-no-assume-unchanged)]) - -;;; Gitignore Commands - -;;;###autoload -(defun magit-gitignore-in-topdir (rule) - "Add the Git ignore RULE to the top-level \".gitignore\" file. -Since this file is tracked, it is shared with other clones of the -repository. Also stage the file." - (interactive (list (magit-gitignore-read-pattern))) - (magit-with-toplevel - (magit--gitignore rule ".gitignore") - (magit-run-git "add" ".gitignore"))) - -;;;###autoload -(defun magit-gitignore-in-subdir (rule directory) - "Add the Git ignore RULE to a \".gitignore\" file. -Prompted the user for a directory and add the rule to the -\".gitignore\" file in that directory. Since such files are -tracked, they are shared with other clones of the repository. -Also stage the file." - (interactive (list (magit-gitignore-read-pattern) - (read-directory-name "Limit rule to files in: "))) - (magit-with-toplevel - (let ((file (expand-file-name ".gitignore" directory))) - (magit--gitignore rule file) - (magit-run-git "add" file)))) - -;;;###autoload -(defun magit-gitignore-in-gitdir (rule) - "Add the Git ignore RULE to \"$GIT_DIR/info/exclude\". -Rules in that file only affects this clone of the repository." - (interactive (list (magit-gitignore-read-pattern))) - (magit--gitignore rule (magit-git-dir "info/exclude")) - (magit-refresh)) - -;;;###autoload -(defun magit-gitignore-on-system (rule) - "Add the Git ignore RULE to the file specified by `core.excludesFile'. -Rules that are defined in that file affect all local repositories." - (interactive (list (magit-gitignore-read-pattern))) - (magit--gitignore rule - (or (magit-get "core.excludesFile") - (error "Variable `core.excludesFile' isn't set"))) - (magit-refresh)) - -(defun magit--gitignore (rule file) - (when-let ((directory (file-name-directory file))) - (make-directory directory t)) - (with-temp-buffer - (when (file-exists-p file) - (insert-file-contents file)) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (insert (replace-regexp-in-string "\\(\\\\*\\)" "\\1\\1" rule)) - (insert "\n") - (write-region nil nil file))) - -(defun magit-gitignore-read-pattern () - (let* ((default (magit-current-file)) - (base (car magit-buffer-diff-files)) - (base (and base (file-directory-p base) base)) - (choices - (delete-dups - (--mapcat - (cons (concat "/" it) - (when-let ((ext (file-name-extension it))) - (list (concat "/" (file-name-directory it) "*." ext) - (concat "*." ext)))) - (sort (nconc - (magit-untracked-files nil base) - ;; The untracked section of the status buffer lists - ;; directories containing only untracked files. - ;; Add those as candidates. - (-filter #'directory-name-p - (magit-list-files - "--other" "--exclude-standard" "--directory" - "--no-empty-directory" "--" base))) - #'string-lessp))))) - (when default - (setq default (concat "/" default)) - (unless (member default choices) - (setq default (concat "*." (file-name-extension default))) - (unless (member default choices) - (setq default nil)))) - (magit-completing-read "File or pattern to ignore" - choices nil nil nil nil default))) - -;;; Skip Worktree Commands - -;;;###autoload -(defun magit-skip-worktree (file) - "Call \"git update-index --skip-worktree -- FILE\"." - (interactive - (list (magit-read-file-choice "Skip worktree for" - (magit-with-toplevel - (cl-set-difference - (magit-list-files) - (magit-skip-worktree-files)))))) - (magit-with-toplevel - (magit-run-git "update-index" "--skip-worktree" "--" file))) - -;;;###autoload -(defun magit-no-skip-worktree (file) - "Call \"git update-index --no-skip-worktree -- FILE\"." - (interactive - (list (magit-read-file-choice "Do not skip worktree for" - (magit-with-toplevel - (magit-skip-worktree-files))))) - (magit-with-toplevel - (magit-run-git "update-index" "--no-skip-worktree" "--" file))) - -;;; Assume Unchanged Commands - -;;;###autoload -(defun magit-assume-unchanged (file) - "Call \"git update-index --assume-unchanged -- FILE\"." - (interactive - (list (magit-read-file-choice "Assume file to be unchanged" - (magit-with-toplevel - (cl-set-difference - (magit-list-files) - (magit-assume-unchanged-files)))))) - (magit-with-toplevel - (magit-run-git "update-index" "--assume-unchanged" "--" file))) - -;;;###autoload -(defun magit-no-assume-unchanged (file) - "Call \"git update-index --no-assume-unchanged -- FILE\"." - (interactive - (list (magit-read-file-choice "Do not assume file to be unchanged" - (magit-with-toplevel - (magit-assume-unchanged-files))))) - (magit-with-toplevel - (magit-run-git "update-index" "--no-assume-unchanged" "--" file))) - -;;; _ -(provide 'magit-gitignore) -;;; magit-gitignore.el ends here diff --git a/elpa/magit-20200418.939/magit-gitignore.elc b/elpa/magit-20200418.939/magit-gitignore.elc deleted file mode 100644 index 75e57b3fa2d9ad19a18ee0679b59feee9bd03969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7378 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 -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; Emacs' major modes can facilitate navigation in their buffers by -;; supporting Imenu. In such major modes, launching Imenu (M-x imenu) -;; makes Emacs display a list of items (e.g., function definitions in -;; a programming major mode). Selecting an item from this list moves -;; point to this item. - -;; magit-imenu.el adds Imenu support to every major mode in Magit. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) -(require 'git-rebase) - -;;; Core - -(defun magit-imenu--index-function (entry-types menu-types) - "Return an alist of imenu entries in current buffer. - -ENTRY-TYPES is a list of section types to be selected through -`imenu'. - -MENU-TYPES is a list of section types containing elements of -ENTRY-TYPES. Elements of MENU-TYPES are are used to categories -elements of ENTRY-TYPES. - -This function is used as a helper for functions set as -`imenu-create-index-function'." - (let ((entries (make-hash-table :test 'equal))) - (goto-char (point-max)) - (while (magit-section--backward-find - (lambda () - (let* ((section (magit-current-section)) - (type (oref section type)) - (parent (oref section parent)) - (parent-type (oref parent type))) - (and (-contains-p entry-types type) - (-contains-p menu-types parent-type))))) - (let* ((section (magit-current-section)) - (name (buffer-substring-no-properties - (line-beginning-position) - (line-end-position))) - (parent (oref section parent)) - (parent-title (buffer-substring-no-properties - (oref parent start) - (1- (oref parent content))))) - (puthash parent-title - (cons (cons name (point)) - (gethash parent-title entries (list))) - entries))) - (mapcar (lambda (menu-title) - (cons menu-title (gethash menu-title entries))) - (hash-table-keys entries)))) - -;;; Log mode - -;;;###autoload -(defun magit-imenu--log-prev-index-position-function () - "Move point to previous line in current buffer. -This function is used as a value for -`imenu-prev-index-position-function'." - (magit-section--backward-find - (lambda () - (-contains-p '(commit stash) - (oref (magit-current-section) type))))) - -;;;###autoload -(defun magit-imenu--log-extract-index-name-function () - "Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line." - (save-match-data - (looking-at "\\([^ ]+\\)[ *|]+\\(.+\\)$") - (format "%s: %s" - (match-string-no-properties 1) - (match-string-no-properties 2)))) - -;;; Diff mode - -;;;###autoload -(defun magit-imenu--diff-prev-index-position-function () - "Move point to previous file line in current buffer. -This function is used as a value for -`imenu-prev-index-position-function'." - (magit-section--backward-find - (lambda () - (let ((section (magit-current-section))) - (and (magit-file-section-p section) - (not (equal (oref (oref section parent) type) - 'diffstat))))))) - -;;;###autoload -(defun magit-imenu--diff-extract-index-name-function () - "Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line." - (buffer-substring-no-properties (line-beginning-position) - (line-end-position))) - -;;; Status mode - -;;;###autoload -(defun magit-imenu--status-create-index-function () - "Return an alist of all imenu entries in current buffer. -This function is used as a value for -`imenu-create-index-function'." - (magit-imenu--index-function - '(file commit stash) - '(unpushed unstaged unpulled untracked staged stashes))) - -;;;; Refs mode - -;;;###autoload -(defun magit-imenu--refs-create-index-function () - "Return an alist of all imenu entries in current buffer. -This function is used as a value for -`imenu-create-index-function'." - (magit-imenu--index-function - '(branch commit tag) - '(local remote tags))) - -;;;; Cherry mode - -;;;###autoload -(defun magit-imenu--cherry-create-index-function () - "Return an alist of all imenu entries in current buffer. -This function is used as a value for -`imenu-create-index-function'." - (magit-imenu--index-function - '(commit) - '(cherries))) - -;;;; Submodule list mode - -;;;###autoload -(defun magit-imenu--submodule-prev-index-position-function () - "Move point to previous line in magit-submodule-list buffer. -This function is used as a value for -`imenu-prev-index-position-function'." - (unless (bobp) - (forward-line -1))) - -;;;###autoload -(defun magit-imenu--submodule-extract-index-name-function () - "Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line." - (elt (tabulated-list-get-entry) 0)) - -;;;; Repolist mode - -;;;###autoload -(defun magit-imenu--repolist-prev-index-position-function () - "Move point to previous line in magit-repolist buffer. -This function is used as a value for -`imenu-prev-index-position-function'." - (unless (bobp) - (forward-line -1))) - -;;;###autoload -(defun magit-imenu--repolist-extract-index-name-function () - "Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line." - (let ((entry (tabulated-list-get-entry))) - (format "%s (%s)" - (elt entry 0) - (elt entry (1- (length entry)))))) - -;;;; Process mode - -;;;###autoload -(defun magit-imenu--process-prev-index-position-function () - "Move point to previous process in magit-process buffer. -This function is used as a value for -`imenu-prev-index-position-function'." - (magit-section--backward-find - (lambda () - (eq (oref (magit-current-section) type) 'process)))) - -;;;###autoload -(defun magit-imenu--process-extract-index-name-function () - "Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line." - (buffer-substring-no-properties (line-beginning-position) - (line-end-position))) - -;;;; Rebase mode - -;;;###autoload -(defun magit-imenu--rebase-prev-index-position-function () - "Move point to previous commit in git-rebase buffer. -This function is used as a value for -`imenu-prev-index-position-function'." - (catch 'found - (while (not (bobp)) - (git-rebase-backward-line) - (when (git-rebase-line-p) - (throw 'found t))))) - -;;;###autoload -(defun magit-imenu--rebase-extract-index-name-function () - "Return imenu name for line at point. -This function is used as a value for -`imenu-extract-index-name-function'. Point should be at the -beginning of the line." - (buffer-substring-no-properties (line-beginning-position) - (line-end-position))) - -;;; _ -(provide 'magit-imenu) -;;; magit-imenu.el ends here diff --git a/elpa/magit-20200418.939/magit-imenu.elc b/elpa/magit-20200418.939/magit-imenu.elc deleted file mode 100644 index 3b6d7f0237e1cc59d46870631d8f0482d83ac560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6830 zcmdT}ZBN@)6o!`4E+6-0+P>^GfSPPIvab^dil(ha(NwLis=_8sBvT#x23sV)o?mF0 z_T%@QYdbNNq@cd6R5J1Fz2`pXdCtr2UjNztH!CYEjlI1++E>#!oJe0^gc0?pu9woO zOwv$AB%EzqKY0^o0lAY2sW=O#;XiJM$LV%MKRgV=l*Sl^@>HhepGEF8^vG9Unk8X$ zoIb?UB+bb6ed*I|7HfA~?7lOGuP{cWGV)ZExp+Cx#>NirM8@NT{ijdK3*5x@GMM;K zPwz%PrHVW^qLHMDa?edtE+r-DCX-Mmlm&QE*u}hn;Di3L0U!FW(P*?rXPGoSpm`Iws$6-b|j6{yyR1QhB8ymmayMkWHEKefBBHc*{ z(AAj2sf==x5xfCx0jZZK2`*`rkH<0r6#W;6ul_U+|9sg$AUM;d>eEzu>}tx+Vtkq@ zhB%cI+=VBzAW`{o(0HvUcz|)9_h0<}{$Wbbf*OROU|g2M%(@ZVME&^_stxO6^?ZP8 zFo4~j$z#O}Yt+V~+JazK!O%P^)`A7dd{)&K@-VQR#de*Bu;P z91f1&z_!fwd+YZG;E84FzhaZwVfR;X$0q#22UeF)9MUiJZVhZ<>QjECFN;rmxA6q? z9q>b8udcm*g5S>C`d9erZai7PyD<=sa|h##yBJ@v4H!ef4x5Qt*t32gmwH57;LP6Q z3A_6^W!rJsu-~5Buix+Socw;r+`5f(X1lj3S81h*cVDwd(sa^5=JIMwIiXnVS?r zmaU0%#KknAV_E!0A)^|5ZbG8l17z$PL?wm^RC-c6rF?xzUAz(vB34A9f~SYi`t2r< zp~sz(ychsZ#tEx7|N1vFjQwZEACF%dM!PvAh@-W!N!!%v?Y4&;63fq>mD1t7nT6=I(Bl zON#t~tgeC5tRv7~ED{`n3YiIW*Q#{3vq)#U*yAAce~HZx z$Ky|?HqDAvPO9CnIp`xFSvv69niMQP&K1HIKhHeQD!v%J3(YZBGl9o-O_qU}MM%6L zs5U#VM&X#98?Q#~t1HP7uv!d0l5>^yKUM-{=@bNq_GSd{RuQgVEpwam-irA;8D&BJ zxHx_>5%To%x^o`97%c{ChSjn%v!x|_K0UPZD9+OWb#xwK%42;J=M%JpxWj?^1ZU+F z{NUBJT?5kYeCa@<=K9DmjuJQW0`#Uj&jPeIwI<3#4VuWQ$|T{|Igp&5S%uRtlx)0hEwzDY1RLP~_H0s}}@^b`I-IrEv>vcr9tTcPDq?VXZ zy=;U+m5TF0mm4M1JS$U!VWEbtN?2j<-1u-l2jt2zeHBj9r)*Ftw!*PzwBUZ&Poip~{0b4uNIO{Z5yEU}1Z zXv;mB>g}~6XjL~pXS6EkyaLfUM&aP5=9-PDuF!N1Z2we#T-#kJ)_$=R)-`Tv94d%f z!`bb0sswp+8_o*$EA#o2SGnEZEHsLRZCqK!U_*GmlRVoK{v64**u1_XTg7)PMRe3V zacC5Z{c$u4*!^7Nq|3XdOlt1X^md{t)>f)Lrm@Pg88~0)e3wwy8np*{_bk@C+iwUR lS=Bi>mR%LRH -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for looking at Git logs, including -;; special logs like cherry-logs, as well as for selecting a commit -;; from a log. - -;;; Code: - -(require 'magit-core) -(require 'magit-diff) - -(declare-function magit-blob-visit "magit-files" (blob-or-file line)) -(declare-function magit-insert-head-branch-header "magit-status" - (&optional branch)) -(declare-function magit-insert-upstream-branch-header "magit-status" - (&optional branch pull keyword)) -(declare-function magit-read-file-from-rev "magit-files" - (rev prompt &optional default)) -(declare-function magit-show-commit "magit-diff" - (arg1 &optional arg2 arg3 arg4)) -(declare-function magit-reflog-format-subject "magit-reflog" (subject)) -(defvar magit-refs-focus-column-width) -(defvar magit-refs-margin) -(defvar magit-refs-show-commit-count) -(defvar magit-buffer-margin) -(defvar magit-status-margin) -(defvar magit-status-sections-hook) - -(require 'ansi-color) -(require 'crm) -(require 'which-func) - -(eval-when-compile - (require 'subr-x)) - -;;; Options -;;;; Log Mode - -(defgroup magit-log nil - "Inspect and manipulate Git history." - :link '(info-link "(magit)Logging") - :group 'magit-modes) - -(defcustom magit-log-mode-hook nil - "Hook run after entering Magit-Log mode." - :group 'magit-log - :type 'hook) - -(defcustom magit-log-remove-graph-args '("--follow" "--grep" "-G" "-S" "-L") - "The log arguments that cause the `--graph' argument to be dropped." - :package-version '(magit . "2.3.0") - :group 'magit-log - :type '(repeat (string :tag "Argument")) - :options '("--follow" "--grep" "-G" "-S" "-L")) - -(defcustom magit-log-revision-headers-format "\ -%+b -Author: %aN <%aE> -Committer: %cN <%cE>" - "Additional format string used with the `++header' argument." - :package-version '(magit . "2.3.0") - :group 'magit-log - :type 'string) - -(defcustom magit-log-auto-more nil - "Insert more log entries automatically when moving past the last entry. -Only considered when moving past the last entry with -`magit-goto-*-section' commands." - :group 'magit-log - :type 'boolean) - -(defcustom magit-log-margin '(t age magit-log-margin-width t 18) - "Format of the margin in `magit-log-mode' buffers. - -The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH). - -If INIT is non-nil, then the margin is shown initially. -STYLE controls how to format the author or committer date. - It can be one of `age' (to show the age of the commit), - `age-abbreviated' (to abbreviate the time unit to a character), - or a string (suitable for `format-time-string') to show the - actual date. Option `magit-log-margin-show-committer-date' - controls which date is being displayed. -WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. -AUTHOR controls whether the name of the author is also shown by - default. -AUTHOR-WIDTH has to be an integer. When the name of the author - is shown, then this specifies how much space is used to do so." - :package-version '(magit . "2.9.0") - :group 'magit-log - :group 'magit-margin - :type magit-log-margin--custom-type - :initialize 'magit-custom-initialize-reset - :set (apply-partially #'magit-margin-set-variable 'magit-log-mode)) - -(defcustom magit-log-margin-show-committer-date nil - "Whether to show the committer date in the margin. - -This option only controls whether the committer date is displayed -instead of the author date. Whether some date is displayed in -the margin and whether the margin is displayed at all is -controlled by other options." - :package-version '(magit . "3.0.0") - :group 'magit-log - :group 'magit-margin - :type 'boolean) - -(defcustom magit-log-show-refname-after-summary nil - "Whether to show refnames after commit summaries. -This is useful if you use really long branch names." - :package-version '(magit . "2.2.0") - :group 'magit-log - :type 'boolean) - -(defcustom magit-log-highlight-keywords t - "Whether to highlight bracketed keywords in commit summaries." - :package-version '(magit . "2.12.0") - :group 'magit-log - :type 'boolean) - -(defcustom magit-log-header-line-function 'magit-log-header-line-sentence - "Function used to generate text shown in header line of log buffers." - :package-version '(magit . "2.12.0") - :group 'magit-log - :type '(choice (function-item magit-log-header-line-arguments) - (function-item magit-log-header-line-sentence) - function)) - -(defcustom magit-log-trace-definition-function 'magit-which-function - "Function used to determine the function at point. -This is used by the command `magit-log-trace-definition'. -You should prefer `magit-which-function' over `which-function' -because the latter may make use of Imenu's outdated cache." - :package-version '(magit . "3.0.0") - :group 'magit-log - :type '(choice (function-item magit-which-function) - (function-item which-function) - (function-item add-log-current-defun) - function)) - -(defface magit-log-graph - '((((class color) (background light)) :foreground "grey30") - (((class color) (background dark)) :foreground "grey80")) - "Face for the graph part of the log output." - :group 'magit-faces) - -(defface magit-log-author - '((((class color) (background light)) - :foreground "firebrick" - :slant normal - :weight normal) - (((class color) (background dark)) - :foreground "tomato" - :slant normal - :weight normal)) - "Face for the author part of the log output." - :group 'magit-faces) - -(defface magit-log-date - '((((class color) (background light)) - :foreground "grey30" - :slant normal - :weight normal) - (((class color) (background dark)) - :foreground "grey80" - :slant normal - :weight normal)) - "Face for the date part of the log output." - :group 'magit-faces) - -(defface magit-header-line-log-select - '((t :inherit bold)) - "Face for the `header-line' in `magit-log-select-mode'." - :group 'magit-faces) - -;;;; File Log - -(defcustom magit-log-buffer-file-locked t - "Whether `magit-log-buffer-file-quick' uses a dedicated buffer." - :package-version '(magit . "2.7.0") - :group 'magit-commands - :group 'magit-log - :type 'boolean) - -;;;; Select Mode - -(defcustom magit-log-select-show-usage 'both - "Whether to show usage information when selecting a commit from a log. -The message can be shown in the `echo-area' or the `header-line', or in -`both' places. If the value isn't one of these symbols, then it should -be nil, in which case no usage information is shown." - :package-version '(magit . "2.1.0") - :group 'magit-log - :type '(choice (const :tag "in echo-area" echo-area) - (const :tag "in header-line" header-line) - (const :tag "in both places" both) - (const :tag "nowhere"))) - -(defcustom magit-log-select-margin - (list (nth 0 magit-log-margin) - (nth 1 magit-log-margin) - 'magit-log-margin-width t - (nth 4 magit-log-margin)) - "Format of the margin in `magit-log-select-mode' buffers. - -The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH). - -If INIT is non-nil, then the margin is shown initially. -STYLE controls how to format the author or committer date. - It can be one of `age' (to show the age of the commit), - `age-abbreviated' (to abbreviate the time unit to a character), - or a string (suitable for `format-time-string') to show the - actual date. Option `magit-log-margin-show-committer-date' - controls which date is being displayed. -WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. -AUTHOR controls whether the name of the author is also shown by - default. -AUTHOR-WIDTH has to be an integer. When the name of the author - is shown, then this specifies how much space is used to do so." - :package-version '(magit . "2.9.0") - :group 'magit-log - :group 'magit-margin - :type magit-log-margin--custom-type - :initialize 'magit-custom-initialize-reset - :set-after '(magit-log-margin) - :set (apply-partially #'magit-margin-set-variable 'magit-log-select-mode)) - -;;;; Cherry Mode - -(defcustom magit-cherry-sections-hook - '(magit-insert-cherry-headers - magit-insert-cherry-commits) - "Hook run to insert sections into the cherry buffer." - :package-version '(magit . "2.1.0") - :group 'magit-log - :type 'hook) - -(defcustom magit-cherry-margin - (list (nth 0 magit-log-margin) - (nth 1 magit-log-margin) - 'magit-log-margin-width t - (nth 4 magit-log-margin)) - "Format of the margin in `magit-cherry-mode' buffers. - -The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH). - -If INIT is non-nil, then the margin is shown initially. -STYLE controls how to format the author or committer date. - It can be one of `age' (to show the age of the commit), - `age-abbreviated' (to abbreviate the time unit to a character), - or a string (suitable for `format-time-string') to show the - actual date. Option `magit-log-margin-show-committer-date' - controls which date is being displayed. -WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. -AUTHOR controls whether the name of the author is also shown by - default. -AUTHOR-WIDTH has to be an integer. When the name of the author - is shown, then this specifies how much space is used to do so." - :package-version '(magit . "2.9.0") - :group 'magit-log - :group 'magit-margin - :type magit-log-margin--custom-type - :initialize 'magit-custom-initialize-reset - :set-after '(magit-log-margin) - :set (apply-partially #'magit-margin-set-variable 'magit-cherry-mode)) - -;;;; Log Sections - -(defcustom magit-log-section-commit-count 10 - "How many recent commits to show in certain log sections. -How many recent commits `magit-insert-recent-commits' and -`magit-insert-unpulled-from-upstream-or-recent' (provided -the upstream isn't ahead of the current branch) show." - :package-version '(magit . "2.1.0") - :group 'magit-status - :type 'number) - -;;; Arguments -;;;; Prefix Classes - -(defclass magit-log-prefix (transient-prefix) - ((history-key :initform 'magit-log) - (major-mode :initform 'magit-log-mode))) - -(defclass magit-log-refresh-prefix (magit-log-prefix) - ((history-key :initform 'magit-log) - (major-mode :initform nil))) - -;;;; Prefix Methods - -(cl-defmethod transient-init-value ((obj magit-log-prefix)) - (pcase-let ((`(,args ,files) - (magit-log--get-value 'magit-log-mode - magit-prefix-use-buffer-arguments))) - (unless (eq current-transient-command 'magit-dispatch) - (when-let ((file (magit-file-relative-name))) - (setq files (list file)))) - (oset obj value (if files `(("--" ,@files) ,args) args)))) - -(cl-defmethod transient-init-value ((obj magit-log-refresh-prefix)) - (oset obj value (if magit-buffer-log-files - `(("--" ,@magit-buffer-log-files) - ,magit-buffer-log-args) - magit-buffer-log-args))) - -(cl-defmethod transient-set-value ((obj magit-log-prefix)) - (magit-log--set-value obj)) - -(cl-defmethod transient-save-value ((obj magit-log-prefix)) - (magit-log--set-value obj 'save)) - -;;;; Argument Access - -(defun magit-log-arguments (&optional mode) - "Return the current log arguments." - (if (memq current-transient-command '(magit-log magit-log-refresh)) - (pcase-let ((`(,args ,alist) - (-separate #'atom (transient-get-value)))) - (list args (cdr (assoc "--" alist)))) - (magit-log--get-value (or mode 'magit-log-mode)))) - -(defun magit-log--get-value (mode &optional use-buffer-args) - (unless use-buffer-args - (setq use-buffer-args magit-direct-use-buffer-arguments)) - (let (args files) - (cond - ((and (memq use-buffer-args '(always selected current)) - (eq major-mode mode)) - (setq args magit-buffer-log-args) - (setq files magit-buffer-log-files)) - ((and (memq use-buffer-args '(always selected)) - (when-let ((buffer (magit-get-mode-buffer - mode nil - (eq use-buffer-args 'selected)))) - (setq args (buffer-local-value 'magit-buffer-log-args buffer)) - (setq files (buffer-local-value 'magit-buffer-log-files buffer)) - t))) - ((plist-member (symbol-plist mode) 'magit-log-current-arguments) - (setq args (get mode 'magit-log-current-arguments))) - ((when-let ((elt (assq (intern (format "magit-log:%s" mode)) - transient-values))) - (setq args (cdr elt)) - t)) - (t - (setq args (get mode 'magit-log-default-arguments)))) - (list args files))) - -(defun magit-log--set-value (obj &optional save) - (pcase-let* ((obj (oref obj prototype)) - (mode (or (oref obj major-mode) major-mode)) - (key (intern (format "magit-log:%s" mode))) - (`(,args ,alist) - (-separate #'atom (transient-get-value))) - (files (cdr (assoc "--" alist)))) - (put mode 'magit-log-current-arguments args) - (when save - (setf (alist-get key transient-values) args) - (transient-save-values)) - (transient--history-push obj) - (setq magit-buffer-log-args args) - (unless (derived-mode-p 'magit-log-select-mode) - (setq magit-buffer-log-files files)) - (magit-refresh))) - -;;; Commands -;;;; Prefix Commands - -;;;###autoload (autoload 'magit-log "magit-log" nil t) -(define-transient-command magit-log () - "Show a commit or reference log." - :man-page "git-log" - :class 'magit-log-prefix - ;; The grouping in git-log(1) appears to be guided by implementation - ;; details, so our logical grouping only follows it to an extend. - ;; Arguments that are "misplaced" here: - ;; 1. From "Commit Formatting". - ;; 2. From "Common Diff Options". - ;; 3. From unnamed first group. - ;; 4. Implemented by Magit. - ["Commit limiting" - (magit-log:-n) - (magit:--author) - (7 "=s" "Limit to commits since" "--since=" transient-read-date) - (7 "=u" "Limit to commits until" "--until=" transient-read-date) - (magit-log:--grep) - (7 "-I" "Invert search pattern" "--invert-grep") - (magit-log:-G) ;2 - (magit-log:-S) ;2 - (magit-log:-L) ;2 - (7 "=m" "Omit merges" "--no-merges") - (7 "=p" "First parent" "--first-parent")] - ["History simplification" - ( "-D" "Simplify by decoration" "--simplify-by-decoration") - (magit:--) - ( "-f" "Follow renames when showing single-file log" "--follow") ;3 - (6 "/s" "Only commits changing given paths" "--sparse") - (7 "/d" "Only selected commits plus meaningful history" "--dense") - (7 "/a" "Only commits existing directly on ancestry path" "--ancestry-path") - (6 "/f" "Do not prune history" "--full-history") - (7 "/m" "Prune some history" "--simplify-merges")] - ["Commit ordering" - (magit-log:--*-order) - ("-r" "Reverse order" "--reverse")] - ["Formatting" - ("-g" "Show graph" "--graph") ;1 - ("-c" "Show graph in color" "--color") ;2 - ("-d" "Show refnames" "--decorate") ;3 - ("=S" "Show signatures" "--show-signature") ;1 - ("-h" "Show header" "++header") ;4 - ("-p" "Show diffs" ("-p" "--patch")) ;2 - ("-s" "Show diffstats" "--stat")] ;2 - [["Log" - ("l" "current" magit-log-current) - ("o" "other" magit-log-other) - ("h" "HEAD" magit-log-head)] - ["" - ("L" "local branches" magit-log-branches) - (7 "B" "matching branches" magit-log-matching-branches) - (7 "T" "matching tags" magit-log-matching-tags) - ("b" "all branches" magit-log-all-branches) - ("a" "all references" magit-log-all) - (7 "m" "merged" magit-log-merged)] - ["Reflog" - ("r" "current" magit-reflog-current) - ("O" "other" magit-reflog-other) - ("H" "HEAD" magit-reflog-head)] - [:if magit--any-wip-mode-enabled-p - :description "Wiplog" - ("i" "index" magit-wip-log-index) - ("w" "worktree" magit-wip-log-worktree)]]) - -;;;###autoload (autoload 'magit-log-refresh "magit-log" nil t) -(define-transient-command magit-log-refresh () - "Change the arguments used for the log(s) in the current buffer." - :man-page "git-log" - :class 'magit-log-refresh-prefix - [:if-mode magit-log-mode - :class transient-subgroups - ["Commit limiting" - (magit-log:-n) - (magit:--author) - (magit-log:--grep) - (7 "-I" "Invert search pattern" "--invert-grep") - (magit-log:-G) - (magit-log:-S) - (magit-log:-L)] - ["History simplification" - ( "-D" "Simplify by decoration" "--simplify-by-decoration") - (magit:--) - ( "-f" "Follow renames when showing single-file log" "--follow") ;3 - (6 "/s" "Only commits changing given paths" "--sparse") - (7 "/d" "Only selected commits plus meaningful history" "--dense") - (7 "/a" "Only commits existing directly on ancestry path" "--ancestry-path") - (6 "/f" "Do not prune history" "--full-history") - (7 "/m" "Prune some history" "--simplify-merges")] - ["Commit ordering" - (magit-log:--*-order) - ("-r" "Reverse order" "--reverse")] - ["Formatting" - ("-g" "Show graph" "--graph") - ("-c" "Show graph in color" "--color") - ("-d" "Show refnames" "--decorate") - ("=S" "Show signatures" "--show-signature") - ("-h" "Show header" "++header") - ("-p" "Show diffs" ("-p" "--patch")) - ("-s" "Show diffstats" "--stat")]] - [:if-not-mode magit-log-mode - :description "Arguments" - (magit-log:-n) - (magit-log:--*-order) - ("-g" "Show graph" "--graph") - ("-c" "Show graph in color" "--color") - ("-d" "Show refnames" "--decorate")] - [["Refresh" - ("g" "buffer" magit-log-refresh) - ("s" "buffer and set defaults" transient-set :transient nil) - ("w" "buffer and save defaults" transient-save :transient nil)] - ["Margin" - ("L" "toggle visibility" magit-toggle-margin) - ("l" "cycle style" magit-cycle-margin-style) - ("d" "toggle details" magit-toggle-margin-details) - ("x" "toggle shortstat" magit-toggle-log-margin-style)] - [:if-mode magit-log-mode - :description "Toggle" - ("b" "buffer lock" magit-toggle-buffer-lock)]] - (interactive) - (cond - ((not (eq current-transient-command 'magit-log-refresh)) - (pcase major-mode - (`magit-reflog-mode - (user-error "Cannot change log arguments in reflog buffers")) - (`magit-cherry-mode - (user-error "Cannot change log arguments in cherry buffers"))) - (transient-setup 'magit-log-refresh)) - (t - (pcase-let ((`(,args ,files) (magit-log-arguments))) - (setq magit-buffer-log-args args) - (unless (derived-mode-p 'magit-log-select-mode) - (setq magit-buffer-log-files files))) - (magit-refresh)))) - -;;;; Infix Commands - -(define-infix-argument magit-log:-n () - :description "Limit number of commits" - :class 'transient-option - ;; For historic reasons (and because it easy to guess what "-n" - ;; stands for) this is the only argument where we do not use the - ;; long argument ("--max-count"). - :shortarg "-n" - :argument "-n" - :reader 'transient-read-number-N+) - -(define-infix-argument magit:--author () - :description "Limit to author" - :class 'transient-option - :key "-A" - :argument "--author=" - :reader 'magit-transient-read-person) - -(define-infix-argument magit-log:--*-order () - :description "Order commits by" - :class 'transient-switches - :key "-o" - :argument-format "--%s-order" - :argument-regexp "\\(--\\(topo\\|author-date\\|date\\)-order\\)" - :choices '("topo" "author-date" "date")) - -(define-infix-argument magit-log:--grep () - :description "Search messages" - :class 'transient-option - :key "-F" - :argument "--grep=") - -(define-infix-argument magit-log:-G () - :description "Search changes" - :class 'transient-option - :argument "-G") - -(define-infix-argument magit-log:-S () - :description "Search occurrences" - :class 'transient-option - :argument "-S") - -(define-infix-argument magit-log:-L () - :description "Trace line evolution" - :class 'transient-option - :argument "-L" - :reader 'magit-read-file-trace) - -(defun magit-read-file-trace (&rest _ignored) - (let ((file (magit-read-file-from-rev "HEAD" "File")) - (trace (magit-read-string "Trace"))) - (concat trace ":" file))) - -;;;; Setup Commands - -(defvar magit-log-read-revs-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map crm-local-completion-map) - (define-key map "\s" 'self-insert-command) - map)) - -(defun magit-log-read-revs (&optional use-current) - (or (and use-current (--when-let (magit-get-current-branch) (list it))) - (let ((collection (magit-list-refnames nil t))) - (split-string - (magit-completing-read-multiple "Log rev,s" collection - "\\(\\.\\.\\.?\\|[, ]\\)" - (or (magit-branch-or-commit-at-point) - (unless use-current - (magit-get-previous-branch))) - 'magit-revision-history - magit-log-read-revs-map) - "[, ]" t)))) - -(defun magit-log-read-pattern (option) - "Read a string from the user to pass as parameter to OPTION." - (magit-read-string (format "Type a pattern to pass to %s" option))) - -;;;###autoload -(defun magit-log-current (revs &optional args files) - "Show log for the current branch. -When `HEAD' is detached or with a prefix argument show log for -one or more revs read from the minibuffer." - (interactive (cons (magit-log-read-revs t) - (magit-log-arguments))) - (magit-log-setup-buffer revs args files)) - -;;;###autoload -(defun magit-log-other (revs &optional args files) - "Show log for one or more revs read from the minibuffer. -The user can input any revision or revisions separated by a -space, or even ranges, but only branches and tags, and a -representation of the commit at point, are available as -completion candidates." - (interactive (cons (magit-log-read-revs) - (magit-log-arguments))) - (magit-log-setup-buffer revs args files)) - -;;;###autoload -(defun magit-log-head (&optional args files) - "Show log for `HEAD'." - (interactive (magit-log-arguments)) - (magit-log-setup-buffer (list "HEAD") args files)) - -;;;###autoload -(defun magit-log-branches (&optional args files) - "Show log for all local branches and `HEAD'." - (interactive (magit-log-arguments)) - (magit-log-setup-buffer (if (magit-get-current-branch) - (list "--branches") - (list "HEAD" "--branches")) - args files)) - -;;;###autoload -(defun magit-log-matching-branches (pattern &optional args files) - "Show log for all branches matching PATTERN and `HEAD'." - (interactive (cons (magit-log-read-pattern "--branches") (magit-log-arguments))) - (magit-log-setup-buffer - (list "HEAD" (format "--branches=%s" pattern)) - args files)) - -;;;###autoload -(defun magit-log-matching-tags (pattern &optional args files) - "Show log for all tags matching PATTERN and `HEAD'." - (interactive (cons (magit-log-read-pattern "--tags") (magit-log-arguments))) - (magit-log-setup-buffer - (list "HEAD" (format "--tags=%s" pattern)) - args files)) - -;;;###autoload -(defun magit-log-all-branches (&optional args files) - "Show log for all local and remote branches and `HEAD'." - (interactive (magit-log-arguments)) - (magit-log-setup-buffer (if (magit-get-current-branch) - (list "--branches" "--remotes") - (list "HEAD" "--branches" "--remotes")) - args files)) - -;;;###autoload -(defun magit-log-all (&optional args files) - "Show log for all references and `HEAD'." - (interactive (magit-log-arguments)) - (magit-log-setup-buffer (if (magit-get-current-branch) - (list "--all") - (list "HEAD" "--all")) - args files)) - -;;;###autoload -(defun magit-log-buffer-file (&optional follow beg end) - "Show log for the blob or file visited in the current buffer. -With a prefix argument or when `--follow' is an active log -argument, then follow renames. When the region is active, -restrict the log to the lines that the region touches." - (interactive - (cons current-prefix-arg - (and (region-active-p) - (magit-file-relative-name) - (save-restriction - (widen) - (list (line-number-at-pos (region-beginning)) - (line-number-at-pos - (let ((end (region-end))) - (if (char-after end) - end - ;; Ensure that we don't get the line number - ;; of a trailing newline. - (1- end))))))))) - (require 'magit) - (if-let ((file (magit-file-relative-name))) - (magit-log-setup-buffer - (list (or magit-buffer-refname - (magit-get-current-branch) - "HEAD")) - (let ((args (car (magit-log-arguments)))) - (when (and follow (not (member "--follow" args))) - (push "--follow" args)) - (when (and (file-regular-p - (expand-file-name file (magit-toplevel))) - beg end) - (setq args (cons (format "-L%s,%s:%s" beg end file) - (cl-delete "-L" args :test - 'string-prefix-p))) - (setq file nil)) - args) - (and file (list file)) - magit-log-buffer-file-locked) - (user-error "Buffer isn't visiting a file"))) - -;;;###autoload -(defun magit-log-trace-definition (file fn rev) - "Show log for the definition at point." - (interactive (list (or (magit-file-relative-name) - (user-error "Buffer isn't visiting a file")) - (or (funcall magit-log-trace-definition-function) - (user-error "No function at point found")) - (or magit-buffer-refname - (magit-get-current-branch) - "HEAD"))) - (require 'magit) - (magit-log-setup-buffer - (list rev) - (cons (format "-L:%s%s:%s" - (replace-regexp-in-string ":" "\\:" (regexp-quote fn) nil t) - (if (derived-mode-p 'lisp-mode 'emacs-lisp-mode) - ;; Git doesn't treat "-" the same way as - ;; "_", leading to false-positives such as - ;; "foo-suffix" being considered a match - ;; for "foo". Wing it. - "\\( \\|$\\)" - ;; We could use "\\b" here, but since Git - ;; already does something equivalent, that - ;; isn't necessary. - "") - file) - (cl-delete "-L" (car (magit-log-arguments)) - :test 'string-prefix-p)) - nil magit-log-buffer-file-locked)) - -(defun magit-diff-trace-definition () - "Show log for the definition at point in a diff." - (interactive) - (pcase-let ((`(,buf ,pos) (magit-diff-visit-file--noselect))) - (magit--with-temp-position buf pos - (call-interactively #'magit-log-trace-definition)))) - -;;;###autoload -(defun magit-log-merged (commit branch &optional args files) - "Show log for the merge of COMMIT into BRANCH. - -More precisely, find merge commit M that brought COMMIT into -BRANCH, and show the log of the range \"M^1..M\". If COMMIT is -directly on BRANCH, then show approximately twenty surrounding -commits instead. - -This command requires git-when-merged, which is available from -https://github.com/mhagger/git-when-merged." - (interactive - (append (let ((commit (magit-read-branch-or-commit "Commit"))) - (list commit - (magit-read-other-branch "Merged into" commit))) - (magit-log-arguments))) - (unless (executable-find "git-when-merged") - (user-error "This command requires git-when-merged (%s)" - "https://github.com/mhagger/git-when-merged")) - (let (exit m) - (with-temp-buffer - (save-excursion - (setq exit (magit-process-file - magit-git-executable nil t nil - "when-merged" "-c" - "--abbrev" (number-to-string (magit-abbrev-length)) - commit branch))) - (setq m (buffer-substring-no-properties (point) (line-end-position)))) - (if (zerop exit) - (magit-log-setup-buffer (list (format "%s^1..%s" m m)) - args files nil commit) - (setq m (string-trim-left (substring m (string-match " " m)))) - (if (equal m "Commit is directly on this branch.") - (let* ((from (concat commit "~10")) - (to (- (car (magit-rev-diff-count branch commit)) 10)) - (to (if (<= to 0) - branch - (format "%s~%s" branch to)))) - (unless (magit-rev-verify-commit from) - (setq from (magit-git-string "rev-list" "--max-parents=0" - commit))) - (magit-log-setup-buffer (list (concat from ".." to)) - (cons "--first-parent" args) - files nil commit)) - (user-error "Could not find when %s was merged into %s: %s" - commit branch m))))) - -;;;; Limit Commands - -(defun magit-log-toggle-commit-limit () - "Toggle the number of commits the current log buffer is limited to. -If the number of commits is currently limited, then remove that -limit. Otherwise set it to 256." - (interactive) - (magit-log-set-commit-limit (lambda (&rest _) nil))) - -(defun magit-log-double-commit-limit () - "Double the number of commits the current log buffer is limited to." - (interactive) - (magit-log-set-commit-limit '*)) - -(defun magit-log-half-commit-limit () - "Half the number of commits the current log buffer is limited to." - (interactive) - (magit-log-set-commit-limit '/)) - -(defun magit-log-set-commit-limit (fn) - (let* ((val magit-buffer-log-args) - (arg (--first (string-match "^-n\\([0-9]+\\)?$" it) val)) - (num (and arg (string-to-number (match-string 1 arg)))) - (num (if num (funcall fn num 2) 256))) - (setq val (delete arg val)) - (setq magit-buffer-log-args - (if (and num (> num 0)) - (cons (format "-n%i" num) val) - val))) - (magit-refresh)) - -(defun magit-log-get-commit-limit () - (--when-let (--first (string-match "^-n\\([0-9]+\\)?$" it) - magit-buffer-log-args) - (string-to-number (match-string 1 it)))) - -;;;; Mode Commands - -(defun magit-log-bury-buffer (&optional arg) - "Bury the current buffer or the revision buffer in the same frame. -Like `magit-mode-bury-buffer' (which see) but with a negative -prefix argument instead bury the revision buffer, provided it -is displayed in the current frame." - (interactive "p") - (if (< arg 0) - (let* ((buf (magit-get-mode-buffer 'magit-revision-mode)) - (win (and buf (get-buffer-window buf (selected-frame))))) - (if win - (with-selected-window win - (with-current-buffer buf - (magit-mode-bury-buffer (> (abs arg) 1)))) - (user-error "No revision buffer in this frame"))) - (magit-mode-bury-buffer (> arg 1)))) - -;;;###autoload -(defun magit-log-move-to-parent (&optional n) - "Move to the Nth parent of the current commit." - (interactive "p") - (when (derived-mode-p 'magit-log-mode) - (when (magit-section-match 'commit) - (let* ((section (magit-current-section)) - (parent-rev (format "%s^%s" (oref section value) (or n 1)))) - (if-let ((parent-hash (magit-rev-parse "--short" parent-rev))) - (if-let ((parent (--first (equal (oref it value) - parent-hash) - (magit-section-siblings section 'next)))) - (magit-section-goto parent) - (user-error - (substitute-command-keys - (concat "Parent " parent-hash " not found. Try typing " - "\\[magit-log-double-commit-limit] first")))) - (user-error "Parent %s does not exist" parent-rev)))))) - -;;; Log Mode - -(defvar magit-log-disable-graph-hack-args - '("-G" "--grep" "--author") - "Arguments which disable the graph speedup hack.") - -(defvar magit-log-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-mode-map) - (define-key map "\C-c\C-b" 'magit-go-backward) - (define-key map "\C-c\C-f" 'magit-go-forward) - (define-key map "\C-c\C-n" 'magit-log-move-to-parent) - (define-key map "=" 'magit-log-toggle-commit-limit) - (define-key map "+" 'magit-log-double-commit-limit) - (define-key map "-" 'magit-log-half-commit-limit) - (define-key map "q" 'magit-log-bury-buffer) - map) - "Keymap for `magit-log-mode'.") - -(define-derived-mode magit-log-mode magit-mode "Magit Log" - "Mode for looking at Git log. - -This mode is documented in info node `(magit)Log Buffer'. - -\\\ -Type \\[magit-refresh] to refresh the current buffer. -Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \ -to visit the commit at point. - -Type \\[magit-branch] to see available branch commands. -Type \\[magit-merge] to merge the branch or commit at point. -Type \\[magit-cherry-pick] to apply the commit at point. -Type \\[magit-reset] to reset `HEAD' to the commit at point. - -\\{magit-log-mode-map}" - :group 'magit-log - (hack-dir-local-variables-non-file-buffer) - (setq imenu-prev-index-position-function - 'magit-imenu--log-prev-index-position-function) - (setq imenu-extract-index-name-function - 'magit-imenu--log-extract-index-name-function)) - -(put 'magit-log-mode 'magit-log-default-arguments - '("--graph" "-n256" "--decorate")) - -(defun magit-log-setup-buffer (revs args files &optional locked focus) - (require 'magit) - (with-current-buffer - (magit-setup-buffer #'magit-log-mode locked - (magit-buffer-revisions revs) - (magit-buffer-log-args args) - (magit-buffer-log-files files)) - (when (if focus - (magit-log-goto-commit-section focus) - (magit-log-goto-same-commit)) - (magit-section-update-highlight)) - (current-buffer))) - -(defun magit-log-refresh-buffer () - (let ((revs magit-buffer-revisions) - (args magit-buffer-log-args) - (files magit-buffer-log-files)) - (magit-set-header-line-format - (funcall magit-log-header-line-function revs args files)) - (if (= (length files) 1) - (unless (magit-file-tracked-p (car files)) - (setq args (cons "--full-history" args))) - (setq args (remove "--follow" args))) - (when (and (car magit-log-remove-graph-args) - (--any-p (string-match-p - (concat "^" (regexp-opt magit-log-remove-graph-args)) it) - args)) - (setq args (remove "--graph" args))) - (unless (member "--graph" args) - (setq args (remove "--color" args))) - (when-let ((limit (magit-log-get-commit-limit)) - (limit (* 2 limit)) ; increase odds for complete graph - (count (and (= (length revs) 1) - (> limit 1024) ; otherwise it's fast enough - (setq revs (car revs)) - (not (string-match-p "\\.\\." revs)) - (not (member revs '("--all" "--branches"))) - (-none-p (lambda (arg) - (--any-p (string-prefix-p it arg) - magit-log-disable-graph-hack-args)) - args) - (magit-git-string "rev-list" "--count" - "--first-parent" args revs)))) - (setq revs (if (< (string-to-number count) limit) - revs - (format "%s~%s..%s" revs limit revs)))) - (magit-insert-section (logbuf) - (magit-insert-log revs args files)))) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-log-mode)) - (append magit-buffer-revisions - (if (and magit-buffer-revisions magit-buffer-log-files) - (cons "--" magit-buffer-log-files) - magit-buffer-log-files))) - -(defun magit-log-header-line-arguments (revs args files) - "Return string describing some of the used arguments." - (mapconcat (lambda (arg) - (if (string-match-p " " arg) - (prin1 arg) - arg)) - `("git" "log" ,@args ,@revs "--" ,@files) - " ")) - -(defun magit-log-header-line-sentence (revs args files) - "Return string containing all arguments." - (concat "Commits in " - (mapconcat #'identity revs " ") - (and (member "--reverse" args) - " in reverse") - (and files (concat " touching " - (mapconcat 'identity files " "))) - (--some (and (string-prefix-p "-L" it) - (concat " " it)) - args))) - -(defun magit-insert-log (revs &optional args files) - "Insert a log section. -Do not add this to a hook variable." - (let ((magit-git-global-arguments - (remove "--literal-pathspecs" magit-git-global-arguments))) - (magit-git-wash (apply-partially #'magit-log-wash-log 'log) - "log" - (format "--format=%s%%h%%x00%s%%x00%s%%x00%%aN%%x00%s%%x00%%s%s" - (if (and (member "--left-right" args) - (not (member "--graph" args))) - "%m " - "") - (if (member "--decorate" args) "%D" "") - (if (member "--show-signature" args) - (progn (setq args (remove "--show-signature" args)) "%G?") - "") - (if magit-log-margin-show-committer-date "%ct" "%at") - (if (member "++header" args) - (if (member "--graph" (setq args (remove "++header" args))) - (concat "\n" magit-log-revision-headers-format "\n") - (concat "\n" magit-log-revision-headers-format "\n")) - "")) - (progn - (--when-let (--first (string-match "^\\+\\+order=\\(.+\\)$" it) args) - (setq args (cons (format "--%s-order" (match-string 1 it)) - (remove it args)))) - (when (member "--decorate" args) - (setq args (cons "--decorate=full" (remove "--decorate" args)))) - (when (member "--reverse" args) - (setq args (remove "--graph" args))) - args) - "--use-mailmap" "--no-prefix" revs "--" files))) - -(defvar magit-commit-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-show-commit) - (define-key map "a" 'magit-cherry-apply) - map) - "Keymap for `commit' sections.") - -(defvar magit-module-commit-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-show-commit) - map) - "Keymap for `module-commit' sections.") - -(defconst magit-log-heading-re - (concat "^" - "\\(?4:[-_/|\\*o<>. ]*\\)" ; graph - "\\(?1:[0-9a-fA-F]+\\)?\0" ; sha1 - "\\(?3:[^\0\n]+\\)?\0" ; refs - "\\(?7:[BGUXYREN]\\)?\0" ; gpg - "\\(?5:[^\0\n]*\\)\0" ; author - ;; Note: Date is optional because, prior to Git v2.19.0, - ;; `git rebase -i --root` corrupts the root's author date. - "\\(?6:[^\0\n]*\\)\0" ; date - "\\(?2:.*\\)$")) ; msg - -(defconst magit-log-cherry-re - (concat "^" - "\\(?8:[-+]\\) " ; cherry - "\\(?1:[0-9a-fA-F]+\\) " ; sha1 - "\\(?2:.*\\)$")) ; msg - -(defconst magit-log-module-re - (concat "^" - "\\(?:\\(?11:[<>]\\) \\)?" ; side - "\\(?1:[0-9a-fA-F]+\\) " ; sha1 - "\\(?2:.*\\)$")) ; msg - -(defconst magit-log-bisect-vis-re - (concat "^" - "\\(?4:[-_/|\\*o<>. ]*\\)" ; graph - "\\(?1:[0-9a-fA-F]+\\)?\0" ; sha1 - "\\(?3:[^\0\n]+\\)?\0" ; refs - "\\(?2:.*\\)$")) ; msg - -(defconst magit-log-bisect-log-re - (concat "^# " - "\\(?3:bad:\\|skip:\\|good:\\) " ; "refs" - "\\[\\(?1:[^]\n]+\\)\\] " ; sha1 - "\\(?2:.*\\)$")) ; msg - -(defconst magit-log-reflog-re - (concat "^" - "\\(?1:[^\0\n]+\\)\0" ; sha1 - "\\(?5:[^\0\n]*\\)\0" ; author - "\\(?:\\(?:[^@\n]+@{\\(?6:[^}\n]+\\)}\0" ; date - "\\(?10:merge \\|autosave \\|restart \\|[^:\n]+: \\)?" ; refsub - "\\(?2:.*\\)?\\)\\|\0\\)$")) ; msg - -(defconst magit-reflog-subject-re - (concat "\\(?1:[^ ]+\\) ?" ; command - "\\(?2:\\(?: ?-[^ ]+\\)+\\)?" ; option - "\\(?: ?(\\(?3:[^)]+\\))\\)?")) ; type - -(defconst magit-log-stash-re - (concat "^" - "\\(?1:[^\0\n]+\\)\0" ; "sha1" - "\\(?5:[^\0\n]*\\)\0" ; author - "\\(?6:[^\0\n]+\\)\0" ; date - "\\(?2:.*\\)$")) ; msg - -(defvar magit-log-count nil) - -(defvar magit-log-format-message-function 'magit-log-propertize-keywords) - -(defun magit-log-wash-log (style args) - (setq args (-flatten args)) - (when (and (member "--graph" args) - (member "--color" args)) - (let ((ansi-color-apply-face-function - (lambda (beg end face) - (put-text-property beg end 'font-lock-face - (or face 'magit-log-graph))))) - (ansi-color-apply-on-region (point-min) (point-max)))) - (when (eq style 'cherry) - (reverse-region (point-min) (point-max))) - (let ((magit-log-count 0)) - (when (looking-at "^\\.\\.\\.") - (magit-delete-line)) - (magit-wash-sequence (apply-partially 'magit-log-wash-rev style - (magit-abbrev-length))) - (if (derived-mode-p 'magit-log-mode 'magit-reflog-mode) - (when (eq magit-log-count (magit-log-get-commit-limit)) - (magit-insert-section (longer) - (insert-text-button - (substitute-command-keys - (format "Type \\<%s>\\[%s] to show more history" - 'magit-log-mode-map - 'magit-log-double-commit-limit)) - 'action (lambda (_button) - (magit-log-double-commit-limit)) - 'follow-link t - 'mouse-face 'magit-section-highlight))) - (insert ?\n)))) - -(cl-defun magit-log-wash-rev (style abbrev) - (when (derived-mode-p 'magit-log-mode 'magit-reflog-mode) - (cl-incf magit-log-count)) - (looking-at (pcase style - (`log magit-log-heading-re) - (`cherry magit-log-cherry-re) - (`module magit-log-module-re) - (`reflog magit-log-reflog-re) - (`stash magit-log-stash-re) - (`bisect-vis magit-log-bisect-vis-re) - (`bisect-log magit-log-bisect-log-re))) - (magit-bind-match-strings - (hash msg refs graph author date gpg cherry _ refsub side) nil - (setq msg (substring-no-properties msg)) - (when refs - (setq refs (substring-no-properties refs))) - (let ((align (or (eq style 'cherry) - (not (member "--stat" magit-buffer-log-args)))) - (non-graph-re (if (eq style 'bisect-vis) - magit-log-bisect-vis-re - magit-log-heading-re))) - (magit-delete-line) - ;; If the reflog entries have been pruned, the output of `git - ;; reflog show' includes a partial line that refers to the hash - ;; of the youngest expired reflog entry. - (when (and (eq style 'reflog) (not date)) - (cl-return-from magit-log-wash-rev t)) - (magit-insert-section section (commit hash) - (pcase style - (`stash (oset section type 'stash)) - (`module (oset section type 'module-commit)) - (`bisect-log (setq hash (magit-rev-parse "--short" hash)))) - (when cherry - (when (and (derived-mode-p 'magit-refs-mode) - magit-refs-show-commit-count) - (insert (make-string (1- magit-refs-focus-column-width) ?\s))) - (insert (propertize cherry 'font-lock-face - (if (string= cherry "-") - 'magit-cherry-equivalent - 'magit-cherry-unmatched))) - (insert ?\s)) - (when side - (insert (propertize side 'font-lock-face - (if (string= side "<") - 'magit-cherry-equivalent - 'magit-cherry-unmatched))) - (insert ?\s)) - (when align - (insert (propertize hash 'font-lock-face 'magit-hash) ?\s)) - (when graph - (insert graph)) - (unless align - (insert (propertize hash 'font-lock-face 'magit-hash) ?\s)) - (when (and refs (not magit-log-show-refname-after-summary)) - (insert (magit-format-ref-labels refs) ?\s)) - (when (eq style 'reflog) - (insert (format "%-2s " (1- magit-log-count))) - (when refsub - (insert (magit-reflog-format-subject - (substring refsub 0 (if (string-match-p ":" refsub) -2 -1)))))) - (when msg - (when gpg - (setq msg (propertize msg 'font-lock-face - (pcase (aref gpg 0) - (?G 'magit-signature-good) - (?B 'magit-signature-bad) - (?U 'magit-signature-untrusted) - (?X 'magit-signature-expired) - (?Y 'magit-signature-expired-key) - (?R 'magit-signature-revoked) - (?E 'magit-signature-error))))) - (insert (funcall magit-log-format-message-function hash msg))) - (when (and refs magit-log-show-refname-after-summary) - (insert ?\s) - (insert (magit-format-ref-labels refs))) - (insert ?\n) - (when (memq style '(log reflog stash)) - (goto-char (line-beginning-position)) - (when (and refsub - (string-match "\\`\\([^ ]\\) \\+\\(..\\)\\(..\\)" date)) - (setq date (+ (string-to-number (match-string 1 date)) - (* (string-to-number (match-string 2 date)) 60 60) - (* (string-to-number (match-string 3 date)) 60)))) - (save-excursion - (backward-char) - (magit-log-format-margin hash author date))) - (when (and (eq style 'cherry) - (magit-buffer-margin-p)) - (save-excursion - (backward-char) - (apply #'magit-log-format-margin hash - (split-string (magit-rev-format "%aN%x00%ct" hash) "\0")))) - (when (and graph - (not (eobp)) - (not (looking-at non-graph-re))) - (when (looking-at "") - (magit-insert-heading) - (delete-char 1) - (magit-insert-section (commit-header) - (forward-line) - (magit-insert-heading) - (re-search-forward "") - (backward-delete-char 1) - (forward-char) - (insert ?\n)) - (delete-char 1)) - (if (looking-at "^\\(---\\|\n\s\\|\ndiff\\)") - (let ((limit (save-excursion - (and (re-search-forward non-graph-re nil t) - (match-beginning 0))))) - (unless (oref magit-insert-section--current content) - (magit-insert-heading)) - (delete-char (if (looking-at "\n") 1 4)) - (magit-diff-wash-diffs (list "--stat") limit)) - (when align - (setq align (make-string (1+ abbrev) ? ))) - (when (and (not (eobp)) (not (looking-at non-graph-re))) - (when align - (setq align (make-string (1+ abbrev) ? ))) - (while (and (not (eobp)) (not (looking-at non-graph-re))) - (when align - (save-excursion (insert align))) - (magit-make-margin-overlay) - (forward-line)) - ;; When `--format' is used and its value isn't one of the - ;; predefined formats, then `git-log' does not insert a - ;; separator line. - (save-excursion - (forward-line -1) - (looking-at "[-_/|\\*o<>. ]*")) - (setq graph (match-string 0)) - (unless (string-match-p "[/\\.]" graph) - (insert graph ?\n)))))))) - t) - -(defun magit-log-propertize-keywords (_rev msg) - (let ((boundary 0)) - (when (string-match "^\\(?:squash\\|fixup\\)! " msg boundary) - (setq boundary (match-end 0)) - (magit--put-face (match-beginning 0) (1- boundary) - 'magit-keyword-squash msg)) - (when magit-log-highlight-keywords - (while (string-match "\\[[^[]*?]" msg boundary) - (setq boundary (match-end 0)) - (magit--put-face (match-beginning 0) boundary - 'magit-keyword msg)))) - msg) - -(defun magit-log-maybe-show-more-commits (section) - "When point is at the end of a log buffer, insert more commits. - -Log buffers end with a button \"Type + to show more history\". -When the use of a section movement command puts point on that -button, then automatically show more commits, without the user -having to press \"+\". - -This function is called by `magit-section-movement-hook' and -exists mostly for backward compatibility reasons." - (when (and (eq (oref section type) 'longer) - magit-log-auto-more) - (magit-log-double-commit-limit) - (forward-line -1) - (magit-section-forward))) - -(add-hook 'magit-section-movement-hook #'magit-log-maybe-show-more-commits) - -(defvar magit--update-revision-buffer nil) - -(defun magit-log-maybe-update-revision-buffer (&optional _) - "When moving in a log or cherry buffer, update the revision buffer. -If there is no revision buffer in the same frame, then do nothing." - (when (derived-mode-p 'magit-log-mode 'magit-cherry-mode 'magit-reflog-mode) - (magit--maybe-update-revision-buffer))) - -(add-hook 'magit-section-movement-hook #'magit-log-maybe-update-revision-buffer) - -(defun magit--maybe-update-revision-buffer () - (when-let ((commit (magit-section-value-if 'commit)) - (buffer (magit-get-mode-buffer 'magit-revision-mode nil t))) - (if magit--update-revision-buffer - (setq magit--update-revision-buffer (list commit buffer)) - (setq magit--update-revision-buffer (list commit buffer)) - (run-with-idle-timer - magit-update-other-window-delay nil - (let ((args (with-current-buffer buffer - (let ((magit-direct-use-buffer-arguments 'selected)) - (magit-show-commit--arguments))))) - (lambda () - (pcase-let ((`(,rev ,buf) magit--update-revision-buffer)) - (setq magit--update-revision-buffer nil) - (when (buffer-live-p buf) - (let ((magit-display-buffer-noselect t)) - (apply #'magit-show-commit rev args)))) - (setq magit--update-revision-buffer nil))))))) - -(defvar magit--update-blob-buffer nil) - -(defun magit-log-maybe-update-blob-buffer (&optional _) - "When moving in a log or cherry buffer, update the blob buffer. -If there is no blob buffer in the same frame, then do nothing." - (when (derived-mode-p 'magit-log-mode 'magit-cherry-mode 'magit-reflog-mode) - (magit--maybe-update-blob-buffer))) - -(defun magit--maybe-update-blob-buffer () - (when-let ((commit (magit-section-value-if 'commit)) - (buffer (--first (with-current-buffer it - (eq revert-buffer-function - 'magit-revert-rev-file-buffer)) - (mapcar #'window-buffer (window-list))))) - (if magit--update-blob-buffer - (setq magit--update-blob-buffer (list commit buffer)) - (setq magit--update-blob-buffer (list commit buffer)) - (run-with-idle-timer - magit-update-other-window-delay nil - (lambda () - (pcase-let ((`(,rev ,buf) magit--update-blob-buffer)) - (setq magit--update-blob-buffer nil) - (when (buffer-live-p buf) - (with-selected-window (get-buffer-window buf) - (with-current-buffer buf - (save-excursion - (magit-blob-visit (list (magit-rev-parse rev) - (magit-file-relative-name - magit-buffer-file-name)) - (line-number-at-pos)))))))))))) - -(defun magit-log-goto-commit-section (rev) - (let ((abbrev (magit-rev-format "%h" rev))) - (when-let ((section (--first (equal (oref it value) abbrev) - (oref magit-root-section children)))) - (goto-char (oref section start))))) - -(defun magit-log-goto-same-commit () - (when (and magit-previous-section - (magit-section-match '(commit branch) - magit-previous-section)) - (magit-log-goto-commit-section (oref magit-previous-section value)))) - -;;; Log Margin - -(defvar-local magit-log-margin-show-shortstat nil) - -(defun magit-toggle-log-margin-style () - "Toggle between the regular and the shortstat margin style. -The shortstat style is experimental and rather slow." - (interactive) - (setq magit-log-margin-show-shortstat - (not magit-log-margin-show-shortstat)) - (magit-set-buffer-margin nil t)) - -(defun magit-log-format-margin (rev author date) - (when (magit-margin-option) - (if magit-log-margin-show-shortstat - (magit-log-format-shortstat-margin rev) - (magit-log-format-author-margin author date)))) - -(defun magit-log-format-author-margin (author date &optional previous-line) - (pcase-let ((`(,_ ,style ,width ,details ,details-width) - (or magit-buffer-margin - (symbol-value (magit-margin-option))))) - (magit-make-margin-overlay - (concat (and details - (concat (magit--propertize-face - (truncate-string-to-width - (or author "") - details-width - nil ?\s (make-string 1 magit-ellipsis)) - 'magit-log-author) - " ")) - (magit--propertize-face - (if (stringp style) - (format-time-string - style - (seconds-to-time (string-to-number date))) - (pcase-let* ((abbr (eq style 'age-abbreviated)) - (`(,cnt ,unit) (magit--age date abbr))) - (format (format (if abbr "%%2i%%-%ic" "%%2i %%-%is") - (- width (if details (1+ details-width) 0))) - cnt unit))) - 'magit-log-date)) - previous-line))) - -(defun magit-log-format-shortstat-margin (rev) - (magit-make-margin-overlay - (if-let ((line (and rev (magit-git-string - "show" "--format=" "--shortstat" rev)))) - (if (string-match "\ -\\([0-9]+\\) files? changed, \ -\\(?:\\([0-9]+\\) insertions?(\\+)\\)?\ -\\(?:\\(?:, \\)?\\([0-9]+\\) deletions?(-)\\)?\\'" line) - (magit-bind-match-strings (files add del) line - (format - "%5s %5s%4s" - (if add - (magit--propertize-face (format "%s+" add) - 'magit-diffstat-added) - "") - (if del - (magit--propertize-face (format "%s-" del) - 'magit-diffstat-removed) - "") - files)) - "") - ""))) - -(defun magit-log-margin-width (style details details-width) - (if magit-log-margin-show-shortstat - 16 - (+ (if details (1+ details-width) 0) - (if (stringp style) - (length (format-time-string style)) - (+ 2 ; two digits - 1 ; trailing space - (if (eq style 'age-abbreviated) - 1 ; single character - (+ 1 ; gap after digits - (apply #'max (--map (max (length (nth 1 it)) - (length (nth 2 it))) - magit--age-spec))))))))) - -;;; Select Mode - -(defvar magit-log-select-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-log-mode-map) - (define-key map "\C-c\C-b" 'undefined) - (define-key map "\C-c\C-f" 'undefined) - (define-key map "." 'magit-log-select-pick) - (define-key map "e" 'magit-log-select-pick) - (define-key map "\C-c\C-c" 'magit-log-select-pick) - (define-key map "q" 'magit-log-select-quit) - (define-key map "\C-c\C-k" 'magit-log-select-quit) - map) - "Keymap for `magit-log-select-mode'.") - -(put 'magit-log-select-pick :advertised-binding [?\C-c ?\C-c]) -(put 'magit-log-select-quit :advertised-binding [?\C-c ?\C-k]) - -(define-derived-mode magit-log-select-mode magit-log-mode "Magit Select" - "Mode for selecting a commit from history. - -This mode is documented in info node `(magit)Select from Log'. - -\\\ -Type \\[magit-refresh] to refresh the current buffer. -Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \ -to visit the commit at point. - -\\\ -Type \\[magit-log-select-pick] to select the commit at point. -Type \\[magit-log-select-quit] to abort without selecting a commit." - :group 'magit-log - (hack-dir-local-variables-non-file-buffer)) - -(put 'magit-log-select-mode 'magit-log-default-arguments - '("--graph" "-n256" "--decorate")) - -(defun magit-log-select-setup-buffer (revs args) - (magit-setup-buffer #'magit-log-select-mode nil - (magit-buffer-revisions revs) - (magit-buffer-log-args args))) - -(defun magit-log-select-refresh-buffer () - (magit-insert-section (logbuf) - (magit-insert-log magit-buffer-revisions - magit-buffer-log-args))) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-log-select-mode)) - magit-buffer-revisions) - -(defvar-local magit-log-select-pick-function nil) -(defvar-local magit-log-select-quit-function nil) - -(defun magit-log-select (pick &optional msg quit branch args initial) - (declare (indent defun)) - (unless initial - (setq initial (magit-commit-at-point))) - (magit-log-select-setup-buffer - (or branch (magit-get-current-branch) "HEAD") - (append args - (car (magit-log--get-value 'magit-log-select-mode - magit-direct-use-buffer-arguments)))) - (when initial - (magit-log-goto-commit-section initial)) - (setq magit-log-select-pick-function pick) - (setq magit-log-select-quit-function quit) - (when magit-log-select-show-usage - (let ((pick (propertize (substitute-command-keys - "\\[magit-log-select-pick]") - 'font-lock-face - 'magit-header-line-key)) - (quit (propertize (substitute-command-keys - "\\[magit-log-select-quit]") - 'font-lock-face - 'magit-header-line-key))) - (setq msg (format-spec - (if msg - (if (string-suffix-p "," msg) - (concat msg " or %q to abort") - msg) - "Type %p to select commit at point, or %q to abort") - `((?p . ,pick) - (?q . ,quit))))) - (magit--add-face-text-property - 0 (length msg) 'magit-header-line-log-select t msg) - (when (memq magit-log-select-show-usage '(both header-line)) - (magit-set-header-line-format msg)) - (when (memq magit-log-select-show-usage '(both echo-area)) - (message "%s" (substring-no-properties msg))))) - -(defun magit-log-select-pick () - "Select the commit at point and act on it. -Call `magit-log-select-pick-function' with the selected -commit as argument." - (interactive) - (let ((fun magit-log-select-pick-function) - (rev (magit-commit-at-point))) - (magit-mode-bury-buffer 'kill) - (funcall fun rev))) - -(defun magit-log-select-quit () - "Abort selecting a commit, don't act on any commit." - (interactive) - (magit-mode-bury-buffer 'kill) - (when magit-log-select-quit-function - (funcall magit-log-select-quit-function))) - -;;; Cherry Mode - -(defvar magit-cherry-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-mode-map) - (define-key map "q" 'magit-log-bury-buffer) - (define-key map "L" 'magit-margin-settings) - map) - "Keymap for `magit-cherry-mode'.") - -(define-derived-mode magit-cherry-mode magit-mode "Magit Cherry" - "Mode for looking at commits not merged upstream. - -\\\ -Type \\[magit-refresh] to refresh the current buffer. -Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \ -to visit the commit at point. - -Type \\[magit-cherry-pick] to apply the commit at point. - -\\{magit-cherry-mode-map}" - :group 'magit-log - (hack-dir-local-variables-non-file-buffer) - (setq imenu-create-index-function - 'magit-imenu--cherry-create-index-function)) - -(defun magit-cherry-setup-buffer (head upstream) - (magit-setup-buffer #'magit-cherry-mode nil - (magit-buffer-refname head) - (magit-buffer-upstream upstream) - (magit-buffer-range (concat upstream ".." head)))) - -(defun magit-cherry-refresh-buffer () - (magit-insert-section (cherry) - (magit-run-section-hook 'magit-cherry-sections-hook))) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-cherry-mode)) - magit-buffer-range) - -;;;###autoload -(defun magit-cherry (head upstream) - "Show commits in a branch that are not merged in the upstream branch." - (interactive - (let ((head (magit-read-branch "Cherry head"))) - (list head (magit-read-other-branch "Cherry upstream" head - (magit-get-upstream-branch head))))) - (require 'magit) - (magit-cherry-setup-buffer head upstream)) - -(defun magit-insert-cherry-headers () - "Insert headers appropriate for `magit-cherry-mode' buffers." - (let ((branch (propertize magit-buffer-refname - 'font-lock-face 'magit-branch-local)) - (upstream (propertize magit-buffer-upstream 'font-lock-face - (if (magit-local-branch-p magit-buffer-upstream) - 'magit-branch-local - 'magit-branch-remote)))) - (magit-insert-head-branch-header branch) - (magit-insert-upstream-branch-header branch upstream "Upstream: ") - (insert ?\n))) - -(defun magit-insert-cherry-commits () - "Insert commit sections into a `magit-cherry-mode' buffer." - (magit-insert-section (cherries) - (magit-insert-heading "Cherry commits:") - (magit-git-wash (apply-partially 'magit-log-wash-log 'cherry) - "cherry" "-v" "--abbrev" - magit-buffer-upstream - magit-buffer-refname))) - -;;; Log Sections -;;;; Standard Log Sections - -(defvar magit-unpulled-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-diff-dwim) - map) - "Keymap for `unpulled' sections.") - -(magit-define-section-jumper magit-jump-to-unpulled-from-upstream - "Unpulled from @{upstream}" unpulled "..@{upstream}") - -(defun magit-insert-unpulled-from-upstream () - "Insert commits that haven't been pulled from the upstream yet." - (when-let ((upstream (magit-get-upstream-branch))) - (magit-insert-section (unpulled "..@{upstream}" t) - (magit-insert-heading - (format (propertize "Unpulled from %s." - 'font-lock-face 'magit-section-heading) - upstream)) - (magit-insert-log "..@{upstream}" magit-buffer-log-args) - (magit-log-insert-child-count)))) - -(magit-define-section-jumper magit-jump-to-unpulled-from-pushremote - "Unpulled from " unpulled - (concat ".." (magit-get-push-branch))) - -(defun magit-insert-unpulled-from-pushremote () - "Insert commits that haven't been pulled from the push-remote yet." - (--when-let (magit-get-push-branch) - (unless (and (equal (magit-rev-name it) - (magit-rev-name "@{upstream}")) - (or (memq 'magit-insert-unpulled-from-upstream - magit-status-sections-hook) - (memq 'magit-insert-unpulled-from-upstream-or-recent - magit-status-sections-hook))) - (magit-insert-section (unpulled (concat ".." it) t) - (magit-insert-heading - (format (propertize "Unpulled from %s." - 'font-lock-face 'magit-section-heading) - (propertize it 'font-lock-face 'magit-branch-remote))) - (magit-insert-log (concat ".." it) magit-buffer-log-args) - (magit-log-insert-child-count))))) - -(defvar magit-unpushed-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-diff-dwim) - map) - "Keymap for `unpushed' sections.") - -(magit-define-section-jumper magit-jump-to-unpushed-to-upstream - "Unpushed to @{upstream}" unpushed "@{upstream}..") - -(defun magit-insert-unpushed-to-upstream-or-recent () - "Insert section showing unpushed or other recent commits. -If an upstream is configured for the current branch and it is -behind of the current branch, then show the commits that have -not yet been pushed into the upstream branch. If no upstream is -configured or if the upstream is not behind of the current branch, -then show the last `magit-log-section-commit-count' commits." - (let ((upstream (magit-get-upstream-branch))) - (if (or (not upstream) - (magit-rev-ancestor-p "HEAD" upstream)) - (magit-insert-recent-commits 'unpushed "@{upstream}..") - (magit-insert-unpushed-to-upstream)))) - -(defun magit-insert-unpushed-to-upstream () - "Insert commits that haven't been pushed to the upstream yet." - (when (magit-git-success "rev-parse" "@{upstream}") - (magit-insert-section (unpushed "@{upstream}..") - (magit-insert-heading - (format (propertize "Unmerged into %s." - 'font-lock-face 'magit-section-heading) - (magit-get-upstream-branch))) - (magit-insert-log "@{upstream}.." magit-buffer-log-args) - (magit-log-insert-child-count)))) - -(defun magit-insert-recent-commits (&optional type value) - "Insert section showing recent commits. -Show the last `magit-log-section-commit-count' commits." - (let* ((start (format "HEAD~%s" magit-log-section-commit-count)) - (range (and (magit-rev-verify start) - (concat start "..HEAD")))) - (magit-insert-section ((eval (or type 'recent)) - (or value range) - t) - (magit-insert-heading "Recent commits") - (magit-insert-log range - (cons (format "-n%d" magit-log-section-commit-count) - (--remove (string-prefix-p "-n" it) - magit-buffer-log-args)))))) - -(magit-define-section-jumper magit-jump-to-unpushed-to-pushremote - "Unpushed to " unpushed - (concat (magit-get-push-branch) "..")) - -(defun magit-insert-unpushed-to-pushremote () - "Insert commits that haven't been pushed to the push-remote yet." - (--when-let (magit-get-push-branch) - (unless (and (equal (magit-rev-name it) - (magit-rev-name "@{upstream}")) - (or (memq 'magit-insert-unpushed-to-upstream - magit-status-sections-hook) - (memq 'magit-insert-unpushed-to-upstream-or-recent - magit-status-sections-hook))) - (magit-insert-section (unpushed (concat it "..") t) - (magit-insert-heading - (format (propertize "Unpushed to %s." - 'font-lock-face 'magit-section-heading) - (propertize it 'font-lock-face 'magit-branch-remote))) - (magit-insert-log (concat it "..") magit-buffer-log-args) - (magit-log-insert-child-count))))) - -(defun magit-log-insert-child-count () - (when magit-section-show-child-count - (let ((count (length (oref magit-insert-section--current children)))) - (when (> count 0) - (when (= count (magit-log-get-commit-limit)) - (setq count (format "%s+" count))) - (save-excursion - (goto-char (- (oref magit-insert-section--current content) 2)) - (insert (format " (%s)" count)) - (delete-char 1)))))) - -;;;; Auxiliary Log Sections - -(defun magit-insert-unpulled-cherries () - "Insert section showing unpulled commits. -Like `magit-insert-unpulled-from-upstream' but prefix each commit -which has not been applied yet (i.e. a commit with a patch-id -not shared with any local commit) with \"+\", and all others with -\"-\"." - (when (magit-git-success "rev-parse" "@{upstream}") - (magit-insert-section (unpulled "..@{upstream}") - (magit-insert-heading "Unpulled commits:") - (magit-git-wash (apply-partially 'magit-log-wash-log 'cherry) - "cherry" "-v" (magit-abbrev-arg) - (magit-get-current-branch) "@{upstream}")))) - -(defun magit-insert-unpushed-cherries () - "Insert section showing unpushed commits. -Like `magit-insert-unpushed-to-upstream' but prefix each commit -which has not been applied to upstream yet (i.e. a commit with -a patch-id not shared with any upstream commit) with \"+\", and -all others with \"-\"." - (when (magit-git-success "rev-parse" "@{upstream}") - (magit-insert-section (unpushed "@{upstream}..") - (magit-insert-heading "Unpushed commits:") - (magit-git-wash (apply-partially 'magit-log-wash-log 'cherry) - "cherry" "-v" (magit-abbrev-arg) "@{upstream}")))) - -;;; _ -(provide 'magit-log) -;;; magit-log.el ends here diff --git a/elpa/magit-20200418.939/magit-log.elc b/elpa/magit-20200418.939/magit-log.elc deleted file mode 100644 index bb11fc8c2fc2ac5342f09dd9fa32d76c48f4c19e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98534 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 diff --git a/elpa/magit-20200418.939/magit-margin.el b/elpa/magit-20200418.939/magit-margin.el deleted file mode 100644 index af85389c..00000000 --- a/elpa/magit-20200418.939/magit-margin.el +++ /dev/null @@ -1,241 +0,0 @@ -;;; magit-margin.el --- margins in Magit buffers -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for showing additional information -;; in the margins of Magit buffers. Currently this is only used for -;; commits, for which the committer date or age, and optionally the -;; author name are shown. - -;;; Code: - -(require 'dash) - -(eval-when-compile - (require 'subr-x)) - -(require 'magit-section) -(require 'magit-transient) -(require 'magit-mode) - -(defgroup magit-margin nil - "Information Magit displays in the margin. - -You can change the STYLE and AUTHOR-WIDTH of all `magit-*-margin' -options to the same values by customizing `magit-log-margin' -*before* `magit' is loaded. If you do that, then the respective -values for the other options will default to what you have set -for that variable. Likewise if you set `magit-log-margin's INIT -to nil, then that is used in the default of all other options. But -setting it to t, i.e. re-enforcing the default for that option, -does not carry to other options." - :link '(info-link "(magit)Log Margin") - :group 'magit-log) - -(defvar-local magit-buffer-margin nil) -(put 'magit-buffer-margin 'permanent-local t) - -(defvar-local magit-set-buffer-margin-refresh nil) - -(defvar magit--age-spec) - -;;; Commands - -(define-transient-command magit-margin-settings () - "Change what information is displayed in the margin." - :info-manual "(magit) Log Margin" - ["Margin" - ("L" "Toggle visibility" magit-toggle-margin) - ("l" "Cycle style" magit-cycle-margin-style) - ("d" "Toggle details" magit-toggle-margin-details) - ("v" "Change verbosity" magit-refs-set-show-commit-count - :if-derived magit-refs-mode)]) - -(defun magit-toggle-margin () - "Show or hide the Magit margin." - (interactive) - (unless (magit-margin-option) - (user-error "Magit margin isn't supported in this buffer")) - (setcar magit-buffer-margin (not (magit-buffer-margin-p))) - (magit-set-buffer-margin)) - -(defun magit-cycle-margin-style () - "Cycle style used for the Magit margin." - (interactive) - (unless (magit-margin-option) - (user-error "Magit margin isn't supported in this buffer")) - ;; This is only suitable for commit margins (there are not others). - (setf (cadr magit-buffer-margin) - (pcase (cadr magit-buffer-margin) - (`age 'age-abbreviated) - (`age-abbreviated - (let ((default (cadr (symbol-value (magit-margin-option))))) - (if (stringp default) default "%Y-%m-%d %H:%M "))) - (_ 'age))) - (magit-set-buffer-margin nil t)) - -(defun magit-toggle-margin-details () - "Show or hide details in the Magit margin." - (interactive) - (unless (magit-margin-option) - (user-error "Magit margin isn't supported in this buffer")) - (setf (nth 3 magit-buffer-margin) - (not (nth 3 magit-buffer-margin))) - (magit-set-buffer-margin nil t)) - -;;; Core - -(defun magit-buffer-margin-p () - (car magit-buffer-margin)) - -(defun magit-margin-option () - (pcase major-mode - (`magit-cherry-mode 'magit-cherry-margin) - (`magit-log-mode 'magit-log-margin) - (`magit-log-select-mode 'magit-log-select-margin) - (`magit-reflog-mode 'magit-reflog-margin) - (`magit-refs-mode 'magit-refs-margin) - (`magit-stashes-mode 'magit-stashes-margin) - (`magit-status-mode 'magit-status-margin) - (`forge-notifications-mode 'magit-status-margin))) - -(defun magit-set-buffer-margin (&optional reset refresh) - (when-let ((option (magit-margin-option))) - (let* ((default (symbol-value option)) - (default-width (nth 2 default))) - (when (or reset (not magit-buffer-margin)) - (setq magit-buffer-margin (copy-sequence default))) - (pcase-let ((`(,enable ,style ,_width ,details ,details-width) - magit-buffer-margin)) - (when (functionp default-width) - (setf (nth 2 magit-buffer-margin) - (funcall default-width style details details-width))) - (dolist (window (get-buffer-window-list nil nil 0)) - (with-selected-window window - (magit-set-window-margin window) - (if enable - (add-hook 'window-configuration-change-hook - 'magit-set-window-margin nil t) - (remove-hook 'window-configuration-change-hook - 'magit-set-window-margin t)))) - (when (and enable (or refresh magit-set-buffer-margin-refresh)) - (magit-refresh-buffer)))))) - -(defun magit-set-window-margin (&optional window) - (when (or window (setq window (get-buffer-window))) - (with-selected-window window - (set-window-margins - nil (car (window-margins)) - (and (magit-buffer-margin-p) - (nth 2 magit-buffer-margin)))))) - -(defun magit-make-margin-overlay (&optional string previous-line) - (if previous-line - (save-excursion - (forward-line -1) - (magit-make-margin-overlay string)) - ;; Don't put the overlay on the complete line to work around #1880. - (let ((o (make-overlay (1+ (line-beginning-position)) - (line-end-position) - nil t))) - (overlay-put o 'evaporate t) - (overlay-put o 'before-string - (propertize "o" 'display - (list (list 'margin 'right-margin) - (or string " "))))))) - -(defun magit-maybe-make-margin-overlay () - (when (or (magit-section-match - '(unpulled unpushed recent stashes local cherries) - magit-insert-section--current) - (and (eq major-mode 'magit-refs-mode) - (magit-section-match - '(remote commit tags) - magit-insert-section--current))) - (magit-make-margin-overlay nil t))) - -;;; Custom Support - -(defun magit-margin-set-variable (mode symbol value) - (set-default symbol value) - (message "Updating margins in %s buffers..." mode) - (dolist (buffer (buffer-list)) - (with-current-buffer buffer - (when (eq major-mode mode) - (magit-set-buffer-margin t) - (magit-refresh)))) - (message "Updating margins in %s buffers...done" mode)) - -(defconst magit-log-margin--custom-type - '(list (boolean :tag "Show margin initially") - (choice :tag "Show committer" - (string :tag "date using time-format" "%Y-%m-%d %H:%M ") - (const :tag "date's age" age) - (const :tag "date's age (abbreviated)" age-abbreviated)) - (const :tag "Calculate width using magit-log-margin-width" - magit-log-margin-width) - (boolean :tag "Show author name by default") - (integer :tag "Show author name using width"))) - -;;; Time Utilities - -(defvar magit--age-spec - `((?Y "year" "years" ,(round (* 60 60 24 365.2425))) - (?M "month" "months" ,(round (* 60 60 24 30.436875))) - (?w "week" "weeks" ,(* 60 60 24 7)) - (?d "day" "days" ,(* 60 60 24)) - (?h "hour" "hours" ,(* 60 60)) - (?m "minute" "minutes" 60) - (?s "second" "seconds" 1)) - "Time units used when formatting relative commit ages. - -The value is a list of time units, beginning with the longest. -Each element has the form (CHAR UNIT UNITS SECONDS). UNIT is the -time unit, UNITS is the plural of that unit. CHAR is a character -abbreviation. And SECONDS is the number of seconds in one UNIT. - -This is defined as a variable to make it possible to use time -units for a language other than English. It is not defined -as an option, because most other parts of Magit are always in -English.") - -(defun magit--age (date &optional abbreviate) - (cl-labels ((fn (age spec) - (pcase-let ((`(,char ,unit ,units ,weight) (car spec))) - (let ((cnt (round (/ age weight 1.0)))) - (if (or (not (cdr spec)) - (>= (/ age weight) 1)) - (list cnt (cond (abbreviate char) - ((= cnt 1) unit) - (t units))) - (fn age (cdr spec))))))) - (fn (abs (- (float-time) - (if (stringp date) - (string-to-number date) - date))) - magit--age-spec))) - -;;; _ -(provide 'magit-margin) -;;; magit-margin.el ends here diff --git a/elpa/magit-20200418.939/magit-margin.elc b/elpa/magit-20200418.939/magit-margin.elc deleted file mode 100644 index f6ed55f6760da67033e782b7173d15fa04eca42c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8237 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 diff --git a/elpa/magit-20200418.939/magit-merge.el b/elpa/magit-20200418.939/magit-merge.el deleted file mode 100644 index 7ea12eab..00000000 --- a/elpa/magit-20200418.939/magit-merge.el +++ /dev/null @@ -1,302 +0,0 @@ -;;; magit-merge.el --- merge functionality -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements merge commands. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) -(require 'magit-diff) - -(declare-function magit-git-push "magit-push" (branch target args)) - -;;; Commands - -;;;###autoload (autoload 'magit-merge "magit" nil t) -(define-transient-command magit-merge () - "Merge branches." - :man-page "git-merge" - :incompatible '(("--ff-only" "--no-ff")) - ["Arguments" - :if-not magit-merge-in-progress-p - ("-f" "Fast-forward only" "--ff-only") - ("-n" "No fast-forward" "--no-ff") - (magit-merge:--strategy) - (5 magit-diff:--diff-algorithm :argument "--Xdiff-algorithm=") - (5 magit:--gpg-sign)] - ["Actions" - :if-not magit-merge-in-progress-p - [("m" "Merge" magit-merge-plain) - ("e" "Merge and edit message" magit-merge-editmsg) - ("n" "Merge but don't commit" magit-merge-nocommit) - ("a" "Absorb" magit-merge-absorb)] - [("p" "Preview merge" magit-merge-preview) - "" - ("s" "Squash merge" magit-merge-squash) - ("i" "Merge into" magit-merge-into)]] - ["Actions" - :if magit-merge-in-progress-p - ("m" "Commit merge" magit-commit-create) - ("a" "Abort merge" magit-merge-abort)]) - -(defun magit-merge-arguments () - (transient-args 'magit-merge)) - -(define-infix-argument magit-merge:--strategy () - :description "Strategy" - :class 'transient-option - ;; key for merge and rebase: "-s" - ;; key for cherry-pick and revert: "=s" - ;; shortarg for merge and rebase: "-s" - ;; shortarg for cherry-pick and revert: none - :key "-s" - :argument "--strategy=" - :choices '("resolve" "recursive" "octopus" "ours" "subtree")) - -;;;###autoload -(defun magit-merge-plain (rev &optional args nocommit) - "Merge commit REV into the current branch; using default message. - -Unless there are conflicts or a prefix argument is used create a -merge commit using a generic commit message and without letting -the user inspect the result. With a prefix argument pretend the -merge failed to give the user the opportunity to inspect the -merge. - -\(git merge --no-edit|--no-commit [ARGS] REV)" - (interactive (list (magit-read-other-branch-or-commit "Merge") - (magit-merge-arguments) - current-prefix-arg)) - (magit-merge-assert) - (magit-run-git-async "merge" (if nocommit "--no-commit" "--no-edit") args rev)) - -;;;###autoload -(defun magit-merge-editmsg (rev &optional args) - "Merge commit REV into the current branch; and edit message. -Perform the merge and prepare a commit message but let the user -edit it. -\n(git merge --edit --no-ff [ARGS] REV)" - (interactive (list (magit-read-other-branch-or-commit "Merge") - (magit-merge-arguments))) - (magit-merge-assert) - (cl-pushnew "--no-ff" args :test #'equal) - (apply #'magit-run-git-with-editor "merge" "--edit" - (append (delete "--ff-only" args) - (list rev)))) - -;;;###autoload -(defun magit-merge-nocommit (rev &optional args) - "Merge commit REV into the current branch; pretending it failed. -Pretend the merge failed to give the user the opportunity to -inspect the merge and change the commit message. -\n(git merge --no-commit --no-ff [ARGS] REV)" - (interactive (list (magit-read-other-branch-or-commit "Merge") - (magit-merge-arguments))) - (magit-merge-assert) - (cl-pushnew "--no-ff" args :test #'equal) - (magit-run-git-async "merge" "--no-commit" args rev)) - -;;;###autoload -(defun magit-merge-into (branch &optional args) - "Merge the current branch into BRANCH and remove the former. - -Before merging, force push the source branch to its push-remote, -provided the respective remote branch already exists, ensuring -that the respective pull-request (if any) won't get stuck on some -obsolete version of the commits that are being merged. Finally -if `forge-branch-pullreq' was used to create the merged branch, -branch, then also remove the respective remote branch." - (interactive - (list (magit-read-other-local-branch - (format "Merge `%s' into" (magit-get-current-branch)) - nil - (when-let ((upstream (magit-get-upstream-branch)) - (upstream (cdr (magit-split-branch-name upstream)))) - (and (magit-branch-p upstream) upstream))) - (magit-merge-arguments))) - (let ((current (magit-get-current-branch))) - (when (zerop (magit-call-git "checkout" branch)) - (magit--merge-absorb current args)))) - -;;;###autoload -(defun magit-merge-absorb (branch &optional args) - "Merge BRANCH into the current branch and remove the former. - -Before merging, force push the source branch to its push-remote, -provided the respective remote branch already exists, ensuring -that the respective pull-request (if any) won't get stuck on some -obsolete version of the commits that are being merged. Finally -if `forge-branch-pullreq' was used to create the merged branch, -then also remove the respective remote branch." - (interactive (list (magit-read-other-local-branch "Absorb branch") - (magit-merge-arguments))) - (magit--merge-absorb branch args)) - -(defun magit--merge-absorb (branch args) - (when (equal branch "master") - (unless (yes-or-no-p - "Do you really want to merge `master' into another branch? ") - (user-error "Abort"))) - (if-let ((target (magit-get-push-branch branch t))) - (progn - (magit-git-push branch target (list "--force-with-lease")) - (set-process-sentinel - magit-this-process - (lambda (process event) - (when (memq (process-status process) '(exit signal)) - (if (not (zerop (process-exit-status process))) - (magit-process-sentinel process event) - (process-put process 'inhibit-refresh t) - (magit-process-sentinel process event) - (magit--merge-absorb-1 branch args)))))) - (magit--merge-absorb-1 branch args))) - -(defun magit--merge-absorb-1 (branch args) - (if-let ((pr (magit-get "branch" branch "pullRequest"))) - (magit-run-git-async - "merge" args "-m" - (format "Merge branch '%s'%s [#%s]" - branch - (let ((current (magit-get-current-branch))) - (if (equal current "master") "" (format " into %s" current))) - pr) - branch) - (magit-run-git-async "merge" args "--no-edit" branch)) - (set-process-sentinel - magit-this-process - (lambda (process event) - (when (memq (process-status process) '(exit signal)) - (if (> (process-exit-status process) 0) - (magit-process-sentinel process event) - (process-put process 'inhibit-refresh t) - (magit-process-sentinel process event) - (magit-branch-maybe-delete-pr-remote branch) - (magit-branch-unset-pushRemote branch) - (magit-run-git "branch" "-D" branch)))))) - -;;;###autoload -(defun magit-merge-squash (rev) - "Squash commit REV into the current branch; don't create a commit. -\n(git merge --squash REV)" - (interactive (list (magit-read-other-branch-or-commit "Squash"))) - (magit-merge-assert) - (magit-run-git-async "merge" "--squash" rev)) - -;;;###autoload -(defun magit-merge-preview (rev) - "Preview result of merging REV into the current branch." - (interactive (list (magit-read-other-branch-or-commit "Preview merge"))) - (magit-merge-preview-setup-buffer rev)) - -;;;###autoload -(defun magit-merge-abort () - "Abort the current merge operation. -\n(git merge --abort)" - (interactive) - (unless (file-exists-p (magit-git-dir "MERGE_HEAD")) - (user-error "No merge in progress")) - (magit-confirm 'abort-merge) - (magit-run-git-async "merge" "--abort")) - -(defun magit-checkout-stage (file arg) - "During a conflict checkout and stage side, or restore conflict." - (interactive - (let ((file (magit-completing-read "Checkout file" - (magit-tracked-files) nil nil nil - 'magit-read-file-hist - (magit-current-file)))) - (cond ((member file (magit-unmerged-files)) - (list file (magit-checkout-read-stage file))) - ((yes-or-no-p (format "Restore conflicts in %s? " file)) - (list file "--merge")) - (t - (user-error "Quit"))))) - (pcase (cons arg (cddr (car (magit-file-status file)))) - ((or `("--ours" ?D ,_) - `("--theirs" ,_ ?D)) - (magit-run-git "rm" "--" file)) - (_ (if (equal arg "--merge") - ;; This fails if the file was deleted on one - ;; side. And we cannot do anything about it. - (magit-run-git "checkout" "--merge" "--" file) - (magit-call-git "checkout" arg "--" file) - (magit-run-git "add" "-u" "--" file))))) - -;;; Utilities - -(defun magit-merge-in-progress-p () - (file-exists-p (magit-git-dir "MERGE_HEAD"))) - -(defun magit--merge-range (&optional head) - (unless head - (setq head (magit-get-shortname - (car (magit-file-lines (magit-git-dir "MERGE_HEAD")))))) - (and head - (concat (magit-git-string "merge-base" "--octopus" "HEAD" head) - ".." head))) - -(defun magit-merge-assert () - (or (not (magit-anything-modified-p t)) - (magit-confirm 'merge-dirty - "Merging with dirty worktree is risky. Continue"))) - -(defun magit-checkout-read-stage (file) - (magit-read-char-case (format "For %s checkout: " file) t - (?o "[o]ur stage" "--ours") - (?t "[t]heir stage" "--theirs") - (?c "[c]onflict" "--merge"))) - -;;; Sections - -(defvar magit-unmerged-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-diff-dwim) - map) - "Keymap for `unmerged' sections.") - -(defun magit-insert-merge-log () - "Insert section for the on-going merge. -Display the heads that are being merged. -If no merge is in progress, do nothing." - (when (magit-merge-in-progress-p) - (let* ((heads (mapcar #'magit-get-shortname - (magit-file-lines (magit-git-dir "MERGE_HEAD")))) - (range (magit--merge-range (car heads)))) - (magit-insert-section (unmerged range) - (magit-insert-heading - (format "Merging %s:" (mapconcat #'identity heads ", "))) - (magit-insert-log - range - (let ((args magit-buffer-log-args)) - (unless (member "--decorate=full" magit-buffer-log-args) - (push "--decorate=full" args)) - args)))))) - -;;; _ -(provide 'magit-merge) -;;; magit-merge.el ends here diff --git a/elpa/magit-20200418.939/magit-merge.elc b/elpa/magit-20200418.939/magit-merge.elc deleted file mode 100644 index 71ca9901fb9f99096b4697934e0f93285d5b73eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13564 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 K#=pYsZ2T8=J4|8# diff --git a/elpa/magit-20200418.939/magit-mode.el b/elpa/magit-20200418.939/magit-mode.el deleted file mode 100644 index 6a3804d4..00000000 --- a/elpa/magit-20200418.939/magit-mode.el +++ /dev/null @@ -1,1431 +0,0 @@ -;;; magit-mode.el --- create and refresh Magit buffers -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements the abstract major-mode `magit-mode' from -;; which almost all other Magit major-modes derive. The code in here -;; is mostly concerned with creating and refreshing Magit buffers. - -;;; Code: - -(require 'cl-lib) -(require 'dash) - -(eval-when-compile - (require 'subr-x)) - -(require 'transient) - -(require 'magit-section) -(require 'magit-git) - -;; For `magit-display-buffer-fullcolumn-most-v1' from `git-commit' -(defvar git-commit-mode) -;; For `magit-refresh' -(defvar magit-post-commit-hook-commands) -(defvar magit-post-stage-hook-commands) -(defvar magit-post-unstage-hook-commands) -;; For `magit-refresh' and `magit-refresh-all' -(declare-function magit-auto-revert-buffers "magit-autorevert" ()) -;; For `magit-refresh-buffer' -(declare-function magit-process-unset-mode-line-error-status "magit-process" ()) -;; For `magit-refresh-get-relative-position' -(declare-function magit-hunk-section-p "magit-diff" (obj)) -;; For `magit-mode-setup-internal' -(declare-function magit-status-goto-initial-section "magit-status" ()) -;; For `magit-mode' from `bookmark' -(defvar bookmark-make-record-function) - -(require 'format-spec) -(require 'help-mode) - -;;; Options - -(defcustom magit-mode-hook - '(magit-load-config-extensions) - "Hook run when entering a mode derived from Magit mode." - :package-version '(magit . "3.0.0") - :group 'magit-modes - :type 'hook - :options '(magit-load-config-extensions - bug-reference-mode)) - -(defcustom magit-setup-buffer-hook - '(magit-maybe-save-repository-buffers - magit-set-buffer-margin) - "Hook run by `magit-setup-buffer'. - -This is run right after displaying the buffer and right before -generating or updating its content. `magit-mode-hook' and other, -more specific, `magit-mode-*-hook's on the other hand are run -right before displaying the buffer. Usually one of these hooks -should be used instead of this one." - :package-version '(magit . "2.3.0") - :group 'magit-modes - :type 'hook - :options '(magit-maybe-save-repository-buffers - magit-set-buffer-margin)) - -(defcustom magit-pre-refresh-hook '(magit-maybe-save-repository-buffers) - "Hook run before refreshing in `magit-refresh'. - -This hook, or `magit-post-refresh-hook', should be used -for functions that are not tied to a particular buffer. - -To run a function with a particular buffer current, use -`magit-refresh-buffer-hook' and use `derived-mode-p' -inside your function." - :package-version '(magit . "2.4.0") - :group 'magit-refresh - :type 'hook - :options '(magit-maybe-save-repository-buffers)) - -(defcustom magit-post-refresh-hook nil - "Hook run after refreshing in `magit-refresh'. - -This hook, or `magit-pre-refresh-hook', should be used -for functions that are not tied to a particular buffer. - -To run a function with a particular buffer current, use -`magit-refresh-buffer-hook' and use `derived-mode-p' -inside your function." - :package-version '(magit . "2.4.0") - :group 'magit-refresh - :type 'hook) - -(defcustom magit-display-buffer-function 'magit-display-buffer-traditional - "The function used display a Magit buffer. - -All Magit buffers (buffers whose major-modes derive from -`magit-mode') are displayed using `magit-display-buffer', -which in turn uses the function specified here." - :package-version '(magit . "2.3.0") - :group 'magit-buffers - :type '(radio (function-item magit-display-buffer-traditional) - (function-item magit-display-buffer-same-window-except-diff-v1) - (function-item magit-display-buffer-fullframe-status-v1) - (function-item magit-display-buffer-fullframe-status-topleft-v1) - (function-item magit-display-buffer-fullcolumn-most-v1) - (function-item display-buffer) - (function :tag "Function"))) - -(defcustom magit-pre-display-buffer-hook '(magit-save-window-configuration) - "Hook run by `magit-display-buffer' before displaying the buffer." - :package-version '(magit . "2.3.0") - :group 'magit-buffers - :type 'hook - :get 'magit-hook-custom-get - :options '(magit-save-window-configuration)) - -(defcustom magit-post-display-buffer-hook '(magit-maybe-set-dedicated) - "Hook run by `magit-display-buffer' after displaying the buffer." - :package-version '(magit . "2.3.0") - :group 'magit-buffers - :type 'hook - :get 'magit-hook-custom-get - :options '(magit-maybe-set-dedicated)) - -(defcustom magit-generate-buffer-name-function - 'magit-generate-buffer-name-default-function - "The function used to generate the name for a Magit buffer." - :package-version '(magit . "2.3.0") - :group 'magit-buffers - :type '(radio (function-item magit-generate-buffer-name-default-function) - (function :tag "Function"))) - -(defcustom magit-buffer-name-format "%x%M%v: %t%x" - "The format string used to name Magit buffers. - -The following %-sequences are supported: - -`%m' The name of the major-mode, but with the `-mode' suffix - removed. - -`%M' Like \"%m\" but abbreviate `magit-status-mode' as `magit'. - -`%v' The value the buffer is locked to, in parentheses, or an - empty string if the buffer is not locked to a value. - -`%V' Like \"%v\", but the string is prefixed with a space, unless - it is an empty string. - -`%t' The top-level directory of the working tree of the - repository, or if `magit-uniquify-buffer-names' is non-nil - an abbreviation of that. - -`%x' If `magit-uniquify-buffer-names' is nil \"*\", otherwise the - empty string. Due to limitations of the `uniquify' package, - buffer names must end with the path. - -`%T' Obsolete, use \"%t%x\" instead. Like \"%t\", but append an - asterisk if and only if `magit-uniquify-buffer-names' is nil. - -The value should always contain \"%m\" or \"%M\", \"%v\" or -\"%V\", and \"%t\" (or the obsolete \"%T\"). - -If `magit-uniquify-buffer-names' is non-nil, then the value must -end with \"%t\" or \"%t%x\" (or the obsolete \"%T\"). See issue -#2841. - -This is used by `magit-generate-buffer-name-default-function'. -If another `magit-generate-buffer-name-function' is used, then -it may not respect this option, or on the contrary it may -support additional %-sequences." - :package-version '(magit . "2.12.0") - :group 'magit-buffers - :type 'string) - -(defcustom magit-uniquify-buffer-names t - "Whether to uniquify the names of Magit buffers." - :package-version '(magit . "2.3.0") - :group 'magit-buffers - :type 'boolean) - -(defcustom magit-bury-buffer-function 'magit-restore-window-configuration - "The function used to bury or kill the current Magit buffer." - :package-version '(magit . "2.3.0") - :group 'magit-buffers - :type '(radio (function-item quit-window) - (function-item magit-mode-quit-window) - (function-item magit-restore-window-configuration) - (function :tag "Function"))) - -(defcustom magit-prefix-use-buffer-arguments 'selected - "Whether certain prefix commands reuse arguments active in relevant buffer. - -This affects the transient prefix commands `magit-diff', -`magit-log' and `magit-show-refs'. - -Valid values are: - -`always': Always use the set of arguments that is currently - active in the respective buffer, provided that buffer exists - of course. -`selected': Use the set of arguments from the respective - buffer, but only if it is displayed in a window of the current - frame. This is the default. -`current': Use the set of arguments from the respective buffer, - but only if it is the current buffer. -`never': Never use the set of arguments from the respective - buffer. - -For more information see info node `(magit)Transient Arguments -and Buffer Arguments'." - :package-version '(magit . "3.0.0") - :group 'magit-buffers - :group 'magit-commands - :type '(choice - (const :tag "always use args from buffer" always) - (const :tag "use args from buffer if displayed in frame" selected) - (const :tag "use args from buffer if it is current" current) - (const :tag "never use args from buffer" never))) - -(defcustom magit-direct-use-buffer-arguments 'selected - "Whether certain commands reuse arguments active in relevant buffer. - -This affects certain commands such as `magit-show-commit' that -are suffixes of the diff or log transient prefix commands, but -only if they are invoked directly, i.e. *not* as a suffix. - -Valid values are: - -`always': Always use the set of arguments that is currently - active in the respective buffer, provided that buffer exists - of course. -`selected': Use the set of arguments from the respective - buffer, but only if it is displayed in a window of the current - frame. This is the default. -`current': Use the set of arguments from the respective buffer, - but only if it is the current buffer. -`never': Never use the set of arguments from the respective - buffer. - -For more information see info node `(magit)Transient Arguments -and Buffer Arguments'." - :package-version '(magit . "3.0.0") - :group 'magit-buffers - :group 'magit-commands - :type '(choice - (const :tag "always use args from buffer" always) - (const :tag "use args from buffer if displayed in frame" selected) - (const :tag "use args from buffer if it is current" current) - (const :tag "never use args from buffer" never))) - -(defcustom magit-region-highlight-hook '(magit-diff-update-hunk-region) - "Functions used to highlight the region. - -Each function is run with the current section as only argument -until one of them returns non-nil. If all functions return nil, -then fall back to regular region highlighting." - :package-version '(magit . "2.1.0") - :group 'magit-refresh - :type 'hook - :options '(magit-diff-update-hunk-region)) - -(defcustom magit-create-buffer-hook nil - "Normal hook run after creating a new `magit-mode' buffer." - :package-version '(magit . "2.90.0") - :group 'magit-refresh - :type 'hook) - -(defcustom magit-refresh-buffer-hook nil - "Normal hook for `magit-refresh-buffer' to run after refreshing." - :package-version '(magit . "2.1.0") - :group 'magit-refresh - :type 'hook) - -(defcustom magit-refresh-status-buffer t - "Whether the status buffer is refreshed after running git. - -When this is non-nil, then the status buffer is automatically -refreshed after running git for side-effects, in addition to the -current Magit buffer, which is always refreshed automatically. - -Only set this to nil after exhausting all other options to -improve performance." - :package-version '(magit . "2.4.0") - :group 'magit-refresh - :group 'magit-status - :type 'boolean) - -(defcustom magit-refresh-verbose nil - "Whether to revert Magit buffers verbosely." - :package-version '(magit . "2.1.0") - :group 'magit-refresh - :type 'boolean) - -(defcustom magit-save-repository-buffers t - "Whether to save file-visiting buffers when appropriate. - -If non-nil, then all modified file-visiting buffers belonging -to the current repository may be saved before running Magit -commands and before creating or refreshing Magit buffers. -If `dontask', then this is done without user intervention, for -any other non-nil value the user has to confirm each save. - -The default is t to avoid surprises, but `dontask' is the -recommended value." - :group 'magit-essentials - :group 'magit-buffers - :type '(choice (const :tag "Never" nil) - (const :tag "Ask" t) - (const :tag "Save without asking" dontask))) - -;;; Key Bindings - -(defvar magit-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-section-mode-map) - (define-key map [C-return] 'magit-visit-thing) - (define-key map (kbd "C-m") 'magit-visit-thing) - (define-key map (kbd "C-M-i") 'magit-dired-jump) - (define-key map [M-tab] 'magit-section-cycle-diffs) - (define-key map (kbd "P") 'magit-push) - (define-key map (kbd "k") 'magit-delete-thing) - (define-key map (kbd "K") 'magit-file-untrack) - (define-key map (kbd "i") 'magit-gitignore) - (define-key map (kbd "I") 'magit-gitignore) - (define-key map (kbd "SPC") 'magit-diff-show-or-scroll-up) - (define-key map (kbd "DEL") 'magit-diff-show-or-scroll-down) - (define-key map "+" 'magit-diff-more-context) - (define-key map "-" 'magit-diff-less-context) - (define-key map "0" 'magit-diff-default-context) - (define-key map "$" 'magit-process-buffer) - (define-key map "%" 'magit-worktree) - (define-key map "a" 'magit-cherry-apply) - (define-key map "A" 'magit-cherry-pick) - (define-key map "b" 'magit-branch) - (define-key map "B" 'magit-bisect) - (define-key map "c" 'magit-commit) - (define-key map "C" 'magit-clone) - (define-key map "d" 'magit-diff) - (define-key map "D" 'magit-diff-refresh) - (define-key map "e" 'magit-ediff-dwim) - (define-key map "E" 'magit-ediff) - (define-key map "f" 'magit-fetch) - (define-key map "F" 'magit-pull) - (define-key map "g" 'magit-refresh) - (define-key map "G" 'magit-refresh-all) - (define-key map "h" 'magit-dispatch) - (define-key map "?" 'magit-dispatch) - (define-key map "l" 'magit-log) - (define-key map "L" 'magit-log-refresh) - (define-key map "m" 'magit-merge) - (define-key map "M" 'magit-remote) - (define-key map "o" 'magit-submodule) - (define-key map "O" 'magit-subtree) - (define-key map "q" 'magit-mode-bury-buffer) - (define-key map "r" 'magit-rebase) - (define-key map "R" 'magit-file-rename) - (define-key map "s" 'magit-stage-file) - (define-key map "S" 'magit-stage-modified) - (define-key map "t" 'magit-tag) - (define-key map "T" 'magit-notes) - (define-key map "u" 'magit-unstage-file) - (define-key map "U" 'magit-unstage-all) - (define-key map "v" 'magit-revert-no-commit) - (define-key map "V" 'magit-revert) - (define-key map "w" 'magit-am) - (define-key map "W" 'magit-patch) - (define-key map "x" 'magit-reset-quickly) - (define-key map "X" 'magit-reset) - (define-key map "y" 'magit-show-refs) - (define-key map "Y" 'magit-cherry) - (define-key map "z" 'magit-stash) - (define-key map "Z" 'magit-stash) - (define-key map ":" 'magit-git-command) - (define-key map "!" 'magit-run) - (define-key map (kbd "C-c C-c") 'magit-dispatch) - (define-key map (kbd "C-c C-e") 'magit-edit-thing) - (define-key map (kbd "C-c C-o") 'magit-browse-thing) - (define-key map (kbd "C-c C-w") 'magit-browse-thing) - (define-key map (kbd "C-x a") 'magit-add-change-log-entry) - (define-key map (kbd "C-x 4 a") 'magit-add-change-log-entry-other-window) - (define-key map (kbd "C-w") 'magit-copy-section-value) - (define-key map (kbd "M-w") 'magit-copy-buffer-revision) - (define-key map [remap previous-line] 'magit-previous-line) - (define-key map [remap next-line] 'magit-next-line) - (define-key map [remap evil-previous-line] 'evil-previous-visual-line) - (define-key map [remap evil-next-line] 'evil-next-visual-line) - map) - "Parent keymap for all keymaps of modes derived from `magit-mode'.") - -(defun magit-delete-thing () - "This is a placeholder command. -Where applicable, section-specific keymaps bind another command -which deletes the thing at point." - (interactive) - (user-error "There is no thing at point that could be deleted")) - -(defun magit-visit-thing () - "This is a placeholder command. -Where applicable, section-specific keymaps bind another command -which visits the thing at point." - (interactive) - (if (eq current-transient-command 'magit-dispatch) - (call-interactively (key-binding (this-command-keys))) - (user-error "There is no thing at point that could be visited"))) - -(defun magit-edit-thing () - "This is a placeholder command. -Where applicable, section-specific keymaps bind another command -which lets you edit the thing at point, likely in another buffer." - (interactive) - (if (eq current-transient-command 'magit-dispatch) - (call-interactively (key-binding (this-command-keys))) - (user-error "There is no thing at point that could be edited"))) - -(defun magit-browse-thing () - "This is a placeholder command. -Where applicable, section-specific keymaps bind another command -which visits the thing at point using `browse-url'." - (interactive) - (user-error "There is no thing at point that could be browsed")) - -(defvar bug-reference-map) -(with-eval-after-load 'bug-reference - (define-key bug-reference-map [remap magit-visit-thing] - 'bug-reference-push-button)) - -(easy-menu-define magit-mode-menu magit-mode-map - "Magit menu" - '("Magit" - ["Refresh" magit-refresh t] - ["Refresh all" magit-refresh-all t] - "---" - ["Stage" magit-stage t] - ["Stage modified" magit-stage-modified t] - ["Unstage" magit-unstage t] - ["Reset index" magit-reset-index t] - ["Commit" magit-commit t] - ["Add log entry" magit-commit-add-log t] - ["Tag" magit-tag-create t] - "---" - ["Diff working tree" magit-diff-working-tree t] - ["Diff" magit-diff t] - ("Log" - ["Log" magit-log-other t] - ["Reflog" magit-reflog-other t] - ["Extended..." magit-log t]) - "---" - ["Cherry pick" magit-cherry-pick t] - ["Revert commit" magit-revert t] - "---" - ["Ignore globally" magit-gitignore-globally t] - ["Ignore locally" magit-gitignore-locally t] - ["Discard" magit-discard t] - ["Reset head and index" magit-reset-mixed t] - ["Stash" magit-stash-both t] - ["Snapshot" magit-snapshot-both t] - "---" - ["Branch..." magit-checkout t] - ["Merge" magit-merge t] - ["Ediff resolve" magit-ediff-resolve t] - ["Rebase..." magit-rebase t] - "---" - ["Push" magit-push t] - ["Pull" magit-pull-branch t] - ["Remote update" magit-fetch-all t] - ("Submodule" - ["Submodule update" magit-submodule-update t] - ["Submodule update and init" magit-submodule-setup t] - ["Submodule init" magit-submodule-init t] - ["Submodule sync" magit-submodule-sync t]) - "---" - ("Extensions") - "---" - ["Display Git output" magit-process-buffer t] - ["Quit Magit" magit-mode-bury-buffer t])) - -;;; Mode - -(defun magit-load-config-extensions () - "Load Magit extensions that are defined at the Git config layer." - (dolist (ext (magit-get-all "magit.extension")) - (let ((sym (intern (format "magit-%s-mode" ext)))) - (when (fboundp sym) - (funcall sym 1))))) - -(define-derived-mode magit-mode magit-section-mode "Magit" - "Parent major mode from which Magit major modes inherit. - -Magit is documented in info node `(magit)'." - :group 'magit - (hack-dir-local-variables-non-file-buffer) - (setq mode-line-process (magit-repository-local-get 'mode-line-process)) - (setq-local bookmark-make-record-function 'magit--make-bookmark)) - -;;; Highlighting - -;;; Local Variables - -(defvar-local magit-buffer-arguments nil) -(defvar-local magit-buffer-diff-args nil) -(defvar-local magit-buffer-diff-files nil) -(defvar-local magit-buffer-diff-files-suspended nil) -(defvar-local magit-buffer-file-name nil) -(defvar-local magit-buffer-files nil) -(defvar-local magit-buffer-log-args nil) -(defvar-local magit-buffer-log-files nil) -(defvar-local magit-buffer-range nil) -(defvar-local magit-buffer-range-hashed nil) -(defvar-local magit-buffer-refname nil) -(defvar-local magit-buffer-revision nil) -(defvar-local magit-buffer-revision-hash nil) -(defvar-local magit-buffer-revisions nil) -(defvar-local magit-buffer-typearg nil) -(defvar-local magit-buffer-upstream nil) - -;; These variables are also used in file-visiting buffers. -;; Because the user may change the major-mode, they have -;; to be permanent buffer-local. -(put 'magit-buffer-file-name 'permanent-local t) -(put 'magit-buffer-refname 'permanent-local t) -(put 'magit-buffer-revision 'permanent-local t) -(put 'magit-buffer-revision-hash 'permanent-local t) - -;; `magit-status' re-enables mode function but its refresher -;; function does not reinstate this. -(put 'magit-buffer-diff-files-suspended 'permanent-local t) - -(defvar-local magit-refresh-args nil - "Obsolete. Possibly the arguments used to refresh the current buffer. -Some third-party packages might still use this, but Magit does not.") -(put 'magit-refresh-args 'permanent-local t) -(make-obsolete-variable 'magit-refresh-args nil "Magit 3.0.0") - -(defvar magit-buffer-lock-functions nil - "Obsolete buffer-locking support for third-party modes. -Implement the generic function `magit-buffer-value' for -your mode instead of adding an entry to this variable.") -(make-obsolete-variable 'magit-buffer-lock-functions nil "Magit 3.0.0") - -(cl-defgeneric magit-buffer-value () - (when-let ((fn (cdr (assq major-mode magit-buffer-lock-functions)))) - (funcall fn (with-no-warnings magit-refresh-args)))) - -(defvar-local magit-previous-section nil) -(put 'magit-previous-section 'permanent-local t) - -;;; Setup Buffer - -(defmacro magit-setup-buffer (mode &optional locked &rest bindings) - (declare (indent 2)) - `(magit-setup-buffer-internal - ,mode ,locked - ,(cons 'list (mapcar (pcase-lambda (`(,var ,form)) - `(list ',var ,form)) - bindings)))) - -(defun magit-setup-buffer-internal (mode locked bindings) - (let* ((value (and locked - (with-temp-buffer - (pcase-dolist (`(,var ,val) bindings) - (set (make-local-variable var) val)) - (let ((major-mode mode)) - (magit-buffer-value))))) - (buffer (magit-get-mode-buffer mode value)) - (section (and buffer (magit-current-section))) - (created (not buffer))) - (unless buffer - (setq buffer (magit-with-toplevel - (magit-generate-new-buffer mode value)))) - (with-current-buffer buffer - (setq magit-previous-section section) - (funcall mode) - (magit-xref-setup 'magit-setup-buffer-internal bindings) - (pcase-dolist (`(,var ,val) bindings) - (set (make-local-variable var) val)) - (when created - (magit-status-goto-initial-section) - (run-hooks 'magit-create-buffer-hook))) - (magit-display-buffer buffer) - (with-current-buffer buffer - (run-hooks 'magit-setup-buffer-hook) - (magit-refresh-buffer)) - buffer)) - -(defun magit-mode-setup (mode &rest args) - "Setup up a MODE buffer using ARGS to generate its content." - (declare (obsolete magit-setup-buffer "Magit 3.0.0")) - (with-no-warnings - (magit-mode-setup-internal mode args))) - -(defun magit-mode-setup-internal (mode args &optional locked) - "Setup up a MODE buffer using ARGS to generate its content. -When optional LOCKED is non-nil, then create a buffer that is -locked to its value, which is derived from MODE and ARGS." - (declare (obsolete magit-setup-buffer "Magit 3.0.0")) - (let* ((value (and locked - (with-temp-buffer - (with-no-warnings - (setq magit-refresh-args args)) - (let ((major-mode mode)) - (magit-buffer-value))))) - (buffer (magit-get-mode-buffer mode value)) - (section (and buffer (magit-current-section))) - (created (not buffer))) - (unless buffer - (setq buffer (magit-with-toplevel - (magit-generate-new-buffer mode value)))) - (with-current-buffer buffer - (setq magit-previous-section section) - (with-no-warnings - (setq magit-refresh-args args)) - (funcall mode) - (magit-xref-setup 'magit-mode-setup-internal args) - (when created - (magit-status-goto-initial-section) - (run-hooks 'magit-create-buffer-hook))) - (magit-display-buffer buffer) - (with-current-buffer buffer - (run-hooks 'magit-mode-setup-hook) - (magit-refresh-buffer)))) - -;;; Display Buffer - -(defvar magit-display-buffer-noselect nil - "If non-nil, then `magit-display-buffer' doesn't call `select-window'.") - -(defun magit-display-buffer (buffer &optional display-function) - "Display BUFFER in some window and maybe select it. - -If optional DISPLAY-FUNCTION is non-nil, then use that to display -the buffer. Otherwise use `magit-display-buffer-function', which -is the normal case. - -Then, unless `magit-display-buffer-noselect' is non-nil, select -the window which was used to display the buffer. - -Also run the hooks `magit-pre-display-buffer-hook' -and `magit-post-display-buffer-hook'." - (with-current-buffer buffer - (run-hooks 'magit-pre-display-buffer-hook)) - (let ((window (funcall (or display-function magit-display-buffer-function) - buffer))) - (unless magit-display-buffer-noselect - (let* ((old-frame (selected-frame)) - (new-frame (window-frame window))) - (select-window window) - (unless (eq old-frame new-frame) - (select-frame-set-input-focus new-frame))))) - (with-current-buffer buffer - (run-hooks 'magit-post-display-buffer-hook))) - -(defun magit-display-buffer-traditional (buffer) - "Display BUFFER the way this has traditionally been done." - (display-buffer - buffer (if (and (derived-mode-p 'magit-mode) - (not (memq (with-current-buffer buffer major-mode) - '(magit-process-mode - magit-revision-mode - magit-diff-mode - magit-stash-mode - magit-status-mode)))) - '(display-buffer-same-window) - nil))) ; display in another window - -(defun magit-display-buffer-same-window-except-diff-v1 (buffer) - "Display BUFFER in the selected window except for some modes. -If a buffer's `major-mode' derives from `magit-diff-mode' or -`magit-process-mode', display it in another window. Display all -other buffers in the selected window." - (display-buffer - buffer (if (with-current-buffer buffer - (derived-mode-p 'magit-diff-mode 'magit-process-mode)) - nil ; display in another window - '(display-buffer-same-window)))) - -(defun magit--display-buffer-fullframe (buffer alist) - (when-let ((window (or (display-buffer-reuse-window buffer alist) - (display-buffer-same-window buffer alist) - (display-buffer-pop-up-window buffer alist) - (display-buffer-use-some-window buffer alist)))) - (delete-other-windows window) - window)) - -(defun magit-display-buffer-fullframe-status-v1 (buffer) - "Display BUFFER, filling entire frame if BUFFER is a status buffer. -Otherwise, behave like `magit-display-buffer-traditional'." - (if (eq (with-current-buffer buffer major-mode) - 'magit-status-mode) - (display-buffer buffer '(magit--display-buffer-fullframe)) - (magit-display-buffer-traditional buffer))) - -(defun magit--display-buffer-topleft (buffer alist) - (or (display-buffer-reuse-window buffer alist) - (when-let ((window2 (display-buffer-pop-up-window buffer alist))) - (let ((window1 (get-buffer-window)) - (buffer1 (current-buffer)) - (buffer2 (window-buffer window2)) - (w2-quit-restore (window-parameter window2 'quit-restore))) - (set-window-buffer window1 buffer2) - (set-window-buffer window2 buffer1) - (select-window window2) - ;; Swap some window state that `magit-mode-quit-window' and - ;; `quit-restore-window' inspect. - (set-window-prev-buffers window2 (cdr (window-prev-buffers window1))) - (set-window-prev-buffers window1 nil) - (set-window-parameter window2 'magit-dedicated - (window-parameter window1 'magit-dedicated)) - (set-window-parameter window1 'magit-dedicated t) - (set-window-parameter window1 'quit-restore - (list 'window 'window - (nth 2 w2-quit-restore) - (nth 3 w2-quit-restore))) - (set-window-parameter window2 'quit-restore nil) - window1)))) - -(defun magit-display-buffer-fullframe-status-topleft-v1 (buffer) - "Display BUFFER, filling entire frame if BUFFER is a status buffer. -When BUFFER derives from `magit-diff-mode' or -`magit-process-mode', try to display BUFFER to the top or left of -the current buffer rather than to the bottom or right, as -`magit-display-buffer-fullframe-status-v1' would. Whether the -split is made vertically or horizontally is determined by -`split-window-preferred-function'." - (display-buffer - buffer - (cond ((eq (with-current-buffer buffer major-mode) - 'magit-status-mode) - '(magit--display-buffer-fullframe)) - ((with-current-buffer buffer - (derived-mode-p 'magit-diff-mode 'magit-process-mode)) - '(magit--display-buffer-topleft)) - (t - '(display-buffer-same-window))))) - -(defun magit--display-buffer-fullcolumn (buffer alist) - (when-let ((window (or (display-buffer-reuse-window buffer alist) - (display-buffer-same-window buffer alist) - (display-buffer-below-selected buffer alist)))) - (delete-other-windows-vertically window) - window)) - -(defun magit-display-buffer-fullcolumn-most-v1 (buffer) - "Display BUFFER using the full column except in some cases. -For most cases where BUFFER's `major-mode' derives from -`magit-mode', display it in the selected window and grow that -window to the full height of the frame, deleting other windows in -that column as necessary. However, display BUFFER in another -window if 1) BUFFER's mode derives from `magit-process-mode', or -2) BUFFER's mode derives from `magit-diff-mode', provided that -the mode of the current buffer derives from `magit-log-mode' or -`magit-cherry-mode'." - (display-buffer - buffer - (cond ((and (or git-commit-mode - (derived-mode-p 'magit-log-mode - 'magit-cherry-mode - 'magit-reflog-mode)) - (with-current-buffer buffer - (derived-mode-p 'magit-diff-mode))) - nil) - ((with-current-buffer buffer - (derived-mode-p 'magit-process-mode)) - nil) - (t - '(magit--display-buffer-fullcolumn))))) - -(defun magit-maybe-set-dedicated () - "Mark the selected window as dedicated if appropriate. - -If a new window was created to display the buffer, then remember -that fact. That information is used by `magit-mode-quit-window', -to determine whether the window should be deleted when its last -Magit buffer is buried." - (let ((window (get-buffer-window (current-buffer)))) - (when (and (window-live-p window) - (not (window-prev-buffers window))) - (set-window-parameter window 'magit-dedicated t)))) - -;;; Get Buffer - -(defvar-local magit--default-directory nil - "Value of `default-directory' when buffer is generated. -This exists to prevent a let-bound `default-directory' from -tricking `magit-get-mode-buffer' or `magit-mode-get-buffers' -into thinking a buffer belongs to a repo that it doesn't.") -(put 'magit--default-directory 'permanent-local t) - -(defun magit-mode-get-buffers () - (let ((topdir (magit-toplevel))) - (--filter (with-current-buffer it - (and (derived-mode-p 'magit-mode) - (equal magit--default-directory topdir))) - (buffer-list)))) - -(defvar-local magit-buffer-locked-p nil) -(put 'magit-buffer-locked-p 'permanent-local t) - -(defun magit-get-mode-buffer (mode &optional value frame) - "Return buffer belonging to the current repository whose major-mode is MODE. - -If no such buffer exists then return nil. Multiple buffers with -the same major-mode may exist for a repository but only one can -exist that hasn't been looked to its value. Return that buffer -\(or nil if there is no such buffer) unless VALUE is non-nil, in -which case return the buffer that has been looked to that value. - -If FRAME nil or omitted, then consider all buffers. Otherwise - only consider buffers that are displayed in some live window - on some frame. -If `all', then consider all buffers on all frames. -If `visible', then only consider buffers on all visible frames. -If `selected' or t, then only consider buffers on the selected - frame. -If a frame, then only consider buffers on that frame." - (if-let ((topdir (magit-toplevel))) - (cl-flet* ((b (buffer) - (with-current-buffer buffer - (and (eq major-mode mode) - (equal magit--default-directory topdir) - (if value - (and magit-buffer-locked-p - (equal (magit-buffer-value) value)) - (not magit-buffer-locked-p)) - buffer))) - (w (window) - (b (window-buffer window))) - (f (frame) - (-some #'w (window-list frame 'no-minibuf)))) - (pcase-exhaustive frame - (`nil (-some #'b (buffer-list))) - (`all (-some #'f (frame-list))) - (`visible (-some #'f (visible-frame-list))) - ((or `selected `t) (-some #'w (window-list (selected-frame)))) - ((guard (framep frame)) (-some #'w (window-list frame))))) - (magit--not-inside-repository-error))) - -(defun magit-mode-get-buffer (mode &optional create frame value) - (declare (obsolete magit-get-mode-buffer "Magit 3.0.0")) - (when create - (error "`magit-mode-get-buffer's CREATE argument is obsolete")) - (if-let ((topdir (magit-toplevel))) - (--first (with-current-buffer it - (and (eq major-mode mode) - (equal magit--default-directory topdir) - (if value - (and magit-buffer-locked-p - (equal (magit-buffer-value) value)) - (not magit-buffer-locked-p)))) - (if frame - (mapcar #'window-buffer - (window-list (unless (eq frame t) frame))) - (buffer-list))) - (magit--not-inside-repository-error))) - -(defun magit-generate-new-buffer (mode &optional value) - (let* ((name (funcall magit-generate-buffer-name-function mode value)) - (buffer (generate-new-buffer name))) - (with-current-buffer buffer - (setq magit--default-directory default-directory) - (setq magit-buffer-locked-p (and value t)) - (magit-restore-section-visibility-cache mode)) - (when magit-uniquify-buffer-names - (add-to-list 'uniquify-list-buffers-directory-modes mode) - (with-current-buffer buffer - (setq list-buffers-directory (abbreviate-file-name default-directory))) - (let ((uniquify-buffer-name-style - (if (memq uniquify-buffer-name-style '(nil forward)) - 'post-forward-angle-brackets - uniquify-buffer-name-style))) - (uniquify-rationalize-file-buffer-names - name (file-name-directory (directory-file-name default-directory)) - buffer))) - buffer)) - -(defun magit-generate-buffer-name-default-function (mode &optional value) - "Generate buffer name for a MODE buffer in the current repository. -The returned name is based on `magit-buffer-name-format' and -takes `magit-uniquify-buffer-names' and VALUE, if non-nil, into -account." - (let ((m (substring (symbol-name mode) 0 -5)) - (v (and value (format "%s" (if (listp value) value (list value))))) - (n (if magit-uniquify-buffer-names - (file-name-nondirectory - (directory-file-name default-directory)) - (abbreviate-file-name default-directory)))) - (format-spec - magit-buffer-name-format - `((?m . ,m) - (?M . ,(if (eq mode 'magit-status-mode) "magit" m)) - (?v . ,(or v "")) - (?V . ,(if v (concat " " v) "")) - (?t . ,n) - (?x . ,(if magit-uniquify-buffer-names "" "*")) - (?T . ,(if magit-uniquify-buffer-names n (concat n "*"))))))) - -;;; Buffer Lock - -(defun magit-toggle-buffer-lock () - "Lock the current buffer to its value or unlock it. - -Locking a buffer to its value prevents it from being reused to -display another value. The name of a locked buffer contains its -value, which allows telling it apart from other locked buffers -and the unlocked buffer. - -Not all Magit buffers can be locked to their values, for example -it wouldn't make sense to lock a status buffer. - -There can only be a single unlocked buffer using a certain -major-mode per repository. So when a buffer is being unlocked -and another unlocked buffer already exists for that mode and -repository, then the former buffer is instead deleted and the -latter is displayed in its place." - (interactive) - (if magit-buffer-locked-p - (if-let ((unlocked (magit-get-mode-buffer major-mode))) - (let ((locked (current-buffer))) - (switch-to-buffer unlocked nil t) - (kill-buffer locked)) - (setq magit-buffer-locked-p nil) - (rename-buffer (funcall magit-generate-buffer-name-function - major-mode))) - (if-let ((value (magit-buffer-value))) - (if-let ((locked (magit-get-mode-buffer major-mode value))) - (let ((unlocked (current-buffer))) - (switch-to-buffer locked nil t) - (kill-buffer unlocked)) - (setq magit-buffer-locked-p t) - (rename-buffer (funcall magit-generate-buffer-name-function - major-mode value))) - (user-error "Buffer has no value it could be locked to")))) - -;;; Bury Buffer - -(defun magit-mode-bury-buffer (&optional kill-buffer) - "Bury the current buffer. -With a prefix argument, kill the buffer instead. -With two prefix arguments, also kill all Magit buffers associated -with this repository. -This is done using `magit-bury-buffer-function'." - (interactive "P") - ;; Kill all associated Magit buffers when a double prefix arg is given. - (when (>= (prefix-numeric-value kill-buffer) 16) - (let ((current (current-buffer))) - (dolist (buf (magit-mode-get-buffers)) - (unless (eq buf current) - (kill-buffer buf))))) - (funcall magit-bury-buffer-function kill-buffer)) - -(defun magit-mode-quit-window (kill-buffer) - "Quit the selected window and bury its buffer. - -This behaves similar to `quit-window', but when the window -was originally created to display a Magit buffer and the -current buffer is the last remaining Magit buffer that was -ever displayed in the selected window, then delete that -window." - (if (or (one-window-p) - (--first (let ((buffer (car it))) - (and (not (eq buffer (current-buffer))) - (buffer-live-p buffer) - (or (not (window-parameter nil 'magit-dedicated)) - (with-current-buffer buffer - (derived-mode-p 'magit-mode - 'magit-process-mode))))) - (window-prev-buffers))) - (quit-window kill-buffer) - (let ((window (selected-window))) - (quit-window kill-buffer) - (when (window-live-p window) - (delete-window window))))) - -;;; Refresh Buffers - -(defvar inhibit-magit-refresh nil) - -(defun magit-refresh () - "Refresh some buffers belonging to the current repository. - -Refresh the current buffer if its major mode derives from -`magit-mode', and refresh the corresponding status buffer. - -Run hooks `magit-pre-refresh-hook' and `magit-post-refresh-hook'." - (interactive) - (unless inhibit-magit-refresh - (unwind-protect - (let ((start (current-time)) - (magit--refresh-cache (or magit--refresh-cache - (list (cons 0 0))))) - (when magit-refresh-verbose - (message "Refreshing magit...")) - (magit-run-hook-with-benchmark 'magit-pre-refresh-hook) - (cond ((derived-mode-p 'magit-mode) - (magit-refresh-buffer)) - ((derived-mode-p 'tabulated-list-mode) - (revert-buffer))) - (--when-let (and magit-refresh-status-buffer - (not (derived-mode-p 'magit-status-mode)) - (magit-get-mode-buffer 'magit-status-mode)) - (with-current-buffer it - (magit-refresh-buffer))) - (magit-auto-revert-buffers) - (cond - ((and (not this-command) - (memq last-command magit-post-commit-hook-commands)) - (magit-run-hook-with-benchmark 'magit-post-commit-hook)) - ((memq this-command magit-post-stage-hook-commands) - (magit-run-hook-with-benchmark 'magit-post-stage-hook)) - ((memq this-command magit-post-unstage-hook-commands) - (magit-run-hook-with-benchmark 'magit-post-unstage-hook))) - (magit-run-hook-with-benchmark 'magit-post-refresh-hook) - (when magit-refresh-verbose - (message "Refreshing magit...done (%.3fs, cached %s/%s)" - (float-time (time-subtract (current-time) start)) - (caar magit--refresh-cache) - (+ (caar magit--refresh-cache) - (cdar magit--refresh-cache))))) - (run-hooks 'magit-unwind-refresh-hook)))) - -(defun magit-refresh-all () - "Refresh all buffers belonging to the current repository. - -Refresh all Magit buffers belonging to the current repository, -and revert buffers that visit files located inside the current -repository. - -Run hooks `magit-pre-refresh-hook' and `magit-post-refresh-hook'." - (interactive) - (magit-run-hook-with-benchmark 'magit-pre-refresh-hook) - (dolist (buffer (magit-mode-get-buffers)) - (with-current-buffer buffer (magit-refresh-buffer))) - (magit-auto-revert-buffers) - (magit-run-hook-with-benchmark 'magit-post-refresh-hook)) - -(defvar-local magit-refresh-start-time nil) - -(defun magit-refresh-buffer () - "Refresh the current Magit buffer." - (setq magit-refresh-start-time (current-time)) - (let ((refresh (intern (format "%s-refresh-buffer" - (substring (symbol-name major-mode) 0 -5)))) - (magit--refresh-cache (or magit--refresh-cache (list (cons 0 0))))) - (when (functionp refresh) - (when magit-refresh-verbose - (message "Refreshing buffer `%s'..." (buffer-name))) - (let* ((buffer (current-buffer)) - (windows - (--mapcat (with-selected-window it - (with-current-buffer buffer - (when-let ((section (magit-current-section))) - (list - (nconc (list it section) - (magit-refresh-get-relative-position)))))) - (or (get-buffer-window-list buffer nil t) - (list (selected-window)))))) - (deactivate-mark) - (setq magit-section-highlight-overlays nil) - (setq magit-section-highlighted-section nil) - (setq magit-section-highlighted-sections nil) - (setq magit-section-unhighlight-sections nil) - (magit-process-unset-mode-line-error-status) - (let ((inhibit-read-only t)) - (erase-buffer) - (save-excursion - (apply refresh (with-no-warnings magit-refresh-args)))) - (pcase-dolist (`(,window . ,args) windows) - (with-selected-window window - (with-current-buffer buffer - (apply #'magit-section-goto-successor args)))) - (run-hooks 'magit-refresh-buffer-hook) - (magit-section-update-highlight) - (set-buffer-modified-p nil)) - (when magit-refresh-verbose - (message "Refreshing buffer `%s'...done (%.3fs)" (buffer-name) - (float-time (time-subtract (current-time) - magit-refresh-start-time))))))) - -(defun magit-refresh-get-relative-position () - (when-let ((section (magit-current-section))) - (let ((start (oref section start))) - (list (count-lines start (point)) - (- (point) (line-beginning-position)) - (and (magit-hunk-section-p section) - (region-active-p) - (progn (goto-char (line-beginning-position)) - (when (looking-at "^[-+]") (forward-line)) - (while (looking-at "^[ @]") (forward-line)) - (let ((beg (point))) - (cond ((looking-at "^[-+]") - (forward-line) - (while (looking-at "^[-+]") (forward-line)) - (while (looking-at "^ ") (forward-line)) - (forward-line -1) - (regexp-quote (buffer-substring-no-properties - beg (line-end-position)))) - (t t))))))))) - -;;; Save File-Visiting Buffers - -(defvar disable-magit-save-buffers nil) - -(defun magit-pre-command-hook () - (setq disable-magit-save-buffers nil)) -(add-hook 'pre-command-hook #'magit-pre-command-hook) - -(defvar magit-after-save-refresh-buffers nil) - -(defun magit-after-save-refresh-buffers () - (dolist (buffer magit-after-save-refresh-buffers) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (magit-refresh-buffer)))) - (setq magit-after-save-refresh-buffers nil) - (remove-hook 'post-command-hook 'magit-after-save-refresh-buffers)) - -(defun magit-after-save-refresh-status () - "Refresh the status buffer of the current repository. - -This function is intended to be added to `after-save-hook'. - -If the status buffer does not exist or the file being visited in -the current buffer isn't inside the working tree of a repository, -then do nothing. - -Note that refreshing a Magit buffer is done by re-creating its -contents from scratch, which can be slow in large repositories. -If you are not satisfied with Magit's performance, then you -should obviously not add this function to that hook." - (when (and (not disable-magit-save-buffers) - (magit-inside-worktree-p t)) - (--when-let (ignore-errors (magit-get-mode-buffer 'magit-status-mode)) - (add-to-list 'magit-after-save-refresh-buffers it) - (add-hook 'post-command-hook 'magit-after-save-refresh-buffers)))) - -(defun magit-maybe-save-repository-buffers () - "Maybe save file-visiting buffers belonging to the current repository. -Do so if `magit-save-repository-buffers' is non-nil. You should -not remove this from any hooks, instead set that variable to nil -if you so desire." - (when (and magit-save-repository-buffers - (not disable-magit-save-buffers)) - (setq disable-magit-save-buffers t) - (let ((msg (current-message))) - (magit-save-repository-buffers - (eq magit-save-repository-buffers 'dontask)) - (when (and msg - (current-message) - (not (equal msg (current-message)))) - (message "%s" msg))))) - -(add-hook 'magit-pre-refresh-hook #'magit-maybe-save-repository-buffers) -(add-hook 'magit-pre-call-git-hook #'magit-maybe-save-repository-buffers) -(add-hook 'magit-pre-start-git-hook #'magit-maybe-save-repository-buffers) - -(defvar-local magit-inhibit-refresh-save nil) - -(defun magit-save-repository-buffers (&optional arg) - "Save file-visiting buffers belonging to the current repository. -After any buffer where `buffer-save-without-query' is non-nil -is saved without asking, the user is asked about each modified -buffer which visits a file in the current repository. Optional -argument (the prefix) non-nil means save all with no questions." - (interactive "P") - (when-let ((topdir (magit-rev-parse-safe "--show-toplevel"))) - (let ((remote (file-remote-p topdir)) - (save-some-buffers-action-alist - `((?Y (lambda (buffer) - (with-current-buffer buffer - (setq buffer-save-without-query t) - (save-buffer))) - "to save the current buffer and remember choice") - (?N (lambda (buffer) - (with-current-buffer buffer - (setq magit-inhibit-refresh-save t))) - "to skip the current buffer and remember choice") - ,@save-some-buffers-action-alist))) - (save-some-buffers - arg (lambda () - (and (not magit-inhibit-refresh-save) - buffer-file-name - ;; Avoid needlessly connecting to unrelated remotes. - (equal (file-remote-p buffer-file-name) - remote) - ;; For remote files this makes network requests and - ;; therefore has to come after the above to avoid - ;; unnecessarily waiting for unrelated hosts. - (file-exists-p (file-name-directory buffer-file-name)) - (string-prefix-p topdir (file-truename buffer-file-name)) - (equal (magit-rev-parse-safe "--show-toplevel") - topdir))))))) - -;;; Restore Window Configuration - -(defvar magit-inhibit-save-previous-winconf nil) - -(defvar-local magit-previous-window-configuration nil) -(put 'magit-previous-window-configuration 'permanent-local t) - -(defun magit-save-window-configuration () - "Save the current window configuration. - -Later, when the buffer is buried, it may be restored by -`magit-restore-window-configuration'." - (if magit-inhibit-save-previous-winconf - (when (eq magit-inhibit-save-previous-winconf 'unset) - (setq magit-previous-window-configuration nil)) - (unless (get-buffer-window (current-buffer) (selected-frame)) - (setq magit-previous-window-configuration - (current-window-configuration))))) - -(defun magit-restore-window-configuration (&optional kill-buffer) - "Bury or kill the current buffer and restore previous window configuration." - (let ((winconf magit-previous-window-configuration) - (buffer (current-buffer)) - (frame (selected-frame))) - (quit-window kill-buffer (selected-window)) - (when (and winconf (equal frame (window-configuration-frame winconf))) - (set-window-configuration winconf) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (setq magit-previous-window-configuration nil)))))) - -;;; Buffer History - -(defun magit-go-backward () - "Move backward in current buffer's history." - (interactive) - (if help-xref-stack - (help-xref-go-back (current-buffer)) - (user-error "No previous entry in buffer's history"))) - -(defun magit-go-forward () - "Move forward in current buffer's history." - (interactive) - (if help-xref-forward-stack - (help-xref-go-forward (current-buffer)) - (user-error "No next entry in buffer's history"))) - -(defun magit-insert-xref-buttons () - "Insert xref buttons." - (when (or help-xref-stack help-xref-forward-stack) - (when help-xref-stack - (magit-xref-insert-button help-back-label 'magit-xref-backward)) - (when help-xref-forward-stack - (when help-xref-stack - (insert " ")) - (magit-xref-insert-button help-forward-label 'magit-xref-forward)))) - -(defun magit-xref-insert-button (label type) - (magit-insert-section (button label) - (insert-text-button label 'type type - 'help-args (list (current-buffer))))) - -(define-button-type 'magit-xref-backward - :supertype 'help-back - 'mouse-face 'magit-section-highlight - 'help-echo (purecopy "mouse-2, RET: go back to previous history entry")) - -(define-button-type 'magit-xref-forward - :supertype 'help-forward - 'mouse-face 'magit-section-highlight - 'help-echo (purecopy "mouse-2, RET: go back to next history entry")) - -(defvar magit-xref-modes - '(magit-log-mode - magit-reflog-mode - magit-diff-mode - magit-revision-mode) - "List of modes for which to insert navigation buttons.") - -(defun magit-xref-setup (fn args) - (when (memq major-mode magit-xref-modes) - (when help-xref-stack-item - (push (cons (point) help-xref-stack-item) help-xref-stack) - (setq help-xref-forward-stack nil)) - (when (called-interactively-p 'interactive) - (--when-let (nthcdr 10 help-xref-stack) - (setcdr it nil))) - (setq help-xref-stack-item - (list 'magit-xref-restore fn default-directory args)))) - -(defun magit-xref-restore (fn dir args) - (setq default-directory dir) - (funcall fn major-mode nil args) - (magit-refresh-buffer)) - -;;; Repository-Local Cache - -(defvar magit-repository-local-cache nil - "Alist mapping `magit-toplevel' paths to alists of key/value pairs.") - -(defun magit-repository-local-repository () - "Return the key for the current repository." - (or (bound-and-true-p magit--default-directory) - (magit-toplevel))) - -(defun magit-repository-local-set (key value &optional repository) - "Set the repository-local VALUE for KEY. - -Unless specified, REPOSITORY is the current buffer's repository. - -If REPOSITORY is nil (meaning there is no current repository), -then the value is not cached, and we return nil." - (let* ((repokey (or repository (magit-repository-local-repository))) - (cache (assoc repokey magit-repository-local-cache))) - ;; Don't cache values for a nil REPOSITORY, as the 'set' and 'get' - ;; calls for some KEY may happen in unrelated contexts. - (when repokey - (if cache - (let ((keyvalue (assoc key (cdr cache)))) - (if keyvalue - ;; Update pre-existing value for key. - (setcdr keyvalue value) - ;; No such key in repository-local cache. - (push (cons key value) (cdr cache)))) - ;; No cache for this repository. - (push (cons repokey (list (cons key value))) - magit-repository-local-cache))))) - -(defun magit-repository-local-exists-p (key &optional repository) - "Non-nil when a repository-local value exists for KEY. - -Returns a (KEY . value) cons cell. - -The KEY is matched using `equal'. - -Unless specified, REPOSITORY is the current buffer's repository." - (let* ((repokey (or repository (magit-repository-local-repository))) - (cache (assoc repokey magit-repository-local-cache))) - (and cache - (assoc key (cdr cache))))) - -(defun magit-repository-local-get (key &optional default repository) - "Return the repository-local value for KEY. - -Return DEFAULT if no value for KEY exists. - -The KEY is matched using `equal'. - -Unless specified, REPOSITORY is the current buffer's repository." - (let ((keyvalue (magit-repository-local-exists-p key repository))) - (if keyvalue - (cdr keyvalue) - default))) - -(defun magit-repository-local-delete (key &optional repository) - "Delete the repository-local value for KEY. - -Unless specified, REPOSITORY is the current buffer's repository." - (let* ((repokey (or repository (magit-repository-local-repository))) - (cache (assoc repokey magit-repository-local-cache))) - (when cache - ;; There is no `assoc-delete-all'. - (setf (cdr cache) - (cl-delete key (cdr cache) :key #'car :test #'equal))))) - -(defun magit-preserve-section-visibility-cache () - (when (derived-mode-p 'magit-status-mode 'magit-refs-mode) - (magit-repository-local-set - (cons major-mode 'magit-section-visibility-cache) - magit-section-visibility-cache))) - -(defun magit-restore-section-visibility-cache (mode) - (setq magit-section-visibility-cache - (magit-repository-local-get - (cons mode 'magit-section-visibility-cache)))) - -(defun magit-zap-caches () - "Zap caches for the current repository. -Remove the repository's entry from `magit-repository-local-cache' -and set `magit-section-visibility-cache' to nil in all of the -repository's Magit buffers." - (interactive) - (magit-with-toplevel - (setq magit-repository-local-cache - (cl-delete default-directory - magit-repository-local-cache - :key #'car :test #'equal))) - (dolist (buffer (magit-mode-get-buffers)) - (with-current-buffer buffer - (setq magit-section-visibility-cache nil))) - (setq magit--libgit-available-p eieio-unbound)) - -;;; Utilities - -(defun magit-toggle-verbose-refresh () - "Toggle whether Magit refreshes buffers verbosely. -Enabling this helps figuring out which sections are bottlenecks. -The additional output can be found in the *Messages* buffer." - (interactive) - (setq magit-refresh-verbose (not magit-refresh-verbose)) - (message "%s verbose refreshing" - (if magit-refresh-verbose "Enabled" "Disabled"))) - -(defun magit-run-hook-with-benchmark (hook) - (when hook - (if magit-refresh-verbose - (let ((start (current-time))) - (message "Running %s..." hook) - (run-hooks hook) - (message "Running %s...done (%.3fs)" hook - (float-time (time-subtract (current-time) start)))) - (run-hooks hook)))) - -;;; _ -(provide 'magit-mode) -;;; magit-mode.el ends here diff --git a/elpa/magit-20200418.939/magit-mode.elc b/elpa/magit-20200418.939/magit-mode.elc deleted file mode 100644 index 56014afba892b7d46d5b3da8643ed5b9879c9486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54047 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 bXSuH0%`Q2IrFTNvrPT2;v`ip -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for `git-notes'. - -;;; Code: - -(require 'magit) - -;;; Commands - -;;;###autoload (autoload 'magit-notes "magit" nil t) -(define-transient-command magit-notes () - "Edit notes attached to commits." - :man-page "git-notes" - ["Configure local settings" - ("c" magit-core.notesRef) - ("d" magit-notes.displayRef)] - ["Configure global settings" - ("C" magit-global-core.notesRef) - ("D" magit-global-notes.displayRef)] - ["Arguments for prune" - :if-not magit-notes-merging-p - ("-n" "Dry run" ("-n" "--dry-run"))] - ["Arguments for edit and remove" - :if-not magit-notes-merging-p - (magit-notes:--ref)] - ["Arguments for merge" - :if-not magit-notes-merging-p - (magit-notes:--strategy)] - ["Actions" - :if-not magit-notes-merging-p - ("T" "Edit" magit-notes-edit) - ("r" "Remove" magit-notes-remove) - ("m" "Merge" magit-notes-merge) - ("p" "Prune" magit-notes-prune)] - ["Actions" - :if magit-notes-merging-p - ("c" "Commit merge" magit-notes-merge-commit) - ("a" "Abort merge" magit-notes-merge-abort)]) - -(defun magit-notes-merging-p () - (let ((dir (magit-git-dir "NOTES_MERGE_WORKTREE"))) - (and (file-directory-p dir) - (directory-files dir nil "^[^.]")))) - -(define-infix-command magit-core.notesRef () - :class 'magit--git-variable - :variable "core.notesRef" - :reader 'magit-notes-read-ref - :prompt "Set local core.notesRef") - -(define-infix-command magit-notes.displayRef () - :class 'magit--git-variable - :variable "notes.displayRef" - :multi-value t - :reader 'magit-notes-read-refs - :prompt "Set local notes.displayRef") - -(define-infix-command magit-global-core.notesRef () - :class 'magit--git-variable - :variable "core.notesRef" - :reader 'magit-notes-read-ref - :prompt "Set global core.notesRef") - -(define-infix-command magit-global-notes.displayRef () - :class 'magit--git-variable - :variable "notes.displayRef" - :multi-value t - :reader 'magit-notes-read-refs - :prompt "Set global notes.displayRef") - -(define-infix-argument magit-notes:--ref () - :description "Merge strategy" - :class 'transient-option - :key "-r" - :argument "--ref=" - :reader 'magit-notes-read-ref) - -(define-infix-argument magit-notes:--strategy () - :description "Merge strategy" - :class 'transient-option - :shortarg "-s" - :argument "--strategy=" - :choices '("manual" "ours" "theirs" "union" "cat_sort_uniq")) - -(defun magit-notes-edit (commit &optional ref) - "Edit the note attached to COMMIT. -REF is the notes ref used to store the notes. - -Interactively or when optional REF is nil use the value of Git -variable `core.notesRef' or \"refs/notes/commits\" if that is -undefined." - (interactive (magit-notes-read-args "Edit notes")) - (magit-run-git-with-editor "notes" (and ref (concat "--ref=" ref)) - "edit" commit)) - -(defun magit-notes-remove (commit &optional ref) - "Remove the note attached to COMMIT. -REF is the notes ref from which the note is removed. - -Interactively or when optional REF is nil use the value of Git -variable `core.notesRef' or \"refs/notes/commits\" if that is -undefined." - (interactive (magit-notes-read-args "Remove notes")) - (magit-run-git-with-editor "notes" (and ref (concat "--ref=" ref)) - "remove" commit)) - -(defun magit-notes-merge (ref) - "Merge the notes ref REF into the current notes ref. - -The current notes ref is the value of Git variable -`core.notesRef' or \"refs/notes/commits\" if that is undefined. - -When there are conflicts, then they have to be resolved in the -temporary worktree \".git/NOTES_MERGE_WORKTREE\". When -done use `magit-notes-merge-commit' to finish. To abort -use `magit-notes-merge-abort'." - (interactive (list (magit-read-string-ns "Merge reference"))) - (magit-run-git-with-editor "notes" "merge" ref)) - -(defun magit-notes-merge-commit () - "Commit the current notes ref merge. -Also see `magit-notes-merge'." - (interactive) - (magit-run-git-with-editor "notes" "merge" "--commit")) - -(defun magit-notes-merge-abort () - "Abort the current notes ref merge. -Also see `magit-notes-merge'." - (interactive) - (magit-run-git-with-editor "notes" "merge" "--abort")) - -(defun magit-notes-prune (&optional dry-run) - "Remove notes about unreachable commits." - (interactive (list (and (member "--dry-run" (transient-args 'magit-notes)) t))) - (when dry-run - (magit-process-buffer)) - (magit-run-git-with-editor "notes" "prune" (and dry-run "--dry-run"))) - -;;; Readers - -(defun magit-notes-read-ref (prompt _initial-input history) - (--when-let (magit-completing-read - prompt (magit-list-notes-refnames) nil nil - (--when-let (magit-get "core.notesRef") - (if (string-prefix-p "refs/notes/" it) - (substring it 11) - it)) - history) - (if (string-prefix-p "refs/" it) - it - (concat "refs/notes/" it)))) - -(defun magit-notes-read-refs (prompt) - (mapcar (lambda (ref) - (if (string-prefix-p "refs/" ref) - ref - (concat "refs/notes/" ref))) - (completing-read-multiple - (concat prompt ": ") - (magit-list-notes-refnames) nil nil - (mapconcat (lambda (ref) - (if (string-prefix-p "refs/notes/" ref) - (substring ref 11) - ref)) - (magit-get-all "notes.displayRef") - ",")))) - -(defun magit-notes-read-args (prompt) - (list (magit-read-branch-or-commit prompt (magit-stash-at-point)) - (--when-let (--first (string-match "^--ref=\\(.+\\)" it) - (transient-args 'magit-notes)) - (match-string 1 it)))) - -;;; _ -(provide 'magit-notes) -;;; magit-notes.el ends here diff --git a/elpa/magit-20200418.939/magit-notes.elc b/elpa/magit-20200418.939/magit-notes.elc deleted file mode 100644 index bbbefeefefd230b34b8a3a853d864787abe84c25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9045 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 GHU0y%2|^?Q diff --git a/elpa/magit-20200418.939/magit-obsolete.el b/elpa/magit-20200418.939/magit-obsolete.el deleted file mode 100644 index d7c2f1b9..00000000 --- a/elpa/magit-20200418.939/magit-obsolete.el +++ /dev/null @@ -1,109 +0,0 @@ -;;; magit-obsolete.el --- obsolete definitions -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library defines aliases for obsolete variables and functions. - -;;; Code: - -(require 'magit) - -;;; Obsolete since v3.0.0 - -(define-obsolete-function-alias 'magit-diff-visit-file-worktree - 'magit-diff-visit-worktree-file "Magit 3.0.0") - -(define-obsolete-function-alias 'magit-status-internal - 'magit-status-setup-buffer "Magit 3.0.0") - -(define-obsolete-variable-alias 'magit-mode-setup-hook - 'magit-setup-buffer-hook "Magit 3.0.0") - -(define-obsolete-variable-alias 'magit-branch-popup-show-variables - 'magit-branch-direct-configure "Magit 3.0.0") - -(define-obsolete-function-alias 'magit-dispatch-popup - 'magit-dispatch "Magit 3.0.0") - -(define-obsolete-function-alias 'magit-repolist-column-dirty - 'magit-repolist-column-flag "Magit 3.0.0") - -(define-obsolete-variable-alias 'magit-disable-line-numbers - 'magit-section-disable-line-numbers "Magit 3.0.0") - -(defun magit--magit-popup-warning () - (display-warning 'magit "\ -Magit no longer uses Magit-Popup. -It now uses Transient. -See https://emacsair.me/2019/02/14/transient-0.1. - -However your configuration and/or some third-party package that -you use still depends on the `magit-popup' package. But because -`magit' no longer depends on that, `package' has removed it from -your system. - -If some package that you use still depends on `magit-popup' but -does not declare it as a dependency, then please contact its -maintainer about that and install `magit-popup' explicitly. - -If you yourself use functions that are defined in `magit-popup' -in your configuration, then the next step depends on what you use -that for. - -* If you use `magit-popup' to define your own popups but do not - modify any of Magit's old popups, then you have to install - `magit-popup' explicitly. (You can also migrate to Transient, - but there is no need to rush that.) - -* If you add additional arguments and/or actions to Magit's popups, - then you have to port that to modify the new \"transients\" instead. - See https://github.com/magit/magit/wiki/\ -Converting-popup-modifications-to-transient-modifications - -To find installed packages that still use `magit-popup' you can -use e.g. \"M-x rgrep RET magit-popup RET RET ~/.emacs.d/ RET\".")) -(cl-eval-when (eval load) - (unless (require (quote magit-popup) nil t) - (defun magit-define-popup-switch (&rest _) - (magit--magit-popup-warning)) - (defun magit-define-popup-option (&rest _) - (magit--magit-popup-warning)) - (defun magit-define-popup-variable (&rest _) - (magit--magit-popup-warning)) - (defun magit-define-popup-action (&rest _) - (magit--magit-popup-warning)) - (defun magit-define-popup-sequence-action (&rest _) - (magit--magit-popup-warning)) - (defun magit-define-popup-key (&rest _) - (magit--magit-popup-warning)) - (defun magit-define-popup-keys-deferred (&rest _) - (magit--magit-popup-warning)) - (defun magit-change-popup-key (&rest _) - (magit--magit-popup-warning)) - (defun magit-remove-popup-key (&rest _) - (magit--magit-popup-warning)))) - -;;; _ -(provide 'magit-obsolete) -;;; magit-obsolete.el ends here diff --git a/elpa/magit-20200418.939/magit-obsolete.elc b/elpa/magit-20200418.939/magit-obsolete.elc deleted file mode 100644 index ca174f6ce1ac3e2b3b76413574860232e0c5798a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3993 zcmcInTW{Mo6i$ad)QR$fz`ADD7COmE&OUU7h>@ib`I-yS%z$<%%0#I+%Fu)pJ!bt69kvTL{)@ zzM~|%VwvEkk-{*y0%JZ8dI7;_{gDBm`?tTpf4JB75O|HJ2&VgLuTg__TGrUduaq~`BFMoiJCW(+we81 zWL+nB(n^<5ttM-2Zk-X4dwe{ccs{0N0|~bx(F>~^;gF)Qz5IDPOJ|cP-8$}in@EMa zRGeGY{q1+McdbevX_ybRryD(gptEAH%Y_co8-ZBhGMUDzkmJX6tEtmZOD}b^ccY}l| zbRfpBMs&K7mM%Aat8mA-&HtR$4PV|%@y;|-iA4470zEDsS(t*BOWGf>+_3Yb{ljgz z4+8c{_y~Tkxl!oE?D_lIeTPB1=EWrD4tdb(BC1qR?cJe$#7# zmd!T0H#7k}^nThf^!ceaX!Wf?6PKn+I!>^5yu9U0qH$L!TqIMNbrR#M5}i<$Wte4d zCD?}%CI`dCl(AosGz(F3Tr5;zI)GDy(>qeQJ7yoE&I7hWeHqbeBql@6)ke482H3f= zPPE>st2$Ucwv;@4+|XSk7d@QX&csTT4M!?M6%_O6pHSuIm>g8BYXpb)es-1)e6~<6 zrYKEPz{(dIt`brNCq^+U6fo_o6d$`rmeMtw!FsZlB4R~Td!y@K`Fyld7ED6^L4_ah zJK_o?-Xr0R_EJ=o_~;NX(T&5kCL1G0h4L2H+IWM$X8?47Z$}q%I@%F5>NOCdG_?#k zVk4o&qEL*X<;Z#i3^q*H%;)m~vZSdZd$f*}tk85wZp4ai@9G@E#n|DWxI(K4Z?KcJ za%ng^Ca!NQet*6+WXnT^>1JGT$S@zWKkOHA7 zun*BfMj{4hg5O@7&y2Azoi;HGa3Nw5BC%%0WLuTCn0U7ZuK+w_DAlt0LJsBA>4{w#ED01TL{`Vy=b4rV`%`1NjHw z3q?mFU8eBlb@Gv!CAu+t`|6sFir;@H+P~A(_olR(60Mk|lN&a_K|g(DCG!mv+ZfH; zlT!@vu$1BRjQXfw*Ziu3EoC;Q&`O3iVZ;;HqA>-F1~z~(1q%f>m=T3`CTuEW3Kp6C zWQPJdSVtlcEhY0AcFBheLWqr@?+=#+U(Cah#P(mVFgvpRhcG=@lot?vY|`AY9IS}O zVXfGAMqvB@>j=<>8=+T3@${1d{rRcHZ^!>rDG0UqWcFJub!hM+d15`cV)JA^K( -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements patch commands. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) - -;;; Options - -(defcustom magit-patch-save-arguments '(exclude "--stat") - "Control arguments used by the command `magit-patch-save'. - -`magit-patch-save' (which see) saves a diff for the changes -shown in the current buffer in a patch file. It may use the -same arguments as used in the buffer or a subset thereof, or -a constant list of arguments, depending on this option and -the prefix argument." - :package-version '(magit . "2.12.0") - :group 'magit-diff - :type '(choice (const :tag "use buffer arguments" buffer) - (cons :tag "use buffer arguments except" - (const :format "" exclude) - (repeat :format "%v%i\n" - (string :tag "Argument"))) - (repeat :tag "use constant arguments" - (string :tag "Argument")))) - -;;; Commands - -;;;###autoload (autoload 'magit-patch "magit-patch" nil t) -(define-transient-command magit-patch () - "Create or apply patches." - ["Actions" - ("c" "Create patches" magit-patch-create) - ("a" "Apply patch" magit-patch-apply) - ("s" "Save diff as patch" magit-patch-save) - ("r" "Request pull" magit-request-pull)]) - -;;;###autoload (autoload 'magit-patch-create "magit-patch" nil t) -(define-transient-command magit-patch-create (range args files) - "Create patches for the commits in RANGE. -When a single commit is given for RANGE, create a patch for the -changes introduced by that commit (unlike 'git format-patch' -which creates patches for all commits that are reachable from -`HEAD' but not from the specified commit)." - :man-page "git-format-patch" - :incompatible '(("--subject-prefix=" "--rfc")) - ["Mail arguments" - (6 magit-format-patch:--in-reply-to) - (6 magit-format-patch:--thread) - (6 magit-format-patch:--from) - (6 magit-format-patch:--to) - (6 magit-format-patch:--cc)] - ["Patch arguments" - (magit-format-patch:--base) - (magit-format-patch:--reroll-count) - (5 magit-format-patch:--interdiff) - (magit-format-patch:--range-diff) - (magit-format-patch:--subject-prefix) - ("C-m r " "RFC subject prefix" "--rfc") - ("C-m l " "Add cover letter" "--cover-letter") - (5 magit-format-patch:--cover-from-description) - (5 magit-format-patch:--notes) - (magit-format-patch:--output-directory)] - ["Diff arguments" - (magit-diff:-U) - (magit-diff:-M) - (magit-diff:-C) - (magit-diff:--diff-algorithm) - (magit:--) - (7 "-b" "Ignore whitespace changes" ("-b" "--ignore-space-change")) - (7 "-w" "Ignore all whitespace" ("-w" "--ignore-all-space"))] - ["Actions" - ("c" "Create patches" magit-patch-create)] - (interactive - (if (not (eq current-transient-command 'magit-patch-create)) - (list nil nil nil) - (cons (if-let ((revs (magit-region-values 'commit t))) - (concat (car (last revs)) "^.." (car revs)) - (let ((range (magit-read-range-or-commit - "Format range or commit"))) - (if (string-match-p "\\.\\." range) - range - (format "%s~..%s" range range)))) - (let ((args (transient-args 'magit-patch-create))) - (list (-filter #'stringp args) - (cdr (assoc "--" args))))))) - (if (not range) - (transient-setup 'magit-patch-create) - (magit-run-git "format-patch" range args "--" files) - (when (member "--cover-letter" args) - (save-match-data - (find-file - (expand-file-name - (concat (--some (and (string-match "\\`--reroll-count=\\(.+\\)" it) - (format "v%s-" (match-string 1 it))) - args) - "0000-cover-letter.patch") - (let ((topdir (magit-toplevel))) - (or (--some (and (string-match "\\`--output-directory=\\(.+\\)" it) - (expand-file-name (match-string 1 it) topdir)) - args) - topdir)))))))) - -(define-infix-argument magit-format-patch:--in-reply-to () - :description "In reply to" - :class 'transient-option - :key "C-m C-r" - :argument "--in-reply-to=") - -(define-infix-argument magit-format-patch:--thread () - :description "Thread style" - :class 'transient-option - :key "C-m s " - :argument "--thread=" - :reader #'magit-format-patch-select-thread-style) - -(defun magit-format-patch-select-thread-style (&rest _ignore) - (magit-read-char-case "Thread style " t - (?d "[d]eep" "deep") - (?s "[s]hallow" "shallow"))) - -(define-infix-argument magit-format-patch:--base () - :description "Insert base commit" - :class 'transient-option - :key "C-m b " - :argument "--base=" - :reader #'magit-format-patch-select-base) - -(defun magit-format-patch-select-base (prompt initial-input history) - (or (magit-completing-read prompt (cons "auto" (magit-list-refnames)) - nil nil initial-input history "auto") - (user-error "Nothing selected"))) - -(define-infix-argument magit-format-patch:--reroll-count () - :description "Reroll count" - :class 'transient-option - :key "C-m v " - :shortarg "-v" - :argument "--reroll-count=" - :reader 'transient-read-number-N+) - -(define-infix-argument magit-format-patch:--interdiff () - :description "Insert interdiff" - :class 'transient-option - :key "C-m d i" - :argument "--interdiff=" - :reader #'magit-transient-read-revision) - -(define-infix-argument magit-format-patch:--range-diff () - :description "Insert range-diff" - :class 'transient-option - :key "C-m d r" - :argument "--range-diff=" - :reader #'magit-format-patch-select-range-diff) - -(defun magit-format-patch-select-range-diff (prompt _initial-input _history) - (magit-read-range-or-commit prompt)) - -(define-infix-argument magit-format-patch:--subject-prefix () - :description "Subject Prefix" - :class 'transient-option - :key "C-m p " - :argument "--subject-prefix=") - -(define-infix-argument magit-format-patch:--cover-from-description () - :description "Use branch description" - :class 'transient-option - :key "C-m D " - :argument "--cover-from-description=" - :reader #'magit-format-patch-select-description-mode) - -(defun magit-format-patch-select-description-mode (&rest _ignore) - (magit-read-char-case "Use description as " t - (?m "[m]essage" "message") - (?s "[s]ubject" "subject") - (?a "[a]uto" "auto") - (?n "[n]othing" "none"))) - -(define-infix-argument magit-format-patch:--notes () - :description "Insert commentary from notes" - :class 'transient-option - :key "C-m n " - :argument "--notes=" - :reader #'magit-notes-read-ref) - -(define-infix-argument magit-format-patch:--from () - :description "From" - :class 'transient-option - :key "C-m C-f" - :argument "--from=" - :reader 'magit-transient-read-person) - -(define-infix-argument magit-format-patch:--to () - :description "To" - :class 'transient-option - :key "C-m C-t" - :argument "--to=" - :reader 'magit-transient-read-person) - -(define-infix-argument magit-format-patch:--cc () - :description "CC" - :class 'transient-option - :key "C-m C-c" - :argument "--cc=" - :reader 'magit-transient-read-person) - -(define-infix-argument magit-format-patch:--output-directory () - :description "Output directory" - :class 'transient-option - :key "C-m o " - :shortarg "-o" - :argument "--output-directory=" - :reader 'transient-read-existing-directory) - -;;;###autoload (autoload 'magit-patch-apply "magit-patch" nil t) -(define-transient-command magit-patch-apply (file &rest args) - "Apply the patch file FILE." - :man-page "git-apply" - ["Arguments" - ("-i" "Also apply to index" "--index") - ("-c" "Only apply to index" "--cached") - ("-3" "Fall back on 3way merge" ("-3" "--3way"))] - ["Actions" - ("a" "Apply patch" magit-patch-apply)] - (interactive - (if (not (eq current-transient-command 'magit-patch-apply)) - (list nil) - (list (expand-file-name - (read-file-name "Apply patch: " - default-directory nil nil - (when-let ((file (magit-file-at-point))) - (file-relative-name file)))) - (transient-args 'magit-patch-apply)))) - (if (not file) - (transient-setup 'magit-patch-apply) - (magit-run-git "apply" args "--" (magit-convert-filename-for-git file)))) - -;;;###autoload -(defun magit-patch-save (file &optional arg) - "Write current diff into patch FILE. - -What arguments are used to create the patch depends on the value -of `magit-patch-save-arguments' and whether a prefix argument is -used. - -If the value is the symbol `buffer', then use the same arguments -as the buffer. With a prefix argument use no arguments. - -If the value is a list beginning with the symbol `exclude', then -use the same arguments as the buffer except for those matched by -entries in the cdr of the list. The comparison is done using -`string-prefix-p'. With a prefix argument use the same arguments -as the buffer. - -If the value is a list of strings (including the empty list), -then use those arguments. With a prefix argument use the same -arguments as the buffer. - -Of course the arguments that are required to actually show the -same differences as those shown in the buffer are always used." - (interactive (list (read-file-name "Write patch file: " default-directory) - current-prefix-arg)) - (unless (derived-mode-p 'magit-diff-mode) - (user-error "Only diff buffers can be saved as patches")) - (let ((rev magit-buffer-range) - (typearg magit-buffer-typearg) - (args magit-buffer-diff-args) - (files magit-buffer-diff-files)) - (cond ((eq magit-patch-save-arguments 'buffer) - (when arg - (setq args nil))) - ((eq (car-safe magit-patch-save-arguments) 'exclude) - (unless arg - (setq args (-difference args (cdr magit-patch-save-arguments))))) - ((not arg) - (setq args magit-patch-save-arguments))) - (with-temp-file file - (magit-git-insert "diff" rev "-p" typearg args "--" files))) - (magit-refresh)) - -;;;###autoload -(defun magit-request-pull (url start end) - "Request upstream to pull from you public repository. - -URL is the url of your publicly accessible repository. -START is a commit that already is in the upstream repository. -END is the last commit, usually a branch name, which upstream -is asked to pull. START has to be reachable from that commit." - (interactive - (list (magit-get "remote" (magit-read-remote "Remote") "url") - (magit-read-branch-or-commit "Start" (magit-get-upstream-branch)) - (magit-read-branch-or-commit "End"))) - (let ((dir default-directory)) - ;; mu4e changes default-directory - (compose-mail) - (setq default-directory dir)) - (message-goto-body) - (magit-git-insert "request-pull" start url end) - (set-buffer-modified-p nil)) - -;;; _ -(provide 'magit-patch) -;;; magit-patch.el ends here diff --git a/elpa/magit-20200418.939/magit-patch.elc b/elpa/magit-20200418.939/magit-patch.elc deleted file mode 100644 index 1a71c880213c788226d46ac6092dfbc6f98e3ec8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17901 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 y8DOA^3F=I(*cSO333#O5vVF~zsHQ%DGj; -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements the tools used to run Git for side-effects. - -;; Note that the functions used to run Git and then consume its -;; output, are defined in `magit-git.el'. There's a bit of overlap -;; though. - -;;; Code: - -(require 'ansi-color) -(require 'cl-lib) -(require 'dash) - -(eval-when-compile - (require 'subr-x)) - -(require 'with-editor) -(require 'magit-utils) -(require 'magit-section) -(require 'magit-git) -(require 'magit-mode) - -(declare-function auth-source-search "auth-source" - (&rest spec &key max require create delete &allow-other-keys)) - -;;; Options - -(defcustom magit-process-connection-type (not (eq system-type 'cygwin)) - "Connection type used for the Git process. - -If nil, use pipes: this is usually more efficient, and works on Cygwin. -If t, use ptys: this enables Magit to prompt for passphrases when needed." - :group 'magit-process - :type '(choice (const :tag "pipe" nil) - (const :tag "pty" t))) - -(defcustom magit-need-cygwin-noglob - (and (eq system-type 'windows-nt) - (with-temp-buffer - (let ((process-environment - (append magit-git-environment process-environment))) - (condition-case e - (process-file magit-git-executable - nil (current-buffer) nil - "-c" "alias.echo=!echo" "echo" "x{0}") - (file-error - (lwarn 'magit-process :warning - "Could not run Git: %S" e)))) - (equal "x0\n" (buffer-string)))) - "Whether to use a workaround for Cygwin's globbing behavior. - -If non-nil, add environment variables to `process-environment' to -prevent the git.exe distributed by Cygwin and MSYS2 from -attempting to perform glob expansion when called from a native -Windows build of Emacs. See #2246." - :package-version '(magit . "2.3.0") - :group 'magit-process - :type '(choice (const :tag "Yes" t) - (const :tag "No" nil))) - -(defcustom magit-process-popup-time -1 - "Popup the process buffer if a command takes longer than this many seconds." - :group 'magit-process - :type '(choice (const :tag "Never" -1) - (const :tag "Immediately" 0) - (integer :tag "After this many seconds"))) - -(defcustom magit-process-log-max 32 - "Maximum number of sections to keep in a process log buffer. -When adding a new section would go beyond the limit set here, -then the older half of the sections are remove. Sections that -belong to processes that are still running are never removed. -When this is nil, no sections are ever removed." - :package-version '(magit . "2.1.0") - :group 'magit-process - :type '(choice (const :tag "Never remove old sections" nil) integer)) - -(defcustom magit-process-error-tooltip-max-lines 20 - "The number of lines for `magit-process-error-lines' to return. - -These are displayed in a tooltip for `mode-line-process' errors. - -If `magit-process-error-tooltip-max-lines' is nil, the tooltip -displays the text of `magit-process-error-summary' instead." - :package-version '(magit . "2.12.0") - :group 'magit-process - :type '(choice (const :tag "Use summary line" nil) - integer)) - -(defcustom magit-credential-cache-daemon-socket - (--some (pcase-let ((`(,prog . ,args) (split-string it))) - (if (and prog - (string-match-p - "\\`\\(?:\\(?:/.*/\\)?git-credential-\\)?cache\\'" prog)) - (or (cl-loop for (opt val) on args - if (string= opt "--socket") - return val) - (expand-file-name "~/.git-credential-cache/socket")))) - ;; Note: `magit-process-file' is not yet defined when - ;; evaluating this form, so we use `process-lines'. - (ignore-errors - (let ((process-environment - (append magit-git-environment process-environment))) - (process-lines magit-git-executable - "config" "--get-all" "credential.helper")))) - "If non-nil, start a credential cache daemon using this socket. - -When using Git's cache credential helper in the normal way, Emacs -sends a SIGHUP to the credential daemon after the git subprocess -has exited, causing the daemon to also quit. This can be avoided -by starting the `git-credential-cache--daemon' process directly -from Emacs. - -The function `magit-maybe-start-credential-cache-daemon' takes -care of starting the daemon if necessary, using the value of this -option as the socket. If this option is nil, then it does not -start any daemon. Likewise if another daemon is already running, -then it starts no new daemon. This function has to be a member -of the hook variable `magit-credential-hook' for this to work. -If an error occurs while starting the daemon, most likely because -the necessary executable is missing, then the function removes -itself from the hook, to avoid further futile attempts." - :package-version '(magit . "2.3.0") - :group 'magit-process - :type '(choice (file :tag "Socket") - (const :tag "Don't start a cache daemon" nil))) - -(defcustom magit-process-yes-or-no-prompt-regexp - (concat " [\[(]" - "\\([Yy]\\(?:es\\)?\\)" - "[/|]" - "\\([Nn]o?\\)" - ;; OpenSSH v8 prints this. See #3969. - "\\(?:/\\[fingerprint\\]\\)?" - "[\])] ?[?:] ?$") - "Regexp matching Yes-or-No prompts of Git and its subprocesses." - :package-version '(magit . "2.1.0") - :group 'magit-process - :type 'regexp) - -(defcustom magit-process-password-prompt-regexps - '("^\\(Enter \\)?[Pp]assphrase\\( for \\(RSA \\)?key '.*'\\)?: ?$" - ;; Match-group 99 is used to identify the "user@host" part. - "^\\(Enter \\)?[Pp]assword\\( for '?\\(https?://\\)?\\(?99:[^']*\\)'?\\)?: ?$" - "Please enter the passphrase for the ssh key" - "Please enter the passphrase to unlock the OpenPGP secret key" - "^.*'s password: ?$" - "^Yubikey for .*: ?$" - "^Enter PIN for .*: ?$") - "List of regexps matching password prompts of Git and its subprocesses. -Also see `magit-process-find-password-functions'." - :package-version '(magit . "2.8.0") - :group 'magit-process - :type '(repeat (regexp))) - -(defcustom magit-process-find-password-functions nil - "List of functions to try in sequence to get a password. - -These functions may be called when git asks for a password, which -is detected using `magit-process-password-prompt-regexps'. They -are called if and only if matching the prompt resulted in the -value of the 99th submatch to be non-nil. Therefore users can -control for which prompts these functions should be called by -putting the host name in the 99th submatch, or not. - -If the functions are called, then they are called in the order -given, with the host name as only argument, until one of them -returns non-nil. If they are not called or none of them returns -non-nil, then the password is read from the user instead." - :package-version '(magit . "2.3.0") - :group 'magit-process - :type 'hook - :options '(magit-process-password-auth-source)) - -(defcustom magit-process-username-prompt-regexps - '("^Username for '.*': ?$") - "List of regexps matching username prompts of Git and its subprocesses." - :package-version '(magit . "2.1.0") - :group 'magit-process - :type '(repeat (regexp))) - -(defcustom magit-process-prompt-functions nil - "List of functions used to forward arbitrary questions to the user. - -Magit has dedicated support for forwarding username and password -prompts and Yes-or-No questions asked by Git and its subprocesses -to the user. This can be customized using other options in the -`magit-process' customization group. - -If you encounter a new question that isn't handled by default, -then those options should be used instead of this hook. - -However subprocesses may also ask questions that differ too much -from what the code related to the above options assume, and this -hook allows users to deal with such questions explicitly. - -Each function is called with the process and the output string -as arguments until one of the functions returns non-nil. The -function is responsible for asking the user the appropriate -question using e.g. `read-char-choice' and then forwarding the -answer to the process using `process-send-string'. - -While functions such as `magit-process-yes-or-no-prompt' may not -be sufficient to handle some prompt, it may still be of benefit -to look at the implementations to gain some insights on how to -implement such functions." - :package-version '(magit . "3.0.0") - :group 'magit-process - :type 'hook) - -(defcustom magit-process-ensure-unix-line-ending t - "Whether Magit should ensure a unix coding system when talking to Git." - :package-version '(magit . "2.6.0") - :group 'magit-process - :type 'boolean) - -(defcustom magit-process-display-mode-line-error t - "Whether Magit should retain and highlight process errors in the mode line." - :package-version '(magit . "2.12.0") - :group 'magit-process - :type 'boolean) - -(defface magit-process-ok - '((t :inherit magit-section-heading :foreground "green")) - "Face for zero exit-status." - :group 'magit-faces) - -(defface magit-process-ng - '((t :inherit magit-section-heading :foreground "red")) - "Face for non-zero exit-status." - :group 'magit-faces) - -(defface magit-mode-line-process - '((t :inherit mode-line-emphasis)) - "Face for `mode-line-process' status when Git is running for side-effects." - :group 'magit-faces) - -(defface magit-mode-line-process-error - '((t :inherit error)) - "Face for `mode-line-process' error status. - -Used when `magit-process-display-mode-line-error' is non-nil." - :group 'magit-faces) - -;;; Process Mode - -(defvar magit-process-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-mode-map) - map) - "Keymap for `magit-process-mode'.") - -(define-derived-mode magit-process-mode magit-mode "Magit Process" - "Mode for looking at Git process output." - :group 'magit-process - (hack-dir-local-variables-non-file-buffer) - (setq imenu-prev-index-position-function - 'magit-imenu--process-prev-index-position-function) - (setq imenu-extract-index-name-function - 'magit-imenu--process-extract-index-name-function)) - -(defun magit-process-buffer (&optional nodisplay) - "Display the current repository's process buffer. - -If that buffer doesn't exist yet, then create it. -Non-interactively return the buffer and unless -optional NODISPLAY is non-nil also display it." - (interactive) - (let ((topdir (magit-toplevel))) - (unless topdir - (magit--with-safe-default-directory nil - (setq topdir default-directory) - (let (prev) - (while (not (equal topdir prev)) - (setq prev topdir) - (setq topdir (file-name-directory (directory-file-name topdir))))))) - (let ((buffer (or (--first (with-current-buffer it - (and (eq major-mode 'magit-process-mode) - (equal default-directory topdir))) - (buffer-list)) - (let ((default-directory topdir)) - (magit-generate-new-buffer 'magit-process-mode))))) - (with-current-buffer buffer - (if magit-root-section - (when magit-process-log-max - (magit-process-truncate-log)) - (magit-process-mode) - (let ((inhibit-read-only t) - (magit-insert-section--parent nil) - (magit-insert-section--oldroot nil)) - (make-local-variable 'text-property-default-nonsticky) - (magit-insert-section (processbuf) - (insert "\n"))))) - (unless nodisplay - (magit-display-buffer buffer)) - buffer))) - -(defun magit-process-kill () - "Kill the process at point." - (interactive) - (when-let ((process (magit-section-value-if 'process))) - (unless (eq (process-status process) 'run) - (user-error "Process isn't running")) - (magit-confirm 'kill-process) - (kill-process process))) - -;;; Synchronous Processes - -(defvar magit-process-raise-error nil) - -(defun magit-git (&rest args) - "Call Git synchronously in a separate process, for side-effects. - -Option `magit-git-executable' specifies the Git executable. -The arguments ARGS specify arguments to Git, they are flattened -before use. - -Process output goes into a new section in the buffer returned by -`magit-process-buffer'. If Git exits with a non-zero status, -then raise an error." - (let ((magit-process-raise-error t)) - (magit-call-git args))) - -(defun magit-run-git (&rest args) - "Call Git synchronously in a separate process, and refresh. - -Option `magit-git-executable' specifies the Git executable and -option `magit-git-global-arguments' specifies constant arguments. -The arguments ARGS specify arguments to Git, they are flattened -before use. - -After Git returns, the current buffer (if it is a Magit buffer) -as well as the current repository's status buffer are refreshed. - -Process output goes into a new section in the buffer returned by -`magit-process-buffer'." - (let ((magit--refresh-cache (list (cons 0 0)))) - (magit-call-git args) - (when (member (car args) '("init" "clone")) - ;; Creating a new repository invalidates the cache. - (setq magit--refresh-cache nil)) - (magit-refresh))) - -(defvar magit-pre-call-git-hook nil) - -(defun magit-call-git (&rest args) - "Call Git synchronously in a separate process. - -Option `magit-git-executable' specifies the Git executable and -option `magit-git-global-arguments' specifies constant arguments. -The arguments ARGS specify arguments to Git, they are flattened -before use. - -Process output goes into a new section in the buffer returned by -`magit-process-buffer'." - (run-hooks 'magit-pre-call-git-hook) - (let ((default-process-coding-system (magit--process-coding-system))) - (apply #'magit-call-process magit-git-executable - (magit-process-git-arguments args)))) - -(defun magit-call-process (program &rest args) - "Call PROGRAM synchronously in a separate process. -Process output goes into a new section in the buffer returned by -`magit-process-buffer'." - (pcase-let ((`(,process-buf . ,section) - (magit-process-setup program args))) - (magit-process-finish - (let ((inhibit-read-only t)) - (apply #'magit-process-file program nil process-buf nil args)) - process-buf (current-buffer) default-directory section))) - -(defun magit-process-file (process &optional infile buffer display &rest args) - "Process files synchronously in a separate process. -Identical to `process-file' but temporarily enable Cygwin's -\"noglob\" option during the call and ensure unix eol -conversion." - (let ((process-environment (magit-process-environment)) - (default-process-coding-system (magit--process-coding-system))) - (apply #'process-file process infile buffer display args))) - -(defun magit-process-environment () - ;; The various w32 hacks are only applicable when running on the - ;; local machine. As of Emacs 25.1, a local binding of - ;; process-environment different from the top-level value affects - ;; the environment used in - ;; tramp-sh-handle-{start-file-process,process-file}. - (let ((local (not (file-remote-p default-directory)))) - (append magit-git-environment - (and local - (cdr (assoc magit-git-executable magit-git-w32-path-hack))) - (and local magit-need-cygwin-noglob - (mapcar (lambda (var) - (concat var "=" (--if-let (getenv var) - (concat it " noglob") - "noglob"))) - '("CYGWIN" "MSYS"))) - process-environment))) - -(defvar magit-this-process nil) - -(defun magit-run-git-with-input (&rest args) - "Call Git in a separate process. -ARGS is flattened and then used as arguments to Git. - -The current buffer's content is used as the process' standard -input. - -Option `magit-git-executable' specifies the Git executable and -option `magit-git-global-arguments' specifies constant arguments. -The remaining arguments ARGS specify arguments to Git, they are -flattened before use." - (when (eq system-type 'windows-nt) - ;; On w32, git expects UTF-8 encoded input, ignore any user - ;; configuration telling us otherwise (see #3250). - (encode-coding-region (point-min) (point-max) 'utf-8-unix)) - (if (file-remote-p default-directory) - ;; We lack `process-file-region', so fall back to asynch + - ;; waiting in remote case. - (progn - (magit-start-git (current-buffer) args) - (while (and magit-this-process - (eq (process-status magit-this-process) 'run)) - (sleep-for 0.005))) - (run-hooks 'magit-pre-call-git-hook) - (pcase-let* ((process-environment (magit-process-environment)) - (default-process-coding-system (magit--process-coding-system)) - (flat-args (magit-process-git-arguments args)) - (`(,process-buf . ,section) - (magit-process-setup magit-git-executable flat-args)) - (inhibit-read-only t)) - (magit-process-finish - (apply #'call-process-region (point-min) (point-max) - magit-git-executable nil process-buf nil flat-args) - process-buf nil default-directory section)))) - -;;; Asynchronous Processes - -(defun magit-run-git-async (&rest args) - "Start Git, prepare for refresh, and return the process object. -ARGS is flattened and then used as arguments to Git. - -Display the command line arguments in the echo area. - -After Git returns some buffers are refreshed: the buffer that was -current when this function was called (if it is a Magit buffer -and still alive), as well as the respective Magit status buffer. - -See `magit-start-process' for more information." - (message "Running %s %s" magit-git-executable - (let ((m (mapconcat #'identity (-flatten args) " "))) - (remove-list-of-text-properties 0 (length m) '(face) m) - m)) - (magit-start-git nil args)) - -(defun magit-run-git-with-editor (&rest args) - "Export GIT_EDITOR and start Git. -Also prepare for refresh and return the process object. -ARGS is flattened and then used as arguments to Git. - -Display the command line arguments in the echo area. - -After Git returns some buffers are refreshed: the buffer that was -current when this function was called (if it is a Magit buffer -and still alive), as well as the respective Magit status buffer. - -See `magit-start-process' and `with-editor' for more information." - (magit--record-separated-gitdir) - (magit-with-editor (magit-run-git-async args))) - -(defun magit-run-git-sequencer (&rest args) - "Export GIT_EDITOR and start Git. -Also prepare for refresh and return the process object. -ARGS is flattened and then used as arguments to Git. - -Display the command line arguments in the echo area. - -After Git returns some buffers are refreshed: the buffer that was -current when this function was called (if it is a Magit buffer -and still alive), as well as the respective Magit status buffer. -If the sequence stops at a commit, make the section representing -that commit the current section by moving `point' there. - -See `magit-start-process' and `with-editor' for more information." - (apply #'magit-run-git-with-editor args) - (set-process-sentinel magit-this-process #'magit-sequencer-process-sentinel) - magit-this-process) - -(defvar magit-pre-start-git-hook nil) - -(defun magit-start-git (input &rest args) - "Start Git, prepare for refresh, and return the process object. - -If INPUT is non-nil, it has to be a buffer or the name of an -existing buffer. The buffer content becomes the processes -standard input. - -Option `magit-git-executable' specifies the Git executable and -option `magit-git-global-arguments' specifies constant arguments. -The remaining arguments ARGS specify arguments to Git, they are -flattened before use. - -After Git returns some buffers are refreshed: the buffer that was -current when this function was called (if it is a Magit buffer -and still alive), as well as the respective Magit status buffer. - -See `magit-start-process' for more information." - (run-hooks 'magit-pre-start-git-hook) - (let ((default-process-coding-system (magit--process-coding-system))) - (apply #'magit-start-process magit-git-executable input - (magit-process-git-arguments args)))) - -(defun magit-start-process (program &optional input &rest args) - "Start PROGRAM, prepare for refresh, and return the process object. - -If optional argument INPUT is non-nil, it has to be a buffer or -the name of an existing buffer. The buffer content becomes the -processes standard input. - -The process is started using `start-file-process' and then setup -to use the sentinel `magit-process-sentinel' and the filter -`magit-process-filter'. Information required by these functions -is stored in the process object. When this function returns the -process has not started to run yet so it is possible to override -the sentinel and filter. - -After the process returns, `magit-process-sentinel' refreshes the -buffer that was current when `magit-start-process' was called (if -it is a Magit buffer and still alive), as well as the respective -Magit status buffer." - (pcase-let* - ((`(,process-buf . ,section) - (magit-process-setup program args)) - (process - (let ((process-connection-type - ;; Don't use a pty, because it would set icrnl - ;; which would modify the input (issue #20). - (and (not input) magit-process-connection-type)) - (process-environment (magit-process-environment)) - (default-process-coding-system (magit--process-coding-system))) - (apply #'start-file-process - (file-name-nondirectory program) - process-buf program args)))) - (with-editor-set-process-filter process #'magit-process-filter) - (set-process-sentinel process #'magit-process-sentinel) - (set-process-buffer process process-buf) - (when (eq system-type 'windows-nt) - ;; On w32, git expects UTF-8 encoded input, ignore any user - ;; configuration telling us otherwise. - (set-process-coding-system process 'utf-8-unix)) - (process-put process 'section section) - (process-put process 'command-buf (current-buffer)) - (process-put process 'default-dir default-directory) - (when inhibit-magit-refresh - (process-put process 'inhibit-refresh t)) - (oset section process process) - (with-current-buffer process-buf - (set-marker (process-mark process) (point))) - (when input - (with-current-buffer input - (process-send-region process (point-min) (point-max)) - (process-send-eof process))) - (setq magit-this-process process) - (oset section value process) - (magit-process-display-buffer process) - process)) - -(defun magit-parse-git-async (&rest args) - (setq args (magit-process-git-arguments args)) - (let ((command-buf (current-buffer)) - (process-buf (generate-new-buffer " *temp*")) - (toplevel (magit-toplevel))) - (with-current-buffer process-buf - (setq default-directory toplevel) - (let ((process - (let ((process-connection-type nil) - (process-environment (magit-process-environment)) - (default-process-coding-system - (magit--process-coding-system))) - (apply #'start-file-process "git" process-buf - magit-git-executable args)))) - (process-put process 'command-buf command-buf) - (process-put process 'parsed (point)) - (setq magit-this-process process) - process)))) - -;;; Process Internals - -(defun magit-process-setup (program args) - (magit-process-set-mode-line program args) - (let ((pwd default-directory) - (buf (magit-process-buffer t))) - (cons buf (with-current-buffer buf - (prog1 (magit-process-insert-section pwd program args nil nil) - (backward-char 1)))))) - -(defun magit-process-insert-section (pwd program args &optional errcode errlog) - (let ((inhibit-read-only t) - (magit-insert-section--parent magit-root-section) - (magit-insert-section--oldroot nil)) - (goto-char (1- (point-max))) - (magit-insert-section (process) - (insert (if errcode - (format "%3s " (propertize (number-to-string errcode) - 'font-lock-face 'magit-process-ng)) - "run ")) - (unless (equal (expand-file-name pwd) - (expand-file-name default-directory)) - (insert (file-relative-name pwd default-directory) ?\s)) - (cond - ((and args (equal program magit-git-executable)) - (setq args (-split-at (length magit-git-global-arguments) args)) - (insert (propertize (file-name-nondirectory program) - 'font-lock-face 'magit-section-heading) " ") - (insert (propertize (char-to-string magit-ellipsis) - 'font-lock-face 'magit-section-heading - 'help-echo (mapconcat #'identity (car args) " "))) - (insert " ") - (insert (propertize (mapconcat #'shell-quote-argument (cadr args) " ") - 'font-lock-face 'magit-section-heading))) - ((and args (equal program shell-file-name)) - (insert (propertize (cadr args) - 'font-lock-face 'magit-section-heading))) - (t - (insert (propertize (file-name-nondirectory program) - 'font-lock-face 'magit-section-heading) " ") - (insert (propertize (mapconcat #'shell-quote-argument args " ") - 'font-lock-face 'magit-section-heading)))) - (magit-insert-heading) - (when errlog - (if (bufferp errlog) - (insert (with-current-buffer errlog - (buffer-substring-no-properties (point-min) (point-max)))) - (insert-file-contents errlog) - (goto-char (1- (point-max))))) - (insert "\n")))) - -(defun magit-process-truncate-log () - (let* ((head nil) - (tail (oref magit-root-section children)) - (count (length tail))) - (when (> (1+ count) magit-process-log-max) - (while (and (cdr tail) - (> count (/ magit-process-log-max 2))) - (let* ((inhibit-read-only t) - (section (car tail)) - (process (oref section process))) - (cond ((not process)) - ((memq (process-status process) '(exit signal)) - (delete-region (oref section start) - (1+ (oref section end))) - (cl-decf count)) - (t - (push section head)))) - (pop tail)) - (oset magit-root-section children - (nconc (reverse head) tail))))) - -(defun magit-process-sentinel (process event) - "Default sentinel used by `magit-start-process'." - (when (memq (process-status process) '(exit signal)) - (setq event (substring event 0 -1)) - (when (string-match "^finished" event) - (message (concat (capitalize (process-name process)) " finished"))) - (magit-process-finish process) - (when (eq process magit-this-process) - (setq magit-this-process nil)) - (unless (process-get process 'inhibit-refresh) - (let ((command-buf (process-get process 'command-buf))) - (if (buffer-live-p command-buf) - (with-current-buffer command-buf - (magit-refresh)) - (with-temp-buffer - (setq default-directory (process-get process 'default-dir)) - (magit-refresh))))))) - -(defun magit-sequencer-process-sentinel (process event) - "Special sentinel used by `magit-run-git-sequencer'." - (when (memq (process-status process) '(exit signal)) - (magit-process-sentinel process event) - (when-let ((process-buf (process-buffer process))) - (when (buffer-live-p process-buf) - (when-let ((status-buf (with-current-buffer process-buf - (magit-get-mode-buffer 'magit-status-mode)))) - (with-current-buffer status-buf - (--when-let - (magit-get-section - `((commit . ,(magit-rev-parse "HEAD")) - (,(pcase (car (cadr (-split-at - (1+ (length magit-git-global-arguments)) - (process-command process)))) - ((or "rebase" "am") 'rebase-sequence) - ((or "cherry-pick" "revert") 'sequence))) - (status))) - (goto-char (oref it start)) - (magit-section-update-highlight)))))))) - -(defun magit-process-filter (proc string) - "Default filter used by `magit-start-process'." - (with-current-buffer (process-buffer proc) - (let ((inhibit-read-only t)) - (goto-char (process-mark proc)) - ;; Find last ^M in string. If one was found, ignore - ;; everything before it and delete the current line. - (when-let ((ret-pos (cl-position ?\r string :from-end t))) - (cl-callf substring string (1+ ret-pos)) - (delete-region (line-beginning-position) (point))) - (insert (propertize string 'magit-section - (process-get proc 'section))) - (set-marker (process-mark proc) (point)) - ;; Make sure prompts are matched after removing ^M. - (magit-process-yes-or-no-prompt proc string) - (magit-process-username-prompt proc string) - (magit-process-password-prompt proc string) - (run-hook-with-args-until-success 'magit-process-prompt-functions - proc string)))) - -(defmacro magit-process-kill-on-abort (proc &rest body) - (declare (indent 1) (debug (form body))) - (let ((map (cl-gensym))) - `(let ((,map (make-sparse-keymap))) - (set-keymap-parent ,map minibuffer-local-map) - (define-key ,map "\C-g" - (lambda () - (interactive) - (ignore-errors (kill-process ,proc)) - (abort-recursive-edit))) - (let ((minibuffer-local-map ,map)) - ,@body)))) - -(defun magit-process-yes-or-no-prompt (process string) - "Forward Yes-or-No prompts to the user." - (when-let ((beg (string-match magit-process-yes-or-no-prompt-regexp string))) - (let ((max-mini-window-height 30)) - (process-send-string - process - (downcase - (concat - (match-string - (if (save-match-data - (magit-process-kill-on-abort process - (yes-or-no-p (substring string 0 beg)))) 1 2) - string) - "\n")))))) - -(defun magit-process-password-auth-source (key) - "Use `auth-source-search' to get a password. -If found, return the password. Otherwise, return nil. - -To use this function add it to the appropriate hook - (add-hook 'magit-process-find-password-functions - 'magit-process-password-auth-source) - -KEY typically derives from a prompt such as: - Password for 'https://tarsius@bitbucket.org' -in which case it would be the string - tarsius@bitbucket.org -which matches the ~/.authinfo.gpg entry - machine bitbucket.org login tarsius password 12345 -or iff that is undefined, for backward compatibility - machine tarsius@bitbucket.org password 12345" - (require 'auth-source) - (and (string-match "\\`\\(.+\\)@\\([^@]+\\)\\'" key) - (let* ((user (match-string 1 key)) - (host (match-string 2 key)) - (secret - (plist-get - (car (or (auth-source-search :max 1 :host host :user user) - (auth-source-search :max 1 :host key))) - :secret))) - (if (functionp secret) - (funcall secret) - secret)))) - -(defun magit-process-password-prompt (process string) - "Find a password based on prompt STRING and send it to git. -Use `magit-process-password-prompt-regexps' to find a known -prompt. If and only if one is found, then call functions in -`magit-process-find-password-functions' until one of them returns -the password. If all function return nil, then read the password -from the user." - (when-let ((prompt (magit-process-match-prompt - magit-process-password-prompt-regexps string))) - (process-send-string - process (magit-process-kill-on-abort process - (concat (or (when-let ((key (match-string 99 string))) - (run-hook-with-args-until-success - 'magit-process-find-password-functions key)) - (read-passwd prompt)) - "\n"))))) - -(defun magit-process-username-prompt (process string) - "Forward username prompts to the user." - (--when-let (magit-process-match-prompt - magit-process-username-prompt-regexps string) - (process-send-string - process (magit-process-kill-on-abort process - (concat (read-string it nil nil (user-login-name)) "\n"))))) - -(defun magit-process-match-prompt (prompts string) - "Match STRING against PROMPTS and set match data. -Return the matched string suffixed with \": \", if needed." - (when (--any-p (string-match it string) prompts) - (let ((prompt (match-string 0 string))) - (cond ((string-suffix-p ": " prompt) prompt) - ((string-suffix-p ":" prompt) (concat prompt " ")) - (t (concat prompt ": ")))))) - -(defun magit--process-coding-system () - (let ((fro (or magit-git-output-coding-system - (car default-process-coding-system))) - (to (cdr default-process-coding-system))) - (if magit-process-ensure-unix-line-ending - (cons (coding-system-change-eol-conversion fro 'unix) - (coding-system-change-eol-conversion to 'unix)) - (cons fro to)))) - -(defvar magit-credential-hook nil - "Hook run before Git needs credentials.") - -(defvar magit-credential-cache-daemon-process nil) - -(defun magit-maybe-start-credential-cache-daemon () - "Maybe start a `git-credential-cache--daemon' process. - -If such a process is already running or if the value of option -`magit-credential-cache-daemon-socket' is nil, then do nothing. -Otherwise start the process passing the value of that options -as argument." - (unless (or (not magit-credential-cache-daemon-socket) - (process-live-p magit-credential-cache-daemon-process) - (memq magit-credential-cache-daemon-process - (list-system-processes))) - (setq magit-credential-cache-daemon-process - (or (--first (let* ((attr (process-attributes it)) - (comm (cdr (assq 'comm attr))) - (user (cdr (assq 'user attr)))) - (and (string= comm "git-credential-cache--daemon") - (string= user user-login-name))) - (list-system-processes)) - (condition-case nil - (start-process "git-credential-cache--daemon" - " *git-credential-cache--daemon*" - magit-git-executable - "credential-cache--daemon" - magit-credential-cache-daemon-socket) - ;; Some Git implementations (e.g. Windows) won't have - ;; this program; if we fail the first time, stop trying. - ((debug error) - (remove-hook 'magit-credential-hook - #'magit-maybe-start-credential-cache-daemon))))))) - -(add-hook 'magit-credential-hook #'magit-maybe-start-credential-cache-daemon) - -(defun tramp-sh-handle-start-file-process--magit-tramp-process-environment - (fn name buffer program &rest args) - (if magit-tramp-process-environment - (apply fn name buffer - (car magit-tramp-process-environment) - (append (cdr magit-tramp-process-environment) - (cons program args))) - (apply fn name buffer program args))) - -(advice-add 'tramp-sh-handle-start-file-process :around - 'tramp-sh-handle-start-file-process--magit-tramp-process-environment) - -(defun tramp-sh-handle-process-file--magit-tramp-process-environment - (fn program &optional infile destination display &rest args) - (if magit-tramp-process-environment - (apply fn "env" infile destination display - (append magit-tramp-process-environment - (cons program args))) - (apply fn program infile destination display args))) - -(advice-add 'tramp-sh-handle-process-file :around - 'tramp-sh-handle-process-file--magit-tramp-process-environment) - -(defvar magit-mode-line-process-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd " ") - 'magit-process-buffer) - map) - "Keymap for `mode-line-process'.") - -(defun magit-process-set-mode-line (program args) - "Display the git command (sans arguments) in the mode line." - (when (equal program magit-git-executable) - (setq args (nthcdr (length magit-git-global-arguments) args))) - (let ((str (concat " " (propertize - (concat (file-name-nondirectory program) - (and args (concat " " (car args)))) - 'mouse-face 'highlight - 'keymap magit-mode-line-process-map - 'help-echo "mouse-1: Show process buffer" - 'font-lock-face 'magit-mode-line-process)))) - (magit-repository-local-set 'mode-line-process str) - (dolist (buf (magit-mode-get-buffers)) - (with-current-buffer buf - (setq mode-line-process str))) - (force-mode-line-update t))) - -(defun magit-process-set-mode-line-error-status (&optional error str) - "Apply an error face to the string set by `magit-process-set-mode-line'. - -If ERROR is supplied, include it in the `mode-line-process' tooltip. - -If STR is supplied, it replaces the `mode-line-process' text." - (setq str (or str (magit-repository-local-get 'mode-line-process))) - (when str - (setq error (format "%smouse-1: Show process buffer" - (if (stringp error) - (concat error "\n\n") - ""))) - (setq str (concat " " (propertize - (substring-no-properties str 1) - 'mouse-face 'highlight - 'keymap magit-mode-line-process-map - 'help-echo error - 'font-lock-face 'magit-mode-line-process-error))) - (magit-repository-local-set 'mode-line-process str) - (dolist (buf (magit-mode-get-buffers)) - (with-current-buffer buf - (setq mode-line-process str))) - (force-mode-line-update t) - ;; We remove any error status from the mode line when a magit - ;; buffer is refreshed (see `magit-refresh-buffer'), but we must - ;; ensure that we ignore any refreshes during the remainder of the - ;; current command -- otherwise a newly-set error status would be - ;; removed before it was seen. We set a flag which prevents the - ;; status from being removed prior to the next command, so that - ;; the error status is guaranteed to remain visible until then. - (let ((repokey (magit-repository-local-repository))) - ;; The following closure captures the repokey value, and is - ;; added to `pre-command-hook'. - (cl-labels ((enable-magit-process-unset-mode-line - () ;; Remove ourself from the hook variable, so - ;; that we only run once. - (remove-hook 'pre-command-hook - #'enable-magit-process-unset-mode-line) - ;; Clear the inhibit flag for the repository in - ;; which we set it. - (magit-repository-local-set - 'inhibit-magit-process-unset-mode-line nil repokey))) - ;; Set the inhibit flag until the next command is invoked. - (magit-repository-local-set - 'inhibit-magit-process-unset-mode-line t repokey) - (add-hook 'pre-command-hook - #'enable-magit-process-unset-mode-line))))) - -(defun magit-process-unset-mode-line-error-status () - "Remove any current error status from the mode line." - (let ((status (or mode-line-process - (magit-repository-local-get 'mode-line-process)))) - (when (and status - (eq (get-text-property 1 'font-lock-face status) - 'magit-mode-line-process-error)) - (magit-process-unset-mode-line)))) - -(defun magit-process-unset-mode-line (&optional directory) - "Remove the git command from the mode line." - (let ((default-directory (or directory default-directory))) - (unless (magit-repository-local-get 'inhibit-magit-process-unset-mode-line) - (magit-repository-local-set 'mode-line-process nil) - (dolist (buf (magit-mode-get-buffers)) - (with-current-buffer buf (setq mode-line-process nil))) - (force-mode-line-update t)))) - -(defvar magit-process-error-message-regexps - (list "^\\*ERROR\\*: Canceled by user$" - "^\\(?:error\\|fatal\\|git\\): \\(.*\\)$" - "^\\(Cannot rebase:.*\\)$")) - -(define-error 'magit-git-error "Git error") - -(defun magit-process-error-summary (process-buf section) - "A one-line error summary from the given SECTION." - (or (and (buffer-live-p process-buf) - (with-current-buffer process-buf - (and (oref section content) - (save-excursion - (goto-char (oref section end)) - (run-hook-wrapped - 'magit-process-error-message-regexps - (lambda (re) - (save-excursion - (and (re-search-backward - re (oref section start) t) - (or (match-string-no-properties 1) - (and (not magit-process-raise-error) - 'suppressed)))))))))) - "Git failed")) - -(defun magit-process-error-tooltip (process-buf section) - "Returns the text from SECTION of the PROCESS-BUF buffer. - -Limited by `magit-process-error-tooltip-max-lines'." - (and (integerp magit-process-error-tooltip-max-lines) - (> magit-process-error-tooltip-max-lines 0) - (buffer-live-p process-buf) - (with-current-buffer process-buf - (save-excursion - (goto-char (or (oref section content) - (oref section start))) - (buffer-substring-no-properties - (point) - (save-excursion - (forward-line magit-process-error-tooltip-max-lines) - (goto-char - (if (> (point) (oref section end)) - (oref section end) - (point))) - ;; Remove any trailing whitespace. - (when (re-search-backward "[^[:space:]\n]" - (oref section start) t) - (forward-char 1)) - (point))))))) - -(defvar-local magit-this-error nil) - -(defvar magit-process-finish-apply-ansi-colors nil) - -(defun magit-process-finish (arg &optional process-buf command-buf - default-dir section) - (unless (integerp arg) - (setq process-buf (process-buffer arg)) - (setq command-buf (process-get arg 'command-buf)) - (setq default-dir (process-get arg 'default-dir)) - (setq section (process-get arg 'section)) - (setq arg (process-exit-status arg))) - (when (fboundp 'dired-uncache) - (dired-uncache default-dir)) - (when (buffer-live-p process-buf) - (with-current-buffer process-buf - (let ((inhibit-read-only t) - (marker (oref section start))) - (goto-char marker) - (save-excursion - (delete-char 3) - (set-marker-insertion-type marker nil) - (insert (propertize (format "%3s" arg) - 'magit-section section - 'font-lock-face (if (= arg 0) - 'magit-process-ok - 'magit-process-ng))) - (set-marker-insertion-type marker t)) - (when magit-process-finish-apply-ansi-colors - (ansi-color-apply-on-region (oref section content) - (oref section end))) - (if (= (oref section end) - (+ (line-end-position) 2)) - (save-excursion - (goto-char (1+ (line-end-position))) - (delete-char -1) - (oset section content nil)) - (let ((buf (magit-process-buffer t))) - (when (and (= arg 0) - (not (--any-p (eq (window-buffer it) buf) - (window-list)))) - (magit-section-hide section))))))) - (if (= arg 0) - ;; Unset the `mode-line-process' value upon success. - (magit-process-unset-mode-line default-dir) - ;; Otherwise process the error. - (let ((msg (magit-process-error-summary process-buf section))) - ;; Change `mode-line-process' to an error face upon failure. - (if magit-process-display-mode-line-error - (magit-process-set-mode-line-error-status - (or (magit-process-error-tooltip process-buf section) - msg)) - (magit-process-unset-mode-line default-dir)) - ;; Either signal the error, or else display the error summary in - ;; the status buffer and with a message in the echo area. - (cond - (magit-process-raise-error - (signal 'magit-git-error (list (format "%s (in %s)" msg default-dir)))) - ((not (eq msg 'suppressed)) - (when (buffer-live-p process-buf) - (with-current-buffer process-buf - (when-let ((status-buf (magit-get-mode-buffer 'magit-status-mode))) - (with-current-buffer status-buf - (setq magit-this-error msg))))) - (message "%s ... [%s buffer %s for details]" msg - (if-let ((key (and (buffer-live-p command-buf) - (with-current-buffer command-buf - (car (where-is-internal - 'magit-process-buffer)))))) - (format "Hit %s to see" (key-description key)) - "See") - (buffer-name process-buf)))))) - arg) - -(defun magit-process-display-buffer (process) - (when (process-live-p process) - (let ((buf (process-buffer process))) - (cond ((not (buffer-live-p buf))) - ((= magit-process-popup-time 0) - (if (minibufferp) - (switch-to-buffer-other-window buf) - (pop-to-buffer buf))) - ((> magit-process-popup-time 0) - (run-with-timer magit-process-popup-time nil - (lambda (p) - (when (eq (process-status p) 'run) - (let ((buf (process-buffer p))) - (when (buffer-live-p buf) - (if (minibufferp) - (switch-to-buffer-other-window buf) - (pop-to-buffer buf)))))) - process)))))) - -(defun magit--log-action (summary line list) - (let (heading lines) - (if (cdr list) - (progn (setq heading (funcall summary list)) - (setq lines (mapcar line list))) - (setq heading (funcall line (car list)))) - (with-current-buffer (magit-process-buffer t) - (goto-char (1- (point-max))) - (let ((inhibit-read-only t)) - (magit-insert-section (message) - (magit-insert-heading (concat " * " heading)) - (when lines - (dolist (line lines) - (insert line "\n")) - (insert "\n")))) - (let ((inhibit-message t)) - (when heading - (setq lines (cons heading lines))) - (message (mapconcat #'identity lines "\n")))))) - -;;; _ -(provide 'magit-process) -;;; magit-process.el ends here diff --git a/elpa/magit-20200418.939/magit-process.elc b/elpa/magit-20200418.939/magit-process.elc deleted file mode 100644 index ef8438d984c013fb60c203dd0325d83167245dd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46012 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
w0!cJTr)Ss4A|KEg>W}=L?DiT z!ms3~y2QU!lqP)-EVVdNaM7X!-K`wee`I84Sx+?yOp05P=X7!!?x`R7D^q-#`UW~j z3W-WT<^^Jx_V`T08%Bwe`rBM84U*tL^gwY`Co_0K;iTvQ z@(cydRoAN~VG5ZMg#4{B5;pdXGVPEUGUM4IaVru7xkDAcqux+N3xv3;aiTUB#-O%K zE4NSBPZjr?ek1lk&?u^#%b4 ziaYl&nMEsq0c0)%$n>5VGDBmukHv{bu9GuI;~qJqd&rrW_2RgeB&+gCKQjUc4&8R~ z8b)gT&LSDvocn}G01{q;@}W9VItfgWLBD+R_sRHz{}dDIafWsa+3LyvDiVZzwD^D( zSE!2C2eORp=Yc+-EqAzt3AQw+*Bo2nHezYW1rM zy|4%d(W5vye}y-i2>}qb@<3Px@d~z9bUfXq3z6_$j$g zWZXzJ%bqsh{*b8Tw8d1E8&GGAbrwxZl<^aKZMw0g^;9dJT%L!UDB^{O=}H*_^~S=& z6|NTEYG@dBMa|GG*K5gJ`rcYtcxN+zu5poTjhb79bL@H?FTBOnY&Qfo)}{RlAC4pO zpc_T=z4^BlPu+NLzTG?jQx^KBk`LI6xURO79U5g`4JO_Q=^hOi>!Zss>3WleA>RO% z%|e15pVNXgwNi~}iEji1rOiaoDAPb$22CwM6PQa0s;RUqR|>ZP9&Wvr-!ia%Hh=DS zjI=qRp`R2)-BYwPms}&0dmxJ4QP=d;WKGzzSMwI*Bpiy{J(DMZBn2hK zwfAq)ZhiiW@J-8|ay7My(-nylELF=^S1(^IT&i5S#jxs2!i?Iltgm0Ksyo4?+HSS9 z5Ds%ZESUO%*ej#8xR%8v6WLx6C5({|`~BR6%(C|4IpXvD-VKIb>1Zz{3=s~?3 zc-Pe3AfQ?w<31Kg$h3d9I_m5Z!FFP763Fv_p~9H+(HFvr9K9v>4;G;~CO5_~@`9i; zE5y6}FeK{wDM5n(()62Ubiec&pReUHyzjmuYBSpWoaX{H;_!MTBT3D?Y^4-Z7> z8-9z))QdGy*3G*8D$WVK7hUq-deQ?-8mL-I2j=$?_E@}tRZP)lrF6>?Hdb=ai!OHc zE|Fo!PL80ZV2e~lS(sP(MV>(=@%`gl^?MT9H8*UPHR$i;hJGZy4jyTS0(dGks6rfi zKHy-B#3o&YJkwuX*ZvL;`~$4`a_5+M>6QcuLGQ`>VTlxO(G+$+8DrQ@FQc*p2o+}f zXSh+t^>TF-#wQ7zxH+Y(RM<0Oz^CtdgG^5#qd*+O`*X;#Xg*@aSV2XT<~JlHPhBam zEQauxLFKc#BEb694K_qCe}uq6b8DFEx7?D~*@_$NAgi>VVauvPek(WP!owyof{C&f z?&5YHUV&{OET8uWK3CE$$c9~`6r0b? zG!zfbPN+Bk>!P26pR7-%S$4q+Zsf9ymfXWDF^e1~Vv=^Re2F zBh7A>c+ZLfhjDV}!z6zwPqT>rjik>DcQ>r z3IAphVw*U0fY@o$g^kC9x04cb!d3fDVEtDI$$u_d_a<-@cBDYHP&I0)QxAZaNC0L2 zGAseL)`crd$|xxdfu1=}J2o)o+;m6-5|6OtNcr74(jFqK=u%54&!0XK7x*uZ_) z{!$o-I?buhv#1%^Y7@=PQPQ~Ca3J^a(dTy`ZQg$qe!2E%<4JCx!caaulfjgxz4SD_ z-Y`y+oI8g)2m#2GYn(r-p6}j*Z68`?h_6+tZWs;7PU1 zt$$c-#Q*6;WYjJ~JBck++G@UG;RTEQmcSRqxmB>azP|2uCP~v^7dG9F0GQW{GHZ+X zEZd32k$|yP>}nb6jmk$fK%c0#F2ivd*Lhy*V#Q@TS3*94cUMTR&}v(#hL0(+h?1;- zun2ea*_>W1VE1m_dHlFw2E6y+(|e!YiEe)J>8E!dMZu1E_U;x3E{u#DsoUO2I2rvy z`B^5qF694xxIo_X8{lJTx{y6Pg*GSeoQZ~^LG7o44g!|7>NVR-QU963da<7nIn%s! zRF81Mb4UD-UZ3wUnKAZ8vMGj+-w(yqLXMWriI(DJt8&Z(>GHe3*K1CT56G$^?diLCDv3+AB&R$uR6^(rB@rvh2}7Q#JFG35c#l+-i|>XeCN`r55k^`J z+;c)dnDRt8<-9jus8YTaLDaGY&{}v^xaSucnbNy*7P|_V{!8KhY&CIQ=8z5IuW1Eu zpz|zF7OkZ7yk5QVQlGQT*m4BEt-2RxrcYfYOpBB-aLCzmi9Watq}9@239*ua;}swn z*BT$`TH5ZRA;+%9!@uc@1wMEqVJ-Q4z|(vZm>&sj09H|)ao&)rnIzFa@R>@*#^ZT{ z4<(KFsrWFd;gId(`b@Dx+vhtUUc#7}#^OZ?7LFM~(d-MxRm1LL8IRNWQ3;S|A!v9p z+$)O~6BDV3nzV%ty-`}QENq3#3m!3W{82c5KT{9nSu&YY!$)LZ>!5S zw7NCj9#E*LvVM;j-kb<^B$);J1NjkGOGJlo-vlW|X16BZ9p}$HcNfB91zaE>#`xfG zfkc^y!>EVh{7i&ARLbacjH!=&fF?$8X8|9;MN~`0jLO)dqpByeFiR}NR&~Lw|J6RR zNCj)EtXVY*s}Rc?5<@0<>%>%UTcBdRUQfI!rrv5scV1b-!`*vN{_W1~drv-pWT0y= z%f=(A;B3|E-y2LSp)YX#5`{^(i@_>XJm#{22qW!P6; zHWw4|5)9A1ci(I8z5S2xD_97L*|AaldRMN^;B*cHd^M&+IV*?+!3L`I5e!!a=azdi z5bQ!J7_2|De{G`U3y&xrYVX5X2V}K`GNVfbF5zTe%>y zaQQ!t^97F_EFGqVJdbFM8J&k!SqOX=dkpL_JWQSx`cD(XF%#O zLFs6@?H;B@B#qQH`G`_6HkC8uC!sh67F7~Fiw2JX{sq7{Z)3nyw@A5{J0C4_dGyP=~^(=qK*1`;Dhn?dd=~{>&d!D zU2hrwe)^KoHxEq=R`KtE&~k+q5ZXmqeg}kJ%n>>_vtVEwW6!gl0SB;E3v zUClpKNVYUNV-dp=CL_;(#B!jfUfc1nAdtB0`MXlp3EG%;5WB19AfD($C=OQi)G~Tm zh+<0rqK%l;xlm3ZpNdyiqlolGDU~vlg(9WiSE(U~l_5XVCH#c>Gb?z9B3aQlz4wxM zSeLrWP4abzLlhm`nlL|8D%>P;%~e|$);D*Op1MB4wP|#C(NpxG$>yxPn3z@q@MVcC z1&wxbmfO{jl0){J(~__tOHZ5i*sSZ#^HWBvg#`UsM) zoVPe$E)Yt%#UEV3^obm^iVe=96l>|+aN(`+SaUwx4GsA?K?rIb{~SHuTCUez%fwE` zC*lZ8?xeC}f{I?M;Cr@3E+BAGMG4oYTY3`%VR*Nwp@eJ2KHh-5pQKEMI7DJeCSHhw z>?hSIXBrMsr+9+DSbQ$W?($0Jmy6GOj4dc>#k*xTRj^!!H9*EfJau7pz8I*YW_ZY6{jdSPeuJL=!M>#c>qy3k)H$!sjCLrS3_F z8PfUPy3pQRxFl);J>Vl=SnycpekWV*C++-9=w^LQOEMG4`r(krEvIH&Fnzm=#Z{dG z){+48+QP_sI*;m=!MME9e>(nE=%JE>o?y8M!?vlrz(p|Sky+RD_6EEdWu|gkY}W*2 zW#U+R+F*+b!LG&L_l{nO%E&*HP2&I;sEz04t>p%kH;%9JrFmrZ_oi1Q!(L8yx4b;U zW6O~;lXdxC;L}qpT8@D=G_*RvaS${ccp1IHr4|<8tJ_hCLNNc{B&X%hqer(szkMg- z?`NOiofY{OR%fbXQ>dL2yJ_4MKDzsOThj+8^v_sGE&Z8ufHJCobl-6J`rHgIc)Zf% zE-^#74{`mxG9qrUicOO8yw6HXfaTLB4dr7f%|z(xj*E!+lC*nD$iQR82i|mdKtv%S zLsj_YqfJ_tjY0FV+436H$oF|4Bx6u6)gFU`X1Z>?+$;pOAhTBO)3y~7h zYKa1@Z{6}e$T;CEDe)2;2=-`@aYA0nj@t*4OUMZ!$K;(&#^-X21f_b0BnwL?A+dx} zS=H7WbyewWZ~o#tK(IZoU!-`{-nn%bNT(B}1zEaFW70pvkFt@5;W8~f(yT4KwdtM-?=QJWnB&J}YB0(r26-n8a)~k4 zYZvv7>#q2?Zqe>*hwD4Gp-r_z5=*2NJ*S?(p)>NSY{S2tAD;8#RWrpiTUpJ=X^&a9 zQC!OrquKCNMVd;R;c%3erSS-9be2Ynb&7x{7Mq4|Gsb;j3v8B{eL#6oSQf)=iHR< zwi>gtZb-3d%)?uoO-sDFWD+^CCs2y_KULHB=R(>|g{#UW({giz^E)&)oz%f45dc~! zT|SX~lgyKXQ!p6L$e<|`&FY)w%AD}IdKQ47X;PeJG5ACf$1}nW#d4}N^duzTKSl*Q zc(W(vKTLAUUwsOSbDl<(tLX?&BWtI$ABvCpg64=lzP=M~ZkM$DZFNSi9!#VaY5g-w zA)^;$$jt=G>Kj+h@2yCsDL<<7 zHT~g8aZS1T$TjVuHni*{k%8CL$rjr7#hzVFR$CT};KHe>kcSbbc%Z~^gEqR^OuocglwJLFsbKrb_8H4gD!*s zTGW6chBa@sI$_lrtH*{0ipxf`x-{6ngVJsWgh1J=C zPLeQT6aTD-H}$Z%qQVFD6-$Y7QlI>%G499k1Xr~F)4BPJH}&hH@d=kY%NXo7JQxu} zm22XL8#1ZP$b|3$(k{6-$@Z8*?SrTs@+D6aa#7()(i!+lzM68l5;X2WokJ_$KDMIr z;S{TSP8E(-XG$f~HP2l`g}|7pm{o!`*Dal-xgOniIhE-B-gs&OczETuJn^syCg0Pt zj}8f;u6Mq?^We!@szBcAL|00X7*LS36%8sjnV9WjMLyTkA~K2X*IF(PBvr{DrzG$< zxo}1Mm_EFst>Rl<;s>d=j(uBfTjR%ESGKXNZzd|ME|gtC0bs+)DCebGdbg0`&eg>7 zA(CAlc4_0K(~YDdXq1y6Hl1$7k#RJbCd%rStkOjDAp5)W6KhW~Y|O`f6yTwxQlBIp zXYOiEPWW;K{cl`&7A4fEIPQXDb~=MDCGNz6LTl!btH3A}mu=6=v|6x6S-f_E_gm$Q z30yjBPf??G#GZ&6I8sPo4HlVMDYU1ak|ZQl5 zDDfOLrvN_qY;$Mq8v}j*M!u?f9~1D84g8G~HNFMbYH6??2*3=SvHR2-UEQ-3dVL=X zPrUlz&_fwzM&KIHOLr%@0z9TyZt_{bboU8=8Vi)Is%+l4VJ`x#2=oZ&wbUpis$DJl z7mts2LWbQ_Su08^xO-BZ1sHuBYg;>mhM5(tso3}aOD3`oK z_Z~9{x$YbyU=6cv3Z0WB<-Q=0Q%h8pv{$$V4Youo0v(3O)d3mdJeWTr99&s(OF;Rn z0uwN!vma8B1&#(B@sU;YLXt(eUr$=z!bP%6AoSkEJO%aEbb#9;#7B>xJi7PbOnZ-S z(Zl!RLwJcJ`|O};y05C_bJ+=&UPqr9u-L5HpNP?Pgr zXV&KA!%&qcic?BxQdU*9N=<)~m9Dx?h_L1SP9CJmpc{A~^yc=^7a*9M;L89%UGCMx zL3okcNOeB246b`Zqtn z{q^YIJ-U9kB2#^sicT&H>^^iZsLe#Hg%so+MQ8*{&3hJmHrb9qokU&FRu3Lw& zvsToq40q)%qNc=vDhbN9%E2Lut!5X;O>G}NS3LV6OPK8tQLCf$w)?xsGT@N&!*!~boQE{ z2V7U|CPja(;NL8ODod7WEtehOP6qWq?35|Pok@w$!r7Osw6o`da?>YX znqy;fR8{t(qb$8KDoRS@)7Urz7m@iyY(Y>%Iu^VZ$3J4#4CHH9Oi#1iD*HxSm19IH z@`F070NL+}XFY>qP4( zM`Dn{$N@Vl&Uy`@VUqkn0-264A#Cn*&||2Ri}D8;4XE-YguoP|OmvVY@(ZydLMmdC zLRE7s=C~L|E1{6ULFxt>rq8oPj$%gn&w1HR+^5wx=128-IOH-0R zyf~fK*P~BClLGp(u}XR*CCmf1V_GiSNn)WxM%13QMI#DjE}L(bd)w3Qk%Z(NVhjP!6){m9bU5rr=d%d^9RUFcsD7x_<-plhJLP1++e}PfK5@*#p{GbAi#H2n z^@AvM5(pP`$x3lhKt(6H2qVKwi}@L1-;2?QW`ZC);qyt6&%0{QCMrgPRs5%(XH&ne z49HGm6qGK!4bQd^E-A;dAC-AFVuRBfoPX0v6!Jp5W2+5)OxLY7|Cg@TFGvPxJoIdx z0nFgqQxggsKU3a=8Wn9e4%R)m@kf=pfb1ft{_gy9HW&Xc40W2re`o$$!r}Gx@2aev z!oLg@(c)pJ9CF~8cBl)HChOF+bSBYSE}{xR&1~kD_)n8iLu0Q2T!E9hgI#Mhx zzgn&0ZyN6(w?8of-cGSCov1y5DffP(ya+W3@zTVV)-oq-UFB4yq=)Wt7Hr0ACeFr{J4)!cF zj?<3VDZQgA*_?SC@sltuthJvng{Na6Y7L9=0@wW(H1x*?e;{sPr892uq z=@Um8o&?H3(PyD)pbQEqvKT)U21tlP`p_D9lWz!Ps0Z#i?glleg}&6JknJPa3Q`)- zb=p&`4!33;s0|*KsETGXP{)l}ZWa^h&}8BkW&M-drK_}3OL)NaA6GP*8!iw({s}iH zICu80dZFyJhde%-S*yq{97YPA3n8}wdA(1~R2LuE?r)*4$^;<_79OT};t*rxm|Jo} zSWledM9U|}xvGZVRh%Oee!8<>{s=O7dc!`=zEE(r@ND7g8^9#AHpJ=@ z19-h-d&ChG`U)?-c=6(;8+=JFZ7y6|xOB5!xhg>Pw=Q0^ zU+}ZnHSIFc_(T_A6+v# z{x&|m%mZR&PE0o5r88=bJJwRiKW|Ke1inkXq`2;DiH>8CiO$(EBzaHRoXAyy z7fl${DZy&_=9KpT#8rvS;#I-#X*f9}RM9rrq9Su&b||quiB7C|IM|3DTY>A+xgbQh z%nGkOIU+Z;Ntst)y$A~ti= z>K=y5!I4eO8{>nXL3filtAMcP4++R8M?8`#DHoKMK_Jx$y9eD2Q*yVrb8rN-0@WUP zw@%Dc#=}0xFb!NQ=z>#iC?0HZU`IGgxSZJnb#gp5lu|($5AB_0elAVK`8vfXmB=X! zNwC2^ykFjwwh&~&57Rfkp?dTye8>^usl0JO{F_}aKMraE& z(P;~SS|rm(gHJ$$2kR3MFSEFuw0J5iS4U^#7WNHA=vIWzC4?TG66G6vqWwCYelw)? zmCk=S)IDuYCW~Z}_Dp-I8ASv;VRHmN&S%13(Px$26K$O~h8E>xtM7)yjtp5WD=-;A zfi8vU6gU4sEI6Mngf6Kbji+G>Py6nWGLuRD}mR!aylPZy6GlBZO&kBt z(?%!CD7eA)BbcZPIga0Dhu#dT&ma&|oC{?0&G>t+JgqkyP6cHes-IQHM8kuskH5`L zs_*>p+rdSAvlwK7!v2HlTc2&8Hv|#rtCLlMXP27i0%=d@PaPs?M zN2klkNAIBW1)jvmfEs$(L@ZXJ<0^HH!=1AP0k<@v<${S>!LGHmIyXs^b#Y$ecD2T; zfXJi*Y($6wm2G}cli7)^4A-{|Mi-8b6qDP9q3{b~{>_Dhy=Gl2Wo8e$O*v;T@?*a^4IU(8)LMAT)S z-8PenltHg}hy+n(F2JOk#~BnR=&YjN&*1$S97QPd7*cZxE=R_sd>78_QbplMcQ`xP zAZV{cGSaS0;lVspuO;i=Gajcch?=5TTrDS&R0mBShIGul01Lf82O_s4K-XtoVs0H~ zY?UYJfXK_U2s!R-_)#%Z^*e*4Z_UI}^0?908nOyDIOUH0h`)5-`I;D{ay>w*159NP zo7El&yCRlk7oeH}Qkz=>;Y-H?+%4T#z#{QmYB@!K&r{6r?Aa-&m+j!RQ zJ>$@$2z`CsE9Uju_4V9cGNGTA3*qRM$TR^|_|)EeCf67083<%xUM!fyB} zy~CGu_L(qTY!G(9RV6de4bT6q6mQ0ko+e+Yr)L1AY#X)Y8-1&XY;DU#rej7ADZ8vkrP7gffF{Q5QFmxB zCKy+`PQ^W^3#^1)Uh}&)Jhv3JiXA0bS;*mvTuP01dSW_25IW@|(C=pO;UUmA_ z8H#c9ih?fv!1+QxJuzE0UlQHvO$+4`eObY{={y_u&AUByHXkpsKmXhEfnv|6Mxhc_;cb<1y z9$Pn2MO0Kh_Z_BpO>sP(o|xhYJg# z2}V(`U%8>Dt&yj6r6IW#c=G5qp`_jBatp{cTUsk#xO_zsx~4~iXvX7%tT=tBSrE@p zr4D6E8miAs6lzDR%1;#;u)8xMPq~-I(bW8>R1Tjqa-zhJPwmK`Ra###o$UG3;v_@w zQg__kp;L4{FUdnTmiH%eJ~ZbB*ulrd)tb_1X8;n)jRZP5@J=*1NCPB~<+gz|KVvWq zZb~US`fv6jPpFL8fyY@?aSIlq}{~w&>*d zkc?oJ8Nre(Nq5Vhxw*R)ZJ{1BsYRlQ_u~5&M6S?EJKpx zD!)Zl;5jUoqb#e)5X-rTqn%;boeo!_sCXrSos78!H%2{fw2ade`4X6{XRBwa2?5vq zASZ#UE?v_|A7b!Xit(LFhC$@2JQ*-~>+yzx#@uuMm#tGf_VmLm3{)W3Z6bJ|cT(VkT zdL`DOea`V>fKxa(dPDL@d>LO3K@2cgek*r@<>0;@GOBZ zmKdKrQduIiK8xuhpd@L;N8OhtqPB_gJ!e2JlqEW_?hy!V|MBP$O)Vzgcu6PT#Jq5Y zGjjq5RcE?o$(bgJ!9R&o*EJHN3a3doxNMI)#6g_%;o0RHMb@(|W%w{TOa0AjBq-U< z+N4Gi-`_s}v-jS8f1M6n$$v93mDs7r7ay_*zDy3cViv?ReWs3-!w*(ZVh7gmP%WtJ z%VIUbVljT6+3{Z__6BQwJwJiE&N8P;`KN-BL{5{a^Ml{z3Eb&bzP*Z}4XPgwp zUv@S{n&O+*uLAbvw`AY1OP=(%m_sf7v9FP{M9WQo0`+^oHjcYyK-J(o^ZOkiCZMVZ zjc!{L@ilS&RZYZO3|RgG7I$4|PdAgvmHJ~nVh2wXzg#?cdUB&N^VI2IS+Bme(6NT8w6La^ZOq&ONI86H)Wx0 zf*QlECX3gqA+6Vwr7J;?Jxy%GsBua?o9VJSr0$WL=DFnb&GPxvp-rgt>{2+6YnQ4w zI1{3sBF1 -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements pull commands. - -;;; Code: - -(require 'magit) - -;;; Options - -(defcustom magit-pull-or-fetch nil - "Whether `magit-pull' also offers some fetch suffixes." - :package-version '(magit . "3.0.0") - :group 'magit-commands - :type 'boolean) - -;;; Commands - -;;;###autoload (autoload 'magit-pull "magit-pull" nil t) -(define-transient-command magit-pull () - "Pull from another repository." - :man-page "git-pull" - [:description - (lambda () (if magit-pull-or-fetch "Pull arguments" "Arguments")) - ("-r" "Rebase local commits" ("-r" "--rebase")) - ("-A" "Autostash" "--autostash" :level 7)] - [:description - (lambda () - (if-let ((branch (magit-get-current-branch))) - (concat - (propertize "Pull into " 'face 'transient-heading) - (propertize branch 'face 'magit-branch-local) - (propertize " from" 'face 'transient-heading)) - (propertize "Pull from" 'face 'transient-heading))) - ("p" magit-pull-from-pushremote) - ("u" magit-pull-from-upstream) - ("e" "elsewhere" magit-pull-branch)] - ["Fetch from" - :if-non-nil magit-pull-or-fetch - ("f" "remotes" magit-fetch-all-no-prune) - ("F" "remotes and prune" magit-fetch-all-prune)] - ["Fetch" - :if-non-nil magit-pull-or-fetch - ("o" "another branch" magit-fetch-branch) - ("s" "explicit refspec" magit-fetch-refspec) - ("m" "submodules" magit-fetch-modules)] - ["Configure" - ("r" magit-branch..rebase :if magit-get-current-branch) - ("C" "variables..." magit-branch-configure)] - (interactive) - (transient-setup 'magit-pull nil nil :scope (magit-get-current-branch))) - -(defun magit-pull-arguments () - (transient-args 'magit-pull)) - -;;;###autoload (autoload 'magit-pull-from-pushremote "magit-pull" nil t) -(define-suffix-command magit-pull-from-pushremote (args) - "Pull from the push-remote of the current branch. - -With a prefix argument or when the push-remote is either not -configured or unusable, then let the user first configure the -push-remote." - :if 'magit-get-current-branch - :description 'magit-pull--pushbranch-description - (interactive (list (magit-pull-arguments))) - (pcase-let ((`(,branch ,remote) - (magit--select-push-remote "pull from there"))) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "pull" args remote branch))) - -(defun magit-pull--pushbranch-description () - ;; Also used by `magit-rebase-onto-pushremote'. - (let* ((branch (magit-get-current-branch)) - (target (magit-get-push-branch branch t)) - (remote (magit-get-push-remote branch)) - (v (magit--push-remote-variable branch t))) - (cond - (target) - ((member remote (magit-list-remotes)) - (format "%s, replacing non-existent" v)) - (remote - (format "%s, replacing invalid" v)) - (t - (format "%s, setting that" v))))) - -;;;###autoload (autoload 'magit-pull-from-upstream "magit-pull" nil t) -(define-suffix-command magit-pull-from-upstream (args) - "Pull from the upstream of the current branch. - -With a prefix argument or when the upstream is either not -configured or unusable, then let the user first configure -the upstream." - :if 'magit-get-current-branch - :description 'magit-pull--upstream-description - (interactive (list (magit-pull-arguments))) - (let* ((branch (or (magit-get-current-branch) - (user-error "No branch is checked out"))) - (remote (magit-get "branch" branch "remote")) - (merge (magit-get "branch" branch "merge"))) - (when (or current-prefix-arg - (not (or (magit-get-upstream-branch branch) - (magit--unnamed-upstream-p remote merge)))) - (magit-set-upstream-branch - branch (magit-read-upstream-branch - branch (format "Set upstream of %s and pull from there" branch))) - (setq remote (magit-get "branch" branch "remote")) - (setq merge (magit-get "branch" branch "merge"))) - (run-hooks 'magit-credential-hook) - (magit-run-git-with-editor "pull" args remote merge))) - -(defun magit-pull--upstream-description () - (when-let ((branch (magit-get-current-branch))) - (or (magit-get-upstream-branch branch) - (let ((remote (magit-get "branch" branch "remote")) - (merge (magit-get "branch" branch "merge")) - (u (magit--propertize-face "@{upstream}" 'bold))) - (cond - ((magit--unnamed-upstream-p remote merge) - (format "%s of %s" - (magit--propertize-face merge 'magit-branch-remote) - (magit--propertize-face remote 'bold))) - ((magit--valid-upstream-p remote merge) - (concat u ", replacing non-existent")) - ((or remote merge) - (concat u ", replacing invalid")) - (t - (concat u ", setting that"))))))) - -;;;###autoload -(defun magit-pull-branch (source args) - "Pull from a branch read in the minibuffer." - (interactive (list (magit-read-remote-branch "Pull" nil nil nil t) - (magit-pull-arguments))) - (run-hooks 'magit-credential-hook) - (pcase-let ((`(,remote . ,branch) - (magit-get-tracked source))) - (magit-run-git-with-editor "pull" args remote branch))) - -;;; _ -(provide 'magit-pull) -;;; magit-pull.el ends here diff --git a/elpa/magit-20200418.939/magit-pull.elc b/elpa/magit-20200418.939/magit-pull.elc deleted file mode 100644 index 42663d635d130814b00fa9a3f8a42af815e92d9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6212 zcmdT|ZExGi5q9jv&G`@X+9HOND-JELLDJ$rLJhLxe|K;?zJ3BiEFJ8Q$QM-ARlRcCi&dV(%9>`?)k@O2QkfJ5wh$a03=+8zSt>L=S#P4VV`viUil9vX zHHxIiPDNEI3Z2TL^0lnm)mRyXBhpOA3d>os7qar>x-5D0Ip)R7Gn$xTtPSkr1{0cv zvFM>QrLij-jVU)9C+Kiiu+PE!up=Z^S)CU&m?cujWeQM%n+-CNpC`g7b&xJPM_c=*-MJ_)%xSbo-bwp> zbaX_6L3bGq+=4?7W*_7gd437k>n`ZMmFGe;X29QpH+h~`5INIJRaRKTO=(uct6!QK z7}FfTRTcEmoPXAg;|)za$KKe_$>x4e>PqQK=p{P3tBOwhCl+ppLK|oF*-G~_30n=U zhm(y<|GMuRRRf@7fzhiHVNzD5uk|*KU!$F}!v3ZBwrMjlrtMZ&n?1uZ`?;_`u!uvXr^1Bn#>JUQb57MMk|s zo|GcrE1O$N1nl2K$*Juga*I6MKBO7Av1r=5>Eb|BEsqd!oEZeYIC;@&RVnFvem|B z+dPRi*#j~8ah0Vpay*b)uVj3SY}dQp$=Lcm;krK0RZ?g2HUqleyZYIwDi-NQ4X54i zMhw+`f3dom4}WhT{x~06EM`01nxnU$_H^^K4K32cA=8wbHUO69PQXWoLp{5NgZK@A z>pmL+uQSPe4T~74JArma5%|R6%Wy%qWvFr**wV@?)SQ&oCsz9+)}+e-OR? zQmGHkG2&7tARDR3OtU*2kKz<5^i>gCDIQ4Nhz5s`Xh_lXXHz)E29KiC-hO!LwPrCJ zHux`buZC5ByMHs^x~BSH#lN6I>MB<)P@zchbwf4DI{R>5%!?mQ4F;$)gskx{QY9e^ z6lPXe5Na}s8K8Dxc=Mul+k|J-MXj0tKjmo!ank2iQNNY0R%^#|$GqrB?(;)S>$@Ds z=Djv}wuNUOY&yBd_?taDYL=EFZlV1CEmPLPM{xb{p7DP!vPQe#;QM&bHtfR7Cc_=> z9@9J;jqyJEdIztDm+#I!G(sYCSnjSQ#{L$7>A$)W$t&T#U%=;#I>Ums(1>@ z-_LMSwtJY=PrV%F%L6}`(^JH(d(A-2Ty@FB(?A7X46>@idx|AC*w zU8`987GY>OdVnue^6o!`b@<;F%tjdF97IQxh!<&_rltv24q?`C>Oe3;VHSlC3olFta2zwfEK5X{_k(f)ONhRBDdP{g??CnAt*4V`=Rw^TPVtb-@&YKj zc7R5SuF`Crpe}H;A``#uZVF@=ZQbbhWu<{vcE-D|#!22G>>F9A*y*vhWU4I=89qK6 z-ubS`mkHOBYmg5e$RCH};QtTgTP6K!h;Jo)5x%!l{!`#SFAVIv0_1;!?9CbOjO#Z| z=%PB`>_ox%4dY9Ak1=Cno(IF%4P(9SlY^KxMblkU|SL$W2HkYb;uk zwZ>tlW2gJ0gkVf*^l$INY6n(WQp5dX3p>a`uDe|ueTFu zr_ICn&pDs^?cG3)pniq!e>gxtpk@SV#P7t@{V)uV%d E1Ay7qxBvhE diff --git a/elpa/magit-20200418.939/magit-push.el b/elpa/magit-20200418.939/magit-push.el deleted file mode 100644 index 910c5141..00000000 --- a/elpa/magit-20200418.939/magit-push.el +++ /dev/null @@ -1,331 +0,0 @@ -;;; magit-push.el --- update remote objects and refs -*- lexical-binding: t -*- - -;; Copyright (C) 2008-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements push commands. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) - -;;; Commands - -;;;###autoload (autoload 'magit-push "magit-push" nil t) -(define-transient-command magit-push () - "Push to another repository." - :man-page "git-push" - ["Arguments" - ("-f" "Force with lease" (nil "--force-with-lease")) - ("-F" "Force" ("-f" "--force")) - ("-h" "Disable hooks" "--no-verify") - ("-n" "Dry run" ("-n" "--dry-run")) - (5 "-u" "Set upstream" "--set-upstream") - (7 "-t" "Follow tags" "--follow-tags")] - [:if magit-get-current-branch - :description (lambda () - (format (propertize "Push %s to" 'face 'transient-heading) - (propertize (magit-get-current-branch) - 'face 'magit-branch-local))) - ("p" magit-push-current-to-pushremote) - ("u" magit-push-current-to-upstream) - ("e" "elsewhere" magit-push-current)] - ["Push" - [("o" "another branch" magit-push-other) - ("r" "explicit refspecs" magit-push-refspecs) - ("m" "matching branches" magit-push-matching)] - [("T" "a tag" magit-push-tag) - ("t" "all tags" magit-push-tags) - (6 "n" "a note ref" magit-push-notes-ref)]] - ["Configure" - ("C" "Set variables..." magit-branch-configure)]) - -(defun magit-push-arguments () - (transient-args 'magit-push)) - -(defun magit-git-push (branch target args) - (run-hooks 'magit-credential-hook) - ;; If the remote branch already exists, then we do not have to - ;; qualify the target, which we prefer to avoid doing because - ;; using the default namespace is wrong in obscure cases. - (pcase-let ((namespace (if (magit-get-tracked target) "" "refs/heads/")) - (`(,remote . ,target) - (magit-split-branch-name target))) - (magit-run-git-async "push" "-v" args remote - (format "%s:%s%s" branch namespace target)))) - -;;;###autoload (autoload 'magit-push-current-to-pushremote "magit-push" nil t) -(define-suffix-command magit-push-current-to-pushremote (args) - "Push the current branch to its push-remote. - -When the push-remote is not configured, then read the push-remote -from the user, set it, and then push to it. With a prefix -argument the push-remote can be changed before pushed to it." - :if 'magit-get-current-branch - :description 'magit-push--pushbranch-description - (interactive (list (magit-push-arguments))) - (pcase-let ((`(,branch ,remote) - (magit--select-push-remote "push there"))) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "push" "-v" args remote - (format "refs/heads/%s:refs/heads/%s" - branch branch)))) ; see #3847 and #3872 - -(defun magit-push--pushbranch-description () - (let* ((branch (magit-get-current-branch)) - (target (magit-get-push-branch branch t)) - (remote (magit-get-push-remote branch)) - (v (magit--push-remote-variable branch t))) - (cond - (target) - ((member remote (magit-list-remotes)) - (format "%s, creating it" - (magit--propertize-face (concat remote "/" branch) - 'magit-branch-remote))) - (remote - (format "%s, replacing invalid" v)) - (t - (format "%s, setting that" v))))) - -;;;###autoload (autoload 'magit-push-current-to-upstream "magit-push" nil t) -(define-suffix-command magit-push-current-to-upstream (args) - "Push the current branch to its upstream branch. - -With a prefix argument or when the upstream is either not -configured or unusable, then let the user first configure -the upstream." - :if 'magit-get-current-branch - :description 'magit-push--upstream-description - (interactive (list (magit-push-arguments))) - (let* ((branch (or (magit-get-current-branch) - (user-error "No branch is checked out"))) - (remote (magit-get "branch" branch "remote")) - (merge (magit-get "branch" branch "merge"))) - (when (or current-prefix-arg - (not (or (magit-get-upstream-branch branch) - (magit--unnamed-upstream-p remote merge) - (magit--valid-upstream-p remote merge)))) - (let* ((branches (-union (--map (concat it "/" branch) - (magit-list-remotes)) - (magit-list-remote-branch-names))) - (upstream (magit-completing-read - (format "Set upstream of %s and push there" branch) - branches nil nil nil 'magit-revision-history - (or (car (member (magit-remote-branch-at-point) branches)) - (car (member "origin/master" branches))))) - (upstream (or (magit-get-tracked upstream) - (magit-split-branch-name upstream)))) - (setq remote (car upstream)) - (setq merge (cdr upstream)) - (unless (string-prefix-p "refs/" merge) - ;; User selected a non-existent remote-tracking branch. - ;; It is very likely, but not certain, that this is the - ;; correct thing to do. It is even more likely that it - ;; is what the user wants to happen. - (setq merge (concat "refs/heads/" merge)))) - (cl-pushnew "--set-upstream" args :test #'equal)) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "push" "-v" args remote (concat branch ":" merge)))) - -(defun magit-push--upstream-description () - (when-let ((branch (magit-get-current-branch))) - (or (magit-get-upstream-branch branch) - (let ((remote (magit-get "branch" branch "remote")) - (merge (magit-get "branch" branch "merge")) - (u (magit--propertize-face "@{upstream}" 'bold))) - (cond - ((magit--unnamed-upstream-p remote merge) - (format "%s as %s" - (magit--propertize-face remote 'bold) - (magit--propertize-face merge 'magit-branch-remote))) - ((magit--valid-upstream-p remote merge) - (format "%s creating %s" - (magit--propertize-face remote 'magit-branch-remote) - (magit--propertize-face merge 'magit-branch-remote))) - ((or remote merge) - (concat u ", creating it and replacing invalid")) - (t - (concat u ", creating it"))))))) - -;;;###autoload -(defun magit-push-current (target args) - "Push the current branch to a branch read in the minibuffer." - (interactive - (--if-let (magit-get-current-branch) - (list (magit-read-remote-branch (format "Push %s to" it) - nil nil it 'confirm) - (magit-push-arguments)) - (user-error "No branch is checked out"))) - (magit-git-push (magit-get-current-branch) target args)) - -;;;###autoload -(defun magit-push-other (source target args) - "Push an arbitrary branch or commit somewhere. -Both the source and the target are read in the minibuffer." - (interactive - (let ((source (magit-read-local-branch-or-commit "Push"))) - (list source - (magit-read-remote-branch - (format "Push %s to" source) nil - (if (magit-local-branch-p source) - (or (magit-get-push-branch source) - (magit-get-upstream-branch source)) - (and (magit-rev-ancestor-p source "HEAD") - (or (magit-get-push-branch) - (magit-get-upstream-branch)))) - source 'confirm) - (magit-push-arguments)))) - (magit-git-push source target args)) - -(defvar magit-push-refspecs-history nil) - -;;;###autoload -(defun magit-push-refspecs (remote refspecs args) - "Push one or multiple REFSPECS to a REMOTE. -Both the REMOTE and the REFSPECS are read in the minibuffer. To -use multiple REFSPECS, separate them with commas. Completion is -only available for the part before the colon, or when no colon -is used." - (interactive - (list (magit-read-remote "Push to remote") - (split-string (magit-completing-read-multiple - "Push refspec,s" - (cons "HEAD" (magit-list-local-branch-names)) - nil nil 'magit-push-refspecs-history) - crm-default-separator t) - (magit-push-arguments))) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "push" "-v" args remote refspecs)) - -;;;###autoload -(defun magit-push-matching (remote &optional args) - "Push all matching branches to another repository. -If multiple remotes exist, then read one from the user. -If just one exists, use that without requiring confirmation." - (interactive (list (magit-read-remote "Push matching branches to" nil t) - (magit-push-arguments))) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "push" "-v" args remote ":")) - -;;;###autoload -(defun magit-push-tags (remote &optional args) - "Push all tags to another repository. -If only one remote exists, then push to that. Otherwise prompt -for a remote, offering the remote configured for the current -branch as default." - (interactive (list (magit-read-remote "Push tags to remote" nil t) - (magit-push-arguments))) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "push" remote "--tags" args)) - -;;;###autoload -(defun magit-push-tag (tag remote &optional args) - "Push a tag to another repository." - (interactive - (let ((tag (magit-read-tag "Push tag"))) - (list tag (magit-read-remote (format "Push %s to remote" tag) nil t) - (magit-push-arguments)))) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "push" remote tag args)) - -;;;###autoload -(defun magit-push-notes-ref (ref remote &optional args) - "Push a notes ref to another repository." - (interactive - (let ((note (magit-notes-read-ref "Push notes" nil nil))) - (list note - (magit-read-remote (format "Push %s to remote" note) nil t) - (magit-push-arguments)))) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "push" remote ref args)) - -;;;###autoload -(defun magit-push-implicitly (args) - "Push somewhere without using an explicit refspec. - -This command simply runs \"git push -v [ARGS]\". ARGS are the -arguments specified in the popup buffer. No explicit refspec -arguments are used. Instead the behavior depends on at least -these Git variables: `push.default', `remote.pushDefault', -`branch..pushRemote', `branch..remote', -`branch..merge', and `remote..push'. - -The function `magit-push-implicitly--desc' attempts to predict -what this command will do. The value it returns is displayed in -the popup buffer." - (interactive (list (magit-push-arguments))) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "push" "-v" args)) - -(defun magit-push-implicitly--desc () - (let ((default (magit-get "push.default"))) - (unless (equal default "nothing") - (or (when-let ((remote (or (magit-get-remote) - (magit-remote-p "origin"))) - (refspec (magit-get "remote" remote "push"))) - (format "%s using %s" - (magit--propertize-face remote 'magit-branch-remote) - (magit--propertize-face refspec 'bold))) - (--when-let (and (not (magit-get-push-branch)) - (magit-get-upstream-branch)) - (format "%s aka %s\n" - (magit-branch-set-face it) - (magit--propertize-face "@{upstream}" 'bold))) - (--when-let (magit-get-push-branch) - (format "%s aka %s\n" - (magit-branch-set-face it) - (magit--propertize-face "pushRemote" 'bold))) - (--when-let (magit-get-@{push}-branch) - (format "%s aka %s\n" - (magit-branch-set-face it) - (magit--propertize-face "@{push}" 'bold))) - (format "using %s (%s is %s)\n" - (magit--propertize-face "git push" 'bold) - (magit--propertize-face "push.default" 'bold) - (magit--propertize-face default 'bold)))))) - -;;;###autoload -(defun magit-push-to-remote (remote args) - "Push to REMOTE without using an explicit refspec. -The REMOTE is read in the minibuffer. - -This command simply runs \"git push -v [ARGS] REMOTE\". ARGS -are the arguments specified in the popup buffer. No refspec -arguments are used. Instead the behavior depends on at least -these Git variables: `push.default', `remote.pushDefault', -`branch..pushRemote', `branch..remote', -`branch..merge', and `remote..push'." - (interactive (list (magit-read-remote "Push to remote") - (magit-push-arguments))) - (run-hooks 'magit-credential-hook) - (magit-run-git-async "push" "-v" args remote)) - -(defun magit-push-to-remote--desc () - (format "using %s\n" (magit--propertize-face "git push " 'bold))) - -;;; _ -(provide 'magit-push) -;;; magit-push.el ends here diff --git a/elpa/magit-20200418.939/magit-push.elc b/elpa/magit-20200418.939/magit-push.elc deleted file mode 100644 index a1b60bae5d377e51b64c5cfb5b088bd7be161176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12755 zcmd^G`)}LU6;9&BO$BTP_QQr@19nHpi9MK(Na|rb#g@cz+W=jgCN4TGG7ws#Y%UV1 zk(5)n=>NX&JNI6SdfHiv0>e_sqR9I^kMDfvT=vn?mxsT*apOkq(W6J|FddHKLDZ8U zaiWffVK-M7QI^MPqWsowAWz=K#kmRx1C@@7co_c>7I>WR*5u*wd7P_0Mp5HD%2n?& z35Ri4_0n!$WN~tq@8D^c7b@)aqMj;e@%DH9{kbuEDaJ_BLUq%m2+??4^xZw&N!%x| z4xc|)-SaRDy9JiGBh!aTPvxoVhKV|j)F2I~CNW#dRTO4}ILcIUj)s1q=YN+Ey0*dmLwxdN2&n;$pkD)rj+$)Q9c58J{=Ra@+&Ji_!yzr>0Ds+4c!pg=vLctM z0S4h^idAmC_9}yP)4_O{sI7xuly|cjHVexLv(rC|^Y9etah|4cb3Clho1`v0IPPCwJ$Kpkiused z`Lj!vjd{CNisSNUbs@d%($$Tw5P@mPMKmiWHDe;<*+smH3N;=9Fr#odGd29$tvtG7 z{%UJ3qP=_(#q1(JO9zAWohrh!Sv~aSiEEx*v4l$F?d|Oowb-}fzQKkw?5{h{GGf>% z&flojz0aBKmK%^Y~)s0aNJuJ)kx6!$y|dk8|1 zM5W7?_MiEgx9tGBfnJU~NW0+xTfrdHjy3KReT?6aAWkcpiGP+`D^fw9EE=XoG-snz zBhflmk7Vs(^*98YDF}-OdGro=$_L9QSf;dm77;0Ug5e?sGxDsG7IZbeHVgGy=8G37 z!C>{Cv)OT@??;2U8yAQn{d^R4Y1#|+ZlA6moxV9GQ5a+Q9QLL3vZE!V+h)r|tBrew zaUIW29MVk}Zv_ul?_$pJN$qBQyJEq7!U0=VD48GZOh@-KUx3PdMCNJ+3{N~_MdzUi$mCR zB{rL_bhD@jtd7Hh+^(QFP`CRQ6yI@_Lw|Zm@Xa4Orb!M*v=HwiNr=pSPQXou`DM~o z4!JG{a4#HX(B9e14>t47+&NL+zS`Qjr*@UU-`I!gK%8D+#JNm>9B?rVL!^GQJuOlz zE=cVrWTY9gm9(GkX?IfM#yYncaZmJIyGF+3BYKZ9Vut@@d3wyJTJ4ruF zhjJGQakisC$uQFnk{M~6$jEy7U8TO0+*;|xrIT2x&yH#nT%^Cr8GP(Cf^+Ca;+O0N z$Ts0UZmtn}a>v{#gWtim8CbzHq4oCW z$zTQ9#7OkEk+n`bRE)>mmE9UgcWu})&jxW`m`A9XXeJA6+fjg2B)(t~F+#H*9jUEl zxUO(or^HbsehVfX0QvDC?8*qq1u6$U04VRn^kiIAJqn^g{l7y@OE)Wc=|LIw)?Lb1 zY6zk;DoMi32Cj4j!bN-IF4{K!g0^0rAqkHVy7<$(rPWa0@MmubIG|+{A86bI;`*pl z_}==*n9`@h10Rk2#wPy2MEJX7+rV32?>JajfY64z1wTQ6K0!mRV`)M2G57Kh zEGTH28}~oLkJe2tw$Hm?y&5gh$Hyn4bbm|g=jG`u@vUX6EX+VF3`(9aN0Va1K$ zwzXS~7Tj3FUo52FV%y;MQ#%gi)o5}O4v4Kbu>59yefAIZI;*fQ6qDfprPv)-Ij+IvmQxMqfEdy+Orp{9{%4s)snMU0 zN0dWq2hv=k8rxMF+F`uN!Zph%yTK(RG)J)$Orw*O*+@^J`8XL%k<8Ez7;4EcOmV$z z-$_Vb?6AKGC$N*b*JT8YI#l@pec!J)zXL*o83+i=wL}^Q7?hYz+#yXst-3-77y&$Q zZA}n4c!)7T3xs9XTj1<~S2WO3_>cP21&}?LvkjUC^#_X}XY^G``e4(|7b`1$x)~2pl1*X_&bNy7V(I1 zIdIMbl3s?*UG!?^5gl}6LSxw3nW8lUnu}P##N^({|_y7ahPdx|oi zXe>|1JQy)~5h_sN88{|HTC-BGufG2F<>Aq_)T>XADut7^Ws1dqjQ-kw)1TKLbip$> zQb(;hd^c{3_CQSm6I4?0N70#Fw>00CYhSKG5_N_GXyc7~TR60Cr}!{{`eBAgQ~DOQ zN(tIBh&01No=8<{-_}vzL;u>Srv|lTjixOIF$+H>k(j1^;5;sh_7MpWsmK>cPo6m| z4eUhiNj(9FoJf$WHpr?4OSC0_g01R`S)gq!O(KTF;doHQplj;o(Pyt-938%50vzJk z-@iUSsu-BQQ5sm;dWDH8b)44V0rPV(n;PNl83i1`%}}4`NhLW)8h>c`BUo*m*W`FJ zya?lg9Bsi3#o*Dsu$em{3kQv9vcnw-A4qVF%{w)40W6_saLnwYT>Z*AmlYwx>Edc3 z><+09^6Pc{vl+z)GQ$&P%X00#);uW`pJ9S16XRPv2H$P<6b4^6vD4eUO9w$PM@i56 zKsOtLR`f$?9BfwPPXmzi&x*lMj*N9$>?qBeHB&b2p{y#$cS|$UM@U9=I}BdhijA8v zZJ+WL#!gg(O5QL2VkKW1uPqcz!>h4=)Gha01~^fDw+93UI5GO-)9>1I9Gh9|*INZ| z{2nW;R;1`AQ$?s<_WRd3FBBh1dsGK#=Bx~eDf1XyzlXpwf(a0E96xP__xTP;nuLR; z1#8)Fxgkc@U=mr0p$xGS{qWsb1Mo5K=@9pUhNvV(*)vGK*WBA*jO2C!B#sRUx0Cof zZ&l@9G$e|0blSH}#SI-BvDJx+d5p3`s{$F+j;ZTdB>^WU6+>zZVDmL@X76IC4^^V! zsHhQOLemp?LJ~wR5@XD8Wqu&3tvoT@r)Gd2q|Z3of2DBQ-YR92sW)!l`#BV?527a_ zd%xaZ60+Y<(N;wkL+IgGsJPWO8s-7oGW8ld`nicv>Y6^p5eehdul-EiXYJ0dlKhJgKZaF(x@rPK~jy_N|uot+t^A`lvBS*ZxZJ zBYeK6_{&4eUsMVEfwuy)KtPe02n#KPsb--B)Yc+p*lkF1&^IcPo71JMGI=O#UoV(} zN!Cy*W|=n_r8HYcD<$18W6L-vA|XkbJ&*_5$SZ_GrT8*mj3_OyM z&xr&4}q>kk~g$M|dU9B!x<${y95&r8h~Tur8&ZC#cAolbzG( zJiLg3uf1p#CA}OGR3T*Y-K?U9NdUs1Bfqhw{`^3_VF27USo&Z`z0vl*%iGU1m3gpJ zd!u1@_f!4-S9$zW4hY$2_Ng9YQ9miqq6^a~JJqMUxgPX^NEnR3ylki5XkU~#O=0u( zh{2^R<(miCToECrNUTDIxfgef+B>p@f-ibnExn7uT6!szaSTDDz&nm`dI38r##xf{ zz^oU8f`yl&4GL;n8#+Z_No6NXg9FZ;(@v8Jo2`E!e>hQ11BPB5HUD`>yw*V}RX_Xo zraRe<7Bu!WgX=oA^aKBIh>>#6#UwG1B=I-AloJ(=#c1#c-l7y*xA3Q}VZo%9j1dG0 zk0%s3U`3HZU+RjNJ?F<68c!tfu&HFyHm_TlQ5WEj_>)7)sSA#7n7`ue1>a^M|0YJL zjADEKb8%1fUf9#;F7=%0;-1+1!k%27&%+@uj0Z$gtK%=89oSz?uJOQ<4{iTaQmgtZ zct3EFuk+Y&#bj8!QW?Lbl#e`D7w@I!Zq7+KRP~(&pa~&wQc0Vu&*^n&SGV(2s&v;+ z#aVp|--ej0gLiSJhUF1}K0ur*2Fhy|8g6U{PWSjn?&2q#;ydOywrMw`wlEjmdo$nW zTzsuo5E`|+eK}ohG;QrJwE>rJvogO}5d(-KCeg*< -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for looking at Git reflogs. - -;;; Code: - -(require 'magit-core) -(require 'magit-log) - -(eval-when-compile - (require 'subr-x)) - -;;; Options - -(defcustom magit-reflog-limit 256 - "Maximal number of entries initially shown in reflog buffers. -The limit in the current buffer can be changed using \"+\" -and \"-\"." - :package-version '(magit . "3.0.0") - :group 'magit-commands - :type 'number) - -(defcustom magit-reflog-margin - (list (nth 0 magit-log-margin) - (nth 1 magit-log-margin) - 'magit-log-margin-width nil - (nth 4 magit-log-margin)) - "Format of the margin in `magit-reflog-mode' buffers. - -The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH). - -If INIT is non-nil, then the margin is shown initially. -STYLE controls how to format the author or committer date. - It can be one of `age' (to show the age of the commit), - `age-abbreviated' (to abbreviate the time unit to a character), - or a string (suitable for `format-time-string') to show the - actual date. Option `magit-log-margin-show-committer-date' - controls which date is being displayed. -WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. -AUTHOR controls whether the name of the author is also shown by - default. -AUTHOR-WIDTH has to be an integer. When the name of the author - is shown, then this specifies how much space is used to do so." - :package-version '(magit . "2.9.0") - :group 'magit-log - :group 'magit-margin - :type magit-log-margin--custom-type - :initialize 'magit-custom-initialize-reset - :set-after '(magit-log-margin) - :set (apply-partially #'magit-margin-set-variable 'magit-reflog-mode)) - -;;; Faces - -(defface magit-reflog-commit '((t :foreground "green")) - "Face for commit commands in reflogs." - :group 'magit-faces) - -(defface magit-reflog-amend '((t :foreground "magenta")) - "Face for amend commands in reflogs." - :group 'magit-faces) - -(defface magit-reflog-merge '((t :foreground "green")) - "Face for merge, checkout and branch commands in reflogs." - :group 'magit-faces) - -(defface magit-reflog-checkout '((t :foreground "blue")) - "Face for checkout commands in reflogs." - :group 'magit-faces) - -(defface magit-reflog-reset '((t :foreground "red")) - "Face for reset commands in reflogs." - :group 'magit-faces) - -(defface magit-reflog-rebase '((t :foreground "magenta")) - "Face for rebase commands in reflogs." - :group 'magit-faces) - -(defface magit-reflog-cherry-pick '((t :foreground "green")) - "Face for cherry-pick commands in reflogs." - :group 'magit-faces) - -(defface magit-reflog-remote '((t :foreground "cyan")) - "Face for pull and clone commands in reflogs." - :group 'magit-faces) - -(defface magit-reflog-other '((t :foreground "cyan")) - "Face for other commands in reflogs." - :group 'magit-faces) - -;;; Commands - -;;;###autoload -(defun magit-reflog-current () - "Display the reflog of the current branch. -If `HEAD' is detached, then show the reflog for that instead." - (interactive) - (magit-reflog-setup-buffer (or (magit-get-current-branch) "HEAD"))) - -;;;###autoload -(defun magit-reflog-other (ref) - "Display the reflog of a branch or another ref." - (interactive (list (magit-read-local-branch-or-ref "Show reflog for"))) - (magit-reflog-setup-buffer ref)) - -;;;###autoload -(defun magit-reflog-head () - "Display the `HEAD' reflog." - (interactive) - (magit-reflog-setup-buffer "HEAD")) - -;;; Mode - -(defvar magit-reflog-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-log-mode-map) - (define-key map "\C-c\C-n" 'undefined) - (define-key map "L" 'magit-margin-settings) - map) - "Keymap for `magit-reflog-mode'.") - -(define-derived-mode magit-reflog-mode magit-mode "Magit Reflog" - "Mode for looking at Git reflog. - -This mode is documented in info node `(magit)Reflog'. - -\\\ -Type \\[magit-refresh] to refresh the current buffer. -Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \ -to visit the commit at point. - -Type \\[magit-cherry-pick] to apply the commit at point. -Type \\[magit-reset] to reset `HEAD' to the commit at point. - -\\{magit-reflog-mode-map}" - :group 'magit-log - (hack-dir-local-variables-non-file-buffer)) - -(defun magit-reflog-setup-buffer (ref) - (require 'magit) - (magit-setup-buffer #'magit-reflog-mode nil - (magit-buffer-refname ref) - (magit-buffer-log-args (list (format "-n%s" magit-reflog-limit))))) - -(defun magit-reflog-refresh-buffer () - (magit-set-header-line-format (concat "Reflog for " magit-buffer-refname)) - (magit-insert-section (reflogbuf) - (magit-git-wash (apply-partially 'magit-log-wash-log 'reflog) - "reflog" "show" "--format=%h%x00%aN%x00%gd%x00%gs" "--date=raw" - magit-buffer-log-args magit-buffer-refname "--"))) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-reflog-mode)) - magit-buffer-refname) - -(defvar magit-reflog-labels - '(("commit" . magit-reflog-commit) - ("amend" . magit-reflog-amend) - ("merge" . magit-reflog-merge) - ("checkout" . magit-reflog-checkout) - ("branch" . magit-reflog-checkout) - ("reset" . magit-reflog-reset) - ("rebase" . magit-reflog-rebase) - ("cherry-pick" . magit-reflog-cherry-pick) - ("initial" . magit-reflog-commit) - ("pull" . magit-reflog-remote) - ("clone" . magit-reflog-remote) - ("autosave" . magit-reflog-commit) - ("restart" . magit-reflog-reset))) - -(defun magit-reflog-format-subject (subject) - (let* ((match (string-match magit-reflog-subject-re subject)) - (command (and match (match-string 1 subject))) - (option (and match (match-string 2 subject))) - (type (and match (match-string 3 subject))) - (label (if (string= command "commit") - (or type command) - command)) - (text (if (string= command "commit") - label - (mapconcat #'identity - (delq nil (list command option type)) - " ")))) - (format "%-16s " - (magit--propertize-face - text (or (cdr (assoc label magit-reflog-labels)) - 'magit-reflog-other))))) - -;;; _ -(provide 'magit-reflog) -;;; magit-reflog.el ends here diff --git a/elpa/magit-20200418.939/magit-reflog.elc b/elpa/magit-20200418.939/magit-reflog.elc deleted file mode 100644 index e65752fb0953aca2b5f754c10ad393fd35db02fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9997 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 -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for listing references in a buffer. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) - -;;; Options - -(defgroup magit-refs nil - "Inspect and manipulate Git branches and tags." - :link '(info-link "(magit)References Buffer") - :group 'magit-modes) - -(defcustom magit-refs-mode-hook nil - "Hook run after entering Magit-Refs mode." - :package-version '(magit . "2.1.0") - :group 'magit-refs - :type 'hook) - -(defcustom magit-refs-sections-hook - '(magit-insert-error-header - magit-insert-branch-description - magit-insert-local-branches - magit-insert-remote-branches - magit-insert-tags) - "Hook run to insert sections into a references buffer." - :package-version '(magit . "2.1.0") - :group 'magit-refs - :type 'hook) - -(defcustom magit-refs-show-commit-count nil - "Whether to show commit counts in Magit-Refs mode buffers. - -all Show counts for branches and tags. -branch Show counts for branches only. -nil Never show counts. - -To change the value in an existing buffer use the command -`magit-refs-show-commit-count'" - :package-version '(magit . "2.1.0") - :group 'magit-refs - :safe (lambda (val) (memq val '(all branch nil))) - :type '(choice (const all :tag "For branches and tags") - (const branch :tag "For branches only") - (const nil :tag "Never"))) -(put 'magit-refs-show-commit-count 'safe-local-variable 'symbolp) -(put 'magit-refs-show-commit-count 'permanent-local t) - -(defcustom magit-refs-pad-commit-counts nil - "Whether to pad all counts on all sides in `magit-refs-mode' buffers. - -If this is nil, then some commit counts are displayed right next -to one of the branches that appear next to the count, without any -space in between. This might look bad if the branch name faces -look too similar to `magit-dimmed'. - -If this is non-nil, then spaces are placed on both sides of all -commit counts." - :package-version '(magit . "2.12.0") - :group 'magit-refs - :type 'boolean) - -(defvar magit-refs-show-push-remote nil - "Whether to show the push-remotes of local branches. -Also show the commits that the local branch is ahead and behind -the push-target. Unfortunately there is a bug in Git that makes -this useless (the commits ahead and behind the upstream are -shown), so this isn't enabled yet.") - -(defcustom magit-refs-show-remote-prefix nil - "Whether to show the remote prefix in lists of remote branches. - -This is redundant because the name of the remote is already shown -in the heading preceding the list of its branches." - :package-version '(magit . "2.12.0") - :group 'magit-refs - :type 'boolean) - -(defcustom magit-refs-margin - (list nil - (nth 1 magit-log-margin) - 'magit-log-margin-width nil - (nth 4 magit-log-margin)) - "Format of the margin in `magit-refs-mode' buffers. - -The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH). - -If INIT is non-nil, then the margin is shown initially. -STYLE controls how to format the author or committer date. - It can be one of `age' (to show the age of the commit), - `age-abbreviated' (to abbreviate the time unit to a character), - or a string (suitable for `format-time-string') to show the - actual date. Option `magit-log-margin-show-committer-date' - controls which date is being displayed. -WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. -AUTHOR controls whether the name of the author is also shown by - default. -AUTHOR-WIDTH has to be an integer. When the name of the author - is shown, then this specifies how much space is used to do so." - :package-version '(magit . "2.9.0") - :group 'magit-refs - :group 'magit-margin - :safe (lambda (val) (memq val '(all branch nil))) - :type magit-log-margin--custom-type - :initialize 'magit-custom-initialize-reset - :set-after '(magit-log-margin) - :set (apply-partially #'magit-margin-set-variable 'magit-refs-mode)) - -(defcustom magit-refs-margin-for-tags nil - "Whether to show information about tags in the margin. - -This is disabled by default because it is slow if there are many -tags." - :package-version '(magit . "2.9.0") - :group 'magit-refs - :group 'magit-margin - :type 'boolean) - -(defcustom magit-refs-primary-column-width (cons 16 32) - "Width of the focus column in `magit-refs-mode' buffers. - -The primary column is the column that contains the name of the -branch that the current row is about. - -If this is an integer, then the column is that many columns wide. -Otherwise it has to be a cons-cell of two integers. The first -specifies the minimal width, the second the maximal width. In that -case the actual width is determined using the length of the names -of the shown local branches. (Remote branches and tags are not -taken into account when calculating to optimal width.)" - :package-version '(magit . "2.12.0") - :group 'magit-refs - :type '(choice (integer :tag "Constant wide") - (cons :tag "Wide constrains" - (integer :tag "Minimum") - (integer :tag "Maximum")))) - -(defcustom magit-refs-focus-column-width 5 - "Width of the focus column in `magit-refs-mode' buffers. - -The focus column is the first column, which marks one -branch (usually the current branch) as the focused branch using -\"*\" or \"@\". For each other reference, this column optionally -shows how many commits it is ahead of the focused branch and \"<\", or -if it isn't ahead then the commits it is behind and \">\", or if it -isn't behind either, then a \"=\". - -This column may also display only \"*\" or \"@\" for the focused -branch, in which case this option is ignored. Use \"L v\" to -change the verbosity of this column." - :package-version '(magit . "2.12.0") - :group 'magit-refs - :type 'integer) - -(defcustom magit-refs-filter-alist nil - "Alist controlling which refs are omitted from `magit-refs-mode' buffers. - -The purpose of this option is to forgo displaying certain refs -based on their name. If you want to not display any refs of a -certain type, then you should remove the appropriate function -from `magit-refs-sections-hook' instead. - -All keys are tried in order until one matches. Then its value -is used and subsequent elements are ignored. If the value is -non-nil, then the reference is displayed, otherwise it is not. -If no element matches, then the reference is displayed. - -A key can either be a regular expression that the refname has to -match, or a function that takes the refname as only argument and -returns a boolean. A remote branch such as \"origin/master\" is -displayed as just \"master\", however for this comparison the -former is used." - :package-version '(magit . "2.12.0") - :group 'magit-refs - :type '(alist :key-type (choice :tag "Key" regexp function) - :value-type (boolean :tag "Value" - :on "show (non-nil)" - :off "omit (nil)"))) - -(defcustom magit-visit-ref-behavior nil - "Control how `magit-visit-ref' behaves in `magit-refs-mode' buffers. - -By default `magit-visit-ref' behaves like `magit-show-commit', -in all buffers, including `magit-refs-mode' buffers. When the -type of the section at point is `commit' then \"RET\" is bound to -`magit-show-commit', and when the type is either `branch' or -`tag' then it is bound to `magit-visit-ref'. - -\"RET\" is one of Magit's most essential keys and at least by -default it should behave consistently across all of Magit, -especially because users quickly learn that it does something -very harmless; it shows more information about the thing at point -in another buffer. - -However \"RET\" used to behave differently in `magit-refs-mode' -buffers, doing surprising things, some of which cannot really be -described as \"visit this thing\". If you have grown accustomed -to such inconsistent, but to you useful, behavior, then you can -restore that by adding one or more of the below symbols to the -value of this option. But keep in mind that by doing so you -don't only introduce inconsistencies, you also lose some -functionality and might have to resort to `M-x magit-show-commit' -to get it back. - -`magit-visit-ref' looks for these symbols in the order in which -they are described here. If the presence of a symbol applies to -the current situation, then the symbols that follow do not affect -the outcome. - -`focus-on-ref' - - With a prefix argument update the buffer to show commit counts - and lists of cherry commits relative to the reference at point - instead of relative to the current buffer or `HEAD'. - - Instead of adding this symbol, consider pressing \"C-u y o RET\". - -`create-branch' - - If point is on a remote branch, then create a new local branch - with the same name, use the remote branch as its upstream, and - then check out the local branch. - - Instead of adding this symbol, consider pressing \"b c RET RET\", - like you would do in other buffers. - -`checkout-any' - - Check out the reference at point. If that reference is a tag - or a remote branch, then this results in a detached `HEAD'. - - Instead of adding this symbol, consider pressing \"b b RET\", - like you would do in other buffers. - -`checkout-branch' - - Check out the local branch at point. - - Instead of adding this symbol, consider pressing \"b b RET\", - like you would do in other buffers." - :package-version '(magit . "2.9.0") - :group 'magit-refs - :group 'magit-commands - :options '(focus-on-ref create-branch checkout-any checkout-branch) - :type '(list :convert-widget custom-hook-convert-widget)) - -;;; Mode - -(defvar magit-refs-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-mode-map) - (define-key map "\C-y" 'magit-refs-set-show-commit-count) - (define-key map "L" 'magit-margin-settings) - map) - "Keymap for `magit-refs-mode'.") - -(define-derived-mode magit-refs-mode magit-mode "Magit Refs" - "Mode which lists and compares references. - -This mode is documented in info node `(magit)References Buffer'. - -\\\ -Type \\[magit-refresh] to refresh the current buffer. -Type \\[magit-section-toggle] to expand or hide the section at point. -Type \\[magit-visit-thing] or \\[magit-diff-show-or-scroll-up] \ -to visit the commit or branch at point. - -Type \\[magit-branch] to see available branch commands. -Type \\[magit-merge] to merge the branch or commit at point. -Type \\[magit-cherry-pick] to apply the commit at point. -Type \\[magit-reset] to reset `HEAD' to the commit at point. - -\\{magit-refs-mode-map}" - :group 'magit-refs - (hack-dir-local-variables-non-file-buffer) - (setq imenu-create-index-function - #'magit-imenu--refs-create-index-function)) - -(defun magit-refs-setup-buffer (ref args) - (magit-setup-buffer #'magit-refs-mode nil - (magit-buffer-upstream ref) - (magit-buffer-arguments args))) - -(defun magit-refs-refresh-buffer () - (setq magit-set-buffer-margin-refresh (not (magit-buffer-margin-p))) - (unless (magit-rev-verify magit-buffer-upstream) - (setq magit-refs-show-commit-count nil)) - (magit-set-header-line-format - (format "%s %s" magit-buffer-upstream - (mapconcat #'identity magit-buffer-arguments " "))) - (magit-insert-section (branchbuf) - (magit-run-section-hook 'magit-refs-sections-hook)) - (add-hook 'kill-buffer-hook 'magit-preserve-section-visibility-cache)) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-refs-mode)) - (cons magit-buffer-upstream magit-buffer-arguments)) - -;;; Commands - -;;;###autoload (autoload 'magit-show-refs "magit-refs" nil t) -(define-transient-command magit-show-refs (&optional transient) - "List and compare references in a dedicated buffer." - :man-page "git-branch" - :value (lambda () - (magit-show-refs-arguments magit-prefix-use-buffer-arguments)) - ["Arguments" - (magit-for-each-ref:--contains) - ("=m" "Merged" "--merged=" magit-transient-read-revision) - ("-m" "Merged to HEAD" "--merged") - ("-M" "Merged to master" "--merged=master") - ("=n" "Not merged" "--no-merged=" magit-transient-read-revision) - ("-n" "Not merged to HEAD" "--no-merged") - ("-N" "Not merged to master" "--no-merged=master") - (magit-for-each-ref:--sort)] - ["Actions" - ("y" "Show refs, comparing them with HEAD" magit-show-refs-head) - ("c" "Show refs, comparing them with current branch" magit-show-refs-current) - ("o" "Show refs, comparing them with other branch" magit-show-refs-other)] - (interactive (list (or (derived-mode-p 'magit-refs-mode) - current-prefix-arg))) - (if transient - (transient-setup 'magit-show-refs) - (magit-refs-setup-buffer "HEAD" (magit-show-refs-arguments)))) - -(defun magit-show-refs-arguments (&optional use-buffer-args) - (unless use-buffer-args - (setq use-buffer-args magit-direct-use-buffer-arguments)) - (let (args) - (cond - ((eq current-transient-command 'magit-show-refs) - (setq args (transient-args 'magit-show-refs))) - ((eq major-mode 'magit-refs-mode) - (setq args magit-buffer-arguments)) - ((and (memq use-buffer-args '(always selected)) - (when-let ((buffer (magit-get-mode-buffer - 'magit-refs-mode nil - (eq use-buffer-args 'selected)))) - (setq args (buffer-local-value 'magit-buffer-arguments buffer)) - t))) - (t - (setq args (alist-get 'magit-show-refs transient-values)))) - args)) - -(define-infix-argument magit-for-each-ref:--contains () - :description "Contains" - :class 'transient-option - :key "-c" - :argument "--contains=" - :reader 'magit-transient-read-revision) - -(define-infix-argument magit-for-each-ref:--sort () - :description "Sort" - :class 'transient-option - :key "-s" - :argument "--sort=" - :reader 'magit-read-ref-sort) - -(defun magit-read-ref-sort (prompt initial-input _history) - (magit-completing-read prompt - '("-committerdate" "-authordate" - "committerdate" "authordate") - nil nil initial-input)) - -;;;###autoload -(defun magit-show-refs-head (&optional args) - "List and compare references in a dedicated buffer. -Compared with `HEAD'." - (interactive (list (magit-show-refs-arguments))) - (magit-refs-setup-buffer "HEAD" args)) - -;;;###autoload -(defun magit-show-refs-current (&optional args) - "List and compare references in a dedicated buffer. -Compare with the current branch or `HEAD' if it is detached." - (interactive (list (magit-show-refs-arguments))) - (magit-refs-setup-buffer (magit-get-current-branch) args)) - -;;;###autoload -(defun magit-show-refs-other (&optional ref args) - "List and compare references in a dedicated buffer. -Compared with a branch read from the user." - (interactive (list (magit-read-other-branch "Compare with") - (magit-show-refs-arguments))) - (magit-refs-setup-buffer ref args)) - -(defun magit-refs-set-show-commit-count () - "Change for which refs the commit count is shown." - (interactive) - (setq-local magit-refs-show-commit-count - (magit-read-char-case "Show commit counts for " nil - (?a "[a]ll refs" 'all) - (?b "[b]ranches only" t) - (?n "[n]othing" nil))) - (magit-refresh)) - -(defun magit-visit-ref () - "Visit the reference or revision at point in another buffer. -If there is no revision at point or with a prefix argument prompt -for a revision. - -This command behaves just like `magit-show-commit', except if -point is on a reference in a `magit-refs-mode' buffer (a buffer -listing branches and tags), in which case the behavior may be -different, but only if you have customized the option -`magit-visit-ref-behavior' (which see)." - (interactive) - (if (and (derived-mode-p 'magit-refs-mode) - (magit-section-match '(branch tag))) - (let ((ref (oref (magit-current-section) value))) - (cond (current-prefix-arg - (cond ((memq 'focus-on-ref magit-visit-ref-behavior) - (magit-refs-setup-buffer ref (magit-show-refs-arguments))) - (magit-visit-ref-behavior - ;; Don't prompt for commit to visit. - (let ((current-prefix-arg nil)) - (call-interactively #'magit-show-commit))))) - ((and (memq 'create-branch magit-visit-ref-behavior) - (magit-section-match [branch remote])) - (let ((branch (cdr (magit-split-branch-name ref)))) - (if (magit-branch-p branch) - (if (magit-rev-eq branch ref) - (magit-call-git "checkout" branch) - (setq branch (propertize branch 'face 'magit-branch-local)) - (setq ref (propertize ref 'face 'magit-branch-remote)) - (pcase (prog1 (read-char-choice (format (propertize "\ -Branch %s already exists. - [c]heckout %s as-is - [r]reset %s to %s and checkout %s - [a]bort " 'face 'minibuffer-prompt) branch branch branch ref branch) - '(?c ?r ?a)) - (message "")) ; otherwise prompt sticks - (?c (magit-call-git "checkout" branch)) - (?r (magit-call-git "checkout" "-B" branch ref)) - (?a (user-error "Abort")))) - (magit-call-git "checkout" "-b" branch ref)) - (setq magit-buffer-upstream branch) - (magit-refresh))) - ((or (memq 'checkout-any magit-visit-ref-behavior) - (and (memq 'checkout-branch magit-visit-ref-behavior) - (magit-section-match [branch local]))) - (magit-call-git "checkout" ref) - (setq magit-buffer-upstream ref) - (magit-refresh)) - (t - (call-interactively #'magit-show-commit)))) - (call-interactively #'magit-show-commit))) - -;;; Sections - -(defvar magit-remote-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-delete-thing] 'magit-remote-remove) - (define-key map "R" 'magit-remote-rename) - map) - "Keymap for `remote' sections.") - -(defvar magit-branch-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-visit-ref) - (define-key map [remap magit-delete-thing] 'magit-branch-delete) - (define-key map "R" 'magit-branch-rename) - map) - "Keymap for `branch' sections.") - -(defvar magit-tag-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-visit-ref) - (define-key map [remap magit-delete-thing] 'magit-tag-delete) - map) - "Keymap for `tag' sections.") - -(defun magit-insert-branch-description () - "Insert header containing the description of the current branch. -Insert a header line with the name and description of the -current branch. The description is taken from the Git variable -`branch..description'; if that is undefined then no header -line is inserted at all." - (when-let ((branch (magit-get-current-branch)) - (desc (magit-get "branch" branch "description")) - (desc (split-string desc "\n"))) - (when (equal (car (last desc)) "") - (setq desc (butlast desc))) - (magit-insert-section (branchdesc branch t) - (magit-insert-heading branch ": " (car desc)) - (when (cdr desc) - (insert (mapconcat 'identity (cdr desc) "\n")) - (insert "\n\n"))))) - -(defun magit-insert-tags () - "Insert sections showing all tags." - (when-let ((tags (magit-git-lines "tag" "--list" "-n" magit-buffer-arguments))) - (let ((_head (magit-rev-parse "HEAD"))) - (magit-insert-section (tags) - (magit-insert-heading "Tags:") - (dolist (tag tags) - (string-match "^\\([^ \t]+\\)[ \t]+\\([^ \t\n].*\\)?" tag) - (let ((tag (match-string 1 tag)) - (msg (match-string 2 tag))) - (when (magit-refs--insert-refname-p tag) - (magit-insert-section (tag tag t) - (magit-insert-heading - (magit-refs--format-focus-column tag 'tag) - (propertize tag 'font-lock-face 'magit-tag) - (make-string (max 1 (- magit-refs-primary-column-width - (length tag))) - ?\s) - (and msg (magit-log-propertize-keywords nil msg))) - (when (and magit-refs-margin-for-tags (magit-buffer-margin-p)) - (magit-refs--format-margin tag)) - (magit-refs--insert-cherry-commits tag))))) - (insert ?\n) - (magit-make-margin-overlay nil t))))) - -(defun magit-insert-remote-branches () - "Insert sections showing all remote-tracking branches." - (dolist (remote (magit-list-remotes)) - (magit-insert-section (remote remote) - (magit-insert-heading - (let ((pull (magit-get "remote" remote "url")) - (push (magit-get "remote" remote "pushurl"))) - (format (propertize "Remote %s (%s):" - 'font-lock-face 'magit-section-heading) - (propertize remote 'font-lock-face 'magit-branch-remote) - (concat pull (and pull push ", ") push)))) - (let (head) - (dolist (line (magit-git-lines "for-each-ref" "--format=\ -%(symref:short)%00%(refname:short)%00%(refname)%00%(subject)" - (concat "refs/remotes/" remote) - magit-buffer-arguments)) - (pcase-let ((`(,head-branch ,branch ,ref ,msg) - (-replace "" nil (split-string line "\0")))) - (if head-branch - (progn (cl-assert (equal branch (concat remote "/HEAD"))) - (setq head head-branch)) - (when (magit-refs--insert-refname-p branch) - (magit-insert-section (branch branch t) - (let ((headp (equal branch head)) - (abbrev (if magit-refs-show-remote-prefix - branch - (substring branch (1+ (length remote)))))) - (magit-insert-heading - (magit-refs--format-focus-column branch) - (magit-refs--propertize-branch - abbrev ref (and headp 'magit-branch-remote-head)) - (make-string (max 1 (- magit-refs-primary-column-width - (length abbrev))) - ?\s) - (and msg (magit-log-propertize-keywords nil msg)))) - (when (magit-buffer-margin-p) - (magit-refs--format-margin branch)) - (magit-refs--insert-cherry-commits branch))))))) - (insert ?\n) - (magit-make-margin-overlay nil t)))) - -(defun magit-insert-local-branches () - "Insert sections showing all local branches." - (magit-insert-section (local nil) - (magit-insert-heading "Branches:") - (dolist (line (magit-refs--format-local-branches)) - (pcase-let ((`(,branch . ,strings) line)) - (magit-insert-section - ((eval (if branch 'branch 'commit)) - (or branch (magit-rev-parse "HEAD")) - t) - (apply #'magit-insert-heading strings) - (when (magit-buffer-margin-p) - (magit-refs--format-margin branch)) - (magit-refs--insert-cherry-commits branch)))) - (insert ?\n) - (magit-make-margin-overlay nil t))) - -(defun magit-refs--format-local-branches () - (let ((lines (-keep 'magit-refs--format-local-branch - (magit-git-lines - "for-each-ref" - (concat "--format=\ -%(HEAD)%00%(refname:short)%00%(refname)%00\ -%(upstream:short)%00%(upstream)%00%(upstream:track)%00" - (if magit-refs-show-push-remote "\ -%(push:remotename)%00%(push)%00%(push:track)%00%(subject)" - "%00%00%00%(subject)")) - "refs/heads" - magit-buffer-arguments)))) - (unless (magit-get-current-branch) - (push (magit-refs--format-local-branch - (concat "*\0\0\0\0\0\0\0\0" (magit-rev-format "%s"))) - lines)) - (setq-local magit-refs-primary-column-width - (let ((def (default-value 'magit-refs-primary-column-width))) - (if (atom def) - def - (pcase-let ((`(,min . ,max) def)) - (min max (apply #'max min (mapcar #'car lines))))))) - (mapcar (pcase-lambda (`(,_ ,branch ,focus ,branch-desc ,u:ahead ,p:ahead - ,u:behind ,upstream ,p:behind ,push ,msg)) - (list branch focus branch-desc u:ahead p:ahead - (make-string (max 1 (- magit-refs-primary-column-width - (length (concat branch-desc - u:ahead - p:ahead - u:behind)))) - ?\s) - u:behind upstream p:behind push - msg)) - lines))) - -(defun magit-refs--format-local-branch (line) - (pcase-let ((`(,head ,branch ,ref ,upstream ,u:ref ,u:track - ,push ,p:ref ,p:track ,msg) - (-replace "" nil (split-string line "\0")))) - (when (or (not branch) - (magit-refs--insert-refname-p branch)) - (let* ((headp (equal head "*")) - (pushp (and push - magit-refs-show-push-remote - (magit-rev-verify p:ref) - (not (equal p:ref u:ref)))) - (branch-desc - (if branch - (magit-refs--propertize-branch - branch ref (and headp 'magit-branch-current)) - (magit--propertize-face "(detached)" - 'font-lock-warning-face))) - (u:ahead (and u:track - (string-match "ahead \\([0-9]+\\)" u:track) - (magit--propertize-face - (concat (and magit-refs-pad-commit-counts " ") - (match-string 1 u:track) - ">") - 'magit-dimmed))) - (u:behind (and u:track - (string-match "behind \\([0-9]+\\)" u:track) - (magit--propertize-face - (concat "<" - (match-string 1 u:track) - (and magit-refs-pad-commit-counts " ")) - 'magit-dimmed))) - (p:ahead (and pushp p:track - (string-match "ahead \\([0-9]+\\)" p:track) - (magit--propertize-face - (concat (match-string 1 p:track) - ">" - (and magit-refs-pad-commit-counts " ")) - 'magit-branch-remote))) - (p:behind (and pushp p:track - (string-match "behind \\([0-9]+\\)" p:track) - (magit--propertize-face - (concat "<" - (match-string 1 p:track) - (and magit-refs-pad-commit-counts " ")) - 'magit-dimmed)))) - (list (1+ (length (concat branch-desc u:ahead p:ahead u:behind))) - branch - (magit-refs--format-focus-column branch headp) - branch-desc u:ahead p:ahead u:behind - (and upstream - (concat (if (equal u:track "[gone]") - (magit--propertize-face upstream 'error) - (magit-refs--propertize-branch upstream u:ref)) - " ")) - (and pushp - (concat p:behind - (magit--propertize-face - push 'magit-branch-remote) - " ")) - (and msg (magit-log-propertize-keywords nil msg))))))) - -(defun magit-refs--format-focus-column (ref &optional type) - (let ((focus magit-buffer-upstream) - (width (if magit-refs-show-commit-count - magit-refs-focus-column-width - 1))) - (format - (format "%%%ss " width) - (cond ((or (equal ref focus) - (and (eq type t) - (equal focus "HEAD"))) - (magit--propertize-face (concat (if (equal focus "HEAD") "@" "*") - (make-string (1- width) ?\s)) - 'magit-section-heading)) - ((if (eq type 'tag) - (eq magit-refs-show-commit-count 'all) - magit-refs-show-commit-count) - (pcase-let ((`(,behind ,ahead) - (magit-rev-diff-count magit-buffer-upstream ref))) - (magit--propertize-face - (cond ((> ahead 0) (concat "<" (number-to-string ahead))) - ((> behind 0) (concat (number-to-string behind) ">")) - (t "=")) - 'magit-dimmed))) - (t ""))))) - -(defun magit-refs--propertize-branch (branch ref &optional head-face) - (let ((face (cdr (cl-find-if (pcase-lambda (`(,re . ,_)) - (string-match-p re ref)) - magit-ref-namespaces)))) - (magit--propertize-face - branch (if head-face (list face head-face) face)))) - -(defun magit-refs--insert-refname-p (refname) - (--if-let (-first (pcase-lambda (`(,key . ,_)) - (if (functionp key) - (funcall key refname) - (string-match-p key refname))) - magit-refs-filter-alist) - (cdr it) - t)) - -(defun magit-refs--insert-cherry-commits (ref) - (magit-insert-section-body - (let ((start (point)) - (magit-insert-section--current nil)) - (magit-git-wash (apply-partially 'magit-log-wash-log 'cherry) - "cherry" "-v" (magit-abbrev-arg) magit-buffer-upstream ref) - (if (= (point) start) - (message "No cherries for %s" ref) - (magit-make-margin-overlay nil t))))) - -(defun magit-refs--format-margin (commit) - (save-excursion - (goto-char (line-beginning-position 0)) - (let ((line (magit-rev-format "%ct%cN" commit))) - (magit-log-format-margin commit - (substring line 10) - (substring line 0 10))))) - -;;; _ -(provide 'magit-refs) -;;; magit-refs.el ends here diff --git a/elpa/magit-20200418.939/magit-refs.elc b/elpa/magit-20200418.939/magit-refs.elc deleted file mode 100644 index dbea0e4de2a19a9a345add68db0f0749c3781d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40348 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

~K((BO zzEE!K3KLj^Qy9_?VA>t8(W2LFT2psG29JrI0NkbX$$dORv>4&Y_rXDeAxpOtkmNd8 zl*joM4#stpb>#?>@%J3s&}T%vNtUHy)La7>svCw|*ysNdoECTr7%{BC-M{3x)6urg1%hCIJa~(RU7bvbk2Os8B>pP)G?s=geS?3CL z5n?0uAtBMx+=RX=mq0b2>O-&S%trk@!--Q*t>z$uEt6=(^~+u|O3K+12bxjwe+Att zNxd{{cjxgQ$yiiSDPw5?`g%v;>{I+KOcCYb_g@}}r?{<3OPrV~qto@uPYV>E`P|NT z4+lv3kQ(qI+s5Jg9F-5;GO-9$qLR!;vR#T{f}2+4?x^Yxv+UfaYcr~y74|eOlaXCa z<5(5N^0Mg0Xi+9KlPFb}glFhBB3zk>F@V7E#~sW{H|nr4*cU|>*Ec&8x~Gd3mZFnF zGsU1gL~c)~1M5eV85IXq=9nN6tqTA!4iih)ei~PrSK*|#*v(i7hmJ$(3WAs;_sBN{ zNLk>5C{pry&Z8*7{l4iZbqoUP4;l}RTR~k%-(lt11PNO5ivm!nO^&ko+#W=6B`8yW zL^Bd-jeM>y?5Nknk7*dv!PnaF0lF4ykS>)p(r!xS{=?%h9clx)_PMZ$coLeV(5LD zo_Lsy`Y6IfyO8~sMl)^QOO+=wW1)2yih@e*Tv>2h;rfLzX*^#C;~CkdRRt(f=d5O=qt1cHy5}cCd6jAB8gJm{*fw|)L(T7+)J*sESap$ sCs1Q(yjz%@fwFQdafF+>1p~rmt6v=w{4k_L`abwwkVUQB<+gVI2PFJ3hyVZp diff --git a/elpa/magit-20200418.939/magit.el b/elpa/magit-20200418.939/magit.el deleted file mode 100644 index a2602e7c..00000000 --- a/elpa/magit-20200418.939/magit.el +++ /dev/null @@ -1,596 +0,0 @@ -;;; magit.el --- A Git porcelain inside Emacs -*- lexical-binding: t; coding: utf-8 -*- - -;; Copyright (C) 2008-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Marius Vollmer -;; Maintainer: Jonas Bernoulli -;; Kyle Meyer -;; Noam Postavsky -;; Former-Maintainers: -;; Nicolas Dudebout -;; Peter J. Weisberg -;; Phil Jackson -;; Rémi Vanicat -;; Yann Hodique - -;; Keywords: git tools vc -;; Homepage: https://github.com/magit/magit - -;; Magit requires at least GNU Emacs 25.1 and Git 2.2.0. - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; Magit is an interface to the version control system Git, -;; implemented as an Emacs package. Magit aspires to be a complete -;; Git porcelain. While we cannot (yet) claim, that Magit wraps and -;; improves upon each and every Git command, it is complete enough to -;; allow even experienced Git users to perform almost all of their -;; daily version control tasks directly from within Emacs. While many -;; fine Git clients exist, only Magit and Git itself deserve to be -;; called porcelains. - -;;; Code: - -(require 'cl-lib) -(require 'dash) - -(require 'subr-x) - -(require 'with-editor) -(require 'git-commit) -(require 'magit-core) -(require 'magit-diff) -(require 'magit-log) -(require 'magit-wip) -(require 'magit-apply) -(require 'magit-repos) - -(require 'format-spec) -(require 'package nil t) ; used in `magit-version' - -(defconst magit--minimal-git "2.2.0") -(defconst magit--minimal-emacs "25.1") - -;;; Faces - -(defface magit-header-line - '((t :inherit magit-section-heading)) - "Face for the `header-line' in some Magit modes. -Note that some modes, such as `magit-log-select-mode', have their -own faces for the `header-line', or for parts of the -`header-line'." - :group 'magit-faces) - -(defface magit-header-line-key - '((t :inherit font-lock-builtin-face)) - "Face for keys in the `header-line'." - :group 'magit-faces) - -(defface magit-dimmed - '((((class color) (background light)) :foreground "grey50") - (((class color) (background dark)) :foreground "grey50")) - "Face for text that shouldn't stand out." - :group 'magit-faces) - -(defface magit-hash - '((((class color) (background light)) :foreground "grey60") - (((class color) (background dark)) :foreground "grey40")) - "Face for the sha1 part of the log output." - :group 'magit-faces) - -(defface magit-tag - '((((class color) (background light)) :foreground "Goldenrod4") - (((class color) (background dark)) :foreground "LightGoldenrod2")) - "Face for tag labels shown in log buffer." - :group 'magit-faces) - -(defface magit-branch-remote - '((((class color) (background light)) :foreground "DarkOliveGreen4") - (((class color) (background dark)) :foreground "DarkSeaGreen2")) - "Face for remote branch head labels shown in log buffer." - :group 'magit-faces) - -(defface magit-branch-remote-head - '((((class color) (background light)) :inherit magit-branch-remote :box t) - (((class color) (background dark)) :inherit magit-branch-remote :box t)) - "Face for current branch." - :group 'magit-faces) - -(defface magit-branch-local - '((((class color) (background light)) :foreground "SkyBlue4") - (((class color) (background dark)) :foreground "LightSkyBlue1")) - "Face for local branches." - :group 'magit-faces) - -(defface magit-branch-current - '((((class color) (background light)) :inherit magit-branch-local :box t) - (((class color) (background dark)) :inherit magit-branch-local :box t)) - "Face for current branch." - :group 'magit-faces) - -(defface magit-branch-upstream - '((t :slant italic)) - "Face for upstream branch. -This face is only used in logs and it gets combined - with `magit-branch-local', `magit-branch-remote' -and/or `magit-branch-remote-head'." - :group 'magit-faces) - -(defface magit-head - '((((class color) (background light)) :inherit magit-branch-local) - (((class color) (background dark)) :inherit magit-branch-local)) - "Face for the symbolic ref `HEAD'." - :group 'magit-faces) - -(defface magit-refname - '((((class color) (background light)) :foreground "grey30") - (((class color) (background dark)) :foreground "grey80")) - "Face for refnames without a dedicated face." - :group 'magit-faces) - -(defface magit-refname-stash - '((t :inherit magit-refname)) - "Face for stash refnames." - :group 'magit-faces) - -(defface magit-refname-wip - '((t :inherit magit-refname)) - "Face for wip refnames." - :group 'magit-faces) - -(defface magit-refname-pullreq - '((t :inherit magit-refname)) - "Face for pullreq refnames." - :group 'magit-faces) - -(defface magit-keyword - '((t :inherit font-lock-string-face)) - "Face for parts of commit messages inside brackets." - :group 'magit-faces) - -(defface magit-keyword-squash - '((t :inherit font-lock-warning-face)) - "Face for squash! and fixup! keywords in commit messages." - :group 'magit-faces) - -(defface magit-signature-good - '((t :foreground "green")) - "Face for good signatures." - :group 'magit-faces) - -(defface magit-signature-bad - '((t :foreground "red" :weight bold)) - "Face for bad signatures." - :group 'magit-faces) - -(defface magit-signature-untrusted - '((t :foreground "cyan")) - "Face for good untrusted signatures." - :group 'magit-faces) - -(defface magit-signature-expired - '((t :foreground "orange")) - "Face for signatures that have expired." - :group 'magit-faces) - -(defface magit-signature-expired-key - '((t :inherit magit-signature-expired)) - "Face for signatures made by an expired key." - :group 'magit-faces) - -(defface magit-signature-revoked - '((t :foreground "violet red")) - "Face for signatures made by a revoked key." - :group 'magit-faces) - -(defface magit-signature-error - '((t :foreground "firebrick3")) - "Face for signatures that cannot be checked (e.g. missing key)." - :group 'magit-faces) - -(defface magit-cherry-unmatched - '((t :foreground "cyan")) - "Face for unmatched cherry commits." - :group 'magit-faces) - -(defface magit-cherry-equivalent - '((t :foreground "magenta")) - "Face for equivalent cherry commits." - :group 'magit-faces) - -(defface magit-filename - '((t :weight normal)) - "Face for filenames." - :group 'magit-faces) - -;;; Dispatch Popup - -;;;###autoload (autoload 'magit-dispatch "magit" nil t) -(define-transient-command magit-dispatch () - "Invoke a Magit command from a list of available commands." - ["Transient and dwim commands" - [("A" "Apply" magit-cherry-pick) - ("b" "Branch" magit-branch) - ("B" "Bisect" magit-bisect) - ("c" "Commit" magit-commit) - ("C" "Clone" magit-clone) - ("d" "Diff" magit-diff) - ("D" "Diff (change)" magit-diff-refresh) - ("e" "Ediff (dwim)" magit-ediff-dwim) - ("E" "Ediff" magit-ediff)] - [("f" "Fetch" magit-fetch) - ("F" "Pull" magit-pull) - ("l" "Log" magit-log) - ("L" "Log (change)" magit-log-refresh) - ("m" "Merge" magit-merge) - ("M" "Remote" magit-remote) - ("o" "Submodule" magit-submodule) - ("O" "Subtree" magit-subtree)] - [("P" "Push" magit-push) - ("r" "Rebase" magit-rebase) - ("t" "Tag" magit-tag) - ("T" "Note" magit-notes) - ("V" "Revert" magit-revert) - ("w" "Apply patches" magit-am) - ("W" "Format patches" magit-patch) - ("X" "Reset" magit-reset)] - [("y" "Show Refs" magit-show-refs) - ("Y" "Cherries" magit-cherry) - ("z" "Stash" magit-stash) - ("!" "Run" magit-run) - ("%" "Worktree" magit-worktree)]] - ["Applying changes" - :if-derived magit-mode - [("a" "Apply" magit-apply) - ("v" "Reverse" magit-reverse) - ("k" "Discard" magit-discard)] - [("s" "Stage" magit-stage) - ("u" "Unstage" magit-unstage)] - [("S" "Stage all" magit-stage-modified) - ("U" "Unstage all" magit-unstage-all)]] - ["Essential commands" - :if-derived magit-mode - ("g" " refresh current buffer" magit-refresh) - ("" " toggle section at point" magit-section-toggle) - ("" "visit thing at point" magit-visit-thing) - ("C-h m" " show all key bindings" describe-mode)]) - -;;; Git Popup - -(defcustom magit-shell-command-verbose-prompt t - "Whether to show the working directory when reading a command. -This affects `magit-git-command', `magit-git-command-topdir', -`magit-shell-command', and `magit-shell-command-topdir'." - :package-version '(magit . "2.11.0") - :group 'magit-commands - :type 'boolean) - -(defvar magit-git-command-history nil) - -;;;###autoload (autoload 'magit-run "magit" nil t) -(define-transient-command magit-run () - "Run git or another command, or launch a graphical utility." - [["Run git subcommand" - ("!" "in repository root" magit-git-command-topdir) - ("p" "in working directory" magit-git-command)] - ["Run shell command" - ("s" "in repository root" magit-shell-command-topdir) - ("S" "in working directory" magit-shell-command)] - ["Launch" - ("k" "gitk" magit-run-gitk) - ("a" "gitk --all" magit-run-gitk-all) - ("b" "gitk --branches" magit-run-gitk-branches) - ("g" "git gui" magit-run-git-gui)]]) - -;;;###autoload -(defun magit-git-command (command) - "Execute COMMAND asynchronously; display output. - -Interactively, prompt for COMMAND in the minibuffer. \"git \" is -used as initial input, but can be deleted to run another command. - -With a prefix argument COMMAND is run in the top-level directory -of the current working tree, otherwise in `default-directory'." - (interactive (list (magit-read-shell-command nil "git "))) - (magit--shell-command command)) - -;;;###autoload -(defun magit-git-command-topdir (command) - "Execute COMMAND asynchronously; display output. - -Interactively, prompt for COMMAND in the minibuffer. \"git \" is -used as initial input, but can be deleted to run another command. - -COMMAND is run in the top-level directory of the current -working tree." - (interactive (list (magit-read-shell-command t "git "))) - (magit--shell-command command (magit-toplevel))) - -;;;###autoload -(defun magit-shell-command (command) - "Execute COMMAND asynchronously; display output. - -Interactively, prompt for COMMAND in the minibuffer. With a -prefix argument COMMAND is run in the top-level directory of -the current working tree, otherwise in `default-directory'." - (interactive (list (magit-read-shell-command))) - (magit--shell-command command)) - -;;;###autoload -(defun magit-shell-command-topdir (command) - "Execute COMMAND asynchronously; display output. - -Interactively, prompt for COMMAND in the minibuffer. COMMAND -is run in the top-level directory of the current working tree." - (interactive (list (magit-read-shell-command t))) - (magit--shell-command command (magit-toplevel))) - -(defun magit--shell-command (command &optional directory) - (let ((default-directory (or directory default-directory)) - (process-environment process-environment)) - (push "GIT_PAGER=cat" process-environment) - (magit-start-process shell-file-name nil - shell-command-switch command)) - (magit-process-buffer)) - -(defun magit-read-shell-command (&optional toplevel initial-input) - (let ((dir (abbreviate-file-name - (if (or toplevel current-prefix-arg) - (or (magit-toplevel) - (magit--not-inside-repository-error)) - default-directory)))) - (read-shell-command (if magit-shell-command-verbose-prompt - (format "Async shell command in %s: " dir) - "Async shell command: ") - initial-input 'magit-git-command-history))) - -;;; Font-Lock Keywords - -(defconst magit-font-lock-keywords - (eval-when-compile - `((,(concat "(\\(magit-define-section-jumper\\)\\_>" - "[ \t'\(]*" - "\\(\\(?:\\sw\\|\\s_\\)+\\)?") - (1 'font-lock-keyword-face) - (2 'font-lock-function-name-face nil t)) - (,(concat "(" (regexp-opt '("magit-insert-section" - "magit-section-case" - "magit-bind-match-strings" - "magit-with-temp-index" - "magit-with-blob" - "magit-with-toplevel") t) - "\\_>") - . 1)))) - -(font-lock-add-keywords 'emacs-lisp-mode magit-font-lock-keywords) - -;;; Version - -(defvar magit-version 'undefined - "The version of Magit that you're using. -Use the function by the same name instead of this variable.") - -;;;###autoload -(defun magit-version (&optional print-dest) - "Return the version of Magit currently in use. -If optional argument PRINT-DEST is non-nil, output -stream (interactively, the echo area, or the current buffer with -a prefix argument), also print the used versions of Magit, Git, -and Emacs to it." - (interactive (list (if current-prefix-arg (current-buffer) t))) - (let ((magit-git-global-arguments nil) - (toplib (or load-file-name buffer-file-name)) - debug) - (unless (and toplib - (equal (file-name-nondirectory toplib) "magit.el")) - (setq toplib (locate-library "magit.el"))) - (setq toplib (and toplib (file-chase-links toplib))) - (push toplib debug) - (when toplib - (let* ((topdir (file-name-directory toplib)) - (gitdir (expand-file-name - ".git" (file-name-directory - (directory-file-name topdir)))) - (static (locate-library "magit-version.el" nil (list topdir))) - (static (and static (file-chase-links static)))) - (or (progn - (push 'repo debug) - (when (and (file-exists-p gitdir) - ;; It is a repo, but is it the Magit repo? - (file-exists-p - (expand-file-name "../lisp/magit.el" gitdir))) - (push t debug) - ;; Inside the repo the version file should only exist - ;; while running make. - (when (and static (not noninteractive)) - (ignore-errors (delete-file static))) - (setq magit-version - (let ((default-directory topdir)) - (magit-git-string "describe" "--tags" "--dirty"))))) - (progn - (push 'static debug) - (when (and static (file-exists-p static)) - (push t debug) - (load-file static) - magit-version)) - (when (featurep 'package) - (push 'elpa debug) - (ignore-errors - (--when-let (assq 'magit package-alist) - (push t debug) - (setq magit-version - (and (fboundp 'package-desc-version) - (package-version-join - (package-desc-version (cadr it)))))))) - (progn - (push 'dirname debug) - (let ((dirname (file-name-nondirectory - (directory-file-name topdir)))) - (when (string-match "\\`magit-\\([0-9]\\{8\\}\\.[0-9]*\\)" - dirname) - (setq magit-version (match-string 1 dirname)))))))) - (if (stringp magit-version) - (when print-dest - (princ (format "Magit %s, Git %s, Emacs %s, %s" - (or magit-version "(unknown)") - (or (let ((magit-git-debug - (lambda (err) - (display-warning '(magit git) - err :error)))) - (magit-git-version t)) - "(unknown)") - emacs-version - system-type) - print-dest)) - (setq debug (reverse debug)) - (setq magit-version 'error) - (when magit-version - (push magit-version debug)) - (unless (equal (getenv "TRAVIS") "true") - ;; The repository is a sparse clone. - (message "Cannot determine Magit's version %S" debug))) - magit-version)) - -;;; Debugging Tools - -(defun magit-debug-git-executable () - "Display a buffer with information about `magit-git-executable'. -See info node `(magit)Debugging Tools' for more information." - (interactive) - (with-current-buffer (get-buffer-create "*magit-git-debug*") - (pop-to-buffer (current-buffer)) - (erase-buffer) - (insert (concat - (format "magit-git-executable: %S" magit-git-executable) - (and (not (file-name-absolute-p magit-git-executable)) - (format " [%S]" (executable-find magit-git-executable))) - (format " (%s)\n" - (let* ((errmsg nil) - (magit-git-debug (lambda (err) (setq errmsg err)))) - (or (magit-git-version t) errmsg))))) - (insert (format "exec-path: %S\n" exec-path)) - (--when-let (cl-set-difference - (-filter #'file-exists-p (remq nil (parse-colon-path - (getenv "PATH")))) - (-filter #'file-exists-p (remq nil exec-path)) - :test #'file-equal-p) - (insert (format " entries in PATH, but not in exec-path: %S\n" it))) - (dolist (execdir exec-path) - (insert (format " %s (%s)\n" execdir (car (file-attributes execdir)))) - (when (file-directory-p execdir) - (dolist (exec (directory-files - execdir t (concat - "\\`git" (regexp-opt exec-suffixes) "\\'"))) - (insert (format " %s (%s)\n" exec - (let* ((magit-git-executable exec) - (errmsg nil) - (magit-git-debug (lambda (err) (setq errmsg err)))) - (or (magit-git-version t) errmsg))))))))) - -;;; Startup Asserts - -(defun magit-startup-asserts () - (when-let ((val (getenv "GIT_DIR"))) - (setenv "GIT_DIR") - (message "Magit unset $GIT_DIR (was %S). See \ -https://github.com/magit/magit/wiki/Don't-set-$GIT_DIR-and-alike" val)) - (when-let ((val (getenv "GIT_WORK_TREE"))) - (setenv "GIT_WORK_TREE") - (message "Magit unset $GIT_WORK_TREE (was %S). See \ -https://github.com/magit/magit/wiki/Don't-set-$GIT_DIR-and-alike" val)) - (let ((version (magit-git-version))) - (when (and version - (version< version magit--minimal-git) - (not (equal (getenv "TRAVIS") "true"))) - (display-warning 'magit (format "\ -Magit requires Git >= %s, you are using %s. - -If this comes as a surprise to you, because you do actually have -a newer version installed, then that probably means that the -older version happens to appear earlier on the `$PATH'. If you -always start Emacs from a shell, then that can be fixed in the -shell's init file. If you start Emacs by clicking on an icon, -or using some sort of application launcher, then you probably -have to adjust the environment as seen by graphical interface. -For X11 something like ~/.xinitrc should work. - -If you use Tramp to work inside remote Git repositories, then you -have to make sure a suitable Git is used on the remote machines -too.\n" magit--minimal-git version) :error))) - (when (version< emacs-version magit--minimal-emacs) - (display-warning 'magit (format "\ -Magit requires Emacs >= %s, you are using %s. - -If this comes as a surprise to you, because you do actually have -a newer version installed, then that probably means that the -older version happens to appear earlier on the `$PATH'. If you -always start Emacs from a shell, then that can be fixed in the -shell's init file. If you start Emacs by clicking on an icon, -or using some sort of application launcher, then you probably -have to adjust the environment as seen by graphical interface. -For X11 something like ~/.xinitrc should work.\n" - magit--minimal-emacs emacs-version) - :error))) - -;;; Loading Libraries - -(provide 'magit) - -(cl-eval-when (load eval) - (require 'magit-status) - (require 'magit-refs) - (require 'magit-files) - (require 'magit-reset) - (require 'magit-branch) - (require 'magit-merge) - (require 'magit-tag) - (require 'magit-worktree) - (require 'magit-notes) - (require 'magit-sequence) - (require 'magit-commit) - (require 'magit-remote) - (require 'magit-clone) - (require 'magit-fetch) - (require 'magit-pull) - (require 'magit-push) - (require 'magit-bisect) - (require 'magit-stash) - (require 'magit-blame) - (require 'magit-obsolete) - (require 'magit-submodule) - (unless (load "magit-autoloads" t t) - (require 'magit-patch) - (require 'magit-subtree) - (require 'magit-ediff) - (require 'magit-gitignore) - (require 'magit-extras) - (require 'git-rebase) - (require 'magit-imenu) - (require 'magit-bookmark))) - -(eval-after-load 'bookmark - '(require 'magit-bookmark)) - -(if after-init-time - (progn (magit-startup-asserts) - (magit-version)) - (add-hook 'after-init-hook #'magit-startup-asserts t) - (add-hook 'after-init-hook #'magit-version t)) - -;;; magit.el ends here diff --git a/elpa/magit-20200418.939/magit.elc b/elpa/magit-20200418.939/magit.elc deleted file mode 100644 index 00b65b40d7df8ec1c25868d8336daf50d229d187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20441 zcmeHP33J;CW#0H z7yy*4+2gnG_g;777VXHX+1jdcSrX94>({Tl-_`Ho(f*U&f4X+<+RCFxkHl^`n|r<- z@rxIT{h2$A#hHv^FARj!+iY{qxtC0Z>-!>{C*I8ai<_W2-dy3zE&OxaxZo(|B@fa&W~f~ z$FcL{*xi2H?%`+aZr^EbHN?wE{X(`Z<#G5F0LxW^Q7|b2$`qcX;YfqzF7; zBqyS?vCt33hI0Z0cBDwPgEIsoa=c;zu2ESLkN96+d4 zwgIvYkZqbyxn~<7+bFE>39xN|ZP$VA0Bi?fJ9S_?0NVlB4j@#<>;Pm3AiH(s>jGpK zAiH(s>jGpKAiJ~x<*9T5vImg8I`Z`ZvImeo>Q(O91IQjg_Uh)j1&~_+xm7pMEr8qt zxUIT*ZUN-h7EX};#kK0FDBih7m0$Aj-TEebT)EG`zp8KYm@B{L-v{+g{(~$3$iJV| zH+jmH&-nNA`X(>9@*Dnrm~X-?Vz`KtaAu9<(03zgjoqO+`BMpw9f5HKQZ$>1*!F^{ zj8YyE%OMFHi<&{0Y;1_eSJWBjAG}I$4I$KG@k+4>upKLwK8CZX!TLQhbjX&BN=(CrKML0Il#mDy7fFiilmy7tFzsCx(+)ZoFvZ@Ar>@N_suvX6#e@)@ z=WtEj$rVt29Qq>}MB%7&1;Rd|WlAA9CA@);?+&CN6N#~Fu`3Ae!D2j?QA*-LW7<^?m?A z_aQ>+YI!@ar*!8d@vhWOgdnGgHY3NGZt8F4H!Y`Ce5vQXR(_b25%$evtwad$3`#uZO2N z4e9*#I9B}AqC(7UxN|oOpy5@=Q{7hippCuPi}|Y15LxFbVUdm+dy~LT7SJ{)VW=mW z=akr3GAOb+ZkYDVCXg0c1IQvKR~}L%N6_ugCCO!hBQPp#3hI&qsDrr(k_hTCYiC%9 zJmlepTZdxSV<}+ydJeO^2H_CWe&mbuUjkRA5p@ycqrmC$fbu)!#>4pW8q_r_v zH0_uREUqxw|K)IFnq5OCXbjPjhhWQN7m#a>Dq9r8Vt<(~0OQ9}8qG z?5uTTh{SW6vAFxPRd9E)otR)}#vTxaEtaIF(#TVNPK3iw9yoeVmiuMkno8Ygsl{I| zBtHR+dTwa<8>MRHs?mkyugSY-?5({$_(fp-lRqZ!eo@|*Kitv2G1v-P4Kb4dn}qig zE=*|87ONA97%u{4=E7^bn9=%>(JLAU0c}@Esi$nv(sGl!F^<9+3Vja_F4&sxnd?F4 zhX+*EE%)^dhm;kxvHcp3V?0}IL#@Hdx9|{esY7^;wKF68F?pp$H zP=@yhGAIqp_q`C%Zdpr~{? zBobo<>hHlVTLDDA+U0Qe>fnebT=x(=8?^voijE^0PnQFxSrri6XUB1q_Ffe(G`sQG z;<}{-+^>aNL6gC4Y;2r}tL$u|V*&NAB)DK@kTI1mC&E`{NH3rdRsfOKw;T@jDPZ&@ zoK(QT#90pINez_Cmm1*SZlz~suuo+Km8HxGW>mTy!KYwC^Dd#$#^-S@5+DV`5YrNPkdL@+IfMP7G%LFMxT5anmT|Aw-CWY>mQ&%Z z42ch7Et8=O{x@)$(=xO@FCMxPDLX|L0S%qXue{lbpvBD&-c{v9*i3JdS&K5HZ*iAh z2Wz3quZ;3hc_8e6+@vGcqe2}kJe&iC$e4pC zoUUwXVaz#GlpaXFV&%mKfeSaoXKv)NDXZ8~Je9uBQ6sQ>Egbei7)uzmh+9%tGespC z>pACAP=P532C+{>bYBDIX zNg*t@O))IRD`j&O#CCEqhg&U#XUq*igqCu|fVi5?=TSxc783wol^TByL{^TjDl%z_ zs|L;gZ@e^&Q|4_Uw10-9JXb>$RCXqXz;=aH~T$<;5 z33)1W-jiR<(?X$4wGNb$3&!9LYeVD97s{7ASSo4??uR*|ibAw5L==Wq{*&J9O!MPe^fKdo2OqG=WPk_ zg!kneW?j*LKxrz|8%A>k92km@dxJl%qT^8)VUg^<6rvLB%hZL6mrg@fUb!08-XLq4 z7RxteMaTobm@K@@P_|IV(up){II-`30T-{>e=Ua#L`&>GfBJOi*&bqtF2EF`FbEg1 zfAI*SB%Z^4Y9d5dRt_>puYYk*7^wvwV?bd4kuaj@L>-_Z8iZQ|SIsMY%M8akDp}F- z05cb|t^0KWo9XqEc8lT&UQh-zbp1L~^yH*lWDi5UraoX1Dup zi-}{yXD3_APVcX@ltLY}l`9`KtjY>;0%LCESLK&DXoVA0ShBY~Y6wN`R*#x^(+Pv_ zsg9NX;Nf3uE%Z@XL9`BW#ml){=_sT+3URkLAB6%*f9b>EbZomyZaQA8Zz4H`z&ncQ z?Vc#GVDSe^;0Ob#uX_iF`@6@_5C2@pmP<$W?#r&-24{9~CF-<#x31m3^V@%>nB_ZP z{yqM5`vHFUKDhM}UAlgZ=PjW*Kt(2y5JVJhY{}rvgXpBYP8elm_Gy`>|F5|GmMg|Ct}NR8E5N(X7n9f6DK3e z@$(l?_P^VIA`YG%93SjFu@0WS`1ZJtLN&64sN}HxYTv;0J9n<##-H{-ax63vr1xuj z?9!w2>uYybiD)1l+N@Fq-$dVJ=IQhsD6#FE_~qaRnq{G84f;0Mf-pzyQc2_*sw}gb z-N673Y!4w%Ig%H-vIb+p60%fK4;-_|x?mf@Qc)5$6hPz(f*Ej$ONxbQn|t)rw~}$F3l|-2=;(>b~(Kx3nGHw0jzU`XoF_6(d_q?#S95)!h#VC`kB4 z&gNLEk$jC3En9hhn4l_kvLTc+L(Qy(U>}(~|Tg z8j+rqMMdC@QU==(TP;iu8r+tR8wT=%@gSy0il9D7h~vbjgp$3v zaxmu1HfD^elKkTE;MuXYw|{g@ai5fc2BRFZnB%`!Oe|^6$3Qwh%}NfZp+J^{%dP_| zF;ZP|BMv@Xam!ly27E$3GTG+X3FN8ce7cdLFDDf+f$xdOUUF}R{6{KX58A(%XnB?K zvJCw?{$+?lN_UT$R*$$<@BM3ch%Mdt-F4zizhS;~1DpymG7eINz}9}poQX=HIrN+x z)UZno%y!U_ORj%Of3GtL{6?}9gFq$>XE#wOP4B(cRj@knIQ&pzP4B&3Fgg}6U8J=D z8jJu0*xX`RwoBx7JL$FkWX?^&J01^^ti#(!sm&R(p|31^@eKeuA zl)1;X+^Kzi=L-~euCIRh$!BU%hq_U|l}fL=xkqw_rcMjcZGFuPMp)8Zv35)p>Y*q^ zk}4xX*G^GosnxrM#ngFOH&}pC;u8@?rDUNDP-(PY@4a7PLalc5`c3+?gWW;tS}Hq> z2-N!r6j72^&-wkQ_zg%-dljqD>isL%eE8XipRZxf6~LB5AbOZ8qm9QdPeN}&yaRd< z`HyX6YUv$JJygyXBa4M0@RZ0%*`qn3sE%u{Ad^uO@Lr@78fL-#A;$_XmCWYck$*2$ zcpzutDK~!T29L5S;ZUJCYlvwiRYoqHbKC)UckqBCUFuY2-6}zobw?B>xyn=EqOl2~ z+Q@ABe3hDzMv8|dIj;tiui+PttvLW}-Y1!GKSK-wVyp#hV4~!LV3;`(uEd#W7=J&+ zzGdNN2@W_s0NDf=!_eIlM2n|H7h}osx^vuWtAtMJ&)sw+9$kzFl&X|Afn<+|seioW zFSmZgb&4QYxCQ3VL8rbrht@f#1Qx?J(PvAlF;Ch{a1=ykhd>e*29y2 z|34q}`~ThVZ}KZN2!tTz#koNC5SaN;C##CaQx=eG$cP3Dhdy*qb8vcEBib|f#xV@aI@NUuARpG58G>hP|(ph%vS-$uhI+-Pan+L&( z$Oy((SRkj)l=FJgPROA%l7q!WDCNT(koW=$!Hm}lHe}BT`A)0bDcVJ>WZ%9v#}Rh! zfaSDoV<6Qi%yc27?NO&Ea1YE5J6C5%shkZjP1}DA@?p zg1~^B{fXHg*zug0HKoXstwj&~W8Y?>>fB!a9Q5e^9`xXH61kn*O5##m2m-sei(e3Q z#UR#OV3o)shGLFh}%3M z2|4@#TBikx(V$UEEzq4xl~5yllEhwnr03CrWu?K>oMAg@vFL2Ept8TflrXRu2>QDb5@|+dz#h6=aJP4V-ag zky0w4HH3x=Z+7G33?T2ok8z0M2~I-Y5Zr+zj@Dg`jhA)Gu-F#F0aD3hxq}#i!;lV; zA>!rQ(Mf}`S>QSxrammP5z3ou@kSq!G9(da?kNUJKZcO`gZmB=%2`IAA*~-m5o$5r z+KQLt4K6ae94!npflbO}Ac7E*G#;@g5Q9QQCGzl)-9*Qvz+K)18h`~q50$Nhi&H#91{w@7^|l0+cT0rx%*H`@tR4K7a8*7c31c#l1>*(P;ynl!3Gsa z6{I5cDJuX7ctOI-N4k}0p5u~d?Pz0D2$Cq%B$>zC_wQplr;EWRZt0ZbrGKA$r{4X& z5Si1we+?9ils+urDI_+#%D#Vo_{SfP5BK-+UKuv6{N)GF7=t-|`tK(d&7!QvaMzNu zq`xf^v&Qtr!=xj^={@-CnRF&g~`h?a1?!#Za)t#A%oP00FJy zPqxjYt1u7sv{xWSYmIBQ_M^!!M;)O@qYeVGu|q<9?8YA#i~NP%5-OY3Zg_ z4w}DhTXjzUwr#Oh;Lfh*uEF1tedQ^Yuv&IP?au^hEB&w&HA_G2l!{m*Z_^JuQBC?` zCwfUg>_ji=hn?spKaQOr$Ig%Aq;ea5ocuUWejIphGOV5aI8J^XCqIspAE#}`F`p-b zsQ?uk5*@aX(;}Z4X#(v$Xm+U?oui!x-OhuC`H|t)$xnejX$C;YOu>At2+lKBQrPC~ zI}SM_JH`O(wn%3oH5H0H`vA??is*Aj?Y2@yU~Q1Cp)8NIutk~?d7#`eG*CG5VFcn! zYm)fu8Rb+f(P%!jrDQB5MY1qv9zGo5< za?XT)j-lDInydg*@DTW;8HGP1qH8G6OjmF=lYXXzr1TLv^{VxNljZaaW|UR5+Ty;}cxPDp=d^Bxk - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -INFO-DIR-SECTION Emacs -START-INFO-DIR-ENTRY -* Magit: (magit). Using Git from Emacs with Magit. -END-INFO-DIR-ENTRY - - -Indirect: -magit.info-1: 754 -magit.info-2: 300807 - -Tag Table: -(Indirect) -Node: Top754 -Node: Introduction6438 -Node: Installation11161 -Node: Installing from Melpa11491 -Node: Installing from the Git Repository12564 -Node: Post-Installation Tasks14912 -Node: Getting Started16197 -Node: Interface Concepts21646 -Node: Modes and Buffers22007 -Node: Switching Buffers23756 -Node: Naming Buffers28507 -Node: Quitting Windows31814 -Node: Automatic Refreshing of Magit Buffers33560 -Node: Automatic Saving of File-Visiting Buffers36412 -Node: Automatic Reverting of File-Visiting Buffers37597 -Node: Risk of Reverting Automatically42592 -Node: Sections44974 -Node: Section Movement45900 -Node: Section Visibility50810 -Node: Section Hooks56887 -Node: Section Types and Values59294 -Node: Section Options60597 -Node: Transient Commands61069 -Node: Transient Arguments and Buffer Variables62306 -Node: Completion Confirmation and the Selection69324 -Node: Action Confirmation69768 -Node: Completion and Confirmation77118 -Node: The Selection80304 -Node: The hunk-internal region83203 -Node: Support for Completion Frameworks84292 -Node: Additional Completion Options89199 -Node: Running Git89798 -Node: Viewing Git Output90071 -Node: Git Process Status91204 -Node: Running Git Manually92169 -Node: Git Executable94639 -Node: Global Git Arguments96921 -Node: Inspecting97727 -Node: Status Buffer98884 -Node: Status Sections102874 -Node: Status Header Sections108426 -Node: Status Module Sections111056 -Node: Status Options113561 -Node: Repository List115030 -Node: Logging118068 -Node: Refreshing Logs120631 -Node: Log Buffer122077 -Node: Log Margin125933 -Node: Select from Log129112 -Node: Reflog131337 -Node: Cherries132994 -Node: Diffing134842 -Node: Refreshing Diffs137923 -Node: Commands Available in Diffs141502 -Node: Diff Options144038 -Node: Revision Buffer149076 -Node: Ediffing152406 -Node: References Buffer156054 -Node: References Sections166574 -Node: Bisecting167435 -Node: Visiting Files and Blobs169248 -Node: General-Purpose Visit Commands169718 -Node: Visiting Files and Blobs from a Diff170674 -Node: Blaming174133 -Node: Manipulating180696 -Node: Creating Repository181038 -Node: Cloning Repository181593 -Node: Staging and Unstaging186998 -Node: Staging from File-Visiting Buffers191081 -Node: Applying192249 -Node: Committing194142 -Node: Initiating a Commit194725 -Node: Editing Commit Messages198110 -Node: Using the Revision Stack200913 -Node: Commit Pseudo Headers203964 -Node: Commit Mode and Hooks205300 -Node: Commit Message Conventions208238 -Node: Branching210366 -Node: The Two Remotes210592 -Node: Branch Commands213245 -Node: Branch Git Variables225628 -Node: Auxiliary Branch Commands231019 -Node: Merging232137 -Node: Resolving Conflicts236145 -Node: Rebasing241146 -Node: Editing Rebase Sequences246005 -Node: Information About In-Progress Rebase250333 -Ref: Information About In-Progress Rebase-Footnote-1259215 -Node: Cherry Picking259811 -Node: Reverting264142 -Node: Resetting265591 -Node: Stashing267245 -Node: Transferring271946 -Node: Remotes272168 -Node: Remote Commands272320 -Node: Remote Git Variables276401 -Node: Fetching277680 -Node: Pulling280167 -Node: Pushing281213 -Node: Plain Patches284683 -Node: Maildir Patches286174 -Node: Miscellaneous287688 -Node: Tagging288004 -Node: Notes289932 -Node: Submodules292304 -Node: Listing Submodules292522 -Node: Submodule Transient294450 -Node: Subtree296972 -Node: Worktree298948 -Node: Common Commands300807 -Node: Wip Modes302854 -Node: Wip Graph307787 -Node: Legacy Wip Modes310101 -Node: Minor Mode for Buffers Visiting Files312996 -Node: Minor Mode for Buffers Visiting Blobs320097 -Node: Customizing320910 -Node: Per-Repository Configuration322506 -Node: Essential Settings324761 -Node: Safety325085 -Node: Performance326846 -Node: Microsoft Windows Performance334484 -Node: MacOS Performance335675 -Ref: MacOS Performance-Footnote-1336690 -Node: Plumbing336772 -Node: Calling Git337601 -Node: Getting a Value from Git339126 -Node: Calling Git for Effect342212 -Node: Section Plumbing348732 -Node: Creating Sections348960 -Node: Section Selection352860 -Node: Matching Sections354659 -Node: Refreshing Buffers360632 -Node: Conventions363780 -Node: Theming Faces363972 -Node: FAQ372087 -Node: FAQ - How to ...?372529 -Node: How to show git's output?372889 -Node: How to install the gitman info manual?373643 -Node: How to show diffs for gpg-encrypted files?374613 -Node: How does branching and pushing work?375209 -Node: Can Magit be used as ediff-version-control-package?375572 -Node: FAQ - Issues and Errors377561 -Node: Magit is slow378457 -Node: I changed several thousand files at once and now Magit is unusable378671 -Node: I am having problems committing379400 -Node: I am using MS Windows and cannot push with Magit379881 -Node: I am using OS X and SOMETHING works in shell but not in Magit380498 -Node: Expanding a file to show the diff causes it to disappear381329 -Node: Point is wrong in the COMMIT_EDITMSG buffer381910 -Node: The mode-line information isn't always up-to-date382956 -Node: A branch and tag sharing the same name breaks SOMETHING384038 -Node: My Git hooks work on the command-line but not inside Magit384924 -Node: git-commit-mode isn't used when committing from the command-line385770 -Node: Point ends up inside invisible text when jumping to a file-visiting buffer388037 -Node: Debugging Tools388835 -Node: Keystroke Index391014 -Node: Command Index424998 -Node: Function Index462023 -Node: Variable Index478375 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: diff --git a/elpa/magit-20200418.939/magit.info-1 b/elpa/magit-20200418.939/magit.info-1 deleted file mode 100644 index 987199fb..00000000 --- a/elpa/magit-20200418.939/magit.info-1 +++ /dev/null @@ -1,7776 +0,0 @@ -This is magit.info, produced by makeinfo version 6.5 from magit.texi. - - Copyright (C) 2015-2020 Jonas Bernoulli - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -INFO-DIR-SECTION Emacs -START-INFO-DIR-ENTRY -* Magit: (magit). Using Git from Emacs with Magit. -END-INFO-DIR-ENTRY - - -File: magit.info, Node: Top, Next: Introduction, Up: (dir) - -Magit User Manual -***************** - -Magit is an interface to the version control system Git, implemented as -an Emacs package. Magit aspires to be a complete Git porcelain. While -we cannot (yet) claim that Magit wraps and improves upon each and every -Git command, it is complete enough to allow even experienced Git users -to perform almost all of their daily version control tasks directly from -within Emacs. While many fine Git clients exist, only Magit and Git -itself deserve to be called porcelains. - -This manual is for Magit version 2.90.1 (v2.90.1-954-g509e97b7+1). - - Copyright (C) 2015-2020 Jonas Bernoulli - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -* Menu: - -* Introduction:: -* Installation:: -* Getting Started:: -* Interface Concepts:: -* Inspecting:: -* Manipulating:: -* Transferring:: -* Miscellaneous:: -* Customizing:: -* Plumbing:: -* FAQ:: -* Debugging Tools:: -* Keystroke Index:: -* Command Index:: -* Function Index:: -* Variable Index:: - -— The Detailed Node Listing — - -Installation - -* Installing from Melpa:: -* Installing from the Git Repository:: -* Post-Installation Tasks:: - -Interface Concepts - -* Modes and Buffers:: -* Sections:: -* Transient Commands:: -* Transient Arguments and Buffer Variables:: -* Completion, Confirmation and the Selection: Completion Confirmation and the Selection. -* Running Git:: - -Modes and Buffers - -* Switching Buffers:: -* Naming Buffers:: -* Quitting Windows:: -* Automatic Refreshing of Magit Buffers:: -* Automatic Saving of File-Visiting Buffers:: -* Automatic Reverting of File-Visiting Buffers:: - - -Sections - -* Section Movement:: -* Section Visibility:: -* Section Hooks:: -* Section Types and Values:: -* Section Options:: - - -Completion, Confirmation and the Selection - -* Action Confirmation:: -* Completion and Confirmation:: -* The Selection:: -* The hunk-internal region:: -* Support for Completion Frameworks:: -* Additional Completion Options:: - - -Running Git - -* Viewing Git Output:: -* Git Process Status:: -* Running Git Manually:: -* Git Executable:: -* Global Git Arguments:: - - -Inspecting - -* Status Buffer:: -* Repository List:: -* Logging:: -* Diffing:: -* Ediffing:: -* References Buffer:: -* Bisecting:: -* Visiting Files and Blobs:: -* Blaming:: - -Status Buffer - -* Status Sections:: -* Status Header Sections:: -* Status Module Sections:: -* Status Options:: - - -Logging - -* Refreshing Logs:: -* Log Buffer:: -* Log Margin:: -* Select from Log:: -* Reflog:: -* Cherries:: - - -Diffing - -* Refreshing Diffs:: -* Commands Available in Diffs:: -* Diff Options:: -* Revision Buffer:: - - -References Buffer - -* References Sections:: - - -Visiting Files and Blobs - -* General-Purpose Visit Commands:: -* Visiting Files and Blobs from a Diff:: - - -Manipulating - -* Creating Repository:: -* Cloning Repository:: -* Staging and Unstaging:: -* Applying:: -* Committing:: -* Branching:: -* Merging:: -* Resolving Conflicts:: -* Rebasing:: -* Cherry Picking:: -* Resetting:: -* Stashing:: - -Staging and Unstaging - -* Staging from File-Visiting Buffers:: - - -Committing - -* Initiating a Commit:: -* Editing Commit Messages:: - - -Branching - -* The Two Remotes:: -* Branch Commands:: -* Branch Git Variables:: -* Auxiliary Branch Commands:: - - -Rebasing - -* Editing Rebase Sequences:: -* Information About In-Progress Rebase:: - - -Cherry Picking - -* Reverting:: - - -Transferring - -* Remotes:: -* Fetching:: -* Pulling:: -* Pushing:: -* Plain Patches:: -* Maildir Patches:: - -Remotes - -* Remote Commands:: -* Remote Git Variables:: - - -Miscellaneous - -* Tagging:: -* Notes:: -* Submodules:: -* Subtree:: -* Worktree:: -* Common Commands:: -* Wip Modes:: -* Minor Mode for Buffers Visiting Files:: -* Minor Mode for Buffers Visiting Blobs:: - -Submodules - -* Listing Submodules:: -* Submodule Transient:: - - -Wip Modes - -* Wip Graph:: -* Legacy Wip Modes:: - - -Customizing - -* Per-Repository Configuration:: -* Essential Settings:: - -Essential Settings - -* Safety:: -* Performance:: - - -Plumbing - -* Calling Git:: -* Section Plumbing:: -* Refreshing Buffers:: -* Conventions:: - -Calling Git - -* Getting a Value from Git:: -* Calling Git for Effect:: - - -Section Plumbing - -* Creating Sections:: -* Section Selection:: -* Matching Sections:: - - -Conventions - -* Theming Faces:: - - -FAQ - -* FAQ - How to ...?:: -* FAQ - Issues and Errors:: - -FAQ - How to ...? - -* How to show git's output?:: -* How to install the gitman info manual?:: -* How to show diffs for gpg-encrypted files?:: -* How does branching and pushing work?:: -* Can Magit be used as ediff-version-control-package?:: - - -FAQ - Issues and Errors - -* Magit is slow:: -* I changed several thousand files at once and now Magit is unusable:: -* I am having problems committing:: -* I am using MS Windows and cannot push with Magit:: -* I am using OS X and SOMETHING works in shell, but not in Magit: I am using OS X and SOMETHING works in shell but not in Magit. -* Expanding a file to show the diff causes it to disappear:: -* Point is wrong in the COMMIT_EDITMSG buffer:: -* The mode-line information isn't always up-to-date:: -* A branch and tag sharing the same name breaks SOMETHING:: -* My Git hooks work on the command-line but not inside Magit:: -* git-commit-mode isn't used when committing from the command-line:: -* Point ends up inside invisible text when jumping to a file-visiting buffer:: - - - - -File: magit.info, Node: Introduction, Next: Installation, Prev: Top, Up: Top - -1 Introduction -************** - -Magit is an interface to the version control system Git, implemented as -an Emacs package. Magit aspires to be a complete Git porcelain. While -we cannot (yet) claim that Magit wraps and improves upon each and every -Git command, it is complete enough to allow even experienced Git users -to perform almost all of their daily version control tasks directly from -within Emacs. While many fine Git clients exist, only Magit and Git -itself deserve to be called porcelains. - - Staging and otherwise applying changes is one of the most important -features in a Git porcelain and here Magit outshines anything else, -including Git itself. Git’s own staging interface (‘git add --patch’) -is so cumbersome that many users only use it in exceptional cases. In -Magit staging a hunk or even just part of a hunk is as trivial as -staging all changes made to a file. - - The most visible part of Magit’s interface is the status buffer, -which displays information about the current repository. Its content is -created by running several Git commands and making their output -actionable. Among other things, it displays information about the -current branch, lists unpulled and unpushed changes and contains -sections displaying the staged and unstaged changes. That might sound -noisy, but, since sections are collapsible, it’s not. - - To stage or unstage a change one places the cursor on the change and -then types ‘s’ or ‘u’. The change can be a file or a hunk, or when the -region is active (i.e. when there is a selection) several files or -hunks, or even just part of a hunk. The change or changes that these -commands - and many others - would act on are highlighted. - - Magit also implements several other "apply variants" in addition to -staging and unstaging. One can discard or reverse a change, or apply it -to the working tree. Git’s own porcelain only supports this for staging -and unstaging and you would have to do something like ‘git diff ... | -??? | git apply ...’ to discard, revert, or apply a single hunk on the -command line. In fact that’s exactly what Magit does internally (which -is what lead to the term "apply variants"). - - Magit isn’t just for Git experts, but it does assume some prior -experience with Git as well as Emacs. That being said, many users have -reported that using Magit was what finally taught them what Git is -capable of and how to use it to its fullest. Other users wished they -had switched to Emacs sooner so that they would have gotten their hands -on Magit earlier. - - While one has to know the basic features of Emacs to be able to make -full use of Magit, acquiring just enough Emacs skills doesn’t take long -and is worth it, even for users who prefer other editors. Vim users are -advised to give Evil (https://bitbucket.org/lyro/evil/wiki/Home), the -"Extensible VI Layer for Emacs", and Spacemacs -(https://github.com/syl20bnr/spacemacs), an "Emacs starter-kit focused -on Evil" a try. - - Magit provides a consistent and efficient Git porcelain. After a -short learning period, you will be able to perform most of your daily -version control tasks faster than you would on the command line. You -will likely also start using features that seemed too daunting in the -past. - - Magit fully embraces Git. It exposes many advanced features using a -simple but flexible interface instead of only wrapping the trivial ones -like many GUI clients do. Of course Magit supports logging, cloning, -pushing, and other commands that usually don’t fail in spectacular ways; -but it also supports tasks that often cannot be completed in a single -step. Magit fully supports tasks such as merging, rebasing, -cherry-picking, reverting, and blaming by not only providing a command -to initiate these tasks but also by displaying context sensitive -information along the way and providing commands that are useful for -resolving conflicts and resuming the sequence after doing so. - - Magit wraps and in many cases improves upon at least the following -Git porcelain commands: ‘add’, ‘am’, ‘bisect’, ‘blame’, ‘branch’, -‘checkout’, ‘cherry’, ‘cherry-pick’, ‘clean’, ‘clone’, ‘commit’, -‘config’, ‘describe’, ‘diff’, ‘fetch’, ‘format-patch’, ‘init’, ‘log’, -‘merge’, ‘merge-tree’, ‘mv’, ‘notes’, ‘pull’, ‘rebase’, ‘reflog’, -‘remote’, ‘request-pull’, ‘reset’, ‘revert’, ‘rm’, ‘show’, ‘stash’, -‘submodule’, ‘subtree’, ‘tag’, and ‘worktree.’ Many more Magit porcelain -commands are implemented on top of Git plumbing commands. - - -File: magit.info, Node: Installation, Next: Getting Started, Prev: Introduction, Up: Top - -2 Installation -************** - -Magit can be installed using Emacs’ package manager or manually from its -development repository. - -* Menu: - -* Installing from Melpa:: -* Installing from the Git Repository:: -* Post-Installation Tasks:: - - -File: magit.info, Node: Installing from Melpa, Next: Installing from the Git Repository, Up: Installation - -2.1 Installing from Melpa -========================= - -Magit is available from Melpa and Melpa-Stable. If you haven’t used -Emacs’ package manager before, then it is high time you familiarize -yourself with it by reading the documentation in the Emacs manual, see -*note (emacs)Packages::. Then add one of the archives to -‘package-archives’: - - • To use Melpa: - - (require 'package) - (add-to-list 'package-archives - '("melpa" . "http://melpa.org/packages/") t) - - • To use Melpa-Stable: - - (require 'package) - (add-to-list 'package-archives - '("melpa-stable" . "http://stable.melpa.org/packages/") t) - - Once you have added your preferred archive, you need to update the -local package list using: - - M-x package-refresh-contents RET - - Once you have done that, you can install Magit and its dependencies -using: - - M-x package-install RET magit RET - - Now see *note Post-Installation Tasks::. - - -File: magit.info, Node: Installing from the Git Repository, Next: Post-Installation Tasks, Prev: Installing from Melpa, Up: Installation - -2.2 Installing from the Git Repository -====================================== - -Magit depends on the ‘dash’, ‘transient’ and ‘with-editor’ libraries -which are available from Melpa and Melpa-Stable. Install them using -‘M-x package-install RET RET’. Of course you may also install -them manually from their repository. - - Then clone the Magit repository: - - $ git clone https://github.com/magit/magit.git ~/.emacs.d/site-lisp/magit - $ cd ~/.emacs.d/site-lisp/magit - - Then compile the libraries and generate the info manuals: - - $ make - - If you haven’t installed ‘dash’, ‘transient’ and ‘with-editor’ from -Melpa or at ‘/path/to/magit/../’, then you have to tell ‘make’ -where to find them. To do so create the file ‘/path/to/magit/config.mk’ -with the following content before running ‘make’: - - LOAD_PATH = -L /path/to/magit/lisp - LOAD_PATH += -L /path/to/dash - LOAD_PATH += -L /path/to/transient - LOAD_PATH += -L /path/to/with-editor - - Finally add this to your init file: - - (add-to-list 'load-path "~/.emacs.d/site-lisp/magit/lisp") - (require 'magit) - - (with-eval-after-load 'info - (info-initialize) - (add-to-list 'Info-directory-list - "~/.emacs.d/site-lisp/magit/Documentation/")) - - Note that you have to add the ‘lisp’ subdirectory to the ‘load-path’, -not the top-level of the repository, and that elements of ‘load-path’ -should not end with a slash, while those of ‘Info-directory-list’ -should. - - Instead of requiring the feature ‘magit’, you could load just the -autoload definitions, by loading the file ‘magit-autoloads.el’. - - (load "/path/to/magit/lisp/magit-autoloads") - - Instead of running Magit directly from the repository by adding that -to the ‘load-path’, you might want to instead install it in some other -directory using ‘sudo make install’ and setting ‘load-path’ accordingly. - - To update Magit use: - - $ git pull - $ make - - At times it might be necessary to run ‘make clean all’ instead. - - To view all available targets use ‘make help’. - - Now see *note Post-Installation Tasks::. - - -File: magit.info, Node: Post-Installation Tasks, Prev: Installing from the Git Repository, Up: Installation - -2.3 Post-Installation Tasks -=========================== - -After installing Magit you should verify that you are indeed using the -Magit, Git, and Emacs releases you think you are using. It’s best to -restart Emacs before doing so, to make sure you are not using an -outdated value for ‘load-path’. - - M-x magit-version RET - - should display something like - - Magit 2.8.0, Git 2.10.2, Emacs 25.1.1, gnu/linux - - Then you might also want to read about options that many users likely -want to customize. See *note Essential Settings::. - - To be able to follow cross references to Git manpages found in this -manual, you might also have to manually install the ‘gitman’ info -manual, or advice ‘Info-follow-nearest-node’ to instead open the actual -manpage. See *note How to install the gitman info manual?::. - - If you are completely new to Magit then see *note Getting Started::. - - If you run into problems, then please see the *note FAQ::. Also see -the *note Debugging Tools::. - - And last but not least please consider making a donation, to ensure -that I can keep working on Magit. See . -for various donation options. - - -File: magit.info, Node: Getting Started, Next: Interface Concepts, Prev: Installation, Up: Top - -3 Getting Started -***************** - -This short tutorial describes the most essential features that many -Magitians use on a daily basis. It only scratches the surface but -should be enough to get you started. - - IMPORTANT: It is safest if you clone some repository just for this -tutorial. Alternatively you can use an existing local repository, but -if you do that, then you should commit all uncommitted changes before -proceeding. - - To display information about the current Git repository, type ‘M-x -magit-status RET’. You will be using this command a lot, and should -therefore give it a global key binding. This is what we recommend: - - (global-set-key (kbd "C-x g") 'magit-status) - - Most Magit commands are commonly invoked from the status buffer. It -can be considered the primary interface for interacting with Git using -Magit. Many other Magit buffers may exist at a given time, but they are -often created from this buffer. - - Depending on what state your repository is in, this buffer may -contain sections titled "Staged changes", "Unstaged changes", "Unmerged -into origin/master", "Unpushed to origin/master", and many others. - - Since we are starting from a safe state, which you can easily return -to (by doing a ‘git reset --hard PRE-MAGIT-STATE’), there currently are -no staged or unstaged changes. Edit some files and save the changes. -Then go back to the status buffer, while at the same time refreshing it, -by typing ‘C-x g’. (When the status buffer, or any Magit buffer for -that matter, is the current buffer, then you can also use just ‘g’ to -refresh it). - - Move between sections using ‘p’ and ‘n’. Note that the bodies of -some sections are hidden. Type ‘TAB’ to expand or collapse the section -at point. You can also use ‘C-tab’ to cycle the visibility of the -current section and its children. Move to a file section inside the -section named "Unstaged changes" and type ‘s’ to stage the changes you -have made to that file. That file now appears under "Staged changes". - - Magit can stage and unstage individual hunks, not just complete -files. Move to the file you have just staged, expand it using ‘TAB’, -move to one of the hunks using ‘n’, and unstage just that by typing ‘u’. -Note how the staging (‘s’) and unstaging (‘u’) commands operate on the -change at point. Many other commands behave the same way. - - You can also un-/stage just part of a hunk. Inside the body of a -hunk section (move there using ‘C-n’), set the mark using ‘C-SPC’ and -move down until some added and/or removed lines fall inside the region -but not all of them. Again type ‘s’ to stage. - - It is also possible to un-/stage multiple files at once. Move to a -file section, type ‘C-SPC’, move to the next file using ‘n’, and then -‘s’ to stage both files. Note that both the mark and point have to be -on the headings of sibling sections for this to work. If the region -looks like it does in other buffers, then it doesn’t select Magit -sections that can be acted on as a unit. - - And then of course you want to commit your changes. Type ‘c’. This -shows the available commit commands and arguments in a buffer at the -bottom of the frame. Each command and argument is prefixed with the key -that invokes/sets it. Do not worry about this for now. We want to -create a "normal" commit, which is done by typing ‘c’ again. - - Now two new buffers appear. One is for writing the commit message, -the other shows a diff with the changes that you are about to committed. -Write a message and then type ‘C-c C-c’ to actually create the commit. - - You probably don’t want to push the commit you just created because -you just committed some random changes, but if that is not the case you -could push it by typing ‘P’ to show all the available push commands and -arguments and then ‘p’ to push to a branch with the same name as the -local branch onto the remote configured as the push-remote. (If the -push-remote is not configured yet, then you would first be prompted for -the remote to push to.) - - So far we have mentioned the commit, push, and log transient prefix -commands. These are probably among the transients you will be using the -most, but many others exist. To show a transient that lists all other -transients (as well as the various apply commands and some other -essential commands), type ‘h’. Try a few. - - The key bindings in that transient correspond to the bindings in -Magit buffers, including but not limited to the status buffer. So you -could type ‘h d’ to bring up the diff transient, but once you remember -that "d" stands for "diff", you would usually do so by just typing ‘d’. -But this "prefix of prefixes" is useful even once you have memorized all -the bindings, as it can provide easy access to Magit commands from -non-Magit buffers. You should create a global key binding for this -command too: - - (global-set-key (kbd "C-x M-g") 'magit-dispatch) - - In the same vein, you might also want to enable -‘global-magit-file-mode’ to get some more Magit key bindings in regular -file-visiting buffers (see *note Minor Mode for Buffers Visiting -Files::). - - It is not necessary that you do so now, but if you stick with Magit, -then it is highly recommended that you read the next section too. - - -File: magit.info, Node: Interface Concepts, Next: Inspecting, Prev: Getting Started, Up: Top - -4 Interface Concepts -******************** - -* Menu: - -* Modes and Buffers:: -* Sections:: -* Transient Commands:: -* Transient Arguments and Buffer Variables:: -* Completion, Confirmation and the Selection: Completion Confirmation and the Selection. -* Running Git:: - - -File: magit.info, Node: Modes and Buffers, Next: Sections, Up: Interface Concepts - -4.1 Modes and Buffers -===================== - -Magit provides several major-modes. For each of these modes there -usually exists only one buffer per repository. Separate modes and thus -buffers exist for commits, diffs, logs, and some other things. - - Besides these special purpose buffers, there also exists an overview -buffer, called the *status buffer*. It’s usually from this buffer that -the user invokes Git commands, or creates or visits other buffers. - - In this manual we often speak about "Magit buffers". By that we mean -buffers whose major-modes derive from ‘magit-mode’. - -‘M-x magit-toggle-buffer-lock’ (‘magit-toggle-buffer-lock’) - - This command locks the current buffer to its value or if the buffer - is already locked, then it unlocks it. - - Locking a buffer to its value prevents it from being reused to - display another value. The name of a locked buffer contains its - value, which allows telling it apart from other locked buffers and - the unlocked buffer. - - Not all Magit buffers can be locked to their values; for example, - it wouldn’t make sense to lock a status buffer. - - There can only be a single unlocked buffer using a certain - major-mode per repository. So when a buffer is being unlocked and - another unlocked buffer already exists for that mode and - repository, then the former buffer is instead deleted and the - latter is displayed in its place. - -* Menu: - -* Switching Buffers:: -* Naming Buffers:: -* Quitting Windows:: -* Automatic Refreshing of Magit Buffers:: -* Automatic Saving of File-Visiting Buffers:: -* Automatic Reverting of File-Visiting Buffers:: - - -File: magit.info, Node: Switching Buffers, Next: Naming Buffers, Up: Modes and Buffers - -4.1.1 Switching Buffers ------------------------ - - -- Function: magit-display-buffer buffer &optional display-function - - This function is a wrapper around ‘display-buffer’ and is used to - display any Magit buffer. It displays BUFFER in some window and, - unlike ‘display-buffer’, also selects that window, provided - ‘magit-display-buffer-noselect’ is ‘nil’. It also runs the hooks - mentioned below. - - If optional DISPLAY-FUNCTION is non-nil, then that is used to - display the buffer. Usually that is ‘nil’ and the function - specified by ‘magit-display-buffer-function’ is used. - - -- Variable: magit-display-buffer-noselect - - When this is non-nil, then ‘magit-display-buffer’ only displays the - buffer but forgoes also selecting the window. This variable should - not be set globally, it is only intended to be let-bound, by code - that automatically updates "the other window". This is used for - example when the revision buffer is updated when you move inside - the log buffer. - - -- User Option: magit-display-buffer-function - - The function specified here is called by ‘magit-display-buffer’ - with one argument, a buffer, to actually display that buffer. This - function should call ‘display-buffer’ with that buffer as first and - a list of display actions as second argument. - - Magit provides several functions, listed below, that are suitable - values for this option. If you want to use different rules, then a - good way of doing that is to start with a copy of one of these - functions and then adjust it to your needs. - - Instead of using a wrapper around ‘display-buffer’, that function - itself can be used here, in which case the display actions have to - be specified by adding them to ‘display-buffer-alist’ instead. - - To learn about display actions, see *note (elisp)Choosing Window::. - - -- Function: magit-display-buffer-traditional buffer - - This function is the current default value of the option - ‘magit-display-buffer-function’. Before that option and this - function were added, the behavior was hard-coded in many places all - over the code base but now all the rules are contained in this one - function (except for the "noselect" special case mentioned above). - - -- Function: magit-display-buffer-same-window-except-diff-v1 - - This function displays most buffers in the currently selected - window. If a buffer’s mode derives from ‘magit-diff-mode’ or - ‘magit-process-mode’, it is displayed in another window. - - -- Function: magit-display-buffer-fullframe-status-v1 - - This function fills the entire frame when displaying a status - buffer. Otherwise, it behaves like - ‘magit-display-buffer-traditional’. - - -- Function: magit-display-buffer-fullframe-status-topleft-v1 - - This function fills the entire frame when displaying a status - buffer. It behaves like ‘magit-display-buffer-fullframe-status-v1’ - except that it displays buffers that derive from ‘magit-diff-mode’ - or ‘magit-process-mode’ to the top or left of the current buffer - rather than to the bottom or right. As a result, Magit buffers - tend to pop up on the same side as they would if - ‘magit-display-buffer-traditional’ were in use. - - -- Function: magit-display-buffer-fullcolumn-most-v1 - - This function displays most buffers so that they fill the entire - height of the frame. However, the buffer is displayed in another - window if (1) the buffer’s mode derives from ‘magit-process-mode’, - or (2) the buffer’s mode derives from ‘magit-diff-mode’, provided - that the mode of the current buffer derives from ‘magit-log-mode’ - or ‘magit-cherry-mode’. - - -- User Option: magit-pre-display-buffer-hook - - This hook is run by ‘magit-display-buffer’ before displaying the - buffer. - - -- Function: magit-save-window-configuration - - This function saves the current window configuration. Later when - the buffer is buried, it may be restored by - ‘magit-restore-window-configuration’. - - -- User Option: magit-post-display-buffer-hook - - This hook is run by ‘magit-display-buffer’ after displaying the - buffer. - - -- Function: magit-maybe-set-dedicated - - This function remembers if a new window had to be created to - display the buffer, or whether an existing window was reused. This - information is later used by ‘magit-mode-quit-window’, to determine - whether the window should be deleted when its last Magit buffer is - buried. - - -File: magit.info, Node: Naming Buffers, Next: Quitting Windows, Prev: Switching Buffers, Up: Modes and Buffers - -4.1.2 Naming Buffers --------------------- - - -- User Option: magit-generate-buffer-name-function - - The function used to generate the names of Magit buffers. - - Such a function should take the options - ‘magit-uniquify-buffer-names’ as well as ‘magit-buffer-name-format’ - into account. If it doesn’t, then should be clearly stated in the - doc-string. And if it supports %-sequences beyond those mentioned - in the doc-string of the option ‘magit-buffer-name-format’, then - its own doc-string should describe the additions. - - -- Function: magit-generate-buffer-name-default-function mode - - This function returns a buffer name suitable for a buffer whose - major-mode is MODE and which shows information about the repository - in which ‘default-directory’ is located. - - This function uses ‘magit-buffer-name-format’ and supporting all of - the %-sequences mentioned the documentation of that option. It - also respects the option ‘magit-uniquify-buffer-names’. - - -- User Option: magit-buffer-name-format - - The format string used to name Magit buffers. - - At least the following %-sequences are supported: - - • ‘%m’ - - The name of the major-mode, but with the ‘-mode’ suffix - removed. - - • ‘%M’ - - Like ‘%m’ but abbreviate ‘magit-status-mode’ as ‘magit’. - - • ‘%v’ - - The value the buffer is locked to, in parentheses, or an empty - string if the buffer is not locked to a value. - - • ‘%V’ - - Like ‘%v’, but the string is prefixed with a space, unless it - is an empty string. - - • ‘%t’ - - The top-level directory of the working tree of the repository, - or if ‘magit-uniquify-buffer-names’ is non-nil an abbreviation - of that. - - • ‘%x’ - - If ‘magit-uniquify-buffer-names’ is nil "*", otherwise the - empty string. Due to limitations of the ‘uniquify’ package, - buffer names must end with the path. - - • ‘%T’ - - Obsolete, use "%t%x" instead. Like ‘%t’, but append an - asterisk if and only if ‘magit-uniquify-buffer-names’ is nil. - - The value should always contain ‘%m’ or ‘%M’, ‘%v’ or ‘%V’, and - ‘%t’ (or the obsolete ‘%T’). If ‘magit-uniquify-buffer-names’ is - non-nil, then the value must end with ‘%t’ or ‘%t%x’ (or the - obsolete ‘%T’). See issue #2841. - - -- User Option: magit-uniquify-buffer-names - - This option controls whether the names of Magit buffers are - uniquified. If the names are not being uniquified, then they - contain the full path of the top-level of the working tree of the - corresponding repository. If they are being uniquified, then they - end with the basename of the top-level, or if that would conflict - with the name used for other buffers, then the names of all these - buffers are adjusted until they no longer conflict. - - This is done using the ‘uniquify’ package; customize its options to - control how buffer names are uniquified. - - -File: magit.info, Node: Quitting Windows, Next: Automatic Refreshing of Magit Buffers, Prev: Naming Buffers, Up: Modes and Buffers - -4.1.3 Quitting Windows ----------------------- - -‘q’ (‘magit-mode-bury-buffer’) - - This command buries the current Magit buffer. - - With a prefix argument, it instead kills the buffer. With a double - prefix argument, also kills all other Magit buffers associated with - the current project. - - -- User Option: magit-bury-buffer-function - - The function used to actually bury or kill the current buffer. - - ‘magit-mode-bury-buffer’ calls this function with one argument. If - the argument is non-nil, then the function has to kill the current - buffer. Otherwise it has to bury it alive. The default value - currently is ‘magit-restore-window-configuration’. - - -- Function: magit-restore-window-configuration kill-buffer - - Bury or kill the current buffer using ‘quit-window’, which is - called with KILL-BUFFER as first and the selected window as second - argument. - - Then restore the window configuration that existed right before the - current buffer was displayed in the selected frame. Unfortunately - that also means that point gets adjusted in all the buffers, which - are being displayed in the selected frame. - - -- Function: magit-mode-quit-window kill-buffer - - Bury or kill the current buffer using ‘quit-window’, which is - called with KILL-BUFFER as first and the selected window as second - argument. - - Then, if the window was originally created to display a Magit - buffer and the buried buffer was the last remaining Magit buffer - that was ever displayed in the window, then that is deleted. - - -File: magit.info, Node: Automatic Refreshing of Magit Buffers, Next: Automatic Saving of File-Visiting Buffers, Prev: Quitting Windows, Up: Modes and Buffers - -4.1.4 Automatic Refreshing of Magit Buffers -------------------------------------------- - -After running a command which may change the state of the current -repository, the current Magit buffer and the corresponding status buffer -are refreshed. The status buffer can be automatically refreshed -whenever a buffer is saved to a file inside the respective repository by -adding a hook, like so: - - (add-hook 'after-save-hook 'magit-after-save-refresh-status t) - - Automatically refreshing Magit buffers ensures that the displayed -information is up-to-date most of the time but can lead to a noticeable -delay in big repositories. Other Magit buffers are not refreshed to -keep the delay to a minimum and also because doing so can sometimes be -undesirable. - - Buffers can also be refreshed explicitly, which is useful in buffers -that weren’t current during the last refresh and after changes were made -to the repository outside of Magit. - -‘g’ (‘magit-refresh’) - - This command refreshes the current buffer if its major mode derives - from ‘magit-mode’ as well as the corresponding status buffer. - - If the option ‘magit-revert-buffers’ calls for it, then it also - reverts all unmodified buffers that visit files being tracked in - the current repository. - -‘G’ (‘magit-refresh-all’) - - This command refreshes all Magit buffers belonging to the current - repository and also reverts all unmodified buffers that visit files - being tracked in the current repository. - - The file-visiting buffers are always reverted, even if - ‘magit-revert-buffers’ is nil. - - -- User Option: magit-refresh-buffer-hook - - This hook is run in each Magit buffer that was refreshed during the - current refresh - normally the current buffer and the status - buffer. - - -- User Option: magit-refresh-status-buffer - - When this option is non-nil, then the status buffer is - automatically refreshed after running git for side-effects, in - addition to the current Magit buffer, which is always refreshed - automatically. - - Only set this to nil after exhausting all other options to improve - performance. - - -- Function: magit-after-save-refresh-status - - This function is intended to be added to ‘after-save-hook’. After - doing that the corresponding status buffer is refreshed whenever a - buffer is saved to a file inside a repository. - - Note that refreshing a Magit buffer is done by re-creating its - contents from scratch, which can be slow in large repositories. If - you are not satisfied with Magit’s performance, then you should - obviously not add this function to that hook. - - -File: magit.info, Node: Automatic Saving of File-Visiting Buffers, Next: Automatic Reverting of File-Visiting Buffers, Prev: Automatic Refreshing of Magit Buffers, Up: Modes and Buffers - -4.1.5 Automatic Saving of File-Visiting Buffers ------------------------------------------------ - -File-visiting buffers are by default saved at certain points in time. -This doesn’t guarantee that Magit buffers are always up-to-date, but, -provided one only edits files by editing them in Emacs and uses only -Magit to interact with Git, one can be fairly confident. When in doubt -or after outside changes, type ‘g’ (‘magit-refresh’) to save and refresh -explicitly. - - -- User Option: magit-save-repository-buffers - - This option controls whether file-visiting buffers are saved before - certain events. - - If this is non-nil then all modified file-visiting buffers - belonging to the current repository may be saved before running - commands, before creating new Magit buffers, and before explicitly - refreshing such buffers. If this is ‘dontask’ then this is done - without user intervention. If it is ‘t’ then the user has to - confirm each save. - - -File: magit.info, Node: Automatic Reverting of File-Visiting Buffers, Prev: Automatic Saving of File-Visiting Buffers, Up: Modes and Buffers - -4.1.6 Automatic Reverting of File-Visiting Buffers --------------------------------------------------- - -By default Magit automatically reverts buffers that are visiting files -that are being tracked in a Git repository, after they have changed on -disk. When using Magit one often changes files on disk by running Git, -i.e. "outside Emacs", making this a rather important feature. - - For example, if you discard a change in the status buffer, then that -is done by running ‘git apply --reverse ...’, and Emacs considers the -file to have "changed on disk". If Magit did not automatically revert -the buffer, then you would have to type ‘M-x revert-buffer RET RET’ in -the visiting buffer before you could continue making changes. - - -- User Option: magit-auto-revert-mode - - When this mode is enabled, then buffers that visit tracked files - are automatically reverted after the visited files change on disk. - - -- User Option: global-auto-revert-mode - - When this mode is enabled, then any file-visiting buffer is - automatically reverted after the visited file changes on disk. - - If you like buffers that visit tracked files to be automatically - reverted, then you might also like any buffer to be reverted, not - just those visiting tracked files. If that is the case, then - enable this mode _instead of_ ‘magit-auto-revert-mode’. - - -- User Option: magit-auto-revert-immediately - - This option controls whether Magit reverts buffers immediately. - - If this is non-nil and either ‘global-auto-revert-mode’ or - ‘magit-auto-revert-mode’ is enabled, then Magit immediately reverts - buffers by explicitly calling ‘auto-revert-buffers’ after running - Git for side-effects. - - If ‘auto-revert-use-notify’ is non-nil (and file notifications are - actually supported), then ‘magit-auto-revert-immediately’ does not - have to be non-nil, because the reverts happen immediately anyway. - - If ‘magit-auto-revert-immediately’ and ‘auto-revert-use-notify’ are - both ‘nil’, then reverts happen after ‘auto-revert-interval’ - seconds of user inactivity. That is not desirable. - - -- User Option: auto-revert-use-notify - - This option controls whether file notification functions should be - used. Note that this variable unfortunately defaults to ‘t’ even - on systems on which file notifications cannot be used. - - -- User Option: magit-auto-revert-tracked-only - - This option controls whether ‘magit-auto-revert-mode’ only reverts - tracked files or all files that are located inside Git - repositories, including untracked files and files located inside - Git’s control directory. - - -- User Option: auto-revert-mode - - The global mode ‘magit-auto-revert-mode’ works by turning on this - local mode in the appropriate buffers (but - ‘global-auto-revert-mode’ is implemented differently). You can - also turn it on or off manually, which might be necessary if Magit - does not notice that a previously untracked file now is being - tracked or vice-versa. - - -- User Option: auto-revert-stop-on-user-input - - This option controls whether the arrival of user input suspends the - automatic reverts for ‘auto-revert-interval’ seconds. - - -- User Option: auto-revert-interval - - This option controls how many seconds Emacs waits for before - resuming suspended reverts. - - -- User Option: auto-revert-buffer-list-filter - - This option specifies an additional filter used by - ‘auto-revert-buffers’ to determine whether a buffer should be - reverted or not. - - This option is provided by Magit, which also advises - ‘auto-revert-buffers’ to respect it. Magit users who do not turn - on the local mode ‘auto-revert-mode’ themselves, are best served by - setting the value to ‘magit-auto-revert-repository-buffer-p’. - - However the default is nil, so as not to disturb users who do use - the local mode directly. If you experience delays when running - Magit commands, then you should consider using one of the - predicates provided by Magit - especially if you also use Tramp. - - Users who do turn on ‘auto-revert-mode’ in buffers in which Magit - doesn’t do that for them, should likely not use any filter. Users - who turn on ‘global-auto-revert-mode’, do not have to worry about - this option, because it is disregarded if the global mode is - enabled. - - -- User Option: auto-revert-verbose - - This option controls whether Emacs reports when a buffer has been - reverted. - - The options with the ‘auto-revert-’ prefix are located in the Custom -group named ‘auto-revert’. The other, Magit-specific, options are -located in the ‘magit’ group. - -* Menu: - -* Risk of Reverting Automatically:: - - -File: magit.info, Node: Risk of Reverting Automatically, Up: Automatic Reverting of File-Visiting Buffers - -Risk of Reverting Automatically -............................... - -For the vast majority of users, automatically reverting file-visiting -buffers after they have changed on disk is harmless. - - If a buffer is modified (i.e. it contains changes that haven’t been -saved yet), then Emacs will refuse to automatically revert it. If you -save a previously modified buffer, then that results in what is seen by -Git as an uncommitted change. Git will then refuse to carry out any -commands that would cause these changes to be lost. In other words, if -there is anything that could be lost, then either Git or Emacs will -refuse to discard the changes. - - However, if you use file-visiting buffers as a sort of ad hoc -"staging area", then the automatic reverts could potentially cause data -loss. So far I have heard from only one user who uses such a workflow. - - An example: You visit some file in a buffer, edit it, and save the -changes. Then, outside of Emacs (or at least not using Magit or by -saving the buffer) you change the file on disk again. At this point the -buffer is the only place where the intermediate version still exists. -You have saved the changes to disk, but that has since been overwritten. -Meanwhile Emacs considers the buffer to be unmodified (because you have -not made any changes to it since you last saved it to the visited file) -and therefore would not object to it being automatically reverted. At -this point an Auto-Revert mode would kick in. It would check whether -the buffer is modified and since that is not the case it would revert -it. The intermediate version would be lost. (Actually you could still -get it back using the ‘undo’ command.) - - If your workflow depends on Emacs preserving the intermediate version -in the buffer, then you have to disable all Auto-Revert modes. But -please consider that such a workflow would be dangerous even without -using an Auto-Revert mode, and should therefore be avoided. If Emacs -crashes or if you quit Emacs by mistake, then you would also lose the -buffer content. There would be no autosave file still containing the -intermediate version (because that was deleted when you saved the -buffer) and you would not be asked whether you want to save the buffer -(because it isn’t modified). - - -File: magit.info, Node: Sections, Next: Transient Commands, Prev: Modes and Buffers, Up: Interface Concepts - -4.2 Sections -============ - -Magit buffers are organized into nested sections, which can be collapsed -and expanded, similar to how sections are handled in Org mode. Each -section also has a type, and some sections also have a value. For each -section type there can also be a local keymap, shared by all sections of -that type. - - Taking advantage of the section value and type, many commands operate -on the current section, or when the region is active and selects -sections of the same type, all of the selected sections. Commands that -only make sense for a particular section type (as opposed to just -behaving differently depending on the type) are usually bound in section -type keymaps. - -* Menu: - -* Section Movement:: -* Section Visibility:: -* Section Hooks:: -* Section Types and Values:: -* Section Options:: - - -File: magit.info, Node: Section Movement, Next: Section Visibility, Up: Sections - -4.2.1 Section Movement ----------------------- - -To move within a section use the usual keys (‘C-p’, ‘C-n’, ‘C-b’, ‘C-f’ -etc), whose global bindings are not shadowed. To move to another -section use the following commands. - -‘p’ (‘magit-section-backward’) - - When not at the beginning of a section, then move to the beginning - of the current section. At the beginning of a section, instead - move to the beginning of the previous visible section. - -‘n’ (‘magit-section-forward’) - - Move to the beginning of the next visible section. - -‘M-p’ (‘magit-section-backward-siblings’) - - Move to the beginning of the previous sibling section. If there is - no previous sibling section, then move to the parent section - instead. - -‘M-n’ (‘magit-section-forward-siblings’) - - Move to the beginning of the next sibling section. If there is no - next sibling section, then move to the parent section instead. - -‘^’ (‘magit-section-up’) - - Move to the beginning of the parent of the current section. - - The above commands all call the hook ‘magit-section-movement-hook’. -Any of the functions listed below can be used as members of this hook. - - You might want to remove some of the functions that Magit adds using -‘add-hook’. In doing so you have to make sure you do not attempt to -remove function that haven’t even been added yet, for example: - - (with-eval-after-load 'magit-diff - (remove-hook 'magit-section-movement-hook - 'magit-hunk-set-window-start)) - - -- Variable: magit-section-movement-hook - - This hook is run by all of the above movement commands, after - arriving at the destination. - - -- Function: magit-hunk-set-window-start - - This hook function ensures that the beginning of the current - section is visible, provided it is a ‘hunk’ section. Otherwise, it - does nothing. - - Loading ‘magit-diff’ adds this function to the hook. - - -- Function: magit-section-set-window-start - - This hook function ensures that the beginning of the current - section is visible, regardless of the section’s type. If you add - this to ‘magit-section-movement-hook’, then you must remove the - hunk-only variant in turn. - - -- Function: magit-log-maybe-show-more-commits - - This hook function only has an effect in log buffers, and ‘point’ - is on the "show more" section. If that is the case, then it - doubles the number of commits that are being shown. - - Loading ‘magit-log’ adds this function to the hook. - - -- Function: magit-log-maybe-update-revision-buffer - - When moving inside a log buffer, then this function updates the - revision buffer, provided it is already being displayed in another - window of the same frame. - - Loading ‘magit-log’ adds this function to the hook. - - -- Function: magit-log-maybe-update-blob-buffer - - When moving inside a log buffer and another window of the same - frame displays a blob buffer, then this function instead displays - the blob buffer for the commit at point in that window. - - -- Function: magit-status-maybe-update-revision-buffer - - When moving inside a status buffer, then this function updates the - revision buffer, provided it is already being displayed in another - window of the same frame. - - -- Function: magit-status-maybe-update-stash-buffer - - When moving inside a status buffer, then this function updates the - stash buffer, provided it is already being displayed in another - window of the same frame. - - -- Function: magit-status-maybe-update-blob-buffer - - When moving inside a status buffer and another window of the same - frame displays a blob buffer, then this function instead displays - the blob buffer for the commit at point in that window. - - -- Function: magit-stashes-maybe-update-stash-buffer - - When moving inside a buffer listing stashes, then this function - updates the stash buffer, provided it is already being displayed in - another window of the same frame. - - -- User Option: magit-update-other-window-delay - - Delay before automatically updating the other window. - - When moving around in certain buffers, then certain other buffers, - which are being displayed in another window, may optionally be - updated to display information about the section at point. - - When holding down a key to move by more than just one section, then - that would update that buffer for each section on the way. To - prevent that, updating the revision buffer is delayed, and this - option controls for how long. For optimal experience you might - have to adjust this delay and/or the keyboard repeat rate and delay - of your graphical environment or operating system. - - -File: magit.info, Node: Section Visibility, Next: Section Hooks, Prev: Section Movement, Up: Sections - -4.2.2 Section Visibility ------------------------- - -Magit provides many commands for changing the visibility of sections, -but all you need to get started are the next two. - -‘TAB’ (‘magit-section-toggle’) - - Toggle the visibility of the body of the current section. - -‘C-’ (‘magit-section-cycle’) - - Cycle the visibility of current section and its children. - -‘M-’ (‘magit-section-cycle-diffs’) - - Cycle the visibility of diff-related sections in the current - buffer. - -‘S-’ (‘magit-section-cycle-global’) - - Cycle the visibility of all sections in the current buffer. - -‘1’ (‘magit-section-show-level-1’) -‘2’ (‘magit-section-show-level-2’) -‘3’ (‘magit-section-show-level-3’) -‘4’ (‘magit-section-show-level-4’) - - Show sections surrounding the current section up to level N. - -‘M-1’ (‘magit-section-show-level-1-all’) -‘M-2’ (‘magit-section-show-level-2-all’) -‘M-3’ (‘magit-section-show-level-3-all’) -‘M-4’ (‘magit-section-show-level-4-all’) - - Show all sections up to level N. - - Some functions, which are used to implement the above commands, are -also exposed as commands themselves. By default no keys are bound to -these commands, as they are generally perceived to be much less useful. -But your mileage may vary. - - -- Command: magit-section-show - - Show the body of the current section. - - -- Command: magit-section-hide - - Hide the body of the current section. - - -- Command: magit-section-show-headings - - Recursively show headings of children of the current section. Only - show the headings. Previously shown text-only bodies are hidden. - - -- Command: magit-section-show-children - - Recursively show the bodies of children of the current section. - With a prefix argument show children down to the level of the - current section, and hide deeper children. - - -- Command: magit-section-hide-children - - Recursively hide the bodies of children of the current section. - - -- Command: magit-section-toggle-children - - Toggle visibility of bodies of children of the current section. - - When a buffer is first created then some sections are shown expanded -while others are not. This is hard coded. When a buffer is refreshed -then the previous visibility is preserved. The initial visibility of -certain sections can also be overwritten using the hook -‘magit-section-set-visibility-hook’. - - -- User Option: magit-section-initial-visibility-alist - - This options can be used to override the initial visibility of - sections. In the future it will also be used to define the - defaults, but currently a section’s default is still hardcoded. - - The value is an alist. Each element maps a section type or lineage - to the initial visibility state for such sections. The state has - to be one of ‘show’ or ‘hide’, or a function that returns one of - these symbols. A function is called with the section as the only - argument. - - Use the command ‘magit-describe-section-briefly’ to determine a - section’s lineage or type. The vector in the output is the section - lineage and the type is the first element of that vector. - Wildcards can be used, see ‘magit-section-match’. - - -- User Option: magit-section-cache-visibility - - This option controls for which sections the previous visibility - state should be restored if a section disappears and later appears - again. The value is a boolean or a list of section types. If t, - then the visibility of all sections is cached. Otherwise this is - only done for sections whose type matches one of the listed types. - - This requires that the function ‘magit-section-cached-visibility’ - is a member of ‘magit-section-set-visibility-hook’. - - -- Variable: magit-section-set-visibility-hook - - This hook is run when first creating a buffer and also when - refreshing an existing buffer, and is used to determine the - visibility of the section currently being inserted. - - Each function is called with one argument, the section being - inserted. It should return ‘hide’ or ‘show’, or to leave the - visibility undefined ‘nil’. If no function decides on the - visibility and the buffer is being refreshed, then the visibility - is preserved; or if the buffer is being created, then the hard - coded default is used. - - Usually this should only be used to set the initial visibility but - not during refreshes. If ‘magit-insert-section--oldroot’ is - non-nil, then the buffer is being refreshed and these functions - should immediately return ‘nil’. - - -- User Option: magit-section-visibility-indicator - - This option controls whether and how to indicate that a section can - be expanded/collapsed. - - If nil, then no visibility indicators are shown. Otherwise the - value has to have one of these two forms: - - • ‘(EXPANDABLE-BITMAP . COLLAPSIBLE-BITMAP)’ - - Both values have to be variables whose values are fringe - bitmaps. In this case every section that can be expanded or - collapsed gets an indicator in the left fringe. - - To provide extra padding around the indicator, set - ‘left-fringe-width’ in ‘magit-mode-hook’, e.g.: - - (add-hook 'magit-mode-hook (lambda () - (setq left-fringe-width 20))) - - • ‘(STRING . BOOLEAN)’ - - In this case STRING (usually an ellipsis) is shown at the end - of the heading of every collapsed section. Expanded sections - get no indicator. The cdr controls whether the appearance of - these ellipsis take section highlighting into account. Doing - so might potentially have an impact on performance, while not - doing so is kinda ugly. - - -File: magit.info, Node: Section Hooks, Next: Section Types and Values, Prev: Section Visibility, Up: Sections - -4.2.3 Section Hooks -------------------- - -Which sections are inserted into certain buffers is controlled with -hooks. This includes the status and the refs buffers. For other -buffers, e.g. log and diff buffers, this is not possible. The command -‘magit-describe-section’ can be used to see which hook (if any) was -responsible for inserting the section at point. - - For buffers whose sections can be customized by the user, a hook -variable called ‘magit-TYPE-sections-hook’ exists. This hook should be -changed using ‘magit-add-section-hook’. Avoid using ‘add-hooks’ or the -Custom interface. - - The various available section hook variables are described later in -this manual along with the appropriate "section inserter functions". - - -- Function: magit-add-section-hook hook function &optional at append - local - - Add the function FUNCTION to the value of section hook HOOK. - - Add FUNCTION at the beginning of the hook list unless optional - APPEND is non-nil, in which case FUNCTION is added at the end. If - FUNCTION already is a member then move it to the new location. - - If optional AT is non-nil and a member of the hook list, then add - FUNCTION next to that instead. Add before or after AT, or replace - AT with FUNCTION depending on APPEND. If APPEND is the symbol - ‘replace’, then replace AT with FUNCTION. For any other non-nil - value place FUNCTION right after AT. If nil, then place FUNCTION - right before AT. If FUNCTION already is a member of the list but - AT is not, then leave FUNCTION where ever it already is. - - If optional LOCAL is non-nil, then modify the hook’s buffer-local - value rather than its global value. This makes the hook local by - copying the default value. That copy is then modified. - - HOOK should be a symbol. If HOOK is void, it is first set to nil. - HOOK’s value must not be a single hook function. FUNCTION should - be a function that takes no arguments and inserts one or multiple - sections at point, moving point forward. FUNCTION may choose not - to insert its section(s), when doing so would not make sense. It - should not be abused for other side-effects. - - To remove a function from a section hook, use ‘remove-hook’. - - -File: magit.info, Node: Section Types and Values, Next: Section Options, Prev: Section Hooks, Up: Sections - -4.2.4 Section Types and Values ------------------------------- - -Each section has a type, for example ‘hunk’, ‘file’, and ‘commit’. -Instances of certain section types also have a value. The value of a -section of type ‘file’, for example, is a file name. - - Users usually do not have to worry about a section’s type and value, -but knowing them can be handy at times. - -‘M-x magit-describe-section-briefly’ (‘magit-describe-section-briefly’) - - Show information about the section at point in the echo area, as - "#". - - Many commands behave differently depending on the type of the section -at point and/or somehow consume the value of that section. But that is -only one of the reasons why the same key may do something different, -depending on what section is current. - - Additionally for each section type a keymap *might* be defined, named -‘magit-TYPE-section-map’. That keymap is used as text property keymap -of all text belonging to any section of the respective type. If such a -map does not exist for a certain type, then you can define it yourself, -and it will automatically be used. - - -File: magit.info, Node: Section Options, Prev: Section Types and Values, Up: Sections - -4.2.5 Section Options ---------------------- - -This section describes options that have an effect on more than just a -certain type of sections. As you can see there are not many of those. - - -- User Option: magit-section-show-child-count - - Whether to append the number of children to section headings. This - only affects sections that could benefit from this information. - - -File: magit.info, Node: Transient Commands, Next: Transient Arguments and Buffer Variables, Prev: Sections, Up: Interface Concepts - -4.3 Transient Commands -====================== - -Many Magit commands are implemented as *transient* commands. First the -user invokes a *prefix* command, which causes its *infix* arguments and -*suffix* commands to be displayed in the echo area. The user then -optionally sets some infix arguments and finally invokes one of the -suffix commands. - - This is implemented in the library ‘transient’. Earlier Magit -releases used the package ‘magit-popup’ and even earlier versions -library ‘magit-key-mode’. - - Transient is documented in *note (transient)Top::. - -‘C-c C-c’ (‘magit-dispatch’) - - This transient prefix command binds most of Magit’s other prefix - commands as suffix commands and displays them in a temporary buffer - until one of them is invoked. Invoking such a sub-prefix causes - the suffixes of that command to be bound and displayed instead of - those of ‘magit-dispatch’. - - This command is also, or especially, useful outside Magit buffers, so -you should setup a global binding: - - (global-set-key (kbd "C-x M-g") 'magit-dispatch) - - -File: magit.info, Node: Transient Arguments and Buffer Variables, Next: Completion Confirmation and the Selection, Prev: Transient Commands, Up: Interface Concepts - -4.4 Transient Arguments and Buffer Variables -============================================ - -The infix arguments of many of Magit’s transient prefix commands cease -to have an effect once the ‘git’ command that is called with those -arguments has returned. Commands that create a commit are a good -example for this. If the user changes the arguments, then that only -affects the next invocation of a suffix command. If the same transient -prefix command is later invoked again, then the arguments are initially -reset to the default value. This default value can be set for the -current Emacs session or saved permanently, see *note (transient)Saving -Values::. It is also possible to cycle through previously used sets of -arguments using ‘M-p’ and ‘M-n’, see *note (transient)Using History::. - - However the infix arguments of many other transient commands continue -to have an effect even after the ‘git’ command that was called with -those arguments has returned. The most important commands like this are -those that display a diff or log in a dedicated buffer. Their arguments -obviously continue to have an effect for as long as the respective diff -or log is being displayed. Furthermore the used arguments are stored in -buffer-local variables for future reference. - - For commands in the second group it isn’t always desirable to reset -their arguments to the global value when the transient prefix command is -invoked again. - - As mentioned above, it is possible to cycle through previously used -sets of arguments while a transient popup is visible. That means that -we could always reset the infix arguments to the default because the set -of arguments that is active in the existing buffer is only a few ‘M-p’ -away. Magit can be configured to behave like that, but because I expect -that most users would not find that very convenient, it is not the -default. - - Also note that it is possible to change the diff and log arguments -used in the current buffer (including the status buffer, which contains -both diff and log sections) using the respective "refresh" transient -prefix commands on ‘D’ and ‘L’. (‘d’ and ‘l’ on the other hand are -intended to change *what* diff or log is being displayed. It is -possible to also change *how* the diff or log is being displayed at the -same time, but if you only want to do the latter, then you should use -the refresh variants.) Because these secondary diff and log transient -prefixes are about *changing* the arguments used in the current buffer, -they *always* start out with the set of arguments that are currently in -effect in that buffer. - - Some commands are usually invoked directly even though they can also -be invoked as the suffix of a transient prefix command. Most -prominently ‘magit-show-commit’ is usually invoked by typing ‘RET’ while -point is on a commit in a log, but it can also be invoked from the -‘magit-diff’ transient prefix. - - When such a command is invoked directly, then it is important to -reuse the arguments as specified by the respective buffer-local values, -instead of using the default arguments. Imagine you press ‘RET’ in a -log to display the commit at point in a different buffer and then use -‘D’ to change how the diff is displayed in that buffer. And then you -press ‘RET’ on another commit to show that instead and the diff -arguments are reset to the default. Not cool; so Magit does not do that -by default. - - -- User Option: magit-prefix-use-buffer-arguments - - This option controls whether the infix arguments initially shown in - certain transient prefix commands are based on the arguments that - are currently in effect in the buffer that their suffixes update. - - The ‘magit-diff’ and ‘magit-log’ transient prefix commands are - affected by this option. - - -- User Option: magit-direct-use-buffer-arguments - - This option controls whether certain commands, when invoked - directly (i.e. not as the suffix of a transient prefix command), - use the arguments that are currently active in the buffer that they - are about to update. The alternative is to use the default value - for these arguments, which might change the arguments that are used - in the buffer. - -Valid values for both of the above options are: - - • ‘always’: Always use the set of arguments that is currently active - in the respective buffer, provided that buffer exists of course. - - • ‘selected’ or ‘t’: Use the set of arguments from the respective - buffer, but only if it is displayed in a window of the current - frame. This is the default for both variables. - - • ‘current’: Use the set of arguments from the respective buffer, but - only if it is the current buffer. - - • ‘never’: Never use the set of arguments from the respective buffer. - -I am afraid it gets more complicated still: - - • The global diff and log arguments are set for each support mode - individually. The diff arguments for example have different values - in ‘magit-diff-mode’, ‘magit-revision-mode’, - ‘magit-merge-preview-mode’ and ‘magit-status-mode’ buffers. - Setting or saving the value for one mode does not change the value - for other modes. The history however is shared. - - • When ‘magit-show-commit’ is invoked directly from a log buffer, - then the file filter is picked up from that buffer, not from the - revision buffer and or the mode’s global diff arguments. - - • Even though they are suffixes of the diff prefix - ‘magit-show-commit’ and ‘magit-stash-show’ do not use the diff - buffer used by the diff commands, instead they use the dedicated - revision and stash buffers. - - At the time you invoke the diff prefix it is unknown to Magit which - of the suffix commands you are going to invoke. While not certain, - more often than not users invoke one of the commands that use the - diff buffer, so the initial infix arguments are those used in that - buffer. However if you invoke one of these commands directly, then - Magit knows that it should use the arguments from the revision - resp. stash buffer. - - • The log prefix also features reflog commands, but these commands do - not use the log arguments. - - • If ‘magit-show-refs’ is invoked from a ‘magit-refs-mode’ buffer, - then it acts as a refresh prefix and therefore unconditionally uses - the buffer’s arguments as initial arguments. If it is invoked - elsewhere with a prefix argument, then it acts as regular prefix - and therefore respects ‘magit-prefix-use-buffer-arguments’. If it - is invoked elsewhere without a prefix argument, then it acts as a - direct command and therefore respects - ‘magit-direct-use-buffer-arguments’. - - -File: magit.info, Node: Completion Confirmation and the Selection, Next: Running Git, Prev: Transient Arguments and Buffer Variables, Up: Interface Concepts - -4.5 Completion, Confirmation and the Selection -============================================== - -* Menu: - -* Action Confirmation:: -* Completion and Confirmation:: -* The Selection:: -* The hunk-internal region:: -* Support for Completion Frameworks:: -* Additional Completion Options:: - - -File: magit.info, Node: Action Confirmation, Next: Completion and Confirmation, Up: Completion Confirmation and the Selection - -4.5.1 Action Confirmation -------------------------- - -By default many actions that could potentially lead to data loss have to -be confirmed. This includes many very common actions, so this can -quickly become annoying. Many of these actions can be undone and if you -have thought about how to undo certain mistakes, then it should be safe -to disable confirmation for the respective actions. - - The option ‘magit-no-confirm’ can be used to tell Magit to perform -certain actions without the user having to confirm them. Note that -while this option can only be used to disable confirmation for a -specific set of actions, the next section explains another way of -telling Magit to ask fewer questions. - - -- User Option: magit-no-confirm - - The value of this option is a list of symbols, representing actions - that do not have to be confirmed by the user before being carried - out. - - By default many potentially dangerous commands ask the user for - confirmation. Each of the below symbols stands for an action - which, when invoked unintentionally or without being fully aware of - the consequences, could lead to tears. In many cases there are - several commands that perform variations of a certain action, so we - don’t use the command names but more generic symbols. - - • Applying changes: - - • ‘discard’ Discarding one or more changes (i.e. hunks or - the complete diff for a file) loses that change, - obviously. - - • ‘reverse’ Reverting one or more changes can usually be - undone by reverting the reversion. - - • ‘stage-all-changes’, ‘unstage-all-changes’ When there are - both staged and unstaged changes, then un-/staging - everything would destroy that distinction. Of course - that also applies when un-/staging a single change, but - then less is lost and one does that so often that having - to confirm every time would be unacceptable. - - • Files: - - • ‘delete’ When a file that isn’t yet tracked by Git is - deleted, then it is completely lost, not just the last - changes. Very dangerous. - - • ‘trash’ Instead of deleting a file it can also be move to - the system trash. Obviously much less dangerous than - deleting it. - - Also see option ‘magit-delete-by-moving-to-trash’. - - • ‘resurrect’ A deleted file can easily be resurrected by - "deleting" the deletion, which is done using the same - command that was used to delete the same file in the - first place. - - • ‘untrack’ Untracking a file can be undone by tracking it - again. - - • ‘rename’ Renaming a file can easily be undone. - - • Sequences: - - • ‘reset-bisect’ Aborting (known to Git as "resetting") a - bisect operation loses all information collected so far. - - • ‘abort-rebase’ Aborting a rebase throws away all already - modified commits, but it’s possible to restore those from - the reflog. - - • ‘abort-merge’ Aborting a merge throws away all conflict - resolutions which have already been carried out by the - user. - - • ‘merge-dirty’ Merging with a dirty worktree can make it - hard to go back to the state before the merge was - initiated. - - • References: - - • ‘delete-unmerged-branch’ Once a branch has been deleted, - it can only be restored using low-level recovery tools - provided by Git. And even then the reflog is gone. The - user always has to confirm the deletion of a branch by - accepting the default choice (or selecting another - branch), but when a branch has not been merged yet, also - make sure the user is aware of that. - - • ‘delete-pr-remote’ When deleting a branch that was - created from a pull-request and if no other branches - still exist on that remote, then ‘magit-branch-delete’ - offers to delete the remote as well. This should be safe - because it only happens if no other refs exist in the - remotes namespace, and you can recreate the remote if - necessary. - - • ‘drop-stashes’ Dropping a stash is dangerous because Git - stores stashes in the reflog. Once a stash is removed, - there is no going back without using low-level recovery - tools provided by Git. When a single stash is dropped, - then the user always has to confirm by accepting the - default (or selecting another). This action only - concerns the deletion of multiple stashes at once. - - • Edit published history: - - Without adding these symbols here, you will be warned before - editing commits that have already been pushed to one of the - branches listed in ‘magit-published-branches’. - - • ‘amend-published’ Affects most commands that amend to - "HEAD". - - • ‘rebase-published’ Affects commands that perform - interactive rebases. This includes commands from the - commit transient that modify a commit other than "HEAD", - namely the various fixup and squash variants. - - • ‘edit-published’ Affects the commands - ‘magit-edit-line-commit’ and - ‘magit-diff-edit-hunk-commit’. These two commands make - it quite easy to accidentally edit a published commit, so - you should think twice before configuring them not to ask - for confirmation. - - To disable confirmation completely, add all three symbols here - or set ‘magit-published-branches’ to ‘nil’. - - • Various: - - • ‘kill-process’ There seldom is a reason to kill a - process. - - • Global settings: - - Instead of adding all of the above symbols to the value of - this option, you can also set it to the atom ‘t’, which has - the same effect as adding all of the above symbols. Doing - that most certainly is a bad idea, especially because other - symbols might be added in the future. So even if you don’t - want to be asked for confirmation for any of these actions, - you are still better of adding all of the respective symbols - individually. - - When ‘magit-wip-before-change-mode’ is enabled, then the - following actions can be undone fairly easily: ‘discard’, - ‘reverse’, ‘stage-all-changes’, and ‘unstage-all-changes’. If - and only if this mode is enabled, then ‘safe-with-wip’ has the - same effect as adding all of these symbols individually. - - -File: magit.info, Node: Completion and Confirmation, Next: The Selection, Prev: Action Confirmation, Up: Completion Confirmation and the Selection - -4.5.2 Completion and Confirmation ---------------------------------- - -Many Magit commands ask the user to select from a list of possible -things to act on, while offering the most likely choice as the default. -For many of these commands the default is the thing at point, provided -that it actually is a valid thing to act on. For many commands that act -on a branch, the current branch serves as the default if there is no -branch at point. - - These commands combine asking for confirmation and asking for a -target to act on into a single action. The user can confirm the default -target using ‘RET’ or abort using ‘C-g’. This is similar to a -‘y-or-n-p’ prompt, but the keys to confirm or abort differ. - - At the same time the user is also given the opportunity to select -another target, which is useful because for some commands and/or in some -situations you might want to select the action before selecting the -target by moving to it. - - However you might find that for some commands you always want to use -the default target, if any, or even that you want the command to act on -the default without requiring any confirmation at all. The option -‘magit-dwim-selection’ can be used to configure certain commands to that -effect. - - Note that when the region is active then many commands act on the -things that are selected using a mechanism based on the region, in many -cases after asking for confirmation. This region-based mechanism is -called the "selection" and is described in detail in the next section. -When a selection exists that is valid for the invoked command, then that -command never offers to act on something else, and whether it asks for -confirmation is not controlled by this option. - - Also note that Magit asks for confirmation of certain actions that -are not coupled with completion (or the selection). Such dialogs are -also not affected by this option and are described in the previous -section. - - -- User Option: magit-dwim-selection - - This option can be used to tell certain commands to use the thing at -point instead of asking the user to select a candidate to act on, with -or without confirmation. - - The value has the form ‘((COMMAND nil|PROMPT DEFAULT)...)’. - - • COMMAND is the command that should not prompt for a choice. To - have an effect, the command has to use the function - ‘magit-completing-read’ or a utility function which in turn uses - that function. - - • If the command uses ‘magit-completing-read’ multiple times, then - PROMPT can be used to only affect one of these uses. PROMPT, if - non-nil, is a regular expression that is used to match against the - PROMPT argument passed to ‘magit-completing-read’. - - • DEFAULT specifies how to use the default. If it is ‘t’, then the - DEFAULT argument passed to ‘magit-completing-read’ is used without - confirmation. If it is ‘ask’, then the user is given a chance to - abort. DEFAULT can also be ‘nil’, in which case the entry has no - effect. - - -File: magit.info, Node: The Selection, Next: The hunk-internal region, Prev: Completion and Confirmation, Up: Completion Confirmation and the Selection - -4.5.3 The Selection -------------------- - -If the region is active, then many Magit commands act on the things that -are selected using a mechanism based on the region instead of one single -thing. When the region is not active, then these commands act on the -thing at point or read a single thing to act on. This is described in -the previous section — this section only covers how multiple things are -selected, how that is visualized, and how certain commands behave when -that is the case. - - Magit’s mechanism for selecting multiple things, or rather sections -that represent these things, is based on the Emacs region, but the area -that Magit considers to be selected is typically larger than the region -and additional restrictions apply. - - Magit makes a distinction between a region that qualifies as forming -a valid Magit selection and a region that does not. If the region does -not qualify, then it is displayed as it is in other Emacs buffers. If -the region does qualify as a Magit selection, then the selection is -always visualized, while the region itself is only visualized if it -begins and ends on the same line. - - For a region to qualify as a Magit selection, it must begin in the -heading of one section and end in the heading of a sibling section. -Note that if the end of the region is at the very beginning of section -heading (i.e. at the very beginning of a line) then that section is -considered to be *inside* the selection. - - This is not consistent with how the region is normally treated in -Emacs — if the region ends at the beginning of a line, then that line is -outside the region. Due to how Magit visualizes the selection, it -should be obvious that this difference exists. - - Not every command acts on every valid selection. Some commands do -not even consider the location of point, others may act on the section -at point but not support acting on the selection, and even commands that -do support the selection of course only do so if it selects things that -they can act on. - - This is the main reason why the selection must include the section at -point. Even if a selection exists, the invoked command may disregard -it, in which case it may act on the current section only. It is much -safer to only act on the current section but not the other selected -sections than it is to act on the current section *instead* of the -selected sections. The latter would be much more surprising and if the -current section always is part of the selection, then that cannot -happen. - - -- Variable: magit-keep-region-overlay - - This variable controls whether the region is visualized as usual - even when a valid Magit selection or a hunk-internal region exists. - See the doc-string for more information. - - -File: magit.info, Node: The hunk-internal region, Next: Support for Completion Frameworks, Prev: The Selection, Up: Completion Confirmation and the Selection - -4.5.4 The hunk-internal region ------------------------------- - -Somewhat related to the Magit selection described in the previous -section is the hunk-internal region. - - Like the selection, the hunk-internal region is based on the Emacs -region but causes that region to not be visualized as it would in other -Emacs buffers, and includes the line on which the region ends even if it -ends at the very beginning of that line. - - Unlike the selection, which is based on a region that must begin in -the heading of one section and ends in the section of a sibling section, -the hunk-internal region must begin inside the *body* of a hunk section -and end in the body of the *same* section. - - The hunk-internal region is honored by "apply" commands, which can, -among other targets, act on a hunk. If the hunk-internal region is -active, then such commands act only on the marked part of the hunk -instead of on the complete hunk. - - -File: magit.info, Node: Support for Completion Frameworks, Next: Additional Completion Options, Prev: The hunk-internal region, Up: Completion Confirmation and the Selection - -4.5.5 Support for Completion Frameworks ---------------------------------------- - -The built-in option ‘completing-read-function’ specifies the low-level -function used by ‘completing-read’ to ask a user to select from a list -of choices. Its default value is ‘completing-read-default’. -Alternative completion frameworks typically activate themselves by -substituting their own implementation. - - Mostly for historic reasons Magit provides a similar option named -‘magit-completing-read-function’, which only controls the low-level -function used by ‘magit-completing-read’. This option also makes it -possible to use a different completing mechanism for Magit than for the -rest of Emacs, but doing that is not recommend. - - You most likely don’t have to customize the magit-specific option to -use an alternative completion framework. For example, if you enable -‘ivy-mode’, then Magit will respect that, and if you enable ‘helm-mode’, -then you are done too. - - However if you want to use Ido, then ‘ido-mode’ won’t do the trick. -You will also have to install the ‘ido-completing-read+’ package and use -‘magit-ido-completing-read’ as ‘magit-completing-read-function’. - - -- User Option: magit-completing-read-function - - The value of this variable is the low-level function used to - perform completion by code that uses ‘magit-completing-read’ (as - opposed to the built-in ‘completing-read’). - - The default value, ‘magit-builtin-completing-read’, is suitable for - the standard completion mechanism, ‘ivy-mode’, and ‘helm-mode’ at - least. - - The built-in ‘completing-read’ and ‘completing-read-default’ are - *not* suitable to be used here. ‘magit-builtin-completing-read’ - performs some additional work, and any function used in its place - has to do the same. - - -- Function: magit-builtin-completing-read prompt choices &optional - predicate require-match initial-input hist def - - This function performs completion using the built-in - ‘completing-read’ and does some additional magit-specific work. - - -- Function: magit-ido-completing-read prompt choices &optional - predicate require-match initial-input hist def - - This function performs completion using ‘ido-completing-read+’ from - the package by the same name (which you have to explicitly install) - and does some additional magit-specific work. - - We have to use ‘ido-completing-read+’ instead of the - ‘ido-completing-read’ that comes with Ido itself, because the - latter, while intended as a drop-in replacement, cannot serve that - purpose because it violates too many of the implicit conventions. - - -- Function: magit-completing-read prompt choices &optional predicate - require-match initial-input hist def fallback - - This is the function that Magit commands use when they need the - user to select a single thing to act on. The arguments have the - same meaning as for ‘completing-read’, except for FALLBACK, which - is unique to this function and is described below. - - Instead of asking the user to choose from a list of possible - candidates, this function may just return the default specified by - DEF, with or without requiring user confirmation. Whether that is - the case depends on PROMPT, ‘this-command’ and - ‘magit-dwim-selection’. See the documentation of the latter for - more information. - - If it does read a value in the minibuffer, then this function acts - similar to ‘completing-read’, except for the following: - - • COLLECTION must be a list of choices. A function is not - supported. - - • If REQUIRE-MATCH is ‘nil’ and the user exits without a choice, - then ‘nil’ is returned instead of an empty string. - - • If REQUIRE-MATCH is non-nil and the users exits without a - choice, an user-error is raised. - - • FALLBACK specifies a secondary default that is only used if - the primary default DEF is ‘nil’. The secondary default is - not subject to ‘magit-dwim-selection’ — if DEF is ‘nil’ but - FALLBACK is not, then this function always asks the user to - choose a candidate, just as if both defaults were ‘nil’. - - • ": " is appended to PROMPT. - - • PROMPT is modified to end with \" (default DEF|FALLBACK): \" - provided that DEF or FALLBACK is non-nil, that neither - ‘ivy-mode’ nor ‘helm-mode’ is enabled, and that - ‘magit-completing-read-function’ is set to its default value - of ‘magit-builtin-completing-read’. - - -File: magit.info, Node: Additional Completion Options, Prev: Support for Completion Frameworks, Up: Completion Confirmation and the Selection - -4.5.6 Additional Completion Options ------------------------------------ - - -- User Option: magit-list-refs-sortby - - For many commands that read a ref or refs from the user, the value - of this option can be used to control the order of the refs. Valid - values include any key accepted by the ‘--sort’ flag of ‘git - for-each-ref’. By default, refs are sorted alphabetically by their - full name (e.g., "refs/heads/master"). - - -File: magit.info, Node: Running Git, Prev: Completion Confirmation and the Selection, Up: Interface Concepts - -4.6 Running Git -=============== - -* Menu: - -* Viewing Git Output:: -* Git Process Status:: -* Running Git Manually:: -* Git Executable:: -* Global Git Arguments:: - - -File: magit.info, Node: Viewing Git Output, Next: Git Process Status, Up: Running Git - -4.6.1 Viewing Git Output ------------------------- - -Magit runs Git either for side-effects (e.g. when pushing) or to get -some value (e.g. the name of the current branch). - - When Git is run for side-effects, the process output is logged in a -per-repository log buffer, which can be consulted using the -‘magit-process’ command when things don’t go as expected. - - The output/errors for up to ‘magit-process-log-max’ Git commands are -retained. - -‘$’ (‘magit-process’) - - This commands displays the process buffer for the current - repository. - - Inside that buffer, the usual key bindings for navigating and showing -sections are available. There is one additional command. - -‘k’ (‘magit-process-kill’) - - This command kills the process represented by the section at point. - - -- User Option: magit-git-debug - - When this is non-nil then the output of all calls to git are logged - in the process buffer. This is useful when debugging, otherwise it - just negatively affects performance. - - -File: magit.info, Node: Git Process Status, Next: Running Git Manually, Prev: Viewing Git Output, Up: Running Git - -4.6.2 Git Process Status ------------------------- - -When a Git process is running for side-effects, Magit displays an -indicator in the mode line, using the ‘magit-mode-line-process’ face. - - If the Git process exits successfully, the process indicator is -removed from the mode line immediately. - - In the case of a Git error, the process indicator is not removed, but -is instead highlighted with the ‘magit-mode-line-process-error’ face, -and the error details from the process buffer are provided as a tooltip -for mouse users. This error indicator persists in the mode line until -the next magit buffer refresh. - - If you do not wish process errors to be indicated in the mode line, -customize the ‘magit-process-display-mode-line-error’ user option. - - Process errors are additionally indicated at the top of the status -buffer. - - -File: magit.info, Node: Running Git Manually, Next: Git Executable, Prev: Git Process Status, Up: Running Git - -4.6.3 Running Git Manually --------------------------- - -While Magit provides many Emacs commands to interact with Git, it does -not cover everything. In those cases your existing Git knowledge will -come in handy. Magit provides some commands for running arbitrary Git -commands by typing them into the minibuffer, instead of having to switch -to a shell. - -‘!’ (‘magit-run’) - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -‘! !’ (‘magit-git-command-topdir’) - - This command reads a command from the user and executes it in the - top-level directory of the current working tree. - - The string "git " is used as initial input when prompting the user - for the command. It can be removed to run another command. - -‘! p’ (‘magit-git-command’) - - This command reads a command from the user and executes it in - ‘default-directory’. With a prefix argument the command is - executed in the top-level directory of the current working tree - instead. - - The string "git " is used as initial input when prompting the user - for the command. It can be removed to run another command. - -‘! s’ (‘magit-shell-command-topdir’) - - This command reads a command from the user and executes it in the - top-level directory of the current working tree. - -‘! S’ (‘magit-shell-command’) - - This command reads a command from the user and executes it in - ‘default-directory’. With a prefix argument the command is - executed in the top-level directory of the current working tree - instead. - - -- User Option: magit-shell-command-verbose-prompt - - Whether the prompt, used by the above commands when reading a shell - command, shows the directory in which it will be run. - - These suffix commands start external gui tools. - -‘! k’ (‘magit-run-gitk’) - - This command runs ‘gitk’ in the current repository. - -‘! a’ (‘magit-run-gitk-all’) - - This command runs ‘gitk --all’ in the current repository. - -‘! b’ (‘magit-run-gitk-branches’) - - This command runs ‘gitk --branches’ in the current repository. - -‘! g’ (‘magit-run-git-gui’) - - This command runs ‘git gui’ in the current repository. - - -File: magit.info, Node: Git Executable, Next: Global Git Arguments, Prev: Running Git Manually, Up: Running Git - -4.6.4 Git Executable --------------------- - -Except on MS Windows, Magit defaults to running Git without specifying -the path to the git executable. Instead the first executable found by -Emacs on ‘exec-path’ is used (whose value in turn is set based on the -value of the environment variable ‘$PATH’ when Emacs was started). - - This has the advantage that it continues to work even when using -Tramp to connect to a remote machine on which the executable is found in -a different place. The downside is that if you have multiple versions -of Git installed, then you might end up using another version than the -one you think you are using. - -‘M-x magit-version’ (‘magit-version’) - - This command shows the currently used versions of Magit, Git, and - Emacs in the echo area. Non-interactively this just returns the - Magit version. - - When the ‘system-type’ is ‘windows-nt’, then ‘magit-git-executable’ -is set to an absolute path when Magit is first loaded. This is -necessary because Git on that platform comes with several wrapper -scripts for the actual git binary, which are also placed on ‘$PATH’, and -using one of these wrappers instead of the binary would degrade -performance horribly. - - If Magit doesn’t find the correct executable then you *can* work -around that by setting ‘magit-git-executable’ to an absolute path. But -note that doing so is a kludge. It is better to make sure the order in -the environment variable ‘$PATH’ is correct, and that Emacs is started -with that environment in effect. The command -‘magit-debug-git-executable’ can be useful to find out where Emacs is -searching for git. If you have to connect from Windows to a non-Windows -machine, then you must change the value to "git". - - -- User Option: magit-git-executable - - The git executable used by Magit, either the full path to the - executable or the string "git" to let Emacs find the executable - itself, using the standard mechanism for doing such things. - -‘M-x magit-debug-git-executable’ (‘magit-debug-git-executable’) - - Display a buffer with information about ‘magit-git-executable’. - - -File: magit.info, Node: Global Git Arguments, Prev: Git Executable, Up: Running Git - -4.6.5 Global Git Arguments --------------------------- - - -- User Option: magit-git-global-arguments - - The arguments set here are used every time the git executable is - run as a subprocess. They are placed right after the executable - itself and before the git command - as in ‘git HERE... COMMAND - REST’. For valid arguments see *note (gitman)git::. - - Be careful what you add here, especially if you are using Tramp to - connect to servers with ancient Git versions. Never remove - anything that is part of the default value, unless you really know - what you are doing. And think very hard before adding something; - it will be used every time Magit runs Git for any purpose. - - -File: magit.info, Node: Inspecting, Next: Manipulating, Prev: Interface Concepts, Up: Top - -5 Inspecting -************ - -The functionality provided by Magit can be roughly divided into three -groups: inspecting existing data, manipulating existing data or adding -new data, and transferring data. Of course that is a rather crude -distinction that often falls short, but it’s more useful than no -distinction at all. This section is concerned with inspecting data, the -next two with manipulating and transferring it. Then follows a section -about miscellaneous functionality, which cannot easily be fit into this -distinction. - - Of course other distinctions make sense too, e.g. Git’s distinction -between porcelain and plumbing commands, which for the most part is -equivalent to Emacs’ distinction between interactive commands and -non-interactive functions. All of the sections mentioned before are -mainly concerned with the porcelain – Magit’s plumbing layer is -described later. - -* Menu: - -* Status Buffer:: -* Repository List:: -* Logging:: -* Diffing:: -* Ediffing:: -* References Buffer:: -* Bisecting:: -* Visiting Files and Blobs:: -* Blaming:: - - -File: magit.info, Node: Status Buffer, Next: Repository List, Up: Inspecting - -5.1 Status Buffer -================= - -While other Magit buffers contain e.g. one particular diff or one -particular log, the status buffer contains the diffs for staged and -unstaged changes, logs for unpushed and unpulled commits, lists of -stashes and untracked files, and information related to the current -branch. - - During certain incomplete operations – for example when a merge -resulted in a conflict – additional information is displayed that helps -proceeding with or aborting the operation. - - The command ‘magit-status’ displays the status buffer belonging to -the current repository in another window. This command is used so often -that it should be bound globally. We recommend using ‘C-x g’: - - (global-set-key (kbd "C-x g") 'magit-status) - -‘C-x g’ (‘magit-status’) - - When invoked from within an existing Git repository, then this - command shows the status of that repository in a buffer. - - If the current directory isn’t located within a Git repository, - then this command prompts for an existing repository or an - arbitrary directory, depending on the option - ‘magit-repository-directories’, and the status for the selected - repository is shown instead. - - • If that option specifies any existing repositories, then the - user is asked to select one of them. - - • Otherwise the user is asked to select an arbitrary directory - using regular file-name completion. If the selected directory - is the top-level directory of an existing working tree, then - the status buffer for that is shown. - - • Otherwise the user is offered to initialize the selected - directory as a new repository. After creating the repository - its status buffer is shown. - - These fallback behaviors can also be forced using one or more - prefix arguments: - - • With two prefix arguments (or more precisely a numeric prefix - value of 16 or greater) an arbitrary directory is read, which - is then acted on as described above. The same could be - accomplished using the command ‘magit-init’. - - • With a single prefix argument an existing repository is read - from the user, or if no repository can be found based on the - value of ‘magit-repository-directories’, then the behavior is - the same as with two prefix arguments. - - -- User Option: magit-repository-directories - - List of directories that are Git repositories or contain Git - repositories. - - Each element has the form ‘(DIRECTORY . DEPTH)’. DIRECTORY has to - be a directory or a directory file-name, a string. DEPTH, an - integer, specifies the maximum depth to look for Git repositories. - If it is 0, then only add DIRECTORY itself. - - This option controls which repositories are being listed by - ‘magit-list-repositories’. It also affects ‘magit-status’ (which - see) in potentially surprising ways (see above). - - -- Command: ido-enter-magit-status - - From an Ido prompt used to open a file, instead drop into - ‘magit-status’. This is similar to ‘ido-magic-delete-char’, which, - despite its name, usually causes a Dired buffer to be created. - - To make this command available, use something like: - - (add-hook 'ido-setup-hook - (lambda () - (define-key ido-completion-map - (kbd \"C-x g\") 'ido-enter-magit-status))) - - Starting with Emacs 25.1 the Ido keymaps are defined just once - instead of every time Ido is invoked, so now you can modify it like - pretty much every other keymap: - - (define-key ido-common-completion-map - (kbd \"C-x g\") 'ido-enter-magit-status) - -* Menu: - -* Status Sections:: -* Status Header Sections:: -* Status Module Sections:: -* Status Options:: - - -File: magit.info, Node: Status Sections, Next: Status Header Sections, Up: Status Buffer - -5.1.1 Status Sections ---------------------- - -The contents of status buffers is controlled using the hook -‘magit-status-sections-hook’. See *note Section Hooks:: to learn about -such hooks and how to customize them. - - -- User Option: magit-status-sections-hook - - Hook run to insert sections into a status buffer. - - The first function on that hook by default is -‘magit-insert-status-headers’; it is described in the next section. By -default the following functions are also members of that hook: - - -- Function: magit-insert-merge-log - - Insert section for the on-going merge. Display the heads that are - being merged. If no merge is in progress, do nothing. - - -- Function: magit-insert-rebase-sequence - - Insert section for the on-going rebase sequence. If no such - sequence is in progress, do nothing. - - -- Function: magit-insert-am-sequence - - Insert section for the on-going patch applying sequence. If no - such sequence is in progress, do nothing. - - -- Function: magit-insert-sequencer-sequence - - Insert section for the on-going cherry-pick or revert sequence. If - no such sequence is in progress, do nothing. - - -- Function: magit-insert-bisect-output - - While bisecting, insert section with output from ‘git bisect’. - - -- Function: magit-insert-bisect-rest - - While bisecting, insert section visualizing the bisect state. - - -- Function: magit-insert-bisect-log - - While bisecting, insert section logging bisect progress. - - -- Function: magit-insert-untracked-files - - Maybe insert a list or tree of untracked files. - - Do so depending on the value of ‘status.showUntrackedFiles’. Note - that even if the value is ‘all’, Magit still initially only shows - directories. But the directory sections can then be expanded using - ‘TAB’. - - -- Function: magit-insert-unstaged-changes - - Insert section showing unstaged changes. - - -- Function: magit-insert-staged-changes - - Insert section showing staged changes. - - -- Function: magit-insert-stashes &optional ref heading - - Insert the ‘stashes’ section showing reflog for "refs/stash". If - optional REF is non-nil show reflog for that instead. If optional - HEADING is non-nil use that as section heading instead of - "Stashes:". - - -- Function: magit-insert-unpulled-from-upstream - - Insert section showing commits that haven’t been pulled from the - upstream branch yet. - - -- Function: magit-insert-unpulled-from-pushremote - - Insert section showing commits that haven’t been pulled from the - push-remote branch yet. - - -- Function: magit-insert-unpushed-to-upstream - - Insert section showing commits that haven’t been pushed to the - upstream yet. - - -- Function: magit-insert-unpushed-to-pushremote - - Insert section showing commits that haven’t been pushed to the - push-remote yet. - - The following functions can also be added to the above hook: - - -- Function: magit-insert-tracked-files - - Insert a tree of tracked files. - - -- Function: magit-insert-ignored-files - - Insert a tree of ignored files. Its possible to limit the logs in - the current buffer to a certain directory using ‘D = f - RET g’. If you do that, then that that also affects this command. - - The log filter can be used to limit to multiple files. In that - case this function only respects the first of the files and only if - it is a directory. - - -- Function: magit-insert-skip-worktree-files - - Insert a tree of skip-worktree files. If the first element of - ‘magit-buffer-diff-files’ is a directory, then limit the list to - files below that. The value of that variable can be set using ‘D - -- DIRECTORY RET g’. - - -- Function: magit-insert-assumed-unchanged-files - - Insert a tree of files that are assumed to be unchanged. If the - first element of ‘magit-buffer-diff-files’ is a directory, then - limit the list to files below that. The value of that variable can - be set using ‘D -- DIRECTORY RET g’. - - -- Function: magit-insert-unpulled-or-recent-commits - - Insert section showing unpulled or recent commits. If an upstream - is configured for the current branch and it is ahead of the current - branch, then show the missing commits. Otherwise, show the last - ‘magit-log-section-commit-count’ commits. - - -- Function: magit-insert-recent-commits - - Insert section showing the last ‘magit-log-section-commit-count’ - commits. - - -- User Option: magit-log-section-commit-count - - How many recent commits ‘magit-insert-recent-commits’ and - ‘magit-insert-unpulled-or-recent-commits’ (provided there are no - unpulled commits) show. - - -- Function: magit-insert-unpulled-cherries - - Insert section showing unpulled commits. Like - ‘magit-insert-unpulled-commits’ but prefix each commit that has not - been applied yet (i.e. a commit with a patch-id not shared with - any local commit) with "+", and all others with "-". - - -- Function: magit-insert-unpushed-cherries - - Insert section showing unpushed commits. Like - ‘magit-insert-unpushed-commits’ but prefix each commit which has - not been applied to upstream yet (i.e. a commit with a patch-id - not shared with any upstream commit) with "+" and all others with - "-". - - See *note References Buffer:: for some more section inserters, which -could be used here. - - -File: magit.info, Node: Status Header Sections, Next: Status Module Sections, Prev: Status Sections, Up: Status Buffer - -5.1.2 Status Header Sections ----------------------------- - -The contents of status buffers is controlled using the hook -‘magit-status-sections-hook’ (see *note Status Sections::). - - By default ‘magit-insert-status-headers’ is the first member of that -hook variable. - - -- Function: magit-insert-status-headers - - Insert headers sections appropriate for ‘magit-status-mode’ - buffers. The sections are inserted by running the functions on the - hook ‘magit-status-headers-hook’. - - -- User Option: magit-status-headers-hook - - Hook run to insert headers sections into the status buffer. - - This hook is run by ‘magit-insert-status-headers’, which in turn - has to be a member of ‘magit-status-sections-hook’ to be used at - all. - - By default the following functions are members of the above hook: - - -- Function: magit-insert-error-header - - Insert a header line showing the message about the Git error that - just occurred. - - This function is only aware of the last error that occur when Git - was run for side-effects. If, for example, an error occurs while - generating a diff, then that error won’t be inserted. Refreshing - the status buffer causes this section to disappear again. - - -- Function: magit-insert-diff-filter-header - - Insert a header line showing the effective diff filters. - - -- Function: magit-insert-head-branch-header - - Insert a header line about the current branch or detached ‘HEAD’. - - -- Function: magit-insert-upstream-branch-header - - Insert a header line about the branch that is usually pulled into - the current branch. - - -- Function: magit-insert-push-branch-header - - Insert a header line about the branch that the current branch is - usually pushed to. - - -- Function: magit-insert-tags-header - - Insert a header line about the current and/or next tag, along with - the number of commits between the tag and ‘HEAD’. - - The following functions can also be added to the above hook: - - -- Function: magit-insert-repo-header - - Insert a header line showing the path to the repository top-level. - - -- Function: magit-insert-remote-header - - Insert a header line about the remote of the current branch. - - If no remote is configured for the current branch, then fall back - showing the "origin" remote, or if that does not exist the first - remote in alphabetic order. - - -- Function: magit-insert-user-header - - Insert a header line about the current user. - - -File: magit.info, Node: Status Module Sections, Next: Status Options, Prev: Status Header Sections, Up: Status Buffer - -5.1.3 Status Module Sections ----------------------------- - -The contents of status buffers is controlled using the hook -‘magit-status-sections-hook’ (see *note Status Sections::). - - By default ‘magit-insert-modules’ is _not_ a member of that hook -variable. - - -- Function: magit-insert-modules - - Insert submodule sections. - - Hook ‘magit-module-sections-hook’ controls which module sections - are inserted, and option ‘magit-module-sections-nested’ controls - whether they are wrapped in an additional section. - - -- User Option: magit-module-sections-hook - - Hook run by ‘magit-insert-modules’. - - -- User Option: magit-module-sections-nested - - This option controls whether ‘magit-insert-modules’ wraps inserted - sections in an additional section. - - If this is non-nil, then only a single top-level section is - inserted. If it is nil, then all sections listed in - ‘magit-module-sections-hook’ become top-level sections. - - -- Function: magit-insert-modules-overview - - Insert sections for all submodules. For each section insert the - path, the branch, and the output of ‘git describe --tags’, or, - failing that, the abbreviated HEAD commit hash. - - Press ‘RET’ on such a submodule section to show its own status - buffer. Press ‘RET’ on the "Modules" section to display a list of - submodules in a separate buffer. This shows additional information - not displayed in the super-repository’s status buffer. - - -- Function: magit-insert-modules-unpulled-from-upstream - - Insert sections for modules that haven’t been pulled from the - upstream yet. These sections can be expanded to show the - respective commits. - - -- Function: magit-insert-modules-unpulled-from-pushremote - - Insert sections for modules that haven’t been pulled from the - push-remote yet. These sections can be expanded to show the - respective commits. - - -- Function: magit-insert-modules-unpushed-to-upstream - - Insert sections for modules that haven’t been pushed to the - upstream yet. These sections can be expanded to show the - respective commits. - - -- Function: magit-insert-modules-unpushed-to-pushremote - - Insert sections for modules that haven’t been pushed to the - push-remote yet. These sections can be expanded to show the - respective commits. - - -File: magit.info, Node: Status Options, Prev: Status Module Sections, Up: Status Buffer - -5.1.4 Status Options --------------------- - - -- User Option: magit-status-refresh-hook - - Hook run after a status buffer has been refreshed. - - -- User Option: magit-status-margin - - This option specifies whether the margin is initially shown in - Magit-Status mode buffers and how it is formatted. - - The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’. - - • If INIT is non-nil, then the margin is shown initially. - - • STYLE controls how to format the author or committer date. It - can be one of ‘age’ (to show the age of the commit), - ‘age-abbreviated’ (to abbreviate the time unit to a - character), or a string (suitable for ‘format-time-string’) to - show the actual date. Option - ‘magit-log-margin-show-committer-date’ controls which date is - being displayed. - - • WIDTH controls the width of the margin. This exists for - forward compatibility and currently the value should not be - changed. - - • AUTHOR controls whether the name of the author is also shown - by default. - - • AUTHOR-WIDTH has to be an integer. When the name of the - author is shown, then this specifies how much space is used to - do so. - - Also see the proceeding section for more options concerning status -buffers. - - -File: magit.info, Node: Repository List, Next: Logging, Prev: Status Buffer, Up: Inspecting - -5.2 Repository List -=================== - - -- Command: magit-list-repositories - - This command displays a list of repositories in a separate buffer. - - The options ‘magit-repository-directories’ and - ‘magit-repository-directories-depth’ control which repositories are - displayed. - - -- User Option: magit-repolist-columns - - This option controls what columns are displayed by the command - ‘magit-list-repositories’ and how they are displayed. - - Each element has the form ‘(HEADER WIDTH FORMAT PROPS)’. - - HEADER is the string displayed in the header. WIDTH is the width - of the column. FORMAT is a function that is called with one - argument, the repository identification (usually its basename), and - with ‘default-directory’ bound to the toplevel of its working tree. - It has to return a string to be inserted or nil. PROPS is an alist - that supports the keys ‘:right-align’ and ‘:pad-right’. - - The following functions can be added to the above option: - - -- Function: magit-repolist-column-ident - - This function inserts the identification of the repository. - Usually this is just its basename. - - -- Function: magit-repolist-column-path - - This function inserts the absolute path of the repository. - - -- Function: magit-repolist-column-version - - This function inserts a description of the repository’s ‘HEAD’ - revision. - - -- Function: magit-repolist-column-branch - - This function inserts the name of the current branch. - - -- Function: magit-repolist-column-upstream - - This function inserts the name of the upstream branch of the - current branch. - - -- Function: magit-repolist-column-branches - - This function inserts the number of branches. - - -- Function: magit-repolist-column-stashes - - This function inserts the number of stashes. - - -- Function: magit-repolist-column-flag - - This function inserts a flag as specified by - ‘magit-repolist-column-flag-alist’. - - By default this indicates whether there are uncommitted changes. - - • ‘N’ if there is at least one untracked file. - - • ‘U’ if there is at least one unstaged file. - - • ‘S’ if there is at least one staged file. - - Only the first one of these that applies is shown. - - -- Function: magit-repolist-column-unpulled-from-upstream - - This function inserts the number of upstream commits not in the - current branch. - - -- Function: magit-repolist-column-unpulled-from-pushremote - - This function inserts the number of commits in the push branch but - not the current branch. - - -- Function: magit-repolist-column-unpushed-to-upstream - - This function inserts the number of commits in the current branch - but not its upstream. - - -- Function: magit-repolist-column-unpushed-to-pushremote - - This function inserts the number of commits in the current branch - but not its push branch. - - -File: magit.info, Node: Logging, Next: Diffing, Prev: Repository List, Up: Inspecting - -5.3 Logging -=========== - -The status buffer contains logs for the unpushed and unpulled commits, -but that obviously isn’t enough. The transient prefix command -‘magit-log’, on ‘l’, features several suffix commands, which show a -specific log in a separate log buffer. - - Like other transient prefix commands, ‘magit-log’ also features -several infix arguments that can be changed before invoking one of the -suffix commands. However, in the case of the log transient, these -arguments may be taken from those currently in use in the current -repository’s log buffer, depending on the value of -‘magit-prefix-use-buffer-arguments’ (see *note Transient Arguments and -Buffer Variables::). - - For information about the various arguments, see *note -(gitman)git-log::. - - The switch ‘++order=VALUE’ is converted to one of -‘--author-date-order’, ‘--date-order’, or ‘--topo-order’ before being -passed to ‘git log’. - - The log transient also features several reflog commands. See *note -Reflog::. - -‘l’ (‘magit-log’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘l l’ (‘magit-log-current’) - - Show log for the current branch. When ‘HEAD’ is detached or with a - prefix argument, show log for one or more revs read from the - minibuffer. - -‘l o’ (‘magit-log-other’) - - Show log for one or more revs read from the minibuffer. The user - can input any revision or revisions separated by a space, or even - ranges, but only branches, tags, and a representation of the commit - at point are available as completion candidates. - -‘l h’ (‘magit-log-head’) - - Show log for ‘HEAD’. - -‘l L’ (‘magit-log-branches’) - - Show log for all local branches and ‘HEAD’. - -‘l b’ (‘magit-log-all-branches’) - - Show log for all local and remote branches and ‘HEAD’. - -‘l a’ (‘magit-log-all’) - - Show log for all references and ‘HEAD’. - - Two additional commands that show the log for the file or blob that -is being visited in the current buffer exists, see *note Minor Mode for -Buffers Visiting Files::. The command ‘magit-cherry’ also shows a log, -see *note Cherries::. - -* Menu: - -* Refreshing Logs:: -* Log Buffer:: -* Log Margin:: -* Select from Log:: -* Reflog:: -* Cherries:: - - -File: magit.info, Node: Refreshing Logs, Next: Log Buffer, Up: Logging - -5.3.1 Refreshing Logs ---------------------- - -The transient prefix command ‘magit-log-refresh’, on ‘L’, can be used to -change the log arguments used in the current buffer, without changing -which log is shown. This works in dedicated log buffers, but also in -the status buffer. - -‘L’ (‘magit-log-refresh’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘L g’ (‘magit-log-refresh’) - - This suffix command sets the local log arguments for the current - buffer. - -‘L s’ (‘magit-log-set-default-arguments’) - - This suffix command sets the default log arguments for buffers of - the same type as that of the current buffer. Other existing - buffers of the same type are not affected because their local - values have already been initialized. - -‘L w’ (‘magit-log-save-default-arguments’) - - This suffix command sets the default log arguments for buffers of - the same type as that of the current buffer, and saves the value - for future sessions. Other existing buffers of the same type are - not affected because their local values have already been - initialized. - -‘L t’ (‘magit-toggle-margin’) - - Show or hide the margin. - - -File: magit.info, Node: Log Buffer, Next: Log Margin, Prev: Refreshing Logs, Up: Logging - -5.3.2 Log Buffer ----------------- - -‘L’ (‘magit-log-refresh’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - See *note Refreshing Logs::. - -‘q’ (‘magit-log-bury-buffer’) - - Bury the current buffer or the revision buffer in the same frame. - Like ‘magit-mode-bury-buffer’ (which see) but with a negative - prefix argument instead bury the revision buffer, provided it is - displayed in the current frame. - -‘C-c C-b’ (‘magit-go-backward’) - - Move backward in current buffer’s history. - -‘C-c C-f’ (‘magit-go-forward’) - - Move forward in current buffer’s history. - -‘C-c C-n’ (‘magit-log-move-to-parent’) - - Move to a parent of the current commit. By default, this is the - first parent, but a numeric prefix can be used to specify another - parent. - -‘SPC’ (‘magit-diff-show-or-scroll-up’) - - Update the commit or diff buffer for the thing at point. - - Either show the commit or stash at point in the appropriate buffer, - or if that buffer is already being displayed in the current frame - and contains information about that commit or stash, then instead - scroll the buffer up. If there is no commit or stash at point, - then prompt for a commit. - -‘DEL’ (‘magit-diff-show-or-scroll-down’) - - Update the commit or diff buffer for the thing at point. - - Either show the commit or stash at point in the appropriate buffer, - or if that buffer is already being displayed in the current frame - and contains information about that commit or stash, then instead - scroll the buffer down. If there is no commit or stash at point, - then prompt for a commit. - -‘=’ (‘magit-log-toggle-commit-limit’) - - Toggle the number of commits the current log buffer is limited to. - If the number of commits is currently limited, then remove that - limit. Otherwise set it to 256. - -‘+’ (‘magit-log-double-commit-limit’) - - Double the number of commits the current log buffer is limited to. - -‘-’ (‘magit-log-half-commit-limit’) - - Half the number of commits the current log buffer is limited to. - - -- User Option: magit-log-auto-more - - Insert more log entries automatically when moving past the last - entry. Only considered when moving past the last entry with - ‘magit-goto-*-section’ commands. - - -- User Option: magit-log-show-refname-after-summary - - Whether to show the refnames after the commit summaries. This is - useful if you use really long branch names. - - Magit displays references in logs a bit differently from how Git does -it. - - Local branches are blue and remote branches are green. Of course -that depends on the used theme, as do the colors used for other types of -references. The current branch has a box around it, as do remote -branches that are their respective remote’s ‘HEAD’ branch. - - If a local branch and its push-target point at the same commit, then -their names are combined to preserve space and to make that relationship -visible. For example: - - origin/feature - [green][blue-] - - instead of - - feature origin/feature - [blue-] [green-------] - - Also note that while the transient features the ‘--show-signature’ -argument, that won’t actually be used when enabled, because Magit -defaults to use just one line per commit. Instead the commit colorized -to indicate the validity of the signed commit object, using the faces -named ‘magit-signature-*’ (which see). - - For a description of ‘magit-log-margin’ see *note Log Margin::. - - -File: magit.info, Node: Log Margin, Next: Select from Log, Prev: Log Buffer, Up: Logging - -5.3.3 Log Margin ----------------- - -In buffers which show one or more logs, it is possible to show -additional information about each commit in the margin. The options -used to configure the margin are named ‘magit-INFIX-margin’, where INFIX -is the same as in the respective major-mode ‘magit-INFIX-mode’. In -regular log buffers that would be ‘magit-log-margin’. - - -- User Option: magit-log-margin - - This option specifies whether the margin is initially shown in - Magit-Log mode buffers and how it is formatted. - - The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’. - - • If INIT is non-nil, then the margin is shown initially. - - • STYLE controls how to format the author or committer date. It - can be one of ‘age’ (to show the age of the commit), - ‘age-abbreviated’ (to abbreviate the time unit to a - character), or a string (suitable for ‘format-time-string’) to - show the actual date. Option - ‘magit-log-margin-show-committer-date’ controls which date is - being displayed. - - • WIDTH controls the width of the margin. This exists for - forward compatibility and currently the value should not be - changed. - - • AUTHOR controls whether the name of the author is also shown - by default. - - • AUTHOR-WIDTH has to be an integer. When the name of the - author is shown, then this specifies how much space is used to - do so. - - You can change the STYLE and AUTHOR-WIDTH of all ‘magit-INFIX-margin’ -options to the same values by customizing ‘magit-log-margin’ *before* -‘magit’ is loaded. If you do that, then the respective values for the -other options will default to what you have set for that variable. -Likewise if you set INIT in ‘magit-log-margin’ to ‘nil’, then that is -used in the default of all other options. But setting it to ‘t’, i.e. -re-enforcing the default for that option, does not carry to other -options. - - -- User Option: magit-log-margin-show-committer-date - - This option specifies whether to show the committer date in the - margin. This option only controls whether the committer date is - displayed instead of the author date. Whether some date is - displayed in the margin and whether the margin is displayed at all - is controlled by other options. - -‘L’ (‘magit-margin-settings’) - - This transient prefix command binds the following suffix commands, - each of which changes the appearance of the margin in some way. - - In some buffers that support the margin, ‘L’ is instead bound to -‘magit-log-refresh’, but that transient features the same commands, and -then some other unrelated commands. - -‘L L’ (‘magit-toggle-margin’) - - This command shows or hides the margin. - -‘L l’ (‘magit-cycle-margin-style’) - - This command cycles the style used for the margin. - -‘L d’ (‘magit-toggle-margin-details’) - - This command shows or hides details in the margin. - - -File: magit.info, Node: Select from Log, Next: Reflog, Prev: Log Margin, Up: Logging - -5.3.4 Select from Log ---------------------- - -When the user has to select a recent commit that is reachable from -‘HEAD’, using regular completion would be inconvenient (because most -humans cannot remember hashes or "HEAD~5", at least not without double -checking). Instead a log buffer is used to select the commit, which has -the advantage that commits are presented in order and with the commit -message. - - Such selection logs are used when selecting the beginning of a rebase -and when selecting the commit to be squashed into. - - In addition to the key bindings available in all log buffers, the -following additional key bindings are available in selection log -buffers: - -‘C-c C-c’ (‘magit-log-select-pick’) - - Select the commit at point and act on it. Call - ‘magit-log-select-pick-function’ with the selected commit as - argument. - -‘C-c C-k’ (‘magit-log-select-quit’) - - Abort selecting a commit, don’t act on any commit. - - -- User Option: magit-log-select-margin - - This option specifies whether the margin is initially shown in - Magit-Log-Select mode buffers and how it is formatted. - - The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’. - - • If INIT is non-nil, then the margin is shown initially. - - • STYLE controls how to format the author or committer date. It - can be one of ‘age’ (to show the age of the commit), - ‘age-abbreviated’ (to abbreviate the time unit to a - character), or a string (suitable for ‘format-time-string’) to - show the actual date. Option - ‘magit-log-margin-show-committer-date’ controls which date is - being displayed. - - • WIDTH controls the width of the margin. This exists for - forward compatibility and currently the value should not be - changed. - - • AUTHOR controls whether the name of the author is also shown - by default. - - • AUTHOR-WIDTH has to be an integer. When the name of the - author is shown, then this specifies how much space is used to - do so. - - -File: magit.info, Node: Reflog, Next: Cherries, Prev: Select from Log, Up: Logging - -5.3.5 Reflog ------------- - -Also see *note (gitman)git-reflog::. - - These reflog commands are available from the log transient. See -*note Logging::. - -‘l r’ (‘magit-reflog-current’) - - Display the reflog of the current branch. - -‘l O’ (‘magit-reflog-other’) - - Display the reflog of a branch or another ref. - -‘l H’ (‘magit-reflog-head’) - - Display the ‘HEAD’ reflog. - - -- User Option: magit-reflog-margin - - This option specifies whether the margin is initially shown in - Magit-Reflog mode buffers and how it is formatted. - - The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’. - - • If INIT is non-nil, then the margin is shown initially. - - • STYLE controls how to format the author or committer date. It - can be one of ‘age’ (to show the age of the commit), - ‘age-abbreviated’ (to abbreviate the time unit to a - character), or a string (suitable for ‘format-time-string’) to - show the actual date. Option - ‘magit-log-margin-show-committer-date’ controls which date is - being displayed. - - • WIDTH controls the width of the margin. This exists for - forward compatibility and currently the value should not be - changed. - - • AUTHOR controls whether the name of the author is also shown - by default. - - • AUTHOR-WIDTH has to be an integer. When the name of the - author is shown, then this specifies how much space is used to - do so. - - -File: magit.info, Node: Cherries, Prev: Reflog, Up: Logging - -5.3.6 Cherries --------------- - -Cherries are commits that haven’t been applied upstream (yet), and are -usually visualized using a log. Each commit is prefixed with ‘-’ if it -has an equivalent in the upstream and ‘+’ if it does not, i.e. if it is -a cherry. - - The command ‘magit-cherry’ shows cherries for a single branch, but -the references buffer (see *note References Buffer::) can show cherries -for multiple "upstreams" at once. - - Also see *note (gitman)git-reflog::. - -‘Y’ (‘magit-cherry’) - - Show commits that are in a certain branch but that have not been - merged in the upstream branch. - - -- User Option: magit-cherry-margin - - This option specifies whether the margin is initially shown in - Magit-Cherry mode buffers and how it is formatted. - - The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’. - - • If INIT is non-nil, then the margin is shown initially. - - • STYLE controls how to format the author or committer date. It - can be one of ‘age’ (to show the age of the commit), - ‘age-abbreviated’ (to abbreviate the time unit to a - character), or a string (suitable for ‘format-time-string’) to - show the actual date. Option - ‘magit-log-margin-show-committer-date’ controls which date is - being displayed. - - • WIDTH controls the width of the margin. This exists for - forward compatibility and currently the value should not be - changed. - - • AUTHOR controls whether the name of the author is also shown - by default. - - • AUTHOR-WIDTH has to be an integer. When the name of the - author is shown, then this specifies how much space is used to - do so. - - -File: magit.info, Node: Diffing, Next: Ediffing, Prev: Logging, Up: Inspecting - -5.4 Diffing -=========== - -The status buffer contains diffs for the staged and unstaged commits, -but that obviously isn’t enough. The transient prefix command -‘magit-diff’, on ‘d’, features several suffix commands, which show a -specific diff in a separate diff buffer. - - Like other transient prefix commands, ‘magit-diff’ also features -several infix arguments that can be changed before invoking one of the -suffix commands. However, in the case of the diff transient, these -arguments may be taken from those currently in use in the current -repository’s diff buffer, depending on the value of -‘magit-prefix-use-buffer-arguments’ (see *note Transient Arguments and -Buffer Variables::). - - Also see *note (gitman)git-diff::. - -‘d’ (‘magit-diff’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘d d’ (‘magit-diff-dwim’) - - Show changes for the thing at point. - -‘d r’ (‘magit-diff-range’) - - Show differences between two commits. - - RANGE should be a range (A..B or A...B) but can also be a single - commit. If one side of the range is omitted, then it defaults to - ‘HEAD’. If just a commit is given, then changes in the working - tree relative to that commit are shown. - - If the region is active, use the revisions on the first and last - line of the region. With a prefix argument, instead of diffing the - revisions, choose a revision to view changes along, starting at the - common ancestor of both revisions (i.e., use a "..." range). - -‘d w’ (‘magit-diff-working-tree’) - - Show changes between the current working tree and the ‘HEAD’ - commit. With a prefix argument show changes between the working - tree and a commit read from the minibuffer. - -‘d s’ (‘magit-diff-staged’) - - Show changes between the index and the ‘HEAD’ commit. With a - prefix argument show changes between the index and a commit read - from the minibuffer. - -‘d u’ (‘magit-diff-unstaged’) - - Show changes between the working tree and the index. - -‘d p’ (‘magit-diff-paths’) - - Show changes between any two files on disk. - - All of the above suffix commands update the repository’s diff buffer. -The diff transient also features two commands which show differences in -another buffer: - -‘d c’ (‘magit-show-commit’) - - Show the commit at point. If there is no commit at point or with a - prefix argument, prompt for a commit. - -‘d t’ (‘magit-stash-show’) - - Show all diffs of a stash in a buffer. - - Two additional commands that show the diff for the file or blob that -is being visited in the current buffer exists, see *note Minor Mode for -Buffers Visiting Files::. - -* Menu: - -* Refreshing Diffs:: -* Commands Available in Diffs:: -* Diff Options:: -* Revision Buffer:: - - -File: magit.info, Node: Refreshing Diffs, Next: Commands Available in Diffs, Up: Diffing - -5.4.1 Refreshing Diffs ----------------------- - -The transient prefix command ‘magit-diff-refresh’, on ‘D’, can be used -to change the diff arguments used in the current buffer, without -changing which diff is shown. This works in dedicated diff buffers, but -also in the status buffer. - -‘D’ (‘magit-diff-refresh’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘D g’ (‘magit-diff-refresh’) - - This suffix command sets the local diff arguments for the current - buffer. - -‘D s’ (‘magit-diff-set-default-arguments’) - - This suffix command sets the default diff arguments for buffers of - the same type as that of the current buffer. Other existing - buffers of the same type are not affected because their local - values have already been initialized. - -‘D w’ (‘magit-diff-save-default-arguments’) - - This suffix command sets the default diff arguments for buffers of - the same type as that of the current buffer, and saves the value - for future sessions. Other existing buffers of the same type are - not affected because their local values have already been - initialized. - -‘D t’ (‘magit-diff-toggle-refine-hunk’) - - This command toggles hunk refinement on or off. - -‘D r’ (‘magit-diff-switch-range-type’) - - This command converts the diff range type from "revA..revB" to - "revB...revA", or vice versa. - -‘D f’ (‘magit-diff-flip-revs’) - - This command swaps revisions in the diff range from "revA..revB" to - "revB..revA", or vice versa. - -‘D F’ (‘magit-diff-toggle-file-filter’) - - This command toggles the file restriction of the diffs in the - current buffer, allowing you to quickly switch between viewing all - the changes in the commit and the restricted subset. As a special - case, when this command is called from a log buffer, it toggles the - file restriction in the repository’s revision buffer, which is - useful when you display a revision from a log buffer that is - restricted to a file or files. - - In addition to the above transient, which allows changing any of the -supported arguments, there also exist some commands that change only a -particular argument. - -‘-’ (‘magit-diff-less-context’) - - This command decreases the context for diff hunks by COUNT lines. - -‘+’ (‘magit-diff-more-context’) - - This command increases the context for diff hunks by COUNT lines. - -‘0’ (‘magit-diff-default-context’) - - This command resets the context for diff hunks to the default - height. - - The following commands quickly change what diff is being displayed -without having to using one of the diff transient. - -‘C-c C-d’ (‘magit-diff-while-committing’) - - While committing, this command shows the changes that are about to - be committed. While amending, invoking the command again toggles - between showing just the new changes or all the changes that will - be committed. - - This binding is available in the diff buffer as well as the commit - message buffer. - -‘C-c C-b’ (‘magit-go-backward’) - - This command moves backward in current buffer’s history. - -‘C-c C-f’ (‘magit-go-forward’) - - This command moves forward in current buffer’s history. - - -File: magit.info, Node: Commands Available in Diffs, Next: Diff Options, Prev: Refreshing Diffs, Up: Diffing - -5.4.2 Commands Available in Diffs ---------------------------------- - -Some commands are only available if point is inside a diff. - - ‘magit-diff-visit-file’ and related commands visit the appropriate -version of the file that the diff at point is about. Likewise -‘magit-diff-visit-worktree-file’ and related commands visit the worktree -version of the file that the diff at point is about. See *note Visiting -Files and Blobs from a Diff:: for more information and the key bindings. - -‘C-c C-t’ (‘magit-diff-trace-definition’) - - This command shows a log for the definition at point. - - -- User Option: magit-log-trace-definition-function - - The function specified by this option is used by - ‘magit-log-trace-definition’ to determine the function at point. - For major-modes that have special needs, you could set the local - value using the mode’s hook. - -‘C-c C-e’ (‘magit-diff-edit-hunk-commit’) - - From a hunk, this command edits the respective commit and visits - the file. - - First it visits the file being modified by the hunk at the correct - location using ‘magit-diff-visit-file’. This actually visits a - blob. When point is on a diff header, not within an individual - hunk, then this visits the blob the first hunk is about. - - Then it invokes ‘magit-edit-line-commit’, which uses an interactive - rebase to make the commit editable, or if that is not possible - because the commit is not reachable from ‘HEAD’ by checking out - that commit directly. This also causes the actual worktree file to - be visited. - - Neither the blob nor the file buffer are killed when finishing the - rebase. If that is undesirable, then it might be better to use - ‘magit-rebase-edit-command’ instead of this command. - -‘j’ (‘magit-jump-to-diffstat-or-diff’) - - This command jumps to the diffstat or diff. When point is on a - file inside the diffstat section, then jump to the respective diff - section. Otherwise, jump to the diffstat section or a child - thereof. - - The next two commands are not specific to Magit-Diff mode (or and -Magit buffer for that matter), but it might be worth pointing out that -they are available here too. - -‘SPC’ (‘scroll-up’) - - This command scrolls text upward. - -‘DEL’ (‘scroll-down’) - - This command scrolls text downward. - - -File: magit.info, Node: Diff Options, Next: Revision Buffer, Prev: Commands Available in Diffs, Up: Diffing - -5.4.3 Diff Options ------------------- - - -- User Option: magit-diff-refine-hunk - - Whether to show word-granularity differences within diff hunks. - - • ‘nil’ Never show fine differences. - - • ‘t’ Show fine differences for the current diff hunk only. - - • ‘all’ Show fine differences for all displayed diff hunks. - - -- User Option: magit-diff-refine-ignore-whitespace - - Whether to ignore whitespace changes in word-granularity - differences. - - -- User Option: magit-diff-adjust-tab-width - - Whether to adjust the width of tabs in diffs. - - Determining the correct width can be expensive if it requires - opening large and/or many files, so the widths are cached in the - variable ‘magit-diff--tab-width-cache’. Set that to nil to - invalidate the cache. - - • ‘nil’ Never adjust tab width. Use ‘tab-width’s value from the - Magit buffer itself instead. - - • ‘t’ If the corresponding file-visiting buffer exits, then use - ‘tab-width’’s value from that buffer. Doing this is cheap, so - this value is used even if a corresponding cache entry exists. - - • ‘always’ If there is no such buffer, then temporarily visit - the file to determine the value. - - • NUMBER Like ‘always’, but don’t visit files larger than NUMBER - bytes. - - -- User Option: magit-diff-paint-whitespace - - Specify where to highlight whitespace errors. - - See ‘magit-diff-highlight-trailing’, - ‘magit-diff-highlight-indentation’. The symbol ‘t’ means in all - diffs, ‘status’ means only in the status buffer, and nil means - nowhere. - - • ‘nil’ Never highlight whitespace errors. - - • ‘t’ Highlight whitespace errors everywhere. - - • ‘uncommitted’ Only highlight whitespace errors in diffs - showing uncommitted changes. For backward compatibility - ‘status’ is treated as a synonym. - - -- User Option: magit-diff-paint-whitespace-lines - - Specify in what kind of lines to highlight whitespace errors. - - • ‘t’ Highlight only in added lines. - - • ‘both’ Highlight in added and removed lines. - - • ‘all’ Highlight in added, removed and context lines. - - -- User Option: magit-diff-highlight-trailing - - Whether to highlight whitespace at the end of a line in diffs. - Used only when ‘magit-diff-paint-whitespace’ is non-nil. - - -- User Option: magit-diff-highlight-indentation - - This option controls whether to highlight the indentation in case - it used the "wrong" indentation style. Indentation is only - highlighted if ‘magit-diff-paint-whitespace’ is also non-nil. - - The value is an alist of the form ‘((REGEXP . INDENT)...)’. The - path to the current repository is matched against each element in - reverse order. Therefore if a REGEXP matches, then earlier - elements are not tried. - - If the used INDENT is ‘tabs’, highlight indentation with tabs. If - INDENT is an integer, highlight indentation with at least that many - spaces. Otherwise, highlight neither. - - -- User Option: magit-diff-hide-trailing-cr-characters - - Whether to hide ^M characters at the end of a line in diffs. - - -- User Option: magit-diff-highlight-hunk-region-functions - - This option specifies the functions used to highlight the - hunk-internal region. - - ‘magit-diff-highlight-hunk-region-dim-outside’ overlays the outside - of the hunk internal selection with a face that causes the added - and removed lines to have the same background color as context - lines. This function should not be removed from the value of this - option. - - ‘magit-diff-highlight-hunk-region-using-overlays’ and - ‘magit-diff-highlight-hunk-region-using-underline’ emphasize the - region by placing delimiting horizontal lines before and after it. - Both of these functions have glitches which cannot be fixed due to - limitations of Emacs’ display engine. For more information see - ff. - - Instead of, or in addition to, using delimiting horizontal lines, - to emphasize the boundaries, you may which to emphasize the text - itself, using ‘magit-diff-highlight-hunk-region-using-face’. - - In terminal frames it’s not possible to draw lines as the overlay - and underline variants normally do, so there they fall back to - calling the face function instead. - - -- User Option: magit-diff-unmarked-lines-keep-foreground - - This option controls whether added and removed lines outside the - hunk-internal region only lose their distinct background color or - also the foreground color. Whether the outside of the region is - dimmed at all depends on - ‘magit-diff-highlight-hunk-region-functions’. - - -File: magit.info, Node: Revision Buffer, Prev: Diff Options, Up: Diffing - -5.4.4 Revision Buffer ---------------------- - - -- User Option: magit-revision-insert-related-refs - - Whether to show related branches in revision buffers. - - • ‘nil’ Don’t show any related branches. - - • ‘t’ Show related local branches. - - • ‘all’ Show related local and remote branches. - - • ‘mixed’ Show all containing branches and local merged - branches. - - -- User Option: magit-revision-show-gravatars - - Whether to show gravatar images in revision buffers. - - If ‘nil’, then don’t insert any gravatar images. If ‘t’, then - insert both images. If ‘author’ or ‘committer’, then insert only - the respective image. - - If you have customized the option ‘magit-revision-headers-format’ - and want to insert the images then you might also have to specify - where to do so. In that case the value has to be a cons-cell of - two regular expressions. The car specifies where to insert the - author’s image. The top half of the image is inserted right after - the matched text, the bottom half on the next line in the same - column. The cdr specifies where to insert the committer’s image, - accordingly. Either the car or the cdr may be nil." - - -- User Option: magit-revision-use-hash-sections - - Whether to turn hashes inside the commit message into sections. - - If non-nil, then hashes inside the commit message are turned into - ‘commit’ sections. There is a trade off to be made between - performance and reliability: - - • ‘slow’ calls git for every word to be absolutely sure. - - • ‘quick’ skips words less than seven characters long. - - • ‘quicker’ additionally skips words that don’t contain a - number. - - • ‘quickest’ uses all words that are at least seven characters - long and which contain at least one number as well as at least - one letter. - - If nil, then no hashes are turned into sections, but you can still - visit the commit at point using "RET". - - The diffs shown in the revision buffer may be automatically -restricted to a subset of the changed files. If the revision buffer is -displayed from a log buffer, the revision buffer will share the same -file restriction as that log buffer (also see the command -‘magit-diff-toggle-file-filter’). - - -- User Option: magit-revision-filter-files-on-follow - - Whether showing a commit from a log buffer honors the log’s file - filter when the log arguments include ‘--follow’. - - When this option is nil, displaying a commit from a log ignores the - log’s file filter if the log arguments include ‘--follow’. Doing - so avoids showing an empty diff in revision buffers for commits - before a rename event. In such cases, the ‘--patch’ argument of - the log transient can be used to show the file-restricted diffs - inline. - - Set this option to non-nil to keep the log’s file restriction even - if ‘--follow’ is present in the log arguments. - - If the revision buffer is not displayed from a log buffer, the file -restriction is determined as usual (see *note Transient Arguments and -Buffer Variables::). - - -File: magit.info, Node: Ediffing, Next: References Buffer, Prev: Diffing, Up: Inspecting - -5.5 Ediffing -============ - -This section describes how to enter Ediff from Magit buffers. For -information on how to use Ediff itself, see *note (ediff)Top::. - -‘e’ (‘magit-ediff-dwim’) - - Compare, stage, or resolve using Ediff. - - This command tries to guess what file, and what commit or range the - user wants to compare, stage, or resolve using Ediff. It might - only be able to guess either the file, or range/commit, in which - case the user is asked about the other. It might not always guess - right, in which case the appropriate ‘magit-ediff-*’ command has to - be used explicitly. If it cannot read the user’s mind at all, then - it asks the user for a command to run. - -‘E’ (‘magit-ediff’) - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -‘E r’ (‘magit-ediff-compare’) - - Compare two revisions of a file using Ediff. - - If the region is active, use the revisions on the first and last - line of the region. With a prefix argument, instead of diffing the - revisions, choose a revision to view changes along, starting at the - common ancestor of both revisions (i.e., use a "..." range). - -‘E m’ (‘magit-ediff-resolve’) - - Resolve outstanding conflicts in a file using Ediff, defaulting to - the file at point. - - Provided that the value of ‘merge.conflictstyle’ is ‘diff3’, you - can view the file’s merge-base revision using ‘/’ in the Ediff - control buffer. - - In the rare event that you want to manually resolve all conflicts, - including those already resolved by Git, use - ‘ediff-merge-revisions-with-ancestor’. - -‘E s’ (‘magit-ediff-stage’) - - Stage and unstage changes to a file using Ediff, defaulting to the - file at point. - -‘E u’ (‘magit-ediff-show-unstaged’) - - Show unstaged changes to a file using Ediff. - -‘E i’ (‘magit-ediff-show-staged’) - - Show staged changes to a file using Ediff. - -‘E w’ (‘magit-ediff-show-working-tree’) - - Show changes in a file between ‘HEAD’ and working tree using Ediff. - -‘E c’ (‘magit-ediff-show-commit’) - - Show changes to a file introduced by a commit using Ediff. - -‘E z’ (‘magit-ediff-show-stash’) - - Show changes to a file introduced by a stash using Ediff. - - -- User Option: magit-ediff-dwim-show-on-hunks - - This option controls what command ‘magit-ediff-dwim’ calls when - point is on uncommitted hunks. When nil, always run - ‘magit-ediff-stage’. Otherwise, use ‘magit-ediff-show-staged’ and - ‘magit-ediff-show-unstaged’ to show staged and unstaged changes, - respectively. - - -- User Option: magit-ediff-show-stash-with-index - - This option controls whether ‘magit-ediff-show-stash’ includes a - buffer containing the file’s state in the index at the time the - stash was created. This makes it possible to tell which changes in - the stash were staged. - - -- User Option: magit-ediff-quit-hook - - This hook is run after quitting an Ediff session that was created - using a Magit command. The hook functions are run inside the Ediff - control buffer, and should not change the current buffer. - - This is similar to ‘ediff-quit-hook’ but takes the needs of Magit - into account. The regular ‘ediff-quit-hook’ is ignored by Ediff - sessions that were created using a Magit command. - - -File: magit.info, Node: References Buffer, Next: Bisecting, Prev: Ediffing, Up: Inspecting - -5.6 References Buffer -===================== - -‘y’ (‘magit-show-refs’) - - This command lists branches and tags in a dedicated buffer. - - However if this command is invoked again from this buffer or if it - is invoked with a prefix argument, then it acts as a transient - prefix command, which binds the following suffix commands and some - infix arguments. - - All of the following suffix commands list exactly the same branches -and tags. The only difference the optional feature that can be enabled -by changing the value of ‘magit-refs-show-commit-count’ (see below). -These commands specify a different branch or commit against which all -the other references are compared. - -‘y y’ (‘magit-show-refs-head’) - - This command lists branches and tags in a dedicated buffer. Each - reference is being compared with ‘HEAD’. - -‘y c’ (‘magit-show-refs-current’) - - This command lists branches and tags in a dedicated buffer. Each - reference is being compared with the current branch or ‘HEAD’ if it - is detached. - -‘y o’ (‘magit-show-refs-other’) - - This command lists branches and tags in a dedicated buffer. Each - reference is being compared with a branch read from the user. - - -- User Option: magit-refs-show-commit-count - - Whether to show commit counts in Magit-Refs mode buffers. - - • ‘all’ Show counts for branches and tags. - - • ‘branch’ Show counts for branches only. - - • ‘nil’ Never show counts. - - The default is ‘nil’ because anything else can be very expensive. - - -- User Option: magit-refs-pad-commit-counts - - Whether to pad all commit counts on all sides in Magit-Refs mode - buffers. - - If this is nil, then some commit counts are displayed right next to - one of the branches that appear next to the count, without any - space in between. This might look bad if the branch name faces - look too similar to ‘magit-dimmed’. - - If this is non-nil, then spaces are placed on both sides of all - commit counts. - - -- User Option: magit-refs-show-remote-prefix - - Whether to show the remote prefix in lists of remote branches. - - Showing the prefix is redundant because the name of the remote is - already shown in the heading preceding the list of its branches. - - -- User Option: magit-refs-primary-column-width - - Width of the primary column in ‘magit-refs-mode’ buffers. The - primary column is the column that contains the name of the branch - that the current row is about. - - If this is an integer, then the column is that many columns wide. - Otherwise it has to be a cons-cell of two integers. The first - specifies the minimal width, the second the maximal width. In that - case the actual width is determined using the length of the names - of the shown local branches. (Remote branches and tags are not - taken into account when calculating to optimal width.) - - -- User Option: magit-refs-focus-column-width - - Width of the focus column in ‘magit-refs-mode’ buffers. - - The focus column is the first column, which marks one branch - (usually the current branch) as the focused branch using ‘*’ or - ‘@’. For each other reference, this column optionally shows how - many commits it is ahead of the focused branch and ‘<’, or if it - isn’t ahead then the commits it is behind and ‘>’, or if it isn’t - behind either, then a ‘=’. - - This column may also display only ‘*’ or ‘@’ for the focused - branch, in which case this option is ignored. Use ‘L v’ to change - the verbosity of this column. - - -- User Option: magit-refs-margin - - This option specifies whether the margin is initially shown in - Magit-Refs mode buffers and how it is formatted. - - The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’. - - • If INIT is non-nil, then the margin is shown initially. - - • STYLE controls how to format the author or committer date. It - can be one of ‘age’ (to show the age of the commit), - ‘age-abbreviated’ (to abbreviate the time unit to a - character), or a string (suitable for ‘format-time-string’) to - show the actual date. Option - ‘magit-log-margin-show-committer-date’ controls which date is - being displayed. - - • WIDTH controls the width of the margin. This exists for - forward compatibility and currently the value should not be - changed. - - • AUTHOR controls whether the name of the author is also shown - by default. - - • AUTHOR-WIDTH has to be an integer. When the name of the - author is shown, then this specifies how much space is used to - do so. - - -- User Option: magit-refs-margin-for-tags - - This option specifies whether to show information about tags in the - margin. This is disabled by default because it is slow if there - are many tags. - - The following variables control how individual refs are displayed. -If you change one of these variables (especially the "%c" part), then -you should also change the others to keep things aligned. The following -%-sequences are supported: - - • ‘%a’ Number of commits this ref has over the one we compare to. - - • ‘%b’ Number of commits the ref we compare to has over this one. - - • ‘%c’ Number of commits this ref has over the one we compare to. - For the ref which all other refs are compared this is instead "@", - if it is the current branch, or "#" otherwise. - - • ‘%C’ For the ref which all other refs are compared this is "@", if - it is the current branch, or "#" otherwise. For all other refs " - ". - - • ‘%h’ Hash of this ref’s tip. - - • ‘%m’ Commit summary of the tip of this ref. - - • ‘%n’ Name of this ref. - - • ‘%u’ Upstream of this local branch. - - • ‘%U’ Upstream of this local branch and additional local vs. - upstream information. - - -- User Option: magit-refs-filter-alist - - The purpose of this option is to forgo displaying certain refs - based on their name. If you want to not display any refs of a - certain type, then you should remove the appropriate function from - ‘magit-refs-sections-hook’ instead. - - This alist controls which tags and branches are omitted from being - displayed in ‘magit-refs-mode’ buffers. If it is ‘nil’, then all - refs are displayed (subject to ‘magit-refs-sections-hook’). - - All keys are tried in order until one matches. Then its value is - used and subsequent elements are ignored. If the value is non-nil, - then the reference is displayed, otherwise it is not. If no - element matches, then the reference is displayed. - - A key can either be a regular expression that the refname has to - match, or a function that takes the refname as only argument and - returns a boolean. A remote branch such as "origin/master" is - displayed as just "master", however for this comparison the former - is used. - -‘RET’ (‘magit-visit-ref’) - - This command visits the reference or revision at point in another - buffer. If there is no revision at point or with a prefix argument - then it prompts for a revision. - - This command behaves just like ‘magit-show-commit’ as described - above, except if point is on a reference in a ‘magit-refs-mode’ - buffer, in which case the behavior may be different, but only if - you have customized the option ‘magit-visit-ref-behavior’. - - -- User Option: magit-visit-ref-behavior - - This option controls how ‘magit-visit-ref’ behaves in - ‘magit-refs-mode’ buffers. - - By default ‘magit-visit-ref’ behaves like ‘magit-show-commit’, in - all buffers, including ‘magit-refs-mode’ buffers. When the type of - the section at point is ‘commit’ then "RET" is bound to - ‘magit-show-commit’, and when the type is either ‘branch’ or ‘tag’ - then it is bound to ‘magit-visit-ref’. - - "RET" is one of Magit’s most essential keys and at least by default - it should behave consistently across all of Magit, especially - because users quickly learn that it does something very harmless; - it shows more information about the thing at point in another - buffer. - - However "RET" used to behave differently in ‘magit-refs-mode’ - buffers, doing surprising things, some of which cannot really be - described as "visit this thing". If you’ve grown accustomed this - behavior, you can restore it by adding one or more of the below - symbols to the value of this option. But keep in mind that by - doing so you don’t only introduce inconsistencies, you also lose - some functionality and might have to resort to ‘M-x - magit-show-commit’ to get it back. - - ‘magit-visit-ref’ looks for these symbols in the order in which - they are described here. If the presence of a symbol applies to - the current situation, then the symbols that follow do not affect - the outcome. - - • ‘focus-on-ref’ - - With a prefix argument update the buffer to show commit counts - and lists of cherry commits relative to the reference at point - instead of relative to the current buffer or ‘HEAD’. - - Instead of adding this symbol, consider pressing "C-u y o - RET". - - • ‘create-branch’ - - If point is on a remote branch, then create a new local branch - with the same name, use the remote branch as its upstream, and - then check out the local branch. - - Instead of adding this symbol, consider pressing "b c RET - RET", like you would do in other buffers. - - • ‘checkout-any’ - - Check out the reference at point. If that reference is a tag - or a remote branch, then this results in a detached ‘HEAD’. - - Instead of adding this symbol, consider pressing "b b RET", - like you would do in other buffers. - - • ‘checkout-branch’ - - Check out the local branch at point. - - Instead of adding this symbol, consider pressing "b b RET", - like you would do in other buffers. - -* Menu: - -* References Sections:: - - -File: magit.info, Node: References Sections, Up: References Buffer - -5.6.1 References Sections -------------------------- - -The contents of references buffers is controlled using the hook -‘magit-refs-sections-hook’. See *note Section Hooks:: to learn about -such hooks and how to customize them. All of the below functions are -members of the default value. Note that it makes much less sense to -customize this hook than it does for the respective hook used for the -status buffer. - - -- User Option: magit-refs-sections-hook - - Hook run to insert sections into a references buffer. - - -- Function: magit-insert-local-branches - - Insert sections showing all local branches. - - -- Function: magit-insert-remote-branches - - Insert sections showing all remote-tracking branches. - - -- Function: magit-insert-tags - - Insert sections showing all tags. - - -File: magit.info, Node: Bisecting, Next: Visiting Files and Blobs, Prev: References Buffer, Up: Inspecting - -5.7 Bisecting -============= - -Also see *note (gitman)git-bisect::. - -‘B’ (‘magit-bisect’) - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - - When bisecting is not in progress, then the transient features the -following suffix commands. - -‘B B’ (‘magit-bisect-start’) - - Start a bisect session. - - Bisecting a bug means to find the commit that introduced it. This - command starts such a bisect session by asking for a known good and - a bad commit. - -‘B s’ (‘magit-bisect-run’) - - Bisect automatically by running commands after each step. - - When bisecting in progress, then the transient instead features the -following suffix commands. - -‘B b’ (‘magit-bisect-bad’) - - Mark the current commit as bad. Use this after you have asserted - that the commit does contain the bug in question. - -‘B g’ (‘magit-bisect-good’) - - Mark the current commit as good. Use this after you have asserted - that the commit does not contain the bug in question. - -‘B k’ (‘magit-bisect-skip’) - - Skip the current commit. Use this if for some reason the current - commit is not a good one to test. This command lets Git choose a - different one. - -‘B r’ (‘magit-bisect-reset’) - - After bisecting, cleanup bisection state and return to original - ‘HEAD’. - - By default the status buffer shows information about the ongoing -bisect session. - - -- User Option: magit-bisect-show-graph - - This option controls whether a graph is displayed for the log of - commits that still have to be bisected. - - -File: magit.info, Node: Visiting Files and Blobs, Next: Blaming, Prev: Bisecting, Up: Inspecting - -5.8 Visiting Files and Blobs -============================ - -Magit provides several commands that visit a file or blob (the version -of a file that is stored in a certain commit). Actually it provides -several *groups* of such commands and the several *variants* within each -group. - -* Menu: - -* General-Purpose Visit Commands:: -* Visiting Files and Blobs from a Diff:: - - -File: magit.info, Node: General-Purpose Visit Commands, Next: Visiting Files and Blobs from a Diff, Up: Visiting Files and Blobs - -5.8.1 General-Purpose Visit Commands ------------------------------------- - -These commands can be used anywhere to open any blob. Currently no keys -are bound to these commands by default, but that is likely to change. - - -- Command: magit-find-file - - This command reads a filename and revision from the user and visits - the respective blob in a buffer. The buffer is displayed in the - selected window. - - -- Command: magit-find-file-other-window - - This command reads a filename and revision from the user and visits - the respective blob in a buffer. The buffer is displayed in - another window. - - -- Command: magit-find-file-other-frame - - This command reads a filename and revision from the user and visits - the respective blob in a buffer. The buffer is displayed in - another frame. - - -File: magit.info, Node: Visiting Files and Blobs from a Diff, Prev: General-Purpose Visit Commands, Up: Visiting Files and Blobs - -5.8.2 Visiting Files and Blobs from a Diff ------------------------------------------- - -These commands can only be used when point is inside a diff. - -‘RET’ (‘magit-diff-visit-file’) - - This command visits the appropriate version of the file that the - diff at point is about. - - This commands visits the worktree version of the appropriate file. - The location of point inside the diff determines which file is - being visited. The visited version depends on what changes the - diff is about. - - • If the diff shows uncommitted changes (i.e. staged or - unstaged changes), then visit the file in the working tree - (i.e. the same "real" file that ‘find-file’ would visit. In - all other cases visit a "blob" (i.e. the version of a file as - stored in some commit). - - • If point is on a removed line, then visit the blob for the - first parent of the commit that removed that line, i.e. the - last commit where that line still exists. - - • If point is on an added or context line, then visit the blob - that adds that line, or if the diff shows from more than a - single commit, then visit the blob from the last of these - commits. - - In the file-visiting buffer this command goes to the line that - corresponds to the line that point is on in the diff. - - The buffer is displayed in the selected window. With a prefix - argument the buffer is displayed in another window instead. - - -- User Option: magit-diff-visit-previous-blob - - This option controls whether ‘magit-diff-visit-file’ may visit the - previous blob. When this is ‘t’ (the default) and point is on a - removed line in a diff for a committed change, then - ‘magit-diff-visit-file’ visits the blob from the last revision - which still had that line. - - Currently this is only supported for committed changes, for staged - and unstaged changes ‘magit-diff-visit-file’ always visits the file - in the working tree. - -‘C-’ (‘magit-diff-visit-file-worktree’) - - This command visits the worktree version of the appropriate file. - The location of point inside the diff determines which file is - being visited. Unlike ‘magit-diff-visit-file’ it always visits the - "real" file in the working tree, i.e the "current version" of the - file. - - In the file-visiting buffer this command goes to the line that - corresponds to the line that point is on in the diff. Lines that - were added or removed in the working tree, the index and other - commits in between are automatically accounted for. - - The buffer is displayed in the selected window. With a prefix - argument the buffer is displayed in another window instead. - - Variants of the above two commands exist that instead visit the file -in another window or in another frame. If you prefer such behavior, -then you may want to change the above key bindings, but note that the -above commands also use another window when invoked with a prefix -argument. - - -- Command: magit-diff-visit-file-other-window - -- Command: magit-diff-visit-file-other-frame - -- Command: magit-diff-visit-worktree-file-other-window - -- Command: magit-diff-visit-worktree-file-other-frame - - -File: magit.info, Node: Blaming, Prev: Visiting Files and Blobs, Up: Inspecting - -5.9 Blaming -=========== - -Also see *note (gitman)git-blame::. - - To start blaming invoke the ‘magit-file-dispatch’ transient prefix -command by pressing ‘C-c M-g’. (This is only the default binding and -the recommended binding is ‘C-c g’. Also neither binding may be -available if you disabled ‘global-magit-file-mode’. Also see *note -Minor Mode for Buffers Visiting Files::.) - - The blaming suffix commands can be invoked from the dispatch -transient. However if you want to set an infix argument, then you have -to enter the blaming sub-transient first. - - The key bindings shown below assume that you enter the dispatch -transient using the default binding. - -‘C-c M-g B’ (‘magit-blame’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - Note that not all of the following suffixes are available at all -times. For example if ‘magit-blame-mode’ is not enabled, then the -command whose purpose is to turn off that mode would not be of any use -and therefore isn’t available. - -‘C-c M-g b’ (‘magit-blame-addition’) -‘C-c M-g B b’ (‘magit-blame-addition’) - - This command augments each line or chunk of lines in the current - file-visiting or blob-visiting buffer with information about what - commits last touched these lines. - - If the buffer visits a revision of that file, then history up to - that revision is considered. Otherwise, the file’s full history is - considered, including uncommitted changes. - - If Magit-Blame mode is already turned on in the current buffer then - blaming is done recursively, by visiting REVISION:FILE (using - ‘magit-find-file’), where REVISION is a parent of the revision that - added the current line or chunk of lines. - -‘C-c M-g r’ (‘magit-blame-removal’) -‘C-c M-g B r’ (‘magit-blame-removal’) - - This command augments each line or chunk of lines in the current - blob-visiting buffer with information about the revision that - removes it. It cannot be used in file-visiting buffers. - - Like ‘magit-blame-addition’, this command can be used recursively. - -‘C-c M-g f’ (‘magit-blame-reverse’) -‘C-c M-g B f’ (‘magit-blame-reverse’) - - This command augments each line or chunk of lines in the current - file-visiting or blob-visiting buffer with information about the - last revision in which a line still existed. - - Like ‘magit-blame-addition’, this command can be used recursively. - -‘C-c M-g e’ (‘magit-blame-echo’) -‘C-c M-g B e’ (‘magit-blame-echo’) - - This command is like ‘magit-blame-addition’ except that it doesn’t - turn on ‘read-only-mode’ and that it initially uses the - visualization style specified by option ‘magit-blame-echo-style’. - - The following key bindings are available when Magit-Blame mode is -enabled and Read-Only mode is not enabled. These commands are also -available in other buffers; here only the behavior is described that is -relevant in file-visiting buffers that are being blamed. - -‘RET’ (‘magit-show-commit’) - - This command shows the commit that last touched the line at point. - -‘SPC’ (‘magit-diff-show-or-scroll-up’) - - This command updates the commit buffer. - - This either shows the commit that last touched the line at point in - the appropriate buffer, or if that buffer is already being - displayed in the current frame and if that buffer contains - information about that commit, then the buffer is scrolled up - instead. - -‘DEL’ (‘magit-diff-show-or-scroll-down’) - - This command updates the commit buffer. - - This either shows the commit that last touched the line at point in - the appropriate buffer, or if that buffer is already being - displayed in the current frame and if that buffer contains - information about that commit, then the buffer is scrolled down - instead. - - The following key bindings are available when both Magit-Blame mode -and Read-Only mode are enabled. - -‘b’ (‘magit-blame’) - - See above. - -‘n’ (‘magit-blame-next-chunk’) - - This command moves to the next chunk. - -‘N’ (‘magit-blame-next-chunk-same-commit’) - - This command moves to the next chunk from the same commit. - -‘p’ (‘magit-blame-previous-chunk’) - - This command moves to the previous chunk. - -‘P’ (‘magit-blame-previous-chunk-same-commit’) - - This command moves to the previous chunk from the same commit. - -‘q’ (‘magit-blame-quit’) - - This command turns off Magit-Blame mode. If the buffer was created - during a recursive blame, then it also kills the buffer. - -‘M-w’ (‘magit-blame-copy-hash’) - - This command saves the hash of the current chunk’s commit to the - kill ring. - - When the region is active, the command saves the region’s content - instead of the hash, like ‘kill-ring-save’ would. - -‘c’ (‘magit-blame-cycle-style’) - - This command changes how blame information is visualized in the - current buffer by cycling through the styles specified using the - option ‘magit-blame-styles’. - - Blaming is also controlled using the following options. - - -- User Option: magit-blame-styles - - This option defines a list of styles used to visualize blame - information. For now see its doc-string to learn more. - - -- User Option: magit-blame-echo-style - - This option specifies the blame visualization style used by the - command ‘magit-blame-echo’. This must be a symbol that is used as - the identifier for one of the styles defined in - ‘magit-blame-styles’. - - -- User Option: magit-blame-time-format - - This option specifies the format string used to display times when - showing blame information. - - -- User Option: magit-blame-read-only - - This option controls whether blaming a buffer also makes - temporarily read-only. - - -- User Option: magit-blame-disable-modes - - This option lists incompatible minor-modes that should be disabled - temporarily when a buffer contains blame information. They are - enabled again when the buffer no longer shows blame information. - - -- User Option: magit-blame-goto-chunk-hook - - This hook is run when moving between chunks. - - -File: magit.info, Node: Manipulating, Next: Transferring, Prev: Inspecting, Up: Top - -6 Manipulating -************** - -* Menu: - -* Creating Repository:: -* Cloning Repository:: -* Staging and Unstaging:: -* Applying:: -* Committing:: -* Branching:: -* Merging:: -* Resolving Conflicts:: -* Rebasing:: -* Cherry Picking:: -* Resetting:: -* Stashing:: - - -File: magit.info, Node: Creating Repository, Next: Cloning Repository, Up: Manipulating - -6.1 Creating Repository -======================= - -‘M-x magit-init’ (‘magit-init’) - - This command initializes a repository and then shows the status - buffer for the new repository. - - If the directory is below an existing repository, then the user has - to confirm that a new one should be created inside. If the - directory is the root of the existing repository, then the user has - to confirm that it should be reinitialized. - - -File: magit.info, Node: Cloning Repository, Next: Staging and Unstaging, Prev: Creating Repository, Up: Manipulating - -6.2 Cloning Repository -====================== - -To clone a remote or local repository use ‘C’, which is bound to the -command ‘magit-clone’. This command either act as a transient prefix -command, which binds several infix arguments and suffix commands, or it -can invoke ‘git clone’ directly, depending on whether a prefix argument -is used and on the value of ‘magit-clone-always-transient’. - - -- User Option: magit-clone-always-transient - - This option controls whether the command ‘magit-clone’ always acts - as a transient prefix command, regardless of whether a prefix - argument is used or not. If ‘t’, then that command always acts as - a transient prefix. If ‘nil’, then a prefix argument has to be - used for it to act as a transient. - -‘C’ (‘magit-clone’) - - This command either acts as a transient prefix command as described - above or does the same thing as ‘transient-clone-regular’ as - described below. - - If it acts as a transient prefix, then it binds the following - suffix commands and several infix arguments. - -‘C C’ (‘magit-clone-regular’) - - This command creates a regular clone of an existing repository. - The repository and the target directory are read from the user. - -‘C s’ (‘magit-clone-shallow’) - - This command creates a shallow clone of an existing repository. - The repository and the target directory are read from the user. By - default the depth of the cloned history is a single commit, but - with a prefix argument the depth is read from the user. - -‘C b’ (‘magit-clone-bare’) - - This command creates a bare clone of an existing repository. The - repository and the target directory are read from the user. - -‘C m’ (‘magit-clone-mirror’) - - This command creates a mirror of an existing repository. The - repository and the target directory are read from the user. - - The following suffixes are disabled by default. See *note -(transient)Enabling and Disabling Suffixes:: for how to enable them. - -‘C d’ (‘magit-clone-shallow-since’) - - This command creates a shallow clone of an existing repository. - Only commits that were committed after a date are cloned, which is - read from the user. The repository and the target directory are - also read from the user. - -‘C e’ (‘magit-clone-shallow-exclude’) - - This command creates a shallow clone of an existing repository. - This reads a branch or tag from the user. Commits that are - reachable from that are not cloned. The repository and the target - directory are also read from the user. - - -- User Option: magit-clone-set-remote-head - - This option controls whether cloning causes the reference - ‘refs/remotes//HEAD’ to be created in the clone. The - default is to delete the reference after running ‘git clone’, which - insists on creating it. This is because the reference has not been - found to be particularly useful as it is not automatically updated - when the ‘HEAD’ of the remote changes. Setting this option to ‘t’ - preserves Git’s default behavior of creating the reference. - - -- User Option: magit-clone-set-remote.pushDefault - - This option controls whether the value of the Git variable - ‘remote.pushDefault’ is set after cloning. - - • If ‘t’, then it is always set without asking. - - • If ‘ask’, then the users are asked every time they clone a - repository. - - • If ‘nil’, then it is never set. - - -- User Option: magit-clone-default-directory - - This option control the default directory name used when reading - the destination for a cloning operation. - - • If ‘nil’ (the default), then the value of ‘default-directory’ - is used. - - • If a directory, then that is used. - - • If a function, then that is called with the remote url as the - only argument and the returned value is used. - - -- User Option: magit-clone-name-alist - - This option maps regular expressions, which match repository names, - to repository urls, making it possible for users to enter short - names instead of urls when cloning repositories. - - Each element has the form ‘(REGEXP HOSTNAME USER)’. When the user - enters a name when a cloning command asks for a name or url, then - that is looked up in this list. The first element whose REGEXP - matches is used. - - The format specified by option ‘magit-clone-url-format’ is used to - turn the name into an url, using HOSTNAME and the repository name. - If the provided name contains a slash, then that is used. - Otherwise if the name omits the owner of the repository, then the - default user specified in the matched entry is used. - - If USER contains a dot, then it is treated as a Git variable and - the value of that is used as the username. Otherwise it is used as - the username itself. - - -- User Option: magit-clone-url-format - - The format specified by this option is used when turning repository - names into urls. ‘%h’ is the hostname and ‘%n’ is the repository - name, including the name of the owner. - - -File: magit.info, Node: Staging and Unstaging, Next: Applying, Prev: Cloning Repository, Up: Manipulating - -6.3 Staging and Unstaging -========================= - -Like Git, Magit can of course stage and unstage complete files. Unlike -Git, it also allows users to gracefully un-/stage individual hunks and -even just part of a hunk. To stage individual hunks and parts of hunks -using Git directly, one has to use the very modal and rather clumsy -interface of a ‘git add --interactive’ session. - - With Magit, on the other hand, one can un-/stage individual hunks by -just moving point into the respective section inside a diff displayed in -the status buffer or a separate diff buffer and typing ‘s’ or ‘u’. To -operate on just parts of a hunk, mark the changes that should be -un-/staged using the region and then press the same key that would be -used to un-/stage. To stage multiple files or hunks at once use a -region that starts inside the heading of such a section and ends inside -the heading of a sibling section of the same type. - - Besides staging and unstaging, Magit also provides several other -"apply variants" that can also operate on a file, multiple files at -once, a hunk, multiple hunks at once, and on parts of a hunk. These -apply variants are described in the next section. - - You can also use Ediff to stage and unstage. See *note Ediffing::. - -‘s’ (‘magit-stage’) - - Add the change at point to the staging area. - - With a prefix argument and an untracked file (or files) at point, - stage the file but not its content. This makes it possible to - stage only a subset of the new file’s changes. - -‘S’ (‘magit-stage-modified’) - - Stage all changes to files modified in the worktree. Stage all new - content of tracked files and remove tracked files that no longer - exist in the working tree from the index also. With a prefix - argument also stage previously untracked (but not ignored) files. - -‘u’ (‘magit-unstage’) - - Remove the change at point from the staging area. - - Only staged changes can be unstaged. But by default this command - performs an action that is somewhat similar to unstaging, when it - is called on a committed change: it reverses the change in the - index but not in the working tree. - -‘U’ (‘magit-unstage-all’) - - Remove all changes from the staging area. - - -- User Option: magit-unstage-committed - - This option controls whether ‘magit-unstage’ "unstages" committed - changes by reversing them in the index but not the working tree. - The alternative is to raise an error. - -‘M-x magit-reverse-in-index’ (‘magit-reverse-in-index’) - - This command reverses the committed change at point in the index - but not the working tree. By default no key is bound directly to - this command, but it is indirectly called when ‘u’ - (‘magit-unstage’) is pressed on a committed change. - - This allows extracting a change from ‘HEAD’, while leaving it in - the working tree, so that it can later be committed using a - separate commit. A typical workflow would be: - - • Optionally make sure that there are no uncommitted changes. - - • Visit the ‘HEAD’ commit and navigate to the change that should - not have been included in that commit. - - • Type ‘u’ (‘magit-unstage’) to reverse it in the index. This - assumes that ‘magit-unstage-committed-changes’ is non-nil. - - • Type ‘c e’ to extend ‘HEAD’ with the staged changes, including - those that were already staged before. - - • Optionally stage the remaining changes using ‘s’ or ‘S’ and - then type ‘c c’ to create a new commit. - -‘M-x magit-reset-index’ (‘magit-reset-index’) - - Reset the index to some commit. The commit is read from the user - and defaults to the commit at point. If there is no commit at - point, then it defaults to ‘HEAD’. - -* Menu: - -* Staging from File-Visiting Buffers:: - - -File: magit.info, Node: Staging from File-Visiting Buffers, Up: Staging and Unstaging - -6.3.1 Staging from File-Visiting Buffers ----------------------------------------- - -Fine-grained un-/staging has to be done from the status or a diff -buffer, but it’s also possible to un-/stage all changes made to the file -visited in the current buffer right from inside that buffer. - -‘M-x magit-stage-file’ (‘magit-stage-file’) - - When invoked inside a file-visiting buffer, then stage all changes - to that file. In a Magit buffer, stage the file at point if any. - Otherwise prompt for a file to be staged. With a prefix argument - always prompt the user for a file, even in a file-visiting buffer - or when there is a file section at point. - -‘M-x magit-unstage-file’ (‘magit-unstage-file’) - - When invoked inside a file-visiting buffer, then unstage all - changes to that file. In a Magit buffer, unstage the file at point - if any. Otherwise prompt for a file to be unstaged. With a prefix - argument always prompt the user for a file, even in a file-visiting - buffer or when there is a file section at point. - - -File: magit.info, Node: Applying, Next: Committing, Prev: Staging and Unstaging, Up: Manipulating - -6.4 Applying -============ - -Magit provides several "apply variants": stage, unstage, discard, -reverse, and "regular apply". At least when operating on a hunk they -are all implemented using ‘git apply’, which is why they are called -"apply variants". - - • Stage. Apply a change from the working tree to the index. The - change also remains in the working tree. - - • Unstage. Remove a change from the index. The change remains in - the working tree. - - • Discard. On a staged change, remove it from the working tree and - the index. On an unstaged change, remove it from the working tree - only. - - • Reverse. Reverse a change in the working tree. Both committed and - staged changes can be reversed. Unstaged changes cannot be - reversed. Discard them instead. - - • Apply. Apply a change to the working tree. Both committed and - staged changes can be applied. Unstaged changes cannot be applied - - as they already have been applied. - - The previous section described the staging and unstaging commands. -What follows are the commands which implement the remaining apply -variants. - -‘a’ (‘magit-apply’) - - Apply the change at point to the working tree. - - With a prefix argument fallback to a 3-way merge. Doing so causes - the change to be applied to the index as well. - -‘k’ (‘magit-discard’) - - Remove the change at point from the working tree. - -‘v’ (‘magit-reverse’) - - Reverse the change at point in the working tree. - - With a prefix argument fallback to a 3-way merge. Doing so causes - the change to be applied to the index as well. - - With a prefix argument all apply variants attempt a 3-way merge when -appropriate (i.e. when ‘git apply’ is used internally). - - -File: magit.info, Node: Committing, Next: Branching, Prev: Applying, Up: Manipulating - -6.5 Committing -============== - -When the user initiates a commit, Magit calls ‘git commit’ without any -arguments, so Git has to get it from the user. It creates the file -‘.git/COMMIT_EDITMSG’ and then opens that file in an editor. Magit -arranges for that editor to be the Emacsclient. Once the user finishes -the editing session, the Emacsclient exits and Git creates the commit -using the file’s content as message. - -* Menu: - -* Initiating a Commit:: -* Editing Commit Messages:: - - -File: magit.info, Node: Initiating a Commit, Next: Editing Commit Messages, Up: Committing - -6.5.1 Initiating a Commit -------------------------- - -Also see *note (gitman)git-commit::. - -‘c’ (‘magit-commit’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘c c’ (‘magit-commit-create’) - - Create a new commit on ‘HEAD’. With a prefix argument amend to the - commit at ‘HEAD’ instead. - -‘c a’ (‘magit-commit-amend’) - - Amend the last commit. - -‘c e’ (‘magit-commit-extend’) - - Amend the last commit, without editing the message. With a prefix - argument keep the committer date, otherwise change it. The option - ‘magit-commit-extend-override-date’ can be used to inverse the - meaning of the prefix argument. - - Non-interactively respect the optional OVERRIDE-DATE argument and - ignore the option. - -‘c w’ (‘magit-commit-reword’) - - Reword the last commit, ignoring staged changes. With a prefix - argument keep the committer date, otherwise change it. The option - ‘magit-commit-reword-override-date’ can be used to inverse the - meaning of the prefix argument. - - Non-interactively respect the optional OVERRIDE-DATE argument and - ignore the option. - -‘c f’ (‘magit-commit-fixup’) - - Create a fixup commit. - - With a prefix argument the target commit has to be confirmed. - Otherwise the commit at point may be used without confirmation - depending on the value of option ‘magit-commit-squash-confirm’. - -‘c F’ (‘magit-commit-instant-fixup’) - - Create a fixup commit and instantly rebase. - -‘c s’ (‘magit-commit-squash’) - - Create a squash commit, without editing the squash message. - - With a prefix argument the target commit has to be confirmed. - Otherwise the commit at point may be used without confirmation - depending on the value of option ‘magit-commit-squash-confirm’. - -‘c S’ (‘magit-commit-instant-squash’) - - Create a squash commit and instantly rebase. - -‘c A’ (‘magit-commit-augment’) - - Create a squash commit, editing the squash message. - - With a prefix argument the target commit has to be confirmed. - Otherwise the commit at point may be used without confirmation - depending on the value of option ‘magit-commit-squash-confirm’. - - -- User Option: magit-commit-ask-to-stage - - Whether to ask to stage all unstaged changes when committing and - nothing is staged. - - -- User Option: magit-commit-extend-override-date - - Whether using ‘magit-commit-extend’ changes the committer date. - - -- User Option: magit-commit-reword-override-date - - Whether using ‘magit-commit-reword’ changes the committer date. - - -- User Option: magit-commit-squash-confirm - - Whether the commit targeted by squash and fixup has to be - confirmed. When non-nil then the commit at point (if any) is used - as default choice. Otherwise it has to be confirmed. This option - only affects ‘magit-commit-squash’ and ‘magit-commit-fixup’. The - "instant" variants always require confirmation because making an - error while using those is harder to recover from. - - -File: magit.info, Node: Editing Commit Messages, Prev: Initiating a Commit, Up: Committing - -6.5.2 Editing Commit Messages ------------------------------ - -After initiating a commit as described in the previous section, two new -buffers appear. One shows the changes that are about to be committed, -while the other is used to write the message. - - Commit messages are edited in an edit session - in the background -‘git’ is waiting for the editor, in our case ‘emacsclient’, to save the -commit message in a file (in most cases ‘.git/COMMIT_EDITMSG’) and then -return. If the editor returns with a non-zero exit status then ‘git’ -does not create the commit. So the most important commands are those -for finishing and aborting the commit. - -‘C-c C-c’ (‘with-editor-finish’) - - Finish the current editing session by returning with exit code 0. - Git then creates the commit using the message it finds in the file. - -‘C-c C-k’ (‘with-editor-cancel’) - - Cancel the current editing session by returning with exit code 1. - Git then cancels the commit, but leaves the file untouched. - - In addition to being used by ‘git commit’, messages may also be -stored in a ring that persists until Emacs is closed. By default the -message is stored at the beginning and the end of an edit session -(regardless of whether the session is finished successfully or was -canceled). It is sometimes useful to bring back messages from that -ring. - -‘C-c M-s’ (‘git-commit-save-message’) - - Save the current buffer content to the commit message ring. - -‘M-p’ (‘git-commit-prev-message’) - - Cycle backward through the commit message ring, after saving the - current message to the ring. With a numeric prefix ARG, go back - ARG comments. - -‘M-n’ (‘git-commit-next-message’) - - Cycle forward through the commit message ring, after saving the - current message to the ring. With a numeric prefix ARG, go back - ARG comments. - - By default the diff for the changes that are about to be committed -are automatically shown when invoking the commit. To prevent that, -remove ‘magit-commit-diff’ from ‘server-switch-hook’. - - When amending to an existing commit it may be useful to show either -the changes that are about to be added to that commit or to show those -changes alongside those that have already been committed. - -‘C-c C-d’ (‘magit-diff-while-committing’) - - While committing, show the changes that are about to be committed. - While amending, invoking the command again toggles between showing - just the new changes or all the changes that will be committed. - -* Menu: - -* Using the Revision Stack:: -* Commit Pseudo Headers:: -* Commit Mode and Hooks:: -* Commit Message Conventions:: - - -File: magit.info, Node: Using the Revision Stack, Next: Commit Pseudo Headers, Up: Editing Commit Messages - -Using the Revision Stack -........................ - -‘C-c C-w’ (‘magit-pop-revision-stack’) - - This command inserts a representation of a revision into the - current buffer. It can be used inside buffers used to write commit - messages but also in other buffers such as buffers used to edit - emails or ChangeLog files. - - By default this command pops the revision which was last added to - the ‘magit-revision-stack’ and inserts it into the current buffer - according to ‘magit-pop-revision-stack-format’. Revisions can be - put on the stack using ‘magit-copy-section-value’ and - ‘magit-copy-buffer-revision’. - - If the stack is empty or with a prefix argument it instead reads a - revision in the minibuffer. By using the minibuffer history this - allows selecting an item which was popped earlier or to insert an - arbitrary reference or revision without first pushing it onto the - stack. - - When reading the revision from the minibuffer, then it might not be - possible to guess the correct repository. When this command is - called inside a repository (e.g. while composing a commit - message), then that repository is used. Otherwise (e.g. while - composing an email) then the repository recorded for the top - element of the stack is used (even though we insert another - revision). If not called inside a repository and with an empty - stack, or with two prefix arguments, then read the repository in - the minibuffer too. - - -- User Option: magit-pop-revision-stack-format - - This option controls how the command ‘magit-pop-revision-stack’ - inserts a revision into the current buffer. - - The entries on the stack have the format ‘(HASH TOPLEVEL)’ and this - option has the format ‘(POINT-FORMAT EOB-FORMAT INDEX-REGEXP)’, all - of which may be nil or a string (though either one of EOB-FORMAT or - POINT-FORMAT should be a string, and if INDEX-REGEXP is non-nil, - then the two formats should be too). - - First INDEX-REGEXP is used to find the previously inserted entry, - by searching backward from point. The first submatch must match - the index number. That number is incremented by one, and becomes - the index number of the entry to be inserted. If you don’t want to - number the inserted revisions, then use nil for INDEX-REGEXP. - - If INDEX-REGEXP is non-nil then both POINT-FORMAT and EOB-FORMAT - should contain \"%N\", which is replaced with the number that was - determined in the previous step. - - Both formats, if non-nil and after removing %N, are then expanded - using ‘git show --format=FORMAT ...’ inside TOPLEVEL. - - The expansion of POINT-FORMAT is inserted at point, and the - expansion of EOB-FORMAT is inserted at the end of the buffer (if - the buffer ends with a comment, then it is inserted right before - that). - - -File: magit.info, Node: Commit Pseudo Headers, Next: Commit Mode and Hooks, Prev: Using the Revision Stack, Up: Editing Commit Messages - -Commit Pseudo Headers -..................... - -Some projects use pseudo headers in commit messages. Magit colorizes -such headers and provides some commands to insert such headers. - - -- User Option: git-commit-known-pseudo-headers - - A list of Git pseudo headers to be highlighted. - -‘C-c C-i’ (‘git-commit-insert-pseudo-header’) - - Insert a commit message pseudo header. - -‘C-c C-a’ (‘git-commit-ack’) - - Insert a header acknowledging that you have looked at the commit. - -‘C-c C-r’ (‘git-commit-review’) - - Insert a header acknowledging that you have reviewed the commit. - -‘C-c C-s’ (‘git-commit-signoff’) - - Insert a header to sign off the commit. - -‘C-c C-t’ (‘git-commit-test’) - - Insert a header acknowledging that you have tested the commit. - -‘C-c C-o’ (‘git-commit-cc’) - - Insert a header mentioning someone who might be interested. - -‘C-c C-p’ (‘git-commit-reported’) - - Insert a header mentioning the person who reported the issue being - fixed by the commit. - -‘C-c M-i’ (‘git-commit-suggested’) - - Insert a header mentioning the person who suggested the change. - - -File: magit.info, Node: Commit Mode and Hooks, Next: Commit Message Conventions, Prev: Commit Pseudo Headers, Up: Editing Commit Messages - -Commit Mode and Hooks -..................... - -‘git-commit-mode’ is a minor mode that is only used to establish certain -key bindings. This makes it possible to use an arbitrary major mode in -buffers used to edit commit messages. It is even possible to use -different major modes in different repositories, which is useful when -different projects impose different commit message conventions. - - -- User Option: git-commit-major-mode - - The value of this option is the major mode used to edit Git commit - messages. - - Because ‘git-commit-mode’ is a minor mode, we don’t use its mode hook -to setup the buffer, except for the key bindings. All other setup -happens in the function ‘git-commit-setup’, which among other things -runs the hook ‘git-commit-setup-hook’. - - -- User Option: git-commit-setup-hook - - Hook run at the end of ‘git-commit-setup’. - -The following functions are suitable for this hook: - - -- Function: git-commit-save-message - - Save the current buffer content to the commit message ring. - - -- Function: git-commit-setup-changelog-support - - After this function is called, ChangeLog entries are treated as - paragraphs. - - -- Function: git-commit-turn-on-auto-fill - - Turn on ‘auto-fill-mode’ and set ‘fill-column’ to the value of - ‘git-commit-fill-column’. - - -- Function: git-commit-turn-on-flyspell - - Turn on Flyspell mode. Also prevent comments from being checked - and finally check current non-comment text. - - -- Function: git-commit-propertize-diff - - Propertize the diff shown inside the commit message buffer. Git - inserts such diffs into the commit message template when the - ‘--verbose’ argument is used. ‘magit-commit’ by default does not - offer that argument because the diff that is shown in a separate - buffer is more useful. But some users disagree, which is why this - function exists. - - -- Function: bug-reference-mode - - Hyperlink bug references in the buffer. - - -- Function: with-editor-usage-message - - Show usage information in the echo area. - - -- User Option: git-commit-setup-hook - - Hook run after the user finished writing a commit message. - - This hook is only run after pressing ‘C-c C-c’ in a buffer used to - edit a commit message. If a commit is created without the user - typing a message into a buffer, then this hook is not run. - - This hook is not run until the new commit has been created. If - doing so takes Git longer than one second, then this hook isn’t run - at all. For certain commands such as ‘magit-rebase-continue’ this - hook is never run because doing so would lead to a race condition. - - This hook is only run if ‘magit’ is available. - - Also see ‘magit-post-commit-hook’. - - -File: magit.info, Node: Commit Message Conventions, Prev: Commit Mode and Hooks, Up: Editing Commit Messages - -Commit Message Conventions -.......................... - -Git-Commit highlights certain violations of commonly accepted commit -message conventions. Certain violations even cause Git-Commit to ask -you to confirm that you really want to do that. This nagging can of -course be turned off, but the result of doing that usually is that -instead of some code it’s now the human who is reviewing your commits -who has to waste some time telling you to fix your commits. - - -- User Option: git-commit-summary-max-length - - The intended maximal length of the summary line of commit messages. - Characters beyond this column are colorized to indicate that this - preference has been violated. - - -- User Option: git-commit-fill-column - - Column beyond which automatic line-wrapping should happen in commit - message buffers. - - -- User Option: git-commit-finish-query-functions - - List of functions called to query before performing commit. - - The commit message buffer is current while the functions are - called. If any of them returns nil, then the commit is not - performed and the buffer is not killed. The user should then fix - the issue and try again. - - The functions are called with one argument. If it is non-nil then - that indicates that the user used a prefix argument to force - finishing the session despite issues. Functions should usually - honor this wish and return non-nil. - - By default the only member is ‘git-commit-check-style-conventions’. - - -- Function: git-commit-check-style-conventions - - This function checks for violations of certain basic style - conventions. For each violation it asks users if they want to - proceed anyway. - - -- User Option: git-commit-style-convention-checks - - This option controls what conventions the function by the same name - tries to enforce. The value is a list of self-explanatory symbols - identifying certain conventions; ‘non-empty-second-line’ and - ‘overlong-summary-line’. - - -File: magit.info, Node: Branching, Next: Merging, Prev: Committing, Up: Manipulating - -6.6 Branching -============= - -* Menu: - -* The Two Remotes:: -* Branch Commands:: -* Branch Git Variables:: -* Auxiliary Branch Commands:: - - -File: magit.info, Node: The Two Remotes, Next: Branch Commands, Up: Branching - -6.6.1 The Two Remotes ---------------------- - -The upstream branch of some local branch is the branch into which the -commits on that local branch should eventually be merged, usually -something like ‘origin/master’. For the ‘master’ branch itself the -upstream branch and the branch it is being pushed to, are usually the -same remote branch. But for a feature branch the upstream branch and -the branch it is being pushed to should differ. - - The commits on feature branches too should _eventually_ end up in a -remote branch such as ‘origin/master’ or ‘origin/maint’. Such a branch -should therefore be used as the upstream. But feature branches -shouldn’t be pushed directly to such branches. Instead a feature branch -‘my-feature’ is usually pushed to ‘my-fork/my-feature’ or if you are a -contributor ‘origin/my-feature’. After the new feature has been -reviewed, the maintainer merges the feature into ‘master’. And finally -‘master’ (not ‘my-feature’ itself) is pushed to ‘origin/master’. - - But new features seldom are perfect on the first try, and so feature -branches usually have to be reviewed, improved, and re-pushed several -times. Pushing should therefore be easy to do, and for that reason many -Git users have concluded that it is best to use the remote branch to -which the local feature branch is being pushed as its upstream. - - But luckily Git has long ago gained support for a push-remote which -can be configured separately from the upstream branch, using the -variables ‘branch..pushRemote’ and ‘remote.pushDefault’. So we no -longer have to choose which of the two remotes should be used as "the -remote". - - Each of the fetching, pulling, and pushing transient commands -features three suffix commands that act on the current branch and some -other branch. Of these, ‘p’ is bound to a command which acts on the -push-remote, ‘u’ is bound to a command which acts on the upstream, and -‘e’ is bound to a command which acts on any other branch. The status -buffer shows unpushed and unpulled commits for both the push-remote and -the upstream. - - It’s fairly simple to configure these two remotes. The values of all -the variables that are related to fetching, pulling, and pushing (as -well as some other branch-related variables) can be inspected and -changed using the command ‘magit-branch-configure’, which is available -from many transient prefix commands that deal with branches. It is also -possible to set the push-remote or upstream while pushing (see *note -Pushing::). - - -File: magit.info, Node: Branch Commands, Next: Branch Git Variables, Prev: The Two Remotes, Up: Branching - -6.6.2 Branch Commands ---------------------- - -The transient prefix command ‘magit-branch’ is used to create and -checkout branches, and to make changes to existing branches. It is not -used to fetch, pull, merge, rebase, or push branches, i.e. this command -deals with branches themselves, not with the commits reachable from -them. Those features are available from separate transient command. - -‘b’ (‘magit-branch’) - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - - By default it also binds and displays the values of some - branch-related Git variables and allows changing their values. - - -- User Option: magit-branch-direct-configure - - This option controls whether the transient command ‘magit-branch’ - can be used directly change the values Git variables. This - defaults to ‘t’ (to avoid changing key bindings). When set to - ‘nil’, then no variables are displayed by that transient command, - and its suffix command ‘magit-branch-configure’ has to be used - instead to view and change branch related variables. - -‘b C’ (‘magit-branch-configure’) -‘f C’ (‘magit-branch-configure’) -‘F C’ (‘magit-branch-configure’) -‘P C’ (‘magit-branch-configure’) - - This transient prefix command binds commands that set the value of - branch-related variables and displays them in a temporary buffer - until the transient is exited. - - With a prefix argument, this command always prompts for a branch. - - Without a prefix argument this depends on whether it was invoked as - a suffix of ‘magit-branch’ and on the - ‘magit-branch-direct-configure’ option. If ‘magit-branch’ already - displays the variables for the current branch, then it isn’t useful - to invoke another transient that displays them for the same branch. - In that case this command prompts for a branch. - - The variables are described in *note Branch Git Variables::. - -‘b b’ (‘magit-checkout’) - - Checkout a revision read in the minibuffer and defaulting to the - branch or arbitrary revision at point. If the revision is a local - branch then that becomes the current branch. If it is something - else then ‘HEAD’ becomes detached. Checkout fails if the working - tree or the staging area contain changes. - -‘b n’ (‘magit-branch-create’) - - Create a new branch. The user is asked for a branch or arbitrary - revision to use as the starting point of the new branch. When a - branch name is provided, then that becomes the upstream branch of - the new branch. The name of the new branch is also read in the - minibuffer. - - Also see option ‘magit-branch-prefer-remote-upstream’. - -‘b c’ (‘magit-branch-and-checkout’) - - This command creates a new branch like ‘magit-branch’, but then - also checks it out. - - Also see option ‘magit-branch-prefer-remote-upstream’. - -‘b l’ (‘magit-branch-checkout’) - - This command checks out an existing or new local branch. It reads - a branch name from the user offering all local branches and a - subset of remote branches as candidates. Remote branches for which - a local branch by the same name exists are omitted from the list of - candidates. The user can also enter a completely new branch name. - - • If the user selects an existing local branch, then that is - checked out. - - • If the user selects a remote branch, then it creates and - checks out a new local branch with the same name, and - configures the selected remote branch as the push target. - - • If the user enters a new branch name, then it creates and - checks that out, after also reading the starting-point from - the user. - - In the latter two cases the upstream is also set. Whether it is - set to the chosen starting point or something else depends on the - value of ‘magit-branch-adjust-remote-upstream-alist’. - -‘b s’ (‘magit-branch-spinoff’) - - This command creates and checks out a new branch starting at and - tracking the current branch. That branch in turn is reset to the - last commit it shares with its upstream. If the current branch has - no upstream or no unpushed commits, then the new branch is created - anyway and the previously current branch is not touched. - - This is useful to create a feature branch after work has already - began on the old branch (likely but not necessarily "master"). - - If the current branch is a member of the value of option - ‘magit-branch-prefer-remote-upstream’ (which see), then the current - branch will be used as the starting point as usual, but the - upstream of the starting-point may be used as the upstream of the - new branch, instead of the starting-point itself. - - If optional FROM is non-nil, then the source branch is reset to - ‘FROM~’, instead of to the last commit it shares with its upstream. - Interactively, FROM is only ever non-nil, if the region selects - some commits, and among those commits, FROM is the commit that is - the fewest commits ahead of the source branch. - - The commit at the other end of the selection actually does not - matter, all commits between FROM and ‘HEAD’ are moved to the new - branch. If FROM is not reachable from ‘HEAD’ or is reachable from - the source branch’s upstream, then an error is raised. - -‘b S’ (‘magit-branch-spinout’) - - This command behaves like ‘magit-branch-spinoff’, except that it - does not change the current branch. If there are any uncommitted - changes, then it behaves exactly like ‘magit-branch-spinoff’. - -‘b x’ (‘magit-branch-reset’) - - This command resets a branch, defaulting to the branch at point, to - the tip of another branch or any other commit. - - When the branch being reset is the current branch, then a hard - reset is performed. If there are any uncommitted changes, then the - user has to confirm the reset because those changes would be lost. - - This is useful when you have started work on a feature branch but - realize it’s all crap and want to start over. - - When resetting to another branch and a prefix argument is used, - then the target branch is set as the upstream of the branch that is - being reset. - -‘b k’ (‘magit-branch-delete’) - - Delete one or multiple branches. If the region marks multiple - branches, then offer to delete those. Otherwise, prompt for a - single branch to be deleted, defaulting to the branch at point. - -‘b r’ (‘magit-branch-rename’) - - Rename a branch. The branch and the new name are read in the - minibuffer. With prefix argument the branch is renamed even if - that name conflicts with an existing branch. - - -- User Option: magit-branch-read-upstream-first - - When creating a branch, whether to read the upstream branch before - the name of the branch that is to be created. The default is - ‘nil’, and I recommend you leave it at that. - - -- User Option: magit-branch-prefer-remote-upstream - - This option specifies whether remote upstreams are favored over - local upstreams when creating new branches. - - When a new branch is created, then the branch, commit, or stash at - point is suggested as the starting point of the new branch, or if - there is no such revision at point the current branch. In either - case the user may choose another starting point. - - If the chosen starting point is a branch, then it may also be set - as the upstream of the new branch, depending on the value of the - Git variable ‘branch.autoSetupMerge’. By default this is done for - remote branches, but not for local branches. - - You might prefer to always use some remote branch as upstream. If - the chosen starting point is (1) a local branch, (2) whose name - matches a member of the value of this option, (3) the upstream of - that local branch is a remote branch with the same name, and (4) - that remote branch can be fast-forwarded to the local branch, then - the chosen branch is used as starting point, but its own upstream - is used as the upstream of the new branch. - - Members of this option’s value are treated as branch names that - have to match exactly unless they contain a character that makes - them invalid as a branch name. Recommended characters to use to - trigger interpretation as a regexp are "*" and "^". Some other - characters which you might expect to be invalid, actually are not, - e.g. ".+$" are all perfectly valid. More precisely, if ‘git - check-ref-format --branch STRING’ exits with a non-zero status, - then treat STRING as a regexp. - - Assuming the chosen branch matches these conditions you would end - up with with e.g.: - - feature --upstream--> origin/master - - instead of - - feature --upstream--> master --upstream--> origin/master - - Which you prefer is a matter of personal preference. If you do - prefer the former, then you should add branches such as ‘master’, - ‘next’, and ‘maint’ to the value of this options. - - -- User Option: magit-branch-adjust-remote-upstream-alist - - The value of this option is an alist of branches to be used as the - upstream when branching a remote branch. - - When creating a local branch from an ephemeral branch located on a - remote, e.g. a feature or hotfix branch, then that remote branch - should usually not be used as the upstream branch, since the - push-remote already allows accessing it and having both the - upstream and the push-remote reference the same related branch - would be wasteful. Instead a branch like "maint" or "master" - should be used as the upstream. - - This option allows specifying the branch that should be used as the - upstream when branching certain remote branches. The value is an - alist of the form ‘((UPSTREAM . RULE)...)’. The first matching - element is used, the following elements are ignored. - - UPSTREAM is the branch to be used as the upstream for branches - specified by RULE. It can be a local or a remote branch. - - RULE can either be a regular expression, matching branches whose - upstream should be the one specified by UPSTREAM. Or it can be a - list of the only branches that should *not* use UPSTREAM; all other - branches will. Matching is done after stripping the remote part of - the name of the branch that is being branched from. - - If you use a finite set of non-ephemeral branches across all your - repositories, then you might use something like: - - (("origin/master" "master" "next" "maint")) - - Or if the names of all your ephemeral branches contain a slash, at - least in some repositories, then a good value could be: - - (("origin/master" . "/")) - - Of course you can also fine-tune: - - (("origin/maint" . "\\`hotfix/") - ("origin/master" . "\\`feature/")) - - -- Command: magit-branch-orphan - - This command creates and checks out a new orphan branch with - contents from a given revision. - - -- Command: magit-branch-or-checkout - - This command is a hybrid between ‘magit-checkout’ and - ‘magit-branch-and-checkout’ and is intended as a replacement for - the former in ‘magit-branch’. - - It first asks the user for an existing branch or revision. If the - user input actually can be resolved as a branch or revision, then - it checks that out, just like ‘magit-checkout’ would. - - Otherwise it creates and checks out a new branch using the input as - its name. Before doing so it reads the starting-point for the new - branch. This is similar to what ‘magit-branch-and-checkout’ does. - - To use this command instead of ‘magit-checkout’ add this to your - init file: - - (transient-replace-suffix 'magit-branch 'magit-checkout - '("b" "dwim" magit-branch-or-checkout)) - - -File: magit.info, Node: Branch Git Variables, Next: Auxiliary Branch Commands, Prev: Branch Commands, Up: Branching - -6.6.3 Branch Git Variables --------------------------- - -These variables can be set from the transient prefix command -‘magit-branch-configure’. By default they can also be set from -‘magit-branch’. See *note Branch Commands::. - - -- Variable: branch.NAME.merge - - Together with ‘branch.NAME.remote’ this variable defines the - upstream branch of the local branch named NAME. The value of this - variable is the full reference of the upstream _branch_. - - -- Variable: branch.NAME.remote - - Together with ‘branch.NAME.merge’ this variable defines the - upstream branch of the local branch named NAME. The value of this - variable is the name of the upstream _remote_. - - -- Variable: branch.NAME.rebase - - This variable controls whether pulling into the branch named NAME - is done by rebasing or by merging the fetched branch. - - • When ‘true’ then pulling is done by rebasing. - - • When ‘false’ then pulling is done by merging. - - • When undefined then the value of ‘pull.rebase’ is used. The - default of that variable is ‘false’. - - -- Variable: branch.NAME.pushRemote - - This variable specifies the remote that the branch named NAME is - usually pushed to. The value has to be the name of an existing - remote. - - It is not possible to specify the name of _branch_ to push the - local branch to. The name of the remote branch is always the same - as the name of the local branch. - - If this variable is undefined but ‘remote.pushDefault’ is defined, - then the value of the latter is used. By default - ‘remote.pushDefault’ is undefined. - - -- Variable: branch.NAME.description - - This variable can be used to describe the branch named NAME. That - description is used e.g. when turning the branch into a series of - patches. - - The following variables specify defaults which are used if the above -branch-specific variables are not set. - - -- Variable: pull.rebase - - This variable specifies whether pulling is done by rebasing or by - merging. It can be overwritten using ‘branch.NAME.rebase’. - - • When ‘true’ then pulling is done by rebasing. - - • When ‘false’ (the default) then pulling is done by merging. - - Since it is never a good idea to merge the upstream branch into a - feature or hotfix branch and most branches are such branches, you - should consider setting this to ‘true’, and ‘branch.master.rebase’ - to ‘false’. - - -- Variable: remote.pushDefault - - This variable specifies what remote the local branches are usually - pushed to. This can be overwritten per branch using - ‘branch.NAME.pushRemote’. - - The following variables are used during the creation of a branch and -control whether the various branch-specific variables are automatically -set at this time. - - -- Variable: branch.autoSetupMerge - - This variable specifies under what circumstances creating a branch - NAME should result in the variables ‘branch.NAME.merge’ and - ‘branch.NAME.remote’ being set according to the starting point used - to create the branch. If the starting point isn’t a branch, then - these variables are never set. - - • When ‘always’ then the variables are set regardless of whether - the starting point is a local or a remote branch. - - • When ‘true’ (the default) then the variables are set when the - starting point is a remote branch, but not when it is a local - branch. - - • When ‘false’ then the variables are never set. - - -- Variable: branch.autoSetupRebase - - This variable specifies whether creating a branch NAME should - result in the variable ‘branch.NAME.rebase’ being set to ‘true’. - - • When ‘always’ then the variable is set regardless of whether - the starting point is a local or a remote branch. - - • When ‘local’ then the variable are set when the starting point - is a local branch, but not when it is a remote branch. - - • When ‘remote’ then the variable are set when the starting - point is a remote branch, but not when it is a local branch. - - • When ‘never’ (the default) then the variable is never set. - - Note that the respective commands always change the repository-local -values. If you want to change the global value, which is used when the -local value is undefined, then you have to do so on the command line, -e.g.: - - git config --global remote.autoSetupMerge always - - For more information about these variables you should also see - - *note (gitman)git-config::. Also see *note (gitman)git-branch::. , -*note (gitman)git-checkout::. and *note Pushing::. - - -- User Option: magit-prefer-remote-upstream - - This option controls whether commands that read a branch from the - user and then set it as the upstream branch, offer a local or a - remote branch as default completion candidate, when they have the - choice. - - This affects all commands that use ‘magit-read-upstream-branch’ or - ‘magit-read-starting-point’, which includes all commands that - change the upstream and many which create new branches. - - -File: magit.info, Node: Auxiliary Branch Commands, Prev: Branch Git Variables, Up: Branching - -6.6.4 Auxiliary Branch Commands -------------------------------- - -These commands are not available from the transient ‘magit-branch’ by -default. - - -- Command: magit-branch-shelve - - This command shelves a branch. This is done by deleting the - branch, and creating a new reference "refs/shelved/BRANCH-NAME" - pointing at the same commit as the branch pointed at. If the - deleted branch had a reflog, then that is preserved as the reflog - of the new reference. - - This is useful if you want to move a branch out of sight, but are - not ready to completely discard it yet. - - -- Command: magit-branch-unshelve - - This command unshelves a branch that was previously shelved using - ‘magit-branch-shelve’. This is done by deleting the reference - "refs/shelved/BRANCH-NAME" and creating a branch "BRANCH-NAME" - pointing at the same commit as the deleted reference pointed at. - If the deleted reference had a reflog, then that is restored as the - reflog of the branch. - - -File: magit.info, Node: Merging, Next: Resolving Conflicts, Prev: Branching, Up: Manipulating - -6.7 Merging -=========== - -Also see *note (gitman)git-merge::. For information on how to resolve -merge conflicts see the next section. - -‘m’ (‘magit-merge’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - When no merge is in progress, then the transient features the -following suffix commands. - -‘m m’ (‘magit-merge-plain’) - - This command merges another branch or an arbitrary revision into - the current branch. The branch or revision to be merged is read in - the minibuffer and defaults to the branch at point. - - Unless there are conflicts or a prefix argument is used, then the - resulting merge commit uses a generic commit message, and the user - does not get a chance to inspect or change it before the commit is - created. With a prefix argument this does not actually create the - merge commit, which makes it possible to inspect how conflicts were - resolved and to adjust the commit message. - -‘m e’ (‘magit-merge-editmsg’) - - This command merges another branch or an arbitrary revision into - the current branch and opens a commit message buffer, so that the - user can make adjustments. The commit is not actually created - until the user finishes with ‘C-c C-c’. - -‘m n’ (‘magit-merge-nocommit’) - - This command merges another branch or an arbitrary revision into - the current branch, but does not actually create the merge commit. - The user can then further adjust the merge, even when automatic - conflict resolution succeeded and/or adjust the commit message. - -‘m a’ (‘magit-merge-absorb’) - - This command merges another local branch into the current branch - and then removes the former. - - Before the source branch is merged, it is first force pushed to its - push-remote, provided the respective remote branch already exists. - This ensures that the respective pull-request (if any) won’t get - stuck on some obsolete version of the commits that are being - merged. Finally, if ‘magit-branch-pull-request’ was used to create - the merged branch, then the respective remote branch is also - removed. - -‘m i’ (‘magit-merge-into’) - - This command merges the current branch into another local branch - and then removes the former. The latter becomes the new current - branch. - - Before the source branch is merged, it is first force pushed to its - push-remote, provided the respective remote branch already exists. - This ensures that the respective pull-request (if any) won’t get - stuck on some obsolete version of the commits that are being - merged. Finally, if ‘magit-branch-pull-request’ was used to create - the merged branch, then the respective remote branch is also - removed. - -‘m s’ (‘magit-merge-squash’) - - This command squashes the changes introduced by another branch or - an arbitrary revision into the current branch. This only applies - the changes made by the squashed commits. No information is - preserved that would allow creating an actual merge commit. - Instead of this command you should probably use a command from the - apply transient. - -‘m p’ (‘magit-merge-preview’) - - This command shows a preview of merging another branch or an - arbitrary revision into the current branch. - - When a merge is in progress, then the transient instead features the -following suffix commands. - -‘m m’ (‘magit-merge’) - - After the user resolved conflicts, this command proceeds with the - merge. If some conflicts weren’t resolved, then this command - fails. - -‘m a’ (‘magit-merge-abort’) - - This command aborts the current merge operation. - - -File: magit.info, Node: Resolving Conflicts, Next: Rebasing, Prev: Merging, Up: Manipulating - -6.8 Resolving Conflicts -======================= - -When merging branches (or otherwise combining or changing history) -conflicts can occur. If you edited two completely different parts of -the same file in two branches and then merge one of these branches into -the other, then Git can resolve that on its own, but if you edit the -same area of a file, then a human is required to decide how the two -versions, or "sides of the conflict", are to be combined into one. - - Here we can only provide a brief introduction to the subject and -point you toward some tools that can help. If you are new to this, then -please also consult Git’s own documentation as well as other resources. - - If a file has conflicts and Git cannot resolve them by itself, then -it puts both versions into the affected file along with special markers -whose purpose is to denote the boundaries of the unresolved part of the -file and between the different versions. These boundary lines begin -with the strings consisting of six times the same character, one of ‘<’, -‘|’, ‘=’ and ‘>’ and are followed by information about the source of the -respective versions, e.g.: - - <<<<<<< HEAD - Take the blue pill. - ======= - Take the red pill. - >>>>>>> feature - - In this case you have chosen to take the red pill on one branch and -on another you picked the blue pill. Now that you are merging these two -diverging branches, Git cannot possibly know which pill you want to -take. - - To resolve that conflict you have to create a version of the affected -area of the file by keeping only one of the sides, possibly by editing -it in order to bring in the changes from the other side, remove the -other versions as well as the markers, and then stage the result. A -possible resolution might be: - - Take both pills. - - Often it is useful to see not only the two sides of the conflict but -also the "original" version from before the same area of the file was -modified twice on different branches. Instruct Git to insert that -version as well by running this command once: - - git config --global merge.conflictStyle diff3 - - The above conflict might then have looked like this: - - <<<<<<< HEAD - Take the blue pill. - ||||||| merged common ancestors - Take either the blue or the red pill, but not both. - ======= - Take the red pill. - >>>>>>> feature - - If that were the case, then the above conflict resolution would not -have been correct, which demonstrates why seeing the original version -alongside the conflicting versions can be useful. - - You can perform the conflict resolution completely by hand, but Emacs -also provides some packages that help in the process: Smerge, Ediff -(*note (ediff)Top::), and Emerge (*note (emacs)Emerge::). Magit does -not provide its own tools for conflict resolution, but it does make -using Smerge and Ediff more convenient. (Ediff supersedes Emerge, so -you probably don’t want to use the latter anyway.) - - In the Magit status buffer, files with unresolved conflicts are -listed in the "Unstaged changes" and/or "Staged changes" sections. They -are prefixed with the word "unmerged", which in this context essentially -is a synonym for "unresolved". - - Pressing ‘RET’ while point is on such a file section shows a buffer -visiting that file, turns on ‘smerge-mode’ in that buffer, and places -point inside the first area with conflicts. You should then resolve -that conflict using regular edit commands and/or Smerge commands. - - Unfortunately Smerge does not have a manual, but you can get a list -of commands and binding ‘C-c ^ C-h’ and press ‘RET’ while point is on a -command name to read its documentation. - - Normally you would edit one version and then tell Smerge to keep only -that version. Use ‘C-c ^ m’ (‘smerge-keep-mine’) to keep the ‘HEAD’ -version or ‘C-c ^ o’ (‘smerge-keep-other’) to keep the version that -follows "|||||||". Then use ‘C-c ^ n’ to move to the next conflicting -area in the same file. Once you are done resolving conflicts, return to -the Magit status buffer. The file should now be shown as "modified", no -longer as "unmerged", because Smerge automatically stages the file when -you save the buffer after resolving the last conflict. - - Alternatively you could use Ediff, which uses separate buffers for -the different versions of the file. To resolve conflicts in a file -using Ediff press ‘e’ while point is on such a file in the status -buffer. - - Ediff can be used for other purposes as well. For more information -on how to enter Ediff from Magit, see *note Ediffing::. Explaining how -to use Ediff is beyond the scope of this manual, instead see *note -(ediff)Top::. - - If you are unsure whether you should Smerge or Ediff, then use the -former. It is much easier to understand and use, and except for truly -complex conflicts, the latter is usually overkill. - - -File: magit.info, Node: Rebasing, Next: Cherry Picking, Prev: Resolving Conflicts, Up: Manipulating - -6.9 Rebasing -============ - -Also see *note (gitman)git-rebase::. For information on how to resolve -conflicts that occur during rebases see the preceding section. - -‘r’ (‘magit-rebase’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - When no rebase is in progress, then the transient features the -following suffix commands. - - Using one of these commands _starts_ a rebase sequence. Git might -then stop somewhere along the way, either because you told it to do so, -or because applying a commit failed due to a conflict. When that -happens, then the status buffer shows information about the rebase -sequence which is in progress in a section similar to a log section. -See *note Information About In-Progress Rebase::. - - For information about the upstream and the push-remote, see *note The -Two Remotes::. - -‘r p’ (‘magit-rebase-onto-pushremote’) - - This command rebases the current branch onto its push-remote. - - With a prefix argument or when the push-remote is either not - configured or unusable, then let the user first configure the - push-remote. - -‘r u’ (‘magit-rebase-onto-upstream’) - - This command rebases the current branch onto its upstream branch. - - With a prefix argument or when the upstream is either not - configured or unusable, then let the user first configure the - upstream. - -‘r e’ (‘magit-rebase-branch’) - - This command rebases the current branch onto a branch read in the - minibuffer. All commits that are reachable from head but not from - the selected branch TARGET are being rebased. - -‘r s’ (‘magit-rebase-subset’) - - This command starts a non-interactive rebase sequence to transfer - commits from START to ‘HEAD’ onto NEWBASE. START has to be - selected from a list of recent commits. - - By default Magit uses the ‘--autostash’ argument, which causes -uncommitted changes to be stored in a stash before the rebase begins. -These changes are restored after the rebase completes and if possible -the stash is removed. If the stash does not apply cleanly, then the -stash is not removed. In case something goes wrong when resolving the -conflicts, this allows you to start over. - - Even though one of the actions is dedicated to interactive rebases, -the transient also features the infix argument ‘--interactive’. This -can be used to turn one of the other, non-interactive rebase variants -into an interactive rebase. - - For example if you want to clean up a feature branch and at the same -time rebase it onto ‘master’, then you could use ‘r-iu’. But we -recommend that you instead do that in two steps. First use ‘ri’ to -cleanup the feature branch, and then in a second step ‘ru’ to rebase it -onto ‘master’. That way if things turn out to be more complicated than -you thought and/or you make a mistake and have to start over, then you -only have to redo half the work. - - Explicitly enabling ‘--interactive’ won’t have an effect on the -following commands as they always use that argument anyway, even if it -is not enabled in the transient. - -‘r i’ (‘magit-rebase-interactive’) - - This command starts an interactive rebase sequence. - -‘r f’ (‘magit-rebase-autosquash’) - - This command combines squash and fixup commits with their intended - targets. - -‘r m’ (‘magit-rebase-edit-commit’) - - This command starts an interactive rebase sequence that lets the - user edit a single older commit. - -‘r w’ (‘magit-rebase-reword-commit’) - - This command starts an interactive rebase sequence that lets the - user reword a single older commit. - -‘r k’ (‘magit-rebase-remove-commit’) - - This command removes a single older commit using rebase. - - When a rebase is in progress, then the transient instead features the -following suffix commands. - -‘r r’ (‘magit-rebase-continue’) - - This command restart the current rebasing operation. - - In some cases this pops up a commit message buffer for you do edit. - With a prefix argument the old message is reused as-is. - -‘r s’ (‘magit-rebase-skip’) - - This command skips the current commit and restarts the current - rebase operation. - -‘r e’ (‘magit-rebase-edit’) - - This command lets the user edit the todo list of the current rebase - operation. - -‘r a’ (‘magit-rebase-abort’) - - This command aborts the current rebase operation, restoring the - original branch. - -* Menu: - -* Editing Rebase Sequences:: -* Information About In-Progress Rebase:: - - -File: magit.info, Node: Editing Rebase Sequences, Next: Information About In-Progress Rebase, Up: Rebasing - -6.9.1 Editing Rebase Sequences ------------------------------- - -‘C-c C-c’ (‘with-editor-finish’) - - Finish the current editing session by returning with exit code 0. - Git then uses the rebase instructions it finds in the file. - -‘C-c C-k’ (‘with-editor-cancel’) - - Cancel the current editing session by returning with exit code 1. - Git then forgoes starting the rebase sequence. - -‘RET’ (‘git-rebase-show-commit’) - - Show the commit on the current line in another buffer and select - that buffer. - -‘SPC’ (‘git-rebase-show-or-scroll-up’) - - Show the commit on the current line in another buffer without - selecting that buffer. If the revision buffer is already visible - in another window of the current frame, then instead scroll that - window up. - -‘DEL’ (‘git-rebase-show-or-scroll-down’) - - Show the commit on the current line in another buffer without - selecting that buffer. If the revision buffer is already visible - in another window of the current frame, then instead scroll that - window down. - -‘p’ (‘git-rebase-backward-line’) - - Move to previous line. - -‘n’ (‘forward-line’) - - Move to next line. - -‘M-p’ (‘git-rebase-move-line-up’) - - Move the current commit (or command) up. - -‘M-n’ (‘git-rebase-move-line-down’) - - Move the current commit (or command) down. - -‘r’ (‘git-rebase-reword’) - - Edit message of commit on current line. - -‘e’ (‘git-rebase-edit’) - - Stop at the commit on the current line. - -‘s’ (‘git-rebase-squash’) - - Meld commit on current line into previous commit, and edit message. - -‘f’ (‘git-rebase-fixup’) - - Meld commit on current line into previous commit, discarding the - current commit’s message. - -‘k’ (‘git-rebase-kill-line’) - - Kill the current action line. - -‘c’ (‘git-rebase-pick’) - - Use commit on current line. - -‘x’ (‘git-rebase-exec’) - - Insert a shell command to be run after the proceeding commit. - - If there already is such a command on the current line, then edit - that instead. With a prefix argument insert a new command even - when there already is one on the current line. With empty input - remove the command on the current line, if any. - -‘b’ (‘git-rebase-break’) - - Insert a break action before the current line, instructing Git to - return control to the user. - -‘y’ (‘git-rebase-insert’) - - Read an arbitrary commit and insert it below current line. - -‘C-x u’ (‘git-rebase-undo’) - - Undo some previous changes. Like ‘undo’ but works in read-only - buffers. - - -- User Option: git-rebase-auto-advance - - Whether to move to next line after changing a line. - - -- User Option: git-rebase-show-instructions - - Whether to show usage instructions inside the rebase buffer. - - -- User Option: git-rebase-confirm-cancel - - Whether confirmation is required to cancel. - - When a rebase is performed with the ‘--rebase-merges’ option, the -sequence will include a few other types of actions and the following -commands become relevant. - -‘l’ (‘git-rebase-label’) - - This commands inserts a label action or edits the one at point. - -‘t’ (‘git-rebase-reset’) - - This command inserts a reset action or edits the one at point. The - prompt will offer the labels that are currently present in the - buffer. - -‘MM’ (‘git-rebase-merge’) - - The command inserts a merge action or edits the one at point. The - prompt will offer the labels that are currently present in the - buffer. Specifying a message to reuse via ‘-c’ or ‘-C’ is not - supported; an editor will always be invoked for the merge. - -‘Mt’ (‘git-rebase-merge-toggle-editmsg’) - - This command toggles between the ‘-C’ and ‘-c’ options of the merge - action at point. These options both specify a commit whose message - should be reused. The lower-case variant instructs Git to invoke - the editor when creating the merge, allowing the user to edit the - message. - - -File: magit.info, Node: Information About In-Progress Rebase, Prev: Editing Rebase Sequences, Up: Rebasing - -6.9.2 Information About In-Progress Rebase ------------------------------------------- - -While a rebase sequence is in progress, the status buffer features a -section that lists the commits that have already been applied as well as -the commits that still have to be applied. - - The commits are split in two halves. When rebase stops at a commit, -either because the user has to deal with a conflict or because s/he -explicitly requested that rebase stops at that commit, then point is -placed on the commit that separates the two groups, i.e. on ‘HEAD’. -The commits above it have not been applied yet, while the ‘HEAD’ and the -commits below it have already been applied. In between these two groups -of applied and yet-to-be applied commits, there sometimes is a commit -which has been dropped. - - Each commit is prefixed with a word and these words are additionally -shown in different colors to indicate the status of the commits. - - The following colors are used: - - • Yellow commits have not been applied yet. - - • Gray commits have already been applied. - - • The blue commit is the ‘HEAD’ commit. - - • The green commit is the commit the rebase sequence stopped at. If - this is the same commit as ‘HEAD’ (e.g. because you haven’t done - anything yet after rebase stopped at the commit, then this commit - is shown in blue, not green). There can only be a green *and* a - blue commit at the same time, if you create one or more new commits - after rebase stops at a commit. - - • Red commits have been dropped. They are shown for reference only, - e.g. to make it easier to diff. - - Of course these colors are subject to the color-theme in use. - - The following words are used: - - • Commits prefixed with ‘pick’, ‘reword’, ‘edit’, ‘squash’, and - ‘fixup’ have not been applied yet. These words have the same - meaning here as they do in the buffer used to edit the rebase - sequence. See *note Editing Rebase Sequences::. When the - ‘--rebase-merges’ option was specified, ‘reset’, ‘label’, and - ‘merge’ lines may also be present. - - • Commits prefixed with ‘done’ and ‘onto’ have already been applied. - It is possible for such a commit to be the ‘HEAD’, in which case it - is blue. Otherwise it is grey. - - • The commit prefixed with ‘onto’ is the commit on top of which - all the other commits are being re-applied. This commit - itself did not have to be re-applied, it is the commit rebase - did rewind to before starting to re-apply other commits. - - • Commits prefixed with ‘done’ have already been re-applied. - This includes commits that have been re-applied but also new - commits that you have created during the rebase. - - • All other commits, those not prefixed with any of the above words, - are in some way related to the commit at which rebase stopped. - - To determine whether a commit is related to the stopped-at commit - their hashes, trees and patch-ids (1) are being compared. The - commit message is not used for this purpose. - - Generally speaking commits that are related to the stopped-at - commit can have any of the used colors, though not all color/word - combinations are possible. - - Words used for stopped-at commits are: - - • When a commit is prefixed with ‘void’, then that indicates - that Magit knows for sure that all the changes in that commit - have been applied using several new commits. This commit is - no longer reachable from ‘HEAD’, and it also isn’t one of the - commits that will be applied when resuming the session. - - • When a commit is prefixed with ‘join’, then that indicates - that the rebase sequence stopped at that commit due to a - conflict - you now have to join (merge) the changes with what - has already been applied. In a sense this is the commit - rebase stopped at, but while its effect is already in the - index and in the worktree (with conflict markers), the commit - itself has not actually been applied yet (it isn’t the - ‘HEAD’). So it is shown in yellow, like the other commits - that still have to be applied. - - • When a commit is prefixed with ‘stop’ or a _blue_ or _green_ - ‘same’, then that indicates that rebase stopped at this - commit, that it is still applied or has been applied again, - and that at least its patch-id is unchanged. - - • When a commit is prefixed with ‘stop’, then that - indicates that rebase stopped at that commit because you - requested that earlier, and its patch-id is unchanged. - It might even still be the exact same commit. - - • When a commit is prefixed with a _blue_ or _green_ - ‘same’, then that indicates that while its tree or hash - changed, its patch-id did not. If it is blue, then it is - the ‘HEAD’ commit (as always for blue). When it is - green, then it no longer is ‘HEAD’ because other commit - have been created since (but before continuing the - rebase). - - • When a commit is prefixed with ‘goal’, a _yellow_ ‘same,’ or - ‘work’, then that indicates that rebase applied that commit - but that you then reset ‘HEAD’ to an earlier commit (likely to - split it up into multiple commits), and that there are some - uncommitted changes remaining which likely (but not - necessarily) originate from that commit. - - • When a commit is prefixed with ‘goal’, then that - indicates that it is still possible to create a new - commit with the exact same tree (the "goal") without - manually editing any files, by committing the index, or - by staging all changes and then committing that. This is - the case when the original tree still exists in the index - or worktree in untainted form. - - • When a commit is prefixed with a yellow ‘same’, then that - indicates that it is no longer possible to create a - commit with the exact same tree, but that it is still - possible to create a commit with the same patch-id. This - would be the case if you created a new commit with other - changes, but the changes from the original commit still - exist in the index or working tree in untainted form. - - • When a commit is prefixed with ‘work’, then that - indicates that you reset ‘HEAD’ to an earlier commit, and - that there are some staged and/or unstaged changes - (likely, but not necessarily) originating from that - commit. However it is no longer possible to create a new - commit with the same tree or at least the same patch-id - because you have already made other changes. - - • When a commit is prefixed with ‘poof’ or ‘gone’, then that - indicates that rebase applied that commit but that you then - reset ‘HEAD’ to an earlier commit (likely to split it up into - multiple commits), and that there are no uncommitted changes. - - • When a commit is prefixed with ‘poof’, then that - indicates that it is no longer reachable from ‘HEAD’, but - that it has been replaced with one or more commits, which - together have the exact same effect. - - • When a commit is prefixed with ‘gone’, then that - indicates that it is no longer reachable from ‘HEAD’ and - that we also cannot determine whether its changes are - still in effect in one or more new commits. They might - be, but if so, then there must also be other changes - which makes it impossible to know for sure. - - Do not worry if you do not fully understand the above. That’s okay, -you will acquire a good enough understanding through practice. - - For other sequence operations such as cherry-picking, a similar -section is displayed, but they lack some of the features described -above, due to limitations in the git commands used to implement them. -Most importantly these sequences only support "picking" a commit but not -other actions such as "rewording", and they do not keep track of the -commits which have already been applied. - - ---------- Footnotes ---------- - - (1) The patch-id is a hash of the _changes_ introduced by a commit. -It differs from the hash of the commit itself, which is a hash of the -result of applying that change (i.e. the resulting trees and blobs) as -well as author and committer information, the commit message, and the -hashes of the parents of the commit. The patch-id hash on the other -hand is created only from the added and removed lines, even line numbers -and whitespace changes are ignored when calculating this hash. The -patch-ids of two commits can be used to answer the question "Do these -commits make the same change?". - - -File: magit.info, Node: Cherry Picking, Next: Resetting, Prev: Rebasing, Up: Manipulating - -6.10 Cherry Picking -=================== - -Also see *note (gitman)git-cherry-pick::. - -‘A’ (‘magit-cherry-pick’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - When no cherry-pick or revert is in progress, then the transient -features the following suffix commands. - -‘A A’ (‘magit-cherry-copy’) - - This command copies COMMITS from another branch onto the current - branch. If the region selects multiple commits, then those are - copied, without prompting. Otherwise the user is prompted for a - commit or range, defaulting to the commit at point. - -‘A a’ (‘magit-cherry-apply’) - - This command applies the changes in COMMITS from another branch - onto the current branch. If the region selects multiple commits, - then those are used, without prompting. Otherwise the user is - prompted for a commit or range, defaulting to the commit at point. - - This command also has a top-level binding, which can be invoked - without using the transient by typing ‘a’ at the top-level. - - The following commands not only apply some commits to some branch, -but also remove them from some other branch. The removal is performed -using either ‘git-update-ref’ or if necessary ‘git-rebase’. Both -applying commits as well as removing them using ‘git-rebase’ can lead to -conflicts. If that happens, then these commands abort and you not only -have to resolve the conflicts but also finish the process the same way -you would have to if these commands didn’t exist at all. - -‘A h’ (‘magit-cherry-harvest’) - - This command moves the selected COMMITS that must be located on - another BRANCH onto the current branch instead, removing them from - the former. When this command succeeds, then the same branch is - current as before. - - Applying the commits on the current branch or removing them from - the other branch can lead to conflicts. When that happens, then - this command stops and you have to resolve the conflicts and then - finish the process manually. - -‘A d’ (‘magit-cherry-donate’) - - This command moves the selected COMMITS from the current branch - onto another existing BRANCH, removing them from the former. When - this command succeeds, then the same branch is current as before. - - Applying the commits on the other branch or removing them from the - current branch can lead to conflicts. When that happens, then this - command stops and you have to resolve the conflicts and then finish - the process manually. - -‘A n’ (‘magit-cherry-spinout’) - - This command moves the selected COMMITS from the current branch - onto a new branch BRANCH, removing them from the former. When this - command succeeds, then the same branch is current as before. - - Applying the commits on the other branch or removing them from the - current branch can lead to conflicts. When that happens, then this - command stops and you have to resolve the conflicts and then finish - the process manually. - -‘A s’ (‘magit-cherry-spinoff’) - - This command moves the selected COMMITS from the current branch - onto a new branch BRANCH, removing them from the former. When this - command succeeds, then the new branch is checked out. - - Applying the commits on the other branch or removing them from the - current branch can lead to conflicts. When that happens, then this - command stops and you have to resolve the conflicts and then finish - the process manually. - - When a cherry-pick or revert is in progress, then the transient -instead features the following suffix commands. - -‘A A’ (‘magit-sequence-continue’) - - Resume the current cherry-pick or revert sequence. - -‘A s’ (‘magit-sequence-skip’) - - Skip the stopped at commit during a cherry-pick or revert sequence. - -‘A a’ (‘magit-sequence-abort’) - - Abort the current cherry-pick or revert sequence. This discards - all changes made since the sequence started. - -* Menu: - -* Reverting:: - - -File: magit.info, Node: Reverting, Up: Cherry Picking - -6.10.1 Reverting ----------------- - -‘V’ (‘magit-revert’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - When no cherry-pick or revert is in progress, then the transient -features the following suffix commands. - -‘V V’ (‘magit-revert-and-commit’) - - Revert a commit by creating a new commit. Prompt for a commit, - defaulting to the commit at point. If the region selects multiple - commits, then revert all of them, without prompting. - -‘V v’ (‘magit-revert-no-commit’) - - Revert a commit by applying it in reverse to the working tree. - Prompt for a commit, defaulting to the commit at point. If the - region selects multiple commits, then revert all of them, without - prompting. - - When a cherry-pick or revert is in progress, then the transient -instead features the following suffix commands. - -‘V A’ (‘magit-sequence-continue’) - - Resume the current cherry-pick or revert sequence. - -‘V s’ (‘magit-sequence-skip’) - - Skip the stopped at commit during a cherry-pick or revert sequence. - -‘V a’ (‘magit-sequence-abort’) - - Abort the current cherry-pick or revert sequence. This discards - all changes made since the sequence started. - - -File: magit.info, Node: Resetting, Next: Stashing, Prev: Cherry Picking, Up: Manipulating - -6.11 Resetting -============== - -Also see *note (gitman)git-reset::. - -‘x’ (‘magit-reset-quickly’) - - Reset the ‘HEAD’ and index to some commit read from the user and - defaulting to the commit at point, and possibly also reset the - working tree. With a prefix argument reset the working tree - otherwise don’t. - -‘X m’ (‘magit-reset-mixed’) - - Reset the ‘HEAD’ and index to some commit read from the user and - defaulting to the commit at point. The working tree is kept as-is. - -‘X s’ (‘magit-reset-soft’) - - Reset the ‘HEAD’ to some commit read from the user and defaulting - to the commit at point. The index and the working tree are kept - as-is. - -‘X h’ (‘magit-reset-hard’) - - Reset the ‘HEAD’, index, and working tree to some commit read from - the user and defaulting to the commit at point. - -‘X i’ (‘magit-reset-index’) - - Reset the index to some commit read from the user and defaulting to - the commit at point. Keep the ‘HEAD’ and working tree as-is, so if - the commit refers to the ‘HEAD’, then this effectively unstages all - changes. - -‘X w’ (‘magit-reset-worktree’) - - Reset the working tree to some commit read from the user and - defaulting to the commit at point. Keep the ‘HEAD’ and index - as-is. - -‘X f’ (‘magit-file-checkout’) - - Update file in the working tree and index to the contents from a - revision. Both the revision and file are read from the user. - - -File: magit.info, Node: Stashing, Prev: Resetting, Up: Manipulating - -6.12 Stashing -============= - -Also see *note (gitman)git-stash::. - -‘z’ (‘magit-stash’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘z z’ (‘magit-stash-both’) - - Create a stash of the index and working tree. Untracked files are - included according to infix arguments. One prefix argument is - equivalent to ‘--include-untracked’ while two prefix arguments are - equivalent to ‘--all’. - -‘z i’ (‘magit-stash-index’) - - Create a stash of the index only. Unstaged and untracked changes - are not stashed. - -‘z w’ (‘magit-stash-worktree’) - - Create a stash of unstaged changes in the working tree. Untracked - files are included according to infix arguments. One prefix - argument is equivalent to ‘--include-untracked’ while two prefix - arguments are equivalent to ‘--all’. - -‘z x’ (‘magit-stash-keep-index’) - - Create a stash of the index and working tree, keeping index intact. - Untracked files are included according to infix arguments. One - prefix argument is equivalent to ‘--include-untracked’ while two - prefix arguments are equivalent to ‘--all’. - -‘z Z’ (‘magit-snapshot-both’) - - Create a snapshot of the index and working tree. Untracked files - are included according to infix arguments. One prefix argument is - equivalent to ‘--include-untracked’ while two prefix arguments are - equivalent to ‘--all’. - -‘z I’ (‘magit-snapshot-index’) - - Create a snapshot of the index only. Unstaged and untracked - changes are not stashed. - -‘z W’ (‘magit-snapshot-worktree’) - - Create a snapshot of unstaged changes in the working tree. - Untracked files are included according to infix arguments. One - prefix argument is equivalent to ‘--include-untracked’ while two - prefix arguments are equivalent to ‘--all’-. - -‘z a’ (‘magit-stash-apply’) - - Apply a stash to the working tree. Try to preserve the stash - index. If that fails because there are staged changes, apply - without preserving the stash index. - -‘z p’ (‘magit-stash-pop’) - - Apply a stash to the working tree and remove it from stash list. - Try to preserve the stash index. If that fails because there are - staged changes, apply without preserving the stash index and forgo - removing the stash. - -‘z k’ (‘magit-stash-drop’) - - Remove a stash from the stash list. When the region is active, - offer to drop all contained stashes. - -‘z v’ (‘magit-stash-show’) - - Show all diffs of a stash in a buffer. - -‘z b’ (‘magit-stash-branch’) - - Create and checkout a new BRANCH from STASH. The branch starts at - the commit that was current when the stash was created. - -‘z B’ (‘magit-stash-branch-here’) - - Create and checkout a new BRANCH using ‘magit-branch’ with the - current branch or ‘HEAD’ as the starting-point. Then apply STASH, - dropping it if it applies cleanly. - -‘z f’ (‘magit-stash-format-patch’) - - Create a patch from STASH. - -‘k’ (‘magit-stash-clear’) - - Remove all stashes saved in REF’s reflog by deleting REF. - -‘z l’ (‘magit-stash-list’) - - List all stashes in a buffer. - - -- User Option: magit-stashes-margin - - This option specifies whether the margin is initially shown in - stashes buffers and how it is formatted. - - The value has the form ‘(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)’. - - • If INIT is non-nil, then the margin is shown initially. - - • STYLE controls how to format the author or committer date. It - can be one of ‘age’ (to show the age of the commit), - ‘age-abbreviated’ (to abbreviate the time unit to a - character), or a string (suitable for ‘format-time-string’) to - show the actual date. Option - ‘magit-log-margin-show-committer-date’ controls which date is - being displayed. - - • WIDTH controls the width of the margin. This exists for - forward compatibility and currently the value should not be - changed. - - • AUTHOR controls whether the name of the author is also shown - by default. - - • AUTHOR-WIDTH has to be an integer. When the name of the - author is shown, then this specifies how much space is used to - do so. - - -File: magit.info, Node: Transferring, Next: Miscellaneous, Prev: Manipulating, Up: Top - -7 Transferring -************** - -* Menu: - -* Remotes:: -* Fetching:: -* Pulling:: -* Pushing:: -* Plain Patches:: -* Maildir Patches:: - - -File: magit.info, Node: Remotes, Next: Fetching, Up: Transferring - -7.1 Remotes -=========== - -* Menu: - -* Remote Commands:: -* Remote Git Variables:: - - -File: magit.info, Node: Remote Commands, Next: Remote Git Variables, Up: Remotes - -7.1.1 Remote Commands ---------------------- - -The transient prefix command ‘magit-remote’ is used to add remotes and -to make changes to existing remotes. This command only deals with -remotes themselves, not with branches or the transfer of commits. Those -features are available from separate transient commands. - - Also see *note (gitman)git-remote::. - -‘M’ (‘magit-remote’) - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - - By default it also binds and displays the values of some - remote-related Git variables and allows changing their values. - - -- User Option: magit-remote-direct-configure - - This option controls whether remote-related Git variables are - accessible directly from the transient ‘magit-remote’. - - If ‘t’ (the default) and a local branch is checked out, then - ‘magit-remote’ features the variables for the upstream remote of - that branch, or if ‘HEAD’ is detached, for ‘origin’, provided that - exists. - - If ‘nil’, then ‘magit-remote-configure’ has to be used to do so. - -‘M C’ (‘magit-remote-configure’) - - This transient prefix command binds commands that set the value of - remote-related variables and displays them in a temporary buffer - until the transient is exited. - - With a prefix argument, this command always prompts for a remote. - - Without a prefix argument this depends on whether it was invoked as - a suffix of ‘magit-remote’ and on the - ‘magit-remote-direct-configure’ option. If ‘magit-remote’ already - displays the variables for the upstream, then it does not make - sense to invoke another transient that displays them for the same - remote. In that case this command prompts for a remote. - - The variables are described in *note Remote Git Variables::. - -‘M a’ (‘magit-remote-add’) - - This command add a remote and fetches it. The remote name and url - are read in the minibuffer. - -‘M r’ (‘magit-remote-rename’) - - This command renames a remote. Both the old and the new names are - read in the minibuffer. - -‘M u’ (‘magit-remote-set-url’) - - This command changes the url of a remote. Both the remote and the - new url are read in the minibuffer. - -‘M k’ (‘magit-remote-remove’) - - This command deletes a remote, read in the minibuffer. - -‘M p’ (‘magit-remote-prune’) - - This command removes stale remote-tracking branches for a remote - read in the minibuffer. - -‘M P’ (‘magit-remote-prune-refspecs’) - - This command removes stale refspecs for a remote read in the - minibuffer. - - A refspec is stale if there no longer exists at least one branch on - the remote that would be fetched due to that refspec. A stale - refspec is problematic because its existence causes Git to refuse - to fetch according to the remaining non-stale refspecs. - - If only stale refspecs remain, then this command offers to either - delete the remote or to replace the stale refspecs with the default - refspec ("+refs/heads/*:refs/remotes/REMOTE/*"). - - This command also removes the remote-tracking branches that were - created due to the now stale refspecs. Other stale branches are - not removed. - - -- User Option: magit-remote-add-set-remote.pushDefault - - This option controls whether the user is asked whether they want to - set ‘remote.pushDefault’ after adding a remote. - - If ‘ask’, then users is always ask. If ‘ask-if-unset’, then the - user is only if the variable isn’t set already. If ‘nil’, then the - user isn’t asked and the variable isn’t set. If the value is a - string, then the variable is set without the user being asked, - provided that the name of the added remote is equal to that string - and the variable isn’t already set. - - -File: magit.info, Node: Remote Git Variables, Prev: Remote Commands, Up: Remotes - -7.1.2 Remote Git Variables --------------------------- - -These variables can be set from the transient prefix command -‘magit-remote-configure’. By default they can also be set from -‘magit-remote’. See *note Remote Commands::. - - -- Variable: remote.NAME.url - - This variable specifies the url of the remote named NAME. It can - have multiple values. - - -- Variable: remote.NAME.fetch - - The refspec used when fetching from the remote named NAME. It can - have multiple values. - - -- Variable: remote.NAME.pushurl - - This variable specifies the url used for fetching from the remote - named NAME. If it is not specified, then ‘remote.NAME.url’ is used - instead. It can have multiple values. - - -- Variable: remote.NAME.push - - The refspec used when pushing to the remote named NAME. It can - have multiple values. - - -- Variable: remote.NAME.tagOpts - - This variable specifies what tags are fetched by default. If the - value is ‘--no-tags’ then no tags are fetched. If the value is - ‘--tags’, then all tags are fetched. If this variable has no - value, then only tags are fetched that are reachable from fetched - branches. - - -File: magit.info, Node: Fetching, Next: Pulling, Prev: Remotes, Up: Transferring - -7.2 Fetching -============ - -Also see *note (gitman)git-fetch::. For information about the upstream -and the push-remote, see *note The Two Remotes::. - -‘f’ (‘magit-fetch’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘f p’ (‘magit-fetch-from-pushremote’) - - This command fetches from the current push-remote. - - With a prefix argument or when the push-remote is either not - configured or unusable, then let the user first configure the - push-remote. - -‘f u’ (‘magit-fetch-from-upstream’) - - This command fetch from the upstream of the current branch. - - If the upstream is configured for the current branch and names an - existing remote, then use that. Otherwise try to use another - remote: If only a single remote is configured, then use that. - Otherwise if a remote named "origin" exists, then use that. - - If no remote can be determined, then this command is not available - from the ‘magit-fetch’ transient prefix and invoking it directly - results in an error. - -‘f e’ (‘magit-fetch-other’) - - This command fetch from a repository read from the minibuffer. - -‘f o’ (‘magit-fetch-branch’) - - This command fetches a branch from a remote, both of which are read - from the minibuffer. - -‘f r’ (‘magit-fetch-refspec’) - - This command fetches from a remote using an explicit refspec, both - of which are read from the minibuffer. - -‘f a’ (‘magit-fetch-all’) - - This command fetches from all remotes. - -‘f m’ (‘magit-submodule-fetch’) - - This command fetches all submodules. With a prefix argument it - fetches all remotes of all submodules. - - -- User Option: magit-pull-or-fetch - - By default fetch and pull commands are available from separate - transient prefix command. Setting this to ‘t’ adds some (but not - all) of the above suffix commands to the ‘magit-pull’ transient. - - If you do that, then you might also want to change the key binding - for these prefix commands, e.g.: - - (setq magit-pull-or-fetch t) - (define-key magit-mode-map "f" 'magit-pull) ; was magit-fetch - (define-key magit-mode-map "F" nil) ; was magit-pull - - -File: magit.info, Node: Pulling, Next: Pushing, Prev: Fetching, Up: Transferring - -7.3 Pulling -=========== - -Also see *note (gitman)git-pull::. For information about the upstream -and the push-remote, see *note The Two Remotes::. - -‘F’ (‘magit-pull’) - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -‘F p’ (‘magit-pull-from-pushremote’) - - This command pulls from the push-remote of the current branch. - - With a prefix argument or when the push-remote is either not - configured or unusable, then let the user first configure the - push-remote. - -‘F u’ (‘magit-pull-from-upstream’) - - This command pulls from the upstream of the current branch. - - With a prefix argument or when the upstream is either not - configured or unusable, then let the user first configure the - upstream. - -‘F e’ (‘magit-pull-branch’) - - This command pulls from a branch read in the minibuffer. - - -File: magit.info, Node: Pushing, Next: Plain Patches, Prev: Pulling, Up: Transferring - -7.4 Pushing -=========== - -Also see *note (gitman)git-push::. For information about the upstream -and the push-remote, see *note The Two Remotes::. - -‘P’ (‘magit-push’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘P p’ (‘magit-push-current-to-pushremote’) - - This command pushes the current branch to its push-remote. - - With a prefix argument or when the push-remote is either not - configured or unusable, then let the user first configure the - push-remote. - -‘P u’ (‘magit-push-current-to-upstream’) - - This command pushes the current branch to its upstream branch. - - With a prefix argument or when the upstream is either not - configured or unusable, then let the user first configure the - upstream. - -‘P e’ (‘magit-push-current’) - - This command pushes the current branch to a branch read in the - minibuffer. - -‘P o’ (‘magit-push-other’) - - This command pushes an arbitrary branch or commit somewhere. Both - the source and the target are read in the minibuffer. - -‘P r’ (‘magit-push-refspecs’) - - This command pushes one or multiple refspecs to a remote, both of - which are read in the minibuffer. - - To use multiple refspecs, separate them with commas. Completion is - only available for the part before the colon, or when no colon is - used. - -‘P m’ (‘magit-push-matching’) - - This command pushes all matching branches to another repository. - - If only one remote exists, then push to that. Otherwise prompt for - a remote, offering the remote configured for the current branch as - default. - -‘P t’ (‘magit-push-tags’) - - This command pushes all tags to another repository. - - If only one remote exists, then push to that. Otherwise prompt for - a remote, offering the remote configured for the current branch as - default. - -‘P T’ (‘magit-push-tag’) - - This command pushes a tag to another repository. - - Two more push commands exist, which by default are not available from -the push transient. See their doc-strings for instructions on how to -add them to the transient. - - -- Command: magit-push-implicitly args - - This command pushes somewhere without using an explicit refspec. - - This command simply runs ‘git push -v [ARGS]’. ARGS are the infix - arguments. No explicit refspec arguments are used. Instead the - behavior depends on at least these Git variables: ‘push.default’, - ‘remote.pushDefault’, ‘branch..pushRemote’, - ‘branch..remote’, ‘branch..merge’, and - ‘remote..push’. - - -- Command: magit-push-to-remote remote args - - This command pushes to the remote REMOTE without using an explicit - refspec. The remote is read in the minibuffer. - - This command simply runs ‘git push -v [ARGS] REMOTE’. ARGS are the - infix arguments. No refspec arguments are used. Instead the - behavior depends on at least these Git variables: ‘push.default’, - ‘remote.pushDefault’, ‘branch..pushRemote’, - ‘branch..remote’, ‘branch..merge’, and - ‘remote..push’. - - -File: magit.info, Node: Plain Patches, Next: Maildir Patches, Prev: Pushing, Up: Transferring - -7.5 Plain Patches -================= - -‘W’ (‘magit-patch’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘W c’ (‘magit-patch-create’) - - This command creates patches for a set commits. If the region - marks several commits, then it creates patches for all of them. - Otherwise it functions as a transient prefix command, which - features several infix arguments and binds itself as a suffix - command. When this command is invoked as a suffix of itself, then - it creates a patch using the specified infix arguments. - -‘w a’ (‘magit-patch-apply’) - - This command applies a patch. This is a transient prefix command, - which features several infix arguments and binds itself as a suffix - command. When this command is invoked as a suffix of itself, then - it applies a patch using the specified infix arguments. - -‘W s’ (‘magit-patch-save’) - - This command creates a patch from the current diff. - - Inside ‘magit-diff-mode’ or ‘magit-revision-mode’ buffers, ‘C-x - C-w’ is also bound to this command. - - It is also possible to save a plain patch file by using ‘C-x C-w’ -inside a ‘magit-diff-mode’ or ‘magit-revision-mode’ buffer. - - -File: magit.info, Node: Maildir Patches, Prev: Plain Patches, Up: Transferring - -7.6 Maildir Patches -=================== - -Also see *note (gitman)git-am::. and *note (gitman)git-apply::. - -‘w’ (‘magit-am’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘w w’ (‘magit-am-apply-patches’) - - This command applies one or more patches. If the region marks - files, then those are applied as patches. Otherwise this command - reads a file-name in the minibuffer, defaulting to the file at - point. - -‘w m’ (‘magit-am-apply-maildir’) - - This command applies patches from a maildir. - -‘w a’ (‘magit-patch-apply’) - - This command applies a plain patch. For a longer description see - *note Plain Patches::. This command is only available from the - ‘magit-am’ transient for historic reasons. - - When an "am" operation is in progress, then the transient instead -features the following suffix commands. - -‘w w’ (‘magit-am-continue’) - - This command resumes the current patch applying sequence. - -‘w s’ (‘magit-am-skip’) - - This command skips the stopped at patch during a patch applying - sequence. - -‘w a’ (‘magit-am-abort’) - - This command aborts the current patch applying sequence. This - discards all changes made since the sequence started. - - -File: magit.info, Node: Miscellaneous, Next: Customizing, Prev: Transferring, Up: Top - -8 Miscellaneous -*************** - -* Menu: - -* Tagging:: -* Notes:: -* Submodules:: -* Subtree:: -* Worktree:: -* Common Commands:: -* Wip Modes:: -* Minor Mode for Buffers Visiting Files:: -* Minor Mode for Buffers Visiting Blobs:: - - -File: magit.info, Node: Tagging, Next: Notes, Up: Miscellaneous - -8.1 Tagging -=========== - -Also see *note (gitman)git-tag::. - -‘t’ (‘magit-tag’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘t t’ (‘magit-tag-create’) - - This command creates a new tag with the given NAME at REV. With a - prefix argument it creates an annotate tag. - -‘t r’ (‘magit-tag-release’) - - This commands creates an annotated release tag. It assumes that - release tags match ‘magit-release-tag-regexp’. - - First it prompts for the name of the new tag using the highest - existing tag as initial input and leaving it to the user to - increment the desired part of the version string. - - Then it prompts for the message of the new tag. The proposed tag - message is based on the message of the highest tag, provided that - that contains the corresponding version string and substituting the - new version string for that. Otherwise it proposes something like - "Foo-Bar 1.2.3", given, for example, a TAG "v1.2.3" and a - repository located at something like "/path/to/foo-bar". - - Then it calls "git tag –annotate –sign -m MSG TAG" to create the - tag, regardless of whether these arguments are enabled in the - transient. Finally it shows the refs buffer to let the user - quickly review the result. - -‘t k’ (‘magit-tag-delete’) - - This command deletes one or more tags. If the region marks - multiple tags (and nothing else), then it offers to delete those. - Otherwise, it prompts for a single tag to be deleted, defaulting to - the tag at point. - -‘t p’ (‘magit-tag-prune’) - - This command offers to delete tags missing locally from REMOTE, and - vice versa. - - -File: magit.info, Node: Notes, Next: Submodules, Prev: Tagging, Up: Miscellaneous - -8.2 Notes -========= - -Also see *note (gitman)git-notes::. - -‘T’ (‘magit-notes’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - -‘T T’ (‘magit-notes-edit’) - - Edit the note attached to a commit, defaulting to the commit at - point. - - By default use the value of Git variable ‘core.notesRef’ or - "refs/notes/commits" if that is undefined. - -‘T r’ (‘magit-notes-remove’) - - Remove the note attached to a commit, defaulting to the commit at - point. - - By default use the value of Git variable ‘core.notesRef’ or - "refs/notes/commits" if that is undefined. - -‘T p’ (‘magit-notes-prune’) - - Remove notes about unreachable commits. - - It is possible to merge one note ref into another. That may result -in conflicts which have to resolved in the temporary worktree -".git/NOTES_MERGE_WORKTREE". - -‘T m’ (‘magit-notes-merge’) - - Merge the notes of a ref read from the user into the current notes - ref. The current notes ref is the value of Git variable - ‘core.notesRef’ or "refs/notes/commits" if that is undefined. - - When a notes merge is in progress then the transient features the -following suffix commands, instead of those listed above. - -‘T c’ (‘magit-notes-merge-commit’) - - Commit the current notes ref merge, after manually resolving - conflicts. - -‘T a’ (‘magit-notes-merge-abort’) - - Abort the current notes ref merge. - - The following variables control what notes reference ‘magit-notes-*’, -‘git notes’ and ‘git show’ act on and display. Both the local and -global values are displayed and can be modified. - - -- Variable: core.notesRef - - This variable specifies the notes ref that is displayed by default - and which commands act on by default. - - -- Variable: notes.displayRef - - This variable specifies additional notes ref to be displayed in - addition to the ref specified by ‘core.notesRef’. It can have - multiple values and may end with ‘*’ to display all refs in the - ‘refs/notes/’ namespace (or ‘**’ if some names contain slashes). - - -File: magit.info, Node: Submodules, Next: Subtree, Prev: Notes, Up: Miscellaneous - -8.3 Submodules -============== - -Also see *note (gitman)git-submodule::. - -* Menu: - -* Listing Submodules:: -* Submodule Transient:: - - -File: magit.info, Node: Listing Submodules, Next: Submodule Transient, Up: Submodules - -8.3.1 Listing Submodules ------------------------- - -The command ‘magit-list-submodules’ displays a list of the current -repository’s submodules in a separate buffer. It’s also possible to -display information about submodules directly in the status buffer of -the super-repository by adding ‘magit-insert-submodules’ to the hook -‘magit-status-sections-hook’ as described in *note Status Module -Sections::. - - -- Command: magit-list-submodules - - This command displays a list of the current repository’s submodules - in a separate buffer. - - It can be invoked by pressing ‘RET’ on the section titled - "Modules". - - -- User Option: magit-submodule-list-columns - - This option controls what columns are displayed by the command - ‘magit-list-submodules’ and how they are displayed. - - Each element has the form ‘(HEADER WIDTH FORMAT PROPS)’. - - HEADER is the string displayed in the header. WIDTH is the width - of the column. FORMAT is a function that is called with one - argument, the repository identification (usually its basename), and - with ‘default-directory’ bound to the toplevel of its working tree. - It has to return a string to be inserted or nil. PROPS is an alist - that supports the keys ‘:right-align’ and ‘:pad-right’. - - -- Function: magit-insert-submodules - - Insert sections for all submodules. For each section insert the - path, the branch, and the output of ‘git describe --tags’, or, - failing that, the abbreviated HEAD commit hash. - - Press ‘RET’ on such a submodule section to show its own status - buffer. Press ‘RET’ on the "Modules" section to display a list of - submodules in a separate buffer. This shows additional information - not displayed in the super-repository’s status buffer. - - -File: magit.info, Node: Submodule Transient, Prev: Listing Submodules, Up: Submodules - -8.3.2 Submodule Transient -------------------------- - -‘o’ (‘magit-submodule’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - Some of the below commands default to act on the modules that are -selected using the region. For brevity their description talk about -"the selected modules", but if no modules are selected, then they act on -the current module instead, or if point isn’t on a module, then the read -a single module to act on. With a prefix argument these commands ignore -the selection and the current module and instead act on all suitable -modules. - -‘o a’ (‘magit-submodule-add’) - - This commands adds the repository at URL as a module. Optional - PATH is the path to the module relative to the root of the - super-project. If it is nil then the path is determined based on - URL. - -‘o r’ (‘magit-submodule-register’) - - This command registers the selected modules by copying their urls - from ".gitmodules" to "$GIT_DIR/config". These values can then be - edited before running ‘magit-submodule-populate’. If you don’t - need to edit any urls, then use the latter directly. - -‘o p’ (‘magit-submodule-populate’) - - This command creates the working directory or directories of the - selected modules, checking out the recorded commits. - -‘o u’ (‘magit-submodule-update’) - - This command updates the selected modules checking out the recorded - commits. - -‘o s’ (‘magit-submodule-synchronize’) - - This command synchronizes the urls of the selected modules, copying - the values from ".gitmodules" to the ".git/config" of the - super-project as well those of the modules. - -‘o d’ (‘magit-submodule-unpopulate’) - - This command removes the working directory of the selected modules. - -‘o l’ (‘magit-list-submodules’) - - This command displays a list of the current repository’s modules. - -‘o f’ (‘magit-fetch-modules’) - - This command fetches all modules. - - Option ‘magit-fetch-modules-jobs’ controls how many submodules are - being fetched in parallel. Also fetch the super-repository, - because ‘git fetch’ does not support not doing that. With a prefix - argument fetch all remotes. - - -File: magit.info, Node: Subtree, Next: Worktree, Prev: Submodules, Up: Miscellaneous - -8.4 Subtree -=========== - -Also see *note (gitman)git-subtree::. - -‘O’ (‘magit-subtree’) - - This transient prefix command binds the two sub-transients; one for - importing a subtree and one for exporting a subtree. - -‘O i’ (‘magit-subtree-import’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - The suffixes of this command import subtrees. - - If the ‘--prefix’ argument is set, then the suffix commands use - that prefix without prompting the user. If it is unset, then they - read the prefix in the minibuffer. - -‘O i a’ (‘magit-subtree-add’) - - This command adds COMMIT from REPOSITORY as a new subtree at - PREFIX. - -‘O i c’ (‘magit-subtree-add-commit’) - - This command add COMMIT as a new subtree at PREFIX. - -‘O i m’ (‘magit-subtree-merge’) - - This command merges COMMIT into the PREFIX subtree. - -‘O i f’ (‘magit-subtree-pull’) - - This command pulls COMMIT from REPOSITORY into the PREFIX subtree. - -‘O e’ (‘magit-subtree-export’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - The suffixes of this command export subtrees. - - If the ‘--prefix’ argument is set, then the suffix commands use - that prefix without prompting the user. If it is unset, then they - read the prefix in the minibuffer. - -‘O e p’ (‘magit-subtree-push’) - - This command extract the history of the subtree PREFIX and pushes - it to REF on REPOSITORY. - -‘O e s’ (‘magit-subtree-split’) - - This command extracts the history of the subtree PREFIX. - - -File: magit.info, Node: Worktree, Next: Common Commands, Prev: Subtree, Up: Miscellaneous - -8.5 Worktree -============ - -Also see *note (gitman)git-worktree::. - -‘%’ (‘magit-worktree’) - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -‘% b’ (‘magit-worktree-checkout’) - - Checkout BRANCH in a new worktree at PATH. - -‘% c’ (‘magit-worktree-branch’) - - Create a new BRANCH and check it out in a new worktree at PATH. - -‘% m’ (‘magit-worktree-move’) - - Move an existing worktree to a new PATH. - -‘% k’ (‘magit-worktree-delete’) - - Delete a worktree, defaulting to the worktree at point. The - primary worktree cannot be deleted. - -‘% g’ (‘magit-worktree-status’) - - Show the status for the worktree at point. - - If there is no worktree at point, then read one in the minibuffer. - If the worktree at point is the one whose status is already being - displayed in the current buffer, then show it in Dired instead. - diff --git a/elpa/magit-20200418.939/magit.info-2 b/elpa/magit-20200418.939/magit.info-2 deleted file mode 100644 index 1691d5be..00000000 --- a/elpa/magit-20200418.939/magit.info-2 +++ /dev/null @@ -1,3571 +0,0 @@ -This is magit.info, produced by makeinfo version 6.5 from magit.texi. - - Copyright (C) 2015-2020 Jonas Bernoulli - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -INFO-DIR-SECTION Emacs -START-INFO-DIR-ENTRY -* Magit: (magit). Using Git from Emacs with Magit. -END-INFO-DIR-ENTRY - - -File: magit.info, Node: Common Commands, Next: Wip Modes, Prev: Worktree, Up: Miscellaneous - -8.6 Common Commands -=================== - -These are some of the commands that can be used in all buffers whose -major-modes derive from ‘magit-mode’. There are other common commands -beside the ones below, but these didn’t fit well anywhere else. - -‘M-w’ (‘magit-copy-section-value’) - - This command saves the value of the current section to the - ‘kill-ring’, and, provided that the current section is a commit, - branch, or tag section, it also pushes the (referenced) revision to - the ‘magit-revision-stack’. - - When the current section is a branch or a tag, and a prefix - argument is used, then it saves the revision at its tip to the - ‘kill-ring’ instead of the reference name. - - When the region is active, this command saves that to the - ‘kill-ring’, like ‘kill-ring-save’ would, instead of behaving as - described above. If a prefix argument is used and the region is - within a hunk, it strips the outer diff marker column before saving - the text. - -‘C-w’ (‘magit-copy-buffer-revision’) - - This command saves the revision being displayed in the current - buffer to the ‘kill-ring’ and also pushes it to the - ‘magit-revision-stack’. It is mainly intended for use in - ‘magit-revision-mode’ buffers, the only buffers where it is always - unambiguous exactly which revision should be saved. - - Most other Magit buffers usually show more than one revision, in - some way or another, so this command has to select one of them, and - that choice might not always be the one you think would have been - the best pick. - - Outside of Magit ‘M-w’ and ‘C-w’ are usually bound to -‘kill-ring-save’ and ‘kill-region’, and these commands would also be -useful in Magit buffers. Therefore when the region is active, then both -of these commands behave like ‘kill-ring-save’ instead of as described -above. - - -File: magit.info, Node: Wip Modes, Next: Minor Mode for Buffers Visiting Files, Prev: Common Commands, Up: Miscellaneous - -8.7 Wip Modes -============= - -Git keeps *committed* changes around long enough for users to recover -changes they have accidentally deleted. It does so by not garbage -collecting any committed but no longer referenced objects for a certain -period of time, by default 30 days. - - But Git does *not* keep track of *uncommitted* changes in the working -tree and not even the index (the staging area). Because Magit makes it -so convenient to modify uncommitted changes, it also makes it easy to -shoot yourself in the foot in the process. - - For that reason Magit provides a global mode that saves *tracked* -files to work-in-progress references after or before certain actions. -(At present untracked files are never saved and for technical reasons -nothing is saved before the first commit has been created). - - Two separate work-in-progress references are used to track the state -of the index and of the working tree: ‘refs/wip/index/’ and -‘refs/wip/wtree/’, where ‘’ is the full ref of the -current branch, e.g. ‘refs/heads/master’. When the ‘HEAD’ is detached -then ‘HEAD’ is used in place of ‘’. - - Checking out another branch (or detaching ‘HEAD’) causes the use of -different wip refs for subsequent changes. - - -- User Option: magit-wip-mode - - When this mode is enabled, then uncommitted changes are committed - to dedicated work-in-progress refs whenever appropriate (i.e. when - dataloss would be a possibility otherwise). - - Setting this variable directly does not take effect; either use the - Custom interface to do so or call the respective mode function. - - For historic reasons this mode is implemented on top of four other - ‘magit-wip-*’ modes, which can also be used individually, if you - want finer control over when the wip refs are updated; but that is - discouraged. See *note Legacy Wip Modes::. - - To view the log for a branch and its wip refs use the commands -‘magit-wip-log’ and ‘magit-wip-log-current’. You should use ‘--graph’ -when using these commands. - - -- Command: magit-wip-log - - This command shows the log for a branch and its wip refs. With a - negative prefix argument only the worktree wip ref is shown. - - The absolute numeric value of the prefix argument controls how many - "branches" of each wip ref are shown. This is only relevant if the - value of ‘magit-wip-merge-branch’ is ‘nil’. - - -- Command: magit-wip-log-current - - This command shows the log for the current branch and its wip refs. - With a negative prefix argument only the worktree wip ref is shown. - - The absolute numeric value of the prefix argument controls how many - "branches" of each wip ref are shown. This is only relevant if the - value of ‘magit-wip-merge-branch’ is ‘nil’. - -‘X w’ (‘magit-reset-worktree’) - - This command resets the working tree to some commit read from the - user and defaulting to the commit at point, while keeping the - ‘HEAD’ and index as-is. - - This can be used to restore files to the state committed to a wip - ref. Note that this will discard any unstaged changes that might - have existed before invoking this command (but of course only after - committing that to the working tree wip ref). - - Note that even if you enable ‘magit-wip-mode’ this won’t give you -perfect protection. The most likely scenario for losing changes despite -the use of ‘magit-wip-mode’ is making a change outside Emacs and then -destroying it also outside Emacs. In some such a scenario, Magit, being -an Emacs package, didn’t get the opportunity to keep you from shooting -yourself in the foot. - - When you are unsure whether Magit did commit a change to the wip -refs, then you can explicitly request that all changes to all tracked -files are being committed. - -‘M-x magit-wip-commit’ (‘magit-wip-commit’) - - This command commits all changes to all tracked files to the index - and working tree work-in-progress refs. Like the modes described - above, it does not commit untracked files, but it does check all - tracked files for changes. Use this command when you suspect that - the modes might have overlooked a change made outside Emacs/Magit. - - -- User Option: magit-wip-namespace - - The namespace used for work-in-progress refs. It has to end with a - slash. The wip refs are named ‘index/’ and - ‘wtree/’. When snapshots are created while - the ‘HEAD’ is detached then ‘HEAD’ is used in place of - ‘’. - - -- User Option: magit-wip-mode-lighter - - Mode-line lighter for ‘magit-wip--mode’. - -* Menu: - -* Wip Graph:: -* Legacy Wip Modes:: - - -File: magit.info, Node: Wip Graph, Next: Legacy Wip Modes, Up: Wip Modes - -8.7.1 Wip Graph ---------------- - - -- User Option: magit-wip-merge-branch - - This option controls whether the current branch is merged into the - wip refs after a new commit was created on the branch. - - If non-nil and the current branch has new commits, then it is - merged into the wip ref before creating a new wip commit. This - makes it easier to inspect wip history and the wip commits are - never garbage collected. - - If nil and the current branch has new commits, then the wip ref is - reset to the tip of the branch before creating a new wip commit. - With this setting wip commits are eventually garbage collected. - - When ‘magit-wip-merge-branch’ is ‘t’, then the history looks like -this: - - *--*--*--*--*--* refs/wip/index/refs/heads/master - / / / - A-----B-----C refs/heads/master - - When ‘magit-wip-merge-branch’ is ‘nil’, then creating a commit on the -real branch and then making a change causes the wip refs to be recreated -to fork from the new commit. But the old commits on the wip refs are -not lost. They are still available from the reflog. To make it easier -to see when the fork point of a wip ref was changed, an additional -commit with the message "restart autosaving" is created on it (‘xxO’ -commits below are such boundary commits). - - Starting with - - BI0---BI1 refs/wip/index/refs/heads/master - / - A---B refs/heads/master - \ - BW0---BW1 refs/wip/wtree/refs/heads/master - - and committing the staged changes and editing and saving a file would -result in - - BI0---BI1 refs/wip/index/refs/heads/master - / - A---B---C refs/heads/master - \ \ - \ CW0---CW1 refs/wip/wtree/refs/heads/master - \ - BW0---BW1 refs/wip/wtree/refs/heads/master@{2} - - The fork-point of the index wip ref is not changed until some change -is being staged. Likewise just checking out a branch or creating a -commit does not change the fork-point of the working tree wip ref. The -fork-points are not adjusted until there actually is a change that -should be committed to the respective wip ref. - - -File: magit.info, Node: Legacy Wip Modes, Prev: Wip Graph, Up: Wip Modes - -8.7.2 Legacy Wip Modes ----------------------- - -It is recommended that you use the mode ‘magit-wip-mode’ (which see) and -ignore the existence of the following modes, which are preserved for -historic reasons. - - Setting the following variables directly does not take effect; either -use the Custom interface to do so or call the respective mode functions. - - -- User Option: magit-wip-after-save-mode - - When this mode is enabled, then saving a buffer that visits a file - tracked in a Git repository causes its current state to be - committed to the working tree wip ref for the current branch. - - -- User Option: magit-wip-after-apply-mode - - When this mode is enabled, then applying (i.e. staging, unstaging, - discarding, reversing, and regularly applying) a change to a file - tracked in a Git repository causes its current state to be - committed to the index and/or working tree wip refs for the current - branch. - - If you only ever edit files using Emacs and only ever interact with -Git using Magit, then the above two modes should be enough to protect -each and every change from accidental loss. In practice nobody does -that. Two additional modes exists that do commit to the wip refs before -making changes that could cause the loss of earlier changes. - - -- User Option: magit-wip-before-change-mode - - When this mode is enabled, then certain commands commit the - existing changes to the files they are about to make changes to. - - -- User Option: magit-wip-initial-backup-mode - - When this mode is enabled, then the current version of a file is - committed to the worktree wip ref before the buffer visiting that - file is saved for the first time since the buffer was created. - - This backs up the same version of the file that ‘backup-buffer’ - would save. While ‘backup-buffer’ uses a backup file, this mode - uses the same worktree wip ref as used by the other Magit Wip - modes. Like ‘backup-buffer’, it only does this once; unless you - kill the buffer and visit the file again only one backup will be - created per Emacs session. - - This mode ignores the variables that affect ‘backup-buffer’ and can - be used along-side that function, which is recommended because it - only backs up files that are tracked in a Git repository. - - -- User Option: magit-wip-after-save-local-mode-lighter - - Mode-line lighter for ‘magit-wip-after-save-local-mode’. - - -- User Option: magit-wip-after-apply-mode-lighter - - Mode-line lighter for ‘magit-wip-after-apply-mode’. - - -- User Option: magit-wip-before-change-mode-lighter - - Mode-line lighter for ‘magit-wip-before-change-mode’. - - -- User Option: magit-wip-initial-backup-mode-lighter - - Mode-line lighter for ‘magit-wip-initial-backup-mode’. - - -File: magit.info, Node: Minor Mode for Buffers Visiting Files, Next: Minor Mode for Buffers Visiting Blobs, Prev: Wip Modes, Up: Miscellaneous - -8.8 Minor Mode for Buffers Visiting Files -========================================= - -The minor-mode ‘magit-file-mode’ enables certain Magit features in -file-visiting buffers belonging to a Git repository. The globalized -variant ‘global-magit-file-mode’ enables the local mode in all such -buffers. It is enabled by default. Currently the local mode only -establishes a few key bindings, but this might be extended in the -future. - - -- User Option: global-magit-file-mode - - Whether to establish certain Magit key bindings in all - file-visiting buffers belonging to any Git repository. This is - enabled by default. This globalized mode turns on the local - minor-mode ‘magit-file-mode’ in all suitable buffers. - - -- Variable: magit-file-mode-map - - This keymap is used by the local minor-mode ‘magit-file-mode’ and - establishes the key bindings described below. - - Note that the default binding for ‘magit-file-dispatch’ is very - cumbersome to use and that we recommend that you add a better - binding. - - Instead of ‘C-c M-g’ I would have preferred to use ‘C-c g’ because - (1) it is similar to ‘C-x g’ (the recommended global binding for - ‘~magit-status’), (2) we cannot use ‘C-c C-g’ because we have been - recommending that that be bound to ‘magit-dispatch’ for a long - time, (3) we cannot use ‘C-x C-g’ because that is a convenient way - of aborting the incomplete key sequence ‘C-x’, and most importantly - (4) it would make it much easier to type the next key (a suffix - binding) because most of those are letters. - - For example ‘C-c g b’ is much easier to type than ‘C-c M-g b’. For - suffix bindings that use uppercase letters, the default is just - horrible—having to use e.g. ‘C-c M-g B’ (‘Control+c Meta+g - Shift+b’) would drive anyone up the walls (or to Vim). - - However ‘C-c LETTER’ bindings are reserved for users (see *note - (elisp)Key Binding Conventions::). Packages are forbidden from - using those. Doing so anyway is considered heresy. Therefore if - you want a better binding, you have to add it yourself: - - (define-key magit-file-mode-map - (kbd "C-c g") 'magit-file-dispatch) - - The key bindings shown below assume that you have not improved the -binding for ‘magit-file-dispatch’. - -‘C-c M-g’ (‘magit-file-dispatch’) - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -‘C-c M-g s’ (‘magit-stage-file’) - - Stage all changes to the file being visited in the current buffer. - -‘C-c M-g u’ (‘magit-unstage-file’) - - Unstage all changes to the file being visited in the current - buffer. - -‘C-c M-g c’ (‘magit-commit’) - - This transient prefix command binds the following suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. See *note Initiating a - Commit::. - -‘C-c M-g D’ (‘magit-diff’) - - This transient prefix command binds several diff suffix commands - and infix arguments and displays them in a temporary buffer until a - suffix is invoked. See *note Diffing::. - - This is the same command that ‘d’ is bound to in Magit buffers. If - this command is invoked from a file-visiting buffer, then the - initial value of the option (‘--’) that limits the diff to certain - file(s) is set to the visited file. - -‘C-c M-g d’ (‘magit-diff-buffer-file’) - - This command shows the diff for the file of blob that the current - buffer visits. - - -- User Option: magit-diff-buffer-file-locked - - This option controls whether ‘magit-diff-buffer-file’ uses a - dedicated buffer. See *note Modes and Buffers::. - -‘C-c M-g L’ (‘magit-log’) - - This transient prefix command binds several log suffix commands and - infix arguments and displays them in a temporary buffer until a - suffix is invoked. See *note Logging::. - - This is the same command that ‘l’ is bound to in Magit buffers. If - this command is invoked from a file-visiting buffer, then the - initial value of the option (‘--’) that limits the log to certain - file(s) is set to the visited file. - -‘C-c M-g l’ (‘magit-log-buffer-file’) - - This command shows the log for the file of blob that the current - buffer visits. Renames are followed when a prefix argument is used - or when ‘--follow’ is an active log argument. When the region is - active, the log is restricted to the selected line range. - -‘C-c M-g t’ (‘magit-log-trace-definition’) - - This command shows the log for the definition at point. - - -- User Option: magit-log-buffer-file-locked - - This option controls whether ‘magit-log-buffer-file’ uses a - dedicated buffer. See *note Modes and Buffers::. - -‘C-c M-g B’ (‘magit-blame’) - - This transient prefix command binds all blaming suffix commands - along with the appropriate infix arguments and displays them in a - temporary buffer until a suffix is invoked. - - For more information about this and the following commands also see - *note Blaming::. - - In addition to the ‘magit-blame’ sub-transient, the dispatch -transient also binds several blaming suffix commands directly. See -*note Blaming:: for information about those commands and bindings. - -‘C-c M-g e’ (‘magit-edit-line-commit’) - - This command makes the commit editable that added the current line. - - With a prefix argument it makes the commit editable that removes - the line, if any. The commit is determined using ‘git blame’ and - made editable using ‘git rebase --interactive’ if it is reachable - from ‘HEAD’, or by checking out the commit (or a branch that points - at it) otherwise. - -‘C-c M-g p’ (‘magit-blob-previous’) - - Visit the previous blob which modified the current file. - - There are a few additional commands that operate on a single file but -are not enabled in the file transient command by default: - - -- Command: magit-file-rename - - This command renames a file read from the user. - - -- Command: magit-file-delete - - This command deletes a file read from the user. - - -- Command: magit-file-untrack - - This command untracks a file read from the user. - - -- Command: magit-file-checkout - - This command updates a file in the working tree and index to the - contents from a revision. Both the revision and file are read from - the user. - - To enable them invoke the transient (‘C-c M-g’), enter "edit mode" -(‘C-x l’), set the "transient level" (‘C-x l’ again), enter ‘5’, and -leave edit mode (‘C-g’). Also see *note (transient)Enabling and -Disabling Suffixes::. - - -File: magit.info, Node: Minor Mode for Buffers Visiting Blobs, Prev: Minor Mode for Buffers Visiting Files, Up: Miscellaneous - -8.9 Minor Mode for Buffers Visiting Blobs -========================================= - -The ‘magit-blob-mode’ enables certain Magit features in blob-visiting -buffers. Such buffers can be created using ‘magit-find-file’ and some -of the commands mentioned below, which also take care of turning on this -minor mode. Currently this mode only establishes a few key bindings, -but this might be extended. - -‘p’ (‘magit-blob-previous’) - - Visit the previous blob which modified the current file. - -‘n’ (‘magit-blob-next’) - - Visit the next blob which modified the current file. - -‘q’ (‘magit-kill-this-buffer’) - - Kill the current buffer. - - -File: magit.info, Node: Customizing, Next: Plumbing, Prev: Miscellaneous, Up: Top - -9 Customizing -************* - -Both Git and Emacs are highly customizable. Magit is both a Git -porcelain as well as an Emacs package, so it makes sense to customize it -using both Git variables as well as Emacs options. However this -flexibility doesn’t come without problems, including but not limited to -the following. - - • Some Git variables automatically have an effect in Magit without - requiring any explicit support. Sometimes that is desirable - in - other cases, it breaks Magit. - - When a certain Git setting breaks Magit but you want to keep using - that setting on the command line, then that can be accomplished by - overriding the value for Magit only by appending something like - ‘("-c" "some.variable=compatible-value")’ to - ‘magit-git-global-arguments’. - - • Certain settings like ‘fetch.prune=true’ are respected by Magit - commands (because they simply call the respective Git command) but - their value is not reflected in the respective transient buffers. - In this case the ‘--prune’ argument in ‘magit-fetch’ might be - active or inactive, but that doesn’t keep the Git variable from - being honored by the suffix commands anyway. So pruning might - happen despite the ‘--prune’ arguments being displayed in a way - that seems to indicate that no pruning will happen. - - I intend to address these and similar issues in a future release. - -* Menu: - -* Per-Repository Configuration:: -* Essential Settings:: - - -File: magit.info, Node: Per-Repository Configuration, Next: Essential Settings, Up: Customizing - -9.1 Per-Repository Configuration -================================ - -Magit can be configured on a per-repository level using both Git -variables as well as Emacs options. - - To set a Git variable for one repository only, simply set it in -‘/path/to/repo/.git/config’ instead of ‘$HOME/.gitconfig’ or -‘/etc/gitconfig’. See *note (gitman)git-config::. - - Similarly, Emacs options can be set for one repository only by -editing ‘/path/to/repo/.dir-locals.el’. See *note (emacs)Directory -Variables::. For example to disable automatic refreshes of -file-visiting buffers in just one huge repository use this: - - • ‘/path/to/huge/repo/.dir-locals.el’ - - ((nil . ((magit-refresh-buffers . nil)))) - - It might only be costly to insert certain information into Magit -buffers for repositories that are exceptionally large, in which case you -can disable the respective section inserters just for that repository: - - • ‘/path/to/tag/invested/repo/.dir-locals.el’ - - ((magit-status-mode - . ((eval . (magit-disable-section-inserter 'magit-insert-tags-header))))) - - -- Function: magit-disable-section-inserter fn - - This function disables the section inserter FN in the current - repository. It is only intended for use in ‘.dir-locals.el’ and - ‘.dir-locals-2.el’. - - If you want to apply the same settings to several, but not all, -repositories then keeping the repository-local config files in sync -would quickly become annoying. To avoid that you can create config -files for certain classes of repositories (e.g. "huge repositories") -and then include those files in the per-repository config files. For -example: - - • ‘/path/to/huge/repo/.git/config’ - - [include] - path = /path/to/huge-gitconfig - - • ‘/path/to/huge-gitconfig’ - - [status] - showUntrackedFiles = no - - • ‘$HOME/.emacs.d/init.el’ - - (dir-locals-set-class-variables 'huge-git-repository - '((nil . ((magit-refresh-buffers . nil))))) - - (dir-locals-set-directory-class - "/path/to/huge/repo/" 'huge-git-repository) - - -File: magit.info, Node: Essential Settings, Prev: Per-Repository Configuration, Up: Customizing - -9.2 Essential Settings -====================== - -The next two sections list and discuss several variables that many users -might want to customize, for safety and/or performance reasons. - -* Menu: - -* Safety:: -* Performance:: - - -File: magit.info, Node: Safety, Next: Performance, Up: Essential Settings - -9.2.1 Safety ------------- - -This section discusses various variables that you might want to change -(or *not* change) for safety reasons. - - Git keeps *committed* changes around long enough for users to recover -changes they have accidentally been deleted. It does not do the same -for *uncommitted* changes in the working tree and not even the index -(the staging area). Because Magit makes it so easy to modify -uncommitted changes, it also makes it easy to shoot yourself in the foot -in the process. For that reason Magit provides three global modes that -save *tracked* files to work-in-progress references after or before -certain actions. See *note Wip Modes::. - - These modes are not enabled by default because of performance -concerns. Instead a lot of potentially destructive commands require -confirmation every time they are used. In many cases this can be -disabled by adding a symbol to ‘magit-no-confirm’ (see *note Completion -and Confirmation::). If you enable the various wip modes then you -should add ‘safe-with-wip’ to this list. - - Similarly it isn’t necessary to require confirmation before moving a -file to the system trash - if you trashed a file by mistake then you can -recover it from there. Option ‘magit-delete-by-moving-to-trash’ -controls whether the system trash is used, which is the case by default. -Nevertheless, ‘trash’ isn’t a member of ‘magit-no-confirm’ - you might -want to change that. - - By default buffers visiting files are automatically reverted when the -visited file changes on disk. This isn’t as risky as it might seem, but -to make an informed decision you should see *note Risk of Reverting -Automatically::. - - -File: magit.info, Node: Performance, Prev: Safety, Up: Essential Settings - -9.2.2 Performance ------------------ - -After Magit has run ‘git’ for side-effects, it also refreshes the -current Magit buffer and the respective status buffer. This is -necessary because otherwise outdated information might be displayed -without the user noticing. Magit buffers are updated by recreating -their content from scratch, which makes updating simpler and less -error-prone, but also more costly. Keeping it simple and just -re-creating everything from scratch is an old design decision and -departing from that will require major refactoring. - - I plan to do that in time for the next major release. I also intend -to create logs and diffs asynchronously, which should also help a lot -but also requires major refactoring. - - Meanwhile you can tell Magit to only automatically refresh the -current Magit buffer, but not the status buffer. If you do that, then -the status buffer is only refreshed automatically if it is the current -buffer. - - (setq magit-refresh-status-buffer nil) - - You should also check whether any third-party packages have added -anything to ‘magit-refresh-buffer-hook’, ‘magit-status-refresh-hook’, -‘magit-pre-refresh-hook’, and ‘magit-post-refresh-hook’. If so, then -check whether those additions impact performance significantly. - - Magit can be told to refresh buffers verbosely using ‘M-x -magit-toggle-verbose-refresh’. Enabling this helps figuring out which -sections are bottlenecks. The additional output can be found in the -‘*Messages*’ buffer. - - Magit also reverts buffers for visited files located inside the -current repository when the visited file changes on disk. That is -implemented on top of ‘auto-revert-mode’ from the built-in library -‘autorevert’. To figure out whether that impacts performance, check -whether performance is significantly worse, when many buffers exist -and/or when some buffers visit files using TRAMP. If so, then this -should help. - - (setq auto-revert-buffer-list-filter - 'magit-auto-revert-repository-buffer-p) - - For alternative approaches see *note Automatic Reverting of -File-Visiting Buffers::. - - If you have enabled any features that are disabled by default, then -you should check whether they impact performance significantly. It’s -likely that they were not enabled by default because it is known that -they reduce performance at least in large repositories. - - If performance is only slow inside certain unusually large -repositories, then you might want to disable certain features on a -per-repository or per-repository-class basis only. See *note -Per-Repository Configuration::. For example it takes a long time to -determine the next and current tag in repository with exceptional -numbers of tags. It would therefore be a good idea to disable -‘magit-insert-tags-headers’, as explained at the mentioned node. - -* Menu: - -* Microsoft Windows Performance:: -* MacOS Performance:: - -Log Performance -............... - -When showing logs, Magit limits the number of commits initially shown in -the hope that this avoids unnecessary work. When using ‘--graph’ is -used, then this unfortunately does not have the desired effect for large -histories. Junio, Git’s maintainer, said on the git mailing list -(): "‘--graph’ wants to -compute the whole history and the max-count only affects the output -phase after ‘--graph’ does its computation". - - In other words, it’s not that Git is slow at outputting the -differences, or that Magit is slow at parsing the output - the problem -is that Git first goes outside and has a smoke. - - We actually work around this issue by limiting the number of commits -not only by using ‘-’ but by also using a range. But unfortunately -that’s not always possible. - - When more than a few thousand commits are shown, then the use of -‘--graph’ can slow things down. - - Using ‘--color --graph’ is even slower. Magit uses code that is part -of Emacs to turn control characters into faces. That code is pretty -slow and this is quite noticeable when showing a log with many branches -and merges. For that reason ‘--color’ is not enabled by default -anymore. Consider leaving it at that. - -Diff Performance -................ - -If diffs are slow, then consider turning off some optional diff features -by setting all or some of the following variables to ‘nil’: -‘magit-diff-highlight-indentation’, ‘magit-diff-highlight-trailing’, -‘magit-diff-paint-whitespace’, ‘magit-diff-highlight-hunk-body’, and -‘magit-diff-refine-hunk’. - - When showing a commit instead of some arbitrary diff, then some -additional information is displayed. Calculating this information can -be quite expensive given certain circumstances. If looking at a commit -using ‘magit-revision-mode’ takes considerably more time than looking at -the same commit in ‘magit-diff-mode’, then consider setting -‘magit-revision-insert-related-refs’ to ‘nil’. - - When you are often confronted with diffs that contain deleted files, -then you might want to enable the ‘--irreversible-delete’ argument. If -you do that then diffs still show that a file was deleted but without -also showing the complete deleted content of the file. This argument is -not available by default, see *note (transient)Enabling and Disabling -Suffixes::. Once you have done that you should enable it and save that -setting, see *note (transient)Saving Values::. You should do this in -both the diff (‘d’) and the diff refresh (‘D’) transient popups. - -Refs Buffer Performance -....................... - -When refreshing the "references buffer" is slow, then that’s usually -because several hundred refs are being displayed. The best way to -address that is to display fewer refs, obviously. - - If you are not, or only mildly, interested in seeing the list of -tags, then start by not displaying them: - - (remove-hook 'magit-refs-sections-hook 'magit-insert-tags) - - Then you should also make sure that the listed remote branches -actually all exist. You can do so by pruning branches which no longer -exist using ‘f-pa’. - -Committing Performance -...................... - -When you initiate a commit, then Magit by default automatically shows a -diff of the changes you are about to commit. For large commits this can -take a long time, which is especially distracting when you are -committing large amounts of generated data which you don’t actually -intend to inspect before committing. This behavior can be turned off -using: - - (remove-hook 'server-switch-hook 'magit-commit-diff) - - Then you can type ‘C-c C-d’ to show the diff when you actually want -to see it, but only then. Alternatively you can leave the hook alone -and just type ‘C-g’ in those cases when it takes too long to generate -the diff. If you do that, then you will end up with a broken diff -buffer, but doing it this way has the advantage that you usually get to -see the diff, which is useful because it increases the odds that you -spot potential issues. - -The Built-In VC Package -....................... - -Emacs comes with a version control interface called "VC", see *note -(emacs)Version Control::. It is enabled be default, and if you don’t -use it in addition to Magit, then you should disable it to keep it from -performing unnecessary work: - - (setq vc-handled-backends nil) - - You can also disable its use for Git but keep using it when using -another version control system: - - (setq vc-handled-backends (delq 'Git vc-handled-backends)) - - -File: magit.info, Node: Microsoft Windows Performance, Next: MacOS Performance, Up: Performance - -Microsoft Windows Performance -............................. - -In order to update the status buffer, ‘git’ has to be run a few dozen -times. That is problematic on Microsoft Windows, because that operating -system is exceptionally slow at starting processes. Sadly this is an -issue that can only be fixed by Microsoft itself, and they don’t appear -to be particularly interested in doing so. - - Beside the subprocess issue, there are also other Windows-specific -performance issues. Some of these have workarounds. The maintainers of -"Git for Windows" try to improve performance on Windows. Always use the -latest release in order to benefit from the latest performance tweaks. -Magit too tries to work around some Windows-specific issues. - - According to some sources, setting the following Git variables can -also help. - - git config --global core.preloadindex true # default since v2.1 - git config --global core.fscache true # default since v2.8 - git config --global gc.auto 256 - - You should also check whether an anti-virus program is affecting -performance. - - -File: magit.info, Node: MacOS Performance, Prev: Microsoft Windows Performance, Up: Performance - -MacOS Performance -................. - -Before Emacs 26.1 child processes were created using ‘fork’ on macOS. -That needlessly copied GUI resources, which is expensive. The result -was that forking took about 30 times as long on Darwin than on Linux, -and because Magit starts many ‘git’ processes that made quite a -difference. - - So make sure that you are using at least Emacs 26.1, in which case -the faster ‘vfork’ will be used. (The creation of child processes still -takes about twice as long on Darwin compared to Linux.) See (1) for -more information. - - On Catalina, and potentially other macOS releases, there may be a -performance problem where any action takes 20 times longer on Darwin -than on Linux. This can be fixed by setting ‘magit-git-executable’ to -the absolute path of the ‘git’ executable, instead of relying on -resolving the ‘$PATH’. - - ---------- Footnotes ---------- - - (1) - - - -File: magit.info, Node: Plumbing, Next: FAQ, Prev: Customizing, Up: Top - -10 Plumbing -*********** - -The following sections describe how to use several of Magit’s core -abstractions to extend Magit itself or implement a separate extension. - - A few of the low-level features used by Magit have been factored out -into separate libraries/packages, so that they can be used by other -packages, without having to depend on Magit. See *note -(with-editor)Top:: for information about ‘with-editor’. ‘transient’ -doesn’t have a manual yet. - - If you are trying to find an unused key that you can bind to a -command provided by your own Magit extension, then checkout -. - -* Menu: - -* Calling Git:: -* Section Plumbing:: -* Refreshing Buffers:: -* Conventions:: - - -File: magit.info, Node: Calling Git, Next: Section Plumbing, Up: Plumbing - -10.1 Calling Git -================ - -Magit provides many specialized functions for calling Git. All of these -functions are defined in either ‘magit-git.el’ or ‘magit-process.el’ and -have one of the prefixes ‘magit-run-’, ‘magit-call-’, ‘magit-start-’, or -‘magit-git-’ (which is also used for other things). - - All of these functions accept an indefinite number of arguments, -which are strings that specify command line arguments for Git (or in -some cases an arbitrary executable). These arguments are flattened -before being passed on to the executable; so instead of strings they can -also be lists of strings and arguments that are ‘nil’ are silently -dropped. Some of these functions also require a single mandatory -argument before these command line arguments. - - Roughly speaking, these functions run Git either to get some value or -for side-effects. The functions that return a value are useful to -collect the information necessary to populate a Magit buffer, while the -others are used to implement Magit commands. - - The functions in the value-only group always run synchronously, and -they never trigger a refresh. The function in the side-effect group can -be further divided into subgroups depending on whether they run Git -synchronously or asynchronously, and depending on whether they trigger a -refresh when the executable has finished. - -* Menu: - -* Getting a Value from Git:: -* Calling Git for Effect:: - - -File: magit.info, Node: Getting a Value from Git, Next: Calling Git for Effect, Up: Calling Git - -10.1.1 Getting a Value from Git -------------------------------- - -These functions run Git in order to get a value, an exit status, or -output. Of course you could also use them to run Git commands that have -side-effects, but that should be avoided. - - -- Function: magit-git-exit-code &rest args - - Executes git with ARGS and returns its exit code. - - -- Function: magit-git-success &rest args - - Executes git with ARGS and returns ‘t’ if the exit code is ‘0’, - ‘nil’ otherwise. - - -- Function: magit-git-failure &rest args - - Executes git with ARGS and returns ‘t’ if the exit code is ‘1’, - ‘nil’ otherwise. - - -- Function: magit-git-true &rest args - - Executes git with ARGS and returns ‘t’ if the first line printed by - git is the string "true", ‘nil’ otherwise. - - -- Function: magit-git-false &rest args - - Executes git with ARGS and returns ‘t’ if the first line printed by - git is the string "false", ‘nil’ otherwise. - - -- Function: magit-git-insert &rest args - - Executes git with ARGS and inserts its output at point. - - -- Function: magit-git-string &rest args - - Executes git with ARGS and returns the first line of its output. - If there is no output or if it begins with a newline character, - then this returns ‘nil’. - - -- Function: magit-git-lines &rest args - - Executes git with ARGS and returns its output as a list of lines. - Empty lines anywhere in the output are omitted. - - -- Function: magit-git-items &rest args - - Executes git with ARGS and returns its null-separated output as a - list. Empty items anywhere in the output are omitted. - - If the value of option ‘magit-git-debug’ is non-nil and git exits - with a non-zero exit status, then warn about that in the echo area - and add a section containing git’s standard error in the current - repository’s process buffer. - - If an error occurs when using one of the above functions, then that -is usually due to a bug, i.e. using an argument which is not actually -supported. Such errors are usually not reported, but when they occur we -need to be able to debug them. - - -- User Option: magit-git-debug - - Whether to report errors that occur when using ‘magit-git-insert’, - ‘magit-git-string’, ‘magit-git-lines’, or ‘magit-git-items’. This - does not actually raise an error. Instead a message is shown in - the echo area, and git’s standard error is insert into a new - section in the current repository’s process buffer. - - -- Function: magit-git-str &rest args - - This is a variant of ‘magit-git-string’ that ignores the option - ‘magit-git-debug’. It is mainly intended to be used while handling - errors in functions that do respect that option. Using such a - function while handing an error could cause yet another error and - therefore lead to an infinite recursion. You probably won’t ever - need to use this function. - - -File: magit.info, Node: Calling Git for Effect, Prev: Getting a Value from Git, Up: Calling Git - -10.1.2 Calling Git for Effect ------------------------------ - -These functions are used to run git to produce some effect. Most Magit -commands that actually run git do so by using such a function. - - Because we do not need to consume git’s output when using these -functions, their output is instead logged into a per-repository buffer, -which can be shown using ‘$’ from a Magit buffer or ‘M-x magit-process’ -elsewhere. - - These functions can have an effect in two distinct ways. Firstly, -running git may change something, i.e. create or push a new commit. -Secondly, that change may require that Magit buffers are refreshed to -reflect the changed state of the repository. But refreshing isn’t -always desirable, so only some of these functions do perform such a -refresh after git has returned. - - Sometimes it is useful to run git asynchronously. For example, when -the user has just initiated a push, then there is no reason to make her -wait until that has completed. In other cases it makes sense to wait -for git to complete before letting the user do something else. For -example after staging a change it is useful to wait until after the -refresh because that also automatically moves to the next change. - - -- Function: magit-call-git &rest args - - Calls git synchronously with ARGS. - - -- Function: magit-call-process program &rest args - - Calls PROGRAM synchronously with ARGS. - - -- Function: magit-run-git &rest args - - Calls git synchronously with ARGS and then refreshes. - - -- Function: magit-run-git-with-input input &rest args - - Calls git synchronously with ARGS and sends it INPUT on standard - input. - - INPUT should be a buffer or the name of an existing buffer. The - content of that buffer is used as the process’ standard input. - After the process returns a refresh is performed. - - As a special case, INPUT may also be nil. In that case the content - of the current buffer is used as standard input and *no* refresh is - performed. - - This function actually runs git asynchronously. But then it waits - for the process to return, so the function itself is synchronous. - - -- Function: magit-run-git-with-logfile file &rest args - - Calls git synchronously with ARGS. The process’ output is saved in - FILE. This is rarely useful and so this function might be removed - in the future. - - This function actually runs git asynchronously. But then it waits - for the process to return, so the function itself is synchronous. - - -- Function: magit-git &rest args - - Calls git synchronously with ARGS for side-effects only. This - function does not refresh the buffer. - - -- Function: magit-git-wash washer &rest args - - Execute Git with ARGS, inserting washed output at point. Actually - first insert the raw output at point. If there is no output call - ‘magit-cancel-section’. Otherwise temporarily narrow the buffer to - the inserted text, move to its beginning, and then call function - WASHER with ARGS as its sole argument. - - And now for the asynchronous variants. - - -- Function: magit-run-git-async &rest args - - Start Git, prepare for refresh, and return the process object. - ARGS is flattened and then used as arguments to Git. - - Display the command line arguments in the echo area. - - After Git returns some buffers are refreshed: the buffer that was - current when this function was called (if it is a Magit buffer and - still alive), as well as the respective Magit status buffer. - Unmodified buffers visiting files that are tracked in the current - repository are reverted if ‘magit-revert-buffers’ is non-nil. - - -- Function: magit-run-git-with-editor &rest args - - Export GIT_EDITOR and start Git. Also prepare for refresh and - return the process object. ARGS is flattened and then used as - arguments to Git. - - Display the command line arguments in the echo area. - - After Git returns some buffers are refreshed: the buffer that was - current when this function was called (if it is a Magit buffer and - still alive), as well as the respective Magit status buffer. - - -- Function: magit-start-git &rest args - - Start Git, prepare for refresh, and return the process object. - - If INPUT is non-nil, it has to be a buffer or the name of an - existing buffer. The buffer content becomes the processes standard - input. - - Option ‘magit-git-executable’ specifies the Git executable and - option ‘magit-git-global-arguments’ specifies constant arguments. - The remaining arguments ARGS specify arguments to Git. They are - flattened before use. - - After Git returns, some buffers are refreshed: the buffer that was - current when this function was called (if it is a Magit buffer and - still alive), as well as the respective Magit status buffer. - Unmodified buffers visiting files that are tracked in the current - repository are reverted if ‘magit-revert-buffers’ is non-nil. - - -- Function: magit-start-process &rest args - - Start PROGRAM, prepare for refresh, and return the process object. - - If optional argument INPUT is non-nil, it has to be a buffer or the - name of an existing buffer. The buffer content becomes the - processes standard input. - - The process is started using ‘start-file-process’ and then setup to - use the sentinel ‘magit-process-sentinel’ and the filter - ‘magit-process-filter’. Information required by these functions is - stored in the process object. When this function returns the - process has not started to run yet so it is possible to override - the sentinel and filter. - - After the process returns, ‘magit-process-sentinel’ refreshes the - buffer that was current when ‘magit-start-process’ was called (if - it is a Magit buffer and still alive), as well as the respective - Magit status buffer. Unmodified buffers visiting files that are - tracked in the current repository are reverted if - ‘magit-revert-buffers’ is non-nil. - - -- Variable: magit-this-process - - The child process which is about to start. This can be used to - change the filter and sentinel. - - -- Variable: magit-process-raise-error - - When this is non-nil, then ‘magit-process-sentinel’ raises an error - if git exits with a non-zero exit status. For debugging purposes. - - -File: magit.info, Node: Section Plumbing, Next: Refreshing Buffers, Prev: Calling Git, Up: Plumbing - -10.2 Section Plumbing -===================== - -* Menu: - -* Creating Sections:: -* Section Selection:: -* Matching Sections:: - - -File: magit.info, Node: Creating Sections, Next: Section Selection, Up: Section Plumbing - -10.2.1 Creating Sections ------------------------- - - -- Macro: magit-insert-section &rest args - - Insert a section at point. - - TYPE is the section type, a symbol. Many commands that act on the - current section behave differently depending on that type. Also if - a variable ‘magit-TYPE-section-map’ exists, then use that as the - text-property ‘keymap’ of all text belonging to the section (but - this may be overwritten in subsections). TYPE can also have the - form ‘(eval FORM)’ in which case FORM is evaluated at runtime. - - Optional VALUE is the value of the section, usually a string that - is required when acting on the section. - - When optional HIDE is non-nil collapse the section body by default, - i.e. when first creating the section, but not when refreshing the - buffer. Otherwise, expand it by default. This can be overwritten - using ‘magit-section-set-visibility-hook’. When a section is - recreated during a refresh, then the visibility of predecessor is - inherited and HIDE is ignored (but the hook is still honored). - - BODY is any number of forms that actually insert the section’s - heading and body. Optional NAME, if specified, has to be a symbol, - which is then bound to the struct of the section being inserted. - - Before BODY is evaluated the ‘start’ of the section object is set - to the value of ‘point’ and after BODY was evaluated its ‘end’ is - set to the new value of ‘point’; BODY is responsible for moving - ‘point’ forward. - - If it turns out inside BODY that the section is empty, then - ‘magit-cancel-section’ can be used to abort and remove all traces - of the partially inserted section. This can happen when creating a - section by washing Git’s output and Git didn’t actually output - anything this time around. - - -- Function: magit-insert-heading &rest args - - Insert the heading for the section currently being inserted. - - This function should only be used inside ‘magit-insert-section’. - - When called without any arguments, then just set the ‘content’ slot - of the object representing the section being inserted to a marker - at ‘point’. The section should only contain a single line when - this function is used like this. - - When called with arguments ARGS, which have to be strings, then - insert those strings at point. The section should not contain any - text before this happens and afterwards it should again only - contain a single line. If the ‘face’ property is set anywhere - inside any of these strings, then insert all of them unchanged. - Otherwise use the ‘magit-section-heading’ face for all inserted - text. - - The ‘content’ property of the section struct is the end of the - heading (which lasts from ‘start’ to ‘content’) and the beginning - of the body (which lasts from ‘content’ to ‘end’). If the value of - ‘content’ is nil, then the section has no heading and its body - cannot be collapsed. If a section does have a heading then its - height must be exactly one line, including a trailing newline - character. This isn’t enforced; you are responsible for getting it - right. The only exception is that this function does insert a - newline character if necessary. - - -- Function: magit-cancel-section - - Cancel the section currently being inserted. This exits the - innermost call to ‘magit-insert-section’ and removes all traces of - what has already happened inside that call. - - -- Function: magit-define-section-jumper sym title &optional value - - Define an interactive function to go to section SYM. TITLE is the - displayed title of the section. - - -File: magit.info, Node: Section Selection, Next: Matching Sections, Prev: Creating Sections, Up: Section Plumbing - -10.2.2 Section Selection ------------------------- - - -- Function: magit-current-section - - Return the section at point. - - -- Function: magit-region-sections &optional condition multiple - - Return a list of the selected sections. - - When the region is active and constitutes a valid section - selection, then return a list of all selected sections. This is - the case when the region begins in the heading of a section and - ends in the heading of the same section or in that of a sibling - section. If optional MULTIPLE is non-nil, then the region cannot - begin and end in the same section. - - When the selection is not valid, then return nil. In this case, - most commands that can act on the selected sections will instead - act on the section at point. - - When the region looks like it would in any other buffer then the - selection is invalid. When the selection is valid then the region - uses the ‘magit-section-highlight’ face. This does not apply to - diffs where things get a bit more complicated, but even here if the - region looks like it usually does, then that’s not a valid - selection as far as this function is concerned. - - If optional CONDITION is non-nil, then the selection not only has - to be valid; all selected sections additionally have to match - CONDITION, or nil is returned. See ‘magit-section-match’ for the - forms CONDITION can take. - - -- Function: magit-region-values &optional condition multiple - - Return a list of the values of the selected sections. - - Return the values that themselves would be returned by - ‘magit-region-sections’ (which see). - - -File: magit.info, Node: Matching Sections, Prev: Section Selection, Up: Section Plumbing - -10.2.3 Matching Sections ------------------------- - -‘M-x magit-describe-section-briefly’ (‘magit-describe-section-briefly’) - - Show information about the section at point. This command is - intended for debugging purposes. - - -- Function: magit-section-ident section - - Return an unique identifier for SECTION. The return value has the - form ‘((TYPE . VALUE)...)’. - - -- Function: magit-get-section ident &optional root - - Return the section identified by IDENT. IDENT has to be a list as - returned by ‘magit-section-ident’. - - -- Function: magit-section-match condition &optional section - - Return ‘t’ if SECTION matches CONDITION. SECTION defaults to the - section at point. If SECTION is not specified and there also is no - section at point, then return ‘nil’. - - CONDITION can take the following forms: - • ‘(CONDITION...)’ - - matches if any of the CONDITIONs matches. - - • ‘[CLASS...]’ - - matches if the section’s class is the same as the first CLASS - or a subclass of that; the section’s parent class matches the - second CLASS; and so on. - - • ‘[* CLASS...]’ - - matches sections that match ‘[CLASS...]’ and also recursively - all their child sections. - - • ‘CLASS’ - - matches if the section’s class is the same as CLASS or a - subclass of that; regardless of the classes of the parent - sections. - - Each CLASS should be a class symbol, identifying a class that - derives from ‘magit-section’. For backward compatibility CLASS can - also be a "type symbol". A section matches such a symbol if the - value of its ‘type’ slot is ‘eq’. If a type symbol has an entry in - ‘magit--section-type-alist’, then a section also matches that type - if its class is a subclass of the class that corresponds to the - type as per that alist. - - Note that it is not necessary to specify the complete section - lineage as printed by ‘magit-describe-section-briefly’, unless of - course you want to be that precise. - - -- Function: magit-section-value-if condition &optional section - - If the section at point matches CONDITION, then return its value. - - If optional SECTION is non-nil then test whether that matches - instead. If there is no section at point and SECTION is nil, then - return nil. If the section does not match, then return nil. - - See ‘magit-section-match’ for the forms CONDITION can take. - - -- Function: magit-section-case &rest clauses - - Choose among clauses on the type of the section at point. - - Each clause looks like (CONDITION BODY...). The type of the - section is compared against each CONDITION; the BODY forms of the - first match are evaluated sequentially and the value of the last - form is returned. Inside BODY the symbol ‘it’ is bound to the - section at point. If no clause succeeds or if there is no section - at point return nil. - - See ‘magit-section-match’ for the forms CONDITION can take. - Additionally a CONDITION of t is allowed in the final clause and - matches if no other CONDITION match, even if there is no section at - point. - - -- Variable: magit-root-section - - The root section in the current buffer. All other sections are - descendants of this section. The value of this variable is set by - ‘magit-insert-section’ and you should never modify it. - - For diff related sections a few additional tools exist. - - -- Function: magit-diff-type &optional section - - Return the diff type of SECTION. - - The returned type is one of the symbols ‘staged’, ‘unstaged’, - ‘committed’, or ‘undefined’. This type serves a similar purpose as - the general type common to all sections (which is stored in the - ‘type’ slot of the corresponding ‘magit-section’ struct) but takes - additional information into account. When the SECTION isn’t - related to diffs and the buffer containing it also isn’t a - diff-only buffer, then return nil. - - Currently the type can also be one of ‘tracked’ and ‘untracked’, - but these values are not handled explicitly in every place they - should be. A possible fix could be to just return nil here. - - The section has to be a ‘diff’ or ‘hunk’ section, or a section - whose children are of type ‘diff’. If optional SECTION is nil, - return the diff type for the current section. In buffers whose - major mode is ‘magit-diff-mode’ SECTION is ignored and the type is - determined using other means. In ‘magit-revision-mode’ buffers the - type is always ‘committed’. - - -- Function: magit-diff-scope &optional section strict - - Return the diff scope of SECTION or the selected section(s). - - A diff’s "scope" describes what part of a diff is selected, it is a - symbol, one of ‘region’, ‘hunk’, ‘hunks’, ‘file’, ‘files’, or - ‘list’. Do not confuse this with the diff "type", as returned by - ‘magit-diff-type’. - - If optional SECTION is non-nil, then return the scope of that, - ignoring the sections selected by the region. Otherwise return the - scope of the current section, or if the region is active and - selects a valid group of diff related sections, the type of these - sections, i.e. ‘hunks’ or ‘files’. If SECTION (or if the current - section that is nil) is a ‘hunk’ section and the region starts and - ends inside the body of a that section, then the type is ‘region’. - - If optional STRICT is non-nil then return nil if the diff type of - the section at point is ‘untracked’ or the section at point is not - actually a ‘diff’ but a ‘diffstat’ section. - - -File: magit.info, Node: Refreshing Buffers, Next: Conventions, Prev: Section Plumbing, Up: Plumbing - -10.3 Refreshing Buffers -======================= - -All commands that create a new Magit buffer or change what is being -displayed in an existing buffer do so by calling ‘magit-mode-setup’. -Among other things, that function sets the buffer local values of -‘default-directory’ (to the top-level of the repository), -‘magit-refresh-function’, and ‘magit-refresh-args’. - - Buffers are refreshed by calling the function that is the local value -of ‘magit-refresh-function’ (a function named ‘magit-*-refresh-buffer’, -where ‘*’ may be something like ‘diff’) with the value of -‘magit-refresh-args’ as arguments. - - -- Macro: magit-mode-setup buffer switch-func mode refresh-func - &optional refresh-args - - This function displays and selects BUFFER, turns on MODE, and - refreshes a first time. - - This function displays and optionally selects BUFFER by calling - ‘magit-mode-display-buffer’ with BUFFER, MODE and SWITCH-FUNC as - arguments. Then it sets the local value of - ‘magit-refresh-function’ to REFRESH-FUNC and that of - ‘magit-refresh-args’ to REFRESH-ARGS. Finally it creates the - buffer content by calling REFRESH-FUNC with REFRESH-ARGS as - arguments. - - All arguments are evaluated before switching to BUFFER. - - -- Function: magit-mode-display-buffer buffer mode &optional - switch-function - - This function display BUFFER in some window and select it. BUFFER - may be a buffer or a string, the name of a buffer. The buffer is - returned. - - Unless BUFFER is already displayed in the selected frame, store the - previous window configuration as a buffer local value, so that it - can later be restored by ‘magit-mode-bury-buffer’. - - The buffer is displayed and selected using SWITCH-FUNCTION. If - that is ‘nil’ then ‘pop-to-buffer’ is used if the current buffer’s - major mode derives from ‘magit-mode’. Otherwise ‘switch-to-buffer’ - is used. - - -- Variable: magit-refresh-function - - The value of this buffer-local variable is the function used to - refresh the current buffer. It is called with ‘magit-refresh-args’ - as arguments. - - -- Variable: magit-refresh-args - - The list of arguments used by ‘magit-refresh-function’ to refresh - the current buffer. ‘magit-refresh-function’ is called with these - arguments. - - The value is usually set using ‘magit-mode-setup’, but in some - cases it’s also useful to provide commands that can change the - value. For example, the ‘magit-diff-refresh’ transient can be used - to change any of the arguments used to display the diff, without - having to specify again which differences should be shown, but - ‘magit-diff-more-context’, ‘magit-diff-less-context’ and - ‘magit-diff-default-context’ change just the ‘-U’ argument. In - both case this is done by changing the value of this variable and - then calling this ‘magit-refresh-function’. - - -File: magit.info, Node: Conventions, Prev: Refreshing Buffers, Up: Plumbing - -10.4 Conventions -================ - -Also see *note Completion and Confirmation::. - -* Menu: - -* Theming Faces:: - - -File: magit.info, Node: Theming Faces, Up: Conventions - -10.4.1 Theming Faces --------------------- - -The default theme uses blue for local branches, green for remote -branches, and goldenrod (brownish yellow) for tags. When creating a new -theme, you should probably follow that example. If your theme already -uses other colors, then stick to that. - - In older releases these reference faces used to have a background -color and a box around them. The basic default faces no longer do so, -to make Magit buffers much less noisy, and you should follow that -example at least with regards to boxes. (Boxes were used in the past to -work around a conflict between the highlighting overlay and text -property backgrounds. That’s no longer necessary because highlighting -no longer causes other background colors to disappear.) Alternatively -you can keep the background color and/or box, but then have to take -special care to adjust ‘magit-branch-current’ accordingly. By default -it looks mostly like ‘magit-branch-local’, but with a box (by default -the former is the only face that uses a box, exactly so that it sticks -out). If the former also uses a box, then you have to make sure that it -differs in some other way from the latter. - - The most difficult faces to theme are those related to diffs, -headings, highlighting, and the region. There are faces that fall into -all four groups - expect to spend some time getting this right. - - The ‘region’ face in the default theme, in both the light and dark -variants, as well as in many other themes, distributed with Emacs or by -third-parties, is very ugly. It is common to use a background color -that really sticks out, which is ugly but if that were the only problem -then it would be acceptable. Unfortunately many themes also set the -foreground color, which ensures that all text within the region is -readable. Without doing that there might be cases where some foreground -color is too close to the region background color to still be readable. -But it also means that text within the region loses all syntax -highlighting. - - I consider the work that went into getting the ‘region’ face right to -be a good indicator for the general quality of a theme. My -recommendation for the ‘region’ face is this: use a background color -slightly different from the background color of the ‘default’ face, and -do not set the foreground color at all. So for a light theme you might -use a light (possibly tinted) gray as the background color of ‘default’ -and a somewhat darker gray for the background of ‘region’. That should -usually be enough to not collide with the foreground color of any other -face. But if some other faces also set a light gray as background -color, then you should also make sure it doesn’t collide with those (in -some cases it might be acceptable though). - - Magit only uses the ‘region’ face when the region is "invalid" by its -own definition. In a Magit buffer the region is used to either select -multiple sibling sections, so that commands which support it act on all -of these sections instead of just the current section, or to select -lines within a single hunk section. In all other cases, the section is -considered invalid and Magit won’t act on it. But such invalid sections -happen, either because the user has not moved point enough yet to make -it valid or because she wants to use a non-magit command to act on the -region, e.g. ‘kill-region’. - - So using the regular ‘region’ face for invalid sections is a feature. -It tells the user that Magit won’t be able to act on it. It’s -acceptable if that face looks a bit odd and even (but less so) if it -collides with the background colors of section headings and other things -that have a background color. - - Magit highlights the current section. If a section has subsections, -then all of them are highlighted. This is done using faces that have -"highlight" in their names. For most sections, -‘magit-section-highlight’ is used for both the body and the heading. -Like the ‘region’ face, it should only set the background color to -something similar to that of ‘default’. The highlight background color -must be different from both the ‘region’ background color and the -‘default’ background color. - - For diff related sections Magit uses various faces to highlight -different parts of the selected section(s). Note that hunk headings, -unlike all other section headings, by default have a background color, -because it is useful to have very visible separators between hunks. -That face ‘magit-diff-hunk-heading’, should be different from both -‘magit-diff-hunk-heading-highlight’ and ‘magit-section-highlight’, as -well as from ‘magit-diff-context’ and ‘magit-diff-context-highlight’. -By default we do that by changing the foreground color. Changing the -background color would lead to complications, and there are already -enough we cannot get around. (Also note that it is generally a good -idea for section headings to always be bold, but only for sections that -have subsections). - - When there is a valid region selecting diff-related sibling sections, -i.e. multiple files or hunks, then the bodies of all these sections use -the respective highlight faces, but additionally the headings instead -use one of the faces ‘magit-diff-file-heading-selection’ or -‘magit-diff-hunk-heading-selection’. These faces have to be different -from the regular highlight variants to provide explicit visual -indication that the region is active. - - When theming diff related faces, start by setting the option -‘magit-diff-refine-hunk’ to ‘all’. You might personally prefer to only -refine the current hunk or not use hunk refinement at all, but some of -the users of your theme want all hunks to be refined, so you have to -cater to that. - - (Also turn on ‘magit-diff-highlight-indentation’, -‘magit-diff-highlight-trailing’, and ‘magit-diff-paint-whitespace’; and -insert some whitespace errors into the code you use for testing.) - - For e.g. "added lines" you have to adjust three faces: -‘magit-diff-added’, ‘magit-diff-added-highlight’, and -‘smerge-refined-added’. Make sure that the latter works well with both -of the former, as well as ‘smerge-other’ and ‘diff-added’. Then do the -same for the removed lines, context lines, lines added by us, and lines -added by them. Also make sure the respective added, removed, and -context faces use approximately the same saturation for both the -highlighted and unhighlighted variants. Also make sure the file and -diff headings work nicely with context lines (e.g. make them look -different). Line faces should set both the foreground and the -background color. For example, for added lines use two different -greens. - - It’s best if the foreground color of both the highlighted and the -unhighlighted variants are the same, so you will need to have to find a -color that works well on the highlight and unhighlighted background, the -refine background, and the highlight context background. When there is -an hunk internal region, then the added- and removed-lines background -color is used only within that region. Outside the region the -highlighted context background color is used. This makes it easier to -see what is being staged. With an hunk internal region the hunk heading -is shown using ‘magit-diff-hunk-heading-selection’, and so are the thin -lines that are added around the lines that fall within the region. The -background color of that has to be distinct enough from the various -other involved background colors. - - Nobody said this would be easy. If your theme restricts itself to a -certain set of colors, then you should make an exception here. -Otherwise it would be impossible to make the diffs look good in each and -every variation. Actually you might want to just stick to the default -definitions for these faces. You have been warned. Also please note -that if you do not get this right, this will in some cases look to users -like bugs in Magit - so please do it right or not at all. - - -File: magit.info, Node: FAQ, Next: Debugging Tools, Prev: Plumbing, Up: Top - -Appendix A FAQ -************** - -The next two nodes lists frequently asked questions. For a list of -frequently *and recently* asked questions, i.e. questions that haven’t -made it into the manual yet, see -. - - Please also use the *note Debugging Tools::. - -* Menu: - -* FAQ - How to ...?:: -* FAQ - Issues and Errors:: - - -File: magit.info, Node: FAQ - How to ...?, Next: FAQ - Issues and Errors, Up: FAQ - -A.1 FAQ - How to ...? -===================== - -* Menu: - -* How to show git's output?:: -* How to install the gitman info manual?:: -* How to show diffs for gpg-encrypted files?:: -* How does branching and pushing work?:: -* Can Magit be used as ediff-version-control-package?:: - - -File: magit.info, Node: How to show git's output?, Next: How to install the gitman info manual?, Up: FAQ - How to ...? - -A.1.1 How to show git’s output? -------------------------------- - -To show the output of recently run git commands, press ‘$’ (or, if that -isn’t available, ‘M-x magit-process-buffer’). This will show a buffer -containing a section per git invocation; as always press ‘TAB’ to expand -or collapse them. - - By default, git’s output is only inserted into the process buffer if -it is run for side-effects. When the output is consumed in some way, -also inserting it into the process buffer would be too expensive. For -debugging purposes, it’s possible to do so anyway by setting -‘magit-git-debug’ to ‘t’. - - -File: magit.info, Node: How to install the gitman info manual?, Next: How to show diffs for gpg-encrypted files?, Prev: How to show git's output?, Up: FAQ - How to ...? - -A.1.2 How to install the gitman info manual? --------------------------------------------- - -Git’s manpages can be exported as an info manual called ‘gitman’. -Magit’s own info manual links to nodes in that manual instead of the -actual manpages because Info doesn’t support linking to manpages. - - Unfortunately some distributions do not install the ‘gitman’ manual -by default and you will have to install a separate documentation package -to get it. - - Magit patches Info adding the ability to visit links to the ‘gitman’ -Info manual by instead viewing the respective manpage. If you prefer -that approach, then set the value of ‘magit-view-git-manual-method’ to -one of the supported packages ‘man’ or ‘woman’, e.g.: - - (setq magit-view-git-manual-method 'man) - - -File: magit.info, Node: How to show diffs for gpg-encrypted files?, Next: How does branching and pushing work?, Prev: How to install the gitman info manual?, Up: FAQ - How to ...? - -A.1.3 How to show diffs for gpg-encrypted files? ------------------------------------------------- - -Git supports showing diffs for encrypted files, but has to be told to do -so. Since Magit just uses Git to get the diffs, configuring Git also -affects the diffs displayed inside Magit. - - git config --global diff.gpg.textconv "gpg --no-tty --decrypt" - echo "*.gpg filter=gpg diff=gpg" > .gitattributes - - -File: magit.info, Node: How does branching and pushing work?, Next: Can Magit be used as ediff-version-control-package?, Prev: How to show diffs for gpg-encrypted files?, Up: FAQ - How to ...? - -A.1.4 How does branching and pushing work? ------------------------------------------- - -Please see *note Branching:: and - - - -File: magit.info, Node: Can Magit be used as ediff-version-control-package?, Prev: How does branching and pushing work?, Up: FAQ - How to ...? - -A.1.5 Can Magit be used as ‘ediff-version-control-package’? ------------------------------------------------------------ - -No, it cannot. For that to work the functions ‘ediff-magit-internal’ -and ‘ediff-magit-merge-internal’ would have to be implemented, and they -are not. These two functions are only used by the three commands -‘ediff-revision’, ‘ediff-merge-revisions-with-ancestor’, and -‘ediff-merge-revisions’. - - These commands only delegate the task of populating buffers with -certain revisions to the "internal" functions. The equally important -task of determining which revisions are to be compared/merged is not -delegated. Instead this is done without any support whatsoever from the -version control package/system - meaning that the user has to enter the -revisions explicitly. Instead of implementing ‘ediff-magit-internal’ we -provide ‘magit-ediff-compare’, which handles both tasks like it is 2005. - - The other commands ‘ediff-merge-revisions’ and -‘ediff-merge-revisions-with-ancestor’ are normally not what you want -when using a modern version control system like Git. Instead of letting -the user resolve only those conflicts which Git could not resolve on its -own, they throw away all work done by Git and then expect the user to -manually merge all conflicts, including those that had already been -resolved. That made sense back in the days when version control systems -couldn’t merge (or so I have been told), but not anymore. Once in a -blue moon you might actually want to see all conflicts, in which case -you *can* use these commands, which then use ‘ediff-vc-merge-internal’. -So we don’t actually have to implement ‘ediff-magit-merge-internal’. -Instead we provide the more useful command ‘magit-ediff-resolve’ which -only shows yet-to-be resolved conflicts. - - -File: magit.info, Node: FAQ - Issues and Errors, Prev: FAQ - How to ...?, Up: FAQ - -A.2 FAQ - Issues and Errors -=========================== - -* Menu: - -* Magit is slow:: -* I changed several thousand files at once and now Magit is unusable:: -* I am having problems committing:: -* I am using MS Windows and cannot push with Magit:: -* I am using OS X and SOMETHING works in shell, but not in Magit: I am using OS X and SOMETHING works in shell but not in Magit. -* Expanding a file to show the diff causes it to disappear:: -* Point is wrong in the COMMIT_EDITMSG buffer:: -* The mode-line information isn't always up-to-date:: -* A branch and tag sharing the same name breaks SOMETHING:: -* My Git hooks work on the command-line but not inside Magit:: -* git-commit-mode isn't used when committing from the command-line:: -* Point ends up inside invisible text when jumping to a file-visiting buffer:: - - -File: magit.info, Node: Magit is slow, Next: I changed several thousand files at once and now Magit is unusable, Up: FAQ - Issues and Errors - -A.2.1 Magit is slow -------------------- - -See *note Performance::. - - -File: magit.info, Node: I changed several thousand files at once and now Magit is unusable, Next: I am having problems committing, Prev: Magit is slow, Up: FAQ - Issues and Errors - -A.2.2 I changed several thousand files at once and now Magit is unusable ------------------------------------------------------------------------- - -Magit is *currently* not expected to work under such conditions. It -sure would be nice if it did, and v2.5 will hopefully be a big step into -that direction. But it might take until v3.1 to accomplish fully -satisfactory performance, because that requires some heavy refactoring. - - But for now we recommend you use the command line to complete this -one commit. Also see *note Performance::. - - -File: magit.info, Node: I am having problems committing, Next: I am using MS Windows and cannot push with Magit, Prev: I changed several thousand files at once and now Magit is unusable, Up: FAQ - Issues and Errors - -A.2.3 I am having problems committing -------------------------------------- - -That likely means that Magit is having problems finding an appropriate -emacsclient executable. See *note (with-editor)Configuring -With-Editor:: and *note (with-editor)Debugging::. - - -File: magit.info, Node: I am using MS Windows and cannot push with Magit, Next: I am using OS X and SOMETHING works in shell but not in Magit, Prev: I am having problems committing, Up: FAQ - Issues and Errors - -A.2.4 I am using MS Windows and cannot push with Magit ------------------------------------------------------- - -It’s almost certain that Magit is only incidental to this issue. It is -much more likely that this is a configuration issue, even if you can -push on the command line. - - Detailed setup instructions can be found at -. - - -File: magit.info, Node: I am using OS X and SOMETHING works in shell but not in Magit, Next: Expanding a file to show the diff causes it to disappear, Prev: I am using MS Windows and cannot push with Magit, Up: FAQ - Issues and Errors - -A.2.5 I am using OS X and SOMETHING works in shell, but not in Magit --------------------------------------------------------------------- - -This usually occurs because Emacs doesn’t have the same environment -variables as your shell. Try installing and configuring -. By default it -synchronizes ‘$PATH’, which helps Magit find the same ‘git’ as the one -you are using on the shell. - - If SOMETHING is "passphrase caching with gpg-agent for commit and/or -tag signing", then you’ll also need to synchronize ‘$GPG_AGENT_INFO’. - - -File: magit.info, Node: Expanding a file to show the diff causes it to disappear, Next: Point is wrong in the COMMIT_EDITMSG buffer, Prev: I am using OS X and SOMETHING works in shell but not in Magit, Up: FAQ - Issues and Errors - -A.2.6 Expanding a file to show the diff causes it to disappear --------------------------------------------------------------- - -This is probably caused by a change of a ‘diff.*’ Git variable. You -probably set that variable for a reason, and should therefore only undo -that setting in Magit by customizing ‘magit-git-global-arguments’. - - -File: magit.info, Node: Point is wrong in the COMMIT_EDITMSG buffer, Next: The mode-line information isn't always up-to-date, Prev: Expanding a file to show the diff causes it to disappear, Up: FAQ - Issues and Errors - -A.2.7 Point is wrong in the ‘COMMIT_EDITMSG’ buffer ---------------------------------------------------- - -Neither Magit nor ‘git-commit‘ fiddle with point in the buffer used to -write commit messages, so something else must be doing it. - - You have probably globally enabled a mode which does restore point in -file-visiting buffers. It might be a bit surprising, but when you write -a commit message, then you are actually editing a file. - - So you have to figure out which package is doing. ‘saveplace’, -‘pointback’, and ‘session’ are likely candidates. These snippets might -help: - - (setq session-name-disable-regexp "\\(?:\\`'\\.git/[A-Z_]+\\'\\)") - - (with-eval-after-load 'pointback - (lambda () - (when (or git-commit-mode git-rebase-mode) - (pointback-mode -1)))) - - -File: magit.info, Node: The mode-line information isn't always up-to-date, Next: A branch and tag sharing the same name breaks SOMETHING, Prev: Point is wrong in the COMMIT_EDITMSG buffer, Up: FAQ - Issues and Errors - -A.2.8 The mode-line information isn’t always up-to-date -------------------------------------------------------- - -Magit is not responsible for the version control information that is -being displayed in the mode-line and looks something like ‘Git-master’. -The built-in "Version Control" package, also known as "VC", updates that -information, and can be told to do so more often: - - (setq auto-revert-check-vc-info t) - - But doing so isn’t good for performance. For more (overly -optimistic) information see *note (emacs)VC Mode Line::. - - If you don’t really care about seeing that information in the -mode-line, but just don’t want to see _incorrect_ information, then -consider disabling VC when using Git: - - (setq vc-handled-backends (delq 'Git vc-handled-backends)) - - Or to disable it completely: - - (setq vc-handled-backends nil) - - -File: magit.info, Node: A branch and tag sharing the same name breaks SOMETHING, Next: My Git hooks work on the command-line but not inside Magit, Prev: The mode-line information isn't always up-to-date, Up: FAQ - Issues and Errors - -A.2.9 A branch and tag sharing the same name breaks SOMETHING -------------------------------------------------------------- - -Or more generally, ambiguous refnames break SOMETHING. - - Magit assumes that refs are named non-ambiguously across the -"refs/heads/", "refs/tags/", and "refs/remotes/" namespaces (i.e., all -the names remain unique when those prefixes are stripped). We consider -ambiguous refnames unsupported and recommend that you use a -non-ambiguous naming scheme. However, if you do work with a repository -that has ambiguous refnames, please report any issues you encounter so -that we can investigate whether there is a simple fix. - - -File: magit.info, Node: My Git hooks work on the command-line but not inside Magit, Next: git-commit-mode isn't used when committing from the command-line, Prev: A branch and tag sharing the same name breaks SOMETHING, Up: FAQ - Issues and Errors - -A.2.10 My Git hooks work on the command-line but not inside Magit ------------------------------------------------------------------ - -When Magit calls ‘git’ it adds a few global arguments including -‘--literal-pathspecs’ and the ‘git’ process started by Magit then passes -that setting on to other ‘git’ process it starts itself. It does so by -setting the environment variable ‘GIT_LITERAL_PATHSPECS’, not by calling -subprocesses with the ‘--literal-pathspecs’ argument. You can therefore -override this setting in hook scripts using ‘unset -GIT_LITERAL_PATHSPECS’. - - -File: magit.info, Node: git-commit-mode isn't used when committing from the command-line, Next: Point ends up inside invisible text when jumping to a file-visiting buffer, Prev: My Git hooks work on the command-line but not inside Magit, Up: FAQ - Issues and Errors - -A.2.11 ‘git-commit-mode’ isn’t used when committing from the command-line -------------------------------------------------------------------------- - -The reason for this is that ‘git-commit.el’ has not been loaded yet -and/or that the server has not been started yet. These things have -always already been taken care of when you commit from Magit because in -order to do so, Magit has to be loaded and doing that involves loading -‘git-commit’ and starting the server. - - If you want to commit from the command-line, then you have to take -care of these things yourself. Your ‘init.el’ file should contain: - - (require 'git-commit) - (server-mode) - - Instead of ‘(require ’git-commit)‘ you may also use: - - (load "/path/to/magit-autoloads.el") - - You might want to do that because loading ‘git-commit’ causes large -parts of Magit to be loaded. - - There are also some variations of ‘(server-mode)’ that you might want -to try. Personally I use: - - (use-package server - :config (or (server-running-p) (server-mode))) - - Now you can use: - - $ emacs& - $ EDITOR=emacsclient git commit - - However you cannot use: - - $ killall emacs - $ EDITOR="emacsclient --alternate-editor emacs" git commit - - This will actually end up using ‘emacs’, not ‘emacsclient’. If you -do this, then can still edit the commit message but ‘git-commit-mode’ -won’t be used and you have to exit ‘emacs’ to finish the process. - - Tautology ahead. If you want to be able to use ‘emacsclient’ to -connect to a running ‘emacs’ instance, even though no ‘emacs’ instance -is running, then you cannot use ‘emacsclient’ directly. - - Instead you have to create a script that does something like this: - - Try to use ‘emacsclient’ (without using ‘--alternate-editor’). If -that succeeds, do nothing else. Otherwise start ‘emacs &’ (and -‘init.el’ must call ‘server-start’) and try to use ‘emacsclient’ again. - - -File: magit.info, Node: Point ends up inside invisible text when jumping to a file-visiting buffer, Prev: git-commit-mode isn't used when committing from the command-line, Up: FAQ - Issues and Errors - -A.2.12 Point ends up inside invisible text when jumping to a file-visiting buffer ---------------------------------------------------------------------------------- - -This can happen when you type ‘RET’ on a hunk to visit the respective -file at the respective position. One solution to this problem is to use -‘global-reveal-mode’. It makes sure that text around point is always -visible. If that is too drastic for your taste, then you may instead -use ‘magit-diff-visit-file-hook’ to reveal the text, possibly using -‘reveal-post-command’ or for Org buffers ‘org-reveal’. - - -File: magit.info, Node: Debugging Tools, Next: Keystroke Index, Prev: FAQ, Up: Top - -B Debugging Tools -***************** - -Magit and its dependencies provide a few debugging tools, and we -appreciate it very much if you use those tools before reporting an -issue. Please include all relevant output when reporting an issue. - -‘M-x magit-version’ (‘magit-version’) - - This command shows the currently used versions of Magit, Git, and - Emacs in the echo area. Non-interactively this just returns the - Magit version. - -‘M-x magit-emacs-Q-command’ (‘magit-emacs-Q-command’) - - This command shows a debugging shell command in the echo area and - adds it to the kill ring. Paste that command into a shell and run - it. - - This shell command starts ‘emacs’ with only ‘magit’ and its - dependencies loaded. Neither your configuration nor other - installed packages are loaded. This makes it easier to determine - whether some issue lays with Magit or something else. - - If you run Magit from its Git repository, then you should be able - to use ‘make emacs-Q’ instead of the output of this command. - -‘M-x magit-toggle-verbose-refresh’ (‘magit-toggle-verbose-refresh’) - - This command toggles whether Magit refreshes buffers verbosely. - Enabling this helps figuring out which sections are bottlenecks. - The additional output can be found in the ‘*Messages*’ buffer. - -‘M-x magit-debug-git-executable’ (‘magit-debug-git-executable’) - - This command displays a buffer containing information about the - available and used ‘git’ executable(s), and can be useful when - investigating ‘exec-path’ issues. - - Also see *note Git Executable::. - -‘M-x with-editor-debug’ (‘with-editor-debug’) - - This command displays a buffer containing information about the - available and used ‘emacsclient’ executable(s), and can be useful - when investigating why Magit (or rather ‘with-editor’) cannot find - an appropriate ‘emacsclient’ executable. - - Also see *note (with-editor)Debugging::. - - Please also see the *note FAQ::. - - -File: magit.info, Node: Keystroke Index, Next: Command Index, Prev: Debugging Tools, Up: Top - -Appendix C Keystroke Index -************************** - -[index] -* Menu: - -* !: Running Git Manually. - (line 12) -* ! !: Running Git Manually. - (line 17) -* ! a: Running Git Manually. - (line 58) -* ! b: Running Git Manually. - (line 62) -* ! g: Running Git Manually. - (line 66) -* ! k: Running Git Manually. - (line 54) -* ! p: Running Git Manually. - (line 25) -* ! s: Running Git Manually. - (line 35) -* ! S: Running Git Manually. - (line 40) -* $: Viewing Git Output. (line 16) -* %: Worktree. (line 8) -* % b: Worktree. (line 13) -* % c: Worktree. (line 17) -* % g: Worktree. (line 30) -* % k: Worktree. (line 25) -* % m: Worktree. (line 21) -* +: Log Buffer. (line 61) -* + <1>: Refreshing Diffs. (line 69) -* -: Log Buffer. (line 65) -* - <1>: Refreshing Diffs. (line 65) -* 0: Refreshing Diffs. (line 73) -* 1: Section Visibility. (line 26) -* 2: Section Visibility. (line 27) -* 3: Section Visibility. (line 28) -* 4: Section Visibility. (line 29) -* =: Log Buffer. (line 55) -* ^: Section Movement. (line 31) -* a: Applying. (line 33) -* A: Cherry Picking. (line 8) -* A A: Cherry Picking. (line 17) -* A a: Cherry Picking. (line 24) -* A A <1>: Cherry Picking. (line 90) -* A a <1>: Cherry Picking. (line 98) -* A d: Cherry Picking. (line 54) -* A h: Cherry Picking. (line 42) -* A n: Cherry Picking. (line 65) -* A s: Cherry Picking. (line 76) -* A s <1>: Cherry Picking. (line 94) -* B: Bisecting. (line 8) -* b: Blaming. (line 105) -* b <1>: Branch Commands. (line 12) -* b <2>: Editing Rebase Sequences. - (line 85) -* B B: Bisecting. (line 16) -* B b: Bisecting. (line 31) -* b b: Branch Commands. (line 49) -* b C: Branch Commands. (line 29) -* b c: Branch Commands. (line 67) -* B g: Bisecting. (line 36) -* B k: Bisecting. (line 41) -* b k: Branch Commands. (line 147) -* b l: Branch Commands. (line 74) -* b n: Branch Commands. (line 57) -* B r: Bisecting. (line 47) -* b r: Branch Commands. (line 153) -* B s: Bisecting. (line 24) -* b s: Branch Commands. (line 97) -* b S: Branch Commands. (line 125) -* b x: Branch Commands. (line 131) -* c: Blaming. (line 138) -* C: Cloning Repository. (line 20) -* c <1>: Initiating a Commit. (line 8) -* c <2>: Editing Rebase Sequences. - (line 72) -* c a: Initiating a Commit. (line 19) -* c A: Initiating a Commit. (line 67) -* C b: Cloning Repository. (line 41) -* C C: Cloning Repository. (line 29) -* c c: Initiating a Commit. (line 14) -* C d: Cloning Repository. (line 54) -* C e: Cloning Repository. (line 61) -* c e: Initiating a Commit. (line 23) -* c f: Initiating a Commit. (line 43) -* c F: Initiating a Commit. (line 51) -* C m: Cloning Repository. (line 46) -* C s: Cloning Repository. (line 34) -* c s: Initiating a Commit. (line 55) -* c S: Initiating a Commit. (line 63) -* c w: Initiating a Commit. (line 33) -* C-: Visiting Files and Blobs from a Diff. - (line 51) -* C-: Section Visibility. (line 13) -* C-c C-a: Commit Pseudo Headers. - (line 17) -* C-c C-b: Log Buffer. (line 21) -* C-c C-b <1>: Refreshing Diffs. (line 91) -* C-c C-c: Transient Commands. (line 18) -* C-c C-c <1>: Select from Log. (line 20) -* C-c C-c <2>: Editing Commit Messages. - (line 17) -* C-c C-c <3>: Editing Rebase Sequences. - (line 6) -* C-c C-d: Refreshing Diffs. (line 81) -* C-c C-d <1>: Editing Commit Messages. - (line 58) -* C-c C-e: Commands Available in Diffs. - (line 25) -* C-c C-f: Log Buffer. (line 25) -* C-c C-f <1>: Refreshing Diffs. (line 95) -* C-c C-i: Commit Pseudo Headers. - (line 13) -* C-c C-k: Select from Log. (line 26) -* C-c C-k <1>: Editing Commit Messages. - (line 22) -* C-c C-k <2>: Editing Rebase Sequences. - (line 11) -* C-c C-n: Log Buffer. (line 29) -* C-c C-o: Commit Pseudo Headers. - (line 33) -* C-c C-p: Commit Pseudo Headers. - (line 37) -* C-c C-r: Commit Pseudo Headers. - (line 21) -* C-c C-s: Commit Pseudo Headers. - (line 25) -* C-c C-t: Commands Available in Diffs. - (line 14) -* C-c C-t <1>: Commit Pseudo Headers. - (line 29) -* C-c C-w: Using the Revision Stack. - (line 6) -* C-c M-g: Minor Mode for Buffers Visiting Files. - (line 54) -* C-c M-g B: Blaming. (line 21) -* C-c M-g b: Blaming. (line 32) -* C-c M-g B <1>: Minor Mode for Buffers Visiting Files. - (line 123) -* C-c M-g B b: Blaming. (line 33) -* C-c M-g B e: Blaming. (line 67) -* C-c M-g B f: Blaming. (line 58) -* C-c M-g B r: Blaming. (line 49) -* C-c M-g c: Minor Mode for Buffers Visiting Files. - (line 68) -* C-c M-g D: Minor Mode for Buffers Visiting Files. - (line 75) -* C-c M-g d: Minor Mode for Buffers Visiting Files. - (line 86) -* C-c M-g e: Blaming. (line 66) -* C-c M-g e <1>: Minor Mode for Buffers Visiting Files. - (line 136) -* C-c M-g f: Blaming. (line 57) -* C-c M-g L: Minor Mode for Buffers Visiting Files. - (line 96) -* C-c M-g l: Minor Mode for Buffers Visiting Files. - (line 107) -* C-c M-g p: Minor Mode for Buffers Visiting Files. - (line 146) -* C-c M-g r: Blaming. (line 48) -* C-c M-g s: Minor Mode for Buffers Visiting Files. - (line 59) -* C-c M-g t: Minor Mode for Buffers Visiting Files. - (line 114) -* C-c M-g u: Minor Mode for Buffers Visiting Files. - (line 63) -* C-c M-i: Commit Pseudo Headers. - (line 42) -* C-c M-s: Editing Commit Messages. - (line 34) -* C-w: Common Commands. (line 27) -* C-x g: Status Buffer. (line 22) -* C-x u: Editing Rebase Sequences. - (line 94) -* d: Diffing. (line 21) -* D: Refreshing Diffs. (line 11) -* d c: Diffing. (line 69) -* d d: Diffing. (line 27) -* D f: Refreshing Diffs. (line 46) -* D F: Refreshing Diffs. (line 51) -* D g: Refreshing Diffs. (line 17) -* d p: Diffing. (line 61) -* d r: Diffing. (line 31) -* D r: Refreshing Diffs. (line 41) -* d s: Diffing. (line 51) -* D s: Refreshing Diffs. (line 22) -* d t: Diffing. (line 74) -* D t: Refreshing Diffs. (line 37) -* d u: Diffing. (line 57) -* d w: Diffing. (line 45) -* D w: Refreshing Diffs. (line 29) -* DEL: Log Buffer. (line 45) -* DEL <1>: Commands Available in Diffs. - (line 60) -* DEL <2>: Blaming. (line 92) -* DEL <3>: Editing Rebase Sequences. - (line 28) -* e: Ediffing. (line 9) -* E: Ediffing. (line 21) -* e <1>: Editing Rebase Sequences. - (line 55) -* E c: Ediffing. (line 65) -* E i: Ediffing. (line 57) -* E m: Ediffing. (line 35) -* E r: Ediffing. (line 26) -* E s: Ediffing. (line 48) -* E u: Ediffing. (line 53) -* E w: Ediffing. (line 61) -* E z: Ediffing. (line 69) -* f: Editing Rebase Sequences. - (line 63) -* f <1>: Fetching. (line 9) -* F: Pulling. (line 9) -* f a: Fetching. (line 50) -* f C: Branch Commands. (line 30) -* F C: Branch Commands. (line 31) -* f e: Fetching. (line 36) -* F e: Pulling. (line 30) -* f m: Fetching. (line 54) -* f o: Fetching. (line 40) -* f p: Fetching. (line 15) -* F p: Pulling. (line 14) -* f r: Fetching. (line 45) -* f u: Fetching. (line 23) -* F u: Pulling. (line 22) -* g: Automatic Refreshing of Magit Buffers. - (line 24) -* G: Automatic Refreshing of Magit Buffers. - (line 33) -* j: Commands Available in Diffs. - (line 45) -* k: Viewing Git Output. (line 24) -* k <1>: Applying. (line 40) -* k <2>: Editing Rebase Sequences. - (line 68) -* k <3>: Stashing. (line 96) -* l: Logging. (line 29) -* L: Refreshing Logs. (line 11) -* L <1>: Log Buffer. (line 6) -* L <2>: Log Margin. (line 57) -* l <1>: Editing Rebase Sequences. - (line 115) -* l a: Logging. (line 60) -* l b: Logging. (line 56) -* L d: Log Margin. (line 74) -* L g: Refreshing Logs. (line 17) -* l h: Logging. (line 48) -* l H: Reflog. (line 19) -* l l: Logging. (line 35) -* l L: Logging. (line 52) -* L L: Log Margin. (line 66) -* L l: Log Margin. (line 70) -* l o: Logging. (line 41) -* l O: Reflog. (line 15) -* l r: Reflog. (line 11) -* L s: Refreshing Logs. (line 22) -* L t: Refreshing Logs. (line 37) -* L w: Refreshing Logs. (line 29) -* m: Merging. (line 9) -* M: Remote Commands. (line 13) -* m a: Merging. (line 45) -* m a <1>: Merging. (line 95) -* M a: Remote Commands. (line 50) -* M C: Remote Commands. (line 33) -* m e: Merging. (line 31) -* m i: Merging. (line 58) -* M k: Remote Commands. (line 65) -* m m: Merging. (line 18) -* m m <1>: Merging. (line 89) -* m n: Merging. (line 38) -* m p: Merging. (line 81) -* M p: Remote Commands. (line 69) -* M P: Remote Commands. (line 74) -* M r: Remote Commands. (line 55) -* m s: Merging. (line 72) -* M u: Remote Commands. (line 60) -* M-1: Section Visibility. (line 33) -* M-2: Section Visibility. (line 34) -* M-3: Section Visibility. (line 35) -* M-4: Section Visibility. (line 36) -* M-: Section Visibility. (line 17) -* M-n: Section Movement. (line 26) -* M-n <1>: Editing Commit Messages. - (line 44) -* M-n <2>: Editing Rebase Sequences. - (line 47) -* M-p: Section Movement. (line 20) -* M-p <1>: Editing Commit Messages. - (line 38) -* M-p <2>: Editing Rebase Sequences. - (line 43) -* M-w: Blaming. (line 130) -* M-w <1>: Common Commands. (line 10) -* M-x magit-debug-git-executable: Git Executable. (line 45) -* M-x magit-debug-git-executable <1>: Debugging Tools. (line 36) -* M-x magit-describe-section-briefly: Section Types and Values. - (line 13) -* M-x magit-describe-section-briefly <1>: Matching Sections. (line 6) -* M-x magit-emacs-Q-command: Debugging Tools. (line 16) -* M-x magit-init: Creating Repository. (line 6) -* M-x magit-reset-index: Staging and Unstaging. - (line 87) -* M-x magit-reverse-in-index: Staging and Unstaging. - (line 62) -* M-x magit-stage-file: Staging from File-Visiting Buffers. - (line 10) -* M-x magit-toggle-buffer-lock: Modes and Buffers. (line 17) -* M-x magit-toggle-verbose-refresh: Debugging Tools. (line 30) -* M-x magit-unstage-file: Staging from File-Visiting Buffers. - (line 18) -* M-x magit-version: Git Executable. (line 17) -* M-x magit-version <1>: Debugging Tools. (line 10) -* M-x magit-wip-commit: Wip Modes. (line 88) -* M-x with-editor-debug: Debugging Tools. (line 44) -* MM: Editing Rebase Sequences. - (line 125) -* Mt: Editing Rebase Sequences. - (line 132) -* n: Section Movement. (line 16) -* n <1>: Blaming. (line 109) -* N: Blaming. (line 113) -* n <2>: Editing Rebase Sequences. - (line 39) -* n <3>: Minor Mode for Buffers Visiting Blobs. - (line 16) -* o: Submodule Transient. (line 6) -* O: Subtree. (line 8) -* o a: Submodule Transient. (line 20) -* o d: Submodule Transient. (line 50) -* O e: Subtree. (line 42) -* O e p: Subtree. (line 54) -* O e s: Subtree. (line 59) -* o f: Submodule Transient. (line 58) -* O i: Subtree. (line 13) -* O i a: Subtree. (line 25) -* O i c: Subtree. (line 30) -* O i f: Subtree. (line 38) -* O i m: Subtree. (line 34) -* o l: Submodule Transient. (line 54) -* o p: Submodule Transient. (line 34) -* o r: Submodule Transient. (line 27) -* o s: Submodule Transient. (line 44) -* o u: Submodule Transient. (line 39) -* p: Section Movement. (line 10) -* p <1>: Blaming. (line 117) -* P: Blaming. (line 121) -* p <2>: Editing Rebase Sequences. - (line 35) -* P <1>: Pushing. (line 9) -* p <3>: Minor Mode for Buffers Visiting Blobs. - (line 12) -* P C: Branch Commands. (line 32) -* P e: Pushing. (line 31) -* P m: Pushing. (line 50) -* P o: Pushing. (line 36) -* P p: Pushing. (line 15) -* P r: Pushing. (line 41) -* P t: Pushing. (line 58) -* P T: Pushing. (line 66) -* P u: Pushing. (line 23) -* q: Quitting Windows. (line 6) -* q <1>: Log Buffer. (line 14) -* q <2>: Blaming. (line 125) -* q <3>: Minor Mode for Buffers Visiting Blobs. - (line 20) -* r: Rebasing. (line 9) -* r <1>: Editing Rebase Sequences. - (line 51) -* r a: Rebasing. (line 123) -* r e: Rebasing. (line 44) -* r e <1>: Rebasing. (line 118) -* r f: Rebasing. (line 84) -* r i: Rebasing. (line 80) -* r k: Rebasing. (line 99) -* r m: Rebasing. (line 89) -* r p: Rebasing. (line 28) -* r r: Rebasing. (line 106) -* r s: Rebasing. (line 50) -* r s <1>: Rebasing. (line 113) -* r u: Rebasing. (line 36) -* r w: Rebasing. (line 94) -* RET: References Buffer. (line 181) -* RET <1>: Visiting Files and Blobs from a Diff. - (line 8) -* RET <2>: Blaming. (line 78) -* RET <3>: Editing Rebase Sequences. - (line 16) -* s: Staging and Unstaging. - (line 28) -* S: Staging and Unstaging. - (line 36) -* s <1>: Editing Rebase Sequences. - (line 59) -* S-: Section Visibility. (line 22) -* SPC: Log Buffer. (line 35) -* SPC <1>: Commands Available in Diffs. - (line 56) -* SPC <2>: Blaming. (line 82) -* SPC <3>: Editing Rebase Sequences. - (line 21) -* t: Editing Rebase Sequences. - (line 119) -* t <1>: Tagging. (line 8) -* T: Notes. (line 8) -* T a: Notes. (line 52) -* T c: Notes. (line 47) -* t k: Tagging. (line 40) -* T m: Notes. (line 38) -* t p: Tagging. (line 47) -* T p: Notes. (line 30) -* t r: Tagging. (line 19) -* T r: Notes. (line 22) -* t t: Tagging. (line 14) -* T T: Notes. (line 14) -* TAB: Section Visibility. (line 9) -* u: Staging and Unstaging. - (line 43) -* U: Staging and Unstaging. - (line 52) -* v: Applying. (line 44) -* V: Reverting. (line 6) -* V A: Reverting. (line 31) -* V a: Reverting. (line 39) -* V s: Reverting. (line 35) -* V V: Reverting. (line 15) -* V v: Reverting. (line 21) -* W: Plain Patches. (line 6) -* w: Maildir Patches. (line 8) -* w a: Plain Patches. (line 21) -* w a <1>: Maildir Patches. (line 25) -* w a <2>: Maildir Patches. (line 43) -* W c: Plain Patches. (line 12) -* w m: Maildir Patches. (line 21) -* W s: Plain Patches. (line 28) -* w s: Maildir Patches. (line 38) -* w w: Maildir Patches. (line 14) -* w w <1>: Maildir Patches. (line 34) -* x: Editing Rebase Sequences. - (line 76) -* x <1>: Resetting. (line 8) -* X f: Resetting. (line 44) -* X h: Resetting. (line 26) -* X i: Resetting. (line 31) -* X m: Resetting. (line 15) -* X s: Resetting. (line 20) -* X w: Resetting. (line 38) -* X w <1>: Wip Modes. (line 66) -* Y: Cherries. (line 17) -* y: References Buffer. (line 6) -* y <1>: Editing Rebase Sequences. - (line 90) -* y c: References Buffer. (line 26) -* y o: References Buffer. (line 32) -* y y: References Buffer. (line 21) -* z: Stashing. (line 8) -* z a: Stashing. (line 59) -* z b: Stashing. (line 81) -* z B: Stashing. (line 86) -* z f: Stashing. (line 92) -* z i: Stashing. (line 21) -* z I: Stashing. (line 47) -* z k: Stashing. (line 72) -* z l: Stashing. (line 100) -* z p: Stashing. (line 65) -* z v: Stashing. (line 77) -* z w: Stashing. (line 26) -* z W: Stashing. (line 52) -* z x: Stashing. (line 33) -* z z: Stashing. (line 14) -* z Z: Stashing. (line 40) - - -File: magit.info, Node: Command Index, Next: Function Index, Prev: Keystroke Index, Up: Top - -Appendix D Command Index -************************ - -[index] -* Menu: - -* forward-line: Editing Rebase Sequences. - (line 39) -* git-commit-ack: Commit Pseudo Headers. - (line 17) -* git-commit-cc: Commit Pseudo Headers. - (line 33) -* git-commit-insert-pseudo-header: Commit Pseudo Headers. - (line 13) -* git-commit-next-message: Editing Commit Messages. - (line 44) -* git-commit-prev-message: Editing Commit Messages. - (line 38) -* git-commit-reported: Commit Pseudo Headers. - (line 37) -* git-commit-review: Commit Pseudo Headers. - (line 21) -* git-commit-save-message: Editing Commit Messages. - (line 34) -* git-commit-signoff: Commit Pseudo Headers. - (line 25) -* git-commit-suggested: Commit Pseudo Headers. - (line 42) -* git-commit-test: Commit Pseudo Headers. - (line 29) -* git-rebase-backward-line: Editing Rebase Sequences. - (line 35) -* git-rebase-break: Editing Rebase Sequences. - (line 85) -* git-rebase-edit: Editing Rebase Sequences. - (line 55) -* git-rebase-exec: Editing Rebase Sequences. - (line 76) -* git-rebase-fixup: Editing Rebase Sequences. - (line 63) -* git-rebase-insert: Editing Rebase Sequences. - (line 90) -* git-rebase-kill-line: Editing Rebase Sequences. - (line 68) -* git-rebase-label: Editing Rebase Sequences. - (line 115) -* git-rebase-merge: Editing Rebase Sequences. - (line 125) -* git-rebase-merge-toggle-editmsg: Editing Rebase Sequences. - (line 132) -* git-rebase-move-line-down: Editing Rebase Sequences. - (line 47) -* git-rebase-move-line-up: Editing Rebase Sequences. - (line 43) -* git-rebase-pick: Editing Rebase Sequences. - (line 72) -* git-rebase-reset: Editing Rebase Sequences. - (line 119) -* git-rebase-reword: Editing Rebase Sequences. - (line 51) -* git-rebase-show-commit: Editing Rebase Sequences. - (line 16) -* git-rebase-show-or-scroll-down: Editing Rebase Sequences. - (line 28) -* git-rebase-show-or-scroll-up: Editing Rebase Sequences. - (line 21) -* git-rebase-squash: Editing Rebase Sequences. - (line 59) -* git-rebase-undo: Editing Rebase Sequences. - (line 94) -* ido-enter-magit-status: Status Buffer. (line 72) -* magit-am: Maildir Patches. (line 8) -* magit-am-abort: Maildir Patches. (line 43) -* magit-am-apply-maildir: Maildir Patches. (line 21) -* magit-am-apply-patches: Maildir Patches. (line 14) -* magit-am-continue: Maildir Patches. (line 34) -* magit-am-skip: Maildir Patches. (line 38) -* magit-apply: Applying. (line 33) -* magit-bisect: Bisecting. (line 8) -* magit-bisect-bad: Bisecting. (line 31) -* magit-bisect-good: Bisecting. (line 36) -* magit-bisect-reset: Bisecting. (line 47) -* magit-bisect-run: Bisecting. (line 24) -* magit-bisect-skip: Bisecting. (line 41) -* magit-bisect-start: Bisecting. (line 16) -* magit-blame: Blaming. (line 21) -* magit-blame <1>: Blaming. (line 105) -* magit-blame <2>: Minor Mode for Buffers Visiting Files. - (line 123) -* magit-blame-addition: Blaming. (line 32) -* magit-blame-addition <1>: Blaming. (line 33) -* magit-blame-copy-hash: Blaming. (line 130) -* magit-blame-cycle-style: Blaming. (line 138) -* magit-blame-echo: Blaming. (line 66) -* magit-blame-echo <1>: Blaming. (line 67) -* magit-blame-next-chunk: Blaming. (line 109) -* magit-blame-next-chunk-same-commit: Blaming. (line 113) -* magit-blame-previous-chunk: Blaming. (line 117) -* magit-blame-previous-chunk-same-commit: Blaming. (line 121) -* magit-blame-quit: Blaming. (line 125) -* magit-blame-removal: Blaming. (line 48) -* magit-blame-removal <1>: Blaming. (line 49) -* magit-blame-reverse: Blaming. (line 57) -* magit-blame-reverse <1>: Blaming. (line 58) -* magit-blob-next: Minor Mode for Buffers Visiting Blobs. - (line 16) -* magit-blob-previous: Minor Mode for Buffers Visiting Files. - (line 146) -* magit-blob-previous <1>: Minor Mode for Buffers Visiting Blobs. - (line 12) -* magit-branch: Branch Commands. (line 12) -* magit-branch-and-checkout: Branch Commands. (line 67) -* magit-branch-checkout: Branch Commands. (line 74) -* magit-branch-configure: Branch Commands. (line 29) -* magit-branch-configure <1>: Branch Commands. (line 30) -* magit-branch-configure <2>: Branch Commands. (line 31) -* magit-branch-configure <3>: Branch Commands. (line 32) -* magit-branch-create: Branch Commands. (line 57) -* magit-branch-delete: Branch Commands. (line 147) -* magit-branch-or-checkout: Branch Commands. (line 257) -* magit-branch-orphan: Branch Commands. (line 252) -* magit-branch-rename: Branch Commands. (line 153) -* magit-branch-reset: Branch Commands. (line 131) -* magit-branch-shelve: Auxiliary Branch Commands. - (line 9) -* magit-branch-spinoff: Branch Commands. (line 97) -* magit-branch-spinout: Branch Commands. (line 125) -* magit-branch-unshelve: Auxiliary Branch Commands. - (line 20) -* magit-checkout: Branch Commands. (line 49) -* magit-cherry: Cherries. (line 17) -* magit-cherry-apply: Cherry Picking. (line 24) -* magit-cherry-copy: Cherry Picking. (line 17) -* magit-cherry-donate: Cherry Picking. (line 54) -* magit-cherry-harvest: Cherry Picking. (line 42) -* magit-cherry-pick: Cherry Picking. (line 8) -* magit-cherry-spinoff: Cherry Picking. (line 76) -* magit-cherry-spinout: Cherry Picking. (line 65) -* magit-clone: Cloning Repository. (line 20) -* magit-clone-bare: Cloning Repository. (line 41) -* magit-clone-mirror: Cloning Repository. (line 46) -* magit-clone-regular: Cloning Repository. (line 29) -* magit-clone-shallow: Cloning Repository. (line 34) -* magit-clone-shallow-exclude: Cloning Repository. (line 61) -* magit-clone-shallow-since: Cloning Repository. (line 54) -* magit-commit: Initiating a Commit. (line 8) -* magit-commit <1>: Minor Mode for Buffers Visiting Files. - (line 68) -* magit-commit-amend: Initiating a Commit. (line 19) -* magit-commit-augment: Initiating a Commit. (line 67) -* magit-commit-create: Initiating a Commit. (line 14) -* magit-commit-extend: Initiating a Commit. (line 23) -* magit-commit-fixup: Initiating a Commit. (line 43) -* magit-commit-instant-fixup: Initiating a Commit. (line 51) -* magit-commit-instant-squash: Initiating a Commit. (line 63) -* magit-commit-reword: Initiating a Commit. (line 33) -* magit-commit-squash: Initiating a Commit. (line 55) -* magit-copy-buffer-revision: Common Commands. (line 27) -* magit-copy-section-value: Common Commands. (line 10) -* magit-cycle-margin-style: Log Margin. (line 70) -* magit-debug-git-executable: Git Executable. (line 45) -* magit-debug-git-executable <1>: Debugging Tools. (line 36) -* magit-describe-section-briefly: Section Types and Values. - (line 13) -* magit-describe-section-briefly <1>: Matching Sections. (line 6) -* magit-diff: Diffing. (line 21) -* magit-diff <1>: Minor Mode for Buffers Visiting Files. - (line 75) -* magit-diff-buffer-file: Minor Mode for Buffers Visiting Files. - (line 86) -* magit-diff-default-context: Refreshing Diffs. (line 73) -* magit-diff-dwim: Diffing. (line 27) -* magit-diff-edit-hunk-commit: Commands Available in Diffs. - (line 25) -* magit-diff-flip-revs: Refreshing Diffs. (line 46) -* magit-diff-less-context: Refreshing Diffs. (line 65) -* magit-diff-more-context: Refreshing Diffs. (line 69) -* magit-diff-paths: Diffing. (line 61) -* magit-diff-range: Diffing. (line 31) -* magit-diff-refresh: Refreshing Diffs. (line 11) -* magit-diff-refresh <1>: Refreshing Diffs. (line 17) -* magit-diff-save-default-arguments: Refreshing Diffs. (line 29) -* magit-diff-set-default-arguments: Refreshing Diffs. (line 22) -* magit-diff-show-or-scroll-down: Log Buffer. (line 45) -* magit-diff-show-or-scroll-down <1>: Blaming. (line 92) -* magit-diff-show-or-scroll-up: Log Buffer. (line 35) -* magit-diff-show-or-scroll-up <1>: Blaming. (line 82) -* magit-diff-staged: Diffing. (line 51) -* magit-diff-switch-range-type: Refreshing Diffs. (line 41) -* magit-diff-toggle-file-filter: Refreshing Diffs. (line 51) -* magit-diff-toggle-refine-hunk: Refreshing Diffs. (line 37) -* magit-diff-trace-definition: Commands Available in Diffs. - (line 14) -* magit-diff-unstaged: Diffing. (line 57) -* magit-diff-visit-file: Visiting Files and Blobs from a Diff. - (line 8) -* magit-diff-visit-file-other-frame: Visiting Files and Blobs from a Diff. - (line 74) -* magit-diff-visit-file-other-window: Visiting Files and Blobs from a Diff. - (line 73) -* magit-diff-visit-file-worktree: Visiting Files and Blobs from a Diff. - (line 51) -* magit-diff-visit-worktree-file-other-frame: Visiting Files and Blobs from a Diff. - (line 76) -* magit-diff-visit-worktree-file-other-window: Visiting Files and Blobs from a Diff. - (line 75) -* magit-diff-while-committing: Refreshing Diffs. (line 81) -* magit-diff-while-committing <1>: Editing Commit Messages. - (line 58) -* magit-diff-working-tree: Diffing. (line 45) -* magit-discard: Applying. (line 40) -* magit-dispatch: Transient Commands. (line 18) -* magit-ediff: Ediffing. (line 21) -* magit-ediff-compare: Ediffing. (line 26) -* magit-ediff-dwim: Ediffing. (line 9) -* magit-ediff-resolve: Ediffing. (line 35) -* magit-ediff-show-commit: Ediffing. (line 65) -* magit-ediff-show-staged: Ediffing. (line 57) -* magit-ediff-show-stash: Ediffing. (line 69) -* magit-ediff-show-unstaged: Ediffing. (line 53) -* magit-ediff-show-working-tree: Ediffing. (line 61) -* magit-ediff-stage: Ediffing. (line 48) -* magit-edit-line-commit: Minor Mode for Buffers Visiting Files. - (line 136) -* magit-emacs-Q-command: Debugging Tools. (line 16) -* magit-fetch: Fetching. (line 9) -* magit-fetch-all: Fetching. (line 50) -* magit-fetch-branch: Fetching. (line 40) -* magit-fetch-from-pushremote: Fetching. (line 15) -* magit-fetch-from-upstream: Fetching. (line 23) -* magit-fetch-modules: Submodule Transient. (line 58) -* magit-fetch-other: Fetching. (line 36) -* magit-fetch-refspec: Fetching. (line 45) -* magit-file-checkout: Resetting. (line 44) -* magit-file-checkout <1>: Minor Mode for Buffers Visiting Files. - (line 165) -* magit-file-delete: Minor Mode for Buffers Visiting Files. - (line 157) -* magit-file-dispatch: Minor Mode for Buffers Visiting Files. - (line 54) -* magit-file-rename: Minor Mode for Buffers Visiting Files. - (line 153) -* magit-file-untrack: Minor Mode for Buffers Visiting Files. - (line 161) -* magit-find-file: General-Purpose Visit Commands. - (line 9) -* magit-find-file-other-frame: General-Purpose Visit Commands. - (line 21) -* magit-find-file-other-window: General-Purpose Visit Commands. - (line 15) -* magit-git-command: Running Git Manually. - (line 25) -* magit-git-command-topdir: Running Git Manually. - (line 17) -* magit-go-backward: Log Buffer. (line 21) -* magit-go-backward <1>: Refreshing Diffs. (line 91) -* magit-go-forward: Log Buffer. (line 25) -* magit-go-forward <1>: Refreshing Diffs. (line 95) -* magit-init: Creating Repository. (line 6) -* magit-jump-to-diffstat-or-diff: Commands Available in Diffs. - (line 45) -* magit-kill-this-buffer: Minor Mode for Buffers Visiting Blobs. - (line 20) -* magit-list-repositories: Repository List. (line 6) -* magit-list-submodules: Listing Submodules. (line 13) -* magit-list-submodules <1>: Submodule Transient. (line 54) -* magit-log: Logging. (line 29) -* magit-log <1>: Minor Mode for Buffers Visiting Files. - (line 96) -* magit-log-all: Logging. (line 60) -* magit-log-all-branches: Logging. (line 56) -* magit-log-branches: Logging. (line 52) -* magit-log-buffer-file: Minor Mode for Buffers Visiting Files. - (line 107) -* magit-log-bury-buffer: Log Buffer. (line 14) -* magit-log-current: Logging. (line 35) -* magit-log-double-commit-limit: Log Buffer. (line 61) -* magit-log-half-commit-limit: Log Buffer. (line 65) -* magit-log-head: Logging. (line 48) -* magit-log-move-to-parent: Log Buffer. (line 29) -* magit-log-other: Logging. (line 41) -* magit-log-refresh: Refreshing Logs. (line 11) -* magit-log-refresh <1>: Refreshing Logs. (line 17) -* magit-log-refresh <2>: Log Buffer. (line 6) -* magit-log-save-default-arguments: Refreshing Logs. (line 29) -* magit-log-select-pick: Select from Log. (line 20) -* magit-log-select-quit: Select from Log. (line 26) -* magit-log-set-default-arguments: Refreshing Logs. (line 22) -* magit-log-toggle-commit-limit: Log Buffer. (line 55) -* magit-log-trace-definition: Minor Mode for Buffers Visiting Files. - (line 114) -* magit-margin-settings: Log Margin. (line 57) -* magit-merge: Merging. (line 9) -* magit-merge <1>: Merging. (line 89) -* magit-merge-abort: Merging. (line 95) -* magit-merge-absorb: Merging. (line 45) -* magit-merge-editmsg: Merging. (line 31) -* magit-merge-into: Merging. (line 58) -* magit-merge-nocommit: Merging. (line 38) -* magit-merge-plain: Merging. (line 18) -* magit-merge-preview: Merging. (line 81) -* magit-merge-squash: Merging. (line 72) -* magit-mode-bury-buffer: Quitting Windows. (line 6) -* magit-notes: Notes. (line 8) -* magit-notes-edit: Notes. (line 14) -* magit-notes-merge: Notes. (line 38) -* magit-notes-merge-abort: Notes. (line 52) -* magit-notes-merge-commit: Notes. (line 47) -* magit-notes-prune: Notes. (line 30) -* magit-notes-remove: Notes. (line 22) -* magit-patch: Plain Patches. (line 6) -* magit-patch-apply: Plain Patches. (line 21) -* magit-patch-apply <1>: Maildir Patches. (line 25) -* magit-patch-create: Plain Patches. (line 12) -* magit-patch-save: Plain Patches. (line 28) -* magit-pop-revision-stack: Using the Revision Stack. - (line 6) -* magit-process: Viewing Git Output. (line 16) -* magit-process-kill: Viewing Git Output. (line 24) -* magit-pull: Pulling. (line 9) -* magit-pull-branch: Pulling. (line 30) -* magit-pull-from-pushremote: Pulling. (line 14) -* magit-pull-from-upstream: Pulling. (line 22) -* magit-push: Pushing. (line 9) -* magit-push-current: Pushing. (line 31) -* magit-push-current-to-pushremote: Pushing. (line 15) -* magit-push-current-to-upstream: Pushing. (line 23) -* magit-push-implicitly args: Pushing. (line 74) -* magit-push-matching: Pushing. (line 50) -* magit-push-other: Pushing. (line 36) -* magit-push-refspecs: Pushing. (line 41) -* magit-push-tag: Pushing. (line 66) -* magit-push-tags: Pushing. (line 58) -* magit-push-to-remote remote args: Pushing. (line 85) -* magit-rebase: Rebasing. (line 9) -* magit-rebase-abort: Rebasing. (line 123) -* magit-rebase-autosquash: Rebasing. (line 84) -* magit-rebase-branch: Rebasing. (line 44) -* magit-rebase-continue: Rebasing. (line 106) -* magit-rebase-edit: Rebasing. (line 118) -* magit-rebase-edit-commit: Rebasing. (line 89) -* magit-rebase-interactive: Rebasing. (line 80) -* magit-rebase-onto-pushremote: Rebasing. (line 28) -* magit-rebase-onto-upstream: Rebasing. (line 36) -* magit-rebase-remove-commit: Rebasing. (line 99) -* magit-rebase-reword-commit: Rebasing. (line 94) -* magit-rebase-skip: Rebasing. (line 113) -* magit-rebase-subset: Rebasing. (line 50) -* magit-reflog-current: Reflog. (line 11) -* magit-reflog-head: Reflog. (line 19) -* magit-reflog-other: Reflog. (line 15) -* magit-refresh: Automatic Refreshing of Magit Buffers. - (line 24) -* magit-refresh-all: Automatic Refreshing of Magit Buffers. - (line 33) -* magit-remote: Remote Commands. (line 13) -* magit-remote-add: Remote Commands. (line 50) -* magit-remote-configure: Remote Commands. (line 33) -* magit-remote-prune: Remote Commands. (line 69) -* magit-remote-prune-refspecs: Remote Commands. (line 74) -* magit-remote-remove: Remote Commands. (line 65) -* magit-remote-rename: Remote Commands. (line 55) -* magit-remote-set-url: Remote Commands. (line 60) -* magit-reset-hard: Resetting. (line 26) -* magit-reset-index: Staging and Unstaging. - (line 87) -* magit-reset-index <1>: Resetting. (line 31) -* magit-reset-mixed: Resetting. (line 15) -* magit-reset-quickly: Resetting. (line 8) -* magit-reset-soft: Resetting. (line 20) -* magit-reset-worktree: Resetting. (line 38) -* magit-reset-worktree <1>: Wip Modes. (line 66) -* magit-reverse: Applying. (line 44) -* magit-reverse-in-index: Staging and Unstaging. - (line 62) -* magit-revert: Reverting. (line 6) -* magit-revert-and-commit: Reverting. (line 15) -* magit-revert-no-commit: Reverting. (line 21) -* magit-run: Running Git Manually. - (line 12) -* magit-run-git-gui: Running Git Manually. - (line 66) -* magit-run-gitk: Running Git Manually. - (line 54) -* magit-run-gitk-all: Running Git Manually. - (line 58) -* magit-run-gitk-branches: Running Git Manually. - (line 62) -* magit-section-backward: Section Movement. (line 10) -* magit-section-backward-siblings: Section Movement. (line 20) -* magit-section-cycle: Section Visibility. (line 13) -* magit-section-cycle-diffs: Section Visibility. (line 17) -* magit-section-cycle-global: Section Visibility. (line 22) -* magit-section-forward: Section Movement. (line 16) -* magit-section-forward-siblings: Section Movement. (line 26) -* magit-section-hide: Section Visibility. (line 49) -* magit-section-hide-children: Section Visibility. (line 64) -* magit-section-show: Section Visibility. (line 45) -* magit-section-show-children: Section Visibility. (line 58) -* magit-section-show-headings: Section Visibility. (line 53) -* magit-section-show-level-1: Section Visibility. (line 26) -* magit-section-show-level-1-all: Section Visibility. (line 33) -* magit-section-show-level-2: Section Visibility. (line 27) -* magit-section-show-level-2-all: Section Visibility. (line 34) -* magit-section-show-level-3: Section Visibility. (line 28) -* magit-section-show-level-3-all: Section Visibility. (line 35) -* magit-section-show-level-4: Section Visibility. (line 29) -* magit-section-show-level-4-all: Section Visibility. (line 36) -* magit-section-toggle: Section Visibility. (line 9) -* magit-section-toggle-children: Section Visibility. (line 68) -* magit-section-up: Section Movement. (line 31) -* magit-sequence-abort: Cherry Picking. (line 98) -* magit-sequence-abort <1>: Reverting. (line 39) -* magit-sequence-continue: Cherry Picking. (line 90) -* magit-sequence-continue <1>: Reverting. (line 31) -* magit-sequence-skip: Cherry Picking. (line 94) -* magit-sequence-skip <1>: Reverting. (line 35) -* magit-shell-command: Running Git Manually. - (line 40) -* magit-shell-command-topdir: Running Git Manually. - (line 35) -* magit-show-commit: Diffing. (line 69) -* magit-show-commit <1>: Blaming. (line 78) -* magit-show-refs: References Buffer. (line 6) -* magit-show-refs-current: References Buffer. (line 26) -* magit-show-refs-head: References Buffer. (line 21) -* magit-show-refs-other: References Buffer. (line 32) -* magit-snapshot-both: Stashing. (line 40) -* magit-snapshot-index: Stashing. (line 47) -* magit-snapshot-worktree: Stashing. (line 52) -* magit-stage: Staging and Unstaging. - (line 28) -* magit-stage-file: Staging from File-Visiting Buffers. - (line 10) -* magit-stage-file <1>: Minor Mode for Buffers Visiting Files. - (line 59) -* magit-stage-modified: Staging and Unstaging. - (line 36) -* magit-stash: Stashing. (line 8) -* magit-stash-apply: Stashing. (line 59) -* magit-stash-both: Stashing. (line 14) -* magit-stash-branch: Stashing. (line 81) -* magit-stash-branch-here: Stashing. (line 86) -* magit-stash-clear: Stashing. (line 96) -* magit-stash-drop: Stashing. (line 72) -* magit-stash-format-patch: Stashing. (line 92) -* magit-stash-index: Stashing. (line 21) -* magit-stash-keep-index: Stashing. (line 33) -* magit-stash-list: Stashing. (line 100) -* magit-stash-pop: Stashing. (line 65) -* magit-stash-show: Diffing. (line 74) -* magit-stash-show <1>: Stashing. (line 77) -* magit-stash-worktree: Stashing. (line 26) -* magit-status: Status Buffer. (line 22) -* magit-submodule: Submodule Transient. (line 6) -* magit-submodule-add: Submodule Transient. (line 20) -* magit-submodule-fetch: Fetching. (line 54) -* magit-submodule-populate: Submodule Transient. (line 34) -* magit-submodule-register: Submodule Transient. (line 27) -* magit-submodule-synchronize: Submodule Transient. (line 44) -* magit-submodule-unpopulate: Submodule Transient. (line 50) -* magit-submodule-update: Submodule Transient. (line 39) -* magit-subtree: Subtree. (line 8) -* magit-subtree-add: Subtree. (line 25) -* magit-subtree-add-commit: Subtree. (line 30) -* magit-subtree-export: Subtree. (line 42) -* magit-subtree-import: Subtree. (line 13) -* magit-subtree-merge: Subtree. (line 34) -* magit-subtree-pull: Subtree. (line 38) -* magit-subtree-push: Subtree. (line 54) -* magit-subtree-split: Subtree. (line 59) -* magit-tag: Tagging. (line 8) -* magit-tag-create: Tagging. (line 14) -* magit-tag-delete: Tagging. (line 40) -* magit-tag-prune: Tagging. (line 47) -* magit-tag-release: Tagging. (line 19) -* magit-toggle-buffer-lock: Modes and Buffers. (line 17) -* magit-toggle-margin: Refreshing Logs. (line 37) -* magit-toggle-margin <1>: Log Margin. (line 66) -* magit-toggle-margin-details: Log Margin. (line 74) -* magit-toggle-verbose-refresh: Debugging Tools. (line 30) -* magit-unstage: Staging and Unstaging. - (line 43) -* magit-unstage-all: Staging and Unstaging. - (line 52) -* magit-unstage-file: Staging from File-Visiting Buffers. - (line 18) -* magit-unstage-file <1>: Minor Mode for Buffers Visiting Files. - (line 63) -* magit-version: Git Executable. (line 17) -* magit-version <1>: Debugging Tools. (line 10) -* magit-visit-ref: References Buffer. (line 181) -* magit-wip-commit: Wip Modes. (line 88) -* magit-wip-log: Wip Modes. (line 48) -* magit-wip-log-current: Wip Modes. (line 57) -* magit-worktree: Worktree. (line 8) -* magit-worktree-branch: Worktree. (line 17) -* magit-worktree-checkout: Worktree. (line 13) -* magit-worktree-delete: Worktree. (line 25) -* magit-worktree-move: Worktree. (line 21) -* magit-worktree-status: Worktree. (line 30) -* scroll-down: Commands Available in Diffs. - (line 60) -* scroll-up: Commands Available in Diffs. - (line 56) -* with-editor-cancel: Editing Commit Messages. - (line 22) -* with-editor-cancel <1>: Editing Rebase Sequences. - (line 11) -* with-editor-debug: Debugging Tools. (line 44) -* with-editor-finish: Editing Commit Messages. - (line 17) -* with-editor-finish <1>: Editing Rebase Sequences. - (line 6) - - -File: magit.info, Node: Function Index, Next: Variable Index, Prev: Command Index, Up: Top - -Appendix E Function Index -************************* - -[index] -* Menu: - -* bug-reference-mode: Commit Mode and Hooks. - (line 56) -* git-commit-check-style-conventions: Commit Message Conventions. - (line 40) -* git-commit-propertize-diff: Commit Mode and Hooks. - (line 47) -* git-commit-save-message: Commit Mode and Hooks. - (line 28) -* git-commit-setup-changelog-support: Commit Mode and Hooks. - (line 32) -* git-commit-turn-on-auto-fill: Commit Mode and Hooks. - (line 37) -* git-commit-turn-on-flyspell: Commit Mode and Hooks. - (line 42) -* ido-enter-magit-status: Status Buffer. (line 72) -* magit-add-section-hook: Section Hooks. (line 20) -* magit-after-save-refresh-status: Automatic Refreshing of Magit Buffers. - (line 58) -* magit-branch-or-checkout: Branch Commands. (line 257) -* magit-branch-orphan: Branch Commands. (line 252) -* magit-branch-shelve: Auxiliary Branch Commands. - (line 9) -* magit-branch-unshelve: Auxiliary Branch Commands. - (line 20) -* magit-builtin-completing-read: Support for Completion Frameworks. - (line 42) -* magit-call-git: Calling Git for Effect. - (line 28) -* magit-call-process: Calling Git for Effect. - (line 32) -* magit-cancel-section: Creating Sections. (line 71) -* magit-completing-read: Support for Completion Frameworks. - (line 60) -* magit-current-section: Section Selection. (line 6) -* magit-define-section-jumper: Creating Sections. (line 77) -* magit-diff-scope: Matching Sections. (line 118) -* magit-diff-type: Matching Sections. (line 95) -* magit-diff-visit-file-other-frame: Visiting Files and Blobs from a Diff. - (line 74) -* magit-diff-visit-file-other-window: Visiting Files and Blobs from a Diff. - (line 73) -* magit-diff-visit-worktree-file-other-frame: Visiting Files and Blobs from a Diff. - (line 76) -* magit-diff-visit-worktree-file-other-window: Visiting Files and Blobs from a Diff. - (line 75) -* magit-disable-section-inserter: Per-Repository Configuration. - (line 31) -* magit-display-buffer: Switching Buffers. (line 6) -* magit-display-buffer-fullcolumn-most-v1: Switching Buffers. (line 75) -* magit-display-buffer-fullframe-status-topleft-v1: Switching Buffers. - (line 65) -* magit-display-buffer-fullframe-status-v1: Switching Buffers. - (line 59) -* magit-display-buffer-same-window-except-diff-v1: Switching Buffers. - (line 53) -* magit-display-buffer-traditional: Switching Buffers. (line 45) -* magit-file-checkout: Minor Mode for Buffers Visiting Files. - (line 165) -* magit-file-delete: Minor Mode for Buffers Visiting Files. - (line 157) -* magit-file-rename: Minor Mode for Buffers Visiting Files. - (line 153) -* magit-file-untrack: Minor Mode for Buffers Visiting Files. - (line 161) -* magit-find-file: General-Purpose Visit Commands. - (line 9) -* magit-find-file-other-frame: General-Purpose Visit Commands. - (line 21) -* magit-find-file-other-window: General-Purpose Visit Commands. - (line 15) -* magit-generate-buffer-name-default-function: Naming Buffers. - (line 17) -* magit-get-section: Matching Sections. (line 16) -* magit-git: Calling Git for Effect. - (line 65) -* magit-git-exit-code: Getting a Value from Git. - (line 10) -* magit-git-failure: Getting a Value from Git. - (line 19) -* magit-git-false: Getting a Value from Git. - (line 29) -* magit-git-insert: Getting a Value from Git. - (line 34) -* magit-git-items: Getting a Value from Git. - (line 49) -* magit-git-lines: Getting a Value from Git. - (line 44) -* magit-git-str: Getting a Value from Git. - (line 72) -* magit-git-string: Getting a Value from Git. - (line 38) -* magit-git-success: Getting a Value from Git. - (line 14) -* magit-git-true: Getting a Value from Git. - (line 24) -* magit-git-wash: Calling Git for Effect. - (line 70) -* magit-hunk-set-window-start: Section Movement. (line 51) -* magit-ido-completing-read: Support for Completion Frameworks. - (line 48) -* magit-insert-am-sequence: Status Sections. (line 28) -* magit-insert-assumed-unchanged-files: Status Sections. (line 117) -* magit-insert-bisect-log: Status Sections. (line 46) -* magit-insert-bisect-output: Status Sections. (line 38) -* magit-insert-bisect-rest: Status Sections. (line 42) -* magit-insert-diff-filter-header: Status Header Sections. - (line 38) -* magit-insert-error-header: Status Header Sections. - (line 28) -* magit-insert-head-branch-header: Status Header Sections. - (line 42) -* magit-insert-heading: Creating Sections. (line 42) -* magit-insert-ignored-files: Status Sections. (line 100) -* magit-insert-local-branches: References Sections. (line 17) -* magit-insert-merge-log: Status Sections. (line 18) -* magit-insert-modules: Status Module Sections. - (line 12) -* magit-insert-modules-overview: Status Module Sections. - (line 33) -* magit-insert-modules-unpulled-from-pushremote: Status Module Sections. - (line 50) -* magit-insert-modules-unpulled-from-upstream: Status Module Sections. - (line 44) -* magit-insert-modules-unpushed-to-pushremote: Status Module Sections. - (line 62) -* magit-insert-modules-unpushed-to-upstream: Status Module Sections. - (line 56) -* magit-insert-push-branch-header: Status Header Sections. - (line 51) -* magit-insert-rebase-sequence: Status Sections. (line 23) -* magit-insert-recent-commits: Status Sections. (line 131) -* magit-insert-remote-branches: References Sections. (line 21) -* magit-insert-remote-header: Status Header Sections. - (line 67) -* magit-insert-repo-header: Status Header Sections. - (line 63) -* magit-insert-section: Creating Sections. (line 6) -* magit-insert-sequencer-sequence: Status Sections. (line 33) -* magit-insert-skip-worktree-files: Status Sections. (line 110) -* magit-insert-staged-changes: Status Sections. (line 63) -* magit-insert-stashes: Status Sections. (line 67) -* magit-insert-status-headers: Status Header Sections. - (line 12) -* magit-insert-submodules: Listing Submodules. (line 35) -* magit-insert-tags: References Sections. (line 25) -* magit-insert-tags-header: Status Header Sections. - (line 56) -* magit-insert-tracked-files: Status Sections. (line 96) -* magit-insert-unpulled-cherries: Status Sections. (line 142) -* magit-insert-unpulled-from-pushremote: Status Sections. (line 79) -* magit-insert-unpulled-from-upstream: Status Sections. (line 74) -* magit-insert-unpulled-or-recent-commits: Status Sections. (line 124) -* magit-insert-unpushed-cherries: Status Sections. (line 149) -* magit-insert-unpushed-to-pushremote: Status Sections. (line 89) -* magit-insert-unpushed-to-upstream: Status Sections. (line 84) -* magit-insert-unstaged-changes: Status Sections. (line 59) -* magit-insert-untracked-files: Status Sections. (line 50) -* magit-insert-upstream-branch-header: Status Header Sections. - (line 46) -* magit-insert-user-header: Status Header Sections. - (line 75) -* magit-list-repositories: Repository List. (line 6) -* magit-list-submodules: Listing Submodules. (line 13) -* magit-log-maybe-show-more-commits: Section Movement. (line 66) -* magit-log-maybe-update-blob-buffer: Section Movement. (line 82) -* magit-log-maybe-update-revision-buffer: Section Movement. (line 74) -* magit-maybe-set-dedicated: Switching Buffers. (line 100) -* magit-mode-display-buffer: Refreshing Buffers. (line 33) -* magit-mode-quit-window: Quitting Windows. (line 34) -* magit-mode-setup: Refreshing Buffers. (line 17) -* magit-push-implicitly: Pushing. (line 74) -* magit-push-to-remote: Pushing. (line 85) -* magit-region-sections: Section Selection. (line 10) -* magit-region-values: Section Selection. (line 37) -* magit-repolist-column-branch: Repository List. (line 44) -* magit-repolist-column-branches: Repository List. (line 53) -* magit-repolist-column-flag: Repository List. (line 61) -* magit-repolist-column-ident: Repository List. (line 30) -* magit-repolist-column-path: Repository List. (line 35) -* magit-repolist-column-stashes: Repository List. (line 57) -* magit-repolist-column-unpulled-from-pushremote: Repository List. - (line 81) -* magit-repolist-column-unpulled-from-upstream: Repository List. - (line 76) -* magit-repolist-column-unpushed-to-pushremote: Repository List. - (line 91) -* magit-repolist-column-unpushed-to-upstream: Repository List. - (line 86) -* magit-repolist-column-upstream: Repository List. (line 48) -* magit-repolist-column-version: Repository List. (line 39) -* magit-restore-window-configuration: Quitting Windows. (line 23) -* magit-run-git: Calling Git for Effect. - (line 36) -* magit-run-git-async: Calling Git for Effect. - (line 80) -* magit-run-git-with-editor: Calling Git for Effect. - (line 93) -* magit-run-git-with-input: Calling Git for Effect. - (line 40) -* magit-run-git-with-logfile: Calling Git for Effect. - (line 56) -* magit-save-window-configuration: Switching Buffers. (line 89) -* magit-section-case: Matching Sections. (line 71) -* magit-section-hide: Section Visibility. (line 49) -* magit-section-hide-children: Section Visibility. (line 64) -* magit-section-ident: Matching Sections. (line 11) -* magit-section-match: Matching Sections. (line 21) -* magit-section-set-window-start: Section Movement. (line 59) -* magit-section-show: Section Visibility. (line 45) -* magit-section-show-children: Section Visibility. (line 58) -* magit-section-show-headings: Section Visibility. (line 53) -* magit-section-toggle-children: Section Visibility. (line 68) -* magit-section-value-if: Matching Sections. (line 61) -* magit-start-git: Calling Git for Effect. - (line 105) -* magit-start-process: Calling Git for Effect. - (line 124) -* magit-stashes-maybe-update-stash-buffer: Section Movement. (line 106) -* magit-status-maybe-update-blob-buffer: Section Movement. (line 100) -* magit-status-maybe-update-revision-buffer: Section Movement. - (line 88) -* magit-status-maybe-update-stash-buffer: Section Movement. (line 94) -* magit-wip-log: Wip Modes. (line 48) -* magit-wip-log-current: Wip Modes. (line 57) -* with-editor-usage-message: Commit Mode and Hooks. - (line 60) - - -File: magit.info, Node: Variable Index, Prev: Function Index, Up: Top - -Appendix F Variable Index -************************* - -[index] -* Menu: - -* auto-revert-buffer-list-filter: Automatic Reverting of File-Visiting Buffers. - (line 81) -* auto-revert-interval: Automatic Reverting of File-Visiting Buffers. - (line 76) -* auto-revert-mode: Automatic Reverting of File-Visiting Buffers. - (line 62) -* auto-revert-stop-on-user-input: Automatic Reverting of File-Visiting Buffers. - (line 71) -* auto-revert-use-notify: Automatic Reverting of File-Visiting Buffers. - (line 49) -* auto-revert-verbose: Automatic Reverting of File-Visiting Buffers. - (line 103) -* branch.autoSetupMerge: Branch Git Variables. - (line 81) -* branch.autoSetupRebase: Branch Git Variables. - (line 98) -* branch.NAME.description: Branch Git Variables. - (line 48) -* branch.NAME.merge: Branch Git Variables. - (line 10) -* branch.NAME.pushRemote: Branch Git Variables. - (line 34) -* branch.NAME.rebase: Branch Git Variables. - (line 22) -* branch.NAME.remote: Branch Git Variables. - (line 16) -* core.notesRef: Notes. (line 60) -* git-commit-fill-column: Commit Message Conventions. - (line 19) -* git-commit-finish-query-functions: Commit Message Conventions. - (line 24) -* git-commit-known-pseudo-headers: Commit Pseudo Headers. - (line 9) -* git-commit-major-mode: Commit Mode and Hooks. - (line 12) -* git-commit-setup-hook: Commit Mode and Hooks. - (line 22) -* git-commit-setup-hook <1>: Commit Mode and Hooks. - (line 64) -* git-commit-style-convention-checks: Commit Message Conventions. - (line 46) -* git-commit-summary-max-length: Commit Message Conventions. - (line 13) -* git-rebase-auto-advance: Editing Rebase Sequences. - (line 99) -* git-rebase-confirm-cancel: Editing Rebase Sequences. - (line 107) -* git-rebase-show-instructions: Editing Rebase Sequences. - (line 103) -* global-auto-revert-mode: Automatic Reverting of File-Visiting Buffers. - (line 22) -* global-magit-file-mode: Minor Mode for Buffers Visiting Files. - (line 13) -* magit-auto-revert-immediately: Automatic Reverting of File-Visiting Buffers. - (line 32) -* magit-auto-revert-mode: Automatic Reverting of File-Visiting Buffers. - (line 17) -* magit-auto-revert-tracked-only: Automatic Reverting of File-Visiting Buffers. - (line 55) -* magit-bisect-show-graph: Bisecting. (line 55) -* magit-blame-disable-modes: Blaming. (line 168) -* magit-blame-echo-style: Blaming. (line 151) -* magit-blame-goto-chunk-hook: Blaming. (line 174) -* magit-blame-read-only: Blaming. (line 163) -* magit-blame-styles: Blaming. (line 146) -* magit-blame-time-format: Blaming. (line 158) -* magit-branch-adjust-remote-upstream-alist: Branch Commands. (line 210) -* magit-branch-direct-configure: Branch Commands. (line 20) -* magit-branch-prefer-remote-upstream: Branch Commands. (line 165) -* magit-branch-read-upstream-first: Branch Commands. (line 159) -* magit-buffer-name-format: Naming Buffers. (line 27) -* magit-bury-buffer-function: Quitting Windows. (line 14) -* magit-cherry-margin: Cherries. (line 22) -* magit-clone-always-transient: Cloning Repository. (line 12) -* magit-clone-default-directory: Cloning Repository. (line 90) -* magit-clone-name-alist: Cloning Repository. (line 103) -* magit-clone-set-remote-head: Cloning Repository. (line 68) -* magit-clone-set-remote.pushDefault: Cloning Repository. (line 78) -* magit-clone-url-format: Cloning Repository. (line 124) -* magit-commit-ask-to-stage: Initiating a Commit. (line 75) -* magit-commit-extend-override-date: Initiating a Commit. (line 80) -* magit-commit-reword-override-date: Initiating a Commit. (line 84) -* magit-commit-squash-confirm: Initiating a Commit. (line 88) -* magit-completing-read-function: Support for Completion Frameworks. - (line 27) -* magit-diff-adjust-tab-width: Diff Options. (line 21) -* magit-diff-buffer-file-locked: Minor Mode for Buffers Visiting Files. - (line 91) -* magit-diff-hide-trailing-cr-characters: Diff Options. (line 90) -* magit-diff-highlight-hunk-region-functions: Diff Options. (line 94) -* magit-diff-highlight-indentation: Diff Options. (line 75) -* magit-diff-highlight-trailing: Diff Options. (line 70) -* magit-diff-paint-whitespace: Diff Options. (line 43) -* magit-diff-paint-whitespace-lines: Diff Options. (line 60) -* magit-diff-refine-hunk: Diff Options. (line 6) -* magit-diff-refine-ignore-whitespace: Diff Options. (line 16) -* magit-diff-unmarked-lines-keep-foreground: Diff Options. (line 120) -* magit-diff-visit-previous-blob: Visiting Files and Blobs from a Diff. - (line 39) -* magit-direct-use-buffer-arguments: Transient Arguments and Buffer Variables. - (line 73) -* magit-display-buffer-function: Switching Buffers. (line 27) -* magit-display-buffer-noselect: Switching Buffers. (line 18) -* magit-dwim-selection: Completion and Confirmation. - (line 42) -* magit-ediff-dwim-show-on-hunks: Ediffing. (line 73) -* magit-ediff-quit-hook: Ediffing. (line 88) -* magit-ediff-show-stash-with-index: Ediffing. (line 81) -* magit-file-mode-map: Minor Mode for Buffers Visiting Files. - (line 20) -* magit-generate-buffer-name-function: Naming Buffers. (line 6) -* magit-git-debug: Viewing Git Output. (line 28) -* magit-git-debug <1>: Getting a Value from Git. - (line 64) -* magit-git-executable: Git Executable. (line 39) -* magit-git-global-arguments: Global Git Arguments. - (line 6) -* magit-keep-region-overlay: The Selection. (line 52) -* magit-list-refs-sortby: Additional Completion Options. - (line 6) -* magit-log-auto-more: Log Buffer. (line 69) -* magit-log-buffer-file-locked: Minor Mode for Buffers Visiting Files. - (line 118) -* magit-log-margin: Log Margin. (line 12) -* magit-log-margin-show-committer-date: Log Margin. (line 49) -* magit-log-section-commit-count: Status Sections. (line 136) -* magit-log-select-margin: Select from Log. (line 30) -* magit-log-show-refname-after-summary: Log Buffer. (line 75) -* magit-log-trace-definition-function: Commands Available in Diffs. - (line 18) -* magit-module-sections-hook: Status Module Sections. - (line 20) -* magit-module-sections-nested: Status Module Sections. - (line 24) -* magit-no-confirm: Action Confirmation. (line 18) -* magit-pop-revision-stack-format: Using the Revision Stack. - (line 35) -* magit-post-display-buffer-hook: Switching Buffers. (line 95) -* magit-pre-display-buffer-hook: Switching Buffers. (line 84) -* magit-prefer-remote-upstream: Branch Git Variables. - (line 126) -* magit-prefix-use-buffer-arguments: Transient Arguments and Buffer Variables. - (line 64) -* magit-process-raise-error: Calling Git for Effect. - (line 151) -* magit-pull-or-fetch: Fetching. (line 59) -* magit-reflog-margin: Reflog. (line 23) -* magit-refresh-args: Refreshing Buffers. (line 55) -* magit-refresh-buffer-hook: Automatic Refreshing of Magit Buffers. - (line 42) -* magit-refresh-function: Refreshing Buffers. (line 49) -* magit-refresh-status-buffer: Automatic Refreshing of Magit Buffers. - (line 48) -* magit-refs-filter-alist: References Buffer. (line 159) -* magit-refs-focus-column-width: References Buffer. (line 82) -* magit-refs-margin: References Buffer. (line 97) -* magit-refs-margin-for-tags: References Buffer. (line 125) -* magit-refs-pad-commit-counts: References Buffer. (line 49) -* magit-refs-primary-column-width: References Buffer. (line 69) -* magit-refs-sections-hook: References Sections. (line 13) -* magit-refs-show-commit-count: References Buffer. (line 37) -* magit-refs-show-remote-prefix: References Buffer. (line 62) -* magit-remote-add-set-remote.pushDefault: Remote Commands. (line 92) -* magit-remote-direct-configure: Remote Commands. (line 21) -* magit-repolist-columns: Repository List. (line 14) -* magit-repository-directories: Status Buffer. (line 58) -* magit-revision-filter-files-on-follow: Revision Buffer. (line 64) -* magit-revision-insert-related-refs: Revision Buffer. (line 6) -* magit-revision-show-gravatars: Revision Buffer. (line 19) -* magit-revision-use-hash-sections: Revision Buffer. (line 36) -* magit-root-section: Matching Sections. (line 87) -* magit-save-repository-buffers: Automatic Saving of File-Visiting Buffers. - (line 13) -* magit-section-cache-visibility: Section Visibility. (line 95) -* magit-section-initial-visibility-alist: Section Visibility. (line 78) -* magit-section-movement-hook: Section Movement. (line 46) -* magit-section-set-visibility-hook: Section Visibility. (line 106) -* magit-section-show-child-count: Section Options. (line 9) -* magit-section-visibility-indicator: Section Visibility. (line 124) -* magit-shell-command-verbose-prompt: Running Git Manually. - (line 47) -* magit-stashes-margin: Stashing. (line 104) -* magit-status-headers-hook: Status Header Sections. - (line 18) -* magit-status-margin: Status Options. (line 10) -* magit-status-refresh-hook: Status Options. (line 6) -* magit-status-sections-hook: Status Sections. (line 10) -* magit-submodule-list-columns: Listing Submodules. (line 21) -* magit-this-process: Calling Git for Effect. - (line 146) -* magit-uniquify-buffer-names: Naming Buffers. (line 74) -* magit-unstage-committed: Staging and Unstaging. - (line 56) -* magit-update-other-window-delay: Section Movement. (line 112) -* magit-visit-ref-behavior: References Buffer. (line 192) -* magit-wip-after-apply-mode: Legacy Wip Modes. (line 19) -* magit-wip-after-apply-mode-lighter: Legacy Wip Modes. (line 59) -* magit-wip-after-save-local-mode-lighter: Legacy Wip Modes. (line 55) -* magit-wip-after-save-mode: Legacy Wip Modes. (line 13) -* magit-wip-before-change-mode: Legacy Wip Modes. (line 33) -* magit-wip-before-change-mode-lighter: Legacy Wip Modes. (line 63) -* magit-wip-initial-backup-mode: Legacy Wip Modes. (line 38) -* magit-wip-initial-backup-mode-lighter: Legacy Wip Modes. (line 67) -* magit-wip-merge-branch: Wip Graph. (line 6) -* magit-wip-mode: Wip Modes. (line 30) -* magit-wip-mode-lighter: Wip Modes. (line 104) -* magit-wip-namespace: Wip Modes. (line 96) -* notes.displayRef: Notes. (line 65) -* pull.rebase: Branch Git Variables. - (line 57) -* remote.NAME.fetch: Remote Git Variables. - (line 15) -* remote.NAME.push: Remote Git Variables. - (line 26) -* remote.NAME.pushurl: Remote Git Variables. - (line 20) -* remote.NAME.tagOpts: Remote Git Variables. - (line 31) -* remote.NAME.url: Remote Git Variables. - (line 10) -* remote.pushDefault: Branch Git Variables. - (line 71) - diff --git a/elpa/nord-theme-20200108.833/nord-theme-autoloads.el b/elpa/nord-theme-20200108.833/nord-theme-autoloads.el deleted file mode 100644 index a3c98170..00000000 --- a/elpa/nord-theme-20200108.833/nord-theme-autoloads.el +++ /dev/null @@ -1,24 +0,0 @@ -;;; nord-theme-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "nord-theme" "nord-theme.el" (0 0 0 0)) -;;; Generated autoloads from nord-theme.el - -(when (and (boundp 'custom-theme-load-path) load-file-name) (add-to-list 'custom-theme-load-path (file-name-as-directory (file-name-directory load-file-name)))) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "nord-theme" '("nord"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; nord-theme-autoloads.el ends here diff --git a/elpa/nord-theme-20200108.833/nord-theme-pkg.el b/elpa/nord-theme-20200108.833/nord-theme-pkg.el deleted file mode 100644 index a0ac5342..00000000 --- a/elpa/nord-theme-20200108.833/nord-theme-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "nord-theme" "20200108.833" "An arctic, north-bluish clean and elegant theme" '((emacs "24")) :commit "d828752e270978a56bde19986c98b1bbe8f51386" :authors '(("Arctic Ice Studio" . "development@arcticicestudio.com")) :maintainer '("Arctic Ice Studio" . "development@arcticicestudio.com") :url "https://github.com/arcticicestudio/nord-emacs") diff --git a/elpa/nord-theme-20200108.833/nord-theme.el b/elpa/nord-theme-20200108.833/nord-theme.el deleted file mode 100644 index a1749238..00000000 --- a/elpa/nord-theme-20200108.833/nord-theme.el +++ /dev/null @@ -1,723 +0,0 @@ -;;; nord-theme.el --- An arctic, north-bluish clean and elegant theme - -;; Copyright (C) 2016-present Arctic Ice Studio (https://www.arcticicestudio.com) -;; Copyright (C) 2016-present Sven Greb (https://www.svengreb.de) - -;; Title: Nord Theme -;; Project: nord-emacs -;; Version: 0.5.0 -;; Package-Version: 20200108.833 -;; URL: https://github.com/arcticicestudio/nord-emacs -;; Author: Arctic Ice Studio -;; Package-Requires: ((emacs "24")) -;; License: MIT - -;;; Commentary: - -;; Nord is a 16 colorspace theme build to run in GUI- and terminal -;; mode with support for many third-party syntax- and UI packages. - -;;; References: -;; Awesome Emacs -;; https://github.com/emacs-tw/awesome-emacs -;; GNU ELPA -;; https://elpa.gnu.org -;; GNU Emacs -;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Custom-Themes.html -;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Creating-Custom-Themes.html -;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Faces.html -;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Standard-Faces.html -;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Face-Customization.html -;; https://www.gnu.org/software/emacs/manual/html_node/elisp/Face-Attributes.html -;; https://www.gnu.org/software/emacs/manual/html_node/elisp/Faces-for-Font-Lock.html -;; https://www.gnu.org/software/emacs/manual/html_node/elisp/Display-Feature-Testing.html -;; marmalade repo -;; https://marmalade-repo.org -;; MELPA -;; https://melpa.org -;; https://stable.melpa.org - -;;; Code: - -(unless (>= emacs-major-version 24) - (error "Nord theme requires Emacs 24 or later!")) - -(deftheme nord "An arctic, north-bluish clean and elegant theme") - -(defgroup nord nil - "Nord theme customizations. - The theme has to be reloaded after changing anything in this group." - :group 'faces) - -(defcustom nord-comment-brightness 10 - "Allows to define a custom comment color brightness with percentage adjustments from 0% - 20%. - As of version 0.4.0, this variable is obsolete/deprecated and has no effect anymore and will be removed in version 1.0.0! - The comment color brightness has been increased by 10% by default. - Please see https://github.com/arcticicestudio/nord-emacs/issues/73 for more details." - :type 'integer - :group 'nord) - -(make-obsolete-variable - 'nord-comment-brightness - "The custom color brightness feature has been deprecated and will be removed in version 1.0.0! - The comment color brightness has been increased by 10% by default. - Please see https://github.com/arcticicestudio/nord-emacs/issues/73 for more details." - "0.4.0") - -(defcustom nord-region-highlight nil - "Allows to set a region highlight style based on the Nord components. - Valid styles are - - 'snowstorm' - Uses 'nord0' as foreground- and 'nord4' as background color - - 'frost' - Uses 'nord0' as foreground- and 'nord8' as background color" - :type 'string - :group 'nord) - -(defcustom nord-uniform-mode-lines nil - "Enables uniform activate- and inactive mode lines using 'nord3' as background." - :type 'boolean - :group 'nord) - -(setq nord-theme--brightened-comments '("#4c566a" "#4e586d" "#505b70" "#525d73" "#556076" "#576279" "#59647c" "#5b677f" "#5d6982" "#5f6c85" "#616e88" "#63718b" "#66738e" "#687591" "#6a7894" "#6d7a96" "#6f7d98" "#72809a" "#75829c" "#78859e" "#7b88a1")) - -(defun nord-theme--brightened-comment-color (percent) - "Returns the brightened comment color for the given percent. - The value must be greater or equal to 0 and less or equal to 20, otherwise the default 'nord3' color is used. - As of version 0.4.0, this function is obsolete/deprecated and has no effect anymore and will be removed in version 1.0.0! - The comment color brightness has been increased by 10% by default. - Please see https://github.com/arcticicestudio/nord-emacs/issues/73 for more details." - (nth 10 nord-theme--brightened-comments)) - -(make-obsolete - 'nord-theme--brightened-comment-color - "The custom color brightness feature has been deprecated and will be removed in version 1.0.0!\ - The comment color brightness has been increased by 10% by default.\ - Please see https://github.com/arcticicestudio/nord-emacs/issues/73 for more details." - "0.4.0") - -(defun nord-display-truecolor-or-graphic-p () - "Returns whether the display can display nord colors" - (or (= (display-color-cells) 16777216) (display-graphic-p))) - -;;;; Color Constants -(let ((class '((class color) (min-colors 89))) - (nord0 (if (nord-display-truecolor-or-graphic-p) "#2E3440" nil)) - (nord1 (if (nord-display-truecolor-or-graphic-p) "#3B4252" "black")) - (nord2 (if (nord-display-truecolor-or-graphic-p) "#434C5E" "#434C5E")) - (nord3 (if (nord-display-truecolor-or-graphic-p) "#4C566A" "brightblack")) - (nord4 (if (nord-display-truecolor-or-graphic-p) "#D8DEE9" "#D8DEE9")) - (nord5 (if (nord-display-truecolor-or-graphic-p) "#E5E9F0" "white")) - (nord6 (if (nord-display-truecolor-or-graphic-p) "#ECEFF4" "brightwhite")) - (nord7 (if (nord-display-truecolor-or-graphic-p) "#8FBCBB" "cyan")) - (nord8 (if (nord-display-truecolor-or-graphic-p) "#88C0D0" "brightcyan")) - (nord9 (if (nord-display-truecolor-or-graphic-p) "#81A1C1" "blue")) - (nord10 (if (nord-display-truecolor-or-graphic-p) "#5E81AC" "brightblue")) - (nord11 (if (nord-display-truecolor-or-graphic-p) "#BF616A" "red")) - (nord12 (if (nord-display-truecolor-or-graphic-p) "#D08770" "brightyellow")) - (nord13 (if (nord-display-truecolor-or-graphic-p) "#EBCB8B" "yellow")) - (nord14 (if (nord-display-truecolor-or-graphic-p) "#A3BE8C" "green")) - (nord15 (if (nord-display-truecolor-or-graphic-p) "#B48EAD" "magenta")) - (nord-annotation (if (nord-display-truecolor-or-graphic-p) "#D08770" "brightyellow")) - (nord-attribute (if (nord-display-truecolor-or-graphic-p) "#8FBCBB" "cyan")) - (nord-class (if (nord-display-truecolor-or-graphic-p) "#8FBCBB" "cyan")) - (nord-comment (if (nord-display-truecolor-or-graphic-p) (nord-theme--brightened-comment-color nord-comment-brightness) "brightblack")) - (nord-escape (if (nord-display-truecolor-or-graphic-p) "#D08770" "brightyellow")) - (nord-method (if (nord-display-truecolor-or-graphic-p) "#88C0D0" "brightcyan")) - (nord-keyword (if (nord-display-truecolor-or-graphic-p) "#81A1C1" "blue")) - (nord-numeric (if (nord-display-truecolor-or-graphic-p) "#B48EAD" "magenta")) - (nord-operator (if (nord-display-truecolor-or-graphic-p) "#81A1C1" "blue")) - (nord-preprocessor (if (nord-display-truecolor-or-graphic-p) "#5E81AC" "brightblue")) - (nord-punctuation (if (nord-display-truecolor-or-graphic-p) "#D8DEE9" "#D8DEE9")) - (nord-regexp (if (nord-display-truecolor-or-graphic-p) "#EBCB8B" "yellow")) - (nord-string (if (nord-display-truecolor-or-graphic-p) "#A3BE8C" "green")) - (nord-tag (if (nord-display-truecolor-or-graphic-p) "#81A1C1" "blue")) - (nord-variable (if (nord-display-truecolor-or-graphic-p) "#D8DEE9" "#D8DEE9")) - (nord-region-highlight-foreground (if (or - (string= nord-region-highlight "frost") - (string= nord-region-highlight "snowstorm")) "#2E3440" nil)) - (nord-region-highlight-background (if - (string= nord-region-highlight "frost") "#88C0D0" - (if (string= nord-region-highlight "snowstorm") "#D8DEE9" "#434C5E"))) - (nord-uniform-mode-lines-background (if nord-uniform-mode-lines "#4C566A" "#3B4252"))) - -;;;; +------------+ -;;;; + Core Faces + -;;;; +------------+ - (custom-theme-set-faces - 'nord - ;; +--- Base ---+ - `(bold ((,class (:weight bold)))) - `(bold-italic ((,class (:weight bold :slant italic)))) - `(default ((,class (:foreground ,nord4 :background ,nord0)))) - `(error ((,class (:foreground ,nord11 :weight bold)))) - `(escape-glyph ((,class (:foreground ,nord12)))) - `(font-lock-builtin-face ((,class (:foreground ,nord9)))) - `(font-lock-comment-face ((,class (:foreground ,nord-comment)))) - `(font-lock-comment-delimiter-face ((,class (:foreground ,nord-comment)))) - `(font-lock-constant-face ((,class (:foreground ,nord9)))) - `(font-lock-doc-face ((,class (:foreground ,nord-comment)))) - `(font-lock-function-name-face ((,class (:foreground ,nord8)))) - `(font-lock-keyword-face ((,class (:foreground ,nord9)))) - `(font-lock-negation-char-face ((,class (:foreground ,nord9)))) - `(font-lock-preprocessor-face ((,class (:foreground ,nord10 :weight bold)))) - `(font-lock-reference-face ((,class (:foreground ,nord9)))) - `(font-lock-regexp-grouping-backslash ((,class (:foreground ,nord13)))) - `(font-lock-regexp-grouping-construct ((,class (:foreground ,nord13)))) - `(font-lock-string-face ((,class (:foreground ,nord14)))) - `(font-lock-type-face ((,class (:foreground ,nord7)))) - `(font-lock-variable-name-face ((,class (:foreground ,nord4)))) - `(font-lock-warning-face ((,class (:foreground ,nord13)))) - `(italic ((,class (:slant italic)))) - `(shadow ((,class (:foreground ,nord3)))) - `(underline ((,class (:underline t)))) - `(warning ((,class (:foreground ,nord13 :weight bold)))) - - ;; +--- Syntax ---+ - ;; > C - `(c-annotation-face ((,class (:foreground ,nord-annotation)))) - - ;; > diff - `(diff-added ((,class (:foreground ,nord14)))) - `(diff-changed ((,class (:foreground ,nord13)))) - `(diff-context ((,class (:inherit default)))) - `(diff-file-header ((,class (:foreground ,nord8)))) - `(diff-function ((,class (:foreground ,nord7)))) - `(diff-header ((,class (:foreground ,nord9 :weight bold)))) - `(diff-hunk-header ((,class (:foreground ,nord9 :background ,nord0)))) - `(diff-indicator-added ((,class (:foreground ,nord14)))) - `(diff-indicator-changed ((,class (:foreground ,nord13)))) - `(diff-indicator-removed ((,class (:foreground ,nord11)))) - `(diff-nonexistent ((,class (:foreground ,nord11)))) - `(diff-refine-added ((,class (:foreground ,nord14)))) - `(diff-refine-changed ((,class (:foreground ,nord13)))) - `(diff-refine-removed ((,class (:foreground ,nord11)))) - `(diff-removed ((,class (:foreground ,nord11)))) - - ;; +--- UI ---+ - `(border ((,class (:foreground ,nord4)))) - `(buffer-menu-buffer ((,class (:foreground ,nord4 :weight bold)))) - `(button ((,class (:background ,nord0 :foreground ,nord8 :box (:line-width 2 :color ,nord4 :style sunken-button))))) - `(completions-annotations ((,class (:foreground ,nord9)))) - `(completions-common-part ((,class (:foreground ,nord8 :weight bold)))) - `(completions-first-difference ((,class (:foreground ,nord11)))) - `(custom-button ((,class (:background ,nord0 :foreground ,nord8 :box (:line-width 2 :color ,nord4 :style sunken-button))))) - `(custom-button-mouse ((,class (:background ,nord4 :foreground ,nord0 :box (:line-width 2 :color ,nord4 :style sunken-button))))) - `(custom-button-pressed ((,class (:background ,nord6 :foreground ,nord0 :box (:line-width 2 :color ,nord4 :style sunken-button))))) - `(custom-button-pressed-unraised ((,class (:background ,nord4 :foreground ,nord0 :box (:line-width 2 :color ,nord4 :style sunken-button))))) - `(custom-button-unraised ((,class (:background ,nord0 :foreground ,nord8 :box (:line-width 2 :color ,nord4 :style sunken-button))))) - `(custom-changed ((,class (:foreground ,nord13)))) - `(custom-comment ((,class (:foreground ,nord-comment)))) - `(custom-comment-tag ((,class (:foreground ,nord7)))) - `(custom-documentation ((,class (:foreground ,nord4)))) - `(custom-group-tag ((,class (:foreground ,nord8 :weight bold)))) - `(custom-group-tag-1 ((,class (:foreground ,nord8 :weight bold)))) - `(custom-invalid ((,class (:foreground ,nord11)))) - `(custom-modified ((,class (:foreground ,nord13)))) - `(custom-rogue ((,class (:foreground ,nord12 :background ,nord2)))) - `(custom-saved ((,class (:foreground ,nord14)))) - `(custom-set ((,class (:foreground ,nord8)))) - `(custom-state ((,class (:foreground ,nord14)))) - `(custom-themed ((,class (:foreground ,nord8 :background ,nord2)))) - `(cursor ((,class (:background ,nord4)))) - `(fringe ((,class (:foreground ,nord4 :background ,nord0)))) - `(file-name-shadow ((,class (:inherit shadow)))) - `(header-line ((,class (:foreground ,nord4 :background ,nord2)))) - `(help-argument-name ((,class (:foreground ,nord8)))) - `(highlight ((,class (:foreground ,nord8 :background ,nord2)))) - `(hl-line ((,class (:background ,nord1)))) - `(info-menu-star ((,class (:foreground ,nord9)))) - `(isearch ((,class (:foreground ,nord0 :background ,nord8)))) - `(isearch-fail ((,class (:foreground ,nord11)))) - `(link ((,class (:underline t)))) - `(link-visited ((,class (:underline t)))) - `(linum ((,class (:foreground ,nord3 :background ,nord0)))) - `(linum-relative-current-face ((,class (:foreground ,nord3 :background ,nord0)))) - `(match ((,class (:inherit isearch)))) - `(message-cited-text ((,class (:foreground ,nord4)))) - `(message-header-cc ((,class (:foreground ,nord9)))) - `(message-header-name ((,class (:foreground ,nord7)))) - `(message-header-newsgroup ((,class (:foreground ,nord14)))) - `(message-header-other ((,class (:foreground ,nord4)))) - `(message-header-subject ((,class (:foreground ,nord8)))) - `(message-header-to ((,class (:foreground ,nord9)))) - `(message-header-xheader ((,class (:foreground ,nord13)))) - `(message-mml ((,class (:foreground ,nord10)))) - `(message-separator ((,class (:inherit shadow)))) - `(minibuffer-prompt ((,class (:foreground ,nord8 :weight bold)))) - `(mm-command-output ((,class (:foreground ,nord8)))) - `(mode-line ((,class (:foreground ,nord8 :background ,nord3)))) - `(mode-line-buffer-id ((,class (:weight bold)))) - `(mode-line-highlight ((,class (:inherit highlight)))) - `(mode-line-inactive ((,class (:foreground ,nord4 :background ,nord-uniform-mode-lines-background)))) - `(next-error ((,class (:inherit error)))) - `(nobreak-space ((,class (:foreground ,nord3)))) - `(outline-1 ((,class (:foreground ,nord8 :weight bold)))) - `(outline-2 ((,class (:inherit outline-1)))) - `(outline-3 ((,class (:inherit outline-1)))) - `(outline-4 ((,class (:inherit outline-1)))) - `(outline-5 ((,class (:inherit outline-1)))) - `(outline-6 ((,class (:inherit outline-1)))) - `(outline-7 ((,class (:inherit outline-1)))) - `(outline-8 ((,class (:inherit outline-1)))) - `(package-description ((,class (:foreground ,nord4)))) - `(package-help-section-name ((,class (:foreground ,nord8 :weight bold)))) - `(package-name ((,class (:foreground ,nord8)))) - `(package-status-available ((,class (:foreground ,nord7)))) - `(package-status-avail-obso ((,class (:foreground ,nord7 :slant italic)))) - `(package-status-built-in ((,class (:foreground ,nord9)))) - `(package-status-dependency ((,class (:foreground ,nord8 :slant italic)))) - `(package-status-disabled ((,class (:foreground ,nord3)))) - `(package-status-external ((,class (:foreground ,nord12 :slant italic)))) - `(package-status-held ((,class (:foreground ,nord4 :weight bold)))) - `(package-status-new ((,class (:foreground ,nord14)))) - `(package-status-incompat ((,class (:foreground ,nord11)))) - `(package-status-installed ((,class (:foreground ,nord7 :weight bold)))) - `(package-status-unsigned ((,class (:underline ,nord13)))) - `(query-replace ((,class (:foreground ,nord8 :background ,nord2)))) - `(region ((,class (:foreground ,nord-region-highlight-foreground :background ,nord-region-highlight-background)))) - `(scroll-bar ((,class (:background ,nord3)))) - `(secondary-selection ((,class (:background ,nord2)))) - - ;; `show-paren-match-face` and `show-paren-mismatch-face` are deprecated since Emacs version 22.1 and were - ;; removed in Emacs 25. - ;; https://github.com/arcticicestudio/nord-emacs/issues/75 - ;; http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=c430f7e23fc2c22f251ace4254e37dea1452dfc3 - ;; https://github.com/emacs-mirror/emacs/commit/c430f7e23fc2c22f251ace4254e37dea1452dfc3 - `(show-paren-match-face ((,class (:foreground ,nord0 :background ,nord8)))) - `(show-paren-mismatch-face ((,class (:background ,nord11)))) - - `(show-paren-match ((,class (:foreground ,nord0 :background ,nord8)))) - `(show-paren-mismatch ((,class (:background ,nord11)))) - `(success ((,class (:foreground ,nord14)))) - `(term ((,class (:foreground ,nord4 :background ,nord0)))) - `(term-color-black ((,class (:foreground ,nord1 :background ,nord1)))) - `(term-color-white ((,class (:foreground ,nord5 :background ,nord5)))) - `(term-color-cyan ((,class (:foreground ,nord7 :background ,nord7)))) - `(term-color-blue ((,class (:foreground ,nord8 :background ,nord8)))) - `(term-color-red ((,class (:foreground ,nord11 :background ,nord11)))) - `(term-color-yellow ((,class (:foreground ,nord13 :background ,nord13)))) - `(term-color-green ((,class (:foreground ,nord14 :background ,nord14)))) - `(term-color-magenta ((,class (:foreground ,nord15 :background ,nord15)))) - `(tool-bar ((,class (:foreground ,nord4 :background ,nord3)))) - `(tooltip ((,class (:foreground ,nord0 :background ,nord4)))) - `(trailing-whitespace ((,class (:foreground ,nord3)))) - `(tty-menu-disabled-face ((,class (:foreground ,nord1)))) - `(tty-menu-enabled-face ((,class (:background ,nord2 foreground ,nord4)))) - `(tty-menu-selected-face ((,class (:foreground ,nord8 :underline t)))) - `(undo-tree-visualizer-current-face ((,class (:foreground ,nord8)))) - `(undo-tree-visualizer-default-face ((,class (:foreground ,nord4)))) - `(undo-tree-visualizer-unmodified-face ((,class (:foreground ,nord4)))) - `(undo-tree-visualizer-register-face ((,class (:foreground ,nord9)))) - `(vc-conflict-state ((,class (:foreground ,nord12)))) - `(vc-edited-state ((,class (:foreground ,nord13)))) - `(vc-locally-added-state ((,class (:underline ,nord14)))) - `(vc-locked-state ((,class (:foreground ,nord10)))) - `(vc-missing-state ((,class (:foreground ,nord11)))) - `(vc-needs-update-state ((,class (:foreground ,nord12)))) - `(vc-removed-state ((,class (:foreground ,nord11)))) - `(vc-state-base ((,class (:foreground ,nord4)))) - `(vc-up-to-date-state ((,class (:foreground ,nord8)))) - `(vertical-border ((,class (:foreground ,nord2)))) - `(which-func ((,class (:foreground ,nord8)))) - `(whitespace-big-indent ((,class (:foreground ,nord3 :background ,nord0)))) - `(whitespace-empty ((,class (:foreground ,nord3 :background ,nord0)))) - `(whitespace-hspace ((,class (:foreground ,nord3 :background ,nord0)))) - `(whitespace-indentation ((,class (:foreground ,nord3 :background ,nord0)))) - `(whitespace-line ((,class (:background ,nord0)))) - `(whitespace-newline ((,class (:foreground ,nord3 :background ,nord0)))) - `(whitespace-space ((,class (:foreground ,nord3 :background ,nord0)))) - `(whitespace-space-after-tab ((,class (:foreground ,nord3 :background ,nord0)))) - `(whitespace-space-before-tab ((,class (:foreground ,nord3 :background ,nord0)))) - `(whitespace-tab ((,class (:foreground ,nord3 :background ,nord0)))) - `(whitespace-trailing ((,class (:inherit trailing-whitespace)))) - `(widget-button-pressed ((,class (:foreground ,nord9 :background ,nord1)))) - `(widget-documentation ((,class (:foreground ,nord4)))) - `(widget-field ((,class (:background ,nord2 :foreground ,nord4)))) - `(widget-single-line-field ((,class (:background ,nord2 :foreground ,nord4)))) - `(window-divider ((,class (:background ,nord3)))) - `(window-divider-first-pixel ((,class (:background ,nord3)))) - `(window-divider-last-pixel ((,class (:background ,nord3)))) - - ;;;; +-----------------+ - ;;;; + Package Support + - ;;;; +-----------------+ - ;; +--- Syntax ---+ - ;; > Auctex - `(font-latex-bold-face ((,class (:inherit bold)))) - `(font-latex-italic-face ((,class (:inherit italic)))) - `(font-latex-math-face ((,class (:foreground ,nord8)))) - `(font-latex-sectioning-0-face ((,class (:foreground ,nord8 :weight bold)))) - `(font-latex-sectioning-1-face ((,class (:inherit font-latex-sectioning-0-face)))) - `(font-latex-sectioning-2-face ((,class (:inherit font-latex-sectioning-0-face)))) - `(font-latex-sectioning-3-face ((,class (:inherit font-latex-sectioning-0-face)))) - `(font-latex-sectioning-4-face ((,class (:inherit font-latex-sectioning-0-face)))) - `(font-latex-sectioning-5-face ((,class (:inherit font-latex-sectioning-0-face)))) - `(font-latex-script-char-face ((,class (:inherit font-lock-warning-face)))) - `(font-latex-string-face ((,class (:inherit font-lock-string-face)))) - `(font-latex-warning-face ((,class (:inherit font-lock-warning-face)))) - - ;; > Elixir - `(elixir-attribute-face ((,class (:foreground ,nord-annotation)))) - `(elixir-atom-face ((,class (:foreground ,nord4 :weight bold)))) - - ;; > Enhanced Ruby - `(enh-ruby-heredoc-delimiter-face ((,class (:foreground ,nord14)))) - `(enh-ruby-op-face ((,class (:foreground ,nord9)))) - `(enh-ruby-regexp-delimiter-face ((,class (:foreground ,nord13)))) - `(enh-ruby-regexp-face ((,class (:foreground ,nord13)))) - `(enh-ruby-string-delimiter-face ((,class (:foreground ,nord14)))) - `(erm-syn-errline ((,class (:foreground ,nord11 :underline t)))) - `(erm-syn-warnline ((,class (:foreground ,nord13 :underline t)))) - - ;; > Java Development Environment for Emacs - `(jdee-db-active-breakpoint-face ((,class (:background ,nord2 :weight bold)))) - `(jdee-bug-breakpoint-cursor ((,class (:background ,nord2)))) - `(jdee-db-requested-breakpoint-face ((,class (:foreground ,nord13 :background ,nord2 :weight bold)))) - `(jdee-db-spec-breakpoint-face ((,class (:foreground ,nord14 :background ,nord2 :weight bold)))) - `(jdee-font-lock-api-face ((,class (:foreground ,nord4)))) - `(jdee-font-lock-code-face ((,class (:slant italic)))) - `(jdee-font-lock-constant-face ((,class (:foreground ,nord-keyword)))) - `(jdee-font-lock-constructor-face ((,class (:foreground ,nord-method)))) - `(jdee-font-lock-doc-tag-face ((,class (:foreground ,nord7)))) - `(jdee-font-lock-link-face ((,class (:underline t)))) - `(jdee-font-lock-modifier-face ((,class (:foreground ,nord-keyword)))) - `(jdee-font-lock-number-face ((,class (:foreground ,nord-numeric)))) - `(jdee-font-lock-operator-fac ((,class (:foreground ,nord-operator)))) - `(jdee-font-lock-package-face ((,class (:foreground ,nord-class)))) - `(jdee-font-lock-pre-face ((,class (:foreground ,nord-comment :slant italic)))) - `(jdee-font-lock-private-face ((,class (:foreground ,nord-keyword)))) - `(jdee-font-lock-public-face ((,class (:foreground ,nord-keyword)))) - `(jdee-font-lock-variable-face ((,class (:foreground ,nord-variable)))) - - ;; > JavaScript 2 - `(js2-function-call ((,class (:foreground ,nord8)))) - `(js2-private-function-call ((,class (:foreground ,nord8)))) - `(js2-jsdoc-html-tag-delimiter ((,class (:foreground ,nord6)))) - `(js2-jsdoc-html-tag-name ((,class (:foreground ,nord9)))) - `(js2-external-variable ((,class (:foreground ,nord4)))) - `(js2-function-param ((,class (:foreground ,nord4)))) - `(js2-jsdoc-value ((,class (:foreground ,nord-comment)))) - `(js2-jsdoc-tag ((,class (:foreground ,nord7)))) - `(js2-jsdoc-type ((,class (:foreground ,nord7)))) - `(js2-private-member ((,class (:foreground ,nord4)))) - `(js2-object-property ((,class (:foreground ,nord4)))) - `(js2-error ((,class (:foreground ,nord11)))) - `(js2-warning ((,class (:foreground ,nord13)))) - `(js2-instance-member ((,class (:foreground ,nord4)))) - - ;; > JavaScript 3 - `(js3-error-face ((,class (:foreground ,nord11)))) - `(js3-external-variable-face ((,class (:foreground ,nord4)))) - `(js3-function-param-face ((,class (:foreground ,nord4)))) - `(js3-instance-member-face ((,class (:foreground ,nord4)))) - `(js3-jsdoc-html-tag-delimiter-face ((,class (:foreground ,nord6)))) - `(js3-jsdoc-html-tag-name-face ((,class (:foreground ,nord9)))) - `(js3-jsdoc-tag-face ((,class (:foreground ,nord9)))) - `(js3-jsdoc-type-face ((,class (:foreground ,nord7)))) - `(js3-jsdoc-value-face ((,class (:foreground ,nord4)))) - `(js3-magic-paren-face ((,class (:inherit show-paren-match-face)))) - `(js3-private-function-call-face ((,class (:foreground ,nord8)))) - `(js3-private-member-face ((,class (:foreground ,nord4)))) - `(js3-warning-face ((,class (:foreground ,nord13)))) - - ;; > Markdown - `(markdown-blockquote-face ((,class (:foreground ,nord-comment)))) - `(markdown-bold-face ((,class (:inherit bold)))) - `(markdown-header-face-1 ((,class (:foreground ,nord8)))) - `(markdown-header-face-2 ((,class (:foreground ,nord8)))) - `(markdown-header-face-3 ((,class (:foreground ,nord8)))) - `(markdown-header-face-4 ((,class (:foreground ,nord8)))) - `(markdown-header-face-5 ((,class (:foreground ,nord8)))) - `(markdown-header-face-6 ((,class (:foreground ,nord8)))) - `(markdown-inline-code-face ((,class (:foreground ,nord7)))) - `(markdown-italic-face ((,class (:inherit italic)))) - `(markdown-link-face ((,class (:foreground ,nord8)))) - `(markdown-markup-face ((,class (:foreground ,nord9)))) - `(markdown-reference-face ((,class (:inherit markdown-link-face)))) - `(markdown-url-face ((,class (:foreground ,nord4 :underline t)))) - - ;; > Rainbow Delimeters - `(rainbow-delimiters-depth-1-face ((,class :foreground ,nord7))) - `(rainbow-delimiters-depth-2-face ((,class :foreground ,nord8))) - `(rainbow-delimiters-depth-3-face ((,class :foreground ,nord9))) - `(rainbow-delimiters-depth-4-face ((,class :foreground ,nord10))) - `(rainbow-delimiters-depth-5-face ((,class :foreground ,nord12))) - `(rainbow-delimiters-depth-6-face ((,class :foreground ,nord13))) - `(rainbow-delimiters-depth-7-face ((,class :foreground ,nord14))) - `(rainbow-delimiters-depth-8-face ((,class :foreground ,nord15))) - `(rainbow-delimiters-unmatched-face ((,class :foreground ,nord11))) - - ;; > Web Mode - `(web-mode-attr-tag-custom-face ((,class (:foreground ,nord-attribute)))) - `(web-mode-builtin-face ((,class (:foreground ,nord-keyword)))) - `(web-mode-comment-face ((,class (:foreground ,nord-comment)))) - `(web-mode-comment-keyword-face ((,class (:foreground ,nord-comment)))) - `(web-mode-constant-face ((,class (:foreground ,nord-variable)))) - `(web-mode-css-at-rule-face ((,class (:foreground ,nord-annotation)))) - `(web-mode-css-function-face ((,class (:foreground ,nord-method)))) - `(web-mode-css-property-name-face ((,class (:foreground ,nord-keyword)))) - `(web-mode-css-pseudo-class-face ((,class (:foreground ,nord-class)))) - `(web-mode-css-selector-face ((,class (:foreground ,nord-keyword)))) - `(web-mode-css-string-face ((,class (:foreground ,nord-string)))) - `(web-mode-doctype-face ((,class (:foreground ,nord-preprocessor)))) - `(web-mode-function-call-face ((,class (:foreground ,nord-method)))) - `(web-mode-function-name-face ((,class (:foreground ,nord-method)))) - `(web-mode-html-attr-name-face ((,class (:foreground ,nord-attribute)))) - `(web-mode-html-attr-equal-face ((,class (:foreground ,nord-punctuation)))) - `(web-mode-html-attr-value-face ((,class (:foreground ,nord-string)))) - `(web-mode-html-entity-face ((,class (:foreground ,nord-keyword)))) - `(web-mode-html-tag-bracket-face ((,class (:foreground ,nord-punctuation)))) - `(web-mode-html-tag-custom-face ((,class (:foreground ,nord-tag)))) - `(web-mode-html-tag-face ((,class (:foreground ,nord-tag)))) - `(web-mode-html-tag-namespaced-face ((,class (:foreground ,nord-keyword)))) - `(web-mode-json-key-face ((,class (:foreground ,nord-class)))) - `(web-mode-json-string-face ((,class (:foreground ,nord-string)))) - `(web-mode-keyword-face ((,class (:foreground ,nord-keyword)))) - `(web-mode-preprocessor-face ((,class (:foreground ,nord-preprocessor)))) - `(web-mode-string-face ((,class (:foreground ,nord-string)))) - `(web-mode-symbol-face ((,class (:foreground ,nord-variable)))) - `(web-mode-type-face ((,class (:foreground ,nord-class)))) - `(web-mode-warning-face ((,class (:inherit ,font-lock-warning-face)))) - `(web-mode-variable-name-face ((,class (:foreground ,nord-variable)))) - - ;; +--- UI ---+ - ;; > Anzu - `(anzu-mode-line ((,class (:foreground, nord8)))) - `(anzu-mode-line-no-match ((,class (:foreground, nord11)))) - - ;; > Avy - `(avy-lead-face ((,class (:background ,nord11 :foreground ,nord5)))) - `(avy-lead-face-0 ((,class (:background ,nord10 :foreground ,nord5)))) - `(avy-lead-face-1 ((,class (:background ,nord3 :foreground ,nord5)))) - `(avy-lead-face-2 ((,class (:background ,nord15 :foreground ,nord5)))) - - ;; > Company - `(company-echo-common ((,class (:foreground ,nord0 :background ,nord4)))) - `(company-preview ((,class (:foreground ,nord4 :background ,nord10)))) - `(company-preview-common ((,class (:foreground ,nord0 :background ,nord8)))) - `(company-preview-search ((,class (:foreground ,nord0 :background ,nord8)))) - `(company-scrollbar-bg ((,class (:foreground ,nord1 :background ,nord1)))) - `(company-scrollbar-fg ((,class (:foreground ,nord2 :background ,nord2)))) - `(company-template-field ((,class (:foreground ,nord0 :background ,nord7)))) - `(company-tooltip ((,class (:foreground ,nord4 :background ,nord2)))) - `(company-tooltip-annotation ((,class (:foreground ,nord12)))) - `(company-tooltip-annotation-selection ((,class (:foreground ,nord12 :weight bold)))) - `(company-tooltip-common ((,class (:foreground ,nord8)))) - `(company-tooltip-common-selection ((,class (:foreground ,nord8 :background ,nord3)))) - `(company-tooltip-mouse ((,class (:inherit highlight)))) - `(company-tooltip-selection ((,class (:background ,nord3 :weight bold)))) - - ;; > diff-hl - `(diff-hl-change ((,class (:background ,nord13)))) - `(diff-hl-insert ((,class (:background ,nord14)))) - `(diff-hl-delete ((,class (:background ,nord11)))) - - ;; > Evil - `(evil-ex-info ((,class (:foreground ,nord8)))) - `(evil-ex-substitute-replacement ((,class (:foreground ,nord9)))) - `(evil-ex-substitute-matches ((,class (:inherit isearch)))) - - ;; > Flycheck - `(flycheck-error ((,class (:underline (:style wave :color ,nord11))))) - `(flycheck-fringe-error ((,class (:foreground ,nord11 :weight bold)))) - `(flycheck-fringe-info ((,class (:foreground ,nord8 :weight bold)))) - `(flycheck-fringe-warning ((,class (:foreground ,nord13 :weight bold)))) - `(flycheck-info ((,class (:underline (:style wave :color ,nord8))))) - `(flycheck-warning ((,class (:underline (:style wave :color ,nord13))))) - - ;; > Git Gutter - `(git-gutter:modified ((,class (:foreground ,nord13)))) - `(git-gutter:added ((,class (:foreground ,nord14)))) - `(git-gutter:deleted ((,class (:foreground ,nord11)))) - - ;; > Git Gutter Plus - `(git-gutter+-modified ((,class (:foreground ,nord13)))) - `(git-gutter+-added ((,class (:foreground ,nord14)))) - `(git-gutter+-deleted ((,class (:foreground ,nord11)))) - - ;; > Helm - `(helm-bookmark-addressbook ((,class (:foreground ,nord7)))) - `(helm-bookmark-directory ((,class (:foreground ,nord9)))) - `(helm-bookmark-file ((,class (:foreground ,nord8)))) - `(helm-bookmark-gnus ((,class (:foreground ,nord10)))) - `(helm-bookmark-info ((,class (:foreground ,nord14)))) - `(helm-bookmark-man ((,class (:foreground ,nord4)))) - `(helm-bookmark-w3m ((,class (:foreground ,nord9)))) - `(helm-buffer-directory ((,class (:foreground ,nord9)))) - `(helm-buffer-file ((,class (:foreground ,nord8)))) - `(helm-buffer-not-saved ((,class (:foreground ,nord13)))) - `(helm-buffer-process ((,class (:foreground ,nord10)))) - `(helm-candidate-number ((,class (:foreground ,nord4 :weight bold)))) - `(helm-candidate-number-suspended ((,class (:foreground ,nord4)))) - `(helm-ff-directory ((,class (:foreground ,nord9 :weight bold)))) - `(helm-ff-dirs ((,class (:foreground ,nord9)))) - `(helm-ff-dotted-director ((,class (:foreground ,nord9 :underline t)))) - `(helm-ff-dotted-symlink-director ((,class (:foreground ,nord7 :weight bold)))) - `(helm-ff-executable ((,class (:foreground ,nord8)))) - `(helm-ff-file ((,class (:foreground ,nord4)))) - `(helm-ff-invalid-symlink ((,class (:foreground ,nord11 :weight bold)))) - `(helm-ff-prefix ((,class (:foreground ,nord0 :background ,nord9)))) - `(helm-ff-symlink ((,class (:foreground ,nord7)))) - `(helm-grep-cmd-line ((,class (:foreground ,nord4 :background ,nord0)))) - `(helm-grep-file ((,class (:foreground ,nord8)))) - `(helm-grep-finish ((,class (:foreground ,nord5)))) - `(helm-grep-lineno ((,class (:foreground ,nord4)))) - `(helm-grep-match ((,class (:inherit isearch)))) - `(helm-grep-running ((,class (:foreground ,nord8)))) - `(helm-header ((,class (:foreground ,nord9 :background ,nord2)))) - `(helm-header-line-left-margin ((,class (:foreground ,nord9 :background ,nord2)))) - `(helm-history-deleted ((,class (:foreground ,nord11)))) - `(helm-history-remote ((,class (:foreground ,nord4)))) - `(helm-lisp-completion-info ((,class (:foreground ,nord4 :weight bold)))) - `(helm-lisp-show-completion ((,class (:inherit isearch)))) - `(helm-locate-finish ((,class (:foreground ,nord14)))) - `(helm-match ((,class (:foreground ,nord8)))) - `(helm-match-item ((,class (:inherit isearch)))) - `(helm-moccur-buffer ((,class (:foreground ,nord8)))) - `(helm-resume-need-update ((,class (:foreground ,nord0 :background ,nord13)))) - `(helm-selection ((,class (:inherit highlight)))) - `(helm-selection-line ((,class (:background ,nord2)))) - `(helm-source-header ((,class (:height 1.44 :foreground ,nord8 :background ,nord2)))) - `(helm-swoop-line-number-face ((,class (:foreground ,nord4 :background ,nord0)))) - `(helm-swoop-target-word-face ((,class (:foreground ,nord0 :background ,nord7)))) - `(helm-swoop-target-line-face ((,class (:background ,nord13 :foreground ,nord3)))) - `(helm-swoop-target-line-block-face ((,class (:background ,nord13 :foreground ,nord3)))) - `(helm-separator ((,class (:background ,nord2)))) - `(helm-visible-mark ((,class (:background ,nord2)))) - - ;; > Magit - `(magit-branch ((,class (:foreground ,nord7 :weight bold)))) - `(magit-diff-context-highlight ((,class (:background ,nord2)))) - `(magit-diff-file-header ((,class (:foreground ,nord8 :box (:color ,nord8))))) - `(magit-diffstat-added ((,class (:foreground ,nord14)))) - `(magit-diffstat-removed ((,class (:foreground ,nord11)))) - `(magit-hash ((,class (:foreground ,nord8)))) - `(magit-hunk-heading ((,class (:foreground ,nord9)))) - `(magit-hunk-heading-highlight ((,class (:foreground ,nord9 :background ,nord2)))) - `(magit-item-highlight ((,class (:foreground ,nord8 :background ,nord2)))) - `(magit-log-author ((,class (:foreground ,nord7)))) - `(magit-process-ng ((,class (:foreground ,nord13 :weight bold)))) - `(magit-process-ok ((,class (:foreground ,nord14 :weight bold)))) - `(magit-section-heading ((,class (:foreground ,nord7 :weight bold)))) - `(magit-section-highlight ((,class (:background ,nord2)))) - - ;; > MU4E - `(mu4e-header-marks-face ((,class (:foreground ,nord9)))) - `(mu4e-title-face ((,class (:foreground ,nord8)))) - `(mu4e-header-key-face ((,class (:foreground ,nord8)))) - `(mu4e-highlight-face ((,class (:highlight)))) - `(mu4e-flagged-face ((,class (:foreground ,nord13)))) - `(mu4e-unread-face ((,class (:foreground ,nord13 :weight bold)))) - `(mu4e-link-face ((,class (:underline t)))) - - ;; > Powerline - `(powerline-active1 ((,class (:foreground ,nord4 :background ,nord1)))) - `(powerline-active2 ((,class (:foreground ,nord4 :background ,nord3)))) - `(powerline-inactive1 ((,class (:background ,nord2)))) - `(powerline-inactive2 ((,class (:background ,nord2)))) - - ;; > Powerline Evil - `(powerline-evil-base-face ((,class (:foreground ,nord4)))) - `(powerline-evil-normal-face ((,class (:background ,nord8)))) - `(powerline-evil-insert-face ((,class (:foreground ,nord0 :background ,nord4)))) - `(powerline-evil-visual-face ((,class (:foreground ,nord0 :background ,nord7)))) - `(powerline-evil-replace-face ((,class (:foreground ,nord0 :background ,nord9)))) - - ;; > NeoTree - `(neo-banner-face ((,class (:foreground ,nord10)))) - `(neo-dir-link-face ((,class (:foreground ,nord9)))) - `(neo-expand-btn-face ((,class (:foreground ,nord6 :bold t)))) - `(neo-file-link-face ((,class (:foreground ,nord4)))) - `(neo-root-dir-face ((,class (:foreground ,nord7 :weight bold)))) - `(neo-vc-added-face ((,class (:foreground ,nord14)))) - `(neo-vc-conflict-face ((,class (:foreground ,nord11)))) - `(neo-vc-default-face ((,class (:foreground ,nord4)))) - `(neo-vc-edited-face ((,class (:foreground ,nord13)))) - `(neo-vc-ignored-face ((,class (:foreground ,nord3)))) - `(neo-vc-missing-face ((,class (:foreground ,nord12)))) - `(neo-vc-needs-merge-face ((,class (:background ,nord12 :foreground ,nord4)))) - `(neo-vc-needs-update-face ((,class (:background ,nord10 :foreground ,nord4)))) - `(neo-vc-removed-face ((,class (:foreground ,nord11 :strike-through nil)))) - `(neo-vc-up-to-date-face ((,class (:foreground ,nord4)))) - `(neo-vc-user-face ((,class (:foreground ,nord4)))) - - ;; > Cider - `(cider-result-overlay-face ((t (:background unspecified)))) - - ;; > Org - `(org-level-1 ((,class (:foreground ,nord7 :weight extra-bold)))) - `(org-level-2 ((,class (:foreground ,nord8 :weight bold)))) - `(org-level-3 ((,class (:foreground ,nord9 :weight semi-bold)))) - `(org-level-4 ((,class (:foreground ,nord10 :weight normal)))) - `(org-level-5 ((,class (:inherit org-level-4)))) - `(org-level-6 ((,class (:inherit org-level-4)))) - `(org-level-7 ((,class (:inherit org-level-4)))) - `(org-level-8 ((,class (:inherit org-level-4)))) - `(org-agenda-structure ((,class (:foreground ,nord9)))) - `(org-agenda-date ((,class (:foreground ,nord8 :underline nil)))) - `(org-agenda-done ((,class (:foreground ,nord14)))) - `(org-agenda-dimmed-todo-face ((,class (:background ,nord13)))) - `(org-block ((,class (:foreground ,nord4)))) - `(org-block-background ((,class (:background ,nord0)))) - `(org-block-begin-line ((,class (:foreground ,nord7)))) - `(org-block-end-line ((,class (:foreground ,nord7)))) - `(org-checkbox ((,class (:foreground ,nord9)))) - `(org-checkbox-statistics-done ((,class (:foreground ,nord14)))) - `(org-checkbox-statistics-todo ((,class (:foreground ,nord13)))) - `(org-code ((,class (:foreground ,nord7)))) - `(org-column ((,class (:background ,nord2)))) - `(org-column-title ((,class (:inherit org-column :weight bold :underline t)))) - `(org-date ((,class (:foreground ,nord8)))) - `(org-document-info ((,class (:foreground ,nord4)))) - `(org-document-info-keyword ((,class (:foreground ,nord3 :weight bold)))) - `(org-document-title ((,class (:foreground ,nord8 :weight bold)))) - `(org-done ((,class (:foreground ,nord14 :weight bold)))) - `(org-ellipsis ((,class (:foreground ,nord3)))) - `(org-footnote ((,class (:foreground ,nord8)))) - `(org-formula ((,class (:foreground ,nord9)))) - `(org-hide ((,class (:foreground ,nord0 :background ,nord0)))) - `(org-link ((,class (:underline t)))) - `(org-scheduled ((,class (:foreground ,nord14)))) - `(org-scheduled-previously ((,class (:foreground ,nord13)))) - `(org-scheduled-today ((,class (:foreground ,nord8)))) - `(org-special-keyword ((,class (:foreground ,nord9)))) - `(org-table ((,class (:foreground ,nord9)))) - `(org-todo ((,class (:foreground ,nord13 :weight bold)))) - `(org-upcoming-deadline ((,class (:foreground ,nord12)))) - `(org-warning ((,class (:foreground ,nord13 :weight bold)))) - `(font-latex-bold-face ((,class (:inherit bold)))) - `(font-latex-italic-face ((,class (:slant italic)))) - `(font-latex-string-face ((,class (:foreground ,nord14)))) - `(font-latex-match-reference-keywords ((,class (:foreground ,nord9)))) - `(font-latex-match-variable-keywords ((,class (:foreground ,nord4)))) - `(ido-only-match ((,class (:foreground ,nord8)))) - `(org-sexp-date ((,class (:foreground ,nord7)))) - `(ido-first-match ((,class (:foreground ,nord8 :weight bold)))) - `(ido-subdir ((,class (:foreground ,nord9)))) - `(org-quote ((,class (:inherit org-block :slant italic)))) - `(org-verse ((,class (:inherit org-block :slant italic)))) - `(org-agenda-date-weekend ((,class (:foreground ,nord9)))) - `(org-agenda-date-today ((,class (:foreground ,nord8 :weight bold)))) - `(org-agenda-done ((,class (:foreground ,nord14)))) - `(org-verbatim ((,class (:foreground ,nord7)))) - - ;; > ivy-mode - `(ivy-current-match ((,class (:inherit region)))) - `(ivy-minibuffer-match-face-1 ((,class (:inherit default)))) - `(ivy-minibuffer-match-face-2 ((,class (:background ,nord7 :foreground ,nord0)))) - `(ivy-minibuffer-match-face-3 ((,class (:background ,nord8 :foreground ,nord0)))) - `(ivy-minibuffer-match-face-4 ((,class (:background ,nord9 :foreground ,nord0)))) - `(ivy-remote ((,class (:foreground ,nord14)))))) - -;;;###autoload -(when (and (boundp 'custom-theme-load-path) load-file-name) - (add-to-list 'custom-theme-load-path - (file-name-as-directory (file-name-directory load-file-name)))) - -(provide-theme 'nord) - -;; Local Variables: -;; no-byte-compile: t -;; indent-tabs-mode: nil -;; End: - -;;; nord-theme.el ends here diff --git a/elpa/ob-dart-20170106.1624/ob-dart-autoloads.el b/elpa/ob-dart-20170106.1624/ob-dart-autoloads.el deleted file mode 100644 index a7ade136..00000000 --- a/elpa/ob-dart-20170106.1624/ob-dart-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; ob-dart-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "ob-dart" "ob-dart.el" (0 0 0 0)) -;;; Generated autoloads from ob-dart.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-dart" '("org-babel-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; ob-dart-autoloads.el ends here diff --git a/elpa/ob-dart-20170106.1624/ob-dart-pkg.el b/elpa/ob-dart-20170106.1624/ob-dart-pkg.el deleted file mode 100644 index 354f129e..00000000 --- a/elpa/ob-dart-20170106.1624/ob-dart-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "ob-dart" "20170106.1624" "org-babel functions for Dart evaluation" 'nil :commit "04d63b922a5469506560ca0c00678e57131e0269" :keywords '("literate programming" "reproducible research" "emacs" "org" "babel" "dart") :authors '(("Milan Zimmermann")) :maintainer '("Milan Zimmermann") :url "http://github.org/mzimmerm/ob-dart") diff --git a/elpa/ob-dart-20170106.1624/ob-dart.el b/elpa/ob-dart-20170106.1624/ob-dart.el deleted file mode 100644 index cc285f16..00000000 --- a/elpa/ob-dart-20170106.1624/ob-dart.el +++ /dev/null @@ -1,251 +0,0 @@ -;;; ob-dart.el --- org-babel functions for Dart evaluation - -;; Copyright (C) 2016 Free Software Foundation, Inc. - -;; Author: Milan Zimmermann -;; Keywords: literate programming, reproducible research, emacs, org, babel, dart -;; Package-Version: 20170106.1624 -;; Homepage: http://github.org/mzimmerm/ob-dart - -;; This is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; For the GNU General Public License, see . - -;;; Commentary: -;; - Currently only supports execution of Dart code that can be wrapped -;; in Dart main() method body. -;; Todo: -;; - Support any valid Dart code, including class definitions and -;; the main() method -;; - Session support - -;;; Requirements: -;; - Dart language installed - An implementation can be downloaded from -;; https://www.dartlang.org/downloads/ -;; - The dart executable is on the PATH -;; - (Optional) Dart major mode - Can be installed from MELPA - -;; Notes: -;; - Code follows / inspired by these previously supported org-languages, -;; roughly in this order: -;; - ob-io.el -;; - ob-scala.el -;; - ob-groovy.el -;; - ob-R.el -;; - ob-python.el - -;;; Code: - -(require 'ob) -(eval-when-compile (require 'cl)) - -(defvar org-babel-tangle-lang-exts) -(add-to-list 'org-babel-tangle-lang-exts '("dart" . "dart")) -(defvar org-babel-default-header-args:dart '()) -(defvar org-babel-dart-command "dart" - "Name of the command to use for executing Dart code. todo - Windows") - -(defun org-babel-execute:dart (body params) - " -Execute a block of Dart code with org-babel. This function is -called by `org-babel-execute-src-block' - -Args: - BODY - String - Dart code from org file, between #+begin_src and #+end_src - - should be named: dart-src - PARAMS - List - Org parameters after #+begin_src and #+end_src - - todo - document better, is this correct? -" - (message "executing Dart source code block") - (let* ((processed-params (org-babel-process-params params)) - (session (org-babel-dart-initiate-session (nth 0 processed-params))) - (vars (nth 1 processed-params)) - (result-params (nth 2 processed-params)) - (result-type (cdr (assoc :result-type params))) - (full-body (org-babel-expand-body:generic - body params)) - (result (org-babel-dart-evaluate - session full-body result-type result-params))) - - (org-babel-reassemble-table - result - (org-babel-pick-name - (cdr (assoc :colname-names params)) (cdr (assoc :colnames params))) - (org-babel-pick-name - (cdr (assoc :rowname-names params)) (cdr (assoc :rownames params)))))) - - -(defun org-babel-dart-table-or-string (results) - " -Convert RESULTS into an appropriate elisp value. - -The default core implementation org-babel-script-escape behaves as follows: - - If RESULTS look like a table (grouped using () or {} or [] and delimited by comme), - then convert them into an Emacs-lisp table (list of lists), - - otherwise return the results unchanged as a string. - -Args: - RESULTS - String - String resulting from Dart invocation, and printed to stdio - by stdout.write() or print() -" - (org-babel-script-escape results)) - -;; Variable which returns Dart code in String. -;; -;; The Dart code wraps Dart source between the org document's #+begin_src and #+end_src, -;; in a Dart main() method. There are some added runZoned() tricks to either use -;; the printed strings or returned value as results of the #+begin_src and #+end_src -;; code. -;; -;; The above behaviour is controlled by an argument passed from elisp -;; to the during 'org-babel-eval dart-code argument'. -;; -;; In particular, if the passed argument (named results_collection_type in code) is: -;; - "output": -;; - Strings from Dart print() is send to the standart output, -;; and becomes the result -;; - "value": -;; - Value of the last statement converted to String is send to the standart output, -;; and becomes the result. - -(defvar org-babel-dart-wrapper-method - - " -//import 'dart:analysis_server'; -//import 'dart:analyzer'; -import 'dart:async'; -import 'dart:collection'; -import 'dart:convert'; -import 'dart:core'; -//import 'dart:developer'; -//import 'dart:html'; -//import 'dart:indexed_db'; -//import 'dart:internal'; -import 'dart:io'; -import 'dart:isolate'; -//import 'dart:js'; -import 'dart:math'; -import 'dart:mirrors'; -//import 'dart:profiler'; -//import 'dart:svg'; -//import 'dart:typed_data'; -//import 'dart:web_audio'; -//import 'dart:web_gl'; -//import 'dart:web_sql'; - - -//// Helper class allows to run Dart code wrapped in emacs org mode -//// Also see: -//// https://gist.github.com/0e1dd60ca06369f7990d0ecfda8ed6a7 -//// https://dartpad.dartlang.org/0e1dd60ca06369f7990d0ecfda8ed6a7 -class Gen { - - // Wrapped code from the org file, between #+begin_src and #+end_src - - runSrc() { - // print(\"from print - for :results output\"); - // return \"returning - for :result value\"; - // Code from begin_src .. end_src inserted here by elisp format. - // See (format org-babel-dart-wrapper-method body) - %s - } - - // run, allow print to stdout, and ignore return value - runSrcResultsOutput() { - runSrc(); - } - - // run, ignore print to stdout, and use return value (which will be printed to stdout) - runSrcResultsValue() { - // ignore prints to stdout - var retval; - runZoned(() { - retval = runSrc(); - }, zoneSpecification: new ZoneSpecification( - print: (self, parent, zone, message) { - // Ignore argument message passed to print. - })); - - return retval; - } -} - -void main(List args) { - - // new Gen().runSrcResultsOutput(); - // print(\"${new Gen().runSrcResultsValue()}\"); - - var results_collection_type = null; - if (args != null && args.length > 0) { - results_collection_type = args.elementAt(0); - } - - if (results_collection_type == \"output\") { - // generate this for :results output - new Gen().runSrcResultsOutput(); - } else if (results_collection_type == \"value\") { - // generate this for :results value (use return value and print it) - // this works because in Dart print inside print still goes to stdout - stdout.write(\"${new Gen().runSrcResultsValue()}\"); // print with no newline. Needed for - } else { - throw new Exception(\"Invalid collection type in results: ${results_collection_type}. Only one of [output/value] allowed.\"); - } - -} -" - ) - - -(defun org-babel-dart-evaluate - (session body &optional result-type result-params) - " -Evaluate BODY in external Dart process. -If RESULT-TYPE equals 'output then return standard output as a string. -If RESULT-TYPE equals 'value then return the value of the last statement -in BODY as elisp. - -Args: - SESSION - TODO DOCUMENT - BODY - String from org file, between #+begin_src and #+end_src - - should be named: dart-src - RESULT-TYPE - Symbol with value (output|value) that follows #+begin_src :results TODO DOCUMENT - - should be named: results-collection - Symbol - (output|value) - - RESULT-PARAMS - Symbol TODO DOCUMENT likely the 'format' type from docs - - should be named: results-format -" - (when session (error "Session is not (yet) supported for Dart.")) - - (let* ((src-file (org-babel-temp-file "dart-")) - (wrapper (format org-babel-dart-wrapper-method body))) - - (with-temp-file src-file (insert wrapper)) - (let ((raw (org-babel-eval - (concat org-babel-dart-command " " src-file " " (symbol-name result-type)) ""))) - ;; result-type: both 'value and 'output formats results as table, unless raw is specified - (org-babel-result-cond result-params - raw - (org-babel-dart-table-or-string raw))))) - -(defun org-babel-prep-session:dart (session params) - "Prepare SESSION according to the header arguments specified in PARAMS." - (error "Session is not (yet) supported for Dart.")) - -(defun org-babel-dart-initiate-session (&optional session) - " -If there is not a current inferior-process-buffer in SESSION -then create. Return the initialized session. Sessions are not -supported in Dart. -" - nil) - -(provide 'ob-dart) - -;;; ob-dart.el ends here diff --git a/elpa/ob-dart-20170106.1624/ob-dart.elc b/elpa/ob-dart-20170106.1624/ob-dart.elc deleted file mode 100644 index 4b7a7bcfb4ef6af2b6a2b2a3244dddfde374c7b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6975 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 Nw_V-$*s^M+{{#HVyP5z1 diff --git a/elpa/ob-http-20180707.1448/ob-http-autoloads.el b/elpa/ob-http-20180707.1448/ob-http-autoloads.el deleted file mode 100644 index 558f91e9..00000000 --- a/elpa/ob-http-20180707.1448/ob-http-autoloads.el +++ /dev/null @@ -1,33 +0,0 @@ -;;; ob-http-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "ob-http" "ob-http.el" (0 0 0 0)) -;;; Generated autoloads from ob-http.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-http" '("org-babel-" "ob-http"))) - -;;;*** - -;;;### (autoloads nil "ob-http-mode" "ob-http-mode.el" (0 0 0 0)) -;;; Generated autoloads from ob-http-mode.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-http-mode" '("ob-http-mode"))) - -;;;*** - -;;;### (autoloads nil nil ("ob-http-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; ob-http-autoloads.el ends here diff --git a/elpa/ob-http-20180707.1448/ob-http-mode.el b/elpa/ob-http-20180707.1448/ob-http-mode.el deleted file mode 100644 index 05b0abb0..00000000 --- a/elpa/ob-http-20180707.1448/ob-http-mode.el +++ /dev/null @@ -1,66 +0,0 @@ -;;; ob-http-mode.el --- syntax highlight for ob-http - -;; Copyright (C) 2015 Feng Zhou - -;; 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 . - -(require 's) - -(setq ob-http-mode-keywords - (let* ((ob-http-methods - '(GET POST PUT PATCH DELETE OPTIONS HEAD TRACE CONNECT)) - (ob-http-headers - '(Accept Accept-Charset Accept-Encoding Accept-Language - Accept-Datetime Authorization Cache-Control - Connection Cookie Content-Length Content-MD5 - Content-Type Date Expect From Host If-Match - If-Modified-Since If-None-Match If-Range - If-Unmodified-Since Max-Forwards Origin Pragma - Proxy-Authorization Range Referer TE User-Agent - Upgrade Via Warning)) - (ob-http-methods-regexp - (rx-to-string - `(seq - bol - (? (1+ space)) - (group-n 1 (or ,@(mapcar 'symbol-name ob-http-methods))) - space - (group-n 2 (1+ any)) - eol))) - (ob-http-headers-regexp - (rx-to-string - `(seq - bol - (? (1+ space)) - (group-n 1 (or ,@(mapcar 'symbol-name ob-http-headers))) - ": " - (group-n 2 (1+ any)) - eol))) - (ob-http-custom-headers-regexp - "\\(^X-[^ :]+\\): \\(.*\\)$") - (ob-http-variable-regexp - "\\([^ ?&=\n]+\\)=\\([^&\n]*\\)") - (ob-http-misc-regexp - "\\(&\\|=\\|?\\|{\\|}\\|\\[\\|\\]\\|\\,\\|:\\)")) - `((,ob-http-headers-regexp (1 font-lock-variable-name-face) (2 font-lock-string-face)) - (,ob-http-custom-headers-regexp (1 font-lock-variable-name-face) (2 font-lock-string-face)) - (,ob-http-variable-regexp (1 font-lock-variable-name-face) (2 font-lock-string-face)) - (,ob-http-methods-regexp (1 font-lock-constant-face) (2 font-lock-function-name-face)) - (,ob-http-misc-regexp (1 font-lock-comment-face))))) - -(define-derived-mode ob-http-mode fundamental-mode "ob http" - (set (make-local-variable 'font-lock-defaults) '(ob-http-mode-keywords))) - -(provide 'ob-http-mode) -;;; ob-http-mode.el ends here diff --git a/elpa/ob-http-20180707.1448/ob-http-mode.elc b/elpa/ob-http-20180707.1448/ob-http-mode.elc deleted file mode 100644 index b1ffcec3fc14dbda673f4ee0322ab11d0cbea1ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3613 zcmd5dFQ1Q;=WH&oO*%xFHb>ES~X4VPrQUi*oCr0Bs83cJn&o^MsAWyFB~U} zpvojAJ{*c6&9zw1TK2OmdkiD&5k@JwQJ8WtXX%JN#Y)K554+pj7 zDT&DCAq@oi5w9qj9VH>brSAzz=>&{+JJ$;re9=!C@TI?6t!50SsbFq26jXQG<}$|0 zL&vsEr)`<{@UVWs!^UW1EMasoz-FyDZ5v#+g<;=x>Ki?Lv^Vg3_#?G+>i7jaeYlNi{;Uli+7 zyv;l*C?VtbUY`#35Ais{SnqeYXtTG|>-T8?pufGpcSu{k^-b!(TJQF#yT7;B>-L*u zth=s=Q_5egi=<1$eA){UETncp-r?am<6}|GH+d>hD41vPft(c#b-6nctc%2!k&oI7 zL*c4Q!e?~q3AK`nFl9R;9HZch>F#D{{@tI(g4FiZJC7kvFJ%0jdBp(MHujqWrsz=H< zdL>3eqPXDHqeMuyKE^TVC>~3Moc{DU{l#Snhc!u_vovCPXP`v9r2$-Fv~4o1CzQn8 z70o7%Wt7D%B#Ro4UPIL)jz{ucO2vO z-|YA`t)4t_oaQQFq4g`i9@SBkjsePx$IqQmQ=jXF$CxROoZ+$Ke8BpL7Z~p`K4Lh| zv3{QD=OUh~n%^)i8X?xqkK9u>&s}viHc}oS!!9x8&dMnu{ZE8lAVA7-h-)k!WuZ=N z9j)sPccUOsxvr&~^Xd=0#4U=rXdK8;!A`~WU4)!GA>UWr8ZA(DOmA zHdJ&-)7o=vbIBRqz&F~Wsn_ssH}XacTHEZP>zYgV3LbRXycrifCdic*H&;6kB4965 z2h$Kqah6hjOW7r}koX9&MIZ`=i!h#4qa<~{mJ{wp6w3%rEJ#R-B=b}9M!+keYq2}w zTVdlM%EBQ;-T+edu@{JEXpd0p0;Z=l@IsWYm$rxujn5EFWhRhSQUkg6Rk3Z-LK5pe zFWRtnI!ce=X)p9to62ji9F-GV`a~?0q!I8_!BDDbohp7=( zgm)g1!uJI#noAD~MxdX@NNdKE;~mYQ(*$|8H7iNz=qoT>dRX4t)S=%f7&Y{QX}d1Dou4Xc6foTo%tWBpLiDA%v@^NQ6ay^T+(s`xEerH>+5g@W!t^>yvz&nd(`#XAFf z>LNh?qGV5~)2uaqvpXHy<^M!d(^@saT|#+oSM6qq*TN#@+Gn~d2dfx{`c>E1vR|sq zWzqsJuezv}d8)CXwkLvgNmr%Rk}@J^Kpk^j;U&c)M0fGfE^tFiMO+(Zx*_R0=l<-v z0xiz_assI%eSDyMFPO0DLYYd9W9?nkf+|&2PpUZ06?K6%X?C5pzQxS`4v+S&83!)3 zBmH^%E{IClQhiug_VV4^P0aN*7i+p+hQjC5JT&Tj33954hi;`;+mte#%C@qyJFApR zy69{LNOOOV(v;Gv=lcw8R>60PQo7lyxYTFuy{`Ti%~+KkxJFjhU)%(cu^fTHrL|&g v0e!eUWnuZ?6)qkA+@kUsP6(Hy#v^Kx{q(8bRQPy;CJdxG^I&Bqgw5K2m_~V1 diff --git a/elpa/ob-http-20180707.1448/ob-http-pkg.el b/elpa/ob-http-20180707.1448/ob-http-pkg.el deleted file mode 100644 index 42cd6098..00000000 --- a/elpa/ob-http-20180707.1448/ob-http-pkg.el +++ /dev/null @@ -1,11 +0,0 @@ -(define-package "ob-http" "20180707.1448" "http request in org-mode babel" - '((s "1.9.0") - (cl-lib "0.5")) - :authors - '(("ZHOU Feng" . "zf.pascal@gmail.com")) - :maintainer - '("ZHOU Feng" . "zf.pascal@gmail.com") - :url "http://github.com/zweifisch/ob-http") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/ob-http-20180707.1448/ob-http.el b/elpa/ob-http-20180707.1448/ob-http.el deleted file mode 100644 index f878f38a..00000000 --- a/elpa/ob-http-20180707.1448/ob-http.el +++ /dev/null @@ -1,287 +0,0 @@ -;;; ob-http.el --- http request in org-mode babel - -;; Copyright (C) 2015 Feng Zhou - -;; Author: ZHOU Feng -;; URL: http://github.com/zweifisch/ob-http -;; Version: 0.0.1 -;; Package-Requires: ((s "1.9.0") (cl-lib "0.5")) - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: -;; -;; http request in org-mode babel -;; - -;;; Code: -(require 'ob) -(require 's) -(require 'subr-x) -(require 'json) -(require 'ob-http-mode) -(require 'cl-lib) - -(defconst org-babel-header-args:http - '((pretty . :any) - (proxy . :any) - (noproxy . :any) - (curl . :any) - (cookie . :any) - (schema . :any) - (host . :any) - (port . :any) - (user . :any) - (username . :any) ;; deprecated, use user instead - (password . :any) ;; deprecated - (follow-redirect . :any) - (path-prefix . :any) - (resolve . :any) - (max-time . :any)) - "http header arguments") - -(defgroup ob-http nil - "org-mode blocks for http request" - :group 'org) - -(defcustom ob-http:max-time 10 - "maximum time in seconds that you allow the whole operation to take" - :group 'ob-http - :type 'integer) - -(defcustom ob-http:remove-cr nil - "remove carriage return from header" - :group 'ob-http - :type 'boolean) - -(defcustom ob-http:curl-custom-arguments nil - "List of custom headers that shall be added to each curl request" - :group 'ob-http - :type '(repeat (string :format "%v"))) - -(cl-defstruct ob-http-request method url headers body) -(cl-defstruct ob-http-response headers body headers-map) - -(defun ob-http-parse-request (input) - (let* ((headers-body (ob-http-split-header-body input)) - (headers (s-split-up-to "\\(\r\n\\|[\n\r]\\)" (car headers-body) 1)) - (method-url (split-string (car headers) " "))) - (make-ob-http-request - :method (car method-url) - :url (cadr method-url) - :headers (if (cadr headers) (s-lines (cadr headers))) - :body (cadr headers-body)))) - -(defun ob-http-parse-response (response) - (let* ((headers-body (ob-http-split-header-body response)) - (headers-map (mapcar 'ob-http-parse-header (s-lines (car headers-body))))) - (make-ob-http-response - :headers (car headers-body) - :body (cadr headers-body) - :headers-map headers-map))) - -(defun ob-http-split-header-body (input) - (let ((splited (s-split-up-to "\\(\r\n\\|[\n\r]\\)[ \t]*\\1" input 1))) - (if (and (string-match "^HTTP/\\(1.[0-1]\\|2\\) \\(30\\|100\\)" (car splited)) - (string-match "^HTTP/\\(1.[0-1]\\|2\\)" (cadr splited))) - (ob-http-split-header-body (cadr splited)) - splited))) - -(defun ob-http-parse-header (line) - (let ((key-value (s-split-up-to ": " line 1))) - `(,(s-downcase (car key-value)) . ,(cadr key-value)))) - -(defun ob-http-parse-content-type (content-type) - (when content-type - (cond - ((string-match "json" content-type) 'json) - ((string-match "html" content-type) 'html) - ((string-match "xml" content-type) 'xml)))) - -(defun ob-http-shell-command-to-string (command input) - (with-temp-buffer - (insert input) - (shell-command-on-region (point-min) (point-max) command nil 't) - (buffer-string))) - -(defun ob-http-pretty-json (str) - (if (executable-find "jq") - (ob-http-shell-command-to-string "jq -r ." str) - (with-temp-buffer - (insert str) - (json-pretty-print-buffer) - (buffer-string)))) - -(defun ob-http-pretty-xml (str) - (cond - ((executable-find "xml_pp") (ob-http-shell-command-to-string "xml_pp" str)) - ((executable-find "xmlstarlet") (ob-http-shell-command-to-string "xmlstarlet fo" str)) - (t str))) - -(defun ob-http-pretty-html (str) - (cond - ((executable-find "elinks") (ob-http-shell-command-to-string "elinks -dump" str)) - ((executable-find "tidy") (ob-http-shell-command-to-string "tidy -i -raw -q 2> /dev/null" str)) - ((executable-find "pup") (ob-http-shell-command-to-string "pup -p" str)) - (t str))) - -(defun ob-http-pretty (body content-type) - (if (string= "" body) - body - (cl-case (ob-http-parse-content-type content-type) - (json (ob-http-pretty-json body)) - (xml (ob-http-pretty-xml body)) - (html (ob-http-pretty-html body)) - (otherwise body)))) - -(defun ob-http-pretty-response (response content-type) - (setf (ob-http-response-body response) - (ob-http-pretty (ob-http-response-body response) - (if (member content-type '("yes" nil)) - (ob-http-get-response-header response "content-type") - content-type)))) - -(defun ob-http-select (response path) - (let ((content-type (ob-http-parse-content-type - (ob-http-get-response-header response "content-type"))) - (body (ob-http-response-body response))) - (cond - ((and (eq 'json content-type) (executable-find "jq")) - (ob-http-shell-command-to-string (format "jq -r \"%s\"" path) body)) - ((and (eq 'html content-type) (executable-find "pup")) - (ob-http-shell-command-to-string (format "pup -p \"%s\"" path) body)) - ((and (eq 'xml content-type) (executable-find "xmlstarlet")) - (ob-http-shell-command-to-string (format "xmlstarlet sel -t -c '%s' | xmlstarlet fo -o" path) body)) - (t body)))) - -(defun org-babel-expand-body:http (body params) - (s-format body 'ob-http-aget - (mapcar (lambda (x) (when (eq (car x) :var) (cdr x))) params))) - -(defun ob-http-get-response-header (response header) - (cdr (assoc (s-downcase header) (ob-http-response-headers-map response)))) - -(defun ob-http-remove-carriage-return (response) - (setf (ob-http-response-headers response) - (s-join "\n" (s-lines (ob-http-response-headers response)))) - response) - -(defun ob-http-flatten (l) - (cond - ((null l) nil) - ((atom l) (list l)) - (t - (append (ob-http-flatten (car l)) (ob-http-flatten (cdr l)))))) - -(defun ob-http-aget (key alist) - (assoc-default (intern key) alist)) - -(defun ob-http-construct-url (path params) - (if (s-starts-with? "/" path) - (s-concat - (format "%s://" (or (assoc-default :schema params) "http")) - (assoc-default :host params) - (when (assoc :port params) - (format ":%s" (assoc-default :port params))) - (assoc-default :path-prefix params) - path) - path)) - -(defun ob-http-file (response filename) - (let ((body (ob-http-response-body response))) - (with-temp-file filename - (insert body)))) - -(defun org-babel-execute:http (body params) - (let* ((request (ob-http-parse-request (org-babel-expand-body:http body params))) - (proxy (cdr (assoc :proxy params))) - (noproxy (assoc :noproxy params)) - (follow-redirect (and (assoc :follow-redirect params) (not (string= "no" (cdr (assoc :follow-redirect params)))))) - (pretty (assoc :pretty params)) - (prettify (and pretty (not (string= (cdr pretty) "no")))) - (file (assoc :file params)) - (get-header (cdr (assoc :get-header params))) - (cookie-jar (cdr (assoc :cookie-jar params))) - (cookie (cdr (assoc :cookie params))) - (curl (cdr (assoc :curl params))) - (select (cdr (assoc :select params))) - (resolve (cdr (assoc :resolve params))) - (request-body (ob-http-request-body request)) - (error-output (org-babel-temp-file "curl-error")) - (args (append ob-http:curl-custom-arguments (list "-i" - (when (and proxy (not noproxy)) `("-x" ,proxy)) - (when noproxy '("--noproxy" "*")) - (let ((method (ob-http-request-method request))) - (if (string= "HEAD" method) "-I" `("-X" ,method))) - (when follow-redirect "-L") - (when (and (assoc :username params) (assoc :password params)) - `("--user" ,(s-format "${:username}:${:password}" 'ob-http-aget params))) - (when (assoc :user params) `("--user" ,(cdr (assoc :user params)))) - (mapcar (lambda (x) `("-H" ,x)) (ob-http-request-headers request)) - (when (s-present? request-body) - (let ((tmp (org-babel-temp-file "http-"))) - (with-temp-file tmp (insert request-body)) - `("-d" ,(format "@%s" tmp)))) - (when cookie-jar `("--cookie-jar" ,cookie-jar)) - (when cookie `("--cookie" ,cookie)) - (when resolve (mapcar (lambda (x) `("--resolve" ,x)) (split-string resolve ","))) - (when curl (split-string-and-unquote curl)) - "--max-time" - (int-to-string (or (cdr (assoc :max-time params)) - ob-http:max-time)) - "--globoff" - (ob-http-construct-url (ob-http-request-url request) params))))) - (with-current-buffer (get-buffer-create "*curl commands history*") - (goto-char (point-max)) - (insert "curl " - (string-join (mapcar 'shell-quote-argument (ob-http-flatten args)) " ") - "\n")) - (with-current-buffer (get-buffer-create "*curl output*") - (erase-buffer) - (if (= 0 (apply 'call-process "curl" nil `(t ,error-output) nil (ob-http-flatten args))) - (let ((response (ob-http-parse-response (buffer-string)))) - (when prettify (ob-http-pretty-response response (cdr pretty))) - (when ob-http:remove-cr (ob-http-remove-carriage-return response)) - (cond (get-header (ob-http-get-response-header response get-header)) - (select (ob-http-select response select)) - (prettify (ob-http-response-body response)) - (file (ob-http-file response (cdr file))) - (t (s-join "\n\n" (list (ob-http-response-headers response) (ob-http-response-body response)))))) - (with-output-to-temp-buffer "*curl error*" - (princ (with-temp-buffer - (insert-file-contents-literally error-output) - (s-join "\n" (s-lines (buffer-string))))) - ""))))) - -(defun ob-http-export-expand-variables (&optional backend) - "Scan current buffer for all HTTP source code blocks and expand variables. - -Add this function to `org-export-before-processing-hook' to -enable variable expansion before source block is exported." - (let ((case-fold-search t) elt replacement) - (save-excursion - (goto-char (point-min)) - (while (search-forward-regexp "^[ \t]*#\\+begin_src[ \t]+http" nil 'noerror) - (setq elt (org-element-at-point)) - (when (eq 'src-block (car elt)) - (setq replacement (org-babel-expand-src-block)) - (goto-char (org-element-property :begin elt)) - (delete-region (org-element-property :begin elt) (org-element-property :end elt)) - (insert (org-element-interpret-data (org-element-put-property elt :value replacement)))))))) - -(eval-after-load "org" - '(add-to-list 'org-src-lang-modes '("http" . "ob-http"))) - -(provide 'ob-http) -;;; ob-http.el ends here diff --git a/elpa/ob-http-20180707.1448/ob-http.elc b/elpa/ob-http-20180707.1448/ob-http.elc deleted file mode 100644 index 6fd4a053a1e8e65ac458e5422ccf8a9e767e6edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21734 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 COD@X* diff --git a/elpa/ob-ipython-20180224.953/client.py b/elpa/ob-ipython-20180224.953/client.py deleted file mode 100644 index 75396033..00000000 --- a/elpa/ob-ipython-20180224.953/client.py +++ /dev/null @@ -1,87 +0,0 @@ -import jupyter_client as client -import threading -import json -import sys -import argparse - -find_connection_file = client.find_connection_file - -semaphore = threading.Semaphore(value=0) -interested_lock = threading.Lock() -interested = [] - -def msg_router(io, shell): - while True: - msg = io() - msg['channel'] = 'io' - msgid = msg['parent_header'].get('msg_id', None) - with interested_lock: - if msgid not in interested: - continue - print(json.dumps(msg, default=str)) - if (msg.get('msg_type', '') == 'status' and - msg['content']['execution_state'] == 'idle'): - break - - while True: - msg = shell() - msg['channel'] = 'shell' - msgid = msg['parent_header'].get('msg_id', None) - with interested_lock: - if msgid not in interested: - continue - print(json.dumps(msg, default=str)) - if msg.get('msg_type', '') in ['execute_reply', - 'inspect_reply', - 'complete_reply']: - semaphore.release() - -def create_client(name): - if name.endswith('.json'): - cf = find_connection_file(name) - else: - cf = find_connection_file('emacs-' + name) - c = client.BlockingKernelClient(connection_file=cf) - c.load_connection_file() - c.start_channels() - io, shell = c.get_iopub_msg, c.get_shell_msg - t = threading.Thread(target=msg_router, args=(io, shell)) - t.setDaemon(True) - t.start() - return c - -parser = argparse.ArgumentParser() -parser.add_argument('--conn-file') -parser.add_argument('--execute', action='store_true') -parser.add_argument('--inspect', action='store_true') -parser.add_argument('--complete', action='store_true') -args = parser.parse_args() - -c = create_client(args.conn_file) - -with interested_lock: - if args.execute: - msgid = c.execute(sys.stdin.read(), allow_stdin=False) - interested.append(msgid) - - elif args.inspect: - req = json.loads(sys.stdin.read()) - code = req['code'] - msgid = c.inspect(code, - cursor_pos=req.get('pos', len(code)), - detail_level=req.get('detail', 0)) - interested.append(msgid) - - elif args.complete: - req = json.loads(sys.stdin.read()) - code = req['code'] - pos = req.get('pos', len(code)) - # causes things to hang as kernel doesn't come back with a - # complete_reply - if code[pos-1] in ['\n', '\r']: - sys.exit(0) - msgid = c.complete(code, - cursor_pos=pos) - interested.append(msgid) - -semaphore.acquire() diff --git a/elpa/ob-ipython-20180224.953/ob-ipython-autoloads.el b/elpa/ob-ipython-20180224.953/ob-ipython-autoloads.el deleted file mode 100644 index d6617fa2..00000000 --- a/elpa/ob-ipython-20180224.953/ob-ipython-autoloads.el +++ /dev/null @@ -1,26 +0,0 @@ -;;; ob-ipython-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "ob-ipython" "ob-ipython.el" (0 0 0 0)) -;;; Generated autoloads from ob-ipython.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-ipython" '("ipython--async-" "ob-ipython-" "org-babel-" "company-ob-ipython"))) - -;;;*** - -;;;### (autoloads nil nil ("ob-ipython-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; ob-ipython-autoloads.el ends here diff --git a/elpa/ob-ipython-20180224.953/ob-ipython-pkg.el b/elpa/ob-ipython-20180224.953/ob-ipython-pkg.el deleted file mode 100644 index 87823880..00000000 --- a/elpa/ob-ipython-20180224.953/ob-ipython-pkg.el +++ /dev/null @@ -1,16 +0,0 @@ -(define-package "ob-ipython" "20180224.953" "org-babel functions for IPython evaluation" - '((s "1.9.0") - (dash "2.10.0") - (dash-functional "1.2.0") - (f "0.17.2") - (emacs "24")) - :keywords - '("literate programming" "reproducible research") - :authors - '(("Greg Sexton" . "gregsexton@gmail.com")) - :maintainer - '("Greg Sexton" . "gregsexton@gmail.com") - :url "http://www.gregsexton.org") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/ob-ipython-20180224.953/ob-ipython.el b/elpa/ob-ipython-20180224.953/ob-ipython.el deleted file mode 100644 index 043fb9a1..00000000 --- a/elpa/ob-ipython-20180224.953/ob-ipython.el +++ /dev/null @@ -1,734 +0,0 @@ -;;; ob-ipython.el --- org-babel functions for IPython evaluation - -;; Author: Greg Sexton -;; Keywords: literate programming, reproducible research -;; Homepage: http://www.gregsexton.org -;; Package-Requires: ((s "1.9.0") (dash "2.10.0") (dash-functional "1.2.0") (f "0.17.2") (emacs "24")) - -;; The MIT License (MIT) - -;; Copyright (c) 2015 Greg Sexton - -;; Permission is hereby granted, free of charge, to any person obtaining a copy -;; of this software and associated documentation files (the "Software"), to deal -;; in the Software without restriction, including without limitation the rights -;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -;; copies of the Software, and to permit persons to whom the Software is -;; furnished to do so, subject to the following conditions: - -;; The above copyright notice and this permission notice shall be included in -;; all copies or substantial portions of the Software. - -;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -;; THE SOFTWARE. - -;;; Commentary: - -;; Org-Babel support for evaluating Python source code using IPython. - -;;; Code: - -(require 'ob) -(require 'ob-python) -(require 'dash) -(require 'dash-functional) -(require 's) -(require 'f) -(require 'json) -(require 'python) -(require 'cl) - -;; variables - -(defcustom ob-ipython-kernel-extra-args '() - "List of extra args to pass when creating a kernel." - :group 'ob-ipython) - -(defcustom ob-ipython-client-path - (f-expand "./client.py" - (or (-when-let (f load-file-name) (f-dirname f)) default-directory)) - "Path to the client script." - :group 'ob-ipython) - -(defcustom ob-ipython-command - "jupyter" - "Command to launch ipython. Usually ipython or jupyter." - :group 'ob-ipython) - -(defcustom ob-ipython-resources-dir "./obipy-resources/" - "Directory where resources (e.g images) are stored so that they -can be displayed.") - -;; utils - -(defun ob-ipython--write-string-to-file (file string) - (if string - (with-temp-buffer - (let ((require-final-newline nil)) - (insert string) - (write-file file))) - (error "No output was produced to write to a file."))) - -(defun ob-ipython--write-base64-string (file b64-string) - (if b64-string - (with-temp-buffer - (let ((buffer-file-coding-system 'binary) - (require-final-newline nil)) - (insert b64-string) - (base64-decode-region (point-min) (point-max)) - (write-file file))) - (error "No output was produced to write to a file."))) - -(defun ob-ipython--create-traceback-buffer (traceback) - (let ((buf (get-buffer-create "*ob-ipython-traceback*"))) - (with-current-buffer buf - (special-mode) - (let ((inhibit-read-only t)) - (erase-buffer) - (-each traceback - (lambda (line) (insert (format "%s\n" line)))) - (ansi-color-apply-on-region (point-min) (point-max)))) - (pop-to-buffer buf))) - -(defun ob-ipython--create-inspect-buffer (doc) - (let ((buf (get-buffer-create "*ob-ipython-inspect*"))) - (with-current-buffer buf - (special-mode) - (let ((inhibit-read-only t)) - (erase-buffer) - (insert doc) - (ansi-color-apply-on-region (point-min) (point-max)) - (whitespace-cleanup) - (goto-char (point-min)))) - (pop-to-buffer buf))) - -(defun ob-ipython--clear-output-buffer () - (let ((buf (get-buffer-create "*ob-ipython-out*"))) - (with-current-buffer buf - (let ((inhibit-read-only t)) - (erase-buffer))))) - -(defun ob-ipython--output (output append-p) - (when (not (s-blank? output)) - (let ((buf (get-buffer-create "*ob-ipython-out*"))) - (with-current-buffer buf - (special-mode) - (let ((inhibit-read-only t)) - (unless append-p (erase-buffer)) - (when (s-blank? (buffer-string)) (pop-to-buffer buf)) - (let ((p (point))) - (if (= p (point-max)) ;allow tailing - (progn (insert output) - (-when-let (w (get-buffer-window buf 'visible)) - (set-window-point w (point-max)))) - (save-excursion - (goto-char (point-max)) - (insert output))) - (ansi-color-apply-on-region p (point-max)) - ;; this adds some support for control chars - (comint-carriage-motion p (point-max))) - (unless append-p (goto-char (point-min)))))))) - -(defun ob-ipython--dump-error (err-msg) - (with-current-buffer (get-buffer-create "*ob-ipython-debug*") - (special-mode) - (let ((inhibit-read-only t)) - (erase-buffer) - (insert err-msg) - (goto-char (point-min)))) - (error "There was a fatal error trying to process the request. See *ob-ipython-debug*")) - -(defun ob-ipython--generate-file-name (suffix) - (s-concat (make-temp-name ob-ipython-resources-dir) suffix)) - -;; process management - -(defun ob-ipython--kernel-file (name) - (if (s-ends-with-p ".json" name) - name - (format "emacs-%s.json" name))) - -(defun ob-ipython--kernel-repl-cmd (name) - (list ob-ipython-command "console" "--simple-prompt" "--existing" - (ob-ipython--kernel-file name))) - -;;; TODO: could setup a default sentinel that outputs error on process -;;; early termination -(defun ob-ipython--create-process (name cmd) - (let ((buf (get-buffer-create (format "*ob-ipython-%s*" name)))) - (with-current-buffer buf (erase-buffer)) - (apply 'start-process name buf (car cmd) (cdr cmd)))) - -(defun ob-ipython--get-python () - (locate-file (if (eq system-type 'windows-nt) - "python.exe" - (or python-shell-interpreter "python")) - exec-path)) - -(defun ob-ipython--create-kernel (name &optional kernel) - (when (and (not (ignore-errors (process-live-p (get-process (format "kernel-%s" name))))) - (not (s-ends-with-p ".json" name))) - (ob-ipython--create-process - (format "kernel-%s" name) - (append - (list ob-ipython-command "console" "--simple-prompt") - (list "-f" (ob-ipython--kernel-file name)) - (if kernel (list "--kernel" kernel) '()) - ;;should be last in the list of args - ob-ipython-kernel-extra-args)) - (sleep-for 1))) - -(defun ob-ipython--get-kernel-processes () - (let ((procs (-filter (lambda (p) - (s-starts-with? "kernel-" (process-name p))) - (process-list)))) - (-zip (-map (-compose (-partial 's-replace "kernel-" "") - 'process-name) - procs) - procs))) - -(defun ob-ipython--create-repl (name) - (let ((python-shell-completion-native-enable nil) - (cmd (s-join " " (ob-ipython--kernel-repl-cmd name)))) - (if (string= "default" name) - (progn - (run-python cmd nil nil) - (format "*%s*" python-shell-buffer-name)) - (let ((process-name (format "Python:%s" name))) - (get-buffer-process - (python-shell-make-comint cmd process-name nil)) - (format "*%s*" process-name))))) - -;; kernel management - -(defun ob-ipython--choose-kernel () - (let ((procs (ob-ipython--get-kernel-processes))) - (-> (ido-completing-read "kernel? " (-map 'car procs) nil t) - (assoc procs) - cdr - list))) - -;;; TODO: make this work on windows -;;; NOTE: interrupting remote kernel not currently possible, cf https://github.com/jupyter/jupyter_console/issues/150 -(defun ob-ipython-interrupt-kernel (proc) - "Interrupt a running kernel. Useful for terminating infinite -loops etc. If things get really desparate try `ob-ipython-kill-kernel'." - (interactive (ob-ipython--choose-kernel)) - (when proc - ;; send SIGINT to "python -m ipykernel_launcher", a child of proc - (let ((proc-name (process-name proc))) - (accept-process-output - ;; get the child pid with pgrep -P - ;; NOTE assumes proc has only 1 child (seems to be true always) - (make-process - :name (concat proc-name "-child") - :command (list "pgrep" "-P" (number-to-string - (process-id proc))) - ;; send SIGINT to child-proc - :filter - (lambda (proc child-proc-id) - (make-process - :name (concat "interrupt-" proc-name) - :command (list "kill" "-2" - (string-trim child-proc-id))))))))) - -(defun ob-ipython-kill-kernel (proc) - "Kill a kernel process. If you then re-evaluate a source block -a new kernel will be started." - (interactive (ob-ipython--choose-kernel)) - (when proc - (delete-process proc) - (message (format "Killed %s" (process-name proc))))) - -;; evaluation - -(defvar ob-ipython--async-queue nil) - -(defun ob-ipython--enqueue (q x) - (set q (append (symbol-value q) (list x)))) - -(defun ob-ipython--dequeue (q) - (let ((ret (car (symbol-value q)))) - (set q (cdr (symbol-value q))) - ret)) - -(defun ob-ipython--collect-json () - ;; this function assumes that we're in a buffer with the json lines - (let ((json-array-type 'list)) - (let (acc) - (while (not (= (point) (point-max))) - (setq acc (cons (json-read) acc)) - (forward-line)) - (nreverse acc)))) - -(defun ob-ipython--running-p () - (get-process "execute")) - -(defun ob-ipython--run-async (code name callback args) - (let ((proc (ob-ipython--create-process - "execute" - (list (ob-ipython--get-python) - "--" ob-ipython-client-path "--conn-file" name "--execute")))) - ;; TODO: maybe add a way of disabling streaming output? - ;; TODO: cleanup and break out - we parse twice, can we parse once? - (set-process-filter - proc - (lexical-let ((parse-pos 0)) - (lambda (proc output) - ;; not guaranteed to be given lines - we need to handle buffering - (with-current-buffer (process-buffer proc) - (goto-char (point-max)) - (insert output) - (let ((json-array-type 'list)) - (goto-char parse-pos) - (while (not (= (point) (point-max))) - (condition-case nil - (progn (-> (json-read) - list - ob-ipython--extract-output - (ob-ipython--output t)) - (forward-line) - (setq parse-pos (point))) - (error (goto-char (point-max)))))))))) - (set-process-sentinel - proc - (lexical-let ((callback callback) - (args args)) - (lambda (proc state) - (when (not (process-live-p proc)) - (with-current-buffer (process-buffer proc) - (goto-char (point-min)) - (apply callback (-> (ob-ipython--collect-json) - ob-ipython--eval - (cons args)))) - (ob-ipython--maybe-run-async))))) - (process-send-string proc code) - (process-send-string proc "\n") - (process-send-eof proc))) - -(defun ob-ipython--maybe-run-async () - (when (not (ob-ipython--running-p)) - (when-let (val (ob-ipython--dequeue 'ob-ipython--async-queue)) - (cl-destructuring-bind (code name callback args) val - (ob-ipython--run-async code name callback args))))) - -(defun ob-ipython--execute-request-async (code name callback args) - (ob-ipython--enqueue 'ob-ipython--async-queue (list code name callback args)) - (ob-ipython--maybe-run-async)) - -(defun ob-ipython--execute-request (code name) - (with-temp-buffer - (let ((ret (apply 'call-process-region code nil - (ob-ipython--get-python) nil t nil - (list "--" ob-ipython-client-path "--conn-file" name "--execute")))) - (if (> ret 0) - (ob-ipython--dump-error (buffer-string)) - (goto-char (point-min)) - (ob-ipython--collect-json))))) - -(defun ob-ipython--extract-output (msgs) - (->> msgs - (-filter (lambda (msg) (string= "stream" (cdr (assoc 'msg_type msg))))) - (-filter (lambda (msg) (-contains? '("stdout" "stderr") - (->> msg (assoc 'content) - (assoc 'name) - cdr)))) - (-map (lambda (msg) (->> msg (assoc 'content) (assoc 'text) cdr))) - (-reduce 's-concat))) - -(defun ob-ipython--extract-result (msgs) - `((:value . ,(->> msgs - (-filter (lambda (msg) - (s-equals? "execute_result" - (cdr (assoc 'msg_type msg))))) - (-mapcat (lambda (msg) - (->> msg (assoc 'content) (assoc 'data) cdr))))) - (:display . ,(->> msgs - (-filter (lambda (msg) - (s-equals? "display_data" - (cdr (assoc 'msg_type msg))))) - (-mapcat (lambda (msg) - (->> msg (assoc 'content) (assoc 'data) cdr))))))) - -(defun ob-ipython--extract-error (msgs) - (let ((error-content - (->> msgs - (-filter (lambda (msg) (-contains? '("execute_reply" "inspect_reply") - (cdr (assoc 'msg_type msg))))) - car - (assoc 'content) - cdr))) - ;; TODO: this doesn't belong in this abstraction - (ob-ipython--create-traceback-buffer (cdr (assoc 'traceback error-content))) - (format "%s: %s" (cdr (assoc 'ename error-content)) (cdr (assoc 'evalue error-content))))) - -(defun ob-ipython--extract-status (msgs) - (->> msgs - (-filter (lambda (msg) (-contains? '("execute_reply" "inspect_reply" "complete_reply") - (cdr (assoc 'msg_type msg))))) - car - (assoc 'content) - (assoc 'status) - cdr)) - -(defun ob-ipython--extract-execution-count (msgs) - (->> msgs - (-filter (lambda (msg) (-contains? '("execute_reply") - (cdr (assoc 'msg_type msg))))) - car - (assoc 'content) - (assoc 'execution_count) - cdr)) - -(defun ob-ipython--eval (service-response) - (let ((status (ob-ipython--extract-status service-response))) - (cond ((string= "ok" status) `((:result . ,(ob-ipython--extract-result service-response)) - (:output . ,(ob-ipython--extract-output service-response)) - (:exec-count . ,(ob-ipython--extract-execution-count service-response)))) - ((string= "abort" status) (error "Kernel execution aborted.")) - ((string= "error" status) (error (ob-ipython--extract-error service-response)))))) - -;; inspection - -(defun ob-ipython--inspect-request (code &optional pos detail) - (let ((input (json-encode `((code . ,code) - (pos . ,(or pos (length code))) - (detail . ,(or detail 0))))) - (args (list "--" ob-ipython-client-path - "--conn-file" - (ob-ipython--get-session-from-edit-buffer (current-buffer)) - "--inspect"))) - (with-temp-buffer - (let ((ret (apply 'call-process-region input nil - (ob-ipython--get-python) nil t nil - args))) - (if (> ret 0) - (ob-ipython--dump-error (buffer-string)) - (goto-char (point-min)) - (ob-ipython--collect-json)))))) - -(defun ob-ipython--inspect (code pos) - "Given a piece of code and a point position, return inspection results." - (let* ((resp (ob-ipython--inspect-request code pos 0)) - (status (ob-ipython--extract-status resp))) - (if (string= "ok" status) - (->> resp - (-filter (lambda (msg) - (-contains? '("execute_result" "display_data" "inspect_reply") - (cdr (assoc 'msg_type msg))))) - (-mapcat (lambda (msg) - (->> msg - (assoc 'content) - (assoc 'data) - cdr)))) - (error (ob-ipython--extract-error resp))))) - -(defun ob-ipython-inspect (buffer pos) - "Ask a kernel for documentation on the thing at POS in BUFFER." - (interactive (list (current-buffer) (point))) - (let ((code (with-current-buffer buffer - (buffer-substring-no-properties (point-min) (point-max))))) - (-if-let (result (->> (ob-ipython--inspect code pos) - (assoc 'text/plain) - cdr)) - (ob-ipython--create-inspect-buffer result) - (message "No documentation was found.")))) - -;; completion - -(defun ob-ipython--complete-request (code &optional pos) - (let ((input (json-encode `((code . ,code) - (pos . ,(or pos (length code)))))) - (args (list "--" ob-ipython-client-path "--conn-file" - (ob-ipython--get-session-from-edit-buffer (current-buffer)) - "--complete"))) - (with-temp-buffer - (let ((ret (apply 'call-process-region input nil - (ob-ipython--get-python) nil t nil - args))) - (if (> ret 0) - (ob-ipython--dump-error (buffer-string)) - (goto-char (point-min)) - (ob-ipython--collect-json)))))) - -(defun ob-ipython-completions (buffer pos) - "Ask a kernel for completions on the thing at POS in BUFFER." - (let* ((code (with-current-buffer buffer - (buffer-substring-no-properties (point-min) (point-max)))) - (resp (ob-ipython--complete-request code pos)) - (status (ob-ipython--extract-status resp))) - (if (not (string= "ok" status)) - '() - (->> resp - (-filter (lambda (msg) - (-contains? '("complete_reply") - (cdr (assoc 'msg_type msg))))) - (-mapcat (lambda (msg) - (->> msg - (assoc 'content) - cdr))))))) - -(defun ob-ipython--company-doc-buffer (doc) - "Make company-suggested doc-buffer with ansi-color support." - (let ((buf (company-doc-buffer doc))) - (with-current-buffer buf - (ansi-color-apply-on-region (point-min) (point-max))) - buf)) - -(defun company-ob-ipython (command &optional arg &rest ignored) - (interactive (list 'interactive)) - (cl-case command - (interactive (company-begin-backend 'company-ob-ipython)) - (prefix (and ob-ipython-mode - (let ((res (ob-ipython-completions (current-buffer) (1- (point))))) - (substring-no-properties (buffer-string) - (cdr (assoc 'cursor_start res)) - (cdr (assoc 'cursor_end res)))))) - (candidates (cons :async (lambda (cb) - (let ((res (ob-ipython-completions - (current-buffer) (1- (point))))) - (funcall cb (cdr (assoc 'matches res))))))) - (sorted t) - (doc-buffer (ob-ipython--company-doc-buffer - (cdr (assoc 'text/plain (ob-ipython--inspect arg (length arg)))))))) - -;; mode - -(define-minor-mode ob-ipython-mode - "" - nil - " ipy" - '()) - -;; babel framework - -(add-to-list 'org-src-lang-modes '("ipython" . python)) -(add-hook 'org-mode-hook 'ob-ipython-auto-configure-kernels) - -(defvar ob-ipython-configured-kernels nil) - -(defun ob-ipython--get-kernels () - "Return a list of available jupyter kernels and their corresponding languages. -The elements of the list have the form (\"kernel\" \"language\")." - (and ob-ipython-command - (let ((kernelspecs (cdar (json-read-from-string - (shell-command-to-string - (s-concat ob-ipython-command " kernelspec list --json")))))) - (-map (lambda (spec) - (cons (symbol-name (car spec)) - (->> (cdr spec) - (assoc 'spec) - cdr - (assoc 'language) - cdr))) - kernelspecs)))) - -(defun ob-ipython--configure-kernel (kernel-lang) - "Configure org mode to use specified kernel." - (let* ((kernel (car kernel-lang)) - (language (cdr kernel-lang)) - (jupyter-lang (concat "jupyter-" language)) - (mode (intern (or (cdr (assoc language org-src-lang-modes)) - (replace-regexp-in-string "[0-9]*" "" language)))) - (header-args (intern (concat "org-babel-default-header-args:" jupyter-lang)))) - (add-to-list 'org-src-lang-modes `(,jupyter-lang . ,mode)) - ;; Only set defaults if the corresponding variable is nil or does not - ;; exist yet. - (unless (and (boundp header-args) (symbol-value header-args)) - (set (intern (concat "org-babel-default-header-args:" jupyter-lang)) - `((:session . ,language) - (:kernel . ,kernel)))) - (defalias (intern (concat "org-babel-execute:" jupyter-lang)) - 'org-babel-execute:ipython) - (defalias (intern (concat "org-babel-" jupyter-lang "-initiate-session")) - 'org-babel-ipython-initiate-session) - kernel-lang)) - -(defun ob-ipython-auto-configure-kernels (&optional replace) - "Auto-configure kernels for use with org-babel based on the -available kernelspecs of the current jupyter installation. If -REPLACE is non-nil, force configuring the kernels even if they -have previously been configured." - (interactive (list t)) - (when (or replace (not ob-ipython-configured-kernels)) - (setq ob-ipython-configured-kernels - (-map 'ob-ipython--configure-kernel (ob-ipython--get-kernels))))) - -(defvar org-babel-default-header-args:ipython '()) - -(defun org-babel-edit-prep:ipython (info) - ;; TODO: based on kernel, should change the major mode - (ob-ipython--create-kernel (->> info (nth 2) (assoc :session) cdr - ob-ipython--normalize-session) - (->> info (nth 2) (assoc :kernel) cdr)) - (ob-ipython-mode +1)) - -(defun ob-ipython--normalize-session (session) - (if (string= "default" session) - (error "default is reserved for when no name is provided. Please use a different session name.") - (or session "default"))) - -(defun ob-ipython--get-session-from-edit-buffer (buffer) - (with-current-buffer buffer - (->> org-src--babel-info - (nth 2) - (assoc :session) - cdr - ob-ipython--normalize-session))) - -(defun org-babel-execute:ipython (body params) - "Execute a block of IPython code with Babel. -This function is called by `org-babel-execute-src-block'." - (ob-ipython--clear-output-buffer) - (if (cdr (assoc :async params)) - (ob-ipython--execute-async body params) - (ob-ipython--execute-sync body params))) - -(defun ob-ipython--execute-async (body params) - (let* ((file (cdr (assoc :ipyfile params))) - (session (cdr (assoc :session params))) - (result-type (cdr (assoc :result-type params))) - (sentinel (ipython--async-gen-sentinel))) - (ob-ipython--create-kernel (ob-ipython--normalize-session session) - (cdr (assoc :kernel params))) - (ob-ipython--execute-request-async - (org-babel-expand-body:generic (encode-coding-string body 'utf-8) - params (org-babel-variable-assignments:python params)) - (ob-ipython--normalize-session session) - (lambda (ret sentinel buffer file result-type) - (let ((replacement (ob-ipython--process-response ret file result-type))) - (ipython--async-replace-sentinel sentinel buffer replacement))) - (list sentinel (current-buffer) file result-type)) - (format "%s - %s" (length ob-ipython--async-queue) sentinel))) - -(defun ob-ipython--execute-sync (body params) - (let* ((file (cdr (assoc :ipyfile params))) - (session (cdr (assoc :session params))) - (result-type (cdr (assoc :result-type params)))) - (ob-ipython--create-kernel (ob-ipython--normalize-session session) - (cdr (assoc :kernel params))) - (-when-let (ret (ob-ipython--eval - (ob-ipython--execute-request - (org-babel-expand-body:generic (encode-coding-string body 'utf-8) - params (org-babel-variable-assignments:python params)) - (ob-ipython--normalize-session session)))) - (ob-ipython--process-response ret file result-type)))) - -(defun ob-ipython--process-response (ret file result-type) - (let ((result (cdr (assoc :result ret))) - (output (cdr (assoc :output ret)))) - (if (eq result-type 'output) - output - (ob-ipython--output output nil) - (s-concat - (format "# Out[%d]:\n" (cdr (assoc :exec-count ret))) - (s-join "\n" (->> (-map (-partial 'ob-ipython--render file) - (list (cdr (assoc :value result)) - (cdr (assoc :display result)))) - (remove-if-not nil))))))) - -(defun ob-ipython--render (file-or-nil values) - (let ((org (lambda (value) value)) - (png (lambda (value) - (let ((file (or file-or-nil (ob-ipython--generate-file-name ".png")))) - (ob-ipython--write-base64-string file value) - (format "[[file:%s]]" file)))) - (svg (lambda (value) - (let ((file (or file-or-nil (ob-ipython--generate-file-name ".svg")))) - (ob-ipython--write-string-to-file file value) - (format "[[file:%s]]" file)))) - (html (lambda (value) - ;; ((eq (car value) 'text/html) - ;; (let ((pandoc (executable-find "pandoc"))) - ;; (and pandoc (with-temp-buffer - ;; (insert value) - ;; (shell-command-on-region - ;; (point-min) (point-max) - ;; (format "%s -f html -t org" pandoc) t t) - ;; (s-trim (buffer-string)))))) - )) - (txt (lambda (value) - (let ((lines (s-lines value))) - (if (cdr lines) - (->> lines - (-map 's-trim) - (s-join "\n ") - (s-concat " ") - (format "#+BEGIN_EXAMPLE\n%s\n#+END_EXAMPLE")) - (s-concat ": " (car lines))))))) - (or (-when-let (val (cdr (assoc 'text/org values))) (funcall org val)) - (-when-let (val (cdr (assoc 'image/png values))) (funcall png val)) - (-when-let (val (cdr (assoc 'image/svg+xml values))) (funcall svg val)) - (-when-let (val (cdr (assoc 'text/plain values))) (funcall txt val))))) - -(defun org-babel-prep-session:ipython (session params) - "Prepare SESSION according to the header arguments in PARAMS. -VARS contains resolved variable references" - ;; c-u c-c c-v c-z - (error "Currently unsupported.")) - -(defun org-babel-load-session:ipython (session body params) - "Load BODY into SESSION." - ;; c-c c-v c-l - (error "Currently unsupported.")) - -(defun org-babel-ipython-initiate-session (&optional session params) - "Create a session named SESSION according to PARAMS." - (if (string= session "none") - (error "ob-ipython currently only supports evaluation using a session. -Make sure your src block has a :session param.") - (when (not (s-ends-with-p ".json" session)) - (ob-ipython--create-kernel (ob-ipython--normalize-session session) - (cdr (assoc :kernel params)))) - (ob-ipython--create-repl (ob-ipython--normalize-session session)))) - -;; async - -(defun ipython--async-gen-sentinel () - ;; lifted directly from org-id. thanks. - (let ((rnd (md5 (format "%s%s%s%s%s%s%s" - (random) - (current-time) - (user-uid) - (emacs-pid) - (user-full-name) - user-mail-address - (recent-keys))))) - (format "%s-%s-4%s-%s%s-%s" - (substring rnd 0 8) - (substring rnd 8 12) - (substring rnd 13 16) - (format "%x" - (logior - #b10000000 - (logand - #b10111111 - (string-to-number - (substring rnd 16 18) 16)))) - (substring rnd 18 20) - (substring rnd 20 32)))) - -(defun ipython--async-replace-sentinel (sentinel buffer replacement) - (save-window-excursion - (save-excursion - (save-restriction - (with-current-buffer buffer - (goto-char (point-min)) - (re-search-forward sentinel) - (re-search-backward "\\(call\\|src\\)_\\|^[ \t]*#\\+\\(BEGIN_SRC\\|CALL:\\)") - (org-babel-remove-result) - (org-babel-insert-result - replacement - (cdr (assoc :result-params (nth 2 (org-babel-get-src-block-info))))) - (org-redisplay-inline-images)))))) - -;; lib - -(provide 'ob-ipython) - -;;; ob-ipython.el ends here diff --git a/elpa/ob-ipython-20180224.953/ob-ipython.elc b/elpa/ob-ipython-20180224.953/ob-ipython.elc deleted file mode 100644 index be40a54f62f508cf853187536468d8d5eeec7fa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24042 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 diff --git a/elpa/ob-restclient-20200316.759/ob-restclient-autoloads.el b/elpa/ob-restclient-20200316.759/ob-restclient-autoloads.el deleted file mode 100644 index 747e57d9..00000000 --- a/elpa/ob-restclient-20200316.759/ob-restclient-autoloads.el +++ /dev/null @@ -1,28 +0,0 @@ -;;; ob-restclient-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "ob-restclient" "ob-restclient.el" (0 0 0 0)) -;;; Generated autoloads from ob-restclient.el - -(autoload 'org-babel-execute:restclient "ob-restclient" "\ -Execute a block of Restclient code with org-babel. -This function is called by `org-babel-execute-src-block' - -\(fn BODY PARAMS)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ob-restclient" '("org-babel-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; ob-restclient-autoloads.el ends here diff --git a/elpa/ob-restclient-20200316.759/ob-restclient-pkg.el b/elpa/ob-restclient-20200316.759/ob-restclient-pkg.el deleted file mode 100644 index 059fd00c..00000000 --- a/elpa/ob-restclient-20200316.759/ob-restclient-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "ob-restclient" "20200316.759" "org-babel functions for restclient-mode" '((restclient "0")) :commit "f7449b2068498fe9d8ab9589e0a638148861533f" :keywords '("literate programming" "reproducible research") :authors '(("Alf LervÃ¥g")) :maintainer '("Alf LervÃ¥g") :url "https://github.com/alf/ob-restclient.el") diff --git a/elpa/ob-restclient-20200316.759/ob-restclient.el b/elpa/ob-restclient-20200316.759/ob-restclient.el deleted file mode 100644 index 4c805ee2..00000000 --- a/elpa/ob-restclient-20200316.759/ob-restclient.el +++ /dev/null @@ -1,120 +0,0 @@ -;;; ob-restclient.el --- org-babel functions for restclient-mode - -;; Copyright (C) Alf LervÃ¥g - -;; Author: Alf LervÃ¥g -;; Keywords: literate programming, reproducible research -;; Package-Version: 20200316.759 -;; Homepage: https://github.com/alf/ob-restclient.el -;; Version: 0.02 -;; Package-Requires: ((restclient "0")) - -;;; 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. - -;;; Commentary: -;; This is a very simple first iteration at integrating restclient.el -;; and org-mode. - -;;; Requirements: -;; restclient.el - -;;; Code: -(require 'ob) -(require 'ob-ref) -(require 'ob-comint) -(require 'ob-eval) -(require 'restclient) - -(defvar org-babel-default-header-args:restclient - `((:results . "raw")) - "Default arguments for evaluating a restclient block.") - -;;;###autoload -(defun org-babel-execute:restclient (body params) - "Execute a block of Restclient code with org-babel. -This function is called by `org-babel-execute-src-block'" - (message "executing Restclient source code block") - (with-temp-buffer - (let ((results-buffer (current-buffer)) - (restclient-same-buffer-response t) - (restclient-same-buffer-response-name (buffer-name)) - (display-buffer-alist - (cons - '("\\*temp\\*" display-buffer-no-window (allow-no-window . t)) - display-buffer-alist))) - - (insert (buffer-name)) - (with-temp-buffer - (dolist (p params) - (let ((key (car p)) - (value (cdr p))) - (when (eql key :var) - (insert (format ":%s = <<\n%s\n#\n" (car value) (cdr value)))))) - (insert body) - (goto-char (point-min)) - (delete-trailing-whitespace) - (goto-char (point-min)) - (restclient-http-parse-current-and-do - 'restclient-http-do (org-babel-restclient-raw-payload-p params) t)) - - (while restclient-within-call - (sleep-for 0.05)) - - (goto-char (point-min)) - (when (search-forward (buffer-name) nil t) - (error "Restclient encountered an error")) - - (if (org-babel-restclient-return-pure-payload-result-p params) - (org-babel-restclient-pure-payload-result) - (org-babel-restclient-wrap-result))))) - -(defun org-babel-restclient-wrap-result () - "Wrap the contents of the buffer in an `org-mode' src block." - (let ((mode-name (substring (symbol-name major-mode) 0 -5))) - (insert (format "#+BEGIN_SRC %s\n" mode-name)) - (goto-char (point-max)) - (insert "#+END_SRC\n") - (buffer-string))) - -(defun org-babel-restclient-pure-payload-result () - "Just return the payload." - (let ((comments-start - (save-excursion - (goto-char (point-max)) - (while (comment-only-p (line-beginning-position) (line-end-position)) - (forward-line -1)) - ;; Include the last line as well - (forward-line) - (point)))) - (buffer-substring (point-min) comments-start))) - - -(defun org-babel-restclient-return-pure-payload-result-p (params) - "Return `t' if the `:results' key in PARAMS contains `value' or `table'." - (let ((result-type (cdr (assoc :results params)))) - (when result-type - (string-match "value\\|table" result-type)))) - -(defun org-babel-restclient-raw-payload-p (params) - "Return t if the `:results' key in PARAMS contain `file'." - (let ((result-type (cdr (assoc :results params)))) - (when result-type - (string-match "file" result-type)))) - -(provide 'ob-restclient) -;;; ob-restclient.el ends here diff --git a/elpa/ob-restclient-20200316.759/ob-restclient.elc b/elpa/ob-restclient-20200316.759/ob-restclient.elc deleted file mode 100644 index c5d14a6c80f6d0009a6a4e9c06a65d789a6c34cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3137 zcmcguS#R4$5cWfXIs&Sf0&UX69g|5VIaz^+4j&0%$1#c&y$~1ZLnKrya%HihNM@I` zsN@@NtL#dA!nZo^FeI*%01poI!06ospVFQS0LG*G#Wk_+_+ zvr^^6!%&2@ImJEbdIvXjgei0+X-+|!brDHH=@kD=ikbci(nXZy`b%8$n50m7fQTgdn7mHI zKJNGEnV9h+Mxx|JvA_({no82k3uHXGAYR)>(>M)Yb-!t}LovJLl2UoWrhF=5h5@aI z%>|Mn8Puu6tMjPUZfg-M6m`jxd}(z$)VA+K>iY*BZH?<3(Al3NC~|>Q%~6!j=*7lr z-~-_@z}y_%ZIoCnl0XBLfXe`=1?Z+LnrxOaQ7UFi2F$2#m0s{T;)+@~7S@foU$&=d zxS|XwT&Rvo*Z?^iR+-RAbKTv$a{G0eLD$3YAj7DSr$>18?>xQt#g|_hF{oCR+rE~c zthWvHwx(V_+|jz-osot7`s1zU$U4>opY0wucTaZgo%mlz|4p#hGBsR^YF0|`xt_A-mpo#FvPd@?8D}_+73J}j`6Y0 zuh8l_Ua_^_?Bo2>-C?y=@A1qYM8aP~*Y9iPMxo!=3J0*kLD2l6mWI^*7_x@7?LM&& zbFs+Sw3y9M%VDIln6E04A$?$(E1)sO7h*k$;S8K57}!a?YmuJU@LV5cdvBb)5K8e2 zlxqnkT^luMs{(>LOrqF8$=%km=-+|sj%U70 z&uuDwF3o=x#c`zt)jOvA+HBhzjf`geSZ@X?N!c<=!gNV(lt#K_R|8$jQHSre#e2Ig z+7t0QrbEpM;Ex5*$vS+X=m|Z3JW3v@QDTo0*d=0tc;u2tG2+LT^C(A-I09Eo;XKbX zhFU}7fQkugncPS@#^LR$#tT3&J)l8_QJ zRxOnx3DP1#w*iTuahL_xe;g$8LMALLq}Ut?J2Vkyx9_-R>Fo=bl4sy?t*as)%7`Hf z8u1KmGG>f4O$&M@R%8gO76Q$ZQNlDAj%iRa?O@;Qj5XB`T>1_A(HS*l;j1QoaIKcB zLPHyd^AjE41!%WLV9sm&e}g&er`L?X0+$B24@U5v-p}{&2Gux&J0r{RQCRVjGc+Rj z!=X;a0t@~}DvcSWZ7B;vtrpWXF25aO{SEN!hfmMGd;Zh!=Pyo4L(d}1et7oNGd-ZC zs;bJH%9#8rIG!`uFQelP==;LZiq5VHN`D(3Df3JgqrfwQFQ#qIV&SXTECh-cOLtTOY#6^@Oy27$lMW!#B zae*@0j4+o_w>AI$ey{X@=!4me>yx}iQ3;F5x_`F}-T;qZPF|e+cy926OPivJL1PPW zrb*7Hv1q+Vxa8X^2#vSibJ1NKf4gdE_cUiVP0Vzl0Hbw)$}JV2vwW4|I-yh=(Aonk zQ_nzC!JI5(_Gt8vvDq3^Zw-in>y!cM@2>-rzi&8bqOZsA6@hDH_5Zl6ZL52_zwc{L U+nG!+BiylC<_@{OEp{6J0*zD3rT_o{ diff --git a/elpa/olivetti-20200417.607/olivetti-autoloads.el b/elpa/olivetti-20200417.607/olivetti-autoloads.el deleted file mode 100644 index ee51f9cb..00000000 --- a/elpa/olivetti-20200417.607/olivetti-autoloads.el +++ /dev/null @@ -1,30 +0,0 @@ -;;; olivetti-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "olivetti" "olivetti.el" (0 0 0 0)) -;;; Generated autoloads from olivetti.el - -(autoload 'olivetti-mode "olivetti" "\ -Olivetti provides a nice writing environment. - -Window margins are set to relative widths to accomodate a text -body width set with `olivetti-body-width'. - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "olivetti" '("olivetti-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; olivetti-autoloads.el ends here diff --git a/elpa/olivetti-20200417.607/olivetti-pkg.el b/elpa/olivetti-20200417.607/olivetti-pkg.el deleted file mode 100644 index 8d74e802..00000000 --- a/elpa/olivetti-20200417.607/olivetti-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "olivetti" "20200417.607" "Minor mode for a nice writing environment" '((emacs "24.5")) :commit "fa9757fbaa392be622ddf66c2535dfe4b5cca898" :keywords '("wp" "text") :authors '(("William Rankin" . "code@william.bydasein.com")) :maintainer '("William Rankin" . "code@william.bydasein.com") :url "https://gthub.com/rnkn/olivetti") diff --git a/elpa/olivetti-20200417.607/olivetti.el b/elpa/olivetti-20200417.607/olivetti.el deleted file mode 100644 index 73402d5b..00000000 --- a/elpa/olivetti-20200417.607/olivetti.el +++ /dev/null @@ -1,384 +0,0 @@ -;;; olivetti.el --- Minor mode for a nice writing environment -*- lexical-binding: t; -*- - -;; Copyright (c) 2014-2019 Paul Wiliam Rankin -;; Copyright (c) 2019 Free Software Foundation, Inc. -;; Copyright (c) 2019-2020 Paul Wiliam Rankin - -;; Author: William Rankin -;; Keywords: wp, text -;; Package-Version: 20200417.607 -;; Version: 1.10.0-beta -;; Package-Requires: ((emacs "24.5")) -;; URL: https://gthub.com/rnkn/olivetti - -;; 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 . - -;;; Commentary: - -;; # Olivetti # - -;; A simple Emacs minor mode for a nice writing environment. - -;; ## Features ## - -;; - Set a desired text body width to automatically resize window margins to -;; keep the text comfortably in the middle of the window. -;; - Text body width can be the number of characters (an integer) or a fraction -;; of the window width (a float between 0.0 and 1.0). -;; - Interactively change body width with: -;; olivetti-shrink C-c { { { ... -;; olivetti-expand C-c } } } ... -;; olivetti-set-width C-c \ -;; - If olivetti-body-width is an integer, the text body width will scale with -;; use of text-scale-mode, whereas if a fraction (float) then the text body -;; width will remain at that fraction. -;; - Optionally remember the state of visual-line-mode on entry and recall its -;; state on exit. - -;; Olivetti keeps everything it does buffer-local, so you can write prose in one -;; buffer and code in another, side-by-side in the same frame. For those looking -;; for a hardcore distraction-free writing mode with a much larger scope, I -;; recommend writeroom-mode: https://github.com/joostkremers/writeroom-mode. - -;; ## Requirements ## - -;; - Emacs 25.3 - -;; ## Installation ## - -;; The latest stable release of Olivetti is available via [MELPA-stable] -;; and can be installed with: - -;; M-x package-install RET olivetti RET - -;; Alternately, download the [latest release], move this file into your -;; load-path and add to your .emacs/init.el file: - -;; (require 'olivetti) - -;; If you prefer the latest but perhaps unstable version, install via -;; [MELPA], or clone the repository into your load-path and require as -;; above: - -;; git clone https://github.com/rnkn/olivetti.git - -;; [melpa]: https://melpa.org/#/olivetti "MELPA" -;; [melpa-stable]: https://stable.melpa.org/#/olivetti "MELPA-stable" -;; [latest release]: https://github.com/rnkn/olivetti/releases/latest "Olivetti latest release" - -;; ## Contributing ## - -;; Please report bugs and request features at: -;; https://github.com/rnkn/olivetti/issues - -;; ## Hints ## - -;; To always use a different width for a specific file, set a File -;; Variable: - -;; M-x add-file-local-variable RET olivetti-body-width RET 66 RET - -;; See (info "(emacs) File Variables") - - -;;; Code: - -(defgroup olivetti () - "Minor mode for a nice writing environment" - :prefix "olivetti-" - :group 'text) - - -;;; Variables - -(eval-when-compile - (require 'lisp-mnt) - (defconst olivetti-version - (lm-version load-file-name))) - -(defvar-local olivetti--visual-line-mode - nil - "Non-nil if `visual-line-mode' is active when `olivetti-mode' is turned on.") - - -;;; Options - -(defcustom olivetti-mode-hook - nil - "Hook for `olivetti-mode', run after the mode is activated." - :type 'hook - :safe 'hook) - -(defcustom olivetti-body-width - 70 - "Text body width to which to adjust relative margin width. - -If an integer, set text body width to that integer in columns; if -a floating point between 0.0 and 1.0, set text body width to -that fraction of the total window width. - -An integer is best if you want text body width to remain -constant, while a floating point is best if you want text body -width to change with window width. - -The floating point can anything between 0.0 and 1.0 (exclusive), -but it's better to use a value between about 0.33 and 0.9 for -best effect. - -This option does not affect file contents." - :type '(choice (integer 70) (float 0.5)) - :safe 'numberp) -(make-variable-buffer-local 'olivetti-body-width) - -(defcustom olivetti-minimum-body-width - 40 - "Minimum width in columns that text body width may be set." - :type 'integer - :safe 'integerp) - -(defcustom olivetti-lighter - " Olv" - "Mode-line indicator for `olivetti-mode'." - :type '(choice (const :tag "No lighter" "") string) - :safe 'stringp) - -(defcustom olivetti-recall-visual-line-mode-entry-state - t - "Recall the state of `visual-line-mode' upon exiting. - -When non-nil, if `visual-line-mode' is inactive upon activating -`olivetti-mode', then `visual-line-mode' will be deactivated upon -exiting. The reverse is not true." - :type 'boolean - :safe 'booleanp) - - -;;; Set Windows - -(defun olivetti-safe-width (width window) - "Parse WIDTH to a safe value for `olivetti-body-width' for WINDOW. - -May return a float with many digits of precision." - (let ((window-width (window-total-width window)) - (fringes (window-fringes window)) - (min-width (+ olivetti-minimum-body-width - (% olivetti-minimum-body-width 2)))) - (setq window-width - (- window-width - (/ (* (max (car fringes) (cadr fringes)) 2) - (float (frame-char-width (window-frame window)))) - (% window-width 2))) - (cond ((integerp width) - (max min-width (min width (floor window-width)))) - ((floatp width) - (max (/ min-width window-width) (min width 1.0))) - (t - (message "`olivetti-body-width' must be an integer or a float") - (eval (car (get 'olivetti-body-width 'standard-value))))))) - -(defun olivetti-scale-width (n) - "Scale N in accordance with the face height. - -For compatibility with `text-scale-mode', if -`face-remapping-alist' includes a :height property on the default -face, scale N by that factor if it is a fraction, by (height/100) -if it is an integer, and otherwise scale by 1 (i.e. return N)." - (let - ((height (plist-get (cadr (assq 'default face-remapping-alist)) :height))) - (cond - ((integerp height) (* n (/ height 100.0))) - ((floatp height) (* n height)) - (t (* n 1))))) - -(defun olivetti-reset-window (window) - "Remove Olivetti's parameters and margins from WINDOW." - (when (eq (window-parameter window 'split-window) 'olivetti-split-window) - (set-window-parameter window 'split-window nil)) - (set-window-margins window nil) - (set-window-parameter window 'min-margins nil)) - -(defun olivetti-reset-all-windows () - "Call `olivetti-reset-windows' on all windows in current frame." - (mapc #'olivetti-reset-window (window-list nil 'no-minibuf))) - -(defun olivetti-split-window (&optional window size side pixelwise) - "Call `split-window' after resetting WINDOW. -Pass SIZE, SIDE and PIXELWISE unchanged." - (olivetti-reset-all-windows) - (split-window window size side pixelwise)) - -(defun olivetti-split-window-sensibly (&optional window) - "Like `olivetti-split-window' but call `split-window-sensibly'. -Pass WINDOW unchanged." - (olivetti-reset-all-windows) - (split-window-sensibly window)) - -(defun olivetti-set-window (window-or-frame) - "Balance window margins displaying current buffer. - -If WINDOW-OR-FRAME is a frame, cycle through windows displaying -current buffer in that frame, otherwise only work on the selected -window. - -First find the `olivetti-safe-width' to which to set -`olivetti-body-width', then find the appropriate margin size -relative to each window. Finally set the window margins, taking -care that the maximum size is 0." - (if (framep window-or-frame) - (mapc #'olivetti-set-window (get-buffer-window-list nil nil window-or-frame)) - ;; WINDOW-OR-FRAME passed below *must* be a window - (with-selected-window window-or-frame - (when olivetti-mode - ;; (olivetti-reset-window window-or-frame) - (let ((width (olivetti-safe-width olivetti-body-width window-or-frame)) - (frame (window-frame window-or-frame)) - (window-width (window-total-width window-or-frame)) - (fringes (window-fringes window-or-frame)) - left-fringe right-fringe margin-total left-margin right-margin) - (cond ((integerp width) - (setq width (olivetti-scale-width width))) - ((floatp width) - (setq width (* window-width width)))) - (setq left-fringe (/ (car fringes) (float (frame-char-width frame))) - right-fringe (/ (cadr fringes) (float (frame-char-width frame)))) - (setq margin-total (max (/ (- window-width width) 2) 0) - left-margin (max (round (- margin-total left-fringe)) 0) - right-margin (max (round (- margin-total right-fringe)) 0)) - (set-window-margins window-or-frame left-margin right-margin)) - (set-window-parameter window-or-frame 'split-window 'olivetti-split-window) - (set-window-parameter window-or-frame 'min-margins (cons 0 0)))))) - -(defun olivetti-set-buffer-windows () - "Balance window margins in all windows displaying current buffer. - -Cycle through all windows in all visible frames displaying the -current buffer, and call `olivetti-set-window'." - (mapc #'olivetti-set-window (get-buffer-window-list nil nil 'visible))) - - -;;; Width Interaction - -(defun olivetti-set-width (n) - "Set text body width to N with relative margins. - -N may be an integer specifying columns or a float specifying a -fraction of the window width." - (interactive - (list (or current-prefix-arg - (read-number "Set text body width (integer or float): " - olivetti-body-width)))) - (setq olivetti-body-width n) - (olivetti-set-buffer-windows) - (message "Text body width set to %s" olivetti-body-width)) - -(defun olivetti-expand (&optional arg) - "Incrementally increase the value of `olivetti-body-width'. - -If prefixed with ARG, incrementally decrease." - (interactive "P") - (let* ((p (if arg -1 1)) - (n (cond ((integerp olivetti-body-width) - (+ olivetti-body-width (* 2 p))) - ((floatp olivetti-body-width) - (+ olivetti-body-width (* 0.01 p)))))) - (setq olivetti-body-width (olivetti-safe-width n (selected-window)))) - (olivetti-set-buffer-windows) - (message "Text body width set to %s" olivetti-body-width) - (unless overriding-terminal-local-map - (let ((keys (substring (this-single-command-keys) 0 -1)) - (map (cdr olivetti-mode-map))) - (mapc (lambda (k) (setq map (assq k map))) keys) - (when (consp map) (set-transient-map (cdr map) t))))) - -(defun olivetti-shrink (&optional arg) - "Incrementally decrease the value of `olivetti-body-width'. - -If prefixed with ARG, incrementally increase." - (interactive "P") - (let ((p (unless arg t))) - (olivetti-expand p))) - - -;;; Keymap - -(defvar olivetti-mode-map (make-sparse-keymap) - "Mode map for `olivetti-mode'.") - -(define-key olivetti-mode-map (kbd "C-c }") #'olivetti-expand) -(define-key olivetti-mode-map (kbd "C-c {") #'olivetti-shrink) -(define-key olivetti-mode-map (kbd "C-c \\") #'olivetti-set-width) - - -;;; Mode Definition - -(define-obsolete-function-alias 'turn-on-olivetti-mode - #'olivetti-mode "1.7.0") - -;;;###autoload -(define-minor-mode olivetti-mode - "Olivetti provides a nice writing environment. - -Window margins are set to relative widths to accomodate a text -body width set with `olivetti-body-width'." - :init-value nil - :lighter olivetti-lighter - (if olivetti-mode - (progn - (cond ((<= emacs-major-version 24) - (add-hook 'window-configuration-change-hook - #'olivetti-set-buffer-windows t t)) - ((<= emacs-major-version 26) - (add-hook 'window-configuration-change-hook - #'olivetti-set-buffer-windows t t) - (add-hook 'window-size-change-functions - #'olivetti-set-window t t)) - ((<= 27 emacs-major-version) - (add-hook 'window-size-change-functions - #'olivetti-set-window t t))) - (add-hook 'change-major-mode-hook - #'olivetti-reset-all-windows nil t) - (add-hook 'text-scale-mode-hook - #'olivetti-set-buffer-windows t t) - (setq-local split-window-preferred-function - #'olivetti-split-window-sensibly) - (setq olivetti--visual-line-mode visual-line-mode) - (unless olivetti--visual-line-mode (visual-line-mode 1)) - (olivetti-set-buffer-windows)) - (remove-hook 'window-configuration-change-hook - #'olivetti-set-buffer-windows t) - (remove-hook 'window-size-change-functions - #'olivetti-set-window t) - (remove-hook 'text-scale-mode-hook - #'olivetti-set-window t) - (olivetti-reset-all-windows) - (when (and olivetti-recall-visual-line-mode-entry-state - (not olivetti--visual-line-mode)) - (visual-line-mode 0)) - (kill-local-variable 'split-window-preferred-function) - (kill-local-variable 'olivetti--visual-line-mode))) - - - -(provide 'olivetti) - -;;; olivetti.el ends here - -;; Local Variables: -;; coding: utf-8 -;; fill-column: 80 -;; require-final-newline: t -;; sentence-end-double-space: nil -;; End: diff --git a/elpa/olivetti-20200417.607/olivetti.elc b/elpa/olivetti-20200417.607/olivetti.elc deleted file mode 100644 index 20d18d88cb4b3dd99532ae2b9ba6aa1060b66e6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10248 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 diff --git a/elpa/org-9.3.6.signed b/elpa/org-9.3.6.signed deleted file mode 100644 index 9829a7e5..00000000 --- a/elpa/org-9.3.6.signed +++ /dev/null @@ -1 +0,0 @@ -Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) (trust undefined) created at 2020-02-13T11:05:02+0100 using RSA \ No newline at end of file diff --git a/elpa/org-9.3.6/COPYING b/elpa/org-9.3.6/COPYING deleted file mode 100644 index 94a9ed02..00000000 --- a/elpa/org-9.3.6/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/elpa/org-9.3.6/README_ELPA b/elpa/org-9.3.6/README_ELPA deleted file mode 100644 index 7640a449..00000000 --- a/elpa/org-9.3.6/README_ELPA +++ /dev/null @@ -1,41 +0,0 @@ -This is the Emacs Org project, an Emacs library for organizing your life. - -The homepage of Org is at: - https://orgmode.org - -Installations instructions are at: - https://orgmode.org/org.html#Installation - -This distribution contains an ELPA packaged version of Org. -"ELPA" stands for the "Emacs Lisp Package Archive". - -The GNU ELPA is at: - http://elpa.gnu.org - -It contains the org-*.tar package, containing only the org files -that are also part of GNU Emacs. - -There are other ELPA online, offering more packages. - -Some contain the org-plus-contrib-*.tar ELPA package, which bundles -the core Org files plus many additional contributed libraries. - -All ELPA packages of Org contain: - -README_ELPA - This file. - -*.el - Elisp files. - -org - The Org info manual. - -orgcard.pdf - The Org reference card. - -etc/ - Libraries for the ODT exporter. - -org-*-pkg.el - The name of the package, requested GNU Emacs packaging system. diff --git a/elpa/org-9.3.6/dir b/elpa/org-9.3.6/dir deleted file mode 100644 index 6c75b5de..00000000 --- a/elpa/org-9.3.6/dir +++ /dev/null @@ -1,19 +0,0 @@ -This is the file .../info/dir, which contains the -topmost node of the Info hierarchy, called (dir)Top. -The first time you invoke Info you start off looking at this node. - -File: dir, Node: Top This is the top of the INFO tree - - This (the Directory node) gives a menu of major topics. - Typing "q" exits, "?" lists all Info commands, "d" returns here, - "h" gives a primer for first-timers, - "mEmacs" visits the Emacs manual, etc. - - In Emacs, you can click mouse button 2 on a menu item or cross reference - to select it. - -* Menu: - -Emacs -* Org Mode: (org). Outline-based notes management and organizer. -* Org Guide: (orgguide). Abbreviated Org mode manual. diff --git a/elpa/org-9.3.6/etc/ORG-NEWS b/elpa/org-9.3.6/etc/ORG-NEWS deleted file mode 100644 index d46d1bd7..00000000 --- a/elpa/org-9.3.6/etc/ORG-NEWS +++ /dev/null @@ -1,5202 +0,0 @@ -ORG NEWS -- history of user-visible changes. -*- mode: org; coding: utf-8 -*- - -#+STARTUP: overview - -#+LINK: doc https://orgmode.org/worg/doc.html#%s -#+LINK: git https://code.orgmode.org/bzg/org-mode/commit/%s - -Copyright (C) 2012-2020 Free Software Foundation, Inc. -See the end of the file for license conditions. - -Please send Org bug reports to mailto:emacs-orgmode@gnu.org. - -* Version 9.3 - -** Incompatible changes -*** Change bracket link escaping syntax - -Org used to percent-encode sensitive characters in the URI part of the -bracket links. - -Now, escaping mechanism uses the usual backslash character, according -to the following rules: - -1. All =[= and =]= characters in the URI must be escaped; -2. Every =\= character preceding either =[= or =]= must be escaped; -3. Every =\= character at the end of the URI must be escaped. - -When in doubt, use the function ~org-link-escape~ in order to turn -a link string into its properly escaped form. - -The following function will help switching your links to the new -syntax: - -#+begin_src emacs-lisp -(defun org-update-link-syntax (&optional no-query) - "Update syntax for links in current buffer. -Query before replacing a link, unless optional argument NO-QUERY -is non-nil." - (interactive "P") - (org-with-point-at 1 - (let ((case-fold-search t)) - (while (re-search-forward "\\[\\[[^]]*?%\\(?:2[05]\\|5[BD]\\)" nil t) - (let ((object (save-match-data (org-element-context)))) - (when (and (eq 'link (org-element-type object)) - (= (match-beginning 0) - (org-element-property :begin object))) - (goto-char (org-element-property :end object)) - (let* ((uri-start (+ 2 (match-beginning 0))) - (uri-end (save-excursion - (goto-char uri-start) - (re-search-forward "\\][][]" nil t) - (match-beginning 0))) - (uri (buffer-substring-no-properties uri-start uri-end))) - (when (or no-query - (y-or-n-p - (format "Possibly obsolete URI syntax: %S. Fix? " - uri))) - (setf (buffer-substring uri-start uri-end) - (org-link-escape (org-link-decode uri))))))))))) -#+end_src - -The old ~org-link-escape~ and ~org-link-unescape~ functions have been -renamed into ~org-link-encode~ and ~org-link-decode~. - -*** Change match group number in ~org-link-bracket-re~ - -Link description, if any, is located in match group 2 instead of match -group 3. - -*** ob-clojure does not auto prepend ~(ns ..)~ statement anymore - -When tangling, user usually just wants to tangle literally code instead -of prepend inserting a ~(ns ..)~ statement before source block -code. Now, when you have no ~:ns~ header argument specified, this -behavior will not happen automatically. - -*** Change in behavior on exit from an Org edit buffer - -Org will no longer attempt to restore the window configuration in the -frame to which the user returns after editing a source block with -~org-edit-src-code~. Instead, the window configuration will remain as -it is. - -*** Change default value for ~org-email-link-description-format~ - -When linking from a mail buffer, Org used to truncate the subject of -the message to 30 characters in order to build the description of the -link. This behavior was considered as too surprising. As -a consequence, Org no longer truncates subjects. - -You can get the old behavior back with the following: - -: (setq org-email-link-description-format "Email %c: %.30s") - -*** ~:file~ header argument no longer assume "file" ~:results~ - -The "file" ~:results~ value is now mandatory for a code block -returning a link to a file. The ~:file~ or ~:file-ext~ header -arguments no longer imply a "file" result is expected. - -*** Plain numbers are hours in Column View mode - -See [[git:3367ac9457]] for details. - -*** All LaTeX preview backends use now xcolor - -The dvipng backend was previously relying on fg and bg parameters to -be passed to the CLI. This didn't work when xcolor was directly or -indirectly used in the document (e.g. tkiz is a user of xcolor). Since -every other backend was already using xcolor to set fg and bg, the CLI -alternative was removed and there is no more a :use-xcolor options -since now it's implicitly always true. - -*** Org-Attach Git commit - -[[*Org-Attach has been refactored and extended][Refactoring of Org-Attach]] affected the Git commit functionality. Not -much, but the following changes are required if you still need to -auto-commit attachments to git: - -- Customization of ~org-attach-annex-auto-get~ needs to be renamed to - ~org-attach-git-annex-auto-get~. - -- Customization of ~org-attach-commit~ is no longer needed. Instead - one need to require the =org-attach-git= module in the startup. - -** New features -*** New option to wrap source code lines in HTML export - -When new option ~html-wrap-src-lines~ (with variable -~org-html-wrap-src-lines~) is non-nil, HTML export wraps source code -lines in HTML ~code~ elements. - -*** New option to handle schedules and deadlines in iCalendar export - -Export ignore done tasks with a deadline when -~org-icalendar-use-deadline~ contains ~event-if-todo-not-done~. -Likewise, scheduled done tasks are also ignored when -~org-icalendar-use-scheduled~ contains the same symbol. - -*** Add split-window-right option for src block edit window placement - -Given the increasing popularity of wide screen monitors, splitting -horizontally may make more sense than splitting vertically. An -option, ~split-window-right~, to request horizontal splitting has been -added to ~org-src-window-setup~. - -*** Org-Attach has been refactored and extended - -Org attach has been refactored and the functionality extended. It -should now be easier to understand how it works. A few improvements -and extra options have been added as well. - -From the initial comment in org-attach source-code: - -- Attachments are managed either by using a custom property DIR or by - using property ID from org-id. When DIR is defined, a location in - the filesystem is directly attached to the outline node. When - org-id is used, attachments are stored in a folder named after the - ID, in a location defined by ~org-attach-id-dir~. DIR has - precedence over ID when both parameters are defined for the current - outline node (also when inherited parameters are taken into - account). - -From now on inheritance requires no extra property and will adhere to -~org-attach-use-inheritance~ by default. Inheritance can be -customized to always be activated or never be activated in -~org-attach-use-inheritance~. - -The ATTACH_DIR property is deprecated in favor of the shorter -property DIR. Links to folders inside the DIR property can now be -declared as relative links. This is not enabled by default, but can -be set in ~org-attach-dir-relative~. - -When adding new attachment to the outline node the preferred way of -doing so can be customized. Take a look at -~org-attach-preferred-new-method~. It defaults to using ID since that -was the behavior before this change. - -If both DIR and ID properties are set on the same node, DIR has -precedence and will be used. - -One can now also choose to build attachment-directory-paths in a -customized way. This is an advanced topic, but in some case it makes -sense to parse an ID in a different way than the default one. Create -your own function and add it to the beginning of -~org-attach-id-to-path-function~list~ if you want to customize the ID -based folder structure. - -If you've used ATTACH_DIR properties to manage attachments, use the -following code to rename that property to DIR which supports the same -functionality. ATTACH_DIR_INHERIT is no longer supported and is -removed. - -#+begin_src emacs-lisp - (defun org-update-attach-properties () - "Change properties for Org-Attach." - (interactive) - (org-with-point-at 1 - (while (outline-next-heading) - (let ((DIR (org--property-local-values "ATTACH_DIR" nil))) - (when DIR - (org-set-property "DIR" (car DIR)) - (org-delete-property "ATTACH_DIR")))) - (org-delete-property-globally "ATTACH_DIR_INHERIT"))) -#+end_src - -For those who hate breaking changes, even though the changes are made -to clean things up; fear not. ATTACH_DIR will still continue to work. -It's just not documented any longer. When you get the chance, run the -code above to clean things up anyways! - -**** New hooks -Two hooks are added to org-attach: -- org-attach-after-change-hook -- org-attach-open-hook - -They are added mostly for internal restructuring purposes, but can -ofc. be used for other things as well. - -*** New link-type: Attachment - -Attachment-links are now first-class citizens. They mimic file-links -in everything they do but use the existing attachment-folder as a base -when expanding the links. Both =DIR= and =ID= properties are used to -try to resolve the links, in exactly the same way as Org-Attach uses -those properties. - -*** Handle overlay specification for notes in Beamer export - -This aligns Beamer notes with slide overlays. - -*** Add support for lettered lists in Texinfo - -Using =:enum A= or =:enum a= Texinfo attribute switches an otherwise -numbered list to a lettered list. - -*** Add a dispatcher command to insert dynamic blocks - -You can add new dynamic blocks with function -~org-dynamic-block-define~. All such dynamic blocks can be used by -~org-dynamic-block-insert-dblock~ command. - -*** Babel - -**** ob-emacs-lisp sets ~lexical-binding~ in Org edit buffers - -When editing an Elisp src block, the editing buffer's -~lexical-binding~ is set according to the src block's =:lexical= -parameter. - -**** Add LaTeX output support in PlantUML - -*** New minor mode to display headline numbering - -Use == to get a visual indication of the numbering -in the outline. The numbering is also automatically updated upon -changes in the buffer. - -*** New property =HTML_HEADLINE_CLASS= in HTML export - -The new property =HTML_HEADLINE_CLASS= assigns a class attribute to -a headline. - -*** Allow LaTeX attributes and captions for "table.el" tables - -Supported LaTeX attributes are ~:float~, ~:center~, ~:font~ and -~:caption~. - -*** Attach buffer contents to headline - -With == key from attachment dispatcher (==), it is now -possible to write the contents of a buffer to a file in the headline -attachment directory. - -*** iCalendar export respects a =CLASS= property - -Set the =CLASS= property on an entry to specify a visibility class for -that entry only during iCalendar export. The property can be set to -anything the calendar server supports. The iCalendar standard defines -the values =PUBLIC=, =CONFIDENTIAL=, =PRIVATE=, which can be -interpreted as publicly visible, accessible to a specific group, and -private respectively. - -This property can be inherited during iCalendar export, depending on -the value of ~org-use-property-inheritance~. - -*** New parameter for =INCLUDE= keyword - -Add =:coding CODING-SYSTEM= to include files using a different coding -system than the main Org document. For example: - -#+begin_example -,#+INCLUDE: "myfile.cmd" src cmd :coding cp850-dos -#+end_example - -*** New values in clock tables' step: =month= and =year= -*** ODT export handles numbers cookies in lists -*** New cell movement functions in tables - -~S-~, ~S-~, ~S-~, and ~S-~ now move cells in -the corresponding direction by swapping with the adjacent cell. - -*** New option to natively fontify LaTeX snippets and environments - -A 'native option was added to org-highlight-latex-and-related. It -matches the same structures than 'latex but it calls -org-src-font-lock-fontify-block instead, thus bringing about full -LaTeX font locking. - -*** ~org-clone-subtree-with-time-shift~ learned to shift backward in time - -== (~org-clone-subtree-with-time-shift~) now takes a -negative value as a valid repeater to shift time stamps in backward -in cloned subtrees. You can give, for example, ‘-3d’ to shift three -days in the past. - -*** Toggle display of all vs. undone scheduled habits conveniently - -== (~org-habit-toggle-display-in-agenda~) in an agenda toggles -the display of all habits to those which are undone and scheduled. -This is a function for convenience. - -*** New parameter for SQL Babel blocks: ~:dbconnection~ - -The new parameter ~:dbconnection~ allows to specify a connection name -in a SQL block header: this name is used to look up connection -parameters in ~sql-connection-alist~. - -*** New =:scale= attribute supported by LaTeX exporters - -The builtin "latex" exporters now accept and use a =:scale= attribute, -which scales an image by a given factor. - -This attribute is wrapped around the =scale= parameter of LaTeX's -=\includegraphics= (bitmap images) or a TiKZ's =\scalebox=. -Therefore, its value should be some string palatable to LaTeX as -a positive float Its default value is an empty string (i.e. disabled). - -This attribute overrides the =:width= and =:height= attributes. - -#+begin_example -,#+name: Beastie -,#+caption: I think I saw this curious horse already, but where ? -,#+LATEX_ATTR: :scale 2 -[[https://orgmode.org/img/org-mode-unicorn-logo.png]] -#+end_example - -*** Allow specifying the target for a table of contents - -The =+TOC= keyword now accepts a =:target:= attribute that specifies -the headline to use for making the table of contents. - -#+begin_example -,* Target - :PROPERTIES: - :CUSTOM_ID: TargetSection - :END: -,** Heading A -,** Heading B -,* Another section -,#+TOC: headlines 1 :target "#TargetSection" -#+end_example - -** New functions -*** ~org-dynamic-block-insert-dblock~ - -Use default keybinding == to run command -~org-dynamic-block-insert-dblock~. It will prompt user to select -dynamic block in ~org-dynamic-block-alist~. - -*** ~org-table-cell-up~ -*** ~org-table-cell-down~ -*** ~org-table-cell-left~ -*** ~org-table-cell-right~ -*** ~org-habit-toggle-display-in-agenda~ -** Removed functions and variables -*** Removed Org Drill - -You can install it back from MELPA. - -*** ~org-babel-set-current-result-hash~ -*** ~org-capture-insert-template-here~ -*** ~org-attach-directory~ - -It has been deprecated in favor of ~org-attach-id-dir~ which is less -ambiguous given the restructured org-attach. - -*** ~org-enable-fixed-width-editor~ - -This variable was not used through the code base. - -** Miscellaneous -*** Change signature for ~org-list-to-subtree~ - -The function now accepts the level of the subtree as an optional -argument. It no longer deduces it from the current level. - -*** LaTeX preview is simplified - -Function ~org-latex-preview~, formerly known as -~org-toggle-latex-fragment~, has a hopefully simpler and more -predictable behavior. See its docstring for details. - -*** ~org-table-copy-down~ supports patterns - -When ~org-table-copy-increment~ is non-nil, it is now possible to -increment fields like =A1=, or =0A=, i.e., any string prefixed or -suffixed with a whole number. - -*** No more special indentation for description items - -Descriptions items are indented like regular ones, i.e., text starts -after the bullet. Special indentation used to introduce bugs when -inserting sub-items in a description list. - -*** New hook: ~org-todo-repeat-hook~ - -This hook was actually introduced in Org 9.2.1, but wasn't advertised. - -*** Org Table reads numbers starting with 0 as strings -*** Disable fast tag selection interface via prefix arg - -A call of ~org-set-tags-command~ with prefix argument C-u C-u avoids -the fast tag selection interface and instead offers the plain -interface. - -*** ~:mkdirp~ now supports create directory for ~:dir~ path - -The ~:mkdirp~ header argument used to only work for ~:tangle~ tangle -files. Now ~:mkdirp~ works for ~:dir~ too. This is more convenient for -specify default directory and with ~:file~ header argument. - -*** New variable: ~org-agenda-breadcrumbs-separator~ - -If breadcrumbs are showed in org-agenda with the help of "%b" format -in ~org-agenda-prefix-format~, user can customize breadcrumbs's -separator using ~org-agenda-breadcrumbs-separator~. - -*** New variable ~org-attach-commands~ - -This variable makes it possible to customize the list of commands for -the attachment dispatcher. - -*** New ID method based on timestamp - -If one chooses, it is now possible to create ID's based on timestamp -(ISO8601) instead of UUID by changing org-id-method to ts. - -For an improved folder structure when using timestamp as ID, make sure -to promote ~org-attach-id-ts-folder-format~ to the first element of -~org-attach-id-to-path-function-list~ in your configuration at the -same time. - -*** New customization: ~org-id-locations-relative~ - -New customization to make the persisting of org-id-locations between -sessions to store links to files as relative instead of absolute. The -links will be stored as relative to the path of org-id-locations-file. - -*** ~org-ctrl-c-tab~ is functional before the first headline - -I.e. treat the whole file as if it was a subtree. - -Also fold everything below the chosen level. Former behavior was to -leave unfolded subtrees unfolded. - -*** ~org-kill-note-or-show-branches~ is functional before the first headline - -I.e. treat the whole file as if it was a subtree. - -*** Respect narrowing when agenda command is restricted to buffer - -* Version 9.2 -** Incompatible changes -*** Removal of OrgStruct mode mode and radio lists - -OrgStruct minor mode and radio lists mechanism (~org-list-send-list~ -and ~org-list-radio-lists-templates~) are removed from the code base. - -Note that only radio /lists/ have been removed, not radio tables. - -If you want to manipulate lists like in Org in other modes, we suggest -to use orgalist.el, which you can install from GNU ELPA. - -If you want to use Org folding outside of Org buffers, you can have a -look at the outshine package in the MELPA repository. - -*** Change in the structure template expansion - -Org 9.2 comes with a new template expansion mechanism, combining -~org-insert-structure-template~ bound to ~C-c C-,~. - -If you customized the ~org-structure-template-alist~ option manually, -you probably need to update it, see the docstring for accepted values. - -If you prefer using previous patterns, e.g. => - ,#+END_SRC -#+END_SRC - -should become - -#+BEGIN_SRC org - ,#+NAME: foo - ,#+BEGIN_SRC emacs-lisp :noweb-ref bar - 1 - ,#+END_SRC - - ,#+BEGIN_SRC emacs-lisp :noweb-ref bar - 2 - ,#+END_SRC - - ,#+BEGIN_SRC emacs-lisp :noweb yes - <> - ,#+END_SRC -#+END_SRC - -*** Default/accepted values of ~org-calendar-to-agenda-key~ - -The default value and accepted value of ~org-calendar-to-agenda-key~ -changed. This is an excerpt of the new docstring: - -: When set to ‘default’, bind the function to ‘c’, but only if it is -: available in the Calendar keymap. This is the default choice because -: ‘c’ can then be used to switch back and forth between agenda and calendar. -: -: When nil, ‘org-calendar-goto-agenda’ is not bound to any key. - -Check the full docstring for more. - -*** Change the signature of the ~org-set-effort~ function - -Here is the new docstring: - -: (org-set-effort &optional INCREMENT VALUE) -: -: Set the effort property of the current entry. -: If INCREMENT is non-nil, set the property to the next allowed -: value. Otherwise, if optional argument VALUE is provided, use -: it. Eventually, prompt for the new value if none of the previous -: variables is set. - -*** Placeholders in =(eval ...)= macros are always strings - -Within =(eval ...)= macros, =$1=-like placeholders are always replaced -with a string. As a consequence, they must not be enclosed within -quotes. As an illustration, consider the following, now valid, -examples: - -#+begin_example - ,#+macro: join (eval (concat $1 $2)) - ,#+macro: sum (eval (+ (string-to-number $1) (string-to-number $2))) - - {{{join(a,b)}}} => ab - {{{sum(1,2)}}} => 3 -#+end_example - -However, there is no change in non-eval macros: - -#+begin_example - ,#+macro: disp argument: $1 - - {{{disp(text)}}} => argument: text -#+end_example - -*** =align= STARTUP value no longer narrow table columns - -Columns narrowing (or shrinking) is now dynamic. See [[*Dynamically -narrow table columns]] for details. In particular, it is decoupled from -aligning. - -If you need to automatically shrink columns upon opening an Org -document, use =shrink= value instead, or in addition to align: - -#+BEGIN_EXAMPLE -,#+STARTUP: align shrink -#+END_EXAMPLE - -*** ~org-get-tags~ meaning change - -Function ~org-get-tags~ used to return local tags to the current -headline. It now returns all the inherited tags in addition to the -local tags. In order to get the old behavior back, you can use: - -: (org-get-tags nil t) - -*** Alphabetic sorting in tables and lists - -When sorting alphabetically, ~org-table-sort-lines~ and ~org-sort-list~ -now sort according to the locale’s collation rules instead of by -code-point. - -*** Change the name of the :tags clocktable option to :match - -The =:match= (renamed from =:tags=) option allows to limit clock entries -to those matching a todo-tags matcher. - -The old =:tags= option can be set to =t= to display a headline's tags in a -dedicated column. - -This is consistent with the naming of =org-dblock-write:columnview= -options, where =:match= is also used as a headlines filter. - -** New features -*** Add ~:session~ support of ob-clojure for CIDER -You can initialize source block session with Babel default keybinding -=[C-c C-v C-z]= to use =sesman= session manager to link current -project, directory or buffer with specific Clojure session, or -=cider-jack-in= a new CIDER REPL if no CIDER REPLs available. In older -CIDER version which has not =sesman= integrated, only has -=cider-jack-in= without Clojure project is supported. -#+begin_src clojure :session -(dissoc Clojure 'JVM) -(conj clojurists "stardiviner") -#+end_src -*** Add ~:results link~ support for Babel - -With this output format, create a link to the file specified in -~:file~ header argument, without actually writing any result to it: - -#+begin_example -,#+begin_src shell :dir "data/tmp" :results link :file "crackzor_1.0.c.gz" -wget -c "http://ben.akrin.com/crackzor/crackzor_1.0.c.gz" -,#+end_src - -,#+results: -[[file:data/tmp/crackzor_1.0.c.gz]] -#+end_example - -*** Add ~:session~ support of ob-js for js-comint -#+begin_src js :session "*Javascript REPL*" -console.log("stardiviner") -#+end_src -*** Add ~:session~ support of ob-js for Indium -#+begin_src js :session "*JS REPL*" -console.log("stardiviner") -#+end_src -*** Add ~:session~ support of ob-js for skewer-mode -#+begin_src js :session "*skewer-repl*" -console.log("stardiviner") -#+end_src -*** Add support for links to LaTeX equations in HTML export -Use MathJax links when enabled (by ~org-html-with-latex~), otherwise -add a label to the rendered equation. -*** Org Tempo may used for snippet expansion of structure template. -See manual and the commentary section in ~org-tempo.el~ for details. -*** Exclude unnumbered headlines from table of contents -Set their =UNNUMBERED= property to the special =notoc= value. See -manual for details. -*** ~org-archive~ functions update status cookies - -Archiving headers through ~org-archive-subtree~ and -~org-archive-to-archive-sibling~ such as the ones listed below: - -#+BEGIN_SRC org - ,* Top [1/2] - ,** DONE Completed - ,** TODO Working -#+END_SRC - -Will update the status cookie in the top level header. - -*** Disable =org-agenda-overriding-header= by setting to empty string - -The ~org-agenda-overriding-header~ inserted into agenda views can now -be disabled by setting it to an empty string. - -*** Dynamically narrow table columns - -With ~C-c TAB~, it is now possible to narrow a column to the width -specified by a width cookie in the column, or to 1 character if there -is no such cookie. The same keybinding expands a narrowed column to -its previous state. - -Editing the column automatically expands the whole column to its full -size. - -*** =org-columns-summary-types= entries can take an optional COLLECT function - -You can use this to make collection of a property from an entry -conditional on another entry. E.g. given this configuration: - -#+BEGIN_SRC emacs-lisp - (defun custom/org-collect-confirmed (property) - "Return `PROPERTY' for `CONFIRMED' entries" - (let ((prop (org-entry-get nil property)) - (confirmed (org-entry-get nil "CONFIRMED"))) - (if (and prop (string= "[X]" confirmed)) - prop - "0"))) - - (setq org-columns-summary-types - '(("X+" org-columns--summary-sum - custom/org-collect-confirmed))) -#+END_SRC - -You can have a file =bananas.org= containing: - -#+BEGIN_SRC org - ,#+columns: %ITEM %CONFIRMED %Bananas{+} %Bananas(Confirmed Bananas){X+} - - ,* All shipments - ,** Shipment 1 - :PROPERTIES: - :CONFIRMED: [X] - :Bananas: 4 - :END: - - ,** Shipment 2 - :PROPERTIES: - :CONFIRMED: [ ] - :BANANAS: 7 - :END: -#+END_SRC - -... and when going to the top of that file and entering column view -you should expect to see something like: - -| ITEM | CONFIRMED | Bananas | Confirmed Bananas | -|---------------+-----------+---------+-------------------| -| All shipments | | 11 | 4 | -| Shipment 1 | [X] | 4 | 4 | -| Shipment 2 | [ ] | 7 | 7 | - -#+BEGIN_EXAMPLE - ,#+STARTUP: shrink -#+END_EXAMPLE -*** Allow to filter by tags/property when capturing colview - -You can now use =:match= to filter entries using a todo/tags/properties -matcher. - -*** Add support for Oracle's database alias in Babel blocks -=ob-sql= library already support running SQL blocks against an Oracle -database using ~sqlplus~. Now it's possible to use alias names -defined in =TNSNAMES= file instead of specifying full connection -parameters. See example below. - -#+BEGIN_SRC org - you can use the previous full connection parameters - ,#+BEGIN_SRC sql :engine oracle :dbuser me :dbpassword my_insecure_password :database my_db_name :dbhost my_db_host :dbport 1521 - select sysdate from dual; - ,#+END_SRC - - or the alias defined in your TNSNAMES file - ,#+BEGIN_SRC sql :engine oracle :dbuser me :dbpassword my_insecure_password :database my_tns_alias - select sysdate from dual; - ,#+END_SRC -#+END_SRC - -*** ~org-agenda-set-restriction-lock~ toggle agenda restriction at point - -You can set an agenda restriction lock with =C-x C-x <= or with =<= at the -beginning of a headline when using Org speed commands. Now, if there -is already a restriction at point, hitting =<= again (or =C-x C-x <=) will -remove it. - -*** Headlines can now link to themselves in HTML export - -When enabling ~org-html-self-link-headlines~ the headlines exported to -HTML contain a hyperlink to themselves. - -** New commands and functions - -*** ~org-insert-structure-template~ - -This function can be used to wrap existing text of Org elements in -a #+BEGIN_FOO/#+END_FOO block. Bound to C-c C-x w by default. - -*** ~org-export-excluded-from-toc-p~ - -See docstring for details. - -*** ~org-timestamp-to-time~ -*** ~org-timestamp-from-string~ -*** ~org-timestamp-from-time~ -*** ~org-attach-dired-to-subtree~ - -See docstring for details. - -*** ~org-toggle-narrow-to-subtree~ - -Toggle the narrowing state of the buffer: when in a narrowed state, -widen, otherwise call ~org-narrow-to-subtree~ to narrow. - -This is attached to the "s" speed command, so that hitting "s" twice -will go back to the widen state. - -*** ~org-browse-news~ - -Browse https://orgmode.org/Changes.html to let users read information -about the last major release. - -There is a new menu entry for this in the "Documentation" menu item. - -*** ~org-info-find-node~ - -From an Org file or an agenda switch to a suitable info page depending -on the context. - -The function is bound to =C-c C-x I=. - -** Removed commands and functions -*** ~org-outline-overlay-data~ -Use ~org-save-outline-visibility~ instead. -*** ~org-set-outline-overlay-data~ -Use ~org-save-outline-visibility~ instead. -*** ~org-get-string-indentation~ -It was not used throughout the code base. -*** ~org-fix-indentation~ -It was not used throughout code base. -*** ~org-context-p~ -Use ~org-element-at-point~ instead. -*** ~org-preserve-lc~ -It is no longer used in the code base. -*** ~org-try-structure-completion~ -Org Tempo may be used as a replacement. See details above. -** Removed options - -*** org-babel-use-quick-and-dirty-noweb-expansion - -See [[*Change to Noweb expansion][Change to Noweb expansion]] for explanations. - -** Miscellaneous - -*** New default value for ~org-texinfo-table-scientific-notation~ - -It is now nil, which means numbers in scientific notation are not -handled specially by default. - -*** New default value for ~org-latex-table-scientific-notation~ - -It is now nil, which means numbers in scientific notation are not -handled specially by default. - -*** New face: ~org-upcoming-distant-deadline~ - -It is meant to be used as the face for distant deadlines, see -~org-agenda-deadline-faces~ - -*** ~org-paste-subtree~ no longer breaks sections - -Unless point is at the beginning of a headline, ~org-paste-subtree~ -now pastes the tree before the next visible headline. If you need to -break the section, use ~org-yank~ instead. - -*** ~org-table-insert-column~ inserts a column to the right - -It used to insert it on the left. With this change, -~org-table-insert-column~ and ~org-table-delete-column~ are -reciprocal. - -*** ~org-publish-resolve-external-link~ accepts a new optional argument. -*** ~org-irc.el~ now supports exporting =irc:= links properly - -Previously, irc links were exported by ~ox-md~ and ~ox-html~ as normal -file links, which lead to them being broken in web browsers. Now both -of these exporters will properly export to =irc:= links, which will -open properly in irc clients from web browsers. - -*** ~org-comment-dwim~ (bound to =M-;=) now comments headings, if point is on a heading -*** Add support for open source block in window below - -Set option ~org-src-window-setup~ to ~split-window-below~. - -*** Alphabetic sorting in headings and tags now uses the locale’s sorting rules - -When sorting alphabetically, ~org-sort-entries~ and -~org-tags-sort-function~ now sort according to the locale’s collation -rules instead of by code-point. -*** New speed command "k" to kill (cut) the subtree at point -* Version 9.1 - -** Incompatible changes - -*** Variables relative to clocksum duration are obsolete - -~org-time-clocksum-format~, ~org-time-clocksum-use-fractional~ and -~org-time-clocksum-fractional-format~ are obsolete. If you changed -them, consider modifying ~org-duration-format~ instead. - -Variable ~org-time-clocksum-use-effort-durations~ is also obsolete. -Consider setting ~org-duration-units~ instead. - -*** ~org-at-timestamp-p~ optional argument accepts different values - -See docstrings for the allowed values. For backward compatibility, -~(org-at-timestamp-p t)~ is still supported, but should be updated -accordingly. - -*** ~org-capture-templates~ no longer accepts S-expressions as file names - -Since functions are allowed there, a straightforward way to migrate -is to turn, e.g., - -: (file (sexp)) - -into - -: (file (lambda () (sexp))) - -*** Deleted contributed packages - -=org-ebib.el, =org-bullets.el= and =org-mime.el= have been deleted -from the contrib/ directory. - -You can now find them here : - -- https://github.com/joostkremers/ebib -- https://github.com/sabof/org-bullets -- https://github.com/org-mime/org-mime - -*** Change ~org-texinfo-classes~ value -The value cannot support functions to create sectioning commands -anymore. Also, the sectioning commands should include commands for -appendices. See the docstring for more information. -*** Removal of ~:sitemap-sans-extension~ - -The publishing property is no longer recognized, as a consequence of -changes to site-map generation. - -You can get the same functionality by setting ~:sitemap-format-entry~ -to the following - -#+BEGIN_SRC elisp -(lambda (entry style project) - (cond ((not (directory-name-p entry)) - (format "[[file:%s][%s]]" - (file-name-sans-extension entry) - (org-publish-find-title entry project))) - ((eq style 'tree) (file-name-nondirectory (directory-file-name entry))) - (t entry))) -#+END_SRC - -*** Change signature for ~:sitemap-function~ - -~:sitemap-function~ now expects to be called with two arguments. See -~org-publish-project-alist~ for details. - -*** Change signature for some properties in ~org-list-to-generic~ - -~:istart~, ~:icount~, ~:iend~ and ~:isep~ now expect the type of the -list as their first argument. - -*** Change signature for ~org-get-repeater~ -The optional argument is now a string to extract the repeater from. -See docstring for details. - -*** Change signature for ~org-time-string-to-time~ -See docstring for changes. - -*** Change order of items in ~org-agenda-time-grid~ -~org-agenda-time-grid~ gained an extra item to allow users to customize -the string displayed after times in the agenda. See docstring for -details. - -*** ~tags-todo~ custom searches now include DONE keywords - -Use "/!" markup when filtering TODO keywords to get only not-done TODO -keywords. - -*** ~org-split-string~ returns ~("")~ when called on an empty string -It used to return nil. -*** Removal of =ob-scala.el= - -See [[https://github.com/ensime/emacs-scala-mode/issues/114][this github issue]]. - -You can use =ob-scala.el= as packaged in scala-mode, available from the -MELPA repository. - -** New features -*** iCalendar export uses inheritance for TIMEZONE and LOCATION properties -Both these properties can be inherited during iCalendar export, -depending on the value of ~org-use-property-inheritance~. -*** iCalendar export respects a TIMEZONE property -Set the TIMEZONE property on an entry to specify a time zone for that -entry only during iCalendar export. The property value should be -specified as in "Europe/London". -*** ~org-attach~ can move directory contents -When setting a new directory for an entry, org-attach offers to move -files over from the old directory. Using a prefix arg will reset the -directory to old, ID based one. -*** New Org duration library -This new library implements tools to read and print time durations in -various formats (e.g., "H:MM", or "1d 2h 3min"...). - -See ~org-duration-to-minutes~ and ~org-duration-from-minutes~ -docstrings. - -*** Agenda -**** New variable : ~org-agenda-show-future-repeats~ -**** New variable : ~org-agenda-prefer-last-repeat~ -**** New variable : ~org-deadline-past-days~ -See docstring for details. -**** Binding C-c C-x < for ~org-agenda-set-restriction-lock-from-agenda~ -**** New auto-align default setting for =org-agenda-tags-column= - -=org-agenda-tags-column= can now be set to =auto=, which will -automatically align tags to the right edge of the window. This is now -the default setting. -*** New value for ~org-publish-sitemap-sort-folders~ - -The new ~ignore~ value effectively allows toggling inclusion of -directories in published site-maps. - -*** Babel - -**** Scheme: support for tables -**** Scheme: new variable: ~org-babel-scheme-null-to~ - -This new custom option allows you to use an empty list or null symbol to -format the table output, initially assigned to ~hlines~. - -**** Scheme: new header ~:prologue~ - -A new block code header has been created for Org Babel that enables -developers to prepend code to the scheme block being processed. - -Multiple ~:prologue~ headers can be added each of them using a string -with the content to be added. - -The scheme blocks are prepared by surrounding the code in the block -with a let form. The content of the ~:prologue~ headers are prepended -before this let form. - -**** Support for hledger accounting reports added -**** Clojure: new setting ~org-babel-clojure-sync-nrepl-timeout~ - -Creation of a new setting to specify the Cider timeout. By setting -the =org-babel-clojure-sync-nrepl-timeout= setting option. The value -is in seconds and if set to =nil= then no timeout will occur. -**** Clojure: new header ~:show-process~ - -A new block code header has been created for Org Babel that enables -developers to output the process of an ongoing process into a new -window/buffer. - -You can tell Org Babel to output the process of a running code block. - -To show that output you only have to specify the =:show-process= -option in the code block's header like this: - -#+begin_example -,#+BEGIN_SRC clojure :results output :show-process t - (dotimes [n 10] - (println n ".") - (Thread/sleep 500)) -,#+END_SRC -#+end_example - -If =:show-process= is specified that way, then when you will run the -code using =C-c C-c= a new window will open in Emacs. Everything that -is output by the REPL will immediately be added to that new window. - -When the processing of the code is finished, then the window and its -buffer will be closed and the results will be reported in the -=#+RESULTS= section. - -Note that the =:results= parameter's behavior is *not* changed. If -=silent= is specified, then no result will be displayed. If =output= -is specified then all the output from the window will appears in the -results section. If =value= is specified, then only the last returned -value of the code will be displayed in the results section. - -**** Maxima: new headers ~:prologue~ and ~:epilogue~ -Babel options ~:prologue~ and ~:epilogue~ have been implemented for -Maxima source blocks which prepend and append, respectively, the given -code strings. This can be useful for specifying formatting settings -which would add clutter to exported code. For instance, you can use -this ~:prologue "fpprintprec: 2; linel: 50;"~ for presenting Maxima -results in a beamer presentation. -**** PlantUML: add support for header arguments - -[[http://plantuml.com/][Plantuml]] source blocks now support the [[https://orgmode.org/manual/prologue.html#prologue][~:prologue~]], [[https://orgmode.org/manual/epilogue.html#epilogue][~:epilogue~]] and -[[https://orgmode.org/manual/var.html#var][~:var~]] header arguments. - -**** SQL: new engine added ~sqsh~ - -A new engine was added to support ~sqsh~ command line utility for use -against Microsoft SQL Server or Sybase SQL server. - -More information on ~sqsh~ can be found here: [[https://sourceforge.net/projects/sqsh/][sourceforge/sqsh]] - -To use ~sqsh~ in an *sql* =SRC_BLK= set the =:engine= like this: - -#+begin_example -,#+BEGIN_SRC sql :engine sqsh :dbhost my_host :dbuser master :dbpassword pass :database support -Select * From Users -Where clue > 0 -,#+END_SRC -#+end_example - -**** SQL: new engine added =vertica= - -A new engine was added to support vsql command line utility for use -against HP Vertica. - -More information on =vsql= can be found here: [[https://my.vertica.com/docs/7.2.x/HTML/index.htm#Authoring/ConnectingToHPVertica/vsql/UsingVsql.htm][my.vertica.com]] - -To use =vertica= in an sql =SRC_BLK= set the =:engine= like this: - -#+BEGIN_EXAMPLE - ,#+BEGIN_SRC sql :engine vertica :dbhost my_host :dbuser dbadmin :dbpassword pw :database vmart - SELECT * FROM nodes; - ,#+END_SRC -#+END_EXAMPLE -**** C++: New header ~:namespaces~ - -The new ~:namespaces~ export option can be used to specify namespaces -to be used within a C++ org source block. Its usage is similar to -~:includes~, in that it can accept multiple, space-separated -namespaces to use. This header is equivalent to adding ~using -namespace ;~ in the source block. Here is a "Hello World" in C++ -using ~:namespaces~: - -#+begin_example - ,#+BEGIN_SRC C++ :results output :namespaces std :includes - cout << "Hello World" << endl; - ,#+END_SRC -#+end_example - -**** Support for Vala language - -[[https://wiki.gnome.org/Projects/Vala][Vala]] language blocks support two special header arguments: - -- ~:flags~ passes arguments to the compiler -- ~:cmdline~ passes commandline arguments to the generated executable - -Support for [[https://orgmode.org/manual/var.html#var][~:var~]] does not exist yet, also there is no [[https://orgmode.org/manual/session.html#session][~:session~]] -support because Vala is a compiled language. - -The Vala compiler binary can be changed via the ~defcustom~ -~org-babel-vala-compiler~. - -*** New ~function~ scope argument for the Clock Table -Added a nullary function that returns a list of files as a possible -argument for the scope of the clock table. -*** Export -**** Implement vernacular table of contents in Markdown exporter -Global table of contents are generated using vanilla Markdown syntax -instead of HTML. Also #+TOC keyword, including local table of -contents, are now supported. -**** Add Slovenian translations -**** Implement ~org-export-insert-image-links~ -This new function is meant to be used in back-ends supporting images -as descriptions of links, a.k.a. image links. See its docstring for -details. -**** New macro : ~{{{n}}}~ -This macro creates and increment multiple counters in a document. See -manual for details. -**** Add global macros through ~org-export-global-macros~ -With this variable, one can define macros available for all documents. -**** New keyword ~#+EXPORT_FILE_NAME~ -Similarly to ~:EXPORT_FILE_NAME:~ property, this keyword allows the -user to specify the name of the output file upon exporting the -document. This also has an effect on publishing. -**** Horizontal rules are no longer ignored in LaTeX table math mode -**** Use ~compilation-mode~ for compilation output -**** Plain lists accept a new ~:separator~ attribute in Texinfo - -The new ~:separator~ attribute splits a tag from a description list -item into multiple parts. This allows to have two-column tables with -multiple entries in the first column. See manual for more details. - -**** ~latex-environment~ elements support ~caption~ keywords for LaTeX export -*** ~org-edit-special~ can edit LaTeX environments - -Using ~C-c '~ on a LaTeX environment opens a sub-editing buffer. By -default, major mode in that buffer is ~latex-mode~, but it can be -changed by configuring ~org-src-lang-modes~. - -*** ~org-list-to-generic~ includes a new property: ~:ifmt~ - -~:ifmt~ is a function to be called on the body of each item. See -~org-list-to-generic~ documentation for details. - -*** New variable : ~org-bibtex-headline-format-function~ -This allow to use a different title than entry title. - -*** ~org-attach~ supports attaching files from URLs - -Using ~C-c C-a u~ prompts for a URL pointing to a file to be attached -to the document. - -*** New option for ~org-refile-use-outline-path~ -~org-refile-use-outline-path~ now supports the setting ~buffer-name~, -which causes refile targets to be prefixed with the buffer’s -name. This is particularly useful when used in conjunction with -~uniquify.el~. - -*** ~org-file-contents~ now allows the FILE argument to be a URL. -This allows ~#+SETUPFILE:~ to accept a URL instead of a local file -path. The URL contents are auto-downloaded and saved to a temporary -cache ~org--file-cache~. A new optional argument ~NOCACHE~ is added -to ~org-file-contents~. - -*** ~org-mode-restart~ now resets the newly added ~org--file-cache~. -Using ~C-c C-c~ on any keyword (like ~#+SETUPFILE~) will reset the -that file cache. - -*** New option : ~org-table-duration-hour-zero-padding~ -This variable allow computed durations in tables to be zero-padded. - -*** New mode switch for table formulas : =U= -This mode omits seconds in durations. - -** Removed functions - -*** Org Timeline - -This feature has been removed. Use a custom agenda view, possibly -narrowed to current buffer to achieve a similar functionality. - -*** ~org-agenda-skip-entry-when-regexp-matches~ is obsolete - -Use ~org-agenda-skip-if~ instead. - -*** ~org-agenda-skip-subtree-when-regexp-matches~ is obsolete - -Use ~org-agenda-skip-if~ instead. - -*** ~org-agenda-skip-entry-when-regexp-matches-in-subtree~ is obsolete - -Use ~org-agenda-skip-if~ instead. - -*** ~org-minutes-to-clocksum-string~ is obsolete - -Use ~org-duration-from-minutes~ instead. - -*** ~org-hh:mm-string-to-minutes~ is obsolete - -Use ~org-duration-to-minutes~ instead. - -*** ~org-duration-string-to-minutes~ is obsolete - -Use ~org-duration-to-minutes~ instead. - -*** ~org-gnus-nnimap-cached-article-number~ is removed. - -This function relied on ~nnimap-group-overview-filename~, which was -removed from Gnus circa September 2010. - -** Removed options - -*** ~org-agenda-repeating-timestamp-show-all~ is removed. - -For an equivalent to a ~nil~ value, set -~org-agenda-show-future-repeats~ to nil and -~org-agenda-prefer-last-repeat~ to ~t~. - -*** ~org-gnus-nnimap-query-article-no-from-file~ is removed. - -This variable has no effect, as it was relying on a function that was -removed from Gnus circa September 2010. - -*** ~org-usenet-links-prefer-google~ is obsolete. - -Use ~org-gnus-prefer-web-links~ instead. - -*** ~org-publish-sitemap-file-entry-format~ is deprecated - -One can provide new ~:sitemap-format-entry~ property for a function -equivalent to the removed format string. - -*** ~org-enable-table-editor~ is removed. - -Setting it to a ~nil~ value broke some other features (e.g., speed -keys). - -*** ~org-export-use-babel~ cannot be set to ~inline-only~ - -The variable is now a boolean. - -*** ~org-texinfo-def-table-markup~ is obsolete - -Use ~org-texinfo-table-default-markup~ instead. - -** New functions - -*** ~org-publish-find-property~ - -This function can be used as a tool to format entries in a site-map, -in addition to ~org-publish-find-title~ and ~org-publish-find-date~. - -*** ~org-list-to-org~ - -It is the reciprocal of ~org-list-to-lisp~, which see. - -*** ~org-agenda-set-restriction-lock-from-agenda~ - -Call ~org-agenda-set-restriction-lock~ from the agenda. - -** Miscellaneous - -*** The Library of Babel now on Worg - -The library-of-babel.org used to be accessible from the =doc/= -directory, distributed with Org’s core. It is now accessible -from the Worg community-driven documentation [[https://orgmode.org/worg/library-of-babel.html][here]]. - -If you want to contribute to it, please see [[https://orgmode.org/worg/org-contribute.html][how to contribute]]. - -*** Allow multiple columns view - -Columns view is not limited to a single buffer anymore. -*** Org Attach obeys ~dired-dwim-target~ - -When a Dired buffer is opened next to the Org document being edited, -the prompt for file to attach can start in the Dired buffer's -directory if `dired-dwim-target' in non-nil. - -*** ~org-fill-paragraph~ can now fill a whole region -*** More specific anniversary descriptions - -Anniversary descriptions (used in the agenda view, for instance) -include the point in time, when the anniversary appears. This is, -in its most general form, just the date of the anniversary. Or -more specific terms, like "today", "tomorrow" or "in n days" are -used to describe the time span. - -This feature allows to automatically change the description of an -anniversary, depending on if it occurs in the next few days or -far away in the future. - -*** Computed dates in tables appear as inactive time stamps - -*** Save point before opening a file with an unknown search option - -When following a file link with a search option (e.g., =::#custom-id=) -that doesn't exist in the target file, save position before raising an -error. As a consequence, it is possible to jump back to the original -document with ~org-mark-ring-goto~ (default binding =C-c &=). - -*** ~org-get-heading~ accepts two more optional arguments - -See docstring for details. - -*** New option ~org-babel-uppercase-example-markers~ - -This variable is a ~defcustom~ and replaces the variable -~org-babel-capitalize-example-region-markers~, which is a ~defvar~ and -is now obsolete. -*** =INCLUDE= keywords in commented trees are now ignored. -*** Default value for ~org-texinfo-text-markup-alist~ changed. - -Now ~=...=~ markup uses ~@samp{}~ instead of ~@verb{}~. You can use -~@verb{}~ again by customizing the variable. -*** Texinfo exports example blocks as ~@example~ -*** Texinfo exports inline source blocks as ~@code{}~ -*** Texinfo default table markup is ~@asis~ -It used to be ~@samp~ but ~@asis~ is neutral and, therefore, more -suitable as a default value. -*** Texinfo default process includes ~--no-split~ option -*** New entities : ~\dollar~ and ~\USD~ -*** Support for date style URLs in =org-protocol://open-source= - URLs like =https://cool-blog.com/2017/05/20/cool-post/= are - covered by rewrite rules. - -*** Add (C) =COMMENT= support to ~org-structure-template-alist~ - -* Version 9.0 - -** Incompatible changes - -*** Emacs 23 support has been dropped - -From now on, Org expects at least Emacs 24.3, although Emacs 24.4 or -above is suggested. - -*** XEmacs support has been dropped - -Incomplete compatibility layer with XEmacs has been removed. If you -want to take over maintenance of this compatibility, please contact -our mailing list. - -*** New syntax for export blocks - -Export blocks are explicitly marked as such at the syntax level to -disambiguate their parsing from special blocks. The new syntax is - -#+BEGIN_SRC org -,#+BEGIN_EXPORT backend -... -,#+END_EXPORT -#+END_SRC - -instead of - -#+BEGIN_SRC org -,#+BEGIN_backend -... -,#+END_backend -#+END_SRC - -As a consequence, =INCLUDE= keywords syntax is modified, e.g., - -#+BEGIN_SRC org -,#+INCLUDE: "file.org" HTML -#+END_SRC - -becomes - -#+BEGIN_SRC org -,#+INCLUDE: "file.org" export html -#+END_SRC - -The following function repairs export blocks and =INCLUDE= keywords -using previous syntax: - -#+BEGIN_SRC emacs-lisp -(defun org-repair-export-blocks () - "Repair export blocks and INCLUDE keywords in current buffer." - (interactive) - (when (eq major-mode 'org-mode) - (let ((case-fold-search t) - (back-end-re (regexp-opt - '("HTML" "ASCII" "LATEX" "ODT" "MARKDOWN" "MD" "ORG" - "MAN" "BEAMER" "TEXINFO" "GROFF" "KOMA-LETTER") - t))) - (org-with-wide-buffer - (goto-char (point-min)) - (let ((block-re (concat "^[ \t]*#\\+BEGIN_" back-end-re))) - (save-excursion - (while (re-search-forward block-re nil t) - (let ((element (save-match-data (org-element-at-point)))) - (when (eq (org-element-type element) 'special-block) - (save-excursion - (goto-char (org-element-property :end element)) - (save-match-data (search-backward "_")) - (forward-char) - (insert "EXPORT") - (delete-region (point) (line-end-position))) - (replace-match "EXPORT \\1" nil nil nil 1)))))) - (let ((include-re - (format "^[ \t]*#\\+INCLUDE: .*?%s[ \t]*$" back-end-re))) - (while (re-search-forward include-re nil t) - (let ((element (save-match-data (org-element-at-point)))) - (when (and (eq (org-element-type element) 'keyword) - (string= (org-element-property :key element) "INCLUDE")) - (replace-match "EXPORT \\1" nil nil nil 1))))))))) -#+END_SRC - -Moreover, ~:export-block~ keyword used in ~org-export-define-backend~ and -~org-export-define-derived-backend~ is no longer used and needs to be -removed. - -*** Footnotes - -**** [1]-like constructs are not valid footnotes - -Using =[1]= as a footnote was already discouraged in the manual, since -it introduced too many false-positives in many Org documents. These -constructs are now unsupported. - -If you used =[N]= in some of your documents, consider turning them into -=[fn:N]=. - -**** /Org Footnote/ library doesn't handle non-Org buffers - -Commands for footnotes in an Org document no longer try to do -something in non-Org ones. If you need to have footnotes there, -consider using the =footnote.el= library, shipped with Emacs. - -In particular, ~org-footnote-tag-for-non-org-mode-files~ no longer -exists. - -*** ~org-file-apps~ no longer accepts S-expressions as commands - -The variable now accepts functions of two arguments instead of plain -S-expressions. Replacing an S-expression with an appropriate function -is straightforward. For example - -: ("pdf" . (foo)) - -becomes - -: ("pdf" . (lambda (file link) (foo))) - -*** The ~{{{modification-time}}}~ macro can get time via =vc= - -The modification time will be determined via =vc.el= if the second -argument is non-nil. See the manual for details. - -*** Preparation and completion functions in publishing projects change signature - -Preparation and completion functions are now called with an argument, -which is the project property list. It used to be dynamically scoped -through the ~project-plist~ variable. - -*** Old Babel header properties are no longer supported - -Using header arguments as property names is no longer possible. As -such, the following - -#+BEGIN_EXAMPLE -,* Headline -:PROPERTIES: -:exports: code -:var: a=1 b=2 -:var+: c=3 -:END: -#+END_EXAMPLE - -should be written instead - -#+BEGIN_EXAMPLE -,* Headline -:PROPERTIES: -:header-args: :exports code -:header-args+: :var a=1 b=2 -:header-args+: :var c=3 -:END: -#+END_EXAMPLE - -Please note that, however, old properties were defined at the source -block definition. Current ones are defined where the block is called. - -** New features - -*** ~org-eww~ has been moved into core -*** New org-protocol key=value syntax - -Org-protocol can now handle query-style parameters such as: - -#+begin_example -org-protocol://store-link?url=http:%2F%2Flocalhost%2Findex.html&title=The%20title -org-protocol://capture?template=x&title=Hello&body=World&url=http:%2F%2Fexample.com -#+end_example - -Old-style links such as -: org-protocol://store-link:/http:%2F%2Flocalhost%2Findex.html/The%20title -continue to be supported. - -If you have defined your own handler functions for -~org-protocol-protocol-alist~, change them to accept either a property -list (for new-style links) or a string (for old-style links). Use -~org-protocol-parse-parameters~ to convert old-style links into property -lists. - -*** New Org linter library - -~org-lint~ can check syntax and report common issues in Org documents. - -*** New option ~date-tree-last~ for ~org-agenda-insert-diary-strategy~ - -When ~org-agenda-insert-diary-strategy~ is set to ~date-tree-last~, diary -entries are added to last in the date tree. - -*** New ~vbar~ entity - -~\vbar~ or ~\vbar{}~ will be exported unconditionally as a =|=, -unlike to existing ~\vert~, which is expanded as ~|~ when using -a HTML derived export back-end. - -*** Export - -**** New =#+latex_compiler= keyword to set LaTeX compiler. - -PDFLaTeX, XeLaTeX, and LuaLaTeX are supported. See the manual for -details. - -**** New option ~org-export-with-broken-links~ - -This option tells the export process how to behave when encountering -a broken internal link. See its docstring for more information. - -**** Attributes support in custom language environments for LaTeX export - -Custom language environments for LaTeX export can now define the -string to be inserted during export, using attributes to indicate the -position of the elements. See variable ~org-latex-custom-lang-environments~ -for more details. - -**** New Texinfo ~options~ attribute on special blocks - -Using ~:options~ as a Texinfo attribute, it is possible to add -information to custom environments. See manual for details. - -**** New HTML ~id~ attributes on special, example and quote blocks - -If the block has a =#+NAME:= attribute assigned, then the HTML element -will have an ~id~ attribute with that name in the HTML export. This -enables one to create links to these elements in other places, e.g., -~text~. - -**** Listings with captions are now numbered in HTML export - -The class associated to the numbering is "listing-number". If you -don't want these blocks to be numbered, as it was the case until now, -You may want to add ~.listing-number { display: none; }~ to the CSS -used. - -**** Line Numbering in SRC/EXAMPLE blocks support arbitrary start number - -The ~-n~ option to ~SRC~ and ~EXAMPLE~ blocks can now take a numeric -argument to specify the staring line number for the source or example -block. The ~+n~ option can now take a numeric argument that will be -added to the last line number from the previous block as the starting -point for the SRC/EXAMPLE block. - -#+BEGIN_SRC org -,#+BEGIN_SRC emacs-lisp -n 20 -;; this will export with line number 20 -(message "This is line 21") -,#+END_SRC -,#+BEGIN_SRC emacs-lisp +n 10 -;; This will be listed as line 31 -(message "This is line 32") -,#+END_SRC -#+END_SRC - -**** Allow toggling center for images in LaTeX export - -With the global variable ~org-latex-images-centered~ or the local -attribute ~:center~ it is now possible to center an image in LaTeX -export. - -**** Default CSS class ~org-svg~ for SVG images in HTML export - -SVG images exported in HTML are now by default assigned a CSS class -~org-svg~ if no CSS class is specified with the ~:class~ attribute. By -default, the CSS styling of class ~org-svg~ specifies an image width of -90\thinsp{}% of the container the image. - -**** Markdown footnote export customization - -Variables ~org-md-footnotes-section~ and ~org-md-footnote-format~ -introduced for =ox-md.el=. Both new variables define template strings -which can be used to customize the format of the exported footnotes -section and individual footnotes, respectively. - -*** Babel - -**** Blocks with coderefs labels can now be evaluated - -The labels are removed prior to evaluating the block. - -**** Support for Lua language -**** Support for SLY in Lisp blocks - -See ~org-babel-lisp-eval-fn~ to activate it. - -**** Support for Stan language - -New ob-stan.el library. - -Evaluating a Stan block can produce two different results. - -1. Dump the source code contents to a file. - - This file can then be used as a variable in other blocks, which - allows interfaces like RStan to use the model. - -2. Compile the contents to a model file. - - This provides access to the CmdStan interface. To use this, set - ~org-babel-stan-cmdstan-directory~ and provide a ~:file~ argument - that does not end in ".stan". - -For more information and usage examples, visit -https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-stan.html - -**** Support for Oracle databases via ~sqlplus~ - -=ob-sql= library supports running SQL blocks against an Oracle -database using ~sqlplus~. Use with properties like this (all -mandatory): - -#+BEGIN_EXAMPLE -:engine oracle -:dbhost -:dbport <1521> -:dbuser -:database -:dbpassword -#+END_EXAMPLE - -**** Improved support to Microsoft SQL Server via ~sqlcmd~ - -=ob-sql= library removes support to the ~msosql~ engine which uses the -deprecated ~osql~ command line tool, and replaces it with ~mssql~ -engine which uses the ~sqlcmd~ command line tool. Use with properties -like this: - -#+BEGIN_EXAMPLE -:engine mssql -:dbhost -:dbuser -:dbpassword -:database -#+END_EXAMPLE - -If you want to use the *trusted connection* feature, omit *both* the -=dbuser= and =dbpassword= properties and add =cmdline -E= to the properties. - -If your Emacs is running in a Cygwin environment, the =ob-sql= library -can pass the converted path to the =sqlcmd= tool. - -**** Improved support of header arguments for postgresql - -The postgresql engine in a sql code block supports now ~:dbport~ nd -~:dbpassword~ as header arguments. - -**** Support for additional plantuml output formats - -The support for output formats of [[http://plantuml.com/][plantuml]] has been extended to now -include: - -All Diagrams: -- png :: -- svg :: -- eps :: -- pdf :: -- vdx :: -- txt :: ASCII art -- utxt :: ASCII art using unicode characters - -Class Diagrams: -- xmi :: -- html :: - -State Diagrams: -- scxml :: - -The output formats are determined by the file extension specified -using the :file property, e.g.: - -#+begin_src plantuml :file diagram.png -@startuml -Alice -> Bob: Authentication Request -Bob --> Alice: Authentication Response - -Alice -> Bob: Another authentication Request -Alice <-- Bob: another authentication Response -@enduml -#+end_src - -Please note that *pdf* *does not work out of the box* and needs additional -setup in addition to plantuml. See [[http://plantuml.com/pdf.html]] for -details and setup information. - -*** Rewrite of radio lists - -Radio lists, i.e, Org plain lists in foreign buffers, have been -rewritten to be on par with Radio tables. You can use a large set of -parameters to control how a given list should be rendered. See manual -for details. - -*** org-bbdb-anniversaries-future - -Used like ~org-bbdb-anniversaries~, it provides a few days warning for -upcoming anniversaries (default: 7 days). - -*** Clear non-repeated SCHEDULED upon repeating a task - -If the task is repeated, and therefore done at least one, scheduling -information is no longer relevant. It is therefore removed. - -See [[git:481719fbd5751aaa9c672b762cb43aea8ee986b0][commit message]] for more information. - -*** Support for ISO week trees - -ISO week trees are an alternative date tree format that orders entries -by ISO week and not by month. - -For example: - -: * 2015 -: ** 2015-W35 -: ** 2015-W36 -: *** 2015-08-31 Monday - -They are supported in org-capture via ~file+weektree~ and -~file+weektree+prompt~ target specifications. - -*** Accept ~:indent~ parameter when capturing column view - -When defining a "columnview" dynamic block, it is now possible to add -an :indent parameter, much like the one in the clock table. - -On the other hand, stars no longer appear in an ITEM field. - -*** Columns view - -**** ~org-columns~ accepts a prefix argument - -When called with a prefix argument, ~org-columns~ apply to the whole -buffer unconditionally. - -**** New variable : ~org-agenda-view-columns-initially~ - -The variable used to be a ~defvar~, it is now a ~defcustom~. - -**** Allow custom summaries - -It is now possible to add new summary types, or override those -provided by Org by customizing ~org-columns-summary-types~, which see. - -**** Allow multiple summaries for any property - -Columns can now summarize the same property using different summary -types. - -*** Preview LaTeX snippets in buffers not visiting files -*** New option ~org-attach-commit~ - -When non-nil, commit attachments with git, assuming the document is in -a git repository. - -*** Allow conditional case-fold searches in ~org-occur~ - -When set to ~smart~, the new variable ~org-occur-case-fold-search~ allows -to mimic =isearch.el=: if the regexp searched contains any upper case -character (or character class), the search is case sensitive. -Otherwise, it is case insensitive. - -*** More robust repeated =ox-latex= footnote handling - -Repeated footnotes are now numbered by referring to a label in the -first footnote. - -*** The ~org-block~ face is inherited by ~src-blocks~ - -This works also when =org-src-fontify-natively= is non-nil. It is also -possible to specify per-languages faces. See =org-src-block-faces= and -the manual for details. - -*** Links are now customizable - -Links can now have custom colors, tooltips, keymaps, display behavior, -etc. Links are now centralized in ~org-link-parameters~. - -** New functions - -*** ~org-next-line-empty-p~ - -It replaces the deprecated ~next~ argument to ~org-previous-line-empty-p~. - -*** ~org-show-children~ - -It is a faster implementation of ~outline-show-children~. - -** Removed functions - -*** ~org-agenda-filter-by-tag-refine~ has been removed. - -Use ~org-agenda-filter-by-tag~ instead. - -*** ~org-agenda-todayp~ is deprecated. - -Use ~org-agenda-today-p~ instead. - -*** ~org-babel-get-header~ is removed. - -Use ~org-babel--get-vars~ or ~assq~ instead, as applicable. - -*** ~org-babel-trim~ is deprecated. - -Use ~org-trim~ instead. - -*** ~org-element-remove-indentation~ is deprecated. - -Use ~org-remove-indentation~ instead. - -*** ~org-image-file-name-regexp~ is deprecated - -Use ~image-file-name-regexp~ instead. -The never-used-in-core ~extensions~ argument has been dropped. - -*** ~org-list-parse-list~ is deprecated - -Use ~org-list-to-lisp~ instead. - -*** ~org-on-heading-p~ is deprecated - -A comment to this effect was in the source code since 7.8.03, but -now a byte-compiler warning will be generated as well. - -*** ~org-table-p~ is deprecated - -Use ~org-at-table-p~ instead. - -*** ~org-table-recognize-table.el~ is deprecated - -It was not called by any org code since 2010. - -*** Various reimplementations of cl-lib functions are deprecated - -The affected functions are: -- ~org-count~ -- ~org-remove-if~ -- ~org-remove-if-not~ -- ~org-reduce~ -- ~org-every~ -- ~org-some~ - -Additionally, ~org-sublist~ is deprecated in favor of ~cl-subseq~. Note -the differences in indexing conventions: ~org-sublist~ is 1-based and -end-inclusive; ~cl-subseq~ is 0-based and end-exclusive. - -** Removed options - -*** Remove all options related to ~ido~ or ~iswitchb~ - -This includes ~org-completion-use-iswitchb~ and ~org-completion-use-ido~. -Instead Org uses regular functions, e.g., ~completion-read~ so as to -let those libraries operate. - -*** Remove ~org-list-empty-line-terminates-plain-lists~ - -Two consecutive blank lines always terminate all levels of current -plain list. - -*** ~fixltx2e~ is removed from ~org-latex-default-packages-alist~ - -fixltx2e is obsolete, see LaTeX News 22. - -** Miscellaneous -*** Add Icelandic smart quotes -*** Allow multiple receiver locations in radio tables and lists -*** Allow angular links within link descriptions - -It is now allowed to write, e.g., -~[[http:orgmode.org][]]~ as an equivalent to -~[[http:orgmode.org][file:unicorn.png]]~. The advantage of the former -is that spaces are allowed within the path. - -*** Beamer export back-ends uses ~org-latex-prefer-user-labels~ -*** ~:preparation-function~ called earlier during publishing - -Functions in this list are called before any file is associated to the -current project. Thus, they can be used to generate to be published -Org files. - -*** Function ~org-remove-indentation~ changes. - -The new algorithm doesn't remove TAB characters not used for -indentation. - -*** Secure placeholders in capture templates - -Placeholders in capture templates are no longer expanded recursively. -However, ~%(...)~ constructs are expanded very late, so you can fill -the contents of the S-exp with the replacement text of non-interactive -placeholders. As before, interactive ones are still expanded as the -very last step, so the previous statement doesn't apply to them. - -Note that only ~%(...)~ placeholders initially present in the -template, or introduced using a file placeholder, i.e., ~%[...]~ are -expanded. This prevents evaluating potentially malicious code when -another placeholder, e.g., ~%i~ expands to a S-exp. - -*** Links stored by ~org-gnus-store-link~ in nnir groups - -Since gnus nnir groups are temporary, ~org-gnus-store-link~ now refers -to the article's original group. - -*** ~org-babel-check-confirm-evaluate~ is now a function instead of a macro - -The calling convention has changed. - -*** HTML export table row customization changes - -Variable ~org-html-table-row-tags~ has been split into -~org-html-table-row-open-tag~ and ~org-html-table-row-close-tag~. -Both new variables can be either a string or a function which will be -called with 6 parameters. - -*** =ITEM= special property returns headline without stars -*** Rename ~org-insert-columns-dblock~ into ~org-columns-insert-dblock~ - -The previous name is, for the time being, kept as an obsolete alias. - -*** ~org-trim~ can preserve leading indentation. - -When setting a new optional argument to a non-nil value, ~org-trim~ -preserves leading indentation while removing blank lines at the -beginning of the string. The behavior is identical for white space at -the end of the string. - -*** Function ~org-info-export~ changes. - -HTML links created from certain info links now point to =gnu.org= URL's rather -than just to local files. For example info links such as =info:emacs#List -Buffers= used to be converted to HTML links like this: - -: emacs#List Buffers - -where local file =emacs.html= is referenced. -For most folks this file does not exist. -Thus the new behavior is to generate this HTML link instead: - -: emacs#List Buffers - -All emacs related info links are similarly translated plus few other -=gnu.org= manuals. - -*** Repeaters with a ~++~ interval and a time can be shifted to later today - -Previously, if a recurring task had a timestamp of -~<2016-01-01 Fri 20:00 ++1d>~ and was completed on =2016-01-02= at -=08:00=, the task would skip =2016-01-02= and would be rescheduled for -=2016-01-03=. Timestamps with ~++~ cookies and a specific time will -now shift to the first possible future occurrence, even if the -occurrence is later the same day the task is completed. (Timestamps -already in the future are still shifted one time further into the -future.) - -*** ~org-mobile-action-alist~ is now a defconst - -It used to be a defcustom, with a warning that it shouldn't be -modified anyway. - -*** ~file+emacs~ and ~file+sys~ link types are deprecated - -They are still supported in Org 9.0 but will eventually be removed in -a later release. Use ~file~ link type along with universal arguments -to force opening it in either Emacs or with system application. - -*** New defcustom ~org-babel-J-command~ stores the j command -*** New defalias ~org-babel-execute:j~ - -Allows J source blocks be indicated by letter j. Previously the -indication letter was solely J. - -*** ~org-open-line~ ignores tables at the very beginning of the buffer - -When ~org-special-ctrl-o~ is non-nil, it is impractical to create -a blank line above a table at the beginning of the document. Now, as -a special case, ~org-open-line~ behaves normally in this situation. - -*** ~org-babel-hash-show-time~ is now customizable - -The experimental variable used to be more or less confidential, as -a ~defvar~. - -*** New ~:format~ property to parsed links - -It defines the format of the original link. Possible values are: -~plain~, ~bracket~ and ~angle~. - -* Version 8.3 - -** Incompatible changes - -*** Properties drawers syntax changes - -Properties drawers are now required to be located right after a -headline and its planning line, when applicable. - -It will break some documents as TODO states changes were sometimes -logged before the property drawer. - -The following function will repair them: - -#+BEGIN_SRC emacs-lisp -(defun org-repair-property-drawers () - "Fix properties drawers in current buffer. -Ignore non Org buffers." - (when (eq major-mode 'org-mode) - (org-with-wide-buffer - (goto-char (point-min)) - (let ((case-fold-search t) - (inline-re (and (featurep 'org-inlinetask) - (concat (org-inlinetask-outline-regexp) - "END[ \t]*$")))) - (org-map-entries - (lambda () - (unless (and inline-re (org-looking-at-p inline-re)) - (save-excursion - (let ((end (save-excursion (outline-next-heading) (point)))) - (forward-line) - (when (org-looking-at-p org-planning-line-re) (forward-line)) - (when (and (< (point) end) - (not (org-looking-at-p org-property-drawer-re)) - (save-excursion - (and (re-search-forward org-property-drawer-re end t) - (eq (org-element-type - (save-match-data (org-element-at-point))) - 'drawer)))) - (insert (delete-and-extract-region - (match-beginning 0) - (min (1+ (match-end 0)) end))) - (unless (bolp) (insert "\n")))))))))))) -#+END_SRC - -*** Using "COMMENT" is now equivalent to commenting with "#" - -If you used "COMMENT" in headlines to prevent a subtree from being -exported, you can still do it but all information within the subtree -is now commented out, i.e. no #+OPTIONS line will be parsed or taken -into account when exporting. - -If you want to exclude a headline from export while using its contents -for setting options, use =:noexport:= (see =org-export-exclude-tags=.) - -*** =#+CATEGORY= keywords no longer apply partially to document - -It was possible to use several such keywords and have them apply to -the text below until the next one, but strongly deprecated since Org -5.14 (2008). - -=#+CATEGORY= keywords are now global to the document. You can use node -properties to set category for a subtree, e.g., - -#+BEGIN_SRC org -,* Headline - :PROPERTIES: - :CATEGORY: some category - :END: -#+END_SRC - -*** New variable to control visibility when revealing a location - -~org-show-following-heading~, ~org-show-siblings~, ~org-show-entry-below~ -and ~org-show-hierarchy-above~ no longer exist. Instead, visibility is -controlled through a single variable: ~org-show-context-detail~, which -see. - -*** Replace disputed keys again when reading a date - -~org-replace-disputed-keys~ has been ignored when reading date since -version 8.1, but the former behavior is restored again. - -Keybinding for reading date can be customized with a new variable -~org-read-date-minibuffer-local-map~. - -*** No default title is provided when =TITLE= keyword is missing - -Skipping =TITLE= keyword no longer provides the current file name, or -buffer name, as the title. Instead, simply ignore the title. - -*** Default bindings of =C-c C-n= and =C-c C-p= changed - -The key sequences =C-c C-n= and =C-c C-p= are now bound to -~org-next-visible-heading~ and ~org-previous-visible-heading~ -respectively, rather than the =outline-mode= versions of these -functions. The Org version of these functions skips over inline tasks -(and even-level headlines when ~org-odd-levels-only~ is set). - -*** ~org-element-context~ no longer return objects in keywords - -~org-element-context~ used to return objects on some keywords, i.e., -=TITLE=, =DATE= and =AUTHOR=. It now returns only the keyword. - -*** ~org-timer-default-timer~ type changed from number to string - -If you have, in your configuration, something like =(setq -org-timer-default-timer 10)= replace it with =(setq -org-timer-default-timer "10")=. - -*** Functions signature changes - -The following functions require an additional argument. See their -docstring for more information. - -- ~org-export-collect-footnote-definitions~ -- ~org-html-format-headline-function~ -- ~org-html-format-inlinetask-function~ -- ~org-latex-format-headline-function~ -- ~org-latex-format-inlinetask-function~ -- ~org-link-search~ - -** New features - -*** Default lexical evaluation of emacs-lisp source blocks - -Emacs-lisp source blocks in Babel are now evaluated using lexical -scoping. There is a new header to control this behavior. - -The default results in an eval with lexical scoping. -:lexical yes - -This turns lexical scoping off in the eval (the former behavior). -:lexical no - -This uses the lexical environment with x=42 in the eval. -:lexical '((x . 42)) - -*** Behavior of ~org-return~ changed - -If point is before or after the headline title, insert a new line -without changing the headline. - -*** Hierarchies of tags - -The functionality of nesting tags in hierarchies is added to org-mode. -This is the generalization of what was previously called "Tag groups" -in the manual. That term is now changed to "Tag hierarchy". - -The following in-buffer definition: - -#+BEGIN_SRC org - ,#+TAGS: [ Group : SubOne SubTwo ] - ,#+TAGS: [ SubOne : SubOne1 SubOne2 ] - ,#+TAGS: [ SubTwo : SubTwo1 SubTwo2 ] -#+END_SRC - -Should be seen as the following tree of tags: - -- Group - - SubOne - - SubOne1 - - SubOne2 - - SubTwo - - SubTwo1 - - SubTwo2 - -Searching for "Group" should return all tags defined above. Filtering -on SubOne filters also it's sub-tags. Etc. - -There is no limit on the depth for the tag hierarchy. - -*** Additional syntax for non-unique grouptags - -Additional syntax is defined for grouptags if the tags in the group -don't have to be distinct on a heading. - -Grouptags had to previously be defined with { }. This syntax is -already used for exclusive tags and Grouptags need their own, -non-exclusive syntax. This behavior is achieved with [ ]. Note: { } -can still be used also for Grouptags but then only one of the given -tags can be used on the headline at the same time. Example: - -[ group : sub1 sub2 ] - -#+BEGIN_SRC org -,* Test :sub1:sub2: -#+END_SRC - -This is a more general case than the already existing syntax for -grouptags; { }. - -*** Define regular expression patterns as tags - -Tags can be defined as grouptags with regular expressions as -"sub-tags". - -The regular expressions in the group must be marked up within { }. -Example use: - -: #+TAGS: [ Project : {P@.+} ] - -Searching for the tag Project will now list all tags also including -regular expression matches for P@.+. This is good for example for -projects tagged with a common identifier, i.e. P@2014_OrgTags. - -*** Filtering in the agenda on grouptags (Tag hierarchies) - -Filtering in the agenda on grouptags filters all of the related tags. -Except if a filter is applied with a (double) prefix-argument. - -Filtering in the agenda on subcategories does not filter the "above" -levels anymore. - -If a grouptag contains a regular expression the regular expression -is also used as a filter. - -*** Minor refactoring of ~org-agenda-filter-by-tag~ - -Now uses the argument ARG and optional argument exclude instead of -strip and narrow. ARG because the argument has multiple purposes and -makes more sense than strip now. The term "narrowing" is changed to -exclude. - -The main purpose is for the function to make more logical sense when -filtering on tags now when tags can be structured in hierarchies. - -*** Babel: support for sed scripts - -Thanks to Bjarte Johansen for this feature. - -*** Babel: support for Processing language - -New ob-processing.el library. - -This library implements necessary functions for implementing editing -of Processing code blocks, viewing the resulting sketches in an -external viewer, and HTML export of the sketches. - -Check the documentation for more details. - -Thanks to Jarmo Hurri for this feature. - -*** New behavior for ~org-toggle-latex-fragment~ - -The new behavior is the following: - -- With a double prefix argument or with a single prefix argument when - point is before the first headline, toggle overlays in the whole - buffer; - -- With a single prefix argument, toggle overlays in the current - subtree; - -- On latex code, toggle overlay at point; - -- Otherwise, toggle overlays in the current section. - -*** Additional markup with =#+INCLUDE= keyword - -The content of the included file can now be optionally marked up, for -instance as HTML. See the documentation for details. - -*** File links with =#+INCLUDE= keyword - -Objects can be extracted via =#+INCLUDE= using file links. It is -possible to include only the contents of the object. See manual for -more information. - -*** Drawers do not need anymore to be referenced in =#+DRAWERS= - -One can use a drawer without listing it in the =#+DRAWERS= keyword, -which is now obsolete. As a consequence, this change also deprecates -~org-drawers~ variable. - -*** ~org-edit-special~ can edit export blocks - -Using C-c ' on an export block now opens a sub-editing buffer. Major -mode in that buffer is determined by export backend name (e.g., -"latex" \to "latex-mode"). You can define exceptions to this rule by -configuring ~org-src-lang-modes~, which see. - -*** Additional =:hline= processing to ob-shell - -If the argument =:hlines yes= is present in a babel call, an optional -argument =:hlines-string= can be used to define a string to use as a -representation for the lisp symbol ='hline= in the shell program. The -default is =hline=. - -*** Markdown export supports switches in source blocks - -For example, it is now possible to number lines using the =-n= switch in -a source block. - -*** New option in ASCII export - -Plain lists can have an extra margin by setting ~org-ascii-list-margin~ -variable to an appropriate integer. - -*** New blocks in ASCII export - -ASCII export now supports =#+BEGIN_JUSTIFYRIGHT= and =#+BEGIN_JUSTIFYLEFT= -blocks. See documentation for details. - -*** More back-end specific publishing options - -The number of publishing options specific to each back-end has been -increased. See manual for details. - -*** Export inline source blocks - -Inline source code was used to be removed upon exporting. They are -now handled as standard code blocks, i.e., the source code can appear -in the output, depending on the parameters. - -*** Extend ~org-export-first-sibling-p~ and ~org-export-last-sibling-p~ - -These functions now support any element or object, not only headlines. - -*** New function: ~org-export-table-row-in-header-p~ - -*** New function: ~org-export-get-reference~ - -*** New function: ~org-element-lineage~ - -This function deprecates ~org-export-get-genealogy~. It also provides -more features. See docstring for details. - -*** New function: ~org-element-copy~ - -*** New filter: ~org-export-filter-body-functions~ - -Functions in this filter are applied on the body of the exported -document, before wrapping it within the template. - -*** New :environment parameter when exporting example blocks to LaTeX - -: #+ATTR_LATEX: :environment myverbatim -: #+BEGIN_EXAMPLE -: This sentence is false. -: #+END_EXAMPLE - -will be exported using =@samp(myverbatim)= instead of =@samp(verbatim)=. - -*** Various improvements on radio tables - -Radio tables feature now relies on Org's export framework ("ox.el"). -~:no-escape~ parameter no longer exists, but additional global -parameters are now supported: ~:raw~, ~:backend~. Moreover, there are new -parameters specific to some pre-defined translators, e.g., -~:environment~ and ~:booktabs~ for ~orgtbl-to-latex~. See translators -docstrings (including ~orgtbl-to-generic~) for details. - -*** Non-floating minted listings in Latex export - -It is not possible to specify =#+attr_latex: :float nil= in conjunction -with source blocks exported by the minted package. - -*** Field formulas can now create columns as needed - -Previously, evaluating formulas that referenced out-of-bounds columns -would throw an error. A new variable ~org-table-formula-create-columns~ -was added to adjust this behavior. It is now possible to silently add -new columns, to do so with a warning or to explicitly ask the user -each time. - -*** ASCII plot - -Ability to plot values in a column through ASCII-art bars. See manual -for details. - -*** New hook: ~org-archive-hook~ - -This hook is called after successfully archiving a subtree, with point -on the original subtree, not yet deleted. - -*** New option: ~org-attach-archive-delete~ - -When non-nil, attachments from archived subtrees are removed. - -*** New option: ~org-latex-caption-above~ - -This variable generalizes ~org-latex-table-caption-above~, which is now -deprecated. In addition to tables, it applies to source blocks, -special blocks and images. See docstring for more information. - -*** New option: ~org-latex-prefer-user-labels~ - -See the docstring for more information. - -*** Export unnumbered headlines - -Headlines, for which the property ~UNNUMBERED~ is non-nil, are now -exported without section numbers irrespective of their levels. The -property is inherited by children. - -*** Tables can be sorted with an arbitrary function - -It is now possible to specify a function, both programmatically, -through a new optional argument, and interactively with ~f~ or ~F~ keys, -to sort a table. - -*** Table of contents can be local to a section - -The ~TOC~ keywords now accepts an optional ~local~ parameter. See manual -for details. - -*** Countdown timers can now be paused - -~org-timer-pause-time~ now pauses and restarts both relative and -countdown timers. - -*** New option ~only-window~ for ~org-agenda-window-setup~ - -When ~org-agenda-window-setup~ is set to ~only-window~, the agenda is -displayed as the sole window of the current frame. - -*** ~{{{date}}}~ macro supports optional formatting argument - -It is now possible to supply and optional formatting argument to -~{{{date}}}~. See manual for details. - -*** ~{{{property}}}~ macro supports optional search argument - -It is now possible to supply an optional search option to -~{{{property}}}~ in order to retrieve remote properties optional. See -manual for details. - -*** New option ~org-export-with-title~ - -It is possible to suppress the title insertion with ~#+OPTIONS: -title:nil~ or globally using the variable ~org-export-with-title~. - -*** New entities family: "\_ " - -"\_ " are used to insert up to 20 contiguous spaces in various -back-ends. In particular, this family can be used to introduce -leading spaces within table cells. - -*** New MathJax configuration options - -Org uses the MathJax CDN by default. See the manual and the docstring -of ~org-html-mathjax-options~ for details. - -*** New behavior in `org-export-options-alist' - -When defining a back-end, it is now possible to specify to give -`parse' behavior on a keyword. It is equivalent to call -`org-element-parse-secondary-string' on the value. - -However, parsed =KEYWORD= is automatically associated to an -=:EXPORT_KEYWORD:= property, which can be used to override the keyword -value during a subtree export. Moreover, macros are expanded in such -keywords and properties. - -*** Viewport support in html export - -Viewport for mobile-optimized website is now automatically inserted -when exporting to html. See ~org-html-viewport~ for details. - -*** New ~#+SUBTITLE~ export keyword - -Org can typeset a subtitle in some export backends. See the manual -for details. - -*** Remotely edit a footnote definition - -Calling ~org-edit-footnote-reference~ (C-c ') on a footnote reference -allows to edit its definition, as long as it is not anonymous, in a -dedicated buffer. It works even if buffer is currently narrowed. - -*** New function ~org-delete-indentation~ bound to ~M-^~ - -Work as ~delete-indentation~ unless at heading, in which case text is -added to headline text. - -*** Support for images in Texinfo export - -~Texinfo~ back-end now handles images. See the manual for details. - -*** Support for captions in Texinfo export - -Tables and source blocks can now have captions. Additionally, lists -of tables and lists of listings can be inserted in the document with -=#+TOC= keyword. - -*** Countdown timer support hh:mm:ss format - -In addition to setting countdown timers in minutes, they can also be -set using the hh:mm:ss format. - -*** Extend ~org-clone-subtree-with-time-shift~ - -~org-clone-subtree-with-time-shift~ now accepts 0 as an argument for the -number of clones, which removes the repeater from the original subtree -and creates one shifted, repeating clone. - -*** New time block for clock tables: ~untilnow~ - -It encompasses all past closed clocks. - -*** Support for the ~polyglossia~ LaTeX package - -See the docstring of ~org-latex-classes~ and -~org-latex-guess-polyglossia-language~ for details. - -*** None-floating tables, graphics and blocks can have captions - -*** `org-insert-heading' can be forced to insert top-level headline - -** Removed functions - -*** Removed function ~org-translate-time~ - -Use ~org-timestamp-translate~ instead. - -*** Removed function ~org-beamer-insert-options-template~ - -This function inserted a Beamer specific template at point or in -current subtree. Use ~org-export-insert-default-template~ instead, as -it provides more features and covers all export back-ends. It is also -accessible from the export dispatcher. - -*** Removed function ~org-timer-cancel-timer~ - -~org-timer-stop~ now stops both relative and countdown timers. - -*** Removed function ~org-export-solidify-link-text~ - -This function, being non-bijective, introduced bug in internal -references. Use ~org-export-get-reference~ instead. - -*** Removed function ~org-end-of-meta-data-and-drawers~ - -The function is superseded by ~org-end-of-meta-data~, called with an -optional argument. - -*** Removed functions ~org-table-colgroup-line-p~, ~org-table-cookie-line-p~ - -These functions were left-over from pre 8.0 era. They are not correct -anymore. Since they are not needed, they have no replacement. - -** Removed options - -*** ~org-list-empty-line-terminates-plain-lists~ is deprecated - -It will be kept in code base until next release, for backward -compatibility. - -If you need to separate consecutive lists with blank lines, always use -two of them, as if this option was nil (default value). - -*** ~org-export-with-creator~ is a boolean - -Special ~comment~ value is no longer allowed. It is possible to use a -body filter to add comments about the creator at the end of the -document instead. - -*** Removed option =org-html-use-unicode-chars= - -Setting this to non-nil was problematic as it converted characters -everywhere in the buffer, possibly corrupting URLs. - -*** Removed option =org-babel-sh-command= - -This undocumented option defaulted to the value of =shell-file-name= at -the time of loading =ob-shell=. The new behavior is to use the value -of =shell-file-name= directly when the shell language is =shell=. To chose -a different shell, either customize =shell-file-name= or bind this -variable locally. - -*** Removed option =org-babel-sh-var-quote-fmt= - -This undocumented option was supposed to provide different quoting -styles when changing the shell type. Changing the shell type can now -be done directly from the source block and the quoting style has to be -compatible across all shells, so a customization doesn't make sense -anymore. The chosen hard coded quoting style conforms to POSIX. - -*** Removed option ~org-insert-labeled-timestamps-at-point~ - -Setting this option to anything else that the default value (nil) -would create invalid planning info. This dangerous option is now -removed. - -*** Removed option ~org-koma-letter-use-title~ - -Use org-export-with-title instead. See also below. - -*** Removed option ~org-entities-ascii-explanatory~ - -This variable has no effect since Org 8.0. - -*** Removed option ~org-table-error-on-row-ref-crossing-hline~ - -This variable has no effect since August 2009. - -*** Removed MathML-related options from ~org-html-mathjax-options~ - -MathJax automatically chooses the best display technology based on the -end-users browser. You may force initial usage of MathML via -~org-html-mathjax-template~ or by setting the ~path~ property of -~org-html-mathjax-options~. - -*** Removed comment-related filters - -~org-export-filter-comment-functions~ and -~org-export-filter-comment-block-functions~ variables do not exist -anymore. - -** Miscellaneous - -*** Strip all meta data from ITEM special property - -ITEM special property does not contain TODO, priority or tags anymore. - -*** File names in links accept are now compatible with URI syntax - -Absolute file names can now start with =///= in addition to =/=. E.g., -=[[file:///home/me/unicorn.jpg]]=. - -*** Footnotes in included files are now local to the file - -As a consequence, it is possible to include multiple Org files with -footnotes in a master document without being concerned about footnote -labels colliding. - -*** Mailto links now use regular URI syntax - -This change deprecates old Org syntax for mailto links: -=mailto:user@domain::Subject=. - -*** =QUOTE= keywords do not exist anymore - -=QUOTE= keywords have been deprecated since Org 8.2. - -*** Select tests to perform with the build system - -The build system has been enhanced to allow test selection with a -regular expression by defining =BTEST_RE= during the test invocation. -This is especially useful during bisection to find just when a -particular test failure was introduced. - -*** Exact heading search for external links ignore spaces and cookies - -Exact heading search for links now ignore spaces and cookies. This is -the case for links of the form ~file:projects.org::*task title~, as well -as links of the form ~file:projects.org::some words~ when -~org-link-search-must-match-exact-headline~ is not nil. - -*** ~org-latex-hyperref-template~, ~org-latex-title-command~ formatting - -New formatting keys are supported. See the respective docstrings. -Note, ~org-latex-hyperref-template~ has a new default value. - -*** ~float, wasysym, marvosym~ are removed from ~org-latex-default-packages-alist~ - -If you require any of these package add them to your preamble via -~org-latex-packages-alist~. Org also uses default LaTeX ~\tolerance~ now. - -*** When exporting, throw an error on unresolved id/fuzzy links and code refs - -This helps spotting wrong links. - -* Version 8.2 - -** Incompatible changes -*** =ob-sh.el= renamed to =ob-shell= -This may require two changes in user config. - -1. In =org-babel-do-load-languages=, change =(sh . t)= to =(shell . t)=. -2. Edit =local.mk= files to change the value of =BTEST_OB_LANGUAGES= - to remove "sh" and include "shell". - -*** Combine org-mac-message.el and org-mac-link-grabber into org-mac-link.el - -Please remove calls to =(require 'org-mac-message)= and =(require -'org-mac-link-grabber)= in your =.emacs= initialization file. All you -need now is =(require 'org-mac-link)=. - -Additionally, replace any calls to =ogml-grab-link= to -=org-mac-grab-link=. For example, replace this line: - -: (define-key org-mode-map (kbd "C-c g") 'omgl-grab-link) - -with this: - -: (define-key org-mode-map (kbd "C-c g") 'org-mac-grab-link) - -*** HTML export: Replace =HTML_HTML5_FANCY= by =:html-html5-fancy= (...) - -Some of the HTML specific export options in Org <8.1 are either nil or -t, like =#+HTML_INCLUDE_STYLE=. We replaced these binary options with -option keywords like :html-include-style. - -So you need to replace - -: #+HTML_INCLUDE_STYLE: t - -by - -: #+OPTIONS: :html-include-style t - -Options affected by this change: =HTML5_FANCY=, =HTML_INCLUDE_SCRIPTS= -and =HTML_INCLUDE_STYLE=. - -*** Add an argument to ~org-export-to-file~ and ~org-export-to-buffer~ - -~org-export-to-file~ and ~org-export-to-file~ can run in a different -process when provided a non-nil =ASYNC= optional argument, without -relying on ~org-export-async-start~ macro. - -Since =ASYNC= is the first of optional arguments, you have to shift -the other optional arguments accordingly. - -*** Export back-ends are now structures - -Export back-ends are now structures, and stored as such in the -communication channel during an export process. In other words, from -now on, ~(plist-get info :back-end)~ will return a structure instead -of a symbol. - -Arguments in hooks and in filters are still symbols, though. - -** Important bugfixes - -*** [[doc:org-insert-heading][org-insert-heading]] has been rewritten and bugs are now fixed -*** The replacement of disputed keys is now turned of when reading a date - -*** Match string for sparse trees can now contain a slash in a property value - - You can now have searches like SOMEPROP="aaa/bbb". Until now, - this would break because the slash would be interpreted as the - separator starting a TOTO match string. -** New features - -*** =C-c ^ x= will now sort checklist items by their checked status - -See [[doc:org-sort-list][org-sort-list]]: hitting =C-c ^ x= will put checked items at the end -of the list. -*** Various LaTeX export enhancements - -- Support SVG images -- Support for .pgf files -- LaTeX Babel blocks can now be exported as =.tikz= files -- Allow =latexmk= as an option for [[doc:org-latex-pdf-process][org-latex-pdf-process]] -- When using =\usepackage[AUTO]{babel}=, AUTO will automatically be - replaced with a value compatible with ~org-export-default-language~ - or ~LANGUAGE~ keyword. -- The dependency on the =latexsym= LaTeX package has been removed, we - now use =amssymb= symbols by default instead. - -*** New functions for paragraph motion - - The commands =C-down= and =C-up= now invoke special commands - that use knowledge from the org-elements parser to move the cursor - in a paragraph-like way. - -*** New entities in =org-entities.el= - -Add support for ell, imath, jmath, varphi, varpi, aleph, gimel, beth, -dalet, cdots, S (§), dag, ddag, colon, therefore, because, triangleq, -leq, geq, lessgtr, lesseqgtr, ll, lll, gg, ggg, prec, preceq, -preccurlyeq, succ, succeq, succurlyeq, setminus, nexist(s), mho, -check, frown, diamond. Changes loz, vert, checkmark, smile and tilde. - -*** Anonymous export back-ends - -~org-export-create-backend~ can create anonymous export back-ends, -which can then be passed to export functions like -~org-export-to-file~, ~org-export-to-buffer~ or ~org-export-as~. - -It allows for quick translation of Org syntax without the overhead of -registering a new back-end. - -*** New agenda fortnight view - - The agenda has not, in addition to day, week, month, and year - views, also a fortnight view covering 14 days. -** New options - -*** New option [[doc:org-bookmark-names-plist][org-bookmark-names-plist]] - -This allows to specify the names of automatic bookmarks. -*** New option [[doc:org-agenda-ignore-drawer-properties][org-agenda-ignore-drawer-properties]] - -This allows more flexibility when optimizing the agenda generation. -See https://orgmode.org/worg/agenda-optimization.html for details. -*** New option: [[doc:org-html-link-use-abs-url][org-html-link-use-abs-url]] to force using absolute URLs - -This is an export/publishing option, and should be used either within -the =#+OPTIONS= line(s) or within a [[doc:org-publish-project-alist][org-publish-project-alist]]. - -Setting this option to =t= is needed when the HTML output does not -allow relative URLs. For example, the =contrib/lisp/ox-rss.el= -library produces a RSS feed, and RSS feeds need to use absolute URLs, -so a combination of =:html-link-home "..." and :html-link-use-abs-url -t= is required---see the configuration example in the comment section -of =ox-rss.el=. - -*** New option [[doc:org-babel-ditaa-java-cmd][org-babel-ditaa-java-cmd]] - -This makes java executable configurable for ditaa blocks. - -*** New options [[doc:org-babel-latex-htlatex][org-babel-latex-htlatex]] and [[doc:org-babel-latex-htlatex-packages][org-babel-latex-htlatex-packages]] - -This enables SVG generation from latex code blocks. - -*** New option: [[doc:org-habit-show-done-always-green][org-habit-show-done-always-green]] - -See [[https://lists.gnu.org/r/emacs-orgmode/2013-05/msg00214.html][this message]] from Max Mikhanosha. - -*** New option: [[doc:org-babel-inline-result-wrap][org-babel-inline-result-wrap]] - -If you set this to the following - -: (setq org-babel-inline-result-wrap "$%s$") - -then inline code snippets will be wrapped into the formatting string. - -*** New option: [[doc:org-special-ctrl-o][org-special-ctrl-o]] - - This variable can be used to turn off the special behavior of - =C-o= in tables. -** New contributed packages - -- =ox-bibtex.el= by Nicolas Goaziou :: an utility to handle BibTeX - export to both LaTeX and HTML exports. It uses the [[http://www.lri.fr/~filliatr/bibtex2html/][bibtex2html]] - software. - -- =org-screenshot.el= by Max Mikhanosha :: an utility to handle - screenshots easily from Org, using the external tool [[http://freecode.com/projects/scrot][scrot]]. - -** Miscellaneous - -*** "QUOTE" keywords in headlines are deprecated - -"QUOTE" keywords are an undocumented feature in Org. When a headline -starts with the keyword "QUOTE", its contents are parsed as -a ~quote-section~ and treated as an example block. You can achieve -the same with example blocks. - -This feature is deprecated and will be removed in the next Org -release. - -* Version 8.0.1 - -** Installation - -Installation instructions have been updated and simplified. - -If you have troubles installing or updating Org, focus on these -instructions: - -- when updating via a =.zip/.tar.gz= file, you only need to set the - =load-path= in your =.emacs=. Set it before any other Org - customization that would call autoloaded Org functions. - -- when updating by pulling Org's Git repository, make sure to create the - correct autoloads. You can do this by running =~$ make autoloads= (to - only create the autoloads) or by running =~$ make= (to also compile - the Emacs lisp files.) =~$ make help= and =~$ make helpall= gives you - detailed explanations. - -- when updating through ELPA (either from GNU ELPA or from Org ELPA), - you have to install Org's ELPA package in a session where no Org - function has been called already. - -When in doubt, run =M-x org-version RET= and see if you have a mixed-up -installation. - -See https://orgmode.org/org.html#Installation for details. - -** Incompatible changes - -Org 8.0 is the most disruptive major version of Org. - -If you configured export options, you will have to update some of them. - -If you used =#+ATTR_*= keywords, the syntax of the attributes changed and -you will have to update them. - -Below is a list of changes for which you need to take action. - -See https://orgmode.org/worg/org-8.0.html for the most recent version of -this list and for detailed instructions on how to migrate. - -**** New export engine - -Org 8.0 comes with a new export engine written by Nicolas Goaziou. This -export engine relies on ~org-element.el~ (Org's syntax parser), which was -already in Org's core. This new export engine triggered the rewriting of -/all/ export back-ends. - -The most visible change is the export dispatcher, accessible through the -keybinding =C-c C-e=. By default, this menu only shows some of the -built-in export formats, but you can add more formats by loading them -directly (e.g., =(require 'ox-texinfo)= or by configuring the option -[[doc:org-export-backends][org-export-backends]]. - -More contributed back-ends are available from the =contrib/= directory, the -corresponding files start with the =ox-= prefix. - -If you customized an export back-end (like HTML or LaTeX), you will need to -rename some options so that your customization is not lost. Typically, an -option starting with =org-export-html-= is now named =org-html-=. See the -manual for details and check [[https://orgmode.org/worg/org-8.0.html][this Worg page]] for directions. - -**** New syntax for #+ATTR_HTML/LaTeX/... options - - : #+ATTR_HTML width="200px" - - should now be written - - : #+ATTR_HTML :width 200px - - Keywords like =#+ATTR_HTML= and =#+ATTR_LaTeX= are defined in their - respective back-ends, and the list of supported parameters depends on - each backend. See Org's manual for details. - -**** ~org-remember.el~ has been removed - - You cannot use =remember.el= anymore to capture notes. - - Support for remember templates has been obsoleted since long, it is - now fully removed. - - Use =M-x org-capture-import-remember-templates RET= to import your - remember templates into capture templates. - -**** ~org-jsinfo.el~ has been merged into ~ox-html.el~ - - If you were requiring ~ox-jsinfo.el~ in your ~.emacs.el~ file, you - will have to remove this requirement from your initialization file. - -**** Note for third-party developers - - The name of the files for export back-end have changed: we now use the - prefix =ox-= for those files (like we use the =ob-= prefix for Babel - files.) For example ~org-html.el~ is now ~ox-html.el~. - - If your code relies on these files, please update the names in your - code. - -**** Packages moved from core to contrib - - Since packages in Org's core are meant to be part of GNU Emacs, we try - to be minimalist when it comes to adding files into core. For 8.0, we - moved some contributions into the =contrib/= directory. - - The rationale for deciding that these files should live in =contrib/= - is either because they rely on third-party software that is not - included in Emacs, or because they are not targeting a significant - user-base. - - - org-colview-xemacs.el - - org-mac-message.el - - org-mew.el - - org-wl.el - - ox-freedmind.el - - ox-taskjuggler.el - - Note that ~ox-freedmind.el~ has been rewritten by Jambunathan, - ~org-mew.el~ has been enhanced by Tokuya Kameshima and - ~ox-taskjuggler.el~ by Nicolas Goaziou and others. - - Also, the Taskjuggler exporter now uses TJ3 by default. John Hendy - wrote [[https://orgmode.org/worg/org-tutorials/org-taskjuggler3.html][a tutorial on Worg]] for the TJ3 export. - -** New packages in core - -*** ~ob-makefile.el~ by Eric Schulte and Thomas S. Dye - - =ob-makefile.el= implements Org Babel support for Makefile tangling. - -*** ~ox-man.el~ by Luis Anaya - - =ox-man.el= allows you to export Org files to =man= pages. - -*** ~ox-md.el~ by Nicolas Goaziou - - =ox-md.el= allows you to export Org files to Markdown files, using the - vanilla [[http://daringfireball.net/projects/markdown/][Markdown syntax]]. - -*** ~ox-texinfo.el~ by Jonathan Leech-Pepin - - =ox-texinfo.el= allows you to export Org files to [[https://www.gnu.org/software/texinfo/][Texinfo]] files. - -** New packages in contrib - -*** ~ob-julia.el~ by G. Jay Kerns - - [[http://julialang.org/][Julia]] is a new programming language. - - =ob-julia.el= provides Org Babel support for evaluating Julia source - code. - -*** ~ob-mathomatic.el~ by Luis Anaya - - [[http://www.mathomatic.org/][mathomatic]] a portable, command-line, educational CAS and calculator - software, written entirely in the C programming language. - - ~ob-mathomatic.el~ provides Org Babel support for evaluating mathomatic - entries. - -*** ~ob-tcl.el~ by Luis Anaya - - ~ob-tcl.el~ provides Org Babel support for evaluating [[http://www.tcl.tk/][Tcl]] source code. - -*** ~org-bullets.el~ by Evgeni Sabof - - Display bullets instead of stars for headlines. - - Also see [[https://orgmode.org/worg/org-faq.html#sec-8-12][this updated FAQ]] on how to display another character than "*" - for starting headlines. - -*** ~org-favtable.el~ by Marc-Oliver Ihm - - ~org-favtable.el~ helps you to create and update a table of favorite - locations in org, keeping the most frequently visited lines right at - the top. This table is called "favtable". See the documentation on - [[https://orgmode.org/worg/org-contrib/org-favtable.html][Worg]]. - -*** ~ox-confluence.el~ by Sébastien Delafond - - ~ox-confluence.el~ lets you convert Org files to [[https://confluence.atlassian.com/display/DOC/Confluence%2BWiki%2BMarkup][Confluence Wiki]] files. - -*** ~ox-deck.el~ and ~ox-s5.el~ by Rick Frankel - - [[http://imakewebthings.com/deck.js/][deck.js]] is a javascript library for displaying HTML ages as - presentations. ~ox-deck.el~ exports Org files to HTML presentations - using =deck.js=. - - [[http://meyerweb.com/eric/tools/s5/][s5]] is a set of scripts which also allows to display HTML pages as - presentations. ~ox-s5.el~ exports Org files to HTML presentations - using =s5=. - -*** ~ox-groff.el~ by Luis Anaya and Nicolas Goaziou - - The [[https://www.gnu.org/software/groff/][groff]] (GNU troff) software is a typesetting package which reads - plain text mixed with formatting commands and produces formatted - output. - - Luis Anaya and Nicolas Goaziou implemented ~ox-groff.el~ to allow - conversion from Org files to groff. - -*** ~ox-koma-letter.el~ by Nicolas Goaziou and Alan Schmitt - - This back-end allow to export Org pages to the =KOMA Scrlttr2= format. - -*** ~ox-rss.el~ by Bastien - - This back-end lets you export Org pages to RSS 2.0 feeds. Combined - with the HTML publishing feature, this allows you to build a blog - entirely with Org. - -** New features - -*** Export - -**** New export generic options - -If you use Org exporter, we advise you to re-read [[https://orgmode.org/org.html#Exporting][the manual section about -it]]. It has been updated and includes new options. - -Among the new/updated export options, three are of particular importance: - -- [[doc:org-export-allow-bind-keywords][org-export-allow-bind-keywords]] :: This option replaces the old option - =org-export-allow-BIND= and the default value is =nil=, not =confirm=. - You will need to explicitly set this to =t= in your initialization - file if you want to allow =#+BIND= keywords. - -- [[doc:org-export-with-planning][org-export-with-planning]] :: This new option controls the export of - =SCHEDULED:, DEADLINE:, CLOSED:= lines, and planning information is - now skipped by default during export. This use to be the job of - [[doc:org-export-with-timestamps][org-export-with-timestamps]], but this latter option has been given a - new role: it controls the export of /standalone time-stamps/. When - set to =nil=, Org will not export active and inactive time-stamps - standing on a line by themselves or within a paragraph that only - contains time-stamps. - -To check if an option has been introduced or its default value changed in -Org 8.0, do =C-h v [option] RET= and check if the documentation says that -the variable has been introduced (or changed) in version 24.4 of Emacs. - -**** Enhanced default stylesheet for the HTML exporter - -See the new default value of [[doc:org-html-style-default][org-html-style-default]]. - -**** New tags, classes and ids for the HTML exporter - -See the new default value of [[doc:org-html-divs][org-html-divs]]. - -**** Support for tikz pictures in LaTeX export -**** ~org-man.el~: New export function for "man" links -**** ~org-docview.el~: New export function for docview links -*** Structure editing - -**** =C-u C-u M-RET= inserts a heading at the end of the parent subtree -**** Cycling to the =CONTENTS= view keeps inline tasks folded - -[[doc:org-cycle-hook][org-cycle-hook]] as a new function [[doc:org-cycle-hide-inline-tasks][org-cycle-hide-inline-tasks]] which -prevents the display of inline tasks when showing the content of a subtree. - -**** =C-c -= in a region makes a list item for each line - -This is the opposite of the previous behavior, where =C-c -= on a region -would create one item for the whole region, and where =C-u C-c -= would -create an item for each line. Now =C-c -= on the selected region creates -an item per line, and =C-u C-c -= creates a single item for the whole -region. - -**** When transposing words, markup characters are now part of the words - -In Emacs, you can transpose words with =M-t=. Transposing =*these* -_words__= will preserve markup. - -**** New command [[doc:org-set-property-and-value][org-set-property-and-value]] bound to =C-c C-x P= - -This command allows you to quickly add both the property and its value. It -is useful in buffers where there are many properties and where =C-c C-x p= -can slow down the flow of editing too much. - -**** New commands [[doc:org-next-block][org-next-block]] and [[doc:org-previous-block][org-previous-block]] - -These commands allow you to go to the previous block (=C-c M-b= or the -speedy key =B=) or to the next block (=C-c M-f= or the speedy key =F=.) - -**** New commands [[doc:org-drag-line-forward][org-drag-line-forward]] and [[doc:org-drag-line-backward][org-drag-line-backward]] - -These commands emulate the old behavior of =M-= and =M-= but are -now bound to =S-M-= and =S-M-= respectively, since =M-= and -=M-= now drag the whole element at point (a paragraph, a table, etc.) -forward and backward. - -**** When a list item has a checkbox, inserting a new item uses a checkbox too -**** When sorting entries/items, only the description of links is considered - -Now Org will sort this list - -: - [[http://abc.org][B]] -: - [[http://def.org][A]] - -like this: - -: - [[http://def.org][A]] -: - [[http://abc.org][B]] - -by comparing the descriptions, not the links. -Same when sorting headlines instead of list items. -**** New option =orgstruct-heading-prefix-regexp= - -For example, setting this option to "^;;; " in Emacs lisp files and using -=orgstruct-mode= in those files will allow you to cycle through visibility -states as if lines starting with ";;; *..." where headlines. - -In general, you want to set =orgstruct-heading-prefix-regexp= as a file -local variable. - -**** New behavior of [[doc:org-clone-subtree-with-time-shift][org-clone-subtree-with-time-shift]] - -The default is now to ask for a time-shift only when there is a time-stamp. -When called with a universal prefix argument =C-u=, it will not ask for a -time-shift even if there is a time-stamp. - -**** New option [[doc:org-agenda-restriction-lock-highlight-subtree][org-agenda-restriction-lock-highlight-subtree]] - -This defaults to =t= so that the whole subtree is highlighted when you -restrict the agenda view to it with =C-c C-x <= (or the speed command =<=). -The default setting helps ensuring that you are not adding tasks after the -restricted region. If you find this highlighting too intrusive, set this -option to =nil=. -**** New option [[doc:org-closed-keep-when-no-todo][org-closed-keep-when-no-todo]] - -When switching back from a =DONE= keyword to a =TODO= keyword, Org now -removes the =CLOSED= planning information, if any. It also removes this -information when going back to a non-TODO state (e.g., with =C-c C-t SPC=). -If you want to keep the =CLOSED= planning information when removing the -TODO keyword, set [[doc:org-closed-keep-when-no-todo][org-closed-keep-when-no-todo]] to =t=. - -**** New option [[doc:org-image-actual-width][org-image-actual-width]] - -This option allows you to change the width of in-buffer displayed images. -The default is to use the actual width of the image, but you can use a -fixed value for all images, or fall back on an attribute like - -: #+attr_html: :width 300px -*** Scheduled/deadline - -**** Implement "delay" cookies for scheduled items - -If you want to delay the display of a scheduled task in the agenda, you can -now use a delay cookie like this: =SCHEDULED: <2004-12-25 Sat -2d>=. The -task is still scheduled on the 25th but will appear in your agenda starting -from two days later (i.e. from March 27th.) - -Imagine for example that your co-workers are not done in due time and tell -you "we need two more days". In that case, you may want to delay the -display of the task in your agenda by two days, but you still want the task -to appear as scheduled on March 25th. - -In case the task contains a repeater, the delay is considered to affect all -occurrences; if you want the delay to only affect the first scheduled -occurrence of the task, use =--2d= instead. See [[doc:org-scheduled-delay-days][org-scheduled-delay-days]] -and [[doc:org-agenda-skip-scheduled-delay-if-deadline][org-agenda-skip-scheduled-delay-if-deadline]] for details on how to -control this globally or per agenda. - -**** Use =C-u C-u C-c C-s= will insert a delay cookie for scheduled tasks - -See the previous section for why delay cookies may be useful. - -**** Use =C-u C-u C-c C-d= will insert a warning delay for deadline tasks - -=C-u C-u C-c C-d= now inserts a warning delay to deadlines. -*** Calendar, diary and appts - -**** New variable [[doc:org-read-date-minibuffer-local-map][org-read-date-minibuffer-local-map]] - -By default, this new local map uses "." to go to today's date, like in the -normal =M-x calendar RET=. If you want to deactivate this and to reassign -the "@" key to =calendar-goto-today=, use this: - -#+BEGIN_SRC emacs-lisp - ;; Unbind "." in Org's calendar: - (define-key org-read-date-minibuffer-local-map (kbd ".") nil) - - ;; Bind "@" to `calendar-goto-today': - (define-key org-read-date-minibuffer-local-map - (kbd "@") - (lambda () (interactive) (org-eval-in-calendar '(calendar-goto-today)))) -#+END_SRC - -**** In Org's calendar, =!= displays diary entries of the date at point - -This is useful when you want to check if you don't already have an -appointment when setting new ones with =C-c .= or =C-c s=. =!= will -call =diary-view-entries= and display the diary in a separate buffer. - -**** [[doc:org-diary][org-diary]]: only keep the descriptions of links - -[[doc:org-diary][org-diary]] returns diary information from Org files, but it returns it -in a diary buffer, not in an Org mode buffer. When links are displayed, -only show their description, not the full links. -*** Agenda - -**** New agenda type =agenda*= and entry types =:scheduled* :deadline*= - -When defining agenda custom commands, you can now use =agenda*=: this will -list entries that have both a date and a time. This is useful when you -want to build a list of appointments. - -You can also set [[doc:org-agenda-entry-types][org-agenda-entry-types]] either globally or locally in -each agenda custom command and use =:timestamp*= and/or =:deadline*= there. - -Another place where this is useful is your =.diary= file: - -: %%(org-diary :scheduled*) ~/org/rdv.org - -This will list only entries from =~/org/rdv.org= that are scheduled with a -time value (i.e. appointments). - -**** New agenda sorting strategies - -[[doc:org-agenda-sorting-strategy][org-agenda-sorting-strategy]] allows these new sorting strategies: - -| Strategy | Explanations | -|----------------+------------------------------------------| -| timestamp-up | Sort by any timestamp, early first | -| timestamp-down | Sort by any timestamp, late first | -| scheduled-up | Sort by scheduled timestamp, early first | -| scheduled-down | Sort by scheduled timestamp, late first | -| deadline-up | Sort by deadline timestamp, early first | -| deadline-down | Sort by deadline timestamp, late first | -| ts-up | Sort by active timestamp, early first | -| ts-down | Sort by active timestamp, late first | -| tsia-up | Sort by inactive timestamp, early first | -| tsia-down | Sort by inactive timestamp, late first | - -**** New options to limit the number of agenda entries - -You can now limit the number of entries in an agenda view. This is -different from filters: filters only /hide/ the entries in the agenda, -while limits are set while generating the list of agenda entries. - -These new options are available: - -- [[doc:org-agenda-max-entries][org-agenda-max-entries]] :: limit by number of entries. -- [[doc:org-agenda-max-todos][org-agenda-max-todos]] :: limit by number of TODOs. -- [[doc:org-agenda-max-tags][org-agenda-max-tags]] :: limit by number of tagged entries. -- [[doc:org-agenda-max-effort][org-agenda-max-effort]] :: limit by effort (minutes). - -For example, if you locally set [[doc:org-agenda-max-todos][org-agenda-max-todos]] to 3 in an agenda -view, the agenda will be limited to the first three todos. Other entries -without a TODO keyword or beyond the third TODO headline will be ignored. - -When setting a limit (e.g. about an effort's sum), the default behavior is -to exclude entries that cannot be checked against (e.g. entries that have -no effort property.) To include other entries too, you can set the limit -to a negative number. For example =(setq org-agenda-max-tags -3)= will not -show the fourth tagged headline (and beyond), but it will also show -non-tagged headlines. - -**** =~= in agenda view sets temporary limits - -You can hit =~= in the agenda to temporarily set limits: this will -regenerate the agenda as if the limits were set. This is useful for -example when you want to only see a list of =N= tasks, or a list of tasks -that take only =N= minutes. - -**** "=" in agenda view filters by regular expressions - -You can now filter agenda entries by regular expressions using ~=~. =C-u -== will filter entries out. Regexp filters are cumulative. You can set -[[doc:org-agenda-regexp-filter-preset][org-agenda-regexp-filter-preset]] to suit your needs in each agenda view. - -**** =|= in agenda view resets all filters - -Since it's common to combine tag filters, category filters, and now regexp -filters, there is a new command =|= to reset all filters at once. - -**** Allow writing an agenda to an =.org= file - -You can now write an agenda view to an =.org= file. It copies the -headlines and their content (but not subheadings) into the new file. - -This is useful when you want to quickly share an agenda containing the full -list of notes. - -**** New commands to drag an agenda line forward (=M-=) or backward (=M-=) - -It sometimes handy to move agenda lines around, just to quickly reorganize -your tasks, or maybe before saving the agenda to a file. Now you can use -=M-= and =M-= to move the line forward or backward. - -This does not persist after a refresh of the agenda, and this does not -change the =.org= files who contribute to the agenda. - -**** Use =%b= for displaying "breadcrumbs" in the agenda view - -[[doc:org-agenda-prefix-format][org-agenda-prefix-format]] now allows to use a =%b= formatter to tell Org -to display "breadcrumbs" in the agenda view. - -This is useful when you want to display the task hierarchy in your agenda. - -**** Use =%l= for displaying the headline's level in the agenda view - -[[doc:org-agenda-prefix-format][org-agenda-prefix-format]] allows to use a =%l= formatter to tell Org to -display entries with additional spaces corresponding to their level in the -outline tree. - -**** [[doc:org-agenda-write][org-agenda-write]] will ask before overwriting an existing file - -=M-x org-agenda-write RET= (or =C-c C-w= from an agenda buffer) used to -overwrite preexisting file with the same name without confirmation. It now -asks for a confirmation. - -**** New commands =M-m= and =M-*= to toggle (all) mark(s) for bulk action - -- [[doc:org-agenda-bulk-toggle][org-agenda-bulk-toggle]] :: this command is bound to =M-m= and toggles - the mark of the entry at point. - -- [[doc:org-agenda-bulk-toggle-all][org-agenda-bulk-toggle-all]] :: this command is bound to =M-*= and - toggles all the marks in the current agenda. - -**** New option [[doc:org-agenda-search-view-max-outline-level][org-agenda-search-view-max-outline-level]] - -This option sets the maximum outline level to display in search view. -E.g. when this is set to 1, the search view will only show headlines of -level 1. - -**** New option [[doc:org-agenda-todo-ignore-time-comparison-use-seconds][org-agenda-todo-ignore-time-comparison-use-seconds]] - -This allows to compare times using seconds instead of days when honoring -options like =org-agenda-todo-ignore-*= in the agenda display. - -**** New option [[doc:org-agenda-entry-text-leaders][org-agenda-entry-text-leaders]] - -This allows you to get rid of the ">" character that gets added in front of -entries excerpts when hitting =E= in the agenda view. - -**** New formatting string for past deadlines in [[doc:org-agenda-deadline-leaders][org-agenda-deadline-leaders]] - -The default formatting for past deadlines is ="%2d d. ago: "=, which makes -it explicit that the deadline is in the past. You can configure this via -[[doc:org-agenda-deadline-leaders][org-agenda-deadline-leaders]]. Note that the width of the formatting -string is important to keep the agenda alignment clean. - -**** New allowed value =repeated-after-deadline= for [[doc:org-agenda-skip-scheduled-if-deadline-is-shown][org-agenda-skip-scheduled-if-deadline-is-shown]] - -When [[doc:org-agenda-skip-scheduled-if-deadline-is-shown][org-agenda-skip-scheduled-if-deadline-is-shown]] is set to -=repeated-after-deadline=, the agenda will skip scheduled items if they are -repeated beyond the current deadline. - -**** New option for [[doc:org-agenda-skip-deadline-prewarning-if-scheduled][org-agenda-skip-deadline-prewarning-if-scheduled]] - -This variable may be set to nil, t, the symbol `pre-scheduled', or a number -which will then give the number of days before the actual deadline when the -prewarnings should resume. The symbol `pre-scheduled' eliminates the -deadline prewarning only prior to the scheduled date. - -Read the full docstring for details. - -**** [[doc:org-class][org-class]] now supports holiday strings in the skip-weeks parameter - -For example, this task will now be skipped only on new year's day: - - : * Task - : <%%(org-class 2012 1 1 2013 12 12 2 "New Year's Day")> -*** Capture - -**** Allow =C-1= as a prefix for [[doc:org-agenda-capture][org-agenda-capture]] and [[doc:org-capture][org-capture]] - -With a =C-1= prefix, the capture mechanism will use the =HH:MM= value at -point (if any) or the current =HH:MM= time as the default time for the -capture template. - -**** Expand keywords within %(sexp) placeholder in capture templates - -If you use a =%:keyword= construct within a =%(sexp)= construct, Org will -expand the keywords before expanding the =%(sexp)=. - -**** Allow to contextualize capture (and agenda) commands by checking the name of the buffer - -[[doc:org-capture-templates-contexts][org-capture-templates-contexts]] and [[doc:org-agenda-custom-commands-contexts][org-agenda-custom-commands-contexts]] -allow you to define what capture templates and what agenda commands should -be available in various contexts. It is now possible for the context to -check against the name of the buffer. -*** Tag groups - -Using =#+TAGS: { Tag1 : Tag2 Tag3 }= will define =Tag1= as a /group tag/ -(note the colon after =Tag1=). If you search for =Tag1=, it will return -headlines containing either =Tag1=, =Tag2= or =Tag3= (or any combination -of those tags.) - -You can use group tags for sparse tree in an Org buffer, for creating -agenda views, and for filtering. - -See https://orgmode.org/org.html#Tag-groups for details. - -*** Links - -**** =C-u C-u M-x org-store-link RET= will ignore non-core link functions - -Org knows how to store links from Org buffers, from info files and from -other Emacs buffers. Org can be taught how to store links from any buffer -through new link protocols (see [[https://orgmode.org/org.html#Adding-hyperlink-types]["Adding hyperlink types"]] in the manual.) - -Sometimes you want Org to ignore added link protocols and store the link -as if the protocol was not known. - -You can now do this with =C-u C-u M-x org-store-link RET=. - -**** =C-u C-u C-u M-x org-store-link RET= on an active region will store links for each lines - -Imagine for example that you want to store a link for every message in a -Gnus summary buffer. In that case =C-x h C-u C-u C-u M-x org-store-link -RET= will store a link for every line (i.e. message) if the region is -active. - -**** =C-c C-M-l= will add a default description for links which don't have one - -=C-c C-M-l= inserts all stored links. If a link does not have a -description, this command now adds a default one, so that we are not mixing -with-description and without-description links when inserting them. - -**** No curly braces to bracket links within internal links - -When storing a link to a headline like - -: * See [[https://orgmode.org][Org website]] - -[[doc:org-store-link][org-store-link]] used to convert the square brackets into curly brackets. -It does not anymore, taking the link description or the link path, when -there is no description. -*** Table - -**** Switching between #+TBLFM lines - -If you have several =#+TBLFM= lines below a table, =C-c C-c= on a line will -apply the formulas from this line, and =C-c C-c= on another line will apply -those other formulas. - -**** You now use "nan" for empty fields in Calc formulas - -If empty fields are of interest, it is recommended to reread the section -[[https://orgmode.org/org.html#Formula-syntax-for-Calc][3.5.2 Formula syntax for Calc]] of the manual because the description for the -mode strings has been clarified and new examples have been added towards -the end. - -**** Handle localized time-stamps in formulas evaluation - -If your =LOCALE= is set so that Org time-stamps use another language than -english, and if you make time computations in Org's table, it now works by -internally converting the time-stamps with a temporary =LOCALE=C= before -doing computation. - -**** New lookup functions - -There are now three lookup functions: - -- [[doc:org-loopup-first][org-loopup-first]] -- [[doc:org-loopup-last][org-loopup-last]] -- [[doc:org-loopup-all][org-loopup-all]] - -See [[https://orgmode.org/org.html#Lookup-functions][the manual]] for details. -*** Startup keywords - -These new startup keywords are now available: - -| Startup keyword | Option | -|----------------------------------+---------------------------------------------| -| =#+STARTUP: logdrawer= | =(setq org-log-into-drawer t)= | -| =#+STARTUP: nologdrawer= | =(setq org-log-into-drawer nil)= | -|----------------------------------+---------------------------------------------| -| =#+STARTUP: logstatesreversed= | =(setq org-log-states-order-reversed t)= | -| =#+STARTUP: nologstatesreversed= | =(setq org-log-states-order-reversed nil)= | -|----------------------------------+---------------------------------------------| -| =#+STARTUP: latexpreview= | =(setq org-startup-with-latex-preview t)= | -| =#+STARTUP: nolatexpreview= | =(setq org-startup-with-latex-preview nil)= | - -*** Clocking - -**** New option [[doc:org-clock-rounding-minutes][org-clock-rounding-minutes]] - -E.g. if [[doc:org-clock-rounding-minutes][org-clock-rounding-minutes]] is set to 5, time is 14:47 and you -clock in: then the clock starts at 14:45. If you clock out within the next -5 minutes, the clock line will be removed; if you clock out 8 minutes after -your clocked in, the clock out time will be 14:50. - -**** New option [[doc:org-time-clocksum-use-effort-durations][org-time-clocksum-use-effort-durations]] - -When non-nil, =C-c C-x C-d= uses effort durations. E.g., by default, one -day is considered to be a 8 hours effort, so a task that has been clocked -for 16 hours will be displayed as during 2 days in the clock display or in -the clocktable. - -See [[doc:org-effort-durations][org-effort-durations]] on how to set effort durations and -[[doc:org-time-clocksum-format][org-time-clocksum-format]] for more on time clock formats. - -**** New option [[doc:org-clock-x11idle-program-name][org-clock-x11idle-program-name]] - -This allows to set the name of the program which prints X11 idle time in -milliseconds. The default is to use =x11idle=. - -**** New option [[doc:org-use-last-clock-out-time-as-effective-time][org-use-last-clock-out-time-as-effective-time]] - -When non-nil, use the last clock out time for [[doc:org-todo][org-todo]]. Note that this -option has precedence over the combined use of [[doc:org-use-effective-time][org-use-effective-time]] and -[[doc:org-extend-today-until][org-extend-today-until]]. - -**** =S-= on a clocksum column will update the sum by updating the last clock -**** =C-u 3 C-S-= will update clock timestamps synchronously by 3 units -**** New parameter =:wstart= for clocktables to define the week start day -**** New parameter =:mstart= to state the starting day of the month -**** Allow relative times in clocktable tstart and tend options -**** The clocktable summary is now a caption -**** =:tstart= and =:tend= and friends allow relative times like "<-1w>" or "" -*** Babel - -**** You can now use =C-c C-k= for [[doc:org-edit-src-abort][org-edit-src-abort]] - -This allows you to quickly cancel editing a source block. - -**** =C-u C-u M-x org-babel-tangle RET= tangles by the target file of the block at point - -This is handy if you want to tangle all source code blocks that have the -same target than the block at point. - -**** New options for auto-saving the base buffer or the source block editing buffer - -When [[doc:org-edit-src-turn-on-auto-save][org-edit-src-turn-on-auto-save]] is set to =t=, editing a source block -in a new window will turn on =auto-save-mode= and save the code in a new -file under the same directory than the base Org file. - -When [[doc:org-edit-src-auto-save-idle-delay][org-edit-src-auto-save-idle-delay]] is set to a number of minutes =N=, -the base Org buffer will be saved after this number of minutes of idle -time. - -**** New =:post= header argument post-processes results - - This header argument may be used to pass the results of the current - code block through another code block for post-processing. See the - manual for a usage example. - -**** Commented out heading are ignored when collecting blocks for tangling - -If you comment out a heading (with =C-c ;= anywhere on the heading or in -the subtree), code blocks from within this heading are now ignored when -collecting blocks for tangling. - -**** New option [[doc:org-babel-hash-show-time][org-babel-hash-show-time]] to show a time-stamp in the result hash -**** Do not ask for confirmation if cached value is current - -Do not run [[doc:org-babel-confirm-evaluate][org-babel-confirm-evaluate]] if source block has a cache and the -cache value is current as there is no evaluation involved in this case. -**** =ob-sql.el= and =ob-python.el= have been improved. -**** New Babel files only need to =(require 'ob)= - -When writing a new Babel file, you now only need to use =(require 'ob)= -instead of requiring each Babel library one by one. -*** Faces - -- Org now fontifies radio link targets by default -- In the agenda, use [[doc:org-todo-keyword-faces][org-todo-keyword-faces]] to highlight selected TODO keywords -- New face [[doc:org-priority][org-priority]], enhanced fontification of priority cookies in agenda -- New face [[doc:org-tag-group][org-tag-group]] for group tags - -** Miscellaneous - -- New speedy key =s= pour [[doc:org-narrow-to-subtree][org-narrow-to-subtree]] -- Handling of [[doc:org-html-table-row][org-html-table-row]] has been updated (incompatible change) -- [[doc:org-export-html-table-tag][org-export-html-table-tag]] is replaced by [[doc:org-html-table-default-attributes][org-html-table-default-attributes]] -- Support using =git-annex= with Org attachments -- org-protocol: Pass optional value using query in url to capture from protocol -- When the refile history is empty, use the current filename as default -- When you cannot change the TODO state of a task, Org displays the blocking task -- New option [[doc:org-mobile-allpriorities][org-mobile-allpriorities]] -- org-bibtex.el now use =visual-line-mode= instead of the deprecated =longlines-mode= -- [[doc:org-format-latex-options][org-format-latex-options]] allows to set the foreground/background colors automatically -- New option [[doc:org-archive-file-header-format][org-archive-file-header-format]] -- New "neg" entity in [[doc:org-entities][org-entities]] -- New function [[doc:org-docview-export][org-docview-export]] to export docview links -- New =:eps= header argument for ditaa code blocks -- New option [[doc:org-gnus-no-server][org-gnus-no-server]] to start Gnus with =gnus-no-server= -- Org is now distributed with =htmlize.el= version 1.43 -- ~org-drill.el~ has been updated to version 2.3.7 -- ~org-mac-iCal.el~ now supports OS X versions up to 10.8 -- Various improvements to ~org-contacts.el~ and =orgpan.el= - -** Outside Org - -*** Spanish translation of the Org guide by David Arroyo Menéndez - -David (and others) translated the Org compact guide in spanish: - -You can read the [[https://orgmode.org/worg/orgguide/orgguide.es.pdf][PDF guide]]. - -*** ~poporg.el~ and ~outorg.el~ - -Two new libraries (~poporg.el~ by François Pinard and ~outorg.el~ by -Thorsten Jolitz) now enable editing of comment-sections from source-code -buffers in temporary Org-mode buffers, making the full editing power of -Org-mode available. ~outorg.el~ comes together with ~outshine.el~ and -~navi-mode.el~, two more libraries by Thorsten Jolitz with the goal to give -source-code buffers the /look & feel/ of Org-mode buffers while greatly -improving navigation and structure editing. A detailed description can be -found here: https://orgmode.org/worg/org-tutorials/org-outside-org.html - -Here are two screencasts demonstrating Thorsten's tools: - -- [[http://youtu.be/nqE6YxlY0rw]["Modern conventions for Emacs Lisp files"]] -- [[http://www.youtube.com/watch?v%3DII-xYw5VGFM][Exploring Bernt Hansen's Org-mode tutorial with 'navi-mode']] - -*** MobileOrg for iOS - -MobileOrg for iOS back in the App Store The 1.6.0 release was focused on -the new Dropbox API and minor bug fixes but also includes a new ability to -launch in Capture mode. Track development and contribute [[https://github.com/MobileOrg/mobileorg/issues][on github]]. - -* Version 7.9.3 - -** New option [[doc::org-agenda-use-tag-inheritance][org-agenda-use-tag-inheritance]] - -[[doc::org-use-tag-inheritance][org-use-tag-inheritance]] controls whether tags are inherited when -org-tags-view is called (either in =tags=, =tags-tree= or =tags-todo= -agenda views.) - -When generating other agenda types such as =agenda=, =todo= and -=todo-tree=, tags inheritance is not used when selecting the entries -to display. Still, you might want to have all tag information correct -in the agenda buffer, e.g. for tag filtering. In that case, add the -agenda type to this variable. - -Setting this variable to nil should considerably speeds up the agenda -generation. - -Note that the default was to display inherited tags in the agenda -lines even if `org-use-tag-inheritance' was nil. The default is now -to *never* display inherited tags in agenda lines, but to /know/ about -them when the agenda type is listed in [[doc::org-agenda-use-tag-inheritance][org-agenda-use-tag-inheritance]]. - -** New default value nil for [[doc::org-agenda-dim-blocked-tasks][org-agenda-dim-blocked-tasks]] - -Using `nil' as the default value speeds up the agenda generation. You -can hit `#' (or `C-u #') in agenda buffers to temporarily dim (or turn -invisible) blocked tasks. - -** New speedy keys for [[doc::org-speed-commands-default][org-speed-commands-default]] - -You can now use `:' (instead of `;') for setting tags---this is -consistent with using the `:' key in agenda view. - -You can now use `=' for [[doc::org-columns][org-columns]]. - -** =org-float= is now obsolete, use =diary-float= instead -** No GPL manual anymore - -There used to be a GPL version of the Org manual, but this is not the -case anymore, the Free Software Foundation does not permit this. - -The GNU FDL license is now included in the manual directly. - -** Enhanced compatibility with Emacs 22 and XEmacs - -Thanks to Achim for his work on enhancing Org's compatibility with -various Emacsen. Things may not be perfect, but Org should work okay -in most environments. - -* Version 7.9.2 - -** New ELPA repository for Org packages - -You can now add the Org ELPA repository like this: - -#+BEGIN_SRC emacs-lisp -(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t) -#+END_SRC - -It contains both the =org-*.tar= package (the core Org distribution, also -available through https://elpa.gnu.org) and the =org-plus*.tar= package (the -extended Org distribution, with non-GNU packages from the =contrib/= -directory.) - -See https://orgmode.org/elpa/ - -** Overview of the new keybindings - - | Keybinding | Speedy | Command | - |-----------------+--------+-----------------------------| - | =C-c C-x C-z= | | [[doc::org-clock-resolve][org-clock-resolve]] | - | =C-c C-x C-q= | | [[doc::org-clock-cancel][org-clock-cancel]] | - | =C-c C-x C-x= | | [[doc::org-clock-in-last][org-clock-in-last]] | - | =M-h= | | [[doc::org-mark-element][org-mark-element]] | - | =*= | | [[doc::org-agenda-bulk-mark-all][org-agenda-bulk-mark-all]] | - | =C-c C-M-l= | | [[doc::org-insert-all-links][org-insert-all-links]] | - | =C-c C-x C-M-v= | | [[doc::org-redisplay-inline-images][org-redisplay-inline-images]] | - | =C-c C-x E= | =E= | [[doc::org-inc-effort][org-inc-effort]] | - | | =#= | [[doc::org-toggle-comment][org-toggle-comment]] | - | | =:= | [[doc::org-columns][org-columns]] | - | | =W= | Set =APPT_WARNTIME= | - | =k= | | [[doc::org-agenda-capture][org-agenda-capture]] | - | C-c , | , | [[doc::org-priority][org-priority]] | - -** New package and Babel language - -*** =org-eshell.el= by Konrad Hinsen is now in Org - - =org-eshell.el= allows you to create links from [[https://www.gnu.org/software/emacs/manual/html_node/eshell/index.html][Eshell]]. - -*** Support for execution of Scala code blocks (see ob-scala.el) -*** Support for execution of IO code blocks (see ob-io.el) - -** Incompatible changes - - - If your code relies on =org-write-agenda=, please use - [[doc::org-agenda-write][org-agenda-write]] from now on. - - - If your code relies on =org-make-link=, please use =concat= - instead. - - - =org-link-to-org-use-id= has been renamed to - =org-id-link-to-org-use-id= and its default value is nil. The - previous default was =create-if-interactive-and-no-custom-id=. - -** New features and user-visible changes - -*** Org Element - - =org-element.el= is a toolbox for parsing and analyzing "elements" - in an Org-mode buffer. This has been written by Nicolas Goaziou - and has been tested for quite some time. It is now part of Org's - core and many core functions rely on this package. - - Two functions might be particularly handy for users: - =org-element-at-point= and =org-element-context=. - - See the docstrings for more details. - - Below is a list of editing and navigating commands that now rely - on =org-element.el=. - -**** [[doc::org-fill-paragraph][org-fill-paragraph]] has been completely rewritten - - The filling mechanisms now rely on org-element, trying to do the - right thing on each element in various contexts. E.g. filling in - a list item will preserve indentation; filling in message-mode - will fall back on the relevant filling functions; etc. - -**** [[doc::org-metaup][org-metaup]] and [[doc::org-metadown][org-metadown]] will drag the element backward/forward - - If you want to get the old behavior (i.e. moving a line up and - down), you can first select the line as an active region, then - =org-metaup= or =org-metadown= to move the region backward or - forward. This also works with regions bigger than just one line. - -**** [[doc::org-up-element][org-up-element]] and [[doc::org-down-element][org-down-element]] (respectively =C-c C-^= and =C-c C-_=) - - This will move the point up/down in the hierarchy of elements. - -**** [[doc::org-backward-element][org-backward-element]] and [[doc::org-forward-element][org-forward-element]] (respectively =M-{= and =M-}=) - - This will move the point backward/forward in the hierarchy of - elements. - -**** [[doc::org-narrow-to-element][org-narrow-to-element]] will narrow to the element at point -**** [[doc::org-mark-element][org-mark-element]] will mark the element at point - - This command is bound to =M-h= and will mark the element at - point. If the point is at a paragraph, it will mark the - paragraph. If the point is at a list item, it will mark the list - item. Etc. - - Note that if point is at the beginning of a list, it will mark - the whole list. - - To mark a subtree, you can either use =M-h= on the headline - (since there is no ambiguity about the element you're at) or - [[doc::org-mark-subtree][org-mark-subtree]] (=C-c @=) anywhere in the subtree. - - Invoking [[doc::org-mark-element][org-mark-element]] repeatedly will try to mark the next - element on top of the previous one(s). E.g. hitting =M-h= twice - on a headline will mark the current subtree and the next one on - the same level. - -*** Org Agenda - -**** New option [[doc::org-agenda-sticky][org-agenda-sticky]] - - There is a new option =org-agenda-sticky= which enables "sticky" - agendas. Sticky agendas remain opened in the background so that - you don't need to regenerate them each time you hit the - corresponding keystroke. This is a big time saver. - - When [[doc::org-agenda-sticky][org-agenda-sticky]] is =non-nil=, the agenda buffer will be - named using the agenda key and its description. In sticky - agendas, the =q= key will just bury the agenda buffers and - further agenda commands will show existing buffer instead of - generating new ones. - - If [[doc::org-agenda-sticky][org-agenda-sticky]] is set to =nil=, =q= will kill the single - agenda buffer. - -**** New option [[doc::org-agenda-custom-commands-contexts][org-agenda-custom-commands-contexts]] - - Setting this option allows you to define specific context where - agenda commands should be available from. For example, when set - to this value - - #+BEGIN_SRC emacs-lisp - (setq org-agenda-custom-commands-contexts - '(("p" (in-file . "\\.txt")))) -#+END_SRC - - then the =p= agenda command will only be available from buffers - visiting *.txt files. See the docstring and the manual for more - details on how to use this. - -**** Changes in bulk actions - - The set of commands starting with =k ...= as been deleted and the - features have been merged into the "bulk action" feature. - - After you marked some entries in the agenda, if you call =B s=, - the agenda entries will be rescheduled using the date at point if - on a date header. If you are on an entry with a timestamp, you - will be prompted for a date to reschedule your marked entries to, - using the timestamp at point as the default prompt. - - You can now use =k= to capture the marked entry and use the date - at point as an overriding date for the capture template. - - To bind this behavior to =M-x org-capture RET= (or its - keybinding), set the new option [[doc::org-capture-use-agenda-date][org-capture-use-agenda-date]] to - =t=. - -**** =N= and =P= in the agenda will move to the next/previous item - -**** New command [[doc::org-agenda-bulk-mark-all][org-agenda-bulk-mark-all]] to mark all items - - This new command is bound to =*= in agenda mode. - - There is also a new option [[doc::org-agenda-bulk-mark-char][org-agenda-bulk-mark-char]] to set the - character to use as a mark for bulk actions. - -**** New option [[doc::org-agenda-persistent-marks][org-agenda-persistent-marks]] - - When set to =non-nil=, marks will remain visible after a bulk - action. You can temporarily toggle this by pressing =p= when - invoking [[doc::org-agenda-bulk-action][org-agenda-bulk-action]]. Marks are deleted if your - rebuild the agenda buffer or move to another date/span (e.g. with - =f= or =w=). - -**** New option [[doc::org-agenda-skip-timestamp-if-deadline-is-shown][org-agenda-skip-timestamp-if-deadline-is-shown]] - - =Non-nil= means skip timestamp line if same entry shows because - of deadline. - - In the agenda of today, an entry can show up multiple times - because it has both a plain timestamp and has a nearby deadline. - When this variable is t, then only the deadline is shown and the - fact that the entry has a timestamp for or including today is not - shown. When this variable is =nil=, the entry will be shown - several times. - -**** New =todo-unblocked= and =nottodo-unblocked= skip conditions - - See the [[https://orgmode.org/cgit.cgi/org-mode.git/commit/?id=f426da][git commit]] for more explanations. - -**** Allow category filtering in the agenda - - You can now filter the agenda by category. Pressing "<" will - filter by the category of the item on the current line, and - pressing "<" again will remove the filter. You can combine tag - filters and category filters. - - You can use =org-agenda-category-filter= in your custom agenda - views and =org-agenda-category-filter-preset= in your main - configuration. - - See also the new command [[doc::org-agenda-filter-by-top-category][org-agenda-filter-by-top-category]]: - hitting =^= will filter by "Top" category: only show entries that - are of the same category than the Top category of the entry at - point. - -*** Org Links - -**** Inserting links - - When inserting links through [[doc::org-insert-link][org-insert-link]], the description is - now displayed first, followed by the literal link, as the - description is often more useful when you look for the link you - want to insert. - - Completion now complete both literal links and description. If - you complete a description, the literal link and its description - will be inserted directly, whereas when you complete the literal - link, you will be prompted for a description (as with Org 7.8.) - - In the completion buffer, links to the current buffer are now - highlighted. - -**** New templates =%h= and =%(sexp)= for abbreviated links - - On top of =%s= template, which is replaced by the link tag in - abbreviated links, you can now use =%h= (which does the same than =%s= - but does not hexify the tag) and =%(sexp)= (which can run a function - that takes the tag as its own argument.) - -**** New link type =help= - - You can now create links from =help= buffers. - - For example, if you request help for the command [[doc::org-agenda][org-agenda]] with - =C-h f org-agenda RET=, creating a link from this buffer will let - you go back to the same buffer. - -**** New command [[doc::org-insert-all-links][org-insert-all-links]] - - This will insert all links as list items. With a universal - prefix argument, links will not be deleted from the variable - =org-stored-links=. - - This new command is bound to =C-c C-M-l=. - -**** New option [[doc::org-url-hexify-p][org-url-hexify-p]] - - When set to =nil=, the =URL= part of a link will not be hexified. - -**** Org can now open multiple shell links - -**** New option [[doc::org-doi-server-url][org-doi-server-url]] to specify an alternate DOI server - -**** RET now follows time stamps links - -*** Org Editing - -**** [[doc::org-todo][org-todo]] and =org-archive-*= can now loop in the active region - - When [[doc::org-loop-over-headlines-in-active-region][org-loop-over-headlines-in-active-region]] is =non-nil=, using - [[doc::org-todo][org-todo]] or =org-archive-*= commands in the active region will - loop over headlines. This is handy if you want to set the TODO - keyword for several items, or archive them quickly. - -**** You can now set tags for headlines in a region - - If [[doc::org-loop-over-headlines-in-active-region][org-loop-over-headlines-in-active-region]] is =non-nil=, then - selecting the region and hitting =C-c C-q= will set the tags for - all headlines in the region. - -**** New command [[doc::org-insert-drawer][org-insert-drawer]] to insert a drawer interactively - -**** Comments start with "^[ \t]*# " anywhere on a line - - Note that the space after the hashtag is mandatory. Comments - with "^#+" are not supported anymore. - -**** New speed key =#= to toggle the COMMENT cookie on a headline - -**** =indent-region-function= is now set to [[doc::org-indent-region][org-indent-region]] - - =C-M-\= should now produce useful results. - - You can unindent the buffer with [[doc::org-unindent-buffer][org-unindent-buffer]]. - -**** New option [[doc::org-allow-promoting-top-level-subtree][org-allow-promoting-top-level-subtree]] - - When =non-nil=, =S-M-= will promote level-1 subtrees - containing other subtrees. The level-1 headline will be - commented out. You can revert to the previous state with =M-x - undo RET=. - -*** Org Clock - -**** New keybinding =C-c C-x C-z= for [[doc::org-clock-resolve][org-clock-resolve]] - -**** New keybinding =C-c C-x C-q= for [[doc::org-clock-cancel][org-clock-cancel]] - -**** New command [[doc::org-clock-in-last][org-clock-in-last]] to clock in the last clocked item - - This command is bound to =C-c C-x C-x= and will clock in the last - clocked entry, if any. - -**** =C-u M-x= [[doc::org-clock-out][org-clock-out]] =RET= now prompts for a state to switch to - -**** =S-M-= on a clock timestamps adjusts the previous/next clock - -**** New option [[doc::org-clock-continuously][org-clock-continuously]] - - When set to =nil=, clocking in a task will first try to find the - last clocked out task and restart from when that task was clocked - out. - - You can temporarily activate continuous clocking with =C-u C-u - C-u M-x= [[doc::org-clock-in][org-clock-in]] =RET= (three universal prefix arguments) - and =C-u C-u M-x= [[org-clock-in-last][org-clock-in-last]] =RET= (two universal prefix - arguments). - - -**** New option [[doc::org-clock-frame-title-format][org-clock-frame-title-format]] - - This option sets the value of =frame-title-format= when clocking - in. - -**** New options for controlling the clockreport display - - [[doc::org-clock-file-time-cell-format][org-clock-file-time-cell-format]]: Format string for the file time - cells in clockreport. - - [[doc::org-clock-total-time-cell-format][org-clock-total-time-cell-format]]: Format string for the total - time cells in clockreport. - - -**** New options for controlling the clock/timer display - - [[doc::org-clock-clocked-in-display][org-clock-clocked-in-display]]: control whether the current clock - is displayed in the mode line and/or frame title. - - [[doc::org-timer-display][org-timer-display]]: control whether the current timer is displayed - in the mode line and/or frame title. - - This allows the clock and timer to be displayed in the frame - title instead of, or as well as, the mode line. This is useful - for people with limited space in the mode line but with ample - space in the frame title. - -*** Org Appearance - -**** New option [[doc::org-custom-properties][org-custom-properties]] - - The visibility of properties listed in this options can be turn - on/off with [[doc::org-toggle-custom-properties-visibility][org-toggle-custom-properties-visibility]]. This might - be useful for properties used by third-part tools or that you - don't want to see temporarily. - -**** New command [[doc::org-redisplay-inline-images][org-redisplay-inline-images]] - - This will redisplay all images. It is bound to =C-c C-x C-M-v=. - -**** New entities in =org-entities.el= - - There are these new entities: - - : ("tilde" "\\~{}" nil "˜" "~" "~" "~") - : ("slash" "/" nil "/" "/" "/" "/") - : ("plus" "+" nil "+" "+" "+" "+") - : ("under" "\\_" nil "_" "_" "_" "_") - : ("equal" "=" nil "=" "=" "=" "=") - : ("asciicirc" "\\textasciicircum{}" nil "^" "^" "^" "^") - -**** New face =org-list-dt= for definition terms -**** New face =org-date-selected= for the selected calendar day -**** New face value for =org-document-title= - - The face is back to a normal height. - -*** Org Columns - -**** New speed command =:= to activate the column view -**** New special property =CLOCKSUM_T= to display today's clocked time - - You can use =CLOCKSUM_T= the same way you use =CLOCKSUM=. It - will display the time spent on tasks for today only. - -**** Use the =:COLUMNS:= property in columnview dynamic blocks - - If the =:COLUMNS:= is set in a subtree, the columnview dynamic - block will use its value as the column format. - -**** Consider inline tasks when computing a sum - -*** Org Dates and Time Stamps - -**** Enhanced [[doc::org-sparse-tree][org-sparse-tree]] - - =C-c /= can now check for time ranges. - - When checking for dates with =C-c /= it is useful to change the - type of dates that you are interested in. You can now do this - interactively with =c= after =C-c /= and/or by setting - [[doc::org-sparse-tree-default-date-type][org-sparse-tree-default-date-type]] to the default value you want. - -**** Support for hourly repeat cookies - - You can now use - - : SCHEDULED: <2012-08-20 lun. 08:00 +1h> - - if you want to add an hourly repeater to an entry. - -**** =C-u C-u C-c .= inserts a time-stamp with no prompt - -**** When (setq [[doc::org-read-date-prefer-future][org-read-date-prefer-future]] 'time), accept days in the prompt - - "8am Wed" and "Wed 8am" are now acceptable values when entering a - date from the prompt. If [[doc::org-read-date-prefer-future][org-read-date-prefer-future]] is set to - =time=, this will produce the expected prompt indication. - -**** New option [[doc::org-datetree-add-timestamp][org-datetree-add-timestamp]] - - When set to =non-nil=, datetree entries will also have a - timestamp. This is useful if you want to see these entries in a - sparse tree with =C-c /=. - -*** Org Capture - -**** New command [[doc::org-capture-string][org-capture-string]] - - M-x [[doc::org-capture-string][org-capture-string]] RET will prompt for a string and a capture - template. The string will be used as an annotation for the - template. This is useful when capturing in batch mode as it lets - you define the content of the template without being in Emacs. - -**** New option [[doc::org-capture-templates-contexts][org-capture-templates-contexts]] - - Setting this option allows you to define specific context where - capture templates should be available from. For example, when - set to this value - - #+BEGIN_SRC emacs-lisp - (setq org-capture-templates-contexts - '(("c" (in-mode . "message-mode")))) -#+END_SRC - - then the =c= capture template will only be available from - =message-mode= buffers. See the docstring and the manual for - more details on how to use this. - -**** New =%l= template to insert the literal link -**** New option [[doc::org-capture-bookmark][org-capture-bookmark]] - - Org used to automatically add a bookmark with capture a note. - You can now turn this on by setting [[doc::org-capture-bookmark][org-capture-bookmark]] to - =nil=. - -**** Expand =%= escape sequences into text entered for 'th =%^{PROMPT}= escape - - See the manual for more explanations. - -**** More control over empty lines - - You can use =:empty-lines-before= and =:empty-lines-after= to - control the insertion of empty lines. Check the manual for more - explanations. - -**** New hook [[doc::org-capture-prepare-finalize-hook][org-capture-prepare-finalize-hook]] - - This new hook runs before the finalization process starts. - -*** Org Export - -**** New functions =orgtbl-to-table.el= and =orgtbl-to-unicode= - - =orgtbl-to-table.el= convert the table to a =table.el= table, and - =orgtbl-to-unicode= will use =ascii-art-to-unicode.el= (when - available) to print beautiful tables. - -**** [[doc::org-table-export][org-table-export]] now a bit clever about the target format - - When you specify a file name like =table.csv=, [[doc::org-table-export][org-table-export]] - will now suggest =orgtbl-to-csv= the default method for exporting - the table. - -**** New option [[doc::org-export-date-timestamp-format][org-export-date-timestamp-format]] - - The option allows to set a time string format for Org timestamps - in the #+DATE option. - -**** LaTeX: New options for exporting table rules :tstart, :hline and :tend - - See [[doc::org-export-latex-tables-hline][org-export-latex-tables-hline]] and [[doc::org-export-latex-tables-tend][org-export-latex-tables-tend]]. - -**** LaTeX: You can now set =:hfmt= from =#+ATTR_LaTeX= -**** Beamer: Add support and keybinding for the =exampleblock= environment - - Add support for these languages in [[doc::org-export-language-setup][org-export-language-setup]]. - More languages are always welcome. - -**** Beamer: New option [[doc::org-beamer-inherited-properties][org-beamer-inherited-properties]] - - This option allows Beamer export to inherit some properties. - Thanks to Carsten for implementing this. - -**** ODT: Add support for ODT export in org-bbdb.el -**** ODT: Add support for indented tables (see [[https://orgmode.org/cgit.cgi/org-mode.git/commit/?id=e9fd33][this commit]] for details) -**** ODT: Improve the conversion from ODT to other formats -**** ASCII: Swap the level-1/level-2 characters to underline the headlines -**** Support for Chinese, simplified Chinese, Russian, Ukrainian and Japanese -**** HTML: New option [[doc::org-export-html-date-format-string][org-export-html-date-format-string]] - - Format string to format the date and time in HTML export. Thanks - to Sébastien Vauban for this patch. - -*** Org Babel - -**** New =:results drawer= parameter - -=:results drawer= replaces =:results wrap=, which is deprecated but still -supported. - -**** =:results org= now put results in a =#+BEGIN_SRC org= block - -=:results org= used to put results in a =#+BEGIN_ORG= block but it now puts -results in a =#+BEGIN_SRC org= block, with comma-escaped lines. - -=#+BEGIN_ORG= blocks are obsolete. - -**** Exporting =#+BEGIN_SRC org= blocks exports the code - -It used to exports the results of the code. - -*** Miscellaneous - -**** New menu entry for [[doc::org-refile][org-refile]] -**** Allow capturing to encrypted entries - -If you capture to an encrypted entry, it will be decrypted before -inserting the template then re-encrypted after finalizing the capture. - -**** Inactive timestamps are now handled in tables - -Calc can do computation on active time-stamps like <2012-09-29 sat.>. -Inactive time-stamps in a table's cell are now internally deactivated so -that Calc formulas can operate on them. - -**** [[doc::org-table-number-regexp][org-table-number-regexp]] can now accept comma as decimal mark -**** Org allows a new property =APPT_WARNTIME= - - You can set it with the =W= speedy key or set it manually. When - set, exporting to iCalendar and [[doc::org-agenda-to-appt][org-agenda-to-appt]] will use the - value of this property as the number of minutes for the warning - alarm. - -**** New command [[doc::org-inc-effort][org-inc-effort]] - - This will increment the effort value. - - It is bound to =C-c C-x E= and to =E= as a speedy command. - -**** Attach: Add support for creating symbolic links - - =org-attach-method= now supports a new method =lns=, allowing to - attach symbolic links. - -**** Archive: you can now archive to a datetree - -**** New option [[doc::org-inlinetask-show-first-star][org-inlinetask-show-first-star]] - - =Non-nil= means display the first star of an inline task as - additional marker. When =nil=, the first star is not shown. - -**** New option [[doc::org-latex-preview-ltxpng-directory][org-latex-preview-ltxpng-directory]] - - This lets you define the path for the =ltxpng/= directory. - -**** You can now use imagemagick instead of dvipng to preview LaTeX fragments -**** You can now turn off [[doc::orgstruct++-mode][orgstruct++-mode]] safely -**** =C-u C-c C-c= on list items to add check boxes - - =C-u C-c C-c= will add an empty check box on a list item. - - When hit from the top of the list, it will add check boxes for - all top level list items. - -**** =org-list-ending-method= and =org-list-end-regexp= are now obsolete - - Fall back on using =org-list-end-re= only, which see. - -**** org-feed.el now expands =%(sexp)= templates -**** New option [[doc::org-protocol-data-separator][org-protocol-data-separator]] - -**** New option [[doc::org-ditaa-jar-option][org-ditaa-jar-option]] to specify the ditaa jar file - -**** New possible value for [[doc::org-loop-over-headlines-in-active-region][org-loop-over-headlines-in-active-region]] - - When [[doc::org-loop-over-headlines-in-active-region][org-loop-over-headlines-in-active-region]] is set to - =start-level=, the command will loop over the active region but - will only act upon entries that are of the same level than the - first headline in the region. - -**** New option [[doc::org-habit-show-all-today][org-habit-show-all-today]] - - When set to =t=, show all (even unscheduled) habits on today's - agenda. - -** Important bug fixes - -*** M-TAB on options keywords perform completion correctly again - - If you hit =M-TAB= on keywords like =#+TITLE=, Org will try to - perform completion with meaningful values. - -*** Add licenses to javascript embedded and external code snippets - - Embedded javascript code produced when exporting an Org file to - HTML is now licensed under GPLv3 (or later), and the copyright is - owned by the Free Software Foundation, Inc. - - The javascript code for embedding MathJax in the browser mentions - the MathJax copyright and the Apache 2.0 license. - - The javascript code for embedding =org-injo.js= in the browser - mentions the copyright of Sebastian Rose and the GPLv3 (or later) - license. - - =org-export-html-scripts= is now a variable, so that you can adapt - the code and the license to your needs. - - See https://www.gnu.org/philosophy/javascript-trap.html for - explanations on why these changes were necessary. - -* Version 7.8.11 - -** Incompatible changes - -*** Emacs 21 support has been dropped - - Do not use Org mode 7.xx with Emacs 21, use [[https://orgmode.org/org-6.36c.zip][version 6.36c]] instead. - -*** XEmacs support requires the XEmacs development version - - To use Org mode 7.xx with XEmacs, you need to run the developer - version of XEmacs. We were about to drop XEmacs support entirely, - but Michael Sperber stepped in and made changes to XEmacs that - made it easier to keep the support. Thanks to Michael for this - last-minute save. - -*** New keys for TODO sparse trees - - The key =C-c C-v= is now reserved for Org Babel action. TODO - sparse trees can still be made with =C-c / t= (all not-done - states) and =C-c / T= (specific states). - -*** The Agenda =org-agenda-ndays= is now obsolete - - The variable =org-agenda-ndays= is obsolete - please use - =org-agenda-span= instead. - - Thanks to Julien Danjou for this. - -*** Changes to the intended use of =org-export-latex-classes= - - So far this variable has been used to specify the complete header - of the LaTeX document, including all the =\usepackage= calls - necessary for the document. This setup makes it difficult to - maintain the list of packages that Org itself would like to call, - for example for the special symbol support it needs. - - First of all, you can *opt out of this change* in the following - way: You can say: /I want to have full control over headers, and I - will take responsibility to include the packages Org needs/. If - that is what you want, add this to your configuration and skip the - rest of this section (except maybe for the description of the - =[EXTRA]= place holder): - - #+begin_src emacs-lisp - (setq org-export-latex-default-packages-alist nil - org-export-latex-packages-alist nil) - #+end_src - - /Continue to read here if you want to go along with the modified - setup./ - - There are now two variables that should be used to list the LaTeX - packages that need to be included in all classes. The header - definition in =org-export-latex-classes= should then not contain - the corresponding =\usepackage= calls (see below). - - The two new variables are: - - 1. =org-export-latex-default-packages-alist= :: This is the - variable where Org-mode itself puts the packages it needs. - Normally you should not change this variable. The only - reason to change it anyway is when one of these packages - causes a conflict with another package you want to use. Then - you can remove that packages and hope that you are not using - Org-mode functionality that needs it. - - 2. =org-export-latex-packages-alist= :: This is the variable where - you can put the packages that you'd like to use across all - classes. - - The sequence how these customizations will show up in the LaTeX - document are: - - 1. Header from =org-export-latex-classes= - 2. =org-export-latex-default-packages-alist= - 3. =org-export-latex-packages-alist= - 4. Buffer-specific things set with =#+LaTeX_HEADER:= - - If you want more control about which segment is placed where, or - if you want, for a specific class, have full control over the - header and exclude some of the automatic building blocks, you can - put the following macro-like place holders into the header: - - #+begin_example - [DEFAULT-PACKAGES] \usepackage statements for default packages - [NO-DEFAULT-PACKAGES] do not include any of the default packages - [PACKAGES] \usepackage statements for packages - [NO-PACKAGES] do not include the packages - [EXTRA] the stuff from #+LaTeX_HEADER - [NO-EXTRA] do not include #+LaTeX_HEADER stuff - #+end_example - - If you have currently customized =org-export-latex-classes=, you - should revise that customization and remove any package calls that - are covered by =org-export-latex-default-packages-alist=. This - applies to the following packages: - - - inputenc - - fontenc - - fixltx2e - - graphicx - - longtable - - float - - wrapfig - - soul - - t1enc - - textcomp - - marvosym - - wasysym - - latexsym - - amssymb - - hyperref - - If one of these packages creates a conflict with another package - you are using, you can remove it from - =org-export-latex-default-packages-alist=. But then you risk that - some of the advertised export features of Org will not work - properly. - - You can also consider moving packages that you use in all classes - to =org-export-latex-packages-alist=. If necessary, put the place - holders so that the packages get loaded in the right sequence. As - said above, for backward compatibility, if you omit the place - holders, all the variables will dump their content at the end of - the header. - -*** The constant =org-html-entities= is obsolete - - Its content is now part of the new constant =org-entities=, which - is defined in the file org-entities.el. =org-html-entities= was - an internal variable, but it is possible that some users did write - code using it. - -*** =org-bbdb-anniversary-format-alist= has changed - - Please check the docstring and update your settings accordingly. - -*** Deleted =org-mode-p= - - This function has been deleted: please update your code. - -** Important new features - -*** New Org to ODT exporter - - Jambunathan's Org to ODT exporter is now part of Org. - - To use it, it `C-c C-e o' in an Org file. See the documentation - for more information on how to customize it. - -*** org-capture.el is now the default capture system - - This replaces the earlier system org-remember. The manual only - describes org-capture, but for people who prefer to continue to - use org-remember, we keep a static copy of the former manual - section [[https://orgmode.org/org-remember.pdf][chapter about remember]]. - - The new system has a technically cleaner implementation and more - possibilities for capturing different types of data. See - [[http://thread.gmane.org/gmane.emacs.orgmode/26441/focus%3D26441][Carsten's announcement]] for more details. - - To switch over to the new system: - - 1. Run - - : M-x org-capture-import-remember-templates RET - - to get a translated version of your remember templates into the - new variable =org-capture-templates=. This will "mostly" work, - but maybe not for all cases. At least it will give you a good - place to modify your templates. After running this command, - enter the customize buffer for this variable with - - : M-x customize-variable RET org-capture-templates RET - - and convince yourself that everything is OK. Then save the - customization. - - 2. Bind the command =org-capture= to a key, similar to what you did - with org-remember: - - : (define-key global-map "\C-cc" 'org-capture) - - If your fingers prefer =C-c r=, you can also use this key once - you have decided to move over completely to the new - implementation. During a test time, there is nothing wrong - with using both system in parallel. - -** New libraries - -*** New Org libraries -**** org-eshell.el (Konrad Hinsen) - - Implement links to eshell buffers. - -**** org-special-blocks (Carsten Dominik) - - This package generalizes the #+begin_foo and #+end_foo tokens. - - To use, put the following in your init file: - - #+BEGIN_EXAMPLE -(require 'org-special-blocks) -#+END_EXAMPLE - - The tokens #+begin_center, #+begin_verse, etc. existed - previously. This package generalizes them (at least for the - LaTeX and html exporters). When a #+begin_foo token is - encountered by the LaTeX exporter, it is expanded - into \begin{foo}. The text inside the environment is not - protected, as text inside environments generally is. - When #+begin_foo is encountered by the html exporter, a div with - class foo is inserted into the HTML file. It is up to the user - to add this class to his or her stylesheet if this div is to mean - anything. - -**** org-taskjuggler.el (Christian Egli) - - Christian Egli's /org-taskjuggler.el/ module is now part of Org. - He also wrote a [[https://orgmode.org/worg/org-tutorials/org-taskjuggler.php][tutorial]] for it. - -**** org-ctags.el (Paul Sexton) - - Targets like =<>= can now be found by Emacs' etag - functionality, and Org-mode links can be used to to link to - etags, also in non-Org-mode files. For details, see the file - /org-ctags.el/. - - This feature uses a new hook =org-open-link-functions= which will - call function to do something special with text links. - - Thanks to Paul Sexton for this contribution. - -**** org-docview.el (Jan Böcker) - - This new module allows links to various file types using docview, where - Emacs displays images of document pages. Docview link types can point - to a specific page in a document, for example to page 131 of the - Org-mode manual: - - : [[docview:~/.elisp/org/doc/org.pdf::131][Org-Mode Manual]] - - Thanks to Jan Böcker for this contribution. - -*** New Babel libraries - -- ob-picolisp.el (Thorsten Jolitz) -- ob-fortran.el (Sergey Litvinov) -- ob-shen.el (Eric Schulte) -- ob-maxima.el (Eric S Fraga) -- ob-java.el (Eric Schulte) -- ob-lilypond.el (Martyn Jago) -- ob-awk.el (Eric Schulte) - -** Other new features and various enhancements - -*** Hyperlinks - -**** Org-Bibtex -- major improvements - - Provides support for managing bibtex bibliographical references - data in headline properties. Each headline corresponds to a - single reference and the relevant bibliographic meta-data is - stored in headline properties, leaving the body of the headline - free to hold notes and comments. Org-bibtex is aware of all - standard bibtex reference types and fields. - - The key new functions are - - - org-bibtex-check :: queries the user to flesh out all required - (and with prefix argument optional) bibtex fields available - for the specific reference =type= of the current headline. - - - org-bibtex-create :: Create a new entry at the given level, - using org-bibtex-check to flesh out the relevant fields. - - - org-bibtex-yank :: Yank a bibtex entry on the kill ring as a - formatted Org-mode headline into the current buffer - - - org-bibtex-export-to-kill-ring :: Export the current headline - to the kill ring as a formatted bibtex entry. - -**** org-gnus.el now allows link creation from messages - - You can now create links from messages. This is particularly - useful when the user wants to stored messages that he sends, for - later check. Thanks to Ulf Stegemann for the patch. - -**** Modified link escaping - - David Maus worked on `org-link-escape'. See [[http://article.gmane.org/gmane.emacs.orgmode/37888][his message]]: - - : Percent escaping is used in Org mode to escape certain characters - : in links that would either break the parser (e.g. square brackets - : in link target or description) or are not allowed to appear in - : a particular link type (e.g. non-ascii characters in a http: - : link). - : - : With this change in place Org will apply percent escaping and - : unescaping more consistently especially for non-ascii characters. - : Additionally some of the outstanding bugs or glitches concerning - : percent escaped links are solved. - - Thanks a lot to David for this work. - -**** Make =org-store-link= point to directory in a dired buffer - - When, in a dired buffer, the cursor is not in a line listing a - file, `org-store-link' will store a link to the directory. - - Patch by Stephen Eglen. - -**** Allow regexps in =org-file-apps= to capture link parameters - - The way extension regexps in =org-file-apps= are handled has - changed. Instead of matching against the file name, the regexps - are now matched against the whole link, and you can use grouping - to extract link parameters which you can then use in a command - string to be executed. - - For example, to allow linking to PDF files using the syntax - =file:/doc.pdf::=, you can add the following entry - to org-file-apps: - - #+begin_example - Extension: \.pdf::\([0-9]+\)\' - Command: evince "%s" -p %1 - #+end_example - - Thanks to Jan Böcker for a patch to this effect. - -*** Dates and time - -**** Allow relative time when scheduling/adding a deadline - - You can now use relative duration strings like "-2d" or "++3w" - when calling =org-schedule= or =org-deadline=: it will schedule - (or set the deadline for) the item respectively two days before - today and three weeks after the current timestamp, if any. - - You can use this programmatically: =(org-schedule nil "+2d")= - will work on the current entry. - - You can also use this while (bulk-)rescheduling and - (bulk-)resetting the deadline of (several) items from the agenda. - - Thanks to Memnon Anon for a heads up about this! - -**** American-style dates are now understood by =org-read-date= - - So when you are prompted for a date, you can now answer like this - - #+begin_example - 2/5/3 --> 2003-02-05 - 2/5 --> -02-05 - #+end_example - -*** Agenda - -**** =org-agenda-custom-commands= has a default value - - This option used to be `nil' by default. This now has a default - value, displaying an agenda and all TODOs. See the docstring for - details. Thanks to Carsten for this. - -**** Improved filtering through =org-agenda-to-appt= - - The new function allows the user to refine the scope of entries - to pass to =org-agenda-get-day-entries= and allows to filter out - entries using a function. - - Thanks to Peter Münster for raising a related issue and to - Tassilo Horn for this idea. Also thanks to Peter Münster for - [[git:68ffb7a7][fixing a small bug]] in the final implementation. - -**** Allow ap/pm times in agenda time grid - - Times in the agenda can now be displayed in am/pm format. See - the new variable =org-agenda-timegrid-use-ampm=. Thanks to - C. A. Webber for a patch to this effect. - -**** Agenda: Added a bulk "scattering" command - - =B S= in the agenda buffer will cause tasks to be rescheduled a - random number of days into the future, with 7 as the default. - This is useful if you've got a ton of tasks scheduled for today, - you realize you'll never deal with them all, and you just want - them to be distributed across the next N days. When called with - a prefix arg, rescheduling will avoid weekend days. - - Thanks to John Wiegley for this. - -*** Exporting - -**** Simplification of org-export-html-preamble/postamble - - When set to `t', export the preamble/postamble as usual, honoring - the =org-export-email/author/creator-info= variables. - - When set to a formatting string, insert this string. See the - docstring of these variable for details about available - %-sequences. - - You can set =:html-preamble= in publishing project in the same - way: `t' means to honor =:email/creator/author-info=, and a - formatting string will insert a string. - -**** New exporters to Latin-1 and UTF-8 - - While Ulf Stegemann was going through the entities list to - improve the LaTeX export, he had the great idea to provide - representations for many of the entities in Latin-1, and for all - of them in UTF-8. This means that we can now export files rich - in special symbols to Latin-1 and to UTF-8 files. These new - exporters can be reached with the commands =C-c C-e n= and =C-c - C-e u=, respectively. - - When there is no representation for a given symbol in the - targeted coding system, you can choose to keep the TeX-macro-like - representation, or to get an "explanatory" representation. For - example, =\simeq= could be represented as "[approx. equal to]". - Please use the variable =org-entities-ascii-explanatory= to state - your preference. - -**** HTML export: Add class to outline containers using property - - The =HTML_CONTAINER_CLASS= property can now be used to add a - class name to the outline container of a node in HTML export. - -**** Throw an error when creating an image from a LaTeX snippet fails - - This behavior can be configured with the new option variable - =org-format-latex-signal-error=. - -**** Support for creating BEAMER presentations from Org-mode documents - - Org-mode documents or subtrees can now be converted directly in - to BEAMER presentation. Turning a tree into a simple - presentations is straight forward, and there is also quite some - support to make richer presentations as well. See the [[https://orgmode.org/manual/Beamer-class-export.html#Beamer-class-export][BEAMER - section]] in the manual for more details. - - Thanks to everyone who has contributed to the discussion about - BEAMER support and how it should work. This was a great example - for how this community can achieve a much better result than any - individual could. - -*** Refiling - -**** Refile targets can now be cached - - You can turn on caching of refile targets by setting the variable - =org-refile-use-cache=. This should speed up refiling if you - have many eligible targets in many files. If you need to update - the cache because Org misses a newly created entry or still - offers a deleted one, press =C-0 C-c C-w=. - -**** New logging support for refiling - - Whenever you refile an item, a time stamp and even a note can be - added to this entry. For details, see the new option - =org-log-refile=. - - Thanks to Charles Cave for this idea. - -*** Completion - -**** In-buffer completion is now done using John Wiegley's pcomplete.el - - Thanks to John Wiegley for much of this code. - -*** Tables - -**** New command =org-table-transpose-table-at-point= - - See the docstring. This hack from Juan Pechiar is now part of - Org's core. Thanks to Juan! - -**** Display field's coordinates when editing it with =C-c `= - - When editing a field with =C-c `=, the field's coordinate will - the displayed in the buffer. - - Thanks to Michael Brand for a patch to this effect. - -**** Spreadsheet computation of durations and time values - - If you want to compute time values use the =T= flag, either in - Calc formulas or Elisp formulas: - - | Task 1 | Task 2 | Total | - |--------+--------+---------| - | 35:00 | 35:00 | 1:10:00 | - #+TBLFM: @2$3=$1+$2;T - - Values must be of the form =[HH:]MM:SS=, where hours are - optional. - - Thanks to Martin Halder, Eric Schulte and Carsten for code and - feedback on this. - -**** Implement formulas applying to field ranges - - Carsten implemented this field-ranges formulas. - - : A frequently requested feature for tables has been to be able to define - : row formulas in a way similar to column formulas. The patch below allows - : things like - : - : @3= - : @2$2..@5$7= - : @I$2..@II$4= - : - : as the left hand side for table formulas in order to write a formula that - : is valid for an entire column or for a rectangular section in a - : table. - - Thanks a lot to Carsten for this. - -**** Sending radio tables from org buffers is now allowed - - Org radio tables can no also be sent inside Org buffers. Also, - there is a new hook which get called after a table has been sent. - - Thanks to Seweryn Kokot. - -*** Lists - -**** Improved handling of lists - - Nicolas Goaziou extended and improved the way Org handles lists. - - 1. Indentation of text determines again end of items in - lists. So, some text less indented than the previous item - doesn't close the whole list anymore, only all items more - indented than it. - - 2. Alphabetical bullets are implemented, through the use of the - variable `org-alphabetical-lists'. This also adds alphabetical - counters like [@c] or [@W]. - - 3. Lists can now safely contain drawers, inline tasks, or various - blocks, themselves containing lists. Two variables are - controlling this: `org-list-forbidden-blocks', and - `org-list-export-context'. - - 4. Improve `newline-and-indent' (C-j): used in an item, it will - keep text from moving at column 0. This allows to split text - and make paragraphs and still not break the list. - - 5. Improve `org-toggle-item' (C-c -): used on a region with - standard text, it will change the region into one item. With a - prefix argument, it will fallback to the previous behavior and - make every line in region an item. It permits to easily - integrate paragraphs inside a list. - - 6. `fill-paragraph' (M-q) now understands lists. It can freely be - used inside items, or on text just after a list, even with no - blank line around, without breaking list structure. - - Thanks a lot to Nicolas for all this! - -*** Inline display of linked images - - Images can now be displayed inline. The key C-c C-x C-v does - toggle the display of such images. Note that only image links - that have no description part will be inlined. - -*** Implement offsets for ordered lists - - If you want to start an ordered plain list with a number different - from 1, you can now do it like this: - - : 1. [@start:12] will star a lit a number 12 - -*** Babel: code block body expansion for table and preview - - In org-babel, code is "expanded" prior to evaluation. I.e. the - code that is actually evaluated comprises the code block contents, - augmented with the extra code which assigns the referenced data to - variables. It is now possible to preview expanded contents, and - also to expand code during during tangling. This expansion takes - into account all header arguments, and variables. - - A new keybinding `C-c M-b p' bound to `org-babel-expand-src-block' - can be used from inside of a source code block to preview its - expanded contents (which can be very useful for debugging). - tangling - - The expanded body can now be tangled, this includes variable - values which may be the results of other source-code blocks, or - stored in headline properties or tables. One possible use for this - is to allow those using org-babel for their emacs initialization - to store values (e.g. usernames, passwords, etc...) in headline - properties or in tables. - - Org-babel now supports three new header arguments, and new default - behavior for handling horizontal lines in tables (hlines), column - names, and rownames across all languages. - -*** Editing Convenience and Appearance - -**** New command =org-copy-visible= (=C-c C-x v=) - - This command will copy the visible text in the region into the - kill ring. Thanks to Florian Beck for this function and to - Carsten for adding it to org.el and documenting it! - -**** Make it possible to protect hidden subtrees from being killed by =C-k= - - See the new variable =org-ctrl-k-protect-subtree=. This was a - request by Scott Otterson. - -**** Implement pretty display of entities, sub-, and superscripts. - - The command =C-c C-x \= toggles the display of Org's special - entities like =\alpha= as pretty unicode characters. Also, sub - and superscripts are displayed in a pretty way (raised/lower - display, in a smaller font). If you want to exclude sub- and - superscripts, see the variable - =org-pretty-entities-include-sub-superscripts=. - - Thanks to Eric Schulte and Ulf Stegeman for making this possible. - -**** New faces for title, date, author and email address lines - - The keywords in these lines are now dimmed out, and the title is - displayed in a larger font, and a special font is also used for - author, date, and email information. This is implemented by the - following new faces: - - =org-document-title= - =org-document-info= - =org-document-info-keyword= - - In addition, the variable =org-hidden-keywords= can be used to - make the corresponding keywords disappear. - - Thanks to Dan Davison for this feature. - -**** Simpler way to specify faces for tags and todo keywords - - The variables =org-todo-keyword-faces=, =org-tag-faces=, and - =org-priority-faces= now accept simple color names as - specifications. The colors will be used as either foreground or - background color for the corresponding keyword. See also the - variable =org-faces-easy-properties=, which governs which face - property is affected by this setting. - - This is really a great simplification for setting keyword faces. - The change is based on an idea and patch by Ryan Thompson. - -**** in tables now means fixed width, not maximum width - - Requested by Michael Brand. - -**** Better level cycling function - - =TAB= in an empty headline cycles the level of that headline - through likely states. Ryan Thompson implemented an improved - version of this function, which does not depend upon when exactly - this command is used. Thanks to Ryan for this improvement. - -**** Adaptive filling - - For paragraph text, =org-adaptive-fill-function= did not handle - the base case of regular text which needed to be filled. This is - now fixed. Among other things, it allows email-style ">" - comments to be filled correctly. - - Thanks to Dan Hackney for this patch. - -**** `org-reveal' (=C-c C-r=) also decrypts encrypted entries (org-crypt.el) - - Thanks to Richard Riley for triggering this change. - -**** Better automatic letter selection for TODO keywords - - When all first letters of keywords have been used, Org now - assigns more meaningful characters based on the keywords. - - Thanks to Mikael Fornius for this patch. - -*** Clocking - -**** Clock: Allow synchronous update of timestamps in CLOCK log - - Using =S-M-= on CLOCK log timestamps will - increase/decrease the two timestamps on this line so that - duration will keep the same. Note that duration can still be - slightly modified in case a timestamp needs some rounding. - - Thanks to Rainer Stengele for this idea. - -**** Localized clock tables - - Clock tables now support a new new =:lang= parameter, allowing - the user to customize the localization of the table headers. See - the variable =org-clock-clocktable-language-setup= which controls - available translated strings. - -**** Show clock overruns in mode line - - When clocking an item with a planned effort, overrunning the - planned time is now made visible in the mode line, for example - using the new face =org-mode-line-clock-overrun=, or by adding an - extra string given by =org-task-overrun-text=. - - Thanks to Richard Riley for a patch to this effect. - -**** Clock reports can now include the running, incomplete clock - - If you have a clock running, and the entry being clocked falls - into the scope when creating a clock table, the time so far spent - can be added to the total. This behavior depends on the setting - of =org-clock-report-include-clocking-task=. The default is - =nil=. - - Thanks to Bernt Hansen for this useful addition. - -*** Misc - -**** Improvements with inline tasks and indentation - - There is now a configurable way on how to export inline tasks. - See the new variable =org-inlinetask-export-templates=. - - Thanks to Nicolas Goaziou for coding these changes. - -**** A property value of "nil" now means to unset a property - - This can be useful in particular with property inheritance, if - some upper level has the property, and some grandchild of it - would like to have the default settings (i.e. not overruled by a - property) back. - - Thanks to Robert Goldman and Bernt Hansen for suggesting this - change. - -**** New helper functions in org-table.el - - There are new functions to access and write to a specific table field. - This is for hackers, and maybe for the org-babel people. - - #+begin_example - org-table-get - org-table-put - org-table-current-line - org-table-goto-line - #+end_example - -**** Archiving: Allow to reverse order in target node - - The new option =org-archive-reversed-order= allows to have - archived entries inserted in a last-on-top fashion in the target - node. - - This was requested by Tom. - -**** Org-reveal: Double prefix arg shows the entire subtree of the parent - - This can help to get out of an inconsistent state produced for - example by viewing from the agenda. - - This was a request by Matt Lundin. - -* License - - This file is part of GNU Emacs. - - GNU Emacs is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - GNU Emacs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNU Emacs. If not, see . diff --git a/elpa/org-9.3.6/etc/styles/OrgOdtContentTemplate.xml b/elpa/org-9.3.6/etc/styles/OrgOdtContentTemplate.xml deleted file mode 100644 index d0c98a3e..00000000 --- a/elpa/org-9.3.6/etc/styles/OrgOdtContentTemplate.xml +++ /dev/null @@ -1,275 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/elpa/org-9.3.6/etc/styles/OrgOdtStyles.xml b/elpa/org-9.3.6/etc/styles/OrgOdtStyles.xml deleted file mode 100644 index 1a8edee9..00000000 --- a/elpa/org-9.3.6/etc/styles/OrgOdtStyles.xml +++ /dev/null @@ -1,861 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / - - / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/elpa/org-9.3.6/etc/styles/README b/elpa/org-9.3.6/etc/styles/README deleted file mode 100644 index 100c577e..00000000 --- a/elpa/org-9.3.6/etc/styles/README +++ /dev/null @@ -1,36 +0,0 @@ -The files OrgOdtContentTemplate.xml and OrgOdtStyles.xml have the -following copyright information: - -Copyright (C) 2010-2020 Free Software Foundation, Inc. - -These files are part of GNU Emacs. - -GNU Emacs is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -GNU Emacs is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Emacs. If not, see . - - -Author: Jambunathan K -Keywords: outlines, hypermedia, calendar, wp -Homepage: https://orgmode.org - -Commentary: - -These files are part of Org-mode's OpenDocument export module. - -OrgOdtContentTemplate.xml provides a template within which the content -of an exported document is enclosed. This file contributes to -"content.xml" file within an exported document and acts as a -repository of automatic styles. - -OrgOdtStyles.xml contributes to "styles.xml" file within an exported -document and acts as a repository of custom styles. diff --git a/elpa/org-9.3.6/ob-C.el b/elpa/org-9.3.6/ob-C.el deleted file mode 100644 index 3a26bc01..00000000 --- a/elpa/org-9.3.6/ob-C.el +++ /dev/null @@ -1,467 +0,0 @@ -;;; ob-C.el --- Babel Functions for C and Similar Languages -*- lexical-binding: t; -*- - -;; Copyright (C) 2010-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Thierry Banel -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Org-Babel support for evaluating C, C++, D code. -;; -;; very limited implementation: -;; - currently only support :results output -;; - not much in the way of error feedback - -;;; Code: - -(require 'cc-mode) -(require 'ob) -(require 'org-macs) - -(declare-function org-entry-get "org" (pom property &optional inherit literal-nil)) - -(defvar org-babel-tangle-lang-exts) -(add-to-list 'org-babel-tangle-lang-exts '("C++" . "cpp")) -(add-to-list 'org-babel-tangle-lang-exts '("D" . "d")) - -(defvar org-babel-default-header-args:C '()) - -(defconst org-babel-header-args:C '((includes . :any) - (defines . :any) - (main . :any) - (flags . :any) - (cmdline . :any) - (libs . :any)) - "C/C++-specific header arguments.") - -(defconst org-babel-header-args:C++ - (append '((namespaces . :any)) - org-babel-header-args:C) - "C++-specific header arguments.") - -(defcustom org-babel-C-compiler "gcc" - "Command used to compile a C source code file into an executable. -May be either a command in the path, like gcc -or an absolute path name, like /usr/local/bin/gcc -parameter may be used, like gcc -v" - :group 'org-babel - :version "24.3" - :type 'string) - -(defcustom org-babel-C++-compiler "g++" - "Command used to compile a C++ source code file into an executable. -May be either a command in the path, like g++ -or an absolute path name, like /usr/local/bin/g++ -parameter may be used, like g++ -v" - :group 'org-babel - :version "24.3" - :type 'string) - -(defcustom org-babel-D-compiler "rdmd" - "Command used to compile and execute a D source code file. -May be either a command in the path, like rdmd -or an absolute path name, like /usr/local/bin/rdmd -parameter may be used, like rdmd --chatty" - :group 'org-babel - :version "24.3" - :type 'string) - -(defvar org-babel-c-variant nil - "Internal variable used to hold which type of C (e.g. C or C++ or D) -is currently being evaluated.") - -(defun org-babel-execute:cpp (body params) - "Execute BODY according to PARAMS. -This function calls `org-babel-execute:C++'." - (org-babel-execute:C++ body params)) - -(defun org-babel-expand-body:cpp (body params) - "Expand a block of C++ code with org-babel according to its -header arguments." - (org-babel-expand-body:C++ body params)) - -(defun org-babel-execute:C++ (body params) - "Execute a block of C++ code with org-babel. -This function is called by `org-babel-execute-src-block'." - (let ((org-babel-c-variant 'cpp)) (org-babel-C-execute body params))) - -(defun org-babel-expand-body:C++ (body params) - "Expand a block of C++ code with org-babel according to its -header arguments." - (let ((org-babel-c-variant 'cpp)) (org-babel-C-expand-C++ body params))) - -(defun org-babel-execute:D (body params) - "Execute a block of D code with org-babel. -This function is called by `org-babel-execute-src-block'." - (let ((org-babel-c-variant 'd)) (org-babel-C-execute body params))) - -(defun org-babel-expand-body:D (body params) - "Expand a block of D code with org-babel according to its -header arguments." - (let ((org-babel-c-variant 'd)) (org-babel-C-expand-D body params))) - -(defun org-babel-execute:C (body params) - "Execute a block of C code with org-babel. -This function is called by `org-babel-execute-src-block'." - (let ((org-babel-c-variant 'c)) (org-babel-C-execute body params))) - -(defun org-babel-expand-body:C (body params) - "Expand a block of C code with org-babel according to its -header arguments." - (let ((org-babel-c-variant 'c)) (org-babel-C-expand-C body params))) - -(defun org-babel-C-execute (body params) - "This function should only be called by `org-babel-execute:C' -or `org-babel-execute:C++' or `org-babel-execute:D'." - (let* ((tmp-src-file (org-babel-temp-file - "C-src-" - (pcase org-babel-c-variant - (`c ".c") (`cpp ".cpp") (`d ".d")))) - (tmp-bin-file ;not used for D - (org-babel-process-file-name - (org-babel-temp-file "C-bin-" org-babel-exeext))) - (cmdline (cdr (assq :cmdline params))) - (cmdline (if cmdline (concat " " cmdline) "")) - (flags (cdr (assq :flags params))) - (flags (mapconcat 'identity - (if (listp flags) flags (list flags)) " ")) - (libs (org-babel-read - (or (cdr (assq :libs params)) - (org-entry-get nil "libs" t)) - nil)) - (libs (mapconcat #'identity - (if (listp libs) libs (list libs)) - " ")) - (full-body - (pcase org-babel-c-variant - (`c (org-babel-C-expand-C body params)) - (`cpp (org-babel-C-expand-C++ body params)) - (`d (org-babel-C-expand-D body params))))) - (with-temp-file tmp-src-file (insert full-body)) - (pcase org-babel-c-variant - ((or `c `cpp) - (org-babel-eval - (format "%s -o %s %s %s %s" - (pcase org-babel-c-variant - (`c org-babel-C-compiler) - (`cpp org-babel-C++-compiler)) - tmp-bin-file - flags - (org-babel-process-file-name tmp-src-file) - libs) - "")) - (`d nil)) ;; no separate compilation for D - (let ((results - (org-babel-eval - (pcase org-babel-c-variant - ((or `c `cpp) - (concat tmp-bin-file cmdline)) - (`d - (format "%s %s %s %s" - org-babel-D-compiler - flags - (org-babel-process-file-name tmp-src-file) - cmdline))) - ""))) - (when results - (setq results (org-trim (org-remove-indentation results))) - (org-babel-reassemble-table - (org-babel-result-cond (cdr (assq :result-params params)) - (org-babel-read results t) - (let ((tmp-file (org-babel-temp-file "c-"))) - (with-temp-file tmp-file (insert results)) - (org-babel-import-elisp-from-file tmp-file))) - (org-babel-pick-name - (cdr (assq :colname-names params)) (cdr (assq :colnames params))) - (org-babel-pick-name - (cdr (assq :rowname-names params)) (cdr (assq :rownames params))))) - ))) - -(defun org-babel-C-expand-C++ (body params) - "Expand a block of C or C++ code with org-babel according to -its header arguments." - (org-babel-C-expand-C body params)) - -(defun org-babel-C-expand-C (body params) - "Expand a block of C or C++ code with org-babel according to -its header arguments." - (let ((vars (org-babel--get-vars params)) - (colnames (cdr (assq :colname-names params))) - (main-p (not (string= (cdr (assq :main params)) "no"))) - (includes (org-babel-read - (cdr (assq :includes params)) - nil)) - (defines (org-babel-read - (cdr (assq :defines params)) - nil)) - (namespaces (org-babel-read - (cdr (assq :namespaces params)) - nil))) - (when (stringp includes) - (setq includes (split-string includes))) - (when (stringp namespaces) - (setq namespaces (split-string namespaces))) - (when (stringp defines) - (let ((y nil) - (result (list t))) - (dolist (x (split-string defines)) - (if (null y) - (setq y x) - (nconc result (list (concat y " " x))) - (setq y nil))) - (setq defines (cdr result)))) - (mapconcat 'identity - (list - ;; includes - (mapconcat - (lambda (inc) (format "#include %s" inc)) - includes "\n") - ;; defines - (mapconcat - (lambda (inc) (format "#define %s" inc)) - (if (listp defines) defines (list defines)) "\n") - ;; namespaces - (mapconcat - (lambda (inc) (format "using namespace %s;" inc)) - namespaces - "\n") - ;; variables - (mapconcat 'org-babel-C-var-to-C vars "\n") - ;; table sizes - (mapconcat 'org-babel-C-table-sizes-to-C vars "\n") - ;; tables headers utility - (when colnames - (org-babel-C-utility-header-to-C)) - ;; tables headers - (mapconcat 'org-babel-C-header-to-C colnames "\n") - ;; body - (if main-p - (org-babel-C-ensure-main-wrap body) - body) "\n") "\n"))) - -(defun org-babel-C-expand-D (body params) - "Expand a block of D code with org-babel according to -its header arguments." - (let ((vars (org-babel--get-vars params)) - (colnames (cdr (assq :colname-names params))) - (main-p (not (string= (cdr (assq :main params)) "no"))) - (imports (or (cdr (assq :imports params)) - (org-babel-read (org-entry-get nil "imports" t))))) - (when (stringp imports) - (setq imports (split-string imports))) - (setq imports (append imports '("std.stdio" "std.conv"))) - (mapconcat 'identity - (list - "module mmm;" - ;; imports - (mapconcat - (lambda (inc) (format "import %s;" inc)) - imports "\n") - ;; variables - (mapconcat 'org-babel-C-var-to-C vars "\n") - ;; table sizes - (mapconcat 'org-babel-C-table-sizes-to-C vars "\n") - ;; tables headers utility - (when colnames - (org-babel-C-utility-header-to-C)) - ;; tables headers - (mapconcat 'org-babel-C-header-to-C colnames "\n") - ;; body - (if main-p - (org-babel-C-ensure-main-wrap body) - body) "\n") "\n"))) - -(defun org-babel-C-ensure-main-wrap (body) - "Wrap BODY in a \"main\" function call if none exists." - (if (string-match "^[ \t]*[intvod]+[ \t\n\r]*main[ \t]*(.*)" body) - body - (format "int main() {\n%s\nreturn 0;\n}\n" body))) - -(defun org-babel-prep-session:C (_session _params) - "This function does nothing as C is a compiled language with no -support for sessions." - (error "C is a compiled language -- no support for sessions")) - -(defun org-babel-load-session:C (_session _body _params) - "This function does nothing as C is a compiled language with no -support for sessions." - (error "C is a compiled language -- no support for sessions")) - -;; helper functions - -(defun org-babel-C-format-val (type val) - "Handle the FORMAT part of TYPE with the data from VAL." - (let ((format-data (cadr type))) - (if (stringp format-data) - (cons "" (format format-data val)) - (funcall format-data val)))) - -(defun org-babel-C-val-to-C-type (val) - "Determine the type of VAL. -Return a list (TYPE-NAME FORMAT). TYPE-NAME should be the name of the type. -FORMAT can be either a format string or a function which is called with VAL." - (let* ((basetype (org-babel-C-val-to-base-type val)) - (type - (pcase basetype - (`integerp '("int" "%d")) - (`floatp '("double" "%f")) - (`stringp - (list - (if (eq org-babel-c-variant 'd) "string" "const char*") - "\"%s\"")) - (_ (error "unknown type %S" basetype))))) - (cond - ((integerp val) type) ;; an integer declared in the #+begin_src line - ((floatp val) type) ;; a numeric declared in the #+begin_src line - ((and (listp val) (listp (car val))) ;; a table - `(,(car type) - (lambda (val) - (cons - (format "[%d][%d]" (length val) (length (car val))) - (concat - (if (eq org-babel-c-variant 'd) "[\n" "{\n") - (mapconcat - (lambda (v) - (concat - (if (eq org-babel-c-variant 'd) " [" " {") - (mapconcat (lambda (w) (format ,(cadr type) w)) v ",") - (if (eq org-babel-c-variant 'd) "]" "}"))) - val - ",\n") - (if (eq org-babel-c-variant 'd) "\n]" "\n}")))))) - ((or (listp val) (vectorp val)) ;; a list declared in the #+begin_src line - `(,(car type) - (lambda (val) - (cons - (format "[%d]" (length val)) - (concat - (if (eq org-babel-c-variant 'd) "[" "{") - (mapconcat (lambda (v) (format ,(cadr type) v)) val ",") - (if (eq org-babel-c-variant 'd) "]" "}")))))) - (t ;; treat unknown types as string - type)))) - -(defun org-babel-C-val-to-base-type (val) - "Determine the base type of VAL which may be -`integerp' if all base values are integers -`floatp' if all base values are either floating points or integers -`stringp' otherwise." - (cond - ((integerp val) 'integerp) - ((floatp val) 'floatp) - ((or (listp val) (vectorp val)) - (let ((type nil)) - (mapc (lambda (v) - (pcase (org-babel-C-val-to-base-type v) - (`stringp (setq type 'stringp)) - (`floatp - (when (or (not type) (eq type 'integerp)) - (setq type 'floatp))) - (`integerp - (unless type (setq type 'integerp))))) - val) - type)) - (t 'stringp))) - -(defun org-babel-C-var-to-C (pair) - "Convert an elisp val into a string of C code specifying a var -of the same value." - ;; TODO list support - (let ((var (car pair)) - (val (cdr pair))) - (when (symbolp val) - (setq val (symbol-name val)) - (when (= (length val) 1) - (setq val (string-to-char val)))) - (let* ((type-data (org-babel-C-val-to-C-type val)) - (type (car type-data)) - (formatted (org-babel-C-format-val type-data val)) - (suffix (car formatted)) - (data (cdr formatted))) - (format "%s %s%s = %s;" - type - var - suffix - data)))) - -(defun org-babel-C-table-sizes-to-C (pair) - "Create constants of table dimensions, if PAIR is a table." - (when (listp (cdr pair)) - (cond - ((listp (cadr pair)) ;; a table - (concat - (format "const int %s_rows = %d;" (car pair) (length (cdr pair))) - "\n" - (format "const int %s_cols = %d;" (car pair) (length (cadr pair))))) - (t ;; a list declared in the #+begin_src line - (format "const int %s_cols = %d;" (car pair) (length (cdr pair))))))) - -(defun org-babel-C-utility-header-to-C () - "Generate a utility function to convert a column name -into a column number." - (pcase org-babel-c-variant - ((or `c `cpp) - "int get_column_num (int nbcols, const char** header, const char* column) -{ - int c; - for (c=0; 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 Q#C(oYG49NE&32>qe;(NrrT_o{ diff --git a/elpa/org-9.3.6/ob-J.el b/elpa/org-9.3.6/ob-J.el deleted file mode 100644 index c0145211..00000000 --- a/elpa/org-9.3.6/ob-J.el +++ /dev/null @@ -1,186 +0,0 @@ -;;; ob-J.el --- Babel Functions for J -*- lexical-binding: t; -*- - -;; Copyright (C) 2011-2020 Free Software Foundation, Inc. - -;; Author: Oleh Krehel -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Org-Babel support for evaluating J code. -;; -;; Session interaction depends on `j-console' from package `j-mode' -;; (available in MELPA). - -;;; Code: - -(require 'ob) -(require 'org-macs) - -(declare-function j-console-ensure-session "ext:j-console" ()) - -(defcustom org-babel-J-command "jconsole" - "Command to call J." - :group 'org-babel - :version "26.1" - :package-version '(Org . "9.0") - :type 'string) - -(defun org-babel-expand-body:J (body _params &optional _processed-params) - "Expand BODY according to PARAMS, return the expanded body. -PROCESSED-PARAMS isn't used yet." - (org-babel-J-interleave-echos-except-functions body)) - -(defun org-babel-J-interleave-echos (body) - "Interleave echo',' between each source line of BODY." - (mapconcat #'identity (split-string body "\n") "\necho','\n")) - -(defun org-babel-J-interleave-echos-except-functions (body) - "Interleave echo',' between source lines of BODY that aren't functions." - (if (obj-string-match-m "\\(?:^\\|\n\\)[^\n]*\\(?:0\\|1\\|2\\|3\\|4\\|dyad\\) : 0\n.*\n)\\(?:\n\\|$\\)" body) - (let ((s1 (substring body 0 (match-beginning 0))) - (s2 (match-string 0 body)) - (s3 (substring body (match-end 0)))) - (concat - (if (string= s1 "") - "" - (concat (org-babel-J-interleave-echos s1) - "\necho','\n")) - s2 - "\necho','\n" - (org-babel-J-interleave-echos-except-functions s3))) - (org-babel-J-interleave-echos body))) - -(defalias 'org-babel-execute:j 'org-babel-execute:J) - -(defun org-babel-execute:J (body params) - "Execute a block of J code BODY. -PARAMS are given by org-babel. -This function is called by `org-babel-execute-src-block'." - (message "executing J source code block") - (let* ((processed-params (org-babel-process-params params)) - (sessionp (cdr (assq :session params))) - (full-body (org-babel-expand-body:J - body params processed-params)) - (tmp-script-file (org-babel-temp-file "J-src"))) - (org-babel-j-initiate-session sessionp) - (org-babel-J-strip-whitespace - (if (string= sessionp "none") - (progn - (with-temp-file tmp-script-file - (insert full-body)) - (org-babel-eval (format "%s < %s" org-babel-J-command tmp-script-file) "")) - (org-babel-J-eval-string full-body))))) - -(defun org-babel-J-eval-string (str) - "Sends STR to the `j-console-cmd' session and executes it." - (let ((session (j-console-ensure-session))) - (with-current-buffer (process-buffer session) - (goto-char (point-max)) - (insert (format "\n%s\n" str)) - (let ((beg (point))) - (comint-send-input) - (sit-for .1) - (buffer-substring-no-properties - beg (point-max)))))) - -(defun org-babel-J-strip-whitespace (str) - "Remove whitespace from jconsole output STR." - (mapconcat - #'identity - (delete "" (mapcar - #'org-babel-J-print-block - (split-string str "^ *,\n" t))) - "\n\n")) - -(defun obj-get-string-alignment (str) - "Return a number to describe STR alignment. -STR represents a table. -Positive/negative/zero result means right/left/undetermined. -Don't trust first line." - (let* ((str (org-trim str)) - (lines (split-string str "\n" t)) - n1 n2) - (cond ((<= (length lines) 1) - 0) - ((= (length lines) 2) - ;; numbers are right-aligned - (if (and - (numberp (read (car lines))) - (numberp (read (cadr lines))) - (setq n1 (obj-match-second-space-right (nth 0 lines))) - (setq n2 (obj-match-second-space-right (nth 1 lines)))) - n2 - 0)) - ((not (obj-match-second-space-left (nth 0 lines))) - 0) - ((and - (setq n1 (obj-match-second-space-left (nth 1 lines))) - (setq n2 (obj-match-second-space-left (nth 2 lines))) - (= n1 n2)) - n1) - ((and - (setq n1 (obj-match-second-space-right (nth 1 lines))) - (setq n2 (obj-match-second-space-right (nth 2 lines))) - (= n1 n2)) - (- n1)) - (t 0)))) - -(defun org-babel-J-print-block (x) - "Prettify jconsole output X." - (let* ((x (org-trim x)) - (a (obj-get-string-alignment x)) - (lines (split-string x "\n" t)) - b) - (cond ((< a 0) - (setq b (obj-match-second-space-right (nth 0 lines))) - (concat (make-string (+ a b) ? ) x)) - ((> a 0) - (setq b (obj-match-second-space-left (nth 0 lines))) - (concat (make-string (- a b) ? ) x)) - (t x)))) - -(defun obj-match-second-space-left (s) - "Return position of leftmost space in second space block of S or nil." - (and (string-match "^ *[^ ]+\\( \\)" s) - (match-beginning 1))) - -(defun obj-match-second-space-right (s) - "Return position of rightmost space in second space block of S or nil." - (and (string-match "^ *[^ ]+ *\\( \\)[^ ]" s) - (match-beginning 1))) - -(defun obj-string-match-m (regexp string &optional start) - "Call (string-match REGEXP STRING START). -REGEXP is modified so that .* matches newlines as well." - (string-match - (replace-regexp-in-string "\\.\\*" "[\0-\377[:nonascii:]]*" regexp) - string - start)) - -(defun org-babel-j-initiate-session (&optional session) - "Initiate a J session. -SESSION is a parameter given by org-babel." - (unless (string= session "none") - (require 'j-console) - (j-console-ensure-session))) - -(provide 'ob-J) - -;;; ob-J.el ends here diff --git a/elpa/org-9.3.6/ob-J.elc b/elpa/org-9.3.6/ob-J.elc deleted file mode 100644 index dce10b3484bb0d568df838d9453d57f2fda1425c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5529 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 o(u@}W^#`@7l%(mMxhN`o. - -;;; Commentary: - -;; Org-Babel support for evaluating R code - -;;; Code: - -(require 'cl-lib) -(require 'ob) - -(declare-function orgtbl-to-tsv "org-table" (table params)) -(declare-function R "ext:essd-r" (&optional start-args)) -(declare-function inferior-ess-send-input "ext:ess-inf" ()) -(declare-function ess-make-buffer-current "ext:ess-inf" ()) -(declare-function ess-eval-buffer "ext:ess-inf" (vis)) -(declare-function ess-wait-for-process "ext:ess-inf" - (&optional proc sec-prompt wait force-redisplay)) - -(defconst org-babel-header-args:R - '((width . :any) - (height . :any) - (bg . :any) - (units . :any) - (pointsize . :any) - (antialias . :any) - (quality . :any) - (compression . :any) - (res . :any) - (type . :any) - (family . :any) - (title . :any) - (fonts . :any) - (version . :any) - (paper . :any) - (encoding . :any) - (pagecentre . :any) - (colormodel . :any) - (useDingbats . :any) - (horizontal . :any) - (results . ((file list vector table scalar verbatim) - (raw html latex org code pp drawer) - (replace silent none append prepend) - (output value graphics)))) - "R-specific header arguments.") - -(defconst ob-R-safe-header-args - (append org-babel-safe-header-args - '(:width :height :bg :units :pointsize :antialias :quality - :compression :res :type :family :title :fonts - :version :paper :encoding :pagecentre :colormodel - :useDingbats :horizontal)) - "Header args which are safe for R babel blocks. - -See `org-babel-safe-header-args' for documentation of the format of -this variable.") - -(defvar org-babel-default-header-args:R '()) -(put 'org-babel-default-header-args:R 'safe-local-variable - (org-babel-header-args-safe-fn ob-R-safe-header-args)) - -(defcustom org-babel-R-command "R --slave --no-save" - "Name of command to use for executing R code." - :group 'org-babel - :version "24.1" - :type 'string) - -(defvar ess-current-process-name) ; dynamically scoped -(defvar ess-local-process-name) ; dynamically scoped -(defun org-babel-edit-prep:R (info) - (let ((session (cdr (assq :session (nth 2 info))))) - (when (and session - (string-prefix-p "*" session) - (string-suffix-p "*" session)) - (org-babel-R-initiate-session session nil)))) - -;; The usage of utils::read.table() ensures that the command -;; read.table() can be found even in circumstances when the utils -;; package is not in the search path from R. -(defconst ob-R-transfer-variable-table-with-header - "%s <- local({ - con <- textConnection( - %S - ) - res <- utils::read.table( - con, - header = %s, - row.names = %s, - sep = \"\\t\", - as.is = TRUE - ) - close(con) - res - })" - "R code used to transfer a table defined as a variable from org to R. - -This function is used when the table contains a header.") - -(defconst ob-R-transfer-variable-table-without-header - "%s <- local({ - con <- textConnection( - %S - ) - res <- utils::read.table( - con, - header = %s, - row.names = %s, - sep = \"\\t\", - as.is = TRUE, - fill = TRUE, - col.names = paste(\"V\", seq_len(%d), sep =\"\") - ) - close(con) - res - })" - "R code used to transfer a table defined as a variable from org to R. - -This function is used when the table does not contain a header.") - -(defun org-babel-expand-body:R (body params &optional _graphics-file) - "Expand BODY according to PARAMS, return the expanded body." - (mapconcat 'identity - (append - (when (cdr (assq :prologue params)) - (list (cdr (assq :prologue params)))) - (org-babel-variable-assignments:R params) - (list body) - (when (cdr (assq :epilogue params)) - (list (cdr (assq :epilogue params))))) - "\n")) - -(defun org-babel-execute:R (body params) - "Execute a block of R code. -This function is called by `org-babel-execute-src-block'." - (save-excursion - (let* ((result-params (cdr (assq :result-params params))) - (result-type (cdr (assq :result-type params))) - (session (org-babel-R-initiate-session - (cdr (assq :session params)) params)) - (graphics-file (and (member "graphics" (assq :result-params params)) - (org-babel-graphical-output-file params))) - (colnames-p (unless graphics-file (cdr (assq :colnames params)))) - (rownames-p (unless graphics-file (cdr (assq :rownames params)))) - (full-body - (let ((inside - (list (org-babel-expand-body:R body params graphics-file)))) - (mapconcat 'identity - (if graphics-file - (append - (list (org-babel-R-construct-graphics-device-call - graphics-file params)) - inside - (list "},error=function(e){plot(x=-1:1, y=-1:1, type='n', xlab='', ylab='', axes=FALSE); text(x=0, y=0, labels=e$message, col='red'); paste('ERROR', e$message, sep=' : ')}); dev.off()")) - inside) - "\n"))) - (result - (org-babel-R-evaluate - session full-body result-type result-params - (or (equal "yes" colnames-p) - (org-babel-pick-name - (cdr (assq :colname-names params)) colnames-p)) - (or (equal "yes" rownames-p) - (org-babel-pick-name - (cdr (assq :rowname-names params)) rownames-p))))) - (if graphics-file nil result)))) - -(defun org-babel-prep-session:R (session params) - "Prepare SESSION according to the header arguments specified in PARAMS." - (let* ((session (org-babel-R-initiate-session session params)) - (var-lines (org-babel-variable-assignments:R params))) - (org-babel-comint-in-buffer session - (mapc (lambda (var) - (end-of-line 1) (insert var) (comint-send-input nil t) - (org-babel-comint-wait-for-output session)) var-lines)) - session)) - -(defun org-babel-load-session:R (session body params) - "Load BODY into SESSION." - (save-window-excursion - (let ((buffer (org-babel-prep-session:R session params))) - (with-current-buffer buffer - (goto-char (process-mark (get-buffer-process (current-buffer)))) - (insert (org-babel-chomp body))) - buffer))) - -;; helper functions - -(defun org-babel-variable-assignments:R (params) - "Return list of R statements assigning the block's variables." - (let ((vars (org-babel--get-vars params))) - (mapcar - (lambda (pair) - (org-babel-R-assign-elisp - (car pair) (cdr pair) - (equal "yes" (cdr (assq :colnames params))) - (equal "yes" (cdr (assq :rownames params))))) - (mapcar - (lambda (i) - (cons (car (nth i vars)) - (org-babel-reassemble-table - (cdr (nth i vars)) - (cdr (nth i (cdr (assq :colname-names params)))) - (cdr (nth i (cdr (assq :rowname-names params))))))) - (number-sequence 0 (1- (length vars))))))) - -(defun org-babel-R-quote-tsv-field (s) - "Quote field S for export to R." - (if (stringp s) - (concat "\"" (mapconcat 'identity (split-string s "\"") "\"\"") "\"") - (format "%S" s))) - -(defun org-babel-R-assign-elisp (name value colnames-p rownames-p) - "Construct R code assigning the elisp VALUE to a variable named NAME." - (if (listp value) - (let* ((lengths (mapcar 'length (cl-remove-if-not 'sequencep value))) - (max (if lengths (apply 'max lengths) 0)) - (min (if lengths (apply 'min lengths) 0))) - ;; Ensure VALUE has an orgtbl structure (depth of at least 2). - (unless (listp (car value)) (setq value (list value))) - (let ((file (orgtbl-to-tsv value '(:fmt org-babel-R-quote-tsv-field))) - (header (if (or (eq (nth 1 value) 'hline) colnames-p) - "TRUE" "FALSE")) - (row-names (if rownames-p "1" "NULL"))) - (if (= max min) - (format ob-R-transfer-variable-table-with-header - name file header row-names) - (format ob-R-transfer-variable-table-without-header - name file header row-names max)))) - (cond ((integerp value) (format "%s <- %s" name (concat (number-to-string value) "L"))) - ((floatp value) (format "%s <- %s" name value)) - ((stringp value) (format "%s <- %S" name (org-no-properties value))) - (t (format "%s <- %S" name (prin1-to-string value)))))) - - -(defvar ess-ask-for-ess-directory) ; dynamically scoped -(defun org-babel-R-initiate-session (session params) - "If there is not a current R process then create one." - (unless (string= session "none") - (let ((session (or session "*R*")) - (ess-ask-for-ess-directory - (and (boundp 'ess-ask-for-ess-directory) - ess-ask-for-ess-directory - (not (cdr (assq :dir params)))))) - (if (org-babel-comint-buffer-livep session) - session - (save-window-excursion - (when (get-buffer session) - ;; Session buffer exists, but with dead process - (set-buffer session)) - (require 'ess) (R) - (let ((R-proc (get-process (or ess-local-process-name - ess-current-process-name)))) - (while (process-get R-proc 'callbacks) - (ess-wait-for-process R-proc))) - (rename-buffer - (if (bufferp session) - (buffer-name session) - (if (stringp session) - session - (buffer-name)))) - (current-buffer)))))) - -(defun org-babel-R-associate-session (session) - "Associate R code buffer with an R session. -Make SESSION be the inferior ESS process associated with the -current code buffer." - (setq ess-local-process-name - (process-name (get-buffer-process session))) - (ess-make-buffer-current)) - -(defvar org-babel-R-graphics-devices - '((:bmp "bmp" "filename") - (:jpg "jpeg" "filename") - (:jpeg "jpeg" "filename") - (:tikz "tikz" "file") - (:tiff "tiff" "filename") - (:png "png" "filename") - (:svg "svg" "file") - (:pdf "pdf" "file") - (:ps "postscript" "file") - (:postscript "postscript" "file")) - "An alist mapping graphics file types to R functions. - -Each member of this list is a list with three members: -1. the file extension of the graphics file, as an elisp :keyword -2. the R graphics device function to call to generate such a file -3. the name of the argument to this function which specifies the - file to write to (typically \"file\" or \"filename\")") - -(defun org-babel-R-construct-graphics-device-call (out-file params) - "Construct the call to the graphics device." - (let* ((allowed-args '(:width :height :bg :units :pointsize - :antialias :quality :compression :res - :type :family :title :fonts :version - :paper :encoding :pagecentre :colormodel - :useDingbats :horizontal)) - (device (file-name-extension out-file)) - (device-info (or (assq (intern (concat ":" device)) - org-babel-R-graphics-devices) - (assq :png org-babel-R-graphics-devices))) - (extra-args (cdr (assq :R-dev-args params))) filearg args) - (setq device (nth 1 device-info)) - (setq filearg (nth 2 device-info)) - (setq args (mapconcat - (lambda (pair) - (if (member (car pair) allowed-args) - (format ",%s=%S" - (substring (symbol-name (car pair)) 1) - (cdr pair)) "")) - params "")) - (format "%s(%s=\"%s\"%s%s%s); tryCatch({" - device filearg out-file args - (if extra-args "," "") (or extra-args "")))) - -(defconst org-babel-R-eoe-indicator "'org_babel_R_eoe'") -(defconst org-babel-R-eoe-output "[1] \"org_babel_R_eoe\"") - -(defconst org-babel-R-write-object-command "{ - function(object,transfer.file) { - object - invisible( - if ( - inherits( - try( - { - tfile<-tempfile() - write.table(object, file=tfile, sep=\"\\t\", - na=\"nil\",row.names=%s,col.names=%s, - quote=FALSE) - file.rename(tfile,transfer.file) - }, - silent=TRUE), - \"try-error\")) - { - if(!file.exists(transfer.file)) - file.create(transfer.file) - } - ) - } -}(object=%s,transfer.file=\"%s\")" - "A template for an R command to evaluate a block of code and write the result to a file. - -Has four %s escapes to be filled in: -1. Row names, \"TRUE\" or \"FALSE\" -2. Column names, \"TRUE\" or \"FALSE\" -3. The code to be run (must be an expression, not a statement) -4. The name of the file to write to") - -(defun org-babel-R-evaluate - (session body result-type result-params column-names-p row-names-p) - "Evaluate R code in BODY." - (if session - (org-babel-R-evaluate-session - session body result-type result-params column-names-p row-names-p) - (org-babel-R-evaluate-external-process - body result-type result-params column-names-p row-names-p))) - -(defun org-babel-R-evaluate-external-process - (body result-type result-params column-names-p row-names-p) - "Evaluate BODY in external R process. -If RESULT-TYPE equals `output' then return standard output as a -string. If RESULT-TYPE equals `value' then return the value of the -last statement in BODY, as elisp." - (cl-case result-type - (value - (let ((tmp-file (org-babel-temp-file "R-"))) - (org-babel-eval org-babel-R-command - (format org-babel-R-write-object-command - (if row-names-p "TRUE" "FALSE") - (if column-names-p - (if row-names-p "NA" "TRUE") - "FALSE") - (format "{function ()\n{\n%s\n}}()" body) - (org-babel-process-file-name tmp-file 'noquote))) - (org-babel-R-process-value-result - (org-babel-result-cond result-params - (with-temp-buffer - (insert-file-contents tmp-file) - (org-babel-chomp (buffer-string) "\n")) - (org-babel-import-elisp-from-file tmp-file '(16))) - column-names-p))) - (output (org-babel-eval org-babel-R-command body)))) - -(defvar ess-eval-visibly-p) - -(defun org-babel-R-evaluate-session - (session body result-type result-params column-names-p row-names-p) - "Evaluate BODY in SESSION. -If RESULT-TYPE equals `output' then return standard output as a -string. If RESULT-TYPE equals `value' then return the value of the -last statement in BODY, as elisp." - (cl-case result-type - (value - (with-temp-buffer - (insert (org-babel-chomp body)) - (let ((ess-local-process-name - (process-name (get-buffer-process session))) - (ess-eval-visibly-p nil)) - (ess-eval-buffer nil))) - (let ((tmp-file (org-babel-temp-file "R-"))) - (org-babel-comint-eval-invisibly-and-wait-for-file - session tmp-file - (format org-babel-R-write-object-command - (if row-names-p "TRUE" "FALSE") - (if column-names-p - (if row-names-p "NA" "TRUE") - "FALSE") - ".Last.value" (org-babel-process-file-name tmp-file 'noquote))) - (org-babel-R-process-value-result - (org-babel-result-cond result-params - (with-temp-buffer - (insert-file-contents tmp-file) - (org-babel-chomp (buffer-string) "\n")) - (org-babel-import-elisp-from-file tmp-file '(16))) - column-names-p))) - (output - (mapconcat - 'org-babel-chomp - (butlast - (delq nil - (mapcar - (lambda (line) (when (> (length line) 0) line)) - (mapcar - (lambda (line) ;; cleanup extra prompts left in output - (if (string-match - "^\\([>+.]\\([ ][>.+]\\)*[ ]\\)" - (car (split-string line "\n"))) - (substring line (match-end 1)) - line)) - (org-babel-comint-with-output (session org-babel-R-eoe-output) - (insert (mapconcat 'org-babel-chomp - (list body org-babel-R-eoe-indicator) - "\n")) - (inferior-ess-send-input)))))) "\n")))) - -(defun org-babel-R-process-value-result (result column-names-p) - "R-specific processing of return value. -Insert hline if column names in output have been requested." - (if column-names-p - (cons (car result) (cons 'hline (cdr result))) - result)) - -(provide 'ob-R) - - - -;;; ob-R.el ends here diff --git a/elpa/org-9.3.6/ob-R.elc b/elpa/org-9.3.6/ob-R.elc deleted file mode 100644 index ed402cab077f8978dd0420795c520008d9aefff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15981 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 KNtr11)&BvqqDMaf diff --git a/elpa/org-9.3.6/ob-abc.el b/elpa/org-9.3.6/ob-abc.el deleted file mode 100644 index d4731186..00000000 --- a/elpa/org-9.3.6/ob-abc.el +++ /dev/null @@ -1,90 +0,0 @@ -;;; ob-abc.el --- Org Babel Functions for ABC -*- lexical-binding: t; -*- - -;; Copyright (C) 2013-2020 Free Software Foundation, Inc. - -;; Author: William Waites -;; Keywords: literate programming, music -;; Homepage: http://www.tardis.ed.ac.uk/wwaites -;; Version: 0.01 - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;;; This file adds support to Org Babel for music in ABC notation. -;;; It requires that the abcm2ps program is installed. -;;; See http://moinejf.free.fr/ - -(require 'ob) - -;; optionally define a file extension for this language -(add-to-list 'org-babel-tangle-lang-exts '("abc" . "abc")) - -;; optionally declare default header arguments for this language -(defvar org-babel-default-header-args:abc - '((:results . "file") (:exports . "results")) - "Default arguments to use when evaluating an ABC source block.") - -(defun org-babel-expand-body:abc (body params) - "Expand BODY according to PARAMS, return the expanded body." - (let ((vars (org-babel--get-vars params))) - (mapc - (lambda (pair) - (let ((name (symbol-name (car pair))) - (value (cdr pair))) - (setq body - (replace-regexp-in-string - (concat "\\$" (regexp-quote name)) - (if (stringp value) value (format "%S" value)) - body)))) - vars) - body)) - -(defun org-babel-execute:abc (body params) - "Execute a block of ABC code with org-babel. This function is - called by `org-babel-execute-src-block'" - (message "executing Abc source code block") - (let* ((cmdline (cdr (assq :cmdline params))) - (out-file (let ((file (cdr (assq :file params)))) - (if file (replace-regexp-in-string "\\.pdf$" ".ps" file) - (error "abc code block requires :file header argument")))) - (in-file (org-babel-temp-file "abc-")) - (render (concat "abcm2ps" " " cmdline - " -O " (org-babel-process-file-name out-file) - " " (org-babel-process-file-name in-file)))) - (with-temp-file in-file (insert (org-babel-expand-body:abc body params))) - (org-babel-eval render "") - ;;; handle where abcm2ps changes the file name (to support multiple files - (when (or (string= (file-name-extension out-file) "eps") - (string= (file-name-extension out-file) "svg")) - (rename-file (concat - (file-name-sans-extension out-file) "001." - (file-name-extension out-file)) - out-file t)) - ;;; if we were asked for a pdf... - (when (string= (file-name-extension (cdr (assq :file params))) "pdf") - (org-babel-eval (concat "ps2pdf" " " out-file " " (cdr (assq :file params))) "")) - ;;; indicate that the file has been written - nil)) - -;; This function should be used to assign any variables in params in -;; the context of the session environment. -(defun org-babel-prep-session:abc (_session _params) - "Return an error because abc does not support sessions." - (error "ABC does not support sessions")) - -(provide 'ob-abc) -;;; ob-abc.el ends here diff --git a/elpa/org-9.3.6/ob-abc.elc b/elpa/org-9.3.6/ob-abc.elc deleted file mode 100644 index edba97c677911b2ab2c2a91292fd6289f57e1400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2481 zcmbtWZExE)5Y9{EcK!j|uzlD?X%V|94T+NFCizk~&4&Qn+BN$!)B#3Gv?D~898${5 ze*K=K)Hvx)8N07ljrD9zx&NmIj_mQjbRD zp2KqrhyA@*aY%3UTr~wMV;0R)mr$)Mt|HxB=#uocDjJl!To7_LeSM5PHzw7T6jgdT z`l&z2^!!?x2d*JtgW^J?3`W4NJ%n%C9}EtSwwSUU2BXCr(%?|vt}4^Yx@m6+`QB4# zjb$|CI43XZG8qSjSl>AD-s9e5o|>RIA(tx% zo^5fV0)KNRBRP|?#K4tp?Mf_kEs!@$OSMXIyVPQh06CsG6a<^Eb~mRm{s{_pcHeCu z!D9IB#x@@EhYe`BNOm{|D8ua@ZWyrJYqU|SYP57(SB5^=yJb=p0xhbMv{j)}EsS1Z z_aZMv+pusyd+K4@iLaWf)-Rbfpk92EEe zN0r^uhZXKJylyxYEQ~qv;Z{46LBJXRo>Lv+a_Qbil70Cj%O+fV^efjI2*4!)iU3_3 zM2~QTeh~M1EW>gPff*V5k69aQB?>HqT}(^BOJbRXn#3v@@37RNEA*cNRb(75*`R)n}~q9Dd_1h$8q7$1PGZinrk>oM5{Qo5)~St&Cyh zWH9FY5J%WvBp*RNg4vL_^&5Od5z@g85XPLiUe9HYwZ>}$VaRr|w+Ko>wA1DT+5nSF zIg$e5gSgl$Q{GZrs}^9#w)EWmQ?N=$M-EO72p%1#%dE&tO^5D8`Y(u&R@odd_eLx0 zkv0bH!TgAW2R!V|p#>b(+Rj?bYWHmEJs`eXFIU33WE%oz@mNYW-TuW}4AvN4nJUGm z+>*8%nG}*{J_l{4Mk{p9LYLZLAWD7namqEWN6*=xJ9M9WpA(4R(g*6mp!CPzFh-fU z-0Qz^Lg&?)zRZiF^L0-0LBOB$rxj~-i!gG7$Q%INYlfu(3 zCH8v31j8=dta0jEU8_p_aDnd!Bac8mC>K(>vXTd2oTy`*AP76knM~+?dl2BfYAc%P zRPlkvg}wi@u+55(9m3}d2gM&U%w=aMXJ@Bxf9(#HFC7#sU`li=zrZ67vmK)N*!-en aY~$lDq@4InoC6@^ItK#xt3)8`VgGLm7}B5s diff --git a/elpa/org-9.3.6/ob-asymptote.el b/elpa/org-9.3.6/ob-asymptote.el deleted file mode 100644 index bdc74b84..00000000 --- a/elpa/org-9.3.6/ob-asymptote.el +++ /dev/null @@ -1,139 +0,0 @@ -;;; ob-asymptote.el --- Babel Functions for Asymptote -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Org-Babel support for evaluating asymptote source code. -;; -;; This differs from most standard languages in that -;; -;; 1) there is no such thing as a "session" in asymptote -;; -;; 2) we are generally only going to return results of type "file" -;; -;; 3) we are adding the "file" and "cmdline" header arguments, if file -;; is omitted then the -V option is passed to the asy command for -;; interactive viewing - -;;; Requirements: - -;; - The asymptote program :: http://asymptote.sourceforge.net/ -;; -;; - asy-mode :: Major mode for editing asymptote files - -;;; Code: -(require 'ob) - -(defvar org-babel-tangle-lang-exts) -(add-to-list 'org-babel-tangle-lang-exts '("asymptote" . "asy")) - -(defvar org-babel-default-header-args:asymptote - '((:results . "file") (:exports . "results")) - "Default arguments when evaluating an Asymptote source block.") - -(defun org-babel-execute:asymptote (body params) - "Execute a block of Asymptote code. -This function is called by `org-babel-execute-src-block'." - (let* ((out-file (cdr (assq :file params))) - (format (or (file-name-extension out-file) - "pdf")) - (cmdline (cdr (assq :cmdline params))) - (in-file (org-babel-temp-file "asymptote-")) - (cmd - (concat "asy " - (if out-file - (concat - "-globalwrite -f " format - " -o " (org-babel-process-file-name out-file)) - "-V") - " " cmdline - " " (org-babel-process-file-name in-file)))) - (with-temp-file in-file - (insert (org-babel-expand-body:generic - body params - (org-babel-variable-assignments:asymptote params)))) - (message cmd) (shell-command cmd) - nil)) ;; signal that output has already been written to file - -(defun org-babel-prep-session:asymptote (_session _params) - "Return an error if the :session header argument is set. -Asymptote does not support sessions." - (error "Asymptote does not support sessions")) - -(defun org-babel-variable-assignments:asymptote (params) - "Return list of asymptote statements assigning the block's variables." - (mapcar #'org-babel-asymptote-var-to-asymptote - (org-babel--get-vars params))) - -(defun org-babel-asymptote-var-to-asymptote (pair) - "Convert an elisp value into an Asymptote variable. -The elisp value PAIR is converted into Asymptote code specifying -a variable of the same value." - (let ((var (car pair)) - (val (let ((v (cdr pair))) - (if (symbolp v) (symbol-name v) v)))) - (cond - ((integerp val) - (format "int %S=%S;" var val)) - ((floatp val) - (format "real %S=%S;" var val)) - ((stringp val) - (format "string %S=\"%s\";" var val)) - ((and (listp val) (not (listp (car val)))) - (let* ((type (org-babel-asymptote-define-type val)) - (fmt (if (eq 'string type) "\"%s\"" "%s")) - (vect (mapconcat (lambda (e) (format fmt e)) val ", "))) - (format "%s[] %S={%s};" type var vect))) - ((listp val) - (let* ((type (org-babel-asymptote-define-type val)) - (fmt (if (eq 'string type) "\"%s\"" "%s")) - (array (mapconcat (lambda (row) - (concat "{" - (mapconcat (lambda (e) (format fmt e)) - row ", ") - "}")) - val ","))) - (format "%S[][] %S={%s};" type var array)))))) - -(defun org-babel-asymptote-define-type (data) - "Determine type of DATA. - -DATA is a list. Return type as a symbol. - -The type is `string' if any element in DATA is a string. -Otherwise, it is either `real', if some elements are floats, or -`int'." - (letrec ((type 'int) - (find-type - (lambda (row) - (dolist (e row type) - (cond ((listp e) (setq type (funcall find-type e))) - ((stringp e) (throw 'exit 'string)) - ((floatp e) (setq type 'real))))))) - (catch 'exit (funcall find-type data)) type)) - -(provide 'ob-asymptote) - - - -;;; ob-asymptote.el ends here diff --git a/elpa/org-9.3.6/ob-asymptote.elc b/elpa/org-9.3.6/ob-asymptote.elc deleted file mode 100644 index d3c62032b49e9dcc45536fb467e4a0f5f779ca3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3787 zcmcInO>f&q5Vhk}X_P~IYL6My5o`saKrThe9}N)I@gYFlq*lrT^5zP<=G&7g&rT4|bI$8r${G))4XXJI_o zPcWP5oaA(>rnK6{J?Myok915E=!lb?f+Wr*gqQiu-p5F64~EAtUQlo$Ga2MC@rl`9 z##7P>1u~|Iq9~C!HYr`vq+}L_Dx>@Yg2F5IMF_s?#|C`uui0$wO|Elg2gy{CHS!z> zm%BX@Ev? z)1D>u^&-uaTv^m1ezV$R^4iUvXFWmB)l4oUjdfi?C+}3S%oWMP0!n6Uws8zQ%>t3jIAE9(&=~-`fZpVq z&g(F#LXoYrz&6h80u+0*n0|iw{4aVnI34^tY#08?D3qFZKU%xy*3Oylc8m0Fj)d16 za1u9>MW^>*qsrq}HPgk2zl~e(E+o8>#UlN?Bad_Lx{YtQPcbfbFzf;WuE$e=0j3(z z*>f73c!3tz$JN`0Dz`uK1Xc?d7uE>x8;lCZjVJs^fKxBS&3#({OY|D|8}~8QZ#>xE z33#x*KJP)5=kfwSywE>Fi~7}0PXPOX2x zO09WCbzXwD0-1wCgFMOTtlZV8eiKGfx!0J)n&p5#Sj?Uz)9XWH80fS13&j=62|_8g z4(G9{&^6$hkl2};GuGoUq6LB==Zf@&!hS)rSU~xhT)!-)zSC`wi)!-eROQPo<^oq) z27|*H7*f$8nB3&6sNoega4~6>cbYXFtO#2#Q?6jlo27g_a5W82hQk*xfBQl~rI||Y za^;$HYgL7qGbtK;6}DRc!3b+i-O_K@_npG=eXsJnV9puU^rUm3qF})y-pqd-l7b>| zIF{+C{QGyJsH8uWyqz=Q_iNIJk78?k#qWu^_i%>1i?HN4o2cFgNBRVjD- z2m58t{e2wzF^)y>J(7+9q;M%(Djdvta+B#R--$wuKfJi@hXI1s%M)6CaeRX#QTmb(=h}rzTeID~{~fsuu`14aDWz1z5V7xdoi zu~Jr7xB)YHZ@+Tt_Vz5fvVfOes+eUDsf{tO5LUVrH_FHdH_11EroD`yDOrWP^OyTUKO+?eZ;8WWK9cBD{@Opsas!dp>L8@AOWJx zBW4)l=SA9f`OJ~=HTcEwE`K1@8Vi|D^Cc)Fy9%{>LSfFEDSVQkoj+&r>|$_+z7&K~ zD#51ckPX1_`H^JJa{#aE?^yeniDn&O6~`cz$DGgOP252!U6e1EFsJq7>^JT;?s3wA z0ZzT??9fA%i%{*{-x*@+g7u9m@KYD{YaqdAIhV^P;cJ#Lr#W7?AR5+Wi020sa`6qp z%I@IItju%-C=FtUzPPtsvl(9(1sNIE^9^wp3<$e{g#MjYoGO3TecJm*T9ZqTh diff --git a/elpa/org-9.3.6/ob-awk.el b/elpa/org-9.3.6/ob-awk.el deleted file mode 100644 index 74bbc4c2..00000000 --- a/elpa/org-9.3.6/ob-awk.el +++ /dev/null @@ -1,111 +0,0 @@ -;;; ob-awk.el --- Babel Functions for Awk -*- lexical-binding: t; -*- - -;; Copyright (C) 2011-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Babel's awk can use special header argument: -;; -;; - :in-file takes a path to a file of data to be processed by awk -;; -;; - :stdin takes an Org data or code block reference, the value of -;; which will be passed to the awk process through STDIN - -;;; Code: -(require 'ob) -(require 'org-compat) - -(declare-function org-babel-ref-resolve "ob-ref" (ref)) -(declare-function orgtbl-to-generic "org-table" (table params)) - -(defvar org-babel-tangle-lang-exts) -(add-to-list 'org-babel-tangle-lang-exts '("awk" . "awk")) - -(defvar org-babel-awk-command "awk" - "Name of the awk executable command.") - -(defun org-babel-expand-body:awk (body _params) - "Expand BODY according to PARAMS, return the expanded body." - body) - -(defun org-babel-execute:awk (body params) - "Execute a block of Awk code with org-babel. -This function is called by `org-babel-execute-src-block'." - (message "executing Awk source code block") - (let* ((result-params (cdr (assq :result-params params))) - (cmd-line (cdr (assq :cmd-line params))) - (in-file (cdr (assq :in-file params))) - (full-body (org-babel-expand-body:awk body params)) - (code-file (let ((file (org-babel-temp-file "awk-"))) - (with-temp-file file (insert full-body)) file)) - (stdin (let ((stdin (cdr (assq :stdin params)))) - (when stdin - (let ((tmp (org-babel-temp-file "awk-stdin-")) - (res (org-babel-ref-resolve stdin))) - (with-temp-file tmp - (insert (org-babel-awk-var-to-awk res))) - tmp)))) - (cmd (mapconcat #'identity - (append - (list org-babel-awk-command - "-f" code-file cmd-line) - (mapcar (lambda (pair) - (format "-v %s='%s'" - (car pair) - (org-babel-awk-var-to-awk - (cdr pair)))) - (org-babel--get-vars params)) - (list in-file)) - " "))) - (org-babel-reassemble-table - (let ((results - (cond - (stdin (with-temp-buffer - (call-process-shell-command cmd stdin (current-buffer)) - (buffer-string))) - (t (org-babel-eval cmd ""))))) - (when results - (org-babel-result-cond result-params - results - (let ((tmp (org-babel-temp-file "awk-results-"))) - (with-temp-file tmp (insert results)) - (org-babel-import-elisp-from-file tmp))))) - (org-babel-pick-name - (cdr (assq :colname-names params)) (cdr (assq :colnames params))) - (org-babel-pick-name - (cdr (assq :rowname-names params)) (cdr (assq :rownames params)))))) - -(defun org-babel-awk-var-to-awk (var &optional sep) - "Return a printed value of VAR suitable for parsing with awk." - (let ((echo-var (lambda (v) (if (stringp v) v (format "%S" v))))) - (cond - ((and (listp var) (listp (car var))) - (orgtbl-to-generic var (list :sep (or sep "\t") :fmt echo-var))) - ((listp var) - (mapconcat echo-var var "\n")) - (t (funcall echo-var var))))) - -(provide 'ob-awk) - - - -;;; ob-awk.el ends here diff --git a/elpa/org-9.3.6/ob-awk.elc b/elpa/org-9.3.6/ob-awk.elc deleted file mode 100644 index 21b49925ecdabf808390f183179075f21d41ba95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3220 zcmbtWS#R4$5cUxZiHf`wMf=c)j^wzu($FBeBI%<=qqqr2+pjA?wk-H`uKap?$EV^E?p}5dYULn#fS{ktwD)2; zo`q^j0a)1r-mgW{-u4rS_xcAtmK+?=>6?;wfBNI+zbK5NLd8G`RRz5qoDY7xct%QA zQ3)h2{#5^CCAxLF^w_|Op>zkTUBed?|^5rdbFS-v>v zU9nw`>%cH}5$@6`EutItet^R!DF*)c3ijJI;-`7U*MNZj2zP_+yraMG*$`qQ(b6ii zjLhAS@xh#3wjXJCR~4u-<989q2`{x064)4>x!ayc9`ku(Di*-1Z}SGu4B(@ zwQ94>H-Oi*?X}uA*JquXS4IMHX?w&4`bZMP=VM8cqRG|@qpE> zVg3Ru1V|u2eY^FzGwik=o@|3~_~F7&TMXSGfIod4?e{y&F?x55`+R-pF~%8xbF19u z&|w`A#}8p+vxF@m*Rwb9;Jh^PJ6mtTK#!S(_aivHUl2Y|7#d{%b0+(%q_;}?t7Nc3 z`t~a6+>^sGL>u!2r?Fqt3(YlsuUdS`>$s}uVyYsprKtF(G<4}mNj*&~t3-FpG#y1*jQX8RI!bcObk~K3w=3LYr;=G& zb8|_zx-^lMHJXmcQdyCbAqw0?=2Br{!7fvZT2D2{GnfxEI3x4(-jfp!TmT;tOOiN;!S4nk8VOdJ^zO2Wt17R^hopR%bH{o)I6Lokua^9=I4Lkt zBjn3MkRPpOhAxX%&As*=shVdA33`8oxgA-hDk7lI($^Byye&6bsVB1~o8&A^sSA5B zXi2;@WP}O}3{WGCdl{D3RhHt#sKu)+@nB%$RZOdLT4ABWTPD>6&lrSc5ylz3IY>3i zHS+s@^B0*+va(Q>B{9eV)~d+fz6oU#-B<=. - -;;; Commentary: - -;; Org-Babel support for evaluating calc code - -;;; Code: -(require 'ob) -(require 'org-macs) -(require 'calc) -(require 'calc-trail) -(require 'calc-store) - -(declare-function calc-store-into "calc-store" (&optional var)) -(declare-function calc-recall "calc-store" (&optional var)) -(declare-function math-evaluate-expr "calc-ext" (x)) - -(defvar org-babel-default-header-args:calc nil - "Default arguments for evaluating a calc source block.") - -(defun org-babel-expand-body:calc (body _params) - "Expand BODY according to PARAMS, return the expanded body." body) - -(defvar org--var-syms) ; Dynamically scoped from org-babel-execute:calc - -(defun org-babel-execute:calc (body params) - "Execute a block of calc code with Babel." - (unless (get-buffer "*Calculator*") - (save-window-excursion (calc) (calc-quit))) - (let* ((vars (org-babel--get-vars params)) - (org--var-syms (mapcar #'car vars)) - (var-names (mapcar #'symbol-name org--var-syms))) - (mapc - (lambda (pair) - (calc-push-list (list (cdr pair))) - (calc-store-into (car pair))) - vars) - (mapc - (lambda (line) - (when (> (length line) 0) - (cond - ;; simple variable name - ((member line var-names) (calc-recall (intern line))) - ;; stack operation - ((string= "'" (substring line 0 1)) - (funcall (lookup-key calc-mode-map (substring line 1)) nil)) - ;; complex expression - (t - (calc-push-list - (list (let ((res (calc-eval line))) - (cond - ((numberp res) res) - ((math-read-number res) (math-read-number res)) - ((listp res) (error "Calc error \"%s\" on input \"%s\"" - (cadr res) line)) - (t (replace-regexp-in-string - "'" "" - (calc-eval - (math-evaluate-expr - ;; resolve user variables, calc built in - ;; variables are handled automatically - ;; upstream by calc - (mapcar #'org-babel-calc-maybe-resolve-var - ;; parse line into calc objects - (car (math-read-exprs line))))))))) - )))))) - (mapcar #'org-trim - (split-string (org-babel-expand-body:calc body params) "[\n\r]")))) - (save-excursion - (with-current-buffer (get-buffer "*Calculator*") - (prog1 - (calc-eval (calc-top 1)) - (calc-pop 1))))) - -(defun org-babel-calc-maybe-resolve-var (el) - (if (consp el) - (if (and (eq 'var (car el)) (member (cadr el) org--var-syms)) - (progn - (calc-recall (cadr el)) - (prog1 (calc-top 1) - (calc-pop 1))) - (mapcar #'org-babel-calc-maybe-resolve-var el)) - el)) - -(provide 'ob-calc) - - - -;;; ob-calc.el ends here diff --git a/elpa/org-9.3.6/ob-calc.elc b/elpa/org-9.3.6/ob-calc.elc deleted file mode 100644 index 5348223004baff9b78da784e5bd5da7188c2c83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2384 zcmbtVT~FLb6a}iFuu`A;&^}b^#UzD|FtW$%T?nnphM)>54N+26sxXnp_Ux{O*W-+B zDE;+4cg7S@5~)=djhT--_w(E{hbOO&zg<~b85|xS(y?CFMX7STC@MNx%B-O)Wtu`) zB*uG@J-II01AU08Q_2?7$gG8nyVks{a%wbX zvZ7Q`spSJBeJBknY05$wY8Ma`k+X{we9?~`_|o5CFxW|NTIFXtSL7v85MYFxi3oYZ zL)>3P_ZOr4ix`Vw;?cQLAG*RQ(kW>(_iarxS!PI5nfa}eMd_wZtBtxKF&u0i#WB59 zGuf3Wl$m!+RkbLqHl(g(*`eaqoTR;mbay6Gl$JWX-1}j$ldIX4G}cxsQ&sxdU`75y zp&G`AzUH}gpn~O{ttYfcada?bvy*)~`K#t4zBqgNC&?_+CTCl%rZ>~K)8F3hl2L7E zDwIxp+-!eIvo+v7~w`F);HES_&AF2l3e;{>nx`Hg)5EFp}iy->OLI?t*HRKwE&@$JJ!2{#$L1C#cVy&ZkvA!;Xmoj{7*6** z;%m(Xh2jnZuTEc|4B-pf1dr;Hnz}67Tf29vKjJy>JgL6EK;JNsZQyp+>Kgg7(^}Wo zl%wVSFm&`6hUD1w>oLXa?gigHO57cjfdR9skEN;==emu|Ft9+H0oak5gY`Zmz~<^s{-%z LwoZN4JRJN331_he diff --git a/elpa/org-9.3.6/ob-clojure.el b/elpa/org-9.3.6/ob-clojure.el deleted file mode 100644 index ac5c4c99..00000000 --- a/elpa/org-9.3.6/ob-clojure.el +++ /dev/null @@ -1,285 +0,0 @@ -;;; ob-clojure.el --- Babel Functions for Clojure -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2020 Free Software Foundation, Inc. - -;; Author: Joel Boehland, Eric Schulte, Oleh Krehel, Frederick Giasson -;; -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Support for evaluating clojure code - -;; Requirements: - -;; - clojure (at least 1.2.0) -;; - clojure-mode -;; - either cider or SLIME - -;; For Cider, see https://github.com/clojure-emacs/cider - -;; For SLIME, the best way to install these components is by following -;; the directions as set out by Phil Hagelberg (Technomancy) on the -;; web page: http://technomancy.us/126 - -;;; Code: -(require 'cl-lib) -(require 'ob) -(require 'org-macs) - -(declare-function cider-jack-in "ext:cider" (&optional prompt-project cljs-too)) -(declare-function cider-current-connection "ext:cider-client" (&optional type)) -(declare-function cider-current-ns "ext:cider-client" ()) -(declare-function cider-repls "ext:cider-connection" (&optional type ensure)) -(declare-function nrepl--merge "ext:nrepl-client" (dict1 dict2)) -(declare-function nrepl-dict-get "ext:nrepl-client" (dict key)) -(declare-function nrepl-dict-put "ext:nrepl-client" (dict key value)) -(declare-function nrepl-request:eval "ext:nrepl-client" (input callback connection &optional ns line column additional-params tooling)) -(declare-function nrepl-sync-request:eval "ext:nrepl-client" (input connection &optional ns tooling)) -(declare-function slime-eval "ext:slime" (sexp &optional package)) - -(defvar nrepl-sync-request-timeout) -(defvar cider-buffer-ns) -(defvar sesman-system) -(defvar cider-version) - -(defvar org-babel-tangle-lang-exts) -(add-to-list 'org-babel-tangle-lang-exts '("clojure" . "clj")) - -(defvar org-babel-default-header-args:clojure '()) -(defvar org-babel-header-args:clojure '((ns . :any) - (package . :any))) - -(defcustom org-babel-clojure-sync-nrepl-timeout 10 - "Timeout value, in seconds, of a Clojure sync call. -If the value is nil, timeout is disabled." - :group 'org-babel - :type 'integer - :version "26.1" - :package-version '(Org . "9.1") - :safe #'wholenump) - -(defcustom org-babel-clojure-backend - (cond ((featurep 'cider) 'cider) - (t 'slime)) - "Backend used to evaluate Clojure code blocks." - :group 'org-babel - :type '(choice - (const :tag "cider" cider) - (const :tag "SLIME" slime))) - -(defcustom org-babel-clojure-default-ns "user" - "Default Clojure namespace for source block when finding ns failed." - :type 'string - :group 'org-babel) - -(defun org-babel-clojure-cider-current-ns () - "Like `cider-current-ns' except `cider-find-ns'." - (or cider-buffer-ns - (let ((repl-buf (cider-current-connection))) - (and repl-buf (buffer-local-value 'cider-buffer-ns repl-buf))) - org-babel-clojure-default-ns)) - -(defun org-babel-expand-body:clojure (body params) - "Expand BODY according to PARAMS, return the expanded body." - (let* ((vars (org-babel--get-vars params)) - (ns (or (cdr (assq :ns params)) - (org-babel-clojure-cider-current-ns))) - (result-params (cdr (assq :result-params params))) - (print-level nil) - (print-length nil) - ;; Remove comments, they break (let [...] ...) bindings - (body (replace-regexp-in-string "^[ ]*;+.*$" "" body)) - (body (org-trim - (concat - ;; Source block specified namespace :ns. - (and (cdr (assq :ns params)) (format "(ns %s)\n" ns)) - ;; Variables binding. - (if (null vars) (org-trim body) - (format "(let [%s]\n%s)" - (mapconcat - (lambda (var) - (format "%S %S" (car var) (cdr var))) - vars - "\n ") - body)))))) - (if (or (member "code" result-params) - (member "pp" result-params)) - (format "(clojure.pprint/pprint (do %s))" body) - body))) - -(defun org-babel-execute:clojure (body params) - "Execute a block of Clojure code with Babel. -The underlying process performed by the code block can be output -using the :show-process parameter." - (let* ((expanded (org-babel-expand-body:clojure body params)) - (response (list 'dict)) - result) - (cl-case org-babel-clojure-backend - (cider - (require 'cider) - (let ((result-params (cdr (assq :result-params params))) - (show (cdr (assq :show-process params)))) - (if (member show '(nil "no")) - ;; Run code without showing the process. - (progn - (setq response - (let ((nrepl-sync-request-timeout - org-babel-clojure-sync-nrepl-timeout)) - (nrepl-sync-request:eval expanded - (cider-current-connection)))) - (setq result - (concat - (nrepl-dict-get response - (if (or (member "output" result-params) - (member "pp" result-params)) - "out" - "value")) - (nrepl-dict-get response "ex") - (nrepl-dict-get response "root-ex") - (nrepl-dict-get response "err")))) - ;; Show the process in an output buffer/window. - (let ((process-buffer (switch-to-buffer-other-window - "*Clojure Show Process Sub Buffer*")) - status) - ;; Run the Clojure code in nREPL. - (nrepl-request:eval - expanded - (lambda (resp) - (when (member "out" resp) - ;; Print the output of the nREPL in the output buffer. - (princ (nrepl-dict-get resp "out") process-buffer)) - (when (member "ex" resp) - ;; In case there is an exception, then add it to the - ;; output buffer as well. - (princ (nrepl-dict-get resp "ex") process-buffer) - (princ (nrepl-dict-get resp "root-ex") process-buffer)) - (when (member "err" resp) - ;; In case there is an error, then add it to the - ;; output buffer as well. - (princ (nrepl-dict-get resp "err") process-buffer)) - (nrepl--merge response resp) - ;; Update the status of the nREPL output session. - (setq status (nrepl-dict-get response "status"))) - (cider-current-connection)) - - ;; Wait until the nREPL code finished to be processed. - (while (not (member "done" status)) - (nrepl-dict-put response "status" (remove "need-input" status)) - (accept-process-output nil 0.01) - (redisplay)) - - ;; Delete the show buffer & window when the processing is - ;; finalized. - (mapc #'delete-window - (get-buffer-window-list process-buffer nil t)) - (kill-buffer process-buffer) - - ;; Put the output or the value in the result section of - ;; the code block. - (setq result - (concat - (nrepl-dict-get response - (if (or (member "output" result-params) - (member "pp" result-params)) - "out" - "value")) - (nrepl-dict-get response "ex") - (nrepl-dict-get response "root-ex") - (nrepl-dict-get response "err"))))))) - (slime - (require 'slime) - (with-temp-buffer - (insert expanded) - (setq result - (slime-eval - `(swank:eval-and-grab-output - ,(buffer-substring-no-properties (point-min) (point-max))) - (cdr (assq :package params))))))) - (org-babel-result-cond (cdr (assq :result-params params)) - result - (condition-case nil (org-babel-script-escape result) - (error result))))) - -(defun org-babel-clojure-initiate-session (&optional session _params) - "Initiate a session named SESSION according to PARAMS." - (when (and session (not (string= session "none"))) - (save-window-excursion - (cond - ((org-babel-comint-buffer-livep session) nil) - ;; CIDER jack-in to the Clojure project directory. - ((eq org-babel-clojure-backend 'cider) - (require 'cider) - (let ((session-buffer - (save-window-excursion - (if (version< cider-version "0.18.0") - ;; Older CIDER (without sesman) still need to use - ;; old way. - (cider-jack-in nil) ;jack-in without project - ;; New CIDER (with sesman to manage sessions). - (unless (cider-repls) - (let ((sesman-system 'CIDER)) - (call-interactively 'sesman-link-with-directory)))) - (current-buffer)))) - (when (org-babel-comint-buffer-livep session-buffer) - (sit-for .25) - session-buffer))) - ((eq org-babel-clojure-backend 'slime) - (error "Session evaluation with SLIME is not supported")) - (t - (error "Session initiate failed"))) - (get-buffer session)))) - -(defun org-babel-prep-session:clojure (session params) - "Prepare SESSION according to the header arguments specified in PARAMS." - (let ((session (org-babel-clojure-initiate-session session)) - (var-lines (org-babel-variable-assignments:clojure params))) - (when session - (org-babel-comint-in-buffer session - (dolist (var var-lines) - (insert var) - (comint-send-input nil t) - (org-babel-comint-wait-for-output session) - (sit-for .1) - (goto-char (point-max))))) - session)) - -(defun org-babel-clojure-var-to-clojure (var) - "Convert src block's VAR to Clojure variable." - (cond - ((listp var) - (replace-regexp-in-string "(" "'(" var)) - ((stringp var) - ;; Wrap Babel passed-in header argument value with quotes in Clojure. - (format "\"%s\"" var)) - (t - (format "%S" var)))) - -(defun org-babel-variable-assignments:clojure (params) - "Return a list of Clojure statements assigning the block's variables in PARAMS." - (mapcar - (lambda (pair) - (format "(def %s %s)" - (car pair) - (org-babel-clojure-var-to-clojure (cdr pair)))) - (org-babel--get-vars params))) - -(provide 'ob-clojure) - -;;; ob-clojure.el ends here diff --git a/elpa/org-9.3.6/ob-clojure.elc b/elpa/org-9.3.6/ob-clojure.elc deleted file mode 100644 index 418bd2f146fccc13690a889bbcf8ec70ece8d772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7175 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 BFHQge diff --git a/elpa/org-9.3.6/ob-comint.el b/elpa/org-9.3.6/ob-comint.el deleted file mode 100644 index 552b7a03..00000000 --- a/elpa/org-9.3.6/ob-comint.el +++ /dev/null @@ -1,156 +0,0 @@ -;;; ob-comint.el --- Babel Functions for Interaction with Comint Buffers -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research, comint -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; These functions build on comint to ease the sending and receiving -;; of commands and results from comint buffers. - -;; Note that the buffers in this file are analogous to sessions in -;; org-babel at large. - -;;; Code: -(require 'ob-core) -(require 'org-compat) -(require 'comint) - -(defun org-babel-comint-buffer-livep (buffer) - "Check if BUFFER is a comint buffer with a live process." - (let ((buffer (when buffer (get-buffer buffer)))) - (and buffer (buffer-live-p buffer) (get-buffer-process buffer) buffer))) - -(defmacro org-babel-comint-in-buffer (buffer &rest body) - "Check BUFFER and execute BODY. -BUFFER is checked with `org-babel-comint-buffer-livep'. BODY is -executed inside the protection of `save-excursion' and -`save-match-data'." - (declare (indent 1)) - `(progn - (unless (org-babel-comint-buffer-livep ,buffer) - (error "Buffer %s does not exist or has no process" ,buffer)) - (save-match-data - (with-current-buffer ,buffer - (save-excursion - (let ((comint-input-filter (lambda (_input) nil))) - ,@body)))))) -(def-edebug-spec org-babel-comint-in-buffer (form body)) - -(defmacro org-babel-comint-with-output (meta &rest body) - "Evaluate BODY in BUFFER and return process output. -Will wait until EOE-INDICATOR appears in the output, then return -all process output. If REMOVE-ECHO and FULL-BODY are present and -non-nil, then strip echo'd body from the returned output. META -should be a list containing the following where the last two -elements are optional. - - (BUFFER EOE-INDICATOR REMOVE-ECHO FULL-BODY) - -This macro ensures that the filter is removed in case of an error -or user `keyboard-quit' during execution of body." - (declare (indent 1)) - (let ((buffer (nth 0 meta)) - (eoe-indicator (nth 1 meta)) - (remove-echo (nth 2 meta)) - (full-body (nth 3 meta))) - `(org-babel-comint-in-buffer ,buffer - (let* ((string-buffer "") - (comint-output-filter-functions - (cons (lambda (text) (setq string-buffer (concat string-buffer text))) - comint-output-filter-functions)) - dangling-text) - ;; got located, and save dangling text - (goto-char (process-mark (get-buffer-process (current-buffer)))) - (let ((start (point)) - (end (point-max))) - (setq dangling-text (buffer-substring start end)) - (delete-region start end)) - ;; pass FULL-BODY to process - ,@body - ;; wait for end-of-evaluation indicator - (while (progn - (goto-char comint-last-input-end) - (not (save-excursion - (and (re-search-forward - (regexp-quote ,eoe-indicator) nil t) - (re-search-forward - comint-prompt-regexp nil t))))) - (accept-process-output (get-buffer-process (current-buffer))) - ;; thought the following this would allow async - ;; background running, but I was wrong... - ;; (run-with-timer .5 .5 'accept-process-output - ;; (get-buffer-process (current-buffer))) - ) - ;; replace cut dangling text - (goto-char (process-mark (get-buffer-process (current-buffer)))) - (insert dangling-text) - - ;; remove echo'd FULL-BODY from input - (when (and ,remove-echo ,full-body - (string-match - (replace-regexp-in-string - "\n" "[\r\n]+" (regexp-quote (or ,full-body ""))) - string-buffer)) - (setq string-buffer (substring string-buffer (match-end 0)))) - (split-string string-buffer comint-prompt-regexp))))) -(def-edebug-spec org-babel-comint-with-output (sexp body)) - -(defun org-babel-comint-input-command (buffer cmd) - "Pass CMD to BUFFER. -The input will not be echoed." - (org-babel-comint-in-buffer buffer - (goto-char (process-mark (get-buffer-process buffer))) - (insert cmd) - (comint-send-input) - (org-babel-comint-wait-for-output buffer))) - -(defun org-babel-comint-wait-for-output (buffer) - "Wait until output arrives from BUFFER. -Note: this is only safe when waiting for the result of a single -statement (not large blocks of code)." - (org-babel-comint-in-buffer buffer - (while (progn - (goto-char comint-last-input-end) - (not (and (re-search-forward comint-prompt-regexp nil t) - (goto-char (match-beginning 0)) - (string= (face-name (face-at-point)) - "comint-highlight-prompt")))) - (accept-process-output (get-buffer-process buffer))))) - -(defun org-babel-comint-eval-invisibly-and-wait-for-file - (buffer file string &optional period) - "Evaluate STRING in BUFFER invisibly. -Don't return until FILE exists. Code in STRING must ensure that -FILE exists at end of evaluation." - (unless (org-babel-comint-buffer-livep buffer) - (error "Buffer %s does not exist or has no process" buffer)) - (when (file-exists-p file) (delete-file file)) - (process-send-string - (get-buffer-process buffer) - (if (= (aref string (1- (length string))) ?\n) string (concat string "\n"))) - (while (not (file-exists-p file)) (sit-for (or period 0.25)))) - -(provide 'ob-comint) - - - -;;; ob-comint.el ends here diff --git a/elpa/org-9.3.6/ob-comint.elc b/elpa/org-9.3.6/ob-comint.elc deleted file mode 100644 index 40c1bc4e918406ea3a5d776b4faa5d53b3ca5a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5268 zcmd5={cqdI5w+vQz4Flep}?W}?Z(peL|simBt^+?&^D1R-x)~az;W(S*haG=R}x{0 zWJpT3``7o)a;cBXP41%wYM2y1c4v2H-@JLtXM>kVf7sgEGM+tqMn}ms4I>$-n=q!q zRQNf~WtN9YOis7usyDY`F(DB}l%z#C4gV<$yv|#OdU-Jka~i=4&2pJja370l=u?pR zd69+jIN!(HEH6j|fedIdihbB}4mWHB32ekkL4Fb!0*z@1q~#}p zq}r9+ZsV}`t{j^$_;6NlT->yKHM-2?hgq0ON`~mlzu6cU(^PQmreR!MlhZWn&wFh; znn?eK!V&e~otzBL2@584BO1;|BgCa#Vv54Kq%=!>ne+OZqgeN8er1?}9Em6tIW>5! zp%}`DN5oK8X~p91Db+6>uLoBg+s0hI-)ylT+w6q8f6DhZ-?u$=?JTa#7VOAgpDFukZEe5g>gD7EYJ-YfXqlthk+pTAL?fo?(sOZ#nBu2AXt)+z_HzToJfGEsUD~tnnq3T06aW5Ij;cRS; zl5A?_sr1R@OByD@J*Md~Rz15%gSm)iLSvIDas{@TEM{3;MUawN0mCih#}IscE5ZUx zRfG`@&IZ=$>*Ld-7Z+#eB+?X&m$NCxW!Y(;uVX3=8qDW9gDRs$rz1KaygK_~U=5DG zKV!hs$-9>?Ee0eBuuKYk!cPTdCS^oin`O37N&1td5hw>~lqFL&d^sXgOi!NZ)!^cV zkx!CYgtiiFgcvS3A4NlT8zoVc-16P+L}G0ABob&>+$M&MZe&pGXk%>&UcQ$PtSJdCaa9zX1;GffAr!xz}tR&z%YKoXXi0a zD(~^DP>tW-?&np~;}_t!(ZUAyZM3kvIC{Ik2VpqvejjHWyZ~Bo9Y@`wt%J4>xAk_v z*!=?6=;MG$To8$i{IU7k+5Hk{7oAV=+v)fD$72(2w~xQ88lNk=amf8>Zpq?XWPd3o zD#okZf2q})RB=KX7flL_49xj`jB`a2g}f`!DVN0uTDQjyeJuL=Q`NrN)P+(7XqEbn0M zPBm1%tPM}5F2(t5Sh@qR*baKLkpOuEv60C!Lvr;MQwB!3ov@TEi-5WGMAI*)AE=Hw zm<=kWwqE5FXJpdK!9OT*pu1b-1TttW?^2{j0+utu8pLa1ZZ^~dVFJ^%;CZ4O^E%pd z2jTk?&#SoVl=#V!T{`p&mj=aNBARP4Z!$k|Fgf9|HYn}zH;sg^0?mG-Sm@QLUBxx3 zUH+oz1d+g~$I9**-HJDa!Pynnac>UTXgv>mR!lD{<&3FaqwGeaF zbPjdZv^&n>|Eg@RGTF~6oH+wwwQzP1=#79zIeK+WMWRb)3ydyN_PF@oa*5=<1S$;I zB^j)1Ep+^($YP`el2fjP^-It0D0yW+V)fejoRzH75Ia{acUi1=Xq9k5iArNV*~68C zMxflU(XyL8`k*>EiiSH+@j`L%0FX?ktP{L&NUdn+9I%tayx?* z2LfR^zKVIoN`jJ^Hp>aiBxWMb;n!3F9mT7scMP6K zKQ7gj<`t1;*wJ8n%Sxuy6)od6DD2M=2+#%iPvYnvighGQ65ye@>|->gAs{Gb5!53D z1Lb%TNdu%?DD46s1UMs+jU^4E#J_>H5wbIo%{8EY0;K=u-AZg-wXrH;$_m$ew18=s zVY=7?C~yLr3Z@+eQ?G>S_9{%fPk*bxiRL}56LbO&o8_|CLn;93j?+Pl^439SI4%MC zkPVL8{u{qIMmtszPIqUIcZ9tB4sCr5*?NK3OV5KOwz=|a`_f;qUHN}Wg3UUqN+ON8 z#^8es#42A2R7REyRMSD5gyTtsLsd)^)EYfpKsWR1nhta|a1XjwlJpLjTa~vL=cli~ zTiL9H@jT4KVFZPHoWzYnZ#4A&V&QH%i#qewrw4rBif#$76KBy4xMTRJLEZvcH9g{C(uVPWS9AzE$x0;46!ki7En>)=~_sRm>({$mX&D iZIhQ=OYN59EkV@j_8ewfmR)oHT+&eAt){GPjeh}UKz8T= diff --git a/elpa/org-9.3.6/ob-coq.el b/elpa/org-9.3.6/ob-coq.el deleted file mode 100644 index 56a57cdf..00000000 --- a/elpa/org-9.3.6/ob-coq.el +++ /dev/null @@ -1,78 +0,0 @@ -;;; ob-coq.el --- Babel Functions for Coq -*- lexical-binding: t; -*- - -;; Copyright (C) 2010-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Rudimentary support for evaluating Coq code blocks. Currently only -;; session evaluation is supported. Requires both coq.el and -;; coq-inferior.el, both of which are distributed with Coq. -;; -;; http://coq.inria.fr/ - -;;; Code: -(require 'ob) - -(declare-function run-coq "ext:coq-inferior.el" (cmd)) -(declare-function coq-proc "ext:coq-inferior.el" ()) - -(defvar coq-program-name "coqtop" - "Name of the coq toplevel to run.") - -(defvar org-babel-coq-buffer "*coq*" - "Buffer in which to evaluate coq code blocks.") - -(defun org-babel-coq-clean-prompt (string) - (if (string-match "^[^[:space:]]+ < " string) - (substring string 0 (match-beginning 0)) - string)) - -(defun org-babel-execute:coq (body params) - (let ((full-body (org-babel-expand-body:generic body params)) - (session (org-babel-coq-initiate-session)) - (pt (lambda () - (marker-position - (process-mark (get-buffer-process (current-buffer))))))) - (org-babel-coq-clean-prompt - (org-babel-comint-in-buffer session - (let ((start (funcall pt))) - (with-temp-buffer - (insert full-body) - (comint-send-region (coq-proc) (point-min) (point-max)) - (comint-send-string (coq-proc) - (if (string= (buffer-substring (- (point-max) 1) (point-max)) ".") - "\n" - ".\n"))) - (while (equal start (funcall pt)) (sleep-for 0.1)) - (buffer-substring start (funcall pt))))))) - -(defun org-babel-coq-initiate-session () - "Initiate a coq session. -If there is not a current inferior-process-buffer in SESSION then -create one. Return the initialized session." - (unless (fboundp 'run-coq) - (error "`run-coq' not defined, load coq-inferior.el")) - (save-window-excursion (run-coq coq-program-name)) - (sit-for 0.1) - (get-buffer org-babel-coq-buffer)) - -(provide 'ob-coq) diff --git a/elpa/org-9.3.6/ob-coq.elc b/elpa/org-9.3.6/ob-coq.elc deleted file mode 100644 index 84d9fc71255f4ce2b1c9d8734440e4921dd1a959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2286 zcmbtVU2oeq6wTVMSPkrH58K;rlnza@$dD+1w8UqwOSDZyCRK`d z`tj#?E+wZ)*Y2eTBugTB@41KP9-ch;37m&xbAks;EScMX^tqgu2oINTO(IGr^4p7ciJrKBaFJ* zlPn5V&}EkNL03HZPmIDMhOwSgZ2jW zXg!~U0+4#K)cKNQsf{ex(l<$RTPT{9Hb1YgB(QD~&*V&%F{hd}F``4f9By;;lVQk_ z_6gO@4UJzsAD#Yw(4ds1mNja-7AG&2Gz@%IdD=S@{UJq@EJ<*sHzv_UB-yt+6OpF) zAi}>8y{Gs*U>{|4v`3@73xKV=Q_!xl|?i!hOg zvvVE>`mB#)Q5#lF!w%h|_Y*M?Umb-zGr{|l+m$vx)}~tf81{gUr4JHNZz?oyJhR2y z{pHfbigS;6XEkcL5(I5qSqFBelwIqdhI^yS zDG9J;CWhN_bo%VC7YET4RDfzG)u@ZhR;EL*Ru!6=bsdl}t^GULZvXRcjt5_y6V-kB4!=whwz&jg6G9cWBFamaqOQQ$| z5!yO!+L}Xr6V@Cw3t=BHk2Z=(?r{93?>;&Yu8R56zvnZ%Hbuo}3ETQs)Bm*Z_X3kR zVYE@jQ8-n@er_4Px# diff --git a/elpa/org-9.3.6/ob-core.el b/elpa/org-9.3.6/ob-core.el deleted file mode 100644 index a6368ad8..00000000 --- a/elpa/org-9.3.6/ob-core.el +++ /dev/null @@ -1,3162 +0,0 @@ -;;; ob-core.el --- Working with Code Blocks -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2020 Free Software Foundation, Inc. - -;; Authors: Eric Schulte -;; Dan Davison -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Code: -(require 'cl-lib) -(require 'ob-eval) -(require 'org-macs) -(require 'org-compat) - -(defconst org-babel-exeext - (if (memq system-type '(windows-nt cygwin)) - ".exe" - nil)) - -(defvar org-babel-library-of-babel) -(defvar org-edit-src-content-indentation) -(defvar org-link-file-path-type) -(defvar org-src-lang-modes) -(defvar org-src-preserve-indentation) - -(declare-function org-at-item-p "org-list" ()) -(declare-function org-at-table-p "org" (&optional table-type)) -(declare-function org-babel-lob-execute-maybe "ob-lob" ()) -(declare-function org-babel-ref-goto-headline-id "ob-ref" (id)) -(declare-function org-babel-ref-headline-body "ob-ref" ()) -(declare-function org-babel-ref-parse "ob-ref" (assignment)) -(declare-function org-babel-ref-resolve "ob-ref" (ref)) -(declare-function org-babel-ref-split-args "ob-ref" (arg-string)) -(declare-function org-babel-tangle-comment-links "ob-tangle" (&optional info)) -(declare-function org-current-level "org" ()) -(declare-function org-cycle "org" (&optional arg)) -(declare-function org-edit-src-code "org-src" (&optional code edit-buffer-name)) -(declare-function org-edit-src-exit "org-src" ()) -(declare-function org-element-at-point "org-element" ()) -(declare-function org-element-context "org-element" (&optional element)) -(declare-function org-element-normalize-string "org-element" (s)) -(declare-function org-element-property "org-element" (property element)) -(declare-function org-element-type "org-element" (element)) -(declare-function org-entry-get "org" (pom property &optional inherit literal-nil)) -(declare-function org-escape-code-in-region "org-src" (beg end)) -(declare-function org-in-commented-heading-p "org" (&optional no-inheritance)) -(declare-function org-indent-line "org" ()) -(declare-function org-list-get-list-end "org-list" (item struct prevs)) -(declare-function org-list-prevs-alist "org-list" (struct)) -(declare-function org-list-struct "org-list" ()) -(declare-function org-list-to-generic "org-list" (LIST PARAMS)) -(declare-function org-list-to-lisp "org-list" (&optional delete)) -(declare-function org-macro-escape-arguments "org-macro" (&rest args)) -(declare-function org-make-options-regexp "org" (kwds &optional extra)) -(declare-function org-mark-ring-push "org" (&optional pos buffer)) -(declare-function org-narrow-to-subtree "org" ()) -(declare-function org-next-block "org" (arg &optional backward block-regexp)) -(declare-function org-open-at-point "org" (&optional in-emacs reference-buffer)) -(declare-function org-previous-block "org" (arg &optional block-regexp)) -(declare-function org-show-context "org" (&optional key)) -(declare-function org-src-coderef-format "org-src" (&optional element)) -(declare-function org-src-coderef-regexp "org-src" (fmt &optional label)) -(declare-function org-src-get-lang-mode "org-src" (lang)) -(declare-function org-table-align "org-table" ()) -(declare-function org-table-end "org-table" (&optional table-type)) -(declare-function org-table-import "org-table" (file arg)) -(declare-function org-table-to-lisp "org-table" (&optional txt)) -(declare-function org-unescape-code-in-string "org-src" (s)) -(declare-function orgtbl-to-generic "org-table" (table params)) -(declare-function orgtbl-to-orgtbl "org-table" (table params)) -(declare-function tramp-compat-make-temp-file "tramp-compat" (filename &optional dir-flag)) - -(defgroup org-babel nil - "Code block evaluation and management in `org-mode' documents." - :tag "Babel" - :group 'org) - -(defcustom org-confirm-babel-evaluate t - "Confirm before evaluation. -\\\ -Require confirmation before interactively evaluating code -blocks in Org buffers. The default value of this variable is t, -meaning confirmation is required for any code block evaluation. -This variable can be set to nil to inhibit any future -confirmation requests. This variable can also be set to a -function which takes two arguments the language of the code block -and the body of the code block. Such a function should then -return a non-nil value if the user should be prompted for -execution or nil if no prompt is required. - -Warning: Disabling confirmation may result in accidental -evaluation of potentially harmful code. It may be advisable -remove code block execution from `\\[org-ctrl-c-ctrl-c]' \ -as further protection -against accidental code block evaluation. The -`org-babel-no-eval-on-ctrl-c-ctrl-c' variable can be used to -remove code block execution from the `\\[org-ctrl-c-ctrl-c]' keybinding." - :group 'org-babel - :version "24.1" - :type '(choice boolean function)) -;; don't allow this variable to be changed through file settings -(put 'org-confirm-babel-evaluate 'safe-local-variable (lambda (x) (eq x t))) - -(defcustom org-babel-no-eval-on-ctrl-c-ctrl-c nil - "\\\ -Remove code block evaluation from the `\\[org-ctrl-c-ctrl-c]' key binding." - :group 'org-babel - :version "24.1" - :type 'boolean) - -(defcustom org-babel-results-keyword "RESULTS" - "Keyword used to name results generated by code blocks. -It should be \"RESULTS\". However any capitalization may be -used." - :group 'org-babel - :version "24.4" - :package-version '(Org . "8.0") - :type 'string - :safe (lambda (v) - (and (stringp v) - (eq (compare-strings "RESULTS" nil nil v nil nil t) - t)))) - -(defcustom org-babel-noweb-wrap-start "<<" - "String used to begin a noweb reference in a code block. -See also `org-babel-noweb-wrap-end'." - :group 'org-babel - :type 'string) - -(defcustom org-babel-noweb-wrap-end ">>" - "String used to end a noweb reference in a code block. -See also `org-babel-noweb-wrap-start'." - :group 'org-babel - :type 'string) - -(defcustom org-babel-inline-result-wrap "=%s=" - "Format string used to wrap inline results. -This string must include a \"%s\" which will be replaced by the results." - :group 'org-babel - :type 'string) -(put 'org-babel-inline-result-wrap - 'safe-local-variable - (lambda (value) - (and (stringp value) - (string-match-p "%s" value)))) - -(defcustom org-babel-hash-show-time nil - "Non-nil means show the time the code block was evaluated in the result hash." - :group 'org-babel - :type 'boolean - :version "26.1" - :package-version '(Org . "9.0") - :safe #'booleanp) - -(defcustom org-babel-uppercase-example-markers nil - "When non-nil, begin/end example markers will be inserted in upper case." - :group 'org-babel - :type 'boolean - :version "26.1" - :package-version '(Org . "9.1") - :safe #'booleanp) - -(defun org-babel-noweb-wrap (&optional regexp) - "Return regexp matching a Noweb reference. - -Match any reference, or only those matching REGEXP, if non-nil. - -When matching, reference is stored in match group 1." - (concat (regexp-quote org-babel-noweb-wrap-start) - (or regexp "\\([^ \t\n]\\(?:.*?[^ \t\n]\\)?\\)") - (regexp-quote org-babel-noweb-wrap-end))) - -(defvar org-babel-src-name-regexp - "^[ \t]*#\\+name:[ \t]*" - "Regular expression used to match a source name line.") - -(defvar org-babel-multi-line-header-regexp - "^[ \t]*#\\+headers?:[ \t]*\\([^\n]*\\)$" - "Regular expression used to match multi-line header arguments.") - -(defvar org-babel-src-block-regexp - (concat - ;; (1) indentation (2) lang - "^\\([ \t]*\\)#\\+begin_src[ \t]+\\([^ \f\t\n\r\v]+\\)[ \t]*" - ;; (3) switches - "\\([^\":\n]*\"[^\"\n*]*\"[^\":\n]*\\|[^\":\n]*\\)" - ;; (4) header arguments - "\\([^\n]*\\)\n" - ;; (5) body - "\\([^\000]*?\n\\)??[ \t]*#\\+end_src") - "Regexp used to identify code blocks.") - -(defun org-babel--get-vars (params) - "Return the babel variable assignments in PARAMS. - -PARAMS is a quasi-alist of header args, which may contain -multiple entries for the key `:var'. This function returns a -list of the cdr of all the `:var' entries." - (mapcar #'cdr - (cl-remove-if-not (lambda (x) (eq (car x) :var)) params))) - -(defvar org-babel-exp-reference-buffer nil - "Buffer containing original contents of the exported buffer. -This is used by Babel to resolve references in source blocks. -Its value is dynamically bound during export.") - -(defun org-babel-check-confirm-evaluate (info) - "Check whether INFO allows code block evaluation. - -Returns nil if evaluation is disallowed, t if it is -unconditionally allowed, and the symbol `query' if the user -should be asked whether to allow evaluation." - (let* ((headers (nth 2 info)) - (eval (or (cdr (assq :eval headers)) - (when (assq :noeval headers) "no"))) - (eval-no (member eval '("no" "never"))) - (export org-babel-exp-reference-buffer) - (eval-no-export (and export (member eval '("no-export" "never-export")))) - (noeval (or eval-no eval-no-export)) - (query (or (equal eval "query") - (and export (equal eval "query-export")) - (if (functionp org-confirm-babel-evaluate) - (funcall org-confirm-babel-evaluate - ;; Language, code block body. - (nth 0 info) (nth 1 info)) - org-confirm-babel-evaluate)))) - (cond - (noeval nil) - (query 'query) - (t t)))) - -(defun org-babel-check-evaluate (info) - "Check if code block INFO should be evaluated. -Do not query the user, but do display an informative message if -evaluation is blocked. Returns non-nil if evaluation is not blocked." - (let ((confirmed (org-babel-check-confirm-evaluate info))) - (unless confirmed - (message "Evaluation of this %s code block%sis disabled." - (nth 0 info) - (let ((name (nth 4 info))) - (if name (format " (%s) " name) " ")))) - confirmed)) - -;; Dynamically scoped for asynchronous export. -(defvar org-babel-confirm-evaluate-answer-no) - -(defun org-babel-confirm-evaluate (info) - "Confirm evaluation of the code block INFO. - -This query can also be suppressed by setting the value of -`org-confirm-babel-evaluate' to nil, in which case all future -interactive code block evaluations will proceed without any -confirmation from the user. - -Note disabling confirmation may result in accidental evaluation -of potentially harmful code. - -The variable `org-babel-confirm-evaluate-answer-no' is used by -the async export process, which requires a non-interactive -environment, to override this check." - (let* ((evalp (org-babel-check-confirm-evaluate info)) - (lang (nth 0 info)) - (name (nth 4 info)) - (name-string (if name (format " (%s) " name) " "))) - (pcase evalp - (`nil nil) - (`t t) - (`query (or - (and (not (bound-and-true-p - org-babel-confirm-evaluate-answer-no)) - (yes-or-no-p - (format "Evaluate this %s code block%son your system? " - lang name-string))) - (progn - (message "Evaluation of this %s code block%sis aborted." - lang name-string) - nil))) - (x (error "Unexpected value `%s' from `org-babel-check-confirm-evaluate'" x))))) - -;;;###autoload -(defun org-babel-execute-safely-maybe () - (unless org-babel-no-eval-on-ctrl-c-ctrl-c - (org-babel-execute-maybe))) - -;;;###autoload -(defun org-babel-execute-maybe () - (interactive) - (or (org-babel-execute-src-block-maybe) - (org-babel-lob-execute-maybe))) - -(defmacro org-babel-when-in-src-block (&rest body) - "Execute BODY if point is in a source block and return t. - -Otherwise do nothing and return nil." - `(if (memq (org-element-type (org-element-context)) - '(inline-src-block src-block)) - (progn - ,@body - t) - nil)) - -(defun org-babel-execute-src-block-maybe () - "Conditionally execute a source block. -Detect if this is context for a Babel src-block and if so -then run `org-babel-execute-src-block'." - (interactive) - (org-babel-when-in-src-block - (org-babel-eval-wipe-error-buffer) - (org-babel-execute-src-block current-prefix-arg))) - -;;;###autoload -(defun org-babel-view-src-block-info () - "Display information on the current source block. -This includes header arguments, language and name, and is largely -a window into the `org-babel-get-src-block-info' function." - (interactive) - (let ((info (org-babel-get-src-block-info 'light)) - (full (lambda (it) (> (length it) 0))) - (printf (lambda (fmt &rest args) (princ (apply #'format fmt args))))) - (when info - (with-help-window (help-buffer) - (let ((name (nth 4 info)) - (lang (nth 0 info)) - (switches (nth 3 info)) - (header-args (nth 2 info))) - (when name (funcall printf "Name: %s\n" name)) - (when lang (funcall printf "Lang: %s\n" lang)) - (funcall printf "Properties:\n") - (funcall printf "\t:header-args \t%s\n" (org-entry-get (point) "header-args" t)) - (funcall printf "\t:header-args:%s \t%s\n" lang (org-entry-get (point) (concat "header-args:" lang) t)) - - (when (funcall full switches) (funcall printf "Switches: %s\n" switches)) - (funcall printf "Header Arguments:\n") - (dolist (pair (sort header-args - (lambda (a b) (string< (symbol-name (car a)) - (symbol-name (car b)))))) - (when (funcall full (format "%s" (cdr pair))) - (funcall printf "\t%S%s\t%s\n" - (car pair) - (if (> (length (format "%S" (car pair))) 7) "" "\t") - (cdr pair))))))))) - -;;;###autoload -(defun org-babel-expand-src-block-maybe () - "Conditionally expand a source block. -Detect if this is context for an org-babel src-block and if so -then run `org-babel-expand-src-block'." - (interactive) - (org-babel-when-in-src-block - (org-babel-expand-src-block current-prefix-arg))) - -;;;###autoload -(defun org-babel-load-in-session-maybe () - "Conditionally load a source block in a session. -Detect if this is context for an org-babel src-block and if so -then run `org-babel-load-in-session'." - (interactive) - (org-babel-when-in-src-block - (org-babel-load-in-session current-prefix-arg))) - -(add-hook 'org-metaup-hook 'org-babel-load-in-session-maybe) - -;;;###autoload -(defun org-babel-pop-to-session-maybe () - "Conditionally pop to a session. -Detect if this is context for an org-babel src-block and if so -then run `org-babel-switch-to-session'." - (interactive) - (org-babel-when-in-src-block - (org-babel-switch-to-session current-prefix-arg))) - -(add-hook 'org-metadown-hook 'org-babel-pop-to-session-maybe) - -(defconst org-babel-common-header-args-w-values - '((cache . ((no yes))) - (cmdline . :any) - (colnames . ((nil no yes))) - (comments . ((no link yes org both noweb))) - (dir . :any) - (eval . ((yes no no-export strip-export never-export eval never - query))) - (exports . ((code results both none))) - (epilogue . :any) - (file . :any) - (file-desc . :any) - (file-ext . :any) - (hlines . ((no yes))) - (mkdirp . ((yes no))) - (no-expand) - (noeval) - (noweb . ((yes no tangle no-export strip-export))) - (noweb-ref . :any) - (noweb-sep . :any) - (output-dir . :any) - (padline . ((yes no))) - (post . :any) - (prologue . :any) - (results . ((file list vector table scalar verbatim) - (raw html latex org code pp drawer link graphics) - (replace silent none append prepend) - (output value))) - (rownames . ((no yes))) - (sep . :any) - (session . :any) - (shebang . :any) - (tangle . ((tangle yes no :any))) - (tangle-mode . ((#o755 #o555 #o444 :any))) - (var . :any) - (wrap . :any))) - -(defconst org-babel-header-arg-names - (mapcar #'car org-babel-common-header-args-w-values) - "Common header arguments used by org-babel. -Note that individual languages may define their own language -specific header arguments as well.") - -(defconst org-babel-safe-header-args - '(:cache :colnames :comments :exports :epilogue :hlines :noeval - :noweb :noweb-ref :noweb-sep :padline :prologue :rownames - :sep :session :tangle :wrap - (:eval . ("never" "query")) - (:results . (lambda (str) (not (string-match "file" str))))) - "A list of safe header arguments for babel source blocks. - -The list can have entries of the following forms: -- :ARG -> :ARG is always a safe header arg -- (:ARG . (VAL1 VAL2 ...)) -> :ARG is safe as a header arg if it is - `equal' to one of the VALs. -- (:ARG . FN) -> :ARG is safe as a header arg if the function FN - returns non-nil. FN is passed one - argument, the value of the header arg - (as a string).") - -(defmacro org-babel-header-args-safe-fn (safe-list) - "Return a function that determines whether a list of header args are safe. - -Intended usage is: -\(put \\='org-babel-default-header-args \\='safe-local-variable - (org-babel-header-args-safe-p org-babel-safe-header-args) - -This allows org-babel languages to extend the list of safe values for -their `org-babel-default-header-args:foo' variable. - -For the format of SAFE-LIST, see `org-babel-safe-header-args'." - `(lambda (value) - (and (listp value) - (cl-every - (lambda (pair) - (and (consp pair) - (org-babel-one-header-arg-safe-p pair ,safe-list))) - value)))) - -(defvar org-babel-default-header-args - '((:session . "none") (:results . "replace") (:exports . "code") - (:cache . "no") (:noweb . "no") (:hlines . "no") (:tangle . "no")) - "Default arguments to use when evaluating a source block.") -(put 'org-babel-default-header-args 'safe-local-variable - (org-babel-header-args-safe-fn org-babel-safe-header-args)) - -(defvar org-babel-default-inline-header-args - '((:session . "none") (:results . "replace") - (:exports . "results") (:hlines . "yes")) - "Default arguments to use when evaluating an inline source block.") -(put 'org-babel-default-inline-header-args 'safe-local-variable - (org-babel-header-args-safe-fn org-babel-safe-header-args)) - -(defconst org-babel-name-regexp - (format "^[ \t]*#\\+%s:[ \t]*" - ;; FIXME: TBLNAME is for backward compatibility. - (regexp-opt '("NAME" "TBLNAME"))) - "Regexp matching a NAME keyword.") - -(defconst org-babel-result-regexp - (format "^[ \t]*#\\+%s\\(?:\\[\\(?:%s \\)?\\([[:alnum:]]+\\)\\]\\)?:[ \t]*" - org-babel-results-keyword - ;; <%Y-%m-%d %H:%M:%S> - "<\\(?:[0-9]\\{4\\}-[0-1][0-9]-[0-3][0-9] \ -[0-2][0-9]\\(?::[0-5][0-9]\\)\\{2\\}\\)>") - "Regular expression used to match result lines. -If the results are associated with a hash key then the hash will -be saved in match group 1.") - -(defconst org-babel-result-w-name-regexp - (concat org-babel-result-regexp "\\(?9:[^ \t\n\r\v\f]+\\)") - "Regexp matching a RESULTS keyword with a name. -Name is saved in match group 9.") - -(defvar org-babel-min-lines-for-block-output 10 - "The minimum number of lines for block output. -If number of lines of output is equal to or exceeds this -value, the output is placed in a #+begin_example...#+end_example -block. Otherwise the output is marked as literal by inserting -colons at the starts of the lines. This variable only takes -effect if the :results output option is in effect.") - -(defvar org-babel-noweb-error-all-langs nil - "Raise errors when noweb references don't resolve. -Also see `org-babel-noweb-error-langs' to control noweb errors on -a language by language bases.") - -(defvar org-babel-noweb-error-langs nil - "Languages for which Babel will raise literate programming errors. -List of languages for which errors should be raised when the -source code block satisfying a noweb reference in this language -can not be resolved. Also see `org-babel-noweb-error-all-langs' -to raise errors for all languages.") - -(defvar org-babel-hash-show 4 - "Number of initial characters to show of a hidden results hash.") - -(defvar org-babel-after-execute-hook nil - "Hook for functions to be called after `org-babel-execute-src-block'") - -(defun org-babel-named-src-block-regexp-for-name (&optional name) - "Generate a regexp used to match a source block named NAME. -If NAME is nil, match any name. Matched name is then put in -match group 9. Other match groups are defined in -`org-babel-src-block-regexp'." - (concat org-babel-src-name-regexp - (concat (if name (regexp-quote name) "\\(?9:.*?\\)") "[ \t]*" ) - "\\(?:\n[ \t]*#\\+\\S-+:.*\\)*?" - "\n" - (substring org-babel-src-block-regexp 1))) - -(defun org-babel-named-data-regexp-for-name (name) - "Generate a regexp used to match data named NAME." - (concat org-babel-name-regexp (regexp-quote name) "[ \t]*$")) - -(defun org-babel--normalize-body (datum) - "Normalize body for element or object DATUM. -DATUM is a source block element or an inline source block object. -Remove final newline character and spurious indentation." - (let* ((value (org-element-property :value datum)) - (body (if (string-suffix-p "\n" value) - (substring value 0 -1) - value))) - (cond ((eq (org-element-type datum) 'inline-src-block) - ;; Newline characters and indentation in an inline - ;; src-block are not meaningful, since they could come from - ;; some paragraph filling. Treat them as a white space. - (replace-regexp-in-string "\n[ \t]*" " " body)) - ((or org-src-preserve-indentation - (org-element-property :preserve-indent datum)) - body) - (t (org-remove-indentation body))))) - -;;; functions -(defvar org-babel-current-src-block-location nil - "Marker pointing to the source block currently being executed. -This may also point to a call line or an inline code block. If -multiple blocks are being executed (e.g., in chained execution -through use of the :var header argument) this marker points to -the outer-most code block.") - -(defvar *this*) - -(defun org-babel-get-src-block-info (&optional light datum) - "Extract information from a source block or inline source block. - -When optional argument LIGHT is non-nil, Babel does not resolve -remote variable references; a process which could likely result -in the execution of other code blocks, and do not evaluate Lisp -values in parameters. - -By default, consider the block at point. However, when optional -argument DATUM is provided, extract information from that parsed -object instead. - -Return nil if point is not on a source block. Otherwise, return -a list with the following pattern: - - (language body arguments switches name start coderef)" - (let* ((datum (or datum (org-element-context))) - (type (org-element-type datum)) - (inline (eq type 'inline-src-block))) - (when (memq type '(inline-src-block src-block)) - (let* ((lang (org-element-property :language datum)) - (lang-headers (intern - (concat "org-babel-default-header-args:" lang))) - (name (org-element-property :name datum)) - (info - (list - lang - (org-babel--normalize-body datum) - (apply #'org-babel-merge-params - (if inline org-babel-default-inline-header-args - org-babel-default-header-args) - (and (boundp lang-headers) (eval lang-headers t)) - (append - ;; If DATUM is provided, make sure we get node - ;; properties applicable to its location within - ;; the document. - (org-with-point-at (org-element-property :begin datum) - (org-babel-params-from-properties lang light)) - (mapcar (lambda (h) - (org-babel-parse-header-arguments h light)) - (cons (org-element-property :parameters datum) - (org-element-property :header datum))))) - (or (org-element-property :switches datum) "") - name - (org-element-property (if inline :begin :post-affiliated) - datum) - (and (not inline) (org-src-coderef-format datum))))) - (unless light - (setf (nth 2 info) (org-babel-process-params (nth 2 info)))) - (setf (nth 2 info) (org-babel-generate-file-param name (nth 2 info))) - info)))) - -;;;###autoload -(defun org-babel-execute-src-block (&optional arg info params) - "Execute the current source code block. -Insert the results of execution into the buffer. Source code -execution and the collection and formatting of results can be -controlled through a variety of header arguments. - -With prefix argument ARG, force re-execution even if an existing -result cached in the buffer would otherwise have been returned. - -Optionally supply a value for INFO in the form returned by -`org-babel-get-src-block-info'. - -Optionally supply a value for PARAMS which will be merged with -the header arguments specified at the front of the source code -block." - (interactive) - (let* ((org-babel-current-src-block-location - (or org-babel-current-src-block-location - (nth 5 info) - (org-babel-where-is-src-block-head))) - (info (if info (copy-tree info) (org-babel-get-src-block-info)))) - ;; Merge PARAMS with INFO before considering source block - ;; evaluation since both could disagree. - (cl-callf org-babel-merge-params (nth 2 info) params) - (when (org-babel-check-evaluate info) - (cl-callf org-babel-process-params (nth 2 info)) - (let* ((params (nth 2 info)) - (cache (let ((c (cdr (assq :cache params)))) - (and (not arg) c (string= "yes" c)))) - (new-hash (and cache (org-babel-sha1-hash info :eval))) - (old-hash (and cache (org-babel-current-result-hash))) - (current-cache (and new-hash (equal new-hash old-hash)))) - (cond - (current-cache - (save-excursion ;Return cached result. - (goto-char (org-babel-where-is-src-block-result nil info)) - (forward-line) - (skip-chars-forward " \t") - (let ((result (org-babel-read-result))) - (message (replace-regexp-in-string "%" "%%" (format "%S" result))) - result))) - ((org-babel-confirm-evaluate info) - (let* ((lang (nth 0 info)) - (result-params (cdr (assq :result-params params))) - ;; Expand noweb references in BODY and remove any - ;; coderef. - (body - (let ((coderef (nth 6 info)) - (expand - (if (org-babel-noweb-p params :eval) - (org-babel-expand-noweb-references info) - (nth 1 info)))) - (if (not coderef) expand - (replace-regexp-in-string - (org-src-coderef-regexp coderef) "" expand nil nil 1)))) - (dir (cdr (assq :dir params))) - (mkdirp (cdr (assq :mkdirp params))) - (default-directory - (cond - ((not dir) default-directory) - ((member mkdirp '("no" "nil" nil)) - (file-name-as-directory (expand-file-name dir))) - (t - (let ((d (file-name-as-directory (expand-file-name dir)))) - (make-directory d 'parents) - d)))) - (cmd (intern (concat "org-babel-execute:" lang))) - result) - (unless (fboundp cmd) - (error "No org-babel-execute function for %s!" lang)) - (message "executing %s code block%s..." - (capitalize lang) - (let ((name (nth 4 info))) - (if name (format " (%s)" name) ""))) - (if (member "none" result-params) - (progn (funcall cmd body params) - (message "result silenced")) - (setq result - (let ((r (funcall cmd body params))) - (if (and (eq (cdr (assq :result-type params)) 'value) - (or (member "vector" result-params) - (member "table" result-params)) - (not (listp r))) - (list (list r)) - r))) - (let ((file (and (member "file" result-params) - (cdr (assq :file params))))) - ;; If non-empty result and :file then write to :file. - (when file - ;; If `:results' are special types like `link' or - ;; `graphics', don't write result to `:file'. Only - ;; insert a link to `:file'. - (when (and result - (not (or (member "link" result-params) - (member "graphics" result-params)))) - (with-temp-file file - (insert (org-babel-format-result - result - (cdr (assq :sep params)))))) - (setq result file)) - ;; Possibly perform post process provided its - ;; appropriate. Dynamically bind "*this*" to the - ;; actual results of the block. - (let ((post (cdr (assq :post params)))) - (when post - (let ((*this* (if (not file) result - (org-babel-result-to-file - file - (let ((desc (assq :file-desc params))) - (and desc (or (cdr desc) result))))))) - (setq result (org-babel-ref-resolve post)) - (when file - (setq result-params (remove "file" result-params)))))) - (org-babel-insert-result - result result-params info new-hash lang))) - (run-hooks 'org-babel-after-execute-hook) - result))))))) - -(defun org-babel-expand-body:generic (body params &optional var-lines) - "Expand BODY with PARAMS. -Expand a block of code with org-babel according to its header -arguments. This generic implementation of body expansion is -called for languages which have not defined their own specific -org-babel-expand-body:lang function." - (let ((pro (cdr (assq :prologue params))) - (epi (cdr (assq :epilogue params)))) - (mapconcat #'identity - (append (when pro (list pro)) - var-lines - (list body) - (when epi (list epi))) - "\n"))) - -;;;###autoload -(defun org-babel-expand-src-block (&optional _arg info params) - "Expand the current source code block. -Expand according to the source code block's header -arguments and pop open the results in a preview buffer." - (interactive) - (let* ((info (or info (org-babel-get-src-block-info))) - (lang (nth 0 info)) - (params (setf (nth 2 info) - (sort (org-babel-merge-params (nth 2 info) params) - (lambda (el1 el2) (string< (symbol-name (car el1)) - (symbol-name (car el2))))))) - (body (setf (nth 1 info) - (if (org-babel-noweb-p params :eval) - (org-babel-expand-noweb-references info) (nth 1 info)))) - (expand-cmd (intern (concat "org-babel-expand-body:" lang))) - (assignments-cmd (intern (concat "org-babel-variable-assignments:" - lang))) - (expanded - (if (fboundp expand-cmd) (funcall expand-cmd body params) - (org-babel-expand-body:generic - body params (and (fboundp assignments-cmd) - (funcall assignments-cmd params)))))) - (if (called-interactively-p 'any) - (org-edit-src-code - expanded (concat "*Org-Babel Preview " (buffer-name) "[ " lang " ]*")) - expanded))) - -(defun org-babel-edit-distance (s1 s2) - "Return the edit (levenshtein) distance between strings S1 S2." - (let* ((l1 (length s1)) - (l2 (length s2)) - (dist (vconcat (mapcar (lambda (_) (make-vector (1+ l2) nil)) - (number-sequence 1 (1+ l1))))) - (in (lambda (i j) (aref (aref dist i) j)))) - (setf (aref (aref dist 0) 0) 0) - (dolist (j (number-sequence 1 l2)) - (setf (aref (aref dist 0) j) j)) - (dolist (i (number-sequence 1 l1)) - (setf (aref (aref dist i) 0) i) - (dolist (j (number-sequence 1 l2)) - (setf (aref (aref dist i) j) - (min - (1+ (funcall in (1- i) j)) - (1+ (funcall in i (1- j))) - (+ (if (equal (aref s1 (1- i)) (aref s2 (1- j))) 0 1) - (funcall in (1- i) (1- j))))))) - (funcall in l1 l2))) - -(defun org-babel-combine-header-arg-lists (original &rest others) - "Combine a number of lists of header argument names and arguments." - (let ((results (copy-sequence original))) - (dolist (new-list others) - (dolist (arg-pair new-list) - (let ((header (car arg-pair))) - (setq results - (cons arg-pair (cl-remove-if - (lambda (pair) (equal header (car pair))) - results)))))) - results)) - -;;;###autoload -(defun org-babel-check-src-block () - "Check for misspelled header arguments in the current code block." - (interactive) - ;; TODO: report malformed code block - ;; TODO: report incompatible combinations of header arguments - ;; TODO: report uninitialized variables - (let ((too-close 2) ;; <- control closeness to report potential match - (names (mapcar #'symbol-name org-babel-header-arg-names))) - (dolist (header (mapcar (lambda (arg) (substring (symbol-name (car arg)) 1)) - (and (org-babel-where-is-src-block-head) - (org-babel-parse-header-arguments - (org-no-properties - (match-string 4)))))) - (dolist (name names) - (when (and (not (string= header name)) - (<= (org-babel-edit-distance header name) too-close) - (not (member header names))) - (error "Supplied header \"%S\" is suspiciously close to \"%S\"" - header name)))) - (message "No suspicious header arguments found."))) - -;;;###autoload -(defun org-babel-insert-header-arg (&optional header-arg value) - "Insert a header argument selecting from lists of common args and values." - (interactive) - (let* ((info (org-babel-get-src-block-info 'light)) - (lang (car info)) - (begin (nth 5 info)) - (lang-headers (intern (concat "org-babel-header-args:" lang))) - (headers (org-babel-combine-header-arg-lists - org-babel-common-header-args-w-values - (when (boundp lang-headers) (eval lang-headers t)))) - (header-arg (or header-arg - (completing-read - "Header Arg: " - (mapcar - (lambda (header-spec) (symbol-name (car header-spec))) - headers)))) - (vals (cdr (assoc (intern header-arg) headers))) - (value (or value - (cond - ((eq vals :any) - (read-from-minibuffer "value: ")) - ((listp vals) - (mapconcat - (lambda (group) - (let ((arg (completing-read - "Value: " - (cons "default" - (mapcar #'symbol-name group))))) - (if (and arg (not (string= "default" arg))) - (concat arg " ") - ""))) - vals "")))))) - (save-excursion - (goto-char begin) - (goto-char (point-at-eol)) - (unless (= (char-before (point)) ?\ ) (insert " ")) - (insert ":" header-arg) (when value (insert " " value))))) - -;; Add support for completing-read insertion of header arguments after ":" -(defun org-babel-header-arg-expand () - "Call `org-babel-enter-header-arg-w-completion' in appropriate contexts." - (when (and (equal (char-before) ?\:) (org-babel-where-is-src-block-head)) - (org-babel-enter-header-arg-w-completion (match-string 2)))) - -(defun org-babel-enter-header-arg-w-completion (&optional lang) - "Insert header argument appropriate for LANG with completion." - (let* ((lang-headers-var (intern (concat "org-babel-header-args:" lang))) - (lang-headers (when (boundp lang-headers-var) (eval lang-headers-var t))) - (headers-w-values (org-babel-combine-header-arg-lists - org-babel-common-header-args-w-values lang-headers)) - (headers (mapcar #'symbol-name (mapcar #'car headers-w-values))) - (header (org-completing-read "Header Arg: " headers)) - (args (cdr (assoc (intern header) headers-w-values))) - (arg (when (and args (listp args)) - (org-completing-read - (format "%s: " header) - (mapcar #'symbol-name (apply #'append args)))))) - (insert (concat header " " (or arg ""))) - (cons header arg))) - -(add-hook 'org-tab-first-hook 'org-babel-header-arg-expand) - -;;;###autoload -(defun org-babel-load-in-session (&optional _arg info) - "Load the body of the current source-code block. -Evaluate the header arguments for the source block before -entering the session. After loading the body this pops open the -session." - (interactive) - (let* ((info (or info (org-babel-get-src-block-info))) - (lang (nth 0 info)) - (params (nth 2 info)) - (body (if (not info) - (user-error "No src code block at point") - (setf (nth 1 info) - (if (org-babel-noweb-p params :eval) - (org-babel-expand-noweb-references info) - (nth 1 info))))) - (session (cdr (assq :session params))) - (dir (cdr (assq :dir params))) - (default-directory - (or (and dir (file-name-as-directory dir)) default-directory)) - (cmd (intern (concat "org-babel-load-session:" lang)))) - (unless (fboundp cmd) - (error "No org-babel-load-session function for %s!" lang)) - (pop-to-buffer (funcall cmd session body params)) - (end-of-line 1))) - -;;;###autoload -(defun org-babel-initiate-session (&optional arg info) - "Initiate session for current code block. -If called with a prefix argument then resolve any variable -references in the header arguments and assign these variables in -the session. Copy the body of the code block to the kill ring." - (interactive "P") - (let* ((info (or info (org-babel-get-src-block-info (not arg)))) - (lang (nth 0 info)) - (body (nth 1 info)) - (params (nth 2 info)) - (session (cdr (assq :session params))) - (dir (cdr (assq :dir params))) - (default-directory - (or (and dir (file-name-as-directory dir)) default-directory)) - (init-cmd (intern (format "org-babel-%s-initiate-session" lang))) - (prep-cmd (intern (concat "org-babel-prep-session:" lang)))) - (when (and (stringp session) (string= session "none")) - (error "This block is not using a session!")) - (unless (fboundp init-cmd) - (error "No org-babel-initiate-session function for %s!" lang)) - (with-temp-buffer (insert (org-trim body)) - (copy-region-as-kill (point-min) (point-max))) - (when arg - (unless (fboundp prep-cmd) - (error "No org-babel-prep-session function for %s!" lang)) - (funcall prep-cmd session params)) - (funcall init-cmd session params))) - -;;;###autoload -(defun org-babel-switch-to-session (&optional arg info) - "Switch to the session of the current code block. -Uses `org-babel-initiate-session' to start the session. If called -with a prefix argument then this is passed on to -`org-babel-initiate-session'." - (interactive "P") - (pop-to-buffer (org-babel-initiate-session arg info)) - (end-of-line 1)) - -(defalias 'org-babel-pop-to-session 'org-babel-switch-to-session) - -(defvar org-src-window-setup) - -;;;###autoload -(defun org-babel-switch-to-session-with-code (&optional arg _info) - "Switch to code buffer and display session." - (interactive "P") - (let ((swap-windows - (lambda () - (let ((other-window-buffer (window-buffer (next-window)))) - (set-window-buffer (next-window) (current-buffer)) - (set-window-buffer (selected-window) other-window-buffer)) - (other-window 1))) - (info (org-babel-get-src-block-info)) - (org-src-window-setup 'reorganize-frame)) - (save-excursion - (org-babel-switch-to-session arg info)) - (org-edit-src-code) - (funcall swap-windows))) - -;;;###autoload -(defmacro org-babel-do-in-edit-buffer (&rest body) - "Evaluate BODY in edit buffer if there is a code block at point. -Return t if a code block was found at point, nil otherwise." - (declare (debug (body))) - `(let* ((element (org-element-at-point)) - ;; This function is not supposed to move point. However, - ;; `org-edit-src-code' always moves point back into the - ;; source block. It is problematic if the point was before - ;; the code, e.g., on block's opening line. In this case, - ;; we want to restore this location after executing BODY. - (outside-position - (and (<= (line-beginning-position) - (org-element-property :post-affiliated element)) - (point-marker))) - (org-src-window-setup 'switch-invisibly)) - (when (and (org-babel-where-is-src-block-head element) - (org-edit-src-code)) - (unwind-protect (progn ,@body) - (org-edit-src-exit) - (when outside-position (goto-char outside-position))) - t))) - -(defun org-babel-do-key-sequence-in-edit-buffer (key) - "Read key sequence and execute the command in edit buffer. -Enter a key sequence to be executed in the language major-mode -edit buffer. For example, TAB will alter the contents of the -Org code block according to the effect of TAB in the language -major mode buffer. For languages that support interactive -sessions, this can be used to send code from the Org buffer -to the session for evaluation using the native major mode -evaluation mechanisms." - (interactive "kEnter key-sequence to execute in edit buffer: ") - (org-babel-do-in-edit-buffer - (call-interactively - (key-binding (or key (read-key-sequence nil)))))) - -(defvar org-link-bracket-re) - -(defun org-babel-active-location-p () - (memq (org-element-type (save-match-data (org-element-context))) - '(babel-call inline-babel-call inline-src-block src-block))) - -;;;###autoload -(defun org-babel-open-src-block-result (&optional re-run) - "Open results of source block at point. - -If `point' is on a source block then open the results of the source -code block, otherwise return nil. With optional prefix argument -RE-RUN the source-code block is evaluated even if results already -exist." - (interactive "P") - (pcase (org-babel-get-src-block-info 'light) - (`(,_ ,_ ,arguments ,_ ,_ ,start ,_) - (save-excursion - ;; Go to the results, if there aren't any then run the block. - (goto-char start) - (goto-char (or (and (not re-run) (org-babel-where-is-src-block-result)) - (progn (org-babel-execute-src-block) - (org-babel-where-is-src-block-result)))) - (end-of-line) - (skip-chars-forward " \r\t\n") - ;; Open the results. - (if (looking-at org-link-bracket-re) (org-open-at-point) - (let ((r (org-babel-format-result (org-babel-read-result) - (cdr (assq :sep arguments))))) - (pop-to-buffer (get-buffer-create "*Org Babel Results*")) - (erase-buffer) - (insert r))) - t)) - (_ nil))) - -;;;###autoload -(defmacro org-babel-map-src-blocks (file &rest body) - "Evaluate BODY forms on each source-block in FILE. -If FILE is nil evaluate BODY forms on source blocks in current -buffer. During evaluation of BODY the following local variables -are set relative to the currently matched code block. - -full-block ------- string holding the entirety of the code block -beg-block -------- point at the beginning of the code block -end-block -------- point at the end of the matched code block -lang ------------- string holding the language of the code block -beg-lang --------- point at the beginning of the lang -end-lang --------- point at the end of the lang -switches --------- string holding the switches -beg-switches ----- point at the beginning of the switches -end-switches ----- point at the end of the switches -header-args ------ string holding the header-args -beg-header-args -- point at the beginning of the header-args -end-header-args -- point at the end of the header-args -body ------------- string holding the body of the code block -beg-body --------- point at the beginning of the body -end-body --------- point at the end of the body" - (declare (indent 1)) - (let ((tempvar (make-symbol "file"))) - `(let* ((case-fold-search t) - (,tempvar ,file) - (visited-p (or (null ,tempvar) - (get-file-buffer (expand-file-name ,tempvar)))) - (point (point)) to-be-removed) - (save-window-excursion - (when ,tempvar (find-file ,tempvar)) - (setq to-be-removed (current-buffer)) - (goto-char (point-min)) - (while (re-search-forward org-babel-src-block-regexp nil t) - (when (org-babel-active-location-p) - (goto-char (match-beginning 0)) - (let ((full-block (match-string 0)) - (beg-block (match-beginning 0)) - (end-block (match-end 0)) - (lang (match-string 2)) - (beg-lang (match-beginning 2)) - (end-lang (match-end 2)) - (switches (match-string 3)) - (beg-switches (match-beginning 3)) - (end-switches (match-end 3)) - (header-args (match-string 4)) - (beg-header-args (match-beginning 4)) - (end-header-args (match-end 4)) - (body (match-string 5)) - (beg-body (match-beginning 5)) - (end-body (match-end 5))) - ;; Silence byte-compiler in case `body' doesn't use all - ;; those variables. - (ignore full-block beg-block end-block lang - beg-lang end-lang switches beg-switches - end-switches header-args beg-header-args - end-header-args body beg-body end-body) - ,@body - (goto-char end-block))))) - (unless visited-p (kill-buffer to-be-removed)) - (goto-char point)))) -(def-edebug-spec org-babel-map-src-blocks (form body)) - -;;;###autoload -(defmacro org-babel-map-inline-src-blocks (file &rest body) - "Evaluate BODY forms on each inline source block in FILE. -If FILE is nil evaluate BODY forms on source blocks in current -buffer." - (declare (indent 1) (debug (form body))) - (org-with-gensyms (datum end point tempvar to-be-removed visitedp) - `(let* ((case-fold-search t) - (,tempvar ,file) - (,visitedp (or (null ,tempvar) - (get-file-buffer (expand-file-name ,tempvar)))) - (,point (point)) - ,to-be-removed) - (save-window-excursion - (when ,tempvar (find-file ,tempvar)) - (setq ,to-be-removed (current-buffer)) - (goto-char (point-min)) - (while (re-search-forward "src_\\S-" nil t) - (let ((,datum (save-match-data (org-element-context)))) - (when (eq (org-element-type ,datum) 'inline-src-block) - (goto-char (match-beginning 0)) - (let ((,end (copy-marker (org-element-property :end ,datum)))) - ,@body - (goto-char ,end) - (set-marker ,end nil)))))) - (unless ,visitedp (kill-buffer ,to-be-removed)) - (goto-char ,point)))) - -;;;###autoload -(defmacro org-babel-map-call-lines (file &rest body) - "Evaluate BODY forms on each call line in FILE. -If FILE is nil evaluate BODY forms on source blocks in current -buffer." - (declare (indent 1) (debug (form body))) - (org-with-gensyms (datum end point tempvar to-be-removed visitedp) - `(let* ((case-fold-search t) - (,tempvar ,file) - (,visitedp (or (null ,tempvar) - (get-file-buffer (expand-file-name ,tempvar)))) - (,point (point)) - ,to-be-removed) - (save-window-excursion - (when ,tempvar (find-file ,tempvar)) - (setq ,to-be-removed (current-buffer)) - (goto-char (point-min)) - (while (re-search-forward "call_\\S-\\|^[ \t]*#\\+CALL:" nil t) - (let ((,datum (save-match-data (org-element-context)))) - (when (memq (org-element-type ,datum) - '(babel-call inline-babel-call)) - (goto-char (match-beginning 0)) - (let ((,end (copy-marker (org-element-property :end ,datum)))) - ,@body - (goto-char ,end) - (set-marker ,end nil)))))) - (unless ,visitedp (kill-buffer ,to-be-removed)) - (goto-char ,point)))) - -;;;###autoload -(defmacro org-babel-map-executables (file &rest body) - "Evaluate BODY forms on each active Babel code in FILE. -If FILE is nil evaluate BODY forms on source blocks in current -buffer." - (declare (indent 1) (debug (form body))) - (org-with-gensyms (datum end point tempvar to-be-removed visitedp) - `(let* ((case-fold-search t) - (,tempvar ,file) - (,visitedp (or (null ,tempvar) - (get-file-buffer (expand-file-name ,tempvar)))) - (,point (point)) - ,to-be-removed) - (save-window-excursion - (when ,tempvar (find-file ,tempvar)) - (setq ,to-be-removed (current-buffer)) - (goto-char (point-min)) - (while (re-search-forward - "\\(call\\|src\\)_\\|^[ \t]*#\\+\\(BEGIN_SRC\\|CALL:\\)" nil t) - (let ((,datum (save-match-data (org-element-context)))) - (when (memq (org-element-type ,datum) - '(babel-call inline-babel-call inline-src-block - src-block)) - (goto-char (match-beginning 0)) - (let ((,end (copy-marker (org-element-property :end ,datum)))) - ,@body - (goto-char ,end) - (set-marker ,end nil)))))) - (unless ,visitedp (kill-buffer ,to-be-removed)) - (goto-char ,point)))) - -;;;###autoload -(defun org-babel-execute-buffer (&optional arg) - "Execute source code blocks in a buffer. -Call `org-babel-execute-src-block' on every source block in -the current buffer." - (interactive "P") - (org-babel-eval-wipe-error-buffer) - (org-save-outline-visibility t - (org-babel-map-executables nil - (if (memq (org-element-type (org-element-context)) - '(babel-call inline-babel-call)) - (org-babel-lob-execute-maybe) - (org-babel-execute-src-block arg))))) - -;;;###autoload -(defun org-babel-execute-subtree (&optional arg) - "Execute source code blocks in a subtree. -Call `org-babel-execute-src-block' on every source block in -the current subtree." - (interactive "P") - (save-restriction - (save-excursion - (org-narrow-to-subtree) - (org-babel-execute-buffer arg) - (widen)))) - -;;;###autoload -(defun org-babel-sha1-hash (&optional info context) - "Generate a sha1 hash based on the value of INFO. -CONTEXT specifies the context of evaluation. It can be `:eval', -`:export', `:tangle'. A nil value means `:eval'." - (interactive) - (let ((print-level nil) - (info (or info (org-babel-get-src-block-info))) - (context (or context :eval))) - (setf (nth 2 info) - (sort (copy-sequence (nth 2 info)) - (lambda (a b) (string< (car a) (car b))))) - (let* ((rm (lambda (lst) - (dolist (p '("replace" "silent" "none" - "append" "prepend")) - (setq lst (remove p lst))) - lst)) - (norm (lambda (arg) - (let ((v (if (and (listp (cdr arg)) (null (cddr arg))) - (copy-sequence (cdr arg)) - (cdr arg)))) - (when (and v (not (and (sequencep v) - (not (consp v)) - (= (length v) 0)))) - (cond - ((and (listp v) ; lists are sorted - (member (car arg) '(:result-params))) - (sort (funcall rm v) #'string<)) - ((and (stringp v) ; strings are sorted - (member (car arg) '(:results :exports))) - (mapconcat #'identity (sort (funcall rm (split-string v)) - #'string<) " ")) - (t v)))))) - ;; expanded body - (lang (nth 0 info)) - (params (nth 2 info)) - (body (if (org-babel-noweb-p params context) - (org-babel-expand-noweb-references info) - (nth 1 info))) - (expand-cmd (intern (concat "org-babel-expand-body:" lang))) - (assignments-cmd (intern (concat "org-babel-variable-assignments:" - lang))) - (expanded - (if (fboundp expand-cmd) (funcall expand-cmd body params) - (org-babel-expand-body:generic - body params (and (fboundp assignments-cmd) - (funcall assignments-cmd params)))))) - (let* ((it (format "%s-%s" - (mapconcat - #'identity - (delq nil (mapcar (lambda (arg) - (let ((normalized (funcall norm arg))) - (when normalized - (format "%S" normalized)))) - (nth 2 info))) ":") - expanded)) - (hash (sha1 it))) - (when (called-interactively-p 'interactive) (message hash)) - hash)))) - -(defun org-babel-current-result-hash (&optional info) - "Return the current in-buffer hash." - (let ((result (org-babel-where-is-src-block-result nil info))) - (when result - (org-with-wide-buffer - (goto-char result) - (looking-at org-babel-result-regexp) - (match-string-no-properties 1))))) - -(defun org-babel-hide-hash () - "Hide the hash in the current results line. -Only the initial `org-babel-hash-show' characters of the hash -will remain visible." - (add-to-invisibility-spec '(org-babel-hide-hash . t)) - (save-excursion - (when (and (re-search-forward org-babel-result-regexp nil t) - (match-string 1)) - (let* ((start (match-beginning 1)) - (hide-start (+ org-babel-hash-show start)) - (end (match-end 1)) - (hash (match-string 1)) - ov1 ov2) - (setq ov1 (make-overlay start hide-start)) - (setq ov2 (make-overlay hide-start end)) - (overlay-put ov2 'invisible 'org-babel-hide-hash) - (overlay-put ov1 'babel-hash hash))))) - -(defun org-babel-hide-all-hashes () - "Hide the hash in the current buffer. -Only the initial `org-babel-hash-show' characters of each hash -will remain visible. This function should be called as part of -the `org-mode-hook'." - (save-excursion - (while (and (not org-babel-hash-show-time) - (re-search-forward org-babel-result-regexp nil t)) - (goto-char (match-beginning 0)) - (org-babel-hide-hash) - (goto-char (match-end 0))))) -(add-hook 'org-mode-hook 'org-babel-hide-all-hashes) - -(defun org-babel-hash-at-point (&optional point) - "Return the value of the hash at POINT. -\\\ -The hash is also added as the last element of the kill ring. -This can be called with `\\[org-ctrl-c-ctrl-c]'." - (interactive) - (let ((hash (car (delq nil (mapcar - (lambda (ol) (overlay-get ol 'babel-hash)) - (overlays-at (or point (point)))))))) - (when hash (kill-new hash) (message hash)))) - -(defun org-babel-result-hide-spec () - "Hide portions of results lines. -Add `org-babel-hide-result' as an invisibility spec for hiding -portions of results lines." - (add-to-invisibility-spec '(org-babel-hide-result . t))) -(add-hook 'org-mode-hook 'org-babel-result-hide-spec) - -(defvar org-babel-hide-result-overlays nil - "Overlays hiding results.") - -(defun org-babel-result-hide-all () - "Fold all results in the current buffer." - (interactive) - (org-babel-show-result-all) - (save-excursion - (while (re-search-forward org-babel-result-regexp nil t) - (save-excursion (goto-char (match-beginning 0)) - (org-babel-hide-result-toggle-maybe))))) - -(defun org-babel-show-result-all () - "Unfold all results in the current buffer." - (mapc 'delete-overlay org-babel-hide-result-overlays) - (setq org-babel-hide-result-overlays nil)) - -;;;###autoload -(defun org-babel-hide-result-toggle-maybe () - "Toggle visibility of result at point." - (interactive) - (let ((case-fold-search t)) - (if (save-excursion - (beginning-of-line 1) - (looking-at org-babel-result-regexp)) - (progn (org-babel-hide-result-toggle) - t) ;; to signal that we took action - nil))) ;; to signal that we did not - -(defun org-babel-hide-result-toggle (&optional force) - "Toggle the visibility of the current result." - (interactive) - (save-excursion - (beginning-of-line) - (if (re-search-forward org-babel-result-regexp nil t) - (let ((start (progn (beginning-of-line 2) (- (point) 1))) - (end (progn - (while (looking-at org-babel-multi-line-header-regexp) - (forward-line 1)) - (goto-char (- (org-babel-result-end) 1)) (point))) - ov) - (if (memq t (mapcar (lambda (overlay) - (eq (overlay-get overlay 'invisible) - 'org-babel-hide-result)) - (overlays-at start))) - (when (or (not force) (eq force 'off)) - (mapc (lambda (ov) - (when (member ov org-babel-hide-result-overlays) - (setq org-babel-hide-result-overlays - (delq ov org-babel-hide-result-overlays))) - (when (eq (overlay-get ov 'invisible) - 'org-babel-hide-result) - (delete-overlay ov))) - (overlays-at start))) - (setq ov (make-overlay start end)) - (overlay-put ov 'invisible 'org-babel-hide-result) - ;; make the block accessible to isearch - (overlay-put - ov 'isearch-open-invisible - (lambda (ov) - (when (member ov org-babel-hide-result-overlays) - (setq org-babel-hide-result-overlays - (delq ov org-babel-hide-result-overlays))) - (when (eq (overlay-get ov 'invisible) - 'org-babel-hide-result) - (delete-overlay ov)))) - (push ov org-babel-hide-result-overlays))) - (error "Not looking at a result line")))) - -;; org-tab-after-check-for-cycling-hook -(add-hook 'org-tab-first-hook 'org-babel-hide-result-toggle-maybe) -;; Remove overlays when changing major mode -(add-hook 'org-mode-hook - (lambda () (add-hook 'change-major-mode-hook - 'org-babel-show-result-all 'append 'local))) - -(defun org-babel-params-from-properties (&optional lang no-eval) - "Retrieve source block parameters specified as properties. - -LANG is the language of the source block, as a string. When -optional argument NO-EVAL is non-nil, do not evaluate Lisp values -in parameters. - -Return a list of association lists of source block parameters -specified in the properties of the current outline entry." - (save-match-data - (list - ;; Header arguments specified with the header-args property at - ;; point of call. - (org-babel-parse-header-arguments - (org-entry-get (point) "header-args" 'inherit) - no-eval) - ;; Language-specific header arguments at point of call. - (and lang - (org-babel-parse-header-arguments - (org-entry-get (point) (concat "header-args:" lang) 'inherit) - no-eval))))) - -(defun org-babel-balanced-split (string alts) - "Split STRING on instances of ALTS. -ALTS is a character, or cons of two character options where each -option may be either the numeric code of a single character or -a list of character alternatives. For example, to split on -balanced instances of \"[ \t]:\", set ALTS to ((32 9) . 58)." - (with-temp-buffer - (insert string) - (goto-char (point-min)) - (let ((splitp (lambda (past next) - ;; Non-nil when there should be a split after NEXT - ;; character. PAST is the character before NEXT. - (pcase alts - (`(,(and first (pred consp)) . ,(and second (pred consp))) - (and (memq past first) (memq next second))) - (`(,first . ,(and second (pred consp))) - (and (eq past first) (memq next second))) - (`(,(and first (pred consp)) . ,second) - (and (memq past first) (eq next second))) - (`(,first . ,second) - (and (eq past first) (eq next second))) - ((pred (eq next)) t) - (_ nil)))) - (partial nil) - (result nil)) - (while (not (eobp)) - (cond - ((funcall splitp (char-before) (char-after)) - ;; There is a split after point. If ALTS is two-folds, - ;; remove last parsed character as it belongs to ALTS. - (when (consp alts) (pop partial)) - ;; Include elements parsed so far in RESULTS and flush - ;; partial parsing. - (when partial - (push (apply #'string (nreverse partial)) result) - (setq partial nil)) - (forward-char)) - ((memq (char-after) '(?\( ?\[)) - ;; Include everything between balanced brackets. - (let* ((origin (point)) - (after (char-after)) - (openings (list after))) - (forward-char) - (while (and openings (re-search-forward "[]()]" nil t)) - (pcase (char-before) - ((and match (or ?\[ ?\()) (push match openings)) - (?\] (when (eq ?\[ (car openings)) (pop openings))) - (_ (when (eq ?\( (car openings)) (pop openings))))) - (if (null openings) - (setq partial - (nconc (nreverse (string-to-list - (buffer-substring origin (point)))) - partial)) - ;; Un-balanced bracket. Backtrack. - (push after partial) - (goto-char (1+ origin))))) - ((and (eq ?\" (char-after)) (not (eq ?\\ (char-before)))) - ;; Include everything from current double quote to next - ;; non-escaped double quote. - (let ((origin (point))) - (if (re-search-forward "[^\\]\"" nil t) - (setq partial - (nconc (nreverse (string-to-list - (buffer-substring origin (point)))) - partial)) - ;; No closing double quote. Backtrack. - (push ?\" partial) - (forward-char)))) - (t (push (char-after) partial) - (forward-char)))) - ;; Add pending parsing and return result. - (when partial (push (apply #'string (nreverse partial)) result)) - (nreverse result)))) - -(defun org-babel-join-splits-near-ch (ch list) - "Join splits where \"=\" is on either end of the split." - (let ((last= (lambda (str) (= ch (aref str (1- (length str)))))) - (first= (lambda (str) (= ch (aref str 0))))) - (reverse - (cl-reduce (lambda (acc el) - (let ((head (car acc))) - (if (and head (or (funcall last= head) (funcall first= el))) - (cons (concat head el) (cdr acc)) - (cons el acc)))) - list :initial-value nil)))) - -(defun org-babel-parse-header-arguments (string &optional no-eval) - "Parse header arguments in STRING. -When optional argument NO-EVAL is non-nil, do not evaluate Lisp -in parameters. Return an alist." - (when (org-string-nw-p string) - (org-babel-parse-multiple-vars - (delq nil - (mapcar - (lambda (arg) - (if (string-match - "\\([^ \f\t\n\r\v]+\\)[ \f\t\n\r\v]+\\([^ \f\t\n\r\v]+.*\\)" - arg) - (cons (intern (match-string 1 arg)) - (org-babel-read (org-babel-chomp (match-string 2 arg)) - no-eval)) - (cons (intern (org-babel-chomp arg)) nil))) - (let ((raw (org-babel-balanced-split string '((32 9) . 58)))) - (cons (car raw) - (mapcar (lambda (r) (concat ":" r)) (cdr raw))))))))) - -(defun org-babel-parse-multiple-vars (header-arguments) - "Expand multiple variable assignments behind a single :var keyword. - -This allows expression of multiple variables with one :var as -shown below. - -#+PROPERTY: var foo=1, bar=2" - (let (results) - (mapc (lambda (pair) - (if (eq (car pair) :var) - (mapcar (lambda (v) (push (cons :var (org-trim v)) results)) - (org-babel-join-splits-near-ch - 61 (org-babel-balanced-split (cdr pair) 32))) - (push pair results))) - header-arguments) - (nreverse results))) - -(defun org-babel-process-params (params) - "Expand variables in PARAMS and add summary parameters." - (let* ((processed-vars (mapcar (lambda (el) - (if (consp el) - el - (org-babel-ref-parse el))) - (org-babel--get-vars params))) - (vars-and-names (if (and (assq :colname-names params) - (assq :rowname-names params)) - (list processed-vars) - (org-babel-disassemble-tables - processed-vars - (cdr (assq :hlines params)) - (cdr (assq :colnames params)) - (cdr (assq :rownames params))))) - (raw-result (or (cdr (assq :results params)) "")) - (result-params (delete-dups - (append - (split-string (if (stringp raw-result) - raw-result - (eval raw-result t))) - (cdr (assq :result-params params)))))) - (append - (mapcar (lambda (var) (cons :var var)) (car vars-and-names)) - (list - (cons :colname-names (or (cdr (assq :colname-names params)) - (cadr vars-and-names))) - (cons :rowname-names (or (cdr (assq :rowname-names params)) - (cl-caddr vars-and-names))) - (cons :result-params result-params) - (cons :result-type (cond ((member "output" result-params) 'output) - ((member "value" result-params) 'value) - (t 'value)))) - (cl-remove-if - (lambda (x) (memq (car x) '(:colname-names :rowname-names :result-params - :result-type :var))) - params)))) - -;; row and column names -(defun org-babel-del-hlines (table) - "Remove all `hline's from TABLE." - (remq 'hline table)) - -(defun org-babel-get-colnames (table) - "Return the column names of TABLE. -Return a cons cell, the `car' of which contains the TABLE less -colnames, and the `cdr' of which contains a list of the column -names." - (if (eq 'hline (nth 1 table)) - (cons (cddr table) (car table)) - (cons (cdr table) (car table)))) - -(defun org-babel-get-rownames (table) - "Return the row names of TABLE. -Return a cons cell, the `car' of which contains the TABLE less -rownames, and the `cdr' of which contains a list of the rownames. -Note: this function removes any hlines in TABLE." - (let* ((table (org-babel-del-hlines table)) - (rownames (funcall (lambda () - (let ((tp table)) - (mapcar - (lambda (_row) - (prog1 - (pop (car tp)) - (setq tp (cdr tp)))) - table)))))) - (cons table rownames))) - -(defun org-babel-put-colnames (table colnames) - "Add COLNAMES to TABLE if they exist." - (if colnames (apply 'list colnames 'hline table) table)) - -(defun org-babel-put-rownames (table rownames) - "Add ROWNAMES to TABLE if they exist." - (if rownames - (mapcar (lambda (row) - (if (listp row) - (cons (or (pop rownames) "") row) - row)) table) - table)) - -(defun org-babel-pick-name (names selector) - "Select one out of an alist of row or column names. -SELECTOR can be either a list of names in which case those names -will be returned directly, or an index into the list NAMES in -which case the indexed names will be return." - (if (listp selector) - selector - (when names - (if (and selector (symbolp selector) (not (equal t selector))) - (cdr (assoc selector names)) - (if (integerp selector) - (nth (- selector 1) names) - (cdr (car (last names)))))))) - -(defun org-babel-disassemble-tables (vars hlines colnames rownames) - "Parse tables for further processing. -Process the variables in VARS according to the HLINES, -ROWNAMES and COLNAMES header arguments. Return a list consisting -of the vars, cnames and rnames." - (let (cnames rnames) - (list - (mapcar - (lambda (var) - (when (listp (cdr var)) - (when (and (not (equal colnames "no")) - (or colnames (and (eq (nth 1 (cdr var)) 'hline) - (not (member 'hline (cddr (cdr var))))))) - (let ((both (org-babel-get-colnames (cdr var)))) - (setq cnames (cons (cons (car var) (cdr both)) - cnames)) - (setq var (cons (car var) (car both))))) - (when (and rownames (not (equal rownames "no"))) - (let ((both (org-babel-get-rownames (cdr var)))) - (setq rnames (cons (cons (car var) (cdr both)) - rnames)) - (setq var (cons (car var) (car both))))) - (when (and hlines (not (equal hlines "yes"))) - (setq var (cons (car var) (org-babel-del-hlines (cdr var)))))) - var) - vars) - (reverse cnames) (reverse rnames)))) - -(defun org-babel-reassemble-table (table colnames rownames) - "Add column and row names to a table. -Given a TABLE and set of COLNAMES and ROWNAMES add the names -to the table for reinsertion to org-mode." - (if (listp table) - (let ((table (if (and rownames (= (length table) (length rownames))) - (org-babel-put-rownames table rownames) table))) - (if (and colnames (listp (car table)) (= (length (car table)) - (length colnames))) - (org-babel-put-colnames table colnames) table)) - table)) - -(defun org-babel-where-is-src-block-head (&optional src-block) - "Find where the current source block begins. - -If optional argument SRC-BLOCK is `src-block' type element, find -its current beginning instead. - -Return the point at the beginning of the current source block. -Specifically at the beginning of the #+BEGIN_SRC line. Also set -match-data relatively to `org-babel-src-block-regexp', which see. -If the point is not on a source block then return nil." - (let ((element (or src-block (org-element-at-point)))) - (when (eq (org-element-type element) 'src-block) - (let ((end (org-element-property :end element))) - (org-with-wide-buffer - ;; Ensure point is not on a blank line after the block. - (beginning-of-line) - (skip-chars-forward " \r\t\n" end) - (when (< (point) end) - (prog1 (goto-char (org-element-property :post-affiliated element)) - (looking-at org-babel-src-block-regexp)))))))) - -;;;###autoload -(defun org-babel-goto-src-block-head () - "Go to the beginning of the current code block." - (interactive) - (let ((head (org-babel-where-is-src-block-head))) - (if head (goto-char head) (error "Not currently in a code block")))) - -;;;###autoload -(defun org-babel-goto-named-src-block (name) - "Go to a named source-code block." - (interactive - (let ((completion-ignore-case t) - (case-fold-search t) - (all-block-names (org-babel-src-block-names))) - (list (completing-read - "source-block name: " all-block-names nil t - (let* ((context (org-element-context)) - (type (org-element-type context)) - (noweb-ref - (and (memq type '(inline-src-block src-block)) - (org-in-regexp (org-babel-noweb-wrap))))) - (cond - (noweb-ref - (buffer-substring - (+ (car noweb-ref) (length org-babel-noweb-wrap-start)) - (- (cdr noweb-ref) (length org-babel-noweb-wrap-end)))) - ((memq type '(babel-call inline-babel-call)) ;#+CALL: - (org-element-property :call context)) - ((car (org-element-property :results context))) ;#+RESULTS: - ((let ((symbol (thing-at-point 'symbol))) ;Symbol. - (and symbol - (member-ignore-case symbol all-block-names) - symbol))) - (t ""))))))) - (let ((point (org-babel-find-named-block name))) - (if point - ;; Taken from `org-open-at-point'. - (progn (org-mark-ring-push) (goto-char point) (org-show-context)) - (message "source-code block `%s' not found in this buffer" name)))) - -(defun org-babel-find-named-block (name) - "Find a named source-code block. -Return the location of the source block identified by source -NAME, or nil if no such block exists. Set match data according -to `org-babel-named-src-block-regexp'." - (save-excursion - (goto-char (point-min)) - (let ((regexp (org-babel-named-src-block-regexp-for-name name))) - (or (and (looking-at regexp) - (progn (goto-char (match-beginning 1)) - (line-beginning-position))) - (ignore-errors (org-next-block 1 nil regexp)))))) - -(defun org-babel-src-block-names (&optional file) - "Return the names of source blocks in FILE or the current buffer." - (with-current-buffer (if file (find-file-noselect file) (current-buffer)) - (org-with-point-at 1 - (let ((regexp "^[ \t]*#\\+begin_src ") - (case-fold-search t) - (names nil)) - (while (re-search-forward regexp nil t) - (let ((element (org-element-at-point))) - (when (eq 'src-block (org-element-type element)) - (let ((name (org-element-property :name element))) - (when name (push name names)))))) - names)))) - -;;;###autoload -(defun org-babel-goto-named-result (name) - "Go to a named result." - (interactive - (let ((completion-ignore-case t)) - (list (completing-read "Source-block name: " - (org-babel-result-names) nil t)))) - (let ((point (org-babel-find-named-result name))) - (if point - ;; taken from `org-open-at-point' - (progn (goto-char point) (org-show-context)) - (message "result `%s' not found in this buffer" name)))) - -(defun org-babel-find-named-result (name) - "Find a named result. -Return the location of the result named NAME in the current -buffer or nil if no such result exists." - (save-excursion - (goto-char (point-min)) - (let ((case-fold-search t) - (re (format "^[ \t]*#\\+%s.*?:[ \t]*%s[ \t]*$" - org-babel-results-keyword - (regexp-quote name)))) - (catch :found - (while (re-search-forward re nil t) - (let ((element (org-element-at-point))) - (when (or (eq (org-element-type element) 'keyword) - (< (point) - (org-element-property :post-affiliated element))) - (throw :found (line-beginning-position))))))))) - -(defun org-babel-result-names (&optional file) - "Return the names of results in FILE or the current buffer." - (save-excursion - (when file (find-file file)) (goto-char (point-min)) - (let ((case-fold-search t) names) - (while (re-search-forward org-babel-result-w-name-regexp nil t) - (setq names (cons (match-string-no-properties 9) names))) - names))) - -;;;###autoload -(defun org-babel-next-src-block (&optional arg) - "Jump to the next source block. -With optional prefix argument ARG, jump forward ARG many source blocks." - (interactive "p") - (org-next-block arg nil org-babel-src-block-regexp)) - -;;;###autoload -(defun org-babel-previous-src-block (&optional arg) - "Jump to the previous source block. -With optional prefix argument ARG, jump backward ARG many source blocks." - (interactive "p") - (org-previous-block arg org-babel-src-block-regexp)) - -(defvar org-babel-load-languages) - -;;;###autoload -(defun org-babel-mark-block () - "Mark current source block." - (interactive) - (let ((head (org-babel-where-is-src-block-head))) - (when head - (save-excursion - (goto-char head) - (looking-at org-babel-src-block-regexp)) - (push-mark (match-end 5) nil t) - (goto-char (match-beginning 5))))) - -(defun org-babel-demarcate-block (&optional arg) - "Wrap or split the code in the region or on the point. -When called from inside of a code block the current block is -split. When called from outside of a code block a new code block -is created. In both cases if the region is demarcated and if the -region is not active then the point is demarcated." - (interactive "P") - (let* ((info (org-babel-get-src-block-info 'light)) - (start (org-babel-where-is-src-block-head)) - (block (and start (match-string 0))) - (headers (and start (match-string 4))) - (stars (concat (make-string (or (org-current-level) 1) ?*) " ")) - (lower-case-p (and block - (let (case-fold-search) - (string-match-p "#\\+begin_src" block))))) - (if info - (mapc - (lambda (place) - (save-excursion - (goto-char place) - (let ((lang (nth 0 info)) - (indent (make-string (current-indentation) ?\s))) - (when (string-match "^[[:space:]]*$" - (buffer-substring (point-at-bol) - (point-at-eol))) - (delete-region (point-at-bol) (point-at-eol))) - (insert (concat - (if (looking-at "^") "" "\n") - indent (funcall (if lower-case-p 'downcase 'upcase) "#+end_src\n") - (if arg stars indent) "\n" - indent (funcall (if lower-case-p 'downcase 'upcase) "#+begin_src ") - lang - (if (> (length headers) 1) - (concat " " headers) headers) - (if (looking-at "[\n\r]") - "" - (concat "\n" (make-string (current-column) ? ))))))) - (move-end-of-line 2)) - (sort (if (org-region-active-p) (list (mark) (point)) (list (point))) #'>)) - (let ((start (point)) - (lang (completing-read - "Lang: " - (mapcar #'symbol-name - (delete-dups - (append (mapcar #'car org-babel-load-languages) - (mapcar (lambda (el) (intern (car el))) - org-src-lang-modes)))))) - (body (delete-and-extract-region - (if (org-region-active-p) (mark) (point)) (point)))) - (insert (concat (if (looking-at "^") "" "\n") - (if arg (concat stars "\n") "") - (funcall (if lower-case-p 'downcase 'upcase) "#+begin_src ") - lang "\n" - body - (if (or (= (length body) 0) - (string-suffix-p "\r" body) - (string-suffix-p "\n" body)) "" "\n") - (funcall (if lower-case-p 'downcase 'upcase) "#+end_src\n"))) - (goto-char start) (move-end-of-line 1))))) - -(defun org-babel--insert-results-keyword (name hash) - "Insert RESULTS keyword with NAME value at point. -If NAME is nil, results are anonymous. HASH is a string used as -the results hash, or nil. Leave point before the keyword." - (save-excursion (insert "\n")) ;open line to indent. - (org-indent-line) - (delete-char 1) - (insert (concat "#+" org-babel-results-keyword - (cond ((not hash) nil) - (org-babel-hash-show-time - (format "[%s %s]" - (format-time-string "<%F %T>") - hash)) - (t (format "[%s]" hash))) - ":" - (when name (concat " " name)) - "\n")) - ;; Make sure results are going to be followed by at least one blank - ;; line so they do not get merged with the next element, e.g., - ;; - ;; #+results: - ;; : 1 - ;; - ;; : fixed-width area, unrelated to the above. - (unless (looking-at "^[ \t]*$") (save-excursion (insert "\n"))) - (beginning-of-line 0) - (when hash (org-babel-hide-hash))) - -(defun org-babel--clear-results-maybe (hash) - "Clear results when hash doesn't match HASH. - -When results hash does not match HASH, remove RESULTS keyword at -point, along with related contents. Do nothing if HASH is nil. - -Return a non-nil value if results were cleared. In this case, -leave point where new results should be inserted." - (when hash - (looking-at org-babel-result-regexp) - (unless (string= (match-string 1) hash) - (let* ((e (org-element-at-point)) - (post (copy-marker (org-element-property :post-affiliated e)))) - ;; Delete contents. - (delete-region post - (save-excursion - (goto-char (org-element-property :end e)) - (skip-chars-backward " \t\n") - (line-beginning-position 2))) - ;; Delete RESULT keyword. However, if RESULTS keyword is - ;; orphaned, ignore this part. The deletion above already - ;; took care of it. - (unless (= (point) post) - (delete-region (line-beginning-position) - (line-beginning-position 2))) - (goto-char post) - (set-marker post nil) - t)))) - -(defun org-babel-where-is-src-block-result (&optional insert _info hash) - "Find where the current source block results begin. - -Return the point at the beginning of the result of the current -source block, specifically at the beginning of the results line. - -If no result exists for this block return nil, unless optional -argument INSERT is non-nil. In this case, create a results line -following the source block and return the position at its -beginning. In the case of inline code, remove the results part -instead. - -If optional argument HASH is a string, remove contents related to -RESULTS keyword if its hash is different. Then update the latter -to HASH." - (let ((context (org-element-context))) - (catch :found - (org-with-wide-buffer - (pcase (org-element-type context) - ((or `inline-babel-call `inline-src-block) - ;; Results for inline objects are located right after them. - ;; There is no RESULTS line to insert either. - (let ((limit (org-element-property - :contents-end (org-element-property :parent context)))) - (goto-char (org-element-property :end context)) - (skip-chars-forward " \t\n" limit) - (throw :found - (and - (< (point) limit) - (let ((result (org-element-context))) - (and (eq (org-element-type result) 'macro) - (string= (org-element-property :key result) - "results") - (if (not insert) (point) - (delete-region - (point) - (progn - (goto-char (org-element-property :end result)) - (skip-chars-backward " \t") - (point))) - (point)))))))) - ((or `babel-call `src-block) - (let* ((name (org-element-property :name context)) - (named-results (and name (org-babel-find-named-result name)))) - (goto-char (or named-results (org-element-property :end context))) - (cond - ;; Existing results named after the current source. - (named-results - (when (org-babel--clear-results-maybe hash) - (org-babel--insert-results-keyword name hash)) - (throw :found (point))) - ;; Named results expect but none to be found. - (name) - ;; No possible anonymous results at the very end of - ;; buffer or outside CONTEXT parent. - ((eq (point) - (or (org-element-property - :contents-end (org-element-property :parent context)) - (point-max)))) - ;; Check if next element is an anonymous result below - ;; the current block. - ((let* ((next (org-element-at-point)) - (end (save-excursion - (goto-char - (org-element-property :post-affiliated next)) - (line-end-position))) - (empty-result-re (concat org-babel-result-regexp "$")) - (case-fold-search t)) - (re-search-forward empty-result-re end t)) - (beginning-of-line) - (when (org-babel--clear-results-maybe hash) - (org-babel--insert-results-keyword nil hash)) - (throw :found (point)))))) - ;; Ignore other elements. - (_ (throw :found nil)))) - ;; No result found. Insert a RESULTS keyword below element, if - ;; appropriate. In this case, ensure there is an empty line - ;; after the previous element. - (when insert - (save-excursion - (goto-char (min (org-element-property :end context) (point-max))) - (skip-chars-backward " \t\n") - (forward-line) - (unless (bolp) (insert "\n")) - (insert "\n") - (org-babel--insert-results-keyword - (org-element-property :name context) hash) - (point)))))) - -(defun org-babel-read-element (element) - "Read ELEMENT into emacs-lisp. -Return nil if ELEMENT cannot be read." - (org-with-wide-buffer - (goto-char (org-element-property :post-affiliated element)) - (pcase (org-element-type element) - (`fixed-width - (let ((v (org-trim (org-element-property :value element)))) - (or (org-babel--string-to-number v) v))) - (`table (org-babel-read-table)) - (`plain-list (org-babel-read-list)) - (`example-block - (let ((v (org-element-property :value element))) - (if (or org-src-preserve-indentation - (org-element-property :preserve-indent element)) - v - (org-remove-indentation v)))) - (`export-block - (org-remove-indentation (org-element-property :value element))) - (`paragraph - ;; Treat paragraphs containing a single link specially. - (skip-chars-forward " \t") - (if (and (looking-at org-link-bracket-re) - (save-excursion - (goto-char (match-end 0)) - (skip-chars-forward " \r\t\n") - (<= (org-element-property :end element) - (point)))) - (org-babel-read-link) - (buffer-substring-no-properties - (org-element-property :contents-begin element) - (org-element-property :contents-end element)))) - ((or `center-block `quote-block `verse-block `special-block) - (org-remove-indentation - (buffer-substring-no-properties - (org-element-property :contents-begin element) - (org-element-property :contents-end element)))) - (_ nil)))) - -(defun org-babel-read-result () - "Read the result at point into emacs-lisp." - (and (not (save-excursion - (beginning-of-line) - (looking-at-p "[ \t]*$"))) - (org-babel-read-element (org-element-at-point)))) - -(defun org-babel-read-table () - "Read the table at point into emacs-lisp." - (mapcar (lambda (row) - (if (and (symbolp row) (equal row 'hline)) row - (mapcar (lambda (el) (org-babel-read el 'inhibit-lisp-eval)) row))) - (org-table-to-lisp))) - -(defun org-babel-read-list () - "Read the list at point into emacs-lisp." - (mapcar (lambda (el) (org-babel-read el 'inhibit-lisp-eval)) - (cdr (org-list-to-lisp)))) - -(defvar org-link-types-re) -(defun org-babel-read-link () - "Read the link at point into emacs-lisp. -If the path of the link is a file path it is expanded using -`expand-file-name'." - (let* ((case-fold-search t) - (raw (and (looking-at org-link-bracket-re) - (org-no-properties (match-string 1)))) - (type (and (string-match org-link-types-re raw) - (match-string 1 raw)))) - (cond - ((not type) (expand-file-name raw)) - ((string= type "file") - (and (string-match "file\\(.*\\):\\(.+\\)" raw) - (expand-file-name (match-string 2 raw)))) - (t raw)))) - -(defun org-babel-format-result (result &optional sep) - "Format RESULT for writing to file." - (let ((echo-res (lambda (r) (if (stringp r) r (format "%S" r))))) - (if (listp result) - ;; table result - (orgtbl-to-generic - result (list :sep (or sep "\t") :fmt echo-res)) - ;; scalar result - (funcall echo-res result)))) - -(defun org-babel-insert-result (result &optional result-params info hash lang) - "Insert RESULT into the current buffer. - -By default RESULT is inserted after the end of the current source -block. The RESULT of an inline source block usually will be -wrapped inside a `results' macro and placed on the same line as -the inline source block. The macro is stripped upon export. -Multiline and non-scalar RESULTS from inline source blocks are -not allowed. With optional argument RESULT-PARAMS controls -insertion of results in the Org mode file. RESULT-PARAMS can -take the following values: - -replace - (default option) insert results after the source block - or inline source block replacing any previously - inserted results. - -silent -- no results are inserted into the Org buffer but - the results are echoed to the minibuffer and are - ingested by Emacs (a potentially time consuming - process). - -file ---- the results are interpreted as a file path, and are - inserted into the buffer using the Org file syntax. - -list ---- the results are interpreted as an Org list. - -raw ----- results are added directly to the Org file. This is - a good option if you code block will output Org - formatted text. - -drawer -- results are added directly to the Org file as with - \"raw\", but are wrapped in a RESULTS drawer or results - macro, allowing them to later be replaced or removed - automatically. - -org ----- results are added inside of a \"src_org{}\" or \"#+BEGIN_SRC - org\" block depending on whether the current source block is - inline or not. They are not comma-escaped when inserted, - but Org syntax here will be discarded when exporting the - file. - -html ---- results are added inside of a #+BEGIN_EXPORT HTML block - or html export snippet depending on whether the current - source block is inline or not. This is a good option - if your code block will output html formatted text. - -latex --- results are added inside of a #+BEGIN_EXPORT LATEX - block or latex export snippet depending on whether the - current source block is inline or not. This is a good - option if your code block will output latex formatted - text. - -code ---- the results are extracted in the syntax of the source - code of the language being evaluated and are added - inside of a source block with the source-code language - set appropriately. Also, source block inlining is - preserved in this case. Note this relies on the - optional LANG argument. - -list ---- the results are rendered as a list. This option not - allowed for inline source blocks. - -table --- the results are rendered as a table. This option not - allowed for inline source blocks. - -INFO may provide the values of these header arguments (in the -`header-arguments-alist' see the docstring for -`org-babel-get-src-block-info'): - -:file --- the name of the file to which output should be written. - -:wrap --- the effect is similar to `latex' in RESULT-PARAMS but - using the argument supplied to specify the export block - or snippet type." - (cond ((stringp result) - (setq result (org-no-properties result)) - (when (member "file" result-params) - (setq result (org-babel-result-to-file - result (when (assq :file-desc (nth 2 info)) - (or (cdr (assq :file-desc (nth 2 info))) - result)))))) - ((listp result)) - (t (setq result (format "%S" result)))) - (if (and result-params (member "silent" result-params)) - (progn (message (replace-regexp-in-string "%" "%%" (format "%S" result))) - result) - (let ((inline (let ((context (org-element-context))) - (and (memq (org-element-type context) - '(inline-babel-call inline-src-block)) - context)))) - (when inline - (let ((warning - (or (and (member "table" result-params) "`:results table'") - (and (listp result) "list result") - (and (string-match-p "\n." result) "multiline result") - (and (member "list" result-params) "`:results list'")))) - (when warning - (user-error "Inline error: %s cannot be used" warning)))) - (save-excursion - (let* ((visible-beg (point-min-marker)) - (visible-end (copy-marker (point-max) t)) - (inline (let ((context (org-element-context))) - (and (memq (org-element-type context) - '(inline-babel-call inline-src-block)) - context))) - (existing-result (org-babel-where-is-src-block-result t nil hash)) - (results-switches (cdr (assq :results_switches (nth 2 info)))) - ;; When results exist outside of the current visible - ;; region of the buffer, be sure to widen buffer to - ;; update them. - (outside-scope (and existing-result - (buffer-narrowed-p) - (or (> visible-beg existing-result) - (<= visible-end existing-result)))) - beg end indent) - ;; Ensure non-inline results end in a newline. - (when (and (org-string-nw-p result) - (not inline) - (not (string-equal (substring result -1) "\n"))) - (setq result (concat result "\n"))) - (unwind-protect - (progn - (when outside-scope (widen)) - (if existing-result (goto-char existing-result) - (goto-char (org-element-property :end inline)) - (skip-chars-backward " \t")) - (unless inline - (setq indent (current-indentation)) - (forward-line 1)) - (setq beg (point)) - (cond - (inline - ;; Make sure new results are separated from the - ;; source code by one space. - (unless existing-result - (insert " ") - (setq beg (point)))) - ((member "replace" result-params) - (delete-region (point) (org-babel-result-end))) - ((member "append" result-params) - (goto-char (org-babel-result-end)) (setq beg (point-marker))) - ((member "prepend" result-params))) ; already there - (setq results-switches - (if results-switches (concat " " results-switches) "")) - (let ((wrap - (lambda (start finish &optional no-escape no-newlines - inline-start inline-finish) - (when inline - (setq start inline-start) - (setq finish inline-finish) - (setq no-newlines t)) - (let ((before-finish (copy-marker end))) - (goto-char end) - (insert (concat finish (unless no-newlines "\n"))) - (goto-char beg) - (insert (concat start (unless no-newlines "\n"))) - (unless no-escape - (org-escape-code-in-region - (min (point) before-finish) before-finish)) - (goto-char end)))) - (tabulablep - (lambda (r) - ;; Non-nil when result R can be turned into - ;; a table. - (and (proper-list-p r) - (cl-every - (lambda (e) (or (atom e) (proper-list-p e))) - result))))) - ;; insert results based on type - (cond - ;; Do nothing for an empty result. - ((null result)) - ;; Insert a list if preferred. - ((member "list" result-params) - (insert - (org-trim - (org-list-to-generic - (cons 'unordered - (mapcar - (lambda (e) - (list (if (stringp e) e (format "%S" e)))) - (if (listp result) result - (split-string result "\n" t)))) - '(:splicep nil :istart "- " :iend "\n"))) - "\n")) - ;; Try hard to print RESULT as a table. Give up if - ;; it contains an improper list. - ((funcall tabulablep result) - (goto-char beg) - (insert (concat (orgtbl-to-orgtbl - (if (cl-every - (lambda (e) - (or (eq e 'hline) (listp e))) - result) - result - (list result)) - nil) - "\n")) - (goto-char beg) - (when (org-at-table-p) (org-table-align)) - (goto-char (org-table-end))) - ;; Print verbatim a list that cannot be turned into - ;; a table. - ((listp result) (insert (format "%s\n" result))) - ((member "file" result-params) - (when inline - (setq result (org-macro-escape-arguments result))) - (insert result)) - ((and inline (not (member "raw" result-params))) - (insert (org-macro-escape-arguments - (org-babel-chomp result "\n")))) - (t (goto-char beg) (insert result))) - (setq end (copy-marker (point) t)) - ;; possibly wrap result - (cond - ((assq :wrap (nth 2 info)) - (let ((name (or (cdr (assq :wrap (nth 2 info))) "results"))) - (funcall wrap (concat "#+begin_" name) - (concat "#+end_" (car (split-string name))) - nil nil (concat "{{{results(@@" name ":") "@@)}}}"))) - ((member "html" result-params) - (funcall wrap "#+begin_export html" "#+end_export" nil nil - "{{{results(@@html:" "@@)}}}")) - ((member "latex" result-params) - (funcall wrap "#+begin_export latex" "#+end_export" nil nil - "{{{results(@@latex:" "@@)}}}")) - ((member "org" result-params) - (goto-char beg) (when (org-at-table-p) (org-cycle)) - (funcall wrap "#+begin_src org" "#+end_src" nil nil - "{{{results(src_org{" "})}}}")) - ((member "code" result-params) - (let ((lang (or lang "none"))) - (funcall wrap (format "#+begin_src %s%s" lang results-switches) - "#+end_src" nil nil - (format "{{{results(src_%s[%s]{" lang results-switches) - "})}}}"))) - ((member "raw" result-params) - (goto-char beg) (when (org-at-table-p) (org-cycle))) - ((or (member "drawer" result-params) - ;; Stay backward compatible with <7.9.2 - (member "wrap" result-params)) - (goto-char beg) (when (org-at-table-p) (org-cycle)) - (funcall wrap ":results:" ":end:" 'no-escape nil - "{{{results(" ")}}}")) - ((and inline (member "file" result-params)) - (funcall wrap nil nil nil nil "{{{results(" ")}}}")) - ((and (not (funcall tabulablep result)) - (not (member "file" result-params))) - (let ((org-babel-inline-result-wrap - ;; Hard code {{{results(...)}}} on top of - ;; customization. - (format "{{{results(%s)}}}" - org-babel-inline-result-wrap))) - (org-babel-examplify-region - beg end results-switches inline))))) - ;; Possibly indent results in par with #+results line. - (when (and (not inline) (numberp indent) (> indent 0) - ;; In this case `table-align' does the work - ;; for us. - (not (and (listp result) - (member "append" result-params)))) - (indent-rigidly beg end indent)) - (if (null result) - (if (member "value" result-params) - (message "Code block returned no value.") - (message "Code block produced no output.")) - (message "Code block evaluation complete."))) - (set-marker end nil) - (when outside-scope (narrow-to-region visible-beg visible-end)) - (set-marker visible-beg nil) - (set-marker visible-end nil))))))) - -(defun org-babel-remove-result (&optional info keep-keyword) - "Remove the result of the current source block." - (interactive) - (let ((location (org-babel-where-is-src-block-result nil info))) - (when location - (save-excursion - (goto-char location) - (when (looking-at (concat org-babel-result-regexp ".*$")) - (delete-region - (if keep-keyword (line-beginning-position 2) - (save-excursion - (skip-chars-backward " \r\t\n") - (line-beginning-position 2))) - (progn (forward-line) (org-babel-result-end)))))))) - -(defun org-babel-remove-inline-result (&optional datum) - "Remove the result of the current inline-src-block or babel call. -The result must be wrapped in a `results' macro to be removed. -Leading white space is trimmed." - (interactive) - (let* ((el (or datum (org-element-context)))) - (when (memq (org-element-type el) '(inline-src-block inline-babel-call)) - (org-with-wide-buffer - (goto-char (org-element-property :end el)) - (skip-chars-backward " \t") - (let ((result (save-excursion - (skip-chars-forward - " \t\n" - (org-element-property - :contents-end (org-element-property :parent el))) - (org-element-context)))) - (when (and (eq (org-element-type result) 'macro) - (string= (org-element-property :key result) "results")) - (delete-region ; And leading whitespace. - (point) - (progn (goto-char (org-element-property :end result)) - (skip-chars-backward " \t\n") - (point))))))))) - -(defun org-babel-remove-result-one-or-many (x) - "Remove the result of the current source block. -If called with a prefix argument, remove all result blocks -in the buffer." - (interactive "P") - (if x - (org-babel-map-src-blocks nil (org-babel-remove-result)) - (org-babel-remove-result))) - -(defun org-babel-result-end () - "Return the point at the end of the current set of results." - (cond ((looking-at-p "^[ \t]*$") (point)) ;no result - ((looking-at-p (format "^[ \t]*%s[ \t]*$" org-link-bracket-re)) - (line-beginning-position 2)) - (t - (let ((element (org-element-at-point))) - (if (memq (org-element-type element) - ;; Possible results types. - '(drawer example-block export-block fixed-width item - plain-list src-block table)) - (save-excursion - (goto-char (min (point-max) ;for narrowed buffers - (org-element-property :end element))) - (skip-chars-backward " \r\t\n") - (line-beginning-position 2)) - (point)))))) - -(defun org-babel-result-to-file (result &optional description) - "Convert RESULT into an Org link with optional DESCRIPTION. -If the `default-directory' is different from the containing -file's directory then expand relative links." - (when (stringp result) - (let ((same-directory? - (and buffer-file-name - (not (string= (expand-file-name default-directory) - (expand-file-name - (file-name-directory buffer-file-name))))))) - (format "[[file:%s]%s]" - (if (and default-directory buffer-file-name same-directory?) - (if (eq org-link-file-path-type 'adaptive) - (file-relative-name - (expand-file-name result default-directory) - (file-name-directory (buffer-file-name))) - (expand-file-name result default-directory)) - result) - (if description (concat "[" description "]") ""))))) - -(defun org-babel-examplify-region (beg end &optional results-switches inline) - "Comment out region using the inline `==' or `: ' org example quote." - (interactive "*r") - (let ((maybe-cap - (lambda (str) - (if org-babel-uppercase-example-markers (upcase str) str)))) - (if inline - (save-excursion - (goto-char beg) - (insert (format org-babel-inline-result-wrap - (delete-and-extract-region beg end)))) - (let ((size (count-lines beg end))) - (save-excursion - (cond ((= size 0)) ; do nothing for an empty result - ((< size org-babel-min-lines-for-block-output) - (goto-char beg) - (dotimes (_ size) - (beginning-of-line 1) (insert ": ") (forward-line 1))) - (t - (goto-char beg) - (insert (if results-switches - (format "%s%s\n" - (funcall maybe-cap "#+begin_example") - results-switches) - (funcall maybe-cap "#+begin_example\n"))) - (let ((p (point))) - (if (markerp end) (goto-char end) (forward-char (- end beg))) - (org-escape-code-in-region p (point))) - (insert (funcall maybe-cap "#+end_example\n"))))))))) - -(defun org-babel-update-block-body (new-body) - "Update the body of the current code block to NEW-BODY." - (let ((element (org-element-at-point))) - (unless (eq (org-element-type element) 'src-block) - (error "Not in a source block")) - (goto-char (org-babel-where-is-src-block-head element)) - (let* ((ind (current-indentation)) - (body-start (line-beginning-position 2)) - (body (org-element-normalize-string - (if (or org-src-preserve-indentation - (org-element-property :preserve-indent element)) - new-body - (with-temp-buffer - (insert (org-remove-indentation new-body)) - (indent-rigidly - (point-min) - (point-max) - (+ ind org-edit-src-content-indentation)) - (buffer-string)))))) - (delete-region body-start - (org-with-wide-buffer - (goto-char (org-element-property :end element)) - (skip-chars-backward " \t\n") - (line-beginning-position))) - (goto-char body-start) - (insert body)))) - -(defun org-babel-merge-params (&rest plists) - "Combine all parameter association lists in PLISTS. -Later elements of PLISTS override the values of previous elements. -This takes into account some special considerations for certain -parameters when merging lists." - (let* ((results-exclusive-groups - (mapcar (lambda (group) (mapcar #'symbol-name group)) - (cdr (assq 'results org-babel-common-header-args-w-values)))) - (exports-exclusive-groups - (mapcar (lambda (group) (mapcar #'symbol-name group)) - (cdr (assq 'exports org-babel-common-header-args-w-values)))) - (merge - (lambda (exclusive-groups &rest result-params) - ;; Maintain exclusivity of mutually exclusive parameters, - ;; as defined in EXCLUSIVE-GROUPS while merging lists in - ;; RESULT-PARAMS. - (let (output) - (dolist (new-params result-params (delete-dups output)) - (dolist (new-param new-params) - (dolist (exclusive-group exclusive-groups) - (when (member new-param exclusive-group) - (setq output (cl-remove-if - (lambda (o) (member o exclusive-group)) - output)))) - (push new-param output)))))) - (variable-index 0) ;Handle positional arguments. - clearnames - params ;Final parameters list. - ;; Some keywords accept multiple values. We need to treat - ;; them specially. - vars results exports) - (dolist (plist plists) - (dolist (pair plist) - (pcase pair - (`(:var . ,value) - (let ((name (cond - ((listp value) (car value)) - ((string-match "^\\([^= \f\t\n\r\v]+\\)[ \t]*=" value) - (intern (match-string 1 value))) - (t nil)))) - (cond - (name - (setq vars - (append (if (not (assoc name vars)) vars - (push name clearnames) - (cl-remove-if (lambda (p) (equal name (car p))) - vars)) - (list (cons name pair))))) - ((and vars (nth variable-index vars)) - ;; If no name is given and we already have named - ;; variables then assign to named variables in order. - (let ((name (car (nth variable-index vars)))) - ;; Clear out colnames and rownames for replace vars. - (push name clearnames) - (setf (cddr (nth variable-index vars)) - (concat (symbol-name name) "=" value)) - (cl-incf variable-index))) - (t (error "Variable \"%s\" must be assigned a default value" - (cdr pair)))))) - (`(:results . ,value) - (setq results (funcall merge - results-exclusive-groups - results - (split-string - (if (stringp value) value (eval value t)))))) - (`(:exports . ,value) - (setq exports (funcall merge - exports-exclusive-groups - exports - (split-string (or value ""))))) - ;; Regular keywords: any value overwrites the previous one. - (_ (setq params (cons pair (assq-delete-all (car pair) params))))))) - ;; Handle `:var' and clear out colnames and rownames for replaced - ;; variables. - (setq params (nconc (mapcar (lambda (v) (cons :var (cddr v))) vars) - params)) - (dolist (name clearnames) - (dolist (param '(:colname-names :rowname-names)) - (when (assq param params) - (setf (cdr (assq param params)) - (cl-remove-if (lambda (pair) (equal name (car pair))) - (cdr (assq param params)))) - (setq params - (cl-remove-if (lambda (pair) (and (equal (car pair) param) - (null (cdr pair)))) - params))))) - ;; Handle other special keywords, which accept multiple values. - (setq params (nconc (list (cons :results (mapconcat #'identity results " ")) - (cons :exports (mapconcat #'identity exports " "))) - params)) - ;; Return merged params. - params)) - -(defun org-babel-noweb-p (params context) - "Check if PARAMS require expansion in CONTEXT. -CONTEXT may be one of :tangle, :export or :eval." - (let ((allowed-values (cl-case context - (:tangle '("yes" "tangle" "no-export" "strip-export")) - (:eval '("yes" "no-export" "strip-export" "eval")) - (:export '("yes"))))) - (cl-some (lambda (v) (member v allowed-values)) - (split-string (or (cdr (assq :noweb params)) ""))))) - -(defun org-babel-expand-noweb-references (&optional info parent-buffer) - "Expand Noweb references in the body of the current source code block. - -For example the following reference would be replaced with the -body of the source-code block named `example-block'. - -<> - -Note that any text preceding the <> construct on a line will -be interposed between the lines of the replacement text. So for -example if <> is placed behind a comment, then the entire -replacement text will also be commented. - -This function must be called from inside of the buffer containing -the source-code block which holds BODY. - -In addition the following syntax can be used to insert the -results of evaluating the source-code block named `example-block'. - -<> - -Any optional arguments can be passed to example-block by placing -the arguments inside the parenthesis following the convention -defined by `org-babel-lob'. For example - -<> - -would set the value of argument \"a\" equal to \"9\". Note that -these arguments are not evaluated in the current source-code -block but are passed literally to the \"example-block\"." - (let* ((parent-buffer (or parent-buffer (current-buffer))) - (info (or info (org-babel-get-src-block-info 'light))) - (lang (nth 0 info)) - (body (nth 1 info)) - (ob-nww-start org-babel-noweb-wrap-start) - (ob-nww-end org-babel-noweb-wrap-end) - (new-body "") - (nb-add (lambda (text) (setq new-body (concat new-body text)))) - index source-name evaluate prefix) - (with-temp-buffer - (setq-local org-babel-noweb-wrap-start ob-nww-start) - (setq-local org-babel-noweb-wrap-end ob-nww-end) - (insert body) (goto-char (point-min)) - (setq index (point)) - (while (and (re-search-forward (org-babel-noweb-wrap) nil t)) - (save-match-data (setf source-name (match-string 1))) - (save-match-data (setq evaluate (string-match "(.*)" source-name))) - (save-match-data - (setq prefix - (buffer-substring (match-beginning 0) - (save-excursion - (beginning-of-line 1) (point))))) - ;; add interval to new-body (removing noweb reference) - (goto-char (match-beginning 0)) - (funcall nb-add (buffer-substring index (point))) - (goto-char (match-end 0)) - (setq index (point)) - (funcall - nb-add - (with-current-buffer parent-buffer - (save-restriction - (widen) - (mapconcat ;; Interpose PREFIX between every line. - #'identity - (split-string - (if evaluate - (let ((raw (org-babel-ref-resolve source-name))) - (if (stringp raw) raw (format "%S" raw))) - (or - ;; Retrieve from the Library of Babel. - (nth 2 (assoc-string source-name org-babel-library-of-babel)) - ;; Return the contents of headlines literally. - (save-excursion - (when (org-babel-ref-goto-headline-id source-name) - (org-babel-ref-headline-body))) - ;; Find the expansion of reference in this buffer. - (save-excursion - (goto-char (point-min)) - (let* ((name-regexp - (org-babel-named-src-block-regexp-for-name - source-name)) - (comment - (string= "noweb" - (cdr (assq :comments (nth 2 info))))) - (c-wrap - (lambda (s) - ;; Comment, according to LANG mode, - ;; string S. Return new string. - (unless org-babel-tangle-uncomment-comments - (with-temp-buffer - (funcall (org-src-get-lang-mode lang)) - (comment-region (point) - (progn (insert s) (point))) - (org-trim (buffer-string)))))) - (expand-body - (lambda (i) - ;; Expand body of code blocked - ;; represented by block info I. - (let ((b (if (org-babel-noweb-p (nth 2 i) :eval) - (org-babel-expand-noweb-references i) - (nth 1 i)))) - (if (not comment) b - (let ((cs (org-babel-tangle-comment-links i))) - (concat (funcall c-wrap (car cs)) "\n" - b "\n" - (funcall c-wrap (cadr cs))))))))) - (if (and (re-search-forward name-regexp nil t) - (not (org-in-commented-heading-p))) - ;; Found a source block named SOURCE-NAME. - ;; Assume it is unique; do not look after - ;; `:noweb-ref' header argument. - (funcall expand-body - (org-babel-get-src-block-info 'light)) - ;; Though luck. We go into the long process - ;; of checking each source block and expand - ;; those with a matching Noweb reference. - (let ((expansion nil)) - (org-babel-map-src-blocks nil - (unless (org-in-commented-heading-p) - (let* ((info - (org-babel-get-src-block-info 'light)) - (parameters (nth 2 info))) - (when (equal source-name - (cdr (assq :noweb-ref parameters))) - (push (funcall expand-body info) expansion) - (push (or (cdr (assq :noweb-sep parameters)) - "\n") - expansion))))) - (when expansion - (mapconcat #'identity - (nreverse (cdr expansion)) - "")))))) - ;; Possibly raise an error if named block doesn't exist. - (if (or org-babel-noweb-error-all-langs - (member lang org-babel-noweb-error-langs)) - (error "%s could not be resolved (see \ -`org-babel-noweb-error-langs')" - (org-babel-noweb-wrap source-name)) - ""))) - "[\n\r]") - (concat "\n" prefix)))))) - (funcall nb-add (buffer-substring index (point-max)))) - new-body)) - -(defun org-babel--script-escape-inner (str) - (let (in-single in-double backslash out) - (mapc - (lambda (ch) - (setq - out - (if backslash - (progn - (setq backslash nil) - (cond - ((and in-single (eq ch ?')) - ;; Escaped single quote inside single quoted string: - ;; emit just a single quote, since we've changed the - ;; outer quotes to double. - (cons ch out)) - ((eq ch ?\") - ;; Escaped double quote - (if in-single - ;; This should be interpreted as backslash+quote, - ;; not an escape. Emit a three backslashes - ;; followed by a quote (because one layer of - ;; quoting will be stripped by `org-babel-read'). - (append (list ch ?\\ ?\\ ?\\) out) - ;; Otherwise we are in a double-quoted string. Emit - ;; a single escaped quote - (append (list ch ?\\) out))) - ((eq ch ?\\) - ;; Escaped backslash: emit a single escaped backslash - (append (list ?\\ ?\\) out)) - ;; Other: emit a quoted backslash followed by whatever - ;; the character was (because one layer of quoting will - ;; be stripped by `org-babel-read'). - (t (append (list ch ?\\ ?\\) out)))) - (cl-case ch - (?\[ (if (or in-double in-single) - (cons ?\[ out) - (cons ?\( out))) - (?\] (if (or in-double in-single) - (cons ?\] out) - (cons ?\) out))) - (?\{ (if (or in-double in-single) - (cons ?\{ out) - (cons ?\( out))) - (?\} (if (or in-double in-single) - (cons ?\} out) - (cons ?\) out))) - (?, (if (or in-double in-single) - (cons ?, out) (cons ?\s out))) - (?\' (if in-double - (cons ?\' out) - (setq in-single (not in-single)) (cons ?\" out))) - (?\" (if in-single - (append (list ?\" ?\\) out) - (setq in-double (not in-double)) (cons ?\" out))) - (?\\ (unless (or in-single in-double) - (error "Can't handle backslash outside string in `org-babel-script-escape'")) - (setq backslash t) - out) - (t (cons ch out)))))) - (string-to-list str)) - (when (or in-single in-double) - (error "Unterminated string in `org-babel-script-escape'")) - (apply #'string (reverse out)))) - -(defun org-babel-script-escape (str &optional force) - "Safely convert tables into elisp lists." - (unless (stringp str) - (error "`org-babel-script-escape' expects a string")) - (let ((escaped - (cond - ((and (> (length str) 2) - (or (and (string-equal "[" (substring str 0 1)) - (string-equal "]" (substring str -1))) - (and (string-equal "{" (substring str 0 1)) - (string-equal "}" (substring str -1))) - (and (string-equal "(" (substring str 0 1)) - (string-equal ")" (substring str -1))))) - - (concat "'" (org-babel--script-escape-inner str))) - ((or force - (and (> (length str) 2) - (or (and (string-equal "'" (substring str 0 1)) - (string-equal "'" (substring str -1))) - ;; We need to pass double-quoted strings - ;; through the backslash-twiddling bits, even - ;; though we don't need to change their - ;; delimiters. - (and (string-equal "\"" (substring str 0 1)) - (string-equal "\"" (substring str -1)))))) - (org-babel--script-escape-inner str)) - (t str)))) - (condition-case nil (org-babel-read escaped) (error escaped)))) - -(defun org-babel-read (cell &optional inhibit-lisp-eval) - "Convert the string value of CELL to a number if appropriate. -Otherwise if CELL looks like lisp (meaning it starts with a -\"(\", \"\\='\", \"\\=`\" or a \"[\") then read and evaluate it as -lisp, otherwise return it unmodified as a string. Optional -argument INHIBIT-LISP-EVAL inhibits lisp evaluation for -situations in which is it not appropriate." - (cond ((not (org-string-nw-p cell)) cell) - ((org-babel--string-to-number cell)) - ((and (not inhibit-lisp-eval) - (or (memq (string-to-char cell) '(?\( ?' ?` ?\[)) - (string= cell "*this*"))) - (eval (read cell) t)) - ((eq (string-to-char cell) ?\") (read cell)) - (t (org-no-properties cell)))) - -(defun org-babel--string-to-number (string) - "If STRING represents a number return its value. -Otherwise return nil." - (and (string-match-p "\\`-?\\([0-9]\\|\\([1-9]\\|[0-9]*\\.\\)[0-9]*\\)\\'" string) - (string-to-number string))) - -(defun org-babel-import-elisp-from-file (file-name &optional separator) - "Read the results located at FILE-NAME into an elisp table. -If the table is trivial, then return it as a scalar." - (save-window-excursion - (let ((result - (with-temp-buffer - (condition-case err - (progn - (org-table-import file-name separator) - (delete-file file-name) - (delq nil - (mapcar (lambda (row) - (and (not (eq row 'hline)) - (mapcar #'org-babel-string-read row))) - (org-table-to-lisp)))) - (error (message "Error reading results: %s" err) nil))))) - (pcase result - (`((,scalar)) scalar) - (`((,_ ,_ . ,_)) result) - (`(,scalar) scalar) - (_ result))))) - -(defun org-babel-string-read (cell) - "Strip nested \"s from around strings." - (org-babel-read (or (and (stringp cell) - (string-match "\"\\(.+\\)\"" cell) - (match-string 1 cell)) - cell) t)) - -(defun org-babel-chomp (string &optional regexp) - "Strip a trailing space or carriage return from STRING. -The default regexp used is \"[ \\f\\t\\n\\r\\v]\" but another one -can be specified as the REGEXP argument." - (let ((regexp (or regexp "[ \f\t\n\r\v]"))) - (while (and (> (length string) 0) - (string-match regexp (substring string -1))) - (setq string (substring string 0 -1))) - string)) - -(defun org-babel-process-file-name (name &optional no-quote-p) - "Prepare NAME to be used in an external process. -If NAME specifies a remote location, the remote portion of the -name is removed, since in that case the process will be executing -remotely. The file name is then processed by `expand-file-name'. -Unless second argument NO-QUOTE-P is non-nil, the file name is -additionally processed by `shell-quote-argument'." - (let ((f (org-babel-local-file-name (expand-file-name name)))) - (if no-quote-p f (shell-quote-argument f)))) - -(defvar org-babel-temporary-directory) -(unless (or noninteractive (boundp 'org-babel-temporary-directory)) - (defvar org-babel-temporary-directory - (or (and (boundp 'org-babel-temporary-directory) - (file-exists-p org-babel-temporary-directory) - org-babel-temporary-directory) - (make-temp-file "babel-" t)) - "Directory to hold temporary files created to execute code blocks. -Used by `org-babel-temp-file'. This directory will be removed on -Emacs shutdown.")) - -(defcustom org-babel-remote-temporary-directory "/tmp/" - "Directory to hold temporary files on remote hosts." - :group 'org-babel - :type 'string) - -(defmacro org-babel-result-cond (result-params scalar-form &rest table-forms) - "Call the code to parse raw string results according to RESULT-PARAMS." - (declare (indent 1) - (debug (form form &rest form))) - (org-with-gensyms (params) - `(let ((,params ,result-params)) - (unless (member "none" ,params) - (if (or (member "scalar" ,params) - (member "verbatim" ,params) - (member "html" ,params) - (member "code" ,params) - (member "pp" ,params) - (member "file" ,params) - (and (or (member "output" ,params) - (member "raw" ,params) - (member "org" ,params) - (member "drawer" ,params)) - (not (member "table" ,params)))) - ,scalar-form - ,@table-forms))))) -(def-edebug-spec org-babel-result-cond (form form body)) - -(defun org-babel-temp-file (prefix &optional suffix) - "Create a temporary file in the `org-babel-temporary-directory'. -Passes PREFIX and SUFFIX directly to `make-temp-file' with the -value of `temporary-file-directory' temporarily set to the value -of `org-babel-temporary-directory'." - (if (file-remote-p default-directory) - (let ((prefix - (concat (file-remote-p default-directory) - (expand-file-name - prefix org-babel-remote-temporary-directory)))) - (make-temp-file prefix nil suffix)) - (let ((temporary-file-directory - (or (and (boundp 'org-babel-temporary-directory) - (file-exists-p org-babel-temporary-directory) - org-babel-temporary-directory) - temporary-file-directory))) - (make-temp-file prefix nil suffix)))) - -(defun org-babel-remove-temporary-directory () - "Remove `org-babel-temporary-directory' on Emacs shutdown." - (when (and (boundp 'org-babel-temporary-directory) - (file-exists-p org-babel-temporary-directory)) - ;; taken from `delete-directory' in files.el - (condition-case nil - (progn - (mapc (lambda (file) - ;; This test is equivalent to - ;; (and (file-directory-p fn) (not (file-symlink-p fn))) - ;; but more efficient - (if (eq t (car (file-attributes file))) - (delete-directory file) - (delete-file file))) - ;; We do not want to delete "." and "..". - (directory-files org-babel-temporary-directory 'full - "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*")) - (delete-directory org-babel-temporary-directory)) - (error - (message "Failed to remove temporary Org-babel directory %s" - (if (boundp 'org-babel-temporary-directory) - org-babel-temporary-directory - "[directory not defined]")))))) - -(add-hook 'kill-emacs-hook 'org-babel-remove-temporary-directory) - -(defun org-babel-one-header-arg-safe-p (pair safe-list) - "Determine if the PAIR is a safe babel header arg according to SAFE-LIST. - -For the format of SAFE-LIST, see `org-babel-safe-header-args'." - (and (consp pair) - (keywordp (car pair)) - (stringp (cdr pair)) - (or - (memq (car pair) safe-list) - (let ((entry (assq (car pair) safe-list))) - (and entry - (consp entry) - (cond ((functionp (cdr entry)) - (funcall (cdr entry) (cdr pair))) - ((listp (cdr entry)) - (member (cdr pair) (cdr entry))) - (t nil))))))) - -(defun org-babel-generate-file-param (src-name params) - "Calculate the filename for source block results. - -The directory is calculated from the :output-dir property of the -source block; if not specified, use the current directory. - -If the source block has a #+NAME and the :file parameter does not -contain any period characters, then the :file parameter is -treated as an extension, and the output file name is the -concatenation of the directory (as calculated above), the block -name, a period, and the parameter value as a file extension. -Otherwise, the :file parameter is treated as a full file name, -and the output file name is the directory (as calculated above) -plus the parameter value." - (let* ((file-cons (assq :file params)) - (file-ext-cons (assq :file-ext params)) - (file-ext (cdr-safe file-ext-cons)) - (dir (cdr-safe (assq :output-dir params))) - fname) - ;; create the output-dir if it does not exist - (when dir - (make-directory dir t)) - (if file-cons - ;; :file given; add :output-dir if given - (when dir - (setcdr file-cons (concat (file-name-as-directory dir) (cdr file-cons)))) - ;; :file not given; compute from name and :file-ext if possible - (when (and src-name file-ext) - (if dir - (setq fname (concat (file-name-as-directory (or dir "")) - src-name "." file-ext)) - (setq fname (concat src-name "." file-ext))) - (setq params (cons (cons :file fname) params)))) - params)) - -(defun org-babel-graphical-output-file (params) - "File where a babel block should send graphical output, per PARAMS. -Return nil if no graphical output is expected. Raise an error if -the output file is ill-defined." - (let ((file (cdr (assq :file params)))) - (cond (file (and (member "graphics" (cdr (assq :result-params params))) - file)) - ((assq :file-ext params) - (user-error ":file-ext given but no :file generated; did you forget \ -to name a block?")) - (t (user-error "No :file header argument given; cannot create \ -graphical result"))))) - -(defun org-babel-make-language-alias (new old) - "Make source blocks of type NEW aliases for those of type OLD. - -NEW and OLD should be strings. This function should be called -after the babel API for OLD-type source blocks is fully defined. - -Callers of this function will probably want to add an entry to -`org-src-lang-modes' as well." - (dolist (fn '("execute" "expand-body" "prep-session" - "variable-assignments" "load-session" - "edit-prep")) - (let ((sym (intern-soft (concat "org-babel-" fn ":" old)))) - (when (and sym (fboundp sym)) - (defalias (intern (concat "org-babel-" fn ":" new)) sym)))) - ;; Technically we don't need a `dolist' for just one variable, but - ;; we keep it for symmetry/ease of future expansion. - (dolist (var '("default-header-args")) - (let ((sym (intern-soft (concat "org-babel-" var ":" old)))) - (when (and sym (boundp sym)) - (defvaralias (intern (concat "org-babel-" var ":" new)) sym))))) - -(provide 'ob-core) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ob-core.el ends here diff --git a/elpa/org-9.3.6/ob-core.elc b/elpa/org-9.3.6/ob-core.elc deleted file mode 100644 index 13ca81237536310a85b3ed7f1ef48fd424b0ded4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101510 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 diff --git a/elpa/org-9.3.6/ob-css.el b/elpa/org-9.3.6/ob-css.el deleted file mode 100644 index b03e8fac..00000000 --- a/elpa/org-9.3.6/ob-css.el +++ /dev/null @@ -1,48 +0,0 @@ -;;; ob-css.el --- Babel Functions for CSS -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Since CSS can't be executed, this file exists solely for tangling -;; CSS from Org files. - -;;; Code: -(require 'ob) - -(defvar org-babel-default-header-args:css '()) - -(defun org-babel-execute:css (body _params) - "Execute a block of CSS code. -This function is called by `org-babel-execute-src-block'." - body) - -(defun org-babel-prep-session:css (_session _params) - "Return an error if the :session header argument is set. -CSS does not support sessions." - (error "CSS sessions are nonsensical")) - -(provide 'ob-css) - - - -;;; ob-css.el ends here diff --git a/elpa/org-9.3.6/ob-css.elc b/elpa/org-9.3.6/ob-css.elc deleted file mode 100644 index cce1a6edb7ba1cb17f63459a71bd73afcb937a3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 888 zcmbu7Pmj|u5XH+iUw|Wz7HL~)6QzG>>Gnb?JyZe~ZMdM_N;uA>wMgx(?G%. - -;;; Commentary: - -;; Org-Babel support for evaluating ditaa source code. -;; -;; This differs from most standard languages in that -;; -;; 1) there is no such thing as a "session" in ditaa -;; -;; 2) we are generally only going to return results of type "file" -;; -;; 3) we are adding the "file" and "cmdline" header arguments -;; -;; 4) there are no variables (at least for now) - -;;; Code: -(require 'ob) -(require 'org-compat) - -(defvar org-babel-default-header-args:ditaa - '((:results . "file") - (:exports . "results") - (:java . "-Dfile.encoding=UTF-8")) - "Default arguments for evaluating a ditaa source block.") - -(defcustom org-ditaa-jar-path (expand-file-name - "ditaa.jar" - (file-name-as-directory - (expand-file-name - "scripts" - (file-name-as-directory - (expand-file-name - "../contrib" - (file-name-directory (org-find-library-dir "org"))))))) - "Path to the ditaa jar executable." - :group 'org-babel - :type 'string) - -(defcustom org-babel-ditaa-java-cmd "java" - "Java executable to use when evaluating ditaa blocks." - :group 'org-babel - :type 'string) - -(defcustom org-ditaa-eps-jar-path - (expand-file-name "DitaaEps.jar" (file-name-directory org-ditaa-jar-path)) - "Path to the DitaaEps.jar executable." - :group 'org-babel - :version "24.4" - :package-version '(Org . "8.0") - :type 'string) - -(defcustom org-ditaa-jar-option "-jar" - "Option for the ditaa jar file. -Do not leave leading or trailing spaces in this string." - :group 'org-babel - :version "24.1" - :type 'string) - -(defun org-babel-execute:ditaa (body params) - "Execute a block of Ditaa code with org-babel. -This function is called by `org-babel-execute-src-block'." - (let* ((out-file (or (cdr (assq :file params)) - (error - "ditaa code block requires :file header argument"))) - (cmdline (cdr (assq :cmdline params))) - (java (cdr (assq :java params))) - (in-file (org-babel-temp-file "ditaa-")) - (eps (cdr (assq :eps params))) - (eps-file (when eps - (org-babel-process-file-name (concat in-file ".eps")))) - (pdf-cmd (when (and (or (string= (file-name-extension out-file) "pdf") - (cdr (assq :pdf params)))) - (concat - "epstopdf" - " " eps-file - " -o=" (org-babel-process-file-name out-file)))) - (cmd (concat org-babel-ditaa-java-cmd - " " java " " org-ditaa-jar-option " " - (shell-quote-argument - (expand-file-name - (if eps org-ditaa-eps-jar-path org-ditaa-jar-path))) - " " cmdline - " " (org-babel-process-file-name in-file) - " " (if pdf-cmd - eps-file - (org-babel-process-file-name out-file))))) - (unless (file-exists-p org-ditaa-jar-path) - (error "Could not find ditaa.jar at %s" org-ditaa-jar-path)) - (with-temp-file in-file (insert body)) - (message cmd) (shell-command cmd) - (when pdf-cmd (message pdf-cmd) (shell-command pdf-cmd)) - nil)) ;; signal that output has already been written to file - -(defun org-babel-prep-session:ditaa (_session _params) - "Return an error because ditaa does not support sessions." - (error "Ditaa does not support sessions")) - -(provide 'ob-ditaa) - - - -;;; ob-ditaa.el ends here diff --git a/elpa/org-9.3.6/ob-ditaa.elc b/elpa/org-9.3.6/ob-ditaa.elc deleted file mode 100644 index 63247cf4e0c42a909c9d519f17d8918cee1a26b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3130 zcmbtWS#R4$5O&f=O=Pq{(T6^EOeeJzgsON*@&N;NEf+}9)<&E>6qbRmsFlQ+BAH!M zw)^Y*%`PR{agT?{rnH=$ot^WWIXLM;EJUPfDV2`1 zl>B}tFgw?AF(;8El;uUdi2o7=wsogzHs8);O;bprQcF#f+f*##h$dO23l*m`{R+EE z7bGSVIid9}-d@Mwdmv+yK}MPt6lG~4z+4tncNdh@Jvu*r{hFe=P$DXz;wy8#NGGH- zibP6dNl7N|T~e8%NeY$3Qc*DnqaWCN;et>4umYd@X*Qd!@ogd9D4R%fMnSiW$J-kD z9xwRu@zNbQbfM&jGFFnZF=c9o6N_9Fm*lsb+duaDG?Y_OCUCTxl?#~`2ur3&E=5uz zV(E+oP2xfb_^VWrq;Zl(SDo*gt%;m2g)%b7Vk{FE1eWB^CETf82-N%b=uWG(ucXGN zrVcqAcc)FQeR-2-%F?QBLw+xog8AGbb9Q73E1}8ZySG2PyG|P?x1VD_9Q4}lfAj;J zk0-zr4u|;e;pyWUi~@F$=Y9W0?JAFXD}FCvelPq_ewMc4?;C!|UCH+$-}mr4s=6tQ^vnq;Fsf%m@A4iE$(uL<^F-G}tNR5--_d>ad?3|`$ z8gbq6FV`GxUv%pnsqW?!VgIlmyk?zx&=HzjO*nn}UvIDhTU#T?{#VK%Zm1xaqvN7* zk%2~q4peYVRU4`+G*nYEDl&CTj*e8E7uq4G)A@l5RmJ1G+%+pQOdz+Dc&r4UgpD}m zT$1Nsl5@s378#0CR+))wN#4k)EZ8L-hxTVGEAu)vX}`G5C0S^x$!o_gg&Qpp`DAcxpKrWbQ}M)cPnLW(LU{=`-o^y)NiOIpKKaF#~FuT;l%nwa-6u~$@f!{Pe#T#T01_O-~$CR3iS|?9d@Smr3G&C^Mk>YQ6yI zeAGNl8<97$F0`AIbDWjQ#9+WQ#+YWj$N)#8pcl|&CJT35PNx_#A|=r%KuM+Ij*-gi z)s}5b^pZ_BE$O903vnggdTg>yk-@jisn~nQsc8BkzhZP+qD!F@VYKBIMiMHGq gX6pOb%Yn3EWsAS(d2CAy*|UrRtvlJ+W`Dc+HwZhU+W-In diff --git a/elpa/org-9.3.6/ob-dot.el b/elpa/org-9.3.6/ob-dot.el deleted file mode 100644 index df83068b..00000000 --- a/elpa/org-9.3.6/ob-dot.el +++ /dev/null @@ -1,92 +0,0 @@ -;;; ob-dot.el --- Babel Functions for dot -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Org-Babel support for evaluating dot source code. -;; -;; For information on dot see http://www.graphviz.org/ -;; -;; This differs from most standard languages in that -;; -;; 1) there is no such thing as a "session" in dot -;; -;; 2) we are generally only going to return results of type "file" -;; -;; 3) we are adding the "file" and "cmdline" header arguments -;; -;; 4) there are no variables (at least for now) - -;;; Code: -(require 'ob) - -(defvar org-babel-default-header-args:dot - '((:results . "file") (:exports . "results")) - "Default arguments to use when evaluating a dot source block.") - -(defun org-babel-expand-body:dot (body params) - "Expand BODY according to PARAMS, return the expanded body." - (let ((vars (org-babel--get-vars params))) - (mapc - (lambda (pair) - (let ((name (symbol-name (car pair))) - (value (cdr pair))) - (setq body - (replace-regexp-in-string - (concat "$" (regexp-quote name)) - (if (stringp value) value (format "%S" value)) - body - t - t)))) - vars) - body)) - -(defun org-babel-execute:dot (body params) - "Execute a block of Dot code with org-babel. -This function is called by `org-babel-execute-src-block'." - (let* ((out-file (cdr (or (assq :file params) - (error "You need to specify a :file parameter")))) - (cmdline (or (cdr (assq :cmdline params)) - (format "-T%s" (file-name-extension out-file)))) - (cmd (or (cdr (assq :cmd params)) "dot")) - (coding-system-for-read 'utf-8) ;use utf-8 with sub-processes - (coding-system-for-write 'utf-8) - (in-file (org-babel-temp-file "dot-"))) - (with-temp-file in-file - (insert (org-babel-expand-body:dot body params))) - (org-babel-eval - (concat cmd - " " (org-babel-process-file-name in-file) - " " cmdline - " -o " (org-babel-process-file-name out-file)) "") - nil)) ;; signal that output has already been written to file - -(defun org-babel-prep-session:dot (_session _params) - "Return an error because Dot does not support sessions." - (error "Dot does not support sessions")) - -(provide 'ob-dot) - - - -;;; ob-dot.el ends here diff --git a/elpa/org-9.3.6/ob-dot.elc b/elpa/org-9.3.6/ob-dot.elc deleted file mode 100644 index 81d657bb0b9e64eb2878ceca0b92fb6569b8297e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2146 zcmbtVTTdHD6y_30>b^H^Uvj*Fun~jy;tQ9TxWEHa+aSnGgd=r4JGNJ>cg)N##QpXC z&a49oy+~DzW|=wn`Oald&VN09y|S{>I5|0?Q!|@qxla8dE9iVCm7{xYU1kc3dk2Z< zJY?mRWS*0mm)R`)QrRKUoj3*g@x7qwz7+pfcwc_tlzc#OPO6RhMT z-n!{V9ST-Yhe;T&HSvwGVypzKgVn|AZN6kye;5ptD8!0(*07JGaCI1W;$hs2u?hPD z-8{Jx6I}}6=4dA83ZGjoMvGDlWl~LXw@RibZJ*P@z>BcQ)Ba;jCkOp}3Tq-TBo&W`r6{7Aa z3bq3iCC16;lD7*wC;CMTe~#*6`TUNfhM)#rS#H+|kCWMavG1AYYjqlEGQ@h9w1Dp9w| zM{J-PK{XDWD4Q6R7{W1J#Sn|T8%*u7(YU`2m7Zn2JA6!DBMH+_0~X2_yZ3~_XRv8oz0i{B9^4P`8`7Gg?#2B_DbHCuUQl%8cn!` zEA>nu`=}9_VrD)kKiCY}J@(^STZ;+{KA4IMjl7{v-CV0|yg>SEkvV4TOk=nPbgX7+ zo)u5ECEoA2zz=#~ok(=43;#~ACH3II>#6hOU-AU#S<)I^mq;~ f%i}*C;~JgMw>V0=e2W$?eV<`m;PDd3al7#s&SH8C diff --git a/elpa/org-9.3.6/ob-ebnf.el b/elpa/org-9.3.6/ob-ebnf.el deleted file mode 100644 index 65151bf2..00000000 --- a/elpa/org-9.3.6/ob-ebnf.el +++ /dev/null @@ -1,81 +0,0 @@ -;;; ob-ebnf.el --- Babel Functions for EBNF -*- lexical-binding: t; -*- - -;; Copyright (C) 2013-2020 Free Software Foundation, Inc. - -;; Author: Michael Gauland -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org -;; Version: 1.00 - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;;; Org-Babel support for using ebnf2ps to generate encapsulated postscript -;;; railroad diagrams. It recognizes these arguments: -;;; -;;; :file is required; it must include the extension '.eps.' All the rules -;;; in the block will be drawn in the same file. This is done by -;;; inserting a '[' comment at the start of the block (see the -;;; documentation for ebnf-eps-buffer for more information). -;;; -;;; :style specifies a value in ebnf-style-database. This provides the -;;; ability to customize the output. The style can also specify the -;;; grammar syntax (by setting ebnf-syntax); note that only ebnf, -;;; iso-ebnf, and yacc are supported by this file. - -;;; Requirements: - -;;; Code: -(require 'ob) -(require 'ebnf2ps) - -;; optionally declare default header arguments for this language -(defvar org-babel-default-header-args:ebnf '((:style . nil))) - -;; Use ebnf-eps-buffer to produce an encapsulated postscript file. -;; -(defun org-babel-execute:ebnf (body params) - "Execute a block of Ebnf code with org-babel. -This function is called by `org-babel-execute-src-block'." - (save-excursion - (let* ((dest-file (cdr (assq :file params))) - (dest-dir (file-name-directory dest-file)) - (dest-root (file-name-sans-extension - (file-name-nondirectory dest-file))) - (style (cdr (assq :style params))) - (result nil)) - (with-temp-buffer - (when style (ebnf-push-style style)) - (let ((comment-format - (cond ((string= ebnf-syntax 'yacc) "/*%s*/") - ((string= ebnf-syntax 'ebnf) ";%s") - ((string= ebnf-syntax 'iso-ebnf) "(*%s*)") - (t (setq result - (format "EBNF error: format %s not supported." - ebnf-syntax)))))) - (setq ebnf-eps-prefix dest-dir) - (insert (format comment-format (format "[%s" dest-root))) - (newline) - (insert body) - (newline) - (insert (format comment-format (format "]%s" dest-root))) - (ebnf-eps-buffer) - (when style (ebnf-pop-style)))) - result))) - -(provide 'ob-ebnf) -;;; ob-ebnf.el ends here diff --git a/elpa/org-9.3.6/ob-ebnf.elc b/elpa/org-9.3.6/ob-ebnf.elc deleted file mode 100644 index 1c73a5ea22bee6326a5b60bee8720de238cd4848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1456 zcmbtU-EZ4A5O_SJ?^43h-H+nMA>o^zsyZNplG`d?OujBKq-ofiO8f%QfXZD zkMEJn$AUgq0EIjL?&HVf9p}q;r@svbgJ?dV!>Qi1vJq8Kq=My!aSK<%Sg94zVw?x$ zi*##XO#`}hawESohp-(-0sMC@Ez}qVIx8$xTg5h#L#4TOMyd<@98qH(u&NRj+-1p* z$MpDz7?s8tN;}|MIfllatI12;QDpJ)^vxUKYi1aCNbz|{&r}6g17`|K0gYx4lH44{ zf?%eR!hl<&ADd_(f4kXEB@^@wt;m zfG$Cls-~?y2bx5~O4L`(fHoJTWTj{bZm_O#WG%29hA?wsPrL^l4TmSzZ5xp!Np$c> zMky?>1@D{y24$o9CFmNK-ZbzDH-8s*9QBvoDegM}@ZveP1>S18g->^8MD!tvHJpT? zM_BJ+t>D$)um6L879SSxKPJBi-mH<#!qE@DJ>7$|X*R*4(2V*z?5t>BEKtgK_VGW# zHQn9!V)6JEnyqqQxGdW@=$3u%>*)Qn92fdzQ(VOpbjxNdEI3V{p;7S&i=2}I>e+6n z{vL`H!=@gXc_2rLei(RQatkaxFuezgTi~q+W<9XVF-o3idzcSNt!P1apZw}~cWxm1 z)MGL4>E=0j;pyH({r?V=hYr)=urIQ4IzLR`25WB?@yAG{H zL~BWFL@lr3Bn-3v5gcVfDr`CKwAqF!@AoWI7O&X}6<&&aV;t0b`@Ypc$p$Wj5{6-$ zEAfStU0vfW#xQbX(~e@;uuDPiryvb;km0?izV)ZS;E7V-0YOFnSNJ+`=J2KR#NezC z7^uOeY?_-4I34}z+Rm;?=zG{Q&LMs=I<%t~aX=xSAKDn3S(7j$@z8@w47D~JOcF0& z{q-jZW3)NB-8<|bDciNJHcnLI7~(S@1&`NAg@b(VwNPeX+M5#xz13~cDK X3{!fXoZ}?7Mqf#M2aa?Z$RyEsX>X+# diff --git a/elpa/org-9.3.6/ob-emacs-lisp.el b/elpa/org-9.3.6/ob-emacs-lisp.el deleted file mode 100644 index 095fbdb4..00000000 --- a/elpa/org-9.3.6/ob-emacs-lisp.el +++ /dev/null @@ -1,113 +0,0 @@ -;;; ob-emacs-lisp.el --- Babel Functions for Emacs-lisp Code -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Org-Babel support for evaluating emacs-lisp code - -;;; Code: - -(require 'ob-core) - -(declare-function org-babel--get-vars "ob" (params)) -(declare-function org-babel-result-cond "ob" (result-params scalar-form &rest table-forms)) -(declare-function org-babel-reassemble-table "ob" (table colnames rownames)) -(declare-function org-babel-pick-name "ob" (names selector)) - -(defconst org-babel-header-args:emacs-lisp '((lexical . :any)) - "Emacs-lisp specific header arguments.") - -(defvar org-babel-default-header-args:emacs-lisp '((:lexical . "no")) - "Default arguments for evaluating an emacs-lisp source block. - -A value of \"yes\" or t causes source blocks to be eval'd using -lexical scoping. It can also be an alist mapping symbols to -their value. It is used both as the optional LEXICAL argument to -`eval', and as the value for `lexical-binding' in buffers created -by `org-edit-src-code'.") - -(defun org-babel-expand-body:emacs-lisp (body params) - "Expand BODY according to PARAMS, return the expanded body." - (let ((vars (org-babel--get-vars params)) - (print-level nil) - (print-length nil)) - (if (null vars) (concat body "\n") - (format "(let (%s)\n%s\n)" - (mapconcat - (lambda (var) - (format "%S" (print `(,(car var) ',(cdr var))))) - vars "\n ") - body)))) - -(defun org-babel-execute:emacs-lisp (body params) - "Execute a block of emacs-lisp code with Babel." - (save-window-excursion - (let* ((lexical (cdr (assq :lexical params))) - (result-params (cdr (assq :result-params params))) - (body (format (if (member "output" result-params) - "(with-output-to-string %s\n)" - "(progn %s\n)") - (org-babel-expand-body:emacs-lisp body params))) - (result (eval (read (if (or (member "code" result-params) - (member "pp" result-params)) - (concat "(pp " body ")") - body)) - (org-babel-emacs-lisp-lexical lexical)))) - (org-babel-result-cond result-params - (let ((print-level nil) - (print-length nil)) - (if (or (member "scalar" result-params) - (member "verbatim" result-params)) - (format "%S" result) - (format "%s" result))) - (org-babel-reassemble-table - result - (org-babel-pick-name (cdr (assq :colname-names params)) - (cdr (assq :colnames params))) - (org-babel-pick-name (cdr (assq :rowname-names params)) - (cdr (assq :rownames params)))))))) - -(defun org-babel-emacs-lisp-lexical (lexical) - "Interpret :lexical source block argument. -Convert LEXICAL into the form appropriate for `lexical-binding' -and the LEXICAL argument to `eval'." - (if (listp lexical) - lexical - (not (null (member lexical '("yes" "t")))))) - -(defun org-babel-edit-prep:emacs-lisp (info) - "Set `lexical-binding' in Org edit buffer. -Set `lexical-binding' in Org edit buffer according to the -corresponding :lexical source block argument." - (setq lexical-binding - (org-babel-emacs-lisp-lexical - (org-babel-read - (cdr (assq :lexical (nth 2 info))))))) - -(org-babel-make-language-alias "elisp" "emacs-lisp") - -(provide 'ob-emacs-lisp) - - - -;;; ob-emacs-lisp.el ends here diff --git a/elpa/org-9.3.6/ob-emacs-lisp.elc b/elpa/org-9.3.6/ob-emacs-lisp.elc deleted file mode 100644 index 2ca22b21e59be4a31fcd7263d935b168f125f1bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3301 zcmbtWS#R4$5O(6k0o0fFsmDvlbPP*{DTs$8A4LPor3dW)LNGF&9BjH!{m3 zm5|$OduHV}(lZiqOe)pUJo;N`Ea&ZpS^Rw#Sz4ka9(V zNN6l6R^q)ws;lHAMHWXgBRzwl>y_sMg3tP~0iXM8G#brJzAd6m(t#S=fy!j7vG>$F zF1=yLQJzws${?Bm)|tcwGZNXfn9D@x?e81SP)>jr5LVgL9*ePz?NZE!Sbieesim5O zW;2%WqCmvdrW27YS}khsJ;uOy`z>><@6x%Ph$4o=>O*LvGLknUF5vlON`P=pX|9Sa zkTi}}@CLXJhy^9730Vu7Td<1YPGO>BT{b7J*k`QxAVl;)b)z;f4^)bAo9L1^CkQ`y z8PcX3;j(j)vIOOe`B=rQtf6Nz%F5%*jfhMf8`4;D07GU5yAZ=F0Rqo2{=7UJJYQau zHM};)9O9I)mM?F^2)wS0v&T^q;^+eo=5aBZAQ&mgq|nHu@q%8nA7mJ5JI?|*G?WLG zn{Gt5<|O!yasGs}PHH&XWF^X4daLV~-s&IG#k-V^efHw~FA@Qwhb?1dUk+Xkez`iN zOzI*_%+;llHF$&zxT-lx%8jLLtBfTPM}X>J6-?zed#u96dNA!>cO9Rsq1SQm?V|OD zuH$_3Ew@9rnT23QyI8 z8;O#$jA?r+wG9MOAEFrNCKku#TxhZo)tZ|7d25*L=fk9BadaRj0xa%byWPGqvxCDO zeD3yBwBEzP`T6e9stl-A?O$2t`Si9>T8@bKCc}iW`eX2_WsP`D=7;`ql|RS*UTee& z)a$_|GAJ}cwaf|5gtc_xcpy_zpK+@GA2%4acesG~O89(yOQavdFHQ${1lW(^7{Kqi z_lK_68=&WH*F9`A6C~Yoh5cnnqaGx3s+{Y{LQ_o<(&-)#q?z`J2 z0$u2I>N)tu;=BOH1{~i9Xg;9wdpiil(tCb?=Zmrnm+)e@Q%`tZXJswpA}Rky46fGHBIW_ zs$ASrwYb2eCW??O&P3=>Q$8e334f>@YZ{isiNaK}CaQ44dvZ{y$k4$9V+?TS=+5*! z#veb0@Rx~Ov`~gN#6YsN7GqvC^@|IQwQu;bW^I_2=W-4i+eoh2l19NB8!szKCxME& zV@COMh+d{{*B7c`J|d@ERVl~oAD3myK~20&@Qg~q4=Z1+^YfAz+l@1o;G%j-nW)vu zFbX@1K*X6s%?AIOm%;{5HkhH9dp|0v=@s9%8~;`EeNqMp4RACf zK2_!o@vqPulD_=)=NETk!Ve92F@2vHYSJ@=S98OIBU2T2k*<#OWd+LzubQ=>Td~$M z0an>za%h>v?udFdqDQ{r!se<{phUqJ75j3*11VK>RaK7bm10w6Vv$S>F_m`t8nGll YgOM;RlbEK}O$0K0AFR-KmY&$ diff --git a/elpa/org-9.3.6/ob-eshell.el b/elpa/org-9.3.6/ob-eshell.el deleted file mode 100644 index 4edd3cf6..00000000 --- a/elpa/org-9.3.6/ob-eshell.el +++ /dev/null @@ -1,109 +0,0 @@ -;;; ob-eshell.el --- Babel Functions for Eshell -*- lexical-binding: t; -*- - -;; Copyright (C) 2018-2020 Free Software Foundation, Inc. - -;; Author: stardiviner -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Org Babel support for evaluating Eshell source code. - -;;; Code: -(require 'ob) -(require 'eshell) - -(declare-function eshell-send-input "esh-mode" - (&optional use-region queue-p no-newline)) - -(defvar eshell-last-output-start) -(defvar eshell-last-output-end) -(defvar eshell-last-input-end) - -(defvar org-babel-default-header-args:eshell '()) - -(defun org-babel-execute:eshell (body params) - "Execute a block of Eshell code BODY with PARAMS. -This function is called by `org-babel-execute-src-block'. - -The BODY can be any code which allowed executed in Eshell. -Eshell allow to execute normal shell command and Elisp code. -More details please reference Eshell Info. - -The PARAMS are variables assignments." - (let* ((session (org-babel-eshell-initiate-session - (cdr (assq :session params)))) - (full-body (org-babel-expand-body:generic - body params (org-babel-variable-assignments:eshell params)))) - (if session - (progn - (with-current-buffer session - (dolist (line (split-string full-body "\n")) - (goto-char eshell-last-output-end) - (insert line) - (eshell-send-input)) - ;; get output of last input - ;; TODO: collect all output instead of last command's output. - (goto-char eshell-last-input-end) - (buffer-substring-no-properties (point) eshell-last-output-start))) - (with-temp-buffer - (eshell-command full-body t) - (buffer-string))))) - -(defun org-babel-prep-session:eshell (session params) - "Prepare SESSION according to the header arguments specified in PARAMS." - (let* ((session (org-babel-eshell-initiate-session session)) - ;; Eshell session buffer is read from variable `eshell-buffer-name'. - (eshell-buffer-name session) - (var-lines (org-babel-variable-assignments:eshell params))) - (call-interactively #'eshell) - (mapc #'eshell-command var-lines) - session)) - -(defun ob-eshell-session-live-p (session) - "Non-nil if Eshell SESSION exists." - (get-buffer session)) - -(defun org-babel-eshell-initiate-session (&optional session _params) - "Initiate a session named SESSION." - (when (and session (not (string= session "none"))) - (save-window-excursion - (unless (ob-eshell-session-live-p session) - (let ((eshell-buffer-name session)) (eshell)))) - session)) - -(defun org-babel-variable-assignments:eshell (params) - "Convert ob-eshell :var specified variables into Eshell variables assignments." - (mapcar - (lambda (pair) - (format "(setq %s %S)" (car pair) (cdr pair))) - (org-babel--get-vars params))) - -(defun org-babel-load-session:eshell (session body params) - "Load BODY into SESSION with PARAMS." - (save-window-excursion - (let ((buffer (org-babel-prep-session:eshell session params))) - (with-current-buffer buffer - (goto-char (point-max)) - (insert (org-babel-chomp body))) - buffer))) - -(provide 'ob-eshell) - -;;; ob-eshell.el ends here diff --git a/elpa/org-9.3.6/ob-eshell.elc b/elpa/org-9.3.6/ob-eshell.elc deleted file mode 100644 index 5e1aa12e727772d0444167db6595b824d35cd885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3123 zcmcguU2oeq6t$BUSp5gKJ?+M6SG%Y(eZ+R1Jgi>lhXDOT(}xXlfYK6e6Ol<(q~m74 zeut!FyKS016qo^75_!dYdC$4$@^t+2#gC0fqjh?EN-xy15IN7>i;y&4vQ*PGFSSsT z;{H+MX4b+ih~+t{!ic5#hZ#)kqn4X|zYv;cScO)aYszjUTZ)u2m1d`lWHrPI4g6(OEL=>#)gvI+($D!n2#qp@2Rxko5}y!rEQa>&0Oy&JtcKWcfTS2DHm6HrgV z2|zl%p$}W<+%FsGG7a3qkCE*6i)z6NCnj&am-RxVj$3Mtm8x$&OI$2RttuwCQfo4* zwgDx|CCjOfc)7Gpu-7;jx^Sx>wO%QtE8}2NuBpg5)0|2^<0Y3VueW<9XR3G(G+*4RziRFM83jgEs-9$9t1F>5mTZ z*xTR7fB*i$VG}4Pr;W1tvBG}PoFpJY8?TX_`>kQ0p8qg)^LR|XVHA;lXpSavzYoLM zUO!vo@PW5YqWHr^PTE~N^H&4QB8uqvpoC3Sxr=%j>f;(rk{Gm$qx*<2j^RIvlZUXx zWQ@p@xaVTBHhp>mr?Cy)64a9{$eA{QTA5;H0uDrWhlRXtv@+I)m1c*?)rUd~BN%D~ z0^^kFq<+}VcLDH&smg9n=3Md;8nm6Q!3=h=tfA3GE==IX3JA$|9j`|0fs2=>s~JcW z=+)HQ1yTh?sR~{i0fsn-HbBYOfw!eLJu!S)JZaOCUGZRB zNaHoMFJ%TgoElZqMdcj2%IQkvdF27cUq_lMPk*xs)Jg9pff}8|hjc`}IPPBB${!~5 zw&aCn`1$z!{OrwZVri<%3{q{&%b-%dZlDV0E5~}$1y99Hc=@j7z*R!M#@)qGz+(+w zo%U@-M0?0X6#Zn=fX5_sC1S^{`hk{Vf6p_nX$ibTwB5{X!TuI&wib8M!HODCM~6Y1 z5!XDwsj>_li}Z_(U(%pTaMVkNKEuaDdX07kr6sYE)H+Z6lh7L(sRqB0kZDkDpdxvY zBZ{D)!;82#@ExLQiDUCH=Vrr(q>kj-F!7P}`*c>74phFb8Ox)r2EP)tUu|bs5_(z( zdN-ioO0fksrgqcvy3>Gug;1^}{N2CfH75Kyd~tWs;y$oSu5vigN6`+;((F#wrBw#;gAF zHvQY-6|k_nWK)l>;}~X1kI=p_+Izk~I;<>awh_9yLa=gjIB8{Io_4cT%OtVdU@)#`tw. - -;;; Commentary: - -;; These functions build existing Emacs support for executing external -;; shell commands. - -;;; Code: -(require 'org-macs) - -(defvar org-babel-error-buffer-name "*Org-Babel Error Output*") -(declare-function org-babel-temp-file "ob-core" (prefix &optional suffix)) - -(defun org-babel-eval-error-notify (exit-code stderr) - "Open a buffer to display STDERR and a message with the value of EXIT-CODE." - (let ((buf (get-buffer-create org-babel-error-buffer-name))) - (with-current-buffer buf - (goto-char (point-max)) - (save-excursion (insert stderr))) - (display-buffer buf)) - (message "Babel evaluation exited with code %S" exit-code)) - -(defun org-babel-eval (cmd body) - "Run CMD on BODY. -If CMD succeeds then return its results, otherwise display -STDERR with `org-babel-eval-error-notify'." - (let ((err-buff (get-buffer-create " *Org-Babel Error*")) exit-code) - (with-current-buffer err-buff (erase-buffer)) - (with-temp-buffer - (insert body) - (setq exit-code - (org-babel--shell-command-on-region - (point-min) (point-max) cmd err-buff)) - (if (or (not (numberp exit-code)) (> exit-code 0)) - (progn - (with-current-buffer err-buff - (org-babel-eval-error-notify exit-code (buffer-string))) - (save-excursion - (when (get-buffer org-babel-error-buffer-name) - (with-current-buffer org-babel-error-buffer-name - (unless (derived-mode-p 'compilation-mode) - (compilation-mode)) - ;; Compilation-mode enforces read-only, but Babel expects the buffer modifiable. - (setq buffer-read-only nil)))) - nil) - (buffer-string))))) - -(defun org-babel-eval-read-file (file) - "Return the contents of FILE as a string." - (with-temp-buffer (insert-file-contents file) - (buffer-string))) - -(defun org-babel--shell-command-on-region (start end command error-buffer) - "Execute COMMAND in an inferior shell with region as input. - -Stripped down version of shell-command-on-region for internal use -in Babel only. This lets us work around errors in the original -function in various versions of Emacs. -" - (let ((input-file (org-babel-temp-file "ob-input-")) - (error-file (if error-buffer (org-babel-temp-file "ob-error-") nil)) - ;; Unfortunately, `executable-find' does not support file name - ;; handlers. Therefore, we could use it in the local case - ;; only. - (shell-file-name - (cond ((and (not (file-remote-p default-directory)) - (executable-find shell-file-name)) - shell-file-name) - ((file-executable-p - (concat (file-remote-p default-directory) shell-file-name)) - shell-file-name) - ("/bin/sh"))) - exit-status) - ;; There is an error in `process-file' when `error-file' exists. - ;; This is fixed in Emacs trunk as of 2012-12-21; let's use this - ;; workaround for now. - (unless (file-remote-p default-directory) - (delete-file error-file)) - ;; we always call this with 'replace, remove conditional - ;; Replace specified region with output from command. - (let ((swap (< start end))) - (goto-char start) - (push-mark (point) 'nomsg) - (write-region start end input-file) - (delete-region start end) - (setq exit-status - (process-file shell-file-name input-file - (if error-file - (list t error-file) - t) - nil shell-command-switch command)) - (when swap (exchange-point-and-mark))) - - (when (and input-file (file-exists-p input-file) - ;; bind org-babel--debug-input around the call to keep - ;; the temporary input files available for inspection - (not (when (boundp 'org-babel--debug-input) - org-babel--debug-input))) - (delete-file input-file)) - - (when (and error-file (file-exists-p error-file)) - (when (< 0 (file-attribute-size (file-attributes error-file))) - (with-current-buffer (get-buffer-create error-buffer) - (let ((pos-from-end (- (point-max) (point)))) - (or (bobp) - (insert "\f\n")) - ;; Do no formatting while reading error file, - ;; because that can run a shell command, and we - ;; don't want that to cause an infinite recursion. - (format-insert-file error-file nil) - ;; Put point after the inserted errors. - (goto-char (- (point-max) pos-from-end))) - (current-buffer))) - (delete-file error-file)) - exit-status)) - -(defun org-babel-eval-wipe-error-buffer () - "Delete the contents of the Org code block error buffer. -This buffer is named by `org-babel-error-buffer-name'." - (when (get-buffer org-babel-error-buffer-name) - (with-current-buffer org-babel-error-buffer-name - (delete-region (point-min) (point-max))))) - -(provide 'ob-eval) - - - -;;; ob-eval.el ends here diff --git a/elpa/org-9.3.6/ob-eval.elc b/elpa/org-9.3.6/ob-eval.elc deleted file mode 100644 index ee3937408ee6ac4c314314b18c39458a9f5e6818..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3345 zcmc&$-%lGy5Vk{Nz?CZXscK$2n6zM&bMA+KVDZuf90@5Y70|Q^reb}!wpX0*oZUMJ zRsQ&Xvv;N@QRqV+>gdSs&hF06%s1c6-r&{#_mxVezPGnW`{``1Vj0p`k0O zjY<>pyRE=Vu2nWA5yzCyGc{9xiwt7Zs$1ddR2drM7Rrq@6x}3Zrb3F+&}3RA6Y~^O zZ88#3BqO@j;`Lj8|Fb)y6n7+PMq!#{0-N(}?CfGCah{*-A0ART60zk0pCt>yb%X-QkDo;VzWW_>%7 z<13+wS4LtaV@GP8YG;&>$5K1+v82Y%5u`6zN&}YCQJ&57Y^TwzZ~oHn)6rZeB&aw; zSxS*I^H|)_$?3u1_?Xytf@abfF_C1WoJ}QNi8z;(j%o1c;i@T(g` zzuSF)VSul_GHeWex7VPv`+PBx*}^xWmLii2Tg%m3D;tHsBpYdQO!9-u08DFsm`0L* zI%%9!hqgDLP>b4qzj@C7^nwl@=Lzkwg2%PYa-ERM z42C9;Go(NYiN03m_FeTd23GCGl4+m%ZmV=Y>t&_)Iep2`KKpNj9jL3;*BEw)o!rEz zi?6p7h+%**1fGWv2R%66Yd^wiuLJJ~UiS$Oc2{hSFzv~xwpy!UvFksm4*hly5ej;h zDrDXp9{*L*4@#}Ri%|L=aTr-Sf{nSqhA6wi+lpRW?1NIj&8zJ<6&~8hvH{;U`N?fa z{0o+Nw8NUA_&;G$rV9`eIcXB#(C0X5(5Gp%)1XAfB(*Sd0iTIXFwdlu$m_)#PG)j8 z$M%`H#LgRtEr8qt>3Fou_H@?qYL^3Ir-1Sm*ew(pm^RFiwr9&(eW~KO)NoGz5&<}7 zDj^Ef*$jyba~v%v%+vRPr_6n)pyDO#DUw=U$;g=j@y;A{%ay<;gk3r(&nq)v*Y6h@ z&*v27aJ@vuQVCdJ0V);)1y_~Phuc*G)`!neP;lpSa9NaIC%0uB z@%a*R#<)@8bvh9-m+v~X75vD_(jv0OJ(h@aZsiiWxZb0-|ogcNq0*>-e|2$>^-D)z&^1F!kN_8h-qQ5O?`r zZS{a364?pP1;eB^9RG|RU|F2;c&lNlUr;0NTj4dx+PoY*w9j5l*=SUNVuM@x1|x8& z-RiY@s|RLgDYn_;Y|Ot?B%0sFw!rUIcP-!kQQXz*RrD|j+(#Rhxuc7BX>oOzuL-=e zN(BBxYlNl!sQM1xK~)EnFT93QV3QP`jzE!gBD6qEhc_i$nHP#i=PrB=N@h4+Vm&94 zqkQ7nELd7*ZZ62Bk&X(f(;yxftyIHyt>B==qR|aqEESEUpx6+hQ1?)oRxN0fBJl A{r~^~ diff --git a/elpa/org-9.3.6/ob-exp.el b/elpa/org-9.3.6/ob-exp.el deleted file mode 100644 index bbf9b55a..00000000 --- a/elpa/org-9.3.6/ob-exp.el +++ /dev/null @@ -1,412 +0,0 @@ -;;; ob-exp.el --- Exportation of Babel Source Blocks -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2020 Free Software Foundation, Inc. - -;; Authors: Eric Schulte -;; Dan Davison -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Code: -(require 'ob-core) - -(declare-function org-babel-lob-get-info "ob-lob" (&optional datum)) -(declare-function org-element-at-point "org-element" ()) -(declare-function org-element-context "org-element" (&optional element)) -(declare-function org-element-property "org-element" (property element)) -(declare-function org-element-type "org-element" (element)) -(declare-function org-escape-code-in-string "org-src" (s)) -(declare-function org-export-copy-buffer "ox" ()) -(declare-function org-in-commented-heading-p "org" (&optional no-inheritance)) - -(defvar org-src-preserve-indentation) - -(defcustom org-export-use-babel t - "Switch controlling code evaluation and header processing during export. -When set to nil no code will be evaluated as part of the export -process and no header arguments will be obeyed. Users who wish -to avoid evaluating code on export should use the header argument -`:eval never-export'." - :group 'org-babel - :version "24.1" - :type '(choice (const :tag "Never" nil) - (const :tag "Always" t)) - :safe #'null) - - -(defmacro org-babel-exp--at-source (&rest body) - "Evaluate BODY at the source of the Babel block at point. -Source is located in `org-babel-exp-reference-buffer'. The value -returned is the value of the last form in BODY. Assume that -point is at the beginning of the Babel block." - (declare (indent 1) (debug body)) - `(let ((source (get-text-property (point) 'org-reference))) - ;; Source blocks created during export process (e.g., by other - ;; source blocks) are not referenced. In this case, do not move - ;; point at all. - (with-current-buffer (if source org-babel-exp-reference-buffer - (current-buffer)) - (org-with-wide-buffer - (when source (goto-char source)) - ,@body)))) - -(defun org-babel-exp-src-block () - "Process source block for export. -Depending on the \":export\" header argument, replace the source -code block like this: - -both ---- display the code and the results - -code ---- the default, display the code inside the block but do - not process - -results - just like none only the block is run on export ensuring - that its results are present in the Org mode buffer - -none ---- do not display either code or results upon export - -Assume point is at block opening line." - (interactive) - (save-excursion - (let* ((info (org-babel-get-src-block-info)) - (lang (nth 0 info)) - (raw-params (nth 2 info)) - hash) - ;; bail if we couldn't get any info from the block - (unless noninteractive - (message "org-babel-exp process %s at position %d..." - lang - (line-beginning-position))) - (when info - ;; if we're actually going to need the parameters - (when (member (cdr (assq :exports (nth 2 info))) '("both" "results")) - (let ((lang-headers (intern (concat "org-babel-default-header-args:" - lang)))) - (org-babel-exp--at-source - (setf (nth 2 info) - (org-babel-process-params - (apply #'org-babel-merge-params - org-babel-default-header-args - (and (boundp lang-headers) - (symbol-value lang-headers)) - (append (org-babel-params-from-properties lang) - (list raw-params))))))) - (setf hash (org-babel-sha1-hash info :export))) - (org-babel-exp-do-export info 'block hash))))) - -(defcustom org-babel-exp-call-line-template - "" - "Template used to export call lines. -This template may be customized to include the call line name -with any export markup. The template is filled out using -`org-fill-template', and the following %keys may be used. - - line --- call line - -An example value would be \"\\n: call: %line\" to export the call line -wrapped in a verbatim environment. - -Note: the results are inserted separately after the contents of -this template." - :group 'org-babel - :type 'string) - -(defun org-babel-exp-process-buffer () - "Execute all Babel blocks in current buffer." - (interactive) - (when org-export-use-babel - (save-window-excursion - (let ((case-fold-search t) - (regexp "\\(call\\|src\\)_\\|^[ \t]*#\\+\\(BEGIN_SRC\\|CALL:\\)") - ;; Get a pristine copy of current buffer so Babel - ;; references are properly resolved and source block - ;; context is preserved. - (org-babel-exp-reference-buffer (org-export-copy-buffer))) - (unwind-protect - (save-excursion - ;; First attach to every source block their original - ;; position, so that they can be retrieved within - ;; `org-babel-exp-reference-buffer', even after heavy - ;; modifications on current buffer. - ;; - ;; False positives are harmless, so we don't check if - ;; we're really at some Babel object. Moreover, - ;; `line-end-position' ensures that we propertize - ;; a noticeable part of the object, without affecting - ;; multiple objects on the same line. - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (let ((s (match-beginning 0))) - (put-text-property s (line-end-position) 'org-reference s))) - ;; Evaluate from top to bottom every Babel block - ;; encountered. - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (unless (save-match-data (org-in-commented-heading-p)) - (let* ((object? (match-end 1)) - (element (save-match-data - (if object? (org-element-context) - ;; No deep inspection if we're - ;; just looking for an element. - (org-element-at-point)))) - (type - (pcase (org-element-type element) - ;; Discard block elements if we're looking - ;; for inline objects. False results - ;; happen when, e.g., "call_" syntax is - ;; located within affiliated keywords: - ;; - ;; #+name: call_src - ;; #+begin_src ... - ((and (or `babel-call `src-block) (guard object?)) - nil) - (type type))) - (begin - (copy-marker (org-element-property :begin element))) - (end - (copy-marker - (save-excursion - (goto-char (org-element-property :end element)) - (skip-chars-backward " \r\t\n") - (point))))) - (pcase type - (`inline-src-block - (let* ((info - (org-babel-get-src-block-info nil element)) - (params (nth 2 info))) - (setf (nth 1 info) - (if (and (cdr (assq :noweb params)) - (string= "yes" - (cdr (assq :noweb params)))) - (org-babel-expand-noweb-references - info org-babel-exp-reference-buffer) - (nth 1 info))) - (goto-char begin) - (let ((replacement - (org-babel-exp-do-export info 'inline))) - (if (equal replacement "") - ;; Replacement code is empty: remove - ;; inline source block, including extra - ;; white space that might have been - ;; created when inserting results. - (delete-region begin - (progn (goto-char end) - (skip-chars-forward " \t") - (point))) - ;; Otherwise: remove inline source block - ;; but preserve following white spaces. - ;; Then insert value. - (delete-region begin end) - (insert replacement))))) - ((or `babel-call `inline-babel-call) - (org-babel-exp-do-export (org-babel-lob-get-info element) - 'lob) - (let ((rep - (org-fill-template - org-babel-exp-call-line-template - `(("line" . - ,(org-element-property :value element)))))) - ;; If replacement is empty, completely remove - ;; the object/element, including any extra - ;; white space that might have been created - ;; when including results. - (if (equal rep "") - (delete-region - begin - (progn (goto-char end) - (if (not (eq type 'babel-call)) - (progn (skip-chars-forward " \t") - (point)) - (skip-chars-forward " \r\t\n") - (line-beginning-position)))) - ;; Otherwise, preserve trailing - ;; spaces/newlines and then, insert - ;; replacement string. - (goto-char begin) - (delete-region begin end) - (insert rep)))) - (`src-block - (let ((match-start (copy-marker (match-beginning 0))) - (ind (current-indentation))) - ;; Take care of matched block: compute - ;; replacement string. In particular, a nil - ;; REPLACEMENT means the block is left as-is - ;; while an empty string removes the block. - (let ((replacement - (progn (goto-char match-start) - (org-babel-exp-src-block)))) - (cond ((not replacement) (goto-char end)) - ((equal replacement "") - (goto-char end) - (skip-chars-forward " \r\t\n") - (beginning-of-line) - (delete-region begin (point))) - (t - (goto-char match-start) - (delete-region (point) - (save-excursion - (goto-char end) - (line-end-position))) - (insert replacement) - (if (or org-src-preserve-indentation - (org-element-property - :preserve-indent element)) - ;; Indent only code block - ;; markers. - (save-excursion - (skip-chars-backward " \r\t\n") - (indent-line-to ind) - (goto-char match-start) - (indent-line-to ind)) - ;; Indent everything. - (indent-rigidly - match-start (point) ind))))) - (set-marker match-start nil)))) - (set-marker begin nil) - (set-marker end nil))))) - (kill-buffer org-babel-exp-reference-buffer) - (remove-text-properties (point-min) (point-max) - '(org-reference nil))))))) - -(defun org-babel-exp-do-export (info type &optional hash) - "Return a string with the exported content of a code block. -The function respects the value of the :exports header argument." - (let ((silently (lambda () (let ((session (cdr (assq :session (nth 2 info))))) - (unless (equal "none" session) - (org-babel-exp-results info type 'silent))))) - (clean (lambda () (if (eq type 'inline) - (org-babel-remove-inline-result) - (org-babel-remove-result info))))) - (pcase (or (cdr (assq :exports (nth 2 info))) "code") - ("none" (funcall silently) (funcall clean) "") - ("code" (funcall silently) (funcall clean) (org-babel-exp-code info type)) - ("results" (org-babel-exp-results info type nil hash) "") - ("both" - (org-babel-exp-results info type nil hash) - (org-babel-exp-code info type))))) - -(defcustom org-babel-exp-code-template - "#+BEGIN_SRC %lang%switches%flags\n%body\n#+END_SRC" - "Template used to export the body of code blocks. -This template may be customized to include additional information -such as the code block name, or the values of particular header -arguments. The template is filled out using `org-fill-template', -and the following %keys may be used. - - lang ------ the language of the code block - name ------ the name of the code block - body ------ the body of the code block - switches -- the switches associated to the code block - flags ----- the flags passed to the code block - -In addition to the keys mentioned above, every header argument -defined for the code block may be used as a key and will be -replaced with its value." - :group 'org-babel - :type 'string) - -(defcustom org-babel-exp-inline-code-template - "src_%lang[%switches%flags]{%body}" - "Template used to export the body of inline code blocks. -This template may be customized to include additional information -such as the code block name, or the values of particular header -arguments. The template is filled out using `org-fill-template', -and the following %keys may be used. - - lang ------ the language of the code block - name ------ the name of the code block - body ------ the body of the code block - switches -- the switches associated to the code block - flags ----- the flags passed to the code block - -In addition to the keys mentioned above, every header argument -defined for the code block may be used as a key and will be -replaced with its value." - :group 'org-babel - :type 'string - :version "26.1" - :package-version '(Org . "8.3")) - -(defun org-babel-exp-code (info type) - "Return the original code block formatted for export." - (setf (nth 1 info) - (if (string= "strip-export" (cdr (assq :noweb (nth 2 info)))) - (replace-regexp-in-string - (org-babel-noweb-wrap) "" (nth 1 info)) - (if (org-babel-noweb-p (nth 2 info) :export) - (org-babel-expand-noweb-references - info org-babel-exp-reference-buffer) - (nth 1 info)))) - (org-fill-template - (if (eq type 'inline) - org-babel-exp-inline-code-template - org-babel-exp-code-template) - `(("lang" . ,(nth 0 info)) - ("body" . ,(org-escape-code-in-string (nth 1 info))) - ("switches" . ,(let ((f (nth 3 info))) - (and (org-string-nw-p f) (concat " " f)))) - ("flags" . ,(let ((f (assq :flags (nth 2 info)))) - (and f (concat " " (cdr f))))) - ,@(mapcar (lambda (pair) - (cons (substring (symbol-name (car pair)) 1) - (format "%S" (cdr pair)))) - (nth 2 info)) - ("name" . ,(or (nth 4 info) ""))))) - -(defun org-babel-exp-results (info type &optional silent hash) - "Evaluate and return the results of the current code block for export. -Results are prepared in a manner suitable for export by Org mode. -This function is called by `org-babel-exp-do-export'. The code -block will be evaluated. Optional argument SILENT can be used to -inhibit insertion of results into the buffer." - (unless (and hash (equal hash (org-babel-current-result-hash))) - (let ((lang (nth 0 info)) - (body (if (org-babel-noweb-p (nth 2 info) :eval) - (org-babel-expand-noweb-references - info org-babel-exp-reference-buffer) - (nth 1 info))) - (info (copy-sequence info)) - (org-babel-current-src-block-location (point-marker))) - ;; Skip code blocks which we can't evaluate. - (when (fboundp (intern (concat "org-babel-execute:" lang))) - (org-babel-eval-wipe-error-buffer) - (setf (nth 1 info) body) - (setf (nth 2 info) - (org-babel-exp--at-source - (org-babel-process-params - (org-babel-merge-params - (nth 2 info) - `((:results . ,(if silent "silent" "replace"))))))) - (pcase type - (`block (org-babel-execute-src-block nil info)) - (`inline - ;; Position the point on the inline source block - ;; allowing `org-babel-insert-result' to check that the - ;; block is inline. - (goto-char (nth 5 info)) - (org-babel-execute-src-block nil info)) - (`lob - (save-excursion - (goto-char (nth 5 info)) - (let (org-confirm-babel-evaluate) - (org-babel-execute-src-block nil info))))))))) - - -(provide 'ob-exp) - -;;; ob-exp.el ends here diff --git a/elpa/org-9.3.6/ob-exp.elc b/elpa/org-9.3.6/ob-exp.elc deleted file mode 100644 index b1ad97d01649cea01da1ffc85596deb5d8499b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10860 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 diff --git a/elpa/org-9.3.6/ob-forth.el b/elpa/org-9.3.6/ob-forth.el deleted file mode 100644 index aef6784c..00000000 --- a/elpa/org-9.3.6/ob-forth.el +++ /dev/null @@ -1,87 +0,0 @@ -;;; ob-forth.el --- Babel Functions for Forth -*- lexical-binding: t; -*- - -;; Copyright (C) 2014-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research, forth -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Requires the gforth forth compiler and `forth-mode' (see below). -;; https://www.gnu.org/software/gforth/ - -;;; Requirements: - -;; Session evaluation requires the gforth forth compiler as well as -;; `forth-mode' which is distributed with gforth (in gforth.el). - -;;; Code: -(require 'ob) -(require 'org-macs) - -(declare-function forth-proc "ext:gforth" ()) - -(defvar org-babel-default-header-args:forth '((:session . "yes")) - "Default header arguments for forth code blocks.") - -(defun org-babel-execute:forth (body params) - "Execute a block of Forth code with org-babel. -This function is called by `org-babel-execute-src-block'." - (if (string= "none" (cdr (assq :session params))) - (error "Non-session evaluation not supported for Forth code blocks") - (let ((all-results (org-babel-forth-session-execute body params))) - (if (member "output" (cdr (assq :result-params params))) - (mapconcat #'identity all-results "\n") - (car (last all-results)))))) - -(defun org-babel-forth-session-execute (body params) - (require 'forth-mode) - (let ((proc (forth-proc)) - (rx " \\(\n:\\|compiled\n\\|ok\n\\)") - (result-start)) - (with-current-buffer (process-buffer (forth-proc)) - (mapcar (lambda (line) - (setq result-start (progn (goto-char (process-mark proc)) - (point))) - (comint-send-string proc (concat line "\n")) - ;; wait for forth to say "ok" - (while (not (progn (goto-char result-start) - (re-search-forward rx nil t))) - (accept-process-output proc 0.01)) - (let ((case (match-string 1))) - (cond - ((string= "ok\n" case) - ;; Collect intermediate output. - (buffer-substring (+ result-start 1 (length line)) - (match-beginning 0))) - ((string= "compiled\n" case)) - ;; Ignore partial compilation. - ((string= "\n:" case) - ;; Report errors. - (org-babel-eval-error-notify 1 - (buffer-substring - (+ (match-beginning 0) 1) (point-max))) nil)))) - (split-string (org-trim - (org-babel-expand-body:generic body params)) - "\n" - 'omit-nulls))))) - -(provide 'ob-forth) - -;;; ob-forth.el ends here diff --git a/elpa/org-9.3.6/ob-forth.elc b/elpa/org-9.3.6/ob-forth.elc deleted file mode 100644 index df05e138e6d201fb65dd68146932d583147a6f43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2030 zcmbtV-*4MC5KgkJgw+a7n3yTx8BL!xAPabB9G*$|-Xg0(M0WFVA8$3pb06y?_I z{`h@I*-nP;VL+YGCXdJC@%z3bPtISReS2_lFgQ6mp|iSd@ zB%(=RXWr*#MY1TUZcJY0e@TPsb~3P&Z&!IsOGKfrRV`(kN|t#_S)H~<=haR79J9JL zB(qFqwBN-)o`~a5Vq`U9RJEbBu8f3pXO`|yuvG5po3o1xN>@_L)F8#@c6(W6)Yg>B ziV{UdE&sL2_9!hWsf%1`GAlTWpx+k|eAb5(_}tH6Fc>8pqujL46ghF=d1(G&EPU>8 z6Bu|ihpx1G*X3GKolvcBTqbKlVmuhW2#@KdTFS04v{HaTlhij|sVW0*YRwH4+AWfz zPH)@EcY{%;mTRePs6-~JaADvOZXd!$h<4tuJQ|JWVAslGLe56D&Uj3t;ZvGWI19#{ zgD(O)|De*&D3WBip?XQb+-+@j#F^XeCWBr&U6rz)2r^0`GH4{((DmNUReemi)v0Tv z9)Z2lvZ9}VfB7d}p8j$A+naHJ99iVDrK3;QZcj11n)+dn@q<_d(J3R1jt6{$CkG5Q zT43QuCw%xYW z8x&M34dod`k(&)*s2nO}YZf%yG8uW%c)?T(kN!8r|DDJ^r~%Yo&Vn!s(84o~Z$?(o z;k&KaBMdF33@KxY7Cd^)e?xRbX2ZuCKl&bD@Dv`;S&~AGe6Z>T0ca3{2?@D}-GrUQ zFV>3i(N{yz6-DfUF*X&mVeE{ztnG@dKUc|B*>@XVr{qu^kK$?`$A72W%QLPpsBiga z>`;{##GWV?H|ds3lp=$VIxFR^a_>rAOlMY#R&qGFcbG5?*RcqpM_c?z+hcus(@UJO zx8Y!+u%56pU;wHIjWrlPWeu_k7YFd`SK*-FupLnNA=GWbg^qjS&v}X?+0g9r<*y9) zEEXdC$S7SN^lJnXvumQgWmi5^SQvF?X}k1o_HmyzV(|^O-imOoQUifs?SLw!zQyfS z=9Ph@tIX}6j$Wf$!6tROa>2uUsWXc)-jg&{4HUiwyH`GW6VC_K2JYJ+KB@xjIP{D> za_(4jIQ;y6O>s54wn|+*LHTmCpopE~im#hj7q8DjaN86)vb1m8y?Rt18azdAQfHg_ zjjEK!8>m%N$W*yn-C)|yQTP2aCyuY7qbvG)@uStvGfpPHh9Rz=EO>)fW#W*jr%WQsLX0S_y-RCQ-A;f diff --git a/elpa/org-9.3.6/ob-fortran.el b/elpa/org-9.3.6/ob-fortran.el deleted file mode 100644 index 154465f2..00000000 --- a/elpa/org-9.3.6/ob-fortran.el +++ /dev/null @@ -1,167 +0,0 @@ -;;; ob-fortran.el --- Babel Functions for Fortran -*- lexical-binding: t; -*- - -;; Copyright (C) 2011-2020 Free Software Foundation, Inc. - -;; Authors: Sergey Litvinov -;; Eric Schulte -;; Keywords: literate programming, reproducible research, fortran -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. -;; -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Org-Babel support for evaluating fortran code. - -;;; Code: -(require 'ob) -(require 'org-macs) -(require 'cc-mode) -(require 'cl-lib) - -(declare-function org-entry-get "org" - (pom property &optional inherit literal-nil)) - -(defvar org-babel-tangle-lang-exts) -(add-to-list 'org-babel-tangle-lang-exts '("fortran" . "F90")) - -(defvar org-babel-default-header-args:fortran '()) - -(defvar org-babel-fortran-compiler "gfortran" - "fortran command used to compile a fortran source code file into an - executable.") - -(defun org-babel-execute:fortran (body params) - "This function should only be called by `org-babel-execute:fortran'." - (let* ((tmp-src-file (org-babel-temp-file "fortran-src-" ".F90")) - (tmp-bin-file (org-babel-temp-file "fortran-bin-" org-babel-exeext)) - (cmdline (cdr (assq :cmdline params))) - (flags (cdr (assq :flags params))) - (full-body (org-babel-expand-body:fortran body params))) - (with-temp-file tmp-src-file (insert full-body)) - (org-babel-eval - (format "%s -o %s %s %s" - org-babel-fortran-compiler - (org-babel-process-file-name tmp-bin-file) - (mapconcat 'identity - (if (listp flags) flags (list flags)) " ") - (org-babel-process-file-name tmp-src-file)) "") - (let ((results - (org-trim - (org-remove-indentation - (org-babel-eval - (concat tmp-bin-file (if cmdline (concat " " cmdline) "")) ""))))) - (org-babel-reassemble-table - (org-babel-result-cond (cdr (assq :result-params params)) - (org-babel-read results) - (let ((tmp-file (org-babel-temp-file "f-"))) - (with-temp-file tmp-file (insert results)) - (org-babel-import-elisp-from-file tmp-file))) - (org-babel-pick-name - (cdr (assq :colname-names params)) (cdr (assq :colnames params))) - (org-babel-pick-name - (cdr (assq :rowname-names params)) (cdr (assq :rownames params))))))) - -(defun org-babel-expand-body:fortran (body params) - "Expand a block of fortran or fortran code with org-babel according to -its header arguments." - (let ((vars (org-babel--get-vars params)) - (main-p (not (string= (cdr (assq :main params)) "no"))) - (includes (or (cdr (assq :includes params)) - (org-babel-read (org-entry-get nil "includes" t)))) - (defines (org-babel-read - (or (cdr (assq :defines params)) - (org-babel-read (org-entry-get nil "defines" t)))))) - (mapconcat 'identity - (list - ;; includes - (mapconcat - (lambda (inc) (format "#include %s" inc)) - (if (listp includes) includes (list includes)) "\n") - ;; defines - (mapconcat - (lambda (inc) (format "#define %s" inc)) - (if (listp defines) defines (list defines)) "\n") - ;; body - (if main-p - (org-babel-fortran-ensure-main-wrap - (concat - ;; variables - (mapconcat 'org-babel-fortran-var-to-fortran vars "\n") - body) params) - body) "\n") "\n"))) - -(defun org-babel-fortran-ensure-main-wrap (body params) - "Wrap body in a \"program ... end program\" block if none exists." - (if (string-match "^[ \t]*program[ \t]*.*" (capitalize body)) - (let ((vars (org-babel--get-vars params))) - (when vars (error "Cannot use :vars if `program' statement is present")) - body) - (format "program main\n%s\nend program main\n" body))) - -(defun org-babel-prep-session:fortran (_session _params) - "This function does nothing as fortran is a compiled language with no -support for sessions." - (error "Fortran is a compiled languages -- no support for sessions")) - -(defun org-babel-load-session:fortran (_session _body _params) - "This function does nothing as fortran is a compiled language with no -support for sessions." - (error "Fortran is a compiled languages -- no support for sessions")) - -;; helper functions - -(defun org-babel-fortran-var-to-fortran (pair) - "Convert an elisp val into a string of fortran code specifying a var -of the same value." - ;; TODO list support - (let ((var (car pair)) - (val (cdr pair))) - (when (symbolp val) - (setq val (symbol-name val)) - (when (= (length val) 1) - (setq val (string-to-char val)))) - (cond - ((integerp val) - (format "integer, parameter :: %S = %S\n" var val)) - ((floatp val) - (format "real, parameter :: %S = %S\n" var val)) - ((or (integerp val)) - (format "character, parameter :: %S = '%S'\n" var val)) - ((stringp val) - (format "character(len=%d), parameter :: %S = '%s'\n" - (length val) var val)) - ;; val is a matrix - ((and (listp val) (cl-every #'listp val)) - (format "real, parameter :: %S(%d,%d) = transpose( reshape( %s , (/ %d, %d /) ) )\n" - var (length val) (length (car val)) - (org-babel-fortran-transform-list val) - (length (car val)) (length val))) - ((listp val) - (format "real, parameter :: %S(%d) = %s\n" - var (length val) (org-babel-fortran-transform-list val))) - (t - (error "the type of parameter %s is not supported by ob-fortran" var))))) - -(defun org-babel-fortran-transform-list (val) - "Return a fortran representation of enclose syntactic lists." - (if (listp val) - (concat "(/" (mapconcat #'org-babel-fortran-transform-list val ", ") "/)") - (format "%S" val))) - -(provide 'ob-fortran) - -;;; ob-fortran.el ends here diff --git a/elpa/org-9.3.6/ob-fortran.elc b/elpa/org-9.3.6/ob-fortran.elc deleted file mode 100644 index 3eac1650542f2e7a33834c055c0ea6e5d6a8c8fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5394 zcmcgwZFAek5tc29w&`j6CDV5Lr7I|`NJo(ILV%XsOspujMl)%mSZOmIL#;vJNMek) z96-s;hxV`c*#khrlstAOoyZ1wx3{;qcenREdwBZ%>ytlhY;1I&K7C3jS&~Pw2vsFY z>3QM@1zibQL|ICfdtj@U>!_TOAIFsCWt2oe`6Zf*gRW})eijupffbq;qM&e*`biW} zm<2^CqjXyAqg56q`C%wRT8?5K9$1GrY=jwXq*+NpmXNIjK;gfHVrNGfMgwCrkJEWt1OV+VfeU$@)sj~AuT zgDe!JdA4ETF?T%6Yi&!uHbQ%ji#*Z%EmId{-NhV9_ry3oQ_Ttdc2A5AR*MpQ-cJPkOk zshDN+IHW9%7aUOm;vW8u7xa3yM%Cz|ncN=2sXs~S%WuE>C!HU^JpS9opz_L(Bfp@% z_x7aSSB^PU+iqd|Y&=73A@&@Pb6*wRP0zC3V+clDb;&e3`17q5>N!y=F zvh)XAV!Pby9e-Hj8k;*XV)2Z4(yoFH4v3Ek3fH=D;R>oP~?#l+#p{`glH>0NMg6{8B)Y3WA1tw$Oq{u`mMP~K1n9(!aMynoIE?4>&KstWYJ0{aDi2__E8Owy}* zRAu^26vy>gmt@hkj4-|wQ^qcUY?N0NY4mw^M~7}o~t+o zXO816cthD_NuG$C`k+(+FXRV7CPUXM;J$8f|QYj7%3~q_jp=>sM9li>4Kn3Zl8h5Ekf#H7%22jC*z-o^z4Y zE9>7I9nhcYzECZYaKg1*T3u(LKxTy9OgM!_r~+!DG>GRRvfGs+VjPJEGB2#RTyQsa zg0)6fqmqu0Q~{w7@O6RF;G zaA!tizCidm)H0g_2k7A7fCQ4rx~|pdAe!)%K_E>;a{DtvxpC@-->rD&1;%4-?Wk3@ zf6pPQC=j%Z`1xcRq5yYfSsWkGQ0e*Ra$_oh#LASxjI@6#gsdl_$_Jp0z|W%+DdbN` zb31+mgO^Auh@&~KJy;eK$JS7hi>ysot+AX zk>VUSYw_e)TZ@mlV(=aKmIWD&%oRZVKNqAqulAu;6Vu@#zAU65WL)}FQhZ39i&WP) zgd~3#Xmgdi;T5?EqRB#q57cEBWLC}u6`W9^`&`tNbbfsH@_qNK<^aEoDobR;#pc-^ z5Q%9X@=^U0A5|u(D)BVUQ`F7BFPp4ZlV>>wHz)=IH5kLqO=PUhXC^20hQrE+?I<`v z-F>GWLpBz^Y&1se8c*54cXczM<8*5aceZ8-m{6oPheDO%S2%C8fbWi`y}5b1^$e3R zhn>z&r}ONzbMN#o_imbigf9@PlY>s&V|%AHR(*qP;ngA;XK|IinDrJiZu9q;C7fV` z#Z<_BQc0S?R~n+DBck2~eU2A%%mm?C=19PVAGh_^)U@Syo;4+9YOi;($HrD#{aB=* z_rk%Nb~W-|uTbjv?jaDB3*t{6xBJk$==Z{X7=pw6&7;V(LiCZ~7BfFb0on6D^&bI=(lGghPVP>j49)$qhYUoLWh{-m{#7#UE?NM8d}^;IGp zH`EDiLPA)9)6hJu!3n4Sr6}i;S+n+x)Afo7s_Y%Z2qY(%C>0B&^!N@Es3mHE_#ek# zf9SleO}5D-nvnf12b)Sw@M~>y= Z7cJUyOhX}4A9QzxD-Ax#ELUyN{U4r#CMW;^ diff --git a/elpa/org-9.3.6/ob-gnuplot.el b/elpa/org-9.3.6/ob-gnuplot.el deleted file mode 100644 index 99f3dab7..00000000 --- a/elpa/org-9.3.6/ob-gnuplot.el +++ /dev/null @@ -1,283 +0,0 @@ -;;; ob-gnuplot.el --- Babel Functions for Gnuplot -*- lexical-binding: t; -*- - -;; Copyright (C) 2009-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Org-Babel support for evaluating gnuplot source code. -;; -;; This differs from most standard languages in that -;; -;; 1) we are generally only going to return results of type "file" -;; -;; 2) we are adding the "file" and "cmdline" header arguments - -;;; Requirements: - -;; - gnuplot :: http://www.gnuplot.info/ -;; -;; - gnuplot-mode :: you can search the web for the latest active one. - -;;; Code: -(require 'ob) -(require 'org-macs) - -(declare-function org-time-string-to-time "org" (s)) -(declare-function orgtbl-to-generic "org-table" (table params)) -(declare-function gnuplot-mode "ext:gnuplot-mode" ()) -(declare-function gnuplot-send-string-to-gnuplot "ext:gnuplot-mode" (str txt)) -(declare-function gnuplot-send-buffer-to-gnuplot "ext:gnuplot-mode" ()) - -(defvar org-babel-default-header-args:gnuplot - '((:results . "file") (:exports . "results") (:session . nil)) - "Default arguments to use when evaluating a gnuplot source block.") - -(defvar org-babel-header-args:gnuplot - '((title . :any) - (lines . :any) - (sets . :any) - (x-labels . :any) - (y-labels . :any) - (timefmt . :any) - (time-ind . :any) - (missing . :any) - (term . :any)) - "Gnuplot specific header args.") - -(defvar org-babel-gnuplot-timestamp-fmt nil) ; Dynamically scoped. - -(defvar *org-babel-gnuplot-missing* nil) - -(defcustom *org-babel-gnuplot-terms* - '((eps . "postscript eps")) - "List of file extensions and the associated gnuplot terminal." - :group 'org-babel - :type '(repeat (cons (symbol :tag "File extension") - (string :tag "Gnuplot terminal")))) - -(defun org-babel-gnuplot-process-vars (params) - "Extract variables from PARAMS and process the variables. -Dumps all vectors into files and returns an association list -of variable names and the related value to be used in the gnuplot -code." - (let ((*org-babel-gnuplot-missing* (cdr (assq :missing params)))) - (mapcar - (lambda (pair) - (cons - (car pair) ;; variable name - (let* ((val (cdr pair)) ;; variable value - (lp (listp val))) - (if lp - (org-babel-gnuplot-table-to-data - (let* ((first (car val)) - (tablep (or (listp first) (symbolp first)))) - (if tablep val (mapcar 'list val))) - (org-babel-temp-file "gnuplot-") params) - val)))) - (org-babel--get-vars params)))) - -(defun org-babel-expand-body:gnuplot (body params) - "Expand BODY according to PARAMS, return the expanded body." - (save-window-excursion - (let* ((vars (org-babel-gnuplot-process-vars params)) - (out-file (cdr (assq :file params))) - (prologue (cdr (assq :prologue params))) - (epilogue (cdr (assq :epilogue params))) - (term (or (cdr (assq :term params)) - (when out-file - (let ((ext (file-name-extension out-file))) - (or (cdr (assoc (intern (downcase ext)) - *org-babel-gnuplot-terms*)) - ext))))) - (title (cdr (assq :title params))) - (lines (cdr (assq :line params))) - (sets (cdr (assq :set params))) - (x-labels (cdr (assq :xlabels params))) - (y-labels (cdr (assq :ylabels params))) - (timefmt (cdr (assq :timefmt params))) - (time-ind (or (cdr (assq :timeind params)) - (when timefmt 1))) - (directory (and (buffer-file-name) - (file-name-directory (buffer-file-name)))) - (add-to-body (lambda (text) (setq body (concat text "\n" body))))) - ;; append header argument settings to body - (when title (funcall add-to-body (format "set title '%s'" title))) - (when lines (mapc (lambda (el) (funcall add-to-body el)) lines)) - (when sets - (mapc (lambda (el) (funcall add-to-body (format "set %s" el))) sets)) - (when x-labels - (funcall add-to-body - (format "set xtics (%s)" - (mapconcat (lambda (pair) - (format "\"%s\" %d" - (cdr pair) (car pair))) - x-labels ", ")))) - (when y-labels - (funcall add-to-body - (format "set ytics (%s)" - (mapconcat (lambda (pair) - (format "\"%s\" %d" - (cdr pair) (car pair))) - y-labels ", ")))) - (when time-ind - (funcall add-to-body "set xdata time") - (funcall add-to-body (concat "set timefmt \"" - (or timefmt - "%Y-%m-%d-%H:%M:%S") "\""))) - (when out-file - ;; set the terminal at the top of the block - (funcall add-to-body (format "set output \"%s\"" out-file)) - ;; and close the terminal at the bottom of the block - (setq body (concat body "\nset output\n"))) - (when term (funcall add-to-body (format "set term %s" term))) - ;; insert variables into code body: this should happen last - ;; placing the variables at the *top* of the code in case their - ;; values are used later - (funcall add-to-body - (mapconcat #'identity - (org-babel-variable-assignments:gnuplot params) - "\n")) - ;; replace any variable names preceded by '$' with the actual - ;; value of the variable - (mapc (lambda (pair) - (setq body (replace-regexp-in-string - (format "\\$%s" (car pair)) (cdr pair) body))) - vars) - (when prologue (funcall add-to-body prologue)) - (when epilogue (setq body (concat body "\n" epilogue))) - ;; Setting the directory needs to be done first so that - ;; subsequent 'output' directive goes to the right place. - (when directory (funcall add-to-body (format "cd '%s'" directory)))) - body)) - -(defun org-babel-execute:gnuplot (body params) - "Execute a block of Gnuplot code. -This function is called by `org-babel-execute-src-block'." - (require 'gnuplot) - (let ((session (cdr (assq :session params))) - (result-type (cdr (assq :results params))) - (body (org-babel-expand-body:gnuplot body params)) - output) - (save-window-excursion - ;; evaluate the code body with gnuplot - (if (string= session "none") - (let ((script-file (org-babel-temp-file "gnuplot-script-"))) - (with-temp-file script-file - (insert (concat body "\n"))) - (message "gnuplot \"%s\"" script-file) - (setq output - (shell-command-to-string - (format - "gnuplot \"%s\"" - (org-babel-process-file-name - script-file - (if (member system-type '(cygwin windows-nt ms-dos)) - t nil))))) - (message "%s" output)) - (with-temp-buffer - (insert (concat body "\n")) - (gnuplot-mode) - (gnuplot-send-buffer-to-gnuplot))) - (if (member "output" (split-string result-type)) - output - nil)))) ;; signal that output has already been written to file - -(defun org-babel-prep-session:gnuplot (session params) - "Prepare SESSION according to the header arguments in PARAMS." - (let* ((session (org-babel-gnuplot-initiate-session session)) - (var-lines (org-babel-variable-assignments:gnuplot params))) - (message "%S" session) - (org-babel-comint-in-buffer session - (dolist (var-line var-lines) - (insert var-line) - (comint-send-input nil t) - (org-babel-comint-wait-for-output session) - (sit-for .1) - (goto-char (point-max)))) - session)) - -(defun org-babel-load-session:gnuplot (session body params) - "Load BODY into SESSION." - (save-window-excursion - (let ((buffer (org-babel-prep-session:gnuplot session params))) - (with-current-buffer buffer - (goto-char (process-mark (get-buffer-process (current-buffer)))) - (insert (org-babel-chomp body))) - buffer))) - -(defun org-babel-variable-assignments:gnuplot (params) - "Return list of gnuplot statements assigning the block's variables." - (mapcar - (lambda (pair) (format "%s = \"%s\"" (car pair) (cdr pair))) - (org-babel-gnuplot-process-vars params))) - -(defvar gnuplot-buffer) -(defun org-babel-gnuplot-initiate-session (&optional session _params) - "Initiate a gnuplot session. -If there is not a current inferior-process-buffer in SESSION -then create one. Return the initialized session. The current -`gnuplot-mode' doesn't provide support for multiple sessions." - (require 'gnuplot) - (unless (string= session "none") - (save-window-excursion - (gnuplot-send-string-to-gnuplot "" "line") - gnuplot-buffer))) - -(defun org-babel-gnuplot-quote-timestamp-field (s) - "Convert S from timestamp to Unix time and export to gnuplot." - (format-time-string org-babel-gnuplot-timestamp-fmt - (org-time-string-to-time s))) - -(defvar org-table-number-regexp) -(defvar org-ts-regexp3) -(defun org-babel-gnuplot-quote-tsv-field (s) - "Quote S for export to gnuplot." - (unless (stringp s) - (setq s (format "%s" s))) - (if (string-match org-table-number-regexp s) s - (if (string-match org-ts-regexp3 s) - (org-babel-gnuplot-quote-timestamp-field s) - (if (zerop (length s)) - (or *org-babel-gnuplot-missing* s) - (if (string-match "[ \"]" s) - (concat "\"" (mapconcat 'identity (split-string s "\"") "\"\"") - "\"") - s))))) - -(defun org-babel-gnuplot-table-to-data (table data-file params) - "Export TABLE to DATA-FILE in a format readable by gnuplot. -Pass PARAMS through to `orgtbl-to-generic' when exporting TABLE." - (with-temp-file data-file - (insert (let ((org-babel-gnuplot-timestamp-fmt - (or (plist-get params :timefmt) "%Y-%m-%d-%H:%M:%S"))) - (orgtbl-to-generic - table - (org-combine-plists - '(:sep "\t" :fmt org-babel-gnuplot-quote-tsv-field) - params))))) - data-file) - -(provide 'ob-gnuplot) - - - -;;; ob-gnuplot.el ends here diff --git a/elpa/org-9.3.6/ob-gnuplot.elc b/elpa/org-9.3.6/ob-gnuplot.elc deleted file mode 100644 index 3deacdc4936e2c254d8481d42f6694061bc28c7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8675 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 uO`i$l5w0-lmX{9GvOW~uX. - -;;; Commentary: -;; Currently only supports the external execution. No session support yet. - -;;; Requirements: -;; - Groovy language :: http://groovy.codehaus.org -;; - Groovy major mode :: Can be installed from MELPA or -;; https://github.com/russel/Emacs-Groovy-Mode - -;;; Code: -(require 'ob) - -(defvar org-babel-tangle-lang-exts) ;; Autoloaded -(add-to-list 'org-babel-tangle-lang-exts '("groovy" . "groovy")) -(defvar org-babel-default-header-args:groovy '()) -(defcustom org-babel-groovy-command "groovy" - "Name of the command to use for executing Groovy code. -May be either a command in the path, like groovy -or an absolute path name, like /usr/local/bin/groovy -parameters may be used, like groovy -v" - :group 'org-babel - :version "24.3" - :type 'string) - -(defun org-babel-execute:groovy (body params) - "Execute a block of Groovy code with org-babel. -This function is called by `org-babel-execute-src-block'." - (message "executing Groovy source code block") - (let* ((processed-params (org-babel-process-params params)) - (session (org-babel-groovy-initiate-session (nth 0 processed-params))) - (result-params (nth 2 processed-params)) - (result-type (cdr (assq :result-type params))) - (full-body (org-babel-expand-body:generic - body params)) - (result (org-babel-groovy-evaluate - session full-body result-type result-params))) - - (org-babel-reassemble-table - result - (org-babel-pick-name - (cdr (assq :colname-names params)) (cdr (assq :colnames params))) - (org-babel-pick-name - (cdr (assq :rowname-names params)) (cdr (assq :rownames params)))))) - -(defvar org-babel-groovy-wrapper-method - - "class Runner extends Script { - def out = new PrintWriter(new ByteArrayOutputStream()) - def run() { %s } -} - -println(new Runner().run()) -") - - -(defun org-babel-groovy-evaluate - (session body &optional result-type result-params) - "Evaluate BODY in external Groovy process. -If RESULT-TYPE equals `output' then return standard output as a string. -If RESULT-TYPE equals `value' then return the value of the last statement -in BODY as elisp." - (when session (error "Sessions are not (yet) supported for Groovy")) - (pcase result-type - (`output - (let ((src-file (org-babel-temp-file "groovy_"))) - (progn (with-temp-file src-file (insert body)) - (org-babel-eval - (concat org-babel-groovy-command " " src-file) "")))) - (`value - (let* ((src-file (org-babel-temp-file "groovy_")) - (wrapper (format org-babel-groovy-wrapper-method body))) - (with-temp-file src-file (insert wrapper)) - (let ((raw (org-babel-eval - (concat org-babel-groovy-command " " src-file) ""))) - (org-babel-result-cond result-params - raw - (org-babel-script-escape raw))))))) - - -(defun org-babel-prep-session:groovy (_session _params) - "Prepare SESSION according to the header arguments specified in PARAMS." - (error "Sessions are not (yet) supported for Groovy")) - -(defun org-babel-groovy-initiate-session (&optional _session) - "If there is not a current inferior-process-buffer in SESSION -then create. Return the initialized session. Sessions are not -supported in Groovy." - nil) - -(provide 'ob-groovy) - - - -;;; ob-groovy.el ends here diff --git a/elpa/org-9.3.6/ob-groovy.elc b/elpa/org-9.3.6/ob-groovy.elc deleted file mode 100644 index 4f903778db4572b12c80665871f8545873b205a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3713 zcmbtXZEw>^5H6)ukoy7m@dk&N1mO_dNeV^iC{Q6J-i~lOoto-yV{cNceq(pt643qk zduDAnX+!w{Zf&pkWp-xvd1fY$_g_E%bz@_r_4x5)dY-36oXE(2#2M|UBGhyum5%d_ z{82BkBd4)BB9SDN7bZ^QFT!A0_gZ%F<58?>1}Ri(sVQ1yB8@|e@=zNUXLEfYqe>eR zQ6wWe+r@j-^B=9rh;qotazkOB8G*^AnYj+DVn5ENh}qaBTV#zYG1hEr!H3DXRlVP)tN4gbi+K73ZrN%@pL>YCh5Vt6-Kb9XAHGI5Q_=81F@yj=O&XzDm~mFFi5 zhkDdByN48XTb)SGPJ~)nj1EyI#yyg7q;iFt>)mQKWpRQP-_Uhc%@;55HN-u_y)y~e z2+zX}L%iV5joOH?)Fw~eNQQ|}(uEGOm;ypeE2>T5l{Doeo|Re12;?`TkJ<7{iL=0vhL$=-+sgGmDR zfQ&d>3OKT)LYSlbl*Gr9DlI1&gaKD#s`I2Y)eHg;WIgRcsnvrdhXoI&arU5DRRGGV zWGqu!Z3)eybE3&TafnZ#ESAop-G-u$Kj;ORU>1d>if^#K-)*&@dj5d+t$`9IOtJeh zyJE#svb;WXd9PJbx$!V)%`OLLrwjV`Y#K1dUX!j?p=-t71)DmvjGn!F@i)ES`>^+B z-2KgBOC+(-ba!oS1F81G&>MUM^jB^IJ;9Zy{2FXN#B;bc@q^JGTBB`TU<2T_wYjyu zeTzYMr9s*DB&#QS!S*jz6LT#D2Te!d4Ywz=dazwXGL>43IViY>3Z0iKWB`Gn)?jCO z6mFsN5G!4KmU?BNI%GG_ViOB?7iQV0O1nyG=9oRSRo@gqx;xFI#qL~YQXz^iM{9BN zL?k7|t&Ausw3aF81L~hAQ4xp7F5{4P!#v@J{nBTjXsP^kb)f##fYFdT?OTW$UcW!= z9)2rY)JmNyQ51+4!17TZkpog|O&`h(Mu22SW|5|GsN%xV*GWdW5N9Ya4LzYup3-|H z3iFqWL4^)~KSMy=Q%Wq}m8K}o*uciL)9o(Tsxs?z=_}pV^xq`I|0F9|NRn9r)!vi*+3q9;9k9&f(p21qraII&w*0Xc5XMli-?W?`|0rnbH z3a$36>Ql`*(+3ra$BrGG(`UE=sf-b8&tSND6KBLy?1Np-2Wg9#wYb(~=e2>9a(ND_Xo&?H zXoVv|B5 zi42+~vh&F2B+`ERC_ucI$d{6u$R)xsR}mLtsLnVFR^=y7cV2Sj)1(U-#. - -;;; Commentary: - -;; Org-Babel support for evaluating haskell source code. This one will -;; be sort of tricky because haskell programs must be compiled before -;; they can be run, but haskell code can also be run through an -;; interactive interpreter. -;; -;; For now lets only allow evaluation using the haskell interpreter. - -;;; Requirements: - -;; - haskell-mode :: http://www.iro.umontreal.ca/~monnier/elisp/#haskell-mode -;; -;; - inf-haskell :: http://www.iro.umontreal.ca/~monnier/elisp/#haskell-mode -;; -;; - (optionally) lhs2tex :: http://people.cs.uu.nl/andres/lhs2tex/ - -;;; Code: -(require 'ob) -(require 'org-macs) -(require 'comint) - -(declare-function haskell-mode "ext:haskell-mode" ()) -(declare-function run-haskell "ext:inf-haskell" (&optional arg)) -(declare-function inferior-haskell-load-file - "ext:inf-haskell" (&optional reload)) - -(defvar org-babel-tangle-lang-exts) -(add-to-list 'org-babel-tangle-lang-exts '("haskell" . "hs")) - -(defvar org-babel-default-header-args:haskell - '((:padlines . "no"))) - -(defvar org-babel-haskell-lhs2tex-command "lhs2tex") - -(defvar org-babel-haskell-eoe "\"org-babel-haskell-eoe\"") - -(defvar haskell-prompt-regexp) - -(defun org-babel-execute:haskell (body params) - "Execute a block of Haskell code." - (require 'inf-haskell) - (add-hook 'inferior-haskell-hook - (lambda () - (setq-local comint-prompt-regexp - (concat haskell-prompt-regexp "\\|^λ?> ")))) - (let* ((session (cdr (assq :session params))) - (result-type (cdr (assq :result-type params))) - (full-body (org-babel-expand-body:generic - body params - (org-babel-variable-assignments:haskell params))) - (session (org-babel-haskell-initiate-session session params)) - (comint-preoutput-filter-functions - (cons 'ansi-color-filter-apply comint-preoutput-filter-functions)) - (raw (org-babel-comint-with-output - (session org-babel-haskell-eoe t full-body) - (insert (org-trim full-body)) - (comint-send-input nil t) - (insert org-babel-haskell-eoe) - (comint-send-input nil t))) - (results (mapcar #'org-strip-quotes - (cdr (member org-babel-haskell-eoe - (reverse (mapcar #'org-trim raw))))))) - (org-babel-reassemble-table - (let ((result - (pcase result-type - (`output (mapconcat #'identity (reverse (cdr results)) "\n")) - (`value (car results))))) - (org-babel-result-cond (cdr (assq :result-params params)) - result (org-babel-script-escape result))) - (org-babel-pick-name (cdr (assq :colname-names params)) - (cdr (assq :colname-names params))) - (org-babel-pick-name (cdr (assq :rowname-names params)) - (cdr (assq :rowname-names params)))))) - -(defun org-babel-haskell-initiate-session (&optional _session _params) - "Initiate a haskell session. -If there is not a current inferior-process-buffer in SESSION -then create one. Return the initialized session." - (require 'inf-haskell) - (or (get-buffer "*haskell*") - (save-window-excursion (run-haskell) (sleep-for 0.25) (current-buffer)))) - -(defun org-babel-load-session:haskell (session body params) - "Load BODY into SESSION." - (save-window-excursion - (let* ((buffer (org-babel-prep-session:haskell session params)) - (load-file (concat (org-babel-temp-file "haskell-load-") ".hs"))) - (with-temp-buffer - (insert body) (write-file load-file) - (haskell-mode) (inferior-haskell-load-file)) - buffer))) - -(defun org-babel-prep-session:haskell (session params) - "Prepare SESSION according to the header arguments in PARAMS." - (save-window-excursion - (let ((buffer (org-babel-haskell-initiate-session session))) - (org-babel-comint-in-buffer buffer - (mapc (lambda (line) - (insert line) - (comint-send-input nil t)) - (org-babel-variable-assignments:haskell params))) - (current-buffer)))) - -(defun org-babel-variable-assignments:haskell (params) - "Return list of haskell statements assigning the block's variables." - (mapcar (lambda (pair) - (format "let %s = %s" - (car pair) - (org-babel-haskell-var-to-haskell (cdr pair)))) - (org-babel--get-vars params))) - -(defun org-babel-haskell-var-to-haskell (var) - "Convert an elisp value VAR into a haskell variable. -The elisp VAR is converted to a string of haskell source code -specifying a variable of the same value." - (if (listp var) - (concat "[" (mapconcat #'org-babel-haskell-var-to-haskell var ", ") "]") - (format "%S" var))) - -(defvar org-export-copy-to-kill-ring) -(declare-function org-export-to-file "ox" - (backend file - &optional async subtreep visible-only body-only - ext-plist post-process)) -(defun org-babel-haskell-export-to-lhs (&optional arg) - "Export to a .lhs file with all haskell code blocks escaped. -When called with a prefix argument the resulting -.lhs file will be exported to a .tex file. This function will -create two new files, base-name.lhs and base-name.tex where -base-name is the name of the current Org file. - -Note that all standard Babel literate programming -constructs (header arguments, no-web syntax etc...) are ignored." - (interactive "P") - (let* ((contents (buffer-string)) - (haskell-regexp - (concat "^\\([ \t]*\\)#\\+begin_src[ \t]haskell*\\(.*\\)[\r\n]" - "\\([^\000]*?\\)[\r\n][ \t]*#\\+end_src.*")) - (base-name (file-name-sans-extension (buffer-file-name))) - (tmp-file (org-babel-temp-file "haskell-")) - (tmp-org-file (concat tmp-file ".org")) - (tmp-tex-file (concat tmp-file ".tex")) - (lhs-file (concat base-name ".lhs")) - (tex-file (concat base-name ".tex")) - (command (concat org-babel-haskell-lhs2tex-command - " " (org-babel-process-file-name lhs-file) - " > " (org-babel-process-file-name tex-file))) - (preserve-indentp org-src-preserve-indentation) - indentation) - ;; escape haskell source-code blocks - (with-temp-file tmp-org-file - (insert contents) - (goto-char (point-min)) - (while (re-search-forward haskell-regexp nil t) - (save-match-data (setq indentation (length (match-string 1)))) - (replace-match (save-match-data - (concat - "#+begin_export latex\n\\begin{code}\n" - (if (or preserve-indentp - (string-match "-i" (match-string 2))) - (match-string 3) - (org-remove-indentation (match-string 3))) - "\n\\end{code}\n#+end_export\n")) - t t) - (indent-code-rigidly (match-beginning 0) (match-end 0) indentation))) - (save-excursion - ;; export to latex w/org and save as .lhs - (require 'ox-latex) - (find-file tmp-org-file) - ;; Ensure we do not clutter kill ring with incomplete results. - (let (org-export-copy-to-kill-ring) - (org-export-to-file 'latex tmp-tex-file)) - (kill-buffer nil) - (delete-file tmp-org-file) - (find-file tmp-tex-file) - (goto-char (point-min)) (forward-line 2) - (insert "%include polycode.fmt\n") - ;; ensure all \begin/end{code} statements start at the first column - (while (re-search-forward "^[ \t]+\\\\begin{code}[^\000]+\\\\end{code}" nil t) - (replace-match (save-match-data (org-remove-indentation (match-string 0))) - t t)) - (setq contents (buffer-string)) - (save-buffer) (kill-buffer nil)) - (delete-file tmp-tex-file) - ;; save org exported latex to a .lhs file - (with-temp-file lhs-file (insert contents)) - (if (not arg) - (find-file lhs-file) - ;; process .lhs file with lhs2tex - (message "running %s" command) (shell-command command) (find-file tex-file)))) - -(provide 'ob-haskell) - - - -;;; ob-haskell.el ends here diff --git a/elpa/org-9.3.6/ob-haskell.elc b/elpa/org-9.3.6/ob-haskell.elc deleted file mode 100644 index 4528509140d35cb76154d7fd7ebfbd7022ef242a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8155 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 CXNTGV diff --git a/elpa/org-9.3.6/ob-hledger.el b/elpa/org-9.3.6/ob-hledger.el deleted file mode 100644 index 06d03b67..00000000 --- a/elpa/org-9.3.6/ob-hledger.el +++ /dev/null @@ -1,70 +0,0 @@ -;; ob-hledger.el --- Babel Functions for hledger -*- lexical-binding: t; -*- - -;; Copyright (C) 2010-2020 Free Software Foundation, Inc. - -;; Author: Simon Michael -;; Keywords: literate programming, reproducible research, plain text accounting -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Babel support for evaluating hledger entries. -;; -;; Based on ob-ledger.el. -;; If the source block is empty, hledger will use a default journal file, -;; probably ~/.hledger.journal (it may not notice your $LEDGER_FILE env var). -;; So make ~/.hledger.journal a symbolic link to the real file if necessary. - -;;; Code: -(require 'ob) - -(defvar org-babel-default-header-args:hledger - '((:results . "output") (:exports . "results") (:cmdline . "bal")) - "Default arguments to use when evaluating a hledger source block.") - -(defun org-babel-execute:hledger (body params) - "Execute a block of hledger entries with org-babel. -This function is called by `org-babel-execute-src-block'." - (message "executing hledger source code block") - (letrec ( ;(result-params (split-string (or (cdr (assq :results params)) ""))) - (cmdline (cdr (assq :cmdline params))) - (in-file (org-babel-temp-file "hledger-")) - (out-file (org-babel-temp-file "hledger-output-")) - (hledgercmd (concat "hledger" - (if (> (length body) 0) - (concat " -f " (org-babel-process-file-name in-file)) - "") - " " cmdline))) - (with-temp-file in-file (insert body)) -;; TODO This is calling for some refactoring: -;; (concat "hledger" (if ...) " " cmdline) -;; could be built only once and bound to a symbol. - (message "%s" hledgercmd) - (with-output-to-string - (shell-command (concat hledgercmd " > " (org-babel-process-file-name out-file)))) - (with-temp-buffer (insert-file-contents out-file) (buffer-string)))) - -(defun org-babel-prep-session:hledger (_session _params) - (error "hledger does not support sessions")) - -(provide 'ob-hledger) - - - -;;; ob-hledger.el ends here -;; TODO Unit tests are more than welcome, too. diff --git a/elpa/org-9.3.6/ob-hledger.elc b/elpa/org-9.3.6/ob-hledger.elc deleted file mode 100644 index 155183d59dfbc2f1aeb727db4bcfc98405d83f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1894 zcmbtVVQ}OZ^A7Z#ye3VrP{hQMS?~z|brWh5*~zHN$`*Hc*{ z*YA;%od(UY54AywygR;ocRZd>&VN1oZfk3+dvbC@XR2J~h0OdSujstw!qAP>CRY`) zbeMR}ZElyui-Oe3=4Jj5w@{m5*DL>A=7#1#q1s48*){XGekSKPT$9p^aK>k{2qAEo z;Zh<;Is~*iUT@y-_m8zSP#YRjplZ9SZ7`tzvHY}Bx{yO==_ruwUyxLNs*dw$RZ@2 z4RC0*2tD*Z&a*$S=;ya@{-$@Q?@xcb95gB5Ma~TpyU9YkcN6*E)i@qeFiD~qgY_mX zjxb5^jyEHTMmrOhq^A>>vTvXsW2CT6+0%A)=vPlBNgQ=Lzu*=BHDOUQ*us=yBs;x# z5U>L$7-5V%o%ar4+wDm)4krnVdObYB1kMwNeJsHk?KtUp0+uX&4pyml)IQ=7b-oqu zHMp0+2vAJ~jw=x2_=Ph%fWH*(T&PL(1b9B!wf7|M^}dIOL7eWoS+b3XBMbI__|y#a zu6O$*6i7mn_8vHXlzDRa8S_apik^BX%wlqs*ftV#7|@lmxXoN=VN-upN@Ms!QqUZl ztM_%mw$(0F)|PxgRbJ5Xx-Rbz+{$tl`u-HOo5O%M)5g(> zQWK4zp-3W}e&m-(%?;Y2;1;b}Sf%Nz_344H^P*@yO^MO1&H<|B!rh?Yg>f_wnpWKA z72fx*5T$du>-;^I`-iAgGD`_JLY1ZKxB>m-qyHjS=gfr(AOB4&u}Wa^dce$>L4U`lIR@gW;KUVYTYO^zx=^A6hr8+88#*V{2H diff --git a/elpa/org-9.3.6/ob-io.el b/elpa/org-9.3.6/ob-io.el deleted file mode 100644 index 4d1f1542..00000000 --- a/elpa/org-9.3.6/ob-io.el +++ /dev/null @@ -1,108 +0,0 @@ -;;; ob-io.el --- Babel Functions for Io -*- lexical-binding: t; -*- - -;; Copyright (C) 2012-2020 Free Software Foundation, Inc. - -;; Author: Andrzej Lichnerowicz -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: -;; Currently only supports the external execution. No session support yet. -;; :results output -- runs in scripting mode -;; :results output repl -- runs in repl mode - -;;; Requirements: -;; - Io language :: http://iolanguage.org/ -;; - Io major mode :: Can be installed from Io sources -;; https://github.com/stevedekorte/io/blob/master/extras/SyntaxHighlighters/Emacs/io-mode.el - -;;; Code: -(require 'ob) - -(defvar org-babel-tangle-lang-exts) ;; Autoloaded -(add-to-list 'org-babel-tangle-lang-exts '("io" . "io")) -(defvar org-babel-default-header-args:io '()) -(defvar org-babel-io-command "io" - "Name of the command to use for executing Io code.") - -(defun org-babel-execute:io (body params) - "Execute a block of Io code with org-babel. -This function is called by `org-babel-execute-src-block'." - (message "executing Io source code block") - (let* ((processed-params (org-babel-process-params params)) - (session (org-babel-io-initiate-session (nth 0 processed-params))) - (result-params (nth 2 processed-params)) - (result-type (cdr (assq :result-type params))) - (full-body (org-babel-expand-body:generic - body params)) - (result (org-babel-io-evaluate - session full-body result-type result-params))) - - (org-babel-reassemble-table - result - (org-babel-pick-name - (cdr (assq :colname-names params)) (cdr (assq :colnames params))) - (org-babel-pick-name - (cdr (assq :rowname-names params)) (cdr (assq :rownames params)))))) - -(defvar org-babel-io-wrapper-method - "( -%s -) asString print -") - - -(defun org-babel-io-evaluate (session body &optional result-type result-params) - "Evaluate BODY in external Io process. -If RESULT-TYPE equals `output' then return standard output as a string. -If RESULT-TYPE equals `value' then return the value of the last statement -in BODY as elisp." - (when session (error "Sessions are not (yet) supported for Io")) - (pcase result-type - (`output - (if (member "repl" result-params) - (org-babel-eval org-babel-io-command body) - (let ((src-file (org-babel-temp-file "io-"))) - (progn (with-temp-file src-file (insert body)) - (org-babel-eval - (concat org-babel-io-command " " src-file) ""))))) - (`value (let* ((src-file (org-babel-temp-file "io-")) - (wrapper (format org-babel-io-wrapper-method body))) - (with-temp-file src-file (insert wrapper)) - (let ((raw (org-babel-eval - (concat org-babel-io-command " " src-file) ""))) - (org-babel-result-cond result-params - raw - (org-babel-script-escape raw))))))) - - -(defun org-babel-prep-session:io (_session _params) - "Prepare SESSION according to the header arguments specified in PARAMS." - (error "Sessions are not (yet) supported for Io")) - -(defun org-babel-io-initiate-session (&optional _session) - "If there is not a current inferior-process-buffer in SESSION -then create. Return the initialized session. Sessions are not -supported in Io." - nil) - -(provide 'ob-io) - - - -;;; ob-io.el ends here diff --git a/elpa/org-9.3.6/ob-io.elc b/elpa/org-9.3.6/ob-io.elc deleted file mode 100644 index afeed57191f7b4de59951e947113647e0a459dee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3222 zcmbtW+iu%N5Val0NYoD~`qVL<)K(A*;zg1#C>l5QgMr){r4NB+peu4E6DGOL?#hny z^*ytsWciYyZ6uJ~>+I~znKN^6^y=l0D=RClgM$NlsfsGgW$HRvNk@f93|&ZVGF4L8 z??i6qGP7qS@|;vBV7^|~#YMx_O8%rWh zWlD=vg1t_-cSlC5Afr^45>;A(#WOqccQI1>hr^f0$CR82EfNbApS$BlnUYbIh?2&V zawTpY(p<%m6gtnOCVPg3VN{rVDwX7oqHY&YusI3?ZiILu zJn_gIh24QiCt7}*Wm=LNvqgQY{5*qom7e-zF_yV+MLEr-pX1}p&(_e6mnn}r#Gm#l zMeWv3Dkm30FKxnrnB~?#lQ5w6g`S%IOi`KT?bg{>h*Wqd`b{@>Bz~EBxszgDH z;+maS4ZK;IFd7LUOaM_JY=e5Z~jT)lGKL>I?qFYrA;&)<l+(SMp4jR z#Vf!QZj8!iVGwQnP&cvGO~&(qDCljBCe7qlgMdOBBc=e$4Wk=1(+T?qFmf05mfTxu zm0*`&A$SV2Gy#ufWo9$MCc+9A_q4C2VKmsQ3Qk`jOMb54c7LqWtNp1grAC}z&q9>E z5cv$EmPWM{#>ip}L|TFO(o~ft=RVj%(te_HZn&OVbkWl4a(SZZno|mTRHLUq2->Ij zK^pp8YEe~yb0O`SO3B+9l~2v6Y?ClUM^03MqU@;j7=K}JmyYH)aPR>CAcCYWMb0p6 ztk`KCPw4&8@UK@N{0|@B9T6f@Un7$R?Wm);A{q0Ct z_U+b5&<*?KJpde|M=OB0BPqvNKzBF(l_y^FL~j+)?Q!=f?)D$8*EELqfP;bea4@)l zz&F}N90f6+9-clPEDO62F&YLONn!W|Tl$*!ePW7ynDD!OJ%Baf%P{5@>#hM|PkGU^ zQP}UVIW;ied+;aT{aPQW9S)q@qbTmOs*QS4)P4ML!^7TciulUdPCfO?-Mh?Jv7ATGc(*H-o_SP=bLn5F{;ta|h=eYOMYs1D)^d^My2$(& zD2WnbQJy6hI-fMBI??A@o;PQmQb?CN!}(fHna+{J$>TpnFtPBB3&{Dp01xGs#0GqsA!u3N+7b0rPmAX7H&hyx1D})CNRDi%ah6Dc&hMl0`W3U$(1BbXHkk;*d&$ z&*O&A1B4nA`qqoRh~B{)?6^6Pi6l`vD_IEdo?Pp>-Vt5PGZ{GhJti=A5rpM}YsG o(qZc)>>)KUh?}?t`WTUQt`7HlyDnMdQWqHtm2EZlGu3YW0}gMzs{jB1 diff --git a/elpa/org-9.3.6/ob-java.el b/elpa/org-9.3.6/ob-java.el deleted file mode 100644 index 4b3d4548..00000000 --- a/elpa/org-9.3.6/ob-java.el +++ /dev/null @@ -1,85 +0,0 @@ -;;; ob-java.el --- Babel Functions for Java -*- lexical-binding: t; -*- - -;; Copyright (C) 2011-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Currently this only supports the external compilation and execution -;; of java code blocks (i.e., no session support). - -;;; Code: -(require 'ob) - -(defvar org-babel-tangle-lang-exts) -(add-to-list 'org-babel-tangle-lang-exts '("java" . "java")) - -(defcustom org-babel-java-command "java" - "Name of the java command. -May be either a command in the path, like java -or an absolute path name, like /usr/local/bin/java -parameters may be used, like java -verbose" - :group 'org-babel - :version "24.3" - :type 'string) - -(defcustom org-babel-java-compiler "javac" - "Name of the java compiler. -May be either a command in the path, like javac -or an absolute path name, like /usr/local/bin/javac -parameters may be used, like javac -verbose" - :group 'org-babel - :version "24.3" - :type 'string) - -(defun org-babel-execute:java (body params) - (let* ((classname (or (cdr (assq :classname params)) - (error - "Can't compile a java block without a classname"))) - (packagename (file-name-directory classname)) - (src-file (concat classname ".java")) - (cmpflag (or (cdr (assq :cmpflag params)) "")) - (cmdline (or (cdr (assq :cmdline params)) "")) - (full-body (org-babel-expand-body:generic body params))) - (with-temp-file src-file (insert full-body)) - (org-babel-eval - (concat org-babel-java-compiler " " cmpflag " " src-file) "") - ;; created package-name directories if missing - (unless (or (not packagename) (file-exists-p packagename)) - (make-directory packagename 'parents)) - (let ((results (org-babel-eval (concat org-babel-java-command - " " cmdline " " classname) ""))) - (org-babel-reassemble-table - (org-babel-result-cond (cdr (assq :result-params params)) - (org-babel-read results) - (let ((tmp-file (org-babel-temp-file "c-"))) - (with-temp-file tmp-file (insert results)) - (org-babel-import-elisp-from-file tmp-file))) - (org-babel-pick-name - (cdr (assq :colname-names params)) (cdr (assq :colnames params))) - (org-babel-pick-name - (cdr (assq :rowname-names params)) (cdr (assq :rownames params))))))) - -(provide 'ob-java) - - - -;;; ob-java.el ends here diff --git a/elpa/org-9.3.6/ob-java.elc b/elpa/org-9.3.6/ob-java.elc deleted file mode 100644 index e9d362e961f396623536d5c0bd9e44819ae6cd6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2753 zcmbtW&2!sC6i;a5wq`iPjTgDlxKlaO%93d^41~0Y&QR!3E=-ieN?JQ=B(1uVlZL;Z z-&;ABJ0`=F+N0I(+xMmSef;v*)30}Sc815t$8@U8Ixkda4|zo|OPMxwrA(9SibOOC z?9FxFUXUyb(si4c`QNg|bu$^-%RevjhUVZx%SJVn-Bhy7Q_6JOv?i|>%`@DZrX`tW zDx;4u>zm_8xDsD$xW-=RA-8uIPg3?{(dZc-UvJa zo@wl?AR$f>o>?3)hVQ?4ffaZ@@cbzrVEDlBfg!x_AN6#?@9BhKI>9t|(s?t7&Ww7$ z%#9+Qum{~%yG0IfYO`46Uv`9XrGZqDOd4G*+wPta)M|xvxNOW} zp`qbnl2?Z;EUs!qWvMtUsqDld8?p_yh+r zO}M+ii&yl9Q{ny^>l+|->9n_o(Jf329t=Dy~I~c^(CWjzEsR+UW$^#oJ2qHFF_!Brmt69K|XBNb~ zVXP@2Q*R66Z$Yf>!%eDS3un3o344f`MJ%gR$nsf1HuUKr;aVTAVFFa)ram1++}j5e z6iE9~Auz)!AU+({m%h8*8HWGr&b?1}XBh25Zp8NCB?wWVBX98K$^(%>6}wpJ>hn1CjnGPn@I`k+a+<| z*GqJ6T2nc;)w|5V&CnLoR+}4gCQOCGm6r9qkPC9`J}dHSv&gFtHOjl2=I;88z7mD{(@u0wE#^Vr|vBSeF3 zpZ17Oc7>55l`X~_R+`RMQZ4JtyeL+(&PmX<$symU1vj56$KbQ>cIrwNi*R(dzHCNdFmm zS!>g}3Nrvm4Vt>8?-A-ey|m$hV9YV SL2dL^j=|`OPHg`h5B~wDVI+(I diff --git a/elpa/org-9.3.6/ob-js.el b/elpa/org-9.3.6/ob-js.el deleted file mode 100644 index 8f66d102..00000000 --- a/elpa/org-9.3.6/ob-js.el +++ /dev/null @@ -1,206 +0,0 @@ -;;; ob-js.el --- Babel Functions for Javascript -*- lexical-binding: t; -*- - -;; Copyright (C) 2010-2020 Free Software Foundation, Inc. - -;; Author: Eric Schulte -;; Keywords: literate programming, reproducible research, js -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; Now working with SBCL for both session and external evaluation. -;; -;; This certainly isn't optimally robust, but it seems to be working -;; for the basic use cases. - -;;; Requirements: - -;; - a non-browser javascript engine such as node.js http://nodejs.org/ -;; or mozrepl http://wiki.github.com/bard/mozrepl/ -;; -;; - for session based evaluation mozrepl and moz.el are required see -;; http://wiki.github.com/bard/mozrepl/emacs-integration for -;; configuration instructions - -;;; Code: -(require 'ob) - -(declare-function run-mozilla "ext:moz" (arg)) -(declare-function httpd-start "ext:simple-httpd" ()) -(declare-function run-skewer "ext:skewer-mode" ()) -(declare-function skewer-repl "ext:skewer-repl" ()) -(declare-function indium-run-node "ext:indium-nodejs" (command)) -(declare-function indium-eval "ext:indium-interaction" (string &optional callback)) - -(defvar org-babel-default-header-args:js '() - "Default header arguments for js code blocks.") - -(defvar org-babel-js-eoe "org-babel-js-eoe" - "String to indicate that evaluation has completed.") - -(defcustom org-babel-js-cmd "node" - "Name of command used to evaluate js blocks." - :group 'org-babel - :version "24.1" - :type '(choice (const "node") - (const "mozrepl") - (const "skewer-mode") - (const "indium") - (const "js-comint")) - :safe #'stringp) - -(defvar org-babel-js-function-wrapper - "require('sys').print(require('sys').inspect(function(){\n%s\n}()));" - "Javascript code to print value of body.") - -(defun org-babel-execute:js (body params) - "Execute a block of Javascript code with org-babel. -This function is called by `org-babel-execute-src-block'." - (let* ((org-babel-js-cmd (or (cdr (assq :cmd params)) org-babel-js-cmd)) - (session (cdr (assq :session params))) - (result-type (cdr (assq :result-type params))) - (full-body (org-babel-expand-body:generic - body params (org-babel-variable-assignments:js params))) - (result (cond - ;; no session specified, external evaluation - ((string= session "none") - (let ((script-file (org-babel-temp-file "js-script-"))) - (with-temp-file script-file - (insert - ;; return the value or the output - (if (string= result-type "value") - (format org-babel-js-function-wrapper full-body) - full-body))) - (org-babel-eval - (format "%s %s" org-babel-js-cmd - (org-babel-process-file-name script-file)) ""))) - ;; Indium Node REPL. Separate case because Indium - ;; REPL is not inherited from Comint mode. - ((string= session "*JS REPL*") - (require 'indium-repl) - (unless (get-buffer session) - (indium-run-node org-babel-js-cmd)) - (indium-eval full-body)) - ;; session evaluation - (t - (let ((session (org-babel-prep-session:js - (cdr (assq :session params)) params))) - (nth 1 - (org-babel-comint-with-output - (session (format "%S" org-babel-js-eoe) t body) - (dolist (code (list body (format "%S" org-babel-js-eoe))) - (insert (org-babel-chomp code)) - (comint-send-input nil t))))))))) - (org-babel-result-cond (cdr (assq :result-params params)) - result (org-babel-js-read result)))) - -(defun org-babel-js-read (results) - "Convert RESULTS into an appropriate elisp value. -If RESULTS look like a table, then convert them into an -Emacs-lisp table, otherwise return the results as a string." - (org-babel-read - (if (and (stringp results) - (string-prefix-p "[" results) - (string-suffix-p "]" results)) - (org-babel-read - (concat "'" - (replace-regexp-in-string - "\\[" "(" (replace-regexp-in-string - "\\]" ")" (replace-regexp-in-string - ",[[:space:]]" " " - (replace-regexp-in-string - "'" "\"" results)))))) - results))) - -(defun org-babel-js-var-to-js (var) - "Convert VAR into a js variable. -Convert an elisp value into a string of js source code -specifying a variable of the same value." - (if (listp var) - (concat "[" (mapconcat #'org-babel-js-var-to-js var ", ") "]") - (replace-regexp-in-string "\n" "\\\\n" (format "%S" var)))) - -(defun org-babel-prep-session:js (session params) - "Prepare SESSION according to the header arguments specified in PARAMS." - (let* ((session (org-babel-js-initiate-session session)) - (var-lines (org-babel-variable-assignments:js params))) - (when session - (org-babel-comint-in-buffer session - (goto-char (point-max)) - (dolist (var var-lines) - (insert var) - (comint-send-input nil t) - (org-babel-comint-wait-for-output session) - (sit-for .1) - (goto-char (point-max))))) - session)) - -(defun org-babel-variable-assignments:js (params) - "Return list of Javascript statements assigning the block's variables." - (mapcar - (lambda (pair) (format "var %s=%s;" - (car pair) (org-babel-js-var-to-js (cdr pair)))) - (org-babel--get-vars params))) - -(defun org-babel-js-initiate-session (&optional session _params) - "If there is not a current inferior-process-buffer in `SESSION' -then create. Return the initialized session." - (cond - ((string= session "none") - (warn "Session evaluation of ob-js is not supported")) - ((string= "*skewer-repl*" session) - (require 'skewer-repl) - (let ((session-buffer (get-buffer "*skewer-repl*"))) - (if (and session-buffer - (org-babel-comint-buffer-livep (get-buffer session-buffer)) - (comint-check-proc session-buffer)) - session-buffer - ;; start skewer REPL. - (httpd-start) - (run-skewer) - (skewer-repl) - session-buffer))) - ((string= "*Javascript REPL*" session) - (require 'js-comint) - (let ((session-buffer "*Javascript REPL*")) - (if (and (org-babel-comint-buffer-livep (get-buffer session-buffer)) - (comint-check-proc session-buffer)) - session-buffer - (call-interactively 'run-js) - (sit-for .5) - session-buffer))) - ((string= "mozrepl" org-babel-js-cmd) - (require 'moz) - (let ((session-buffer (save-window-excursion - (run-mozilla nil) - (rename-buffer session) - (current-buffer)))) - (if (org-babel-comint-buffer-livep session-buffer) - (progn (sit-for .25) session-buffer) - (sit-for .5) - (org-babel-js-initiate-session session)))) - ((string= "node" org-babel-js-cmd ) - (error "Session evaluation with node.js is not supported")) - (t - (error "Sessions are only supported with mozrepl add \":cmd mozrepl\"")))) - -(provide 'ob-js) - - - -;;; ob-js.el ends here diff --git a/elpa/org-9.3.6/ob-js.elc b/elpa/org-9.3.6/ob-js.elc deleted file mode 100644 index c1e8f12acd4d19f460ccaddf0dec1a1c1839679b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6838 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 diff --git a/elpa/magit-20200418.939/magit-remote.el b/elpa/magit-20200418.939/magit-remote.el deleted file mode 100644 index ab74ac81..00000000 --- a/elpa/magit-20200418.939/magit-remote.el +++ /dev/null @@ -1,341 +0,0 @@ -;;; magit-remote.el --- transfer Git commits -*- lexical-binding: t -*- - -;; Copyright (C) 2008-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements remote commands. - -;;; Code: - -(require 'magit) - -;;; Options - -(defcustom magit-remote-add-set-remote.pushDefault 'ask-if-unset - "Whether to set the value of `remote.pushDefault' after adding a remote. - -If `ask', then always ask. If `ask-if-unset', then ask, but only -if the variable isn't set already. If nil, then don't ever set. -If the value is a string, then set without asking, provided that -the name of the added remote is equal to that string and the -variable isn't already set." - :package-version '(magit . "2.4.0") - :group 'magit-commands - :type '(choice (const :tag "ask if unset" ask-if-unset) - (const :tag "always ask" ask) - (string :tag "set if named") - (const :tag "don't set"))) - -(defcustom magit-remote-direct-configure t - "Whether the command `magit-remote' shows Git variables. -When set to nil, no variables are displayed by this transient -command, instead the sub-transient `magit-remote-configure' -has to be used to view and change remote related variables." - :package-version '(magit . "2.12.0") - :group 'magit-commands - :type 'boolean) - -(defcustom magit-prefer-push-default nil - "Whether to prefer `remote.pushDefault' over per-branch variables." - :package-version '(magit . "3.0.0") - :group 'magit-commands - :type 'boolean) - -;;; Commands - -;;;###autoload (autoload 'magit-remote "magit-remote" nil t) -(define-transient-command magit-remote (remote) - "Add, configure or remove a remote." - :man-page "git-remote" - :value '("-f") - ["Variables" - :if (lambda () - (and magit-remote-direct-configure - (oref transient--prefix scope))) - ("u" magit-remote..url) - ("U" magit-remote..fetch) - ("s" magit-remote..pushurl) - ("S" magit-remote..push) - ("O" magit-remote..tagopt)] - ["Arguments for add" - ("-f" "Fetch after add" "-f")] - ["Actions" - [("a" "Add" magit-remote-add) - ("r" "Rename" magit-remote-rename) - ("k" "Remove" magit-remote-remove)] - [("C" "Configure..." magit-remote-configure) - ("p" "Prune stale branches" magit-remote-prune) - ("P" "Prune stale refspecs" magit-remote-prune-refspecs)]] - (interactive (list (magit-get-current-remote))) - (transient-setup 'magit-remote nil nil :scope remote)) - -(defun magit-read-url (prompt &optional initial-input) - (let ((url (magit-read-string-ns prompt initial-input))) - (if (string-prefix-p "~" url) - (expand-file-name url) - url))) - -;;;###autoload -(defun magit-remote-add (remote url &optional args) - "Add a remote named REMOTE and fetch it." - (interactive (list (magit-read-string-ns "Remote name") - (magit-read-url "Remote url") - (transient-args 'magit-remote))) - (if (pcase (list magit-remote-add-set-remote.pushDefault - (magit-get "remote.pushDefault")) - (`(,(pred stringp) ,_) t) - ((or `(ask ,_) `(ask-if-unset nil)) - (y-or-n-p (format "Set `remote.pushDefault' to \"%s\"? " remote)))) - (progn (magit-call-git "remote" "add" args remote url) - (setf (magit-get "remote.pushDefault") remote) - (magit-refresh)) - (magit-run-git-async "remote" "add" args remote url))) - -;;;###autoload -(defun magit-remote-rename (old new) - "Rename the remote named OLD to NEW." - (interactive - (let ((remote (magit-read-remote "Rename remote"))) - (list remote (magit-read-string-ns (format "Rename %s to" remote))))) - (unless (string= old new) - (magit-call-git "remote" "rename" old new) - (magit-remote--cleanup-push-variables old new) - (magit-refresh))) - -;;;###autoload -(defun magit-remote-remove (remote) - "Delete the remote named REMOTE." - (interactive (list (magit-read-remote "Delete remote"))) - (magit-call-git "remote" "rm" remote) - (magit-remote--cleanup-push-variables remote) - (magit-refresh)) - -(defun magit-remote--cleanup-push-variables (remote &optional new-name) - (magit-with-toplevel - (when (equal (magit-get "remote.pushDefault") remote) - (magit-set new-name "remote.pushDefault")) - (dolist (var (magit-git-lines "config" "--name-only" - "--get-regexp" "^branch\.[^.]*\.pushRemote" - (format "^%s$" remote))) - (magit-call-git "config" (and (not new-name) "--unset") var new-name)))) - -(defconst magit--refspec-re "\\`\\(\\+\\)?\\([^:]+\\):\\(.*\\)\\'") - -;;;###autoload -(defun magit-remote-prune (remote) - "Remove stale remote-tracking branches for REMOTE." - (interactive (list (magit-read-remote "Prune stale branches of remote"))) - (magit-run-git-async "remote" "prune" remote)) - -;;;###autoload -(defun magit-remote-prune-refspecs (remote) - "Remove stale refspecs for REMOTE. - -A refspec is stale if there no longer exists at least one branch -on the remote that would be fetched due to that refspec. A stale -refspec is problematic because its existence causes Git to refuse -to fetch according to the remaining non-stale refspecs. - -If only stale refspecs remain, then offer to either delete the -remote or to replace the stale refspecs with the default refspec. - -Also remove the remote-tracking branches that were created due to -the now stale refspecs. Other stale branches are not removed." - (interactive (list (magit-read-remote "Prune refspecs of remote"))) - (let* ((tracking-refs (magit-list-remote-branches remote)) - (remote-refs (magit-remote-list-refs remote)) - (variable (format "remote.%s.fetch" remote)) - (refspecs (magit-get-all variable)) - stale) - (dolist (refspec refspecs) - (when (string-match magit--refspec-re refspec) - (let ((theirs (match-string 2 refspec)) - (ours (match-string 3 refspec))) - (unless (if (string-match "\\*" theirs) - (let ((re (replace-match ".*" t t theirs))) - (--some (string-match-p re it) remote-refs)) - (member theirs remote-refs)) - (push (cons refspec - (if (string-match "\\*" ours) - (let ((re (replace-match ".*" t t ours))) - (--filter (string-match-p re it) tracking-refs)) - (list (car (member ours tracking-refs))))) - stale))))) - (if (not stale) - (message "No stale refspecs for remote %S" remote) - (if (= (length stale) - (length refspecs)) - (magit-read-char-case - (format "All of %s's refspecs are stale. " remote) nil - (?s "replace with [d]efault refspec" - (magit-set-all - (list (format "+refs/heads/*:refs/remotes/%s/*" remote)) - variable)) - (?r "[r]emove remote" - (magit-call-git "remote" "rm" remote)) - (?a "or [a]abort" - (user-error "Abort"))) - (if (if (= (length stale) 1) - (pcase-let ((`(,refspec . ,refs) (car stale))) - (magit-confirm 'prune-stale-refspecs - (format "Prune stale refspec %s and branch %%s" refspec) - (format "Prune stale refspec %s and %%i branches" refspec) - nil refs)) - (magit-confirm 'prune-stale-refspecs nil - (format "Prune %%i stale refspecs and %i branches" - (length (cl-mapcan (lambda (s) (copy-sequence (cdr s))) - stale))) - nil - (mapcar (pcase-lambda (`(,refspec . ,refs)) - (concat refspec "\n" - (mapconcat (lambda (b) (concat " " b)) - refs "\n"))) - stale))) - (pcase-dolist (`(,refspec . ,refs) stale) - (magit-call-git "config" "--unset" variable - (regexp-quote refspec)) - (magit--log-action - (lambda (refs) - (format "Deleting %i branches" (length refs))) - (lambda (ref) - (format "Deleting branch %s (was %s)" ref - (magit-rev-parse "--short" ref))) - refs) - (dolist (ref refs) - (magit-call-git "update-ref" "-d" ref))) - (user-error "Abort"))) - (magit-refresh)))) - -;;;###autoload -(defun magit-remote-set-head (remote &optional branch) - "Set the local representation of REMOTE's default branch. -Query REMOTE and set the symbolic-ref refs/remotes//HEAD -accordingly. With a prefix argument query for the branch to be -used, which allows you to select an incorrect value if you fancy -doing that." - (interactive - (let ((remote (magit-read-remote "Set HEAD for remote"))) - (list remote - (and current-prefix-arg - (magit-read-remote-branch (format "Set %s/HEAD to" remote) - remote nil nil t))))) - (magit-run-git "remote" "set-head" remote (or branch "--auto"))) - -;;;###autoload -(defun magit-remote-unset-head (remote) - "Unset the local representation of REMOTE's default branch. -Delete the symbolic-ref \"refs/remotes//HEAD\"." - (interactive (list (magit-read-remote "Unset HEAD for remote"))) - (magit-run-git "remote" "set-head" remote "--delete")) - -;;; Configure - -;;;###autoload (autoload 'magit-remote-configure "magit-remote" nil t) -(define-transient-command magit-remote-configure (remote) - "Configure a remote." - :man-page "git-remote" - [:description - (lambda () - (concat - (propertize "Configure " 'face 'transient-heading) - (propertize (oref transient--prefix scope) 'face 'magit-branch-remote))) - ("u" magit-remote..url) - ("U" magit-remote..fetch) - ("s" magit-remote..pushurl) - ("S" magit-remote..push) - ("O" magit-remote..tagopt)] - (interactive - (list (or (and (not current-prefix-arg) - (not (and magit-remote-direct-configure - (eq current-transient-command 'magit-remote))) - (magit-get-current-remote)) - (magit--read-remote-scope)))) - (transient-setup 'magit-remote-configure nil nil :scope remote)) - -(defun magit--read-remote-scope (&optional obj) - (magit-read-remote - (if obj - (format "Set %s for remote" - (format (oref obj variable) "")) - "Configure remote"))) - -(define-infix-command magit-remote..url () - :class 'magit--git-variable:urls - :scope 'magit--read-remote-scope - :variable "remote.%s.url" - :multi-value t - :history-key 'magit-remote..*url) - -(define-infix-command magit-remote..fetch () - :class 'magit--git-variable - :scope 'magit--read-remote-scope - :variable "remote.%s.fetch" - :multi-value t) - -(define-infix-command magit-remote..pushurl () - :class 'magit--git-variable:urls - :scope 'magit--read-remote-scope - :variable "remote.%s.pushurl" - :multi-value t - :history-key 'magit-remote..*url - :seturl-arg "--push") - -(define-infix-command magit-remote..push () - :class 'magit--git-variable - :scope 'magit--read-remote-scope - :variable "remote.%s.push") - -(define-infix-command magit-remote..tagopt () - :class 'magit--git-variable:choices - :scope 'magit--read-remote-scope - :variable "remote.%s.tagOpt" - :choices '("--no-tags" "--tags")) - -;;; Transfer Utilities - -(defun magit--push-remote-variable (&optional branch short) - (unless branch - (setq branch (magit-get-current-branch))) - (magit--propertize-face - (if (or (not branch) magit-prefer-push-default) - (if short "pushDefault" "remote.pushDefault") - (if short "pushRemote" (format "branch.%s.pushRemote" branch))) - 'bold)) - -(defun magit--select-push-remote (prompt-suffix) - (let* ((branch (or (magit-get-current-branch) - (user-error "No branch is checked out"))) - (remote (magit-get-push-remote branch))) - (when (or current-prefix-arg - (not remote) - (not (member remote (magit-list-remotes)))) - (setq remote - (magit-read-remote (format "Set %s and %s" - (magit--push-remote-variable) - prompt-suffix))) - (setf (magit-get (magit--push-remote-variable branch)) remote)) - (list branch remote))) - -;;; _ -(provide 'magit-remote) -;;; magit-remote.el ends here diff --git a/elpa/magit-20200418.939/magit-remote.elc b/elpa/magit-20200418.939/magit-remote.elc deleted file mode 100644 index dad6c58acec3b7fb6b1d43fb5c6c8c00800723ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14858 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%0DK!+X_&QSl6ifyV)!P{Xu z+En$MY(WK(-U9>HkZrewNf-@0%0yF)gEZwr_6sy6t0tZ5l5%sgiz+IoWz^dSe%u-} zj;Y^15WDFf`4i=OsZGQS!8{|-QrmJPP`vA(tLBRuet@>@x%3Qjrvvgd@4R#G0+me6 zuUqJtSXN6McJ}ezR>VTW%E%jkq=g<1kujzZA9VRfE|fmp#S??)E>6La8XR`0*pGEi|?isRh+XRsG`AZsu%FoB%fL~2c(jv40nTW zcK%w@9Fl*OAV?M`ppTD;s0_j@1%Uw(sBHWg8*^No*Dp}oY7#W%xLx&EWw363H>ChX zY1=5iG^yvq{q{b zHG5GVze4wJH{I8&nFJru9ZC?`AqnA{JP@Q_US6|##wbrGFb$MAptNt8c{K+2RD(gz z=%^IbwLV*v=AS6=Bz;&%mCh=WQ$m@}3!v@8mY|Xo#aE*kSq@nV?45VcpxrWofQIY9 zPU79z`s*}6-X>qOyi*m4R!XnO7x5_c2{E<{54B3_Hqyf{o*qBh$|Knk9X0rxPw+s? zxc8Q~E+Dzp-P9);2 z$erCMYJ1(*l~gvVRWwI%NF<0uOm@k;LbOp4l8>&`Xo$%8W7#LOC#byc1{}ISMSUf; zX8Dj;l5TyHpg3kxw$Z?fMM#Or?amaGmYRFIpxLzB)pVbPv-R&aocU@x|6GFs1TiVd z#WP%TEah@Vs+}J~SR$hwH{ED@>j`;Z6JYXLo?Ny$g_VL%VUwO9#YVf9lI=9ru?a5P z&7PLXDF;+Iro;mZ?TMTeLAPfg&OP;TZ)TJ{Acu!+CT0&ilnDP3#~w~}BQbA3p`Tb# zNgoa1`q1T9&mh@!*|0G07PO67QKJFw0`njJ`&C<42-Mi@HzI^xmnX;XD6+fR6E3JqY!N zz5`MU9+J8KVc7huo(n+WEQk&s79e-T`jaf0RE z&JQTU{0#i<%Ifx~1_=Q0~ZT^=H;HeDt#|Nd$ET zsNae<@hVobY -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for listing repositories. This -;; includes getting a Lisp list of known repositories as well as a -;; mode for listing repositories in a buffer. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit-core) - -(declare-function magit-status-setup-buffer "magit-status" (directory)) - -(defvar x-stretch-cursor) - -;;; Options - -(defcustom magit-repository-directories nil - "List of directories that are or contain Git repositories. - -Each element has the form (DIRECTORY . DEPTH). DIRECTORY has -to be a directory or a directory file-name, a string. DEPTH, -an integer, specifies the maximum depth to look for Git -repositories. If it is 0, then only add DIRECTORY itself. - -This option controls which repositories are being listed by -`magit-list-repositories'. It also affects `magit-status' -\(which see) in potentially surprising ways." - :package-version '(magit . "3.0.0") - :group 'magit-essentials - :type '(repeat (cons directory (integer :tag "Depth")))) - -(defgroup magit-repolist nil - "List repositories in a buffer." - :link '(info-link "(magit)Repository List") - :group 'magit-modes) - -(defcustom magit-repolist-mode-hook '(hl-line-mode) - "Hook run after entering Magit-Repolist mode." - :package-version '(magit . "2.9.0") - :group 'magit-repolist - :type 'hook - :get 'magit-hook-custom-get - :options '(hl-line-mode)) - -(defcustom magit-repolist-columns - '(("Name" 25 magit-repolist-column-ident nil) - ("Version" 25 magit-repolist-column-version nil) - ("BU" 3 magit-repolist-column-unpushed-to-upstream - ((:right-align t) - (:help-echo "Local changes not in upstream"))) - ("Path" 99 magit-repolist-column-path nil)) - "List of columns displayed by `magit-list-repositories'. - -Each element has the form (HEADER WIDTH FORMAT PROPS). - -HEADER is the string displayed in the header. WIDTH is the width -of the column. FORMAT is a function that is called with one -argument, the repository identification (usually its basename), -and with `default-directory' bound to the toplevel of its working -tree. It has to return a string to be inserted or nil. PROPS is -an alist that supports the keys `:right-align' and `:pad-right'. -Some entries also use `:help-echo', but `tabulated-list' does not -actually support that yet." - :package-version '(magit . "2.12.0") - :group 'magit-repolist - :type `(repeat (list :tag "Column" - (string :tag "Header Label") - (integer :tag "Column Width") - (function :tag "Inserter Function") - (repeat :tag "Properties" - (list (choice :tag "Property" - (const :right-align) - (const :pad-right) - (symbol)) - (sexp :tag "Value")))))) - -(defcustom magit-repolist-column-flag-alist - '((magit-untracked-files . "N") - (magit-unstaged-files . "U") - (magit-staged-files . "S")) - "Association list of predicates and flags for `magit-repolist-column-flag'. - -Each element is of the form (FUNCTION . FLAG). Each FUNCTION is -called with no arguments, with `default-directory' bound to the -top level of a repository working tree, until one of them returns -a non-nil value. FLAG corresponding to that function is returned -as the value of `magit-repolist-column-flag'." - :package-version '(magit . "3.0.0") - :group 'magit-repolist - :type '(alist :key-type (function :tag "Predicate Function") - :value-type (string :tag "Flag"))) - -;;; List Repositories -;;;; Command -;;;###autoload -(defun magit-list-repositories () - "Display a list of repositories. - -Use the options `magit-repository-directories' to control which -repositories are displayed." - (interactive) - (if magit-repository-directories - (with-current-buffer (get-buffer-create "*Magit Repositories*") - (magit-repolist-mode) - (magit-repolist-refresh) - (tabulated-list-print) - (switch-to-buffer (current-buffer))) - (message "You need to customize `magit-repository-directories' %s" - "before you can list repositories"))) - -;;;; Mode - -(defvar magit-repolist-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map tabulated-list-mode-map) - (define-key map (kbd "C-m") 'magit-repolist-status) - map) - "Local keymap for Magit-Repolist mode buffers.") - -(defun magit-repolist-status (&optional _button) - "Show the status for the repository at point." - (interactive) - (--if-let (tabulated-list-get-id) - (magit-status-setup-buffer (expand-file-name it)) - (user-error "There is no repository at point"))) - -(define-derived-mode magit-repolist-mode tabulated-list-mode "Repos" - "Major mode for browsing a list of Git repositories." - (setq-local x-stretch-cursor nil) - (setq tabulated-list-padding 0) - (setq tabulated-list-sort-key (cons "Path" nil)) - (setq tabulated-list-format - (vconcat (mapcar (pcase-lambda (`(,title ,width ,_fn ,props)) - (nconc (list title width t) - (-flatten props))) - magit-repolist-columns))) - (tabulated-list-init-header) - (add-hook 'tabulated-list-revert-hook 'magit-repolist-refresh nil t) - (setq imenu-prev-index-position-function - 'magit-imenu--repolist-prev-index-position-function) - (setq imenu-extract-index-name-function - 'magit-imenu--repolist-extract-index-name-function)) - -(defun magit-repolist-refresh () - (setq tabulated-list-entries - (mapcar (pcase-lambda (`(,id . ,path)) - (let ((default-directory path)) - (list path - (vconcat (--map (or (funcall (nth 2 it) id) "") - magit-repolist-columns))))) - (magit-list-repos-uniquify - (--map (cons (file-name-nondirectory (directory-file-name it)) - it) - (magit-list-repos)))))) - -;;;; Columns - -(defun magit-repolist-column-ident (id) - "Insert the identification of the repository. -Usually this is just its basename." - id) - -(defun magit-repolist-column-path (_id) - "Insert the absolute path of the repository." - (abbreviate-file-name default-directory)) - -(defun magit-repolist-column-version (_id) - "Insert a description of the repository's `HEAD' revision." - (when-let ((v (or (magit-git-string "describe" "--tags" "--dirty") - ;; If there are no tags, use the date in MELPA format. - (magit-git-string "show" "--no-patch" "--format=%cd-g%h" - "--date=format:%Y%m%d.%H%M")))) - (save-match-data - (when (string-match "-dirty\\'" v) - (magit--put-face (1+ (match-beginning 0)) (length v) 'error v)) - (if (and v (string-match "\\`[0-9]" v)) - (concat " " v) - v)))) - -(defun magit-repolist-column-branch (_id) - "Insert the current branch." - (magit-get-current-branch)) - -(defun magit-repolist-column-upstream (_id) - "Insert the upstream branch of the current branch." - (magit-get-upstream-branch)) - -(defun magit-repolist-column-flag (_id) - "Insert a flag as specified by `magit-repolist-column-flag-alist'. - -By default this indicates whether there are uncommitted changes. -- N if there is at least one untracked file. -- U if there is at least one unstaged file. -- S if there is at least one staged file. -Only one letter is shown, the first that applies." - (-some (pcase-lambda (`(,fun . ,flag)) - (and (funcall fun) flag)) - magit-repolist-column-flag-alist)) - -(defun magit-repolist-column-unpulled-from-upstream (_id) - "Insert number of upstream commits not in the current branch." - (--when-let (magit-get-upstream-branch) - (let ((n (cadr (magit-rev-diff-count "HEAD" it)))) - (magit--propertize-face - (number-to-string n) (if (> n 0) 'bold 'shadow))))) - -(defun magit-repolist-column-unpulled-from-pushremote (_id) - "Insert number of commits in the push branch but not the current branch." - (--when-let (magit-get-push-branch nil t) - (let ((n (cadr (magit-rev-diff-count "HEAD" it)))) - (magit--propertize-face - (number-to-string n) (if (> n 0) 'bold 'shadow))))) - -(defun magit-repolist-column-unpushed-to-upstream (_id) - "Insert number of commits in the current branch but not its upstream." - (--when-let (magit-get-upstream-branch) - (let ((n (car (magit-rev-diff-count "HEAD" it)))) - (magit--propertize-face - (number-to-string n) (if (> n 0) 'bold 'shadow))))) - -(defun magit-repolist-column-unpushed-to-pushremote (_id) - "Insert number of commits in the current branch but not its push branch." - (--when-let (magit-get-push-branch nil t) - (let ((n (car (magit-rev-diff-count "HEAD" it)))) - (magit--propertize-face - (number-to-string n) (if (> n 0) 'bold 'shadow))))) - -(defun magit-repolist-column-branches (_id) - "Insert number of branches." - (let ((n (length (magit-list-local-branches)))) - (magit--propertize-face (number-to-string n) (if (> n 1) 'bold 'shadow)))) - -(defun magit-repolist-column-stashes (_id) - "Insert number of stashes." - (let ((n (length (magit-list-stashes)))) - (magit--propertize-face (number-to-string n) (if (> n 0) 'bold 'shadow)))) - -;;; Read Repository - -(defun magit-read-repository (&optional read-directory-name) - "Read a Git repository in the minibuffer, with completion. - -The completion choices are the basenames of top-levels of -repositories found in the directories specified by option -`magit-repository-directories'. In case of name conflicts -the basenames are prefixed with the name of the respective -parent directories. The returned value is the actual path -to the selected repository. - -If READ-DIRECTORY-NAME is non-nil or no repositories can be -found based on the value of `magit-repository-directories', -then read an arbitrary directory using `read-directory-name' -instead." - (if-let ((repos (and (not read-directory-name) - magit-repository-directories - (magit-repos-alist)))) - (let ((reply (magit-completing-read "Git repository" repos))) - (file-name-as-directory - (or (cdr (assoc reply repos)) - (if (file-directory-p reply) - (expand-file-name reply) - (user-error "Not a repository or a directory: %s" reply))))) - (file-name-as-directory - (read-directory-name "Git repository: " - (or (magit-toplevel) default-directory))))) - -(defun magit-list-repos () - (cl-mapcan (pcase-lambda (`(,dir . ,depth)) - (magit-list-repos-1 dir depth)) - magit-repository-directories)) - -(defun magit-list-repos-1 (directory depth) - (cond ((file-readable-p (expand-file-name ".git" directory)) - (list (file-name-as-directory directory))) - ((and (> depth 0) (magit-file-accessible-directory-p directory)) - (--mapcat (and (file-directory-p it) - (magit-list-repos-1 it (1- depth))) - (directory-files directory t - directory-files-no-dot-files-regexp t))))) - -(defun magit-list-repos-uniquify (alist) - (let (result (dict (make-hash-table :test 'equal))) - (dolist (a (delete-dups alist)) - (puthash (car a) (cons (cdr a) (gethash (car a) dict)) dict)) - (maphash - (lambda (key value) - (if (= (length value) 1) - (push (cons key (car value)) result) - (setq result - (append result - (magit-list-repos-uniquify - (--map (cons (concat - key "\\" - (file-name-nondirectory - (directory-file-name - (substring it 0 (- (1+ (length key))))))) - it) - value)))))) - dict) - result)) - -(defun magit-repos-alist () - (magit-list-repos-uniquify - (--map (cons (file-name-nondirectory (directory-file-name it)) it) - (magit-list-repos)))) - -;;; _ -(provide 'magit-repos) -;;; magit-repos.el ends here diff --git a/elpa/magit-20200418.939/magit-repos.elc b/elpa/magit-20200418.939/magit-repos.elc deleted file mode 100644 index d699fec9ecbe3af88086b2f136c5280ebf45acc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14493 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 KY*Us}+x%aHWC6bb diff --git a/elpa/magit-20200418.939/magit-reset.el b/elpa/magit-20200418.939/magit-reset.el deleted file mode 100644 index 823a6753..00000000 --- a/elpa/magit-20200418.939/magit-reset.el +++ /dev/null @@ -1,127 +0,0 @@ -;;; magit-reset.el --- reset fuctionality -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements reset commands. - -;;; Code: - -(require 'magit) - -;;;###autoload (autoload 'magit-reset "magit" nil t) -(define-transient-command magit-reset () - "Reset the `HEAD', index and/or worktree to a previous state." - :man-page "git-reset" - ["Reset" - ("m" "mixed (HEAD and index)" magit-reset-mixed) - ("s" "soft (HEAD only)" magit-reset-soft) - ("h" "hard (HEAD, index and files)" magit-reset-hard) - ("i" "index (only)" magit-reset-index) - ("w" "worktree (only)" magit-reset-worktree) - "" - ("f" "a file" magit-file-checkout)]) - -;;;###autoload -(defun magit-reset-mixed (commit) - "Reset the `HEAD' and index to COMMIT, but not the working tree. -\n(git reset --mixed COMMIT)" - (interactive (list (magit-reset-read-branch-or-commit "Reset %s to"))) - (magit-reset-internal "--mixed" commit)) - -;;;###autoload -(defun magit-reset-soft (commit) - "Reset the `HEAD' to COMMIT, but not the index and working tree. -\n(git reset --soft REVISION)" - (interactive (list (magit-reset-read-branch-or-commit "Soft reset %s to"))) - (magit-reset-internal "--soft" commit)) - -;;;###autoload -(defun magit-reset-hard (commit) - "Reset the `HEAD', index, and working tree to COMMIT. -\n(git reset --hard REVISION)" - (interactive (list (magit-reset-read-branch-or-commit - (concat (magit--propertize-face "Hard" 'bold) - " reset %s to")))) - (magit-reset-internal "--hard" commit)) - -;;;###autoload -(defun magit-reset-index (commit) - "Reset the index to COMMIT. -Keep the `HEAD' and working tree as-is, so if COMMIT refers to the -head this effectively unstages all changes. -\n(git reset COMMIT .)" - (interactive (list (magit-read-branch-or-commit "Reset index to"))) - (magit-reset-internal nil commit ".")) - -;;;###autoload -(defun magit-reset-worktree (commit) - "Reset the worktree to COMMIT. -Keep the `HEAD' and index as-is." - (interactive (list (magit-read-branch-or-commit "Reset worktree to"))) - (magit-wip-commit-before-change nil " before reset") - (magit-with-temp-index commit nil - (magit-call-git "checkout-index" "--all" "--force")) - (magit-wip-commit-after-apply nil " after reset") - (magit-refresh)) - -;;;###autoload -(defun magit-reset-quickly (commit &optional hard) - "Reset the `HEAD' and index to COMMIT, and possibly the working tree. -With a prefix argument reset the working tree otherwise don't. -\n(git reset --mixed|--hard COMMIT)" - (interactive (list (magit-reset-read-branch-or-commit - (if current-prefix-arg - (concat (magit--propertize-face "Hard" 'bold) - " reset %s to") - "Reset %s to")) - current-prefix-arg)) - (magit-reset-internal (if hard "--hard" "--mixed") commit)) - -(defun magit-reset-read-branch-or-commit (prompt) - "Prompt for and return a ref to reset HEAD to. - -PROMPT is a format string, where either the current branch name -or \"detached head\" will be substituted for %s." - (magit-read-branch-or-commit - (format prompt (or (magit-get-current-branch) "detached head")))) - -(defun magit-reset-internal (arg commit &optional path) - (when (and (not (member arg '("--hard" nil))) - (equal (magit-rev-parse commit) - (magit-rev-parse "HEAD~"))) - (with-temp-buffer - (magit-git-insert "show" "-s" "--format=%B" "HEAD") - (when git-commit-major-mode - (funcall git-commit-major-mode)) - (git-commit-setup-font-lock) - (git-commit-save-message))) - (let ((cmd (if (and (equal commit "HEAD") (not arg)) "unstage" "reset"))) - (magit-wip-commit-before-change nil (concat " before " cmd)) - (magit-run-git "reset" arg commit "--" path) - (when (equal cmd "unstage") - (magit-wip-commit-after-apply nil " after unstage")))) - -;;; _ -(provide 'magit-reset) -;;; magit-reset.el ends here diff --git a/elpa/magit-20200418.939/magit-reset.elc b/elpa/magit-20200418.939/magit-reset.elc deleted file mode 100644 index bcf61ab8884e7de7f04a5db2c1ec21110d617b59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5544 zcmb_g`)}LG5q2CT&8cYnW3TNGH>Tr83QQj#de{jLsN=Y?(aS|}jP?M_xKiZG;#nkh zBxT2kqJMk8nO#~>8xB$fvZ&?mymn^3Z};`#_XmGmTU)EWe*KybvSb{OR3ty*ln#?1 zEa*z*MVzJNwRe1Za~+pM3PvN!#$}wuzXl~<7dth1c{+>>8bAt73RO^alLko~Qj~>7 znaAlxv5mKRQBn{^DxzC0?%s~Kw|Knc_Ws9%<6{bkK^}x9 zOxzarK^jq!Q5dAuS2W6kIVHxGf>e-?VwF=l#6-{6dJ%#z`eOsW^siQ{)pPaBB+eDR zNP>&FY}D$J8U&*_D9nhRt3s8udFGJS^Bo5tccbSy9gEJ&JV=XJrKOE2lQD@1z2KZY zO5+iK&LOmaQz|>mA~h8PK^{K-X3uk3sz}Cn6Q9=NU>k#-o-Y$!eDlY9zA(%6G1|nS z7&o4jvj$=Fv2obF_)6JXI=Z2f29p%OvAsx`NdiA4xyU*Zm&>7|e;*z0zkRWd#gY0% z*za$%oUXI{vdopDGNXXTxw?w8NkIjcs~wA`QL*uE5PzB(F$1r{EJ-+fUg5tz4lWQE zL|=z)PQoa-$>2!+%$<=EW}``xQvFq=iZG8+7^oO+wbh_{eRgg!8L$cUSC{IBti+=E zMM?Y#g@M01d&(YaUmKWM89B49w#;up$=y1NMIA*pC|QNk!NI>vJWst}`fyP?YEm4~ z(r30x8bfiHCSG>Grg%}4P6GDhJ{M%x{gSU2CEsS$y^^b05N=ub?Z9ABeju^H==_#) z=d{D23NMjkjYi|VaZbC9+UDO}r%j7RFwG6l`-2bf-yffDQy@5Gn~%XE{uF1n0Jc+#4n- zm6OAN9)CRk@WTV+Bx^o9OuT9~N}cBJmq+O%SGwNvg;4D+CzL7GZAq-z+?nRrVirlQ ze`a`O&1Z*)SIvaSbDHhd;Q=rSj3F<9UER;fDV@N;h-|F#GX7QBgCGPD9ISDU`HIS6Tm;w!71iG{U;?P-}B_xxRF z_4X|7$34|u1#(*8o!R=X+V5<7t_roObdE6x=K-DWR`N6w!h(=dZSHqMdsS(s!FYuA;2RTM@FchMWTWSM4kx7NKF4YddLH4yMZfcdHGcZj0*))JX1eNTy&hF9R@%$V)i;2m39P9 z8lp4Su*BY3sq6rD!q#HEM>|E{)r9` zPscyJJ^b;fzaM{ph_yQYA=-=t&#E|z)*;&PPQDS~5c*9rKo#Z`aiqYd$5|0`3fS6| zrA-Y6I1$*vc#PI&k^Gw9O_N&Z$pJaWa*1?zMUI3^&i_76xH2*uD8=)`COhc_d41? zdE2;?&Eb?8Uc%nZvzF^?KKF>5$XA@z+?c#x%8%Y-uJoA#7dnAW#a|1ml1Kx3=QB3+p8JCk1Z`hoz3eU98 zyZ3r^kfz`!M}2g6hf&FCOA7cstGZUu(OfOWxTvRGsM4VOAbwV-Z|+k(2n)klubV{tnF*P;uR;)(_sl&WjHkBbZB ztwk>xHecQWi?GRYIB{B%MI3keiR-CFDAWQq{$3)*jRwA{GU)`{0Up3_vWj7bQ@UjX ztYEv&y6?8$;1}BpQ>T8)-4~{yX^gV)a_&`t%ccZaDK|WZK0}5SaRpirqZ!rge3EKR kwC!qWM!+gatJDI<90Oy`PP4_uP)EnQ0$9%7^)+h$1J{tG&Hw-a diff --git a/elpa/magit-20200418.939/magit-section.el b/elpa/magit-20200418.939/magit-section.el deleted file mode 100644 index 19efd96f..00000000 --- a/elpa/magit-20200418.939/magit-section.el +++ /dev/null @@ -1,1733 +0,0 @@ -;;; magit-section.el --- Sections for read-only buffers -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Package-Requires: ((emacs "25.1") (dash "20180910")) -;; Keywords: tools -;; Homepage: https://github.com/magit/magit - -;; Magit-Section is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit-Section is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This package implements the main user interface of Magit — the -;; collapsible sections that make up its buffers. This package used -;; to be distributed as part of Magit but now it can also be used by -;; other packages that have nothing to do with Magit or Git. - -;;; Code: - -(require 'cl-lib) -(require 'dash) -(require 'eieio) - -(eval-when-compile - (require 'benchmark) - (require 'subr-x)) - -;;; Hooks - -(defvar magit-section-movement-hook nil - "Hook run by `magit-section-goto'. -That function in turn is used by all section movement commands.") - -(defvar magit-section-highlight-hook - '(magit-section-highlight - magit-section-highlight-selection) - "Functions used to highlight the current section. -Each function is run with the current section as only argument -until one of them returns non-nil.") - -(defvar magit-section-unhighlight-hook nil - "Functions used to unhighlight the previously current section. -Each function is run with the current section as only argument -until one of them returns non-nil. Most sections are properly -unhighlighted without requiring a specialized unhighlighter, -diff-related sections being the only exception.") - -(defvar magit-section-set-visibility-hook - '(magit-section-cached-visibility) - "Hook used to set the initial visibility of a section. -Stop at the first function that returns non-nil. The returned -value should be `show', `hide' or nil. If no function returns -non-nil, determine the visibility as usual, i.e. use the -hardcoded section specific default (see `magit-insert-section').") - -(defvar magit-section-goto-successor-hook nil - "Hook used to go to the same section as was current before a refresh. -This is only used if the standard mechanism for doing so did not -succeed.") - -;;; Options - -(defgroup magit-section nil - "Expandable sections." - :link '(info-link "(magit)Sections") - :group 'extensions) - -(defcustom magit-section-show-child-count t - "Whether to append the number of children to section headings. -This only applies to sections for which doing so makes sense." - :package-version '(magit . "2.1.0") - :group 'magit-section - :type 'boolean) - -(defcustom magit-section-cache-visibility t - "Whether to cache visibility of sections. - -Sections always retain their visibility state when they are being -recreated during a refresh. But if a section disappears and then -later reappears again, then this option controls whether this is -the case. - -If t, then cache the visibility of all sections. If a list of -section types, then only do so for matching sections. If nil, -then don't do so for any sections." - :package-version '(magit . "2.12.0") - :group 'magit-section - :type '(choice (const :tag "Don't cache visibility" nil) - (const :tag "Cache visibility of all sections" t) - (repeat :tag "Cache visibility for section types" symbol))) - -(defcustom magit-section-initial-visibility-alist - '((stashes . hide)) - "Alist controlling the initial visibility of sections. - -Each element maps a section type or lineage to the initial -visibility state for such sections. The state has to be one of -`show' or `hide', or a function that returns one of these symbols. -A function is called with the section as the only argument. - -Use the command `magit-describe-section' to determine a section's -lineage or type. The vector in the output is the section lineage -and the type is the first element of that vector. Wildcards can -be used, see `magit-section-match'. - -Currently this option is only used to override hardcoded defaults, -but in the future it will also be used set the defaults. - -An entry whose key is `magit-status-initial-section' specifies -the visibility of the section `magit-status-goto-initial-section' -jumps to. This does not only override defaults, but also other -entries of this alist." - :package-version '(magit . "2.12.0") - :group 'magit-section - :type '(alist :key-type (sexp :tag "Section type/lineage") - :value-type (choice (const hide) - (const show) - function))) - -(defcustom magit-section-visibility-indicator - (if (window-system) - '(magit-fringe-bitmap> . magit-fringe-bitmapv) - '("…" . t)) - "Whether and how to indicate that a section can be expanded/collapsed. - -If nil, then don't show any indicators. -Otherwise the value has to have one of these two forms: - -\(EXPANDABLE-BITMAP . COLLAPSIBLE-BITMAP) - - Both values have to be variables whose values are fringe - bitmaps. In this case every section that can be expanded or - collapsed gets an indicator in the left fringe. - - To provide extra padding around the indicator, set - `left-fringe-width' in `magit-mode-hook'. - -\(STRING . BOOLEAN) - - In this case STRING (usually an ellipsis) is shown at the end - of the heading of every collapsed section. Expanded sections - get no indicator. The cdr controls whether the appearance of - these ellipsis take section highlighting into account. Doing - so might potentially have an impact on performance, while not - doing so is kinda ugly." - :package-version '(magit . "3.0.0") - :group 'magit-section - :type '(choice (const :tag "No indicators" nil) - (cons :tag "Use +- fringe indicators" - (const magit-fringe-bitmap+) - (const magit-fringe-bitmap-)) - (cons :tag "Use >v fringe indicators" - (const magit-fringe-bitmap>) - (const magit-fringe-bitmapv)) - (cons :tag "Use bold >v fringe indicators)" - (const magit-fringe-bitmap-bold>) - (const magit-fringe-bitmap-boldv)) - (cons :tag "Use custom fringe indicators" - (variable :tag "Expandable bitmap variable") - (variable :tag "Collapsible bitmap variable")) - (cons :tag "Use ellipses at end of headings" - (string :tag "Ellipsis" "…") - (choice :tag "Use face kludge" - (const :tag "Yes (potentially slow)" t) - (const :tag "No (kinda ugly)" nil))))) - -(defcustom magit-keep-region-overlay nil - "Whether to keep the region overlay when there is a valid selection. - -By default Magit removes the regular region overlay if, and only -if, that region constitutes a valid selection as understood by -Magit commands. Otherwise it does not remove that overlay, and -the region looks like it would in other buffers. - -There are two types of such valid selections: hunk-internal -regions and regions that select two or more sibling sections. -In such cases Magit removes the region overlay and instead -highlights a slightly larger range. All text (for hunk-internal -regions) or the headings of all sections (for sibling selections) -that are inside that range (not just inside the region) are acted -on by commands such as the staging command. This buffer range -begins at the beginning of the line on which the region begins -and ends at the end of the line on which the region ends. - -Because Magit acts on this larger range and not the region, it is -actually quite important to visualize that larger range. If we -don't do that, then one might think that these commands act on -the region instead. If you want to *also* visualize the region, -then set this option to t. But please note that when the region -does *not* constitute a valid selection, then the region is -*always* visualized as usual, and that it is usually under such -circumstances that you want to use a non-magit command to act on -the region. - -Besides keeping the region overlay, setting this option to t also -causes all face properties, except for `:foreground', to be -ignored for the faces used to highlight headings of selected -sections. This avoids the worst conflicts that result from -displaying the region and the selection overlays at the same -time. We are not interested in dealing with other conflicts. -In fact we *already* provide a way to avoid all of these -conflicts: *not* changing the value of this option. - -It should be clear by now that we consider it a mistake to set -this to display the region when the Magit selection is also -visualized, but since it has been requested a few times and -because it doesn't cost much to offer this option we do so. -However that might change. If the existence of this option -starts complicating other things, then it will be removed." - :package-version '(magit . "2.3.0") - :group 'magit-section - :type 'boolean) - -(defcustom magit-section-disable-line-numbers t - "In Magit buffers, whether to disable modes that display line numbers. - -Some users who turn on `global-display-line-numbers-mode' (or -`global-nlinum-mode' or `global-linum-mode') expect line numbers -to be displayed everywhere except in Magit buffers. Other users -do not expect Magit buffers to be treated differently. At least -in theory users in the first group should not use the global mode, -but that ship has sailed, thus this option." - :package-version '(magit . "3.0.0") - :group 'magit-section - :type 'boolean) - -;;; Faces - -(defgroup magit-section-faces nil - "Faces used by Magit-Section." - :group 'magit-section - :group 'faces) - -(defface magit-section-highlight - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey95") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey20")) - "Face for highlighting the current section." - :group 'magit-section-faces) - -(defface magit-section-heading - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :foreground "DarkGoldenrod4" - :weight bold) - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :foreground "LightGoldenrod2" - :weight bold)) - "Face for section headings." - :group 'magit-section-faces) - -(defface magit-section-secondary-heading - `((t ,@(and (>= emacs-major-version 27) '(:extend t)) - :weight bold)) - "Face for section headings of some secondary headings." - :group 'magit-section-faces) - -(defface magit-section-heading-selection - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :foreground "salmon4") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :foreground "LightSalmon3")) - "Face for selected section headings." - :group 'magit-section-faces) - -;;; Classes - -(defvar magit--current-section-hook nil - "Internal variable used for `magit-describe-section'.") - -(defvar magit--section-type-alist nil) - -(defclass magit-section () - ((keymap :initform nil :allocation :class) - (type :initform nil :initarg :type) - (value :initform nil :initarg :value) - (start :initform nil :initarg :start) - (content :initform nil) - (end :initform nil) - (hidden :initform nil) - (washer :initform nil) - (process :initform nil) - (heading-highlight-face :initform nil) - (inserter :initform (symbol-value 'magit--current-section-hook)) - (parent :initform nil :initarg :parent) - (children :initform nil))) - -;;; Mode - -(defvar symbol-overlay-inhibit-map) - -(defvar magit-section-mode-map - (let ((map (make-keymap))) - (suppress-keymap map t) - (define-key map (kbd "C-i") 'magit-section-toggle) - (define-key map [C-tab] 'magit-section-cycle) - (define-key map [M-tab] 'magit-section-cycle) - ;; [backtab] is the most portable binding for Shift+Tab. - (define-key map [backtab] 'magit-section-cycle-global) - (define-key map (kbd "^") 'magit-section-up) - (define-key map (kbd "p") 'magit-section-backward) - (define-key map (kbd "n") 'magit-section-forward) - (define-key map (kbd "M-p") 'magit-section-backward-sibling) - (define-key map (kbd "M-n") 'magit-section-forward-sibling) - (define-key map "1" 'magit-section-show-level-1) - (define-key map "2" 'magit-section-show-level-2) - (define-key map "3" 'magit-section-show-level-3) - (define-key map "4" 'magit-section-show-level-4) - (define-key map (kbd "M-1") 'magit-section-show-level-1-all) - (define-key map (kbd "M-2") 'magit-section-show-level-2-all) - (define-key map (kbd "M-3") 'magit-section-show-level-3-all) - (define-key map (kbd "M-4") 'magit-section-show-level-4-all) - map)) - -(define-derived-mode magit-section-mode special-mode "Magit-Sections" - "Parent major mode from which major modes with Magit-like sections inherit. - -Magit-Section is documented in info node `(magit-section)'." - :group 'magit-section - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t) - (setq-local line-move-visual t) ; see #1771 - ;; Turn off syntactic font locking, but not by setting - ;; `font-lock-defaults' because that would enable font locking, and - ;; not all magit plugins may be ready for that (see #3950). - (setq-local font-lock-syntactic-face-function #'ignore) - (setq show-trailing-whitespace nil) - (setq-local symbol-overlay-inhibit-map t) - (setq list-buffers-directory (abbreviate-file-name default-directory)) - ;; (hack-dir-local-variables-non-file-buffer) - (make-local-variable 'text-property-default-nonsticky) - (push (cons 'keymap t) text-property-default-nonsticky) - (add-hook 'post-command-hook #'magit-section-update-highlight t t) - (add-hook 'deactivate-mark-hook #'magit-section-update-highlight t t) - (setq-local redisplay-highlight-region-function - 'magit-section--highlight-region) - (setq-local redisplay-unhighlight-region-function - 'magit-section--unhighlight-region) - (when magit-section-disable-line-numbers - (when (bound-and-true-p global-linum-mode) - (linum-mode -1)) - (when (and (fboundp 'nlinum-mode) - (bound-and-true-p global-nlinum-mode)) - (nlinum-mode -1)) - (when (and (fboundp 'display-line-numbers-mode) - (bound-and-true-p global-display-line-numbers-mode)) - (display-line-numbers-mode -1))) - (when (fboundp 'magit-preserve-section-visibility-cache) - (add-hook 'kill-buffer-hook #'magit-preserve-section-visibility-cache))) - -;;; Core - -(defvar-local magit-root-section nil - "The root section in the current buffer. -All other sections are descendants of this section. The value -of this variable is set by `magit-insert-section' and you should -never modify it.") -(put 'magit-root-section 'permanent-local t) - -(defun magit-current-section () - "Return the section at point." - (or (get-text-property (point) 'magit-section) magit-root-section)) - -(defun magit-section-ident (section) - "Return an unique identifier for SECTION. -The return value has the form ((TYPE . VALUE)...)." - (with-slots (type value parent) section - (cons (cons type - (cond ((eieio-object-p value) - (magit-section-ident-value value)) - ((not (memq type '(unpulled unpushed))) value) - ((string-match-p "@{upstream}" value) value) - ;; Unfortunately Git chokes on "@{push}" when - ;; the value of `push.default' does not allow a - ;; 1:1 mapping. Arbitrary commands may consult - ;; the section value so we cannot use "@{push}". - ;; But `unpushed' and `unpulled' sections should - ;; keep their identity when switching branches - ;; so we have to use another value here. - ((string-match-p "\\`\\.\\." value) "..@{push}") - (t "@{push}.."))) - (and parent - (magit-section-ident parent))))) - -(cl-defgeneric magit-section-ident-value (value) - "Return a constant representation of VALUE. -VALUE is the value of a `magit-section' object. If that is an -object itself, then that is not suitable to be used to identify -the section because two objects may represent the same thing but -not be equal. If possible a method should be added for such -objects, which returns a value that is equal. Otherwise the -catch-all method is used, which just returns the argument -itself.") - -(cl-defmethod magit-section-ident-value (arg) arg) - -(defun magit-get-section (ident &optional root) - "Return the section identified by IDENT. -IDENT has to be a list as returned by `magit-section-ident'. -If optional ROOT is non-nil, then search in that section tree -instead of in the one whose root `magit-root-section' is." - (setq ident (reverse ident)) - (let ((section (or root magit-root-section))) - (when (eq (car (pop ident)) - (oref section type)) - (while (and ident - (pcase-let* ((`(,type . ,value) (car ident)) - (value (magit-section-ident-value value))) - (setq section - (cl-find-if (lambda (section) - (and (eq (oref section type) type) - (equal (magit-section-ident-value - (oref section value)) - value))) - (oref section children))))) - (pop ident)) - section))) - -(defun magit-section-lineage (section) - "Return the lineage of SECTION. -The return value has the form (TYPE...)." - (cons (oref section type) - (when-let ((parent (oref section parent))) - (magit-section-lineage parent)))) - -(defvar magit-insert-section--current nil "For internal use only.") -(defvar magit-insert-section--parent nil "For internal use only.") -(defvar magit-insert-section--oldroot nil "For internal use only.") - -;;; Commands -;;;; Movement - -(defun magit-section-forward () - "Move to the beginning of the next visible section." - (interactive) - (if (eobp) - (user-error "No next section") - (let ((section (magit-current-section))) - (if (oref section parent) - (let ((next (and (not (oref section hidden)) - (not (= (oref section end) - (1+ (point)))) - (car (oref section children))))) - (while (and section (not next)) - (unless (setq next (car (magit-section-siblings section 'next))) - (setq section (oref section parent)))) - (if next - (magit-section-goto next) - (user-error "No next section"))) - (magit-section-goto 1))))) - -(defun magit-section-backward () - "Move to the beginning of the current or the previous visible section. -When point is at the beginning of a section then move to the -beginning of the previous visible section. Otherwise move to -the beginning of the current section." - (interactive) - (if (bobp) - (user-error "No previous section") - (let ((section (magit-current-section)) children) - (cond - ((and (= (point) - (1- (oref section end))) - (setq children (oref section children))) - (magit-section-goto (car (last children)))) - ((and (oref section parent) - (not (= (point) - (oref section start)))) - (magit-section-goto section)) - (t - (let ((prev (car (magit-section-siblings section 'prev)))) - (if prev - (while (and (not (oref prev hidden)) - (setq children (oref prev children))) - (setq prev (car (last children)))) - (setq prev (oref section parent))) - (cond (prev - (magit-section-goto prev)) - ((oref section parent) - (user-error "No previous section")) - ;; Eob special cases. - ((not (get-text-property (1- (point)) 'invisible)) - (magit-section-goto -1)) - (t - (goto-char (previous-single-property-change - (1- (point)) 'invisible)) - (forward-line -1) - (magit-section-goto (magit-current-section)))))))))) - -(defun magit-section-up () - "Move to the beginning of the parent section." - (interactive) - (--if-let (oref (magit-current-section) parent) - (magit-section-goto it) - (user-error "No parent section"))) - -(defun magit-section-forward-sibling () - "Move to the beginning of the next sibling section. -If there is no next sibling section, then move to the parent." - (interactive) - (let ((current (magit-current-section))) - (if (oref current parent) - (--if-let (car (magit-section-siblings current 'next)) - (magit-section-goto it) - (magit-section-forward)) - (magit-section-goto 1)))) - -(defun magit-section-backward-sibling () - "Move to the beginning of the previous sibling section. -If there is no previous sibling section, then move to the parent." - (interactive) - (let ((current (magit-current-section))) - (if (oref current parent) - (--if-let (car (magit-section-siblings current 'prev)) - (magit-section-goto it) - (magit-section-backward)) - (magit-section-goto -1)))) - -(defun magit-section-goto (arg) - (if (integerp arg) - (progn (forward-line arg) - (setq arg (magit-current-section))) - (goto-char (oref arg start))) - (run-hook-with-args 'magit-section-movement-hook arg)) - -(defun magit-section-set-window-start (section) - "Ensure the beginning of SECTION is visible." - (unless (pos-visible-in-window-p (oref section end)) - (set-window-start (selected-window) (oref section start)))) - -(defmacro magit-define-section-jumper (name heading type &optional value) - "Define an interactive function to go some section. -Together TYPE and VALUE identify the section. -HEADING is the displayed heading of the section." - (declare (indent defun)) - `(defun ,name (&optional expand) ,(format "\ -Jump to the section \"%s\". -With a prefix argument also expand it." heading) - (interactive "P") - (--if-let (magit-get-section - (cons (cons ',type ,value) - (magit-section-ident magit-root-section))) - (progn (goto-char (oref it start)) - (when expand - (with-local-quit (magit-section-show it)) - (recenter 0))) - (message ,(format "Section \"%s\" wasn't found" heading))))) - -;;;; Visibility - -(defun magit-section-show (section) - "Show the body of the current section." - (interactive (list (magit-current-section))) - (oset section hidden nil) - (magit-section--maybe-wash section) - (when-let ((beg (oref section content))) - (remove-overlays beg (oref section end) 'invisible t)) - (magit-section-maybe-update-visibility-indicator section) - (magit-section-maybe-cache-visibility section) - (dolist (child (oref section children)) - (if (oref child hidden) - (magit-section-hide child) - (magit-section-show child)))) - -(defun magit-section--maybe-wash (section) - (when-let ((washer (oref section washer))) - (oset section washer nil) - (let ((inhibit-read-only t) - (magit-insert-section--parent section) - (content (oref section content))) - (save-excursion - (if (and content (< content (oref section end))) - (funcall washer section) ; already partially washed (hunk) - (goto-char (oref section end)) - (oset section content (point-marker)) - (funcall washer) - (oset section end (point-marker))))) - (magit-section-update-highlight))) - -(defun magit-section-hide (section) - "Hide the body of the current section." - (interactive (list (magit-current-section))) - (if (eq section magit-root-section) - (user-error "Cannot hide root section") - (oset section hidden t) - (when-let ((beg (oref section content))) - (let ((end (oref section end))) - (remove-overlays beg end 'invisible t) - (let ((o (make-overlay beg end))) - (overlay-put o 'evaporate t) - (overlay-put o 'invisible t)))) - (magit-section-maybe-update-visibility-indicator section) - (magit-section-maybe-cache-visibility section))) - -(defun magit-section-toggle (section) - "Toggle visibility of the body of the current section." - (interactive (list (magit-current-section))) - (if (eq section magit-root-section) - (user-error "Cannot hide root section") - (goto-char (oref section start)) - (if (oref section hidden) - (magit-section-show section) - (magit-section-hide section)))) - -(defun magit-section-toggle-children (section) - "Toggle visibility of bodies of children of the current section." - (interactive (list (magit-current-section))) - (goto-char (oref section start)) - (let* ((children (oref section children)) - (show (--any-p (oref it hidden) children))) - (dolist (c children) - (oset c hidden show))) - (magit-section-show section)) - -(defun magit-section-show-children (section &optional depth) - "Recursively show the bodies of children of the current section. -With a prefix argument show children that deep and hide deeper -children." - (interactive (list (magit-current-section))) - (magit-section-show-children-1 section depth) - (magit-section-show section)) - -(defun magit-section-show-children-1 (section &optional depth) - (dolist (child (oref section children)) - (oset child hidden nil) - (if depth - (if (> depth 0) - (magit-section-show-children-1 child (1- depth)) - (magit-section-hide child)) - (magit-section-show-children-1 child)))) - -(defun magit-section-hide-children (section) - "Recursively hide the bodies of children of the current section." - (interactive (list (magit-current-section))) - (mapc 'magit-section-hide (oref section children))) - -(defun magit-section-show-headings (section) - "Recursively show headings of children of the current section. -Only show the headings, previously shown text-only bodies are -hidden." - (interactive (list (magit-current-section))) - (magit-section-show-headings-1 section) - (magit-section-show section)) - -(defun magit-section-show-headings-1 (section) - (dolist (child (oref section children)) - (oset child hidden nil) - (when (or (oref child children) - (not (oref child content))) - (magit-section-show-headings-1 child)))) - -(defun magit-section-cycle (section) - "Cycle visibility of current section and its children." - (interactive (list (magit-current-section))) - (goto-char (oref section start)) - (if (oref section hidden) - (progn (magit-section-show section) - (magit-section-hide-children section)) - (let ((children (oref section children))) - (cond ((and (--any-p (oref it hidden) children) - (--any-p (oref it children) children)) - (magit-section-show-headings section)) - ((-any-p 'magit-section-hidden-body children) - (magit-section-show-children section)) - (t - (magit-section-hide section)))))) - -(defun magit-section-cycle-global () - "Cycle visibility of all sections in the current buffer." - (interactive) - (let ((children (oref magit-root-section children))) - (cond ((and (--any-p (oref it hidden) children) - (--any-p (oref it children) children)) - (magit-section-show-headings magit-root-section)) - ((-any-p 'magit-section-hidden-body children) - (magit-section-show-children magit-root-section)) - (t - (mapc 'magit-section-hide children))))) - -(defun magit-section-hidden-body (section &optional pred) - (--if-let (oref section children) - (funcall (or pred '-any-p) 'magit-section-hidden-body it) - (and (oref section content) - (oref section hidden)))) - -(defun magit-section-invisible-p (section) - "Return t if the SECTION's body is invisible. -When the body of an ancestor of SECTION is collapsed then -SECTION's body (and heading) obviously cannot be visible." - (or (oref section hidden) - (--when-let (oref section parent) - (magit-section-invisible-p it)))) - -(defun magit-section-show-level (level) - "Show surrounding sections up to LEVEL. -If LEVEL is negative, show up to the absolute value. -Sections at higher levels are hidden." - (if (< level 0) - (let ((s (magit-current-section))) - (setq level (- level)) - (while (> (1- (length (magit-section-ident s))) level) - (setq s (oref s parent)) - (goto-char (oref s start))) - (magit-section-show-children magit-root-section (1- level))) - (cl-do* ((s (magit-current-section) - (oref s parent)) - (i (1- (length (magit-section-ident s))) - (cl-decf i))) - ((cond ((< i level) (magit-section-show-children s (- level i 1)) t) - ((= i level) (magit-section-hide s) t)) - (magit-section-goto s))))) - -(defun magit-section-show-level-1 () - "Show surrounding sections on first level." - (interactive) - (magit-section-show-level 1)) - -(defun magit-section-show-level-1-all () - "Show all sections on first level." - (interactive) - (magit-section-show-level -1)) - -(defun magit-section-show-level-2 () - "Show surrounding sections up to second level." - (interactive) - (magit-section-show-level 2)) - -(defun magit-section-show-level-2-all () - "Show all sections up to second level." - (interactive) - (magit-section-show-level -2)) - -(defun magit-section-show-level-3 () - "Show surrounding sections up to third level." - (interactive) - (magit-section-show-level 3)) - -(defun magit-section-show-level-3-all () - "Show all sections up to third level." - (interactive) - (magit-section-show-level -3)) - -(defun magit-section-show-level-4 () - "Show surrounding sections up to fourth level." - (interactive) - (magit-section-show-level 4)) - -(defun magit-section-show-level-4-all () - "Show all sections up to fourth level." - (interactive) - (magit-section-show-level -4)) - -;;;; Auxiliary - -(defun magit-describe-section-briefly (section &optional ident) - "Show information about the section at point. -With a prefix argument show the section identity instead of the -section lineage. This command is intended for debugging purposes." - (interactive (list (magit-current-section) current-prefix-arg)) - (let ((str (format "#<%s %S %S %s-%s>" - (eieio-object-class section) - (let ((val (oref section value))) - (cond ((stringp val) - (substring-no-properties val)) - ((and (eieio-object-p val) - (fboundp 'cl-prin1-to-string)) - (cl-prin1-to-string val)) - (t - val))) - (if ident - (magit-section-ident section) - (apply #'vector (magit-section-lineage section))) - (when-let ((m (oref section start))) - (marker-position m)) - (when-let ((m (oref section end))) - (marker-position m))))) - (if (called-interactively-p 'any) - (message "%s" str) - str))) - -(cl-defmethod cl-print-object ((section magit-section) stream) - "Print `magit-describe-section' result of SECTION." - ;; Used by debug and edebug as of Emacs 26. - (princ (magit-describe-section-briefly section) stream)) - -(defun magit-describe-section (section &optional interactive-p) - "Show information about the section at point." - (interactive (list (magit-current-section) t)) - (let ((inserter-section section)) - (while (and inserter-section (not (oref inserter-section inserter))) - (setq inserter-section (oref inserter-section parent))) - (when (and inserter-section (oref inserter-section inserter)) - (setq section inserter-section))) - (pcase (oref section inserter) - (`((,hook ,fun) . ,src-src) - (help-setup-xref `(magit-describe-section ,section) interactive-p) - (with-help-window (help-buffer) - (with-current-buffer standard-output - (insert (format-message - "%s\n is inserted by `%s'\n from `%s'" - (magit-describe-section-briefly section) - (make-text-button (symbol-name fun) nil - :type 'help-function - 'help-args (list fun)) - (make-text-button (symbol-name hook) nil - :type 'help-variable - 'help-args (list hook)))) - (pcase-dolist (`(,hook ,fun) src-src) - (insert (format-message - ",\n called by `%s'\n from `%s'" - (make-text-button (symbol-name fun) nil - :type 'help-function - 'help-args (list fun)) - (make-text-button (symbol-name hook) nil - :type 'help-variable - 'help-args (list hook))))) - (insert ".\n\n") - (insert - (format-message - "`%s' is " - (make-text-button (symbol-name fun) nil - :type 'help-function 'help-args (list fun)))) - (describe-function-1 fun)))) - (_ (message "%s, inserter unknown" - (magit-describe-section-briefly section))))) - -;;; Match - -(cl-defun magit-section-match - (condition &optional (section (magit-current-section))) - "Return t if SECTION matches CONDITION. - -SECTION defaults to the section at point. If SECTION is not -specified and there also is no section at point, then return -nil. - -CONDITION can take the following forms: - (CONDITION...) matches if any of the CONDITIONs matches. - [CLASS...] matches if the section's class is the same - as the first CLASS or a subclass of that; - the section's parent class matches the - second CLASS; and so on. - [* CLASS...] matches sections that match [CLASS...] and - also recursively all their child sections. - CLASS matches if the section's class is the same - as CLASS or a subclass of that; regardless - of the classes of the parent sections. - -Each CLASS should be a class symbol, identifying a class that -derives from `magit-section'. For backward compatibility CLASS -can also be a \"type symbol\". A section matches such a symbol -if the value of its `type' slot is `eq'. If a type symbol has -an entry in `magit--section-type-alist', then a section also -matches that type if its class is a subclass of the class that -corresponds to the type as per that alist. - -Note that it is not necessary to specify the complete section -lineage as printed by `magit-describe-section-briefly', unless -of course you want to be that precise." - (and section (magit-section-match-1 condition section))) - -(defun magit-section-match-1 (condition section) - (cl-assert condition) - (and section - (if (listp condition) - (--first (magit-section-match-1 it section) condition) - (magit-section-match-2 (if (symbolp condition) - (list condition) - (cl-coerce condition 'list)) - section)))) - -(defun magit-section-match-2 (condition section) - (if (eq (car condition) '*) - (or (magit-section-match-2 (cdr condition) section) - (when-let ((parent (oref section parent))) - (magit-section-match-2 condition parent))) - (and (let ((c (car condition))) - (if (class-p c) - (cl-typep section c) - (if-let ((class (cdr (assq c magit--section-type-alist)))) - (cl-typep section class) - (eq (oref section type) c)))) - (or (not (setq condition (cdr condition))) - (when-let ((parent (oref section parent))) - (magit-section-match-2 condition parent)))))) - -(defun magit-section-value-if (condition &optional section) - "If the section at point matches CONDITION, then return its value. - -If optional SECTION is non-nil then test whether that matches -instead. If there is no section at point and SECTION is nil, -then return nil. If the section does not match, then return -nil. - -See `magit-section-match' for the forms CONDITION can take." - (when-let ((section (or section (magit-current-section)))) - (and (magit-section-match condition section) - (oref section value)))) - -(defmacro magit-section-when (condition &rest body) - "If the section at point matches CONDITION, evaluate BODY. - -If the section matches, then evaluate BODY forms sequentially -with `it' bound to the section and return the value of the last -form. If there are no BODY forms, then return the value of the -section. If the section does not match or if there is no section -at point, then return nil. - -See `magit-section-match' for the forms CONDITION can take." - (declare (obsolete - "instead use `magit-section-match' or `magit-section-value-if'." - "Magit 2.90.0") - (indent 1) - (debug (sexp body))) - `(--when-let (magit-current-section) - ;; Quoting CONDITION here often leads to double-quotes, which - ;; isn't an issue because `magit-section-match-1' implicitly - ;; deals with that. We shouldn't force users of this function - ;; to not quote CONDITION because that would needlessly break - ;; backward compatibility. - (when (magit-section-match ',condition it) - ,@(or body '((oref it value)))))) - -(defmacro magit-section-case (&rest clauses) - "Choose among clauses on the type of the section at point. - -Each clause looks like (CONDITION BODY...). The type of the -section is compared against each CONDITION; the BODY forms of the -first match are evaluated sequentially and the value of the last -form is returned. Inside BODY the symbol `it' is bound to the -section at point. If no clause succeeds or if there is no -section at point, return nil. - -See `magit-section-match' for the forms CONDITION can take. -Additionally a CONDITION of t is allowed in the final clause, and -matches if no other CONDITION match, even if there is no section -at point." - (declare (indent 0) - (debug (&rest (sexp body)))) - `(let* ((it (magit-current-section))) - (cond ,@(mapcar (lambda (clause) - `(,(or (eq (car clause) t) - `(and it - (magit-section-match-1 ',(car clause) it))) - ,@(cdr clause))) - clauses)))) - -(defun magit-section-match-assoc (section alist) - "Return the value associated with SECTION's type or lineage in ALIST." - (-some (pcase-lambda (`(,key . ,val)) - (and (magit-section-match-1 key section) val)) - alist)) - -;;; Create - -(defvar magit-insert-section-hook nil - "Hook run after `magit-insert-section's BODY. -Avoid using this hook and only ever do so if you know -what you are doing and are sure there is no other way.") - -(defmacro magit-insert-section (&rest args) - "Insert a section at point. - -TYPE is the section type, a symbol which is prefixed with the -name of the package. (For historic reasons the types used by -Magit and Forge do not use a package prefix.) Many commands -that act on the current section behave differently depending -on its type. - -Optional VALUE is the value of the section, usually a string -that is required when acting on the section. - -When optional HIDE is non-nil collapse the section body by -default, i.e. when first creating the section, but not when -refreshing the buffer. Else expand it by default. This can be -overwritten using `magit-section-set-visibility-hook'. When a -section is recreated during a refresh, then the visibility of -predecessor is inherited and HIDE is ignored (but the hook is -still honored). - -BODY is any number of forms that actually insert the section's -heading and body. Optional NAME, if specified, has to be a -symbol, which is then bound to the object of the section being -inserted. - -Before BODY is evaluated the `start' of the section object is set -to the value of `point' and after BODY was evaluated its `end' is -set to the new value of `point'; BODY is responsible for moving -`point' forward. - -If it turns out inside BODY that the section is empty, then -`magit-cancel-section' can be used to abort and remove all traces -of the partially inserted section. This can happen when creating -a section by washing Git's output and Git didn't actually output -anything this time around. - -For historic reasons, if a variable `magit-TYPE-section-map' -or `forge-TYPE-section-map' exists, then use that as the -text-property `keymap' of all text belonging to the section (but -this may be overwritten in subsections). TYPE can also have the -form `(eval FORM)' in which case FORM is evaluated at runtime. - -\(fn [NAME] (TYPE &optional VALUE HIDE) &rest BODY)" - (declare (indent defun) - (debug ([&optional symbolp] - (&or [("eval" symbolp) &optional form form] - [symbolp &optional form form]) - body))) - (let ((tp (cl-gensym "type")) - (s* (and (symbolp (car args)) - (pop args))) - (s (cl-gensym "section"))) - `(let* ((,tp ,(let ((type (nth 0 (car args)))) - (if (eq (car-safe type) 'eval) - (cadr type) - `',type))) - (,s (funcall (if (class-p ,tp) - ,tp - (or (cdr (assq ,tp magit--section-type-alist)) - 'magit-section)) - :type - (if (class-p ,tp) - (or (car (rassq ,tp magit--section-type-alist)) - (error "BUG: No entry for %s in %s" ,tp - 'magit--section-type-alist)) - ,tp) - :value ,(nth 1 (car args)) - :start (point-marker) - :parent magit-insert-section--parent))) - (oset ,s hidden - (if-let ((value (run-hook-with-args-until-success - 'magit-section-set-visibility-hook ,s))) - (eq value 'hide) - (if-let ((incarnation (and magit-insert-section--oldroot - (magit-get-section - (magit-section-ident ,s) - magit-insert-section--oldroot)))) - (oref incarnation hidden) - (if-let ((value (magit-section-match-assoc - ,s magit-section-initial-visibility-alist))) - (progn - (when (functionp value) - (setq value (funcall value ,s))) - (eq value 'hide)) - ,(nth 2 (car args)))))) - (let ((magit-insert-section--current ,s) - (magit-insert-section--parent ,s) - (magit-insert-section--oldroot - (or magit-insert-section--oldroot - (unless magit-insert-section--parent - (prog1 magit-root-section - (setq magit-root-section ,s)))))) - (catch 'cancel-section - ,@(if s* - `((let ((,s* ,s)) - ,@(cdr args))) - (cdr args)) - ;; `magit-insert-section-hook' should *not* be run with - ;; `magit-run-section-hook' because it's a hook that runs - ;; on section insertion, not a section inserting hook. - (run-hooks 'magit-insert-section-hook) - (magit-insert-child-count ,s) - (set-marker-insertion-type (oref ,s start) t) - (let* ((end (oset ,s end (point-marker))) - (class-map (oref-default ,s keymap)) - (magit-map (intern (format "magit-%s-section-map" - (oref ,s type)))) - (forge-map (intern (format "forge-%s-section-map" - (oref ,s type)))) - (map (or (and class-map (symbol-value class-map)) - (and (boundp magit-map) (symbol-value magit-map)) - (and (boundp forge-map) (symbol-value forge-map))))) - (save-excursion - (goto-char (oref ,s start)) - (while (< (point) end) - (let ((next (or (next-single-property-change - (point) 'magit-section) - end))) - (unless (get-text-property (point) 'magit-section) - (put-text-property (point) next 'magit-section ,s) - (when map - (put-text-property (point) next 'keymap map))) - (goto-char next))))) - (if (eq ,s magit-root-section) - (let ((magit-section-cache-visibility nil)) - (magit-section-show ,s)) - (oset (oref ,s parent) children - (nconc (oref (oref ,s parent) children) - (list ,s))))) - ,s)))) - -(defun magit-cancel-section () - "Cancel inserting the section that is currently being inserted. -Remove all traces of that section." - (when magit-insert-section--current - (if (not (oref magit-insert-section--current parent)) - (insert "(empty)\n") - (delete-region (oref magit-insert-section--current start) - (point)) - (setq magit-insert-section--current nil) - (throw 'cancel-section nil)))) - -(defun magit-insert-heading (&rest args) - "Insert the heading for the section currently being inserted. - -This function should only be used inside `magit-insert-section'. - -When called without any arguments, then just set the `content' -slot of the object representing the section being inserted to -a marker at `point'. The section should only contain a single -line when this function is used like this. - -When called with arguments ARGS, which have to be strings, or -nil, then insert those strings at point. The section should not -contain any text before this happens and afterwards it should -again only contain a single line. If the `face' property is set -anywhere inside any of these strings, then insert all of them -unchanged. Otherwise use the `magit-section-heading' face for -all inserted text. - -The `content' property of the section object is the end of the -heading (which lasts from `start' to `content') and the beginning -of the the body (which lasts from `content' to `end'). If the -value of `content' is nil, then the section has no heading and -its body cannot be collapsed. If a section does have a heading, -then its height must be exactly one line, including a trailing -newline character. This isn't enforced, you are responsible for -getting it right. The only exception is that this function does -insert a newline character if necessary." - (declare (indent defun)) - (when args - (let ((heading (apply #'concat args))) - (insert (if (or (text-property-not-all 0 (length heading) - 'font-lock-face nil heading) - (text-property-not-all 0 (length heading) - 'face nil heading)) - heading - (propertize heading 'font-lock-face 'magit-section-heading))))) - (unless (bolp) - (insert ?\n)) - (when (fboundp 'magit-maybe-make-margin-overlay) - (magit-maybe-make-margin-overlay)) - (oset magit-insert-section--current content (point-marker))) - -(defmacro magit-insert-section-body (&rest body) - "Use BODY to insert the section body, once the section is expanded. -If the section is expanded when it is created, then this is -like `progn'. Otherwise BODY isn't evaluated until the section -is explicitly expanded." - (declare (indent 0)) - (let ((f (cl-gensym)) - (s (cl-gensym))) - `(let ((,f (lambda () ,@body)) - (,s magit-insert-section--current)) - (if (oref ,s hidden) - (oset ,s washer - (lambda () - (funcall ,f) - (magit-section-maybe-remove-visibility-indicator ,s))) - (funcall ,f))))) - -(defun magit-insert-headers (hook) - (let* ((header-sections nil) - (magit-insert-section-hook - (cons (lambda () - (push magit-insert-section--current - header-sections)) - (if (listp magit-insert-section-hook) - magit-insert-section-hook - (list magit-insert-section-hook))))) - (magit-run-section-hook hook) - (when header-sections - (insert "\n") - ;; Make the first header into the parent of the rest. - (when (cdr header-sections) - (cl-callf nreverse header-sections) - (let* ((1st-header (pop header-sections)) - (header-parent (oref 1st-header parent))) - (oset header-parent children (list 1st-header)) - (oset 1st-header children header-sections) - (oset 1st-header content (oref (car header-sections) start)) - (oset 1st-header end (oref (car (last header-sections)) end)) - (dolist (sub-header header-sections) - (oset sub-header parent 1st-header))))))) - -(defun magit-insert-child-count (section) - "Modify SECTION's heading to contain number of child sections. - -If `magit-section-show-child-count' is non-nil and the SECTION -has children and its heading ends with \":\", then replace that -with \" (N)\", where N is the number of child sections. - -This function is called by `magit-insert-section' after that has -evaluated its BODY. Admittedly that's a bit of a hack." - ;; This has to be fast, not pretty! - (let (content count) - (when (and magit-section-show-child-count - (setq count (length (oref section children))) - (> count 0) - (setq content (oref section content)) - (eq (char-before (1- content)) ?:)) - (save-excursion - (goto-char (- content 2)) - (insert (format " (%s)" count)) - (delete-char 1))))) - -;;; Highlight - -(defvar-local magit-section-highlight-overlays nil) -(defvar-local magit-section-highlighted-section nil) -(defvar-local magit-section-highlighted-sections nil) -(defvar-local magit-section-unhighlight-sections nil) -(defun magit-section-update-highlight () - (let ((section (magit-current-section))) - (unless (eq section magit-section-highlighted-section) - (let ((inhibit-read-only t) - (deactivate-mark nil) - (selection (magit-region-sections))) - (mapc #'delete-overlay magit-section-highlight-overlays) - (setq magit-section-highlight-overlays nil) - (setq magit-section-unhighlight-sections - magit-section-highlighted-sections) - (setq magit-section-highlighted-sections nil) - (unless (eq section magit-root-section) - (run-hook-with-args-until-success - 'magit-section-highlight-hook section selection)) - (dolist (s magit-section-unhighlight-sections) - (run-hook-with-args-until-success - 'magit-section-unhighlight-hook s selection)) - (restore-buffer-modified-p nil) - (unless (eq magit-section-highlighted-section section) - (setq magit-section-highlighted-section - (and (not (oref section hidden)) - section))))) - (magit-section-maybe-paint-visibility-ellipses))) - -(defun magit-section-highlight (section selection) - "Highlight SECTION and if non-nil all sections in SELECTION. -This function works for any section but produces undesirable -effects for diff related sections, which by default are -highlighted using `magit-diff-highlight'. Return t." - (when-let ((face (oref section heading-highlight-face))) - (dolist (section (or selection (list section))) - (magit-section-make-overlay - (oref section start) - (or (oref section content) - (oref section end)) - face))) - (cond (selection - (magit-section-make-overlay (oref (car selection) start) - (oref (car (last selection)) end) - 'magit-section-highlight) - (magit-section-highlight-selection nil selection)) - (t - (magit-section-make-overlay (oref section start) - (oref section end) - 'magit-section-highlight))) - t) - -(defun magit-section-highlight-selection (_ selection) - "Highlight the section-selection region. -If SELECTION is non-nil, then it is a list of sections selected by -the region. The headings of these sections are then highlighted. - -This is a fallback for people who don't want to highlight the -current section and therefore removed `magit-section-highlight' -from `magit-section-highlight-hook'. - -This function is necessary to ensure that a representation of -such a region is visible. If neither of these functions were -part of the hook variable, then such a region would be -invisible." - (when (and selection - (not (and (eq this-command 'mouse-drag-region)))) - (dolist (section selection) - (magit-section-make-overlay (oref section start) - (or (oref section content) - (oref section end)) - 'magit-section-heading-selection)) - t)) - -(defun magit-section-make-overlay (start end face) - ;; Yes, this doesn't belong here. But the alternative of - ;; spreading this hack across the code base is even worse. - (when (and magit-keep-region-overlay - (memq face '(magit-section-heading-selection - magit-diff-file-heading-selection - magit-diff-hunk-heading-selection))) - (setq face (list :foreground (face-foreground face)))) - (let ((ov (make-overlay start end nil t))) - (overlay-put ov 'font-lock-face face) - (overlay-put ov 'evaporate t) - (push ov magit-section-highlight-overlays) - ov)) - -(defun magit-section-goto-successor (section line char arg) - (let ((ident (magit-section-ident section))) - (--if-let (magit-get-section ident) - (let ((start (oref it start))) - (goto-char start) - (unless (eq it magit-root-section) - (ignore-errors - (forward-line line) - (forward-char char)) - (unless (eq (magit-current-section) it) - (goto-char start)))) - (or (run-hook-with-args-until-success - 'magit-section-goto-successor-hook section arg) - (goto-char (--if-let (magit-section-goto-successor-1 section) - (if (eq (oref it type) 'button) - (point-min) - (oref it start)) - (point-min))))))) - -(defun magit-section-goto-successor-1 (section) - (or (--when-let (pcase (oref section type) - (`staged 'unstaged) - (`unstaged 'staged) - (`unpushed 'unpulled) - (`unpulled 'unpushed)) - (magit-get-section `((,it) (status)))) - (--when-let (car (magit-section-siblings section 'next)) - (magit-get-section (magit-section-ident it))) - (--when-let (car (magit-section-siblings section 'prev)) - (magit-get-section (magit-section-ident it))) - (--when-let (oref section parent) - (or (magit-get-section (magit-section-ident it)) - (magit-section-goto-successor-1 it))))) - -;;; Region - -(defvar-local magit-section--region-overlays nil) - -(defun magit-section--delete-region-overlays () - (mapc #'delete-overlay magit-section--region-overlays) - (setq magit-section--region-overlays nil)) - -(defun magit-section--highlight-region (start end window rol) - (magit-section--delete-region-overlays) - (if (and (not magit-keep-region-overlay) - (or (magit-region-sections) - (run-hook-with-args-until-success 'magit-region-highlight-hook - (magit-current-section))) - (not (= (line-number-at-pos start) - (line-number-at-pos end))) - ;; (not (eq (car-safe last-command-event) 'mouse-movement)) - ) - (funcall (default-value 'redisplay-unhighlight-region-function) rol) - (funcall (default-value 'redisplay-highlight-region-function) - start end window rol))) - -(defun magit-section--unhighlight-region (rol) - (setq magit-section-highlighted-section nil) - (magit-section--delete-region-overlays) - (funcall (default-value 'redisplay-unhighlight-region-function) rol)) - -;;; Visibility - -(defvar-local magit-section-visibility-cache nil) -(put 'magit-section-visibility-cache 'permanent-local t) - -(defun magit-section-cached-visibility (section) - "Set SECTION's visibility to the cached value." - (cdr (assoc (magit-section-ident section) - magit-section-visibility-cache))) - -(cl-defun magit-section-cache-visibility - (&optional (section magit-insert-section--current)) - ;; Emacs 25's `alist-get' lacks TESTFN. - (let* ((id (magit-section-ident section)) - (elt (assoc id magit-section-visibility-cache)) - (val (if (oref section hidden) 'hide 'show))) - (if elt - (setcdr elt val) - (push (cons id val) magit-section-visibility-cache)))) - -(cl-defun magit-section-maybe-cache-visibility - (&optional (section magit-insert-section--current)) - (when (or (eq magit-section-cache-visibility t) - (memq (oref section type) - magit-section-cache-visibility)) - (magit-section-cache-visibility section))) - -(defun magit-section-maybe-update-visibility-indicator (section) - (when magit-section-visibility-indicator - (let ((beg (oref section start)) - (cnt (oref section content)) - (end (oref section end))) - (when (and cnt (or (not (= cnt end)) (oref section washer))) - (let ((eoh (save-excursion - (goto-char beg) - (line-end-position)))) - (cond - ((symbolp (car-safe magit-section-visibility-indicator)) - ;; It would make more sense to put the overlay only on the - ;; location we actually don't put it on, but then inserting - ;; before that location (while taking care not to mess with - ;; the overlay) would cause the fringe bitmap to disappear - ;; (but not other effects of the overlay). - (let ((ov (magit--overlay-at (1+ beg) 'magit-vis-indicator 'fringe))) - (unless ov - (setq ov (make-overlay (1+ beg) eoh)) - (overlay-put ov 'evaporate t) - (overlay-put ov 'magit-vis-indicator 'fringe)) - (overlay-put - ov 'before-string - (propertize "fringe" 'display - (list 'left-fringe - (if (oref section hidden) - (car magit-section-visibility-indicator) - (cdr magit-section-visibility-indicator)) - (face-foreground 'fringe)))))) - ((stringp (car-safe magit-section-visibility-indicator)) - (let ((ov (magit--overlay-at (1- eoh) 'magit-vis-indicator 'eoh))) - (cond ((oref section hidden) - (unless ov - (setq ov (make-overlay (1- eoh) eoh)) - (overlay-put ov 'evaporate t) - (overlay-put ov 'magit-vis-indicator 'eoh)) - (overlay-put ov 'after-string - (car magit-section-visibility-indicator))) - (ov - (delete-overlay ov))))))))))) - -(defvar-local magit--ellipses-sections nil) - -(defun magit-section-maybe-paint-visibility-ellipses () - ;; This is needed because we hide the body instead of "the body - ;; except the final newline and additionally the newline before - ;; the body"; otherwise we could use `buffer-invisibility-spec'. - (when (stringp (car-safe magit-section-visibility-indicator)) - (let* ((sections (append magit--ellipses-sections - (setq magit--ellipses-sections - (or (magit-region-sections) - (list (magit-current-section)))))) - (beg (--map (oref it start) sections)) - (end (--map (oref it end) sections))) - (when (region-active-p) - ;; This ensures that the region face is removed from ellipses - ;; when the region becomes inactive, but fails to ensure that - ;; all ellipses within the active region use the region face, - ;; because the respective overlay has not yet been updated at - ;; this time. The magit-selection face is always applied. - (push (region-beginning) beg) - (push (region-end) end)) - (setq beg (apply #'min beg)) - (setq end (apply #'max end)) - (dolist (ov (overlays-in beg end)) - (when (eq (overlay-get ov 'magit-vis-indicator) 'eoh) - (overlay-put - ov 'after-string - (propertize - (car magit-section-visibility-indicator) 'font-lock-face - (let ((pos (overlay-start ov))) - (delq nil (nconc (--map (overlay-get it 'font-lock-face) - (overlays-at pos)) - (list (get-char-property - pos 'font-lock-face)))))))))))) - -(defun magit-section-maybe-remove-visibility-indicator (section) - (when (and magit-section-visibility-indicator - (= (oref section content) - (oref section end))) - (dolist (o (overlays-in (oref section start) - (save-excursion - (goto-char (oref section start)) - (1+ (line-end-position))))) - (when (overlay-get o 'magit-vis-indicator) - (delete-overlay o))))) - -;;; Utilities - -(cl-defun magit-section-selected-p (section &optional (selection nil sselection)) - (and (not (eq section magit-root-section)) - (or (eq section (magit-current-section)) - (memq section (if sselection - selection - (setq selection (magit-region-sections)))) - (--when-let (oref section parent) - (magit-section-selected-p it selection))))) - -(defun magit-section-parent-value (section) - (when-let ((parent (oref section parent))) - (oref parent value))) - -(defun magit-section-siblings (section &optional direction) - "Return a list of the sibling sections of SECTION. - -If optional DIRECTION is `prev', then return siblings that come -before SECTION. If it is `next', then return siblings that come -after SECTION. For all other values, return all siblings -excluding SECTION itself." - (when-let ((parent (oref section parent))) - (let ((siblings (oref parent children))) - (pcase direction - (`prev (cdr (member section (reverse siblings)))) - (`next (cdr (member section siblings))) - (_ (remq section siblings)))))) - -(defun magit-region-values (&optional condition multiple) - "Return a list of the values of the selected sections. - -Return the values that themselves would be returned by -`magit-region-sections' (which see)." - (--map (oref it value) - (magit-region-sections condition multiple))) - -(defun magit-region-sections (&optional condition multiple) - "Return a list of the selected sections. - -When the region is active and constitutes a valid section -selection, then return a list of all selected sections. This is -the case when the region begins in the heading of a section and -ends in the heading of the same section or in that of a sibling -section. If optional MULTIPLE is non-nil, then the region cannot -begin and end in the same section. - -When the selection is not valid, then return nil. In this case, -most commands that can act on the selected sections will instead -act on the section at point. - -When the region looks like it would in any other buffer then -the selection is invalid. When the selection is valid then the -region uses the `magit-section-highlight' face. This does not -apply to diffs where things get a bit more complicated, but even -here if the region looks like it usually does, then that's not -a valid selection as far as this function is concerned. - -If optional CONDITION is non-nil, then the selection not only -has to be valid; all selected sections additionally have to match -CONDITION, or nil is returned. See `magit-section-match' for the -forms CONDITION can take." - (when (region-active-p) - (let* ((rbeg (region-beginning)) - (rend (region-end)) - (sbeg (get-text-property rbeg 'magit-section)) - (send (get-text-property rend 'magit-section))) - (when (and send - (not (eq send magit-root-section)) - (not (and multiple (eq send sbeg)))) - (let ((siblings (cons sbeg (magit-section-siblings sbeg 'next))) - sections) - (when (and (memq send siblings) - (magit-section-position-in-heading-p sbeg rbeg) - (magit-section-position-in-heading-p send rend)) - (while siblings - (push (car siblings) sections) - (when (eq (pop siblings) send) - (setq siblings nil))) - (setq sections (nreverse sections)) - (when (or (not condition) - (--all-p (magit-section-match condition it) sections)) - sections))))))) - -(defun magit-section-position-in-heading-p (&optional section pos) - "Return t if POSITION is inside the heading of SECTION. -POSITION defaults to point and SECTION defaults to the -current section." - (unless section - (setq section (magit-current-section))) - (unless pos - (setq pos (point))) - (and section - (>= pos (oref section start)) - (< pos (or (oref section content) - (oref section end))) - t)) - -(defun magit-section-internal-region-p (&optional section) - "Return t if the region is active and inside SECTION's body. -If optional SECTION is nil, use the current section." - (and (region-active-p) - (or section (setq section (magit-current-section))) - (let ((beg (get-text-property (region-beginning) 'magit-section))) - (and (eq beg (get-text-property (region-end) 'magit-section)) - (eq beg section))) - (not (or (magit-section-position-in-heading-p section (region-beginning)) - (magit-section-position-in-heading-p section (region-end)))) - t)) - -(defun magit-section--backward-protected () - "Move to the beginning of the current or the previous visible section. -Same as `magit-section-backward' but for non-interactive use. -Suppress `magit-section-movement-hook', and return a boolean to -indicate whether a section was found, instead of raising an error -if not." - (condition-case nil - (let ((magit-section-movement-hook nil)) - (magit-section-backward) - t) - (user-error nil))) - -(defun magit-section--backward-find (predicate) - "Move to the first previous section satisfying PREDICATE. -PREDICATE does not take any parameter and should not move -point." - (let (found) - (while (and (setq found (magit-section--backward-protected)) - (not (funcall predicate)))) - found)) - -(defun magit-wash-sequence (function) - "Repeatedly call FUNCTION until it returns nil or eob is reached. -FUNCTION has to move point forward or return nil." - (while (and (not (eobp)) (funcall function)))) - -(defun magit-add-section-hook (hook function &optional at append local) - "Add to the value of section hook HOOK the function FUNCTION. - -Add FUNCTION at the beginning of the hook list unless optional -APPEND is non-nil, in which case FUNCTION is added at the end. -If FUNCTION already is a member, then move it to the new location. - -If optional AT is non-nil and a member of the hook list, then -add FUNCTION next to that instead. Add before or after AT, or -replace AT with FUNCTION depending on APPEND. If APPEND is the -symbol `replace', then replace AT with FUNCTION. For any other -non-nil value place FUNCTION right after AT. If nil, then place -FUNCTION right before AT. If FUNCTION already is a member of the -list but AT is not, then leave FUNCTION where ever it already is. - -If optional LOCAL is non-nil, then modify the hook's buffer-local -value rather than its global value. This makes the hook local by -copying the default value. That copy is then modified. - -HOOK should be a symbol. If HOOK is void, it is first set to nil. -HOOK's value must not be a single hook function. FUNCTION should -be a function that takes no arguments and inserts one or multiple -sections at point, moving point forward. FUNCTION may choose not -to insert its section(s), when doing so would not make sense. It -should not be abused for other side-effects. To remove FUNCTION -again use `remove-hook'." - (unless (boundp hook) - (error "Cannot add function to undefined hook variable %s" hook)) - (unless (default-boundp hook) - (set-default hook nil)) - (let ((value (if local - (if (local-variable-p hook) - (symbol-value hook) - (unless (local-variable-if-set-p hook) - (make-local-variable hook)) - (copy-sequence (default-value hook))) - (default-value hook)))) - (if at - (when (setq at (member at value)) - (setq value (delq function value)) - (cond ((eq append 'replace) - (setcar at function)) - (append - (push function (cdr at))) - (t - (push (car at) (cdr at)) - (setcar at function)))) - (setq value (delq function value))) - (unless (member function value) - (setq value (if append - (append value (list function)) - (cons function value)))) - (when (eq append 'replace) - (setq value (delq at value))) - (if local - (set hook value) - (set-default hook value)))) - -(defvar-local magit-disabled-section-inserters nil) - -(defun magit-disable-section-inserter (fn) - "Disable the section inserter FN in the current repository. -It is only intended for use in \".dir-locals.el\" and -\".dir-locals-2.el\". Also see info node `(magit)Per-Repository -Configuration'." - (cl-pushnew fn magit-disabled-section-inserters)) - -(put 'magit-disable-section-inserter 'safe-local-eval-function t) - -(defun magit-run-section-hook (hook &rest args) - "Run HOOK with ARGS, warning about invalid entries." - (let ((entries (symbol-value hook))) - (unless (listp entries) - (setq entries (list entries))) - (--when-let (-remove #'functionp entries) - (message "`%s' contains entries that are no longer valid. -%s\nUsing standard value instead. Please re-configure hook variable." - hook - (mapconcat (lambda (sym) (format " `%s'" sym)) it "\n")) - (sit-for 5) - (setq entries (eval (car (get hook 'standard-value))))) - (dolist (entry entries) - (let ((magit--current-section-hook (cons (list hook entry) - magit--current-section-hook))) - (unless (memq entry magit-disabled-section-inserters) - (if (bound-and-true-p magit-refresh-verbose) - (message " %-50s %s" entry - (benchmark-elapse (apply entry args))) - (apply entry args))))))) - -(cl-defun magit--overlay-at (pos prop &optional (val nil sval) testfn) - (cl-find-if (lambda (o) - (let ((p (overlay-properties o))) - (and (plist-member p prop) - (or (not sval) - (funcall (or testfn #'eql) - (plist-get p prop) - val))))) - (overlays-at pos t))) - -;;; _ -(provide 'magit-section) -;;; magit-section.el ends here diff --git a/elpa/magit-20200418.939/magit-section.elc b/elpa/magit-20200418.939/magit-section.elc deleted file mode 100644 index 48c150e7ae8e89f5090548d1e96bb790ff07dc8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65928 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�H(C$S{jX`s?j`TR~OLR{o_`LS`xl6q{HZ!lk#OZLtU_TdCt z8LwL6@*os)=Nd$}c4&p#3(jt4By{6~O26YTF8+WM^2p=}w~0tWsD!jIZRZfaYrG*s zqvW-LBzrI7JJs3D!v5vQiew&x2+MEtl#)2F@5~DXv+Sf>!12v-AQhx(8SU$ zjcDzN^|&R?wDG@!fjOS2=%p6kVA^iuy=ZGjpRa|m>b-^QG>XLxOlE0evF5WgOxYaF zOH0>uaRk@@sbS#g>As2A z^xtSK+z2{;ZmJ$fQfs6pbGp;&+Kq+x79aV{I_j)S5d>SR9h#w1VW=>A-^&Y$<7bpI zw46g^6EMw)ECwW6;n5gL89IVy(<+UUODys*3t>E;en2TveR6Jy?wl%ZZTut?1L8=| z1I!s5&lY#Oqfy6ld+plBxoH%Yi8o=R0D^V`UZ` z!A+05Rdj1{FJ>pSJnkO%0!FD;LnXs#?NX|XFE7HqYBiN(Y5ve4a^E#+)Fe@+(WS)wYQwH_wD23T zM2l0m@;V;HA|5C15t&|7j^ozjP5yT4irL#V7Japd^WnG68;cKaQu&2nEi|!t1~;%G z-_#Rl#ODjTy4?O14<;A~_Chd@Iw2e<@ve!+S%P^F0*{U_(g>Yv_?t8f3$eM)$5Q(0 z8j3KU_x!8XVh|43Cd&FqyUe;5OIj77=$idi7-Kisk;;ko{JerQ@IZC2D zqsv!`C-ZBtWd|bpo8nHs&n_KwG07tvs4P7a6BvX$VQ=u!cyI8f>B`uU?8@{Yl<>X0 z91z}9#5zVL6`hWau!3|FnF{xPDdxw^bVb4m`d-GGQJ%aWMxwjA3G&JL;&%S%*+sb|<1bf}5xm;p;;Hbq6AL}{N)R83CR7_A^}B3Gu8{JL<16wDYEr(qBAs4$Guo+=#s9|y zuqJkIW+>~wN9(kHVau@#KkZiqV74u(#d0~JNo#2aQYV?|0z(m|F|G<>9+%UYYRslG uQW*C%Jiy8(J6IY__Jq1C;cJCOBo)Fjo diff --git a/elpa/magit-20200418.939/magit-sequence.el b/elpa/magit-20200418.939/magit-sequence.el deleted file mode 100644 index d0275665..00000000 --- a/elpa/magit-20200418.939/magit-sequence.el +++ /dev/null @@ -1,1041 +0,0 @@ -;;; magit-sequence.el --- history manipulation in Magit -*- lexical-binding: t -*- - -;; Copyright (C) 2011-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; Support for Git commands that replay commits and help the user make -;; changes along the way. Supports `cherry-pick', `revert', `rebase', -;; `rebase--interactive' and `am'. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) - -;; For `magit-rebase--todo'. -(declare-function git-rebase-current-line "git-rebase" ()) -(eval-when-compile - (cl-pushnew 'action-type eieio--known-slot-names) - (cl-pushnew 'action eieio--known-slot-names) - (cl-pushnew 'action-options eieio--known-slot-names) - (cl-pushnew 'target eieio--known-slot-names)) - -;;; Options -;;;; Faces - -(defface magit-sequence-pick - '((t :inherit default)) - "Face used in sequence sections." - :group 'magit-faces) - -(defface magit-sequence-stop - '((((class color) (background light)) :foreground "DarkOliveGreen4") - (((class color) (background dark)) :foreground "DarkSeaGreen2")) - "Face used in sequence sections." - :group 'magit-faces) - -(defface magit-sequence-part - '((((class color) (background light)) :foreground "Goldenrod4") - (((class color) (background dark)) :foreground "LightGoldenrod2")) - "Face used in sequence sections." - :group 'magit-faces) - -(defface magit-sequence-head - '((((class color) (background light)) :foreground "SkyBlue4") - (((class color) (background dark)) :foreground "LightSkyBlue1")) - "Face used in sequence sections." - :group 'magit-faces) - -(defface magit-sequence-drop - '((((class color) (background light)) :foreground "IndianRed") - (((class color) (background dark)) :foreground "IndianRed")) - "Face used in sequence sections." - :group 'magit-faces) - -(defface magit-sequence-done - '((t :inherit magit-hash)) - "Face used in sequence sections." - :group 'magit-faces) - -(defface magit-sequence-onto - '((t :inherit magit-sequence-done)) - "Face used in sequence sections." - :group 'magit-faces) - -(defface magit-sequence-exec - '((t :inherit magit-hash)) - "Face used in sequence sections." - :group 'magit-faces) - -;;; Common - -;;;###autoload -(defun magit-sequencer-continue () - "Resume the current cherry-pick or revert sequence." - (interactive) - (if (magit-sequencer-in-progress-p) - (if (magit-anything-unstaged-p t) - (user-error "Cannot continue due to unstaged changes") - (magit-run-git-sequencer - (if (magit-revert-in-progress-p) "revert" "cherry-pick") "--continue")) - (user-error "No cherry-pick or revert in progress"))) - -;;;###autoload -(defun magit-sequencer-skip () - "Skip the stopped at commit during a cherry-pick or revert sequence." - (interactive) - (if (magit-sequencer-in-progress-p) - (progn (magit-call-git "reset" "--hard") - (magit-sequencer-continue)) - (user-error "No cherry-pick or revert in progress"))) - -;;;###autoload -(defun magit-sequencer-abort () - "Abort the current cherry-pick or revert sequence. -This discards all changes made since the sequence started." - (interactive) - (if (magit-sequencer-in-progress-p) - (magit-run-git-sequencer - (if (magit-revert-in-progress-p) "revert" "cherry-pick") "--abort") - (user-error "No cherry-pick or revert in progress"))) - -(defun magit-sequencer-in-progress-p () - (or (magit-cherry-pick-in-progress-p) - (magit-revert-in-progress-p))) - -;;; Cherry-Pick - -(defvar magit-perl-executable "perl" - "The Perl executable.") - -;;;###autoload (autoload 'magit-cherry-pick "magit-sequence" nil t) -(define-transient-command magit-cherry-pick () - "Apply or transplant commits." - :man-page "git-cherry-pick" - :value '("--ff") - :incompatible '(("--ff" "-x")) - ["Arguments" - :if-not magit-sequencer-in-progress-p - (magit-cherry-pick:--mainline) - ("=s" magit-merge:--strategy) - ("-F" "Attempt fast-forward" "--ff") - ("-x" "Reference cherry in commit message" "-x") - ("-e" "Edit commit messages" ("-e" "--edit")) - ("-s" "Add Signed-off-by lines" ("-s" "--signoff")) - (5 magit:--gpg-sign)] - [:if-not magit-sequencer-in-progress-p - ["Apply here" - ("A" "Pick" magit-cherry-copy) - ("a" "Apply" magit-cherry-apply) - ("h" "Harvest" magit-cherry-harvest)] - ["Apply elsewhere" - ("d" "Donate" magit-cherry-donate) - ("n" "Spinout" magit-cherry-spinout) - ("s" "Spinoff" magit-cherry-spinoff)]] - ["Actions" - :if magit-sequencer-in-progress-p - ("A" "Continue" magit-sequencer-continue) - ("s" "Skip" magit-sequencer-skip) - ("a" "Abort" magit-sequencer-abort)]) - -(define-infix-argument magit-cherry-pick:--mainline () - :description "Replay merge relative to parent" - :class 'transient-option - :shortarg "-m" - :argument "--mainline=" - :reader 'transient-read-number-N+) - -(defun magit-cherry-pick-read-args (prompt) - (list (or (nreverse (magit-region-values 'commit)) - (magit-read-other-branch-or-commit prompt)) - (transient-args 'magit-cherry-pick))) - -(defun magit--cherry-move-read-args (verb away fn) - (declare (indent defun)) - (let ((commits (or (nreverse (magit-region-values 'commit)) - (list (funcall (if away - 'magit-read-branch-or-commit - 'magit-read-other-branch-or-commit) - (format "%s cherry" (capitalize verb)))))) - (current (magit-get-current-branch))) - (unless current - (user-error "Cannot %s cherries while HEAD is detached" verb)) - (let ((reachable (magit-rev-ancestor-p (car commits) current)) - (msg "Cannot %s cherries that %s reachable from HEAD")) - (pcase (list away reachable) - (`(nil t) (user-error msg verb "are")) - (`(t nil) (user-error msg verb "are not")))) - `(,commits - ,@(funcall fn commits) - ,(transient-args 'magit-cherry-pick)))) - -(defun magit--cherry-spinoff-read-args (verb) - (magit--cherry-move-read-args verb t - (lambda (commits) - (magit-branch-read-args - (format "Create branch from %s cherries" (length commits)) - (magit-get-upstream-branch))))) - -;;;###autoload -(defun magit-cherry-copy (commits &optional args) - "Copy COMMITS from another branch onto the current branch. -Prompt for a commit, defaulting to the commit at point. If -the region selects multiple commits, then pick all of them, -without prompting." - (interactive (magit-cherry-pick-read-args "Cherry-pick")) - (magit--cherry-pick commits args)) - -;;;###autoload -(defun magit-cherry-apply (commits &optional args) - "Apply the changes in COMMITS but do not commit them. -Prompt for a commit, defaulting to the commit at point. If -the region selects multiple commits, then apply all of them, -without prompting." - (interactive (magit-cherry-pick-read-args "Apply changes from commit")) - (magit--cherry-pick commits (cons "--no-commit" (remove "--ff" args)))) - -;;;###autoload -(defun magit-cherry-harvest (commits branch &optional args) - "Move COMMITS from another BRANCH onto the current branch. -Remove the COMMITS from BRANCH and stay on the current branch. -If a conflict occurs, then you have to fix that and finish the -process manually." - (interactive - (magit--cherry-move-read-args "harvest" nil - (lambda (commits) - (list (let ((branches (magit-list-containing-branches (car commits)))) - (pcase (length branches) - (0 nil) - (1 (car branches)) - (_ (magit-completing-read - (format "Remove %s cherries from branch" (length commits)) - branches nil t)))))))) - (magit--cherry-move commits branch (magit-get-current-branch) args nil t)) - -;;;###autoload -(defun magit-cherry-donate (commits branch &optional args) - "Move COMMITS from the current branch onto another existing BRANCH. -Remove COMMITS from the current branch and stay on that branch. -If a conflict occurs, then you have to fix that and finish the -process manually." - (interactive - (magit--cherry-move-read-args "donate" t - (lambda (commits) - (list (magit-read-other-branch (format "Move %s cherries to branch" - (length commits))))))) - (magit--cherry-move commits (magit-get-current-branch) branch args)) - -;;;###autoload -(defun magit-cherry-spinout (commits branch start-point &optional args) - "Move COMMITS from the current branch onto a new BRANCH. -Remove COMMITS from the current branch and stay on that branch. -If a conflict occurs, then you have to fix that and finish the -process manually." - (interactive (magit--cherry-spinoff-read-args "spinout")) - (magit--cherry-move commits (magit-get-current-branch) branch args - start-point)) - -;;;###autoload -(defun magit-cherry-spinoff (commits branch start-point &optional args) - "Move COMMITS from the current branch onto a new BRANCH. -Remove COMMITS from the current branch and checkout BRANCH. -If a conflict occurs, then you have to fix that and finish -the process manually." - (interactive (magit--cherry-spinoff-read-args "spinoff")) - (magit--cherry-move commits (magit-get-current-branch) branch args - start-point t)) - -(defun magit--cherry-move (commits src dst args - &optional start-point checkout-dst) - (let ((current (magit-get-current-branch))) - (unless (magit-branch-p dst) - (let ((magit-process-raise-error t)) - (magit-call-git "branch" dst start-point)) - (--when-let (magit-get-indirect-upstream-branch start-point) - (magit-call-git "branch" "--set-upstream-to" it dst))) - (unless (equal dst current) - (let ((magit-process-raise-error t)) - (magit-call-git "checkout" dst))) - (if (not src) ; harvest only - (magit--cherry-pick commits args) - (let ((tip (car (last commits))) - (keep (concat (car commits) "^"))) - (magit--cherry-pick commits args) - (set-process-sentinel - magit-this-process - (lambda (process event) - (when (memq (process-status process) '(exit signal)) - (if (> (process-exit-status process) 0) - (magit-process-sentinel process event) - (process-put process 'inhibit-refresh t) - (magit-process-sentinel process event) - (cond - ((magit-rev-equal tip src) - (magit-call-git "update-ref" - "-m" (format "reset: moving to %s" keep) - (magit-ref-fullname src) - keep tip) - (if (not checkout-dst) - (magit-run-git "checkout" src) - (magit-refresh))) - (t - (magit-git "checkout" src) - (let ((process-environment process-environment)) - (push (format "%s=%s -i -ne '/^pick (%s)/ or print'" - "GIT_SEQUENCE_EDITOR" - magit-perl-executable - (mapconcat #'magit-rev-abbrev commits "|")) - process-environment) - (magit-run-git-sequencer "rebase" "-i" keep)) - (when checkout-dst - (set-process-sentinel - magit-this-process - (lambda (process event) - (when (memq (process-status process) '(exit signal)) - (if (> (process-exit-status process) 0) - (magit-process-sentinel process event) - (process-put process 'inhibit-refresh t) - (magit-process-sentinel process event) - (magit-run-git "checkout" dst)))))))))))))))) - -(defun magit--cherry-pick (commits args &optional revert) - (let ((command (if revert "revert" "cherry-pick"))) - (when (stringp commits) - (setq commits (if (string-match-p "\\.\\." commits) - (split-string commits "\\.\\.") - (list commits)))) - (magit-run-git-sequencer - (if revert "revert" "cherry-pick") - (pcase-let ((`(,merge ,non-merge) - (-separate 'magit-merge-commit-p commits))) - (cond - ((not merge) - (--remove (string-prefix-p "--mainline=" it) args)) - (non-merge - (user-error "Cannot %s merge and non-merge commits at once" - command)) - ((--first (string-prefix-p "--mainline=" it) args) - args) - (t - (cons (format "--mainline=%s" - (read-number "Replay merges relative to parent: ")) - args)))) - commits))) - -(defun magit-cherry-pick-in-progress-p () - ;; .git/sequencer/todo does not exist when there is only one commit left. - (file-exists-p (magit-git-dir "CHERRY_PICK_HEAD"))) - -;;; Revert - -;;;###autoload (autoload 'magit-revert "magit-sequence" nil t) -(define-transient-command magit-revert () - "Revert existing commits, with or without creating new commits." - :man-page "git-revert" - :value '("--edit") - ["Arguments" - :if-not magit-sequencer-in-progress-p - (magit-cherry-pick:--mainline) - ("-e" "Edit commit message" ("-e" "--edit")) - ("-E" "Don't edit commit message" "--no-edit") - ("=s" magit-merge:--strategy) - ("-s" "Add Signed-off-by lines" ("-s" "--signoff")) - (5 magit:--gpg-sign)] - ["Actions" - :if-not magit-sequencer-in-progress-p - ("V" "Revert commit(s)" magit-revert-and-commit) - ("v" "Revert changes" magit-revert-no-commit)] - ["Actions" - :if magit-sequencer-in-progress-p - ("V" "Continue" magit-sequencer-continue) - ("s" "Skip" magit-sequencer-skip) - ("a" "Abort" magit-sequencer-abort)]) - -(defun magit-revert-read-args (prompt) - (list (or (magit-region-values 'commit) - (magit-read-branch-or-commit prompt)) - (transient-args 'magit-revert))) - -;;;###autoload -(defun magit-revert-and-commit (commit &optional args) - "Revert COMMIT by creating a new commit. -Prompt for a commit, defaulting to the commit at point. If -the region selects multiple commits, then revert all of them, -without prompting." - (interactive (magit-revert-read-args "Revert commit")) - (magit--cherry-pick commit args t)) - -;;;###autoload -(defun magit-revert-no-commit (commit &optional args) - "Revert COMMIT by applying it in reverse to the worktree. -Prompt for a commit, defaulting to the commit at point. If -the region selects multiple commits, then revert all of them, -without prompting." - (interactive (magit-revert-read-args "Revert changes")) - (magit--cherry-pick commit (cons "--no-commit" args) t)) - -(defun magit-revert-in-progress-p () - ;; .git/sequencer/todo does not exist when there is only one commit left. - (file-exists-p (magit-git-dir "REVERT_HEAD"))) - -;;; Patch - -;;;###autoload (autoload 'magit-am "magit-sequence" nil t) -(define-transient-command magit-am () - "Apply patches received by email." - :man-page "git-am" - :value '("--3way") - ["Arguments" - :if-not magit-am-in-progress-p - ("-3" "Fall back on 3way merge" ("-3" "--3way")) - (magit-apply:-p) - ("-c" "Remove text before scissors line" ("-c" "--scissors")) - ("-k" "Inhibit removal of email cruft" ("-k" "--keep")) - ("-b" "Limit removal of email cruft" "--keep-non-patch") - ("-d" "Use author date as committer date" "--committer-date-is-author-date") - ("-D" "Use committer date as author date" "--ignore-date") - ("-s" "Add Signed-off-by lines" ("-s" "--signoff")) - (5 magit:--gpg-sign)] - ["Apply" - :if-not magit-am-in-progress-p - ("m" "maildir" magit-am-apply-maildir) - ("w" "patches" magit-am-apply-patches) - ("a" "plain patch" magit-patch-apply)] - ["Actions" - :if magit-am-in-progress-p - ("w" "Continue" magit-am-continue) - ("s" "Skip" magit-am-skip) - ("a" "Abort" magit-am-abort)]) - -(defun magit-am-arguments () - (transient-args 'magit-am)) - -(define-infix-argument magit-apply:-p () - :description "Remove leading slashes from paths" - :class 'transient-option - :argument "-p" - :reader 'transient-read-number-N+) - -;;;###autoload -(defun magit-am-apply-patches (&optional files args) - "Apply the patches FILES." - (interactive (list (or (magit-region-values 'file) - (list (let ((default (magit-file-at-point))) - (read-file-name - (if default - (format "Apply patch (%s): " default) - "Apply patch: ") - nil default)))) - (magit-am-arguments))) - (magit-run-git-sequencer "am" args "--" - (--map (magit-convert-filename-for-git - (expand-file-name it)) - files))) - -;;;###autoload -(defun magit-am-apply-maildir (&optional maildir args) - "Apply the patches from MAILDIR." - (interactive (list (read-file-name "Apply mbox or Maildir: ") - (magit-am-arguments))) - (magit-run-git-sequencer "am" args (magit-convert-filename-for-git - (expand-file-name maildir)))) - -;;;###autoload -(defun magit-am-continue () - "Resume the current patch applying sequence." - (interactive) - (if (magit-am-in-progress-p) - (if (magit-anything-unstaged-p t) - (error "Cannot continue due to unstaged changes") - (magit-run-git-sequencer "am" "--continue")) - (user-error "Not applying any patches"))) - -;;;###autoload -(defun magit-am-skip () - "Skip the stopped at patch during a patch applying sequence." - (interactive) - (if (magit-am-in-progress-p) - (magit-run-git-sequencer "am" "--skip") - (user-error "Not applying any patches"))) - -;;;###autoload -(defun magit-am-abort () - "Abort the current patch applying sequence. -This discards all changes made since the sequence started." - (interactive) - (if (magit-am-in-progress-p) - (magit-run-git "am" "--abort") - (user-error "Not applying any patches"))) - -(defun magit-am-in-progress-p () - (file-exists-p (magit-git-dir "rebase-apply/applying"))) - -;;; Rebase - -;;;###autoload (autoload 'magit-rebase "magit-sequence" nil t) -(define-transient-command magit-rebase () - "Transplant commits and/or modify existing commits." - :man-page "git-rebase" - ["Arguments" - :if-not magit-rebase-in-progress-p - ("-k" "Keep empty commits" "--keep-empty") - ("-p" "Preserve merges" ("-p" "--preserve-merges")) - (7 magit-merge:--strategy) - ("-d" "Lie about committer date" "--committer-date-is-author-date") - ("-a" "Autosquash" "--autosquash") - ("-A" "Autostash" "--autostash") - ("-i" "Interactive" ("-i" "--interactive")) - ("-h" "Disable hooks" "--no-verify") - (7 magit-rebase:--exec) - (5 magit:--gpg-sign) - (5 "-r" "Rebase merges" "--rebase-merges=" magit-rebase-merges-select-mode)] - [:if-not magit-rebase-in-progress-p - :description (lambda () - (format (propertize "Rebase %s onto" 'face 'transient-heading) - (propertize (or (magit-get-current-branch) "HEAD") - 'face 'magit-branch-local))) - ("p" magit-rebase-onto-pushremote) - ("u" magit-rebase-onto-upstream) - ("e" "elsewhere" magit-rebase-branch)] - ["Rebase" - :if-not magit-rebase-in-progress-p - [("i" "interactively" magit-rebase-interactive) - ("s" "a subset" magit-rebase-subset)] - [("m" "to modify a commit" magit-rebase-edit-commit) - ("w" "to reword a commit" magit-rebase-reword-commit) - ("k" "to remove a commit" magit-rebase-remove-commit) - ("f" "to autosquash" magit-rebase-autosquash) - (6 "t" "to change dates" magit-reshelve-since)]] - ["Actions" - :if magit-rebase-in-progress-p - ("r" "Continue" magit-rebase-continue) - ("s" "Skip" magit-rebase-skip) - ("e" "Edit" magit-rebase-edit) - ("a" "Abort" magit-rebase-abort)]) - -(define-infix-argument magit-rebase:--exec () - :description "Run command after commits" - :class 'transient-option - :shortarg "-x" - :argument "--exec=" - :reader #'read-shell-command) - -(defun magit-rebase-merges-select-mode (&rest _ignore) - (magit-read-char-case nil t - (?n "[n]o-rebase-cousins" "no-rebase-cousins") - (?r "[r]ebase-cousins" "rebase-cousins"))) - -(defun magit-rebase-arguments () - (transient-args 'magit-rebase)) - -(defun magit-git-rebase (target args) - (magit-run-git-sequencer "rebase" args target)) - -;;;###autoload (autoload 'magit-rebase-onto-pushremote "magit-sequence" nil t) -(define-suffix-command magit-rebase-onto-pushremote (args) - "Rebase the current branch onto its push-remote branch. - -With a prefix argument or when the push-remote is either not -configured or unusable, then let the user first configure the -push-remote." - :if 'magit-get-current-branch - :description 'magit-pull--pushbranch-description - (interactive (list (magit-rebase-arguments))) - (pcase-let ((`(,branch ,remote) - (magit--select-push-remote "rebase onto that"))) - (magit-git-rebase (concat remote "/" branch) args))) - -;;;###autoload (autoload 'magit-rebase-onto-upstream "magit-sequence" nil t) -(define-suffix-command magit-rebase-onto-upstream (args) - "Rebase the current branch onto its upstream branch. - -With a prefix argument or when the upstream is either not -configured or unusable, then let the user first configure -the upstream." - :if 'magit-get-current-branch - :description 'magit-rebase--upstream-description - (interactive (list (magit-rebase-arguments))) - (let* ((branch (or (magit-get-current-branch) - (user-error "No branch is checked out"))) - (upstream (magit-get-upstream-branch branch))) - (when (or current-prefix-arg (not upstream)) - (setq upstream - (magit-read-upstream-branch - branch (format "Set upstream of %s and rebase onto that" branch))) - (magit-set-upstream-branch branch upstream)) - (magit-git-rebase upstream args))) - -(defun magit-rebase--upstream-description () - (when-let ((branch (magit-get-current-branch))) - (or (magit-get-upstream-branch branch) - (let ((remote (magit-get "branch" branch "remote")) - (merge (magit-get "branch" branch "merge")) - (u (magit--propertize-face "@{upstream}" 'bold))) - (cond - ((magit--unnamed-upstream-p remote merge) - (concat u ", replacing unnamed")) - ((magit--valid-upstream-p remote merge) - (concat u ", replacing non-existent")) - ((or remote merge) - (concat u ", replacing invalid")) - (t - (concat u ", setting that"))))))) - -;;;###autoload -(defun magit-rebase-branch (target args) - "Rebase the current branch onto a branch read in the minibuffer. -All commits that are reachable from `HEAD' but not from the -selected branch TARGET are being rebased." - (interactive (list (magit-read-other-branch-or-commit "Rebase onto") - (magit-rebase-arguments))) - (message "Rebasing...") - (magit-git-rebase target args) - (message "Rebasing...done")) - -;;;###autoload -(defun magit-rebase-subset (newbase start args) - "Rebase a subset of the current branch's history onto a new base. -Rebase commits from START to `HEAD' onto NEWBASE. -START has to be selected from a list of recent commits." - (interactive (list (magit-read-other-branch-or-commit - "Rebase subset onto" nil - (magit-get-upstream-branch)) - nil - (magit-rebase-arguments))) - (if start - (progn (message "Rebasing...") - (magit-run-git-sequencer "rebase" "--onto" newbase start args) - (message "Rebasing...done")) - (magit-log-select - `(lambda (commit) - (magit-rebase-subset ,newbase (concat commit "^") (list ,@args))) - (concat "Type %p on a commit to rebase it " - "and commits above it onto " newbase ",")))) - -(defvar magit-rebase-interactive-include-selected t) - -(defun magit-rebase-interactive-1 - (commit args message &optional editor delay-edit-confirm noassert confirm) - (declare (indent 2)) - (when commit - (if (eq commit :merge-base) - (setq commit (--if-let (magit-get-upstream-branch) - (magit-git-string "merge-base" it "HEAD") - nil)) - (unless (magit-rev-ancestor-p commit "HEAD") - (user-error "%s isn't an ancestor of HEAD" commit)) - (if (magit-commit-parents commit) - (when (or (not (eq this-command 'magit-rebase-interactive)) - magit-rebase-interactive-include-selected) - (setq commit (concat commit "^"))) - (setq args (cons "--root" args))))) - (when (and commit (not noassert)) - (setq commit (magit-rebase-interactive-assert - commit delay-edit-confirm - (--some (string-prefix-p "--rebase-merges" it) args)))) - (if (and commit (not confirm)) - (let ((process-environment process-environment)) - (when editor - (push (concat "GIT_SEQUENCE_EDITOR=" - (if (functionp editor) - (funcall editor commit) - editor)) - process-environment)) - (magit-run-git-sequencer "rebase" "-i" args - (unless (member "--root" args) commit))) - (magit-log-select - `(lambda (commit) - (magit-rebase-interactive-1 commit (list ,@args) - ,message ,editor ,delay-edit-confirm ,noassert)) - message))) - -(defvar magit--rebase-published-symbol nil) -(defvar magit--rebase-public-edit-confirmed nil) - -(defun magit-rebase-interactive-assert - (since &optional delay-edit-confirm rebase-merges) - (let* ((commit (magit-rebase--target-commit since)) - (branches (magit-list-publishing-branches commit))) - (setq magit--rebase-public-edit-confirmed - (delete (magit-toplevel) magit--rebase-public-edit-confirmed)) - (when (and branches - (or (not delay-edit-confirm) - ;; The user might have stopped at a published commit - ;; merely to add new commits *after* it. Try not to - ;; ask users whether they really want to edit public - ;; commits, when they don't actually intend to do so. - (not (--all-p (magit-rev-equal it commit) branches)))) - (let ((m1 "Some of these commits have already been published to ") - (m2 ".\nDo you really want to modify them")) - (magit-confirm (or magit--rebase-published-symbol 'rebase-published) - (concat m1 "%s" m2) - (concat m1 "%i public branches" m2) - nil branches)) - (push (magit-toplevel) magit--rebase-public-edit-confirmed))) - (if (and (magit-git-lines "rev-list" "--merges" (concat since "..HEAD")) - (not rebase-merges)) - (magit-read-char-case "Proceed despite merge in rebase range? " nil - (?c "[c]ontinue" since) - (?s "[s]elect other" nil) - (?a "[a]bort" (user-error "Quit"))) - since)) - -(defun magit-rebase--target-commit (since) - (if (string-suffix-p "^" since) - ;; If SINCE is "REV^", then the user selected - ;; "REV", which is the first commit that will - ;; be replaced. (from^..to] <=> [from..to] - (substring since 0 -1) - ;; The "--root" argument is being used. - since)) - -;;;###autoload -(defun magit-rebase-interactive (commit args) - "Start an interactive rebase sequence." - (interactive (list (magit-commit-at-point) - (magit-rebase-arguments))) - (magit-rebase-interactive-1 commit args - "Type %p on a commit to rebase it and all commits above it," - nil t)) - -;;;###autoload -(defun magit-rebase-autosquash (args) - "Combine squash and fixup commits with their intended targets." - (interactive (list (magit-rebase-arguments))) - (magit-rebase-interactive-1 :merge-base - (nconc (list "--autosquash" "--keep-empty") args) - "Type %p on a commit to squash into it and then rebase as necessary," - "true" nil t)) - -;;;###autoload -(defun magit-rebase-edit-commit (commit args) - "Edit a single older commit using rebase." - (interactive (list (magit-commit-at-point) - (magit-rebase-arguments))) - (magit-rebase-interactive-1 commit args - "Type %p on a commit to edit it," - (apply-partially #'magit-rebase--perl-editor 'edit) - t)) - -;;;###autoload -(defun magit-rebase-reword-commit (commit args) - "Reword a single older commit using rebase." - (interactive (list (magit-commit-at-point) - (magit-rebase-arguments))) - (magit-rebase-interactive-1 commit args - "Type %p on a commit to reword its message," - (apply-partially #'magit-rebase--perl-editor 'reword))) - -;;;###autoload -(defun magit-rebase-remove-commit (commit args) - "Remove a single older commit using rebase." - (interactive (list (magit-commit-at-point) - (magit-rebase-arguments))) - (magit-rebase-interactive-1 commit args - "Type %p on a commit to remove it," - (apply-partially #'magit-rebase--perl-editor 'remove) - nil nil t)) - -(defun magit-rebase--perl-editor (action since) - (let ((commit (magit-rev-abbrev (magit-rebase--target-commit since)))) - (format "%s -i -p -e '++$x if not $x and s/^pick %s/%s %s/'" - magit-perl-executable - commit - (cl-case action - (edit "edit") - (remove "# pick") - (reword "reword") - (t (error "unknown action: %s" action))) - commit))) - -;;;###autoload -(defun magit-rebase-continue (&optional noedit) - "Restart the current rebasing operation. -In some cases this pops up a commit message buffer for you do -edit. With a prefix argument the old message is reused as-is." - (interactive "P") - (if (magit-rebase-in-progress-p) - (if (magit-anything-unstaged-p t) - (user-error "Cannot continue rebase with unstaged changes") - (when (and (magit-anything-staged-p) - (file-exists-p (magit-git-dir "rebase-merge")) - (not (member (magit-toplevel) - magit--rebase-public-edit-confirmed))) - (magit-commit-amend-assert)) - (if noedit - (let ((process-environment process-environment)) - (push "GIT_EDITOR=true" process-environment) - (magit-run-git-async (magit--rebase-resume-command) "--continue") - (set-process-sentinel magit-this-process - #'magit-sequencer-process-sentinel) - magit-this-process) - (magit-run-git-sequencer (magit--rebase-resume-command) "--continue"))) - (user-error "No rebase in progress"))) - -;;;###autoload -(defun magit-rebase-skip () - "Skip the current commit and restart the current rebase operation." - (interactive) - (unless (magit-rebase-in-progress-p) - (user-error "No rebase in progress")) - (magit-run-git-sequencer (magit--rebase-resume-command) "--skip")) - -;;;###autoload -(defun magit-rebase-edit () - "Edit the todo list of the current rebase operation." - (interactive) - (unless (magit-rebase-in-progress-p) - (user-error "No rebase in progress")) - (magit-run-git-sequencer "rebase" "--edit-todo")) - -;;;###autoload -(defun magit-rebase-abort () - "Abort the current rebase operation, restoring the original branch." - (interactive) - (unless (magit-rebase-in-progress-p) - (user-error "No rebase in progress")) - (magit-confirm 'abort-rebase "Abort this rebase") - (magit-run-git (magit--rebase-resume-command) "--abort")) - -(defun magit-rebase-in-progress-p () - "Return t if a rebase is in progress." - (or (file-exists-p (magit-git-dir "rebase-merge")) - (file-exists-p (magit-git-dir "rebase-apply/onto")))) - -(defun magit--rebase-resume-command () - (if (file-exists-p (magit-git-dir "rebase-recursive")) "rbr" "rebase")) - -;;; Sections - -(defun magit-insert-sequencer-sequence () - "Insert section for the on-going cherry-pick or revert sequence. -If no such sequence is in progress, do nothing." - (let ((picking (magit-cherry-pick-in-progress-p))) - (when (or picking (magit-revert-in-progress-p)) - (magit-insert-section (sequence) - (magit-insert-heading (if picking "Cherry Picking" "Reverting")) - (when-let ((lines - (cdr (magit-file-lines (magit-git-dir "sequencer/todo"))))) - (dolist (line (nreverse lines)) - (when (string-match - "^\\(pick\\|revert\\) \\([^ ]+\\) \\(.*\\)$" line) - (magit-bind-match-strings (cmd hash msg) line - (magit-insert-section (commit hash) - (insert (propertize cmd 'font-lock-face 'magit-sequence-pick) - " " (propertize hash 'font-lock-face 'magit-hash) - " " msg "\n")))))) - (magit-sequence-insert-sequence - (magit-file-line (magit-git-dir (if picking - "CHERRY_PICK_HEAD" - "REVERT_HEAD"))) - (magit-file-line (magit-git-dir "sequencer/head"))) - (insert "\n"))))) - -(defun magit-insert-am-sequence () - "Insert section for the on-going patch applying sequence. -If no such sequence is in progress, do nothing." - (when (magit-am-in-progress-p) - (magit-insert-section (rebase-sequence) - (magit-insert-heading "Applying patches") - (let ((patches (nreverse (magit-rebase-patches))) - patch commit) - (while patches - (setq patch (pop patches)) - (setq commit (magit-commit-p - (cadr (split-string (magit-file-line patch))))) - (cond ((and commit patches) - (magit-sequence-insert-commit - "pick" commit 'magit-sequence-pick)) - (patches - (magit-sequence-insert-am-patch - "pick" patch 'magit-sequence-pick)) - (commit - (magit-sequence-insert-sequence commit "ORIG_HEAD")) - (t - (magit-sequence-insert-am-patch - "stop" patch 'magit-sequence-stop) - (magit-sequence-insert-sequence nil "ORIG_HEAD"))))) - (insert ?\n)))) - -(defun magit-sequence-insert-am-patch (type patch face) - (magit-insert-section (file patch) - (let ((title - (with-temp-buffer - (insert-file-contents patch nil nil 4096) - (unless (re-search-forward "^Subject: " nil t) - (goto-char (point-min))) - (buffer-substring (point) (line-end-position))))) - (insert (propertize type 'font-lock-face face) - ?\s (propertize (file-name-nondirectory patch) - 'font-lock-face 'magit-hash) - ?\s title - ?\n)))) - -(defun magit-insert-rebase-sequence () - "Insert section for the on-going rebase sequence. -If no such sequence is in progress, do nothing." - (when (magit-rebase-in-progress-p) - (let* ((interactive (file-directory-p (magit-git-dir "rebase-merge"))) - (dir (if interactive "rebase-merge/" "rebase-apply/")) - (name (-> (concat dir "head-name") magit-git-dir magit-file-line)) - (onto (-> (concat dir "onto") magit-git-dir magit-file-line)) - (onto (or (magit-rev-name onto name) - (magit-rev-name onto "refs/heads/*") onto)) - (name (or (magit-rev-name name "refs/heads/*") name))) - (magit-insert-section (rebase-sequence) - (magit-insert-heading (format "Rebasing %s onto %s" name onto)) - (if interactive - (magit-rebase-insert-merge-sequence onto) - (magit-rebase-insert-apply-sequence onto)) - (insert ?\n))))) - -(defun magit-rebase--todo () - "Return `git-rebase-action' instances for remaining rebase actions. -These are ordered in that the same way they'll be sorted in the -status buffer (i.e. the reverse of how they will be applied)." - (let ((comment-start (or (magit-get "core.commentChar") "#")) - lines) - (with-temp-buffer - (insert-file-contents (magit-git-dir "rebase-merge/git-rebase-todo")) - (while (not (eobp)) - (let ((ln (git-rebase-current-line))) - (when (oref ln action-type) - (push ln lines))) - (forward-line))) - lines)) - -(defun magit-rebase-insert-merge-sequence (onto) - (dolist (line (magit-rebase--todo)) - (with-slots (action-type action action-options target) line - (pcase action-type - (`commit - (magit-sequence-insert-commit action target 'magit-sequence-pick)) - ((or (or `exec `label) - (and `merge (guard (not action-options)))) - (insert (propertize action 'font-lock-face 'magit-sequence-onto) "\s" - (propertize target 'font-lock-face 'git-rebase-label) "\n")) - (`merge - (if-let ((hash (and (string-match "-[cC] \\([^ ]+\\)" action-options) - (match-string 1 action-options)))) - (magit-insert-section (commit hash) - (magit-insert-heading - (propertize "merge" 'font-lock-face 'magit-sequence-pick) - "\s" - (magit-format-rev-summary hash) "\n")) - (error "failed to parse merge message hash")))))) - (magit-sequence-insert-sequence - (magit-file-line (magit-git-dir "rebase-merge/stopped-sha")) - onto - (--when-let (magit-file-lines (magit-git-dir "rebase-merge/done")) - (cadr (split-string (car (last it))))))) - -(defun magit-rebase-insert-apply-sequence (onto) - (let ((rewritten - (--map (car (split-string it)) - (magit-file-lines (magit-git-dir "rebase-apply/rewritten")))) - (stop (magit-file-line (magit-git-dir "rebase-apply/original-commit")))) - (dolist (patch (nreverse (cdr (magit-rebase-patches)))) - (let ((hash (cadr (split-string (magit-file-line patch))))) - (unless (or (member hash rewritten) - (equal hash stop)) - (magit-sequence-insert-commit "pick" hash 'magit-sequence-pick))))) - (magit-sequence-insert-sequence - (magit-file-line (magit-git-dir "rebase-apply/original-commit")) - onto)) - -(defun magit-rebase-patches () - (directory-files (magit-git-dir "rebase-apply") t "^[0-9]\\{4\\}$")) - -(defun magit-sequence-insert-sequence (stop onto &optional orig) - (let ((head (magit-rev-parse "HEAD")) done) - (setq onto (if onto (magit-rev-parse onto) head)) - (setq done (magit-git-lines "log" "--format=%H" (concat onto "..HEAD"))) - (when (and stop (not (member (magit-rev-parse stop) done))) - (let ((id (magit-patch-id stop))) - (--if-let (--first (equal (magit-patch-id it) id) done) - (setq stop it) - (cond - ((--first (magit-rev-equal it stop) done) - ;; The commit's testament has been executed. - (magit-sequence-insert-commit "void" stop 'magit-sequence-drop)) - ;; The faith of the commit is still undecided... - ((magit-anything-unmerged-p) - ;; ...and time travel isn't for the faint of heart. - (magit-sequence-insert-commit "join" stop 'magit-sequence-part)) - ((magit-anything-modified-p t) - ;; ...and the dust hasn't settled yet... - (magit-sequence-insert-commit - (let* ((magit--refresh-cache nil) - (staged (magit-commit-tree "oO" nil "HEAD")) - (unstaged (magit-commit-worktree "oO" "--reset"))) - (cond - ;; ...but we could end up at the same tree just by committing. - ((or (magit-rev-equal staged stop) - (magit-rev-equal unstaged stop)) "goal") - ;; ...but the changes are still there, untainted. - ((or (equal (magit-patch-id staged) id) - (equal (magit-patch-id unstaged) id)) "same") - ;; ...and some changes are gone and/or others were added. - (t "work"))) - stop 'magit-sequence-part)) - ;; The commit is definitely gone... - ((--first (magit-rev-equal it stop) done) - ;; ...but all of its changes are still in effect. - (magit-sequence-insert-commit "poof" stop 'magit-sequence-drop)) - (t - ;; ...and some changes are gone and/or other changes were added. - (magit-sequence-insert-commit "gone" stop 'magit-sequence-drop))) - (setq stop nil)))) - (dolist (rev done) - (apply 'magit-sequence-insert-commit - (cond ((equal rev stop) - ;; ...but its reincarnation lives on. - ;; Or it didn't die in the first place. - (list (if (and (equal rev head) - (equal (magit-patch-id rev) - (magit-patch-id orig))) - "stop" ; We haven't done anything yet. - "like") ; There are new commits. - rev (if (equal rev head) - 'magit-sequence-head - 'magit-sequence-stop))) - ((equal rev head) - (list "done" rev 'magit-sequence-head)) - (t - (list "done" rev 'magit-sequence-done))))) - (magit-sequence-insert-commit "onto" onto - (if (equal onto head) - 'magit-sequence-head - 'magit-sequence-onto)))) - -(defun magit-sequence-insert-commit (type hash face) - (magit-insert-section (commit hash) - (magit-insert-heading - (propertize type 'font-lock-face face) "\s" - (magit-format-rev-summary hash) "\n"))) - -;;; _ -(provide 'magit-sequence) -;;; magit-sequence.el ends here diff --git a/elpa/magit-20200418.939/magit-sequence.elc b/elpa/magit-20200418.939/magit-sequence.elc deleted file mode 100644 index db49f77fdf530312a8869616199eb4b942b46526..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52852 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 diff --git a/elpa/magit-20200418.939/magit-stash.el b/elpa/magit-20200418.939/magit-stash.el deleted file mode 100644 index 7ac1b29c..00000000 --- a/elpa/magit-20200418.939/magit-stash.el +++ /dev/null @@ -1,546 +0,0 @@ -;;; magit-stash.el --- stash support for Magit -*- lexical-binding: t -*- - -;; Copyright (C) 2008-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; Support for Git stashes. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) -(require 'magit-reflog) - -;;; Options - -(defgroup magit-stash nil - "List stashes and show stash diffs." - :group 'magit-modes) - -;;;; Diff options - -(defcustom magit-stash-sections-hook - '(magit-insert-stash-notes - magit-insert-stash-worktree - magit-insert-stash-index - magit-insert-stash-untracked) - "Hook run to insert sections into stash diff buffers." - :package-version '(magit . "2.1.0") - :group 'magit-stash - :type 'hook) - -;;;; Log options - -(defcustom magit-stashes-margin - (list (nth 0 magit-log-margin) - (nth 1 magit-log-margin) - 'magit-log-margin-width nil - (nth 4 magit-log-margin)) - "Format of the margin in `magit-stashes-mode' buffers. - -The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH). - -If INIT is non-nil, then the margin is shown initially. -STYLE controls how to format the author or committer date. - It can be one of `age' (to show the age of the commit), - `age-abbreviated' (to abbreviate the time unit to a character), - or a string (suitable for `format-time-string') to show the - actual date. Option `magit-log-margin-show-committer-date' - controls which date is being displayed. -WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. -AUTHOR controls whether the name of the author is also shown by - default. -AUTHOR-WIDTH has to be an integer. When the name of the author - is shown, then this specifies how much space is used to do so." - :package-version '(magit . "2.9.0") - :group 'magit-stash - :group 'magit-margin - :type magit-log-margin--custom-type - :initialize 'magit-custom-initialize-reset - :set-after '(magit-log-margin) - :set (apply-partially #'magit-margin-set-variable 'magit-stashes-mode)) - -;;; Commands - -;;;###autoload (autoload 'magit-stash "magit-stash" nil t) -(define-transient-command magit-stash () - "Stash uncommitted changes." - :man-page "git-stash" - ["Arguments" - ("-u" "Also save untracked files" ("-u" "--include-untracked")) - ("-a" "Also save untracked and ignored files" ("-a" "--all"))] - [["Stash" - ("z" "both" magit-stash-both) - ("i" "index" magit-stash-index) - ("w" "worktree" magit-stash-worktree) - ("x" "keeping index" magit-stash-keep-index)] - ["Snapshot" - ("Z" "both" magit-snapshot-both) - ("I" "index" magit-snapshot-index) - ("W" "worktree" magit-snapshot-worktree) - ("r" "to wip ref" magit-wip-commit)] - ["Use" - ("a" "Apply" magit-stash-apply) - ("p" "Pop" magit-stash-pop) - ("k" "Drop" magit-stash-drop)] - ["Inspect" - ("l" "List" magit-stash-list) - ("v" "Show" magit-stash-show)] - ["Transform" - ("b" "Branch" magit-stash-branch) - ("B" "Branch here" magit-stash-branch-here) - ("f" "Format patch" magit-stash-format-patch)]]) - -(defun magit-stash-arguments () - (transient-args 'magit-stash)) - -;;;###autoload -(defun magit-stash-both (message &optional include-untracked) - "Create a stash of the index and working tree. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'." - (interactive (magit-stash-read-args)) - (magit-stash-save message t t include-untracked t)) - -;;;###autoload -(defun magit-stash-index (message) - "Create a stash of the index only. -Unstaged and untracked changes are not stashed. The stashed -changes are applied in reverse to both the index and the -worktree. This command can fail when the worktree is not clean. -Applying the resulting stash has the inverse effect." - (interactive (list (magit-stash-read-message))) - (magit-stash-save message t nil nil t 'worktree)) - -;;;###autoload -(defun magit-stash-worktree (message &optional include-untracked) - "Create a stash of unstaged changes in the working tree. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'." - (interactive (magit-stash-read-args)) - (magit-stash-save message nil t include-untracked t 'index)) - -;;;###autoload -(defun magit-stash-keep-index (message &optional include-untracked) - "Create a stash of the index and working tree, keeping index intact. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'." - (interactive (magit-stash-read-args)) - (magit-stash-save message t t include-untracked t 'index)) - -(defun magit-stash-read-args () - (list (magit-stash-read-message) - (magit-stash-read-untracked))) - -(defun magit-stash-read-untracked () - (let ((prefix (prefix-numeric-value current-prefix-arg)) - (args (magit-stash-arguments))) - (cond ((or (= prefix 16) (member "--all" args)) 'all) - ((or (= prefix 4) (member "--include-untracked" args)) t)))) - -(defun magit-stash-read-message () - (let* ((default (format "On %s: " - (or (magit-get-current-branch) "(no branch)"))) - (input (magit-read-string "Stash message" default))) - (if (equal input default) - (concat default (magit-rev-format "%h %s")) - input))) - -;;;###autoload -(defun magit-snapshot-both (&optional include-untracked) - "Create a snapshot of the index and working tree. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'." - (interactive (magit-snapshot-read-args)) - (magit-snapshot-save t t include-untracked t)) - -;;;###autoload -(defun magit-snapshot-index () - "Create a snapshot of the index only. -Unstaged and untracked changes are not stashed." - (interactive) - (magit-snapshot-save t nil nil t)) - -;;;###autoload -(defun magit-snapshot-worktree (&optional include-untracked) - "Create a snapshot of unstaged changes in the working tree. -Untracked files are included according to infix arguments. -One prefix argument is equivalent to `--include-untracked' -while two prefix arguments are equivalent to `--all'." - (interactive (magit-snapshot-read-args)) - (magit-snapshot-save nil t include-untracked t)) - -(defun magit-snapshot-read-args () - (list (magit-stash-read-untracked))) - -(defun magit-snapshot-save (index worktree untracked &optional refresh) - (magit-stash-save (concat "WIP on " (magit-stash-summary)) - index worktree untracked refresh t)) - -;;;###autoload -(defun magit-stash-apply (stash) - "Apply a stash to the working tree. -Try to preserve the stash index. If that fails because there -are staged changes, apply without preserving the stash index." - (interactive (list (magit-read-stash "Apply stash"))) - (if (= (magit-call-git "stash" "apply" "--index" stash) 0) - (magit-refresh) - (magit-run-git "stash" "apply" stash))) - -(defun magit-stash-pop (stash) - "Apply a stash to the working tree and remove it from stash list. -Try to preserve the stash index. If that fails because there -are staged changes, apply without preserving the stash index -and forgo removing the stash." - (interactive (list (magit-read-stash "Pop stash"))) - (if (= (magit-call-git "stash" "apply" "--index" stash) 0) - (magit-stash-drop stash) - (magit-run-git "stash" "apply" stash))) - -;;;###autoload -(defun magit-stash-drop (stash) - "Remove a stash from the stash list. -When the region is active offer to drop all contained stashes." - (interactive - (list (--if-let (magit-region-values 'stash) - (magit-confirm 'drop-stashes nil "Drop %i stashes" nil it) - (magit-read-stash "Drop stash")))) - (dolist (stash (if (listp stash) - (nreverse (prog1 stash (setq stash (car stash)))) - (list stash))) - (message "Deleted refs/%s (was %s)" stash - (magit-rev-parse "--short" stash)) - (magit-call-git "rev-parse" stash) - (magit-call-git "reflog" "delete" "--updateref" "--rewrite" stash)) - (when-let ((ref (and (string-match "\\(.+\\)@{[0-9]+}$" stash) - (match-string 1 stash)))) - (unless (string-match "^refs/" ref) - (setq ref (concat "refs/" ref))) - (unless (magit-rev-verify (concat ref "@{0}")) - (magit-run-git "update-ref" "-d" ref))) - (magit-refresh)) - -;;;###autoload -(defun magit-stash-clear (ref) - "Remove all stashes saved in REF's reflog by deleting REF." - (interactive (let ((ref (or (magit-section-value-if 'stashes) "refs/stash"))) - (magit-confirm t (format "Drop all stashes in %s" ref)) - (list ref))) - (magit-run-git "update-ref" "-d" ref)) - -;;;###autoload -(defun magit-stash-branch (stash branch) - "Create and checkout a new BRANCH from STASH." - (interactive (list (magit-read-stash "Branch stash") - (magit-read-string-ns "Branch name"))) - (magit-run-git "stash" "branch" branch stash)) - -;;;###autoload -(defun magit-stash-branch-here (stash branch) - "Create and checkout a new BRANCH and apply STASH. -The branch is created using `magit-branch-and-checkout', using the -current branch or `HEAD' as the start-point." - (interactive (list (magit-read-stash "Branch stash") - (magit-read-string-ns "Branch name"))) - (let ((inhibit-magit-refresh t)) - (magit-branch-and-checkout branch (or (magit-get-current-branch) "HEAD"))) - (magit-stash-apply stash)) - -;;;###autoload -(defun magit-stash-format-patch (stash) - "Create a patch from STASH" - (interactive (list (magit-read-stash "Create patch from stash"))) - (with-temp-file (magit-rev-format "0001-%f.patch" stash) - (magit-git-insert "stash" "show" "-p" stash)) - (magit-refresh)) - -;;; Plumbing - -(defun magit-stash-save (message index worktree untracked - &optional refresh keep noerror ref) - (if (or (and index (magit-staged-files t)) - (and worktree (magit-unstaged-files t)) - (and untracked (magit-untracked-files (eq untracked 'all)))) - (magit-with-toplevel - (magit-stash-store message (or ref "refs/stash") - (magit-stash-create message index worktree untracked)) - (if (eq keep 'worktree) - (with-temp-buffer - (magit-git-insert "diff" "--cached") - (magit-run-git-with-input - "apply" "--reverse" "--cached" "--ignore-space-change" "-") - (magit-run-git-with-input - "apply" "--reverse" "--ignore-space-change" "-")) - (unless (eq keep t) - (if (eq keep 'index) - (magit-call-git "checkout" "--" ".") - (magit-call-git "reset" "--hard" "HEAD" "--")) - (when untracked - (magit-call-git "clean" "--force" "-d" - (and (eq untracked 'all) "-x"))))) - (when refresh - (magit-refresh))) - (unless noerror - (user-error "No %s changes to save" (cond ((not index) "unstaged") - ((not worktree) "staged") - (t "local")))))) - -(defun magit-stash-store (message ref commit) - (magit-update-ref ref message commit t)) - -(defun magit-stash-create (message index worktree untracked) - (unless (magit-rev-parse "--verify" "HEAD") - (error "You do not have the initial commit yet")) - (let ((magit-git-global-arguments (nconc (list "-c" "commit.gpgsign=false") - magit-git-global-arguments)) - (default-directory (magit-toplevel)) - (summary (magit-stash-summary)) - (head "HEAD")) - (when (and worktree (not index)) - (setq head (or (magit-commit-tree "pre-stash index" nil "HEAD") - (error "Cannot save the current index state")))) - (or (setq index (magit-commit-tree (concat "index on " summary) nil head)) - (error "Cannot save the current index state")) - (and untracked - (setq untracked (magit-untracked-files (eq untracked 'all))) - (setq untracked (magit-with-temp-index nil nil - (or (and (magit-update-files untracked) - (magit-commit-tree - (concat "untracked files on " summary))) - (error "Cannot save the untracked files"))))) - (magit-with-temp-index index "-m" - (when worktree - (or (magit-update-files (magit-git-items "diff" "-z" "--name-only" head)) - (error "Cannot save the current worktree state"))) - (or (magit-commit-tree message nil head index untracked) - (error "Cannot save the current worktree state"))))) - -(defun magit-stash-summary () - (concat (or (magit-get-current-branch) "(no branch)") - ": " (magit-rev-format "%h %s"))) - -;;; Sections - -(defvar magit-stashes-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-delete-thing] 'magit-stash-clear) - map) - "Keymap for `stashes' section.") - -(defvar magit-stash-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-stash-show) - (define-key map [remap magit-delete-thing] 'magit-stash-drop) - (define-key map "a" 'magit-stash-apply) - (define-key map "A" 'magit-stash-pop) - map) - "Keymap for `stash' sections.") - -(magit-define-section-jumper magit-jump-to-stashes - "Stashes" stashes "refs/stash") - -(cl-defun magit-insert-stashes (&optional (ref "refs/stash") - (heading "Stashes:")) - "Insert `stashes' section showing reflog for \"refs/stash\". -If optional REF is non-nil, show reflog for that instead. -If optional HEADING is non-nil, use that as section heading -instead of \"Stashes:\"." - (let ((verified (magit-rev-verify ref)) - (autostash - (and (magit-rebase-in-progress-p) - (magit-file-line - (magit-git-dir - (-> (if (file-directory-p (magit-git-dir "rebase-merge")) - "rebase-merge/autostash" - "rebase-apply/autostash"))))))) - (when (or autostash verified) - (magit-insert-section (stashes ref) - (magit-insert-heading heading) - (when autostash - (pcase-let ((`(,author ,date ,msg) - (split-string - (car (magit-git-lines - "show" "-q" "--format=%aN%x00%at%x00%s" - autostash)) - "\0"))) - (magit-insert-section (stash autostash) - (insert (propertize "AUTOSTASH" 'font-lock-face 'magit-hash)) - (insert " " msg "\n") - (save-excursion - (backward-char) - (magit-log-format-margin autostash author date))))) - (if verified - (magit-git-wash (apply-partially 'magit-log-wash-log 'stash) - "reflog" "--format=%gd%x00%aN%x00%at%x00%gs" ref) - (insert ?\n) - (save-excursion - (backward-char) - (magit-make-margin-overlay))))))) - -;;; List Stashes - -;;;###autoload -(defun magit-stash-list () - "List all stashes in a buffer." - (interactive) - (magit-stashes-setup-buffer)) - -(define-derived-mode magit-stashes-mode magit-reflog-mode "Magit Stashes" - "Mode for looking at lists of stashes." - :group 'magit-log - (hack-dir-local-variables-non-file-buffer)) - -(defun magit-stashes-setup-buffer () - (magit-setup-buffer #'magit-stashes-mode nil - (magit-buffer-refname "refs/stash"))) - -(defun magit-stashes-refresh-buffer () - (magit-insert-section (stashesbuf) - (magit-insert-heading (if (equal magit-buffer-refname "refs/stash") - "Stashes:" - (format "Stashes [%s]:" magit-buffer-refname))) - (magit-git-wash (apply-partially 'magit-log-wash-log 'stash) - "reflog" "--format=%gd%x00%aN%x00%at%x00%gs" magit-buffer-refname))) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-stashes-mode)) - magit-buffer-refname) - -(defvar magit--update-stash-buffer nil) - -(defun magit-stashes-maybe-update-stash-buffer (&optional _) - "When moving in the stashes buffer, update the stash buffer. -If there is no stash buffer in the same frame, then do nothing." - (when (derived-mode-p 'magit-stashes-mode) - (magit--maybe-update-stash-buffer))) - -(defun magit--maybe-update-stash-buffer () - (when-let ((stash (magit-section-value-if 'stash)) - (buffer (magit-get-mode-buffer 'magit-stash-mode nil t))) - (if magit--update-stash-buffer - (setq magit--update-stash-buffer (list stash buffer)) - (setq magit--update-stash-buffer (list stash buffer)) - (run-with-idle-timer - magit-update-other-window-delay nil - (let ((args (with-current-buffer buffer - (let ((magit-direct-use-buffer-arguments 'selected)) - (magit-show-commit--arguments))))) - (lambda () - (pcase-let ((`(,stash ,buf) magit--update-stash-buffer)) - (setq magit--update-stash-buffer nil) - (when (buffer-live-p buf) - (let ((magit-display-buffer-noselect t)) - (apply #'magit-stash-show stash args)))) - (setq magit--update-stash-buffer nil))))))) - -;;; Show Stash - -;;;###autoload -(defun magit-stash-show (stash &optional args files) - "Show all diffs of a stash in a buffer." - (interactive (cons (or (and (not current-prefix-arg) - (magit-stash-at-point)) - (magit-read-stash "Show stash")) - (pcase-let ((`(,args ,files) - (magit-diff-arguments 'magit-stash-mode))) - (list (delete "--stat" args) files)))) - (magit-stash-setup-buffer stash args files)) - -(define-derived-mode magit-stash-mode magit-diff-mode "Magit Stash" - "Mode for looking at individual stashes." - :group 'magit-diff - (hack-dir-local-variables-non-file-buffer)) - -(defun magit-stash-setup-buffer (stash args files) - (magit-setup-buffer #'magit-stash-mode nil - (magit-buffer-revision stash) - (magit-buffer-range (format "%s^..%s" stash stash)) - (magit-buffer-diff-args args) - (magit-buffer-diff-files files))) - -(defun magit-stash-refresh-buffer () - (magit-set-header-line-format - (concat (capitalize magit-buffer-revision) " " - (propertize (magit-rev-format "%s" magit-buffer-revision) - 'font-lock-face - (list :weight 'normal :foreground - (face-attribute 'default :foreground))))) - (setq magit-buffer-revision-hash (magit-rev-parse magit-buffer-revision)) - (magit-insert-section (stash) - (magit-run-section-hook 'magit-stash-sections-hook))) - -(cl-defmethod magit-buffer-value (&context (major-mode magit-stash-mode)) - magit-buffer-revision) - -(defun magit-stash-insert-section (commit range message &optional files) - (magit-insert-section (commit commit) - (magit-insert-heading message) - (magit--insert-diff "diff" range "-p" "--no-prefix" magit-buffer-diff-args - "--" (or files magit-buffer-diff-files)))) - -(defun magit-insert-stash-notes () - "Insert section showing notes for a stash. -This shows the notes for stash@{N} but not for the other commits -that make up the stash." - (magit-insert-section section (note) - (magit-insert-heading "Notes") - (magit-git-insert "notes" "show" magit-buffer-revision) - (if (= (point) - (oref section content)) - (magit-cancel-section) - (insert "\n")))) - -(defun magit-insert-stash-index () - "Insert section showing staged changes of the stash." - (magit-stash-insert-section - (format "%s^2" magit-buffer-revision) - (format "%s^..%s^2" magit-buffer-revision magit-buffer-revision) - "Staged")) - -(defun magit-insert-stash-worktree () - "Insert section showing unstaged changes of the stash." - (magit-stash-insert-section - magit-buffer-revision - (format "%s^2..%s" magit-buffer-revision magit-buffer-revision) - "Unstaged")) - -(defun magit-insert-stash-untracked () - "Insert section showing the untracked files commit of the stash." - (let ((stash magit-buffer-revision) - (rev (concat magit-buffer-revision "^3"))) - (when (magit-rev-verify rev) - (magit-stash-insert-section (format "%s^3" stash) - (format "%s^..%s^3" stash stash) - "Untracked files" - (magit-git-items "ls-tree" "-z" "--name-only" - "-r" "--full-tree" rev))))) - -;;; _ -(provide 'magit-stash) -;;; magit-stash.el ends here diff --git a/elpa/magit-20200418.939/magit-stash.elc b/elpa/magit-20200418.939/magit-stash.elc deleted file mode 100644 index 38c33acd97be91de113d0642be730803c96f4fb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35517 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 diff --git a/elpa/magit-20200418.939/magit-status.el b/elpa/magit-20200418.939/magit-status.el deleted file mode 100644 index 90e8980d..00000000 --- a/elpa/magit-20200418.939/magit-status.el +++ /dev/null @@ -1,811 +0,0 @@ -;;; magit-status.el --- the grand overview -*- lexical-binding: t -*- - -;; Copyright (C) 2010-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements the status buffer. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) - -;;; Options - -(defgroup magit-status nil - "Inspect and manipulate Git repositories." - :link '(info-link "(magit)Status Buffer") - :group 'magit-modes) - -(defcustom magit-status-mode-hook nil - "Hook run after entering Magit-Status mode." - :group 'magit-status - :type 'hook) - -(defcustom magit-status-headers-hook - '(magit-insert-error-header - magit-insert-diff-filter-header - magit-insert-head-branch-header - magit-insert-upstream-branch-header - magit-insert-push-branch-header - magit-insert-tags-header) - "Hook run to insert headers into the status buffer. - -This hook is run by `magit-insert-status-headers', which in turn -has to be a member of `magit-status-sections-hook' to be used at -all." - :package-version '(magit . "2.1.0") - :group 'magit-status - :type 'hook - :options '(magit-insert-error-header - magit-insert-diff-filter-header - magit-insert-repo-header - magit-insert-remote-header - magit-insert-head-branch-header - magit-insert-upstream-branch-header - magit-insert-push-branch-header - magit-insert-tags-header)) - -(defcustom magit-status-sections-hook - '(magit-insert-status-headers - magit-insert-merge-log - magit-insert-rebase-sequence - magit-insert-am-sequence - magit-insert-sequencer-sequence - magit-insert-bisect-output - magit-insert-bisect-rest - magit-insert-bisect-log - magit-insert-untracked-files - magit-insert-unstaged-changes - magit-insert-staged-changes - magit-insert-stashes - magit-insert-unpushed-to-pushremote - magit-insert-unpushed-to-upstream-or-recent - magit-insert-unpulled-from-pushremote - magit-insert-unpulled-from-upstream) - "Hook run to insert sections into a status buffer." - :package-version '(magit . "2.12.0") - :group 'magit-status - :type 'hook) - -(defcustom magit-status-initial-section '(1) - "The section point is placed on when a status buffer is created. - -When such a buffer is merely being refreshed or being shown again -after it was merely buried, then this option has no effect. - -If this is nil, then point remains on the very first section as -usual. Otherwise it has to be a list of integers and section -identity lists. The members of that list are tried in order -until a matching section is found. - -An integer means to jump to the nth section, 1 for example -jumps over the headings. To get a section's \"identity list\" -use \\[universal-argument] \\[magit-describe-section-briefly]. - -If, for example, you want to jump to the commits that haven't -been pulled from the upstream, or else the second section, then -use: (((unpulled . \"..@{upstream}\") (status)) 1). - -See option `magit-section-initial-visibility-alist' for how to -control the initial visibility of the jumped to section." - :package-version '(magit . "2.90.0") - :group 'magit-status - :type '(choice (const :tag "as usual" nil) - (repeat (choice (number :tag "nth top-level section") - (sexp :tag "section identity"))))) - -(defcustom magit-status-goto-file-position nil - "Whether to go to position corresponding to file position. - -If this is non-nil and the current buffer is visiting a file, -then `magit-status' tries to go to the position in the status -buffer that corresponds to the position in the file-visiting -buffer. This jumps into either the diff of unstaged changes -or the diff of staged changes. - -If the previously current buffer does not visit a file, or if -the file has neither unstaged nor staged changes then this has -no effect. - -The command `magit-status-here' tries to go to that position, -regardless of the value of this option." - :package-version '(magit . "3.0.0") - :group 'magit-status - :type 'boolean) - -(defcustom magit-status-show-hashes-in-headers nil - "Whether headers in the status buffer show hashes. -The functions which respect this option are -`magit-insert-head-branch-header', -`magit-insert-upstream-branch-header', and -`magit-insert-push-branch-header'." - :package-version '(magit . "2.4.0") - :group 'magit-status - :type 'boolean) - -(defcustom magit-status-margin - (list nil - (nth 1 magit-log-margin) - 'magit-log-margin-width nil - (nth 4 magit-log-margin)) - "Format of the margin in `magit-status-mode' buffers. - -The value has the form (INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH). - -If INIT is non-nil, then the margin is shown initially. -STYLE controls how to format the author or committer date. - It can be one of `age' (to show the age of the commit), - `age-abbreviated' (to abbreviate the time unit to a character), - or a string (suitable for `format-time-string') to show the - actual date. Option `magit-log-margin-show-committer-date' - controls which date is being displayed. -WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. -AUTHOR controls whether the name of the author is also shown by - default. -AUTHOR-WIDTH has to be an integer. When the name of the author - is shown, then this specifies how much space is used to do so." - :package-version '(magit . "2.9.0") - :group 'magit-status - :group 'magit-margin - :type magit-log-margin--custom-type - :initialize 'magit-custom-initialize-reset - :set-after '(magit-log-margin) - :set (apply-partially #'magit-margin-set-variable 'magit-status-mode)) - -;;; Commands - -;;;###autoload -(defun magit-init (directory) - "Initialize a Git repository, then show its status. - -If the directory is below an existing repository, then the user -has to confirm that a new one should be created inside. If the -directory is the root of the existing repository, then the user -has to confirm that it should be reinitialized. - -Non-interactively DIRECTORY is (re-)initialized unconditionally." - (interactive - (let ((directory (file-name-as-directory - (expand-file-name - (read-directory-name "Create repository in: "))))) - (when-let ((toplevel (magit-toplevel directory))) - (setq toplevel (expand-file-name toplevel)) - (unless (y-or-n-p (if (file-equal-p toplevel directory) - (format "Reinitialize existing repository %s? " - directory) - (format "%s is a repository. Create another in %s? " - toplevel directory))) - (user-error "Abort"))) - (list directory))) - ;; `git init' does not understand the meaning of "~"! - (magit-call-git "init" (magit-convert-filename-for-git - (expand-file-name directory))) - (magit-status-setup-buffer directory)) - -;;;###autoload -(defun magit-status (&optional directory cache) - "Show the status of the current Git repository in a buffer. - -If the current directory isn't located within a Git repository, -then prompt for an existing repository or an arbitrary directory, -depending on option `magit-repository-directories', and show the -status of the selected repository instead. - -* If that option specifies any existing repositories, then offer - those for completion and show the status buffer for the - selected one. - -* Otherwise read an arbitrary directory using regular file-name - completion. If the selected directory is the top-level of an - existing working tree, then show the status buffer for that. - -* Otherwise offer to initialize the selected directory as a new - repository. After creating the repository show its status - buffer. - -These fallback behaviors can also be forced using one or more -prefix arguments: - -* With two prefix arguments (or more precisely a numeric prefix - value of 16 or greater) read an arbitrary directory and act on - it as described above. The same could be accomplished using - the command `magit-init'. - -* With a single prefix argument read an existing repository, or - if none can be found based on `magit-repository-directories', - then fall back to the same behavior as with two prefix - arguments." - (interactive - (let ((magit--refresh-cache (list (cons 0 0)))) - (list (and (or current-prefix-arg (not (magit-toplevel))) - (magit-read-repository - (>= (prefix-numeric-value current-prefix-arg) 16))) - magit--refresh-cache))) - (let ((magit--refresh-cache (or cache (list (cons 0 0))))) - (if directory - (let ((toplevel (magit-toplevel directory))) - (setq directory (file-name-as-directory - (expand-file-name directory))) - (if (and toplevel (file-equal-p directory toplevel)) - (magit-status-setup-buffer directory) - (when (y-or-n-p - (if toplevel - (format "%s is a repository. Create another in %s? " - toplevel directory) - (format "Create repository in %s? " directory))) - ;; Creating a new repository invalidates cached values. - (setq magit--refresh-cache nil) - (magit-init directory)))) - (magit-status-setup-buffer default-directory)))) - -(put 'magit-status 'interactive-only 'magit-status-setup-buffer) - -;;;###autoload -(defalias 'magit 'magit-status - "An alias for `magit-status' for better discoverability. - -Instead of invoking this alias for `magit-status' using -\"M-x magit RET\", you should bind a key to `magit-status' -and read the info node `(magit)Getting Started', which -also contains other useful hints.") - -;;;###autoload -(defun magit-status-here () - "Like `magit-status' but with non-nil `magit-status-goto-file-position'." - (interactive) - (let ((magit-status-goto-file-position t)) - (call-interactively #'magit-status))) - -(put 'magit-status-here 'interactive-only 'magit-status-setup-buffer) - -(defvar magit--remotes-using-recent-git nil) - -(defun magit--tramp-asserts (directory) - (when-let ((remote (file-remote-p directory))) - (unless (member remote magit--remotes-using-recent-git) - (if-let ((version (let ((default-directory directory)) - (magit-git-version)))) - (if (version<= magit--minimal-git version) - (push version magit--remotes-using-recent-git) - (display-warning 'magit (format "\ -Magit requires Git >= %s, but on %s the version is %s. - -If multiple Git versions are installed on the host, then the -problem might be that TRAMP uses the wrong executable. - -First check the value of `magit-git-executable'. Its value is -used when running git locally as well as when running it on a -remote host. The default value is \"git\", except on Windows -where an absolute path is used for performance reasons. - -If the value already is just \"git\" but TRAMP never-the-less -doesn't use the correct executable, then consult the info node -`(tramp)Remote programs'.\n" magit--minimal-git remote version) :error)) - (display-warning 'magit (format "\ -Magit cannot find Git on %s. - -First check the value of `magit-git-executable'. Its value is -used when running git locally as well as when running it on a -remote host. The default value is \"git\", except on Windows -where an absolute path is used for performance reasons. - -If the value already is just \"git\" but TRAMP never-the-less -doesn't find the executable, then consult the info node -`(tramp)Remote programs'.\n" remote) :error))))) - -;;; Mode - -(defvar magit-status-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-mode-map) - (define-key map "j" 'magit-status-jump) - (define-key map [remap dired-jump] 'magit-dired-jump) - map) - "Keymap for `magit-status-mode'.") - -(define-transient-command magit-status-jump () - "In a Magit-Status buffer, jump to a section." - ["Jump to" - [("z " "Stashes" magit-jump-to-stashes - :if (lambda () (memq 'magit-insert-stashes magit-status-sections-hook))) - ("t " "Tracked" magit-jump-to-tracked - :if (lambda () (memq 'magit-insert-tracked-files magit-status-sections-hook))) - ("n " "Untracked" magit-jump-to-untracked - :if (lambda () (memq 'magit-insert-untracked-files magit-status-sections-hook))) - ("u " "Unstaged" magit-jump-to-unstaged - :if (lambda () (memq 'magit-insert-unstaged-changes magit-status-sections-hook))) - ("s " "Staged" magit-jump-to-staged - :if (lambda () (memq 'magit-insert-staged-changes magit-status-sections-hook)))] - [("fu" "Unpulled from upstream" magit-jump-to-unpulled-from-upstream - :if (lambda () (memq 'magit-insert-unpulled-from-upstream magit-status-sections-hook))) - ("fp" "Unpulled from pushremote" magit-jump-to-unpulled-from-pushremote - :if (lambda () (memq 'magit-insert-unpulled-from-pushremote magit-status-sections-hook))) - ("pu" "Unpushed to upstream" magit-jump-to-unpushed-to-upstream - :if (lambda () - (or (memq 'magit-insert-unpushed-to-upstream-or-recent magit-status-sections-hook) - (memq 'magit-insert-unpushed-to-upstream magit-status-sections-hook)))) - ("pp" "Unpushed to pushremote" magit-jump-to-unpushed-to-pushremote - :if (lambda () (memq 'magit-insert-unpushed-to-pushremote magit-status-sections-hook))) - ("a " "Assumed unstaged" magit-jump-to-assume-unchanged - :if (lambda () (memq 'magit-insert-assume-unchanged-files magit-status-sections-hook))) - ("w " "Skip worktree" magit-jump-to-skip-worktree - :if (lambda () (memq 'magit-insert-skip-worktree-files magit-status-sections-hook)))]]) - -(define-derived-mode magit-status-mode magit-mode "Magit" - "Mode for looking at Git status. - -This mode is documented in info node `(magit)Status Buffer'. - -\\\ -Type \\[magit-refresh] to refresh the current buffer. -Type \\[magit-section-toggle] to expand or hide the section at point. -Type \\[magit-visit-thing] to visit the change or commit at point. - -Type \\[magit-dispatch] to invoke major commands. - -Staging and applying changes is documented in info node -`(magit)Staging and Unstaging' and info node `(magit)Applying'. - -\\Type \ -\\[magit-apply] to apply the change at point, \ -\\[magit-stage] to stage, -\\[magit-unstage] to unstage, \ -\\[magit-discard] to discard, or \ -\\[magit-reverse] to reverse it. - -\\\ -Type \\[magit-commit] to create a commit. - -\\{magit-status-mode-map}" - :group 'magit-status - (hack-dir-local-variables-non-file-buffer) - (setq imenu-create-index-function - 'magit-imenu--status-create-index-function)) - -(put 'magit-status-mode 'magit-diff-default-arguments - '("--no-ext-diff")) -(put 'magit-status-mode 'magit-log-default-arguments - '("-n256" "--decorate")) - -;;;###autoload -(defun magit-status-setup-buffer (&optional directory) - (unless directory - (setq directory default-directory)) - (magit--tramp-asserts directory) - (let* ((default-directory directory) - (d (magit-diff--get-value 'magit-status-mode)) - (l (magit-log--get-value 'magit-status-mode)) - (file (and magit-status-goto-file-position - (magit-file-relative-name))) - (line (and file (line-number-at-pos))) - (col (and file (current-column))) - (buf (magit-setup-buffer #'magit-status-mode nil - (magit-buffer-diff-args (nth 0 d)) - (magit-buffer-diff-files (nth 1 d)) - (magit-buffer-log-args (nth 0 l)) - (magit-buffer-log-files (nth 1 l))))) - (when file - (with-current-buffer buf - (let ((staged (magit-get-section '((staged) (status))))) - (if (and staged - (cadr (magit-diff--locate-hunk file line staged))) - (magit-diff--goto-position file line col staged) - (let ((unstaged (magit-get-section '((unstaged) (status))))) - (unless (and unstaged - (magit-diff--goto-position file line col unstaged)) - (when staged - (magit-diff--goto-position file line col staged)))))))) - buf)) - -(defun magit-status-refresh-buffer () - (magit-git-exit-code "update-index" "--refresh") - (magit-insert-section (status) - (magit-run-section-hook 'magit-status-sections-hook))) - -(defun magit-status-goto-initial-section () - "In a `magit-status-mode' buffer, jump `magit-status-initial-section'. -Actually doing so is deferred until `magit-refresh-buffer-hook' -runs `magit-status-goto-initial-section-1'. That function then -removes itself from the hook, so that this only happens when the -status buffer is first created." - (when (and magit-status-initial-section - (derived-mode-p 'magit-status-mode)) - (add-hook 'magit-refresh-buffer-hook - 'magit-status-goto-initial-section-1 nil t))) - -(defun magit-status-goto-initial-section-1 () - "In a `magit-status-mode' buffer, jump `magit-status-initial-section'. -This function removes itself from `magit-refresh-buffer-hook'." - (when-let ((section - (--some (if (integerp it) - (nth (1- it) - (magit-section-siblings (magit-current-section) - 'next)) - (magit-get-section it)) - magit-status-initial-section))) - (goto-char (oref section start)) - (when-let ((vis (cdr (assq 'magit-status-initial-section - magit-section-initial-visibility-alist)))) - (if (eq vis 'hide) - (magit-section-hide section) - (magit-section-show section)))) - (remove-hook 'magit-refresh-buffer-hook - 'magit-status-goto-initial-section-1 t)) - -(defun magit-status-maybe-update-revision-buffer (&optional _) - "When moving in the status buffer, update the revision buffer. -If there is no revision buffer in the same frame, then do nothing." - (when (derived-mode-p 'magit-status-mode) - (magit--maybe-update-revision-buffer))) - -(defun magit-status-maybe-update-stash-buffer (&optional _) - "When moving in the status buffer, update the stash buffer. -If there is no stash buffer in the same frame, then do nothing." - (when (derived-mode-p 'magit-status-mode) - (magit--maybe-update-stash-buffer))) - -(defun magit-status-maybe-update-blob-buffer (&optional _) - "When moving in the status buffer, update the blob buffer. -If there is no blob buffer in the same frame, then do nothing." - (when (derived-mode-p 'magit-status-mode) - (magit--maybe-update-blob-buffer))) - -;;; Sections -;;;; Special Headers - -(defun magit-insert-status-headers () - "Insert header sections appropriate for `magit-status-mode' buffers. -The sections are inserted by running the functions on the hook -`magit-status-headers-hook'." - (if (magit-rev-verify "HEAD") - (magit-insert-headers 'magit-status-headers-hook) - (insert "In the beginning there was darkness\n\n"))) - -(defvar magit-error-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-process-buffer) - map) - "Keymap for `error' sections.") - -(defun magit-insert-error-header () - "Insert the message about the Git error that just occurred. - -This function is only aware of the last error that occur when Git -was run for side-effects. If, for example, an error occurs while -generating a diff, then that error won't be inserted. Refreshing -the status buffer causes this section to disappear again." - (when magit-this-error - (magit-insert-section (error 'git) - (insert (propertize (format "%-10s" "GitError! ") - 'font-lock-face 'magit-section-heading)) - (insert (propertize magit-this-error - 'font-lock-face 'font-lock-warning-face)) - (when-let ((key (car (where-is-internal 'magit-process-buffer)))) - (insert (format " [Type `%s' for details]" (key-description key)))) - (insert ?\n)) - (setq magit-this-error nil))) - -(defun magit-insert-diff-filter-header () - "Insert a header line showing the effective diff filters." - (let ((ignore-modules (magit-ignore-submodules-p))) - (when (or ignore-modules - magit-buffer-diff-files) - (insert (propertize (format "%-10s" "Filter! ") - 'font-lock-face 'magit-section-heading)) - (when ignore-modules - (insert ignore-modules) - (when magit-buffer-diff-files - (insert " -- "))) - (when magit-buffer-diff-files - (insert (mapconcat #'identity magit-buffer-diff-files " "))) - (insert ?\n)))) - -;;;; Reference Headers - -(defun magit-insert-head-branch-header (&optional branch) - "Insert a header line about the current branch. -If `HEAD' is detached, then insert information about that commit -instead. The optional BRANCH argument is for internal use only." - (let ((branch (or branch (magit-get-current-branch))) - (output (magit-rev-format "%h %s" (or branch "HEAD")))) - (string-match "^\\([^ ]+\\) \\(.*\\)" output) - (magit-bind-match-strings (commit summary) output - (when (equal summary "") - (setq summary "(no commit message)")) - (if branch - (magit-insert-section (branch branch) - (insert (format "%-10s" "Head: ")) - (when magit-status-show-hashes-in-headers - (insert (propertize commit 'font-lock-face 'magit-hash) ?\s)) - (insert (propertize branch 'font-lock-face 'magit-branch-local)) - (insert ?\s) - (insert (funcall magit-log-format-message-function branch summary)) - (insert ?\n)) - (magit-insert-section (commit commit) - (insert (format "%-10s" "Head: ")) - (insert (propertize commit 'font-lock-face 'magit-hash)) - (insert ?\s) - (insert (funcall magit-log-format-message-function nil summary)) - (insert ?\n)))))) - -(defun magit-insert-upstream-branch-header (&optional branch upstream keyword) - "Insert a header line about the upstream of the current branch. -If no branch is checked out, then insert nothing. The optional -arguments are for internal use only." - (when-let ((branch (or branch (magit-get-current-branch)))) - (let ((remote (magit-get "branch" branch "remote")) - (merge (magit-get "branch" branch "merge")) - (rebase (magit-get "branch" branch "rebase"))) - (when (or remote merge) - (unless upstream - (setq upstream (magit-get-upstream-branch branch))) - (magit-insert-section (branch upstream) - (pcase rebase - ("true") - ("false" (setq rebase nil)) - (_ (setq rebase (magit-get-boolean "pull.rebase")))) - (insert (format "%-10s" (or keyword (if rebase "Rebase: " "Merge: ")))) - (insert - (if upstream - (concat (and magit-status-show-hashes-in-headers - (concat (propertize (magit-rev-format "%h" upstream) - 'font-lock-face 'magit-hash) - " ")) - upstream " " - (funcall magit-log-format-message-function upstream - (funcall magit-log-format-message-function nil - (or (magit-rev-format "%s" upstream) - "(no commit message)")))) - (cond - ((magit--unnamed-upstream-p remote merge) - (concat (propertize merge 'font-lock-face 'magit-branch-remote) - " from " - (propertize remote 'font-lock-face 'bold))) - ((magit--valid-upstream-p remote merge) - (if (equal remote ".") - (concat - (propertize merge 'font-lock-face 'magit-branch-local) - (propertize " does not exist" - 'font-lock-face 'font-lock-warning-face)) - (concat - (propertize merge 'font-lock-face 'magit-branch-remote) - (propertize " does not exist on " - 'font-lock-face 'font-lock-warning-face) - (propertize remote 'font-lock-face 'magit-branch-remote)))) - (t - (propertize "invalid upstream configuration" - 'font-lock-face 'font-lock-warning-face))))) - (insert ?\n)))))) - -(defun magit-insert-push-branch-header () - "Insert a header line about the branch the current branch is pushed to." - (when-let ((branch (magit-get-current-branch)) - (target (magit-get-push-branch branch))) - (magit-insert-section (branch target) - (insert (format "%-10s" "Push: ")) - (insert - (if (magit-rev-verify target) - (concat target " " - (and magit-status-show-hashes-in-headers - (concat (propertize (magit-rev-format "%h" target) - 'font-lock-face 'magit-hash) - " ")) - (funcall magit-log-format-message-function target - (funcall magit-log-format-message-function nil - (or (magit-rev-format "%s" target) - "(no commit message)")))) - (let ((remote (magit-get-push-remote branch))) - (if (magit-remote-p remote) - (concat target - (propertize " does not exist" - 'font-lock-face 'font-lock-warning-face)) - (concat remote - (propertize " remote does not exist" - 'font-lock-face 'font-lock-warning-face)))))) - (insert ?\n)))) - -(defun magit-insert-tags-header () - "Insert a header line about the current and/or next tag." - (let* ((this-tag (magit-get-current-tag nil t)) - (next-tag (magit-get-next-tag nil t)) - (this-cnt (cadr this-tag)) - (next-cnt (cadr next-tag)) - (this-tag (car this-tag)) - (next-tag (car next-tag)) - (both-tags (and this-tag next-tag t))) - (when (or this-tag next-tag) - (magit-insert-section (tag (or this-tag next-tag)) - (insert (format "%-10s" (if both-tags "Tags: " "Tag: "))) - (cl-flet ((insert-count - (tag count face) - (insert (concat (propertize tag 'font-lock-face 'magit-tag) - (and (> count 0) - (format " (%s)" - (propertize - (format "%s" count) - 'font-lock-face face))))))) - (when this-tag (insert-count this-tag this-cnt 'magit-branch-local)) - (when both-tags (insert ", ")) - (when next-tag (insert-count next-tag next-cnt 'magit-tag))) - (insert ?\n))))) - -;;;; Auxiliary Headers - -(defun magit-insert-user-header () - "Insert a header line about the current user." - (let ((name (magit-get "user.name")) - (email (magit-get "user.email"))) - (when (and name email) - (magit-insert-section (user name) - (insert (format "%-10s" "User: ")) - (insert (propertize name 'font-lock-face 'magit-log-author)) - (insert " <" email ">\n"))))) - -(defun magit-insert-repo-header () - "Insert a header line showing the path to the repository top-level." - (let ((topdir (magit-toplevel))) - (magit-insert-section (repo topdir) - (insert (format "%-10s%s\n" "Repo: " (abbreviate-file-name topdir)))))) - -(defun magit-insert-remote-header () - "Insert a header line about the remote of the current branch. - -If no remote is configured for the current branch, then fall back -showing the \"origin\" remote, or if that does not exist the first -remote in alphabetic order." - (when-let ((name (magit-get-some-remote)) - ;; Under certain configurations it's possible for url - ;; to be nil, when name is not, see #2858. - (url (magit-get "remote" name "url"))) - (magit-insert-section (remote name) - (insert (format "%-10s" "Remote: ")) - (insert (propertize name 'font-lock-face 'magit-branch-remote) ?\s) - (insert url ?\n)))) - -;;;; File Sections - -(defvar magit-untracked-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-delete-thing] 'magit-discard) - (define-key map "s" 'magit-stage) - map) - "Keymap for the `untracked' section.") - -(magit-define-section-jumper magit-jump-to-untracked "Untracked files" untracked) - -(defun magit-insert-untracked-files () - "Maybe insert a list or tree of untracked files. - -Do so depending on the value of `status.showUntrackedFiles'. -Note that even if the value is `all', Magit still initially -only shows directories. But the directory sections can then -be expanded using \"TAB\". - -If the first element of `magit-buffer-diff-files' is a -directory, then limit the list to files below that. The value -value of that variable can be set using \"D -- DIRECTORY RET g\"." - (let* ((show (or (magit-get "status.showUntrackedFiles") "normal")) - (base (car magit-buffer-diff-files)) - (base (and base (file-directory-p base) base))) - (unless (equal show "no") - (if (equal show "all") - (when-let ((files (magit-untracked-files nil base))) - (magit-insert-section (untracked) - (magit-insert-heading "Untracked files:") - (magit-insert-files files base) - (insert ?\n))) - (when-let ((files - (--mapcat (and (eq (aref it 0) ??) - (list (substring it 3))) - (magit-git-items "status" "-z" "--porcelain" - (magit-ignore-submodules-p t) - "--" base)))) - (magit-insert-section (untracked) - (magit-insert-heading "Untracked files:") - (dolist (file files) - (magit-insert-section (file file) - (insert (propertize file 'font-lock-face 'magit-filename) ?\n))) - (insert ?\n))))))) - -(magit-define-section-jumper magit-jump-to-tracked "Tracked files" tracked) - -(defun magit-insert-tracked-files () - "Insert a tree of tracked files. - -If the first element of `magit-buffer-diff-files' is a -directory, then limit the list to files below that. The value -value of that variable can be set using \"D -- DIRECTORY RET g\"." - (when-let ((files (magit-list-files))) - (let* ((base (car magit-buffer-diff-files)) - (base (and base (file-directory-p base) base))) - (magit-insert-section (tracked nil t) - (magit-insert-heading "Tracked files:") - (magit-insert-files files base) - (insert ?\n))))) - -(defun magit-insert-ignored-files () - "Insert a tree of ignored files. - -If the first element of `magit-buffer-diff-files' is a -directory, then limit the list to files below that. The value -of that variable can be set using \"D -- DIRECTORY RET g\"." - (when-let ((files (magit-ignored-files))) - (let* ((base (car magit-buffer-diff-files)) - (base (and base (file-directory-p base) base))) - (magit-insert-section (tracked nil t) - (magit-insert-heading "Ignored files:") - (magit-insert-files files base) - (insert ?\n))))) - -(magit-define-section-jumper magit-jump-to-skip-worktree "Skip-worktree files" skip-worktree) - -(defun magit-insert-skip-worktree-files () - "Insert a tree of skip-worktree files. - -If the first element of `magit-buffer-diff-files' is a -directory, then limit the list to files below that. The value -of that variable can be set using \"D -- DIRECTORY RET g\"." - (when-let ((files (magit-skip-worktree-files))) - (let* ((base (car magit-buffer-diff-files)) - (base (and base (file-directory-p base) base))) - (magit-insert-section (skip-worktree nil t) - (magit-insert-heading "Skip-worktree files:") - (magit-insert-files files base) - (insert ?\n))))) - -(magit-define-section-jumper magit-jump-to-assume-unchanged "Assume-unchanged files" assume-unchanged) - -(defun magit-insert-assume-unchanged-files () - "Insert a tree of files that are assumed to be unchanged. - -If the first element of `magit-buffer-diff-files' is a -directory, then limit the list to files below that. The value -of that variable can be set using \"D -- DIRECTORY RET g\"." - (when-let ((files (magit-assume-unchanged-files))) - (let* ((base (car magit-buffer-diff-files)) - (base (and base (file-directory-p base) base))) - (magit-insert-section (assume-unchanged nil t) - (magit-insert-heading "Assume-unchanged files:") - (magit-insert-files files base) - (insert ?\n))))) - -(defun magit-insert-files (files directory) - (while (and files (string-prefix-p (or directory "") (car files))) - (let ((dir (file-name-directory (car files)))) - (if (equal dir directory) - (let ((file (pop files))) - (magit-insert-section (file file) - (insert (propertize file 'font-lock-face 'magit-filename) ?\n))) - (magit-insert-section (file dir t) - (insert (propertize dir 'file 'magit-filename) ?\n) - (magit-insert-heading) - (setq files (magit-insert-files files dir)))))) - files) - -;;; _ -(provide 'magit-status) -;;; magit-status.el ends here diff --git a/elpa/magit-20200418.939/magit-status.elc b/elpa/magit-20200418.939/magit-status.elc deleted file mode 100644 index 1c2ebae4911fd91085d4e3201669bf32629fa71f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59204 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 diff --git a/elpa/magit-20200418.939/magit-submodule.el b/elpa/magit-20200418.939/magit-submodule.el deleted file mode 100644 index 3f201631..00000000 --- a/elpa/magit-20200418.939/magit-submodule.el +++ /dev/null @@ -1,664 +0,0 @@ -;;; magit-submodule.el --- submodule support for Magit -*- lexical-binding: t -*- - -;; Copyright (C) 2011-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file which -;; lists all contributors. If not, see http://magit.vc/authors. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit) - -(defvar x-stretch-cursor) -;;; Options - -(defcustom magit-module-sections-hook - '(magit-insert-modules-overview - magit-insert-modules-unpulled-from-upstream - magit-insert-modules-unpulled-from-pushremote - magit-insert-modules-unpushed-to-upstream - magit-insert-modules-unpushed-to-pushremote) - "Hook run by `magit-insert-modules'. - -That function isn't part of `magit-status-sections-hook's default -value, so you have to add it yourself for this hook to have any -effect." - :package-version '(magit . "2.11.0") - :group 'magit-status - :type 'hook) - -(defcustom magit-module-sections-nested t - "Whether `magit-insert-modules' wraps inserted sections. - -If this is non-nil, then only a single top-level section -is inserted. If it is nil, then all sections listed in -`magit-module-sections-hook' become top-level sections." - :package-version '(magit . "2.11.0") - :group 'magit-status - :type 'boolean) - -(defcustom magit-submodule-list-mode-hook '(hl-line-mode) - "Hook run after entering Magit-Submodule-List mode." - :package-version '(magit . "2.9.0") - :group 'magit-repolist - :type 'hook - :get 'magit-hook-custom-get - :options '(hl-line-mode)) - -(defcustom magit-submodule-list-columns - '(("Path" 25 magit-modulelist-column-path nil) - ("Version" 25 magit-repolist-column-version nil) - ("Branch" 20 magit-repolist-column-branch nil) - ("BU" 3 magit-repolist-column-unpushed-to-upstream ((:right-align t))) - ("BP" 3 magit-repolist-column-unpushed-to-pushremote ((:right-align t))) - ("B" 3 magit-repolist-column-branches ((:right-align t))) - ("S" 3 magit-repolist-column-stashes ((:right-align t)))) - "List of columns displayed by `magit-list-submodules'. - -Each element has the form (HEADER WIDTH FORMAT PROPS). - -HEADER is the string displayed in the header. WIDTH is the width -of the column. FORMAT is a function that is called with one -argument, the repository identification (usually its basename), -and with `default-directory' bound to the toplevel of its working -tree. It has to return a string to be inserted or nil. PROPS is -an alist that supports the keys `:right-align' and `:pad-right'." - :package-version '(magit . "2.8.0") - :group 'magit-repolist-mode - :type `(repeat (list :tag "Column" - (string :tag "Header Label") - (integer :tag "Column Width") - (function :tag "Inserter Function") - (repeat :tag "Properties" - (list (choice :tag "Property" - (const :right-align) - (const :pad-right) - (symbol)) - (sexp :tag "Value")))))) - -(defcustom magit-submodule-remove-trash-gitdirs nil - "Whether `magit-submodule-remove' offers to trash module gitdirs. - -If this is nil, then that command does not offer to do so unless -a prefix argument is used. When this is t, then it does offer to -do so even without a prefix argument. - -In both cases the action still has to be confirmed unless that is -disabled using the option `magit-no-confirm'. Doing the latter -and also setting this variable to t will lead to tears." - :package-version '(magit . "2.90.0") - :group 'magit-commands - :type 'boolean) - -;;; Popup - -;;;###autoload (autoload 'magit-submodule "magit-submodule" nil t) -(define-transient-command magit-submodule () - "Act on a submodule." - :man-page "git-submodule" - ["Arguments" - ("-f" "Force" ("-f" "--force")) - ("-r" "Recursive" "--recursive") - ("-N" "Do not fetch" ("-N" "--no-fetch")) - ("-C" "Checkout tip" "--checkout") - ("-R" "Rebase onto tip" "--rebase") - ("-M" "Merge tip" "--merge") - ("-U" "Use upstream tip" "--remote")] - ["One module actions" - ("a" magit-submodule-add) - ("r" magit-submodule-register) - ("p" magit-submodule-populate) - ("u" magit-submodule-update) - ("s" magit-submodule-synchronize) - ("d" magit-submodule-unpopulate) - ("k" "Remove" magit-submodule-remove)] - ["All modules actions" - ("l" "List all modules" magit-list-submodules) - ("f" "Fetch all modules" magit-fetch-modules)]) - -(defun magit-submodule-arguments (&rest filters) - (--filter (and (member it filters) it) - (transient-args 'magit-submodule))) - -(defclass magit--git-submodule-suffix (transient-suffix) - ()) - -(cl-defmethod transient-format-description ((obj magit--git-submodule-suffix)) - (let ((value (delq nil (mapcar 'transient-infix-value transient--suffixes)))) - (replace-regexp-in-string - "\\[--[^]]+\\]" - (lambda (match) - (format (propertize "[%s]" 'face 'transient-inactive-argument) - (mapconcat (lambda (arg) - (propertize arg 'face - (if (member arg value) - 'transient-argument - 'transient-inactive-argument))) - (save-match-data - (split-string (substring match 1 -1) "|")) - (propertize "|" 'face 'transient-inactive-argument)))) - (cl-call-next-method obj)))) - -;;;###autoload (autoload 'magit-submodule-add "magit-submodule" nil t) -(define-suffix-command magit-submodule-add (url &optional path name args) - "Add the repository at URL as a module. - -Optional PATH is the path to the module relative to the root of -the superproject. If it is nil, then the path is determined -based on the URL. Optional NAME is the name of the module. If -it is nil, then PATH also becomes the name." - :class 'magit--git-submodule-suffix - :description "Add git submodule add [--force]" - (interactive - (magit-with-toplevel - (let* ((url (magit-read-string-ns "Add submodule (remote url)")) - (path (let ((read-file-name-function - (if (or (eq read-file-name-function 'ido-read-file-name) - (advice-function-member-p - 'ido-read-file-name - read-file-name-function)) - ;; The Ido variant doesn't work properly here. - #'read-file-name-default - read-file-name-function))) - (directory-file-name - (file-relative-name - (read-directory-name - "Add submodules at path: " nil nil nil - (and (string-match "\\([^./]+\\)\\(\\.git\\)?$" url) - (match-string 1 url)))))))) - (list url - (directory-file-name path) - (magit-submodule-read-name-for-path path) - (magit-submodule-arguments "--force"))))) - (magit-submodule-add-1 url path name args)) - -(defun magit-submodule-add-1 (url &optional path name args) - (magit-with-toplevel - (magit-submodule--maybe-reuse-gitdir name path) - (magit-run-git-async "submodule" "add" - (and name (list "--name" name)) - args "--" url path) - (set-process-sentinel - magit-this-process - (lambda (process event) - (when (memq (process-status process) '(exit signal)) - (if (> (process-exit-status process) 0) - (magit-process-sentinel process event) - (process-put process 'inhibit-refresh t) - (magit-process-sentinel process event) - (unless (version< (magit-git-version) "2.12.0") - (magit-call-git "submodule" "absorbgitdirs" path)) - (magit-refresh))))))) - -;;;###autoload -(defun magit-submodule-read-name-for-path (path &optional prefer-short) - (let* ((path (directory-file-name (file-relative-name path))) - (name (file-name-nondirectory path))) - (push (if prefer-short path name) minibuffer-history) - (magit-read-string-ns - "Submodule name" nil (cons 'minibuffer-history 2) - (or (--keep (pcase-let ((`(,var ,val) (split-string it "="))) - (and (equal val path) - (cadr (split-string var "\\.")))) - (magit-git-lines "config" "--list" "-f" ".gitmodules")) - (if prefer-short name path))))) - -;;;###autoload (autoload 'magit-submodule-register "magit-submodule" nil t) -(define-suffix-command magit-submodule-register (modules) - "Register MODULES. - -With a prefix argument act on all suitable modules. Otherwise, -if the region selects modules, then act on those. Otherwise, if -there is a module at point, then act on that. Otherwise read a -single module from the user." - ;; This command and the underlying "git submodule init" do NOT - ;; "initialize" modules. They merely "register" modules in the - ;; super-projects $GIT_DIR/config file, the purpose of which is to - ;; allow users to change such values before actually initializing - ;; the modules. - :description "Register git submodule init" - (interactive - (list (magit-module-confirm "Register" 'magit-module-no-worktree-p))) - (magit-with-toplevel - (magit-run-git-async "submodule" "init" "--" modules))) - -;;;###autoload (autoload 'magit-submodule-populate "magit-submodule" nil t) -(define-suffix-command magit-submodule-populate (modules) - "Create MODULES working directories, checking out the recorded commits. - -With a prefix argument act on all suitable modules. Otherwise, -if the region selects modules, then act on those. Otherwise, if -there is a module at point, then act on that. Otherwise read a -single module from the user." - ;; This is the command that actually "initializes" modules. - ;; A module is initialized when it has a working directory, - ;; a gitlink, and a .gitmodules entry. - :description "Populate git submodule update --init" - (interactive - (list (magit-module-confirm "Populate" 'magit-module-no-worktree-p))) - (magit-with-toplevel - (magit-run-git-async "submodule" "update" "--init" "--" modules))) - -;;;###autoload (autoload 'magit-submodule-update "magit-submodule" nil t) -(define-suffix-command magit-submodule-update (modules args) - "Update MODULES by checking out the recorded commits. - -With a prefix argument act on all suitable modules. Otherwise, -if the region selects modules, then act on those. Otherwise, if -there is a module at point, then act on that. Otherwise read a -single module from the user." - ;; Unlike `git-submodule's `update' command ours can only update - ;; "initialized" modules by checking out other commits but not - ;; "initialize" modules by creating the working directories. - ;; To do the latter we provide the "setup" command. - :class 'magit--git-submodule-suffix - :description "Update git submodule update [--force] [--no-fetch] - [--remote] [--recursive] [--checkout|--rebase|--merge]" - (interactive - (list (magit-module-confirm "Update" 'magit-module-worktree-p) - (magit-submodule-arguments - "--force" "--remote" "--recursive" "--checkout" "--rebase" "--merge" - "--no-fetch"))) - (magit-with-toplevel - (magit-run-git-async "submodule" "update" args "--" modules))) - -;;;###autoload (autoload 'magit-submodule-synchronize "magit-submodule" nil t) -(define-suffix-command magit-submodule-synchronize (modules args) - "Synchronize url configuration of MODULES. - -With a prefix argument act on all suitable modules. Otherwise, -if the region selects modules, then act on those. Otherwise, if -there is a module at point, then act on that. Otherwise read a -single module from the user." - :class 'magit--git-submodule-suffix - :description "Synchronize git submodule sync [--recursive]" - (interactive - (list (magit-module-confirm "Synchronize" 'magit-module-worktree-p) - (magit-submodule-arguments "--recursive"))) - (magit-with-toplevel - (magit-run-git-async "submodule" "sync" args "--" modules))) - -;;;###autoload (autoload 'magit-submodule-unpopulate "magit-submodule" nil t) -(define-suffix-command magit-submodule-unpopulate (modules args) - "Remove working directories of MODULES. - -With a prefix argument act on all suitable modules. Otherwise, -if the region selects modules, then act on those. Otherwise, if -there is a module at point, then act on that. Otherwise read a -single module from the user." - ;; Even though a package is "uninitialized" (it has no worktree) - ;; the super-projects $GIT_DIR/config may never-the-less set the - ;; module's url. This may happen if you `deinit' and then `init' - ;; to register (NOT initialize). Because the purpose of `deinit' - ;; is to remove the working directory AND to remove the url, this - ;; command does not limit itself to modules that have no working - ;; directory. - :class 'magit--git-submodule-suffix - :description "Unpopulate git submodule deinit [--force]" - (interactive - (list (magit-module-confirm "Unpopulate") - (magit-submodule-arguments "--force"))) - (magit-with-toplevel - (magit-run-git-async "submodule" "deinit" args "--" modules))) - -;;;###autoload -(defun magit-submodule-remove (modules args trash-gitdirs) - "Unregister MODULES and remove their working directories. - -For safety reasons, do not remove the gitdirs and if a module has -uncomitted changes, then do not remove it at all. If a module's -gitdir is located inside the working directory, then move it into -the gitdir of the superproject first. - -With the \"--force\" argument offer to remove dirty working -directories and with a prefix argument offer to delete gitdirs. -Both actions are very dangerous and have to be confirmed. There -are additional safety precautions in place, so you might be able -to recover from making a mistake here, but don't count on it." - (interactive - (list (if-let ((modules (magit-region-values 'magit-module-section t))) - (magit-confirm 'remove-modules nil "Remove %i modules" nil modules) - (list (magit-read-module-path "Remove module"))) - (magit-submodule-arguments "--force") - current-prefix-arg)) - (when (version< (magit-git-version) "2.12.0") - (error "This command requires Git v2.12.0")) - (when magit-submodule-remove-trash-gitdirs - (setq trash-gitdirs t)) - (magit-with-toplevel - (when-let - ((modified - (-filter (lambda (module) - (let ((default-directory (file-name-as-directory - (expand-file-name module)))) - (and (cddr (directory-files default-directory)) - (magit-anything-modified-p)))) - modules))) - (if (member "--force" args) - (if (magit-confirm 'remove-dirty-modules - "Remove dirty module %s" - "Remove %i dirty modules" - t modified) - (dolist (module modified) - (let ((default-directory (file-name-as-directory - (expand-file-name module)))) - (magit-git "stash" "push" - "-m" "backup before removal of this module"))) - (setq modules (cl-set-difference modules modified))) - (if (cdr modified) - (message "Omitting %s modules with uncommitted changes: %s" - (length modified) - (mapconcat #'identity modified ", ")) - (message "Omitting module %s, it has uncommitted changes" - (car modified))) - (setq modules (cl-set-difference modules modified)))) - (when modules - (let ((alist - (and trash-gitdirs - (--map (split-string it "\0") - (magit-git-lines "submodule" "foreach" "-q" - "printf \"$sm_path\\0$name\n\""))))) - (magit-git "submodule" "absorbgitdirs" "--" modules) - (magit-git "submodule" "deinit" args "--" modules) - (magit-git "rm" args "--" modules) - (when (and trash-gitdirs - (magit-confirm 'trash-module-gitdirs - "Trash gitdir of module %s" - "Trash gitdirs of %i modules" - t modules)) - (dolist (module modules) - (if-let ((name (cadr (assoc module alist)))) - ;; Disregard if `magit-delete-by-moving-to-trash' - ;; is nil. Not doing so would be too dangerous. - (delete-directory (magit-git-dir - (convert-standard-filename - (concat "modules/" name))) - t t) - (error "BUG: Weird module name and/or path for %s" module))))) - (magit-refresh)))) - -;;; Sections - -;;;###autoload -(defun magit-insert-modules () - "Insert submodule sections. -Hook `magit-module-sections-hook' controls which module sections -are inserted, and option `magit-module-sections-nested' controls -whether they are wrapped in an additional section." - (when-let ((modules (magit-list-module-paths))) - (if magit-module-sections-nested - (magit-insert-section (modules nil t) - (magit-insert-heading - (format "%s (%s)" - (propertize "Modules" - 'font-lock-face 'magit-section-heading) - (length modules))) - (magit-insert-section-body - (magit--insert-modules))) - (magit--insert-modules)))) - -(defun magit--insert-modules (&optional _section) - (magit-run-section-hook 'magit-module-sections-hook)) - -;;;###autoload -(defun magit-insert-modules-overview () - "Insert sections for all modules. -For each section insert the path and the output of `git describe --tags', -or, failing that, the abbreviated HEAD commit hash." - (when-let ((modules (magit-list-module-paths))) - (magit-insert-section (modules nil t) - (magit-insert-heading - (format "%s (%s)" - (propertize "Modules overview" - 'font-lock-face 'magit-section-heading) - (length modules))) - (magit-insert-section-body - (magit--insert-modules-overview))))) - -(defvar magit-modules-overview-align-numbers t) - -(defun magit--insert-modules-overview (&optional _section) - (magit-with-toplevel - (let* ((modules (magit-list-module-paths)) - (path-format (format "%%-%is " - (min (apply 'max (mapcar 'length modules)) - (/ (window-width) 2)))) - (branch-format (format "%%-%is " (min 25 (/ (window-width) 3))))) - (dolist (module modules) - (let ((default-directory - (expand-file-name (file-name-as-directory module)))) - (magit-insert-section (magit-module-section module t) - (insert (propertize (format path-format module) - 'font-lock-face 'magit-diff-file-heading)) - (if (not (file-exists-p ".git")) - (insert "(unpopulated)") - (insert (format - branch-format - (--if-let (magit-get-current-branch) - (propertize it 'font-lock-face 'magit-branch-local) - (propertize "(detached)" 'font-lock-face 'warning)))) - (--if-let (magit-git-string "describe" "--tags") - (progn (when (and magit-modules-overview-align-numbers - (string-match-p "\\`[0-9]" it)) - (insert ?\s)) - (insert (propertize it 'font-lock-face 'magit-tag))) - (--when-let (magit-rev-format "%h") - (insert (propertize it 'font-lock-face 'magit-hash))))) - (insert ?\n)))))) - (insert ?\n)) - -(defvar magit-modules-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-list-submodules) - map) - "Keymap for `modules' sections.") - -(defvar magit-module-section-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-file-section-map) - (define-key map (kbd "C-j") 'magit-submodule-visit) - (define-key map [C-return] 'magit-submodule-visit) - (define-key map [remap magit-visit-thing] 'magit-submodule-visit) - (define-key map [remap magit-delete-thing] 'magit-submodule-unpopulate) - (define-key map "K" 'magit-file-untrack) - (define-key map "R" 'magit-file-rename) - map) - "Keymap for `module' sections.") - -(defun magit-submodule-visit (module &optional other-window) - "Visit MODULE by calling `magit-status' on it. -Offer to initialize MODULE if it's not checked out yet. -With a prefix argument, visit in another window." - (interactive (list (or (magit-section-value-if 'module) - (magit-read-module-path "Visit module")) - current-prefix-arg)) - (magit-with-toplevel - (let ((path (expand-file-name module))) - (cond - ((file-exists-p (expand-file-name ".git" module)) - (magit-diff-visit-directory path other-window)) - ((y-or-n-p (format "Initialize submodule '%s' first?" module)) - (magit-run-git-async "submodule" "update" "--init" "--" module) - (set-process-sentinel - magit-this-process - (lambda (process event) - (let ((magit-process-raise-error t)) - (magit-process-sentinel process event)) - (when (and (eq (process-status process) 'exit) - (= (process-exit-status process) 0)) - (magit-diff-visit-directory path other-window))))) - ((file-exists-p path) - (dired-jump other-window (concat path "/."))))))) - -;;;###autoload -(defun magit-insert-modules-unpulled-from-upstream () - "Insert sections for modules that haven't been pulled from the upstream. -These sections can be expanded to show the respective commits." - (magit--insert-modules-logs "Modules unpulled from @{upstream}" - 'modules-unpulled-from-upstream - "HEAD..@{upstream}")) - -;;;###autoload -(defun magit-insert-modules-unpulled-from-pushremote () - "Insert sections for modules that haven't been pulled from the push-remote. -These sections can be expanded to show the respective commits." - (magit--insert-modules-logs "Modules unpulled from @{push}" - 'modules-unpulled-from-pushremote - "HEAD..@{push}")) - -;;;###autoload -(defun magit-insert-modules-unpushed-to-upstream () - "Insert sections for modules that haven't been pushed to the upstream. -These sections can be expanded to show the respective commits." - (magit--insert-modules-logs "Modules unmerged into @{upstream}" - 'modules-unpushed-to-upstream - "@{upstream}..HEAD")) - -;;;###autoload -(defun magit-insert-modules-unpushed-to-pushremote () - "Insert sections for modules that haven't been pushed to the push-remote. -These sections can be expanded to show the respective commits." - (magit--insert-modules-logs "Modules unpushed to @{push}" - 'modules-unpushed-to-pushremote - "@{push}..HEAD")) - -(defun magit--insert-modules-logs (heading type range) - "For internal use, don't add to a hook." - (unless (magit-ignore-submodules-p) - (when-let ((modules (magit-list-module-paths))) - (magit-insert-section section ((eval type) nil t) - (string-match "\\`\\(.+\\) \\([^ ]+\\)\\'" heading) - (magit-insert-heading - (propertize (match-string 1 heading) - 'font-lock-face 'magit-section-heading) - " " - (propertize (match-string 2 heading) - 'font-lock-face 'magit-branch-remote) - ":") - (magit-with-toplevel - (dolist (module modules) - (when (magit-module-worktree-p module) - (let ((default-directory - (expand-file-name (file-name-as-directory module)))) - (when (magit-file-accessible-directory-p default-directory) - (magit-insert-section sec (magit-module-section module t) - (magit-insert-heading - (propertize module - 'font-lock-face 'magit-diff-file-heading) - ":") - (magit-git-wash - (apply-partially 'magit-log-wash-log 'module) - "-c" "push.default=current" "log" "--oneline" range) - (when (> (point) - (oref sec content)) - (delete-char -1)))))))) - (if (> (point) - (oref section content)) - (insert ?\n) - (magit-cancel-section)))))) - -;;; List - -;;;###autoload -(defun magit-list-submodules () - "Display a list of the current repository's submodules." - (interactive) - (magit-display-buffer - (or (magit-get-mode-buffer 'magit-submodule-list-mode) - (magit-with-toplevel - (magit-generate-new-buffer 'magit-submodule-list-mode)))) - (magit-submodule-list-mode) - (magit-submodule-list-refresh) - (tabulated-list-print)) - -(defvar magit-submodule-list-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map magit-repolist-mode-map) - map) - "Local keymap for Magit-Submodule-List mode buffers.") - -(define-derived-mode magit-submodule-list-mode tabulated-list-mode "Modules" - "Major mode for browsing a list of Git submodules." - :group 'magit-repolist-mode - (setq-local x-stretch-cursor nil) - (setq tabulated-list-padding 0) - (setq tabulated-list-sort-key (cons "Path" nil)) - (setq tabulated-list-format - (vconcat (mapcar (pcase-lambda (`(,title ,width ,_fn ,props)) - (nconc (list title width t) - (-flatten props))) - magit-submodule-list-columns))) - (tabulated-list-init-header) - (add-hook 'tabulated-list-revert-hook 'magit-submodule-list-refresh nil t) - (setq imenu-prev-index-position-function - #'magit-imenu--submodule-prev-index-position-function) - (setq imenu-extract-index-name-function - #'magit-imenu--submodule-extract-index-name-function)) - -(defun magit-submodule-list-refresh () - (setq tabulated-list-entries - (-keep (lambda (module) - (let ((default-directory - (expand-file-name (file-name-as-directory module)))) - (and (file-exists-p ".git") - (list module - (vconcat - (--map (or (funcall (nth 2 it) module) "") - magit-submodule-list-columns)))))) - (magit-list-module-paths)))) - -(defun magit-modulelist-column-path (path) - "Insert the relative path of the submodule." - path) - -;;; Utilities - -(defun magit-submodule--maybe-reuse-gitdir (name path) - (let ((gitdir - (magit-git-dir (convert-standard-filename (concat "modules/" name))))) - (when (and (file-exists-p gitdir) - (not (file-exists-p path))) - (pcase (read-char-choice - (concat - gitdir " already exists.\n" - "Type [u] to use the existing gitdir and create the working tree\n" - " [r] to rename the existing gitdir and clone again\n" - " [t] to trash the existing gitdir and clone again\n" - " [C-g] to abort ") - '(?u ?r ?t)) - (?u (magit-submodule--restore-worktree (expand-file-name path) gitdir)) - (?r (rename-file gitdir (concat gitdir "-" - (format-time-string "%F-%T")))) - (?t (delete-directory gitdir t t)))))) - -(defun magit-submodule--restore-worktree (worktree gitdir) - (make-directory worktree t) - (with-temp-file (expand-file-name ".git" worktree) - (insert "gitdir: " (file-relative-name gitdir worktree) "\n")) - (let ((default-directory worktree)) - (magit-call-git "reset" "--hard" "HEAD" "--"))) - -;;; _ -(provide 'magit-submodule) -;;; magit-submodule.el ends here diff --git a/elpa/magit-20200418.939/magit-submodule.elc b/elpa/magit-20200418.939/magit-submodule.elc deleted file mode 100644 index e856181092b84b752ef4f021b8f9c2273e2ca845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38439 zcmeI5iGLf%mFG!awv~_lNwOJdlF4|QkYrJbnn5=%NsbfhppIBqDA~@esH{M;DIz8T z1OO$|NoM}_{r+B6bvF(ka=fv3*Z!CgQ1|iby;tw5k5=yA{OR1>+}V#l`Y5{D+wFID zvQ7KZ=|(HN?TumdDjN(ty>65?mui;tx-;62+B-W@uRrSScD`zl$Q~}8walm6onf>^ zE79IC8%CS^-S%#0Biih33`c`b_vP?1xr5;-YHx04n^E3Na&;-aI@QKzk2bo!QMA$P zj@lI78*Rl`Na@DcpWM86FWT5{584|ehIrY!Z+ADNVK3Tfccb+z+Ud2&I`LB(Mp=8X z)5!+WXq$p*&GpL?{6qg~0RQNJXV0EpT;CsM@kVbmiz;iiYL&laVJ%JcCFQTiU!A`O zf6ZIB_-w7!l$#{{Q6iy4LW!jD;X6gWq*>HUTB?_-4u9!Hy)-S?OH2Kwb*o3uR*x3d zU#kACzqMM8_G+|OBfVDp@ZF;Sn#SzMU2CYFn(C{(>Qlb1@lc|kl>4uf6YAA#s#jNE zl&xzVs;72HbK|bID$%n+_LsfRAd7a}FFOFw-f-00jW@H6o%SG$U$qCF_Bs%1x$$mq zb8jb$huMa~alGB@eGzT#bvFd!`d7)(xo1_s9jW!O=qh)*!)!3}Z4Bcc5caB*z4lE{ zJ1gkpO_0V~+Q3MzhqlIo^m@AEk%`dDM^;9l}pjJmxJD3-!HTqT6Ar+-_Kmbv*Dnd4M$+8 z$&DYmrTTn38*PI@W-n9pdeH6}O%c0g0qy+e@o`5~ zprGi0wtjm=TVYH`w{-BB+=9Yt%pSv&gKL6J7{JVm9>xuJL5u;MHao-qPJ17uP#{?Y zo%|#X9hO~bZ)``|PPWUj0PzilBZLumqs6-`*Ke(?MxWoi_4ICZ`_bxy>rbP{tB)Q( zxnu~&XM-73#qnKH(JyS2(zi31qXBrtHRDUa?re^>*SZW?W!#`C<2#{HyTJT#PlkU) zDVdM)g}rXJ)@=`7?rGSD*CK)Muruln_M^@wshzFPhVhKi;@)tNx}=YW(RzEB!7OH% zF4F*PoHh5tQ;c{Ma=xK9z*oIJvY`eVAz0EONk*(zUiSuHfI`-~(AG>y(yv{QVT|?$ zUEx<_MAZN+V!)>nq=xfH4O>Xiszw2uE0kgr9q#q}y#ZaQ+b^>HVf3PWh%QDN^b5$* zW^8Bc;smm~G6Pu|GK>~kp^T+mw9c-L+ApKZO+yVJU_V-yde`C3{rbcCa*RI6lL9Y+N>SRMYw!tiJZ1*}FneV{o?~@Bd zE?ir}A~fa`^Cci@xWBvJ+Yx#hW?%MwJD-XAS3o+XPm&R_Ij^#KG~i&xkO4M+8V9pe zGs$p%hGN&uMOcz8@UKCOS`-z5+lzd|Q}j5eq_*YI#a-=cehsnK)YxWEyvts9CmRY- zqW&P;>UvEUk1ApVyOu^I-?jxYvprrU!wS?!C= z;8rh`+G&rV(C&D)cUXX7HX6B1CYSToI-1Oa(ZDFUlgfo_lAX9(EgcBI(nEH&e(CI@ zPW?^?oOf{oJWABqU5ktv2Uxnp4yXl&b5t;Tfq!@&r8?XCdrsps?pItfbj_%p^Y;~Q z7gcUC?%pw(sEd@pa;cEJcAcLnjjUfaxu z8-tGVPf_K%NAN?Tki~NOA!r-AwRjB-8CBvf81%84w|j$)jKtwKxRm4K%j5^A635Uu zD-s5uPm5WMjsBW1E9`Q}7zUGLSj{%LV6g6FlsksPb;8xFs8e17l zHNF-qS{@Q7F_b#ah(hrr26S_BKsUFujW4wMqfUQf1RFk!>mD-W`l@LAd5 z@D>D`2er`eAzNvWvcp^0JEVoZ{^pVO;foF&!Em2j+o0F&e09ViHV- z;nh`Rn+|E&F+|4&jq4C^2O4nvPB1o&>c_TsXL3aM#W_nL;oF%Sn;6W36b%pGxoJWo z$3KXB$;qI`GMr*3s?VcVw0Q13g0IGvD^+HDD5tZqRXLlrjl|)+XPPKl{31Tfl!r7*#ao*1%=jq(x7jIweKHr3B;(nBM zvQ97FZGV9be5XAein-a;g)xXeXIAvfF*7fYU7H)*ot@3`4wQ1d4q~g#_-tgo^&vtq zhE##e=iajuOPbh^mX?;HwY85u*E(}FmvrSE!53E$P&Ss5iiDz)i@BQ;qv`b{8YES1 z#zT0(;TBgizcQq|bus?2+un&53&?P*c*!{3s3};#QjcyTWoD@DsEc5_xBh4D(UR0! zE0IY-UmUU}7g3HBXXVNLM^9&-l$mp#byiLWp19rbbMv?5)QTYUI&_DhM-30&&1QP# zDDVan(VV!$6RyE=!G+HrEwn}YuL01vG3Xr*Qf-NDH>}|Eh${NSL+L-pE+Wms;CSH}(RW%G%nqIDYo0=g)t&w)VW@0K2$qrj6G0Bs6|O zYUxHI?G&6u z4D;8HoQ_X`rW2<1bY}^%0!Se*mc42t3IwS>NAQj~SCq^N6_Y4VqRQVY$T8BQALO$) z?_N?OnW6KW_v85H!w1o$8^0$@7^K$n806E{`_YF^Bm;hbd>tw8!|M-LG~SuWH^0w| z3m4L@qMI<~@hScb1bC9^rfiJX@2W?uSE_Ig(S&p)jf8$!h1wlsWd7B*h|O7ehi{FK z$*KRVc1s}Kc*hp3_6sG5bxHqy?wy|jvn*yAt~r&~sHNH2JmYFMQfejuW?EIsg@uJn zfJst4A?Qv{Iv5AS7jBD5QU^eEHN8izw9ZHk?}3M;V=N@boLOYDvPp=A=;A;RJnG3M z$ZmbCu-nZT?N8-8E1Ivb=(#D4dpDr!zX!}}JF*N4qU|DlE zxz?2sWmB?36<~bS&PQY@#E-}T$SZl=h^!w}%o7@ALp~HZb+Ja6Am}-FCL~==f2-xGiU8Csq5c^OwSQ4U{O1F>=(b`dZ?K4q_6tP>^NWp+t+>mjWwv-EDO8eidUSh7v*79`f?( zh6G(6I^FHgI(1O?AUW8EJM~5UK`Z@x;);wvyTCWj;#L6A_JUpS$y|Dj!4(jVEWdi%x?$qLd2p>3V5)(t-RQS7~K zJzIWWdv1c2=Mt=NjOO{!8PcUlViWsk{?z=LAHhbZblA8lU{N_vS>^h2;1vA72xS~U z^VkM-`i59y&a{`gOvz)`DwG=&$RMwwn`VCw_L}+i<`Cvo)BfD)oX_fXJL`xuAp4wI z(|Z?`J7+^?QTaTReML*>IfEQ3U^GgM$&;W9iiC|F%}+~kC}SJwu_^Li+JTn9O<$0u zRYd-C!CZBmiLHE00XPKkEqKYvlwc{-mWcJa&`I4=A+|GPBb8Cv$1^Hz}UjWsMnkO){rm^ zW!zCzk2;QZ!sZhWCvarO5~IBiYWKW)TWnQc+j#S+y#|+RmUphtNLHH0M?pmgGr67O zp6S`216Z7V!5p6>Dv(oNhzd~YIh!{-T0vDX^JsB+z;shbODF2gnG1Hl-q-mG6!h8j zy~#5k$39<9gJP)W4UgKDfMt?qv-$Op+GDRf`EDMye7oM@sCn6~KWM?aDZe!$7QT!P zJjz>HVVD9}cL@wS2Qqw@vJ9iB@6V@~@)gRv@heDx8-EQMKc5b&qnKN4aZuC5i)zBo z94(sh?Udx1IT@UBR!?y>8)x1s9n^1-5S9*VI4Xye!XP6`(q^@G*!g7CC4Yfw!RCi= z-8z(5erihCFepzd3p(l9n;dzT)N+O3fp1PqW0)v6(y(8_Ji%w_x@=#)mS5MOU~z$D z>|3JA9#Y-_O}J$X^jMaq-y?;Ch_<6@ZzQ7d%NwK=Gx0+%rI5TL0MYZcZm2Z&FGU=P zVyB_6-tNeL1rYt4G6bM}G4RagA72Ccl#CPL7Vym)LM=7IQVDb za5VFzu+<0yctc#1?-{Jyx5c}cH}wsWMQQR8a%`#lwmL8O&}WG8Mkx6IJ6r!XFhqGx zIqBmVLi;p+&I7;yHBNG2A@rR%$eY<4vidnIQE#OO9Ay(Eijz3v6n~lzMHIuGcJpcEH^h?hPz8M+M;l+sY_#t(GJgsbK*3;nEx!k8a*y? z@*>39x%*N#K6>mDm&odrQ6g;i{0o^(S}ZJNKU6x_6XiqF>Q-&sr^6 z7kE)>#1}K&<36?}Igc62EFcrAzReA+_CHMaBjL9s>eZYPT&p!|COMMc9{Fa1aNMNr zs`OVXB{k&T&R}D0O}|Te8L958t!*K$yOomg0)eGFDm=JQ7r&Q1jp zdQ!b4xxQ2H(@OO6qHZ76~?JWr@7v&|0$CVtZY%Mu)hfmtB)lkpX>gSxY zhz9mTk;aK-n-#^!8ceDuX^N$)w@hszZ2|f~b5)m{x?I%jtcsk{>x{gPhC=#0{Zz7Q zHqX3m(VeA5TEy_=ckei-f(kp>oN(rv7Bn75i)I!BQN`j*1S4?o=0A+?fT~^v zeOqv~$qhSXT7inZEGA{fDL`oEEN?Gd7XUSWsCB5@%ruwjVHWC{_ON7Lf*qKQ>+;;3 z1ngT{(AMI%jt;l`QWnX$K;o>A*k6`y-WbW9e_06?_|vVY$5$SAs^`&uuxpln!H~7X zs9tn^0bOFqxX{snz_u=roP4D5;q!34gJscK%FmTHMlhN;PV}x(NL*epD|4Qt z%&Kx3dzVVyRK5V0xEYPPhOqG~bW&B&Ao?6oodNQgQCDS-O)2fvJruCdr!{Rk z*fSn23I4lUs=x5j$E|&|6|Ggy4|o5UtU=b+s^_J)WAiKIx5w4M0041HRUhb=|9_tbnE-A}E2K6|Q{^M=X<5L`YBiD7k*s4PZDOQ4+ZxY9%?Ihm#+?{2mS z4#drJq~aU;HT~T9^v<>Db6B9w(7hGmNcd5J}_WXTX=iLZ#OLGukIVPMGHk;+A(i9UPYT$uSWOG z-M6G@3V|V(&RU$07p`C5WyrMP4Hvcbqd{+n^SIr?&B7JRLrWOH1Q%(+EiN0&Hts+= z*{F-9Q8at@wGW>GyGY0j(1!wM^o=*AxiMZ0H6UEs(hTnmH-a1!hCmGxlp7fo^{&ku zyQAIJ2?rRUZLmRRlj4eDrKk$;z}7TH2%7vZ>=mn+9a7o|bL}KniOVV?vgbG-3F_qy zfyw0@MlG_ubry_}`6M!0-~I4y{>4G0#Oai{D#sg<*^)V>*)YugfNzceNhgk@Idf*= z2S%IC6f;x0_%;|PAuLr95wF$YGq#FyB+C+~R(BKr%BCs1XajvszSL);lB}4SH-rz* zIVH)w286|>jFq~-<2xn!{_e?t`L~~cuuRRS1|cLmn@xgQX`DNA=FT}f*9ojQ-&3v9 zB;an0)v|S}vri3*mD!+1{meUNCn~lErmNBPKDWljq}923?K_O3tTjB#<9ll+S^>wo zs8{lvHMPNng*e2LX?vPtL@^8FTSH}_s)lzYCEzya}LMcmZRC?yEJnICD zQF~|p#P79gzo6xotf5Hz$^3jN&Gw~1K6^p3jK*9K8r`}E_Tu#Cs`f-p)L*bfjzqCP zz+J0Rq}1=LNb?25P7-X*j0L6PYOTm;LvdVU^Wjx43VD+sJ@(Nxm< z;5rSq<`<09`)`uOs%!1iYI0*v>sC!0b9fp{uABnH*6ZigS@l;QtOTi?NY%VG z$8ME)#@QIdBh(N_$h>S6vjnd#hrK)s@YpNHI#t;FfXv>`rkPo~s-ceLSDp4w{Him= zxC>kE{jnZYBlPdvHODnSV4>=Qd+{DizMSuYpa%*y1gReWCGu>n5zU7^g}mXW>gXev zZKIOcoTq_&B(A}C5m%`%8wQN}245)FgP)^wYQhi#Hm5@{wXPyJ8TyXJM46XZ%q6n} z1GcwOG8+sN7h6`Ew8dDWrQn4_z?_MBhl<8~d3PlE9M}%$m+dgMHzs8ftI3WQ;7P#_gX14m^)u!&|Yk6PArW;FrTHj?YjaHnlbBC^0^QV0|gRyu894Y`T!Z z$nZJMH!JWG6Oe4X;hOb1&H>HI4YYL*9Q<^kkajqT0wI9O5TbbaV1MMABa?VVErElU zP$wf2O2svQArI3A^42RX@GB7x0F`5`01 za&jVNe7Oh(FcB~<02;BIj2oK(unjot^1>?km`=T|5Z`?9>75Q9WXYA<)rK=>%e}S= zTgWFXH=o{n^l+9L?kvtta<;jh6uj$tOH?VQAP%90<6<8uM8y0_I#n$?_% zb7zLgig3~;pV}o8FzTiecryw20B;lS85=2inuKx~hscDLd%z3b=$tne;;T3&-pugg z<+Hs3p&8pCK#rlJpO_>N>DKxnd(|>TVd9qj%F$;(nPGiBG{TC#q z%#S$>QO;NTvpG=|_%_dv@q3CN6JwLqPT~f(OqHg%mx3RYd2lsN4&cY$Ih-B)#Co4# zjk+}0_)OGJTtEUprkk6FNk*-$j1n)C{0b`Op5Hn$7epmi4$i*t--h4clZ*^#3(kuq6G?v0x`X3-&&X5?HYJ zJPYR191F&Gw(?LG?17pnvtXB}Sg_kFGK&Q(GG?=2ACy?IwJqbpUeFdi*m8*n+b5~S zgI)JL7`#}S2P-Ad=D`X%U5=g1(fC_ut0pMm1oHo$=@N-6i24Lgbl!>o=a{Z2VDfL2 z`^xFV_iWfCtMzTNVS#HoiqT@%0!x)vuUu`Ky&TLYk-$87dM-QPXBTiX?(WGe5?``0 z$N8_rg5@ojc(I(vsGaAw>WrXU5%?6^EuqJ_a~3yxb0x?2S}2!WYvWI(7-xZJ8`??kQJ%DHNPG%jin&Bgad?jBrzCB!!GgH|G>tk=(G;hLbTlc~355 zdPWf!OSzCSJrhsk^;&#sFf76-n}De%0au}*DhZfSdx=p&U*rW$sQ664#2my&DWGz_ zF)m}GhD1trInvN5td1`44e?oZsk6q!O!X$o4KG(?k!X|-$N8JQb5v_4*f~Pd)I!7- zBu#wJB~6Vq{V{7G#TcGqI;D%D#viELHa zMm3-@Nd%;(nyK-RDr3ofu`>KCr*sL&D!#9#^k!@$LL!#Paf1uW zpOEuxC{nF+O=4Y>^MW&G=j2VRb1&?`Rp=EtW=jGz#`2_;Y|vsOcseIJS}LE-LXIX_ zDsriN-(0@50A+C+ha@erb55d`1HuP4)$6D1fQi+9L^sB)yDi{?q46c3+iIy@q;l1y zlsv`KHBU^a%g?jj&E_d<{*u->`J+T_Hp~JvOdv9?;dB@C?-*a0>v7%arWwIpXmlaI zfaVeHmJcl>DWm#WIiZ@esC+)CPpab+x0yS^O5zmMc0M$= z+bs7(fsWM_9R#>7!J+t z6%c|qP_0|+xU_LKy?V)_(Ihh_b>y4^5|k`?a!PPq%m#%lM2^YGN1PAHuA(57QsAd1 zQecwDQ&c@zF}ZdeQ(tb!$pfbsPRHHQOL_H8_CLO!60*Cc4Qi#*3S+htj&{C|ChH$X z&u(JkpjhL$a~!x2V>#XqV{D6xRtuaLRXz!w+62(<5JC70Ont_Z5rJb`Qr^^NQcrDD zlPg!E&jb(N$lqLr5GV^7zVP_NLM9M7yNdoL>dCUm16#VGX)4Rka`260(TaP}UC6O z*#Mmbql3)ma3*Q1+k7L$4q;#cgw{b(`}bqw{t!Pp*UsH@DpP?%zW&k03&V@f7Wj7o z8V`v!;(Xj7uHLUwU*0U>NbTp^N*7ZEqfzZA_Xf66m)wT!XiEu6_0y1`ORzcZy9@1s ziagjAiyks)7=Ezm~Rt+ z(~oN?6|+pT9mIo;Fv~VVF9jG8Tl(q_i+!iV3S@aK(!6KR{8-SR&wR2eXtPAb1XF=T zd(tclGodPk3ngf4<$+USW0Y8))AC8-ubQtO-%S z!nXf&);Bzr6M98t>TMjpJ{X&4s$5DqYGs%l1LLWVE2W}KOM+;#u=PNErGCX+Dh0%? ze`tNRb^lZl4l^ym(KoQjYRv)7@?RY^&RpJ7r!24)oUyo9YW~*JY(%%Yt~hHDZpef= zk#mx;uEMUdp>2B~&9i3OrF#$WL{IJYu(ATTZkQ# zXzW2!XYbes7-7J8+O4#Y|}USQ#ZN zi}aZi#*IV%s3gBItJeNZIQUN$JIXkuH}5P%dh_M&e`V{>-ZAnzK3%qnO}B}zWV?*CIf!h4;f!M_2h4d}OQ69@3aK*vhpQ zv@Tmxmt}^c)&$aN6k&A4to$Hkd_uA=TV{&O_Z6phxb3CmibPvY&|L7T(644P%Xc&t zLGe&7f<2FlnCih7VJ%GS)9|W?Q%XRd@AVE$%8+I19P7O5U1gIn(L*g zSg%>dPm78`$#)xMunYIvsx9zo0W&8~I=gO;oJ;m5+!BY_PcM|_GhymF-p6z-1yH`p2xCltG8%%=U@rcyz;Tlci` z>3frJOplLgeKe*zky?dF)Juv;&7&EFr;dDd>We|f;V@+&+5Mkh|SRm208L30L44ZFG>9Ic(3Ak*^xfzT*PasRn4aTox z&F-WTjb?Pqy)MhmO_<6#<09|!X7ok)a-{YJcAI6#J)t4WMFqLE3tq0;wkCSP&%(uoZm-)zWSg#Y^ZYGjN8B1x zURgkoY@u|yH{Cbwv{&ItefYqfX`Tey6W=#)Cnibs2fV_=va#qXGSa8r&FmAm+52=hggkCS^5u9lg|nmBPm zmuO>mC=s*VY!Hk~A5%Pt%6I9=%zK6^FA%SIKU>0!^q^(91qqF>qYC4RcLk?ie5w}s ze>C9L8Nr3zKE?(;T*8vUd*nDIF>9Uz1k+nua1-~M#DS%?oAwIY;rnO6H4Pow`{Jb+ zZgoyJZu@CZx=7Cu5Qy8wuwS-$wx<&Bm_h={gQ?ZzTx(z0XxzaA3Xw`UwWi}z4U@#v zbW&d^H_byjfQu~Ut!YCz6v~?he&o0-So6`vt8a&n1b?n0(+g@2mc+kwlveYO$T7J9 zGfZVc=rEm6Br^>!+DwJXD2|{mf*bfa>SDN zs+X#dgd>8OjoM%OksTYLct*OtyS~{*KaqTVj;O0!@o2Y?7ySUN!LP&NY^=|7$vGZ` za!^+uONH2Lj4X0%rjzpGK=`&dxr-5rk}-QIWi5ZTsLp2V-JP**HK4p zIuho&1Ex`?AKGr{H(}&=U9p!$GzzzoF_bNRzn&p$U4?}FnPsr5T95TX@3p=3TyO<< zumH%h1re0a-YcB$P4e5_H)JDhGz|WA*5Hd71H4F>BSk~97)zkc%Y=*qby<0Sx;H}% zcOASn4j~duz?H_7MZrV}Adz*!sU47{p0dySXE*lxP@H90L>R{B06nQFE7(WKWvY_;^p z`@iHLP$L%Rh>hR-6~+?pUq*6R6~jksWzn(XEmd1y99*xzA4|gc{t}JVsalCbJEfAsVo1pl$GS1cCB=iEcYHHjg(HOGxTqa2PwdhEdE$P-w~60hIkSpq!x| z&~L8SHSMi`xKe(v-s3jd4^3MX1y#H2UvyP>E{A3FTD*;D;aA3Hr?zI4EiXWMnmp4t z3a;Y>L^C`Ux?!ApD5e;L+8*odOFcZH2Ulfi$%`ds2#N0SG2ZWmH#Ec7!+9a74j^4T z(IEgYe$Agc^OjT%BqE=zR#*5)c*Bl}0kU2eBzt%nMe&wBJC8LL9vZok1X0qeio!Fo zPr?eZF8ml41uko{39Ld~_A@my&SQ!4ph2S0ZY zBU5#7h}K*0zM9OliYmHY3svR^;s7XfBX+w~-oVNE^%coZPQ2rkgl#i>w%K6p-gyW2 zj#q+wfO#V~pF=0^iX1Xe*|<0bFX*7ft-)P_#0895U`(9ruo(d_2maBc!{mnnP{s$Y zzzPZ{hy@?-vIda!mKx4c$LzowLQIXwF0KwE7M5S2X<;?+S5i9zKPUtbSL>gXBoxfT zE!}V(TAO@yZYE@fRi15?3HKDFXRxu{l9x%`Y35y{+S0>ii`w|~XGpuW4tHiDMk8QQp)>s;(7iw9P+6Z6{S z$2@8{OMlEkpn2=bEtd6^Z=hRk#ZT~{)Vx{?&(d7+A^Gi{vxC|%pbJtm^+;9`8XNNF zt|~riUd;*gQIv3nII&<_Z2N&vNa_9wbWl^Yyot6{@FSXSJb}^k;w7t73l?p!nuhQ{ zi5afdmc=4C4JxFZ#`MT%nlAi7Efu9x^X00^@g_z8B36KYAox~9c7{_Tc%hYJhxHnV zJTvVwYO}H3<9$QO|gN^fdKL^e5fe5^|X3QrnG#~ z=^)l5IhV?Xyv;1N@OP93D&dJd3jILE|Dcp;Ez5Kqe z@73bvebM24IF}&wR&mEgk9pcr4DUtyaR}aD4?2i0U0gb2$Q*nY56!X7nS1aGo>Gtd gnW2?g+QLi~;B>{Avn?XWdZqY3{`vA8U@o2g- -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Code: - -(require 'magit) - -;;; Commands - -;;;###autoload (autoload 'magit-subtree "magit-subtree" nil t) -(define-transient-command magit-subtree () - "Import or export subtrees." - :man-page "git-subtree" - ["Actions" - ("i" "Import" magit-subtree-import) - ("e" "Export" magit-subtree-export)]) - -;;;###autoload (autoload 'magit-subtree-import "magit-subtree" nil t) -(define-transient-command magit-subtree-import () - "Import subtrees." - :man-page "git-subtree" - ["Arguments" - (magit-subtree:--prefix) - (magit-subtree:--message) - ("-s" "Squash" "--squash")] - ["Actions" - [("a" "Add" magit-subtree-add) - ("c" "Add commit" magit-subtree-add-commit)] - [("m" "Merge" magit-subtree-merge) - ("f" "Pull" magit-subtree-pull)]]) - -;;;###autoload (autoload 'magit-subtree-export "magit-subtree" nil t) -(define-transient-command magit-subtree-export () - "Export subtrees." - :man-page "git-subtree" - ["Arguments" - (magit-subtree:--prefix) - (magit-subtree:--annotate) - (magit-subtree:--branch) - (magit-subtree:--onto) - ("-i" "Ignore joins" "--ignore-joins") - ("-j" "Rejoin" "--rejoin")] - ["Actions" - ("p" "Push" magit-subtree-push) - ("s" "Split" magit-subtree-split)]) - -(define-infix-argument magit-subtree:--prefix () - :description "Prefix" - :class 'transient-option - :shortarg "-P" - :argument "--prefix=" - :reader 'magit-subtree-read-prefix) - -(defun magit-subtree-read-prefix (prompt &optional default _history) - (let* ((insert-default-directory nil) - (topdir (magit-toplevel)) - (prefix (read-directory-name (concat prompt ": ") topdir default))) - (if (file-name-absolute-p prefix) - ;; At least `ido-mode's variant is not compatible. - (if (string-prefix-p topdir prefix) - (file-relative-name prefix topdir) - (user-error "%s isn't inside the repository at %s" prefix topdir)) - prefix))) - -(define-infix-argument magit-subtree:--message () - :description "Message" - :class 'transient-option - :shortarg "-m" - :argument "--message=") - -(define-infix-argument magit-subtree:--annotate () - :description "Annotate" - :class 'transient-option - :key "-a" - :argument "--annotate=") - -(define-infix-argument magit-subtree:--branch () - :description "Branch" - :class 'transient-option - :shortarg "-b" - :argument "--branch=") - -(define-infix-argument magit-subtree:--onto () - :description "Onto" - :class 'transient-option - :key "-o" - :argument "--onto=" - :reader 'magit-transient-read-revision) - -(defun magit-subtree-prefix (transient prompt) - (--if-let (--first (string-prefix-p "--prefix=" it) - (transient-args transient)) - (substring it 9) - (magit-subtree-read-prefix prompt))) - -(defun magit-subtree-arguments (transient) - (--remove (string-prefix-p "--prefix=" it) - (transient-args transient))) - -(defun magit-git-subtree (subcmd prefix &rest args) - (magit-run-git-async "subtree" subcmd (concat "--prefix=" prefix) args)) - -;;;###autoload -(defun magit-subtree-add (prefix repository ref args) - "Add REF from REPOSITORY as a new subtree at PREFIX." - (interactive - (cons (magit-subtree-prefix 'magit-subtree-import "Add subtree") - (let ((remote (magit-read-remote-or-url "From repository"))) - (list remote - (magit-read-refspec "Ref" remote) - (magit-subtree-arguments 'magit-subtree-import))))) - (magit-git-subtree "add" prefix args repository ref)) - -;;;###autoload -(defun magit-subtree-add-commit (prefix commit args) - "Add COMMIT as a new subtree at PREFIX." - (interactive - (list (magit-subtree-prefix 'magit-subtree-import "Add subtree") - (magit-read-string-ns "Commit") - (magit-subtree-arguments 'magit-subtree-import))) - (magit-git-subtree "add" prefix args commit)) - -;;;###autoload -(defun magit-subtree-merge (prefix commit args) - "Merge COMMIT into the PREFIX subtree." - (interactive - (list (magit-subtree-prefix 'magit-subtree-import "Merge into subtree") - (magit-read-string-ns "Commit") - (magit-subtree-arguments 'magit-subtree-import))) - (magit-git-subtree "merge" prefix args commit)) - -;;;###autoload -(defun magit-subtree-pull (prefix repository ref args) - "Pull REF from REPOSITORY into the PREFIX subtree." - (interactive - (cons (magit-subtree-prefix 'magit-subtree-import "Pull into subtree") - (let ((remote (magit-read-remote-or-url "From repository"))) - (list remote - (magit-read-refspec "Ref" remote) - (magit-subtree-arguments 'magit-subtree-import))))) - (magit-git-subtree "pull" prefix args repository ref)) - -;;;###autoload -(defun magit-subtree-push (prefix repository ref args) - "Extract the history of the subtree PREFIX and push it to REF on REPOSITORY." - (interactive (list (magit-subtree-prefix 'magit-subtree-export "Push subtree") - (magit-read-remote-or-url "To repository") - (magit-read-string-ns "To reference") - (magit-subtree-arguments 'magit-subtree-export))) - (magit-git-subtree "push" prefix args repository ref)) - -;;;###autoload -(defun magit-subtree-split (prefix commit args) - "Extract the history of the subtree PREFIX." - (interactive (list (magit-subtree-prefix 'magit-subtree-export "Split subtree") - (magit-read-string-ns "Commit") - (magit-subtree-arguments 'magit-subtree-export))) - (magit-git-subtree "split" prefix args commit)) - -;;; _ -(provide 'magit-subtree) -;;; magit-subtree.el ends here diff --git a/elpa/magit-20200418.939/magit-subtree.elc b/elpa/magit-20200418.939/magit-subtree.elc deleted file mode 100644 index f9555aff4f45747b4ec2c737890ad476eb9c09b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9095 zcmeHNZExbn7EVY~UF8q7x?g%~_64Lm!ZvTos#3Bk+Z(BAP?AcmHu>Pd5WLse)MK)n z`|Iy>#$&Jnv#{+(E44@l&v;(W`#k5ESDl|vzuwx~+JE)x6`h8ovFD4vYIp&4Ms82i zgNURT24pu69QEYA7Z1txeG131H}d}H#&|3b_SM7dp(km8RcIoGr2b>zj=UcA!=8*I zFSwWA<7p&ga{GPJr|B-%;ema)utq<`8bKISFAQQAgD3I8Y@;VIPp(eS&ZswZBexfW z#P8MiZqO$gQqK+OPLLnExlJ@Hl7t)io`@(OVxa9L`$7bN>ca&5+0Xv|ekBrrOuR_Y z%aMEU#nt^vUkqH|bEWPv<>W4ogrM@<8W}fEt%l3`?#8aQ40;&8(7E&TFjKbsq6 zIq0pUQ;|2G#Cein0#F}x=sgHC4E#rmX)p=UhLT}6lM#4PCPv2DXdFf{g%ODl>P|~S z9vC#^+Z;z?;C;yS=#HaaI2y5q9O2s>yZ7K55>ADaTf=uBLy%f|Yh~8yh5lp|Q01sE zWH0hy{_qRqMA0gZDpe}k(Q-0iGAc*^6^~?i2IZ$E%%C@=DyJ#aQ@mEOXz`k2e$9>& zOW~S{)T-6$ZS|Jg#g?Tv{{#cmGrvGPOL^Md+`bGWi|&;ttT3~sc64NFcPO-^qG=-` zC0t}-9>RZbm|C?d=S}eHkBKXX=yf&4WSFK*JJZdk-U?UDxS&=Nh)!m(snQY`lq-C2 z$#50(Ryn6T&&5fB}Ny`(+1I{^CcZ&Paa*|0I<%D ziw$t8(IPP10pIk7g?3vs4fru!n3NA?izoDb5CVt23%!8DTsEM2>XDf~N_Q;^Yl(G$ z`s}=qkn?Wd`7Q--H%Ca6cCJlAGNUlcd=j`B&(qqSs52lXDj#{qc(}lPE`lzeDr0{| z@Ra;C2|cS|&Gams0UH8>wYKqP?|gS-+}O=#2@Qu9!L*{!4Da5FUYvo1UI2{8P- z5^g`!Y06>v{+1e_9e)FDE5wc81}jyB-Bc}F_13OXRtcSBh zz~kxZlSjW@h0$R)5K9!pwEz>kbGDtp_8-v8vP8O;HzV%U;O3UBdUd~iT(<}b)F7bl z<;8jTnqDMCxIX>Zd2{mX&)4*yv#aZi%ipWt7N%8ZW?dLct9huhBkLQs61Ep-7hm;m zX|Igm#x^Hj&dV*_H%le9p_=n8w_4jfs%2Nu;uOiUO1rE9?yxPZs%;FxMMSa5N#4ZA zFH*l=97d1IP!f*gaO{f*;gce5I>JP5jTGjH43%-Krs>{EWGTq&#*}2-T104bS`O}f zWK+ns)MO;-ktw1GDV6bDk|%?gF)}jgAt#K70vnD)=_zvDn4U}HmJX>>ento6v<~Y? zBnssSo6->SZ{=<;{Qi(j3o1G^hKJRA?6tjn!Ch7+$*RoeCG(ENd(P&bFfsIc^ z@>D84(Z~r(RD}hTlb5VIQ;OEmX9A}F(dJZ}S|CrQ%hw9b=DqW7PMrx!YbcW;?%zt4 zYa$yZm#5O`1(Y!LOuox{CR4HiXJ&{=o$ir%@VMTdLK?fFA_%%QMvx3KD%q8{wvW*O-mcXXDb>GL zobJA6kwB~fep5MZD>_{}IO0 zd2{v~y@&)}x}048bhV7PUV+3guidplp@^E}5;RsselF&3IyP^(o#9lq#o3BQ6-764O*I*}9Lf)8*% zGB3QE=_ogWNhnLtXEEAU^PNfYAFmcb{ZzJE@|^WVViW@6hmkpnd@|m!EN4*N(0-xg z$v}<;baW|D&dYBzHSt?&CN9!!Cj=%t}#EeUTJN4U7Xc_86g*+|lAH{0t8 z`>&29N?3&o_-ygSLJ;kI0L0;<8R`l6cYrD;gag&o#*iLT{BD+ugXCd!sC0`8(o9o% zADQ*5kspgbYT=EK0-lxCVB0>l*VCXr2N*0Qr@))_ -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements tag commands. - -;;; Code: - -(require 'magit) - -;;;###autoload (autoload 'magit-tag "magit" nil t) -(define-transient-command magit-tag () - "Create or delete a tag." - :man-page "git-tag" - ["Arguments" - ("-f" "Force" ("-f" "--force")) - ("-a" "Annotate" ("-a" "--annotate")) - ("-s" "Sign" ("-s" "--sign")) - (magit-tag:--local-user)] - [["Create" - ("t" "tag" magit-tag-create) - ("r" "release" magit-tag-release)] - ["Do" - ("k" "delete" magit-tag-delete) - ("p" "prune" magit-tag-prune)]]) - -(defun magit-tag-arguments () - (transient-args 'magit-tag)) - -(define-infix-argument magit-tag:--local-user () - :description "Sign as" - :class 'transient-option - :shortarg "-u" - :argument "--local-user=" - :reader 'magit-read-gpg-secret-key - :history-key 'magit:--gpg-sign) - -;;;###autoload -(defun magit-tag-create (name rev &optional args) - "Create a new tag with the given NAME at REV. -With a prefix argument annotate the tag. -\n(git tag [--annotate] NAME REV)" - (interactive (list (magit-read-tag "Tag name") - (magit-read-branch-or-commit "Place tag on") - (let ((args (magit-tag-arguments))) - (when current-prefix-arg - (cl-pushnew "--annotate" args)) - args))) - (magit-run-git-with-editor "tag" args name rev)) - -;;;###autoload -(defun magit-tag-delete (tags) - "Delete one or more tags. -If the region marks multiple tags (and nothing else), then offer -to delete those, otherwise prompt for a single tag to be deleted, -defaulting to the tag at point. -\n(git tag -d TAGS)" - (interactive (list (--if-let (magit-region-values 'tag) - (magit-confirm t nil "Delete %i tags" nil it) - (magit-read-tag "Delete tag" t)))) - (magit-run-git "tag" "-d" tags)) - -;;;###autoload -(defun magit-tag-prune (tags remote-tags remote) - "Offer to delete tags missing locally from REMOTE, and vice versa." - (interactive - (let* ((remote (magit-read-remote "Prune tags using remote")) - (tags (magit-list-tags)) - (rtags (prog2 (message "Determining remote tags...") - (magit-remote-list-tags remote) - (message "Determining remote tags...done"))) - (ltags (-difference tags rtags)) - (rtags (-difference rtags tags))) - (unless (or ltags rtags) - (message "Same tags exist locally and remotely")) - (unless (magit-confirm t - "Delete %s locally" - "Delete %i tags locally" - 'noabort ltags) - (setq ltags nil)) - (unless (magit-confirm t - "Delete %s from remote" - "Delete %i tags from remote" - 'noabort rtags) - (setq rtags nil)) - (list ltags rtags remote))) - (when tags - (magit-call-git "tag" "-d" tags)) - (when remote-tags - (magit-run-git-async "push" remote (--map (concat ":" it) remote-tags)))) - -(defvar magit-tag-version-regexp-alist - '(("^[-._+ ]?alpha\\.?$" . -3) - ("^[-._+ ]?beta\\.?$" . -2) - ("^[-._+ ]?\\(pre\\|rc\\)\\.?$" . -1)) - "Value to use for `version-regexp-alist' when parsing and sorting versions. -The default value matches some common SemVer pre-release formats. -See also `magit-release-tag-regexp'.") - -(defvar magit-release-tag-regexp "\\`\ -\\(?1:\\(?:v\\(?:ersion\\)?\\|r\\(?:elease\\)?\\)?[-_]?\\)?\ -\\(?2:[0-9]+\\(?:\\.[0-9]+\\)*\ -\\(?:-[a-zA-Z0-9-]+\\(?:\\.[a-zA-Z0-9-]+\\)*\\)?\\)\\'" - "Regexp used to parse release tag names. -The first submatch must match the prefix, if any. -The second submatch must match the version string. -The default value matches SemVer version numbers, including -pre-release versions. - -If this will match versions that are not dot separated numbers, you -also need to set `magit-tag-version-regexp-alist' to recognize them -and give them a sorting order.") - -;;;###autoload -(defun magit-tag-release (tag msg) - "Create an annotated release tag. - -Assume that release tags match `magit-release-tag-regexp'. - -First prompt for the name of the new tag using the highest -existing tag as initial input and leaving it to the user to -increment the desired part of the version string. - -Then prompt for the message of the new tag. Base the proposed -tag message on the message of the highest tag, provided that -that contains the corresponding version string and substituting -the new version string for that. Otherwise propose something -like \"Foo-Bar 1.2.3\", given, for example, a TAG \"v1.2.3\" and a -repository located at something like \"/path/to/foo-bar\". - -Then call \"git tag --annotate --sign -m MSG TAG\" to create the, -tag, regardless of whether these arguments are enabled in the -popup. Finally show the refs buffer to let the user quickly -review the result." - (interactive - (save-match-data - (pcase-let* - ((`(,pver ,ptag ,pmsg) (car (magit--list-releases))) - (tag (read-string "Create release tag: " ptag)) - (ver (and (string-match magit-release-tag-regexp tag) - (match-string 2 tag))) - (msg (cond ((and pver (string-match (regexp-quote pver) pmsg)) - (replace-match ver t t pmsg)) - ((and ptag (string-match (regexp-quote ptag) pmsg)) - (replace-match tag t t pmsg)) - (t (format "%s %s" - (capitalize - (file-name-nondirectory - (directory-file-name (magit-toplevel)))) - ver))))) - (list tag (read-string (format "Message for %S: " tag) msg))))) - (magit-run-git-async "tag" "--annotate" "--sign" "-m" msg tag) - (set-process-sentinel - magit-this-process - (lambda (process event) - (when (memq (process-status process) '(exit signal)) - (magit-process-sentinel process event) - (magit-refs-setup-buffer "HEAD" (magit-show-refs-arguments)))))) - -(defun magit--list-releases () - "Return a list of releases. -The list is ordered, beginning with the highest release. -Each release element has the form (VERSION TAG MESSAGE). -`magit-release-tag-regexp' is used to determine whether -a tag qualifies as a release tag." - (save-match-data - (mapcar - #'cdr - (nreverse - (cl-sort (cl-mapcan - (lambda (line) - (and (string-match " +" line) - (let ((tag (substring line 0 (match-beginning 0))) - (msg (substring line (match-end 0)))) - (and (string-match magit-release-tag-regexp tag) - (let ((ver (match-string 2 tag)) - (version-regexp-alist - magit-tag-version-regexp-alist)) - (list (list (version-to-list ver) - ver tag msg))))))) - ;; Cannot rely on "--sort=-version:refname" because - ;; that gets confused if the version prefix has changed. - (magit-git-lines "tag" "-n")) - ;; The inverse of this function does not exist. - #'version-list-< :key #'car))))) - -;;; _ -(provide 'magit-tag) -;;; magit-tag.el ends here diff --git a/elpa/magit-20200418.939/magit-tag.elc b/elpa/magit-20200418.939/magit-tag.elc deleted file mode 100644 index b64e6a31181b652c5087ca84a938bb884e61573b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7839 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 -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements Magit-specific prefix and suffix classes, -;; and their methods. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'transient) - -(require 'magit-git) -(require 'magit-mode) -(require 'magit-process) - -;;; Classes - -(defclass magit--git-variable (transient-variable) - ((scope :initarg :scope))) - -(defclass magit--git-variable:choices (magit--git-variable) - ((choices :initarg :choices) - (fallback :initarg :fallback :initform nil) - (default :initarg :default :initform nil))) - -(defclass magit--git-variable:urls (magit--git-variable) - ((seturl-arg :initarg :seturl-arg :initform nil))) - -;;; Methods -;;;; Init - -(cl-defmethod transient-init-scope ((obj magit--git-variable)) - (oset obj scope - (cond (transient--prefix - (oref transient--prefix scope)) - ((slot-boundp obj 'scope) - (funcall (oref obj scope) obj))))) - -(cl-defmethod transient-init-value ((obj magit--git-variable)) - (let ((variable (format (oref obj variable) - (oref obj scope)))) - (oset obj variable variable) - (oset obj value - (cond ((oref obj multi-value) - (magit-get-all variable)) - (t - (magit-git-string "config" "--local" variable)))))) - -;;;; Read - -(cl-defmethod transient-infix-read :around ((obj magit--git-variable:urls)) - (mapcar (lambda (url) - (if (string-prefix-p "~" url) - (expand-file-name url) - url)) - (cl-call-next-method obj))) - -(cl-defmethod transient-infix-read ((obj magit--git-variable:choices)) - (let ((choices (oref obj choices))) - (when (functionp choices) - (setq choices (funcall choices))) - (if-let ((value (oref obj value))) - (cadr (member value choices)) - (car choices)))) - -;;;; Readers - -(defun magit-transient-read-person (prompt initial-input history) - (magit-completing-read - prompt - (mapcar (lambda (line) - (save-excursion - (and (string-match "\\`[\s\t]+[0-9]+\t" line) - (list (substring line (match-end 0)))))) - (magit-git-lines "shortlog" "-n" "-s" "-e" "HEAD")) - nil nil initial-input history)) - -(defun magit-transient-read-revision (prompt initial-input history) - (or (magit-completing-read prompt (cons "HEAD" (magit-list-refnames)) - nil nil initial-input history - (or (magit-branch-or-commit-at-point) - (magit-get-current-branch))) - (user-error "Nothing selected"))) - -;;;; Set - -(cl-defmethod transient-infix-set ((obj magit--git-variable) value) - (let ((variable (oref obj variable))) - (oset obj value value) - (if (oref obj multi-value) - (magit-set-all value variable) - (magit-set value variable)) - (magit-refresh) - (unless (or value transient--prefix) - (message "Unset %s" variable)))) - -(cl-defmethod transient-infix-set ((obj magit--git-variable:urls) values) - (let ((previous (oref obj value)) - (seturl (oref obj seturl-arg)) - (remote (oref transient--prefix scope))) - (oset obj value values) - (dolist (v (-difference values previous)) - (magit-call-git "remote" "set-url" seturl "--add" remote v)) - (dolist (v (-difference previous values)) - (magit-call-git "remote" "set-url" seturl "--delete" remote - (concat "^" (regexp-quote v) "$"))) - (magit-refresh))) - -;;;; Draw - -(cl-defmethod transient-format-description ((obj magit--git-variable)) - (or (oref obj description) - (oref obj variable))) - -(cl-defmethod transient-format-value ((obj magit--git-variable)) - (if-let ((value (oref obj value))) - (if (oref obj multi-value) - (if (cdr value) - (mapconcat (lambda (v) - (concat "\n " - (propertize v 'face 'transient-value))) - value "") - (propertize (car value) 'face 'transient-value)) - (propertize (car (split-string value "\n")) - 'face 'transient-value)) - (propertize "unset" 'face 'transient-inactive-value))) - -(cl-defmethod transient-format-value ((obj magit--git-variable:choices)) - (let* ((variable (oref obj variable)) - (choices (oref obj choices)) - (local (magit-git-string "config" "--local" variable)) - (global (magit-git-string "config" "--global" variable)) - (default (oref obj default)) - (fallback (oref obj fallback)) - (fallback (and fallback - (when-let ((val (magit-get fallback))) - (concat fallback ":" val))))) - (when (functionp choices) - (setq choices (funcall choices))) - (concat - (propertize "[" 'face 'transient-inactive-value) - (mapconcat (lambda (choice) - (propertize choice 'face (if (equal choice local) - (if (member choice choices) - 'transient-value - 'font-lock-warning-face) - 'transient-inactive-value))) - (if (and local (not (member local choices))) - (cons local choices) - choices) - (propertize "|" 'face 'transient-inactive-value)) - (and (or global fallback default) - (concat - (propertize "|" 'face 'transient-inactive-value) - (cond (global - (propertize (concat "global:" global) - 'face (cond (local - 'transient-inactive-value) - ((member global choices) - 'transient-value) - (t - 'font-lock-warning-face)))) - (fallback - (propertize fallback - 'face (if local - 'transient-inactive-value - 'transient-value))) - (default - (propertize (concat "default:" default) - 'face (if local - 'transient-inactive-value - 'transient-value)))))) - (propertize "]" 'face 'transient-inactive-value)))) - -;;; _ -(provide 'magit-transient) -;;; magit-transient.el ends here - diff --git a/elpa/magit-20200418.939/magit-transient.elc b/elpa/magit-20200418.939/magit-transient.elc deleted file mode 100644 index 29254b5fa455082de37cd3d549a02e1ff74664d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8360 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 -;; Maintainer: Jonas Bernoulli - -;; Contains code from GNU Emacs https://www.gnu.org/software/emacs, -;; released under the GNU General Public License version 3 or later. - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library defines several utility functions used by several -;; other libraries which cannot depend on one another (because -;; circular dependencies are not good). Luckily most (all) of these -;; functions have very little (nothing) to do with Git, so we not only -;; have to do this, it even makes sense. - -;; Unfortunately there are also some options which are used by several -;; libraries which cannot depend on one another, they are defined here -;; too. - -;;; Code: - -(require 'cl-lib) -(require 'dash) - -(eval-when-compile - (require 'subr-x)) - -(require 'crm) - -(eval-when-compile (require 'ido)) -(declare-function ido-completing-read+ "ido-completing-read+" - (prompt collection &optional predicate - require-match initial-input - hist def inherit-input-method)) -(declare-function Info-get-token "info" (pos start all &optional errorstring)) - -(eval-when-compile (require 'vc-git)) -(declare-function vc-git--run-command-string "vc-git" (file &rest args)) - -(eval-when-compile (require 'which-func)) -(declare-function which-function "which-func" ()) - -(defvar magit-wip-before-change-mode) - -;;; Options - -(defcustom magit-completing-read-function 'magit-builtin-completing-read - "Function to be called when requesting input from the user. - -If you have enabled `ivy-mode' or `helm-mode', then you don't -have to customize this option; `magit-builtin-completing-read' -will work just fine. However, if you use Ido completion, then -you do have to use `magit-ido-completing-read', because Ido is -less well behaved than the former, more modern alternatives. - -If you would like to use Ivy or Helm completion with Magit but -not enable the respective modes globally, then customize this -option to use `ivy-completing-read' or -`helm--completing-read-default'. If you choose to use -`ivy-completing-read', note that the items may always be shown in -alphabetical order, depending on your version of Ivy." - :group 'magit-essentials - :type '(radio (function-item magit-builtin-completing-read) - (function-item magit-ido-completing-read) - (function-item ivy-completing-read) - (function-item helm--completing-read-default) - (function :tag "Other function"))) - -(defcustom magit-dwim-selection - '((magit-stash-apply nil t) - (magit-stash-branch nil t) - (magit-stash-branch-here nil t) - (magit-stash-format-patch nil t) - (magit-stash-drop nil ask) - (magit-stash-pop nil ask) - (forge-browse-dwim nil t) - (forge-browse-commit nil t) - (forge-browse-branch nil t) - (forge-browse-remote nil t) - (forge-browse-issue nil t) - (forge-browse-pullreq nil t) - (forge-edit-topic-title nil t) - (forge-edit-topic-state nil t) - (forge-edit-topic-labels nil t) - (forge-edit-topic-marks nil t) - (forge-edit-topic-assignees nil t) - (forge-edit-topic-review-requests nil t) - (forge-pull-pullreq nil t) - (forge-visit-issue nil t) - (forge-visit-pullreq nil t)) - "When not to offer alternatives and ask for confirmation. - -Many commands by default ask the user to select from a list of -possible candidates. They do so even when there is a thing at -point that they can act on, which is then offered as the default. - -This option can be used to tell certain commands to use the thing -at point instead of asking the user to select a candidate to act -on, with or without confirmation. - -The value has the form ((COMMAND nil|PROMPT DEFAULT)...). - -- COMMAND is the command that should not prompt for a choice. - To have an effect, the command has to use the function - `magit-completing-read' or a utility function which in turn uses - that function. - -- If the command uses `magit-completing-read' multiple times, then - PROMPT can be used to only affect one of these uses. PROMPT, if - non-nil, is a regular expression that is used to match against - the PROMPT argument passed to `magit-completing-read'. - -- DEFAULT specifies how to use the default. If it is t, then - the DEFAULT argument passed to `magit-completing-read' is used - without confirmation. If it is `ask', then the user is given - a chance to abort. DEFAULT can also be nil, in which case the - entry has no effect." - :package-version '(magit . "2.12.0") - :group 'magit-commands - :type '(repeat - (list (symbol :tag "Command") ; It might not be fboundp yet. - (choice (const :tag "for all prompts" nil) - (regexp :tag "for prompts matching regexp")) - (choice (const :tag "offer other choices" nil) - (const :tag "require confirmation" ask) - (const :tag "use default without confirmation" t))))) - -(defconst magit--confirm-actions - '((const reverse) (const discard) - (const rename) (const resurrect) - (const untrack) (const trash) - (const delete) (const abort-rebase) - (const abort-merge) (const merge-dirty) - (const drop-stashes) (const reset-bisect) - (const kill-process) (const delete-unmerged-branch) - (const delete-pr-branch) (const remove-modules) - (const stage-all-changes) (const unstage-all-changes) - (const safe-with-wip))) - -(defcustom magit-no-confirm nil - "A list of symbols for actions Magit should not confirm, or t. - -Many potentially dangerous commands by default ask the user for -confirmation. Each of the below symbols stands for an action -which, when invoked unintentionally or without being fully aware -of the consequences, could lead to tears. In many cases there -are several commands that perform variations of a certain action, -so we don't use the command names but more generic symbols. - -Applying changes: - - `discard' Discarding one or more changes (i.e. hunks or the - complete diff for a file) loses that change, obviously. - - `reverse' Reverting one or more changes can usually be undone - by reverting the reversion. - - `stage-all-changes', `unstage-all-changes' When there are both - staged and unstaged changes, then un-/staging everything would - destroy that distinction. Of course that also applies when - un-/staging a single change, but then less is lost and one does - that so often that having to confirm every time would be - unacceptable. - -Files: - - `delete' When a file that isn't yet tracked by Git is deleted - then it is completely lost, not just the last changes. Very - dangerous. - - `trash' Instead of deleting a file it can also be move to the - system trash. Obviously much less dangerous than deleting it. - - Also see option `magit-delete-by-moving-to-trash'. - - `resurrect' A deleted file can easily be resurrected by - \"deleting\" the deletion, which is done using the same command - that was used to delete the same file in the first place. - - `untrack' Untracking a file can be undone by tracking it again. - - `rename' Renaming a file can easily be undone. - -Sequences: - - `reset-bisect' Aborting (known to Git as \"resetting\") a - bisect operation loses all information collected so far. - - `abort-rebase' Aborting a rebase throws away all already - modified commits, but it's possible to restore those from the - reflog. - - `abort-merge' Aborting a merge throws away all conflict - resolutions which has already been carried out by the user. - - `merge-dirty' Merging with a dirty worktree can make it hard to - go back to the state before the merge was initiated. - -References: - - `delete-unmerged-branch' Once a branch has been deleted it can - only be restored using low-level recovery tools provided by - Git. And even then the reflog is gone. The user always has - to confirm the deletion of a branch by accepting the default - choice (or selecting another branch), but when a branch has - not been merged yet, also make sure the user is aware of that. - - `delete-pr-remote' When deleting a branch that was created from - a pull-request and if no other branches still exist on that - remote, then `magit-branch-delete' offers to delete the remote - as well. This should be safe because it only happens if no - other refs exist in the remotes namespace, and you can recreate - the remote if necessary. - - `drop-stashes' Dropping a stash is dangerous because Git stores - stashes in the reflog. Once a stash is removed, there is no - going back without using low-level recovery tools provided by - Git. When a single stash is dropped, then the user always has - to confirm by accepting the default (or selecting another). - This action only concerns the deletion of multiple stashes at - once. - -Edit published history: - - Without adding these symbols here, you will be warned before - editing commits that have already been pushed to one of the - branches listed in `magit-published-branches'. - - `amend-published' Affects most commands that amend to \"HEAD\". - - `rebase-published' Affects commands that perform interactive - rebases. This includes commands from the commit popup that - modify a commit other than \"HEAD\", namely the various fixup - and squash variants. - - `edit-published' Affects the commands `magit-edit-line-commit' - and `magit-diff-edit-hunk-commit'. These two commands make - it quite easy to accidentally edit a published commit, so you - should think twice before configuring them not to ask for - confirmation. - - To disable confirmation completely, add all three symbols here - or set `magit-published-branches' to nil. - -Removing modules: - - `remove-modules' When you remove the working directory of a - module that does not contain uncommitted changes, then that is - safer than doing so when there are uncommitted changes and/or - when you also remove the gitdir. Still, you don't want to do - that by accident. - - `remove-dirty-modules' When you remove the working directory of - a module that contains uncommitted changes, then those changes - are gone for good. It is better to go to the module, inspect - these changes and only if appropriate discard them manually. - - `trash-module-gitdirs' When you remove the gitdir of a module, - then all unpushed changes are gone for good. It is very easy - to forget that you have some unfinished work on an unpublished - feature branch or even in a stash. - - Actually there are some safety precautions in place, that might - help you out if you make an unwise choice here, but don't count - on it. In case of emergency, stay calm and check the stash and - the `trash-directory' for traces of lost work. - -Various: - - `kill-process' There seldom is a reason to kill a process. - -Global settings: - - Instead of adding all of the above symbols to the value of this - option you can also set it to the atom `t', which has the same - effect as adding all of the above symbols. Doing that most - certainly is a bad idea, especially because other symbols might - be added in the future. So even if you don't want to be asked - for confirmation for any of these actions, you are still better - of adding all of the respective symbols individually. - - When `magit-wip-before-change-mode' is enabled then these actions - can fairly easily be undone: `discard', `reverse', - `stage-all-changes', and `unstage-all-changes'. If and only if - this mode is enabled, then `safe-with-wip' has the same effect - as adding all of these symbols individually." - :package-version '(magit . "2.1.0") - :group 'magit-essentials - :group 'magit-commands - :type `(choice (const :tag "Always require confirmation" nil) - (const :tag "Never require confirmation" t) - (set :tag "Require confirmation except for" - ;; `remove-dirty-modules' and - ;; `trash-module-gitdirs' intentionally - ;; omitted. - ,@magit--confirm-actions))) - -(defcustom magit-slow-confirm '(drop-stashes) - "Whether to ask user \"y or n\" or \"yes or no\" questions. - -When this is nil, then `y-or-n-p' is used when the user has to -confirm a potentially destructive action. When this is t, then -`yes-or-no-p' is used instead. If this is a list of symbols -identifying actions, then `yes-or-no-p' is used for those, -`y-or-no-p' for all others. The list of actions is the same as -for `magit-no-confirm' (which see)." - :package-version '(magit . "2.9.0") - :group 'magit-miscellaneous - :type `(choice (const :tag "Always ask \"yes or no\" questions" t) - (const :tag "Always ask \"y or n\" questions" nil) - (set :tag "Ask \"yes or no\" questions only for" - ,@magit--confirm-actions))) - -(defcustom magit-no-message nil - "A list of messages Magit should not display. - -Magit displays most echo area messages using `message', but a few -are displayed using `magit-message' instead, which takes the same -arguments as the former, FORMAT-STRING and ARGS. `magit-message' -forgoes printing a message if any member of this list is a prefix -of the respective FORMAT-STRING. - -If Magit prints a message which causes you grief, then please -first investigate whether there is another option which can be -used to suppress it. If that is not the case, then ask the Magit -maintainers to start using `magit-message' instead of `message' -in that case. We are not proactively replacing all uses of -`message' with `magit-message', just in case someone *might* find -some of these messages useless. - -Messages which can currently be suppressed using this option are: -* \"Turning on magit-auto-revert-mode...\"" - :package-version '(magit . "2.8.0") - :group 'magit-miscellaneous - :type '(repeat string)) - -(defcustom magit-ellipsis ?… - "Character used to abbreviate text. - -Currently this is used to abbreviate author names in the margin -and in process buffers to elide `magit-git-global-arguments'." - :package-version '(magit . "2.1.0") - :group 'magit-miscellaneous - :type 'character) - -(defcustom magit-update-other-window-delay 0.2 - "Delay before automatically updating the other window. - -When moving around in certain buffers, then certain other -buffers, which are being displayed in another window, may -optionally be updated to display information about the -section at point. - -When holding down a key to move by more than just one section, -then that would update that buffer for each section on the way. -To prevent that, updating the revision buffer is delayed, and -this option controls for how long. For optimal experience you -might have to adjust this delay and/or the keyboard repeat rate -and delay of your graphical environment or operating system." - :package-version '(magit . "2.3.0") - :group 'magit-miscellaneous - :type 'number) - -(defcustom magit-view-git-manual-method 'info - "How links to Git documentation are followed from Magit's Info manuals. - -`info' Follow the link to the node in the `gitman' Info manual - as usual. Unfortunately that manual is not installed by - default on some platforms, and when it is then the nodes - look worse than the actual manpages. - -`man' View the respective man-page using the `man' package. - -`woman' View the respective man-page using the `woman' package." - :package-version '(magit . "2.9.0") - :group 'magit-miscellaneous - :type '(choice (const :tag "view info manual" info) - (const :tag "view manpage using `man'" man) - (const :tag "view manpage using `woman'" woman))) - -;;; User Input - -(defvar helm-completion-in-region-default-sort-fn) -(defvar ivy-sort-functions-alist) - -(defvar magit-completing-read--silent-default nil) - -(defun magit-completing-read (prompt collection &optional - predicate require-match initial-input - hist def fallback) - "Read a choice in the minibuffer, or use the default choice. - -This is the function that Magit commands use when they need the -user to select a single thing to act on. The arguments have the -same meaning as for `completing-read', except for FALLBACK, which -is unique to this function and is described below. - -Instead of asking the user to choose from a list of possible -candidates, this function may instead just return the default -specified by DEF, with or without requiring user confirmation. -Whether that is the case depends on PROMPT, `this-command' and -`magit-dwim-selection'. See the documentation of the latter for -more information. - -If it does use the default without the user even having to -confirm that, then `magit-completing-read--silent-default' is set -to t, otherwise nil. - -If it does read a value in the minibuffer, then this function -acts similarly to `completing-read', except for the following: - -- COLLECTION must be a list of choices. A function is not - supported. - -- If REQUIRE-MATCH is nil and the user exits without a choice, - then nil is returned instead of an empty string. - -- If REQUIRE-MATCH is non-nil and the user exits without a - choice, `user-error' is raised. - -- FALLBACK specifies a secondary default that is only used if - the primary default DEF is nil. The secondary default is not - subject to `magit-dwim-selection' — if DEF is nil but FALLBACK - is not, then this function always asks the user to choose a - candidate, just as if both defaults were nil. - -- \": \" is appended to PROMPT. - -- PROMPT is modified to end with \" (default DEF|FALLBACK): \" - provided that DEF or FALLBACK is non-nil, that neither - `ivy-mode' nor `helm-mode' is enabled, and that - `magit-completing-read-function' is set to its default value of - `magit-builtin-completing-read'." - (setq magit-completing-read--silent-default nil) - (if-let ((dwim (and def - (nth 2 (-first (pcase-lambda (`(,cmd ,re ,_)) - (and (eq this-command cmd) - (or (not re) - (string-match-p re prompt)))) - magit-dwim-selection))))) - (if (eq dwim 'ask) - (if (y-or-n-p (format "%s %s? " prompt def)) - def - (user-error "Abort")) - (setq magit-completing-read--silent-default t) - def) - (unless def - (setq def fallback)) - (let ((command this-command) - (reply (funcall magit-completing-read-function - (concat prompt ": ") - (if (and def (not (member def collection))) - (cons def collection) - collection) - predicate - require-match initial-input hist def))) - (setq this-command command) - (if (string= reply "") - (if require-match - (user-error "Nothing selected") - nil) - reply)))) - -(defun magit--completion-table (collection) - (lambda (string pred action) - (if (eq action 'metadata) - '(metadata (display-sort-function . identity)) - (complete-with-action action collection string pred)))) - -(defun magit-builtin-completing-read - (prompt choices &optional predicate require-match initial-input hist def) - "Magit wrapper for standard `completing-read' function." - (unless (or (bound-and-true-p helm-mode) - (bound-and-true-p ivy-mode)) - (setq prompt (magit-prompt-with-default prompt def)) - (setq choices (magit--completion-table choices))) - (cl-letf (((symbol-function 'completion-pcm--all-completions) - #'magit-completion-pcm--all-completions)) - (let ((ivy-sort-functions-alist nil)) - (completing-read prompt choices - predicate require-match - initial-input hist def)))) - -(defun magit-completing-read-multiple - (prompt choices &optional sep default hist keymap) - "Read multiple items from CHOICES, separated by SEP. - -Set up the `crm' variables needed to read multiple values with -`read-from-minibuffer'. - -SEP is a regexp matching characters that can separate choices. -When SEP is nil, it defaults to `crm-default-separator'. -DEFAULT, HIST, and KEYMAP are passed to `read-from-minibuffer'. -When KEYMAP is nil, it defaults to `crm-local-completion-map'. - -Unlike `completing-read-multiple', the return value is not split -into a list." - (let* ((crm-separator (or sep crm-default-separator)) - (crm-completion-table (magit--completion-table choices)) - (choose-completion-string-functions - '(crm--choose-completion-string)) - (minibuffer-completion-table #'crm--collection-fn) - (minibuffer-completion-confirm t) - (helm-completion-in-region-default-sort-fn nil) - (input - (cl-letf (((symbol-function 'completion-pcm--all-completions) - #'magit-completion-pcm--all-completions)) - (read-from-minibuffer - (concat prompt (and default (format " (%s)" default)) ": ") - nil (or keymap crm-local-completion-map) - nil hist default)))) - (when (string-equal input "") - (or (setq input default) - (user-error "Nothing selected"))) - input)) - -(defun magit-completing-read-multiple* - (prompt table &optional predicate require-match initial-input - hist def inherit-input-method) - "Read multiple strings in the minibuffer, with completion. -Like `completing-read-multiple' but don't mess with order of -TABLE. Also bind `helm-completion-in-region-default-sort-fn' -to nil." - (unwind-protect - (cl-letf (((symbol-function 'completion-pcm--all-completions) - #'magit-completion-pcm--all-completions)) - (add-hook 'choose-completion-string-functions - 'crm--choose-completion-string) - (let* ((minibuffer-completion-table #'crm--collection-fn) - (minibuffer-completion-predicate predicate) - ;; see completing_read in src/minibuf.c - (minibuffer-completion-confirm - (unless (eq require-match t) require-match)) - (crm-completion-table (magit--completion-table table)) - (map (if require-match - crm-local-must-match-map - crm-local-completion-map)) - (helm-completion-in-region-default-sort-fn nil) - ;; If the user enters empty input, `read-from-minibuffer' - ;; returns the empty string, not DEF. - (input (read-from-minibuffer - prompt initial-input map - nil hist def inherit-input-method))) - (and def (string-equal input "") (setq input def)) - ;; Remove empty strings in the list of read strings. - (split-string input crm-separator t))) - (remove-hook 'choose-completion-string-functions - 'crm--choose-completion-string))) - -(defun magit-ido-completing-read - (prompt choices &optional predicate require-match initial-input hist def) - "Ido-based `completing-read' almost-replacement. - -Unfortunately `ido-completing-read' is not suitable as a -drop-in replacement for `completing-read', instead we use -`ido-completing-read+' from the third-party package by the -same name." - (if (require 'ido-completing-read+ nil t) - (ido-completing-read+ prompt choices predicate require-match - initial-input hist - (or def (and require-match (car choices)))) - (display-warning 'magit "ido-completing-read+ is not installed - -To use Ido completion with Magit you need to install the -third-party `ido-completing-read+' packages. Falling -back to built-in `completing-read' for now." :error) - (magit-builtin-completing-read prompt choices predicate require-match - initial-input hist def))) - -(defun magit-prompt-with-default (prompt def) - (if (and def (> (length prompt) 2) - (string-equal ": " (substring prompt -2))) - (format "%s (default %s): " (substring prompt 0 -2) def) - prompt)) - -(defvar magit-minibuffer-local-ns-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map minibuffer-local-map) - (define-key map "\s" 'magit-whitespace-disallowed) - (define-key map "\t" 'magit-whitespace-disallowed) - map)) - -(defun magit-whitespace-disallowed () - "Beep to tell the user that whitespace is not allowed." - (interactive) - (ding) - (message "Whitespace isn't allowed here") - (setq defining-kbd-macro nil) - (force-mode-line-update)) - -(defun magit-read-string (prompt &optional initial-input history default-value - inherit-input-method no-whitespace) - "Read a string from the minibuffer, prompting with string PROMPT. - -This is similar to `read-string', but -* empty input is only allowed if DEFAULT-VALUE is non-nil in - which case that is returned, -* whitespace is not allowed and leading and trailing whitespace is - removed automatically if NO-WHITESPACE is non-nil, -* \": \" is appended to PROMPT, and -* an invalid DEFAULT-VALUE is silently ignored." - (when default-value - (when (consp default-value) - (setq default-value (car default-value))) - (unless (stringp default-value) - (setq default-value nil))) - (let* ((minibuffer-completion-table nil) - (val (read-from-minibuffer - (magit-prompt-with-default (concat prompt ": ") default-value) - initial-input (and no-whitespace magit-minibuffer-local-ns-map) - nil history default-value inherit-input-method)) - (trim (lambda (regexp string) - (save-match-data - (if (string-match regexp string) - (replace-match "" t t string) - string))))) - (when (and (string= val "") default-value) - (setq val default-value)) - (when no-whitespace - (setq val (funcall trim "\\`\\(?:[ \t\n\r]+\\)" - (funcall trim "\\(?:[ \t\n\r]+\\)\\'" val)))) - (cond ((string= val "") - (user-error "Need non-empty input")) - ((and no-whitespace (string-match-p "[\s\t\n]" val)) - (user-error "Input contains whitespace")) - (t val)))) - -(defun magit-read-string-ns (prompt &optional initial-input history - default-value inherit-input-method) - "Call `magit-read-string' with non-nil NO-WHITESPACE." - (magit-read-string prompt initial-input history default-value - inherit-input-method t)) - -(defmacro magit-read-char-case (prompt verbose &rest clauses) - (declare (indent 2) - (debug (form form &rest (characterp form body)))) - `(prog1 (pcase (read-char-choice - (concat ,prompt - ,(concat (mapconcat 'cadr clauses ", ") - (and verbose ", or [C-g] to abort") " ")) - ',(mapcar 'car clauses)) - ,@(--map `(,(car it) ,@(cddr it)) clauses)) - (message ""))) - -(defun magit-y-or-n-p (prompt &optional action) - "Ask user a \"y or n\" or a \"yes or no\" question using PROMPT. -Which kind of question is used depends on whether -ACTION is a member of option `magit-slow-confirm'." - (if (or (eq magit-slow-confirm t) - (and action (member action magit-slow-confirm))) - (yes-or-no-p prompt) - (y-or-n-p prompt))) - -(defvar magit--no-confirm-alist - '((safe-with-wip magit-wip-before-change-mode - discard reverse stage-all-changes unstage-all-changes))) - -(cl-defun magit-confirm (action &optional prompt prompt-n noabort - (items nil sitems)) - (declare (indent defun)) - (setq prompt-n (format (concat (or prompt-n prompt) "? ") (length items))) - (setq prompt (format (concat (or prompt (magit-confirm-make-prompt action)) - "? ") - (car items))) - (or (cond ((and (not (eq action t)) - (or (eq magit-no-confirm t) - (memq action magit-no-confirm) - (cl-member-if (pcase-lambda (`(,key ,var . ,sub)) - (and (memq key magit-no-confirm) - (memq action sub) - (or (not var) - (and (boundp var) - (symbol-value var))))) - magit--no-confirm-alist))) - (or (not sitems) items)) - ((not sitems) - (magit-y-or-n-p prompt action)) - ((= (length items) 1) - (and (magit-y-or-n-p prompt action) items)) - ((> (length items) 1) - (and (magit-y-or-n-p (concat (mapconcat #'identity items "\n") - "\n\n" prompt-n) - action) - items))) - (if noabort nil (user-error "Abort")))) - -(defun magit-confirm-files (action files &optional prompt) - (when files - (unless prompt - (setq prompt (magit-confirm-make-prompt action))) - (magit-confirm action - (concat prompt " %s") - (concat prompt " %i files") - nil files))) - -(defun magit-confirm-make-prompt (action) - (let ((prompt (symbol-name action))) - (replace-regexp-in-string - "-" " " (concat (upcase (substring prompt 0 1)) (substring prompt 1))))) - -(defun magit-read-number-string (prompt &optional default _history) - "Like `read-number' but return value is a string. -DEFAULT may be a number or a numeric string." - (number-to-string - (read-number prompt (if (stringp default) - (string-to-number default) - default)))) - -;;; Debug Utilities - -;;;###autoload -(defun magit-emacs-Q-command () - "Show a shell command that runs an uncustomized Emacs with only Magit loaded. -See info node `(magit)Debugging Tools' for more information." - (interactive) - (let ((cmd (mapconcat - #'shell-quote-argument - `(,(concat invocation-directory invocation-name) - "-Q" "--eval" "(setq debug-on-error t)" - ,@(cl-mapcan - (lambda (dir) (list "-L" dir)) - (delete-dups - (cl-mapcan - (lambda (lib) - (let ((path (locate-library lib))) - (cond - (path - (list (file-name-directory path))) - ((not (equal lib "libgit")) - (error "Cannot find mandatory dependency %s" lib))))) - '(;; Like `LOAD_PATH' in `default.mk'. - "dash" - "libgit" - "transient" - "with-editor" - ;; Obviously `magit' itself is needed too. - "magit" - ;; While this is part of the Magit repository, - ;; it is distributed as a separate package. - "git-commit" - ;; Even though `async' is a dependency of the - ;; `magit' package, it is not required here. - )))) - ;; Avoid Emacs bug#16406 by using full path. - "-l" ,(file-name-sans-extension (locate-library "magit"))) - " "))) - (message "Uncustomized Magit command saved to kill-ring, %s" - "please run it in a terminal.") - (kill-new cmd))) - -;;; Text Utilities - -(defmacro magit-bind-match-strings (varlist string &rest body) - "Bind variables to submatches according to VARLIST then evaluate BODY. -Bind the symbols in VARLIST to submatches of the current match -data, starting with 1 and incrementing by 1 for each symbol. If -the last match was against a string, then that has to be provided -as STRING." - (declare (indent 2) (debug (listp form body))) - (let ((s (cl-gensym "string")) - (i 0)) - `(let ((,s ,string)) - (let ,(save-match-data - (--map (list it (list 'match-string (cl-incf i) s)) varlist)) - ,@body)))) - -(defun magit-delete-line () - "Delete the rest of the current line." - (delete-region (point) (1+ (line-end-position)))) - -(defun magit-delete-match (&optional num) - "Delete text matched by last search. -If optional NUM is specified, only delete that subexpression." - (delete-region (match-beginning (or num 0)) - (match-end (or num 0)))) - -(defun magit-file-line (file) - "Return the first line of FILE as a string." - (when (file-regular-p file) - (with-temp-buffer - (insert-file-contents file) - (buffer-substring-no-properties (point-min) - (line-end-position))))) - -(defun magit-file-lines (file &optional keep-empty-lines) - "Return a list of strings containing one element per line in FILE. -Unless optional argument KEEP-EMPTY-LINES is t, trim all empty lines." - (when (file-regular-p file) - (with-temp-buffer - (insert-file-contents file) - (split-string (buffer-string) "\n" (not keep-empty-lines))))) - -(defun magit-set-header-line-format (string) - "Set the header-line using STRING. -Propertize STRING with the `magit-header-line'. If the `face' -property of any part of STRING is already set, then that takes -precedence. Also pad the left and right sides of STRING so that -it aligns with the text area." - (setq header-line-format - (concat - (propertize " " 'display '(space :align-to 0)) - string - (propertize " " 'display - `(space :width - (+ left-fringe - left-margin - ,@(and (eq (car (window-current-scroll-bars)) - 'left) - '(scroll-bar))))))) - (magit--add-face-text-property 0 (1- (length header-line-format)) - 'magit-header-line t header-line-format)) - -(defun magit-face-property-all (face string) - "Return non-nil if FACE is present in all of STRING." - (cl-loop for pos = 0 then (next-single-property-change - pos 'font-lock-face string) - unless pos - return t - for current = (get-text-property pos 'font-lock-face string) - unless (if (consp current) - (memq face current) - (eq face current)) - return nil)) - -(defun magit--add-face-text-property (beg end face &optional append object) - "Like `add-face-text-property' but for `font-lock-face'." - (cl-loop for pos = (next-single-property-change - beg 'font-lock-face object end) - for current = (get-text-property beg 'font-lock-face object) - for newface = (if (listp current) - (if append - (append current (list face)) - (cons face current)) - (if append - (list current face) - (list face current))) - do (progn (put-text-property beg pos 'font-lock-face newface object) - (setq beg pos)) - while (< beg end))) - -(defun magit--propertize-face (string face) - (propertize string 'face face 'font-lock-face face)) - -(defun magit--put-face (beg end face string) - (put-text-property beg end 'face face string) - (put-text-property beg end 'font-lock-face face string)) - -(defun magit--format-spec (format specification) - "Like `format-spec' but preserve text properties in SPECIFICATION." - (with-temp-buffer - (insert format) - (goto-char (point-min)) - (while (search-forward "%" nil t) - (cond - ;; Quoted percent sign. - ((eq (char-after) ?%) - (delete-char 1)) - ;; Valid format spec. - ((looking-at "\\([-0-9.]*\\)\\([a-zA-Z]\\)") - (let* ((num (match-string 1)) - (spec (string-to-char (match-string 2))) - (val (assq spec specification))) - (unless val - (error "Invalid format character: `%%%c'" spec)) - (setq val (cdr val)) - ;; Pad result to desired length. - (let ((text (format (concat "%" num "s") val))) - ;; Insert first, to preserve text properties. - (if (next-property-change 0 (concat " " text)) - ;; If the inserted text has properties, then preserve those. - (insert text) - ;; Otherwise preserve FORMAT's properties, like `format-spec'. - (insert-and-inherit text)) - ;; Delete the specifier body. - (delete-region (+ (match-beginning 0) (length text)) - (+ (match-end 0) (length text))) - ;; Delete the percent sign. - (delete-region (1- (match-beginning 0)) (match-beginning 0))))) - ;; Signal an error on bogus format strings. - (t - (error "Invalid format string")))) - (buffer-string))) - -;;; Missing from Emacs - -(defun magit-kill-this-buffer () - "Kill the current buffer." - (interactive) - (kill-buffer (current-buffer))) - -(defun magit--buffer-string (&optional min max trim) - "Like `buffer-substring-no-properties' but the arguments are optional. - -This combines the benefits of `buffer-string', `buffer-substring' -and `buffer-substring-no-properties' into one function that is -not as painful to use as the latter. I.e. you can write - (magit--buffer-string) -instead of - (buffer-substring-no-properties (point-min) - (point-max)) - -Optional MIN defaults to the value of `point-min'. -Optional MAX defaults to the value of `point-max'. - -If optional TRIM is non-nil, then all leading and trailing -whitespace is remove. If it is the newline character, then -one trailing newline is added." - ;; Lets write that one last time and be done with it: - (let ((str (buffer-substring-no-properties (or min (point-min)) - (or max (point-max))))) - (if trim - (concat (string-trim str) - (and (eq trim ?\n) "\n")) - str))) - -;;; Kludges for Emacs Bugs - -(defun magit-file-accessible-directory-p (filename) - "Like `file-accessible-directory-p' but work around an Apple bug. -See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21573#17 -and https://github.com/magit/magit/issues/2295." - (and (file-directory-p filename) - (file-accessible-directory-p filename))) - -(when (version<= "25.1" emacs-version) - (with-eval-after-load 'vc-git - (defun vc-git-conflicted-files (directory) - "Return the list of files with conflicts in DIRECTORY." - (let* ((status - (vc-git--run-command-string directory "diff-files" - "--name-status")) - (lines (when status (split-string status "\n" 'omit-nulls))) - files) - (dolist (line lines files) - (when (string-match "\\([ MADRCU?!]\\)[ \t]+\\(.+\\)" line) - (let ((state (match-string 1 line)) - (file (match-string 2 line))) - (when (equal state "U") - (push (expand-file-name file directory) files))))))))) - -(when (< emacs-major-version 27) - (defun vc-git--call@bug21559 (fn buffer command &rest args) - "Backport https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21559." - (let ((process-environment process-environment)) - (when revert-buffer-in-progress-p - (push "GIT_OPTIONAL_LOCKS=0" process-environment)) - (apply fn buffer command args))) - (advice-add 'vc-git--call :around 'vc-git--call@bug21559) - - (defun vc-git-command@bug21559 - (fn buffer okstatus file-or-list &rest flags) - "Backport https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21559." - (let ((process-environment process-environment)) - (when revert-buffer-in-progress-p - (push "GIT_OPTIONAL_LOCKS=0" process-environment)) - (apply fn buffer okstatus file-or-list flags))) - (advice-add 'vc-git-command :around 'vc-git-command@bug21559) - - (defun auto-revert-handler@bug21559 (fn) - "Backport https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21559." - (let ((revert-buffer-in-progress-p t)) - (funcall fn))) - (advice-add 'auto-revert-handler :around 'auto-revert-handler@bug21559) - ) - -;; `completion-pcm--all-completions' reverses the completion list. To -;; preserve the order of our pre-sorted completions, we'll temporarily -;; override it with the function below. bug#24676 -(defun magit-completion-pcm--all-completions (prefix pattern table pred) - (if (completion-pcm--pattern-trivial-p pattern) - (all-completions (concat prefix (car pattern)) table pred) - (let* ((regex (completion-pcm--pattern->regex pattern)) - (case-fold-search completion-ignore-case) - (completion-regexp-list (cons regex completion-regexp-list)) - (compl (all-completions - (concat prefix - (if (stringp (car pattern)) (car pattern) "")) - table pred))) - (if (not (functionp table)) - compl - (let ((poss ())) - (dolist (c compl) - (when (string-match-p regex c) (push c poss))) - ;; This `nreverse' call is the only code change made to the - ;; `completion-pcm--all-completions' that shipped with Emacs 25.1. - (nreverse poss)))))) - -(defun magit-which-function () - "Return current function name based on point. - -This is a simple wrapper around `which-function', that resets -Imenu's potentially outdated and therefore unreliable cache by -setting `imenu--index-alist' to nil before calling that function." - (setq imenu--index-alist nil) - (which-function)) - -;;; Kludges for Custom - -(defun magit-custom-initialize-reset (symbol exp) - "Initialize SYMBOL based on EXP. -Set the symbol, using `set-default' (unlike -`custom-initialize-reset' which uses the `:set' function if any.) -The value is either the symbol's current value - (as obtained using the `:get' function), if any, -or the value in the symbol's `saved-value' property if any, -or (last of all) the value of EXP." - (set-default-toplevel-value - symbol - (condition-case nil - (let ((def (default-toplevel-value symbol)) - (getter (get symbol 'custom-get))) - (if getter (funcall getter symbol) def)) - (error - (eval (let ((sv (get symbol 'saved-value))) - (if sv (car sv) exp))))))) - -(defun magit-hook-custom-get (symbol) - (if (symbol-file symbol 'defvar) - (default-toplevel-value symbol) - ;; - ;; Called by `custom-initialize-reset' on behalf of `symbol's - ;; `defcustom', which is being evaluated for the first time to - ;; set the initial value, but there's already a default value, - ;; which most likely was established by one or more `add-hook' - ;; calls. - ;; - ;; We combine the `standard-value' and the current value, while - ;; preserving the order established by `:options', and return - ;; the result of that to be used as the "initial" default value. - ;; - (let ((standard (eval (car (get symbol 'standard-value)))) - (current (default-toplevel-value symbol)) - (value nil)) - (dolist (fn (get symbol 'custom-options)) - (when (or (memq fn standard) - (memq fn current)) - (push fn value))) - (dolist (fn current) - (unless (memq fn value) - (push fn value))) - (nreverse value)))) - -;;; Kludges for Info Manuals - -;;;###autoload -(defun Info-follow-nearest-node--magit-gitman (fn &optional fork) - (let ((node (Info-get-token - (point) "\\*note[ \n\t]+" - "\\*note[ \n\t]+\\([^:]*\\):\\(:\\|[ \n\t]*(\\)?"))) - (if (and node (string-match "^(gitman)\\(.+\\)" node)) - (pcase magit-view-git-manual-method - (`info (funcall fn fork)) - (`man (require 'man) - (man (match-string 1 node))) - (`woman (require 'woman) - (woman (match-string 1 node))) - (_ - (user-error "Invalid value for `magit-view-git-manual-method'"))) - (funcall fn fork)))) - -;;;###autoload -(advice-add 'Info-follow-nearest-node :around - 'Info-follow-nearest-node--magit-gitman) - -;;;###autoload -(defun org-man-export--magit-gitman (fn link description format) - (if (and (eq format 'texinfo) - (string-match-p "\\`git" link)) - (replace-regexp-in-string "%s" link " -@ifinfo -@ref{%s,,,gitman,}. -@end ifinfo -@ifhtml -@html -the %s(1) manpage. -@end html -@end ifhtml -@iftex -the %s(1) manpage. -@end iftex -") - (funcall fn link description format))) - -;;;###autoload -(advice-add 'org-man-export :around - 'org-man-export--magit-gitman) - -;;; Bitmaps - -(when (fboundp 'define-fringe-bitmap) - (define-fringe-bitmap 'magit-fringe-bitmap+ - [#b00000000 - #b00011000 - #b00011000 - #b01111110 - #b01111110 - #b00011000 - #b00011000 - #b00000000]) - (define-fringe-bitmap 'magit-fringe-bitmap- - [#b00000000 - #b00000000 - #b00000000 - #b01111110 - #b01111110 - #b00000000 - #b00000000 - #b00000000]) - - (define-fringe-bitmap 'magit-fringe-bitmap> - [#b01100000 - #b00110000 - #b00011000 - #b00001100 - #b00011000 - #b00110000 - #b01100000 - #b00000000]) - (define-fringe-bitmap 'magit-fringe-bitmapv - [#b00000000 - #b10000010 - #b11000110 - #b01101100 - #b00111000 - #b00010000 - #b00000000 - #b00000000]) - - (define-fringe-bitmap 'magit-fringe-bitmap-bold> - [#b11100000 - #b01110000 - #b00111000 - #b00011100 - #b00011100 - #b00111000 - #b01110000 - #b11100000]) - (define-fringe-bitmap 'magit-fringe-bitmap-boldv - [#b10000001 - #b11000011 - #b11100111 - #b01111110 - #b00111100 - #b00011000 - #b00000000 - #b00000000]) - ) - -;;; Miscellaneous - -(defun magit-message (format-string &rest args) - "Display a message at the bottom of the screen, or not. -Like `message', except that if the users configured option -`magit-no-message' to prevent the message corresponding to -FORMAT-STRING to be displayed, then don't." - (unless (--first (string-prefix-p it format-string) magit-no-message) - (apply #'message format-string args))) - -(defun magit-msg (format-string &rest args) - "Display a message at the bottom of the screen, but don't log it. -Like `message', except that `message-log-max' is bound to nil." - (let ((message-log-max nil)) - (apply #'message format-string args))) - -(defmacro magit--with-temp-position (buf pos &rest body) - (declare (indent 2)) - `(with-current-buffer ,buf - (save-excursion - (save-restriction - (widen) - (goto-char ,pos) - ,@body)))) - -;;; _ -(provide 'magit-utils) -;;; magit-utils.el ends here diff --git a/elpa/magit-20200418.939/magit-utils.elc b/elpa/magit-20200418.939/magit-utils.elc deleted file mode 100644 index c61c26eca3adbc826ed80f72f9004f1135772b69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39815 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 i)`qvtp&ufPh275c26 -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library defines tree global modes which automatically commit -;; snapshots to branch-specific work-in-progress refs before and after -;; making changes, and two commands which can be used to do so on -;; demand. - -;;; Code: - -(eval-when-compile - (require 'subr-x)) - -(require 'magit-core) -(require 'magit-log) - -;;; Options - -(defgroup magit-wip nil - "Automatically commit to work-in-progress refs." - :link '(info-link "(magit)Wip Modes") - :group 'magit-modes - :group 'magit-essentials) - -(defgroup magit-wip-legacy nil - "It is better to not use these modes individually." - :link '(info-link "(magit)Legacy Wip Modes") - :group 'magit-wip) - -(defcustom magit-wip-mode-lighter " Wip" - "Lighter for Magit-Wip mode." - :package-version '(magit . "2.90.0") - :group 'magit-wip - :type 'string) - -(defcustom magit-wip-after-save-local-mode-lighter "" - "Lighter for Magit-Wip-After-Save-Local mode." - :package-version '(magit . "2.1.0") - :group 'magit-wip-legacy - :type 'string) - -(defcustom magit-wip-after-apply-mode-lighter "" - "Lighter for Magit-Wip-After-Apply mode." - :package-version '(magit . "2.1.0") - :group 'magit-wip-legacy - :type 'string) - -(defcustom magit-wip-before-change-mode-lighter "" - "Lighter for Magit-Wip-Before-Change mode." - :package-version '(magit . "2.1.0") - :group 'magit-wip-legacy - :type 'string) - -(defcustom magit-wip-initial-backup-mode-lighter "" - "Lighter for Magit-Wip-Initial Backup mode." - :package-version '(magit . "2.1.0") - :group 'magit-wip-legacy - :type 'string) - -(defcustom magit-wip-merge-branch nil - "Whether to merge the current branch into its wip ref. - -If non-nil and the current branch has new commits, then it is -merged into the wip ref before creating a new wip commit. This -makes it easier to inspect wip history and the wip commits are -never garbage collected. - -If nil and the current branch has new commits, then the wip ref -is reset to the tip of the branch before creating a new wip -commit. With this setting wip commits are eventually garbage -collected. This is currently the default." - :package-version '(magit . "2.90.0") - :group 'magit-wip - :type 'boolean) - -(defcustom magit-wip-namespace "refs/wip/" - "Namespace used for work-in-progress refs. -The wip refs are named \"index/\" -and \"wtree/\". When snapshots -are created while the `HEAD' is detached then \"HEAD\" -is used as `branch-ref'." - :package-version '(magit . "2.1.0") - :group 'magit-wip - :type 'string) - -;;; Modes - -(define-minor-mode magit-wip-mode - "Save uncommitted changes to work-in-progress refs. - -Whenever appropriate (i.e. when dataloss would be a possibility -otherwise) this mode causes uncommitted changes to be committed -to dedicated work-in-progress refs. - -For historic reasons this mode is implemented on top of four -other `magit-wip-*' modes, which can also be used individually, -if you want finer control over when the wip refs are updated; -but that is discouraged." - :package-version '(magit . "2.90.0") - :lighter magit-wip-mode-lighter - :global t - (let ((arg (if magit-wip-mode 1 -1))) - (magit-wip-after-save-mode arg) - (magit-wip-after-apply-mode arg) - (magit-wip-before-change-mode arg) - (magit-wip-initial-backup-mode arg))) - -(define-minor-mode magit-wip-after-save-local-mode - "After saving, also commit to a worktree work-in-progress ref. - -After saving the current file-visiting buffer this mode also -commits the changes to the worktree work-in-progress ref for -the current branch. - -This mode should be enabled globally by turning on the globalized -variant `magit-wip-after-save-mode'." - :package-version '(magit . "2.1.0") - :lighter magit-wip-after-save-local-mode-lighter - (if magit-wip-after-save-local-mode - (if (and buffer-file-name (magit-inside-worktree-p t)) - (add-hook 'after-save-hook 'magit-wip-commit-buffer-file t t) - (setq magit-wip-after-save-local-mode nil) - (user-error "Need a worktree and a file")) - (remove-hook 'after-save-hook 'magit-wip-commit-buffer-file t))) - -(defun magit-wip-after-save-local-mode-turn-on () - (and buffer-file-name - (magit-inside-worktree-p t) - (magit-file-tracked-p buffer-file-name) - (magit-wip-after-save-local-mode))) - -;;;###autoload -(define-globalized-minor-mode magit-wip-after-save-mode - magit-wip-after-save-local-mode magit-wip-after-save-local-mode-turn-on - :package-version '(magit . "2.1.0") - :group 'magit-wip) - -(defun magit-wip-commit-buffer-file (&optional msg) - "Commit visited file to a worktree work-in-progress ref. - -Also see `magit-wip-after-save-mode' which calls this function -automatically whenever a buffer visiting a tracked file is saved." - (interactive) - (--when-let (magit-wip-get-ref) - (magit-with-toplevel - (let ((file (file-relative-name buffer-file-name))) - (magit-wip-commit-worktree - it (list file) - (format (cond (msg) - ((called-interactively-p 'any) - "wip-save %s after save") - (t - "autosave %s after save")) - file)))))) - -;;;###autoload -(define-minor-mode magit-wip-after-apply-mode - "Commit to work-in-progress refs. - -After applying a change using any \"apply variant\" -command (apply, stage, unstage, discard, and reverse) commit the -affected files to the current wip refs. For each branch there -may be two wip refs; one contains snapshots of the files as found -in the worktree and the other contains snapshots of the entries -in the index." - :package-version '(magit . "2.1.0") - :group 'magit-wip - :lighter magit-wip-after-apply-mode-lighter - :global t) - -(defun magit-wip-commit-after-apply (&optional files msg) - (when magit-wip-after-apply-mode - (magit-wip-commit files msg))) - -;;;###autoload -(define-minor-mode magit-wip-before-change-mode - "Commit to work-in-progress refs before certain destructive changes. - -Before invoking a revert command or an \"apply variant\" -command (apply, stage, unstage, discard, and reverse) commit the -affected tracked files to the current wip refs. For each branch -there may be two wip refs; one contains snapshots of the files -as found in the worktree and the other contains snapshots of the -entries in the index. - -Only changes to files which could potentially be affected by the -command which is about to be called are committed." - :package-version '(magit . "2.1.0") - :group 'magit-wip - :lighter magit-wip-before-change-mode-lighter - :global t) - -(defun magit-wip-commit-before-change (&optional files msg) - (when magit-wip-before-change-mode - (magit-with-toplevel - (magit-wip-commit files msg)))) - -(define-minor-mode magit-wip-initial-backup-mode - "Before saving a buffer for the first time, commit to a wip ref." - :package-version '(magit . "2.90.0") - :group 'magit-wip - :lighter magit-wip-initial-backup-mode-lighter - :global t - (if magit-wip-initial-backup-mode - (add-hook 'before-save-hook 'magit-wip-commit-initial-backup) - (remove-hook 'before-save-hook 'magit-wip-commit-initial-backup))) - -(defun magit--any-wip-mode-enabled-p () - "Return non-nil if any global wip mode is enabled." - (or magit-wip-mode - magit-wip-after-save-mode - magit-wip-after-apply-mode - magit-wip-before-change-mode - magit-wip-initial-backup-mode)) - -(defvar-local magit-wip-buffer-backed-up nil) -(put 'magit-wip-buffer-backed-up 'permanent-local t) - -;;;###autoload -(defun magit-wip-commit-initial-backup () - "Before saving, commit current file to a worktree wip ref. - -The user has to add this function to `before-save-hook'. - -Commit the current state of the visited file before saving the -current buffer to that file. This backs up the same version of -the file as `backup-buffer' would, but stores the backup in the -worktree wip ref, which is also used by the various Magit Wip -modes, instead of in a backup file as `backup-buffer' would. - -This function ignores the variables that affect `backup-buffer' -and can be used along-side that function, which is recommended -because this function only backs up files that are tracked in -a Git repository." - (when (and (not magit-wip-buffer-backed-up) - buffer-file-name - (magit-inside-worktree-p t) - (magit-file-tracked-p buffer-file-name)) - (let ((magit-save-repository-buffers nil)) - (magit-wip-commit-buffer-file "autosave %s before save")) - (setq magit-wip-buffer-backed-up t))) - -;;; Core - -(defun magit-wip-commit (&optional files msg) - "Commit all tracked files to the work-in-progress refs. - -Interactively, commit all changes to all tracked files using -a generic commit message. With a prefix-argument the commit -message is read in the minibuffer. - -Non-interactively, only commit changes to FILES using MSG as -commit message." - (interactive (list nil (if current-prefix-arg - (magit-read-string "Wip commit message") - "wip-save tracked files"))) - (--when-let (magit-wip-get-ref) - (magit-wip-commit-index it files msg) - (magit-wip-commit-worktree it files msg))) - -(defun magit-wip-commit-index (ref files msg) - (let* ((wipref (magit--wip-index-ref ref)) - (parent (magit-wip-get-parent ref wipref)) - (tree (magit-git-string "write-tree"))) - (magit-wip-update-wipref ref wipref tree parent files msg "index"))) - -(defun magit-wip-commit-worktree (ref files msg) - (let* ((wipref (magit--wip-wtree-ref ref)) - (parent (magit-wip-get-parent ref wipref)) - (tree (magit-with-temp-index parent (list "--reset" "-i") - (if files - ;; Note: `update-index' is used instead of `add' - ;; because `add' will fail if a file is already - ;; deleted in the temporary index. - (magit-call-git - "update-index" "--add" "--remove" - (and (pcase (magit-repository-local-get - 'update-index-has-ignore-sw-p 'unset) - (`unset - (let ((val (version<= "2.25.0" - (magit-git-version)))) - (magit-repository-local-set - 'update-index-has-ignore-sw-p val) - val)) - (val val)) - "--ignore-skip-worktree-entries") - "--" files) - (magit-with-toplevel - (magit-call-git "add" "-u" "."))) - (magit-git-string "write-tree")))) - (magit-wip-update-wipref ref wipref tree parent files msg "worktree"))) - -(defun magit-wip-update-wipref (ref wipref tree parent files msg start-msg) - (cond - ((and (not (equal parent wipref)) - (or (not magit-wip-merge-branch) - (not (magit-rev-verify wipref)))) - (setq start-msg (concat "start autosaving " start-msg)) - (magit-update-ref wipref start-msg - (magit-git-string "commit-tree" "--no-gpg-sign" - "-p" parent "-m" start-msg - (concat parent "^{tree}"))) - (setq parent wipref)) - ((and magit-wip-merge-branch - (or (not (magit-rev-ancestor-p ref wipref)) - (not (magit-rev-ancestor-p - (concat (magit-git-string "log" "--format=%H" - "-1" "--merges" wipref) - "^2") - ref)))) - (setq start-msg (format "merge %s into %s" ref start-msg)) - (magit-update-ref wipref start-msg - (magit-git-string "commit-tree" "--no-gpg-sign" - "-p" wipref "-p" ref - "-m" start-msg - (concat ref "^{tree}"))) - (setq parent wipref))) - (when (magit-git-failure "diff-tree" "--quiet" parent tree "--" files) - (unless (and msg (not (= (aref msg 0) ?\s))) - (let ((len (length files))) - (setq msg (concat - (cond ((= len 0) "autosave tracked files") - ((> len 1) (format "autosave %s files" len)) - (t (concat "autosave " - (file-relative-name (car files) - (magit-toplevel))))) - msg)))) - (magit-update-ref wipref msg - (magit-git-string "commit-tree" "--no-gpg-sign" - "-p" parent "-m" msg tree)))) - -(defun magit-wip-get-ref () - (let ((ref (or (magit-git-string "symbolic-ref" "HEAD") "HEAD"))) - (and (magit-rev-verify ref) - ref))) - -(defun magit-wip-get-parent (ref wipref) - (if (and (magit-rev-verify wipref) - (equal (magit-git-string "merge-base" wipref ref) - (magit-rev-verify ref))) - wipref - ref)) - -(defun magit--wip-index-ref (&optional ref) - (magit--wip-ref "index/" ref)) - -(defun magit--wip-wtree-ref (&optional ref) - (magit--wip-ref "wtree/" ref)) - -(defun magit--wip-ref (namespace &optional ref) - (concat magit-wip-namespace namespace - (or (and ref (string-prefix-p "refs/" ref) ref) - (when-let ((branch (and (not (equal ref "HEAD")) - (or ref (magit-get-current-branch))))) - (concat "refs/heads/" branch)) - "HEAD"))) - -(defun magit-wip-maybe-add-commit-hook () - (when (and magit-wip-merge-branch - (magit-wip-any-enabled-p)) - (add-hook 'git-commit-post-finish-hook 'magit-wip-commit nil t))) - -(defun magit-wip-any-enabled-p () - (or magit-wip-mode - magit-wip-after-save-local-mode - magit-wip-after-save-mode - magit-wip-after-apply-mode - magit-wip-before-change-mode - magit-wip-initial-backup-mode)) - -;;; Log - -(defun magit-wip-log-index (args files) - "Show log for the index wip ref of the current branch." - (interactive (magit-log-arguments)) - (magit-log-setup-buffer (list (magit--wip-index-ref)) args files)) - -(defun magit-wip-log-worktree (args files) - "Show log for the worktree wip ref of the current branch." - (interactive (magit-log-arguments)) - (magit-log-setup-buffer (list (magit--wip-wtree-ref)) args files)) - -(defun magit-wip-log-current (branch args files count) - "Show log for the current branch and its wip refs. -With a negative prefix argument only show the worktree wip ref. -The absolute numeric value of the prefix argument controls how -many \"branches\" of each wip ref are shown." - (interactive - (nconc (list (or (magit-get-current-branch) "HEAD")) - (magit-log-arguments) - (list (prefix-numeric-value current-prefix-arg)))) - (magit-wip-log branch args files count)) - -(defun magit-wip-log (branch args files count) - "Show log for a branch and its wip refs. -With a negative prefix argument only show the worktree wip ref. -The absolute numeric value of the prefix argument controls how -many \"branches\" of each wip ref are shown." - (interactive - (nconc (list (magit-completing-read - "Log branch and its wip refs" - (-snoc (magit-list-local-branch-names) "HEAD") - nil t nil 'magit-revision-history - (or (magit-branch-at-point) - (magit-get-current-branch) - "HEAD"))) - (magit-log-arguments) - (list (prefix-numeric-value current-prefix-arg)))) - (magit-log-setup-buffer (nconc (list branch) - (magit-wip-log-get-tips - (magit--wip-wtree-ref branch) - (abs count)) - (and (>= count 0) - (magit-wip-log-get-tips - (magit--wip-index-ref branch) - (abs count)))) - args files)) - -(defun magit-wip-log-get-tips (wipref count) - (when-let ((reflog (magit-git-lines "reflog" wipref))) - (let (tips) - (while (and reflog (> count 1)) - (setq reflog (cl-member "^[^ ]+ [^:]+: restart autosaving" - reflog :test #'string-match-p)) - (when (and (cadr reflog) - (string-match "^[^ ]+ \\([^:]+\\)" (cadr reflog))) - (push (match-string 1 (cadr reflog)) tips)) - (setq reflog (cddr reflog)) - (cl-decf count)) - (cons wipref (nreverse tips))))) - -;;; _ -(provide 'magit-wip) -;;; magit-wip.el ends here diff --git a/elpa/magit-20200418.939/magit-wip.elc b/elpa/magit-20200418.939/magit-wip.elc deleted file mode 100644 index 7a8b86fd7bc2d320d6c38882f2e8717564098864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27556 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 -;; Maintainer: Jonas Bernoulli - -;; Magit is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; Magit is distributed in the hope that it will be useful, but WITHOUT -;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;; License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library implements support for `git-worktree'. - -;;; Code: - -(require 'magit) - -;;; Options - -(defcustom magit-worktree-read-directory-name-function 'read-directory-name - "Function used to read a directory for worktree commands. -This is called with one argument, the prompt, and can be used -to e.g. use a base directory other than `default-directory'. -Used by `magit-worktree-checkout' and `magit-worktree-branch'." - :package-version '(magit . "3.0.0") - :group 'magit-commands - :type 'function) - -;;; Commands - -;;;###autoload (autoload 'magit-worktree "magit-worktree" nil t) -(define-transient-command magit-worktree () - "Act on a worktree." - :man-page "git-worktree" - [["Create new" - ("b" "worktree" magit-worktree-checkout) - ("c" "branch and worktree" magit-worktree-branch)] - ["Commands" - ("m" "Move worktree" magit-worktree-move) - ("k" "Delete worktree" magit-worktree-delete) - ("g" "Visit worktree" magit-worktree-status)]]) - -;;;###autoload -(defun magit-worktree-checkout (path branch) - "Checkout BRANCH in a new worktree at PATH." - (interactive - (let ((branch (magit-read-branch-or-commit "Checkout"))) - (list (funcall magit-worktree-read-directory-name-function - (format "Checkout %s in new worktree: " branch)) - branch))) - (magit-run-git "worktree" "add" (expand-file-name path) branch) - (magit-diff-visit-directory path)) - -;;;###autoload -(defun magit-worktree-branch (path branch start-point &optional force) - "Create a new BRANCH and check it out in a new worktree at PATH." - (interactive - `(,(funcall magit-worktree-read-directory-name-function - "Create worktree: ") - ,@(magit-branch-read-args "Create and checkout branch") - ,current-prefix-arg)) - (magit-run-git "worktree" "add" (if force "-B" "-b") - branch (expand-file-name path) start-point) - (magit-diff-visit-directory path)) - -;;;###autoload -(defun magit-worktree-move (worktree path) - "Move WORKTREE to PATH." - (interactive - (list (magit-completing-read "Move worktree" - (cdr (magit-list-worktrees)) - nil t nil nil - (magit-section-value-if 'worktree)) - (funcall magit-worktree-read-directory-name-function - "Move worktree to: "))) - (if (file-directory-p (expand-file-name ".git" worktree)) - (user-error "You may not move the main working tree") - (let ((preexisting-directory (file-directory-p path))) - (when (and (zerop (magit-call-git "worktree" "move" worktree - (expand-file-name path))) - (not (file-exists-p default-directory)) - (derived-mode-p 'magit-status-mode)) - (kill-buffer) - (magit-diff-visit-directory - (if preexisting-directory - (concat (file-name-as-directory path) - (file-name-nondirectory worktree)) - path))) - (magit-refresh)))) - -(defun magit-worktree-delete (worktree) - "Delete a worktree, defaulting to the worktree at point. -The primary worktree cannot be deleted." - (interactive - (list (magit-completing-read "Delete worktree" - (cdr (magit-list-worktrees)) - nil t nil nil - (magit-section-value-if 'worktree)))) - (if (file-directory-p (expand-file-name ".git" worktree)) - (user-error "Deleting %s would delete the shared .git directory" worktree) - (let ((primary (file-name-as-directory (caar (magit-list-worktrees))))) - (magit-confirm-files (if magit-delete-by-moving-to-trash 'trash 'delete) - (list "worktree")) - (when (file-exists-p worktree) - (let ((delete-by-moving-to-trash magit-delete-by-moving-to-trash)) - (delete-directory worktree t magit-delete-by-moving-to-trash))) - (if (file-exists-p default-directory) - (magit-run-git "worktree" "prune") - (let ((default-directory primary)) - (magit-run-git "worktree" "prune")) - (when (derived-mode-p 'magit-status-mode) - (kill-buffer) - (magit-status-setup-buffer primary)))))) - -(defun magit-worktree-status (worktree) - "Show the status for the worktree at point. -If there is no worktree at point, then read one in the -minibuffer. If the worktree at point is the one whose -status is already being displayed in the current buffer, -then show it in Dired instead." - (interactive - (list (or (magit-section-value-if 'worktree) - (magit-completing-read - "Show status for worktree" - (cl-delete (directory-file-name (magit-toplevel)) - (magit-list-worktrees) - :test #'equal :key #'car))))) - (magit-diff-visit-directory worktree)) - -;;; Sections - -(defvar magit-worktree-section-map - (let ((map (make-sparse-keymap))) - (define-key map [remap magit-visit-thing] 'magit-worktree-status) - (define-key map [remap magit-delete-thing] 'magit-worktree-delete) - map) - "Keymap for `worktree' sections.") - -(defun magit-insert-worktrees () - "Insert sections for all worktrees. -If there is only one worktree, then insert nothing." - (let ((worktrees (magit-list-worktrees))) - (when (> (length worktrees) 1) - (magit-insert-section (worktrees) - (magit-insert-heading "Worktrees:") - (let* ((cols - (mapcar - (pcase-lambda (`(,path ,barep ,commit ,branch)) - (cons (cond - (branch (propertize - branch 'font-lock-face 'magit-branch-local)) - (commit (propertize (magit-rev-abbrev commit) - 'font-lock-face 'magit-hash)) - (barep "(bare)")) - path)) - worktrees)) - (align (1+ (-max (--map (string-width (car it)) cols))))) - (pcase-dolist (`(,head . ,path) cols) - (magit-insert-section (worktree path) - (insert head) - (indent-to align) - (insert (let ((r (file-relative-name path)) - (a (abbreviate-file-name path))) - (if (< (string-width r) (string-width a)) r a))) - (insert ?\n)))) - (insert ?\n))))) - -;;; _ -(provide 'magit-worktree) -;;; magit-worktree.el ends here diff --git a/elpa/magit-20200418.939/magit-worktree.elc b/elpa/magit-20200418.939/magit-worktree.elc deleted file mode 100644 index 3ec7d5b01f75fcedff130f739427f6e52e2290a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8597 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

\\'" code)))) - (if (and beg end) (substring code beg end) code))))))))) - -(defun org-html-do-format-code - (code &optional lang refs retain-labels num-start wrap-lines) - "Format CODE string as source code. -Optional arguments LANG, REFS, RETAIN-LABELS, NUM-START, WRAP-LINES -are, respectively, the language of the source code, as a string, an -alist between line numbers and references (as returned by -`org-export-unravel-code'), a boolean specifying if labels should -appear in the source code, the number associated to the first -line of code, and a boolean specifying if lines of code should be -wrapped in code elements." - (let* ((code-lines (split-string code "\n")) - (code-length (length code-lines)) - (num-fmt - (and num-start - (format "%%%ds: " - (length (number-to-string (+ code-length num-start)))))) - (code (org-html-fontify-code code lang))) - (org-export-format-code - code - (lambda (loc line-num ref) - (setq loc - (concat - ;; Add line number, if needed. - (when num-start - (format "%s" - (format num-fmt line-num))) - ;; Transcoded src line. - (if wrap-lines - (format "%s
" - (if num-start - (format " data-ox-html-linenr=\"%s\"" line-num) - "") - loc) - loc) - ;; Add label, if needed. - (when (and ref retain-labels) (format " (%s)" ref)))) - ;; Mark transcoded line as an anchor, if needed. - (if (not ref) loc - (format "%s" - ref loc))) - num-start refs))) - -(defun org-html-format-code (element info) - "Format contents of ELEMENT as source code. -ELEMENT is either an example or a source block. INFO is a plist -used as a communication channel." - (let* ((lang (org-element-property :language element)) - ;; Extract code and references. - (code-info (org-export-unravel-code element)) - (code (car code-info)) - (refs (cdr code-info)) - ;; Does the source block contain labels? - (retain-labels (org-element-property :retain-labels element)) - ;; Does it have line numbers? - (num-start (org-export-get-loc element info)) - ;; Should lines be wrapped in code elements? - (wrap-lines (plist-get info :html-wrap-src-lines))) - (org-html-do-format-code code lang refs retain-labels num-start wrap-lines))) - - -;;; Tables of Contents - -(defun org-html-toc (depth info &optional scope) - "Build a table of contents. -DEPTH is an integer specifying the depth of the table. INFO is -a plist used as a communication channel. Optional argument SCOPE -is an element defining the scope of the table. Return the table -of contents as a string, or nil if it is empty." - (let ((toc-entries - (mapcar (lambda (headline) - (cons (org-html--format-toc-headline headline info) - (org-export-get-relative-level headline info))) - (org-export-collect-headlines info depth scope)))) - (when toc-entries - (let ((toc (concat "
" - (org-html--toc-text toc-entries) - "
\n"))) - (if scope toc - (let ((outer-tag (if (org-html--html5-fancy-p info) - "nav" - "div"))) - (concat (format "<%s id=\"table-of-contents\">\n" outer-tag) - (let ((top-level (plist-get info :html-toplevel-hlevel))) - (format "%s\n" - top-level - (org-html--translate "Table of Contents" info) - top-level)) - toc - (format "\n" outer-tag)))))))) - -(defun org-html--toc-text (toc-entries) - "Return innards of a table of contents, as a string. -TOC-ENTRIES is an alist where key is an entry title, as a string, -and value is its relative level, as an integer." - (let* ((prev-level (1- (cdar toc-entries))) - (start-level prev-level)) - (concat - (mapconcat - (lambda (entry) - (let ((headline (car entry)) - (level (cdr entry))) - (concat - (let* ((cnt (- level prev-level)) - (times (if (> cnt 0) (1- cnt) (- cnt)))) - (setq prev-level level) - (concat - (org-html--make-string - times (cond ((> cnt 0) "\n
    \n
  • ") - ((< cnt 0) "
  • \n
\n"))) - (if (> cnt 0) "\n
    \n
  • " "
  • \n
  • "))) - headline))) - toc-entries "") - (org-html--make-string (- prev-level start-level) "
  • \n
\n")))) - -(defun org-html--format-toc-headline (headline info) - "Return an appropriate table of contents entry for HEADLINE. -INFO is a plist used as a communication channel." - (let* ((headline-number (org-export-get-headline-number headline info)) - (todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword headline))) - (and todo (org-export-data todo info))))) - (todo-type (and todo (org-element-property :todo-type headline))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority headline))) - (text (org-export-data-with-backend - (org-export-get-alt-title headline info) - (org-export-toc-entry-backend 'html) - info)) - (tags (and (eq (plist-get info :with-tags) t) - (org-export-get-tags headline info)))) - (format "%s" - ;; Label. - (or (org-element-property :CUSTOM_ID headline) - (org-export-get-reference headline info)) - ;; Body. - (concat - (and (not (org-export-low-level-p headline info)) - (org-export-numbered-headline-p headline info) - (concat (mapconcat #'number-to-string headline-number ".") - ". ")) - (apply (plist-get info :html-format-headline-function) - todo todo-type priority text tags :section-number nil))))) - -(defun org-html-list-of-listings (info) - "Build a list of listings. -INFO is a plist used as a communication channel. Return the list -of listings as a string, or nil if it is empty." - (let ((lol-entries (org-export-collect-listings info))) - (when lol-entries - (concat "
\n" - (let ((top-level (plist-get info :html-toplevel-hlevel))) - (format "%s\n" - top-level - (org-html--translate "List of Listings" info) - top-level)) - "
\n
    \n" - (let ((count 0) - (initial-fmt (format "%s" - (org-html--translate "Listing %d:" info)))) - (mapconcat - (lambda (entry) - (let ((label (and (org-element-property :name entry) - (org-export-get-reference entry info))) - (title (org-trim - (org-export-data - (or (org-export-get-caption entry t) - (org-export-get-caption entry)) - info)))) - (concat - "
  • " - (if (not label) - (concat (format initial-fmt (cl-incf count)) - " " - title) - (format "%s %s" - label - (format initial-fmt (cl-incf count)) - title)) - "
  • "))) - lol-entries "\n")) - "\n
\n
\n
")))) - -(defun org-html-list-of-tables (info) - "Build a list of tables. -INFO is a plist used as a communication channel. Return the list -of tables as a string, or nil if it is empty." - (let ((lol-entries (org-export-collect-tables info))) - (when lol-entries - (concat "
\n" - (let ((top-level (plist-get info :html-toplevel-hlevel))) - (format "%s\n" - top-level - (org-html--translate "List of Tables" info) - top-level)) - "
\n
    \n" - (let ((count 0) - (initial-fmt (format "%s" - (org-html--translate "Table %d:" info)))) - (mapconcat - (lambda (entry) - (let ((label (and (org-element-property :name entry) - (org-export-get-reference entry info))) - (title (org-trim - (org-export-data - (or (org-export-get-caption entry t) - (org-export-get-caption entry)) - info)))) - (concat - "
  • " - (if (not label) - (concat (format initial-fmt (cl-incf count)) - " " - title) - (format "%s %s" - label - (format initial-fmt (cl-incf count)) - title)) - "
  • "))) - lol-entries "\n")) - "\n
\n
\n
")))) - - -;;; Transcode Functions - -;;;; Bold - -(defun org-html-bold (_bold contents info) - "Transcode BOLD from Org to HTML. -CONTENTS is the text with bold markup. INFO is a plist holding -contextual information." - (format (or (cdr (assq 'bold (plist-get info :html-text-markup-alist))) "%s") - contents)) - -;;;; Center Block - -(defun org-html-center-block (_center-block contents _info) - "Transcode a CENTER-BLOCK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (format "
\n%s
" contents)) - -;;;; Clock - -(defun org-html-clock (clock _contents _info) - "Transcode a CLOCK element from Org to HTML. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (format "

- -%s %s%s - -

" - org-clock-string - (org-timestamp-translate (org-element-property :value clock)) - (let ((time (org-element-property :duration clock))) - (and time (format " (%s)" time))))) - -;;;; Code - -(defun org-html-code (code _contents info) - "Transcode CODE from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format (or (cdr (assq 'code (plist-get info :html-text-markup-alist))) "%s") - (org-html-encode-plain-text (org-element-property :value code)))) - -;;;; Drawer - -(defun org-html-drawer (drawer contents info) - "Transcode a DRAWER element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (funcall (plist-get info :html-format-drawer-function) - (org-element-property :drawer-name drawer) - contents)) - -;;;; Dynamic Block - -(defun org-html-dynamic-block (_dynamic-block contents _info) - "Transcode a DYNAMIC-BLOCK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information. See `org-export-data'." - contents) - -;;;; Entity - -(defun org-html-entity (entity _contents _info) - "Transcode an ENTITY object from Org to HTML. -CONTENTS are the definition itself. INFO is a plist holding -contextual information." - (org-element-property :html entity)) - -;;;; Example Block - -(defun org-html-example-block (example-block _contents info) - "Transcode a EXAMPLE-BLOCK element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let ((attributes (org-export-read-attribute :attr_html example-block))) - (if (plist-get attributes :textarea) - (org-html--textarea-block example-block) - (format "
\n%s
" - (let* ((name (org-element-property :name example-block)) - (a (org-html--make-attribute-string - (if (or (not name) (plist-member attributes :id)) - attributes - (plist-put attributes :id name))))) - (if (org-string-nw-p a) (concat " " a) "")) - (org-html-format-code example-block info))))) - -;;;; Export Snippet - -(defun org-html-export-snippet (export-snippet _contents _info) - "Transcode a EXPORT-SNIPPET object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (when (eq (org-export-snippet-backend export-snippet) 'html) - (org-element-property :value export-snippet))) - -;;;; Export Block - -(defun org-html-export-block (export-block _contents _info) - "Transcode a EXPORT-BLOCK element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (string= (org-element-property :type export-block) "HTML") - (org-remove-indentation (org-element-property :value export-block)))) - -;;;; Fixed Width - -(defun org-html-fixed-width (fixed-width _contents _info) - "Transcode a FIXED-WIDTH element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (format "
\n%s
" - (org-html-do-format-code - (org-remove-indentation - (org-element-property :value fixed-width))))) - -;;;; Footnote Reference - -(defun org-html-footnote-reference (footnote-reference _contents info) - "Transcode a FOOTNOTE-REFERENCE element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (concat - ;; Insert separator between two footnotes in a row. - (let ((prev (org-export-get-previous-element footnote-reference info))) - (when (eq (org-element-type prev) 'footnote-reference) - (plist-get info :html-footnote-separator))) - (let* ((n (org-export-get-footnote-number footnote-reference info)) - (id (format "fnr.%d%s" - n - (if (org-export-footnote-first-reference-p - footnote-reference info) - "" - ".100")))) - (format - (plist-get info :html-footnote-format) - (org-html--anchor - id n (format " class=\"footref\" href=\"#fn.%d\"" n) info))))) - -;;;; Headline - -(defun org-html-headline (headline contents info) - "Transcode a HEADLINE element from Org to HTML. -CONTENTS holds the contents of the headline. INFO is a plist -holding contextual information." - (unless (org-element-property :footnote-section-p headline) - (let* ((numberedp (org-export-numbered-headline-p headline info)) - (numbers (org-export-get-headline-number headline info)) - (level (+ (org-export-get-relative-level headline info) - (1- (plist-get info :html-toplevel-hlevel)))) - (todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword headline))) - (and todo (org-export-data todo info))))) - (todo-type (and todo (org-element-property :todo-type headline))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority headline))) - (text (org-export-data (org-element-property :title headline) info)) - (tags (and (plist-get info :with-tags) - (org-export-get-tags headline info))) - (full-text (funcall (plist-get info :html-format-headline-function) - todo todo-type priority text tags info)) - (contents (or contents "")) - (id (or (org-element-property :CUSTOM_ID headline) - (org-export-get-reference headline info))) - (formatted-text - (if (plist-get info :html-self-link-headlines) - (format "%s" id full-text) - full-text))) - (if (org-export-low-level-p headline info) - ;; This is a deep sub-tree: export it as a list item. - (let* ((html-type (if numberedp "ol" "ul"))) - (concat - (and (org-export-first-sibling-p headline info) - (apply #'format "<%s class=\"org-%s\">\n" - (make-list 2 html-type))) - (org-html-format-list-item - contents (if numberedp 'ordered 'unordered) - nil info nil - (concat (org-html--anchor id nil nil info) formatted-text)) "\n" - (and (org-export-last-sibling-p headline info) - (format "\n" html-type)))) - ;; Standard headline. Export it as a section. - (let ((extra-class - (org-element-property :HTML_CONTAINER_CLASS headline)) - (headline-class - (org-element-property :HTML_HEADLINE_CLASS headline)) - (first-content (car (org-element-contents headline)))) - (format "<%s id=\"%s\" class=\"%s\">%s%s\n" - (org-html--container headline info) - (concat "outline-container-" - (org-export-get-reference headline info)) - (concat (format "outline-%d" level) - (and extra-class " ") - extra-class) - (format "\n%s\n" - level - id - (if (not headline-class) "" - (format " class=\"%s\"" headline-class)) - (concat - (and numberedp - (format - "%s " - level - (mapconcat #'number-to-string numbers "."))) - formatted-text) - level) - ;; When there is no section, pretend there is an - ;; empty one to get the correct
%s" lang label code))) - -;;;; Inlinetask - -(defun org-html-inlinetask (inlinetask contents info) - "Transcode an INLINETASK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword inlinetask))) - (and todo (org-export-data todo info))))) - (todo-type (and todo (org-element-property :todo-type inlinetask))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority inlinetask))) - (text (org-export-data (org-element-property :title inlinetask) info)) - (tags (and (plist-get info :with-tags) - (org-export-get-tags inlinetask info)))) - (funcall (plist-get info :html-format-inlinetask-function) - todo todo-type priority text tags contents info))) - -(defun org-html-format-inlinetask-default-function - (todo todo-type priority text tags contents info) - "Default format function for inlinetasks. -See `org-html-format-inlinetask-function' for details." - (format "
\n%s%s\n%s
" - (org-html-format-headline-default-function - todo todo-type priority text tags info) - (org-html-close-tag "br" nil info) - contents)) - -;;;; Italic - -(defun org-html-italic (_italic contents info) - "Transcode ITALIC from Org to HTML. -CONTENTS is the text with italic markup. INFO is a plist holding -contextual information." - (format - (or (cdr (assq 'italic (plist-get info :html-text-markup-alist))) "%s") - contents)) - -;;;; Item - -(defun org-html-checkbox (checkbox info) - "Format CHECKBOX into HTML. -INFO is a plist holding contextual information. See -`org-html-checkbox-type' for customization options." - (cdr (assq checkbox - (cdr (assq (plist-get info :html-checkbox-type) - org-html-checkbox-types))))) - -(defun org-html-format-list-item (contents type checkbox info - &optional term-counter-id - headline) - "Format a list item into HTML." - (let ((class (if checkbox - (format " class=\"%s\"" - (symbol-name checkbox)) "")) - (checkbox (concat (org-html-checkbox checkbox info) - (and checkbox " "))) - (br (org-html-close-tag "br" nil info)) - (extra-newline (if (and (org-string-nw-p contents) headline) "\n" ""))) - (concat - (pcase type - (`ordered - (let* ((counter term-counter-id) - (extra (if counter (format " value=\"%s\"" counter) ""))) - (concat - (format "" class extra) - (when headline (concat headline br))))) - (`unordered - (let* ((id term-counter-id) - (extra (if id (format " id=\"%s\"" id) ""))) - (concat - (format "" class extra) - (when headline (concat headline br))))) - (`descriptive - (let* ((term term-counter-id)) - (setq term (or term "(no term)")) - ;; Check-boxes in descriptive lists are associated to tag. - (concat (format "%s" - class (concat checkbox term)) - "
")))) - (unless (eq type 'descriptive) checkbox) - extra-newline - (and (org-string-nw-p contents) (org-trim contents)) - extra-newline - (pcase type - (`ordered "") - (`unordered "") - (`descriptive "
"))))) - -(defun org-html-item (item contents info) - "Transcode an ITEM element from Org to HTML. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (let* ((plain-list (org-export-get-parent item)) - (type (org-element-property :type plain-list)) - (counter (org-element-property :counter item)) - (checkbox (org-element-property :checkbox item)) - (tag (let ((tag (org-element-property :tag item))) - (and tag (org-export-data tag info))))) - (org-html-format-list-item - contents type checkbox info (or tag counter)))) - -;;;; Keyword - -(defun org-html-keyword (keyword _contents info) - "Transcode a KEYWORD element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((key (org-element-property :key keyword)) - (value (org-element-property :value keyword))) - (cond - ((string= key "HTML") value) - ((string= key "TOC") - (let ((case-fold-search t)) - (cond - ((string-match "\\" value) - (let ((depth (and (string-match "\\<[0-9]+\\>" value) - (string-to-number (match-string 0 value)))) - (scope - (cond - ((string-match ":target +\\(\".+?\"\\|\\S-+\\)" value) ;link - (org-export-resolve-link - (org-strip-quotes (match-string 1 value)) info)) - ((string-match-p "\\" value) keyword)))) ;local - (org-html-toc depth info scope))) - ((string= "listings" value) (org-html-list-of-listings info)) - ((string= "tables" value) (org-html-list-of-tables info)))))))) - -;;;; Latex Environment - -(defun org-html-format-latex (latex-frag processing-type info) - "Format a LaTeX fragment LATEX-FRAG into HTML. -PROCESSING-TYPE designates the tool used for conversion. It can -be `mathjax', `verbatim', nil, t or symbols in -`org-preview-latex-process-alist', e.g., `dvipng', `dvisvgm' or -`imagemagick'. See `org-html-with-latex' for more information. -INFO is a plist containing export properties." - (let ((cache-relpath "") (cache-dir "")) - (unless (eq processing-type 'mathjax) - (let ((bfn (or (buffer-file-name) - (make-temp-name - (expand-file-name "latex" temporary-file-directory)))) - (latex-header - (let ((header (plist-get info :latex-header))) - (and header - (concat (mapconcat - (lambda (line) (concat "#+LATEX_HEADER: " line)) - (org-split-string header "\n") - "\n") - "\n"))))) - (setq cache-relpath - (concat (file-name-as-directory org-preview-latex-image-directory) - (file-name-sans-extension - (file-name-nondirectory bfn))) - cache-dir (file-name-directory bfn)) - ;; Re-create LaTeX environment from original buffer in - ;; temporary buffer so that dvipng/imagemagick can properly - ;; turn the fragment into an image. - (setq latex-frag (concat latex-header latex-frag)))) - (with-temp-buffer - (insert latex-frag) - (org-format-latex cache-relpath nil nil cache-dir nil - "Creating LaTeX Image..." nil processing-type) - (buffer-string)))) - -(defun org-html--wrap-latex-environment (contents _ &optional caption label) - "Wrap CONTENTS string within appropriate environment for equations. -When optional arguments CAPTION and LABEL are given, use them for -caption and \"id\" attribute." - (format "\n\n%s%s\n
" - ;; ID. - (if (org-string-nw-p label) (format " id=\"%s\"" label) "") - ;; Contents. - (format "\n%s\n" contents) - ;; Caption. - (if (not (org-string-nw-p caption)) "" - (format "\n\n%s\n" - caption)))) - -(defun org-html--math-environment-p (element &optional _) - "Non-nil when ELEMENT is a LaTeX math environment. -Math environments match the regular expression defined in -`org-latex-math-environments-re'. This function is meant to be -used as a predicate for `org-export-get-ordinal' or a value to -`org-html-standalone-image-predicate'." - (string-match-p org-latex-math-environments-re - (org-element-property :value element))) - -(defun org-html--latex-environment-numbered-p (element) - "Non-nil when ELEMENT contains a numbered LaTeX math environment. -Starred and \"displaymath\" environments are not numbered." - (not (string-match-p "\\`[ \t]*\\\\begin{\\(.*\\*\\|displaymath\\)}" - (org-element-property :value element)))) - -(defun org-html--unlabel-latex-environment (latex-frag) - "Change environment in LATEX-FRAG string to an unnumbered one. -For instance, change an 'equation' environment to 'equation*'." - (replace-regexp-in-string - "\\`[ \t]*\\\\begin{\\([^*]+?\\)}" - "\\1*" - (replace-regexp-in-string "^[ \t]*\\\\end{\\([^*]+?\\)}[ \r\t\n]*\\'" - "\\1*" - latex-frag nil nil 1) - nil nil 1)) - -(defun org-html-latex-environment (latex-environment _contents info) - "Transcode a LATEX-ENVIRONMENT element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((processing-type (plist-get info :with-latex)) - (latex-frag (org-remove-indentation - (org-element-property :value latex-environment))) - (attributes (org-export-read-attribute :attr_html latex-environment)) - (label (and (org-element-property :name latex-environment) - (org-export-get-reference latex-environment info))) - (caption (and (org-html--latex-environment-numbered-p latex-environment) - (number-to-string - (org-export-get-ordinal - latex-environment info nil - (lambda (l _) - (and (org-html--math-environment-p l) - (org-html--latex-environment-numbered-p l)))))))) - (cond - ((memq processing-type '(t mathjax)) - (org-html-format-latex - (if (org-string-nw-p label) - (replace-regexp-in-string "\\`.*" - (format "\\&\n\\\\label{%s}" label) - latex-frag) - latex-frag) - 'mathjax info)) - ((assq processing-type org-preview-latex-process-alist) - (let ((formula-link - (org-html-format-latex - (org-html--unlabel-latex-environment latex-frag) - processing-type info))) - (when (and formula-link (string-match "file:\\([^]]*\\)" formula-link)) - (org-html--wrap-latex-environment - (org-html--format-image - (match-string 1 formula-link) attributes info) - info caption label)))) - (t (org-html--wrap-latex-environment latex-frag info caption label))))) - -;;;; Latex Fragment - -(defun org-html-latex-fragment (latex-fragment _contents info) - "Transcode a LATEX-FRAGMENT object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((latex-frag (org-element-property :value latex-fragment)) - (processing-type (plist-get info :with-latex))) - (cond - ((memq processing-type '(t mathjax)) - (org-html-format-latex latex-frag 'mathjax info)) - ((assq processing-type org-preview-latex-process-alist) - (let ((formula-link - (org-html-format-latex latex-frag processing-type info))) - (when (and formula-link (string-match "file:\\([^]]*\\)" formula-link)) - (org-html--format-image (match-string 1 formula-link) nil info)))) - (t latex-frag)))) - -;;;; Line Break - -(defun org-html-line-break (_line-break _contents info) - "Transcode a LINE-BREAK object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (concat (org-html-close-tag "br" nil info) "\n")) - -;;;; Link - -(defun org-html-image-link-filter (data _backend info) - (org-export-insert-image-links data info org-html-inline-image-rules)) - -(defun org-html-inline-image-p (link info) - "Non-nil when LINK is meant to appear as an image. -INFO is a plist used as a communication channel. LINK is an -inline image when it has no description and targets an image -file (see `org-html-inline-image-rules' for more information), or -if its description is a single link targeting an image file." - (if (not (org-element-contents link)) - (org-export-inline-image-p - link (plist-get info :html-inline-image-rules)) - (not - (let ((link-count 0)) - (org-element-map (org-element-contents link) - (cons 'plain-text org-element-all-objects) - (lambda (obj) - (pcase (org-element-type obj) - (`plain-text (org-string-nw-p obj)) - (`link (if (= link-count 1) t - (cl-incf link-count) - (not (org-export-inline-image-p - obj (plist-get info :html-inline-image-rules))))) - (_ t))) - info t))))) - -(defvar org-html-standalone-image-predicate) -(defun org-html-standalone-image-p (element info) - "Non-nil if ELEMENT is a standalone image. - -INFO is a plist holding contextual information. - -An element or object is a standalone image when - - - its type is `paragraph' and its sole content, save for white - spaces, is a link that qualifies as an inline image; - - - its type is `link' and its containing paragraph has no other - content save white spaces. - -Bind `org-html-standalone-image-predicate' to constrain paragraph -further. For example, to check for only captioned standalone -images, set it to: - - (lambda (paragraph) (org-element-property :caption paragraph))" - (let ((paragraph (pcase (org-element-type element) - (`paragraph element) - (`link (org-export-get-parent element))))) - (and (eq (org-element-type paragraph) 'paragraph) - (or (not (fboundp 'org-html-standalone-image-predicate)) - (funcall org-html-standalone-image-predicate paragraph)) - (catch 'exit - (let ((link-count 0)) - (org-element-map (org-element-contents paragraph) - (cons 'plain-text org-element-all-objects) - (lambda (obj) - (when (pcase (org-element-type obj) - (`plain-text (org-string-nw-p obj)) - (`link (or (> (cl-incf link-count) 1) - (not (org-html-inline-image-p obj info)))) - (_ t)) - (throw 'exit nil))) - info nil 'link) - (= link-count 1)))))) - -(defun org-html-link (link desc info) - "Transcode a LINK object from Org to HTML. -DESC is the description part of the link, or the empty string. -INFO is a plist holding contextual information. See -`org-export-data'." - (let* ((link-org-files-as-html-maybe - (lambda (raw-path info) - ;; Treat links to `file.org' as links to `file.html', if - ;; needed. See `org-html-link-org-files-as-html'. - (cond - ((and (plist-get info :html-link-org-files-as-html) - (string= ".org" - (downcase (file-name-extension raw-path ".")))) - (concat (file-name-sans-extension raw-path) "." - (plist-get info :html-extension))) - (t raw-path)))) - (type (org-element-property :type link)) - (raw-path (org-element-property :path link)) - ;; Ensure DESC really exists, or set it to nil. - (desc (org-string-nw-p desc)) - (path - (cond - ((member type '("http" "https" "ftp" "mailto" "news")) - (url-encode-url (concat type ":" raw-path))) - ((string= type "file") - ;; During publishing, turn absolute file names belonging - ;; to base directory into relative file names. Otherwise, - ;; append "file" protocol to absolute file name. - (setq raw-path - (org-export-file-uri - (org-publish-file-relative-name raw-path info))) - ;; Possibly append `:html-link-home' to relative file - ;; name. - (let ((home (and (plist-get info :html-link-home) - (org-trim (plist-get info :html-link-home))))) - (when (and home - (plist-get info :html-link-use-abs-url) - (file-name-absolute-p raw-path)) - (setq raw-path (concat (file-name-as-directory home) raw-path)))) - ;; Maybe turn ".org" into ".html". - (setq raw-path (funcall link-org-files-as-html-maybe raw-path info)) - ;; Add search option, if any. A search option can be - ;; relative to a custom-id, a headline title, a name or - ;; a target. - (let ((option (org-element-property :search-option link))) - (if (not option) raw-path - (let ((path (org-element-property :path link))) - (concat raw-path - "#" - (org-publish-resolve-external-link option path t)))))) - (t raw-path))) - (attributes-plist - (org-combine-plists - ;; Extract attributes from parent's paragraph. HACK: Only - ;; do this for the first link in parent (inner image link - ;; for inline images). This is needed as long as - ;; attributes cannot be set on a per link basis. - (let* ((parent (org-export-get-parent-element link)) - (link (let ((container (org-export-get-parent link))) - (if (and (eq 'link (org-element-type container)) - (org-html-inline-image-p link info)) - container - link)))) - (and (eq link (org-element-map parent 'link #'identity info t)) - (org-export-read-attribute :attr_html parent))) - ;; Also add attributes from link itself. Currently, those - ;; need to be added programmatically before `org-html-link' - ;; is invoked, for example, by backends building upon HTML - ;; export. - (org-export-read-attribute :attr_html link))) - (attributes - (let ((attr (org-html--make-attribute-string attributes-plist))) - (if (org-string-nw-p attr) (concat " " attr) "")))) - (cond - ;; Link type is handled by a special function. - ((org-export-custom-protocol-maybe link desc 'html)) - ;; Image file. - ((and (plist-get info :html-inline-images) - (org-export-inline-image-p - link (plist-get info :html-inline-image-rules))) - (org-html--format-image path attributes-plist info)) - ;; Radio target: Transcode target's contents and use them as - ;; link's description. - ((string= type "radio") - (let ((destination (org-export-resolve-radio-link link info))) - (if (not destination) desc - (format "%s" - (org-export-get-reference destination info) - attributes - desc)))) - ;; Links pointing to a headline: Find destination and build - ;; appropriate referencing command. - ((member type '("custom-id" "fuzzy" "id")) - (let ((destination (if (string= type "fuzzy") - (org-export-resolve-fuzzy-link link info) - (org-export-resolve-id-link link info)))) - (pcase (org-element-type destination) - ;; ID link points to an external file. - (`plain-text - (let ((fragment (concat "ID-" path)) - ;; Treat links to ".org" files as ".html", if needed. - (path (funcall link-org-files-as-html-maybe - destination info))) - (format "%s" - path fragment attributes (or desc destination)))) - ;; Fuzzy link points nowhere. - (`nil - (format "%s" - (or desc - (org-export-data - (org-element-property :raw-link link) info)))) - ;; Link points to a headline. - (`headline - (let ((href (or (org-element-property :CUSTOM_ID destination) - (org-export-get-reference destination info))) - ;; What description to use? - (desc - ;; Case 1: Headline is numbered and LINK has no - ;; description. Display section number. - (if (and (org-export-numbered-headline-p destination info) - (not desc)) - (mapconcat #'number-to-string - (org-export-get-headline-number - destination info) ".") - ;; Case 2: Either the headline is un-numbered or - ;; LINK has a custom description. Display LINK's - ;; description or headline's title. - (or desc - (org-export-data - (org-element-property :title destination) info))))) - (format "%s" href attributes desc))) - ;; Fuzzy link points to a target or an element. - (_ - (if (and destination - (memq (plist-get info :with-latex) '(mathjax t)) - (eq 'latex-environment (org-element-type destination)) - (eq 'math (org-latex--environment-type destination))) - ;; Caption and labels are introduced within LaTeX - ;; environment. Use "eqref" macro to refer to those in - ;; the document. - (format "\\eqref{%s}" - (org-export-get-reference destination info)) - (let* ((ref (org-export-get-reference destination info)) - (org-html-standalone-image-predicate - #'org-html--has-caption-p) - (counter-predicate - (if (eq 'latex-environment (org-element-type destination)) - #'org-html--math-environment-p - #'org-html--has-caption-p)) - (number - (cond - (desc nil) - ((org-html-standalone-image-p destination info) - (org-export-get-ordinal - (org-element-map destination 'link #'identity info t) - info 'link 'org-html-standalone-image-p)) - (t (org-export-get-ordinal - destination info nil counter-predicate)))) - (desc - (cond (desc) - ((not number) "No description for this link") - ((numberp number) (number-to-string number)) - (t (mapconcat #'number-to-string number "."))))) - (format "%s" ref attributes desc))))))) - ;; Coderef: replace link with the reference name or the - ;; equivalent line number. - ((string= type "coderef") - (let ((fragment (concat "coderef-" (org-html-encode-plain-text path)))) - (format "%s" - fragment - (format "class=\"coderef\" onmouseover=\"CodeHighlightOn(this, \ -'%s');\" onmouseout=\"CodeHighlightOff(this, '%s');\"" - fragment fragment) - attributes - (format (org-export-get-coderef-format path desc) - (org-export-resolve-coderef path info))))) - ;; External link with a description part. - ((and path desc) - (format "%s" - (org-html-encode-plain-text path) - attributes - desc)) - ;; External link without a description part. - (path - (let ((path (org-html-encode-plain-text path))) - (format "%s" path attributes path))) - ;; No path, only description. Try to do something useful. - (t - (format "%s" desc))))) - -;;;; Node Property - -(defun org-html-node-property (node-property _contents _info) - "Transcode a NODE-PROPERTY element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format "%s:%s" - (org-element-property :key node-property) - (let ((value (org-element-property :value node-property))) - (if value (concat " " value) "")))) - -;;;; Paragraph - -(defun org-html-paragraph (paragraph contents info) - "Transcode a PARAGRAPH element from Org to HTML. -CONTENTS is the contents of the paragraph, as a string. INFO is -the plist used as a communication channel." - (let* ((parent (org-export-get-parent paragraph)) - (parent-type (org-element-type parent)) - (style '((footnote-definition " class=\"footpara\"") - (org-data " class=\"footpara\""))) - (attributes (org-html--make-attribute-string - (org-export-read-attribute :attr_html paragraph))) - (extra (or (cadr (assq parent-type style)) ""))) - (cond - ((and (eq parent-type 'item) - (not (org-export-get-previous-element paragraph info)) - (let ((followers (org-export-get-next-element paragraph info 2))) - (and (not (cdr followers)) - (memq (org-element-type (car followers)) '(nil plain-list))))) - ;; First paragraph in an item has no tag if it is alone or - ;; followed, at most, by a sub-list. - contents) - ((org-html-standalone-image-p paragraph info) - ;; Standalone image. - (let ((caption - (let ((raw (org-export-data - (org-export-get-caption paragraph) info)) - (org-html-standalone-image-predicate - #'org-html--has-caption-p)) - (if (not (org-string-nw-p raw)) raw - (concat "" - (format (org-html--translate "Figure %d:" info) - (org-export-get-ordinal - (org-element-map paragraph 'link - #'identity info t) - info nil #'org-html-standalone-image-p)) - " " - raw)))) - (label (and (org-element-property :name paragraph) - (org-export-get-reference paragraph info)))) - (org-html--wrap-image contents info caption label))) - ;; Regular paragraph. - (t (format "\n%s

" - (if (org-string-nw-p attributes) - (concat " " attributes) "") - extra contents))))) - -;;;; Plain List - -(defun org-html-plain-list (plain-list contents _info) - "Transcode a PLAIN-LIST element from Org to HTML. -CONTENTS is the contents of the list. INFO is a plist holding -contextual information." - (let* ((type (pcase (org-element-property :type plain-list) - (`ordered "ol") - (`unordered "ul") - (`descriptive "dl") - (other (error "Unknown HTML list type: %s" other)))) - (class (format "org-%s" type)) - (attributes (org-export-read-attribute :attr_html plain-list))) - (format "<%s %s>\n%s" - type - (org-html--make-attribute-string - (plist-put attributes :class - (org-trim - (mapconcat #'identity - (list class (plist-get attributes :class)) - " ")))) - contents - type))) - -;;;; Plain Text - -(defun org-html-convert-special-strings (string) - "Convert special characters in STRING to HTML." - (dolist (a org-html-special-string-regexps string) - (let ((re (car a)) - (rpl (cdr a))) - (setq string (replace-regexp-in-string re rpl string t))))) - -(defun org-html-encode-plain-text (text) - "Convert plain text characters from TEXT to HTML equivalent. -Possible conversions are set in `org-html-protect-char-alist'." - (dolist (pair org-html-protect-char-alist text) - (setq text (replace-regexp-in-string (car pair) (cdr pair) text t t)))) - -(defun org-html-plain-text (text info) - "Transcode a TEXT string from Org to HTML. -TEXT is the string to transcode. INFO is a plist holding -contextual information." - (let ((output text)) - ;; Protect following characters: <, >, &. - (setq output (org-html-encode-plain-text output)) - ;; Handle smart quotes. Be sure to provide original string since - ;; OUTPUT may have been modified. - (when (plist-get info :with-smart-quotes) - (setq output (org-export-activate-smart-quotes output :html info text))) - ;; Handle special strings. - (when (plist-get info :with-special-strings) - (setq output (org-html-convert-special-strings output))) - ;; Handle break preservation if required. - (when (plist-get info :preserve-breaks) - (setq output - (replace-regexp-in-string - "\\(\\\\\\\\\\)?[ \t]*\n" - (concat (org-html-close-tag "br" nil info) "\n") output))) - ;; Return value. - output)) - - -;; Planning - -(defun org-html-planning (planning _contents info) - "Transcode a PLANNING element from Org to HTML. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (format - "

%s

" - (org-trim - (mapconcat - (lambda (pair) - (let ((timestamp (cdr pair))) - (when timestamp - (let ((string (car pair))) - (format "%s \ -%s " - string - (org-html-plain-text (org-timestamp-translate timestamp) - info)))))) - `((,org-closed-string . ,(org-element-property :closed planning)) - (,org-deadline-string . ,(org-element-property :deadline planning)) - (,org-scheduled-string . ,(org-element-property :scheduled planning))) - "")))) - -;;;; Property Drawer - -(defun org-html-property-drawer (_property-drawer contents _info) - "Transcode a PROPERTY-DRAWER element from Org to HTML. -CONTENTS holds the contents of the drawer. INFO is a plist -holding contextual information." - (and (org-string-nw-p contents) - (format "
\n%s
" contents))) - -;;;; Quote Block - -(defun org-html-quote-block (quote-block contents _info) - "Transcode a QUOTE-BLOCK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (format "\n%s" - (let* ((name (org-element-property :name quote-block)) - (attributes (org-export-read-attribute :attr_html quote-block)) - (a (org-html--make-attribute-string - (if (or (not name) (plist-member attributes :id)) - attributes - (plist-put attributes :id name))))) - (if (org-string-nw-p a) (concat " " a) "")) - contents)) - -;;;; Section - -(defun org-html-section (section contents info) - "Transcode a SECTION element from Org to HTML. -CONTENTS holds the contents of the section. INFO is a plist -holding contextual information." - (let ((parent (org-export-get-parent-headline section))) - ;; Before first headline: no container, just return CONTENTS. - (if (not parent) contents - ;; Get div's class and id references. - (let* ((class-num (+ (org-export-get-relative-level parent info) - (1- (plist-get info :html-toplevel-hlevel)))) - (section-number - (and (org-export-numbered-headline-p parent info) - (mapconcat - #'number-to-string - (org-export-get-headline-number parent info) "-")))) - ;; Build return value. - (format "
\n%s
\n" - class-num - (or (org-element-property :CUSTOM_ID parent) - section-number - (org-export-get-reference parent info)) - (or contents "")))))) - -;;;; Radio Target - -(defun org-html-radio-target (radio-target text info) - "Transcode a RADIO-TARGET object from Org to HTML. -TEXT is the text of the target. INFO is a plist holding -contextual information." - (let ((ref (org-export-get-reference radio-target info))) - (org-html--anchor ref text nil info))) - -;;;; Special Block - -(defun org-html-special-block (special-block contents info) - "Transcode a SPECIAL-BLOCK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((block-type (org-element-property :type special-block)) - (html5-fancy (and (org-html--html5-fancy-p info) - (member block-type org-html-html5-elements))) - (attributes (org-export-read-attribute :attr_html special-block))) - (unless html5-fancy - (let ((class (plist-get attributes :class))) - (setq attributes (plist-put attributes :class - (if class (concat class " " block-type) - block-type))))) - (let* ((contents (or contents "")) - (name (org-element-property :name special-block)) - (a (org-html--make-attribute-string - (if (or (not name) (plist-member attributes :id)) - attributes - (plist-put attributes :id name)))) - (str (if (org-string-nw-p a) (concat " " a) ""))) - (if html5-fancy - (format "<%s%s>\n%s" block-type str contents block-type) - (format "\n%s\n" str contents))))) - -;;;; Src Block - -(defun org-html-src-block (src-block _contents info) - "Transcode a SRC-BLOCK element from Org to HTML. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (if (org-export-read-attribute :attr_html src-block :textarea) - (org-html--textarea-block src-block) - (let* ((lang (org-element-property :language src-block)) - (code (org-html-format-code src-block info)) - (label (let ((lbl (and (org-element-property :name src-block) - (org-export-get-reference src-block info)))) - (if lbl (format " id=\"%s\"" lbl) ""))) - (klipsify (and (plist-get info :html-klipsify-src) - (member lang '("javascript" "js" - "ruby" "scheme" "clojure" "php" "html"))))) - (if (not lang) (format "
\n%s
" label code) - (format "
\n%s%s\n
" - ;; Build caption. - (let ((caption (org-export-get-caption src-block))) - (if (not caption) "" - (let ((listing-number - (format - "%s " - (format - (org-html--translate "Listing %d:" info) - (org-export-get-ordinal - src-block info nil #'org-html--has-caption-p))))) - (format "" - listing-number - (org-trim (org-export-data caption info)))))) - ;; Contents. - (if klipsify - (format "
%s
" - lang - label - (if (string= lang "html") - " data-editor-type=\"html\"" - "") - code) - (format "
%s
" - lang label code))))))) - -;;;; Statistics Cookie - -(defun org-html-statistics-cookie (statistics-cookie _contents _info) - "Transcode a STATISTICS-COOKIE object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((cookie-value (org-element-property :value statistics-cookie))) - (format "%s" cookie-value))) - -;;;; Strike-Through - -(defun org-html-strike-through (_strike-through contents info) - "Transcode STRIKE-THROUGH from Org to HTML. -CONTENTS is the text with strike-through markup. INFO is a plist -holding contextual information." - (format - (or (cdr (assq 'strike-through (plist-get info :html-text-markup-alist))) - "%s") - contents)) - -;;;; Subscript - -(defun org-html-subscript (_subscript contents _info) - "Transcode a SUBSCRIPT object from Org to HTML. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "%s" contents)) - -;;;; Superscript - -(defun org-html-superscript (_superscript contents _info) - "Transcode a SUPERSCRIPT object from Org to HTML. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "%s" contents)) - -;;;; Table Cell - -(defun org-html-table-cell (table-cell contents info) - "Transcode a TABLE-CELL element from Org to HTML. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (let* ((table-row (org-export-get-parent table-cell)) - (table (org-export-get-parent-table table-cell)) - (cell-attrs - (if (not (plist-get info :html-table-align-individual-fields)) "" - (format (if (and (boundp 'org-html-format-table-no-css) - org-html-format-table-no-css) - " align=\"%s\"" " class=\"org-%s\"") - (org-export-table-cell-alignment table-cell info))))) - (when (or (not contents) (string= "" (org-trim contents))) - (setq contents " ")) - (cond - ((and (org-export-table-has-header-p table info) - (= 1 (org-export-table-row-group table-row info))) - (let ((header-tags (plist-get info :html-table-header-tags))) - (concat "\n" (format (car header-tags) "col" cell-attrs) - contents - (cdr header-tags)))) - ((and (plist-get info :html-table-use-header-tags-for-first-column) - (zerop (cdr (org-export-table-cell-address table-cell info)))) - (let ((header-tags (plist-get info :html-table-header-tags))) - (concat "\n" (format (car header-tags) "row" cell-attrs) - contents - (cdr header-tags)))) - (t (let ((data-tags (plist-get info :html-table-data-tags))) - (concat "\n" (format (car data-tags) cell-attrs) - contents - (cdr data-tags))))))) - -;;;; Table Row - -(defun org-html-table-row (table-row contents info) - "Transcode a TABLE-ROW element from Org to HTML. -CONTENTS is the contents of the row. INFO is a plist used as a -communication channel." - ;; Rules are ignored since table separators are deduced from - ;; borders of the current row. - (when (eq (org-element-property :type table-row) 'standard) - (let* ((group (org-export-table-row-group table-row info)) - (number (org-export-table-row-number table-row info)) - (start-group-p - (org-export-table-row-starts-rowgroup-p table-row info)) - (end-group-p - (org-export-table-row-ends-rowgroup-p table-row info)) - (topp (and (equal start-group-p '(top)) - (equal end-group-p '(below top)))) - (bottomp (and (equal start-group-p '(above)) - (equal end-group-p '(bottom above)))) - (row-open-tag - (pcase (plist-get info :html-table-row-open-tag) - ((and accessor (pred functionp)) - (funcall accessor - number group start-group-p end-group-p topp bottomp)) - (accessor accessor))) - (row-close-tag - (pcase (plist-get info :html-table-row-close-tag) - ((and accessor (pred functionp)) - (funcall accessor - number group start-group-p end-group-p topp bottomp)) - (accessor accessor))) - (group-tags - (cond - ;; Row belongs to second or subsequent groups. - ((not (= 1 group)) '("" . "\n")) - ;; Row is from first group. Table has >=1 groups. - ((org-export-table-has-header-p - (org-export-get-parent-table table-row) info) - '("" . "\n")) - ;; Row is from first and only group. - (t '("" . "\n"))))) - (concat (and start-group-p (car group-tags)) - (concat "\n" - row-open-tag - contents - "\n" - row-close-tag) - (and end-group-p (cdr group-tags)))))) - -;;;; Table - -(defun org-html-table-first-row-data-cells (table info) - "Transcode the first row of TABLE. -INFO is a plist used as a communication channel." - (let ((table-row - (org-element-map table 'table-row - (lambda (row) - (unless (eq (org-element-property :type row) 'rule) row)) - info 'first-match)) - (special-column-p (org-export-table-has-special-column-p table))) - (if (not special-column-p) (org-element-contents table-row) - (cdr (org-element-contents table-row))))) - -(defun org-html-table--table.el-table (table _info) - "Format table.el tables into HTML. -INFO is a plist used as a communication channel." - (when (eq (org-element-property :type table) 'table.el) - (require 'table) - (let ((outbuf (with-current-buffer - (get-buffer-create "*org-export-table*") - (erase-buffer) (current-buffer)))) - (with-temp-buffer - (insert (org-element-property :value table)) - (goto-char 1) - (re-search-forward "^[ \t]*|[^|]" nil t) - (table-generate-source 'html outbuf)) - (with-current-buffer outbuf - (prog1 (org-trim (buffer-string)) - (kill-buffer) ))))) - -(defun org-html-table (table contents info) - "Transcode a TABLE element from Org to HTML. -CONTENTS is the contents of the table. INFO is a plist holding -contextual information." - (if (eq (org-element-property :type table) 'table.el) - ;; "table.el" table. Convert it using appropriate tools. - (org-html-table--table.el-table table info) - ;; Standard table. - (let* ((caption (org-export-get-caption table)) - (number (org-export-get-ordinal - table info nil #'org-html--has-caption-p)) - (attributes - (org-html--make-attribute-string - (org-combine-plists - (and (org-element-property :name table) - (list :id (org-export-get-reference table info))) - (and (not (org-html-html5-p info)) - (plist-get info :html-table-attributes)) - (org-export-read-attribute :attr_html table)))) - (alignspec - (if (bound-and-true-p org-html-format-table-no-css) - "align=\"%s\"" - "class=\"org-%s\"")) - (table-column-specs - (lambda (table info) - (mapconcat - (lambda (table-cell) - (let ((alignment (org-export-table-cell-alignment - table-cell info))) - (concat - ;; Begin a colgroup? - (when (org-export-table-cell-starts-colgroup-p - table-cell info) - "\n") - ;; Add a column. Also specify its alignment. - (format "\n%s" - (org-html-close-tag - "col" (concat " " (format alignspec alignment)) info)) - ;; End a colgroup? - (when (org-export-table-cell-ends-colgroup-p - table-cell info) - "\n")))) - (org-html-table-first-row-data-cells table info) "\n")))) - (format "\n%s\n%s\n%s" - (if (equal attributes "") "" (concat " " attributes)) - (if (not caption) "" - (format (if (plist-get info :html-table-caption-above) - "%s" - "%s") - (concat - "" - (format (org-html--translate "Table %d:" info) number) - " " (org-export-data caption info)))) - (funcall table-column-specs table info) - contents)))) - -;;;; Target - -(defun org-html-target (target _contents info) - "Transcode a TARGET object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let ((ref (org-export-get-reference target info))) - (org-html--anchor ref nil nil info))) - -;;;; Timestamp - -(defun org-html-timestamp (timestamp _contents info) - "Transcode a TIMESTAMP object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let ((value (org-html-plain-text (org-timestamp-translate timestamp) info))) - (format "%s" - (replace-regexp-in-string "--" "–" value)))) - -;;;; Underline - -(defun org-html-underline (_underline contents info) - "Transcode UNDERLINE from Org to HTML. -CONTENTS is the text with underline markup. INFO is a plist -holding contextual information." - (format (or (cdr (assq 'underline (plist-get info :html-text-markup-alist))) - "%s") - contents)) - -;;;; Verbatim - -(defun org-html-verbatim (verbatim _contents info) - "Transcode VERBATIM from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format (or (cdr (assq 'verbatim (plist-get info :html-text-markup-alist))) "%s") - (org-html-encode-plain-text (org-element-property :value verbatim)))) - -;;;; Verse Block - -(defun org-html-verse-block (_verse-block contents info) - "Transcode a VERSE-BLOCK element from Org to HTML. -CONTENTS is verse block contents. INFO is a plist holding -contextual information." - (format "

\n%s

" - ;; Replace leading white spaces with non-breaking spaces. - (replace-regexp-in-string - "^[ \t]+" (lambda (m) (org-html--make-string (length m) " ")) - ;; Replace each newline character with line break. Also - ;; remove any trailing "br" close-tag so as to avoid - ;; duplicates. - (let* ((br (org-html-close-tag "br" nil info)) - (re (format "\\(?:%s\\)?[ \t]*\n" (regexp-quote br)))) - (replace-regexp-in-string re (concat br "\n") contents))))) - - -;;; Filter Functions - -(defun org-html-final-function (contents _backend info) - "Filter to indent the HTML and convert HTML entities." - (with-temp-buffer - (insert contents) - (set-auto-mode t) - (when (plist-get info :html-indent) - (indent-region (point-min) (point-max))) - (buffer-substring-no-properties (point-min) (point-max)))) - - -;;; End-user functions - -;;;###autoload -(defun org-html-export-as-html - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to an HTML buffer. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting buffer should be accessible -through the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only write code -between \"\" and \"\" tags. - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Export is done in a buffer named \"*Org HTML Export*\", which -will be displayed when `org-export-show-temporary-export-buffer' -is non-nil." - (interactive) - (org-export-to-buffer 'html "*Org HTML Export*" - async subtreep visible-only body-only ext-plist - (lambda () (set-auto-mode t)))) - -;;;###autoload -(defun org-html-convert-region-to-html () - "Assume the current region has Org syntax, and convert it to HTML. -This can be used in any buffer. For example, you can write an -itemized list in Org syntax in an HTML buffer and use this command -to convert it." - (interactive) - (org-export-replace-region-by 'html)) - -;;;###autoload -(defun org-html-export-to-html - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to a HTML file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only write code -between \"\" and \"\" tags. - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Return output file's name." - (interactive) - (let* ((extension (concat "." (or (plist-get ext-plist :html-extension) - org-html-extension - "html"))) - (file (org-export-output-file-name extension subtreep)) - (org-export-coding-system org-html-coding-system)) - (org-export-to-file 'html file - async subtreep visible-only body-only ext-plist))) - -;;;###autoload -(defun org-html-publish-to-html (plist filename pub-dir) - "Publish an org file to HTML. - -FILENAME is the filename of the Org file to be published. PLIST -is the property list for the given project. PUB-DIR is the -publishing directory. - -Return output file name." - (org-publish-org-to 'html filename - (concat "." (or (plist-get plist :html-extension) - org-html-extension - "html")) - plist pub-dir)) - - -(provide 'ox-html) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox-html.el ends here diff --git a/elpa/org-9.3.6/ox-html.elc b/elpa/org-9.3.6/ox-html.elc deleted file mode 100644 index b36e4b3ba92365beedd5344d2c000fd56cd501cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131902 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

}Cd;Xf?fbL? zLhWN$V-41lQ;6&N>10n{;&oRjVl9z(+*FA$nDO9jtrABuMw7=l|HZ2x;$M04mM#YU zfmuC21yi34hHGHXgII-)>wcdqu%F$2taLW);mifedv8wzNaImA)|2AOI+Hu#5xBgM zZqkQzwcDkbEzI<|!?9Fd{+)>o_K((*+S!{>#n_zNSjj1vdn`q1{ zhW0~a-a#HzRX5+3gYINovj#TZRsj0|)2WXPjaiSV5ZO;@MAn??khm54zM86(lCzu1 zRiq8Kj-OFE2ky7EMLwm%0XkbYf11f**C{PRAf;8LYI``^bphh)*&Dc3l*Y-`{r&xL zK4h959d`}}uh)_~1>%o^mxECXKDW-sq1HRW4qL|X5H3FKt~U~=P&Fi=XK|Rz(s}+% z=xX2!B%L_e&)%y@ZL>CC^+rA155hpg*vdN9s8EDpCfi=y>w?+S)qr!w(~eV)=X2Uh z+AZ!Im@vli#q_a*lS~J6R9dmo9ErrThMBvc^&W{On}*bi%928pn7HHOhjd9xMFYWzWGxBJah>A6FHFmvSd_H5Q} zoxp%d44XNa@NQ~6=Q9`P!THp>VC6sQ?9FQX;ri}_^}CZTpN{sAx-&uNp}mO-k`Mc3n)wk$JW-jhydox-7$*dlpOqLp+@4cN_kmr+S zM@Y1@%I@%dsw^_`>C8Rau{YD@#sAJ~{mcG&vV-Zb+n=h_oeB3l-Gix;$Fo`<9fO3X zivDRPMDG0l!Hkm7_E`;6m^ZOJv@EAr0x$ykg^t0SE_Y9^qtSy&-Rtb(1)#twY?iT* zTmFi)PAGcjgoL1vW4Dpc^#-$sxV1f5?zgjw{dTg{Y3CAG^O{V=?nuJZ;jr&-NE z?C8y8dH9l3g2Tj4u^x&+%nkqn768oSz#?$27As@tZ7Z`OSBOT`lwCqw4t;1gNCj~n#>Ll z%t;;{3$Fg5F{xmEvE|#5>dfRIi!uhaAqw;5i51`LjM5`on66&L$)*cAr|kZ8(Rt0z zX!T%TS-qGX!pk{B;Q3_H(|Kj}VzMw&>+E&Vi&&UVU(Yn}&eO_dghKv=kkZllnf#B? zvSDS?W*D1=jfZd^!dlT+?7u{ynb-l`5F>QvL4N&U>VS7fr!z~AMqN3ePqCKsxRzPG z%0c(!?6^0p`Fr*zEA@3gZZmJGOzmrb6HnUE6H(BQl7P~WZ8jtPGRQZ`GRil}Whp~d34CXOgyqRo& z)H`Jkvu3bkZzju+_h$~C$5SP{Z)P<+LtuchL<@>WXjXYROVIp`S_uEWIaB?EznUD; ztK-=K^oOseAqWSyS)=)88Y=tmFX~7hY>TwO(Dp@Qa)Ps1U11-n_9!3KCj zrFbGB=Ovz?&XJ@$POgiOGU?2|3p*GuB}=;cfQs@z25y#c*(Br%q@hBy=DATA;C&b% zUrY_c91FqmuBef|^`vt)>aN8PK}8b06qd)qeV0QR+p<$MVR^RH}LPW>iTQN~ZeKnI#KFQ+4R9qNZ~iAI$GP zXlg@?UT|jTu7wR+z|i9RyFM7RE~b2p3TspKdw0un5>X@vWhRwnxe~BlIn8mjO;j_} zgh4L)!c1>I{Zd-mxeK&R@V{w&fgQ`W0K4}u4&Ldw49J2;a7II3+TzsFYgSMK>xnIY z+Innr0#2|>9~=Y)X|V!F2ZYmGQqP@bGRm%K6JDXS6k7UDVyS>Dub(gZ)WKu(p zrc^1|O5{6R{%-W#{^HrxJ8}zUij&NI7gX5Zm#ssr2iT#;CiqqR?R!@krESKnb2NWF z?8wLVMjAmy}N1XInXso*rZ--E0)?|$< z>Gh_^0E>s?@l+S)=X*Qv01*O}ZjwfY9_a5>zY^C*-o$IgA_wtfI5|&UeG5LuT6sdC zX=j8tyTUJVB|9T-6aSdquM}xIMmSx;&FIK{v-qpe7EgfgN&aK6aPCk3u(kPhQc`Pr zG#>0HyW1OyJ67|JXNP)tf9spgd(ZW%RI!2w-81^)!Sj2YkJaI6=Z#*B{Kd}ZhT?B0 zUY-u*SNL%I>CWc!ueKiTCZ*Iurn-b7j^$pbF+IQgba!|A(N5^^M1y#+y|Mnl2Vo9y z>|=;$O+1E}1Nf5TPE$Jk{!&4*`PX`rI>1#|Z`b8EIguBJR4x@#xl~ByQX!Q~rFrij zzu%wi<>w)lj8egn7ADrORaC#GR%axOsVQj;$zp2sR-?C?KGT=|rF^~eQM+_k|31#O zUsr2keD#{zuj|{4_Uj=TO}(l5mW)P#AUPyNm*k;n;RmlQROi%{9Wdifn zZ!00Mj`#EWn2>UDTw?vY2hWn~v!wKh_!Rlt>m`0$h|A+1eBTp%x6zYHCm%E}rUDRT z0&{zq-#6LP&lvT$NPQ%R zQxYh3C3j-=f`3R}Obq-wo?YFJ<<>C&EsEla1!6IyF^^D+$_ao!-YHId!z-n z_zezR{>9hY*=*Z2nV1G)VqqsLuG>zPk}(H#&dibsV|GS48Se*aqAK?B2fO-ht+@(# z)~eMnI4PA&x9*0zwPy)=9ONCkbl6Y6xlwxdEU5#jksJ^^;Ccw5Xl;ORSPq{9O`G^O zMHjw+-IG&1b&_KY77}dG_K`D!wV1VO0f}EXu+|QP_YFFOx2E7ex*8h@MzBM?R#-{^ zx=23;Lp(O+Ac$gd{1*7Jvl71tH5s5k!UNiCTL)=@==%#D0vZq6{h*g|I=5o3sH0;M zN7e>3jN>Ly69)gnX+Us=8XG~lt~hzrX*iGuU&CvZOEt(4m2jRB%=u0sBQ5Rv(-O{Fu=$B?Kbb5t{&ukPYn87ee*5 z%>Wt#Yk@NRn4W=vB>WI$OR*A|fVhZ84J}eBoR>dnQ;|)lplu4)W6*61?3FN_tJTlm z>qnhn+{eHAnkT_{E_NU|SL0os*iZ6>yREJzg;MET{6~L+3wH8Jk~$jT zPg~RZNv_%fHh!|dHUs$!xNOtPPxacSiJ$1WZG-qpzT5HWn{)UNaNnlqNcU!(vYDq^ zuH4b{R%G>igns;I@CSUwe+Ga2XYhvw^`LtCUoQCLJ>ehM9)>$Nc+sUB_zJJAxR|Ism7POHEs1TmCe*3R62`y}yO@HIt2DYe!E%@&jFYk$ zPII%yQ!+k_P_L3~Zp-uF1?`b|tuVYOhnT2MY&r4(;{3R~ytw(zwQqRL zI_3*v*36WX*FqH2`N8`(s}jpd(JPMpGQa9#WNVey$^|{S#IHuX^qZ+CJa2x+(`Ht# zB|))TwX)?4`beSGcC9YXy2X=_!}pTPwQ3htu*py5V(5v~z8Z>#L55%Z_yHg3UyWUA z*P3dn{<{m8F8wnfY7Z`0&4s_Bk~*jA!bhg)Dd|t^qK$zX|7f4S(AO_6u77cn8nt?B zUEgo3#eWT>t*&b74Zf(z_oMfP?0 z1+&-ph4vxK(WVh-YIO!LEtriKMHdx5 z3KgoYP@$DpU_)btRqMNzRrpj5ec*MymAcliz8WFo(#5+Ae|1-LVS`$&4=%3jj~dX= zA2le-H!2H17lbT)bX7%v{=ve6&E-R0RX@CY(HdZF8f-zM4g@zERxoy4Ke10=@}l_% z4T6y%4bc4GUB;2xuKrO-jN>l5tMx1rKy;J_RMPl0+LJ|_FgelzvA`fxhp#S*3Acv#bN`itMOA=ZeSC*GZ zO;IA{K#2kHyTZ>k0@Z!-l#sNP>e)*OG-u%Hea03QTB+vZ@;aMk3SP(*qa^%&28mok zH$Y_9O>{2$d*jp6v!q#6f9YE(L6;k8QY5-1#ATycVIzFqwYVPS_Kbw@A%?zIYt`#F zo=xf21(Jr)`D^-X)2*ZPe!qU5ld$^nU;9B*x^^AVsHd-0O~)>+{R}<5bn8mWUTdT} zbk$d{s=?b@%j$D9X4QvGSp7;pU*B}_p?*#WAN!}jdgEiTMNBVW&-GWg{_6Surph;R z^K01rgf`OgO_$ethVe8SnolFYu9R=I^5bc!_fWoRHj1WpCXS!po4i$0`({|b;{2Pm znASHNNmF%m^c2StRrRJHdReVoeU-`8kKZ2d?i@WlmM;P1L9bZmnh2OsyTy?-$znGPLv6+;+CS9cupef@Wce;=Se`b49=g zpQTTed*nNxT*Ag5(XDwM!{2#^*y!1GG`@N#*_*H8&w4$jroI zdYag!g3kS+Ex9EUk%h{PC9zyy;eOw#ptBBg3XAEgF*WP@41>r3d&LdNf-~iGWzbTv zNLfzOXo-r-d8l{M!kHQ|LK0I+dFBv@2<8Fh?8Voep(HNz-7veTG?sg?2a1DJKfXPH zVn{V%qxLL5Q?lXS051>DfJ9IetsF8!%Kt2Z>*Ua*tmQ}n>sQ7PJX*(ot_(n%k9K#= zG^X=$A0!aK2KN@TKLwtnlZ5*P5JTJuNaBNa(&8RD9 z$99StsyYTMrYPV(72Duzqks_o>Z52E4SXueWn>>@&D#AK3ShVH5O}el*o`CVzFoQ> z?r<^ASWAq)p0GO-U3F=~P5iOV)Et_Pm>Q>KzZq%PVnO4Vi^|d8p@}MVMb^AILfSiOxKmml^6?=x=}|_Ss15=Sr5a! z$<}MQKFqoeQ^Y~4A3=9$LRpyt?6D{*K;pJqNQXMv4c2&Jm|gbZ&R3r&o-5jks{e82~i}1G>oMndq1$Q%EzKiLPq<&&Osg z1~HuPbN;#j8?@7Gi_r~3Ij;o*FG)EA@*M1?xP8?d?!_aS; zc7x%l+&@3vBSUW$b|E)1d6AFH)!eWcO^t2^F`u1@e6?5XP-3&`&X{dBO}SI0(^R@dOVgYlh|v_notT>Y z%{iipTW!uMc6(nZIVQ25uIYIx9Lxq}1SyW;_Oh0GZPYo$wai&Xe0L^z#mr|rJ!n%S zdq|d4rlEY z#%DF(g#JF0WR{$Tb<5J%dF&v>={O13 z{Ap1Tv~;||34VYAb3b&W#1jswMWqQZf>93EGRL z_pxL3ObaRY&4a71BCY(bXA=&ol1_ zE6iTj!dVi!^v;k;dN`hSHWbwFH^-_KZDaC6%_xWi*USOjMfOaJ139AFfw8Sp1i^K& zxqfOKMtm3jm3cYSsBpI=bnm0x*JZM5E`&~qjvkP`bzg>J88*yY8p?$vqYSMP{nPnZ zoCZT>o=MIKy( z=cuzR!gP4XYMv%5sH`Rh^yb#XCT*;Ba3OE^0X_yTCLt_FTt?$dVl#NNk0q<6>#i3T z6AFUxVcQ%5a_x7pku!jB;mkCrFmux#&pVt+SYk*4>xFEFX8@ouS`?cslU<0D?s-5ioi4~QJs#tat*oCvyskoLeq1e#cIcG9 z|3HJX`H9^hlwP;o`?H~LLk|w>?taM9gKB+OL!f~`mJM7_>^@kbKCq|unoTNbcV8b9 zUSY~5Xf7d)wwu9C{sjB@TMDY~tMv@n(#1V4G2sauv zL-dAhp@j{%V4-PkZeB~f3)dyCG_S@DeFhh68a21+YD0lks}+c*)WeKET{AnrM#2DOER;x~k6jW9E*mm_}bbp?h`;LD<8T(hv z&usd~NBRorSpsnadRBG4!;gzAO6^6mTFIuTA1p~#v*{^Ts1WCq+4NLiHmOj4I_}6l zKPW}XEY>KsY3XUMe%)+>X62Oq4yzRI6BcKrb}X)l8Xi|A}c-<%wB<(q}}WdV%iX2*-XufIlq10#PX}QAF^fU+vk$;XkX-w z*)&7@Ih$s#{fY8|rdZx=(q`4n%40A5;zF(mzMF;9>+tPvusm+a@)+vn;Di#gZL;%x z+BC~!fEB)*4Kr=2V8fi*lG!k=rQhOkQ>p&Wem}6^4=;E$Q1#J;t2v0K)V4;J_VPH4 z_xE$h`^3ka_ZF}|cM9$7hIXFLZRZc69acPx++#dn7uxwIw1W%Lob~%BZ-<)SW|rHO zj25qad9OiN_z<2c+;!__Gih_AFif>NlT4)(9o;SD+~u}klxsu;+5zG<1^}EJns;SN z(3yywnbj&Mk8M~$nF%}?L`g3uroq`0qfbfz>9+{!0vtIL-F%Ua;<}NniQ<`xCkRuK z0djSe=@pP>Ucif~H$*az+I7xLdQ@>buIEG&4~h)Tw0@Ji21%Cj%!;FY@UYdQrmh9k zJgpZ~?m&uyHzgE0$IzPY*a+z%H(dBaIn(8Nap(bqBVJBotxf*&ai+RhWpPK8#ePd> zjblo{yqj=kneBZ^X~g_=m=R%)8Ivk;h}}9G4B#LR+x@eywDHc%aT$Tx6UK=T1aX$o zE=?ocTwrqx90|r_bi#XNXO(apwZvKrjVBl*Bvqn+mT)0T>m1rl@^+X4&$h%$-0XRfj6 zJapO9M!_XPFEh<}(7THX9$=f5hTJ2cB=_142yDAC<0#^Z|IgOOZw?TzWKb}|HbDCw zcp;r6TL?URN0!@La*q_aEQVwQHpe6(7l?0$JvQ5-Y&H_61xmKkW;axef(CC*Il@`G zU4S6Fs0HB$H)vE9FWT*IQ``^_d$c;+2@Xe%B%u35z{*=94?eJO^Gx}6+$RKWmM0a9 zvxAa8l7yXO`Qvyj?EE05 zaQ$!Y(lEa`FW|d!ibiLMV{4wO0~J2K>Arep$`Gu|Y0(~p{2ocE#RI<>wPbzb-#;=DyEv$I&t3e&GFT> zFepv!6l=)R)Jb9|1A}y_QRwkS&9tdO58^mj^*|>=giX^Ug1G{*i9w}}eEr9GtI)}as-VxYJ*PrIL!#R=OpDld=_E-~Q5e1J3 z?u8;m%Tn+=3P;wwE!3}D^RH!AZLnc#s~c0mMjsHlcYZSo!P4CG$Z9~jq^4J6!IqzE zEt>L$ZzHi_R0L?Vy*5Zk;hGeU=z5u{@cW#6=}QiDzVjMXDb>DTOEv<$h;f+6UoLBE zPf7Wy`OYQe?XXE42x&hG@Ug*#mtof=pQfb2hn!vqJB0%UBL_LKIQW5Jp_cy>D9AuG z`<~#x{8kn&N1Z(JSLI?d9!`3e#M3R^Yj&b(=`VATx7^i0r!*kch&02g?<5b%-kQlB zh9d$dg+CW+HD5W6t*ZnJI@;j>)R9Vu!CW)!xH>{onLrx+_@`n`#L;=XKez-Wp11tx zY!5G-&|c^I0U8a&dZ{96BOK&NidTMF%?l%R!BK-co`56NlD5i&q|}!6@xo}4XC(R! z<)tl$^{`wc-hq0xLQo}dE)4DkxcGe)DKc5jjVUj1Q<>GDlTl5K0_iBN4!*0pvgO^i zLNYs>UcqB7n6#E)`~NhFfhe8c>6@+mQb^Ov#Z2;g@wtbU^%V)T7g6$$WptFx3&XaJ zG~OTNQ&xVG1LZfOKwBpvdbPDN$#L!V;EYT72rerXtA)y;$yqi1)w?Q_If9%oOP?i6 zu<#LvYB!SVtggJnSse`y4ni;4DuvSXE6GM4$998%5=89~K&lLa)7j%8!2;RWFr`u| zUm0e|LxqY8OuVEZ#Tlpp4~MUNI!`A^JAH*;BE`KXwYN8|Nmx%Z(6H_{zLKFHUOAH? zpJQ6IG#(-C%rupoAaXlr++=q6R>UtJ_GwxtNK0>ao}zbG<=wWDqDc2@V~(m3=;wbN zisU5zhha!@B++{-^)-Gm!6)QTsgo{G2;@7H=P`cF&di~aQ+qVi%mt$_$`C?vqZH*F zsx@rvCTyJ%5GN7Ftip}u>{=;fYUjhE*HDzCY^kV@Kpv)27ut)yppe0YDRqwJa)PnN zL~kjKN3t~T35b>MX30F3?_>8o9K5-i>~s!Es&xYi9=46#l)CyvcR*T3Lg{t}=SMQ4 zOzgn>n9HffN`=^%aLe7%Im}pZ;ymQu8s#bR+K2^#pAQr?zd|taVfv|8tni3&dRBaD z&@rp2UlTaVl!Wc{E~0mnsjYy1OU1{onx`EDHhk0N_AnDipr(3YyU9LoN5sReh!#-I zdiKdlXoa8<#pOKmE4k%?FjE21_^jm0hlX5RAA2bP$aN)|&cVEmf>WRvCQAXuLP(J$ z%IoDliUK*q2aJ*1?#e}>pw%{Qpbvx=c9~OieYbrs5cnbzz_p<7!}F8;DyOFSDY(4a{EX~`rzgI|&FJKuRWN4HRI{9>Oy`(yoeabw zp`&B0NyrNKo||Rv&Tl9!9}dakh`ZdYE!B)Hg3L0=zrV4_pwii~TYm5ShEGWs@*`4Q zYydt%P4Fkz2;UH+_3Sq=5uftgEtbKN`Tdid?ZKUT6Uihg_o4vzu8m-Mq$4!AVP7n8 z1kxK0ja}p_Gq4#;t)-ywPDc}*oQrM{+)>7T$F{Bl>Y!iAJvDu+93{EDRSFvDbwN8~ z7lyN2siv?XkM6MOXq2@aW2Jl(P z!$;WiMUt(BI7G>Dg}5W7;Y*e#bQyN@rMMNTq6_K_VU%Y15Z{!yQwuqV61vf)PZCtq z=jFAvrc%s%!bjq+g(b@tco3bKAx!q2B@HbY*0Mu$pMvP*afs;c^-grtqb>KAtN?u$ zfAbAjY7OOX(HqNgVmRQw3cR8a^RUgpP#lnInBC+azP=0sM1R3k&^3FSn(v8%PYE1XMC3=pWl7}zi_!Jru26SC0=S4as=}oPf1BbL+JF=r`IGYbP9}=MW z+z^*Qd+VMfK}3V>((G_@9DhSSK_q@Nw8-3l*ajjG$U`+vNEyD1aTK#@yAX&S#dPEW zs;iBwV!Z6-B&7?huWc-lTGI>k4umK3eQY=o%efvU-=Isn#Et^tL=MJze&!9k#lS}7x3*j&+e>fX^l}2ErnO~!PUa~_i3}CL^*p&^IF(AzB@hG8b~1g z#AnyzY_2<0bPvKK?wd{5po`T9_AwRFwdrjFX$VioC zmdJ8Mn2(?`L{tmeF{<*E3-zn!$!7UdVrGh5ePt%M3=_4~Pl>n6nG);Q%=6IlrNsKQ ztSseLZ}sD!<+7Y;?4jSfW%ZCZSRo@uE%hg(tmQ3_<*gsflM?%3UiHkwP37?ni|see zBd(#9%9U>v+Hd6MF*_?ttyo?yh4JJ(3}gF@Amrw#D_e@@-z=<~a;3!jO`A_Mzi%pE zn2&O!#PThhkNFhF{wUunjL-ZF!}wa(eruxrR-ye?uKk<`VXpnvLi?+^@vmC@%6^ir zZ*Kmpw4wR0uIAtdFSRe^$>t;E+j{VCv%Dv{UJI*EIrAS(YuyXAl>KBz-;|f{;H=)i zEcE_WXh)udv)jRwu-Fc5yI&zK@i}@Il3OVxp5fu6LMPjylgD#Ak+Y#4l?W{}h+zouSwEr*Wkn`(C|HWMd9~Za;&kZ9E9I?f8vdex7ECgNVns;Z$u9dGnm=4a%99O z?zoV<+Ot)zXLFcm6$HIuZ|ggBGR{S$g!=kt;UIIrblS z$U85qa>y*_n{%qDK;^xYkRSyR|D#_v)dK>Se9tDeP(egU_neA~MocsFP3uxE!yP(X zzforYp#R-y8MD~=!6Ax5*DZ8tVdbQ^H(CkJt<;uRmn$m|X`BEF+8rR0PM)l3)C#*XGYxqLRMI`OP#Bqoj0*KMpD&n8kB0jd3e+ ziH7ya6X)QR);-l%F8s4B4t9SK7h5#1=_&G7EVq2i3(AOr;w34WEhZIww{zD5g$cO_ zE4xGRO7I-xW<*!MI&0F_)j<3O1WU_ zBrReYHT_L1{_ugp&dwjcRNe})wOuJ9EXIpUENuKobe&LwKgXR_h#1@NhInDYk|#9zgKa zg*&@j-;}@Z?(uE1sdj07L`LAUdh^1Mx`Xm2K~{KCD(&HyZ-?FTV}jqf$8TnRE3n%g za#B^pE#nV3VEyt#M3AAP3oYg;LLAL=8W$V8xdO0|7+_H@W)G5)~1$B5s_ z!E4Ggjh|c60u&i!j{#o8Cg7av8;CNck6(A(vtu?F6QgUGw65CH72C!{;QgD) zKJ()-&*XMVRoqg~0NgT3vV-D5k_72TD(F?>YryVRZ#XbNKh`OCKpA-ey>MdV#dz`s zpD_$fm&|;|4&xD>4v#}`D{o7boocO;hDaFyxjfM2wW!tgMKnjlc;0LjV9Z z0qyQav|^X0NnbT%jFU?_Z{^zkKMu~#rf+V9(Kk}cD|QcHapjn+;pNq>BQBM%Yno+2 z7OuJaYn}M#54qFhx9i_<`a_v!KQoXf;f`sc|9 zhFZ`@gyZ0&sT?$}W{WSP;>>7H@a_?P;KDIpjg|p=(GaTzfmjt!; z*|emXnAkV=#1!FS43Lx?Q!1>I?_@&qR7OBwj%z0rU;&{n>95vV%dZ{-B811$_}|sK zwJ@)FKa>!r)TMy)k+q$I{JT1^y7M|Pyt`x^1&fkL-}9Tag^{OCe@wH%uO@I$k-R!D zRf?!pdlepK2sQUG1*qJ!JZhbM>=gswshy90rV!N9IZDJ&z1x{S~f(=#?76r zU!vvsc6zo#uDMYJMq;A-9MW1c6K6c`y(w3f2r}`m}#bSST zzPG$#JoZw!YgKOpc35{pftSMigRL(g6=-TGvSlWBFkl@kNVNL)f7wA+t&}CQj<~*Y^X`+)_21EE@^9~G1Y_8JqhgHi{vP{^py36{gd7kMt*u&k1Wfq)*?IOUN?_3%im}qYl-nysTzor*0G_6JX*}J1a8QE*CYX^IsZZ- zRwG;cwAG+0k=eGmIs}A-ys-#X_z%e^PV8??CM!WJjKe0JCK>kbnCC8|Pm7NUzjeQx z)MOuJabM@CqJr_4i=}vYxmbiOe>S`wzmFwc2#`*JVUVCEy1U3F;5#xyglHu7i#H7U zXSyWl#Sc#xLi<$W#!2f^WU^dE^@vQj5te4F*Bl!yz5FLpxN9 zDFXHoj!v?4t$X9n%9(P*W(9QuD0YuO6grrCA5IEIuI*2~L~+og0qD5iztVd~?q?es zDAOf5Pw>w;SMD2=?0s>fRwfk&?3AZ_Ww2tv*FzZ*U4>E$v$YH)>u|-^(ZL;9CLtMD zO>Js{+sT9VM_)eWCL?8IQ3Be4$m|>i^bp+0NR8zK^^>ITLnK>JE=~0xQ-O!s2qT5* zF)~0lf}Rco2?*^#x%>&@jFsfrDO97Bl2pT;Eb6j?q<2k4IjbQGkYRb!PoeZ{LNvGfETgnz0~M_4I%TDquJ^cQ&$z)dV{K=1)KxDMN& znN*Sz)rn=9_TW-jg=hG})i&q|LZ!iQ`E}iN1V%1@b3W{ShO;%oK8m`}|KLZtduOGS z&om69V+p40d}h6KGKR14iDruF*oym{4$bW9T*BljL9Sr8s{f5_HI0OiwZGNJX1quR zfZHFXS0jhBG%+Dvv;O+^>*b^VxlLv?I2^x5(Z!L4A@avY+S=^uEi&eW!I-hbK0IWT%Q!!9-PkK4-G0$iCRU<@lEe4($lc2S1| zbnc1@JIj>ms1*GG=Yc`Nbi1mz0js{t&7Ki+kgaA$H1QB;8WE~Q+|`?#ywjFBZ-<{TC5YbgSb zjT^b?(0|A+uN@jG`9;L!xp8{--6E$KiTMAl{8U)We@}KQbTNyYx))Ll#4Y^~h=)VJ-gOccFnQTatngiT&5iaDN3+)9pW2Xp;Vojo5dioenO_hyRF9bEY zJ3ZI69Q+14TA-ZwiRyt`CQqNpM4pmO8^p2V0DkB&zS@3>e&;Vc5O~pYXKz$KAD&E& zCylt+@%uZtJpdeR;UL5AiK)hHFd^hn{K#|kRlj?#foeJ6f#el>i$w7^Vyg0NA+!c7 z=kr}Mh%n1;CDHQXDqmKmGGYbW2$Ka%4j-lqXhtL08S$np5FWvYAtLPaiWuiOHR9fKo_JV4-}ECw&+ z9Dt8B8Amz@^o(|7LJKJS1babJ)JN+>jU(?NP!P3!oI6eiRp)2s-JIuxQfT81U~NH& zJ_OuK2xg7hwWC-=%!)_A=2>tBlM>pne{xRxP1kBq$1Kd@`mB=8EO+mCOd%(Z!bL13 zBjaZ+U6!pLG7@)nbWYL>aWhpGwK7B!#^Zk7er%Pp*fONKIA%F~GGG*so1VtP)S|@h zQOJ|W^Su*{*v_keuc?jSf+GMDs-pU}q++?5=`9hGrYQulLzlm-ZD9e&^QjVIiczSae4XBGLlu^K>G>ncE@yCkV z6hm@5M6fyg9?nhL?}QoywIOae1}WfLzsyA;N)hj?#n*@?;pcb41b(NniSI zwPpR`AVqt=RCClPdMc|oIbgMuIk$w6+BMgjaHP0q3~c_F_B+`kBAbSmLqBfpX==xdTYzI%Cd5_#Jk3t~f9`Q*-(Z#V9(@2-FQ$%=Fp z`gew5LiUaF>u&Gp7!?B1?WdiSPvIL0TvKwB&f8BD6#riQxJvo(YL5`?m$`S#rvKr+ z-BrUl<+I@4Duq&7hlIk>r)BGMU(}M>IJlywXLF7&;?07R!L*~#*^rbo&pNCj|R{#m# zb!I)FPoaGTDuTNAdITgWu@!UFY-xlTL8^0Ox`q+~+06`61Q0Wv;KF2y=E+4#PU+x~ z65LM|A-D#_aujtOO-~*aSE-`hJy4N2s^ zShS}KZ8ZI*pIUc_`w0{FkjNi1?J$qIlTRs%u0znBRZ~-53I_Pn0aqsMcZC|25?hXr zphb|aSvYlvFwaO^-#a}&4bMQUde(U}^$b`+$N*Jaf;N>4dh$QSVFV+ZZSv`WFjlh0 z;tF|cDfgB6GscJKv73Rkds<})`UPh;Xh#huK4fwt2^xr7!_AJelyE#qDHWglp8mq%Gm1bN#n4*YE+`v&xbqF%9zAk_3Ic68 zS<9z`Kco5Xm>RO%FF)NecdV6%{+Peo#Fe71fR%qDcA;NXIanAvB#3o-(lKu#-!WOmY)dsPIzx; z1!(*6okm!*W4I#7cyG@IX#EL22gv;)J?C-3kMH>@=)+c7&|q_Ruz1h*7EaUm>D{5l zJYt32!q?PkD{q#3dD1%@kp`-aN5K>hO+`{upoa6N2>0_L7F^ltl90jGq@4rqg=Jy| zF#{1+$&AfJlOtibO-N0#xQ(K#OuJKKP)3J%XmM%gQlS{2-#OzFT?Of57GL%jmbr`I zc!g#x?D4b*8#)vZ;c}&=fq0PjSpqX^7GBVDoQ^`q{}jzFg0tdj~7ujaIzx=l*mV_{W3O=VF2VlXLOn$#)4$XnN2@rOUKr4iP&Q*7tn zgn#?qO~h)%cYH@m>+fC9mv4B!_cpem&)5I$Q{UoS(vL}u4|^HJc;mj=yjR$66W^Tq z2TO92M4|U(Z^~)p9z!lk8Vx^aLYLW?-D*8EcT@i1JCZmB^H(sU|NkC2`69n+_~_OAIuU&(05 zR!1N1T*2aMp?P|RTgtPfk&be;(F&uiwUX$B_IfI{k`xe4N9CUCCVFNpFWSw0aFXJX zW1>+!Bsf>W=o=goK*!Q~qB4+z(Z)|MgZFH);lhw!XU_5voNf`1wTrT-YfmTF#uwMe zodQo-@%&ocuErf}R+1-n&pgL>fVx?nv?Na7>jZzq<;C^g-6v_9KBja4<%Sp_%4ZqC zrT5hBrYsLrj_F+lR*Ucx;g*JU)xtvA;)SK5r^GsX$1%u;c=g-W)v6tY%4LHdVCKWe zSNK@}z}yY~&fE=HrrIye+u%u9vC|^RfIp5F@u)?1MZ|`Frlji6gKIuD3WdZ-4mAZUI1U0XBJT>=mr6F z6BeYAX%Is<@hU$?Z$L>BB+?y*NVr9SvUr-U5#OcBS0*3n8fVmSL8xB@35~|@2i!R2 z>_DfuiQTyP5wT*dee17@kG30X1h*+{7A7(m4RL?MU?1m;bRQbGBmCZK#eL|Y+;``* z3@XDB^v!la-n#pAcXKDesnq}npy9{~)gi~Z*FsricM!8X>;1*FX~z&9yF=1dOwl1~ zaN6Tijj&}x6@GI`SV)1m4`B|f2fe<;h!T@*1{-A&UHU@SKer|QBCKoUmlrOv(yiKM zLH(+|yUoY?H64H|IKwjrRJJeQ%@w=!g$@lrMm_l3`tZut5BO`h1AXuTZaQ2q1u40F zQLT%jC{nw2iB>&J1N|vsM72)QR_!7$wZ#Yn;YNV6+|IDzg@o{Bzj>@oq+dWXrFMyv z_VJ(22VC%#oy4gd#e|sTL`NRLU_sI)kZ0f*4pM@KSb1OG>NrDNt0}PDy44Jaw%JO) z))f=!<*i`=^1eZng{A@70Ngd~3908o>BMJA6S1Bfx>(9j@Bz(>{ES1>yqSLIuGDUqXO#zAuM>%|y z1C{6s^YHC)bcf3;?5DD09w&VBXwX=yQj5jbx*8npP*iBS$jQG8;i^?^p9glKqb?9O+d>X?s{qah-8ZHX%I1pl$8Vt> z4BrCps{!6ym1;F`Q1x54Q+OZj$@QOPuOy;}xl~;4E7(x!Rsyh?f21FT3~qinD)x+G zc0lsntEDoWRBCm#95M@=6r*E-$99$z=^UgW{Ml09U-iJ^&BV`_(kC zfoTYp=CK7bXR42~)hV!`SH3V<01_@6K%@+$q_LLq0WA}}go~T7lhAW92d)2Idtd$V z%7=0Lwbg;ZocD)Z4bI9+Q=EHVBs`!rK-<)a*^XL(OB}C^VBhE2nHQyn)msyE&;EqhW(M0QIJmw`yFP{P#b&Cox<&RVG z+J6I75FppT5QsVVw-)(eO+x#a(xjx4NspPt-l|n@SAy2(b~V|ESHqiBb|g|9@6Ncp z`K9qzn~&~EmnmUB=7`XOU`bs@LMI_5E3QSC1G!x~U^ygp+b3d;G~_U%g!T$!cq;9r+W#l=!R(^CMnJul@6CyYw$N!*--- zI*!6!06eAEtY=dd%>4z}k_tIizyRY6)5LSn+yQrEmp;bQzU;_>NX>h1$5@4gJt_uW zf~JaCHzbEwK}>uFrvXO%_9a%_kdymaQpd-<~fCjtfa(VG7jD#7j0Y3{S;pj5c$rg;9s2g*6 z32cbvLENi9&B`^>#!wLqVmh37gNxSU;PVeAcS8GCFJZ-tB zU3N`g5S|Jn3zLRRQZ>Uv@0@PlyXy=e8hW-<!|dNRZLV=azAfc1_HfB%T@pT6N_hRo+oL1ruEQ`^*3Efj+EDyR(2c2%)Q0yL6F` zn@T8ITfIcaP$Tcs@9|1QI=FDrluz}j_N$Wxkyh?#GCZv7&U3%RTHGVzTD|e%ul6Zo zg1?n$cDc$(Pd=g9)`$GoymkF~m?*ia{1IG+-GOdWpVmu8kJ^PUB~e(_8vmLrC!~-s zSF33CRIIss5DMzb^hP}_rfy4bH2I=d>n%z*7(!#!UTX-Zn27tC1G{*_WT-A+v?1vT zI=O+m?3q*9X%7U^Ka&2Dt3hQ{Ey-{e?-M9}q6(jsk{m+gJt^NI z{$*0{rv;Nw6xdJ6cjLqp82RVAYxPN<$4tw74X9;p@%g-9B~SX#U7^eNV0|{ zsyl=tiW*={FdD9WdS|#5ure0!jiZ&Hq`0mD&z}v>xJoR{sjLHstCkGUs28c-8Di1` z7ZDtIfQH6!q*OJ*MX?0E$6&7eZOVf~W9d*#>b_zxXg8DBSObqEtAIY7u7FhPk{Y{e{^uCWUrWj3s6u!Mr94bxt7U z+7AvI0+5Ou8s?}Y6)9I{Tw)dCA_f&NowX>BRpVVkY8{X|! zvU@&+lwb;ud}{K$ukS^{17;B?*v!_uy!fOWNOG?qUUHL)%oe1QH)*u=ycFh5J9DNC z0}zbP23DCdffH}qMFfqYcDxo&+;iB#r;4Irr7dKF%}*S0hRI7IZ%mq_ zE~%fwx(HF5f=gJDACUpW{tJIC&aP>!n^5NJHL1XAm8@JXr^UH>2y*iuWSs5)I&+>erQsHvGlU-eqMJ!fsx$E%|fhcB}TRq zU&#Crp8Uz4WZwt*62DQM(+d}+ny6j+nJrwv_}6~Jw{*ciXqN<2TD)pl(8{m)!cpR^ z*#d+4t96~Fx+ooqX*pH*^a&CvdTA@I23iY$bychC<`HYuQi1bMslRE?NUb#F{<3b0 z@y6Z-=}T&sK38SYi&MllNKHX-;;~Kt>TJg^vlv_3PtQw_eefh+{2@CQl6H83*(5WV zxK1$JHg0$!eMH>w(qVu38Wsm|dB`(i;BkJ6o+AYFTs`a$DI+tEbz(tS?pZMZkha_0 zqrUWQ^0Q~3ppb3f0P&W1#)EeMub=4~|Hp6b_I18l#8G|}z$cpfYa7q?gg#bi%gdTPrcv!?h;%YNTj_-j6iUlvbl zI2xX@maoZ4S1NpG7&Wy<3v9daH&!l-9z}HB|gx zT4FY15!Gu}7yfSHZ?Dki--R}F#aZmh;)T~m;WdTqNF|{x*}>-& zT$ayP4br+&E`z4s=|g8-nrtf)DhB+Ql*{No?M_(XLrujtP`~7wl|INBq0}6^5(byq zLFKSomN@f@XXw|IJ*&J+pbpd_=uUW{b+N0lK8+2)0ce*sjQta|SEnR+D)$b{ik-_b ze;3!k&{>F<-`vg>ZZg~0eDFZq?^BPC@JUI$B;Cgcg)#XEGXH^GuK;TG(ifN4zlg9J zDF==RsP^TFk^Y#xJpA}%Mr#K6FKEp zFsxT7kOQnjV=9&JGQ!+cAx2!QN26S;R*NPF6ac{;EFbK{^i410AyLcAcUC+$D!9Fw z=TnIO`FEpT7J-!Qk&&!RY?K&Wkmb)oeUC5Lmxw^RCwUS!QU4R zg`&(QuBYS49e;)7r3j-mBQ`G=);%4k7jcsHAIBPIoAZWft=_H$p$sWI+49tYlFHDr z;gX1-B3!HNUwQ`WQm)P{Tj9SO=!KrpEGxZ!0X+c_!6N#(K!_h{lMDn+S{IKZ7zG#w zk?<2zVO3T?mRn3(TpqA+6e_A(a8LH}G9M-M!TQL7rrNj|7?1i}7kKm)x#$btMS)}$ zryQ85-yjk3R6?mC$f6@uD<*T=i|CV_17@SY=1QPg zy0En#3!WERxZncnh-66;3vRH7u#^u8@~{i2{cFx`>qbV4xvUt^hd>&=`7A+f@o|jF zD?F7n5~vTOlUk_VzQd!pr+b4F_i!t%Np-{tlb>Zgu9Z}bGMn(VN$rvjTb$qIS?6e^ zIQmv|HR5QzDFTiTWGNW`gEy&=HGGOCSaQ93OiB0eqRWs-Rn`dRoC^R&2)QEg=QJR6 z-{q4|ggq8s2ALul>#+n39#<<1{DaHohsUnh`0$E8s*+Wd2!KFd5?ty?<7?~IrKpK0GxdA3390cUxjx6k{wS;7Ikxjt5+}Hasc)NLPfiB z%X)!B*U@O{I-7dqZX3o|@{E|49Dp0Pp3jw4t1U|DU-O*v5WOuSOYD%Cw9;}JKFz&|k#pSsm@jxSHE81iC ziLZ542fpan2`Xn}k8a;i)?%8p7UQzJ+X6c)FR4^TJc7ZhR&PaiP8vt^l$OHwr7L7x zk$JgYZ`}$OUfK)?BZ|`5LC~Ry=fIsceVlgx2B-lm*dHHn%CsBYCtk!eG~)eilVo8e_jfNt~B705!R`AebX)+NwvrT%|h zxQKfkaxD_$>V=DDUN;xaRkH%8FE}<8u|7I-#{J0Iv))?gtE@QwseUw5g08qP%Leo6?P zu8JI{4LBilG7@dFXAzwlaX};+80rI|36X(I3_}>(VE9js1q$u{x;Y)53K-@h-L1Lo zN=Qn3&+Do0QF1~XkXHsq$qXczZ>qFz3WHcNpuXGy?8(#!N}Ixw)S8s;OYTyD)-|k5 zDBzg&J(R>%84=OuM<1RA94?m!ks6k8m-X?YfkQh=6aGzVgf7Xr3V2*E$df)u2!n8;AdKG zr4dehgM+sU)k>*DAXS}1R68EO1B)NBe=aYkF7*%v2^?n4kVggPFIRNLtl!hF(2K`| z6LVw@kxqf93}&#j<#&(+tdt~=h^g3NuFRc>qbgy+gboO{VIX(SzbK8RSnNwW&X=!n zTqijYJ1gVCeg^r4FR9fh*rlXj3(Hwut=^7AHdSLo?706H&g1_R>p5d3>ld$>v1nIF zx?vjcrhRT2E!BDk-!x(ze6?H4Dl0a%Dd`L?0wU8oOP#*JIGcNdC`U#0BC?@2B;Db( zZXG|NF*nxf@8ypuR^Qe$V`fEP{A)`z))054r3)~jsiuVvLKf5xR4xfGsK<>0*RhIO z>&Egnp+Cm*YUrZbVt>W&)&7lQmAVsceb#`CDbA`uaB8c+hr+>F*Rhq+83dCE4(R2A zbS|zZ32xwD4p4b-IM@E}GDc^h=jM*;Z>c*Vd}! z?RU3z(K_-#0WB)U@0- z`71uQ%x&hHJ^^E`+J_7ORl*jF|2r#aA6NBSvUhErPlA^gjF#@Ug+KXwm>ql6dZGpv z{%YaB)4Rr4d!Qz2aprXmM@yw^Z^OKQ$)_-H@d_*;E4Nx%_(hn&FZdR?uh%rTO4m$_ zT3m%o>D2}T8F%0!gmL37ToS;#ihiM0`6c~F?XS_jg4R64WFb=lX%$kk9v&4`T56)8 z;*Q~-lY$zq;Aro#HR47i^}W%sK($b2$3PCX2MvvMTA^toSwBX_pN<=JYB9{N$-NW0 zNElIHUd__DhjiE>wRiRQ?b|Ch5%j#Gx|9<2RF$>dcc^YklM4lzLEr_Xp|g+aXmGVD znhq!5n0|5cVbI`2l^HZTZMk$ubl5s^Ccv^FqS=#z<{d_%_nM0fw&GmVmd?|^Ph_>6 z9Cd+>&1AHkn$mA-T*RME6W=&-!v0v>(`=x z&?*=y#yq9=u6j1ua>8O8(lV|8si?+k{^9BOj>;3aTr^)lEw zMU)|)A}eico#W>k&{gN>n)T@Y)Nu~joj(Gjx^)lthMf%y%n!kW?_gO;{c4UQ7DIZA zjmk5tmF7nmE{h5^{|-uP{)KgEF~lG={~$^OO?p_HkvWaqj5VfRX&M{ zvW@`(vVny~v$yYBCUdO|8)(x{G(pHVE_?8RmieOoU-ZmqwXK)bmWrd1vQ%qgD+c|Q zs`SdjLiCB#DOTRba!mw6Yi zHg2`zVagU!X(D<9{6OF4SMc$Zt?egUyML4>PC}RL#pX+h%%!LxkF-l`qSll0E=@i` zG>cJklhClp)`Qvm&{Kl24gDY2f$w>5Q0_I5T)V z_cP=#d|YMKn0!e)032{ytzAQvq=0|HqS&+93qVhS#smn<)Xy_L{=y*$BhVTf_YdG- zc^nbkWE{uro+m+jlD%VO#T-X-fjH-5!ph3U>*K3$Iu%R06upAUfYVCl<5j|pNZ(45 zfqR?o|0*u*7>UEmCzQC8W)uz01SsfX5E?9&{Z9GRL^8%{;qQTt{}2h zOmJ^}Wg`e`@7n6>g^x^I47Ap2g+K_mbn=*nBVc%_W4*I&HY<&ThcOD!?Adh^^qAV!@qBg~^Wc-ZnL zO-Qb^Y!xnD`X7X&H!2ExAiyd!mRh_8+6H-{HE>SV>PUxe;pn)eG7;Yw{x*Z0jhYyf znoc()WEH3L+TBvji<)LRhL3_;`WlyKTE31^#}Df8CSs&SOtzkP@0z>5L5-dox?kJ@J$?JnpFjHqUZ1-IV9t5)xtwxyHtN;p z?OI5&)x?;2-@VNY<3vR(3ezkZ>>~Jh4FQI?xj$t_!F!a16PAC-7s3tUhMOi=m*1 z6!G3+P&9#QgeQ_Ah+7D`S&E2Wd;kfMuo${RevEwh^7R|^67#ahBmzS2qzVX^oqMwQ zMKaD1wE_T6;(eb--!3e5X!Y1($blwksd*P|tV~h(njRVK++LX#2i1$l8#MO1i^~0S z#$*_PA^qTt5cwqAzAVO9q{DWnxH;M0=y%g6)mD_;szqdg*{fPD(iD1pF08H}iW1bn#dG|hdTnFAV%q79zcU*~ zz)q^l-fxqm?H{vE7)9<%~; z#tz~##;$&!82YHVt~A6aneQ0&n}Abnz|0#ii5kOQgLMEh@i8-DCv5;zw;8l~C&L1e zq!U*8kkb|ZeN3aqOJq97cLwbn(Wx z2pr;Y9^XK(QmfXj`t2Z=atzWyK2J()h|;{7!G!lVAMbu;413==g(G<*LU7r zJ>$w3Y6&-66ElR;_W?qZOi{#SXJh;ErWk(Z@NgSw2)vG>0)dmMU>ti6elY1^lngM1 zbpu65XHh&5T_PfrZtN18pvmxgn*f@T02|O8+%9{f62^EGvlx4WC4mq>hV0C2WLgZf zqg5-{3_&d{fPz43&glPMh|SQr3|rO4?}e@E*CQKSb0e923M(;N6Btm=7M`;Su3lz1 z{?tTMVEOf#@yNw7aQ<>f`2b1)qYZOyFIU09Pa^A`x;aQ_g+fo@@)+GDKURe+BxcSZ4Z2&G@rAQe#s> z_yGH{622VU9|nAU?ZA+`{uaB>beW}H%Nhmqd zurWfqHsJqh?@YYoIIeTgO|S$XZ!gb|larGShY}ZApl1g_E4DxolxdL!1b|v>$`Uq` zV}S!2izGUJC;$5UefL&XSNAL!E{@;JNgNR~J>6B+wcP!FSNP-E(I|8_k85Ikga6Y`xJ{! zU?MuU>X8P1Z$seVf1<l-I=p|f&sL-6jO3N~f5~6L z0@=mvf_^T^8rl}0%NmrQpijW4Qg?2K$9=n+BCL5aZj zbkUPQh=JgndE}e(mOMf~Vn4tIhWjmik+auoE4DZeA8UPsm4AX<57 zL(SC1yk@>H)@1=Cyt?8RTBHo>nqD?uLbfLWQZ}%*j(5AYrg`En#W>cbJo*3l-nl%p zc8O=BpFK!nVndOe%mqC(BjF*MNPzJ%v+aia2>h#oR2bulxPhSZWDJX#ye%T%gg9^R zZVy|FHuKtz^r`X;cn@Ui39JuHp1eVg7qmmdpA|HnJ*6#dhbKKHN)X+(vW9yST=w2( zBli;kRY=9PFD1LO97Q*lA8c%{-un_SS=O6#?_e>=e~_EX`JJcOh3P_EtR) zr;D$d*r{eDb;jmK1znGpIwvSVYRrK15;^q1cVwJ+-ZC;+0RLaXjSlMB-zi% z1mt0v-*m*qF1e@KHtPZh&JR9+b(K@)0nG#jqwBoM$%@$peCjyFf+BLGri6uA`C-GS zE6QtWell^b`kDx8)5uS0zfL7a-4#j;3#7kVZ*jY_z&LUk&M)gi*ebgebvNyV{Z`V_ zYxU4c?VVkcWKNMOSTZC3g+`lGOS1^|D)gR3mo22B04GV{tQ5k26AzshRCLiZs2nxc zZ$KlljH-skrr}nAf-5jBuCvx%YfU(JDKJf%1wM=o(Oqp8{RamVyXv$6UqP}FnQou| zSS@}PZfhw`e(e3AAwt;ozz7@64JCb!q^1Qmo`(Jy!L8gF@$@`B>Q$m|*gmBIoVtrt zaZf_9M$l1<#x|e3NlUUO3)Mg5bSD{0n_r@ui)B$e31AJGM!(RUZ$}$XXJLr4nMn1z z=$be7TB%xSGK%!$H#o^490n?TL7A&jMEcF$-^X3hT( z9UD#e{)dje9y-=qoKFEW^BD;6&DFcNycWnRumLITDCHA`xByAr9(q7>>Ms2D@avOj zg*`GFrfVTd!78-yi0V0KY5&0*VST0^CJ1NNR|Xete35+u6E-2tGRCCTSi*uLy`100 z;1PSiU}+v7XbObCfLA+Fh%I~~)?``eG#6w3-#pM|2`_o8whaGRS)aR!Ti~N)I<*=o zqbE0v3K^0VlyKU_~kB%Tl5&$*AY)ApsS6luCF=AsmR1WnV|&zyGe^ z=-<*i%tRcWh&Jcun-4~%DDqGr0+~hbv9vx)<8mw(ce~1mHvS$8vE^bkHKs?lmEVJY zikM_BIek!V3XQMmx3Ht$aJ!_`)vA`B9m3s{5CC7F(7l{^MRZ$AT3_faG-4K3D+JNX zk>{aN6HemT4K{q>W`_xuxvZz!UK-2v1S{^A%w1+KS&PC9Tj-LuNvphtl&9;)m9R5x z4zf8myX0s>XRBww4+qbTUqD3SSYZU1!&Y1a&?)0OqVBV`N&m}aSV54XO> z>6R^)G(Ck1Fx`c95OZ@N4q-hkOtw*8kAm@3*TC0j&O4hcOex{QI6aK%j;7s(?m{C( z0;2qtr~C8!OZV<9{~h@e6`?`R_(}vJ*q)>kMnLylrSVO*D9@RZ{!W=wp}LzPu_!mU z&}+`e(tF(!%K=6H{-%O`LqUcKB!Ms=bFCJLl%Y1{%ZfFj=V{&(+o7VAv&~o7xPKJ* z0%DFk%*{TL9OgC^Cdo`z;0tVVLZ!P=hb1^aKd>vGE!|tYyE6R_dNn#)?ry4y`VM?D ze2lSPL`ig!WnZ+>PN*ni+XLIpi`xP^CNN|ED!?VOc2U$|%<%~}AcG2t?31!*pE7yhHZTMR=u=EnKEWyTUHUq)X; zCl$ZL6oOYq59T}VSi+*)tk45{`KcA07ntf1dSF;t@9hO9dWaYlvw8~gj5c)a@*#V- zt7R}bzu@`i9yZM&ER8wS5(V}~u%kICHdoVRnYXT79zO$z0he%~+Jc@4>QYzE^5^Gc z7*Uh#mYiVUzVq42t+`L{+#-4?#_mkuaj&*Md1uos57|06oxI>pb_jF?wD;qF&lINV zw5%aJs+qvgRbhcDYIH} z^J8B&LU)eu3Yv`x>lY+52j3aLp+>*SzAz?kIT_ZrRAgm|`+dfQ&G**q2;Ih|@?st`u4}s}-Ey=i=w=ms zsdSL;2#)Q@iXF*1g3|;sIo)hQ*TiN8@2=8!;g{EeP$dB5qT?v_n_0GOG@1n5Wo!kZ9 zA&BXra92B3jqU^6-)AKf`oRd-k96Je+(WBhS6lt_s8;ERrlO#V`?1wlLpmaHczn>c z(g?YaM6BUKn&%oE`cklo*H_J%BPl|o_@mCH8Wl1~KpJ60qz6ePR`7|3+RG^}Y_0km z`oEbUUgiyi4~=WwMkNO)0WUu&-hiy7p*H}8YSbH8Gd+u<0c+cUzidc?-x690{j|@a zK6uiWhpe~GpJgi$=<*}O@8XWn&JyFo-=A_PfM1Z9pXn0=1FPi6Kv&pKxT0%v@G^4p zZLO$GTj8IOuMT0%KT;FYRUESfhqQr=blMdFz|V9(K);G9I*b1iYi^5=@{@8yBC;iAWrCjPrREm zzwkM5xL(ho*M5A?_D<`c^@tGL7#X-IjD>gOrT>ZE>z8>mBSlP?{t_n;WXr@RV(5*s z#wJ-;GoCam3Ml(o?L^`kW3ehf$H-ETF$&>9$CVIU531C3Y4Nf{uK$W)wUWAqJ`8v%?k?21zTq_$>9*R{z5Q57I|715f zqd)3z6Px`QHcw>cK9$84;vDsK-EHAuicT=aTUvEMD+^MHfuowT-3Nb)4wTxmTRQ>7 z%s&b9L=D;fNkoXD&q4g4><0R38VgaX9_(DZAx-5=F<$cIR@T2hr0jwy>5y*LOL@Hh~8RNyRxWS|(#T}VEfHtsL` zGvc8M5pOCdQY88iK2k&tjf{!Q1jNu%F|pwSknyq1>cV2X6*IQmi?v&hn;r8%)1G9r z;@paRm1^73ewwdu{5ctnuUL@ouF_WaV;-G>Lg=44!vRh31Dh+KZPrdp*{`0NkhPjR zM4W13=Vt|o8JU?0k-2ZU(B8U$SY(t>)bJmS^O_2-uVx>It1CdQYvH+q7Bv8-LN52s zDJoG+DH3`BZzwj5opRPSrpSAue3336eUOVy;8k25Yqe_b6pY(-Vn}kaBlAGy#1N-5 zC%_@igxEP3#K#A`ds`{#iaV2@A_+mMaR5-c(V%?HrYGv6+7+_g41~FO6-%Nh9NLS7 z#Ycg^YAydQ&=|khX}>$S{^0IP?e&`1M%a9+9Zn_VgX!@Xkq*i_oDhgR!nRU6Vfm!;Qi{aO>nV^W5@qa8? zHL-H$zos=1UkXf17H_Nc6!S;PZSTc%IbX6N#a+0$wDI?hGw}^*gP4Bn9d8}w0Tw}@ z5CQBOMa)d#KeK(nnstQn^brU9Oyu7SOfG6fI)4zXJZF6Z zA_u_iZgC5lrm2n3t8IKax(zflG_@l9=rA zF_*bgEam2rlmz1)nPuv~EMej$#BnD?+6_slzzCHXHX3%M!1y30NlQgTNIoOQrQ(j% z)yoM?)9msfIc0s0lAY#3leU#)t<6{xlVkY%=4I4+cm42}TsHN#kvSE`&{L|11OF`0!m&YIx_Pp<^Yu0`2=YGpX5TqEIzD*X|BE}7D)7*81QUWS zcS4hhR{_Y2t$U97f=mfRP7~&{R+h8!ksJ+WdG&$CX_7@1m4Go>ui>l|`n0J%B%+|s zG}=Ej^34qR2?nHCY^-HUfq8DD6-@En{-(k%&#qx!*f~NnEGVT|YDPy*Jiyc(@^3 zgTunsJY&te0g7wQqGhuqs}U+}+q(cD<)o<6@_$TdxfQAkV9QG_%W9=m7c9BK!$X5g zm7kfpKqeq2T#eEqDtw5H!E2^8{@wEqWktsPt|_C;EH9^zXJoXKu^p4(SuSEAo40Pv z`oQaPV23?iNj>9z&!9;V3lTPdExO*wAt0bXTm|3n4pq5)*T zFWU>j9fd`xB&Vi2Z{GlRb#(yp&)(rvWgWl2dmIGS-D4i-`!0W8C4Z-qyrV>Dwfjpo z42(*QCtReWX$<`US--4|ZLZv##(OI2IXck#l@u`bJ{`Y-UeErgJKHO|x;979cr6af5DMa2pYnqt$@gyu+PhEGoxEXv8TdksF@iyK`_N zm^F$3Mdoz_laZa7EFQ5qUsZaaxkVRy&1Appl-;5qt$hCJ>iVr|HsY%VT*Qv1*>fR9 zI&M4GDATM878Q2gPqjqV;G&Y^1jwidRLt6wWO)i|-)g~lFG`bw zj!VgEwK;a8|IOw-?mhqK&VH%00 zrhD{q=>?T1-zNW)j%?@dY*9w;5tIn*>8(Qwy7dQ7`rFj6QnJEhS^W+E&a1tuclnk`Rc>^^t!O&*uJoLTUS>nzAV#zE94= z*1q*y@?)Li9hq*wxw!XT&vaxaJ{)cWmhbi_S52(}QJmmP`V7~xB#jY9) zxB$d;T-yQOZ=0ZJW>VE6ue?|Lir=>pyPxuz7YAmK2?~Y$1m^5=y9J=^k+4rc-(l=N z0R8XCGmv<0@A~8Gw6yz8|JmTN+T_#GH;noTO%UZBm0jyP5 z1fCuc992qUs45%5R4jeN$t1wZKt3HF_xGZAA)C1BY)#N1B7M~>=9EcCX}j}F_dw;56| zp|}D}B9}j-gt)|lCGC!kHHx@EY6X?`UFUgDB2+Tw;Bf2kxz(tf+wC6$sc--Wi#B|D zgV>U1cVKr6JFd2U@(63BH(?>X<||a&UN(|71tlo^y>7ds1efHyP>v?pXWnM90Rh;(AM_U78vQqtv;)lV( zpqQWHa&awGKc*c{mCp&X^t+k|>I2%GY(GDii;<)p#}AW0)iCYiE%uaj0RK87M?Orl z&F|NJs+0Q#1Xo+E(oPq(^8#BsQci;I=*V8b4z@;U$!RVmEP4zV31&~39qrnuz-AWG zW}whI+u&&CFg{r|Qu7J|Kx-;LC->7QdxL;VUV=bfURv9{vwGjqJPrF4cvSNL0XH4I zCqkz@h^K07HfHY&Wvbq%T38DG4!N62H2JbtXx*`WYkQ2UJ!fcozU}f?Flc{4Vw-jw zWKk`V2XAqR6mVsn-ehUcr_^BVW*%UKj;Xsl?rP){u$AE!tDeV^wO#BBMn3}?*D|kr zoWH^qZDuy9QA&6#tZRXn4!%{8Ug495=Sr<9WzxkqLrZGMGU&vgD+zq@R!1WodVu|s z`~|p}gK-I&y>|a#FsF?NbQoDLcUSIV9dQV7-+-bPAUu83KRg(ynCi=5&lT=q|GPDzRAta=cjvHi18S_ zfP^j5IB9*iPhDByX5o=vRopCA|6*(33S@2tn6u-9%{wft6jt1RT8IdfbV;(UkCIPe&1W?;~ddKl|$MjB+5~m34 zm&j3(3yWC)#l=oaW(E^?}eNA>PTE154n={NqXm`Wk9z5 z3Tws}?-Kv{aC;9~{yz|yuk)4v|7$i42+jY8pre;vwU~mAzrN9nDO;U(ZCMJ$UOvU_ z8i1{nY#X=*hmF+WlR=#J8t3Ht>}?KOf1s1I1DK#GBYV2`ea-!R2)8MZWcC94V2!)1A)`O~>ZzTWbt25CKHM}%`_~W}@pv>56 zuy{??3;tue4U{jfUvbkPYCm}E;XuoK#oQpZW=3{djBZLg?v*VAJ}oQvKe@BMdfy1} z6p_=fW+NExGO^?dg89(V%B1s92Ur}~j#1$V9i5(0L6t*14i;~7UShv3%u5y+Y~p>e zLtryt3skIF=;tzdQ?GBvyrT+zHX&_8SEbd%>@gn&Af>l2N~~}EnuFUu;SR^eGhMy? zRNtd5*u;27V-GXVT~4 zxGbWPCWVa2j!!c@CG0_MnCEHufag@&DNhC5JecAXM-dpj@vJ=Js*uT>;Pd*KFS;DT zsEZ$mwstlir3@o+Jsezp1ih?%Dg5rM$5D~GW^)+=K|HY16j!yK3wslZ&vj@^k}V%z zrZfJ}Na26Ha|AQc*fA3nUCoWBl%Z1|K`N_D=ec2Y>I;#kV2<%c7$Zy-Rxy=Dd&ZvtS;c=BAGZ>t`5_)Mk(G2DKHs;S+;(${M)r=7%3t>u)u3dme zI2p6}Nm43=uOCRmeGI3?elObq%H&`wvBJZ#?MzIu)8poxe&bEpS0R8P0v9wJ1hOX~ zrVONGA$B*{SC&5dn+F_bT}`#86qLLTnJfh{iD~g)3*#|6DH=x7X&d3TgX%zQV(~xb zV!jjNU0S^mpn7X*bE$T7Y5Aj-`?n?qsk)*gyQ@q(a(CoA{hV>Ll1ttLMuLK*h{;m) zJfa|$zVNGBJ<7+)i?%(G7H(VC7nsS9q+lk+PGvq&83q0h;I!F0UIO7WHj7!+2kuR| zUJHW!6WYg5nH-lYor-nBE!RcYvm%$Zt4F1H>fxCfZ6c+%3dRpZtUoIC#OqRw0jmye zo8{ZPm6<2LGj&t;k+LmF!QN$p7*-mOYnw1A2tdfNd^iwAF(>ms8maLt8q`hh@Dv)q z9?3_?ih3AKysVLyVkujR+~D11{^=Phv?P|0HihT|^dIec+vHfLw*9)dEpzNmQNBpf z_-k}bkxXuWwSUohoAWB()&h55L@g>*Ivqh8Rz<}*XCMajWXv!~1(hkOM%1i zCftHI3{#pu3?{w%fF`XXH3k717YopuY7i06(~-)ZweYJ?a@{eQ{Q*5X!Yr93B~--} z+n>!c@^ESTG*NhA=H&75q?gjqHoKw)Nn%>P`8%YJV+4lic4<-_VIdIp?qVkq2#!uP zy!eqxcA7{ShA6`+5l^$TOGSAKG}s`2jBMR##q4aYHfMZsLRbhH1Dg#aVFToWOAb=SUPz%wbb40 zqmx7RgsJW}FB~vI@KtfQoaZ(T2Lp1Ff(;lePtnV)k$0wr0$|KBPu>V@XE;C7 zx48-pHQH=;rbQiNv+xB;Qf@5b8b(BNaOg!5bl^?O(}yrj0xtMyNhp!q5JZ!$1WixQa&{Zb*Hr2*c)0e!58}K z%q9IAyKlWE9)KbpF^nTtb;#evgI13k_d965Cj2&lf2Ylc+I5=P5=~?(xRgwyrpOGh zY_bpM+bHKB83jzc&Uy26p(8Sv#(IEz-?5kTj>Jv=i&#itwvmMh>!8Xd*ngieV?AzV z>uEodb}s%Z4lb)pP$Igv+X_x?62Nfjt!(D>&bf*kc!w_Ax|A5hGkD7Jlf#2=p&HB= z6IiMq<6NSwR(4wLm<&fGbQaU4a#|CFeya@)>6S|(m-tv|7RqZOX{=UdNH^i^14zqX zWf))n6dsdB)dp!KhcB~{+JGiVbT)CBJkGLY=y6j!4hoyw6|F3SR*J*19GhWZ12sn3 z5EgL*4QRBL=U`6uX6wSoGNGXK5`&|AIOQI(!xh=Ff-b6nEN<+X^k_&{o~YJ+rXi#Y z!KDr%Y_wJPLLr`wmg1(}eJ;t5|Kv9>1z!5;mtoD)8x-iyEg|bZTx|8+Y!|=IpS^e< z?aICNjq`--NF%oql96A8pg~nkn$72lYx6enDn&NJhe^4o*|2#rTm<6a6mWH)?p^8WwCu(REbsG&yl2h^eZ&fUlu{Ny}J#E%pF++G;WcrIq&P-&mV@%g4<( z-ekUUju+62*tB-LXJ_7&PG(w&-ukI2gM8}zD|EpgvHYb*Pxu7$%;bDKgOKQp6`X1WbL;_5*Yus zTGr-oet`JWXfB-rJH)m}^X3`f72M@F>-A;c-ND!gS=%7Utmw!NI~ReAviMtilna>fja_Oq>gK+Nc=Zak6#F23 z4f~+cynQC@0`*82AD%IlwE5fox)zt;?m$#}Erq}rYm_FI-+y=J=QfT2a?w+Zaa8Pu zVpR5}7*+Z@G^znxtkL{Pi_-dmef}N6y?kr`j6+Uz7T14m*YBS3aq$yGg@VNzCR1&r6|Z*Gar^i7%LiwS zKdH6r1=Y^!Ua_HmA)H z^VYG-t=g6d zDP6FXj6^f-$1Xe851yrAB6h$;jWn8eP_#=>(%(P}JhgiIcpjB0i_k0C3<$Gnyi z_u`b{=8++0Zu&^ilq?G?(kja=(&3+sJJx&+ze>8j*|CSL;uX zkDuXq)*n@mcx2z60^x9cz*nNyj_TKHCx`ol(Q094Ss_6zwRbr=>{}<# zPQVa3dgAeY2@Jpj)%?|LzMdRV;zhd7MDLZ{OBUFG+v?gc=-MM49u9u+g}(9s{A}OM zH=eamNYC8X_K^*`m};&Z?4J;H_bi+LQsf_1q!b)I=Lu@H`XztS_);;WYgCApdt|E6itp)`|>=3OzE+v#;G{E9?g}~0{a4J6iBcA@SP!i zj`yCXR*CWcnu$3+KJ0I69(+fnET6ERo~x%IU}B>W_IcGnqmYAcs13;98+u9H2lxlj0YwX5~;ZVDc(KRWr# zU!L=qFW1ty?Af^5c3%-%9%d>2+TZn`>UVAlC8ikFJ4aSNEgM(;{k~<#D%B|K$8m>1 z{Pu<-zRDPQpcp=rkbv0DMTqQaF7DWPjJOv`D&G@TujZG% zteqazLEZZ^)9y}Y-R`T6w`4Au+8A|lT@RI-%6=TC@cGdU}SVJNifpFYAAmE;yw`F?!ZU6C;ef~RM z9bDB&-m6`C=jh6{Uu8F+91q?5=uze7(r(ckhdx7L-F!act_*jS_hUkP;E-gc!ka3P z7yN1zr!N^q?yufjnIp!2ZDk$Y^4A+bG@_P4xw~mxq66`!#P|wZ2O0+~AEBf$Ui?H# zY%WmaOc@fWxss=#nUg(#=9iddL`^ zXQG^1?7bM&G;5l=kG^C?RN}It^xrna6|!dvo3M!2YS@H}#hH16wT$|MnNy@S=l13< zSEWU`Kpo8Ks0C~#;>MKz0fdsW%(g#!kSPZ7Icn zjeP~}8?#m%oN~s5C1}}W8j!))ay1)Va~{>rjXD?r=*Be9)>$N704x()EoKG{%7f5k z?opZ}#ttG)$yvV0lMJ$h^`55HA=;kBnOSfe_gIbzN`RhnyOP^oB*dfAf+hJ5YOujc zwi<8SUGwMHrJ5+|rK2S3@K&558S~{+DAtW@8Xl>o6+eX%tj&mqVF*kLHQZ^*x9hq= zQgH2kG17ob$qRXbbo3^96gr&?YxYVg`Fv%mcn@hH)9MdVMiapuFJ5O7+|{cI5z(U4 z`^O4YFJR#GtF|^^aKRB}oPYEUS@_o&sZFda$s$|3g;-a+AqnqG6W9=v4X_})S?^Q@B^#N>Kt z*#M@Z-3DB(4kPjAd`ry_RxLcCfidSHZ|y1pfE-2N(?vaD0y>}I%&4HT?PfEgqF%3;W)hfg@>5Uz2toiuDsL}A~~e8|M; zF|^8!CaS=3!{p{nV@XF%r{Xo61Tr9pW)q)p5OM)>Shl=b5|*Fs?es}UBk|yHYX_}f zDY3PU&2`dm6@8#d3*l3KaZH8*5)@)Tu%+H!(5#O*0~X|Cz8u!MO&txk@CWwK*(LT; z^V~U@GHemn)RVAE?k7KFcJZ@kw6V%utJDh$?qe9i(RgEuf@D(UBS-=XI|+c$I1@(R z0o(v_KAQ|H-(aAfVKQpuW%NlQv7D{71Cp^QKPmw-q#+Z6LVAq_Vhn0uC88{20@ zHa`q$#bH|2_?Sr@*2${V37)4-r^Le#&Mk3PCBrnEW}!TP>O2mQYT_KmisH>Cr$5r` z3LJyYRj{iJ*S@e{g9ka>#Jn2AlE(J3G}@Y-;0MlxloXl*Rh9r~f?9%7(iSyg+Mq!@ zMVf#%Dw7)>q;-*At0|N{?|^k)lgMOdNnN75{0Gb`bdr2%LpYGV+62zht{z_Q%+_i- z21iuJJdRoY89(RbvL|KG%5O09Qz(01J(p=?jyt$F5RnK)1yjJ{Z6_Qqj2%}MR`36J z?Ki<>nGwaY5xCig>ULvDLZ^iJDFNXAeNm%VQND{5N6eH@PX;|I zg_;&Rx9Q2YODf8fHp0xCnAO<};2x7;EBMxsGkqB{HFjX*oIK1$w#Mv#pK(1m5 z44oX`NdiYA-L?(D-@y9Hv}p(KlHrcLnGCVIc0|D2E@9E>#%MO6zGgX(x2SR{Srdc= z#9<*@6C^nJwHL!I41?q1hL*xf?Edu3*$-GdiC4irf&ixUWsB=Ub2Y(9FY^s&hW%6f z#^3=8yT-WDy+mD4M1gcdGvcLd#akyiUm2w-EOc$@&N^|S$QcJmLeC7aDoGgZ4=C|la1k!|jE)T#6ej>GI^x*8|dp-e>%9HZlTs3w_F zg$DjKA*O}sakiHO=S13{D|^LWM~H|P)>I)bFQHVR^);K_Vp8YJ#Pj0^s&zDV#jx>6 zU9VIUIUmI|b7`5finJ z7bpZ+GO>0$i_s`v(aASfmJP9D3XVK}M+K1nmp!9#4AbnVSRkO_)D1(? z!U7{iTMn2`s4V57q)_LaLtJz%#{fp?fyM}jzM&-8!8U?1REEgFnw3u*!ucfjg}~5O zRo8Fy?im0jf4Cp(y9|CFH?g5B^HPnX$uClkusO__<-XPE+REJ_`Z+nF_xHZplNqa= zWl${{lI^_L>}tc^l;|749f`ih!V+d=R2>M1@9?icbO*90tPjB}W>rH*F}G~|{`Lhn zINLkIyEL1<#$u`wSI!$>U%GXNx(!R~A5N-hnX59UH3r{-=O7Jl>*-+SOMRcF*0@vH zJIonQD3sMCnhtJL%4p8EP2mEcR1O(a4TLTsfYmLUL1Ia9=hjPqFVPy2n&zNrU_ zvLSTb(@*WVU*Jmbwn%`hkVS~CQLBcDDGJ8z21amNN4nm$ z>sBVWWhyb0k5W_mspSlhuW}fv&@PP;G-O4)%sM#pCUH$O-^bn{!-EAdo7u2Ubf08q zy@&ijk!+d8TmN*Ud0hpGu*aPus1{q)AAZD6eI9)1r}D{Qb1RH+W`K^2xM+HGbcjEe zaZx=mQfSMJ+-4O7rd41@M!ynTQAr%0Z??LzP-Qt1|Nns!7sU{!I#8pETCnT2y&9B> z)Xp(H@3wfao-ouY_Kv!%_ zXB8~kYqqP|*%8b6V_m@3?pB?7os1B6|AhtXqxO0{WTzh z!}L{RB6Guo&-$+?)qY_CG!pF-S&V!Y#9>&Bng%lmAQ~8u7TZOjl78}9X55?JPMbq- zCz$WhqBVv4C8g#z=NA`}I#mMF#@n*AiGTCX@&@4es~_E2iRrY%_VYxDv7s~nj_HoLLN@UAxH`72hl<}6@W%OthT1b z(&0=lOvxFj+I$`wB>&Y%D|4H_U0;3h;cs84M25IMful;ZJ9+#B=iTAgC(ni_e>&?@ zWgOGZe5wCTj}+N%YfhTZp*e$^o_JXo z{be?iITMcCh;EBYwdRcngbe<@=c5?HbTfht{RQUanOoaWo>k_A>LEdq2hwpt2{eeEmKScypo!QW`UZGeKd6(&xepL7 zfnJ*V-ub2VAW}-ewHhD|-HkuUv`vIwg`~6{LT-tXv>)ho!gafMsO9#=mX&Xq#({aR zG>DS2>4b02*LQF*w{wKX8PX3%*^dg6SP>ch8E+_-+Z7_Z2<79!91sxwZ~D6+QIPww zr-~Q&Q3BQ7rV_%gaB1zwl2Y34fVW`-W-o;a54qmHgCKm1-(W}Hc$Db}M z**+$+&F3D&3!eck?}D;l4^MbuP}%B;IY*SrZ&7AScAG-DnXf~DPq_8uDG14hpq@{_ z?k@gl=9I3>4Vsju9&_s+>PI&z)@5`nrwi+=pH4}GM)4^IF@i}YCo=(MnUmQ-JqLUH zG2X+7p!%PlEGfG`WBM;4Ybjt%Id28ch(}qe2;dTAMMKfE(qSAU{FtU3LjZYo;Tz*-Fv9L8$#w&>@kD|bZKJWn3=`=Zp| zK(8EaGN{ykn=<4zhepfj3F_DCS^Xk(cD)m2z5e-M3APja(OiA z;qLGuC{Ena`Or^psUQ6qjUFBY1by(W9occ`8Qj&RY5T?7mNAYYT!Ss1+o7@gv zJ2+)j1|I6^zqijpG za2!<<9WRk*H7Y8THR@j({rLVI7On_OZ8aC05hJgW`v^o6jA+$(8zl`GQ5i=cSH31iObpi@arpOHL?DvGZ&q#d1X4yWq^aNb7y9scPQUaoiL-VCAkKWEo#n;ICq zcCzB@+hCRPd1bt`*V<|Tg^n|69wdEW71zitn!vB-?`^u5GI7=HwgCNZBT zETm<+7+K!WtCRg}IP})lG{;O>TIIyj)lUUJ>N89-766|^$4q-KMo~Gd;v|`)Bq>MO z%TnD;_RDRrn`bY39nYJ6P<&;ItCX_sSXL%=Oqon#o9*=d;*!ckdJZy6X|KHaT(g#J znx=CQHbL*Az8&((#KDVy)>n8yv!)NvuJO^L-%1rch_K}r#MHgT?rqth!0 zA?=2}U?`rh;<^u2F41ZYtR3&V)!q&t=%uI=f;CbDvlwL8?wSn>e`xIV5{BJw)kM&_ z&CRMZ*}6@Y#1ry7_|JaiuaZKjUXY8{orb-1Nc`|kKg~|GEukeM?vl7tY)W>;oFSny z#SWHHh4Q~!-H|}s?j5SCk>AKO1HKakI8DV3q-P@*rhjzb(wvHm+gDC(HN+{5WmLV5 zV7F=V2BEZ)WV&y+;9>#Q`>%ia<6pnRwws18&nFM%fy zAaP!_bg+l+zeJFd_e8oKO?tp${gNnz=!PrHe|Ba0&osvwhl{DQb5Rk9!zq`O#8(qx z+yBYW_DKS*JeTb@*env&knfu2JF#Do?96upsUYxAE)dRtkO$4NX)rTtRt^xO2BHMq zZiqZhL7X@yihw4C&;wdaeORkeDJE{55?~5d zMMepOQ=?sO$;#H|WnPKF_W;Vj!vQ)}}+m$~aU z#Z=u{M+sMpe=e_rGzR83IY}s|(2VuN+f^g&%Z-|o)YDYc(toS3CBigi1y+k3(^@sqJr+2ewEO2T2_tsy$-k}gzYaJ_cC&PCu2sqg7#*BG8r<>4Hz z@qTS~cA<*QBOAv^u(H9LN!xgV7=FmIQW5uR9@!Wblb6*+^4_OhHL0W&n;luBfw?b{ zBrT3=`55VP^8t#7NST6@5VY22zK^Ws;m-y6N-X?Y;*|E%P#S0A_#`K2kXCI92(8@u z^dWt^cvYg0F6(-@U-FlfD%aeT=_s+~OdQ%ibfs4ba=!uc1Q4$xInHxdJ(o{XkLX+~ z{L-4AZ-wCGg;wph*OkC(gpWx+AekR6n^~n6SYTfL*e~!as0*o1Y+A4>3RzH2P_C~w^(7d%OC)bXi9GvX$f}&4e-e7j?=sAJql)40RWB)m%XpHrH2H)--A1 zMY0zqSNmieS$c18mUn)3K!f@f;hJ-xnI1T;(K1^+mIfkUg2@fVB2(c6C+7H3d~#>w zj-nq{@8A8rG?Lwe!Ik4M@s30h%t%lAyPWpurBvzXF)w&?_15RZ?b;6b_7LcjrY973onRMdv7l%H3=gI81>Vgdwsz7qH6=W@Kq$hY( ziqg-10)kET%51S`7>VkX6_rbU>!;mSTHsv zrK6)0peuCpOt6GTvl0DQtzV&sr&3%Cu`)%s&PN+ZsF%OA2kc z&1OgiFrFWrsHS_(H?pb_u~hxPu#g6^!n0a??^Cp}Og3#0bmB00^1(5xS*UAdn*HPJ z|2BJ7`*Xj~_^*h-m>d^w2n1dw^TP6sm_AQ*Go&kZ(`d97W&^fvxYuqPJt zDP34>Oke@Nr-k3i=KF6<|MiBEW0a^r>t@v7@YYI)_J64V;bRUWB11uH3R)HT|9=PS zzrJ^Ta!6Fr$+6ILv{SCY#-aOvTY6j^_(YFQZ$W@X#gqWs`+@l(_`{{147KxT(L3vJ z{WG$x%L`N)h?&$duM9x%-KvrPj*$=`jt?H#k zYZjwkGQs-XIU=!n@G^qMd)n#KkRbgjJrcIlYi6V$L&2IO8;iu!fGtIa5On*_-Ie=G z_f{m^h&!lN@5~_;SF=Yr;{j2a;?p${K9D!WY4u!L!a(-2tB?ENAiD6|pTJzuBM)xQ z-MX_LI-3oxN#5ASiMm6?{&V)n@ZQOHj&)m0;|@)ZVbc)-x!4!c -;; Nicolas Goaziou -;; Keywords: outlines, hypermedia, calendar, wp -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: -;; -;; This library implements an iCalendar back-end for Org generic -;; exporter. See Org manual for more information. -;; -;; It is expected to conform to RFC 5545. - -;;; Code: - -(require 'cl-lib) -(require 'ox-ascii) -(declare-function org-bbdb-anniv-export-ical "ol-bbdb" nil) - - - -;;; User-Configurable Variables - -(defgroup org-export-icalendar nil - "Options specific for iCalendar export back-end." - :tag "Org Export iCalendar" - :group 'org-export) - -(defcustom org-icalendar-combined-agenda-file "~/org.ics" - "The file name for the iCalendar file covering all agenda files. -This file is created with the command `\\[org-icalendar-combine-agenda-files]'. -The file name should be absolute. It will be overwritten without warning." - :group 'org-export-icalendar - :type 'file) - -(defcustom org-icalendar-alarm-time 0 - "Number of minutes for triggering an alarm for exported timed events. - -A zero value (the default) turns off the definition of an alarm trigger -for timed events. If non-zero, alarms are created. - -- a single alarm per entry is defined -- The alarm will go off N minutes before the event -- only a DISPLAY action is defined." - :group 'org-export-icalendar - :version "24.1" - :type 'integer) - -(defcustom org-icalendar-combined-name "OrgMode" - "Calendar name for the combined iCalendar representing all agenda files." - :group 'org-export-icalendar - :type 'string) - -(defcustom org-icalendar-combined-description "" - "Calendar description for the combined iCalendar (all agenda files)." - :group 'org-export-icalendar - :type 'string) - -(defcustom org-icalendar-exclude-tags nil - "Tags that exclude a tree from export. -This variable allows specifying different exclude tags from other -back-ends. It can also be set with the ICALENDAR_EXCLUDE_TAGS -keyword." - :group 'org-export-icalendar - :type '(repeat (string :tag "Tag"))) - -(defcustom org-icalendar-use-deadline '(event-if-not-todo todo-due) - "Contexts where iCalendar export should use a deadline time stamp. - -This is a list with possibly several symbols in it. Valid symbols are: - -`event-if-todo' - - Deadlines in TODO entries become calendar events. - -`event-if-todo-not-done' - - Deadlines in TODO entries with not-DONE state become events. - -`event-if-not-todo' - - Deadlines in non-TODO entries become calendar events. - -`todo-due' - - Use deadlines in TODO entries as due-dates." - :group 'org-export-icalendar - :type - '(set :greedy t - (const :tag "DEADLINE in non-TODO entries become events" - event-if-not-todo) - (const :tag "DEADLINE in TODO entries become events" - event-if-todo) - (const :tag "DEADLINE in TODO entries with not-DONE state become events" - event-if-todo-not-done) - (const :tag "DEADLINE in TODO entries become due-dates" - todo-due))) - -(defcustom org-icalendar-use-scheduled '(todo-start) - "Contexts where iCalendar export should use a scheduling time stamp. - -This is a list with possibly several symbols in it. Valid symbols are: - -`event-if-todo' - - Scheduling time stamps in TODO entries become an event. - -`event-if-todo-not-done' - - Scheduling time stamps in TODO entries with not-DONE state - become events. - -`event-if-not-todo' - - Scheduling time stamps in non-TODO entries become an event. - -`todo-start' - - Scheduling time stamps in TODO entries become start date. Some - calendar applications show TODO entries only after that date." - :group 'org-export-icalendar - :type - '(set :greedy t - (const :tag "SCHEDULED timestamps in non-TODO entries become events" - event-if-not-todo) - (const :tag "SCHEDULED timestamps in TODO entries become events" - event-if-todo) - (const :tag "SCHEDULED in TODO entries with not-DONE state become events" - event-if-todo-not-done) - (const :tag "SCHEDULED in TODO entries become start date" - todo-start))) - -(defcustom org-icalendar-categories '(local-tags category) - "Items that should be entered into the \"categories\" field. - -This is a list of symbols, the following are valid: -`category' The Org mode category of the current file or tree -`todo-state' The todo state, if any -`local-tags' The tags, defined in the current line -`all-tags' All tags, including inherited ones." - :group 'org-export-icalendar - :type '(repeat - (choice - (const :tag "The file or tree category" category) - (const :tag "The TODO state" todo-state) - (const :tag "Tags defined in current line" local-tags) - (const :tag "All tags, including inherited ones" all-tags)))) - -(defcustom org-icalendar-with-timestamps 'active - "Non-nil means make an event from plain time stamps. - -It can be set to `active', `inactive', t or nil, in order to make -an event from, respectively, only active timestamps, only -inactive ones, all of them or none. - -This variable has precedence over `org-export-with-timestamps'. -It can also be set with the #+OPTIONS line, e.g. \"<:t\"." - :group 'org-export-icalendar - :type '(choice - (const :tag "All timestamps" t) - (const :tag "Only active timestamps" active) - (const :tag "Only inactive timestamps" inactive) - (const :tag "No timestamp" nil))) - -(defcustom org-icalendar-include-todo nil - "Non-nil means create VTODO components from TODO items. - -Valid values are: -nil don't include any task. -t include tasks that are not in DONE state. -`unblocked' include all TODO items that are not blocked. -`all' include both done and not done items." - :group 'org-export-icalendar - :type '(choice - (const :tag "None" nil) - (const :tag "Unfinished" t) - (const :tag "Unblocked" unblocked) - (const :tag "All" all) - (repeat :tag "Specific TODO keywords" - (string :tag "Keyword")))) - -(defcustom org-icalendar-include-bbdb-anniversaries nil - "Non-nil means a combined iCalendar file should include anniversaries. -The anniversaries are defined in the BBDB database." - :group 'org-export-icalendar - :type 'boolean) - -(defcustom org-icalendar-include-sexps t - "Non-nil means export to iCalendar files should also cover sexp entries. -These are entries like in the diary, but directly in an Org file." - :group 'org-export-icalendar - :type 'boolean) - -(defcustom org-icalendar-include-body t - "Amount of text below headline to be included in iCalendar export. -This is a number of characters that should maximally be included. -Properties, scheduling and clocking lines will always be removed. -The text will be inserted into the DESCRIPTION field." - :group 'org-export-icalendar - :type '(choice - (const :tag "Nothing" nil) - (const :tag "Everything" t) - (integer :tag "Max characters"))) - -(defcustom org-icalendar-store-UID nil - "Non-nil means store any created UIDs in properties. - -The iCalendar standard requires that all entries have a unique identifier. -Org will create these identifiers as needed. When this variable is non-nil, -the created UIDs will be stored in the ID property of the entry. Then the -next time this entry is exported, it will be exported with the same UID, -superseding the previous form of it. This is essential for -synchronization services. - -This variable is not turned on by default because we want to avoid creating -a property drawer in every entry if people are only playing with this feature, -or if they are only using it locally." - :group 'org-export-icalendar - :type 'boolean) - -(defcustom org-icalendar-timezone (getenv "TZ") - "The time zone string for iCalendar export. -When nil or the empty string, use output -from (current-time-zone)." - :group 'org-export-icalendar - :type '(choice - (const :tag "Unspecified" nil) - (string :tag "Time zone"))) - -(defcustom org-icalendar-date-time-format ":%Y%m%dT%H%M%S" - "Format-string for exporting icalendar DATE-TIME. - -See `format-time-string' for a full documentation. The only -difference is that `org-icalendar-timezone' is used for %Z. - -Interesting value are: - - \":%Y%m%dT%H%M%S\" for local time - - \";TZID=%Z:%Y%m%dT%H%M%S\" for local time with explicit timezone - - \":%Y%m%dT%H%M%SZ\" for time expressed in Universal Time" - :group 'org-export-icalendar - :version "24.1" - :type '(choice - (const :tag "Local time" ":%Y%m%dT%H%M%S") - (const :tag "Explicit local time" ";TZID=%Z:%Y%m%dT%H%M%S") - (const :tag "Universal time" ":%Y%m%dT%H%M%SZ") - (string :tag "Explicit format"))) - -(defvar org-icalendar-after-save-hook nil - "Hook run after an iCalendar file has been saved. -This hook is run with the name of the file as argument. A good -way to use this is to tell a desktop calendar application to -re-read the iCalendar file.") - - - -;;; Define Back-End - -(org-export-define-derived-backend 'icalendar 'ascii - :translate-alist '((clock . ignore) - (footnote-definition . ignore) - (footnote-reference . ignore) - (headline . org-icalendar-entry) - (inlinetask . ignore) - (planning . ignore) - (section . ignore) - (inner-template . (lambda (c i) c)) - (template . org-icalendar-template)) - :options-alist - '((:exclude-tags - "ICALENDAR_EXCLUDE_TAGS" nil org-icalendar-exclude-tags split) - (:with-timestamps nil "<" org-icalendar-with-timestamps) - ;; Other variables. - (:icalendar-alarm-time nil nil org-icalendar-alarm-time) - (:icalendar-categories nil nil org-icalendar-categories) - (:icalendar-date-time-format nil nil org-icalendar-date-time-format) - (:icalendar-include-bbdb-anniversaries nil nil org-icalendar-include-bbdb-anniversaries) - (:icalendar-include-body nil nil org-icalendar-include-body) - (:icalendar-include-sexps nil nil org-icalendar-include-sexps) - (:icalendar-include-todo nil nil org-icalendar-include-todo) - (:icalendar-store-UID nil nil org-icalendar-store-UID) - (:icalendar-timezone nil nil org-icalendar-timezone) - (:icalendar-use-deadline nil nil org-icalendar-use-deadline) - (:icalendar-use-scheduled nil nil org-icalendar-use-scheduled)) - :filters-alist - '((:filter-headline . org-icalendar-clear-blank-lines)) - :menu-entry - '(?c "Export to iCalendar" - ((?f "Current file" org-icalendar-export-to-ics) - (?a "All agenda files" - (lambda (a s v b) (org-icalendar-export-agenda-files a))) - (?c "Combine all agenda files" - (lambda (a s v b) (org-icalendar-combine-agenda-files a)))))) - - - -;;; Internal Functions - -(defun org-icalendar-create-uid (file &optional bell) - "Set ID property on headlines missing it in FILE. -When optional argument BELL is non-nil, inform the user with -a message if the file was modified." - (let (modified-flag) - (org-map-entries - (lambda () - (let ((entry (org-element-at-point))) - (unless (org-element-property :ID entry) - (org-id-get-create) - (setq modified-flag t) - (forward-line)))) - nil nil 'comment) - (when (and bell modified-flag) - (message "ID properties created in file \"%s\"" file) - (sit-for 2)))) - -(defun org-icalendar-blocked-headline-p (headline info) - "Non-nil when HEADLINE is considered to be blocked. - -INFO is a plist used as a communication channel. - -A headline is blocked when either - - - it has children which are not all in a completed state; - - - it has a parent with the property :ORDERED:, and there are - siblings prior to it with incomplete status; - - - its parent is blocked because it has siblings that should be - done first or is a child of a blocked grandparent entry." - (or - ;; Check if any child is not done. - (org-element-map (org-element-contents headline) 'headline - (lambda (hl) (eq (org-element-property :todo-type hl) 'todo)) - info 'first-match) - ;; Check :ORDERED: node property. - (catch 'blockedp - (let ((current headline)) - (dolist (parent (org-element-lineage headline)) - (cond - ((not (org-element-property :todo-keyword parent)) - (throw 'blockedp nil)) - ((org-not-nil (org-element-property :ORDERED parent)) - (let ((sibling current)) - (while (setq sibling (org-export-get-previous-element - sibling info)) - (when (eq (org-element-property :todo-type sibling) 'todo) - (throw 'blockedp t))))) - (t (setq current parent)))))))) - -(defun org-icalendar-use-UTC-date-time-p () - "Non-nil when `org-icalendar-date-time-format' requires UTC time." - (char-equal (elt org-icalendar-date-time-format - (1- (length org-icalendar-date-time-format))) ?Z)) - -(defvar org-agenda-default-appointment-duration) ; From org-agenda.el. -(defun org-icalendar-convert-timestamp (timestamp keyword &optional end tz) - "Convert TIMESTAMP to iCalendar format. - -TIMESTAMP is a timestamp object. KEYWORD is added in front of -it, in order to make a complete line (e.g. \"DTSTART\"). - -When optional argument END is non-nil, use end of time range. -Also increase the hour by two (if time string contains a time), -or the day by one (if it does not contain a time) when no -explicit ending time is specified. - -When optional argument TZ is non-nil, timezone data time will be -added to the timestamp. It can be the string \"UTC\", to use UTC -time, or a string in the IANA TZ database -format (e.g. \"Europe/London\"). In either case, the value of -`org-icalendar-date-time-format' will be ignored." - (let* ((year-start (org-element-property :year-start timestamp)) - (year-end (org-element-property :year-end timestamp)) - (month-start (org-element-property :month-start timestamp)) - (month-end (org-element-property :month-end timestamp)) - (day-start (org-element-property :day-start timestamp)) - (day-end (org-element-property :day-end timestamp)) - (hour-start (org-element-property :hour-start timestamp)) - (hour-end (org-element-property :hour-end timestamp)) - (minute-start (org-element-property :minute-start timestamp)) - (minute-end (org-element-property :minute-end timestamp)) - (with-time-p minute-start) - (equal-bounds-p - (equal (list year-start month-start day-start hour-start minute-start) - (list year-end month-end day-end hour-end minute-end))) - (mi (cond ((not with-time-p) 0) - ((not end) minute-start) - ((and org-agenda-default-appointment-duration equal-bounds-p) - (+ minute-end org-agenda-default-appointment-duration)) - (t minute-end))) - (h (cond ((not with-time-p) 0) - ((not end) hour-start) - ((or (not equal-bounds-p) - org-agenda-default-appointment-duration) - hour-end) - (t (+ hour-end 2)))) - (d (cond ((not end) day-start) - ((not with-time-p) (1+ day-end)) - (t day-end))) - (m (if end month-end month-start)) - (y (if end year-end year-start))) - (concat - keyword - (format-time-string - (cond ((string-equal tz "UTC") ":%Y%m%dT%H%M%SZ") - ((not with-time-p) ";VALUE=DATE:%Y%m%d") - ((stringp tz) (concat ";TZID=" tz ":%Y%m%dT%H%M%S")) - (t (replace-regexp-in-string "%Z" - org-icalendar-timezone - org-icalendar-date-time-format - t))) - ;; Convert timestamp into internal time in order to use - ;; `format-time-string' and fix any mistake (i.e. MI >= 60). - (encode-time 0 mi h d m y) - (and (or (string-equal tz "UTC") - (and (null tz) - with-time-p - (org-icalendar-use-UTC-date-time-p))) - t))))) - -(defun org-icalendar-dtstamp () - "Return DTSTAMP property, as a string." - (format-time-string "DTSTAMP:%Y%m%dT%H%M%SZ" nil t)) - -(defun org-icalendar-get-categories (entry info) - "Return categories according to `org-icalendar-categories'. -ENTRY is a headline or an inlinetask element. INFO is a plist -used as a communication channel." - (mapconcat - #'identity - (org-uniquify - (let (categories) - (dolist (type org-icalendar-categories (nreverse categories)) - (cl-case type - (category - (push (org-export-get-category entry info) categories)) - (todo-state - (let ((todo (org-element-property :todo-keyword entry))) - (and todo (push todo categories)))) - (local-tags - (setq categories - (append (nreverse (org-export-get-tags entry info)) - categories))) - (all-tags - (setq categories - (append (nreverse (org-export-get-tags entry info nil t)) - categories))))))) - ",")) - -(defun org-icalendar-transcode-diary-sexp (sexp uid summary) - "Transcode a diary sexp into iCalendar format. -SEXP is the diary sexp being transcoded, as a string. UID is the -unique identifier for the entry. SUMMARY defines a short summary -or subject for the event." - (when (require 'icalendar nil t) - (org-element-normalize-string - (with-temp-buffer - (let ((sexp (if (not (string-match "\\`<%%" sexp)) sexp - (concat (substring sexp 1 -1) " " summary)))) - (put-text-property 0 1 'uid uid sexp) - (insert sexp "\n")) - (org-diary-to-ical-string (current-buffer)))))) - -(defun org-icalendar-cleanup-string (s) - "Cleanup string S according to RFC 5545." - (when s - ;; Protect "\", "," and ";" characters. and replace newline - ;; characters with literal \n. - (replace-regexp-in-string - "[ \t]*\n" "\\n" - (replace-regexp-in-string "[\\,;]" "\\\\\\&" s) - nil t))) - -(defun org-icalendar-fold-string (s) - "Fold string S according to RFC 5545." - (org-element-normalize-string - (mapconcat - (lambda (line) - ;; Limit each line to a maximum of 75 characters. If it is - ;; longer, fold it by using "\r\n " as a continuation marker. - (let ((len (length line))) - (if (<= len 75) line - (let ((folded-line (substring line 0 75)) - (chunk-start 75) - chunk-end) - ;; Since continuation marker takes up one character on the - ;; line, real contents must be split at 74 chars. - (while (< (setq chunk-end (+ chunk-start 74)) len) - (setq folded-line - (concat folded-line "\r\n " - (substring line chunk-start chunk-end)) - chunk-start chunk-end)) - (concat folded-line "\r\n " (substring line chunk-start)))))) - (org-split-string s "\n") "\r\n"))) - - - -;;; Filters - -(defun org-icalendar-clear-blank-lines (headline _back-end _info) - "Remove blank lines in HEADLINE export. -HEADLINE is a string representing a transcoded headline. -BACK-END and INFO are ignored." - (replace-regexp-in-string "^\\(?:[ \t]*\n\\)+" "" headline)) - - - -;;; Transcode Functions - -;;;; Headline and Inlinetasks - -;; The main function is `org-icalendar-entry', which extracts -;; information from a headline or an inlinetask (summary, -;; description...) and then delegates code generation to -;; `org-icalendar--vtodo' and `org-icalendar--vevent', depending -;; on the component needed. - -;; Obviously, `org-icalendar--valarm' handles alarms, which can -;; happen within a VTODO component. - -(defun org-icalendar-entry (entry contents info) - "Transcode ENTRY element into iCalendar format. - -ENTRY is either a headline or an inlinetask. CONTENTS is -ignored. INFO is a plist used as a communication channel. - -This function is called on every headline, the section below -it (minus inlinetasks) being its contents. It tries to create -VEVENT and VTODO components out of scheduled date, deadline date, -plain timestamps, diary sexps. It also calls itself on every -inlinetask within the section." - (unless (org-element-property :footnote-section-p entry) - (let* ((type (org-element-type entry)) - ;; Determine contents really associated to the entry. For - ;; a headline, limit them to section, if any. For an - ;; inlinetask, this is every element within the task. - (inside - (if (eq type 'inlinetask) - (cons 'org-data (cons nil (org-element-contents entry))) - (let ((first (car (org-element-contents entry)))) - (and (eq (org-element-type first) 'section) - (cons 'org-data - (cons nil (org-element-contents first)))))))) - (concat - (let ((todo-type (org-element-property :todo-type entry)) - (uid (or (org-element-property :ID entry) (org-id-new))) - (summary (org-icalendar-cleanup-string - (or (org-element-property :SUMMARY entry) - (org-export-data - (org-element-property :title entry) info)))) - (loc (org-icalendar-cleanup-string - (org-export-get-node-property - :LOCATION entry - (org-property-inherit-p "LOCATION")))) - (class (org-icalendar-cleanup-string - (org-export-get-node-property - :CLASS entry - (org-property-inherit-p "CLASS")))) - ;; Build description of the entry from associated section - ;; (headline) or contents (inlinetask). - (desc - (org-icalendar-cleanup-string - (or (org-element-property :DESCRIPTION entry) - (let ((contents (org-export-data inside info))) - (cond - ((not (org-string-nw-p contents)) nil) - ((wholenump org-icalendar-include-body) - (let ((contents (org-trim contents))) - (substring - contents 0 (min (length contents) - org-icalendar-include-body)))) - (org-icalendar-include-body (org-trim contents))))))) - (cat (org-icalendar-get-categories entry info)) - (tz (org-export-get-node-property - :TIMEZONE entry - (org-property-inherit-p "TIMEZONE")))) - (concat - ;; Events: Delegate to `org-icalendar--vevent' to generate - ;; "VEVENT" component from scheduled, deadline, or any - ;; timestamp in the entry. - (let ((deadline (org-element-property :deadline entry)) - (use-deadline (plist-get info :icalendar-use-deadline))) - (and deadline - (pcase todo-type - (`todo (or (memq 'event-if-todo-not-done use-deadline) - (memq 'event-if-todo use-deadline))) - (`done (memq 'event-if-todo use-deadline)) - (_ (memq 'event-if-not-todo use-deadline))) - (org-icalendar--vevent - entry deadline (concat "DL-" uid) - (concat "DL: " summary) loc desc cat tz class))) - (let ((scheduled (org-element-property :scheduled entry)) - (use-scheduled (plist-get info :icalendar-use-scheduled))) - (and scheduled - (pcase todo-type - (`todo (or (memq 'event-if-todo-not-done use-scheduled) - (memq 'event-if-todo use-scheduled))) - (`done (memq 'event-if-todo use-scheduled)) - (_ (memq 'event-if-not-todo use-scheduled))) - (org-icalendar--vevent - entry scheduled (concat "SC-" uid) - (concat "S: " summary) loc desc cat tz class))) - ;; When collecting plain timestamps from a headline and its - ;; title, skip inlinetasks since collection will happen once - ;; ENTRY is one of them. - (let ((counter 0)) - (mapconcat - #'identity - (org-element-map (cons (org-element-property :title entry) - (org-element-contents inside)) - 'timestamp - (lambda (ts) - (when (let ((type (org-element-property :type ts))) - (cl-case (plist-get info :with-timestamps) - (active (memq type '(active active-range))) - (inactive (memq type '(inactive inactive-range))) - ((t) t))) - (let ((uid (format "TS%d-%s" (cl-incf counter) uid))) - (org-icalendar--vevent - entry ts uid summary loc desc cat tz class)))) - info nil (and (eq type 'headline) 'inlinetask)) - "")) - ;; Task: First check if it is appropriate to export it. If - ;; so, call `org-icalendar--vtodo' to transcode it into - ;; a "VTODO" component. - (when (and todo-type - (cl-case (plist-get info :icalendar-include-todo) - (all t) - (unblocked - (and (eq type 'headline) - (not (org-icalendar-blocked-headline-p - entry info)))) - ((t) (eq todo-type 'todo)))) - (org-icalendar--vtodo entry uid summary loc desc cat tz class)) - ;; Diary-sexp: Collect every diary-sexp element within ENTRY - ;; and its title, and transcode them. If ENTRY is - ;; a headline, skip inlinetasks: they will be handled - ;; separately. - (when org-icalendar-include-sexps - (let ((counter 0)) - (mapconcat #'identity - (org-element-map - (cons (org-element-property :title entry) - (org-element-contents inside)) - 'diary-sexp - (lambda (sexp) - (org-icalendar-transcode-diary-sexp - (org-element-property :value sexp) - (format "DS%d-%s" (cl-incf counter) uid) - summary)) - info nil (and (eq type 'headline) 'inlinetask)) - ""))))) - ;; If ENTRY is a headline, call current function on every - ;; inlinetask within it. In agenda export, this is independent - ;; from the mark (or lack thereof) on the entry. - (when (eq type 'headline) - (mapconcat #'identity - (org-element-map inside 'inlinetask - (lambda (task) (org-icalendar-entry task nil info)) - info) "")) - ;; Don't forget components from inner entries. - contents)))) - -(defun org-icalendar--vevent - (entry timestamp uid summary location description categories timezone class) - "Create a VEVENT component. - -ENTRY is either a headline or an inlinetask element. TIMESTAMP -is a timestamp object defining the date-time of the event. UID -is the unique identifier for the event. SUMMARY defines a short -summary or subject for the event. LOCATION defines the intended -venue for the event. DESCRIPTION provides the complete -description of the event. CATEGORIES defines the categories the -event belongs to. TIMEZONE specifies a time zone for this event -only. CLASS contains the visibility attribute. Three of them -(\"PUBLIC\", \"CONFIDENTIAL\", and \"PRIVATE\") are predefined, others -should be treated as \"PRIVATE\" if they are unknown to the iCalendar server. - -Return VEVENT component as a string." - (org-icalendar-fold-string - (if (eq (org-element-property :type timestamp) 'diary) - (org-icalendar-transcode-diary-sexp - (org-element-property :raw-value timestamp) uid summary) - (concat "BEGIN:VEVENT\n" - (org-icalendar-dtstamp) "\n" - "UID:" uid "\n" - (org-icalendar-convert-timestamp timestamp "DTSTART" nil timezone) "\n" - (org-icalendar-convert-timestamp timestamp "DTEND" t timezone) "\n" - ;; RRULE. - (when (org-element-property :repeater-type timestamp) - (format "RRULE:FREQ=%s;INTERVAL=%d\n" - (cl-case (org-element-property :repeater-unit timestamp) - (hour "HOURLY") (day "DAILY") (week "WEEKLY") - (month "MONTHLY") (year "YEARLY")) - (org-element-property :repeater-value timestamp))) - "SUMMARY:" summary "\n" - (and (org-string-nw-p location) (format "LOCATION:%s\n" location)) - (and (org-string-nw-p class) (format "CLASS:%s\n" class)) - (and (org-string-nw-p description) - (format "DESCRIPTION:%s\n" description)) - "CATEGORIES:" categories "\n" - ;; VALARM. - (org-icalendar--valarm entry timestamp summary) - "END:VEVENT")))) - -(defun org-icalendar--vtodo - (entry uid summary location description categories timezone class) - "Create a VTODO component. - -ENTRY is either a headline or an inlinetask element. UID is the -unique identifier for the task. SUMMARY defines a short summary -or subject for the task. LOCATION defines the intended venue for -the task. DESCRIPTION provides the complete description of the -task. CATEGORIES defines the categories the task belongs to. -TIMEZONE specifies a time zone for this TODO only. - -Return VTODO component as a string." - (let ((start (or (and (memq 'todo-start org-icalendar-use-scheduled) - (org-element-property :scheduled entry)) - ;; If we can't use a scheduled time for some - ;; reason, start task now. - (let ((now (decode-time))) - (list 'timestamp - (list :type 'active - :minute-start (nth 1 now) - :hour-start (nth 2 now) - :day-start (nth 3 now) - :month-start (nth 4 now) - :year-start (nth 5 now))))))) - (org-icalendar-fold-string - (concat "BEGIN:VTODO\n" - "UID:TODO-" uid "\n" - (org-icalendar-dtstamp) "\n" - (org-icalendar-convert-timestamp start "DTSTART" nil timezone) "\n" - (and (memq 'todo-due org-icalendar-use-deadline) - (org-element-property :deadline entry) - (concat (org-icalendar-convert-timestamp - (org-element-property :deadline entry) "DUE" nil timezone) - "\n")) - "SUMMARY:" summary "\n" - (and (org-string-nw-p location) (format "LOCATION:%s\n" location)) - (and (org-string-nw-p class) (format "CLASS:%s\n" class)) - (and (org-string-nw-p description) - (format "DESCRIPTION:%s\n" description)) - "CATEGORIES:" categories "\n" - "SEQUENCE:1\n" - (format "PRIORITY:%d\n" - (let ((pri (or (org-element-property :priority entry) - org-default-priority))) - (floor (- 9 (* 8. (/ (float (- org-lowest-priority pri)) - (- org-lowest-priority - org-highest-priority))))))) - (format "STATUS:%s\n" - (if (eq (org-element-property :todo-type entry) 'todo) - "NEEDS-ACTION" - "COMPLETED")) - "END:VTODO")))) - -(defun org-icalendar--valarm (entry timestamp summary) - "Create a VALARM component. - -ENTRY is the calendar entry triggering the alarm. TIMESTAMP is -the start date-time of the entry. SUMMARY defines a short -summary or subject for the task. - -Return VALARM component as a string, or nil if it isn't allowed." - ;; Create a VALARM entry if the entry is timed. This is not very - ;; general in that: - ;; (a) only one alarm per entry is defined, - ;; (b) only minutes are allowed for the trigger period ahead of the - ;; start time, - ;; (c) only a DISPLAY action is defined. [ESF] - (let ((alarm-time - (let ((warntime - (org-element-property :APPT_WARNTIME entry))) - (if warntime (string-to-number warntime) 0)))) - (and (or (> alarm-time 0) (> org-icalendar-alarm-time 0)) - (org-element-property :hour-start timestamp) - (format "BEGIN:VALARM -ACTION:DISPLAY -DESCRIPTION:%s -TRIGGER:-P0DT0H%dM0S -END:VALARM\n" - summary - (if (zerop alarm-time) org-icalendar-alarm-time alarm-time))))) - - -;;;; Template - -(defun org-icalendar-template (contents info) - "Return complete document string after iCalendar conversion. -CONTENTS is the transcoded contents string. INFO is a plist used -as a communication channel." - (org-icalendar--vcalendar - ;; Name. - (if (not (plist-get info :input-file)) (buffer-name (buffer-base-buffer)) - (file-name-nondirectory - (file-name-sans-extension (plist-get info :input-file)))) - ;; Owner. - (if (not (plist-get info :with-author)) "" - (org-export-data (plist-get info :author) info)) - ;; Timezone. - (if (org-string-nw-p org-icalendar-timezone) org-icalendar-timezone - (cadr (current-time-zone))) - ;; Description. - (org-export-data (plist-get info :title) info) - contents)) - -(defun org-icalendar--vcalendar (name owner tz description contents) - "Create a VCALENDAR component. -NAME, OWNER, TZ, DESCRIPTION and CONTENTS are all strings giving, -respectively, the name of the calendar, its owner, the timezone -used, a short description and the other components included." - (concat (format "BEGIN:VCALENDAR -VERSION:2.0 -X-WR-CALNAME:%s -PRODID:-//%s//Emacs with Org mode//EN -X-WR-TIMEZONE:%s -X-WR-CALDESC:%s -CALSCALE:GREGORIAN\n" - (org-icalendar-cleanup-string name) - (org-icalendar-cleanup-string owner) - (org-icalendar-cleanup-string tz) - (org-icalendar-cleanup-string description)) - contents - "END:VCALENDAR\n")) - - - -;;; Interactive Functions - -;;;###autoload -(defun org-icalendar-export-to-ics - (&optional async subtreep visible-only body-only) - "Export current buffer to an iCalendar file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only write code -between \"BEGIN:VCALENDAR\" and \"END:VCALENDAR\". - -Return ICS file name." - (interactive) - (let ((file (buffer-file-name (buffer-base-buffer)))) - (when (and file org-icalendar-store-UID) - (org-icalendar-create-uid file 'warn-user))) - ;; Export part. Since this back-end is backed up by `ascii', ensure - ;; links will not be collected at the end of sections. - (let ((outfile (org-export-output-file-name ".ics" subtreep))) - (org-export-to-file 'icalendar outfile - async subtreep visible-only body-only - '(:ascii-charset utf-8 :ascii-links-to-notes nil) - (lambda (file) - (run-hook-with-args 'org-icalendar-after-save-hook file) nil)))) - -;;;###autoload -(defun org-icalendar-export-agenda-files (&optional async) - "Export all agenda files to iCalendar files. -When optional argument ASYNC is non-nil, export happens in an -external process." - (interactive) - (if async - ;; Asynchronous export is not interactive, so we will not call - ;; `org-check-agenda-file'. Instead we remove any non-existent - ;; agenda file from the list. - (let ((files (cl-remove-if-not #'file-exists-p (org-agenda-files t)))) - (org-export-async-start - (lambda (results) - (dolist (f results) (org-export-add-to-stack f 'icalendar))) - `(let (output-files) - (dolist (file ',files outputfiles) - (with-current-buffer (org-get-agenda-file-buffer file) - (push (expand-file-name (org-icalendar-export-to-ics)) - output-files)))))) - (let ((files (org-agenda-files t))) - (org-agenda-prepare-buffers files) - (unwind-protect - (dolist (file files) - (catch 'nextfile - (org-check-agenda-file file) - (with-current-buffer (org-get-agenda-file-buffer file) - (org-icalendar-export-to-ics)))) - (org-release-buffers org-agenda-new-buffers))))) - -;;;###autoload -(defun org-icalendar-combine-agenda-files (&optional async) - "Combine all agenda files into a single iCalendar file. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -The file is stored under the name chosen in -`org-icalendar-combined-agenda-file'." - (interactive) - (if async - (let ((files (cl-remove-if-not #'file-exists-p (org-agenda-files t)))) - (org-export-async-start - (lambda (_) - (org-export-add-to-stack - (expand-file-name org-icalendar-combined-agenda-file) - 'icalendar)) - `(apply #'org-icalendar--combine-files ',files))) - (apply #'org-icalendar--combine-files (org-agenda-files t)))) - -(defun org-icalendar-export-current-agenda (file) - "Export current agenda view to an iCalendar FILE. -This function assumes major mode for current buffer is -`org-agenda-mode'." - (let* ((org-export-use-babel) ;don't evaluate Babel blocks - (contents - (org-export-string-as - (with-output-to-string - (save-excursion - (let ((p (point-min)) - (seen nil)) ;prevent duplicates - (while (setq p (next-single-property-change p 'org-hd-marker)) - (let ((m (get-text-property p 'org-hd-marker))) - (when (and m (not (member m seen))) - (push m seen) - (with-current-buffer (marker-buffer m) - (org-with-wide-buffer - (goto-char (marker-position m)) - (princ - (org-element-normalize-string - (buffer-substring (point) - (org-entry-end-position)))))))) - (forward-line))))) - 'icalendar t - '(:ascii-charset utf-8 :ascii-links-to-notes nil - :icalendar-include-todo all)))) - (with-temp-file file - (insert - (org-icalendar--vcalendar - org-icalendar-combined-name - user-full-name - (or (org-string-nw-p org-icalendar-timezone) (cadr (current-time-zone))) - org-icalendar-combined-description - contents))) - (run-hook-with-args 'org-icalendar-after-save-hook file))) - -(defun org-icalendar--combine-files (&rest files) - "Combine entries from multiple files into an iCalendar file. -FILES is a list of files to build the calendar from." - ;; At the end of the process, all buffers related to FILES are going - ;; to be killed. Make sure to only kill the ones opened in the - ;; process. - (let ((org-agenda-new-buffers nil)) - (unwind-protect - (progn - (with-temp-file org-icalendar-combined-agenda-file - (insert - (org-icalendar--vcalendar - ;; Name. - org-icalendar-combined-name - ;; Owner. - user-full-name - ;; Timezone. - (or (org-string-nw-p org-icalendar-timezone) - (cadr (current-time-zone))) - ;; Description. - org-icalendar-combined-description - ;; Contents. - (concat - ;; Agenda contents. - (mapconcat - (lambda (file) - (catch 'nextfile - (org-check-agenda-file file) - (with-current-buffer (org-get-agenda-file-buffer file) - ;; Create ID if necessary. - (when org-icalendar-store-UID - (org-icalendar-create-uid file t)) - (org-export-as - 'icalendar nil nil t - '(:ascii-charset utf-8 :ascii-links-to-notes nil))))) - files "") - ;; BBDB anniversaries. - (when (and org-icalendar-include-bbdb-anniversaries - (require 'ol-bbdb nil t)) - (with-output-to-string (org-bbdb-anniv-export-ical))))))) - (run-hook-with-args 'org-icalendar-after-save-hook - org-icalendar-combined-agenda-file)) - (org-release-buffers org-agenda-new-buffers)))) - - -(provide 'ox-icalendar) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox-icalendar.el ends here diff --git a/elpa/org-9.3.6/ox-icalendar.elc b/elpa/org-9.3.6/ox-icalendar.elc deleted file mode 100644 index e86e22ddfd537e25e90d474bbc931a0a4a0fc793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37290 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 -;; Keywords: outlines, hypermedia, calendar, wp - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: -;; -;; See Org manual for details. - -;;; Code: - -(require 'cl-lib) -(require 'ox) -(require 'ox-publish) - -(defvar org-latex-default-packages-alist) -(defvar org-latex-packages-alist) -(defvar orgtbl-exp-regexp) - - - -;;; Define Back-End - -(org-export-define-backend 'latex - '((bold . org-latex-bold) - (center-block . org-latex-center-block) - (clock . org-latex-clock) - (code . org-latex-code) - (drawer . org-latex-drawer) - (dynamic-block . org-latex-dynamic-block) - (entity . org-latex-entity) - (example-block . org-latex-example-block) - (export-block . org-latex-export-block) - (export-snippet . org-latex-export-snippet) - (fixed-width . org-latex-fixed-width) - (footnote-definition . org-latex-footnote-definition) - (footnote-reference . org-latex-footnote-reference) - (headline . org-latex-headline) - (horizontal-rule . org-latex-horizontal-rule) - (inline-src-block . org-latex-inline-src-block) - (inlinetask . org-latex-inlinetask) - (italic . org-latex-italic) - (item . org-latex-item) - (keyword . org-latex-keyword) - (latex-environment . org-latex-latex-environment) - (latex-fragment . org-latex-latex-fragment) - (line-break . org-latex-line-break) - (link . org-latex-link) - (node-property . org-latex-node-property) - (paragraph . org-latex-paragraph) - (plain-list . org-latex-plain-list) - (plain-text . org-latex-plain-text) - (planning . org-latex-planning) - (property-drawer . org-latex-property-drawer) - (quote-block . org-latex-quote-block) - (radio-target . org-latex-radio-target) - (section . org-latex-section) - (special-block . org-latex-special-block) - (src-block . org-latex-src-block) - (statistics-cookie . org-latex-statistics-cookie) - (strike-through . org-latex-strike-through) - (subscript . org-latex-subscript) - (superscript . org-latex-superscript) - (table . org-latex-table) - (table-cell . org-latex-table-cell) - (table-row . org-latex-table-row) - (target . org-latex-target) - (template . org-latex-template) - (timestamp . org-latex-timestamp) - (underline . org-latex-underline) - (verbatim . org-latex-verbatim) - (verse-block . org-latex-verse-block) - ;; Pseudo objects and elements. - (latex-math-block . org-latex-math-block) - (latex-matrices . org-latex-matrices)) - :menu-entry - '(?l "Export to LaTeX" - ((?L "As LaTeX buffer" org-latex-export-as-latex) - (?l "As LaTeX file" org-latex-export-to-latex) - (?p "As PDF file" org-latex-export-to-pdf) - (?o "As PDF file and open" - (lambda (a s v b) - (if a (org-latex-export-to-pdf t s v b) - (org-open-file (org-latex-export-to-pdf nil s v b))))))) - :filters-alist '((:filter-options . org-latex-math-block-options-filter) - (:filter-paragraph . org-latex-clean-invalid-line-breaks) - (:filter-parse-tree org-latex-math-block-tree-filter - org-latex-matrices-tree-filter - org-latex-image-link-filter) - (:filter-verse-block . org-latex-clean-invalid-line-breaks)) - :options-alist - '((:latex-class "LATEX_CLASS" nil org-latex-default-class t) - (:latex-class-options "LATEX_CLASS_OPTIONS" nil nil t) - (:latex-header "LATEX_HEADER" nil nil newline) - (:latex-header-extra "LATEX_HEADER_EXTRA" nil nil newline) - (:description "DESCRIPTION" nil nil parse) - (:keywords "KEYWORDS" nil nil parse) - (:subtitle "SUBTITLE" nil nil parse) - ;; Other variables. - (:latex-active-timestamp-format nil nil org-latex-active-timestamp-format) - (:latex-caption-above nil nil org-latex-caption-above) - (:latex-classes nil nil org-latex-classes) - (:latex-default-figure-position nil nil org-latex-default-figure-position) - (:latex-default-table-environment nil nil org-latex-default-table-environment) - (:latex-default-table-mode nil nil org-latex-default-table-mode) - (:latex-diary-timestamp-format nil nil org-latex-diary-timestamp-format) - (:latex-footnote-defined-format nil nil org-latex-footnote-defined-format) - (:latex-footnote-separator nil nil org-latex-footnote-separator) - (:latex-format-drawer-function nil nil org-latex-format-drawer-function) - (:latex-format-headline-function nil nil org-latex-format-headline-function) - (:latex-format-inlinetask-function nil nil org-latex-format-inlinetask-function) - (:latex-hyperref-template nil nil org-latex-hyperref-template t) - (:latex-image-default-scale nil nil org-latex-image-default-scale) - (:latex-image-default-height nil nil org-latex-image-default-height) - (:latex-image-default-option nil nil org-latex-image-default-option) - (:latex-image-default-width nil nil org-latex-image-default-width) - (:latex-images-centered nil nil org-latex-images-centered) - (:latex-inactive-timestamp-format nil nil org-latex-inactive-timestamp-format) - (:latex-inline-image-rules nil nil org-latex-inline-image-rules) - (:latex-link-with-unknown-path-format nil nil org-latex-link-with-unknown-path-format) - (:latex-listings nil nil org-latex-listings) - (:latex-listings-langs nil nil org-latex-listings-langs) - (:latex-listings-options nil nil org-latex-listings-options) - (:latex-minted-langs nil nil org-latex-minted-langs) - (:latex-minted-options nil nil org-latex-minted-options) - (:latex-prefer-user-labels nil nil org-latex-prefer-user-labels) - (:latex-subtitle-format nil nil org-latex-subtitle-format) - (:latex-subtitle-separate nil nil org-latex-subtitle-separate) - (:latex-table-scientific-notation nil nil org-latex-table-scientific-notation) - (:latex-tables-booktabs nil nil org-latex-tables-booktabs) - (:latex-tables-centered nil nil org-latex-tables-centered) - (:latex-text-markup-alist nil nil org-latex-text-markup-alist) - (:latex-title-command nil nil org-latex-title-command) - (:latex-toc-command nil nil org-latex-toc-command) - (:latex-compiler "LATEX_COMPILER" nil org-latex-compiler) - ;; Redefine regular options. - (:date "DATE" nil "\\today" parse))) - - - -;;; Internal Variables - -(defconst org-latex-babel-language-alist - '(("af" . "afrikaans") - ("bg" . "bulgarian") - ("ca" . "catalan") - ("cs" . "czech") - ("cy" . "welsh") - ("da" . "danish") - ("de" . "germanb") - ("de-at" . "naustrian") - ("de-de" . "ngerman") - ("el" . "greek") - ("en" . "english") - ("en-au" . "australian") - ("en-ca" . "canadian") - ("en-gb" . "british") - ("en-ie" . "irish") - ("en-nz" . "newzealand") - ("en-us" . "american") - ("es" . "spanish") - ("et" . "estonian") - ("eu" . "basque") - ("fi" . "finnish") - ("fr" . "french") - ("fr-ca" . "canadien") - ("gl" . "galician") - ("hr" . "croatian") - ("hu" . "hungarian") - ("id" . "indonesian") - ("is" . "icelandic") - ("it" . "italian") - ("la" . "latin") - ("ms" . "malay") - ("nl" . "dutch") - ("nb" . "norsk") - ("nn" . "nynorsk") - ("no" . "norsk") - ("pl" . "polish") - ("pt" . "portuguese") - ("pt-br" . "brazilian") - ("ro" . "romanian") - ("ru" . "russian") - ("sa" . "sanskrit") - ("sb" . "uppersorbian") - ("sk" . "slovak") - ("sl" . "slovene") - ("sq" . "albanian") - ("sr" . "serbian") - ("sv" . "swedish") - ("ta" . "tamil") - ("tr" . "turkish") - ("uk" . "ukrainian")) - "Alist between language code and corresponding Babel option.") - -(defconst org-latex-polyglossia-language-alist - '(("am" "amharic") - ("ar" "arabic") - ("ast" "asturian") - ("bg" "bulgarian") - ("bn" "bengali") - ("bo" "tibetan") - ("br" "breton") - ("ca" "catalan") - ("cop" "coptic") - ("cs" "czech") - ("cy" "welsh") - ("da" "danish") - ("de" "german" "german") - ("de-at" "german" "austrian") - ("de-de" "german" "german") - ("dsb" "lsorbian") - ("dv" "divehi") - ("el" "greek") - ("en" "english" "usmax") - ("en-au" "english" "australian") - ("en-gb" "english" "uk") - ("en-nz" "english" "newzealand") - ("en-us" "english" "usmax") - ("eo" "esperanto") - ("es" "spanish") - ("et" "estonian") - ("eu" "basque") - ("fa" "farsi") - ("fi" "finnish") - ("fr" "french") - ("fu" "friulan") - ("ga" "irish") - ("gd" "scottish") - ("gl" "galician") - ("he" "hebrew") - ("hi" "hindi") - ("hr" "croatian") - ("hsb" "usorbian") - ("hu" "magyar") - ("hy" "armenian") - ("ia" "interlingua") - ("id" "bahasai") - ("is" "icelandic") - ("it" "italian") - ("kn" "kannada") - ("la" "latin" "modern") - ("la-classic" "latin" "classic") - ("la-medieval" "latin" "medieval") - ("la-modern" "latin" "modern") - ("lo" "lao") - ("lt" "lithuanian") - ("lv" "latvian") - ("ml" "malayalam") - ("mr" "maranthi") - ("nb" "norsk") - ("nko" "nko") - ("nl" "dutch") - ("nn" "nynorsk") - ("no" "norsk") - ("oc" "occitan") - ("pl" "polish") - ("pms" "piedmontese") - ("pt" "portuges") - ("pt-br" "brazilian") - ("rm" "romansh") - ("ro" "romanian") - ("ru" "russian") - ("sa" "sanskrit") - ("se" "samin") - ("sk" "slovak") - ("sl" "slovenian") - ("sq" "albanian") - ("sr" "serbian") - ("sv" "swedish") - ("syr" "syriac") - ("ta" "tamil") - ("te" "telugu") - ("th" "thai") - ("tk" "turkmen") - ("tr" "turkish") - ("uk" "ukrainian") - ("ur" "urdu") - ("vi" "vietnamese")) - "Alist between language code and corresponding Polyglossia option") - -(defconst org-latex-table-matrix-macros '(("bordermatrix" . "\\cr") - ("qbordermatrix" . "\\cr") - ("kbordermatrix" . "\\\\")) - "Alist between matrix macros and their row ending.") - -(defconst org-latex-math-environments-re - (format - "\\`[ \t]*\\\\begin{%s\\*?}" - (regexp-opt - '("equation" "eqnarray" "math" "displaymath" - "align" "gather" "multline" "flalign" "alignat" - "xalignat" "xxalignat" - "subequations" - ;; breqn - "dmath" "dseries" "dgroup" "darray" - ;; empheq - "empheq"))) - "Regexp of LaTeX math environments.") - - -;;; User Configurable Variables - -(defgroup org-export-latex nil - "Options for exporting Org mode files to LaTeX." - :tag "Org Export LaTeX" - :group 'org-export) - -;;;; Generic - -(defcustom org-latex-caption-above '(table) - "When non-nil, place caption string at the beginning of elements. -Otherwise, place it near the end. When value is a list of -symbols, put caption above selected elements only. Allowed -symbols are: `image', `table', `src-block' and `special-block'." - :group 'org-export-latex - :version "26.1" - :package-version '(Org . "8.3") - :type '(choice - (const :tag "For all elements" t) - (const :tag "For no element" nil) - (set :tag "For the following elements only" :greedy t - (const :tag "Images" image) - (const :tag "Tables" table) - (const :tag "Source code" src-block) - (const :tag "Special blocks" special-block)))) - -(defcustom org-latex-prefer-user-labels nil - "Use user-provided labels instead of internal ones when non-nil. - -When this variable is non-nil, Org will use the value of -CUSTOM_ID property, NAME keyword or Org target as the key for the -\\label commands generated. - -By default, Org generates its own internal labels during LaTeX -export. This process ensures that the \\label keys are unique -and valid, but it means the keys are not available in advance of -the export process. - -Setting this variable gives you control over how Org generates -labels during LaTeX export, so that you may know their keys in -advance. One reason to do this is that it allows you to refer to -various elements using a single label both in Org's link syntax -and in embedded LaTeX code. - -For example, when this variable is non-nil, a headline like this: - - ** Some section - :PROPERTIES: - :CUSTOM_ID: sec:foo - :END: - This is section [[#sec:foo]]. - #+BEGIN_EXPORT latex - And this is still section \\ref{sec:foo}. - #+END_EXPORT - -will be exported to LaTeX as: - - \\subsection{Some section} - \\label{sec:foo} - This is section \\ref{sec:foo}. - And this is still section \\ref{sec:foo}. - -Note, however, that setting this variable introduces a limitation -on the possible values for CUSTOM_ID and NAME. When this -variable is non-nil, Org passes their value to \\label unchanged. -You are responsible for ensuring that the value is a valid LaTeX -\\label key, and that no other \\label commands with the same key -appear elsewhere in your document. (Keys may contain letters, -numbers, and the following punctuation: `_' `.' `-' `:'.) There -are no such limitations on CUSTOM_ID and NAME when this variable -is nil. - -For headlines that do not define the CUSTOM_ID property or -elements without a NAME, Org will continue to use its default -labeling scheme to generate labels and resolve links into proper -references." - :group 'org-export-latex - :type 'boolean - :version "26.1" - :package-version '(Org . "8.3")) - -;;;; Preamble - -(defcustom org-latex-default-class "article" - "The default LaTeX class." - :group 'org-export-latex - :type '(string :tag "LaTeX class")) - -(defcustom org-latex-classes - '(("article" - "\\documentclass[11pt]{article}" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) - ("report" - "\\documentclass[11pt]{report}" - ("\\part{%s}" . "\\part*{%s}") - ("\\chapter{%s}" . "\\chapter*{%s}") - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}")) - ("book" - "\\documentclass[11pt]{book}" - ("\\part{%s}" . "\\part*{%s}") - ("\\chapter{%s}" . "\\chapter*{%s}") - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))) - "Alist of LaTeX classes and associated header and structure. -If #+LATEX_CLASS is set in the buffer, use its value and the -associated information. Here is the structure of each cell: - - (class-name - header-string - (numbered-section . unnumbered-section) - ...) - -The header string ------------------ - -The HEADER-STRING is the header that will be inserted into the -LaTeX file. It should contain the \\documentclass macro, and -anything else that is needed for this setup. To this header, the -following commands will be added: - -- Calls to \\usepackage for all packages mentioned in the - variables `org-latex-default-packages-alist' and - `org-latex-packages-alist'. Thus, your header definitions - should avoid to also request these packages. - -- Lines specified via \"#+LATEX_HEADER:\" and - \"#+LATEX_HEADER_EXTRA:\" keywords. - -If you need more control about the sequence in which the header -is built up, or if you want to exclude one of these building -blocks for a particular class, you can use the following -macro-like placeholders. - - [DEFAULT-PACKAGES] \\usepackage statements for default packages - [NO-DEFAULT-PACKAGES] do not include any of the default packages - [PACKAGES] \\usepackage statements for packages - [NO-PACKAGES] do not include the packages - [EXTRA] the stuff from #+LATEX_HEADER(_EXTRA) - [NO-EXTRA] do not include #+LATEX_HEADER(_EXTRA) stuff - -So a header like - - \\documentclass{article} - [NO-DEFAULT-PACKAGES] - [EXTRA] - \\providecommand{\\alert}[1]{\\textbf{#1}} - [PACKAGES] - -will omit the default packages, and will include the -#+LATEX_HEADER and #+LATEX_HEADER_EXTRA lines, then have a call -to \\providecommand, and then place \\usepackage commands based -on the content of `org-latex-packages-alist'. - -If your header, `org-latex-default-packages-alist' or -`org-latex-packages-alist' inserts \"\\usepackage[AUTO]{inputenc}\", -AUTO will automatically be replaced with a coding system derived -from `buffer-file-coding-system'. See also the variable -`org-latex-inputenc-alist' for a way to influence this mechanism. - -Likewise, if your header contains \"\\usepackage[AUTO]{babel}\" -or \"\\usepackage[AUTO]{polyglossia}\", AUTO will be replaced -with the language related to the language code specified by -`org-export-default-language'. Note that constructions such as -\"\\usepackage[french,AUTO,english]{babel}\" are permitted. For -Polyglossia the language will be set via the macros -\"\\setmainlanguage\" and \"\\setotherlanguage\". See also -`org-latex-guess-babel-language' and -`org-latex-guess-polyglossia-language'. - -The sectioning structure ------------------------- - -The sectioning structure of the class is given by the elements -following the header string. For each sectioning level, a number -of strings is specified. A %s formatter is mandatory in each -section string and will be replaced by the title of the section. - -Instead of a cons cell (numbered . unnumbered), you can also -provide a list of 2 or 4 elements, - - (numbered-open numbered-close) - -or - - (numbered-open numbered-close unnumbered-open unnumbered-close) - -providing opening and closing strings for a LaTeX environment -that should represent the document section. The opening clause -should have a %s to represent the section title. - -Instead of a list of sectioning commands, you can also specify -a function name. That function will be called with two -parameters, the (reduced) level of the headline, and a predicate -non-nil when the headline should be numbered. It must return -a format string in which the section title will be added." - :group 'org-export-latex - :type '(repeat - (list (string :tag "LaTeX class") - (string :tag "LaTeX header") - (repeat :tag "Levels" :inline t - (choice - (cons :tag "Heading" - (string :tag " numbered") - (string :tag "unnumbered")) - (list :tag "Environment" - (string :tag "Opening (numbered)") - (string :tag "Closing (numbered)") - (string :tag "Opening (unnumbered)") - (string :tag "Closing (unnumbered)")) - (function :tag "Hook computing sectioning")))))) - -(defcustom org-latex-inputenc-alist nil - "Alist of inputenc coding system names, and what should really be used. -For example, adding an entry - - (\"utf8\" . \"utf8x\") - -will cause \\usepackage[utf8x]{inputenc} to be used for buffers that -are written as utf8 files." - :group 'org-export-latex - :type '(repeat - (cons - (string :tag "Derived from buffer") - (string :tag "Use this instead")))) - -(defcustom org-latex-title-command "\\maketitle" - "The command used to insert the title just after \\begin{document}. - -This format string may contain these elements: - - %a for AUTHOR keyword - %t for TITLE keyword - %s for SUBTITLE keyword - %k for KEYWORDS line - %d for DESCRIPTION line - %c for CREATOR line - %l for Language keyword - %L for capitalized language keyword - %D for DATE keyword - -If you need to use a \"%\" character, you need to escape it -like that: \"%%\". - -Setting :latex-title-command in publishing projects will take -precedence over this variable." - :group 'org-export-latex - :type '(string :tag "Format string")) - -(defcustom org-latex-subtitle-format "\\\\\\medskip\n\\large %s" - "Format string used for transcoded subtitle. -The format string should have at most one \"%s\"-expression, -which is replaced with the subtitle." - :group 'org-export-latex - :version "26.1" - :package-version '(Org . "8.3") - :type '(string :tag "Format string")) - -(defcustom org-latex-subtitle-separate nil - "Non-nil means the subtitle is not typeset as part of title." - :group 'org-export-latex - :version "26.1" - :package-version '(Org . "8.3") - :type 'boolean) - -(defcustom org-latex-toc-command "\\tableofcontents\n\n" - "LaTeX command to set the table of contents, list of figures, etc. -This command only applies to the table of contents generated with -the toc:nil option, not to those generated with #+TOC keyword." - :group 'org-export-latex - :type 'string) - -(defcustom org-latex-hyperref-template - "\\hypersetup{\n pdfauthor={%a},\n pdftitle={%t},\n pdfkeywords={%k}, - pdfsubject={%d},\n pdfcreator={%c}, \n pdflang={%L}}\n" - "Template for hyperref package options. - -This format string may contain these elements: - - %a for AUTHOR keyword - %t for TITLE keyword - %s for SUBTITLE keyword - %k for KEYWORDS line - %d for DESCRIPTION line - %c for CREATOR line - %l for Language keyword - %L for capitalized language keyword - %D for DATE keyword - -If you need to use a \"%\" character, you need to escape it -like that: \"%%\". - -As a special case, a nil value prevents template from being -inserted. - -Setting :latex-hyperref-template in publishing projects will take -precedence over this variable." - :group 'org-export-latex - :version "26.1" - :package-version '(Org . "8.3") - :type '(choice (const :tag "No template" nil) - (string :tag "Format string"))) - -;;;; Headline - -(defcustom org-latex-format-headline-function - 'org-latex-format-headline-default-function - "Function for formatting the headline's text. - -This function will be called with six arguments: -TODO the todo keyword (string or nil) -TODO-TYPE the type of todo (symbol: `todo', `done', nil) -PRIORITY the priority of the headline (integer or nil) -TEXT the main headline text (string) -TAGS the tags (list of strings or nil) -INFO the export options (plist) - -The function result will be used in the section format string." - :group 'org-export-latex - :version "24.4" - :package-version '(Org . "8.0") - :type 'function) - - -;;;; Footnotes - -(defcustom org-latex-footnote-separator "\\textsuperscript{,}\\," - "Text used to separate footnotes." - :group 'org-export-latex - :type 'string) - -(defcustom org-latex-footnote-defined-format "\\textsuperscript{\\ref{%s}}" - "Format string used to format reference to footnote already defined. -%s will be replaced by the label of the referred footnote." - :group 'org-export-latex - :type '(choice - (const :tag "Use plain superscript (default)" "\\textsuperscript{\\ref{%s}}") - (const :tag "Use Memoir/KOMA-Script footref" "\\footref{%s}") - (string :tag "Other format string")) - :version "26.1" - :package-version '(Org . "9.0")) - -;;;; Timestamps - -(defcustom org-latex-active-timestamp-format "\\textit{%s}" - "A printf format string to be applied to active timestamps." - :group 'org-export-latex - :type 'string) - -(defcustom org-latex-inactive-timestamp-format "\\textit{%s}" - "A printf format string to be applied to inactive timestamps." - :group 'org-export-latex - :type 'string) - -(defcustom org-latex-diary-timestamp-format "\\textit{%s}" - "A printf format string to be applied to diary timestamps." - :group 'org-export-latex - :type 'string) - - -;;;; Links - -(defcustom org-latex-images-centered t - "When non-nil, images are centered." - :group 'org-export-latex - :version "26.1" - :package-version '(Org . "9.0") - :type 'boolean - :safe #'booleanp) - -(defcustom org-latex-image-default-option "" - "Default option for images." - :group 'org-export-latex - :version "24.4" - :package-version '(Org . "8.0") - :type 'string) - -(defcustom org-latex-image-default-width ".9\\linewidth" - "Default width for images. -This value will not be used if a height is provided." - :group 'org-export-latex - :version "24.4" - :package-version '(Org . "8.0") - :type 'string) - -(defcustom org-latex-image-default-scale "" - "Default scale for images. -This value will not be used if a width or a scale is provided, -or if the image is wrapped within a \"wrapfigure\" environment. -Scale overrides width and height." - :group 'org-export-latex - :package-version '(Org . "9.3") - :type 'string - :safe #'stringp) - -(defcustom org-latex-image-default-height "" - "Default height for images. -This value will not be used if a width is provided, or if the -image is wrapped within a \"figure\" or \"wrapfigure\" -environment." - :group 'org-export-latex - :version "24.4" - :package-version '(Org . "8.0") - :type 'string) - -(defcustom org-latex-default-figure-position "htbp" - "Default position for LaTeX figures." - :group 'org-export-latex - :type 'string - :version "26.1" - :package-version '(Org . "9.0") - :safe #'stringp) - -(defcustom org-latex-inline-image-rules - `(("file" . ,(regexp-opt - '("pdf" "jpeg" "jpg" "png" "ps" "eps" "tikz" "pgf" "svg")))) - "Rules characterizing image files that can be inlined into LaTeX. - -A rule consists in an association whose key is the type of link -to consider, and value is a regexp that will be matched against -link's path. - -Note that, by default, the image extension *actually* allowed -depend on the way the LaTeX file is processed. When used with -pdflatex, pdf, jpg and png images are OK. When processing -through dvi to Postscript, only ps and eps are allowed. The -default we use here encompasses both." - :group 'org-export-latex - :version "24.4" - :package-version '(Org . "8.0") - :type '(alist :key-type (string :tag "Type") - :value-type (regexp :tag "Path"))) - -(defcustom org-latex-link-with-unknown-path-format "\\texttt{%s}" - "Format string for links with unknown path type." - :group 'org-export-latex - :type 'string) - - -;;;; Tables - -(defcustom org-latex-default-table-environment "tabular" - "Default environment used to build tables." - :group 'org-export-latex - :version "24.4" - :package-version '(Org . "8.0") - :type 'string) - -(defcustom org-latex-default-table-mode 'table - "Default mode for tables. - -Value can be a symbol among: - - `table' Regular LaTeX table. - - `math' In this mode, every cell is considered as being in math - mode and the complete table will be wrapped within a math - environment. It is particularly useful to write matrices. - - `inline-math' This mode is almost the same as `math', but the - math environment will be inlined. - - `verbatim' The table is exported as it appears in the Org - buffer, within a verbatim environment. - -This value can be overridden locally with, i.e. \":mode math\" in -LaTeX attributes. - -When modifying this variable, it may be useful to change -`org-latex-default-table-environment' accordingly." - :group 'org-export-latex - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice (const :tag "Table" table) - (const :tag "Matrix" math) - (const :tag "Inline matrix" inline-math) - (const :tag "Verbatim" verbatim)) - :safe (lambda (s) (memq s '(table math inline-math verbatim)))) - -(defcustom org-latex-tables-centered t - "When non-nil, tables are exported in a center environment." - :group 'org-export-latex - :type 'boolean - :safe #'booleanp) - -(defcustom org-latex-tables-booktabs nil - "When non-nil, display tables in a formal \"booktabs\" style. -This option assumes that the \"booktabs\" package is properly -loaded in the header of the document. This value can be ignored -locally with \":booktabs t\" and \":booktabs nil\" LaTeX -attributes." - :group 'org-export-latex - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean - :safe #'booleanp) - -(defcustom org-latex-table-scientific-notation nil - "Format string to display numbers in scientific notation. - -The format should have \"%s\" twice, for mantissa and exponent -\(i.e., \"%s\\\\times10^{%s}\"). - -When nil, no transformation is made." - :group 'org-export-latex - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (string :tag "Format string") - (const :tag "No formatting" nil))) - -;;;; Text markup - -(defcustom org-latex-text-markup-alist '((bold . "\\textbf{%s}") - (code . protectedtexttt) - (italic . "\\emph{%s}") - (strike-through . "\\sout{%s}") - (underline . "\\uline{%s}") - (verbatim . protectedtexttt)) - "Alist of LaTeX expressions to convert text markup. - -The key must be a symbol among `bold', `code', `italic', -`strike-through', `underline' and `verbatim'. The value is -a formatting string to wrap fontified text with. - -Value can also be set to the following symbols: `verb' and -`protectedtexttt'. For the former, Org will use \"\\verb\" to -create a format string and select a delimiter character that -isn't in the string. For the latter, Org will use \"\\texttt\" -to typeset and try to protect special characters. - -If no association can be found for a given markup, text will be -returned as-is." - :group 'org-export-latex - :version "26.1" - :package-version '(Org . "8.3") - :type 'alist - :options '(bold code italic strike-through underline verbatim)) - - -;;;; Drawers - -(defcustom org-latex-format-drawer-function (lambda (_ contents) contents) - "Function called to format a drawer in LaTeX code. - -The function must accept two parameters: - NAME the drawer name, like \"LOGBOOK\" - CONTENTS the contents of the drawer. - -The function should return the string to be exported. - -The default function simply returns the value of CONTENTS." - :group 'org-export-latex - :version "26.1" - :package-version '(Org . "8.3") - :type 'function) - - -;;;; Inlinetasks - -(defcustom org-latex-format-inlinetask-function - 'org-latex-format-inlinetask-default-function - "Function called to format an inlinetask in LaTeX code. - -The function must accept seven parameters: - TODO the todo keyword (string or nil) - TODO-TYPE the todo type (symbol: `todo', `done', nil) - PRIORITY the inlinetask priority (integer or nil) - NAME the inlinetask name (string) - TAGS the inlinetask tags (list of strings or nil) - CONTENTS the contents of the inlinetask (string or nil) - INFO the export options (plist) - -The function should return the string to be exported." - :group 'org-export-latex - :type 'function - :version "26.1" - :package-version '(Org . "8.3")) - - -;; Src blocks - -(defcustom org-latex-listings nil - "Non-nil means export source code using the listings package. - -This package will fontify source code, possibly even with color. -If you want to use this, you also need to make LaTeX use the -listings package, and if you want to have color, the color -package. Just add these to `org-latex-packages-alist', for -example using customize, or with something like: - - (require \\='ox-latex) - (add-to-list \\='org-latex-packages-alist \\='(\"\" \"listings\")) - (add-to-list \\='org-latex-packages-alist \\='(\"\" \"color\")) - -Alternatively, - - (setq org-latex-listings \\='minted) - -causes source code to be exported using the minted package as -opposed to listings. If you want to use minted, you need to add -the minted package to `org-latex-packages-alist', for example -using customize, or with - - (require \\='ox-latex) - (add-to-list \\='org-latex-packages-alist \\='(\"newfloat\" \"minted\")) - -In addition, it is necessary to install pygments -\(URL `http://pygments.org>'), and to configure the variable -`org-latex-pdf-process' so that the -shell-escape option is -passed to pdflatex. - -The minted choice has possible repercussions on the preview of -latex fragments (see `org-preview-latex-fragment'). If you run -into previewing problems, please consult -URL `https://orgmode.org/worg/org-tutorials/org-latex-preview.html'." - :group 'org-export-latex - :type '(choice - (const :tag "Use listings" t) - (const :tag "Use minted" minted) - (const :tag "Export verbatim" nil)) - :safe (lambda (s) (memq s '(t nil minted)))) - -(defcustom org-latex-listings-langs - '((emacs-lisp "Lisp") (lisp "Lisp") (clojure "Lisp") - (c "C") (cc "C++") - (fortran "fortran") - (perl "Perl") (cperl "Perl") (python "Python") (ruby "Ruby") - (html "HTML") (xml "XML") - (tex "TeX") (latex "[LaTeX]TeX") - (shell-script "bash") - (gnuplot "Gnuplot") - (ocaml "Caml") (caml "Caml") - (sql "SQL") (sqlite "sql") - (makefile "make") - (R "r")) - "Alist mapping languages to their listing language counterpart. -The key is a symbol, the major mode symbol without the \"-mode\". -The value is the string that should be inserted as the language -parameter for the listings package. If the mode name and the -listings name are the same, the language does not need an entry -in this list - but it does not hurt if it is present." - :group 'org-export-latex - :version "26.1" - :package-version '(Org . "8.3") - :type '(repeat - (list - (symbol :tag "Major mode ") - (string :tag "Listings language")))) - -(defcustom org-latex-listings-options nil - "Association list of options for the latex listings package. - -These options are supplied as a comma-separated list to the -\\lstset command. Each element of the association list should be -a list containing two strings: the name of the option, and the -value. For example, - - (setq org-latex-listings-options - \\='((\"basicstyle\" \"\\\\small\") - (\"keywordstyle\" \"\\\\color{black}\\\\bfseries\\\\underbar\"))) - -will typeset the code in a small size font with underlined, bold -black keywords. - -Note that the same options will be applied to blocks of all -languages. If you need block-specific options, you may use the -following syntax: - - #+ATTR_LATEX: :options key1=value1,key2=value2 - #+BEGIN_SRC - ... - #+END_SRC" - :group 'org-export-latex - :type '(repeat - (list - (string :tag "Listings option name ") - (string :tag "Listings option value")))) - -(defcustom org-latex-minted-langs - '((emacs-lisp "common-lisp") - (cc "c++") - (cperl "perl") - (shell-script "bash") - (caml "ocaml")) - "Alist mapping languages to their minted language counterpart. -The key is a symbol, the major mode symbol without the \"-mode\". -The value is the string that should be inserted as the language -parameter for the minted package. If the mode name and the -listings name are the same, the language does not need an entry -in this list - but it does not hurt if it is present. - -Note that minted uses all lower case for language identifiers, -and that the full list of language identifiers can be obtained -with: - - pygmentize -L lexers" - :group 'org-export-latex - :type '(repeat - (list - (symbol :tag "Major mode ") - (string :tag "Minted language")))) - -(defcustom org-latex-minted-options nil - "Association list of options for the latex minted package. - -These options are supplied within square brackets in -\\begin{minted} environments. Each element of the alist should -be a list containing two strings: the name of the option, and the -value. For example, - - (setq org-latex-minted-options - \\='((\"bgcolor\" \"bg\") (\"frame\" \"lines\"))) - -will result in source blocks being exported with - -\\begin{minted}[bgcolor=bg,frame=lines]{} - -as the start of the minted environment. Note that the same -options will be applied to blocks of all languages. If you need -block-specific options, you may use the following syntax: - - #+ATTR_LATEX: :options key1=value1,key2=value2 - #+BEGIN_SRC - ... - #+END_SRC" - :group 'org-export-latex - :type '(repeat - (list - (string :tag "Minted option name ") - (string :tag "Minted option value")))) - -(defcustom org-latex-custom-lang-environments nil - "Alist mapping languages to language-specific LaTeX environments. - -It is used during export of source blocks by the listings and -minted LaTeX packages. The environment may be a simple string, -composed of only letters and numbers. In this case, the string -is directly the name of the LaTeX environment to use. The -environment may also be a format string. In this case the format -string will be directly exported. This format string may contain -these elements: - - %s for the formatted source - %c for the caption - %f for the float attribute - %l for an appropriate label - %o for the LaTeX attributes - -For example, - - (setq org-latex-custom-lang-environments - \\='((python \"pythoncode\") - (ocaml \"\\\\begin{listing} -\\\\begin{minted}[%o]{ocaml} -%s\\\\end{minted} -\\\\caption{%c} -\\\\label{%l}\"))) - -would have the effect that if Org encounters a Python source block -during LaTeX export it will produce - - \\begin{pythoncode} - - \\end{pythoncode} - -and if Org encounters an Ocaml source block during LaTeX export it -will produce - - \\begin{listing} - \\begin{minted}[]{ocaml} - - \\end{minted} - \\caption{} - \\label{

m_)yqe*UM^t z@9=o_nd)G5b$a;b?SIGHK#2RrRdtMsMKgl4njnslylFT7Y4w^`=ShzqTphqII}07&kggFT zAaBt)H_60YoScQkQBB{GYs0=n5R8XGt%jl}AJ=sPqJ;%Mb{^2q{m>ol3pT=k;L|`o zjORz;EMV^JEU?sse?JSRdQs%GCMQ;b8~BfQ7RYq**CN2lCNC0T!+^NpL2BjrzbjI{ zjuGL(*(u@TD|U|QY$}y+K+y|YJZiDU9_T_saBJU@9)&&@0{b`Imh6Q!G6He=%jlUR*p@{-uNq%k*A%b2`+9r5rLa)PUGfYl#rw% z@KVZ`M0V!MQwD(e1MvJIDEfPMEENSjUk3cCk&>yJlOQ|@OIri`5>|xtnKp_HAB?uX zmPjDU$S7TiC2F+operc~hD()p;Ocf=LNwWGv}$a8Mz1I!vSyau^QZ@t4r^zJy*Hon zls~`d+|{>Njj=~S=u+^G5nMF{|3q+bhjQ|Pb8_xi6Yr$b-@9I3bNAay+3QUqWJ;l*3M9S2vNdd~Af)xiD;N1! zrb<0Eq4OVRGA7F#`RUwuqA_@fO1NX|yb2 zV;Nz7E0q&s;hWcJ%H`3G8#n%jK-3T!U2UPSXrOR>fe7sn505Koi-bFk$dsU{#Q7LG zwNIwSJ{g4uBNFtYPtu-be3hrMGB~Q3rJ;Pe%w8ve3inV*6`(0)hTKLOKlk7u^OQH9 z9uj$IOz$a0L8kgnBvCX3m0mw$UCNhHW4?2fIU~REi83R@qFQ3)Se$k^-e>$*10*I~ zvhlgqQhh>gT1YCqwR89G=DpkU>utA@=J4e8yuy`;peg|;okf}x>}(~FN3FZCuAFJs zVC4S(56F&r`GGk$bri_#WaOYX^i3x?Wcnw5DhyEU_#(6k)QMHeo=EGdF|v@`MsO?k z!T}T;f~V0U*YTqe|Ld)H_~9(QuYQ_%a>B_|VGU?nfr({QIuc)Du0@{9L1(5PBT5Os zk| zy~yr2{u=}o3M)D(*sJUuwc64@THa*tHaKpm;a&cb(W$-kZdNMCO|`KB$;Ik%eiJ|^ z1b1muB-To!#EbftEmSj~b?Q`73O*vprEt8waZguJb!|37j|%-;OPv<%RI?H}$!rTw zeg>GRwbpCFhFNbkOS@+WDE*Gb>Fl6sv@-#|%a$GNocPgun|Cvw zRL@hsH2nqz(^D_anNz8|rRNnd%Z4Rh&MA63DYzK{yZa@E5)-wRNlX0f!&{ZxcjAUx z4W+U7(KCw)h1}4lAb$Af@)oN}JdyliTJ}=b?oi~cT@b2BHIbRkj%7*W5^0H7UJ|A| zDkb7KS|kjWQLCVl_^gy!r)uriTFfDat$26(IE$iP`=%H6`CI>gjX0+cXKfsBAM53d zB+SZ9qypr7bW^4QCiC*ex3Z%+x(H@#!#JThJGiLsA07j+V!4UA7(1Kt9Ud8R-H9Jh bo!Vp%wKp0zx7S$Lvg4rR{?=95Z>|1c#4~Kg diff --git a/elpa/org-9.3.6/ox-man.el b/elpa/org-9.3.6/ox-man.el deleted file mode 100644 index 36822ff9..00000000 --- a/elpa/org-9.3.6/ox-man.el +++ /dev/null @@ -1,1143 +0,0 @@ -;; ox-man.el --- Man Back-End for Org Export Engine -*- lexical-binding: t; -*- - -;; Copyright (C) 2011-2020 Free Software Foundation, Inc. - -;; Author: Nicolas Goaziou -;; Luis R Anaya -;; Keywords: outlines, hypermedia, calendar, wp - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: -;; -;; This library implements a Man back-end for Org generic exporter. -;; -;; To test it, run -;; -;; M-: (org-export-to-buffer 'man "*Test Man*") RET -;; -;; in an Org buffer then switch to the buffer to see the Man export. -;; See ox.el for more details on how this exporter works. -;; -;; It introduces one new buffer keywords: -;; "MAN_CLASS_OPTIONS". - -;;; Code: - -(require 'cl-lib) -(require 'ox) - -(defvar org-export-man-default-packages-alist) -(defvar org-export-man-packages-alist) -(defvar orgtbl-exp-regexp) - - - -;;; Define Back-End - -(org-export-define-backend 'man - '((babel-call . org-man-babel-call) - (bold . org-man-bold) - (center-block . org-man-center-block) - (code . org-man-code) - (drawer . org-man-drawer) - (dynamic-block . org-man-dynamic-block) - (entity . org-man-entity) - (example-block . org-man-example-block) - (export-block . org-man-export-block) - (export-snippet . org-man-export-snippet) - (fixed-width . org-man-fixed-width) - (footnote-definition . org-man-footnote-definition) - (footnote-reference . org-man-footnote-reference) - (headline . org-man-headline) - (horizontal-rule . org-man-horizontal-rule) - (inline-babel-call . org-man-inline-babel-call) - (inline-src-block . org-man-inline-src-block) - (inlinetask . org-man-inlinetask) - (italic . org-man-italic) - (item . org-man-item) - (keyword . org-man-keyword) - (line-break . org-man-line-break) - (link . org-man-link) - (node-property . org-man-node-property) - (paragraph . org-man-paragraph) - (plain-list . org-man-plain-list) - (plain-text . org-man-plain-text) - (planning . org-man-planning) - (property-drawer . org-man-property-drawer) - (quote-block . org-man-quote-block) - (radio-target . org-man-radio-target) - (section . org-man-section) - (special-block . org-man-special-block) - (src-block . org-man-src-block) - (statistics-cookie . org-man-statistics-cookie) - (strike-through . org-man-strike-through) - (subscript . org-man-subscript) - (superscript . org-man-superscript) - (table . org-man-table) - (table-cell . org-man-table-cell) - (table-row . org-man-table-row) - (target . org-man-target) - (template . org-man-template) - (timestamp . org-man-timestamp) - (underline . org-man-underline) - (verbatim . org-man-verbatim) - (verse-block . org-man-verse-block)) - :menu-entry - '(?M "Export to MAN" - ((?m "As MAN file" org-man-export-to-man) - (?p "As PDF file" org-man-export-to-pdf) - (?o "As PDF file and open" - (lambda (a s v b) - (if a (org-man-export-to-pdf t s v b) - (org-open-file (org-man-export-to-pdf nil s v b))))))) - :options-alist - '((:man-class "MAN_CLASS" nil nil t) - (:man-class-options "MAN_CLASS_OPTIONS" nil nil t) - (:man-header-extra "MAN_HEADER" nil nil newline) - ;; Other variables. - (:man-tables-centered nil nil org-man-tables-centered) - (:man-tables-verbatim nil nil org-man-tables-verbatim) - (:man-table-scientific-notation nil nil org-man-table-scientific-notation) - (:man-source-highlight nil nil org-man-source-highlight) - (:man-source-highlight-langs nil nil org-man-source-highlight-langs))) - - - -;;; User Configurable Variables - -(defgroup org-export-man nil - "Options for exporting Org mode files to Man." - :tag "Org Export Man" - :group 'org-export) - -;;; Tables - -(defcustom org-man-tables-centered t - "When non-nil, tables are exported in a center environment." - :group 'org-export-man - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - -(defcustom org-man-tables-verbatim nil - "When non-nil, tables are exported verbatim." - :group 'org-export-man - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - - -(defcustom org-man-table-scientific-notation "%sE%s" - "Format string to display numbers in scientific notation. -The format should have \"%s\" twice, for mantissa and exponent -\(i.e. \"%s\\\\times10^{%s}\"). - -When nil, no transformation is made." - :group 'org-export-man - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (string :tag "Format string") - (const :tag "No formatting"))) - - -;;; Inlinetasks -;; Src blocks - -(defcustom org-man-source-highlight nil - "Use GNU source highlight to embellish source blocks." - :group 'org-export-man - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - - -(defcustom org-man-source-highlight-langs - '((emacs-lisp "lisp") (lisp "lisp") (clojure "lisp") - (scheme "scheme") - (c "c") (cc "cpp") (csharp "csharp") (d "d") - (fortran "fortran") (cobol "cobol") (pascal "pascal") - (ada "ada") (asm "asm") - (perl "perl") (cperl "perl") - (python "python") (ruby "ruby") (tcl "tcl") (lua "lua") - (java "java") (javascript "javascript") - (tex "latex") - (shell-script "sh") (awk "awk") (diff "diff") (m4 "m4") - (ocaml "caml") (caml "caml") - (sql "sql") (sqlite "sql") - (html "html") (css "css") (xml "xml") - (bat "bat") (bison "bison") (clipper "clipper") - (ldap "ldap") (opa "opa") - (php "php") (postscript "postscript") (prolog "prolog") - (properties "properties") (makefile "makefile") - (tml "tml") (vala "vala") (vbscript "vbscript") (xorg "xorg")) - "Alist mapping languages to their listing language counterpart. -The key is a symbol, the major mode symbol without the \"-mode\". -The value is the string that should be inserted as the language -parameter for the listings package. If the mode name and the -listings name are the same, the language does not need an entry -in this list - but it does not hurt if it is present." - :group 'org-export-man - :version "24.4" - :package-version '(Org . "8.0") - :type '(repeat - (list - (symbol :tag "Major mode ") - (string :tag "Listings language")))) - - -;;; Compilation - -(defcustom org-man-pdf-process - '("tbl %f | eqn | groff -man | ps2pdf - > %b.pdf" - "tbl %f | eqn | groff -man | ps2pdf - > %b.pdf" - "tbl %f | eqn | groff -man | ps2pdf - > %b.pdf") - - "Commands to process a Man file to a PDF file. - -This is a list of strings, each of them will be given to the -shell as a command. %f in the command will be replaced by the -relative file name, %F by the absolute file name, %b by the file -base name (i.e. without directory and extension parts), %o by the -base directory of the file and %O by the absolute file name of -the output file. - -By default, Org uses 3 runs of to do the processing. - -Alternatively, this may be a Lisp function that does the -processing. This function should accept the file name as -its single argument." - :group 'org-export-pdf - :group 'org-export-man - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (repeat :tag "Shell command sequence" - (string :tag "Shell command")) - (const :tag "2 runs of pdfgroff" - ("tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf" - "tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf" )) - (const :tag "3 runs of pdfgroff" - ("tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf" - "tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf" - "tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf")) - (function))) - -(defcustom org-man-logfiles-extensions - '("log" "out" "toc") - "The list of file extensions to consider as Man logfiles." - :group 'org-export-man - :version "24.4" - :package-version '(Org . "8.0") - :type '(repeat (string :tag "Extension"))) - -(defcustom org-man-remove-logfiles t - "Non-nil means remove the logfiles produced by PDF production. -These are the .aux, .log, .out, and .toc files." - :group 'org-export-man - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - - - -;;; Internal Functions - -(defun org-man--caption/label-string (element info) - "Return caption and label Man string for ELEMENT. - -INFO is a plist holding contextual information. If there's no -caption nor label, return the empty string. - -For non-floats, see `org-man--wrap-label'." - (let ((label (org-element-property :label element)) - (main (org-export-get-caption element)) - (short (org-export-get-caption element t))) - (cond ((and (not main) (not label)) "") - ((not main) (format "\\fI%s\\fP" label)) - ;; Option caption format with short name. - (short (format "\\fR%s\\fP - \\fI\\P - %s\n" - (org-export-data short info) - (org-export-data main info))) - ;; Standard caption format. - (t (format "\\fR%s\\fP" (org-export-data main info)))))) - -(defun org-man--wrap-label (element output) - "Wrap label associated to ELEMENT around OUTPUT, if appropriate. -This function shouldn't be used for floats. See -`org-man--caption/label-string'." - (let ((label (org-element-property :name element))) - (if (or (not output) (not label) (string= output "") (string= label "")) - output - (concat (format "%s\n.br\n" label) output)))) - -(defun org-man--protect-text (text) - "Protect minus and backslash characters in string TEXT." - (replace-regexp-in-string "-" "\\-" text nil t)) - - - -;;; Template - -(defun org-man-template (contents info) - "Return complete document string after Man conversion. -CONTENTS is the transcoded contents string. INFO is a plist -holding export options." - (let* ((title (when (plist-get info :with-title) - (org-export-data (plist-get info :title) info))) - (attr (read (format "(%s)" - (mapconcat - #'identity - (list (plist-get info :man-class-options)) - " ")))) - (section-item (plist-get attr :section-id))) - - (concat - - (cond - ((and title (stringp section-item)) - (format ".TH \"%s\" \"%s\" \n" title section-item)) - ((and (string= "" title) (stringp section-item)) - (format ".TH \"%s\" \"%s\" \n" " " section-item)) - (title - (format ".TH \"%s\" \"1\" \n" title)) - (t - ".TH \" \" \"1\" ")) - contents))) - - - - -;;; Transcode Functions - -;;; Babel Call -;; -;; Babel Calls are ignored. - - -;;; Bold - -(defun org-man-bold (_bold contents _info) - "Transcode BOLD from Org to Man. -CONTENTS is the text with bold markup. INFO is a plist holding -contextual information." - (format "\\fB%s\\fP" contents)) - - -;;; Center Block - -(defun org-man-center-block (center-block contents _info) - "Transcode a CENTER-BLOCK element from Org to Man. -CONTENTS holds the contents of the center block. INFO is a plist -holding contextual information." - (org-man--wrap-label - center-block - (format ".ce %d\n.nf\n%s\n.fi" - (- (length (split-string contents "\n")) 1 ) - contents))) - - -;;; Code - -(defun org-man-code (code _contents _info) - "Transcode a CODE object from Org to Man." - (format "\\fC%s\\fP" - (org-man--protect-text (org-element-property :value code)))) - - -;;; Drawer - -(defun org-man-drawer (_drawer contents _info) - "Transcode a DRAWER element from Org to Man. - DRAWER holds the drawer information - CONTENTS holds the contents of the block. - INFO is a plist holding contextual information. " - contents) - - -;;; Dynamic Block - -(defun org-man-dynamic-block (dynamic-block contents _info) - "Transcode a DYNAMIC-BLOCK element from Org to Man. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information. See `org-export-data'." - (org-man--wrap-label dynamic-block contents)) - - -;;; Entity - -(defun org-man-entity (entity _contents _info) - "Transcode an ENTITY object from Org to Man. -CONTENTS are the definition itself. INFO is a plist holding -contextual information." - (org-element-property :utf-8 entity)) - - -;;; Example Block - -(defun org-man-example-block (example-block _contents info) - "Transcode an EXAMPLE-BLOCK element from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual -information." - (org-man--wrap-label - example-block - (format ".RS\n.nf\n%s\n.fi\n.RE" - (org-export-format-code-default example-block info)))) - - -;;; Export Block - -(defun org-man-export-block (export-block _contents _info) - "Transcode a EXPORT-BLOCK element from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (string= (org-element-property :type export-block) "MAN") - (org-remove-indentation (org-element-property :value export-block)))) - - -;;; Export Snippet - -(defun org-man-export-snippet (export-snippet _contents _info) - "Transcode a EXPORT-SNIPPET object from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (eq (org-export-snippet-backend export-snippet) 'man) - (org-element-property :value export-snippet))) - - -;;; Fixed Width - -(defun org-man-fixed-width (fixed-width _contents _info) - "Transcode a FIXED-WIDTH element from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual information." - (org-man--wrap-label - fixed-width - (format "\\fC\n%s\n\\fP" - (org-remove-indentation - (org-element-property :value fixed-width))))) - - -;;; Footnote Definition -;; -;; Footnote Definitions are ignored. - -;;; Footnote References -;; -;; Footnote References are Ignored - - -;;; Headline - -(defun org-man-headline (headline contents info) - "Transcode a HEADLINE element from Org to Man. -CONTENTS holds the contents of the headline. INFO is a plist -holding contextual information." - (let* ((level (org-export-get-relative-level headline info)) - ;; Section formatting will set two placeholders: one for the - ;; title and the other for the contents. - (section-fmt - (pcase level - (1 ".SH \"%s\"\n%s") - (2 ".SS \"%s\"\n%s") - (3 ".SS \"%s\"\n%s") - (_ nil))) - (text (org-export-data (org-element-property :title headline) info))) - - (cond - ;; Case 1: This is a footnote section: ignore it. - ((org-element-property :footnote-section-p headline) nil) - - ;; Case 2. This is a deep sub-tree: export it as a list item. - ;; Also export as items headlines for which no section - ;; format has been found. - ((or (not section-fmt) (org-export-low-level-p headline info)) - ;; Build the real contents of the sub-tree. - (let ((low-level-body - (concat - ;; If the headline is the first sibling, start a list. - (when (org-export-first-sibling-p headline info) - (format "%s\n" ".RS")) - ;; Itemize headline - ".TP\n.ft I\n" text "\n.ft\n" - contents ".RE"))) - ;; If headline is not the last sibling simply return - ;; LOW-LEVEL-BODY. Otherwise, also close the list, before any - ;; blank line. - (if (not (org-export-last-sibling-p headline info)) low-level-body - (replace-regexp-in-string - "[ \t\n]*\\'" "" - low-level-body)))) - - ;; Case 3. Standard headline. Export it as a section. - (t (format section-fmt text contents ))))) - -;;; Horizontal Rule -;; Not supported - -;;; Inline Babel Call -;; -;; Inline Babel Calls are ignored. - -;;; Inline Src Block - -(defun org-man-inline-src-block (inline-src-block _contents info) - "Transcode an INLINE-SRC-BLOCK element from Org to Man. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (let* ((code (org-element-property :value inline-src-block))) - (cond - ((plist-get info :man-source-highlight) - (let* ((tmpdir temporary-file-directory) - (in-file (make-temp-name - (expand-file-name "srchilite" tmpdir))) - (out-file (make-temp-name - (expand-file-name "reshilite" tmpdir))) - (org-lang (org-element-property :language inline-src-block)) - (lst-lang - (cadr (assq (intern org-lang) - (plist-get info :man-source-highlight-langs)))) - - (cmd (concat (expand-file-name "source-highlight") - " -s " lst-lang - " -f groff_man" - " -i " in-file - " -o " out-file ))) - - (if lst-lang - (let ((code-block "" )) - (with-temp-file in-file (insert code)) - (shell-command cmd) - (setq code-block (org-file-contents out-file)) - (delete-file in-file) - (delete-file out-file) - code-block) - (format ".RS\n.nf\n\\fC\\m[black]%s\\m[]\\fP\n.fi\n.RE\n" - code)))) - - ;; Do not use a special package: transcode it verbatim. - (t - (concat ".RS\n.nf\n" "\\fC" "\n" code "\n" - "\\fP\n.fi\n.RE\n"))))) - - -;;; Inlinetask -;;; Italic - -(defun org-man-italic (_italic contents _info) - "Transcode ITALIC from Org to Man. -CONTENTS is the text with italic markup. INFO is a plist holding -contextual information." - (format "\\fI%s\\fP" contents)) - - -;;; Item - - -(defun org-man-item (item contents info) - "Transcode an ITEM element from Org to Man. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (let* ((bullet (org-element-property :bullet item)) - (type (org-element-property :type (org-element-property :parent item))) - (checkbox (pcase (org-element-property :checkbox item) - (`on "\\o'\\(sq\\(mu'") - (`off "\\(sq ") - (`trans "\\o'\\(sq\\(mi'"))) - - (tag (let ((tag (org-element-property :tag item))) - ;; Check-boxes must belong to the tag. - (and tag (format "\\fB%s\\fP" - (concat checkbox - (org-export-data tag info))))))) - - (if (and (null tag) (null checkbox)) - (let* ((bullet (org-trim bullet)) - (marker (cond ((string= "-" bullet) "\\(em") - ((string= "*" bullet) "\\(bu") - ((eq type 'ordered) - (format "%s " (org-trim bullet))) - (t "\\(dg")))) - (concat ".IP " marker " 4\n" - (org-trim (or contents " " )))) - (concat ".TP\n" (or tag (concat " " checkbox)) "\n" - (org-trim (or contents " " )))))) - -;;; Keyword - - -(defun org-man-keyword (keyword _contents _info) - "Transcode a KEYWORD element from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((key (org-element-property :key keyword)) - (value (org-element-property :value keyword))) - (cond - ((string= key "MAN") value) - ((string= key "INDEX") nil) - ((string= key "TOC" ) nil)))) - - -;;; Line Break - -(defun org-man-line-break (_line-break _contents _info) - "Transcode a LINE-BREAK object from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual information." - "\n.br\n") - - -;;; Link - - -(defun org-man-link (link desc _info) - "Transcode a LINK object from Org to Man. - -DESC is the description part of the link, or the empty string. -INFO is a plist holding contextual information. See -`org-export-data'." - (let* ((type (org-element-property :type link)) - (raw-path (org-element-property :path link)) - ;; Ensure DESC really exists, or set it to nil. - (desc (and (not (string= desc "")) desc)) - (path (cond - ((member type '("http" "https" "ftp" "mailto")) - (concat type ":" raw-path)) - ((string= type "file") (org-export-file-uri raw-path)) - (t raw-path)))) - (cond - ;; Link type is handled by a special function. - ((org-export-custom-protocol-maybe link desc 'man)) - ;; External link with a description part. - ((and path desc) (format "%s \\fBat\\fP \\fI%s\\fP" path desc)) - ;; External link without a description part. - (path (format "\\fI%s\\fP" path)) - ;; No path, only description. Try to do something useful. - (t (format "\\fI%s\\fP" desc))))) - -;;;; Node Property - -(defun org-man-node-property (node-property _contents _info) - "Transcode a NODE-PROPERTY element from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format "%s:%s" - (org-element-property :key node-property) - (let ((value (org-element-property :value node-property))) - (if value (concat " " value) "")))) - -;;; Paragraph - -(defun org-man-paragraph (paragraph contents _info) - "Transcode a PARAGRAPH element from Org to Man. -CONTENTS is the contents of the paragraph, as a string. INFO is -the plist used as a communication channel." - (let ((parent (plist-get (nth 1 paragraph) :parent))) - (when parent - (let ((parent-type (car parent)) - (fixed-paragraph "")) - (cond ((and (eq parent-type 'item) - (plist-get (nth 1 parent) :bullet )) - (setq fixed-paragraph (concat "" contents))) - ((eq parent-type 'section) - (setq fixed-paragraph (concat ".PP\n" contents))) - ((eq parent-type 'footnote-definition) - (setq fixed-paragraph contents)) - (t (setq fixed-paragraph (concat "" contents)))) - fixed-paragraph )))) - - -;;; Plain List - -(defun org-man-plain-list (_plain-list contents _info) - "Transcode a PLAIN-LIST element from Org to Man. -CONTENTS is the contents of the list. INFO is a plist holding -contextual information." - contents) - -;;; Plain Text - -(defun org-man-plain-text (text info) - "Transcode a TEXT string from Org to Man. -TEXT is the string to transcode. INFO is a plist holding -contextual information." - (let ((output text)) - ;; Protect various chars. - (setq output (replace-regexp-in-string - "\\(?:[^\\]\\|^\\)\\(\\\\\\)\\(?:[^%$#&{}~^_\\]\\|$\\)" - "$\\" output nil t 1)) - ;; Activate smart quotes. Be sure to provide original TEXT string - ;; since OUTPUT may have been modified. - (when (plist-get info :with-smart-quotes) - (setq output (org-export-activate-smart-quotes output :utf-8 info text))) - ;; Handle break preservation if required. - (when (plist-get info :preserve-breaks) - (setq output (replace-regexp-in-string "\\(\\\\\\\\\\)?[ \t]*\n" ".br\n" - output))) - ;; Return value. - output)) - - - -;;; Planning - - -;;; Property Drawer - -(defun org-man-property-drawer (_property-drawer contents _info) - "Transcode a PROPERTY-DRAWER element from Org to Man. -CONTENTS holds the contents of the drawer. INFO is a plist -holding contextual information." - (and (org-string-nw-p contents) - (format ".RS\n.nf\n%s\n.fi\n.RE" contents))) - -;;; Quote Block - -(defun org-man-quote-block (quote-block contents _info) - "Transcode a QUOTE-BLOCK element from Org to Man. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (org-man--wrap-label - quote-block - (format ".RS\n%s\n.RE" contents))) - - -;;; Radio Target - -(defun org-man-radio-target (_radio-target text _info) - "Transcode a RADIO-TARGET object from Org to Man. -TEXT is the text of the target. INFO is a plist holding -contextual information." - text) - - -;;; Section - -(defun org-man-section (_section contents _info) - "Transcode a SECTION element from Org to Man. -CONTENTS holds the contents of the section. INFO is a plist -holding contextual information." - contents) - - -;;; Special Block - -(defun org-man-special-block (special-block contents _info) - "Transcode a SPECIAL-BLOCK element from Org to Man. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (org-man--wrap-label special-block (format "%s\n" contents))) - - -;;; Src Block - -(defun org-man-src-block (src-block _contents info) - "Transcode a SRC-BLOCK element from Org to Man. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (if (not (plist-get info :man-source-highlight)) - (format ".RS\n.nf\n\\fC%s\\fP\n.fi\n.RE\n\n" - (org-export-format-code-default src-block info)) - (let* ((tmpdir temporary-file-directory) - (in-file (make-temp-name (expand-file-name "srchilite" tmpdir))) - (out-file (make-temp-name (expand-file-name "reshilite" tmpdir))) - (code (org-element-property :value src-block)) - (org-lang (org-element-property :language src-block)) - (lst-lang - (cadr (assq (intern org-lang) - (plist-get info :man-source-highlight-langs)))) - (cmd (concat "source-highlight" - " -s " lst-lang - " -f groff_man " - " -i " in-file - " -o " out-file))) - (if lst-lang - (let ((code-block "")) - (with-temp-file in-file (insert code)) - (shell-command cmd) - (setq code-block (org-file-contents out-file)) - (delete-file in-file) - (delete-file out-file) - code-block) - (format ".RS\n.nf\n\\fC\\m[black]%s\\m[]\\fP\n.fi\n.RE" code))))) - - -;;; Statistics Cookie - -(defun org-man-statistics-cookie (statistics-cookie _contents _info) - "Transcode a STATISTICS-COOKIE object from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual information." - (org-element-property :value statistics-cookie)) - - -;;; Strike-Through - -(defun org-man-strike-through (_strike-through contents _info) - "Transcode STRIKE-THROUGH from Org to Man. -CONTENTS is the text with strike-through markup. INFO is a plist -holding contextual information." - (format "\\fI%s\\fP" contents)) - -;;; Subscript - -(defun org-man-subscript (_subscript contents _info) - "Transcode a SUBSCRIPT object from Org to Man. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "\\d\\s-2%s\\s+2\\u" contents)) - -;;; Superscript "^_%s$ - -(defun org-man-superscript (_superscript contents _info) - "Transcode a SUPERSCRIPT object from Org to Man. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "\\u\\s-2%s\\s+2\\d" contents)) - - -;;; Table -;; -;; `org-man-table' is the entry point for table transcoding. It -;; takes care of tables with a "verbatim" attribute. Otherwise, it -;; delegates the job to either `org-man-table--table.el-table' or -;; `org-man-table--org-table' functions, depending of the type of -;; the table. -;; -;; `org-man-table--align-string' is a subroutine used to build -;; alignment string for Org tables. - -(defun org-man-table (table contents info) - "Transcode a TABLE element from Org to Man. -CONTENTS is the contents of the table. INFO is a plist holding -contextual information." - (cond - ;; Case 1: verbatim table. - ((or (plist-get info :man-tables-verbatim) - (let ((attr (read (format "(%s)" - (mapconcat - #'identity - (org-element-property :attr_man table) - " "))))) - - (and attr (plist-get attr :verbatim)))) - - (format ".nf\n\\fC%s\\fP\n.fi" - ;; Re-create table, without affiliated keywords. - (org-trim - (org-element-interpret-data - `(table nil ,@(org-element-contents table)))))) - ;; Case 2: Standard table. - (t (org-man-table--org-table table contents info)))) - -(defun org-man-table--align-string (divider table info) - "Return an appropriate Man alignment string. -TABLE is the considered table. INFO is a plist used as -a communication channel." - (let (alignment) - ;; Extract column groups and alignment from first (non-rule) row. - (org-element-map - (org-element-map table 'table-row - (lambda (row) - (and (eq (org-element-property :type row) 'standard) row)) - info 'first-match) - 'table-cell - (lambda (cell) - (let* ((borders (org-export-table-cell-borders cell info)) - (raw-width (org-export-table-cell-width cell info)) - (width-cm (when raw-width (/ raw-width 5))) - (width (if raw-width (format "w(%dc)" - (if (< width-cm 1) 1 width-cm)) ""))) - ;; Check left border for the first cell only. - (when (and (memq 'left borders) (not alignment)) - (push "|" alignment)) - (push - (concat (pcase (org-export-table-cell-alignment cell info) - (`left "l") (`right "r") (`center "c")) - width - divider) - alignment) - (when (memq 'right borders) (push "|" alignment)))) - info) - (apply #'concat (reverse alignment)))) - -(defun org-man-table--org-table (table contents info) - "Return appropriate Man code for an Org table. - -TABLE is the table type element to transcode. CONTENTS is its -contents, as a string. INFO is a plist used as a communication -channel. - -This function assumes TABLE has `org' as its `:type' attribute." - (let* ((attr (org-export-read-attribute :attr_man table)) - (caption (and (not (plist-get attr :disable-caption)) - (org-man--caption/label-string table info))) - (divider (if (plist-get attr :divider) "|" " ")) - - ;; Determine alignment string. - (alignment (org-man-table--align-string divider table info)) - ;; Extract others display options. - - (lines (org-split-string contents "\n")) - - (attr-list - (delq nil - (list - (and (plist-get attr :expand) "expand") - (let ((placement (plist-get attr :placement))) - (cond ((string= placement 'center) "center") - ((string= placement 'left) nil) - ((plist-get info :man-tables-centered) "center") - (t ""))) - (or (plist-get attr :boxtype) "box")))) - - (title-line (plist-get attr :title-line)) - (long-cells (plist-get attr :long-cells)) - - (table-format (concat - (format "%s" (or (car attr-list) "" )) - (or - (let ((output-list '())) - (when (cdr attr-list) - (dolist (attr-item (cdr attr-list)) - (setq output-list (concat output-list (format ",%s" attr-item))))) - output-list) - ""))) - - (first-line (when lines (org-split-string (car lines) "\t")))) - ;; Prepare the final format string for the table. - - - (cond - ;; Others. - (lines (concat ".TS\n " table-format ";\n" - - (format "%s.\n" - (let ((final-line "")) - (when title-line - (dotimes (_ (length first-line)) - (setq final-line (concat final-line "cb" divider)))) - - (setq final-line (concat final-line "\n")) - - (if alignment - (setq final-line (concat final-line alignment)) - (dotimes (_ (length first-line)) - (setq final-line (concat final-line "c" divider)))) - final-line )) - - (format "%s.TE\n" - (let ((final-line "") - (long-line "") - (lines (org-split-string contents "\n"))) - - (dolist (line-item lines) - (setq long-line "") - - (if long-cells - (progn - (if (string= line-item "_") - (setq long-line (format "%s\n" line-item)) - ;; else string = - (let ((cell-item-list (org-split-string line-item "\t"))) - (dolist (cell-item cell-item-list) - - (cond ((eq cell-item (car (last cell-item-list))) - (setq long-line (concat long-line - (format "T{\n%s\nT}\t\n" cell-item )))) - (t - (setq long-line (concat long-line - (format "T{\n%s\nT}\t" cell-item )))))) - long-line)) - ;; else long cells - (setq final-line (concat final-line long-line ))) - - (setq final-line (concat final-line line-item "\n")))) - final-line)) - - (and caption (format ".TB \"%s\"" caption))))))) - -;;; Table Cell - -(defun org-man-table-cell (table-cell contents info) - "Transcode a TABLE-CELL element from Org to Man -CONTENTS is the cell contents. INFO is a plist used as -a communication channel." - (concat - (let ((scientific-format (plist-get info :man-table-scientific-notation))) - (if (and contents - scientific-format - (string-match orgtbl-exp-regexp contents)) - ;; Use appropriate format string for scientific notation. - (format scientific-format - (match-string 1 contents) - (match-string 2 contents)) - contents)) - (when (org-export-get-next-element table-cell info) "\t"))) - - -;;; Table Row - -(defun org-man-table-row (table-row contents info) - "Transcode a TABLE-ROW element from Org to Man. -CONTENTS is the contents of the row. INFO is a plist used as -a communication channel." - ;; Rules are ignored since table separators are deduced from borders - ;; of the current row. - (when (eq (org-element-property :type table-row) 'standard) - (let ((borders - ;; TABLE-ROW's borders are extracted from its first cell. - (org-export-table-cell-borders - (car (org-element-contents table-row)) info))) - (concat - (cond ((and (memq 'top borders) (memq 'above borders)) "_\n")) - contents - (cond ((and (memq 'bottom borders) (memq 'below borders)) "\n_") - ((memq 'below borders) "\n_")))))) - - -;;; Target - -(defun org-man-target (target _contents info) - "Transcode a TARGET object from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format "\\fI%s\\fP" (org-export-get-reference target info))) - - -;;; Timestamp - -(defun org-man-timestamp (_timestamp _contents _info) - "Transcode a TIMESTAMP object from Org to Man. -CONTENTS is nil. INFO is a plist holding contextual information." - "") - - -;;; Underline - -(defun org-man-underline (_underline contents _info) - "Transcode UNDERLINE from Org to Man. -CONTENTS is the text with underline markup. INFO is a plist -holding contextual information." - (format "\\fI%s\\fP" contents)) - - -;;; Verbatim - -(defun org-man-verbatim (verbatim _contents _info) - "Transcode a VERBATIM object from Org to Man." - (format "\\fI%s\\fP" - (org-man--protect-text (org-element-property :value verbatim)))) - - -;;; Verse Block - -(defun org-man-verse-block (_verse-block contents _info) - "Transcode a VERSE-BLOCK element from Org to Man. -CONTENTS is verse block contents. INFO is a plist holding -contextual information." - (format ".RS\n.ft I\n%s\n.ft\n.RE" contents)) - - - -;;; Interactive functions - -(defun org-man-export-to-man - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to a Man file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only the body -without any markers. - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Return output file's name." - (interactive) - (let ((outfile (org-export-output-file-name ".man" subtreep))) - (org-export-to-file 'man outfile - async subtreep visible-only body-only ext-plist))) - -(defun org-man-export-to-pdf - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to Groff then process through to PDF. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only write between -markers. - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Return PDF file's name." - (interactive) - (let ((outfile (org-export-output-file-name ".man" subtreep))) - (org-export-to-file 'man outfile - async subtreep visible-only body-only ext-plist - (lambda (file) (org-latex-compile file))))) - -(defun org-man-compile (file) - "Compile a Groff file. - -FILE is the name of the file being compiled. Processing is done -through the command specified in `org-man-pdf-process'. - -Return PDF file name or an error if it couldn't be produced." - (message "Processing Groff file %s..." file) - (let ((output (org-compile-file file org-man-pdf-process "pdf"))) - (when org-man-remove-logfiles - (let ((base (file-name-sans-extension output))) - (dolist (ext org-man-logfiles-extensions) - (let ((file (concat base "." ext))) - (when (file-exists-p file) (delete-file file)))))) - (message "Process completed.") - output)) - -(provide 'ox-man) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox-man.el ends here diff --git a/elpa/org-9.3.6/ox-man.elc b/elpa/org-9.3.6/ox-man.elc deleted file mode 100644 index e5dc87858799dc71ada8a9018feacb75c48b82b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31503 zcmeHw3wIkwcBY>6m^qVVliib(WV0!^ESd7CIp_xfl1^q!QLu+=Nu)`7Y#%{mH-M&y z5nk>FByk@5+xPo!RdrY6A;Ho(*|R6I33S)HZr!@?DtyvKbu3Xvt+JW^p}JCdB2{pp2D1_L#oO#8$BACf7u^X*N^JiF-U>Kv`8 zS)S&qcR5Oi{jTbbyZJQhkDlfCkelUGmGpXPPZhlcyW8RJLL0p?+8B+esyiM{6BM3J z&;1>wjQsu6gTq7By-2d8JH-(1N%zU9r}DAtCL`5J)nJ@dIx$npRhndjewwN21qz0d z?iV05eqh*DwW!2^7na;zVrd=%ghB_qD0 zWK_TNS7rSOE!+B0ll5cv!O_gskJ-*b{g`7g{l}5i=i9RS7$NJ&4Y&W8qc!#GHP)}A zpJnyyoC8W$$6t5mUyr3eA+epgBsypxp{f-*H zQseBIpT3%mv#H-p&-BmcmFz5u12dZFRwd83Cwww z3?~E3a&BOibSWn=Su9p2m!)cT|FYi$VJ#=-q_WI-JOw38 z^-ADe=J1W+3t9Sm$z3 zwm)J!4mLQY7xK#TdDdM3zbRg16{V+1?&6Ow$3&LED8YEjA?gIlNr#p6bcodF>E+9D z<|3;}L7tvTmL_g*Wuh)Im&Y-TfU^E18&A@#f^d~|l$(HwJiBuz#oC2DDWCP9r~dRJ z8_%A(3qtv&%wWk`C+}wci3{=~P4cnsOG*@}C^Jnum3<`dHr?;070N1^l30|;#xI=( z)di3y`E#(>i@}@}L@t@SfUrr-?GIDHWjJx$wQ0zoje04BrwWNE(vS}ss{@F;JIp5O z+w^P|y0N^0WhHG>`FNIfQ~#p>>|%hw=|T(h z1y)t`2MN@eH&)lhfX>}nJ{=Fiwy}a)>OTWrnYfY_7FQbcj?BWHk29q)isbqzd!~kz zgos1AY=UI8?Ww(K@=STmHQVD+0#x0bZ+^b}7fIF^nzLfT)cI^A0v*4FINy3wGm1zk zV&e3v3Z5$O>x&fQh9U+GxTo~8D@@P~UF&v<(uktc(TjdI9${xsId*P%3NT(6Z^w9_ zK&(ujrM^wy;=Hz%x3gXIKoF*vlT>xa<3S2o%?;e5jG7-O#>Q-+K9o!@l}04RW>Jw1;?TU#kjAe6i&%Ht>JRekFY#=oBd?ThTZdyx+DuD=Bk%InH^7Y`F@qnpEU zfj0FwGkePG@f+ahGAPeHNX0SqC=})w-zQ0qJ*qtY&6EV}$-{>{=R-W_Ln#SfjdJ+p zTbB>z>*R8J!A+>YSsI*j1N8!X6OJPeExm%0x$fuZ$`?IH2o~~(^sei zN#hmY@(U~x_K-+SUVg!}5n~`#HhU;g{4IP;<*rPd_ki&`XF4 z_~hGo0zlw{&yx#e;6t9r`P9yIQanpeHXe*YxFJ^K+oYhAX&=O$spgqE!{j-%Zpeq8 zePXIi%gpLUGQa@%$($Ef9`)=KQ(pn;Feej7jJpTQGypmEk7aN*zKP2n|223_PP3#N`DyP6Ji5)AB9=GO!AO&tgn8hZg;lv=z$FUq~#4>!T^mC z^aK&@&=Up0MuZ=7&O}*BUbvT7n*|F6fa7z6MzAucN%uk_0n0iB7DAB%Iz8*ZfYgF^ z1P6p75wjqs=$?Tx0E#Rv>|i>rsEoB5BwZi@Xr$E7QV=(^s7FUcx~Fb`X0lb%$;X2k z2$F1JliRVmOl*%j37DE-pyt$exAb6#>rTf|fT)E)I!{L;FLD3nchSqZ7=$!Yme(`Z zeX{QDBirNRcmSUEh-i-uIsyK2Oaj*XmkRd2WHy-I6Zun2`H{+Iqg+4=2}VE&ycYZd zsgQd61MJ6f5FkNUTwl9%~Ir4WYW^N>>sjE-C``dox2;NZj;0H;HDGpb%86i1^#d?A1NBjjH$r z5bgUsg=J%s}L;sDtS__f}f>U&1yD5gnub2xYg<;hNN=R2<{of8E?7xf=Ab zydM>nO#i=>dcK+Atta&Wk|n%lwQF#@1fR6STJ$$p@D6`UExdmH781h$!G!4Q{-@X5 zUOR+S25Cr%uYbVL8~CWVy{kx#KfZ!y_=Pkn_T?2xuQNd$ayQsSE&TEdyTem-XtU5` z5MJMS4+ZdWbK_@iPkKjDT^G)rAiN<3*am$xdwR`aRrR?BrE$5YWRZN@TOHcRf_5Pw z=z3P0^xEz7Lnx8$^JDBJe4XeQFn#8<+sAl9(ny=u3?=O)Q;3^oY3jIv+Pd{2boFKs zH|{GtL_ z7BKo~N=^c1)DxLc;|lQZG)*^4WLdWE^Jt^HU4b|ywqaAhExHg3qF)q?{tKW5y|p2H zslXSLQKm${6ub!qZ{V`4HLkV2YsYrgMMQZ0qC0ELb=&S_SiGld$1YE^v7?u#(NxD7 zEcjh$0R7Pn(ht^we!UzP#tX-zE@la>;h(j>Aw}TM;MUqpyUehyU@;lLmY;4cuyB^*OD zXrbEo4Z(k^8g@JF?gnN%?S#&36Lo+c(mL_)KRi14LZt&(v_?=6R?eRj(i*x9S2Q4-3{GL>J0jff0 zrNlaOrESBRbjPs97XjEmK4+=2YDTCJ^7_5GScgteUt#yvRM|GIUu8rNV0F-1ybGu~=P4BbSr0%~Q!d92jv$ij03 z-fqp6Qm)>cW+X*Vs|mgtqFEt|1(f5Ss@MW#r(U-J39113_VNCs!-K!T9(>EqCz6#G z!yN(8%2E$1!&?UumG~S7Wv`diYRUF1sZ~%5LLCaYhxD7IFQ3uL&(`Io6cUex>}{TbpTZf!>Yi`rQh#?f_w6x-cw6(r%-pcPfn|J z8*eAAigKe#o&;Vp#){T2&@D^JgId#)@}ORG!Kqr`93P#W{S?5g=+{Q^bvs)NmSs$u z%OscTuGbH~$wV)T`Xwk!TG0Hl0+WIM?If1yu>+rX|5~m4APB_)Y79|MlSmNaJr7 z7~c)dZeMG_*oma9?g59K0Ddt{Fjig?6Obt42EzYL2sf(`ro6O{;7BP-ON@Ae!G)A+ zC0eW3ZVVv3l^lX#Col1U{sRjX@%ijL456im z5%7}XQEBp*<@FlK1^QF-HOIm z8>F77_uHeVAGg~dp?Mk%tU?onVPph&>_=BH7(ut-CiG8F{t`kwVjG5wTX8)hbzvZD zY{~hkYiDc1ykIwy*v>_tHXBI@XI!O|*b6ZbnO1Y49xxv=1W>v>wE_iz%nq0l?4jZ;#RsUyT}6(ocNTV6a1*IG5rbVCMIU0Ajf`Xc0Ux!E_q+VMTc)58 z4}8Gh7GQFGKx;6A2DOjrV8D=~#x=-CJirq*(X?z_oTAy-FsX5ksmMnQ&bF?ThVW2L z9MXZn#sFgNu?QO!)nbe~M(1%I=8qU1$H*lm(L{g-$#IrsmlCAvm!9Nx1OvqC!XU5^ z!^LnFSb>KVUkulvF|aY~_9ekXfc8b7(K^^n2#v7M@NVc(6i8O|Brk8?1Z#Qo-J&h! zBZ!7y=Q^U{I}A_W`#O2dFHbmZXLgP=5q=kDNLY@arK2>%gO6}m-(=~bs*gDl@vnVM z3ngY&J)lMYRKwEL>hBXH#dynCP}mnRJJ6c>LY(>PiQDjVgd~`ro`SHx%m57&#FRN8>)14z^W5t#mORaazF+ap{txz&{=P3PI>(M(2Tkk~O+4)+tM<|Rl_cx#>3^FqeScYLaDlRe)A=eQS1suP-8Mz` z6CsN}w(t)|C=5h}ipFRP2O`}J5gwyUW>Au14RMK3W&)pZ>Ka~nT-5F39BF#;Kj#zhPL8Ic5fN`I zGe0RoPz&#~v4Ajb+?IB)A0vUh5h?d1rP32eqC0Bx=}jGJLtJMz0P%gjqGqDj5!#M} zcL;+- z+W+FGHnurEt+9UPc}Ksm)@jjmgqw8>K&L9aA+(JkD){Xl~)O!E}O+!!MXiymNUQ zCjG&5jOcA|k7$Ui@#QsjgjI4CV87ap0OG+ufb7^Ghbo*U{oyBvy##)nnodJumk`c?8 zZ|8fom;DHeODdVq<&8UTAWEW+_fPgeKiNNC)67nVtI!%vPzDcA$boZ2kjfd3 zxp1dVR?<D1QLo)H7>DRyuB7%DSEEEjHSc&ZBBxw#Wr#)(Kg$A_(sAMPJM_8%Ueo~^eB zmn|#G%V==8tNB9?a&7>S4kmk=vs8(-+}pzI08~4%t|;&^go3nkSjsi+kjE9 zECSV&OeT^@VJbUlDu@dUy`VgS_d2nC>(_fve%Efpj`Jsc-G#V~L!J1?CuZIL@YbC_ z{`vp>?mJ!PL*#&};LC(j!ldtDvqb3Su)Iutxw`=oTctk$cPjN?&>mJPu%{ys_T)HI zhUoVW@5F%YUkpWt^J}A9pmQr!m4f3=Juc{4l?_=A-a4*@gNAgNf;)&cpyym3QsD^}Vsx2t`&gJs7}~N3J%)J*$PnC7 z20sV8(XREBHmZu|$^L`GBmZpw+LE#gf;NNveea_Wp_7tsg~E(&94=%MF@}DK^Ei4tpR4U+Hpmq?4t7MXO$w>=C-IiBB%sB(JroYS?l{ ztrFR%9eHo#qFf#B{F8VusTV5$|8MuDS6xr~DqrKbq?T;8DR@o_(pIn9=uXe}&!9>j z9-R6IM@L^At`4^^2+zBjk{3HH8eT0nF5Ez7nLBn(?K(H)IwurGE?UQ5U+SS@&;$+8 z=k=Pdec|-%y&5!ZrQjje#NLzXMWldqBI*heIS?Rvy5Te1ACOu0; zDrPb(S0g4Xv_9U33zkHkes%x!;Nm{reBs3A;4bjd{bI+@tlj7^3@L0}|4UOKB)WiRrBtGh|4DSPD4`?-H0rAF828 z+Ry=^BQU{OZI9Jz3lfq(mnbqpO+uB56N*}ffJH>~VzGvxJ$S(NEyY^0+Jnv)^FSip z=-8PjV&4CBmxh!t<#~U8lLf6rvC}A22AWp>K;W;q7-M?xJF^b#nDJ()Geq_;TxZuM0yk z;<-IFND&n6{i&iJId#i@>J2=V$vv4~=Gj{uag7~=P$)$fsBzGG_z4_Pn^j^V!&P!6q;*x!IR^?3 z2=ao%efsb4A)xd8x%xDC{;x+@(5nuY>61#B5U*`}RP0Y0% zUy-n2@@{=K$yFXCAjt}7QV8i$7HYKgti=AoA(%m; z6Fk!f5`{NDMVkx*U`t5FeFu~fc-W$Og^w7ue%0qDJ_U%RW(1HOv+wIyQObtYaf8-i z!XW*Ss@kx@Pz4^R2;*aT5E;rKvP}@&{1nZhV|b*Q3NJF=>+A!-lYV%-BWB1sjUr)m zWn<%WYkIjRG!LoLA)-PcV)rIaDCIKl<3_Gj)k|@8TFIgc2az>YP(TEMeqyLUiF~$+j{HsM%=>dSz zYkOk@zjsiJo=Gb0LKaJW!V0a#fEO@BCS41^Lux=9AHk}d)XhFM%}UR4 zx$;2Z`JXMWDLn6!epXzu!n}p63m8@YgN`%QLHo+n-w;sc@;kW(!d&U#>2JeSJMF{+4jK1X-k%SodJ^6eePupj3=x{Ed z(58o6+==C>8m{E*;1%qMNoOs|{7&BZ$WuMaJNu*d1)cpFM|Y6tyyI>A?7lh11i>b< zQ8HoN*tMG7oTo@+N}ud*l@n#*W*L!=tcv&6Lao#B+Dt=wE+txPBnPtAqFb6k>nE^| zpOKH)w-~6aWnAnd>~VQ+f*0t!sXl}pCfgr!nQ$4z{GiYtA#d2+mWASpGFLBj*`pz83zjOs&gvEOZrg zR9i5GPP{%s)v6~h9ykK56^*G^O~(^l!ih`zl=mG8KxaI~MeMjj3?~aIzkUZ~DGbSt zox1f9M^%5~8+^mX3jPS|@sg-G(@W9X>!d>YVTW>ai+vO85|$1x=z5l*I%ZB6W`uI_ z!!M<$JZ#2+rGIfXuHfwOQ42QiN5?;PSZ~?UI?%8`O;Hh!H9j$*t}ssla(aV^Tu(`8quIPgb=DLA@+d8=q zZ^@&TD=T_SQEH8`7S^n}p%P8;$IF*20sDKBB$!J;mbA0=ADOVu%|!NyRw3uS)6GQT zPEapQ{|oRrT|cA-gh13^CGi7A?Bx<}!O#PoVt)MvGXQ(h`FfDIzok;y63`bH@kBe` z^f_rAX@nmQ;Ke8o*6hTwi8R{54P!0+TP)pKCdXRziAH@h^CN~Q^9o^H9eR#ijWh5p z-WLjZNH`g9^Okt`YGs7Mk6=20z<`_YMPJudVGLx%ylyRlO+k)E7LDPCXI(>X64tpW zyD!&>idjuAI>jZW_EuoEfBNm?19KCr1h|^pvCR#`7cfVpqs=709Ch*QKcn$1A6#P9 z&JYWWL#ntBhO?0am*oZJyp}lU0dn5ZDnA({v9sShVhUJR_xVTqNb5N+kj5zGR~PgT zwYUR>i|6d5)jB4~il5dfrinY!XB~f<;kHZISSDjwfe8eJMIu;_a4s)n)wGOrEG||+ zEV;Q_epAeNt4HzM!_z}JG5n*)55KL9q&MajoO(QkQHAo*MIS%rh?~*15tBa!xnhF% zj~;xx*siQU2iqCL z41hrg!*9Z2t!z;Y$=s;xT%OH~Z_yRz>BmhFD&;2#)o+Vx+s){+(tR+!X^L zuX)|siC0sD&*eUOtf{P&+(B=DQ47X8TyqQ<{TGpNR^`8lL_wy@9pREeArf**9uoZY zWeQ5oQ{(@yQwRHV1^+>$fp^`nM;bsa;yXMQ`%dHmomqEJ4S{WCYx1)%2)UA96o!GN zbQpYg_^<_MlItAUZ9@4f2um33*qW!IF%$Q7(hf=^~4*E5(vTw%(clw8ns*#qM~ zE`FVWb-=w+@Mit9er&+rtsuWBc;1J+0r^B2H_a4)r2Y8}-gsz;yT zga*hX7+|QnU!y*L?Mr+HvJ??dm-vj`#CP+ zEt`e;&Sa*qaN;FL=)8L$hV4s`f!Ad8wjt5ltFWUQ7#TyK_^X!`B5-N^D~|u}=Klp4 Csk4#* diff --git a/elpa/org-9.3.6/ox-md.el b/elpa/org-9.3.6/ox-md.el deleted file mode 100644 index 91d5c0ba..00000000 --- a/elpa/org-9.3.6/ox-md.el +++ /dev/null @@ -1,735 +0,0 @@ -;;; ox-md.el --- Markdown Back-End for Org Export Engine -*- lexical-binding: t; -*- - -;; Copyright (C) 2012-2020 Free Software Foundation, Inc. - -;; Author: Nicolas Goaziou -;; Keywords: org, wp, markdown - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This library implements a Markdown back-end (vanilla flavor) for -;; Org exporter, based on `html' back-end. See Org manual for more -;; information. - -;;; Code: - -(require 'cl-lib) -(require 'ox-html) -(require 'ox-publish) - - -;;; User-Configurable Variables - -(defgroup org-export-md nil - "Options specific to Markdown export back-end." - :tag "Org Markdown" - :group 'org-export - :version "24.4" - :package-version '(Org . "8.0")) - -(defcustom org-md-headline-style 'atx - "Style used to format headlines. -This variable can be set to either `atx' or `setext'." - :group 'org-export-md - :type '(choice - (const :tag "Use \"atx\" style" atx) - (const :tag "Use \"Setext\" style" setext))) - - -;;;; Footnotes - -(defcustom org-md-footnotes-section "%s%s" - "Format string for the footnotes section. -The first %s placeholder will be replaced with the localized Footnotes section -heading, the second with the contents of the Footnotes section." - :group 'org-export-md - :type 'string - :version "26.1" - :package-version '(Org . "9.0")) - -(defcustom org-md-footnote-format "%s" - "Format string for the footnote reference. -The %s will be replaced by the footnote reference itself." - :group 'org-export-md - :type 'string - :version "26.1" - :package-version '(Org . "9.0")) - - -;;; Define Back-End - -(org-export-define-derived-backend 'md 'html - :filters-alist '((:filter-parse-tree . org-md-separate-elements)) - :menu-entry - '(?m "Export to Markdown" - ((?M "To temporary buffer" - (lambda (a s v b) (org-md-export-as-markdown a s v))) - (?m "To file" (lambda (a s v b) (org-md-export-to-markdown a s v))) - (?o "To file and open" - (lambda (a s v b) - (if a (org-md-export-to-markdown t s v) - (org-open-file (org-md-export-to-markdown nil s v))))))) - :translate-alist '((bold . org-md-bold) - (code . org-md-verbatim) - (example-block . org-md-example-block) - (export-block . org-md-export-block) - (fixed-width . org-md-example-block) - (headline . org-md-headline) - (horizontal-rule . org-md-horizontal-rule) - (inline-src-block . org-md-verbatim) - (inner-template . org-md-inner-template) - (italic . org-md-italic) - (item . org-md-item) - (keyword . org-md-keyword) - (line-break . org-md-line-break) - (link . org-md-link) - (node-property . org-md-node-property) - (paragraph . org-md-paragraph) - (plain-list . org-md-plain-list) - (plain-text . org-md-plain-text) - (property-drawer . org-md-property-drawer) - (quote-block . org-md-quote-block) - (section . org-md-section) - (src-block . org-md-example-block) - (template . org-md-template) - (verbatim . org-md-verbatim)) - :options-alist - '((:md-footnote-format nil nil org-md-footnote-format) - (:md-footnotes-section nil nil org-md-footnotes-section) - (:md-headline-style nil nil org-md-headline-style))) - - -;;; Filters - -(defun org-md-separate-elements (tree _backend info) - "Fix blank lines between elements. - -TREE is the parse tree being exported. BACKEND is the export -back-end used. INFO is a plist used as a communication channel. - -Enforce a blank line between elements. There are two exceptions -to this rule: - - 1. Preserve blank lines between sibling items in a plain list, - - 2. In an item, remove any blank line before the very first - paragraph and the next sub-list when the latter ends the - current item. - -Assume BACKEND is `md'." - (org-element-map tree (remq 'item org-element-all-elements) - (lambda (e) - (org-element-put-property - e :post-blank - (if (and (eq (org-element-type e) 'paragraph) - (eq (org-element-type (org-element-property :parent e)) 'item) - (org-export-first-sibling-p e info) - (let ((next (org-export-get-next-element e info))) - (and (eq (org-element-type next) 'plain-list) - (not (org-export-get-next-element next info))))) - 0 - 1)))) - ;; Return updated tree. - tree) - - - -;;; Transcode Functions - -;;;; Bold - -(defun org-md-bold (_bold contents _info) - "Transcode BOLD object into Markdown format. -CONTENTS is the text within bold markup. INFO is a plist used as -a communication channel." - (format "**%s**" contents)) - - -;;;; Code and Verbatim - -(defun org-md-verbatim (verbatim _contents _info) - "Transcode VERBATIM object into Markdown format. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (let ((value (org-element-property :value verbatim))) - (format (cond ((not (string-match "`" value)) "`%s`") - ((or (string-prefix-p "`" value) - (string-suffix-p "`" value)) - "`` %s ``") - (t "``%s``")) - value))) - - -;;;; Example Block, Src Block and Export Block - -(defun org-md-example-block (example-block _contents info) - "Transcode EXAMPLE-BLOCK element into Markdown format. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (replace-regexp-in-string - "^" " " - (org-remove-indentation - (org-export-format-code-default example-block info)))) - -(defun org-md-export-block (export-block contents info) - "Transcode a EXPORT-BLOCK element from Org to Markdown. -CONTENTS is nil. INFO is a plist holding contextual information." - (if (member (org-element-property :type export-block) '("MARKDOWN" "MD")) - (org-remove-indentation (org-element-property :value export-block)) - ;; Also include HTML export blocks. - (org-export-with-backend 'html export-block contents info))) - - -;;;; Headline - -(defun org-md-headline (headline contents info) - "Transcode HEADLINE element into Markdown format. -CONTENTS is the headline contents. INFO is a plist used as -a communication channel." - (unless (org-element-property :footnote-section-p headline) - (let* ((level (org-export-get-relative-level headline info)) - (title (org-export-data (org-element-property :title headline) info)) - (todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword - headline))) - (and todo (concat (org-export-data todo info) " "))))) - (tags (and (plist-get info :with-tags) - (let ((tag-list (org-export-get-tags headline info))) - (and tag-list - (concat " " (org-make-tag-string tag-list)))))) - (priority - (and (plist-get info :with-priority) - (let ((char (org-element-property :priority headline))) - (and char (format "[#%c] " char))))) - ;; Headline text without tags. - (heading (concat todo priority title)) - (style (plist-get info :md-headline-style))) - (cond - ;; Cannot create a headline. Fall-back to a list. - ((or (org-export-low-level-p headline info) - (not (memq style '(atx setext))) - (and (eq style 'atx) (> level 6)) - (and (eq style 'setext) (> level 2))) - (let ((bullet - (if (not (org-export-numbered-headline-p headline info)) "-" - (concat (number-to-string - (car (last (org-export-get-headline-number - headline info)))) - ".")))) - (concat bullet (make-string (- 4 (length bullet)) ?\s) heading tags "\n\n" - (and contents (replace-regexp-in-string "^" " " contents))))) - (t - (let ((anchor - (and (org-md--headline-referred-p headline info) - (format "" - (or (org-element-property :CUSTOM_ID headline) - (org-export-get-reference headline info)))))) - (concat (org-md--headline-title style level heading anchor tags) - contents))))))) - - -(defun org-md--headline-referred-p (headline info) - "Non-nil when HEADLINE is being referred to. -INFO is a plist used as a communication channel. Links and table -of contents can refer to headlines." - (unless (org-element-property :footnote-section-p headline) - (or - ;; Global table of contents includes HEADLINE. - (and (plist-get info :with-toc) - (memq headline - (org-export-collect-headlines info (plist-get info :with-toc)))) - ;; A local table of contents includes HEADLINE. - (cl-some - (lambda (h) - (let ((section (car (org-element-contents h)))) - (and - (eq 'section (org-element-type section)) - (org-element-map section 'keyword - (lambda (keyword) - (when (equal "TOC" (org-element-property :key keyword)) - (let ((case-fold-search t) - (value (org-element-property :value keyword))) - (and (string-match-p "\\" value) - (let ((n (and - (string-match "\\<[0-9]+\\>" value) - (string-to-number (match-string 0 value)))) - (local? (string-match-p "\\" value))) - (memq headline - (org-export-collect-headlines - info n (and local? keyword)))))))) - info t)))) - (org-element-lineage headline)) - ;; A link refers internally to HEADLINE. - (org-element-map (plist-get info :parse-tree) 'link - (lambda (link) - (eq headline - (pcase (org-element-property :type link) - ((or "custom-id" "id") (org-export-resolve-id-link link info)) - ("fuzzy" (org-export-resolve-fuzzy-link link info)) - (_ nil)))) - info t)))) - -(defun org-md--headline-title (style level title &optional anchor tags) - "Generate a headline title in the preferred Markdown headline style. -STYLE is the preferred style (`atx' or `setext'). LEVEL is the -header level. TITLE is the headline title. ANCHOR is the HTML -anchor tag for the section as a string. TAGS are the tags set on -the section." - (let ((anchor-lines (and anchor (concat anchor "\n\n")))) - ;; Use "Setext" style - (if (and (eq style 'setext) (< level 3)) - (let* ((underline-char (if (= level 1) ?= ?-)) - (underline (concat (make-string (length title) underline-char) - "\n"))) - (concat "\n" anchor-lines title tags "\n" underline "\n")) - ;; Use "Atx" style - (let ((level-mark (make-string level ?#))) - (concat "\n" anchor-lines level-mark " " title tags "\n\n"))))) - -;;;; Horizontal Rule - -(defun org-md-horizontal-rule (_horizontal-rule _contents _info) - "Transcode HORIZONTAL-RULE element into Markdown format. -CONTENTS is the horizontal rule contents. INFO is a plist used -as a communication channel." - "---") - - -;;;; Italic - -(defun org-md-italic (_italic contents _info) - "Transcode ITALIC object into Markdown format. -CONTENTS is the text within italic markup. INFO is a plist used -as a communication channel." - (format "*%s*" contents)) - - -;;;; Item - -(defun org-md-item (item contents info) - "Transcode ITEM element into Markdown format. -CONTENTS is the item contents. INFO is a plist used as -a communication channel." - (let* ((type (org-element-property :type (org-export-get-parent item))) - (struct (org-element-property :structure item)) - (bullet (if (not (eq type 'ordered)) "-" - (concat (number-to-string - (car (last (org-list-get-item-number - (org-element-property :begin item) - struct - (org-list-prevs-alist struct) - (org-list-parents-alist struct))))) - ".")))) - (concat bullet - (make-string (- 4 (length bullet)) ? ) - (pcase (org-element-property :checkbox item) - (`on "[X] ") - (`trans "[-] ") - (`off "[ ] ")) - (let ((tag (org-element-property :tag item))) - (and tag (format "**%s:** "(org-export-data tag info)))) - (and contents - (org-trim (replace-regexp-in-string "^" " " contents)))))) - - - -;;;; Keyword - -(defun org-md-keyword (keyword contents info) - "Transcode a KEYWORD element into Markdown format. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (pcase (org-element-property :key keyword) - ((or "MARKDOWN" "MD") (org-element-property :value keyword)) - ("TOC" - (let ((case-fold-search t) - (value (org-element-property :value keyword))) - (cond - ((string-match-p "\\" value) - (let ((depth (and (string-match "\\<[0-9]+\\>" value) - (string-to-number (match-string 0 value)))) - (scope - (cond - ((string-match ":target +\\(\".+?\"\\|\\S-+\\)" value) ;link - (org-export-resolve-link - (org-strip-quotes (match-string 1 value)) info)) - ((string-match-p "\\" value) keyword)))) ;local - (org-remove-indentation - (org-md--build-toc info depth keyword scope))))))) - (_ (org-export-with-backend 'html keyword contents info)))) - - -;;;; Line Break - -(defun org-md-line-break (_line-break _contents _info) - "Transcode LINE-BREAK object into Markdown format. -CONTENTS is nil. INFO is a plist used as a communication -channel." - " \n") - - -;;;; Link - -(defun org-md-link (link contents info) - "Transcode LINE-BREAK object into Markdown format. -CONTENTS is the link's description. INFO is a plist used as -a communication channel." - (let ((link-org-files-as-md - (lambda (raw-path) - ;; Treat links to `file.org' as links to `file.md'. - (if (string= ".org" (downcase (file-name-extension raw-path "."))) - (concat (file-name-sans-extension raw-path) ".md") - raw-path))) - (type (org-element-property :type link))) - (cond - ;; Link type is handled by a special function. - ((org-export-custom-protocol-maybe link contents 'md)) - ((member type '("custom-id" "id" "fuzzy")) - (let ((destination (if (string= type "fuzzy") - (org-export-resolve-fuzzy-link link info) - (org-export-resolve-id-link link info)))) - (pcase (org-element-type destination) - (`plain-text ; External file. - (let ((path (funcall link-org-files-as-md destination))) - (if (not contents) (format "<%s>" path) - (format "[%s](%s)" contents path)))) - (`headline - (format - "[%s](#%s)" - ;; Description. - (cond ((org-string-nw-p contents)) - ((org-export-numbered-headline-p destination info) - (mapconcat #'number-to-string - (org-export-get-headline-number destination info) - ".")) - (t (org-export-data (org-element-property :title destination) - info))) - ;; Reference. - (or (org-element-property :CUSTOM_ID destination) - (org-export-get-reference destination info)))) - (_ - (let ((description - (or (org-string-nw-p contents) - (let ((number (org-export-get-ordinal destination info))) - (cond - ((not number) nil) - ((atom number) (number-to-string number)) - (t (mapconcat #'number-to-string number "."))))))) - (when description - (format "[%s](#%s)" - description - (org-export-get-reference destination info)))))))) - ((org-export-inline-image-p link org-html-inline-image-rules) - (let ((path (let ((raw-path (org-element-property :path link))) - (cond ((not (equal "file" type)) (concat type ":" raw-path)) - ((not (file-name-absolute-p raw-path)) raw-path) - (t (expand-file-name raw-path))))) - (caption (org-export-data - (org-export-get-caption - (org-export-get-parent-element link)) info))) - (format "![img](%s)" - (if (not (org-string-nw-p caption)) path - (format "%s \"%s\"" path caption))))) - ((string= type "coderef") - (let ((ref (org-element-property :path link))) - (format (org-export-get-coderef-format ref contents) - (org-export-resolve-coderef ref info)))) - ((equal type "radio") contents) - (t (let* ((raw-path (org-element-property :path link)) - (path - (cond - ((member type '("http" "https" "ftp" "mailto")) - (concat type ":" raw-path)) - ((string= type "file") - (org-export-file-uri (funcall link-org-files-as-md raw-path))) - (t raw-path)))) - (if (not contents) (format "<%s>" path) - (format "[%s](%s)" contents path))))))) - - -;;;; Node Property - -(defun org-md-node-property (node-property _contents _info) - "Transcode a NODE-PROPERTY element into Markdown syntax. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format "%s:%s" - (org-element-property :key node-property) - (let ((value (org-element-property :value node-property))) - (if value (concat " " value) "")))) - - -;;;; Paragraph - -(defun org-md-paragraph (paragraph contents _info) - "Transcode PARAGRAPH element into Markdown format. -CONTENTS is the paragraph contents. INFO is a plist used as -a communication channel." - (let ((first-object (car (org-element-contents paragraph)))) - ;; If paragraph starts with a #, protect it. - (if (and (stringp first-object) (string-prefix-p "#" first-object)) - (concat "\\" contents) - contents))) - - -;;;; Plain List - -(defun org-md-plain-list (_plain-list contents _info) - "Transcode PLAIN-LIST element into Markdown format. -CONTENTS is the plain-list contents. INFO is a plist used as -a communication channel." - contents) - - -;;;; Plain Text - -(defun org-md-plain-text (text info) - "Transcode a TEXT string into Markdown format. -TEXT is the string to transcode. INFO is a plist holding -contextual information." - (when (plist-get info :with-smart-quotes) - (setq text (org-export-activate-smart-quotes text :html info))) - ;; The below series of replacements in `text' is order sensitive. - ;; Protect `, *, _, and \ - (setq text (replace-regexp-in-string "[`*_\\]" "\\\\\\&" text)) - ;; Protect ambiguous #. This will protect # at the beginning of - ;; a line, but not at the beginning of a paragraph. See - ;; `org-md-paragraph'. - (setq text (replace-regexp-in-string "\n#" "\n\\\\#" text)) - ;; Protect ambiguous ! - (setq text (replace-regexp-in-string "\\(!\\)\\[" "\\\\!" text nil nil 1)) - ;; Handle special strings, if required. - (when (plist-get info :with-special-strings) - (setq text (org-html-convert-special-strings text))) - ;; Handle break preservation, if required. - (when (plist-get info :preserve-breaks) - (setq text (replace-regexp-in-string "[ \t]*\n" " \n" text))) - ;; Return value. - text) - - -;;;; Property Drawer - -(defun org-md-property-drawer (_property-drawer contents _info) - "Transcode a PROPERTY-DRAWER element into Markdown format. -CONTENTS holds the contents of the drawer. INFO is a plist -holding contextual information." - (and (org-string-nw-p contents) - (replace-regexp-in-string "^" " " contents))) - - -;;;; Quote Block - -(defun org-md-quote-block (_quote-block contents _info) - "Transcode QUOTE-BLOCK element into Markdown format. -CONTENTS is the quote-block contents. INFO is a plist used as -a communication channel." - (replace-regexp-in-string - "^" "> " - (replace-regexp-in-string "\n\\'" "" contents))) - - -;;;; Section - -(defun org-md-section (_section contents _info) - "Transcode SECTION element into Markdown format. -CONTENTS is the section contents. INFO is a plist used as -a communication channel." - contents) - - -;;;; Template - -(defun org-md--build-toc (info &optional n _keyword scope) - "Return a table of contents. - -INFO is a plist used as a communication channel. - -Optional argument N, when non-nil, is an integer specifying the -depth of the table. - -When optional argument SCOPE is non-nil, build a table of -contents according to the specified element." - (concat - (unless scope - (let ((style (plist-get info :md-headline-style)) - (title (org-html--translate "Table of Contents" info))) - (org-md--headline-title style 1 title nil))) - (mapconcat - (lambda (headline) - (let* ((indentation - (make-string - (* 4 (1- (org-export-get-relative-level headline info))) - ?\s)) - (bullet - (if (not (org-export-numbered-headline-p headline info)) "- " - (let ((prefix - (format "%d." (org-last (org-export-get-headline-number - headline info))))) - (concat prefix (make-string (max 1 (- 4 (length prefix))) - ?\s))))) - (title - (format "[%s](#%s)" - (org-export-data-with-backend - (org-export-get-alt-title headline info) - (org-export-toc-entry-backend 'md) - info) - (or (org-element-property :CUSTOM_ID headline) - (org-export-get-reference headline info)))) - (tags (and (plist-get info :with-tags) - (not (eq 'not-in-toc (plist-get info :with-tags))) - (org-make-tag-string - (org-export-get-tags headline info))))) - (concat indentation bullet title tags))) - (org-export-collect-headlines info n scope) "\n") - "\n")) - -(defun org-md--footnote-formatted (footnote info) - "Formats a single footnote entry FOOTNOTE. -FOOTNOTE is a cons cell of the form (number . definition). -INFO is a plist with contextual information." - (let* ((fn-num (car footnote)) - (fn-text (cdr footnote)) - (fn-format (plist-get info :md-footnote-format)) - (fn-anchor (format "fn.%d" fn-num)) - (fn-href (format " href=\"#fnr.%d\"" fn-num)) - (fn-link-to-ref (org-html--anchor fn-anchor fn-num fn-href info))) - (concat (format fn-format fn-link-to-ref) " " fn-text "\n"))) - -(defun org-md--footnote-section (info) - "Format the footnote section. -INFO is a plist used as a communication channel." - (let* ((fn-alist (org-export-collect-footnote-definitions info)) - (fn-alist (cl-loop for (n _type raw) in fn-alist collect - (cons n (org-trim (org-export-data raw info))))) - (headline-style (plist-get info :md-headline-style)) - (section-title (org-html--translate "Footnotes" info))) - (when fn-alist - (format (plist-get info :md-footnotes-section) - (org-md--headline-title headline-style 1 section-title) - (mapconcat (lambda (fn) (org-md--footnote-formatted fn info)) - fn-alist - "\n"))))) - -(defun org-md-inner-template (contents info) - "Return body of document after converting it to Markdown syntax. -CONTENTS is the transcoded contents string. INFO is a plist -holding export options." - ;; Make sure CONTENTS is separated from table of contents and - ;; footnotes with at least a blank line. - (concat - ;; Table of contents. - (let ((depth (plist-get info :with-toc))) - (when depth - (concat (org-md--build-toc info (and (wholenump depth) depth)) "\n"))) - ;; Document contents. - contents - "\n" - ;; Footnotes section. - (org-md--footnote-section info))) - -(defun org-md-template (contents _info) - "Return complete document string after Markdown conversion. -CONTENTS is the transcoded contents string. INFO is a plist used -as a communication channel." - contents) - - - -;;; Interactive function - -;;;###autoload -(defun org-md-export-as-markdown (&optional async subtreep visible-only) - "Export current buffer to a Markdown buffer. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting buffer should be accessible -through the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -Export is done in a buffer named \"*Org MD Export*\", which will -be displayed when `org-export-show-temporary-export-buffer' is -non-nil." - (interactive) - (org-export-to-buffer 'md "*Org MD Export*" - async subtreep visible-only nil nil (lambda () (text-mode)))) - -;;;###autoload -(defun org-md-convert-region-to-md () - "Assume the current region has Org syntax, and convert it to Markdown. -This can be used in any buffer. For example, you can write an -itemized list in Org syntax in a Markdown buffer and use -this command to convert it." - (interactive) - (org-export-replace-region-by 'md)) - - -;;;###autoload -(defun org-md-export-to-markdown (&optional async subtreep visible-only) - "Export current buffer to a Markdown file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -Return output file's name." - (interactive) - (let ((outfile (org-export-output-file-name ".md" subtreep))) - (org-export-to-file 'md outfile async subtreep visible-only))) - -;;;###autoload -(defun org-md-publish-to-md (plist filename pub-dir) - "Publish an org file to Markdown. - -FILENAME is the filename of the Org file to be published. PLIST -is the property list for the given project. PUB-DIR is the -publishing directory. - -Return output file name." - (org-publish-org-to 'md filename ".md" plist pub-dir)) - -(provide 'ox-md) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox-md.el ends here diff --git a/elpa/org-9.3.6/ox-md.elc b/elpa/org-9.3.6/ox-md.elc deleted file mode 100644 index 522b7c341b4158cf350dbd233e687aa63fbef9be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23220 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 -;; Keywords: outlines, hypermedia, calendar, wp -;; Homepage: https://orgmode.org - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;;; Code: - -(require 'cl-lib) -(require 'format-spec) -(require 'org-compat) -(require 'org-macs) -(require 'ox) -(require 'table nil 'noerror) - -;;; Define Back-End - -(org-export-define-backend 'odt - '((bold . org-odt-bold) - (center-block . org-odt-center-block) - (clock . org-odt-clock) - (code . org-odt-code) - (drawer . org-odt-drawer) - (dynamic-block . org-odt-dynamic-block) - (entity . org-odt-entity) - (example-block . org-odt-example-block) - (export-block . org-odt-export-block) - (export-snippet . org-odt-export-snippet) - (fixed-width . org-odt-fixed-width) - (footnote-definition . org-odt-footnote-definition) - (footnote-reference . org-odt-footnote-reference) - (headline . org-odt-headline) - (horizontal-rule . org-odt-horizontal-rule) - (inline-src-block . org-odt-inline-src-block) - (inlinetask . org-odt-inlinetask) - (italic . org-odt-italic) - (item . org-odt-item) - (keyword . org-odt-keyword) - (latex-environment . org-odt-latex-environment) - (latex-fragment . org-odt-latex-fragment) - (line-break . org-odt-line-break) - (link . org-odt-link) - (node-property . org-odt-node-property) - (paragraph . org-odt-paragraph) - (plain-list . org-odt-plain-list) - (plain-text . org-odt-plain-text) - (planning . org-odt-planning) - (property-drawer . org-odt-property-drawer) - (quote-block . org-odt-quote-block) - (radio-target . org-odt-radio-target) - (section . org-odt-section) - (special-block . org-odt-special-block) - (src-block . org-odt-src-block) - (statistics-cookie . org-odt-statistics-cookie) - (strike-through . org-odt-strike-through) - (subscript . org-odt-subscript) - (superscript . org-odt-superscript) - (table . org-odt-table) - (table-cell . org-odt-table-cell) - (table-row . org-odt-table-row) - (target . org-odt-target) - (template . org-odt-template) - (timestamp . org-odt-timestamp) - (underline . org-odt-underline) - (verbatim . org-odt-verbatim) - (verse-block . org-odt-verse-block)) - :filters-alist '((:filter-parse-tree - . (org-odt--translate-latex-fragments - org-odt--translate-description-lists - org-odt--translate-list-tables - org-odt--translate-image-links))) - :menu-entry - '(?o "Export to ODT" - ((?o "As ODT file" org-odt-export-to-odt) - (?O "As ODT file and open" - (lambda (a s v b) - (if a (org-odt-export-to-odt t s v) - (org-open-file (org-odt-export-to-odt nil s v) 'system)))))) - :options-alist - '((:odt-styles-file "ODT_STYLES_FILE" nil nil t) - (:description "DESCRIPTION" nil nil newline) - (:keywords "KEYWORDS" nil nil space) - (:subtitle "SUBTITLE" nil nil parse) - ;; Other variables. - (:odt-content-template-file nil nil org-odt-content-template-file) - (:odt-display-outline-level nil nil org-odt-display-outline-level) - (:odt-fontify-srcblocks nil nil org-odt-fontify-srcblocks) - (:odt-format-drawer-function nil nil org-odt-format-drawer-function) - (:odt-format-headline-function nil nil org-odt-format-headline-function) - (:odt-format-inlinetask-function nil nil org-odt-format-inlinetask-function) - (:odt-inline-formula-rules nil nil org-odt-inline-formula-rules) - (:odt-inline-image-rules nil nil org-odt-inline-image-rules) - (:odt-pixels-per-inch nil nil org-odt-pixels-per-inch) - (:odt-styles-file nil nil org-odt-styles-file) - (:odt-table-styles nil nil org-odt-table-styles) - (:odt-use-date-fields nil nil org-odt-use-date-fields) - ;; Redefine regular option. - (:with-latex nil "tex" org-odt-with-latex) - ;; Retrieve LaTeX header for fragments. - (:latex-header "LATEX_HEADER" nil nil newline))) - - -;;; Dependencies - -;;; Hooks - -;;; Function and Dynamically Scoped Variables Declarations - -(declare-function hfy-face-to-style "htmlfontify" (fn)) -(declare-function hfy-face-or-def-to-name "htmlfontify" (fn)) -(declare-function archive-zip-extract "arc-mode" (archive name)) -(declare-function org-create-math-formula "org" (latex-frag &optional mathml-file)) -(declare-function browse-url-file-url "browse-url" (file)) - -(defvar nxml-auto-insert-xml-declaration-flag) ; nxml-mode.el -(defvar archive-zip-extract) ; arc-mode.el -(defvar hfy-end-span-handler) ; htmlfontify.el -(defvar hfy-begin-span-handler) ; htmlfontify.el -(defvar hfy-face-to-css) ; htmlfontify.el -(defvar hfy-html-quote-map) ; htmlfontify.el -(defvar hfy-html-quote-regex) ; htmlfontify.el - - -;;; Internal Variables - -(defconst org-odt-lib-dir - (file-name-directory (or load-file-name (buffer-file-name))) - "Location of ODT exporter. -Use this to infer values of `org-odt-styles-dir' and -`org-odt-schema-dir'.") - -(defvar org-odt-data-dir (expand-file-name "../../etc/" org-odt-lib-dir) - "Data directory for ODT exporter. -Use this to infer values of `org-odt-styles-dir' and -`org-odt-schema-dir'.") - -(defconst org-odt-special-string-regexps - '(("\\\\-" . "­\\1") ; shy - ("---\\([^-]\\)" . "—\\1") ; mdash - ("--\\([^-]\\)" . "–\\1") ; ndash - ("\\.\\.\\." . "…")) ; hellip - "Regular expressions for special string conversion.") - -(defconst org-odt-schema-dir-list - (list (expand-file-name "./schema/" org-odt-data-dir)) - "List of directories to search for OpenDocument schema files. -Use this list to set the default value of `org-odt-schema-dir'. -The entries in this list are populated heuristically based on the -values of `org-odt-lib-dir' and `org-odt-data-dir'.") - -(defconst org-odt-styles-dir-list - (list - (and org-odt-data-dir - (expand-file-name "./styles/" org-odt-data-dir)) ; bail out - (expand-file-name "./styles/" org-odt-data-dir) - (expand-file-name "../etc/styles/" org-odt-lib-dir) ; git - (expand-file-name "./etc/styles/" org-odt-lib-dir) ; elpa - (expand-file-name "./org/" data-directory) ; system - ) - "List of directories to search for OpenDocument styles files. -See `org-odt-styles-dir'. The entries in this list are populated -heuristically based on the values of `org-odt-lib-dir' and -`org-odt-data-dir'.") - -(defconst org-odt-styles-dir - (let ((styles-dir - (cl-find-if - (lambda (dir) - (and dir - (file-readable-p - (expand-file-name "OrgOdtContentTemplate.xml" dir)) - (file-readable-p (expand-file-name "OrgOdtStyles.xml" dir)))) - org-odt-styles-dir-list))) - (unless styles-dir - (error "Error (ox-odt): Cannot find factory styles files, aborting")) - styles-dir) - "Directory that holds auxiliary XML files used by the ODT exporter. - -This directory contains the following XML files - - \"OrgOdtStyles.xml\" and \"OrgOdtContentTemplate.xml\". These - XML files are used as the default values of - `org-odt-styles-file' and `org-odt-content-template-file'. - -The default value of this variable varies depending on the -version of Org in use and is initialized from -`org-odt-styles-dir-list'. Note that the user could be using Org -from one of: Org own private git repository, GNU ELPA tar or -standard Emacs.") - -(defconst org-odt-bookmark-prefix "OrgXref.") - -(defconst org-odt-manifest-file-entry-tag - "\n") - -(defconst org-odt-file-extensions - '(("odt" . "OpenDocument Text") - ("ott" . "OpenDocument Text Template") - ("odm" . "OpenDocument Master Document") - ("ods" . "OpenDocument Spreadsheet") - ("ots" . "OpenDocument Spreadsheet Template") - ("odg" . "OpenDocument Drawing (Graphics)") - ("otg" . "OpenDocument Drawing Template") - ("odp" . "OpenDocument Presentation") - ("otp" . "OpenDocument Presentation Template") - ("odi" . "OpenDocument Image") - ("odf" . "OpenDocument Formula") - ("odc" . "OpenDocument Chart"))) - -(defconst org-odt-table-style-format - " - - - -" - "Template for auto-generated Table styles.") - -(defvar org-odt-automatic-styles '() - "Registry of automatic styles for various OBJECT-TYPEs. -The variable has the following form: - ((OBJECT-TYPE-A - ((OBJECT-NAME-A.1 OBJECT-PROPS-A.1) - (OBJECT-NAME-A.2 OBJECT-PROPS-A.2) ...)) - (OBJECT-TYPE-B - ((OBJECT-NAME-B.1 OBJECT-PROPS-B.1) - (OBJECT-NAME-B.2 OBJECT-PROPS-B.2) ...)) - ...). - -OBJECT-TYPEs could be \"Section\", \"Table\", \"Figure\" etc. -OBJECT-PROPS is (typically) a plist created by passing -\"#+ATTR_ODT: \" option to `org-odt-parse-block-attributes'. - -Use `org-odt-add-automatic-style' to add update this variable.'") - -(defvar org-odt-object-counters nil - "Running counters for various OBJECT-TYPEs. -Use this to generate automatic names and style-names. See -`org-odt-add-automatic-style'.") - -(defvar org-odt-src-block-paragraph-format - " - - - - - " - "Custom paragraph style for colorized source and example blocks. -This style is much the same as that of \"OrgFixedWidthBlock\" -except that the foreground and background colors are set -according to the default face identified by the `htmlfontify'.") - -(defvar hfy-optimizations) -(defvar org-odt-embedded-formulas-count 0) -(defvar org-odt-embedded-images-count 0) -(defvar org-odt-image-size-probe-method - (append (and (executable-find "identify") '(imagemagick)) ; See Bug#10675 - '(emacs fixed)) - "Ordered list of methods for determining image sizes.") - -(defvar org-odt-default-image-sizes-alist - '(("as-char" . (5 . 0.4)) - ("paragraph" . (5 . 5))) - "Hardcoded image dimensions one for each of the anchor - methods.") - -;; A4 page size is 21.0 by 29.7 cms -;; The default page settings has 2cm margin on each of the sides. So -;; the effective text area is 17.0 by 25.7 cm -(defvar org-odt-max-image-size '(17.0 . 20.0) - "Limiting dimensions for an embedded image.") - -(defconst org-odt-label-styles - '(("math-formula" "%c" "text" "(%n)") - ("math-label" "(%n)" "text" "(%n)") - ("category-and-value" "%e %n: %c" "category-and-value" "%e %n") - ("value" "%e %n: %c" "value" "%n")) - "Specify how labels are applied and referenced. - -This is an alist where each element is of the form: - - (STYLE-NAME ATTACH-FMT REF-MODE REF-FMT) - -ATTACH-FMT controls how labels and captions are attached to an -entity. It may contain following specifiers - %e and %c. %e is -replaced with the CATEGORY-NAME. %n is replaced with -\" SEQNO \". %c is replaced -with CAPTION. - -REF-MODE and REF-FMT controls how label references are generated. -The following XML is generated for a label reference - -\" -REF-FMT \". REF-FMT may contain following -specifiers - %e and %n. %e is replaced with the CATEGORY-NAME. -%n is replaced with SEQNO. - -See also `org-odt-format-label'.") - -(defvar org-odt-category-map-alist - '(("__Table__" "Table" "value" "Table" org-odt--enumerable-p) - ("__Figure__" "Illustration" "value" "Figure" org-odt--enumerable-image-p) - ("__MathFormula__" "Text" "math-formula" "Equation" org-odt--enumerable-formula-p) - ("__DvipngImage__" "Equation" "value" "Equation" org-odt--enumerable-latex-image-p) - ("__Listing__" "Listing" "value" "Listing" org-odt--enumerable-p)) - "Map a CATEGORY-HANDLE to OD-VARIABLE and LABEL-STYLE. - -This is a list where each entry is of the form: - - (CATEGORY-HANDLE OD-VARIABLE LABEL-STYLE CATEGORY-NAME ENUMERATOR-PREDICATE) - -CATEGORY_HANDLE identifies the captionable entity in question. - -OD-VARIABLE is the OpenDocument sequence counter associated with -the entity. These counters are declared within -\"...\" block of -`org-odt-content-template-file'. - -LABEL-STYLE is a key into `org-odt-label-styles' and specifies -how a given entity should be captioned and referenced. - -CATEGORY-NAME is used for qualifying captions on export. - -ENUMERATOR-PREDICATE is used for assigning a sequence number to -the entity. See `org-odt--enumerate'.") - -(defvar org-odt-manifest-file-entries nil) -(defvar hfy-user-sheet-assoc) - -(defvar org-odt-zip-dir nil - "Temporary work directory for OpenDocument exporter.") - - - -;;; User Configuration Variables - -(defgroup org-export-odt nil - "Options for exporting Org mode files to ODT." - :tag "Org Export ODT" - :group 'org-export) - - -;;;; Debugging - -(defcustom org-odt-prettify-xml nil - "Specify whether or not the xml output should be prettified. -When this option is turned on, `indent-region' is run on all -component xml buffers before they are saved. Turn this off for -regular use. Turn this on if you need to examine the xml -visually." - :group 'org-export-odt - :version "24.1" - :type 'boolean) - - -;;;; Document schema - -(require 'rng-loc) -(defcustom org-odt-schema-dir - (cl-find-if - (lambda (dir) - (and dir - (file-expand-wildcards - (expand-file-name "od-manifest-schema*.rnc" dir)) - (file-expand-wildcards (expand-file-name "od-schema*.rnc" dir)) - (file-readable-p (expand-file-name "schemas.xml" dir)))) - org-odt-schema-dir-list) - "Directory that contains OpenDocument schema files. - -This directory contains: -1. rnc files for OpenDocument schema -2. a \"schemas.xml\" file that specifies locating rules needed - for auto validation of OpenDocument XML files. - -Use the customize interface to set this variable. This ensures -that `rng-schema-locating-files' is updated and auto-validation -of OpenDocument XML takes place based on the value -`rng-nxml-auto-validate-flag'. - -The default value of this variable varies depending on the -version of org in use and is initialized from -`org-odt-schema-dir-list'. The OASIS schema files are available -only in the org's private git repository. It is *not* bundled -with GNU ELPA tar or standard Emacs distribution." - :type '(choice - (const :tag "Not set" nil) - (directory :tag "Schema directory")) - :group 'org-export-odt - :version "24.1" - :set - (lambda (var value) - "Set `org-odt-schema-dir'. -Also add it to `rng-schema-locating-files'." - (let ((schema-dir value)) - (set var - (if (and - (file-expand-wildcards - (expand-file-name "od-manifest-schema*.rnc" schema-dir)) - (file-expand-wildcards - (expand-file-name "od-schema*.rnc" schema-dir)) - (file-readable-p - (expand-file-name "schemas.xml" schema-dir))) - schema-dir - (when value - (message "Error (ox-odt): %s has no OpenDocument schema files" - value)) - nil))) - (when org-odt-schema-dir - (eval-after-load 'rng-loc - '(add-to-list 'rng-schema-locating-files - (expand-file-name "schemas.xml" - org-odt-schema-dir)))))) - - -;;;; Document styles - -(defcustom org-odt-content-template-file nil - "Template file for \"content.xml\". -The exporter embeds the exported content just before -\"\" element. - -If unspecified, the file named \"OrgOdtContentTemplate.xml\" -under `org-odt-styles-dir' is used." - :type '(choice (const nil) - (file)) - :group 'org-export-odt - :version "24.3") - -(defcustom org-odt-styles-file nil - "Default styles file for use with ODT export. -Valid values are one of: -1. nil -2. path to a styles.xml file -3. path to a *.odt or a *.ott file -4. list of the form (ODT-OR-OTT-FILE (FILE-MEMBER-1 FILE-MEMBER-2 -...)) - -In case of option 1, an in-built styles.xml is used. See -`org-odt-styles-dir' for more information. - -In case of option 3, the specified file is unzipped and the -styles.xml embedded therein is used. - -In case of option 4, the specified ODT-OR-OTT-FILE is unzipped -and FILE-MEMBER-1, FILE-MEMBER-2 etc are copied in to the -generated odt file. Use relative path for specifying the -FILE-MEMBERS. styles.xml must be specified as one of the -FILE-MEMBERS. - -Use options 1, 2 or 3 only if styles.xml alone suffices for -achieving the desired formatting. Use option 4, if the styles.xml -references additional files like header and footer images for -achieving the desired formatting. - -Use \"#+ODT_STYLES_FILE: ...\" directive to set this variable on -a per-file basis. For example, - -#+ODT_STYLES_FILE: \"/path/to/styles.xml\" or -#+ODT_STYLES_FILE: (\"/path/to/file.ott\" (\"styles.xml\" \"image/hdr.png\"))." - :group 'org-export-odt - :version "24.1" - :type - '(choice - (const :tag "Factory settings" nil) - (file :must-match t :tag "styles.xml") - (file :must-match t :tag "ODT or OTT file") - (list :tag "ODT or OTT file + Members" - (file :must-match t :tag "ODF Text or Text Template file") - (cons :tag "Members" - (file :tag " Member" "styles.xml") - (repeat (file :tag "Member")))))) - -(defcustom org-odt-display-outline-level 2 - "Outline levels considered for enumerating captioned entities." - :group 'org-export-odt - :version "24.4" - :package-version '(Org . "8.0") - :type 'integer) - -;;;; Document conversion - -(defcustom org-odt-convert-processes - '(("LibreOffice" - "soffice --headless --convert-to %f%x --outdir %d %i") - ("unoconv" - "unoconv -f %f -o %d %i")) - "Specify a list of document converters and their usage. -The converters in this list are offered as choices while -customizing `org-odt-convert-process'. - -This variable is a list where each element is of the -form (CONVERTER-NAME CONVERTER-CMD). CONVERTER-NAME is the name -of the converter. CONVERTER-CMD is the shell command for the -converter and can contain format specifiers. These format -specifiers are interpreted as below: - -%i input file name in full -%I input file name as a URL -%f format of the output file -%o output file name in full -%O output file name as a URL -%d output dir in full -%D output dir as a URL. -%x extra options as set in `org-odt-convert-capabilities'." - :group 'org-export-odt - :version "24.1" - :type - '(choice - (const :tag "None" nil) - (alist :tag "Converters" - :key-type (string :tag "Converter Name") - :value-type (group (string :tag "Command line"))))) - -(defcustom org-odt-convert-process "LibreOffice" - "Use this converter to convert from \"odt\" format to other formats. -During customization, the list of converter names are populated -from `org-odt-convert-processes'." - :group 'org-export-odt - :version "24.1" - :type '(choice :convert-widget - (lambda (w) - (apply 'widget-convert (widget-type w) - (eval (car (widget-get w :args))))) - `((const :tag "None" nil) - ,@(mapcar (lambda (c) - `(const :tag ,(car c) ,(car c))) - org-odt-convert-processes)))) - -(defcustom org-odt-convert-capabilities - '(("Text" - ("odt" "ott" "doc" "rtf" "docx") - (("pdf" "pdf") ("odt" "odt") ("rtf" "rtf") ("ott" "ott") - ("doc" "doc" ":\"MS Word 97\"") ("docx" "docx") ("html" "html"))) - ("Web" - ("html") - (("pdf" "pdf") ("odt" "odt") ("html" "html"))) - ("Spreadsheet" - ("ods" "ots" "xls" "csv" "xlsx") - (("pdf" "pdf") ("ots" "ots") ("html" "html") ("csv" "csv") ("ods" "ods") - ("xls" "xls") ("xlsx" "xlsx"))) - ("Presentation" - ("odp" "otp" "ppt" "pptx") - (("pdf" "pdf") ("swf" "swf") ("odp" "odp") ("otp" "otp") ("ppt" "ppt") - ("pptx" "pptx") ("odg" "odg")))) - "Specify input and output formats of `org-odt-convert-process'. -More correctly, specify the set of input and output formats that -the user is actually interested in. - -This variable is an alist where each element is of the -form (DOCUMENT-CLASS INPUT-FMT-LIST OUTPUT-FMT-ALIST). -INPUT-FMT-LIST is a list of INPUT-FMTs. OUTPUT-FMT-ALIST is an -alist where each element is of the form (OUTPUT-FMT -OUTPUT-FILE-EXTENSION EXTRA-OPTIONS). - -The variable is interpreted as follows: -`org-odt-convert-process' can take any document that is in -INPUT-FMT-LIST and produce any document that is in the -OUTPUT-FMT-LIST. A document converted to OUTPUT-FMT will have -OUTPUT-FILE-EXTENSION as the file name extension. OUTPUT-FMT -serves dual purposes: -- It is used for populating completion candidates during - `org-odt-convert' commands. -- It is used as the value of \"%f\" specifier in - `org-odt-convert-process'. - -EXTRA-OPTIONS is used as the value of \"%x\" specifier in -`org-odt-convert-process'. - -DOCUMENT-CLASS is used to group a set of file formats in -INPUT-FMT-LIST in to a single class. - -Note that this variable inherently captures how LibreOffice based -converters work. LibreOffice maps documents of various formats -to classes like Text, Web, Spreadsheet, Presentation etc and -allow document of a given class (irrespective of its source -format) to be converted to any of the export formats associated -with that class. - -See default setting of this variable for a typical configuration." - :group 'org-export-odt - :version "24.1" - :type - '(choice - (const :tag "None" nil) - (alist :tag "Capabilities" - :key-type (string :tag "Document Class") - :value-type - (group (repeat :tag "Input formats" (string :tag "Input format")) - (alist :tag "Output formats" - :key-type (string :tag "Output format") - :value-type - (group (string :tag "Output file extension") - (choice - (const :tag "None" nil) - (string :tag "Extra options")))))))) - -(defcustom org-odt-preferred-output-format nil - "Automatically post-process to this format after exporting to \"odt\". -Command `org-odt-export-to-odt' exports first to \"odt\" format -and then uses `org-odt-convert-process' to convert the -resulting document to this format. During customization of this -variable, the list of valid values are populated based on -`org-odt-convert-capabilities'. - -You can set this option on per-file basis using file local -values. See Info node `(emacs) File Variables'." - :group 'org-export-odt - :version "24.1" - :type '(choice :convert-widget - (lambda (w) - (apply 'widget-convert (widget-type w) - (eval (car (widget-get w :args))))) - `((const :tag "None" nil) - ,@(mapcar (lambda (c) - `(const :tag ,c ,c)) - (org-odt-reachable-formats "odt"))))) -;;;###autoload -(put 'org-odt-preferred-output-format 'safe-local-variable 'stringp) - - -;;;; Drawers - -(defcustom org-odt-format-drawer-function (lambda (_name contents) contents) - "Function called to format a drawer in ODT code. - -The function must accept two parameters: - NAME the drawer name, like \"LOGBOOK\" - CONTENTS the contents of the drawer. - -The function should return the string to be exported. - -The default value simply returns the value of CONTENTS." - :group 'org-export-odt - :version "26.1" - :package-version '(Org . "8.3") - :type 'function) - - -;;;; Headline - -(defcustom org-odt-format-headline-function - 'org-odt-format-headline-default-function - "Function to format headline text. - -This function will be called with 5 arguments: -TODO the todo keyword (string or nil). -TODO-TYPE the type of todo (symbol: `todo', `done', nil) -PRIORITY the priority of the headline (integer or nil) -TEXT the main headline text (string). -TAGS the tags string, separated with colons (string or nil). - -The function result will be used as headline text." - :group 'org-export-odt - :version "26.1" - :package-version '(Org . "8.3") - :type 'function) - - -;;;; Inlinetasks - -(defcustom org-odt-format-inlinetask-function - 'org-odt-format-inlinetask-default-function - "Function called to format an inlinetask in ODT code. - -The function must accept six parameters: - TODO the todo keyword, as a string - TODO-TYPE the todo type, a symbol among `todo', `done' and nil. - PRIORITY the inlinetask priority, as a string - NAME the inlinetask name, as a string. - TAGS the inlinetask tags, as a string. - CONTENTS the contents of the inlinetask, as a string. - -The function should return the string to be exported." - :group 'org-export-odt - :version "26.1" - :package-version '(Org . "8.3") - :type 'function) - - -;;;; LaTeX - -(defcustom org-odt-with-latex org-export-with-latex - "Non-nil means process LaTeX math snippets. - -When set, the exporter will process LaTeX environments and -fragments. - -This option can also be set with the +OPTIONS line, -e.g. \"tex:mathjax\". Allowed values are: - -nil Ignore math snippets. -`verbatim' Keep everything in verbatim -`dvipng' Process the LaTeX fragments to images. This will also - include processing of non-math environments. -`imagemagick' Convert the LaTeX fragments to pdf files and use - imagemagick to convert pdf files to png files. -`mathjax' Do MathJax preprocessing and arrange for MathJax.js to - be loaded. - -Any other symbol is a synonym for `mathjax'." - :group 'org-export-odt - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (const :tag "Do not process math in any way" nil) - (const :tag "Leave math verbatim" verbatim) - (const :tag "Use dvipng to make images" dvipng) - (const :tag "Use imagemagick to make images" imagemagick) - (other :tag "Use MathJax to display math" mathjax))) - - -;;;; Links - -(defcustom org-odt-inline-formula-rules - '(("file" . "\\.\\(mathml\\|mml\\|odf\\)\\'")) - "Rules characterizing formula files that can be inlined into ODT. - -A rule consists in an association whose key is the type of link -to consider, and value is a regexp that will be matched against -link's path." - :group 'org-export-odt - :version "24.4" - :package-version '(Org . "8.0") - :type '(alist :key-type (string :tag "Type") - :value-type (regexp :tag "Path"))) - -(defcustom org-odt-inline-image-rules - '(("file" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'")) - "Rules characterizing image files that can be inlined into ODT. - -A rule consists in an association whose key is the type of link -to consider, and value is a regexp that will be matched against -link's path." - :group 'org-export-odt - :version "26.1" - :package-version '(Org . "8.3") - :type '(alist :key-type (string :tag "Type") - :value-type (regexp :tag "Path"))) - -(defcustom org-odt-pixels-per-inch 96.0 - "Scaling factor for converting images pixels to inches. -Use this for sizing of embedded images. See Info node `(org) -Images in ODT export' for more information." - :type 'float - :group 'org-export-odt - :version "24.4" - :package-version '(Org . "8.1")) - - -;;;; Src Block - -(defcustom org-odt-create-custom-styles-for-srcblocks t - "Whether custom styles for colorized source blocks be automatically created. -When this option is turned on, the exporter creates custom styles -for source blocks based on the advice of `htmlfontify'. Creation -of custom styles happen as part of `org-odt-hfy-face-to-css'. - -When this option is turned off exporter does not create such -styles. - -Use the latter option if you do not want the custom styles to be -based on your current display settings. It is necessary that the -styles.xml already contains needed styles for colorizing to work. - -This variable is effective only if `org-odt-fontify-srcblocks' is -turned on." - :group 'org-export-odt - :version "24.1" - :type 'boolean) - -(defcustom org-odt-fontify-srcblocks t - "Specify whether or not source blocks need to be fontified. -Turn this option on if you want to colorize the source code -blocks in the exported file. For colorization to work, you need -to make available an enhanced version of `htmlfontify' library." - :type 'boolean - :group 'org-export-odt - :version "24.1") - - -;;;; Table - -(defcustom org-odt-table-styles - '(("OrgEquation" "OrgEquation" - ((use-first-column-styles . t) - (use-last-column-styles . t))) - ("TableWithHeaderRowAndColumn" "Custom" - ((use-first-row-styles . t) - (use-first-column-styles . t))) - ("TableWithFirstRowandLastRow" "Custom" - ((use-first-row-styles . t) - (use-last-row-styles . t))) - ("GriddedTable" "Custom" nil)) - "Specify how Table Styles should be derived from a Table Template. -This is a list where each element is of the -form (TABLE-STYLE-NAME TABLE-TEMPLATE-NAME TABLE-CELL-OPTIONS). - -TABLE-STYLE-NAME is the style associated with the table through -\"#+ATTR_ODT: :style TABLE-STYLE-NAME\" line. - -TABLE-TEMPLATE-NAME is a set of - up to 9 - automatic -TABLE-CELL-STYLE-NAMEs and PARAGRAPH-STYLE-NAMEs (as defined -below) that is included in `org-odt-content-template-file'. - -TABLE-CELL-STYLE-NAME := TABLE-TEMPLATE-NAME + TABLE-CELL-TYPE + - \"TableCell\" -PARAGRAPH-STYLE-NAME := TABLE-TEMPLATE-NAME + TABLE-CELL-TYPE + - \"TableParagraph\" -TABLE-CELL-TYPE := \"FirstRow\" | \"LastColumn\" | - \"FirstRow\" | \"LastRow\" | - \"EvenRow\" | \"OddRow\" | - \"EvenColumn\" | \"OddColumn\" | \"\" -where \"+\" above denotes string concatenation. - -TABLE-CELL-OPTIONS is an alist where each element is of the -form (TABLE-CELL-STYLE-SELECTOR . ON-OR-OFF). -TABLE-CELL-STYLE-SELECTOR := `use-first-row-styles' | - `use-last-row-styles' | - `use-first-column-styles' | - `use-last-column-styles' | - `use-banding-rows-styles' | - `use-banding-columns-styles' | - `use-first-row-styles' -ON-OR-OFF := t | nil - -For example, with the following configuration - -\(setq org-odt-table-styles - \\='((\"TableWithHeaderRowsAndColumns\" \"Custom\" - ((use-first-row-styles . t) - (use-first-column-styles . t))) - (\"TableWithHeaderColumns\" \"Custom\" - ((use-first-column-styles . t))))) - -1. A table associated with \"TableWithHeaderRowsAndColumns\" - style will use the following table-cell styles - - \"CustomFirstRowTableCell\", \"CustomFirstColumnTableCell\", - \"CustomTableCell\" and the following paragraph styles - \"CustomFirstRowTableParagraph\", - \"CustomFirstColumnTableParagraph\", \"CustomTableParagraph\" - as appropriate. - -2. A table associated with \"TableWithHeaderColumns\" style will - use the following table-cell styles - - \"CustomFirstColumnTableCell\", \"CustomTableCell\" and the - following paragraph styles - \"CustomFirstColumnTableParagraph\", \"CustomTableParagraph\" - as appropriate.. - -Note that TABLE-TEMPLATE-NAME corresponds to the -\"\" elements contained within -\"\". The entries (TABLE-STYLE-NAME -TABLE-TEMPLATE-NAME TABLE-CELL-OPTIONS) correspond to -\"table:template-name\" and \"table:use-first-row-styles\" etc -attributes of \"\" element. Refer ODF-1.2 -specification for more information. Also consult the -implementation filed under `org-odt-get-table-cell-styles'. - -The TABLE-STYLE-NAME \"OrgEquation\" is used internally for -formatting of numbered display equations. Do not delete this -style from the list." - :group 'org-export-odt - :version "24.1" - :type '(choice - (const :tag "None" nil) - (repeat :tag "Table Styles" - (list :tag "Table Style Specification" - (string :tag "Table Style Name") - (string :tag "Table Template Name") - (alist :options (use-first-row-styles - use-last-row-styles - use-first-column-styles - use-last-column-styles - use-banding-rows-styles - use-banding-columns-styles) - :key-type symbol - :value-type (const :tag "True" t)))))) - -;;;; Timestamps - -(defcustom org-odt-use-date-fields nil - "Non-nil, if timestamps should be exported as date fields. - -When nil, export timestamps as plain text. - -When non-nil, map `org-time-stamp-custom-formats' to a pair of -OpenDocument date-styles with names \"OrgDate1\" and \"OrgDate2\" -respectively. A timestamp with no time component is formatted -with style \"OrgDate1\" while one with explicit hour and minutes -is formatted with style \"OrgDate2\". - -This feature is experimental. Most (but not all) of the common -%-specifiers in `format-time-string' are supported. -Specifically, locale-dependent specifiers like \"%c\", \"%x\" are -formatted as canonical Org timestamps. For finer control, avoid -these %-specifiers. - -Textual specifiers like \"%b\", \"%h\", \"%B\", \"%a\", \"%A\" -etc., are displayed by the application in the default language -and country specified in `org-odt-styles-file'. Note that the -default styles file uses language \"en\" and country \"GB\". You -can localize the week day and month strings in the exported -document by setting the default language and country either using -the application UI or through a custom styles file. - -See `org-odt--build-date-styles' for implementation details." - :group 'org-export-odt - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - - - -;;; Internal functions - -;;;; Date - -(defun org-odt--format-timestamp (timestamp &optional end iso-date-p) - (let* ((format-timestamp - (lambda (timestamp format &optional end utc) - (if timestamp - (org-timestamp-format timestamp format end utc) - (format-time-string format nil utc)))) - (has-time-p (or (not timestamp) - (org-timestamp-has-time-p timestamp))) - (iso-date (let ((format (if has-time-p "%Y-%m-%dT%H:%M:%S" - "%Y-%m-%d"))) - (funcall format-timestamp timestamp format end)))) - (if iso-date-p iso-date - (let* ((style (if has-time-p "OrgDate2" "OrgDate1")) - ;; LibreOffice does not care about end goes as content - ;; within the "..." field. The - ;; displayed date is automagically corrected to match the - ;; format requested by "style:data-style-name" attribute. So - ;; don't bother about formatting the date contents to be - ;; compatible with "OrgDate1" and "OrgDateTime" styles. A - ;; simple Org-style date should suffice. - (date (let* ((formats - (if org-display-custom-times - (cons (substring - (car org-time-stamp-custom-formats) 1 -1) - (substring - (cdr org-time-stamp-custom-formats) 1 -1)) - '("%Y-%m-%d %a" . "%Y-%m-%d %a %H:%M"))) - (format (if has-time-p (cdr formats) (car formats)))) - (funcall format-timestamp timestamp format end))) - (repeater (let ((repeater-type (org-element-property - :repeater-type timestamp)) - (repeater-value (org-element-property - :repeater-value timestamp)) - (repeater-unit (org-element-property - :repeater-unit timestamp))) - (concat - (cl-case repeater-type - (catchup "++") (restart ".+") (cumulate "+")) - (when repeater-value - (number-to-string repeater-value)) - (cl-case repeater-unit - (hour "h") (day "d") (week "w") (month "m") - (year "y")))))) - (concat - (format "%s" - iso-date style date) - (and (not (string= repeater "")) " ") - repeater))))) - -;;;; Frame - -(defun org-odt--frame (text width height style &optional extra - anchor-type &rest title-and-desc) - (let ((frame-attrs - (concat - (if width (format " svg:width=\"%0.2fcm\"" width) "") - (if height (format " svg:height=\"%0.2fcm\"" height) "") - extra - (format " text:anchor-type=\"%s\"" (or anchor-type "paragraph")) - (format " draw:name=\"%s\"" - (car (org-odt-add-automatic-style "Frame")))))) - (format - "\n\n%s\n" - style frame-attrs - (concat text - (let ((title (car title-and-desc)) - (desc (cadr title-and-desc))) - (concat (when title - (format "%s" - (org-odt--encode-plain-text title t))) - (when desc - (format "%s" - (org-odt--encode-plain-text desc t))))))))) - - -;;;; Library wrappers - -(defun org-odt--zip-extract (archive members target) - (when (atom members) (setq members (list members))) - (require 'arc-mode) - (dolist (member members) - (let* ((--quote-file-name - ;; This is shamelessly stolen from `archive-zip-extract'. - (lambda (name) - (if (or (not (memq system-type '(windows-nt ms-dos))) - (and (boundp 'w32-quote-process-args) - (null w32-quote-process-args))) - (shell-quote-argument name) - name))) - (target (funcall --quote-file-name target)) - (archive (expand-file-name archive)) - (archive-zip-extract - (list "unzip" "-qq" "-o" "-d" target)) - exit-code command-output) - (setq command-output - (with-temp-buffer - (setq exit-code (archive-zip-extract archive member)) - (buffer-string))) - (unless (zerop exit-code) - (message command-output) - (error "Extraction failed"))))) - -;;;; Target - -(defun org-odt--target (text id) - (if (not id) text - (concat - (format "\n" id) - (format "\n" id) text - (format "\n" id)))) - -;;;; Textbox - -(defun org-odt--textbox (text width height style &optional - extra anchor-type) - (org-odt--frame - (format "\n%s\n" - (concat (format " fo:min-height=\"%0.2fcm\"" (or height .2)) - (and (not width) - (format " fo:min-width=\"%0.2fcm\"" (or width .2)))) - text) - width nil style extra anchor-type)) - - - -;;;; Table of Contents - -(defun org-odt--format-toc (title entries depth) - "Return a table of contents. -TITLE is the title of the table, as a string, or nil. ENTRIES is -the contents of the table, as a string. DEPTH is an integer -specifying the depth of the table." - (concat - " -\n" - (format " " depth) - (and title - (format " - %s -" - title)) - - (let ((levels (number-sequence 1 10))) - (mapconcat - (lambda (level) - (format - " - - - - - - \n" - level level)) levels "")) - " - - " - (and title - (format " - - %s - \n" - title)) - entries - " - -")) - -(cl-defun org-odt-format-toc-headline - (todo _todo-type priority text tags - &key _level section-number headline-label &allow-other-keys) - (format "%s" - headline-label - (concat - ;; Section number. - (and section-number (concat section-number ". ")) - ;; Todo. - (when todo - (let ((style (if (member todo org-done-keywords) - "OrgDone" "OrgTodo"))) - (format "%s " - style todo))) - (when priority - (let* ((style (format "OrgPriority-%s" priority)) - (priority (format "[#%c]" priority))) - (format "%s " - style priority))) - ;; Title. - text - ;; Tags. - (when tags - (concat - (format " [%s]" - "OrgTags" - (mapconcat - (lambda (tag) - (format - "%s" - "OrgTag" tag)) tags " : "))))))) - -(defun org-odt-toc (depth info &optional scope) - "Build a table of contents. -DEPTH is an integer specifying the depth of the table. INFO is -a plist containing current export properties. Optional argument -SCOPE, when non-nil, defines the scope of the table. Return the -table of contents as a string, or nil." - (cl-assert (wholenump depth)) - ;; When a headline is marked as a radio target, as in the example below: - ;; - ;; ** <<>> - ;; Some text. - ;; - ;; suppress generation of radio targets. i.e., Radio targets are to - ;; be marked as targets within /document body/ and *not* within - ;; /TOC/, as otherwise there will be duplicated anchors one in TOC - ;; and one in the document body. - ;; - ;; Likewise, links, footnote references and regular targets are also - ;; suppressed. - (let* ((headlines (org-export-collect-headlines info depth scope)) - (backend (org-export-toc-entry-backend - (org-export-backend-name (plist-get info :back-end))))) - (when headlines - (org-odt--format-toc - (and (not scope) (org-export-translate "Table of Contents" :utf-8 info)) - (mapconcat - (lambda (headline) - (let* ((entry (org-odt-format-headline--wrap - headline backend info 'org-odt-format-toc-headline)) - (level (org-export-get-relative-level headline info)) - (style (format "Contents_20_%d" level))) - (format "\n%s" - style entry))) - headlines "\n") - depth)))) - - -;;;; Document styles - -(defun org-odt-add-automatic-style (object-type &optional object-props) - "Create an automatic style of type OBJECT-TYPE with param OBJECT-PROPS. -OBJECT-PROPS is (typically) a plist created by passing -\"#+ATTR_ODT: \" option of the object in question to -`org-odt-parse-block-attributes'. - -Use `org-odt-object-counters' to generate an automatic -OBJECT-NAME and STYLE-NAME. If OBJECT-PROPS is non-nil, add a -new entry in `org-odt-automatic-styles'. Return (OBJECT-NAME -. STYLE-NAME)." - (cl-assert (stringp object-type)) - (let* ((object (intern object-type)) - (seqvar object) - (seqno (1+ (or (plist-get org-odt-object-counters seqvar) 0))) - (object-name (format "%s%d" object-type seqno)) style-name) - (setq org-odt-object-counters - (plist-put org-odt-object-counters seqvar seqno)) - (when object-props - (setq style-name (format "Org%s" object-name)) - (setq org-odt-automatic-styles - (plist-put org-odt-automatic-styles object - (append (list (list style-name object-props)) - (plist-get org-odt-automatic-styles object))))) - (cons object-name style-name))) - -;;;; Checkbox - -(defun org-odt--checkbox (item) - "Return check-box string associated to ITEM." - (let ((checkbox (org-element-property :checkbox item))) - (if (not checkbox) "" - (format "%s" - "OrgCode" (cl-case checkbox - (on "[✓] ") ; CHECK MARK - (off "[ ] ") - (trans "[-] ")))))) - -;;; Template - -(defun org-odt--build-date-styles (fmt style) - ;; In LibreOffice 3.4.6, there doesn't seem to be a convenient way - ;; to modify the date fields. A date could be modified by - ;; offsetting in days. That's about it. Also, date and time may - ;; have to be emitted as two fields - a date field and a time field - ;; - separately. - - ;; One can add Form Controls to date and time fields so that they - ;; can be easily modified. But then, the exported document will - ;; become tightly coupled with LibreOffice and may not function - ;; properly with other OpenDocument applications. - - ;; I have a strange feeling that Date styles are a bit flaky at the - ;; moment. - - ;; The feature is experimental. - (when (and fmt style) - (let* ((fmt-alist - '(("%A" . "") - ("%B" . "") - ("%H" . "") - ("%M" . "") - ("%S" . "") - ("%V" . "") - ("%Y" . "") - ("%a" . "") - ("%b" . "") - ("%d" . "") - ("%e" . "") - ("%h" . "") - ("%k" . "") - ("%m" . "") - ("%p" . "") - ("%y" . ""))) - (case-fold-search nil) - (re (mapconcat 'identity (mapcar 'car fmt-alist) "\\|")) - match rpl (start 0) (filler-beg 0) filler-end filler output) - (dolist (pair - '(("\\(?:%[[:digit:]]*N\\)" . "") ; strip ns, us and ns - ("%C" . "Y") ; replace century with year - ("%D" . "%m/%d/%y") - ("%G" . "Y") ; year corresponding to iso week - ("%I" . "%H") ; hour on a 12-hour clock - ("%R" . "%H:%M") - ("%T" . "%H:%M:%S") - ("%U\\|%W" . "%V") ; week no. starting on Sun./Mon. - ("%Z" . "") ; time zone name - ("%c" . "%Y-%M-%d %a %H:%M" ) ; locale's date and time format - ("%g" . "%y") - ("%X" . "%x" ) ; locale's pref. time format - ("%j" . "") ; day of the year - ("%l" . "%k") ; like %I blank-padded - ("%s" . "") ; no. of secs since 1970-01-01 00:00:00 +0000 - ("%n" . "") - ("%r" . "%I:%M:%S %p") - ("%t" . "") - ("%u\\|%w" . "") ; numeric day of week - Mon (1-7), Sun(0-6) - ("%x" . "%Y-%M-%d %a") ; locale's pref. time format - ("%z" . "") ; time zone in numeric form - )) - (setq fmt (replace-regexp-in-string (car pair) (cdr pair) fmt t t))) - (while (string-match re fmt start) - (setq match (match-string 0 fmt)) - (setq rpl (assoc-default match fmt-alist)) - (setq start (match-end 0)) - (setq filler-end (match-beginning 0)) - (setq filler (substring fmt (prog1 filler-beg - (setq filler-beg (match-end 0))) - filler-end)) - (setq filler (and (not (string= filler "")) - (format "%s" - (org-odt--encode-plain-text filler)))) - (setq output (concat output "\n" filler "\n" rpl))) - (setq filler (substring fmt filler-beg)) - (unless (string= filler "") - (setq output (concat output - (format "\n%s" - (org-odt--encode-plain-text filler))))) - (format "\n%s\n" - style - (concat " number:automatic-order=\"true\"" - " number:format-source=\"fixed\"") - output )))) - -(defun org-odt-template (contents info) - "Return complete document string after ODT conversion. -CONTENTS is the transcoded contents string. RAW-DATA is the -original parsed data. INFO is a plist holding export options." - ;; Write meta file. - (let ((title (org-export-data (plist-get info :title) info)) - (subtitle (org-export-data (plist-get info :subtitle) info)) - (author (let ((author (plist-get info :author))) - (if (not author) "" (org-export-data author info)))) - (keywords (or (plist-get info :keywords) "")) - (description (or (plist-get info :description) ""))) - (write-region - (concat - " - - \n" - (format "%s\n" author) - (format "%s\n" author) - ;; Date, if required. - (when (plist-get info :with-date) - ;; Check if DATE is specified as an Org-timestamp. If yes, - ;; include it as meta information. Otherwise, just use - ;; today's date. - (let* ((date (let ((date (plist-get info :date))) - (and (not (cdr date)) - (eq (org-element-type (car date)) 'timestamp) - (car date))))) - (let ((iso-date (org-odt--format-timestamp date nil 'iso-date))) - (concat - (format "%s\n" iso-date) - (format "%s\n" - iso-date))))) - (format "%s\n" - (plist-get info :creator)) - (format "%s\n" keywords) - (format "%s\n" description) - (format "%s\n" title) - (when (org-string-nw-p subtitle) - (format - "%s\n" - subtitle)) - "\n" - " \n" "") - nil (concat org-odt-zip-dir "meta.xml")) - ;; Add meta.xml in to manifest. - (org-odt-create-manifest-file-entry "text/xml" "meta.xml")) - - ;; Update styles file. - ;; Copy styles.xml. Also dump htmlfontify styles, if there is any. - ;; Write styles file. - (let* ((styles-file - (pcase (plist-get info :odt-styles-file) - (`nil (expand-file-name "OrgOdtStyles.xml" org-odt-styles-dir)) - ((and s (pred (string-match-p "\\`(.*)\\'"))) - (condition-case nil - (read s) - (error (user-error "Invalid styles file specification: %S" s)))) - (filename (org-strip-quotes filename))))) - (cond - ;; Non-availability of styles.xml is not a critical error. For - ;; now, throw an error. - ((null styles-file) (error "Missing styles file")) - ((listp styles-file) - (let ((archive (nth 0 styles-file)) - (members (nth 1 styles-file))) - (org-odt--zip-extract archive members org-odt-zip-dir) - (dolist (member members) - (when (org-file-image-p member) - (let* ((image-type (file-name-extension member)) - (media-type (format "image/%s" image-type))) - (org-odt-create-manifest-file-entry media-type member)))))) - ((file-exists-p styles-file) - (let ((styles-file-type (file-name-extension styles-file))) - (cond - ((string= styles-file-type "xml") - (copy-file styles-file (concat org-odt-zip-dir "styles.xml") t)) - ((member styles-file-type '("odt" "ott")) - (org-odt--zip-extract styles-file "styles.xml" org-odt-zip-dir))))) - (t - (error "Invalid specification of styles.xml file: %S" - (plist-get info :odt-styles-file)))) - - ;; create a manifest entry for styles.xml - (org-odt-create-manifest-file-entry "text/xml" "styles.xml") - ;; Ensure we have write permissions to this file. - (set-file-modes (concat org-odt-zip-dir "styles.xml") #o600) - - ;; FIXME: Who is opening an empty styles.xml before this point? - (with-current-buffer - (find-file-noselect (concat org-odt-zip-dir "styles.xml") t) - (revert-buffer t t) - - ;; Write custom styles for source blocks - ;; Save STYLES used for colorizing of source blocks. - ;; Update styles.xml with styles that were collected as part of - ;; `org-odt-hfy-face-to-css' callbacks. - (let ((styles (mapconcat (lambda (style) (format " %s\n" (cddr style))) - hfy-user-sheet-assoc ""))) - (when styles - (goto-char (point-min)) - (when (re-search-forward "" nil t) - (goto-char (match-beginning 0)) - (insert "\n\n" styles "\n")))) - - ;; Update styles.xml - take care of outline numbering - - ;; Don't make automatic backup of styles.xml file. This setting - ;; prevents the backed-up styles.xml file from being zipped in to - ;; odt file. This is more of a hackish fix. Better alternative - ;; would be to fix the zip command so that the output odt file - ;; includes only the needed files and excludes any auto-generated - ;; extra files like backups and auto-saves etc etc. Note that - ;; currently the zip command zips up the entire temp directory so - ;; that any auto-generated files created under the hood ends up in - ;; the resulting odt file. - (setq-local backup-inhibited t) - - ;; Outline numbering is retained only up to LEVEL. - ;; To disable outline numbering pass a LEVEL of 0. - - (goto-char (point-min)) - (let ((regex - "]*\\)text:level=\"\\([^\"]*\\)\"\\([^>]*\\)>") - (replacement - "")) - (while (re-search-forward regex nil t) - (unless (let ((sec-num (plist-get info :section-numbers)) - (level (string-to-number (match-string 2)))) - (if (wholenump sec-num) (<= level sec-num) sec-num)) - (replace-match replacement t nil)))) - (save-buffer 0))) - ;; Update content.xml. - - (let* ( ;; `org-display-custom-times' should be accessed right - ;; within the context of the Org buffer. So obtain its - ;; value before moving on to temp-buffer context down below. - (custom-time-fmts - (if org-display-custom-times - (cons (substring (car org-time-stamp-custom-formats) 1 -1) - (substring (cdr org-time-stamp-custom-formats) 1 -1)) - '("%Y-%M-%d %a" . "%Y-%M-%d %a %H:%M")))) - (with-temp-buffer - (insert-file-contents - (or (plist-get info :odt-content-template-file) - (expand-file-name "OrgOdtContentTemplate.xml" - org-odt-styles-dir))) - ;; Write automatic styles. - ;; - Position the cursor. - (goto-char (point-min)) - (re-search-forward " " nil t) - (goto-char (match-beginning 0)) - ;; - Dump automatic table styles. - (cl-loop for (style-name props) in - (plist-get org-odt-automatic-styles 'Table) do - (when (setq props (or (plist-get props :rel-width) "96")) - (insert (format org-odt-table-style-format style-name props)))) - ;; - Dump date-styles. - (when (plist-get info :odt-use-date-fields) - (insert (org-odt--build-date-styles (car custom-time-fmts) - "OrgDate1") - (org-odt--build-date-styles (cdr custom-time-fmts) - "OrgDate2"))) - ;; Update display level. - ;; - Remove existing sequence decls. Also position the cursor. - (goto-char (point-min)) - (when (re-search-forward "" nil nil))) - ;; Update sequence decls according to user preference. - (insert - (format - "\n\n%s\n" - (mapconcat - (lambda (x) - (format - "" - (plist-get info :odt-display-outline-level) - (nth 1 x))) - org-odt-category-map-alist "\n"))) - ;; Position the cursor to document body. - (goto-char (point-min)) - (re-search-forward "" nil nil) - (goto-char (match-beginning 0)) - - ;; Preamble - Title, Author, Date etc. - (insert - (let* ((title (and (plist-get info :with-title) - (org-export-data (plist-get info :title) info))) - (subtitle (when title - (org-export-data (plist-get info :subtitle) info))) - (author (and (plist-get info :with-author) - (let ((auth (plist-get info :author))) - (and auth (org-export-data auth info))))) - (email (plist-get info :email)) - ;; Switch on or off above vars based on user settings - (author (and (plist-get info :with-author) (or author email))) - (email (and (plist-get info :with-email) email))) - (concat - ;; Title. - (when (org-string-nw-p title) - (concat - (format "\n%s\n" - "OrgTitle" (format "\n%s" title)) - ;; Separator. - "\n\n" - ;; Subtitle. - (when (org-string-nw-p subtitle) - (concat - (format "\n%s\n\n" - (concat - "\n" - subtitle - "\n")) - ;; Separator. - "\n")))) - (cond - ((and author (not email)) - ;; Author only. - (concat - (format "\n%s" - "OrgSubtitle" - (format "%s" author)) - ;; Separator. - "\n")) - ((and author email) - ;; Author and E-mail. - (concat - (format - "\n%s" - "OrgSubtitle" - (format - "%s" - (concat "mailto:" email) - (format "%s" author))) - ;; Separator. - "\n"))) - ;; Date, if required. - (when (plist-get info :with-date) - (let* ((date (plist-get info :date)) - ;; Check if DATE is specified as a timestamp. - (timestamp (and (not (cdr date)) - (eq (org-element-type (car date)) 'timestamp) - (car date)))) - (when date - (concat - (format "\n%s" - "OrgSubtitle" - (if (and (plist-get info :odt-use-date-fields) timestamp) - (org-odt--format-timestamp (car date)) - (org-export-data date info))) - ;; Separator - ""))))))) - ;; Table of Contents - (let* ((with-toc (plist-get info :with-toc)) - (depth (and with-toc (if (wholenump with-toc) - with-toc - (plist-get info :headline-levels))))) - (when depth (insert (or (org-odt-toc depth info) "")))) - ;; Contents. - (insert contents) - ;; Return contents. - (buffer-substring-no-properties (point-min) (point-max))))) - - - -;;; Transcode Functions - -;;;; Bold - -(defun org-odt-bold (_bold contents _info) - "Transcode BOLD from Org to ODT. -CONTENTS is the text with bold markup. INFO is a plist holding -contextual information." - (format "%s" - "Bold" contents)) - - -;;;; Center Block - -(defun org-odt-center-block (_center-block contents _info) - "Transcode a CENTER-BLOCK element from Org to ODT. -CONTENTS holds the contents of the center block. INFO is a plist -holding contextual information." - contents) - - -;;;; Clock - -(defun org-odt-clock (clock contents info) - "Transcode a CLOCK element from Org to ODT. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (let ((timestamp (org-element-property :value clock)) - (duration (org-element-property :duration clock))) - (format "\n%s" - (if (eq (org-element-type (org-export-get-next-element clock info)) - 'clock) "OrgClock" "OrgClockLastLine") - (concat - (format "%s" - "OrgClockKeyword" org-clock-string) - (org-odt-timestamp timestamp contents info) - (and duration (format " (%s)" duration)))))) - - -;;;; Code - -(defun org-odt-code (code _contents _info) - "Transcode a CODE object from Org to ODT. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (format "%s" - "OrgCode" (org-odt--encode-plain-text - (org-element-property :value code)))) - - -;;;; Drawer - -(defun org-odt-drawer (drawer contents info) - "Transcode a DRAWER element from Org to ODT. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((name (org-element-property :drawer-name drawer)) - (output (funcall (plist-get info :odt-format-drawer-function) - name contents))) - output)) - - -;;;; Dynamic Block - -(defun org-odt-dynamic-block (_dynamic-block contents _info) - "Transcode a DYNAMIC-BLOCK element from Org to ODT. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information. See `org-export-data'." - contents) - - -;;;; Entity - -(defun org-odt-entity (entity _contents _info) - "Transcode an ENTITY object from Org to ODT. -CONTENTS are the definition itself. INFO is a plist holding -contextual information." - (org-element-property :utf-8 entity)) - - -;;;; Example Block - -(defun org-odt-example-block (example-block _contents info) - "Transcode a EXAMPLE-BLOCK element from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - (org-odt-format-code example-block info)) - - -;;;; Export Snippet - -(defun org-odt-export-snippet (export-snippet _contents _info) - "Transcode a EXPORT-SNIPPET object from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (eq (org-export-snippet-backend export-snippet) 'odt) - (org-element-property :value export-snippet))) - - -;;;; Export Block - -(defun org-odt-export-block (export-block _contents _info) - "Transcode a EXPORT-BLOCK element from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (string= (org-element-property :type export-block) "ODT") - (org-remove-indentation (org-element-property :value export-block)))) - - -;;;; Fixed Width - -(defun org-odt-fixed-width (fixed-width _contents info) - "Transcode a FIXED-WIDTH element from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - (org-odt-do-format-code (org-element-property :value fixed-width) info)) - - -;;;; Footnote Definition - -;; Footnote Definitions are ignored. - - -;;;; Footnote Reference - -(defun org-odt-footnote-reference (footnote-reference _contents info) - "Transcode a FOOTNOTE-REFERENCE element from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((--format-footnote-definition - (lambda (n def) - (setq n (format "%d" n)) - (let ((id (concat "fn" n)) - (note-class "footnote")) - (format - "%s" - id note-class - (concat - (format "%s" n) - (format "%s" def)))))) - (--format-footnote-reference - (lambda (n) - (setq n (format "%d" n)) - (let ((note-class "footnote") - (ref-format "text") - (ref-name (concat "fn" n))) - (format - "%s" - "OrgSuperscript" - (format "%s" - note-class ref-format ref-name n)))))) - (concat - ;; Insert separator between two footnotes in a row. - (let ((prev (org-export-get-previous-element footnote-reference info))) - (and (eq (org-element-type prev) 'footnote-reference) - (format "%s" - "OrgSuperscript" ","))) - ;; Transcode footnote reference. - (let ((n (org-export-get-footnote-number footnote-reference info nil t))) - (cond - ((not - (org-export-footnote-first-reference-p footnote-reference info nil t)) - (funcall --format-footnote-reference n)) - (t - (let* ((raw (org-export-get-footnote-definition - footnote-reference info)) - (def - (let ((def (org-trim - (org-export-data-with-backend - raw - (org-export-create-backend - :parent 'odt - :transcoders - '((paragraph . (lambda (p c i) - (org-odt--format-paragraph - p c i - "Footnote" - "OrgFootnoteCenter" - "OrgFootnoteQuotations"))))) - info)))) - ;; Inline definitions are secondary strings. We - ;; need to wrap them within a paragraph. - (if (eq (org-element-class (car (org-element-contents raw))) - 'element) - def - (format - "\n%s" - def))))) - (funcall --format-footnote-definition n def)))))))) - - -;;;; Headline - -(defun org-odt-format-headline--wrap (headline backend info - &optional format-function - &rest extra-keys) - "Transcode a HEADLINE element using BACKEND. -INFO is a plist holding contextual information." - (setq backend (or backend (plist-get info :back-end))) - (let* ((level (+ (org-export-get-relative-level headline info))) - (headline-number (org-export-get-headline-number headline info)) - (section-number (and (org-export-numbered-headline-p headline info) - (mapconcat 'number-to-string - headline-number "."))) - (todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword headline))) - (and todo - (org-export-data-with-backend todo backend info))))) - (todo-type (and todo (org-element-property :todo-type headline))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority headline))) - (text (org-export-data-with-backend - (org-element-property :title headline) backend info)) - (tags (and (plist-get info :with-tags) - (org-export-get-tags headline info))) - (headline-label (org-export-get-reference headline info)) - (format-function - (if (functionp format-function) format-function - (cl-function - (lambda (todo todo-type priority text tags - &key _level _section-number _headline-label - &allow-other-keys) - (funcall (plist-get info :odt-format-headline-function) - todo todo-type priority text tags)))))) - (apply format-function - todo todo-type priority text tags - :headline-label headline-label - :level level - :section-number section-number extra-keys))) - -(defun org-odt-headline (headline contents info) - "Transcode a HEADLINE element from Org to ODT. -CONTENTS holds the contents of the headline. INFO is a plist -holding contextual information." - ;; Case 1: This is a footnote section: ignore it. - (unless (org-element-property :footnote-section-p headline) - (let* ((full-text (org-odt-format-headline--wrap headline nil info)) - ;; Get level relative to current parsed data. - (level (org-export-get-relative-level headline info)) - (numbered (org-export-numbered-headline-p headline info)) - ;; Get canonical label for the headline. - (id (org-export-get-reference headline info)) - ;; Extra targets. - (extra-targets - (let ((id (org-element-property :ID headline))) - (if id (org-odt--target "" (concat "ID-" id)) ""))) - ;; Title. - (anchored-title (org-odt--target full-text id))) - (cond - ;; Case 2. This is a deep sub-tree: export it as a list item. - ;; Also export as items headlines for which no section - ;; format has been found. - ((org-export-low-level-p headline info) - ;; Build the real contents of the sub-tree. - (concat - (and (org-export-first-sibling-p headline info) - (format "\n" - ;; Choose style based on list type. - (if numbered "OrgNumberedList" "OrgBulletedList") - ;; If top-level list, re-start numbering. Otherwise, - ;; continue numbering. - (format "text:continue-numbering=\"%s\"" - (let* ((parent (org-export-get-parent-headline - headline))) - (if (and parent - (org-export-low-level-p parent info)) - "true" "false"))))) - (let ((headline-has-table-p - (let ((section (assq 'section (org-element-contents headline)))) - (assq 'table (and section (org-element-contents section)))))) - (format "\n\n%s\n%s" - (concat - (format "\n%s" - "Text_20_body" - (concat extra-targets anchored-title)) - contents) - (if headline-has-table-p - "" - ""))) - (and (org-export-last-sibling-p headline info) - ""))) - ;; Case 3. Standard headline. Export it as a section. - (t - (concat - (format - "\n%s" - (format "Heading_20_%s%s" - level (if numbered "" "_unnumbered")) - level - (if numbered "false" "true") - (concat extra-targets anchored-title)) - contents)))))) - -(defun org-odt-format-headline-default-function - (todo todo-type priority text tags) - "Default format function for a headline. -See `org-odt-format-headline-function' for details." - (concat - ;; Todo. - (when todo - (let ((style (if (eq todo-type 'done) "OrgDone" "OrgTodo"))) - (format "%s " style todo))) - (when priority - (let* ((style (format "OrgPriority-%c" priority)) - (priority (format "[#%c]" priority))) - (format "%s " - style priority))) - ;; Title. - text - ;; Tags. - (when tags - (concat - "" - (format "[%s]" - "OrgTags" (mapconcat - (lambda (tag) - (format - "%s" - "OrgTag" tag)) tags " : ")))))) - - -;;;; Horizontal Rule - -(defun org-odt-horizontal-rule (_horizontal-rule _contents _info) - "Transcode an HORIZONTAL-RULE object from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - (format "\n%s" - "Horizontal_20_Line" "")) - - -;;;; Inline Babel Call - -;; Inline Babel Calls are ignored. - - -;;;; Inline Src Block - -(defun org-odt--find-verb-separator (s) - "Return a character not used in string S. -This is used to choose a separator for constructs like \\verb." - (let ((ll "~,./?;':\"|!@#%^&-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ<>()[]{}")) - (cl-loop for c across ll - when (not (string-match (regexp-quote (char-to-string c)) s)) - return (char-to-string c)))) - -(defun org-odt-inline-src-block (_inline-src-block _contents _info) - "Transcode an INLINE-SRC-BLOCK element from Org to ODT. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (error "FIXME")) - - -;;;; Inlinetask - -(defun org-odt-inlinetask (inlinetask contents info) - "Transcode an INLINETASK element from Org to ODT. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((todo - (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword inlinetask))) - (and todo (org-export-data todo info))))) - (todo-type (and todo (org-element-property :todo-type inlinetask))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority inlinetask))) - (text (org-export-data (org-element-property :title inlinetask) info)) - (tags (and (plist-get info :with-tags) - (org-export-get-tags inlinetask info)))) - (funcall (plist-get info :odt-format-inlinetask-function) - todo todo-type priority text tags contents))) - -(defun org-odt-format-inlinetask-default-function - (todo todo-type priority name tags contents) - "Default format function for inlinetasks. -See `org-odt-format-inlinetask-function' for details." - (format "\n%s" - "Text_20_body" - (org-odt--textbox - (concat - (format "\n%s" - "OrgInlineTaskHeading" - (org-odt-format-headline-default-function - todo todo-type priority name tags)) - contents) - nil nil "OrgInlineTaskFrame" " style:rel-width=\"100%\""))) - -;;;; Italic - -(defun org-odt-italic (_italic contents _info) - "Transcode ITALIC from Org to ODT. -CONTENTS is the text with italic markup. INFO is a plist holding -contextual information." - (format "%s" - "Emphasis" contents)) - - -;;;; Item - -(defun org-odt-item (item contents info) - "Transcode an ITEM element from Org to ODT. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (let* ((plain-list (org-export-get-parent item)) - (count (org-element-property :counter item)) - (type (org-element-property :type plain-list))) - (unless (memq type '(ordered unordered descriptive-1 descriptive-2)) - (error "Unknown list type: %S" type)) - (format "\n\n%s\n%s" - (if count (format " text:start-value=\"%s\"" count) "") - contents - (if (org-element-map item 'table #'identity info 'first-match) - "" - "")))) - -;;;; Keyword - -(defun org-odt-keyword (keyword _contents info) - "Transcode a KEYWORD element from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let ((key (org-element-property :key keyword)) - (value (org-element-property :value keyword))) - (cond - ((string= key "ODT") value) - ((string= key "INDEX") - ;; FIXME - (ignore)) - ((string= key "TOC") - (let ((case-fold-search t)) - (cond - ((string-match-p "\\" value) - (let ((depth (or (and (string-match "\\<[0-9]+\\>" value) - (string-to-number (match-string 0 value))) - (plist-get info :headline-levels))) - (scope - (cond - ((string-match ":target +\\(\".+?\"\\|\\S-+\\)" value) ;link - (org-export-resolve-link - (org-strip-quotes (match-string 1 value)) info)) - ((string-match-p "\\" value) keyword)))) ;local - (org-odt-toc depth info scope))) - ((string-match-p "tables\\|figures\\|listings" value) - ;; FIXME - (ignore)))))))) - - -;;;; Latex Environment - - -;; (eval-after-load 'ox-odt '(ad-deactivate 'org-format-latex-as-mathml)) -;; (defadvice org-format-latex-as-mathml ; FIXME -;; (after org-odt-protect-latex-fragment activate) -;; "Encode LaTeX fragment as XML. -;; Do this when translation to MathML fails." -;; (unless (> (length ad-return-value) 0) -;; (setq ad-return-value (org-odt--encode-plain-text (ad-get-arg 0))))) - -(defun org-odt-latex-environment (latex-environment _contents info) - "Transcode a LATEX-ENVIRONMENT element from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - (let* ((latex-frag (org-remove-indentation - (org-element-property :value latex-environment)))) - (org-odt-do-format-code latex-frag info))) - - -;;;; Latex Fragment - -;; (when latex-frag ; FIXME -;; (setq href (propertize href :title "LaTeX Fragment" -;; :description latex-frag))) -;; handle verbatim -;; provide descriptions - -(defun org-odt-latex-fragment (latex-fragment _contents _info) - "Transcode a LATEX-FRAGMENT object from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((latex-frag (org-element-property :value latex-fragment))) - (format "%s" - "OrgCode" (org-odt--encode-plain-text latex-frag t)))) - - -;;;; Line Break - -(defun org-odt-line-break (_line-break _contents _info) - "Transcode a LINE-BREAK object from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - "") - - -;;;; Link - -;;;; Links :: Label references - -(defun org-odt--enumerate (element info &optional predicate n) - (when predicate (cl-assert (funcall predicate element info))) - (let* ((--numbered-parent-headline-at-<=-n - (lambda (element n info) - (cl-loop for x in (org-element-lineage element) - thereis (and (eq (org-element-type x) 'headline) - (<= (org-export-get-relative-level x info) n) - (org-export-numbered-headline-p x info) - x)))) - (--enumerate - (lambda (element scope info &optional predicate) - (let ((counter 0)) - (org-element-map (or scope (plist-get info :parse-tree)) - (org-element-type element) - (lambda (el) - (and (or (not predicate) (funcall predicate el info)) - (cl-incf counter) - (eq element el) - counter)) - info 'first-match)))) - (scope (funcall --numbered-parent-headline-at-<=-n - element - (or n (plist-get info :odt-display-outline-level)) - info)) - (ordinal (funcall --enumerate element scope info predicate)) - (tag - (concat - ;; Section number. - (and scope - (mapconcat 'number-to-string - (org-export-get-headline-number scope info) ".")) - ;; Separator. - (and scope ".") - ;; Ordinal. - (number-to-string ordinal)))) - tag)) - -(defun org-odt-format-label (element info op) - "Return a label for ELEMENT. - -ELEMENT is a `link', `table', `src-block' or `paragraph' type -element. INFO is a plist used as a communication channel. OP is -either `definition' or `reference', depending on the purpose of -the generated string. - -Return value is a string if OP is set to `reference' or a cons -cell like CAPTION . SHORT-CAPTION) where CAPTION and -SHORT-CAPTION are strings." - (cl-assert (memq (org-element-type element) '(link table src-block paragraph))) - (let* ((element-or-parent - (cl-case (org-element-type element) - (link (org-export-get-parent-element element)) - (t element))) - ;; Get label and caption. - (label (and (or (org-element-property :name element) - (org-element-property :name element-or-parent)) - (org-export-get-reference element-or-parent info))) - (caption (let ((c (org-export-get-caption element-or-parent))) - (and c (org-export-data c info)))) - ;; FIXME: We don't use short-caption for now - (short-caption nil)) - (when (or label caption) - (let* ((default-category - (cl-case (org-element-type element) - (table "__Table__") - (src-block "__Listing__") - ((link paragraph) - (cond - ((org-odt--enumerable-latex-image-p element info) - "__DvipngImage__") - ((org-odt--enumerable-image-p element info) - "__Figure__") - ((org-odt--enumerable-formula-p element info) - "__MathFormula__") - (t (error "Don't know how to format label for link: %S" - element)))) - (t (error "Don't know how to format label for element type: %s" - (org-element-type element))))) - seqno) - (cl-assert default-category) - (pcase-let - ((`(,counter ,label-style ,category ,predicate) - (assoc-default default-category org-odt-category-map-alist))) - ;; Compute sequence number of the element. - (setq seqno (org-odt--enumerate element info predicate)) - ;; Localize category string. - (setq category (org-export-translate category :utf-8 info)) - (cl-case op - ;; Case 1: Handle Label definition. - (definition - (cons - (concat - ;; Sneak in a bookmark. The bookmark is used when the - ;; labeled element is referenced with a link that - ;; provides its own description. - (format "\n" label) - ;; Label definition: Typically formatted as below: - ;; CATEGORY SEQ-NO: LONG CAPTION - ;; with translation for correct punctuation. - (format-spec - (org-export-translate - (cadr (assoc-string label-style org-odt-label-styles t)) - :utf-8 info) - `((?e . ,category) - (?n . ,(format - "%s" - label counter counter seqno)) - (?c . ,(or caption ""))))) - short-caption)) - ;; Case 2: Handle Label reference. - (reference - (let* ((fmt (cddr (assoc-string label-style org-odt-label-styles t))) - (fmt1 (car fmt)) - (fmt2 (cadr fmt))) - (format "%s" - fmt1 - label - (format-spec fmt2 `((?e . ,category) (?n . ,seqno)))))) - (t (error "Unknown %S on label" op)))))))) - - -;;;; Links :: Inline Images - -(defun org-odt--copy-image-file (path) - "Return the internal name of the file" - (let* ((image-type (file-name-extension path)) - (media-type (format "image/%s" image-type)) - (target-dir "Images/") - (target-file - (format "%s%04d.%s" target-dir - (cl-incf org-odt-embedded-images-count) image-type))) - (message "Embedding %s as %s..." - (substring-no-properties path) target-file) - - (when (= 1 org-odt-embedded-images-count) - (make-directory (concat org-odt-zip-dir target-dir)) - (org-odt-create-manifest-file-entry "" target-dir)) - - (copy-file path (concat org-odt-zip-dir target-file) 'overwrite) - (org-odt-create-manifest-file-entry media-type target-file) - target-file)) - -;; For --without-x builds. -(declare-function clear-image-cache "image.c" (&optional filter)) -(declare-function image-size "image.c" (spec &optional pixels frame)) - -(defun org-odt--image-size - (file info &optional user-width user-height scale dpi embed-as) - (let* ((--pixels-to-cms - (function (lambda (pixels dpi) - (let ((cms-per-inch 2.54) - (inches (/ pixels dpi))) - (* cms-per-inch inches))))) - (--size-in-cms - (function - (lambda (size-in-pixels dpi) - (and size-in-pixels - (cons (funcall --pixels-to-cms (car size-in-pixels) dpi) - (funcall --pixels-to-cms (cdr size-in-pixels) dpi)))))) - (dpi (or dpi (plist-get info :odt-pixels-per-inch))) - (anchor-type (or embed-as "paragraph")) - (user-width (and (not scale) user-width)) - (user-height (and (not scale) user-height)) - (size - (and - (not (and user-height user-width)) - (or - ;; Use Imagemagick. - (and (executable-find "identify") - (let ((size-in-pixels - (let ((dim (shell-command-to-string - (format "identify -format \"%%w:%%h\" \"%s\"" - file)))) - (when (string-match "\\([0-9]+\\):\\([0-9]+\\)" dim) - (cons (string-to-number (match-string 1 dim)) - (string-to-number (match-string 2 dim))))))) - (funcall --size-in-cms size-in-pixels dpi))) - ;; Use Emacs. - (let ((size-in-pixels - (ignore-errors ; Emacs could be in batch mode - (clear-image-cache) - (image-size (create-image file) 'pixels)))) - (funcall --size-in-cms size-in-pixels dpi)) - ;; Use hard-coded values. - (cdr (assoc-string anchor-type - org-odt-default-image-sizes-alist)) - ;; Error out. - (error "Cannot determine image size, aborting")))) - (width (car size)) (height (cdr size))) - (cond - (scale - (setq width (* width scale) height (* height scale))) - ((and user-height user-width) - (setq width user-width height user-height)) - (user-height - (setq width (* user-height (/ width height)) height user-height)) - (user-width - (setq height (* user-width (/ height width)) width user-width)) - (t (ignore))) - ;; ensure that an embedded image fits comfortably within a page - (let ((max-width (car org-odt-max-image-size)) - (max-height (cdr org-odt-max-image-size))) - (when (or (> width max-width) (> height max-height)) - (let* ((scale1 (/ max-width width)) - (scale2 (/ max-height height)) - (scale (min scale1 scale2))) - (setq width (* scale width) height (* scale height))))) - (cons width height))) - -(defun org-odt-link--inline-image (element info) - "Return ODT code for an inline image. -LINK is the link pointing to the inline image. INFO is a plist -used as a communication channel." - (cl-assert (eq (org-element-type element) 'link)) - (let* ((src (let* ((type (org-element-property :type element)) - (raw-path (org-element-property :path element))) - (cond ((member type '("http" "https")) - (concat type ":" raw-path)) - ((file-name-absolute-p raw-path) - (expand-file-name raw-path)) - (t raw-path)))) - (src-expanded (if (file-name-absolute-p src) src - (expand-file-name src (file-name-directory - (plist-get info :input-file))))) - (href (format - "\n" - (org-odt--copy-image-file src-expanded))) - ;; Extract attributes from #+ATTR_ODT line. - (attr-from (cl-case (org-element-type element) - (link (org-export-get-parent-element element)) - (t element))) - ;; Convert attributes to a plist. - (attr-plist (org-export-read-attribute :attr_odt attr-from)) - ;; Handle `:anchor', `:style' and `:attributes' properties. - (user-frame-anchor - (car (assoc-string (plist-get attr-plist :anchor) - '(("as-char") ("paragraph") ("page")) t))) - (user-frame-style - (and user-frame-anchor (plist-get attr-plist :style))) - (user-frame-attrs - (and user-frame-anchor (plist-get attr-plist :attributes))) - (user-frame-params - (list user-frame-style user-frame-attrs user-frame-anchor)) - ;; (embed-as (or embed-as user-frame-anchor "paragraph")) - ;; - ;; Handle `:width', `:height' and `:scale' properties. Read - ;; them as numbers since we need them for computations. - (size (org-odt--image-size - src-expanded info - (let ((width (plist-get attr-plist :width))) - (and width (read width))) - (let ((length (plist-get attr-plist :length))) - (and length (read length))) - (let ((scale (plist-get attr-plist :scale))) - (and scale (read scale))) - nil ; embed-as - "paragraph" ; FIXME - )) - (width (car size)) (height (cdr size)) - (standalone-link-p (org-odt--standalone-link-p element info)) - (embed-as (if standalone-link-p "paragraph" "as-char")) - (captions (org-odt-format-label element info 'definition)) - (caption (car captions)) - (entity (concat (and caption "Captioned") embed-as "Image")) - ;; Check if this link was created by LaTeX-to-PNG converter. - (replaces (org-element-property - :replaces (if (not standalone-link-p) element - (org-export-get-parent-element element)))) - ;; If yes, note down the type of the element - LaTeX Fragment - ;; or LaTeX environment. It will go in to frame title. - (title (and replaces (capitalize - (symbol-name (org-element-type replaces))))) - - ;; If yes, note down its contents. It will go in to frame - ;; description. This quite useful for debugging. - (desc (and replaces (org-element-property :value replaces)))) - (org-odt--render-image/formula entity href width height - captions user-frame-params title desc))) - - -;;;; Links :: Math formula - -(defun org-odt-link--inline-formula (element info) - (let* ((src (let ((raw-path (org-element-property :path element))) - (cond - ((file-name-absolute-p raw-path) - (expand-file-name raw-path)) - (t raw-path)))) - (src-expanded (if (file-name-absolute-p src) src - (expand-file-name src (file-name-directory - (plist-get info :input-file))))) - (href - (format - "\n" - " xlink:show=\"embed\" xlink:actuate=\"onLoad\"" - (file-name-directory (org-odt--copy-formula-file src-expanded)))) - (standalone-link-p (org-odt--standalone-link-p element info)) - (embed-as (if standalone-link-p 'paragraph 'character)) - (captions (org-odt-format-label element info 'definition)) - ;; Check if this link was created by LaTeX-to-MathML - ;; converter. - (replaces (org-element-property - :replaces (if (not standalone-link-p) element - (org-export-get-parent-element element)))) - ;; If yes, note down the type of the element - LaTeX Fragment - ;; or LaTeX environment. It will go in to frame title. - (title (and replaces (capitalize - (symbol-name (org-element-type replaces))))) - - ;; If yes, note down its contents. It will go in to frame - ;; description. This quite useful for debugging. - (desc (and replaces (org-element-property :value replaces))) - width height) - (cond - ((eq embed-as 'character) - (org-odt--render-image/formula "InlineFormula" href width height - nil nil title desc)) - (t - (let* ((equation (org-odt--render-image/formula - "CaptionedDisplayFormula" href width height - captions nil title desc)) - (label - (let* ((org-odt-category-map-alist - '(("__MathFormula__" "Text" "math-label" "Equation" - org-odt--enumerable-formula-p)))) - (car (org-odt-format-label element info 'definition))))) - (concat equation "" label)))))) - -(defun org-odt--copy-formula-file (src-file) - "Return the internal name of the file" - (let* ((target-dir (format "Formula-%04d/" - (cl-incf org-odt-embedded-formulas-count))) - (target-file (concat target-dir "content.xml"))) - ;; Create a directory for holding formula file. Also enter it in - ;; to manifest. - (make-directory (concat org-odt-zip-dir target-dir)) - (org-odt-create-manifest-file-entry - "application/vnd.oasis.opendocument.formula" target-dir "1.2") - ;; Copy over the formula file from user directory to zip - ;; directory. - (message "Embedding %s as %s..." src-file target-file) - (let ((ext (file-name-extension src-file))) - (cond - ;; Case 1: Mathml. - ((member ext '("mathml" "mml")) - (copy-file src-file (concat org-odt-zip-dir target-file) 'overwrite)) - ;; Case 2: OpenDocument formula. - ((string= ext "odf") - (org-odt--zip-extract src-file "content.xml" - (concat org-odt-zip-dir target-dir))) - (t (error "%s is not a formula file" src-file)))) - ;; Enter the formula file in to manifest. - (org-odt-create-manifest-file-entry "text/xml" target-file) - target-file)) - -;;;; Targets - -(defun org-odt--render-image/formula (cfg-key href width height &optional - captions user-frame-params - &rest title-and-desc) - (let* ((frame-cfg-alist - ;; Each element of this alist is of the form (CFG-HANDLE - ;; INNER-FRAME-PARAMS OUTER-FRAME-PARAMS). - - ;; CFG-HANDLE is the key to the alist. - - ;; INNER-FRAME-PARAMS and OUTER-FRAME-PARAMS specify the - ;; frame params for INNER-FRAME and OUTER-FRAME - ;; respectively. See below. - - ;; Configurations that are meant to be applied to - ;; non-captioned image/formula specifies no - ;; OUTER-FRAME-PARAMS. - - ;; TERMINOLOGY - ;; =========== - ;; INNER-FRAME :: Frame that directly surrounds an - ;; image/formula. - - ;; OUTER-FRAME :: Frame that encloses the INNER-FRAME. This - ;; frame also contains the caption, if any. - - ;; FRAME-PARAMS :: List of the form (FRAME-STYLE-NAME - ;; FRAME-ATTRIBUTES FRAME-ANCHOR). Note - ;; that these are the last three arguments - ;; to `org-odt--frame'. - - ;; Note that an un-captioned image/formula requires just an - ;; INNER-FRAME, while a captioned image/formula requires - ;; both an INNER and an OUTER-FRAME. - '(("As-CharImage" ("OrgInlineImage" nil "as-char")) - ("ParagraphImage" ("OrgDisplayImage" nil "paragraph")) - ("PageImage" ("OrgPageImage" nil "page")) - ("CaptionedAs-CharImage" - ("OrgCaptionedImage" - " style:rel-width=\"100%\" style:rel-height=\"scale\"" "paragraph") - ("OrgInlineImage" nil "as-char")) - ("CaptionedParagraphImage" - ("OrgCaptionedImage" - " style:rel-width=\"100%\" style:rel-height=\"scale\"" "paragraph") - ("OrgImageCaptionFrame" nil "paragraph")) - ("CaptionedPageImage" - ("OrgCaptionedImage" - " style:rel-width=\"100%\" style:rel-height=\"scale\"" "paragraph") - ("OrgPageImageCaptionFrame" nil "page")) - ("InlineFormula" ("OrgInlineFormula" nil "as-char")) - ("DisplayFormula" ("OrgDisplayFormula" nil "as-char")) - ("CaptionedDisplayFormula" - ("OrgCaptionedFormula" nil "paragraph") - ("OrgFormulaCaptionFrame" nil "paragraph")))) - (caption (car captions)) (short-caption (cdr captions)) - ;; Retrieve inner and outer frame params, from configuration. - (frame-cfg (assoc-string cfg-key frame-cfg-alist t)) - (inner (nth 1 frame-cfg)) - (outer (nth 2 frame-cfg)) - ;; User-specified frame params (from #+ATTR_ODT spec) - (user user-frame-params) - (--merge-frame-params (function - (lambda (default user) - "Merge default and user frame params." - (if (not user) default - (cl-assert (= (length default) 3)) - (cl-assert (= (length user) 3)) - (cl-loop for u in user - for d in default - collect (or u d))))))) - (cond - ;; Case 1: Image/Formula has no caption. - ;; There is only one frame, one that surrounds the image - ;; or formula. - ((not caption) - ;; Merge user frame params with that from configuration. - (setq inner (funcall --merge-frame-params inner user)) - (apply 'org-odt--frame href width height - (append inner title-and-desc))) - ;; Case 2: Image/Formula is captioned or labeled. - ;; There are two frames: The inner one surrounds the - ;; image or formula. The outer one contains the - ;; caption/sequence number. - (t - ;; Merge user frame params with outer frame params. - (setq outer (funcall --merge-frame-params outer user)) - ;; Short caption, if specified, goes as part of inner frame. - (setq inner (let ((frame-params (copy-sequence inner))) - (setcar (cdr frame-params) - (concat - (cadr frame-params) - (when short-caption - (format " draw:name=\"%s\" " short-caption)))) - frame-params)) - (apply 'org-odt--textbox - (format "\n%s" - "Illustration" - (concat - (apply 'org-odt--frame href width height - (append inner title-and-desc)) - caption)) - width height outer))))) - -(defun org-odt--enumerable-p (element _info) - ;; Element should have a caption or label. - (or (org-element-property :caption element) - (org-element-property :name element))) - -(defun org-odt--enumerable-image-p (element info) - (org-odt--standalone-link-p - element info - ;; Paragraph should have a caption or label. It SHOULD NOT be a - ;; replacement element. (i.e., It SHOULD NOT be a result of LaTeX - ;; processing.) - (lambda (p) - (and (not (org-element-property :replaces p)) - (or (org-element-property :caption p) - (org-element-property :name p)))) - ;; Link should point to an image file. - (lambda (l) - (cl-assert (eq (org-element-type l) 'link)) - (org-export-inline-image-p l (plist-get info :odt-inline-image-rules))))) - -(defun org-odt--enumerable-latex-image-p (element info) - (org-odt--standalone-link-p - element info - ;; Paragraph should have a caption or label. It SHOULD also be a - ;; replacement element. (i.e., It SHOULD be a result of LaTeX - ;; processing.) - (lambda (p) - (and (org-element-property :replaces p) - (or (org-element-property :caption p) - (org-element-property :name p)))) - ;; Link should point to an image file. - (lambda (l) - (cl-assert (eq (org-element-type l) 'link)) - (org-export-inline-image-p l (plist-get info :odt-inline-image-rules))))) - -(defun org-odt--enumerable-formula-p (element info) - (org-odt--standalone-link-p - element info - ;; Paragraph should have a caption or label. - (lambda (p) - (or (org-element-property :caption p) - (org-element-property :name p))) - ;; Link should point to a MathML or ODF file. - (lambda (l) - (cl-assert (eq (org-element-type l) 'link)) - (org-export-inline-image-p l (plist-get info :odt-inline-formula-rules))))) - -(defun org-odt--standalone-link-p (element _info &optional - paragraph-predicate - link-predicate) - "Test if ELEMENT is a standalone link for the purpose ODT export. -INFO is a plist holding contextual information. - -Return non-nil, if ELEMENT is of type paragraph satisfying -PARAGRAPH-PREDICATE and its sole content, save for whitespaces, -is a link that satisfies LINK-PREDICATE. - -Return non-nil, if ELEMENT is of type link satisfying -LINK-PREDICATE and its containing paragraph satisfies -PARAGRAPH-PREDICATE in addition to having no other content save for -leading and trailing whitespaces. - -Return nil, otherwise." - (let ((p (cl-case (org-element-type element) - (paragraph element) - (link (and (or (not link-predicate) - (funcall link-predicate element)) - (org-export-get-parent element))) - (t nil)))) - (when (and p (eq (org-element-type p) 'paragraph)) - (when (or (not paragraph-predicate) - (funcall paragraph-predicate p)) - (let ((contents (org-element-contents p))) - (cl-loop for x in contents - with inline-image-count = 0 - always (cl-case (org-element-type x) - (plain-text - (not (org-string-nw-p x))) - (link - (and (or (not link-predicate) - (funcall link-predicate x)) - (= (cl-incf inline-image-count) 1))) - (t nil)))))))) - -(defun org-odt-link--infer-description (destination info) - ;; DESTINATION is a headline or an element (like paragraph, - ;; verse-block etc) to which a "#+NAME: label" can be attached. - - ;; Note that labels that are attached to captioned entities - inline - ;; images, math formulae and tables - get resolved as part of - ;; `org-odt-format-label' and `org-odt--enumerate'. - - ;; Create a cross-reference to DESTINATION but make best-efforts to - ;; create a *meaningful* description. Check item numbers, section - ;; number and section title in that order. - - ;; NOTE: Counterpart of `org-export-get-ordinal'. - ;; FIXME: Handle footnote-definition footnote-reference? - (let* ((genealogy (org-element-lineage destination)) - (data (reverse genealogy)) - (label (let ((type (org-element-type destination))) - (if (memq type '(headline target)) - (org-export-get-reference destination info) - (error "FIXME: Unable to resolve %S" destination))))) - (or - (let* ( ;; Locate top-level list. - (top-level-list - (cl-loop for x on data - when (eq (org-element-type (car x)) 'plain-list) - return x)) - ;; Get list item nos. - (item-numbers - (cl-loop for (plain-list item . rest) on top-level-list by #'cddr - until (not (eq (org-element-type plain-list) 'plain-list)) - collect (when (eq (org-element-property :type - plain-list) - 'ordered) - (1+ (length (org-export-get-previous-element - item info t)))))) - ;; Locate top-most listified headline. - (listified-headlines - (cl-loop for x on data - when (and (eq (org-element-type (car x)) 'headline) - (org-export-low-level-p (car x) info)) - return x)) - ;; Get listified headline numbers. - (listified-headline-nos - (cl-loop for el in listified-headlines - when (eq (org-element-type el) 'headline) - collect (when (org-export-numbered-headline-p el info) - (1+ (length (org-export-get-previous-element - el info t))))))) - ;; Combine item numbers from both the listified headlines and - ;; regular list items. - - ;; Case 1: Check if all the parents of list item are numbered. - ;; If yes, link to the item proper. - (let ((item-numbers (append listified-headline-nos item-numbers))) - (when (and item-numbers (not (memq nil item-numbers))) - (format "%s" - label - (mapconcat (lambda (n) (if (not n) " " - (concat (number-to-string n) "."))) - item-numbers ""))))) - ;; Case 2: Locate a regular and numbered headline in the - ;; hierarchy. Display its section number. - (let ((headline - (and - ;; Test if destination is a numbered headline. - (org-export-numbered-headline-p destination info) - (cl-loop for el in (cons destination genealogy) - when (and (eq (org-element-type el) 'headline) - (not (org-export-low-level-p el info)) - (org-export-numbered-headline-p el info)) - return el)))) - ;; We found one. - (when headline - (format "%s" - label - (mapconcat 'number-to-string (org-export-get-headline-number - headline info) ".")))) - ;; Case 4: Locate a regular headline in the hierarchy. Display - ;; its title. - (let ((headline (cl-loop for el in (cons destination genealogy) - when (and (eq (org-element-type el) 'headline) - (not (org-export-low-level-p el info))) - return el))) - ;; We found one. - (when headline - (format "%s" - label - (let ((title (org-element-property :title headline))) - (org-export-data title info))))) - (error "FIXME?")))) - -(defun org-odt-link (link desc info) - "Transcode a LINK object from Org to ODT. - -DESC is the description part of the link, or the empty string. -INFO is a plist holding contextual information. See -`org-export-data'." - (let* ((type (org-element-property :type link)) - (raw-path (org-element-property :path link)) - ;; Ensure DESC really exists, or set it to nil. - (desc (and (not (string= desc "")) desc)) - (imagep (org-export-inline-image-p - link (plist-get info :odt-inline-image-rules))) - (path (cond - ((member type '("http" "https" "ftp" "mailto")) - (concat type ":" raw-path)) - ((string= type "file") (org-export-file-uri raw-path)) - (t raw-path))) - ;; Convert & to & for correct XML representation - (path (replace-regexp-in-string "&" "&" path))) - (cond - ;; Link type is handled by a special function. - ((org-export-custom-protocol-maybe link desc 'odt)) - ;; Image file. - ((and (not desc) imagep) (org-odt-link--inline-image link info)) - ;; Formula file. - ((and (not desc) - (org-export-inline-image-p - link (plist-get info :odt-inline-formula-rules))) - (org-odt-link--inline-formula link info)) - ;; Radio target: Transcode target's contents and use them as - ;; link's description. - ((string= type "radio") - (let ((destination (org-export-resolve-radio-link link info))) - (if (not destination) desc - (format - "%s" - (org-export-get-reference destination info) - desc)))) - ;; Links pointing to a headline: Find destination and build - ;; appropriate referencing command. - ((member type '("custom-id" "fuzzy" "id")) - (let ((destination (if (string= type "fuzzy") - (org-export-resolve-fuzzy-link link info) - (org-export-resolve-id-link link info)))) - (cl-case (org-element-type destination) - ;; Fuzzy link points to a headline. If there's - ;; a description, create a hyperlink. Otherwise, try to - ;; provide a meaningful description. - (headline - (if (not desc) (org-odt-link--infer-description destination info) - (let ((label - (or (and (string= type "custom-id") - (org-element-property :CUSTOM_ID destination)) - (org-export-get-reference destination info)))) - (format - "%s" - label desc)))) - ;; Fuzzy link points to a target. If there's a description, - ;; create a hyperlink. Otherwise, try to provide - ;; a meaningful description. - (target - (format "%s" - (org-export-get-reference destination info) - (or desc (org-export-get-ordinal destination info)))) - ;; Fuzzy link points to some element (e.g., an inline image, - ;; a math formula or a table). - (otherwise - (let ((label-reference - (ignore-errors - (org-odt-format-label destination info 'reference)))) - (cond - ((not label-reference) - (org-odt-link--infer-description destination info)) - ;; LINK has no description. Create - ;; a cross-reference showing entity's sequence - ;; number. - ((not desc) label-reference) - ;; LINK has description. Insert a hyperlink with - ;; user-provided description. - (t - (format - "%s" - (org-export-get-reference destination info) - desc)))))))) - ;; Coderef: replace link with the reference name or the - ;; equivalent line number. - ((string= type "coderef") - (let* ((line-no (format "%d" (org-export-resolve-coderef path info))) - (href (concat "coderef-" path))) - (format - (org-export-get-coderef-format path desc) - (format - "%s" - href line-no)))) - ;; External link with a description part. - ((and path desc) - (let ((link-contents (org-element-contents link))) - ;; Check if description is a link to an inline image. - (if (and (not (cdr link-contents)) - (let ((desc-element (car link-contents))) - (and (eq (org-element-type desc-element) 'link) - (org-export-inline-image-p - desc-element - (plist-get info :odt-inline-image-rules))))) - ;; Format link as a clickable image. - (format "\n\n%s\n" - path desc) - ;; Otherwise, format it as a regular link. - (format "%s" - path desc)))) - ;; External link without a description part. - (path - (format "%s" - path path)) - ;; No path, only description. Try to do something useful. - (t (format "%s" - "Emphasis" desc))))) - - -;;;; Node Property - -(defun org-odt-node-property (node-property _contents _info) - "Transcode a NODE-PROPERTY element from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual -information." - (org-odt--encode-plain-text - (format "%s:%s" - (org-element-property :key node-property) - (let ((value (org-element-property :value node-property))) - (if value (concat " " value) ""))))) - -;;;; Paragraph - -(defun org-odt--paragraph-style (paragraph) - "Return style of PARAGRAPH. -Style is a symbol among `quoted', `centered' and nil." - (let ((up paragraph)) - (while (and (setq up (org-element-property :parent up)) - (not (memq (org-element-type up) - '(center-block quote-block section))))) - (cl-case (org-element-type up) - (center-block 'centered) - (quote-block 'quoted)))) - -(defun org-odt--format-paragraph (paragraph contents info default center quote) - "Format paragraph according to given styles. -PARAGRAPH is a paragraph type element. CONTENTS is the -transcoded contents of that paragraph, as a string. INFO is -a plist used as a communication channel. DEFAULT, CENTER and -QUOTE are, respectively, style to use when paragraph belongs to -no special environment, a center block, or a quote block." - (format "\n%s" - (cl-case (org-odt--paragraph-style paragraph) - (quoted quote) - (centered center) - (otherwise default)) - ;; If PARAGRAPH is a leading paragraph in an item that has - ;; a checkbox, splice checkbox and paragraph contents - ;; together. - (concat (let ((parent (org-element-property :parent paragraph))) - (and (eq (org-element-type parent) 'item) - (not (org-export-get-previous-element paragraph info)) - (org-odt--checkbox parent))) - contents))) - -(defun org-odt-paragraph (paragraph contents info) - "Transcode a PARAGRAPH element from Org to ODT. -CONTENTS is the contents of the paragraph, as a string. INFO is -the plist used as a communication channel." - (org-odt--format-paragraph - paragraph contents info - (or (org-element-property :style paragraph) "Text_20_body") - "OrgCenter" - "Quotations")) - - -;;;; Plain List - -(defun org-odt-plain-list (plain-list contents _info) - "Transcode a PLAIN-LIST element from Org to ODT. -CONTENTS is the contents of the list. INFO is a plist holding -contextual information." - (format "\n\n%s" - ;; Choose style based on list type. - (cl-case (org-element-property :type plain-list) - (ordered "OrgNumberedList") - (unordered "OrgBulletedList") - (descriptive-1 "OrgDescriptionList") - (descriptive-2 "OrgDescriptionList")) - ;; If top-level list, re-start numbering. Otherwise, - ;; continue numbering. - (format "text:continue-numbering=\"%s\"" - (let* ((parent (org-export-get-parent plain-list))) - (if (and parent (eq (org-element-type parent) 'item)) - "true" "false"))) - contents)) - -;;;; Plain Text - -(defun org-odt--encode-tabs-and-spaces (line) - (replace-regexp-in-string - "\\(\t\\| \\{2,\\}\\)" - (lambda (s) - (if (string= s "\t") "" - (format " " (1- (length s))))) - line)) - -(defun org-odt--encode-plain-text (text &optional no-whitespace-filling) - (dolist (pair '(("&" . "&") ("<" . "<") (">" . ">"))) - (setq text (replace-regexp-in-string (car pair) (cdr pair) text t t))) - (if no-whitespace-filling text - (org-odt--encode-tabs-and-spaces text))) - -(defun org-odt-plain-text (text info) - "Transcode a TEXT string from Org to ODT. -TEXT is the string to transcode. INFO is a plist holding -contextual information." - (let ((output text)) - ;; Protect &, < and >. - (setq output (org-odt--encode-plain-text output t)) - ;; Handle smart quotes. Be sure to provide original string since - ;; OUTPUT may have been modified. - (when (plist-get info :with-smart-quotes) - (setq output (org-export-activate-smart-quotes output :utf-8 info text))) - ;; Convert special strings. - (when (plist-get info :with-special-strings) - (dolist (pair org-odt-special-string-regexps) - (setq output - (replace-regexp-in-string (car pair) (cdr pair) output t nil)))) - ;; Handle break preservation if required. - (when (plist-get info :preserve-breaks) - (setq output (replace-regexp-in-string - "\\(\\\\\\\\\\)?[ \t]*\n" "" output t))) - ;; Return value. - output)) - - -;;;; Planning - -(defun org-odt-planning (planning contents info) - "Transcode a PLANNING element from Org to ODT. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (format "\n%s" - "OrgPlanning" - (concat - (let ((closed (org-element-property :closed planning))) - (when closed - (concat - (format "%s" - "OrgClosedKeyword" org-closed-string) - (org-odt-timestamp closed contents info)))) - (let ((deadline (org-element-property :deadline planning))) - (when deadline - (concat - (format "%s" - "OrgDeadlineKeyword" org-deadline-string) - (org-odt-timestamp deadline contents info)))) - (let ((scheduled (org-element-property :scheduled planning))) - (when scheduled - (concat - (format "%s" - "OrgScheduledKeyword" org-deadline-string) - (org-odt-timestamp scheduled contents info))))))) - - -;;;; Property Drawer - -(defun org-odt-property-drawer (_property-drawer contents _info) - "Transcode a PROPERTY-DRAWER element from Org to ODT. -CONTENTS holds the contents of the drawer. INFO is a plist -holding contextual information." - (and (org-string-nw-p contents) - (format "%s" - contents))) - - -;;;; Quote Block - -(defun org-odt-quote-block (_quote-block contents _info) - "Transcode a QUOTE-BLOCK element from Org to ODT. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - contents) - - -;;;; Section - -(defun org-odt-format-section (text style &optional name) - (let ((default-name (car (org-odt-add-automatic-style "Section")))) - (format "\n\n%s\n" - style - (format "text:name=\"%s\"" (or name default-name)) - text))) - - -(defun org-odt-section (_section contents _info) ; FIXME - "Transcode a SECTION element from Org to ODT. -CONTENTS holds the contents of the section. INFO is a plist -holding contextual information." - contents) - -;;;; Radio Target - -(defun org-odt-radio-target (radio-target text info) - "Transcode a RADIO-TARGET object from Org to ODT. -TEXT is the text of the target. INFO is a plist holding -contextual information." - (org-odt--target text (org-export-get-reference radio-target info))) - - -;;;; Special Block - -(defun org-odt-special-block (special-block contents info) - "Transcode a SPECIAL-BLOCK element from Org to ODT. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let ((type (org-element-property :type special-block)) - (attributes (org-export-read-attribute :attr_odt special-block))) - (cond - ;; Annotation. - ((string= type "annotation") - (let* ((author (or (plist-get attributes :author) - (let ((author (plist-get info :author))) - (and author (org-export-data author info))))) - (date (or (plist-get attributes :date) - ;; FIXME: Is `car' right thing to do below? - (car (plist-get info :date))))) - (format "\n%s" - (format "\n%s\n" - (concat - (and author - (format "%s" author)) - (and date - (format "%s" - (org-odt--format-timestamp date nil 'iso-date))) - contents))))) - ;; Textbox. - ((string= type "textbox") - (let ((width (plist-get attributes :width)) - (height (plist-get attributes :height)) - (style (plist-get attributes :style)) - (extra (plist-get attributes :extra)) - (anchor (plist-get attributes :anchor))) - (format "\n%s" - "Text_20_body" (org-odt--textbox contents width height - style extra anchor)))) - (t contents)))) - - -;;;; Src Block - -(defun org-odt-hfy-face-to-css (fn) - "Create custom style for face FN. -When FN is the default face, use its foreground and background -properties to create \"OrgSrcBlock\" paragraph style. Otherwise -use its color attribute to create a character style whose name -is obtained from FN. Currently all attributes of FN other than -color are ignored. - -The style name for a face FN is derived using the following -operations on the face name in that order - de-dash, CamelCase -and prefix with \"OrgSrc\". For example, -`font-lock-function-name-face' is associated with -\"OrgSrcFontLockFunctionNameFace\"." - (let* ((css-list (hfy-face-to-style fn)) - (style-name (concat "OrgSrc" - (mapconcat - 'capitalize (split-string - (hfy-face-or-def-to-name fn) "-") - ""))) - (color-val (cdr (assoc "color" css-list))) - (background-color-val (cdr (assoc "background" css-list))) - (style (and org-odt-create-custom-styles-for-srcblocks - (cond - ((eq fn 'default) - (format org-odt-src-block-paragraph-format - background-color-val color-val)) - (t - (format - " - - - " style-name color-val)))))) - (cons style-name style))) - -(defun org-odt-htmlfontify-string (line) - (let* ((hfy-html-quote-regex "\\([<\"&> \t]\\)") - (hfy-html-quote-map '(("\"" """) - ("<" "<") - ("&" "&") - (">" ">") - (" " "") - ("\t" ""))) - (hfy-face-to-css 'org-odt-hfy-face-to-css) - (hfy-optimizations-1 (copy-sequence hfy-optimizations)) - (hfy-optimizations (cl-pushnew 'body-text-only hfy-optimizations-1)) - (hfy-begin-span-handler - (lambda (style _text-block _text-id _text-begins-block-p) - (insert (format "" style)))) - (hfy-end-span-handler (lambda () (insert "")))) - (with-no-warnings (htmlfontify-string line)))) - -(defun org-odt-do-format-code - (code info &optional lang refs retain-labels num-start) - (let* ((lang (or (assoc-default lang org-src-lang-modes) lang)) - (lang-mode (and lang (intern (format "%s-mode" lang)))) - (code-lines (org-split-string code "\n")) - (code-length (length code-lines)) - (use-htmlfontify-p (and (functionp lang-mode) - (plist-get info :odt-fontify-srcblocks) - (require 'htmlfontify nil t) - (fboundp 'htmlfontify-string))) - (code (if (not use-htmlfontify-p) code - (with-temp-buffer - (insert code) - (funcall lang-mode) - (org-font-lock-ensure) - (buffer-string)))) - (fontifier (if use-htmlfontify-p 'org-odt-htmlfontify-string - 'org-odt--encode-plain-text)) - (par-style (if use-htmlfontify-p "OrgSrcBlock" - "OrgFixedWidthBlock")) - (i 0)) - (cl-assert (= code-length (length (org-split-string code "\n")))) - (setq code - (org-export-format-code - code - (lambda (loc line-num ref) - (setq par-style - (concat par-style (and (= (cl-incf i) code-length) - "LastLine"))) - - (setq loc (concat loc (and ref retain-labels (format " (%s)" ref)))) - (setq loc (funcall fontifier loc)) - (when ref - (setq loc (org-odt--target loc (concat "coderef-" ref)))) - (cl-assert par-style) - (setq loc (format "\n%s" - par-style loc)) - (if (not line-num) loc - (format "\n%s\n" loc))) - num-start refs)) - (cond - ((not num-start) code) - ((= num-start 0) - (format - "\n%s" - " text:continue-numbering=\"false\"" code)) - (t - (format - "\n%s" - " text:continue-numbering=\"true\"" code))))) - -(defun org-odt-format-code (element info) - (let* ((lang (org-element-property :language element)) - ;; Extract code and references. - (code-info (org-export-unravel-code element)) - (code (car code-info)) - (refs (cdr code-info)) - ;; Does the source block contain labels? - (retain-labels (org-element-property :retain-labels element)) - ;; Does it have line numbers? - (num-start (org-export-get-loc element info))) - (org-odt-do-format-code code info lang refs retain-labels num-start))) - -(defun org-odt-src-block (src-block _contents info) - "Transcode a SRC-BLOCK element from Org to ODT. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (let* ((attributes (org-export-read-attribute :attr_odt src-block)) - (caption (car (org-odt-format-label src-block info 'definition)))) - (concat - (and caption - (format "\n%s" - "Listing" caption)) - (let ((--src-block (org-odt-format-code src-block info))) - (if (not (plist-get attributes :textbox)) --src-block - (format "\n%s" - "Text_20_body" - (org-odt--textbox --src-block nil nil nil))))))) - - -;;;; Statistics Cookie - -(defun org-odt-statistics-cookie (statistics-cookie _contents _info) - "Transcode a STATISTICS-COOKIE object from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((cookie-value (org-element-property :value statistics-cookie))) - (format "%s" - "OrgCode" cookie-value))) - - -;;;; Strike-Through - -(defun org-odt-strike-through (_strike-through contents _info) - "Transcode STRIKE-THROUGH from Org to ODT. -CONTENTS is the text with strike-through markup. INFO is a plist -holding contextual information." - (format "%s" - "Strikethrough" contents)) - - -;;;; Subscript - -(defun org-odt-subscript (_subscript contents _info) - "Transcode a SUBSCRIPT object from Org to ODT. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "%s" - "OrgSubscript" contents)) - - -;;;; Superscript - -(defun org-odt-superscript (_superscript contents _info) - "Transcode a SUPERSCRIPT object from Org to ODT. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "%s" - "OrgSuperscript" contents)) - - -;;;; Table Cell - -(defun org-odt-table-style-spec (element info) - (let* ((table (org-export-get-parent-table element)) - (table-attributes (org-export-read-attribute :attr_odt table)) - (table-style (plist-get table-attributes :style))) - (assoc table-style (plist-get info :odt-table-styles)))) - -(defun org-odt-get-table-cell-styles (table-cell info) - "Retrieve styles applicable to a table cell. -R and C are (zero-based) row and column numbers of the table -cell. STYLE-SPEC is an entry in `org-odt-table-styles' -applicable to the current table. It is nil if the table is not -associated with any style attributes. - -Return a cons of (TABLE-CELL-STYLE-NAME . PARAGRAPH-STYLE-NAME). - -When STYLE-SPEC is nil, style the table cell the conventional way -- choose cell borders based on row and column groupings and -choose paragraph alignment based on `org-col-cookies' text -property. See also -`org-odt-get-paragraph-style-cookie-for-table-cell'. - -When STYLE-SPEC is non-nil, ignore the above cookie and return -styles congruent with the ODF-1.2 specification." - (let* ((table-cell-address (org-export-table-cell-address table-cell info)) - (r (car table-cell-address)) (c (cdr table-cell-address)) - (style-spec (org-odt-table-style-spec table-cell info)) - (table-dimensions (org-export-table-dimensions - (org-export-get-parent-table table-cell) - info))) - (when style-spec - ;; LibreOffice - particularly the Writer - honors neither table - ;; templates nor custom table-cell styles. Inorder to retain - ;; interoperability with LibreOffice, only automatic styles are - ;; used for styling of table-cells. The current implementation is - ;; congruent with ODF-1.2 specification and hence is - ;; future-compatible. - - ;; Additional Note: LibreOffice's AutoFormat facility for tables - - ;; which recognizes as many as 16 different cell types - is much - ;; richer. Unfortunately it is NOT amenable to easy configuration - ;; by hand. - (let* ((template-name (nth 1 style-spec)) - (cell-style-selectors (nth 2 style-spec)) - (cell-type - (cond - ((and (cdr (assq 'use-first-column-styles cell-style-selectors)) - (= c 0)) "FirstColumn") - ((and (cdr (assq 'use-last-column-styles cell-style-selectors)) - (= (1+ c) (cdr table-dimensions))) - "LastColumn") - ((and (cdr (assq 'use-first-row-styles cell-style-selectors)) - (= r 0)) "FirstRow") - ((and (cdr (assq 'use-last-row-styles cell-style-selectors)) - (= (1+ r) (car table-dimensions))) - "LastRow") - ((and (cdr (assq 'use-banding-rows-styles cell-style-selectors)) - (= (% r 2) 1)) "EvenRow") - ((and (cdr (assq 'use-banding-rows-styles cell-style-selectors)) - (= (% r 2) 0)) "OddRow") - ((and (cdr (assq 'use-banding-columns-styles cell-style-selectors)) - (= (% c 2) 1)) "EvenColumn") - ((and (cdr (assq 'use-banding-columns-styles cell-style-selectors)) - (= (% c 2) 0)) "OddColumn") - (t "")))) - (concat template-name cell-type))))) - -(defun org-odt-table-cell (table-cell contents info) - "Transcode a TABLE-CELL element from Org to ODT. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (let* ((table-cell-address (org-export-table-cell-address table-cell info)) - (r (car table-cell-address)) - (c (cdr table-cell-address)) - (horiz-span (or (org-export-table-cell-width table-cell info) 0)) - (table-row (org-export-get-parent table-cell)) - (custom-style-prefix (org-odt-get-table-cell-styles - table-cell info)) - (paragraph-style - (or - (and custom-style-prefix - (format "%sTableParagraph" custom-style-prefix)) - (concat - (cond - ((and (= 1 (org-export-table-row-group table-row info)) - (org-export-table-has-header-p - (org-export-get-parent-table table-row) info)) - "OrgTableHeading") - ((let* ((table (org-export-get-parent-table table-cell)) - (table-attrs (org-export-read-attribute :attr_odt table)) - (table-header-columns - (let ((cols (plist-get table-attrs :header-columns))) - (and cols (read cols))))) - (<= c (cond ((wholenump table-header-columns) - (- table-header-columns 1)) - (table-header-columns 0) - (t -1)))) - "OrgTableHeading") - (t "OrgTableContents")) - (capitalize (symbol-name (org-export-table-cell-alignment - table-cell info)))))) - (cell-style-name - (or - (and custom-style-prefix (format "%sTableCell" - custom-style-prefix)) - (concat - "OrgTblCell" - (when (or (org-export-table-row-starts-rowgroup-p table-row info) - (zerop r)) "T") - (when (org-export-table-row-ends-rowgroup-p table-row info) "B") - (when (and (org-export-table-cell-starts-colgroup-p table-cell info) - (not (zerop c)) ) "L")))) - (cell-attributes - (concat - (format " table:style-name=\"%s\"" cell-style-name) - (and (> horiz-span 0) - (format " table:number-columns-spanned=\"%d\"" - (1+ horiz-span)))))) - (unless contents (setq contents "")) - (concat - (cl-assert paragraph-style) - (format "\n\n%s\n" - cell-attributes - (let ((table-cell-contents (org-element-contents table-cell))) - (if (eq (org-element-class (car table-cell-contents)) 'element) - contents - (format "\n%s" - paragraph-style contents)))) - (let (s) - (dotimes (_ horiz-span s) - (setq s (concat s "\n")))) - "\n"))) - - -;;;; Table Row - -(defun org-odt-table-row (table-row contents info) - "Transcode a TABLE-ROW element from Org to ODT. -CONTENTS is the contents of the row. INFO is a plist used as a -communication channel." - ;; Rules are ignored since table separators are deduced from - ;; borders of the current row. - (when (eq (org-element-property :type table-row) 'standard) - (let* ((rowgroup-tags - (if (and (= 1 (org-export-table-row-group table-row info)) - (org-export-table-has-header-p - (org-export-get-parent-table table-row) info)) - ;; If the row belongs to the first rowgroup and the - ;; table has more than one row groups, then this row - ;; belongs to the header row group. - '("\n" . "\n") - ;; Otherwise, it belongs to non-header row group. - '("\n" . "\n")))) - (concat - ;; Does this row begin a rowgroup? - (when (org-export-table-row-starts-rowgroup-p table-row info) - (car rowgroup-tags)) - ;; Actual table row - (format "\n\n%s\n" contents) - ;; Does this row end a rowgroup? - (when (org-export-table-row-ends-rowgroup-p table-row info) - (cdr rowgroup-tags)))))) - - -;;;; Table - -(defun org-odt-table-first-row-data-cells (table info) - (let ((table-row - (org-element-map table 'table-row - (lambda (row) - (unless (eq (org-element-property :type row) 'rule) row)) - info 'first-match)) - (special-column-p (org-export-table-has-special-column-p table))) - (if (not special-column-p) (org-element-contents table-row) - (cdr (org-element-contents table-row))))) - -(defun org-odt--table (table contents info) - "Transcode a TABLE element from Org to ODT. -CONTENTS is the contents of the table. INFO is a plist holding -contextual information." - (cl-case (org-element-property :type table) - ;; Case 1: table.el doesn't support export to OD format. Strip - ;; such tables from export. - (table.el - (prog1 nil - (message - (concat - "(ox-odt): Found table.el-type table in the source Org file." - " table.el doesn't support export to ODT format." - " Stripping the table from export.")))) - ;; Case 2: Native Org tables. - (otherwise - (let* ((captions (org-odt-format-label table info 'definition)) - (caption (car captions)) (short-caption (cdr captions)) - (attributes (org-export-read-attribute :attr_odt table)) - (custom-table-style (nth 1 (org-odt-table-style-spec table info))) - (table-column-specs - (lambda (table info) - (let* ((table-style (or custom-table-style "OrgTable")) - (column-style (format "%sColumn" table-style))) - (mapconcat - (lambda (table-cell) - (let ((width (1+ (or (org-export-table-cell-width - table-cell info) 0))) - (s (format - "\n" - column-style)) - out) - (dotimes (_ width out) (setq out (concat s out))))) - (org-odt-table-first-row-data-cells table info) "\n"))))) - (concat - ;; caption. - (when caption - (format "\n%s" - "Table" caption)) - ;; begin table. - (let* ((automatic-name - (org-odt-add-automatic-style "Table" attributes))) - (format - "\n" - (or custom-table-style (cdr automatic-name) "OrgTable") - (concat (when short-caption - (format " table:name=\"%s\"" short-caption))))) - ;; column specification. - (funcall table-column-specs table info) - ;; actual contents. - "\n" contents - ;; end table. - ""))))) - -(defun org-odt-table (table contents info) - "Transcode a TABLE element from Org to ODT. -CONTENTS is the contents of the table. INFO is a plist holding -contextual information. - -Use `org-odt--table' to typeset the table. Handle details -pertaining to indentation here." - (let* ((--element-preceded-by-table-p - (lambda (element info) - (cl-loop for el in (org-export-get-previous-element element info t) - thereis (eq (org-element-type el) 'table)))) - (--walk-list-genealogy-and-collect-tags - (lambda (table info) - (let* ((genealogy (org-element-lineage table)) - (list-genealogy - (when (eq (org-element-type (car genealogy)) 'item) - (cl-loop for el in genealogy - when (memq (org-element-type el) - '(item plain-list)) - collect el))) - (llh-genealogy - (apply #'nconc - (cl-loop - for el in genealogy - when (and (eq (org-element-type el) 'headline) - (org-export-low-level-p el info)) - collect - (list el - (assq 'headline - (org-element-contents - (org-export-get-parent el))))))) - parent-list) - (nconc - ;; Handle list genealogy. - (cl-loop - for el in list-genealogy collect - (cl-case (org-element-type el) - (plain-list - (setq parent-list el) - (cons "" - (format "\n" - (cl-case (org-element-property :type el) - (ordered "OrgNumberedList") - (unordered "OrgBulletedList") - (descriptive-1 "OrgDescriptionList") - (descriptive-2 "OrgDescriptionList")) - "text:continue-numbering=\"true\""))) - (item - (cond - ((not parent-list) - (if (funcall --element-preceded-by-table-p table info) - '("" . "") - '("" . ""))) - ((funcall --element-preceded-by-table-p - parent-list info) - '("" . "")) - (t '("" . "")))))) - ;; Handle low-level headlines. - (cl-loop for el in llh-genealogy - with step = 'item collect - (cl-case step - (plain-list - (setq step 'item) ; Flip-flop - (setq parent-list el) - (cons "" - (format "\n" - (if (org-export-numbered-headline-p - el info) - "OrgNumberedList" - "OrgBulletedList") - "text:continue-numbering=\"true\""))) - (item - (setq step 'plain-list) ; Flip-flop - (cond - ((not parent-list) - (if (funcall --element-preceded-by-table-p table info) - '("" . "") - '("" . ""))) - ((let ((section? (org-export-get-previous-element - parent-list info))) - (and section? - (eq (org-element-type section?) 'section) - (assq 'table (org-element-contents section?)))) - '("" . "")) - (t - '("" . "")))))))))) - (close-open-tags (funcall --walk-list-genealogy-and-collect-tags - table info))) - ;; OpenDocument schema does not permit table to occur within a - ;; list item. - - ;; One solution - the easiest and lightweight, in terms of - ;; implementation - is to put the table in an indented text box - ;; and make the text box part of the list-item. Unfortunately if - ;; the table is big and spans multiple pages, the text box could - ;; overflow. In this case, the following attribute will come - ;; handy. - - ;; ,---- From OpenDocument-v1.1.pdf - ;; | 15.27.28 Overflow behavior - ;; | - ;; | For text boxes contained within text document, the - ;; | style:overflow-behavior property specifies the behavior of text - ;; | boxes where the containing text does not fit into the text - ;; | box. - ;; | - ;; | If the attribute's value is clip, the text that does not fit - ;; | into the text box is not displayed. - ;; | - ;; | If the attribute value is auto-create-new-frame, a new frame - ;; | will be created on the next page, with the same position and - ;; | dimensions of the original frame. - ;; | - ;; | If the style:overflow-behavior property's value is - ;; | auto-create-new-frame and the text box has a minimum width or - ;; | height specified, then the text box will grow until the page - ;; | bounds are reached before a new frame is created. - ;; `---- - - ;; Unfortunately, LibreOffice-3.4.6 doesn't honor - ;; auto-create-new-frame property and always resorts to clipping - ;; the text box. This results in table being truncated. - - ;; So we solve the problem the hard (and fun) way using list - ;; continuations. - - ;; The problem only becomes more interesting if you take in to - ;; account the following facts: - ;; - ;; - Description lists are simulated as plain lists. - ;; - Low-level headlines can be listified. - ;; - In Org mode, a table can occur not only as a regular list - ;; item, but also within description lists and low-level - ;; headlines. - - ;; See `org-odt-translate-description-lists' and - ;; `org-odt-translate-low-level-headlines' for how this is - ;; tackled. - - (concat "\n" - ;; Discontinue the list. - (mapconcat 'car close-open-tags "\n") - ;; Put the table in an indented section. - (let* ((table (org-odt--table table contents info)) - (level (/ (length (mapcar 'car close-open-tags)) 2)) - (style (format "OrgIndentedSection-Level-%d" level))) - (when table (org-odt-format-section table style))) - ;; Continue the list. - (mapconcat 'cdr (nreverse close-open-tags) "\n")))) - - -;;;; Target - -(defun org-odt-target (target _contents info) - "Transcode a TARGET object from Org to ODT. -CONTENTS is nil. INFO is a plist holding contextual -information." - (org-odt--target "" (org-export-get-reference target info))) - - -;;;; Timestamp - -(defun org-odt-timestamp (timestamp _contents info) - "Transcode a TIMESTAMP object from Org to ODT. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (let ((type (org-element-property :type timestamp))) - (if (not (plist-get info :odt-use-date-fields)) - (let ((value (org-odt-plain-text - (org-timestamp-translate timestamp) info))) - (cl-case (org-element-property :type timestamp) - ((active active-range) - (format "%s" - "OrgActiveTimestamp" value)) - ((inactive inactive-range) - (format "%s" - "OrgInactiveTimestamp" value)) - (otherwise value))) - (cl-case type - (active - (format "%s" - "OrgActiveTimestamp" - (format "<%s>" (org-odt--format-timestamp timestamp)))) - (inactive - (format "%s" - "OrgInactiveTimestamp" - (format "[%s]" (org-odt--format-timestamp timestamp)))) - (active-range - (format "%s" - "OrgActiveTimestamp" - (format "<%s>–<%s>" - (org-odt--format-timestamp timestamp) - (org-odt--format-timestamp timestamp 'end)))) - (inactive-range - (format "%s" - "OrgInactiveTimestamp" - (format "[%s]–[%s]" - (org-odt--format-timestamp timestamp) - (org-odt--format-timestamp timestamp 'end)))) - (otherwise - (format "%s" - "OrgDiaryTimestamp" - (org-odt-plain-text (org-timestamp-translate timestamp) - info))))))) - - -;;;; Underline - -(defun org-odt-underline (_underline contents _info) - "Transcode UNDERLINE from Org to ODT. -CONTENTS is the text with underline markup. INFO is a plist -holding contextual information." - (format "%s" - "Underline" contents)) - - -;;;; Verbatim - -(defun org-odt-verbatim (verbatim _contents _info) - "Transcode a VERBATIM object from Org to ODT. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (format "%s" - "OrgCode" (org-odt--encode-plain-text - (org-element-property :value verbatim)))) - - -;;;; Verse Block - -(defun org-odt-verse-block (_verse-block contents _info) - "Transcode a VERSE-BLOCK element from Org to ODT. -CONTENTS is verse block contents. INFO is a plist holding -contextual information." - (format "\n%s" - (replace-regexp-in-string - ;; Replace leading tabs and spaces. - "^[ \t]+" #'org-odt--encode-tabs-and-spaces - ;; Add line breaks to each line of verse. - (replace-regexp-in-string - "\\(\\)?[ \t]*$" "" contents)))) - - - -;;; Filters - -;;; Images - -(defun org-odt--translate-image-links (data _backend info) - (org-export-insert-image-links data info org-odt-inline-image-rules)) - -;;;; LaTeX fragments - -(defun org-odt--translate-latex-fragments (tree _backend info) - (let ((processing-type (plist-get info :with-latex)) - (count 0)) - ;; Normalize processing-type to one of dvipng, mathml or verbatim. - ;; If the desired converter is not available, force verbatim - ;; processing. - (cl-case processing-type - ((t mathml) - (if (and (fboundp 'org-format-latex-mathml-available-p) - (org-format-latex-mathml-available-p)) - (setq processing-type 'mathml) - (message "LaTeX to MathML converter not available.") - (setq processing-type 'verbatim))) - ((dvipng imagemagick) - (unless (and (org-check-external-command "latex" "" t) - (org-check-external-command - (if (eq processing-type 'dvipng) "dvipng" "convert") "" t)) - (message "LaTeX to PNG converter not available.") - (setq processing-type 'verbatim))) - (otherwise - (message "Unknown LaTeX option. Forcing verbatim.") - (setq processing-type 'verbatim))) - - ;; Store normalized value for later use. - (when (plist-get info :with-latex) - (plist-put info :with-latex processing-type)) - (message "Formatting LaTeX using %s" processing-type) - - ;; Convert `latex-fragment's and `latex-environment's. - (when (memq processing-type '(mathml dvipng imagemagick)) - (org-element-map tree '(latex-fragment latex-environment) - (lambda (latex-*) - (cl-incf count) - (let* ((latex-frag (org-element-property :value latex-*)) - (input-file (plist-get info :input-file)) - (cache-dir (file-name-directory input-file)) - (cache-subdir (concat - (cl-case processing-type - ((dvipng imagemagick) "ltxpng/") - (mathml "ltxmathml/")) - (file-name-sans-extension - (file-name-nondirectory input-file)))) - (display-msg - (cl-case processing-type - ((dvipng imagemagick) - (format "Creating LaTeX Image %d..." count)) - (mathml (format "Creating MathML snippet %d..." count)))) - ;; Get an Org-style link to PNG image or the MathML - ;; file. - (link - (with-temp-buffer - (insert latex-frag) - ;; When converting to a PNG image, make sure to - ;; copy all LaTeX header specifications from the - ;; Org source. - (unless (eq processing-type 'mathml) - (let ((h (plist-get info :latex-header))) - (when h - (insert "\n" - (replace-regexp-in-string - "^" "#+LATEX_HEADER: " h))))) - (org-format-latex cache-subdir nil nil cache-dir - nil display-msg nil - processing-type) - (goto-char (point-min)) - (skip-chars-forward " \t\n") - (org-element-link-parser)))) - (if (not (eq 'link (org-element-type link))) - (message "LaTeX Conversion failed.") - ;; Conversion succeeded. Parse above Org-style link to - ;; a `link' object. - (let ((replacement - (cl-case (org-element-type latex-*) - ;;LaTeX environment. Mimic a "standalone image - ;; or formula" by enclosing the `link' in - ;; a `paragraph'. Copy over original - ;; attributes, captions to the enclosing - ;; paragraph. - (latex-environment - (org-element-adopt-elements - (list 'paragraph - (list :style "OrgFormula" - :name - (org-element-property :name latex-*) - :caption - (org-element-property :caption latex-*))) - link)) - ;; LaTeX fragment. No special action. - (latex-fragment link)))) - ;; Note down the object that link replaces. - (org-element-put-property replacement :replaces - (list (org-element-type latex-*) - (list :value latex-frag))) - ;; Restore blank after initial element or object. - (org-element-put-property - replacement :post-blank - (org-element-property :post-blank latex-*)) - ;; Replace now. - (org-element-set-element latex-* replacement))))) - info nil nil t))) - tree) - - -;;;; Description lists - -;; This translator is necessary to handle indented tables in a uniform -;; manner. See comment in `org-odt--table'. - -(defun org-odt--translate-description-lists (tree _backend info) - ;; OpenDocument has no notion of a description list. So simulate it - ;; using plain lists. Description lists in the exported document - ;; are typeset in the same manner as they are in a typical HTML - ;; document. - ;; - ;; Specifically, a description list like this: - ;; - ;; ,---- - ;; | - term-1 :: definition-1 - ;; | - term-2 :: definition-2 - ;; `---- - ;; - ;; gets translated in to the following form: - ;; - ;; ,---- - ;; | - term-1 - ;; | - definition-1 - ;; | - term-2 - ;; | - definition-2 - ;; `---- - ;; - ;; Further effect is achieved by fixing the OD styles as below: - ;; - ;; 1. Set the :type property of the simulated lists to - ;; `descriptive-1' and `descriptive-2'. Map these to list-styles - ;; that has *no* bullets whatsoever. - ;; - ;; 2. The paragraph containing the definition term is styled to be - ;; in bold. - ;; - (org-element-map tree 'plain-list - (lambda (el) - (when (eq (org-element-property :type el) 'descriptive) - (org-element-set-element - el - (apply 'org-element-adopt-elements - (list 'plain-list (list :type 'descriptive-1)) - (mapcar - (lambda (item) - (org-element-adopt-elements - (list 'item (list :checkbox (org-element-property - :checkbox item))) - (list 'paragraph (list :style "Text_20_body_20_bold") - (or (org-element-property :tag item) "(no term)")) - (org-element-adopt-elements - (list 'plain-list (list :type 'descriptive-2)) - (apply 'org-element-adopt-elements - (list 'item nil) - (org-element-contents item))))) - (org-element-contents el))))) - nil) - info) - tree) - -;;;; List tables - -;; Lists that are marked with attribute `:list-table' are called as -;; list tables. They will be rendered as a table within the exported -;; document. - -;; Consider an example. The following list table -;; -;; #+attr_odt :list-table t -;; - Row 1 -;; - 1.1 -;; - 1.2 -;; - 1.3 -;; - Row 2 -;; - 2.1 -;; - 2.2 -;; - 2.3 -;; -;; will be exported as though it were an Org table like the one show -;; below. -;; -;; | Row 1 | 1.1 | 1.2 | 1.3 | -;; | Row 2 | 2.1 | 2.2 | 2.3 | -;; -;; Note that org-tables are NOT multi-line and each line is mapped to -;; a unique row in the exported document. So if an exported table -;; needs to contain a single paragraph (with copious text) it needs to -;; be typed up in a single line. Editing such long lines using the -;; table editor will be a cumbersome task. Furthermore inclusion of -;; multi-paragraph text in a table cell is well-nigh impossible. -;; -;; A LIST-TABLE circumvents above problems. -;; -;; Note that in the example above the list items could be paragraphs -;; themselves and the list can be arbitrarily deep. -;; -;; Inspired by following thread: -;; https://lists.gnu.org/r/emacs-orgmode/2011-03/msg01101.html - -;; Translate lists to tables - -(defun org-odt--translate-list-tables (tree _backend info) - (org-element-map tree 'plain-list - (lambda (l1-list) - (when (org-export-read-attribute :attr_odt l1-list :list-table) - ;; Replace list with table. - (org-element-set-element - l1-list - ;; Build replacement table. - (apply 'org-element-adopt-elements - (list 'table '(:type org :attr_odt (":style \"GriddedTable\""))) - (org-element-map l1-list 'item - (lambda (l1-item) - (let* ((l1-item-contents (org-element-contents l1-item)) - l1-item-leading-text l2-list) - ;; Remove Level-2 list from the Level-item. It - ;; will be subsequently attached as table-cells. - (let ((cur l1-item-contents) prev) - (while (and cur (not (eq (org-element-type (car cur)) - 'plain-list))) - (setq prev cur) - (setq cur (cdr cur))) - (when prev - (setcdr prev nil) - (setq l2-list (car cur))) - (setq l1-item-leading-text l1-item-contents)) - ;; Level-1 items start a table row. - (apply 'org-element-adopt-elements - (list 'table-row (list :type 'standard)) - ;; Leading text of level-1 item define - ;; the first table-cell. - (apply 'org-element-adopt-elements - (list 'table-cell nil) - l1-item-leading-text) - ;; Level-2 items define subsequent - ;; table-cells of the row. - (org-element-map l2-list 'item - (lambda (l2-item) - (apply 'org-element-adopt-elements - (list 'table-cell nil) - (org-element-contents l2-item))) - info nil 'item)))) - info nil 'item)))) - nil) - info) - tree) - - -;;; Interactive functions - -(defun org-odt-create-manifest-file-entry (&rest args) - (push args org-odt-manifest-file-entries)) - -(defun org-odt-write-manifest-file () - (make-directory (concat org-odt-zip-dir "META-INF")) - (let ((manifest-file (concat org-odt-zip-dir "META-INF/manifest.xml"))) - (with-current-buffer - (let ((nxml-auto-insert-xml-declaration-flag nil)) - (find-file-noselect manifest-file t)) - (insert - " - \n") - (dolist (file-entry org-odt-manifest-file-entries) - (let* ((version (nth 2 file-entry)) - (extra (if (not version) "" - (format " manifest:version=\"%s\"" version)))) - (insert - (format org-odt-manifest-file-entry-tag - (nth 0 file-entry) (nth 1 file-entry) extra)))) - (insert "\n")))) - -(defmacro org-odt--export-wrap (out-file &rest body) - `(let* ((--out-file ,out-file) - (out-file-type (file-name-extension --out-file)) - (org-odt-xml-files '("META-INF/manifest.xml" "content.xml" - "meta.xml" "styles.xml")) - ;; Initialize temporary workarea. All files that end up in - ;; the exported document get parked/created here. - (org-odt-zip-dir (file-name-as-directory - (make-temp-file (format "%s-" out-file-type) t))) - (org-odt-manifest-file-entries nil) - (--cleanup-xml-buffers - (lambda () - ;; Kill all XML buffers. - (dolist (file org-odt-xml-files) - (let ((buf (find-buffer-visiting - (concat org-odt-zip-dir file)))) - (when buf - (with-current-buffer buf - (set-buffer-modified-p nil) - (kill-buffer buf))))) - ;; Delete temporary directory and also other embedded - ;; files that get copied there. - (delete-directory org-odt-zip-dir t)))) - (condition-case err - (progn - (unless (executable-find "zip") - ;; Not at all OSes ship with zip by default - (error "Executable \"zip\" needed for creating OpenDocument files")) - ;; Do export. This creates a bunch of xml files ready to be - ;; saved and zipped. - (progn ,@body) - ;; Create a manifest entry for content.xml. - (org-odt-create-manifest-file-entry "text/xml" "content.xml") - ;; Write mimetype file - (let* ((mimetypes - '(("odt" . "application/vnd.oasis.opendocument.text") - ("odf" . "application/vnd.oasis.opendocument.formula"))) - (mimetype (cdr (assoc-string out-file-type mimetypes t)))) - (unless mimetype - (error "Unknown OpenDocument backend %S" out-file-type)) - (write-region mimetype nil (concat org-odt-zip-dir "mimetype")) - (org-odt-create-manifest-file-entry mimetype "/" "1.2")) - ;; Write out the manifest entries before zipping - (org-odt-write-manifest-file) - ;; Save all XML files. - (dolist (file org-odt-xml-files) - (let ((buf (find-buffer-visiting - (concat org-odt-zip-dir file)))) - (when buf - (with-current-buffer buf - ;; Prettify output if needed. - (when org-odt-prettify-xml - (indent-region (point-min) (point-max))) - (save-buffer 0))))) - ;; Run zip. - (let* ((target --out-file) - (target-name (file-name-nondirectory target)) - (cmds `(("zip" "-mX0" ,target-name "mimetype") - ("zip" "-rmTq" ,target-name ".")))) - ;; If a file with same name as the desired output file - ;; exists, remove it. - (when (file-exists-p target) - (delete-file target)) - ;; Zip up the xml files. - (let ((coding-system-for-write 'no-conversion) exitcode err-string) - (message "Creating ODT file...") - ;; Switch temporarily to content.xml. This way Zip - ;; process will inherit `org-odt-zip-dir' as the current - ;; directory. - (with-current-buffer - (find-file-noselect (concat org-odt-zip-dir "content.xml") t) - (dolist (cmd cmds) - (message "Running %s" (mapconcat 'identity cmd " ")) - (setq err-string - (with-output-to-string - (setq exitcode - (apply 'call-process (car cmd) - nil standard-output nil (cdr cmd))))) - (or (zerop exitcode) - (error (concat "Unable to create OpenDocument file." - " Zip failed with error (%s)") - err-string))))) - ;; Move the zip file from temporary work directory to - ;; user-mandated location. - (rename-file (concat org-odt-zip-dir target-name) target) - (message "Created %s" (expand-file-name target)) - ;; Cleanup work directory and work files. - (funcall --cleanup-xml-buffers) - ;; Open the OpenDocument file in archive-mode for - ;; examination. - (find-file-noselect target t) - ;; Return exported file. - (cond - ;; Case 1: Conversion desired on exported file. Run the - ;; converter on the OpenDocument file. Return the - ;; converted file. - (org-odt-preferred-output-format - (or (org-odt-convert target org-odt-preferred-output-format) - target)) - ;; Case 2: No further conversion. Return exported - ;; OpenDocument file. - (t target)))) - (error - ;; Cleanup work directory and work files. - (funcall --cleanup-xml-buffers) - (message "OpenDocument export failed: %s" - (error-message-string err)))))) - - -;;;; Export to OpenDocument formula - -;;;###autoload -(defun org-odt-export-as-odf (latex-frag &optional odf-file) - "Export LATEX-FRAG as OpenDocument formula file ODF-FILE. -Use `org-create-math-formula' to convert LATEX-FRAG first to -MathML. When invoked as an interactive command, use -`org-latex-regexps' to infer LATEX-FRAG from currently active -region. If no LaTeX fragments are found, prompt for it. Push -MathML source to kill ring depending on the value of -`org-export-copy-to-kill-ring'." - (interactive - `(,(let (frag) - (setq frag (and (setq frag (and (region-active-p) - (buffer-substring (region-beginning) - (region-end)))) - (cl-loop for e in org-latex-regexps - thereis (when (string-match (nth 1 e) frag) - (match-string (nth 2 e) frag))))) - (read-string "LaTeX Fragment: " frag nil frag)) - ,(let ((odf-filename (expand-file-name - (concat - (file-name-sans-extension - (or (file-name-nondirectory buffer-file-name))) - "." "odf") - (file-name-directory buffer-file-name)))) - (read-file-name "ODF filename: " nil odf-filename nil - (file-name-nondirectory odf-filename))))) - (let ((filename (or odf-file - (expand-file-name - (concat - (file-name-sans-extension - (or (file-name-nondirectory buffer-file-name))) - "." "odf") - (file-name-directory buffer-file-name))))) - (org-odt--export-wrap - filename - (let* ((buffer (progn - (require 'nxml-mode) - (let ((nxml-auto-insert-xml-declaration-flag nil)) - (find-file-noselect (concat org-odt-zip-dir - "content.xml") t)))) - (coding-system-for-write 'utf-8) - (save-buffer-coding-system 'utf-8)) - (set-buffer buffer) - (set-buffer-file-coding-system coding-system-for-write) - (let ((mathml (org-create-math-formula latex-frag))) - (unless mathml (error "No Math formula created")) - (insert mathml) - ;; Add MathML to kill ring, if needed. - (when (org-export--copy-to-kill-ring-p) - (org-kill-new (buffer-string)))))))) - -;;;###autoload -(defun org-odt-export-as-odf-and-open () - "Export LaTeX fragment as OpenDocument formula and immediately open it. -Use `org-odt-export-as-odf' to read LaTeX fragment and OpenDocument -formula file." - (interactive) - (org-open-file (call-interactively 'org-odt-export-as-odf) 'system)) - - -;;;; Export to OpenDocument Text - -;;;###autoload -(defun org-odt-export-to-odt (&optional async subtreep visible-only ext-plist) - "Export current buffer to a ODT file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Return output file's name." - (interactive) - (let ((outfile (org-export-output-file-name ".odt" subtreep))) - (if async - (org-export-async-start (lambda (f) (org-export-add-to-stack f 'odt)) - `(expand-file-name - (org-odt--export-wrap - ,outfile - (let* ((org-odt-embedded-images-count 0) - (org-odt-embedded-formulas-count 0) - (org-odt-automatic-styles nil) - (org-odt-object-counters nil) - ;; Let `htmlfontify' know that we are interested in - ;; collecting styles. - (hfy-user-sheet-assoc nil)) - ;; Initialize content.xml and kick-off the export - ;; process. - (let ((out-buf - (progn - (require 'nxml-mode) - (let ((nxml-auto-insert-xml-declaration-flag nil)) - (find-file-noselect - (concat org-odt-zip-dir "content.xml") t)))) - (output (org-export-as - 'odt ,subtreep ,visible-only nil ,ext-plist))) - (with-current-buffer out-buf - (erase-buffer) - (insert output))))))) - (org-odt--export-wrap - outfile - (let* ((org-odt-embedded-images-count 0) - (org-odt-embedded-formulas-count 0) - (org-odt-automatic-styles nil) - (org-odt-object-counters nil) - ;; Let `htmlfontify' know that we are interested in collecting - ;; styles. - (hfy-user-sheet-assoc nil)) - ;; Initialize content.xml and kick-off the export process. - (let ((output (org-export-as 'odt subtreep visible-only nil ext-plist)) - (out-buf (progn - (require 'nxml-mode) - (let ((nxml-auto-insert-xml-declaration-flag nil)) - (find-file-noselect - (concat org-odt-zip-dir "content.xml") t))))) - (with-current-buffer out-buf (erase-buffer) (insert output)))))))) - - -;;;; Convert between OpenDocument and other formats - -(defun org-odt-reachable-p (in-fmt out-fmt) - "Return non-nil if IN-FMT can be converted to OUT-FMT." - (catch 'done - (let ((reachable-formats (org-odt-do-reachable-formats in-fmt))) - (dolist (e reachable-formats) - (let ((out-fmt-spec (assoc out-fmt (cdr e)))) - (when out-fmt-spec - (throw 'done (cons (car e) out-fmt-spec)))))))) - -(defun org-odt-do-convert (in-file out-fmt &optional open) - "Workhorse routine for `org-odt-convert'." - (require 'browse-url) - (let* ((in-file (let ((f (expand-file-name (or in-file buffer-file-name)))) - (if (file-readable-p f) f - (error "Cannot read %s" in-file)))) - (in-fmt (file-name-extension in-file)) - (out-fmt (or out-fmt (error "Output format unspecified"))) - (how (or (org-odt-reachable-p in-fmt out-fmt) - (error "Cannot convert from %s format to %s format?" - in-fmt out-fmt))) - (convert-process (car how)) - (out-file (concat (file-name-sans-extension in-file) "." - (nth 1 (or (cdr how) out-fmt)))) - (extra-options (or (nth 2 (cdr how)) "")) - (out-dir (file-name-directory in-file)) - (cmd (format-spec convert-process - `((?i . ,(shell-quote-argument in-file)) - (?I . ,(browse-url-file-url in-file)) - (?f . ,out-fmt) - (?o . ,out-file) - (?O . ,(browse-url-file-url out-file)) - (?d . , (shell-quote-argument out-dir)) - (?D . ,(browse-url-file-url out-dir)) - (?x . ,extra-options))))) - (when (file-exists-p out-file) - (delete-file out-file)) - - (message "Executing %s" cmd) - (let ((cmd-output (shell-command-to-string cmd))) - (message "%s" cmd-output)) - - (cond - ((file-exists-p out-file) - (message "Exported to %s" out-file) - (when open - (message "Opening %s..." out-file) - (org-open-file out-file 'system)) - out-file) - (t - (message "Export to %s failed" out-file) - nil)))) - -(defun org-odt-do-reachable-formats (in-fmt) - "Return verbose info about formats to which IN-FMT can be converted. -Return a list where each element is of the -form (CONVERTER-PROCESS . OUTPUT-FMT-ALIST). See -`org-odt-convert-processes' for CONVERTER-PROCESS and see -`org-odt-convert-capabilities' for OUTPUT-FMT-ALIST." - (let* ((converter - (and org-odt-convert-process - (cadr (assoc-string org-odt-convert-process - org-odt-convert-processes t)))) - (capabilities - (and org-odt-convert-process - (cadr (assoc-string org-odt-convert-process - org-odt-convert-processes t)) - org-odt-convert-capabilities)) - reachable-formats) - (when converter - (dolist (c capabilities) - (when (member in-fmt (nth 1 c)) - (push (cons converter (nth 2 c)) reachable-formats)))) - reachable-formats)) - -(defun org-odt-reachable-formats (in-fmt) - "Return list of formats to which IN-FMT can be converted. -The list of the form (OUTPUT-FMT-1 OUTPUT-FMT-2 ...)." - (copy-sequence - (apply #'append (mapcar - (lambda (e) (mapcar #'car (cdr e))) - (org-odt-do-reachable-formats in-fmt))))) - -(defun org-odt-convert-read-params () - "Return IN-FILE and OUT-FMT params for `org-odt-do-convert'. -This is a helper routine for interactive use." - (let* ((input (if (featurep 'ido) 'ido-completing-read 'completing-read)) - (in-file (read-file-name "File to be converted: " - nil buffer-file-name t)) - (in-fmt (file-name-extension in-file)) - (out-fmt-choices (org-odt-reachable-formats in-fmt)) - (out-fmt - (or (and out-fmt-choices - (funcall input "Output format: " - out-fmt-choices nil nil nil)) - (error - "No known converter or no known output formats for %s files" - in-fmt)))) - (list in-file out-fmt))) - -;;;###autoload -(defun org-odt-convert (&optional in-file out-fmt open) - "Convert IN-FILE to format OUT-FMT using a command line converter. -IN-FILE is the file to be converted. If unspecified, it defaults -to variable `buffer-file-name'. OUT-FMT is the desired output -format. Use `org-odt-convert-process' as the converter. If OPEN -is non-nil then the newly converted file is opened using -`org-open-file'." - (interactive - (append (org-odt-convert-read-params) current-prefix-arg)) - (org-odt-do-convert in-file out-fmt open)) - -;;; Library Initializations - -(dolist (desc org-odt-file-extensions) - ;; Let Emacs open all OpenDocument files in archive mode. - (add-to-list 'auto-mode-alist - (cons (concat "\\." (car desc) "\\'") 'archive-mode))) - -(provide 'ox-odt) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox-odt.el ends here diff --git a/elpa/org-9.3.6/ox-odt.elc b/elpa/org-9.3.6/ox-odt.elc deleted file mode 100644 index 98dd49044d94d0ee8a2dff83d3e70cebb03778cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132420 zcmeF4iC0|LwWl=_o2>XH{f4}ruS&*}Y!$87$bdY=_{k+GpdzTkRfQ#` z)7}4if4{xYxkFWfaGclc^;#_(xcA&M4}0GG{BHHp@^3F(xG?*>-~BFG?jId@4?DZ| z((NUyN9~?=V$HX)`_Z{ zGVBbK-8a4VQFkZV?e7dngKlqsc$=?-;V5bE?sj&Qw3X`J`P$uyI(GZi(d&s`sqs_ir@>E?A2LmV*r%UI$L*0l+HUE;PDbq)EPtRY-2qtq+33liOFnP za+Yh@>mDC>M)~%9BEtuA?sZ>xcFV82yBy1GV7XM~>GwyRqmIviS0^@~ck*k#%%HQ^ z8FYF(`T0yMOg~cMpwr$xWO;K{$0U9254wNWIX)~8PS_z?U&p?Xx7$-a<>6pwVmik^ zrMXA#VSb-@J|!v#tpbL!COyHvbdCz?og-3TcHX?|5AvHbr10&qJ?gwJcX~f|2mRg= z%bzPg@h#22H)!uq%^W`{ryY$!r=1^1mgqUgzG-wlHh1}W&_C`B3R|;~PQGJ+<^G_3 zoZlyDn!X#x4=WM33#54!vpUj~|&(Z4v=!-R2lD>vcmM0G4*cbBtaH0)6eoS(y z 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 Bm)HOR diff --git a/elpa/org-9.3.6/ox-org.el b/elpa/org-9.3.6/ox-org.el deleted file mode 100644 index 97d8d0e9..00000000 --- a/elpa/org-9.3.6/ox-org.el +++ /dev/null @@ -1,356 +0,0 @@ -;;; ox-org.el --- Org Back-End for Org Export Engine -*- lexical-binding: t; -*- - -;; Copyright (C) 2013-2020 Free Software Foundation, Inc. - -;; Author: Nicolas Goaziou -;; Keywords: org, wp - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;;; Code: - -(require 'ox) -(declare-function htmlize-buffer "ext:htmlize" (&optional buffer)) -(defvar htmlize-output-type) - -(defgroup org-export-org nil - "Options for exporting Org mode files to Org." - :tag "Org Export Org" - :group 'org-export - :version "24.4" - :package-version '(Org . "8.0")) - -(defcustom org-org-htmlized-css-url nil - "URL pointing to the CSS defining colors for htmlized Emacs buffers. -Normally when creating an htmlized version of an Org buffer, -htmlize will create the CSS to define the font colors. However, -this does not work when converting in batch mode, and it also can -look bad if different people with different fontification setup -work on the same website. When this variable is non-nil, -creating an htmlized version of an Org buffer using -`org-org-export-as-org' will include a link to this URL if the -setting of `org-html-htmlize-output-type' is `css'." - :group 'org-export-org - :type '(choice - (const :tag "Don't include external stylesheet link" nil) - (string :tag "URL or local href"))) - -(org-export-define-backend 'org - '((babel-call . org-org-identity) - (bold . org-org-identity) - (center-block . org-org-identity) - (clock . org-org-identity) - (code . org-org-identity) - (diary-sexp . org-org-identity) - (drawer . org-org-identity) - (dynamic-block . org-org-identity) - (entity . org-org-identity) - (example-block . org-org-identity) - (export-block . org-org-export-block) - (fixed-width . org-org-identity) - (footnote-definition . ignore) - (footnote-reference . org-org-identity) - (headline . org-org-headline) - (horizontal-rule . org-org-identity) - (inline-babel-call . org-org-identity) - (inline-src-block . org-org-identity) - (inlinetask . org-org-identity) - (italic . org-org-identity) - (item . org-org-identity) - (keyword . org-org-keyword) - (latex-environment . org-org-identity) - (latex-fragment . org-org-identity) - (line-break . org-org-identity) - (link . org-org-link) - (node-property . org-org-identity) - (template . org-org-template) - (paragraph . org-org-identity) - (plain-list . org-org-identity) - (planning . org-org-identity) - (property-drawer . org-org-identity) - (quote-block . org-org-identity) - (radio-target . org-org-identity) - (section . org-org-section) - (special-block . org-org-identity) - (src-block . org-org-identity) - (statistics-cookie . org-org-identity) - (strike-through . org-org-identity) - (subscript . org-org-identity) - (superscript . org-org-identity) - (table . org-org-identity) - (table-cell . org-org-identity) - (table-row . org-org-identity) - (target . org-org-identity) - (timestamp . org-org-timestamp) - (underline . org-org-identity) - (verbatim . org-org-identity) - (verse-block . org-org-identity)) - :menu-entry - '(?O "Export to Org" - ((?O "As Org buffer" org-org-export-as-org) - (?o "As Org file" org-org-export-to-org) - (?v "As Org file and open" - (lambda (a s v b) - (if a (org-org-export-to-org t s v b) - (org-open-file (org-org-export-to-org nil s v b))))))) - :filters-alist '((:filter-parse-tree . org-org--add-missing-sections))) - -(defun org-org--add-missing-sections (tree _backend _info) - "Ensure each headline has an associated section. - -TREE is the parse tree being exported. - -Footnotes relative to the headline are inserted in the section, -using `org-org-section'. However, this function is not called if -the headline doesn't contain any section in the first place, so -we make sure it is always called." - (org-element-map tree 'headline - (lambda (h) - (let ((first-child (car (org-element-contents h))) - (new-section (org-element-create 'section))) - (pcase (org-element-type first-child) - (`section nil) - (`nil (org-element-adopt-elements h new-section)) - (_ (org-element-insert-before new-section first-child)))))) - tree) - -(defun org-org-export-block (export-block _contents _info) - "Transcode a EXPORT-BLOCK element from Org to LaTeX. -CONTENTS and INFO are ignored." - (and (equal (org-element-property :type export-block) "ORG") - (org-element-property :value export-block))) - -(defun org-org-identity (blob contents _info) - "Transcode BLOB element or object back into Org syntax. -CONTENTS is its contents, as a string or nil. INFO is ignored." - (let ((case-fold-search t)) - (replace-regexp-in-string - "^[ \t]*#\\+ATTR_[-_A-Za-z0-9]+:\\(?: .*\\)?\n" "" - (org-export-expand blob contents t)))) - -(defun org-org-headline (headline contents info) - "Transcode HEADLINE element back into Org syntax. -CONTENTS is its contents, as a string or nil. INFO is ignored." - (unless (org-element-property :footnote-section-p headline) - (unless (plist-get info :with-todo-keywords) - (org-element-put-property headline :todo-keyword nil)) - (unless (plist-get info :with-tags) - (org-element-put-property headline :tags nil)) - (unless (plist-get info :with-priority) - (org-element-put-property headline :priority nil)) - (org-element-put-property headline :level - (org-export-get-relative-level headline info)) - (org-element-headline-interpreter headline contents))) - -(defun org-org-keyword (keyword _contents _info) - "Transcode KEYWORD element back into Org syntax. -CONTENTS is nil. INFO is ignored." - (let ((key (org-element-property :key keyword))) - (unless (member key - '("AUTHOR" "CREATOR" "DATE" "EMAIL" "OPTIONS" "TITLE")) - (org-element-keyword-interpreter keyword nil)))) - -(defun org-org-link (link contents _info) - "Transcode LINK object back into Org syntax. -CONTENTS is the description of the link, as a string, or nil. -INFO is a plist containing current export state." - (or (org-export-custom-protocol-maybe link contents 'org) - (org-element-link-interpreter link contents))) - -(defun org-org-template (contents info) - "Return Org document template with document keywords. -CONTENTS is the transcoded contents string. INFO is a plist used -as a communication channel." - (concat - (and (plist-get info :time-stamp-file) - (format-time-string "# Created %Y-%m-%d %a %H:%M\n")) - (org-element-normalize-string - (mapconcat #'identity - (org-element-map (plist-get info :parse-tree) 'keyword - (lambda (k) - (and (string-equal (org-element-property :key k) "OPTIONS") - (concat "#+OPTIONS: " - (org-element-property :value k))))) - "\n")) - (and (plist-get info :with-title) - (format "#+TITLE: %s\n" (org-export-data (plist-get info :title) info))) - (and (plist-get info :with-date) - (let ((date (org-export-data (org-export-get-date info) info))) - (and (org-string-nw-p date) - (format "#+DATE: %s\n" date)))) - (and (plist-get info :with-author) - (let ((author (org-export-data (plist-get info :author) info))) - (and (org-string-nw-p author) - (format "#+AUTHOR: %s\n" author)))) - (and (plist-get info :with-email) - (let ((email (org-export-data (plist-get info :email) info))) - (and (org-string-nw-p email) - (format "#+EMAIL: %s\n" email)))) - (and (plist-get info :with-creator) - (org-string-nw-p (plist-get info :creator)) - (format "#+CREATOR: %s\n" (plist-get info :creator))) - contents)) - -(defun org-org-timestamp (timestamp _contents _info) - "Transcode a TIMESTAMP object to custom format or back into Org syntax." - (org-timestamp-translate timestamp)) - -(defun org-org-section (section contents info) - "Transcode SECTION element back into Org syntax. -CONTENTS is the contents of the section. INFO is a plist used as -a communication channel." - (concat - (org-element-normalize-string contents) - ;; Insert footnote definitions appearing for the first time in this - ;; section, or in the relative headline title. Indeed, some of - ;; them may not be available to narrowing so we make sure all of - ;; them are included in the result. - (let ((footnotes - (org-element-map - (list (org-export-get-parent-headline section) section) - 'footnote-reference - (lambda (fn) - (and (eq (org-element-property :type fn) 'standard) - (org-export-footnote-first-reference-p fn info) - (org-element-normalize-string - (format "[fn:%s] %s" - (org-element-property :label fn) - (org-export-data - (org-export-get-footnote-definition fn info) - info))))) - info nil 'headline t))) - (and footnotes (concat "\n" (mapconcat #'identity footnotes "\n")))))) - -;;;###autoload -(defun org-org-export-as-org - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to an Org buffer. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting buffer should be accessible -through the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, strip document -keywords from output. - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Export is done in a buffer named \"*Org ORG Export*\", which will -be displayed when `org-export-show-temporary-export-buffer' is -non-nil." - (interactive) - (org-export-to-buffer 'org "*Org ORG Export*" - async subtreep visible-only body-only ext-plist (lambda () (org-mode)))) - -;;;###autoload -(defun org-org-export-to-org - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to an Org file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, strip document -keywords from output. - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Return output file name." - (interactive) - (let ((outfile (org-export-output-file-name ".org" subtreep))) - (org-export-to-file 'org outfile - async subtreep visible-only body-only ext-plist))) - -;;;###autoload -(defun org-org-publish-to-org (plist filename pub-dir) - "Publish an Org file to Org. - -FILENAME is the filename of the Org file to be published. PLIST -is the property list for the given project. PUB-DIR is the -publishing directory. - -Return output file name." - (org-publish-org-to 'org filename ".org" plist pub-dir) - (when (plist-get plist :htmlized-source) - (or (require 'htmlize nil t) - (error "Please install htmlize from https://github.com/hniksic/emacs-htmlize")) - (require 'ox-html) - (let* ((org-inhibit-startup t) - (htmlize-output-type 'css) - (html-ext (concat "." (or (plist-get plist :html-extension) - org-html-extension "html"))) - (visitingp (find-buffer-visiting filename)) - (work-buffer (or visitingp (find-file-noselect filename))) - newbuf) - (with-current-buffer work-buffer - (org-font-lock-ensure) - (org-show-all) - (setq newbuf (htmlize-buffer))) - (with-current-buffer newbuf - (when org-org-htmlized-css-url - (goto-char (point-min)) - (and (re-search-forward - ".*" nil t) - (replace-match - (format - "" - org-org-htmlized-css-url) - t t))) - (write-file (concat pub-dir (file-name-nondirectory filename) html-ext))) - (kill-buffer newbuf) - (unless visitingp (kill-buffer work-buffer))) - ;; FIXME: Why? Which buffer is this supposed to apply to? - (set-buffer-modified-p nil))) - - -(provide 'ox-org) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox-org.el ends here diff --git a/elpa/org-9.3.6/ox-org.elc b/elpa/org-9.3.6/ox-org.elc deleted file mode 100644 index 63b568d2aec2a84f16333ef77c5ecf07ca3ec6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12538 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 diff --git a/elpa/org-9.3.6/ox-publish.el b/elpa/org-9.3.6/ox-publish.el deleted file mode 100644 index a4767965..00000000 --- a/elpa/org-9.3.6/ox-publish.el +++ /dev/null @@ -1,1379 +0,0 @@ -;;; ox-publish.el --- Publish Related Org Mode Files as a Website -*- lexical-binding: t; -*- -;; Copyright (C) 2006-2020 Free Software Foundation, Inc. - -;; Author: David O'Toole -;; Maintainer: Carsten Dominik -;; Keywords: hypermedia, outlines, wp - -;; This file is part of GNU Emacs. -;; -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This program allow configurable publishing of related sets of -;; Org mode files as a complete website. -;; -;; ox-publish.el can do the following: -;; -;; + Publish all one's Org files to a given export back-end -;; + Upload HTML, images, attachments and other files to a web server -;; + Exclude selected private pages from publishing -;; + Publish a clickable sitemap of pages -;; + Manage local timestamps for publishing only changed files -;; + Accept plugin functions to extend range of publishable content -;; -;; Documentation for publishing is in the manual. - -;;; Code: - -(require 'cl-lib) -(require 'format-spec) -(require 'ox) - - - -;;; Variables - -;; Here, so you find the variable right before it's used the first time: -(defvar org-publish-cache nil - "This will cache timestamps and titles for files in publishing projects. -Blocks could hash sha1 values here.") - -(defvar org-publish-after-publishing-hook nil - "Hook run each time a file is published. -Every function in this hook will be called with two arguments: -the name of the original file and the name of the file -produced.") - -(defgroup org-export-publish nil - "Options for publishing a set of files." - :tag "Org Publishing" - :group 'org-export) - -(defcustom org-publish-project-alist nil - "Association list to control publishing behavior. -\\ -Each element of the alist is a publishing project. The car of -each element is a string, uniquely identifying the project. The -cdr of each element is in one of the following forms: - -1. A well-formed property list with an even number of elements, - alternating keys and values, specifying parameters for the - publishing process. - - (:property value :property value ... ) - -2. A meta-project definition, specifying of a list of - sub-projects: - - (:components (\"project-1\" \"project-2\" ...)) - -When the CDR of an element of org-publish-project-alist is in -this second form, the elements of the list after `:components' -are taken to be components of the project, which group together -files requiring different publishing options. When you publish -such a project with `\\[org-publish]', the components all publish. - -When a property is given a value in `org-publish-project-alist', -its setting overrides the value of the corresponding user -variable (if any) during publishing. However, options set within -a file override everything. - -Most properties are optional, but some should always be set: - - `:base-directory' - - Directory containing publishing source files. - - `:base-extension' - - Extension (without the dot!) of source files. This can be - a regular expression. If not given, \"org\" will be used as - default extension. If it is `any', include all the files, - even without extension. - - `:publishing-directory' - - Directory (possibly remote) where output files will be - published. - -If `:recursive' is non-nil files in sub-directories of -`:base-directory' are considered. - -The `:exclude' property may be used to prevent certain files from -being published. Its value may be a string or regexp matching -file names you don't want to be published. - -The `:include' property may be used to include extra files. Its -value may be a list of filenames to include. The filenames are -considered relative to the base directory. - -When both `:include' and `:exclude' properties are given values, -the exclusion step happens first. - -One special property controls which back-end function to use for -publishing files in the project. This can be used to extend the -set of file types publishable by `org-publish', as well as the -set of output formats. - - `:publishing-function' - - Function to publish file. Each back-end may define its - own (i.e. `org-latex-publish-to-pdf', - `org-html-publish-to-html'). May be a list of functions, in - which case each function in the list is invoked in turn. - -Another property allows you to insert code that prepares -a project for publishing. For example, you could call GNU Make -on a certain makefile, to ensure published files are built up to -date. - - `:preparation-function' - - Function to be called before publishing this project. This - may also be a list of functions. Preparation functions are - called with the project properties list as their sole - argument. - - `:completion-function' - - Function to be called after publishing this project. This - may also be a list of functions. Completion functions are - called with the project properties list as their sole - argument. - -Some properties control details of the Org publishing process, -and are equivalent to the corresponding user variables listed in -the right column. Back-end specific properties may also be -included. See the back-end documentation for more information. - - :author `user-full-name' - :creator `org-export-creator-string' - :email `user-mail-address' - :exclude-tags `org-export-exclude-tags' - :headline-levels `org-export-headline-levels' - :language `org-export-default-language' - :preserve-breaks `org-export-preserve-breaks' - :section-numbers `org-export-with-section-numbers' - :select-tags `org-export-select-tags' - :time-stamp-file `org-export-time-stamp-file' - :with-archived-trees `org-export-with-archived-trees' - :with-author `org-export-with-author' - :with-creator `org-export-with-creator' - :with-date `org-export-with-date' - :with-drawers `org-export-with-drawers' - :with-email `org-export-with-email' - :with-emphasize `org-export-with-emphasize' - :with-entities `org-export-with-entities' - :with-fixed-width `org-export-with-fixed-width' - :with-footnotes `org-export-with-footnotes' - :with-inlinetasks `org-export-with-inlinetasks' - :with-latex `org-export-with-latex' - :with-planning `org-export-with-planning' - :with-priority `org-export-with-priority' - :with-properties `org-export-with-properties' - :with-smart-quotes `org-export-with-smart-quotes' - :with-special-strings `org-export-with-special-strings' - :with-statistics-cookies' `org-export-with-statistics-cookies' - :with-sub-superscript `org-export-with-sub-superscripts' - :with-toc `org-export-with-toc' - :with-tables `org-export-with-tables' - :with-tags `org-export-with-tags' - :with-tasks `org-export-with-tasks' - :with-timestamps `org-export-with-timestamps' - :with-title `org-export-with-title' - :with-todo-keywords `org-export-with-todo-keywords' - -The following properties may be used to control publishing of -a site-map of files or summary page for a given project. - - `:auto-sitemap' - - Whether to publish a site-map during - `org-publish-current-project' or `org-publish-all'. - - `:sitemap-filename' - - Filename for output of site-map. Defaults to \"sitemap.org\". - - `:sitemap-title' - - Title of site-map page. Defaults to name of file. - - `:sitemap-style' - - Can be `list' (site-map is just an itemized list of the - titles of the files involved) or `tree' (the directory - structure of the source files is reflected in the site-map). - Defaults to `tree'. - - `:sitemap-format-entry' - - Plugin function used to format entries in the site-map. It - is called with three arguments: the file or directory name - relative to base directory, the site map style and the - current project. It has to return a string. - - Defaults to `org-publish-sitemap-default-entry', which turns - file names into links and use document titles as - descriptions. For specific formatting needs, one can use - `org-publish-find-date', `org-publish-find-title' and - `org-publish-find-property', to retrieve additional - information about published documents. - - `:sitemap-function' - - Plugin function to use for generation of site-map. It is - called with two arguments: the title of the site-map, as - a string, and a representation of the files involved in the - project, as returned by `org-list-to-lisp'. The latter can - further be transformed using `org-list-to-generic', - `org-list-to-subtree' and alike. It has to return a string. - - Defaults to `org-publish-sitemap-default', which generates - a plain list of links to all files in the project. - -If you create a site-map file, adjust the sorting like this: - - `:sitemap-sort-folders' - - Where folders should appear in the site-map. Set this to - `first' or `last' to display folders first or last, - respectively. When set to `ignore' (default), folders are - ignored altogether. Any other value will mix files and - folders. This variable has no effect when site-map style is - `tree'. - - `:sitemap-sort-files' - - The site map is normally sorted alphabetically. You can - change this behavior setting this to `anti-chronologically', - `chronologically', or nil. - - `:sitemap-ignore-case' - - Should sorting be case-sensitive? Default nil. - -The following property control the creation of a concept index. - - `:makeindex' - - Create a concept index. The file containing the index has to - be called \"theindex.org\". If it doesn't exist in the - project, it will be generated. Contents of the index are - stored in the file \"theindex.inc\", which can be included in - \"theindex.org\". - -Other properties affecting publication. - - `:body-only' - - Set this to t to publish only the body of the documents." - :group 'org-export-publish - :type 'alist) - -(defcustom org-publish-use-timestamps-flag t - "Non-nil means use timestamp checking to publish only changed files. -When nil, do no timestamp checking and always publish all files." - :group 'org-export-publish - :type 'boolean) - -(defcustom org-publish-timestamp-directory - (convert-standard-filename "~/.org-timestamps/") - "Name of directory in which to store publishing timestamps." - :group 'org-export-publish - :type 'directory) - -(defcustom org-publish-list-skipped-files t - "Non-nil means show message about files *not* published." - :group 'org-export-publish - :type 'boolean) - -(defcustom org-publish-sitemap-sort-files 'alphabetically - "Method to sort files in site-maps. -Possible values are `alphabetically', `chronologically', -`anti-chronologically' and nil. - -If `alphabetically', files will be sorted alphabetically. If -`chronologically', files will be sorted with older modification -time first. If `anti-chronologically', files will be sorted with -newer modification time first. nil won't sort files. - -You can overwrite this default per project in your -`org-publish-project-alist', using `:sitemap-sort-files'." - :group 'org-export-publish - :type 'symbol) - -(defcustom org-publish-sitemap-sort-folders 'ignore - "A symbol, denoting if folders are sorted first in site-maps. - -Possible values are `first', `last', `ignore' and nil. -If `first', folders will be sorted before files. -If `last', folders are sorted to the end after the files. -If `ignore', folders do not appear in the site-map. -Any other value will mix files and folders. - -You can overwrite this default per project in your -`org-publish-project-alist', using `:sitemap-sort-folders'. - -This variable is ignored when site-map style is `tree'." - :group 'org-export-publish - :type '(choice - (const :tag "Folders before files" first) - (const :tag "Folders after files" last) - (const :tag "No folder in site-map" ignore) - (const :tag "Mix folders and files" nil)) - :version "26.1" - :package-version '(Org . "9.1") - :safe #'symbolp) - -(defcustom org-publish-sitemap-sort-ignore-case nil - "Non-nil when site-map sorting should ignore case. - -You can overwrite this default per project in your -`org-publish-project-alist', using `:sitemap-ignore-case'." - :group 'org-export-publish - :type 'boolean) - - - -;;; Timestamp-related functions - -(defun org-publish-timestamp-filename (filename &optional pub-dir pub-func) - "Return path to timestamp file for filename FILENAME." - (setq filename (concat filename "::" (or pub-dir "") "::" - (format "%s" (or pub-func "")))) - (concat "X" (if (fboundp 'sha1) (sha1 filename) (md5 filename)))) - -(defun org-publish-needed-p - (filename &optional pub-dir pub-func _true-pub-dir base-dir) - "Non-nil if FILENAME should be published in PUB-DIR using PUB-FUNC. -TRUE-PUB-DIR is where the file will truly end up. Currently we -are not using this - maybe it can eventually be used to check if -the file is present at the target location, and how old it is. -Right now we cannot do this, because we do not know under what -file name the file will be stored - the publishing function can -still decide about that independently." - (let ((rtn (if (not org-publish-use-timestamps-flag) t - (org-publish-cache-file-needs-publishing - filename pub-dir pub-func base-dir)))) - (if rtn (message "Publishing file %s using `%s'" filename pub-func) - (when org-publish-list-skipped-files - (message "Skipping unmodified file %s" filename))) - rtn)) - -(defun org-publish-update-timestamp - (filename &optional pub-dir pub-func _base-dir) - "Update publishing timestamp for file FILENAME. -If there is no timestamp, create one." - (let ((key (org-publish-timestamp-filename filename pub-dir pub-func)) - (stamp (org-publish-cache-ctime-of-src filename))) - (org-publish-cache-set key stamp))) - -(defun org-publish-remove-all-timestamps () - "Remove all files in the timestamp directory." - (let ((dir org-publish-timestamp-directory)) - (when (and (file-exists-p dir) (file-directory-p dir)) - (mapc #'delete-file (directory-files dir 'full "[^.]\\'")) - (org-publish-reset-cache)))) - - - -;;; Getting project information out of `org-publish-project-alist' - -(defun org-publish-property (property project &optional default) - "Return value PROPERTY, as a symbol, in PROJECT. -DEFAULT is returned when PROPERTY is not actually set in PROJECT -definition." - (let ((properties (cdr project))) - (if (plist-member properties property) - (plist-get properties property) - default))) - -(defun org-publish--expand-file-name (file project) - "Return full file name for FILE in PROJECT. -When FILE is a relative file name, it is expanded according to -project base directory." - (if (file-name-absolute-p file) file - (expand-file-name file (org-publish-property :base-directory project)))) - -(defun org-publish-expand-projects (projects-alist) - "Expand projects in PROJECTS-ALIST. -This splices all the components into the list." - (let ((rest projects-alist) rtn p components) - (while (setq p (pop rest)) - (if (setq components (plist-get (cdr p) :components)) - (setq rest (append - (mapcar - (lambda (x) - (or (assoc x org-publish-project-alist) - (user-error "Unknown component %S in project %S" - x (car p)))) - components) - rest)) - (push p rtn))) - (nreverse (delete-dups (delq nil rtn))))) - -(defun org-publish-get-base-files (project) - "Return a list of all files in PROJECT." - (let* ((base-dir (file-name-as-directory - (org-publish-property :base-directory project))) - (extension (or (org-publish-property :base-extension project) "org")) - (match (if (eq extension 'any) "" - (format "^[^\\.].*\\.\\(%s\\)$" extension))) - (base-files - (cond ((not (file-exists-p base-dir)) nil) - ((not (org-publish-property :recursive project)) - (cl-remove-if #'file-directory-p - (directory-files base-dir t match t))) - (t - ;; Find all files recursively. Unlike to - ;; `directory-files-recursively', we follow symlinks - ;; to other directories. - (letrec ((files nil) - (walk-tree - (lambda (dir depth) - (when (> depth 100) - (error "Apparent cycle of symbolic links for %S" - base-dir)) - (dolist (f (file-name-all-completions "" dir)) - (pcase f - ((or "./" "../") nil) - ((pred directory-name-p) - (funcall walk-tree - (expand-file-name f dir) - (1+ depth))) - ((pred (string-match match)) - (push (expand-file-name f dir) files)) - (_ nil))) - files))) - (funcall walk-tree base-dir 0)))))) - (org-uniquify - (append - ;; Files from BASE-DIR. Apply exclusion filter before adding - ;; included files. - (let ((exclude-regexp (org-publish-property :exclude project))) - (if exclude-regexp - (cl-remove-if - (lambda (f) - ;; Match against relative names, yet BASE-DIR file - ;; names are absolute. - (string-match exclude-regexp - (file-relative-name f base-dir))) - base-files) - base-files)) - ;; Sitemap file. - (and (org-publish-property :auto-sitemap project) - (list (expand-file-name - (or (org-publish-property :sitemap-filename project) - "sitemap.org") - base-dir))) - ;; Included files. - (mapcar (lambda (f) (expand-file-name f base-dir)) - (org-publish-property :include project)))))) - -(defun org-publish-get-project-from-filename (filename &optional up) - "Return a project that FILENAME belongs to. -When UP is non-nil, return a meta-project (i.e., with a :components part) -publishing FILENAME." - (let* ((filename (expand-file-name filename)) - (project - (cl-some - (lambda (p) - ;; Ignore meta-projects. - (unless (org-publish-property :components p) - (let ((base (expand-file-name - (org-publish-property :base-directory p)))) - (cond - ;; Check if FILENAME is explicitly included in one - ;; project. - ((cl-some (lambda (f) (file-equal-p f filename)) - (mapcar (lambda (f) (expand-file-name f base)) - (org-publish-property :include p))) - p) - ;; Exclude file names matching :exclude property. - ((let ((exclude-re (org-publish-property :exclude p))) - (and exclude-re - (string-match-p exclude-re - (file-relative-name filename base)))) - nil) - ;; Check :extension. Handle special `any' - ;; extension. - ((let ((extension (org-publish-property :base-extension p))) - (not (or (eq extension 'any) - (string= (or extension "org") - (file-name-extension filename))))) - nil) - ;; Check if FILENAME belong to project's base - ;; directory, or some of its sub-directories - ;; if :recursive in non-nil. - ((member filename (org-publish-get-base-files p)) p) - (t nil))))) - org-publish-project-alist))) - (cond - ((not project) nil) - ((not up) project) - ;; When optional argument UP is non-nil, return the top-most - ;; meta-project effectively publishing FILENAME. - (t - (letrec ((find-parent-project - (lambda (project) - (or (cl-some - (lambda (p) - (and (member (car project) - (org-publish-property :components p)) - (funcall find-parent-project p))) - org-publish-project-alist) - project)))) - (funcall find-parent-project project)))))) - - - -;;; Tools for publishing functions in back-ends - -(defun org-publish-org-to (backend filename extension plist &optional pub-dir) - "Publish an Org file to a specified back-end. - -BACKEND is a symbol representing the back-end used for -transcoding. FILENAME is the filename of the Org file to be -published. EXTENSION is the extension used for the output -string, with the leading dot. PLIST is the property list for the -given project. - -Optional argument PUB-DIR, when non-nil is the publishing -directory. - -Return output file name." - (unless (or (not pub-dir) (file-exists-p pub-dir)) (make-directory pub-dir t)) - ;; Check if a buffer visiting FILENAME is already open. - (let* ((org-inhibit-startup t) - (visiting (find-buffer-visiting filename)) - (work-buffer (or visiting (find-file-noselect filename)))) - (unwind-protect - (with-current-buffer work-buffer - (let ((output (org-export-output-file-name extension nil pub-dir))) - (org-export-to-file backend output - nil nil nil (plist-get plist :body-only) - ;; Add `org-publish--store-crossrefs' and - ;; `org-publish-collect-index' to final output filters. - ;; The latter isn't dependent on `:makeindex', since we - ;; want to keep it up-to-date in cache anyway. - (org-combine-plists - plist - `(:crossrefs - ,(org-publish-cache-get-file-property - ;; Normalize file names in cache. - (file-truename filename) :crossrefs nil t) - :filter-final-output - (org-publish--store-crossrefs - org-publish-collect-index - ,@(plist-get plist :filter-final-output))))))) - ;; Remove opened buffer in the process. - (unless visiting (kill-buffer work-buffer))))) - -(defun org-publish-attachment (_plist filename pub-dir) - "Publish a file with no transformation of any kind. - -FILENAME is the filename of the Org file to be published. PLIST -is the property list for the given project. PUB-DIR is the -publishing directory. - -Return output file name." - (unless (file-directory-p pub-dir) - (make-directory pub-dir t)) - (let ((output (expand-file-name (file-name-nondirectory filename) pub-dir))) - (unless (file-equal-p (expand-file-name (file-name-directory filename)) - (file-name-as-directory (expand-file-name pub-dir))) - (copy-file filename output t)) - ;; Return file name. - output)) - - - -;;; Publishing files, sets of files - -(defun org-publish-file (filename &optional project no-cache) - "Publish file FILENAME from PROJECT. -If NO-CACHE is not nil, do not initialize `org-publish-cache'. -This is needed, since this function is used to publish single -files, when entire projects are published (see -`org-publish-projects')." - (let* ((project - (or project - (org-publish-get-project-from-filename filename) - (user-error "File %S is not part of any known project" - (abbreviate-file-name filename)))) - (project-plist (cdr project)) - (publishing-function - (pcase (org-publish-property :publishing-function project) - (`nil (user-error "No publishing function chosen")) - ((and f (pred listp)) f) - (f (list f)))) - (base-dir - (file-name-as-directory - (or (org-publish-property :base-directory project) - (user-error "Project %S does not have :base-directory defined" - (car project))))) - (pub-base-dir - (file-name-as-directory - (or (org-publish-property :publishing-directory project) - (user-error - "Project %S does not have :publishing-directory defined" - (car project))))) - (pub-dir - (file-name-directory - (expand-file-name (file-relative-name filename base-dir) - pub-base-dir)))) - - (unless no-cache (org-publish-initialize-cache (car project))) - - ;; Allow chain of publishing functions. - (dolist (f publishing-function) - (when (org-publish-needed-p filename pub-base-dir f pub-dir base-dir) - (let ((output (funcall f project-plist filename pub-dir))) - (org-publish-update-timestamp filename pub-base-dir f base-dir) - (run-hook-with-args 'org-publish-after-publishing-hook - filename - output)))) - ;; Make sure to write cache to file after successfully publishing - ;; a file, so as to minimize impact of a publishing failure. - (org-publish-write-cache-file))) - -(defun org-publish-projects (projects) - "Publish all files belonging to the PROJECTS alist. -If `:auto-sitemap' is set, publish the sitemap too. If -`:makeindex' is set, also produce a file \"theindex.org\"." - (dolist (project (org-publish-expand-projects projects)) - (let ((plist (cdr project))) - (let ((fun (org-publish-property :preparation-function project))) - (cond - ((consp fun) (dolist (f fun) (funcall f plist))) - ((functionp fun) (funcall fun plist)))) - ;; Each project uses its own cache file. - (org-publish-initialize-cache (car project)) - (when (org-publish-property :auto-sitemap project) - (let ((sitemap-filename - (or (org-publish-property :sitemap-filename project) - "sitemap.org"))) - (org-publish-sitemap project sitemap-filename))) - ;; Publish all files from PROJECT except "theindex.org". Its - ;; publishing will be deferred until "theindex.inc" is - ;; populated. - (let ((theindex - (expand-file-name "theindex.org" - (org-publish-property :base-directory project)))) - (dolist (file (org-publish-get-base-files project)) - (unless (file-equal-p file theindex) - (org-publish-file file project t))) - ;; Populate "theindex.inc", if needed, and publish - ;; "theindex.org". - (when (org-publish-property :makeindex project) - (org-publish-index-generate-theindex - project (org-publish-property :base-directory project)) - (org-publish-file theindex project t))) - (let ((fun (org-publish-property :completion-function project))) - (cond - ((consp fun) (dolist (f fun) (funcall f plist))) - ((functionp fun) (funcall fun plist))))) - (org-publish-write-cache-file))) - - -;;; Site map generation - -(defun org-publish--sitemap-files-to-lisp (files project style format-entry) - "Represent FILES as a parsed plain list. -FILES is the list of files in the site map. PROJECT is the -current project. STYLE determines is either `list' or `tree'. -FORMAT-ENTRY is a function called on each file which should -return a string. Return value is a list as returned by -`org-list-to-lisp'." - (let ((root (expand-file-name - (file-name-as-directory - (org-publish-property :base-directory project))))) - (pcase style - (`list - (cons 'unordered - (mapcar - (lambda (f) - (list (funcall format-entry - (file-relative-name f root) - style - project))) - files))) - (`tree - (letrec ((files-only (cl-remove-if #'directory-name-p files)) - (directories (cl-remove-if-not #'directory-name-p files)) - (subtree-to-list - (lambda (dir) - (cons 'unordered - (nconc - ;; Files in DIR. - (mapcar - (lambda (f) - (list (funcall format-entry - (file-relative-name f root) - style - project))) - (cl-remove-if-not - (lambda (f) (string= dir (file-name-directory f))) - files-only)) - ;; Direct sub-directories. - (mapcar - (lambda (sub) - (list (funcall format-entry - (file-relative-name sub root) - style - project) - (funcall subtree-to-list sub))) - (cl-remove-if-not - (lambda (f) - (string= - dir - ;; Parent directory. - (file-name-directory (directory-file-name f)))) - directories))))))) - (funcall subtree-to-list root))) - (_ (user-error "Unknown site-map style: `%s'" style))))) - -(defun org-publish-sitemap (project &optional sitemap-filename) - "Create a sitemap of pages in set defined by PROJECT. -Optionally set the filename of the sitemap with SITEMAP-FILENAME. -Default for SITEMAP-FILENAME is `sitemap.org'." - (let* ((root (expand-file-name - (file-name-as-directory - (org-publish-property :base-directory project)))) - (sitemap-filename (concat root (or sitemap-filename "sitemap.org"))) - (title (or (org-publish-property :sitemap-title project) - (concat "Sitemap for project " (car project)))) - (style (or (org-publish-property :sitemap-style project) - 'tree)) - (sitemap-builder (or (org-publish-property :sitemap-function project) - #'org-publish-sitemap-default)) - (format-entry (or (org-publish-property :sitemap-format-entry project) - #'org-publish-sitemap-default-entry)) - (sort-folders - (org-publish-property :sitemap-sort-folders project - org-publish-sitemap-sort-folders)) - (sort-files - (org-publish-property :sitemap-sort-files project - org-publish-sitemap-sort-files)) - (ignore-case - (org-publish-property :sitemap-ignore-case project - org-publish-sitemap-sort-ignore-case)) - (org-file-p (lambda (f) (equal "org" (file-name-extension f)))) - (sort-predicate - (lambda (a b) - (let ((retval t)) - ;; First we sort files: - (pcase sort-files - (`alphabetically - (let ((A (if (funcall org-file-p a) - (concat (file-name-directory a) - (org-publish-find-title a project)) - a)) - (B (if (funcall org-file-p b) - (concat (file-name-directory b) - (org-publish-find-title b project)) - b))) - (setq retval - (if ignore-case - (not (string-lessp (upcase B) (upcase A))) - (not (string-lessp B A)))))) - ((or `anti-chronologically `chronologically) - (let* ((adate (org-publish-find-date a project)) - (bdate (org-publish-find-date b project))) - (setq retval - (not (if (eq sort-files 'chronologically) - (time-less-p bdate adate) - (time-less-p adate bdate)))))) - (`nil nil) - (_ (user-error "Invalid sort value %s" sort-files))) - ;; Directory-wise wins: - (when (memq sort-folders '(first last)) - ;; a is directory, b not: - (cond - ((and (file-directory-p a) (not (file-directory-p b))) - (setq retval (eq sort-folders 'first))) - ;; a is not a directory, but b is: - ((and (not (file-directory-p a)) (file-directory-p b)) - (setq retval (eq sort-folders 'last))))) - retval)))) - (message "Generating sitemap for %s" title) - (with-temp-file sitemap-filename - (insert - (let ((files (remove sitemap-filename - (org-publish-get-base-files project)))) - ;; Add directories, if applicable. - (unless (and (eq style 'list) (eq sort-folders 'ignore)) - (setq files - (nconc (remove root (org-uniquify - (mapcar #'file-name-directory files))) - files))) - ;; Eventually sort all entries. - (when (or sort-files (not (memq sort-folders 'ignore))) - (setq files (sort files sort-predicate))) - (funcall sitemap-builder - title - (org-publish--sitemap-files-to-lisp - files project style format-entry))))))) - -(defun org-publish-find-property (file property project &optional backend) - "Find the PROPERTY of FILE in project. - -PROPERTY is a keyword referring to an export option, as defined -in `org-export-options-alist' or in export back-ends. In the -latter case, optional argument BACKEND has to be set to the -back-end where the option is defined, e.g., - - (org-publish-find-property file :subtitle 'latex) - -Return value may be a string or a list, depending on the type of -PROPERTY, i.e. \"behavior\" parameter from `org-export-options-alist'." - (let ((file (org-publish--expand-file-name file project))) - (when (and (file-readable-p file) (not (directory-name-p file))) - (let* ((org-inhibit-startup t) - (visiting (find-buffer-visiting file)) - (buffer (or visiting (find-file-noselect file)))) - (unwind-protect - (plist-get (with-current-buffer buffer - (if (not visiting) (org-export-get-environment backend) - ;; Protect local variables in open buffers. - (org-export-with-buffer-copy - (org-export-get-environment backend)))) - property) - (unless visiting (kill-buffer buffer))))))) - -(defun org-publish-find-title (file project) - "Find the title of FILE in PROJECT." - (let ((file (org-publish--expand-file-name file project))) - (or (org-publish-cache-get-file-property file :title nil t) - (let* ((parsed-title (org-publish-find-property file :title project)) - (title - (if parsed-title - ;; Remove property so that the return value is - ;; cache-able (i.e., it can be `read' back). - (org-no-properties - (org-element-interpret-data parsed-title)) - (file-name-nondirectory (file-name-sans-extension file))))) - (org-publish-cache-set-file-property file :title title))))) - -(defun org-publish-find-date (file project) - "Find the date of FILE in PROJECT. -This function assumes FILE is either a directory or an Org file. -If FILE is an Org file and provides a DATE keyword use it. In -any other case use the file system's modification time. Return -time in `current-time' format." - (let ((file (org-publish--expand-file-name file project))) - (or (org-publish-cache-get-file-property file :date nil t) - (org-publish-cache-set-file-property - file :date - (if (file-directory-p file) - (file-attribute-modification-time (file-attributes file)) - (let ((date (org-publish-find-property file :date project))) - ;; DATE is a secondary string. If it contains - ;; a time-stamp, convert it to internal format. - ;; Otherwise, use FILE modification time. - (cond ((let ((ts (and (consp date) (assq 'timestamp date)))) - (and ts - (let ((value (org-element-interpret-data ts))) - (and (org-string-nw-p value) - (org-time-string-to-time value)))))) - ((file-exists-p file) - (file-attribute-modification-time (file-attributes file))) - (t (error "No such file: \"%s\"" file))))))))) - -(defun org-publish-sitemap-default-entry (entry style project) - "Default format for site map ENTRY, as a string. -ENTRY is a file name. STYLE is the style of the sitemap. -PROJECT is the current project." - (cond ((not (directory-name-p entry)) - (format "[[file:%s][%s]]" - entry - (org-publish-find-title entry project))) - ((eq style 'tree) - ;; Return only last subdir. - (file-name-nondirectory (directory-file-name entry))) - (t entry))) - -(defun org-publish-sitemap-default (title list) - "Default site map, as a string. -TITLE is the title of the site map. LIST is an internal -representation for the files to include, as returned by -`org-list-to-lisp'. PROJECT is the current project." - (concat "#+TITLE: " title "\n\n" - (org-list-to-org list))) - - -;;; Interactive publishing functions - -;;;###autoload -(defalias 'org-publish-project 'org-publish) - -;;;###autoload -(defun org-publish (project &optional force async) - "Publish PROJECT. - -PROJECT is either a project name, as a string, or a project -alist (see `org-publish-project-alist' variable). - -When optional argument FORCE is non-nil, force publishing all -files in PROJECT. With a non-nil optional argument ASYNC, -publishing will be done asynchronously, in another process." - (interactive - (list (assoc (completing-read "Publish project: " - org-publish-project-alist nil t) - org-publish-project-alist) - current-prefix-arg)) - (let ((project (if (not (stringp project)) project - ;; If this function is called in batch mode, - ;; PROJECT is still a string here. - (assoc project org-publish-project-alist)))) - (cond - ((not project)) - (async - (org-export-async-start (lambda (_) nil) - `(let ((org-publish-use-timestamps-flag - ,(and (not force) org-publish-use-timestamps-flag))) - ;; Expand components right now as external process may not - ;; be aware of complete `org-publish-project-alist'. - (org-publish-projects - ',(org-publish-expand-projects (list project)))))) - (t (save-window-excursion - (let ((org-publish-use-timestamps-flag - (and (not force) org-publish-use-timestamps-flag))) - (org-publish-projects (list project)))))))) - -;;;###autoload -(defun org-publish-all (&optional force async) - "Publish all projects. -With prefix argument FORCE, remove all files in the timestamp -directory and force publishing all projects. With a non-nil -optional argument ASYNC, publishing will be done asynchronously, -in another process." - (interactive "P") - (if async - (org-export-async-start (lambda (_) nil) - `(progn - (when ',force (org-publish-remove-all-timestamps)) - (let ((org-publish-use-timestamps-flag - (if ',force nil ,org-publish-use-timestamps-flag))) - (org-publish-projects ',org-publish-project-alist)))) - (when force (org-publish-remove-all-timestamps)) - (save-window-excursion - (let ((org-publish-use-timestamps-flag - (if force nil org-publish-use-timestamps-flag))) - (org-publish-projects org-publish-project-alist))))) - - -;;;###autoload -(defun org-publish-current-file (&optional force async) - "Publish the current file. -With prefix argument FORCE, force publish the file. When -optional argument ASYNC is non-nil, publishing will be done -asynchronously, in another process." - (interactive "P") - (let ((file (buffer-file-name (buffer-base-buffer)))) - (if async - (org-export-async-start (lambda (_) nil) - `(let ((org-publish-use-timestamps-flag - (if ',force nil ,org-publish-use-timestamps-flag))) - (org-publish-file ,file))) - (save-window-excursion - (let ((org-publish-use-timestamps-flag - (if force nil org-publish-use-timestamps-flag))) - (org-publish-file file)))))) - -;;;###autoload -(defun org-publish-current-project (&optional force async) - "Publish the project associated with the current file. -With a prefix argument, force publishing of all files in -the project." - (interactive "P") - (save-window-excursion - (let ((project (org-publish-get-project-from-filename - (buffer-file-name (buffer-base-buffer)) 'up))) - (if project (org-publish project force async) - (error "File %s is not part of any known project" - (buffer-file-name (buffer-base-buffer))))))) - - - -;;; Index generation - -(defun org-publish-collect-index (output _backend info) - "Update index for a file in cache. - -OUTPUT is the output from transcoding current file. BACKEND is -the back-end that was used for transcoding. INFO is a plist -containing publishing and export options. - -The index relative to current file is stored as an alist. An -association has the following shape: (TERM FILE-NAME PARENT), -where TERM is the indexed term, as a string, FILE-NAME is the -original full path of the file where the term in encountered, and -PARENT is a reference to the headline, if any, containing the -original index keyword. When non-nil, this reference is a cons -cell. Its CAR is a symbol among `id', `custom-id' and `name' and -its CDR is a string." - (let ((file (file-truename (plist-get info :input-file)))) - (org-publish-cache-set-file-property - file :index - (delete-dups - (org-element-map (plist-get info :parse-tree) 'keyword - (lambda (k) - (when (equal (org-element-property :key k) "INDEX") - (let ((parent (org-export-get-parent-headline k))) - (list (org-element-property :value k) - file - (cond - ((not parent) nil) - ((let ((id (org-element-property :ID parent))) - (and id (cons 'id id)))) - ((let ((id (org-element-property :CUSTOM_ID parent))) - (and id (cons 'custom-id id)))) - (t (cons 'name - ;; Remove statistics cookie. - (replace-regexp-in-string - "\\[[0-9]+%\\]\\|\\[[0-9]+/[0-9]+\\]" "" - (org-element-property :raw-value parent))))))))) - info)))) - ;; Return output unchanged. - output) - -(defun org-publish-index-generate-theindex (project directory) - "Retrieve full index from cache and build \"theindex.org\". -PROJECT is the project the index relates to. DIRECTORY is the -publishing directory." - (let ((all-files (org-publish-get-base-files project)) - full-index) - ;; Compile full index and sort it alphabetically. - (dolist (file all-files - (setq full-index - (sort (nreverse full-index) - (lambda (a b) (string< (downcase (car a)) - (downcase (car b))))))) - (let ((index (org-publish-cache-get-file-property file :index))) - (dolist (term index) - (unless (member term full-index) (push term full-index))))) - ;; Write "theindex.inc" in DIRECTORY. - (with-temp-file (expand-file-name "theindex.inc" directory) - (let ((current-letter nil) (last-entry nil)) - (dolist (idx full-index) - (let* ((entry (org-split-string (car idx) "!")) - (letter (upcase (substring (car entry) 0 1))) - ;; Transform file into a path relative to publishing - ;; directory. - (file (file-relative-name - (nth 1 idx) - (plist-get (cdr project) :base-directory)))) - ;; Check if another letter has to be inserted. - (unless (string= letter current-letter) - (insert (format "* %s\n" letter))) - ;; Compute the first difference between last entry and - ;; current one: it tells the level at which new items - ;; should be added. - (let* ((rank - (if (equal entry last-entry) (1- (length entry)) - (cl-loop for n from 0 to (length entry) - unless (equal (nth n entry) (nth n last-entry)) - return n))) - (len (length (nthcdr rank entry)))) - ;; For each term after the first difference, create - ;; a new sub-list with the term as body. Moreover, - ;; linkify the last term. - (dotimes (n len) - (insert - (concat - (make-string (* (+ rank n) 2) ?\s) " - " - (if (not (= (1- len) n)) (nth (+ rank n) entry) - ;; Last term: Link it to TARGET, if possible. - (let ((target (nth 2 idx))) - (format - "[[%s][%s]]" - ;; Destination. - (pcase (car target) - (`nil (format "file:%s" file)) - (`id (format "id:%s" (cdr target))) - (`custom-id (format "file:%s::#%s" file (cdr target))) - (_ (format "file:%s::*%s" file (cdr target)))) - ;; Description. - (car (last entry))))) - "\n")))) - (setq current-letter letter last-entry entry)))) - ;; Create "theindex.org", if it doesn't exist yet, and provide - ;; a default index file. - (let ((index.org (expand-file-name "theindex.org" directory))) - (unless (file-exists-p index.org) - (with-temp-file index.org - (insert "#+TITLE: Index\n\n#+INCLUDE: \"theindex.inc\"\n\n"))))))) - - - -;;; External Fuzzy Links Resolution -;; -;; This part implements tools to resolve [[file.org::*Some headline]] -;; links, where "file.org" belongs to the current project. - -(defun org-publish--store-crossrefs (output _backend info) - "Store cross-references for current published file. - -OUTPUT is the produced output, as a string. BACKEND is the export -back-end used, as a symbol. INFO is the final export state, as -a plist. - -This function is meant to be used as a final output filter. See -`org-publish-org-to'." - (org-publish-cache-set-file-property - (file-truename (plist-get info :input-file)) - :crossrefs - ;; Update `:crossrefs' so as to remove unused references and search - ;; cells. Actually used references are extracted from - ;; `:internal-references', with references as strings removed. See - ;; `org-export-get-reference' for details. - (cl-remove-if (lambda (pair) (stringp (car pair))) - (plist-get info :internal-references))) - ;; Return output unchanged. - output) - -(defun org-publish-resolve-external-link (search file &optional prefer-custom) - "Return reference for element matching string SEARCH in FILE. - -Return value is an internal reference, as a string. - -This function allows resolving external links with a search -option, e.g., - - [[file:file.org::*heading][description]] - [[file:file.org::#custom-id][description]] - [[file:file.org::fuzzy][description]] - -When PREFER-CUSTOM is non-nil, and SEARCH targets a headline in -FILE, return its custom ID, if any. - -It only makes sense to use this if export back-end builds -references with `org-export-get-reference'." - (cond - ((and prefer-custom - (if (string-prefix-p "#" search) - (substring search 1) - (with-current-buffer (find-file-noselect file) - (org-with-point-at 1 - (let ((org-link-search-must-match-exact-headline t)) - (condition-case err - (org-link-search search nil t) - (error - (signal 'org-link-broken (cdr err))))) - (and (org-at-heading-p) - (org-string-nw-p (org-entry-get (point) "CUSTOM_ID")))))))) - ((not org-publish-cache) - (progn - (message "Reference %S in file %S cannot be resolved without publishing" - search - file) - "MissingReference")) - (t - (let* ((filename (file-truename file)) - (crossrefs - (org-publish-cache-get-file-property filename :crossrefs nil t)) - (cells (org-export-string-to-search-cell search))) - (or - ;; Look for reference associated to search cells triggered by - ;; LINK. It can match when targeted file has been published - ;; already. - (let ((known (cdr (cl-some (lambda (c) (assoc c crossrefs)) cells)))) - (and known (org-export-format-reference known))) - ;; Search cell is unknown so far. Generate a new internal - ;; reference that will be used when the targeted file will be - ;; published. - (let ((new (org-export-new-reference crossrefs))) - (dolist (cell cells) (push (cons cell new) crossrefs)) - (org-publish-cache-set-file-property filename :crossrefs crossrefs) - (org-export-format-reference new))))))) - -(defun org-publish-file-relative-name (filename info) - "Convert FILENAME to be relative to current project's base directory. -INFO is the plist containing the current export state. The -function does not change relative file names." - (let ((base (plist-get info :base-directory))) - (if (and base - (file-name-absolute-p filename) - (file-in-directory-p filename base)) - (file-relative-name filename base) - filename))) - - - -;;; Caching functions - -(defun org-publish-write-cache-file (&optional free-cache) - "Write `org-publish-cache' to file. -If FREE-CACHE, empty the cache." - (unless org-publish-cache - (error "`org-publish-write-cache-file' called, but no cache present")) - - (let ((cache-file (org-publish-cache-get ":cache-file:"))) - (unless cache-file - (error "Cannot find cache-file name in `org-publish-write-cache-file'")) - (with-temp-file cache-file - (let (print-level print-length) - (insert "(setq org-publish-cache \ -\(make-hash-table :test 'equal :weakness nil :size 100))\n") - (maphash (lambda (k v) - (insert - (format "(puthash %S %s%S org-publish-cache)\n" - k (if (or (listp v) (symbolp v)) "'" "") v))) - org-publish-cache))) - (when free-cache (org-publish-reset-cache)))) - -(defun org-publish-initialize-cache (project-name) - "Initialize the projects cache if not initialized yet and return it." - - (unless project-name - (error "Cannot initialize `org-publish-cache' without projects name in \ -`org-publish-initialize-cache'")) - - (unless (file-exists-p org-publish-timestamp-directory) - (make-directory org-publish-timestamp-directory t)) - (unless (file-directory-p org-publish-timestamp-directory) - (error "Org publish timestamp: %s is not a directory" - org-publish-timestamp-directory)) - - (unless (and org-publish-cache - (string= (org-publish-cache-get ":project:") project-name)) - (let* ((cache-file - (concat - (expand-file-name org-publish-timestamp-directory) - project-name ".cache")) - (cexists (file-exists-p cache-file))) - - (when org-publish-cache (org-publish-reset-cache)) - - (if cexists (load-file cache-file) - (setq org-publish-cache - (make-hash-table :test 'equal :weakness nil :size 100)) - (org-publish-cache-set ":project:" project-name) - (org-publish-cache-set ":cache-file:" cache-file)) - (unless cexists (org-publish-write-cache-file nil)))) - org-publish-cache) - -(defun org-publish-reset-cache () - "Empty org-publish-cache and reset it nil." - (message "%s" "Resetting org-publish-cache") - (when (hash-table-p org-publish-cache) - (clrhash org-publish-cache)) - (setq org-publish-cache nil)) - -(defun org-publish-cache-file-needs-publishing - (filename &optional pub-dir pub-func _base-dir) - "Check the timestamp of the last publishing of FILENAME. -Return non-nil if the file needs publishing. Also check if -any included files have been more recently published, so that -the file including them will be republished as well." - (unless org-publish-cache - (error - "`org-publish-cache-file-needs-publishing' called, but no cache present")) - (let* ((key (org-publish-timestamp-filename filename pub-dir pub-func)) - (pstamp (org-publish-cache-get key)) - (org-inhibit-startup t) - included-files-ctime) - (when (equal (file-name-extension filename) "org") - (let ((visiting (find-buffer-visiting filename)) - (buf (find-file-noselect filename)) - (case-fold-search t)) - (unwind-protect - (with-current-buffer buf - (goto-char (point-min)) - (while (re-search-forward "^[ \t]*#\\+INCLUDE:" nil t) - (let ((element (org-element-at-point))) - (when (eq 'keyword (org-element-type element)) - (let* ((value (org-element-property :value element)) - (filename - (and (string-match "\\`\\(\".+?\"\\|\\S-+\\)" value) - (let ((m (org-strip-quotes - (match-string 1 value)))) - ;; Ignore search suffix. - (if (string-match "::.*?\\'" m) - (substring m 0 (match-beginning 0)) - m))))) - (when filename - (push (org-publish-cache-ctime-of-src - (expand-file-name filename)) - included-files-ctime))))))) - (unless visiting (kill-buffer buf))))) - (or (null pstamp) - (let ((ctime (org-publish-cache-ctime-of-src filename))) - (or (time-less-p pstamp ctime) - (cl-some (lambda (ct) (time-less-p ctime ct)) - included-files-ctime)))))) - -(defun org-publish-cache-set-file-property - (filename property value &optional project-name) - "Set the VALUE for a PROPERTY of file FILENAME in publishing cache to VALUE. -Use cache file of PROJECT-NAME. If the entry does not exist, it -will be created. Return VALUE." - ;; Evtl. load the requested cache file: - (when project-name (org-publish-initialize-cache project-name)) - (let ((pl (org-publish-cache-get filename))) - (if pl (progn (plist-put pl property value) value) - (org-publish-cache-get-file-property - filename property value nil project-name)))) - -(defun org-publish-cache-get-file-property - (filename property &optional default no-create project-name) - "Return the value for a PROPERTY of file FILENAME in publishing cache. -Use cache file of PROJECT-NAME. Return the value of that PROPERTY, -or DEFAULT, if the value does not yet exist. Create the entry, -if necessary, unless NO-CREATE is non-nil." - (when project-name (org-publish-initialize-cache project-name)) - (let ((properties (org-publish-cache-get filename))) - (cond ((null properties) - (unless no-create - (org-publish-cache-set filename (list property default))) - default) - ((plist-member properties property) (plist-get properties property)) - (t default)))) - -(defun org-publish-cache-get (key) - "Return the value stored in `org-publish-cache' for key KEY. -Return nil, if no value or nil is found. Raise an error if the -cache does not exist." - (unless org-publish-cache - (error "`org-publish-cache-get' called, but no cache present")) - (gethash key org-publish-cache)) - -(defun org-publish-cache-set (key value) - "Store KEY VALUE pair in `org-publish-cache'. -Returns value on success, else nil. Raise an error if the cache -does not exist." - (unless org-publish-cache - (error "`org-publish-cache-set' called, but no cache present")) - (puthash key value org-publish-cache)) - -(defun org-publish-cache-ctime-of-src (file) - "Get the ctime of FILE as an integer." - (let ((attr (file-attributes - (expand-file-name (or (file-symlink-p file) file) - (file-name-directory file))))) - (if attr (file-attribute-modification-time attr) - (error "No such file: %S" file)))) - - -(provide 'ox-publish) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox-publish.el ends here diff --git a/elpa/org-9.3.6/ox-publish.elc b/elpa/org-9.3.6/ox-publish.elc deleted file mode 100644 index 0a3e60f25c3a6677b2a7d65f214364822d9c6143..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50074 zcmeI5i+3Bzb>{WtjOb&>c1{vIk4+02S>%jB<4uW9)}knCtk@$ddib%TY=R^xAp!vo z07^rj-R!@TUp(X6(e9bKv8Me@4l*kvi*y#zd3jA-11L;@{??9 zbadPw^bYKzKg_m|y8DytZErm3kA_*Jv(~gH@A}i%S$8nVM#t0sQUCYdDUT;>%l7cu z>;5D=q?PPs(wk%lr^D`1e?L1I?N6rT{_xf0CQrwcY1TbB=pAI~E%n=LjoWi=9E@mV zIGSerqv5nm;gjiM^%i%A)y=0{4<2Ouue;;!{**4>wAXis2iatl?RSUSUN0Mrx}}$d zp-i$~cRc9##@X~W1shF&FH`VG{ihE6vHvYEFR$#KPJ7k;(Lpb(>@;gN{?xDTH0t`H zKaJu=lZ)DVC3`XMeRb2XMtPUEM9gz9{pQyf68Lt9gOzh zOjwtb!9n)AJ9(W=UU%!++wS0m`mcNA-r7GduN?Fa-*(5@X#A=gTB-VLhy6jea_y6B zEog1?5oK7~Dr;Ho2>}8`vD)P^`|EfRi4*XR%4KpP~(8~<| z;AEfoFCJL;5HgIzWU{K(oqV93c8h^7T3szFf13Ph@u$t74u95v^pP*SmcCx+52fmq zs<-altf`BMAMLi^dMqUSBzYSGsgwc52GeLJ7Gc46My z4YkwOJQv4h^I)53|70>99aRr{`-ASdSA8`eog5qS_P#nEji+&OGc9W65!?^HXM3fv zMY`FfHx*@xW+rQuY-8GeMd|UY>~Y#i+?{Pan|V3=rr+Izj}|vi*nib78**wJKzulD zgljKqfoC{Vpr0?Z`pc}cIhl<1`^Km^dbyUtZL|?#0Eat6+tabWRdI=MGdmgf zzdY#;PP6_2ZTAmP)fa8dQbRk#{R6e+%%RW_+kZ4noB41w7>wSj1@XYi216Ov*Rsv* zU2ia`>K8VeK3pBXS+ukr6o*eBV8T1|>>*VInFv}2lZ0{jcNXu_}r_L^& z-QCQ@XG6b_5lBZpNhG5ThGEqU6vE5*dy|PKSq*2|%0}vsHJHs_udS_Rt18~mKxn;N z4O5fBVf(|rD6!NFy5IG|Y3g~$4cNz&qM-Fu>0LV(7#;OcB*WySl9z!>$U2k{-)0^PK>;#8|awQV$N3^m)`$h&xB zXUM+HrrkH{!$=}Ne;DhAG2G1Fz3xM?zR#wkS3MdY?+k5QW-czZmIwXAL!=cnU05O^ z8)2F(v*DhOPU6#@;pBu?p?4RBE?{Q{_=(otI#>^)9?aYcx%^MaYAHzUiC$P zU6-K}YP*FdwE zE#T>Dc5ota7JJA~hW@kBJ9fnQrr|tsIx#lw6|G~C%kjn9JL6M5dS%1=Vg!F;iZr-B z-O{r8q;>~4v%QlkC=CHTd2RTiJ9yV+N3oo|!gg%Ny6<%-z3Ks=W`8;wpR)G8UGBv@ z5fqj?PQxeT{a#?dUMaNI`)b-73d^Rpw&R^_MFShrFOlEDXnJ*3^i*m~?2Kh{Z0UXJ zLP)Pp5EdB{f@xOc%-n-R1Fg28H`z$6BU>mU6V~7$>rT7{_HXxOFr|Lzn^*5oGhVgJ z+CWPE;r`$RI4BxY_l$&{D>=`Kea{<-72fu4sPDq)l9OH+Y8D5It0|HYW13rJBNUj!1Y#bC z#-B0d-HqN?HVHQ(Rh?!>-BXc_O()EN`Dg#2DnN2l75v4A(atmsGEOq_f&)m1t8B#QxzxE-Z4tS@iE(to}up9YaSt`O;Q5218+Eu zFk}+g^WC5Yau|W{D*%c7{1Qhvj9R_3FTkZ7$LlO_X8V0^LTUxB$+w>FF_3 z8QL_gwRc)#y6n9!9RoP%-(vl^F-*;hqI`EF?_V|cKk=ITg#m?fHV8Ux&?=2w1ZiTu zm%-zGyN%urvz7i@Z_WG1iuS&WaI`udRgVu2B@-mnO=`TJ9u11mb$w%%SAF4|ra)7n zTPWt@>uSLT=f3E~KwBJ&WRhmvq%+gpAHE&EaV36wG9KC*Z=$WkI`Z{}X^r0bwlShb z07;#PouPb7M)W{TJ%*W!RB502Ow#H5+~|FUk~-+!v<>KLr&PS`^M}tF)Ekx-O|YAG z{}H#eClJJ=3^F`{n}s&%vGWEArM;6r+!vTX9qkMcm{uEw#EQD`Q+U(?*~bHp`L7us?(vkzv9ljt4fnCxD!>_V~HulH8F3@YHD3``!f=(O?Rb6^|#oiH9I$w>7_8L8{V*e9h3Kd+qS5cKGrFz9T z1q5J)yxQwt_h8T;_NoI!KWmu&D^{B+z|w!ksxyVWCTfrEF;_9qs3|O0ohccs4`^V1j!MfhL6r)Hyp{}nEDp@GDz2A$ zTdFlv$ZJ|px?>>F+ulKSI_|+z?7!kb7ZfViUO;d2wXIO0)*`x_s}%|rs)>8&!#ks^ zDpag9?!J?%Ui@$FRR>DGv^y#6jJb-1LWQaZYGOab zzjIZsP@&Q>n-k{vs#tHXQY=)gH^$D@#{yLNZ@ykARH~PB+EjBvy;!JFb8^(hg!tu2 zaaQMQ77G>Y%D&Vc1Sad`I$yV3s91f96qro=`xE>Mqc>oK8>Q{7pU*M#g(f1<(d=q&J6`n#>D` z#@oCf6lLpoP~&9j3F8D`-E)(SDcL)f(9oLMaORpfe_0yYGcB6gjpD3nhGv>nZ{lpu zwKtib+Om6Jx7>}nDy?8mFW_2VJ85hKq&dbd zCQl-rW`!k_J;3V%=1%s}>8zuAUNnU1_2b^5a7Ix6R3MCal_6=7i<9Utnj5R5QI*_P9yln&ZO3qPf3ge!1WKp`AnZj($OjOa} zs~7PeyisN$4D%Gt+G;G=25dBL`{@sP69O3FtB%QT5|xAK+RY7*&dSjaWOlmGbR;Fj zC)+H`!(Q(I(|{Z-GJMjaPg7~<;et4*8nU`s-jepf_lP=lR@K0lWb5>qVvR9ap(2=P zqdN#on=3R~cTdLJz#AaLILzD@6X!4L&S{sRd3iEyBbyI39Ms3Om|7~ zE;*KswrsRfn~d}+JCctfu0MCAP(l`_DiGZu)gaa@@76%=-aw!&vrIWnG5Tn?5~Gkg zh<}f7u&QGJASS#~T0L*z@MLW47w(VUaX8Up)5OU{D9V;Kwqmo<-!B=K;xnwd&OU4y zgZ>+_x&Jt7hZ2JO##clJBJD7YL<1Rj)eTLS(>g0CQ&5~WTZgy@gLztJTT>ZiZi&lc zHJHf*M4E{ zGYrY*q*3jfjnpODpetU_hz?l80al{es)x-$q$&|?eW;>2N|tw4o@>T;<*{x?EXjnufqJMeH=PQ4fBgcn};#H zAx1a+YWrBpjpI{NP8Zpibi)Uy@Ecq#dX)Gz!9iTStVZzex z)KvUN>m5m+D4`)p#pXQvxRdWJtc08`(|&dT^>{QK4MwlLr9}I4_a#B`Z_G(GpHjkH zCW3FizE9oFrM`-|%wULbYa(xy7VoD?45TJCU?w=YvLl0x)^ek8Bj><0Fno@N`#q33 ztho18>Xpo(b|>{^OGX`Sf^vo2i(v0ykEy5H5>`D(F&~cg-$d+Ag%bWo$4BshLof;K zxHplHr1zCJs&4_WocI@|qDL&SU31KA5te|IPX;-EeWF+bH1G?>O=Y65&f zB(Ladw4Cw7dr&B!gStlyBw4M^$zkNHNiZR^U$mp)wi+FrR!74@?v^ZU>dZD^#I`DB z6RA3p!RO+tLVyT<2q@TCS|L&jp;XPov#N&!;z(vAJf7YvvAJwWWOUaV=|FSA#!YifO zDN7Zxyt&tvS(~r-7idr;fG1;wr{sb!@>!vv$L`YY#h5%9uXoFhA!T>x7#m*Mg`Cg; zOXPTR_|CQE1CE>eEYAEue&4ybhB3@kmhB)jS&K=VNDY{>U=p@;R+1|6EE>yM++`%5 zP3eMGcZS0rmcLT79&s33mGkj5rLi|@~g{|F#9<>+x=<}hb zC?l+vgABS|q@*)w$;yg^46^WVL>%H0PADRiSS-G6W-)@#%od92RgKVItWfA41TT>! z|FC~Vyub1Y=iFLWxy@6GPr8TDt?dqv(v177v^{*b z43Eui5#C#tpEFY$@LGsc@|HlA6L%8-r}KeA*Ke#L@#-xFO5g5ePu!Mp+=V-8OGL3| z^T`Bz@U|J6?mzg&_QTCDwh3`xIUHv3GW$`C#>yT)zgxZc;EDZv|M|nMRS$0lk6^gC zQDi&mJ-KMU_F|p5?aBp0YHJq>Melrcj-QIuwNQ2bZ7wb8{&)R;Wv9`pUFNUGMV_T- zXGO6$cPc8=xulE6b^TtyboDV8if^xMY*exelxi-`ta5$A<*&KM4lq2x8l&j*qk}fH zR11;i^+tmkd#O2V-L7R3BfB?j7YXc?!(bz)slFTjw?H#ci%l2lYs`8NOX@KQb>q?kQNttMT(cqTxK%k`)T}^OT zz(^JYB8X3@kb-~F-M%)VW~Jr0yZLlmbbL1X%9I7DJBAI^8@K9NYXUYW{<68I>-5w6t{1!pbRmwmOk2nvWe68dLr23##w~q zi_aH;POKXRRlt%aY}ZxIAQwY>G{q5gRvxGDa_0lrr3t9S?)AwHcFR+tT3w$E9ZW%7 zwxsN((zai9fum zC)U4QH_+>m!gN`rV9yD!n$>L_%iC0@gdWMnH^%e565D_*erxFQ(c4 zfzfi|w^AL9e8p{*^RRv`5NZ=P`QEw6)g#eJ)fD*&o5!xwLvCQBCclfY0~|$0PWeM! z5&%e4NmhCB+qIWFJJ4Zq@)Sxj^^~BO*?OA3PG>z3U}rrFJGVtWe)8z?_LFD7G4m&e zJd^&4T+4X!FWXzs)|T&W-`{-xi)SLhWFIxT9_u=3f(h|(7^juREN@{MARj{N1EHph z;T;9x8D4fa(@B;aB;`8U8Rs`yh1&VcMu|sWok{laHIO2YEX{5IY|#+7B7Eqx5T zBw35}Lr*umesQN_6x(U=zFOn5)~D6Dc-MiP-JvW=SV}~z0q`oUBPm=d4GFV7lTZ~x zDdcmQS_V=Q3&Bz@V`VkZe)JL3`SVw7R@O|A&|8QTvM)*B zFo~{iKSexBprHE;L;rdeypW#TxSDww{icAgP=P81>tR+~SdYG&SlH~G!v z_^h=8<+T5qTTPP_9ey?bUWA}jyP9MpS%w$20b4)fHUvO{-x?ut)pVBCx~)gZ6kqMj z{8+cYKC!o1`FaD|9JaD)s{ZC`|X`ZqeFw1d#DGEr9g{3Xy`#xZ8BVCA;woK8!-; z{r1IgcXrlZu6@eiJ3A}aCp$Z!=hf9nyh@7Znb zyxtjE>z7P^^IJ@0%6hdW79Vo5G$M8|{a|)H z_{!$7BHNXba=IVFLJY1DI9G8`EmC#B4P?{DFIjt>iMd*sk|DVh8KW z%dC^X>OQYftZ|C{nHSE<*eNP8xKfO?sYH>$z5(2ZuK2c?g%2;YRu;2X;Ni!o_|-@! z#T!=S(lF>wWYFzKtv-h@^YjDLNt20SuQwQRYyozb0G^&db^vMVO*aF^1WJ|CGA&mF zN0jW>-IB1?g&`Q!JCgec&Y>tv$A=2NJu$(o4TVK9!O_*e8FQ?J*T zmUskBQ%uOB-nedz&o*4^@3gbnO|`~P#2#y{YqkUZh8}JCUW`aWV!@GwH*0*>Q`6_T zIbAY->uWm0(*!YtxSm~YaUV+^JPRz)g(kcEr}Wa;gLb(3B@o#T;<1EwG-?|s^sdQh z*<=`&fmzq#+RlmiZ8M~@hLB+QnzmR{Z)ns_#Q3ght{aRsF&g+xLju|+jov--*)&m6 zt4RizdT9`Pw^v@k`})Jz{k=Z=oZRgg8k`9!FsNJ7`k+@& zdM!f1xrLrV>K|J8GMAXegD%j%MBl3(i(w=%Csq~U=Zo1cyv+GZ;*-`;iSyZM0OYe; zSeFlZPW(#nx(K%V#_Mz8T%`Uo#Di;Lr;5PyF@2RR)}9tQF97hhnq!>OmJX2RuOd;* znx`WFa2NCkHW&gpyxoY-=%j7P91+`cIlO>2iep@~{w0LXKxIwI2kyGP?$#TTi+4J$ zV5VxdJMnAFxtDDTR-1^cu$Nx8WCXR!J;Y?nbfve z-p#NG>t&0VB6p1vn06!MRx2v6cN*snA(zE|>~VaEo98UZVf)w5wjVxy@aSQzn-hcC ze1#0uq{pXXI8}Cb5GSTllK7%-lBi5a9!npMEv3no!etgZDlB`tW>{z@zz?q=4>KN% z65Rj_p1?v7vv5X1Uew z6?}vpg2;pq;8(Sl{Wb)TCm{f}<_~z@l1IVHcO=njZL$$%yPGls6}hyfXaJ7d-S z(p#&yrRa1ngW2orOCMj*g*Pn0&=8`RZX-61GJeQErr_{zd+GZ~7G0Wt+?1+gN)CJ( zj!V_Qv^$l%ckl01e#Ega@Yv57RNSeNvl1IIo|3F+TqK#~OcbVd0dZT{<=%-7HmJVs z;|>$8*iC0YBhM0=Mdsn~5EGrjEY9p|au;mqH`wy4{tjX>jK9M_@t9Se914aQ@hmN1 zcn&PI?O8Ahq;MK52Lj$xR+kl+C=ZQL1|p7$38Ixii*7ZPMZw>c=-!5i7smJE2A4XQ zhtb3P1Em(5A>M?DqUss%AOcHR#Db6*W;-&UTlGeOkd1abXFj$tj`|cp6T>UbBcsqC z$pK<(ti3yuYi6d3PUV0{VCyCrHX#dB zav~~*VlopHJm`p>HR=Y1{)wN>n*kMxfE?L|r(*3WICf8eIT6xuUG`0NyWYtmZduqSMsJCO@qOk0DUg*n56jD z<%_=lmjo+%4jYM zo5*0rTEk*i%c^D3dU{_pEQ6`jsMOoU>CCJen!x(BN5<@1PN8!9rI`&%96hn{Mdv6G z?3c*Y#92H}fhZROX-ig=;%=N(BPx%B3xhtV;{`ePsuw_ezP-&4)H_fhO7g507|DAY zT39|cCz5vaP5!RMJgKZ_6t{W4{ap^0<}o?Ci#6u_q@1&7N7RuZO2#obuq<9J>?aCa zCftv+E4FB{Z$S)eOn~#`!n=K|8TeiORxOv0$p`9I6|JM6byd{bQE18h& zP#HXRHzV`0Y9Z8zRz?WM2ZzhM8+pjHXwqufK?_iqj_(8T8&4@kE>{ApioH0S9|dYI z8Q&$+Y_H0!;;iM4?uZeA49zO9>kaMMPi@173QY{{wzK)mP-?BbK}}^d)1`ZCOnAzB zLwQ+HWY#o`Wb1-+jqpYpI`lG34Bmx~-{?Hh4Y(BiMRHawfs0_*P-orFj|8r_#ABTW zO+zm+cHnSQ%dI0ZtIl~i7d*>kaJlEdQ58vbgT`J7epQEG!K7qdw3iv5q(K#>xl5_F zLhWcXvFY1sw4LQqz*GQ~&h__CqTBFou4Fdpv^57!pGv87n+{FpG{w4~wwYOaWlrDe7VG)RCDU_+Z}f;Uq8OgsE4pdMgkzQ@nB`;z^c{jQxK7!Zb4yn*rm zXvrmGtSno1*@KNQu|~sntU2+aMr|wqi%0HYq#dy;`NP@D+(n&`VqUmwJS3TS^CM7& zq2~UNTK;|qr5L#RCS^9Ildjx1>(2ayuI6^42+yHFNrNcvtelIO=QoE8w%jKqLfJ`a z(TMpTv$%Q9&A4Gwsdf!?yGXOQPL-fX$v7vAsVLe^ktJVX>YESgxa29UD%eoeVbZ6# z=C;gcN6-D(q8zQic}``6Z`3fxYhfd;2-rH7Ub=FXM>a6CpQ|J&TrN5p;!6~UhdI=u zOb}1WmfF!P@;Ay?TYRG(c`J0^hKP72W_7h5J12KTcx9v25}|6z|358Iab42P+js>V z7>V~Tr@ypzZXI`(s?BCX%h0MZ^R*fZhEME;tM`g6%n(bm+dh4M7h+NMG}RZ;;otlI zf{Qct?j_K&V6#`0XJugshj=$8_>i2v;gOHnZIaL+Bsj!oG-|i9lnWO{C9*&n`z8w% z6&5hN@@s=ESWBi;B_C2mB10WDVH_;Ku{m@9J$>+O`-{!T)o3^&LM@#6C@b&mQwfIM zP+v(;sPY!L9Ys-YGo7t@Hphi#X<42XIs z-cJfHEnay^K zzhi7i<-7`W*${ZPx}Dh8{|wg(Icc{&EKudHSU=jGi%WmG^cPFt`9$O6{{HIte6UTo z8BIr$u725m5V3-VpkDhly>}kF2C~4NnrAeZ&{w&DVWgsDDm^abD!k9Y_RYmy8Q&)S z>uL6trw)hB&k;a)hQgk@W@j{*v`Y69=vp)uHoP6jnwPeG13!FW;pBuGp+u@zn$(%Q zHk0XIapq!}9}H831J}j)15qTyrdbE2B zFQ(*$fUtEGK7=JYm;yf@^V-G_g|up+5SlB}d%nmp7sD zPj;VscAbNyk(!hsuZ#4XW&uOpvkq`K|7nGqzV~*hRBxSkjkd9CR|@TxUt6JJ2ERhf zT7xTj?Z~OQdI>9Nz%sc$MBmfcq)bz!0niTpXenLC`TMlznP;=vjSK1V`G=oK_nASWlia4$pIbR#o@dhB^3!? znR#$IHYb+^{s)0BZ$Wq|bnj-?TYI&3b9tE)^^3D>1fSF>EfoTS<4f$YrWeb<3m@XTKsTg~#eOuG{M$F&E0^@#KKjN`qx zCm^F%h$<7FX`Ejb&Rhg-X8q(vGMLXhuwBb>7za9O4wjX(FJr!(2@G2!Q{hkRNzdKl zg{>wQ)EmC-!|ctWT6ko9#=AJf_r8B_%v{$3L^KZA)XLUYxeZoUyjzJM4#)&y9>~fu zpLiH|OcvvbJo!a_iCz|6;^cL<+wS7TBc2#iIu0pvqd?9xq^_ih574u>l;?`nEuBlW z%t(?#1M$>4TVnVfyHEa?lQPkG+*~(UWkQ{T%~kHX0qWxCA72*XNi&uM(1QZ&7eA*` z%b%PtU}+&5(|cqlhj!~&-06jT+0+Do1lqJt<0HAzNECQKH5Q+G&Y2e7Xf!de4W9%p zLpedPyyJ~J{OcuzF2H!OjZQrd&&6Anmg`ViD=X$VkEQpVRCjbOoTtgq)JW7wo1zY@h*!cBtjByw=-@gyZP1-olE-^Rwa z^LQ}xsXG~Be9iCk+r9|%);^%o&F*bJ+tw#ubkw475D8K8Ee)3yz2OHV+1coN6t#ac z(Kz(}=*DFJKnd!4oYb=Ll?3u`JjzfvZV2!Yt^Lh6gw0dFA8KJggs6(JCu~3bPNd(~ zelYlN8P?6Kx=Dt$cEI^t3D`;upy{jZ(nq#=QRUo9lnFH>e}FUxJitZQH$-J6zCNa3vh(n zM`-kLgU^eQwNX)MWWKT1Q+8md9gkuRbY}QkSX&n3%$yN1nbKVg%S8u;z>;=4MC?8S z;Ff6K&+#goyVeAO#K?uoRA|;;;+8CL-dhV5&gT44kuPi6g>WJ{DQm58x&SmQ!o}x+ zP0PqfH1B?gzZc<21LlAM)maxj5sRLa`o15@ShZN9jq8(_FZlDaoVjXi?%deS3umy( zyzx{Zj|yts>a-#QM2_AIwuiVlGt2Vq!874`pV}l=Z836>Rg46My&2;t=ndadaE*Bw zT8u4KhiEK)NW@Nbmc^+{Ny%C*m|(G9FSX6x|P zh@LIBPoBxyxLxa5Ca0ZzH-C&pv=bH2w$LFF823`7LXtT}nobfXwxFF+S|#)vX$s-_ zvIkTvM5-L56`n`MDW06CfGNw*omY-<&28D@hrnDNaHFpr<&h@JK=rsSiI~`b&II%n zlo-%E-}L6w-#py9Squq`C-m@{8+4$_>Cg=YCzHXcrCN7!<;ca!FziESXIZGd)7Ji( zbilg%2_iqyKE8q}3Gno7?bXi3kcuMhq?4UL&p*Jtbs0z9iL@n2C9%XGo&;}D4C4)s z9MdMOE)^xYuttB?v3vodtqJVrE`8>xNu3fv>NJR8gluTw^azfO`26CFxb z6NlAI#IPHrVM(5Bh=G__xB(iA?md3f?c(gd+zRCy|uo@5B+xAeVx+xm}=n0A=sbhih_G#Y{OMkZRQ|Lj~wSA8|PR9H+}Pp<#vTwz5o z+KT+({Lb)iwICO^f)+|U5#mR9Qrg&jTgD==jq`ifK-FPl2|WNK3uij`F@Iraaauda zl=(*^%*>$koBezjH+&VYlcWh5&Xor-LR7Yj;x3LRn(z|ODVgyb=iiZRf1kO59ec*3 zN8AfVvVP$%vu^RZy4y0*I&b5Q20vw=%D89NtY#D+)%ZC6tGq`;PaaX8hmN>W&Cj5> zF3av`8iwW9M9Wkf+8=I2l$iwja2@%ZnGhp@;FHSLPpjl4%3QROU7y(X&QLj@7IbHw z532i$1=|(|ZA-@K&wD4YvKz>d>6h4^xZv2ykhwnP&@6voIyt9BbHIQ4>a3dD<4n|n zs0dT-QMD)ImclR5+Bo|Tzi@`-b|ro~_{Qif?6`!aC`FyS?=b?b!u!D&k^rwbj2And z-ZrxfCYgQgp!6t2Ku}LPew?7B^Ych2HWO#%(?_K4Y`gjKu?rW>xt!f5U#n6dq)1ET z#PrqBT*6jarOKGed<7*`|5bkt94NR|QXidBzzS{czbP1)5kfKlRrMQ?zK`)Kc=o2|&{+?}3Gn9&s#3T7i7c%S3-@hZz^i@nnOGJooo zv*Xq526&%!IT`X5Q;sVd^T7yC+#uI_<@Y`82zeEi(^z;Z_4HmAjgJZPDNiG>sAdKV zD|PDChzNyqgY;} zD;<>te}pJG_+&4hGK>kAH@v^=#S?JibZG%c?|lEgItd4hml%skO;ok0BvB8Ic%)F{ zHc4)DI6oaj%|t%j(iuRe+k66Mx&lP_fMkjtL^0s|FADw*QX?jx6Ynd-XciBZ(sXOb z3V)j(O}=-?XK3F}s9B676y&rqL!SPIJk887p|Ykwa41rqXJ+P^MQAsF)hx#5u3$YCs^i05(>1=~O5~x)~L_-}XEFu8gdIGj)4DRsuPBQ`9mO_)cHegGJ zcL28F(oS2z7T0$Kw!Eu@{lGx20Ih~7P^+;=V5{L8xE0XWb1Jp!0Nds|(_*kz_?E3| z@Ya6ZGe8@`?bm>{*t2PX`RPcxsntIR)`|%D=?K>sn@dBuak;q;2-g?r?ha=bpcpzl-iyh0y{0Cv%Kcm{oALSaC)POMmjA~sqE4#MJsMa8wBUr~4 z5#GA&5^FE$ZQujJU{Klu%Kz_+bH5S9{jY^@bJY3`knVpEd|M>(g}Wgs_KR?B*-QN) z1bi#xdtjPtfPgEHD|Vu9qn5+YqOU=!;QOIx2}&jh9u5wfUe7{~vb!hKYr*JR1d+={ zBg=bDrQZ-lMzpT6B{UfTWOg+m0JGIOmK3N2jpQ~_es>b6T$gF9QOiN)3edsqqIJMS zvWwC{!;g?NP}wq2X-LvRCGbiRvROA!8D6JQ+;A`)h>7FZcvW*gu-37pK&7mGv=W1I zIZn;(qOu0^GFb#=0yX?dIn1Cx06*625kD^d)q72%0z8_zeW5nL+I4+f7@`Dp9bf^@!P>5YLR}zk#wxH05@``-dVU&Lz^{*Myx38 zXwNl8O*e>cMuX@dj~vZ1Y6j77nL$*@F;b18N3Q4r$6d&xC-|5zr5i*q1-N*jY!3ay zA>$tf4Bx|}i#?LZCfa2!pT-|%f5w%6#+83UYbh{s-ZpCN{m%x`$Oe*O^9+ONe=W55 zXOpLYo%KHu@U?5Tb`JRJ?Pjtw3h)IxquVWYs01HGk*oU*Fes6QIJQW0zmp~*20-q>u?xU)Rtw; z596OXMda(qWzM=PC>!x))%ya%*Dc#xS*2&6Ig-cPV2f+la%$?_ZpSYhV59Hpt27GS zFcysM*8;;>^GDC0J$|0znc_KTI;W>_6kJqxtTuW?3}o+5jDk|=x}7Wfjs$IZ1z%p^ zg@s0__u%3EN76GORmHU|V<4M`@9-5g4tYr2%Ml{rv9xm(xdIC{j+lz6z@D(+VN{%j z;or_vYCPs`y@R)I64$6BvDrdOGqC7;TH`A{;oF0JS>>28vz2GtPrk5V%c>pb^LX^esL^k-I$S4bHvBeYv6u=fnOIMr7+t&0@j_Q&J4AO}2+T#RRZXX^%zJzi+=7Lj z9FC0<6S10bh;UYhuS4;Cb%XXHnprW6d>4vi9e5dGRWVF=hJ8hEF0rsEe+n%s1TJu} zsyHTRt1uDgH}9C|Bf9g@*BeAlkA3@cw!wGrX^=K*YO}SV zP1F5&hW6=awnHWHCCrc_<5QFnUful?M;+ zZS$R{f_`Tbg;U6ITF33px5Ef+@FNK}9&oPbLAJ5={OPktU;K`%{kZomlob}qfgt-9 zbpRtJKt4p`BA9nxyr@-gzx?d_&JG_d`QPdK$9|i;#1xQUI_|!!+8fJ>=|8sX@Ho%H!wQ~7w7xv1I*CIoc673299%LykUIi3*Q zM}EYJI9x$?q!^(9XJWi=s&h7bu{Y&$I5h08+EhKWJqGmR#J^%9T?cIP#S%_q`x$(pBhJDRE@@Y{T+tIPsNWlT8}L66`$+HO+D@` zeP@$@#9b@rwT0~Hh1UN)=XR&2+_w9)UDH|h&Ulo7+B$dP^QS&?dG=^qi72wJ)#?{7 z{#qSjq^)xomp;06Y3W-;?;Fn|uLa*S+(0{yqTXqJYb{lHriYA1lWGUud5D}!a<|$1 z-0EmB+_~^8Ra~X$cX$|$S0*8DE7P$L+~ zzP+@xc`Y>K_ge9u&4zOGuj+Fle${!h&rhW(*XuSXyj*j#4m0QeB`!OSk9ce!R_Syu zmI?2dR_Y>?Y!*t(S-{O3Qt3{@NWKo?;U`{9c2ACiFK+FctlW+O^ZJKqv$J3oUL4~WOc*Ygw6ODl{`Q* z7i6>N5Q6{7`pGJvqR8xUd|~)bMrg2!nwVu(MZ3RH_Cd%%sA%fRNZ|9D$cg@e{mjK% ze7v!7O=a@SPj#tWY-Ako%IBB`p8eX#i!%qF2jM@EuAw6bu6_34;npvn-`iFmN)!rf z_8D$HCeE=C;K$S@Z_e$Mq5`(co=P*}3vrzD%LI~+EDX<=!_bkU5);IjG$-a@PB%j; z>U2NO&^nm{I7?~=QZZuaprN<|m1h-8Ba2n+8y$l5K^>EvCEEiPC8%98Oj+3fa?sRF z0i)%Vn#ON^iQBT5Nh3CW&kiK>cA_3>Clm9gr?W?>YTHdm@#vRtqy|8d<>QQJGy%AW zovMJ`y2|gOBA_!}ToF+2jJ^moA4c}xjHwU6|H3)W#p8)m@Fkr1j-a};ibCw=<4qm- zW2f<>_vswxoJI<1Ppx{V7C*d1+LI^Uf%XD988z|QCd;3-&!Z?XI_$Tn+nZ0eekT1= z8Y&AKYCEiyx|b)^Q{`aS|zmK^loBm5}FMHIGqt>#LX+Yn+ zB^NV1)+3PMzgt;<*r8NvUx0r!lw_@( z5?K@K^-u6T`0YScQpKE}wfEpa*()mkwg`Lm*Y70#D|j&MxME3pv0)o$;NM{oFGgRZ;YD_BIxC=DG+8K$Vr<5O*qtdg|j z!eJ~=;+_g0z*9%{lW+IR%!(un`@l`@h_OOEEvVv){zT`8r)C1ONMd1brfjF$bmaD* z@sN0q^)jj#W8Wg zWB~U-nMoYfa&#M((%ZD(O+Tf$=2xw7)%XV(tK)?C;As^@maeD7E0ZZOVmsvC_+;xZVV>q+TKDH-p9M4T zA7Bqb9?-}S37ly(QK9utPnYy;&Dv*UJr5Gj!p^ON7%%dmsJ32!o7dVur-zMoNhRUF zITnH2PT47(ulNe*Uc7iq-c3k`-z`>|ovR!0E}g8)*Ue#8q*cyH{&)%zME{ z;CnnjxbsI#-{Te*vbr6IY5ns|l$fm&2H2$;+3^}-fU?Y~3$rXCovo2`@Y34)`UK7p zwrxJS<(+C}Z&=WPA(@zxxNuwNjra;db|yE{(Hyp8l31~mqmV!826CqIh%BqXY_c>E zrG>g;1p(#a{A|_~Xc4}I9G@|rt=X8$bqnO44MtrzwVA?Io!j8=-QV*QEr^p<%FMF3 zO=r0=04Qy@HuhrQZmnjvZDO)m)fdutl-|NO$ze8Y|G0d{nGVHKUVD+-`lMaCiQe=r z+Zyf)Z0om4Ogqr#y9=nzJCSk(&7}53+{3=7HP_vWoacdKvflfHu`w|EtrI!}o9Up^ zg~YjA&1~y+k3>|lm_!gdxlcFDS{KMg#sh9kcNIKbi`I#Fr~?d1RSX^I;~%7hrZ1L& z@HPh%B%i&ie`u!|VW1nF=;Q9HGNIpm{$#I*8gV2$+_<-obVMx=tw?^-g5nn}qQTzd zO{izQ`iN}=AUDjKDiNBKy_0)<1~BIECw`Sm|K5N8a0@ft)9tE`cRq8WZB2r?SR;+9 zmpWnx-SMIBvyjmxX|b@%^Jt;9b#k4w{P>@wl}gz*ABr3+QaL$`-tM>TTc5Rc08czc zwBQsChfVm=b&c5*AmY(=4v=U-M5wQ2$bDl6DKw;yi^==fL0ZqHshY#u+`XvQ$VeQ& z+`J>nsk{1Z+PZkAyGs0|hGxOtJrPG0;NnA~dST;KH=48VZa<*{EnIDD22=`$?Sa{F zX{JVHTJej?GVEIy)U>+74LQ9e&6{|W?T*_UB)T+C`IvR$GD`eaK6P|A`BVV$k}Ne2 zQYQ_Ny_p z*%JeGvR9Sh7bQST@m~lt-$R7o1aYQ4Z}e<(XRec`tsC=mfnyp?e&SmEsOX>kltMn4 z7gTW&n-a#e%5Ps}S6+U4ZD%L>1Y8mYo2$$dmTKYr9W0+aVc!9D7u&ve>Eemah=b*oknSO;knCs6|1y$kYkeZyt`8mk-DDu0dP3OtT+p>7iU#s}f= zZ$AIUGc(EOMUxdsYK;*DiyuCgpi)LMHwSEW>h;N9>6=~{mWcH=lLe~8(-6*Zam8+{}OlsLlx46Lc-#u+( z`vhODA&E%PoO$?>XMzSONa2#F7yodgnrAzZ@SjeN!%sPD4d@XWZWN%3=Kf^_z5#sN%GompM} Ee;;Z2`Tzg` diff --git a/elpa/org-9.3.6/ox-texinfo.el b/elpa/org-9.3.6/ox-texinfo.el deleted file mode 100644 index 4265a85d..00000000 --- a/elpa/org-9.3.6/ox-texinfo.el +++ /dev/null @@ -1,1719 +0,0 @@ -;;; ox-texinfo.el --- Texinfo Back-End for Org Export Engine -*- lexical-binding: t; -*- - -;; Copyright (C) 2012-2020 Free Software Foundation, Inc. -;; Author: Jonathan Leech-Pepin -;; Keywords: outlines, hypermedia, calendar, wp - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: -;; -;; See Org manual for details. - -;;; Code: - -(require 'cl-lib) -(require 'ox) - -(defvar orgtbl-exp-regexp) - - - -;;; Define Back-End - -(org-export-define-backend 'texinfo - '((bold . org-texinfo-bold) - (center-block . org-texinfo-center-block) - (clock . org-texinfo-clock) - (code . org-texinfo-code) - (drawer . org-texinfo-drawer) - (dynamic-block . org-texinfo-dynamic-block) - (entity . org-texinfo-entity) - (example-block . org-texinfo-example-block) - (export-block . org-texinfo-export-block) - (export-snippet . org-texinfo-export-snippet) - (fixed-width . org-texinfo-fixed-width) - (footnote-definition . org-texinfo-footnote-definition) - (footnote-reference . org-texinfo-footnote-reference) - (headline . org-texinfo-headline) - (inline-src-block . org-texinfo-inline-src-block) - (inlinetask . org-texinfo-inlinetask) - (italic . org-texinfo-italic) - (item . org-texinfo-item) - (keyword . org-texinfo-keyword) - (line-break . org-texinfo-line-break) - (link . org-texinfo-link) - (node-property . org-texinfo-node-property) - (paragraph . org-texinfo-paragraph) - (plain-list . org-texinfo-plain-list) - (plain-text . org-texinfo-plain-text) - (planning . org-texinfo-planning) - (property-drawer . org-texinfo-property-drawer) - (quote-block . org-texinfo-quote-block) - (radio-target . org-texinfo-radio-target) - (section . org-texinfo-section) - (special-block . org-texinfo-special-block) - (src-block . org-texinfo-src-block) - (statistics-cookie . org-texinfo-statistics-cookie) - (strike-through . org-texinfo-strike-through) - (subscript . org-texinfo-subscript) - (superscript . org-texinfo-superscript) - (table . org-texinfo-table) - (table-cell . org-texinfo-table-cell) - (table-row . org-texinfo-table-row) - (target . org-texinfo-target) - (template . org-texinfo-template) - (timestamp . org-texinfo-timestamp) - (underline . org-texinfo-underline) - (verbatim . org-texinfo-verbatim) - (verse-block . org-texinfo-verse-block)) - :filters-alist - '((:filter-headline . org-texinfo--filter-section-blank-lines) - (:filter-parse-tree . org-texinfo--normalize-headlines) - (:filter-section . org-texinfo--filter-section-blank-lines) - (:filter-final-output . org-texinfo--untabify)) - :menu-entry - '(?i "Export to Texinfo" - ((?t "As TEXI file" org-texinfo-export-to-texinfo) - (?i "As INFO file" org-texinfo-export-to-info) - (?o "As INFO file and open" - (lambda (a s v b) - (if a (org-texinfo-export-to-info t s v b) - (org-open-file (org-texinfo-export-to-info nil s v b))))))) - :options-alist - '((:texinfo-filename "TEXINFO_FILENAME" nil nil t) - (:texinfo-class "TEXINFO_CLASS" nil org-texinfo-default-class t) - (:texinfo-header "TEXINFO_HEADER" nil nil newline) - (:texinfo-post-header "TEXINFO_POST_HEADER" nil nil newline) - (:subtitle "SUBTITLE" nil nil parse) - (:subauthor "SUBAUTHOR" nil nil newline) - (:texinfo-dircat "TEXINFO_DIR_CATEGORY" nil nil t) - (:texinfo-dirtitle "TEXINFO_DIR_TITLE" nil nil t) - (:texinfo-dirdesc "TEXINFO_DIR_DESC" nil nil t) - (:texinfo-printed-title "TEXINFO_PRINTED_TITLE" nil nil t) - ;; Other variables. - (:texinfo-classes nil nil org-texinfo-classes) - (:texinfo-format-headline-function nil nil org-texinfo-format-headline-function) - (:texinfo-node-description-column nil nil org-texinfo-node-description-column) - (:texinfo-active-timestamp-format nil nil org-texinfo-active-timestamp-format) - (:texinfo-inactive-timestamp-format nil nil org-texinfo-inactive-timestamp-format) - (:texinfo-diary-timestamp-format nil nil org-texinfo-diary-timestamp-format) - (:texinfo-link-with-unknown-path-format nil nil org-texinfo-link-with-unknown-path-format) - (:texinfo-tables-verbatim nil nil org-texinfo-tables-verbatim) - (:texinfo-table-scientific-notation nil nil org-texinfo-table-scientific-notation) - (:texinfo-table-default-markup nil nil org-texinfo-table-default-markup) - (:texinfo-text-markup-alist nil nil org-texinfo-text-markup-alist) - (:texinfo-format-drawer-function nil nil org-texinfo-format-drawer-function) - (:texinfo-format-inlinetask-function nil nil org-texinfo-format-inlinetask-function))) - - - -;;; User Configurable Variables - -(defgroup org-export-texinfo nil - "Options for exporting Org mode files to Texinfo." - :tag "Org Export Texinfo" - :version "24.4" - :package-version '(Org . "8.0") - :group 'org-export) - -;;;; Preamble - -(defcustom org-texinfo-coding-system nil - "Default document encoding for Texinfo output. - -If nil it will default to `buffer-file-coding-system'." - :group 'org-export-texinfo - :type 'coding-system) - -(defcustom org-texinfo-default-class "info" - "The default Texinfo class." - :group 'org-export-texinfo - :type '(string :tag "Texinfo class")) - -(defcustom org-texinfo-classes - '(("info" - "@documentencoding AUTO\n@documentlanguage AUTO" - ("@chapter %s" "@unnumbered %s" "@chapheading %s" "@appendix %s") - ("@section %s" "@unnumberedsec %s" "@heading %s" "@appendixsec %s") - ("@subsection %s" "@unnumberedsubsec %s" "@subheading %s" - "@appendixsubsec %s") - ("@subsubsection %s" "@unnumberedsubsubsec %s" "@subsubheading %s" - "@appendixsubsubsec %s"))) - "Alist of Texinfo classes and associated header and structure. -If #+TEXINFO_CLASS is set in the buffer, use its value and the -associated information. Here is the structure of a class -definition: - - (class-name - header-string - (numbered-1 unnumbered-1 unnumbered-no-toc-1 appendix-1) - (numbered-2 unnumbered-2 unnumbered-no-toc-2 appendix-2) - ...) - - -The header string ------------------ - -The header string is inserted in the header of the generated -document, right after \"@setfilename\" and \"@settitle\" -commands. - -If it contains the special string - - \"@documentencoding AUTO\" - -\"AUTO\" will be replaced with an appropriate coding system. See -`org-texinfo-coding-system' for more information. Likewise, if -the string contains the special string - - \"@documentlanguage AUTO\" - -\"AUTO\" will be replaced with the language defined in the -buffer, through #+LANGUAGE keyword, or globally, with -`org-export-default-language', which see. - - -The sectioning structure ------------------------- - -The sectioning structure of the class is given by the elements -following the header string. For each sectioning level, a number -of strings is specified. A %s formatter is mandatory in each -section string and will be replaced by the title of the section." - :group 'org-export-texinfo - :version "27.1" - :package-version '(Org . "9.2") - :type '(repeat - (list (string :tag "Texinfo class") - (string :tag "Texinfo header") - (repeat :tag "Levels" :inline t - (choice - (list :tag "Heading" - (string :tag " numbered") - (string :tag " unnumbered") - (string :tag "unnumbered-no-toc") - (string :tag " appendix"))))))) - -;;;; Headline - -(defcustom org-texinfo-format-headline-function - 'org-texinfo-format-headline-default-function - "Function to format headline text. - -This function will be called with 5 arguments: -TODO the todo keyword (string or nil). -TODO-TYPE the type of todo (symbol: `todo', `done', nil) -PRIORITY the priority of the headline (integer or nil) -TEXT the main headline text (string). -TAGS the tags as a list of strings (list of strings or nil). - -The function result will be used in the section format string." - :group 'org-export-texinfo - :type 'function - :version "26.1" - :package-version '(Org . "8.3")) - -;;;; Node listing (menu) - -(defcustom org-texinfo-node-description-column 32 - "Column at which to start the description in the node listings. -If a node title is greater than this length, the description will -be placed after the end of the title." - :group 'org-export-texinfo - :type 'integer) - -;;;; Timestamps - -(defcustom org-texinfo-active-timestamp-format "@emph{%s}" - "A printf format string to be applied to active timestamps." - :group 'org-export-texinfo - :type 'string) - -(defcustom org-texinfo-inactive-timestamp-format "@emph{%s}" - "A printf format string to be applied to inactive timestamps." - :group 'org-export-texinfo - :type 'string) - -(defcustom org-texinfo-diary-timestamp-format "@emph{%s}" - "A printf format string to be applied to diary timestamps." - :group 'org-export-texinfo - :type 'string) - -;;;; Links - -(defcustom org-texinfo-link-with-unknown-path-format "@indicateurl{%s}" - "Format string for links with unknown path type." - :group 'org-export-texinfo - :type 'string) - -;;;; Tables - -(defcustom org-texinfo-tables-verbatim nil - "When non-nil, tables are exported verbatim." - :group 'org-export-texinfo - :type 'boolean) - -(defcustom org-texinfo-table-scientific-notation nil - "Format string to display numbers in scientific notation. - -The format should have \"%s\" twice, for mantissa and exponent -\(i.e. \"%s\\\\times10^{%s}\"). - -When nil, no transformation is made." - :group 'org-export-texinfo - :type '(choice - (string :tag "Format string") - (const :tag "No formatting" nil))) - -(defcustom org-texinfo-table-default-markup "@asis" - "Default markup for first column in two-column tables. - -This should an indicating command, e.g., \"@code\", \"@kbd\" or -\"@samp\". - -It can be overridden locally using the \":indic\" attribute." - :group 'org-export-texinfo - :type 'string - :version "26.1" - :package-version '(Org . "9.1") - :safe #'stringp) - -;;;; Text markup - -(defcustom org-texinfo-text-markup-alist '((bold . "@strong{%s}") - (code . code) - (italic . "@emph{%s}") - (verbatim . samp)) - "Alist of Texinfo expressions to convert text markup. - -The key must be a symbol among `bold', `code', `italic', -`strike-through', `underscore' and `verbatim'. The value is -a formatting string to wrap fontified text with. - -Value can also be set to the following symbols: `verb', `samp' -and `code'. With the first one, Org uses \"@verb\" to create -a format string and selects a delimiter character that isn't in -the string. For the other two, Org uses \"@samp\" or \"@code\" -to typeset and protects special characters. - -When no association is found for a given markup, text is returned -as-is." - :group 'org-export-texinfo - :version "26.1" - :package-version '(Org . "9.1") - :type 'alist - :options '(bold code italic strike-through underscore verbatim)) - -;;;; Drawers - -(defcustom org-texinfo-format-drawer-function (lambda (_name contents) contents) - "Function called to format a drawer in Texinfo code. - -The function must accept two parameters: - NAME the drawer name, like \"LOGBOOK\" - CONTENTS the contents of the drawer. - -The function should return the string to be exported. - -The default function simply returns the value of CONTENTS." - :group 'org-export-texinfo - :version "24.4" - :package-version '(Org . "8.2") - :type 'function) - -;;;; Inlinetasks - -(defcustom org-texinfo-format-inlinetask-function - 'org-texinfo-format-inlinetask-default-function - "Function called to format an inlinetask in Texinfo code. - -The function must accept six parameters: - TODO the todo keyword, as a string - TODO-TYPE the todo type, a symbol among `todo', `done' and nil. - PRIORITY the inlinetask priority, as a string - NAME the inlinetask name, as a string. - TAGS the inlinetask tags, as a list of strings. - CONTENTS the contents of the inlinetask, as a string. - -The function should return the string to be exported." - :group 'org-export-texinfo - :type 'function) - -;;;; Compilation - -(defcustom org-texinfo-info-process '("makeinfo --no-split %f") - "Commands to process a Texinfo file to an INFO file. - -This is a list of strings, each of them will be given to the -shell as a command. %f in the command will be replaced by the -relative file name, %F by the absolute file name, %b by the file -base name (i.e. without directory and extension parts), %o by the -base directory of the file and %O by the absolute file name of -the output file." - :group 'org-export-texinfo - :version "26.1" - :package-version '(Org . "9.1") - :type '(repeat :tag "Shell command sequence" - (string :tag "Shell command"))) - -(defcustom org-texinfo-logfiles-extensions - '("aux" "toc" "cp" "fn" "ky" "pg" "tp" "vr") - "The list of file extensions to consider as Texinfo logfiles. -The logfiles will be remove if `org-texinfo-remove-logfiles' is -non-nil." - :group 'org-export-texinfo - :type '(repeat (string :tag "Extension"))) - -(defcustom org-texinfo-remove-logfiles t - "Non-nil means remove the logfiles produced by compiling a Texinfo file. -By default, logfiles are files with these extensions: .aux, .toc, -.cp, .fn, .ky, .pg and .tp. To define the set of logfiles to remove, -set `org-texinfo-logfiles-extensions'." - :group 'org-export-latex - :type 'boolean) - -;;; Constants - -(defconst org-texinfo-max-toc-depth 4 - "Maximum depth for creation of detailed menu listings. -Beyond this depth, Texinfo will not recognize the nodes and will -cause errors. Left as a constant in case this value ever -changes.") - -(defconst org-texinfo-supported-coding-systems - '("US-ASCII" "UTF-8" "ISO-8859-15" "ISO-8859-1" "ISO-8859-2" "koi8-r" "koi8-u") - "List of coding systems supported by Texinfo, as strings. -Specified coding system will be matched against these strings. -If two strings share the same prefix (e.g. \"ISO-8859-1\" and -\"ISO-8859-15\"), the most specific one has to be listed first.") - -(defconst org-texinfo-inline-image-rules - (list (cons "file" - (regexp-opt '("eps" "pdf" "png" "jpg" "jpeg" "gif" "svg")))) - "Rules characterizing image files that can be inlined.") - - -;;; Internal Functions - -(defun org-texinfo--untabify (s _backend _info) - "Remove TAB characters in string S." - (replace-regexp-in-string "\t" (make-string tab-width ?\s) s)) - -(defun org-texinfo--filter-section-blank-lines (headline _backend _info) - "Filter controlling number of blank lines after a section." - (replace-regexp-in-string "\n\\(?:\n[ \t]*\\)*\\'" "\n\n" headline)) - -(defun org-texinfo--normalize-headlines (tree _backend info) - "Normalize headlines in TREE. - -BACK-END is the symbol specifying back-end used for export. INFO -is a plist used as a communication channel. - -Make sure every headline in TREE contains a section, since those -are required to install a menu. Also put exactly one blank line -at the end of each section. - -Return new tree." - (org-element-map tree 'headline - (lambda (hl) - (org-element-put-property hl :post-blank 1) - (let ((contents (org-element-contents hl))) - (when contents - (let ((first (org-element-map contents '(headline section) - #'identity info t))) - (unless (eq (org-element-type first) 'section) - (apply #'org-element-set-contents - hl - (cons `(section (:parent ,hl)) contents))))))) - info) - tree) - -(defun org-texinfo--find-verb-separator (s) - "Return a character not used in string S. -This is used to choose a separator for constructs like \\verb." - (let ((ll "~,./?;':\"|!@#%^&-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ<>()[]{}")) - (cl-loop for c across ll - when (not (string-match (regexp-quote (char-to-string c)) s)) - return (char-to-string c)))) - -(defun org-texinfo--text-markup (text markup _info) - "Format TEXT depending on MARKUP text markup. -INFO is a plist used as a communication channel. See -`org-texinfo-text-markup-alist' for details." - (pcase (cdr (assq markup org-texinfo-text-markup-alist)) - (`nil text) ;no markup: return raw text - (`code (format "@code{%s}" (org-texinfo--sanitize-content text))) - (`samp (format "@samp{%s}" (org-texinfo--sanitize-content text))) - (`verb - (let ((separator (org-texinfo--find-verb-separator text))) - (format "@verb{%s%s%s}" separator text separator))) - ;; Else use format string. - (fmt (format fmt text)))) - -(defun org-texinfo--get-node (datum info) - "Return node or anchor associated to DATUM. -DATUM is a headline, a radio-target or a target. INFO is a plist -used as a communication channel. The function guarantees the -node or anchor name is unique." - (let ((cache (plist-get info :texinfo-node-cache))) - (or (cdr (assq datum cache)) - (let* ((salt 0) - (basename - (org-texinfo--sanitize-node - (pcase (org-element-type datum) - (`headline - (org-texinfo--sanitize-title - (org-export-get-alt-title datum info) info)) - (`radio-target - (org-export-data (org-element-contents datum) info)) - (`target - (org-element-property :value datum)) - (_ - (or (org-element-property :name datum) - (org-export-get-reference datum info)))))) - (name basename)) - ;; Org exports deeper elements before their parents. If two - ;; node names collide -- e.g., they have the same title -- - ;; within the same hierarchy, the second one would get the - ;; shorter node name. This is counter-intuitive. - ;; Consequently, we ensure that every parent headline get - ;; its node beforehand. As a recursive operation, this - ;; achieves the desired effect. - (let ((parent (org-element-lineage datum '(headline)))) - (when (and parent (not (assq parent cache))) - (org-texinfo--get-node parent info) - (setq cache (plist-get info :texinfo-node-cache)))) - ;; Ensure NAME is unique and not reserved node name "Top". - (while (or (equal name "Top") (rassoc name cache)) - (setq name (concat basename (format " (%d)" (cl-incf salt))))) - (plist-put info :texinfo-node-cache (cons (cons datum name) cache)) - name)))) - -(defun org-texinfo--sanitize-node (title) - "Bend string TITLE to node line requirements. -Trim string and collapse multiple whitespace characters as they -are not significant. Replace leading left parenthesis, when -followed by a right parenthesis, with a square bracket. Remove -periods, commas and colons." - (org-trim - (replace-regexp-in-string - "[ \t]+" " " - (replace-regexp-in-string - "[:,.]" "" - (replace-regexp-in-string "\\`(\\(.*?)\\)" "[\\1" title))))) - -(defun org-texinfo--sanitize-title (title info) - "Make TITLE suitable as a section name. -TITLE is a string or a secondary string. INFO is the current -export state, as a plist." - (org-export-data-with-backend - title (org-export-toc-entry-backend 'texinfo) info)) - -(defun org-texinfo--sanitize-content (text) - "Escape special characters in string TEXT. -Special characters are: @ { }" - (replace-regexp-in-string "[@{}]" "@\\&" text)) - -(defun org-texinfo--wrap-float (value info &optional type label caption short) - "Wrap string VALUE within a @float command. -INFO is the current export state, as a plist. TYPE is float -type, as a string. LABEL is the cross reference label for the -float, as a string. CAPTION and SHORT are, respectively, the -caption and shortcaption used for the float, as secondary -strings (e.g., returned by `org-export-get-caption')." - (let* ((backend - (org-export-toc-entry-backend 'texinfo - (cons 'footnote-reference - (lambda (f c i) (org-export-with-backend 'texinfo f c i))))) - (short-backend - (org-export-toc-entry-backend 'texinfo - '(inline-src-block . ignore) - '(verbatim . ignore))) - (short-str - (if (and short caption) - (format "@shortcaption{%s}\n" - (org-export-data-with-backend short short-backend info)) - "")) - (caption-str - (if (or short caption) - (format "@caption{%s}\n" - (org-export-data-with-backend - (or caption short) - (if (equal short-str "") short-backend backend) - info)) - ""))) - (format "@float %s%s\n%s\n%s%s@end float" - type (if label (concat "," label) "") value caption-str short-str))) - -;;; Template - -(defun org-texinfo-template (contents info) - "Return complete document string after Texinfo conversion. -CONTENTS is the transcoded contents string. INFO is a plist -holding export options." - (let ((title (org-export-data (plist-get info :title) info)) - ;; Copying data is the contents of the first headline in - ;; parse tree with a non-nil copying property. - (copying (org-element-map (plist-get info :parse-tree) 'headline - (lambda (hl) - (and (org-not-nil (org-element-property :COPYING hl)) - (org-element-contents hl))) - info t))) - (concat - "\\input texinfo @c -*- texinfo -*-\n" - "@c %**start of header\n" - (let ((file (or (org-strip-quotes (plist-get info :texinfo-filename)) - (let ((f (plist-get info :output-file))) - (and f (concat (file-name-sans-extension f) ".info")))))) - (and file (format "@setfilename %s\n" file))) - (format "@settitle %s\n" title) - ;; Insert class-defined header. - (org-element-normalize-string - (let ((header (nth 1 (assoc (plist-get info :texinfo-class) - org-texinfo-classes))) - (coding - (catch 'coding-system - (let ((case-fold-search t) - (name (symbol-name (or org-texinfo-coding-system - buffer-file-coding-system)))) - (dolist (system org-texinfo-supported-coding-systems "UTF-8") - (when (string-match-p (regexp-quote system) name) - (throw 'coding-system system)))))) - (language (plist-get info :language)) - (case-fold-search nil)) - ;; Auto coding system. - (replace-regexp-in-string - "^@documentencoding \\(AUTO\\)$" - coding - (replace-regexp-in-string - "^@documentlanguage \\(AUTO\\)$" language header t nil 1) t nil 1))) - ;; Additional header options set by #+TEXINFO_HEADER. - (let ((texinfo-header (plist-get info :texinfo-header))) - (and texinfo-header (org-element-normalize-string texinfo-header))) - "@c %**end of header\n\n" - ;; Additional options set by #+TEXINFO_POST_HEADER. - (let ((texinfo-post-header (plist-get info :texinfo-post-header))) - (and texinfo-post-header - (org-element-normalize-string texinfo-post-header))) - ;; Copying. - (and copying - (format "@copying\n%s@end copying\n\n" - (org-element-normalize-string - (org-export-data copying info)))) - ;; Info directory information. Only supply if both title and - ;; category are provided. - (let ((dircat (plist-get info :texinfo-dircat)) - (dirtitle - (let ((title (plist-get info :texinfo-dirtitle))) - (and title - (string-match "^\\(?:\\* \\)?\\(.*?\\)\\(\\.\\)?$" title) - (format "* %s." (match-string 1 title)))))) - (when (and dircat dirtitle) - (concat "@dircategory " dircat "\n" - "@direntry\n" - (let ((dirdesc - (let ((desc (plist-get info :texinfo-dirdesc))) - (cond ((not desc) nil) - ((string-suffix-p "." desc) desc) - (t (concat desc ".")))))) - (if dirdesc (format "%-23s %s" dirtitle dirdesc) dirtitle)) - "\n" - "@end direntry\n\n"))) - ;; Title - "@finalout\n" - "@titlepage\n" - (when (plist-get info :with-title) - (concat - (format "@title %s\n" - (or (plist-get info :texinfo-printed-title) title "")) - (let ((subtitle (plist-get info :subtitle))) - (when subtitle - (format "@subtitle %s\n" - (org-export-data subtitle info)))))) - (when (plist-get info :with-author) - (concat - ;; Primary author. - (let ((author (org-string-nw-p - (org-export-data (plist-get info :author) info))) - (email (and (plist-get info :with-email) - (org-string-nw-p - (org-export-data (plist-get info :email) info))))) - (cond ((and author email) - (format "@author %s (@email{%s})\n" author email)) - (author (format "@author %s\n" author)) - (email (format "@author @email{%s}\n" email)))) - ;; Other authors. - (let ((subauthor (plist-get info :subauthor))) - (and subauthor - (org-element-normalize-string - (replace-regexp-in-string "^" "@author " subauthor)))))) - (and copying "@page\n@vskip 0pt plus 1filll\n@insertcopying\n") - "@end titlepage\n\n" - ;; Table of contents. - (and (plist-get info :with-toc) "@contents\n\n") - ;; Configure Top Node when not for TeX. Also include contents - ;; from the first section of the document. - "@ifnottex\n" - "@node Top\n" - (format "@top %s\n" title) - (let* ((first-section - (org-element-map (plist-get info :parse-tree) 'section - #'identity info t '(headline))) - (top-contents - (org-export-data (org-element-contents first-section) info))) - (and (org-string-nw-p top-contents) (concat "\n" top-contents))) - "@end ifnottex\n\n" - ;; Menu. - (org-texinfo-make-menu (plist-get info :parse-tree) info 'master) - "\n" - ;; Document's body. - contents "\n" - ;; Creator. - (and (plist-get info :with-creator) - (concat (plist-get info :creator) "\n")) - ;; Document end. - "@bye"))) - - - -;;; Transcode Functions - -;;;; Bold - -(defun org-texinfo-bold (_bold contents info) - "Transcode BOLD from Org to Texinfo. -CONTENTS is the text with bold markup. INFO is a plist holding -contextual information." - (org-texinfo--text-markup contents 'bold info)) - -;;;; Center Block - -(defun org-texinfo-center-block (_center-block contents _info) - "Transcode a CENTER-BLOCK element from Org to Texinfo. -CONTENTS holds the contents of the block. INFO is a plist used -as a communication channel." - (replace-regexp-in-string "\\(^\\).*?\\S-" "@center " contents nil nil 1)) - -;;;; Clock - -(defun org-texinfo-clock (clock _contents info) - "Transcode a CLOCK element from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual -information." - (concat - "@noindent" - (format "@strong{%s} " org-clock-string) - (format (plist-get info :texinfo-inactive-timestamp-format) - (concat (org-timestamp-translate (org-element-property :value clock)) - (let ((time (org-element-property :duration clock))) - (and time (format " (%s)" time))))) - "@*")) - -;;;; Code - -(defun org-texinfo-code (code _contents info) - "Transcode a CODE object from Org to Texinfo. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (org-texinfo--text-markup (org-element-property :value code) 'code info)) - -;;;; Drawer - -(defun org-texinfo-drawer (drawer contents info) - "Transcode a DRAWER element from Org to Texinfo. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((name (org-element-property :drawer-name drawer)) - (output (funcall (plist-get info :texinfo-format-drawer-function) - name contents))) - output)) - -;;;; Dynamic Block - -(defun org-texinfo-dynamic-block (_dynamic-block contents _info) - "Transcode a DYNAMIC-BLOCK element from Org to Texinfo. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - contents) - -;;;; Entity - -(defun org-texinfo-entity (entity _contents _info) - "Transcode an ENTITY object from Org to Texinfo." - ;; Since there is not specific Texinfo entry in entities, use - ;; Texinfo-specific commands whenever possible, and fallback to - ;; UTF-8 otherwise. - (pcase (org-element-property :name entity) - ("AElig" "@AE{}") - ("aelig" "@ae{}") - ((or "bull" "bullet") "@bullet{}") - ("copy" "@copyright{}") - ("deg" "@textdegree{}") - ((or "dots" "hellip") "@dots{}") - ("equiv" "@equiv{}") - ((or "euro" "EUR") "@euro{}") - ((or "ge" "geq") "@geq{}") - ("laquo" "@guillemetleft{}") - ("iexcl" "@exclamdown{}") - ("imath" "@dotless{i}") - ("iquest" "@questiondown{}") - ("jmath" "@dotless{j}") - ((or "le" "leq") "@leq{}") - ("lsaquo" "@guilsinglleft{}") - ("mdash" "---") - ("minus" "@minus{}") - ("nbsp" "@tie{}") - ("ndash" "--") - ("OElig" "@OE{}") - ("oelig" "@oe{}") - ("ordf" "@ordf{}") - ("ordm" "@ordm{}") - ("pound" "@pound{}") - ("raquo" "@guillemetright{}") - ((or "rArr" "Rightarrow") "@result{}") - ("reg" "@registeredsymbol{}") - ((or "rightarrow" "to" "rarr") "@arrow{}") - ("rsaquo" "@guilsinglright{}") - ("thorn" "@th{}") - ("THORN" "@TH{}") - ((and (pred (string-prefix-p "_")) name) ;spacing entities - (format "@w{%s}" (substring name 1))) - (_ (org-element-property :utf-8 entity)))) - -;;;; Example Block - -(defun org-texinfo-example-block (example-block _contents info) - "Transcode an EXAMPLE-BLOCK element from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format "@example\n%s@end example" - (org-texinfo--sanitize-content - (org-export-format-code-default example-block info)))) - -;;; Export Block - -(defun org-texinfo-export-block (export-block _contents _info) - "Transcode a EXPORT-BLOCK element from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (string= (org-element-property :type export-block) "TEXINFO") - (org-remove-indentation (org-element-property :value export-block)))) - -;;; Export Snippet - -(defun org-texinfo-export-snippet (export-snippet _contents _info) - "Transcode a EXPORT-SNIPPET object from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (eq (org-export-snippet-backend export-snippet) 'texinfo) - (org-element-property :value export-snippet))) - -;;;; Fixed Width - -(defun org-texinfo-fixed-width (fixed-width _contents _info) - "Transcode a FIXED-WIDTH element from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual information." - (format "@example\n%s\n@end example" - (org-remove-indentation - (org-texinfo--sanitize-content - (org-element-property :value fixed-width))))) - -;;;; Footnote Reference - -(defun org-texinfo-footnote-reference (footnote _contents info) - "Create a footnote reference for FOOTNOTE. - -FOOTNOTE is the footnote to define. CONTENTS is nil. INFO is a -plist holding contextual information." - (let ((def (org-export-get-footnote-definition footnote info))) - (format "@footnote{%s}" - (org-trim (org-export-data def info))))) - -;;;; Headline - -(defun org-texinfo-headline (headline contents info) - "Transcode a HEADLINE element from Org to Texinfo. -CONTENTS holds the contents of the headline. INFO is a plist -holding contextual information." - (cond - ((org-element-property :footnote-section-p headline) nil) - ((org-not-nil (org-export-get-node-property :COPYING headline t)) nil) - (t - (let* ((index (let ((i (org-export-get-node-property :INDEX headline t))) - (and (member i '("cp" "fn" "ky" "pg" "tp" "vr")) i))) - (numbered? (org-export-numbered-headline-p headline info)) - (notoc? (org-export-excluded-from-toc-p headline info)) - (command - (and - (not (org-export-low-level-p headline info)) - (let ((class (plist-get info :texinfo-class))) - (pcase (assoc class (plist-get info :texinfo-classes)) - (`(,_ ,_ . ,sections) - (pcase (nth (1- (org-export-get-relative-level headline info)) - sections) - (`(,numbered ,unnumbered ,unnumbered-no-toc ,appendix) - (cond - ((org-not-nil - (org-export-get-node-property :APPENDIX headline t)) - appendix) - (numbered? numbered) - (index unnumbered) - (notoc? unnumbered-no-toc) - (t unnumbered))) - (`nil nil) - (_ (user-error "Invalid Texinfo class specification: %S" - class)))) - (_ (user-error "Unknown Texinfo class: %S" class)))))) - (todo - (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword headline))) - (and todo (org-export-data todo info))))) - (todo-type (and todo (org-element-property :todo-type headline))) - (tags (and (plist-get info :with-tags) - (org-export-get-tags headline info))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority headline))) - (text (org-texinfo--sanitize-title - (org-element-property :title headline) info)) - (full-text - (funcall (plist-get info :texinfo-format-headline-function) - todo todo-type priority text tags)) - (contents - (concat "\n" - (if (org-string-nw-p contents) (concat "\n" contents) "") - (and index (format "\n@printindex %s\n" index))))) - (if (not command) - (concat (and (org-export-first-sibling-p headline info) - (format "@%s\n" (if numbered? 'enumerate 'itemize))) - "@item\n" full-text "\n" - contents - (if (org-export-last-sibling-p headline info) - (format "@end %s" (if numbered? 'enumerate 'itemize)) - "\n")) - (concat - ;; Even if HEADLINE is using @subheading and al., leave an - ;; anchor so cross-references in the Org document still work. - (format (if notoc? "@anchor{%s}\n" "@node %s\n") - (org-texinfo--get-node headline info)) - (format command full-text) - contents)))))) - -(defun org-texinfo-format-headline-default-function - (todo _todo-type priority text tags) - "Default format function for a headline. -See `org-texinfo-format-headline-function' for details." - (concat (and todo (format "@strong{%s} " todo)) - (and priority (format "@emph{#%s} " priority)) - text - (and tags (concat " " (org-make-tag-string tags))))) - -;;;; Inline Src Block - -(defun org-texinfo-inline-src-block (inline-src-block _contents _info) - "Transcode an INLINE-SRC-BLOCK element from Org to Texinfo. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (format "@code{%s}" - (org-texinfo--sanitize-content - (org-element-property :value inline-src-block)))) - -;;;; Inlinetask - -(defun org-texinfo-inlinetask (inlinetask contents info) - "Transcode an INLINETASK element from Org to Texinfo. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let ((title (org-export-data (org-element-property :title inlinetask) info)) - (todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword inlinetask))) - (and todo (org-export-data todo info))))) - (todo-type (org-element-property :todo-type inlinetask)) - (tags (and (plist-get info :with-tags) - (org-export-get-tags inlinetask info))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority inlinetask)))) - (funcall (plist-get info :texinfo-format-inlinetask-function) - todo todo-type priority title tags contents))) - -(defun org-texinfo-format-inlinetask-default-function - (todo _todo-type priority title tags contents) - "Default format function for inlinetasks. -See `org-texinfo-format-inlinetask-function' for details." - (let ((full-title - (concat (when todo (format "@strong{%s} " todo)) - (when priority (format "#%c " priority)) - title - (when tags (org-make-tag-string tags))))) - (format "@center %s\n\n%s\n" full-title contents))) - -;;;; Italic - -(defun org-texinfo-italic (_italic contents info) - "Transcode ITALIC from Org to Texinfo. -CONTENTS is the text with italic markup. INFO is a plist holding -contextual information." - (org-texinfo--text-markup contents 'italic info)) - -;;;; Item - -(defun org-texinfo-item (item contents info) - "Transcode an ITEM element from Org to Texinfo. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (let* ((tag (org-element-property :tag item)) - (split (org-string-nw-p - (org-export-read-attribute :attr_texinfo - (org-element-property :parent item) - :sep))) - (items (and tag - (let ((tag (org-export-data tag info))) - (if split - (split-string tag (regexp-quote split) t "[ \t\n]+") - (list tag)))))) - (format "%s\n%s" - (pcase items - (`nil "@item") - (`(,item) (concat "@item " item)) - (`(,item . ,items) - (concat "@item " item "\n" - (mapconcat (lambda (i) (concat "@itemx " i)) - items - "\n")))) - (or contents "")))) - -;;;; Keyword - -(defun org-texinfo-keyword (keyword _contents info) - "Transcode a KEYWORD element from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((value (org-element-property :value keyword))) - (pcase (org-element-property :key keyword) - ("TEXINFO" value) - ("CINDEX" (format "@cindex %s" value)) - ("FINDEX" (format "@findex %s" value)) - ("KINDEX" (format "@kindex %s" value)) - ("PINDEX" (format "@pindex %s" value)) - ("TINDEX" (format "@tindex %s" value)) - ("VINDEX" (format "@vindex %s" value)) - ("TOC" - (cond ((string-match-p "\\" value) - (concat "@listoffloats " - (org-export-translate "Table" :utf-8 info))) - ((string-match-p "\\" value) - (concat "@listoffloats " - (org-export-translate "Listing" :utf-8 info)))))))) - -;;;; Line Break - -(defun org-texinfo-line-break (_line-break _contents _info) - "Transcode a LINE-BREAK object from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual information." - "@*\n") - -;;;; Link - -(defun org-texinfo--@ref (datum description info) - "Return @ref command for element or object DATUM. -DESCRIPTION is the printed name of the section, as a string, or -nil." - (let ((node-name (org-texinfo--get-node datum info)) - ;; Sanitize DESCRIPTION for cross-reference use. In - ;; particular, remove colons as they seem to cause pain (even - ;; within @asis{...}) to the Texinfo reader. - (title (and description - (replace-regexp-in-string - "[ \t]*:+" "" - (replace-regexp-in-string "," "@comma{}" description))))) - (if (or (not title) (equal title node-name)) - (format "@ref{%s}" node-name) - (format "@ref{%s, , %s}" node-name title)))) - -(defun org-texinfo-link (link desc info) - "Transcode a LINK object from Org to Texinfo. -DESC is the description part of the link, or the empty string. -INFO is a plist holding contextual information. See -`org-export-data'." - (let* ((type (org-element-property :type link)) - (raw-path (org-element-property :path link)) - ;; Ensure DESC really exists, or set it to nil. - (desc (and (not (string= desc "")) desc)) - (path (cond - ((member type '("http" "https" "ftp")) - (concat type ":" raw-path)) - ((string= type "file") (org-export-file-uri raw-path)) - (t raw-path)))) - (cond - ((org-export-custom-protocol-maybe link desc 'texinfo)) - ((org-export-inline-image-p link org-texinfo-inline-image-rules) - (org-texinfo--inline-image link info)) - ((equal type "radio") - (let ((destination (org-export-resolve-radio-link link info))) - (if (not destination) desc - (org-texinfo--@ref destination desc info)))) - ((member type '("custom-id" "id" "fuzzy")) - (let ((destination - (if (equal type "fuzzy") - (org-export-resolve-fuzzy-link link info) - (org-export-resolve-id-link link info)))) - (pcase (org-element-type destination) - (`nil - (format org-texinfo-link-with-unknown-path-format - (org-texinfo--sanitize-content path))) - ;; Id link points to an external file. - (`plain-text - (if desc (format "@uref{file://%s,%s}" destination desc) - (format "@uref{file://%s}" destination))) - ((or `headline - ;; Targets within headlines cannot be turned into - ;; @anchor{}, so we refer to the headline parent - ;; directly. - (and `target - (guard (eq 'headline - (org-element-type - (org-element-property :parent destination)))))) - (let ((headline (org-element-lineage destination '(headline) t))) - (org-texinfo--@ref headline desc info))) - (_ (org-texinfo--@ref destination desc info))))) - ((string= type "mailto") - (format "@email{%s}" - (concat (org-texinfo--sanitize-content path) - (and desc (concat ", " desc))))) - ;; External link with a description part. - ((and path desc) (format "@uref{%s, %s}" path desc)) - ;; External link without a description part. - (path (format "@uref{%s}" path)) - ;; No path, only description. Try to do something useful. - (t - (format (plist-get info :texinfo-link-with-unknown-path-format) desc))))) - -(defun org-texinfo--inline-image (link info) - "Return Texinfo code for an inline image. -LINK is the link pointing to the inline image. INFO is the -current state of the export, as a plist." - (let* ((parent (org-export-get-parent-element link)) - (label (and (org-element-property :name parent) - (org-texinfo--get-node parent info))) - (caption (org-export-get-caption parent)) - (shortcaption (org-export-get-caption parent t)) - (path (org-element-property :path link)) - (filename - (file-name-sans-extension - (if (file-name-absolute-p path) (expand-file-name path) path))) - (extension (file-name-extension path)) - (attributes (org-export-read-attribute :attr_texinfo parent)) - (height (or (plist-get attributes :height) "")) - (width (or (plist-get attributes :width) "")) - (alt (or (plist-get attributes :alt) "")) - (image (format "@image{%s,%s,%s,%s,%s}" - filename width height alt extension))) - (cond ((or caption shortcaption) - (org-texinfo--wrap-float image - info - (org-export-translate "Figure" :utf-8 info) - label - caption - shortcaption)) - (label (concat "@anchor{" label "}\n" image)) - (t image)))) - - -;;;; Menu - -(defun org-texinfo-make-menu (scope info &optional master) - "Create the menu for inclusion in the Texinfo document. - -SCOPE is a headline or a full parse tree. INFO is the -communication channel, as a plist. - -When optional argument MASTER is non-nil, generate a master menu, -including detailed node listing." - (let ((menu (org-texinfo--build-menu scope info))) - (when (org-string-nw-p menu) - (org-element-normalize-string - (format - "@menu\n%s@end menu" - (concat menu - (when master - (let ((detailmenu - (org-texinfo--build-menu - scope info - (let ((toc-depth (plist-get info :with-toc))) - (if (wholenump toc-depth) toc-depth - org-texinfo-max-toc-depth))))) - (when (org-string-nw-p detailmenu) - (concat "\n@detailmenu\n" - "--- The Detailed Node Listing ---\n\n" - detailmenu - "@end detailmenu\n")))))))))) - -(defun org-texinfo--build-menu (scope info &optional level) - "Build menu for entries within SCOPE. -SCOPE is a headline or a full parse tree. INFO is a plist -containing contextual information. When optional argument LEVEL -is an integer, build the menu recursively, down to this depth." - (cond - ((not level) - (org-texinfo--format-entries (org-texinfo--menu-entries scope info) info)) - ((zerop level) "\n") - (t - (mapconcat - (lambda (h) - (let ((entries (org-texinfo--menu-entries h info))) - (when entries - (concat - (format "%s\n\n%s\n" - (org-export-data (org-export-get-alt-title h info) info) - (org-texinfo--format-entries entries info)) - (org-texinfo--build-menu h info (1- level)))))) - (org-texinfo--menu-entries scope info) - "")))) - -(defun org-texinfo--format-entries (entries info) - "Format all direct menu entries in SCOPE, as a string. -SCOPE is either a headline or a full Org document. INFO is -a plist containing contextual information." - (org-element-normalize-string - (mapconcat - (lambda (h) - (let* ((title - ;; Colons are used as a separator between title and node - ;; name. Remove them. - (replace-regexp-in-string - "[ \t]+:+" "" - (org-texinfo--sanitize-title - (org-export-get-alt-title h info) info))) - (node (org-texinfo--get-node h info)) - (entry (concat "* " title ":" - (if (string= title node) ":" - (concat " " node ". ")))) - (desc (org-element-property :DESCRIPTION h))) - (if (not desc) entry - (format (format "%%-%ds %%s" org-texinfo-node-description-column) - entry desc)))) - entries "\n"))) - -(defun org-texinfo--menu-entries (scope info) - "List direct children in SCOPE needing a menu entry. -SCOPE is a headline or a full parse tree. INFO is a plist -holding contextual information." - (let* ((cache (or (plist-get info :texinfo-entries-cache) - (plist-get (plist-put info :texinfo-entries-cache - (make-hash-table :test #'eq)) - :texinfo-entries-cache))) - (cached-entries (gethash scope cache 'no-cache))) - (if (not (eq cached-entries 'no-cache)) cached-entries - (puthash scope - (cl-remove-if - (lambda (h) - (org-not-nil (org-export-get-node-property :COPYING h t))) - (org-export-collect-headlines info 1 scope)) - cache)))) - -;;;; Node Property - -(defun org-texinfo-node-property (node-property _contents _info) - "Transcode a NODE-PROPERTY element from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format "%s:%s" - (org-element-property :key node-property) - (let ((value (org-element-property :value node-property))) - (if value (concat " " value) "")))) - -;;;; Paragraph - -(defun org-texinfo-paragraph (_paragraph contents _info) - "Transcode a PARAGRAPH element from Org to Texinfo. -CONTENTS is the contents of the paragraph, as a string. INFO is -the plist used as a communication channel." - contents) - -;;;; Plain List - -(defun org-texinfo-plain-list (plain-list contents info) - "Transcode a PLAIN-LIST element from Org to Texinfo. -CONTENTS is the contents of the list. INFO is a plist holding -contextual information." - (let* ((attr (org-export-read-attribute :attr_texinfo plain-list)) - (indic (let ((i (or (plist-get attr :indic) - (plist-get info :texinfo-table-default-markup)))) - ;; Allow indicating commands with missing @ sign. - (if (string-prefix-p "@" i) i (concat "@" i)))) - (table-type (plist-get attr :table-type)) - (type (org-element-property :type plain-list)) - (enum - (cond ((not (eq type 'ordered)) nil) - ((plist-member attr :enum) (plist-get attr :enum)) - (t - ;; Texinfo only supports initial counters, i.e., it - ;; cannot change the numbering mid-list. - (let ((first-item (car (org-element-contents plain-list)))) - (org-element-property :counter first-item))))) - (list-type (cond - ((eq type 'ordered) "enumerate") - ((eq type 'unordered) "itemize") - ((member table-type '("ftable" "vtable")) table-type) - (t "table")))) - (format "@%s\n%s@end %s" - (cond ((eq type 'descriptive) (concat list-type " " indic)) - (enum (format "%s %s" list-type enum)) - (t list-type)) - contents - list-type))) - -;;;; Plain Text - -(defun org-texinfo-plain-text (text info) - "Transcode a TEXT string from Org to Texinfo. -TEXT is the string to transcode. INFO is a plist holding -contextual information." - ;; First protect @, { and }. - (let ((output (org-texinfo--sanitize-content text))) - ;; Activate smart quotes. Be sure to provide original TEXT string - ;; since OUTPUT may have been modified. - (when (plist-get info :with-smart-quotes) - (setq output - (org-export-activate-smart-quotes output :texinfo info text))) - ;; LaTeX into @LaTeX{} and TeX into @TeX{} - (let ((case-fold-search nil)) - (setq output (replace-regexp-in-string "\\(?:La\\)?TeX" "@\\&{}" output))) - ;; Convert special strings. - (when (plist-get info :with-special-strings) - (setq output - (replace-regexp-in-string - "\\.\\.\\." "@dots{}" - (replace-regexp-in-string "\\\\-" "@-" output)))) - ;; Handle break preservation if required. - (when (plist-get info :preserve-breaks) - (setq output (replace-regexp-in-string - "\\(\\\\\\\\\\)?[ \t]*\n" " @*\n" output))) - ;; Reverse sentence ending. A sentence can end with a capital - ;; letter. Use non-breaking space if it shouldn't. - (let ((case-fold-search nil)) - (replace-regexp-in-string - "[A-Z]\\([.?!]\\)\\(?:[])]\\|'\\{1,2\\}\\)?\\(?: \\|$\\)" - "@\\1" - output nil nil 1)))) - -;;;; Planning - -(defun org-texinfo-planning (planning _contents info) - "Transcode a PLANNING element from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual -information." - (concat - "@noindent" - (mapconcat - 'identity - (delq nil - (list - (let ((closed (org-element-property :closed planning))) - (when closed - (concat - (format "@strong{%s} " org-closed-string) - (format (plist-get info :texinfo-inactive-timestamp-format) - (org-timestamp-translate closed))))) - (let ((deadline (org-element-property :deadline planning))) - (when deadline - (concat - (format "@strong{%s} " org-deadline-string) - (format (plist-get info :texinfo-active-timestamp-format) - (org-timestamp-translate deadline))))) - (let ((scheduled (org-element-property :scheduled planning))) - (when scheduled - (concat - (format "@strong{%s} " org-scheduled-string) - (format (plist-get info :texinfo-active-timestamp-format) - (org-timestamp-translate scheduled))))))) - " ") - "@*")) - -;;;; Property Drawer - -(defun org-texinfo-property-drawer (_property-drawer contents _info) - "Transcode a PROPERTY-DRAWER element from Org to Texinfo. -CONTENTS holds the contents of the drawer. INFO is a plist -holding contextual information." - (and (org-string-nw-p contents) - (format "@verbatim\n%s@end verbatim" contents))) - -;;;; Quote Block - -(defun org-texinfo-quote-block (quote-block contents _info) - "Transcode a QUOTE-BLOCK element from Org to Texinfo. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let ((tag (org-export-read-attribute :attr_texinfo quote-block :tag)) - (author (org-export-read-attribute :attr_texinfo quote-block :author))) - (format "@quotation%s\n%s%s\n@end quotation" - (if tag (concat " " tag) "") - contents - (if author (concat "\n@author " author) "")))) - -;;;; Radio Target - -(defun org-texinfo-radio-target (radio-target text info) - "Transcode a RADIO-TARGET object from Org to Texinfo. -TEXT is the text of the target. INFO is a plist holding -contextual information." - (format "@anchor{%s}%s" - (org-texinfo--get-node radio-target info) - text)) - -;;;; Section - -(defun org-texinfo-section (section contents info) - "Transcode a SECTION element from Org to Texinfo. -CONTENTS holds the contents of the section. INFO is a plist -holding contextual information." - (let ((parent (org-export-get-parent-headline section))) - (when parent ;first section is handled in `org-texinfo-template' - (org-trim - (concat contents - "\n" - (and (not (org-export-excluded-from-toc-p parent info)) - (org-texinfo-make-menu parent info))))))) - -;;;; Special Block - -(defun org-texinfo-special-block (special-block contents _info) - "Transcode a SPECIAL-BLOCK element from Org to Texinfo. -CONTENTS holds the contents of the block. INFO is a plist used -as a communication channel." - (let ((opt (org-export-read-attribute :attr_texinfo special-block :options)) - (type (org-element-property :type special-block))) - (format "@%s%s\n%s@end %s" - type - (if opt (concat " " opt) "") - (or contents "") - type))) - -;;;; Src Block - -(defun org-texinfo-src-block (src-block _contents info) - "Transcode a SRC-BLOCK element from Org to Texinfo. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (let* ((lisp (string-match-p "lisp" - (org-element-property :language src-block))) - (code (org-texinfo--sanitize-content - (org-export-format-code-default src-block info))) - (value (format - (if lisp "@lisp\n%s@end lisp" "@example\n%s@end example") - code)) - (caption (org-export-get-caption src-block)) - (shortcaption (org-export-get-caption src-block t))) - (if (not (or caption shortcaption)) value - (org-texinfo--wrap-float value - info - (org-export-translate "Listing" :utf-8 info) - (org-texinfo--get-node src-block info) - caption - shortcaption)))) - -;;;; Statistics Cookie - -(defun org-texinfo-statistics-cookie (statistics-cookie _contents _info) - "Transcode a STATISTICS-COOKIE object from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual information." - (org-element-property :value statistics-cookie)) - - -;;;; Strike-through - -(defun org-texinfo-strike-through (_strike-through contents info) - "Transcode STRIKE-THROUGH from Org to Texinfo. -CONTENTS is the text with strike-through markup. INFO is a plist -holding contextual information." - (org-texinfo--text-markup contents 'strike-through info)) - -;;;; Subscript - -(defun org-texinfo-subscript (_subscript contents _info) - "Transcode a SUBSCRIPT object from Org to Texinfo. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "@math{_%s}" contents)) - -;;;; Superscript - -(defun org-texinfo-superscript (_superscript contents _info) - "Transcode a SUPERSCRIPT object from Org to Texinfo. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "@math{^%s}" contents)) - -;;;; Table - -(defun org-texinfo-table (table contents info) - "Transcode a TABLE element from Org to Texinfo. -CONTENTS is the contents of the table. INFO is a plist holding -contextual information." - (if (eq (org-element-property :type table) 'table.el) - (format "@verbatim\n%s@end verbatim" - (org-element-normalize-string - (org-element-property :value table))) - (let* ((col-width (org-export-read-attribute :attr_texinfo table :columns)) - (columns - (if col-width (format "@columnfractions %s" col-width) - (org-texinfo-table-column-widths table info))) - (caption (org-export-get-caption table)) - (shortcaption (org-export-get-caption table t)) - (table-str (format "@multitable %s\n%s@end multitable" - columns - contents))) - (if (not (or caption shortcaption)) table-str - (org-texinfo--wrap-float table-str - info - (org-export-translate "Table" :utf-8 info) - (org-texinfo--get-node table info) - caption - shortcaption))))) - -(defun org-texinfo-table-column-widths (table info) - "Determine the largest table cell in each column to process alignment. -TABLE is the table element to transcode. INFO is a plist used as -a communication channel." - (let ((widths (make-vector (cdr (org-export-table-dimensions table info)) 0))) - (org-element-map table 'table-row - (lambda (row) - (let ((idx 0)) - (org-element-map row 'table-cell - (lambda (cell) - ;; Length of the cell in the original buffer is only an - ;; approximation of the length of the cell in the - ;; output. It can sometimes fail (e.g. it considers - ;; "/a/" being larger than "ab"). - (let ((w (- (org-element-property :contents-end cell) - (org-element-property :contents-begin cell)))) - (aset widths idx (max w (aref widths idx)))) - (cl-incf idx)) - info))) - info) - (format "{%s}" (mapconcat (lambda (w) (make-string w ?a)) widths "} {")))) - -;;;; Table Cell - -(defun org-texinfo-table-cell (table-cell contents info) - "Transcode a TABLE-CELL element from Org to Texinfo. -CONTENTS is the cell contents. INFO is a plist used as -a communication channel." - (concat - (let ((scientific-notation - (plist-get info :texinfo-table-scientific-notation))) - (if (and contents - scientific-notation - (string-match orgtbl-exp-regexp contents)) - ;; Use appropriate format string for scientific notation. - (format scientific-notation - (match-string 1 contents) - (match-string 2 contents)) - contents)) - (when (org-export-get-next-element table-cell info) "\n@tab "))) - -;;;; Table Row - -(defun org-texinfo-table-row (table-row contents info) - "Transcode a TABLE-ROW element from Org to Texinfo. -CONTENTS is the contents of the row. INFO is a plist used as -a communication channel." - ;; Rules are ignored since table separators are deduced from - ;; borders of the current row. - (when (eq (org-element-property :type table-row) 'standard) - (let ((rowgroup-tag - (if (and (= 1 (org-export-table-row-group table-row info)) - (org-export-table-has-header-p - (org-export-get-parent-table table-row) info)) - "@headitem " - "@item "))) - (concat rowgroup-tag contents "\n")))) - -;;;; Target - -(defun org-texinfo-target (target _contents info) - "Transcode a TARGET object from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format "@anchor{%s}" (org-texinfo--get-node target info))) - -;;;; Timestamp - -(defun org-texinfo-timestamp (timestamp _contents info) - "Transcode a TIMESTAMP object from Org to Texinfo. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let ((value (org-texinfo-plain-text - (org-timestamp-translate timestamp) info))) - (pcase (org-element-property :type timestamp) - ((or `active `active-range) - (format (plist-get info :texinfo-active-timestamp-format) value)) - ((or `inactive `inactive-range) - (format (plist-get info :texinfo-inactive-timestamp-format) value)) - (_ (format (plist-get info :texinfo-diary-timestamp-format) value))))) - -;;;; Underline - -(defun org-texinfo-underline (_underline contents info) - "Transcode UNDERLINE from Org to Texinfo. -CONTENTS is the text with underline markup. INFO is a plist -holding contextual information." - (org-texinfo--text-markup contents 'underline info)) - -;;;; Verbatim - -(defun org-texinfo-verbatim (verbatim _contents info) - "Transcode a VERBATIM object from Org to Texinfo. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (org-texinfo--text-markup - (org-element-property :value verbatim) 'verbatim info)) - -;;;; Verse Block - -(defun org-texinfo-verse-block (_verse-block contents _info) - "Transcode a VERSE-BLOCK element from Org to Texinfo. -CONTENTS is verse block contents. INFO is a plist holding -contextual information." - (format "@display\n%s@end display" contents)) - - -;;; Interactive functions - -;;;###autoload -(defun org-texinfo-export-to-texinfo - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to a Texinfo file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only write code -between \"\\begin{document}\" and \"\\end{document}\". - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Return output file's name." - (interactive) - (let ((outfile (org-export-output-file-name ".texi" subtreep)) - (org-export-coding-system org-texinfo-coding-system)) - (org-export-to-file 'texinfo outfile - async subtreep visible-only body-only ext-plist))) - -;;;###autoload -(defun org-texinfo-export-to-info - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to Texinfo then process through to INFO. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only write code -between \"\\begin{document}\" and \"\\end{document}\". - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -When optional argument PUB-DIR is set, use it as the publishing -directory. - -Return INFO file's name." - (interactive) - (let ((outfile (org-export-output-file-name ".texi" subtreep)) - (org-export-coding-system org-texinfo-coding-system)) - (org-export-to-file 'texinfo outfile - async subtreep visible-only body-only ext-plist - (lambda (file) (org-texinfo-compile file))))) - -;;;###autoload -(defun org-texinfo-publish-to-texinfo (plist filename pub-dir) - "Publish an org file to Texinfo. - -FILENAME is the filename of the Org file to be published. PLIST -is the property list for the given project. PUB-DIR is the -publishing directory. - -Return output file name." - (org-publish-org-to 'texinfo filename ".texi" plist pub-dir)) - -;;;###autoload -(defun org-texinfo-convert-region-to-texinfo () - "Assume the current region has Org syntax, and convert it to Texinfo. -This can be used in any buffer. For example, you can write an -itemized list in Org syntax in an Texinfo buffer and use this -command to convert it." - (interactive) - (org-export-replace-region-by 'texinfo)) - -(defun org-texinfo-compile (file) - "Compile a texinfo file. - -FILE is the name of the file being compiled. Processing is done -through the command specified in `org-texinfo-info-process', -which see. Output is redirected to \"*Org INFO Texinfo Output*\" -buffer. - -Return INFO file name or an error if it couldn't be produced." - (message "Processing Texinfo file %s..." file) - (let* ((log-name "*Org INFO Texinfo Output*") - (log (get-buffer-create log-name)) - (output - (org-compile-file file org-texinfo-info-process "info" - (format "See %S for details" log-name) - log))) - (when org-texinfo-remove-logfiles - (let ((base (file-name-sans-extension output))) - (dolist (ext org-texinfo-logfiles-extensions) - (let ((file (concat base "." ext))) - (when (file-exists-p file) (delete-file file)))))) - (message "Process completed.") - output)) - - -(provide 'ox-texinfo) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox-texinfo.el ends here diff --git a/elpa/org-9.3.6/ox-texinfo.elc b/elpa/org-9.3.6/ox-texinfo.elc deleted file mode 100644 index dfbd172f274be7101c3057076427493be9732fce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57886 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

~} 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 diff --git a/elpa/org-9.3.6/ox.el b/elpa/org-9.3.6/ox.el deleted file mode 100644 index 86916473..00000000 --- a/elpa/org-9.3.6/ox.el +++ /dev/null @@ -1,6982 +0,0 @@ -;;; ox.el --- Export Framework for Org Mode -*- lexical-binding: t; -*- - -;; Copyright (C) 2012-2020 Free Software Foundation, Inc. - -;; Author: Nicolas Goaziou -;; Keywords: outlines, hypermedia, calendar, wp - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: -;; -;; This library implements a generic export engine for Org, built on -;; its syntactical parser: Org Elements. -;; -;; Besides that parser, the generic exporter is made of three distinct -;; parts: -;; -;; - The communication channel consists of a property list, which is -;; created and updated during the process. Its use is to offer -;; every piece of information, would it be about initial environment -;; or contextual data, all in a single place. -;; -;; - The transcoder walks the parse tree, ignores or treat as plain -;; text elements and objects according to export options, and -;; eventually calls back-end specific functions to do the real -;; transcoding, concatenating their return value along the way. -;; -;; - The filter system is activated at the very beginning and the very -;; end of the export process, and each time an element or an object -;; has been converted. It is the entry point to fine-tune standard -;; output from back-end transcoders. See "The Filter System" -;; section for more information. -;; -;; The core functions is `org-export-as'. It returns the transcoded -;; buffer as a string. Its derivatives are `org-export-to-buffer' and -;; `org-export-to-file'. -;; -;; An export back-end is defined with `org-export-define-backend'. -;; This function can also support specific buffer keywords, OPTION -;; keyword's items and filters. Refer to function's documentation for -;; more information. -;; -;; If the new back-end shares most properties with another one, -;; `org-export-define-derived-backend' can be used to simplify the -;; process. -;; -;; Any back-end can define its own variables. Among them, those -;; customizable should belong to the `org-export-BACKEND' group. -;; -;; Tools for common tasks across back-ends are implemented in the -;; following part of the file. -;; -;; Eventually, a dispatcher (`org-export-dispatch') is provided in the -;; last one. -;; -;; See for -;; more information. - -;;; Code: - -(require 'cl-lib) -(require 'ob-exp) -(require 'ol) -(require 'org-element) -(require 'org-macro) -(require 'tabulated-list) - -(declare-function org-src-coderef-format "org-src" (&optional element)) -(declare-function org-src-coderef-regexp "org-src" (fmt &optional label)) -(declare-function org-publish "ox-publish" (project &optional force async)) -(declare-function org-publish-all "ox-publish" (&optional force async)) -(declare-function org-publish-current-file "ox-publish" (&optional force async)) -(declare-function org-publish-current-project "ox-publish" (&optional force async)) - -(defvar org-publish-project-alist) -(defvar org-table-number-fraction) -(defvar org-table-number-regexp) - - -;;; Internal Variables -;; -;; Among internal variables, the most important is -;; `org-export-options-alist'. This variable define the global export -;; options, shared between every exporter, and how they are acquired. - -(defconst org-export-max-depth 19 - "Maximum nesting depth for headlines, counting from 0.") - -(defconst org-export-options-alist - '((:title "TITLE" nil nil parse) - (:date "DATE" nil nil parse) - (:author "AUTHOR" nil user-full-name parse) - (:email "EMAIL" nil user-mail-address t) - (:language "LANGUAGE" nil org-export-default-language t) - (:select-tags "SELECT_TAGS" nil org-export-select-tags split) - (:exclude-tags "EXCLUDE_TAGS" nil org-export-exclude-tags split) - (:creator "CREATOR" nil org-export-creator-string) - (:headline-levels nil "H" org-export-headline-levels) - (:preserve-breaks nil "\\n" org-export-preserve-breaks) - (:section-numbers nil "num" org-export-with-section-numbers) - (:time-stamp-file nil "timestamp" org-export-time-stamp-file) - (:with-archived-trees nil "arch" org-export-with-archived-trees) - (:with-author nil "author" org-export-with-author) - (:with-broken-links nil "broken-links" org-export-with-broken-links) - (:with-clocks nil "c" org-export-with-clocks) - (:with-creator nil "creator" org-export-with-creator) - (:with-date nil "date" org-export-with-date) - (:with-drawers nil "d" org-export-with-drawers) - (:with-email nil "email" org-export-with-email) - (:with-emphasize nil "*" org-export-with-emphasize) - (:with-entities nil "e" org-export-with-entities) - (:with-fixed-width nil ":" org-export-with-fixed-width) - (:with-footnotes nil "f" org-export-with-footnotes) - (:with-inlinetasks nil "inline" org-export-with-inlinetasks) - (:with-latex nil "tex" org-export-with-latex) - (:with-planning nil "p" org-export-with-planning) - (:with-priority nil "pri" org-export-with-priority) - (:with-properties nil "prop" org-export-with-properties) - (:with-smart-quotes nil "'" org-export-with-smart-quotes) - (:with-special-strings nil "-" org-export-with-special-strings) - (:with-statistics-cookies nil "stat" org-export-with-statistics-cookies) - (:with-sub-superscript nil "^" org-export-with-sub-superscripts) - (:with-toc nil "toc" org-export-with-toc) - (:with-tables nil "|" org-export-with-tables) - (:with-tags nil "tags" org-export-with-tags) - (:with-tasks nil "tasks" org-export-with-tasks) - (:with-timestamps nil "<" org-export-with-timestamps) - (:with-title nil "title" org-export-with-title) - (:with-todo-keywords nil "todo" org-export-with-todo-keywords)) - "Alist between export properties and ways to set them. - -The key of the alist is the property name, and the value is a list -like (KEYWORD OPTION DEFAULT BEHAVIOR) where: - -KEYWORD is a string representing a buffer keyword, or nil. Each - property defined this way can also be set, during subtree - export, through a headline property named after the keyword - with the \"EXPORT_\" prefix (i.e. DATE keyword and EXPORT_DATE - property). -OPTION is a string that could be found in an #+OPTIONS: line. -DEFAULT is the default value for the property. -BEHAVIOR determines how Org should handle multiple keywords for - the same property. It is a symbol among: - nil Keep old value and discard the new one. - t Replace old value with the new one. - `space' Concatenate the values, separating them with a space. - `newline' Concatenate the values, separating them with - a newline. - `split' Split values at white spaces, and cons them to the - previous list. - `parse' Parse value as a list of strings and Org objects, - which can then be transcoded with, e.g., - `org-export-data'. It implies `space' behavior. - -Values set through KEYWORD and OPTION have precedence over -DEFAULT. - -All these properties should be back-end agnostic. Back-end -specific properties are set through `org-export-define-backend'. -Properties redefined there have precedence over these.") - -(defconst org-export-special-keywords '("FILETAGS" "SETUPFILE" "OPTIONS") - "List of in-buffer keywords that require special treatment. -These keywords are not directly associated to a property. The -way they are handled must be hard-coded into -`org-export--get-inbuffer-options' function.") - -(defconst org-export-filters-alist - '((:filter-body . org-export-filter-body-functions) - (:filter-bold . org-export-filter-bold-functions) - (:filter-babel-call . org-export-filter-babel-call-functions) - (:filter-center-block . org-export-filter-center-block-functions) - (:filter-clock . org-export-filter-clock-functions) - (:filter-code . org-export-filter-code-functions) - (:filter-diary-sexp . org-export-filter-diary-sexp-functions) - (:filter-drawer . org-export-filter-drawer-functions) - (:filter-dynamic-block . org-export-filter-dynamic-block-functions) - (:filter-entity . org-export-filter-entity-functions) - (:filter-example-block . org-export-filter-example-block-functions) - (:filter-export-block . org-export-filter-export-block-functions) - (:filter-export-snippet . org-export-filter-export-snippet-functions) - (:filter-final-output . org-export-filter-final-output-functions) - (:filter-fixed-width . org-export-filter-fixed-width-functions) - (:filter-footnote-definition . org-export-filter-footnote-definition-functions) - (:filter-footnote-reference . org-export-filter-footnote-reference-functions) - (:filter-headline . org-export-filter-headline-functions) - (:filter-horizontal-rule . org-export-filter-horizontal-rule-functions) - (:filter-inline-babel-call . org-export-filter-inline-babel-call-functions) - (:filter-inline-src-block . org-export-filter-inline-src-block-functions) - (:filter-inlinetask . org-export-filter-inlinetask-functions) - (:filter-italic . org-export-filter-italic-functions) - (:filter-item . org-export-filter-item-functions) - (:filter-keyword . org-export-filter-keyword-functions) - (:filter-latex-environment . org-export-filter-latex-environment-functions) - (:filter-latex-fragment . org-export-filter-latex-fragment-functions) - (:filter-line-break . org-export-filter-line-break-functions) - (:filter-link . org-export-filter-link-functions) - (:filter-node-property . org-export-filter-node-property-functions) - (:filter-options . org-export-filter-options-functions) - (:filter-paragraph . org-export-filter-paragraph-functions) - (:filter-parse-tree . org-export-filter-parse-tree-functions) - (:filter-plain-list . org-export-filter-plain-list-functions) - (:filter-plain-text . org-export-filter-plain-text-functions) - (:filter-planning . org-export-filter-planning-functions) - (:filter-property-drawer . org-export-filter-property-drawer-functions) - (:filter-quote-block . org-export-filter-quote-block-functions) - (:filter-radio-target . org-export-filter-radio-target-functions) - (:filter-section . org-export-filter-section-functions) - (:filter-special-block . org-export-filter-special-block-functions) - (:filter-src-block . org-export-filter-src-block-functions) - (:filter-statistics-cookie . org-export-filter-statistics-cookie-functions) - (:filter-strike-through . org-export-filter-strike-through-functions) - (:filter-subscript . org-export-filter-subscript-functions) - (:filter-superscript . org-export-filter-superscript-functions) - (:filter-table . org-export-filter-table-functions) - (:filter-table-cell . org-export-filter-table-cell-functions) - (:filter-table-row . org-export-filter-table-row-functions) - (:filter-target . org-export-filter-target-functions) - (:filter-timestamp . org-export-filter-timestamp-functions) - (:filter-underline . org-export-filter-underline-functions) - (:filter-verbatim . org-export-filter-verbatim-functions) - (:filter-verse-block . org-export-filter-verse-block-functions)) - "Alist between filters properties and initial values. - -The key of each association is a property name accessible through -the communication channel. Its value is a configurable global -variable defining initial filters. - -This list is meant to install user specified filters. Back-end -developers may install their own filters using -`org-export-define-backend'. Filters defined there will always -be prepended to the current list, so they always get applied -first.") - -(defconst org-export-default-inline-image-rule - `(("file" . - ,(format "\\.%s\\'" - (regexp-opt - '("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" - "xpm" "pbm" "pgm" "ppm") t)))) - "Default rule for link matching an inline image. -This rule applies to links with no description. By default, it -will be considered as an inline image if it targets a local file -whose extension is either \"png\", \"jpeg\", \"jpg\", \"gif\", -\"tiff\", \"tif\", \"xbm\", \"xpm\", \"pbm\", \"pgm\" or \"ppm\". -See `org-export-inline-image-p' for more information about -rules.") - -(defconst org-export-ignored-local-variables - '(org-font-lock-keywords - org-element--cache org-element--cache-objects org-element--cache-sync-keys - org-element--cache-sync-requests org-element--cache-sync-timer) - "List of variables not copied through upon buffer duplication. -Export process takes place on a copy of the original buffer. -When this copy is created, all Org related local variables not in -this list are copied to the new buffer. Variables with an -unreadable value are also ignored.") - -(defvar org-export-async-debug nil - "Non-nil means asynchronous export process should leave data behind. - -This data is found in the appropriate \"*Org Export Process*\" -buffer, and in files prefixed with \"org-export-process\" and -located in `temporary-file-directory'. - -When non-nil, it will also set `debug-on-error' to a non-nil -value in the external process.") - -(defvar org-export-stack-contents nil - "Record asynchronously generated export results and processes. -This is an alist: its CAR is the source of the -result (destination file or buffer for a finished process, -original buffer for a running one) and its CDR is a list -containing the back-end used, as a symbol, and either a process -or the time at which it finished. It is used to build the menu -from `org-export-stack'.") - -(defvar org-export-registered-backends nil - "List of backends currently available in the exporter. -This variable is set with `org-export-define-backend' and -`org-export-define-derived-backend' functions.") - -(defvar org-export-dispatch-last-action nil - "Last command called from the dispatcher. -The value should be a list. Its CAR is the action, as a symbol, -and its CDR is a list of export options.") - -(defvar org-export-dispatch-last-position (make-marker) - "The position where the last export command was created using the dispatcher. -This marker will be used with `C-u C-c C-e' to make sure export repetition -uses the same subtree if the previous command was restricted to a subtree.") - -;; For compatibility with Org < 8 -(defvar org-export-current-backend nil - "Name, if any, of the back-end used during an export process. - -Its value is a symbol such as `html', `latex', `ascii', or nil if -the back-end is anonymous (see `org-export-create-backend') or if -there is no export process in progress. - -It can be used to teach Babel blocks how to act differently -according to the back-end used.") - - - -;;; User-configurable Variables -;; -;; Configuration for the masses. -;; -;; They should never be accessed directly, as their value is to be -;; stored in a property list (cf. `org-export-options-alist'). -;; Back-ends will read their value from there instead. - -(defgroup org-export nil - "Options for exporting Org mode files." - :tag "Org Export" - :group 'org) - -(defgroup org-export-general nil - "General options for export engine." - :tag "Org Export General" - :group 'org-export) - -(defcustom org-export-with-archived-trees 'headline - "Whether sub-trees with the ARCHIVE tag should be exported. - -This can have three different values: -nil Do not export, pretend this tree is not present. -t Do export the entire tree. -`headline' Only export the headline, but skip the tree below it. - -This option can also be set with the OPTIONS keyword, -e.g. \"arch:nil\"." - :group 'org-export-general - :type '(choice - (const :tag "Not at all" nil) - (const :tag "Headline only" headline) - (const :tag "Entirely" t)) - :safe (lambda (x) (memq x '(t nil headline)))) - -(defcustom org-export-with-author t - "Non-nil means insert author name into the exported file. -This option can also be set with the OPTIONS keyword, -e.g. \"author:nil\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-clocks nil - "Non-nil means export CLOCK keywords. -This option can also be set with the OPTIONS keyword, -e.g. \"c:t\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-creator nil - "Non-nil means the postamble should contain a creator sentence. - -The sentence can be set in `org-export-creator-string', which -see. - -This option can also be set with the OPTIONS keyword, e.g., -\"creator:t\"." - :group 'org-export-general - :version "26.1" - :package-version '(Org . "8.3") - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-date t - "Non-nil means insert date in the exported document. -This option can also be set with the OPTIONS keyword, -e.g. \"date:nil\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-date-timestamp-format nil - "Time-stamp format string to use for DATE keyword. - -The format string, when specified, only applies if date consists -in a single time-stamp. Otherwise its value will be ignored. - -See `format-time-string' for details on how to build this -string." - :group 'org-export-general - :type '(choice - (string :tag "Time-stamp format string") - (const :tag "No format string" nil)) - :safe (lambda (x) (or (null x) (stringp x)))) - -(defcustom org-export-creator-string - (format "Emacs %s (Org mode %s)" - emacs-version - (if (fboundp 'org-version) (org-version) "unknown version")) - "Information about the creator of the document. -This option can also be set on with the CREATOR keyword." - :group 'org-export-general - :type '(string :tag "Creator string") - :safe #'stringp) - -(defcustom org-export-with-drawers '(not "LOGBOOK") - "Non-nil means export contents of standard drawers. - -When t, all drawers are exported. This may also be a list of -drawer names to export, as strings. If that list starts with -`not', only drawers with such names will be ignored. - -This variable doesn't apply to properties drawers. See -`org-export-with-properties' instead. - -This option can also be set with the OPTIONS keyword, -e.g. \"d:nil\"." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (const :tag "All drawers" t) - (const :tag "None" nil) - (repeat :tag "Selected drawers" - (string :tag "Drawer name")) - (list :tag "Ignored drawers" - (const :format "" not) - (repeat :tag "Specify names of drawers to ignore during export" - :inline t - (string :tag "Drawer name")))) - :safe (lambda (x) (or (booleanp x) (consp x)))) - -(defcustom org-export-with-email nil - "Non-nil means insert author email into the exported file. -This option can also be set with the OPTIONS keyword, -e.g. \"email:t\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-emphasize t - "Non-nil means interpret *word*, /word/, _word_ and +word+. - -If the export target supports emphasizing text, the word will be -typeset in bold, italic, with an underline or strike-through, -respectively. - -This option can also be set with the OPTIONS keyword, -e.g. \"*:nil\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-exclude-tags '("noexport") - "Tags that exclude a tree from export. - -All trees carrying any of these tags will be excluded from -export. This is without condition, so even subtrees inside that -carry one of the `org-export-select-tags' will be removed. - -This option can also be set with the EXCLUDE_TAGS keyword." - :group 'org-export-general - :type '(repeat (string :tag "Tag")) - :safe (lambda (x) (and (listp x) (cl-every #'stringp x)))) - -(defcustom org-export-with-fixed-width t - "Non-nil means export lines starting with \":\". -This option can also be set with the OPTIONS keyword, -e.g. \"::nil\"." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-footnotes t - "Non-nil means Org footnotes should be exported. -This option can also be set with the OPTIONS keyword, -e.g. \"f:nil\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-latex t - "Non-nil means process LaTeX environments and fragments. - -This option can also be set with the OPTIONS line, -e.g. \"tex:verbatim\". Allowed values are: - -nil Ignore math snippets. -`verbatim' Keep everything in verbatim. -t Allow export of math snippets." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (const :tag "Do not process math in any way" nil) - (const :tag "Interpret math snippets" t) - (const :tag "Leave math verbatim" verbatim)) - :safe (lambda (x) (memq x '(t nil verbatim)))) - -(defcustom org-export-headline-levels 3 - "The last level which is still exported as a headline. - -Inferior levels will usually produce itemize or enumerate lists -when exported, but back-end behavior may differ. - -This option can also be set with the OPTIONS keyword, -e.g. \"H:2\"." - :group 'org-export-general - :type 'integer - :safe #'integerp) - -(defcustom org-export-default-language "en" - "The default language for export and clocktable translations, as a string. -This may have an association in -`org-clock-clocktable-language-setup', -`org-export-smart-quotes-alist' and `org-export-dictionary'. -This option can also be set with the LANGUAGE keyword." - :group 'org-export-general - :type '(string :tag "Language") - :safe #'stringp) - -(defcustom org-export-preserve-breaks nil - "Non-nil means preserve all line breaks when exporting. -This option can also be set with the OPTIONS keyword, -e.g. \"\\n:t\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-entities t - "Non-nil means interpret entities when exporting. - -For example, HTML export converts \\alpha to α and \\AA to -Å. - -For a list of supported names, see the constant `org-entities' -and the user option `org-entities-user'. - -This option can also be set with the OPTIONS keyword, -e.g. \"e:nil\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-inlinetasks t - "Non-nil means inlinetasks should be exported. -This option can also be set with the OPTIONS keyword, -e.g. \"inline:nil\"." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-planning nil - "Non-nil means include planning info in export. - -Planning info is the line containing either SCHEDULED:, -DEADLINE:, CLOSED: time-stamps, or a combination of them. - -This option can also be set with the OPTIONS keyword, -e.g. \"p:t\"." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-priority nil - "Non-nil means include priority cookies in export. -This option can also be set with the OPTIONS keyword, -e.g. \"pri:t\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-properties nil - "Non-nil means export contents of properties drawers. - -When t, all properties are exported. This may also be a list of -properties to export, as strings. - -This option can also be set with the OPTIONS keyword, -e.g. \"prop:t\"." - :group 'org-export-general - :version "26.1" - :package-version '(Org . "8.3") - :type '(choice - (const :tag "All properties" t) - (const :tag "None" nil) - (repeat :tag "Selected properties" - (string :tag "Property name"))) - :safe (lambda (x) (or (booleanp x) - (and (listp x) (cl-every #'stringp x))))) - -(defcustom org-export-with-section-numbers t - "Non-nil means add section numbers to headlines when exporting. - -When set to an integer n, numbering will only happen for -headlines whose relative level is higher or equal to n. - -This option can also be set with the OPTIONS keyword, -e.g. \"num:t\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-select-tags '("export") - "Tags that select a tree for export. - -If any such tag is found in a buffer, all trees that do not carry -one of these tags will be ignored during export. Inside trees -that are selected like this, you can still deselect a subtree by -tagging it with one of the `org-export-exclude-tags'. - -This option can also be set with the SELECT_TAGS keyword." - :group 'org-export-general - :type '(repeat (string :tag "Tag")) - :safe (lambda (x) (and (listp x) (cl-every #'stringp x)))) - -(defcustom org-export-with-smart-quotes nil - "Non-nil means activate smart quotes during export. -This option can also be set with the OPTIONS keyword, -e.g., \"':t\". - -When setting this to non-nil, you need to take care of -using the correct Babel package when exporting to LaTeX. -E.g., you can load Babel for french like this: - -#+LATEX_HEADER: \\usepackage[french]{babel}" - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-special-strings t - "Non-nil means interpret \"\\-\", \"--\" and \"---\" for export. - -When this option is turned on, these strings will be exported as: - - Org HTML LaTeX UTF-8 - -----+----------+--------+------- - \\- ­ \\- - -- – -- – - --- — --- — - ... … \\ldots … - -This option can also be set with the OPTIONS keyword, -e.g. \"-:nil\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-statistics-cookies t - "Non-nil means include statistics cookies in export. -This option can also be set with the OPTIONS keyword, -e.g. \"stat:nil\"" - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-sub-superscripts t - "Non-nil means interpret \"_\" and \"^\" for export. - -If you want to control how Org displays those characters, see -`org-use-sub-superscripts'. `org-export-with-sub-superscripts' -used to be an alias for `org-use-sub-superscripts' in Org <8.0, -it is not anymore. - -When this option is turned on, you can use TeX-like syntax for -sub- and superscripts and see them exported correctly. - -You can also set the option with #+OPTIONS: ^:t - -Several characters after \"_\" or \"^\" will be considered as a -single item - so grouping with {} is normally not needed. For -example, the following things will be parsed as single sub- or -superscripts: - - 10^24 or 10^tau several digits will be considered 1 item. - 10^-12 or 10^-tau a leading sign with digits or a word - x^2-y^3 will be read as x^2 - y^3, because items are - terminated by almost any nonword/nondigit char. - x_{i^2} or x^(2-i) braces or parenthesis do grouping. - -Still, ambiguity is possible. So when in doubt, use {} to enclose -the sub/superscript. If you set this variable to the symbol `{}', -the braces are *required* in order to trigger interpretations as -sub/superscript. This can be helpful in documents that need \"_\" -frequently in plain text." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (const :tag "Interpret them" t) - (const :tag "Curly brackets only" {}) - (const :tag "Do not interpret them" nil)) - :safe (lambda (x) (memq x '(t nil {})))) - -(defcustom org-export-with-toc t - "Non-nil means create a table of contents in exported files. - -The table of contents contains headlines with levels up to -`org-export-headline-levels'. - -When this variable is set to an integer N, include levels up to -N in the table of contents. Although it may then be different -from `org-export-headline-levels', it is cannot be larger than -the number of headline levels. - -When nil, no table of contents is created. - -This option can also be set with the OPTIONS keyword, -e.g. \"toc:nil\" or \"toc:3\"." - :group 'org-export-general - :type '(choice - (const :tag "No Table of Contents" nil) - (const :tag "Full Table of Contents" t) - (integer :tag "TOC to level")) - :safe (lambda (x) - (or (booleanp x) - (integerp x)))) - -(defcustom org-export-with-tables t - "Non-nil means export tables. -This option can also be set with the OPTIONS keyword, -e.g. \"|:nil\"." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-tags t - "If nil, do not export tags, just remove them from headlines. - -If this is the symbol `not-in-toc', tags will be removed from -table of contents entries, but still be shown in the headlines of -the document. - -This option can also be set with the OPTIONS keyword, -e.g. \"tags:nil\"." - :group 'org-export-general - :type '(choice - (const :tag "Off" nil) - (const :tag "Not in TOC" not-in-toc) - (const :tag "On" t)) - :safe (lambda (x) (memq x '(t nil not-in-toc)))) - -(defcustom org-export-with-tasks t - "Non-nil means include TODO items for export. - -This may have the following values: -t include tasks independent of state. -`todo' include only tasks that are not yet done. -`done' include only tasks that are already done. -nil ignore all tasks. -list of keywords include tasks with these keywords. - -This option can also be set with the OPTIONS keyword, -e.g. \"tasks:nil\"." - :group 'org-export-general - :type '(choice - (const :tag "All tasks" t) - (const :tag "No tasks" nil) - (const :tag "Not-done tasks" todo) - (const :tag "Only done tasks" done) - (repeat :tag "Specific TODO keywords" - (string :tag "Keyword"))) - :safe (lambda (x) (or (memq x '(nil t todo done)) - (and (listp x) - (cl-every #'stringp x))))) - -(defcustom org-export-with-title t - "Non-nil means print title into the exported file. -This option can also be set with the OPTIONS keyword, -e.g. \"title:nil\"." - :group 'org-export-general - :version "26.1" - :package-version '(Org . "8.3") - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-time-stamp-file t - "Non-nil means insert a time stamp into the exported file. -The time stamp shows when the file was created. This option can -also be set with the OPTIONS keyword, e.g. \"timestamp:nil\"." - :group 'org-export-general - :type 'boolean - :safe #'booleanp) - -(defcustom org-export-with-timestamps t - "Non-nil means allow timestamps in export. - -It can be set to any of the following values: - t export all timestamps. - `active' export active timestamps only. - `inactive' export inactive timestamps only. - nil do not export timestamps - -This only applies to timestamps isolated in a paragraph -containing only timestamps. Other timestamps are always -exported. - -This option can also be set with the OPTIONS keyword, e.g. -\"<:nil\"." - :group 'org-export-general - :type '(choice - (const :tag "All timestamps" t) - (const :tag "Only active timestamps" active) - (const :tag "Only inactive timestamps" inactive) - (const :tag "No timestamp" nil)) - :safe (lambda (x) (memq x '(t nil active inactive)))) - -(defcustom org-export-with-todo-keywords t - "Non-nil means include TODO keywords in export. -When nil, remove all these keywords from the export. This option -can also be set with the OPTIONS keyword, e.g. \"todo:nil\"." - :group 'org-export-general - :type 'boolean) - -(defcustom org-export-allow-bind-keywords nil - "Non-nil means BIND keywords can define local variable values. -This is a potential security risk, which is why the default value -is nil. You can also allow them through local buffer variables." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - -(defcustom org-export-with-broken-links nil - "Non-nil means do not raise an error on broken links. - -When this variable is non-nil, broken links are ignored, without -stopping the export process. If it is set to `mark', broken -links are marked as such in the output, with a string like - - [BROKEN LINK: path] - -where PATH is the un-resolvable reference. - -This option can also be set with the OPTIONS keyword, e.g., -\"broken-links:mark\"." - :group 'org-export-general - :version "26.1" - :package-version '(Org . "9.0") - :type '(choice - (const :tag "Ignore broken links" t) - (const :tag "Mark broken links in output" mark) - (const :tag "Raise an error" nil))) - -(defcustom org-export-snippet-translation-alist nil - "Alist between export snippets back-ends and exporter back-ends. - -This variable allows providing shortcuts for export snippets. - -For example, with a value of \\='((\"h\" . \"html\")), the -HTML back-end will recognize the contents of \"@@h:@@\" as -HTML code while every other back-end will ignore it." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type '(repeat - (cons (string :tag "Shortcut") - (string :tag "Back-end"))) - :safe (lambda (x) - (and (listp x) - (cl-every #'consp x) - (cl-every #'stringp (mapcar #'car x)) - (cl-every #'stringp (mapcar #'cdr x))))) - -(defcustom org-export-global-macros nil - "Alist between macro names and expansion templates. - -This variable defines macro expansion templates available -globally. Associations follow the pattern - - (NAME . TEMPLATE) - -where NAME is a string beginning with a letter and consisting of -alphanumeric characters only. - -TEMPLATE is the string to which the macro is going to be -expanded. Inside, \"$1\", \"$2\"... are place-holders for -macro's arguments. Moreover, if the template starts with -\"(eval\", it will be parsed as an Elisp expression and evaluated -accordingly." - :group 'org-export-general - :version "26.1" - :package-version '(Org . "9.1") - :type '(repeat - (cons (string :tag "Name") - (string :tag "Template")))) - -(defcustom org-export-coding-system nil - "Coding system for the exported file." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'coding-system) - -(defcustom org-export-copy-to-kill-ring nil - "Non-nil means pushing export output to the kill ring. -This variable is ignored during asynchronous export." - :group 'org-export-general - :version "26.1" - :package-version '(Org . "8.3") - :type '(choice - (const :tag "Always" t) - (const :tag "When export is done interactively" if-interactive) - (const :tag "Never" nil))) - -(defcustom org-export-initial-scope 'buffer - "The initial scope when exporting with `org-export-dispatch'. -This variable can be either set to `buffer' or `subtree'." - :group 'org-export-general - :type '(choice - (const :tag "Export current buffer" buffer) - (const :tag "Export current subtree" subtree))) - -(defcustom org-export-show-temporary-export-buffer t - "Non-nil means show buffer after exporting to temp buffer. -When Org exports to a file, the buffer visiting that file is never -shown, but remains buried. However, when exporting to -a temporary buffer, that buffer is popped up in a second window. -When this variable is nil, the buffer remains buried also in -these cases." - :group 'org-export-general - :type 'boolean) - -(defcustom org-export-in-background nil - "Non-nil means export and publishing commands will run in background. -Results from an asynchronous export are never displayed -automatically. But you can retrieve them with `\\[org-export-stack]'." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - -(defcustom org-export-async-init-file nil - "File used to initialize external export process. - -Value must be either nil or an absolute file name. When nil, the -external process is launched like a regular Emacs session, -loading user's initialization file and any site specific -configuration. If a file is provided, it, and only it, is loaded -at start-up. - -Therefore, using a specific configuration makes the process to -load faster and the export more portable." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (const :tag "Regular startup" nil) - (file :tag "Specific start-up file" :must-match t))) - -(defcustom org-export-dispatch-use-expert-ui nil - "Non-nil means using a non-intrusive `org-export-dispatch'. -In that case, no help buffer is displayed. Though, an indicator -for current export scope is added to the prompt (\"b\" when -output is restricted to body only, \"s\" when it is restricted to -the current subtree, \"v\" when only visible elements are -considered for export, \"f\" when publishing functions should be -passed the FORCE argument and \"a\" when the export should be -asynchronous). Also, [?] allows switching back to standard -mode." - :group 'org-export-general - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - - - -;;; Defining Back-ends -;; -;; An export back-end is a structure with `org-export-backend' type -;; and `name', `parent', `transcoders', `options', `filters', `blocks' -;; and `menu' slots. -;; -;; At the lowest level, a back-end is created with -;; `org-export-create-backend' function. -;; -;; A named back-end can be registered with -;; `org-export-register-backend' function. A registered back-end can -;; later be referred to by its name, with `org-export-get-backend' -;; function. Also, such a back-end can become the parent of a derived -;; back-end from which slot values will be inherited by default. -;; `org-export-derived-backend-p' can check if a given back-end is -;; derived from a list of back-end names. -;; -;; `org-export-get-all-transcoders', `org-export-get-all-options' and -;; `org-export-get-all-filters' return the full alist of transcoders, -;; options and filters, including those inherited from ancestors. -;; -;; At a higher level, `org-export-define-backend' is the standard way -;; to define an export back-end. If the new back-end is similar to -;; a registered back-end, `org-export-define-derived-backend' may be -;; used instead. -;; -;; Eventually `org-export-barf-if-invalid-backend' returns an error -;; when a given back-end hasn't been registered yet. - -(cl-defstruct (org-export-backend (:constructor org-export-create-backend) - (:copier nil)) - name parent transcoders options filters blocks menu) - -;;;###autoload -(defun org-export-get-backend (name) - "Return export back-end named after NAME. -NAME is a symbol. Return nil if no such back-end is found." - (cl-find-if (lambda (b) (and (eq name (org-export-backend-name b)))) - org-export-registered-backends)) - -(defun org-export-register-backend (backend) - "Register BACKEND as a known export back-end. -BACKEND is a structure with `org-export-backend' type." - ;; Refuse to register an unnamed back-end. - (unless (org-export-backend-name backend) - (error "Cannot register a unnamed export back-end")) - ;; Refuse to register a back-end with an unknown parent. - (let ((parent (org-export-backend-parent backend))) - (when (and parent (not (org-export-get-backend parent))) - (error "Cannot use unknown \"%s\" back-end as a parent" parent))) - ;; If a back-end with the same name as BACKEND is already - ;; registered, replace it with BACKEND. Otherwise, simply add - ;; BACKEND to the list of registered back-ends. - (let ((old (org-export-get-backend (org-export-backend-name backend)))) - (if old (setcar (memq old org-export-registered-backends) backend) - (push backend org-export-registered-backends)))) - -(defun org-export-barf-if-invalid-backend (backend) - "Signal an error if BACKEND isn't defined." - (unless (org-export-backend-p backend) - (error "Unknown \"%s\" back-end: Aborting export" backend))) - -(defun org-export-derived-backend-p (backend &rest backends) - "Non-nil if BACKEND is derived from one of BACKENDS. -BACKEND is an export back-end, as returned by, e.g., -`org-export-create-backend', or a symbol referring to -a registered back-end. BACKENDS is constituted of symbols." - (when (symbolp backend) (setq backend (org-export-get-backend backend))) - (when backend - (catch 'exit - (while (org-export-backend-parent backend) - (when (memq (org-export-backend-name backend) backends) - (throw 'exit t)) - (setq backend - (org-export-get-backend (org-export-backend-parent backend)))) - (memq (org-export-backend-name backend) backends)))) - -(defun org-export-get-all-transcoders (backend) - "Return full translation table for BACKEND. - -BACKEND is an export back-end, as return by, e.g,, -`org-export-create-backend'. Return value is an alist where -keys are element or object types, as symbols, and values are -transcoders. - -Unlike to `org-export-backend-transcoders', this function -also returns transcoders inherited from parent back-ends, -if any." - (when (symbolp backend) (setq backend (org-export-get-backend backend))) - (when backend - (let ((transcoders (org-export-backend-transcoders backend)) - parent) - (while (setq parent (org-export-backend-parent backend)) - (setq backend (org-export-get-backend parent)) - (setq transcoders - (append transcoders (org-export-backend-transcoders backend)))) - transcoders))) - -(defun org-export-get-all-options (backend) - "Return export options for BACKEND. - -BACKEND is an export back-end, as return by, e.g,, -`org-export-create-backend'. See `org-export-options-alist' -for the shape of the return value. - -Unlike to `org-export-backend-options', this function also -returns options inherited from parent back-ends, if any. - -Return nil if BACKEND is unknown." - (when (symbolp backend) (setq backend (org-export-get-backend backend))) - (when backend - (let ((options (org-export-backend-options backend)) - parent) - (while (setq parent (org-export-backend-parent backend)) - (setq backend (org-export-get-backend parent)) - (setq options (append options (org-export-backend-options backend)))) - options))) - -(defun org-export-get-all-filters (backend) - "Return complete list of filters for BACKEND. - -BACKEND is an export back-end, as return by, e.g,, -`org-export-create-backend'. Return value is an alist where -keys are symbols and values lists of functions. - -Unlike to `org-export-backend-filters', this function also -returns filters inherited from parent back-ends, if any." - (when (symbolp backend) (setq backend (org-export-get-backend backend))) - (when backend - (let ((filters (org-export-backend-filters backend)) - parent) - (while (setq parent (org-export-backend-parent backend)) - (setq backend (org-export-get-backend parent)) - (setq filters (append filters (org-export-backend-filters backend)))) - filters))) - -(defun org-export-define-backend (backend transcoders &rest body) - "Define a new back-end BACKEND. - -TRANSCODERS is an alist between object or element types and -functions handling them. - -These functions should return a string without any trailing -space, or nil. They must accept three arguments: the object or -element itself, its contents or nil when it isn't recursive and -the property list used as a communication channel. - -Contents, when not nil, are stripped from any global indentation -\(although the relative one is preserved). They also always end -with a single newline character. - -If, for a given type, no function is found, that element or -object type will simply be ignored, along with any blank line or -white space at its end. The same will happen if the function -returns the nil value. If that function returns the empty -string, the type will be ignored, but the blank lines or white -spaces will be kept. - -In addition to element and object types, one function can be -associated to the `template' (or `inner-template') symbol and -another one to the `plain-text' symbol. - -The former returns the final transcoded string, and can be used -to add a preamble and a postamble to document's body. It must -accept two arguments: the transcoded string and the property list -containing export options. A function associated to `template' -will not be applied if export has option \"body-only\". -A function associated to `inner-template' is always applied. - -The latter, when defined, is to be called on every text not -recognized as an element or an object. It must accept two -arguments: the text string and the information channel. It is an -appropriate place to protect special chars relative to the -back-end. - -BODY can start with pre-defined keyword arguments. The following -keywords are understood: - - :filters-alist - - Alist between filters and function, or list of functions, - specific to the back-end. See `org-export-filters-alist' for - a list of all allowed filters. Filters defined here - shouldn't make a back-end test, as it may prevent back-ends - derived from this one to behave properly. - - :menu-entry - - Menu entry for the export dispatcher. It should be a list - like: - - \\='(KEY DESCRIPTION-OR-ORDINAL ACTION-OR-MENU) - - where : - - KEY is a free character selecting the back-end. - - DESCRIPTION-OR-ORDINAL is either a string or a number. - - If it is a string, is will be used to name the back-end in - its menu entry. If it is a number, the following menu will - be displayed as a sub-menu of the back-end with the same - KEY. Also, the number will be used to determine in which - order such sub-menus will appear (lowest first). - - ACTION-OR-MENU is either a function or an alist. - - If it is an action, it will be called with four - arguments (booleans): ASYNC, SUBTREEP, VISIBLE-ONLY and - BODY-ONLY. See `org-export-as' for further explanations on - some of them. - - If it is an alist, associations should follow the - pattern: - - \\='(KEY DESCRIPTION ACTION) - - where KEY, DESCRIPTION and ACTION are described above. - - Valid values include: - - \\='(?m \"My Special Back-end\" my-special-export-function) - - or - - \\='(?l \"Export to LaTeX\" - (?p \"As PDF file\" org-latex-export-to-pdf) - (?o \"As PDF file and open\" - (lambda (a s v b) - (if a (org-latex-export-to-pdf t s v b) - (org-open-file - (org-latex-export-to-pdf nil s v b))))))) - - or the following, which will be added to the previous - sub-menu, - - \\='(?l 1 - ((?B \"As TEX buffer (Beamer)\" org-beamer-export-as-latex) - (?P \"As PDF file (Beamer)\" org-beamer-export-to-pdf))) - - :options-alist - - Alist between back-end specific properties introduced in - communication channel and how their value are acquired. See - `org-export-options-alist' for more information about - structure of the values." - (declare (indent 1)) - (let (filters menu-entry options) - (while (keywordp (car body)) - (let ((keyword (pop body))) - (pcase keyword - (:filters-alist (setq filters (pop body))) - (:menu-entry (setq menu-entry (pop body))) - (:options-alist (setq options (pop body))) - (_ (error "Unknown keyword: %s" keyword))))) - (org-export-register-backend - (org-export-create-backend :name backend - :transcoders transcoders - :options options - :filters filters - :menu menu-entry)))) - -(defun org-export-define-derived-backend (child parent &rest body) - "Create a new back-end as a variant of an existing one. - -CHILD is the name of the derived back-end. PARENT is the name of -the parent back-end. - -BODY can start with pre-defined keyword arguments. The following -keywords are understood: - - :filters-alist - - Alist of filters that will overwrite or complete filters - defined in PARENT back-end. See `org-export-filters-alist' - for a list of allowed filters. - - :menu-entry - - Menu entry for the export dispatcher. See - `org-export-define-backend' for more information about the - expected value. - - :options-alist - - Alist of back-end specific properties that will overwrite or - complete those defined in PARENT back-end. Refer to - `org-export-options-alist' for more information about - structure of the values. - - :translate-alist - - Alist of element and object types and transcoders that will - overwrite or complete transcode table from PARENT back-end. - Refer to `org-export-define-backend' for detailed information - about transcoders. - -As an example, here is how one could define \"my-latex\" back-end -as a variant of `latex' back-end with a custom template function: - - (org-export-define-derived-backend \\='my-latex \\='latex - :translate-alist \\='((template . my-latex-template-fun))) - -The back-end could then be called with, for example: - - (org-export-to-buffer \\='my-latex \"*Test my-latex*\")" - (declare (indent 2)) - (let (filters menu-entry options transcoders) - (while (keywordp (car body)) - (let ((keyword (pop body))) - (pcase keyword - (:filters-alist (setq filters (pop body))) - (:menu-entry (setq menu-entry (pop body))) - (:options-alist (setq options (pop body))) - (:translate-alist (setq transcoders (pop body))) - (_ (error "Unknown keyword: %s" keyword))))) - (org-export-register-backend - (org-export-create-backend :name child - :parent parent - :transcoders transcoders - :options options - :filters filters - :menu menu-entry)))) - - - -;;; The Communication Channel -;; -;; During export process, every function has access to a number of -;; properties. They are of two types: -;; -;; 1. Environment options are collected once at the very beginning of -;; the process, out of the original buffer and configuration. -;; Collecting them is handled by `org-export-get-environment' -;; function. -;; -;; Most environment options are defined through the -;; `org-export-options-alist' variable. -;; -;; 2. Tree properties are extracted directly from the parsed tree, -;; just before export, by `org-export--collect-tree-properties'. - -;;;; Environment Options -;; -;; Environment options encompass all parameters defined outside the -;; scope of the parsed data. They come from five sources, in -;; increasing precedence order: -;; -;; - Global variables, -;; - Buffer's attributes, -;; - Options keyword symbols, -;; - Buffer keywords, -;; - Subtree properties. -;; -;; The central internal function with regards to environment options -;; is `org-export-get-environment'. It updates global variables with -;; "#+BIND:" keywords, then retrieve and prioritize properties from -;; the different sources. -;; -;; The internal functions doing the retrieval are: -;; `org-export--get-global-options', -;; `org-export--get-buffer-attributes', -;; `org-export--parse-option-keyword', -;; `org-export--get-subtree-options' and -;; `org-export--get-inbuffer-options' -;; -;; Also, `org-export--list-bound-variables' collects bound variables -;; along with their value in order to set them as buffer local -;; variables later in the process. - -;;;###autoload -(defun org-export-get-environment (&optional backend subtreep ext-plist) - "Collect export options from the current buffer. - -Optional argument BACKEND is an export back-end, as returned by -`org-export-create-backend'. - -When optional argument SUBTREEP is non-nil, assume the export is -done against the current sub-tree. - -Third optional argument EXT-PLIST is a property list with -external parameters overriding Org default settings, but still -inferior to file-local settings." - ;; First install #+BIND variables since these must be set before - ;; global options are read. - (dolist (pair (org-export--list-bound-variables)) - (set (make-local-variable (car pair)) (nth 1 pair))) - ;; Get and prioritize export options... - (org-combine-plists - ;; ... from global variables... - (org-export--get-global-options backend) - ;; ... from an external property list... - ext-plist - ;; ... from in-buffer settings... - (org-export--get-inbuffer-options backend) - ;; ... and from subtree, when appropriate. - (and subtreep (org-export--get-subtree-options backend)))) - -(defun org-export--parse-option-keyword (options &optional backend) - "Parse an OPTIONS line and return values as a plist. -Optional argument BACKEND is an export back-end, as returned by, -e.g., `org-export-create-backend'. It specifies which back-end -specific items to read, if any." - (let ((line - (let ((s 0) alist) - (while (string-match "\\(.+?\\):\\((.*?)\\|\\S-*\\)[ \t]*" options s) - (setq s (match-end 0)) - (push (cons (match-string 1 options) - (read (match-string 2 options))) - alist)) - alist)) - ;; Priority is given to back-end specific options. - (all (append (org-export-get-all-options backend) - org-export-options-alist)) - (plist)) - (when line - (dolist (entry all plist) - (let ((item (nth 2 entry))) - (when item - (let ((v (assoc-string item line t))) - (when v (setq plist (plist-put plist (car entry) (cdr v))))))))))) - -(defun org-export--get-subtree-options (&optional backend) - "Get export options in subtree at point. -Optional argument BACKEND is an export back-end, as returned by, -e.g., `org-export-create-backend'. It specifies back-end used -for export. Return options as a plist." - ;; For each buffer keyword, create a headline property setting the - ;; same property in communication channel. The name for the - ;; property is the keyword with "EXPORT_" appended to it. - (org-with-wide-buffer - ;; Make sure point is at a heading. - (if (org-at-heading-p) (org-up-heading-safe) (org-back-to-heading t)) - (let ((plist - ;; EXPORT_OPTIONS are parsed in a non-standard way. Take - ;; care of them right from the start. - (let ((o (org-entry-get (point) "EXPORT_OPTIONS" 'selective))) - (and o (org-export--parse-option-keyword o backend)))) - ;; Take care of EXPORT_TITLE. If it isn't defined, use - ;; headline's title (with no todo keyword, priority cookie or - ;; tag) as its fallback value. - (cache (list - (cons "TITLE" - (or (org-entry-get (point) "EXPORT_TITLE" 'selective) - (let ((case-fold-search nil)) - (looking-at org-complex-heading-regexp) - (match-string-no-properties 4)))))) - ;; Look for both general keywords and back-end specific - ;; options, with priority given to the latter. - (options (append (org-export-get-all-options backend) - org-export-options-alist))) - ;; Handle other keywords. Then return PLIST. - (dolist (option options plist) - (let ((property (car option)) - (keyword (nth 1 option))) - (when keyword - (let ((value - (or (cdr (assoc keyword cache)) - (let ((v (org-entry-get (point) - (concat "EXPORT_" keyword) - 'selective))) - (push (cons keyword v) cache) v)))) - (when value - (setq plist - (plist-put plist - property - (cl-case (nth 4 option) - (parse - (org-element-parse-secondary-string - value (org-element-restriction 'keyword))) - (split (split-string value)) - (t value)))))))))))) - -(defun org-export--get-inbuffer-options (&optional backend) - "Return current buffer export options, as a plist. - -Optional argument BACKEND, when non-nil, is an export back-end, -as returned by, e.g., `org-export-create-backend'. It specifies -which back-end specific options should also be read in the -process. - -Assume buffer is in Org mode. Narrowing, if any, is ignored." - (let* ((case-fold-search t) - (options (append - ;; Priority is given to back-end specific options. - (org-export-get-all-options backend) - org-export-options-alist)) - (regexp (format "^[ \t]*#\\+%s:" - (regexp-opt (nconc (delq nil (mapcar #'cadr options)) - org-export-special-keywords)))) - plist to-parse) - (letrec ((find-properties - (lambda (keyword) - ;; Return all properties associated to KEYWORD. - (let (properties) - (dolist (option options properties) - (when (equal (nth 1 option) keyword) - (cl-pushnew (car option) properties)))))) - (get-options - (lambda (&optional files) - ;; Recursively read keywords in buffer. FILES is - ;; a list of files read so far. PLIST is the current - ;; property list obtained. - (org-with-wide-buffer - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (let ((element (org-element-at-point))) - (when (eq (org-element-type element) 'keyword) - (let ((key (org-element-property :key element)) - (val (org-element-property :value element))) - (cond - ;; Options in `org-export-special-keywords'. - ((equal key "SETUPFILE") - (let* ((uri (org-strip-quotes (org-trim val))) - (uri-is-url (org-file-url-p uri)) - (uri (if uri-is-url - uri - (expand-file-name uri)))) - ;; Avoid circular dependencies. - (unless (member uri files) - (with-temp-buffer - (unless uri-is-url - (setq default-directory - (file-name-directory uri))) - (insert (org-file-contents uri 'noerror)) - (let ((org-inhibit-startup t)) (org-mode)) - (funcall get-options (cons uri files)))))) - ((equal key "OPTIONS") - (setq plist - (org-combine-plists - plist - (org-export--parse-option-keyword - val backend)))) - ((equal key "FILETAGS") - (setq plist - (org-combine-plists - plist - (list :filetags - (org-uniquify - (append - (org-split-string val ":") - (plist-get plist :filetags))))))) - (t - ;; Options in `org-export-options-alist'. - (dolist (property (funcall find-properties key)) - (setq - plist - (plist-put - plist property - ;; Handle value depending on specified - ;; BEHAVIOR. - (cl-case (nth 4 (assq property options)) - (parse - (unless (memq property to-parse) - (push property to-parse)) - ;; Even if `parse' implies `space' - ;; behavior, we separate line with - ;; "\n" so as to preserve - ;; line-breaks. However, empty - ;; lines are forbidden since `parse' - ;; doesn't allow more than one - ;; paragraph. - (let ((old (plist-get plist property))) - (cond ((not (org-string-nw-p val)) old) - (old (concat old "\n" val)) - (t val)))) - (space - (if (not (plist-get plist property)) - (org-trim val) - (concat (plist-get plist property) - " " - (org-trim val)))) - (newline - (org-trim - (concat (plist-get plist property) - "\n" - (org-trim val)))) - (split `(,@(plist-get plist property) - ,@(split-string val))) - ((t) val) - (otherwise - (if (not (plist-member plist property)) val - (plist-get plist property))))))))))))))))) - ;; Read options in the current buffer and return value. - (funcall get-options (and buffer-file-name (list buffer-file-name))) - ;; Parse properties in TO-PARSE. Remove newline characters not - ;; involved in line breaks to simulate `space' behavior. - ;; Finally return options. - (dolist (p to-parse plist) - (let ((value (org-element-parse-secondary-string - (plist-get plist p) - (org-element-restriction 'keyword)))) - (org-element-map value 'plain-text - (lambda (s) - (org-element-set-element - s (replace-regexp-in-string "\n" " " s)))) - (setq plist (plist-put plist p value))))))) - -(defun org-export--get-export-attributes - (&optional backend subtreep visible-only body-only) - "Return properties related to export process, as a plist. -Optional arguments BACKEND, SUBTREEP, VISIBLE-ONLY and BODY-ONLY -are like the arguments with the same names of function -`org-export-as'." - (list :export-options (delq nil - (list (and subtreep 'subtree) - (and visible-only 'visible-only) - (and body-only 'body-only))) - :back-end backend - :translate-alist (org-export-get-all-transcoders backend) - :exported-data (make-hash-table :test #'eq :size 4001))) - -(defun org-export--get-buffer-attributes () - "Return properties related to buffer attributes, as a plist." - (list :input-buffer (buffer-name (buffer-base-buffer)) - :input-file (buffer-file-name (buffer-base-buffer)))) - -(defun org-export--get-global-options (&optional backend) - "Return global export options as a plist. -Optional argument BACKEND, if non-nil, is an export back-end, as -returned by, e.g., `org-export-create-backend'. It specifies -which back-end specific export options should also be read in the -process." - (let (plist - ;; Priority is given to back-end specific options. - (all (append (org-export-get-all-options backend) - org-export-options-alist))) - (dolist (cell all plist) - (let ((prop (car cell))) - (unless (plist-member plist prop) - (setq plist - (plist-put - plist - prop - ;; Evaluate default value provided. - (let ((value (eval (nth 3 cell)))) - (if (eq (nth 4 cell) 'parse) - (org-element-parse-secondary-string - value (org-element-restriction 'keyword)) - value))))))))) - -(defun org-export--list-bound-variables () - "Return variables bound from BIND keywords in current buffer. -Also look for BIND keywords in setup files. The return value is -an alist where associations are (VARIABLE-NAME VALUE)." - (when org-export-allow-bind-keywords - (letrec ((collect-bind - (lambda (files alist) - ;; Return an alist between variable names and their - ;; value. FILES is a list of setup files names read - ;; so far, used to avoid circular dependencies. ALIST - ;; is the alist collected so far. - (let ((case-fold-search t)) - (org-with-wide-buffer - (goto-char (point-min)) - (while (re-search-forward - "^[ \t]*#\\+\\(BIND\\|SETUPFILE\\):" nil t) - (let ((element (org-element-at-point))) - (when (eq (org-element-type element) 'keyword) - (let ((val (org-element-property :value element))) - (if (equal (org-element-property :key element) - "BIND") - (push (read (format "(%s)" val)) alist) - ;; Enter setup file. - (let* ((uri (org-strip-quotes val)) - (uri-is-url (org-file-url-p uri)) - (uri (if uri-is-url - uri - (expand-file-name uri)))) - ;; Avoid circular dependencies. - (unless (member uri files) - (with-temp-buffer - (unless uri-is-url - (setq default-directory - (file-name-directory uri))) - (let ((org-inhibit-startup t)) (org-mode)) - (insert (org-file-contents uri 'noerror)) - (setq alist - (funcall collect-bind - (cons uri files) - alist)))))))))) - alist))))) - ;; Return value in appropriate order of appearance. - (nreverse (funcall collect-bind nil nil))))) - -;; defsubst org-export-get-parent must be defined before first use, -;; was originally defined in the topology section - -(defsubst org-export-get-parent (blob) - "Return BLOB parent or nil. -BLOB is the element or object considered." - (org-element-property :parent blob)) - -;;;; Tree Properties -;; -;; Tree properties are information extracted from parse tree. They -;; are initialized at the beginning of the transcoding process by -;; `org-export--collect-tree-properties'. -;; -;; Dedicated functions focus on computing the value of specific tree -;; properties during initialization. Thus, -;; `org-export--populate-ignore-list' lists elements and objects that -;; should be skipped during export, `org-export--get-min-level' gets -;; the minimal exportable level, used as a basis to compute relative -;; level for headlines. Eventually -;; `org-export--collect-headline-numbering' builds an alist between -;; headlines and their numbering. - -(defun org-export--collect-tree-properties (data info) - "Extract tree properties from parse tree. - -DATA is the parse tree from which information is retrieved. INFO -is a list holding export options. - -Following tree properties are set or updated: - -`:headline-offset' Offset between true level of headlines and - local level. An offset of -1 means a headline - of level 2 should be considered as a level - 1 headline in the context. - -`:headline-numbering' Alist of all headlines as key and the - associated numbering as value. - -`:id-alist' Alist of all ID references as key and associated file - as value. - -Return updated plist." - ;; Install the parse tree in the communication channel. - (setq info (plist-put info :parse-tree data)) - ;; Compute `:headline-offset' in order to be able to use - ;; `org-export-get-relative-level'. - (setq info - (plist-put info - :headline-offset - (- 1 (org-export--get-min-level data info)))) - ;; From now on, properties order doesn't matter: get the rest of the - ;; tree properties. - (org-combine-plists - info - (list :headline-numbering (org-export--collect-headline-numbering data info) - :id-alist - (org-element-map data 'link - (lambda (l) - (and (string= (org-element-property :type l) "id") - (let* ((id (org-element-property :path l)) - (file (car (org-id-find id)))) - (and file (cons id (file-relative-name file)))))))))) - -(defun org-export--get-min-level (data options) - "Return minimum exportable headline's level in DATA. -DATA is parsed tree as returned by `org-element-parse-buffer'. -OPTIONS is a plist holding export options." - (catch 'exit - (let ((min-level 10000)) - (dolist (datum (org-element-contents data)) - (when (and (eq (org-element-type datum) 'headline) - (not (org-element-property :footnote-section-p datum)) - (not (memq datum (plist-get options :ignore-list)))) - (setq min-level (min (org-element-property :level datum) min-level)) - (when (= min-level 1) (throw 'exit 1)))) - ;; If no headline was found, for the sake of consistency, set - ;; minimum level to 1 nonetheless. - (if (= min-level 10000) 1 min-level)))) - -(defun org-export--collect-headline-numbering (data options) - "Return numbering of all exportable, numbered headlines in a parse tree. - -DATA is the parse tree. OPTIONS is the plist holding export -options. - -Return an alist whose key is a headline and value is its -associated numbering \(in the shape of a list of numbers) or nil -for a footnotes section." - (let ((numbering (make-vector org-export-max-depth 0))) - (org-element-map data 'headline - (lambda (headline) - (when (and (org-export-numbered-headline-p headline options) - (not (org-element-property :footnote-section-p headline))) - (let ((relative-level - (1- (org-export-get-relative-level headline options)))) - (cons - headline - (cl-loop - for n across numbering - for idx from 0 to org-export-max-depth - when (< idx relative-level) collect n - when (= idx relative-level) collect (aset numbering idx (1+ n)) - when (> idx relative-level) do (aset numbering idx 0)))))) - options))) - -(defun org-export--selected-trees (data info) - "List headlines and inlinetasks with a select tag in their tree. -DATA is parsed data as returned by `org-element-parse-buffer'. -INFO is a plist holding export options." - (let ((select (cl-mapcan (lambda (tag) (org-tags-expand tag t)) - (plist-get info :select-tags)))) - (if (cl-some (lambda (tag) (member tag select)) (plist-get info :filetags)) - ;; If FILETAGS contains a select tag, every headline or - ;; inlinetask is returned. - (org-element-map data '(headline inlinetask) #'identity) - (letrec ((selected-trees nil) - (walk-data - (lambda (data genealogy) - (let ((type (org-element-type data))) - (cond - ((memq type '(headline inlinetask)) - (let ((tags (org-element-property :tags data))) - (if (cl-some (lambda (tag) (member tag select)) tags) - ;; When a select tag is found, mark full - ;; genealogy and every headline within the - ;; tree as acceptable. - (setq selected-trees - (append - genealogy - (org-element-map data '(headline inlinetask) - #'identity) - selected-trees)) - ;; If at a headline, continue searching in - ;; tree, recursively. - (when (eq type 'headline) - (dolist (el (org-element-contents data)) - (funcall walk-data el (cons data genealogy))))))) - ((or (eq type 'org-data) - (memq type org-element-greater-elements)) - (dolist (el (org-element-contents data)) - (funcall walk-data el genealogy)))))))) - (funcall walk-data data nil) - selected-trees)))) - -(defun org-export--skip-p (datum options selected excluded) - "Non-nil when element or object DATUM should be skipped during export. -OPTIONS is the plist holding export options. SELECTED, when -non-nil, is a list of headlines or inlinetasks belonging to -a tree with a select tag. EXCLUDED is a list of tags, as -strings. Any headline or inlinetask marked with one of those is -not exported." - (cl-case (org-element-type datum) - ((comment comment-block) - ;; Skip all comments and comment blocks. Make to keep maximum - ;; number of blank lines around the comment so as to preserve - ;; local structure of the document upon interpreting it back into - ;; Org syntax. - (let* ((previous (org-export-get-previous-element datum options)) - (before (or (org-element-property :post-blank previous) 0)) - (after (or (org-element-property :post-blank datum) 0))) - (when previous - (org-element-put-property previous :post-blank (max before after 1)))) - t) - (clock (not (plist-get options :with-clocks))) - (drawer - (let ((with-drawers-p (plist-get options :with-drawers))) - (or (not with-drawers-p) - (and (consp with-drawers-p) - ;; If `:with-drawers' value starts with `not', ignore - ;; every drawer whose name belong to that list. - ;; Otherwise, ignore drawers whose name isn't in that - ;; list. - (let ((name (org-element-property :drawer-name datum))) - (if (eq (car with-drawers-p) 'not) - (member-ignore-case name (cdr with-drawers-p)) - (not (member-ignore-case name with-drawers-p)))))))) - (fixed-width (not (plist-get options :with-fixed-width))) - ((footnote-definition footnote-reference) - (not (plist-get options :with-footnotes))) - ((headline inlinetask) - (let ((with-tasks (plist-get options :with-tasks)) - (todo (org-element-property :todo-keyword datum)) - (todo-type (org-element-property :todo-type datum)) - (archived (plist-get options :with-archived-trees)) - (tags (org-export-get-tags datum options nil t))) - (or - (and (eq (org-element-type datum) 'inlinetask) - (not (plist-get options :with-inlinetasks))) - ;; Ignore subtrees with an exclude tag. - (cl-some (lambda (tag) (member tag excluded)) tags) - ;; When a select tag is present in the buffer, ignore any tree - ;; without it. - (and selected (not (memq datum selected))) - ;; Ignore commented sub-trees. - (org-element-property :commentedp datum) - ;; Ignore archived subtrees if `:with-archived-trees' is nil. - (and (not archived) (org-element-property :archivedp datum)) - ;; Ignore tasks, if specified by `:with-tasks' property. - (and todo - (or (not with-tasks) - (and (memq with-tasks '(todo done)) - (not (eq todo-type with-tasks))) - (and (consp with-tasks) (not (member todo with-tasks)))))))) - ((latex-environment latex-fragment) (not (plist-get options :with-latex))) - (node-property - (let ((properties-set (plist-get options :with-properties))) - (cond ((null properties-set) t) - ((consp properties-set) - (not (member-ignore-case (org-element-property :key datum) - properties-set)))))) - (planning (not (plist-get options :with-planning))) - (property-drawer (not (plist-get options :with-properties))) - (statistics-cookie (not (plist-get options :with-statistics-cookies))) - (table (not (plist-get options :with-tables))) - (table-cell - (and (org-export-table-has-special-column-p - (org-export-get-parent-table datum)) - (org-export-first-sibling-p datum options))) - (table-row (org-export-table-row-is-special-p datum options)) - (timestamp - ;; `:with-timestamps' only applies to isolated timestamps - ;; objects, i.e. timestamp objects in a paragraph containing only - ;; timestamps and whitespaces. - (when (let ((parent (org-export-get-parent-element datum))) - (and (memq (org-element-type parent) '(paragraph verse-block)) - (not (org-element-map parent - (cons 'plain-text - (remq 'timestamp org-element-all-objects)) - (lambda (obj) - (or (not (stringp obj)) (org-string-nw-p obj))) - options t)))) - (cl-case (plist-get options :with-timestamps) - ((nil) t) - (active - (not (memq (org-element-property :type datum) '(active active-range)))) - (inactive - (not (memq (org-element-property :type datum) - '(inactive inactive-range))))))))) - - -;;; The Transcoder -;; -;; `org-export-data' reads a parse tree (obtained with, i.e. -;; `org-element-parse-buffer') and transcodes it into a specified -;; back-end output. It takes care of filtering out elements or -;; objects according to export options and organizing the output blank -;; lines and white space are preserved. The function memoizes its -;; results, so it is cheap to call it within transcoders. -;; -;; It is possible to modify locally the back-end used by -;; `org-export-data' or even use a temporary back-end by using -;; `org-export-data-with-backend'. -;; -;; `org-export-transcoder' is an accessor returning appropriate -;; translator function for a given element or object. - -(defun org-export-transcoder (blob info) - "Return appropriate transcoder for BLOB. -INFO is a plist containing export directives." - (let ((type (org-element-type blob))) - ;; Return contents only for complete parse trees. - (if (eq type 'org-data) (lambda (_datum contents _info) contents) - (let ((transcoder (cdr (assq type (plist-get info :translate-alist))))) - (and (functionp transcoder) transcoder))))) - -(defun org-export-data (data info) - "Convert DATA into current back-end format. - -DATA is a parse tree, an element or an object or a secondary -string. INFO is a plist holding export options. - -Return a string." - (or (gethash data (plist-get info :exported-data)) - ;; Handle broken links according to - ;; `org-export-with-broken-links'. - (cl-macrolet - ((broken-link-handler - (&rest body) - `(condition-case err - (progn ,@body) - (org-link-broken - (pcase (plist-get info :with-broken-links) - (`nil (user-error "Unable to resolve link: %S" (nth 1 err))) - (`mark (org-export-data - (format "[BROKEN LINK: %s]" (nth 1 err)) info)) - (_ nil)))))) - (let* ((type (org-element-type data)) - (parent (org-export-get-parent data)) - (results - (cond - ;; Ignored element/object. - ((memq data (plist-get info :ignore-list)) nil) - ;; Plain text. - ((eq type 'plain-text) - (org-export-filter-apply-functions - (plist-get info :filter-plain-text) - (let ((transcoder (org-export-transcoder data info))) - (if transcoder (funcall transcoder data info) data)) - info)) - ;; Secondary string. - ((not type) - (mapconcat (lambda (obj) (org-export-data obj info)) data "")) - ;; Element/Object without contents or, as a special - ;; case, headline with archive tag and archived trees - ;; restricted to title only. - ((or (not (org-element-contents data)) - (and (eq type 'headline) - (eq (plist-get info :with-archived-trees) 'headline) - (org-element-property :archivedp data))) - (let ((transcoder (org-export-transcoder data info))) - (or (and (functionp transcoder) - (broken-link-handler - (funcall transcoder data nil info))) - ;; Export snippets never return a nil value so - ;; that white spaces following them are never - ;; ignored. - (and (eq type 'export-snippet) "")))) - ;; Element/Object with contents. - (t - (let ((transcoder (org-export-transcoder data info))) - (when transcoder - (let* ((greaterp (memq type org-element-greater-elements)) - (objectp - (and (not greaterp) - (memq type org-element-recursive-objects))) - (contents - (mapconcat - (lambda (element) (org-export-data element info)) - (org-element-contents - (if (or greaterp objectp) data - ;; Elements directly containing - ;; objects must have their indentation - ;; normalized first. - (org-element-normalize-contents - data - ;; When normalizing first paragraph - ;; of an item or - ;; a footnote-definition, ignore - ;; first line's indentation. - (and - (eq type 'paragraph) - (memq (org-element-type parent) - '(footnote-definition item)) - (eq (car (org-element-contents parent)) - data) - (eq (org-element-property :pre-blank parent) - 0))))) - ""))) - (broken-link-handler - (funcall transcoder data - (if (not greaterp) contents - (org-element-normalize-string contents)) - info))))))))) - ;; Final result will be memoized before being returned. - (puthash - data - (cond - ((not results) "") - ((memq type '(org-data plain-text nil)) results) - ;; Append the same white space between elements or objects - ;; as in the original buffer, and call appropriate filters. - (t - (org-export-filter-apply-functions - (plist-get info (intern (format ":filter-%s" type))) - (let ((blank (or (org-element-property :post-blank data) 0))) - (if (eq (org-element-class data parent) 'object) - (concat results (make-string blank ?\s)) - (concat (org-element-normalize-string results) - (make-string blank ?\n)))) - info))) - (plist-get info :exported-data)))))) - -(defun org-export-data-with-backend (data backend info) - "Convert DATA into BACKEND format. - -DATA is an element, an object, a secondary string or a string. -BACKEND is a symbol. INFO is a plist used as a communication -channel. - -Unlike to `org-export-with-backend', this function will -recursively convert DATA using BACKEND translation table." - (when (symbolp backend) (setq backend (org-export-get-backend backend))) - ;; Set-up a new communication channel with translations defined in - ;; BACKEND as the translate table and a new hash table for - ;; memoization. - (let ((new-info - (org-combine-plists - info - (list :back-end backend - :translate-alist (org-export-get-all-transcoders backend) - ;; Size of the hash table is reduced since this - ;; function will probably be used on small trees. - :exported-data (make-hash-table :test 'eq :size 401))))) - (prog1 (org-export-data data new-info) - ;; Preserve `:internal-references', as those do not depend on - ;; the back-end used; we need to make sure that any new - ;; reference when the temporary back-end was active gets through - ;; the default one. - (plist-put info :internal-references - (plist-get new-info :internal-references))))) - -(defun org-export-expand (blob contents &optional with-affiliated) - "Expand a parsed element or object to its original state. - -BLOB is either an element or an object. CONTENTS is its -contents, as a string or nil. - -When optional argument WITH-AFFILIATED is non-nil, add affiliated -keywords before output." - (let ((type (org-element-type blob))) - (concat (and with-affiliated - (eq (org-element-class blob) 'element) - (org-element--interpret-affiliated-keywords blob)) - (funcall (intern (format "org-element-%s-interpreter" type)) - blob contents)))) - - - -;;; The Filter System -;; -;; Filters allow end-users to tweak easily the transcoded output. -;; They are the functional counterpart of hooks, as every filter in -;; a set is applied to the return value of the previous one. -;; -;; Every set is back-end agnostic. Although, a filter is always -;; called, in addition to the string it applies to, with the back-end -;; used as argument, so it's easy for the end-user to add back-end -;; specific filters in the set. The communication channel, as -;; a plist, is required as the third argument. -;; -;; From the developer side, filters sets can be installed in the -;; process with the help of `org-export-define-backend', which -;; internally stores filters as an alist. Each association has a key -;; among the following symbols and a function or a list of functions -;; as value. -;; -;; - `:filter-options' applies to the property list containing export -;; options. Unlike to other filters, functions in this list accept -;; two arguments instead of three: the property list containing -;; export options and the back-end. Users can set its value through -;; `org-export-filter-options-functions' variable. -;; -;; - `:filter-parse-tree' applies directly to the complete parsed -;; tree. Users can set it through -;; `org-export-filter-parse-tree-functions' variable. -;; -;; - `:filter-body' applies to the body of the output, before template -;; translator chimes in. Users can set it through -;; `org-export-filter-body-functions' variable. -;; -;; - `:filter-final-output' applies to the final transcoded string. -;; Users can set it with `org-export-filter-final-output-functions' -;; variable. -;; -;; - `:filter-plain-text' applies to any string not recognized as Org -;; syntax. `org-export-filter-plain-text-functions' allows users to -;; configure it. -;; -;; - `:filter-TYPE' applies on the string returned after an element or -;; object of type TYPE has been transcoded. A user can modify -;; `org-export-filter-TYPE-functions' to install these filters. -;; -;; All filters sets are applied with -;; `org-export-filter-apply-functions' function. Filters in a set are -;; applied in a LIFO fashion. It allows developers to be sure that -;; their filters will be applied first. -;; -;; Filters properties are installed in communication channel with -;; `org-export-install-filters' function. -;; -;; Eventually, two hooks (`org-export-before-processing-hook' and -;; `org-export-before-parsing-hook') are run at the beginning of the -;; export process and just before parsing to allow for heavy structure -;; modifications. - - -;;;; Hooks - -(defvar org-export-before-processing-hook nil - "Hook run at the beginning of the export process. - -This is run before include keywords and macros are expanded and -Babel code blocks executed, on a copy of the original buffer -being exported. Visibility and narrowing are preserved. Point -is at the beginning of the buffer. - -Every function in this hook will be called with one argument: the -back-end currently used, as a symbol.") - -(defvar org-export-before-parsing-hook nil - "Hook run before parsing an export buffer. - -This is run after include keywords and macros have been expanded -and Babel code blocks executed, on a copy of the original buffer -being exported. Visibility and narrowing are preserved. Point -is at the beginning of the buffer. - -Every function in this hook will be called with one argument: the -back-end currently used, as a symbol.") - - -;;;; Special Filters - -(defvar org-export-filter-options-functions nil - "List of functions applied to the export options. -Each filter is called with two arguments: the export options, as -a plist, and the back-end, as a symbol. It must return -a property list containing export options.") - -(defvar org-export-filter-parse-tree-functions nil - "List of functions applied to the parsed tree. -Each filter is called with three arguments: the parse tree, as -returned by `org-element-parse-buffer', the back-end, as -a symbol, and the communication channel, as a plist. It must -return the modified parse tree to transcode.") - -(defvar org-export-filter-plain-text-functions nil - "List of functions applied to plain text. -Each filter is called with three arguments: a string which -contains no Org syntax, the back-end, as a symbol, and the -communication channel, as a plist. It must return a string or -nil.") - -(defvar org-export-filter-body-functions nil - "List of functions applied to transcoded body. -Each filter is called with three arguments: a string which -contains no Org syntax, the back-end, as a symbol, and the -communication channel, as a plist. It must return a string or -nil.") - -(defvar org-export-filter-final-output-functions nil - "List of functions applied to the transcoded string. -Each filter is called with three arguments: the full transcoded -string, the back-end, as a symbol, and the communication channel, -as a plist. It must return a string that will be used as the -final export output.") - - -;;;; Elements Filters - -(defvar org-export-filter-babel-call-functions nil - "List of functions applied to a transcoded babel-call. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-center-block-functions nil - "List of functions applied to a transcoded center block. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-clock-functions nil - "List of functions applied to a transcoded clock. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-diary-sexp-functions nil - "List of functions applied to a transcoded diary-sexp. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-drawer-functions nil - "List of functions applied to a transcoded drawer. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-dynamic-block-functions nil - "List of functions applied to a transcoded dynamic-block. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-example-block-functions nil - "List of functions applied to a transcoded example-block. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-export-block-functions nil - "List of functions applied to a transcoded export-block. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-fixed-width-functions nil - "List of functions applied to a transcoded fixed-width. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-footnote-definition-functions nil - "List of functions applied to a transcoded footnote-definition. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-headline-functions nil - "List of functions applied to a transcoded headline. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-horizontal-rule-functions nil - "List of functions applied to a transcoded horizontal-rule. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-inlinetask-functions nil - "List of functions applied to a transcoded inlinetask. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-item-functions nil - "List of functions applied to a transcoded item. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-keyword-functions nil - "List of functions applied to a transcoded keyword. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-latex-environment-functions nil - "List of functions applied to a transcoded latex-environment. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-node-property-functions nil - "List of functions applied to a transcoded node-property. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-paragraph-functions nil - "List of functions applied to a transcoded paragraph. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-plain-list-functions nil - "List of functions applied to a transcoded plain-list. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-planning-functions nil - "List of functions applied to a transcoded planning. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-property-drawer-functions nil - "List of functions applied to a transcoded property-drawer. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-quote-block-functions nil - "List of functions applied to a transcoded quote block. -Each filter is called with three arguments: the transcoded quote -data, as a string, the back-end, as a symbol, and the -communication channel, as a plist. It must return a string or -nil.") - -(defvar org-export-filter-section-functions nil - "List of functions applied to a transcoded section. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-special-block-functions nil - "List of functions applied to a transcoded special block. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-src-block-functions nil - "List of functions applied to a transcoded src-block. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-table-functions nil - "List of functions applied to a transcoded table. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-table-cell-functions nil - "List of functions applied to a transcoded table-cell. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-table-row-functions nil - "List of functions applied to a transcoded table-row. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-verse-block-functions nil - "List of functions applied to a transcoded verse block. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - - -;;;; Objects Filters - -(defvar org-export-filter-bold-functions nil - "List of functions applied to transcoded bold text. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-code-functions nil - "List of functions applied to transcoded code text. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-entity-functions nil - "List of functions applied to a transcoded entity. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-export-snippet-functions nil - "List of functions applied to a transcoded export-snippet. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-footnote-reference-functions nil - "List of functions applied to a transcoded footnote-reference. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-inline-babel-call-functions nil - "List of functions applied to a transcoded inline-babel-call. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-inline-src-block-functions nil - "List of functions applied to a transcoded inline-src-block. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-italic-functions nil - "List of functions applied to transcoded italic text. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-latex-fragment-functions nil - "List of functions applied to a transcoded latex-fragment. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-line-break-functions nil - "List of functions applied to a transcoded line-break. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-link-functions nil - "List of functions applied to a transcoded link. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-radio-target-functions nil - "List of functions applied to a transcoded radio-target. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-statistics-cookie-functions nil - "List of functions applied to a transcoded statistics-cookie. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-strike-through-functions nil - "List of functions applied to transcoded strike-through text. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-subscript-functions nil - "List of functions applied to a transcoded subscript. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-superscript-functions nil - "List of functions applied to a transcoded superscript. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-target-functions nil - "List of functions applied to a transcoded target. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-timestamp-functions nil - "List of functions applied to a transcoded timestamp. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-underline-functions nil - "List of functions applied to transcoded underline text. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - -(defvar org-export-filter-verbatim-functions nil - "List of functions applied to transcoded verbatim text. -Each filter is called with three arguments: the transcoded data, -as a string, the back-end, as a symbol, and the communication -channel, as a plist. It must return a string or nil.") - - -;;;; Filters Tools -;; -;; Internal function `org-export-install-filters' installs filters -;; hard-coded in back-ends (developer filters) and filters from global -;; variables (user filters) in the communication channel. -;; -;; Internal function `org-export-filter-apply-functions' takes care -;; about applying each filter in order to a given data. It ignores -;; filters returning a nil value but stops whenever a filter returns -;; an empty string. - -(defun org-export-filter-apply-functions (filters value info) - "Call every function in FILTERS. - -Functions are called with three arguments: a value, the export -back-end name and the communication channel. First function in -FILTERS is called with VALUE as its first argument. Second -function in FILTERS is called with the previous result as its -value, etc. - -Functions returning nil are skipped. Any function returning the -empty string ends the process, which returns the empty string. - -Call is done in a LIFO fashion, to be sure that developer -specified filters, if any, are called first." - (catch :exit - (let* ((backend (plist-get info :back-end)) - (backend-name (and backend (org-export-backend-name backend)))) - (dolist (filter filters value) - (let ((result (funcall filter value backend-name info))) - (cond ((not result)) - ((equal result "") (throw :exit "")) - (t (setq value result)))))))) - -(defun org-export-install-filters (info) - "Install filters properties in communication channel. -INFO is a plist containing the current communication channel. -Return the updated communication channel." - (let (plist) - ;; Install user-defined filters with `org-export-filters-alist' - ;; and filters already in INFO (through ext-plist mechanism). - (dolist (p org-export-filters-alist) - (let* ((prop (car p)) - (info-value (plist-get info prop)) - (default-value (symbol-value (cdr p)))) - (setq plist - (plist-put plist prop - ;; Filters in INFO will be called - ;; before those user provided. - (append (if (listp info-value) info-value - (list info-value)) - default-value))))) - ;; Prepend back-end specific filters to that list. - (dolist (p (org-export-get-all-filters (plist-get info :back-end))) - ;; Single values get consed, lists are appended. - (let ((key (car p)) (value (cdr p))) - (when value - (setq plist - (plist-put - plist key - (if (atom value) (cons value (plist-get plist key)) - (append value (plist-get plist key)))))))) - ;; Return new communication channel. - (org-combine-plists info plist))) - - - -;;; Core functions -;; -;; This is the room for the main function, `org-export-as', along with -;; its derivative, `org-export-string-as'. -;; `org-export--copy-to-kill-ring-p' determines if output of these -;; function should be added to kill ring. -;; -;; Note that `org-export-as' doesn't really parse the current buffer, -;; but a copy of it (with the same buffer-local variables and -;; visibility), where macros and include keywords are expanded and -;; Babel blocks are executed, if appropriate. -;; `org-export-with-buffer-copy' macro prepares that copy. -;; -;; File inclusion is taken care of by -;; `org-export-expand-include-keyword' and -;; `org-export--prepare-file-contents'. Structure wise, including -;; a whole Org file in a buffer often makes little sense. For -;; example, if the file contains a headline and the include keyword -;; was within an item, the item should contain the headline. That's -;; why file inclusion should be done before any structure can be -;; associated to the file, that is before parsing. -;; -;; `org-export-insert-default-template' is a command to insert -;; a default template (or a back-end specific template) at point or in -;; current subtree. - -(defun org-export-copy-buffer () - "Return a copy of the current buffer. -The copy preserves Org buffer-local variables, visibility and -narrowing." - (let ((copy-buffer-fun (org-export--generate-copy-script (current-buffer))) - (new-buf (generate-new-buffer (buffer-name)))) - (with-current-buffer new-buf - (funcall copy-buffer-fun) - (set-buffer-modified-p nil)) - new-buf)) - -(defmacro org-export-with-buffer-copy (&rest body) - "Apply BODY in a copy of the current buffer. -The copy preserves local variables, visibility and contents of -the original buffer. Point is at the beginning of the buffer -when BODY is applied." - (declare (debug t)) - (org-with-gensyms (buf-copy) - `(let ((,buf-copy (org-export-copy-buffer))) - (unwind-protect - (with-current-buffer ,buf-copy - (goto-char (point-min)) - (progn ,@body)) - (and (buffer-live-p ,buf-copy) - ;; Kill copy without confirmation. - (progn (with-current-buffer ,buf-copy - (restore-buffer-modified-p nil)) - (kill-buffer ,buf-copy))))))) - -(defun org-export--generate-copy-script (buffer) - "Generate a function duplicating BUFFER. - -The copy will preserve local variables, visibility, contents and -narrowing of the original buffer. If a region was active in -BUFFER, contents will be narrowed to that region instead. - -The resulting function can be evaluated at a later time, from -another buffer, effectively cloning the original buffer there. - -The function assumes BUFFER's major mode is `org-mode'." - (with-current-buffer buffer - `(lambda () - (let ((inhibit-modification-hooks t)) - ;; Set major mode. Ignore `org-mode-hook' as it has been run - ;; already in BUFFER. - (let ((org-mode-hook nil) (org-inhibit-startup t)) (org-mode)) - ;; Copy specific buffer local variables and variables set - ;; through BIND keywords. - ,@(let ((bound-variables (org-export--list-bound-variables)) - vars) - (dolist (entry (buffer-local-variables (buffer-base-buffer)) vars) - (when (consp entry) - (let ((var (car entry)) - (val (cdr entry))) - (and (not (memq var org-export-ignored-local-variables)) - (or (memq var - '(default-directory - buffer-file-name - buffer-file-coding-system)) - (assq var bound-variables) - (string-match "^\\(org-\\|orgtbl-\\)" - (symbol-name var))) - ;; Skip unreadable values, as they cannot be - ;; sent to external process. - (or (not val) (ignore-errors (read (format "%S" val)))) - (push `(set (make-local-variable (quote ,var)) - (quote ,val)) - vars)))))) - ;; Whole buffer contents. - (insert ,(org-with-wide-buffer (buffer-string))) - ;; Narrowing. - ,(if (org-region-active-p) - `(narrow-to-region ,(region-beginning) ,(region-end)) - `(narrow-to-region ,(point-min) ,(point-max))) - ;; Current position of point. - (goto-char ,(point)) - ;; Overlays with invisible property. - ,@(let (ov-set) - (dolist (ov (overlays-in (point-min) (point-max)) ov-set) - (let ((invis-prop (overlay-get ov 'invisible))) - (when invis-prop - (push `(overlay-put - (make-overlay ,(overlay-start ov) - ,(overlay-end ov)) - 'invisible (quote ,invis-prop)) - ov-set))))))))) - -(defun org-export--delete-comment-trees () - "Delete commented trees and commented inlinetasks in the buffer. -Narrowing, if any, is ignored." - (org-with-wide-buffer - (goto-char (point-min)) - (let* ((case-fold-search t) - (regexp (concat org-outline-regexp-bol ".*" org-comment-string))) - (while (re-search-forward regexp nil t) - (let ((element (org-element-at-point))) - (when (org-element-property :commentedp element) - (delete-region (org-element-property :begin element) - (org-element-property :end element)))))))) - -(defun org-export--prune-tree (data info) - "Prune non exportable elements from DATA. -DATA is the parse tree to traverse. INFO is the plist holding -export info. Also set `:ignore-list' in INFO to a list of -objects which should be ignored during export, but not removed -from tree." - (letrec ((ignore nil) - ;; First find trees containing a select tag, if any. - (selected (org-export--selected-trees data info)) - ;; List tags that prevent export of headlines. - (excluded (cl-mapcan (lambda (tag) (org-tags-expand tag t)) - (plist-get info :exclude-tags))) - (walk-data - (lambda (data) - ;; Prune non-exportable elements and objects from tree. - ;; As a special case, special rows and cells from tables - ;; are stored in IGNORE, as they still need to be - ;; accessed during export. - (when data - (let ((type (org-element-type data))) - (if (org-export--skip-p data info selected excluded) - (if (memq type '(table-cell table-row)) (push data ignore) - (org-element-extract-element data)) - (if (and (eq type 'headline) - (eq (plist-get info :with-archived-trees) - 'headline) - (org-element-property :archivedp data)) - ;; If headline is archived but tree below has - ;; to be skipped, remove contents. - (org-element-set-contents data) - ;; Move into recursive objects/elements. - (mapc walk-data (org-element-contents data))) - ;; Move into secondary string, if any. - (dolist (p (cdr (assq type - org-element-secondary-value-alist))) - (mapc walk-data (org-element-property p data)))))))) - (definitions - ;; Collect definitions before possibly pruning them so as - ;; to avoid parsing them again if they are required. - (org-element-map data '(footnote-definition footnote-reference) - (lambda (f) - (cond - ((eq 'footnote-definition (org-element-type f)) f) - ((and (eq 'inline (org-element-property :type f)) - (org-element-property :label f)) - f) - (t nil)))))) - ;; If a select tag is active, also ignore the section before the - ;; first headline, if any. - (when selected - (let ((first-element (car (org-element-contents data)))) - (when (eq (org-element-type first-element) 'section) - (org-element-extract-element first-element)))) - ;; Prune tree and communication channel. - (funcall walk-data data) - (dolist (entry (append - ;; Priority is given to back-end specific options. - (org-export-get-all-options (plist-get info :back-end)) - org-export-options-alist)) - (when (eq (nth 4 entry) 'parse) - (funcall walk-data (plist-get info (car entry))))) - (let ((missing (org-export--missing-definitions data definitions))) - (funcall walk-data missing) - (org-export--install-footnote-definitions missing data)) - ;; Eventually set `:ignore-list'. - (plist-put info :ignore-list ignore))) - -(defun org-export--missing-definitions (tree definitions) - "List footnote definitions missing from TREE. -Missing definitions are searched within DEFINITIONS, which is -a list of footnote definitions or in the widened buffer." - (let* ((list-labels - (lambda (data) - ;; List all footnote labels encountered in DATA. Inline - ;; footnote references are ignored. - (org-element-map data 'footnote-reference - (lambda (reference) - (and (eq (org-element-property :type reference) 'standard) - (org-element-property :label reference)))))) - defined undefined missing-definitions) - ;; Partition DIRECT-REFERENCES between DEFINED and UNDEFINED - ;; references. - (let ((known-definitions - (org-element-map tree '(footnote-reference footnote-definition) - (lambda (f) - (and (or (eq (org-element-type f) 'footnote-definition) - (eq (org-element-property :type f) 'inline)) - (org-element-property :label f))))) - seen) - (dolist (l (funcall list-labels tree)) - (cond ((member l seen)) - ((member l known-definitions) (push l defined)) - (t (push l undefined))))) - ;; Complete MISSING-DEFINITIONS by finding the definition of every - ;; undefined label, first by looking into DEFINITIONS, then by - ;; searching the widened buffer. This is a recursive process - ;; since definitions found can themselves contain an undefined - ;; reference. - (while undefined - (let* ((label (pop undefined)) - (definition - (cond - ((cl-some - (lambda (d) (and (equal (org-element-property :label d) label) - d)) - definitions)) - ((pcase (org-footnote-get-definition label) - (`(,_ ,beg . ,_) - (org-with-wide-buffer - (goto-char beg) - (let ((datum (org-element-context))) - (if (eq (org-element-type datum) 'footnote-reference) - datum - ;; Parse definition with contents. - (save-restriction - (narrow-to-region - (org-element-property :begin datum) - (org-element-property :end datum)) - (org-element-map (org-element-parse-buffer) - 'footnote-definition #'identity nil t)))))) - (_ nil))) - (t (user-error "Definition not found for footnote %s" label))))) - (push label defined) - (push definition missing-definitions) - ;; Look for footnote references within DEFINITION, since - ;; we may need to also find their definition. - (dolist (l (funcall list-labels definition)) - (unless (or (member l defined) ;Known label - (member l undefined)) ;Processed later - (push l undefined))))) - ;; MISSING-DEFINITIONS may contain footnote references with inline - ;; definitions. Make sure those are changed into real footnote - ;; definitions. - (mapcar (lambda (d) - (if (eq (org-element-type d) 'footnote-definition) d - (let ((label (org-element-property :label d))) - (apply #'org-element-create - 'footnote-definition `(:label ,label :post-blank 1) - (org-element-contents d))))) - missing-definitions))) - -(defun org-export--install-footnote-definitions (definitions tree) - "Install footnote definitions in tree. - -DEFINITIONS is the list of footnote definitions to install. TREE -is the parse tree. - -If there is a footnote section in TREE, definitions found are -appended to it. If `org-footnote-section' is non-nil, a new -footnote section containing all definitions is inserted in TREE. -Otherwise, definitions are appended at the end of the section -containing their first reference." - (cond - ((null definitions)) - ;; If there is a footnote section, insert definitions there. - ((let ((footnote-section - (org-element-map tree 'headline - (lambda (h) (and (org-element-property :footnote-section-p h) h)) - nil t))) - (and footnote-section - (apply #'org-element-adopt-elements - footnote-section - (nreverse definitions))))) - ;; If there should be a footnote section, create one containing all - ;; the definitions at the end of the tree. - (org-footnote-section - (org-element-adopt-elements - tree - (org-element-create 'headline - (list :footnote-section-p t - :level 1 - :title org-footnote-section - :raw-value org-footnote-section) - (apply #'org-element-create - 'section - nil - (nreverse definitions))))) - ;; Otherwise add each definition at the end of the section where it - ;; is first referenced. - (t - (letrec ((seen nil) - (insert-definitions - (lambda (data) - ;; Insert footnote definitions in the same section as - ;; their first reference in DATA. - (org-element-map data 'footnote-reference - (lambda (reference) - (when (eq (org-element-property :type reference) 'standard) - (let ((label (org-element-property :label reference))) - (unless (member label seen) - (push label seen) - (let ((definition - (cl-some - (lambda (d) - (and (equal (org-element-property :label d) - label) - d)) - definitions))) - (org-element-adopt-elements - (org-element-lineage reference '(section)) - definition) - ;; Also insert definitions for nested - ;; references, if any. - (funcall insert-definitions definition)))))))))) - (funcall insert-definitions tree))))) - -(defun org-export--remove-uninterpreted-data (data info) - "Change uninterpreted elements back into Org syntax. -DATA is a parse tree or a secondary string. INFO is a plist -containing export options. It is modified by side effect and -returned by the function." - (org-element-map data - '(entity bold italic latex-environment latex-fragment strike-through - subscript superscript underline) - (lambda (datum) - (let* ((type (org-element-type datum)) - (post-blank - (pcase (org-element-property :post-blank datum) - (`nil nil) - (n (make-string n (if (eq type 'latex-environment) ?\n ?\s))))) - (new - (cl-case type - ;; ... entities... - (entity - (and (not (plist-get info :with-entities)) - (list (concat (org-export-expand datum nil) - post-blank)))) - ;; ... emphasis... - ((bold italic strike-through underline) - (and (not (plist-get info :with-emphasize)) - (let ((marker (cl-case type - (bold "*") - (italic "/") - (strike-through "+") - (underline "_")))) - (append - (list marker) - (org-element-contents datum) - (list (concat marker post-blank)))))) - ;; ... LaTeX environments and fragments... - ((latex-environment latex-fragment) - (and (eq (plist-get info :with-latex) 'verbatim) - (list (concat (org-export-expand datum nil) - post-blank)))) - ;; ... sub/superscripts... - ((subscript superscript) - (let ((sub/super-p (plist-get info :with-sub-superscript)) - (bracketp (org-element-property :use-brackets-p datum))) - (and (or (not sub/super-p) - (and (eq sub/super-p '{}) (not bracketp))) - (append - (list (concat (if (eq type 'subscript) "_" "^") - (and bracketp "{"))) - (org-element-contents datum) - (list (concat (and bracketp "}") - post-blank))))))))) - (when new - ;; Splice NEW at DATUM location in parse tree. - (dolist (e new (org-element-extract-element datum)) - (unless (equal e "") (org-element-insert-before e datum)))))) - info nil nil t) - ;; Return modified parse tree. - data) - -;;;###autoload -(defun org-export-as - (backend &optional subtreep visible-only body-only ext-plist) - "Transcode current Org buffer into BACKEND code. - -BACKEND is either an export back-end, as returned by, e.g., -`org-export-create-backend', or a symbol referring to -a registered back-end. - -If narrowing is active in the current buffer, only transcode its -narrowed part. - -If a region is active, transcode that region. - -When optional argument SUBTREEP is non-nil, transcode the -sub-tree at point, extracting information from the headline -properties first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only return body -code, without surrounding template. - -Optional argument EXT-PLIST, when provided, is a property list -with external parameters overriding Org default settings, but -still inferior to file-local settings. - -Return code as a string." - (when (symbolp backend) (setq backend (org-export-get-backend backend))) - (org-export-barf-if-invalid-backend backend) - (save-excursion - (save-restriction - ;; Narrow buffer to an appropriate region or subtree for - ;; parsing. If parsing subtree, be sure to remove main - ;; headline, planning data and property drawer. - (cond ((org-region-active-p) - (narrow-to-region (region-beginning) (region-end))) - (subtreep - (org-narrow-to-subtree) - (goto-char (point-min)) - (org-end-of-meta-data) - (narrow-to-region (point) (point-max)))) - ;; Initialize communication channel with original buffer - ;; attributes, unavailable in its copy. - (let* ((org-export-current-backend (org-export-backend-name backend)) - (info (org-combine-plists - (org-export--get-export-attributes - backend subtreep visible-only body-only) - (org-export--get-buffer-attributes))) - (parsed-keywords - (delq nil - (mapcar (lambda (o) (and (eq (nth 4 o) 'parse) (nth 1 o))) - (append (org-export-get-all-options backend) - org-export-options-alist)))) - tree) - ;; Update communication channel and get parse tree. Buffer - ;; isn't parsed directly. Instead, all buffer modifications - ;; and consequent parsing are undertaken in a temporary copy. - (org-export-with-buffer-copy - ;; Run first hook with current back-end's name as argument. - (run-hook-with-args 'org-export-before-processing-hook - (org-export-backend-name backend)) - (org-export-expand-include-keyword) - (org-export--delete-comment-trees) - (org-macro-initialize-templates) - (org-macro-replace-all (append org-macro-templates - org-export-global-macros) - parsed-keywords) - ;; Refresh buffer properties and radio targets after previous - ;; potentially invasive changes. - (org-set-regexps-and-options) - (org-update-radio-target-regexp) - ;; Possibly execute Babel code. Re-run a macro expansion - ;; specifically for {{{results}}} since inline source blocks - ;; may have generated some more. Refresh buffer properties - ;; and radio targets another time. - (when org-export-use-babel - (org-babel-exp-process-buffer) - (org-macro-replace-all '(("results" . "$1")) parsed-keywords) - (org-set-regexps-and-options) - (org-update-radio-target-regexp)) - ;; Run last hook with current back-end's name as argument. - ;; Update buffer properties and radio targets one last time - ;; before parsing. - (goto-char (point-min)) - (save-excursion - (run-hook-with-args 'org-export-before-parsing-hook - (org-export-backend-name backend))) - (org-set-regexps-and-options) - (org-update-radio-target-regexp) - ;; Update communication channel with environment. - (setq info - (org-combine-plists - info (org-export-get-environment backend subtreep ext-plist))) - ;; De-activate uninterpreted data from parsed keywords. - (dolist (entry (append (org-export-get-all-options backend) - org-export-options-alist)) - (pcase entry - (`(,p ,_ ,_ ,_ parse) - (let ((value (plist-get info p))) - (plist-put info - p - (org-export--remove-uninterpreted-data value info)))) - (_ nil))) - ;; Install user's and developer's filters. - (setq info (org-export-install-filters info)) - ;; Call options filters and update export options. We do not - ;; use `org-export-filter-apply-functions' here since the - ;; arity of such filters is different. - (let ((backend-name (org-export-backend-name backend))) - (dolist (filter (plist-get info :filter-options)) - (let ((result (funcall filter info backend-name))) - (when result (setq info result))))) - ;; Parse buffer. - (setq tree (org-element-parse-buffer nil visible-only)) - ;; Prune tree from non-exported elements and transform - ;; uninterpreted elements or objects in both parse tree and - ;; communication channel. - (org-export--prune-tree tree info) - (org-export--remove-uninterpreted-data tree info) - ;; Call parse tree filters. - (setq tree - (org-export-filter-apply-functions - (plist-get info :filter-parse-tree) tree info)) - ;; Now tree is complete, compute its properties and add them - ;; to communication channel. - (setq info (org-export--collect-tree-properties tree info)) - ;; Eventually transcode TREE. Wrap the resulting string into - ;; a template. - (let* ((body (org-element-normalize-string - (or (org-export-data tree info) ""))) - (inner-template (cdr (assq 'inner-template - (plist-get info :translate-alist)))) - (full-body (org-export-filter-apply-functions - (plist-get info :filter-body) - (if (not (functionp inner-template)) body - (funcall inner-template body info)) - info)) - (template (cdr (assq 'template - (plist-get info :translate-alist))))) - ;; Remove all text properties since they cannot be - ;; retrieved from an external process. Finally call - ;; final-output filter and return result. - (org-no-properties - (org-export-filter-apply-functions - (plist-get info :filter-final-output) - (if (or (not (functionp template)) body-only) full-body - (funcall template full-body info)) - info)))))))) - -;;;###autoload -(defun org-export-string-as (string backend &optional body-only ext-plist) - "Transcode STRING into BACKEND code. - -BACKEND is either an export back-end, as returned by, e.g., -`org-export-create-backend', or a symbol referring to -a registered back-end. - -When optional argument BODY-ONLY is non-nil, only return body -code, without preamble nor postamble. - -Optional argument EXT-PLIST, when provided, is a property list -with external parameters overriding Org default settings, but -still inferior to file-local settings. - -Return code as a string." - (with-temp-buffer - (insert string) - (let ((org-inhibit-startup t)) (org-mode)) - (org-export-as backend nil nil body-only ext-plist))) - -;;;###autoload -(defun org-export-replace-region-by (backend) - "Replace the active region by its export to BACKEND. -BACKEND is either an export back-end, as returned by, e.g., -`org-export-create-backend', or a symbol referring to -a registered back-end." - (unless (org-region-active-p) (user-error "No active region to replace")) - (insert - (org-export-string-as - (delete-and-extract-region (region-beginning) (region-end)) backend t))) - -;;;###autoload -(defun org-export-insert-default-template (&optional backend subtreep) - "Insert all export keywords with default values at beginning of line. - -BACKEND is a symbol referring to the name of a registered export -back-end, for which specific export options should be added to -the template, or `default' for default template. When it is nil, -the user will be prompted for a category. - -If SUBTREEP is non-nil, export configuration will be set up -locally for the subtree through node properties." - (interactive) - (unless (derived-mode-p 'org-mode) (user-error "Not in an Org mode buffer")) - (when (and subtreep (org-before-first-heading-p)) - (user-error "No subtree to set export options for")) - (let ((node (and subtreep (save-excursion (org-back-to-heading t) (point)))) - (backend - (or backend - (intern - (org-completing-read - "Options category: " - (cons "default" - (mapcar (lambda (b) - (symbol-name (org-export-backend-name b))) - org-export-registered-backends)) - nil t)))) - options keywords) - ;; Populate OPTIONS and KEYWORDS. - (dolist (entry (cond ((eq backend 'default) org-export-options-alist) - ((org-export-backend-p backend) - (org-export-backend-options backend)) - (t (org-export-backend-options - (org-export-get-backend backend))))) - (let ((keyword (nth 1 entry)) - (option (nth 2 entry))) - (cond - (keyword (unless (assoc keyword keywords) - (let ((value - (if (eq (nth 4 entry) 'split) - (mapconcat #'identity (eval (nth 3 entry)) " ") - (eval (nth 3 entry))))) - (push (cons keyword value) keywords)))) - (option (unless (assoc option options) - (push (cons option (eval (nth 3 entry))) options)))))) - ;; Move to an appropriate location in order to insert options. - (unless subtreep (beginning-of-line)) - ;; First (multiple) OPTIONS lines. Never go past fill-column. - (when options - (let ((items - (mapcar - #'(lambda (opt) (format "%s:%S" (car opt) (cdr opt))) - (sort options (lambda (k1 k2) (string< (car k1) (car k2))))))) - (if subtreep - (org-entry-put - node "EXPORT_OPTIONS" (mapconcat 'identity items " ")) - (while items - (insert "#+options:") - (let ((width 10)) - (while (and items - (< (+ width (length (car items)) 1) fill-column)) - (let ((item (pop items))) - (insert " " item) - (cl-incf width (1+ (length item)))))) - (insert "\n"))))) - ;; Then the rest of keywords, in the order specified in either - ;; `org-export-options-alist' or respective export back-ends. - (dolist (key (nreverse keywords)) - (let ((val (cond ((equal (car key) "DATE") - (or (cdr key) - (with-temp-buffer - (org-insert-time-stamp nil)))) - ((equal (car key) "TITLE") - (or (let ((visited-file - (buffer-file-name (buffer-base-buffer)))) - (and visited-file - (file-name-sans-extension - (file-name-nondirectory visited-file)))) - (buffer-name (buffer-base-buffer)))) - (t (cdr key))))) - (if subtreep (org-entry-put node (concat "EXPORT_" (car key)) val) - (insert - (format "#+%s:%s\n" - (downcase (car key)) - (if (org-string-nw-p val) (format " %s" val) "")))))))) - -(defun org-export-expand-include-keyword (&optional included dir footnotes) - "Expand every include keyword in buffer. -Optional argument INCLUDED is a list of included file names along -with their line restriction, when appropriate. It is used to -avoid infinite recursion. Optional argument DIR is the current -working directory. It is used to properly resolve relative -paths. Optional argument FOOTNOTES is a hash-table used for -storing and resolving footnotes. It is created automatically." - (let ((includer-file (buffer-file-name (buffer-base-buffer))) - (case-fold-search t) - (file-prefix (make-hash-table :test #'equal)) - (current-prefix 0) - (footnotes (or footnotes (make-hash-table :test #'equal))) - (include-re "^[ \t]*#\\+INCLUDE:")) - ;; If :minlevel is not set the text-property - ;; `:org-include-induced-level' will be used to determine the - ;; relative level when expanding INCLUDE. - ;; Only affects included Org documents. - (goto-char (point-min)) - (while (re-search-forward include-re nil t) - (put-text-property (line-beginning-position) (line-end-position) - :org-include-induced-level - (1+ (org-reduced-level (or (org-current-level) 0))))) - ;; Expand INCLUDE keywords. - (goto-char (point-min)) - (while (re-search-forward include-re nil t) - (unless (org-in-commented-heading-p) - (let ((element (save-match-data (org-element-at-point)))) - (when (eq (org-element-type element) 'keyword) - (beginning-of-line) - ;; Extract arguments from keyword's value. - (let* ((value (org-element-property :value element)) - (ind (current-indentation)) - location - (coding-system-for-read - (or (and (string-match ":coding +\\(\\S-+\\)>" value) - (prog1 (intern (match-string 1 value)) - (setq value (replace-match "" nil nil value)))) - coding-system-for-read)) - (file - (and (string-match "^\\(\".+?\"\\|\\S-+\\)\\(?:\\s-+\\|$\\)" - value) - (prog1 - (save-match-data - (let ((matched (match-string 1 value))) - (when (string-match "\\(::\\(.*?\\)\\)\"?\\'" - matched) - (setq location (match-string 2 matched)) - (setq matched - (replace-match "" nil nil matched 1))) - (expand-file-name (org-strip-quotes matched) - dir))) - (setq value (replace-match "" nil nil value))))) - (only-contents - (and (string-match ":only-contents *\\([^: \r\t\n]\\S-*\\)?" - value) - (prog1 (org-not-nil (match-string 1 value)) - (setq value (replace-match "" nil nil value))))) - (lines - (and (string-match - ":lines +\"\\([0-9]*-[0-9]*\\)\"" - value) - (prog1 (match-string 1 value) - (setq value (replace-match "" nil nil value))))) - (env (cond - ((string-match "\\" value) 'literal) - ((string-match "\\" value) - (match-string 1 value)))) - ;; Remove keyword. - (delete-region (point) (line-beginning-position 2)) - (cond - ((not file) nil) - ((not (file-readable-p file)) - (error "Cannot include file %s" file)) - ;; Check if files has already been parsed. Look after - ;; inclusion lines too, as different parts of the same - ;; file can be included too. - ((member (list file lines) included) - (error "Recursive file inclusion: %s" file)) - (t - (cond - ((eq env 'literal) - (insert - (let ((ind-str (make-string ind ?\s)) - (arg-str (if (stringp args) (format " %s" args) "")) - (contents - (org-escape-code-in-string - (org-export--prepare-file-contents file lines)))) - (format "%s#+BEGIN_%s%s\n%s%s#+END_%s\n" - ind-str block arg-str contents ind-str block)))) - ((stringp block) - (insert - (let ((ind-str (make-string ind ?\s)) - (contents - (org-export--prepare-file-contents file lines))) - (format "%s#+BEGIN_%s\n%s%s#+END_%s\n" - ind-str block contents ind-str block)))) - (t - (insert - (with-temp-buffer - (let ((org-inhibit-startup t) - (lines - (if location - (org-export--inclusion-absolute-lines - file location only-contents lines) - lines))) - (org-mode) - (insert - (org-export--prepare-file-contents - file lines ind minlevel - (or (gethash file file-prefix) - (puthash file - (cl-incf current-prefix) - file-prefix)) - footnotes - includer-file))) - (org-export-expand-include-keyword - (cons (list file lines) included) - (file-name-directory file) - footnotes) - (buffer-string))))) - ;; Expand footnotes after all files have been - ;; included. Footnotes are stored at end of buffer. - (unless included - (org-with-wide-buffer - (goto-char (point-max)) - (maphash (lambda (k v) - (insert (format "\n[fn:%s] %s\n" k v))) - footnotes)))))))))))) - -(defun org-export--inclusion-absolute-lines (file location only-contents lines) - "Resolve absolute lines for an included file with file-link. - -FILE is string file-name of the file to include. LOCATION is a -string name within FILE to be included (located via -`org-link-search'). If ONLY-CONTENTS is non-nil only the -contents of the named element will be included, as determined -Org-Element. If LINES is non-nil only those lines are included. - -Return a string of lines to be included in the format expected by -`org-export--prepare-file-contents'." - (with-temp-buffer - (insert-file-contents file) - (unless (eq major-mode 'org-mode) - (let ((org-inhibit-startup t)) (org-mode))) - (condition-case err - ;; Enforce consistent search. - (let ((org-link-search-must-match-exact-headline nil)) - (org-link-search location)) - (error - (error "%s for %s::%s" (error-message-string err) file location))) - (let* ((element (org-element-at-point)) - (contents-begin - (and only-contents (org-element-property :contents-begin element)))) - (narrow-to-region - (or contents-begin (org-element-property :begin element)) - (org-element-property (if contents-begin :contents-end :end) element)) - (when (and only-contents - (memq (org-element-type element) '(headline inlinetask))) - ;; Skip planning line and property-drawer. - (goto-char (point-min)) - (when (looking-at-p org-planning-line-re) (forward-line)) - (when (looking-at org-property-drawer-re) (goto-char (match-end 0))) - (unless (bolp) (forward-line)) - (narrow-to-region (point) (point-max)))) - (when lines - (org-skip-whitespace) - (beginning-of-line) - (let* ((lines (split-string lines "-")) - (lbeg (string-to-number (car lines))) - (lend (string-to-number (cadr lines))) - (beg (if (zerop lbeg) (point-min) - (goto-char (point-min)) - (forward-line (1- lbeg)) - (point))) - (end (if (zerop lend) (point-max) - (goto-char beg) - (forward-line (1- lend)) - (point)))) - (narrow-to-region beg end))) - (let ((end (point-max))) - (goto-char (point-min)) - (widen) - (let ((start-line (line-number-at-pos))) - (format "%d-%d" - start-line - (save-excursion - (+ start-line - (let ((counter 0)) - (while (< (point) end) (cl-incf counter) (forward-line)) - counter)))))))) - -(defun org-export--update-included-link (file-dir includer-dir) - "Update relative file name of link at point, if possible. - -FILE-DIR is the directory of the file being included. -INCLUDER-DIR is the directory of the file where the inclusion is -going to happen. - -Move point after the link." - (let* ((link (org-element-link-parser)) - (path (org-element-property :path link))) - (if (or (not (string= "file" (org-element-property :type link))) - (file-remote-p path) - (file-name-absolute-p path)) - (goto-char (org-element-property :end link)) - (let ((new-path (file-relative-name (expand-file-name path file-dir) - includer-dir)) - (new-link (org-element-copy link))) - (org-element-put-property new-link :path new-path) - (when (org-element-property :contents-begin link) - (org-element-adopt-elements new-link - (buffer-substring - (org-element-property :contents-begin link) - (org-element-property :contents-end link)))) - (delete-region (org-element-property :begin link) - (org-element-property :end link)) - (insert (org-element-interpret-data new-link)))))) - -(defun org-export--prepare-file-contents - (file &optional lines ind minlevel id footnotes includer) - "Prepare contents of FILE for inclusion and return it as a string. - -When optional argument LINES is a string specifying a range of -lines, include only those lines. - -Optional argument IND, when non-nil, is an integer specifying the -global indentation of returned contents. Since its purpose is to -allow an included file to stay in the same environment it was -created (e.g., a list item), it doesn't apply past the first -headline encountered. - -Optional argument MINLEVEL, when non-nil, is an integer -specifying the level that any top-level headline in the included -file should have. - -Optional argument ID is an integer that will be inserted before -each footnote definition and reference if FILE is an Org file. -This is useful to avoid conflicts when more than one Org file -with footnotes is included in a document. - -Optional argument FOOTNOTES is a hash-table to store footnotes in -the included document. - -Optional argument INCLUDER is the file name where the inclusion -is to happen." - (with-temp-buffer - (insert-file-contents file) - (when lines - (let* ((lines (split-string lines "-")) - (lbeg (string-to-number (car lines))) - (lend (string-to-number (cadr lines))) - (beg (if (zerop lbeg) (point-min) - (goto-char (point-min)) - (forward-line (1- lbeg)) - (point))) - (end (if (zerop lend) (point-max) - (goto-char (point-min)) - (forward-line (1- lend)) - (point)))) - (narrow-to-region beg end))) - ;; Adapt all file links within the included document that contain - ;; relative paths in order to make these paths relative to the - ;; base document, or absolute. - (when includer - (let ((file-dir (file-name-directory file)) - (includer-dir (file-name-directory includer))) - (unless (file-equal-p file-dir includer-dir) - (goto-char (point-min)) - (unless (eq major-mode 'org-mode) - (let ((org-inhibit-startup t)) (org-mode))) ;set regexps - (let ((regexp (concat org-link-plain-re "\\|" org-link-angle-re))) - (while (re-search-forward org-link-any-re nil t) - (let ((link (save-excursion - (forward-char -1) - (save-match-data (org-element-context))))) - (when (eq 'link (org-element-type link)) - ;; Look for file links within link's description. - ;; Org doesn't support such construct, but - ;; `org-export-insert-image-links' may activate - ;; them. - (let ((contents-begin - (org-element-property :contents-begin link)) - (begin (org-element-property :begin link))) - (when contents-begin - (save-excursion - (goto-char (org-element-property :contents-end link)) - (while (re-search-backward regexp contents-begin t) - (save-match-data - (org-export--update-included-link - file-dir includer-dir)) - (goto-char (match-beginning 0))))) - ;; Update current link, if necessary. - (when (string= "file" (org-element-property :type link)) - (goto-char begin) - (org-export--update-included-link - file-dir includer-dir)))))))))) - ;; Remove blank lines at beginning and end of contents. The logic - ;; behind that removal is that blank lines around include keyword - ;; override blank lines in included file. - (goto-char (point-min)) - (org-skip-whitespace) - (beginning-of-line) - (delete-region (point-min) (point)) - (goto-char (point-max)) - (skip-chars-backward " \r\t\n") - (forward-line) - (delete-region (point) (point-max)) - ;; If IND is set, preserve indentation of include keyword until - ;; the first headline encountered. - (when (and ind (> ind 0)) - (unless (eq major-mode 'org-mode) - (let ((org-inhibit-startup t)) (org-mode))) - (goto-char (point-min)) - (let ((ind-str (make-string ind ?\s))) - (while (not (or (eobp) (looking-at org-outline-regexp-bol))) - ;; Do not move footnote definitions out of column 0. - (unless (and (looking-at org-footnote-definition-re) - (eq (org-element-type (org-element-at-point)) - 'footnote-definition)) - (insert ind-str)) - (forward-line)))) - ;; When MINLEVEL is specified, compute minimal level for headlines - ;; in the file (CUR-MIN), and remove stars to each headline so - ;; that headlines with minimal level have a level of MINLEVEL. - (when minlevel - (unless (eq major-mode 'org-mode) - (let ((org-inhibit-startup t)) (org-mode))) - (org-with-limited-levels - (let ((levels (org-map-entries - (lambda () (org-reduced-level (org-current-level)))))) - (when levels - (let ((offset (- minlevel (apply #'min levels)))) - (unless (zerop offset) - (when org-odd-levels-only (setq offset (* offset 2))) - ;; Only change stars, don't bother moving whole - ;; sections. - (org-map-entries - (lambda () - (if (< offset 0) (delete-char (abs offset)) - (insert (make-string offset ?*))))))))))) - ;; Append ID to all footnote references and definitions, so they - ;; become file specific and cannot collide with footnotes in other - ;; included files. Further, collect relevant footnote definitions - ;; outside of LINES, in order to reintroduce them later. - (when id - (let ((marker-min (point-min-marker)) - (marker-max (point-max-marker)) - (get-new-label - (lambda (label) - ;; Generate new label from LABEL by prefixing it with - ;; "-ID-". - (format "-%d-%s" id label))) - (set-new-label - (lambda (f old new) - ;; Replace OLD label with NEW in footnote F. - (save-excursion - (goto-char (+ (org-element-property :begin f) 4)) - (looking-at (regexp-quote old)) - (replace-match new)))) - (seen-alist)) - (goto-char (point-min)) - (while (re-search-forward org-footnote-re nil t) - (let ((footnote (save-excursion - (backward-char) - (org-element-context)))) - (when (memq (org-element-type footnote) - '(footnote-definition footnote-reference)) - (let* ((label (org-element-property :label footnote))) - ;; Update the footnote-reference at point and collect - ;; the new label, which is only used for footnotes - ;; outsides LINES. - (when label - (let ((seen (cdr (assoc label seen-alist)))) - (if seen (funcall set-new-label footnote label seen) - (let ((new (funcall get-new-label label))) - (push (cons label new) seen-alist) - (org-with-wide-buffer - (let* ((def (org-footnote-get-definition label)) - (beg (nth 1 def))) - (when (and def - (or (< beg marker-min) - (>= beg marker-max))) - ;; Store since footnote-definition is - ;; outside of LINES. - (puthash new - (org-element-normalize-string (nth 3 def)) - footnotes)))) - (funcall set-new-label footnote label new))))))))) - (set-marker marker-min nil) - (set-marker marker-max nil))) - (org-element-normalize-string (buffer-string)))) - -(defun org-export--copy-to-kill-ring-p () - "Return a non-nil value when output should be added to the kill ring. -See also `org-export-copy-to-kill-ring'." - (if (eq org-export-copy-to-kill-ring 'if-interactive) - (not (or executing-kbd-macro noninteractive)) - (eq org-export-copy-to-kill-ring t))) - - - -;;; Tools For Back-Ends -;; -;; A whole set of tools is available to help build new exporters. Any -;; function general enough to have its use across many back-ends -;; should be added here. - -;;;; For Affiliated Keywords -;; -;; `org-export-read-attribute' reads a property from a given element -;; as a plist. It can be used to normalize affiliated keywords' -;; syntax. -;; -;; Since captions can span over multiple lines and accept dual values, -;; their internal representation is a bit tricky. Therefore, -;; `org-export-get-caption' transparently returns a given element's -;; caption as a secondary string. - -(defun org-export-read-attribute (attribute element &optional property) - "Turn ATTRIBUTE property from ELEMENT into a plist. - -When optional argument PROPERTY is non-nil, return the value of -that property within attributes. - -This function assumes attributes are defined as \":keyword -value\" pairs. It is appropriate for `:attr_html' like -properties. - -All values will become strings except the empty string and -\"nil\", which will become nil. Also, values containing only -double quotes will be read as-is, which means that \"\" value -will become the empty string." - (let* ((prepare-value - (lambda (str) - (save-match-data - (cond ((member str '(nil "" "nil")) nil) - ((string-match "^\"\\(\"+\\)?\"$" str) - (or (match-string 1 str) "")) - (t str))))) - (attributes - (let ((value (org-element-property attribute element))) - (when value - (let ((s (mapconcat 'identity value " ")) result) - (while (string-match - "\\(?:^\\|[ \t]+\\)\\(:[-a-zA-Z0-9_]+\\)\\([ \t]+\\|$\\)" - s) - (let ((value (substring s 0 (match-beginning 0)))) - (push (funcall prepare-value value) result)) - (push (intern (match-string 1 s)) result) - (setq s (substring s (match-end 0)))) - ;; Ignore any string before first property with `cdr'. - (cdr (nreverse (cons (funcall prepare-value s) result)))))))) - (if property (plist-get attributes property) attributes))) - -(defun org-export-get-caption (element &optional short) - "Return caption from ELEMENT as a secondary string. - -When optional argument SHORT is non-nil, return short caption, as -a secondary string, instead. - -Caption lines are separated by a white space." - (let ((full-caption (org-element-property :caption element)) - (get (if short #'cdr #'car)) - caption) - (dolist (line full-caption) - (pcase (funcall get line) - (`nil nil) - (c - (setq caption - (nconc (list " ") - (copy-sequence c) caption))))) - (cdr caption))) - - -;;;; For Derived Back-ends -;; -;; `org-export-with-backend' is a function allowing to locally use -;; another back-end to transcode some object or element. In a derived -;; back-end, it may be used as a fall-back function once all specific -;; cases have been treated. - -(defun org-export-with-backend (backend data &optional contents info) - "Call a transcoder from BACKEND on DATA. -BACKEND is an export back-end, as returned by, e.g., -`org-export-create-backend', or a symbol referring to -a registered back-end. DATA is an Org element, object, secondary -string or string. CONTENTS, when non-nil, is the transcoded -contents of DATA element, as a string. INFO, when non-nil, is -the communication channel used for export, as a plist." - (when (symbolp backend) (setq backend (org-export-get-backend backend))) - (org-export-barf-if-invalid-backend backend) - (let ((type (org-element-type data))) - (when (memq type '(nil org-data)) (error "No foreign transcoder available")) - (let* ((all-transcoders (org-export-get-all-transcoders backend)) - (transcoder (cdr (assq type all-transcoders)))) - (unless (functionp transcoder) (error "No foreign transcoder available")) - (let ((new-info - (org-combine-plists - info (list - :back-end backend - :translate-alist all-transcoders - :exported-data (make-hash-table :test #'eq :size 401))))) - ;; `:internal-references' are shared across back-ends. - (prog1 (if (eq type 'plain-text) - (funcall transcoder data new-info) - (funcall transcoder data contents new-info)) - (plist-put info :internal-references - (plist-get new-info :internal-references))))))) - - -;;;; For Export Snippets -;; -;; Every export snippet is transmitted to the back-end. Though, the -;; latter will only retain one type of export-snippet, ignoring -;; others, based on the former's target back-end. The function -;; `org-export-snippet-backend' returns that back-end for a given -;; export-snippet. - -(defun org-export-snippet-backend (export-snippet) - "Return EXPORT-SNIPPET targeted back-end as a symbol. -Translation, with `org-export-snippet-translation-alist', is -applied." - (let ((back-end (org-element-property :back-end export-snippet))) - (intern - (or (cdr (assoc back-end org-export-snippet-translation-alist)) - back-end)))) - - -;;;; For Footnotes -;; -;; `org-export-collect-footnote-definitions' is a tool to list -;; actually used footnotes definitions in the whole parse tree, or in -;; a headline, in order to add footnote listings throughout the -;; transcoded data. -;; -;; `org-export-footnote-first-reference-p' is a predicate used by some -;; back-ends, when they need to attach the footnote definition only to -;; the first occurrence of the corresponding label. -;; -;; `org-export-get-footnote-definition' and -;; `org-export-get-footnote-number' provide easier access to -;; additional information relative to a footnote reference. - -(defun org-export-get-footnote-definition (footnote-reference info) - "Return definition of FOOTNOTE-REFERENCE as parsed data. -INFO is the plist used as a communication channel. If no such -definition can be found, raise an error." - (let ((label (org-element-property :label footnote-reference))) - (if (not label) (org-element-contents footnote-reference) - (let ((cache (or (plist-get info :footnote-definition-cache) - (let ((hash (make-hash-table :test #'equal))) - (plist-put info :footnote-definition-cache hash) - hash)))) - (or - (gethash label cache) - (puthash label - (org-element-map (plist-get info :parse-tree) - '(footnote-definition footnote-reference) - (lambda (f) - (cond - ;; Skip any footnote with a different label. - ;; Also skip any standard footnote reference - ;; with the same label since those cannot - ;; contain a definition. - ((not (equal (org-element-property :label f) label)) nil) - ((eq (org-element-property :type f) 'standard) nil) - ((org-element-contents f)) - ;; Even if the contents are empty, we can not - ;; return nil since that would eventually raise - ;; the error. Instead, return the equivalent - ;; empty string. - (t ""))) - info t) - cache) - (error "Definition not found for footnote %s" label)))))) - -(defun org-export--footnote-reference-map - (function data info &optional body-first) - "Apply FUNCTION on every footnote reference in DATA. -INFO is a plist containing export state. By default, as soon as -a new footnote reference is encountered, FUNCTION is called onto -its definition. However, if BODY-FIRST is non-nil, this step is -delayed until the end of the process." - (letrec ((definitions nil) - (seen-refs nil) - (search-ref - (lambda (data delayp) - ;; Search footnote references through DATA, filling - ;; SEEN-REFS along the way. When DELAYP is non-nil, - ;; store footnote definitions so they can be entered - ;; later. - (org-element-map data 'footnote-reference - (lambda (f) - (funcall function f) - (let ((--label (org-element-property :label f))) - (unless (and --label (member --label seen-refs)) - (when --label (push --label seen-refs)) - ;; Search for subsequent references in footnote - ;; definition so numbering follows reading - ;; logic, unless DELAYP in non-nil. - (cond - (delayp - (push (org-export-get-footnote-definition f info) - definitions)) - ;; Do not force entering inline definitions, - ;; since `org-element-map' already traverses - ;; them at the right time. - ((eq (org-element-property :type f) 'inline)) - (t (funcall search-ref - (org-export-get-footnote-definition f info) - nil)))))) - info nil - ;; Don't enter footnote definitions since it will - ;; happen when their first reference is found. - ;; Moreover, if DELAYP is non-nil, make sure we - ;; postpone entering definitions of inline references. - (if delayp '(footnote-definition footnote-reference) - 'footnote-definition))))) - (funcall search-ref data body-first) - (funcall search-ref (nreverse definitions) nil))) - -(defun org-export-collect-footnote-definitions (info &optional data body-first) - "Return an alist between footnote numbers, labels and definitions. - -INFO is the current export state, as a plist. - -Definitions are collected throughout the whole parse tree, or -DATA when non-nil. - -Sorting is done by order of references. As soon as a new -reference is encountered, other references are searched within -its definition. However, if BODY-FIRST is non-nil, this step is -delayed after the whole tree is checked. This alters results -when references are found in footnote definitions. - -Definitions either appear as Org data or as a secondary string -for inlined footnotes. Unreferenced definitions are ignored." - (let ((n 0) labels alist) - (org-export--footnote-reference-map - (lambda (f) - ;; Collect footnote number, label and definition. - (let ((l (org-element-property :label f))) - (unless (and l (member l labels)) - (cl-incf n) - (push (list n l (org-export-get-footnote-definition f info)) alist)) - (when l (push l labels)))) - (or data (plist-get info :parse-tree)) info body-first) - (nreverse alist))) - -(defun org-export-footnote-first-reference-p - (footnote-reference info &optional data body-first) - "Non-nil when a footnote reference is the first one for its label. - -FOOTNOTE-REFERENCE is the footnote reference being considered. -INFO is a plist containing current export state. - -Search is done throughout the whole parse tree, or DATA when -non-nil. - -By default, as soon as a new footnote reference is encountered, -other references are searched within its definition. However, if -BODY-FIRST is non-nil, this step is delayed after the whole tree -is checked. This alters results when references are found in -footnote definitions." - (let ((label (org-element-property :label footnote-reference))) - ;; Anonymous footnotes are always a first reference. - (or (not label) - (catch 'exit - (org-export--footnote-reference-map - (lambda (f) - (let ((l (org-element-property :label f))) - (when (and l label (string= label l)) - (throw 'exit (eq footnote-reference f))))) - (or data (plist-get info :parse-tree)) info body-first))))) - -(defun org-export-get-footnote-number (footnote info &optional data body-first) - "Return number associated to a footnote. - -FOOTNOTE is either a footnote reference or a footnote definition. -INFO is the plist containing export state. - -Number is unique throughout the whole parse tree, or DATA, when -non-nil. - -By default, as soon as a new footnote reference is encountered, -counting process moves into its definition. However, if -BODY-FIRST is non-nil, this step is delayed until the end of the -process, leading to a different order when footnotes are nested." - (let ((count 0) - (seen) - (label (org-element-property :label footnote))) - (catch 'exit - (org-export--footnote-reference-map - (lambda (f) - (let ((l (org-element-property :label f))) - (cond - ;; Anonymous footnote match: return number. - ((and (not l) (not label) (eq footnote f)) (throw 'exit (1+ count))) - ;; Labels match: return number. - ((and label l (string= label l)) (throw 'exit (1+ count))) - ;; Otherwise store label and increase counter if label - ;; wasn't encountered yet. - ((not l) (cl-incf count)) - ((not (member l seen)) (push l seen) (cl-incf count))))) - (or data (plist-get info :parse-tree)) info body-first)))) - - -;;;; For Headlines -;; -;; `org-export-get-relative-level' is a shortcut to get headline -;; level, relatively to the lower headline level in the parsed tree. -;; -;; `org-export-get-headline-number' returns the section number of an -;; headline, while `org-export-number-to-roman' allows it to be -;; converted to roman numbers. With an optional argument, -;; `org-export-get-headline-number' returns a number to unnumbered -;; headlines (used for internal id). -;; -;; `org-export-low-level-p', `org-export-first-sibling-p' and -;; `org-export-last-sibling-p' are three useful predicates when it -;; comes to fulfill the `:headline-levels' property. -;; -;; `org-export-get-tags', `org-export-get-category' and -;; `org-export-get-node-property' extract useful information from an -;; headline or a parent headline. They all handle inheritance. -;; -;; `org-export-get-alt-title' tries to retrieve an alternative title, -;; as a secondary string, suitable for table of contents. It falls -;; back onto default title. - -(defun org-export-get-relative-level (headline info) - "Return HEADLINE relative level within current parsed tree. -INFO is a plist holding contextual information." - (+ (org-element-property :level headline) - (or (plist-get info :headline-offset) 0))) - -(defun org-export-low-level-p (headline info) - "Non-nil when HEADLINE is considered as low level. - -INFO is a plist used as a communication channel. - -A low level headlines has a relative level greater than -`:headline-levels' property value. - -Return value is the difference between HEADLINE relative level -and the last level being considered as high enough, or nil." - (let ((limit (plist-get info :headline-levels))) - (when (wholenump limit) - (let ((level (org-export-get-relative-level headline info))) - (and (> level limit) (- level limit)))))) - -(defun org-export-get-headline-number (headline info) - "Return numbered HEADLINE numbering as a list of numbers. -INFO is a plist holding contextual information." - (and (org-export-numbered-headline-p headline info) - (cdr (assq headline (plist-get info :headline-numbering))))) - -(defun org-export-numbered-headline-p (headline info) - "Return a non-nil value if HEADLINE element should be numbered. -INFO is a plist used as a communication channel." - (unless (org-not-nil (org-export-get-node-property :UNNUMBERED headline t)) - (let ((sec-num (plist-get info :section-numbers)) - (level (org-export-get-relative-level headline info))) - (if (wholenump sec-num) (<= level sec-num) sec-num)))) - -(defun org-export-number-to-roman (n) - "Convert integer N into a roman numeral." - (let ((roman '((1000 . "M") (900 . "CM") (500 . "D") (400 . "CD") - ( 100 . "C") ( 90 . "XC") ( 50 . "L") ( 40 . "XL") - ( 10 . "X") ( 9 . "IX") ( 5 . "V") ( 4 . "IV") - ( 1 . "I"))) - (res "")) - (if (<= n 0) - (number-to-string n) - (while roman - (if (>= n (caar roman)) - (setq n (- n (caar roman)) - res (concat res (cdar roman))) - (pop roman))) - res))) - -(defun org-export-get-tags (element info &optional tags inherited) - "Return list of tags associated to ELEMENT. - -ELEMENT has either an `headline' or an `inlinetask' type. INFO -is a plist used as a communication channel. - -When non-nil, optional argument TAGS should be a list of strings. -Any tag belonging to this list will also be removed. - -When optional argument INHERITED is non-nil, tags can also be -inherited from parent headlines and FILETAGS keywords." - (cl-remove-if - (lambda (tag) (member tag tags)) - (if (not inherited) (org-element-property :tags element) - ;; Build complete list of inherited tags. - (let ((current-tag-list (org-element-property :tags element))) - (dolist (parent (org-element-lineage element)) - (dolist (tag (org-element-property :tags parent)) - (when (and (memq (org-element-type parent) '(headline inlinetask)) - (not (member tag current-tag-list))) - (push tag current-tag-list)))) - ;; Add FILETAGS keywords and return results. - (org-uniquify (append (plist-get info :filetags) current-tag-list)))))) - -(defun org-export-get-node-property (property datum &optional inherited) - "Return node PROPERTY value for DATUM. - -PROPERTY is an upcase symbol (e.g., `:COOKIE_DATA'). DATUM is an -element or object. - -If optional argument INHERITED is non-nil, the value can be -inherited from a parent headline. - -Return value is a string or nil." - (let ((headline (if (eq (org-element-type datum) 'headline) datum - (org-export-get-parent-headline datum)))) - (if (not inherited) (org-element-property property datum) - (let ((parent headline)) - (catch 'found - (while parent - (when (plist-member (nth 1 parent) property) - (throw 'found (org-element-property property parent))) - (setq parent (org-element-property :parent parent)))))))) - -(defun org-export-get-category (blob info) - "Return category for element or object BLOB. - -INFO is a plist used as a communication channel. - -CATEGORY is automatically inherited from a parent headline, from -#+CATEGORY: keyword or created out of original file name. If all -fail, the fall-back value is \"???\"." - (or (org-export-get-node-property :CATEGORY blob t) - (org-element-map (plist-get info :parse-tree) 'keyword - (lambda (kwd) - (when (equal (org-element-property :key kwd) "CATEGORY") - (org-element-property :value kwd))) - info 'first-match) - (let ((file (plist-get info :input-file))) - (and file (file-name-sans-extension (file-name-nondirectory file)))) - "???")) - -(defun org-export-get-alt-title (headline _) - "Return alternative title for HEADLINE, as a secondary string. -If no optional title is defined, fall-back to the regular title." - (let ((alt (org-element-property :ALT_TITLE headline))) - (if alt (org-element-parse-secondary-string - alt (org-element-restriction 'headline) headline) - (org-element-property :title headline)))) - -(defun org-export-first-sibling-p (blob info) - "Non-nil when BLOB is the first sibling in its parent. -BLOB is an element or an object. If BLOB is a headline, non-nil -means it is the first sibling in the sub-tree. INFO is a plist -used as a communication channel." - (memq (org-element-type (org-export-get-previous-element blob info)) - '(nil section))) - -(defun org-export-last-sibling-p (datum info) - "Non-nil when DATUM is the last sibling in its parent. -DATUM is an element or an object. INFO is a plist used as -a communication channel." - (let ((next (org-export-get-next-element datum info))) - (or (not next) - (and (eq 'headline (org-element-type datum)) - (> (org-element-property :level datum) - (org-element-property :level next)))))) - - -;;;; For Keywords -;; -;; `org-export-get-date' returns a date appropriate for the document -;; to about to be exported. In particular, it takes care of -;; `org-export-date-timestamp-format'. - -(defun org-export-get-date (info &optional fmt) - "Return date value for the current document. - -INFO is a plist used as a communication channel. FMT, when -non-nil, is a time format string that will be applied on the date -if it consists in a single timestamp object. It defaults to -`org-export-date-timestamp-format' when nil. - -A proper date can be a secondary string, a string or nil. It is -meant to be translated with `org-export-data' or alike." - (let ((date (plist-get info :date)) - (fmt (or fmt org-export-date-timestamp-format))) - (cond ((not date) nil) - ((and fmt - (not (cdr date)) - (eq (org-element-type (car date)) 'timestamp)) - (org-timestamp-format (car date) fmt)) - (t date)))) - - -;;;; For Links -;; -;; `org-export-custom-protocol-maybe' handles custom protocol defined -;; in `org-link-parameters'. -;; -;; `org-export-get-coderef-format' returns an appropriate format -;; string for coderefs. -;; -;; `org-export-inline-image-p' returns a non-nil value when the link -;; provided should be considered as an inline image. -;; -;; `org-export-resolve-fuzzy-link' searches destination of fuzzy links -;; (i.e. links with "fuzzy" as type) within the parsed tree, and -;; returns an appropriate unique identifier. -;; -;; `org-export-resolve-id-link' returns the first headline with -;; specified id or custom-id in parse tree, the path to the external -;; file with the id. -;; -;; `org-export-resolve-link' searches for the destination of a link -;; within the parsed tree and returns the element. -;; -;; `org-export-resolve-coderef' associates a reference to a line -;; number in the element it belongs, or returns the reference itself -;; when the element isn't numbered. -;; -;; `org-export-file-uri' expands a filename as stored in :path value -;; of a "file" link into a file URI. -;; -;; Broken links raise a `org-link-broken' error, which is caught by -;; `org-export-data' for further processing, depending on -;; `org-export-with-broken-links' value. - -(org-define-error 'org-link-broken "Unable to resolve link; aborting") - -(defun org-export-custom-protocol-maybe (link desc backend) - "Try exporting LINK with a dedicated function. - -DESC is its description, as a string, or nil. BACKEND is the -back-end used for export, as a symbol. - -Return output as a string, or nil if no protocol handles LINK. - -A custom protocol has precedence over regular back-end export. -The function ignores links with an implicit type (e.g., -\"custom-id\")." - (let ((type (org-element-property :type link))) - (unless (or (member type '("coderef" "custom-id" "fuzzy" "radio")) - (not backend)) - (let ((protocol (org-link-get-parameter type :export))) - (and (functionp protocol) - (funcall protocol - (org-element-property :path link) - desc - backend)))))) - -(defun org-export-get-coderef-format (path desc) - "Return format string for code reference link. -PATH is the link path. DESC is its description." - (save-match-data - (cond ((not desc) "%s") - ((string-match (regexp-quote (concat "(" path ")")) desc) - (replace-match "%s" t t desc)) - (t desc)))) - -(defun org-export-inline-image-p (link &optional rules) - "Non-nil if LINK object points to an inline image. - -Optional argument is a set of RULES defining inline images. It -is an alist where associations have the following shape: - - (TYPE . REGEXP) - -Applying a rule means apply REGEXP against LINK's path when its -type is TYPE. The function will return a non-nil value if any of -the provided rules is non-nil. The default rule is -`org-export-default-inline-image-rule'. - -This only applies to links without a description." - (and (not (org-element-contents link)) - (let ((case-fold-search t)) - (cl-some (lambda (rule) - (and (string= (org-element-property :type link) (car rule)) - (string-match-p (cdr rule) - (org-element-property :path link)))) - (or rules org-export-default-inline-image-rule))))) - -(defun org-export-insert-image-links (data info &optional rules) - "Insert image links in DATA. - -Org syntax does not support nested links. Nevertheless, some -export back-ends support images as descriptions of links. Since -images are really links to image files, we need to make an -exception about links nesting. - -This function recognizes links whose contents are really images -and turn them into proper nested links. It is meant to be used -as a parse tree filter in back-ends supporting such constructs. - -DATA is a parse tree. INFO is the current state of the export -process, as a plist. - -A description is a valid images if it matches any rule in RULES, -if non-nil, or `org-export-default-inline-image-rule' otherwise. -See `org-export-inline-image-p' for more information about the -structure of RULES. - -Return modified DATA." - (let ((link-re (format "\\`\\(?:%s\\|%s\\)\\'" - org-link-plain-re - org-link-angle-re)) - (case-fold-search t)) - (org-element-map data 'link - (lambda (l) - (let ((contents (org-element-interpret-data (org-element-contents l)))) - (when (and (org-string-nw-p contents) - (string-match link-re contents)) - (let ((type (match-string 1 contents)) - (path (match-string 2 contents))) - (when (cl-some (lambda (rule) - (and (string= type (car rule)) - (string-match-p (cdr rule) path))) - (or rules org-export-default-inline-image-rule)) - ;; Replace contents with image link. - (org-element-adopt-elements - (org-element-set-contents l nil) - (with-temp-buffer - (save-excursion (insert contents)) - (org-element-link-parser)))))))) - info nil nil t)) - data) - -(defun org-export-resolve-coderef (ref info) - "Resolve a code reference REF. - -INFO is a plist used as a communication channel. - -Return associated line number in source code, or REF itself, -depending on src-block or example element's switches. Throw an -error if no block contains REF." - (or (org-element-map (plist-get info :parse-tree) '(example-block src-block) - (lambda (el) - (with-temp-buffer - (insert (org-trim (org-element-property :value el))) - (let* ((label-fmt (or (org-element-property :label-fmt el) - org-coderef-label-format)) - (ref-re (org-src-coderef-regexp label-fmt ref))) - ;; Element containing REF is found. Resolve it to - ;; either a label or a line number, as needed. - (when (re-search-backward ref-re nil t) - (if (org-element-property :use-labels el) ref - (+ (or (org-export-get-loc el info) 0) - (line-number-at-pos))))))) - info 'first-match) - (signal 'org-link-broken (list ref)))) - -(defun org-export-search-cells (datum) - "List search cells for element or object DATUM. - -A search cell follows the pattern (TYPE . SEARCH) where - - TYPE is a symbol among `headline', `custom-id', `target' and - `other'. - - SEARCH is the string a link is expected to match. More - accurately, it is - - - headline's title, as a list of strings, if TYPE is - `headline'. - - - CUSTOM_ID value, as a string, if TYPE is `custom-id'. - - - target's or radio-target's name as a list of strings if - TYPE is `target'. - - - NAME affiliated keyword if TYPE is `other'. - -A search cell is the internal representation of a fuzzy link. It -ignores white spaces and statistics cookies, if applicable." - (pcase (org-element-type datum) - (`headline - (let ((title (split-string - (replace-regexp-in-string - "\\[[0-9]*\\(?:%\\|/[0-9]*\\)\\]" "" - (org-element-property :raw-value datum))))) - (delq nil - (list - (cons 'headline title) - (cons 'other title) - (let ((custom-id (org-element-property :custom-id datum))) - (and custom-id (cons 'custom-id custom-id))))))) - (`target - (list (cons 'target (split-string (org-element-property :value datum))))) - ((and (let name (org-element-property :name datum)) - (guard name)) - (list (cons 'other (split-string name)))) - (_ nil))) - -(defun org-export-string-to-search-cell (s) - "Return search cells associated to string S. -S is either the path of a fuzzy link or a search option, i.e., it -tries to match either a headline (through custom ID or title), -a target or a named element." - (pcase (string-to-char s) - (?* (list (cons 'headline (split-string (substring s 1))))) - (?# (list (cons 'custom-id (substring s 1)))) - ((let search (split-string s)) - (list (cons 'target search) (cons 'other search))))) - -(defun org-export-match-search-cell-p (datum cells) - "Non-nil when DATUM matches search cells CELLS. -DATUM is an element or object. CELLS is a list of search cells, -as returned by `org-export-search-cells'." - (let ((targets (org-export-search-cells datum))) - (and targets (cl-some (lambda (cell) (member cell targets)) cells)))) - -(defun org-export-resolve-fuzzy-link (link info &rest pseudo-types) - "Return LINK destination. - -INFO is a plist holding contextual information. - -Return value can be an object or an element: - -- If LINK path matches a target object (i.e. <>) return it. - -- If LINK path exactly matches the name affiliated keyword - (i.e. #+NAME: path) of an element, return that element. - -- If LINK path exactly matches any headline name, return that - element. - -- Otherwise, throw an error. - -PSEUDO-TYPES are pseudo-elements types, i.e., elements defined -specifically in an export back-end, that could have a name -affiliated keyword. - -Assume LINK type is \"fuzzy\". White spaces are not -significant." - (let* ((search-cells (org-export-string-to-search-cell - (org-element-property :path link))) - (link-cache (or (plist-get info :resolve-fuzzy-link-cache) - (let ((table (make-hash-table :test #'eq))) - (plist-put info :resolve-fuzzy-link-cache table) - table))) - (cached (gethash search-cells link-cache 'not-found))) - (if (not (eq cached 'not-found)) cached - (let ((matches - (org-element-map (plist-get info :parse-tree) - (append pseudo-types '(target) org-element-all-elements) - (lambda (datum) - (and (org-export-match-search-cell-p datum search-cells) - datum))))) - (unless matches - (signal 'org-link-broken (list (org-element-property :path link)))) - (puthash - search-cells - ;; There can be multiple matches for un-typed searches, i.e., - ;; for searches not starting with # or *. In this case, - ;; prioritize targets and names over headline titles. - ;; Matching both a name and a target is not valid, and - ;; therefore undefined. - (or (cl-some (lambda (datum) - (and (not (eq (org-element-type datum) 'headline)) - datum)) - matches) - (car matches)) - link-cache))))) - -(defun org-export-resolve-id-link (link info) - "Return headline referenced as LINK destination. - -INFO is a plist used as a communication channel. - -Return value can be the headline element matched in current parse -tree or a file name. Assume LINK type is either \"id\" or -\"custom-id\". Throw an error if no match is found." - (let ((id (org-element-property :path link))) - ;; First check if id is within the current parse tree. - (or (org-element-map (plist-get info :parse-tree) 'headline - (lambda (headline) - (when (or (equal (org-element-property :ID headline) id) - (equal (org-element-property :CUSTOM_ID headline) id)) - headline)) - info 'first-match) - ;; Otherwise, look for external files. - (cdr (assoc id (plist-get info :id-alist))) - (signal 'org-link-broken (list id))))) - -(defun org-export-resolve-radio-link (link info) - "Return radio-target object referenced as LINK destination. - -INFO is a plist used as a communication channel. - -Return value can be a radio-target object or nil. Assume LINK -has type \"radio\"." - (let ((path (replace-regexp-in-string - "[ \r\t\n]+" " " (org-element-property :path link)))) - (org-element-map (plist-get info :parse-tree) 'radio-target - (lambda (radio) - (and (eq (compare-strings - (replace-regexp-in-string - "[ \r\t\n]+" " " (org-element-property :value radio)) - nil nil path nil nil t) - t) - radio)) - info 'first-match))) - -(defun org-export-resolve-link (link info) - "Return LINK destination. - -LINK is a string or a link object. - -INFO is a plist holding contextual information. - -Return value can be an object or an element: - -- If LINK path matches an ID or a custom ID, return the headline. - -- If LINK path matches a fuzzy link, return its destination. - -- Otherwise, throw an error." - ;; Convert string links to link objects. - (when (stringp link) - (setq link (with-temp-buffer - (save-excursion - (insert (org-link-make-string link))) - (org-element-link-parser)))) - (pcase (org-element-property :type link) - ((or "custom-id" "id") (org-export-resolve-id-link link info)) - ("fuzzy" (org-export-resolve-fuzzy-link link info)) - (_ (signal 'org-link-broken (list (org-element-property :path link)))))) - -(defun org-export-file-uri (filename) - "Return file URI associated to FILENAME." - (cond ((string-prefix-p "//" filename) (concat "file:" filename)) - ((not (file-name-absolute-p filename)) filename) - ((file-remote-p filename) (concat "file:/" filename)) - (t - (let ((fullname (expand-file-name filename))) - (concat (if (string-prefix-p "/" fullname) "file://" "file:///") - fullname))))) - -;;;; For References -;; -;; `org-export-get-reference' associate a unique reference for any -;; object or element. It uses `org-export-new-reference' and -;; `org-export-format-reference' to, respectively, generate new -;; internal references and turn them into a string suitable for -;; output. -;; -;; `org-export-get-ordinal' associates a sequence number to any object -;; or element. - -(defun org-export-new-reference (references) - "Return a unique reference, among REFERENCES. -REFERENCES is an alist whose values are in-use references, as -numbers. Returns a number, which is the internal representation -of a reference. See also `org-export-format-reference'." - ;; Generate random 7 digits hexadecimal numbers. Collisions - ;; increase exponentially with the numbers of references. However, - ;; the odds for encountering at least one collision with 1000 active - ;; references in the same document are roughly 0.2%, so this - ;; shouldn't be the bottleneck. - (let ((new (random #x10000000))) - (while (rassq new references) (setq new (random #x10000000))) - new)) - -(defun org-export-format-reference (reference) - "Format REFERENCE into a string. -REFERENCE is a number representing a reference, as returned by -`org-export-new-reference', which see." - (format "org%07x" reference)) - -(defun org-export-get-reference (datum info) - "Return a unique reference for DATUM, as a string. - -DATUM is either an element or an object. INFO is the current -export state, as a plist. - -References for the current document are stored in -`:internal-references' property. Its value is an alist with -associations of the following types: - - (REFERENCE . DATUM) and (SEARCH-CELL . ID) - -REFERENCE is the reference string to be used for object or -element DATUM. SEARCH-CELL is a search cell, as returned by -`org-export-search-cells'. ID is a number or a string uniquely -identifying DATUM within the document. - -This function also checks `:crossrefs' property for search cells -matching DATUM before creating a new reference." - (let ((cache (plist-get info :internal-references))) - (or (car (rassq datum cache)) - (let* ((crossrefs (plist-get info :crossrefs)) - (cells (org-export-search-cells datum)) - ;; Preserve any pre-existing association between - ;; a search cell and a reference, i.e., when some - ;; previously published document referenced a location - ;; within current file (see - ;; `org-publish-resolve-external-link'). - ;; - ;; However, there is no guarantee that search cells are - ;; unique, e.g., there might be duplicate custom ID or - ;; two headings with the same title in the file. - ;; - ;; As a consequence, before re-using any reference to - ;; an element or object, we check that it doesn't refer - ;; to a previous element or object. - (new (or (cl-some - (lambda (cell) - (let ((stored (cdr (assoc cell crossrefs)))) - (when stored - (let ((old (org-export-format-reference stored))) - (and (not (assoc old cache)) stored))))) - cells) - (org-export-new-reference cache))) - (reference-string (org-export-format-reference new))) - ;; Cache contains both data already associated to - ;; a reference and in-use internal references, so as to make - ;; unique references. - (dolist (cell cells) (push (cons cell new) cache)) - ;; Retain a direct association between reference string and - ;; DATUM since (1) not every object or element can be given - ;; a search cell (2) it permits quick lookup. - (push (cons reference-string datum) cache) - (plist-put info :internal-references cache) - reference-string)))) - -(defun org-export-get-ordinal (element info &optional types predicate) - "Return ordinal number of an element or object. - -ELEMENT is the element or object considered. INFO is the plist -used as a communication channel. - -Optional argument TYPES, when non-nil, is a list of element or -object types, as symbols, that should also be counted in. -Otherwise, only provided element's type is considered. - -Optional argument PREDICATE is a function returning a non-nil -value if the current element or object should be counted in. It -accepts two arguments: the element or object being considered and -the plist used as a communication channel. This allows counting -only a certain type of object (i.e. inline images). - -Return value is a list of numbers if ELEMENT is a headline or an -item. It is nil for keywords. It represents the footnote number -for footnote definitions and footnote references. If ELEMENT is -a target, return the same value as if ELEMENT was the closest -table, item or headline containing the target. In any other -case, return the sequence number of ELEMENT among elements or -objects of the same type." - ;; Ordinal of a target object refer to the ordinal of the closest - ;; table, item, or headline containing the object. - (when (eq (org-element-type element) 'target) - (setq element - (org-element-lineage - element - '(footnote-definition footnote-reference headline item table)))) - (cl-case (org-element-type element) - ;; Special case 1: A headline returns its number as a list. - (headline (org-export-get-headline-number element info)) - ;; Special case 2: An item returns its number as a list. - (item (let ((struct (org-element-property :structure element))) - (org-list-get-item-number - (org-element-property :begin element) - struct - (org-list-prevs-alist struct) - (org-list-parents-alist struct)))) - ((footnote-definition footnote-reference) - (org-export-get-footnote-number element info)) - (otherwise - (let ((counter 0)) - ;; Increment counter until ELEMENT is found again. - (org-element-map (plist-get info :parse-tree) - (or types (org-element-type element)) - (lambda (el) - (cond - ((eq element el) (1+ counter)) - ((not predicate) (cl-incf counter) nil) - ((funcall predicate el info) (cl-incf counter) nil))) - info 'first-match))))) - - -;;;; For Src-Blocks -;; -;; `org-export-get-loc' counts number of code lines accumulated in -;; src-block or example-block elements with a "+n" switch until -;; a given element, excluded. Note: "-n" switches reset that count. -;; -;; `org-export-unravel-code' extracts source code (along with a code -;; references alist) from an `element-block' or `src-block' type -;; element. -;; -;; `org-export-format-code' applies a formatting function to each line -;; of code, providing relative line number and code reference when -;; appropriate. Since it doesn't access the original element from -;; which the source code is coming, it expects from the code calling -;; it to know if lines should be numbered and if code references -;; should appear. -;; -;; Eventually, `org-export-format-code-default' is a higher-level -;; function (it makes use of the two previous functions) which handles -;; line numbering and code references inclusion, and returns source -;; code in a format suitable for plain text or verbatim output. - -(defun org-export-get-loc (element info) - "Return count of lines of code before ELEMENT. - -ELEMENT is an example-block or src-block element. INFO is the -plist used as a communication channel. - -Count includes every line of code in example-block or src-block -with a \"+n\" or \"-n\" switch before block. Return nil if -ELEMENT doesn't allow line numbering." - (pcase (org-element-property :number-lines element) - (`(new . ,n) n) - (`(continued . ,n) - (let ((loc 0)) - (org-element-map (plist-get info :parse-tree) '(src-block example-block) - (lambda (el) - ;; ELEMENT is reached: Quit loop and return locs. - (if (eq el element) (+ loc n) - ;; Only count lines from src-block and example-block - ;; elements with a "+n" or "-n" switch. - (let ((linum (org-element-property :number-lines el))) - (when linum - (let ((lines (org-count-lines - (org-element-property :value el)))) - ;; Accumulate locs or reset them. - (pcase linum - (`(new . ,n) (setq loc (+ n lines))) - (`(continued . ,n) (cl-incf loc (+ n lines))))))) - nil)) ;Return nil to stay in the loop. - info 'first-match))))) - -(defun org-export-unravel-code (element) - "Clean source code and extract references out of it. - -ELEMENT has either a `src-block' an `example-block' type. - -Return a cons cell whose CAR is the source code, cleaned from any -reference, protective commas and spurious indentation, and CDR is -an alist between relative line number (integer) and name of code -reference on that line (string)." - (let* ((line 0) refs - (value (org-element-property :value element)) - ;; Remove global indentation from code, if necessary. Also - ;; remove final newline character, since it doesn't belongs - ;; to the code proper. - (code (replace-regexp-in-string - "\n\\'" "" - (if (or org-src-preserve-indentation - (org-element-property :preserve-indent element)) - value - (org-remove-indentation value)))) - ;; Build a regexp matching a loc with a reference. - (ref-re (org-src-coderef-regexp (org-src-coderef-format element)))) - ;; Return value. - (cons - ;; Code with references removed. - (mapconcat - (lambda (loc) - (cl-incf line) - (if (not (string-match ref-re loc)) loc - ;; Ref line: remove ref, and add its position in REFS. - (push (cons line (match-string 3 loc)) refs) - (replace-match "" nil nil loc 1))) - (split-string code "\n") "\n") - ;; Reference alist. - refs))) - -(defun org-export-format-code (code fun &optional num-lines ref-alist) - "Format CODE by applying FUN line-wise and return it. - -CODE is a string representing the code to format. FUN is -a function. It must accept three arguments: a line of -code (string), the current line number (integer) or nil and the -reference associated to the current line (string) or nil. - -Optional argument NUM-LINES can be an integer representing the -number of code lines accumulated until the current code. Line -numbers passed to FUN will take it into account. If it is nil, -FUN's second argument will always be nil. This number can be -obtained with `org-export-get-loc' function. - -Optional argument REF-ALIST can be an alist between relative line -number (i.e. ignoring NUM-LINES) and the name of the code -reference on it. If it is nil, FUN's third argument will always -be nil. It can be obtained through the use of -`org-export-unravel-code' function." - (let ((--locs (split-string code "\n")) - (--line 0)) - (concat - (mapconcat - (lambda (--loc) - (cl-incf --line) - (let ((--ref (cdr (assq --line ref-alist)))) - (funcall fun --loc (and num-lines (+ num-lines --line)) --ref))) - --locs "\n") - "\n"))) - -(defun org-export-format-code-default (element info) - "Return source code from ELEMENT, formatted in a standard way. - -ELEMENT is either a `src-block' or `example-block' element. INFO -is a plist used as a communication channel. - -This function takes care of line numbering and code references -inclusion. Line numbers, when applicable, appear at the -beginning of the line, separated from the code by two white -spaces. Code references, on the other hand, appear flushed to -the right, separated by six white spaces from the widest line of -code." - ;; Extract code and references. - (let* ((code-info (org-export-unravel-code element)) - (code (car code-info)) - (code-lines (split-string code "\n"))) - (if (null code-lines) "" - (let* ((refs (and (org-element-property :retain-labels element) - (cdr code-info))) - ;; Handle line numbering. - (num-start (org-export-get-loc element info)) - (num-fmt - (and num-start - (format "%%%ds " - (length (number-to-string - (+ (length code-lines) num-start)))))) - ;; Prepare references display, if required. Any reference - ;; should start six columns after the widest line of code, - ;; wrapped with parenthesis. - (max-width - (+ (apply 'max (mapcar 'length code-lines)) - (if (not num-start) 0 (length (format num-fmt num-start)))))) - (org-export-format-code - code - (lambda (loc line-num ref) - (let ((number-str (and num-fmt (format num-fmt line-num)))) - (concat - number-str - loc - (and ref - (concat (make-string (- (+ 6 max-width) - (+ (length loc) (length number-str))) - ?\s) - (format "(%s)" ref)))))) - num-start refs))))) - - -;;;; For Tables -;; -;; `org-export-table-has-special-column-p' and -;; `org-export-table-row-is-special-p' are predicates used to look for -;; meta-information about the table structure. -;; -;; `org-table-has-header-p' tells when the rows before the first rule -;; should be considered as table's header. -;; -;; `org-export-table-cell-width', `org-export-table-cell-alignment' -;; and `org-export-table-cell-borders' extract information from -;; a table-cell element. -;; -;; `org-export-table-dimensions' gives the number on rows and columns -;; in the table, ignoring horizontal rules and special columns. -;; `org-export-table-cell-address', given a table-cell object, returns -;; the absolute address of a cell. On the other hand, -;; `org-export-get-table-cell-at' does the contrary. -;; -;; `org-export-table-cell-starts-colgroup-p', -;; `org-export-table-cell-ends-colgroup-p', -;; `org-export-table-row-starts-rowgroup-p', -;; `org-export-table-row-ends-rowgroup-p', -;; `org-export-table-row-starts-header-p', -;; `org-export-table-row-ends-header-p' and -;; `org-export-table-row-in-header-p' indicate position of current row -;; or cell within the table. - -(defun org-export-table-has-special-column-p (table) - "Non-nil when TABLE has a special column. -All special columns will be ignored during export." - ;; The table has a special column when every first cell of every row - ;; has an empty value or contains a symbol among "/", "#", "!", "$", - ;; "*" "_" and "^". Though, do not consider a first column - ;; containing only empty cells as special. - (let ((special-column? 'empty)) - (catch 'exit - (dolist (row (org-element-contents table)) - (when (eq (org-element-property :type row) 'standard) - (let ((value (org-element-contents - (car (org-element-contents row))))) - (cond ((member value - '(("/") ("#") ("!") ("$") ("*") ("_") ("^"))) - (setq special-column? 'special)) - ((null value)) - (t (throw 'exit nil)))))) - (eq special-column? 'special)))) - -(defun org-export-table-has-header-p (table info) - "Non-nil when TABLE has a header. - -INFO is a plist used as a communication channel. - -A table has a header when it contains at least two row groups." - (let* ((cache (or (plist-get info :table-header-cache) - (let ((table (make-hash-table :test #'eq))) - (plist-put info :table-header-cache table) - table))) - (cached (gethash table cache 'no-cache))) - (if (not (eq cached 'no-cache)) cached - (let ((rowgroup 1) row-flag) - (puthash table - (org-element-map table 'table-row - (lambda (row) - (cond - ((> rowgroup 1) t) - ((and row-flag - (eq (org-element-property :type row) 'rule)) - (cl-incf rowgroup) - (setq row-flag nil)) - ((and (not row-flag) - (eq (org-element-property :type row) 'standard)) - (setq row-flag t) - nil))) - info 'first-match) - cache))))) - -(defun org-export-table-row-is-special-p (table-row _) - "Non-nil if TABLE-ROW is considered special. -All special rows will be ignored during export." - (when (eq (org-element-property :type table-row) 'standard) - (let ((first-cell (org-element-contents - (car (org-element-contents table-row))))) - ;; A row is special either when... - (or - ;; ... it starts with a field only containing "/", - (equal first-cell '("/")) - ;; ... the table contains a special column and the row start - ;; with a marking character among, "^", "_", "$" or "!", - (and (org-export-table-has-special-column-p - (org-export-get-parent table-row)) - (member first-cell '(("^") ("_") ("$") ("!")))) - ;; ... it contains only alignment cookies and empty cells. - (let ((special-row-p 'empty)) - (catch 'exit - (dolist (cell (org-element-contents table-row)) - (let ((value (org-element-contents cell))) - ;; Since VALUE is a secondary string, the following - ;; checks avoid expanding it with `org-export-data'. - (cond ((not value)) - ((and (not (cdr value)) - (stringp (car value)) - (string-match "\\`<[lrc]?\\([0-9]+\\)?>\\'" - (car value))) - (setq special-row-p 'cookie)) - (t (throw 'exit nil))))) - (eq special-row-p 'cookie))))))) - -(defun org-export-table-row-group (table-row info) - "Return TABLE-ROW's group number, as an integer. - -INFO is a plist used as the communication channel. - -Return value is the group number, as an integer, or nil for -special rows and rows separators. First group is also table's -header." - (when (eq (org-element-property :type table-row) 'standard) - (let* ((cache (or (plist-get info :table-row-group-cache) - (let ((table (make-hash-table :test #'eq))) - (plist-put info :table-row-group-cache table) - table))) - (cached (gethash table-row cache 'no-cache))) - (if (not (eq cached 'no-cache)) cached - ;; First time a row is queried, populate cache with all the - ;; rows from the table. - (let ((group 0) row-flag) - (org-element-map (org-export-get-parent table-row) 'table-row - (lambda (row) - (if (eq (org-element-property :type row) 'rule) - (setq row-flag nil) - (unless row-flag (cl-incf group) (setq row-flag t)) - (puthash row group cache))) - info)) - (gethash table-row cache))))) - -(defun org-export-table-cell-width (table-cell info) - "Return TABLE-CELL contents width. - -INFO is a plist used as the communication channel. - -Return value is the width given by the last width cookie in the -same column as TABLE-CELL, or nil." - (let* ((row (org-export-get-parent table-cell)) - (table (org-export-get-parent row)) - (cells (org-element-contents row)) - (columns (length cells)) - (column (- columns (length (memq table-cell cells)))) - (cache (or (plist-get info :table-cell-width-cache) - (let ((table (make-hash-table :test #'eq))) - (plist-put info :table-cell-width-cache table) - table))) - (width-vector (or (gethash table cache) - (puthash table (make-vector columns 'empty) cache)))) - ;; Table rows may not have the same number of cells. Extend - ;; WIDTH-VECTOR appropriately if we encounter a row larger than - ;; expected. - (when (>= column (length width-vector)) - (setq width-vector - (vconcat width-vector - (make-list (- (1+ column) (length width-vector)) - 'empty))) - (puthash table width-vector cache)) - (pcase (aref width-vector column) - (`empty - (catch 'found - (dolist (row (org-element-contents table)) - (when (org-export-table-row-is-special-p row info) - ;; In a special row, try to find a width cookie at - ;; COLUMN. The following checks avoid expanding - ;; unnecessarily the cell with `org-export-data'. - (pcase (org-element-contents - (elt (org-element-contents row) column)) - (`(,(and (pred stringp) cookie)) - (when (string-match "\\`<[lrc]?\\([0-9]+\\)>\\'" cookie) - (let ((w (string-to-number (match-string 1 cookie)))) - (throw 'found (aset width-vector column w)))))))) - (aset width-vector column nil))) - (value value)))) - -(defun org-export-table-cell-alignment (table-cell info) - "Return TABLE-CELL contents alignment. - -INFO is a plist used as the communication channel. - -Return alignment as specified by the last alignment cookie in the -same column as TABLE-CELL. If no such cookie is found, a default -alignment value will be deduced from fraction of numbers in the -column (see `org-table-number-fraction' for more information). -Possible values are `left', `right' and `center'." - ;; Load `org-table-number-fraction' and `org-table-number-regexp'. - (require 'org-table) - (let* ((row (org-export-get-parent table-cell)) - (table (org-export-get-parent row)) - (cells (org-element-contents row)) - (columns (length cells)) - (column (- columns (length (memq table-cell cells)))) - (cache (or (plist-get info :table-cell-alignment-cache) - (let ((table (make-hash-table :test #'eq))) - (plist-put info :table-cell-alignment-cache table) - table))) - (align-vector (or (gethash table cache) - (puthash table (make-vector columns nil) cache)))) - ;; Table rows may not have the same number of cells. Extend - ;; ALIGN-VECTOR appropriately if we encounter a row larger than - ;; expected. - (when (>= column (length align-vector)) - (setq align-vector - (vconcat align-vector - (make-list (- (1+ column) (length align-vector)) - nil))) - (puthash table align-vector cache)) - (or (aref align-vector column) - (let ((number-cells 0) - (total-cells 0) - cookie-align - previous-cell-number-p) - (dolist (row (org-element-contents (org-export-get-parent row))) - (cond - ;; In a special row, try to find an alignment cookie at - ;; COLUMN. - ((org-export-table-row-is-special-p row info) - (let ((value (org-element-contents - (elt (org-element-contents row) column)))) - ;; Since VALUE is a secondary string, the following - ;; checks avoid useless expansion through - ;; `org-export-data'. - (when (and value - (not (cdr value)) - (stringp (car value)) - (string-match "\\`<\\([lrc]\\)?\\([0-9]+\\)?>\\'" - (car value)) - (match-string 1 (car value))) - (setq cookie-align (match-string 1 (car value)))))) - ;; Ignore table rules. - ((eq (org-element-property :type row) 'rule)) - ;; In a standard row, check if cell's contents are - ;; expressing some kind of number. Increase NUMBER-CELLS - ;; accordingly. Though, don't bother if an alignment - ;; cookie has already defined cell's alignment. - ((not cookie-align) - (let ((value (org-export-data - (org-element-contents - (elt (org-element-contents row) column)) - info))) - (cl-incf total-cells) - ;; Treat an empty cell as a number if it follows - ;; a number. - (if (not (or (string-match org-table-number-regexp value) - (and (string= value "") previous-cell-number-p))) - (setq previous-cell-number-p nil) - (setq previous-cell-number-p t) - (cl-incf number-cells)))))) - ;; Return value. Alignment specified by cookies has - ;; precedence over alignment deduced from cell's contents. - (aset align-vector - column - (cond ((equal cookie-align "l") 'left) - ((equal cookie-align "r") 'right) - ((equal cookie-align "c") 'center) - ((>= (/ (float number-cells) total-cells) - org-table-number-fraction) - 'right) - (t 'left))))))) - -(defun org-export-table-cell-borders (table-cell info) - "Return TABLE-CELL borders. - -INFO is a plist used as a communication channel. - -Return value is a list of symbols, or nil. Possible values are: -`top', `bottom', `above', `below', `left' and `right'. Note: -`top' (resp. `bottom') only happen for a cell in the first -row (resp. last row) of the table, ignoring table rules, if any. - -Returned borders ignore special rows." - (let* ((row (org-export-get-parent table-cell)) - (table (org-export-get-parent-table table-cell)) - borders) - ;; Top/above border? TABLE-CELL has a border above when a rule - ;; used to demarcate row groups can be found above. Hence, - ;; finding a rule isn't sufficient to push `above' in BORDERS: - ;; another regular row has to be found above that rule. - (let (rule-flag) - (catch 'exit - ;; Look at every row before the current one. - (dolist (row (cdr (memq row (reverse (org-element-contents table))))) - (cond ((eq (org-element-property :type row) 'rule) - (setq rule-flag t)) - ((not (org-export-table-row-is-special-p row info)) - (if rule-flag (throw 'exit (push 'above borders)) - (throw 'exit nil))))) - ;; No rule above, or rule found starts the table (ignoring any - ;; special row): TABLE-CELL is at the top of the table. - (when rule-flag (push 'above borders)) - (push 'top borders))) - ;; Bottom/below border? TABLE-CELL has a border below when next - ;; non-regular row below is a rule. - (let (rule-flag) - (catch 'exit - ;; Look at every row after the current one. - (dolist (row (cdr (memq row (org-element-contents table)))) - (cond ((eq (org-element-property :type row) 'rule) - (setq rule-flag t)) - ((not (org-export-table-row-is-special-p row info)) - (if rule-flag (throw 'exit (push 'below borders)) - (throw 'exit nil))))) - ;; No rule below, or rule found ends the table (modulo some - ;; special row): TABLE-CELL is at the bottom of the table. - (when rule-flag (push 'below borders)) - (push 'bottom borders))) - ;; Right/left borders? They can only be specified by column - ;; groups. Column groups are defined in a row starting with "/". - ;; Also a column groups row only contains "<", "<>", ">" or blank - ;; cells. - (catch 'exit - (let ((column (let ((cells (org-element-contents row))) - (- (length cells) (length (memq table-cell cells)))))) - ;; Table rows are read in reverse order so last column groups - ;; row has precedence over any previous one. - (dolist (row (reverse (org-element-contents table))) - (unless (eq (org-element-property :type row) 'rule) - (when (equal (org-element-contents - (car (org-element-contents row))) - '("/")) - (let ((column-groups - (mapcar - (lambda (cell) - (let ((value (org-element-contents cell))) - (when (member value '(("<") ("<>") (">") nil)) - (car value)))) - (org-element-contents row)))) - ;; There's a left border when previous cell, if - ;; any, ends a group, or current one starts one. - (when (or (and (not (zerop column)) - (member (elt column-groups (1- column)) - '(">" "<>"))) - (member (elt column-groups column) '("<" "<>"))) - (push 'left borders)) - ;; There's a right border when next cell, if any, - ;; starts a group, or current one ends one. - (when (or (and (/= (1+ column) (length column-groups)) - (member (elt column-groups (1+ column)) - '("<" "<>"))) - (member (elt column-groups column) '(">" "<>"))) - (push 'right borders)) - (throw 'exit nil))))))) - ;; Return value. - borders)) - -(defun org-export-table-cell-starts-colgroup-p (table-cell info) - "Non-nil when TABLE-CELL is at the beginning of a column group. -INFO is a plist used as a communication channel." - ;; A cell starts a column group either when it is at the beginning - ;; of a row (or after the special column, if any) or when it has - ;; a left border. - (or (eq (org-element-map (org-export-get-parent table-cell) 'table-cell - 'identity info 'first-match) - table-cell) - (memq 'left (org-export-table-cell-borders table-cell info)))) - -(defun org-export-table-cell-ends-colgroup-p (table-cell info) - "Non-nil when TABLE-CELL is at the end of a column group. -INFO is a plist used as a communication channel." - ;; A cell ends a column group either when it is at the end of a row - ;; or when it has a right border. - (or (eq (car (last (org-element-contents - (org-export-get-parent table-cell)))) - table-cell) - (memq 'right (org-export-table-cell-borders table-cell info)))) - -(defun org-export-table-row-starts-rowgroup-p (table-row info) - "Non-nil when TABLE-ROW is at the beginning of a row group. -INFO is a plist used as a communication channel." - (unless (or (eq (org-element-property :type table-row) 'rule) - (org-export-table-row-is-special-p table-row info)) - (let ((borders (org-export-table-cell-borders - (car (org-element-contents table-row)) info))) - (or (memq 'top borders) (memq 'above borders))))) - -(defun org-export-table-row-ends-rowgroup-p (table-row info) - "Non-nil when TABLE-ROW is at the end of a row group. -INFO is a plist used as a communication channel." - (unless (or (eq (org-element-property :type table-row) 'rule) - (org-export-table-row-is-special-p table-row info)) - (let ((borders (org-export-table-cell-borders - (car (org-element-contents table-row)) info))) - (or (memq 'bottom borders) (memq 'below borders))))) - -(defun org-export-table-row-in-header-p (table-row info) - "Non-nil when TABLE-ROW is located within table's header. -INFO is a plist used as a communication channel. Always return -nil for special rows and rows separators." - (and (org-export-table-has-header-p - (org-export-get-parent-table table-row) info) - (eql (org-export-table-row-group table-row info) 1))) - -(defun org-export-table-row-starts-header-p (table-row info) - "Non-nil when TABLE-ROW is the first table header's row. -INFO is a plist used as a communication channel." - (and (org-export-table-row-in-header-p table-row info) - (org-export-table-row-starts-rowgroup-p table-row info))) - -(defun org-export-table-row-ends-header-p (table-row info) - "Non-nil when TABLE-ROW is the last table header's row. -INFO is a plist used as a communication channel." - (and (org-export-table-row-in-header-p table-row info) - (org-export-table-row-ends-rowgroup-p table-row info))) - -(defun org-export-table-row-number (table-row info) - "Return TABLE-ROW number. -INFO is a plist used as a communication channel. Return value is -zero-indexed and ignores separators. The function returns nil -for special rows and separators." - (when (eq (org-element-property :type table-row) 'standard) - (let* ((cache (or (plist-get info :table-row-number-cache) - (let ((table (make-hash-table :test #'eq))) - (plist-put info :table-row-number-cache table) - table))) - (cached (gethash table-row cache 'no-cache))) - (if (not (eq cached 'no-cache)) cached - ;; First time a row is queried, populate cache with all the - ;; rows from the table. - (let ((number -1)) - (org-element-map (org-export-get-parent-table table-row) 'table-row - (lambda (row) - (when (eq (org-element-property :type row) 'standard) - (puthash row (cl-incf number) cache))) - info)) - (gethash table-row cache))))) - -(defun org-export-table-dimensions (table info) - "Return TABLE dimensions. - -INFO is a plist used as a communication channel. - -Return value is a CONS like (ROWS . COLUMNS) where -ROWS (resp. COLUMNS) is the number of exportable -rows (resp. columns)." - (let (first-row (columns 0) (rows 0)) - ;; Set number of rows, and extract first one. - (org-element-map table 'table-row - (lambda (row) - (when (eq (org-element-property :type row) 'standard) - (cl-incf rows) - (unless first-row (setq first-row row)))) info) - ;; Set number of columns. - (org-element-map first-row 'table-cell (lambda (_) (cl-incf columns)) info) - ;; Return value. - (cons rows columns))) - -(defun org-export-table-cell-address (table-cell info) - "Return address of a regular TABLE-CELL object. - -TABLE-CELL is the cell considered. INFO is a plist used as -a communication channel. - -Address is a CONS cell (ROW . COLUMN), where ROW and COLUMN are -zero-based index. Only exportable cells are considered. The -function returns nil for other cells." - (let* ((table-row (org-export-get-parent table-cell)) - (row-number (org-export-table-row-number table-row info))) - (when row-number - (cons row-number - (let ((col-count 0)) - (org-element-map table-row 'table-cell - (lambda (cell) - (if (eq cell table-cell) col-count (cl-incf col-count) nil)) - info 'first-match)))))) - -(defun org-export-get-table-cell-at (address table info) - "Return regular table-cell object at ADDRESS in TABLE. - -Address is a CONS cell (ROW . COLUMN), where ROW and COLUMN are -zero-based index. TABLE is a table type element. INFO is -a plist used as a communication channel. - -If no table-cell, among exportable cells, is found at ADDRESS, -return nil." - (let ((column-pos (cdr address)) (column-count 0)) - (org-element-map - ;; Row at (car address) or nil. - (let ((row-pos (car address)) (row-count 0)) - (org-element-map table 'table-row - (lambda (row) - (cond ((eq (org-element-property :type row) 'rule) nil) - ((= row-count row-pos) row) - (t (cl-incf row-count) nil))) - info 'first-match)) - 'table-cell - (lambda (cell) - (if (= column-count column-pos) cell - (cl-incf column-count) nil)) - info 'first-match))) - - -;;;; For Tables of Contents -;; -;; `org-export-collect-headlines' builds a list of all exportable -;; headline elements, maybe limited to a certain depth. One can then -;; easily parse it and transcode it. -;; -;; Building lists of tables, figures or listings is quite similar. -;; Once the generic function `org-export-collect-elements' is defined, -;; `org-export-collect-tables', `org-export-collect-figures' and -;; `org-export-collect-listings' can be derived from it. -;; -;; `org-export-toc-entry-backend' builds a special anonymous back-end -;; useful to export table of contents' entries. - -(defun org-export-collect-headlines (info &optional n scope) - "Collect headlines in order to build a table of contents. - -INFO is a plist used as a communication channel. - -When optional argument N is an integer, it specifies the depth of -the table of contents. Otherwise, it is set to the value of the -last headline level. See `org-export-headline-levels' for more -information. - -Optional argument SCOPE, when non-nil, is an element. If it is -a headline, only children of SCOPE are collected. Otherwise, -collect children of the headline containing provided element. If -there is no such headline, collect all headlines. In any case, -argument N becomes relative to the level of that headline. - -Return a list of all exportable headlines as parsed elements. -Footnote sections are ignored." - (let* ((scope (cond ((not scope) (plist-get info :parse-tree)) - ((eq (org-element-type scope) 'headline) scope) - ((org-export-get-parent-headline scope)) - (t (plist-get info :parse-tree)))) - (limit (plist-get info :headline-levels)) - (n (if (not (wholenump n)) limit - (min (if (eq (org-element-type scope) 'org-data) n - (+ (org-export-get-relative-level scope info) n)) - limit)))) - (org-element-map (org-element-contents scope) 'headline - (lambda (h) - (and (not (org-element-property :footnote-section-p h)) - (not (equal "notoc" - (org-export-get-node-property :UNNUMBERED h t))) - (>= n (org-export-get-relative-level h info)) - h)) - info))) - -(defun org-export-collect-elements (type info &optional predicate) - "Collect referenceable elements of a determined type. - -TYPE can be a symbol or a list of symbols specifying element -types to search. Only elements with a caption are collected. - -INFO is a plist used as a communication channel. - -When non-nil, optional argument PREDICATE is a function accepting -one argument, an element of type TYPE. It returns a non-nil -value when that element should be collected. - -Return a list of all elements found, in order of appearance." - (org-element-map (plist-get info :parse-tree) type - (lambda (element) - (and (org-element-property :caption element) - (or (not predicate) (funcall predicate element)) - element)) - info)) - -(defun org-export-collect-tables (info) - "Build a list of tables. -INFO is a plist used as a communication channel. - -Return a list of table elements with a caption." - (org-export-collect-elements 'table info)) - -(defun org-export-collect-figures (info predicate) - "Build a list of figures. - -INFO is a plist used as a communication channel. PREDICATE is -a function which accepts one argument: a paragraph element and -whose return value is non-nil when that element should be -collected. - -A figure is a paragraph type element, with a caption, verifying -PREDICATE. The latter has to be provided since a \"figure\" is -a vague concept that may depend on back-end. - -Return a list of elements recognized as figures." - (org-export-collect-elements 'paragraph info predicate)) - -(defun org-export-collect-listings (info) - "Build a list of source blocks. - -INFO is a plist used as a communication channel. - -Return a list of `src-block' elements with a caption." - (org-export-collect-elements 'src-block info)) - -(defun org-export-excluded-from-toc-p (headline info) - "Non-nil if HEADLINE should be excluded from tables of contents. - -INFO is a plist used as a communication channel. - -Note that such headlines are already excluded from -`org-export-collect-headlines'. Therefore, this function is not -necessary if you only need to list headlines in the table of -contents. However, it is useful if some additional processing is -required on headlines excluded from table of contents." - (or (org-element-property :footnote-section-p headline) - (org-export-low-level-p headline info) - (equal "notoc" (org-export-get-node-property :UNNUMBERED headline t)))) - -(defun org-export-toc-entry-backend (parent &rest transcoders) - "Return an export back-end appropriate for table of contents entries. - -PARENT is an export back-end the returned back-end should inherit -from. - -By default, the back-end removes footnote references and targets. -It also changes links and radio targets into regular text. -TRANSCODERS optional argument, when non-nil, specifies additional -transcoders. A transcoder follows the pattern (TYPE . FUNCTION) -where type is an element or object type and FUNCTION the function -transcoding it." - (declare (indent 1)) - (org-export-create-backend - :parent parent - :transcoders - (append transcoders - `((footnote-reference . ,#'ignore) - (link . ,(lambda (l c i) - (or c - (org-export-data - (org-element-property :raw-link l) - i)))) - (radio-target . ,(lambda (_r c _) c)) - (target . ,#'ignore))))) - - -;;;; Smart Quotes -;; -;; The main function for the smart quotes sub-system is -;; `org-export-activate-smart-quotes', which replaces every quote in -;; a given string from the parse tree with its "smart" counterpart. -;; -;; Dictionary for smart quotes is stored in -;; `org-export-smart-quotes-alist'. - -(defconst org-export-smart-quotes-alist - '(("ar" - (primary-opening - :utf-8 "«" :html "«" :latex "\\guillemotleft{}" - :texinfo "@guillemetleft{}") - (primary-closing - :utf-8 "»" :html "»" :latex "\\guillemotright{}" - :texinfo "@guillemetright{}") - (secondary-opening :utf-8 "‹" :html "‹" :latex "\\guilsinglleft{}" - :texinfo "@guilsinglleft{}") - (secondary-closing :utf-8 "›" :html "›" :latex "\\guilsinglright{}" - :texinfo "@guilsinglright{}") - (apostrophe :utf-8 "’" :html "’")) - ("da" - ;; one may use: »...«, "...", ›...‹, or '...'. - ;; http://sproget.dk/raad-og-regler/retskrivningsregler/retskrivningsregler/a7-40-60/a7-58-anforselstegn/ - ;; LaTeX quotes require Babel! - (primary-opening - :utf-8 "»" :html "»" :latex ">>" :texinfo "@guillemetright{}") - (primary-closing - :utf-8 "«" :html "«" :latex "<<" :texinfo "@guillemetleft{}") - (secondary-opening - :utf-8 "›" :html "›" :latex "\\frq{}" :texinfo "@guilsinglright{}") - (secondary-closing - :utf-8 "‹" :html "‹" :latex "\\flq{}" :texinfo "@guilsingleft{}") - (apostrophe :utf-8 "’" :html "’")) - ("de" - (primary-opening - :utf-8 "„" :html "„" :latex "\"`" :texinfo "@quotedblbase{}") - (primary-closing - :utf-8 "“" :html "“" :latex "\"'" :texinfo "@quotedblleft{}") - (secondary-opening - :utf-8 "‚" :html "‚" :latex "\\glq{}" :texinfo "@quotesinglbase{}") - (secondary-closing - :utf-8 "‘" :html "‘" :latex "\\grq{}" :texinfo "@quoteleft{}") - (apostrophe :utf-8 "’" :html "’")) - ("en" - (primary-opening :utf-8 "“" :html "“" :latex "``" :texinfo "``") - (primary-closing :utf-8 "â€" :html "”" :latex "''" :texinfo "''") - (secondary-opening :utf-8 "‘" :html "‘" :latex "`" :texinfo "`") - (secondary-closing :utf-8 "’" :html "’" :latex "'" :texinfo "'") - (apostrophe :utf-8 "’" :html "’")) - ("es" - (primary-opening - :utf-8 "«" :html "«" :latex "\\guillemotleft{}" - :texinfo "@guillemetleft{}") - (primary-closing - :utf-8 "»" :html "»" :latex "\\guillemotright{}" - :texinfo "@guillemetright{}") - (secondary-opening :utf-8 "“" :html "“" :latex "``" :texinfo "``") - (secondary-closing :utf-8 "â€" :html "”" :latex "''" :texinfo "''") - (apostrophe :utf-8 "’" :html "’")) - ("fr" - (primary-opening - :utf-8 "« " :html "« " :latex "\\og " - :texinfo "@guillemetleft{}@tie{}") - (primary-closing - :utf-8 " »" :html " »" :latex "\\fg{}" - :texinfo "@tie{}@guillemetright{}") - (secondary-opening - :utf-8 "« " :html "« " :latex "\\og " - :texinfo "@guillemetleft{}@tie{}") - (secondary-closing :utf-8 " »" :html " »" :latex "\\fg{}" - :texinfo "@tie{}@guillemetright{}") - (apostrophe :utf-8 "’" :html "’")) - ("is" - (primary-opening - :utf-8 "„" :html "„" :latex "\"`" :texinfo "@quotedblbase{}") - (primary-closing - :utf-8 "“" :html "“" :latex "\"'" :texinfo "@quotedblleft{}") - (secondary-opening - :utf-8 "‚" :html "‚" :latex "\\glq{}" :texinfo "@quotesinglbase{}") - (secondary-closing - :utf-8 "‘" :html "‘" :latex "\\grq{}" :texinfo "@quoteleft{}") - (apostrophe :utf-8 "’" :html "’")) - ("no" - ;; https://nn.wikipedia.org/wiki/Sitatteikn - (primary-opening - :utf-8 "«" :html "«" :latex "\\guillemotleft{}" - :texinfo "@guillemetleft{}") - (primary-closing - :utf-8 "»" :html "»" :latex "\\guillemotright{}" - :texinfo "@guillemetright{}") - (secondary-opening :utf-8 "‘" :html "‘" :latex "`" :texinfo "`") - (secondary-closing :utf-8 "’" :html "’" :latex "'" :texinfo "'") - (apostrophe :utf-8 "’" :html "’")) - ("nb" - ;; https://nn.wikipedia.org/wiki/Sitatteikn - (primary-opening - :utf-8 "«" :html "«" :latex "\\guillemotleft{}" - :texinfo "@guillemetleft{}") - (primary-closing - :utf-8 "»" :html "»" :latex "\\guillemotright{}" - :texinfo "@guillemetright{}") - (secondary-opening :utf-8 "‘" :html "‘" :latex "`" :texinfo "`") - (secondary-closing :utf-8 "’" :html "’" :latex "'" :texinfo "'") - (apostrophe :utf-8 "’" :html "’")) - ("nn" - ;; https://nn.wikipedia.org/wiki/Sitatteikn - (primary-opening - :utf-8 "«" :html "«" :latex "\\guillemotleft{}" - :texinfo "@guillemetleft{}") - (primary-closing - :utf-8 "»" :html "»" :latex "\\guillemotright{}" - :texinfo "@guillemetright{}") - (secondary-opening :utf-8 "‘" :html "‘" :latex "`" :texinfo "`") - (secondary-closing :utf-8 "’" :html "’" :latex "'" :texinfo "'") - (apostrophe :utf-8 "’" :html "’")) - ("ru" - ;; http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%B2%D1%8B%D1%87%D0%BA%D0%B8#.D0.9A.D0.B0.D0.B2.D1.8B.D1.87.D0.BA.D0.B8.2C_.D0.B8.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D0.B5.D0.BC.D1.8B.D0.B5_.D0.B2_.D1.80.D1.83.D1.81.D1.81.D0.BA.D0.BE.D0.BC_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B5 - ;; http://www.artlebedev.ru/kovodstvo/sections/104/ - (primary-opening :utf-8 "«" :html "«" :latex "{}<<" - :texinfo "@guillemetleft{}") - (primary-closing :utf-8 "»" :html "»" :latex ">>{}" - :texinfo "@guillemetright{}") - (secondary-opening - :utf-8 "„" :html "„" :latex "\\glqq{}" :texinfo "@quotedblbase{}") - (secondary-closing - :utf-8 "“" :html "“" :latex "\\grqq{}" :texinfo "@quotedblleft{}") - (apostrophe :utf-8 "’" :html: "'")) - ("sl" - ;; Based on https://sl.wikipedia.org/wiki/Narekovaj - (primary-opening :utf-8 "«" :html "«" :latex "{}<<" - :texinfo "@guillemetleft{}") - (primary-closing :utf-8 "»" :html "»" :latex ">>{}" - :texinfo "@guillemetright{}") - (secondary-opening - :utf-8 "„" :html "„" :latex "\\glqq{}" :texinfo "@quotedblbase{}") - (secondary-closing - :utf-8 "“" :html "“" :latex "\\grqq{}" :texinfo "@quotedblleft{}") - (apostrophe :utf-8 "’" :html "’")) - ("sv" - ;; Based on https://sv.wikipedia.org/wiki/Citattecken - (primary-opening :utf-8 "â€" :html "”" :latex "’’" :texinfo "’’") - (primary-closing :utf-8 "â€" :html "”" :latex "’’" :texinfo "’’") - (secondary-opening :utf-8 "’" :html "’" :latex "’" :texinfo "`") - (secondary-closing :utf-8 "’" :html "’" :latex "’" :texinfo "'") - (apostrophe :utf-8 "’" :html "’"))) - "Smart quotes translations. - -Alist whose CAR is a language string and CDR is an alist with -quote type as key and a plist associating various encodings to -their translation as value. - -A quote type can be any symbol among `primary-opening', -`primary-closing', `secondary-opening', `secondary-closing' and -`apostrophe'. - -Valid encodings include `:utf-8', `:html', `:latex' and -`:texinfo'. - -If no translation is found, the quote character is left as-is.") - -(defun org-export--smart-quote-status (s info) - "Return smart quote status at the beginning of string S. -INFO is the current export state, as a plist." - (let* ((parent (org-element-property :parent s)) - (cache (or (plist-get info :smart-quote-cache) - (let ((table (make-hash-table :test #'eq))) - (plist-put info :smart-quote-cache table) - table))) - (value (gethash parent cache 'missing-data))) - (if (not (eq value 'missing-data)) (cdr (assq s value)) - (let (level1-open full-status) - (org-element-map - (let ((secondary (org-element-secondary-p s))) - (if secondary (org-element-property secondary parent) - (org-element-contents parent))) - 'plain-text - (lambda (text) - (let ((start 0) current-status) - (while (setq start (string-match "['\"]" text start)) - (push - (cond - ((equal (match-string 0 text) "\"") - (setf level1-open (not level1-open)) - (if level1-open 'primary-opening 'primary-closing)) - ;; Not already in a level 1 quote: this is an - ;; apostrophe. - ((not level1-open) 'apostrophe) - ;; Extract previous char and next char. As - ;; a special case, they can also be set to `blank', - ;; `no-blank' or nil. Then determine if current - ;; match is allowed as an opening quote or a closing - ;; quote. - (t - (let* ((previous - (if (> start 0) (substring text (1- start) start) - (let ((p (org-export-get-previous-element - text info))) - (cond ((not p) nil) - ((stringp p) (substring p -1)) - ((memq (org-element-property :post-blank p) - '(0 nil)) - 'no-blank) - (t 'blank))))) - (next - (if (< (1+ start) (length text)) - (substring text (1+ start) (+ start 2)) - (let ((n (org-export-get-next-element text info))) - (cond ((not n) nil) - ((stringp n) (substring n 0 1)) - (t 'no-blank))))) - (allow-open - (and (if (stringp previous) - (string-match "\\s\"\\|\\s-\\|\\s(" - previous) - (memq previous '(blank nil))) - (if (stringp next) - (string-match "\\w\\|\\s.\\|\\s_" next) - (eq next 'no-blank)))) - (allow-close - (and (if (stringp previous) - (string-match "\\w\\|\\s.\\|\\s_" previous) - (eq previous 'no-blank)) - (if (stringp next) - (string-match "\\s-\\|\\s)\\|\\s.\\|\\s\"" - next) - (memq next '(blank nil)))))) - (cond - ((and allow-open allow-close) (error "Should not happen")) - (allow-open 'secondary-opening) - (allow-close 'secondary-closing) - (t 'apostrophe))))) - current-status) - (cl-incf start)) - (when current-status - (push (cons text (nreverse current-status)) full-status)))) - info nil org-element-recursive-objects) - (puthash parent full-status cache) - (cdr (assq s full-status)))))) - -(defun org-export-activate-smart-quotes (s encoding info &optional original) - "Replace regular quotes with \"smart\" quotes in string S. - -ENCODING is a symbol among `:html', `:latex', `:texinfo' and -`:utf-8'. INFO is a plist used as a communication channel. - -The function has to retrieve information about string -surroundings in parse tree. It can only happen with an -unmodified string. Thus, if S has already been through another -process, a non-nil ORIGINAL optional argument will provide that -original string. - -Return the new string." - (let ((quote-status - (copy-sequence (org-export--smart-quote-status (or original s) info)))) - (replace-regexp-in-string - "['\"]" - (lambda (match) - (or (plist-get - (cdr (assq (pop quote-status) - (cdr (assoc (plist-get info :language) - org-export-smart-quotes-alist)))) - encoding) - match)) - s nil t))) - -;;;; Topology -;; -;; Here are various functions to retrieve information about the -;; neighborhood of a given element or object. Neighbors of interest -;; are direct parent (`org-export-get-parent'), parent headline -;; (`org-export-get-parent-headline'), first element containing an -;; object, (`org-export-get-parent-element'), parent table -;; (`org-export-get-parent-table'), previous element or object -;; (`org-export-get-previous-element') and next element or object -;; (`org-export-get-next-element'). - -;; defsubst org-export-get-parent must be defined before first use - -(defun org-export-get-parent-headline (blob) - "Return BLOB parent headline or nil. -BLOB is the element or object being considered." - (org-element-lineage blob '(headline))) - -(defun org-export-get-parent-element (object) - "Return first element containing OBJECT or nil. -OBJECT is the object to consider." - (org-element-lineage object org-element-all-elements)) - -(defun org-export-get-parent-table (object) - "Return OBJECT parent table or nil. -OBJECT is either a `table-cell' or `table-element' type object." - (org-element-lineage object '(table))) - -(defun org-export-get-previous-element (blob info &optional n) - "Return previous element or object. - -BLOB is an element or object. INFO is a plist used as -a communication channel. Return previous exportable element or -object, a string, or nil. - -When optional argument N is a positive integer, return a list -containing up to N siblings before BLOB, from farthest to -closest. With any other non-nil value, return a list containing -all of them." - (let* ((secondary (org-element-secondary-p blob)) - (parent (org-export-get-parent blob)) - (siblings - (if secondary (org-element-property secondary parent) - (org-element-contents parent))) - prev) - (catch 'exit - (dolist (obj (cdr (memq blob (reverse siblings))) prev) - (cond ((memq obj (plist-get info :ignore-list))) - ((null n) (throw 'exit obj)) - ((not (wholenump n)) (push obj prev)) - ((zerop n) (throw 'exit prev)) - (t (cl-decf n) (push obj prev))))))) - -(defun org-export-get-next-element (blob info &optional n) - "Return next element or object. - -BLOB is an element or object. INFO is a plist used as -a communication channel. Return next exportable element or -object, a string, or nil. - -When optional argument N is a positive integer, return a list -containing up to N siblings after BLOB, from closest to farthest. -With any other non-nil value, return a list containing all of -them." - (let* ((secondary (org-element-secondary-p blob)) - (parent (org-export-get-parent blob)) - (siblings - (cdr (memq blob - (if secondary (org-element-property secondary parent) - (org-element-contents parent))))) - next) - (catch 'exit - (dolist (obj siblings (nreverse next)) - (cond ((memq obj (plist-get info :ignore-list))) - ((null n) (throw 'exit obj)) - ((not (wholenump n)) (push obj next)) - ((zerop n) (throw 'exit (nreverse next))) - (t (cl-decf n) (push obj next))))))) - - -;;;; Translation -;; -;; `org-export-translate' translates a string according to the language -;; specified by the LANGUAGE keyword. `org-export-dictionary' contains -;; the dictionary used for the translation. - -(defconst org-export-dictionary - '(("%e %n: %c" - ("fr" :default "%e %n : %c" :html "%e %n : %c")) - ("Author" - ("ar" :default "تأليÙ") - ("ca" :default "Autor") - ("cs" :default "Autor") - ("da" :default "Forfatter") - ("de" :default "Autor") - ("eo" :html "Aŭtoro") - ("es" :default "Autor") - ("et" :default "Autor") - ("fi" :html "Tekijä") - ("fr" :default "Auteur") - ("hu" :default "Szerzõ") - ("is" :html "Höfundur") - ("it" :default "Autore") - ("ja" :default "著者" :html "著者") - ("nl" :default "Auteur") - ("no" :default "Forfatter") - ("nb" :default "Forfatter") - ("nn" :default "Forfattar") - ("pl" :default "Autor") - ("pt_BR" :default "Autor") - ("ru" :html "Автор" :utf-8 "Ðвтор") - ("sl" :default "Avtor") - ("sv" :html "Författare") - ("uk" :html "Автор" :utf-8 "Ðвтор") - ("zh-CN" :html "作者" :utf-8 "作者") - ("zh-TW" :html "作者" :utf-8 "作者")) - ("Continued from previous page" - ("ar" :default "تتمة الصÙحة السابقة") - ("cs" :default "PokraÄování z pÅ™edchozí strany") - ("de" :default "Fortsetzung von vorheriger Seite") - ("es" :html "Continúa de la página anterior" :ascii "Continua de la pagina anterior" :default "Continúa de la página anterior") - ("fr" :default "Suite de la page précédente") - ("it" :default "Continua da pagina precedente") - ("ja" :default "å‰ãƒšãƒ¼ã‚¸ã‹ã‚‰ã®ç¶šã") - ("nl" :default "Vervolg van vorige pagina") - ("pt" :default "Continuação da página anterior") - ("pt_BR" :html "Continuação da página anterior" :ascii "Continuacao da pagina anterior" :default "Continuação da página anterior") - ("ru" :html "(Продолжение)" - :utf-8 "(Продолжение)") - ("sl" :default "Nadaljevanje s prejÅ¡nje strani")) - ("Continued on next page" - ("ar" :default "التتمة ÙÙŠ الصÙحة التالية") - ("cs" :default "PokraÄuje na další stránce") - ("de" :default "Fortsetzung nächste Seite") - ("es" :html "Continúa en la siguiente página" :ascii "Continua en la siguiente pagina" :default "Continúa en la siguiente página") - ("fr" :default "Suite page suivante") - ("it" :default "Continua alla pagina successiva") - ("ja" :default "次ページã«ç¶šã") - ("nl" :default "Vervolg op volgende pagina") - ("pt" :default "Continua na página seguinte") - ("pt_BR" :html "Continua na próxima página" :ascii "Continua na proxima pagina" :default "Continua na próxima página") - ("ru" :html "(Продолжение следует)" - :utf-8 "(Продолжение Ñледует)") - ("sl" :default "Nadaljevanje na naslednji strani")) - ("Created" - ("cs" :default "VytvoÅ™eno") - ("pt_BR" :default "Criado em") - ("sl" :default "Ustvarjeno")) - ("Date" - ("ar" :default "بتاريخ") - ("ca" :default "Data") - ("cs" :default "Datum") - ("da" :default "Dato") - ("de" :default "Datum") - ("eo" :default "Dato") - ("es" :default "Fecha") - ("et" :html "Kuupäev" :utf-8 "Kuupäev") - ("fi" :html "Päivämäärä") - ("hu" :html "Dátum") - ("is" :default "Dagsetning") - ("it" :default "Data") - ("ja" :default "日付" :html "日付") - ("nl" :default "Datum") - ("no" :default "Dato") - ("nb" :default "Dato") - ("nn" :default "Dato") - ("pl" :default "Data") - ("pt_BR" :default "Data") - ("ru" :html "Дата" :utf-8 "Дата") - ("sl" :default "Datum") - ("sv" :default "Datum") - ("uk" :html "Дата" :utf-8 "Дата") - ("zh-CN" :html "日期" :utf-8 "日期") - ("zh-TW" :html "日期" :utf-8 "日期")) - ("Equation" - ("ar" :default "معادلة") - ("cs" :default "Rovnice") - ("da" :default "Ligning") - ("de" :default "Gleichung") - ("es" :ascii "Ecuacion" :html "Ecuación" :default "Ecuación") - ("et" :html "Võrrand" :utf-8 "Võrrand") - ("fr" :ascii "Equation" :default "Équation") - ("is" :default "Jafna") - ("ja" :default "方程å¼") - ("no" :default "Ligning") - ("nb" :default "Ligning") - ("nn" :default "Likning") - ("pt_BR" :html "Equação" :default "Equação" :ascii "Equacao") - ("ru" :html "Уравнение" - :utf-8 "Уравнение") - ("sl" :default "EnaÄba") - ("sv" :default "Ekvation") - ("zh-CN" :html "方程" :utf-8 "方程")) - ("Figure" - ("ar" :default "شكل") - ("cs" :default "Obrázek") - ("da" :default "Figur") - ("de" :default "Abbildung") - ("es" :default "Figura") - ("et" :default "Joonis") - ("is" :default "Mynd") - ("it" :default "Figura") - ("ja" :default "図" :html "図") - ("no" :default "Illustrasjon") - ("nb" :default "Illustrasjon") - ("nn" :default "Illustrasjon") - ("pt_BR" :default "Figura") - ("ru" :html "Рисунок" :utf-8 "РиÑунок") - ("sv" :default "Illustration") - ("zh-CN" :html "图" :utf-8 "图")) - ("Figure %d:" - ("ar" :default "شكل %d:") - ("cs" :default "Obrázek %d:") - ("da" :default "Figur %d") - ("de" :default "Abbildung %d:") - ("es" :default "Figura %d:") - ("et" :default "Joonis %d:") - ("fr" :default "Figure %d :" :html "Figure %d :") - ("is" :default "Mynd %d") - ("it" :default "Figura %d:") - ("ja" :default "図%d: " :html "図%d: ") - ("no" :default "Illustrasjon %d") - ("nb" :default "Illustrasjon %d") - ("nn" :default "Illustrasjon %d") - ("pt_BR" :default "Figura %d:") - ("ru" :html "Рис. %d.:" :utf-8 "РиÑ. %d.:") - ("sl" :default "Slika %d") - ("sv" :default "Illustration %d") - ("zh-CN" :html "图%d " :utf-8 "图%d ")) - ("Footnotes" - ("ar" :default "الهوامش") - ("ca" :html "Peus de pàgina") - ("cs" :default "Poznámky pod Äarou") - ("da" :default "Fodnoter") - ("de" :html "Fußnoten" :default "Fußnoten") - ("eo" :default "Piednotoj") - ("es" :ascii "Nota al pie de pagina" :html "Nota al pie de página" :default "Nota al pie de página") - ("et" :html "Allmärkused" :utf-8 "Allmärkused") - ("fi" :default "Alaviitteet") - ("fr" :default "Notes de bas de page") - ("hu" :html "Lábjegyzet") - ("is" :html "Aftanmálsgreinar") - ("it" :html "Note a piè di pagina") - ("ja" :default "脚注" :html "脚注") - ("nl" :default "Voetnoten") - ("no" :default "Fotnoter") - ("nb" :default "Fotnoter") - ("nn" :default "Fotnotar") - ("pl" :default "Przypis") - ("pt_BR" :html "Notas de Rodapé" :default "Notas de Rodapé" :ascii "Notas de Rodape") - ("ru" :html "Сноски" :utf-8 "СноÑки") - ("sl" :default "Opombe") - ("sv" :default "Fotnoter") - ("uk" :html "Примітки" - :utf-8 "Примітки") - ("zh-CN" :html "脚注" :utf-8 "脚注") - ("zh-TW" :html "腳註" :utf-8 "腳註")) - ("List of Listings" - ("ar" :default "قائمة بالبرامج") - ("cs" :default "Seznam programů") - ("da" :default "Programmer") - ("de" :default "Programmauflistungsverzeichnis") - ("es" :ascii "Indice de Listados de programas" :html "Índice de Listados de programas" :default "Ãndice de Listados de programas") - ("et" :default "Loendite nimekiri") - ("fr" :default "Liste des programmes") - ("ja" :default "ソースコード目次") - ("no" :default "Dataprogrammer") - ("nb" :default "Dataprogrammer") - ("pt_BR" :html "Índice de Listagens" :default "Ãndice de Listagens" :ascii "Indice de Listagens") - ("ru" :html "Список распечаток" - :utf-8 "СпиÑок раÑпечаток") - ("sl" :default "Seznam programskih izpisov") - ("zh-CN" :html "代码目录" :utf-8 "代ç ç›®å½•")) - ("List of Tables" - ("ar" :default "قائمة بالجداول") - ("cs" :default "Seznam tabulek") - ("da" :default "Tabeller") - ("de" :default "Tabellenverzeichnis") - ("es" :ascii "Indice de tablas" :html "Índice de tablas" :default "Ãndice de tablas") - ("et" :default "Tabelite nimekiri") - ("fr" :default "Liste des tableaux") - ("is" :default "Töfluskrá" :html "Töfluskrá") - ("it" :default "Indice delle tabelle") - ("ja" :default "表目次") - ("no" :default "Tabeller") - ("nb" :default "Tabeller") - ("nn" :default "Tabeller") - ("pt_BR" :html "Índice de Tabelas" :default "Ãndice de Tabelas" :ascii "Indice de Tabelas") - ("ru" :html "Список таблиц" - :utf-8 "СпиÑок таблиц") - ("sl" :default "Seznam tabel") - ("sv" :default "Tabeller") - ("zh-CN" :html "表格目录" :utf-8 "表格目录")) - ("Listing" - ("ar" :default "برنامج") - ("cs" :default "Program") - ("da" :default "Program") - ("de" :default "Programmlisting") - ("es" :default "Listado de programa") - ("et" :default "Loend") - ("fr" :default "Programme" :html "Programme") - ("it" :default "Listato") - ("ja" :default "ソースコード") - ("no" :default "Dataprogram") - ("nb" :default "Dataprogram") - ("pt_BR" :default "Listagem") - ("ru" :html "Распечатка" - :utf-8 "РаÑпечатка") - ("sl" :default "Izpis programa") - ("zh-CN" :html "代码" :utf-8 "代ç ")) - ("Listing %d:" - ("ar" :default "برنامج %d:") - ("cs" :default "Program %d:") - ("da" :default "Program %d") - ("de" :default "Programmlisting %d") - ("es" :default "Listado de programa %d") - ("et" :default "Loend %d") - ("fr" :default "Programme %d :" :html "Programme %d :") - ("it" :default "Listato %d :") - ("ja" :default "ソースコード%d:") - ("no" :default "Dataprogram %d") - ("nb" :default "Dataprogram %d") - ("pt_BR" :default "Listagem %d:") - ("ru" :html "Распечатка %d.:" - :utf-8 "РаÑпечатка %d.:") - ("sl" :default "Izpis programa %d") - ("zh-CN" :html "代码%d " :utf-8 "代ç %d ")) - ("References" - ("ar" :default "المراجع") - ("cs" :default "Reference") - ("de" :default "Quellen") - ("es" :default "Referencias") - ("fr" :ascii "References" :default "Références") - ("it" :default "Riferimenti") - ("pt_BR" :html "Referências" :default "Referências" :ascii "Referencias") - ("sl" :default "Reference")) - ("See figure %s" - ("cs" :default "Viz obrázek %s") - ("fr" :default "cf. figure %s" - :html "cf. figure %s" :latex "cf.~figure~%s") - ("it" :default "Vedi figura %s") - ("pt_BR" :default "Veja a figura %s") - ("sl" :default "Glej sliko %s")) - ("See listing %s" - ("cs" :default "Viz program %s") - ("fr" :default "cf. programme %s" - :html "cf. programme %s" :latex "cf.~programme~%s") - ("pt_BR" :default "Veja a listagem %s") - ("sl" :default "Glej izpis programa %s")) - ("See section %s" - ("ar" :default "انظر قسم %s") - ("cs" :default "Viz sekce %s") - ("da" :default "jævnfør afsnit %s") - ("de" :default "siehe Abschnitt %s") - ("es" :ascii "Vea seccion %s" :html "Vea sección %s" :default "Vea sección %s") - ("et" :html "Vaata peatükki %s" :utf-8 "Vaata peatükki %s") - ("fr" :default "cf. section %s") - ("it" :default "Vedi sezione %s") - ("ja" :default "セクション %s ã‚’å‚ç…§") - ("pt_BR" :html "Veja a seção %s" :default "Veja a seção %s" - :ascii "Veja a secao %s") - ("ru" :html "См. раздел %s" - :utf-8 "См. раздел %s") - ("sl" :default "Glej poglavje %d") - ("zh-CN" :html "参见第%s节" :utf-8 "å‚è§ç¬¬%s节")) - ("See table %s" - ("cs" :default "Viz tabulka %s") - ("fr" :default "cf. tableau %s" - :html "cf. tableau %s" :latex "cf.~tableau~%s") - ("it" :default "Vedi tabella %s") - ("pt_BR" :default "Veja a tabela %s") - ("sl" :default "Glej tabelo %s")) - ("Table" - ("ar" :default "جدول") - ("cs" :default "Tabulka") - ("de" :default "Tabelle") - ("es" :default "Tabla") - ("et" :default "Tabel") - ("fr" :default "Tableau") - ("is" :default "Tafla") - ("it" :default "Tabella") - ("ja" :default "表" :html "表") - ("pt_BR" :default "Tabela") - ("ru" :html "Таблица" - :utf-8 "Таблица") - ("zh-CN" :html "表" :utf-8 "表")) - ("Table %d:" - ("ar" :default "جدول %d:") - ("cs" :default "Tabulka %d:") - ("da" :default "Tabel %d") - ("de" :default "Tabelle %d") - ("es" :default "Tabla %d") - ("et" :default "Tabel %d") - ("fr" :default "Tableau %d :") - ("is" :default "Tafla %d") - ("it" :default "Tabella %d:") - ("ja" :default "表%d:" :html "表%d:") - ("no" :default "Tabell %d") - ("nb" :default "Tabell %d") - ("nn" :default "Tabell %d") - ("pt_BR" :default "Tabela %d:") - ("ru" :html "Таблица %d.:" - :utf-8 "Таблица %d.:") - ("sl" :default "Tabela %d") - ("sv" :default "Tabell %d") - ("zh-CN" :html "表%d " :utf-8 "表%d ")) - ("Table of Contents" - ("ar" :default "قائمة المحتويات") - ("ca" :html "Índex") - ("cs" :default "Obsah") - ("da" :default "Indhold") - ("de" :default "Inhaltsverzeichnis") - ("eo" :default "Enhavo") - ("es" :ascii "Indice" :html "Índice" :default "Ãndice") - ("et" :default "Sisukord") - ("fi" :html "Sisällysluettelo") - ("fr" :ascii "Sommaire" :default "Table des matières") - ("hu" :html "Tartalomjegyzék") - ("is" :default "Efnisyfirlit") - ("it" :default "Indice") - ("ja" :default "目次" :html "目次") - ("nl" :default "Inhoudsopgave") - ("no" :default "Innhold") - ("nb" :default "Innhold") - ("nn" :default "Innhald") - ("pl" :html "Spis treści") - ("pt_BR" :html "Índice" :utf8 "Ãndice" :ascii "Indice") - ("ru" :html "Содержание" - :utf-8 "Содержание") - ("sl" :default "Kazalo") - ("sv" :html "Innehåll") - ("uk" :html "Зміст" :utf-8 "ЗміÑÑ‚") - ("zh-CN" :html "目录" :utf-8 "目录") - ("zh-TW" :html "目錄" :utf-8 "目錄")) - ("Unknown reference" - ("ar" :default "مرجع غير معرّÙ") - ("da" :default "ukendt reference") - ("de" :default "Unbekannter Verweis") - ("es" :default "Referencia desconocida") - ("et" :default "Tundmatu viide") - ("fr" :ascii "Destination inconnue" :default "Référence inconnue") - ("it" :default "Riferimento sconosciuto") - ("ja" :default "ä¸æ˜Žãªå‚照先") - ("pt_BR" :html "Referência desconhecida" :default "Referência desconhecida" :ascii "Referencia desconhecida") - ("ru" :html "Неизвестная ссылка" - :utf-8 "ÐеизвеÑÑ‚Ð½Ð°Ñ ÑÑылка") - ("sl" :default "Neznana referenca") - ("zh-CN" :html "未知引用" :utf-8 "未知引用"))) - "Dictionary for export engine. - -Alist whose car is the string to translate and cdr is an alist -whose car is the language string and cdr is a plist whose -properties are possible charsets and values translated terms. - -It is used as a database for `org-export-translate'. Since this -function returns the string as-is if no translation was found, -the variable only needs to record values different from the -entry.") - -(defun org-export-translate (s encoding info) - "Translate string S according to language specification. - -ENCODING is a symbol among `:ascii', `:html', `:latex', `:latin1' -and `:utf-8'. INFO is a plist used as a communication channel. - -Translation depends on `:language' property. Return the -translated string. If no translation is found, try to fall back -to `:default' encoding. If it fails, return S." - (let* ((lang (plist-get info :language)) - (translations (cdr (assoc lang - (cdr (assoc s org-export-dictionary)))))) - (or (plist-get translations encoding) - (plist-get translations :default) - s))) - - - -;;; Asynchronous Export -;; -;; `org-export-async-start' is the entry point for asynchronous -;; export. It recreates current buffer (including visibility, -;; narrowing and visited file) in an external Emacs process, and -;; evaluates a command there. It then applies a function on the -;; returned results in the current process. -;; -;; At a higher level, `org-export-to-buffer' and `org-export-to-file' -;; allow exporting to a buffer or a file, asynchronously or not. -;; -;; `org-export-output-file-name' is an auxiliary function meant to be -;; used with `org-export-to-file'. With a given extension, it tries -;; to provide a canonical file name to write export output to. -;; -;; Asynchronously generated results are never displayed directly. -;; Instead, they are stored in `org-export-stack-contents'. They can -;; then be retrieved by calling `org-export-stack'. -;; -;; Export Stack is viewed through a dedicated major mode -;;`org-export-stack-mode' and tools: `org-export-stack-refresh', -;;`org-export-stack-delete', `org-export-stack-view' and -;;`org-export-stack-clear'. -;; -;; For back-ends, `org-export-add-to-stack' add a new source to stack. -;; It should be used whenever `org-export-async-start' is called. - -(defmacro org-export-async-start (fun &rest body) - "Call function FUN on the results returned by BODY evaluation. - -FUN is an anonymous function of one argument. BODY evaluation -happens in an asynchronous process, from a buffer which is an -exact copy of the current one. - -Use `org-export-add-to-stack' in FUN in order to register results -in the stack. - -This is a low level function. See also `org-export-to-buffer' -and `org-export-to-file' for more specialized functions." - (declare (indent 1) (debug t)) - (org-with-gensyms (process temp-file copy-fun proc-buffer coding) - ;; Write the full sexp evaluating BODY in a copy of the current - ;; buffer to a temporary file, as it may be too long for program - ;; args in `start-process'. - `(with-temp-message "Initializing asynchronous export process" - (let ((,copy-fun (org-export--generate-copy-script (current-buffer))) - (,temp-file (make-temp-file "org-export-process")) - (,coding buffer-file-coding-system)) - (with-temp-file ,temp-file - (insert - ;; Null characters (from variable values) are inserted - ;; within the file. As a consequence, coding system for - ;; buffer contents will not be recognized properly. So, - ;; we make sure it is the same as the one used to display - ;; the original buffer. - (format ";; -*- coding: %s; -*-\n%S" - ,coding - `(with-temp-buffer - (when org-export-async-debug '(setq debug-on-error t)) - ;; Ignore `kill-emacs-hook' and code evaluation - ;; queries from Babel as we need a truly - ;; non-interactive process. - (setq kill-emacs-hook nil - org-babel-confirm-evaluate-answer-no t) - ;; Initialize export framework. - (require 'ox) - ;; Re-create current buffer there. - (funcall ,,copy-fun) - (restore-buffer-modified-p nil) - ;; Sexp to evaluate in the buffer. - (print (progn ,,@body)))))) - ;; Start external process. - (let* ((process-connection-type nil) - (,proc-buffer (generate-new-buffer-name "*Org Export Process*")) - (,process - (apply - #'start-process - (append - (list "org-export-process" - ,proc-buffer - (expand-file-name invocation-name invocation-directory) - "--batch") - (if org-export-async-init-file - (list "-Q" "-l" org-export-async-init-file) - (list "-l" user-init-file)) - (list "-l" ,temp-file))))) - ;; Register running process in stack. - (org-export-add-to-stack (get-buffer ,proc-buffer) nil ,process) - ;; Set-up sentinel in order to catch results. - (let ((handler ,fun)) - (set-process-sentinel - ,process - `(lambda (p status) - (let ((proc-buffer (process-buffer p))) - (when (eq (process-status p) 'exit) - (unwind-protect - (if (zerop (process-exit-status p)) - (unwind-protect - (let ((results - (with-current-buffer proc-buffer - (goto-char (point-max)) - (backward-sexp) - (read (current-buffer))))) - (funcall ,handler results)) - (unless org-export-async-debug - (and (get-buffer proc-buffer) - (kill-buffer proc-buffer)))) - (org-export-add-to-stack proc-buffer nil p) - (ding) - (message "Process `%s' exited abnormally" p)) - (unless org-export-async-debug - (delete-file ,,temp-file))))))))))))) - -;;;###autoload -(defun org-export-to-buffer - (backend buffer - &optional async subtreep visible-only body-only ext-plist - post-process) - "Call `org-export-as' with output to a specified buffer. - -BACKEND is either an export back-end, as returned by, e.g., -`org-export-create-backend', or a symbol referring to -a registered back-end. - -BUFFER is the name of the output buffer. If it already exists, -it will be erased first, otherwise, it will be created. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting buffer should then be accessible -through the `org-export-stack' interface. When ASYNC is nil, the -buffer is displayed if `org-export-show-temporary-export-buffer' -is non-nil. - -Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY and -EXT-PLIST are similar to those used in `org-export-as', which -see. - -Optional argument POST-PROCESS is a function which should accept -no argument. It is always called within the current process, -from BUFFER, with point at its beginning. Export back-ends can -use it to set a major mode there, e.g, - - (defun org-latex-export-as-latex - (&optional async subtreep visible-only body-only ext-plist) - (interactive) - (org-export-to-buffer \\='latex \"*Org LATEX Export*\" - async subtreep visible-only body-only ext-plist (lambda () (LaTeX-mode)))) - -This function returns BUFFER." - (declare (indent 2)) - (if async - (org-export-async-start - `(lambda (output) - (with-current-buffer (get-buffer-create ,buffer) - (erase-buffer) - (setq buffer-file-coding-system ',buffer-file-coding-system) - (insert output) - (goto-char (point-min)) - (org-export-add-to-stack (current-buffer) ',backend) - (ignore-errors (funcall ,post-process)))) - `(org-export-as - ',backend ,subtreep ,visible-only ,body-only ',ext-plist)) - (let ((output - (org-export-as backend subtreep visible-only body-only ext-plist)) - (buffer (get-buffer-create buffer)) - (encoding buffer-file-coding-system)) - (when (and (org-string-nw-p output) (org-export--copy-to-kill-ring-p)) - (org-kill-new output)) - (with-current-buffer buffer - (erase-buffer) - (setq buffer-file-coding-system encoding) - (insert output) - (goto-char (point-min)) - (and (functionp post-process) (funcall post-process))) - (when org-export-show-temporary-export-buffer - (switch-to-buffer-other-window buffer)) - buffer))) - -;;;###autoload -(defun org-export-to-file - (backend file &optional async subtreep visible-only body-only ext-plist - post-process) - "Call `org-export-as' with output to a specified file. - -BACKEND is either an export back-end, as returned by, e.g., -`org-export-create-backend', or a symbol referring to -a registered back-end. FILE is the name of the output file, as -a string. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting buffer will then be accessible -through the `org-export-stack' interface. - -Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY and -EXT-PLIST are similar to those used in `org-export-as', which -see. - -Optional argument POST-PROCESS is called with FILE as its -argument and happens asynchronously when ASYNC is non-nil. It -has to return a file name, or nil. Export back-ends can use this -to send the output file through additional processing, e.g, - - (defun org-latex-export-to-latex - (&optional async subtreep visible-only body-only ext-plist) - (interactive) - (let ((outfile (org-export-output-file-name \".tex\" subtreep))) - (org-export-to-file \\='latex outfile - async subtreep visible-only body-only ext-plist - (lambda (file) (org-latex-compile file))) - -The function returns either a file name returned by POST-PROCESS, -or FILE." - (declare (indent 2)) - (if (not (file-writable-p file)) (error "Output file not writable") - (let ((ext-plist (org-combine-plists `(:output-file ,file) ext-plist)) - (encoding (or org-export-coding-system buffer-file-coding-system))) - (if async - (org-export-async-start - `(lambda (file) - (org-export-add-to-stack (expand-file-name file) ',backend)) - `(let ((output - (org-export-as - ',backend ,subtreep ,visible-only ,body-only - ',ext-plist))) - (with-temp-buffer - (insert output) - (let ((coding-system-for-write ',encoding)) - (write-file ,file))) - (or (ignore-errors (funcall ',post-process ,file)) ,file))) - (let ((output (org-export-as - backend subtreep visible-only body-only ext-plist))) - (with-temp-buffer - (insert output) - (let ((coding-system-for-write encoding)) - (write-file file))) - (when (and (org-export--copy-to-kill-ring-p) (org-string-nw-p output)) - (org-kill-new output)) - ;; Get proper return value. - (or (and (functionp post-process) (funcall post-process file)) - file)))))) - -(defun org-export-output-file-name (extension &optional subtreep pub-dir) - "Return output file's name according to buffer specifications. - -EXTENSION is a string representing the output file extension, -with the leading dot. - -With a non-nil optional argument SUBTREEP, try to determine -output file's name by looking for \"EXPORT_FILE_NAME\" property -of subtree at point. - -When optional argument PUB-DIR is set, use it as the publishing -directory. - -Return file name as a string." - (let* ((visited-file (buffer-file-name (buffer-base-buffer))) - (base-name - (concat - (file-name-sans-extension - (or - ;; Check EXPORT_FILE_NAME subtree property. - (and subtreep (org-entry-get nil "EXPORT_FILE_NAME" 'selective)) - ;; Check #+EXPORT_FILE_NAME keyword. - (org-with-point-at (point-min) - (catch :found - (let ((case-fold-search t)) - (while (re-search-forward - "^[ \t]*#\\+EXPORT_FILE_NAME:[ \t]+\\S-" nil t) - (let ((element (org-element-at-point))) - (when (eq 'keyword (org-element-type element)) - (throw :found - (org-element-property :value element)))))))) - ;; Extract from buffer's associated file, if any. - (and visited-file (file-name-nondirectory visited-file)) - ;; Can't determine file name on our own: ask user. - (read-file-name - "Output file: " pub-dir nil nil nil - (lambda (n) (string= extension (file-name-extension n t)))))) - extension)) - (output-file - ;; Build file name. Enforce EXTENSION over whatever user - ;; may have come up with. PUB-DIR, if defined, always has - ;; precedence over any provided path. - (cond - (pub-dir (concat (file-name-as-directory pub-dir) - (file-name-nondirectory base-name))) - ((file-name-absolute-p base-name) base-name) - (t base-name)))) - ;; If writing to OUTPUT-FILE would overwrite original file, append - ;; EXTENSION another time to final name. - (if (and visited-file (file-equal-p visited-file output-file)) - (concat output-file extension) - output-file))) - -(defun org-export-add-to-stack (source backend &optional process) - "Add a new result to export stack if not present already. - -SOURCE is a buffer or a file name containing export results. -BACKEND is a symbol representing export back-end used to generate -it. - -Entries already pointing to SOURCE and unavailable entries are -removed beforehand. Return the new stack." - (setq org-export-stack-contents - (cons (list source backend (or process (current-time))) - (org-export-stack-remove source)))) - -(defun org-export-stack () - "Menu for asynchronous export results and running processes." - (interactive) - (let ((buffer (get-buffer-create "*Org Export Stack*"))) - (with-current-buffer buffer - (org-export-stack-mode) - (tabulated-list-print t)) - (pop-to-buffer buffer)) - (message "Type \"q\" to quit, \"?\" for help")) - -(defun org-export-stack-clear () - "Remove all entries from export stack." - (interactive) - (setq org-export-stack-contents nil)) - -(defun org-export-stack-refresh () - "Refresh the export stack." - (interactive) - (tabulated-list-print t)) - -(defun org-export-stack-remove (&optional source) - "Remove export results at point from stack. -If optional argument SOURCE is non-nil, remove it instead." - (interactive) - (let ((source (or source (org-export--stack-source-at-point)))) - (setq org-export-stack-contents - (cl-remove-if (lambda (el) (equal (car el) source)) - org-export-stack-contents)))) - -(defun org-export-stack-view (&optional in-emacs) - "View export results at point in stack. -With an optional prefix argument IN-EMACS, force viewing files -within Emacs." - (interactive "P") - (let ((source (org-export--stack-source-at-point))) - (cond ((processp source) - (org-switch-to-buffer-other-window (process-buffer source))) - ((bufferp source) (org-switch-to-buffer-other-window source)) - (t (org-open-file source in-emacs))))) - -(defvar org-export-stack-mode-map - (let ((km (make-sparse-keymap))) - (set-keymap-parent km tabulated-list-mode-map) - (define-key km " " 'next-line) - (define-key km "\C-n" 'next-line) - (define-key km [down] 'next-line) - (define-key km "\C-p" 'previous-line) - (define-key km "\C-?" 'previous-line) - (define-key km [up] 'previous-line) - (define-key km "C" 'org-export-stack-clear) - (define-key km "v" 'org-export-stack-view) - (define-key km (kbd "RET") 'org-export-stack-view) - (define-key km "d" 'org-export-stack-remove) - km) - "Keymap for Org Export Stack.") - -(define-derived-mode org-export-stack-mode tabulated-list-mode "Org-Stack" - "Mode for displaying asynchronous export stack. - -Type `\\[org-export-stack]' to visualize the asynchronous export -stack. - -In an Org Export Stack buffer, use \ -\\`\\[org-export-stack-view]' to view export output -on current line, `\\[org-export-stack-remove]' to remove it from the stack and \ -`\\[org-export-stack-clear]' to clear -stack completely. - -Removing entries in a stack buffer does not affect files -or buffers, only display. - -\\{org-export-stack-mode-map}" - (setq tabulated-list-format - (vector (list "#" 4 #'org-export--stack-num-predicate) - (list "Back-End" 12 t) - (list "Age" 6 nil) - (list "Source" 0 nil))) - (setq tabulated-list-sort-key (cons "#" nil)) - (setq tabulated-list-entries #'org-export--stack-generate) - (add-hook 'tabulated-list-revert-hook #'org-export--stack-generate nil t) - (add-hook 'post-command-hook #'org-export-stack-refresh nil t) - (tabulated-list-init-header)) - -(defun org-export--stack-generate () - "Generate the asynchronous export stack for display. -Unavailable sources are removed from the list. Return a list -appropriate for `tabulated-list-print'." - ;; Clear stack from exited processes, dead buffers or non-existent - ;; files. - (setq org-export-stack-contents - (cl-remove-if-not - (lambda (el) - (if (processp (nth 2 el)) - (buffer-live-p (process-buffer (nth 2 el))) - (let ((source (car el))) - (if (bufferp source) (buffer-live-p source) - (file-exists-p source))))) - org-export-stack-contents)) - ;; Update `tabulated-list-entries'. - (let ((counter 0)) - (mapcar - (lambda (entry) - (let ((source (car entry))) - (list source - (vector - ;; Counter. - (number-to-string (cl-incf counter)) - ;; Back-End. - (if (nth 1 entry) (symbol-name (nth 1 entry)) "") - ;; Age. - (let ((info (nth 2 entry))) - (if (processp info) (symbol-name (process-status info)) - (format-seconds "%h:%.2m" (float-time (time-since info))))) - ;; Source. - (if (stringp source) source (buffer-name source)))))) - org-export-stack-contents))) - -(defun org-export--stack-num-predicate (a b) - (< (string-to-number (aref (nth 1 a) 0)) - (string-to-number (aref (nth 1 b) 0)))) - -(defun org-export--stack-source-at-point () - "Return source from export results at point in stack." - (let ((source (car (nth (1- (org-current-line)) org-export-stack-contents)))) - (if (not source) (error "Source unavailable, please refresh buffer") - (let ((source-name (if (stringp source) source (buffer-name source)))) - (if (save-excursion - (beginning-of-line) - (looking-at-p (concat ".* +" (regexp-quote source-name) "$"))) - source - ;; SOURCE is not consistent with current line. The stack - ;; view is outdated. - (error (substitute-command-keys - "Source unavailable; type `\\[org-export-stack-refresh]' \ -to refresh buffer"))))))) - - - -;;; The Dispatcher -;; -;; `org-export-dispatch' is the standard interactive way to start an -;; export process. It uses `org-export--dispatch-ui' as a subroutine -;; for its interface, which, in turn, delegates response to key -;; pressed to `org-export--dispatch-action'. - -;;;###autoload -(defun org-export-dispatch (&optional arg) - "Export dispatcher for Org mode. - -It provides an access to common export related tasks in a buffer. -Its interface comes in two flavors: standard and expert. - -While both share the same set of bindings, only the former -displays the valid keys associations in a dedicated buffer. -Scrolling (resp. line-wise motion) in this buffer is done with -SPC and DEL (resp. C-n and C-p) keys. - -Set variable `org-export-dispatch-use-expert-ui' to switch to one -flavor or the other. - -When ARG is `\\[universal-argument]', repeat the last export action, with the\ - same -set of options used back then, on the current buffer. - -When ARG is `\\[universal-argument] \\[universal-argument]', display the \ -asynchronous export stack." - (interactive "P") - (let* ((input - (cond ((equal arg '(16)) '(stack)) - ((and arg org-export-dispatch-last-action)) - (t (save-window-excursion - (unwind-protect - (progn - ;; Remember where we are - (move-marker org-export-dispatch-last-position - (point) - (org-base-buffer (current-buffer))) - ;; Get and store an export command - (setq org-export-dispatch-last-action - (org-export--dispatch-ui - (list org-export-initial-scope - (and org-export-in-background 'async)) - nil - org-export-dispatch-use-expert-ui))) - (and (get-buffer "*Org Export Dispatcher*") - (kill-buffer "*Org Export Dispatcher*"))))))) - (action (car input)) - (optns (cdr input))) - (unless (memq 'subtree optns) - (move-marker org-export-dispatch-last-position nil)) - (cl-case action - ;; First handle special hard-coded actions. - (template (org-export-insert-default-template nil optns)) - (stack (org-export-stack)) - (publish-current-file - (org-publish-current-file (memq 'force optns) (memq 'async optns))) - (publish-current-project - (org-publish-current-project (memq 'force optns) (memq 'async optns))) - (publish-choose-project - (org-publish (assoc (completing-read - "Publish project: " - org-publish-project-alist nil t) - org-publish-project-alist) - (memq 'force optns) - (memq 'async optns))) - (publish-all (org-publish-all (memq 'force optns) (memq 'async optns))) - (otherwise - (save-excursion - (when arg - ;; Repeating command, maybe move cursor to restore subtree - ;; context. - (if (eq (marker-buffer org-export-dispatch-last-position) - (org-base-buffer (current-buffer))) - (goto-char org-export-dispatch-last-position) - ;; We are in a different buffer, forget position. - (move-marker org-export-dispatch-last-position nil))) - (funcall action - ;; Return a symbol instead of a list to ease - ;; asynchronous export macro use. - (and (memq 'async optns) t) - (and (memq 'subtree optns) t) - (and (memq 'visible optns) t) - (and (memq 'body optns) t))))))) - -(defun org-export--dispatch-ui (options first-key expertp) - "Handle interface for `org-export-dispatch'. - -OPTIONS is a list containing current interactive options set for -export. It can contain any of the following symbols: -`body' toggles a body-only export -`subtree' restricts export to current subtree -`visible' restricts export to visible part of buffer. -`force' force publishing files. -`async' use asynchronous export process - -FIRST-KEY is the key pressed to select the first level menu. It -is nil when this menu hasn't been selected yet. - -EXPERTP, when non-nil, triggers expert UI. In that case, no help -buffer is provided, but indications about currently active -options are given in the prompt. Moreover, [?] allows switching -back to standard interface." - (let* ((fontify-key - (lambda (key &optional access-key) - ;; Fontify KEY string. Optional argument ACCESS-KEY, when - ;; non-nil is the required first-level key to activate - ;; KEY. When its value is t, activate KEY independently - ;; on the first key, if any. A nil value means KEY will - ;; only be activated at first level. - (if (or (eq access-key t) (eq access-key first-key)) - (propertize key 'face 'org-warning) - key))) - (fontify-value - (lambda (value) - ;; Fontify VALUE string. - (propertize value 'face 'font-lock-variable-name-face))) - ;; Prepare menu entries by extracting them from registered - ;; back-ends and sorting them by access key and by ordinal, - ;; if any. - (entries - (sort (sort (delq nil - (mapcar #'org-export-backend-menu - org-export-registered-backends)) - (lambda (a b) - (let ((key-a (nth 1 a)) - (key-b (nth 1 b))) - (cond ((and (numberp key-a) (numberp key-b)) - (< key-a key-b)) - ((numberp key-b) t))))) - 'car-less-than-car)) - ;; Compute a list of allowed keys based on the first key - ;; pressed, if any. Some keys - ;; (?^B, ?^V, ?^S, ?^F, ?^A, ?&, ?# and ?q) are always - ;; available. - (allowed-keys - (nconc (list 2 22 19 6 1) - (if (not first-key) (org-uniquify (mapcar 'car entries)) - (let (sub-menu) - (dolist (entry entries (sort (mapcar 'car sub-menu) '<)) - (when (eq (car entry) first-key) - (setq sub-menu (append (nth 2 entry) sub-menu)))))) - (cond ((eq first-key ?P) (list ?f ?p ?x ?a)) - ((not first-key) (list ?P))) - (list ?& ?#) - (when expertp (list ??)) - (list ?q))) - ;; Build the help menu for standard UI. - (help - (unless expertp - (concat - ;; Options are hard-coded. - (format "[%s] Body only: %s [%s] Visible only: %s -\[%s] Export scope: %s [%s] Force publishing: %s -\[%s] Async export: %s\n\n" - (funcall fontify-key "C-b" t) - (funcall fontify-value - (if (memq 'body options) "On " "Off")) - (funcall fontify-key "C-v" t) - (funcall fontify-value - (if (memq 'visible options) "On " "Off")) - (funcall fontify-key "C-s" t) - (funcall fontify-value - (if (memq 'subtree options) "Subtree" "Buffer ")) - (funcall fontify-key "C-f" t) - (funcall fontify-value - (if (memq 'force options) "On " "Off")) - (funcall fontify-key "C-a" t) - (funcall fontify-value - (if (memq 'async options) "On " "Off"))) - ;; Display registered back-end entries. When a key - ;; appears for the second time, do not create another - ;; entry, but append its sub-menu to existing menu. - (let (last-key) - (mapconcat - (lambda (entry) - (let ((top-key (car entry))) - (concat - (unless (eq top-key last-key) - (setq last-key top-key) - (format "\n[%s] %s\n" - (funcall fontify-key (char-to-string top-key)) - (nth 1 entry))) - (let ((sub-menu (nth 2 entry))) - (unless (functionp sub-menu) - ;; Split sub-menu into two columns. - (let ((index -1)) - (concat - (mapconcat - (lambda (sub-entry) - (cl-incf index) - (format - (if (zerop (mod index 2)) " [%s] %-26s" - "[%s] %s\n") - (funcall fontify-key - (char-to-string (car sub-entry)) - top-key) - (nth 1 sub-entry))) - sub-menu "") - (when (zerop (mod index 2)) "\n")))))))) - entries "")) - ;; Publishing menu is hard-coded. - (format "\n[%s] Publish - [%s] Current file [%s] Current project - [%s] Choose project [%s] All projects\n\n\n" - (funcall fontify-key "P") - (funcall fontify-key "f" ?P) - (funcall fontify-key "p" ?P) - (funcall fontify-key "x" ?P) - (funcall fontify-key "a" ?P)) - (format "[%s] Export stack [%s] Insert template\n" - (funcall fontify-key "&" t) - (funcall fontify-key "#" t)) - (format "[%s] %s" - (funcall fontify-key "q" t) - (if first-key "Main menu" "Exit"))))) - ;; Build prompts for both standard and expert UI. - (standard-prompt (unless expertp "Export command: ")) - (expert-prompt - (when expertp - (format - "Export command (C-%s%s%s%s%s) [%s]: " - (if (memq 'body options) (funcall fontify-key "b" t) "b") - (if (memq 'visible options) (funcall fontify-key "v" t) "v") - (if (memq 'subtree options) (funcall fontify-key "s" t) "s") - (if (memq 'force options) (funcall fontify-key "f" t) "f") - (if (memq 'async options) (funcall fontify-key "a" t) "a") - (mapconcat (lambda (k) - ;; Strip control characters. - (unless (< k 27) (char-to-string k))) - allowed-keys ""))))) - ;; With expert UI, just read key with a fancy prompt. In standard - ;; UI, display an intrusive help buffer. - (if expertp - (org-export--dispatch-action - expert-prompt allowed-keys entries options first-key expertp) - ;; At first call, create frame layout in order to display menu. - (unless (get-buffer "*Org Export Dispatcher*") - (delete-other-windows) - (org-switch-to-buffer-other-window - (get-buffer-create "*Org Export Dispatcher*")) - (setq cursor-type nil - header-line-format "Use SPC, DEL, C-n or C-p to navigate.") - ;; Make sure that invisible cursor will not highlight square - ;; brackets. - (set-syntax-table (copy-syntax-table)) - (modify-syntax-entry ?\[ "w")) - ;; At this point, the buffer containing the menu exists and is - ;; visible in the current window. So, refresh it. - (with-current-buffer "*Org Export Dispatcher*" - ;; Refresh help. Maintain display continuity by re-visiting - ;; previous window position. - (let ((pos (window-start))) - (erase-buffer) - (insert help) - (set-window-start nil pos))) - (org-fit-window-to-buffer) - (org-export--dispatch-action - standard-prompt allowed-keys entries options first-key expertp)))) - -(defun org-export--dispatch-action - (prompt allowed-keys entries options first-key expertp) - "Read a character from command input and act accordingly. - -PROMPT is the displayed prompt, as a string. ALLOWED-KEYS is -a list of characters available at a given step in the process. -ENTRIES is a list of menu entries. OPTIONS, FIRST-KEY and -EXPERTP are the same as defined in `org-export--dispatch-ui', -which see. - -Toggle export options when required. Otherwise, return value is -a list with action as CAR and a list of interactive export -options as CDR." - (let (key) - ;; Scrolling: when in non-expert mode, act on motion keys (C-n, - ;; C-p, SPC, DEL). - (while (and (setq key (read-char-exclusive prompt)) - (not expertp) - (memq key '(14 16 ?\s ?\d))) - (cl-case key - (14 (if (not (pos-visible-in-window-p (point-max))) - (ignore-errors (scroll-up 1)) - (message "End of buffer") - (sit-for 1))) - (16 (if (not (pos-visible-in-window-p (point-min))) - (ignore-errors (scroll-down 1)) - (message "Beginning of buffer") - (sit-for 1))) - (?\s (if (not (pos-visible-in-window-p (point-max))) - (scroll-up nil) - (message "End of buffer") - (sit-for 1))) - (?\d (if (not (pos-visible-in-window-p (point-min))) - (scroll-down nil) - (message "Beginning of buffer") - (sit-for 1))))) - (cond - ;; Ignore undefined associations. - ((not (memq key allowed-keys)) - (ding) - (unless expertp (message "Invalid key") (sit-for 1)) - (org-export--dispatch-ui options first-key expertp)) - ;; q key at first level aborts export. At second level, cancel - ;; first key instead. - ((eq key ?q) (if (not first-key) (user-error "Export aborted") - (org-export--dispatch-ui options nil expertp))) - ;; Help key: Switch back to standard interface if expert UI was - ;; active. - ((eq key ??) (org-export--dispatch-ui options first-key nil)) - ;; Send request for template insertion along with export scope. - ((eq key ?#) (cons 'template (memq 'subtree options))) - ;; Switch to asynchronous export stack. - ((eq key ?&) '(stack)) - ;; Toggle options: C-b (2) C-v (22) C-s (19) C-f (6) C-a (1). - ((memq key '(2 22 19 6 1)) - (org-export--dispatch-ui - (let ((option (cl-case key (2 'body) (22 'visible) (19 'subtree) - (6 'force) (1 'async)))) - (if (memq option options) (remq option options) - (cons option options))) - first-key expertp)) - ;; Action selected: Send key and options back to - ;; `org-export-dispatch'. - ((or first-key (functionp (nth 2 (assq key entries)))) - (cons (cond - ((not first-key) (nth 2 (assq key entries))) - ;; Publishing actions are hard-coded. Send a special - ;; signal to `org-export-dispatch'. - ((eq first-key ?P) - (cl-case key - (?f 'publish-current-file) - (?p 'publish-current-project) - (?x 'publish-choose-project) - (?a 'publish-all))) - ;; Return first action associated to FIRST-KEY + KEY - ;; path. Indeed, derived backends can share the same - ;; FIRST-KEY. - (t (catch 'found - (dolist (entry (member (assq first-key entries) entries)) - (let ((match (assq key (nth 2 entry)))) - (when match (throw 'found (nth 2 match)))))))) - options)) - ;; Otherwise, enter sub-menu. - (t (org-export--dispatch-ui options key expertp))))) - - - -(provide 'ox) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox.el ends here diff --git a/elpa/org-9.3.6/ox.elc b/elpa/org-9.3.6/ox.elc deleted file mode 100644 index 9e02c7d5587a490d3a4acfa74700a1a2af9fd0d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241477 zcmeFai+WpEawe*~E%cX6l5=K~nPk#iP}?Nk0vmUb?2AQGl*L#U)e_})$BS+S(2vUX<%)cH(;Xj0tzIu0oQ%82-9NO( z_&i$9$;aKJ?kGAyE7AU-KW=sVqi8ZdD6B;NLBFv6d~EU>J2;!(O*DT+S`B%HrN&(r=$c3mp!#V8dL> zMf~65FQUcPuyYV4K1PeBLbTZH^bawE#FwR|rRd{zS9vrZcKe5gUS~8qNtTQ9kNk&RsPinqlM^AYlImq{GtQAR^XK@9C)vV+2*6WKUrE5C;`|r{+G+;7WYoaox=X0 z-HGzeO0kH4r8~`Xi4Xi&4u4d_AJy%c#7RyL-P@i#}_;?H*5#qkd;J2Be~P z=L8Vtw2wNicCU-~_W+JbU%nm;2ggxy`Nz4%cINzdTD<#{ zXgR9Y8-Uc^`=!e2O0>?dffnO8olZZ}O3}%1aMBr$yPZ))TzJzu9Yw&FQD+>Dk2=Rd z#@(Y%^ty8z4G#DQ_{vs*oBUz5PosY8xN}ch;OlQ%y-9~F)Nt+I-W+v?owZ!f6_f@Pg`#2SWY`%2sDx50 z+M664bcP()o58SskGRqA_Lie)tF?aw%=H5Upa8@+MvK-kJ5mSc05So6V3zly_JlYZ zjV62JVW)$-3YmMTG8{|}L7{#v;$}JDcGNlmItn0cAgC=wO(5jAzIeLxZ1;D0)WRU% zMvL9$&T{l%eRs=^TL5Oo_&yl;(sIt=6hdKq)EW~VdTkE>fOHG$Ml;dfpK9^vYXEt_ zvz&9_MRkq_aA-|>V_O;`Sh#-6IkyTZh&de-@uH)_n`mbU&>TsRM?es;qhmDFJ;8&` z8C+^G#K_s+2w?F*!fI>_rnI8b>G2+Dqjfy!AFiP+)=Icb6n)z1kZjsEFydglJKApz zxnv#C#hYlr>7ae95k=2BC%x8wC#dFu9+ZDIIzgcY)Y=^M_d$Do{F6onJwaEa&IuT( zU=;c~)}_N>S&u!wLTd!(!i8GM-R3}B9J;Oq8XBGSx?>LIIUjVcppG$6zKcOgj~EbV zPqOAHk4c93tIYw0zUdAoBcUf58-_lT**)ch1D_)~Qmayq(lwWHu=o4U{up}&$LIcs z0qh?MQJ}9rv1&YQ^+)8I;0D;B?nRyD!{ub9SHk3!>$F?r)`BhdF=hw6agg8Z9JMfN z>@&H~$q`1zR+Ow9m2=XD>L^b1>Fjsfojw;BdyzwAG_sDZ5~IXy1FmJriGlC6_Foq| zXsvbFAAp_iV^kaVE;l;q>~{~k`(ah=Yl#shrX_r%z&6q3!gB6u%qWK#p5rRuSW(un zb)d6YH8*^$b3vKu!s6oExH|?(<#)GtA8+M_K1d_7$V<`U8la4?*?D~nKzJdK=r!^)tHlJ;+?>cY<-CBWyk_Y>ATP@_2Z#un^KtKN| zFWa~6t*IicCHv9vn@(X5J-)VD&1OGQFI9;3Mt}|$ztEo???H6a-tZ$)kCazPm1Jee zi5-l*b$n6~*^o$*=Sz8)Xd+dVwWZb8aQ~?L4I~k6ch)`MB`Rl>j2lpNldcu@GO9`$ zUuADN02x8{={rD$Z>FnXpCRO+}U7l~_ z!o$`Zzk=KVTc=GJlj+-b%!EAR&n~r`=>!u>!sZ zL=zyxn{FF|r&L;-t`wAs>kS5D=ot=$4l-)F624Bi&n8o71U7t>XPg1$24=eIgU zJWSV-@4hrdgnplboy_TEy0|M4*BD~2>W(4I651!jZbls|64deHv(*}8b>;UCUvYHY zg2?{$BnIHZba!E)xF&b9R?qmC5pW@+aVY#BN@$T*{wsnT&n zlfA-d0_|b6KkS~2wUw_jnn;!#`3A;=eXWFt>1ucxmu&4pht$G<$|x$IgVNY~WKP_K zvWg!DgNTt)@G`47&^2z{F2q)IoawIf)}dhsBS@CLpc$Ws6DiyK8O+up=sC_zpN3*$iU1EiC3AZa>~q=>xLJ?u)1VosaUSEae@*s^wZy zAXcqcQi?M6S(;ef<9O2VLSJD$Sa|yV4)xmYF$_qtS`97XpnEtO67i$M-e9lQ%YD-tcICH7r(}I@ zj5Y-sB!=QN_~T9sMhdJPj7wwMp(r#$84*btOXaEsVsx7l5?S6TI>zd{iWqr!7!BU^ zT^%%q0VEbxW#(9-j-rPK*`zf6ri+oZdbC93Ak{;HI)MbPC?*h^42LwXa2C+vL`edQ zNrecA6SYpLhO~1B-Qj3F3s-DzfdsB^3VVb0DJ&;}z!-dhM6D<&{J?*J`kGy%*Uqld z+UxWR`viGrJ^wkg_C970;eL+`wg^wzHRV%wty2(JcYh9W+F^;zHfUsm6p%G${ghqnErjwOw1Jth?Sv&}v>}GP zc}>Ix=Cv^DcTY}03Yl|Iz1@mrwgTlA0>)r6KAB{<5f+%yLM&8f4I&UIv+JAa2!kg2 z0;dHt%xq`6-2C=nii65d zqw+DB>0CxKRcc;aqv1TVv8H^XIW19)%A8m%)MwWQRA8XV0!dds&8P)aS$3Vyab^vZ zXEH0+Bz7v4$o-F70GS|%9NTPGABb_OFz%5oxM&} z(=%)I$?ClrlQsK9iOe=kn#&xpGmB;IvNY8m4qGQjnKk{_%s$18Ciae5l}E5R!5orZ zy9e)^_-(Rl`_FS~Lt)M4q|idqI6u#-ty*jru$=~*T~l?=(?WapM(UQ*%4D`9D(akF zE%=^Uf7ohw2QcRiDVk-?A}o;Ef|9nQ@WqRwjF!>{rAlJ@PN+P@8rwuI)(kt z3^`dV^7EY9LpZUr#;cX_bw=Hp_^PO!UCSx{**&_inRVgH>%c4D&z1@N*UY+blk5T4 zviCvvaaK*RzS$JQU;z6b)c0C*tyUMUxl$`d56r_Tat$4f+(w`!j$v-5&lXy+SpTB# zG299?EW*`wCqhA_!>kL~K|@67 zK&qRl3&RI=Twy=r92-FGlDLZ8o1+1&8{oVhG@wd)2OUEN&Y$!T^Y^0s?@v1RSNEbI&`SC^T@GG$oKIoWQaHa2*d| zCF%C@2$*p^EyQJvbA-@nmKF=?m|k7jN@TCs_5`L`!4Hgiz`sf}zp-gy40-6VFh*&o z2$N_oe=uq`VT#1#BIes{{^|E8c>H*+^YLM`xrE>PbMF|Bhx|_;@BegyCw?SsKE~g- zQs>LPlb8BoDgQF6I<#4-nz5z4QuXF3XT5+~4JM}j!3k7&XBmkmCxC}pui6u+_i7(m z&TWY@L)#3kDOl&%FcV^5r1KCEWIH}`0b=zb6&q`4IrkfSJS8wdiUA$PPtZX;0af!I z_)Lc#%5!Z*(hzNuW9;@}v2o@Unz-Dc#UvrFYaKFh_j9w&7;d-vxk(>(wze=uwd=42 z2~6n1eF7u4(mbVd!``mYvC8kSN)RL>K-!eDTxF$x6AzOc#l>FZYCn_pb>^!7UR z62lRLD3A_VOWT>Xa1qr z)mnK~`E_G8de+%T=u86QFzFt4`W?hXU`hskc!a@WG>X8w1V2*l4Pb-ciW7SclNv>v z>(5+h&}c9jk_shiD5tGNh+ATulkzu031fD2O&-_+^!we>5xTd&?&VTsE4;FWjYH*P z1cxkfCA9ko(!E6;VPjz295){V&W8uU%1H|6ZlG}~y7b2T#fnX4f{vvgQP)B>VAaLa zxgm;GmeXZ}T(P}L7nVTw1*LA1lW4710p>s;+<(20yj3Kfb)|)1py;g1{2z(fg3)+6LVx?lOZtj=z z3LPQQ$zY@=EQxTF)nQfFnVYeMKGOSwX^Z__O1j?sO2Tva8bXSbe+2t7EjEu3d&G&s742n#cWyh8^tBQ1NYN#qi|@TVW=30H#KjM)j1E0 zJOCCsBt$B525vhj6&nq=AFM=A5Uv6ac>w%7MO>ebCqcU|Vh^mxrsY^+E|+qXSlroY zBL0}@)zSF4w{S0dB}N)Pv_|{gE*?PZB)RT^IAMHu!r%t|(_?N&i=&hjr_zE$>xCt@ zqAgI8qac$SAh!vO^^j3E*c7&b?3e^(SjR!e;yK!&RWA~uT!Zkil)y4j0D~UEA9|-b zxR1cSg}14=;m6Fjve(3zg&S~)vZdlm31m1|YOEBikREIJSI57`hwsI)v=UPb*|Jo^ z7nCYd&Sa^QD^;rCEx(|C313Q$2M?N+GUIUh3xCU~TSmPyN|vi1-qzMxugp4DuUwaU zjbyzF>!W0)6xOS7L{_g-VZ91x5cD^rUeI4f`l|%}Rnb=!W38g~Do2Ospq;;p$6XEP zTdlGGDq(VF|5fzn#$7A2UX5@K>eUQRwMsbOTF_rj`m3e-tD$AWsa_20)zP}^uU=+< zb(C@aalUo5%=y*<8P2zkcBP%hhrxUsDCyd1l-N!KbzD0sI0ft5KySWYRqCOibJQb5 zY<(NVr*g4$|4O1J-mK#d#)_wnE5WSsdlO%*K7Kv8qAhF%Ed+B%iHB@y)@tMXCyDkR zS$o?-d#Tzn3{d-D616|I+K+?U$t@H)t<4ngnoupQ!!XYWITLoSm^M zjQ$v3bh-O{5`-C~5auM&=GWHdFlck$h(?LpW2-$$*2YM_!5i)WO$y!KCR#YP7XA>l zkX*4pvZXmB`KLsCf427iEod)QI|1SUm8cC;D_R4jx}c5ZnDDWTkEw)JL(fL0p(AuGvkC$*S(#ZksA4ll~Sml8)1Fj;A^R1F)frB(;^*?XeFhHtQ3 z3>r*>q|A}b2T7Sw3)?PN;XVgg~&Od7AMF#2i{SN>fDH;3&eC zZp3)r2=P2U{D$DW4Zi_=PYu73f(wqhITV5<9-vSP)-Vfm#M&_I!|8@0(kDj@Eg)_< z4VQSs0nP?+fsjAdaGF0saqtai@h7MdS5g=TNTvn{9;K2Tpv?Z0gp;l=Tq{@&z`<7+ zj^wJRfd=m6I9h5UpuVJr1Wx6K1U?lHX{yZ-Uf@>ghJ|Z|g9XQO4TE3JZdf>%at^jB zM;P}Ji8(lik#N5U+jHR%L5Mht#p8==RHs6m-_esQVs+E^)H!KKJ!U|d7)zJ)(HbIc zQP`VT@y53ow28n@nitXTC-&gN0cicResQW4ZZI?&v=>?VJS<*`QG2siJaELa&3}8}K+nMybI9!D=Y?%FPVt&vyE-6b2>Tr+ctnj-%1*?unRx zq(j&s;5zNHE1Qw7Rr&;_S`yi>1=YHM;d@Q2;^A`C%yTW)FxzHcQ04Rlr$P6R23^>P z7wNtm8~!|j=LZqVSSL9w1Orj{^^u*3g=eRCn)in?Q>C_K@+>e$IP}`6b7DL4LeAao&^>tYaWI!n~!%k zKXpqxdgn3kuZ;y8(h#NwS@xXfdJ z`obCDXc4CmCm4>^wR0A*5z0}?CRWuo1JbmD5gkn(+j z{uC}4POyoqdurT%sdrIQ54$-BwVv6dX&Y8f*^_uA(qW}vU29lNbK&6U^Xma=c;~bwf{C|Z#~`zH zC?o^M`D!?7fH~M5z+VHmQ5SvdkijKAf3zv<20IHPJjW2S$|r*)#FU*bg^ciHFv0qJ zSI858Zu}5w31;)ZBsus+BSS5}kN?nO$h--~%3o6ssYZA#{}(>i?ppge-4^GUa0AS5 z@on@0?CV5vkt#kIEg>es(oztAJatU^ulqb^U@yR;Yhb+F>8J_W#T@aQ58<5Hjdk%` zy&WO-_=ROjEXSr}FOud0i=bbpIj+XwjXczf29ZU^I^-Yke6q2#^JyL%(DXK9?3X+Z zqzSy?!EU&(ctYNq6};DA2DrH(xcmp|GDDNizC{Ugo032r zttMVGoz#e)HF{&PLCXOWjADrK5Lgg0FcG>@NLj9T0i(EHwACz9ks)~*u080C`U`r3 z14oAjbe15hOwKd9x#A3cr-Kdyw!)5FSSpU^EP#{4idm0WfI>)`GW&?P0gJtf-=u@Ua|&S zbz1{Qf||w)j1T6~;eZ24b|~k3G}}hV@P`Ia}V6^RQD?<2Q(T0+&|(3rSqk_zVdKQ6P3|H!Wbz*pT5Ir??+| z#8f69-HU$4zdySd{f>WsC&3Lr<>OC<&V>dYSzBNm)RYrC`w=o@or_}-p>51!(ur8x z`HP`AK>jv)2T3^)3Zc>U*e5|p=q~cXhLAIarNv>Tkm;d-0CUC&0_dIEj{7YHAx~i+ zc?t_CI&ri=4aUWMe_$wS9CMes281(NMQq@r!$|OemX)EBH2DF66RqL!lu&}3*}Tly z*Lhyl0ScT`QW0nf0>&#cyJMr6GQouiJp?TD+u~D~(`Yy#2Vp~#$&AQ}5Su7tYeE4< zpWu-$DkdRr2H6mh1c}i>&?<+WW8}cN03!<%CWPCTQGRm!0@%n(9JN9c_ys7mcAJ|v z%x%TewI*~XwH5RVm>5QHI~=0;N>~hCUsMuW)&Rnoq)yGK&>M|0Jj5UjJm=cT$6xxvkz$-F<{slEM1B)tI256>OuGe(ApE&b&%Ew8SNy# z53z6v{-lOVnFUIY=wq$}H9h(06_+zeqqo z2TV|=N6}m?hS-DM(R$hhx&XS!yJEO0$ba?tg6kEhY{!$61(0DV7l-L1^q}*CNE2b1 zHUhfP2clLN+%V1(mR&xeaDPdtMUM>@NkfHLE`xkIY4FaF>RdHZY{+XO%eNC?5jKkR z4t}PM5}A8u33Qe*<$R2msHLm`>KeoXY-Upgr=QE(HJj_}c-QQIxX!e7KgYbaHLuG#VGul5^e*N(qXeQSC7?PY+*mde z8{R^*Pef$_7*!BOEEfM{nF7BMK`yvA*m25ud&o2k$*!xqg{Fo{qeiB@5LWmL?7G^# z-+JeZ4DKY}6pGA1>TX{|OP*BFFlL_n0G%5a2%w)PziF_h5CCw*1vXpI^7G9{TMu45 z-g>YGP(RpOfADzw$=2Gv2u9oIco~?nz7HjiFVTK zd=|7^J(ss81lYT65I7+)gZcv##5sp+f-G0bS!{wvOv@Hvhc=s_$OX(cK`k%}?Kxqz zd3Ta!7gNhhBeXYBhLR99tawn<0uWU8GwdH>?WDf))Q+?YUxVfnt1jNq0E44bW5o6- z=E+!%ah3#YwV)`9gsbyHcdT& zLOaD47xRj$&g2;@@LJ33?_QXaQNs2?AzW;VP}Mmjf7r+6gjEZuD*0j(Xsc&cl01qZb5K$rl}^Sq4~O6Y0Sn(&A$FJ6K@6*!0Z@$!$72IS9a-8OA4aHrkPove$Jz+!5X0JVf9MAv#$G`u7@4gQgyevAku;~;6(~hPY zYpYTyjBS>v0AitL1pMwKD>kkpKNCMwc>*tvpuh8I`PDR1V)GzLzpDfm`Hm#TEN1G8ntLMQ-#Pil$XG)OZ~prg$00gBXu(y zrb0jx_{GX{5pq2?4A2ohhS&soTKqh;=C&ks5W(_?G$uR}c8Xo-tqKhssnBwe%292C zrZyg%Sc%aayED80Z*8{|Z=wh+P$7-r#cUhoB>xIb7aaFFg)Yb)F?215dNa?p12md> zE}i2Elq`d@{qT=t=Y(6H)}^Sx^S zkO;8!!Hh~W4J;z76-wo}4WvtvMxfKfjmZIyAf2c!+}cBTE%EE1`rEI{h10Jp(rx%3 z2Spwwc5^nqalm{5bj@`1dN#oU4k@;;}a1c?p0 z=;4G(*H8xGJdzd>Wc7TYdnxFkJ%CH)o`ij1k+G#>uk1m{r9=jVp6vZBSQ=C{YFD&G ztKP@V-JCTvBmJvC{+U)YzOfN=lmEzaVzxgb3Bq{>nVI#FK)_iK#l)kwJb;#nksg7F zDR#aO+rkNwakDiShF}gWkuU`Nn|*BOI7ZLoeJluWg#R)#5W_*p2j;t-x4q#BvqAQW zwC8zqGDO3iIK?t7NzT<6Q8-u_Ws9V`_bZF~rk1lh*o=bI-=nb$+ z$X*QXf{lV4TNG-5#S04>fU3JI{deiItOPhh^|9zd_1ihyH6mVVOnVhW_KD zq#Kvy1B@fv1FJz)FR>LG3pg*kRt=P(baON?2rbGKvChylDe$HN$)@#evXp)YAsjp& zSfDZi8HD~sR+2F6Da1)cGwr(ZY#I_|d0`$R-F;R`Qi4;XEsknulLReG6uLmY9YF&Y zn#c-!;g|&h-8m&NMPr5byT?@i$xDbyb`c=A2q(}$XO0hiQ*gkvWRxq8 z6Ge~pY`()KbseHUHd8ph)n4h?EKm|jY6@6)Ljv_2P)b*yT4=fRGN0x3;S$lUv-2-;X^QjadApwRv51p6?6`RGTBs|;a!%Ln7M zFWkSA8~qbdB%$C+a3xYjb|jiFD8uq7lMzOSyq$tXZt9R&5-!0{^`fSP(Kf*K`WbfH zMJ^OAqF_rph>II=;f#YEaW1-mHvo9574W1IV?yM>(!S#k$kD_L>&3fNbaxzotoMDK zYxod%WCo163f*YiKFNlc)?C0>7B36$nX+cY^X$h> zb^wK6OqIfVY>U(v;W)^@v@ldE37A`OExH$(#RI04+J!x2Vrxa^bb2ed3 zQy_;?QsA7$$1*^k2dZRNAm4OA(XIWg9omNC+dGdU6yES~PP$fmU4qjl&^?ynO-z$b zEU_uY36&IalN8M$MH;7IS)r7Lo!0GZGbmc5_x8ZAWx1A0Y)Y`-f*=aj0(f<=(Qc+pJBnyAg4!-kA}W7x$HUyENz*QLH?AGB`O=W0(&whA)<>&;S(3 z^{QVQ7k$MXPLSobVM<86+KJ3Uk~^vKjA@rlM%QHWF2>l5|KjT)FN>ltH=gZ$y7eSN z;KHYC;8x?Km;CSs?#fQ|bba@c(CQQ@Oj#S1K)B>j*n!8E40RGs7h*k z^Xl@F}o+TFDv7rE~Tn7IjuFS5pm`P>pBFLt$ z0CgdkK0}_Ge@)&&em+=?3OJ0a3Z88L9>;_{1oHRX5;#V<`6Yr<(i3OKH7O%(0yqk(~g!PT;$w z|1#Qd4_`+0*`eEdl?)QJ;nLb^`O9;uBpyj=4K@=`0x$=;JQ=yjl$aDkvQS4kIu9iA zg4~QcaZ1A`jQ+gh2J#e)Wp?Qh!zfLHlcfjGfcY9+fb3-P$@*toz@Xi&&z?Sp19d58 zCh|qL3R|K*WGK`qEW^fLhb_re2uSAermO_duLR=3jE4Bv{m_YFq8>Pq_2;;ibpgpt zFWMxI>Vz?Z!-23{ZnYv?Aq-DE6&i6sN9#{Y>TvxD!&l*9B!2}!_dA6noZR3oJfN~> zUs_xs`#qEcoMhOa!9m3PGhr9h9C~goDCoxrx0?CI4mLn`1OD!eGO+^$o6Z)P25xVD z%ScRFRfY?)(u9rz0L7)E!}7$`vWjD@v92gK<`hvpk)uqhm%D~BLMZ{W1Jwdph0!Ta zb{)^&J~yQptou@oEQk;{R%XYo<1xaohA}3aPV{+l3X@ggHJlU$xg>ZdV@;|gCzFvx zscXN+tQ5Tuh#w6_JCmS4dw!%(0FLM_X7x235rEHk1Bb$R=nntQ6OHJx|C zJ+R^hxI;Y}*E+b2zzTAA0b3eAncjJ};G|5wXj&UFp24>5GvFfYx&t4PmVxn=_p#AA zB0HyR=bJ7QkpjqKP~&Hj61k`l0BKWIJ1evYahmKwfEJeY2xmBinWPqr&J(z3+&rxx z_K7elT?qDY0?`saMfgHQ8HHpHKO$DT-yXbiqn{RD>5Cx6SUbrOM? z4waF~n(VtzI7%{GL>mbEoFEGeJc&$C!u@RnN6MVn9>)T)0Epnj9PNJUSIy>^!5qQN z_g}vh{O0m|7hzCDb3v2lvTaBn5D$qDE=<8_l!6sg>h>_JqYAfiifjq&K1p&%>Dm{8}Nw|0pzy%zGdFb%ZCD=eqaI=d^n(`9tai%XN}>k!rft0jTC5;?gC37RU{FwSlwbs3hXcs7OcULO z)0r)ZrG!5?ICLs2hmyx z84$^q#W@k+lH@h?925!H~XrH`(n+{X35mL4|CFwFWBo?ShrQag_wA$dl>xLaZp0Z-^2t z=;8EdxQ@fL#uYS6@OK|q8kGLZr%FuR(#l%_s(I(Kn8$3>3 ztFLHLiXL~4zm67p%(?(IR4d}YK%xmQM$f27hv<@!n(*RPOZ{G{7FR1vFOim+_wZ%T zE?P*zGP9I}0l|+OVLdF*0X~qn=1#(K;H!7u=Yd2$AY6`tHGg7}0|ca;il14vQJ0zR zogyWSsN_>Ca~Dg*e9e{%xL9&|L>#&o2$l?RLh}XlE_9GB8}LR{4Tx(v91Qg_yAqcP zYc69QF&y#$PG@8nA;?yW7sgobbl)CnS=+4{7T_<9x9l#$?IHZAR#moAYeSySP*)eg|&dL&U&)nc{--SX*#-O|drwV=LBuNJ4emHa)3@StH{NKDOB5Q`<6dT3z zxunD2?$TWx%|b{U)V zY|6X14V0IletWuO?eCH5*xmQI<>9`|B+XTerTToDlM$YW;zGzNy`^lREbzmjHksEC zj@BA6tyPQl;&*BTl^M^Zv{Lo_q?R;Gr-?245KawAq7r?GgE^5zzCB%kw)JE;+I_bE zjvR#>-X`ucn$wS z44eMAjvqMgsXuPuN7enfi61rh;a7vdZt>z#URG4W<$`!Z2PMgrSy`9g z>+8*Oy?hk~%F76?glq5iuh19DKjlw2uEMXpd$M}%zO%4P9ldSJZk8`=7Ige zQ|kXe#5YZoi<{}`Iqw|r!8NcZwrYPqz86$qqMP0d}qE1lxBWw~sgkSeaKUdhx+ zQiGVsqLW1()d-U=twfuF?}<+T!QSuTz?9tVbhkwru5m~5e_{HD;irVVti?rpIq3S< z`{Dn6`2K$quox<$1Rnwc8%0ff2@%fGaHN5lfbx0tz|fmduF53iyu%k+`sBuFdiv!? zW63!_%axcUqG?}0B8Ggh1zh?}89P0E;efszu1GH^wYdo|GSUNa83nqH!F|ZH@JG28 z9s(AEU&gucWNZXa%DwQQtRxuJ^k~=((7SVuRLoEtNiaUydyBTtYBm1oB~vM4VjPHH^FxJp?8q%m<^D>*3>=5Eptv zL@8gpbDQBO)xW_muE!$S_YHH7lP%RB{Zi@p8@TZi1BT4n`v?S+gAwNpQn|3FJUC3T z!7Ia798pw?Dn8L|jiPX%0z-UBQTM~)V+Yq4b~RKA4r|f+9^z&h zTBz^^Fscq1)iPod;pw@1zg%67Tp)M?3IM?nQL1_i2*Q9xC^jHHPm<~szeYSNqem_E z;T|GJc_HGxTqwvTcQf9h#LQlnH${#&%E^=QASY4K#ytHpgWtQskh4qpQg@7qYlJK# z&xY&?qvY~MA2LkUSDVQxY~qelAQJ5Em!jQWUB$9hn!H6EcZ7iS>g8)xw`yPWO}Q+8 zDvoUL@TK4RL$YmI4Ioo}DlEY|NZNvz@m%VCAs(V!We_D+hS`7-3CiA^i?XrE z!82iUqJ)wEa?})|)Wc2=#s}aNee@Nfs@9_ zV2Ehrkcey}#8s_cv16VgCL(fDWKIsXD={MUJ}!uWaSRfN1B}E?F?D=&bT0>ffCB_c zBAQ7xWYbW$!=ZTohg~Qn9qxT%ijb|Vri9?PQ8@)VXA_nUvsiW*&r7FcsVKmBV6SeD zpi+_#j3yGx%f4ZWDdCnMkkU;f9GXbtW^TP_ltU{GHh$2Wwo<-x1r%SelZx=q4xgTX zUkx|2Z$}dqk>Ja`#}QI(986lRl~%-ec=vv#=E=fv+*=s_vgCjp>JsQ_-RkM=g&c{I zLH8ph@0RU^KNK_dB=nhhZVje!T+T%09FDumo`v7k5){9msn%hdL%=0W#<(B}xB)oh z?th}cU9F94uw%XI+o6ATCi<^xWIfQovf_3H9umN*X1#%jf`PMk{Xq5w~cp?tkj71tS1ezj4J z9;nTyg`<`@KF+rs);( z?zqJW7rJ1_@Z-$6aU#)hr+2_Zi=qiwCJbrS66rEUDD^s+^(MG*8mI3#E4GFsa6HX- ziW8Sm4&)T5m?(Jib<*dFIwo{L;^uz8)5CmWtd{nfSO@2~nV1iQhx7(94{|_P4*c3- z*waY!H}Gs8;>x9|++xdRJ!SX)t_o^cSQU5eQ=4bc1Rf&4X(lQp|83_iS%YP0###fE zI0k%#L{~VfH^dOP0SYp>R&|AKC@aEThT{QCqGlPf z;-Z~%My1z4KY|iO($-rpDSJCWQB)5g1wo$6=Le_f^KSC@kvE+&!KVN*MbyM$Pp>`$+HAAO5tFm{6-0vSrmtjc@UIKf}FiLFPn3u`UcIo zJRC}>Q+<=@WCapLmxJ=|?{!jBkV#PJWj%&!5}Yw8K@rgXNQhWBz1|$w-UFxK;Zj%f68BdOVI+4`X7~oSkQ9X3q^_%nEw9u<9{2>?lGPHPpTiWu z@rGR>p{7(Ja^cmO_j%Y=8Ny9y!J#hAQ}~j>Bj@%MOn+nN!EXhL}gzi$$Q#WR2b=8lNrvTBS#(Dwf%W?or>QcF|4%GVojUULdudB;(O+>tiT7H1*Yb#-cvO5(EO+l z0%8D=uH|SlHy;}LL01lpK!_1f+2i=WroRRN!LBh$+q*~7al#HKs=aXpxiZpiU`U}L zkfYND?vC;BRKfNc<9p<{Yzbt4rW3j&?btE|J^UGH43SWj&S`XzCE-k%qw3SG-$oC% zo^L+ee!9E8^Q5rz4FCUN`^oy_XnoVYkq8RyUko9UZ-Ui{hrIM9*tC$@pa=XjvBCpD zro^6S^oW)$^MaQ%WZTn(-@Z0B4?tMDbvzJ1T+Sca@_`oOotN#wiB8?Vz#x)MjDS@@ z5?pbM+LvxS9=jtc%^s`;umgW=Ux=RBQxGtLHi4{(US)sh8*Y|X9biMRdK8_XETegP z3T>!5yvP81HEvBf>h2#|eNE*r{xH|C0f1%%AmRl?dRJYI19h?}v>@nzFc|`Tl2!mhi||Nn4sMx814t*j z9F%N{c;Ql;yiAH64fer6B@>sCjV?V`(&|}SE|2+{ZsOLuAz&f^v?SjpRGf!X56CsBTV6g_?LkQ|Z+k8!}7a?e}W1JX;K zv=5e&wFZe=GHnRw{Y2aBV6g|eq}{^d>IgSnM0<&5WCTcj&%7pb);XhJ{rspgd^0ZIe;1S5t&t6#x;HTpMx5Rgmmi}1ce5Wr>BTiR*ud$-N8iJKlU!;6!%G9vbX_pt}{e114p|jKOFd5BVCRJK1dg=R?`)h|bda^a=LZXAL7?IL_*J}h`_`>nx8(`f^uEuj z&^}Hz&V;>_lw^mDJ6>Fgk~oz1Zdwa#(Fe%x7ObsvCwtJ&3*7O};6`sQ*l4H)0G%O}>ooz`PvJGQ^ovON z539qY?Z*$e|B{P{q+-bFq(etvAOVYXO%_&L2Z$w*FVXJ*E;$~fH_;h0f|)=h8K!M~ zLyr^|Sk8Qk>DI~#RXgDt;*HHRn0I>9w~9vgQeUkiPDe-!@#L=oMk>4g%*%aq1!#0W z#dng}p%O?ox+&4#S>;|=4m$|06wE?l2= zaPK{Iz^VBq1~zYcQgb$61=PhRu(2f-|zeoSpIG`q-#;H?bE3hHMpJ!a#RFYjE$ zykRJfO;X=YJmJ&IT2#p0uxMh{f*nO#kXJKrRycwoA~dCz7zauTinvmqb?D zOO%IbCgMvR-vX;rl3Bcx0t+!Jn1OH~#u?1a8JE09EHa@8Ft$C~j8b6_)b?EOe3o8h zQd6rXis7Q~Xqf_~6!(@bazl}ZcEP?p&gxWw`f}-0pcJV2((bIA8ZRUd%ZwNfG5^sn z6&Tm`M|sFzk~&K`r>*b#cj`1WvUY6Ul}k5u*ZyjH7Y%mpX8sDca@*7q$gkTrUKPv# zn%uT4Sp{W(_XTy^evnmA_IF>fCj0w~tb($?qo72h78|Mk{RTcTx{WiyA%NSrZr{B1 z-Yq2i<39hRci!C7^!^vw?Onh~tz0bWsoFTeQX;xB84IT=R+x0_oV$G*H8OX796Q2U6aS-bV#ou8N- z9SFU+%@oINps^r$*kw^>Lh;ufovnWX9zAUh^)d%{H;Q56+P2gfQ`(I^g!VH8?)hnqv~=8gN; z*YQqtRE=CtqW8}vR7ysX3WhgaQ&}%6s?|iiQ7vi_0H(22F~IF_yc?G>740zH{})ifUBsa1O!c zX{=ROG}8@Gw^E5d!F@0(<_!(R5T9Po6J)f9yKv{-`1ZFzSBI$LxRwAb9VgJ*f|}x4 z$7Gew0%v0@A($d_iS6SVfHDsjma6}T|B#hcBO;UJ@vGsHcu_3>UqoFTcquku6kxGZ z@s&eJhgG$RSXH@tU4!k2u!x4$g2e1HiJ)F%q541IKaJbgRvGP;OLvwwHt`psv1M>l z2r3+z8dfkKc5nENxA(!0^((%V8*H;&C6edY*~bz4-~h|D>rbWUt5-K}y(c7PM=;~) zMK(}n1NB?)BUrFpy7k@){xmTDN|A$L7qt>fR7yDISrJ=~21CL;B4Z+i7`1OdN~JZt zsW!`H9rDld3nX7*fN%wku`qvdB5cUM@uyJwkN6oA;TYLJir3MRjR{9i@ea+@rM=os zK+%do#zY;V==WurQ07{aq<=-rluTZBvC2oNEHRKsRa}5^vt1a$n*h5e$xn66w*_8P z2@=KiHHSdXkTR2eKuA`T0o$P@-gpD@R!5#xY>j<$+S262zZkU+XgPqXla_603Dz-; zz0x$DV%+gyyZ++o&a>U$8Q(@Gd-XoS(J1%J68i}caPmY^8ePuMiV2$L?Cu-;-^xA|mRFv3( z*eThaqv%NsNp*RBx)TG$=Wo$5v*gS9%yml0VjLa0D|U4-JLR1?2L|E=Yr;QK%kWoD zapNyJWStxg|JMgIsos&IRq(`8_#d)W$O_6c@mKietsmXNBRK1YUR+Vf88ZS6gv9^2VN1MXAuc;EOA_bn68Qw>2@cjxT zUw-FqP^my-wg~b;z%ffHj`?r$&DbUReWlV+=H{5cu}k+;SsBi-2mBJbr^&i8+bZ)e zL!iQG{Aw8%Zj9yzB{4!~iZOmcw^ZnOE*4@PS|{7O#E!9msPeJ%2tzf7q;R81pRrrl{p zO07g2ktaXY9g08K?*lm8`HGbv+gn85U!~-Vjqac2)r}3V2Fgte5ZL0Sg6D?K-Ey>}Nw zQj`TBsNkp?2f?cNSEmq90ih%^Oqs`?;P3%)R@f#FELG4f1QXEhogqJdjsKu~d>38= z>Q#CwLe>CPk)o^RpP*13v!$R@qX1Q{T)Xq%KE~fFU{^&ljD2mURQl)pcv0uF6qnE) zU{x(&yLEemBPl`xL1!5Lbq@1?;yhNR3aVFZI$X=Sdt>WnX9<0K`lLpy7a>LIs7^rL% zm3r+KW$0q{msbHqE_nG<_f*-|r%JsJtKYBn8=0U|V)<_{ejNu-J`1W;fNtqN(D)xz zdyMh1$6|ty$9$TLkL;IS#W2>PH{fhcAUP%ga+N+Z9nV7_w;ijS3cyQh0n2&dO(d_@#Oa8+D zyI;-bf;KKY@?_Ysg z9juGHYyy0WKcQr$w>}dHL>7>n+Vlldx2WBd9|~=RMKBcru6_m_WT=d`h1HTqUb|Km zUntr}d9M($@Eo&Yru8aMc<-)%@*EfGup>DL5r`n6(h=n$W#A?Os4AVWC!IcG#UW_G z)>~*#P7nky_Dv>fuckB}U8+L=4WNzf9;%xJnqyt)Q5TD%^pj9=R6;=RiY05=5*3*l zIRzvfkm>G;dW0*ECMS{#$4eHmiI1~=Zm~5^44a{c#rWw^Inc;N<}>Vvj3suJhDiRT z?AQ``^RAGtx1?DW*tMM$I1jS{Df}M~(fX-i@GoOXW12-f9bT(9R!t3r<-)0ffeI^e z!O+lP4K;1hbf=^?xRbVqjhq`}UNm3iQ&ag6(!@Jdb-5Y1t= zjw5~(-VX%+&C9_35#Wf#!?AN-8d@rrQy1-sCI5X9LFDnT_*j)k zIfGr>!lFW?k^LG{8PpAI$urbDh)lHxwqUWitl0pZV(aB}XO*<;l_c6-LiY7(&FjWf zJ~+WdwSADwB03^*nAdtl0+V)Y+)^C?vGqsD;lh*FYm8v8`!gaybjOi+O&WKd)X~U6H#CU_^$0$n3FpBFG5GE#JAE9%66s zuDNUz3fw1lh~~RCp`=E9E=x+Lt8G4ErQA`mAq0ZEE}XhBL}FDnrK9Q?Bo3HBAy(fM zXLhmrlGIkmFAG(>b!$b43x7dlWzp1rgEFu><3Et0&By?Qu*t(u?8%ftXl?i)%HU(x z6X_36>{x6I_ADaOZHnvbDlv-`rXCh2KAGDjDL=h`<(gJdA`d9i5G6De%+dWRSOr_J z@d`)P4(W7Xvdu8wb9u!rZmg=li=h#u@3JM=OR!{XvXK(*xiK<`-In6U#CZTX!#B2( zAjn%hV0BB{9&u&|m$8YRRbsKGieodxRhuMB-UPghEkdn{7AgwYwTo2e;XMY9hLPOd zZWcdZf405O=yFLg_4)ea7h6lqGnr1NA672hB%iLqw1FLbQ?N;l4W9ErHzwC7GYV5j zIjLIlkGd+gK43Wzh{h~$2MJS4Nf=uJF5b5DBto{MU4;JNSiE$%X;uF_TBJg+J{xZj zks--=z#Jjp>sX2A#Yo5FJQMkt4Ctj+)e%pg4D4CQ>nIIP(>y_9Ga{l8HdJU_P$fv77WicB7ld_bdOslCA=9W9xH#jh{7r=P~vm-4fSc!6t z>bkO&|8)hUq}iib=J&d4=~Ri#>|t&r?AeuK((Hl0XpV&i!mJ`Rd!QCJ`bs@CdsJzg zs5GwK`8$B7`j0SN2%u@?s4_VPmfsmcXjW6B2Xt`YLcRQ6X!xMYr8bP)SAL2yXJ`w& zOfuo2IhXJY?QB|W3#^4umq>*0&3cWCK3lnSGvT3_tJkU0c7|q0^d7-t8D;^N3v9KkeY zm5svxD{#J8aTKnitTiwf0pk2Wb>w%@?E6#@!@Ku_!7K>h<3@K3X>=IrZ+awYKbK24 z&${xhv$FmEh0k^rNv+t7nekbo$O4a*~uqB<-z*yx&vVRK?|w_Du@GRLF__u zoiPt6Y(IIplcVgW2hMq)J>wUW(iJ*+=uS#b4T$>`b~>)v_1sHd4 z9^msrv?G80kx3kDfI5W}hCOOat~C8{?cD9#IMkwnQc?orTt|$UHh|KF5_D)B$HJ&x zMXiHx+GIJtf>n}nDGF&YkCf2zC12m%ZY)fD4rUxoLC?1VE(><<6a8SD^OZ4>5d{Se z0EY8UCV)A(4IRR-Z-ZrBIQ6SFq-T>9O{tc*A7GWBJkS=AXgz3={6r&Q?I2Llu!%Lc zAgWgz0SUTr*=JG_Y%LNYD8X~ivPIkr?!bhIiUT6pmnj2aE9HN@NQ{FQx0?BX^WCVzB*X~fBP!Epj=1jP7hNUv!ZNpB6LxLJB0jy*yP_^8-bJt=+ zOxSE5gW+Q{D4C_EUa7AZO|))!4HFB~J)RsJOA+PVff=Xwb;%%G6D^lLFO#*0Nr%i2 zXsvRysF3D6W1hUWIXjBG;7Oc{2av&p*(JLSV2xL`R8FiFN zpp0xWBB}jTEP_`4QJ&Y=DZ%M`r5uy*5M2Yo4nJ%)O|*q8%TTKJb3p)B#}f;Rf@jZ; z3f0?(&-8(X`1EW3rd8cJ{6ua|JN(4^#kw37(O#~Lls^Jy-@ak|kz;067q zp%?M`R~+1R$d9GU3k)AVBpDs$Y>1I~OVUq!S;YxUDUvi$vU(LpMybaWbfY0hGINp; z4Uv-CuT;eUMBxamnhxP$3LXr`NP0lqzr^vta65OSkJdDjLSkH_HAPoT0~n%yb+ssI z$&vg93W~Acn2Xqkq1!5H00~egOivG-c7v0^4g{}AJPk2_=H8C|Fu-&QPFc8~GsPOs z*mweUlgDhhV+p0W5y<|f;xFDKS4x;OB%aKohN#4e)8b?VS_rpjt8^zJfH+-mKu2~# zg?hLZok@Okm~%{vC7$`C8wzX^E=sYd1uCTNI5;@KB9g9>s04NIgPTx-1bu=H;kfk{ zxg$=%4Ml6U{KdtoEx-dVrQABvla?Iu?1IPtk>moemm{D5#@{kTlSRQ7K%hzTk<6^D z2@27sp7SrslmEEm)**=F>Bg>*3y2My?yFZ9K=Tkp%KUthUy zLAiJ%^wnbTrRz6$x8o0=v(mACU{Bkm)NAO-^i|yJKoV730Joev_nuk75t;A}UOIx1 zKsgZ|c|h}`^cpls!uFe&QZ6J%C>o(>eYbB-<{*C}#AKf;4W56qw?T8k2dgc^vLp|wFG8H$w;h_{G@uoy2Iamvgd zU4{*c{{be$6q1PTB0;EW1hrI3lp6x>;`PjkFxVonRiP=}Nobn@8ipbevc*ckP(LZJ zk&sZwQ$Kx#Jf+Q30K5x3#t}FYWB(NJ3T_2iYsnZdIpvwGA(IQ}CWbvqOf}QCkh`T{ ze)$pxPLGe$SKzc1j1F9Kiw+M16kLj+;q=E{Bo3pkO^j>8YMe}BT&MQ;q-MyS#WJ4o zQsoGHHsY0Cx5jNByLFknZjtdUw(avW7d>lje2aFYQYp!|@J1wi{1xjM{zCjkR4S4Vn@zr>u?>ZAk0rx5N_Hnt{D7Gd(^!efv^D@5!DcqeVgwSztek$-ZLUJGlk>!fO z=IKm$@+VtQw$>l-eDYi2{w^bVyEK~(5VC?~T-HqXhCGiK}Y*5>Zk0}WNqCH!n^tAR}EX329>0XINWv<{Qv(UKz> z%SDf}gShb~1u=5#i_OO`9&E{3{#c6RI@8T*N$lvoSVv|(*ITkPaJ}Jch_TWJ4Z zPmB-)2j+%Hz795n*^t+Q8B@-TOX*gMQt$`(Qkvqu#FCg+MfFwkGq5-QLZm0GKDH3( zK+d5gAb^RnTpEN|@1w4%u4sfU)vjJ&mw|$}R=7TVBclxYuAdb`-E>xnfs_t7E6mi- zN|qe_)=J448<{%;#8ahwEL)8sYFdht5P~;@`TYZNC|urumcr>>Py@#eB}9Y|>&S|v z6lQkGy$^A!?6bkc&Ui;%rS=m%x=rMT*Cc8$ITq}Y#WJ4oUH5c*R`w5Pj`)`uaHE0~QvTfH|jUFf>6L1UTeE(O5 z9MWKo5q|+bR5;rN$goQ)h*MA#1VbB`3}sJIeQMQYYmL~ZXkrK&7sq)To~||U3!*C8 zy%7%+h*C322N1t{?dC6oZ-(5caUC%-l^Q;YROv}d&`QE?357~S`)8XW@(JP94fz;O zEI5UTT3{o!r(*T5`BGZ_*)_hCj`1i05EME<*-+>wc$t9VN77yrfDouSRMEp?qOOaj z1@|^c4GfYoyPR!M#NsiZ`63~C=sb+nTE58CR2w$c6IX=MtjUgiz$j#Ilxh%oJZgN0 zYecec)Px_0gF{rPk}pJ3)@h_m;9NaCxGcja@N4}FkCPF^UhtB%`Lj9sJfBm4eOGNbJ)0Sjs#pjZMK{*Lvg@xSyhSA;UlLA%hy1X6f~ zUJ~s#(#`&IMzfEl*=*^O;aVylB?L=391$(T^Cd^s?QcOY>7vodp9QCs$pn;4Jmy4H z7^sm07KNGMcfJ^^{sE*h6ZeG%AjGZ(28Q*ZwGH-PM{AT@3i3RP+QZfxxaahp{uo7T z`k*1S6lgR=rC^3Zy0T#?e+zB;O}7n`k=731EP5-3Bsb|wGF1Q0J9=C z?X&yosugVEkv?|JL|6MG_`q;{5^;nA>#6r}S8JG|Ed?yP_NuVofoCuPv=l5LG|^`@ zgh6w1+=nO|loEUw&$R_G2HzwLW?|IbgTd(#)wD(4LlYG8FALqcCzS0X9u;|$XLaVZ z8D6Q^Ivlo6j&NHW{ca&i25Q$3r<=SHg}V|Nd;K<~F8Bb+zFkCc5E`AZZtQIQ3so(J zs~;Uu9g5mg#O$0n_qrx1ylB7lPXVc;4}l)YBdvvChPEg7U`3$jxnwK#6$E*iORDJa z^Mgw1lMeg*OG6FfLU_S)E^Tk4R~X7MF-Wx;q)%leJI3lW@iB~HuGKB*$?Vn;aBOEv zt1u$qLz(d#l0DmQBo-PmHB{~r^x|)FjvHqH2Y+Y8A00umuc}4D?Ppx4K;tJSiB%HW zLmH(hkD8z#9@eNuZ}DbaMPMwHzujO|n?KHcla%E(=vQy|^arqM0ZE36HV>ILeDz1#c@gNMt5j zqm1+@cFS0&;8ao&CAC%9Xt{XfhO`JjJm38d`-HR$B}&Fe2P%%{-4$y7D;Wh|!G;Oa zRLLJ=AErWO3<}tFvsqCF<<=eR)t{aTUdHxJz-B+6)@gJrOL4vE-nYlw0-%3$Hi=HafENhMHcW&KQWNIE@jS;d7 z2&d4A8g&Yt-p2xQ$1rqykLcmGd_^Z{>VkPFn!+d1cmYsi5RQ-{d>v!^A1EegTFd|U zb!w6&E>Gnr*Z2{y(1tJ)EI1B}qBrQ>bukCzB@sZqs)h{VVfWc(2=9k@kwJ0w$1GR@ zTD>Qb6`=o4rY6kuke`Lp@Z>O|X3sKyRD-&N;j?5(c#VwUPy8K@fV056^dPP_`!Y|o zjb0w4=O<$-@`Jjb`0pkN6rwg zf>t1WG1QGQt5gEgr%4m>C(fCnEis}P`RED|XM3kU!!Hz8dmr>5lhDIdff!1ksNT?= z>AA#)2%5L}g=xoS81%2+mB3*tVm?o(dZ&R({7&UFg)~qBy{KsE%n@Bz*c%RBclu7> z(_e_h>BHrYdlKNgLh6%Ylz-6|WlYkcjRrj^5G;e_%sBi>??k94iE!qkwZGhWwu5V+ zBe?%RWiIEJd6Vx8qdt8&S48^R|;7qI?Azu&S_sc-1P? z5Wrk+m?G~hQPYN|a}Vbq;$Yl?9TY~~v0$21lj#KuFIpAE>JF|k&pX6m((2HbVgj?% z1=*Xl6L#wbX(*tAE!KMlx1tuIajjYqU;~W8-G^Gt67OAx!)dAB%kd)9>!9!$%kb`Q z8I|l2#N0njUj6HCA(|HQV$*IT>X(t0uvLgRW=^z;i{`K7SJvNE?xs4 z)_iFuUXTcfK#{o$aK&yvvARkn%=0J=e$m6f|$CAo57XFLGMn-1k2%-VuN89&Q_dLqoIg#d+tz!yPw3PHtTv770Rer zrY+!(I|!Ku-LFJ_L2_0CA*0WM9yk@6dTeQO~mz+djVo$t$`0F{*v0aOHV`qvx2y z&)5RPtq})!z+SL_qNNwI+-J^`N1fz+Zl%OhmG1w&26JA#pn^N(a~^% zJAdrXzz+D0*dry{!r!6=yQXE0L&jrtjnH{iGE%o&c;X|iq}Air{%`C4tzR68V|iK%JV;s#Lw+@VpFNygYtP7=4-GZ z#HX>-zROuB{Q`0j=HR6OKYYs6rE(x?#zeIT@T)ECw5L9eyarrizDIS0@)4+azV-YEqry$*yn=30<$DV{Ih{YkVOf&Z22 zxQqtj;5Z54SI-s#7%8#=Eth(4k)Kt#Y^?*J6(+Xdn_w0ELF8c7j#`j)_d1M963z?$ z&aeNucIQ|-U4!X`tJcf1a5#~yVZXp}r<;IIplfwOBG~xlz@jdnkF?)vA>X5_UnIT| z|HjidQrhBMZQ@&PA`Tp_)83M(Z|v|LRKt}_|-S=Ce>vwl=xBb2)brn0i4{&V#xePAMcxCehI;kmc<({3w75C3*Ov zYM?#Mho7C=3Z>W_rPz5081LOPKvk<06;#NBJr`8o%mJ+74Y8LKUUGwM%$)*iU0Erw zDx~W5Gav;n6F^H%YNc32@&$_7@DN`BQ0=bdB?oi3e9(&LHUnf8qybZql`jG^ z35~mi;F5XG09Acu#Xz-s5m22X3t)F&3H%a5ES%m9z^$&ho$?}pvn$pvE8r5-%LZHt z?l!}?i|m&wC4@m_{G`{har8FLJ5jSCQJ5Tkqf$TXPT3|w0++um8NT?Ai=#z|H8i%4wnS?JN8%Lg<+wHW|w;Hu?|n}^g3K|k6hgqURc;M}r7Rx6gB26_>J z79f*&gi8r9nb{0*;V_G0*o6dI=d87ZhnEm)=8d)q&H!HBdGju`lYTux0>AITIUw!i z#IF)Y+nvX+@|X65%FyOnJZh^|XJNaD5P~RPMxb6ke6xvV<5?Y1YPJnrMBuPX55EIU z`$78d+?|f%Wt#!GTHRSUE+TM@hL_g(?WZ;aU@Hyh@4Se8!vexDn^i;4q-TXEtTakq z2e^nWLtEq#`^(3|;<;txR-@`|85bc&Z5G)AE-S<^wHW|wc&o-myaJN{;IcA(ncO_V zVx@>2-l{U4Ay@=9)jcHH{uW_r|0h^xIkjx`TB)pBgwOP^~u%TsCgcsm*{? zebou87YR8)5D)^!FCW{|dCdUTDlR(|^27Bza|0X`#zk`g+o{D%2r@mpYV*qm-D-K& z`7yUJmJ7K8rV=w=K2)2UVm1Jg6x?kFXNYdW*2%LzxRrH$ zG#pG0af`X!e0SOO(&Qv(K(AUpr{Iwgd~v(^Xn)u}xr8L^r#1s%jjD@9yNGRVG&w!OA0bKy=;h8aXpb>S*=!yHgTji z!VSKuG#to6w7d1}IZ|{yob)B!K+}sPk|Cr|{kQZ^T#da@Yi69E1IMXw4X7nV$UH2J zQ~M9QL*zYhGC9&_rfDdMFlHA(JLUK4^W^pw0ToMN7f_9=A?a+JS zQq<$@>}b*(TdTQmTD=LbcYyTg5Q2S`tdSP+1Gz_Zh% z3C1I*soT7jd4RnvCm{lo_drt_AT3oFS0DFJae^47ZAAr!=!Z9|I#?-?=jJoB>8JY6Ym*menN>;U&*N zkZcm0mld6~fP|WoXlX|6XOgHyvT3+$sb`cFM4F2_T^+t9z~lvn?#4~r18VE~vv|Sp z14YWnT${hP{x5jMJw?olSH1ZQuJ(_w;BuE@`OcM_o5)GUgra3!V}#3-lIweo%^~fv z;F?^Ii2F#8Yfq7=7j(vY`gWhVS-E-rx}-1rjpQ?9USy=t-e8}v_`S-ppvyjz`64~I z3;-jl*RLf9Aj!=*fCkd+<_)_7oU*0V>%@h@#3-dtOoaz(0|yDwh8g^rb<3ebjDBn! zOBCeu146kg(pGD=vR#o@!VS>2y2-Rq4kKK4qg`SN(?+?BPa{b`qMr+T;X6{ObeYW) ztmd0U(x{wI8f6(oVD$wPUkE_JwhP)CPy!j~0IlK)(;kA7i{&lT*Q|Y>}`$*a?Zj`g~i|PDw zas!@@)8|4m&i^5{z_H9>W_mzPUO72H4n_fJw6G}Y$B;1V?w2KA>c$1*a&gU+?{944 z5ebQlNY!q+`)<9z@sP}&-1*k62Y9WQukp^E^2P@Ki!9L(w(vh&QO#E>nQWqbfomh( z=W+Y^I9imvspdcpFlcEhn)Kh`7Idch8uMOP8NMxtTldAo!FW(W7SUm}c*5LeyeS-2 zQRfglElABUqldd9fCY<-1QQZ3W@89yzV3n;wGzm!>=C9~Sq1-I$}N(NL#&^MYNy@V zn;aIHaZWBBiN;h6s^xO@iJ>lJ055E`Ctwfz5NVmM^u@!6ThFkfo>V23nxoff4yN6U z(G1g$sdYw}dlK2r`cdl0t$5uF9yG+!a?U zvds(%;=3X9eiCfH&(>%Jsd8jM#bx)$t=}W33U~s$|t}4QAFBvWi*c*&PS%E#D zxYJ%x8jJUk0kr8}>y&9hBYOtfk0BL^Fx11|ttBL{vFvO1!heu8^S{{qg0GDYWyNhM zjbg2?3c+eUdVs{II8#A^oT-;IZyz`^YRB)?hp+dJVSMC+|37>0;$GEtoqHnzN-RHd zuSt`hwr5M27;MYgcY&J32#{?W3H34BT0(|`T@z3-TFuDSN!62eK- z^L@|P)MD?o*P3&#c^Ts!_n3(H7O&-mo{fMAg-g5jK)kl{z}*UDs@qbHT*$3H$6NPw zVmOk6A5yszG_dna{wWn82VmyzXp7U=<(w;@uMVk8JN%f7U~!07s_62rE)3fB5_Psk zeR|Z+$PZFUu>Bxa`=%d+=*^c$el_`sGYC)g^&fr{y$y8dd&fB9$c%6E#j>If#6vk8 z?r$kkzF|5U$!wZszW`D=Vo_Zz&so}o&pXTSy}itKPLGQDf3>+ss?}8gIAyk7*(4>l za7t&bEbOzHg$EkxVa=Piv<fyp!|1pC=eS?H{UFbZ(Gmc1ua8Q$|xK)%|@weych}P_mjS4|MBh%oL0dEX_t0d<(l7RYd`0GgfO0R#2zgA9U`5jxwT*9 zP$?DQ$fS5zgKu*=sGb1rVuT7GISrTVw3@ ze;Z8DS?Af~9GUg?=DK(E1zpvDe)O4da?0wjX{E3B`+VZ}NLHOb2mhm7iEGtzlQ?Q0 zRS$Q1W;mZi%Av;hR8fjise+G-N-cTHLinb!hFf>%&cU0bVw$S0s9d}%-ty>c$El~} z7TfYREZJ3@pgRNll=eW+q`{~p59`1RAgFVPY6Albm`&~xJt~Qh zKXPWD05eOOMs!9h%>iU>6dS57#Pri)Xjj5NqlaUz?0AAX5y0dPsp$omMjsai@(<=#{bu{t~{rkV_| zwGwJYig1a?O%O~|<}wwAP0iw?um{X4MPYNonR>TdBtE#*j8tBeb#`+>{O48dFA@0#@=rO)|11=afB++aP2raqw?3L+%7koGkM zOSowL0y36%p|=mb!u0f0{YY)L{Pe#}K8-v!{WSZX2i>){orzDihUKN3Y*49s=d4L? z2vT6l&e{{FnYV6i71XzLXUA5Apk9>R^g5{mj0>j-X=flaxeumglC0TGw71h}Hirp% zxV=P!pKeDc_vS@XiKp~?(K%12hEj=Ri9bm{uw{LE2ytnvqjI4E=jYkHFfOTzmAkXEE53XFha{J2lYqzphXj>V@&2p4dI*q*5 z5T`a_d8!wq9m)!;q?6DH>V^;2PRyFW2K5NN8xWXY3E#jk1Jaz*PbXCvGDz6~w!o(g z`UAlnsLa|hcoLGczYgB^Eeqeds6ztJC22uiS@4yGHtEudlR}^S27jZn@*oyHSU>KB7 zHc;?1rj{uv#+#ku<^uE*e-eMlC#{JoDVzYn;;~vhWn+3ex>-E^zAj8MW59#Usc7O; zSxGDv~h1r+KnoW~55Qh%I`iWNCRxe})V`;S-h!~zi3_H(T zl_lzZGR3KBd(i|NKg|^o3$d<+#O|CxLOKDf-2N@AB8Iuc&08t z*gGrg@p(t~zXSl;LXeqKRIu0WjfSZl(vWD|E7^S^FGw>mJ1`_QO$CUu%IQ!nq-t)_ zGP)%p9~B~ME2@A+n60>m`wKr}M$1FU7!@?7N8fFstk^?MxF z%?b(l2cpe}ar12b!79wzfFeDt>ePtVgOId!M08g8S7!!ZA4)U+9m7s2xykB4|e0A`70QY0d>b$kDZt|R$c7|>CAj!|{` z`D%~|iD1S6*~20IM;FX|c{P)mp$+nvq>hqKgQ08qn#FddccDJj0C&Y+3WkHD2Z8)r zPf07Xq?e3g7C4o+dOi*My*GA zD?FK|T!a0NMAYUCA$wnN+-taX0MKd^w9qP^x0LBLo zqqUYk>ouC0D#zZ9lJ|*H)K(w^<+=d_<;e!TheH#|o*#+qAU3Q@CW=DH9FJjEQko>N zog1pbXHk)H$c@yd)*07%M*GgZ=_@Bxhh%v!lMfE!IME~ZZUU7~=7n^oh9({VmPyAq zA{|t;L?v304xSta^;mr=^{~c1QxEl?1heDrkYOb1Au*g@Xd3FKqLKWRRiPtLG+zTd zlwT*PhYt0;_KK!WqFN>1&Dbj6LPGg}9U{)UD;e}Q9|40BXI1%UcraGE_9+%IX;e$o zM5R8@z@c8y++LK$3%+skzo77go_{#exV-cAf54Y0o*}%8bdf}*lU8%3Mkp&biRPnE=3IC3z zw-WZ|dDH4B~B!_2`{NemLDULnDm$xwZ9cO2Yiy9vP`K(WhDMSZe`s}Kq%l8Ltx4%%pUS!irF`ItgqgkAMS z5Hav9&)tBscKg1z%99Y_WiCKwR{=PNd3qRw%yRRvy1*pq8~?yvP-xRU*}-A}eHl;P zOc&TByW`{yvc~!b=^t1`wLV;W)1WG*V6T5`Hpqg-mb90WLGWEj)vX zI)3uTC77?Lta@|wW-%h0^U9kKYz7{TtWP?0>cY3FJJL;dAY-WUsgf?T%<}ZJdL%)em7%`HuSZw9#)>EE1Q&S%GP!X1jgrpXqK6|{mzx@Z?ew6QP z8Gn;RvzC8?<5c_U<#(1FBGg&_VmUjFotb`vxRMDR%+N33t5_COxYe1Ngf8FAk1I9( zTYDkjG7N>k+j_naivRcjggmBTT^z)gJInvhfB(sU%Pq+wMCO%LsJEuq6ZR%JsN9sY zzGD6MCm*BsGWzGIUh=Z)bxCo%8g5qS&Y$nx&ILnDw1n7bcu@sgy|{kq7aP|u<97AH zh2+y$xL{RF-mBRz4IA-4=7YGczW3<8cNgzgD<3ijDSDWYod<7G!`a+9e4;JD?^&$h z#a<-OG~DX;)EM`#@Ia_NiU+<`AK6>iY`5*Dt`gCB%$BG*g<2(#U>XJLsNj6<{wr0A z+ansOOp$|;!cC6bfAyF$$AJupg((3rw?4Tj9m9>5wxn)jYf*c{hy=}seV>@1Fe2-f z4hg$bzj7en&anPq*tSj%9a=Q`&xjUPosKpE1RA5!JsVuPH(mpF((^ zYeQXsrZ=r;aN}QZuiUtL<<@N(4H*xw{3RfZio;r!92)eE&4`O?U9(3;bJ}1f3C-gR z@54de+jei-(rB0D&I$f|F30kH`%_U96z6u$_}1Pw8xRy}@6PZl&$lwj6iuQRsxve5 zi>$->i2S(hhO!A-i_lD4dBp=&QMjKw1cBhG6LxI6vm+ih4q|?ikE{Ac21 zMxk&t&O3klo&StGy8WNX!KgdK;#M$Z-DDq~-guAUMT|@yvfP*PY+NzC)4;^+5(>gcB=J%J+Hr9@mPKa!KoP=IR~Qp zuV(BE--*RD()!BR)q!I7CLonSnbinm@AB}891F5@m3X~0!hZFcZSB5S0sqGr77UKL zf3+9)c)eEH8mj|-RSQxOkK|3fI^-~{(h(ELG_D%e%g1UkcB7!a!KyGYHv08r$C(t# zfecxPofdnex%m_F3Y5;1dnD1&6f-j2)N8uo(y>-!oU;+w@^yaV<9LwUUG1vf*J=08 z&MBYfw82X;(H8Ol`&p0c2HcA zUmCVrgNum#%;=&Q$II;hDO} zdz*U?SGM{89rUEz4_db*pZnsapT5s@%2!W~7e5#xDK+pwBF16&;R=jzGxP-CHcnSv z;DucUSk^Bh$A7tZs`laLbI>&&$!$3AJ5nq{bq8Mczc&({Fj30&05{lfh+nVkbobVw zC00!&m#EJ>g9g=JmqI)2LiNBjE=7!{wXJ`u;^!vy4iSzi9ZFXRXY|*{_VoGpae_m! z!VikW4E2g{n;}A_7fu0nhlbO&gX#Jm{IMPCvSI-P4B6Uc0s5stzrPi}V2^iqe^^M1?kQl7AT{`*Zx?p{ZQn0sVJy7kR+S3&|=JO6gaS?^wqY&5m zen_VyRKK^2=ymJ%%`4YF{J&fxJwOm^V1F%zy+m3f!j%v@ENm<%LL#nE`u6_~c_}UC zwAj?l)XN2=*xV~2Cw19Ez{}8xS5fs`vND)|K~Z6hmw*A{rDG?C@rJjpU zOQIx#*r8sL4=APXxt|A?!CDjdhO+?5xaYf036Z&r6@z!vxZiSn`6co#nB`1)w{4qa zC)o_6SymD0qy30_^&O)-%YxvN8};A7zui46!OfxM)-g$SQFKC* ztch^D$iIH#O-QSP=?IkKLqyHJe@v2Pf1fT1pGO_xNUJ+{THlAC>Z>Jc{#`wpWOrH_ zbU(_E4|+Tv;dgFis26P>YNuNAbGCYfu+N=+3mC{3mNKyK%%7X1ZE17le=!&+I7za! zWN2UM9#@o}ot?SMPWEkO)xyF#hBWL+y5_xYG7B}2~lHco{IbK>CFRRO7WSBPLl1JFwKZ8q3Uoj8b$}cs^NJU8URxo1A!Z(h0vD^ z@dq#YWC=8O$#&>GgRmMzYG{#GSdZbr#$kuZM3pi(oy@ z=){E^$IINK0g~erdKxr5M1=Nj!|h!-Ce@er?9d7#=}1uhSn;GCIP%h?=n>b_Do*OJ zRv1<>28R7VxRN+d7+JE0q9u#A^(HS*B8GhP1YN?D7f*NKI(sCWd0?1=>8l`?HuF?c z0X!(|$6-Jda&@rIBm>&yu_9xLB*ACqxrOLPjk^Ue(405tR2_~FS zdORcHfEslIhUM$FO6(U#vDU#dm&oswt98Pi^GOl;mmI7HcAiMIjK%DZKhomK@#5tZ zSSN@0minB}J3__DB6u-70~YrAt&+J7Yn)kYy!seM_IK}h_K~-hvEmt=Q<0d(r(LOT zq|D)e1$0Pl<#eBw&m{BIo4;^;oulBXVg<2=b(T->uaOU<73*>R#%;aTJ{l?DodeqE zF3fRQY^&Eix1x}L(d+!8uLrc`7`^tsafICR#=qXUe)IMhw5Cus26*b7w0+i=WmSDg zDeUg-@B_gm8_P5EZT%V0zDAvZfHDM;#&7c}N8t9A+gBM>(n8sOWo(u%)JaXsk1PAg z`@)=CJNvdX=A0%gWK5XKc;e>rEG-M|ctK9Rqb1qb#As*<*6w_zbLohLWu_V*unbkv z`3}Of-r1i<|e*N~f>$f*<#U$Vg@tAOW=?pw>mI?bNsnzHh2_v&4xo;SmQ}T_2T)i zOwUTBDR3-FtAVR!()Eg^_X9yIlvt9@q;iscn&Zf$r3u^HJMyGTlfwWCNmXN$OFS;uVMXFGb6648J;$TK4gkU z4qPoLt8|tcQbeW4!@OubjAcZ^1g;53PK-xTcJ*|cr@(phOACJyciVIX_?md8yn_cW zdz=UUU2YU4jPVHnPrvM%wdhmWl^LgYGmdEsy2*qk_TN2GQ(| z=^ab|smbrAz1(b#x z2?2%Hj7BV_=3WV7xI9>&*N^{lj0l(4^=5Z=xS`v>#01a%y?*+|v7jJ)^t;b5yx}K% zSC1|H#ljCgQRAm>yW84qI%Gdu_|d6_?=SrQkH6!=+cfL@t{r2lzH@ou2N%`B zbvJ2+`wd}(DMiP^8LT`MBF^K@J6ir+wO^dmiEA^ zvQq_mp3FwVUF?en)! z-MRBl;)wvo*{QBb!O${z$ZbhAo3h%C1FS_Hk%WrcL_~I8C$r#s22@}QMaqUwF5ym(r?X5JG5dVI zL(087cW$ll@7bTr;3W^S^xp9Vpgt>!)3X44W$L@L{N6k7^Xhm0BR9as_t);+*;i}- z@uqY4eRl91@Z^~_Za?$h+wXI){vYq|J8vy_@QMvgRDgIv&d*ky&~KkNkY%Weih7%d zKKt!j=X7%-4mbo27f0Np@iU-J#Z;A<)P z8Asu?t~eiO5yiiGNABO>BzL(S_}D!8PXCfjs~Frcx{~frqELxRL+U*B&c%%nuUz}$ z^uA;r{XO*#4zYZo(n*+)}$pwAMmvi#LD{L}+4GqJLH57_~q42#sE zy|E&NlOs~rffo7S>gfY8x+g*1PN%<2lZ=4xwyKa6Q4UZj)V?LR-`V->;SO@*=PU*@ z)>2CRqVp;8IAkNI74G#$=g+4!-XpRn-b~_9el=51TwkTd-^sfq$$PeNc;uW0YP_l5 z!iHp{H01J9IRmgR$Vihm8`99#>zCH01h7Pf^km`5)33&nNZlllC{15DT|6LnDd|LI zTljK&Gkl!Yf69CK)>#Qz4?FV0UAc7q+U<>Nw=J+CX#4DjV=`40%AUihBH>ZpmO!Us z$jH4?@PGmea&_etk`3@WWOpMx0HVXISFVL*IMLDW{#Keqc6)gVW~*dOPp_TqK}fRg z*JTzoymZ9aKsY2Y(0kvs{JSyw&p1yxv#_VJOm=&2Jn#dBN=`5QPzQfFVI` z`7=DRbk>3-iR5Zi#FD~{4YucuUNB>Hj_Zso(t03;coN}m={xwe$Zx;ag~5dIW+2ub zf2rS)l=8zCBkPBs&v=-=x`Y3tAB3>`|D{iMx{SDF8k4-(8UsLALgC~v>>zwX%^?JI zkNG7m*#hdqwqoH{kWo*km?M2*z#-zsZ~CfFK=NTE-gAQ?ioec8_Wpqjy}2a;Kq+v1=8>vJ*Ixmz9%p*i`6@6SEZ4gcuL@p#HTbIjj( zyg({+^_KEM52d9DX7WS_ChB0j;@HAr(tvhAn5%Yso8 z(~=>{>EJggJKaTRCF{e2>4TSy`~U=`F07L7Uw0rzJ_?l;Ib=d>-4APGbUnF>3f zDeKatK0Zqh{9S1mS5T7c4V<|Un>!NAGhFv(DBG=~&m&)6nE}`YClh$1SxF?B-Y=hi zuyXo=6uTu}w|BnEyxZ%1@(eGtMuFMrV#Ri~>*RKj!d|u?%C~8MJ6xN@6;>+sX;GK9 z81}s_=`b@Ne2*$HRt4XD`IAJGuocC;3KN0RFFqpuFd-?soyT@9g%y5`YhVnqv-uDf z>t{6dq!KLyt@}QhWhKYRJY*leY_DLW!&*R2KGIGV@mEkT>nw7zB%AA}lOs|nmA0mc_Y!}YdSzbeJe1Qd@)hySxvx>q}a+jSEg#}Ng%|GC;$CYQ0eaA-57#tc6ShI-{63nm%b_qNX1S5 zyOfOuEtlS9#w5vBKEKXSvnFY7U2mY3@P89wpq~KEfvLxnb!ZGNT}isB}rK z-%F+ht9YQ*Imtdnen#g~_-C(6DAbKW=}oB=Xtcq(B&>!?hW+UI3sfi=cac2s3$t(p zK|H|gwa6d&RxHC?_qQK@BVvown3FnC|3|EbXuL!mQ=I1GBBjv5w2AG?wadwBmxP-L z4U|BLUl;Vc>I!nd7;zl@+Gve<&k~`UrxL;G7UO_D-~svU#U8AQ&k}$Zv4`z`H7#<& zG|(&JG8r<_J|Y`I&rPNTCW}Hci`l$(#&NK`y$zOd=%;5H`Ev^4ZS5;2GgkW9CaOk@ zSjuL#Sa|-{&VAx1VMkjEf1RF{kFQ+2y7B48)kCKymC*AlsE<(KII@*8dc5khq&+O% zrgzKSYtd43^4fd6`Q>b%NF^Z_6V8wFkFJjZ`B z@h}bN&fQLaRW0i#i*r9}G0vLvVg{o_UwtyEiZHH>ItOdG{0wgmqVr$iJA>L$WuDPgdLVS zSJg|)Ks|+M8kln&voYpuqa)*)^O~%Ba5mRYjEqOHpa-J9;fYOSr9=LYG3XQ+EcrvX z5BklQvgZNCN_-8Qo^2`^JX8 zm#wZ38b^zom_}68;TImM*WnfJyitU&r4(~q_GgJa=`ExO9cus?epy!WvJxA*?O zE==xy&zfGTFLAMpp_(j8%j@dWuL{(hKXKe{DVhQa2mS8+$%Q))nRR@loBY|0F<9+f zaUipNv>B1w@A~z73-&O^f;=XZ5}jae{&jVOjNh7L4Ba~UC(kveXoQuwPo6j-=UT}v z)v9oR|K0hBm-o1pYsm#~SZ>AbO{_lw$pN2 zg@Y}zZELh)emk|Z)lrSq6_V7nTpb+8PD);47MP9qjXLg}gBAQa#R?E|Y z?D=r$u9vtd5c=tOZu}mxVi`k1DO{tcXASrpoaN9ec-8r7$<6akyd&QXfV!W0?IJ#? zbX=4`#cas_X-vaI`YTmYQCsi*4q-7}*!((Qn6_!A#*@u!84c(Ps^FF>6EJ;s{o=+| z`4{Js;U?N$66-=rOj-X@@1q@@^XvaW7beX;dbvCIOsDYg;fC>Xy|(y`bavSb=157% zhxI1F#~+17cp9{wA5=%JxQc(!xqkI>=i0`vvaj@veUfQalw6Pa^}J;)Q-=L{V)smb zWsB^RA~qgau_;vBrt}AaY;yKja$$8t5)R3`6{TCk3%%8fwsZAx%M5-{&~!2>#93mW z7B^<#-mn`Hcda_p*~}VFEEYImrYown1G>d$1=kD5 zM*Qv`K^&X+_jXlS&q}5g@aXgw@+gV;MaJ6R_26uKH2-f>+)JJI-(%Wl%S zyQZeTc>Mh7lef_Q{0^_~lE#bP*VzbeM^T!NSHx$FXhLh)6pMR*>se@oh$p5xKqBxc zM;4b+C@xFkvyBF&ewgbFNA(D)Tdw@f#Ij(GqNsuNZ#rp<4|ZS3Sv>h2W!;S9Up6WD ziBc|_eY!=kfD|VLVUST-jiEGY#;Lik2gVyo|IjRQUe-n#k(cg3WrIe6<%t!gkNKc!Ifi(6_Pv*{D#+0%q`7d6#V17NC41( zmbbvUOLO|AKbM}6zh-y!x-QN8?&V|0=Y7v$b-gs92lVsciy-^SJ(WD7F-RT7DiWqc zn`RdLD;(_6OJjh&Ku~D)O`el)t?+d?(EgByjlcWKF&!gLZ%2tDL`D81Iq5Qk82b*t z+dIb)e>0>#$TP6A%F=g%Uz4`j!_e3nslQM4e#SQP#&tAE+RkA_mIoeq5Fb3blHrB- zra+B`ls0{j=TEgtGmuR{d}TWpm{Z z>np#(vF?j}G5wz00Zj}i{R`^={Qm0dI43oRndF3Wn~rR0Q@>EJPv$8;P|<$tBZ8Mi zb&4)L(LnePaZ&iaDRf!>LZnihOn)rJJ5hhGRDLN9#u|B3ynVUw*tLnY0GlEQoJCue z(;1&W*&fY-$6AY&2E>^jk!(Txm;i?ikVyU821wu6g$aN(rz7;g^#jsix8Knx!z8z( zAIW1yix-a12{u_A{pUDi92yh@z3x0e43)}U6%t*|JH+$}Bbo!EIb2Ai>3po^;UB)= z?myUL=J&k8w9(9<_Yr=i$Yx(O?D0HF(oz6FK^~VBy1&`voTQ|M7-J3;CqaYi8?}-# zpwAA((84)2&(IE)Qt3Y2&2FLFmY9WrrFDIY=taUTQC6 zjw;7QylKO{^4Jegn=r+!#EU9 z(Q_%hV07XZ{3m4>N~(SrhBI14uZbeI8<~;s9h-A4S`BbppBKJ^o+WJN=$802K-Z!>O28dC3X?=ML&DHkOr%C@$~R8uPl^+X`0R{J7C|f9P>v?(tT}t}5UIH` z3I{JC@0`=%ieTjO84MBHkt<&J`sYXIQc{;5w%o*1BARvO*0n1)ZfxA9YUv)2$<~%q z=O**5(|TY#OPQa{BJ4q1%OLwZ+s~dcFP;+xB+Bhl#!C|Rs+1#DMYe5?)NyHdd>{|V zZRT}u08ixuV?My{DGn{>1CuJqO!f&BT4w`}myUURPi(5(;nYi11vs_%?Vy7iJtXdK z(NYywQba3fYn*6z?|d)MemuKw}vSQ z)xGhx>6{f|N2*LF^3@dFX(k%Dbf0~35Cu^@QbRgeEIZ}T(r|!)UDSg#aUl^P)ivHiP<5#97hWQhF}wm~RN^To7oh7gYtEQe`g z#yZU-Nut+IJe`~J)9AbjN)?gIRLo`DQIabyj`|Y)6U!3`nK-OYiNQ?@$gQZOR0Ktx zK?@TjT=?FPMG9S-Bk-R_s7GWm2EZMp z@?w8f-k4!G^x2TTwwP!tnJLuoS4i*2{NX zEYlw3V_=XhosYcodHrSnGV7(}mMY}&D-0yluU}4%?^mJZIOm)F~oW+DS*|4>NjzcvYEadDz>m zce#1k`i_)d6(W-|xS_!}dHL$`E}BxKHUx<+sv3}7!|!E9f6}}#fLo|sq+o?^QDy<> zd!Xak(k#E~*%n3JyM!lbte-*7oq2kOYwjKk! zFN9Y*t;7L>_IG_|tFwO)3!7jNncOOELIPnHy*$7~WG#BF&J0Pz)g@C|Q^ur*9@-tA zF~&G=SCmzHY!4oe)Kf-&F|ZB(nV`Xbv^ye^14LIexPwhew2yU5r|*t#Pp7f4e^@|9fQ8j8u|pGTRaM(vu}1o zN7^`Yu{peYnW7M{aU>igaO5mPCqLRl30-&+m$hsYx~3d*Gr*kmbHHstlD_{bWXjYj(Ix<^eJN!N6Tz}ci6VnMdtT3m z91WfYw!WFfs?UxDUADf)7rr{8uSml}6KX-yuWXZ9O~XbrY1l}1FwvxL`UEMoOJ{sV z_h~V;d*WvqX@4srQHSa)z{oZ#ya~xrwKkJj4q+J-_0n)W%*oKnLzUEfDW!sSQA$?k z!rcv>smOeS8zhe@BWL^WnfpR(qwLx5>yrgR7b+1?&n4%eO*1T;s; zr#C1Ep)agpLL-?(d|O!3;%I4`WWxiS*urWc5uuC3?f=$CRzIhc^7lUf6DI}4(pOcN z*)pW0*@9wfsWDJYP!yvWGBp{+WU>&j8eCi zVYL7=w@n)QTQQl)mKyB?km@E(g8bBj(R-U z%&?YYu1Jge5I+iG(F`)j=f}y5ip&aakXc?<;HBU|Nll7bvu_>KGKmUp{CK(RyUlxqW8Yhi^Oe1a7){y`{+a=Crk9Rc57EE8 zTD!kRN&dpaPZTQWPNs0M-v9CTBZ>p=?7n#PSQ5Krq*vM?%wOyaW2>x8BcxWx9_)i; zvLxIfHIyt>T6%(~6^JqVJ0I8i-()qjG;|F;o17w;0~!X1c32vN$GV(Se)AZJTu$?r zSf$T=#K!rE1>FY~l&Om=;)`CnoGUdh15YP6#-I3rl|3CD+U;YQ+&&`d841 zyA`RzSsa@R4CWUrxhYtaS@T(5w>4Gga`lTIQA26-p?68LTH1yWn@LOF43+O@?tgm1 zUVf6KYbfh+C`rn_)NfhQByT)s31fYCaB9g6z$#efJ(OBOn{w=p2x^s+iydXODgTwv zxXJ)-r;P78jaW6?B2=ngP;z;6);_s*?URo$Zrmj4F5Z+SCEHpm8K2Tcgxl|d`?uNW zwH@^wtCDYrb6Gma*A67^F_TI{7SAF%yv z`)K3lmD`b+x(v(HCF6W*XORp#2WU^8xT2V-hD(CKk8uJOX(Er=XwjRuCi|3*d zB^p*EHs9Fm>fe3AURSzBPlxNTzvy23Ud3vij2s*#x&$0Xz@vWsODIa{(!%Qgv-eQ%wdR0NrBj&6q}rFRbwD5 zCPd1kn;{IeiY>CCFa@o7?;eg@%{P*jPx^TBBEcYVH8UOTSch@dmzy6CW8(+u@;H-UqTHq8+oACgRhJPci;)8Q!0svMGkP$9AlLP>I z*CqipKM9euuVWj?mRF0>HuT_Vq@c~?6}N<&w~v%h1bQ?!jZXx4)_bSh4`dr>A$`{F zHiol&3`w8~J1l}#aD(T|@Y1o$bN`$gtMzlCZk$Ck`gkShe>*?tzF!nmnu0GCGWFBvfe94JKg1heO8C)W+DCOQPgN=bnAXv5Dit_qPh^L$oOrnc!t_}i{j6N773PD918H{!yKuQ` zfRd``29gq;c}We#!I@|vUQEGLFWKeG`SsvHCY&v$`7eHTS)K%80C9LoXKi~2uQ%uU z^Tvqa1@y4i>EyM2lVT#qL{Az9S-oXc!+;GpgpW_c87L&!g?2bMaw!zNCQ?oFN zc#_>{ef!n}wtm^E#+?G0k6t{%3hrCee$CxKUbV4B z2mcaOj?D}RqJAX1a`0BBzI|ob*H%tWcTi$Jno*dPJNYM{xEPEgefCbL0D(n(HvLJR zqW-21Llq_~k38@qEFx_t$4gB^O6gQ;@DZ#T7$k7-;x7B0we_pFzi^G5mu$JZp*S`r zSSAM_6$)Na^)=78;%AdyX4qRD=Te&}8?M#%VA0mB?h5;_avw_Oz)iwgr%c0%??^X- zRw@e3w}d`S@ybm_a(Fk3LW>c!hdqt0X3MdRg`KK5U8HoDok5f2WvmmT{o>0ducMLC zIHRfGwi+$maMK3*>t+Ml0wF5d=Tq50>2pRJeL?QB{t>!rX1cfa<@W9iiW>zWZ2?jF zH6?Y$*-F+Ok~}c`aZ{D3wPFPX7IkAahxLk;8xL8s*({Z?tbFpeu*Y zu}!<5Rvy;`3g!dr_$kjfpUQlv&t<-a>_(sJU=A8&WdLSzF&$L<`*M7ZgR|pQ!mtDx0R?{t-&+MXRAjrxoa42g|Ra92Ao6!DdXonOdojBiwnu9q! zlmmKX4`e6SOm8YJoITmEyN_1&;H(m3w=;ze9Jn{K<}MhOs=k_LzSD=g#K6@MT<9wKf&7 zyuJ5La;6l+!jAWgSVB_dZ9PzQozz(`cFcEKyvrN6E@^*<>3#qH-gXH@Ejy)HWjZCq zG5A#}A$&lXUQ|bpR13Cngk~={E%$N&7$*AXyEyJ)zuI~51h)Wt<>+-~`@!X%0 zNEmH1X`SVVFaGd{Z@9KcEzn)m++|-I1rWCURK*cU+-hu47Rf;{&mY4CN(k<7*j*hb zLmF4pj%w3m@d1s4oseTIw94---dMl=QN~!hf+FYnV<_JNyFab9pVBP{uCd-Cy?8p` zwdJhCl6bE9w`go(7)KfI2HB4S5K3tz0$BXIN>pk?n##=sFtIJv`StpKVAD>gMqKTm>hLR6k;YQUfLj z`0c0YD_NK8Q?>&$XYBCOI^6u^D&;i7Ny>1Y#U>-Eo{hX8Hd|!ZbzFULfX)UIq9$cG zm)t0Fv8!CNBBA>v9N$`7TOJGL#SZj1@#ieEa38km7PWU(tWJdJZO<;TD^S$c?H@qQ_71 zwze|MbqeG&=`eX%0g0pVgvjtMbd&*er0-}sZ)m*t^a?7cgMEN}IbS` zq(_5Z$PuI3+?dRxFoFn)6HqVa`ye8C)=-Nz4G_ZRpRD3if*w)=Z!s3GYg5=#;cP)l zbO3 zArsX5n4A}64hT?<{iRb_G(@w0#gR066Y*)Lermc*BMEV~nDcz^1(}?A0j*HTO-(CI zTo%VfVzad7m>H4p6=|(-7Y7vT*6!%X)ZR>qdeIvc(McP0CBz}UW|m`0D$Oaem6nHOL}jFx zB!CWYo5J&{zl)43@pbsy`qDaA22T)!xqB$hu1iPgW?kTQa~`ZHB+)8YDt4z7SSpJg zgA^F0Y^hjbPeDtHO;)hwBoDTfuMK`(JZ@;A*>uR`NwqrfravVWp!mE7RI3%*K# zJqC6urH7+ZGJ|T(%1t9hDYMu( zHb8x3PIHA3JM3sSo7x^>c2ma3!0BGE^t7^~Wu}VkSw+W^FjOnU#ZpjdIA)KBEJL+z z1kxx8FEw#X0wtvgL_RaVqZ?`yTgc)`U>T4^isaY<#Jt!;^`Y*pMxi6Aakid3e3vkM z`E7_b12OjZ?yuaV{NeA|STI=E7tIC>WRiVUe1ua8*W7mai##dz_P95cGV!S9MWPIX zjowGxNge9F4g~i}Rh32LS~k{V&-2GPypfK%QowrQLH6Pe-b4fw+{qSODa3=^9=~KN zU6gkfub6FQJ(DIO%}SY{vj?&j#x-owQt^alsG^^urCF>9TFOWpje2-s`KhFZw+GgQ zN}VR)F)ke^2S+|yvgp$Z2ky$O0 zbS6!K+XQ`Ft(t|nbM_tdD8L~u+}Ziw=laI~=Wj+u5sb6)@M*v!?ch8o(LB8++136P zUn$)Q!Lfk*l@yn6!q=GOpbru*CJM?y@Oq48=gy7}yz(Zu?D_jBQ}OXoQ^tLvt!}C9 z@K8-wyYcFva}^+uanFIQ_qU!riK2bk3JA$bDj=KFjQFdYlTrpX1cCyZ6!_*&QOexf zSigDcqq9=3P^$)Qjg>W_9C8+|&gN4*M=KB4cRP2Bs*+4ucOwVaTgVL$c>JzWztkXz zdu}@`5Q7_|`Y;fs2V|D0u4(}fS_&oom;iR3+`NyJ1Jip#dOt)Hv@cxjbXJNj82W3| zbn;BduDj6(vLhroy@(%VT-l5kLsMIqKDl-K`o~|8+uBYT*~!6)Y3mm1_w{?};q=z> z2qza6TH2Lz#dT~ffK3dGQKix3NzRj3n!UFE@djo2kQ*cXG5fVN?^Dh2dc7s`G#eLb zcX4iDB&Cu#k`n=u(kpubBvd|M%u4+#`K1KF2S6u$L6EBNE9!;{jILru3(ARhUnUhs zT~f2=fc<$l z?^kFn8%&O)XSsAc71>WCvi>B0M{fPxBzuj*sw+N{FL7$YjrR8e z{Gn_B*Fu((*$V?yI;Y9csqUw0%r3_MLanU`}@21OE7YxVz#`8u@x`Pw(czJTi*TFw(aUS#SR0<#axp&6R{U!Zyfdy4RtQ@$5a; z^U4#w(X4u&4(*1@U_9zkT`HNt;H5J>V6y6~weFWTu3lxC!$U<3vE{8)ybpYvwn7zs zQ88+kX&+K7djz7$y>D8|vzk7NFBOW~ajOTeUXo>-m7DNAifM)#p|%O>a0aD>^g$n& zwHjKB(_t(t(m+6*dW45d%&`YRt4H#`*ZVnNQt?(9^;UBj+jvyM*lgcIos53h2|Agi zNs;iSA$>_A42qIHJhHQy4^LTH>{Tmrw{^ERI_0g=95%b1bk67$cYgX)-SqRHpG`~5 zsb+)|O}Of`s(>ifw+=ioEHJ_pp9da9!>8U65?Hh03-d2jrHql>mto$r8%@H1FYi@q z-ExxDeXAWhu3NgUBP7+W{Ed~`LETHXrJozOHa@w0eMJ!FmR0D__P1U<*v+m>ydU9C zf?y_dsny~Vno2YRBBc12XAdoh6+5fQ)h7-@WITBCAS{chcNp;EG%jK|>#k=IE0zs| z$$k#T`BjtEn-hv=6K z2+P)W(O2hS8{)6#TO>bPn3UY#9Z4UJ%2FraMbi4+@1ojnQi1YWa`K2=D2xcLCwHRl zM6Y=|+DD@)F;-=~@Rx=!p!Ci!`egD&_h!7P6%QgiC@%R!Zv(3B`kjSkj?G_ayHeE3 zCOH(BO;rhF4d19}*3ru4PA}w35|buhCTYWPWpGwfg_%b5LOs~Yyrke~#RZ)SPIaK( zgt)KJC_uu$n-_70sj+(f87$%RjzW=>3~Dxp7&=?@q#$g(MplYuB;fs%G{dh3)&W)!26Sx2Wu;+$4n`{(LPr!^%NXr^H)FIy%Zk&AiOe z4VXwehBPv-zu2?d)LK-a9aV1({^~%ES+pu4$Yq?Rc%b&3suYVUyJ{#Fz0^V+-fxo> z?4{&to03E_1vO6euUevj%_(e$t1Q$+)S<1>gRVdodQo{)x!w2z;pvS}%PnWsTF47f z1*z+31quM|Sx#B5{ez^T!F;2hJWA2)!;W29w+U@lM!Qv<<$d`zmE2rj1@85 zN^+ZJuu1p+rhyT1X;A4I2Ye00f4B$PTG3*(f=F^m#f0L?vJBxQl%KI~Vm39X6;UIc zBa)>XzI&M-5#eC#E`Li;B@UBuIXAuY6RZr^(a8rj=mi zHO5$%IQ(CW&spS2>yDX}gVA>VhR;eTfohqPP^CoVn=FAm9w)^`dr=IC^GZG4)6wbo zb#z2U50)qEsTte(M)3YlOO* zDG`hjY(a@$KKJ?<${{57%nw)Pc=<^MGtmW*T(q{9XeDdGWA3Z`q|3oo>f(vHIf{nC zCOVEorOds#e)-Dv_OWW6m*KdV%v(xlojA!1uH;J=8K08x3eOzb5rZ2!f&-W_mLslkh%W^;$<#;&9?QI@A zT%H0^%Sr)gJyIJ|YF=VN-Pa-;xC%abg?_}2vAN?OQ z^@urZf$(H&>Q&Yp+dpOlv}yJ<+iQ%HXN;CAkLmD`4mna0a=TBy#49rao$O6rq2+u_ zCA!UKg+W410a66qXf(`W$AnX*^KFp#$;~Sh%0gwikQ|>FPyTw~UREmn$w@VAwtMyCrjuKVLb7DXh)pEKd=RmEc0DsuEsH-vamMW0BS1c!?v?ybT4j& ztt1f&v%$mduTd#2|KukqWHqQY*{^cZTk4MPKA~_OclhESc|-gyZsi#k0waRsRUN8I zOSz$@$)E7Cic=enhuOy&9d(}A&763#pbN}2Hb`MbCtc6AOB?9un$K3mHIB-=WI`~V z58)qX0QiTLB{z4p6lDJo*8th^V>PA9i)#vKQtd&=wBY{%rjMLW1Tc%_=d=6~O$AiZ~Al2UBPd$gMI+O@hi-#$KtWK2)H|&7#jQ z`+eof%YGBF;s?&t5w9}&H)t2Ru z!4{QqlOQMyjAHUx^~grax=ih^BtT~WTDy0qmQDF+_-3BRu>V$1;mCWR+)+fLZKC8N z=7(g-EEVbM@}_Mz(0-G$PD8*EHlUEeNI5#BRz-6imJhr5v&q$8zndAYEts#vqX0OFCNHFiR7Hi z`_xILw(R~s?^`W^H&KkIV>9WZA(W0y^m1>DNnmp*2Vop0j!8qo($R=}4|OUMKW*l^ z68M?gk?xQ}ZW8!si2LL{rA!rUrOuihr)?}J z`yK)h4fA}DB5iac$lp~IKA%W%GI#PK4RFUr{=k|fBtXAFOV(XRSYr3Y+`@M+%EVjU zCjm(c&2CQ?+o2Lyh`0IC)a%X$hWK#bdruLTQX5dSeKON6xdqhMa zH_qxN3)u^!8OCB7hDn%7MTA^}2W)ysMXhsUH0NG6J$-Mn5?CDKQ=*7c>vBv{u_St~ zUUF6d)(w&kUQs5HAU=g=1ba+pJ@P9=A!a$X)Fi)opG+j1V%*h`MdBB6sG-aueO*b={bzj8XwI;nfM=0QCB8Z}X_bbhUvP$nfT8xM&sN9|$B4d`=LTM?& z>{Umt?JIUP?YxFT;k<%#4b%W?ACAcuGk+r@4{F0C@oN z9w;v-u}(d>6i2xhF>)#uC}!Ez=4dFg1Lo>66+3+qgtdtK7_<`KMN3t^#8*;U2@X5~ zyzb*9Aa5JF3lNaP(2FWFIhJal==QKE=uKr(Bgl=5dy9%1Xm^`akTqvG&tAalv>W8t zlun5wc*>Bqxf9dL4~E^WB!LOTVAC$M+ucV5jYWc&^f@RtoKTcrns0d6Epf@Q zdw~z>68eRad~xD7=@qyw{O^&wd}n^8!M}+)%3_x@3q8|?!G!K0X$CPT#-OdHMcY2`*;kyCtMWX>s))n#sG?cNsI!OYM7J9O*I{iMn-4@nyeElZcl zqQ*Fn_@XT}ipH4fULJrEN#!T5v}`#A*8%!rgPu9N23dc>Nf`ETvuUKlkYRdgClxNo zq2#9Frix-B6qzN$E|4)Z~GPsd|I^jntDNpD<$Pl=)&og1IenaG>W?q*@)Ia+Fy zL&qv4Xr9Pm8}`_%!4U&Z2to0eFRm6X?6Y_@?z*^mNgNg7?*5Y(c*dmqh_MSF!fuJ8 zV2`w2^2MSA zl@ektn6NaXtmEM{K~kSs{`SrbkmzCO@Jw0h_9i&M+d#7eU2YC2Lxjsnl5u{2O$MS$ zS{Ae5+RD|@ah$Mn#f*0cyZVh|US~gZOhetktfWdyb6VBGPD)p!`SHnI?BrB%>w78I)X#(;p%cO-dxk!teVjSA5 zXNp9grsAA2Nse3HioRH(f~C6-nklc6Z-qxLrM3(jWkW+x?;v{PC> zy>;U1&fT(CRdrtjWSctwGibD_ z|M#v_(ct#4M1x8U2HF*l-hYPLo6KgAE-6~<>xW>*FPAQ>4h(2zyCaX;_t6xGcnkAs#Kl_$ya48e>sq0Qx-W2BDP=$Fzar@^^1txzM`BX$hE(E%GmB=oDXLu)W)&cv?ohT zvuH}Z4!bx)Y|p`lS_ShE!hEXtvt`+^C7d+;~BkM!B7-h%$frM3?x5EkORPU6hyVr95xO)APJiWjZ#Ume5gO0oLsTvbJmfSkd zcgI=Ff9d+=4f!ZL#8Z+b^^Sc^R^$un;~3hB@N@O;RdWpn=m0CkjTaV8q7>w(%)WbdyUFN=-k0#YQ9YW{v?jm<9V%7Ou%hbm6 zn@_&l{AOP&cfDvTfSR-e@nYx!q_LsjsibzoEI>FCI5erzre_MB|H}H+E7ZSkW-9!T zauwVbG0&5gR6;6hs%b3q9mHL0mI=JqZ;Hsn_9o^*vnB=I<88wF@(!z~VX;gDdZ9Gf z^7c6xL%qq2$cDUYAQrCjHEU>1i2N9QRJ3MIf}ip}3J8w*Igstd`N>?Tu7hZev&fQ} zPvR6U9epD4pj8)QO@72;4!HdDIDDepyOBuy6w!d5zm!(al*YJd7zvzIKHOwUfGBoH z-xo&{*^GPcm^;n@UM(f}%8JPvM647E8pEGbGTKq&n^whl2LMSton*weW$LscAjyOY zT~L502cRvzWxHJqA3+Kx@lnzzXq&xqZI8C0NT(QRh3KB;%tod%`7+sPpdC5(5&!nl zL(;iOMAnBU4R{l%2Z~B{hh6QN9gYfNM+XXGq^&GkL~5TcMES^aNVf8zh!Q2?2GSWj zKoH-3JgcPOyriF+(GW);**mRubQZ$W?L&sCQqE-NRBz-rfBd}ejt=&>zm5*zS?VB` zO?Q8V*$vL1A?mo9B!)3K!`VY^Ue&QtqR7n`PoB4=%_VW-3)+lQFi5Xtre7z~vu z+*sc6`AVS9UPe;|gu9~^XXa2A!BC{?6FE+yD$q!H5xwG^k{Z_tzd|n0qE#Fz5 z=ZPqoXG7Shes&&s@gXuyvU|;N+fTN*mgD|OS68-G%t{rc&jU!;G;UBB^%{I19*~2e z50_P|mJ@?WN3XMd`t<1s`yE^pljvKj^Q5#APsvFodPC$F6~i8p^{r~GTFyz>wn_?5 zX3_dZxy)-d`DU*Oz?OjVXi1j^;S8ql+*$a}hbNiI-*6?onDq#?749tG_$BwxAV@KQ z=sQ84aR)EI7Z5$E7@3q&WpnP_eP={4$tQjg56O&Chhk6#j6_}BKe{0 z6C%A$FfYkHUp(ERo)5BD`5 zkfyVxkliWe0xAV7184;;yANy{jC|^1FnG_E!EkK&9D|AL9?S(@wWj)hc?{)yd5nW! z9*gVEJJ@|H{P_M459_VQ3ifg5@oIeGJzY&h-tcC3L13(LXq&hHNqvRHL1RDTlXl-{ zquq7sM zJX-DM{DaaDRQI(nNSgtT|rR^RK!3@aV%UdTK7Y9Lw5LFIQyh!nA zkBEzXri5t%S8-qteBY49q9ETEMTrw?|z0jzVQ0O>*56H2=y02)yKYpEKDdCImGCu_(N!O zc!FgiP!%I)&^Cvyy>An_l%9!*+8haFx?8FGqZ7^jVTyj{q5rA&{%e{?p8)>le8_MW zsaa$eW5#U5`bXVWb5o{|nVd3zg?iFK#Boe$uNKUie;q=J+DRto2K!kkR=@6%^uFyL zug~r=9MAo9Myl#Ld8p4~4m~9bIl>WjZatmnd{$es`_1dWnsP30xW;&JE&<*iKIu7< z8SAl+zzPpbA15^(z)3D(>1ekZ2aEU$T*Iv%T$!Wniakx`kHz(hx}%W` zFKje6q+w&ct4K;t8JG60>k`*5@;lwtev!eFcKlcFD7L3LMs71=q+kuhf%JBX7x9QS zZ-e~i(%YB&8l(QZH5U1x{@ zs8qS?LYSicHDTEK3(zl*#5s%P@}8L^N=4>L8c1m-!-5{#_clM|)odV+vyOp9EU~iS zi2fbrsO1x8_8APZf|CtTm_j|WYodnkz(wJZaM9qF!9U@pSbrPd+)~#m0ntxCd$M=` z^Y=;1=-d|XkecZIpIfCFxm1v@ID#IgIa0hB~PH#-wYF?meUz=SmaV0t818w{pygl1RJe4@rjH-IIv;forlvgF*yP z_R+J6QN6XlSnxvO-X=0f;NbML5^eqwRznzq5aj3&acJ{S?2f^cl{#K*m>d=Qd5Zbt zufY$!L1O;Bff^h_YkcUs{jb%MbTYl6{-l`ehVgx(-)jP5PBTG3c(A3c&!_;TkZq5+ zN(d}KRQju@7rras4y<9)|6BBFA%<5vF$q+Z`Tiqtg*MG3n#c#NaF2sfMI|1XdsxF> zbB{^eV*+9W3+j+p(U*b?03ik$E3#a^0zfhg==O0R| zFc9QVeqv*VYBi?5pe=Hunn_$vCf{k$14Kq))2N^%Gb|rJH9z;^uNe~9I?_ie{UCl_ zw@;`~-NOIOEG2C$%quIbd2H|aM;e{(vHZNobG+Hl=NKi|{la(pqhxO67g`Bfw!nmh z00aS=U(3sDP!UOeftGu73wIuBC6mu7gG5E1A2>O6b z`%u~CCH^&m7CHXji7TFXxdH~J$^WX&LWr5S7-)A66JU3E1@fdth;G&OB+f}t7_7V*BsOpnq#kWRKy`WO4)R@pAX08(gqTM{@5JPLG_?nEb;>`yjw zX4@z7RlufxDQ+@8&tjyy82yqnsG&htAecmAZhEw%_?SPAOqOOu>x>$mdb}o*%`HbH zl(HVUiqC#zgIBgaNpYTEpq}b-NOQf|v>fixS?@;;ix(9139b1<`G6=vKHB}5Mfp^i zR3|EZhKQ=jLKO>^G_m=?*~!@PkGMhb3ibS20d;quY(0FgB#>6?I|n4$5}D?$y&T?F zt;SIafAgXZ$P@RKL?tP#CD2=8Q>zf{qSRI)NaH9@P-z}iFQ%n=Fx{JY%%{?XQ3Zf> zs=NJ=9D^iA{7R6RxL)W>n-e(C4nq(*94kdmNPqmB(qo7d^rm%8y>aFQ|E`Btl?9+H zPC)K}7AKHg1N z9Bc&atMPimH0~Bt z;#Ry|tDBtIQ1n&#iYi8Of_aOv{*^n37XH$oW0Y~dHN^ArGou~G#}I}2oR~zGgMGyS z{h%upPuIrQ?h<#Pg+T>%uJXOLQ*Y`*d#7?b26mByJJJC91aa4B3INM&d%_;`Wc2f* zdeP_Ai^g@osCGgH{)pazzWrm4yX2DL<)+U@~QHk_9Y3#Lv>*;9SMx4M(p9CL4^kd{qk^A$57XA3{G=!1`y>*F5%8ohy9#yoss#Jw?rwH{Dup~`jGEZiWv^7TG zUN+2)CV;@1dv)m$JaBx;v^CJd80w4i6q=w4=b2_Y37^%bNP}Dq<`5A>!5rech|=8B z&)0R2NG1OU1A>Lss^i;YoVDiXH@YxriJ*{|80ip)@408|j=b#$d*Mxf2u)6HTPsvJ!TVfj2^m6cBcjm}i!f(N%A@X{^q<3CTQ<9j*D)Jk5CM3{LzpBx>W+MN>jO7CT2fN4` zXF;CUL_%sU4<0m^gk^bxn(3rsDnfFZ%kR$3Ya);9YMw=aQ+d;B7X9R*Q>ek|?aD0v zNX@R6DeQM=P2sqInoN#)_QZ~2>H_)1-ur3AX)_{X#`M&Oz&z<5G=n^f*&;V}yEL^K z^XVnHTQwEe{pgY&V=6`+k7Z)+zfn{54*oA)IAGR?KXMag903i=h8RTVw1nA!8`Xd~ zjq$6;bfIcuBqp2p)EJ)5aB~yFw0zBbD*c*f1aFzd%^6ma?(-b6K2^iW_;tfbnsvkZ z*JyZIM5F%+Q^uYc#Xdc8i@x}Z${=$7@HrtKsEdCQGSSHZnHY-q$0ylrz`^6U=RS06 z3!c3bKpj6ItfB{oZ^ZSuEa(*N{0(nK1)*r9*~M|lIi&4V{(u+q#^H~)DgPOt91UAk z+*cqZ@JQeq+gt3nK!6&|b1NA}&9zfyszX77C4ChDQ(4K~XLz?L)F`+h));vFTY%#GW-+v|A4VQ!1+WAxK zB=NkCX$T7;yi9ts)zkA*T8@e9l}I3283o+W(;|5*R=x^H+rR?{6^|7+(D4Eru zY3Fm0<+$$Cw{#&ERtlC-kJk%p?0K}+)IklnfAl3A4bG(?h#p1TW*oHSP%-GSGey z>o5~h?bMXNZFO|6pL3h^hc93Ba!mjH%k2~T|1b9D6L`tX7dxQ?Lxp<1i4w>@Q|D%K z({#v*W3m5x&g&Gu3J&p?kHxD>|D>Xg$eM_lTGW1&w4HoS4tAZWd>UWHD+1^2S+0#7 zX3|)O%57w;X=1xNsG!y5nuXSwOy0ny!D{xWu%7ZDRKEw8)L{)j4MNjOz{V;z?ZP8h z4>@~MGnf@;?@&9K;s!&zuf7!Daz+!iEtAj~Bf6rNOx);o5zAisCae#xAfUxq#=hW%%rGE=NS!-P#x#@2L=@^SA^dQIq{hqdd~_fScO zkd=9hf7sgFbp-0yD7oYV75?`MvqKiz#B?e*sN34fDL4)_uKc>3hsbG#rf5O+=(pUo z$#Pon)q=WT2^Wku12nL~DVw;~74QiSx2etcW+s4oNz!ZC^ugj_7~&umvGg{`Tp zwxiQ`?C3PlQ-4ZFr(_Aeze&cv@JE6OK29R-+H*xBZT-H62a zXCajbIX{I`#}bp*P9o8;c7B>nG7NIFXIm6u3Ox;&OxHSI^~4xsb4&OvDmw=fO6{c!jV1sTAv%u3x)FoEWjNXE^4!NH=-u`qfW9 zzIH2@HuTk`3okz*LyOg;pH8!S47wo(5d!$SY|GgQRIgTJqz*`;VIqhs0 z*di*Q2@FXER*%N=N~=1_7Y^cTHu$+xvI>)9-r&?s#^T~MLDVYPdPIQtUga0pWJzr6 zauUyaT?V7(WO$e;pOlugL>dIETb#w}40|IoR6}V+?Yx>tV4m7P(&~fR7lx*_ z?v9f1%3;!}qzX~eLg@VQA5wIT}qQH?ht&m-*b<)Im6AvjAv7YrChsqLoezg;xXS&kt8~rGsYo z=M7&CI%Rl7iL!qA^39D~6i!SrTiE~p8@6k381H|NB2rDZW3?j*#ZiOQ!au8dCA_kn zgM9K#VE#;gTT;!Yw|$qi6L#lkdXvF3&qIv#Q00&9`;A{8&7S(q!LIY`T6D9LlNZWI zdz4zj<5G*El(OJe*%4=}A`bu?IQc}_?q!(4#xKmMJlo1PS%e&{3s(_?|j zzyMRpK^~^LeL@>kZkCX_7(4eYTE>-(>8t=xFfb`?iBj(0t*C0gVZ}F)aa+2Vr>ZW! zy~9VGN|ZZcR$iA|m#*K~n3YJlRA3ZePU%%(#JMLN-o+>HKW4sh&Cyi5sl+I~Mq3ZW zPRpB;&>)tsen>zdx9PCk%HK1T|nC#v`U#0GkRbgdwS!Nesf>Ma(o^mU2yxM^)+M# z5MShCSAGrtDY+})JIYrHT*$nlGCGvR>aS;%6L_J*1Sn-9bzRZm!H@2r*xu~f{qjsFP?^O*bZRT`BxKpBgYd{ z!i_|pnShFAZ%ma(61*+0H2M)KCXllQA8|Kmel(ioM?{U~UuzX(_G7B11oD!6H60MN z;6?)^`Xlw)?lTf;e}l}{%<#nP?~tUWxpD22Yh3j2fvuSgln-p6B4iB6FagQuPn>+V&dT%ez1OYCu_)-#FmR@jGsV=qYA-kfz5L6Mu z1T!0*M^wG5@#)D-M!ZienW)+HlDA%xg1B-#@M*3c4{RE3J06HMMw(%{kPO}w0d_rf zUkx%3P@6ihd8ZwENLyzrXPZ=Nz7o`e(yXM084NoY6MoA)*4PR5`RdqhYD)wRD=XDL zFck-W>0-y2V79GXF<~Q_u!>|BU3&GiRr#HBxI!iS?2w!zldu19`_T*3D~#?{Cjb}Q zs^UVGf>61qDDsp`B-Dp=4FV!%{-eFkXOA;>k;Y^(5}?K@ZR+Qwvlo~+kOQv?)kQL=YCxKu?Yn#J-)5RKd5Msf+t%UQXD1pT)f(6~>+Fo=)J zd8xx?dSnW|+W+^BX9&%M^qBb4_l>I<kyQ`BC< zS27>W_Q{Cqm#a@0xu?#js5uBsc6-5dJ6DaZc*@q-PBWgO%hExIUHnl} zq}c68y+prrn)RCVmN;B&e{M+Ch-9BZ35NS`&dk9Yn8p>6%8}J3NXzEd-8@LuCIB@yuWWrc+j%j!K#T5>v z+ai*;B?`s$DkbAX)? zFtUO60$e?RoQno88jT)qNaDI513*$Fml1(hJ3!^?=7hF{hGs=tEtu1j*QV7ypRsg@ zK_*W5XsK0zP?*g2rcQmO-6xZVG%}ZAf6;+l^(uB(Z>%Uq42iOW@nI8*;qb)83&+o* zkT^MaVSbo-9n^PZ%9{+LxzxPX=_v=JS+>dCmHuYne%p^$W8Ds+PBLX2CYr5lG76V3im+gMyj3)PS6*4!;EC%(iL$ABv{SS?zrHl<;-pz zJJM))rn#xbo7^R8*-lwtml?F+{HsB7WTdlIjpV(ADLUW&@YX`w*F&c8QhY1HE2(~P zV(+8%Mmd?khU0SbT%SV;wn;Dz8zqGl;C0*%hC;S`)Lr0SzjaynELx^Tv!Gd;dcia? zc7UM{{0VC_fOJo{P8l-C__3ISTCjY*<>~L+9j0!_z2{3^-N=tf?3L+4H8LNux1Q!z zCYh>B(Qcr)1chUEH%n*>q(nS$Xd->23#RN5S#B*cbfI4UVXUdqPh4uPcbRv0{YqOQ z-cK@Jw0h~V!?h&bcG%xsDIHOO+R-bU*VgO{>)L+aqQtqFlCM(5su8rQs4sI%FIpR9 zRH47GBQ#IJ?eMphnsYWTYOB4&ADEbes>&2ufP|j5wdC6xF2gy1Cx45uz^Q>{Nqn%$ zROi3;8x(~(B$JPZvUV&ZX;kbaEML~i z*RxJGw(i87nYZdC7Sheo=A|8d`^B$jJ+1Xdb|nyCQX}V+FDrC3IHPaB__eH~jcq!L z!ya5Y>nRq}RR&|Z$^55$AGSB-;hLIUZf&=r+pP763Bee(gSl~RxrN)n$uAS+F{;_H z$c2RrXqlVj_6xbP@!SZA7+k#!B8E3=dx%(B+p>KJk^9{n1kDr=h9~=fWjngKJb-PJ zmkP^hc)Yy0CeH+xfN^ZKH{X8okF#dihMMJKiQMkQX76ot{xEB}w>U7~h08;0XN}wD zWTW10Z~kM}{913Q`Jt`1=Cgs{56-l?@+n=w;eFX=0WTG{gYRODTyx*Ne$iCqV~2~)c@H|miq*e?ZEy%f#iO+WM%uq{#&2V z;M0%${hh_$dg0LTUQVdAs;i>u3;*e&lnypG{re4$r>*;!h71luwSLaM@d%Ii}Rw zQx@(L{D?y=d+>1W_ZZF9@P+^tnZ}dp-UGmV3 z-aTd$JeuF}`;L;lwra-klG&r=dzl{+*?bDWGvr;z!BIDlK{B?ythL}tw%amZv#p*p zt@eHy^<=cGadR507me06<&w$bWAM^cn3+~p4=v4OO>vY4A=P)%iVS>Z`Wp z2$q%(&gK%VfLwY_M%Y5$9H6#ZQT~mZE+Np3mrs* zQdBKie_)EdSgRHXl^ZV*rPOJb!IB2+p25{d%`Z>tMlt(PZH9(a$9kvF9ie8^^0P6$ zDw)a5|C%A`ju!w~Bc`NcNz*(_5G`7gHy+oZC;mdLp~gS7(;H^M8lBbCCNpC-IR;^% zk~d6Z^DqouD-&uHK^bbRn0IQ*#I1RR^x@eLrRs&rIUayt#BGX3U;kn4H87rCJCaW7N`zzJFsn)zZr0d-99lfxIl+Am|T`TXaUVV2`gpEp3-z*7w0~4 zk&BwrKlS1DR%D~jryg~exXwhsa}ATX!^4UQ8tXs0 zge|s-t5I&a{$>0%*+2YACW4<83`}&DPR?C8{gKmWkDnR#b79?yQQ?*AT##ihXcOEn zO!_n&wnFczOP^S!PWwjo+?k?uUuSC2ap)0t~QdQfPa zh}>(4CFH(4YJ}^7jS@FK0*5ugw`9=6I!B*!oJcPi_cP*Sjum3)-A$w5a{c)6izf(W zundJH0?uwkpQ+dCA)Iw4O;#{_=G?3R8E2u?YY!5pw+~NPA+895lSslS3*oMdZ7l2Z z%?KpzcGZFotypG+=+|nB*V`z%`i87%i_esw7lBAOe}Vp&8xD*bJ-3~ifFQU zG!RWs=IijP{FpS`oJ;Er?nA+)wUW90g|UbI3m$%9^Rjtmmpxkz%Li~k^S|W3L$3$i z)5cfezGv;7XLG)ny|j0V8#x{0KI>U-n|MqQ!yu!KFgnWDZtJsQ%k%=G}82>CmeIm(DR0)>}>%M&iX##tJ|EwJ|cDLD~;9E&ca;q{&+yJQkbvf>y<@V@B z00IZ;MRWg6G-dAk)-Bd6cmQ3IQy|V%I>q_Qq@OZ(`p(V7a}q?KeRHfD=+8WHy+5ws zKxDBHRJn5MEU?8LI0epbj{}1&RW3Sa*B%K8xmcB-5to{mL4Q^cim@uXtf*X@852Vq za%@RMn!z`i?!SL?hnZ zF4*EU7q+*-@o3T2K}O-=QFNtFlU!TlJ9|g=$gRGt-zs+4GFFJvGAWg8yht8Pg}EyNMY#xq@|8>O;buVPyr=OJ8G{1H<>#m1Ji5mcWP-!`(y~>F z{>C95E%##Ne!~e|c*$diMS*&4$xjL;R-y)2Po2Pi&6C`1$-y8${blz$&b*@)G(#+} zJfxBA7%E{f7W_q&ZwtN!Cq0|wr5wwij{g8>@VteiDNtuPWsvykFl}@2l^i(W9()63 zwfhHKJ_&hGdwL5+04t`);@^VzxgG31QjV>x5PkqBZ@dA$Ojr!SR{q1w*?!4ycwal& z*EyQ(BWQYRQhr58Lnue$MTwUM@8NxI_axfa@lPu>>&bEMe(cIE$vly>M(%v^&Y!;Z znYVuTt(W9?Ho1gXYgWihykpOCei`*#Ua;BoQ{9afi^8yXmhr;O%CffFIBbOR9>@CD zY#gJPuD#OUqMP>S=%!Xy)21%AudY73ztz9ChBa?!t?0eo_o-aL1e*Y7h7Q0oWl#*rJK99pu1;+o34V#_j2{X=E=oohAL2RjSAHQ)_^%^P`*q}qeAi6%lT6S@>EP&M_wF>b6fZu)8)-nnJcr?S7_S^{N`DSZNgC&~K$mOqfr3epT2UKKex+UhN>t|oB- z((0|jdMVZN_HTVHt$OQ~V%=fno$oWwI1uR@);Df_Vd>Tvls(_aUqs8W8#)xwqFC$f z2zM2x^^4g0o!|M~+n@f!w?F-jw_kqa?U#P6jZ@=_8ThJn=KH1*5 z&Se9fO}3bV>_MzX}erP!&FeN-}G$O+5S3v*iKn21_&8kcv@sDYLA-ore$n-IEVUb`=-Tsp| zU%dSfxBrfRU%&nLx4&}xo44P%{gs2Zo<;I;wzb?^d$!HeKg(ea9JHVP$5-sTz<<@< zIKrZXjDWj|6kDL7u8;-#fsbDlioW%`+u>uMp@0(%>>pooLN<$p>K7Rf$3rb9IiJue z-v#>+a8mpu;M$^+ueYq-BL02%ORwbc?=KAVe&6bi#yryN3j+zDya&|N-mC|#>k*l% z+v~0E(O75IH}-d(+C7gE>#mEf4mP@8b&GZGVqy#-xWofbf?u@YcF@6UG*a>;wZuPcpB+! zEFN-C-rT(2ez)H$}U&dXdvT)kf^G!5F9O2f<_g{`&sC z)#{OBZShKhz0%WLf5sC#Co}%{yz{=R*ZuRFfB4@G|FBn#{q+t`#=|5|%~;>uSTDmk zD1OskES|AUWF#v8!Jq%r*K=-|d%1}1h-g2z#2u-RVtlieD)PPQN)=h&>~VqHO&=E- zT^{==BeLfv7fN#YCrqh3e>+_@+z4zgzp@Ru{qJu74gBrj*rF5xknRGI72uMXt`N&$EG&pdl)}En7;3?;pU_uFqX6YSX{XwM7h5h%U zTd#M#6)|D{&Xa&%y>V;<_5f-Vk?6@=U-2h~L^(b-n|gLs-uj)m9;#i$k&m@jIwSGm zKYaCjul?S4z7dYGf<%{Jiz09rN(%EkvwAgMzX;1=Q5f71tH?}K;M0_h$>U*MSsuY5 z+FA|3eEM2y|xBnD|?r(1YEsR`X=B%qCvdnc5W)^+%is&+T z6??TdUh6#q=Ic7R(9+kDq|+_^uC2IpfTu#Tp&@0*-@Wzew?1Rd76JF%;>N94UT9yn zq9TE}w)}ZfpRu?ITV8$aqIE4wbiE0#s`k(+@4hldAs)8Ot zu*RESQs~mbE$wm$9rWGc@GvzGYtf>* z${;R0)ijD!YM#p-v_p3R#aLsAS{XF%3%il^3RJRp0Wd@M9X4r*U`hJ?H*ftmQs`&z z{GE-#xK-bQ^KE>eB?IkOrnu|vV^Vc^rNV}v@4nEv^~$xYH_@^$C;$C(Ej*d5+5jMT zm+@_CyTZ@_*}FN_-`{&-ZT0dol@|8rRR7kW_(LsRk<&fD3fE7z&u6Wt{JDO%yNL=3 zcc@iU>bQm`1*^f*$fMfaa>v?Wy_`su5gt zHP?EVH}KsF`dVYQefiZFehBNU``fUs10a^+Z~h0Qk2tD9dNZ)w>2v~E zXom+S0-T(QfC5msmU23`0^k4a>)(Iv>rSH1$bSGY6n)C+WtdW-vwro?e{rq$Yo^zJ z?ar5tY<#J+wqC9R~NGcBs2+^>iS&K6jV8TJa(ec&3ZuN($`` zml0iE-9RHko#OGXVQRcmaoQ4*Al<4Jk^SwLziC?QufF~A>-zHP-}&Aj{T13Yt6Dsc zB?+f(jl$;<6^aNtdU4Rg70#N$1qtN=Q3p1{3N`yJkTu|JfrrevMptkZ1eGHJp@W{w zKW1F_TomcEW(qj}-^6~3^-Lte@b$l;=lVA$@TdG}!Jt)ymc{xsgM@fBO2Le(&=yv76ud=D#nZ;6+)S?+F3Fbmy-@z~3Gz z@PuJwGw-jB6np4~OLImdUnuI_8^+NES0`+ZVrls(oC<}*NMvKUXCzWH?NOK}i2+wCu- zaem{?e{Bm}JcKhKZm)T<^rY!D3#&AUh_(7mRo&x@hhCD?Zwo|Z^S=A}Zww-$R9TQM zC3VaCyTgh1*1z8J%nN6h4RqvD=OqOtLps(g@bYnO+Wx|G@*p`ME&i@8c8* z`mF&KM3L}+ZKSUEw5WVMo?Yr1gs~#A&tTk%dq&pTSrcEkg($0`Jt=ZhVZYMSk&qRo z)1r1FZgl{zSn00tl~ybeLt|@V(H2lfaZXC0ADgusvYbz}yeeSwXPZ>@52X_f|1;fRW5ML@l9 z>kBKlzJQ~hhN)MIwClnubI|Rdo6c{?ZFQ<=P44I7sEws#oh5aeqw7|9>x=REz$oGf zi~Ep{(Xm|DM6H;5F4<>`SX`qgS6?80$5qg(kj^+IeoHHd^9=-I%~MzNdD}ttr@@Eh zp;Y)yFZ<2VY;jed#KXkfMaSj+#)V0{ezN^6>Y9OC#o1!Rc{b^xDFZ`kMZ?#OQ^K;v zl-K>hiai&JhGrZpkl>tV;|Y~cIxQVN@3c5heXE&inCNe=#c_<7o3Zq9IKEVIl6dJ$ z7i}XP;s{=aA9&-=mlLGp*WdbV>|l8Fd+n>pr(p+*B>dT1|K)mT<<=WqPqWhNtZt^Y z3XDQ;wT=7g@x`75;LWsBTgw&z_Q^ILB<&?x)NHT;hSJBWUCm2#`ybxJx)wV(?!r;$ z$rh4jvW__)W~xy=cJ=D2HxTrzS^2GRgtF1#om)s%7y+og_6rO?U8lh_;OlR{{MT>4 z{9oVx^s8@w`gO*Ty#4b3`JLZ?`Fo#z)etIfe;Bqyb+0{SI~$t5fq$>57IT zd0U0e8$1kx2wOjPc!aoWE}?M6fqMycYsU%;2uJ*l!zPa2{;&8*edYGoV_zcxb-jBT z#U&m|L1R5c`78Chc%E9Lir+1tl}4?4Y+sLW#3AMtV65EtUw!F&U;5I%-uHj^Pe&+z$w#%xe zwMML=RmdpWMNN3b!H0Ogg>cOqS_Ff-;(kEfv?u`}RJHsDq4?Qda=MB%=b#KjSm8PK@YQ)oM$p%f!Y4QGYK!S*@GY( z#*<2j8m%2MwgdqBD0^Pm94i$yDUw{?bSMoRT#@41LPZ1`xqq>6#1^JS1^%_rWbvG{ zSqLG-8XMsofD3jrHac=cDfAbIHr19Usy4&E#>z#;*v7XOyD9R-17#x=5%IktjI&oY z`q7N?{eTRO6nNqS+<2iDuZYfR|F*D2MSXEvqk(RiGY0rlwwMZIh<{-+sep7UNfGjTS4Dz<0?|F`PE+kD%UVrQ7%w}=kAWSwsy0( z)^B5DTl4<&O#VDcB3i4uF{(%-T`R78RBye;#T(Xm&ggcL(A(Bp_nMj9q7lj6I*L?s zZUsZZO~TRFK&oMWBTQcfMYIZPB?Y`wNh`c#9&dh<&Pydh>Wlq*pD$M$i^rBm$vPRB$yLk9>XBqJ?qkX> z=2l>k)CWE#a4kjVCE#=cwWGg>tNU;t@?J}H3v(mK@2{Y3|9egXbNse7DkAb@tryr; zFUaCXScUeL{RClkE+1QS4d8&qt)8-9oIKIS7Suy%CUfKX12e3>^d_7RJ2*rR;wBHM z>7!oIUnzu*M7XF;H*3vYPrUN~{BNJ}6YPo3)lTQD&IL78Qm*NTbL}#&mm1~t1*h(bBjdn1`7LT$hzOE`tgS&S+ z-KAB!QgcNlzes2l$k5I zUGg8SGo%G5R?r*<(Wc;o9dzGO0tkMf0bGN(RIq#H%~zE&(t)YagQY7}4ZnhVeUw)7 zKO;H3fduilARAx~s{PHIzmGpR|NR~s_R&htv$E6T#2q2ZL0}L&s!fRwB8ANvjR40y zbJ45L%*^DOz3=|<7r*x>fBv0s{QK|yJF#%Ak*6A*nVzZDE!AM{NF})#uEI&9G3Rwh zA_s}or04*%2vfi5+b;_zBs9&C0}(`IEnG7{^;dX|U2-T_d%T-x!vVm@%YUOxH|v-7<$nIy#FnSH3LE z7@;%~`bstk{)~^4PvyA&ufhjBug?FfP;in#q;;OS$2NvsJ%Ei29>2%UWI;4o~ zb(c~;;F)A501nw1NL&!E6s*^h6AGzM?^@y}FRi`8dSMj$FhXJatnuQ_WcJ+2PbNeX zt+}r=E20+!I=ZL4+qrp-9AsH*I6vfX=wx9B8ko3ZH*WQGiJzM2-RvxpaG|4C*mFg{ zg!CY-WU;T9;BWz`bve;~o;*$D{a7bIh-Ldo(`C{vgL{I|=6qN)_oH#yp0Xz`T|J;a zZS?VCU7&$PN^&CDh?D06dRq&7g9b0^wnFuta0?#y8gZX}I$LHZ{heL;mhY4fedqyI z@?qB9(#q;uJG=1S?@s2LCf&~&H${=#N@1eG`n_pd#Vz5^7EyELqO1c`*IG*(T~d>V zOVfZUOPaVRe5uASwfLnTzmPr;+QdI{7*@&;C@a9M<*TaB>PKyMj=y!_*ODNH3&u$t z!sX)OYH>c5Wsq!B=g+3|%HK9wwxk&q&wMxH(BR}Du7S zr?9cf(`YAG1r#FY1sn;93DPdt+MCJLR1U&Qc#E_*l*r5zi!E)ea(V1j$SNE9w^Id3 zAy-&B;AAq_N^D=JkHfM}N>{%zq*CuDICJe_Zs>w)@T*6z0_7Hf*-0jk9ZO1&l)zTK zLyUdTelK+P%}*u^mvS!$M4z(jvvZ?xz+P@I_Adk2MAo*lB@}P4;Xq!P_z5MIfbQ@AGvS91dzf(?b~Ku ztah$DKlmEOfRxp}}>bfx+BV`?;*tUryE!CI^%y=wQ2H%&vSpbf9|G}}>2|AP z%+W`)$<*LGj;Ha2ol<(mQV}QZ_)CX+8K2;il6=rd7a%KLYdx=a#l_rcZ7h>9@OefE zfVP%LV7IF3G!Yz60mxz94#s27hlqz%$lc})Mjqd$#N`36<|uND7(|a(XiKerLOpFO!Q2@+XS) zOj3)9giEBc zr0ZJ~(i=7`Z8*oJvt)S|qQ&Gb1t%#y^*Wpiyt;GpV$5ty;1Xt!pLlHU>`8GbF;m{q zCAgM6+*w-V=?*3B!ceoK4I5!YQ8y~Smo`*{1ZVJFAuKY8{n78O_!b(w!Y#}?th*b!3e@?4fR6_z)EGw%4YC#I2G^mN%s(-E z@xt8P`9sN*r{_=4o|!A1JA3Anhm1S7uQ21w6J*UToj-GW{-Wg?>aAW|U4sAtdnCny zu~uY&cs$p6sE7Sy z!A@`5D{D7eH+v+h#SdcH5F@bZfrO@_gWctvI4m+Qt^h&GGBZbu=4G#w7x z2*YZge7DRKFk{XfF`&S;*0Z1j=f3jMlAy?t=g`DN0_EavaY+)FOXfxpw}h-n_M0kH z$}-Rzl#vl&QAu|R&0n=dPOvf@?~C1KZh_S|Whyh_?x4S~IDFl!O4h~jB!{)Bpph(m z=zw(^_=q#d$$%Ut_{gNSlsF%G?*rh>4(BQ4`Aq9#`x9b++7S4IK`ctQ(TPhhtUEwp z`4uN*U;GW|TRcchJ)k*k1Li$-)kz|8lV!{sxRFHUn z?&SEt(0@EYt}>}=JP22Nm(=XRd=GV`9E3Z%q!*L&Dr6z9lpj&9#hrTevy5HhP?>=? zSg9y4RW+_geW62AV7@d?A*EUJxvEm^2MKCL@)0>FE#G@%`eBCLm>z%dZ#3{nKCF2k7(FNp{Gh-|W z>sS@YRURKpvL9!ys8Zh8;ow2}IhC_+?B9EK+U~X&{Xw~Mer&h3bauxst90;PkE*SI zWetCPY$t^k(%QOC$&Z^65?!RDL*mQ5$PPvd!@1;KQOe~HF#Y!<;EL-vK{ZQi9kMqv zna2A}ac23eneDsvi|yAH0pSt|Hby&OPf>K({0B2vN8WR9CO=`4`TdCHx#N=HH_Pvz+}J>@D2b0n^Eq1b4s!QMsT&wC zO4g~&j4V4!8qUi=If*Ksug)L`ZOVX9IAzRmDtDQxV=Cxb;(JrW!s2R25?-;bgGoq@ zX{r;L;88MkPIz{aH7~QJ;%)$oOn}a)lUhmoH1+Pu8}x}YEsS^Tk!&qn4v*=MP91Ep7Pn>ix5w*a=w=!>MoP;S3%Mh#a0Ir%s=l+eQl4c%=|Pj`xja@W-RZ!I6X5IS~a~N!jS)*4GIKE$H=;{7ey}RSS=Wys z25f`P6GopzPP;vMm@9U;Dk#X;l2RprBZB9M7UQ*+QgJyn9je~9jGVrg%F1e<<3WA8 zR)A}K*0s`B;G#1>P|cdRN0gkS@-Exju-m9Ru)^j=;6vPrW56{aXB*=G_@!)HzbIqF zhBiau@OO#{h10G$6UrA8v=RRhmnG~p|M}QMy2FqA*LFmCSTZ?cnwt_4jF9lE6-h~w z7`Yrxe`}dc{>x*MeRx(!#)11HCSUjNyTp9``%Ggeb3G3!&WH;~+A zrfinS_aIO5g*i%$txFVdj3ealnL9cDfw@y#i}o^D>T*L9?fJr*7DW3>{a-RcDm7*9 zjZ(Hm>zb4S)8%&}(X$5Al~WIEkF+uDsATNv+QTl`vp0HFd)K1~>eCo(U9xv!TataH z9wqxAcuNpRa7FmmJpP#`$In?^{YDMG>RJnQ419BO93h@87XYE~Gk|6>49)$HMy-R|ZP>#w&H$6UR{~@~5j&kysD;LK0 zY-q8A>Lvnl0jj7rKbC{59VW8x{Dog){mbL;G>QBdC6=qfi!S@~by`w-<%zK!lI=+E zA09ku54`eILD)yt(%i9&5vnTdSu5}0A`fXI^cr$tj`S5Qw?U`1tgC3j$0 z#cV!dgynt#l`5D}|gWADBog=&`jQ@nGBs56utOZj&!uz1&!>ip*k?>=&!v9n` zQ2PH^IWR(5N!mNpQ=+2WS_hdsl(tkN3@RN`r9$MK*U=PArw)!YGmRrZB29sz=eBwR zLIa~uY9I=F=KvO1Ir0>oaD$#K81CKqM$Ua0x8}~ypFZcFltB`Q<0n(Qd$ZueJ0PiH z7({49L_0KLW=)k7+9vmjWVyRZqfgn*Y1_#1(d35B+5KXd@srrN#sNDqVj_qgYdBJ= zeMnd`IroY4=Pq3Ql*Eirojv~eoG!0*AKeKI{Xy=Moz)Dk8jozB)G3L!F1YAxo8!xD&dc0-iYeFajoF%JLQtG>5<1<| ze3)Y_+&PM?-o{Q^}hl^uJ6 z1xGhjSL(m%EFW?VZygxBY`zs#TNC_~eS^&_wNup2PQ7>*4n5jvh329Dmeg ztH2s#PcaLWnAYkqjU6n*!8*Sw{?qQI64P2K>*c1*PGM>IDPg0Gu)(zG)c%=EXeOai zp)vk$)*9ze6UgB5%lr0^@7aBRr^asg+3~C*X+zDQ*Dw~U(-KVT)yOhu*F%Rgy7Tv0 zPSvb&oij5rF^2~fkB@s(tiAoFPz>}Eo+zB)Yx1{hZ7f|WFwO>u!PKHlm7=GVpwytK z)Wh)vzkq5yWHT+Ge0T&MO8MJY|6Nyq=?H9TX_$}$#WUEuN0{RcD?i}RX~LOa=&?m8sCdS zt6kP*w!m_#0%v#E1Clr^W% z%iU-hn+zrgF0{>5%sJ1j+=&s!5dB$1SlPpFYE;CQdQu!+z?TL-{weEE(rR+LSxfP;&4Afcl+plD16#`WbO~%1zq&YYQ zZAp;}%uTq6bEmG{D>okmh0B!$MM=53d(W)U_dNk$bG(J^g$&sibedXoH_2|2=iNR?%}#+id}4G}r_){vXTv?#17)vzE~Fl^2XGGWUGM_@iZo{vCb zHFgCiC@zYilYBk1)8IxIywfk6IV-beV zBfO7;s{oaM2BG8Q9M(WG2fCEEmFhmbQTkqxHV3U9!&B;Y`x{HR@5f_nX$?ER=2k)= z9C@BF$VV9prwDw8;mY7iB4AAqjkz-if!;KBs@j~cH*?zq@BiegjGOMMKeRdcC5EkW zc09)cL#kI+pHH0|iJL3UJ%0SeJn>Fl=7dLJ8zU&(Hta*sn0y+WQ$)kiX2nhHy3Yf?u~RZ z@;1&)`HOHF9aB*1OpnMiU1?T`7&t%aw4|Io*1mbI#nBDnIhO@c7_|!|gu8A=Q$1Yj z@!-$gihxf}6)lTjdG5q_hn9tZ4cPGPi2%F!1m?E*M3pO*{97g(6rV`XUVI|eeW7JH zj^x{s-J&vGcp{@n)t@+0>PQ%%J@VePIUAbvxOg3w6<$xvAQg^(Erko&@otsom4`5D z_(X~I)79?DTpsfoBs8Gj_y#b}t#>#^0*&?|I1Aj@7gi!B=&WTO%M!S3r)}GX9QA(@ z>!d_2)(OmMUeoRqvemZ!a-1;X!s!%1E2C`Nu2$AEE^lQ)nV7X*K zY_7+L7dmIV!W9(b*A$;Amlv^_vh8xiUbtV?2>vF{#6+9($|bQ-8o`02MHo0CS*x;7 z<86$qh3wLBZc{P7adV^Zm%{2)E)2VO7&hA4Eck!qW+?zNa4{3I%g;kwsP!;Mi|u#J zaB>(xwbKKb%1%{n2j8X55tF3N6G`)Zi#wEZN%arJir{JiJKY}`8Q=F^sO(Lba&N?@ zEA>73rp?@0$FbDMAk@qwezXiJ2onKaXJ+}q*pVR4J3>-V-;W(t%V|eOCP49s=7WSd zw;8R)MKH2tW|m<@N@+j@nh`*`-q+Q}N1``aRWp)Z^?@qlwc%8y}k-hPSWl~JB!W9ylvMtwDQm(B~z?w#9o zVO8=QBDbwc?mJ(xl4X}nKoNQvlBk(>>V5A<%GLi;78al+FbaxEtlyx zxY3&qg0qe`h}&$9T$`T}_g&Z(+QRbW(g-*?kX&26d}R|CB;+rSokPSfacWq7e!2?Q zsQ+lJ@Z-b+$|UT=ArNiFRAALOk+=ntbo_`H>l0iAtyPf&xWzHsk#`rF&PEZ1C{b;Z zRy&BNr4xmFwO^IWd-+v;Um&zKodLCjzY;`A+^2 z)M2C;np$31Q9n}0qQA6n5Zc6arN?*yHxwe$tF`!s4We3qm}d$aq1g*#55Mb>>hq1K zO)GlWp%bC^>a^SXrTz52$`8N)5Wg5}rusyi5#v6})B3?Ft+h`RYI`AM4M^r)jO){NXS zVGgXQ?@HMi)OKMJuUo)&GP!p$se^)-WB6H+$vXXOsBy?!i_r<5eHMaLn$z8Wl`032 zuG?<90(#yA>PfV@!;M4>pD2z;)er0d#~1+u;U@7jS zg^652DWNnR{Z1bEhMKU=wAOuX^2;^|ADn_vq`{{>Zu&N{W?(LXfS^)T1B;gM8qbig3!ZVM@$c4(P@urJg$n62@Qc^}aeruDNLW$l6EkJ_03rGA+}GCqEUuT7uUA*;mi>7ahW>J-+TPlT9CZ8z(| z@q%&ffn#d-SH>RDBFJM-af^FCh)1E;VNjbD2m=IQkwgo4yt*wtWO{P)JvoU2GF`v8 zULYx169i?T4YnmV6ghEn-<6~L4p*ihi+NPJcY*>+*E) zAz%f3Es}Chzt6cpGwu5QMjef-c~(1ix`Oqt3ce4R?qOK59|k?BsEmjw8?gQvzd_^{ z-xm2(?r4wAwk)5&ss*+g+%UJ=B_Lrz(S_9=^A8>Y%vvOYX&UXL%mMb z0ZUNl>Ze4VMHs_A3ow10KMf*3iG1DTohWXxc6MxsMlv5dL3(A;0Lsz+g-+p98nD{A zvbso449>$2A=j7T4HWgUtSs0Pf+`$1ODHN_sYLdIjScw7Nk5J9)~7>Q8QU0FA(wu5 zIJ_ZuW^k8nRAdFe76S@N*2$q!<%h)xY9P6nJ7NW8Zx>t8&$;0^%! z;b9z0ERD;hg^^N*jVy{8g<sF&OVX%a|lp687^q0#yfKi`AUf#@KW{DDQ$o5Zjw zKNm8KzoJN&Wn~lAql*_ z2TMv~5H}GX2NH80*&F|(;Pc7B*QYr8&d&x>_6N1EbaQ`Mou+f_$o4AtwL0VeXL z!lTKobXRYD@L_7v4jt0%?hmsT#Ss#D5SnS$)XbK>a;ogI;d#73qx=y2qUAUFnawGW zJ+x@sU_B62Fto5cGzJ!c4dR=k4kWZzH8^`z)3WMOqp~|Zs@tISsQN&7)Tmmm59;WW z9GjCIA_NkVgNWjomX~&l<;XFn$IjOXdW;fTRWW_%nqKW#&Ya6cQ9)#K1!I}iw^OcgzXBb4mu;g!Xf zWQC4wi81EjOfH(dqMusI%(b8xEPXOPx^OHghM7NOGtE0i<<_14q;KQ2^nN8 zc?_I)CFQcKN18ZXL?h`mDL+5T5y0IRI%tcm5)tsq>b1$1}`{t80M+ zoXhd7v8FsPP4GalfO7FLB>ZuBq$D^8 z6tTD2y?hxHIEvJKUL3VKaVY@F0nSnJ_e*d%;RF?9)ZZ}uXQ(uBDJ;?G+Hw8Rz&J}2 zn2<{b3mQoQC^T5p-5#E}WGAC)fZYzkF^6dw3|p#1Q)Ej$eSz#pkIj8D#^l0-u;G-s zbC!Gi*>P+6u0o1YvRCzO0WGr={IW%dy0TWjNJNBo4q)nQ!*O^MG6G znV#&GkQGWUzpIxo!;WaVl%(;A(`sML6x@j191o$SHs_sOHY%ne{&V>d?3P?dOr2y5 zTnmdJ@A-mbQ*=<6h@6U8#>=oj9p~4;tPRxWf{DjTr-<5P<52SSuRJ3kpzaMI2lj2r zoPM3VA^TEfOH-H)Oh<&yY+-SA)P%QWKnmnWo@AbxR~Ex4V3`ax?5D!<<@|=REYXzb zf{=VzI72bX>2C;Cc0ss#U_ z?l|%<8awo;F(=~>*@5~vHKa4hG1TH!MEhvm{uDM!aGwPh5cF09f8-W*B{_v z-5M1074^=pay~`Z)&AH6zrtsuuj2X%^c&(Em{Yxq+M!N1ARW!svN)D-ThNh-d+@k*wi0zbb)b=RhtOZa~-M%-*9}e{!np>>j zRM)BxKVi|7s;}?U>ah4x&@c5KH``8!(yT+U0Y%HHH90-kS=Fh6;{@o)fyYhl8;FM z#Ln%1hfR;oZd9z!`LP`jjK5?2Vg1KmFonm#>Rj+BKkC0=kLDHliAIJ};kzO~^_KwC zJ@y=6daoWlIrct%JY}Vy7z@q{Jo%(O`B(P$=`k%BNu#`p=VHqX3l?5ldB!{2wG<0} zmC1$_8|PY-e#A1B`W+2{LAmB#B;s0}Z<;y>*?wDP%13B`3`Q^V+D$ z_0Gs^xnd?X`Q!L+4_7cnSaql4QdwBy0kI?aT+^56aFe~-R374R@QfGdBHdrAn$&rm zlU`3KHK7h^JYD457temRL{dL$f zrLR~{emOZ(PAWJKR?y{Es^w&6I;kB=YK^2><5^AIlguxZPw(qJlgz^0nW6irIJ|v5 z{SE)K@+UnVVpfGZ3mq$(a}9~fUdke!f9+JBZD*HN9$q_+xojyghyHj$dALuM7R6?Z zv&2eB`X~ObtXKhlX^|(S8i~LHABjHDvr15F)|f=Sb)v*u&LQ%>H5nus?P-_9yPL@f zy8*U>583HxMgq}_n8m=He#DYU5UZp6$C?0jE;n`stAV{H^1MYRL+}{3qg=Llb>57+ z5qO32zFqvq%@95Xnj?Jxhd0Mhwe|!c($LvZt)CCv0f!J@4RGQPh85M)P6lgeYE~el zSV(5Eo|GzPLh#+N+1wSCH}+I%)4Gf|z0wX@F+`uoq%6)J9@q{zVfpqr8}Z(_TD|$QWK? zr}Q6FJkLLY_d5T`k1`3M`m`fjnXgK|E&FZ_p7wn1Q5d)O_VYeA=eTrydyapPBOVeU z(CPDij-<`@A&E^=uPnk6ZYjw>N~TVf_Vwa_2W@Ap8VD*M(MfhFQsZzUJY`tm8bfzv z7Jb8Y-_7n3C<_kVkBQplNNgq!1WnLAsW$=v%;&1|)Y;qnH)n0f@chXq5E)TaA4m7B4a?AJGw8HAe~x>G>ev}B56 z3kr$2a>^ht)zYkBsR^%OE^|FH+M!IP&?r|e71!QJ8~Dy#z*diRu0>}JWw}7Qi#v_P zCpQZz-6@pW!Y`#Ue<`AV9zTCE%EHn*c(P*`56!VCO-z*}$IqNO_te};oy<~4kh98E zWtbn*t~rjecKfKEhv2*0E21~he`zF)VLl*WSNW0IQCW2^nsOs5Euy?^vU<3MKoM2v=p-b) z_7p)FEVu+Nw+J$LnAD9CfPtJie!-VKU81~(2AN;llh~W;pS%zR>aZn+wT>(G!wA~} zyY@a^X%IBQX=6uQ#nJ`o1Ze6kk{H;ijEQMR+0M7X`&9$et|uH1;>7%BoSNjHa$_0h z*oEqHvtnMl2uY+K63bJyR_xmjwHLnyBLZ)l0hBYxausFe)(^5X3~9M`)%s~$KbLgy zG%BCa2U1<^2d+BT{9s3l%-XIatQFP~wWPX^bNVfPXEM?IjrlN(dmFncBN)40C^vlU zNY=6&XxyWk+`Te%8T?nP)ud@mbx!O`1q`GZ}}zPNpbyIY9qli z_MH+@YfX2(;X!$aRk%Tg8qFc3Qm7W0ag8!WS>G(Mk~)SP=w8$*lMoo_BAr-2RtOW4 z%}f=-vf2-CA+;;jnyO%CKkG5HfVxIqz{=W7WWvh2XrgAb!J$#BHT8$~MM|u?023>o zZPZR?LI}AR8luygQe;Wzu;#I*MLmwX)ffup$QMxoRcUx=^CxFKvY zlG@N{Z-mQrBEN>NcY_E -;; Created: 2013-07-11 -;; Keywords: emacs package elisp pidgin pomodoro org-mode -;; -;; This file is NOT part of GNU Emacs. -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2, or (at -;; your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with this program ; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. -;; -;;; commentary: -;; -;; Update Pidgin status as the Pomodoro progresses. -;; -;; (require 'org-pomodoro-pidgin) -;; -;;; code: -;; -;; The following code uses the "org-pompid" prefix for all "private" -;; functions (and an addition dash "-") and the "org-pomodoro-pidgin" -;; prefix for all "public" functions. - -(require 'org-pomodoro) - -(defgroup org-pomodoro-pidgin nil - "Customization group for the Pidgin integration with -org-pomodoro." - :group 'org-pomodoro) - -(defcustom org-pomodoro-pidgin-busy-status - "Pomodoro ends at %s" - "Status message when a pomodoro is in progress. -The string will be passed to `format' with the time when pomodoro -ends." - :group 'org-pomodoro-pidgin) - -(defcustom org-pomodoro-pidgin-break-status - "Available" - "Status message when a pomodoro is in progress." - :group 'org-pomodoro-pidgin) - -(defun org-pompid--status-type-to-id (type) - "Convert the symbol TYPE to the correspond int32. - -https://developer.pidgin.im/wiki/DbusHowto#CallingPidginmethods." - (cl-case type - (offline 1) - (available 2) - (unavailable 3) - (invisible 4) - (away 5) - (mobile 7) - (tune 8))) - -(defun org-pompid--call-method (method handler &rest args) - "Call METHOD with D-Bus and execute HANDLER upon answer. - -ARGS lists additional parameters for METHOD." - (when - (member "im.pidgin.purple.PurpleService" (dbus-list-known-names :session)) - (apply #'dbus-call-method-asynchronously - :session - "im.pidgin.purple.PurpleService" - "/im/pidgin/purple/PurpleObject" - "im.pidgin.purple.PurpleInterface" - method - handler - args))) - -(defun org-pompid--set-status-message (status message) - "Update STATUS with the MESSAGE." - (org-pompid--call-method - "PurpleSavedstatusSetMessage" - nil - :int32 status - message)) - -(defun org-pompid--new-transient-status (type handler) - "Create a new status of TYPE and execute HANDLER when created." - (org-pompid--call-method - "PurpleSavedstatusNew" - handler - "" - :int32 (org-pompid--status-type-to-id type))) - -(defun org-pompid--activate (status) - "Make STATUS the current one in Piding." - (org-pompid--call-method - "PurpleSavedstatusActivate" - nil - :int32 status)) - -(defun org-pompid--change-status-message (type message) - "Create a new status of TYPE with MESSAGE. - -TYPE must be valid for `org-pompid--status-type-to-id'." - (org-pompid--new-transient-status - type - (lambda (status) - (org-pompid--set-status-message status message) - (org-pompid--activate status)))) - -(defun org-pompid--format-message (message) - "Replace the %s in MESSAGE with the time when pomodoro ends." - (format - message - (format-time-string - "%H:%M" - (time-add (current-time) (seconds-to-time org-pomodoro-countdown))))) - -(add-hook - 'org-pomodoro-started-hook - (lambda () - (org-pompid--change-status-message - 'unavailable - (org-pompid--format-message org-pomodoro-pidgin-busy-status)))) - -(add-hook - 'org-pomodoro-finished-hook - (lambda () - (org-pompid--change-status-message - 'available - org-pomodoro-pidgin-break-status))) - -(add-hook - 'org-pomodoro-killed-hook - (lambda () - (org-pompid--change-status-message - 'available - org-pomodoro-pidgin-break-status))) - -(provide 'org-pomodoro-pidgin) -;;; org-pomodoro-pidgin.el ends here diff --git a/elpa/org-pomodoro-20190530.1445/org-pomodoro-pidgin.elc b/elpa/org-pomodoro-20190530.1445/org-pomodoro-pidgin.elc deleted file mode 100644 index afaa12199c79884c8a02de811950101bdf15bd1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3866 zcmcgvO>f&q5Os{y>Vlwh;%26C-jCg(VBlcaPyWs#&A z&t)P~@;j}-Smucu6Prv(WGa~^|1t%$Y&DGWa-2vSVihVRmlWToY??$Ai%6tSO-4`kNrk6gzx4s&U#?$Lt#ob86oSc5pZsYPE z_I*#^__zXGySPGJ9bDd4Y3%j`?c{m5;OGS>C-|#fwOdek!?O#wj&Z}o3%7RHp{tyK zD3Y9$$VYA_rXm(O@>)nGrf$rm3Cp=V%0-c_c(_>-kAPE}OvpJl-X%fEIuC`;I;RWk zm!yi1a>F3fyy~a*{aOwk*vCHFc*gRCU4vwG?{aVVx{$Z7R7@3MVv$Cgs`^vYl$uxV zGOfM|v*|r|E~@Z&8cSk|wxly4kD6X{Ku*uDH04sV5vTc>r^INH63`v-X1N&U@M!hZ zOGIb6j)<@|c$hIML3SnRJ>s7-^~3~g5`hvb7p<1;r}`X-eQj_#XE#-Jp9JGScaCN( zndscu5d5zX0S|Vz8_hpFzY9r7Q8db&RNhXn#e^>Zx;WLLXcQxnBkD|`>VRb6qmaf* zW%6KWC+0Ig5gE^0mJ+RGx-(C1lAROab0+3WG>?G{B*9W)%GFpPY!tvSHJfbz)_5B8 zA)6#j(vvb7Sj;WMchzmiT_xNk2CRPAwZPufHPLtaemnSa1NT1eG`ri{5Lm-c+OS(U zgx2t@HgxKSt~ES@0oAo!3iV_5aJ8Ynhga^=(T4gSp4}t-T^r0EC^P;6IyxL84;+kR z6?o)RkuLuWkltA$6HWPDVsmy&Ax*`#*4Zwp0uS#EV0qenL@n~#VP|__APhp%S*G*T z%d8qa6^hf@(d&~}r*EkMk}$|QP-`@f-oEJ3B#{cvah&M#VH0pU zXTS=IOS+cr!X;|uF4c06!3{-vnY*FX)#+O70b*y@Uy2@(@F9Fbh^&V{BWVli(=w># z&`98eP5pknsj)#qon%@uE-UhE!dn;SqsQ}E5^;xO@Xys@xi_hpr!E>4n#=*Zm1%P< z%O^3`gn>W{g^GG>#*D+o~@bV$UL7*^x1z6bb zTEN0xdY8ovnDj1>F5mT*I&ps5>m9u~Ei+wO%P;RvujHz#mP){ySE0ANnq{5Z`}ffx zOa|+fR!adnWg^*($5vi@T%B84bd2I37!erIUKQ7Vuy5nq^XVAMg}4}{d=7y$@+^i{ zPS%mp2yJ8@ifgJ+k@fDFvA(Nv&^X~~6+O7M67_codC^QC{P6JWV}H%(Kp73n#9V3h zdU+bqewh*93&RrWfX>;?0%xP91=KWEBv8)iDbPiz;|kz+2aO>pnd$u2ln^mu7O-)C z|LCjHJt~)6#kNyLvg?=FdfxtL!8P;ZlD?*YOfeeh&Nzd*$3{rr*J)?zQ4{zlbq0Kq z^_U9N5&sPFHT;Xz;NHwrpaE_>ko7<}46nUq6kdx;{cLOLH3gLJa&W7fk*9l3TQ6hB zw|metU1KxMvk?Z38MFc-y0ZS7lC5uF0j=fU>8Jfvw@WJr+gelF6+WH7w@mAX^pbGX!(Pv;OaV~Fj?Urf23YoO$IN?Nkeq+n5MNJmII%bO3875!e(95ZEN z_AOEsLz^`*FfElIu0A3_)juQ1**ZJeI(Nu?hxUZg)D(|#BFT~9SnARUX{JWh27@w;TTfVEnNN diff --git a/elpa/org-pomodoro-20190530.1445/org-pomodoro-pkg.el b/elpa/org-pomodoro-20190530.1445/org-pomodoro-pkg.el deleted file mode 100644 index 7e59320c..00000000 --- a/elpa/org-pomodoro-20190530.1445/org-pomodoro-pkg.el +++ /dev/null @@ -1,11 +0,0 @@ -(define-package "org-pomodoro" "20190530.1445" "Pomodoro implementation for org-mode." - '((alert "0.5.10") - (cl-lib "0.5")) - :authors - '(("Arthur Leonard Andersen" . "leoc.git@gmail.com")) - :maintainer - '("Arthur Leonard Andersen" . "leoc.git@gmail.com") - :url "https://github.com/lolownia/org-pomodoro") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/org-pomodoro-20190530.1445/org-pomodoro.el b/elpa/org-pomodoro-20190530.1445/org-pomodoro.el deleted file mode 100644 index 30e69217..00000000 --- a/elpa/org-pomodoro-20190530.1445/org-pomodoro.el +++ /dev/null @@ -1,655 +0,0 @@ -;;; org-pomodoro.el --- Pomodoro implementation for org-mode. - -;; Author: Arthur Leonard Andersen , Marcin Koziej -;; URL: https://github.com/lolownia/org-pomodoro -;; Created: May 10, 2013 -;; Version: 2.1.0 -;; Package-Requires: ((alert "0.5.10") (cl-lib "0.5")) - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Org-pomodoro introduces an easy way to clock time in org-mode with -;; the pomodoro technique. You can clock into tasks with starting a -;; pomodoro time automatically. Each finished pomodoro is followed by -;; a break timer. If you completed 4 pomodoros in a row the break is -;; longer that the shorter break between each pomodoro. -;; -;; For a full explanation of the pomodoro technique, have a look at: -;; http://www.pomodorotechnique.com - -;;; Code: -(eval-when-compile - (require 'cl-lib)) - -(require 'timer) -(require 'org) -(require 'org-agenda) -(require 'org-clock) -(require 'org-timer) -(require 'alert) - -;;; Custom Variables - -(defgroup org-pomodoro nil - "Org pomodoro customization" - :tag "Org Pomodoro" - :group 'org-progress) - -(defcustom org-pomodoro-long-break-frequency 4 - "The maximum number of pomodoros until a long break is started." - :group 'org-pomodoro - :type 'integer) - -(defcustom org-pomodoro-ask-upon-killing t - "Determines whether to ask upon killing a pomodoro or not." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-play-sounds t - "Determines whether sounds are played or not." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-manual-break nil - "Whether the user needs to exit manually from a running pomodoro to enter a break. - -If non-nil, after the time is up for a pomodoro, an \"overtime\" -state is entered until ‘org-pomodoro’ is invoked, which then -finishes the pomodoro and enters the break period." - :group 'org-pomodoro - :type 'boolean) - -;; Pomodoro Values - -(defcustom org-pomodoro-length 25 - "The length of a pomodoro in minutes." - :group 'org-pomodoro - :type 'integer) - -(defcustom org-pomodoro-time-format "%.2m:%.2s" - "Defines the format of the time representation in the modeline." - :group 'org-pomodoro - :type 'string) - -(defcustom org-pomodoro-format "Pomodoro~%s" - "The format of the mode line string during a pomodoro session." - :group 'org-pomodoro - :type 'string) - - -(defcustom org-pomodoro-audio-player (or (executable-find "aplay") - (executable-find "afplay")) - "Music player used to play sounds." - :group 'org-pomodoro - :type 'string) - -;;; POMODORO START SOUND -(defcustom org-pomodoro-start-sound-p nil - "Determines whether to play a sound when a pomodoro started. - -Use `org-pomodoro-start-sound' to determine what sound that should be." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-start-sound (when load-file-name - (concat (file-name-directory load-file-name) - "resources/bell.wav")) - "The path to a sound file that´s to be played when a pomodoro is started." - :group 'org-pomodoro - :type 'file) - -(defcustom org-pomodoro-start-sound-args nil - "Arguments used when playing the `org-pomodoro-start-sound'." - :group 'org-pomodoro - :type 'string) - - -;;; POMODORO FINISHED SOUND -(defcustom org-pomodoro-finished-sound-p t - "Determines whether to play a sound when a pomodoro finished. - -Use `org-pomodoro-finished-sound' to determine what sound that should be." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-finished-sound (when load-file-name - (concat (file-name-directory load-file-name) - "resources/bell.wav")) - "The path to a sound file that´s to be played when a pomodoro was finished." - :group 'org-pomodoro - :type 'file) - -(defcustom org-pomodoro-finished-sound-args nil - "Arguments used when playing the `org-pomodoro-finished-sound'." - :group 'org-pomodoro - :type 'string) - -;;; POMODORO OVERTIME SOUND -(defcustom org-pomodoro-overtime-sound-p t - "Determines whether to play a sound when a pomodoro starts to run overtime. - -Use `org-pomodoro-overtime-sound' to determine what sound that should be." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-overtime-sound (when load-file-name - (concat (file-name-directory load-file-name) - "resources/bell.wav")) - "The path to a sound file that´s to be played when a pomodoro runs overtime." - :group 'org-pomodoro - :type 'file) - -(defcustom org-pomodoro-overtime-sound-args nil - "Arguments used when playing the `org-pomodoro-overtime-sound'." - :group 'org-pomodoro - :type 'string) - -;;; POMODORO KILLED SOUND -(defcustom org-pomodoro-killed-sound-p nil - "Determines whether to play a sound when a pomodoro killed. - -Use `org-pomodoro-killed-sound' to determine what sound that should be." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-killed-sound nil - "The path to a sound file, that´s to be played when a pomodoro is killed." - :group 'org-pomodoro - :type 'file) - -(defcustom org-pomodoro-killed-sound-args nil - "Arguments used when playing the `org-pomodoro-killed-sound'." - :group 'org-pomodoro - :type 'string) - -;;; POMODORO SHORT-BREAK SOUND -(defcustom org-pomodoro-short-break-sound-p t - "Determines whether to play a sound when a short-break finished. - -Use `org-pomodoro-short-break-sound' to determine what sound that should be." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-clock-break nil - "When t, also clocks time during breaks." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-short-break-sound (when load-file-name - (concat (file-name-directory load-file-name) - "resources/bell.wav")) - "The path to a sound file that´s to be played when a break was finished." - :group 'org-pomodoro - :type 'file) - -(defcustom org-pomodoro-short-break-sound-args nil - "Arguments used when playing the `org-pomodoro-short-break-sound'." - :group 'org-pomodoro - :type 'string) - -;;; POMODORO LONG-BREAK SOUND -(defcustom org-pomodoro-long-break-sound-p t - "Determines whether to play a sound when a long-break finished. - -Use `org-pomodoro-long-break-sound' to determine what sound that should be." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-long-break-sound (when load-file-name - (concat (file-name-directory load-file-name) - "resources/bell_multiple.wav")) - "The path to a sound file that´s to be played when a long break is finished." - :group 'org-pomodoro - :type 'file) - -(defcustom org-pomodoro-long-break-sound-args nil - "Arguments used when playing the `org-pomodoro-long-break-sound'." - :group 'org-pomodoro - :type 'string) - -;;; POMODORO TICKING SOUND -(defcustom org-pomodoro-ticking-sound-p nil - "Determines whether ticking sounds are played or not." - :group 'org-pomodoro - :type 'boolean) - -(defcustom org-pomodoro-ticking-sound (when load-file-name - (concat (file-name-directory load-file-name) - "resources/tick.wav")) - "The path to a sound file that´s to be played while a pomodoro is running." - :group 'org-pomodoro - :type 'file) - -(defcustom org-pomodoro-ticking-sound-args nil - "Arguments used when playing the `org-pomodoro-ticking-sound'." - :group 'org-pomodoro - :type 'string) - -(defcustom org-pomodoro-ticking-sound-states '(:pomodoro :short-break :long-break) - "The states in which to play ticking sounds." - :group 'org-pomodoro - :type 'list) - -(defcustom org-pomodoro-ticking-frequency 1 - "The frequency at which to playback the ticking sound." - :group 'org-pomodoro - :type 'list) - -;;; OVERTIME VALUES -(defcustom org-pomodoro-overtime-format "+%s" - "The format of the mode line during a pomodoro running overtime." - :group 'org-pomodoro - :type 'string) - -;;; BREAK VALUES -(defcustom org-pomodoro-short-break-length 5 - "The length of a short break in minutes." - :group 'org-pomodoro - :type 'integer) - -(defcustom org-pomodoro-short-break-format "Short Break~%s" - "The format of the mode line string during a short break." - :group 'org-pomodoro - :type 'string) - -(defcustom org-pomodoro-long-break-length 20 - "The length of a long break in minutes." - :group 'org-pomodoro - :type 'integer) - -(defcustom org-pomodoro-long-break-format "Long Break~%s" - "The format of the mode line string during a long break." - :group 'org-pomodoro - :type 'string) - -(defcustom org-pomodoro-expiry-time 120 - "The time in minutes for which a pomodoro group is valid. -The size of a pomodoro group is defined by `org-pomodoro-long-break-frequency'. - -If you do not clock in for this period of time you will be prompted -whether to reset the pomodoro count next time you call `org-pomodoro'." - :group 'org-pomodoro - :type 'integer) - -(defcustom org-pomodoro-keep-killed-pomodoro-time nil - "Keeps the clocked time of killed pomodoros." - :group 'org-pomodoro - :type 'boolean) - -;; Hooks - -(defvar org-pomodoro-started-hook nil - "Hooks run when a pomodoro is started.") - -(defvar org-pomodoro-finished-hook nil - "Hooks run when a pomodoro is finished.") - -(defvar org-pomodoro-overtime-hook nil - "Hooks run when a pomodoro enters overtime.") - -(defvar org-pomodoro-killed-hook nil - "Hooks run when a pomodoro is killed.") - -(defvar org-pomodoro-break-finished-hook nil - "Hook run after any break has finished. -Run before a break's specific hook.") - -(defvar org-pomodoro-long-break-finished-hook nil - "Hooks run when a long break is finished.") - -(defvar org-pomodoro-short-break-finished-hook nil - "Hooks run when short break is finished.") - -(defvar org-pomodoro-tick-hook nil - "Hooks run every second during a pomodoro.") - -;; Faces - -(defface org-pomodoro-mode-line - '((t (:foreground "tomato1"))) - "Face of a pomodoro in the modeline." - :group 'faces) - -(defface org-pomodoro-mode-line-overtime - '((t (:foreground "tomato3" :weight bold))) - "Face of a pomodoro running overtime in the modeline." - :group 'faces) - -(defface org-pomodoro-mode-line-break - '((t (:foreground "#2aa198"))) - "Face of a pomodoro break in the modeline ." - :group 'faces) - -;; Temporary Variables - -(defvar org-pomodoro-mode-line "") -(put 'org-pomodoro-mode-line 'risky-local-variable t) - -(defvar org-pomodoro-timer nil - "The timer while a pomodoro or a break.") - -(defvar org-pomodoro-end-time nil - "The end time of the current pomodoro phase.") - -(defvar org-pomodoro-state :none - "The current state of `org-pomodoro`. -It changes to :pomodoro when starting a pomodoro and to :longbreak -or :break when starting a break.") - -(defvar org-pomodoro-count 0 - "The number of pomodoros since the last long break.") - -(defvar org-pomodoro-last-clock-in nil - "The last time the pomodoro was set.") - -;;; Internal - -;; Helper Functions - -(defun org-pomodoro-active-p () - "Retrieve whether org-pomodoro is active or not." - (not (eq org-pomodoro-state :none))) - -(defun org-pomodoro-expires-p () - "Return true when the last clock-in was more than `org-pomodoro-expiry-time`." - (let ((delta-minutes (/ (float-time (time-subtract (current-time) org-pomodoro-last-clock-in)) 60))) - (> delta-minutes org-pomodoro-expiry-time))) - -(defun org-pomodoro-sound-p (type) - "Return whether to play sound of given TYPE." - (cl-case type - (:start org-pomodoro-start-sound-p) - (:pomodoro org-pomodoro-finished-sound-p) - (:overtime org-pomodoro-overtime-sound-p) - (:killed org-pomodoro-killed-sound-p) - (:short-break org-pomodoro-short-break-sound-p) - (:long-break org-pomodoro-long-break-sound-p) - (:tick org-pomodoro-ticking-sound-p) - (t (error "Unknown org-pomodoro sound: %S" type)))) - -(defun org-pomodoro-sound (type) - "Return the sound file for given TYPE." - (cl-case type - (:start org-pomodoro-start-sound) - (:pomodoro org-pomodoro-finished-sound) - (:overtime org-pomodoro-overtime-sound) - (:killed org-pomodoro-killed-sound) - (:short-break org-pomodoro-short-break-sound) - (:long-break org-pomodoro-long-break-sound) - (:tick org-pomodoro-ticking-sound) - (t (error "Unknown org-pomodoro sound: %S" type)))) - -(defun org-pomodoro-sound-args (type) - "Return the playback arguments for given TYPE." - (cl-case type - (:start org-pomodoro-start-sound-args) - (:pomodoro org-pomodoro-finished-sound-args) - (:overtime org-pomodoro-overtime-sound-args) - (:killed org-pomodoro-killed-sound-args) - (:short-break org-pomodoro-short-break-sound-args) - (:long-break org-pomodoro-long-break-sound-args) - (:tick org-pomodoro-ticking-sound-args) - (t (error "Unknown org-pomodoro sound: %S" type)))) - -(defun org-pomodoro-play-sound (type) - "Play an audio file specified by TYPE (:pomodoro, :short-break, :long-break)." - (let ((sound (org-pomodoro-sound type)) - (args (org-pomodoro-sound-args type))) - (cond ((and (fboundp 'sound-wav-play) - org-pomodoro-play-sounds - sound) - (sound-wav-play sound)) - ((and org-pomodoro-audio-player - org-pomodoro-play-sounds - sound) - (start-process-shell-command - "org-pomodoro-audio-player" nil - (mapconcat 'identity - `(,org-pomodoro-audio-player - ,@(delq nil (list args (shell-quote-argument (expand-file-name sound))))) - " ")))))) - -(defun org-pomodoro-maybe-play-sound (type) - "Play an audio file specified by TYPE." - (when (org-pomodoro-sound-p type) - (org-pomodoro-play-sound type))) - -(defun org-pomodoro-remaining-seconds () - "Return the number of seconds remaining in the current phase as a float. -Negative if the current phase is over." - (float-time (time-subtract org-pomodoro-end-time (current-time)))) - -(defun org-pomodoro-format-seconds () - "Format the time remaining in the current phase with the format specified in -org-pomodoro-time-format." - (format-seconds org-pomodoro-time-format - (if (eq org-pomodoro-state :overtime) - (- (org-pomodoro-remaining-seconds)) - (org-pomodoro-remaining-seconds)))) - -(defun org-pomodoro-update-mode-line () - "Set the modeline accordingly to the current state." - (let ((s (cl-case org-pomodoro-state - (:pomodoro - (propertize org-pomodoro-format 'face 'org-pomodoro-mode-line)) - (:overtime - (propertize org-pomodoro-overtime-format - 'face 'org-pomodoro-mode-line-overtime)) - (:short-break - (propertize org-pomodoro-short-break-format - 'face 'org-pomodoro-mode-line-break)) - (:long-break - (propertize org-pomodoro-long-break-format - 'face 'org-pomodoro-mode-line-break))))) - (setq org-pomodoro-mode-line - (when (and (org-pomodoro-active-p) (> (length s) 0)) - (list "[" (format s (org-pomodoro-format-seconds)) "] ")))) - (force-mode-line-update t)) - -(defun org-pomodoro-kill () - "Kill the current timer, reset the phase and update the modeline." - (org-pomodoro-killed)) - -(defun org-pomodoro-tick () - "A callback that is invoked by the running timer each second. -It checks whether we reached the duration of the current phase, when 't it -invokes the handlers for finishing." - (when (and (not (org-pomodoro-active-p)) org-pomodoro-timer) - (org-pomodoro-reset)) - (when (org-pomodoro-active-p) - ;; The first element of a time value is the high-order part of the seconds - ;; value. This is less than 0 if org-pomodoro-end-time is in the past of - ;; the current-time. - (when (< (org-pomodoro-remaining-seconds) 0) - (cl-case org-pomodoro-state - (:pomodoro (if org-pomodoro-manual-break - (org-pomodoro-overtime) - (org-pomodoro-finished))) - (:short-break (org-pomodoro-short-break-finished)) - (:long-break (org-pomodoro-long-break-finished)))) - (run-hooks 'org-pomodoro-tick-hook) - (org-pomodoro-update-mode-line) - (when (and (member org-pomodoro-state org-pomodoro-ticking-sound-states) - (equal (mod (truncate (org-pomodoro-remaining-seconds)) - org-pomodoro-ticking-frequency) - 0)) - (org-pomodoro-maybe-play-sound :tick)))) - -(defun org-pomodoro-set (state) - "Set the org-pomodoro STATE." - (setq org-pomodoro-state state - org-pomodoro-end-time - (cl-case state - (:pomodoro (time-add (current-time) (* 60 org-pomodoro-length))) - (:overtime (current-time)) - (:short-break (time-add (current-time) (* 60 org-pomodoro-short-break-length))) - (:long-break (time-add (current-time) (* 60 org-pomodoro-long-break-length)))) - org-pomodoro-timer (run-with-timer t 1 'org-pomodoro-tick))) - -(defun org-pomodoro-start (&optional state) - "Start the `org-pomodoro` timer. -The argument STATE is optional. The default state is `:pomodoro`." - (when org-pomodoro-timer (cancel-timer org-pomodoro-timer)) - - ;; add the org-pomodoro-mode-line to the global-mode-string - (unless global-mode-string (setq global-mode-string '(""))) - (unless (memq 'org-pomodoro-mode-line global-mode-string) - (setq global-mode-string (append global-mode-string - '(org-pomodoro-mode-line)))) - - (org-pomodoro-set (or state :pomodoro)) - - (when (eq org-pomodoro-state :pomodoro) - (org-pomodoro-maybe-play-sound :start) - (run-hooks 'org-pomodoro-started-hook)) - (org-pomodoro-update-mode-line) - (org-agenda-maybe-redo)) - -(defun org-pomodoro-reset () - "Reset the org-pomodoro state." - (when org-pomodoro-timer - (cancel-timer org-pomodoro-timer)) - (setq org-pomodoro-state :none - org-pomodoro-end-time nil) - (org-pomodoro-update-mode-line) - (org-agenda-maybe-redo)) - -(defun org-pomodoro-notify (title message) - "Send a notification with TITLE and MESSAGE using `alert'." - (alert message :title title :category 'org-pomodoro)) - -;; Handlers for pomodoro events. - -(defun org-pomodoro-overtime () - "Is invoked when the time for a pomodoro runs out. -Notify the user that the pomodoro should be finished by calling ‘org-pomodoro’" - (org-pomodoro-maybe-play-sound :overtime) - (org-pomodoro-notify "Pomodoro completed. Now on overtime!" "Start break by calling ‘org-pomodoro’") - (org-pomodoro-start :overtime) - (org-pomodoro-update-mode-line) - (run-hooks 'org-pomodoro-overtime-hook)) - -(defun org-pomodoro-finished () - "Is invoked when a pomodoro was finished successfully. -This may send a notification, play a sound and start a pomodoro break." - (unless org-pomodoro-clock-break - (org-clock-out nil t)) - (org-pomodoro-maybe-play-sound :pomodoro) - (setq org-pomodoro-count (+ org-pomodoro-count 1)) - (if (zerop (mod org-pomodoro-count org-pomodoro-long-break-frequency)) - (org-pomodoro-start :long-break) - (org-pomodoro-start :short-break)) - (org-pomodoro-notify "Pomodoro completed!" "Time for a break.") - (org-pomodoro-update-mode-line) - (org-agenda-maybe-redo) - (run-hooks 'org-pomodoro-finished-hook)) - -(defun org-pomodoro-killed () - "Is invoked when a pomodoro was killed. -This may send a notification, play a sound and adds log." - (org-pomodoro-reset) - (org-pomodoro-notify "Pomodoro killed." "One does not simply kill a pomodoro!") - (when (org-clocking-p) - (if org-pomodoro-keep-killed-pomodoro-time - (org-clock-out nil t) - (org-clock-cancel))) - (run-hooks 'org-pomodoro-killed-hook)) - -(defun org-pomodoro-short-break-finished () - "Is invoked when a short break is finished. -This may send a notification and play a sound." - (when org-pomodoro-clock-break - (org-clock-out nil t)) - (org-pomodoro-reset) - (org-pomodoro-notify "Short break finished." "Ready for another pomodoro?") - (org-pomodoro-maybe-play-sound :short-break) - (run-hooks 'org-pomodoro-break-finished-hook 'org-pomodoro-short-break-finished-hook)) - -(defun org-pomodoro-long-break-finished () - "Is invoked when a long break is finished. -This may send a notification and play a sound." - (when org-pomodoro-clock-break - (org-clock-out nil t)) - (org-pomodoro-reset) - (org-pomodoro-notify "Long break finished." "Ready for another pomodoro?") - (org-pomodoro-maybe-play-sound :long-break) - (run-hooks 'org-pomodoro-break-finished-hook 'org-pomodoro-long-break-finished-hook)) - -(defun org-pomodoro-extend-last-clock () - "Extends last clock to `current-time'." - (interactive) - (save-window-excursion - (org-clock-goto) - (when (re-search-forward ":LOGBOOK:" (save-excursion (outline-next-heading)) t) - (org-flag-drawer nil)) - (let ((last-clock (car org-clock-history))) - (switch-to-buffer (marker-buffer last-clock)) - (goto-char last-clock) - (let ((item-end (save-excursion (org-end-of-subtree t)))) - (when (re-search-forward "CLOCK: \\(\\[.*?\\]\\)" item-end t) - (kill-line) - (org-clock-clock-out - (cons (copy-marker (match-end 1) t) - (org-time-string-to-time (match-string 1))))))))) - -;;;###autoload -(defun org-pomodoro (&optional arg) - "Start a new pomodoro or stop the current one. - -When no timer is running for `org-pomodoro` a new pomodoro is started and -the current task is clocked in. Otherwise EMACS will ask whether we´d like to -kill the current timer, this may be a break or a running pomodoro." - (interactive "P") - - (when (and org-pomodoro-last-clock-in - org-pomodoro-expiry-time - (org-pomodoro-expires-p) - (y-or-n-p "Reset pomodoro count? ")) - (setq org-pomodoro-count 0)) - (setq org-pomodoro-last-clock-in (current-time)) - - (cond - ;; possibly break from overtime - ((and (org-pomodoro-active-p) (eq org-pomodoro-state :overtime)) - (org-pomodoro-finished)) - ;; Maybe kill running pomodoro - ((org-pomodoro-active-p) - (if (or (not org-pomodoro-ask-upon-killing) - (y-or-n-p "There is already a running timer. Would you like to stop it? ")) - (org-pomodoro-kill) - (message "Alright, keep up the good work!"))) - ;; or start and clock in pomodoro - (t - (cond - ((equal arg '(4)) - (let ((current-prefix-arg '(4))) - (call-interactively 'org-clock-in))) - ((equal arg '(16)) - (call-interactively 'org-clock-in-last)) - ((memq major-mode (list 'org-mode 'org-journal-mode)) - (call-interactively 'org-clock-in)) - ((eq major-mode 'org-agenda-mode) - (org-with-point-at (org-get-at-bol 'org-hd-marker) - (call-interactively 'org-clock-in))) - (t (let ((current-prefix-arg '(4))) - (call-interactively 'org-clock-in)))) - (org-pomodoro-start :pomodoro)))) - -(provide 'org-pomodoro) - -;;; org-pomodoro.el ends here diff --git a/elpa/org-pomodoro-20190530.1445/org-pomodoro.elc b/elpa/org-pomodoro-20190530.1445/org-pomodoro.elc deleted file mode 100644 index eb4e36386f913d8a92892e55e0208b7e00edde34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21621 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 diff --git a/elpa/org-pomodoro-20190530.1445/resources/bell.wav b/elpa/org-pomodoro-20190530.1445/resources/bell.wav deleted file mode 100644 index a49a65b11202c7580d946cf3107e574541054dc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35850 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 diff --git a/elpa/org-pomodoro-20190530.1445/resources/bell_multiple.wav b/elpa/org-pomodoro-20190530.1445/resources/bell_multiple.wav deleted file mode 100644 index fde31855707f6d60e45dd0c726d55a0084a6514d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42762 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 b<|V;*qEx@Q=P^IP%Zb-&-WF{vCwlMyipkJL diff --git a/elpa/org-pomodoro-20190530.1445/resources/tick.wav b/elpa/org-pomodoro-20190530.1445/resources/tick.wav deleted file mode 100644 index 3c7e3a698b97042a390536ed993979d251487bcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37616 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 y`28&F zILNr&=;{ThVbu=I+2B$B3f^M9Dt< zWCEVCidVZBN48;YRY8{d0H`{O|FwZWeO#$VHt_KLrtx#0sN4ri*j4W(9{O2VgtnJ) z$7UYukY+hnS%TIou~Y?lwYrEtvfv8*>@N3&8s|(A>yl#6wiTVWqJc&%X?>7GLhH+0 zMP1xtO{KiH3h&v$irkf0M1SBC(R!6=t;eUH#U8hcxkGQbhDCiR)@I~9$nSF7p`unt zx!(6}dCtn&%u<)|?_EU=kD%Q>jCBWIe+wqKo7D_+e)Kf5P4uxHUG2c;H;J(g==KDPovrAd4*W6(B`_b_7Vg=KV zT!&a+8PaS-1LmPaMftU(pG>oec+)H9^Vb9zH^k#kaRoJu+sKI1Sg8)Fx3UILa6QYK zti$Y_Tq3e|<29R+{vfe%4P7lnmR6$2Q&?+@D6+J;+VB}TIo9Uq@Kms-#b{zBS17%o zY;&IY*pF{`3T+>{xJ@i=M&3(g_1nazeOI%WU8^(L=NTSX&{ieSZbTdPNZUs&FM}V1 zvv7m-k9xokng5O=mgX3z9oerkLNBu&W}Hjd>;_|6^J)p>U?1zb#@NPMDHf_<>{v=| zGfA(qfyg+31~O>FTy`4FKf?H1@fi1$%$vr#`|M4~aSC)D0_{#A(JFK~g!b(&ct&?G z*687{Bk0rW&V6<55^}RyvjZKh!bZ)YSXI#n#00(h4y%?o97hu;cw8;ov<04-TW~MLipKNll&%E51+i` z=i!Z#O~a10ql;Qr%6h!}oK0xcnaxBK#XH>}8(~BxK0)l9Dn_*Xj@Bg`$W7*C&$RAD zwsN%e4E|~k6@$(okGs5kiO&Iac@xC)lwQC&PnnMvNv4w z-C?gVWZV{B8wZul$z8}Zz#5v6!kv#BR9oh+cDOI6O~^dH|FVUwaSZHRjCP+zf^q8E zQLf#|OxLky3)eK_(VckJ0CKo*+zBprgD0K%!3y*X6b!=t#*Lq?;5#^qcXUepd z@8uOg>Ub=}GOgHA9yrYk!%Fre$BClfdLnlvI^RO{Y4H&27g?=U-@zhAg?FATV;t)P zv1FQiWmHyG1L#Ly?zxh6ti^uMKK$DFU5tk8t6oLkA*@)zGh%g3Q5K_e5AkpRF~j{m z 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 -;; Keywords: org, nikola -;; Package-Version: 20151114.1116 -;; Version: 0.1 -;; URL: https://github.com/masayuko/ox-nikola -;; Package-Requires: ((emacs "24.4") (org "8.2.4") (ox-rst "0.2")) - -;;; Commentary: - -;;; Code: - -;;; Dependencies - -(eval-when-compile (require 'cl)) -(require 'ox) -(require 'ox-publish) -(require 'ox-rst) - - -;;; User Configurable Variables - -(defgroup org-export-nikola nil - "Options for exporting Org mode files to Nikola reStructuredText." - :tag "Org Nikola" - :group 'org-export) - -(defcustom org-nikola-nikola-template "" - "Default template in a Nikola article." - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-type "text" - "Default type in a Nikola article." - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-password "" - "Default password in a Nikola article." - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-section "" - "Default section in a Nikola article." - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-category "" - "Default category in a Nikola article." - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-annotations "" - "Default annotations metadata field in a Nikola article. True or other" - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-noannotations "" - "Default noannotations metadata field in a Nikola article. True or other" - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-nocomments "" - "Default nocomments metadata field in a Nikola article. True or other" - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-hidetitle "" - "Default hidetitle metadata field in a Nikola article. True or other" - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-previewimage "" - "Default previewimage in a Nikola article." - :group 'org-export-nikola - :type 'string) - -(defcustom org-nikola-enclosure "" - "Default enclosure in a Nikola article." - :group 'org-export-nikola - :type 'string) - -;;; Define Back-End - -(org-export-define-derived-backend 'nikola 'rst - :menu-entry - '(?n "Export to reStructuredText for Nikola" - ((?R "As reStructuredText buffer" org-nikola-export-as-rst) - (?r "As reStructuredText file" org-nikola-export-to-rst))) - :translate-alist - '((template . org-nikola-template)) - :options-alist - '((:description "DESCRIPTION" nil nil newline) - (:keywords "KEYWORDS" nil nil space) - (:nikola-slug "NIKOLA_SLUG" nil "") - (:nikola-link "NIKOLA_LINK" nil "") - (:nikola-type "NIKOLA_TYPE" nil org-nikola-type) - (:nikola-password "NIKOLA_PASSWORD" nil org-nikola-password) - (:nikola-template "NIKOLA_TEMPLATE" nil org-nikola-nikola-template) - (:nikola-section "NIKOLA_SECTION" nil org-nikola-section) - (:nikola-updated "NIKOLA_UPDATED" nil "") - (:nikola-category "NIKOLA_CATEGORY" nil org-nikola-category) - (:nikola-annotations "NIKOLA_ANNOTATIONS" nil org-nikola-annotations) - (:nikola-annotations "NIKOLA_NOANNOTATIONS" nil org-nikola-noannotations) - (:nikola-nocomments "NIKOLA_NOCOMMENTS" nil org-nikola-nocomments) - (:nikola-hidetitle "NIKOLA_HIDETITLE" nil org-nikola-hidetitle) - (:nikola-previewimage "NIKOLA_PREVIEWIMAGE" nil org-nikola-previewimage) - (:nikola-enclosure "NIKOLA_ENCLOSURE" nil org-nikola-enclosure))) - - -;;; Template - -(defun org-nikola-template (contents info) - "Return complete document string after reStructuredText conversion. -CONTENTS is the transcoded contents string. INFO is a plist -holding export options." - (concat - (org-nikola--front-matter info) - "\n" - contents)) - -(defun org-nikola--get-option (info property-name &optional default) - (let ((property (org-export-data (plist-get info property-name) info))) - (if (string= "" property) default property))) - -(defun org-nikola--get-true-option (info property-name) - (let ((property (org-export-data (plist-get info property-name) info))) - (if (or (string= (downcase property) "true") - (string= (downcase property) "t")) - "True" ""))) - -(defun org-nikola--front-matter (info) - (let* ((title - (org-nikola--get-option info :title "")) - (author - (org-nikola--get-option info :author "")) - (email - (org-nikola--get-option info :email "")) - (date - (org-nikola--get-option info :date "")) - (title - (if (string= title "") - (cond - ((and (org-string-nw-p date) (org-string-nw-p author)) - (concat - author - " " - date - (when (org-string-nw-p email) (concat " " email)))) - ((and (org-string-nw-p date) (org-string-nw-p email)) - (concat - email - " " - date)) - ((org-string-nw-p date) - date) - ((and (org-string-nw-p author) (org-string-nw-p email)) - (concat author " " email)) - ((org-string-nw-p author) author) - ((org-string-nw-p email) email)) title)) - (slug - (org-nikola--get-option info :nikola-slug title)) - (keywords - (org-nikola--get-option info :keywords "")) - (link - (org-nikola--get-option info :nikola-link "")) - (description - (org-nikola--get-option info :description "")) - (type - (org-nikola--get-option info :nikola-type "")) - (password - (org-nikola--get-option info :nikola-password "")) - (template - (org-nikola--get-option info :nikola-template "")) - (section - (org-nikola--get-option info :nikola-section "")) - (updated - (org-nikola--get-option info :nikola-updated "")) - (category - (org-nikola--get-option info :nikola-category "")) - (annotations - (org-nikola--get-true-option info :nikola-annotations)) - (noannotations - (org-nikola--get-true-option info :nikola-noannotations)) - (nocomments - (org-nikola--get-true-option info :nikola-nocomments)) - (hidetitle - (org-nikola--get-true-option info :nikola-hidetitle)) - (previewimage - (org-nikola--get-option info :nikola-previewimage "")) - (enclosure - (org-nikola--get-option info :nikola-enclosure ""))) - (concat - ".. title: " title - "\n.. slug: " (replace-regexp-in-string "[ ]+" "-" - (replace-regexp-in-string - "[\s-]+" "-" slug)) - "\n.. date: " date - (cond ((not (string= "" updated)) (concat "\n.. updated: " updated))) - "\n.. tags: " keywords - "\n.. link: " link - "\n.. description: " description - (cond ((not (string= "" type)) (concat "\n.. type: " type))) - (cond ((and (not (string= "" author)) (plist-get info :with-author)) - (concat "\n.. author: " author))) - (cond ((and (not (string= "" email)) (plist-get info :with-email)) - (format " <%s>" email))) - (cond ((not (string= "" password)) (concat "\n.. password: " password))) - (cond ((not (string= "" template)) (concat "\n.. template: " template))) - (cond ((not (string= "" section)) (concat "\n.. section: " section))) - (cond ((not (string= "" category)) (concat "\n.. category: " category))) - (cond ((not (string= "" annotations)) - (concat "\n.. annotations: " annotations))) - (cond ((not (string= "" noannotations)) - (concat "\n.. noannotations: " noannotations))) - (cond ((not (string= "" nocomments)) - (concat "\n.. nocomments: " nocomments))) - (cond ((not (string= "" hidetitle)) - (concat "\n.. hidetitle: " hidetitle))) - (cond ((not (string= "" previewimage)) - (concat "\n.. previewimage: " previewimage))) - (cond ((not (string= "" enclosure)) - (concat "\n.. enclosure: " enclosure))) - "\n"))) - - -;;; End-User functions - -;;;###autoload -(defun org-nikola-export-as-rst - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to a reStructuredText buffer." - (interactive) - (org-export-to-buffer 'nikola "*Org nikola RST Export*" - async subtreep visible-only body-only ext-plist - (lambda () (rst-mode)))) - - -;;;###autoload -(defun org-nikola-export-to-rst - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to a reStructuredText file" - (interactive) - (let ((outfile (org-export-output-file-name ".rst" subtreep))) - (org-export-to-file 'nikola outfile - async subtreep visible-only body-only ext-plist))) - - -;;;###autoload -(defun org-nikola-publish-to-rst (plist filename pub-dir) - "Publish an org file to reStructuredText. - -FILENAME is the filename of the Org file to be published. PLIST -is the property list for the given project. PUB-DIR is the -publishing directory. - -Return output file name." - (org-publish-org-to 'nikola filename ".rst" plist pub-dir)) - - -;;; provide - -(provide 'ox-nikola) - -;;; ox-nikola.el ends here diff --git a/elpa/ox-nikola-20151114.1116/ox-nikola.elc b/elpa/ox-nikola-20151114.1116/ox-nikola.elc deleted file mode 100644 index 6028d6324de885bdd1327af841c7303cb315e115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6984 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 diff --git a/elpa/ox-rst-20191013.551/ox-rst-autoloads.el b/elpa/ox-rst-20191013.551/ox-rst-autoloads.el deleted file mode 100644 index adf4f2f2..00000000 --- a/elpa/ox-rst-20191013.551/ox-rst-autoloads.el +++ /dev/null @@ -1,90 +0,0 @@ -;;; ox-rst-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "ox-rst" "ox-rst.el" (0 0 0 0)) -;;; Generated autoloads from ox-rst.el - -(autoload 'org-rst-export-as-rst "ox-rst" "\ -Export current buffer to a reStructuredText buffer. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting buffer should be accessible -through the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -Export is done in a buffer named \"*Org RST Export*\", which will -be displayed when `org-export-show-temporary-export-buffer' is -non-nil. - -\(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil) - -(autoload 'org-rst-convert-region-to-rst "ox-rst" "\ -Assume the current region has Org syntax, and convert it to -reStructuredText. -This can be used in any buffer. For example, you can write an -itemized list in Org syntax in a Markdown buffer and use this command -to convert it. - -\(fn)" t nil) - -(autoload 'org-rst-export-to-rst "ox-rst" "\ -Export current buffer to a reStructuredText file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -Return output file's name. - -\(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil) - -(autoload 'org-rst-publish-to-rst "ox-rst" "\ -Publish an org file to reStructuredText. - -FILENAME is the filename of the Org file to be published. PLIST -is the property list for the given project. PUB-DIR is the -publishing directory. - -Return output file name. - -\(fn PLIST FILENAME PUB-DIR)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-rst" '("org-rst-" "my-org-export-inline-image-p"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; ox-rst-autoloads.el ends here diff --git a/elpa/ox-rst-20191013.551/ox-rst-pkg.el b/elpa/ox-rst-20191013.551/ox-rst-pkg.el deleted file mode 100644 index 2d55979d..00000000 --- a/elpa/ox-rst-20191013.551/ox-rst-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "ox-rst" "20191013.551" "Export reStructuredText using org-mode." '((emacs "25.1") (org "8.3")) :commit "9158bfd18096c559e0a225ae62ab683f1c98a547" :keywords '("org" "rst" "rest" "restructuredtext") :authors '(("Masanao Igarashi" . "syoux2@gmail.com")) :maintainer '("Masanao Igarashi" . "syoux2@gmail.com") :url "https://github.com/msnoigrs/ox-rst") diff --git a/elpa/ox-rst-20191013.551/ox-rst.el b/elpa/ox-rst-20191013.551/ox-rst.el deleted file mode 100644 index 561168c8..00000000 --- a/elpa/ox-rst-20191013.551/ox-rst.el +++ /dev/null @@ -1,1743 +0,0 @@ -;;; ox-rst.el --- Export reStructuredText using org-mode. -*- lexical-binding: t; -*- - -;; Copyright (C) 2015-2019 Masanao Igarashi - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program; if not, write to the Free Software -;; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -;; Author: Masanao Igarashi -;; Keywords: org, rst, reST, reStructuredText -;; Package-Version: 20191013.551 -;; Version: 0.3 -;; URL: https://github.com/msnoigrs/ox-rst -;; Package-Requires: ((emacs "25.1") (org "8.3")) - -;;; Commentary: -;; This library implements an reStructuredText back-end for -;; Org generic exporter. - -;;; Code: - -(require 'cl-lib) -(require 'ox) -(require 'ox-publish) - - -;;; Define Back-End -(org-export-define-backend 'rst - '((bold . org-rst-bold) - (center-block . org-rst-center-block) - (clock . org-rst-clock) - (code . org-rst-code) - (drawer . org-rst-drawer) - (dynamic-block . org-rst-dynamic-block) - (entity . org-rst-entity) - (example-block . org-rst-example-block) - (export-block . org-rst-export-block) - (export-snippet . org-rst-export-snippet) - (fixed-width . org-rst-example-block) - (footnote-reference . org-rst-footnote-reference) - (headline . org-rst-headline) - (horizontal-rule . org-rst-horizontal-rule) - (inline-src-block . org-rst-inline-src-block) - (inlinetask . org-rst-inlinetask) - (inner-template . org-rst-inner-template) - (italic . org-rst-italic) - (item . org-rst-item) - (keyword . org-rst-keyword) - (latex-environment . org-rst-latex-environment) - (latex-fragment . org-rst-latex-fragment) - (line-break . org-rst-line-break) - (link . org-rst-link) - (node-property . org-rst-node-property) - (paragraph . org-rst-paragraph) - (plain-list . org-rst-plain-list) - (plain-text . org-rst-plain-text) - (planning . org-rst-planning) - (property-drawer . org-rst-property-drawer) - (quote-block . org-rst-quote-block) - (radio-target . org-rst-radio-target) - (section . org-rst-section) - (special-block . org-rst-special-block) - (src-block . org-rst-src-block) - (statistics-cookie . org-rst-statistics-cookie) - (strike-through . org-rst-strike-through) - (subscript . org-rst-subscript) - (superscript . org-rst-superscript) - (table . org-rst-table) - (table-cell . org-rst-table-cell) - (table-row . org-rst-table-row) - (target . org-rst-target) - (template . org-rst-template) - (timestamp . org-rst-timestamp) - (underline . org-rst-underline) - (verbatim . org-rst-verbatim) - (verse-block . org-rst-verse-block) - ;; Pseudo objects and elements. - (latex-math-block . org-rst-math-block)) - :menu-entry - '(?r "Export to reStructuredText" - ((?R "As reStructuredText buffer" org-rst-export-as-rst) - (?r "As reStructuredText file" org-rst-export-to-rst))) - :options-alist - '((:subtitle "SUBTITLE" nil nil parse) - (:rst-link-use-abs-url nil "rst-link-use-abs-url" org-rst-link-use-abs-url) - (:rst-inline-images nil nil org-rst-inline-images) - (:rst-inline-image-rules nil nil org-rst-inline-image-rules) - (:rst-link-org-files-as-rst nil nil org-rst-link-org-files-as-rst) - (:rst-link-home "RST_LINK_HOME" nil org-rst-link-home) - (:rst-link-use-ref-role nil nil org-rst-link-use-ref-role) - (:rst-extension nil nil org-rst-extension) - (:rst-file-link-use-ref-role nil nil org-rst-file-link-use-ref-role) - (:rst-text-markup-alist nil nil org-rst-text-markup-alist) - (:rst-quote-margin nil nil org-rst-quote-margin) - (:rst-headline-underline-characters nil nil org-rst-headline-underline-characters) - (:rst-headline-spacing nil nil org-rst-headline-spacing) - (:rst-paragraph-spacing nil nil org-rst-paragraph-spacing) - (:rst-format-drawer-function nil nil org-rst-format-drawer-function) - (:rst-format-inlinetask-function nil nil org-rst-format-inlinetask-function) - (:rst-code-block nil nil org-rst-code-block) - (:rst-pygments-langs nil nil org-rst-pygments-langs)) - :filters-alist '((:filter-options . org-rst-math-block-options-filter) - (:filter-headline . org-rst-filter-headline-blank-lines) - (:filter-parse-tree org-rst-math-block-tree-filter - org-rst-separate-elements - org-rst-filter-paragraph-spacing) - (:filter-section . org-rst-filter-headline-blank-lines))) - - -;;; Internal Variables - - - -;;; User Configurable Variables - -(defgroup org-export-rst nil - "Options for exporting Org mode files to reStructuredText." - :tag "Org RST" - :group 'org-export) - - -(defcustom org-rst-extension "rst" - "The extension for exported reStructuredText files." - :group 'org-export-rst - :type 'string) - - -(defcustom org-rst-link-org-files-as-rst t - "Non-nil means make file links to `file.org' point to `file.rst'. -When `org-mode' is exporting an `org-mode' file to reStructuredText, -links to non-rst files are directly put into a href tag in -reStructuredText. -However, links to other Org mode files (recognized by the extension -`.org.) should become links to the corresponding reStructuredText -file, assuming that the linked `org-mode' file will also be -converted to reStructuredText. -When nil, the links still point to the plain \".org\" file." - :group 'org-export-rst - :type 'boolean) - - -(defcustom org-rst-link-home "" - "Where should the \"HOME\" link of exported rst files lead?" - :group 'org-export-rst - :type '(string :tag "File or URL")) - - -(defcustom org-rst-link-use-abs-url nil - "Should we prepend relative links with RST_LINK_HOME?" - :group 'org-export-rst - :type 'boolean) - -;;;; Links :: Inline images - -(defcustom org-rst-inline-images t - "Non-nil means inline images into exported reStructuredText. -This is done using an image directive or an figure directive. -When nil, an anchor with reference is used to link to the image." - :group 'org-export-rst - :type 'boolean) - -(defcustom org-rst-inline-image-rules - '(("file" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\|svgz\\|swf\\)\\'") - ("attachment" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\|svgz\\|swf\\)\\'") - ("http" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\|svgz\\|swf\\)\\'") - ("https" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\|svgz\\|swf\\)\\'")) - "Rules characterizing image files that can be inlined into reStructuredText. -A rule consists in an association whose key is the type of link -to consider, and value is a regexp that will be matched against -link's path." - :group 'org-export-rst - :type '(alist :key-type (string :tag "Type") - :value-type (regexp :tag "Path"))) - -(defcustom org-rst-link-use-ref-role nil - "Non-nil means export internal links using :ref: role." - :group 'org-export-rst - :type 'boolean) - -(defcustom org-rst-file-link-use-ref-role nil - "Non-nil means export internal file links using :ref: role." - :group 'org-export-rst - :type 'boolean) - -(defcustom org-rst-text-markup-alist '((bold . "**%s**") - (code . verb) - (italic . "*%s*") - (verbatim . verb)) - "Alist of reStructredText expressions to convert text markup. - -The key must be a symbol among `bold', `code', `italic', -`verbatim'. The value is a formatting string to -wrap fontified text with. - -Value can also be set to the following symbols: `verb'. - -If no association can be found for a given markup, text will be -returned as-is." - :group 'org-export-rst - :type 'alist - :options '(bold code italic verbatim)) - - -(defcustom org-rst-quote-margin 4 - "Width of margin used for quoting text, in characters. -This margin is applied on left side of the text." - :group 'org-export-rst - :type 'integer) - - -(defcustom org-rst-headline-spacing '(1 . 1) - "Number of blank lines inserted around headlines. - -This variable can be set to a cons cell. In that case, its car -represents the number of blank lines present before headline -contents whereas its cdr reflects the number of blank lines after -contents. - -A nil value replicates the number of blank lines found in the -original Org buffer at the same place." - :group 'org-export-rst - :type '(choice - (const :tag "Replicate original spacing" nil) - (cons :tag "Set a uniform spacing" - (integer :tag "Number of blank lines before contents") - (integer :tag "Number of blank lines after contents")))) - - -(defcustom org-rst-paragraph-spacing 'auto - "Number of white lines between paragraphs. -If the value is an integer, add this number of blank lines -between contiguous paragraphs. If is it the symbol `auto', keep -the same number of blank lines as in the original document." - :group 'org-export-rst - :type '(choice - (integer :tag "Number of blank lines") - (const :tag "Preserve original spacing" auto))) - - -(defcustom org-rst-headline-underline-characters '(?- ?~ ?^ ?: ?' ?\ ?_) - "List of underline characters for each headline level." - :group 'org-export-rst - :type 'list) - -;;;; Drawers - -(defcustom org-rst-format-drawer-function nil - "Function called to format a drawer in reStructuredText code. - -The function must accept two parameters: - NAME the drawer name, like \"LOGBOOK\" - CONTENTS the contents of the drawer. - -The function should return the string to be exported. - -For example, the variable could be set to the following function -in order to mimic default behaviour: - -\(defun org-rst-format-drawer-default \(name contents\) - \"Format a drawer element for reStructuredText export.\" - contents\)" - :group 'org-export-rst - :type 'function) - - -;;;; Inlinetasks - -(defcustom org-rst-format-inlinetask-function nil - "Function called to format an inlinetask in reStructuredText code. - -The function must accept six parameters: - TODO the todo keyword, as a string - TODO-TYPE the todo type, a symbol among `todo', `done' and nil. - PRIORITY the inlinetask priority, as a string - NAME the inlinetask name, as a string. - TAGS the inlinetask tags, as a list of strings. - CONTENTS the contents of the inlinetask, as a string. - -The function should return the string to be exported." - :group 'org-export-rst - :type 'function) - - -;;;; Src blocks - -(defcustom org-rst-code-block 'code - "The directive used to export SRC-BLOCKs." - :group 'org-export-rst - :type '(choice - (const :tag "Use a code-block directive" code-block) - (const :tag "Use a code directive" code) - (const :tag "Use a literal block" nil)) - :safe (lambda (s) (memq s '(code-block code nil))) - ) - -(defcustom org-rst-pygments-langs - '((emacs-lisp "common-lisp") (lisp "common-lisp") - (cc "c++") - (cperl "perl") - (latex "tex") - (shell-script "bash") - (caml "ocaml") - (sqlite3 "sqlite")) - "Alist mapping languages to their listing language counterpart. -The key is a symbol, the major mode symbol without the \"-mode\". -The value is the string that should be inserted as the language -parameter for the listings package. If the mode name and the -listings name are the same, the language does not need an entry -in this list - but it does not hurt if it is present." - :group 'org-export-rst - :type '(repeat - (list - (symbol :tag "Major mode ") - (string :tag "Pygments language")))) - - - -;;; Internal Functions - -(defun org-rst--justify-lines (s text-width how) - "Justify all lines in string S. -TEXT-WIDTH is an integer specifying maximum length of a line. -HOW determines the type of justification: it can be `left', -`right', `full' or `center'." - (with-temp-buffer - (insert s) - (goto-char (point-min)) - (let ((fill-column text-width) - ;; Disable `adaptive-fill-mode' so it doesn't prevent - ;; filling lines matching `adaptive-fill-regexp'. - (adaptive-fill-mode nil)) - (while (< (point) (point-max)) - (justify-current-line how) - (forward-line))) - (buffer-string))) - - -(defun org-rst--indent-string (s width) - "Indent string S by WIDTH white spaces. -Empty lines are not indented." - (when (stringp s) - (replace-regexp-in-string - "\\(^\\)\\(?:.*\\S-\\)" (make-string width ? ) s nil nil 1))) - - -(defun org-rst--make-attribute-string (attributes) - "Return a list of attributes, as a string. -ATTRIBUTES is a plist where values are either strings or nil. An -attributes with a nil value will be omitted from the result." - (let (output) - (dolist (item attributes (mapconcat 'identity (nreverse output) "\n")) - (cond ((null item) (pop output)) - ((symbolp item) (push (substring (symbol-name item) 1) output)) - (t (let ((key (org-trim (car output))) - (value (replace-regexp-in-string "\"" "\\\"" - (replace-regexp-in-string - "\\\\" "\\\\" (org-trim item))))) - (setcar output (format " :%s: %s" key value)))))))) - - -(defun org-rst--build-title - (element info &optional underline notags toc) - "Format ELEMENT title and return it. - -ELEMENT is either an `headline' or `inlinetask' element. INFO is -a plist used as a communication channel. - -When optional argument UNDERLINE is non-nil, underline title, -without the tags, according to `org-rst-underline' -specifications. - -If optional argument NOTAGS is non-nil, no tags will be added to -the title. - -When optional argument TOC is non-nil, use optional title if -possible. It doesn't apply to `inlinetask' elements." - (let* ((headlinep (eq (org-element-type element) 'headline)) - (numbers - ;; Numbering is specific to headlines. - (and headlinep (org-export-numbered-headline-p element info) - ;; All tests passed: build numbering string. - (concat - (mapconcat - 'number-to-string - (org-export-get-headline-number element info) ".") - " "))) - (text - (org-trim - (org-export-data - (if (and toc headlinep) (org-export-get-alt-title element info) - (org-element-property :title element)) - info))) - (todo - (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword element))) - (and todo (concat (org-export-data todo info) " "))))) - (tags (and (not notags) - (plist-get info :with-tags) - (let ((tag-list (org-export-get-tags element info))) - (and tag-list - (org-make-tag-string tag-list))))) - (priority - (and (plist-get info :with-priority) - (let ((char (org-element-property :priority element))) - (and char (format "(#%c) " char))))) - (first-part (concat numbers todo priority text))) - (concat - first-part - ;; Align tags, if any. - (when tags - (format - (format " %%%ds" (string-width tags)) - tags)) - ;; Maybe underline text, if ELEMENT type is `headline' and an - ;; underline character has been defined. - (when (and underline headlinep) - (let ((under-char - (nth (1- (org-export-get-relative-level element info)) - org-rst-headline-underline-characters))) - (and under-char - (concat "\n" - (make-string (string-width first-part) under-char)))))))) - - -(defun org-rst--text-markup (text markup info) - "Format TEXT depending on MARKUP text markup. -See `org-rst-text-markup-alist' for details." - (let ((fmt (cdr (assq markup (plist-get info :rst-text-markup-alist)))) - (text (replace-regexp-in-string "[ \t\n]+" " " text))) - (cond - ;; No format string: Return raw text. - ((not fmt) text) - ;; Handle the `verb' special case: Protect some - ;; special chars and use "\\" escape. - ((eq 'verb fmt) - (let ((rtn "") - char) - (while (string-match "\\`*" text) - (setq char (match-string 0 text)) - (when (> (match-beginning 0) 0) - (setq rtn (concat rtn (substring text 0 (match-beginning 0))))) - (setq text (substring text (1+ (match-beginning 0)))) - (setq char (concat "\\" char) - rtn (concat rtn char))) - (setq text (concat rtn text) - fmt "``%s``") - (format fmt text))) - ;; Else use format string. - (t (format fmt text))))) - - -(defun org-rst--checkbox (item _info) - "Return checkbox string for ITEM or nil. -INFO is a plist used as a communication channel." - ;(let ((utf8p (eq (plist-get info :ascii-charset) 'utf-8))) - ; (case (org-element-property :checkbox item) - ; (on (if utf8p "☑ " "[X] ")) - ; (off (if utf8p "☠" "[ ] ")) - ; (trans (if utf8p "☒ " "[-] "))))) - (cl-case (org-element-property :checkbox item) - (on "☑ ") - (off "☠") - (trans "☒ "))) - - - -;;; Template - -(defun org-rst-template--document-title (info) - "Return document title, as a string. -INFO is a plist used as a communication channel." - (let* (;; Links in the title will not be resolved later, so we make - ;; sure their path is located right after them. - (with-title (plist-get info :with-title)) - (title (if with-title - (org-export-data (plist-get info :title) info) - "")) - (subtitle (if with-title - (org-export-data (plist-get info :subtitle) info) - "")) - (author (and (plist-get info :with-author) - (let ((auth (plist-get info :author))) - (and auth (org-export-data auth info))))) - (email (and (plist-get info :with-email) - (org-export-data (plist-get info :email) info))) - (date (and (plist-get info :with-date) - (org-export-data (org-export-get-date info) info))) - (titleline (make-string (string-width title) ?=)) - (subtitleline (make-string (string-width subtitle) ?-)) - (title (if (not (string= title "")) - (concat titleline "\n" - title "\n" - titleline "\n") "")) - (subtitle (if (not (string= subtitle "")) - (concat subtitleline "\n" - subtitle "\n" - subtitleline "\n") ""))) - (cond - ((string= title "") - (concat - (when (org-string-nw-p author) (concat " :Author: " author "\n")) - (when (org-string-nw-p email) (concat " :Contact: " email "\n")) - (when (org-string-nw-p date) (concat " :Date: " date "\n")))) - (t - (concat - title - subtitle - (when (org-string-nw-p author) (concat "\n :Author: " author)) - (when (org-string-nw-p email) (concat "\n :Contact: " email)) - (when (org-string-nw-p date) (concat "\n :Date: " date)) - "\n"))))) - - -(defun org-rst-template (contents info) - "Return complete document string after reStructuredText conversion. -CONTENTS is the transcoded contents string. INFO is a plist -holding export options." - (concat - ;; Build title block. - (concat (org-rst-template--document-title info) - "\n" - ;; 2. Table of contents. - (let ((depth (plist-get info :with-toc))) - (when depth ".. contents::\n\n"))) - ;; Document's body. - contents - ;; Creator. Justify it to the bottom right. - (and (plist-get info :with-creater) - (concat - "\n :Creator: " - (plist-get info :creator) "\n")))) - - - -;;; Transcode Functions - -;;;; Bold - -(defun org-rst-bold (_bold contents info) - "Transcode BOLD from Org to reStructuredText. -CONTENTS is the text with bold markup. INFO is a plist holding -contextual information." - (org-rst--text-markup contents 'bold info)) - - -;;;; Center Block - -(defun org-rst-center-block (_center-block contents _info) - "Transcode a CENTER-BLOCK element from Org to reStructuredText. -CONTENTS holds the contents of the center block. INFO is a plist -holding contextual information." - contents) - - -;;;; Clock - -(defun org-rst-clock (clock _contents _info) - "Transcode a CLOCK object from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual -information." - (concat org-clock-string " " - (org-translate-time - (org-element-property :raw-value - (org-element-property :value clock))) - (let ((time (org-element-property :duration clock))) - (and time - (concat " => " - (apply 'format - "%2s:%02s" - (org-split-string time ":"))))))) - - -;;;; Code - -(defun org-rst-code (code _contents info) - "Transcode a CODE object from Org to reStructuredText. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (org-rst--text-markup (org-element-property :value code) 'code info)) - - -;;;; Drawer - -(defun org-rst-drawer (drawer contents _info) - "Transcode a DRAWER element from Org to reStructuredText. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((name (org-element-property :drawer-name drawer)) - (output (if (functionp org-rst-format-drawer-function) - (funcall org-rst-format-drawer-function - name contents) - ;; If there's no user defined function: simply - ;; display contents of the drawer. - contents))) - output)) - - -;;;; Dynamic Block - -(defun org-rst-dynamic-block (_dynamic-block contents _info) - "Transcode a DYNAMIC-BLOCK element from Org to reStructuredText. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - contents) - - -;;;; Entity - -(defun org-rst-entity (entity _contents _info) - "Transcode an ENTITY object from Org to reStructuredText. -CONTENTS are the definition itself. INFO is a plist holding -contextual information." - (let ((ent (org-element-property :latex entity))) - (if (org-element-property :latex-math-p entity) - (format ":math:`%s`" ent) - (org-element-property :utf-8 entity)))) - - -;;;; Example Block - -(defun org-rst-example-block (example-block _contents _info) - "Transcode an EXAMPLE-BLOCK element from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let* ((example (org-remove-indentation - (org-element-property :value example-block))) - (label (org-element-property :name example-block)) - (attributes - (org-export-read-attribute :attr_rst example-block)) - (class (plist-get attributes :class))) - (when example - (concat - "::\n" - (when class (format " :class: %s\n" class)) - (when label (format " :name: %s\n" label)) - "\n" - (org-rst--indent-string example org-rst-quote-margin))))) - - -;;;; Export Block - -(defun org-rst-export-block (export-block _contents _info) - "Transcode a EXPORT-BLOCK element from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (member (org-element-property :type export-block) '("RST" "REST" "RESTRUCTUREDTEXT")) - (org-element-property :value export-block))) - - -;;;; Export Snippet - -(defun org-rst-export-snippet (export-snippet _contents _info) - "Transcode a EXPORT-SNIPPET object from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (eq (org-export-snippet-backend export-snippet) 'rst) - (org-element-property :value export-snippet))) - - -;;;; Footnote Definition - -;(defun org-rst-footnote-definition (footnote-definition contents info) -; "Transcode a FOOTNOTE-DEFINITION element from Org to reStructuredText. -;CONTENTS is nil. INFO is a plist holding contextual information." -; (replace-regexp-in-string -; "^" ".. " -; (org-remove-indentation -; (org-element-property :value footnote-definition)))) - - -;;;; Footnote Reference - -(defun org-rst-footnote-reference (footnote-reference _contents info) - "Transcode a FOOTNOTE-REFERENCE element from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual information." - (format " [%s]_ " (org-export-get-footnote-number footnote-reference info))) - - -;;;; Headline - -(defun org-rst-headline (headline contents info) - "Transcode a HEADLINE element from Org to reStructuredText. -CONTENTS holds the contents of the headline. INFO is a plist -holding contextual information." - ;; Don't export footnote section, which will be handled at the end - ;; of the template. - (unless (org-element-property :footnote-section-p headline) - (let* (;; Blank lines between headline and its contents. - ;; `org-rst-headline-spacing', when set, overwrites - ;; original buffer's spacing. - (pre-blanks - (make-string - (if org-rst-headline-spacing (car org-rst-headline-spacing) - (org-element-property :pre-blank headline)) ?\n)) - (id (org-element-property :ID headline)) - (customid (org-element-property :CUSTOM_ID headline))) - (concat - (if customid - (format ".. _%s:\n\n" customid) - (if id (format ".. _%s:\n\n" id) "")) - (org-rst--build-title headline info 'underline) - "\n" pre-blanks - contents)))) - - -;;;; Horizontal Rule - -(defun org-rst-horizontal-rule (_horizontal-rule _contents _info) - "Transcode an HORIZONTAL-RULE object from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual information." - "\n------------\n") - -;;;; Inline Src Block - -(defun org-rst-inline-src-block (inline-src-block _contents info) - "Transcode an INLINE-SRC-BLOCK element from Org to reStructuredText. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (org-rst--text-markup - (org-element-property :value inline-src-block) 'verbatim info)) - - -;;;; Inlinetask - -(defun org-rst-inlinetask (inlinetask contents info) - "Transcode an INLINETASK element from Org to reStructuredText. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let ((title (org-export-data (org-element-property :title inlinetask) info)) - (todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword inlinetask))) - (and todo (org-export-data todo info))))) - (todo-type (org-element-property :todo-type inlinetask)) - (tags (and (plist-get info :with-tags) - (org-export-get-tags inlinetask info))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority inlinetask)))) - ;; If `org-rst-format-inlinetask-function' is provided, call it - ;; with appropriate arguments. - (if (functionp org-rst-format-inlinetask-function) - (funcall org-rst-format-inlinetask-function - todo todo-type priority title tags contents) - ;; Otherwise, use a default template. - (let ((full-title - (concat - (when todo (format "%s" todo)) - (when priority (format "\#%c " priority)) - title - (when tags (format ":%s:" - (mapconcat 'identity tags ":")))))) - (format (concat "%s\n\n" - "%s\n") - full-title contents))))) - - -;;;; Inner template - -(defun org-rst-inner-template (contents info) - "Return complete document string after reStructuredText conversion. -CONTENTS is the transcoded contents string. INFO is a plist -holding export options." - (org-element-normalize-string - (concat - ;; 1. Document's body. - contents - ;; 2. Footnote definitions. - (let ((definitions (org-export-collect-footnote-definitions info))) - (when definitions - (concat - "\n\n" - (mapconcat - (lambda (ref) - (let* ((id (format ".. [%s] " (car ref))) - (def (nth 2 ref)) - (lines (split-string (org-export-data def info) "\n+[ \t\n]*")) - (fntext (concat (car lines) "\n" - (apply 'concat (mapcar - '(lambda (x) (if (> (length x) 0) - (concat (org-rst--indent-string x org-rst-quote-margin) "\n"))) - (cdr lines))))) - ) - (concat id fntext))) - definitions "\n"))))))) - - -;;;; Italic - -(defun org-rst-italic (_italic contents info) - "Transcode ITALIC from Org to reStructuredText. -CONTENTS is the text with italic markup. INFO is a plist holding -contextual information." - (org-rst--text-markup contents 'italic info)) - - -;;;; Item - -(defun org-rst-item (item contents info) - "Transcode ITEM element into reStructuredText format. -CONTENTS is the item contents. INFO is a plist used as -a communication channel." - (let* ((checkbox (org-rst--checkbox item info)) - (list-type (org-element-property :type (org-export-get-parent item))) - (tag (let - ((tag (org-element-property :tag item))) - (and tag (concat (org-export-data tag info) checkbox)))) - (bullet - ;; First parent of ITEM is always the plain-list. Get - ;; `:type' property from it. - (org-list-bullet-string - (cond - ((eq list-type 'ordered) - ;; Return correct number for ITEM, paying attention to - ;; counters. - (let* ((struct (org-element-property :structure item)) - (bul (org-element-property :bullet item)) - (num (number-to-string - (car (last (org-list-get-item-number - (org-element-property :begin item) - struct - (org-list-prevs-alist struct) - (org-list-parents-alist struct))))))) - (replace-regexp-in-string "[0-9]+" num bul))) - (tag "") - (t "-")))) - (width (if tag 4 (string-width bullet))) - ) - (concat - (if tag tag (concat bullet checkbox)) - (let ((contents (org-rst--indent-string contents width))) - (if (and (not tag) - (eq (org-element-type (car (org-element-contents item))) 'paragraph)) - (org-trim contents) - (concat "\n" contents)))))) - - -;;;; Keyword - -(defun org-rst-keyword (keyword _contents _info) - "Transcode a KEYWORD element from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((key (org-element-property :key keyword)) - (value (org-element-property :value keyword))) - (cond - ((string= key "RST") value)))) - - -;;;; Latex Environment - -(defun org-rst-latex-environment (latex-environment _contents info) - "Transcode a LATEX-ENVIRONMENT element from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual -information." - (when (plist-get info :with-latex) - (org-remove-indentation (org-element-property :value latex-environment)))) - - -;;;; Latex Fragment - -(defun org-rst-latex-fragment (latex-fragment _contents _info) - "Transcode a LATEX-FRAGMENT object from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let ((value (org-element-property :value latex-fragment))) - (cond - ((string-match "\\`\\(\\$\\{2\\}\\)\\([^\000]*\\)\\1\\'" value) - (format ".. math::\n\n%s" - (org-rst--indent-string - (org-trim (match-string 2 value)) org-rst-quote-margin))) - ((string-match "\\`\\(\\$\\{1\\}\\)\\([^\000]*\\)\\1\\'" value) - (format ":math:`%s`" (org-trim (match-string 2 value)))) - ((string-match "\\`\\\\(\\([^\000]*\\)\\\\)\\'" value) - (format ":math:`%s`" (org-trim (match-string 1 value)))) - ((string-match "\\`\\\\\\[\\([^\000]*\\)\\\\\\]\\'" value) - (format "\.. math::\n\n%s" - (org-rst--indent-string - (org-trim (match-string 1 value)) org-rst-quote-margin))) - (t value)))) - - -;;;; Line Break - -(defun org-rst-line-break (_line-break _contents _info) - "Transcode a LINE-BREAK object from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual - information." - hard-newline) - - -;;;; Link - -(defun org-rst-inline-image-p (link info) - "Non-nil when LINK is meant to appear as an image. -INFO is a plist used as a communication channel. LINK is an -inline image when it has no description and targets an image -file (see `org-rst-inline-image-rules' for more information), or -if its description is a single link targeting an image file." - (if (not (org-element-contents link)) - (org-export-inline-image-p - link (plist-get info :rst-inline-image-rules)) - (not - (let ((link-count 0)) - (org-element-map (org-element-contents link) - (cons 'plain-text org-element-all-objects) - (lambda (obj) - (cl-case (org-element-type obj) - (plain-text (org-string-nw-p obj)) - (link (if (= link-count 1) t - (cl-incf link-count) - (not (org-export-inline-image-p - obj (plist-get info :rst-inline-image-rules))))) - (otherwise t))) - info t))))) - - -(defun my-org-export-inline-image-p (link &optional rules) - (let ((case-fold-search t) - (rules (or rules org-export-default-inline-image-rule))) - (catch 'exit - (mapc - (lambda (rule) - (if (string-match (cdr rule) link) - (throw 'exit t))) - rules) - ;; Return nil if no rule matched. - nil))) - - -(defun org-rst-link (link desc info) - "Transcode a LINK object from Org to reStructuredText. - -DESC is the description part of the link, or the empty string. -INFO is a plist holding contextual information." - (let* ((home (when (plist-get info :rst-link-home) - (org-trim (plist-get info :rst-link-home)))) - (use-abs-url (plist-get info :rst-link-use-abs-url)) - (link-org-files-as-rst-maybe - (function - (lambda (raw-path info) - "Treat links to `file.org' as links to `file.rst', if needed. - See `org-rst-link-org-files-as-rst'." - (cond - ((and (plist-get info :rst-link-org-files-as-rst) - (string= ".org" - (downcase (file-name-extension raw-path ".")))) - (concat (file-name-sans-extension raw-path) "." - (plist-get info :rst-extension))) - (t raw-path))))) - (type (org-element-property :type link)) - (search-option (org-element-property :search-option link)) - (raw-path (org-element-property :path link)) - ;; Ensure DESC really exists, or set it to nil. - (desc (and (not (string= desc "")) desc)) - (path (cond - ((member type '("http" "https" "ftp" "mailto")) - (url-encode-url - (concat type ":" raw-path))) - ((string= type "file") - ;; Treat links to ".org" files as ".rst", if needed. - (setq raw-path - (funcall link-org-files-as-rst-maybe raw-path info)) - (cond ((and home use-abs-url) - (setq raw-path - (concat (file-name-as-directory home) raw-path))) - (t raw-path))) - (t raw-path))) - (attributes-plist - (org-combine-plists - ;; Extract attributes from parent's paragraph. HACK: Only - ;; do this for the first link in parent (inner image link - ;; for inline images). This is needed as long as - ;; attributes cannot be set on a per link basis. - (let* ((parent (org-export-get-parent-element link)) - (link (let ((container (org-export-get-parent link))) - (if (and (eq 'link (org-element-type container)) - (org-rst-inline-image-p link info)) - container - link)))) - (and (eq link (org-element-map parent 'link #'identity info t)) - (org-export-read-attribute :attr_rst parent))) - ;; Also add attributes from link itself. Currently, those - ;; need to be added programmatically before `org-rst-link' - ;; is invoked, for example, by backends building upon HTML - ;; export. - (org-export-read-attribute :attr_rst link))) - (attributes - (let ((attr (org-rst--make-attribute-string attributes-plist))) - (if (org-string-nw-p attr) (concat "\n" attr "\n") "")))) - (cond - ;; Link type is handled by a special function. - ((org-export-custom-protocol-maybe link desc 'rst)) - ;; Image file. - ((and (plist-get info :rst-inline-images) - (org-export-inline-image-p - link (plist-get info :rst-inline-image-rules))) - (let* ((ipath (if (not (file-name-absolute-p raw-path)) raw-path - (expand-file-name raw-path))) - (caption (org-export-get-caption - (org-export-get-parent-element link))) - (linkname - (org-element-property :name (org-export-get-parent-element link))) - (label (if linkname (format ".. _%s:\n\n" linkname) ""))) - (if caption (format "%s.. figure:: %s%s\n\n %s\n" - label ipath attributes - (org-export-data caption info)) - (format "%s.. image:: %s%s\n" label ipath attributes)))) - ((and (plist-get info :rst-inline-images) - desc - (my-org-export-inline-image-p - desc (plist-get info :rst-inline-image-rules))) - (format ".. image:: %s\n :target: %s%s" desc path attributes)) - ;; Radio link: Transcode target's contents and use them as link's - ;; description. - ((string= type "radio") - (let ((destination (org-export-resolve-radio-link link info))) - (when destination - (format "`%s <%s>`_" - path - (org-export-data (org-element-contents destination) info))))) - ;; Links pointing to a headline: Find destination and build - ;; appropriate referencing command. - ((member type '("custom-id" "fuzzy" "id")) - (let ((destination (if (string= type "fuzzy") - (org-export-resolve-fuzzy-link link info) - (org-export-resolve-id-link link info)))) - (cl-case (org-element-type destination) - ;; Id link points to an external file. - (plain-text - (if desc (format "`%s <%s>`_" desc destination) - (format "`%s`_" destination))) - ;; Fuzzy link points nowhere. - ('nil - (let ((rawlink - (org-export-data (org-element-property :raw-link link) info))) - (if desc (format "`%s <%s>`_" desc rawlink) - (format "`%s`_" rawlink)))) - ;; LINK points to a headline. - (headline - (if (member type '("custom-id" "id")) - (if (plist-get info :rst-link-use-ref-role) - (if desc (format " :ref:`%s <%s>`" desc raw-path) - (format " :ref:`%s`" raw-path)) - (format "`%s`_" raw-path)) - (format "`%s`_" (org-rst--build-title destination info nil)))) - ;; Fuzzy link points to a target. - (otherwise - (if (not desc) (format "`%s`_" path) - (format "`%s <%s>`_" desc path)))))) - ;; Coderef: replace link with the reference name or the - ;; equivalent line number. It is not supported in ReST. - ((string= type "coderef") - (format (org-export-get-coderef-format path desc) - (org-export-resolve-coderef path info))) - ((and (plist-get info :rst-file-link-use-ref-role) - (string= type "file") - search-option) - (let ((ref (replace-regexp-in-string "^#" "" search-option))) - (if desc - (format ":ref:`%s <%s>`" desc ref) - (format ":ref:`%s`" ref)))) - ;; Link type is handled by a special function. - ;((functionp (setq protocol (nth 2 (assoc type org-link-protocols)))) - ; (funcall protocol (org-link-unescape path) desc 'latex)) - ;; External link with a description part. - ((and path desc) (format "`%s <%s>`_" desc path)) - ;; External link without a description part. - (path (format "`%s <%s>`_" - (replace-regexp-in-string "^//" "" path) path)) - ;; No path, only description. Try to do something useful. - (t (format "`%s <%s>`_" desc desc))))) - - -;;;; Node Property - -(defun org-rst-node-property (node-property _contents _info) - "Transcode a NODE-PROPERTY element from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format "%s:%s" - (org-element-property :key node-property) - (let ((value (org-element-property :value node-property))) - (if value (concat " " value) "")))) - - -;;;; Paragraph - -(defun org-rst-paragraph (_paragraph contents info) - "Transcode a PARAGRAPH element from Org to reStructuredText. -CONTENTS is the contents of the paragraph, as a string. INFO is -the plist used as a communication channel." - (when (plist-get info :preserve-breaks) - (let ((lines (split-string contents "\n+[ \t\n]*"))) - (cond ((> (length lines) 2) - (setq contents (apply 'concat (mapcar - '(lambda (x) (if (> (length x) 0) (concat "| " x "\n") x)) - lines))))))) - contents) - - -;;;; Plain List - -(defun org-rst-plain-list (_plain-list contents _info) - "Transcode a PLAIN-LIST element from Org to reStructuredText. -CONTENTS is the contents of the list. INFO is a plist holding -contextual information." - contents) - - -;;;; Plain Text - -(defun org-rst-plain-text (text info) - "Transcode a TEXT string from Org to reStructuredText. -TEXT is the string to transcode. INFO is a plist holding -contextual information." - (when (plist-get info :with-smart-quotes) - (setq text (org-export-activate-smart-quotes text :utf-8 info))) - ;; Protect `, *, _ and \ - (setq text (replace-regexp-in-string "[`*_\\]" "\\\\\\&" text)) - ;; Protect .. - (setq text (replace-regexp-in-string "^[\s-]*\\.\\. [^\\[]" "\\\\\\&" text)) - ;; Protect :: - (setq text (replace-regexp-in-string "::" "\\\\:\\\\:" text)) - ;; Return value. - text) - - -;;;; Planning - -(defun org-rst-planning (planning _contents _info) - "Transcode a PLANNING element from Org to reStructuredText. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (mapconcat - 'identity - (delq nil - (list (let ((closed (org-element-property :closed planning))) - (when closed - (concat org-closed-string " " - (org-translate-time - (org-element-property :raw-value closed))))) - (let ((deadline (org-element-property :deadline planning))) - (when deadline - (concat org-deadline-string " " - (org-translate-time - (org-element-property :raw-value deadline))))) - (let ((scheduled (org-element-property :scheduled planning))) - (when scheduled - (concat org-scheduled-string " " - (org-translate-time - (org-element-property :raw-value scheduled))))))) - " ")) - - -;;;; Property Drawer - -(defun org-rst-property-drawer (_property-drawer contents _info) - "Transcode a PROPERTY-DRAWER element from Org to reStructuredText. -CONTENTS holds the contents of the drawer. INFO is a plist -holding contextual information." - (when (org-string-nw-p contents) - (concat - "::\n\n" - (org-rst--indent-string contents org-rst-quote-margin)))) - - -;;;; Pseudo Object: LaTeX Math Block - -;; `latex-math-block' objects have the following property: -;; `:post-blank'. - -(defun org-rst--wrap-latex-math-block (data info) - "Merge contiguous math objects in a pseudo-object container. -DATA is a parse tree or a secondary string. INFO is a plist -containing export options. Modify DATA by side-effect and return it." - (let ((valid-object-p - (function - ;; Non-nil when OBJ can be added to the latex math block. - (lambda (obj) - (cl-case (org-element-type obj) - (entity (org-element-property :latex-math-p obj)) - (latex-fragment - (let ((value (org-element-property :value obj))) - (or (string-match-p "\\`\\\\([^\000]*\\\\)\\'" value) - (string-match-p "\\`\\$[^\000]*\\$\\'" value) - (string-match-p "\\`\\\\\\[[^\000]*\\\\\\]\\'" value)))) - ((subscript superscript) t)))))) - (org-element-map data '(entity latex-fragment subscript superscript) - (lambda (object) - ;; Skip objects already wrapped. - (when (and (not (eq (org-element-type - (org-element-property :parent object)) - 'latex-math-block)) - (funcall valid-object-p object)) - (let ((math-block (list 'latex-math-block nil)) - (next-elements (org-export-get-next-element object info t)) - (last object)) - ;; Wrap MATH-BLOCK around OBJECT in DATA. - (org-element-insert-before math-block object) - (org-element-extract-element object) - (org-element-adopt-elements math-block object) - (when (zerop (or (org-element-property :post-blank object) 0)) - ;; MATH-BLOCK swallows consecutive math objects. - (catch 'exit - (dolist (next next-elements) - (if (not (funcall valid-object-p next)) (throw 'exit nil) - (org-element-extract-element next) - (org-element-adopt-elements math-block next) - ;; Eschew the case: \beta$x$ -> \(\betax\). - (unless (memq (org-element-type next) - '(subscript superscript)) - (org-element-put-property last :post-blank 1)) - (setq last next) - (when (> (or (org-element-property :post-blank next) 0) 0) - (throw 'exit nil)))))) - (org-element-put-property - math-block :post-blank (org-element-property :post-blank last))))) - info nil '(subscript superscript latex-math-block) t) - ;; Return updated DATA. - data)) - -(defun org-rst-math-block-tree-filter (tree _backend info) - (org-rst--wrap-latex-math-block tree info)) - -(defun org-rst-math-block-options-filter (info _backend) - (dolist (prop '(:author :date :title) info) - (plist-put info prop - (org-rst--wrap-latex-math-block (plist-get info prop) info)))) - -(defun org-rst-math-block (_math-block contents _info) - "Transcode a MATH-BLOCK object from Org to reStructuredText. -CONTENTS is a string. INFO is a plist used as a communication -channel." - (let* ((value (org-trim contents)) - (value - (if (> (string-width value) 2) - (if (string= ".." (substring value 0 2)) - (format "\n\n%s\n\n" value) - value)))) - (format "%s" value))) - - -;;;; Quote Block - -(defun org-rst-quote-block (quote-block contents _info) - "Transcode a QUOTE-BLOCK element from Org to reStructuredText. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((attributes - (org-export-read-attribute :attr_rst quote-block)) - (directive (plist-get attributes :directive)) - (title (plist-get attributes :title)) - (subtitle (plist-get attributes :subtitle)) - (margin (plist-get attributes :margin)) - (class (plist-get attributes :class)) - (label (org-element-property :name quote-block))) - (cond ((and margin contents) - (org-rst--indent-string contents (string-to-number margin))) - (directive - (concat - (format ".. %s::" directive) - (when title (format " %s" title)) - "\n" - (when (and subtitle (string= "sidebar" directive)) - (format " :subtitle: %s\n" subtitle)) - (when (and class (not (string= "container" directive))) - (format " :class: %s\n" class)) - (when label (format " :name: %s\n" label)) - "\n" - (when contents - (org-rst--indent-string contents org-rst-quote-margin)))) - (t - (concat - "::\n" - (when class (format " :class: %s\n" class)) - (when label (format " :name: %s\n" label)) - "\n" - (when contents - (org-rst--indent-string contents org-rst-quote-margin))))))) - - -;;;; Radio Target - -(defun org-rst-radio-target (_radio-target contents _info) - "Transcode a RADIO-TARGET object from Org to reStructuredText. -CONTENTS is the contents of the target. INFO is a plist holding -contextual information." - contents) - - -;;;; Section - -(defun org-rst-section (_section contents _info) - "Transcode a SECTION element from Org to reStructuredText. -CONTENTS holds the contents of the section. INFO is a plist -holding contextual information." - contents) - - -;;;; Special Block - -(defun org-rst-special-block (special-block contents _info) - "Transcode a SPECIAL-BLOCK element from Org to reStructuredText. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((attributes - (org-export-read-attribute :attr_rst special-block)) - (title (plist-get attributes :title)) - (class (plist-get attributes :class)) - (label (org-element-property :name special-block)) - (type (org-element-property :type special-block))) - (concat - (format ".. %s::" type) - (when title (format " %s" title)) - "\n" - (when class (format " :class: %s\n" class)) - (when label (format " :name: %s\n" label)) - "\n" - (when contents - (org-rst--indent-string contents org-rst-quote-margin))))) - -;;;; Src Block - -(defun org-rst-src-block (src-block _contents info) - "Transcode a SRC-BLOCK element from Org to reStructuredText. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (when (org-string-nw-p (org-element-property :value src-block)) - (let* ((lang (org-element-property :language src-block)) - (label (org-element-property :name src-block)) - (value (org-remove-indentation - (org-element-property :value src-block))) - (num-start (org-export-get-loc src-block info)) - (codeblockd (plist-get info :rst-code-block)) - (attributes - (org-export-read-attribute :attr_rst src-block)) - (class (plist-get attributes :class))) - (cond - ;; Case 1. - ((eq codeblockd 'code-block) - (let ((lst-lang - (or (cadr (assq (intern lang) org-rst-pygments-langs)) lang))) - (concat - (format ".. code-block:: %s\n" lst-lang) - (when num-start (format " :lineno-start: %s\n" (1+ num-start))) - (when class (format " :class: %s\n" class)) - (when label (format " :name: %s\n" label)) - "\n" - (org-rst--indent-string value org-rst-quote-margin)))) - ;; Case 2. code. - ((eq codeblockd 'code) - (let ((lst-lang - (or (cadr (assq (intern lang) org-rst-pygments-langs)) lang))) - (concat - (format ".. code:: %s\n" lst-lang) - (when num-start (format " :number-lines: %s\n" (1+ num-start))) - (when class (format " :class: %s\n" class)) - (when label (format " :name: %s\n" label)) - "\n" - (org-rst--indent-string value org-rst-quote-margin)))) - (t - (concat - "::\n" - (when class (format " :class: %s\n" class)) - (when label (format " :name: %s\n" label)) - "\n" - (org-rst--indent-string value org-rst-quote-margin))))))) - - -;;;; Statistics Cookie - -(defun org-rst-statistics-cookie (statistics-cookie _contents _info) - "Transcode a STATISTICS-COOKIE object from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual information." - (org-element-property :value statistics-cookie)) - - -;;;; Strike-Through - -(defun org-rst-strike-through (_strike-through contents _info) - "Transcode STRIKE-THROUGH from Org to reStructuredText. -CONTENTS is the text with strike-through markup. INFO is a plist -holding contextual information." - contents) - - -;;;; Subscript - -(defun org-rst-subscript (_subscript contents _info) - "Transcode a SUBSCRIPT object from Org to reStructuredText. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "\\ :sub:`%s`\\ " contents)) - - -;;;; Superscript - -(defun org-rst-superscript (_superscript contents _info) - "Transcode a SUPERSCRIPT object from Org to reStructuredText. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "\\ :sup:`%s`\\ " contents)) - - -;;;; Table - -(defun org-rst-table-first-row-data-cells (table info) - "Transcode the first row of TABLE. -INFO is a plist used as a communication channel." - (let ((table-row - (org-element-map table 'table-row - (lambda (row) - (unless (eq (org-element-property :type row) 'rule) row)) - info 'first-match)) - (special-column-p (org-export-table-has-special-column-p table))) - (if (not special-column-p) (org-element-contents table-row) - (cdr (org-element-contents table-row))))) - -(defun org-rst-table (table contents info) - "Transcode a TABLE element from Org to reStructuredText. -CONTENTS is the contents of the table. INFO is a plist holding -contextual information." - (let* ((caption (org-export-get-caption table)) - (attributes - (org-export-read-attribute :attr_rst table)) - (class (plist-get attributes :class)) - (label (org-element-property :name table))) - (concat - (if caption (format ".. table:: %s\n" (org-export-data caption info)) - ".. table::\n") - (when class (format " :class: %s\n" class)) - (when label (format " :name: %s\n" label)) - "\n" - (org-rst--indent-string contents org-rst-quote-margin)))) - - -;;;; Table Cell - -(defun org-rst--table-cell-width (table-cell info) - "Return width of TABLE-CELL. - -INFO is a plist used as a communication channel. - -Width of a cell is determined either by a width cookie in the -same column as the cell, or by the maximum cell's length in that -column." - (let* ((row (org-export-get-parent table-cell)) - (table (org-export-get-parent row)) - (col (let ((cells (org-element-contents row))) - (- (length cells) (length (memq table-cell cells))))) - (cache - (or (plist-get info :rst-table-cell-width-cache) - (plist-get (setq info - (plist-put info :rst-table-cell-width-cache - (make-hash-table :test 'equal))) - :rst-table-cell-width-cache))) - (key (cons table col))) - (or (gethash key cache) - (puthash - key - (let ((cookie-width (org-export-table-cell-width table-cell info))) - (or cookie-width - (let ((contents-width - (let ((max-width 0)) - (org-element-map table 'table-row - (lambda (row) - (setq max-width - (max (string-width - (org-export-data - (org-element-contents - (elt (org-element-contents row) col)) - info)) - max-width))) - info) - max-width))) - (cond ((not cookie-width) contents-width) - (t cookie-width))))) - cache)))) - - -(defun org-rst-table-cell (table-cell contents info) - "Transcode a TABLE-CELL object from Org to reStructuredText. -CONTENTS is the cell contents. INFO is a plist used as -a communication channel." - (let ((width (org-rst--table-cell-width table-cell info))) - ;; Align contents correctly within the cell. - (let* ((indent-tabs-mode nil) - (data - (if contents - (org-rst--justify-lines - contents width - (org-export-table-cell-alignment table-cell info)) "\\"))) - (setq contents (concat data - (make-string (- width (string-width data)) ? )))) - ;; Return cell. - (concat (format " %s " contents) - (when (org-export-get-next-element table-cell info) "|")))) - - -;;;; Table Row - -(defun org-rst-table-row (table-row contents info) - "Transcode a TABLE-ROW element from Org to reStructuredText. -CONTENTS is the row contents. INFO is a plist used as -a communication channel." - (let ((borders (org-export-table-cell-borders - (org-element-map table-row 'table-cell 'identity info t) - info))) - (if (not (and (memq 'bottom borders) (memq 'top borders))) - (let* ((rowgroup-number (org-export-table-row-group table-row info)) - (row-number (org-export-table-row-number table-row info)) - (line-bit - (cond - ((not (= 1 rowgroup-number)) - ?-) - ((org-export-table-has-header-p - (org-export-get-parent-table table-row) info) - ?=) - (t ?-))) - (makeline - (function - (lambda (_rowcontents linebit) - (format "+%s+" - (mapconcat - 'identity - (mapcar - (lambda (table-cell) - (make-string (string-width table-cell) - linebit)) - (split-string contents "|")) - "+"))))) - (hline (format "+%s+" - (mapconcat - 'identity - (mapcar - (lambda (table-cell) - (make-string (string-width table-cell) - line-bit)) - (split-string contents "|")) - "+")))) - (concat - (when (= 0 row-number) - (concat (funcall makeline contents ?-) "\n")) - "|" contents "|\n" hline)) - nil - ))) - - -;;;; Target - -(defun org-rst-target (target _contents _info) - "Transcode a TARGET object from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format " _`%s` " (org-element-property :value target))) - - -;;;; Timestamp - -(defun org-rst-timestamp (timestamp _contents info) - "Transcode a TIMESTAMP object from Org to reStructuredText. -CONTENTS is nil. INFO is a plist holding contextual -information." - (org-rst-plain-text (org-timestamp-translate timestamp) info)) - - -;;;; Underline - -(defun org-rst-underline (_underline contents _info) - "Transcode UNDERLINE from Org to reStructuredText. -CONTENTS is the text with underline markup. INFO is a plist -holding contextual information." - contents) - - -;;;; Verbatim - -(defun org-rst-verbatim (verbatim _contents info) - "Transcode a VERBATIM object from Org to reStructredText. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (org-rst--text-markup (org-element-property :value verbatim) 'verbatim info)) - - -;;;; Verse Block - -(defun org-rst-verse-block (_verse-block contents _info) - "Transcode a VERSE-BLOCK element from Org to reStructuredText. -CONTENTS is verse block contents. INFO is a plist holding -contextual information." - (let ((lines (split-string contents "\n"))) - (cond ((> (length lines) 0) - (mapconcat - (function (lambda (x) (if (> (string-width x) 0) - (concat "| " x "\n") ""))) lines ""))))) - - -;;; Filters - -(defun org-rst-separate-elements (tree _backend _info) - "Make sure elements are separated by at least one blank line. - -TREE is the parse tree being exported. BACKEND is the export -back-end used. INFO is a plist used as a communication channel. - -Assume BACKEND is `rst'." - (org-element-map tree org-element-all-elements - (lambda (elem) - (unless (or (eq (org-element-type elem) 'org-data) - (eq (org-element-type elem) 'table-row)) - (org-element-put-property - elem :post-blank - (let ((post-blank (org-element-property :post-blank elem))) - (if (not post-blank) 1 (max 1 post-blank))))))) - ;; Return updated tree. - tree) - -(defun org-rst-filter-headline-blank-lines (headline _back-end _info) - "Filter controlling number of blank lines after a headline. - -HEADLINE is a string representing a transcoded headline. -BACK-END is symbol specifying back-end used for export. INFO is -plist containing the communication channel. - -This function only applies to `rst' back-end. See -`org-rst-headline-spacing' for information." - (if (not org-rst-headline-spacing) headline - (let ((blanks (make-string (1+ (cdr org-rst-headline-spacing)) ?\n))) - (replace-regexp-in-string "\n\\(?:\n[ \t]*\\)*\\'" blanks headline)))) - -(defun org-rst-filter-paragraph-spacing (tree _back-end info) - "Filter controlling number of blank lines between paragraphs. - -TREE is the parse tree. BACK-END is the symbol specifying -back-end used for export. INFO is a plist used as -a communication channel. - -See `org-rst-paragraph-spacing' for information." - (when (wholenump org-rst-paragraph-spacing) - (org-element-map tree 'paragraph - (lambda (p) - (when (eq (org-element-type (org-export-get-next-element p info)) - 'paragraph) - (org-element-put-property - p :post-blank org-rst-paragraph-spacing))))) - tree) - - - -;;; End-user functions - -;;;###autoload -(defun org-rst-export-as-rst - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to a reStructuredText buffer. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting buffer should be accessible -through the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -Export is done in a buffer named \"*Org RST Export*\", which will -be displayed when `org-export-show-temporary-export-buffer' is -non-nil." - (interactive) - (org-export-to-buffer 'rst "*Org RST Export*" - async subtreep visible-only body-only ext-plist (lambda () (rst-mode)))) - -;;;###autoload -(defun org-rst-convert-region-to-rst () - "Assume the current region has Org syntax, and convert it to -reStructuredText. -This can be used in any buffer. For example, you can write an -itemized list in Org syntax in a Markdown buffer and use this command -to convert it." - (interactive) - (org-export-replace-region-by 'rst)) - - -;;;###autoload -(defun org-rst-export-to-rst - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to a reStructuredText file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -Return output file's name." - (interactive) - (let* ((extension (concat "." (or (plist-get ext-plist :rst-extension) - org-rst-extension - "rst"))) - (file (org-export-output-file-name extension subtreep))) - (org-export-to-file 'rst file - async subtreep visible-only body-only ext-plist))) - -;;;###autoload -(defun org-rst-publish-to-rst (plist filename pub-dir) - "Publish an org file to reStructuredText. - -FILENAME is the filename of the Org file to be published. PLIST -is the property list for the given project. PUB-DIR is the -publishing directory. - -Return output file name." - (org-publish-org-to 'rst filename ".rst" plist pub-dir)) - - -;;; provide - -(provide 'ox-rst) - -;;; ox-rst.el ends here diff --git a/elpa/ox-rst-20191013.551/ox-rst.elc b/elpa/ox-rst-20191013.551/ox-rst.elc deleted file mode 100644 index b0fe46d4d6e4e24762f46dbefde0427e2f9a5a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55388 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 MOa1SNOz$lGKl9-F;s5{u diff --git a/elpa/package-lint-20200419.406/data/stdlib-changes b/elpa/package-lint-20200419.406/data/stdlib-changes deleted file mode 100644 index 18352c35..00000000 --- a/elpa/package-lint-20200419.406/data/stdlib-changes +++ /dev/null @@ -1,110 +0,0 @@ -(((24 1) - (functions - (removed *table--cell-conter-region ad-Orig-gdb-invalidate-frames ad-define-subr-args ad-get-subr-args ad-subr-arglist ad-subr-args-defined-p ad-undefine-subr-args ada-after-change-function ada-handle-syntax-table-properties ada-initialize-syntax-table-properties ada-set-syntax-table-properties allout-auto-save-hook-handler allout-create-encryption-passphrase-verifier allout-encrypted-key-info allout-get-encryption-passphrase-verifier allout-obtain-passphrase allout-setup-mode-map allout-update-passphrase-mnemonic-aids allout-verify-passphrase allout-write-file-hook-handler auth-source-forget-user-or-password auth-source-pick auth-source-protocol-defaults auth-source-user-or-password-imap auth-source-user-or-password-pop3 auth-source-user-or-password-sftp auth-source-user-or-password-smtp auth-source-user-or-password-ssh avl-tree--del-balance1 avl-tree--del-balance2 avl-tree--enter-balance1 avl-tree--enter-balance2 backward-char-mark backward-char-nomark backward-line-mark backward-line-nomark backward-paragraph-mark backward-paragraph-nomark backward-sexp-mark backward-sexp-nomark backward-word-mark backward-word-nomark beginning-of-buffer-mark beginning-of-buffer-nomark beginning-of-line-mark beginning-of-line-nomark bibtex-complete-internal bibtex-entry-menu build-unicode-category-table bw-adjust-window bw-b bw-balance-sub bw-dir bw-eqdir bw-find-tree-sub bw-find-tree-sub-1 bw-get-tree bw-get-tree-1 bw-l bw-r bw-refresh-edges bw-t byte-compile-byte-code-maker byte-compile-byte-code-unmake byte-compile-compiled-obj-to-list byte-compile-declare-function byte-compile-defmethod-param-convert byte-compile-file-form-defmethod byte-compile-file-form-defsubst byte-compile-funarg byte-compile-funarg-2 byte-compile-let* byte-compile-obsolete byte-compile-quote-form byte-compile-save-window-excursion byte-compile-splice-in-already-compiled-code byte-compile-with-output-to-temp-buffer byte-inline-lapcode c-extend-and-neutralize-syntax-in-CPP c-fast-in-literal c-get-fallback-start-pos c-slow-in-literal caesar-region calcAlg-blink-matching-open calculate-octave-indent cfengine-beginning-of-defun cfengine-end-of-defun cfengine-indent-line cfengine-outline-level char-bytes char-direction cl-byte-compile-block cl-byte-compile-throw comint-kill-output compilation-compat-error-properties compilation-compat-parse-errors compile-buffer-substring copy-region-as-kill-nomark custom-display-unselected-match custom-face-reset-theme custom-theme-delete-face custom-theme-delete-variable custom-theme-face-action custom-theme-variable-action custom-variable-reset-theme cvs-refontify cvs-tree cvs-tree-fuzzy-merge cvs-tree-fuzzy-merge-1 decompose-composite-char def-gdb-auto-updated-buffer dired-old-find-buffer-nocreate dired-omit-new-add-entry dired-omit-old-add-entry dired-touch-initial earcon-article-add-button earcon-article-next-button earcon-article-press-button earcon-article-prev-button earcon-article-push-button earcon-buffer earcon-button-entry earcon-button-push earcon-region ede-maybe-checkout emerge-eval-in-buffer encrypt-find-model encrypt-insert-file-contents end-of-buffer-mark end-of-buffer-nomark end-of-line-mark end-of-line-nomark end-of-prolog-clause ensure-overriding-map-is-bound erc-open-ssl-stream erc-select-ssl eshell-command-result-p eshell-deftest eshell-functionp eshell-insert-command eshell-lookup-function eshell-match-result eshell-run-one-test eshell-run-test eshell-show-usage-metrics eshell-test eshell-test-goto-func eshell-time-less-p eshell-time-to-seconds exchange-point-and-mark-nomark f90-find-tag-default feedmail-queue-send-edit-prompt-help feedmail-queue-send-edit-prompt-help-first feedmail-queue-send-edit-prompt-help-later flymake-line-beginning-position flymake-line-end-position font-setting-handle-config-changed-event format-common-tail fortran-font-lock-syntactic-keywords forward-char-mark forward-char-nomark forward-line-mark forward-line-nomark forward-paragraph-mark forward-paragraph-nomark forward-sexp-mark forward-sexp-nomark forward-word-mark forward-word-nomark frame-update-face-colors frame-update-faces gdb-all-registers gdb-append-to-inferior-io gdb-apple-test gdb-assembler-buffer-name gdb-assembler-custom gdb-assembler-handler gdb-assembler-mode gdb-data-list-register-values-custom gdb-data-list-register-values-handler gdb-dequeue-input gdb-display-assembler-buffer gdb-display-separate-io-buffer gdb-enqueue-input gdb-error gdb-exited gdb-find-source-frame gdb-frame-assembler-buffer gdb-frame-begin gdb-frame-handler-1 gdb-frame-separate-io-buffer gdb-frames-force-update gdb-frames-select gdb-get-changed-registers-handler gdb-get-frame-number gdb-get-register-names gdb-get-selected-frame gdb-get-thread-number gdb-get-version gdb-inferior-io-sender gdb-info-breakpoints-custom gdb-info-breakpoints-handler gdb-info-locals-handler gdb-info-registers-custom gdb-info-registers-handler gdb-info-stack-custom gdb-info-stack-handler gdb-info-threads-custom gdb-info-threads-handler gdb-init-2 gdb-invalidate-assembler gdb-invalidate-locals-1 gdb-invalidate-registers-1 gdb-look-for-tagged-buffer gdb-memory-set-repeat-count gdb-post-prompt gdb-pre-prompt gdb-prompt gdb-recording-handler gdb-remove-text-properties gdb-send-item gdb-separate-io-eof gdb-separate-io-interrupt gdb-separate-io-quit gdb-separate-io-stop gdb-set-gud-minor-mode-existing-buffers gdb-set-gud-minor-mode-existing-buffers-1 gdb-set-header gdb-set-hollow gdb-signal gdb-signalled gdb-source gdb-source-info gdb-stack-list-locals-handler gdb-stopping gdb-subprompt gdb-thread-changed gdb-thread-identification gdb-threads-select gdb-toggle-recording gdb-toggle-recording-1 gdb-use-separate-io-buffer gdb-var-list-children-1 gdb-var-list-children-handler-1 gdb-var-set-format-handler gdb-var-update-1 gdb-var-update-handler-1 gdba get-font-glyphs gnus-article-wash-html-with-w3 gnus-article-wash-html-with-w3m gnus-article-wash-html-with-w3m-standalone gnus-audio-play gnus-batch-brew-soup gnus-brew-soup gnus-button-entry gnus-button-handle-ctan gnus-carpal-mode gnus-carpal-mouse-select gnus-carpal-select gnus-carpal-setup-buffer gnus-change-server gnus-characterp gnus-check-first-time-used gnus-completing-read-with-default gnus-debug gnus-demon gnus-demon-add-nocem gnus-demon-is-idle-p gnus-demon-scan-nocem gnus-earcon-display gnus-fill-real-hashtb gnus-fixup-nnimap-unread-after-getting-new-news gnus-group-brew-soup gnus-group-fetch-charter gnus-group-fetch-control gnus-group-fetch-faq gnus-group-make-archive-group gnus-group-make-kiboze-group gnus-group-make-warchive-group gnus-group-move-group-to-server gnus-group-nnimap-expunge gnus-group-remove-excess-properties gnus-group-soup-map gnus-inews-insert-archive-gcc gnus-move-group-to-server gnus-nocem-active-file gnus-nocem-alist-to-hashtb gnus-nocem-cache-file gnus-nocem-check-article gnus-nocem-close gnus-nocem-enter-article gnus-nocem-epg-verify gnus-nocem-load-cache gnus-nocem-message-wanted-p gnus-nocem-save-active gnus-nocem-save-cache gnus-nocem-scan-groups gnus-nocem-unwanted-article-p gnus-nocem-verify-issuer gnus-play-jingle gnus-pull gnus-registry-add-group gnus-registry-fetch-extra gnus-registry-fetch-group gnus-registry-fetch-groups gnus-registry-store-extra-entry gnus-soup-add-article gnus-soup-area gnus-soup-area-description gnus-soup-area-encoding gnus-soup-area-name gnus-soup-area-number gnus-soup-area-prefix gnus-soup-area-set-number gnus-soup-encoding-format gnus-soup-encoding-index gnus-soup-encoding-kind gnus-soup-field gnus-soup-group-brew gnus-soup-insert-idx gnus-soup-pack gnus-soup-pack-packet gnus-soup-parse-areas gnus-soup-parse-replies gnus-soup-read-areas gnus-soup-reply-encoding gnus-soup-reply-kind gnus-soup-reply-prefix gnus-soup-save-areas gnus-soup-send-packet gnus-soup-send-replies gnus-soup-set-area-prefix gnus-soup-store gnus-soup-unique-prefix gnus-soup-unpack-packet gnus-soup-write-areas gnus-soup-write-prefixes gnus-soup-write-replies gnus-summary-clear-local-variables gnus-summary-delete-marked-as-read gnus-summary-delete-marked-with gnus-summary-fetch-faq gnus-summary-mail-nastygram gnus-summary-mark-as-unread gnus-summary-mark-as-unread-backward gnus-summary-mark-as-unread-forward gnus-summary-nnir-goto-thread gnus-window-configuration-element gnus-windows-old-to-new gnus-with-local-quit gnus-x-splash gpg-decrypt gpg-encrypt gpg-passphrase-read gpg-sign-cleartext gpg-sign-detached gpg-sign-encrypt gpg-verify gpg-verify-cleartext gud-gdb-complete-command gud-gdba-marker-filter hanoi-current-time-float help-window-setup-finish hexl-after-revert-hook hexl-before-revert-hook hfy-face-to-css hfy-p-to-face hfy-p-to-face-lennart idlwave-pset iimage-locate-file image-dired-dired-insert-marked-thumbs imap-hash-buffer-name imap-hash-clear imap-hash-count imap-hash-data-body imap-hash-data-headers imap-hash-fetch imap-hash-gather imap-hash-get imap-hash-get-body imap-hash-get-buffer imap-hash-get-headers imap-hash-mailbox imap-hash-make imap-hash-make-message imap-hash-map imap-hash-ms-strip-cr imap-hash-open-connection imap-hash-p imap-hash-password imap-hash-port imap-hash-put imap-hash-rem imap-hash-remove-cr-followed-by-lf imap-hash-server imap-hash-size imap-hash-ssl imap-hash-test imap-hash-user inferior-prolog-guess-flavor inferior-prolog-load-file inferior-prolog-mode inferior-prolog-process inferior-prolog-run inferior-prolog-self-insert-command internal-find-face internal-frob-font-slant internal-frob-font-weight internal-get-face isearch-return-char iswitchb-default-keybindings jka-compr-delete-temp-file js-insert-and-indent list-diary-entries lm lm-amble-robot lm-beginning-of-line lm-blackbox lm-calc-confidences lm-calc-current-smells lm-calc-payoff lm-check-filled-qtuple lm-click lm-confidence-for lm-crash-game lm-cross-qtuple lm-display-statistics lm-emacs-plays lm-end-of-line lm-f lm-find-filled-qtuple lm-fix-weights-for lm-flip-a-coin lm-goto-square lm-goto-xy lm-human-plays lm-human-resigns lm-human-takes-back lm-index-to-x lm-index-to-y lm-init lm-init-board lm-init-display lm-init-score-table lm-init-square-score lm-max-height lm-max-width lm-mode lm-mouse-play lm-move lm-move-down lm-move-ne lm-move-nw lm-move-se lm-move-sw lm-move-up lm-nb-qtuples lm-noise lm-nslify-wts lm-nslify-wts-int lm-offer-a-draw lm-play-move lm-plot-internal lm-plot-landmarks lm-plot-square lm-point-square lm-point-y lm-print-distance lm-print-distance-int lm-print-moves lm-print-smell lm-print-smell-int lm-print-w0 lm-print-w0-int lm-print-wts lm-print-wts-blackbox lm-print-wts-int lm-print-y\,s\,noise lm-print-y\,s\,noise-int lm-prompt-for-move lm-prompt-for-other-game lm-random-move lm-randomize-weights-for lm-set-landmark-signal-strengths lm-start-game lm-start-robot lm-store-old-y_t lm-strongest-square lm-switch-to-window lm-take-back lm-terminate-game lm-test-run lm-update-naught-weights lm-update-normal-weights lm-update-score-in-direction lm-update-score-table lm-weights-debug lm-xy-to-index lm-y ls-lisp-time-lessp ls-lisp-time-to-seconds m2-newline m2-tab mail-source-fetch-webmail mairix-replace-illegal-chars make-local-hook meta-common-initialization meta-looking-at-backward meta-match-buffer midnight-time-float minibuffer-complete-shell-command mldrag-drag-mode-line mldrag-drag-vertical-line mml1991-gpg-encrypt mml1991-gpg-sign mml2015-gpg-clear-decrypt mml2015-gpg-clear-verify mml2015-gpg-decrypt mml2015-gpg-decrypt-1 mml2015-gpg-encrypt mml2015-gpg-passphrase mml2015-gpg-sign mml2015-gpg-verify mode-line-abbrev-mode mode-line-auto-fill-mode mouse-drag-mode-line-1 mouse-drag-move-window-bottom mouse-drag-move-window-top mouse-drag-vertical-line-rightward-window mouse-drag-window-above mouse-move-drag-overlay mouse-show-mark move-to-column-force netrc-point-at-eol news-/ news-add-news-group news-caadr news-cadar news-caddr news-cadr news-caesar-buffer-body news-cdadr news-cdar news-convert-format news-delete-headers news-exit news-find-first-and-last news-find-first-or-last news-force-update news-get-certifications news-get-motion-lists news-get-new-news news-get-pruned-list-of-files news-goto-message news-goto-news-group news-group-certification news-inews news-list-news-groups news-mail-other-window news-mail-reply news-make-link-to-message news-mode news-move-to-group news-next-group news-next-message news-parse-range news-post-news news-previous-group news-previous-message news-push news-read-files-into-buffer news-read-in-file news-reply news-reply-distribution news-reply-followup-to news-reply-keywords news-reply-mode news-reply-newsgroups news-reply-signature news-reply-summary news-reply-yank-original news-save-item-in-file news-select-message news-select-news-group news-set-current-certifiable news-set-current-group-certification news-set-message-counters news-set-mode-line news-setup news-show-all-headers news-unsubscribe-current-group news-unsubscribe-group news-unsubscribe-internal news-update-message-read news-update-newsrc-file news-wins news-write-certifications next-line-mark next-line-nomark nndb-asynchronous-p nndb-build-article-string nndb-build-expire-rest-list nndb-close-group nndb-close-server nndb-get-remote-expire-response nndb-list-active-group nndb-open-server nndb-request-accept-article nndb-request-article nndb-request-body nndb-request-close nndb-request-expire-articles nndb-request-expire-articles-local nndb-request-expire-articles-remote nndb-request-group nndb-request-group-articles nndb-request-head nndb-request-list nndb-request-list-newsgroups nndb-request-move-article nndb-request-newgroups nndb-request-post nndb-request-replace-article nndb-request-set-mark nndb-request-type nndb-request-update-info nndb-request-update-mark nndb-retrieve-articles nndb-retrieve-groups nndb-retrieve-headers nndb-server-opened nndb-status-message nndb-touch-article nnfolder-request-update-info nnimap-assoc-match nnimap-asynchronous-p nnimap-before-find-minmax-bugworkaround nnimap-callback nnimap-date-days-ago nnimap-demule nnimap-dont-use-nov-p nnimap-expiry-target nnimap-expunge nnimap-find-minmax-uid nnimap-get-server-buffer nnimap-group-overview-filename nnimap-make-callback nnimap-mark-permanent-p nnimap-mark-to-flag nnimap-mark-to-flag-1 nnimap-mark-to-predicate nnimap-pattern-to-list-arguments nnimap-possibly-change-server nnimap-remove-server-from-buffer-alist nnimap-replace-whitespace nnimap-request-article-part nnimap-request-body nnimap-request-expire-articles-progress nnimap-request-type nnimap-retrieve-groups nnimap-retrieve-headers-from-file nnimap-retrieve-headers-from-server nnimap-retrieve-headers-progress nnimap-retrieve-which-headers nnimap-split-articles nnimap-split-fancy nnimap-split-find-inbox nnimap-split-find-rule nnimap-split-to-groups nnimap-strict-function-match nnimap-string-lessp-numerical nnimap-time-substract nnimap-update-unseen nnimap-verify-uidvalidity nnir-artlist-artitem-group nnir-artlist-artitem-number nnir-artlist-artitem-rsv nnir-group-full-name nnir-group-mode-hook nnir-group-server nnir-run-waissearch nnkiboze-close-group nnkiboze-close-server nnkiboze-enter-nov nnkiboze-generate-group nnkiboze-generate-groups nnkiboze-nov-file-name nnkiboze-open-server nnkiboze-possibly-change-group nnkiboze-prefixed-name nnkiboze-request-article nnkiboze-request-close nnkiboze-request-delete-group nnkiboze-request-group nnkiboze-request-list nnkiboze-request-list-newsgroups nnkiboze-request-post nnkiboze-request-scan nnkiboze-retrieve-headers nnkiboze-score-file nnkiboze-server-opened nnkiboze-status-message nnlistserv-asynchronous-p nnlistserv-close-group nnlistserv-close-server nnlistserv-kk-create-mapping nnlistserv-kk-identity nnlistserv-kk-search nnlistserv-kk-wash-article nnlistserv-open-server nnlistserv-request-article nnlistserv-request-close nnlistserv-request-create-group nnlistserv-request-delete-group nnlistserv-request-group nnlistserv-request-list nnlistserv-request-list-newsgroups nnlistserv-request-post nnlistserv-request-scan nnlistserv-request-update-info nnlistserv-retrieve-headers nnlistserv-server-opened nnlistserv-status-message nnmaildir-request-update-info nnmairix-request-update-info nnml-request-update-info nnrss-generate-active nnrss-snarf-moreover-categories nnslashdot-close-group nnslashdot-close-server nnslashdot-date-to-date nnslashdot-generate-active nnslashdot-init nnslashdot-lose nnslashdot-make-tuple nnslashdot-open-server nnslashdot-possibly-change-server nnslashdot-read-groups nnslashdot-request-article nnslashdot-request-close nnslashdot-request-delete-group nnslashdot-request-expire-articles nnslashdot-request-group nnslashdot-request-list nnslashdot-request-list-newsgroups nnslashdot-request-newgroups nnslashdot-request-post nnslashdot-retrieve-headers nnslashdot-retrieve-headers-1 nnslashdot-server-opened nnslashdot-status-message nnslashdot-write-groups nnsoup-article-to-area nnsoup-close-group nnsoup-close-server nnsoup-delete-unreferenced-message-files nnsoup-dissect-buffer nnsoup-file nnsoup-file-name nnsoup-index-buffer nnsoup-kind-to-prefix nnsoup-make-active nnsoup-message-buffer nnsoup-narrow-to-article nnsoup-next-prefix nnsoup-number-of-articles nnsoup-open-server nnsoup-pack-replies nnsoup-possibly-change-group nnsoup-read-active-file nnsoup-read-areas nnsoup-request-article nnsoup-request-close nnsoup-request-expire-articles nnsoup-request-group nnsoup-request-list nnsoup-request-list-newsgroups nnsoup-request-mail nnsoup-request-newgroups nnsoup-request-post nnsoup-request-scan nnsoup-request-type nnsoup-retrieve-headers nnsoup-revert-variables nnsoup-server-opened nnsoup-set-variables nnsoup-status-message nnsoup-store-reply nnsoup-unpack-packets nnsoup-write-active-file nnsoup-write-replies nntp-async-kluge nntp-insert-buffer-substring nntp-open-network-stream nntp-open-ssl-stream nntp-open-tls-stream nntp-request-update-info nnultimate-close-group nnultimate-close-server nnultimate-create-mapping nnultimate-find-forum-table nnultimate-find-forum-table-1 nnultimate-forum-table-p nnultimate-generate-active nnultimate-init nnultimate-open-server nnultimate-possibly-change-server nnultimate-prune-days nnultimate-read-groups nnultimate-request-article nnultimate-request-close nnultimate-request-group nnultimate-request-list nnultimate-request-list-newsgroups nnultimate-request-newgroups nnultimate-request-post nnultimate-retrieve-headers nnultimate-server-opened nnultimate-status-message nnultimate-topic-article-to-article nnultimate-write-groups nnvirtual-request-list nnwarchive-backlog nnwarchive-backlog-enter-article nnwarchive-close-group nnwarchive-close-server nnwarchive-egroups-article nnwarchive-egroups-list nnwarchive-egroups-list-groups nnwarchive-egroups-xover nnwarchive-egroups-xover-files nnwarchive-eval nnwarchive-from-r13 nnwarchive-generate-active nnwarchive-get-article nnwarchive-init nnwarchive-mail-archive-article nnwarchive-mail-archive-list nnwarchive-mail-archive-list-groups nnwarchive-mail-archive-xover nnwarchive-mail-archive-xover-files nnwarchive-make-caesar-translation-table nnwarchive-open-server nnwarchive-paged nnwarchive-possibly-change-server nnwarchive-read-groups nnwarchive-request-article nnwarchive-request-close nnwarchive-request-group nnwarchive-request-list nnwarchive-request-list-newsgroups nnwarchive-request-post nnwarchive-retrieve-headers nnwarchive-server-opened nnwarchive-set-default nnwarchive-status-message nnwarchive-url nnwarchive-write-groups nnwfm-close-group nnwfm-close-server nnwfm-create-mapping nnwfm-date-to-time nnwfm-find-forum-table nnwfm-find-forum-table-1 nnwfm-forum-table-p nnwfm-generate-active nnwfm-init nnwfm-new-threads-p nnwfm-open-server nnwfm-possibly-change-server nnwfm-read-groups nnwfm-request-article nnwfm-request-close nnwfm-request-group nnwfm-request-list nnwfm-request-list-newsgroups nnwfm-request-newgroups nnwfm-request-post nnwfm-retrieve-headers nnwfm-server-opened nnwfm-status-message nnwfm-write-groups octave-add-octave-menu octave-backward-block octave-backward-up-block octave-before-magic-comment-p octave-blink-matching-block-open octave-block-end-offset octave-close-block octave-comment-indent octave-comment-region octave-describe-major-mode octave-down-block octave-electric-semi octave-electric-space octave-end-as-array-index-p octave-end-of-defun octave-forward-block octave-help octave-in-block-p octave-in-defun-p octave-indent-for-comment octave-indent-line octave-mark-defun octave-re-search-backward-kw octave-re-search-forward-kw octave-reindent-then-newline-and-indent octave-scan-blocks octave-uncomment-region octave-up-block open-ssl-stream org-add-to-invisibility-spec org-agenda-columns-cleanup-item org-agenda-compute-time-span org-agenda-filter-by-tag-hide-line org-agenda-filter-by-tag-show-all org-checkbox-blocked-p org-clocktable-add-file org-complete org-delete-overlay org-encode-for-stdout org-export-docbook-close-lists-maybe org-export-html-close-lists-maybe org-export-html-insert-plist-item org-first-list-item-p org-fix-bullet-type org-footnote-goto-next-reference org-format-agenda-item org-freemind-test-escape org-get-bullet org-get-refile-targets org-indent-refresh-buffer org-indent-refresh-section org-indent-refresh-subtree org-indent-refresh-to org-inlinetask-remove-terminator org-insert-footnote-reference-near-definition org-invisible-p org-item-indent-positions org-list-end org-list-goto-true-beginning org-list-item-beginning org-list-make-subtrees org-make-overlay org-maybe-renumber-ordered-list org-maybe-renumber-ordered-list-safe org-mode-p org-mouse-match-todo-keyword org-move-overlay org-overlay-buffer org-overlay-end org-overlay-get org-overlay-put org-overlay-start org-overlays-at org-overlays-in org-parse-local-options org-publish-get-files org-publish-initialize-files-alist org-publish-org-index org-publish-validate-link org-remove-uniherited-tags org-renumber-ordered-list org-run-agenda-series org-shift-item-indentation org-sort-entries-or-items org-timer-cancel-timers org-write-agenda outline-visible pascal-get-beg-of-line pascal-get-end-of-line pc-select-ensure-mark pc-select-maybe-deactivate-mark pcomplete--common-suffix pcomplete--table-subvert pcomplete-parse-erc-arguments perl-font-lock-special-syntactic-constructs pop3-process-filter previous-line-mark previous-line-nomark proced-unload-function produce-allout-mode-map prolog-consult-region-and-go prolog-mode-menu ps-run-newline python-comint-output-filter-function python-shell python-toggle-shells quail-choose-completion-string rcirc-browse-url-at-mouse rcirc-browse-url-at-point rcirc-complete-nick read-file-name-defaults remember-time-to-seconds rnews rng-time-to-float ruby-comment-beg-syntax ruby-here-doc-beg-match ruby-here-doc-beg-syntax ruby-here-doc-end-syntax ruby-here-doc-find-end ruby-in-here-doc-p screen-height screen-width scroll-down-mark scroll-down-nomark scroll-up-mark scroll-up-nomark semantic-highlight-edits-mode-setup semantic-highlight-func-mode-setup semantic-show-parser-state-mode-setup semantic-show-unmatched-syntax-mode-setup semantic-stickyfunc-mode-setup set-screen-height set-screen-width set-scroll-bar-mode-1 sh-font-lock-close-heredoc sh-font-lock-flush-syntax-ppss-cache sh-font-lock-here-doc sha1-binary sha1-block sha1-region sha1-region-external sha1-region-internal sha1-string sha1-string-external sha1-string-internal shell-dynamic-complete-as-command shell-dynamic-complete-as-environment-variable show-all-diary-entries sieve-manage-interactive-login smie-bnf-classify smie-bnf-closer-alist smtpmail-open-stream split-window-save-restore-data sql-connect-db2 sql-connect-informix sql-connect-ingres sql-connect-interbase sql-connect-linter sql-connect-ms sql-connect-mysql sql-connect-oracle sql-connect-postgres sql-connect-solid sql-connect-sqlite sql-connect-sybase sql-escape-newlines-and-send sql-keywords-re sql-product-feature sql-query-placeholders-and-send string-subst-char switch-to-prolog test-rmail-mime-bulk-handler test-rmail-mime-handler test-rmail-mime-multipart-handler tetris-shape-height tex-compilation-parse-errors texinfo-insert-@-with-arg tramp-coding-system-change-eol-conversion tramp-compat-line-beginning-position tramp-compat-line-end-position tramp-decimal-to-octal tramp-fish-do-copy-or-rename-file tramp-fish-do-copy-or-rename-file-directly tramp-fish-file-name-handler tramp-fish-file-name-p tramp-fish-get-file-entries tramp-fish-handle-add-name-to-file tramp-fish-handle-copy-file tramp-fish-handle-delete-directory tramp-fish-handle-delete-file tramp-fish-handle-directory-files-and-attributes tramp-fish-handle-executable-find tramp-fish-handle-expand-file-name tramp-fish-handle-file-attributes tramp-fish-handle-file-directory-p tramp-fish-handle-file-executable-p tramp-fish-handle-file-exists-p tramp-fish-handle-file-local-copy tramp-fish-handle-file-name-all-completions tramp-fish-handle-file-newer-than-file-p tramp-fish-handle-file-readable-p tramp-fish-handle-file-writable-p tramp-fish-handle-insert-directory tramp-fish-handle-insert-file-contents tramp-fish-handle-make-directory tramp-fish-handle-make-directory-internal tramp-fish-handle-make-symbolic-link tramp-fish-handle-process-file tramp-fish-handle-rename-file tramp-fish-handle-set-file-modes tramp-fish-handle-set-file-times tramp-fish-handle-write-region tramp-fish-maybe-open-connection tramp-fish-read-file-entry tramp-fish-retrieve-data tramp-fish-send-command tramp-fish-send-command-and-check tramp-handle-add-name-to-file tramp-handle-call-process-region tramp-handle-copy-directory tramp-handle-copy-file tramp-handle-delete-directory tramp-handle-delete-file tramp-handle-dired-compress-file tramp-handle-dired-recursive-delete-directory tramp-handle-executable-find tramp-handle-expand-file-name tramp-handle-file-attributes tramp-handle-file-directory-p tramp-handle-file-executable-p tramp-handle-file-local-copy tramp-handle-file-name-all-completions tramp-handle-file-ownership-preserved-p tramp-handle-file-readable-p tramp-handle-file-selinux-context tramp-handle-file-truename tramp-handle-file-writable-p tramp-handle-insert-directory tramp-handle-insert-file-contents-literally tramp-handle-make-auto-save-file-name tramp-handle-make-directory tramp-handle-make-symbolic-link tramp-handle-process-file tramp-handle-rename-file tramp-handle-set-file-modes tramp-handle-set-file-selinux-context tramp-handle-set-file-times tramp-handle-set-visited-file-modtime tramp-handle-start-file-process tramp-handle-vc-registered tramp-handle-verify-visited-file-modtime tramp-handle-write-region tramp-imap-decode-buffer tramp-imap-do-copy-or-rename-file tramp-imap-encode-buffer tramp-imap-file-name-handler tramp-imap-file-name-localname tramp-imap-file-name-mailbox tramp-imap-file-name-name tramp-imap-file-name-p tramp-imap-file-name-parse tramp-imap-get-file tramp-imap-get-file-entries tramp-imap-get-file-inode tramp-imap-handle-copy-file tramp-imap-handle-delete-file tramp-imap-handle-directory-files-and-attributes tramp-imap-handle-expand-file-name tramp-imap-handle-file-attributes tramp-imap-handle-file-directory-p tramp-imap-handle-file-executable-p tramp-imap-handle-file-exists-p tramp-imap-handle-file-local-copy tramp-imap-handle-file-name-all-completions tramp-imap-handle-file-newer-than-file-p tramp-imap-handle-file-readable-p tramp-imap-handle-file-writable-p tramp-imap-handle-insert-directory tramp-imap-handle-insert-file-contents tramp-imap-handle-rename-file tramp-imap-handle-write-region tramp-imap-make-iht tramp-imap-passphrase-callback-function tramp-imap-put-file tramp-local-call-process tramp-octal-to-decimal tramp-outline-level tramp-set-process-query-on-exit-flag tramp-smb-handle-directory-files-and-attributes tramp-smb-handle-file-exists-p tramp-smb-handle-file-newer-than-file-p url-cookie-tag vc-default-previous-version verilog-alw-get-outputs verilog-decls-get-regs verilog-decls-get-wires verilog-get-beg-of-line verilog-get-end-of-line verilog-inside-comment-p verilog-modi-cache-add-regs verilog-modi-cache-add-wires vhdl-mode-line-update view-diary-entries webmail-debug webmail-encode-8bit webmail-error webmail-eval webmail-fetch webmail-hotmail-article webmail-hotmail-article-old webmail-hotmail-list webmail-hotmail-login webmail-hotmail-open webmail-init webmail-my-deja-article webmail-my-deja-article-part webmail-my-deja-list webmail-my-deja-open webmail-netaddress-article webmail-netaddress-list webmail-netaddress-login webmail-netaddress-open webmail-netaddress-single-part webmail-netscape-article webmail-netscape-open webmail-refresh-redirect webmail-setdefault webmail-url webmail-url-confirmation-func webmail-yahoo-article webmail-yahoo-list webmail-yahoo-login webmail-yahoo-open widget-color-complete widget-default-complete widget-file-complete widget-string-complete with-progress-reporter with-timeout-handler x-frob-font-slant x-frob-font-weight x-get-cut-buffer x-make-font-bold x-make-font-bold-italic x-make-font-demibold x-make-font-italic x-make-font-oblique x-make-font-unbold x-make-font-unitalic x-menu-activate x-menu-add-item x-menu-change-associated-buffer x-menu-create-menu x-menu-delete-item x-menu-mode x-menu-pick-entry x-set-cut-buffer x-setup-function-keys) - (added *table--cell-center-region 5x5-defvar-local 5x5-grid-to-vec 5x5-log 5x5-log-init 5x5-solve-rotate-left 5x5-solve-rotate-right 5x5-solve-suggest 5x5-solver 5x5-vec-to-grid Footnote-unicode Info-isearch-end Man-bookmark-jump Man-bookmark-make-record Man-default-bookmark-title Man-page-from-arguments abbrev-edit-save-buffer abbrev-edit-save-to-file abbrev-table-empty-p ad-Orig-find-tag ad-Orig-org-format-latex-as-mathml ad-Orig-save-place-find-file-hook ad-Orig-visit-tags-table align--set-marker allout-auto-activation-helper allout-body-modification-handler allout-called-interactively-p allout-chart-exposure-contour-by-icon allout-compose-and-institute-keymap allout-current-decorated-p allout-decorate-item-and-context allout-decorate-item-body allout-decorate-item-cue allout-decorate-item-guides allout-decorate-item-icon allout-decorate-item-span allout-elapsed-time-seconds allout-fetch-icon-image allout-find-image allout-frame-property allout-get-item-widget allout-get-or-create-item-widget allout-get-or-create-parent-widget allout-graphics-modification-handler allout-inhibit-auto-save-info-for-decryption allout-institute-keymap allout-item-actual-position allout-item-element-span-is allout-item-icon-key-handler allout-item-location allout-item-span allout-mark-active-p allout-maybe-resume-auto-save-info-after-encryption allout-new-item-widget allout-next-single-char-property-change allout-parse-item-at-point allout-previous-single-char-property-change allout-range-overlaps allout-redecorate-item allout-redecorate-visible-subtree allout-select-safe-coding-system allout-set-boundary-marker allout-setup allout-setup-text-properties allout-substring-no-properties allout-test-range-overlaps allout-widgetize-buffer allout-widgets-additions-processor allout-widgets-additions-recorder allout-widgets-adjusting-message allout-widgets-after-change-handler allout-widgets-after-copy-or-kill-function allout-widgets-after-undo-function allout-widgets-before-change-handler allout-widgets-changes-dispatcher allout-widgets-copy-list allout-widgets-count-buttons-in-region allout-widgets-deletions-processor allout-widgets-deletions-recorder allout-widgets-exposure-change-processor allout-widgets-exposure-change-recorder allout-widgets-exposure-undo-processor allout-widgets-exposure-undo-recorder allout-widgets-hook-error-handler allout-widgets-mode allout-widgets-mode-disable allout-widgets-mode-enable allout-widgets-mode-off allout-widgets-mode-on allout-widgets-post-command-business allout-widgets-pre-command-business allout-widgets-prepopulate-buffer allout-widgets-run-unit-tests allout-widgets-setup allout-widgets-shifts-processor allout-widgets-shifts-recorder allout-widgets-tally-string allout-widgets-undecorate-item allout-widgets-undecorate-region allout-widgets-undecorate-text allout-widgets-version allout-write-contents-hook-handler ange-ftp-switches-ok ansi-color-apply-overlay-face appt-mode-line archive-7z-extract archive-7z-summarize archive-7z-write-file-member article-date-combined-lapsed article-lapsed-string article-transform-date article-treat-date article-treat-non-ascii artist-select-op-pen-line auth-source-backend auth-source-backend-child-p auth-source-backend-p auth-source-backend-parse auth-source-backend-parse-parameters auth-source-delete auth-source-do-trivia auth-source-do-warn auth-source-ensure-strings auth-source-epa-extract-gpg-token auth-source-epa-make-gpg-token auth-source-forget auth-source-forget+ auth-source-format-cache-entry auth-source-format-prompt auth-source-netrc-create auth-source-netrc-element-or-first auth-source-netrc-normalize auth-source-netrc-parse auth-source-netrc-saver auth-source-netrc-search auth-source-pick-first-password auth-source-plstore-create auth-source-plstore-search auth-source-read-char-choice auth-source-recall auth-source-remember auth-source-remembered-p auth-source-search auth-source-search-backends auth-source-search-collection auth-source-secrets-create auth-source-secrets-search auth-source-specmatchp auth-source-token-passphrase-callback-function auth-source-user-and-password authors-disambiguate-file-name autoload-find-generated-file avl-tree--check avl-tree--check-node avl-tree--create avl-tree--del-balance avl-tree--dir-to-sign avl-tree--enter-balance avl-tree--sign-to-dir avl-tree--stack-create avl-tree--stack-p avl-tree--stack-repopulate avl-tree--stack-reverse avl-tree--stack-store avl-tree--switch-dir avl-tree-mapc avl-tree-mapcar avl-tree-mapf avl-tree-member-p avl-tree-stack avl-tree-stack-empty-p avl-tree-stack-first avl-tree-stack-p avl-tree-stack-pop balance-windows-1 balance-windows-2 balance-windows-area-adjust battery-yeeloong-sysfs bdf-check-font bdf-compact-code bdf-expand-code bdf-generate-font bdf-generate-glyph bdf-generate-prologue bdf-get-bitmap bdf-get-font-info bdf-info-absolute-path bdf-info-baseline-offset bdf-info-code-range bdf-info-font-bounding-box bdf-info-maxlen bdf-info-mod-time bdf-info-offset-vector bdf-info-relative-compose bdf-info-size bdf-initialize bdf-read-bitmap bdf-read-cache bdf-read-font-info bdf-search-and-read bdf-set-cache bdf-write-cache bibtex-BookInBook bibtex-Collection bibtex-InReference bibtex-MVBook bibtex-MVCollection bibtex-MVProceedings bibtex-MVReference bibtex-Online bibtex-Patent bibtex-Periodical bibtex-Reference bibtex-Report bibtex-SuppBook bibtex-SuppCollection bibtex-SuppPeriodical bibtex-Thesis bibtex-completion-at-point-function bibtex-display-entries bibtex-entry-alist bibtex-search-entries bibtex-set-dialect bibtex-vec-incr bibtex-vec-push bidi-string-mark-left-to-right blink-matching-check-mismatch blink-paren-post-self-insert-function bookmark--jump-via bookmark-alist-from-buffer bookmark-all-names bookmark-bmenu-1-window bookmark-bmenu-2-window bookmark-bmenu-any-marks bookmark-bmenu-backup-unmark bookmark-bmenu-bookmark bookmark-bmenu-delete bookmark-bmenu-delete-backwards bookmark-bmenu-edit-annotation bookmark-bmenu-ensure-position bookmark-bmenu-execute-deletions bookmark-bmenu-filter-alist-by-regexp bookmark-bmenu-goto-bookmark bookmark-bmenu-hide-filenames bookmark-bmenu-load bookmark-bmenu-locate bookmark-bmenu-mark bookmark-bmenu-mode bookmark-bmenu-other-window bookmark-bmenu-other-window-with-mouse bookmark-bmenu-relocate bookmark-bmenu-rename bookmark-bmenu-save bookmark-bmenu-select bookmark-bmenu-show-all-annotations bookmark-bmenu-show-annotation bookmark-bmenu-show-filenames bookmark-bmenu-surreptitiously-rebuild-list bookmark-bmenu-switch-other-window bookmark-bmenu-this-window bookmark-bmenu-toggle-filenames bookmark-bmenu-unmark bookmark-buffer-file-name bookmark-buffer-name bookmark-completing-read bookmark-default-annotation-text bookmark-default-handler bookmark-edit-annotation bookmark-edit-annotation-mode bookmark-exit-hook-internal bookmark-get-annotation bookmark-get-bookmark bookmark-get-bookmark-record bookmark-get-filename bookmark-get-front-context-string bookmark-get-handler bookmark-get-position bookmark-get-rear-context-string bookmark-grok-file-format-version bookmark-handle-bookmark bookmark-import-new-list bookmark-insert-current-bookmark bookmark-insert-file-format-version-stamp bookmark-jump-noselect bookmark-kill-line bookmark-location bookmark-make-record bookmark-make-record-default bookmark-maybe-historicize-string bookmark-maybe-load-default-file bookmark-maybe-message bookmark-maybe-rename bookmark-maybe-sort-alist bookmark-maybe-upgrade-file-format bookmark-menu-popup-paned-menu bookmark-name-from-full-record bookmark-prop-get bookmark-prop-set bookmark-read-search-input bookmark-send-edited-annotation bookmark-set-annotation bookmark-set-filename bookmark-set-front-context-string bookmark-set-name bookmark-set-position bookmark-set-rear-context-string bookmark-show-all-annotations bookmark-show-annotation bookmark-store bookmark-time-to-save-p bookmark-unload-function bookmark-upgrade-file-format-from-0 bookmark-upgrade-version-0-alist bookmark-write-file bookmark-yank-word browse-url-can-use-xdg-open browse-url-chromium browse-url-xdg-open bury-buffer-internal byte-compile-add-to-list byte-compile-arglist-vars byte-compile-bind byte-compile-check-variable byte-compile-dynamic-variable-bind byte-compile-dynamic-variable-op byte-compile-get-closed-var byte-compile-inline-lapcode byte-compile-macroexpand-declare-function byte-compile-make-args-desc byte-compile-make-closure byte-compile-make-lambda-lexenv byte-compile-make-obsolete-variable byte-compile-not-lexical-var-p byte-compile-preprocess byte-compile-push-binding-init byte-compile-push-bytecode-const2 byte-compile-push-bytecodes byte-compile-set-default byte-compile-stack-adjustment byte-compile-stack-ref byte-compile-stack-set byte-compile-toplevel-file-form byte-compile-unbind byte-compile-unfold-bcf byte-compile-variable-set byte-recompile-file c-append-lower-brace-pair-to-state-cache c-append-to-state-cache c-at-macro-vsemi-p c-before-change-check-<>-operators c-change-set-fl-decl-start c-cheap-inside-bracelist-p c-clear-<-pair-props c-clear-<-pair-props-if-match-after c-clear-<>-pair-props c-clear->-pair-props c-clear->-pair-props-if-match-before c-clear-cpp-delimiters c-comment-out-cpps c-context-set-fl-decl-start c-count-cfss c-determine-+ve-limit c-determine-limit c-determine-limit-get-base c-extend-font-lock-region-for-macros c-font-lock-enclosing-decls c-font-lock-enum-tail c-font-lock-fontify-region c-forward-annotation c-get-cache-scan-pos c-get-fallback-scan-pos c-guess c-guess-accumulate c-guess-accumulate-offset c-guess-buffer c-guess-buffer-no-install c-guess-current-offset c-guess-dump-accumulator c-guess-dump-guessed-style c-guess-dump-guessed-values c-guess-empty-line-p c-guess-examine c-guess-guess c-guess-guessed-syntactic-symbols c-guess-install c-guess-make-basic-offset c-guess-make-offsets-alist c-guess-make-style c-guess-merge-offsets-alists c-guess-no-install c-guess-region c-guess-region-no-install c-guess-reset-accumulator c-guess-sort-accumulator c-guess-style-name c-guess-symbolize-integer c-guess-symbolize-offsets-alist c-guess-view c-guess-view-mark-guessed-entries c-guess-view-reorder-offsets-alist-in-style c-invalidate-macro-cache c-invalidate-state-cache-1 c-macro-vsemi-status-unknown-p c-make-font-lock-BO-decl-search-function c-make-font-lock-context-search-function c-make-font-lock-search-form c-make-macro-with-semi-re c-most-enclosing-decl-block c-narrow-to-most-enclosing-decl-block c-neutralize-syntax-in-and-mark-CPP c-parse-state-1 c-parse-state-get-strategy c-pull-open-brace c-punctuation-in c-record-parse-state-state c-remove-stale-state-cache c-remove-stale-state-cache-backwards c-renarrow-state-cache c-replay-parse-state-state c-restore-<->-as-parens c-search-backward-char-property c-search-forward-char-property c-set-cpp-delimiters c-set-fl-decl-start c-state-balance-parens-backwards c-state-cache-after-top-paren c-state-cache-init c-state-cache-non-literal-place c-state-cache-top-lparen c-state-cache-top-paren c-state-get-min-scan-pos c-state-lit-beg c-state-literal-at c-state-mark-point-min-literal c-state-pp-to-literal c-state-push-any-brace-pair c-state-safe-place c-state-semi-safe-place c-suppress-<->-as-parens c-syntactic-end-of-macro c-uncomment-out-cpps c-unmark-<->-as-paren c-while-widening-to-decl-block c-widen-to-enclosing-decl-scope c-with-<->-as-parens-suppressed c-with-all-but-one-cpps-commented-out c-with-cpps-commented-out calc-db calc-freq calc-is-option calc-l-prefix-help calc-lu-divide calc-lu-minus calc-lu-plus calc-lu-quant calc-lu-times calc-midi calc-np calc-option calc-option-prefix-help calc-spn calcAlg-blink-matching-check calcFunc-dbfield calcFunc-dbpower calcFunc-freq calcFunc-lufadd calcFunc-lufdiv calcFunc-lufmul calcFunc-lufquant calcFunc-lufsub calcFunc-lupadd calcFunc-lupdiv calcFunc-lupmul calcFunc-lupquant calcFunc-lupsub calcFunc-midi calcFunc-npfield calcFunc-nppower calcFunc-spn calendar-customized-p calendar-hebrew-birthday calendar-scroll-toolkit-scroll cc-choose-style-for-mode cconv--analyse-function cconv--analyse-use cconv--convert-function cconv--map-diff cconv--map-diff-elem cconv--map-diff-set cconv--set-diff cconv--set-diff-map cconv-analyse-form cconv-closure-convert cconv-convert cfengine-auto-mode cfengine-common-settings cfengine-common-syntax cfengine2-beginning-of-defun cfengine2-end-of-defun cfengine2-indent-line cfengine2-mode cfengine2-outline-level cfengine3-beginning-of-defun cfengine3-end-of-defun cfengine3-indent-line cfengine3-mode cl--make-usage-args cl--make-usage-var collapse-delayed-warnings color-cie-de2000 color-clamp color-complement color-complement-hex color-darken-hsl color-darken-name color-desaturate-hsl color-desaturate-name color-gradient color-hsl-to-rgb color-hue-to-rgb color-lab-to-srgb color-lab-to-xyz color-lighten-hsl color-lighten-name color-name-to-rgb color-rgb-to-hex color-rgb-to-hsl color-rgb-to-hsv color-saturate-hsl color-saturate-name color-srgb-to-lab color-srgb-to-xyz color-xyz-to-lab color-xyz-to-srgb comint--common-quoted-suffix comint--common-suffix comint--complete-file-name-data comint--match-partial-filename comint--table-subvert comint--unquote&expand-filename comint-c-a-p-replace-by-expanded-history comint-completion-at-point comint-completion-file-name-table comint-filename-completion comment-only-p compilation--compat-error-properties compilation--compat-parse-errors compilation--ensure-parse compilation--file-struct->file-spec compilation--file-struct->formats compilation--file-struct->loc-tree compilation--flush-directory-cache compilation--flush-file-structure compilation--flush-parse compilation--loc->col compilation--loc->file-struct compilation--loc->line compilation--loc->marker compilation--loc->visited compilation--make-cdrloc compilation--make-file-struct compilation--make-message compilation--message->end-loc compilation--message->loc compilation--message->type compilation--message-p compilation--parse-region compilation--previous-directory compilation--put-prop compilation--remove-properties compilation--unsetup compilation-next-single-property-change compilation-parse-errors compilation-set-skip-threshold completing-read-default completion--cache-all-sorted-completions completion--capf-wrapper completion--common-suffix completion--cycle-threshold completion--done completion--field-metadata completion--message completion--metadata completion--sreverse completion--styles completion-basic--pattern completion-help-at-point completion-in-region--postch completion-in-region-mode completion-metadata completion-metadata-get completion-substring--all-completions completion-substring-all-completions completion-substring-try-completion completion-table-case-fold condition-case-unless-debug convert-pdf copy-ert--ewoc-entry copy-ert--stats copy-ert--test-execution-info copy-ert-test copy-ert-test-aborted-with-non-local-exit copy-ert-test-failed copy-ert-test-passed copy-ert-test-quit copy-ert-test-result copy-ert-test-result-with-condition copy-gdb-table copy-nnimap copy-soap-array-type copy-soap-basic-type copy-soap-binding copy-soap-bound-operation copy-soap-element copy-soap-message copy-soap-namespace copy-soap-namespace-link copy-soap-operation copy-soap-port copy-soap-port-type copy-soap-sequence-element copy-soap-sequence-type copy-soap-wsdl copy-url-future copy-url-queue copyright-find-copyright copyright-find-end copysign count-words count-words--message count-words-region cua--filter-buffer-noprops current-bidi-paragraph-direction custom--frame-color-default custom--initialize-widget-variables custom-available-themes custom-describe-theme custom-face-edit-value-create custom-face-edit-value-visibility-action custom-face-get-current-spec custom-face-state custom-face-widget-to-spec custom-fix-face-spec custom-theme--load-path custom-theme-add-face-1 custom-theme-add-var-1 custom-theme-checkbox-toggle custom-theme-choose-mode custom-theme-load-confirm custom-theme-name-valid-p custom-theme-revert custom-theme-save custom-theme-selections-toggle custom-theme-summary custom-toggle-hide-face custom-toggle-hide-variable custom-variable-state customize-push-and-save customize-themes cvs-add-branch-prefix cvs-add-secondary-branch-prefix cvs-addto-collection cvs-append-to-ignore cvs-buffer-check cvs-buffer-p cvs-change-cvsroot cvs-cleanup-collection cvs-cleanup-removed cvs-cmd-do cvs-commit-filelist cvs-commit-minor-wrap cvs-defaults cvs-diff-backup-extractor cvs-dir-member-p cvs-do-commit cvs-do-edit-log cvs-do-removal cvs-ediff-diff cvs-ediff-exit-hook cvs-ediff-merge cvs-ediff-startup-hook cvs-edit-log-filelist cvs-edit-log-minor-wrap cvs-edit-log-text-at-point cvs-emerge-diff cvs-emerge-merge cvs-enabledp cvs-execute-single-file cvs-execute-single-file-list cvs-find-modif cvs-get-cvsroot cvs-get-marked cvs-get-module cvs-header-msg cvs-help cvs-ignore-marks-p cvs-insert-file cvs-is-within-p cvs-make-cvs-buffer cvs-mark-buffer-changed cvs-mark-fis-dead cvs-menu cvs-minor-mode cvs-mode cvs-mode! cvs-mode-acknowledge cvs-mode-add cvs-mode-add-change-log-entry-other-window cvs-mode-byte-compile-files cvs-mode-checkout cvs-mode-commit cvs-mode-commit-setup cvs-mode-delete-lock cvs-mode-diff cvs-mode-diff-1 cvs-mode-diff-backup cvs-mode-diff-head cvs-mode-diff-map cvs-mode-diff-repository cvs-mode-diff-vendor cvs-mode-diff-yesterday cvs-mode-display-file cvs-mode-do cvs-mode-edit-log cvs-mode-examine cvs-mode-files cvs-mode-find-file cvs-mode-find-file-other-window cvs-mode-force-command cvs-mode-idiff cvs-mode-idiff-other cvs-mode-ignore cvs-mode-imerge cvs-mode-insert cvs-mode-kill-buffers cvs-mode-kill-process cvs-mode-log cvs-mode-map cvs-mode-mark cvs-mode-mark-all-files cvs-mode-mark-get-modif cvs-mode-mark-matching-files cvs-mode-mark-on-state cvs-mode-marked cvs-mode-next-line cvs-mode-previous-line cvs-mode-quit cvs-mode-remove cvs-mode-remove-handled cvs-mode-revert-buffer cvs-mode-revert-to-rev cvs-mode-run cvs-mode-set-flags cvs-mode-status cvs-mode-tag cvs-mode-toggle-mark cvs-mode-toggle-marks cvs-mode-tree cvs-mode-undo cvs-mode-unmark cvs-mode-unmark-all-files cvs-mode-unmark-up cvs-mode-untag cvs-mode-update cvs-mode-view-file cvs-mode-view-file-other-window cvs-mouse-toggle-mark cvs-move-to-goal-column cvs-parse-process cvs-query-directory cvs-reread-cvsrc cvs-retrieve-revision cvs-revert-if-needed cvs-run-process cvs-sentinel cvs-set-branch-prefix cvs-set-secondary-branch-prefix cvs-tags-list cvs-temp-buffer cvs-update-filter cvs-update-header cvs-vc-command-advice debbugs-gnu debug-arglist def-gdb-display-buffer def-gdb-frame-for-buffer def-gdb-memory-format def-gdb-memory-show-page def-gdb-memory-unit def-gdb-preempt-display-buffer def-gdb-set-positive-number def-gdb-thread-buffer-command def-gdb-thread-buffer-gud-command def-gdb-thread-buffer-simple-command def-gdb-trigger-and-handler define-package defun-cvs-mode delete-forward-char delete-other-windows-internal delete-window-internal denato-region describe-package describe-package-1 describe-theme describe-theme-1 desktop-append-buffer-args desktop-buffer desktop-buffer-info desktop-claim-lock desktop-create-buffer desktop-file-name desktop-full-file-name desktop-full-lock-name desktop-idle-create-buffers desktop-internal-v2s desktop-kill desktop-lazy-abort desktop-lazy-complete desktop-lazy-create-buffer desktop-list* desktop-load-file desktop-outvar desktop-owner desktop-release-lock desktop-restore-file-buffer desktop-save-buffer-p desktop-truncate desktop-value-to-string diary-fancy-date-matcher diary-fancy-date-pattern diary-hebrew-birthday diary-include-files diary-outlook-format-1 diff-file-local-copy diff-no-select dired-goto-file-1 dired-safe-switches-p dired-switches-escape-p dired-x-read-filename-at-point display-buffer--maybe-pop-up-frame-or-window display-buffer--maybe-same-window display-buffer--special-action display-buffer-assq-regexp display-buffer-pop-up-frame display-buffer-pop-up-window display-buffer-record-window display-buffer-reuse-window display-buffer-same-window display-buffer-use-some-window display-delayed-warnings display-table-print-array dnd-unescape-uri doc-file-to-info doc-file-to-man doc-view-fallback-mode doc-view-fit-height-to-window doc-view-fit-page-to-window doc-view-fit-width-to-window doc-view-mode-maybe doc-view-odf->pdf doc-view-set-doc-type dos-convert-standard-filename dos-intdos dos-make-register dos-mode25 dos-mode4350 dos-register-value dos-set-default-process-coding-system dos-set-register-value dynamic-setting-handle-config-changed-event edt-with-position eieio--defalias eieio--defgeneric-init-form eieio--defmethod electric--after-char-pos electric-indent-mode electric-indent-post-self-insert-function electric-layout-mode electric-layout-post-self-insert-function electric-pair-mode electric-pair-post-self-insert-function emacs-lock--can-auto-unlock emacs-lock--exit-locked-buffer emacs-lock--kill-buffer-query-functions emacs-lock--kill-emacs-hook emacs-lock--kill-emacs-query-functions emacs-lock--set-mode emacs-lock-live-process-p emacs-lock-mode emacs-lock-unload-function epa-file--find-file-not-found-function epg--status-INV_SGNR epg--status-NO_SECKEY epg--status-NO_SGNR epg-error-to-string epg-errors-to-string erc-autojoin-after-ident erc-autojoin-channels-delayed erc-button-next-function erc-complete-word-at-point erc-dcc-unquote-filename erc-pcompletions-at-point erc-server-671 erc-window-configuration-change ert ert--abbreviate-string ert--activate-font-lock-keywords ert--button-action-position ert--call-with-test-buffer ert--cl-do-remf ert--coerce-to-vector ert--ewoc-entry-expanded-p ert--ewoc-entry-extended-printer-limits-p ert--ewoc-entry-hidden-p ert--ewoc-entry-p ert--ewoc-entry-test ert--ewoc-position ert--expand-should ert--expand-should-1 ert--explain-equal ert--explain-equal-including-properties ert--explain-equal-rec ert--explain-format-atom ert--force-message-log-buffer-truncation ert--format-test-buffer-name ert--format-time-iso8601 ert--gensym ert--insert-human-readable-selector ert--insert-infos ert--intersection ert--make-stats ert--make-xrefs-region ert--mismatch ert--parse-keys-and-body ert--plist-difference-explanation ert--pp-with-indentation-and-newline ert--print-backtrace ert--print-test-for-ewoc ert--proper-list-p ert--record-backtrace ert--remove* ert--remove-from-list ert--remove-if-not ert--remprop ert--results-expand-collapse-button-action ert--results-font-lock-function ert--results-format-expected-unexpected ert--results-move ert--results-progress-bar-button-action ert--results-test-at-point-allow-redefinition ert--results-test-at-point-no-redefinition ert--results-test-node-at-point ert--results-test-node-or-null-at-point ert--results-update-after-test-redefinition ert--results-update-ewoc-hf ert--results-update-stats-display ert--results-update-stats-display-maybe ert--run-test-debugger ert--run-test-internal ert--set-difference ert--set-difference-eq ert--setup-results-buffer ert--should-error-handle-error ert--signal-should-execution ert--significant-plist-keys ert--special-operator-p ert--stats-aborted-p ert--stats-current-test ert--stats-end-time ert--stats-failed-expected ert--stats-failed-unexpected ert--stats-next-redisplay ert--stats-p ert--stats-passed-expected ert--stats-passed-unexpected ert--stats-selector ert--stats-set-test-and-result ert--stats-start-time ert--stats-test-end-times ert--stats-test-key ert--stats-test-map ert--stats-test-pos ert--stats-test-results ert--stats-test-start-times ert--stats-tests ert--string-first-line ert--string-position ert--subseq ert--test-buffer-button-action ert--test-execution-info-ert-debug-on-error ert--test-execution-info-exit-continuation ert--test-execution-info-next-debugger ert--test-execution-info-p ert--test-execution-info-result ert--test-execution-info-test ert--test-name-button-action ert--tests-running-mode-line-indicator ert--text-button ert--union ert--unload-function ert-buffer-string-reindented ert-call-with-buffer-renamed ert-char-for-test-result ert-deftest ert-delete-all-tests ert-delete-test ert-describe-test ert-equal-including-properties ert-face-for-stats ert-face-for-test-result ert-fail ert-filter-string ert-find-test-other-window ert-get-test ert-info ert-insert-test-name-button ert-kill-all-test-buffers ert-make-test-unbound ert-pass ert-propertized-string ert-read-test-name ert-read-test-name-at-point ert-results-describe-test-at-point ert-results-find-test-at-point-other-window ert-results-jump-between-summary-and-result ert-results-mode ert-results-mode-menu ert-results-next-test ert-results-pop-to-backtrace-for-test-at-point ert-results-pop-to-messages-for-test-at-point ert-results-pop-to-should-forms-for-test-at-point ert-results-pop-to-timings ert-results-previous-test ert-results-rerun-all-tests ert-results-rerun-test-at-point ert-results-rerun-test-at-point-debugging-errors ert-results-toggle-printer-limits-for-test-at-point ert-run-idle-timers ert-run-or-rerun-test ert-run-test ert-run-tests ert-run-tests-batch ert-run-tests-batch-and-exit ert-run-tests-interactively ert-running-test ert-select-tests ert-set-test ert-simple-view-mode ert-simulate-command ert-stats-completed ert-stats-completed-expected ert-stats-completed-unexpected ert-stats-total ert-string-for-test-result ert-test-aborted-with-non-local-exit-messages ert-test-aborted-with-non-local-exit-p ert-test-aborted-with-non-local-exit-should-forms ert-test-at-point ert-test-body ert-test-boundp ert-test-documentation ert-test-expected-result-type ert-test-failed-backtrace ert-test-failed-condition ert-test-failed-infos ert-test-failed-messages ert-test-failed-p ert-test-failed-should-forms ert-test-most-recent-result ert-test-name ert-test-p ert-test-passed-messages ert-test-passed-p ert-test-passed-should-forms ert-test-quit-backtrace ert-test-quit-condition ert-test-quit-infos ert-test-quit-messages ert-test-quit-p ert-test-quit-should-forms ert-test-result-expected-p ert-test-result-messages ert-test-result-p ert-test-result-should-forms ert-test-result-type-p ert-test-result-with-condition-backtrace ert-test-result-with-condition-condition ert-test-result-with-condition-infos ert-test-result-with-condition-messages ert-test-result-with-condition-p ert-test-result-with-condition-should-forms ert-test-tags ert-with-buffer-renamed ert-with-test-buffer eshell-kill-buffer-function eshell-kill-process-function eshell-quote-argument eval-sexp-add-defvars f90-looking-at-critical f90-looking-at-end-critical facemenu-post-self-insert-function facemenu-set-self-insert-face feedmail-buffer-to-smtp feedmail-message-action-help-blat feedmail-message-action-scroll-down feedmail-message-action-scroll-up feedmail-queue-runner-prompt feedmail-queue-send-edit-prompt-inner feedmail-say-chatter feedmail-say-debug feedmail-scroll-buffer feedmail-send-it-immediately-wrapper feedmail-spray-via-bbdb feedmail-vm-mail-mode file-equal-p file-in-directory-p file-selinux-context file-size-human-readable filesets-add-buffer filesets-alist-get filesets-browse-dir filesets-browser-name filesets-build-dir-submenu filesets-build-dir-submenu-now filesets-build-ingroup-submenu filesets-build-menu filesets-build-menu-maybe filesets-build-menu-now filesets-build-submenu filesets-close filesets-cmd-get-args filesets-cmd-get-def filesets-cmd-get-fn filesets-cmd-isearch-getargs filesets-cmd-query-replace-getargs filesets-cmd-query-replace-regexp-getargs filesets-cmd-shell-command filesets-cmd-shell-command-getargs filesets-cmd-show-result filesets-conditional-sort filesets-convert-path-list filesets-convert-patterns filesets-customize filesets-data-get filesets-data-get-data filesets-data-get-name filesets-data-set filesets-directory-files filesets-edit filesets-entry-get-dormant-flag filesets-entry-get-file filesets-entry-get-files filesets-entry-get-filter-dirs-flag filesets-entry-get-master filesets-entry-get-open-fn filesets-entry-get-pattern filesets-entry-get-pattern--dir filesets-entry-get-pattern--pattern filesets-entry-get-save-fn filesets-entry-get-tree filesets-entry-get-tree-max-level filesets-entry-get-verbosity filesets-entry-mode filesets-entry-set-files filesets-error filesets-eviewer-constraint-p filesets-eviewer-get-props filesets-exit filesets-file-close filesets-file-open filesets-files-equalp filesets-files-in-same-directory-p filesets-filetype-get-prop filesets-filetype-property filesets-filter-dir-names filesets-find-file filesets-find-file-using filesets-find-or-display-file filesets-get-cmd-menu filesets-get-external-viewer filesets-get-external-viewer-by-name filesets-get-filelist filesets-get-fileset-from-name filesets-get-fileset-name filesets-get-menu-epilog filesets-get-quoted-selection filesets-get-selection filesets-get-shortcut filesets-goto-homepage filesets-info filesets-ingroup-cache-get filesets-ingroup-cache-put filesets-ingroup-collect filesets-ingroup-collect-build-menu filesets-ingroup-collect-files filesets-ingroup-collect-finder filesets-ingroup-get-data filesets-ingroup-get-pattern filesets-ingroup-get-remdupl-p filesets-menu-cache-file-load filesets-menu-cache-file-save filesets-menu-cache-file-save-maybe filesets-open filesets-quote filesets-rebuild-this-submenu filesets-remake-shortcut filesets-remove-buffer filesets-remove-from-ubl filesets-reset-filename-on-change filesets-run-cmd filesets-run-cmd--repl-fn filesets-spawn-external-viewer filesets-update filesets-update-cleanup filesets-update-pre010505 filesets-which-file filesets-wrap-submenu fill-flowed-fill-buffer find-library--load-name finder-unknown-keywords font-get-glyphs font-lock-initial-fontify font-lock-specified-p fortran-make-syntax-propertize-function frame-pointer-visible-p frame-root-window-p frame-terminal-default-bg-mode frexp gdb--check-interpreter gdb-add-pending gdb-add-subscriber gdb-bind-function-to-buffer gdb-breakpoints-list-handler gdb-breakpoints-list-handler-custom gdb-buffer-shows-main-thread-p gdb-buffer-type gdb-car< gdb-changed-registers-handler gdb-check-target-async gdb-console gdb-continue-thread gdb-control-all-threads gdb-control-current-thread gdb-current-buffer-frame gdb-current-buffer-rules gdb-current-buffer-thread gdb-current-context-buffer-name gdb-current-context-command gdb-current-context-mode-name gdb-delchar-or-quit gdb-delete-pending gdb-delete-subscriber gdb-disassembly-buffer-name gdb-disassembly-handler gdb-disassembly-handler-custom gdb-disassembly-mode gdb-disassembly-place-breakpoints gdb-display-disassembly-buffer gdb-display-disassembly-for-thread gdb-display-io-buffer gdb-display-locals-for-thread gdb-display-registers-for-thread gdb-display-stack-for-thread gdb-done-or-error gdb-emit-signal gdb-frame-disassembly-buffer gdb-frame-disassembly-for-thread gdb-frame-io-buffer gdb-frame-locals-for-thread gdb-frame-location gdb-frame-registers-for-thread gdb-frame-stack-for-thread gdb-gdb gdb-get-main-selected-frame gdb-get-many-fields gdb-get-prompt gdb-get-source-file gdb-get-source-file-list gdb-get-subscribers gdb-gud-context-call gdb-gud-context-command gdb-ignored-notification gdb-inferior-filter gdb-inferior-io--init-proc gdb-inferior-io-sentinel gdb-input gdb-internals gdb-interrupt-thread gdb-invalidate-disassembly gdb-io-eof gdb-io-interrupt gdb-io-quit gdb-io-stop gdb-json-string gdb-line-posns gdb-locals-handler gdb-locals-handler-custom gdb-mapcar* gdb-mark-line gdb-memory-column-width gdb-memory-set-address-event gdb-memory-set-columns gdb-memory-set-rows gdb-memory-show-next-page gdb-memory-show-previous-page gdb-mi-quote gdb-non-stop-handler gdb-pad-string gdb-parent-mode gdb-pending-p gdb-place-breakpoints gdb-preempt-existing-or-display-buffer gdb-preemptively-display-disassembly-buffer gdb-preemptively-display-locals-buffer gdb-preemptively-display-registers-buffer gdb-preemptively-display-stack-buffer gdb-register-names-handler gdb-registers-handler gdb-registers-handler-custom gdb-rules-buffer-mode gdb-rules-update-trigger gdb-running gdb-select-frame gdb-select-thread gdb-setq-thread-number gdb-shell gdb-show-run-p gdb-show-stop-p gdb-stack-list-frames-custom gdb-stack-list-frames-handler gdb-step-thread gdb-table-add-row gdb-table-column-sizes gdb-table-p gdb-table-right-align gdb-table-row-properties gdb-table-rows gdb-table-string gdb-thread-created gdb-thread-exited gdb-thread-list-handler gdb-thread-list-handler-custom gdb-thread-selected gdb-toggle-switch-when-another-stopped gdb-update gdb-update-buffer-name gdb-update-gud-running gdb-wait-for-pending get-mru-window get-scroll-bar-mode get-unicode-property-internal gnus-agent-store-article gnus-alist-pull gnus-article-browse-html-save-cid-content gnus-article-copy-string gnus-article-date-combined-lapsed gnus-article-fill-cited-long-lines gnus-article-foldable-buffer gnus-article-html gnus-article-show-images gnus-article-sort-by-most-recent-date gnus-article-sort-by-most-recent-number gnus-article-stop-animations gnus-article-treat-date gnus-article-treat-non-ascii gnus-block-private-groups gnus-blocked-images gnus-bound-and-true-p gnus-delete-duplicate-headers gnus-delete-duplicates gnus-demon-idle-since gnus-demon-run-callback gnus-draft-clear-marks gnus-emacs-completing-read gnus-final-warning gnus-find-text-property-region gnus-finish-retrieve-group-infos gnus-flush-original-article-buffer gnus-gravatar-insert gnus-gravatar-transform-address gnus-grep-in-list gnus-group-default-list-level gnus-group-delete-articles gnus-group-expunge-group gnus-group-get-icon gnus-group-get-list-identifiers gnus-group-list-ticked gnus-group-refresh-group gnus-group-update-eval-form gnus-html-browse-image gnus-html-browse-url gnus-html-cache-expired gnus-html-display-image gnus-html-encode-url gnus-html-encode-url-chars gnus-html-get-image-data gnus-html-image-fetched gnus-html-image-url-blocked-p gnus-html-insert-image gnus-html-maximum-image-size gnus-html-pre-wash gnus-html-prefetch-images gnus-html-put-image gnus-html-schedule-image-fetching gnus-html-show-alt-text gnus-html-wash-images gnus-html-wash-tags gnus-ido-completing-read gnus-import-other-newsrc-file gnus-iswitchb-completing-read gnus-list-debbugs gnus-list-memq-of-list gnus-lrm-string-p gnus-macroexpand-all gnus-match-substitute-replacement gnus-method-denied-p gnus-method-ephemeral-p gnus-method-rank gnus-methods-sloppily-equal gnus-parameter-list-identifier gnus-process-get gnus-process-live-p gnus-process-plist gnus-process-put gnus-range-nconcat gnus-read-active-for-groups gnus-registry--split-fancy-with-parent-internal gnus-registry-action gnus-registry-article-marks-to-chars gnus-registry-article-marks-to-names gnus-registry-delete-entries gnus-registry-do-marks gnus-registry-extract-addresses gnus-registry-fetch-header-fast gnus-registry-fetch-message-id-fast gnus-registry-fetch-recipients-fast gnus-registry-fetch-sender-fast gnus-registry-fetch-simplified-message-subject-fast gnus-registry-find-keywords gnus-registry-fixup-registry gnus-registry-follow-group-p gnus-registry-get-article-marks gnus-registry-get-id-key gnus-registry-get-or-make-entry gnus-registry-handle-action gnus-registry-ignore-group-p gnus-registry-import-eld gnus-registry-insert gnus-registry-install-p gnus-registry-install-shortcuts gnus-registry-keywords gnus-registry-make-db gnus-registry-post-process-groups gnus-registry-read gnus-registry-read-mark gnus-registry-register-message-ids gnus-registry-remake-db gnus-registry-remove-article-mark gnus-registry-remove-ignored gnus-registry-save gnus-registry-set-article-mark gnus-registry-set-article-mark-internal gnus-registry-set-id-key gnus-registry-simplify-subject gnus-registry-sort-addresses gnus-registry-split-fancy-with-parent gnus-registry-spool-action gnus-registry-unload-hook gnus-registry-user-format-function-M gnus-registry-wash-for-keywords gnus-remove-if-not gnus-request-expunge-group gnus-request-marks gnus-request-thread gnus-request-update-group-status gnus-rescale-image gnus-retrieve-group-data-early gnus-run-hook-with-args gnus-same-method-different-name gnus-server-show-server gnus-set-info gnus-set-process-plist gnus-shr-put-image gnus-sloppily-equal-method-parameters gnus-splash-svg-color-symbols gnus-stop-downloads gnus-string-mark-left-to-right gnus-string-match-p gnus-summary--inv gnus-summary-bookmark-jump gnus-summary-bookmark-make-record gnus-summary-include-articles gnus-summary-push-marks-to-backend gnus-summary-reply-to-list-with-original gnus-summary-show-complete-article gnus-summary-widget-forward gnus-sync-initialize gnus-sync-install-hooks gnus-sync-read gnus-sync-save gnus-sync-unload-hook gnus-treat-from-gravatar gnus-treat-mail-gravatar gnus-url-button-menu gnus-warp-to-article gnus-window-inside-pixel-edges gnutls-available-p gnutls-boot gnutls-bye gnutls-deinit gnutls-error-fatalp gnutls-error-string gnutls-errorp gnutls-get-initstage gnutls-message-maybe gnutls-negotiate gravatar-build-url gravatar-cache-expired gravatar-create-image gravatar-data->image gravatar-get-data gravatar-hash gravatar-retrieve gravatar-retrieve-synchronously gravatar-retrieved grep-filter gud-gdb-completion-at-point gud-gdb-completions gud-gdb-completions-1 gud-gdbmi-completions gud-gdbmi-fetch-lines-filter gud-gdbmi-marker-filter hack-dir-local-variables-non-file-buffer hack-local-variables-apply hebrew-font-get-precomposed hebrew-shape-gstring help-form-show help-mode-revert-buffer hexl-mode--minor-mode-p hexl-mode--setq-local hexl-revert-buffer-function hfy-begin-span hfy-end-span hfy-face-to-css-default hs-looking-at-block-start-p htmlfontify-string icalendar--get-weekday-numbers ido-active ido-add-virtual-buffers-to-list ido-all-completions ido-buffer-internal ido-buffer-window-other-frame ido-cache-ftp-valid ido-cache-unc-valid ido-choose-completion-string ido-chop ido-common-initialization ido-complete ido-complete-space ido-completion-help ido-completions ido-copy-current-file-name ido-copy-current-word ido-delete-backward-updir ido-delete-backward-word-updir ido-delete-file-at-head ido-directory-too-big-p ido-edit-input ido-enter-dired ido-enter-find-file ido-enter-insert-buffer ido-enter-insert-file ido-enter-switch-buffer ido-everywhere ido-exhibit ido-existing-item-p ido-exit-minibuffer ido-expand-directory ido-fallback-command ido-file-extension-aux ido-file-extension-lessp ido-file-extension-order ido-file-internal ido-file-lessp ido-file-name-all-completions ido-file-name-all-completions-1 ido-final-slash ido-find-common-substring ido-flatten-merged-list ido-forget-work-directory ido-get-buffers-in-frames ido-get-bufname ido-get-work-directory ido-get-work-file ido-ignore-item-p ido-init-completion-maps ido-initiate-auto-merge ido-is-ftp-directory ido-is-root-directory ido-is-slow-ftp-host ido-is-tramp-root ido-is-unc-host ido-is-unc-root ido-kill-buffer-at-head ido-kill-emacs-hook ido-list-directory ido-load-history ido-local-file-exists-p ido-magic-backward-char ido-magic-delete-char ido-magic-forward-char ido-make-buffer-list ido-make-buffer-list-1 ido-make-choice-list ido-make-dir-list ido-make-dir-list-1 ido-make-directory ido-make-file-list ido-make-file-list-1 ido-make-merged-file-list ido-make-merged-file-list-1 ido-make-prompt ido-makealist ido-may-cache-directory ido-merge-work-directories ido-minibuffer-setup ido-name ido-next-match ido-next-match-dir ido-next-work-directory ido-next-work-file ido-no-final-slash ido-nonreadable-directory-p ido-pop-dir ido-pp ido-prev-match ido-prev-match-dir ido-prev-work-directory ido-prev-work-file ido-push-dir ido-push-dir-first ido-read-internal ido-record-command ido-record-work-directory ido-record-work-file ido-remove-cached-dir ido-reread-directory ido-restrict-to-matches ido-save-history ido-select-text ido-set-common-completion ido-set-current-directory ido-set-current-home ido-set-matches ido-set-matches-1 ido-setup-completion-map ido-sort-merged-list ido-summary-buffers-to-end ido-take-first-match ido-tidy ido-time-stamp ido-to-end ido-toggle-case ido-toggle-ignore ido-toggle-literal ido-toggle-prefix ido-toggle-regexp ido-toggle-trace ido-toggle-vc ido-toggle-virtual-buffers ido-trace ido-unc-hosts ido-unc-hosts-net-view ido-undo-merge-work-directory ido-unload-function ido-up-directory ido-visit-buffer ido-wash-history ido-wide-find-dir ido-wide-find-dir-or-delete-dir ido-wide-find-dirs-or-files ido-wide-find-file ido-wide-find-file-or-pop-dir ido-word-matching-substring iimage-modification-hook image-after-revert-hook image-animate image-animate-timeout image-animate-timer image-animated-p image-dired--with-db-file image-dired-add-to-file-comment-list image-dired-add-to-tag-file-list image-dired-add-to-tag-file-lists image-dired-associated-dired-buffer image-dired-associated-dired-buffer-window image-dired-backward-image image-dired-comment-thumbnail image-dired-copy-with-exif-file-name image-dired-create-display-image-buffer image-dired-create-gallery-lists image-dired-create-thumb image-dired-create-thumbnail-buffer image-dired-create-thumbs image-dired-define-display-image-mode-keymap image-dired-define-thumbnail-mode-keymap image-dired-delete-char image-dired-dir image-dired-dired-after-readin-hook image-dired-dired-display-properties image-dired-dired-file-marked-p image-dired-dired-next-line image-dired-dired-previous-line image-dired-dired-toggle-marked-thumbs image-dired-display-current-image-full image-dired-display-current-image-sized image-dired-display-image image-dired-display-image-mode image-dired-display-next-thumbnail-original image-dired-display-previous-thumbnail-original image-dired-display-thumb-properties image-dired-display-thumbnail-original-image image-dired-display-window image-dired-display-window-height image-dired-display-window-width image-dired-flag-thumb-original-file image-dired-format-properties-string image-dired-forward-image image-dired-gallery-generate image-dired-get-buffer-window image-dired-get-comment image-dired-get-exif-data image-dired-get-exif-file-name image-dired-get-thumbnail-image image-dired-hidden-p image-dired-image-at-point-p image-dired-insert-image image-dired-insert-thumbnail image-dired-jump-original-dired-buffer image-dired-kill-buffer-and-window image-dired-line-up image-dired-line-up-dynamic image-dired-line-up-interactive image-dired-list-tags image-dired-mark-and-display-next image-dired-mark-thumb-original-file image-dired-modify-mark-on-thumb-original-file image-dired-mouse-display-image image-dired-mouse-select-thumbnail image-dired-mouse-toggle-mark image-dired-next-line image-dired-next-line-and-display image-dired-original-file-name image-dired-previous-line image-dired-previous-line-and-display image-dired-read-comment image-dired-refresh-thumb image-dired-remove-tag image-dired-restore-window-configuration image-dired-rotate-original image-dired-rotate-original-left image-dired-rotate-original-right image-dired-rotate-thumbnail image-dired-rotate-thumbnail-left image-dired-rotate-thumbnail-right image-dired-sane-db-file image-dired-save-information-from-widgets image-dired-set-exif-data image-dired-slideshow-start image-dired-slideshow-step image-dired-slideshow-stop image-dired-tag-thumbnail image-dired-tag-thumbnail-remove image-dired-thumb-name image-dired-thumbnail-display-external image-dired-thumbnail-mode image-dired-thumbnail-set-image-description image-dired-thumbnail-window image-dired-toggle-append-browsing image-dired-toggle-dired-display-properties image-dired-toggle-mark-thumb-original-file image-dired-toggle-movement-tracking image-dired-track-original-file image-dired-track-thumbnail image-dired-unmark-thumb-original-file image-dired-update-property image-dired-window-height-pixels image-dired-window-width-pixels image-dired-write-comments image-dired-write-tags image-refresh image-toggle-animation image-transform-fit-to-height image-transform-fit-to-width image-transform-properties image-transform-set-rotation image-transform-set-scale imagemagick-register-types imap-log inferior-octave-completion-at-point info-display-manual info-lookup-completions-at-point info-setup info-xref-check-node info-xref-docstrings info-xref-lock-file-p info-xref-output-error info-xref-with-file info-xref-with-output inhibit-local-variables-p internal-temp-output-buffer-show isearch-fail-pos isearch-yank-pop isnan js-syntax-propertize js-syntax-propertize-regexp keymap--menu-item-binding keymap--menu-item-with-binding keymap--merge-bindings landmark-amble-robot landmark-beginning-of-line landmark-blackbox landmark-calc-confidences landmark-calc-current-smells landmark-calc-payoff landmark-check-filled-qtuple landmark-click landmark-confidence-for landmark-crash-game landmark-cross-qtuple landmark-display-statistics landmark-emacs-plays landmark-end-of-line landmark-f landmark-find-filled-qtuple landmark-fix-weights-for landmark-flip-a-coin landmark-goto-square landmark-goto-xy landmark-human-plays landmark-human-resigns landmark-human-takes-back landmark-index-to-x landmark-index-to-y landmark-init landmark-init-board landmark-init-display landmark-init-score-table landmark-init-square-score landmark-max-height landmark-max-width landmark-mode landmark-mouse-play landmark-move landmark-move-down landmark-move-ne landmark-move-nw landmark-move-se landmark-move-sw landmark-move-up landmark-nb-qtuples landmark-noise landmark-nslify-wts landmark-nslify-wts-int landmark-offer-a-draw landmark-play-move landmark-plot-internal landmark-plot-landmarks landmark-plot-square landmark-point-square landmark-point-y landmark-print-distance landmark-print-distance-int landmark-print-moves landmark-print-smell landmark-print-smell-int landmark-print-w0 landmark-print-w0-int landmark-print-wts landmark-print-wts-blackbox landmark-print-wts-int landmark-print-y-s-noise landmark-print-y-s-noise-int landmark-prompt-for-move landmark-prompt-for-other-game landmark-random-move landmark-randomize-weights-for landmark-set-landmark-signal-strengths landmark-start-game landmark-start-robot landmark-store-old-y_t landmark-strongest-square landmark-switch-to-window landmark-take-back landmark-terminate-game landmark-test-run landmark-update-naught-weights landmark-update-normal-weights landmark-update-score-in-direction landmark-update-score-table landmark-weights-debug landmark-xy-to-index landmark-y latex-electric-env-pair-mode latex-env-before-change ldexp left-char left-word letrec libxml-parse-html-region libxml-parse-xml-region lilypond-mode lisp-indent-lambda-list list-colors-sort-key list-dynamic-libraries list-dynamic-libraries--refresh list-packages list-processes--refresh load-path-shadows-mode load-save-place-alist-from-file log-edit-add-field log-edit-empty-buffer-p log-view-current-entry log-view-inside-comment-p log-view-toggle-entry-display ls-lisp-sanitize ls-lisp-set-options ly-attempt-to-open-pdf ly-attempt-to-play-midi ly-check-for-compile-error ly-compile-lilyfile ly-determine-ly-path ly-determine-midi-path ly-determine-pdf-path ly-execute-tangled-ly ly-get-header-args ly-mark-error-line ly-parse-error-line ly-parse-line-num ly-process-basic ly-process-compile-error ly-set-header-args ly-switch-extension ly-tangle ly-toggle-arrange-mode ly-toggle-html-generation ly-toggle-midi-play ly-toggle-pdf-display ly-toggle-png-generation m2-mode m2-smie-backward-token m2-smie-forward-token m2-smie-refine-colon m2-smie-refine-of m2-smie-refine-semi m2-smie-rules mail-add-attachment mail-completion-at-point-function mail-completion-expand mail-dont-reply-to mail-insert-file mairix-replace-invalid-chars make-composed-keymap make-ert--ewoc-entry make-ert--stats make-ert--test-execution-info make-ert-test make-ert-test-aborted-with-non-local-exit make-ert-test-failed make-ert-test-passed make-ert-test-quit make-ert-test-result make-ert-test-result-with-condition make-gdb-table make-nnimap make-soap-array-type make-soap-basic-type make-soap-binding make-soap-bound-operation make-soap-element make-soap-message make-soap-namespace make-soap-namespace-link make-soap-operation make-soap-port make-soap-port-type make-soap-sequence-element make-soap-sequence-type make-soap-wsdl make-url-future make-url-queue makefile-completions-at-point math-conditional-apply math-conditional-pow math-extract-logunits math-freq-to-midi math-freq-to-spn math-freqp math-logunits-add math-logunits-divide math-logunits-level math-logunits-mul math-logunits-quant math-lud-pivot-check math-midi-round math-midi-to-freq math-midi-to-spn math-midip math-spn-to-freq math-spn-to-midi math-spnp math-vector-avg maximize-window menu-bar-set-tool-bar-position menu-bar-showhide-tool-bar-menu-customize-disable menu-bar-showhide-tool-bar-menu-customize-enable-bottom menu-bar-showhide-tool-bar-menu-customize-enable-left menu-bar-showhide-tool-bar-menu-customize-enable-right menu-bar-showhide-tool-bar-menu-customize-enable-top mercury-mode message--yank-original-internal message-completion-function message-default-send-mail-function message-default-send-rename-function message-prune-recipients meta-common-mode meta-completions-at-point mh-decode-message-subject mh-letter-completion-at-point mh-test-completion mh-window-full-height-p minibuffer-inactive-mode minimize-window mm-display-javascript-inline mm-display-org-inline mm-display-shell-script-inline mm-handle-filename mm-shr mm-url-encode-multipart-form-data mm-uu-org-src-code-block-extract mml1991-epg-find-usable-key mml1991-epg-find-usable-secret-key mml2015-epg-find-usable-secret-key mouse--drag-set-mark-and-point mouse--remap-link-click-p mouse--strip-first-event mouse-drag-line mpc-cmd-flush mpc-cmd-special-tag-p mpc-constraints-tag-lookup mpc-proc-check mpc-tagbrowser-tag-name nato-region netrc-credentials netrc-store-data network-stream-certificate network-stream-command network-stream-get-response network-stream-open-plain network-stream-open-shell network-stream-open-starttls network-stream-open-tls newsticker--process-auto-mark-filter-match nnagent-request-marks nnagent-retrieve-group-data-early nndoc-decode-content-transfer-encoding nndoc-git-type-p nndoc-google-type-p nndoc-retrieve-groups nndoc-transform-git-article nndoc-transform-git-headers nndraft-update-unread-articles nnfolder-request-marks nnfolder-save-all-buffers nnheader-get-report-string nnheader-insert-buffer-substring nnheader-message-maybe nnheader-update-marks-actions nnimap-add-cr nnimap-article-ranges nnimap-buffer nnimap-capabilities nnimap-capability nnimap-command nnimap-commands nnimap-convert-partial-article nnimap-credentials nnimap-decode-gnus-group nnimap-delete-article nnimap-dummy-active-number nnimap-examined nnimap-fetch-inbox nnimap-find-article-by-message-id nnimap-find-connection nnimap-find-expired-articles nnimap-find-parameter nnimap-find-process-buffer nnimap-find-response-element nnimap-find-uid-response nnimap-find-wanted-parts nnimap-find-wanted-parts-1 nnimap-finish-retrieve-group-infos nnimap-flags-to-marks nnimap-get-flags nnimap-get-groups nnimap-get-length nnimap-get-partial-article nnimap-get-response nnimap-get-responses nnimap-get-whole-article nnimap-greeting nnimap-group nnimap-header-parameters nnimap-imap-ranges-to-gnus-ranges nnimap-initial-resync nnimap-insert-partial-structure nnimap-keepalive nnimap-last-command-time nnimap-last-response-string nnimap-log-command nnimap-login nnimap-make-process-buffer nnimap-make-split-specs nnimap-make-thread-query nnimap-map-port nnimap-mark-and-expunge-incoming nnimap-marks-to-flags nnimap-new-articles nnimap-newlinep nnimap-ok-p nnimap-open-connection-1 nnimap-p nnimap-parse-copied-articles nnimap-parse-flags nnimap-parse-line nnimap-parse-response nnimap-process nnimap-process-expiry-targets nnimap-process-quirk nnimap-quirk nnimap-quote-specials nnimap-request-expunge-group nnimap-request-replace-article nnimap-request-thread nnimap-request-update-group-status nnimap-retrieve-group-data-early nnimap-save-mail-spec nnimap-select-result nnimap-send-command nnimap-server nnimap-split-incoming-mail nnimap-store-info nnimap-stream-type nnimap-transform-headers nnimap-transform-split-mail nnimap-unfold-quoted-lines nnimap-unselect-group nnimap-update-info nnimap-update-infos nnimap-update-qresync-info nnimap-ver4-p nnimap-wait-for-connection nnimap-wait-for-line nnimap-wait-for-response nnir-article-group nnir-article-ids nnir-article-number nnir-article-rsv nnir-categorize nnir-get-active nnir-mode nnir-registry-action nnir-request-expire-articles nnir-request-move-article nnir-run-gmane nnir-run-notmuch nnir-search-thread nnir-warp-to-article nnmaildir-request-marks nnmairix-request-marks nnml-add-incremental-nov nnml-open-incremental-nov nnml-request-marks nnml-save-incremental-nov nnregistry-close-server nnregistry-open-server nnregistry-request-article nnregistry-server-opened nnregistry-status-message nnrss-retrieve-groups nntp-finish-retrieve-group-infos nntp-request-marks nntp-retrieve-group-data-early notifications-close-notification notifications-notify notifications-on-action-signal notifications-on-closed-signal nroff-view nxml-completion-at-point-function nxml-parent-document-set ob-calc-maybe-resolve-var ob-fortran-transform-list occur-after-change-function occur-cease-edit occur-edit-mode occur-engine-line octave-completion-at-point-function octave-mode-menu octave-smie-backward-token octave-smie-forward-token octave-smie-rules octave-syntax-propertize-function octave-syntax-propertize-sqs open-gnutls-stream open-gssapi-stream open-protocol-stream org-activate-mark org-agenda-append-agenda org-agenda-bulk-mark-regexp org-agenda-check-clock-gap org-agenda-clock-goto org-agenda-compute-starting-span org-agenda-do-tree-to-indirect-buffer org-agenda-file-p org-agenda-filter-by-category org-agenda-filter-hide-line org-agenda-filter-show-all-cat org-agenda-filter-show-all-tag org-agenda-format-item org-agenda-get-category-icon org-agenda-get-day-face org-agenda-get-represented-tags org-agenda-reset-view org-agenda-run-series org-agenda-show-clocking-issues org-agenda-skip-eval org-agenda-skip-if-todo org-agenda-span-name org-agenda-span-to-ndays org-agenda-time-of-day-to-ampm org-agenda-time-of-day-to-ampm-maybe org-agenda-todo-custom-ignore-p org-agenda-todo-yesterday org-agenda-toggle-deadlines org-agenda-with-point-at-orig-entry org-agenda-write org-align-all-tags org-anniversary org-apply-on-list org-ascii-replace-entities org-at-clock-log-p org-at-drawer-p org-at-item-counter-p org-at-item-description-p org-at-item-timer-p org-at-target-p org-attach-store-link org-auto-fill-function org-babel-C-ensure-main-wrap org-babel-C-execute org-babel-C-expand org-babel-C-var-to-C org-babel-R-assign-elisp org-babel-R-associate-session org-babel-R-construct-graphics-device-call org-babel-R-evaluate org-babel-R-evaluate-external-process org-babel-R-evaluate-session org-babel-R-graphical-output-file org-babel-R-initiate-session org-babel-R-process-value-result org-babel-R-quote-tsv-field org-babel-asymptote-define-type org-babel-asymptote-var-to-asymptote org-babel-awk-table-or-string org-babel-awk-var-to-awk org-babel-balanced-split org-babel-check-src-block org-babel-chomp org-babel-clean-text-properties org-babel-comint-buffer-livep org-babel-comint-eval-invisibly-and-wait-for-file org-babel-comint-in-buffer org-babel-comint-input-command org-babel-comint-wait-for-output org-babel-comint-with-output org-babel-confirm-evaluate org-babel-current-result-hash org-babel-del-hlines org-babel-demarcate-block org-babel-describe-bindings org-babel-detangle org-babel-disassemble-tables org-babel-do-in-edit-buffer org-babel-do-key-sequence-in-edit-buffer org-babel-do-load-languages org-babel-edit-distance org-babel-edit-prep:R org-babel-eval org-babel-eval-error-notify org-babel-eval-read-file org-babel-eval-wipe-error-buffer org-babel-examplize-region org-babel-execute-buffer org-babel-execute-maybe org-babel-execute-safely-maybe org-babel-execute-src-block org-babel-execute-src-block-maybe org-babel-execute-subtree org-babel-execute:C org-babel-execute:C++ org-babel-execute:R org-babel-execute:asymptote org-babel-execute:awk org-babel-execute:calc org-babel-execute:clojure org-babel-execute:cpp org-babel-execute:css org-babel-execute:ditaa org-babel-execute:dot org-babel-execute:emacs-lisp org-babel-execute:fortran org-babel-execute:gnuplot org-babel-execute:haskell org-babel-execute:java org-babel-execute:js org-babel-execute:latex org-babel-execute:ledger org-babel-execute:lilypond org-babel-execute:lisp org-babel-execute:matlab org-babel-execute:maxima org-babel-execute:mscgen org-babel-execute:ocaml org-babel-execute:octave org-babel-execute:org org-babel-execute:perl org-babel-execute:picolisp org-babel-execute:plantuml org-babel-execute:python org-babel-execute:ruby org-babel-execute:sass org-babel-execute:scheme org-babel-execute:screen org-babel-execute:sh org-babel-execute:shen org-babel-execute:sql org-babel-execute:sqlite org-babel-exp-code org-babel-exp-do-export org-babel-exp-in-export-file org-babel-exp-non-block-elements org-babel-exp-results org-babel-exp-src-block org-babel-expand-body:C++ org-babel-expand-body:R org-babel-expand-body:awk org-babel-expand-body:c org-babel-expand-body:calc org-babel-expand-body:clojure org-babel-expand-body:dot org-babel-expand-body:emacs-lisp org-babel-expand-body:fortran org-babel-expand-body:generic org-babel-expand-body:gnuplot org-babel-expand-body:latex org-babel-expand-body:lilypond org-babel-expand-body:lisp org-babel-expand-body:org org-babel-expand-body:picolisp org-babel-expand-body:scheme org-babel-expand-body:shen org-babel-expand-body:sql org-babel-expand-body:sqlite org-babel-expand-noweb-references org-babel-expand-src-block org-babel-expand-src-block-maybe org-babel-find-file-noselect-refresh org-babel-find-named-block org-babel-find-named-result org-babel-format-result org-babel-fortran-ensure-main-wrap org-babel-fortran-var-to-fortran org-babel-get-colnames org-babel-get-header org-babel-get-inline-src-block-matches org-babel-get-lob-one-liner-matches org-babel-get-rownames org-babel-get-src-block-info org-babel-gnuplot-initiate-session org-babel-gnuplot-process-vars org-babel-gnuplot-quote-timestamp-field org-babel-gnuplot-quote-tsv-field org-babel-gnuplot-table-to-data org-babel-goto-named-result org-babel-goto-named-src-block org-babel-goto-src-block-head org-babel-hash-at-point org-babel-haskell-export-to-lhs org-babel-haskell-initiate-session org-babel-haskell-read-string org-babel-haskell-table-or-string org-babel-haskell-var-to-haskell org-babel-hide-all-hashes org-babel-hide-hash org-babel-hide-result-toggle org-babel-hide-result-toggle-maybe org-babel-import-elisp-from-file org-babel-in-example-or-verbatim org-babel-initiate-session org-babel-insert-header-arg org-babel-insert-result org-babel-join-splits-near-ch org-babel-js-initiate-session org-babel-js-read org-babel-js-var-to-js org-babel-latex-tex-to-pdf org-babel-lisp-vector-to-list org-babel-load-file org-babel-load-in-session org-babel-load-in-session-maybe org-babel-load-session:C org-babel-load-session:R org-babel-load-session:fortran org-babel-load-session:gnuplot org-babel-load-session:haskell org-babel-load-session:python org-babel-load-session:ruby org-babel-load-session:sh org-babel-lob-execute org-babel-lob-execute-maybe org-babel-lob-get-info org-babel-lob-ingest org-babel-local-file-name org-babel-map-call-lines org-babel-map-executables org-babel-map-inline-src-blocks org-babel-map-src-blocks org-babel-mark-block org-babel-matlab-initiate-session org-babel-maxima-elisp-to-maxima org-babel-maxima-expand org-babel-maxima-graphical-output-file org-babel-maxima-var-to-maxima org-babel-merge-params org-babel-named-data-regexp-for-name org-babel-named-src-block-regexp-for-name org-babel-next-src-block org-babel-number-p org-babel-ocaml-elisp-to-ocaml org-babel-ocaml-parse-output org-babel-ocaml-read-array org-babel-ocaml-read-list org-babel-octave-evaluate org-babel-octave-evaluate-external-process org-babel-octave-evaluate-session org-babel-octave-graphical-output-file org-babel-octave-import-elisp-from-file org-babel-octave-initiate-session org-babel-octave-read-string org-babel-octave-var-to-octave org-babel-open-src-block-result org-babel-params-from-properties org-babel-parse-header-arguments org-babel-parse-inline-src-block-match org-babel-parse-multiple-vars org-babel-parse-src-block-match org-babel-perl-evaluate org-babel-perl-initiate-session org-babel-perl-var-to-perl org-babel-pick-name org-babel-picolisp-initiate-session org-babel-pop-to-session org-babel-pop-to-session-maybe org-babel-prep-session:C org-babel-prep-session:R org-babel-prep-session:asymptote org-babel-prep-session:css org-babel-prep-session:ditaa org-babel-prep-session:dot org-babel-prep-session:fortran org-babel-prep-session:gnuplot org-babel-prep-session:haskell org-babel-prep-session:js org-babel-prep-session:latex org-babel-prep-session:ledger org-babel-prep-session:lilypond org-babel-prep-session:matlab org-babel-prep-session:maxima org-babel-prep-session:mscgen org-babel-prep-session:ocaml org-babel-prep-session:octave org-babel-prep-session:org org-babel-prep-session:perl org-babel-prep-session:plantuml org-babel-prep-session:python org-babel-prep-session:ruby org-babel-prep-session:sass org-babel-prep-session:scheme org-babel-prep-session:screen org-babel-prep-session:sh org-babel-prep-session:sql org-babel-prep-session:sqlite org-babel-previous-src-block org-babel-process-file-name org-babel-process-params org-babel-put-colnames org-babel-put-rownames org-babel-python-evaluate org-babel-python-evaluate-external-process org-babel-python-evaluate-session org-babel-python-initiate-session org-babel-python-initiate-session-by-key org-babel-python-read-string org-babel-python-session-buffer org-babel-python-table-or-string org-babel-python-var-to-python org-babel-read org-babel-read-link org-babel-read-list org-babel-read-result org-babel-read-table org-babel-reassemble-table org-babel-ref-at-ref-p org-babel-ref-goto-headline-id org-babel-ref-headline-body org-babel-ref-index-list org-babel-ref-parse org-babel-ref-resolve org-babel-ref-split-args org-babel-remove-result org-babel-remove-temporary-directory org-babel-result-end org-babel-result-hide-all org-babel-result-hide-spec org-babel-result-names org-babel-result-to-file org-babel-reverse-string org-babel-ruby-evaluate org-babel-ruby-initiate-session org-babel-ruby-read-string org-babel-ruby-table-or-string org-babel-ruby-var-to-ruby org-babel-scheme-initiate-session org-babel-screen-session-execute-string org-babel-screen-session-socketname org-babel-screen-session-write-temp-file org-babel-screen-test org-babel-script-escape org-babel-sh-evaluate org-babel-sh-initiate-session org-babel-sh-strip-weird-long-prompt org-babel-sh-table-or-results org-babel-sh-var-to-sh org-babel-sh-var-to-string org-babel-sha1-hash org-babel-shell-command-on-region org-babel-shen-var-to-shen org-babel-show-result-all org-babel-spec-to-string org-babel-speed-command-hook org-babel-sql-expand-vars org-babel-sqlite-expand-vars org-babel-sqlite-offset-colnames org-babel-sqlite-table-or-scalar org-babel-src-block-names org-babel-string-read org-babel-strip-protective-commas org-babel-switch-to-session org-babel-switch-to-session-with-code org-babel-table-truncate-at-newline org-babel-tangle org-babel-tangle-clean org-babel-tangle-collect-blocks org-babel-tangle-comment-links org-babel-tangle-file org-babel-tangle-jump-to-org org-babel-tangle-publish org-babel-temp-file org-babel-tramp-handle-call-process-region org-babel-trim org-babel-update-block-body org-babel-variable-assignments:R org-babel-variable-assignments:asymptote org-babel-variable-assignments:gnuplot org-babel-variable-assignments:haskell org-babel-variable-assignments:js org-babel-variable-assignments:matlab org-babel-variable-assignments:ocaml org-babel-variable-assignments:octave org-babel-variable-assignments:perl org-babel-variable-assignments:python org-babel-variable-assignments:ruby org-babel-variable-assignments:sh org-babel-view-src-block-info org-babel-where-is-src-block-head org-babel-where-is-src-block-result org-babel-with-temp-filebuffer org-bbdb-open-new org-bbdb-open-old org-beamer-after-initial-vars org-beamer-allowed-property-values org-beamer-amend-header org-beamer-assoc-not-empty org-beamer-auto-fragile-frames org-beamer-cleanup-column-width org-beamer-close-column-maybe org-beamer-close-columns-maybe org-beamer-fix-toc org-beamer-get-special org-beamer-initialize-open-trackers org-beamer-mode org-beamer-open-column org-beamer-open-columns-maybe org-beamer-place-default-actions-for-lists org-beamer-property-changed org-beamer-sectioning org-beamer-select-beamer-code org-beamer-select-environment org-beginning-of-defun org-between-regexps-p org-bibtex org-bibtex-ask org-bibtex-autokey org-bibtex-check org-bibtex-check-all org-bibtex-create org-bibtex-create-in-current-entry org-bibtex-export-to-kill-ring org-bibtex-fleshout org-bibtex-get org-bibtex-headline org-bibtex-put org-bibtex-read org-bibtex-search org-bibtex-write org-bibtex-yank org-block org-called-interactively-p org-capture org-capture-bookmark-last-stored-position org-capture-empty-lines-after org-capture-empty-lines-before org-capture-escaped-% org-capture-expand-file org-capture-fill-template org-capture-finalize org-capture-get org-capture-get-indirect-buffer org-capture-get-template org-capture-goto-last-stored org-capture-goto-target org-capture-import-remember-templates org-capture-insert-template-here org-capture-kill org-capture-mark-kill-region org-capture-member org-capture-mode org-capture-narrow org-capture-place-entry org-capture-place-item org-capture-place-plain-text org-capture-place-table-line org-capture-place-template org-capture-position-for-last-stored org-capture-put org-capture-put-target-region-and-position org-capture-refile org-capture-select-template org-capture-set-plist org-capture-set-target-location org-capture-steal-local-variables org-capture-target-buffer org-capture-verify-tree org-char-to-string org-check-before-invisible-edit org-check-dates-range org-check-for-hidden org-class org-clock-delete-current org-clock-get-table-data org-clock-into-drawer org-clock-jump-to-current-clock org-clock-remove-empty-clock-drawer org-clock-set-current org-clock-timestamps-change org-clock-timestamps-down org-clock-timestamps-up org-clocking-buffer org-clocking-p org-clocktable-indent-string org-clocktable-write-default org-clone-local-variables org-cmp-alpha org-command-at-point org-copy-visible org-count org-count-quarter org-create-math-formula org-crypt-check-auto-save org-ctags-all-tags-in-current-tags-table org-ctags-append-topic org-ctags-ask-append-topic org-ctags-ask-rebuild-tags-file-then-find-tag org-ctags-ask-visit-buffer-or-file org-ctags-create-tags org-ctags-enable org-ctags-fail-silently org-ctags-find-tag org-ctags-find-tag-at-point org-ctags-find-tag-interactive org-ctags-get-filename-for-tag org-ctags-open-file org-ctags-rebuild-tags-file-then-find-tag org-ctags-string-search-and-replace org-ctags-visit-buffer-or-file org-current-effective-time org-cyclic org-date org-day-of-week org-decompose-region org-diary-class org-display-inline-images org-display-inline-modification-hook org-do-lparse org-docview-complete-link org-docview-open org-docview-store-link org-duration-string-to-minutes org-em org-encrypt-string org-end-of-defun org-end-of-meta-data-and-drawers org-entities-create-table org-entities-help org-entity-get org-entity-get-representation org-entity-latex-math-p org-entry-blocked-p org-eshell-open org-eshell-store-link org-estimate-combine org-estimate-mean-and-var org-estimate-print org-eval org-eval-in-environment org-export-as-encoding org-export-as-latin1 org-export-as-latin1-to-buffer org-export-as-odf org-export-as-odf-and-open org-export-as-odt org-export-as-odt-and-open org-export-as-odt-batch org-export-as-taskjuggler org-export-as-taskjuggler-and-open org-export-as-utf8 org-export-as-utf8-to-buffer org-export-convert-protected-spaces org-export-docbook-list-line org-export-handle-include-files-recurse org-export-handle-table-metalines org-export-html-mathjax-config org-export-latex-convert-table\.el-table org-export-latex-fix-inputenc org-export-latex-format-toc-default org-export-latex-get-error org-export-mark-list-end org-export-mark-list-properties org-export-odt-convert org-export-odt-do-preprocess-latex-fragments org-export-odt-format-formula org-export-odt-format-image org-export-odt-preprocess org-export-odt-preprocess-label-references org-export-odt-preprocess-latex-fragments org-export-remember-html-container-classes org-export-remove-tasks org-export-res/src-name-cleanup org-export-string org-face-from-face-or-color org-file-apps-entry-match-against-dlink-p org-fill-item-nobreak-p org-find-exact-heading-in-directory org-find-exact-headline-in-buffer org-float org-floor* org-fontify-entities org-fontify-meta-lines-and-blocks-1 org-footnote-delete-definitions org-footnote-delete-references org-footnote-get-definition org-footnote-get-next-reference org-footnote-goto-previous-reference org-footnote-in-valid-context-p org-footnote-next-reference-or-definition org-format-latex-as-mathml org-format-latex-mathml-available-p org-format-seconds org-freemind-bol-helper org-freemind-convert-links-helper org-get-packages-alist org-get-previous-line-level org-gnus-nnimap-cached-article-number org-gnus-open-nntp org-goto-first-child org-hidden-tree-error org-html-cvt-org-as-html org-html-export-list-line org-html-handle-links org-html-make-link org-html-should-inline-p org-icalendar-use-UTC-date-timep org-id-uuid org-in-block-p org-in-indented-comment-line org-indent-initialize-agent org-indent-initialize-buffer org-indent-item-tree org-indent-notify-modified-headline org-indent-refresh-maybe org-indent-set-line-properties org-inlinetask-at-task-p org-inlinetask-demote org-inlinetask-get-task-level org-inlinetask-goto-beginning org-inlinetask-goto-end org-inlinetask-in-task-p org-inlinetask-outline-regexp org-inlinetask-promote org-inlinetask-toggle-visibility org-insert-beamer-options-template org-inside-latex-macro-p org-item-beginning-re org-item-re org-latex-packages-to-string org-level-increment org-link-unescape-compound org-link-unescape-single-byte-sequence org-list-at-regexp-after-bullet-p org-list-bullet-string org-list-context org-list-delete-item org-list-get-all-items org-list-get-bottom-point org-list-get-bullet org-list-get-checkbox org-list-get-children org-list-get-counter org-list-get-first-item org-list-get-ind org-list-get-item-begin org-list-get-item-end org-list-get-item-end-before-blank org-list-get-last-item org-list-get-list-begin org-list-get-list-end org-list-get-list-type org-list-get-next-item org-list-get-nth org-list-get-parent org-list-get-prev-item org-list-get-subtree org-list-get-tag org-list-get-top-point org-list-has-child-p org-list-in-valid-context-p org-list-inc-bullet-maybe org-list-indent-item-generic org-list-insert-item org-list-item-body-column org-list-item-trim-br org-list-parents-alist org-list-prevs-alist org-list-repair org-list-search-backward org-list-search-forward org-list-search-generic org-list-send-item org-list-separating-blank-lines-number org-list-set-bullet org-list-set-checkbox org-list-set-ind org-list-set-item-visibility org-list-set-nth org-list-struct org-list-struct-apply-struct org-list-struct-assoc-end org-list-struct-fix-box org-list-struct-fix-bul org-list-struct-fix-ind org-list-struct-fix-item-end org-list-struct-indent org-list-struct-outdent org-list-swap-items org-list-to-subtree org-list-use-alpha-bul-p org-list-write-struct org-looking-at-p org-looking-back org-lparse org-lparse-and-open org-lparse-apply-char-styles org-lparse-apply-sub-superscript-styles org-lparse-backend-get org-lparse-backend-is-native-p org-lparse-batch org-lparse-begin org-lparse-begin-collect org-lparse-begin-environment org-lparse-begin-footnote-definition org-lparse-begin-level org-lparse-begin-list org-lparse-begin-list-item org-lparse-begin-list-table:table-cell org-lparse-begin-outline-and-outline-text org-lparse-begin-outline-text org-lparse-begin-paragraph org-lparse-begin-table-rowgroup org-lparse-bind-local-variables org-lparse-convert-read-params org-lparse-convert-special-strings org-lparse-current-environment-p org-lparse-do-convert org-lparse-do-reachable-formats org-lparse-end org-lparse-end-collect org-lparse-end-environment org-lparse-end-footnote-definition org-lparse-end-level org-lparse-end-list org-lparse-end-list-item org-lparse-end-list-item-1 org-lparse-end-list-table:table-cell org-lparse-end-outline-text-or-outline org-lparse-end-paragraph org-lparse-end-table org-lparse-export-list-line org-lparse-format org-lparse-format-extra-targets org-lparse-format-list-table org-lparse-format-org-link org-lparse-format-org-table org-lparse-format-org-tags org-lparse-format-section-number org-lparse-format-table org-lparse-format-table-row org-lparse-format-table-table org-lparse-format-table-table-using-table-generate-source org-lparse-format-tags org-lparse-format-todo org-lparse-get org-lparse-get-block-params org-lparse-get-targets-from-title org-lparse-handle-time-stamps org-lparse-html-list-type-to-canonical-list-type org-lparse-insert org-lparse-insert-list-table org-lparse-insert-org-table org-lparse-insert-table-table org-lparse-insert-tag org-lparse-org-table-to-list-table org-lparse-prepare-toc org-lparse-preprocess-after-blockquote-hook org-lparse-reachable-formats org-lparse-reachable-p org-lparse-region org-lparse-register-backend org-lparse-should-inline-p org-lparse-stash-pop-paragraph-state org-lparse-stash-save-paragraph-state org-lparse-strip-experimental-blocks-maybe-hook org-lparse-suffix-from-snumber org-lparse-table-get-colalign-info org-lparse-to-buffer org-lparse-unregister-backend org-lparse-warn org-make-parameter-alist org-mark-subtree org-mks org-mobile-cleanup-encryption-tempfile org-mobile-decrypt-file org-mobile-encrypt-and-move org-mobile-encrypt-file org-mobile-encryption-password org-mobile-escape-olp org-mobile-get-outline-path-link org-narrow-to-block org-not-nil org-number-sequence org-occur-next-match org-odt-add-automatic-style org-odt-add-label-definition org-odt-begin-annotation org-odt-begin-document-body org-odt-begin-document-content org-odt-begin-environment org-odt-begin-footnote-definition org-odt-begin-list org-odt-begin-list-item org-odt-begin-office-body org-odt-begin-outline org-odt-begin-outline-text org-odt-begin-paragraph org-odt-begin-section org-odt-begin-table org-odt-begin-table-rowgroup org-odt-begin-toc org-odt-configure-outline-numbering org-odt-continue-list org-odt-copy-formula-file org-odt-copy-image-file org-odt-copy-styles-file org-odt-create-manifest-file-entry org-odt-delete-empty-paragraphs org-odt-discontinue-list org-odt-do-image-size org-odt-encode-plain-text org-odt-end-annotation org-odt-end-document-body org-odt-end-document-content org-odt-end-environment org-odt-end-export org-odt-end-footnote-definition org-odt-end-list org-odt-end-list-item org-odt-end-outline org-odt-end-outline-text org-odt-end-paragraph org-odt-end-section org-odt-end-table org-odt-end-table-rowgroup org-odt-end-toc org-odt-fill-tabs-and-spaces org-odt-finalize-outfile org-odt-fixup-label-references org-odt-format-anchor org-odt-format-author org-odt-format-bookmark org-odt-format-comment org-odt-format-date org-odt-format-entity org-odt-format-entity-caption org-odt-format-fontify org-odt-format-footnote org-odt-format-footnote-ref org-odt-format-footnote-reference org-odt-format-frame org-odt-format-heading org-odt-format-headline org-odt-format-horizontal-line org-odt-format-inline-formula org-odt-format-inline-image org-odt-format-inlinetask org-odt-format-label-definition org-odt-format-label-reference org-odt-format-line org-odt-format-line-break org-odt-format-link org-odt-format-object-description org-odt-format-org-entity org-odt-format-org-link org-odt-format-preamble org-odt-format-source-code-or-example org-odt-format-source-code-or-example-colored org-odt-format-source-code-or-example-plain org-odt-format-source-line-with-line-number-and-label org-odt-format-spaces org-odt-format-stylized-paragraph org-odt-format-table-cell org-odt-format-table-row org-odt-format-tabs org-odt-format-tags org-odt-format-target org-odt-format-textbox org-odt-format-toc org-odt-format-toc-entry org-odt-format-toc-item org-odt-get org-odt-get-extra-attrs-for-paragraph-style org-odt-get-image-name org-odt-get-paragraph-style-cookie-for-table-cell org-odt-get-style-name-cookie-for-table-cell org-odt-get-style-name-for-entity org-odt-get-table-cell-styles org-odt-hfy-face-to-css org-odt-image-size-from-file org-odt-init-outfile org-odt-insert-custom-styles-for-srcblocks org-odt-insert-toc org-odt-is-formula-link-p org-odt-merge-frame-params org-odt-relocate-relative-path org-odt-remap-stylenames org-odt-save-as-outfile org-odt-unload-function org-odt-update-meta-file org-odt-update-styles-file org-odt-write-automatic-styles org-odt-write-manifest-file org-odt-write-mimetype-file org-odt-zip-extract org-odt-zip-extract-one org-open-file-with-emacs org-open-file-with-system org-order-calendar-date-args org-outdent-item-tree org-outline-overlay-data org-parse-arguments org-pcomplete-case-double org-pcomplete-initial org-point-at-end-of-empty-headline org-pop-to-buffer-same-window org-protocol-capture org-protocol-do-capture org-protocol-unhex-single-byte-sequence org-publish-aux-preprocess org-publish-cache-ctime-of-src org-publish-cache-file-needs-publishing org-publish-cache-get org-publish-cache-get-file-property org-publish-cache-set org-publish-cache-set-file-property org-publish-compare-directory-files org-publish-find-date org-publish-format-file-entry org-publish-index-generate-theindex org-publish-initialize-cache org-publish-org-sitemap org-publish-org-to-ascii org-publish-org-to-latin1 org-publish-org-to-utf8 org-publish-reset-cache org-publish-sanitize-plist org-publish-with-aux-preprocess-maybe org-publish-write-cache-file org-quarter-to-date org-raise-scripts org-re-property org-re-search-forward-unprotected org-read-property-name org-read-property-value org-reduce org-refile-cache-check-set org-refile-cache-clear org-refile-cache-get org-refile-cache-put org-refile-check-position org-refile-get-targets org-refile-marker org-remove-file-link-modifiers org-remove-font-lock-display-properties org-remove-formatting-on-newlines-in-region org-remove-if org-remove-if-not org-remove-inline-images org-remove-uninherited-tags org-replace-region-by org-save-outline-visibility org-set-outline-overlay-data org-set-packages-alist org-set-property-function org-shiftcontroldown org-shiftcontrolup org-shorten-string org-sort-entries org-sort-list org-special-blocks-convert-html-special-cookies org-special-blocks-convert-latex-special-cookies org-special-blocks-make-special-cookies org-speed-command-default-hook org-splice-latex-header org-src-associate-babel-session org-src-babel-configure-edit-buffer org-src-do-at-code-block org-src-do-key-sequence-at-code-block org-src-edit-buffer-p org-src-font-lock-fontify-block org-src-fontify-block org-src-fontify-buffer org-src-get-lang-mode org-src-native-tab-command-maybe org-store-forced-table-alignment org-string-match-p org-string-nw-p org-string-to-estimate org-strip-protective-commas org-substitute-posix-classes org-switchb org-table-colgroup-line-p org-table-cookie-line-p org-table-current-line org-table-expand-lhs-ranges org-table-follow-field-mode org-table-follow-fields-with-editor org-table-formula-handle-first/last-rc org-table-get org-table-goto-line org-table-iterate-buffer-tables org-table-line-to-dline org-table-put org-table-recalculate-buffer-tables org-table-time-seconds-to-string org-table-time-string-to-seconds org-table-transpose-table-at-point org-taskjuggler-assign-resource-ids org-taskjuggler-assign-task-ids org-taskjuggler-clean-effort org-taskjuggler-clean-id org-taskjuggler-close-maybe org-taskjuggler-components org-taskjuggler-compute-task-leafiness org-taskjuggler-filter-and-join org-taskjuggler-find-task-with-id org-taskjuggler-get-attribute org-taskjuggler-get-attributes org-taskjuggler-get-priority org-taskjuggler-get-unique-id org-taskjuggler-insert-reports org-taskjuggler-open-project org-taskjuggler-open-resource org-taskjuggler-open-task org-taskjuggler-parent-is-ordered-p org-taskjuggler-resolve-dependencies org-taskjuggler-resolve-explicit-dependencies org-taskjuggler-targeting-tj3-p org-taskjuggler-tokenize-dependencies org-thing-at-point org-timer-cancel-timer org-today org-todo-yesterday org-toggle-inline-images org-toggle-link-display org-toggle-pretty-entities org-truely-invisible-p org-update-property-plist org-version-check org-with-gensyms org-with-wide-buffer org-wl-folder-type org-wl-message-field org-wl-open-nntp org-wl-store-link-folder org-wl-store-link-message org-xemacs-without-invisibility org-xml-encode-org-text org-xml-encode-org-text-skip-links org-xml-encode-plain-text org-xml-fix-class-name org-xml-format-desc org-xml-format-href package--add-to-archive-contents package--archive-contents-from-file package--archive-contents-from-url package--dir package--download-one-archive package--encode package--make-autoloads-and-compile package--make-html-entry package--make-rss-entry package--push package--read-archive-file package--update-file package--update-news package--with-work-buffer package--write-file-no-coding package-activate package-activate-1 package-archive-base package-autoload-ensure-default-file package-buffer-info package-built-in-p package-compute-transaction package-delete package-desc-doc package-desc-kind package-desc-reqs package-desc-vers package-download-single package-download-tar package-download-transaction package-generate-autoloads package-gnus-summary-upload package-handle-response package-initialize package-install package-install-button-action package-install-file package-install-from-buffer package-installed-p package-list-packages package-list-packages-no-fetch package-load-all-descriptors package-load-descriptor package-maint-add-news-item package-mark-obsolete package-maybe-load-descriptor package-menu--description-predicate package-menu--find-upgrades package-menu--generate package-menu--name-predicate package-menu--print-info package-menu--status-predicate package-menu--version-predicate package-menu-backup-unmark package-menu-describe-package package-menu-execute package-menu-get-status package-menu-mark-delete package-menu-mark-install package-menu-mark-obsolete-for-deletion package-menu-mark-unmark package-menu-mark-upgrades package-menu-mode package-menu-quick-help package-menu-refresh package-menu-view-commentary package-read-all-archive-contents package-read-archive-contents package-read-from-string package-refresh-contents package-show-package-list package-strip-rcs-id package-strip-version package-tar-file-info package-unpack package-unpack-single package-untar-buffer package-upload-buffer package-upload-buffer-internal package-upload-file package-version-join pascal-completions-at-point password-in-cache-p pcase pcase--and pcase--expand pcase--fgrep pcase--if pcase--q1 pcase--small-branch-p pcase--split-consp pcase--split-equal pcase--split-match pcase--split-member pcase--split-pred pcase--split-rest pcase--trivial-upat-p pcase--u pcase--u1 pcase--upat pcase-codegen pcase-dolist pcase-let pcase-let* pcmpl-gnu-with-file-buffer pcmpl-ssh-config-hosts pcmpl-ssh-known-hosts pcomplete--entries pcomplete-completions-at-point pcomplete-erc-parse-arguments pcomplete/org-mode/block-option/clocktable pcomplete/org-mode/block-option/src pcomplete/org-mode/file-option pcomplete/org-mode/file-option/bind pcomplete/org-mode/file-option/startup pcomplete/org-mode/link pcomplete/org-mode/prop pcomplete/org-mode/searchhead pcomplete/org-mode/tag pcomplete/org-mode/tex pcomplete/org-mode/todo perl-font-lock-syntactic-face-function perl-syntax-propertize-function perl-syntax-propertize-special-constructs picture-delete-char plstore--decrypt plstore--get-alist plstore--get-buffer plstore--get-encrypted-data plstore--get-merged-alist plstore--get-secret-alist plstore--init-from-buffer plstore--insert-buffer plstore--make plstore--match plstore--merge-secret plstore--set-alist plstore--set-buffer plstore--set-encrypted-data plstore--set-merged-alist plstore--set-secret-alist plstore-close plstore-delete plstore-find plstore-get plstore-get-file plstore-open plstore-passphrase-callback-function plstore-progress-callback-function plstore-put plstore-revert plstore-save pop-to-buffer-same-window pop3-logon pop3-send-streaming-command pop3-set-process-query-on-exit-flag pop3-wait-for-messages pop3-write-to-file process-live-p process-menu-mode process-menu-visit-buffer prog-indent-sexp prog-mode prolog-Info-follow-nearest-node prolog-atleast-version prolog-atom-under-point prolog-backward-list prolog-beginning-of-clause prolog-beginning-of-predicate prolog-bsts prolog-buffer-module prolog-build-case-strings prolog-build-info-alist prolog-build-prolog-command prolog-char-to-int prolog-clause-end prolog-clause-info prolog-clause-start prolog-comment-indent prolog-comment-limits prolog-compile-buffer prolog-compile-file prolog-compile-predicate prolog-compile-region prolog-compile-string prolog-consult-buffer prolog-consult-compile prolog-consult-compile-buffer prolog-consult-compile-file prolog-consult-compile-filter prolog-consult-compile-predicate prolog-consult-compile-region prolog-consult-file prolog-consult-predicate prolog-consult-string prolog-dash-letters prolog-debug-off prolog-debug-on prolog-disable-sicstus-sd prolog-do-auto-fill prolog-edit-menu-insert-move prolog-edit-menu-runtime prolog-electric-colon prolog-electric-dash prolog-electric-delete prolog-electric-dot prolog-electric-if-then-else prolog-electric-underscore prolog-enable-sicstus-sd prolog-end-of-clause prolog-end-of-predicate prolog-ensure-process prolog-face-name-p prolog-fill-paragraph prolog-find-documentation prolog-find-indent-of-matching-paren prolog-find-start-of-mline-comment prolog-find-term prolog-find-unmatched-paren prolog-find-value-by-system prolog-font-lock-keywords prolog-font-lock-object-matcher prolog-forward-list prolog-get-predspec prolog-goto-comment-column prolog-goto-next-paren prolog-goto-predicate-info prolog-goto-prolog-process-buffer prolog-guess-fill-prefix prolog-help-apropos prolog-help-info prolog-help-on-predicate prolog-help-online prolog-in-object prolog-in-string-or-comment prolog-indent-buffer prolog-indent-predicate prolog-indentation-level-of-line prolog-inferior-buffer prolog-inferior-guess-flavor prolog-inferior-menu prolog-inferior-menu-all prolog-inferior-mode prolog-inferior-self-insert-command prolog-input-filter prolog-insert-module-modeline prolog-insert-next-clause prolog-insert-predicate-template prolog-insert-predspec prolog-insert-spaces-after-paren prolog-inside-mline-comment prolog-int-to-char prolog-ints-intervals prolog-make-keywords-regexp prolog-mark-clause prolog-mark-predicate prolog-menu prolog-menu-help prolog-mode-keybindings-common prolog-mode-keybindings-edit prolog-mode-keybindings-inferior prolog-mode-version prolog-old-process-buffer prolog-old-process-file prolog-old-process-predicate prolog-old-process-region prolog-paren-balance prolog-paren-is-the-first-on-line-p prolog-parse-sicstus-compilation-errors prolog-pred-end prolog-pred-start prolog-process-insert-string prolog-program-name prolog-program-switches prolog-prompt-regexp prolog-read-predicate prolog-region-paren-balance prolog-replace-in-string prolog-set-atom-regexps prolog-temporary-file prolog-toggle-sicstus-sd prolog-tokenize prolog-trace-off prolog-trace-on prolog-uncomment-region prolog-variables-to-anonymous prolog-view-predspec prolog-zip-off prolog-zip-on put-unicode-property-internal quit-windows-on rcirc--connection-open-p rcirc-check-auth-status rcirc-cmd-invite rcirc-complete rcirc-completion-at-point rcirc-ctcp-sender-PING rcirc-float-time rcirc-generate-log-filename rcirc-handler-317 rcirc-join-channels-post-auth rcirc-nickname< rcirc-prompt-for-encryption rcirc-send-ctcp rcirc-send-privmsg rcirc-sort-nicknames-join read-buffer-file-coding-system read-char-choice read-extended-command read-file-name--defaults read-file-name-default recentf-add-file recentf-apply-filename-handlers recentf-apply-menu-filter recentf-arrange-by-dir recentf-arrange-by-mode recentf-arrange-by-rule recentf-auto-cleanup recentf-build-mode-rules recentf-cancel-dialog recentf-cleanup recentf-dialog recentf-dialog-goto-first recentf-dialog-mode recentf-digit-shortcut-command-name recentf-dir-rule recentf-directory-compare recentf-dump-variable recentf-edit-list recentf-edit-list-select recentf-edit-list-validate recentf-elements recentf-expand-file-name recentf-file-name-nondir recentf-filter-changer recentf-filter-changer-select recentf-hide-menu recentf-include-p recentf-indirect-mode-rule recentf-keep-default-predicate recentf-keep-p recentf-load-list recentf-make-default-menu-element recentf-make-menu-element recentf-make-menu-item recentf-make-menu-items recentf-match-rule recentf-menu-bar recentf-menu-customization-changed recentf-menu-element-item recentf-menu-element-value recentf-menu-elements recentf-menu-value-shortcut recentf-open-files recentf-open-files-action recentf-open-files-item recentf-open-files-items recentf-open-more-files recentf-open-most-recent-file recentf-open-most-recent-file-0 recentf-open-most-recent-file-1 recentf-open-most-recent-file-2 recentf-open-most-recent-file-3 recentf-open-most-recent-file-4 recentf-open-most-recent-file-5 recentf-open-most-recent-file-6 recentf-open-most-recent-file-7 recentf-open-most-recent-file-8 recentf-open-most-recent-file-9 recentf-push recentf-relative-filter recentf-remove-if-non-kept recentf-save-list recentf-set-menu-element-item recentf-set-menu-element-value recentf-show-basenames recentf-show-basenames-ascending recentf-show-basenames-descending recentf-show-digit-shortcut-filter recentf-show-menu recentf-sort-ascending recentf-sort-basenames-ascending recentf-sort-basenames-descending recentf-sort-descending recentf-sort-directories-ascending recentf-sort-directories-descending recentf-string-equal recentf-string-lessp recentf-string-member recentf-sub-menu-element-p recentf-track-closed-file recentf-track-opened-file recentf-trunc-list recentf-unload-function record-window-buffer rectange--default-line-number-format rectangle-number-line-callback rectangle-number-lines region-exists-p registerv--make registerv-data registerv-insert-func registerv-jump-func registerv-make registerv-p registerv-print-func registry--match registry-db registry-db-child-p registry-db-p registry-delete registry-full registry-insert registry-lookup registry-lookup-breaks-before-lexbind registry-lookup-secondary registry-lookup-secondary-value registry-make-testable-db registry-prune registry-prune-hard-candidates registry-prune-soft-candidates registry-reindex registry-search registry-size replace-amp report-emacs-bug-can-use-osx-open report-emacs-bug-can-use-xdg-email report-emacs-bug-create-existing-bugs-buffer report-emacs-bug-insert-to-mailer report-emacs-bug-parse-query-results report-emacs-bug-query-existing-bugs resize-mini-window-internal right-char right-word ring-extend rmail-epa-decrypt rmail-mail-return rmail-mime-display-body rmail-mime-display-header rmail-mime-display-tagline rmail-mime-entity-set-truncated rmail-mime-entity-truncated rmail-next-error-move rmail-view-buffer-kill-buffer-hook rmail-yank-current-message rng-dtd-trivial-p rtree-add rtree-delq rtree-extract rtree-high rtree-left rtree-length rtree-low rtree-make rtree-make-1 rtree-make-node rtree-memq rtree-normalise-range rtree-range rtree-right rtree-set-high rtree-set-left rtree-set-low rtree-set-range rtree-set-right ruby-syntax-propertize-function ruby-syntax-propertize-heredoc ruler--save-header-line-format run-hook-wrapped run-window-configuration-change-hook rx-submatch-n save&set-overriding-map save-place-alist-to-file save-place-find-file-hook save-place-forget-unreadable-files save-place-kill-emacs-hook save-place-to-alist save-places-to-alist savehist-autosave savehist-install savehist-load savehist-minibuffer-hook savehist-printable savehist-save savehist-trim-history savehist-uninstall sbe scroll-down-command scroll-up-command secrets-create-item secrets-delete-item secrets-get-alias secrets-get-attributes secrets-get-secret secrets-list-collections secrets-search-items secure-hash semantic-edits-incremental-parser sendmail-query-once sendmail-query-user-about-smtp server--on-display-p server-eval-at server-reply-print ses--clean-! ses--clean-_ ses-cell-property-delq-fun ses-cell-property-get ses-cell-property-get-fun ses-cell-property-get-handle ses-cell-property-get-handle-fun ses-cell-property-handle-car ses-cell-property-handle-setcar ses-cell-property-pop ses-cell-property-pop-fun ses-cell-property-set ses-cell-property-set-fun ses-initialize-Dijkstra-attempt ses-repair-cell-reference-all ses-set-localvars set-file-selinux-context set-window-buffer-start-and-point set-window-combination-limit set-window-new-normal set-window-new-total set-window-next-buffers set-window-point-1 set-window-prev-buffers sh-syntax-propertize-function sh-syntax-propertize-here-doc shell--command-completion-data shell-c-a-p-replace-by-expanded-directory shell-command-completion shell-command-completion-function shell-completion-vars shell-environment-variable-completion shell-filename-completion shell-parse-pcomplete-arguments should should-error should-not shr-add-font shr-browse-image shr-browse-url shr-buffer-width shr-char-breakable-p shr-char-kinsoku-bol-p shr-char-kinsoku-eol-p shr-char-nospace-p shr-collect-overlays shr-color->hexadecimal shr-color-check shr-color-hsl-to-rgb-fractions shr-color-hue-to-rgb shr-color-relative-to-absolute shr-color-set-minimum-interval shr-color-visible shr-colorize-region shr-column-specs shr-copy-url shr-count shr-descend shr-encode-url shr-ensure-newline shr-ensure-paragraph shr-expand-newlines shr-expand-url shr-find-elements shr-find-fill-point shr-fontize-cont shr-generic shr-get-image-data shr-heading shr-image-displayer shr-image-fetched shr-indent shr-insert shr-insert-document shr-insert-image shr-insert-table shr-insert-table-ruler shr-make-table shr-max-columns shr-overlays-in-region shr-parse-style shr-previous-newline-padding-width shr-pro-rate-columns shr-put-color shr-put-color-1 shr-put-image shr-remove-trailing-whitespace shr-render-td shr-rescale-image shr-save-contents shr-show-alt-text shr-store-contents shr-table-widths shr-tag-a shr-tag-b shr-tag-base shr-tag-blockquote shr-tag-body shr-tag-br shr-tag-comment shr-tag-del shr-tag-div shr-tag-em shr-tag-font shr-tag-h1 shr-tag-h2 shr-tag-h3 shr-tag-h4 shr-tag-h5 shr-tag-h6 shr-tag-hr shr-tag-i shr-tag-img shr-tag-label shr-tag-li shr-tag-object shr-tag-ol shr-tag-p shr-tag-pre shr-tag-s shr-tag-script shr-tag-strong shr-tag-style shr-tag-sub shr-tag-sup shr-tag-table shr-tag-table-1 shr-tag-title shr-tag-u shr-tag-ul shr-tag-video shr-transform-dom shr-urlify shr-visit-file sieve-manage-quit skeleton-newline smerge-resolve--extract-comment smerge-resolve--normalize smie-bnf--classify smie-bnf--closer-alist smie-bnf--set-class smie-indent-inside-string smtpmail-command-or-throw smtpmail-ok-p smtpmail-query-smtp-server smtpmail-response-code smtpmail-response-text smtpmail-user-mail-address soap-array-type-element-type soap-array-type-name soap-array-type-namespace-tag soap-array-type-p soap-basic-type-kind soap-basic-type-name soap-basic-type-namespace-tag soap-basic-type-p soap-binding-name soap-binding-namespace-tag soap-binding-operations soap-binding-p soap-binding-port-type soap-bound-operation-operation soap-bound-operation-p soap-bound-operation-soap-action soap-bound-operation-use soap-create-envelope soap-decode-any-type soap-decode-array soap-decode-array-type soap-decode-basic-type soap-decode-sequence-type soap-decode-type soap-default-soapenc-types soap-default-xsd-types soap-element-fq-name soap-element-name soap-element-namespace-tag soap-element-p soap-encode-array-type soap-encode-basic-type soap-encode-body soap-encode-sequence-type soap-encode-value soap-extract-xmlns soap-get-target-namespace soap-insert-describe-button soap-inspect soap-inspect-array-type soap-inspect-basic-type soap-inspect-binding soap-inspect-message soap-inspect-operation soap-inspect-port soap-inspect-port-type soap-inspect-sequence-type soap-inspect-wsdl soap-invoke soap-l2fq soap-l2wk soap-load-wsdl soap-load-wsdl-from-url soap-message-name soap-message-namespace-tag soap-message-p soap-message-parts soap-namespace-elements soap-namespace-get soap-namespace-link-name soap-namespace-link-namespace-tag soap-namespace-link-p soap-namespace-link-target soap-namespace-name soap-namespace-p soap-namespace-put soap-namespace-put-link soap-operation-faults soap-operation-input soap-operation-name soap-operation-namespace-tag soap-operation-output soap-operation-p soap-operation-parameter-order soap-parse-binding soap-parse-complex-type soap-parse-complex-type-complex-content soap-parse-complex-type-sequence soap-parse-envelope soap-parse-message soap-parse-operation soap-parse-port-type soap-parse-response soap-parse-schema soap-parse-schema-element soap-parse-sequence soap-parse-wsdl soap-port-binding soap-port-name soap-port-namespace-tag soap-port-p soap-port-service-url soap-port-type-name soap-port-type-namespace-tag soap-port-type-operations soap-port-type-p soap-resolve-references-for-array-type soap-resolve-references-for-binding soap-resolve-references-for-element soap-resolve-references-for-message soap-resolve-references-for-operation soap-resolve-references-for-port soap-resolve-references-for-sequence-type soap-sample-value soap-sample-value-for-array-type soap-sample-value-for-basic-type soap-sample-value-for-message soap-sample-value-for-seqence-type soap-sequence-element-multiple\? soap-sequence-element-name soap-sequence-element-nillable\? soap-sequence-element-p soap-sequence-element-type soap-sequence-type-elements soap-sequence-type-name soap-sequence-type-namespace-tag soap-sequence-type-p soap-sequence-type-parent soap-type-p soap-warning soap-with-local-xmlns soap-wk2l soap-wsdl-add-alias soap-wsdl-add-namespace soap-wsdl-alias-table soap-wsdl-find-namespace soap-wsdl-get soap-wsdl-namespaces soap-wsdl-origin soap-wsdl-p soap-wsdl-ports soap-wsdl-resolve-references soap-xml-get-attribute-or-nil1 soap-xml-get-children1 special-variable-p split-window-below split-window-internal split-window-right sql-add-product sql-beginning-of-statement sql-buffer-live-p sql-build-completions sql-build-completions-1 sql-comint sql-comint-db2 sql-comint-informix sql-comint-ingres sql-comint-interbase sql-comint-linter sql-comint-ms sql-comint-mysql sql-comint-oracle sql-comint-postgres sql-comint-solid sql-comint-sqlite sql-comint-sybase sql-connect sql-connection-menu-filter sql-del-product sql-end-of-statement sql-escape-newlines-filter sql-execute sql-execute-feature sql-font-lock-keywords-builder sql-for-each-login sql-get-login-ext sql-get-product-feature sql-help-list-products sql-input-sender sql-interactive-remove-continuation-prompt sql-list-all sql-list-table sql-oracle-completion-object sql-oracle-list-all sql-oracle-list-table sql-oracle-restore-settings sql-oracle-save-settings sql-oracle-show-reserved-words sql-placeholders-filter sql-postgres-completion-object sql-product-font-lock-syntax-alist sql-product-syntax-table sql-read-connection sql-read-product sql-read-table-name sql-redirect sql-redirect-one sql-redirect-value sql-regexp-abbrev sql-regexp-abbrev-list sql-remove-tabs-filter sql-save-connection sql-send-magic-terminator sql-set-product-feature sql-signum sql-sqlite-completion-object sql-statement-regexp sql-str-literal sql-try-completion starttls-available-p switch-to-next-buffer switch-to-prev-buffer syntax-propertize syntax-propertize--shift-groups syntax-propertize-multiline syntax-propertize-precompile-rules syntax-propertize-rules syntax-propertize-via-font-lock syntax-propertize-wholelines tabulated-list-col-sort tabulated-list-get-id tabulated-list-init-header tabulated-list-mode tabulated-list-print tabulated-list-print-entry tabulated-list-put-tag tabulated-list-revert tags-completion-at-point-function tetris-shape-rotations tex-env-mark tex-old-error-file-name toggle-save-place tool-bar--image-expression tool-bar-pixel-width tpu-with-position tramp-cleanup-this-connection tramp-compat-call-process tramp-compat-coding-system-change-eol-conversion tramp-compat-decimal-to-octal tramp-compat-font-lock-add-keywords tramp-compat-octal-to-decimal tramp-compat-set-process-query-on-exit-flag tramp-compat-with-temp-message tramp-debug-outline-level tramp-get-connection-name tramp-gvfs-file-name-handler tramp-gvfs-file-name-p tramp-sh-handle-add-name-to-file tramp-sh-handle-call-process-region tramp-sh-handle-copy-directory tramp-sh-handle-copy-file tramp-sh-handle-delete-directory tramp-sh-handle-delete-file tramp-sh-handle-directory-files-and-attributes tramp-sh-handle-dired-compress-file tramp-sh-handle-dired-recursive-delete-directory tramp-sh-handle-executable-find tramp-sh-handle-expand-file-name tramp-sh-handle-file-attributes tramp-sh-handle-file-directory-p tramp-sh-handle-file-executable-p tramp-sh-handle-file-exists-p tramp-sh-handle-file-local-copy tramp-sh-handle-file-name-all-completions tramp-sh-handle-file-newer-than-file-p tramp-sh-handle-file-ownership-preserved-p tramp-sh-handle-file-readable-p tramp-sh-handle-file-selinux-context tramp-sh-handle-file-truename tramp-sh-handle-file-writable-p tramp-sh-handle-insert-directory tramp-sh-handle-insert-file-contents-literally tramp-sh-handle-make-auto-save-file-name tramp-sh-handle-make-directory tramp-sh-handle-make-symbolic-link tramp-sh-handle-process-file tramp-sh-handle-rename-file tramp-sh-handle-set-file-modes tramp-sh-handle-set-file-selinux-context tramp-sh-handle-set-file-times tramp-sh-handle-set-visited-file-modtime tramp-sh-handle-start-file-process tramp-sh-handle-vc-registered tramp-sh-handle-verify-visited-file-modtime tramp-sh-handle-write-region tramp-with-progress-reporter unicode-property-table-internal unload--set-major-mode unrecord-window-buffer update-glyphless-char-display url-bit-for-url url-cache-prune-cache url-cookie-p url-do-auth-source-search url-fetch-from-cache url-future-call url-future-callback url-future-cancel url-future-cancelled-p url-future-completed-p url-future-done-p url-future-errorback url-future-errored url-future-errored-p url-future-finish url-future-p url-future-status url-future-value url-password-for-url url-queue-buffer url-queue-callback url-queue-callback-function url-queue-cbargs url-queue-inhibit-cookiesp url-queue-kill-job url-queue-p url-queue-pre-triggered url-queue-prune-old-entries url-queue-remove-jobs-from-host url-queue-retrieve url-queue-run-queue url-queue-setup-runners url-queue-silentp url-queue-start-retrieve url-queue-start-time url-queue-url url-silent url-use-cookies url-user-for-url vc-annotate-goto-line vc-bzr-async-command vc-bzr-branch-conf vc-bzr-expanded-log-entry vc-bzr-merge-branch vc-bzr-pull vc-diff-build-argument-list-internal vc-do-async-command vc-ediff vc-git-branches vc-git-expanded-log-entry vc-git-merge-branch vc-git-pull vc-hg-expanded-log-entry vc-hg-merge-branch vc-pull vc-set-async-update vc-svn-root vc-version-ediff verilog-alw-get-outputs-delayed verilog-alw-get-outputs-immediate verilog-auto-inout-in verilog-auto-inst-port-list verilog-auto-logic verilog-backward-syntactic-ws-quick verilog-batch-diff-auto verilog-beg-of-defun-quick verilog-decls-get-vars verilog-define-abbrev verilog-delete-trailing-whitespace verilog-diff-auto verilog-diff-buffers-p verilog-diff-file-with-buffer verilog-diff-report verilog-forward-sexp-cmt verilog-forward-sexp-ign-cmt verilog-in-parameter-p verilog-in-paren-quick verilog-in-parenthesis-p verilog-inside-comment-or-string-p verilog-modi-cache-add-vars verilog-run-hooks verilog-scan-and-debug verilog-scan-cache-flush verilog-scan-debug verilog-sk-ovm-class verilog-sk-uvm-class w32-convert-standard-filename w3m-toggle-inline-images walk-window-subtree walk-window-tree walk-window-tree-1 wdired-isearch-filter-read-only widget-color--choose-action widget-color-value-create widget-completions-at-point widget-default-completions widget-field-value-set window--atom-check window--atom-check-1 window--check window--delete window--in-direction-2 window--in-subtree-p window--max-delta-1 window--min-delta-1 window--min-size-1 window--resizable window--resizable-p window--resize-child-windows window--resize-child-windows-normal window--resize-child-windows-skip-p window--resize-mini-window window--resize-reset window--resize-reset-1 window--resize-root-window window--resize-root-window-vertically window--resize-siblings window--resize-this-window window--side-check window--size-fixed-1 window--size-ignore window--state-get-1 window--state-put-1 window--state-put-2 window--subtree window-absolute-pixel-edges window-at-side-list window-at-side-p window-atom-root window-body-size window-body-width window-child window-child-count window-combination-limit window-combinations window-combined-p window-deletable-p window-in-direction window-inside-absolute-pixel-edges window-last-child window-left window-left-child window-left-column window-list-1 window-make-atom window-max-delta window-min-delta window-min-size window-new-normal window-new-total window-next-buffers window-next-sibling window-normal-size window-normalize-buffer window-normalize-buffer-to-switch-to window-normalize-frame window-normalize-window window-parent window-point-1 window-prev-buffers window-prev-sibling window-resizable window-resize window-resize-apply window-right window-sizable window-sizable-p window-size-fixed-p window-split-min-size window-state-get window-state-put window-top-child window-top-line window-total-height window-total-size window-total-width window-use-time window-valid-p window-with-parameter with-buffer-modified-unmodified with-org-lparse-preserve-paragraph-state woman-bookmark-jump woman-bookmark-make-record word-search-regexp x-dnd-more-than-3-from-flags x-dnd-version-from-flags xmodmap-generic-mode xselect--encode-string xselect-convert-to-save-targets y-or-n-minibuffer)) - (variables - (removed --dolist-tail-- --dotimes-limit-- :auto-postamble :auto-preamble :complete :completion-alist :completion-ignore-case :for-LaTeX :for-ascii :for-docbook :for-html :lables-face :opt :postamble :prop :searchhead :sqli-connect :sqli-prompt-length :sqli-prompt-regexp :ssl :startup :tostring OOOOscore OOOscore OOscore Oscore XXXXscore XXXscore XXscore Xscore after-find-file-from-revert-buffer allout-keybindings-list allout-passphrase-hint-handling allout-passphrase-verifier-handling allout-v18/19-file-var-hack allout-view-change-hook appt-issue-message appt-msg-window appt-now-displayed appt-visible argval auth-source-cache auth-source-hide-passwords autoconf-font-lock-syntactic-keywords bibtex-entry-menu byte-compile-not-obsolete-var byte-compile-outbuffer byte-interactive-p byte-save-window-excursion byte-temp-output-buffer-setup byte-temp-output-buffer-show c-before-font-lock-function c-get-state-before-change-function c-in-literal-cache c-state-cache-start cfengine-actions cfengine-font-lock-keywords cfengine-font-lock-syntactic-keywords cfengine-imenu-expression cfengine-mode-abbrev-table cfengine-mode-map cfengine-mode-syntax-table char-direction-table checkdoc-minor-keymap cl1-column cl1-dir cl1-line cl1-tem command-hook-internal compilation-turn-on-font-lock completion cpp-edit-map custom-enabling-themes custom-face-selected custom-theme-face-menu custom-theme-variable-menu dabbrev--last-completion-buffer dabbrev--last-obarray dbus-registered-objects-table default-direction-reversed description diary-fancy-date-pattern diff-extra-args diff-new-file diff-new-temp-file diff-old-file diff-old-temp-file direction-reversed directory-sep-char dired-flagging-regexp dired-query-alist dired-x-help-address dired-x-variable-list doctex-font-lock-syntactic-keywords e earcon-button-marker-list earcon-prefix earcon-regexp-alist earcon-suffix edebug-read-backquote-level emacs-priority eshell-metric-after-command eshell-metric-before-command eshell-show-usage-metrics eshell-test-failures f file-count file-ex find-file-not-true-dirname-list finder-package-info first-file-buffer font-lock-defaults-alist function-p-func gdb-all-registers gdb-annotation-rules gdb-array-string gdb-assembler-font-lock-keywords gdb-assembler-mode-map gdb-breakpoint-regexp gdb-buffer-list gdb-buffer-rules-assoc gdb-current-item gdb-data-list-register-names-regexp gdb-data-list-register-values-regexp gdb-early-user-input gdb-find-source-frame gdb-first-post-prompt gdb-flush-pending-output gdb-frame-begin gdb-fullname-regexp gdb-input-queue gdb-locals-font-lock-keywords gdb-locals-font-lock-keywords-1 gdb-locals-font-lock-keywords-2 gdb-locals-watch-map-1 gdb-look-up-stack gdb-max-frames gdb-memory-repeat-count gdb-overlay-arrow-position gdb-parent-bptno-enabled gdb-pc-address gdb-previous-frame gdb-previous-frame-pc-address gdb-printing gdb-prompting gdb-ready gdb-recording gdb-same-frame gdb-script-font-lock-syntactic-keywords gdb-server-prefix gdb-signalled gdb-source-file-regexp-1 gdb-source-spec-regexp gdb-stack-list-frames-regexp gdb-stack-list-locals-regexp gdb-stack-update gdb-struct-string gdb-thread-indicator gdb-use-separate-io-buffer gdb-var-list-children-regexp gdb-var-set-format-regexp gdb-var-update-regexp gdb-version gnus-article-date-lapsed-new-header gnus-article-wash-function gnus-audio-au-player gnus-audio-directory gnus-audio-inline-sound gnus-audio-wav-player gnus-backup-default-subscribed-newsgroups gnus-bookmark-after-jump-hook gnus-button-ctan-directory-regexp gnus-button-ctan-handler gnus-button-handle-ctan-bogus-regexp gnus-button-marker-list gnus-button-tex-level gnus-carpal-attached-buffer gnus-carpal-browse-buffer gnus-carpal-browse-buffer-buttons gnus-carpal-button-face gnus-carpal-group-buffer gnus-carpal-group-buffer-buttons gnus-carpal-header-face gnus-carpal-mode-hook gnus-carpal-mode-map gnus-carpal-server-buffer gnus-carpal-server-buffer-buttons gnus-carpal-summary-buffer gnus-carpal-summary-buffer-buttons gnus-ctan-url gnus-default-subscribed-newsgroups gnus-demon-handler-state gnus-demon-idle-has-been-called gnus-demon-idle-time gnus-demon-last-keys gnus-demon-timer gnus-ephemeral-group-server gnus-group-archive-directory gnus-group-charter-alist gnus-group-faq-directory gnus-group-fetch-control-use-browse-url gnus-group-icon-cache gnus-group-recent-archive-directory gnus-group-soup-map gnus-group-warchive-address-history gnus-group-warchive-login-history gnus-group-warchive-type-history gnus-nastygram-message gnus-newsgroup-none-id gnus-newsgroup-recent gnus-nocem-active gnus-nocem-alist gnus-nocem-check-article-limit gnus-nocem-check-from gnus-nocem-directory gnus-nocem-expiry-wait gnus-nocem-groups gnus-nocem-hashtb gnus-nocem-issuers gnus-nocem-liberal-fetch gnus-nocem-real-group-hashtb gnus-nocem-seen-message-ids gnus-nocem-touched-alist gnus-nocem-verifyer gnus-picon-setup-p gnus-play-startup-jingle gnus-simple-splash gnus-soup-areas gnus-soup-buffers gnus-soup-directory gnus-soup-encoding-type gnus-soup-ignored-headers gnus-soup-index-type gnus-soup-last-prefix gnus-soup-packer gnus-soup-packet-directory gnus-soup-packet-regexp gnus-soup-prefix-file gnus-soup-prev-prefix gnus-soup-replies-directory gnus-soup-unpacker gnus-souped-mark gnus-startup-jingle gnus-topic-indentation gnus-treat-date-english gnus-treat-date-iso8601 gnus-treat-date-lapsed gnus-treat-date-local gnus-treat-date-original gnus-treat-date-user-defined gnus-treat-date-ut gnus-treat-play-sounds gnus-treat-translate gnus-use-generic-from gnus-use-nocem gnus-uu-shar-file-name gnus-window-configuration gomoku-loosing-threshold gud-old-arrow help-window help-xref-override-view-map iimage-version imap-hash-headers inferior-prolog-buffer inferior-prolog-error-regexp-alist inferior-prolog-flavor inferior-prolog-mode-abbrev-table inferior-prolog-mode-map inferior-prolog-mode-syntax-table info-xref-results-buffer inhibit-first-line-modes-regexps is-windows isearch js--regexp-literal js-font-lock-syntactic-keywords just-files lisp-interaction-mode-abbrev-table lm-8-directions lm-board lm-board-height lm-board-width lm-bound lm-c lm-c-naught lm-cx lm-cy lm-debug lm-directions lm-draw-limit lm-emacs-is-computing lm-emacs-played-first lm-emacs-won lm-ew lm-font-lock-keywords lm-game-history lm-game-in-progress lm-human-refused-draw lm-human-took-back lm-initial-w0 lm-initial-wij lm-loosing-threshold lm-m lm-max-stall-time lm-mode-hook lm-mode-map lm-n lm-no-payoff lm-ns lm-number-of-draws lm-number-of-emacs-wins lm-number-of-human-moves lm-number-of-human-wins lm-number-of-moves lm-number-of-trials lm-nvar lm-one-moment-please lm-output-moves lm-saved-board-height lm-saved-board-width lm-saved-score-table lm-score-table lm-score-trans-table lm-square-height lm-square-width lm-sum-of-moves lm-tree-r lm-vector-length lm-winning-threshold lm-x-offset lm-y-offset longopts makefile-font-lock-syntactic-keywords message-cite-reply-above meta-mode-syntax-table mixal-font-lock-syntactic-keywords mm-emacs-mule mm-inline-text-html-renderer mm-text-html-washer-alist mm-url-package-name mm-url-package-version mml-smime-verbose mml1991-verbose mml2015-verbose mouse-drag-overlay mouse-region-delete-keys news-buffer news-certification-file news-current-certifiable news-current-certifications news-current-group-begin news-current-group-end news-current-message-number news-current-news-group news-group-article-assoc news-ignored-headers news-list-of-files news-list-of-files-possibly-bogus news-max-plausible-gap news-message-filter news-mode-map news-no-jumps-p news-point-pdl news-read-first-time-p news-reply-header-hook news-reply-mode-map news-reply-yank-from news-reply-yank-message-id news-startup-file news-total-current-group news-unsubscribe-groups news-user-group-list newsticker--browse-image newsticker--get-all-image newsticker--mark-immortal-image newsticker--mark-read-image newsticker--narrow-image newsticker--next-feed-image newsticker--next-item-image newsticker--previous-feed-image newsticker--previous-item-image newsticker--update-image nil-score nndb-address nndb-article-type nndb-deliver-program nndb-port-number nndb-server-opened-hook nndb-server-side-expiry nndb-set-expire-date-on-mark nndb-status-string nndb-version nnimap-auth-method nnimap-authinfo-file nnimap-close-asynchronous nnimap-current-move-article nnimap-current-move-group nnimap-current-move-server nnimap-current-server nnimap-debug nnimap-debug-buffer nnimap-directory nnimap-dont-close nnimap-expunge-on-close nnimap-expunge-search-string nnimap-id nnimap-importantize-dormant nnimap-list-pattern nnimap-logout-timeout nnimap-mailbox-info nnimap-mark-to-flag-alist nnimap-mark-to-predicate-alist nnimap-need-unselect-to-notice-new-mail nnimap-news-groups nnimap-nov-file-name nnimap-nov-file-name-suffix nnimap-nov-is-evil nnimap-progress-chars nnimap-progress-how-often nnimap-prune-cache nnimap-request-list-method nnimap-retrieve-groups-asynchronous nnimap-search-uids-not-since-is-evil nnimap-server-address nnimap-server-buffer nnimap-server-buffer-alist nnimap-split-crosspost nnimap-split-download-body nnimap-split-inbox nnimap-split-predicate nnimap-split-rule nnimap-version nnir-imap-search-field nnir-mail-backend nnir-search-engine nnir-wais-database nnir-wais-program nnir-wais-remove-prefix nnkiboze-current-group nnkiboze-directory nnkiboze-ephemeral nnkiboze-file-coding-system nnkiboze-headers nnkiboze-level nnkiboze-regexp nnkiboze-remove-read-articles nnkiboze-scores nnkiboze-status-string nnkiboze-version nnlistserv-directory nnlistserv-ephemeral-p nnlistserv-name nnlistserv-search nnlistserv-type-definition nnrss-extra-categories nnrss-moreover-url nnrss-wash-html-in-text-plain-parts nnslashdot-active-url nnslashdot-article-url nnslashdot-backslash-url nnslashdot-buffer nnslashdot-comments-url nnslashdot-directory nnslashdot-group-number nnslashdot-groups nnslashdot-headers nnslashdot-login-name nnslashdot-password nnslashdot-threaded nnslashdot-threshold nnslashdot-use-front-page nnsoup-active-file nnsoup-always-save nnsoup-article-alist nnsoup-buffers nnsoup-current-group nnsoup-current-prefix nnsoup-directory nnsoup-group-alist nnsoup-group-alist-touched nnsoup-old-functions nnsoup-packer nnsoup-packet-directory nnsoup-packet-regexp nnsoup-replies-directory nnsoup-replies-format-type nnsoup-replies-index-type nnsoup-replies-list nnsoup-status-string nnsoup-tmp-directory nnsoup-unpacker nnsoup-version nntp-async-needs-kluge nntp-ssl-program nnultimate-address nnultimate-articles nnultimate-directory nnultimate-groups nnultimate-groups-alist nnultimate-headers nnultimate-table-regexp nnwarchive-address nnwarchive-article-dissect nnwarchive-article-offset nnwarchive-article-url nnwarchive-authentication nnwarchive-backlog-articles nnwarchive-backlog-hashtb nnwarchive-buffer nnwarchive-caesar-translation-table nnwarchive-default-type nnwarchive-directory nnwarchive-groups nnwarchive-headers nnwarchive-headers-cache nnwarchive-keep-backlog nnwarchive-list-dissect nnwarchive-list-groups nnwarchive-list-url nnwarchive-login nnwarchive-nov-is-evil nnwarchive-open-dissect nnwarchive-open-url nnwarchive-passwd nnwarchive-type nnwarchive-type-definition nnwarchive-version nnwarchive-xover-dissect nnwarchive-xover-files nnwarchive-xover-last-url nnwarchive-xover-page-size nnwarchive-xover-url nnwfm-address nnwfm-articles nnwfm-directory nnwfm-groups nnwfm-groups-alist nnwfm-headers nnwfm-table-regexp nxml-mode-hook octave-auto-indent octave-auto-newline octave-block-begin-or-end-regexp octave-block-begin-regexp octave-block-else-or-end-regexp octave-block-else-regexp octave-block-end-regexp octave-block-match-alist old-face-font-rescale-alist org-agenda-columns-remove-prefix-from-item org-agenda-filter org-agenda-filter-overlays org-agenda-include-all-todo org-auto-renumber-ordered-lists org-clock-left-over-time org-export-blocks-postblock-hooks org-export-html-auto-postamble org-export-html-auto-preamble org-export-html-title-format org-export-latex-header-defs-re org-export-latex-use-verb org-footnote-label-history org-html-entities org-include-all-loc org-indent-fix-section-after-idle-time org-indent-outline-re org-latex-entities-exceptions org-list-beginning-re org-looking-at-done-regexp org-nl-done-regexp org-provide-checkbox-statistics org-publish-files-alist org-tab-ind-state org-timer-last-timer org-timer-timer1 org-timer-timer2 org-timer-timer3 orig-argi overriding-map-is-bound pcmpl-gnu-tar-buffer perl-font-lock-syntactic-keywords pred prolog-font-lock-keywords prolog-mode-menu python-default-interpreter python-file-queue python-font-lock-syntactic-keywords python-jython-command-args python-python-command-args python-shell-map python-which-args python-which-bufname python-which-shell rcirc-browse-url-map rcirc-nick-completion-start-offset rcirc-nick-completions reftex-index-phrases-mode-hook result rfc1843-old-gnus-decode-header-function rmail-last-file ruby-font-lock-syntactic-keywords ruby-here-doc-end-re self-insert-face self-insert-face-command semantic-minor-modes-status sgml-font-lock-syntactic-keywords sh-font-lock-syntactic-keywords sh-here-doc-markers sh-here-doc-re sh-mode-default-syntax-table sh-require-final-newline sh-st-symbol sha1-maximum-internal-length sha1-use-external sieve-manage-default-user sieve-manage-password sieve-manage-username simula-font-lock-syntactic-keywords smtpmail-auth-credentials smtpmail-starttls-credentials spam-stat-install-hooks splice stack-trace-on-error symbol-file-load-history-loaded tcl-font-lock-syntactic-keywords tex-font-lock-syntactic-keywords texinfo-font-lock-syntactic-keywords tramp-cache-inhibit-cache tramp-file-name-handler-alist tramp-fish-continue-prompt-regexp tramp-fish-error-prompt-regexp tramp-fish-file-name-handler-alist tramp-fish-method tramp-fish-ok-prompt-regexp tramp-fish-start-fish-server-command tramp-imap-file-name-handler-alist tramp-imap-method tramp-imap-passphrase tramp-imap-passphrase-cache tramp-imap-subject-marker tramp-imaps-method tramp-root-regexp translations ucs-completions url-cache-expired url-current-referer vc-header-alist vc-path verilog-fork-wait-re webmail-address webmail-article-snarf webmail-article-url webmail-articles webmail-aux webmail-buffer webmail-buffer-list webmail-debug-file webmail-error-function webmail-list-snarf webmail-list-url webmail-login-snarf webmail-login-url webmail-move-to-trash-can webmail-newmail-only webmail-open-snarf webmail-open-url webmail-paranoid webmail-post-process webmail-session webmail-trash-url webmail-type webmail-type-definition webmail-variables webmail-version widget-complete-field x-alternatives-map x-menu-assoc-buffer x-menu-item-spacing x-menu-item-width x-menu-items-alist x-menu-items-per-line x-menu-max-width x-select-enable-clipboard) - (added *org-babel-use-quick-and-dirty-noweb-expansion* *org-bibtex-entries* 5x5-solver-output :=key= :=type= :R-dev-args :aborted-p :actions :actual-position :added :after-hook :alias-table :alt :always-active :always-query-capabilities :anchor :any :app-icon :app-name :article :attributes :auto-sitemap :backend :backtrace :bail :beamer-frame-level :beamer-header-extra :begin-marker :bg :bgcolor :binddn :binding :bmp :body :body-brevity-p :body-end :body-span :body-start :book :booklet :boolean :border :brief :buf :bullet :callback :callbacks :capabilities :capability-command :caption :capture-output :captured-entry-size :case-sensitive :cbargs :cbtrans :cert :chapter :char :classname :client-certificate :clock-in :clock-keep :clock-resume :cmd :cmd-line :cmdline :cmpflag :colname-names :colnames :colormodel :column :column-sizes :commands :compact :completion :completion-column :completion-object :completions :completions-function :compression :condition :conference :constraint-flag :constraintp :continue :corrupt-property :create-function :crlfiles :crossref :csep :csv :cue-span :current-test :custom-style :cvsargs :date-timestamp :date-timestamp-inactive :db :decorate-body :decorate-cue :decorate-guides :decorate-icon :decorate-item-span :default-face :default-face-attributes :default-time :defines :deleted :depth :desktop-entry :dirs :distinctive-end :distinctive-start :does-encrypt :dont-change-disc :dormant-flag :dormant-p :echo :edition :effective-date :element-type :elements :email-info :emits-signal :empty-lines :encoding :encryption :end-marker :end-of-capability :end-of-command :end-time :engine :errorback :ert-debug-on-error :exact-position :examined :exclude-subtypes :exclusive :exit-continuation :exit-function :expanded :expanded-p :expected :expected-result :expected-result-type :explanation :exports :exposed :extended-printer-limits-p :fail-reason :failed :failed-expected :failed-unexpected :faults :fgcolor :files :fileskip0 :filetype :filter-dirs-flag :fit :fonts :for-backend :force :form :found :free-software :fun-body :gap-face :gap-ok-around :get-file-name :greeting :guide-column-flags :guides-span :has-subitems :help-eval-error :hidden-p :hidden-states :horizontal :hostname :howpublished :href :hrule :html-postamble :html-preamble :icon-end :icon-span :icon-start :icon-state :icount :ignore-on-open-all :ignore-on-read-text :image-data :image-path :imagemagick :iminoptions :immediate-finish :imoutoptions :in-file :inbook :includes :incollection :infos :ingroup :inherit-props :inhibit-cookiesp :initial-resync :initial-target-position :initial-target-region :initial-value :inproceedings :input :input-filter :insert-func :insertion-point :institution :interrupted-clock :irrelevant :is-container :is-encrypted :java :jpeg :jpg :jump-func :keylist :kill-buffer :kind :labels-face :lang-words :last-command-time :last-decorated-tick :latex-class-options :lines :list :list-all :list-table :loaded-from :location :log-agent :loglevel :long-face :macro-property :main :makeindex :manual :mastersthesis :match-number :mathjax :max :max-duration :max-gap :max-hard :max-soft :member :message-id-no-brackets :messages :min-duration :min-prime-bits :minlevel :misc :missing :mkdirp :most-recent-result :multiple\? :namespace-tag :namespaces :narrow :new-buffer :newlinep :next-debugger :next-redisplay :nillable\? :no-end-time-face :no-expand :nobr :noeval :noexist :non-existent :norecord :noshow :not-owner :note :noweb :noweb-ref :noweb-sep :nullvalue :odt-styles-file :on-action :on-close :one :one-file-with-archives :open-hook :operation :operations :optional :org-clock-force-headline-inclusion :organization :orig-eqn :origin :original-buffer :original-file :original-file-nondirectory :out-file :output :overlap-face :package :packages :padline :padnewline :pagecentre :paper :parameter-order :parse-item :parts :passed :passed-expected :passed-unexpected :pcase--dontcare :pcase--fail :pcase--succeed :pdf :pdfheight :pdfpng :pdfwidth :phdthesis :png :pointsize :populous-p :port-type :ports :pos :position-for-last-stored :poster :postproc :pre-triggered :precious :prepend :preprocess :print-func :priority-string :proceedings :prompt-cont-regexp :prompt-length :prompt-regexp :prompt-time :properties :prune-factor :ps :quality :readonly :recipients :redecorate :refstr :regex :rel-width :released :remove-newlines :replaces-id :required :res :result :result-params :result-type :results :results_switches :return :return-list :return-to-wconf :right-align :rotation :row-properties :rowname-names :rownames :rows :sample-indent :save :save-function :scan-depth :scheme :school :search-function :secret :secrets :select-result :selector :service-url :ses-Dijkstra-attempt :ses-repair-reference :shebang :shell-command :shifted :short-face :should-forms :show-all-attributes :shown-value :silentp :sitemap-alphabetically :sitemap-date-format :sitemap-file-entry-format :sitemap-filename :sitemap-function :sitemap-ignore-case :sitemap-sans-extension :sitemap-sort-files :sitemap-sort-folders :sitemap-style :sitemap-title :soap-action :sound-file :sound-name :span-overlay :sqli-comint-func :sqli-options :sqli-program :src :standard :starttls-function :statement :status :stdin :stepskip0 :stream-type :string :struct :stub-flag :stubp :success :suppress-sound :svg :table-line-pos :tangle :target-entry-p :tasks :tcolumns :techreport :term :terminal :terminator :test-end-times :test-map :test-results :test-start-times :tests :theme-name :tiff :tracked :tracker :tree :tree-max-level :trustfiles :uint32 :undone-exposure :unexpected :units :unnarrowed :unpublished :urgency :use :use-starttls-if-possible :useDingbats :user-frame-params :var :verbosity :verify-error :verify-flags :verify-hostname-error :vert-only :was-brief :was-bullet :was-does-encrypt :was-expanded :was-guide-column-flags :was-has-subitems :was-is-encrypted :x :xmp-option :xslt :y Info-history-skip-intermediate-nodes Info-isearch-initial-history Info-isearch-initial-history-list Info-mode-syntax-table Man-name-local-regexp ada-on-ms-windows allout-after-copy-or-kill-hook allout-auto-save-temporarily-disabled allout-body-span-category allout-container-item-widget allout-cue-span-category allout-cue-span-keymap allout-escaped-prefix-regexp allout-escapes-category allout-flattened-numbering-abbreviation allout-guides-category allout-guides-span-category allout-icon-span-category allout-inhibit-auto-fill-on-headline allout-inhibit-body-modification-hook allout-item-body-keymap allout-item-icon-keymap allout-just-did-undo allout-mode-map-value allout-mode-off-hook allout-mode-on-hook allout-post-undo-hook allout-prefixed-keybindings allout-span-to-category allout-structure-unruly-deletion-message allout-this-command-hid-text allout-trailing-category allout-undo-exposure-in-progress allout-unprefixed-keybindings allout-unresolved-body-mod-workroster allout-widgets-adjust-message-length-threshold allout-widgets-adjust-message-size-threshold allout-widgets-auto-activation allout-widgets-changes-record allout-widgets-hook-error-post-time allout-widgets-icon-types allout-widgets-icons-cache allout-widgets-icons-dark-subdir allout-widgets-icons-light-subdir allout-widgets-item-image-properties-emacs allout-widgets-item-image-properties-xemacs allout-widgets-last-decoration-timing allout-widgets-last-hook-error allout-widgets-maintain-tally allout-widgets-mode allout-widgets-mode-inhibit allout-widgets-reenable-before-change-handler allout-widgets-run-unit-tests-on-load allout-widgets-tally allout-widgets-theme-dark-background allout-widgets-theme-light-background allout-widgets-time-decoration-activity allout-widgets-track-decoration allout-widgets-undo-exposure-record allout-widgets-unset-inhibit-read-only allout-widgets-version animation-buffer-name ansi-color-apply-face-function appt-warning-time-regexp archive-7z-expunge archive-7z-extract archive-7z-update artist-menu-map auth-source-backend auth-source-cache-expiry auth-source-creation-defaults auth-source-creation-prompts auth-source-gpg-encrypt-to auth-source-magic auth-source-netrc-cache auth-source-netrc-use-gpg-tokens auth-source-passphrase-alist auth-source-save-behavior authors-ambiguous-files autoconf-mode-abbrev-table battery-mode-line-limit bdf-cache bdf-cache-file bibtex-BibTeX-entry-alist bibtex-BibTeX-field-alist bibtex-biblatex-entry-alist bibtex-biblatex-field-alist bibtex-dialect bibtex-dialect-list bibtex-entry-alist bibtex-field-alist bibtex-mode-abbrev-table bibtex-no-opt-remove-re bibtex-search-buffer bibtex-search-entry-globally bidi-display-reordering bidi-paragraph-direction blink-matching-check-function bookmark-after-jump-hook bookmark-alist bookmark-alist-modification-count bookmark-annotation-name bookmark-automatically-show-annotations bookmark-bmenu-file-column bookmark-bmenu-header-height bookmark-bmenu-hidden-bookmarks bookmark-bmenu-marks-width bookmark-bmenu-mode-abbrev-table bookmark-bmenu-mode-map bookmark-bmenu-mode-syntax-table bookmark-bmenu-toggle-filenames bookmark-completion-ignore-case bookmark-current-bookmark bookmark-current-buffer bookmark-default-file bookmark-edit-annotation-mode-map bookmark-edit-annotation-text-func bookmark-end-of-version-stamp-marker bookmark-exit-hook bookmark-exit-hooks bookmark-file-format-version bookmark-history bookmark-load-hook bookmark-make-record-function bookmark-menu-length bookmark-minibuffer-read-name-map bookmark-quit-flag bookmark-read-annotation-text-func bookmark-search-delay bookmark-search-size bookmark-sort-flag bookmark-version-control bookmark-yank-point bookmarks-already-loaded browse-url-chromium-arguments browse-url-chromium-program browse-url-mailto-function buffer-list-update-hook byte-compile--lexical-environment byte-compile-global-not-obsolete-vars byte-compile-log-buffer byte-compile-reserved-constants byte-compile-tmp-var byte-discardN byte-discardN-preserve-tos byte-interactive-p-OBSOLETE byte-save-window-excursion-OBSOLETE byte-stack-ref byte-stack-set byte-stack-set2 byte-temp-output-buffer-setup-OBSOLETE byte-temp-output-buffer-show-OBSOLETE c-annotation-face c-before-context-fontification-functions c-before-font-lock-functions c-cpp-delimiter c-cpp-expr-intro-re c-defun-tactic c-enums-contain-decls c-font-lock-context c-get-state-before-change-functions c-guess-accumulator c-guess-conversions c-guess-guessed-basic-offset c-guess-guessed-offsets-alist c-guess-offset-threshold c-guess-region-max c-has-bitfields c-in-after-change-fontification c-line-comment-start-regexp c-macro-cache c-macro-cache-start-pos c-macro-cache-syntactic c-macro-names-with-semicolon c-macro-with-semi-re c-no-parens-syntax-table c-nonlabel-token-2-key c-not-primitive-type-keywords-regexp c-opt-cpp-macro-define c-opt-cpp-symbol c-parse-state-state c-standard-font-lock-fontify-region-function c-state-brace-pair-desert c-state-cache-too-far c-state-min-scan-pos c-state-nonlit-pos-cache c-state-nonlit-pos-cache-limit c-state-nonlit-pos-interval c-state-old-cpp-beg c-state-old-cpp-end c-state-point-min c-state-point-min-lit-start c-state-point-min-lit-type c-state-semi-nonlit-pos-cache c-state-semi-nonlit-pos-cache-limit c-symbol-chars c-typedef-decl-key c-typedef-key calc-highlight-selections-with-faces calc-lu-field-reference calc-lu-power-reference calc-note-threshold calc-option-flag calculator-mode-abbrev-table calculator-mode-syntax-table cconv--dummy-var cconv-liftwhen cfengine-mode-debug cfengine2-actions cfengine2-font-lock-keywords cfengine2-imenu-expression cfengine2-mode-abbrev-table cfengine2-mode-map cfengine2-mode-syntax-table cfengine3-category-regex cfengine3-class-selector-regex cfengine3-defuns cfengine3-defuns-regex cfengine3-font-lock-keywords cfengine3-mode-abbrev-table cfengine3-mode-map cfengine3-mode-syntax-table cfengine3-vartypes change-major-mode-after-body-hook char-acronym-table chart-mode-abbrev-table chart-mode-map chart-mode-syntax-table cl-struct-avl-tree--stack-tags cl-struct-compilation--message-tags cl-struct-ert--ewoc-entry-tags cl-struct-ert--stats-tags cl-struct-ert--test-execution-info-tags cl-struct-ert-test-aborted-with-non-local-exit-tags cl-struct-ert-test-failed-tags cl-struct-ert-test-passed-tags cl-struct-ert-test-quit-tags cl-struct-ert-test-result-tags cl-struct-ert-test-result-with-condition-tags cl-struct-ert-test-tags cl-struct-gdb-table-tags cl-struct-nnimap-tags cl-struct-registerv-tags cl-struct-soap-array-type-tags cl-struct-soap-basic-type-tags cl-struct-soap-binding-tags cl-struct-soap-bound-operation-tags cl-struct-soap-element-tags cl-struct-soap-message-tags cl-struct-soap-namespace-link-tags cl-struct-soap-namespace-tags cl-struct-soap-operation-tags cl-struct-soap-port-tags cl-struct-soap-port-type-tags cl-struct-soap-sequence-element-tags cl-struct-soap-sequence-type-tags cl-struct-soap-wsdl-tags cl-struct-url-future-tags cl-struct-url-queue-tags color-cie-ε color-cie-κ color-d65-xyz compilation--parsed compilation--previous-directory-cache compilation-filter-hook compilation-filter-start compilation-save-buffers-predicate completing-read-function completion--capf-misbehave-funs completion--capf-safe-funs completion--cycling-threshold-type completion--styles-type completion-category-overrides completion-cycle-threshold completion-cycling completion-extra-properties completion-fail-discreetly completion-in-region--data completion-in-region-mode completion-in-region-mode--predicate completion-in-region-mode-map completion-in-region-mode-predicate completion-list-insert-choice-function completion-pcm-complete-word-inserts-delimiters completion-show-inline-help copyright-year-ranges cpp-edit-mode-abbrev-table cpp-edit-mode-map cpp-edit-mode-syntax-table css-proprietary-nmstart-re custom--inhibit-theme-enable custom-face-edit custom-safe-themes custom-search-field custom-theme--listed-faces custom-theme--migrate-settings custom-theme-allow-multiple-selections custom-theme-choose-mode-abbrev-table custom-theme-choose-mode-map custom-theme-choose-mode-syntax-table custom-theme-description custom-theme-insert-face-marker custom-theme-insert-variable-marker custom-theme-load-path cvs-add-default-message cvs-add-flags cvs-auto-remove-directories cvs-auto-remove-handled cvs-auto-revert cvs-branch-prefix cvs-branch-prefix-cps cvs-branches cvs-buffer cvs-buffer-name cvs-buffer-name-alist cvs-checkout-flags cvs-cleanup-functions cvs-commit-flags cvs-confirm-removals cvs-cursor-column cvs-cvs-flags cvs-cvsrc-file cvs-cvsroot cvs-default-ignore-marks cvs-diff-buffer-name cvs-diff-flags cvs-diff-ignore-marks cvs-execute-single-dir cvs-find-file-and-jump cvs-force-command cvs-force-command-cps cvs-force-dir-tag cvs-from-vc cvs-idiff-imerge-handlers cvs-idiff-version cvs-ignore-marks-alternatives cvs-ignore-marks-modif cvs-ignore-marks-modif-cps cvs-invert-ignore-marks cvs-lock-file cvs-lock-file-regexp cvs-log-flags cvs-menu cvs-minor-mode cvs-minor-mode-map cvs-minor-mode-prefix cvs-minor-wrap-function cvs-mode-abbrev-table cvs-mode-commit-hook cvs-mode-diff-map cvs-mode-hook cvs-mode-line-process cvs-mode-map cvs-mode-syntax-table cvs-pcl-cvs-dirchange-re cvs-postprocess cvs-qtypedesc-tag cvs-remove-flags cvs-reuse-cvs-buffer cvs-secondary-branch-prefix cvs-secondary-branch-prefix-cps cvs-shared-flags cvs-shared-start cvs-sort-ignore-file cvs-status-flags cvs-tag-flags cvs-tag-history cvs-tag-name cvs-temp-buffer cvs-temp-buffer-name cvs-temp-buffers cvs-update-flags cvs-vendor-branch dcl-mode-abbrev-table debug-on-event debugger-args delayed-warnings-hook delayed-warnings-list delete-active-region desktop-after-read-hook desktop-base-file-name desktop-base-lock-name desktop-basefilename desktop-buffer-args-list desktop-buffers-not-to-save desktop-clear-preserve-buffers desktop-delay-hook desktop-dirname desktop-file-modtime desktop-file-name-format desktop-files-not-to-save desktop-globals-to-clear desktop-globals-to-save desktop-header desktop-lazy-idle-delay desktop-lazy-timer desktop-lazy-verbose desktop-minor-mode-table desktop-missing-file-warning desktop-modes-not-to-save desktop-no-desktop-file-hook desktop-not-loaded-hook desktop-path desktop-restore-eager desktop-save-hook diary-comment-end diary-comment-start dired-default-directory-alist dired-omit-verbose display-buffer--action-custom-type display-buffer--action-function-custom-type display-buffer--other-frame-action display-buffer--same-window-action display-buffer-alist display-buffer-base-action display-buffer-fallback-action display-buffer-overriding-action display-time-world-mode-abbrev-table display-time-world-mode-syntax-table doc-view-image-width doc-view-unoconv-program dos-register-name-alist dynamic-library-alist ebrowse-electric-list-mode-abbrev-table ebrowse-electric-list-mode-syntax-table ebrowse-electric-position-mode-abbrev-table ebrowse-electric-position-mode-syntax-table ebrowse-member-mode-abbrev-table ebrowse-member-mode-syntax-table ebrowse-tree-mode-abbrev-table ebrowse-tree-mode-syntax-table electric-help-orig-major-mode electric-indent-chars electric-indent-functions electric-indent-mode electric-layout-mode electric-layout-rules electric-pair-mode electric-pair-pairs electric-pair-skip-self emacs-lock--old-mode emacs-lock--try-unlocking emacs-lock-default-locking-mode emacs-lock-mode emacs-lock-unlockable-modes epa-file-error erc--autojoin-timer erc-autojoin-delay erc-autojoin-timing erc-coding-system-precedence erc-dcc-chat-mode-abbrev-table erc-dcc-chat-mode-syntax-table erc-message-english-s671 erc-server-671-functions ert--current-run-stats ert--find-test-regexp ert--gensym-counter ert--infos ert--running-tests ert--selector-history ert--should-execution-observer ert--test-buffers ert-batch-backtrace-right-margin ert-debug-on-error ert-results-mode-abbrev-table ert-results-mode-map ert-results-mode-menu ert-results-mode-syntax-table ert-simple-view-mode-abbrev-table ert-simple-view-mode-map ert-simple-view-mode-syntax-table ert-test-run-redisplay-interval-secs ert-unload-hook eshell-ls-date-format ess-ask-for-ess-directory ess-local-process-name f90-critical-indent facemenu-self-insert-data feedmail-binmail-gnulinuxish-template feedmail-debug feedmail-debug-sit-for feedmail-display-full-frame feedmail-queue-buffer-file-name feedmail-queue-express-hook feedmail-queue-slug-suspect-regexp feedmail-sendmail-f-doesnt-sell-me-out file-name-version-regexp filesets-be-docile-flag filesets-browse-dir-function filesets-cache-fill-content-hooks filesets-cache-hostname-flag filesets-cache-save-often-flag filesets-commands filesets-data filesets-external-viewers filesets-find-file-delay filesets-ingroup-patterns filesets-max-entry-length filesets-max-submenu-length filesets-menu-cache-contents filesets-menu-cache-file filesets-open-file-function filesets-query-user-limit filesets-save-buffer-function filesets-sort-case-sensitive-flag filesets-sort-menu-flag filesets-tree-max-level filter-buffer-substring-functions find-exec-terminator finder--builtins-alist finder-keywords-hash footnote-unicode-regexp footnote-unicode-string frame-auto-hide-function fringe-styles gdb-breakpoints-list gdb-breakpoints-mode-abbrev-table gdb-breakpoints-mode-syntax-table gdb-buf-publisher gdb-buffer-rules gdb-control-commands-regexp gdb-control-level gdb-disassembly-font-lock-keywords gdb-disassembly-mode-abbrev-table gdb-disassembly-mode-map gdb-disassembly-mode-syntax-table gdb-disassembly-position gdb-filter-output gdb-first-done-or-error gdb-frames-font-lock-keywords gdb-frames-mode-abbrev-table gdb-frames-mode-syntax-table gdb-gud-control-all-threads gdb-handler-alist gdb-handler-number gdb-last-command gdb-locals-mode-abbrev-table gdb-locals-mode-syntax-table gdb-memory-columns gdb-memory-header gdb-memory-last-address gdb-memory-mode-abbrev-table gdb-memory-mode-syntax-table gdb-memory-next-page gdb-memory-prev-page gdb-memory-rows gdb-non-stop gdb-non-stop-setting gdb-prompt-name gdb-prompt-name-regexp gdb-registers-header gdb-registers-mode-abbrev-table gdb-registers-mode-syntax-table gdb-running-threads-count gdb-script-syntax-propertize-function gdb-selected-file gdb-selected-line gdb-show-threads-by-default gdb-stack-buffer-addresses gdb-stack-buffer-locations gdb-stopped-functions gdb-stopped-threads-count gdb-supports-non-stop gdb-switch-reasons gdb-switch-when-another-stopped gdb-thread-buffer-addresses gdb-thread-buffer-arguments gdb-thread-buffer-locations gdb-thread-buffer-verbose-names gdb-thread-number gdb-thread-position gdb-threads-header gdb-threads-list gdb-threads-mode-abbrev-table gdb-threads-mode-syntax-table gdb-token-number gdbmi-record-list glasses-separate-capital-groups global-hl-line-sticky-flag global-semantic-decoration-mode global-semantic-mru-bookmark-mode global-srecode-minor-mode glyphless-char-display glyphless-char-display-control gnus-action-message-log gnus-after-set-mark-hook gnus-agent-article-local-times gnus-article-date-headers gnus-article-update-date-headers gnus-async-post-fetch-function gnus-auto-subscribed-categories gnus-backend-trace gnus-before-update-mark-hook gnus-blocked-images gnus-browse-subscribe-newsgroup-method gnus-bug-package gnus-completing-read-function gnus-completion-styles gnus-demon-timers gnus-extended-servers gnus-gravatar-properties gnus-gravatar-size gnus-gravatar-too-ugly gnus-html-displayed-image-map gnus-html-frame-width gnus-html-image-automatic-caching gnus-html-image-cache-ttl gnus-html-image-map gnus-inhibit-article-treatments gnus-inhibit-images gnus-lrm-string gnus-max-image-proportion gnus-mime-buttonized-part-id gnus-newsgroup-highest gnus-parameter-list-identifier-alist gnus-picon-inhibit-top-level-domains gnus-refer-thread-use-nnir gnus-registry-cache-file gnus-registry-db gnus-registry-default-mark gnus-registry-dirty gnus-registry-enabled gnus-registry-extra-entries-precious gnus-registry-install gnus-registry-marks gnus-registry-max-entries gnus-registry-max-pruned-entries gnus-registry-minimum-subject-length gnus-registry-misc-menus gnus-registry-split-strategy gnus-registry-track-extra gnus-registry-unfollowed-addresses gnus-registry-unfollowed-groups gnus-registry-unload-hook gnus-summary-stop-at-end-of-message gnus-sync-backend gnus-sync-global-vars gnus-sync-newsrc-groups gnus-sync-newsrc-loader gnus-sync-newsrc-offsets gnus-sync-unload-hook gnus-topic-history gnus-treat-date gnus-treat-from-gravatar gnus-treat-mail-gravatar gnus-url-button-commands gnus-url-button-map gnus-url-button-menu gnus-widen-article-window gnutls-algorithm-priority gnutls-log-level gnutls-min-prime-bits gnutls-trustfiles gomoku-OOOOscore gomoku-OOOscore gomoku-OOscore gomoku-Oscore gomoku-XXXXscore gomoku-XXXscore gomoku-XXscore gomoku-Xscore gomoku-losing-threshold gomoku-mode-abbrev-table gomoku-mode-syntax-table gomoku-nil-score gravatar-automatic-caching gravatar-base-url gravatar-cache-ttl gravatar-rating gravatar-size grep-first-column gssapi-program gud-gdb-completion-function help-mode-abbrev-table help-mode-syntax-table hexl-mode--old-var-vals hfy-begin-span-handler hfy-end-span-handler hfy-face-to-css idlwave-help-mode-abbrev-table idlwave-help-mode-syntax-table idlwave-shell-mode-syntax-table ido-auto-merge-timer ido-before-fallback-functions ido-buffer-completion-map ido-buffer-history ido-common-completion-map ido-common-match-string ido-completion-map ido-current-directory ido-dir-file-cache ido-eoinput ido-everywhere ido-exit ido-file-completion-map ido-file-dir-completion-map ido-file-history ido-ignore-item-temp-list ido-incomplete-regexp ido-initial-position ido-input-stack ido-last-directory-list ido-matches ido-minor-mode-map-entry ido-read-file-name-as-directory-commands ido-read-file-name-non-ido ido-report-no-match ido-rescan ido-rotate ido-save-directory-list-file ido-text ido-text-init ido-trace-enable ido-use-mycompletion-depth ido-use-virtual-buffers ido-virtual-buffers ido-work-directory-list ido-work-file-list ignore-window-parameters image-animate-loop image-animated-types image-dired-append-when-browsing image-dired-cmd-create-standard-thumbnail-command image-dired-cmd-create-temp-image-options image-dired-cmd-create-temp-image-program image-dired-cmd-create-thumbnail-options image-dired-cmd-create-thumbnail-program image-dired-cmd-pngcrush-program image-dired-cmd-pngnq-program image-dired-cmd-read-exif-data-options image-dired-cmd-read-exif-data-program image-dired-cmd-rotate-original-options image-dired-cmd-rotate-original-program image-dired-cmd-rotate-thumbnail-options image-dired-cmd-rotate-thumbnail-program image-dired-cmd-write-exif-data-options image-dired-cmd-write-exif-data-program image-dired-db-file image-dired-dir image-dired-dired-disp-props image-dired-display-image-buffer image-dired-display-image-mode-abbrev-table image-dired-display-image-mode-map image-dired-display-image-mode-syntax-table image-dired-display-properties-format image-dired-display-window-height-correction image-dired-display-window-width-correction image-dired-external-viewer image-dired-file-comment-list image-dired-file-tag-list image-dired-gallery-dir image-dired-gallery-hidden-tags image-dired-gallery-image-root-url image-dired-gallery-thumb-image-root-url image-dired-line-up-method image-dired-main-image-directory image-dired-rotate-original-ask-before-overwrite image-dired-saved-window-configuration image-dired-show-all-from-dir-max-files image-dired-slideshow-count image-dired-slideshow-timer image-dired-slideshow-times image-dired-tag-file-list image-dired-temp-image-file image-dired-temp-rotate-image-file image-dired-thumb-height image-dired-thumb-margin image-dired-thumb-relief image-dired-thumb-size image-dired-thumb-width image-dired-thumbnail-buffer image-dired-thumbnail-mode-abbrev-table image-dired-thumbnail-mode-line-up-map image-dired-thumbnail-mode-map image-dired-thumbnail-mode-syntax-table image-dired-thumbnail-mode-tag-map image-dired-thumbnail-storage image-dired-thumbs-per-row image-dired-track-movement image-dired-widget-list image-library-alist image-transform-resize image-transform-rotation imagemagick-types-inhibit indian-itrans-v5-table-for-tamil inferior-lisp-mode-abbrev-table inferior-lisp-mode-syntax-table inferior-octave-mode-abbrev-table info-xref-bad info-xref-filename info-xref-good info-xref-in-progress info-xref-output-buffer info-xref-output-heading info-xref-unavail info-xref-xfile-alist inhibit-local-variables-regexps inhibit-local-variables-suffixes isearch-face isearch-lazy-highlight-word isearch-update-post-hook jka-compr-verbose js-curly-indent-offset js-paren-indent-offset js-square-indent-offset kbd-macro-termination-hook landmark-8-directions landmark-board landmark-board-height landmark-board-width landmark-bound landmark-c landmark-c-naught landmark-cx landmark-cy landmark-debug landmark-directions landmark-draw-limit landmark-emacs-is-computing landmark-emacs-played-first landmark-emacs-won landmark-ew landmark-font-lock-keywords landmark-game-history landmark-game-in-progress landmark-human-refused-draw landmark-human-took-back landmark-initial-w0 landmark-initial-wij landmark-losing-threshold landmark-m landmark-max-stall-time landmark-mode-hook landmark-mode-map landmark-n landmark-nil-score landmark-no-payoff landmark-ns landmark-number-of-draws landmark-number-of-emacs-wins landmark-number-of-human-moves landmark-number-of-human-wins landmark-number-of-moves landmark-number-of-trials landmark-nvar landmark-one-moment-please landmark-output-moves landmark-saved-board-height landmark-saved-board-width landmark-saved-score-table landmark-score-table landmark-score-trans-table landmark-square-height landmark-square-width landmark-sum-of-moves landmark-tree-r landmark-vector-length landmark-winning-threshold landmark-x-offset landmark-y-offset latex-electric-env-pair-mode lexical-binding lisp-indent-lambda-list-keywords-regexp lisp-lambda-list-keyword-alignment lisp-lambda-list-keyword-parameter-alignment lisp-lambda-list-keyword-parameter-indentation list-colors-sort list-dynamic-libraries--loaded-only-p load-path-shadows-font-lock-keywords load-path-shadows-mode-abbrev-table load-path-shadows-mode-map load-path-shadows-mode-syntax-table log-view-expanded-log-entry-function ly-OSX-ly-path ly-OSX-midi-path ly-OSX-pdf-path ly-arrange-mode ly-compile-post-tangle ly-display-pdf-post-tangle ly-gen-html ly-gen-png ly-gen-svg ly-nix-ly-path ly-nix-midi-path ly-nix-pdf-path ly-play-midi-post-tangle ly-use-eps ly-win32-ly-path ly-win32-midi-path ly-win32-pdf-path m2-mode-abbrev-table m2-smie-grammar mail-dont-reply-to-names mail-encode-mml mail-return-action mail-source-incoming-last-checked-time makefile-syntax-propertize-function math-logunits math-notes menu-bar-select-buffer-function mercury-mode-abbrev-table mercury-mode-map mercury-mode-syntax-table message-cite-reply-position message-cite-style message-cite-style-gmail message-cite-style-outlook message-cite-style-thunderbird message-inhibit-ecomplete message-prune-recipient-rules message-return-action meta-common-mode-map meta-common-mode-syntax-table metafont-mode-abbrev-table metafont-mode-map metafont-mode-syntax-table metapost-mode-abbrev-table metapost-mode-map metapost-mode-syntax-table minibuffer-inactive-mode-map minibuffer-inactive-mode-syntax-table mixal-syntax-propertize-function mm-extra-numeric-entities mm-image-load-path-cache mm-inline-large-images-proportion mml-enable-flowed mml-inhibit-compute-boundary mml2015-sign-with-sender mouse-sel-primary-overlay mpc--find-memoize-union-tags msb-after-load-hooks nato-alphabet netrc-cache netrc-file nndoc-header-transform-function nndoc-pre-dissection-function nnheader-last-message-time nnimap-connection-alist nnimap-current-infos nnimap-expunge nnimap-fetch-partial-articles nnimap-inbox nnimap-incoming-split-list nnimap-inhibit-logging nnimap-keepalive-timer nnimap-mark-alist nnimap-object nnimap-process nnimap-process-buffers nnimap-quirks nnimap-record-commands nnimap-sequence nnimap-shell-program nnimap-split-methods nnimap-status-string nnimap-streaming nnimap-unsplittable-articles nnimap-user nnir-address nnir-extra-parms nnir-ignored-newsgroups nnir-imap-default-search-key nnir-imap-search-other nnir-method-default-engines nnir-notmuch-additional-switches nnir-notmuch-program nnir-notmuch-remove-prefix nnir-retrieve-headers-override-function nnir-search-history nnir-summary-line-format nnmail-inhibit-default-split-group nnml-incremental-nov-buffer-alist nnregistry-within-nnregistry nntp-retrieval-in-progress non-essential notifications-action-signal notifications-application-icon notifications-application-name notifications-close-notification-method notifications-closed-reason notifications-closed-signal notifications-interface notifications-notify-method notifications-on-action-map notifications-on-action-object notifications-on-close-map notifications-on-close-object notifications-path notifications-service notifications-specification-version nxml-mode-abbrev-table nxml-mode-syntax-table nxml-parent-document obe-marker occur-collect-regexp-history occur-edit-mode-abbrev-table occur-edit-mode-map occur-edit-mode-syntax-table occur-menu-map occur-mode-abbrev-table occur-mode-syntax-table octave-continuation-marker-regexp octave-mode-abbrev-table octave-operator-regexp octave-operator-table octave-smie-bnf-table octave-smie-grammar org-adaptive-fill-regexp-backup org-agenda-before-sorting-filter-function org-agenda-bulk-custom-functions org-agenda-cat-filter-overlays org-agenda-category-filter org-agenda-category-filter-preset org-agenda-category-icon-alist org-agenda-clock-consistency-checks org-agenda-current-span org-agenda-current-time-string org-agenda-day-face-function org-agenda-entry-types org-agenda-filtered-by-category org-agenda-follow-indirect org-agenda-inactive-leader org-agenda-include-deadlines org-agenda-insert-diary-extract-time org-agenda-jump-prefer-future org-agenda-last-search-view-search-was-boolean org-agenda-menu-show-matcher org-agenda-menu-two-column org-agenda-move-date-from-past-immediately-to-today org-agenda-persistent-filter org-agenda-remove-timeranges-from-blocks org-agenda-search-view-always-boolean org-agenda-search-view-force-full-words org-agenda-show-current-time-in-grid org-agenda-skip-deadline-prewarning-if-scheduled org-agenda-skip-function-global org-agenda-tag-filter org-agenda-tag-filter-overlays org-agenda-tag-filter-preset org-agenda-tag-filter-while-redo org-agenda-time-leading-zero org-agenda-timegrid-use-ampm org-agenda-todo-ignore-timestamp org-agenda-write-buffer-name org-all-time-keywords org-alphabetical-lists org-archive-reversed-order org-archive-subtree-add-inherited-tags org-arg-loc org-attach-store-link-p org-babel-C++-compiler org-babel-C-compiler org-babel-R-command org-babel-R-eoe-indicator org-babel-R-eoe-output org-babel-R-write-object-command org-babel-after-execute-hook org-babel-awk-command org-babel-block-lob-one-liner-regexp org-babel-c-variant org-babel-capitalize-examplize-region-markers org-babel-common-header-args-w-values org-babel-data-names org-babel-default-header-args org-babel-default-header-args:C org-babel-default-header-args:R org-babel-default-header-args:asymptote org-babel-default-header-args:calc org-babel-default-header-args:clojure org-babel-default-header-args:css org-babel-default-header-args:ditaa org-babel-default-header-args:dot org-babel-default-header-args:emacs-lisp org-babel-default-header-args:fortran org-babel-default-header-args:gnuplot org-babel-default-header-args:haskell org-babel-default-header-args:js org-babel-default-header-args:latex org-babel-default-header-args:ledger org-babel-default-header-args:lilypond org-babel-default-header-args:lisp org-babel-default-header-args:matlab org-babel-default-header-args:maxima org-babel-default-header-args:mscgen org-babel-default-header-args:ocaml org-babel-default-header-args:octave org-babel-default-header-args:org org-babel-default-header-args:perl org-babel-default-header-args:plantuml org-babel-default-header-args:python org-babel-default-header-args:ruby org-babel-default-header-args:sass org-babel-default-header-args:scheme org-babel-default-header-args:screen org-babel-default-header-args:sh org-babel-default-header-args:shen org-babel-default-header-args:sql org-babel-default-header-args:sqlite org-babel-default-inline-header-args org-babel-default-lob-header-args org-babel-error-buffer-name org-babel-fortran-compiler org-babel-gnuplot-timestamp-fmt org-babel-hash-show org-babel-haskell-eoe org-babel-haskell-lhs2tex-command org-babel-header-arg-names org-babel-header-arg-names:R org-babel-header-arg-names:clojure org-babel-header-arg-names:lisp org-babel-header-arg-names:sql org-babel-header-arg-names:sqlite org-babel-hide-result-overlays org-babel-inline-lob-one-liner-regexp org-babel-inline-src-block-regexp org-babel-java-command org-babel-java-compiler org-babel-js-cmd org-babel-js-eoe org-babel-js-function-wrapper org-babel-key-bindings org-babel-key-prefix org-babel-library-of-babel org-babel-lisp-dir-fmt org-babel-load-languages org-babel-lob-files org-babel-lob-one-liner-regexp org-babel-map org-babel-matlab-emacs-link-wrapper-method org-babel-matlab-shell-command org-babel-matlab-with-emacs-link org-babel-maxima-command org-babel-min-lines-for-block-output org-babel-multi-line-header-regexp org-babel-no-eval-on-ctrl-c-ctrl-c org-babel-noweb-error-langs org-babel-ocaml-eoe-indicator org-babel-ocaml-eoe-output org-babel-octave-eoe-indicator org-babel-octave-eoe-output org-babel-octave-shell-command org-babel-octave-wrapper-method org-babel-org-babel-call-process-region-original org-babel-org-default-header org-babel-perl-buffers org-babel-perl-command org-babel-perl-pp-wrapper-method org-babel-perl-wrapper-method org-babel-picolisp-cmd org-babel-picolisp-eoe org-babel-post-tangle-hook org-babel-pre-tangle-hook org-babel-process-comment-text org-babel-python-buffers org-babel-python-command org-babel-python-eoe-indicator org-babel-python-mode org-babel-python-pp-wrapper-method org-babel-python-wrapper-method org-babel-ref-split-regexp org-babel-result-regexp org-babel-result-w-name-regexp org-babel-results-keyword org-babel-ruby-command org-babel-ruby-eoe-indicator org-babel-ruby-f-write org-babel-ruby-pp-f-write org-babel-ruby-pp-wrapper-method org-babel-ruby-wrapper-method org-babel-scheme-cmd org-babel-scheme-eoe org-babel-screen-location org-babel-sh-command org-babel-sh-eoe-indicator org-babel-sh-eoe-output org-babel-sh-var-quote-fmt org-babel-sqlite3-command org-babel-src-block-regexp org-babel-src-name-regexp org-babel-src-name-w-name-regexp org-babel-tangle-body-hook org-babel-tangle-comment-format-beg org-babel-tangle-comment-format-end org-babel-tangle-lang-exts org-babel-update-intermediate org-beamer-column-open org-beamer-column-view-format org-beamer-column-widths org-beamer-columns-open org-beamer-environments-default org-beamer-environments-extra org-beamer-export-is-beamer-p org-beamer-fragile-re org-beamer-frame-default-options org-beamer-frame-level org-beamer-frame-level-now org-beamer-header-extra org-beamer-inside-frame-at-level org-beamer-mode org-beamer-mode-map org-beamer-outline-frame-options org-beamer-outline-frame-title org-beamer-themes org-beamer-transitions org-beamer-use-parts org-bibtex-autogen-keys org-bibtex-description org-bibtex-export-arbitrary-fields org-bibtex-fields org-bibtex-key-property org-bibtex-no-export-tags org-bibtex-prefix org-bibtex-tags org-bibtex-tags-are-keywords org-bibtex-treat-headline-as-title org-bibtex-type-property-name org-bibtex-types org-capture-after-finalize-hook org-capture-before-finalize-hook org-capture-clock-keep org-capture-clock-was-started org-capture-current-plist org-capture-last-stored-marker org-capture-link-is-already-stored org-capture-mode org-capture-mode-hook org-capture-mode-map org-capture-plist org-capture-templates org-catch-invisible-edits org-clock-before-select-task-hook org-clock-clocktable-formatter org-clock-clocktable-language-setup org-clock-current-task org-clock-leftover-time org-clock-report-include-clocking-task org-clock-resolve-expert org-clock-task-overrun org-clock-task-overrun-text org-clock-update-period org-clocktable-defaults org-clone-delete-id org-complete-tags-always-offer-all-agenda-tags org-confirm-babel-evaluate org-confirm-elisp-link-not-regexp org-confirm-shell-link-not-regexp org-crypt-disable-auto-save org-ctags-enabled-p org-ctags-find-tag-history org-ctags-new-topic-template org-ctags-open-link-functions org-ctags-path-to-ctags org-ctags-tag-list org-ctags-tag-regexp org-ctrl-c-ctrl-c-final-hook org-ctrl-k-protect-subtree org-cycle-level-faces org-diary-last-run-time org-edit-src-allow-write-back-p org-effort-durations org-entities org-entities-ascii-explanatory org-entities-user org-export-ascii-entities org-export-ascii-table-widen-columns org-export-babel-evaluate org-export-backends org-export-blocks-postblock-hook org-export-current-backend org-export-date-timestamp-format org-export-define-heading-targets-headline-hook org-export-docbook-footnote-separator org-export-docbook-xslt-stylesheet org-export-email-info org-export-first-hook org-export-footnotes-data org-export-footnotes-seen org-export-have-math org-export-html-content-div org-export-html-divs org-export-html-footnote-separator org-export-html-headline-anchor-format org-export-html-mathjax-options org-export-html-mathjax-template org-export-html-postamble-format org-export-html-preamble-format org-export-html-protect-char-alist org-export-html-table-align-individual-fields org-export-id-target-alist org-export-initial-scope org-export-kill-product-buffer-when-displayed org-export-latex-after-initial-vars-hook org-export-latex-after-save-hook org-export-latex-class-options org-export-latex-custom-lang-environments org-export-latex-default-packages-alist org-export-latex-footmark-seen org-export-latex-footnote-separator org-export-latex-format-toc-function org-export-latex-href-format org-export-latex-hyperref-format org-export-latex-inputenc-alist org-export-latex-listings-options org-export-latex-listings-w-names org-export-latex-minted-langs org-export-latex-minted-options org-export-latex-quotes org-export-latex-table-caption-above org-export-latex-tabular-environment org-export-latex-tag-markup org-export-latex-timestamp-inactive-markup org-export-odt-bookmark-prefix org-export-odt-category-strings org-export-odt-content-template-file org-export-odt-convert-capabilities org-export-odt-convert-process org-export-odt-convert-processes org-export-odt-create-custom-styles-for-srcblocks org-export-odt-default-image-sizes-alist org-export-odt-default-org-styles-alist org-export-odt-embed-images org-export-odt-fontify-srcblocks org-export-odt-image-size-probe-method org-export-odt-inline-image-extensions org-export-odt-inline-images org-export-odt-max-image-size org-export-odt-org-styles-alist org-export-odt-pixels-per-inch org-export-odt-preferred-output-format org-export-odt-prettify-xml org-export-odt-schema-dir org-export-odt-special-string-regexps org-export-odt-styles-file org-export-odt-table-styles org-export-odt-tmpdir-prefix org-export-pdf-logfiles org-export-preprocess-after-headline-targets-hook org-export-preprocess-after-radio-targets-hook org-export-preprocess-before-normalizing-links-hook org-export-preprocess-before-selecting-backend-code-hook org-export-table-remove-empty-lines org-export-taskjuggler-default-global-properties org-export-taskjuggler-default-project-duration org-export-taskjuggler-default-project-version org-export-taskjuggler-default-reports org-export-taskjuggler-extension org-export-taskjuggler-final-hook org-export-taskjuggler-project-tag org-export-taskjuggler-resource-tag org-export-taskjuggler-target-version org-export-with-tasks org-faces-easy-properties org-font-lock-set-keywords-hook org-fontify-quote-and-verse-blocks org-footnote-forbidden-blocks org-footnote-insert-pos-for-preprocessor org-format-latex-header-extra org-format-latex-signal-error org-freemind-bol-helper-base-indent org-freemind-node-css-style org-get-priority-function org-gnus-nnimap-query-article-no-from-file org-habit-completed-glyph org-habit-today-glyph org-heading-keyword-maybe-regexp-format org-heading-keyword-regexp-format org-heading-regexp org-hidden-keywords org-html-cvt-link-fn org-icalendar-alarm-time org-icalendar-combined-description org-icalendar-date-time-format org-icalendar-honor-noexport-tag org-icalendar-use-UTC-date-time org-indent-agent-active-delay org-indent-agent-passive-delay org-indent-agent-resume-delay org-indent-agent-resume-timer org-indent-agent-timer org-indent-agentized-buffers org-indent-initial-marker org-indent-inlinetask-first-star org-indent-modified-headline-flag org-inhibit-startup-visibility-stuff org-inline-image-overlays org-inlinetask-default-state org-inlinetask-export-templates org-last-set-property org-last-tag-selection-key org-latex-default-figure-position org-latex-to-mathml-convert-command org-latex-to-mathml-jar-file org-link-search-inhibit-query org-link-search-must-match-exact-headline org-list-automatic-rules org-list-end-re org-list-export-context org-list-forbidden-blocks org-list-full-item-re org-list-indent-offset org-list-use-circular-motion org-log-buffer-setup-hook org-log-note-effective-time org-log-refile org-loop-over-headlines-in-active-region org-lparse-backend org-lparse-body-only org-lparse-char-styles org-lparse-collect-buffer org-lparse-collect-count org-lparse-debug org-lparse-dyn-current-environment org-lparse-encode-pending org-lparse-insert-tag-with-newlines org-lparse-link-description-is-image org-lparse-list-table-p org-lparse-native-backends org-lparse-other-backend org-lparse-output-buffer org-lparse-par-open org-lparse-special-blocks org-lparse-to-buffer org-lparse-use-flashy-warning org-mobile-agendas org-mobile-encryption-password org-mobile-encryption-password-session org-mobile-encryption-tempfile org-mobile-files-exclude-regexp org-mobile-use-encryption org-odt-automatic-styles org-odt-category-map-alist org-odt-data-dir org-odt-embedded-formulas-count org-odt-embedded-images-count org-odt-entity-control-callbacks-alist org-odt-entity-counts-plist org-odt-entity-format-callbacks-alist org-odt-entity-frame-styles org-odt-entity-labels-alist org-odt-file-extensions org-odt-label-styles org-odt-lib-dir org-odt-manifest-file-entries org-odt-manifest-file-entry-tag org-odt-object-counters org-odt-schema-dir-list org-odt-styles-dir org-odt-styles-dir-list org-odt-suppress-xref org-odt-table-indentedp org-odt-table-style org-odt-table-style-format org-odt-table-style-spec org-open-at-point-functions org-open-link-functions org-outline-regexp-bol org-plantuml-jar-path org-pretty-entities org-pretty-entities-include-sub-superscripts org-properties-postprocess-alist org-property-allowed-value-functions org-property-changed-functions org-property-set-functions-alist org-publish-cache org-publish-sitemap-date-format org-publish-sitemap-file-entry-format org-publish-sitemap-sort-files org-publish-sitemap-sort-folders org-publish-sitemap-sort-ignore-case org-read-date-analyze-forced-year org-read-date-force-compatible-dates org-refile-active-region-within-subtree org-refile-cache org-refile-markers org-refile-use-cache org-reveal-start-hook org-script-display org-shiftdown-final-hook org-shiftdown-hook org-shiftleft-final-hook org-shiftleft-hook org-shiftright-final-hook org-shiftright-hook org-shiftup-final-hook org-shiftup-hook org-special-blocks-ignore-regexp org-speed-command-hook org-src-babel-info org-src-block-paragraph-format org-src-fontify-natively org-src-strip-leading-and-trailing-blank-lines org-src-tab-acts-natively org-startup-with-beamer-mode org-startup-with-inline-images org-table-current-ncol org-table-do-narrow org-table-duration-custom-format org-table-exit-follow-field-mode-when-leaving-table org-table-fix-formulas-confirm org-table-follow-field-mode org-table-formula-field-format org-task-overrun-text org-timer-cancel-hook org-timer-continue-hook org-timer-current-timer org-timer-default-timer org-timer-done-hook org-timer-pause-hook org-timer-set-hook org-timer-start-hook org-timer-stop-hook org-timer-timer-is-countdown org-todo-repeat-to-state org-use-effective-time org-use-sub-superscripts org-wl-disable-folder-check org-wl-folder-types org-wl-link-remove-filter org-wl-namazu-default-index org-wl-nntp-prefer-web-links org-wl-shimbun-prefer-web-links org-xemacs-key-equivalents orgtbl-after-send-table-hook package--builtins package--initialized package-activated-list package-alist package-archive-contents package-archive-upload-base package-archive-version package-archives package-directory-list package-el-version package-enable-at-startup package-load-list package-menu-mode-abbrev-table package-menu-mode-map package-menu-mode-syntax-table package-obsolete-alist package-subdirectory-regexp package-update-news-on-upload package-user-dir pcase--dontcare-upats pcase--memoize pcase-mutually-exclusive-predicates pcmpl-ssh-config-file pcomplete--env-regexp plstore-cache-passphrase-for-symmetric-encryption plstore-encrypt-to plstore-passphrase-alist plstore-select-keys pop3-stream-length post-self-insert-hook process-menu-mode-abbrev-table process-menu-mode-map process-menu-mode-syntax-table process-menu-query-only prog-mode-abbrev-table prog-mode-map prog-mode-syntax-table progress-reporter--pulse-characters prolog-align-comments-flag prolog-align-rules prolog-atom-char-regexp prolog-atom-regexp prolog-char-quote-workaround prolog-compilation-buffer prolog-consult-compile-file prolog-consult-compile-first-line prolog-consult-compile-output prolog-consult-compile-real-file prolog-debug-off-string prolog-debug-on-string prolog-determinism-specificators prolog-determinism-specificators-i prolog-directives prolog-directives-i prolog-edit-menu-insert-move prolog-edit-menu-runtime prolog-electric-colon-flag prolog-electric-dash-flag prolog-electric-dot-flag prolog-electric-dot-full-predicate-template prolog-electric-if-then-else-flag prolog-electric-newline-flag prolog-electric-tab-flag prolog-electric-underscore-flag prolog-eof-string-i prolog-head-delimiter prolog-help-function prolog-help-function-i prolog-hungry-delete-key-flag prolog-imenu-flag prolog-imenu-max-lines prolog-indent-mline-comments-flag prolog-inferior-error-regexp-alist prolog-inferior-menu-all prolog-inferior-mode-abbrev-table prolog-inferior-mode-hook prolog-inferior-mode-map prolog-inferior-mode-syntax-table prolog-info-alist prolog-info-predicate-index prolog-keywords prolog-keywords-i prolog-left-indent-regexp prolog-left-paren prolog-lower-case-string prolog-menu-help prolog-mode-hook prolog-mode-specificators prolog-mode-specificators-i prolog-mode-version prolog-object-end-to-0-flag prolog-old-sicstus-keys-flag prolog-paren-indent prolog-paren-indent-p prolog-parse-mode prolog-process-flag prolog-program-switches prolog-prompt-regexp prolog-quoted-atom-regexp prolog-right-paren prolog-string-regexp prolog-syntax-propertize-function prolog-system prolog-system-version prolog-temporary-file-name prolog-tokenize-searchkey prolog-trace-off-string prolog-trace-on-string prolog-types prolog-types-i prolog-underscore-wordchar-flag prolog-upper-case-string prolog-use-prolog-tokenizer-flag prolog-use-sicstus-sd prolog-use-standard-consult-compile-method-flag prolog-zip-off-string prolog-zip-on-string python-syntax-propertize-function rcirc-authenticate-before-join rcirc-authenticated-hook rcirc-client-commands rcirc-completion-start rcirc-completions rcirc-log-process-buffers rcirc-nick-completion-format rcirc-server-commands rcirc-user-authenticated rcirc-user-name-history recentf--files-with-key recentf--shortcuts-keymap recentf-arrange-by-rule-others recentf-arrange-by-rule-subfilter recentf-arrange-by-rules-min-items recentf-arrange-rules recentf-auto-cleanup recentf-auto-cleanup-timer recentf-case-fold-search recentf-dialog-mode-map recentf-edit-list recentf-exclude recentf-filename-handlers recentf-filter-changer-alist recentf-filter-changer-current recentf-initialize-file-name-history recentf-keep recentf-load-hook recentf-max-menu-items recentf-menu-action recentf-menu-append-commands-flag recentf-menu-append-commands-p recentf-menu-before recentf-menu-filter recentf-menu-filter-commands recentf-menu-items-for-commands recentf-menu-open-all-flag recentf-menu-path recentf-menu-title recentf-mode-map recentf-save-file recentf-save-file-coding-system recentf-save-file-header recentf-save-file-modes recentf-show-file-shortcuts-flag recentf-used-hooks reftex-index-mode-abbrev-table reftex-index-mode-map reftex-index-mode-syntax-table reftex-index-phrases-mode-abbrev-table reftex-index-phrases-mode-map reftex-index-phrases-mode-syntax-table reftex-select-bib-mode-abbrev-table reftex-select-bib-mode-map reftex-select-bib-mode-syntax-table reftex-select-label-mode-abbrev-table reftex-select-label-mode-map reftex-select-label-mode-syntax-table reftex-select-shared-map reftex-toc-mode-abbrev-table reftex-toc-mode-map reftex-toc-mode-syntax-table registry-db remote-file-name-inhibit-cache replace-count report-emacs-bug-bug-alist report-emacs-bug-choice-widget report-emacs-bug-tracker-url revert-buffer-in-progress-p save-place-file save-place-forget-unreadable-files save-place-ignore-files-regexp save-place-limit save-place-loaded save-place-save-skipped save-place-skip-check-regexp save-place-version-control saved-region-selection savehist-autosave-interval savehist-coding-system savehist-file savehist-file-modes savehist-last-checksum savehist-loaded savehist-minibuffer-history-variables savehist-mode-hook savehist-no-conversion savehist-save-hook savehist-timer scroll-error-top-bottom selection-inhibit-update-commands semantic-minor-modes-format server-msg-size server-port ses-self-reference-early-detection sgml-syntax-propertize-function shr-base shr-blocked-images shr-color-html-colors-alist shr-color-visible-distance-min shr-color-visible-luminance-min shr-content-cache shr-content-function shr-folding-mode shr-hr-line shr-ignore-cache shr-indentation shr-inhibit-images shr-kinsoku-shorten shr-list-mode shr-map shr-max-image-proportion shr-put-image-function shr-start shr-state shr-stylesheet shr-table-corner shr-table-depth shr-table-horizontal-line shr-table-vertical-line shr-width sieve-buffer-script-name simula-syntax-propertize-function smerge-resolve--normalize-re smie-warning-count smime-mode-abbrev-table smime-mode-syntax-table smtpmail-smtp-user smtpmail-stream-type soap-current-wsdl soap-debug soap-decoded-multi-refs soap-default-xmlns soap-encoded-namespaces soap-inspect-current-item soap-inspect-previous-items soap-local-xmlns soap-multi-refs soap-target-xmlns soap-well-known-xmlns speedbar-mode-abbrev-table speedbar-mode-map speedbar-mode-syntax-table sql-ansi-statement-starters sql-completion-column sql-completion-object sql-completion-sqlbuf sql-connection sql-connection-alist sql-connection-history sql-contains-names sql-db2-login-params sql-debug-redirect sql-dialect sql-indirect-features sql-informix-login-params sql-ingres-login-params sql-interbase-login-params sql-linter-login-params sql-login-hook sql-ms-login-params sql-mysql-login-params sql-oracle-completion-types sql-oracle-login-params sql-oracle-scan-on sql-oracle-statement-starters sql-output-by-send sql-output-newline-count sql-port sql-postgres-login-params sql-preoutput-hold sql-product-history sql-prompt-cont-regexp sql-send-terminator sql-solid-login-params sql-sqlite-login-params sql-sybase-login-params switch-to-visible-buffer syntax-propertize--done syntax-propertize-chunk-size syntax-propertize-extend-region-functions syntax-propertize-function tabulated-list-entries tabulated-list-format tabulated-list-glyphless-char-display tabulated-list-mode-abbrev-table tabulated-list-mode-map tabulated-list-mode-syntax-table tabulated-list-padding tabulated-list-printer tabulated-list-revert-hook tabulated-list-sort-button-map tabulated-list-sort-key tcl-syntax-propertize-function tetris-mode-abbrev-table tetris-mode-syntax-table tex-error-regexp-alist texinfo-syntax-propertize-function todo-mode-abbrev-table todo-mode-syntax-table tool-bar-max-label-size tool-bar-separator-image-expression tool-bar-style tramp-color-escape-sequence-regexp tramp-encoding-command-interactive tramp-gvfs-methods tramp-local-end-of-line tramp-sh-file-name-handler-alist url-cache-expire-time url-http-codes url-queue url-queue-parallel-processes url-queue-timeout url-retrieve-number-of-calls var-γ var-π var-φ vc-bzr-admin-branchconf vc-bzr-error-regex-alist vc-bzr-history vc-bzr-sha1-program vc-bzr-status-switches vc-git-history vc-git-program vc-git-root-log-format vc-hg-history vc-hg-root-log-format vc-revert-show-diff vera-mode-abbrev-table verilog-assignment-operation-re verilog-assignment-operator-re verilog-auto-declare-nettype verilog-auto-delete-trailing-whitespace verilog-auto-inst-sort verilog-auto-reset-blocking-in-non verilog-auto-tieoff-declaration verilog-auto-wire-type verilog-diff-function verilog-in-hooks verilog-inst-comment-re verilog-no-change-functions verilog-uvm-begin-re verilog-uvm-end-re verilog-uvm-statement-re window-combination-limit window-combination-resize window-persistent-parameters window-safe-min-height window-safe-min-width window-sides window-sides-slots window-sides-vertical window-state-put-list)) - (features - (removed cl-19 earcon eieio-comp emacs-lock esh-test font-setting gdb-ui gnus-audio gnus-move gnus-nocem gnus-soup imap-hash mldrag nndb nnkiboze nnlistserv nnslashdot nnsoup nnultimate nnwarchive nnwfm rnews rnewspost sc tramp-fish tramp-imap webmail x-menu) - (added allout-widgets bookmark cc-guess cconv cfengine3 color cus-theme desktop ert ert-x filesets gdb-mi gnus-gravatar gnus-html gnus-registry gnus-sync gnutls gravatar gssapi ido image-dired network-stream nnregistry notifications ob ob-C ob-R ob-asymptote ob-awk ob-calc ob-clojure ob-comint ob-css ob-ditaa ob-dot ob-emacs-lisp ob-eval ob-exp ob-fortran ob-gnuplot ob-haskell ob-java ob-js ob-keys ob-latex ob-ledger ob-lilypond ob-lisp ob-lob ob-matlab ob-maxima ob-mscgen ob-ocaml ob-octave ob-org ob-perl ob-picolisp ob-plantuml ob-python ob-ref ob-ruby ob-sass ob-scheme ob-screen ob-sh ob-shen ob-sql ob-sqlite ob-table ob-tangle org-beamer org-capture org-ctags org-docview org-entities org-eshell org-lparse org-mks org-odt org-pcomplete org-special-blocks org-taskjuggler package package-x pcase pcvs pcvs-defs plstore ps-bdf recentf registry rtree savehist saveplace shr shr-color soap-client soap-inspect tabulated-list tramp-loaddefs tramp-sh url-future url-queue))) - ((24 2) - (functions - (removed) - (added rcirc-split-message)) - (variables - (removed) - (added)) - (features - (removed) - (added bug-reference misearch multi-isearch))) - ((24 3) - (functions - (removed Buffer-menu-buffer+size Buffer-menu-make-sort-button Buffer-menu-revert-function Buffer-menu-sort-by-column ad-Orig-comment-region ad-Orig-move-overlay ad-Orig-process-filter ad-Orig-set-process-filter ad-Orig-sit-for ad-copy-tree ad-do-return ad-dolist ad-prognify ansi-color-get-face article-translate-characters battery-yeeloong-sysfs bookmark-insert-current-bookmark bookmark-read-search-input brm-init bruce byte-compile-const-symbol-p byte-compile-constp byte-compile-defalias-warn byte-compile-defmacro byte-compile-defmacro-declaration byte-compile-defun byte-compile-file-form-defmacro byte-compile-file-form-defun byte-optimize-featurep c-get-fallback-scan-pos calendar-hide-window calendar-window-list cc-bytecomp-defmacro cl-arglist-args cl-block-throw cl-block-wrapper cl-byte-compile-compiler-macro cl-check-key cl-check-match cl-check-test cl-check-test-nokey cl-compile-time-too cl-compiling-file cl-const-expr-p cl-const-expr-val cl-const-exprs-p cl-defsubst-expand cl-defun-expander cl-do-arglist cl-do-pop cl-do-prettyprint cl-do-remf cl-do-subst cl-expr-access-order cl-expr-contains cl-expr-contains-any cl-expr-depends-p cl-finite-do cl-hack-byte-compiler cl-loop-build-ands cl-loop-handle-accum cl-loop-let cl-macroexpand-body cl-make-type-test cl-map-overlays cl-mapcar-many cl-nsublis-rec cl-parsing-keywords cl-progv-after cl-progv-before cl-safe-expr-p cl-set-buffer-substring cl-set-elt cl-set-frame-visible-p cl-set-nthcdr cl-set-substring cl-setf-do-modify cl-setf-do-store cl-setf-make-apply cl-setf-simple-store-p cl-simple-expr-p cl-simple-exprs-p cl-sublis-rec cl-transform-function-property cl-transform-lambda cl-tree-equal-rec comint--common-quoted-suffix comint--common-suffix comint--table-subvert compile-internal dbus-call-method-non-blocking-handler dbus-name-owner-changed-handler def-edebug-form-spec def-gdb-display-buffer def-gdb-frame-for-buffer ebrowse-value-in-buffer edebug-display edebug-enter-trace edebug-form-data-begin edebug-form-data-end edebug-form-data-name edebug-get-buffer-window edebug-input-pending-p edebug-make-form-data-entry edebug-recursive-edit edebug-sit-for edebug-submit-bug-report edebug-update-coverage emacs-lock-unload-function emerge-version eshell-defgroup ffap-complete-as-file-p follow-call-process-filter follow-call-set-process-filter follow-generic-filter follow-intercept-process-output follow-invalidate-cache follow-stop-intercept-process-output follow-tidy-process-filter-alist follow-unload-function gdb-if-arrow get-setf-method gnus-Newsgroup-kill-file gnus-alist-to-hashtable gnus-article-hide-text-of-type gnus-article-maybe-highlight gnus-article-parent-p gnus-article-read-p gnus-article-text-type-exists-p gnus-byte-code gnus-cited-line-p gnus-compile gnus-extract-address-component-email gnus-extract-address-component-name gnus-group-guess-full-name gnus-group-guess-prefixed-name gnus-group-line-format-spec gnus-group-parent-topic gnus-group-set-method-info gnus-group-set-params-info gnus-hashtable-to-alist gnus-kill-newsgroup gnus-list-active-group gnus-mail-parse-comma-list gnus-process-live-p gnus-put-message gnus-request-associate-buffer gnus-request-group-articles gnus-score-regexp-bad-p gnus-score-set-default gnus-shell-command-on-region gnus-sortable-date gnus-sublist-p gnus-summary-dummy-line-format-spec gnus-summary-score-crossposting gnus-summary-set-current-mark gnus-tree-goto-article gnus-uncompress-marks gnus-uu-find-name-in-shar gnus-writable-groups isearch-barrier-state isearch-case-fold-search-state isearch-error-state isearch-forward-state isearch-message-state isearch-other-end-state isearch-point-state isearch-pop-fun-state isearch-string-state isearch-success-state isearch-top-state isearch-word-state isearch-wrapped-state ispell-insert-word iswitchb-define-mode-map jython-mode macroexp-accumulate macroexpand-all-1 macroexpand-all-clauses macroexpand-all-forms mail-source-movemail-and-remove maybe-cons message-fill-address message-make-host-name message-remove-signature mm-url-encode-multipart-form-data mm-url-fetch-form mm-url-fetch-simple mm-view-sound-file netrc-find-service-number netrc-store-data nnagent-request-marks nnfolder-group-marks-pathname nnfolder-marks-changed-p nnfolder-open-marks nnfolder-request-marks nnfolder-request-set-mark nnfolder-save-marks nnmaildir-request-marks nnml-marks-changed-p nnml-open-marks nnml-request-marks nnml-request-set-mark nnml-save-marks nntp-async-timer-handler nntp-group-pathname nntp-marks-changed-p nntp-marks-directory nntp-open-marks nntp-possibly-create-directory nntp-report-1 nntp-request-marks nntp-request-set-mark nntp-save-marks nntp-send-authinfo-from-file nntp-send-nosy-authinfo ob-calc-maybe-resolve-var ob-fortran-transform-list org-agenda-action org-agenda-bulk-remove-all-marks org-agenda-do-action org-agenda-show-priority org-babel-clean-text-properties org-babel-strip-protective-commas org-backward-same-level org-beginning-of-defun org-create-formula-image org-end-of-defun org-export-handle-table-metalines org-export-res/src-name-cleanup org-fill-item-nobreak-p org-finalize-agenda org-finalize-agenda-entries org-find-library-name org-finish-icalendar-file org-fit-agenda-window org-float org-forward-same-level org-get-clocktable org-get-effort org-highlight-until-next-command org-ical-ts-to-string org-indent-line-function org-make-link org-mark-entry-for-agenda-action org-move-line-down org-move-line-up org-prepare-agenda org-prepare-agenda-buffers org-print-icalendar-entries org-program-exists org-set-autofill-regexps org-start-icalendar-file org-strip-protective-commas org-substring-no-properties org-timer-reset-timers pcomplete--common-quoted-suffix picture-substitute prolog-build-case-strings prolog-char-to-int prolog-comment-indent prolog-dash-letters prolog-int-to-char prolog-ints-intervals prolog-set-atom-regexps pymacs-load python--set-prompt-regexp python-after-info-look python-args-to-list python-backslash-continuation-line-p python-backspace python-beginning-of-block python-beginning-of-defun python-beginning-of-statement python-beginning-of-string python-blank-line-p python-block-end-p python-calculate-indentation python-check-comint-prompt python-check-version python-close-block-statement-p python-comment-line-p python-completion-at-point python-continuation-line-p python-current-defun python-describe-symbol python-electric-colon python-else python-end-of-block python-end-of-defun python-end-of-statement python-execute-file python-expand-template python-find-function python-find-imports python-first-word python-guess-indent python-imenu-create-index python-in-string/comment python-indent-line-1 python-indentation-levels python-initial-text python-input-filter python-insert-class python-insert-def python-insert-for python-insert-if python-insert-try/except python-insert-try/finally python-insert-while python-load-file python-mark-block python-maybe-jython python-module-path python-next-statement python-open-block-statement-p python-outdent-p python-outline-level python-pdbtrack-get-source-buffer python-pdbtrack-grub-for-buffer python-pdbtrack-overlay-arrow python-pdbtrack-toggle-stack-tracking python-pdbtrack-track-stack-file python-preoutput-filter python-previous-statement python-quote-syntax python-send-buffer python-send-command python-send-defun python-send-region python-send-region-and-go python-sentinel python-set-proc python-setup-brm python-shift-left python-shift-right python-skip-comments/blanks python-skip-out python-switch-to-python python-symbol-completions python-target python-unload-function python-which-func reftex-format-Fref reftex-format-fref reftex-format-vref reftex-select-toggle-fancyref reftex-select-toggle-varioref registry-make-testable-db repeat-self-insert rst-adjust-decoration rst-compare-decorations rst-compute-bullet-tabs rst-debug-mark-found rst-debug-print-tabs rst-decoration-complete-p rst-define-level-faces rst-display-decorations-hierarchy rst-find-all-decorations rst-font-lock-find-unindented-line rst-font-lock-handle-adornment rst-font-lock-keywords-function rst-get-decoration rst-get-decoration-match rst-get-decorations-around rst-get-next-decoration rst-get-stripped-line rst-line-homogeneous-nodent-p rst-line-homogeneous-p rst-normalize-cursor-position rst-portable-mark-active-p rst-rstrip rst-set-level-default rst-shift-region-guts rst-shift-region-left rst-shift-region-right rst-straighten-deco-spacing rst-straighten-decorations rst-suggest-new-decoration rst-toc-insert-find-delete-contents ruby-electric-brace ruby-mark-defun sc-submit-bug-report sc-version semantic-compile-warn semantic-overlay-size semantic-tag-similar-p ses-narrowed-p set-char-table-default set-window-point-1 shell-parse-pcomplete-arguments sieve-bury-buffer snarf-bruces solitaire-build-modeline string-to-sequence table-apply table-call-interactively table-funcall table-initialize-table-fixed-width-mode table-set-table-fixed-width-mode term-fake-pager-disable term-fake-pager-enable tmm-delete-map tramp-enter-password tramp-with-progress-reporter turn-off-pdbtrack turn-on-pdbtrack verilog-in-struct-region-p viper-inactivate-input-method viper-inactivate-input-method-action w32-init-info window--display-buffer-1 window--display-buffer-2 window--size-ignore window-point-1 with-connection-property with-file-property xml-parse-fragment xscheme-modeline-initialize zone-hiding-modeline) - (added Buffer-menu--pretty-file-name Buffer-menu--pretty-name Buffer-menu-info-node-description ange-ftp-ignore-errors-if-non-essential ansi-color--find-face ansi-color-parse-sequence archive-extract-by-file auth-source--aget auth-source--aput auth-source--aput-1 auth-source-backend-list-p auth-source-macos-keychain-create auth-source-macos-keychain-result-append auth-source-macos-keychain-search auth-source-macos-keychain-search-items autoload-do-load autoloadp bbdb-buffer bbdb-create-internal bbdb-gethash bindings--define-key bovine-grammar-mode buffer-narrowed-p byte-compile--reify-function byte-compile-abbreviate-file c-debug-parse-state-double-cons c-state-maybe-marker cal-tex-cursor-week2-summary cal-tex-filofax-paper cal-tex-longday cal-tex-shortday cal-tex-weekly-common cal-tex-weekly-paper calc-basic-simplify-mode chart-axis-list-p chart-axis-names-list-p chart-axis-range-list-p chart-bar-list-p chart-list-p chart-sequece-list-p cl--adjoin cl--arglist-args cl--block-throw cl--block-wrapper cl--check-key cl--check-match cl--check-test cl--check-test-nokey cl--compile-time-too cl--compiler-macro-adjoin cl--compiler-macro-assoc cl--compiler-macro-cXXr cl--compiler-macro-get cl--compiler-macro-list* cl--compiler-macro-member cl--compiling-file cl--const-expr-p cl--const-expr-val cl--defalias cl--defsubst-expand cl--delete-duplicates cl--do-arglist cl--do-prettyprint cl--do-remf cl--do-subst cl--dolist cl--dotimes cl--expr-contains cl--expr-contains-any cl--expr-depends-p cl--finite-do cl--function-convert cl--gv-adapt cl--labels-convert cl--letf cl--loop-build-ands cl--loop-handle-accum cl--loop-let cl--make-type-test cl--map-intervals cl--map-keymap-recursively cl--map-overlays cl--mapcar-many cl--nsublis-rec cl--parsing-keywords cl--position cl--safe-expr-p cl--set-buffer-substring cl--set-elt cl--set-frame-visible-p cl--set-getf cl--set-substring cl--simple-expr-p cl--simple-exprs-p cl--sm-macroexpand cl--sublis-rec cl--symbol-function cl--transform-lambda cl--tree-equal-rec cl-acons cl-assert cl-assoc cl-assoc-if cl-assoc-if-not cl-block cl-caaaar cl-caaadr cl-caaar cl-caadar cl-caaddr cl-caadr cl-cadaar cl-cadadr cl-cadar cl-caddar cl-cadddr cl-caddr cl-callf cl-callf2 cl-case cl-cdaaar cl-cdaadr cl-cdaar cl-cdadar cl-cdaddr cl-cdadr cl-cddaar cl-cddadr cl-cddar cl-cdddar cl-cddddr cl-cdddr cl-check-type cl-coerce cl-compiler-macroexpand cl-concatenate cl-copy-list cl-copy-seq cl-count cl-count-if cl-count-if-not cl-decf cl-declaim cl-declare cl-define-compiler-macro cl-defmacro cl-defstruct cl-defsubst cl-deftype cl-defun cl-delete cl-delete-if cl-delete-if-not cl-destructuring-bind cl-do cl-do* cl-do-all-symbols cl-do-symbols cl-dolist cl-dotimes cl-ecase cl-eighth cl-endp cl-equalp cl-etypecase cl-eval-when cl-evenp cl-every cl-fifth cl-fill cl-find cl-find-if cl-find-if-not cl-first cl-flet cl-flet* cl-floatp-safe cl-fourth cl-function cl-gcd cl-gensym cl-gentemp cl-get cl-getf cl-incf cl-intersection cl-isqrt cl-labels cl-lcm cl-ldiff cl-letf cl-letf* cl-list* cl-list-length cl-load-time-value cl-locally cl-loop cl-macrolet cl-make-random-state cl-map cl-mapcan cl-mapcar cl-mapcon cl-mapl cl-maplist cl-member-if cl-member-if-not cl-merge cl-minusp cl-mismatch cl-multiple-value-apply cl-multiple-value-bind cl-multiple-value-call cl-multiple-value-list cl-multiple-value-setq cl-nintersection cl-ninth cl-notany cl-notevery cl-nreconc cl-nset-difference cl-nset-exclusive-or cl-nsublis cl-nsubst cl-nsubst-if cl-nsubst-if-not cl-nsubstitute cl-nsubstitute-if cl-nsubstitute-if-not cl-nth-value cl-nunion cl-oddp cl-pairlis cl-plusp cl-position-if cl-position-if-not cl-proclaim cl-progv cl-psetf cl-psetq cl-pushnew cl-random cl-random-state-p cl-rassoc cl-rassoc-if cl-rassoc-if-not cl-reduce cl-rem cl-remf cl-remove cl-remove-duplicates cl-remove-if cl-remove-if-not cl-replace cl-rest cl-return cl-return-from cl-revappend cl-rotatef cl-search cl-second cl-set-difference cl-set-exclusive-or cl-seventh cl-shiftf cl-signum cl-sixth cl-some cl-sort cl-stable-sort cl-sublis cl-subseq cl-subsetp cl-subst cl-subst-if cl-subst-if-not cl-substitute cl-substitute-if cl-substitute-if-not cl-svref cl-symbol-macrolet cl-tailp cl-tenth cl-the cl-third cl-tree-equal cl-typecase cl-typep cl-union cl-values cl-values-list comint--requote-argument comint--unquote&requote-argument comint--unquote-argument comint-adjust-point completion--nth-completion completion--sifn-requote completion--string-equal-p completion--twq-all completion--twq-try completion-table-subvert completion-table-with-quoting copy-profiler-calltree copy-profiler-profile copy-rectangle-as-kill copy-soap-simple-type count-words--buffer-message cvs-insert-visited-file dabbrev--ignore-case-p dbus-call-method dbus-call-method-asynchronously dbus-call-method-handler dbus-get-all-managed-objects dbus-managed-objects-handler dbus-method-error-internal dbus-method-return-internal dbus-register-method dbus-register-service dbus-register-signal dbus-send-signal dbus-setenv deactivate-input-method defvar-local delete-all-overlays delete-selection-helper delete-side-window diff-bounds-of-file diff-bounds-of-hunk diff-delete-trailing-whitespace diff-setup-whitespace diff-undo dired-sort-set-mode-line display-buffer-at-bottom display-buffer-below-selected display-buffer-in-atom-window display-buffer-in-major-side-window display-buffer-in-previous-window display-buffer-in-side-window doc-view-current-cache-doc-pdf doc-view-get-bounding-box doc-view-guess-paper-size doc-view-scale-bounding-box doc-view-set-slice-from-bounding-box ede-add-project-autoload ede-apply-project-local-variables ede-configuration-forms-menu ede-dirmatch-installed ede-do-dirmatch ede-flush-directory-hash ede-java-classpath ede-linux-load ede-project-autoload-dirmatch ede-project-autoload-dirmatch-child-p ede-project-autoload-dirmatch-list-p ede-project-autoload-dirmatch-p ede-project-autoload-list-p ede-project-configurations-set ede-project-dirmatch-p ede-project-list-p ede-project-placeholder-list-p ede-set-project-local-variable ede-source-paths ede-sourcecode-list-p ede-target-list-p edebug--display edebug--enter-trace edebug--form-data-begin edebug--form-data-end edebug--form-data-name edebug--make-form-data-entry edebug--recursive-edit edebug--update-coverage ediff-display-pixel-height ediff-display-pixel-width ediff-setup-windows-default edt-default-menu-bar-update-buffers edt-user-menu-bar-update-buffers eieio-build-class-list eieio-custom-mode eieio-default-superclass-list-p eieio-help-find-class-definition eieio-help-find-method-definition eieio-instance-inheritor-list-p eieio-instance-tracker-list-p eieio-named-list-p eieio-persistent-convert-list-to-object eieio-persistent-list-p eieio-persistent-slot-type-is-class-p eieio-persistent-validate/fix-slot-value eieio-singleton-list-p eieio-speedbar-directory-button-list-p eieio-speedbar-file-button-list-p eieio-speedbar-list-p eieio-widget-test-class-list-p electric-buffer-menu-mode electric-pair-syntax electric-pair-will-use-region emacs-bzr-get-version emacs-bzr-version-bzr emacs-bzr-version-dirstate emacs-lisp-byte-code-comment emacs-lisp-byte-code-mode emacs-lisp-byte-code-syntax-propertize erc-canonicalize-server-name erc-hide-current-message-p erc-lurker-cleanup erc-lurker-initialize erc-lurker-maybe-trim erc-lurker-p erc-lurker-update-status erc-notifications-PRIVMSG erc-notifications-disable erc-notifications-enable erc-notifications-mode erc-notifications-notify erc-notifications-notify-on-match erc-server-join-channel eshell-pcomplete ffap--toggle-read-only file-name-base find-file--read-only fit-frame-to-buffer follow--window-sorter follow-adjust-window follow-align-compilation-windows follow-comint-scroll-to-bottom follow-mwheel-scroll follow-redraw-after-event follow-scroll-bar-drag follow-scroll-bar-scroll-down follow-scroll-bar-scroll-up follow-scroll-bar-toolkit-scroll fringe--check-style function-get gdb--if-arrow global-semantic-idle-local-symbol-highlight-mode gnus-funcall-no-warning gnus-notifications gnus-notifications-action gnus-notifications-get-photo gnus-notifications-get-photo-file gnus-notifications-notify gnus-recursive-directory-files gnus-registry--set/remove-mark gnus-score-decode-text-parts gnus-select-group-with-message-id gnus-simplify-group-name gnus-string-prefix-p gnus-summary-resend-message-insert-gcc gnus-summary-widget-backward gnus-sync-deep-print gnus-sync-fix-topic-group-position gnus-sync-invlist2range gnus-sync-json-alist-p gnus-sync-json-plist-p gnus-sync-lesync-DELETE gnus-sync-lesync-GET gnus-sync-lesync-POST gnus-sync-lesync-PUT gnus-sync-lesync-call gnus-sync-lesync-delete-group gnus-sync-lesync-find-prop gnus-sync-lesync-get-prop gnus-sync-lesync-groups-builder gnus-sync-lesync-install-group-entry gnus-sync-lesync-normalize-group-entry gnus-sync-lesync-parse gnus-sync-lesync-post-save-group-entry gnus-sync-lesync-pre-save-group-entry gnus-sync-lesync-read-group-entry gnus-sync-lesync-set-prop gnus-sync-lesync-setup gnus-sync-newsrc-loader-builder gnus-sync-position gnus-sync-range2invlist gnus-sync-subscribe-group gnus-sync-topic-group-position gnus-timer--function gnus-try-warping-via-registry gv--defsetter gv--defun-declaration gv-define-expander gv-define-setter gv-define-simple-setter gv-get gv-letplace help-bookmark-jump help-bookmark-make-record help-fns--autoloaded-p help-fns--compiler-macro help-fns--key-bindings help-fns--obsolete help-fns--parent-mode help-fns--signature hexl-ascii-start-column hexl-line-displen hexl-options hexl-rulerize holiday-in-range ibuffer-filter-by-derived-mode image-transform-check-size image-transform-fit-width image-transform-width imagemagick-filter-types indicate-copied-region info-emacs-bug internal--after-save-selected-window internal--after-with-selected-window internal--before-save-selected-window internal--before-with-selected-window internal-macroexpand-for-load internal-make-var-non-special isearch--get-state isearch--set-state isearch--state-barrier isearch--state-case-fold-search isearch--state-error isearch--state-forward isearch--state-message isearch--state-other-end isearch--state-p isearch--state-point isearch--state-pop-fun isearch--state-string isearch--state-success isearch--state-word isearch--state-wrapped isearch-forward-symbol isearch-search-fun-default isearch-symbol-regexp isearch-toggle-lax-whitespace isearch-toggle-symbol ispell-with-no-warnings json-encode-key list-buffers--refresh list-dynamic-libraries--loaded log-edit-font-lock-keywords log-edit-toggle-header ly-toggle-pdf-generation macroexp--accumulate macroexp--all-clauses macroexp--all-forms macroexp--backtrace macroexp--compiler-macro macroexp--cons macroexp--const-symbol-p macroexp--expand-all macroexp--funcall-if-compiled macroexp--maxsize macroexp--obsolete-warning macroexp--trim-backtrace-frame macroexp--warn-and-return macroexp-const-p macroexp-copyable-p macroexp-if macroexp-let* macroexp-let2 macroexp-progn macroexp-small-p macroexp-unprogn make-soap-simple-type math-C-parse-bess math-C-parse-fma math-check-unit-consistency math-consistent-units-p message-multi-smtp-send-mail minibuffer-default--in-prompt-regexps mm-archive-decoders mm-archive-dissect-and-inline mm-archive-list-files mm-dissect-archive mode-line-modified-help-echo mode-line-mule-info-help-echo mode-line-read-only-help-echo nnmaildir--add-flag nnmaildir--article-set-flags nnmaildir--ensure-suffix nnmaildir--flag-to-mark nnmaildir--mark-to-flag nnmaildir--remove-flag nnmaildir-request-update-info notifications-get-capabilities org-agenda-Quit org-agenda-bulk-mark-all org-agenda-bulk-unmark-all org-agenda-capture org-agenda-filter-by-top-category org-agenda-filter-top-category-apply org-agenda-finalize org-agenda-finalize-entries org-agenda-fit-window-to-buffer org-agenda-goto-block-beginning org-agenda-kill-all-agenda-buffers org-agenda-next-item org-agenda-prepare org-agenda-prepare-buffers org-agenda-prepare-window org-agenda-previous-item org-agenda-update-agenda-type org-agenda-use-sticky-p org-at-block-p org-at-comment-p org-at-encrypted-entry-p org-attach-attach-lns org-babel-calc-maybe-resolve-var org-babel-combine-header-arg-lists org-babel-enter-header-arg-w-completion org-babel-execute:io org-babel-execute:scala org-babel-exp-get-export-buffer org-babel-fortran-transform-list org-babel-header-arg-expand org-babel-io-evaluate org-babel-io-initiate-session org-babel-io-table-or-string org-babel-noweb-p org-babel-noweb-wrap org-babel-prep-session:io org-babel-prep-session:scala org-babel-scala-evaluate org-babel-scala-initiate-session org-babel-scala-table-or-string org-babel-set-current-result-hash org-babel-speed-command-activate org-backward-element org-backward-heading-same-level org-capture-expand-embedded-elisp org-capture-inside-embedded-elisp-p org-capture-string org-check-version org-clock-get-clocktable org-clock-in-last org-clock-sum-today org-columns-get-format org-columns-goto-top-level org-comment-line-break-function org-comment-or-uncomment-region org-contextualize-keys org-contextualize-validate-key org-create-formula-image-with-dvipng org-create-formula-image-with-imagemagick org-delete-directory org-display-inline-remove-overlay org-down-element org-drag-element-backward org-drag-element-forward org-element--collect-affiliated-keywords org-element--current-element org-element--get-next-object-candidates org-element--interpret-affiliated-keywords org-element--parse-elements org-element--parse-objects org-element-adopt-elements org-element-at-point org-element-babel-call-interpreter org-element-babel-call-parser org-element-bold-interpreter org-element-bold-parser org-element-center-block-interpreter org-element-center-block-parser org-element-clock-interpreter org-element-clock-parser org-element-code-interpreter org-element-code-parser org-element-comment-block-interpreter org-element-comment-block-parser org-element-comment-interpreter org-element-comment-parser org-element-contents org-element-context org-element-drawer-interpreter org-element-drawer-parser org-element-dynamic-block-interpreter org-element-dynamic-block-parser org-element-entity-interpreter org-element-entity-parser org-element-example-block-interpreter org-element-example-block-parser org-element-export-block-interpreter org-element-export-block-parser org-element-export-snippet-interpreter org-element-export-snippet-parser org-element-export-snippet-successor org-element-fixed-width-interpreter org-element-fixed-width-parser org-element-footnote-definition-interpreter org-element-footnote-definition-parser org-element-footnote-reference-interpreter org-element-footnote-reference-parser org-element-footnote-reference-successor org-element-headline-interpreter org-element-headline-parser org-element-horizontal-rule-interpreter org-element-horizontal-rule-parser org-element-inline-babel-call-interpreter org-element-inline-babel-call-parser org-element-inline-babel-call-successor org-element-inline-src-block-interpreter org-element-inline-src-block-parser org-element-inline-src-block-successor org-element-inlinetask-interpreter org-element-inlinetask-parser org-element-interpret-data org-element-italic-interpreter org-element-italic-parser org-element-item-interpreter org-element-item-parser org-element-keyword-interpreter org-element-keyword-parser org-element-latex-environment-interpreter org-element-latex-environment-parser org-element-latex-fragment-interpreter org-element-latex-fragment-parser org-element-latex-or-entity-successor org-element-line-break-interpreter org-element-line-break-parser org-element-line-break-successor org-element-link-interpreter org-element-link-parser org-element-link-successor org-element-macro-interpreter org-element-macro-parser org-element-macro-successor org-element-map org-element-nested-p org-element-normalize-contents org-element-normalize-string org-element-paragraph-interpreter org-element-paragraph-parser org-element-parse-buffer org-element-parse-secondary-string org-element-plain-list-interpreter org-element-plain-list-parser org-element-planning-interpreter org-element-planning-parser org-element-property org-element-property-drawer-interpreter org-element-property-drawer-parser org-element-put-property org-element-quote-block-interpreter org-element-quote-block-parser org-element-quote-section-interpreter org-element-quote-section-parser org-element-radio-target-interpreter org-element-radio-target-parser org-element-radio-target-successor org-element-restriction org-element-section-interpreter org-element-section-parser org-element-set-contents org-element-set-element org-element-special-block-interpreter org-element-special-block-parser org-element-src-block-interpreter org-element-src-block-parser org-element-statistics-cookie-interpreter org-element-statistics-cookie-parser org-element-statistics-cookie-successor org-element-strike-through-interpreter org-element-strike-through-parser org-element-sub/superscript-successor org-element-subscript-interpreter org-element-subscript-parser org-element-superscript-interpreter org-element-superscript-parser org-element-swap-A-B org-element-table-cell-interpreter org-element-table-cell-parser org-element-table-cell-successor org-element-table-interpreter org-element-table-parser org-element-table-row-interpreter org-element-table-row-parser org-element-target-interpreter org-element-target-parser org-element-target-successor org-element-text-markup-successor org-element-timestamp-interpreter org-element-timestamp-parser org-element-timestamp-successor org-element-type org-element-underline-interpreter org-element-underline-parser org-element-verbatim-interpreter org-element-verbatim-parser org-element-verse-block-interpreter org-element-verse-block-parser org-escape-code-in-region org-escape-code-in-string org-export-handle-metalines org-fill-line-break-nobreak-p org-fill-paragraph-separate-nobreak-p org-fill-paragraph-with-timestamp-nobreak-p org-find-invisible-foreground org-find-library-dir org-find-top-category org-fix-ellipsis-at-bol org-forward-element org-forward-heading-same-level org-git-version org-goto-map org-icalendar-finish-file org-icalendar-print-entries org-icalendar-start-file org-icalendar-ts-to-string org-in-fixed-width-region-p org-in-src-block-p org-in-subtree-not-table-p org-inc-effort org-indent-block org-indent-drawer org-indent-line org-indent-region org-insert-all-links org-insert-comment org-insert-drawer org-latex-color org-latex-color-format org-link-fontify-links-to-this-file org-link-prettify org-list-get-item-number org-lparse-preprocess-after-blockquote org-lparse-strip-experimental-blocks-maybe org-mark-element org-narrow-to-element org-no-popups org-odt-cleanup-xml-buffers org-re-property-keyword org-re-timestamp org-redisplay-inline-images org-refresh-properties org-release org-setup-comments-handling org-setup-filling org-show-priority org-speed-command-activate org-src-in-org-buffer org-src-tangle org-toggle-custom-properties-visibility org-toggle-sticky-agenda org-transpose-element org-unescape-code-in-region org-unescape-code-in-string org-unindent-buffer org-up-element org-vm-imap-open org-vm-select-message org-with-buffer-modified-unmodified orgtbl-to-table\.el orgtbl-to-unicode pcase--let* pcase--mark-used pcase--self-quoting-p pcomplete--common-suffix pcomplete/org-mode/drawer pcomplete/org-mode/file-option/author pcomplete/org-mode/file-option/date pcomplete/org-mode/file-option/email pcomplete/org-mode/file-option/options pcomplete/org-mode/file-option/title pcomplete/org-mode/file-option/x plstore--decode plstore--encode plstore--write-contents-functions plstore-mode plstore-mode-decoded plstore-mode-original plstore-mode-toggle-display popup-menu-normalize-position posnp proced-marked-processes proced-renice proced-with-processes-buffer profiler-calltree-build profiler-calltree-build-1 profiler-calltree-children profiler-calltree-compute-percentages profiler-calltree-count profiler-calltree-count-percent profiler-calltree-count< profiler-calltree-count> profiler-calltree-depth profiler-calltree-entry profiler-calltree-find profiler-calltree-leaf-p profiler-calltree-p profiler-calltree-parent profiler-calltree-sort profiler-calltree-walk profiler-compare-logs profiler-compare-profiles profiler-cpu-log profiler-cpu-profile profiler-cpu-running-p profiler-cpu-start profiler-cpu-stop profiler-ensure-string profiler-find-profile profiler-find-profile-other-frame profiler-find-profile-other-window profiler-fixup-backtrace profiler-fixup-entry profiler-fixup-log profiler-fixup-profile profiler-format profiler-format-entry profiler-format-number profiler-format-percent profiler-make-calltree profiler-make-profile profiler-memory-log profiler-memory-profile profiler-memory-running-p profiler-memory-start profiler-memory-stop profiler-profile-diff-p profiler-profile-log profiler-profile-tag profiler-profile-timestamp profiler-profile-type profiler-profile-version profiler-read-profile profiler-report profiler-report-ascending-sort profiler-report-calltree-at-point profiler-report-collapse-entry profiler-report-compare-profile profiler-report-cpu profiler-report-descending-sort profiler-report-describe-entry profiler-report-expand-entry profiler-report-find-entry profiler-report-header-line-format profiler-report-insert-calltree profiler-report-insert-calltree-children profiler-report-line-format profiler-report-make-buffer-name profiler-report-make-entry-part profiler-report-make-name-part profiler-report-memory profiler-report-mode profiler-report-move-to-entry profiler-report-next-entry profiler-report-previous-entry profiler-report-profile profiler-report-profile-other-frame profiler-report-profile-other-window profiler-report-render-calltree profiler-report-render-calltree-1 profiler-report-render-reversed-calltree profiler-report-rerender-calltree profiler-report-setup-buffer profiler-report-setup-buffer-1 profiler-report-toggle-entry profiler-report-write-profile profiler-reset profiler-start profiler-stop profiler-write-profile prolog-smie-backward-token prolog-smie-forward-token prolog-smie-rules python-comint-output-filter-function python-completion-complete-at-point python-define-auxiliary-skeleton python-eldoc--get-doc-at-point python-eldoc-at-point python-ffap-module-path python-fill-comment python-fill-decorator python-fill-paren python-fill-string python-imenu-prev-index-position python-indent-calculate-indentation python-indent-calculate-levels python-indent-context python-indent-dedent-line python-indent-dedent-line-backspace python-indent-electric-colon python-indent-guess-indent-offset python-indent-line-function python-indent-post-self-insert-function python-indent-shift-left python-indent-shift-right python-indent-toggle-levels python-info-assignment-continuation-line-p python-info-beginning-of-backslash python-info-beginning-of-block-p python-info-beginning-of-statement-p python-info-block-continuation-line-p python-info-closing-block python-info-closing-block-message python-info-continuation-line-p python-info-current-defun python-info-current-line-comment-p python-info-current-line-empty-p python-info-current-symbol python-info-end-of-block-p python-info-end-of-statement-p python-info-line-ends-backslash-p python-info-looking-at-beginning-of-defun python-info-ppss-comment-or-string-p python-info-ppss-context python-info-ppss-context-type python-info-statement-ends-block-p python-info-statement-starts-block-p python-nav--backward-sexp python-nav--beginning-of-defun python-nav--forward-sexp python-nav--up-list python-nav-backward-block python-nav-backward-statement python-nav-backward-up-list python-nav-beginning-of-block python-nav-beginning-of-defun python-nav-beginning-of-statement python-nav-end-of-block python-nav-end-of-defun python-nav-end-of-statement python-nav-forward-block python-nav-forward-sexp python-nav-forward-statement python-nav-lisp-forward-sexp-safe python-nav-up-list python-pdbtrack-comint-output-filter-function python-pdbtrack-set-tracked-buffer python-shell-calculate-exec-path python-shell-calculate-process-environment python-shell-completion-complete-at-point python-shell-completion-complete-or-indent python-shell-completion-get-completions python-shell-get-or-create-process python-shell-get-process python-shell-get-process-name python-shell-internal-get-or-create-process python-shell-internal-get-process-name python-shell-internal-send-string python-shell-make-comint python-shell-output-filter python-shell-parse-command python-shell-send-buffer python-shell-send-defun python-shell-send-file python-shell-send-region python-shell-send-setup-code python-shell-send-string python-shell-send-string-no-output python-shell-switch-to-shell python-skeleton--else python-skeleton--except python-skeleton--finally python-skeleton-add-menu-items python-skeleton-class python-skeleton-def python-skeleton-define python-skeleton-for python-skeleton-if python-skeleton-try python-skeleton-while python-syntax-comment-or-string-p python-syntax-context python-syntax-context-type python-syntax-count-quotes python-syntax-stringify python-util-clone-local-variables python-util-forward-comment python-util-goto-line quail-deactivate quit-restore-window re-search-backward-lax-whitespace re-search-forward-lax-whitespace read-only-mode reftex-format-special reftex-get-string-refs reftex-hyperref-autopageref reftex-hyperref-autoref reftex-ref-style-activate reftex-ref-style-list reftex-ref-style-toggle reftex-remove-if reftex-report-bug reftex-select-cycle-ref-style-backward reftex-select-cycle-ref-style-forward reftex-select-cycle-ref-style-internal reftex-varioref-Ref reftex-varioref-Vref reftex-varioref-vpageref registry-db-list-p robin-deactivate rst-adaptive-fill rst-adjust-adornment rst-adjust-adornment-work rst-adornment-complete-p rst-arabic-to-roman rst-comment-indent rst-comment-insert-comment rst-comment-line-break rst-comment-region rst-compare-adornments rst-compute-tabs rst-define-key rst-display-adornments-hierarchy rst-extract-version rst-find-all-adornments rst-find-title-line rst-font-lock-extend-region rst-font-lock-extend-region-extend rst-font-lock-extend-region-internal rst-font-lock-find-unindented-line-limit rst-font-lock-find-unindented-line-match rst-font-lock-handle-adornment-matcher rst-font-lock-handle-adornment-pre-match-form rst-forward-line rst-get-adornment-match rst-get-adornments-around rst-get-next-adornment rst-imenu-convert-cell rst-imenu-create-index rst-imenu-find-adornments-for-position rst-indent-line rst-insert-list rst-insert-list-continue rst-insert-list-new-item rst-insert-list-pos rst-line-tabs rst-position-if rst-re rst-reset-section-caches rst-roman-to-arabic rst-shift-region rst-signum rst-some rst-straighten-adornments rst-suggest-new-adornment rst-testcover-add-1value rst-testcover-add-compose rst-testcover-defcustom rst-uncomment-region ruby-brace-to-do-end ruby-do-end-to-brace ruby-match-expression-expansion ruby-singleton-class-p ruby-syntax-enclosing-percent-literal ruby-syntax-propertize-percent-literal ruby-toggle-block run-python-internal search-backward-lax-whitespace search-forward-lax-whitespace semantic-complete-inline-project semantic-create-tag-proxy semantic-default-texi-setup semantic-error-if-unparsed semantic-find-tags-included semantic-ia-complete-symbol-menu semantic-subst-char-in-string semantic-symref-tool-cscope-list-p semantic-symref-tool-global-list-p semantic-symref-tool-grep-list-p semantic-symref-tool-idutils-list-p semantic-tag-resolve-proxy semantic-tag-set-proxy semantic-test-data-cache semanticdb-database-typecache-list-p semanticdb-project-database-file-list-p semanticdb-typecache-list-p server-generate-key server-get-auth-key ses-cell-formula-aset ses-cell-p ses-cell-references-aset ses-create-cell-variable ses-rename-cell ses-replace-name-in-formula set-temporary-overlay-map setq-local sh--inside-noncommand-expression sh--maybe-here-document sh-electric-here-document-mode sh-smie--continuation-start-indent sh-smie--keyword-p sh-smie--looking-back-at-continuation-p sh-smie--newline-semi-p sh-smie--rc-after-special-arg-p sh-smie--rc-newline-semi-p sh-smie--sh-keyword-in-p sh-smie--sh-keyword-p sh-smie-rc-backward-token sh-smie-rc-forward-token sh-smie-rc-rules sh-smie-sh-backward-token sh-smie-sh-forward-token sh-smie-sh-rules shell--parse-pcomplete-arguments shell--requote-argument shell--unquote&requote-argument shell--unquote-argument shr-render-buffer shr-zoom-image sieve-upload-and-kill smie-auto-fill smie-indent--bolp-1 soap-encode-simple-type soap-inspect-simple-type soap-parse-simple-type soap-resolve-references-for-simple-type soap-sample-value-for-simple-type soap-simple-type-enumeration soap-simple-type-kind soap-simple-type-name soap-simple-type-namespace-tag soap-simple-type-p solitaire-build-mode-line spam-exists-in-BBDB-p srecode-semantic-handle-:c system-groups system-users table-function tabulated-list--column-number tabulated-list--sort-by-column-name tabulated-list-delete-entry tabulated-list-entry-size-> tabulated-list-get-entry tabulated-list-print-col tabulated-list-print-fake-header tabulated-list-set-col tabulated-list-sort temp-buffer-window-setup temp-buffer-window-show term-pager-menu term-signals-menu term-terminal-menu texinfo-sort-region texinfo-sort-startkeyfun timeclock-mode-line-display timeclock-update-mode-line timer--psecs tramp-cleanup tramp-compat-condition-case-unless-debug tramp-file-name-hop tramp-parse-file tramp-parse-group tramp-parse-shostkeys-sknownhosts tramp-smb-action-with-tar tramp-smb-call-winexe tramp-smb-handle-process-file tramp-smb-handle-start-file-process tramp-smb-kill-winexe-function tramp-smb-shell-quote-argument tty-top-frame url--allowed-chars url-build-query-string url-domsuf-cookie-allowed-p url-domsuf-parse-file url-encode-url url-path-and-query url-port-if-non-default user-error vc-compilation-mode vc-dir-hide-state vc-git-log-edit-mode vc-git-log-edit-toggle-amend vc-git-log-edit-toggle-signoff vc-sccs-write-revision verilog-auto-assign-modport verilog-auto-inout-modport verilog-auto-inout-param verilog-auto-logic-setup verilog-auto-template-lint verilog-auto-undef verilog-batch-delete-trailing-whitespace verilog-clog2 verilog-decls-append verilog-decls-get-iovars verilog-decls-get-modports verilog-decls-princ verilog-forward-or-insert-line verilog-modi-cache-add-gparams verilog-modi-modport-lookup verilog-modi-modport-lookup-one verilog-modport-clockings verilog-modport-clockings-add verilog-modport-decls verilog-modport-decls-set verilog-modport-name verilog-modport-new verilog-modport-princ verilog-pretty-declarations-auto verilog-read-auto-template-hit verilog-read-auto-template-middle verilog-save-font-mods verilog-sig-type-set verilog-signals-edit-wire-reg verilog-signals-in verilog-signals-princ verilog-signals-with verilog-warn verilog-warn-error vhdl-back-to-indentation vhdl-fix-clause-buffer vhdl-in-extended-identifier-p vhdl-in-quote-p vhdl-template-package-electrical-systems vhdl-template-package-energy-systems vhdl-template-package-fluidic-systems vhdl-template-package-fundamental-constants vhdl-template-package-material-constants vhdl-template-package-mechanical-systems vhdl-template-package-radiant-systems vhdl-template-package-thermal-systems vhdl-upcase-list viper-deactivate-input-method viper-deactivate-input-method-action which-func-update-ediff-windows widget-documentation-string-indent-to window--display-buffer window--major-non-side-window window--major-side-window window--maybe-raise-frame window--size-ignore-p window-system-for-display wisent-grammar-mode with-temp-buffer-window with-tramp-connection-property with-tramp-file-property with-tramp-progress-reporter woman-break-table x-apply-session-resources x-get-selection-value x-selection-value xml--entity-replacement-text xml--parse-buffer xml-parse-tag-1 xscheme-mode-line-initialize xterm-mouse--read-event-sequence-1000 xterm-mouse--read-event-sequence-1006 xterm-mouse-translate-1 xterm-mouse-translate-extended yank-handle-category-property yank-handle-font-lock-face-property zone-hiding-mode-line)) - (variables - (removed *gensym-counter* *org-bibtex-entries* *random-state* :continue :prompt-time Buffer-menu--buffers Buffer-menu-buffer-column Buffer-menu-short-ellipsis Buffer-menu-sort-button-map Buffer-menu-sort-column Info-next-link-keymap Info-prev-link-keymap Info-up-link-keymap Man-overstrike-face Man-refpages-alist Man-reverse-face Man-sections-alist Man-underline-face activate-menubar-hook apropos-keybinding-face apropos-label-face apropos-property-face apropos-symbol-face autoload-make-program byte-debug-flag bytecomp-load-hook check-markers-debug-flag cl-active-block-names cl-compiling-file cl-hacked-flag cl-macroexpand-cmacs cl-old-bc-file-form cl-old-macroexpand cl-safe-funcs cl-simple-funcs cvs-changelog-full-paragraphs cvs-commit-buffer-require-final-newline cvs-diff-buffer-name cvs-diff-ignore-marks dbus-message-type-error dbus-message-type-invalid dbus-message-type-method-call dbus-message-type-method-return dbus-message-type-signal emerge-version ess-ask-for-ess-directory ess-local-process-name facemenu-unlisted-faces flyspell-casechars-cache flyspell-ispell-casechars-cache flyspell-ispell-not-casechars-cache flyspell-not-casechars-cache foldout-modeline-string follow-avoid-tail-recenter-p follow-deactive-menu follow-intercept-processes follow-mode-off-hook follow-process-filter-alist gdb-frame-parameters gnus-agent-send-mail-function gnus-local-organization gnus-nntp-service gnus-propagate-marks idlwave-default-completion-case-is-down idlwave-libinfo-file idlwave-library-routines idlwave-shell-activate-alt-keybindings idlwave-shell-fix-inserted-breaks idlwave-shell-print-expression-function idlwave-shell-use-breakpoint-glyph inferior-python-filter-regexp isearch-lazy-highlight-space-regexp jython-mode-abbrev-table jython-mode-map jython-mode-syntax-table lambda-list-keywords last-command-char last-input-char life-initialized ly-win32-ly-path ly-win32-midi-path ly-win32-pdf-path mode-line-inverse-video nnfolder-marks nnfolder-marks-directory nnfolder-marks-file-suffix nnfolder-marks-is-evil nnfolder-marks-modtime nnml-marks nnml-marks-file-name nnml-marks-is-evil nnml-marks-modtime nntp-coding-system-for-read nntp-coding-system-for-write nntp-marks nntp-marks-directory nntp-marks-file-name nntp-marks-is-evil nntp-marks-modtime nntp-server-to-method-cache obe-marker org-adaptive-fill-regexp-backup org-agenda-action-marker org-agenda-last-arguments org-agenda-no-heading-message org-babel-header-arg-names:R org-babel-header-arg-names:clojure org-babel-header-arg-names:lisp org-babel-header-arg-names:sql org-babel-header-arg-names:sqlite org-calendar-agenda-action-key org-goto-map org-pre-agenda-window-conf org-todo-only org-url-encoding-use-url-hexify pcomplete-quote-arg-hook python--prompt-regexp python-block-pairs python-command python-compilation-regexp-alist python-continuation-offset python-default-template python-honour-comment-indentation python-imports python-indent-index python-indent-list python-indent-list-length python-indent-string-contents python-jython-command python-jython-packages python-pdbtrack-do-tracking-p python-pdbtrack-input-prompt python-pdbtrack-is-tracking-p python-pdbtrack-minor-mode-string python-pdbtrack-stack-entry-regexp python-pdbtrack-track-range python-preoutput-continuation python-preoutput-leftover python-preoutput-skip-next-prompt python-prev-dir/file python-python-command python-remove-cwd-from-path python-saved-check-command python-shell-continuation-prompt-alist python-shell-prompt-alist python-source-modes python-space-backslash-table python-version-checked python-which-func-length-limit redisplay-preemption-period reftex-extra-bindings-map reftex-extra-bindings-prefix reftex-index-phrases-mode-syntax-table repeat-last-self-insert repeat-num-input-keys-at-self-insert repeat-undo-count rmail-decode-mime-charset rst-adornment-level-alist rst-font-lock-adornment-point rst-font-lock-indentation-point rst-font-lock-level rst-level-1-face rst-level-2-face rst-level-3-face rst-level-4-face rst-level-5-face rst-level-6-face rst-level-face-base-color rst-level-face-base-light rst-level-face-format-light rst-level-face-max rst-level-face-step-light rst-mode-lazy rst-new-decoration-down rst-re-bullets rst-re-items rst-section-text-regexp rst-shift-fill-region rst-toc-return-buffer rst-use-char-classes sc-version scoped-class sha1-program term-bold-attribute term-completion-menu term-inout-menu this tramp-default-password-end-of-line unread-command-char url-cookie-two-dot-domains vc-bzr-error-regex-alist vc-bzr-sha1-program vc-checkout-carefully vc-ignore-vc-files vc-master-templates vhdl-93-attributes vhdl-93-enum-values vhdl-93-functions vhdl-93-keywords vhdl-93-packages vhdl-93-types xml-name-regexp) - (added :action-items :addlevel :allow-list :allow-replacement :already-owner :archivedp :back-end :begin :block-name :bus :clock :clocktable :commentedp :configregex :configregexidx :contents-begin :contents-end :count-percent :counter :decrypted :diff-p :do-not-queue :drawer-name :eavesdrop :empty-lines-after :empty-lines-before :entry :enumeration :exists :export :file-desc :footnote-section-p :fromconfig :grp :hiddenp :ignore-list :in-queue :inline-definition :label-fmt :latex :latex-math-p :latin1 :macos-keychain-generic :macos-keychain-internet :no-article :no-display :no-escape :number-lines :object-path :order :org-clock-minutes-today :pad-right :parameters :post-blank :pre-blank :preserve-indent :primary-owner :proj-root-dirmatch :property :proxy :quotedp :range-end :raw-link :raw-value :replace-existing :resident :retain-labels :reverse :seq :serial :short-caption :shy :signal :skipheadrule :src-block :structure :switches :tblfm :time :todo-type :transient :use-brackets-p :use-labels :utf-8 :wrap Buffer-menu-name-width Buffer-menu-size-width Info-file-attributes Man--last-refpage Man--last-section Man--refpages Man--sections Man-ansi-color-map allout-exposure-change-functions allout-structure-added-functions allout-structure-deleted-functions allout-structure-shifted-functions archive-extract-hook async-shell-command-buffer battery--linux-sysfs-regexp byte-compile-root-dir c-parse-state-point c-prepare-bug-report-hook c-state-old-cpp-beg-marker c-state-old-cpp-end-marker cal-html-holidays cal-tex-lefthead cal-tex-righthead calc-ensure-consistent-units calendar-american-month-header calendar-european-month-header calendar-iso-month-header calendar-month-header checkdoc-comment-style-functions checkdoc-style-functions cl--active-block-names cl--compiling-file cl--function-convert-cache cl--gensym-counter cl--labels-convert-cache cl--lambda-list-keywords cl--old-macroexpand cl--random-state cl--safe-funcs cl--simple-funcs cl-custom-print-functions cl-float-epsilon cl-float-negative-epsilon cl-least-negative-float cl-least-negative-normalized-float cl-least-positive-float cl-least-positive-normalized-float cl-most-negative-float cl-most-positive-float cl-struct-edebug--form-data-tags cl-struct-isearch--state-tags cl-struct-profiler-calltree-tags cl-struct-profiler-profile-tags cl-struct-soap-simple-type-tags comint-requote-function comint-unquote-function comment-inline-offset compilation-always-kill completion--all-sorted-completions-location create-lockfiles crisp-mode-mode-line-string custom-group-doc-align-col dbus-event-error-functions dbus-interface-emacs dbus-interface-objectmanager deactivate-current-input-method-function debug-on-message debugger-bury-or-kill debugger-previous-window debugger-previous-window-height defun-declarations-alist delete-trailing-lines diff--auto-refine-data diff-use-changed-face display-format-alist doc-view-paper-sizes doc-view-saved-settings ede-project-autoload-dirmatch edebug-inhibit-emacs-lisp-mode-bindings eieio-custom-mode-abbrev-table eieio-custom-mode-map eieio-custom-mode-syntax-table eieio-pre-method-execution-functions electric-buffer-menu-mode-abbrev-table electric-buffer-menu-mode-syntax-table emacs-bzr-version emacs-lisp-byte-code-mode-abbrev-table emacs-lisp-byte-code-mode-map emacs-lisp-byte-code-mode-syntax-table emacs-list-byte-code-comment-re emacs-lock-locked-buffer-functions enable-remote-dir-locals erc-dcc-chat-filter-functions erc-lurker-cleanup-count erc-lurker-cleanup-interval erc-lurker-hide-list erc-lurker-ignore-chars erc-lurker-state erc-lurker-threshold-time erc-lurker-trim-nicks erc-match-exclude-server-buffer erc-notifications-icon erc-notifications-last-notification erc-notifications-mode erc-server-timestamp-format eshell-status-in-mode-line file-auto-mode-skip filesets-cache-fill-content-hook fit-frame-to-buffer fit-frame-to-buffer-bottom-margin flymake-error-bitmap flymake-fringe-indicator-position flymake-warning-bitmap flymake-warning-re foldout-mode-line-string follow-inactive-menu gdb-display-buffer-other-frame-action gnus-gcc-post-body-encode-hook gnus-gcc-pre-body-encode-hook gnus-gcc-self-resent-messages gnus-notifications-id-to-msg gnus-notifications-minimum-level gnus-notifications-sent gnus-notifications-timeout gnus-notifications-use-google-contacts gnus-notifications-use-gravatar gnus-picon-properties gnus-subscribe-newsgroup-functions gnus-sync-lesync-design-prefix gnus-sync-lesync-install-topics gnus-sync-lesync-name gnus-sync-lesync-props-hash gnus-sync-lesync-security-object help-enable-auto-load hexl-bits hexl-rulers hfy-post-html-hook icalendar-import-format-uid ido-buffer-disable-smart-matches image-transform-right-angle-fudge image-transform-scale imagemagick--file-regexp imagemagick-enabled-types imenu--cleanup-seen inferior-python-mode-hook inhibit-debugger input-method-deactivate-hook isearch-lax-whitespace isearch-lazy-highlight-lax-whitespace isearch-lazy-highlight-regexp-lax-whitespace isearch-regexp-lax-whitespace ispell-buffer-session-localwords ispell-emacs-alpha-regexp log-edit-font-lock-gnu-keywords log-edit-font-lock-gnu-style log-edit-vc-backend ly-gen-pdf ly-w32-ly-path ly-w32-midi-path ly-w32-pdf-path macro-declarations-alist macroexp--pending-eager-loads math-normalize-error mh-kill-folder-suppress-prompt-functions minibuffer-eldef-shorten-default minibuffer-local-filename-syntax mm-archive-decoders mm-inhibit-auto-detect-attachment mode-line-default-help-echo mode-line-end-spaces mode-line-front-space mode-line-misc-info mouse-avoidance-banish-position nndiary-request-accept-article-functions nndiary-request-create-group-functions nndiary-request-update-info-functions nnmaildir-flag-mark-mapping nntp--report-1 notifications-get-capabilities-method nxml-glyph-set-functions org-additional-option-like-keywords-for-flyspell org-agenda-buffer org-agenda-buffer-tmp-name org-agenda-bulk-mark-char org-agenda-custom-commands-contexts org-agenda-diary-sexp-prefix org-agenda-doing-sticky-redo org-agenda-filtered-by-top-category org-agenda-finalize-hook org-agenda-inhibit-startup org-agenda-last-prefix-arg org-agenda-local-vars org-agenda-menu-two-columns org-agenda-overriding-cmd org-agenda-overriding-cmd-arguments org-agenda-persistent-marks org-agenda-pre-follow-window-conf org-agenda-pre-window-conf org-agenda-skip-timestamp-if-deadline-is-shown org-agenda-sticky org-agenda-this-buffer-is-sticky org-agenda-this-buffer-name org-agenda-top-category-filter org-agenda-use-tag-inheritance org-allow-promoting-top-level-subtree org-babel-default-header-args:io org-babel-default-header-args:scala org-babel-exeext org-babel-exp-call-line-template org-babel-exp-code-template org-babel-header-args:R org-babel-header-args:clojure org-babel-header-args:lisp org-babel-header-args:sql org-babel-header-args:sqlite org-babel-io-command org-babel-io-wrapper-method org-babel-noweb-wrap-end org-babel-noweb-wrap-start org-babel-scala-command org-babel-scala-wrapper-method org-beamer-inherited-properties org-bibtex-entries org-called-with-limited-levels org-capture-bookmark org-capture-entry org-capture-initial org-capture-prepare-finalize-hook org-capture-templates-contexts org-capture-use-agenda-date org-clock-adjust-closest org-clock-clocked-in-display org-clock-continuously org-clock-file-time-cell-format org-clock-frame-title-format org-clock-mode-line-total org-clock-out-time org-clock-total-time-cell-format org-cmd org-custom-properties org-custom-properties-overlays org-datetree-add-timestamp org-ditaa-jar-option org-doi-server-url org-element--affiliated-re org-element-affiliated-keywords org-element-all-elements org-element-all-objects org-element-all-successors org-element-block-name-alist org-element-dual-keywords org-element-greater-elements org-element-keyword-translation-alist org-element-multiple-keywords org-element-object-restrictions org-element-object-successor-alist org-element-paragraph-separate org-element-parsed-keywords org-element-recursive-objects org-element-secondary-value-alist org-export-html-date-format-string org-export-latex-hyperref-options-format org-export-latex-link-with-unknown-path-format org-export-latex-tables-hline org-export-latex-tables-tend org-export-latex-tables-tstart org-fb-vars org-frame-title-format-backup org-habit-show-all-today org-id-link-to-org-use-id org-inlinetask-show-first-star org-keys org-latex-create-formula-image-program org-latex-preview-ltxpng-directory org-link-links-in-this-file org-match org-odt-zip-dir org-options-keywords org-protocol-data-separator org-sparse-tree-default-date-type org-timer-display org-ts-type org-url-hexify-p org-x11idle-exists-p package-menu--new-package-list paragraph-indent-minor-mode pascal--extra-indent pcmpl-rpm-cache pcmpl-rpm-cache-stamp-file pcmpl-rpm-cache-time pcmpl-rpm-packages pcmpl-rpm-query-options pcomplete-requote-argument-function perl-indent-parens-as-block plstore-encoded plstore-mode-abbrev-table plstore-mode-map plstore-mode-syntax-table proced-renice-command profiler-log-size profiler-max-stack-depth profiler-report-closed-mark profiler-report-cpu-line-format profiler-report-leaf-mark profiler-report-memory-line-format profiler-report-mode-abbrev-table profiler-report-mode-map profiler-report-mode-syntax-table profiler-report-open-mark profiler-report-order profiler-report-profile profiler-report-reversed profiler-sampling-interval profiler-version prolog-smie-grammar prolog-use-smie python-check-buffer-name python-check-custom-command python-eldoc-setup-code python-eldoc-string-code python-ffap-setup-code python-ffap-string-code python-fill-comment-function python-fill-decorator-function python-fill-docstring-style python-fill-paren-function python-fill-string-function python-indent-current-level python-indent-dedenters python-indent-guess-indent-offset python-indent-levels python-indent-offset python-indent-trigger-commands python-nav-beginning-of-defun-regexp python-pdbtrack-activate python-pdbtrack-buffers-to-kill python-pdbtrack-stacktrace-info-regexp python-pdbtrack-tracked-buffer python-shell--parent-buffer python-shell-buffer-name python-shell-compilation-regexp-alist python-shell-completion-module-string-code python-shell-completion-pdb-string-code python-shell-completion-setup-code python-shell-completion-string-code python-shell-enable-font-lock python-shell-exec-path python-shell-extra-pythonpaths python-shell-internal-buffer python-shell-internal-buffer-name python-shell-internal-last-output python-shell-interpreter python-shell-interpreter-args python-shell-output-filter-buffer python-shell-output-filter-in-progress python-shell-output-syntax-table python-shell-process-environment python-shell-prompt-block-regexp python-shell-prompt-output-regexp python-shell-prompt-pdb-regexp python-shell-prompt-regexp python-shell-setup-codes python-shell-virtualenv-path python-skeleton-autoinsert python-skeleton-available rcirc-activity-functions rcirc-kill-channel-buffers rcirc-print-functions rcirc-receive-message-functions rcirc-sentinel-functions read-passwd-map real-this-command reftex-cite-key-separator reftex-create-bibtex-footer reftex-create-bibtex-header reftex-index-phrases-syntax-table reftex-ref-macro-prompt reftex-ref-style-alist reftex-ref-style-default-list register-separator replace-lax-whitespace replace-regexp-lax-whitespace rst-adornment-chars rst-all-sections rst-arabic-to-roman rst-cvs-header rst-cvs-rev rst-cvs-timestamp rst-font-lock-adornment-level rst-font-lock-adornment-match rst-font-lock-find-unindented-line-begin rst-font-lock-find-unindented-line-end rst-font-lock-keywords rst-indent-comment rst-indent-field rst-indent-literal-minimized rst-indent-literal-normal rst-indent-width rst-initial-enums rst-initial-items rst-max-inline-length rst-new-adornment-down rst-official-cvs-rev rst-official-version rst-package-emacs-version-alist rst-preferred-adornments rst-re-alist rst-re-alist-def rst-section-hierarchy rst-svn-rev rst-svn-timestamp rst-toc-return-wincfg rst-uri-schemes rst-version ruby-defun-beg-re ruby-percent-literal-beg-re ruby-syntax-methods-before-regexp semantic-displayor-tooltip-initial-max-tags semantic-displayor-tooltip-mode semantic-lex-reset-functions server-auth-key sh-electric-here-document-mode sh-indent-after-continuation sh-smie--sh-operators sh-smie--sh-operators-back-re sh-smie--sh-operators-re sh-smie-rc-grammar sh-smie-sh-grammar sh-use-smie sql-db2-escape-newlines strokes-lighter subword-backward-function subword-backward-regexp subword-forward-function subword-forward-regexp switch-to-buffer-preserve-window-point tabulated-list--header-overlay tabulated-list--header-string tabulated-list-use-header-line temp-buffer-window-setup-hook temp-buffer-window-show-hook term-mode-abbrev-table term-mode-syntax-table term-pager-menu timeclock-mode-line-display tramp-current-connection tramp-message-show-progress-reporter-message tramp-postfix-hop-format tramp-postfix-hop-regexp tramp-remote-file-name-spec-regexp tramp-restricted-shell-hosts-alist tramp-save-ad-hoc-proxies tramp-smb-actions-with-tar tramp-smb-server-version tramp-smb-winexe-program tramp-smb-winexe-shell-command tramp-smb-winexe-shell-command-switch tramp-smb-wrong-passwd-regexp url-domsuf-domains url-encoding-table url-host-allowed-chars url-path-allowed-chars url-query-allowed-chars vc-bzr-error-regexp-alist vc-git-error-regexp-alist vc-git-log-edit-mode-abbrev-table vc-git-log-edit-mode-map vc-git-log-edit-mode-syntax-table vc-hg-error-regexp-alist vc-rcs-rcs2log-program verilog-after-save-font-hook verilog-auto-inst-interfaced-ports verilog-auto-template-hits verilog-auto-template-warn-unused verilog-before-save-font-hook verilog-save-font-mod-hooked verilog-warn-fatal vhdl-02-attributes vhdl-02-enum-values vhdl-02-functions vhdl-02-keywords vhdl-02-packages vhdl-02-types vhdl-ams-constants vhdl-array-index-record-field-in-sensitivity-list vhdl-comment-display-line-char vhdl-compile-absolute-path vhdl-compile-post-command vhdl-constants-regexp vhdl-indent-comment-like-next-code-line vhdl-makefile-default-targets wdired-keep-marker-rename winner-mode-off-hook x-last-selected-text xml-default-ns xml-entity-expansion-limit xml-entity-or-char-ref-re xml-parameter-entity-alist yank-handled-properties)) - (features - (removed org-install python-21 reftex-vcr) - (added cl-lib cl-macs erc-desktop-notifications gnus-notifications gv mm-archive ob-io ob-scala org-element org-loaddefs org-version profiler url-domsuf w32-common-fns))) - ((24 4) - (functions - (removed Command-history-setup ad-Orig-copy-region-as-kill ad-Orig-create-file-buffer ad-Orig-dnd-insert-text ad-Orig-dnd-open-file ad-Orig-find-tag ad-Orig-idlwave-shell-electric-debug-mode ad-Orig-newline ad-Orig-org-format-latex-as-mathml ad-Orig-outline-end-of-subtree ad-Orig-rename-buffer ad-Orig-save-place-find-file-hook ad-Orig-server-visit-files ad-Orig-visit-tags-table ad-Orig-yank ad-activate-internal-off ad-advised-definition-p ad-clear-orig-definition ad-handle-definition ad-macro-p ad-make-advised-definition-docstring ad-make-advised-docstring ad-make-freeze-definition ad-make-freeze-docstring ad-make-mapped-call ad-make-origname ad-make-plain-docstring ad-real-documentation ad-real-fset ad-safe-fset ad-save-real-definition ad-save-real-definitions ad-set-orig-definition ad-special-form-p ad-start-advice ad-stop-advice ad-subr-p ad-with-auto-activation-disabled ada-create-syntax-table apropos-macrop as-get-flagged-mail as-get-selected-mail bubbles--mark-direct-neighbours bubbles--mark-neighbourhood bubbles--neighbourhood-available bubbles--update-neighbourhood-score byte-compile-add-to-list c-clear-char-property-fun cl--dolist cl--dotimes cl--symbol-function cl-do-proclaim cl-expand-do-loop cl-parse-loop-clause cl-pop2 cl-random-time class-children-fast class-parent-fast class-parents-fast cmpl-statistics-block crm--select-current-element css-backward-sexp css-forward-sexp css-indent-calculate css-indent-calculate-virtual css-indent-line cua-copy-rectangle cua-cut-rectangle cua-delete-rectangle cua-replace-region custom-declare-variable-early debbugs-gnu debug-arglist debug-convert-byte-code debug-on-entry-1 debugger-special-form-p delphi-after-change delphi-block-start delphi-char-token-at delphi-charset-token-at delphi-column-of delphi-comment-block-end delphi-comment-block-start delphi-comment-content-start delphi-comment-indent-of delphi-complete-literal delphi-composite-type-start delphi-corrected-indentation delphi-current-token delphi-debug-fontify-buffer delphi-debug-fontify-window delphi-debug-goto-next-token delphi-debug-goto-point delphi-debug-goto-previous-token delphi-debug-log delphi-debug-parse-buffer delphi-debug-parse-region delphi-debug-parse-window delphi-debug-show-current-string delphi-debug-show-current-token delphi-debug-show-is-stable delphi-debug-token-string delphi-debug-tokenize-buffer delphi-debug-tokenize-region delphi-debug-tokenize-window delphi-debug-unparse-buffer delphi-else-start delphi-enclosing-indent-of delphi-ensure-buffer delphi-explicit-token-at delphi-face-of delphi-fill-comment delphi-find-current-body delphi-find-current-def delphi-find-current-xdef delphi-find-unit delphi-find-unit-file delphi-find-unit-in-directory delphi-fontify-region delphi-group-end delphi-group-start delphi-in-token delphi-indent-line delphi-indent-of delphi-is delphi-is-block-after-expr-statement delphi-is-directory delphi-is-file delphi-is-literal-end delphi-is-literal-start delphi-is-simple-class-type delphi-is-stable-literal delphi-is-use-clause-end delphi-line-indent-of delphi-literal-end-pattern delphi-literal-kind delphi-literal-start-pattern delphi-literal-stop-pattern delphi-literal-text-properties delphi-literal-token-at delphi-log-msg delphi-looking-at-string delphi-match-token delphi-new-comment-line delphi-newline delphi-next-line-start delphi-next-token delphi-next-visible-token delphi-on-first-comment-line delphi-open-group-indent delphi-parse-next-literal delphi-parse-region delphi-parse-region-until-stable delphi-point-token-at delphi-previous-indent-of delphi-previous-token delphi-progress-done delphi-progress-start delphi-save-excursion delphi-save-match-data delphi-save-state delphi-search-directory delphi-section-indent-of delphi-set-text-properties delphi-set-token-end delphi-set-token-kind delphi-set-token-start delphi-space-token-at delphi-step-progress delphi-stmt-line-indent-of delphi-string-of delphi-tab delphi-token-at delphi-token-end delphi-token-kind delphi-token-of delphi-token-start delphi-token-string delphi-word-token-at describe-class describe-generic describe-method desktop-internal-v2s direct-print-region-helper dired-isearch-filenames-toggle do-applescript doc-view-current-cache-dir doc-view-odf->pdf doc-view-pdf->png doc-view-pdf->png-1 doc-view-remove-if ebrowse-delete-if-not edebug-gensym edebug-lookup-function edebug-macrop ediff-highest-priority edmacro-mismatch edmacro-subseq eieio-describe-class eieio-describe-class-slots eieio-describe-constructor eieio-describe-generic eieio-describe-method eieio-help-mode-augmentation-maybee electric-pair-syntax elp-wrapper erc-once-with-server-event-global ert--cl-do-remf ert--coerce-to-vector ert--gensym ert--intersection ert--mismatch ert--remove* ert--remove-if-not ert--remprop ert--set-difference ert--set-difference-eq ert--string-position ert--subseq ert--union eshell-apply-redirections eshell-do-opt eshell-isearch-cancel-map eshell-ls-insert-directory eshell-macrop eshell-process-args eshell-process-option eshell-set-option find-buffer-file-type find-buffer-file-type-match find-file-not-found-set-buffer-file-coding-system find-gc-unsafe find-unsafe-funcs flymake-count-lines flymake-current-line-no flymake-float-time flymake-get-temp-dir flymake-make-emacs-menu flymake-make-err-menu-data flymake-makehash flymake-popup-menu flymake-posn-at-point-as-event flymake-read-file-to-string flymake-replace-regexp-in-string flymake-save-string-to-file flymake-split-string gdb-add-pending gdb-car< gdb-delete-pending gdb-mapcar* gdb-pending-p gnus-macroexpand-all hi-lock-string-serialize highlight-save-buffer-state icomplete-get-keys ielm-complete-symbol implement-debug-on-entry inferior-octave-output-filter inferior-octave-strip-ctrl-g isearch-lookup-scroll-key isearch-other-control-char isearch-other-meta-char isearch-reread-key-sequence-naturally isearch-unread-key-sequence ly-attempt-to-open-pdf ly-attempt-to-play-midi ly-check-for-compile-error ly-compile-lilyfile ly-determine-ly-path ly-determine-midi-path ly-determine-pdf-path ly-execute-tangled-ly ly-get-header-args ly-mark-error-line ly-parse-error-line ly-parse-line-num ly-process-basic ly-process-compile-error ly-set-header-args ly-switch-extension ly-tangle ly-toggle-arrange-mode ly-toggle-html-generation ly-toggle-midi-play ly-toggle-pdf-display ly-toggle-pdf-generation ly-toggle-png-generation math-absolute-from-date menu-bar-help-extra-packages menu-bar-text-mode-auto-fill message-display-completion-list mouse--remap-link-click-p nndir-request-newsgroups nndraft-request-newsgroups nnimap-possibly-change-group nnir-artlist-groups nnir-possibly-change-server nxml-adjust-start-for-dependent-regions nxml-clear-dependent-regions nxml-extend-after-change-region nxml-extend-after-change-region1 nxml-mark-parse-dependent-region nxml-mark-parse-dependent-regions nxml-with-unmodifying-text-property-changes octave-abbrev-start octave-auto-fill octave-completion-at-point-function octave-initialize-completions octave-not-in-string-or-comment-p org-agenda-collect-markers org-agenda-filter-by-top-category org-agenda-filter-top-category-apply org-agenda-fix-tags-filter-overlays-at org-agenda-mark-filtered-text org-agenda-unmark-filtered-text org-ascii-level-start org-ascii-replace-entities org-attributes-to-string org-autoload org-babel-exp-non-block-elements org-babel-perl-var-to-perl org-babel-prep-session:scheme org-babel-reverse-string org-babel-scheme-initiate-session org-babel-shell-command-on-region org-beamer-after-initial-vars org-beamer-amend-header org-beamer-assoc-not-empty org-beamer-auto-fragile-frames org-beamer-cleanup-column-width org-beamer-close-column-maybe org-beamer-close-columns-maybe org-beamer-fix-toc org-beamer-get-special org-beamer-initialize-open-trackers org-beamer-open-column org-beamer-open-columns-maybe org-beamer-place-default-actions-for-lists org-beamer-sectioning org-beamer-select-beamer-code org-check-agenda-marker-table org-clock-delete-current org-clock-set-current org-close-li org-close-par-maybe org-closed-in-range org-colgroup-info-to-vline-list org-compute-latex-and-specials-regexp org-create-marker-find-array org-default-export-plist org-do-latex-and-special-faces org-do-lparse org-do-remember org-docbook-do-expand org-docbook-expand org-docbook-protect org-export org-export-add-options-to-plist org-export-add-subtree-options org-export-apply-macros-in-string org-export-as-ascii org-export-as-ascii-to-buffer org-export-as-docbook org-export-as-docbook-batch org-export-as-docbook-pdf org-export-as-docbook-pdf-and-open org-export-as-docbook-to-buffer org-export-as-encoding org-export-as-freemind org-export-as-html org-export-as-html-and-open org-export-as-html-batch org-export-as-html-to-buffer org-export-as-latex org-export-as-latex-batch org-export-as-latex-to-buffer org-export-as-latin1 org-export-as-latin1-to-buffer org-export-as-odf org-export-as-odf-and-open org-export-as-odt org-export-as-odt-and-open org-export-as-odt-batch org-export-as-org org-export-as-pdf org-export-as-pdf-and-open org-export-as-taskjuggler org-export-as-taskjuggler-and-open org-export-as-utf8 org-export-as-utf8-to-buffer org-export-as-xoxo org-export-as-xoxo-insert-into org-export-ascii-preprocess org-export-ascii-push-links org-export-ascii-wrap org-export-attach-captions-and-attributes org-export-blocks-add-block org-export-blocks-format-comment org-export-blocks-format-ditaa org-export-blocks-format-dot org-export-blocks-html-quote org-export-blocks-latex-quote org-export-blocks-preprocess org-export-blocks-set org-export-cleanup-toc-line org-export-concatenate-multiline-emphasis org-export-concatenate-multiline-links org-export-confirm-letbind org-export-convert-protected-spaces org-export-define-heading-targets org-export-directory org-export-docbook-close-li org-export-docbook-close-para-maybe org-export-docbook-convert-emphasize org-export-docbook-convert-special-strings org-export-docbook-convert-sub-super org-export-docbook-finalize-table org-export-docbook-format-desc org-export-docbook-format-image org-export-docbook-get-footnotes org-export-docbook-handle-time-stamps org-export-docbook-level-start org-export-docbook-list-line org-export-docbook-open-para org-export-docbook-preprocess org-export-docbook-protect-tags org-export-format-drawer org-export-format-source-code-or-example org-export-generic org-export-get-categories org-export-get-title-from-subtree org-export-grab-title-from-buffer org-export-handle-comments org-export-handle-export-tags org-export-handle-include-files org-export-handle-include-files-recurse org-export-handle-invisible-targets org-export-handle-metalines org-export-html-convert-emphasize org-export-html-convert-special-strings org-export-html-convert-sub-super org-export-html-format-desc org-export-html-format-href org-export-html-format-image org-export-html-get-bibliography org-export-html-get-tag-class-name org-export-html-get-todo-kwd-class-name org-export-html-mathjax-config org-export-html-preprocess org-export-htmlize-generate-css org-export-htmlize-region-for-paste org-export-icalendar org-export-icalendar-all-agenda-files org-export-icalendar-combine-agenda-files org-export-icalendar-this-file org-export-interpolate-newlines org-export-kill-licensed-text org-export-latex-content org-export-latex-convert-table\.el-table org-export-latex-emph-format org-export-latex-first-lines org-export-latex-fix-inputenc org-export-latex-fixed-width org-export-latex-fontify org-export-latex-fontify-headline org-export-latex-format-image org-export-latex-format-toc-default org-export-latex-get-error org-export-latex-global org-export-latex-keywords org-export-latex-keywords-maybe org-export-latex-links org-export-latex-lists org-export-latex-make-header org-export-latex-parse-content org-export-latex-parse-global org-export-latex-parse-subcontent org-export-latex-preprocess org-export-latex-protect-amp org-export-latex-protect-char-in-string org-export-latex-protect-string org-export-latex-quotation-marks org-export-latex-set-initial-vars org-export-latex-special-chars org-export-latex-sub org-export-latex-subcontent org-export-latex-tables org-export-latex-time-stamps org-export-latex-treat-backslash-char org-export-latex-treat-sub-super-char org-export-mark-blockquote-verse-center org-export-mark-list-end org-export-mark-list-properties org-export-mark-radio-links org-export-normalize-links org-export-number-lines org-export-odt-convert org-export-odt-do-preprocess-latex-fragments org-export-odt-format-formula org-export-odt-format-image org-export-odt-preprocess org-export-odt-preprocess-label-references org-export-odt-preprocess-latex-fragments org-export-preprocess-apply-macros org-export-preprocess-string org-export-process-option-filters org-export-process-sentinel org-export-protect-colon-examples org-export-protect-quoted-subtrees org-export-protect-sub-super org-export-protect-verbatim org-export-push-to-kill-ring org-export-region-as-ascii org-export-region-as-docbook org-export-region-as-html org-export-region-as-latex org-export-remember-html-container-classes org-export-remove-archived-trees org-export-remove-clock-lines org-export-remove-comment-blocks-and-subtrees org-export-remove-headline-metadata org-export-remove-or-extract-drawers org-export-remove-special-table-lines org-export-remove-tasks org-export-remove-timestamps org-export-replace-src-segments-and-examples org-export-select-backend-specific-text org-export-splice-attributes org-export-splice-style org-export-string org-export-target-internal-links org-export-visible org-extract-attributes-from-string org-fill-paragraph-separate-nobreak-p org-find-top-category org-fix-ellipsis-at-bol org-format-org-table-html org-format-table-ascii org-format-table-html org-format-table-table-html org-format-table-table-html-using-table-generate-source org-freemind-bol-helper org-freemind-check-overwrite org-freemind-convert-links-from-org org-freemind-convert-links-helper org-freemind-convert-links-to-org org-freemind-convert-text-p org-freemind-do-apply-node-style org-freemind-escape-str-from-org org-freemind-from-org-mode org-freemind-from-org-mode-node org-freemind-from-org-sparse-tree org-freemind-get-children org-freemind-get-icon-names org-freemind-get-node-style org-freemind-get-richcontent-node org-freemind-get-richcontent-node-text org-freemind-get-richcontent-note org-freemind-get-richcontent-note-text org-freemind-get-tree-text org-freemind-goto-line org-freemind-look-for-visible-child org-freemind-lt-symbols org-freemind-lt-xml-attrs org-freemind-node-to-org org-freemind-org-text-to-freemind-subnode/note org-freemind-show org-freemind-symbols= org-freemind-test-get-tree-text org-freemind-to-org-mode org-freemind-unescape-str-to-org org-freemind-write-mm-buffer org-freemind-write-node org-get-and-remove-property org-get-current-options org-get-file-contents org-get-min-level org-get-text-property-any org-go-to-remember-target org-html-cvt-org-as-html org-html-do-expand org-html-expand org-html-expand-for-ascii org-html-export-list-line org-html-handle-links org-html-handle-time-stamps org-html-level-close org-html-level-start org-html-make-link org-html-protect org-html-should-inline-p org-icalendar-cleanup-string-rfc2455 org-icalendar-finish-file org-icalendar-print-entries org-icalendar-start-file org-icalendar-ts-to-string org-icalendar-use-UTC-date-timep org-id-reverse-string org-if-unprotected org-if-unprotected-1 org-if-unprotected-at org-infile-export-plist org-infojs-handle-options org-infojs-options-inbuffer-template org-init-section-numbers org-inlinetask-export-handler org-insert-beamer-options-template org-insert-centered org-insert-export-options-template org-inside-latex-math-p org-install-letbind org-irc-elipsify-description org-lparse org-lparse-and-open org-lparse-apply-char-styles org-lparse-apply-sub-superscript-styles org-lparse-backend-get org-lparse-backend-is-native-p org-lparse-batch org-lparse-begin org-lparse-begin-collect org-lparse-begin-environment org-lparse-begin-footnote-definition org-lparse-begin-level org-lparse-begin-list org-lparse-begin-list-item org-lparse-begin-list-table:table-cell org-lparse-begin-outline-and-outline-text org-lparse-begin-outline-text org-lparse-begin-paragraph org-lparse-begin-table-rowgroup org-lparse-bind-local-variables org-lparse-convert-read-params org-lparse-convert-special-strings org-lparse-current-environment-p org-lparse-do-convert org-lparse-do-reachable-formats org-lparse-end org-lparse-end-collect org-lparse-end-environment org-lparse-end-footnote-definition org-lparse-end-level org-lparse-end-list org-lparse-end-list-item org-lparse-end-list-item-1 org-lparse-end-list-table:table-cell org-lparse-end-outline-text-or-outline org-lparse-end-paragraph org-lparse-end-table org-lparse-export-list-line org-lparse-format org-lparse-format-extra-targets org-lparse-format-list-table org-lparse-format-org-link org-lparse-format-org-table org-lparse-format-org-tags org-lparse-format-section-number org-lparse-format-table org-lparse-format-table-row org-lparse-format-table-table org-lparse-format-table-table-using-table-generate-source org-lparse-format-tags org-lparse-format-todo org-lparse-get org-lparse-get-block-params org-lparse-get-targets-from-title org-lparse-handle-time-stamps org-lparse-html-list-type-to-canonical-list-type org-lparse-insert org-lparse-insert-list-table org-lparse-insert-org-table org-lparse-insert-table-table org-lparse-insert-tag org-lparse-org-table-to-list-table org-lparse-prepare-toc org-lparse-preprocess-after-blockquote org-lparse-preprocess-after-blockquote-hook org-lparse-reachable-formats org-lparse-reachable-p org-lparse-region org-lparse-register-backend org-lparse-should-inline-p org-lparse-stash-pop-paragraph-state org-lparse-stash-save-paragraph-state org-lparse-strip-experimental-blocks-maybe org-lparse-strip-experimental-blocks-maybe-hook org-lparse-suffix-from-snumber org-lparse-table-get-colalign-info org-lparse-to-buffer org-lparse-unregister-backend org-lparse-warn org-mac-message-get-links org-mac-message-insert-flagged org-mac-message-insert-link org-mac-message-insert-selected org-mac-message-open org-mew-open org-mew-store-link org-number-to-counter org-number-to-roman org-odt-add-label-definition org-odt-begin-annotation org-odt-begin-document-body org-odt-begin-document-content org-odt-begin-environment org-odt-begin-footnote-definition org-odt-begin-list org-odt-begin-list-item org-odt-begin-office-body org-odt-begin-outline org-odt-begin-outline-text org-odt-begin-paragraph org-odt-begin-section org-odt-begin-table org-odt-begin-table-rowgroup org-odt-cleanup-xml-buffers org-odt-configure-outline-numbering org-odt-continue-list org-odt-copy-formula-file org-odt-copy-image-file org-odt-copy-styles-file org-odt-delete-empty-paragraphs org-odt-discontinue-list org-odt-do-image-size org-odt-encode-plain-text org-odt-end-annotation org-odt-end-document-body org-odt-end-document-content org-odt-end-environment org-odt-end-export org-odt-end-footnote-definition org-odt-end-list org-odt-end-list-item org-odt-end-outline org-odt-end-outline-text org-odt-end-paragraph org-odt-end-section org-odt-end-table org-odt-end-table-rowgroup org-odt-fill-tabs-and-spaces org-odt-finalize-outfile org-odt-fixup-label-references org-odt-format-anchor org-odt-format-author org-odt-format-bookmark org-odt-format-comment org-odt-format-date org-odt-format-entity org-odt-format-entity-caption org-odt-format-fontify org-odt-format-footnote org-odt-format-footnote-ref org-odt-format-footnote-reference org-odt-format-frame org-odt-format-heading org-odt-format-horizontal-line org-odt-format-inline-formula org-odt-format-inline-image org-odt-format-inlinetask org-odt-format-label-definition org-odt-format-label-reference org-odt-format-line org-odt-format-line-break org-odt-format-link org-odt-format-object-description org-odt-format-org-entity org-odt-format-org-link org-odt-format-preamble org-odt-format-source-code-or-example org-odt-format-source-code-or-example-colored org-odt-format-source-code-or-example-plain org-odt-format-source-line-with-line-number-and-label org-odt-format-spaces org-odt-format-stylized-paragraph org-odt-format-table-cell org-odt-format-table-row org-odt-format-tabs org-odt-format-tags org-odt-format-target org-odt-format-textbox org-odt-format-toc org-odt-format-toc-entry org-odt-format-toc-item org-odt-get org-odt-get-extra-attrs-for-paragraph-style org-odt-get-image-name org-odt-get-paragraph-style-cookie-for-table-cell org-odt-get-style-name-cookie-for-table-cell org-odt-get-style-name-for-entity org-odt-image-size-from-file org-odt-init-outfile org-odt-insert-custom-styles-for-srcblocks org-odt-insert-toc org-odt-is-formula-link-p org-odt-merge-frame-params org-odt-relocate-relative-path org-odt-remap-stylenames org-odt-save-as-outfile org-odt-unload-function org-odt-update-meta-file org-odt-update-styles-file org-odt-write-automatic-styles org-odt-write-mimetype-file org-odt-zip-extract org-odt-zip-extract-one org-open-par org-protocol-remember org-publish-aux-preprocess org-publish-delete-dups org-publish-org-to-ascii org-publish-org-to-html org-publish-org-to-latex org-publish-org-to-latin1 org-publish-org-to-org org-publish-org-to-pdf org-publish-org-to-utf8 org-publish-sanitize-plist org-publish-with-aux-preprocess-maybe org-re-property-keyword org-re-search-forward-unprotected org-recenter-heading org-remember org-remember-annotation org-remember-apply-template org-remember-escaped-% org-remember-finalize org-remember-finish-immediately org-remember-goto-last-stored org-remember-handler org-remember-insinuate org-remember-kill org-remember-mode org-remember-visit-immediately org-remove-file-link-modifiers org-remove-formatting-on-newlines-in-region org-remove-initial-hash org-replace-region-by org-replace-region-by-ascii org-replace-region-by-docbook org-replace-region-by-html org-replace-region-by-latex org-require-remember org-search-todo-below org-section-number org-select-remember-template org-solidify-link-text org-special-blocks-convert-html-special-cookies org-special-blocks-convert-latex-special-cookies org-special-blocks-make-special-cookies org-store-forced-table-alignment org-symname-or-string org-taskjuggler-assign-resource-ids org-taskjuggler-assign-task-ids org-taskjuggler-clean-effort org-taskjuggler-clean-id org-taskjuggler-close-maybe org-taskjuggler-components org-taskjuggler-compute-task-leafiness org-taskjuggler-filter-and-join org-taskjuggler-find-task-with-id org-taskjuggler-get-attribute org-taskjuggler-get-attributes org-taskjuggler-get-priority org-taskjuggler-get-unique-id org-taskjuggler-insert-reports org-taskjuggler-open-project org-taskjuggler-open-resource org-taskjuggler-open-task org-taskjuggler-parent-is-ordered-p org-taskjuggler-resolve-dependencies org-taskjuggler-resolve-explicit-dependencies org-taskjuggler-targeting-tj3-p org-taskjuggler-tokenize-dependencies org-vm-follow-link org-vm-imap-open org-vm-open org-vm-select-message org-vm-store-link org-with-buffer-modified-unmodified org-wl-folder-type org-wl-message-field org-wl-open org-wl-open-nntp org-wl-store-link org-wl-store-link-folder org-wl-store-link-message org-xml-encode-org-text org-xml-encode-org-text-skip-links org-xml-encode-plain-text org-xml-fix-class-name org-xml-format-desc org-xml-format-href orgtbl-export package--dir package--make-autoloads-and-compile package-desc-doc package-desc-vers package-download-single package-download-tar package-handle-response package-mark-obsolete package-maybe-load-descriptor package-strip-version package-unpack-single pcomplete/org-mode/file-option/x prolog-backward-list prolog-electric-colon prolog-electric-dash prolog-electric-delete prolog-electric-dot prolog-electric-if-then-else prolog-electric-underscore prolog-find-indent-of-matching-paren prolog-find-start-of-mline-comment prolog-forward-list prolog-goto-comment-column prolog-goto-next-paren prolog-in-string-or-comment prolog-indent-level prolog-indent-line prolog-indentation-level-of-line prolog-insert-spaces-after-paren prolog-inside-mline-comment prolog-make-keywords-regexp prolog-paren-is-the-first-on-line-p prolog-region-paren-balance prolog-tokenize ps-eval-switch ps-flatten-list ps-flatten-list-1 ps-string-list python-imenu-prev-index-position python-indent-electric-colon python-nav--backward-sexp python-nav-lisp-forward-sexp-safe read-mail-item-name report-emacs-bug-create-existing-bugs-buffer report-emacs-bug-parse-query-results report-emacs-bug-query-existing-bugs restore-overriding-map rng-dependent-region-changed rng-ipattern-defslot rng-ipattern-get-after rng-ipattern-get-child rng-ipattern-get-datatype rng-ipattern-get-index rng-ipattern-get-memo-end-tag-deriv rng-ipattern-get-memo-map-data-deriv rng-ipattern-get-memo-map-start-attribute-deriv rng-ipattern-get-memo-map-start-tag-open-deriv rng-ipattern-get-memo-mixed-text-deriv rng-ipattern-get-memo-start-tag-close-deriv rng-ipattern-get-memo-text-only-deriv rng-ipattern-get-memo-text-typed rng-ipattern-get-name-class rng-ipattern-get-nullable rng-ipattern-get-type rng-ipattern-get-value-object rng-ipattern-set-after rng-ipattern-set-child rng-ipattern-set-datatype rng-ipattern-set-index rng-ipattern-set-memo-end-tag-deriv rng-ipattern-set-memo-map-data-deriv rng-ipattern-set-memo-map-start-attribute-deriv rng-ipattern-set-memo-map-start-tag-open-deriv rng-ipattern-set-memo-mixed-text-deriv rng-ipattern-set-memo-start-tag-close-deriv rng-ipattern-set-memo-text-only-deriv rng-ipattern-set-memo-text-typed rng-ipattern-set-name-class rng-ipattern-set-nullable rng-ipattern-set-type rng-ipattern-set-value-object rng-mark-xmltok-dependent-region rng-mark-xmltok-dependent-regions s5-dynamic-choice-match s5-dynamic-choice-match-inline s5-widget-value-create save&set-overriding-map sbe scheme-font-lock-syntactic-face-function selected-terminal semantic-ia-complete-symbol-menu send-mail-item-name shadow-remove-if shr-collect-overlays shr-overlays-in-region shr-put-color shr-put-color-1 shr-visit-file sieve-manage-disable-multibyte sieve-manage-forward sieve-manage-network-open sieve-manage-network-p sieve-manage-open-1 sieve-manage-parse-capability-1 sieve-manage-parse-greeting-1 sieve-manage-starttls-open sieve-manage-starttls-p skeleton-newline sql-oracle-show-reserved-words sql-read-passwd sql-signum sql-try-completion text-clone-maintain thumbs-gensym trace-call-tree trace-unsafe trace-use-tree tramp-cleanup tramp-compat-call-process tramp-detect-ssh-controlmaster tramp-sh-handle-call-process-region tramp-sh-handle-executable-find tramp-sh-handle-make-auto-save-file-name universal-argument-minus universal-argument-other-key untranslated-canonical-name untranslated-file-p vc-process-sentinel verilog-get-beg-of-defun verilog-get-list verilog-sk-uvm-class verilog-type-completion vhdl-mode-syntax-table-init viper-envelop-ESC-key widget-remove-if winner-hook-installed-p with-org-lparse-preserve-paragraph-state woman-mark-horizonal-position xmltok-add-dependent xmltok-semi-closed-reparse-p xmltok-unclosed-reparse-p xterm-mouse-event-read) - (added Buffer-menu--unmark Buffer-menu-multi-occur Info--search-loop Info-build-node-completions-1 Info-next-reference-or-link Info-prev-reference-or-link Man-parse-man-k Man-start-calling Man-update-manpage abbrev--default-expand abbrev--symbol ad--defalias-fset ad--make-advised-docstring ad-Advice-c-backward-sws ad-Advice-c-beginning-of-macro ad-Advice-c-forward-sws ad-Advice-dnd-insert-text ad-Advice-dnd-open-file ad-Advice-find-tag ad-Advice-idlwave-shell-electric-debug-mode ad-Advice-save-place-find-file-hook ad-Advice-server-visit-files ad-Advice-visit-tags-table ad-clear-advicefunname-definition ad-make-advicefunname add-face-text-property add-function advice--add-function advice--buffer-local advice--called-interactively-skip advice--car advice--cd*r advice--cdr advice--defalias-fset advice--interactive-form advice--make advice--make-1 advice--make-docstring advice--make-interactive-form advice--member-p advice--normalize advice--normalize-place advice--p advice--props advice--remove-function advice--set-buffer-local advice--strip-macro advice--subst-main advice--symbol-function advice--tweak advice-add advice-eval-interactive-spec advice-function-mapc advice-function-member-p advice-mapc advice-member-p advice-remove ange-ftp-run-real-handler-orig apropos-user-option auth-source-current-line auth-source-netrc-parse-entries auth-source-netrc-parse-next-interesting auth-source-netrc-parse-one auth-source-secrets-listify-pattern authors-lax-changelog-p authors-no-scan-file-p auto-revert-notify-add-watch auto-revert-notify-handler auto-revert-notify-rm-watch autoload--print-cookie-text autoload--setup-output backtrace--locals backtrace-eval bat-cmd-help bat-mode bat-run bat-run-args bat-template battery-bsd-apm blink-cursor-check blink-cursor-suspend bookmark-bmenu-set-header bookmark-insert-annotation bool-vector-count-consecutive bool-vector-count-population bool-vector-exclusive-or bool-vector-intersection bool-vector-not bool-vector-set-difference bool-vector-subsetp bool-vector-union browse-web bubbles--mark-direct-neighbors bubbles--mark-neighborhood bubbles--neighborhood-available bubbles--update-neighborhood-score buffer-stale--default-function buffer-substring--filter button--area-button-p button--area-button-string byte-compile--declare-var byte-compile-and-folded byte-compile-condition-case--new byte-compile-condition-case--old byte-compile-function-warn c-back-over-member-initializers c-backward-over-enum-header c-electric-indent-local-mode-hook c-electric-indent-mode-hook c-last-command-char calendar-day-header-construct case-table-get-table cc-imenu-java-build-type-args-regex cconv-warnings-only cedet-files-list-recursively cfengine3--current-function cfengine3-clear-syntax-cache cfengine3-completion-function cfengine3-documentation-function cfengine3-format-function-docstring cfengine3-make-syntax-cache cl--compiler-macro-typep cl--do-proclaim cl--expand-do-loop cl--loop-set-iterator-function cl--macroexp-fboundp cl--parse-loop-clause cl--pass-args-to-cl-declare cl--pop2 cl--random-time cl--sublis cl--unused-var-p cl--wrap-in-nil-block cl-tagbody comint-adjust-window-point command-error-default-function compilation-display-error completion--complete-and-exit completion--in-region completion--in-region-1 completion-complete-and-exit completion-in-region--single-word completion-pcm--optimize-pattern completion-table-merge completion-table-with-cache cookie-apropos cookie-check-file cookie-doctor cookie-read cookie-shuffle-vector copy-ert-test-skipped copy-gdb-handler copy-package--bi-desc copy-package-desc crm--completion-command crm--current-element css-current-defun-name css-smie--backward-token css-smie--forward-token css-smie-rules cua--rectangle-highlight-for-redisplay cua--rectangle-region-extract cua-rectangle-mark-mode custom--sort-vars custom--sort-vars-1 cwarn-mode-set-explicitly cycle-spacing dbstring-mysql dbus-handle-bus-disconnect dbus-init-bus dbus-notice-synchronous-call-errors debug--function-list debug--implement-debug-on-entry debugger--backtrace-base debugger--hide-locals debugger--insert-locals debugger--locals-visible-p debugger--show-locals debugger-toggle-locals default-font-height default-line-height default-toplevel-value define-alternatives define-error delay-warning delete-consecutive-dups delete-duplicate-lines desktop--check-dont-save desktop--v2s desktop-auto-save desktop-auto-save-cancel-timer desktop-auto-save-disable desktop-auto-save-enable desktop-auto-save-set-timer desktop-restore-frameset desktop-restoring-frameset-p desktop-save-frameset dired-check-switches dired-hide-details-mode dired-hide-details-update-invisibility-spec dired-isearch-filenames-mode dired-switches-recursive-p display-buffer-no-window display-monitor-attributes-list doc-view--current-cache-dir doc-view-desktop-save-buffer doc-view-djvu->tiff-converter-ddjvu doc-view-document->bitmap doc-view-odf->pdf-converter-soffice doc-view-odf->pdf-converter-unoconv doc-view-pdf->png-converter-ghostscript doc-view-pdf->png-converter-mupdf doc-view-ps->png-converter-ghostscript doc-view-restore-desktop-buffer doc-view-scale-adjust doc-view-scale-reset doc-view-set-up-single-converter ede-cpp-root-project ede-cpp-root-project-child-p ede-cpp-root-project-list-p ede-cpp-root-project-p ede-files-find-existing ede-find-project-root ede-flush-deleted-projects ede-normalize-file/directory edebug--called-interactively-skip edebug--require-cl-read edebug-unload-function ediff-buffer-type ediff-directories-command ediff-directories3-command ediff-files-command ediff-merge-command ediff-merge-directories-command ediff-merge-directories-with-ancestor-command ediff-merge-with-ancestor-command ediff3-files-command eieio--check-type eieio--class--unused-0 eieio--class-children eieio--class-class-allocation-a eieio--class-class-allocation-custom eieio--class-class-allocation-custom-group eieio--class-class-allocation-custom-label eieio--class-class-allocation-doc eieio--class-class-allocation-printer eieio--class-class-allocation-protection eieio--class-class-allocation-type eieio--class-class-allocation-values eieio--class-default-object-cache eieio--class-initarg-tuples eieio--class-options eieio--class-parent eieio--class-protection eieio--class-public-a eieio--class-public-custom eieio--class-public-custom-group eieio--class-public-custom-label eieio--class-public-d eieio--class-public-doc eieio--class-public-printer eieio--class-public-type eieio--class-symbol eieio--class-symbol-obarray eieio--define-field-accessors eieio--object--unused-0 eieio--object-class eieio--object-name eieio--scoped-class eieio--with-scoped-class eieio-class-children eieio-class-children-fast eieio-class-name eieio-class-parent eieio-class-parents eieio-class-parents-fast eieio-class-precedence-list eieio-help-class eieio-help-class-slots eieio-help-constructor eieio-help-generic eieio-object-class eieio-object-class-name eieio-object-name eieio-object-name-string eieio-object-set-name-string eldoc--message-command-p eldoc-edit-message-commands eldoc-minibuffer-message electric--sort-post-self-insertion-hook electric-indent-just-newline electric-indent-local-mode electric-newline-and-maybe-indent electric-pair--balance-info electric-pair--insert electric-pair--inside-string-p electric-pair--skip-whitespace electric-pair--syntax-ppss electric-pair--unbalanced-strings-p electric-pair-conservative-inhibit electric-pair-default-inhibit electric-pair-default-skip-self electric-pair-delete-pair electric-pair-inhibit-if-helps-balance electric-pair-skip-if-helps-balance electric-pair-syntax-info elp--instrumented-p elp--make-wrapper emacs-repository-get-version epa-mail-default-recipients epa-read-file-name epg-context-home-directory epg-context-pinentry-mode epg-context-program epg-context-set-home-directory epg-context-set-pinentry-mode epg-context-set-program erc-menu ert--skip-unless ert--stats-skipped ert-skip ert-stats-skipped ert-test-skipped-backtrace ert-test-skipped-condition ert-test-skipped-infos ert-test-skipped-messages ert-test-skipped-p ert-test-skipped-should-forms eshell--apply-redirections eshell--do-opts eshell--process-args eshell--process-option eshell--set-option eshell-complete-lisp-symbol eshell-ls--insert-directory eshell-tramp-initialize eshell-visual-command-p eudc-batch-export-records-to-bbdb eudc-bbdb-extract-addresses eudc-bbdb-extract-phones eudc-bbdb-filter-non-matching-record eudc-bbdb-format-query eudc-bbdb-format-record-as-result eudc-bbdb-query-internal eudc-bbdb-set-server eudc-bbdbify-address eudc-bbdbify-phone eudc-create-bbdb-record eudc-parse-spec eww eww-add-bookmark eww-back-url eww-beginning-of-field eww-beginning-of-text eww-bookmark-browse eww-bookmark-kill eww-bookmark-mode eww-bookmark-prepare eww-bookmark-yank eww-browse-url eww-browse-with-external-browser eww-change-select eww-colorize-region eww-copy-page-url eww-detect-charset eww-display-html eww-display-image eww-display-raw eww-download eww-download-callback eww-end-of-field eww-end-of-text eww-follow-link eww-form-checkbox eww-form-submit eww-form-text eww-forward-url eww-handle-link eww-history-browse eww-history-mode eww-input-value eww-inputs eww-list-bookmarks eww-list-histories eww-make-unique-file-name eww-mode eww-next-bookmark eww-next-url eww-open-file eww-parse-headers eww-previous-bookmark eww-previous-url eww-process-text-input eww-read-bookmarks eww-reload eww-render eww-restore-history eww-same-page-p eww-save-history eww-select-display eww-setup-buffer eww-submit eww-tag-a eww-tag-body eww-tag-form eww-tag-input eww-tag-link eww-tag-select eww-tag-textarea eww-tag-title eww-toggle-checkbox eww-top-url eww-up-url eww-update-field eww-update-header-line-format eww-view-source eww-write-bookmarks fancy-splash-image-file ffap-c++-mode file-acl file-cache--read-list file-extended-attributes file-notify--event-cookie file-notify--event-file-name file-notify--event-file1-name file-notify-add-watch file-notify-callback file-notify-handle-event file-notify-rm-watch fill-single-char-nobreak-p find-tag-default-as-regexp find-tag-default-as-symbol-regexp find-tag-default-bounds finder-unload-function flymake-popup-current-error-menu font-lock-mode-set-explicitly frame-border-width frame-bottom-divider-width frame-char-size frame-font-cache frame-fringe-width frame-monitor-attributes frame-right-divider-width frame-scroll-bar-width frame-text-cols frame-text-height frame-text-lines frame-text-width frame-total-cols frameset--find-frame-if frameset--initial-params frameset--jump-to-register frameset--make frameset--minibufferless-last-p frameset--prop-setter frameset--record-minibuffer-relationships frameset--restore-frame frameset--reuse-frame frameset--set-id frameset-app frameset-cfg-id frameset-compute-pos frameset-copy frameset-description frameset-filter-iconified frameset-filter-minibuffer frameset-filter-params frameset-filter-sanitize-color frameset-filter-shelve-param frameset-filter-tty-to-GUI frameset-filter-unshelve-param frameset-frame-id frameset-frame-id-equal-p frameset-frame-with-id frameset-keep-original-display-p frameset-minibufferless-first-p frameset-move-onscreen frameset-name frameset-p frameset-prop frameset-properties frameset-restore frameset-save frameset-states frameset-switch-to-gui-p frameset-switch-to-tty-p frameset-timestamp frameset-to-register frameset-valid-p frameset-version function-equal function-put gametree-mouse-break-line-here gametree-mouse-hide-subtree gametree-mouse-show-children-and-entry gametree-mouse-show-subtree gdb-add-handler gdb-delete-handler gdb-done gdb-error gdb-get-handler-function gdb-handle-reply gdb-handler-function gdb-handler-p gdb-handler-pending-trigger gdb-handler-token-number gdb-pending-handler-p gdb-remove-all-pending-triggers gdb-strip-string-backslash gdbmi-bnf-async-record gdbmi-bnf-console-stream-output gdbmi-bnf-gdb-prompt gdbmi-bnf-incomplete-record-result gdbmi-bnf-init gdbmi-bnf-log-stream-output gdbmi-bnf-out-of-band-record gdbmi-bnf-output gdbmi-bnf-result-and-async-record-impl gdbmi-bnf-result-record gdbmi-bnf-skip-unrecognized gdbmi-bnf-stream-record gdbmi-bnf-target-stream-output gdbmi-is-number gdbmi-same-start gdbmi-start-with generic--normalize-comments generic-set-comment-syntax generic-set-comment-vars get-pos-property global-hl-line-unhighlight-all global-prettify-symbols-mode global-prettify-symbols-mode-check-buffers global-prettify-symbols-mode-cmhh global-prettify-symbols-mode-enable-in-buffers global-superword-mode global-superword-mode-check-buffers global-superword-mode-cmhh global-superword-mode-enable-in-buffers glyphless-set-char-table-range gmm-called-interactively-p gmm-labels gnus--let-eval gnus-backend-trace gnus-browse-delete-group gnus-clean-old-newsrc gnus-delete-gnus-frame gnus-get-text-property-excluding-characters-with-faces gnus-icalendar--cancel-org-event gnus-icalendar--deactivate-org-timestamp gnus-icalendar--format-participant-list gnus-icalendar--format-summary-line gnus-icalendar--get-org-event-reply-status gnus-icalendar--show-org-event gnus-icalendar--update-org-event gnus-icalendar-event gnus-icalendar-event--build-reply-event-body gnus-icalendar-event--decode-datefield gnus-icalendar-event--find-attendee gnus-icalendar-event--get-attendee-names gnus-icalendar-event->gnus-calendar gnus-icalendar-event->org-entry gnus-icalendar-event-cancel gnus-icalendar-event-cancel-child-p gnus-icalendar-event-cancel-list-p gnus-icalendar-event-cancel-p gnus-icalendar-event-check-agenda gnus-icalendar-event-child-p gnus-icalendar-event-export gnus-icalendar-event-from-buffer gnus-icalendar-event-from-handle gnus-icalendar-event-from-ical gnus-icalendar-event-list-p gnus-icalendar-event-p gnus-icalendar-event-reply gnus-icalendar-event-reply-child-p gnus-icalendar-event-reply-from-buffer gnus-icalendar-event-reply-list-p gnus-icalendar-event-reply-p gnus-icalendar-event-request gnus-icalendar-event-request-child-p gnus-icalendar-event-request-list-p gnus-icalendar-event-request-p gnus-icalendar-event-show gnus-icalendar-event:description gnus-icalendar-event:end-time gnus-icalendar-event:inline-org-buttons gnus-icalendar-event:inline-reply-buttons gnus-icalendar-event:inline-reply-status gnus-icalendar-event:location gnus-icalendar-event:method gnus-icalendar-event:opt-participants gnus-icalendar-event:org-repeat gnus-icalendar-event:org-timestamp gnus-icalendar-event:organizer gnus-icalendar-event:participation-type gnus-icalendar-event:recur gnus-icalendar-event:recurring-freq gnus-icalendar-event:recurring-interval gnus-icalendar-event:recurring-p gnus-icalendar-event:req-participants gnus-icalendar-event:rsvp gnus-icalendar-event:start gnus-icalendar-event:start-time gnus-icalendar-event:summary gnus-icalendar-event:sync-to-org gnus-icalendar-event:uid gnus-icalendar-find-if gnus-icalendar-find-org-event-file gnus-icalendar-identities gnus-icalendar-insert-button gnus-icalendar-insinuate-org-templates gnus-icalendar-mm-inline gnus-icalendar-org-setup gnus-icalendar-reply gnus-icalendar-reply-accept gnus-icalendar-reply-decline gnus-icalendar-reply-tentative gnus-icalendar-save-event gnus-icalendar-save-part gnus-icalendar-send-buffer-by-mail gnus-icalendar-setup gnus-icalendar-show-org-agenda gnus-icalendar-sync-event-to-org gnus-icalendar-with-decoded-handle gnus-icalendar:org-event-save gnus-nnir-group-p gnus-registry-remove-extra-data gnus-sort-subthreads-recursive gnus-summary-create-nnir-group gnus-summary-make-nnir-group gnus-vm-make-folder gomoku--intangible group-gid group-real-gid gv-deref gv-ref hack-one-local-variable--obsolete handle-focus-in handle-focus-out hash-table-keys hash-table-values hi-lock--hashcons hi-lock--regexps-at-point hi-lock-face-symbol-at-point hi-lock-keyword->face hi-lock-mode-set-explicitly hif-comma hif-comp-expr hif-divide hif-equal hif-exprlist hif-logand-expr hif-logior-expr hif-lognot hif-logshift-expr hif-logxor hif-logxor-expr hif-modulo hif-muldiv-expr hif-multiply hif-shiftleft hif-shiftright highlight-changes-mode-set-explicitly highlight-symbol-at-point hilit-chg-unload-function hl-line-make-overlay html-current-defun-name icomplete--completion-predicate icomplete--completion-table icomplete--field-beg icomplete--field-end icomplete--field-string icomplete--in-region-setup icomplete-backward-completions icomplete-forward-completions icomplete-post-command-hook icomplete-pre-command-hook ielm-menu ielm-return-for-effect ielm-standard-output-impl image--set-speed image-animate-get-speed image-animate-set-speed image-current-frame image-decrease-speed image-goto-frame image-increase-speed image-mode--images-in-directory image-mode-menu image-multi-frame-p image-next-file image-next-frame image-previous-file image-previous-frame image-reset-speed image-reverse-speed image-show-frame indent-accumulate-tab-stops indent-next-tab-stop indent-rigidly--current-indentation indent-rigidly--pop-undo indent-rigidly-left indent-rigidly-left-to-tab-stop indent-rigidly-right indent-rigidly-right-to-tab-stop inferior-lisp-menu inferior-octave-check-process inferior-octave-completion-table inferior-octave-process-live-p inferior-octave-track-window-width-change info--manual-names inotify-add-watch inotify-rm-watch internal-default-process-filter internal-default-process-sentinel internal-pop-keymap internal-push-keymap internal-timer-start-idle isearch-char-by-name isearch-forward-symbol-at-point isearch-post-command-hook isearch-pre-command-hook isearch-toggle-invisible ispell-buffer-with-debug ispell-create-debug-buffer ispell-find-hunspell-dictionaries ispell-hunspell-fill-dictionary-entry ispell-lookup-words ispell-parse-hunspell-affix-file ispell-print-if-debug jit-lock--debug-fontify jit-lock-debug-mode js--array-comp-indentation js--indent-in-array-comp js--multi-line-declaration-indentation js--same-line json--with-indentation json-pretty-print json-pretty-print-buffer kmacro-execute-from-register kmacro-to-register line-pixel-height linum-mode-set-explicitly lisp--company-doc-buffer lisp--company-doc-string lisp--company-location lisp--local-variables lisp--local-variables-1 lisp-current-defun-name list-colors-redisplay lm-homepage log-edit--match-first-line log-edit-beginning-of-line log-edit-goto-eoh log-edit-insert-filenames-without-changelog log-edit-insert-message-template log-edit-kill-buffer log-edit-remember-comment log-edit-set-header log-view-diff-common log-view-end-of-defun-1 lpr-print-region ls-lisp--insert-directory m4-current-defun-name macroexp--compiling-p macrop make-backup-file-name--default-function make-ert-test-skipped make-gdb-handler make-package--ac-desc make-package--bi-desc math-absolute-from-dt math-absolute-from-gregorian-dt math-absolute-from-iso-dt math-absolute-from-julian-dt math-date-to-gregorian-dt math-date-to-iso-dt math-date-to-julian-dt math-day-in-year math-dt-before-p math-iso-dt-to-date math-parse-iso-date math-parse-iso-date-validate menu-bar-menu-at-x-y messages-buffer messages-buffer-mode mh-bare-components mh-blacklist-a-msg mh-cl-flet mh-components-to-list mh-define-obsolete-variable-alias mh-extract-header-field mh-junk-blacklist-disposition mh-junk-process-blacklist mh-junk-process-whitelist mh-junk-whitelist-a-msg mh-make-obsolete-variable minibuffer-force-complete-and-exit mm-convert-shr-links mm-temp-files-delete mml-smime-epg-find-usable-secret-key mml2015-epg-check-sub-key mml2015-epg-check-user-id mml2015-epg-key-image mml2015-epg-key-image-to-string mml2015-epg-signature-to-string mml2015-epg-verify-result-to-string modify-file-local-variable-message mouse--down-1-maybe-follows-link move-point-visually net-utils--revert-function newline-cache-check nndoc-debbugs-db-type-p nnfolder-recursive-directory-files nnimap-change-group nnimap-log-buffer nnir-possibly-change-group nnir-request-create-group nnir-request-delete-group nnir-request-scan nnir-request-set-mark nnir-request-update-info nnir-request-update-mark nnir-server-to-search-engine notifications-get-server-information octave--indent-new-comment-line octave-add-log-current-defun octave-completing-read octave-completion-at-point octave-eldoc-function octave-eldoc-function-signatures octave-find-definition octave-find-definition-default-filename octave-font-lock-texinfo-comment octave-function-file-comment octave-function-file-p octave-goto-function-definition octave-help octave-help-mode octave-in-string-or-comment-p octave-indent-comment octave-lookfor octave-send-buffer octave-skip-comment-forward octave-source-directories octave-source-file octave-sync-function-file-names octave-update-function-file-comment opascal-block-start opascal-char-token-at opascal-charset-token-at opascal-column-of opascal-comment-block-end opascal-comment-block-start opascal-comment-content-start opascal-comment-indent-of opascal-composite-type-start opascal-corrected-indentation opascal-current-token opascal-debug-goto-next-token opascal-debug-goto-point opascal-debug-goto-previous-token opascal-debug-log opascal-debug-show-current-string opascal-debug-show-current-token opascal-debug-token-string opascal-debug-tokenize-buffer opascal-debug-tokenize-region opascal-debug-tokenize-window opascal-else-start opascal-enclosing-indent-of opascal-ensure-buffer opascal-explicit-token-at opascal-fill-comment opascal-find-current-body opascal-find-current-def opascal-find-current-xdef opascal-find-unit opascal-find-unit-file opascal-find-unit-in-directory opascal-group-end opascal-group-start opascal-in-token opascal-indent-line opascal-indent-of opascal-is opascal-is-block-after-expr-statement opascal-is-directory opascal-is-file opascal-is-literal-end opascal-is-simple-class-type opascal-is-use-clause-end opascal-line-indent-of opascal-literal-end-pattern opascal-literal-kind opascal-literal-start-pattern opascal-literal-stop-pattern opascal-literal-token-at opascal-log-msg opascal-looking-at-string opascal-match-token opascal-mode opascal-new-comment-line opascal-next-line-start opascal-next-token opascal-next-visible-token opascal-on-first-comment-line opascal-open-group-indent opascal-point-token-at opascal-previous-indent-of opascal-previous-token opascal-progress-done opascal-progress-start opascal-save-excursion opascal-search-directory opascal-section-indent-of opascal-set-token-end opascal-set-token-kind opascal-set-token-start opascal-space-token-at opascal-step-progress opascal-stmt-line-indent-of opascal-string-of opascal-tab opascal-token-at opascal-token-end opascal-token-kind opascal-token-of opascal-token-start opascal-token-string opascal-word-token-at org-N-empty-lines-before-current org-agenda-bulk-toggle-all org-agenda-drag-line-backward org-agenda-drag-line-forward org-agenda-filter-by-regexp org-agenda-filter-by-top-headline org-agenda-filter-expand-tags org-agenda-filter-remove-all org-agenda-filter-show-all-re org-agenda-filter-show-all-top-filter org-agenda-filter-top-headline-apply org-agenda-fortnight-view org-agenda-limit-entries org-agenda-limit-interactively org-agenda-propertize-selected-todo-keywords org-agenda-reapply-filters org-agenda-remove-filter org-agenda-unmark-clocking-task org-ascii--box-string org-ascii--build-caption org-ascii--build-title org-ascii--build-toc org-ascii--checkbox org-ascii--current-text-width org-ascii--describe-links org-ascii--fill-string org-ascii--has-caption-p org-ascii--indent-string org-ascii--justify-string org-ascii--list-listings org-ascii--list-tables org-ascii--table-cell-width org-ascii--translate org-ascii--unique-links org-ascii-bold org-ascii-center-block org-ascii-clock org-ascii-code org-ascii-drawer org-ascii-dynamic-block org-ascii-entity org-ascii-example-block org-ascii-export-as-ascii org-ascii-export-block org-ascii-export-snippet org-ascii-export-to-ascii org-ascii-filter-comment-spacing org-ascii-filter-headline-blank-lines org-ascii-filter-paragraph-spacing org-ascii-fixed-width org-ascii-footnote-reference org-ascii-format-inlinetask-default org-ascii-headline org-ascii-horizontal-rule org-ascii-inline-src-block org-ascii-inlinetask org-ascii-inner-template org-ascii-italic org-ascii-item org-ascii-keyword org-ascii-latex-environment org-ascii-latex-fragment org-ascii-line-break org-ascii-link org-ascii-paragraph org-ascii-plain-list org-ascii-plain-text org-ascii-planning org-ascii-publish-to-ascii org-ascii-publish-to-latin1 org-ascii-publish-to-utf8 org-ascii-quote-block org-ascii-quote-section org-ascii-radio-target org-ascii-section org-ascii-special-block org-ascii-src-block org-ascii-statistics-cookie org-ascii-strike-through org-ascii-subscript org-ascii-superscript org-ascii-table org-ascii-table-cell org-ascii-table-row org-ascii-template org-ascii-template--document-title org-ascii-timestamp org-ascii-underline org-ascii-verbatim org-ascii-verse-block org-at-TBLFM-p org-babel--shell-command-on-region org-babel-C-format-val org-babel-C-val-to-C-list-type org-babel-C-val-to-C-type org-babel-active-location-p org-babel-check-confirm-evaluate org-babel-check-evaluate org-babel-execute:makefile org-babel-exp-process-buffer org-babel-lilypond-attempt-to-open-pdf org-babel-lilypond-attempt-to-play-midi org-babel-lilypond-check-for-compile-error org-babel-lilypond-compile-lilyfile org-babel-lilypond-determine-ly-path org-babel-lilypond-determine-midi-path org-babel-lilypond-determine-pdf-path org-babel-lilypond-execute-tangled-ly org-babel-lilypond-get-header-args org-babel-lilypond-mark-error-line org-babel-lilypond-parse-error-line org-babel-lilypond-parse-line-num org-babel-lilypond-process-basic org-babel-lilypond-process-compile-error org-babel-lilypond-set-header-args org-babel-lilypond-switch-extension org-babel-lilypond-tangle org-babel-lilypond-toggle-arrange-mode org-babel-lilypond-toggle-html-generation org-babel-lilypond-toggle-midi-play org-babel-lilypond-toggle-pdf-display org-babel-lilypond-toggle-pdf-generation org-babel-lilypond-toggle-png-generation org-babel-perl--var-to-perl org-babel-prep-session:makefile org-babel-python-with-earmuffs org-babel-python-without-earmuffs org-babel-result-cond org-babel-scheme-cleanse-repl-map org-babel-scheme-execute-with-geiser org-babel-scheme-get-buffer-impl org-babel-scheme-get-repl org-babel-scheme-get-session-buffer org-babel-scheme-make-session-name org-babel-scheme-set-session-buffer org-babel-tangle-single-block org-babel-when-in-src-block org-backward-paragraph org-beamer--element-has-overlay-p org-beamer--format-block org-beamer--format-frame org-beamer--format-section org-beamer--frame-level org-beamer--get-label org-beamer--normalize-argument org-beamer-bold org-beamer-export-as-latex org-beamer-export-block org-beamer-export-snippet org-beamer-export-to-latex org-beamer-export-to-pdf org-beamer-headline org-beamer-insert-options-template org-beamer-item org-beamer-keyword org-beamer-link org-beamer-plain-list org-beamer-publish-to-latex org-beamer-publish-to-pdf org-beamer-radio-target org-beamer-target org-beamer-template org-bibtex-import-from-file org-bibtex-read-buffer org-bibtex-read-file org-buffer-narrowed-p org-capture--expand-keyword-in-embedded-elisp org-clock-get-last-clock-out-time org-cmp-ts org-compute-latex-and-related-regexp org-copy org-create-formula--latex-header org-create-formula-image org-cycle-hide-inline-tasks org-define-lookup-function org-defvaralias org-do-latex-and-related org-docview-export org-drag-line-backward org-drag-line-forward org-dvipng-color-format org-edit-src-abort org-element--list-struct org-element--remove-indentation org-element-diary-sexp-interpreter org-element-diary-sexp-parser org-element-node-property-interpreter org-element-node-property-parser org-element-plain-link-successor org-every org-export--collect-headline-numbering org-export--copy-to-kill-ring-p org-export--dispatch-action org-export--dispatch-ui org-export--generate-copy-script org-export--get-buffer-attributes org-export--get-global-options org-export--get-inbuffer-options org-export--get-min-level org-export--get-subtree-options org-export--interpret-p org-export--list-bound-variables org-export--parse-option-keyword org-export--populate-ignore-list org-export--prepare-file-contents org-export--selected-trees org-export--skip-p org-export--stack-source-at-point org-export-activate-smart-quotes org-export-add-to-stack org-export-as org-export-async-start org-export-backend-blocks org-export-backend-filters org-export-backend-menu org-export-backend-name org-export-backend-options org-export-backend-p org-export-backend-parent org-export-backend-transcoders org-export-barf-if-invalid-backend org-export-collect-elements org-export-collect-figures org-export-collect-footnote-definitions org-export-collect-headlines org-export-collect-listings org-export-collect-tables org-export-collect-tree-properties org-export-copy-buffer org-export-create-backend org-export-data org-export-data-with-backend org-export-define-backend org-export-define-derived-backend org-export-derived-backend-p org-export-dispatch org-export-execute-babel-code org-export-expand org-export-expand-include-keyword org-export-filter-apply-functions org-export-first-sibling-p org-export-footnote-first-reference-p org-export-format-code org-export-format-code-default org-export-get-all-filters org-export-get-all-options org-export-get-all-transcoders org-export-get-alt-title org-export-get-backend org-export-get-caption org-export-get-category org-export-get-date org-export-get-environment org-export-get-footnote-definition org-export-get-footnote-number org-export-get-genealogy org-export-get-headline-number org-export-get-loc org-export-get-next-element org-export-get-node-property org-export-get-ordinal org-export-get-parent org-export-get-parent-element org-export-get-parent-headline org-export-get-parent-table org-export-get-previous-element org-export-get-relative-level org-export-get-table-cell-at org-export-get-tags org-export-ignore-element org-export-inline-image-p org-export-insert-default-template org-export-install-filters org-export-last-sibling-p org-export-low-level-p org-export-number-to-roman org-export-numbered-headline-p org-export-output-file-name org-export-read-attribute org-export-register-backend org-export-replace-region-by org-export-resolve-coderef org-export-resolve-fuzzy-link org-export-resolve-id-link org-export-resolve-radio-link org-export-snippet-backend org-export-solidify-link-text org-export-stack org-export-stack-clear org-export-stack-mode org-export-stack-refresh org-export-stack-remove org-export-stack-view org-export-string-as org-export-table-cell-address org-export-table-cell-alignment org-export-table-cell-borders org-export-table-cell-ends-colgroup-p org-export-table-cell-starts-colgroup-p org-export-table-cell-width org-export-table-dimensions org-export-table-has-header-p org-export-table-has-special-column-p org-export-table-row-ends-header-p org-export-table-row-ends-rowgroup-p org-export-table-row-group org-export-table-row-is-special-p org-export-table-row-number org-export-table-row-starts-header-p org-export-table-row-starts-rowgroup-p org-export-to-buffer org-export-to-file org-export-transcoder org-export-translate org-export-unravel-code org-export-with-backend org-export-with-buffer-copy org-file-equal-p org-find-top-headline org-forward-paragraph org-get-export-keywords org-hours-to-clocksum-string org-html--anchor org-html--build-head org-html--build-mathjax-config org-html--build-meta-info org-html--build-pre/postamble org-html--container org-html--format-image org-html--format-toc-headline org-html--has-caption-p org-html--make-attribute-string org-html--make-string org-html--tags org-html--textarea-block org-html--toc-text org-html--todo org-html--translate org-html--wrap-image org-html-begin-plain-list org-html-bold org-html-center-block org-html-checkbox org-html-clock org-html-close-tag org-html-code org-html-convert-region-to-html org-html-convert-special-strings org-html-do-format-code org-html-doctype org-html-drawer org-html-dynamic-block org-html-encode-plain-text org-html-end-plain-list org-html-entity org-html-example-block org-html-export-as-html org-html-export-block org-html-export-snippet org-html-export-to-html org-html-final-function org-html-fix-class-name org-html-fixed-width org-html-fontify-code org-html-footnote-reference org-html-footnote-section org-html-format-code org-html-format-footnote-definition org-html-format-footnote-reference org-html-format-footnotes-section org-html-format-headline org-html-format-headline--wrap org-html-format-latex org-html-format-list-item org-html-format-section org-html-format-spec org-html-headline org-html-horizontal-rule org-html-html5-p org-html-htmlize-generate-css org-html-htmlize-region-for-paste org-html-infojs-install-script org-html-inline-image-p org-html-inline-src-block org-html-inlinetask org-html-inner-template org-html-italic org-html-item org-html-keyword org-html-latex-environment org-html-latex-fragment org-html-line-break org-html-link org-html-list-of-listings org-html-list-of-tables org-html-paragraph org-html-plain-list org-html-plain-text org-html-planning org-html-property-drawer org-html-publish-to-html org-html-quote-block org-html-quote-section org-html-radio-target org-html-section org-html-special-block org-html-src-block org-html-standalone-image-p org-html-statistics-cookie org-html-strike-through org-html-subscript org-html-superscript org-html-table org-html-table--table\.el-table org-html-table-cell org-html-table-first-row-data-cells org-html-table-row org-html-target org-html-template org-html-timestamp org-html-toc org-html-underline org-html-verbatim org-html-verse-block org-html-xhtml-p org-icalendar--combine-files org-icalendar--valarm org-icalendar--vcalendar org-icalendar--vevent org-icalendar--vtodo org-icalendar-blocked-headline-p org-icalendar-clear-blank-lines org-icalendar-combine-agenda-files org-icalendar-convert-timestamp org-icalendar-create-uid org-icalendar-dtstamp org-icalendar-entry org-icalendar-export-agenda-files org-icalendar-export-current-agenda org-icalendar-export-to-ics org-icalendar-fold-string org-icalendar-get-categories org-icalendar-template org-icalendar-transcode-diary-sexp org-icalendar-use-UTC-date-time-p org-in-drawer-p org-irc-ellipsify-description org-iread-file-name org-latex--align-string org-latex--caption/label-string org-latex--collect-errors org-latex--delayed-footnotes-definitions org-latex--find-verb-separator org-latex--inline-image org-latex--make-option-string org-latex--math-table org-latex--org-table org-latex--script-size org-latex--table\.el-table org-latex--text-markup org-latex--wrap-label org-latex-bold org-latex-center-block org-latex-clock org-latex-code org-latex-compile org-latex-convert-region-to-latex org-latex-drawer org-latex-dynamic-block org-latex-entity org-latex-example-block org-latex-export-as-latex org-latex-export-block org-latex-export-snippet org-latex-export-to-latex org-latex-export-to-pdf org-latex-fixed-width org-latex-footnote-reference org-latex-format-headline-default-function org-latex-guess-babel-language org-latex-guess-inputenc org-latex-headline org-latex-horizontal-rule org-latex-inline-src-block org-latex-inlinetask org-latex-italic org-latex-item org-latex-keyword org-latex-latex-environment org-latex-latex-fragment org-latex-line-break org-latex-link org-latex-paragraph org-latex-plain-list org-latex-plain-text org-latex-planning org-latex-publish-to-latex org-latex-publish-to-pdf org-latex-quote-block org-latex-quote-section org-latex-radio-target org-latex-section org-latex-special-block org-latex-src-block org-latex-statistics-cookie org-latex-strike-through org-latex-subscript org-latex-superscript org-latex-table org-latex-table-cell org-latex-table-row org-latex-target org-latex-template org-latex-timestamp org-latex-underline org-latex-verbatim org-latex-verse-block org-load-noerror-mustsuffix org-lookup-all org-lookup-first org-lookup-last org-macro--collect-macros org-macro-expand org-macro-initialize-templates org-macro-replace-all org-man--caption/label-string org-man--wrap-label org-man-bold org-man-center-block org-man-clock org-man-code org-man-collect-errors org-man-compile org-man-drawer org-man-dynamic-block org-man-entity org-man-example-block org-man-export-block org-man-export-snippet org-man-export-to-man org-man-export-to-pdf org-man-fixed-width org-man-headline org-man-inline-src-block org-man-italic org-man-item org-man-keyword org-man-line-break org-man-link org-man-paragraph org-man-plain-list org-man-plain-text org-man-quote-block org-man-quote-section org-man-radio-target org-man-section org-man-special-block org-man-src-block org-man-statistics-cookie org-man-strike-through org-man-subscript org-man-superscript org-man-table org-man-table--align-string org-man-table--org-table org-man-table-cell org-man-table-row org-man-target org-man-template org-man-timestamp org-man-underline org-man-verbatim org-man-verse-block org-md-bold org-md-convert-region-to-md org-md-example-block org-md-export-as-markdown org-md-export-to-markdown org-md-headline org-md-horizontal-rule org-md-inner-template org-md-italic org-md-item org-md-line-break org-md-link org-md-paragraph org-md-plain-list org-md-plain-text org-md-quote-block org-md-section org-md-separate-elements org-md-template org-md-verbatim org-minutes-to-clocksum-string org-next-block org-odt--build-date-styles org-odt--checkbox org-odt--copy-formula-file org-odt--copy-image-file org-odt--encode-plain-text org-odt--encode-tabs-and-spaces org-odt--enumerable-formula-p org-odt--enumerable-image-p org-odt--enumerable-latex-image-p org-odt--enumerable-p org-odt--enumerate org-odt--export-wrap org-odt--find-verb-separator org-odt--format-paragraph org-odt--format-timestamp org-odt--frame org-odt--image-size org-odt--paragraph-style org-odt--render-image/formula org-odt--standalone-link-p org-odt--table org-odt--target org-odt--textbox org-odt--translate-description-lists org-odt--translate-latex-fragments org-odt--translate-list-tables org-odt--zip-extract org-odt-bold org-odt-center-block org-odt-clock org-odt-code org-odt-convert org-odt-convert-read-params org-odt-do-convert org-odt-do-format-code org-odt-do-reachable-formats org-odt-drawer org-odt-dynamic-block org-odt-entity org-odt-example-block org-odt-export-as-odf org-odt-export-as-odf-and-open org-odt-export-block org-odt-export-snippet org-odt-export-to-odt org-odt-fixed-width org-odt-footnote-reference org-odt-format-code org-odt-format-headline--wrap org-odt-format-label org-odt-format-section org-odt-format-toc-headline org-odt-headline org-odt-horizontal-rule org-odt-htmlfontify-string org-odt-inline-src-block org-odt-inlinetask org-odt-italic org-odt-item org-odt-keyword org-odt-latex-environment org-odt-latex-fragment org-odt-line-break org-odt-link org-odt-link--infer-description org-odt-link--inline-formula org-odt-link--inline-image org-odt-paragraph org-odt-plain-list org-odt-plain-text org-odt-planning org-odt-property-drawer org-odt-quote-block org-odt-quote-section org-odt-radio-target org-odt-reachable-formats org-odt-reachable-p org-odt-section org-odt-special-block org-odt-src-block org-odt-statistics-cookie org-odt-strike-through org-odt-subscript org-odt-superscript org-odt-table org-odt-table-cell org-odt-table-first-row-data-cells org-odt-table-row org-odt-table-style-spec org-odt-target org-odt-template org-odt-timestamp org-odt-toc org-odt-underline org-odt-verbatim org-odt-verse-block org-open-line org-org-export-as-org org-org-export-to-org org-org-headline org-org-identity org-org-keyword org-org-publish-to-org org-org-section org-previous-block org-protocol-convert-query-to-plist org-publish-collect-index org-publish-collect-numbering org-publish-resolve-external-fuzzy-link org-refile--get-location org-reverse-string org-sbe org-set-property-and-value org-set-regexps-and-options-for-tags org-set-transient-map org-some org-table-TBLFM-begin org-table-calc-current-TBLFM org-table-set-constants org-tags-expand org-texinfo--build-menu org-texinfo--find-verb-separator org-texinfo--format-entries org-texinfo--get-node org-texinfo--menu-entries org-texinfo--normalize-headlines org-texinfo--sanitize-content org-texinfo--sanitize-node org-texinfo--text-markup org-texinfo-bold org-texinfo-center-block org-texinfo-clock org-texinfo-code org-texinfo-collect-errors org-texinfo-compile org-texinfo-convert-region-to-texinfo org-texinfo-drawer org-texinfo-dynamic-block org-texinfo-entity org-texinfo-example-block org-texinfo-export-block org-texinfo-export-snippet org-texinfo-export-to-info org-texinfo-export-to-texinfo org-texinfo-filter-section-blank-lines org-texinfo-fixed-width org-texinfo-footnote-reference org-texinfo-headline org-texinfo-inline-src-block org-texinfo-inlinetask org-texinfo-italic org-texinfo-item org-texinfo-keyword org-texinfo-line-break org-texinfo-link org-texinfo-make-menu org-texinfo-paragraph org-texinfo-plain-list org-texinfo-plain-text org-texinfo-planning org-texinfo-property-drawer org-texinfo-publish-to-texinfo org-texinfo-quote-block org-texinfo-quote-section org-texinfo-radio-target org-texinfo-section org-texinfo-special-block org-texinfo-src-block org-texinfo-statistics-cookie org-texinfo-subscript org-texinfo-superscript org-texinfo-table org-texinfo-table-cell org-texinfo-table-column-widths org-texinfo-table-row org-texinfo-target org-texinfo-template org-texinfo-timestamp org-texinfo-verbatim org-texinfo-verse-block org-time-stamp-to-now org-timestamp-format org-timestamp-has-time-p org-timestamp-split-range org-timestamp-translate org-toggle-tags-groups org-transpose-words org-uniquify-alist org-unlogged-message org-w3m-store-link org-with-silent-modifications package--ac-desc-extras package--ac-desc-kind package--ac-desc-reqs package--ac-desc-summary package--ac-desc-version package--alist-to-plist-args package--archive-file-exists-p package--bi-desc-reqs package--bi-desc-summary package--bi-desc-version package--check-signature package--compile package--description-file package--from-builtin package--has-keyword-p package--make-autoloads-and-stuff package--mapc package--prepare-dependencies package-all-keywords package-desc--keywords package-desc-archive package-desc-create package-desc-dir package-desc-extras package-desc-from-define package-desc-full-name package-desc-name package-desc-p package-desc-signed package-desc-status package-desc-suffix package-desc-summary package-desc-version package-disabled-p package-generate-description-file package-import-keyring package-install-from-archive package-keyword-button-action package-make-ac-desc package-make-builtin package-make-button package-menu--archive-predicate package-menu--refresh package-menu-filter package-process-define-package pcase--mutually-exclusive-p pcmpl-x-ack-long-options pcmpl-x-ack-run pcmpl-x-ack-short-options pcmpl-x-ack-type-options pcmpl-x-ag-options pcmpl-x-tlmgr-action-options pcomplete/ack pcomplete/ack-grep pcomplete/ag pcomplete/org-mode/file-option/exclude_tags pcomplete/org-mode/file-option/filetags pcomplete/org-mode/file-option/infojs_opt pcomplete/org-mode/file-option/language pcomplete/org-mode/file-option/priorities pcomplete/org-mode/file-option/select_tags pcomplete/org-mode/file-option/tags pcomplete/tlmgr perl-current-defun-name perl-electric-noindent-p pop3-uidl-add-xheader pop3-uidl-dele pop3-uidl-load pop3-uidl-save pop3-uidl-stat prettify-symbols--compose-symbol prettify-symbols--make-keywords prettify-symbols-mode prettify-symbols-mode-set-explicitly profiler-calltree-build-unified profiler-report-menu profiler-running-p prolog-electric--colon prolog-electric--dash prolog-electric--dot prolog-electric--if-then-else prolog-electric--underscore prolog-post-self-insert python-electric-pair-string-delimiter python-imenu--build-tree python-imenu--put-parent python-imenu-create-flat-index python-imenu-create-index python-imenu-format-item-label python-imenu-format-parent-item-jump-label python-imenu-format-parent-item-label python-info-dedenter-opening-block-message python-info-dedenter-opening-block-position python-info-dedenter-opening-block-positions python-info-dedenter-statement-p python-nav--forward-defun python-nav--lisp-forward-sexp python-nav--lisp-forward-sexp-safe python-nav--syntactically python-nav-backward-defun python-nav-backward-sexp python-nav-backward-sexp-safe python-nav-forward-defun python-nav-forward-sexp-safe python-nav-if-name-main python-shell--save-temp-file python-shell-buffer-substring python-shell-get-buffer python-shell-prompt-detect python-shell-prompt-set-calculated-regexps python-shell-prompt-validate-regexps python-util-popn python-util-strip-string python-util-valid-regexp-p rcirc-condition-filter read--expression read-regexp-suggestions rectangle--extract-region rectangle--highlight-for-redisplay rectangle--insert-for-yank rectangle--unhighlight-for-redisplay rectangle-mark-mode redisplay--update-region-highlight redisplay--update-region-highlights reftex-cleveref-Cpageref reftex-cleveref-Cref reftex-cleveref-cpageref reftex-cleveref-cref reftex-using-biblatex-p register-describe-oneline register-preview register-preview-default register-read-with-preview remember-notes remember-notes--kill-buffer-query remember-notes-mode remember-notes-save-and-bury-buffer remember-store-in-files remove-function repeat-complex-command--called-interactively-skip replace-search revert-buffer--default revert-buffer-insert-file-contents--default-function rng--ipattern-after rng--ipattern-child rng--ipattern-datatype rng--ipattern-index rng--ipattern-memo-end-tag-deriv rng--ipattern-memo-map-data-deriv rng--ipattern-memo-map-start-attribute-deriv rng--ipattern-memo-map-start-tag-open-deriv rng--ipattern-memo-mixed-text-deriv rng--ipattern-memo-start-tag-close-deriv rng--ipattern-memo-text-only-deriv rng--ipattern-memo-text-typed rng--ipattern-name-class rng--ipattern-nullable rng--ipattern-type rng--ipattern-value-object rst-deprecated-adjust rst-deprecated-backward-section rst-deprecated-bullet-list-region rst-deprecated-compile rst-deprecated-compile-alt-toolset rst-deprecated-compile-pdf-preview rst-deprecated-compile-pseudo-region rst-deprecated-compile-slides-preview rst-deprecated-convert-bullets-to-enumeration rst-deprecated-enumerate-region rst-deprecated-forward-section rst-deprecated-goto-section rst-deprecated-line-block-region rst-deprecated-mark-section rst-deprecated-shift-region rst-deprecated-straighten-adornments rst-deprecated-straighten-bullets-region rst-deprecated-toc-insert rst-deprecated-toc-update ruby--at-indentation-p ruby--detect-encoding ruby--electric-indent-p ruby--encoding-comment-required-p ruby--insert-coding-comment ruby-block-contains-point ruby-mode-menu ruby-smie--args-separator-p ruby-smie--at-dot-call ruby-smie--backward-token ruby-smie--bosp ruby-smie--closing-pipe-p ruby-smie--forward-token ruby-smie--implicit-semi-p ruby-smie--indent-to-stmt ruby-smie--indent-to-stmt-p ruby-smie--opening-pipe-p ruby-smie--redundant-do-p ruby-smie-rules ruby-syntax-expansion-allowed-p ruby-syntax-propertize-expansion ruby-syntax-propertize-expansions run-window-scroll-functions sanitize-coding-system-list save-place-dired-hook scheme-syntax-propertize scheme-syntax-propertize-sexp-comment semantic-default-elisp-setup ses--advice-copy-region-as-kill ses--advice-yank ses-decode-cell-symbol ses-is-cell-sym-p set-default-toplevel-value set-face-bold set-face-inverse-video set-face-italic set-file-acl set-file-extended-attributes set-transient-map set-window-new-pixel sh--cmd-completion-table sh--vars-before-point sh-cd-here sh-completion-at-point-function sh-current-defun-name sh-send-line-or-region-and-step sh-send-text sh-shell-process sh-show-shell sh-smie--default-backward-token sh-smie--default-forward-token shell-apply-ansi-color shell-reapply-ansi-color show-paren--default shr--extract-best-source shr--get-media-pref shr-dom-to-xml shr-image-from-data shr-make-table-1 shr-mouse-browse-url shr-next-link shr-parse-base shr-parse-image-data shr-previous-link shr-render-region shr-tag-audio shr-tag-dd shr-tag-dl shr-tag-dt shr-tag-span shr-tag-svg sieve-bury-buffer sieve-manage-drop-next-answer sieve-manage-make-process-buffer sieve-manage-open-server sieve-manage-parse-capability sieve-manage-wait-for-answer smerge--get-marker smie--matching-block-data smie--next-indent-change smie--opener/closer-at-point smie-config--advice smie-config--get-trace smie-config--guess smie-config--guess-value smie-config--mode-hook smie-config--setter smie-config-guess smie-config-local smie-config-save smie-config-set-indent smie-config-show-indent smie-edebug smie-indent--rule-1 smiley-directory smiley-mouse-toggle-buffer smiley-toggle-buffer smiley-update-cache smtpmail-try-auth-method socks-split-string special-form-p sql--completion-table sql--make-help-docstring sql--oracle-show-reserved-words sql-default-value sql-ends-with-prompt-re sql-starts-with-prompt-re srecode-semantic-handle-:srt string-blank-p string-empty-p string-join string-remove-prefix string-remove-suffix string-reverse string-suffix-p string-trim string-trim-left string-trim-right substitute-env-in-file-name subword-left subword-mode-set-explicitly subword-right sup-get-tty-num sup-mouse-report sup-move-point-to-x-y sup-pos-to-window superword-mode superword-mode-set-explicitly switch-to-prolog tar--check-descriptor tar--extract tar-get-file-descriptor tex-current-defun-name texinfo-current-defun-name text-clone--maintain thing-at-point--bounds-of-markedup-url thing-at-point--bounds-of-well-formed-url thing-at-point-newsgroup-p timer--check timer--time-setter tmm--completion-table todo--user-error-if-marked-done-item todo-absolute-file-name todo-add-file todo-adjusted-category-label-length todo-archive-done-item todo-archive-mode todo-categories-mode todo-category-completions todo-category-number todo-category-string-matcher-1 todo-category-string-matcher-2 todo-check-file todo-check-filtered-items-file todo-check-format todo-choose-archive todo-clear-matches todo-comment-string-matcher todo-convert-legacy-date-time todo-convert-legacy-files todo-current-category todo-date-string-matcher todo-delete-category todo-delete-file todo-desktop-save-buffer todo-diary-expired-matcher todo-diary-goto-entry todo-diary-item-p todo-diary-nonmarking-matcher todo-display-categories todo-display-sorted todo-done-item-p todo-done-item-section-p todo-done-separator todo-done-string-matcher todo-edit-category-diary-inclusion todo-edit-category-diary-nonmarking todo-edit-file todo-edit-item--diary-inclusion todo-edit-item--header todo-edit-item--next-key todo-edit-item--text todo-edit-quit todo-files todo-filter-diary-items todo-filter-diary-items-multifile todo-filter-items todo-filter-items-1 todo-filter-items-filename todo-filter-regexp-items todo-filter-regexp-items-multifile todo-filter-top-priorities todo-filter-top-priorities-multifile todo-filtered-items-mode todo-find-archive todo-find-filtered-items-file todo-find-item todo-get-count todo-get-overlay todo-go-to-source-item todo-indent todo-insert-category-line todo-insert-item--apply-args todo-insert-item--argsleft todo-insert-item--basic todo-insert-item--keyof todo-insert-item--next-param todo-insert-item--this-key todo-insert-item-from-calendar todo-insert-sort-button todo-insert-with-overlays todo-item-done todo-item-undone todo-jump-to-archive-category todo-label-to-key todo-longest-category-name-length todo-lower-category todo-lower-item-priority todo-make-categories-list todo-mark-category todo-marked-item-p todo-merge-category todo-mode-external-set todo-mode-line-control todo-modes-set-1 todo-modes-set-2 todo-modes-set-3 todo-move-category todo-move-item todo-multiple-filter-files todo-next-button todo-next-item todo-nondiary-marker-matcher todo-padded-string todo-prefix-overlays todo-previous-button todo-previous-item todo-print-buffer todo-print-buffer-to-file todo-raise-category todo-raise-item-priority todo-read-category todo-read-date todo-read-dayname todo-read-file-name todo-read-time todo-reevaluate-category-completions-files-defcustom todo-reevaluate-default-file-defcustom todo-reevaluate-filelist-defcustoms todo-reevaluate-filter-files-defcustom todo-rename-category todo-rename-file todo-repair-categories-sexp todo-reset-and-enable-done-separator todo-reset-comment-string todo-reset-done-separator todo-reset-done-separator-string todo-reset-done-string todo-reset-global-current-todo-file todo-reset-highlight-item todo-reset-nondiary-marker todo-reset-prefix todo-restore-desktop-buffer todo-save-filtered-items-buffer todo-search todo-set-categories todo-set-category-number todo-set-date-from-calendar todo-set-item-priority todo-set-show-current-file todo-set-top-priorities todo-set-top-priorities-in-category todo-set-top-priorities-in-file todo-short-file-name todo-show-categories-table todo-show-current-file todo-sort todo-sort-categories-alphabetically-or-numerically todo-sort-categories-by-archived todo-sort-categories-by-diary todo-sort-categories-by-done todo-sort-categories-by-todo todo-time-string-matcher todo-toggle-item-header todo-toggle-item-highlighting todo-toggle-mark-item todo-toggle-prefix-numbers todo-toggle-view-done-items todo-toggle-view-done-only todo-total-item-counts todo-unarchive-items todo-unmark-category todo-update-buffer-list todo-update-categories-display todo-update-categories-sexp todo-update-count todo-validate-name todo-y-or-n-p toggle-frame-fullscreen toggle-frame-maximized tool-bar-lines-needed trace--display-buffer trace--read-args trace-function-foreground trace-values track-mouse tramp-adb--gnu-switches-to-ash tramp-adb-barf-unless-okay tramp-adb-execute-adb-command tramp-adb-file-name-handler tramp-adb-file-name-p tramp-adb-find-test-command tramp-adb-get-ls-command tramp-adb-handle-copy-file tramp-adb-handle-delete-directory tramp-adb-handle-delete-file tramp-adb-handle-directory-files-and-attributes tramp-adb-handle-expand-file-name tramp-adb-handle-file-attributes tramp-adb-handle-file-directory-p tramp-adb-handle-file-local-copy tramp-adb-handle-file-name-all-completions tramp-adb-handle-file-truename tramp-adb-handle-file-writable-p tramp-adb-handle-make-directory tramp-adb-handle-process-file tramp-adb-handle-rename-file tramp-adb-handle-set-file-modes tramp-adb-handle-set-file-times tramp-adb-handle-shell-command tramp-adb-handle-start-file-process tramp-adb-handle-write-region tramp-adb-ls-output-name-less-p tramp-adb-ls-output-time-less-p tramp-adb-maybe-open-connection tramp-adb-parse-device-names tramp-adb-send-command tramp-adb-send-command-and-check tramp-adb-sh-fix-ls-output tramp-adb-wait-for-output tramp-autoload-file-name-handler tramp-backtrace tramp-call-process tramp-check-proper-method-and-host tramp-compat-load tramp-compat-replace-regexp-in-string tramp-condition-case-unless-debug tramp-connection-property-p tramp-do-parse-file-attributes-with-ls tramp-get-hash-table tramp-get-remote-gid-with-id tramp-get-remote-gid-with-perl tramp-get-remote-gid-with-python tramp-get-remote-gvfs-monitor-dir tramp-get-remote-inotifywait tramp-get-remote-locale tramp-get-remote-python tramp-get-remote-touch tramp-get-remote-uid-with-id tramp-get-remote-uid-with-perl tramp-get-remote-uid-with-python tramp-handle-file-accessible-directory-p tramp-handle-file-notify-add-watch tramp-handle-file-notify-rm-watch tramp-handle-insert-directory tramp-handle-make-auto-save-file-name tramp-handle-make-symbolic-link tramp-handle-set-visited-file-modtime tramp-handle-verify-visited-file-modtime tramp-register-autoload-file-name-handlers tramp-remote-acl-p tramp-sh-file-gvfs-monitor-dir-process-filter tramp-sh-file-inotifywait-process-filter tramp-sh-handle-file-acl tramp-sh-handle-file-notify-add-watch tramp-sh-handle-set-file-acl tramp-smb-action-get-acl tramp-smb-action-set-acl tramp-smb-handle-file-acl tramp-smb-handle-set-file-acl tramp-user-error turn-on-prettify-symbols-mode uniquify--create-file-buffer-advice uniquify--rename-buffer-advice universal-argument--mode unmsys--file-name url-cookie-delete url-cookie-list url-cookie-mode url-cookie-quit url-handle-content-transfer-encoding vc--add-line vc--process-sentinel vc--read-lines vc--remove-regexp vc-arch-find-admin-dir vc-bzr--sanitize-header vc-bzr-find-ignore-file vc-cvs-append-to-ignore vc-cvs-find-admin-dir vc-cvs-ignore vc-default-ignore vc-default-ignore-completion-table vc-dir-desktop-buffer-misc-data vc-dir-ignore vc-dir-restore-desktop-buffer vc-git--rev-parse vc-git-find-ignore-file vc-hg-find-file-hook vc-hg-find-ignore-file vc-hg-resolve-when-done vc-hg-unregister vc-ignore vc-mtn-find-admin-dir vc-rcs-find-admin-dir vc-read-backend vc-run-delayed vc-svn-find-admin-dir vc-svn-ignore vc-svn-ignore-completion-table verilog-at-close-struct-p verilog-at-struct-mv-p verilog-in-paren-count verilog-in-struct-nested-p verilog-sk-uvm-component verilog-sk-uvm-object verilog-string-match-fold vhdl-error-regexp-add-emacs vhdl-fix-statement-buffer vhdl-fix-statement-region vhdl-goto-line vhdl-remove-trailing-spaces-region view--disable view--enable viper--lookup-key viper--tty-ESC-filter viper-catch-tty-ESC viper-del-forward-char-in-insert viper-setup-ESC-to-escape viper-uncatch-tty-ESC visual-line-mode-set-explicitly vm-mode vm-save-message w32-add-untranslated-filesystem w32-direct-print-region-function w32-direct-print-region-helper w32-direct-ps-print-region-function w32-find-file-not-found-set-buffer-file-coding-system w32-remove-untranslated-filesystem w32-untranslated-canonical-name w32-untranslated-file-p whitespace-ensure-local-variables window--dump-frame window--dump-window window--pixel-to-total window--pixel-to-total-1 window--resize-apply-p window--sanitize-margin window--size-to-pixel window-bottom-divider-width window-combination-p window-header-line-height window-min-pixel-height window-min-pixel-width window-mode-line-height window-new-pixel window-pixel-height window-pixel-left window-pixel-top window-pixel-width window-resizable-p window-resize-apply-total window-resize-no-error window-right-divider-width window-safe-min-pixel-height window-safe-min-pixel-size window-safe-min-pixel-width window-safe-min-size window-screen-lines window-scroll-bar-width window-size window-text-pixel-size window-text-width with-current-buffer-window with-eval-after-load with-isearch-suspended woman-mark-horizontal-position x-focus-frame x-popup-dialog xesam-buffer-name xesam-dbus-call-method xesam-delete-search-engine xesam-get-cached-property xesam-get-hits xesam-get-property xesam-highlight-string xesam-kill-buffer-function xesam-minor-mode xesam-mode xesam-new-search xesam-refresh-entry xesam-refresh-search-buffer xesam-search-engines xesam-set-cached-property xesam-set-property xesam-signal-handler zlib-available-p zlib-decompress-region)) - (variables - (removed *org-babel-use-quick-and-dirty-noweb-expansion* :LaTeX :LaTeX-fragments :TeX-macros :add-text :addlevel :agenda-style :archived-trees :author-info :auto-index :beamer-frame-level :buffer-will-be-killed :choice-function :clock :convert-org-links :creator-info :customtime :docbook :drawers :effective-date :email-info :emph-multiline :expand-quoted-html :fixed-width :footnotes :for-backend :hrule :html-table-tag :ical :ignore-subtree-p :index-filename :index-function :index-style :index-title :inline-images :lang-words :latex-image-options :latex-listings :let-bind :lines :link-home :link-up :link-validation-function :macro-date :macro-input-file :macro-modification-time :macro-property :macro-time :mathjax :message-id-no-brackets :minlevel :org :org-delete :org-license-to-kill :padnewline :plain-source :prefix1 :range-end :section-number-format :short-caption :skip-before-1st-heading :special-strings :startend :style-extra :style-include-default :style-include-scripts :sub-superscript :table-auto-headline :table-of-contents :tables :tasks :tex :timestamps :todo-keywords :user-frame-params :verbatim-multiline :xml-declaration :xoxo :xslt Info-enable-edit ad-activate-on-top-level add-log-c-like-modes add-log-lisp-like-modes add-log-tex-like-modes allout-encryption-text-removal-regexps bookmark-bmenu-header-height bubbles--neighbourhood-score buffer-file-type c-awk-one-line-non-syn-ws*-re c-awk-one-line-possibly-open-regexp-re c-awk-one-line-possibly-open-string-re c-awk-regexp-one-line-possibly-open-char-list-re c-standard-font-lock-fontify-region-function cl-declare-stack cl-not-toplevel cl-optimize-safety cl-optimize-speed cl-proclaim-history cl-proclaims-deferred class-children class-class-allocation-a class-class-allocation-custom class-class-allocation-custom-group class-class-allocation-custom-label class-class-allocation-doc class-class-allocation-printer class-class-allocation-protection class-class-allocation-type class-class-allocation-values class-default-object-cache class-initarg-tuples class-num-slots class-options class-parent class-protection class-public-a class-public-custom class-public-custom-group class-public-custom-label class-public-d class-public-doc class-public-printer class-public-type class-symbol class-symbol-obarray comint-last-prompt-overlay comint-redirect-original-filter-function cperl-clobber-mode-lists css-navigation-syntax-table cua--explicit-region-start cua--last-region-shifted custom-declare-variable-list cvs-postprocess debug-function-list delphi-begin-enclosing-tokens delphi-begin-previous-tokens delphi-binary-ops delphi-block-statements delphi-body-expr-statements delphi-body-statements delphi-class-types delphi-comment-face delphi-comments delphi-composite-types delphi-debug delphi-debug-buffer delphi-debug-mode-map delphi-decl-delimiters delphi-decl-matchers delphi-decl-sections delphi-directives delphi-enclosing-statements delphi-end-block-statements delphi-expr-delimiters delphi-expr-statements delphi-font-lock-defaults delphi-fontifying-progress-step delphi-ignore-changes delphi-interface-types delphi-keyword-face delphi-keywords delphi-leading-spaces-re delphi-match-block-statements delphi-mid-block-statements delphi-mode-abbrev-table delphi-mode-map delphi-mode-syntax-table delphi-newline-always-indents delphi-non-space-chars delphi-other-face delphi-parsing-progress-step delphi-previous-enclosing-statements delphi-previous-statements delphi-previous-terminators delphi-progress-last-reported-point delphi-routine-statements delphi-scanning-progress-step delphi-space-chars delphi-spaces-re delphi-string-face delphi-strings delphi-unit-sections delphi-unit-statements delphi-use-clauses delphi-visibilities delphi-whitespace delphi-word-chars dired-isearch-filter-predicate-orig doc-view-buffer-file-name doc-view-current-cache-dir doc-view-current-converter-processes doc-view-current-files doc-view-current-search-matches doc-view-current-timer doc-view-pending-cache-flush doc-view-previous-major-mode edebug-gensym-index ediff-shadow-overlay-priority elp-all-instrumented-list epg-key-capablity-alist ert--gensym-counter eshell-isearch-cancel-map eshell-ls-orig-insert-directory find-gc-noreturn-list find-gc-source-files find-gc-subrs-called find-gc-subrs-callers find-gc-unsafe-list fit-frame-to-buffer-bottom-margin gdb-handler-alist gdb-handler-number gdb-pending-triggers gdbmi-record-list gud-tooltip-original-filter hi-lock-string-serialize-hash hi-lock-string-serialize-serial html-table-tag hz-ascii-designnation hz-gb-designnation icomplete-post-command-hook icomplete-pre-command-hook icomplete-show-key-bindings image-animated-types inferior-octave-complete-impossible inferior-octave-has-built-in-variables inferior-octave-mode-abbrev-table inhibit-local-menu-bar-menus js-auto-indent-flag ly-OSX-ly-path ly-OSX-midi-path ly-OSX-pdf-path ly-arrange-mode ly-compile-post-tangle ly-display-pdf-post-tangle ly-gen-html ly-gen-pdf ly-gen-png ly-gen-svg ly-nix-ly-path ly-nix-midi-path ly-nix-pdf-path ly-play-midi-post-tangle ly-use-eps ly-w32-ly-path ly-w32-midi-path ly-w32-pdf-path man-mode-syntax-table net-utils-remove-ctl-m nnir-address nnir-current-group-marked nnir-current-query nnir-current-server nnir-extra-parms nxml-last-fontify-end object-class object-name octave-completion-alist octave-maintainer-address octave-mode-abbrev-table octave-text-functions octave-variables org-additional-option-like-keywords org-additional-option-like-keywords-for-flyspell org-after-save-iCalendar-file-hook org-agenda-cat-filter-overlays org-agenda-filtered-by-top-category org-agenda-marker-table org-agenda-tag-filter-overlays org-agenda-tag-filter-while-redo org-agenda-top-category-filter org-ascii-current-indentation org-babel-org-babel-call-process-region-original org-babel-scheme-cmd org-babel-scheme-eoe org-beamer-column-open org-beamer-columns-open org-beamer-export-is-beamer-p org-beamer-fragile-re org-beamer-frame-level-now org-beamer-header-extra org-beamer-inherited-properties org-beamer-inside-frame-at-level org-beamer-themes org-beamer-transitions org-beamer-use-parts org-before-save-iCalendar-file-hook org-clock-heading-for-remember org-combined-agenda-icalendar-file org-current-export-dir org-current-export-file org-docbook-para-open org-export-allow-BIND org-export-allow-BIND-local org-export-ascii-bullets org-export-ascii-entities org-export-ascii-final-hook org-export-ascii-links-to-notes org-export-ascii-table-keep-all-vertical-lines org-export-ascii-table-widen-columns org-export-ascii-underline org-export-author-info org-export-blocks org-export-blocks-postblock-hook org-export-blocks-witheld org-export-code-refs org-export-creator-info org-export-define-heading-targets-headline-hook org-export-docbook-article-header org-export-docbook-coding-system org-export-docbook-default-image-attributes org-export-docbook-doctype org-export-docbook-emphasis-alist org-export-docbook-extension org-export-docbook-final-hook org-export-docbook-footnote-id-prefix org-export-docbook-footnote-separator org-export-docbook-header org-export-docbook-inline-image-extensions org-export-docbook-inline-images org-export-docbook-keywords-markup org-export-docbook-link-org-files-as-docbook org-export-docbook-section-id-prefix org-export-docbook-timestamp-markup org-export-docbook-xsl-fo-proc-command org-export-docbook-xslt-proc-command org-export-docbook-xslt-stylesheet org-export-email-info org-export-first-hook org-export-footnotes-data org-export-footnotes-seen org-export-format-drawer-function org-export-have-math org-export-highlight-first-table-line org-export-html-after-blockquotes-hook org-export-html-coding-system org-export-html-content-div org-export-html-date-format-string org-export-html-divs org-export-html-expand org-export-html-extension org-export-html-final-hook org-export-html-footnote-format org-export-html-footnote-separator org-export-html-footnotes-section org-export-html-headline-anchor-format org-export-html-home/up-format org-export-html-html-helper-timestamp org-export-html-inline-image-extensions org-export-html-inline-images org-export-html-link-home org-export-html-link-org-files-as-html org-export-html-link-up org-export-html-mathjax-options org-export-html-mathjax-template org-export-html-postamble org-export-html-postamble-format org-export-html-preamble org-export-html-preamble-format org-export-html-protect-char-alist org-export-html-scripts org-export-html-special-string-regexps org-export-html-style org-export-html-style-default org-export-html-style-extra org-export-html-style-include-default org-export-html-style-include-scripts org-export-html-table-align-individual-fields org-export-html-table-tag org-export-html-table-use-header-tags-for-first-column org-export-html-tag-class-prefix org-export-html-todo-kwd-class-prefix org-export-html-toplevel-hlevel org-export-html-use-infojs org-export-html-validation-link org-export-html-with-timestamp org-export-html-xml-declaration org-export-htmlize-css-font-prefix org-export-htmlize-output-type org-export-id-target-alist org-export-inbuffer-options-extra org-export-interblocks org-export-kill-product-buffer-when-displayed org-export-language-setup org-export-last-code-line-counter-value org-export-latex-add-level org-export-latex-after-blockquotes-hook org-export-latex-after-initial-vars-hook org-export-latex-after-save-hook org-export-latex-all-targets-re org-export-latex-append-header org-export-latex-class org-export-latex-class-options org-export-latex-classes org-export-latex-coding-system org-export-latex-complex-heading-re org-export-latex-custom-lang-environments org-export-latex-date-format org-export-latex-default-class org-export-latex-default-packages-alist org-export-latex-display-custom-times org-export-latex-done-keywords org-export-latex-emphasis-alist org-export-latex-final-hook org-export-latex-footmark-seen org-export-latex-footnote-separator org-export-latex-format-toc-function org-export-latex-header org-export-latex-header-defs org-export-latex-href-format org-export-latex-hyperref-format org-export-latex-hyperref-options-format org-export-latex-image-default-option org-export-latex-import-inbuffer-stuff org-export-latex-inline-image-extensions org-export-latex-inputenc-alist org-export-latex-link-with-unknown-path-format org-export-latex-list-parameters org-export-latex-listings org-export-latex-listings-langs org-export-latex-listings-options org-export-latex-listings-w-names org-export-latex-low-levels org-export-latex-minted-langs org-export-latex-minted-options org-export-latex-not-done-keywords org-export-latex-options-plist org-export-latex-packages-alist org-export-latex-quotes org-export-latex-remove-from-headlines org-export-latex-sectioning org-export-latex-sectioning-depth org-export-latex-special-keyword-regexp org-export-latex-table-caption-above org-export-latex-tables-centered org-export-latex-tables-column-borders org-export-latex-tables-hline org-export-latex-tables-tend org-export-latex-tables-tstart org-export-latex-tables-verbatim org-export-latex-tabular-environment org-export-latex-tag-markup org-export-latex-timestamp-inactive-markup org-export-latex-timestamp-keyword-markup org-export-latex-timestamp-markup org-export-latex-title-command org-export-latex-todo-keyword-markup org-export-latex-todo-keywords-1 org-export-latex-verbatim-wrap org-export-mark-todo-in-toc org-export-odt-bookmark-prefix org-export-odt-category-strings org-export-odt-content-template-file org-export-odt-convert-capabilities org-export-odt-convert-process org-export-odt-convert-processes org-export-odt-create-custom-styles-for-srcblocks org-export-odt-default-image-sizes-alist org-export-odt-default-org-styles-alist org-export-odt-embed-images org-export-odt-fontify-srcblocks org-export-odt-image-size-probe-method org-export-odt-inline-image-extensions org-export-odt-inline-images org-export-odt-max-image-size org-export-odt-org-styles-alist org-export-odt-pixels-per-inch org-export-odt-preferred-output-format org-export-odt-prettify-xml org-export-odt-schema-dir org-export-odt-special-string-regexps org-export-odt-styles-file org-export-odt-table-styles org-export-odt-tmpdir-prefix org-export-opt-plist org-export-options-filters org-export-page-description org-export-page-keywords org-export-pdf-logfiles org-export-pdf-remove-logfiles org-export-plist-vars org-export-prefer-native-exporter-for-tables org-export-preferred-target-alist org-export-preprocess-after-blockquote-hook org-export-preprocess-after-headline-targets-hook org-export-preprocess-after-include-files-hook org-export-preprocess-after-radio-targets-hook org-export-preprocess-after-tree-selection-hook org-export-preprocess-before-backend-specifics-hook org-export-preprocess-before-normalizing-links-hook org-export-preprocess-before-selecting-backend-code-hook org-export-preprocess-final-hook org-export-preprocess-hook org-export-publishing-directory org-export-remove-timestamps-from-toc org-export-run-in-background org-export-section-number-format org-export-skip-text-before-1st-heading org-export-table-data-tags org-export-table-header-tags org-export-table-remove-empty-lines org-export-table-remove-special-lines org-export-table-row-tags org-export-target-aliases org-export-taskjuggler-default-global-properties org-export-taskjuggler-default-project-duration org-export-taskjuggler-default-project-version org-export-taskjuggler-default-reports org-export-taskjuggler-extension org-export-taskjuggler-final-hook org-export-taskjuggler-project-tag org-export-taskjuggler-resource-tag org-export-taskjuggler-target-version org-export-with-LaTeX-fragments org-export-with-TeX-macros org-export-xoxo-final-hook org-footnote-insert-pos-for-preprocessor org-format-latex-header-extra org-freemind-bol-helper-base-indent org-freemind-node-css-style org-freemind-node-pattern org-freemind-node-style org-freemind-node-styles org-freemind-org-nfix org-highlight-latex-fragments-and-specials org-html-cvt-link-fn org-icalendar-honor-noexport-tag org-icalendar-use-UTC-date-time org-icalendar-use-plain-timestamp org-icalendar-verify-function org-infojs-options org-infojs-opts-table org-infojs-template org-inlinetask-export org-inlinetask-export-templates org-jump-to-target-location org-last-level org-latex-and-specials-regexp org-latex-entities org-latex-entities-regexp org-latex-to-pdf-process org-level-max org-levels-open org-lparse-backend org-lparse-body-only org-lparse-char-styles org-lparse-collect-buffer org-lparse-collect-count org-lparse-debug org-lparse-dyn-current-environment org-lparse-encode-pending org-lparse-insert-tag-with-newlines org-lparse-link-description-is-image org-lparse-list-table-p org-lparse-native-backends org-lparse-other-backend org-lparse-output-buffer org-lparse-par-open org-lparse-special-blocks org-lparse-to-buffer org-lparse-use-flashy-warning org-mac-mail-account org-mew-link-to-refile-destination org-min-level org-odt-entity-control-callbacks-alist org-odt-entity-counts-plist org-odt-entity-format-callbacks-alist org-odt-entity-frame-styles org-odt-entity-labels-alist org-odt-suppress-xref org-odt-table-indentedp org-odt-table-style org-odt-table-style-spec org-par-open org-publish-after-export-hook org-publish-before-export-hook org-publish-initial-buffer org-remember-auto-remove-backup-files org-remember-backup-directory org-remember-before-finalize-hook org-remember-clock-out-on-exit org-remember-default-headline org-remember-delete-empty-lines-at-end org-remember-help org-remember-interactive-interface org-remember-last-stored-marker org-remember-mode org-remember-mode-hook org-remember-mode-map org-remember-previous-location org-remember-reference-date org-remember-store-without-prompt org-remember-templates org-remember-warn-about-backups org-section-numbers org-select-template-original-buffer org-select-template-temp-major-mode org-special-blocks-ignore-regexp org-src-block-paragraph-format org-table-colgroup-info org-wl-disable-folder-check org-wl-folder-types org-wl-link-remove-filter org-wl-link-to-refile-destination org-wl-namazu-default-index org-wl-nntp-prefer-web-links org-wl-shimbun-prefer-web-links original-insert-directory package-el-version package-obsolete-alist package-subdirectory-regexp prolog-align-comments-flag prolog-electric-newline-flag prolog-electric-tab-flag prolog-indent-mline-comments-flag prolog-lower-case-string prolog-object-end-to-0-flag prolog-tokenize-searchkey prolog-upper-case-string prolog-use-prolog-tokenizer-flag prolog-use-smie ps-lp-system ps-windows-system python-indent-dedenters report-emacs-bug-bug-alist report-emacs-bug-choice-widget report-emacs-bug-tracker-url ruby-keyword-end-re saved-overriding-map set-mark-default-inactive show-paren-idle-timer show-paren-overlay show-paren-overlay-1 sieve-manage-stream-alist sieve-manage-streams sql-output-by-send thing-at-point-url-regexp tramp-completion-file-name-regexp-url tramp-file-name-regexp-url tramp-message-show-progress-reporter-message universal-argument-num-events vc-diff-knows-L verilog-mode-release-date vhdl-speedbar-key-map whitespace-font-lock whitespace-font-lock-mode xmltok-dependent-regions) - (added *org-babel-gnuplot-missing* *org-babel-gnuplot-terms* 5x5-mode-abbrev-table 5x5-mode-syntax-table :ALT_TITLE :APPENDIX :APPT_WARNTIME :BEAMER_ACT :BEAMER_COL :BEAMER_ENV :BEAMER_OPT :BEAMER_REF :CATEGORY :COPYING :CUSTOM_ID :DESCRIPTION :HTML_CONTAINER :HTML_CONTAINER_CLASS :ICALENDAR-MARK :ID :INDEX :LOCATION :ORDERED :SUMMARY :after-until :after-while :align :alt-title :always :animate-buffer :app :application :archive :around :ascii-charset :ascii-table-cell-width-cache :attr_ascii :attr_beamer :attr_html :attr_latex :attr_man :attr_odt :attr_texinfo :beamer-color-theme :beamer-font-theme :beamer-inner-theme :beamer-outer-theme :beamer-theme :before-until :before-while :blocks :booktabs :boxtype :cellpadding :cellspacing :checked :cleanup-frames :close-all :cols :colspan :columns :comment-include :company-doc-buffer :company-docsig :company-location :complete :created :creator :database :day-end :day-start :days :dbhost :dbpassword :dbuser :deadline* :disable-caption :disabled :display :distant-foreground :divider :dom :duration :effort-durations :end2 :environment :epilogue :eps :eww-form :expand :export-block :export-options :exported-data :extras :filetags :filter-args :filter-babel-call :filter-bold :filter-center-block :filter-clock :filter-code :filter-comment :filter-comment-block :filter-diary-sexp :filter-drawer :filter-dynamic-block :filter-entity :filter-example-block :filter-export-block :filter-export-snippet :filter-final-output :filter-fixed-width :filter-footnote-definition :filter-footnote-reference :filter-headline :filter-horizontal-rule :filter-inline-babel-call :filter-inline-src-block :filter-inlinetask :filter-italic :filter-item :filter-keyword :filter-latex-environment :filter-latex-fragment :filter-line-break :filter-link :filter-node-property :filter-options :filter-paragraph :filter-parse-tree :filter-plain-list :filter-plain-text :filter-planning :filter-property-drawer :filter-quote-block :filter-quote-section :filter-radio-target :filter-return :filter-section :filter-special-block :filter-src-block :filter-statistics-cookie :filter-strike-through :filter-subscript :filter-superscript :filter-table :filter-table-cell :filter-table-row :filter-target :filter-timestamp :filter-underline :filter-verbatim :filter-verse-block :filters :filters-alist :finished :finishing :float :footnote-definition-alist :force-display :force-onscreen :frame :grouptags :header-columns :headline-label :headline-numbering :headline-offset :hour-end :hour-start :hours :html-container :html-doctype :html-head :html-head-extra :html-head-include-default-style :html-head-include-scripts :html-html5-fancy :html-htmlized-css-url :html-inline-images :html-link-home :html-link-org-as-html :html-link-up :html-link-use-abs-url :html-mathjax :html-table-attributes :html-table-row-tags :html-xml-declaration :icalendar-agenda-view :id-alist :ignored :indic :inhibit-iso-escape-detection :inhibit-null-byte-detection :input-buffer :input-file :jump-to-captured :last-capture :last-capture-marker :last-refile :latex-header :latex-hyperref-p :leave :length :long-cells :man-class :man-class-options :man-header-extra :math-arguments :math-prefix :math-suffix :max-height :max-width :menu :menu-entry :minute-end :minute-start :minutes :month-end :month-start :months :mstart :never :nogreeting :numbering :opened :opening :opt-participants :options-alist :organizer :output-file :overlay :padlines :parse-tree :participation-type :pending :pending-trigger :placement :post :post-affiliated :prefer-utf-8 :prologue :query :recur :rejected :rel :repeater-type :repeater-unit :repeater-value :replaces :req-participants :reqs :require-days :require-hours :require-minutes :require-months :require-weeks :require-years :resolve-fuzzy-link-cache :restore :reuse-frames :reused :rmlines :rowspan :rsvp :rules :scheduled* :search-option :section-id :section-number :ses-named :signed :skipped :spread :start2 :states :subauthor :subtitle :table-cell-alignment-cache :table-cell-width-cache :table-header-cache :table-row-group-cache :table-type :tangle-mode :texinfo :texinfo-class :texinfo-dircat :texinfo-dirdesc :texinfo-dirtitle :texinfo-entries-cache :texinfo-filename :texinfo-header :texinfo-node-cache :texinfo-post-header :texinfo-printed-title :textarea :textbox :thickness :tikz :title-line :token-number :transcoders :translate-alist :uid :uri :use-both :verbatim :warning-type :warning-unit :warning-value :weeks :with-archived-trees :with-author :with-clocks :with-creator :with-date :with-drawers :with-email :with-emphasize :with-entities :with-fixed-width :with-footnotes :with-inlinetasks :with-latex :with-planning :with-priority :with-smart-quotes :with-special-strings :with-statistics-cookies :with-sub-superscript :with-tables :with-tags :with-tasks :with-timestamps :with-toc :with-todo-keywords :with-vtodo :wstart :xesam:mimeType :xesam:name :xesam:size :xesam:snippet :xesam:sourceModified :xesam:subject :xesam:summary :xesam:title :xesam:url :xlink:href :year-end :year-start :years Buffer-menu-mode-hook Edit-options-mode-abbrev-table Edit-options-mode-hook Edit-options-mode-syntax-table Info-edit-mode-abbrev-table Info-edit-mode-map Info-edit-mode-syntax-table Info-file-completions Man-man-k-use-anchor Man-mode-abbrev-table Man-mode-syntax-table abbrev-expand-function abbrev-mode-hook advice--buffer-local-function-sample advice--bytecodes advice--where-alist allout-widgets-mode-hook archive-7z-program array-mode-abbrev-table array-mode-hook array-mode-syntax-table artist-mode-hook asm-mode-hook authors-lax-changelogs authors-no-scan-regexps auto-composition-mode-hook auto-compression-mode-hook auto-encryption-mode-hook auto-fill-mode-hook auto-image-file-mode-hook auto-insert-mode-hook auto-lower-mode-hook auto-raise-mode-hook auto-revert-notify-exclude-dir-regexp auto-revert-notify-modified-p auto-revert-notify-watch-descriptor auto-revert-notify-watch-descriptor-hash-list auto-revert-remote-files auto-revert-tail-mode-hook auto-revert-use-notify auto-save-mode-hook autoarg-kp-mode-hook autoarg-mode-hook autoload-builtin-package-versions bat--syntax-propertize bat-font-lock-keywords bat-menu bat-mode-abbrev-table bat-mode-hook bat-mode-map bat-mode-syntax-table bib-mode-hook bibtex-style-mode-hook binary-overwrite-mode-hook blackbox-mode-abbrev-table blackbox-mode-hook blackbox-mode-syntax-table blink-cursor-blinks blink-cursor-blinks-done blink-cursor-mode-hook blink-matching--overlay bookmark-bmenu-inline-header-height bookmark-bmenu-mode-hook bookmark-bmenu-use-header-line bookmark-edit-annotation-mode-abbrev-table bookmark-edit-annotation-mode-hook bookmark-edit-annotation-mode-syntax-table bs-mode-hook bubbles--neighborhood-score buffer-face-mode-hook buffer-menu-mode-hook bug-reference-mode-hook bug-reference-prog-mode-hook byte-compile--use-old-handlers byte-compile-force-lexical-warnings byte-compile-level byte-compile-lexical-variables byte-pophandler byte-pushcatch byte-pushconditioncase c-awk-harmless-line-char-re c-awk-harmless-line-string*-re c-awk-kwd-regexp-sign-re c-awk-non-/-syn-ws*-re c-awk-possibly-open-string-re c-awk-pre-exp-alphanum-kwd-re c-awk-space*-/-re c-awk-space*-regexp-/-re c-awk-space*-unclosed-regexp-/-re c-block-stmt-1-2-key c-decl-start-colon-kwd-re c-postfix-decl-spec-key cache-long-scans calc-allow-units-as-numbers calc-context-sensitive-enter calc-gregorian-switch calc-keypad-mode-hook calc-trail-mode-abbrev-table calc-trail-mode-map calc-trail-mode-syntax-table calendar-day-header-array called-interactively-p-functions capitalized-words-mode-hook cc-bytecomp-noruntime-functions cc-imenu-java-comment-regexp cc-imenu-java-ellipsis-regexp cc-imenu-java-method-arg-regexp cc-imenu-java-type-spec-regexp cfengine-cf-promises cfengine-mode-syntax-cache cfengine-mode-syntax-functions-regex cfengine-parameters-indent cfengine2-mode-hook cfengine3--prettify-symbols-alist cfengine3-fallback-syntax cfengine3-mode-hook chart-mode-hook checkdoc-minor-mode-hook checkdoc-output-mode-hook cl--declare-stack cl--not-toplevel cl--optimize-safety cl--optimize-speed cl--proclaim-history cl--proclaims-deferred cl--tagbody-alist cl-struct-ert-test-skipped-tags cl-struct-frameset-tags cl-struct-gdb-handler-tags cl-struct-org-export-backend-tags cl-struct-package--ac-desc-tags cl-struct-package--bi-desc-tags cl-struct-package-desc-tags cl-struct-rng--ipattern-tags column-number-mode-hook comint-last-prompt comint-redirect-previous-input-string command-history-mode-abbrev-table command-history-mode-hook command-history-mode-map command-history-mode-syntax-table compilation-minor-mode-hook compilation-shell-minor-mode-hook completion-in-region-function completion-in-region-mode-hook completion-list-mode-hook conf-colon-mode-hook conf-javaprop-mode-hook conf-ppd-mode-hook conf-space-mode-hook conf-unix-mode-hook conf-windows-mode-hook conf-xdefaults-mode-hook cookie-file cpp-edit-mode-hook css-mode-hook css-smie-grammar cua-mode-hook cua-rectangle-mark-mode cua-rectangle-mark-mode-hook custom-new-theme-mode-hook custom-theme-choose-mode-hook cvs-minor-mode-hook cwarn-mode-hook cwarn-mode-set-explicitly cycle-spacing--context data-debug-mode-abbrev-table data-debug-mode-map dbus-interface-local dbus-path-local debugger-mode-abbrev-table debugger-mode-syntax-table delete-selection-mode-hook delphi-mode-hook desktop--app-id desktop-auto-save-timeout desktop-auto-save-timer desktop-file-checksum desktop-restore-forces-onscreen desktop-restore-frames desktop-restore-in-current-display desktop-restore-reuses-frames desktop-save-mode-hook desktop-saved-frameset diary-fancy-display-mode-hook diary-from-outlook-function diary-goto-entry-function diary-mode-hook diff-auto-refine-mode-hook diff-minor-mode-hook diff-use-labels dig-mode-hook dired-hide-details-hide-information-lines dired-hide-details-hide-symlink-targets dired-hide-details-mode dired-hide-details-mode-hook dired-initial-position-hook dired-isearch-filenames-mode dired-isearch-filenames-mode-hook dired-omit-mode-hook dirtrack-debug-mode-hook dirtrack-mode-hook disable-ascii-optimization display-battery-mode-hook display-time-mode-hook display-time-world-mode-hook dns-mode-hook doc-view--buffer-file-name doc-view--current-cache-dir doc-view--current-converter-processes doc-view--current-files doc-view--current-search-matches doc-view--current-timer doc-view--image-file-pattern doc-view--image-type doc-view--pending-cache-flush doc-view--previous-major-mode doc-view-minor-mode-hook doc-view-odf->pdf-converter-function doc-view-odf->pdf-converter-program doc-view-pdf->png-converter-function doc-view-pdfdraw-program doc-view-scale-internally doc-view-single-page-converter-function doctex-mode-hook doctor-mode-hook double-mode-hook dynamic-completion-mode-hook ede-cpp-root-project ede-minor-mode-hook edebug--mode-saved-vars edebug-eval-mode-hook edebug-mode edebug-mode-hook edit-abbrevs-mode-abbrev-table edit-abbrevs-mode-hook edit-abbrevs-mode-map edit-abbrevs-mode-syntax-table eieio--class-num-slots eieio--object-num-slots eieio--scoped-class-stack eieio-custom-mode-hook eldoc-message-function eldoc-mode-hook eldoc-mode-line-string eldoc-print-after-edit electric-indent-functions-without-reindent electric-indent-inhibit electric-indent-local-mode-hook electric-indent-mode-hook electric-layout-mode-hook electric-pair-delete-adjacent-pairs electric-pair-inhibit-predicate electric-pair-mode-hook electric-pair-mode-map electric-pair-open-newline-between-pairs electric-pair-preserve-balance electric-pair-skip-whitespace electric-pair-skip-whitespace-chars electric-pair-string-bound-function electric-pair-text-pairs electric-pair-text-syntax-table elp--advice-name emacs-lisp-byte-code-mode-hook emacs-repository-version enable-dir-local-variables env--substitute-vars-regexp epa-global-mail-mode-hook epa-info-mode-abbrev-table epa-info-mode-hook epa-info-mode-syntax-table epa-key-list-mode-abbrev-table epa-key-list-mode-hook epa-key-list-mode-syntax-table epa-key-mode-abbrev-table epa-key-mode-hook epa-key-mode-syntax-table epa-mail-aliases epg-agent-file epg-agent-mtime epg-key-capability-alist erc-accidental-paste-threshold-seconds erc-autoaway-mode-hook erc-autojoin-mode-hook erc-button-mode-hook erc-capab-identify-mode-hook erc-dcc-mode-hook erc-fill-mode-hook erc-hecomplete-mode-hook erc-identd-mode-hook erc-irccontrols-mode-hook erc-keep-place-mode-hook erc-last-input-time erc-list-menu-mode-hook erc-list-mode-hook erc-log-mode-hook erc-match-mode-hook erc-menu erc-menu-mode-hook erc-message-english-netjoin erc-message-english-netjoin-done erc-message-english-netsplit erc-message-english-netsplit-none erc-message-english-netsplit-wholeft erc-move-to-prompt-mode-hook erc-netsplit-mode-hook erc-networks-mode-hook erc-noncommands-mode-hook erc-notifications-mode-hook erc-notify-mode-hook erc-page-mode-hook erc-pcomplete-mode-hook erc-readonly-mode-hook erc-replace-mode-hook erc-ring-mode-hook erc-scrolltobottom-mode-hook erc-services-mode-hook erc-smiley-mode-hook erc-sound-mode-hook erc-spelling-mode-hook erc-stamp-mode-hook erc-track-minor-mode-hook erc-track-mode-hook erc-truncate-mode-hook erc-unmorse-mode-hook erc-xdcc-mode-hook ert-results-mode-hook ert-simple-view-mode-hook eshell--local-vars eshell-post-rewrite-command-function eshell-visual-options eshell-visual-subcommands eudc-bbdb-attributes-translation-alist eudc-bbdb-current-query eudc-bbdb-current-return-attributes eudc-hotlist-mode-abbrev-table eudc-hotlist-mode-hook eudc-hotlist-mode-syntax-table eudc-mode-abbrev-table eudc-mode-syntax-table eval-expression-minibuffer-setup-hook eww-bookmark-kill-ring eww-bookmark-mode-abbrev-table eww-bookmark-mode-hook eww-bookmark-mode-map eww-bookmark-mode-syntax-table eww-bookmarks eww-checkbox-map eww-contents-url eww-current-dom eww-current-source eww-current-title eww-current-url eww-download-directory eww-form eww-form-checkbox-selected-symbol eww-form-checkbox-symbol eww-header-line-format eww-history eww-history-mode-abbrev-table eww-history-mode-hook eww-history-mode-map eww-history-mode-syntax-table eww-history-position eww-home-url eww-link-keymap eww-local-regex eww-mode-abbrev-table eww-mode-hook eww-mode-map eww-mode-syntax-table eww-next-url eww-previous-url eww-search-prefix eww-select-map eww-start-url eww-submit-map eww-text-input-types eww-text-map eww-textarea-map eww-tool-bar-map eww-up-url eww-use-external-browser-for-content-type f90-end-block-optional-name f90-smart-end-names ffap-c++-path file-name-shadow-mode-hook file-notify--library file-notify--pending-events file-notify-descriptors filter-buffer-substring-function finder--builtins-descriptions finder-mode-hook fit-frame-to-buffer-margins fit-frame-to-buffer-sizes fit-window-to-buffer-horizontally flymake-mode-hook flymake-warning-predicate flymake-xml-program flyspell-mode-hook focus-in-hook focus-out-hook font-lock-mode-hook font-lock-mode-set-explicitly frame-resize-pixelwise frameset-filter-alist frameset-persistent-filter-alist frameset-session-filter-alist ftp-mode-hook gametree-mode-hook gdb--string-regexp gdb-breakpoints-mode-hook gdb-disassembly-mode-hook gdb-discard-unordered-replies gdb-enable-debug-hook gdb-frames-mode-hook gdb-handler-list gdb-inferior-io-mode-hook gdb-locals-mode-hook gdb-many-windows-hook gdb-memory-mode-hook gdb-registers-mode-hook gdb-script-mode-hook gdb-speedbar-auto-raise-hook gdb-threads-mode-hook gdbmi-bnf-offset gdbmi-bnf-result-state-configs gdbmi-bnf-state gdbmi-debug-mode glasses-mode-hook global-auto-composition-mode-hook global-cwarn-mode-hook global-ede-mode-hook global-font-lock-mode-hook global-hi-lock-mode-hook global-highlight-changes-mode-hook global-hl-line-mode-hook global-hl-line-overlays global-linum-mode-hook global-prettify-symbols-mode global-prettify-symbols-mode-buffers global-prettify-symbols-mode-hook global-reveal-mode-hook global-semantic-highlight-edits-mode-hook global-semantic-highlight-func-mode-hook global-semantic-show-parser-state-mode-hook global-semantic-show-unmatched-syntax-mode-hook global-semantic-stickyfunc-mode-hook global-subword-mode-hook global-superword-mode global-superword-mode-buffers global-superword-mode-hook global-visual-line-mode-hook global-whitespace-mode-hook global-whitespace-newline-mode-hook gnus-article-mode-abbrev-table gnus-backend-trace-elapsed gnus-before-resume-hook gnus-bookmark-bmenu-mode-abbrev-table gnus-bookmark-bmenu-mode-hook gnus-bookmark-bmenu-mode-syntax-table gnus-browse-mode-abbrev-table gnus-browse-mode-syntax-table gnus-category-mode-abbrev-table gnus-category-mode-syntax-table gnus-custom-mode-abbrev-table gnus-custom-mode-hook gnus-custom-mode-map gnus-custom-mode-syntax-table gnus-dead-summary-mode-hook gnus-dired-mode-hook gnus-draft-mode-hook gnus-edit-form-mode-abbrev-table gnus-edit-form-mode-syntax-table gnus-group-mode-abbrev-table gnus-group-mode-syntax-table gnus-icalendar-additional-identities gnus-icalendar-event gnus-icalendar-event-cancel gnus-icalendar-event-reply gnus-icalendar-event-request gnus-icalendar-handle gnus-icalendar-org-capture-file gnus-icalendar-org-capture-headline gnus-icalendar-org-enabled-p gnus-icalendar-org-template-key gnus-icalendar-org-template-name gnus-icalendar-reply-bufname gnus-icalendar-reply-status gnus-kill-file-mode-abbrev-table gnus-kill-file-mode-syntax-table gnus-mailing-list-mode-hook gnus-message-citation-mode-hook gnus-newsgroup-unexist gnus-other-frame-resume-function gnus-score-mode-abbrev-table gnus-score-mode-syntax-table gnus-smiley-file-types gnus-sticky-article-mode-hook gnus-subthread-sort-functions gnus-sync-file-encrypt-to gnus-tree-mode-abbrev-table gnus-tree-mode-syntax-table gnutls-verify-error gomoku--intangible-chars gomoku--last-pos goto-address-mode-hook goto-address-prog-mode-hook gpm-mouse-mode-hook grep-mode-hook gud-mode-hook gud-tooltip-mode-hook hack-dir-local-variables--warned-coding hack-local-variable-regexp hack-local-variables--warned-lexical hashcash-program help-fns-describe-function-functions hi-lock--hashcons-hash hi-lock--unused-faces hi-lock-auto-select-face hi-lock-mode-hook hi-lock-mode-set-explicitly hide-ifdef-mode-hook hif-string-literal-regexp highlight-changes-mode-hook highlight-changes-mode-set-explicitly highlight-changes-visible-mode-hook hl-line-mode-hook html-autoview-mode-hook hz-ascii-designation hz-gb-designation ibuffer-auto-mode-hook ibuffer-mode-abbrev-table ibuffer-mode-syntax-table icomplete--in-region-buffer icomplete-hide-common-prefix icomplete-in-buffer icomplete-minibuffer-map icomplete-mode-hook icomplete-separator icomplete-show-matches-on-no-input icon-mode-hook idlwave-help-mode-hook idlwave-shell-electric-debug-mode-hook ido-everywhere-hook ielm-menu iimage-mode-hook image-default-frame-delay image-dired-display-image-mode-hook image-dired-thumbnail-mode-hook image-format-suffixes image-minimum-frame-delay image-minor-mode-hook image-mode-menu image-multi-frame imenu-generic-skip-comments-and-strings indent-rigidly-map inferior-lisp-menu inferior-octave-compilation-font-lock-keywords inferior-octave-directory-tracker-resync inferior-octave-error-regexp-alist inferior-octave-last-column-width inferior-octave-minimal-columns inferior-octave-prompt-read-only inferior-tcl-mode-hook info-xref-case-fold info-xref-node-re info-xref-note-re inhibit-local-variables-ignore-case internal--call-interactively internal-ange-ftp-mode-hook isearch--display-help-action isearch--saved-overriding-local-map isearch-allow-prefix isearch-invisible isearch-pre-scroll-point iso-ascii-mode-hook ispell-hunspell-dict-paths-alist ispell-hunspell-dictionary-alist ispell-hunspell-dictionary-equivs-alist ispell-minor-mode-hook iswitchb-mode-hook javascript-generic-mode-hook jit-lock--debug-fontifying jit-lock-debug-mode jit-lock-debug-mode-hook js--declaration-keyword-re js--filling-paragraph js-mode-hook js-switch-indent-offset json--encoding-current-indentation json-encoding-default-indentation json-encoding-lisp-style-closings json-encoding-pretty-print json-encoding-separator landmark-mode-abbrev-table landmark-mode-syntax-table latex-electric-env-pair-mode-hook latex-mode-hook ld-script-mode-hook life-mode-abbrev-table life-mode-hook life-mode-map life-mode-syntax-table line-number-mode-hook linum-mode-hook linum-mode-set-explicitly lisp--local-variables-completion-table lisp--prettify-symbols-alist lisp-cl-font-lock-keywords lisp-cl-font-lock-keywords-1 lisp-cl-font-lock-keywords-2 lisp-el-font-lock-keywords lisp-el-font-lock-keywords-1 lisp-el-font-lock-keywords-2 list-colors-callback list-matching-lines-prefix-face load-path-shadows-mode-hook load-prefer-newer locate-mode-abbrev-table locate-mode-syntax-table log-edit-setup-add-author longlines-mode-hook ls-lisp-filesize-b-fmt m2-mode-hook mail-abbrevs-mode-hook mairix-searches-mode-abbrev-table mairix-searches-mode-font-lock-keywords mairix-searches-mode-hook makefile-automake-mode-hook makefile-bsdmake-mode-hook makefile-gmake-mode-hook makefile-imake-mode-hook makefile-makepp-mode-hook man-imenu-title master-mode-hook menu-bar-mode-hook mercury-mode-hook messages-buffer-mode-abbrev-table messages-buffer-mode-hook messages-buffer-mode-map messages-buffer-mode-syntax-table mh-addr-syntax-table mh-blacklist mh-blacklist-msg-hook mh-fcc-syntax-table mh-note-blacklisted mh-note-whitelisted mh-regexp-in-field-syntax-table mh-scan-blacklisted-msg-regexp mh-scan-whitelisted-msg-regexp mh-showing-mode-hook mh-whitelist mh-whitelist-msg-hook mh-whitelist-preserves-sequences-flag minibuffer-depth-indicate-mode-hook minibuffer-electric-default-mode-hook minibuffer-inactive-mode-hook mixal-mode-hook mm-temp-files-cache-file mm-temp-files-to-be-deleted mml-mode-hook mml-smime-encrypt-to-self mml-smime-sign-with-sender mml2015-maximum-key-image-dimension mouse-2center mouse-2left mouse-2right mouse-3center mouse-3left mouse-3right mouse-center mouse-left mouse-right mouse-sel-mode-hook mouse-wheel-mode-hook mpc-mode-hook mpc-songs-mode-hook mpc-status-mode-hook mpc-tagbrowser-dir-mode-hook mpc-tagbrowser-mode-hook mpuz-mode-abbrev-table mpuz-mode-syntax-table msb-mode-hook mspools-mode-abbrev-table mspools-mode-hook mspools-mode-syntax-table net-utils--revert-cmd net-utils-mode-hook network-connection-mode-hook newsticker-mode-hook newsticker-treeview-item-mode-hook newsticker-treeview-list-mode-hook newsticker-treeview-mode-abbrev-table newsticker-treeview-mode-hook newsticker-treeview-mode-syntax-table next-error-follow-minor-mode-hook nnimap-request-articles-find-limit nnir-memo-query nnir-memo-server normal-erase-is-backspace-mode-hook notifications-get-server-information-method nroff-electric-mode-hook nslookup-mode-hook nxml-mode-hook occur-edit-mode-hook octave-eldoc-cache octave-eldoc-message-style octave-find-definition-filename-function octave-font-lock-texinfo-comment octave-help-buffer octave-help-mode-hook octave-help-mode-map octave-source-directories opascal--literal-start-re opascal--syntax-propertize opascal-begin-enclosing-tokens opascal-begin-previous-tokens opascal-binary-ops opascal-block-statements opascal-body-expr-statements opascal-body-statements opascal-case-label-indent opascal-class-types opascal-comments opascal-composite-types opascal-compound-block-indent opascal-debug opascal-debug-buffer opascal-debug-mode-map opascal-decl-delimiters opascal-decl-matchers opascal-decl-sections opascal-directives opascal-enclosing-statements opascal-end-block-statements opascal-expr-delimiters opascal-expr-statements opascal-font-lock-defaults opascal-font-lock-keywords opascal-indent-level opascal-interface-types opascal-keywords opascal-leading-spaces-re opascal-match-block-statements opascal-mid-block-statements opascal-mode-abbrev-table opascal-mode-hook opascal-mode-map opascal-mode-syntax-table opascal-non-space-chars opascal-parsing-progress-step opascal-previous-enclosing-statements opascal-previous-statements opascal-previous-terminators opascal-progress-last-reported-point opascal-routine-statements opascal-scanning-progress-step opascal-search-path opascal-space-chars opascal-spaces-re opascal-strings opascal-tab-always-indents opascal-unit-sections opascal-unit-statements opascal-use-clauses opascal-verbose opascal-visibilities opascal-whitespace opascal-word-chars org-TBLFM-regexp org-agenda-entry-text-leaders org-agenda-filter org-agenda-filtered-by-top-headline org-agenda-ignore-drawer-properties org-agenda-max-effort org-agenda-max-entries org-agenda-max-tags org-agenda-max-todos org-agenda-regexp-filter org-agenda-regexp-filter-preset org-agenda-restriction-lock-highlight-subtree org-agenda-search-view-max-outline-level org-agenda-skip-scheduled-delay-if-deadline org-agenda-todo-ignore-time-comparison-use-seconds org-agenda-top-headline-filter org-archive-file-header-format org-ascii-bullets org-ascii-caption-above org-ascii-charset org-ascii-format-drawer-function org-ascii-format-inlinetask-function org-ascii-global-margin org-ascii-headline-spacing org-ascii-indented-line-width org-ascii-inlinetask-width org-ascii-inner-margin org-ascii-links-to-notes org-ascii-paragraph-spacing org-ascii-quote-margin org-ascii-table-keep-all-vertical-lines org-ascii-table-use-ascii-art org-ascii-table-widen-columns org-ascii-text-width org-ascii-underline org-ascii-verbatim-format org-attach-git-annex-cutoff org-babel-R-graphics-devices org-babel-call-process-region-original org-babel-current-src-block-location org-babel-default-header-args:makefile org-babel-ditaa-java-cmd org-babel-hash-show-time org-babel-header-args:gnuplot org-babel-inline-result-wrap org-babel-latex-htlatex org-babel-latex-htlatex-packages org-babel-lilypond-OSX-ly-path org-babel-lilypond-OSX-midi-path org-babel-lilypond-OSX-pdf-path org-babel-lilypond-arrange-mode org-babel-lilypond-compile-post-tangle org-babel-lilypond-display-pdf-post-tangle org-babel-lilypond-gen-html org-babel-lilypond-gen-pdf org-babel-lilypond-gen-png org-babel-lilypond-gen-svg org-babel-lilypond-nix-ly-path org-babel-lilypond-nix-midi-path org-babel-lilypond-nix-pdf-path org-babel-lilypond-play-midi-post-tangle org-babel-lilypond-use-eps org-babel-lilypond-w32-ly-path org-babel-lilypond-w32-midi-path org-babel-lilypond-w32-pdf-path org-babel-ocaml-command org-babel-perl-preface org-babel-perl-var-wrap org-babel-python-None-to org-babel-python-hline-to org-babel-ruby-hline-to org-babel-ruby-nil-to org-babel-scheme-repl-map org-babel-use-quick-and-dirty-noweb-expansion org-beamer-environments-special org-beamer-mode-hook org-beamer-theme org-beamer-verbatim-elements org-block-entry-blocking org-bookmark-names-plist org-cdlatex-mode-hook org-checkbox-hierarchical-statistics org-clock-goto-before-context org-clock-rounding-minutes org-clock-x11idle-program-name org-closed-keep-when-no-todo org-deadline-time-hour-regexp org-ditaa-eps-jar-path org-edit-src-auto-save-idle-delay org-edit-src-code-timer org-edit-src-turn-on-auto-save org-element-document-properties org-element-link-type-is-file org-export--registered-backends org-export-allow-bind-keywords org-export-async-debug org-export-async-init-file org-export-before-parsing-hook org-export-before-processing-hook org-export-coding-system org-export-creator-string org-export-default-inline-image-rule org-export-dictionary org-export-dispatch-last-action org-export-dispatch-last-position org-export-dispatch-use-expert-ui org-export-filter-babel-call-functions org-export-filter-bold-functions org-export-filter-center-block-functions org-export-filter-clock-functions org-export-filter-code-functions org-export-filter-comment-block-functions org-export-filter-comment-functions org-export-filter-diary-sexp-functions org-export-filter-drawer-functions org-export-filter-dynamic-block-functions org-export-filter-entity-functions org-export-filter-example-block-functions org-export-filter-export-block-functions org-export-filter-export-snippet-functions org-export-filter-final-output-functions org-export-filter-fixed-width-functions org-export-filter-footnote-definition-functions org-export-filter-footnote-reference-functions org-export-filter-headline-functions org-export-filter-horizontal-rule-functions org-export-filter-inline-babel-call-functions org-export-filter-inline-src-block-functions org-export-filter-inlinetask-functions org-export-filter-italic-functions org-export-filter-item-functions org-export-filter-keyword-functions org-export-filter-latex-environment-functions org-export-filter-latex-fragment-functions org-export-filter-line-break-functions org-export-filter-link-functions org-export-filter-node-property-functions org-export-filter-options-functions org-export-filter-paragraph-functions org-export-filter-parse-tree-functions org-export-filter-plain-list-functions org-export-filter-plain-text-functions org-export-filter-planning-functions org-export-filter-property-drawer-functions org-export-filter-quote-block-functions org-export-filter-quote-section-functions org-export-filter-radio-target-functions org-export-filter-section-functions org-export-filter-special-block-functions org-export-filter-src-block-functions org-export-filter-statistics-cookie-functions org-export-filter-strike-through-functions org-export-filter-subscript-functions org-export-filter-superscript-functions org-export-filter-table-cell-functions org-export-filter-table-functions org-export-filter-table-row-functions org-export-filter-target-functions org-export-filter-timestamp-functions org-export-filter-underline-functions org-export-filter-verbatim-functions org-export-filter-verse-block-functions org-export-filters-alist org-export-in-background org-export-max-depth org-export-options-alist org-export-smart-quotes-alist org-export-smart-quotes-regexps org-export-snippet-translation-alist org-export-special-keywords org-export-stack-contents org-export-stack-mode-abbrev-table org-export-stack-mode-hook org-export-stack-mode-map org-export-stack-mode-syntax-table org-export-with-author org-export-with-clocks org-export-with-creator org-export-with-date org-export-with-email org-export-with-entities org-export-with-inlinetasks org-export-with-latex org-export-with-planning org-export-with-smart-quotes org-export-with-statistics-cookies org-gnus-no-server org-group-tags org-habit-show-done-always-green org-highlight-latex-and-related org-html--pre/postamble-class org-html-allow-name-attribute-in-anchors org-html-coding-system org-html-container-element org-html-creator-string org-html-divs org-html-doctype org-html-doctype-alist org-html-extension org-html-footnote-format org-html-footnote-separator org-html-footnotes-section org-html-format-drawer-function org-html-format-headline-function org-html-format-inlinetask-function org-html-head org-html-head-extra org-html-head-include-default-style org-html-head-include-scripts org-html-home/up-format org-html-html5-elements org-html-html5-fancy org-html-htmlize-font-prefix org-html-htmlize-output-type org-html-indent org-html-infojs-options org-html-infojs-opts-table org-html-infojs-template org-html-inline-image-rules org-html-inline-images org-html-link-home org-html-link-org-files-as-html org-html-link-up org-html-link-use-abs-url org-html-mathjax-options org-html-mathjax-template org-html-metadata-timestamp-format org-html-postamble org-html-postamble-format org-html-preamble org-html-preamble-format org-html-protect-char-alist org-html-scripts org-html-special-string-regexps org-html-style org-html-style-default org-html-style-include-default org-html-style-include-scripts org-html-table-align-individual-fields org-html-table-caption-above org-html-table-data-tags org-html-table-default-attributes org-html-table-header-tags org-html-table-row-tags org-html-table-use-header-tags-for-first-column org-html-tag-class-prefix org-html-text-markup-alist org-html-todo-kwd-class-prefix org-html-toplevel-hlevel org-html-use-infojs org-html-use-unicode-chars org-html-validation-link org-html-with-latex org-html-xml-declaration org-icalendar-after-save-hook org-icalendar-combined-agenda-file org-icalendar-exclude-tags org-icalendar-with-timestamps org-image-actual-width org-indent-mode-hook org-last-set-property-value org-latex-active-timestamp-format org-latex-and-related-regexp org-latex-babel-language-alist org-latex-classes org-latex-custom-lang-environments org-latex-default-class org-latex-default-packages-alist org-latex-default-table-environment org-latex-default-table-mode org-latex-diary-timestamp-format org-latex-footnote-separator org-latex-format-drawer-function org-latex-format-headline-function org-latex-format-inlinetask-function org-latex-image-default-height org-latex-image-default-option org-latex-image-default-width org-latex-inactive-timestamp-format org-latex-inline-image-rules org-latex-inputenc-alist org-latex-known-errors org-latex-link-with-unknown-path-format org-latex-listings org-latex-listings-langs org-latex-listings-options org-latex-logfiles-extensions org-latex-minted-langs org-latex-minted-options org-latex-packages-alist org-latex-pdf-process org-latex-remove-logfiles org-latex-table-caption-above org-latex-table-matrix-macros org-latex-table-scientific-notation org-latex-tables-booktabs org-latex-tables-centered org-latex-text-markup-alist org-latex-title-command org-latex-toc-command org-latex-with-hyperref org-list-allow-alphabetical org-list-description-max-indent org-list-empty-line-terminates-plain-lists org-macro-templates org-man-custom-lang-environments org-man-logfiles-extensions org-man-pdf-process org-man-remove-logfiles org-man-source-highlight org-man-source-highlight-langs org-man-table-scientific-notation org-man-tables-centered org-man-tables-verbatim org-md-headline-style org-mobile-allpriorities org-mode-transpose-word-syntax-table org-odt-bookmark-prefix org-odt-content-template-file org-odt-convert-capabilities org-odt-convert-process org-odt-convert-processes org-odt-create-custom-styles-for-srcblocks org-odt-default-image-sizes-alist org-odt-display-outline-level org-odt-fontify-srcblocks org-odt-format-drawer-function org-odt-format-headline-function org-odt-format-inlinetask-function org-odt-image-size-probe-method org-odt-inline-formula-rules org-odt-inline-image-rules org-odt-max-image-size org-odt-pixels-per-inch org-odt-preferred-output-format org-odt-prettify-xml org-odt-schema-dir org-odt-special-string-regexps org-odt-src-block-paragraph-format org-odt-styles-file org-odt-table-styles org-odt-use-date-fields org-odt-with-latex org-org-htmlized-css-url org-ota org-prefix-has-breadcrumbs org-read-date-minibuffer-local-map org-refile-keep org-scheduled-delay-days org-scheduled-time-hour-regexp org-special-ctrl-o org-startup-with-latex-preview org-table-TBLFM-begin-regexp org-table-follow-field-mode-hook org-tag-groups-alist org-tag-groups-alist-for-agenda org-texinfo-active-timestamp-format org-texinfo-classes org-texinfo-coding-system org-texinfo-def-table-markup org-texinfo-default-class org-texinfo-diary-timestamp-format org-texinfo-format-drawer-function org-texinfo-format-headline-function org-texinfo-format-inlinetask-function org-texinfo-inactive-timestamp-format org-texinfo-info-process org-texinfo-link-with-unknown-path-format org-texinfo-logfiles-extensions org-texinfo-max-toc-depth org-texinfo-node-description-column org-texinfo-remove-logfiles org-texinfo-supported-coding-systems org-texinfo-table-scientific-notation org-texinfo-tables-verbatim org-texinfo-text-markup-alist org-time-clocksum-use-effort-durations org-use-last-clock-out-time-as-effective-time orgstruct-heading-prefix-regexp orgstruct-initialized orgstruct-mode-hook orgstruct-setup-hook orgtbl-mode-hook outline-minor-mode-hook overwrite-mode-hook package--builtin-versions package--default-summary package-check-signature package-list-unsigned package-list-unversioned package-menu-mode-hook package-pinned-packages package-unsigned-archives pages-directory-address-mode-hook paragraph-indent-minor-mode-hook paragraph-indent-text-mode-hook partial-completion-mode-hook pascal--syntax-propertize pascal-mode-hook pascal-outline-mode-hook password-word-equivalents pcmpl-x-ack-color-options pcmpl-x-ack-program pcmpl-x-ag-options pcmpl-x-tlmgr-actions pcmpl-x-tlmgr-common-options pcmpl-x-tlmgr-options-cache pcmpl-x-tlmgr-program perl--prettify-symbols-alist plain-tex-mode-hook plstore-mode-hook pop3-uidl-file pop3-uidl-file-backup pre-redisplay-function prettify-symbols--keywords prettify-symbols-alist prettify-symbols-mode prettify-symbols-mode-hook prettify-symbols-mode-major-mode prettify-symbols-mode-set-explicitly proced-mode-hook process-menu-mode-hook profiler-report-menu profiler-report-mode-hook prog-mode-hook ps-mode-hook ps-run-mode-hook python--use-fake-loc python-imenu-format-item-label-function python-imenu-format-parent-item-jump-label-function python-imenu-format-parent-item-label-function python-mode-skeleton-abbrev-table python-shell--prompt-calculated-input-regexp python-shell--prompt-calculated-output-regexp python-shell-interpreter-interactive-arg python-shell-prompt-detect-enabled python-shell-prompt-detect-failure-warning python-shell-prompt-input-regexps python-shell-prompt-output-regexps quickurl-list-mode-abbrev-table quickurl-list-mode-syntax-table rcirc-multiline-minor-mode-hook rcirc-track-minor-mode-hook read-only-mode-hook read-regexp-defaults-function reb-lisp-mode-hook recentf-dialog-mode-hook recentf-mode-hook rectangle-mark-mode rectangle-mark-mode-hook rectangle-mark-mode-map redisplay--all-windows-cause redisplay--mode-lines-cause redisplay-highlight-region-function redisplay-unhighlight-region-function refill-mode-hook reftex-index-mode-hook reftex-index-phrases-mode-hook reftex-label-ignored-macros-and-environments reftex-label-regexps reftex-section-info-function reftex-section-post-regexp reftex-section-pre-regexp region-extract-function register-preview-delay register-preview-function remember-data-directory remember-directory-file-name-format remember-notes-buffer-name remember-notes-bury-on-kill remember-notes-initial-major-mode remember-notes-mode remember-notes-mode-hook remember-notes-mode-map reveal-mode-hook rmail-get-coding-function rmail-mbox-format rmail-mime-decoded rmail-mime-mode-hook rmail-summary-mode-abbrev-table rmail-summary-mode-hook rmail-summary-mode-syntax-table rst-minor-mode-hook rst-toc-mode-hook ruby--electric-indent-chars ruby-align-chained-calls ruby-align-to-stmt-keywords ruby-alignable-keywords ruby-custom-encoding-magic-comment-template ruby-encoding-magic-comment-style ruby-expression-expansion-re ruby-font-lock-keyword-beg-re ruby-mode-hook ruby-mode-menu ruby-singleton-class-re ruby-smie-grammar ruby-syntax-before-regexp-re ruby-use-smie ruler-mode-hook sc-minor-mode-hook scribe-mode-hook scroll-all-mode-hook scroll-bar-adjust-thumb-portion scroll-bar-mode-hook scroll-lock-mode-hook select-tags-table-mode-hook self-insert-uses-region-functions semantic--on-input-start-marker semantic-mode-hook server-mode-hook sgml-electric-tag-pair-mode-hook sh-electric-here-document-mode-hook sh-shell-process shell-dirtrack-mode-hook show-paren--idle-timer show-paren--overlay show-paren--overlay-1 show-paren-data-function show-paren-mode-hook shr-bullet shr-external-browser shr-external-rendering-functions shr-image-animate shr-inhibit-decoration shr-prefer-media-type-alist shr-table-separator-length shr-target-id sieve-manage-mode-hook simula-mode-hook size-indication-mode-hook slitex-mode-hook smbclient-mode-hook smerge-mode-hook smie--hanging-eolp-function smie--matching-block-data-cache smie-config smie-config--buffer-local smie-config--mode-local smie-config--modefuns smie-config--trace smiley-cached-regexp-alist smiley-data-directory smiley-regexp-alist smiley-style smime-mode-hook snake-mode-abbrev-table snake-mode-syntax-table special-mode-hook sql--help-docstring sql-login-delay strokes-mode-hook subword-mode-hook subword-mode-set-explicitly sup-mouse-fast-select-window superword-mode superword-mode-hook superword-mode-major-mode superword-mode-map superword-mode-set-explicitly table-fixed-width-mode-hook tabulated-list-mode-hook tar-mode-hook tar-subfile-mode-hook temp-buffer-max-width temp-buffer-resize-mode-hook term-suppress-hard-newline tex-mode-hook tex-shell-hook text-clone--maintaining text-scale-mode-hook thai-word-mode-hook thing-at-point-beginning-of-url-regexp thing-at-point-default-mail-uri-scheme thing-at-point-newsgroup-heads thing-at-point-newsgroup-regexp thumbs-mode-hook thumbs-view-image-mode-hook timeclock-mode-line-display-hook tmm--history todo-add-item-if-new-category todo-always-add-time-string todo-archive-mode-abbrev-table todo-archive-mode-hook todo-archive-mode-map todo-archive-mode-syntax-table todo-archives todo-categories-align todo-categories-archived-label todo-categories-buffer todo-categories-category-label todo-categories-category-number todo-categories-diary-label todo-categories-done-label todo-categories-mode-abbrev-table todo-categories-mode-hook todo-categories-mode-map todo-categories-mode-syntax-table todo-categories-number-separator todo-categories-todo-label todo-categories-totals-label todo-categories-with-marks todo-category-completions-files todo-category-done todo-category-string-face todo-comment-face todo-comment-string todo-completion-ignore-case todo-current-todo-file todo-date-face todo-date-from-calendar todo-date-pattern todo-date-string-start todo-default-priority todo-default-todo-file todo-descending-counts todo-diary-expired-face todo-diary-items-buffer todo-diary-nonmarking todo-directory todo-done-face todo-done-sep-face todo-done-separator todo-done-separator-string todo-done-string todo-done-string-start todo-edit-done-item--param-key-alist todo-edit-item--date-param-key-alist todo-edit-item--param-key-alist todo-edit-item--prompt todo-file-buffers todo-files todo-files-function todo-filter-done-items todo-filter-files todo-filtered-items-buffer todo-filtered-items-mode-abbrev-table todo-filtered-items-mode-hook todo-filtered-items-mode-map todo-filtered-items-mode-syntax-table todo-font-lock-keywords todo-global-current-todo-file todo-highlight-item todo-include-in-diary todo-indent-to-here todo-initial-category todo-initial-file todo-insert-item--argleft todo-insert-item--args todo-insert-item--argsleft todo-insert-item--keys-so-far todo-insert-item--newargsleft todo-insert-item--param-key-alist todo-insert-item--parameters todo-item-mark todo-item-start todo-key-bindings-t todo-key-bindings-t+a todo-key-bindings-t+a+f todo-key-bindings-t+f todo-legacy-date-time-regexp todo-mode-line-function todo-month-abbrev-array todo-month-name-array todo-multiple-filter-files todo-multiple-filter-files-widget todo-nondiary-end todo-nondiary-face todo-nondiary-marker todo-nondiary-start todo-number-prefix todo-print-buffer todo-print-buffer-function todo-regexp-items-buffer todo-show-current-file todo-show-done-only todo-show-first todo-show-with-done todo-skip-archived-categories todo-time-face todo-top-priorities todo-top-priorities-buffer todo-top-priorities-overrides todo-undo-item-omit-comment todo-use-only-highlighted-region todo-visited todo-wrap-lines todo-y-with-space tool-bar-mode-hook tooltip-mode tooltip-mode-hook tpu-cursor-free-mode-hook tpu-edt-mode-hook trace--timer tramp-adb-file-name-handler-alist tramp-adb-ls-date-regexp tramp-adb-ls-toolbox-regexp tramp-adb-method tramp-adb-program tramp-adb-prompt tramp-connection-min-time-diff tramp-connection-properties tramp-connection-timeout tramp-debug-on-error tramp-default-host-alist tramp-end-of-heredoc tramp-obsolete-methods tramp-perl-pack tramp-perl-unpack tramp-smb-acl-program tramp-smb-actions-get-acl tramp-smb-actions-set-acl tramp-ssh-controlmaster-options tramp-use-ssh-controlmaster-options tramp-warned-obsolete-methods transient-mark-mode-hook tty-menu--initial-menu-x tty-menu-navigation-map tty-menu-open-use-tmm tty-setup-hook type-break-mode-hook type-break-mode-line-message-mode-hook type-break-query-mode-hook unify-8859-on-decoding-mode-hook unify-8859-on-encoding-mode-hook unrmail-mbox-format url-cookie-mode-abbrev-table url-cookie-mode-hook url-cookie-mode-map url-cookie-mode-syntax-table url-dired-minor-mode-hook url-file-handler-load-in-progress url-handler-mode-hook use-hard-newlines-hook user-emacs-directory-warning vc-annotate-mode-hook vc-bzr-log-view-mode-hook vc-git-log-edit-mode-hook vc-git-log-view-mode-hook vc-hg-log-view-mode-hook vc-mtn-log-view-mode-hook vc-svn-log-view-mode-hook vcursor-use-vcursor-map-hook vera-mode-hook verilog-case-fold verilog-in-constraint-re vhdl-actual-generic-name vhdl-beautify-options vhdl-electric-mode-hook vhdl-error-regexp-emacs-alist vhdl-last-input-event vhdl-speedbar-mode-map vhdl-stutter-mode-hook visible-mode-hook visual-line-mode-hook visual-line-mode-set-explicitly visual-order-cursor-movement w32-direct-print-region-use-command-dot-com w32-untranslated-filesystem-list which-function-mode-hook whitespace-enable-predicate whitespace-global-mode-hook whitespace-mode-hook whitespace-newline-mode-hook widget-minor-mode-hook window-resize-pixelwise window-state-put-stale-windows wordstar-mode-abbrev-table wordstar-mode-hook wordstar-mode-syntax-table xesam-count xesam-current xesam-dbus-unique-names xesam-engine xesam-minibuffer-query-history xesam-minibuffer-vendor-history xesam-minor-mode xesam-minor-mode-hook xesam-mode-abbrev-table xesam-mode-hook xesam-mode-map xesam-mode-syntax-table xesam-notify-function xesam-objects xesam-query xesam-refreshing xesam-search xesam-search-engines xesam-to xesam-type xesam-vendor xesam-xml-string xterm-mouse-mode-hook)) - (features - (removed advice-preload delphi find-gc octave-inf octave-mod org-ascii org-beamer org-docbook org-exp org-exp-blocks org-export-latex org-freemind org-html org-icalendar org-infojs org-jsinfo org-latex org-lparse org-mac-message org-mew org-mks org-odt org-publish org-remember org-special-blocks org-taskjuggler org-vm org-wl org-xoxo) - (added bat-mode cl-indent cl-loaddefs cus-dep dos-vars eieio-core elec-pair em-tramp erc-list eudcb-bbdb eww filenotify frameset gnus-icalendar gnus-vm inotify nadvice ob-core ob-makefile octave opascal org-macro ox ox-ascii ox-beamer ox-html ox-icalendar ox-latex ox-man ox-md ox-odt ox-org ox-publish ox-texinfo pcmpl-x prog-mode smiley subr-x sup-mouse superword tpu-extras tramp-adb xesam))) - ((24 5) - (functions - (removed browse-url-firefox-sentinel cua-repeat-replace-region python-indent-toggle-levels tramp-time-less-p tramp-time-subtract) - (added c--macroexpand-all c-macro-is-genuine-p delete-selection-repeat-replace-region erc-channel-user-admin erc-channel-user-admin-p erc-channel-user-halfop erc-channel-user-halfop-p erc-channel-user-owner erc-channel-user-owner-p erc-get-user-mode-prefix erc-quit/part-reason-default file-notify--descriptor python-indent--calculate-indentation python-indent--calculate-levels python-indent--previous-level python-info-encoding python-info-encoding-from-cookie python-syntax-closing-paren-p reftex--prepare-syntax-tables todo-revert-buffer)) - (variables - (removed cua--last-deleted-region-pos cua--last-deleted-region-text cua--repeat-replace-text ispell-hunspell-dictionary-equivs-alist python--use-fake-loc) - (added :admin :after-backslash :after-backslash-assignment-continuation :after-backslash-block-continuation :after-backslash-dotted-continuation :after-backslash-first-line :after-block-end :after-block-start :after-comment :after-line :at-dedenter-block-start :halfop :inside-paren :inside-paren-at-closing-nested-paren :inside-paren-at-closing-paren :inside-paren-newline-start :inside-paren-newline-start-from-block :inside-string :no-indent :owner delete-selection-save-to-register delsel--replace-text-or-position erc-rename-buffers ispell-dicts-name2locale-equivs-alist mml2015-display-key-image python-shell-unbuffered vc-hg-log-graph)) - (features - (removed) - (added cl-extra))) - ((25 1) - (functions - (removed ada-convert-file-name add-to-diary-list american-calendar authors authors-add authors-add-fixed-entries authors-add-to-author-list authors-canonical-author-name authors-canonical-file-name authors-disambiguate-file-name authors-lax-changelog-p authors-no-scan-file-p authors-obsolete-file-p authors-public-domain-p authors-scan-change-log authors-scan-el batch-update-authors byte-compile-file-form-define-abbrev-table byte-compile-track-mouse byte-optimize-zerop c-change-set-fl-decl-start c-context-set-fl-decl-start c-set-fl-decl-start calc-distance-of-robot-from calc-smell-internal calculator-curnum-value calculator-get-prompt calculator-integer-p calendar-absolute-from-astro calendar-absolute-from-bahai calendar-absolute-from-chinese calendar-absolute-from-coptic calendar-absolute-from-ethiopic calendar-absolute-from-french calendar-absolute-from-hebrew calendar-absolute-from-islamic calendar-absolute-from-iso calendar-absolute-from-julian calendar-absolute-from-mayan-long-count calendar-absolute-from-persian calendar-bahai-prompt-for-date calendar-date-is-legal-p calendar-for-loop calendar-goto-astro-day-number calendar-goto-bahai-date calendar-goto-chinese-date calendar-goto-coptic-date calendar-goto-ethiopic-date calendar-goto-french-date calendar-goto-hebrew-date calendar-goto-islamic-date calendar-goto-iso-date calendar-goto-iso-week calendar-goto-julian-date calendar-goto-mayan-long-count-date calendar-goto-persian-date calendar-iso-read-args calendar-next-calendar-round-date calendar-next-haab-date calendar-next-tzolkin-date calendar-one-frame-setup calendar-only-one-frame-setup calendar-phases-of-moon calendar-previous-calendar-round-date calendar-previous-haab-date calendar-previous-tzolkin-date calendar-print-astro-day-number calendar-print-bahai-date calendar-print-chinese-date calendar-print-coptic-date calendar-print-ethiopic-date calendar-print-french-date calendar-print-hebrew-date calendar-print-islamic-date calendar-print-iso-date calendar-print-julian-date calendar-print-mayan-date calendar-print-persian-date calendar-two-frame-setup calendar-version capitalized-find-word-boundary cc-bytecomp-ignore-obsolete cc-bytecomp-obsolete-fun cc-bytecomp-obsolete-var cconv--analyse-function cconv--analyse-use check-calendar-holidays cl--compiler-macro-typep cl--make-type-test cl--set-elt class-constructor class-method-invocation-order class-option class-option-assoc class-slot-initarg class-v completion--sreverse completion-separator-self-insert-autofilling completion-separator-self-insert-command coptic-prompt-for-date copy-soap-array-type copy-soap-basic-type copy-soap-sequence-element copy-soap-sequence-type copy-soap-simple-type copy-soap-wsdl css-extract-keyword-list css-extract-parse-val-grammar css-extract-props-and-vals diary-omer diary-parasha diary-phases-of-moon diary-rosh-hodesh diary-sabbath-candles diary-yahrzeit digit-char-p distance ede-cpp-root-project-root ede-dir-to-projectfile ede-directory-project-add-description-to-hash ede-directory-project-from-hash ede-emacs-project-root ede-files-find-existing ede-find-project-root ede-linux-project-root ede-project-dirmatch-p edebug-adjust-window edebug-original-debug-on-entry edebug-original-eval-defun edebug-original-read edebug-read ediff-odd-p eieio--check-type eieio--class--unused-0 eieio--class-class-allocation-a eieio--class-class-allocation-custom eieio--class-class-allocation-custom-group eieio--class-class-allocation-custom-label eieio--class-class-allocation-doc eieio--class-class-allocation-printer eieio--class-class-allocation-protection eieio--class-class-allocation-type eieio--class-parent eieio--class-protection eieio--class-public-a eieio--class-public-custom eieio--class-public-custom-group eieio--class-public-custom-label eieio--class-public-d eieio--class-public-doc eieio--class-public-printer eieio--class-public-type eieio--class-symbol eieio--class-symbol-obarray eieio--define-field-accessors eieio--object--unused-0 eieio--object-name eieio--scoped-class eieio--typep eieio--with-scoped-class eieio-add-new-slot eieio-all-generic-functions eieio-attribute-to-initarg eieio-build-class-list eieio-c3-candidate eieio-c3-merge-lists eieio-class-children-fast eieio-class-parents-fast eieio-class-precedence-bfs eieio-class-precedence-c3 eieio-class-precedence-dfs eieio-class-precedence-list eieio-class-slot-name-index eieio-compiled-function-arglist eieio-debug-methodinvoke eieio-defgeneric-form eieio-defgeneric-form-primary-only eieio-defgeneric-form-primary-only-one eieio-defgeneric-reset-generic-form eieio-defgeneric-reset-generic-form-primary-only eieio-defgeneric-reset-generic-form-primary-only-one eieio-generic-call eieio-generic-call-primary-only eieio-generic-form eieio-help-class-slots eieio-help-find-class-definition eieio-help-find-method-definition eieio-help-generic eieio-initarg-to-attribute eieio-lambda-arglist eieio-method-documentation eieio-perform-slot-validation eieio-perform-slot-validation-for-default eieio-read-generic eieio-read-generic-p eieio-slot-name-index eieio-slot-originating-class-p eieio-specialized-key-to-generic-key eieio-unbind-method-implementations eieio-validate-class-slot-value eieio-validate-slot-value eieiomt-add eieiomt-install eieiomt-method-list eieiomt-next eieiomt-sym-optimize eldoc-beginning-of-sexp eldoc-current-symbol eldoc-docstring-first-line eldoc-fnsym-in-current-sexp eldoc-function-argstring eldoc-function-argstring-format eldoc-get-fnsym-args-string eldoc-get-var-docstring eldoc-highlight-function-argument eldoc-last-data-store eldoc-symbol-function emacs-bzr-version-bzr emacs-bzr-version-dirstate emacs-lisp-byte-code-comment emacs-lisp-byte-code-mode emacs-lisp-byte-code-syntax-propertize epg-context-set-cipher-algorithm epg-context-set-compress-algorithm epg-context-set-digest-algorithm epg-context-set-home-directory epg-context-set-include-certs epg-context-set-operation epg-context-set-output-file epg-context-set-pinentry-mode epg-context-set-process epg-context-set-program epg-context-set-protocol epg-context-set-result epg-context-set-sig-notations epg-key-set-sub-key-list epg-key-set-user-id-list epg-sig-notation-set-value epg-sig-notations epg-signature-set-class epg-signature-set-creation-time epg-signature-set-digest-algorithm epg-signature-set-expiration-time epg-signature-set-fingerprint epg-signature-set-key-id epg-signature-set-notations epg-signature-set-pubkey-algorithm epg-signature-set-status epg-signature-set-validity epg-signature-set-version epg-sub-key-set-fingerprint epg-user-id-set-signature-list eudc-caar eudc-cadr eudc-cdaar eudc-cdar european-calendar eval-defun-1 eval-defun-2 eval-last-sexp-1 eval-last-sexp-print-value eww-colorize-region eww-tag-body exit-calendar extended-loop-p extract-calendar-day extract-calendar-month extract-calendar-year fancy-diary-display fancy-diary-display-mode filter-visible-calendar-holidays generic-primary-only-one-p generic-primary-only-p gnus-bind-safe-url-regexp gnus-delete-overlay gnus-make-overlay gnus-move-overlay gnus-overlay-buffer gnus-overlay-end gnus-overlay-get gnus-overlay-put gnus-overlay-start gnus-overlays-in gnus-remove-overlays hebrew-calendar-yahrzeit hif-parse-if-exp holiday-hanukkah holiday-passover-etc holiday-rosh-hashanah-etc holiday-tisha-b-av-etc ibuffer-quit icalendar--date-style imap-ssl-open imap-ssl-p include-other-diary-files increment-calendar-month insert-anniversary-diary-entry insert-bahai-diary-entry insert-block-diary-entry insert-cyclic-diary-entry insert-diary-entry insert-hebrew-diary-entry insert-islamic-diary-entry insert-monthly-bahai-diary-entry insert-monthly-diary-entry insert-monthly-hebrew-diary-entry insert-monthly-islamic-diary-entry insert-weekly-diary-entry insert-yearly-bahai-diary-entry insert-yearly-diary-entry insert-yearly-hebrew-diary-entry insert-yearly-islamic-diary-entry ispell-adjusted-window-height ispell-overlay-window js--syntax-begin-function json-decode-char0 json-encode-char json-encode-char0 last-sexp-toggle-display lisp--company-doc-buffer lisp--company-doc-string lisp--company-location lisp--local-variables lisp--local-variables-1 list-bahai-diary-entries list-calendar-holidays list-hebrew-diary-entries list-islamic-diary-entries list-sexp-diary-entries list-yahrzeit-dates make-diary-entry make-soap-array-type make-soap-basic-type make-soap-sequence-element make-soap-sequence-type make-soap-simple-type make-soap-wsdl mark-bahai-calendar-date-pattern mark-bahai-diary-entries mark-calendar-date-pattern mark-calendar-days-named mark-calendar-holidays mark-calendar-month mark-diary-entries mark-hebrew-calendar-date-pattern mark-hebrew-diary-entries mark-included-diary-files mark-islamic-calendar-date-pattern mark-islamic-diary-entries mark-sexp-diary-entries mark-visible-calendar-date mc-install-read-mode mc-install-write-mode menu-bar-next-tag menu-bar-next-tag-other-window message-delete-overlay message-make-overlay message-overlay-put mh-cl-flet midnight-find mm-inline-text-html-render-with-w3 mm-setup-w3 mm-w3-prepare-buffer mml-smime-epg-find-usable-key mml-smime-epg-find-usable-secret-key mml-smime-epg-passphrase-callback mml1991-epg-find-usable-key mml1991-epg-find-usable-secret-key mml1991-epg-passphrase-callback mml2015-epg-check-sub-key mml2015-epg-check-user-id mml2015-epg-find-usable-key mml2015-epg-find-usable-secret-key mml2015-epg-passphrase-callback newsticker--group-do-find-group-for-feed newsticker--group-do-get-parent-group newsticker--group-find-group-for-feed newsticker--group-get-parent-group newsticker--treeview-create-groups-menu newsticker--treeview-create-tree-menu newsticker--treeview-do-get-node newsticker--treeview-get-node next-sexp-as-string nnrss-insert-w3 parse-integer pcase--q1 pcase--split-consp pcase--upat persian-prompt-for-date phases-of-moon print-diary-entries ps-jack-setup ps-jts-ps-setup ps-mode-looking-at-nested ps-mode-match-string-or-comment ps-mode-newline ps-mode-r-angle ps-mode-r-balance ps-mode-r-brace ps-mode-r-gt ps-mode-tabkey pulse rcirc-non-irc-buffer rectange--default-line-number-format redisplay--update-region-highlights registry-prune-hard-candidates registry-prune-soft-candidates repeat-complex-command--called-interactively-skip ruby-singleton-class-p ruby-smie--at-dot-call same-class-fast-p scroll-calendar-left scroll-calendar-left-three-months scroll-calendar-right scroll-calendar-right-three-months semantic-completion-at-point-function semantic-fw-add-edebug-spec server-kill-buffer-query-function ses-cell ses-cell-formula-aset ses-cell-property-delq-fun ses-cell-property-get ses-cell-property-get-fun ses-cell-property-get-handle ses-cell-property-get-handle-fun ses-cell-property-handle-car ses-cell-property-handle-setcar ses-cell-property-pop-fun ses-cell-property-set ses-cell-property-set-fun ses-cell-references-aset ses-time-check ses-unset-with-undo sgml-point-entered shr-expand-newlines shr-find-elements shr-fontize-cont shr-transform-dom sieve-make-overlay sieve-overlay-put sieve-overlays-at simple-diary-display soap-array-type-element-type soap-array-type-name soap-array-type-namespace-tag soap-array-type-p soap-basic-type-kind soap-basic-type-name soap-basic-type-namespace-tag soap-basic-type-p soap-decode-array-type soap-decode-basic-type soap-decode-sequence-type soap-default-soapenc-types soap-default-xsd-types soap-encode-array-type soap-encode-basic-type soap-encode-sequence-type soap-encode-simple-type soap-inspect-array-type soap-inspect-basic-type soap-inspect-sequence-type soap-inspect-simple-type soap-parse-complex-type soap-parse-complex-type-complex-content soap-parse-complex-type-sequence soap-parse-schema-element soap-parse-sequence soap-parse-simple-type soap-resolve-references-for-array-type soap-resolve-references-for-element soap-resolve-references-for-sequence-type soap-resolve-references-for-simple-type soap-sample-value-for-array-type soap-sample-value-for-basic-type soap-sample-value-for-seqence-type soap-sample-value-for-simple-type soap-sequence-element-multiple\? soap-sequence-element-name soap-sequence-element-nillable\? soap-sequence-element-p soap-sequence-element-type soap-sequence-type-elements soap-sequence-type-name soap-sequence-type-namespace-tag soap-sequence-type-p soap-sequence-type-parent soap-simple-type-enumeration soap-simple-type-kind soap-simple-type-name soap-simple-type-namespace-tag soap-simple-type-p soap-type-p sort-diary-entries square table--point-entered-cell-function table--point-left-cell-function term-check-size term-window-width testcover-read tildify-build-regexp tildify-find-env tildify-mode-alist tooltip-region-active-p tramp-set-auto-save tramp-sh-file-gvfs-monitor-dir-process-filter tramp-sh-file-inotifywait-process-filter turn-off-xterm-mouse-tracking turn-on-xterm-mouse-tracking vc-arch-dir-status vc-arch-init-revision vc-arch-workfile-unchanged-p vc-bzr-could-register vc-bzr-dir-status vc-bzr-init-revision vc-bzr-workfile-unchanged-p vc-clear-headers vc-cvs-dir-status vc-dav-could-register vc-dav-state-heuristic vc-dav-workfile-unchanged-p vc-default-could-register vc-default-init-revision vc-default-latest-on-branch-p vc-default-state-heuristic vc-default-workfile-unchanged-p vc-git-dir-status vc-git-workfile-unchanged-p vc-hg-could-register vc-hg-dir-status vc-hg-workfile-unchanged-p vc-mcvs-annotate-command vc-mcvs-annotate-current-time vc-mcvs-annotate-time vc-mcvs-check-headers vc-mcvs-checkin vc-mcvs-checkout vc-mcvs-checkout-model vc-mcvs-command vc-mcvs-create-tag vc-mcvs-diff vc-mcvs-dir-state-heuristic vc-mcvs-find-revision vc-mcvs-make-version-backups-p vc-mcvs-map-file vc-mcvs-merge vc-mcvs-merge-news vc-mcvs-modify-change-comment vc-mcvs-print-log vc-mcvs-read vc-mcvs-register vc-mcvs-registered vc-mcvs-rename-file vc-mcvs-repository-hostname vc-mcvs-responsible-p vc-mcvs-retrieve-tag vc-mcvs-revert vc-mcvs-revision-granularity vc-mcvs-root vc-mcvs-state vc-mcvs-state-heuristic vc-mcvs-update vc-mcvs-valid-revision-number-p vc-mcvs-valid-symbolic-tag-name-p vc-mcvs-working-revision vc-mistrust-permissions vc-mtn-could-register vc-mtn-dir-status vc-mtn-workfile-unchanged-p vc-name vc-rcs-dir-status vc-rcs-rollback vc-rcs-state-heuristic vc-rollback vc-sccs-dir-status vc-sccs-rollback vc-sccs-state-heuristic vc-stay-local-p vc-svn-could-register vc-svn-dir-status vc-svn-repository-hostname vc-svn-state-heuristic vc-workfile-unchanged-p vhdl-goto-line view-other-diary-entries w3-parse-buffer w32-using-nt w32-version window--even-window-heights window--size-ignore-p window-split-min-size woman-mapcan would-be-symbol x-selection-owner-p x-valid-simple-selection-p xterm-mouse--read-event-sequence-1000 xterm-mouse--read-event-sequence-1006) - (added \(setf\ ede-object-keybindings\) \(setf\ ede-object-menu\) \(setf\ ede-object-sourcecode\) \(setf\ gnus-icalendar-event:description\) \(setf\ gnus-icalendar-event:end-time\) \(setf\ gnus-icalendar-event:location\) \(setf\ gnus-icalendar-event:method\) \(setf\ gnus-icalendar-event:opt-participants\) \(setf\ gnus-icalendar-event:organizer\) \(setf\ gnus-icalendar-event:participation-type\) \(setf\ gnus-icalendar-event:recur\) \(setf\ gnus-icalendar-event:req-participants\) \(setf\ gnus-icalendar-event:rsvp\) \(setf\ gnus-icalendar-event:start-time\) \(setf\ gnus-icalendar-event:summary\) \(setf\ gnus-icalendar-event:uid\) \(setf\ seq-elt\) -cvs-create-fileinfo--cmacro -cvs-flags-make--cmacro Man-bgproc-filter \`--pcase-macroexpander add-to-list--anon-cmacro alist-get artist-figlet-get-font-list-windows auth-source-backend--anon-cmacro auth-source-backend--eieio-childp auto-source--symbol-keyword avl-tree--cmpfun--cmacro avl-tree--create--cmacro avl-tree--dummyroot--cmacro avl-tree--node-balance--cmacro avl-tree--node-create--cmacro avl-tree--node-data--cmacro avl-tree--node-left--cmacro avl-tree--node-right--cmacro avl-tree--stack-p--cmacro avl-tree--stack-reverse--cmacro avl-tree--stack-store--cmacro avl-tree-p--cmacro backward-word-strictly batch-byte-compile-emacs batch-byte-recompile-emacs bidi-find-overridden-directionality bidi-resolved-levels bookmark-set-internal bookmark-set-no-overwrite bool-vector browse-url-chrome browse-url-conkeror bruce buffer-menu-open buffer-substring-with-bidi-context bufferpos-to-filepos byte-compile-file-form-defvar-function byte-compile-recurse-toplevel c--delete-duplicates c--intersection c--mapcan c--set-difference c-advise-fl-for-region c-back-over-list-of-member-inits c-back-over-member-initializer-braces c-backward-typed-enum-colon c-before-context-fl-expand-region c-called-from-text-property-change-p c-change-expand-fl-region c-context-expand-fl-region c-fl-decl-start c-forward-declarator c-get-fallback-scan-pos c-lineup-respect-col-0 c-looking-at-non-alphnumspace c-next-single-property-change c-restore-<>-properties c-sc-parse-partial-sexp c-sc-parse-partial-sexp-no-category c-sc-scan-lists c-sc-scan-lists-no-category+1+1 c-sc-scan-lists-no-category+1-1 c-sc-scan-lists-no-category-1+1 c-sc-scan-lists-no-category-1-1 c-self-bind-state-cache c-string-list-p c-string-or-string-list-p calc-convert-exact-units calc-digit-start-entry calc-vector-rms calcFunc-rms calculator-get-display calculator-groupize-number calculator-need-3-lines calculator-push-curnum calculator-reduce-stack-once calendar-chinese-from-absolute-for-diary calendar-chinese-mark-date-pattern calendar-chinese-to-absolute-for-diary capitalize-dwim cc-bytecomp-compiling-or-loading cc-bytecomp-is-loading cc-conditional-require cc-conditional-require-after-load cconv--analyze-function cconv--analyze-use cconv-analyze-form cfengine3-create-imenu-index cfengine3-current-defun cfengine3-reformat-json-string char-fold--make-space-string char-fold-search-backward char-fold-search-forward char-fold-to-regexp chart--anon-cmacro chart--eieio-childp chart-axis--anon-cmacro chart-axis--eieio-childp chart-axis-names--anon-cmacro chart-axis-names--eieio-childp chart-axis-range--anon-cmacro chart-axis-range--eieio-childp chart-bar--anon-cmacro chart-bar--eieio-childp chart-sequece--anon-cmacro chart-sequece--eieio-childp checkdoc-file checkdoc-get-keywords checkdoc-package-keywords cl--assertion-failed cl--block-throw--cmacro cl--block-wrapper--cmacro cl--class-docstring cl--class-docstring--cmacro cl--class-index-table cl--class-index-table--cmacro cl--class-name cl--class-name--cmacro cl--class-p cl--class-p--cmacro cl--class-parents cl--class-parents--cmacro cl--class-slots cl--class-slots--cmacro cl--copy-slot-descriptor cl--copy-slot-descriptor-1 cl--describe-class cl--describe-class-slot cl--describe-class-slots cl--do-&aux cl--find-class cl--generic cl--generic-arg-specializer cl--generic-build-combined-method cl--generic-cache-miss cl--generic-class-parents cl--generic-derived-specializers cl--generic-describe cl--generic-dispatches cl--generic-dispatches--cmacro cl--generic-fgrep cl--generic-generalizer-name cl--generic-generalizer-name--cmacro cl--generic-generalizer-p cl--generic-generalizer-p--cmacro cl--generic-generalizer-priority cl--generic-generalizer-priority--cmacro cl--generic-generalizer-specializers-function cl--generic-generalizer-specializers-function--cmacro cl--generic-generalizer-tagcode-function cl--generic-generalizer-tagcode-function--cmacro cl--generic-get-dispatcher cl--generic-isnot-nnm-p cl--generic-lambda cl--generic-make cl--generic-make--cmacro cl--generic-make-function cl--generic-make-method cl--generic-make-method--cmacro cl--generic-make-next-function cl--generic-member-method cl--generic-method-documentation cl--generic-method-function cl--generic-method-function--cmacro cl--generic-method-info cl--generic-method-qualifiers cl--generic-method-qualifiers--cmacro cl--generic-method-specializers cl--generic-method-specializers--cmacro cl--generic-method-table cl--generic-method-table--cmacro cl--generic-method-uses-cnm cl--generic-method-uses-cnm--cmacro cl--generic-name cl--generic-name--cmacro cl--generic-no-next-method-function cl--generic-options cl--generic-options--cmacro cl--generic-search-method cl--generic-specializers-apply-to-type-p cl--generic-split-args cl--generic-standard-method-combination cl--generic-struct-specializers cl--generic-struct-tag cl--generic-with-memoization cl--make-slot-desc cl--make-slot-descriptor cl--make-slot-descriptor--cmacro cl--pcase-mutually-exclusive-p cl--plist-remove cl--slot-descriptor-initform cl--slot-descriptor-initform--cmacro cl--slot-descriptor-name cl--slot-descriptor-name--cmacro cl--slot-descriptor-props cl--slot-descriptor-props--cmacro cl--slot-descriptor-type cl--slot-descriptor-type--cmacro cl--struct-all-parents cl--struct-cl--generic-method-p cl--struct-cl--generic-method-p--cmacro cl--struct-cl--generic-p cl--struct-cl--generic-p--cmacro cl--struct-class-children-sym cl--struct-class-children-sym--cmacro cl--struct-class-docstring cl--struct-class-docstring--cmacro cl--struct-class-index-table cl--struct-class-index-table--cmacro cl--struct-class-name cl--struct-class-name--cmacro cl--struct-class-named cl--struct-class-named--cmacro cl--struct-class-p cl--struct-class-p--cmacro cl--struct-class-parents cl--struct-class-parents--cmacro cl--struct-class-print cl--struct-class-print--cmacro cl--struct-class-slots cl--struct-class-slots--cmacro cl--struct-class-tag cl--struct-class-tag--cmacro cl--struct-class-type cl--struct-class-type--cmacro cl--struct-epg-context-p cl--struct-epg-context-p--cmacro cl--struct-epg-data-p cl--struct-epg-data-p--cmacro cl--struct-epg-import-result-p cl--struct-epg-import-result-p--cmacro cl--struct-epg-import-status-p cl--struct-epg-import-status-p--cmacro cl--struct-epg-key-p cl--struct-epg-key-p--cmacro cl--struct-epg-key-signature-p cl--struct-epg-key-signature-p--cmacro cl--struct-epg-new-signature-p cl--struct-epg-new-signature-p--cmacro cl--struct-epg-sig-notation-p cl--struct-epg-sig-notation-p--cmacro cl--struct-epg-signature-p cl--struct-epg-signature-p--cmacro cl--struct-epg-sub-key-p cl--struct-epg-sub-key-p--cmacro cl--struct-epg-user-id-p cl--struct-epg-user-id-p--cmacro cl--struct-get-class cl--struct-new-class cl--struct-new-class--cmacro cl--struct-register-child cl-call-next-method cl-defgeneric cl-defmethod cl-describe-type cl-digit-char-p cl-find-class cl-find-method cl-fresh-line cl-generic-all-functions cl-generic-apply cl-generic-call-method cl-generic-combine-methods cl-generic-current-method-specializers cl-generic-define cl-generic-define-context-rewriter cl-generic-define-generalizer cl-generic-define-method cl-generic-ensure-function cl-generic-function-options cl-generic-generalizers cl-generic-make-generalizer cl-generic-make-generalizer--cmacro cl-iter-defun cl-method-qualifiers cl-next-method-p cl-no-applicable-method cl-no-next-method cl-no-primary-method cl-parse-integer cl-slot-descriptor-p cl-slot-descriptor-p--cmacro cl-struct--pcase-macroexpander cl-struct-avl-tree- cl-struct-avl-tree--node cl-struct-avl-tree--stack cl-struct-cl--class cl-struct-cl--generic cl-struct-cl--generic-generalizer cl-struct-cl--generic-method cl-struct-cl-slot-descriptor cl-struct-cl-structure-class cl-struct-cl-structure-object cl-struct-compilation--message cl-struct-cvs-fileinfo cl-struct-cvs-flags cl-struct-cvs-qtypedesc cl-struct-cvs-tag cl-struct-define cl-struct-edebug--form-data cl-struct-eieio--class cl-struct-eieio--object cl-struct-epg-context cl-struct-epg-data cl-struct-epg-import-result cl-struct-epg-import-status cl-struct-epg-key cl-struct-epg-key-signature cl-struct-epg-new-signature cl-struct-epg-sig-notation cl-struct-epg-signature cl-struct-epg-sub-key cl-struct-epg-user-id cl-struct-erc-response cl-struct-ert--ewoc-entry cl-struct-ert--stats cl-struct-ert--test-execution-info cl-struct-ert-test cl-struct-ert-test-aborted-with-non-local-exit cl-struct-ert-test-failed cl-struct-ert-test-passed cl-struct-ert-test-quit cl-struct-ert-test-result cl-struct-ert-test-result-with-condition cl-struct-ert-test-skipped cl-struct-ewoc cl-struct-ewoc--node cl-struct-flymake-ler cl-struct-gdb-handler cl-struct-gdb-table cl-struct-isearch--state cl-struct-js--js-handle cl-struct-js--pitem cl-struct-nnimap cl-struct-nnmaildir--art cl-struct-nnmaildir--grp cl-struct-nnmaildir--srv cl-struct-org-export-backend cl-struct-p cl-struct-p--cmacro cl-struct-package--ac-desc cl-struct-package--bi-desc cl-struct-package-desc cl-struct-profiler-calltree cl-struct-profiler-profile cl-struct-rng--ipattern cl-struct-sequence-type cl-struct-ses--locprn cl-struct-ses-cell cl-struct-sgml-tag cl-struct-slot-info cl-struct-slot-offset cl-struct-slot-value cl-struct-slot-value--inliner cl-struct-soap-binding cl-struct-soap-bound-operation cl-struct-soap-element cl-struct-soap-message cl-struct-soap-namespace cl-struct-soap-namespace-link cl-struct-soap-operation cl-struct-soap-port cl-struct-soap-port-type cl-struct-soap-wsdl cl-struct-soap-xs-attribute cl-struct-soap-xs-attribute-group cl-struct-soap-xs-basic-type cl-struct-soap-xs-complex-type cl-struct-soap-xs-element cl-struct-soap-xs-simple-type cl-struct-soap-xs-type cl-struct-timer cl-struct-uniquify-item cl-struct-url cl-struct-url-future cl-struct-url-queue cl-struct-vc-bzr-extra-fileinfo cl-struct-vc-dir-fileinfo cl-struct-vc-git-extra-fileinfo cl-struct-vc-hg-extra-fileinfo cl-struct-xref-elisp-location cl-typep--inliner comint-clear-buffer comment-line comment-make-bol-ws comment-quote-nested-default compare-windows-get-next-window compare-windows-get-recent-window compilation--make-message--cmacro compilation--message->end-loc--cmacro compilation--message->loc--cmacro compilation--message->type--cmacro compilation--message-p--cmacro compilation-beginning-of-line completion--category-override completion--post-self-insert compose-gstring-for-dotted-circle copy-cl--generic copy-cl--generic-generalizer copy-cl--generic-method copy-ses--locprn copy-soap-xs-attribute copy-soap-xs-attribute-group copy-soap-xs-basic-type copy-soap-xs-complex-type copy-soap-xs-element copy-soap-xs-simple-type copy-soap-xs-type copy-xref-elisp-location cps--add-binding cps--add-state cps--advance-for cps--atomic-p cps--define-unsupported cps--find-special-form-handler cps--gensym cps--handle-loop-for cps--initialize-for cps--make-atomic-state cps--make-catch-wrapper cps--make-close-iterator-form cps--make-condition-wrapper cps--make-dynamic-binding-wrapper cps--make-unwind-wrapper cps--replace-variable-references cps--special-form-p cps--trace cps--trace-funcall cps--transform-1 cps--with-dynamic-binding cps--with-value-wrapper cps-generate-evaluator css--complete-at-rule css--complete-property css--complete-pseudo-element-or-class css--font-lock-keywords css-adaptive-fill css-completion-at-point cua--extract-rectangle-bounds cursor-intangible-mode cursor-sensor--detect cursor-sensor--intangible-p cursor-sensor--move-to-tangible cursor-sensor-mode cursor-sensor-move-to-tangible cursor-sensor-tangible-pos custom-prompt-customize-unsaved-options custom-unsaved-options cvs-fileinfo->base-rev--cmacro cvs-fileinfo->dir--cmacro cvs-fileinfo->file--cmacro cvs-fileinfo->full-log--cmacro cvs-fileinfo->head-rev--cmacro cvs-fileinfo->marked--cmacro cvs-fileinfo->merge--cmacro cvs-fileinfo->subtype--cmacro cvs-fileinfo->type--cmacro cvs-fileinfo-p--cmacro cvs-flags-defaults--cmacro cvs-flags-desc--cmacro cvs-flags-hist-sym--cmacro cvs-flags-p--cmacro cvs-flags-persist--cmacro cvs-flags-qtypedesc--cmacro cvs-qtypedesc-complete--cmacro cvs-qtypedesc-create--cmacro cvs-qtypedesc-hist-sym--cmacro cvs-qtypedesc-obj2str--cmacro cvs-qtypedesc-p--cmacro cvs-qtypedesc-require--cmacro cvs-qtypedesc-str2obj--cmacro cvs-tag->name--cmacro cvs-tag->type--cmacro cvs-tag->vlist--cmacro cvs-tag-make--cmacro cvs-tag-p--cmacro dbus-peer-handler default-font-width define-advice define-inline delete-selection-uses-region-p describe-char-eldoc describe-char-eldoc--format describe-char-eldoc--truncate describe-mode-local-overload describe-symbol diary-chinese-anniversary diary-chinese-insert-anniversary-entry diary-chinese-insert-entry diary-chinese-insert-monthly-entry diary-chinese-insert-yearly-entry diary-chinese-list-entries diary-chinese-mark-entries diff-kill-applied-hunks directory-files-recursively directory-name-p dired-do-compress-to dired-do-find-regexp dired-do-find-regexp-and-replace dired-shell-command dired-x--string-to-number display-buffer-use-some-frame dns-servers-up-to-date-p dom-add-child-before dom-append-child dom-attr dom-attributes dom-by-class dom-by-id dom-by-style dom-by-tag dom-child-by-tag dom-children dom-elements dom-ensure-node dom-node dom-non-text-children dom-parent dom-pp dom-previous-sibling dom-set-attribute dom-set-attributes dom-strings dom-tag dom-text dom-texts downcase-dwim ebrowse-bs-file--cmacro ebrowse-bs-flags--cmacro ebrowse-bs-name--cmacro ebrowse-bs-p--cmacro ebrowse-bs-pattern--cmacro ebrowse-bs-point--cmacro ebrowse-bs-scope--cmacro ebrowse-cs-file--cmacro ebrowse-cs-flags--cmacro ebrowse-cs-name--cmacro ebrowse-cs-p--cmacro ebrowse-cs-pattern--cmacro ebrowse-cs-point--cmacro ebrowse-cs-scope--cmacro ebrowse-cs-source-file--cmacro ebrowse-hs-command-line-options--cmacro ebrowse-hs-member-table--cmacro ebrowse-hs-p--cmacro ebrowse-hs-unused--cmacro ebrowse-hs-version--cmacro ebrowse-ms-definition-file--cmacro ebrowse-ms-definition-pattern--cmacro ebrowse-ms-definition-point--cmacro ebrowse-ms-file--cmacro ebrowse-ms-flags--cmacro ebrowse-ms-name--cmacro ebrowse-ms-p--cmacro ebrowse-ms-pattern--cmacro ebrowse-ms-point--cmacro ebrowse-ms-scope--cmacro ebrowse-ms-visibility--cmacro ebrowse-position-file-name--cmacro ebrowse-position-info--cmacro ebrowse-position-p--cmacro ebrowse-position-point--cmacro ebrowse-position-target--cmacro ebrowse-ts-base-classes--cmacro ebrowse-ts-class--cmacro ebrowse-ts-friends--cmacro ebrowse-ts-mark--cmacro ebrowse-ts-member-functions--cmacro ebrowse-ts-member-variables--cmacro ebrowse-ts-p--cmacro ebrowse-ts-static-functions--cmacro ebrowse-ts-static-variables--cmacro ebrowse-ts-subclasses--cmacro ebrowse-ts-types--cmacro ede--detect-ldf-predicate ede--detect-ldf-root-predicate ede--detect-ldf-rootonly-predicate ede--detect-scan-directory-for-project ede--detect-scan-directory-for-project-root ede--detect-scan-directory-for-rootonly-project ede--detect-stop-scan-p ede--directory-project-add-description-to-hash ede--directory-project-from-hash ede-auto-detect-in-dir ede-delete-project-from-global-list ede-detect-directory-for-project ede-detect-qtest ede-directory-project-cons ede-global-list-sanity-check ede-project--anon-cmacro ede-project--eieio-childp ede-project-autoload--anon-cmacro ede-project-autoload--eieio-childp ede-project-autoload-dirmatch--anon-cmacro ede-project-autoload-dirmatch--eieio-childp ede-project-placeholder--anon-cmacro ede-project-placeholder--eieio-childp ede-show-supported-projects ede-sourcecode--anon-cmacro ede-sourcecode--eieio-childp ede-target--anon-cmacro ede-target--eieio-childp edebug--display-1 edebug--form-data-begin--cmacro edebug--form-data-end--cmacro edebug--form-data-name--cmacro edebug--make-form-data-entry--cmacro edebug--read edebug-set-initial-mode eieio--add-new-slot eieio--c3-candidate eieio--c3-merge-lists eieio--class-children--cmacro eieio--class-class-allocation-values--cmacro eieio--class-class-slots eieio--class-class-slots--cmacro eieio--class-constructor eieio--class-default-object-cache--cmacro eieio--class-docstring eieio--class-docstring--cmacro eieio--class-index-table eieio--class-index-table--cmacro eieio--class-initarg-tuples--cmacro eieio--class-make eieio--class-make--cmacro eieio--class-method-invocation-order eieio--class-name eieio--class-name--cmacro eieio--class-object eieio--class-option eieio--class-option-assoc eieio--class-options--cmacro eieio--class-p eieio--class-p--cmacro eieio--class-parents eieio--class-parents--cmacro eieio--class-precedence-bfs eieio--class-precedence-c3 eieio--class-precedence-dfs eieio--class-precedence-list eieio--class-print-name eieio--class-slot-initarg eieio--class-slot-name-index eieio--class-slots eieio--class-slots--cmacro eieio--class/struct-parents eieio--generic-static-symbol-specializers eieio--generic-subclass-specializers eieio--initarg-to-attribute eieio--object-class-tag eieio--object-class-tag--cmacro eieio--pcase-macroexpander eieio--perform-slot-validation eieio--perform-slot-validation-for-default eieio--slot-name-index eieio--slot-override eieio--validate-class-slot-value eieio--validate-slot-value eieio-class-slots eieio-class-tag--auth-source-backend eieio-class-tag--chart eieio-class-tag--chart-axis eieio-class-tag--chart-axis-names eieio-class-tag--chart-axis-range eieio-class-tag--chart-bar eieio-class-tag--chart-sequece eieio-class-tag--ede-project eieio-class-tag--ede-project-autoload eieio-class-tag--ede-project-autoload-dirmatch eieio-class-tag--ede-project-placeholder eieio-class-tag--ede-sourcecode eieio-class-tag--ede-target eieio-class-tag--eieio-default-superclass eieio-class-tag--eieio-instance-inheritor eieio-class-tag--eieio-instance-tracker eieio-class-tag--eieio-named eieio-class-tag--eieio-persistent eieio-class-tag--eieio-singleton eieio-class-tag--eieio-speedbar eieio-class-tag--eieio-speedbar-directory-button eieio-class-tag--eieio-speedbar-file-button eieio-class-tag--eieio-widget-test-class eieio-class-tag--gnus-icalendar-event eieio-class-tag--gnus-icalendar-event-cancel eieio-class-tag--gnus-icalendar-event-reply eieio-class-tag--gnus-icalendar-event-request eieio-class-tag--registry-db eieio-class-tag--xref-bogus-location eieio-class-tag--xref-buffer-location eieio-class-tag--xref-etags-location eieio-class-tag--xref-file-location eieio-class-tag--xref-item eieio-class-tag--xref-location eieio-class-tag--xref-match-item eieio-default-superclass--eieio-childp eieio-defclass-internal eieio-instance-inheritor--eieio-childp eieio-instance-tracker--eieio-childp eieio-make-child-predicate eieio-make-class-predicate eieio-named--eieio-childp eieio-oref--anon-cmacro eieio-pcase-slot-index-from-index-table eieio-pcase-slot-index-table eieio-persistent--eieio-childp eieio-singleton--eieio-childp eieio-slot-descriptor-name eieio-speedbar--eieio-childp eieio-speedbar-directory-button--eieio-childp eieio-speedbar-file-button--eieio-childp eieio-widget-test-class--anon-cmacro eieio-widget-test-class--eieio-childp electric--insertable-p electric-pair-local-mode electric-quote-local-mode electric-quote-mode electric-quote-post-self-insert-function elisp--beginning-of-sexp elisp--byte-code-comment elisp--company-doc-buffer elisp--company-doc-string elisp--company-location elisp--current-symbol elisp--docstring-first-line elisp--eval-defun elisp--eval-defun-1 elisp--eval-last-sexp elisp--eval-last-sexp-print-value elisp--expect-function-p elisp--fnsym-in-current-sexp elisp--font-lock-flush-elisp-buffers elisp--form-quoted-p elisp--highlight-function-argument elisp--last-data-store elisp--local-variables elisp--local-variables-1 elisp--preceding-sexp elisp--xref-backend elisp--xref-find-definitions elisp--xref-make-xref elisp-byte-code-mode elisp-byte-code-syntax-propertize elisp-completion-at-point elisp-eldoc-documentation-function elisp-function-argstring elisp-get-fnsym-args-string elisp-get-var-docstring elisp-last-sexp-toggle-display elisp-load-path-roots emacs-lisp-macroexpand emacs-repository--version-git-1 emacs-repository-version-git epa-display-error epg--gv-nreverse epg-config--make-gpg-configuration epg-config--make-gpgsm-configuration epg-context--make epg-context-armor--cmacro epg-context-cipher-algorithm--cmacro epg-context-compress-algorithm--cmacro epg-context-digest-algorithm--cmacro epg-context-edit-callback epg-context-edit-callback--cmacro epg-context-error-buffer epg-context-error-buffer--cmacro epg-context-error-output epg-context-error-output--cmacro epg-context-home-directory--cmacro epg-context-include-certs--cmacro epg-context-operation--cmacro epg-context-output-file--cmacro epg-context-passphrase-callback--cmacro epg-context-pinentry-mode--cmacro epg-context-process--cmacro epg-context-program--cmacro epg-context-progress-callback--cmacro epg-context-protocol--cmacro epg-context-result--cmacro epg-context-sig-notations--cmacro epg-context-signers--cmacro epg-context-textmode--cmacro epg-data-file--cmacro epg-data-string--cmacro epg-edit-key epg-find-configuration epg-import-result-considered--cmacro epg-import-result-imported--cmacro epg-import-result-imported-rsa--cmacro epg-import-result-imports--cmacro epg-import-result-new-revocations--cmacro epg-import-result-new-signatures--cmacro epg-import-result-new-sub-keys--cmacro epg-import-result-new-user-ids--cmacro epg-import-result-no-user-id--cmacro epg-import-result-not-imported--cmacro epg-import-result-secret-imported--cmacro epg-import-result-secret-read--cmacro epg-import-result-secret-unchanged--cmacro epg-import-result-unchanged--cmacro epg-import-status-fingerprint--cmacro epg-import-status-new--cmacro epg-import-status-reason--cmacro epg-import-status-secret--cmacro epg-import-status-signature--cmacro epg-import-status-sub-key--cmacro epg-import-status-user-id--cmacro epg-key-owner-trust--cmacro epg-key-signature-class--cmacro epg-key-signature-creation-time--cmacro epg-key-signature-expiration-time--cmacro epg-key-signature-exportable-p--cmacro epg-key-signature-key-id--cmacro epg-key-signature-pubkey-algorithm--cmacro epg-key-signature-user-id--cmacro epg-key-signature-validity--cmacro epg-key-sub-key-list--cmacro epg-key-user-id-list--cmacro epg-make-data-from-file--cmacro epg-make-data-from-string--cmacro epg-make-import-result--cmacro epg-make-import-status--cmacro epg-make-key--cmacro epg-make-key-signature--cmacro epg-make-new-signature--cmacro epg-make-sig-notation--cmacro epg-make-signature--cmacro epg-make-sub-key--cmacro epg-make-user-id--cmacro epg-new-signature-class--cmacro epg-new-signature-creation-time--cmacro epg-new-signature-digest-algorithm--cmacro epg-new-signature-fingerprint--cmacro epg-new-signature-pubkey-algorithm--cmacro epg-new-signature-type--cmacro epg-sig-notation-critical--cmacro epg-sig-notation-human-readable--cmacro epg-sig-notation-name--cmacro epg-sig-notation-value--cmacro epg-signature-class--cmacro epg-signature-creation-time--cmacro epg-signature-digest-algorithm--cmacro epg-signature-expiration-time--cmacro epg-signature-fingerprint--cmacro epg-signature-key-id--cmacro epg-signature-notations epg-signature-notations--cmacro epg-signature-pubkey-algorithm--cmacro epg-signature-status--cmacro epg-signature-validity--cmacro epg-signature-version--cmacro epg-start-edit-key epg-sub-key-algorithm--cmacro epg-sub-key-capability--cmacro epg-sub-key-creation-time--cmacro epg-sub-key-expiration-time--cmacro epg-sub-key-fingerprint--cmacro epg-sub-key-id--cmacro epg-sub-key-length--cmacro epg-sub-key-secret-p--cmacro epg-sub-key-validity--cmacro epg-user-id-signature-list--cmacro epg-user-id-string--cmacro epg-user-id-validity--cmacro erc--buffer-p erc-add-targets erc-bounds-of-word-at-point erc-channel-user-admin--cmacro erc-channel-user-halfop--cmacro erc-channel-user-last-message-time--cmacro erc-channel-user-op--cmacro erc-channel-user-owner--cmacro erc-channel-user-p--cmacro erc-channel-user-voice--cmacro erc-forward-word erc-open-network-stream erc-response-p--cmacro erc-response\.command--cmacro erc-response\.command-args--cmacro erc-response\.contents--cmacro erc-response\.sender--cmacro erc-response\.unparsed--cmacro erc-server-delayed-reconnect erc-server-user-buffers--cmacro erc-server-user-full-name--cmacro erc-server-user-host--cmacro erc-server-user-info--cmacro erc-server-user-login--cmacro erc-server-user-nickname--cmacro erc-server-user-p--cmacro erc-switch-to-buffer erc-word-at-arg-p ert--ewoc-entry-expanded-p--cmacro ert--ewoc-entry-extended-printer-limits-p--cmacro ert--ewoc-entry-hidden-p--cmacro ert--ewoc-entry-p--cmacro ert--ewoc-entry-test--cmacro ert--stats-aborted-p--cmacro ert--stats-current-test--cmacro ert--stats-end-time--cmacro ert--stats-failed-expected--cmacro ert--stats-failed-unexpected--cmacro ert--stats-next-redisplay--cmacro ert--stats-p--cmacro ert--stats-passed-expected--cmacro ert--stats-passed-unexpected--cmacro ert--stats-selector--cmacro ert--stats-skipped--cmacro ert--stats-start-time--cmacro ert--stats-test-end-times--cmacro ert--stats-test-map--cmacro ert--stats-test-results--cmacro ert--stats-test-start-times--cmacro ert--stats-tests--cmacro ert--test-execution-info-ert-debug-on-error--cmacro ert--test-execution-info-exit-continuation--cmacro ert--test-execution-info-next-debugger--cmacro ert--test-execution-info-p--cmacro ert--test-execution-info-result--cmacro ert--test-execution-info-test--cmacro ert-summarize-tests-batch-and-exit ert-test-aborted-with-non-local-exit-messages--cmacro ert-test-aborted-with-non-local-exit-p--cmacro ert-test-aborted-with-non-local-exit-should-forms--cmacro ert-test-body--cmacro ert-test-documentation--cmacro ert-test-expected-result-type--cmacro ert-test-failed-backtrace--cmacro ert-test-failed-condition--cmacro ert-test-failed-infos--cmacro ert-test-failed-messages--cmacro ert-test-failed-p--cmacro ert-test-failed-should-forms--cmacro ert-test-most-recent-result--cmacro ert-test-name--cmacro ert-test-p--cmacro ert-test-passed-messages--cmacro ert-test-passed-p--cmacro ert-test-passed-should-forms--cmacro ert-test-quit-backtrace--cmacro ert-test-quit-condition--cmacro ert-test-quit-infos--cmacro ert-test-quit-messages--cmacro ert-test-quit-p--cmacro ert-test-quit-should-forms--cmacro ert-test-result-messages--cmacro ert-test-result-p--cmacro ert-test-result-should-forms--cmacro ert-test-result-with-condition-backtrace--cmacro ert-test-result-with-condition-condition--cmacro ert-test-result-with-condition-infos--cmacro ert-test-result-with-condition-messages--cmacro ert-test-result-with-condition-p--cmacro ert-test-result-with-condition-should-forms--cmacro ert-test-skipped-backtrace--cmacro ert-test-skipped-condition--cmacro ert-test-skipped-infos--cmacro ert-test-skipped-messages--cmacro ert-test-skipped-p--cmacro ert-test-skipped-should-forms--cmacro ert-test-tags--cmacro eshell/clear eshell/clear-scrollback etags--xref-backend etags--xref-find-definitions eudc--using-bbdb-3-or-newer-p eudc-bbdb-field eudc-bbdbify-company eval-after-load--anon-cmacro ewoc--buffer--cmacro ewoc--create--cmacro ewoc--dll--cmacro ewoc--footer--cmacro ewoc--header--cmacro ewoc--hf-pp--cmacro ewoc--last-node--cmacro ewoc--node-create--cmacro ewoc--node-data--cmacro ewoc--node-left--cmacro ewoc--node-right--cmacro ewoc--node-start-marker--cmacro ewoc--pretty-printer--cmacro ewoc-p--cmacro eww-buffer-kill eww-buffer-select eww-buffer-show eww-buffer-show-next eww-buffer-show-previous eww-buffers-mode eww-current-url eww-decode-url-file-name eww-desktop-data-1 eww-desktop-history-duplicate eww-desktop-misc-data eww-display-pdf eww-form-file eww-highest-readability eww-html-p eww-isearch-next-buffer eww-links-at-point eww-list-buffers eww-readable eww-restore-desktop eww-score-readability eww-search-words eww-select-file eww-set-character-encoding eww-size-text-inputs eww-suggested-uris eww-tag-meta eww-toggle-fonts eww-toggle-paragraph-direction execute-extended-command--shorter execute-extended-command--shorter-1 extract-rectangle-bounds face-list-p faces--attribute-at-point file-notify--event-watched-file file-notify--rm-descriptor file-notify-valid-p filepos-to-bufferpos filepos-to-bufferpos--dos files--message find-function-library find-function-on-key-do-it find-function-on-key-other-frame find-function-on-key-other-window find-tag--default flymake-ler-file--cmacro flymake-ler-full-file--cmacro flymake-ler-line--cmacro flymake-ler-make-ler--cmacro flymake-ler-p--cmacro flymake-ler-text--cmacro flymake-ler-type--cmacro follow-after-change follow-get-scrolled-point follow-move-to-window-line follow-pos-visible-in-window-p follow-scroll-down-arg follow-scroll-down-window follow-scroll-up-arg follow-scroll-up-window follow-set-window-start follow-window-end follow-window-start font-lock--remove-face-from-text-property font-lock-ensure font-lock-flush format-message forward-word-strictly frame--size-history frame-after-make-frame frame-creation-function frame-edges frame-geometry frame-position frame-scroll-bar-height frame-total-lines frame-windows-min-size frameset--make--cmacro frameset--print-register frameset-app--cmacro frameset-description--cmacro frameset-name--cmacro frameset-p--cmacro frameset-properties--cmacro frameset-states--cmacro frameset-timestamp--cmacro frameset-version--cmacro funcall-interactively gdb-handler-function--cmacro gdb-handler-p--cmacro gdb-handler-pending-trigger--cmacro gdb-handler-token-number--cmacro gdb-mi-decode gdb-table-column-sizes--cmacro gdb-table-p--cmacro gdb-table-right-align--cmacro gdb-table-row-properties--cmacro gdb-table-rows--cmacro global-eldoc-mode gmm-format-time-string gnus--insert-random-face-with-type gnus--random-face-with-type gnus-article-mime-handles gnus-bind-mm-vars gnus-cloud-add-timestamps gnus-cloud-all-files gnus-cloud-available-chunks gnus-cloud-chunk-sequence gnus-cloud-collect-full-newsrc gnus-cloud-decode-data gnus-cloud-delete-file gnus-cloud-download-data gnus-cloud-encode-data gnus-cloud-ensure-cloud-group gnus-cloud-file-covered-p gnus-cloud-file-new-p gnus-cloud-files-to-upload gnus-cloud-insert-data gnus-cloud-make-chunk gnus-cloud-parse-chunk gnus-cloud-parse-version-1 gnus-cloud-prune-old-chunks gnus-cloud-replace-file gnus-cloud-server-p gnus-cloud-update-data gnus-cloud-update-file gnus-cloud-upload-data gnus-format-message gnus-group--setup-tool-bar-update gnus-icalendar-event--anon-cmacro gnus-icalendar-event--eieio-childp gnus-icalendar-event-cancel--anon-cmacro gnus-icalendar-event-cancel--eieio-childp gnus-icalendar-event-reply--anon-cmacro gnus-icalendar-event-reply--eieio-childp gnus-icalendar-event-request--anon-cmacro gnus-icalendar-event-request--eieio-childp gnus-insert-random-face-header gnus-mime-buttonize-attachments-in-header gnus-random-face gnus-registry-load gnus-registry-sort-by-creation-time gnus-request-group-scan gnus-server-toggle-cloud-server gnus-setdiff gnus-subsetp gnus-summary-open-group-with-article gnus-test-list gnutls-peer-status gnutls-peer-status-warning-describe gnutls-trustfiles gud-guiler-marker-filter gui--selection-value-internal gui--valid-simple-selection-p gui-backend-get-selection gui-backend-selection-exists-p gui-backend-selection-owner-p gui-backend-set-selection gui-get-primary-selection gui-get-selection gui-select-text gui-selection-value gui-set-selection guiler gv-delay-error gv-setter gv-synthetic-place handle-args-function hash-table-empty-p he--all-buffers help--binding-locus help--docstring-quote help--key-binding-keymap help--make-usage help--make-usage-docstring help-fns--interactive-only help-fns-short-filename hif-add-new-defines hif-canonicalize-tokens hif-clear-all-ifdef-defined hif-define-macro hif-define-operator hif-delimit hif-evaluate-macro hif-evaluate-region hif-expand-token-list hif-find-define hif-flatten hif-get-argument-list hif-if-valid-identifier-p hif-invoke hif-looking-at-elif hif-macro-supply-arguments hif-merge-ifdef-region hif-parse-exp hif-parse-macro-arglist hif-place-macro-invocation hif-range-elif hif-string-concatenation hif-string-to-number hif-stringify hif-token-concat hif-token-concatenation hif-token-stringification hif-undefine-symbol horizontal-scroll-bar-mode horizontal-scroll-bars-available-p html-html5-template html-navigational-links ibuffer-get-region-and-prefix ibuffer-mark-region-or-n-with-char icalendar--clean-up-line-endings icalendar--create-ical-alarm icalendar--do-create-ical-alarm icomplete-force-complete-and-exit ido-bury-buffer-at-head if-let image-kill-buffer image-transform-reset imenu-unavailable-error indent--default-inside-comment info--prettify-description inline--alwaysconst-p inline--alwaysconst-val inline--do-leteval inline--do-letlisteval inline--do-quote inline--dont-leteval inline--dont-letlisteval inline--dont-quote inline--error inline--getconst-val inline--leteval inline--letlisteval inline--testconst-p inline--warning inline-const-p inline-const-val inline-error inline-letevals inline-quote inotify-valid-p intern-safe internal--build-binding internal--build-binding-value-form internal--build-bindings internal--check-binding internal--compiler-macro-cXXr internal--listify internal--module-call internal--syntax-propertize internal--thread-argument internal--track-mouse internal-char-font internal-echo-keystrokes-prefix isearch--describe-regexp-mode isearch--describe-word-mode isearch--lax-regexp-function-p isearch--momentary-message isearch--state-barrier--cmacro isearch--state-case-fold-search--cmacro isearch--state-error--cmacro isearch--state-forward--cmacro isearch--state-message--cmacro isearch--state-other-end--cmacro isearch--state-p--cmacro isearch--state-point--cmacro isearch--state-pop-fun--cmacro isearch--state-string--cmacro isearch--state-success--cmacro isearch--state-word--cmacro isearch--state-wrapped--cmacro isearch-define-mode-toggle isearch-toggle-char-fold isearch-xterm-paste ispell--\\w-filter ispell--make-\\w-expression ispell--make-filename-or-URL-re ispell-display-buffer ispell-hunspell-add-multi-dic iter-close iter-defun iter-do iter-lambda iter-next iter-yield iter-yield-from jit-lock--run-functions js--as-sgml js--expression-in-sgml-indent-line js--js-handle-id--cmacro js--js-handle-p--cmacro js--js-handle-process--cmacro js--jsx-find-before-tag js--jsx-indented-element-p js--maybe-goto-declaration-keyword-end js--pitem-b-end--cmacro js--pitem-children--cmacro js--pitem-h-begin--cmacro js--pitem-name--cmacro js--pitem-paren-depth--cmacro js--pitem-type--cmacro js-jsx-indent-line js-jsx-mode json--check-position json--plist-reverse json--plist-to-alist json--record-path json-path-to-position json-pretty-print-buffer-ordered json-pretty-print-ordered landmark--distance landmark--intangible landmark-calc-distance-of-robot-from landmark-calc-smell-internal ldap-password-read let-alist let-alist--access-sexp let-alist--deep-dot-search let-alist--list-to-sexp let-alist--remove-dot let-when-compile line-substring-with-bidi-context linum--face-width lisp--el-match-keyword lisp--el-non-funcall-position-p lisp--match-hidden-arg lisp-eval-form-and-next lisp-eval-paragraph lisp-extended-loop-p lisp-indent-find-method lisp-string-after-doc-keyword-p lisp-string-in-doc-position-p log-edit-changelog--pattern lookup-key-ignore-too-long ls-lisp-version-lessp m4--quoted-p macroexp-let2* macroexp-macroexpand macroexp-parse-body macroexp-quote macroexpand-1 mail-combine-fields mailcap-view-mime make-ebrowse-bs--cmacro make-ebrowse-cs--cmacro make-ebrowse-hs--cmacro make-ebrowse-ms--cmacro make-ebrowse-position--cmacro make-ebrowse-ts--cmacro make-erc-channel-user--cmacro make-erc-response--cmacro make-erc-server-user--cmacro make-ert--ewoc-entry--cmacro make-ert--stats--cmacro make-ert--test-execution-info--cmacro make-ert-test--cmacro make-ert-test-aborted-with-non-local-exit--cmacro make-ert-test-failed--cmacro make-ert-test-passed--cmacro make-ert-test-quit--cmacro make-ert-test-result--cmacro make-ert-test-result-with-condition--cmacro make-ert-test-skipped--cmacro make-finalizer make-gdb-handler--cmacro make-gdb-table--cmacro make-js--js-handle--cmacro make-js--pitem--cmacro make-nnimap--cmacro make-nnmaildir--art--cmacro make-nnmaildir--grp--cmacro make-nnmaildir--srv--cmacro make-package--ac-desc--cmacro make-package--bi-desc--cmacro make-pipe-process make-process make-ses--locprn make-ses--locprn--cmacro make-sgml-tag--cmacro make-soap-binding--cmacro make-soap-bound-operation--cmacro make-soap-element--cmacro make-soap-message--cmacro make-soap-namespace--cmacro make-soap-namespace-link--cmacro make-soap-operation--cmacro make-soap-port--cmacro make-soap-port-type--cmacro make-soap-xs-attribute make-soap-xs-attribute--cmacro make-soap-xs-attribute-group make-soap-xs-attribute-group--cmacro make-soap-xs-basic-type make-soap-xs-basic-type--cmacro make-soap-xs-complex-type make-soap-xs-complex-type--cmacro make-soap-xs-element make-soap-xs-element--cmacro make-soap-xs-simple-type make-soap-xs-simple-type--cmacro make-soap-xs-type make-soap-xs-type--cmacro make-tar-header--cmacro make-url-future--cmacro make-url-queue--cmacro make-vc-bzr-extra-fileinfo--cmacro make-vc-dir-fileinfo--cmacro make-vc-git-extra-fileinfo--cmacro make-vc-hg-extra-fileinfo--cmacro make-xref-elisp-location make-xref-elisp-location--cmacro map--apply-alist map--apply-array map--apply-hash-table map--into-hash-table map--make-pcase-bindings map--make-pcase-patterns map--pcase-macroexpander map--put map-apply map-contains-key map-copy map-delete map-elt map-empty-p map-every-p map-filter map-into map-keys map-keys-apply map-length map-let map-merge map-merge-with map-nested-elt map-pairs map-put map-remove map-some map-values map-values-apply mapp math-number-regexp memory-info menu-bar-bottom-and-right-window-divider menu-bar-bottom-window-divider menu-bar-buffer-vector menu-bar-goto-uses-etags-p menu-bar-horizontal-scroll-bar menu-bar-no-horizontal-scroll-bar menu-bar-no-window-divider menu-bar-right-window-divider menu-bar-window-divider-customize message--syntax-propertize message-make-html-message-with-image-files message-toggle-image-thumbnails message-window-inside-pixel-edges mh-flet midnight-mode minibuffer-prompt-properties--setter misearch-unload-function mm-head-p mm-url-encode-multipart-form-data mml-expand-html-into-multipart-related mml-secure-add-secret-key-id mml-secure-bcc-is-safe mml-secure-cache-expiry-interval mml-secure-cache-passphrase-p mml-secure-check-sub-key mml-secure-check-user-id mml-secure-clear-secret-key-id-list mml-secure-cust-fpr-lookup mml-secure-cust-record-keys mml-secure-cust-remove-keys mml-secure-cust-usage-lookup mml-secure-epg-encrypt mml-secure-epg-sign mml-secure-filter-keys mml-secure-find-usable-keys mml-secure-fingerprint mml-secure-is-encrypted-p mml-secure-normalize-cust-name mml-secure-passphrase-callback mml-secure-recipients mml-secure-secret-key-exists-p mml-secure-select-keys mml-secure-select-keys-1 mml-secure-select-preferred-keys mml-secure-self-recipients mml-secure-signer-names mml-secure-signers module-load mouse-absolute-pixel-position mouse-buffer-menu-keymap mouse-buffer-menu-map mouse-sel--ignore move-to-window-group-line mpc-cmd-consume mpc-cmd-random mpc-cmd-repeat mpc-cmd-seekcur mpc-cmd-single mpc-seek-current mpc-toggle-consume mpc-toggle-play mpc-toggle-repeat mpc-toggle-shuffle mpc-toggle-single mule--ucs-names-annotation multi-isearch-unload-function net-utils--executable-find-sbin newsticker--do-xml-workarounds newsticker--get-group-names newsticker--get-icon-url-atom-1\.0 newsticker--group-do-find-group newsticker--group-do-rename-group newsticker--group-find-parent-group newsticker--group-names newsticker--group-shift newsticker--icon-read newsticker--icons-dir newsticker--image-download-by-url newsticker--image-download-by-url-callback newsticker--image-download-by-wget newsticker--image-remove newsticker--image-save newsticker--tree-widget-icon-create newsticker--treeview-do-get-node-by-id newsticker--treeview-get-node-by-id newsticker--treeview-tree-open-menu newsticker--unxml newsticker--unxml-attribute newsticker--unxml-node newsticker-group-rename-group newsticker-group-shift-feed-down newsticker-group-shift-feed-up newsticker-group-shift-group-down newsticker-group-shift-group-up next-line-or-history-element nnimap-capabilities--cmacro nnimap-commands--cmacro nnimap-encode-gnus-group nnimap-examined--cmacro nnimap-greeting--cmacro nnimap-group--cmacro nnimap-initial-resync--cmacro nnimap-last-command-time--cmacro nnimap-newlinep--cmacro nnimap-p--cmacro nnimap-process--cmacro nnimap-request-articles nnimap-request-group-scan nnimap-select-result--cmacro nnimap-server--cmacro nnimap-stream-type--cmacro nnmail-get-new-mail-per-group nnmaildir--art-msgid--cmacro nnmaildir--art-nov--cmacro nnmaildir--art-num--cmacro nnmaildir--art-p--cmacro nnmaildir--art-prefix--cmacro nnmaildir--art-suffix--cmacro nnmaildir--grp-cache--cmacro nnmaildir--grp-count--cmacro nnmaildir--grp-cur--cmacro nnmaildir--grp-flist--cmacro nnmaildir--grp-index--cmacro nnmaildir--grp-min--cmacro nnmaildir--grp-mlist--cmacro nnmaildir--grp-mmth--cmacro nnmaildir--grp-name--cmacro nnmaildir--grp-new--cmacro nnmaildir--grp-nlist--cmacro nnmaildir--grp-p--cmacro nnmaildir--srv-address--cmacro nnmaildir--srv-curgrp--cmacro nnmaildir--srv-dir--cmacro nnmaildir--srv-error--cmacro nnmaildir--srv-gnm--cmacro nnmaildir--srv-groups--cmacro nnmaildir--srv-ls--cmacro nnmaildir--srv-method--cmacro nnmaildir--srv-mtime--cmacro nnmaildir--srv-p--cmacro nnmaildir--srv-prefix--cmacro nnmaildir--srv-target-prefix--cmacro nsm-certificate-part nsm-check-certificate nsm-check-plain-connection nsm-check-protocol nsm-check-tls-connection nsm-fingerprint nsm-fingerprint-ok-p nsm-format-certificate nsm-host-settings nsm-id nsm-level nsm-new-fingerprint-ok-p nsm-parse-subject nsm-query nsm-query-user nsm-read-settings nsm-remove-permanent-setting nsm-remove-temporary-setting nsm-save-host nsm-verify-connection nsm-warnings-ok-p nsm-write-settings ntlm-compute-timestamp ntlm-generate-nonce nxml-comment-quote-nested obarray-get obarray-make obarray-map obarray-put obarray-remove obarrayp occur-regexp-descr octave-smie--end-index-p octave-smie--funcall-p octave-smie--in-parens-p org-export-backend-blocks--cmacro org-export-backend-filters--cmacro org-export-backend-menu--cmacro org-export-backend-name--cmacro org-export-backend-options--cmacro org-export-backend-p--cmacro org-export-backend-parent--cmacro org-export-backend-transcoders--cmacro org-export-create-backend--cmacro org-font-lock-ensure outline-hide-body outline-hide-entry outline-hide-leaves outline-hide-other outline-hide-region-body outline-hide-sublevels outline-hide-subtree outline-show-all outline-show-branches outline-show-children outline-show-entry outline-show-subtree package--ac-desc-extras--cmacro package--ac-desc-kind--cmacro package--ac-desc-reqs--cmacro package--ac-desc-summary--cmacro package--ac-desc-version--cmacro package--activate-autoloads-and-load-path package--add-to-compatibility-table package--append-to-alist package--autoloads-file-name package--bi-desc-reqs--cmacro package--bi-desc-summary--cmacro package--bi-desc-version--cmacro package--build-compatibility-table package--check-signature-content package--display-verify-error package--download-and-read-archives package--ensure-init-file package--find-non-dependencies package--get-deps package--incompatible-p package--list-loaded-files package--load-files-for-activation package--newest-p package--prettify-quick-help-key package--print-help-section package--read-pkg-desc package--removable-packages package--remove-hidden package--save-selected-packages package--sort-by-dependence package--sort-deps-in-alist package--update-downloads-in-progress package--update-selected-packages package--used-elsewhere-p package--user-selected-p package--with-response-buffer package-archive-priority package-autoremove package-delete-button-action package-desc-archive--cmacro package-desc-create--cmacro package-desc-dir--cmacro package-desc-extras--cmacro package-desc-kind--cmacro package-desc-name--cmacro package-desc-p--cmacro package-desc-priority package-desc-priority-version package-desc-reqs--cmacro package-desc-signed--cmacro package-desc-summary--cmacro package-desc-version--cmacro package-dir-info package-install-selected-packages package-make-ac-desc--cmacro package-make-builtin--cmacro package-menu--find-and-notify-upgrades package-menu--list-to-prompt package-menu--mark-or-notify-upgrades package-menu--mark-upgrades-1 package-menu--partition-transaction package-menu--perform-transaction package-menu--populate-new-package-list package-menu--post-refresh package-menu--print-info-simple package-menu--prompt-transaction-p package-menu-hide-package package-menu-mode-menu package-menu-toggle-hiding package-reinstall parse-iso8601-time-string pcase--app-subst-match pcase--app-subst-rest pcase--edebug-match-macro pcase--eval pcase--flip pcase--funcall pcase--macroexpand pcase--make-docstring pcase--match pcase-defmacro pcase-exhaustive pcase-lambda pinentry--error-code pinentry--escape-string pinentry--labels-to-shortcuts pinentry--process-filter pinentry--process-sentinel pinentry--prompt pinentry--send-data pinentry--send-error pinentry--unescape-string pinentry-prompt-mode pinentry-start pinentry-stop pos-visible-in-window-group-p prefix-command-preserve-state prefix-command-update prettify-symbols--post-command-hook prettify-symbols-default-compose-p previous-line-or-history-element process-menu-delete-process profiler-calltree-children--cmacro profiler-calltree-count--cmacro profiler-calltree-count-percent--cmacro profiler-calltree-entry--cmacro profiler-calltree-p--cmacro profiler-calltree-parent--cmacro profiler-make-calltree--cmacro profiler-make-profile--cmacro profiler-profile-diff-p--cmacro profiler-profile-log--cmacro profiler-profile-tag--cmacro profiler-profile-timestamp--cmacro profiler-profile-type--cmacro profiler-profile-version--cmacro project--completing-read-strict project--find-in-directory project--find-regexp-in project--read-regexp project--value-in-dir project-combine-directories project-current project-external-roots project-file-completion-table project-find-file project-find-file-in project-find-regexp project-ignores project-or-external-find-file project-or-external-find-regexp project-roots project-subtract-directories project-try-ede project-try-vc ps-mode--syntax-propertize-special ps-mode-smie-rules ps-mode-syntax-propertize ps-samp-ps-setup pulse-tick python-comint-postoutput-scroll-to-bottom python-completion-at-point python-eldoc--get-symbol-at-point python-font-lock-syntactic-face-function python-hideshow-forward-sexp-function python-info-assignment-statement-p python-info-docstring-p python-mark-defun python-rx python-shell--add-to-path-with-priority python-shell-accept-process-output python-shell-calculate-command python-shell-calculate-pythonpath python-shell-comint-end-of-output-p python-shell-comint-watch-for-first-prompt-output-filter python-shell-completion-at-point python-shell-completion-native-get-completions python-shell-completion-native-interpreter-disabled-p python-shell-completion-native-setup python-shell-completion-native-toggle python-shell-completion-native-try python-shell-completion-native-turn-off python-shell-completion-native-turn-on python-shell-completion-native-turn-on-maybe python-shell-completion-native-turn-on-maybe-with-msg python-shell-font-lock-cleanup-buffer python-shell-font-lock-comint-output-filter-function python-shell-font-lock-get-or-create-buffer python-shell-font-lock-kill-buffer python-shell-font-lock-post-command-hook python-shell-font-lock-toggle python-shell-font-lock-turn-off python-shell-font-lock-turn-on python-shell-font-lock-with-font-lock-buffer python-shell-get-process-or-error python-shell-package-enable python-shell-tramp-refresh-process-environment python-shell-tramp-refresh-remote-path python-shell-with-environment python-shell-with-shell-buffer python-skeleton-import python-syntax--context-compiler-macro python-util-comint-last-prompt python-util-list-directories python-util-list-files python-util-list-packages query-replace--split-string rcirc-bury-buffers rcirc-cmd-reconnect recenter-window-group rectangle--*-char rectangle--col-pos rectangle--crutches rectangle--default-line-number-format rectangle--insert-region rectangle--place-cursor rectangle--point-col rectangle--pos-cols rectangle--reset-crutches rectangle--space-to rectangle--string-erase-preview rectangle--string-flush-preview rectangle--string-preview rectangle-backward-char rectangle-exchange-point-and-mark rectangle-forward-char rectangle-left-char rectangle-next-line rectangle-previous-line rectangle-right-char redisplay--pre-redisplay-functions reftex--query-search-regexps region-noncontiguous-p registerv--make--cmacro registerv-data--cmacro registerv-insert-func--cmacro registerv-jump-func--cmacro registerv-p--cmacro registerv-print-func--cmacro registry-collect-prune-candidates registry-db--anon-cmacro registry-db--eieio-childp rgrep-default-command rmail--decode-and-apply rmail-epa-decrypt-1 rmail-mime-fix-inserted-faces rmail-mime-insert-html rmail-mime-render-html-lynx rmail-mime-render-html-shr rmail-summary-msg-number rng--ipattern-child--cmacro rng--ipattern-index--cmacro rng--ipattern-memo-end-tag-deriv--cmacro rng--ipattern-memo-map-data-deriv--cmacro rng--ipattern-memo-map-start-attribute-deriv--cmacro rng--ipattern-memo-map-start-tag-open-deriv--cmacro rng--ipattern-memo-mixed-text-deriv--cmacro rng--ipattern-memo-start-tag-close-deriv--cmacro rng--ipattern-memo-text-only-deriv--cmacro rng--ipattern-memo-text-typed--cmacro rng--ipattern-name-class--cmacro rng--ipattern-nullable--cmacro rng--ipattern-type--cmacro rng-make-ipattern--cmacro rtree-normalize-range ruby--inverse-string-quote ruby--string-region ruby-smie--before-method-name ruby-string-at-point-p ruby-syntax-propertize ruby-toggle-string-quotes ruby-verify-heredoc sasl-scram--authenticate-server sasl-scram--client-final-message sasl-scram--client-first-message-bare sasl-scram-client-first-message sasl-scram-sha-1-authenticate-server sasl-scram-sha-1-client-final-message save-mark-and-excursion save-mark-and-excursion--restore save-mark-and-excursion--save save-place--setup-hooks save-place-local-mode save-place-mode scroll-bar-horizontal-drag scroll-bar-horizontal-drag-1 scroll-bar-lines scroll-bar-toolkit-horizontal-scroll scss-mode scss-smie--not-interpolation-p seconds-to-string selected-window-group semantic-analyze-completion-at-point-function semantic-analyze-nolongprefix-completion-at-point-function semantic-analyze-notc-completion-at-point-function semantic-debug semantic-ia-complete-symbol-menu seq--activate-font-lock-keywords seq--count-successive seq--elt-safe seq--make-pcase-bindings seq--make-pcase-patterns seq--pcase-macroexpander seq-concatenate seq-contains seq-copy seq-count seq-difference seq-do seq-doseq seq-drop seq-drop-while seq-each seq-elt seq-empty-p seq-every-p seq-filter seq-find seq-group-by seq-intersection seq-into seq-into-sequence seq-length seq-let seq-map seq-mapcat seq-mapn seq-max seq-min seq-partition seq-position seq-reduce seq-remove seq-reverse seq-some seq-sort seq-subseq seq-take seq-take-while seq-uniq seqp ses--cell ses--cell-at-pos ses--curcell ses--cursor-sensor-highlight ses--letref ses--local-printer ses--locprn-compiled ses--locprn-compiled--cmacro ses--locprn-def ses--locprn-def--cmacro ses--locprn-local-printer-list ses--locprn-local-printer-list--cmacro ses--locprn-number ses--locprn-number--cmacro ses--locprn-p ses--locprn-p--cmacro ses--metaprogramming ses--mode-line-process ses--time-check ses--unbind-cell-name ses-cell--formula ses-cell--formula--cmacro ses-cell--printer ses-cell--printer--cmacro ses-cell--properties ses-cell--properties--cmacro ses-cell--references ses-cell--references--cmacro ses-cell--symbol ses-cell--symbol--cmacro ses-cell-property ses-define-local-printer ses-file-format-extend-parameter-list ses-killbuffer-hook ses-local-printer-compile ses-make-cell--cmacro ses-make-local-printer-info ses-plist-delq ses-refresh-local-printer ses-setter-with-undo set-binary-mode set-mouse-absolute-pixel-position set-window-group-start sgml-cursor-sensor sgml-make-tag--cmacro sgml-tag-end--cmacro sgml-tag-name--cmacro sgml-tag-p--cmacro sgml-tag-start--cmacro sgml-tag-type--cmacro sh-after-hack-local-variables sh-smie--indent-continuation show-paren--categorize-paren show-paren--locate-near-paren show-paren--unescaped-p shr--have-one-fringe-p shr-char-breakable-p--inliner shr-char-kinsoku-bol-p--inliner shr-char-kinsoku-eol-p--inliner shr-char-nospace-p--inliner shr-dom-max-natural-width shr-dom-print shr-expand-alignments shr-face-background shr-fill-line shr-fill-lines shr-fill-text shr-fontize-dom shr-mark-fill shr-pixel-buffer-width shr-pixel-column shr-pixel-region shr-render-td-1 shr-string-pixel-width shr-table-body shr-tag-html shr-tag-tt shr-vertical-motion smerge-swap smie-config--guess-1 smie-indent--current-column smie-indent-empty-line snarf-bruces soap-binding-name--cmacro soap-binding-namespace-tag--cmacro soap-binding-operations--cmacro soap-binding-p--cmacro soap-binding-port-type--cmacro soap-bound-operation-operation--cmacro soap-bound-operation-p--cmacro soap-bound-operation-soap-action--cmacro soap-bound-operation-soap-body soap-bound-operation-soap-body--cmacro soap-bound-operation-soap-headers soap-bound-operation-soap-headers--cmacro soap-bound-operation-use--cmacro soap-copy-wsdl soap-decode-date-time soap-decode-xs-attributes soap-decode-xs-basic-type soap-decode-xs-complex-type soap-decode-xs-element soap-decode-xs-simple-type soap-element-name--cmacro soap-element-namespace-tag--cmacro soap-element-p--cmacro soap-encode-attributes soap-encode-xs-basic-type soap-encode-xs-basic-type-attributes soap-encode-xs-complex-type soap-encode-xs-complex-type-attributes soap-encode-xs-element soap-encode-xs-element-attributes soap-encode-xs-simple-type soap-encode-xs-simple-type-attributes soap-fetch-xml soap-fetch-xml-from-file soap-fetch-xml-from-url soap-get-candidate-elements soap-get-xs-attributes soap-get-xs-attributes-from-groups soap-inspect-xs-attribute soap-inspect-xs-attribute-group soap-inspect-xs-basic-type soap-inspect-xs-complex-type soap-inspect-xs-element soap-inspect-xs-simple-type soap-invoke-async soap-invoke-internal soap-make-wsdl soap-make-wsdl^ soap-make-wsdl^--cmacro soap-make-xs-basic-types soap-message-name--cmacro soap-message-namespace-tag--cmacro soap-message-p--cmacro soap-message-parts--cmacro soap-name-p soap-namespace-elements--cmacro soap-namespace-link-name--cmacro soap-namespace-link-namespace-tag--cmacro soap-namespace-link-p--cmacro soap-namespace-link-target--cmacro soap-namespace-name--cmacro soap-namespace-p--cmacro soap-node-multiple soap-node-optional soap-operation-faults--cmacro soap-operation-input--cmacro soap-operation-input-action soap-operation-input-action--cmacro soap-operation-name--cmacro soap-operation-namespace-tag--cmacro soap-operation-output--cmacro soap-operation-output-action soap-operation-output-action--cmacro soap-operation-p--cmacro soap-operation-parameter-order--cmacro soap-parse-server-response soap-parse-wsdl-phase-fetch-imports soap-parse-wsdl-phase-fetch-schema soap-parse-wsdl-phase-finish-parsing soap-parse-wsdl-phase-parse-schema soap-parse-wsdl-phase-validate-node soap-port-binding--cmacro soap-port-name--cmacro soap-port-namespace-tag--cmacro soap-port-p--cmacro soap-port-service-url--cmacro soap-port-type-name--cmacro soap-port-type-namespace-tag--cmacro soap-port-type-operations--cmacro soap-port-type-p--cmacro soap-resolve-references soap-resolve-references-for-xs-attribute soap-resolve-references-for-xs-attribute-group soap-resolve-references-for-xs-complex-type soap-resolve-references-for-xs-element soap-resolve-references-for-xs-simple-type soap-sample-value-for-xs-attribute soap-sample-value-for-xs-attribute-group soap-sample-value-for-xs-basic-type soap-sample-value-for-xs-complex-type soap-sample-value-for-xs-element soap-sample-value-for-xs-simple-type soap-should-encode-value-for-xs-element soap-type-is-array\? soap-validate-xs-basic-type soap-validate-xs-simple-type soap-wsdl-alias-table--cmacro soap-wsdl-current-file soap-wsdl-current-file--cmacro soap-wsdl-namespaces--cmacro soap-wsdl-origin--cmacro soap-wsdl-p--cmacro soap-wsdl-ports--cmacro soap-wsdl-xmlschema-imports soap-wsdl-xmlschema-imports--cmacro soap-xml-get-children-fq soap-xml-node-find-matching-child soap-xs-add-extension soap-xs-add-list soap-xs-add-restriction soap-xs-add-union soap-xs-attribute-default soap-xs-attribute-default--cmacro soap-xs-attribute-group-attribute-groups soap-xs-attribute-group-attribute-groups--cmacro soap-xs-attribute-group-attributes soap-xs-attribute-group-attributes--cmacro soap-xs-attribute-group-id soap-xs-attribute-group-id--cmacro soap-xs-attribute-group-name soap-xs-attribute-group-name--cmacro soap-xs-attribute-group-namespace-tag soap-xs-attribute-group-namespace-tag--cmacro soap-xs-attribute-group-p soap-xs-attribute-group-p--cmacro soap-xs-attribute-group-reference soap-xs-attribute-group-reference--cmacro soap-xs-attribute-name soap-xs-attribute-name--cmacro soap-xs-attribute-namespace-tag soap-xs-attribute-namespace-tag--cmacro soap-xs-attribute-p soap-xs-attribute-p--cmacro soap-xs-attribute-reference soap-xs-attribute-reference--cmacro soap-xs-attribute-type soap-xs-attribute-type--cmacro soap-xs-basic-type-attribute-groups soap-xs-basic-type-attribute-groups--cmacro soap-xs-basic-type-attributes soap-xs-basic-type-attributes--cmacro soap-xs-basic-type-id soap-xs-basic-type-id--cmacro soap-xs-basic-type-kind soap-xs-basic-type-kind--cmacro soap-xs-basic-type-name soap-xs-basic-type-name--cmacro soap-xs-basic-type-namespace-tag soap-xs-basic-type-namespace-tag--cmacro soap-xs-basic-type-p soap-xs-basic-type-p--cmacro soap-xs-complex-type-attribute-groups soap-xs-complex-type-attribute-groups--cmacro soap-xs-complex-type-attributes soap-xs-complex-type-attributes--cmacro soap-xs-complex-type-base soap-xs-complex-type-base--cmacro soap-xs-complex-type-elements soap-xs-complex-type-elements--cmacro soap-xs-complex-type-id soap-xs-complex-type-id--cmacro soap-xs-complex-type-indicator soap-xs-complex-type-indicator--cmacro soap-xs-complex-type-is-group soap-xs-complex-type-is-group--cmacro soap-xs-complex-type-multiple-p soap-xs-complex-type-multiple\? soap-xs-complex-type-multiple\?--cmacro soap-xs-complex-type-name soap-xs-complex-type-name--cmacro soap-xs-complex-type-namespace-tag soap-xs-complex-type-namespace-tag--cmacro soap-xs-complex-type-optional-p soap-xs-complex-type-optional\? soap-xs-complex-type-optional\?--cmacro soap-xs-complex-type-p soap-xs-complex-type-p--cmacro soap-xs-element-alternatives soap-xs-element-alternatives--cmacro soap-xs-element-get-fq-name soap-xs-element-id soap-xs-element-id--cmacro soap-xs-element-is-group soap-xs-element-is-group--cmacro soap-xs-element-multiple\? soap-xs-element-multiple\?--cmacro soap-xs-element-name soap-xs-element-name--cmacro soap-xs-element-namespace-tag soap-xs-element-namespace-tag--cmacro soap-xs-element-optional\? soap-xs-element-optional\?--cmacro soap-xs-element-p soap-xs-element-p--cmacro soap-xs-element-reference soap-xs-element-reference--cmacro soap-xs-element-substitution-group soap-xs-element-substitution-group--cmacro soap-xs-element-type soap-xs-element-type^ soap-xs-element-type^--cmacro soap-xs-parse-attribute soap-xs-parse-attribute-group soap-xs-parse-complex-type soap-xs-parse-element soap-xs-parse-extension-or-restriction soap-xs-parse-sequence soap-xs-parse-simple-type soap-xs-simple-type-attribute-groups soap-xs-simple-type-attribute-groups--cmacro soap-xs-simple-type-attributes soap-xs-simple-type-attributes--cmacro soap-xs-simple-type-base soap-xs-simple-type-base--cmacro soap-xs-simple-type-enumeration soap-xs-simple-type-enumeration--cmacro soap-xs-simple-type-id soap-xs-simple-type-id--cmacro soap-xs-simple-type-integer-range soap-xs-simple-type-integer-range--cmacro soap-xs-simple-type-is-list soap-xs-simple-type-is-list--cmacro soap-xs-simple-type-length-range soap-xs-simple-type-length-range--cmacro soap-xs-simple-type-name soap-xs-simple-type-name--cmacro soap-xs-simple-type-namespace-tag soap-xs-simple-type-namespace-tag--cmacro soap-xs-simple-type-p soap-xs-simple-type-p--cmacro soap-xs-simple-type-pattern soap-xs-simple-type-pattern--cmacro soap-xs-type-attribute-groups soap-xs-type-attribute-groups--cmacro soap-xs-type-attributes soap-xs-type-attributes--cmacro soap-xs-type-id soap-xs-type-id--cmacro soap-xs-type-name soap-xs-type-name--cmacro soap-xs-type-namespace-tag soap-xs-type-namespace-tag--cmacro soap-xs-type-p soap-xs-type-p--cmacro sql-comint-vertica sql-highlight-vertica-keywords sql-send-line-and-next sql-vertica squeeze-bidi-context squeeze-bidi-context-1 startup--setup-quote-display string-collate-equalp string-collate-lessp string-greaterp string> subword-find-word-boundary subword-setup-buffer suspicious-object table--point-entered/left-cell-function tabulated-list--get-sorter tar--pad-to tar--put-at tar-current-position tar-header-checksum--cmacro tar-header-data-start--cmacro tar-header-date--cmacro tar-header-dmaj--cmacro tar-header-dmin--cmacro tar-header-gid--cmacro tar-header-gname--cmacro tar-header-header-start--cmacro tar-header-link-name--cmacro tar-header-link-type--cmacro tar-header-magic--cmacro tar-header-mode--cmacro tar-header-name--cmacro tar-header-p--cmacro tar-header-serialize tar-header-size--cmacro tar-header-uid--cmacro tar-header-uname--cmacro tar-new-entry tar-new-regular-file-header tear-off-window testcover--read tetris-move-down tex--prettify-symbols-compose-p text-scale-max-amount text-scale-min-amount thing-at-point--beginning-of-sexp thing-at-point--end-of-sexp thing-at-point--read-from-whole-string thread-first thread-last thunk-delay thunk-evaluated-p thunk-force tildify--deprecated-ignore-evironments tildify--find-env tildify--foreach-region tildify--pick-alist-entry tildify-foreach-ignore-environments tildify-mode tildify-space tildify-space-region-predicate time-date--day-in-year time-stamp--format timer--args--cmacro timer--function--cmacro timer--high-seconds--cmacro timer--idle-delay--cmacro timer--low-seconds--cmacro timer--psecs--cmacro timer--repeat-delay--cmacro timer--triggered--cmacro timer--usecs--cmacro timer-create--cmacro tls-format-message tramp-adb-get-device tramp-call-process-region tramp-compat-delete-dups tramp-get-env-with-u-option tramp-get-local-locale tramp-get-ls-command-with-quoting-style tramp-get-ls-command-with-w-option tramp-handle-file-equal-p tramp-handle-file-in-directory-p tramp-handle-file-notify-valid-p tramp-repository-get-version tramp-sh-gvfs-monitor-dir-process-filter tramp-sh-inotifywait-process-filter tramp-ssh-controlmaster-options undo-adjust-beg-end undo-adjust-elt undo-adjust-pos undo-auto--add-boundary undo-auto--boundaries undo-auto--boundary-ensure-timer undo-auto--boundary-timer undo-auto--ensure-boundary undo-auto--last-boundary-amalgamating-number undo-auto--needs-boundary-p undo-auto--undoable-change undo-auto--undoable-change-no-timer undo-auto-amalgamate uniquify-item-base--cmacro uniquify-item-buffer--cmacro uniquify-item-dirname--cmacro uniquify-item-p--cmacro uniquify-item-proposed--cmacro uniquify-make-item--cmacro universal-argument--description universal-argument--preserve upcase-dwim url-attributes--cmacro url-cookie-create--cmacro url-cookie-domain--cmacro url-cookie-expires--cmacro url-cookie-localpart--cmacro url-cookie-name--cmacro url-cookie-p--cmacro url-cookie-secure--cmacro url-cookie-value--cmacro url-dav-http-success-p--inliner url-filename--cmacro url-fullness--cmacro url-future-callback--cmacro url-future-cancelled-p--inliner url-future-completed-p--inliner url-future-done-p--inliner url-future-errorback--cmacro url-future-errored-p--inliner url-future-p--cmacro url-future-status--cmacro url-future-value--cmacro url-host--cmacro url-http--encode-string url-insert-buffer-contents url-p--cmacro url-parse-make-urlobj--cmacro url-password--cmacro url-portspec--cmacro url-queue-buffer--cmacro url-queue-callback--cmacro url-queue-cbargs--cmacro url-queue-inhibit-cookiesp--cmacro url-queue-p--cmacro url-queue-pre-triggered--cmacro url-queue-silentp--cmacro url-queue-start-time--cmacro url-queue-url--cmacro url-silent--cmacro url-target--cmacro url-tramp-convert-tramp-to-url url-tramp-convert-url-to-tramp url-tramp-file-handler url-type--cmacro url-use-cookies--cmacro url-user--cmacro user-ptrp vc-arch-dir-status-files vc-bzr--pushpull vc-bzr-create-extra-fileinfo--cmacro vc-bzr-extra-fileinfo->extra-name--cmacro vc-bzr-extra-fileinfo-p--cmacro vc-bzr-push vc-bzr-version-dirstate vc-cvs-merge-file vc-dir-create-fileinfo--cmacro vc-dir-display-file vc-dir-fileinfo->directory--cmacro vc-dir-fileinfo->extra--cmacro vc-dir-fileinfo->marked--cmacro vc-dir-fileinfo->name--cmacro vc-dir-fileinfo->needs-update--cmacro vc-dir-fileinfo->state--cmacro vc-filewise-registered vc-git--pushpull vc-git--symbolic-ref vc-git-conflicted-files vc-git-create-extra-fileinfo--cmacro vc-git-extra-fileinfo->new-perm--cmacro vc-git-extra-fileinfo->old-perm--cmacro vc-git-extra-fileinfo->orig-name--cmacro vc-git-extra-fileinfo->rename-state--cmacro vc-git-extra-fileinfo-p--cmacro vc-git-find-file-hook vc-git-push vc-git-region-history vc-git-region-history-font-lock vc-git-region-history-mode vc-git-resolve-when-done vc-hg--pushpull vc-hg-create-extra-fileinfo--cmacro vc-hg-create-tag vc-hg-extra-fileinfo->extra-name--cmacro vc-hg-extra-fileinfo->rename-state--cmacro vc-hg-extra-fileinfo-p--cmacro vc-hg-retrieve-tag vc-master-name vc-message-unresolved-conflicts vc-mtn-dir-status-files vc-mtn-find-ignore-file vc-push vc-rcs-dir-status-files vc-rcs-merge-file vc-refresh-state vc-region-history vc-root-dir vc-sccs-dir-status-files vc-src-checkin vc-src-checkout vc-src-checkout-model vc-src-command vc-src-create-repo vc-src-diff vc-src-dir-status-files vc-src-find-revision vc-src-modify-change-comment vc-src-print-log vc-src-register vc-src-registered vc-src-rename-file vc-src-responsible-p vc-src-revert vc-src-revision-granularity vc-src-state vc-src-working-revision vc-svn-merge-file verilog-auto-insert-last verilog-in-deferred-immediate-final-p verilog-looking-back verilog-read-auto-template-init verilog-signals-not-in-struct vhdl-adelete vhdl-aget vhdl-aput-delete-if-nil vhdl-beginning-of-directive vhdl-template-context vhdl-template-context-hook warn-maybe-out-of-memory when-let whitespace-point--flush-used whitespace-point--used window--adjust-process-windows window--even-window-sizes window--min-size-ignore-p window--preservable-size window--preserve-size window--process-window-list window--sanitize-window-sizes window--side-window-p window-absolute-body-pixel-edges window-absolute-pixel-position window-adjust-process-window-size window-adjust-process-window-size-largest window-adjust-process-window-size-smallest window-body-edges window-body-pixel-edges window-divider-mode window-divider-mode-apply window-divider-width-valid-p window-font-height window-font-width window-group-end window-group-start window-max-chars-per-line window-min-pixel-size window-old-point window-preserve-size window-preserved-size window-scroll-bar-height window-system-initialization with-displayed-buffer-window with-file-modes x-select-text xref--alistify xref--analyze xref--buf-pairs-iterator xref--collect-matches xref--collect-matches-1 xref--convert-hits xref--find-buffer-visiting xref--find-definitions xref--find-ignores-arguments xref--find-xrefs xref--goto-char xref--goto-location xref--insert-propertized xref--insert-xrefs xref--item-at-point xref--mouse-2 xref--next-error-function xref--outdated-p xref--pop-to-location xref--prompt-p xref--query-replace-1 xref--read-identifier xref--regexp-to-extended xref--rgrep-command xref--search-property xref--show-location xref--show-pos-in-buf xref--show-xref-buffer xref--show-xrefs xref--with-dedicated-window xref--xref-buffer-mode xref-backend-apropos xref-backend-definitions xref-backend-identifier-at-point xref-backend-identifier-completion-table xref-backend-references xref-bogus-location xref-bogus-location--anon-cmacro xref-bogus-location--eieio-childp xref-bogus-location-child-p xref-bogus-location-list-p xref-bogus-location-message xref-bogus-location-p xref-buffer-location xref-buffer-location--anon-cmacro xref-buffer-location--eieio-childp xref-buffer-location-child-p xref-buffer-location-list-p xref-buffer-location-p xref-clear-marker-stack xref-collect-matches xref-collect-references xref-elisp-location-file xref-elisp-location-file--cmacro xref-elisp-location-p xref-elisp-location-p--cmacro xref-elisp-location-symbol xref-elisp-location-symbol--cmacro xref-elisp-location-type xref-elisp-location-type--cmacro xref-etags-location xref-etags-location--anon-cmacro xref-etags-location--eieio-childp xref-etags-location-child-p xref-etags-location-list-p xref-etags-location-p xref-etags-mode xref-file-location xref-file-location--anon-cmacro xref-file-location--eieio-childp xref-file-location-child-p xref-file-location-column xref-file-location-list-p xref-file-location-p xref-find-apropos xref-find-backend xref-find-definitions xref-find-definitions-other-frame xref-find-definitions-other-window xref-find-references xref-goto-xref xref-item xref-item--anon-cmacro xref-item--eieio-childp xref-item-child-p xref-item-list-p xref-item-location xref-item-p xref-item-summary xref-location xref-location--anon-cmacro xref-location--eieio-childp xref-location-child-p xref-location-group xref-location-line xref-location-list-p xref-location-marker xref-location-p xref-make xref-make-bogus-location xref-make-buffer-location xref-make-elisp-location xref-make-elisp-location--cmacro xref-make-etags-location xref-make-file-location xref-make-match xref-marker-stack-empty-p xref-match-item xref-match-item--anon-cmacro xref-match-item--eieio-childp xref-match-item-child-p xref-match-item-list-p xref-match-item-p xref-match-length xref-mode-local--override-present xref-mode-local-find-override xref-mode-local-overload xref-next-line xref-pop-marker-stack xref-prev-line xref-pulse-momentarily xref-push-marker-stack xref-query-replace-in-results xref-show-location-at-point xterm-mouse--read-coordinate xterm-mouse--read-event-sequence xterm-mouse--read-number-from-terminal xterm-mouse--set-click-count xterm-mouse--tracking-sequence xterm-mouse-tracking-disable-sequence xterm-mouse-tracking-enable-sequence xwidget-adjust-size-to-content xwidget-at xwidget-cleanup xwidget-delete-zombies xwidget-event-handler xwidget-get xwidget-insert xwidget-kill-buffer-query-function xwidget-log xwidget-put xwidget-webkit-adjust-size xwidget-webkit-adjust-size-dispatch xwidget-webkit-adjust-size-to-content xwidget-webkit-adjust-size-to-window xwidget-webkit-back xwidget-webkit-begin-edit-textarea xwidget-webkit-bookmark-make-record xwidget-webkit-browse-url xwidget-webkit-callback xwidget-webkit-copy-selection-as-kill xwidget-webkit-current-session xwidget-webkit-current-url xwidget-webkit-end-edit-textarea xwidget-webkit-execute-script-rv xwidget-webkit-fit-width xwidget-webkit-get-selection xwidget-webkit-goto-url xwidget-webkit-insert-string xwidget-webkit-last-session xwidget-webkit-mode xwidget-webkit-new-session xwidget-webkit-reload xwidget-webkit-scroll-backward xwidget-webkit-scroll-down xwidget-webkit-scroll-forward xwidget-webkit-scroll-up xwidget-webkit-show-id-element xwidget-webkit-show-id-or-named-element xwidget-webkit-show-named-element zerop--anon-cmacro)) - (variables - (removed :PRIMARY :STATIC :bgcolor :changed :cols :colspan :cowrote :disabled :element-type :fc-unknown-spec :fgcolor :href :nillable\? :poster :rel :rowspan :wrote abbreviated-calendar-year all-bahai-calendar-holidays all-christian-calendar-holidays all-hebrew-calendar-holidays all-islamic-calendar-holidays american-calendar-display-form american-date-diary-pattern authors-aliases authors-ambiguous-files authors-coding-system authors-fixed-case authors-fixed-entries authors-ignored-files authors-lax-changelogs authors-many-files authors-no-scan-regexps authors-obsolete-files-regexps authors-public-domain-files authors-renamed-files-alist authors-renamed-files-regexps authors-valid-file-names bahai-diary-entry-symbol bahai-holidays c-font-lock-maybe-decl-faces cal-menu-load-hook cal-x-load-hook calendar-after-frame-setup-hooks capitalized-find-word-boundary-function-table capitalized-words-mode capitalized-words-mode-hook cc-bytecomp-noruntime-functions chinese-calendar-celestial-stem chinese-calendar-daylight-savings-ends chinese-calendar-daylight-savings-ends-time chinese-calendar-daylight-savings-starts chinese-calendar-daylight-savings-starts-time chinese-calendar-daylight-time-offset chinese-calendar-daylight-time-zone-name chinese-calendar-location-name chinese-calendar-standard-time-zone-name chinese-calendar-terrestrial-branch chinese-calendar-time-zone christian-holidays cl-struct-soap-array-type-tags cl-struct-soap-basic-type-tags cl-struct-soap-sequence-element-tags cl-struct-soap-sequence-type-tags cl-struct-soap-simple-type-tags css-pseudo-ids diary-display-hook diary-face diary-sabbath-candles-minutes eieio--class-num-slots eieio--object-num-slots eieio--scoped-class-stack eieio-generic-call-arglst eieio-generic-call-key eieio-generic-call-methodname eieio-generic-call-next-method-list eieio-initializing-object eieio-pre-method-execution-functions eieio-pre-method-execution-hooks eieio-read-generic eieiomt-optimizing-obarray emacs-lisp-byte-code-mode-abbrev-table emacs-lisp-byte-code-mode-hook emacs-lisp-byte-code-mode-map emacs-lisp-byte-code-mode-syntax-table eshell-buffer-shorthand european-calendar-display-form european-calendar-style european-date-diary-pattern eval-last-sexp-fake-value eww-contents-url eww-current-dom eww-current-source eww-current-title eww-current-url eww-home-url eww-next-url eww-previous-url eww-start-url eww-up-url fancy-diary-buffer fancy-diary-font-lock-keywords file-notify--pending-events finder-font-lock-keywords font-lock-beginning-of-syntax-function frame-creation-function-alist general-holidays gnus-bbdb-lisp-directory gnus-emacs-lisp-directory gnus-gnus-lisp-directory gnus-mailcrypt-lisp-directory gnus-registry-max-pruned-entries gnus-use-bbdb gnus-use-installed-gnus gnus-use-installed-mailcrypt gnus-use-mailcrypt gnus-use-mhe gnus-use-rmail gnus-use-sc gnus-use-sendmail gnus-use-vm handle-args-function-alist hebrew-diary-entry-symbol hebrew-holidays hebrew-holidays-1 hebrew-holidays-2 hebrew-holidays-3 hebrew-holidays-4 holidays-in-diary-buffer ibuffer-prev-window-config ibuffer-restore-window-config-on-quit imap-ssl-program initial-calendar-window-hook internal--call-interactively islamic-diary-entry-symbol islamic-holidays kmacro-step-edit-prefix-commands lisp--local-variables-completion-table list-diary-entries-hook local-holidays mark-diary-entries-hook mark-diary-entries-in-calendar mark-holidays-in-calendar method-after method-before method-generic-after method-generic-before method-generic-primary method-num-lists method-num-slots method-primary method-static mm-inline-text-html-with-images mm-w3-setup mml-smime-epg-secret-key-id-list mml1991-epg-secret-key-id-list mml2015-epg-secret-key-id-list mouse-sel-has-been-enabled mouse-sel-original-interprogram-cut-function mouse-sel-original-interprogram-paste-function newsticker--download-logos nongregorian-diary-listing-hook nongregorian-diary-marking-hook number-of-diary-entries octave-begin-keywords octave-else-keywords octave-end-keywords octave-operator-table octave-smie-bnf-table oriental-holidays other-holidays parse-time-digits print-diary-entries-hook ps-mode-auto-indent python-shell-output-syntax-table sexp-diary-entry-symbol shr-inhibit-decoration shr-state solar-holidays table-cell-entered-state tildify-count today-invisible-calendar-hook today-visible-calendar-hook tool-bar-originally-present uniquify-ask-about-buffer-names-p vc-default-init-revision vc-disable-async-diff vc-keep-workfiles vc-mcvs-diff-switches vc-mcvs-global-switches vc-mcvs-header vc-mcvs-register-switches vc-mcvs-use-edit vc-mistrust-permissions vc-stay-local view-calendar-holidays-initially view-diary-entries-initially window-system-initialization-alist x-last-selected-text) - (added :alternatives :append :argument-precedence-order :async :attribute-groups :authors :certificate :certificate-security-level :cipher :cl--generic--under-construction :cleanup :close :combining-capability :comment :compiled :conditions :connection-type :current-file :def :diffie-hellman-prime-bits :do :error-form :eww-readability-score :fingerprint :from-end :full :get-finalizer :hashmap :history :home :if :if-not :indicator :input-action :inside-docstring :integer-range :is-group :is-list :issuer :json-path :key-exchange :length-range :local-printer-list :mac :maintainer :match-end :match-start :max-size :next :noerror :none :optional\? :output-action :partial :previous :public-key-algorithm :public-key-id :quick-object-witness-check :rc4 :reference :reload :resulttype :root-only :searchfor :searchscope :searchtype :ses--unbound :signature-algorithm :signature-sha1 :soap-body :soap-headers :ssl :stash-finalizer :stderr :subdir-only :substitution-group :symbol :tag-info :type^ :unencrypted :valid-from :valid-to :warn-unless-encrypted :warnings :xmlschema-imports :xwidget Info-mode-font-lock-keywords archive-visit-single-files auto-revert-buffers-counter auto-revert-buffers-counter-lockedout autoload-ensure-writable bidi-directional-controls-chars bidi-directional-non-controls-chars browse-url-chrome-arguments browse-url-chrome-program browse-url-conkeror-arguments browse-url-conkeror-new-window-is-buffer browse-url-conkeror-program bruce-phrase-default-count bruce-phrases-file byte-compile-new-defuns c--mapcan-status c-:$-multichar-token-regexp c-<>-notable-chars-re c->-op-without->-cont-regexp c-after-brace-list-key c-auto-ops-re c-haskell-op-re c-just-done-before-change c-lang--novalue c-maybe-decl-faces c-mode-bug-package c-modified-constant c-multichar->-op-not->>-regexp c-recognize-post-brace-list-type-p c-subword-mode c-typeof-key c-use-category calc-prefix-help-retry calendar-chinese-month-name-array calendar-weekend-days cfengine3-defun-full-re cfengine3-macro-regex char-fold-table check-declare-ext-errors checkdoc-package-keywords-flag cl--generic-cnm-sample cl--generic-combined-method-memoization cl--generic-derived-generalizer cl--generic-dispatchers cl--generic-eql-generalizer cl--generic-eql-used cl--generic-find-defgeneric-regexp cl--generic-head-generalizer cl--generic-head-used cl--generic-nnm-sample cl--generic-struct-generalizer cl--generic-t-generalizer cl--generic-typeof-generalizer cl--generic-typeof-types cl--labels-magic cl--struct-default-parent cl--typedef-regexp cl-digit-char-table cl-struct-avl-tree- cl-struct-avl-tree--node cl-struct-avl-tree--stack cl-struct-cl--class cl-struct-cl--class-tags cl-struct-cl--generic cl-struct-cl--generic-generalizer cl-struct-cl--generic-generalizer-tags cl-struct-cl--generic-method cl-struct-cl--generic-method-tags cl-struct-cl--generic-tags cl-struct-cl-slot-descriptor cl-struct-cl-slot-descriptor-tags cl-struct-cl-structure-class cl-struct-cl-structure-class-tags cl-struct-cl-structure-object cl-struct-cl-structure-object-tags cl-struct-compilation--message cl-struct-cvs-fileinfo cl-struct-cvs-flags cl-struct-cvs-qtypedesc cl-struct-cvs-tag cl-struct-edebug--form-data cl-struct-eieio--class cl-struct-eieio--class-tags cl-struct-eieio--object cl-struct-eieio--object-tags cl-struct-epg-context cl-struct-epg-context-tags cl-struct-epg-data cl-struct-epg-data-tags cl-struct-epg-import-result cl-struct-epg-import-result-tags cl-struct-epg-import-status cl-struct-epg-import-status-tags cl-struct-epg-key cl-struct-epg-key-signature cl-struct-epg-key-signature-tags cl-struct-epg-key-tags cl-struct-epg-new-signature cl-struct-epg-new-signature-tags cl-struct-epg-sig-notation cl-struct-epg-sig-notation-tags cl-struct-epg-signature cl-struct-epg-signature-tags cl-struct-epg-sub-key cl-struct-epg-sub-key-tags cl-struct-epg-user-id cl-struct-epg-user-id-tags cl-struct-erc-response cl-struct-ert--ewoc-entry cl-struct-ert--stats cl-struct-ert--test-execution-info cl-struct-ert-test cl-struct-ert-test-aborted-with-non-local-exit cl-struct-ert-test-failed cl-struct-ert-test-passed cl-struct-ert-test-quit cl-struct-ert-test-result cl-struct-ert-test-result-with-condition cl-struct-ert-test-skipped cl-struct-ewoc cl-struct-ewoc--node cl-struct-flymake-ler cl-struct-gdb-handler cl-struct-gdb-table cl-struct-isearch--state cl-struct-js--js-handle cl-struct-js--pitem cl-struct-nnimap cl-struct-nnmaildir--art cl-struct-nnmaildir--grp cl-struct-nnmaildir--srv cl-struct-org-export-backend cl-struct-package--ac-desc cl-struct-package--bi-desc cl-struct-package-desc cl-struct-profiler-calltree cl-struct-profiler-profile cl-struct-rng--ipattern cl-struct-ses--locprn cl-struct-ses--locprn-tags cl-struct-ses-cell cl-struct-ses-cell-tags cl-struct-sgml-tag cl-struct-soap-binding cl-struct-soap-bound-operation cl-struct-soap-element cl-struct-soap-message cl-struct-soap-namespace cl-struct-soap-namespace-link cl-struct-soap-operation cl-struct-soap-port cl-struct-soap-port-type cl-struct-soap-wsdl cl-struct-soap-xs-attribute cl-struct-soap-xs-attribute-group cl-struct-soap-xs-attribute-group-tags cl-struct-soap-xs-attribute-tags cl-struct-soap-xs-basic-type cl-struct-soap-xs-basic-type-tags cl-struct-soap-xs-complex-type cl-struct-soap-xs-complex-type-tags cl-struct-soap-xs-element cl-struct-soap-xs-element-tags cl-struct-soap-xs-simple-type cl-struct-soap-xs-simple-type-tags cl-struct-soap-xs-type cl-struct-soap-xs-type-tags cl-struct-timer cl-struct-uniquify-item cl-struct-url cl-struct-url-future cl-struct-url-queue cl-struct-vc-bzr-extra-fileinfo cl-struct-vc-dir-fileinfo cl-struct-vc-git-extra-fileinfo cl-struct-vc-hg-extra-fileinfo cl-struct-xref-elisp-location cl-struct-xref-elisp-location-tags comment-end-can-be-escaped comment-quote-nested-function compare-windows-get-window-function completion-category-defaults completion-separator-chars cps--bindings cps--cleanup-function cps--cleanup-table-symbol cps--dynamic-wrappers cps--state-symbol cps--states cps--value-symbol cps-inhibit-atomic-optimization cps-standard-special-forms css--uri-re css-bang-ids css-pseudo-class-ids css-pseudo-element-ids css-syntax-propertize-function cursor-intangible-mode cursor-intangible-mode-hook cursor-sensor-inhibit cursor-sensor-mode cursor-sensor-mode-hook describe-function-orig-buffer describe-symbol-backends desktop-io-file-version desktop-native-file-version desktop-var-serdes-funs diary-chinese-entry-symbol dired-compress-files-alist dns-servers-valid-for-interfaces ede--detect-found-project ede--detect-nomatch-auto ede-check-project-query-fcn edebug-initial-mode-alist eieio--generic-generalizer eieio--generic-static-object-generalizer eieio--generic-static-symbol-generalizer eieio--generic-subclass-generalizer eieio--known-slot-names eieio--object-names eieio-backward-compatibility eieio-class-tag--auth-source-backend eieio-class-tag--chart eieio-class-tag--chart-axis eieio-class-tag--chart-axis-names eieio-class-tag--chart-axis-range eieio-class-tag--chart-bar eieio-class-tag--chart-sequece eieio-class-tag--ede-project eieio-class-tag--ede-project-autoload eieio-class-tag--ede-project-autoload-dirmatch eieio-class-tag--ede-project-placeholder eieio-class-tag--ede-sourcecode eieio-class-tag--ede-target eieio-class-tag--eieio-default-superclass eieio-class-tag--eieio-instance-inheritor eieio-class-tag--eieio-instance-tracker eieio-class-tag--eieio-named eieio-class-tag--eieio-persistent eieio-class-tag--eieio-singleton eieio-class-tag--eieio-speedbar eieio-class-tag--eieio-speedbar-directory-button eieio-class-tag--eieio-speedbar-file-button eieio-class-tag--eieio-widget-test-class eieio-class-tag--gnus-icalendar-event eieio-class-tag--gnus-icalendar-event-cancel eieio-class-tag--gnus-icalendar-event-reply eieio-class-tag--gnus-icalendar-event-request eieio-class-tag--registry-db eieio-class-tag--xref-bogus-location eieio-class-tag--xref-buffer-location eieio-class-tag--xref-etags-location eieio-class-tag--xref-file-location eieio-class-tag--xref-item eieio-class-tag--xref-location eieio-class-tag--xref-match-item electric-pair-local-mode-hook electric-quote-comment electric-quote-local-mode-hook electric-quote-mode electric-quote-mode-hook electric-quote-paragraph electric-quote-string elisp--eldoc-last-data elisp--eval-last-sexp-fake-value elisp--local-variables-completion-table elisp--xref-format elisp--xref-format-extra elisp--xref-identifier-completion-table elisp-byte-code-mode-abbrev-table elisp-byte-code-mode-hook elisp-byte-code-mode-map elisp-byte-code-mode-syntax-table elisp-xref-find-def-functions epa-error-buffer epa-inhibit epa-pinentry-mode epg--configurations epg-config--program-alist epg-gpgconf-program erc-channel-hide-list erc-network-hide-list erc-notifications-bus eshell-destroy-buffer-when-process-dies etags--xref-limit etags-xref-find-definitions-tag-order even-window-sizes eww-after-render-hook eww-bookmarks-directory eww-buffers-mode-abbrev-table eww-buffers-mode-hook eww-buffers-mode-map eww-buffers-mode-syntax-table eww-data eww-desktop-data-save eww-desktop-remove-duplicates eww-history-limit eww-redirect-level eww-restore-desktop eww-restore-reload-prompt eww-submit-file eww-suggest-uris execute-extended-command--last-typed face--attributes-unspecified fast-but-imprecise-scrolling ffap-latex-guess-rules ffap-lax-url file-notify--pending-event find-alias-regexp find-feature-regexp follow-fixed-window follow-start-end-invalid font-lock-ensure-function font-lock-flush-function frame-inhibit-implied-resize frame-size-history gdb-display-io-nopopup gdb-mi-decode-strings global-eldoc-mode global-eldoc-mode-hook gnus-article-show-cursor gnus-cloud-covered-servers gnus-cloud-file-timestamps gnus-cloud-group-name gnus-cloud-method gnus-cloud-sequence gnus-cloud-synced-files gnus-cloud-version gnus-face-directory gnus-face-omit-files gnus-mime-display-attachment-buttons-in-header gnus-registry-default-sort-function gnus-registry-prune-factor gnus-save-newsrc-file-last-timestamp gnus-x-face-omit-files gud-guiler-command-name gud-guiler-history gud-guiler-lastfile gui--last-selected-text-clipboard gui--last-selected-text-primary help-window-old-frame hfy-optimizations hide-ifdef-env-backup hide-ifdef-exclude-define-regexp hide-ifdef-expand-reinclusion-protection hide-ifdef-header-regexp hif-define-regexp hif-elif-regexp hif-id-regexp hif-ifxdef-regexp hif-macro-expr-prefix-regexp hif-macroref-regexp hif-recurse-level hif-valid-token-list hif-white-regexp horizontal-scroll-bar horizontal-scroll-bar-mode horizontal-scroll-bar-mode-hook icalendar-export-alarms icalendar-export-sexp-enumerate-all icalendar-export-sexp-enumeration-days imenu--menubar-keymap inhibit-bidi-mirroring inhibit-message internal--funcall-interactively internal--text-quoting-flag internal--top-level-message isearch--current-buffer isearch-lazy-highlight-regexp-function isearch-lazy-highlight-window-group isearch-new-regexp-function isearch-new-word isearch-regexp-function ispell-update-post-hook js--jsx-after-tag-re js--jsx-end-tag-re js--prettify-symbols-alist js--syntax-propertize-regexp-syntax-table js-indent-first-init js-jsx-mode-abbrev-table js-jsx-mode-hook js-jsx-mode-map js-jsx-mode-syntax-table json--path json-encoding-object-sort-predicate json-post-element-read-function json-pre-element-read-function kill-append-merge-undo landmark--intangible-chars landmark--last-pos ldap-ldapsearch-password-prompt-regexp libgnutls-version lisp--mode-syntax-table lisp-indent-backquote-substitution-mode lisp-mode-symbol-regexp log-edit-rewrite-tiny-change ls-lisp-UCA-like-collation ls-lisp-use-string-collate m4-syntax-propertize macroexp--debug-eager macroexp--warned menu-bar-search-options-menu menu-bar-showhide-window-divider-menu message-forward-included-headers message-smileys midnight-mode-hook mm-html-blocked-images mm-html-inhibit-images mml-secure-fail-when-key-problem mml-secure-key-preferences mml-secure-openpgp-always-trust mml-secure-openpgp-encrypt-to-self mml-secure-openpgp-sign-with-sender mml-secure-openpgp-signers mml-secure-safe-bcc-list mml-secure-secret-key-id-list mml-secure-smime-encrypt-to-self mml-secure-smime-sign-with-sender mml-secure-smime-signers module-file-suffix mouse--drag-start-event mouse-autoselect-window-position-1 move-to-window-group-line-function narrow-to-defun-include-comments network-security-level newsticker-download-logos newsticker-treeview-date-format nsm-noninteractive nsm-permanent-host-settings nsm-save-host-names nsm-settings-file nsm-temporary-host-settings ntlm-compatibility-level obarray-default-size octave--block-offset-keywords out-of-memory-warning-percentage package--compatibility-table package--downloads-in-progress package--emacs-version-list package--init-file-ensured package--old-archive-priorities package--post-download-archives-hook package--quick-help-keys package-archive-priorities package-hidden-regexps package-menu--hide-packages package-menu--mark-upgrades-pending package-menu--old-archive-contents package-menu--transaction-status package-menu-async package-menu-hide-low-priority package-menu-mode-menu package-selected-packages parse-time-iso8601-regexp pcase--dontwarn-upats perl--syntax-exp-intro-keywords perl--syntax-exp-intro-regexp pinentry--connection-process-list pinentry--error-cancelled pinentry--error-not-confirmed pinentry--error-not-implemented pinentry--labels pinentry--prompt-buffer pinentry--read-point pinentry--server-process pinentry--set-label-commands pinentry--socket-dir pinentry-debug pinentry-debug-buffer pinentry-popup-prompt-window pinentry-prompt-mode-abbrev-table pinentry-prompt-mode-hook pinentry-prompt-mode-map pinentry-prompt-mode-syntax-table pinentry-prompt-window-height pos-visible-in-window-group-p-function pre-redisplay-functions prefix-command--last-echo prefix-command--needs-update prefix-command-echo-keystrokes-functions prefix-command-preserve-state-hook prettify-symbols--current-symbol-bounds prettify-symbols-compose-predicate prettify-symbols-unprettify-at-point project-find-functions project-vc-external-roots-function project-vc-ignores prolog-operator-chars ps-mode--string-syntax-table pulse-momentary-timer python--prettify-symbols-alist python-eldoc-function-timeout python-eldoc-function-timeout-permanent python-eldoc-get-doc python-indent-guess-indent-offset-verbose python-rx-constituents python-shell--first-prompt-received python-shell--first-prompt-received-output-buffer python-shell--font-lock-buffer python-shell--package-depth python-shell-completion-native-disabled-interpreters python-shell-completion-native-enable python-shell-completion-native-output-timeout python-shell-completion-native-redirect-buffer python-shell-completion-native-try-output-timeout python-shell-first-prompt-hook python-shell-font-lock-enable python-shell-remote-exec-path python-shell-virtualenv-root query-replace-from-to-separator rcirc-connection-info rcirc-last-connect-time rcirc-reconnect-delay read-hide-char recenter-window-group-function rectangle--inhibit-region-highlight rectangle--mark-crutches rectangle--string-preview-state rectangle--string-preview-window rectangle-preview redisplay--inhibit-bidi redisplay--variables reftex--rebuilding-toc region-insert-function registry-db-version replace-char-fold replace-update-post-hook rmail-mime-prefer-html rmail-mime-render-html-function rmail-mime-searching sasl-scram-sha-1-steps save-place-local-mode-hook save-place-mode save-place-mode-hook save-silently scroll-bar-height scss--hash-re scss-bang-ids scss-font-lock-keywords scss-mode-abbrev-table scss-mode-hook scss-mode-map scss-mode-syntax-table search-default-mode seconds-to-string select-enable-clipboard select-enable-primary selected-window-group-function semantic-debug-parser-debugger-source ses--ses-buffer-list ses-initial-global-parameters-re ses-paramfmt-plist set-window-group-start-function sgml-attribute-offset show-paren-when-point-in-periphery show-paren-when-point-inside-paren shr-current-font shr-depth shr-internal-bullet shr-internal-width shr-table-id shr-table-separator-pixel-width shr-use-fonts shr-warning sql-default-directory sql-vertica-login-params sql-vertica-options sql-vertica-program subword-empty-char-table subword-find-word-boundary-function-table switch-to-buffer-in-dedicated-window syntax-propertize-chunks system-configuration-features term-file-aliases tex--prettify-symbols-alist tex-print-file-extension text-quoting-style tildify-double-space-undos tildify-foreach-region-function tildify-mode tildify-mode-hook tildify-pattern tildify-space-pattern tildify-space-predicates tildify-space-string tramp-adb-connect-if-not-connected tramp-awk-coding-test tramp-awk-decode tramp-awk-encode tramp-bluez-discover-devices-timeout tramp-gvfs-zeroconf-domain tramp-histfile-override tramp-stat-marker tramp-stat-quoted-marker truncate-string-ellipsis undo-auto--last-boundary-cause undo-auto--this-command-amalgamating undo-auto--undoably-changed-buffers undo-auto-current-boundary-timer url-request-noninteractive url-tramp-protocols url-user-agent vc-annotate-background-mode vc-annotate-switches vc-bzr-annotate-switches vc-cvs-annotate-switches vc-git--log-view-long-font-lock-keywords vc-git-annotate-switches vc-git-log-output-coding-system vc-git-region-history-font-lock-keywords vc-git-region-history-mode-abbrev-table vc-git-region-history-mode-hook vc-git-region-history-mode-map vc-git-region-history-mode-syntax-table vc-git-resolve-conflicts vc-hg-annotate-switches vc-hg-log-format vc-mtn-annotate-switches vc-src-diff-switches vc-src-log-switches vc-src-master-templates vc-src-program vc-src-release vc-svn-annotate-switches verilog-auto-arg-format verilog-compiler-directives verilog-dpi-import-export-re vhdl-08-attributes vhdl-08-directives vhdl-08-functions vhdl-08-keywords vhdl-08-packages vhdl-08-types vhdl-directives vhdl-sensitivity-list-all whitespace-big-indent-regexp whitespace-point--used window-adjust-process-window-size-function window-divider-default-bottom-width window-divider-default-places window-divider-default-right-width window-divider-mode window-divider-mode-hook window-group-end-function window-group-start-function word-move-empty-char-table x-select-enable-clipboard x-select-enable-primary x-select-request-type xref--button-map xref--current-item xref--last-visiting-buffer xref--marker-ring xref--read-identifier-history xref--read-pattern-history xref--temp-buffer-file-name xref--window xref--xref-buffer-mode-abbrev-table xref--xref-buffer-mode-hook xref--xref-buffer-mode-map xref--xref-buffer-mode-syntax-table xref-after-jump-hook xref-after-return-hook xref-backend-functions xref-bogus-location xref-buffer-location xref-buffer-name xref-etags-location xref-etags-mode xref-etags-mode--saved xref-etags-mode-hook xref-file-location xref-item xref-location xref-marker-ring-length xref-match-item xref-mode-local-find-overloadable-regexp xref-prompt-for-identifier xref-show-xrefs-function xterm-mouse-tracking-disable-sequence xterm-mouse-tracking-enable-sequence xterm-mouse-utf-8 xwidget-webkit-activeelement-js xwidget-webkit-last-session-buffer xwidget-webkit-mode-abbrev-table xwidget-webkit-mode-hook xwidget-webkit-mode-map xwidget-webkit-mode-syntax-table)) - (features - (removed authors gnus-setup vc-mcvs w32-common-fns) - (added bruce char-fold charscript cl-generic cl-preloaded cl-seq cp51932 cursor-sensor dom ede/detect eieio-compat elisp-mode eucjp-ms generator gnus-cloud inline let-alist map nsm obarray pinentry project sasl-scram-rfc sasl-scram-sha-1 seq thunk url-tramp vc-filewise vc-src xref xwidget))) - ((25 2) - (functions - (removed electric--insertable-p) - (added term--xterm-paste tex-handle-newline)) - (variables - (removed) - (added inhibit-compacting-font-caches)) - (features - (removed) - (added))) - ((25 3) - (functions - (removed) - (added)) - (variables - (removed) - (added)) - (features - (removed) - (added))) - ((26 1) - (functions - (removed 8859-1-map 8859-to-swascii-buffer Buffer-menu-info-node-description Man-quit ad-Advice-find-tag auto-source--symbol-keyword autoload-ensure-default-file c-clear-cpp-delimiters c-comment-out-cpps c-neutralize-syntax-in-and-mark-CPP c-set-cpp-delimiters c-state-semi-safe-place c-uncomment-out-cpps c-with-all-but-one-cpps-commented-out c-with-cpps-commented-out check-declare-errmsg cl-struct-avl-tree- cl-struct-avl-tree--node cl-struct-avl-tree--stack cl-struct-cl--class cl-struct-cl--generic cl-struct-cl--generic-generalizer cl-struct-cl--generic-method cl-struct-cl-slot-descriptor cl-struct-cl-structure-class cl-struct-cl-structure-object cl-struct-compilation--message cl-struct-cvs-fileinfo cl-struct-cvs-flags cl-struct-cvs-qtypedesc cl-struct-cvs-tag cl-struct-edebug--form-data cl-struct-eieio--class cl-struct-eieio--object cl-struct-epg-context cl-struct-epg-data cl-struct-epg-import-result cl-struct-epg-import-status cl-struct-epg-key cl-struct-epg-key-signature cl-struct-epg-new-signature cl-struct-epg-sig-notation cl-struct-epg-signature cl-struct-epg-sub-key cl-struct-epg-user-id cl-struct-erc-response cl-struct-ert--ewoc-entry cl-struct-ert--stats cl-struct-ert--test-execution-info cl-struct-ert-test cl-struct-ert-test-aborted-with-non-local-exit cl-struct-ert-test-failed cl-struct-ert-test-passed cl-struct-ert-test-quit cl-struct-ert-test-result cl-struct-ert-test-result-with-condition cl-struct-ert-test-skipped cl-struct-ewoc cl-struct-ewoc--node cl-struct-flymake-ler cl-struct-gdb-handler cl-struct-gdb-table cl-struct-isearch--state cl-struct-js--js-handle cl-struct-js--pitem cl-struct-nnimap cl-struct-nnmaildir--art cl-struct-nnmaildir--grp cl-struct-nnmaildir--srv cl-struct-org-export-backend cl-struct-package--ac-desc cl-struct-package--bi-desc cl-struct-package-desc cl-struct-profiler-calltree cl-struct-profiler-profile cl-struct-rng--ipattern cl-struct-ses--locprn cl-struct-ses-cell cl-struct-sgml-tag cl-struct-soap-binding cl-struct-soap-bound-operation cl-struct-soap-element cl-struct-soap-message cl-struct-soap-namespace cl-struct-soap-namespace-link cl-struct-soap-operation cl-struct-soap-port cl-struct-soap-port-type cl-struct-soap-wsdl cl-struct-soap-xs-attribute cl-struct-soap-xs-attribute-group cl-struct-soap-xs-basic-type cl-struct-soap-xs-complex-type cl-struct-soap-xs-element cl-struct-soap-xs-simple-type cl-struct-soap-xs-type cl-struct-timer cl-struct-uniquify-item cl-struct-url cl-struct-url-future cl-struct-url-queue cl-struct-vc-bzr-extra-fileinfo cl-struct-vc-dir-fileinfo cl-struct-vc-git-extra-fileinfo cl-struct-vc-hg-extra-fileinfo cl-struct-xref-elisp-location convert-pdf copy-flymake-ler count-trailing-whitespace-region dbstring-mysql debugger-make-xrefs decode-codepage-char delete-side-window display-buffer-in-major-side-window edebug-prin1 edebug-print edebug-read-function ediff-show-ancestor eieio--object-class-tag--cmacro eieio-class-tag--auth-source-backend eieio-class-tag--chart eieio-class-tag--chart-axis eieio-class-tag--chart-axis-names eieio-class-tag--chart-axis-range eieio-class-tag--chart-bar eieio-class-tag--chart-sequece eieio-class-tag--ede-project eieio-class-tag--ede-project-autoload eieio-class-tag--ede-project-autoload-dirmatch eieio-class-tag--ede-project-placeholder eieio-class-tag--ede-sourcecode eieio-class-tag--ede-target eieio-class-tag--eieio-default-superclass eieio-class-tag--eieio-instance-inheritor eieio-class-tag--eieio-instance-tracker eieio-class-tag--eieio-named eieio-class-tag--eieio-persistent eieio-class-tag--eieio-singleton eieio-class-tag--eieio-speedbar eieio-class-tag--eieio-speedbar-directory-button eieio-class-tag--eieio-speedbar-file-button eieio-class-tag--eieio-widget-test-class eieio-class-tag--gnus-icalendar-event eieio-class-tag--gnus-icalendar-event-cancel eieio-class-tag--gnus-icalendar-event-reply eieio-class-tag--gnus-icalendar-event-request eieio-class-tag--registry-db eieio-class-tag--xref-bogus-location eieio-class-tag--xref-buffer-location eieio-class-tag--xref-etags-location eieio-class-tag--xref-file-location eieio-class-tag--xref-item eieio-class-tag--xref-location eieio-class-tag--xref-match-item eieio-edebug-prin1-to-string emacs-repository--version-git-1 emerge-protect-metachars epg-config--compare-version epg-config--parse-version erc-menu ert--record-backtrace eval-current-buffer file-notify--descriptor flymake-add-buildfile-to-cache flymake-add-err-info flymake-add-line-err-info flymake-add-project-include-dirs-to-cache flymake-can-syntax-check-file flymake-check-include flymake-check-patch-master-file-buffer flymake-clear-buildfile-cache flymake-clear-project-include-dirs-cache flymake-compilation-is-running flymake-copy-buffer-to-temp-buffer flymake-create-master-file flymake-delete-temp-directory flymake-display-err-menu-for-current-line flymake-er-get-line flymake-er-get-line-err-info-list flymake-er-make-er flymake-find-buffer-for-file flymake-find-buildfile flymake-find-err-info flymake-find-possible-master-files flymake-fix-file-name flymake-fix-line-numbers flymake-get-buildfile-from-cache flymake-get-cleanup-function flymake-get-err-count flymake-get-file-name-mode-and-masks flymake-get-first-err-line-no flymake-get-full-nonpatched-file-name flymake-get-full-patched-file-name flymake-get-include-dirs-dot flymake-get-init-function flymake-get-last-err-line-no flymake-get-line-err-count flymake-get-next-err-line-no flymake-get-prev-err-line-no flymake-get-project-include-dirs flymake-get-project-include-dirs-from-cache flymake-get-project-include-dirs-imp flymake-get-real-file-name-function flymake-get-syntax-check-program-args flymake-get-system-include-dirs flymake-get-tex-args flymake-goto-file-and-line flymake-goto-line flymake-highlight-err-lines flymake-highlight-line flymake-init-create-temp-source-and-master-buffer-copy flymake-init-find-buildfile-dir flymake-ins-after flymake-kill-process flymake-ler-file flymake-ler-file--cmacro flymake-ler-full-file flymake-ler-full-file--cmacro flymake-ler-line flymake-ler-line--cmacro flymake-ler-make-ler flymake-ler-make-ler--cmacro flymake-ler-p flymake-ler-p--cmacro flymake-ler-set-file flymake-ler-set-full-file flymake-ler-set-line flymake-ler-text flymake-ler-text--cmacro flymake-ler-type flymake-ler-type--cmacro flymake-line-err-info-is-less-or-equal flymake-make-overlay flymake-master-file-compare flymake-on-timer-event flymake-overlay-p flymake-parse-err-lines flymake-parse-output-and-residual flymake-parse-residual flymake-patch-err-text flymake-popup-current-error-menu flymake-post-syntax-check flymake-process-filter flymake-process-sentinel flymake-read-file-to-temp-buffer flymake-region-has-flymake-overlays flymake-replace-region flymake-report-fatal-status flymake-report-status flymake-safe-delete-directory flymake-safe-delete-file flymake-same-files flymake-save-buffer-in-file flymake-set-at flymake-skip-whitespace flymake-split-output flymake-start-syntax-check-process flyspell-ajust-cursor-point flyspell-xemacs-popup frameset--record-minibuffer-relationships gmm-called-interactively-p gmm-image-load-path-for-library gmm-image-search-load-path gmm-labels gmm-write-region gnus-add-text-properties gnus-assq-delete-all gnus-bookmark-mouse-available-p gnus-bookmark-remove-properties gnus-bound-and-true-p gnus-boundp gnus-character-to-event gnus-cloud-delete-file gnus-cloud-update-data gnus-deactivate-mark gnus-delete-alist gnus-ems-redefine gnus-extent-detached-p gnus-extent-start-open gnus-float-time gnus-format-message gnus-frames-on-display-list gnus-get-display-table gnus-graphic-display-p gnus-html-encode-url-chars gnus-invisible-p gnus-key-press-event-p gnus-mail-strip-quoted-names gnus-make-local-hook gnus-mark-active-p gnus-match-substitute-replacement gnus-max-width-function gnus-merge gnus-mule-max-width-function gnus-next-char-property-change gnus-previous-char-property-change gnus-process-get gnus-process-plist gnus-process-put gnus-put-display-table gnus-put-text-property gnus-read-shell-command gnus-region-active-p gnus-select-frame-set-input-focus gnus-select-lowest-window gnus-set-process-plist gnus-set-process-query-on-exit-flag gnus-string-mark-left-to-right gnus-string-match-p gnus-string-prefix-p gnus-string-width-function gnus-substring-function gnus-sync-deep-print gnus-sync-fix-topic-group-position gnus-sync-initialize gnus-sync-install-hooks gnus-sync-invlist2range gnus-sync-json-alist-p gnus-sync-json-plist-p gnus-sync-lesync-DELETE gnus-sync-lesync-GET gnus-sync-lesync-POST gnus-sync-lesync-PUT gnus-sync-lesync-call gnus-sync-lesync-delete-group gnus-sync-lesync-find-prop gnus-sync-lesync-get-prop gnus-sync-lesync-groups-builder gnus-sync-lesync-install-group-entry gnus-sync-lesync-normalize-group-entry gnus-sync-lesync-parse gnus-sync-lesync-post-save-group-entry gnus-sync-lesync-pre-save-group-entry gnus-sync-lesync-read-group-entry gnus-sync-lesync-set-prop gnus-sync-lesync-setup gnus-sync-newsrc-loader-builder gnus-sync-position gnus-sync-range2invlist gnus-sync-read gnus-sync-save gnus-sync-subscribe-group gnus-sync-topic-group-position gnus-sync-unload-hook gnus-timer--function gnus-union gnus-window-edges gnus-window-inside-pixel-edges gnus-xmas-define gnus-xmas-format gnus-xmas-redefine gravatar-create-image ibuffer-delete-alist idna-to-ascii idna-to-unicode image-dired-define-display-image-mode-keymap image-dired-define-thumbnail-mode-keymap image-dired-kill-buffer-and-window inferior-octave-complete insert-A-acute insert-A-circumflex insert-A-grave insert-A-ring insert-A-tilde insert-A-umlaut insert-AE insert-C-cedilla insert-D-stroke insert-E-acute insert-E-circumflex insert-E-grave insert-E-umlaut insert-I-acute insert-I-circumflex insert-I-grave insert-I-umlaut insert-N-tilde insert-O-acute insert-O-circumflex insert-O-grave insert-O-slash insert-O-tilde insert-O-umlaut insert-THORN insert-U-acute insert-U-circumflex insert-U-grave insert-U-umlaut insert-Y-acute insert-a-acute insert-a-circumflex insert-a-grave insert-a-ring insert-a-tilde insert-a-umlaut insert-acute-accent insert-ae insert-angle-quotation-mark-left insert-angle-quotation-mark-right insert-broken-vertical-line insert-c-cedilla insert-cedilla insert-cent-sign insert-copyright-sign insert-d-stroke insert-degree-sign insert-diaeresis insert-division-sign insert-e-acute insert-e-circumflex insert-e-grave insert-e-umlaut insert-fraction-one-half insert-fraction-one-quarter insert-fraction-three-quarters insert-general-currency-sign insert-i-acute insert-i-circumflex insert-i-grave insert-i-umlaut insert-inverted-exclamation-mark insert-inverted-question-mark insert-macron insert-micro-sign insert-middle-dot insert-multiplication-sign insert-n-tilde insert-no-break-space insert-not-sign insert-o-acute insert-o-circumflex insert-o-grave insert-o-slash insert-o-tilde insert-o-umlaut insert-ordinal-indicator-feminine insert-ordinal-indicator-masculine insert-pilcrow insert-plus-or-minus-sign insert-pound-sign insert-registered-sign insert-section-sign insert-soft-hyphen insert-ss insert-string insert-superscript-one insert-superscript-three insert-superscript-two insert-thorn insert-u-acute insert-u-circumflex insert-u-grave insert-u-umlaut insert-y-acute insert-y-umlaut insert-yen-sign internal--module-call iso-acc-minibuf-setup iso-accent-rassoc-unit iso-accents-accent-key iso-accents-compose iso-accents-customize iso-accents-mode iso-accentuate iso-deaccentuate iso-unaccentuate ispell-check-minver ispell-decode-string ispell-highlight-spelling-error-xemacs ispell-int-char ispell-looking-back ispell-with-no-warnings lisp-completion-predicate lisp-completion-symbol lisp-symbol-completion-transform mailcap-command-p mailcap-delete-duplicates mailcap-replace-in-string make-variable-frame-local makehash menu-bar-horizontal-scroll-bar menu-bar-no-horizontal-scroll-bar message-completion-in-region message-window-inside-pixel-edges midnight-buffer-display-time mm-annotationp mm-char-int mm-char-or-char-int-p mm-codepage-setup mm-coding-system-equal mm-coding-system-list mm-create-image-xemacs mm-decode-coding-region mm-decode-coding-string mm-default-multibyte-p mm-delete-duplicates mm-encode-coding-region mm-encode-coding-string mm-enrich-utf-8-by-mule-ucs mm-inline-image-emacs mm-inline-image-xemacs mm-insert-byte mm-line-number-at-pos mm-multibyte-char-to-unibyte mm-multibyte-string-p mm-read-charset mm-read-coding-system mm-replace-in-string mm-set-buffer-file-coding-system mm-set-buffer-multibyte mm-setup-codepage-ibm mm-setup-codepage-iso-8859 mm-special-display-p mm-string-as-multibyte mm-string-as-unibyte mm-string-make-unibyte mm-string-to-multibyte mm-subst-char-in-string mm-substring-no-properties mm-xemacs-find-mime-charset mm-xemacs-find-mime-charset-1 mml-buffer-substring-no-properties-except-hard-newlines nndiary-error nullify-allout-prefix-data nxml-after-change nxml-after-change1 nxml-autoload-char-name-set nxml-char-name-set-enabled-p nxml-clear-inside nxml-completion-at-point-function nxml-create-unicode-char-name-sets nxml-debug-clear-inside nxml-debug-set-inside nxml-define-char-name-set nxml-disable-char-name-set nxml-enable-char-name-set nxml-enable-unicode-char-name-sets nxml-get-char-name nxml-glyph-display-string nxml-glyph-set-contains-p nxml-maybe-load-char-name-set nxml-scan-after-change nxml-set-inside nxml-terminal-set-glyph-set nxml-unicode-block-char-name-set nxml-w32-set-glyph-set nxml-window-system-set-glyph-set nxml-x-set-glyph-set octave-complete-symbol org-agenda-filter-by-tag-refine org-agenda-goto-block-beginning org-agenda-post-command-hook org-align-tags-here org-all-targets org-ascii--justify-string org-ascii-quote-section org-babel-C-expand org-babel-C-val-to-C-list-type org-babel-R-graphical-output-file org-babel-awk-table-or-string org-babel-execute:scala org-babel-exp-get-export-buffer org-babel-exp-in-export-file org-babel-expand-body:c org-babel-get-header org-babel-get-inline-src-block-matches org-babel-get-lob-one-liner-matches org-babel-haskell-read-string org-babel-haskell-table-or-string org-babel-in-example-or-verbatim org-babel-io-table-or-string org-babel-lilypond-determine-ly-path org-babel-lilypond-determine-midi-path org-babel-lilypond-determine-pdf-path org-babel-load-session:sh org-babel-lob-execute org-babel-maxima-graphical-output-file org-babel-octave-graphical-output-file org-babel-octave-read-string org-babel-parse-inline-src-block-match org-babel-parse-src-block-match org-babel-prep-session:scala org-babel-prep-session:sh org-babel-ref-at-ref-p org-babel-ruby-read-string org-babel-scala-evaluate org-babel-scala-initiate-session org-babel-scala-table-or-string org-babel-sh-table-or-results org-babel-speed-command-hook org-babel-tramp-handle-call-process-region org-beamer-insert-options-template org-beamer-target org-capture-bookmark-last-stored-position org-capture-steal-local-variables org-clock-time% org-cmp-priority org-columns-capture-view org-columns-cleanup-item org-columns-display-here org-columns-display-here-title org-columns-eval org-columns-get-autowidth-alist org-columns-hscoll-title org-columns-new-overlay org-columns-not-in-agenda org-columns-number-to-string org-columns-string-to-number org-copy-face org-create-formula--latex-header org-create-formula-image-with-dvipng org-create-formula-image-with-imagemagick org-cycle-hide-inline-tasks org-datetree-find-day-create org-datetree-find-month-create org-datetree-find-year-create org-deadline-close org-diary-class org-display-inline-modification-hook org-do-sort org-edit-src-find-buffer org-edit-src-find-region-and-lang org-edit-src-get-indentation org-edit-src-get-label-format org-edit-src-get-lang org-element--get-next-object-candidates org-element--remove-indentation org-element-export-snippet-successor org-element-footnote-reference-successor org-element-inline-babel-call-successor org-element-inline-src-block-successor org-element-latex-or-entity-successor org-element-line-break-successor org-element-link-successor org-element-macro-successor org-element-plain-link-successor org-element-quote-section-interpreter org-element-quote-section-parser org-element-radio-target-successor org-element-statistics-cookie-successor org-element-sub/superscript-successor org-element-table-cell-successor org-element-target-successor org-element-text-markup-successor org-element-timestamp-successor org-end-of-meta-data-and-drawers org-entity-get-representation org-entity-latex-math-p org-estimate-combine org-estimate-mean-and-var org-estimate-print org-export--interpret-p org-export--populate-ignore-list org-export-collect-tree-properties org-export-execute-babel-code org-export-ignore-element org-export-solidify-link-text org-extract-attributes org-footnote-goto-local-insertion-point org-format-time-period org-get-all-dates org-get-x-clipboard-compat org-gnus-nnimap-cached-article-number org-hours-to-clocksum-string org-html-begin-plain-list org-html-end-plain-list org-html-format-footnote-definition org-html-format-footnote-reference org-html-format-footnotes-section org-html-format-headline org-html-format-headline--wrap org-html-format-section org-html-quote-section org-ido-switchb org-in-commented-line org-in-drawer-p org-in-indented-comment-line org-indent-initialize org-inhibit-invisibility org-isearch-end org-isearch-post-command org-iswitchb org-iswitchb-completing-read org-latex--collect-errors org-latex-quote-section org-list-item-trim-br org-listtable-to-string org-make-target-link-regexp org-man-clock org-man-collect-errors org-man-quote-section org-maybe-intangible org-minutes-to-hh:mm-string org-nofm-to-completion org-odt-begin-toc org-odt-end-toc org-odt-format-headline org-odt-quote-section org-protect-slash org-protocol-unhex-compound org-protocol-unhex-single-byte-sequence org-protocol-unhex-string org-publish-collect-numbering org-publish-compare-directory-files org-publish-format-file-entry org-publish-get-base-files-1 org-publish-org-sitemap org-publish-resolve-external-fuzzy-link org-replace-match-keep-properties org-search-not-self org-set-local org-set-regexps-and-options-for-tags org-speed-command-default-hook org-src-construct-edit-buffer-name org-src-fontify-block org-src-fontify-buffer org-src-get-lang-mode org-src-in-org-buffer org-src-native-tab-command-maybe org-src-tangle org-string-to-estimate org-string-to-number org-substitute-posix-classes org-table-clean-before-export org-table-colgroup-line-p org-table-cookie-line-p org-table-find-row-type org-table-get-descriptor-line org-table-get-specials org-table-rewrite-old-row-references org-table-set-constants org-texinfo-collect-errors org-texinfo-filter-section-blank-lines org-texinfo-quote-section org-timeline org-timer-cancel-timer org-toggle-fixed-width-section org-translate-time org-update-property-plist org-verify-version org-xemacs-without-invisibility orgtbl-apply-fmt orgtbl-eval-str orgtbl-format-line orgtbl-format-section orgtbl-get-fmt pcomplete/org-mode/drawer pinentry--error-code pinentry--escape-string pinentry--labels-to-shortcuts pinentry--process-filter pinentry--process-sentinel pinentry--prompt pinentry--send-data pinentry--send-error pinentry--unescape-string pinentry-prompt-mode pinentry-start pinentry-stop pop3-set-process-query-on-exit-flag produce-allout-mode-menubar-entries read-input regexp-sans-escapes region-exists-p replace-amp resume-process-args resume-suspend-hook resume-write-buffer-to-file rng-complete rng-complete-before-point rng-completion-exact-p rng-quote-string rng-strings-to-completion-alist rst-adjust-adornment-work rst-compare-adornments rst-deprecated-goto-section rst-deprecated-straighten-adornments rst-find-all-adornments rst-find-pfx-in-region rst-find-title-line rst-get-adornment-match rst-get-adornments-around rst-get-hierarchy rst-get-next-adornment rst-imenu-find-adornments-for-position rst-infer-hierarchy rst-insert-list-pos rst-iterate-leftmost-paragraphs rst-iterate-leftmost-paragraphs-2 rst-position rst-position-if rst-promote-region rst-section-tree rst-section-tree-point rst-section-tree-rec rst-signum rst-some rst-suggest-new-adornment rst-toc-count-lines rst-toc-insert-node rst-toc-mode-find-section rst-toc-node scribe scribe-begin scribe-bold-word scribe-bracket-region-be scribe-chapter scribe-end scribe-envelop-word scribe-insert-environment scribe-insert-quote scribe-italicize-word scribe-mode scribe-parenthesis scribe-section scribe-subsection scribe-tab scribe-underline-word set-window-dot show-buffer shr-previous-newline-padding-width shr-remove-trailing-whitespace smerge-refine-chopup-region smerge-refine-forward smerge-refine-highlight-change smime-make-temp-file smime-replace-in-string solicit-char-in-string spell-buffer spell-region spell-string spell-word starttls-set-process-query-on-exit-flag string-to-int swascii-to-8859-buffer swascii-to-8859-buffer-maybe symbol-complete symbol-completion-symbol symbol-completion-try-complete time-stamp-fconcat time-stamp-mail-host-name todo-reevaluate-category-completions-files-defcustom todo-reevaluate-default-file-defcustom todo-reevaluate-filelist-defcustoms todo-reevaluate-filter-files-defcustom tramp-check-proper-method-and-host tramp-compat-coding-system-change-eol-conversion tramp-compat-condition-case-unless-debug tramp-compat-copy-directory tramp-compat-copy-file tramp-compat-decimal-to-octal tramp-compat-delete-directory tramp-compat-delete-dups tramp-compat-delete-file tramp-compat-file-attributes tramp-compat-font-lock-add-keywords tramp-compat-load tramp-compat-most-positive-fixnum tramp-compat-number-sequence tramp-compat-octal-to-decimal tramp-compat-process-get tramp-compat-process-put tramp-compat-replace-regexp-in-string tramp-compat-set-process-query-on-exit-flag tramp-compat-split-string tramp-compat-with-temp-message tramp-completion-run-real-handler tramp-file-name-real-host tramp-file-name-real-user tramp-gw-aux-proc-sentinel tramp-gw-basic-authentication tramp-gw-gw-proc-sentinel tramp-gw-open-connection tramp-gw-open-network-stream tramp-gw-process-filter tramp-handle-unhandled-file-name-directory tramp-set-auto-save-file-modes tramp-sh-handle-dired-recursive-delete-directory tramp-sh-handle-insert-file-contents-literally tramp-user-error undo-auto--undoable-change-no-timer url-cookie-quit verilog-save-font-mods verilog-save-no-change-functions whitespace-ensure-local-variables window--major-non-side-window window--major-side-window window--side-check window--side-window-p window-dot woman-pop woman-push xmltok-forward-special xwidget-webkit-execute-script-rv y-or-n-minibuffer) - (added Buffer-menu-unmark-all Buffer-menu-unmark-all-buffers Info-node-description ad-Advice-exchange-point-and-mark ad-Advice-pop-global-mark ad-Advice-pop-to-mark-command ad-Advice-xref-find-definitions add-variable-watcher advice--where all-threads allout-count-trailing-whitespace-region allout-nullify-prefix-data allout-produce-mode-menubar-entries allout-regexp-sans-escapes allout-set-regexp allout-solicit-char-in-string and-let* ansible-inventory-generic-mode apropos-local-value apropos-local-variable arabic-shape-gstring auth-source--decode-octal-string auth-source--symbol-keyword auth-source-backends-parser-file auth-source-backends-parser-macos-keychain auth-source-backends-parser-secrets auth-source-pass--build-result auth-source-pass--do-debug auth-source-pass--entry-valid-p auth-source-pass--find-all-by-entry-name auth-source-pass--find-match auth-source-pass--find-one-by-entry-name auth-source-pass--hostname auth-source-pass--hostname-with-user auth-source-pass--parse-data auth-source-pass--parse-secret auth-source-pass--read-entry auth-source-pass--select-one-entry auth-source-pass--user-match-p auth-source-pass-backend-parse auth-source-pass-enable auth-source-pass-entries auth-source-pass-get auth-source-pass-parse-entry auth-source-pass-search auto-revert-find-file-function auto-revert-remove-current-buffer auto-save-visited-mode autoload--make-defs-autoload autoload--save-buffer autoload-ensure-file-writeable avl-tree-iter backtrace--print-frame backtrace-frame--internal backtrace-frames battery-upower battery-upower-prop beginning-of-defun--in-emptyish-line-p beginning-of-defun-comments bibtex-Conference blink-cursor--start-idle-timer blink-cursor--start-timer browse-url-man bs-unmark-all bs-unmark-previous buffer-hash byte-compile--function-signature byte-compile--log-warning-for-byte-compile byte-compile-cond-jump-table byte-compile-cond-jump-table-info byte-compile-cond-vars byte-compile-define-symbol-prop c-after-change-re-mark-raw-strings c-back-over-compound-identifier c-before-change-check-raw-strings c-brace-stack-at c-bs-at-toplevel-p c-cache-to-parse-ps-state c-clear-char-property-with-value-on-char c-clear-char-property-with-value-on-char-function c-delq-from-dotted-list c-depropertize-CPP c-depropertize-new-text c-depropertize-raw-string c-depropertize-raw-strings-in-region c-directly-in-class-called-p c-display-defun-name c-fl-decl-end c-font-lock-c++-lambda-captures c-font-lock-cut-off-declarators c-font-lock-enum-body c-font-lock-invalid-single-quotes c-font-lock-raw-strings c-font-lock-single-decl c-forward-noise-clause c-forward-over-token-and-ws c-get-fontification-context c-init-bs-cache c-invalidate-sws-region-after-del c-invalidate-sws-region-after-ins c-invalidate-sws-region-before c-lineup-under-anchor c-literal-start c-looking-at-c++-lambda-capture-list c-looking-at-or-maybe-in-bracelist c-looking-at-statement-block c-make-noise-macro-regexps c-neutralize-syntax-in-CPP c-no-comment-end-of-macro c-or-c++-mode c-parse-ps-state-below c-parse-ps-state-to-cache c-parse-quotes-after-change c-parse-quotes-before-change c-propertize-raw-string-opener c-ps-state-cache-pos c-put-char-properties-on-char c-quoted-number-head-before-point c-quoted-number-straddling-point c-quoted-number-tail-after-point c-raw-string-pos c-search-forward-char-property-with-value-on-char c-set-keymap-parent c-state-full-pp-to-literal c-state-semi-pp-to-literal c-toggle-comment-style c-truncate-bs-cache c-truncate-semi-nonlit-pos-cache c-update-brace-stack calc-input-angle-units calculator-define-key calculator-register-read-with-preview call-shell-region cancel-debug-on-variable-change cancel-debug-watch cconv--remap-llv char-from-name checkdoc--create-error-for-checkdoc checkdoc--next-docstring cl--defstruct-predicate cl--generic-load-hist-format cl--generic-make-defmethod-docstring cl--generic-method-files cl--make-random-state cl--make-random-state--cmacro cl--old-struct-type-of cl--print-table cl--prog cl--random-state-i cl--random-state-i--cmacro cl--random-state-j cl--random-state-j--cmacro cl--random-state-vec cl--random-state-vec--cmacro cl-generic-p cl-old-struct-compat-mode cl-prin1 cl-prin1-to-string cl-print--find-sharing cl-print--preprocess cl-print-object cl-prog cl-prog* cl-random-state-p--cmacro clear-composition-cache color-lab-to-lch color-lch-to-lab color-xyy-to-xyz color-xyz-to-xyy comint-nonblank-p comint-term-environment compilation--note-type compilation-type condition-mutex condition-name condition-notify condition-variable-p condition-wait conf-desktop-mode conf-toml-mode conf-toml-recognize-section connection-local-get-profile-variables connection-local-get-profiles connection-local-normalize-criteria connection-local-set-profile-variables connection-local-set-profiles copy-file-notify--watch copy-flymake--backend-state copy-flymake--diag copy-lisp-indent-state copy-mhtml--submode copy-rst-Ado copy-rst-Stn copy-tramp-file-name css--colon-inside-funcall css--colon-inside-selector-p css--color-skip-blanks css--complete-bang-rule css--complete-property-value css--complete-selector css--compute-color css--contrasty-color css--fontify-region css--foreign-completions css--hex-color css--hsl-color css--mdn-after-render css--mdn-find-symbol css--named-color css--property-values css--rgb-color css--value-class-lookup css-lookup-symbol current-thread debug--implement-debug-watch debug--variable-list debug-on-variable-change debug-watch debugger-insert-backtrace define-symbol-prop defined-colors-with-face-attributes dframe-set-special-events diff--at-diff-header-p diff--forward-while-leading-char diff--some-hunks-p dir-locals--all-files dir-locals-read-from-dir dired--align-all-files dired--mark-suffix-interactive-spec dired--need-align-p dired--star-or-qmark-p dired--yes-no-all-quit-help dired-isolated-string-re dired-mark-suffix dired-mouse-find-file dired-mouse-find-file-other-frame dired-omit-case-fold-p display-buffer-in-child-frame display-buffer-reuse-mode-window display-line-numbers--turn-on display-line-numbers-mode display-line-numbers-mode-set-explicitly display-line-numbers-update-width dns-mode-ipv6-to-nibbles dns-mode-reverse-and-expand-ipv6 dom-remove-node edebug-match-cl-generic-method-args edebug-read-special ediff--check-ancestor-exists ediff--restore-options-on-exit ediff-toggle-show-ancestor eieio-change-class eldoc--supported-p eldoc-mode-set-explicitly electric-pair--with-uncached-syntax elisp--font-lock-backslash elisp-flymake--batch-compile-for-flymake elisp-flymake--byte-compile-done elisp-flymake-byte-compile elisp-flymake-checkdoc erc-parse-tags erc-response\.tags erc-response\.tags--cmacro ert--make-message-advice ert--make-print-advice ert--should-signal-hook ert-with-message-capture eshell-cmpl--custom-variable-docstring eshell-input-filter-default eshell-input-filter-initial-space eshell-ls--dired eshell-ls-unload-function eval-expression-get-print-arguments event-line-count eww--dwim-expand-url eww-open-in-new-buffer eww-switch-to-buffer eww-toggle-colors f90-fill-paragraph ff-buffer-file-name ffap--gopher-var-on-line file-attribute-access-time file-attribute-collect file-attribute-device-number file-attribute-group-id file-attribute-inode-number file-attribute-link-number file-attribute-modes file-attribute-modification-time file-attribute-size file-attribute-status-change-time file-attribute-type file-attribute-user-id file-local-name file-name-case-insensitive-p file-name-quote file-name-quoted-p file-name-unquote file-notify--watch-absolute-filename file-notify--watch-callback file-notify--watch-callback--cmacro file-notify--watch-directory file-notify--watch-directory--cmacro file-notify--watch-filename file-notify--watch-filename--cmacro file-notify--watch-make file-notify--watch-make--cmacro file-notify--watch-p file-notify--watch-p--cmacro files--ensure-directory files--force files--make-magic-temp-file files--name-absolute-system-p files--splice-dirname-file find-library--from-load-history find-library-other-frame find-library-other-window flymake--backend-state-diags flymake--backend-state-diags--cmacro flymake--backend-state-disabled flymake--backend-state-disabled--cmacro flymake--backend-state-p flymake--backend-state-p--cmacro flymake--backend-state-reported-p flymake--backend-state-reported-p--cmacro flymake--backend-state-running flymake--backend-state-running--cmacro flymake--collect flymake--diag-accessor flymake--diag-backend flymake--diag-backend--cmacro flymake--diag-beg flymake--diag-beg--cmacro flymake--diag-buffer flymake--diag-buffer--cmacro flymake--diag-end flymake--diag-end--cmacro flymake--diag-make flymake--diag-make--cmacro flymake--diag-p flymake--diag-p--cmacro flymake--diag-text flymake--diag-text--cmacro flymake--diag-type flymake--diag-type--cmacro flymake--diagnostics-buffer-entries flymake--diagnostics-buffer-name flymake--disable-backend flymake--fringe-overlay-spec flymake--handle-report flymake--highlight-line flymake--log-1 flymake--lookup-type-property flymake--make-backend-state flymake--make-backend-state--cmacro flymake--mode-line-format flymake--overlays flymake--run-backend flymake--schedule-timer-maybe flymake--with-backend-state flymake-diag-region flymake-diagnostic-backend flymake-diagnostic-beg flymake-diagnostic-buffer flymake-diagnostic-end flymake-diagnostic-text flymake-diagnostic-type flymake-diagnostics flymake-diagnostics-buffer-mode flymake-disabled-backends flymake-error flymake-goto-diagnostic flymake-is-running flymake-make-diagnostic flymake-make-report-fn flymake-menu flymake-proc--add-buildfile-to-cache flymake-proc--add-project-include-dirs-to-cache flymake-proc--check-include flymake-proc--check-patch-master-file-buffer flymake-proc--clear-buildfile-cache flymake-proc--clear-project-include-dirs-cache flymake-proc--compilation-is-running flymake-proc--copy-buffer-to-temp-buffer flymake-proc--create-master-file flymake-proc--delete-temp-directory flymake-proc--diagnostics-for-pattern flymake-proc--find-buffer-for-file flymake-proc--find-buildfile flymake-proc--find-make-buildfile flymake-proc--find-possible-master-files flymake-proc--fix-file-name flymake-proc--get-buildfile-from-cache flymake-proc--get-cleanup-function flymake-proc--get-file-name-mode-and-masks flymake-proc--get-full-nonpatched-file-name flymake-proc--get-full-patched-file-name flymake-proc--get-include-dirs-dot flymake-proc--get-init-function flymake-proc--get-project-include-dirs flymake-proc--get-project-include-dirs-from-cache flymake-proc--get-real-file-name-function flymake-proc--get-syntax-check-program-args flymake-proc--get-system-include-dirs flymake-proc--get-tex-args flymake-proc--init-create-temp-source-and-master-buffer-copy flymake-proc--init-find-buildfile-dir flymake-proc--master-file-compare flymake-proc--panic flymake-proc--process-filter flymake-proc--process-sentinel flymake-proc--read-file-to-temp-buffer flymake-proc--replace-region flymake-proc--safe-delete-directory flymake-proc--safe-delete-file flymake-proc--same-files flymake-proc--save-buffer-in-file flymake-proc-compile flymake-proc-create-temp-inplace flymake-proc-create-temp-with-folder-structure flymake-proc-default-guess flymake-proc-get-ant-cmdline flymake-proc-get-include-dirs flymake-proc-get-make-cmdline flymake-proc-get-project-include-dirs-imp flymake-proc-get-real-file-name flymake-proc-init-create-temp-buffer-copy flymake-proc-legacy-flymake flymake-proc-master-cleanup flymake-proc-master-make-header-init flymake-proc-master-make-init flymake-proc-master-tex-init flymake-proc-perl-init flymake-proc-php-init flymake-proc-real-file-name-considering-includes flymake-proc-reformat-err-line-patterns-from-compile-el flymake-proc-simple-ant-java-init flymake-proc-simple-cleanup flymake-proc-simple-java-cleanup flymake-proc-simple-make-init flymake-proc-simple-make-init-impl flymake-proc-simple-make-java-init flymake-proc-simple-tex-init flymake-proc-stop-all-syntax-checks flymake-proc-xml-init flymake-reporting-backends flymake-running-backends flymake-show-diagnostic flymake-show-diagnostics-buffer flymake-start flymake-switch-to-log-buffer flyspell-adjust-cursor-point flyspell-sort flyspell-sort-corrections-alphabetically fortune-message frame-ancestor-p frame-inner-height frame-inner-width frame-internal-border-width frame-list-z-order frame-monitor-attribute frame-monitor-geometry frame-monitor-workarea frame-native-height frame-native-width frame-outer-height frame-outer-width frame-parent frame-restack frame-size-changed-p frameset--record-relationships frameset-filter-font-param func-arity get-variable-watchers global-display-line-numbers-mode global-display-line-numbers-mode-check-buffers global-display-line-numbers-mode-cmhh global-display-line-numbers-mode-enable-in-buffers global-eldoc-mode-check-buffers global-eldoc-mode-cmhh global-eldoc-mode-enable-in-buffers global-hl-line-highlight-all global-hl-line-maybe-unhighlight gnus-article-sort-by-marks gnus-cloud-download-all-data gnus-cloud-host-acceptable-method-p gnus-cloud-host-server-p gnus-cloud-timestamp gnus-cloud-update-all gnus-cloud-update-newsrc-data gnus-cloud-upload-all-data gnus-group-cloud-map gnus-prune-buffers gnus-server-toggle-cloud-method-server gnus-summary-sort-by-mark gnus-thread-sort-by-marks gnutls-asynchronous-parameters gnutls-boot-parameters gnutls-ciphers gnutls-digests gnutls-hash-digest gnutls-hash-mac gnutls-macs gnutls-symmetric-decrypt gnutls-symmetric-encrypt grep--save-buffers grep-exit-message hack-connection-local-variables hack-connection-local-variables-apply handle-move-frame help--analyze-key help--load-prefixes help--loaded-p help--symbol-completion-table help-definition-prefixes help-downify-mouse-event-type help-fns--analyze-function help-fns-function-description-header help-read-key-sequence hl-line-maybe-unhighlight html-current-buffer-classes html-current-buffer-ids ibuffer--maybe-erase-shell-cmd-output ibuffer--near-buffers ibuffer--or-and-filter ibuffer-and-filter ibuffer-change-marks ibuffer-copy-buffername-as-kill ibuffer-filter-by-basename ibuffer-filter-by-directory ibuffer-filter-by-file-extension ibuffer-filter-by-modified ibuffer-filter-by-starred-name ibuffer-filter-by-visiting-file ibuffer-filter-chosen-by-completion ibuffer-jump ibuffer-locked-buffer-p ibuffer-mark-by-content-regexp ibuffer-mark-by-locked ibuffer-remove-alist ibuffer-repair-saved-filters ibuffer-unary-operand ibuffer-unmark-all-marks ibuffer-update-saved-filters-format ido-dired-other-frame ido-dired-other-window ido-display-buffer-other-frame ido-find-alternate-file-other-window ietf-drums-remove-garbage ietf-drums-strip-cte if-let* image--change-size image--current-scaling image--get-image image--get-imagemagick-and-warn image--image-without-parameters image--set-property image-compute-scaling-factor image-decrease-size image-dired--check-executable-exists image-dired-create-thumb-1 image-dired-file-name-at-point image-dired-minor-mode image-dired-optipng-thumb image-dired-pngcrush-thumb image-dired-pngnq-thumb image-dired-thumb-queue-run image-dired-thumb-size image-increase-size image-mode-as-hex image-mode-to-text image-property image-rotate image-save image-scroll-left image-scroll-right image-toggle-hex-display indent--funcall-widened indent-region-line-by-line indent-relative-first-indent-point info-lookup-guess-gdb-script-symbol insert-directory-clean insert-directory-wildcard-in-dir-p internal-auto-fill internal-default-interrupt-process isearch-lazy-highlight-start ispell--call-enchant-lsmod ispell--get-extra-word-characters ispell-find-enchant-dictionaries js--chained-expression-p js--find-newline-backward js--skip-term-backward js--skip-terms-backward js-do-auto-fill js-font-lock-syntactic-face-function json--decode-utf-16-surrogates json-advance--inliner json-peek--inliner json-pop--inliner json-readtable-dispatch json-skip-whitespace--inliner kill-current-buffer less-css--output-path less-css-compile less-css-compile-maybe less-css-mode lgstring-remove-glyph line-number-display-width lisp-adaptive-fill lisp-indent-calc-next lisp-indent-initial-state lisp-indent-region lisp-indent-state-p lisp-indent-state-p--cmacro lisp-indent-state-ppss lisp-indent-state-ppss--cmacro lisp-indent-state-ppss-point lisp-indent-state-ppss-point--cmacro lisp-indent-state-stack lisp-indent-state-stack--cmacro lisp-ppss list-timers loadhist--unload-function loadhist-unload-element lread--substitute-object-in-subtree ls-lisp--dired ls-lisp-unload-function mail-header-strip-cte mailcap--get-user-mime-data mailcap--set-user-mime-data mailcap-select-preferred-viewer make-condition-variable make-mhtml--submode make-mhtml--submode--cmacro make-mutex make-nearby-temp-file make-org-lint-checker make-org-lint-checker--cmacro make-record make-temp-file-internal make-thread make-tramp-file-name make-tramp-file-name--cmacro make-vc-git-dir-status-state make-vc-git-dir-status-state--cmacro map--do-alist map--do-array map-do mapbacktrace menu-bar-display-line-numbers-mode message--fold-long-headers message-beginning-of-header message-goto-body-1 mhtml--construct-submode mhtml--extend-font-lock-region mhtml--flyspell-check-word mhtml--map-in-crucial-variables mhtml--mark-buffer-locals mhtml--mark-crucial-buffer-locals mhtml--pre-command mhtml--stash-crucial-variables mhtml--submode-captured-locals mhtml--submode-captured-locals--cmacro mhtml--submode-crucial-captured-locals mhtml--submode-crucial-captured-locals--cmacro mhtml--submode-end-tag mhtml--submode-end-tag--cmacro mhtml--submode-fontify-one-region mhtml--submode-fontify-region mhtml--submode-keymap mhtml--submode-keymap--cmacro mhtml--submode-lighter mhtml--submode-name mhtml--submode-name--cmacro mhtml--submode-p mhtml--submode-p--cmacro mhtml--submode-propertize mhtml--submode-propertize--cmacro mhtml--submode-syntax-table mhtml--submode-syntax-table--cmacro mhtml--syntax-propertize-submode mhtml--with-locals mhtml-indent-line mhtml-mode mhtml-syntax-propertize minibuffer-maybe-quote-filename mml--possibly-alter-image mml-buffer-substring-no-properties-except-some module-function-p mouse-drag-and-drop-region mouse-drag-bottom-edge mouse-drag-bottom-left-corner mouse-drag-bottom-right-corner mouse-drag-frame mouse-drag-left-edge mouse-drag-right-edge mouse-drag-top-edge mouse-drag-top-left-corner mouse-drag-top-right-corner mouse-resize-frame mutex-lock mutex-name mutex-unlock mutexp nndiary-last-occurrence nndiary-next-occurrence obarray-size obj-get-string-alignment obj-match-second-space-left obj-match-second-space-right obj-string-match-m org--align-node-property org--align-tags-here org--blank-before-heading-p org--deadline-or-schedule org--flyspell-object-check-p org--format-latex-make-overlay org--get-display-dpi org--get-expected-indentation org--get-outline-path-1 org--line-empty-p org--list-latex-overlays org--open-doi-link org--open-elisp-link org--open-help-link org--open-shell-link org--property-global-value org--property-local-values org--setup-collect-keywords org--update-property-plist org--valid-property-p org-activate-links org-agenda--mark-blocked-entry org-agenda--quit org-agenda--timestamp-to-absolute org-agenda-backward-block org-agenda-entry-get-agenda-timestamp org-agenda-filter-by-effort org-agenda-filter-make-matcher-tag-exp org-agenda-filter-show-all-effort org-agenda-forward-block org-agenda-redo-all org-agenda-set-restriction-lock-from-agenda org-agenda-today-p org-archive-all-matches org-archive-all-old org-ascii--current-justification org-ascii--describe-datum org-ascii--justify-element org-ascii--justify-lines org-ascii-node-property org-ascii-property-drawer org-at-planning-p org-attach-annex-get-maybe org-attach-archive-delete-maybe org-attach-url org-attach-use-annex org-babel--clear-results-maybe org-babel--get-vars org-babel--insert-results-keyword org-babel--normalize-body org-babel--script-escape-inner org-babel--string-to-number org-babel--variable-assignments:bash org-babel--variable-assignments:bash_array org-babel--variable-assignments:bash_assoc org-babel--variable-assignments:sh-generic org-babel-C-expand-C org-babel-C-expand-C++ org-babel-C-expand-D org-babel-C-header-to-C org-babel-C-table-sizes-to-C org-babel-C-utility-header-to-C org-babel-C-val-to-base-type org-babel-J-eval-string org-babel-J-interleave-echos org-babel-J-interleave-echos-except-functions org-babel-J-print-block org-babel-J-strip-whitespace org-babel-coq-clean-prompt org-babel-coq-initiate-session org-babel-examplify-region org-babel-execute:D org-babel-execute:J org-babel-execute:abc org-babel-execute:ash org-babel-execute:bash org-babel-execute:coq org-babel-execute:csh org-babel-execute:dash org-babel-execute:ebnf org-babel-execute:elisp org-babel-execute:forth org-babel-execute:groovy org-babel-execute:hledger org-babel-execute:j org-babel-execute:ksh org-babel-execute:lua org-babel-execute:mksh org-babel-execute:posh org-babel-execute:processing org-babel-execute:sed org-babel-execute:shell org-babel-execute:stan org-babel-execute:vala org-babel-exp--at-source org-babel-expand-body:C org-babel-expand-body:D org-babel-expand-body:J org-babel-expand-body:abc org-babel-expand-body:cpp org-babel-expand-body:elisp org-babel-forth-session-execute org-babel-generate-file-param org-babel-graphical-output-file org-babel-groovy-evaluate org-babel-groovy-initiate-session org-babel-header-args-safe-fn org-babel-j-initiate-session org-babel-latex-convert-pdf org-babel-load-session:lua org-babel-load-session:shell org-babel-lob--src-info org-babel-lua-evaluate org-babel-lua-evaluate-external-process org-babel-lua-evaluate-session org-babel-lua-initiate-session org-babel-lua-initiate-session-by-key org-babel-lua-read-string org-babel-lua-session-buffer org-babel-lua-table-or-string org-babel-lua-var-to-lua org-babel-lua-with-earmuffs org-babel-lua-without-earmuffs org-babel-make-language-alias org-babel-one-header-arg-safe-p org-babel-plantuml-make-body org-babel-prep-session:abc org-babel-prep-session:groovy org-babel-prep-session:hledger org-babel-prep-session:lua org-babel-prep-session:processing org-babel-prep-session:shell org-babel-prep-session:stan org-babel-prep-session:vala org-babel-processing-define-type org-babel-processing-var-to-processing org-babel-processing-view-sketch org-babel-read-element org-babel-remove-inline-result org-babel-remove-result-one-or-many org-babel-scheme--table-or-string org-babel-scheme-capture-current-message org-babel-shell-initialize org-babel-sql-convert-standard-filename org-babel-sql-dbstring-mssql org-babel-sql-dbstring-mysql org-babel-sql-dbstring-oracle org-babel-sql-dbstring-postgresql org-babel-sql-dbstring-sqsh org-babel-sql-dbstring-vertica org-babel-strip-quotes org-babel-variable-assignments:ash org-babel-variable-assignments:bash org-babel-variable-assignments:csh org-babel-variable-assignments:dash org-babel-variable-assignments:ksh org-babel-variable-assignments:lua org-babel-variable-assignments:mksh org-babel-variable-assignments:plantuml org-babel-variable-assignments:posh org-babel-variable-assignments:processing org-babel-variable-assignments:shell org-bbdb-anniversaries-future org-bbdb-anniversary-description org-bbdb-date-list org-cancel-repeater org-capture-store-last-position org-capture-upgrade-templates org-cdlatex-environment-indent org-clock--mode-line-heading org-clock--translate org-clock-drawer-name org-clock-sum-custom org-cmp-values org-columns--age-to-minutes org-columns--call org-columns--capture-view org-columns--clean-item org-columns--collect-values org-columns--compute-spec org-columns--display-here org-columns--display-here-title org-columns--displayed-value org-columns--format-age org-columns--new-overlay org-columns--overlay-text org-columns--set-widths org-columns--summarize org-columns--summary-apply-times org-columns--summary-checkbox org-columns--summary-checkbox-count org-columns--summary-checkbox-percent org-columns--summary-currencies org-columns--summary-estimate org-columns--summary-max org-columns--summary-max-age org-columns--summary-max-time org-columns--summary-mean org-columns--summary-mean-age org-columns--summary-mean-time org-columns--summary-min org-columns--summary-min-age org-columns--summary-min-time org-columns--summary-sum org-columns--summary-sum-times org-columns-hscroll-title org-columns-insert-dblock org-comment-dwim org-compile-file org-datetree--find-create org-datetree-find-iso-week-create org-deadline-close-p org-decrease-number-at-point org-define-error org-delete-indentation org-duration--modifier org-duration-from-minutes org-duration-h:mm-only-p org-duration-p org-duration-set-regexps org-duration-to-minutes org-edit-export-block org-edit-footnote-reference org-edit-inline-src-code org-edit-latex-environment org-edit-table\.el org-element--cache-active-p org-element--cache-after-change org-element--cache-before-change org-element--cache-compare org-element--cache-find org-element--cache-for-removal org-element--cache-generate-key org-element--cache-interrupt-p org-element--cache-key org-element--cache-key-less-p org-element--cache-process-request org-element--cache-put org-element--cache-remove org-element--cache-root org-element--cache-set-timer org-element--cache-shift-positions org-element--cache-submit-request org-element--cache-sync org-element--get-node-properties org-element--get-time-properties org-element--next-mode org-element--object-lex org-element--parse-paired-brackets org-element--parse-to org-element--set-regexps org-element-cache-refresh org-element-cache-reset org-element-class org-element-copy org-element-create org-element-extract-element org-element-insert-before org-element-lineage org-element-remove-indentation org-element-secondary-p org-element-update-syntax org-end-of-meta-data org-entities--user-safe-p org-eww-copy-for-org-mode org-eww-extend-eww-keymap org-eww-goto-next-url-property-change org-eww-has-further-url-property-change-p org-eww-store-link org-eww-url-below-point org-export--collect-tree-properties org-export--delete-comment-trees org-export--footnote-reference-map org-export--get-export-attributes org-export--inclusion-absolute-lines org-export--install-footnote-definitions org-export--missing-definitions org-export--prune-tree org-export--remove-uninterpreted-data org-export--smart-quote-status org-export--stack-generate org-export--stack-num-predicate org-export-custom-protocol-maybe org-export-file-uri org-export-format-reference org-export-get-reference org-export-insert-image-links org-export-match-search-cell-p org-export-new-reference org-export-search-cells org-export-string-to-search-cell org-export-table-row-in-header-p org-export-toc-entry-backend org-file-newer-than-p org-file-url-p org-fill-element org-fill-n-macro-as-item-nobreak-p org-find-property org-fontify-drawers org-fontify-macros org-footnote--allow-reference-p org-footnote--clear-footnote-section org-footnote--collect-definitions org-footnote--collect-references org-footnote--goto-local-insertion-point org-footnote--set-label org-footnote-sort org-get-at-eol org-get-priority-face org-habit-repeat-type org-html--html5-fancy-p org-html--priority org-html--svg-image org-html-format-headline-default-function org-html-format-inlinetask-default-function org-html-image-link-filter org-html-node-property org-in-commented-heading-p org-increase-number-at-point org-indent--compute-prefixes org-info--expand-node-name org-info-export org-info-map-html-url org-inlinetask-hide-tasks org-insert-last-stored-link org-invisible-p org-latex--caption-above-p org-latex--collect-warnings org-latex--environment-type org-latex--format-spec org-latex--insert-compiler org-latex--label org-latex--protect-text org-latex--remove-packages org-latex--translate org-latex--wrap-latex-math-block org-latex--wrap-latex-matrices org-latex-clean-invalid-line-breaks org-latex-format-inlinetask-default-function org-latex-guess-polyglossia-language org-latex-image-link-filter org-latex-make-preamble org-latex-math-block org-latex-math-block-options-filter org-latex-math-block-tree-filter org-latex-matrices org-latex-matrices-tree-filter org-latex-node-property org-latex-property-drawer org-link-escape-browser org-link-get-parameter org-link-set-parameters org-link-types org-lint org-lint--collect-duplicates org-lint--current-checker org-lint--current-line org-lint--display-reports org-lint--generate-reports org-lint--hide-checker org-lint--ignore-checker org-lint--jump-to-source org-lint--refresh-reports org-lint--report-mode org-lint--show-source org-lint-checker-categories org-lint-checker-categories--cmacro org-lint-checker-description org-lint-checker-description--cmacro org-lint-checker-name org-lint-checker-name--cmacro org-lint-checker-p org-lint-checker-p--cmacro org-lint-checker-trust org-lint-checker-trust--cmacro org-lint-colon-in-name org-lint-deprecated-category-setup org-lint-deprecated-export-blocks org-lint-deprecated-header-syntax org-lint-duplicate-custom-id org-lint-duplicate-footnote-definition org-lint-duplicate-name org-lint-duplicate-target org-lint-empty-headline-with-tags org-lint-extraneous-element-in-footnote-section org-lint-file-application org-lint-incomplete-drawer org-lint-indented-diary-sexp org-lint-invalid-babel-call-block org-lint-invalid-block org-lint-invalid-coderef-link org-lint-invalid-custom-id-link org-lint-invalid-effort-property org-lint-invalid-fuzzy-link org-lint-invalid-id-link org-lint-invalid-keyword-syntax org-lint-invalid-macro-argument-and-template org-lint-link-to-local-file org-lint-misplaced-planning-info org-lint-missing-backend-in-export-block org-lint-missing-checker-name org-lint-missing-language-in-src-block org-lint-non-existent-setupfile-parameter org-lint-obsolete-affiliated-keywords org-lint-obsolete-include-markup org-lint-obsolete-properties-drawer org-lint-orphaned-affiliated-keywords org-lint-quote-section org-lint-special-property-in-properties-drawer org-lint-undefined-footnote-reference org-lint-unknown-options-item org-lint-unreferenced-footnote-definition org-lint-wrong-header-argument org-lint-wrong-header-value org-lint-wrong-include-link-parameter org-list--depth org-list--generic-eval org-list--to-generic-item org-list--to-generic-plain-list org-list--trailing-newlines org-list-to-lisp org-list-to-org org-log-beginning org-macro--counter-increment org-macro--counter-initialize org-macro--vc-modified-time org-macro-escape-arguments org-macro-extract-arguments org-man--protect-text org-man-node-property org-man-property-drawer org-mark-jump-unhide org-md--build-toc org-md--footnote-formatted org-md--footnote-section org-md--headline-referred-p org-md--headline-title org-md-export-block org-md-keyword org-md-node-property org-md-property-drawer org-md-publish-to-md org-next-line-empty-p org-next-visible-heading org-odt--format-toc org-odt--translate-image-links org-odt-format-headline-default-function org-odt-format-inlinetask-default-function org-odt-node-property org-org--add-missing-sections org-org-export-block org-org-link org-org-template org-previous-visible-heading org-protocol-assign-parameters org-protocol-parse-parameters org-publish--expand-file-name org-publish--sitemap-files-to-lisp org-publish--store-crossrefs org-publish-file-relative-name org-publish-find-property org-publish-property org-publish-resolve-external-link org-publish-sitemap org-publish-sitemap-default org-publish-sitemap-default-entry org-read-function org-refresh-effort-properties org-refresh-property org-refresh-stats-properties org-reset-file-cache org-search-radio-target org-show-children org-show-set-visibility org-src--construct-edit-buffer-name org-src--contents-area org-src--contents-for-write-back org-src--coordinates org-src--edit-buffer org-src--edit-element org-src--get-lang-mode org-src--goto-coordinates org-src--make-source-overlay org-src--on-datum-p org-src--remove-overlay org-src--source-buffer org-src-coderef-format org-src-coderef-regexp org-store-link-functions org-string-display org-table--descriptor-line org-table--error-on-old-row-references org-table--generic-apply org-table--row-type org-table--to-generic-cell org-table--to-generic-row org-table--to-generic-table org-table-analyze org-table-goto-field org-table-message-once-per-second org-table-remote-reference-indirection org-table-save-field org-tag-add-to-alist org-tag-alist-to-groups org-tag-alist-to-string org-tag-string-to-alist org-texinfo--@ref org-texinfo--filter-section-blank-lines org-texinfo--inline-image org-texinfo--sanitize-title org-texinfo--structuring-command org-texinfo--untabify org-texinfo--wrap-float org-texinfo-format-headline-default-function org-texinfo-format-inlinetask-default-function org-texinfo-node-property org-texinfo-strike-through org-texinfo-underline org-timer--get-timer-title org-timer--run-countdown-timer org-timestamp--to-internal-time org-toggle-fixed-width org-toggle-latex-fragment org-unbracket-string orgtbl-ascii-draw orgtbl-ascii-plot orgtbl-uc-draw-cont orgtbl-uc-draw-grid pcomplete/find perl-flymake pixel--whistlestop-line-up pixel--whistlestop-pixel-up pixel-bob-at-top-p pixel-eob-at-top-p pixel-line-height pixel-point-at-bottom-p pixel-point-at-top-p pixel-point-at-unseen-line pixel-posn-y-at-point pixel-scroll-down pixel-scroll-down-and-set-window-vscroll pixel-scroll-in-rush-p pixel-scroll-mode pixel-scroll-pixel-down pixel-scroll-pixel-up pixel-scroll-up pixel-visible-pos-in-window pixel-visual-line-height print--preprocess process-thread prog-first-column provided-mode-derived-p puny-adapt puny-decode-digit puny-decode-domain puny-decode-string puny-decode-string-internal puny-encode-complex puny-encode-digit puny-encode-domain puny-encode-string puny-highly-restrictive-domain-p puny-highly-restrictive-string-p python--flymake-parse-output python-describe-at-point python-flymake python-imenu--get-defun-type-name quickurl--assoc-function quickurl-format-url quickurl-sort-urls radix-tree--insert radix-tree--lookup radix-tree--prefixes radix-tree--remove radix-tree--subtree radix-tree-count radix-tree-from-map radix-tree-insert radix-tree-iter-mappings radix-tree-iter-subtrees radix-tree-leaf--pcase-macroexpander radix-tree-lookup radix-tree-prefixes radix-tree-subtree read-library-name read-multiple-choice readable-foreground-color record recordp region-bounds region-modifiable-p register-definition-prefixes remove-variable-watcher replace--push-stack replace-buffer-contents rgrep-find-ignored-directories rmail-remote-proto-p rng-completion-at-point rng-strings-to-completion-table rst-Ado--style rst-Ado--style--cmacro rst-Ado--validate-char rst-Ado-char rst-Ado-char--cmacro rst-Ado-equal rst-Ado-is-over-and-under rst-Ado-is-section rst-Ado-is-simple rst-Ado-is-transition rst-Ado-new-invert rst-Ado-new-over-and-under rst-Ado-new-simple rst-Ado-new-transition rst-Ado-new-transition--cmacro rst-Ado-p rst-Ado-p--cmacro rst-Ado-position rst-Hdr--validate-ado rst-Hdr--validate-indent rst-Hdr-ado rst-Hdr-ado--cmacro rst-Hdr-ado-map rst-Hdr-get-char rst-Hdr-indent rst-Hdr-indent--cmacro rst-Hdr-is-over-and-under rst-Hdr-member-ado rst-Hdr-new rst-Hdr-new-invert rst-Hdr-new-lax rst-Hdr-p rst-Hdr-p--cmacro rst-Hdr-preferred-adornments rst-Stn--validate-children rst-Stn--validate-level rst-Stn--validate-ttl rst-Stn-children rst-Stn-children--cmacro rst-Stn-get-text rst-Stn-get-title-beginning rst-Stn-is-top rst-Stn-level rst-Stn-level--cmacro rst-Stn-new rst-Stn-p rst-Stn-p--cmacro rst-Stn-ttl rst-Stn-ttl--cmacro rst-Ttl--new rst-Ttl--validate-ado rst-Ttl--validate-indent rst-Ttl--validate-match rst-Ttl--validate-text rst-Ttl-ado rst-Ttl-ado--cmacro rst-Ttl-contains rst-Ttl-from-buffer rst-Ttl-get-beginning rst-Ttl-get-end rst-Ttl-get-title-beginning rst-Ttl-hdr rst-Ttl-hdr--cmacro rst-Ttl-indent rst-Ttl-indent--cmacro rst-Ttl-is-candidate rst-Ttl-is-section rst-Ttl-match rst-Ttl-match--cmacro rst-Ttl-p rst-Ttl-p--cmacro rst-Ttl-text rst-Ttl-text--cmacro rst-adjust-new-hdr rst-adjust-region rst-adjust-section rst-all-stn rst-all-ttls rst-all-ttls-compute rst-all-ttls-with-level rst-apply-indented-blocks rst-deprecated-straighten-sections rst-deprecated-toc-follow-link rst-destructuring-dolist rst-display-hdr-hierarchy rst-find-begs rst-forward-line-looking-at rst-forward-line-strict rst-get-previous-hdr rst-hdr-hierarchy rst-infer-hdr-hierarchy rst-insert-list-new-tag rst-new-preferred-hdr rst-next-hdr rst-remaining-stn rst-stn-containing-point rst-straighten-sections rst-toc-follow-link rst-toc-get-link rst-toc-insert-children rst-toc-insert-link rst-toc-insert-stn rst-toc-insert-tree rst-toc-mode-follow-link-kill rst-toc-mode-mouse-follow-link-kill rst-toc-mode-return rst-toc-mode-return-kill rst-toc-mouse-follow-link rst-ttl-at-point ruby-flymake--helper ruby-flymake-auto ruby-flymake-rubocop ruby-flymake-simple ruler-mode-text-scaled-width ruler-mode-text-scaled-window-hscroll ruler-mode-text-scaled-window-width rx--pcase-macroexpander scss-font-lock-keywords secondary-selection-exist-p secondary-selection-from-region secondary-selection-to-region secure-hash-algorithms seq--into-list seq--into-string seq--into-vector seq-do-indexed seq-map-indexed seq-random-elt seq-set-equal-p seq-sort-by ses--edit-cell-completion-at-point-function ses--read-printer-completion-at-point-function ses-define-if-new-local-printer ses-edit-cell-complete-symbol ses-list-local-printers ses-list-named-cells ses-prin1 ses-read-printer-complete-symbol set--this-command-keys set-buffer-redisplay set-process-thread sgml--find-<>-backward sgml-forward-sexp sgml-syntax-propertize sgml-syntax-propertize-inside shell-command--save-pos-or-erase shell-command--set-point-after-cmd shr--preferred-image shr--remove-blank-lines-at-the-end shr--translate-insertion-chars shr-collect-extra-strings-in-table shr-indirect-call shr-make-placeholder-image shr-maybe-probe-and-copy-url shr-probe-and-copy-url shr-probe-url shr-string-number shr-tag-bdi shr-tag-bdo shr-tag-ins shr-url-at-point sieve-syntax-propertize sieve-syntax-propertize-text smerge--refine-chopup-region smerge--refine-forward smerge--refine-highlight-change smerge-diff-base-lower smerge-diff-base-upper smerge-diff-upper-lower smerge-keep-lower smerge-keep-upper smerge-refine-regions snake-set-dot soap-find-operation soap-find-port soap-operation-arity split-window-no-error sql-oracle--list-object-name sql-postgres-list-databases string-version-lessp subr--with-wrapper-hook-no-warnings svg--append svg--arguments svg--def svg--image-data svg-circle svg-create svg-ellipse svg-embed svg-gradient svg-image svg-insert-image svg-line svg-polygon svg-polyline svg-possibly-update-image svg-print svg-rectangle svg-remove svg-text sxhash-eq sxhash-eql sxhash-equal syntax-ppss--data tabulated-list--col-local-max-widths tabulated-list-header-overlay-p tabulated-list-line-number-width tabulated-list-watch-line-number-width tabulated-list-window-scroll-function tar--describe-as-link temporary-file-directory term-goto-process-mark-maybe term-line-mode-buffer-read-only-update term-process-mark term-send-ctrl-down term-send-ctrl-left term-send-ctrl-right term-send-ctrl-up term-set-goto-process-mark tex-chktex tex-chktex-command thread--blocker thread-alive-p thread-join thread-last-error thread-name thread-signal thread-yield threadp time--display-world-list timer-list-cancel timer-list-mode todo--files-type-list todo-hl-line-range todo-update-filelist-defcustoms tramp-adb-handle-file-system-info tramp-build-completion-file-name-regexp tramp-build-file-name-regexp tramp-build-file-name-structure tramp-build-method-regexp tramp-build-postfix-host-format tramp-build-postfix-host-regexp tramp-build-postfix-ipv6-format tramp-build-postfix-ipv6-regexp tramp-build-postfix-method-format tramp-build-postfix-method-regexp tramp-build-prefix-format tramp-build-prefix-ipv6-format tramp-build-prefix-ipv6-regexp tramp-build-prefix-regexp tramp-build-remote-file-name-spec-regexp tramp-change-syntax tramp-compat-directory-name-p tramp-compat-file-attribute-group-id tramp-compat-file-attribute-link-number tramp-compat-file-attribute-modes tramp-compat-file-attribute-modification-time tramp-compat-file-attribute-size tramp-compat-file-attribute-type tramp-compat-file-attribute-user-id tramp-compat-file-name-quote tramp-compat-file-name-quoted-p tramp-compat-file-name-unquote tramp-compat-temporary-file-directory-function tramp-compat-tramp-file-name-slots tramp-compat-tramp-syntax tramp-compat-user-error tramp-file-name-domain--cmacro tramp-file-name-equal-p tramp-file-name-hop--cmacro tramp-file-name-host--cmacro tramp-file-name-host-port tramp-file-name-localname--cmacro tramp-file-name-method--cmacro tramp-file-name-p--cmacro tramp-file-name-port--cmacro tramp-file-name-port-or-default tramp-file-name-unquote-localname tramp-file-name-user--cmacro tramp-file-name-user-domain tramp-get-remote-df tramp-handle-add-name-to-file tramp-handle-file-name-case-insensitive-p tramp-handle-file-selinux-context tramp-handle-file-truename tramp-handle-make-nearby-temp-file tramp-handle-temporary-file-directory tramp-interrupt-process tramp-lookup-syntax tramp-parse-default-user-host tramp-parse-etc-group tramp-parse-etc-group-group tramp-register-foreign-file-name-handler tramp-rfn-eshadow-update-overlay-regexp tramp-set-connection-local-variables tramp-set-connection-local-variables-for-buffer tramp-set-syntax tramp-sh-handle-file-system-info tramp-smb-handle-file-system-info tramp-syntax-values tramp-unquote-shell-quote-argument tramp-use-absolute-autoload-file-names tramp-with-demoted-errors tty-color-24bit undo-amalgamate-change-group url-asynchronous url-asynchronous--cmacro url-cookie-delete-cookies url-digest-auth-build-response url-digest-auth-colonjoin url-digest-auth-directory-id url-digest-auth-directory-id-assoc url-digest-auth-kd url-digest-auth-make-cnonce url-digest-auth-make-ha1 url-digest-auth-make-ha2 url-digest-auth-make-request-digest url-digest-auth-make-request-digest-qop url-digest-auth-name-value-string url-digest-auth-nonce-count url-digest-auth-server-id url-digest-auth-source-creds url-digest-cache-key url-digest-cached-key url-digest-find-creds url-digest-find-new-key url-digest-prompt-creds url-http--user-agent-default-string url-https-proxy-after-change-function url-https-proxy-connect url-queue-check-progress userlock--ask-user-about-supersession-threat userlock--check-content-unchanged vc-git--asciify-coding-system vc-git--git-status-to-vc-state vc-git--program-version vc-git-dir-status-state->files vc-git-dir-status-state->files--cmacro vc-git-dir-status-state->hash vc-git-dir-status-state->hash--cmacro vc-git-dir-status-state->stage vc-git-dir-status-state->stage--cmacro vc-git-dir-status-state->update-function vc-git-dir-status-state->update-function--cmacro vc-git-dir-status-state-p vc-git-dir-status-state-p--cmacro vc-git-dir-status-update-file vc-hg--active-bookmark-internal vc-hg--cached-dirstate-search vc-hg--escape-for-pcre vc-hg--file-ignored-p vc-hg--glob-to-pcre vc-hg--hgignore-add-glob vc-hg--hgignore-add-path vc-hg--hgignore-add-pcre vc-hg--ignore-patterns-file-sources vc-hg--ignore-patterns-file-sources--cmacro vc-hg--ignore-patterns-ignore-patterns vc-hg--ignore-patterns-ignore-patterns--cmacro vc-hg--ignore-patterns-ignored-p vc-hg--ignore-patterns-make vc-hg--ignore-patterns-make--cmacro vc-hg--ignore-patterns-p vc-hg--ignore-patterns-p--cmacro vc-hg--ignore-patterns-repo vc-hg--ignore-patterns-repo--cmacro vc-hg--ignore-patterns-valid-p vc-hg--parts-to-string vc-hg--pcre-to-elisp-re vc-hg--raw-dirstate-search vc-hg--read-repo-requirements vc-hg--read-u32-be vc-hg--read-u8 vc-hg--requirements-understood-p vc-hg--run-log vc-hg--slurp-hgignore vc-hg--slurp-hgignore-1 vc-hg--symbolic-revision vc-hg--time-to-fixnum vc-hg-mode-line-string vc-hg-state-fast vc-hg-state-slow vc-print-branch-log vc-rcs-dir-extra-headers verilog-completion-at-point verilog-define-abbrev-table verilog-delete-auto-buffer verilog-read-sub-decls-type verilog-restore-buffer-modified-p verilog-save-font-no-change-functions verilog-speedbar-initialize verilog-substitute-file-name-path version-control-safe-local-p viper--advice-add viper--deactivate-advice-list w32-set-default-process-coding-system w32-set-system-coding-system wdired-create-parentdirs when-let* which-func-try-to-enable window--make-major-side-window window--make-major-side-window-next-to window--sides-check window--sides-check-failed window--sides-reverse window--sides-reverse-all window--sides-reverse-frame window--sides-reverse-on-frame-p window--sides-reverse-side window--sides-verticalize window--sides-verticalize-frame window-largest-empty-rectangle window-largest-empty-rectangle--disjoint-maximums window-largest-empty-rectangle--maximums window-largest-empty-rectangle--maximums-1 window-lines-pixel-dimensions window-main-window window-pixel-height-before-size-change window-pixel-width-before-size-change window-swap-states window-toggle-side-windows with-connection-local-profiles with-mutex xdg--dir-home xdg--substitute-home-env xdg--user-dirs-parse-file xdg--user-dirs-parse-line xdg-cache-home xdg-config-dirs xdg-config-home xdg-data-dirs xdg-data-home xdg-desktop-read-file xdg-desktop-read-group xdg-desktop-strings xdg-runtime-dir xdg-thumb-mtime xdg-thumb-name xdg-thumb-uri xdg-user-dir xref--regexp-syntax-dependent-p xref-quit-and-goto-xref xwidget-webkit-adjust-size-in-frame xwidget-webkit-auto-adjust-size xwidget-webkit-scroll-bottom xwidget-webkit-scroll-top xwidget-webkit-show-element xwidget-webkit-zoom-in xwidget-webkit-zoom-out)) - (variables - (removed *orgtbl-default-fmt* *orgtbl-efmt* *orgtbl-fmt* *orgtbl-hline* *orgtbl-lend* *orgtbl-lfmt* *orgtbl-llend* *orgtbl-llfmt* *orgtbl-llstart* *orgtbl-lstart* *orgtbl-rtn* *orgtbl-sep* *orgtbl-table* 8859-1-map 8859-to-swascii-trans :AFTER :BEFORE :ICALENDAR-MARK :alt-title :beamer-header-extra :cf :conc-name :constructor :csep :days :effort-durations :export-block :filter-comment :filter-comment-block :filter-quote-section :footnote-definition-alist :hiddenp :hlsep :hours :html-link-org-as-html :icalendar-agenda-view :inline-definition :json-eof :latex-hyperref-p :lsep :minutes :months :no-escape :nobr :numbering :omitted :one-file-with-archives :pdfpng :quotedp :remove-newlines :remove-nil-lines :require-days :require-hours :require-minutes :require-months :require-weeks :require-years :sitemap-alphabetically :sitemap-date-format :sitemap-file-entry-format :sitemap-sans-extension :skipheadrule :weeks :with-vtodo :years ansi-color-drop-regexp ansi-color-regexp antlr-default-face antlr-keyword-face antlr-literal-face antlr-ruledef-face antlr-ruleref-face antlr-syntax-face antlr-tokendef-face antlr-tokenref-face auth-source-magic awk-font-lock-syntactic-keywords battery--linux-sysfs-regexp c--mapcan-status c-cpp-delimiter c-old-BOM c-old-EOM calculator-saved-global-map checkdoc-defun-regexp cl-struct-avl-tree- cl-struct-avl-tree--node cl-struct-avl-tree--stack cl-struct-cl--class cl-struct-cl--generic cl-struct-cl--generic-generalizer cl-struct-cl--generic-method cl-struct-cl-slot-descriptor cl-struct-cl-structure-class cl-struct-cl-structure-object cl-struct-compilation--message cl-struct-cvs-fileinfo cl-struct-cvs-flags cl-struct-cvs-qtypedesc cl-struct-cvs-tag cl-struct-edebug--form-data cl-struct-eieio--class cl-struct-eieio--object cl-struct-eieio--object-tags cl-struct-epg-context cl-struct-epg-data cl-struct-epg-import-result cl-struct-epg-import-status cl-struct-epg-key cl-struct-epg-key-signature cl-struct-epg-new-signature cl-struct-epg-sig-notation cl-struct-epg-signature cl-struct-epg-sub-key cl-struct-epg-user-id cl-struct-erc-response cl-struct-ert--ewoc-entry cl-struct-ert--stats cl-struct-ert--test-execution-info cl-struct-ert-test cl-struct-ert-test-aborted-with-non-local-exit cl-struct-ert-test-failed cl-struct-ert-test-passed cl-struct-ert-test-quit cl-struct-ert-test-result cl-struct-ert-test-result-with-condition cl-struct-ert-test-skipped cl-struct-ewoc cl-struct-ewoc--node cl-struct-flymake-ler cl-struct-flymake-ler-tags cl-struct-gdb-handler cl-struct-gdb-table cl-struct-isearch--state cl-struct-js--js-handle cl-struct-js--pitem cl-struct-nnimap cl-struct-nnmaildir--art cl-struct-nnmaildir--grp cl-struct-nnmaildir--srv cl-struct-org-export-backend cl-struct-package--ac-desc cl-struct-package--bi-desc cl-struct-package-desc cl-struct-profiler-calltree cl-struct-profiler-profile cl-struct-rng--ipattern cl-struct-ses--locprn cl-struct-ses-cell cl-struct-sgml-tag cl-struct-soap-binding cl-struct-soap-bound-operation cl-struct-soap-element cl-struct-soap-message cl-struct-soap-namespace cl-struct-soap-namespace-link cl-struct-soap-operation cl-struct-soap-port cl-struct-soap-port-type cl-struct-soap-wsdl cl-struct-soap-xs-attribute cl-struct-soap-xs-attribute-group cl-struct-soap-xs-basic-type cl-struct-soap-xs-complex-type cl-struct-soap-xs-element cl-struct-soap-xs-simple-type cl-struct-soap-xs-type cl-struct-timer cl-struct-uniquify-item cl-struct-url cl-struct-url-future cl-struct-url-queue cl-struct-vc-bzr-extra-fileinfo cl-struct-vc-dir-fileinfo cl-struct-vc-git-extra-fileinfo cl-struct-vc-hg-extra-fileinfo cl-struct-xref-elisp-location default-abbrev-mode default-buffer-file-coding-system default-case-fold-search default-ctl-arrow default-cursor-in-non-selected-windows default-cursor-type default-enable-multibyte-characters default-fill-column default-fringe-cursor-alist default-fringe-indicator-alist default-fringes-outside-margins default-header-line-format default-indicate-buffer-boundaries default-indicate-empty-lines default-left-fringe-width default-left-margin default-left-margin-width default-line-spacing default-major-mode default-mode-line-format default-right-fringe-width default-right-margin-width default-scroll-bar-width default-scroll-down-aggressively default-scroll-up-aggressively default-tab-width default-truncate-lines default-vertical-scroll-bar diff-added-face diff-changed-face diff-context-face diff-file-header-face diff-function-face diff-header-face diff-hunk-header-face diff-index-face diff-nonexistent-face diff-removed-face edebug-after-dotted-spec eieio-class-tag--auth-source-backend eieio-class-tag--chart eieio-class-tag--chart-axis eieio-class-tag--chart-axis-names eieio-class-tag--chart-axis-range eieio-class-tag--chart-bar eieio-class-tag--chart-sequece eieio-class-tag--ede-project eieio-class-tag--ede-project-autoload eieio-class-tag--ede-project-autoload-dirmatch eieio-class-tag--ede-project-placeholder eieio-class-tag--ede-sourcecode eieio-class-tag--ede-target eieio-class-tag--eieio-default-superclass eieio-class-tag--eieio-instance-inheritor eieio-class-tag--eieio-instance-tracker eieio-class-tag--eieio-named eieio-class-tag--eieio-persistent eieio-class-tag--eieio-singleton eieio-class-tag--eieio-speedbar eieio-class-tag--eieio-speedbar-directory-button eieio-class-tag--eieio-speedbar-file-button eieio-class-tag--eieio-widget-test-class eieio-class-tag--gnus-icalendar-event eieio-class-tag--gnus-icalendar-event-cancel eieio-class-tag--gnus-icalendar-event-reply eieio-class-tag--gnus-icalendar-event-request eieio-class-tag--registry-db eieio-class-tag--xref-bogus-location eieio-class-tag--xref-buffer-location eieio-class-tag--xref-etags-location eieio-class-tag--xref-file-location eieio-class-tag--xref-item eieio-class-tag--xref-location eieio-class-tag--xref-match-item erc-menu erc-message-english-netjoin erc-message-english-netjoin-done erc-message-english-netsplit erc-message-english-netsplit-none erc-message-english-netsplit-wholeft flymake-base-dir flymake-check-was-interrupted flymake-err-info flymake-find-buildfile-cache flymake-get-project-include-dirs-function flymake-is-running flymake-last-change-time flymake-master-file-name flymake-mode-line flymake-mode-line-e-w flymake-mode-line-status flymake-new-err-info flymake-output-residual flymake-processes flymake-project-include-dirs-cache flymake-temp-master-file-name flymake-temp-source-file-name flymake-warning-predicate follow-inside-post-command-hook gnus-down-mouse-2 gnus-down-mouse-3 gnus-make-format-preserve-properties gnus-mode-line-modified gnus-mouse-2 gnus-mouse-face-prop gnus-summary-display-table gnus-sync-backend gnus-sync-file-encrypt-to gnus-sync-global-vars gnus-sync-lesync-design-prefix gnus-sync-lesync-install-topics gnus-sync-lesync-name gnus-sync-lesync-props-hash gnus-sync-lesync-security-object gnus-sync-newsrc-groups gnus-sync-newsrc-loader gnus-sync-newsrc-offsets gnus-sync-unload-hook gnus-use-correct-string-widths gnus-widget-button-keymap icomplete-prospects-length image-dired-cmd-create-standard-thumbnail-command isearch-lazy-highlight-face iso-accents-enable iso-accents-insert-offset iso-accents-list iso-accents-mode iso-language iso-languages ispell-emacs-alpha-regexp ispell-menu-xemacs ispell-offset ispell-required-version ispell-version js--syntax-propertize-regexp-syntax-table json-readtable lazy-highlight-face lisp--prettify-symbols-alist log-view-file-face log-view-message-face message-valid-fqdn-regexp mm-codepage-ibm-list mm-codepage-iso-8859-list news-group-hook-alist news-inews-hook nxml-ascii-glyph-set nxml-autoload-char-name-set-list nxml-char-name-alist nxml-char-name-ignore-case nxml-char-name-table nxml-enabled-unicode-blocks nxml-enabled-unicode-blocks-default nxml-glyph-set nxml-glyph-set-functions nxml-glyph-set-hook nxml-internal-unicode-char-name-sets-enabled nxml-latin1-glyph-set nxml-misc-fixed-1-glyph-set nxml-misc-fixed-2-glyph-set nxml-misc-fixed-3-glyph-set nxml-named-char-history nxml-scan-end nxml-unicode-blocks nxml-wgl4-glyph-set old-style-backquotes org-agenda-filter-effort-default-operator org-agenda-menu-two-column org-agenda-ndays org-agenda-only-exact-dates org-agenda-repeating-timestamp-show-all org-alphabetical-lists org-babel-block-lob-one-liner-regexp org-babel-call-process-region-original org-babel-capitalize-examplize-region-markers org-babel-data-names org-babel-default-header-args:scala org-babel-default-header-args:sh org-babel-inline-lob-one-liner-regexp org-babel-inline-src-block-regexp org-babel-lilypond-OSX-ly-path org-babel-lilypond-OSX-midi-path org-babel-lilypond-OSX-pdf-path org-babel-lilypond-nix-ly-path org-babel-lilypond-nix-midi-path org-babel-lilypond-nix-pdf-path org-babel-lilypond-w32-ly-path org-babel-lilypond-w32-midi-path org-babel-lilypond-w32-pdf-path org-babel-lob-files org-babel-lob-one-liner-regexp org-babel-ref-split-regexp org-babel-scala-command org-babel-scala-wrapper-method org-babel-sh-command org-babel-sh-var-quote-fmt org-babel-src-name-w-name-regexp org-clock-modeline-total org-columns-compile-map org-columns-current-widths org-completion-fallback-command org-completion-use-ido org-completion-use-iswitchb org-context-choice org-description-max-indent org-drawers org-drawers-for-agenda org-edit-src-allow-write-back-p org-edit-src-beg-marker org-edit-src-block-indentation org-edit-src-code-timer org-edit-src-end-marker org-edit-src-force-single-line org-edit-src-from-org-mode org-edit-src-overlay org-edit-src-picture org-edit-src-region-extra org-edit-src-saved-temp-window-config org-element-all-successors org-element-block-name-alist org-element-document-properties org-element-link-type-is-file org-element-object-successor-alist org-empty-line-terminates-plain-lists org-enable-table-editor org-entities-ascii-explanatory org-export--registered-backends org-export-filter-comment-block-functions org-export-filter-comment-functions org-export-filter-quote-section-functions org-export-smart-quotes-regexps org-finalize-agenda-hook org-footnote-tag-for-non-org-mode-files org-format-transports-properties-p org-gnus-nnimap-query-article-no-from-file org-hierarchical-checkbox-statistics org-html-style-include-default org-html-style-include-scripts org-html-table-row-tags org-html-use-unicode-chars org-indent-initial-marker org-indent-max org-indent-max-levels org-indent-stars org-indent-strings org-insert-labeled-timestamps-at-point org-latex-fragment-image-overlays org-latex-known-errors org-latex-table-caption-above org-link-escape-chars-browser org-link-links-in-this-file org-link-mailto-program org-link-protocols org-link-to-org-use-id org-link-types org-list-empty-line-terminates-plain-lists org-man-custom-lang-environments org-olpa org-open-link-marker org-ota org-planning-or-clock-line-re org-publish-sitemap-date-format org-publish-temp-files org-quote-string org-read-date-minibuffer-setup-hook org-show-entry-below org-show-following-heading org-show-hierarchy-above org-show-siblings org-src-babel-info org-src-strip-leading-and-trailing-blank-lines org-store-link-functions org-table-clean-did-remove-column org-table-current-begin-line org-table-error-on-row-ref-crossing-hline org-time-clocksum-format org-time-clocksum-fractional-format org-time-clocksum-use-effort-durations org-time-clocksum-use-fractional org-timeline-show-empty-dates org-timer-cancel-hook org-timer-current-timer org-timer-timer-is-countdown org-xemacs-key-equivalents org-xemacs-p pinentry--connection-process-list pinentry--error-cancelled pinentry--error-not-confirmed pinentry--error-not-implemented pinentry--labels pinentry--prompt-buffer pinentry--read-point pinentry--server-process pinentry--set-label-commands pinentry--socket-dir pinentry-debug pinentry-debug-buffer pinentry-popup-prompt-window pinentry-prompt-mode-abbrev-table pinentry-prompt-mode-hook pinentry-prompt-mode-map pinentry-prompt-mode-syntax-table pinentry-prompt-window-height redisplay--variables resume-emacs-args-buffer resume-emacs-args-file rng-attribute-name-history rng-attribute-value-history rng-complete-extra-strings rng-complete-name-attribute-flag rng-complete-target-names rng-tag-history rst-all-sections rst-initial-enums rst-section-hierarchy rst-toc-insert-click-keymap rst-toc-return-wincfg scribe-close-parentheses scribe-electric-parenthesis scribe-electric-quote scribe-fancy-paragraphs scribe-mode-abbrev-table scribe-mode-hook scribe-mode-map scribe-mode-syntax-table scribe-open-parentheses scss-font-lock-keywords sgml-syntax-propertize-function sh-heredoc-face sieve-action-commands-face sieve-control-commands-face sieve-tagged-arguments-face sieve-test-commands-face smerge-mine-face smerge-other-face smerge-other-re snake-cycle spell-command spell-filter swascii-to-8859-trans swedish-re symbol-completion-completions-function symbol-completion-predicate-function symbol-completion-symbol-function symbol-completion-transform-function syntax-ppss-cache syntax-ppss-last tex-math-face tex-verbatim-face texinfo-heading-face time-stamp-old-format-warn tramp-color-escape-sequence-regexp tramp-completion-file-name-regexp-unified tramp-file-name-regexp-separate tramp-file-name-regexp-unified tramp-gw-aux-proc tramp-gw-default-socks-port tramp-gw-default-tunnel-port tramp-gw-gw-proc tramp-gw-gw-vector tramp-gw-socks-method tramp-gw-tunnel-method tramp-gw-vector tramp-obsolete-methods tramp-parse-time-months tramp-rfn-eshadow-update-overlay-regexp tramp-warned-obsolete-methods verilog-font-grouping-keywords-face viper-buffer-undo-list-mark viper-undo-needs-adjustment whitespace-indent-tabs-mode whitespace-tab-width window-sides window-text-change-functions woman-justify-list xref--window) - (added :--found :--map-first-match :TIMEZONE :UNNUMBERED :activate-func :ascii-art :ascii-bullets :ascii-caption-above :ascii-format-drawer-function :ascii-format-inlinetask-function :ascii-global-margin :ascii-headline-spacing :ascii-indented-line-width :ascii-inlinetask-width :ascii-inner-margin :ascii-links-to-notes :ascii-list-margin :ascii-paragraph-spacing :ascii-quote-margin :ascii-table-keep-all-vertical-lines :ascii-table-use-ascii-art :ascii-table-widen-columns :ascii-text-width :ascii-underline :ascii-verbatim-format :beamer-column-view-format :beamer-environments-extra :beamer-frame-default-options :beamer-header :beamer-outline-frame-options :beamer-outline-frame-title :beamer-subtitle-format :beg :call :captured-locals :categories :cipher-aead-capable :cipher-blocksize :cipher-id :cipher-ivsize :cipher-keysize :cipher-tagsize :clock :coderef-match :commentstop :commit :compare :complete-negotiation :configuration-error :crossrefs :crucial-captured-locals :custom-id :dbport :debug-on-exit :diagnostic :diags :digest-algorithm-id :digest-algorithm-length :disabled :elisp-flymake-output-start :end-header :end-tag :endgrouptag :exit :fallback :file-ext :file-sources :fill :fill-color :filter-body :follow :footnote-definition-cache :fuzzy-match :gradient :hash :hline-string :hop :hsep :html-allow-name-attribute-in-anchors :html-checkbox-type :html-divs :html-footnote-format :html-footnote-separator :html-footnotes-section :html-format-drawer-function :html-format-headline-function :html-format-inlinetask-function :html-home/up-format :html-indent :html-infojs-options :html-infojs-template :html-inline-image-rules :html-klipse-css :html-klipse-js :html-klipse-selection-script :html-klipsify-src :html-link-org-files-as-html :html-mathjax-options :html-mathjax-template :html-metadata-timestamp-format :html-postamble-format :html-preamble-format :html-table-align-individual-fields :html-table-caption-above :html-table-data-tags :html-table-header-tags :html-table-row-close-tag :html-table-row-open-tag :html-table-use-header-tags-for-first-column :html-tag-class-prefix :html-text-markup-alist :html-todo-kwd-class-prefix :html-toplevel-hlevel :html-use-infojs :html-validation-link :html-viewport :html: :htmlize-link :icalendar-alarm-time :icalendar-categories :icalendar-date-time-format :icalendar-include-bbdb-anniversaries :icalendar-include-body :icalendar-include-sexps :icalendar-include-todo :icalendar-store-UID :icalendar-timezone :icalendar-use-deadline :icalendar-use-scheduled :ifmt :ignore-patterns :image-converter :image-input-type :image-output-type :image-size-adjust :imports :inside-header :internal-references :latex-active-timestamp-format :latex-caption-above :latex-classes :latex-compiler :latex-default-figure-position :latex-default-table-environment :latex-default-table-mode :latex-diary-timestamp-format :latex-footnote-defined-format :latex-footnote-separator :latex-format-drawer-function :latex-format-headline-function :latex-format-inlinetask-function :latex-hyperref-template :latex-image-default-height :latex-image-default-option :latex-image-default-width :latex-images-centered :latex-inactive-timestamp-format :latex-inline-image-rules :latex-link-with-unknown-path-format :latex-listings :latex-listings-langs :latex-listings-options :latex-minted-langs :latex-minted-options :latex-prefer-user-labels :latex-subtitle-format :latex-subtitle-separate :latex-table-scientific-notation :latex-tables-booktabs :latex-tables-centered :latex-text-markup-alist :latex-title-command :latex-toc-command :lexical :libs :localname :mac-algorithm-id :mac-algorithm-keysize :mac-algorithm-length :mac-algorithm-noncesize :machine :man-source-highlight :man-source-highlight-langs :man-table-scientific-notation :man-tables-centered :man-tables-verbatim :markup :md-footnote-format :md-footnotes-section :md-headline-style :move :name-match :newsrc-data :no-group :no-object :no-prompt :nowarn :odt-content-template-file :odt-display-outline-level :odt-fontify-srcblocks :odt-format-drawer-function :odt-format-headline-function :odt-format-inlinetask-function :odt-inline-formula-rules :odt-inline-image-rules :odt-pixels-per-inch :odt-table-styles :odt-use-date-fields :org-clock-marker-backup :org-clock-minutes-custom :org-clock-minutes-default :org-include-induced-level :orgtbl-ignore-sep :output-dir :panic :post-clean :programs :purecopy :python :quiet :radio-match :raw :repeat :repo :reported-p :running :server-alias :severity :show-process :sitemap-format-entry :smart-quote-cache :sort :stage :startgrouptag :store :stroke-color :stroke-width :table-row-number-cache :target-match :texinfo-active-timestamp-format :texinfo-classes :texinfo-diary-timestamp-format :texinfo-format-drawer-function :texinfo-format-headline-function :texinfo-format-inlinetask-function :texinfo-inactive-timestamp-format :texinfo-link-with-unknown-path-format :texinfo-node-description-column :texinfo-table-default-markup :texinfo-table-scientific-notation :texinfo-tables-verbatim :texinfo-text-markup-alist :time-prompt :tls-parameters :tree-type :trust :unblocked :update-function :use-external-socket :use-xcolor :utf8 :with-broken-links :with-properties :with-title :zero Buffer-menu-del-char Buffer-menu-marker-char Man-coding-system align-regexp-history ansi-color-control-seq-regexp arabic-shape-log arabic-shaper-ZWNJ-handling async-shell-command-display-buffer attempt-orderly-shutdown-on-fatal-signal attempt-stack-overflow-recovery auth-source-backend-parser-functions auth-source-pass-backend auto-save--timer auto-save-visited-interval auto-save-visited-mode auto-save-visited-mode-hook autoload--non-timestamp autoload-compute-prefixes autoload-def-prefixes-max-entries autoload-def-prefixes-max-length autoload-timestamps battery-linux-sysfs-regexp battery-upower-device bidi-paragraph-separate-re bidi-paragraph-start-re bookmark-file-coding-system browse-url-man-function byte-compile-cond-use-jump-table byte-compile-jump-tables byte-compile-log-warning-function byte-switch c--cl-library c-:-op-cont-regexp c-ambiguous-overloadable-or-identifier-prefix-re c-arithmetic-op-regexp c-asymmetry-fontification-flag c-block-comment-ender c-block-comment-ender-regexp c-block-comment-flag c-block-comment-is-default c-block-comment-starter c-brace-stack-no-semi-key c-brace-stack-thing-key c-bs-cache c-bs-cache-limit c-bs-interval c-bs-prev-pos c-bs-prev-stack c-cpp-expr-functions-key c-enum-clause-introduction-re c-has-quoted-numbers c-inside-<>-type-key c-macro-cache-no-comment c-make-top-level-key c-maybe-quoted-number c-maybe-quoted-number-head c-maybe-quoted-number-tail c-noise-macro-name-re c-noise-macro-names c-noise-macro-with-parens-name-re c-noise-macro-with-parens-names c-old-BEG c-old-END c-opt-type-modifier-prefix-key c-or-c++-mode--regexp c-pack-key c-paren-nontype-key c-post-protection-token c-pre-id-bracelist-key c-pre-lambda-tokens-re c-pre-start-tokens c-protection-key c-return-key c-sws-lit-limits c-sws-lit-type c-symbol-char-key c-template-typename-key c-type-decl-operator-prefix-key c-type-decl-suffix-ws-ids-key change-log-directory-files checkdoc-create-error-function cl--generic-all-builtin-types cl--gentemp-counter cl-old-struct-compat-mode cl-old-struct-compat-mode-hook cl-print--currently-printing cl-print--number-index cl-print--number-table cl-print-compiled cl-print-compiled-button cl-print-readably cl-struct-cl--random-state-tags cl-struct-file-notify--watch-tags cl-struct-flymake--backend-state-tags cl-struct-flymake--diag-tags cl-struct-lisp-indent-state-tags cl-struct-mhtml--submode-tags cl-struct-org-lint-checker-tags cl-struct-rst-Ado-tags cl-struct-rst-Hdr-tags cl-struct-rst-Stn-tags cl-struct-rst-Ttl-tags cl-struct-tramp-file-name-tags cl-struct-vc-git-dir-status-state-tags cl-struct-vc-hg--ignore-patterns-tags color-d50-xyz color-d55-xyz color-d75-xyz column-number-indicator-zero-based comint-move-point-for-matching-input comint-terminfo-terminal compilation-mode-line-errors compilation-num-errors-found compilation-num-infos-found compilation-num-warnings-found conf-desktop-font-lock-keywords conf-desktop-mode-abbrev-table conf-desktop-mode-hook conf-desktop-mode-map conf-desktop-mode-syntax-table conf-toml-font-lock-keywords conf-toml-mode-abbrev-table conf-toml-mode-hook conf-toml-mode-map conf-toml-mode-syntax-table confirm-kill-processes connection-local-criteria-alist connection-local-profile-alist connection-local-variables-alist coq-program-name cpp-message-min-time-interval css--angle-regexp css--at-ids css--bang-ids css--color-map css--colors-regexp css--html-tags css--mdn-completion-list css--mdn-lookup-history css--mdn-property-regexp css--mdn-symbol-regexp css--nested-selectors-allowed css--number-or-percent-regexp css--number-regexp css--percent-regexp css--property-value-cache css-class-list-function css-fontify-colors css-id-list-function css-lookup-url-format css-property-alist css-value-class-alist debugger-print-function debugger-stack-frame-as-list definition-prefixes delayed-after-hook-functions dframe-setup-hook diff-separator-re dig-program-options dired-always-read-filesystem dired-clean-confirm-killing-deleted-buffers dired-delete-help dired-omit-case-fold display-line-numbers display-line-numbers-current-absolute display-line-numbers-grow-only display-line-numbers-mode display-line-numbers-mode-hook display-line-numbers-mode-major-mode display-line-numbers-mode-set-explicitly display-line-numbers-type display-line-numbers-widen display-line-numbers-width display-line-numbers-width-start display-raw-bytes-as-hex dns-mode-control-entities edebug-read-objects edebug-sit-on-break ediff--show-ancestor-orig ediff-show-ancestor ediff-window-Ancestor eieio--object-num-slots eldoc-mode-major-mode eldoc-mode-set-explicitly electric-quote-chars electric-quote-context-sensitive electric-quote-inhibit-functions elisp-flymake--byte-compile-process emacs-build-number enable-connection-local-variables enriched-allow-eval-in-display-props epa-replace-original-text epg-config--configuration-constructor-alist erc-default-port-tls eval-expression-print-maximum-character executable-prefix-env extended-command-suggest-shorter ffap-max-region-length fill-separate-heterogeneous-words-with-space flymake--backend-state flymake--diagnostics-buffer-source flymake--mode-line-format flymake-diagnostic-functions flymake-diagnostic-types-alist flymake-diagnostics-buffer-mode-abbrev-table flymake-diagnostics-buffer-mode-hook flymake-diagnostics-buffer-mode-map flymake-diagnostics-buffer-mode-syntax-table flymake-menu flymake-mode-map flymake-note-bitmap flymake-proc--base-dir flymake-proc--current-process flymake-proc--find-buildfile-cache flymake-proc--master-file-name flymake-proc--project-include-dirs-cache flymake-proc--report-fn flymake-proc--temp-master-file-name flymake-proc--temp-source-file-name flymake-proc-allowed-file-name-masks flymake-proc-check-file-limit flymake-proc-compilation-prevents-syntax-check flymake-proc-diagnostic-type-pred flymake-proc-err-line-patterns flymake-proc-get-project-include-dirs-function flymake-proc-master-file-count-limit flymake-proc-master-file-dirs flymake-proc-xml-program flymake-start-on-flymake-mode flymake-wrap-around flyspell-sort-corrections-function follow-inside-post-command-hook-call gdb-python-guile-commands-regexp gensym-counter global-display-line-numbers-mode global-display-line-numbers-mode-buffers global-display-line-numbers-mode-hook global-eldoc-mode-buffers gnus-cloud-interactive gnus-cloud-storage-method gnus-group-cloud-map gnus-rcvstore-options gnus-refer-thread-limit-to-thread grep-mode-line-matches grep-num-matches-found grep-save-buffers grep-use-null-filename-separator help-definition-prefixes hl-line-overlay-buffer html--buffer-classes-cache html--buffer-ids-cache hz-category-table ibuffer-locked-buffer ibuffer-locked-char ibuffer-never-search-content-mode ibuffer-never-search-content-name ibuffer-old-saved-filters-warning iconify-child-frame image-dired-cmd-create-standard-thumbnail-options image-dired-cmd-optipng-options image-dired-cmd-optipng-program image-dired-cmd-pngcrush-options image-dired-cmd-pngnq-options image-dired-minor-mode image-dired-minor-mode-hook image-dired-minor-mode-map image-dired-queue image-dired-queue-active-jobs image-dired-queue-active-limit image-map image-scaling-factor interrupt-process-functions isearch-new-nonincremental ispell-enchant-dictionary-alist ispell-really-enchant js--syntax-propertize-regexp-regexp js-chain-indent js-indent-align-list-continuation kmacro-step-edit-active last--line-number-width less-css-compile-at-save less-css-default-error-regex less-css-font-lock-keywords less-css-input-file-name less-css-lessc-command less-css-lessc-options less-css-mode-abbrev-table less-css-mode-hook less-css-mode-map less-css-mode-syntax-table less-css-output-directory less-css-output-file-name lisp-prettify-symbols-alist list-matching-lines-current-line-face list-matching-lines-jump-to-current-line loadhist--restore-autoload lread--old-style-backquotes lread--unescaped-character-literals mailcap-user-mime-data maximum-scroll-margin menu-bar-showhide-line-numbers-menu mh-url-unreserved-chars mhtml--crucial-variable-prefix mhtml--crucial-variables mhtml--css-submode mhtml--js-submode mhtml--last-submode mhtml--stashed-crucial-variables mhtml--variable-prefix mhtml-mode-abbrev-table mhtml-mode-hook mhtml-mode-map mhtml-mode-syntax-table mhtml-tag-relative-indent mode-line-percent-position mounted-file-systems mouse-drag-and-drop-region mouse-drag-and-drop-region-cut-when-buffers-differ mouse-drag-and-drop-region-show-cursor mouse-drag-and-drop-region-show-tooltip mouse-select-region-move-to-beginning mouse-wheel-flip-direction mouse-wheel-left-event mouse-wheel-right-event mouse-wheel-tilt-scroll move-frame-functions mwheel-scroll-left-function mwheel-scroll-right-function ob-R-safe-header-args ob-R-transfer-variable-table-with-header ob-R-transfer-variable-table-without-header occur--final-pos occur--matches-threshold occur--orig-line occur--orig-line-str occur--region-end occur--region-start org--file-cache org--links-history org--matcher-tags-todo-only org-agenda-current-date org-agenda-effort-filter org-agenda-effort-filter-preset org-agenda-ignore-properties org-agenda-keep-restricted-file-list org-agenda-last-indirect-buffer org-agenda-prefer-last-repeat org-agenda-show-future-repeats org-archive-hook org-ascii-list-margin org-attach-annex-auto-get org-attach-archive-delete org-attach-commit org-babel-D-compiler org-babel-J-command org-babel-capitalize-example-region-markers org-babel-clojure-backend org-babel-clojure-sync-nrepl-timeout org-babel-coq-buffer org-babel-default-header-args:abc org-babel-default-header-args:ebnf org-babel-default-header-args:elisp org-babel-default-header-args:forth org-babel-default-header-args:groovy org-babel-default-header-args:hledger org-babel-default-header-args:lua org-babel-default-header-args:processing org-babel-default-header-args:sed org-babel-default-header-args:shell org-babel-default-header-args:stan org-babel-default-header-args:vala org-babel-exp-inline-code-template org-babel-exp-reference-buffer org-babel-groovy-command org-babel-groovy-wrapper-method org-babel-header-args:C org-babel-header-args:C++ org-babel-header-args:emacs-lisp org-babel-header-args:latex org-babel-header-args:sed org-babel-lilypond-ly-command org-babel-lilypond-midi-command org-babel-lilypond-pdf-command org-babel-lisp-eval-fn org-babel-lua-None-to org-babel-lua-buffers org-babel-lua-command org-babel-lua-eoe-indicator org-babel-lua-hline-to org-babel-lua-mode org-babel-lua-pp-wrapper-method org-babel-lua-wrapper-method org-babel-name-regexp org-babel-noweb-error-all-langs org-babel-processing-processing-js-filename org-babel-python--exec-tmpfile org-babel-remote-temporary-directory org-babel-safe-header-args org-babel-scheme-null-to org-babel-sed-command org-babel-shell-names org-babel-stan-cmdstan-directory org-babel-tangle-uncomment-comments org-babel-tangle-use-relative-file-links org-babel-uppercase-example-markers org-babel-vala-compiler org-bbdb-general-anniversary-description-after org-beamer-subtitle-format org-bibtex-headline-format-function org-bibtex-inherit-tags org-capture--clipboards org-capture--prompt-history org-capture--prompt-history-table org-capture-is-refiling org-clock-display-default-range org-clock-line-re org-clock-stored-history org-clock-stored-resume-clock org-columns--time org-columns-summary-types org-columns-summary-types-default org-current-tag-alist org-deadline-past-days org-duration--full-re org-duration--h:mm-re org-duration--h:mm:ss-re org-duration--mixed-re org-duration--unit-re org-duration-canonical-units org-duration-format org-duration-units org-element--cache org-element--cache-change-warning org-element--cache-sensitive-re org-element--cache-sync-keys org-element--cache-sync-requests org-element--cache-sync-timer org-element--footnote-separator org-element--latex-begin-environment org-element--latex-end-environment org-element--object-regexp org-element--pair-curly-table org-element--pair-round-table org-element--pair-square-table org-element--parsed-properties-alist org-element--timestamp-regexp org-element-cache-sync-break org-element-cache-sync-duration org-element-cache-sync-idle-time org-element-object-containers org-element-use-cache org-export-filter-body-functions org-export-global-macros org-export-ignored-local-variables org-export-registered-backends org-export-use-babel org-export-with-broken-links org-export-with-properties org-export-with-title org-font-lock-extra-keywords org-hide-macro-markers org-highlight-links org-html-checkbox-type org-html-checkbox-types org-html-klipse-css org-html-klipse-js org-html-klipse-selection-script org-html-klipsify-src org-html-table-row-close-tag org-html-table-row-open-tag org-html-viewport org-indent--deepest-level org-indent--heading-line-prefixes org-indent--initial-marker org-indent--inlinetask-line-prefixes org-indent--text-line-prefixes org-info-emacs-documents org-info-other-documents org-latex-bib-compiler org-latex-caption-above org-latex-compiler org-latex-compiler-file-string org-latex-compilers org-latex-footnote-defined-format org-latex-hyperref-template org-latex-images-centered org-latex-known-warnings org-latex-math-environments-re org-latex-polyglossia-language-alist org-latex-prefer-user-labels org-latex-subtitle-format org-latex-subtitle-separate org-link-parameters org-lint--checkers org-lint--local-checkers org-lint--report-mode-abbrev-table org-lint--report-mode-hook org-lint--report-mode-map org-lint--report-mode-syntax-table org-lint--source-buffer org-macro--counter-table org-md-footnote-format org-md-footnotes-section org-mouse-main-buffer org-occur-case-fold-search org-outline-path-cache org-planning-line-re org-preview-latex-default-process org-preview-latex-image-directory org-preview-latex-process-alist org-publish-after-publishing-hook org-show-context-detail org-src--allow-write-back org-src--auto-save-timer org-src--babel-info org-src--beg-marker org-src--block-indentation org-src--end-marker org-src--from-org-mode org-src--overlay org-src--preserve-indentation org-src--remote org-src--saved-temp-window-config org-src--source-type org-src--tab-width org-src-block-faces org-table--fedit-source org-table-convert-region-max-lines org-table-duration-hour-zero-padding org-table-formula-create-columns org-texinfo-inline-image-rules org-texinfo-table-default-markup org-timer-countdown-timer org-timer-countdown-timer-title org-ts-regexp-inactive org-unique-local-variables overriding-plist-environment package-gnupghome-dir pages-directory-mode-abbrev-table pages-directory-mode-hook pages-directory-mode-syntax-table perl--flymake-proc perl-flymake-command pixel-dead-time pixel-last-scroll-time pixel-resolution-fine-flag pixel-scroll-mode pixel-scroll-mode-hook pixel-wait print-escape-control-characters prog-indentation-context puny-base puny-damp puny-initial-bias puny-initial-n puny-skew puny-tmax puny-tmin python--flymake-proc python-flymake-command python-flymake-command-output-pattern python-flymake-msg-alist python-indent-def-block-scale python-prettify-symbols-alist python-shell--block-prompt radix-tree-empty rcirc-omit-mode-hook rst-all-ttls-cache rst-hdr-hierarchy-cache rst-toc-link-keymap rst-toc-mode-return-wincfg ruby--flymake-proc ruby-flymake-use-rubocop-if-available ruby-rubocop-config save-some-buffers-default-predicate scss-at-ids ses--completion-table ses--list-orig-buffer ses-completion-keys sgml-syntax-propertize-rules shell-command-dont-erase-buffer shell-command-saved-pos shr-image-map shr-use-colors sieve-manage-ignore-starttls skkdic--japanese-category-set smerge-lower-face smerge-lower-re smerge-upper-face syntax-ppss-narrow syntax-ppss-narrow-start syntax-ppss-table syntax-ppss-wide tabulated-list--current-lnum-width term-char-mode-buffer-read-only term-char-mode-point-at-process-mark term-goto-process-mark term-line-mode-buffer-read-only term-partial-ansi-terminal-message term-terminal-undecoded-bytes tex-chktex--process tex-chktex-extra-flags tex-chktex-program timer-list-mode-abbrev-table timer-list-mode-hook timer-list-mode-map timer-list-mode-syntax-table todo--item-headers-hidden tooltip-reuse-hidden-frame tramp-autoload-file-name-regexp tramp-cache-read-persistent-data tramp-completion-file-name-regexp-alist tramp-completion-file-name-regexp-default tramp-completion-file-name-regexp-simplified tramp-completion-function-alist-sg tramp-current-domain tramp-current-port tramp-default-method-marker tramp-device-escape-sequence-regexp tramp-display-escape-sequence-regexp tramp-file-missing tramp-gvfs-file-name-handler-alist tramp-initial-file-name-regexp tramp-method-regexp-alist tramp-postfix-host-format-alist tramp-postfix-ipv6-format-alist tramp-postfix-method-format-alist tramp-prefix-format-alist tramp-prefix-ipv6-format-alist tramp-unknown-id-integer tramp-unknown-id-string url-asynchronous url-queue-progress-timer vc-git--program-version vc-git-print-log-follow vc-hg--cached-ignore-patterns vc-hg--dirstate-scan-cache vc-hg--elisp-metacharacters vc-hg--pcre-c-escapes vc-hg--pcre-metacharacters vc-hg-parse-hg-data-structures vc-hg-supported-requirements vc-hg-symbolic-revision-styles vc-hg-use-file-version-for-mode-line-version vc-revision-history verilog-auto-inst-param-value-type verilog-auto-wire-comment verilog-default-clocking-re verilog-diff-ignore-regexp verilog-font-lock-grouping-keywords-face viper--advice-list viper--undo-change-group-handle wdired-create-parent-directories while-no-input-ignore-events window--sides-inhibit-check window--sides-shown window-sides-reversed woman-justify-styles woman-mode-abbrev-table woman-mode-hook woman-mode-syntax-table xdg-desktop-entry-regexp xdg-desktop-group-regexp xdg-line-regexp xdg-user-dirs xref--original-window xref--original-window-intent)) - (features - (removed awk-mode gnus-ems gnus-sync iso-acc iso-insert iso-swed messcompat mh-acros nxml-glyph nxml-uchnm ob-scala ob-sh pinentry resume scribe spell swedish sym-comp tramp-gw) - (added auth-source-pass charprop cl-print composite dired-loaddefs display-line-numbers eieio-loaddefs flymake-proc gnus-rfc1843 htmlfontify-loaddefs ibuffer-loaddefs isearch less-css-mode mhtml-mode ob-J ob-abc ob-coq ob-ebnf ob-forth ob-groovy ob-hledger ob-lua ob-processing ob-sed ob-shell ob-stan ob-vala org-duration org-eww org-lint pixel-scroll ps-print-loaddefs puny radix-tree reftex-loaddefs replace rmail-loaddefs rmc svg term/tty-colors text-mode timer-list xdg))) - ((26 2) - (functions - (removed dired--yes-no-all-quit-help shadow-get-user shadow-make-cluster shadow-parse-fullname) - (added assoc-delete-all calc-graph-w32-p copy-shadow-cluster ibuffer-do-toggle-lock make-shadow-cluster make-shadow-cluster--cmacro package--user-installed-p read-answer shadow-cluster-name--cmacro shadow-cluster-p shadow-cluster-p--cmacro shadow-cluster-primary--cmacro shadow-cluster-regexp--cmacro shadow-name-site shadow-site-name soap-type-of term--bash-needs-EMACSp term-watch-for-password-prompt thread-live-p)) - (variables - (removed dired-delete-help last--line-number-width prolog-hungry-delete-key-flag) - (added byte-compile--default-val cl-print--depth cl-struct-shadow-cluster-tags ido-fallback read-answer-map--memoize read-answer-short term--bash-needs-EMACS-status xft-ignore-color-fonts)) - (features - (removed) - (added threads))) - ((26 3) - (functions - (removed gnus-summary-sort-by-mark) - (added dir-locals--get-sort-score dir-locals--sort-variables gnus-summary-sort-by-marks package--buffer-string package--cs)) - (variables - (removed) - (added help-enable-completion-auto-load)) - (features - (removed) - (added)))) diff --git a/elpa/package-lint-20200419.406/package-lint-autoloads.el b/elpa/package-lint-20200419.406/package-lint-autoloads.el deleted file mode 100644 index 7ee4cfce..00000000 --- a/elpa/package-lint-20200419.406/package-lint-autoloads.el +++ /dev/null @@ -1,59 +0,0 @@ -;;; package-lint-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "package-lint" "package-lint.el" (0 0 0 0)) -;;; Generated autoloads from package-lint.el - -(autoload 'package-lint-buffer "package-lint" "\ -Get linter errors and warnings for BUFFER. - -Returns a list, each element of which is list of - - (LINE COL TYPE MESSAGE) - -where TYPE is either 'warning or 'error. - -Current buffer is used if none is specified. - -\(fn &optional BUFFER)" nil nil) - -(autoload 'package-lint-current-buffer "package-lint" "\ -Display lint errors and warnings for the current buffer. - -\(fn)" t nil) - -(autoload 'package-lint-batch-and-exit "package-lint" "\ -Run `package-lint-buffer' on the files remaining on the command line. -Use this only with -batch, it won't work interactively. - -When done, exit Emacs with status 1 in case of any errors, otherwise exit -with status 0. The variable `package-lint-batch-fail-on-warnings' controls -whether or not warnings alone produce a non-zero exit code. - -\(fn)" nil nil) - -(autoload 'package-lint-looks-like-a-package-p "package-lint" "\ -Return non-nil if the current buffer appears to be intended as a package. - -\(fn)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "package-lint" '("package-lint-"))) - -;;;*** - -;;;### (autoloads nil nil ("package-lint-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; package-lint-autoloads.el ends here diff --git a/elpa/package-lint-20200419.406/package-lint-pkg.el b/elpa/package-lint-20200419.406/package-lint-pkg.el deleted file mode 100644 index cfac493f..00000000 --- a/elpa/package-lint-20200419.406/package-lint-pkg.el +++ /dev/null @@ -1,15 +0,0 @@ -(define-package "package-lint" "20200419.406" "A linting library for elisp package authors" - '((cl-lib "0.5") - (emacs "24.1") - (let-alist "1.0.6")) - :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") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/package-lint-20200419.406/package-lint.el b/elpa/package-lint-20200419.406/package-lint.el deleted file mode 100644 index 3cad3a64..00000000 --- a/elpa/package-lint-20200419.406/package-lint.el +++ /dev/null @@ -1,1209 +0,0 @@ -;;; package-lint.el --- A linting library for elisp package authors -*- lexical-binding: t -*- - -;; Copyright (C) 2014-2019 Steve Purcell, Fanael Linithien - -;; Author: Steve Purcell -;; Fanael Linithien -;; URL: https://github.com/purcell/package-lint -;; Keywords: lisp -;; Version: 0 -;; Package-Requires: ((cl-lib "0.5") (emacs "24.1") (let-alist "1.0.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 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 . - -;;; Commentary: - -;; Provides a list of issues with the package metadata of a file, -;; e.g. the package dependencies it requires. - -;; See function `package-lint-buffer'. - -;; Checks will currently be enabled only if a "Package-Requires:" or -;; "Package-Version:" header is present in the file. - -;;; Code: - -(eval-when-compile (require 'pcase)) ; `pcase-dolist' is not autoloaded -(require 'cl-lib) -(require 'package) -(require 'lisp-mnt) -(require 'finder) -(require 'imenu) -(require 'let-alist) -(require 'rx) - - -(defvar package-lint-main-file nil - "For multi-file packages, set this to the main .el or -pkg.el file. - -When set, the package prefix and dependencies are obtained from -that file instead of the buffer being linted. This allows -package-lint to operate on secondary files in a package. - -The path can be absolute or relative to that of the linted file.") -(put 'package-lint-main-file 'safe-local-variable #'stringp) - - -;;; Compatibility - -(defalias 'package-lint--package-desc-summary - (if (fboundp 'package-desc-summary) - 'package-desc-summary - 'package-desc-doc)) - -(defalias 'package-lint--package-desc-name - (if (fboundp 'package-desc-name) - 'package-desc-name - (lambda (desc) (intern (elt desc 0))))) - - -;;; Machinery - -(defvar package-lint--errors nil - "List of errors and warnings for the current buffer. -This is bound dynamically while the checks run.") - -(defconst package-lint-backport-libraries - (list (cons 'cl-lib "\\`cl-") - (cons 'cl-generic "\\`cl-\\(?:def\\)?generic") - (cons 'cl-print "\\`cl-print") - (cons 'map "\\`map-") - (cons 'nadvice "\\`advice-") - (cons 'seq "\\`seq-") - (cons 'let-alist "\\`let-alist")) - "A sequence of (FEATURE . SYMBOL-NAME-MATCH) for backport libraries. -These are libraries that are built into newer Emacsen and also -published in ELPA for use by older Emacsen.") - -(eval-and-compile - (defun package-lint--match-symbols (symbols) - "Return a predicate which take a symbol and reports whether it is among `SYMBOLS'." - (let ((tbl (make-hash-table))) - (dolist (s symbols) - (puthash s t tbl)) - (lambda (v) (gethash v tbl)))) - - (let ((stdlib-changes (with-temp-buffer - (insert-file-contents - (expand-file-name "data/stdlib-changes" - (if load-file-name - (file-name-directory load-file-name) - default-directory))) - (read (current-buffer))))) - - (defconst package-lint--libraries-added-alist - (mapcar (lambda (version-data) - (let ((version (car version-data)) - (added-libraries (let-alist (cdr version-data) .features.added))) - (cons version (package-lint--match-symbols added-libraries)))) - stdlib-changes) - "An alist of library names and when they were added to Emacs.") - - (defconst package-lint--libraries-removed-alist - (mapcar (lambda (version-data) - (let ((version (car version-data)) - (removed-libraries (let-alist (cdr version-data) .features.removed))) - (cons version (package-lint--match-symbols removed-libraries)))) - stdlib-changes) - "An alist of library names and when they were added to Emacs.") - - (defconst package-lint--functions-and-macros-added-alist - (mapcar (lambda (version-data) - (let ((version (car version-data)) - (added-functions (let-alist (cdr version-data) .functions.added))) - (cons version (package-lint--match-symbols added-functions)))) - stdlib-changes) - "An alist of function/macro names and when they were added to Emacs.") - - (defconst package-lint--functions-and-macros-removed-alist - (mapcar (lambda (version-data) - (let ((version (car version-data)) - (removed-functions (let-alist (cdr version-data) .functions.removed))) - (cons version (package-lint--match-symbols removed-functions)))) - stdlib-changes) - "An alist of function/macro names and when they were removed from Emacs.") - - (defun package-lint--added-or-removed-function-p (sym) - "Predicate that returns t if SYM is a function added/removed in any known emacs version." - (cl-some (lambda (x) (funcall (cdr x) sym)) - (append package-lint--functions-and-macros-added-alist - package-lint--functions-and-macros-removed-alist))))) - -(defconst package-lint--sane-prefixes - (rx - string-start - (or - "org-dblock-write:" - "org-babel-execute:" - "org-babel-prep-session:" - "org-babel-variable-assignments:" - "org-babel-default-header-args:" - "pcomplete/")) - "A regexp matching whitelisted non-standard symbol prefixes.") - -(defun package-lint--main-file-p () - "Return non-nil if the current buffer corresponds to the package's main file." - (or (null package-lint-main-file) - (null (buffer-file-name)) - (string= (file-truename (expand-file-name package-lint-main-file)) - (file-truename (buffer-file-name))))) - -(defun package-lint--check-all () - "Return a list of errors/warnings for the current buffer." - (let ((package-lint--errors '()) - (case-fold-search nil)) - (save-match-data - (save-excursion - (save-restriction - (widen) - (let (prefix deps) - (if (package-lint--main-file-p) - (progn - ;; TODO: handle when the main file is a -pkg.el file - (setq prefix (package-lint--get-package-prefix)) - (let ((desc (package-lint--check-package-el-can-parse))) - (when desc - (package-lint--check-package-summary desc) - (package-lint--check-provide-form desc) - (package-lint--check-no-emacs-in-package-name desc))) - (setq deps (package-lint--check-dependency-list)) - - (package-lint--check-url-header) - (package-lint--check-package-version-present) - (package-lint--check-commentary-existence)) - ;; Need to look at the main file to find prefix and dependencies - (setq prefix (replace-regexp-in-string - "\\(-mode\\)?\\(-pkg\\)?\\'" "" - (file-name-sans-extension - (file-name-nondirectory package-lint-main-file)))) - (let ((main-file package-lint-main-file)) - (if (string-match-p "-pkg\\.el\\'" main-file) - (let ((expr (with-temp-buffer - (insert-file-contents (expand-file-name main-file)) - (read (current-buffer))))) - (if (eq (car-safe expr) 'define-package) - (setq deps (package-desc-reqs (apply #'package-desc-from-define (cdr expr)))) - (package-lint--error-at-bob 'error (format "Malformed package descriptor file \"%s\"" main-file)))) - (when (package-lint--goto-header "Package-Requires") - (package-lint--error-at-bol 'error "Package-Requires outside the main file have no effect.")) - (package-lint--check-provide-form-secondary-file) - (condition-case err - (with-temp-buffer - (insert-file-contents (expand-file-name main-file)) - (setq deps (package-desc-reqs (package-lint--liberal-package-buffer-info)))) - (error - (package-lint--error-at-bob - 'error - (format "Error parsing main package file \"%s\": %s" main-file err))))))) - - ;; Source code checks - (package-lint--check-keywords-list) - (package-lint--check-lexical-binding-is-on-first-line) - (package-lint--check-reserved-keybindings) - (when prefix - (package-lint--check-objects-by-regexp - (concat "(" (regexp-opt '("defalias" "defvaralias")) "\\s-") - (apply-partially #'package-lint--check-defalias prefix))) - (package-lint--check-objects-by-regexp - "(define-minor-mode\\s-" - #'package-lint--check-minor-mode) - (package-lint--check-objects-by-regexp - "(define-global\\(?:ized\\)?-minor-mode\\s-" - #'package-lint--check-globalized-minor-mode) - (package-lint--check-objects-by-regexp - "(defgroup\\s-" #'package-lint--check-defgroup) - - (package-lint--check-no-use-of-cl) - (package-lint--check-no-use-of-cl-lib-sublibraries) - (package-lint--check-eval-after-load) - (package-lint--check-lexical-binding-requires-emacs-24 deps) - (package-lint--check-libraries-available-in-emacs deps) - (package-lint--check-libraries-removed-from-emacs) - (package-lint--check-macros-functions-available-in-emacs deps) - (package-lint--check-macros-functions-removed-from-emacs deps) - (package-lint--check-objects-by-regexp - (concat "(" (regexp-opt '("format" "message" "error")) "\\s-") - (apply-partially #'package-lint--check-format-string deps)) - (package-lint--check-for-literal-emacs-path) - (let ((definitions (package-lint--get-defs))) - (package-lint--check-autoloads-on-private-functions definitions) - (when prefix - (package-lint--check-defs-prefix prefix definitions)) - (package-lint--check-symbol-separators definitions))) - (package-lint--check-lonely-parens)))) - (sort package-lint--errors - (lambda (a b) - (pcase-let ((`(,a-line ,a-column ,_ ,a-message) a) - (`(,b-line ,b-column ,_ ,b-message) b)) - (cond - ((/= a-line b-line) (< a-line b-line)) - ((/= a-column b-column) (< a-column b-column)) - (t - (string-lessp a-message b-message)))))))) - -(defun package-lint--error (line col type message) - "Construct a datum for error at LINE and COL with TYPE and MESSAGE." - (push (list line col type message) package-lint--errors)) - -(defun package-lint--error-at-point (type message &optional pos) - "Construct a datum for error at POS with TYPE and MESSAGE. -POS defaults to `point'." - (save-excursion - (when pos - (goto-char pos)) - (package-lint--error (line-number-at-pos) (- (point) (line-beginning-position)) type message))) - -(defun package-lint--error-at-bol (type message) - "Construct a datum for error at the beginning of the current line with TYPE and MESSAGE." - (package-lint--error (line-number-at-pos) 0 type message)) - -(defun package-lint--error-at-bob (type message) - "Construct a datum for error at the beginning of the buffer with TYPE and MESSAGE." - (package-lint--error 1 0 type message)) - - -;;; Checks - -(defun package-lint--check-reserved-keybindings () - "Warn about reserved keybindings." - (let ((re (rx "(" (*? space) (or "kbd" "global-set-key" "local-set-key" "define-key") symbol-end))) - (goto-char (point-min)) - (while (re-search-forward re nil t) - (unless (nth 8 (save-match-data (syntax-ppss))) - ;; Read form and get key-sequence - (goto-char (match-beginning 0)) - (let ((seq (package-lint--extract-key-sequence - (read (current-buffer))))) - (when seq - (let ((message (package-lint--test-keyseq seq))) - (when message - (package-lint--error-at-point 'error message))))))))) - -(defun package-lint--check-commentary-existence () - "Warn about nonexistent or empty commentary section." - (let ((start (lm-commentary-start))) - (if (null start) - (package-lint--error-at-bob - 'error - "Package should have a ;;; Commentary section.") - ;; Skip over the section header. - (goto-char start) - (forward-line) - (when (package-lint--region-empty-p (point) (lm-commentary-end)) - (package-lint--error-at-point - 'error - "Package should have a non-empty ;;; Commentary section." - start))))) - -(defun package-lint--check-autoloads-on-private-functions (definitions) - "Verify that private functions DEFINITIONS don't have autoload cookies." - (pcase-dolist (`(,symbol . ,position) definitions) - (when (string-match-p (rx "--") symbol) - (goto-char position) - (forward-line -1) - (when (looking-at-p (rx ";;;###autoload")) - (package-lint--error-at-point - 'warning - "Private functions generally should not be autoloaded."))))) - -(defun package-lint--check-for-literal-emacs-path () - "Verify package does not refer to \"\.emacs\.d\" literally. -Instead it should use `user-emacs-directory' or `locate-user-emacs-file'." - (goto-char (point-min)) - ;; \b won't find a word boundary between a symbol and the "." in - ;; ".emacs.d". / is a valid symbol constituent in Emacs Lisp, so - ;; must be explicitly blacklisted. - (while (re-search-forward "\\(?:\\_<\\|/\\)\\.emacs\\.d\\b" nil t) - (unless (nth 4 (syntax-ppss)) - ;; Not in a comment - (package-lint--error-at-point - 'warning - "Use variable `user-emacs-directory' or function `locate-user-emacs-file' instead of a literal path to the Emacs user directory or files.")))) - -(defun package-lint--check-keywords-list () - "Verify that package keywords are listed in `finder-known-keywords'." - (when (package-lint--goto-header "Keywords") - (let ((err-pos (match-beginning 2))) - (let ((keywords (lm-keywords-list))) - (unless (cl-some (lambda (keyword) (assoc (intern keyword) finder-known-keywords)) keywords) - (package-lint--error-at-point - 'warning - (format "You should include standard keywords: see the variable `finder-known-keywords'.") - err-pos)))))) - -(defun package-lint--check-url-header () - "Verify that the package has an HTTPS or HTTP Homepage/URL header." - (if (package-lint--goto-header "\\(?:URL\\|Homepage\\)") - (let ((url (match-string 3)) - (url-start (match-beginning 3))) - (unless (and (equal (thing-at-point 'url) url) - (string-match-p "^https?://" url)) - (package-lint--error-at-point - 'error - "Package URLs should be a single HTTPS or HTTP URL." - url-start))) - (package-lint--error-at-bob - 'error - "Package should have a Homepage or URL header."))) - -(defun package-lint--check-dependency-list () - "Check the contents of the \"Package-Requires\" header. -Return a list of well-formed dependencies, same as -`package-lint--check-well-formed-dependencies'." - (when (package-lint--goto-header "Package-Requires") - (let ((position (match-beginning 3)) - (deps (match-string 3))) - (condition-case err - (pcase-let ((`(,parsed-deps . ,parse-end-pos) (read-from-string deps))) - (unless (= parse-end-pos (length deps)) - (package-lint--error-at-bol - 'error - "More than one expression provided.")) - (let ((deps (package-lint--check-well-formed-dependencies position parsed-deps))) - (package-lint--check-packages-installable deps) - (package-lint--check-deps-use-non-snapshot-version deps) - (package-lint--check-deps-do-not-use-zero-versions deps) - (package-lint--check-do-not-depend-on-cl-lib-1.0 deps) - deps)) - (error - (package-lint--error-at-bol - 'error - (format "Couldn't parse \"Package-Requires\" header: %s" (error-message-string err))) - nil))))) - -(defun package-lint--check-well-formed-dependencies (position parsed-deps) - "Check that dependencies listed at POSITION are well-formed. -These PARSED-DEPS must have the format (name \"version\"). -Return a list of well-formed dependencies, where each element is of -the form (PACKAGE-NAME PACKAGE-VERSION DEP-POSITION)." - (let (valid-deps) - (dolist (entry parsed-deps) - (pcase entry - ((and `(,package-name ,package-version) - (guard (symbolp package-name)) - (guard (stringp package-version))) - ;; Find the column at which the dependency is declared so we can - ;; properly report the position of errors. - (let ((dep-pos - (save-excursion - (goto-char position) - (let ((pattern - (format "( *\\(%s\\)\\(?:)\\|[^[:alnum:]_\\-].*?)\\)" - (regexp-quote (symbol-name package-name))))) - (if (re-search-forward pattern (line-end-position) t) - (match-beginning 1) - position))))) - (if (ignore-errors (version-to-list package-version)) - (push (list package-name - (version-to-list package-version) - dep-pos) - valid-deps) - (package-lint--error-at-point - 'error - (format "%S is not a valid version string: see `version-to-list'." - package-version) - dep-pos)))) - (_ - (package-lint--error-at-bol - 'error - (format "Expected (package-name \"version-num\"), but found %S." entry))))) - valid-deps)) - -(defun package-lint--check-package-installable (archive-entry package-version dep-pos) - "Check that ARCHIVE-ENTRY is installable from a configured package archive. - -Check that package described by ARCHIVE-ENTRY can be installed at -required version PACKAGE-VERSION. If not, raise an error for DEP-POS." - (let* ((package-name (car archive-entry)) - (best-version (package-lint--highest-installable-version-of package-name))) - (when (version-list-< best-version package-version) - (package-lint--error-at-point - 'warning - (format "Version dependency for %s appears too high: try %s" package-name - (package-version-join best-version)) - dep-pos)))) - -(defun package-lint--check-packages-installable (valid-deps) - "Check that all VALID-DEPS are available for installation." - (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps) - (if (eq 'emacs package-name) - (unless (version-list-<= '(24) package-version) - (package-lint--error-at-point - 'error - "You can only depend on Emacs version 24 or greater: package.el for Emacs 23 does not support the \"emacs\" pseudopackage." - dep-pos)) - ;; Not 'emacs - (let ((archive-entry (assq package-name package-archive-contents))) - (if archive-entry - (package-lint--check-package-installable archive-entry package-version dep-pos) - (package-lint--error-at-point - 'error - (format "Package %S is not installable." package-name) - dep-pos)))))) - -(defun package-lint--check-deps-use-non-snapshot-version (valid-deps) - "Warn about any VALID-DEPS on snapshot versions of packages." - (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps) - (unless (version-list-< package-version '(19001201 1)) - (package-lint--error-at-point - 'warning - (format "Use a non-snapshot version number for dependency on \"%S\" if possible." - package-name) - dep-pos)))) - -(defun package-lint--check-deps-do-not-use-zero-versions (valid-deps) - "Warn about VALID-DEPS on \"0\" versions of packages." - (pcase-dolist (`(,package-name ,package-version ,dep-pos) valid-deps) - (when (equal package-version '(0)) - (package-lint--error-at-point - 'warning - (format "Use a properly versioned dependency on \"%S\" if possible." - package-name) - dep-pos)))) - -(defun package-lint--check-lexical-binding-requires-emacs-24 (valid-deps) - "Warn about use of `lexical-binding' when Emacs 24 is not among VALID-DEPS." - (goto-char (point-min)) - (when (package-lint--lexical-binding-declared-in-header-line-p) - (unless (assq 'emacs valid-deps) - (package-lint--error-at-point - 'warning - "You should depend on (emacs \"24\") if you need lexical-binding." - (match-beginning 1))))) - -(defun package-lint--inside-comment-or-string-p () - "Return non-nil if point is inside a comment or string." - (let ((ppss (save-match-data (syntax-ppss)))) - (or (nth 3 ppss) (nth 4 ppss)))) - -(defun package-lint--seen-fboundp-check-for (sym) - "Return non-nil if a `fboundp' check for SYM is present before point." - (save-excursion - (save-match-data - (and (re-search-backward - (concat "(fboundp\\s-+'" (regexp-quote sym) "\\_>") (point-min) t) - (not (package-lint--inside-comment-or-string-p)))))) - -(defun package-lint--map-regexp-match (regexp callback) - "For every match of REGEXP, call CALLBACK with the first match group. -If callback returns non-nil, the return value - which must be a -list - will be applied to `package-lint--error-at-point'. If -REGEXP doesn't produce a match group 1, then match group -0 (ie. the whole match string string) will be passed to -CALLBACK." - (save-excursion - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (let ((sym (or (match-string-no-properties 1) - (match-string-no-properties 0)))) - (save-excursion - (goto-char (or (match-beginning 1) - (match-beginning 0))) - (let ((err (funcall callback sym))) - (when err - ;; Check this as late as possible, just before reporting, - ;; because otherwise the checking process is extremely slow, - ;; being bottlenecked by `syntax-ppss'. - (unless (package-lint--inside-comment-or-string-p) - (apply #'package-lint--error-at-point err))))))))) - -(defun package-lint--check-version-regexp-list (valid-deps list symbol-regexp type) - "Warn if symbols matched by SYMBOL-REGEXP are unavailable in the target Emacs. -The target Emacs version is taken from VALID-DEPS, which are the -declared dependencies of this package. LIST is an alist -of (VERSION . PRED), where PRED is passed the sym. TYPE is the -type of the symbol, either FUNCTION or FEATURE." - (let ((emacs-version-dep (or (cadr (assq 'emacs valid-deps)) '(0)))) - (pcase-dolist (`(,added-in-version . ,pred) list) - (when (version-list-< emacs-version-dep added-in-version) - (package-lint--map-regexp-match - symbol-regexp - (lambda (sym) - (when (funcall pred (intern sym)) - (unless (and (eq type 'function) (package-lint--seen-fboundp-check-for sym)) - (let ((available-backport - (cond - ((eq type 'feature) - (cl-some (lambda (bp) - (when (string= (car bp) sym) - (car bp))) - package-lint-backport-libraries)) - ((eq type 'function) - (cl-some (lambda (bp) - (when (string-match-p (cdr bp) sym) - (car bp))) - package-lint-backport-libraries))))) - (unless (and available-backport (assoc available-backport valid-deps)) - (list - 'error - (format "You should depend on (emacs \"%s\")%s if you need `%s'." - (mapconcat #'number-to-string added-in-version ".") - (if available-backport - (format " or the %s package" available-backport) - "") - sym)))))))))))) - -(defun package-lint--check-eval-after-load () - "Warn about use of `eval-after-load' and co." - (package-lint--map-regexp-match - "(\\s-*?\\(\\(?:with-\\)?eval-after-load\\)\\_>" - (lambda (match) - (list 'warning - (format "`%s' is for use in configurations, and should rarely be used in packages." match))))) - -(defun package-lint--check-no-use-of-cl () - "Warn about use of deprecated `cl' library." - (package-lint--map-regexp-match - "(\\s-*?require\\s-*?'\\(cl\\)\\_>" - (lambda (_) - (list - 'warning - "Replace deprecated `cl' with `cl-lib'. The `cl-libify' package can help with this.")))) - -(defun package-lint--check-no-use-of-cl-lib-sublibraries () - "Warn about use of `cl-macs', `cl-seq' etc." - (package-lint--map-regexp-match - "(\\s-*?require\\s-*?'\\(cl-macs\\|cl-seq\\)\\_>" - (lambda (_) - (list - 'warning - "This file is not in the `cl-lib' ELPA compatibility package: require `cl-lib' instead.")))) - -(defconst package-lint--unconditional-require-regexp - ;; Match the ending paren so we can be sure it's a single argument - ;; `require'. If there are additional arguments, we don't want to warn, - ;; because (require 'foo nil t) indicates an optional dependency and - ;; (require 'foo "filename") is very uncommon. - "(\\s-*?require\\s-*?'\\_<\\(.*?\\)\\_>\\s-*?)" - "Regexp to match unconditional `require' forms.") - -(defun package-lint--check-libraries-available-in-emacs (valid-deps) - "Warn about use of libraries that are not available in the Emacs version in VALID-DEPS." - (package-lint--check-version-regexp-list - valid-deps - package-lint--libraries-added-alist - package-lint--unconditional-require-regexp - 'feature)) - -(defun package-lint--check-libraries-removed-from-emacs () - "Warn about use of libraries that have been removed from Emacs." - (package-lint--map-regexp-match - package-lint--unconditional-require-regexp - (lambda (sym) - (cl-block return - (pcase-dolist (`(,removed-in-version . ,pred) package-lint--libraries-removed-alist) - (when (funcall pred (intern sym)) - (cl-return-from return - (list - 'error - (format "The `%s' library was removed in Emacs version %s." - sym (mapconcat #'number-to-string removed-in-version ".")))))))))) - -(defconst package-lint--function-name-regexp - (rx - (seq - (or "#'" - (seq "(" (* (syntax whitespace)) - (? (seq - (or "funcall" "apply" "advice-add") - (+ - (syntax whitespace)) - "'")))) - (group - (*\? nonl)) - symbol-end)) - "Regexp to match function names.") - -(defun package-lint--check-macros-functions-available-in-emacs (valid-deps) - "Warn about use of functions/macros that are not available in the Emacs version in VALID-DEPS." - (package-lint--check-version-regexp-list - valid-deps - package-lint--functions-and-macros-added-alist - package-lint--function-name-regexp - 'function)) - -(defun package-lint--check-macros-functions-removed-from-emacs (valid-deps) - "Warn about use of functions/macros that have been removed from Emacs. -If an Emacs version is specified in VALID-DEPS, don't warn about -functions/macros that were removed and later re-added, as long as -the Emacs dependency matches the re-addition." - (package-lint--map-regexp-match - package-lint--function-name-regexp - (lambda (sym) - (cl-block return - (pcase-dolist (`(,removed-in-version . ,pred) package-lint--functions-and-macros-removed-alist) - (when (funcall pred (intern sym)) - (let ((emacs-version-dep (or (cadr (assq 'emacs valid-deps)) '(0)))) - (unless (cl-some (lambda (dep) - (pcase-let ((`(,ver . ,pred) dep)) - (and (version-list-<= ver emacs-version-dep) - (funcall pred (intern sym))))) - package-lint--functions-and-macros-added-alist) - (cl-return-from return - (list - 'error - (format "`%s' was removed in Emacs version %s." - sym (mapconcat #'number-to-string removed-in-version ".")))))))))))) - -(defun package-lint--check-lexical-binding-is-on-first-line () - "Check that any `lexical-binding' declaration is on the first line of the file." - (cl-block return - (let ((original-buffer (current-buffer))) - (with-temp-buffer - (let ((lexical-binding-found-at-end nil)) - (insert-buffer-substring-no-properties original-buffer) - (condition-case err - (cl-letf (((symbol-function #'hack-local-variables-apply) #'ignore) - ((symbol-function #'hack-local-variables-filter) - (lambda (variables _dir-name) - (setq file-local-variables-alist variables))) - ;; Silence any messages Emacs may want to share with the user. - ;; There's no user. - ((symbol-function #'display-warning) #'ignore) - ((symbol-function #'message) #'ignore)) - ;; HACK: this is an internal variable! - ;; Unfortunately, Emacsen that have this variable also have - ;; `hack-local-variables' that doesn't store `lexical-binding' - ;; in `file-local-variables-alist'. - (defvar enable-dir-local-variables) - (defvar hack-local-variables--warned-lexical) - (let ((hack-local-variables--warned-lexical nil) - (enable-dir-local-variables nil) - (enable-local-variables t) - (local-enable-local-variables t)) - (hack-local-variables) - (setq lexical-binding-found-at-end - hack-local-variables--warned-lexical))) - (error - (package-lint--error-at-bob 'error (error-message-string err)) - (cl-return-from return nil))) - (when (or lexical-binding-found-at-end - ;; In case this is an Emacs from before `hack-local-variables' - ;; started to warn about `lexical-binding' on a line other - ;; than the first. - (and (cdr (assq 'lexical-binding file-local-variables-alist)) - (not (package-lint--lexical-binding-declared-in-header-line-p)))) - (package-lint--error-at-bob - 'error - "`lexical-binding' must be set in the first line."))))))) - -(defun package-lint--check-do-not-depend-on-cl-lib-1.0 (valid-deps) - "Check that any dependency in VALID-DEPS on \"cl-lib\" is on a remotely-installable version." - (let ((cl-lib-dep (assq 'cl-lib valid-deps))) - (when cl-lib-dep - (let ((cl-lib-version (nth 1 cl-lib-dep))) - (when (version-list-<= '(1) cl-lib-version) - (package-lint--error-at-point - 'error - (format "Depend on the latest 0.x version of cl-lib rather than on version \"%S\". -Alternatively, depend on (emacs \"24.3\") or greater, in which cl-lib is bundled." - cl-lib-version) - (nth 2 cl-lib-dep))))))) - -(defun package-lint--check-package-version-present () - "Check that a valid \"Version\" header is present." - (let ((version (package-lint--goto-header (rx (? "Package-") "Version")))) - (if version - (unless (ignore-errors (version-to-list version)) - (package-lint--error-at-point - 'warning - (format "\"%s\" is not a valid version. MELPA will handle this, but other archives will not." version) - (match-beginning 3))) - (package-lint--error-at-bob - 'warning - "\"Version:\" or \"Package-Version:\" header is missing. MELPA will handle this, but other archives will not.")))) - -(defun package-lint--liberal-package-buffer-info () - "Like `package-buffer-info', but tolerate missing version header." - (let ((orig-buffer (current-buffer))) - ;; We've reported version header issues separately, so rule them out here - (with-temp-buffer - (insert-buffer-substring-no-properties orig-buffer) - (goto-char (point-min)) - (package-lint--update-or-insert-version "0") - (package-buffer-info)))) - -(defun package-lint--check-package-el-can-parse () - "Check that `package-buffer-info' can read metadata from this file. -If it can, return the read metadata." - (condition-case err - (package-lint--liberal-package-buffer-info) - (error - (package-lint--error-at-bob - 'error - (format "package.el cannot parse this buffer: %s" (error-message-string err))) - nil))) - -(defun package-lint--check-package-summary (desc) - "Check the summary for package with descriptor DESC. -DESC is a struct as returned by `package-buffer-info'." - (let ((summary (package-lint--package-desc-summary desc))) - (cond - ((string= summary "") - (package-lint--error-at-bob - 'error - "Package should have a non-empty summary.")) - (t - (unless (let ((case-fold-search nil)) - (string-match-p "^[A-Z0-9]" summary)) - (package-lint--error-at-bob - 'warning - "The package summary should start with an uppercase letter or a digit.")) - (when (> (length summary) 60) - (package-lint--error-at-bob - 'warning - "The package summary is too long. It should be at most 60 characters.")) - (when (string-match "\\.\\'" summary) - (package-lint--error-at-bob - 'warning - "The package summary should not end with a period.")) - (when (save-match-data - (let ((case-fold-search t)) - (and (string-match "[^.]\\" summary) - (not (string-match-p "[[:space:]]+lisp" - summary (match-end 0)))))) - (package-lint--error-at-bob - 'warning - "Including \"Emacs\" in the package summary is usually redundant.")))))) - -(defun package-lint--check-provide-form (desc) - "Check the provide form for package with descriptor DESC. -DESC is a struct as returned by `package-buffer-info'." - (let ((name (package-lint--package-desc-name desc)) - (feature (package-lint--provided-feature))) - (unless (string-equal (symbol-name name) feature) - (package-lint--error-at-bob - 'error - (format "There is no (provide '%s) form." name))))) - -(defun package-lint--check-provide-form-secondary-file () - "Check there is a provide form." - ;; We don't require that the provided feature have a name consistent - ;; with the overall package prefix, but this check may later be added. - (unless (package-lint--provided-feature) - (package-lint--error-at-bob - 'error - "There is no `provide' form."))) - -(defun package-lint--check-no-emacs-in-package-name (desc) - "Check that the package name doesn't contain \"emacs\". -DESC is a struct as returned by `package-buffer-info'." - (let ((name (package-lint--package-desc-name desc))) - (when (string-match-p "emacs" (symbol-name name)) - (package-lint--error-at-bob - 'warning - "The word \"emacs\" is redundant in Emacs package names.")))) - -(defun package-lint--check-symbol-separators (definitions) - "Check that symbol DEFINITIONS don't contain non-standard separators." - (pcase-dolist (`(,name . ,position) definitions) - (when (and (string-match "[:/]" name) - (not (string-match-p package-lint--sane-prefixes name))) - (let ((match-pos (match-beginning 0))) - ;; As a special case, allow `/=' when at the end of a symbol. - (when (or (not (string-match (rx "/=" string-end) name)) - (/= match-pos (match-beginning 0))) - (goto-char position) - (package-lint--error - (line-number-at-pos) 0 'error - (format "`%s' contains a non-standard separator `%s', use hyphens instead (see Elisp Coding Conventions)." - name (substring-no-properties name match-pos (1+ match-pos))))))))) - -(defun package-lint--valid-definition-name-p (name prefix &optional position) - "Return non-nil if NAME denotes a valid definition name. - -Valid definition names are: - -- a NAME starting with PREFIX, a string representing the current - package prefix, - -- a NAME matching `package-lint--sane-prefixes', or - -- a NAME whose POSITION in the buffer denotes a global definition." - (or (string-prefix-p prefix name) - (string-match-p package-lint--sane-prefixes name) - (string-match-p (rx-to-string `(seq string-start (or "define" "defun" "defvar" "defface" "with") "-" ,prefix)) name) - (string-match-p (rx-to-string `(seq string-start "global-" ,prefix (or "-mode" (seq "-" (* any) "-mode")) string-end)) name) - (when position - (goto-char position) - (looking-at-p (rx (*? space) "(" (*? space) - (or "defadvice" "cl-defmethod") - symbol-end))))) - -(defun package-lint--check-defs-prefix (prefix definitions) - "Verify that symbol DEFINITIONS start with package PREFIX." - (pcase-dolist (`(,name . ,position) definitions) - (unless (package-lint--valid-definition-name-p name prefix position) - (if (package-lint--added-or-removed-function-p (intern name)) - (package-lint--error-at-point - 'error - (format "Define compatibility functions with a prefix, e.g. \"%s--%s\", and use `defalias' where they exist." - prefix name) - position) - (package-lint--error-at-point - 'error - (format "\"%s\" doesn't start with package's prefix \"%s\"." - name prefix) - position))))) - -(defun package-lint--check-minor-mode (def) - "Offer up concerns about the minor mode definition DEF." - (when (cl-search '(:global t) def) - (package-lint--check-globalized-minor-mode def))) - -(defun package-lint--check-globalized-minor-mode (def) - "Offer up concerns about the global minor mode definition DEF." - (let ((feature-name (package-lint--provided-feature))) - (when feature-name - (let ((feature (intern feature-name)) - (autoloaded (save-excursion - (forward-line -1) - (beginning-of-line) - (looking-at ";;;###autoload")))) - (unless (or autoloaded - (cl-search `(:require ',feature) def :test #'equal)) - (package-lint--error-at-point - 'error - (format - "Global minor modes should be autoloaded or, rarely, `:require' their defining file (i.e. \":require '%s\"), to support the customization variable of the same name." feature))))))) - -(defun package-lint--check-defgroup (def) - "Offer up concerns about the customization group definition DEF." - (when (symbolp (cadr def)) - (let ((group-name (symbol-name (cadr def)))) - (when (string-match "\\(.*\\)-mode$" group-name) - (let ((parent (intern (match-string 1 group-name)))) - (unless (cl-search `(:group ',parent) def :test #'equal) - (package-lint--error-at-point - 'error - "Customization groups should not end in \"-mode\" unless that name would conflict with their parent group.")))))) - - (unless (memq :group def) - (package-lint--error-at-point - 'error - "Customization groups should specify a parent via `:group'."))) - -(defun package-lint--check-defalias (prefix def) - "Offer up concerns about the customization group definition DEF. -PREFIX is the package prefix." - (pcase (cadr def) - ((and `(quote ,alias) (guard (symbolp alias))) - (unless (package-lint--valid-definition-name-p (symbol-name alias) prefix) - (package-lint--error-at-point - 'error - (concat "Aliases should start with the package's prefix \"" prefix "\".")))))) - -(defun package-lint--check-format-string (valid-deps def) - "Offer up concerns about the format string used in DEF, depending on VALID-DEPS." - (let ((emacs-version-dep (or (cadr (assq 'emacs valid-deps)) '(0)))) - (when (consp (cdr def)) - (let ((fmt-str (cadr def))) - (when (and (version-list-< emacs-version-dep '(26 1)) - ;; We give up on trying to warn about format strings that are - ;; evaluated at runtime. - (stringp fmt-str) - ;; The usual regexp strategy for finding unescaped matches - ;; requires negative lookbehind: - ;; (? (length lks) 1) (equal (car (last lks)) ?\C-g)) - (and (equal (car (last lks)) ?\e) - (not (equal (nthcdr (- (length lks) 2) lks) - '(?\e ?\e)))) - (equal (car (last lks)) ?\C-h) - (and (equal modifiers '(control)) - (equal ?c basic-type) - (cdr lks) - (let ((v (event-basic-type (cdr lks))) - (m (event-modifiers (cdr lks)))) - (and (numberp v) - (<= v ?z) - (>= v ?a) - (or (null m) (equal '(shift) m))))) - (member basic-type '(f5 f6 f7 f8 f9))) - "This key sequence is reserved (see Key Binding Conventions in the Emacs Lisp manual)"))) - -(defun package-lint--region-empty-p (start end) - "Return t iff the region between START and END has no non-empty lines. - -Lines consisting only of whitespace or empty comments are considered empty." - (save-excursion - (save-restriction - (let ((inhibit-changing-match-data t)) - (narrow-to-region start end) - (goto-char start) - (while (and (looking-at "^[[:space:]]*;*[[:space:]]*$") - (= 0 (forward-line)))) - (eobp))))) - -(defun package-lint--highest-installable-version-of (package) - "Return the highest version of PACKAGE available for installation." - (let ((descriptors (cdr (assq package package-archive-contents)))) - (if (fboundp 'package-desc-version) - (car (sort (mapcar 'package-desc-version descriptors) - (lambda (v1 v2) (not (version-list-< v1 v2))))) - (aref descriptors 0)))) - -(defun package-lint--goto-header (header-name) - "Move to the first occurrence of HEADER-NAME in the file. -If the return value is non-nil, then point will be at the end of -the file, and the second and third match groups will contain the name and -value of the header with any leading or trailing whitespace removed." - (let ((initial-point (point))) - (goto-char (point-min)) - (let ((case-fold-search t)) - (if (re-search-forward (concat (lm-get-header-re header-name) "\\(.*?\\) *$") nil t) - (match-string-no-properties 3) - (goto-char initial-point) - nil)))) - -(defun package-lint--update-or-insert-version (version) - "Ensure current buffer has a \"Version: VERSION\" header." - (if (package-lint--goto-header "Version") - (move-beginning-of-line nil) - (forward-line)) - (insert (format ";; Version: %s" version)) - (newline)) - -(defun package-lint--get-header-line-file-local-variables () - "Return local variables specified in the -*- line. -Returns an alist of elements (VAR . VAL), where VAR is a variable -and VAL is the specified value. - -For details, see `hack-local-variables-prop-line'." - (cl-letf (((symbol-function #'message) #'ignore)) - (hack-local-variables-prop-line))) - -(defun package-lint--lexical-binding-declared-in-header-line-p () - "Test if `lexical-binding' is declared in the -*- line." - ;; Test the `cdr' to see if it's actually true, because - ;; -*- lexical-binding: nil -*- - ;; is legal, if silly. - (cdr (assq 'lexical-binding (package-lint--get-header-line-file-local-variables)))) - -(defvar semantic-imenu-summary-function) - -(defun package-lint--get-defs () - "Return a list of all variables and functions defined in the current buffer. - -The returned list is of the form (SYMBOL-NAME . POSITION)." - ;; We probably could use Semantic instead, but it's a *global* minor mode and - ;; it tends to be quite heavy, so use Imenu instead; if the user has Semantic - ;; enabled, Imenu will use its index anyway. - (let ((result '()) - (index - (save-excursion - ;; Use the default imenu expression list so that we're not confused - ;; by user customizations. - (let ((imenu-generic-expression lisp-imenu-generic-expression) - ;; In case it's actually Semantic, tell it not to decorate - ;; symbol names. - (semantic-imenu-summary-function 'semantic-format-tag-name)) - (funcall imenu-create-index-function))))) - (dolist (entry index) - (pcase entry - ((and `(,submenu-name . ,submenu-elements) - (guard (consp submenu-elements))) - (when (member submenu-name '("Variables" "Defuns")) - (setq result (nconc (reverse submenu-elements) result)))) - (_ - (push entry result)))) - ;; If it's Semantic, then it returns overlays, not positions. Convert - ;; them. - (dolist (entry result) - (when (overlayp (cdr entry)) - (setcdr entry (overlay-start (cdr entry))))) - (nreverse result))) - -(defun package-lint--provided-feature () - "Return the last-provided feature name, as a string, or nil if none." - (save-excursion - (goto-char (point-max)) - (cond ((re-search-backward (rx "(provide '" (group (1+ (or (syntax word) (syntax symbol))))) nil t) - (match-string-no-properties 1)) - ((re-search-backward "(provide-me)" nil t) - (file-name-sans-extension (file-name-nondirectory buffer-file-name)))))) - -(defun package-lint--get-package-prefix () - "Return package prefix string (i.e. the symbol the package `provide's). -Prefix is returned without any `-mode' suffix." - (let ((feature (package-lint--provided-feature))) - (when feature - (replace-regexp-in-string "-mode\\'" "" feature)))) - -(defun package-lint--check-objects-by-regexp (regexp function) - "Check all objects with the literal printed form matching REGEXP. - -The objects are parsed with `read'. The FUNCTION is passed the -read object, with the point at the beginning of the match. - -S-expressions in comments or comments, partial s-expressions, or -otherwise invalid read forms are ignored." - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (save-excursion - (goto-char (match-beginning 0)) - (let ((obj (unless (package-lint--inside-comment-or-string-p) - (save-excursion - (ignore-errors (read (current-buffer))))))) - (when obj (funcall function obj)))))) - - -;;; Public interface - -;;;###autoload -(defun package-lint-buffer (&optional buffer) - "Get linter errors and warnings for BUFFER. - -Returns a list, each element of which is list of - - (LINE COL TYPE MESSAGE) - -where TYPE is either 'warning or 'error. - -Current buffer is used if none is specified." - (with-current-buffer (or buffer (current-buffer)) - (unless (derived-mode-p 'emacs-lisp-mode) - (error "Buffer must be in emacs-lisp-mode")) - (package-lint--check-all))) - -;;;###autoload -(defun package-lint-current-buffer () - "Display lint errors and warnings for the current buffer." - (interactive) - (let ((errs (package-lint-buffer)) - (buf "*Package-Lint*")) - (with-current-buffer (get-buffer-create buf) - (let ((buffer-read-only nil)) - (erase-buffer) - (cond - ((null errs) (insert "No issues found.")) - ((null (cdr errs)) (insert "1 issue found:\n\n")) - (t (insert (format "%d issues found:\n\n" (length errs))))) - (pcase-dolist (`(,line ,col ,type ,message) errs) - (insert (format "%d:%d: %s: %s\n" line col type message)))) - (special-mode) - (view-mode 1)) - (display-buffer buf))) - -(defgroup package-lint nil - "A linting library for elisp package authors" - :group 'development) - -(defcustom package-lint-batch-fail-on-warnings t - "When non-nil, make warnings fatal for `package-lint-batch-and-exit'." - :group 'package-lint - :type 'boolean) - -(defun package-lint-batch-and-exit-1 (filenames) - "Internal helper function for `package-lint-batch-and-exit'. - -Checks FILENAMES using package-lint. - -The main loop is this separate function so it's easier to test." - ;; Make sure package.el is initialized so we can query its database. - (package-initialize) - (let ((success t) (last-directory nil) (text-quoting-style 'grave)) - (dolist (file filenames success) - (let* ((file (expand-file-name file)) - (file-directory (file-name-directory file)) - (base (file-name-nondirectory file))) - (with-temp-buffer - (insert-file-contents file t) - (emacs-lisp-mode) - (let ((checking-result (package-lint-buffer)) - (fail-on (cons 'error (when package-lint-batch-fail-on-warnings '(warning))))) - (when (cl-some (lambda (err) (memq (nth 2 err) fail-on)) checking-result) - (setq success nil) - (unless (equal last-directory file-directory) - (setq last-directory file-directory) - (message "Entering directory '%s'" file-directory)) - (pcase-dolist (`(,line ,col ,type ,message) checking-result) - (message "%s:%d:%d: %s: %s" - base line col type message))))))))) - -;;;###autoload -(defun package-lint-batch-and-exit () - "Run `package-lint-buffer' on the files remaining on the command line. -Use this only with -batch, it won't work interactively. - -When done, exit Emacs with status 1 in case of any errors, otherwise exit -with status 0. The variable `package-lint-batch-fail-on-warnings' controls -whether or not warnings alone produce a non-zero exit code." - (unless noninteractive - (error "`package-lint-batch-and-exit' is to be used only with -batch")) - (let ((success (package-lint-batch-and-exit-1 command-line-args-left))) - (kill-emacs (if success 0 1)))) - -;;;###autoload -(defun package-lint-looks-like-a-package-p () - "Return non-nil if the current buffer appears to be intended as a package." - (or package-lint-main-file - (save-match-data - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (re-search-forward - (concat lm-header-prefix - (rx (or "Version" "Package-Version" "Package-Requires"))) - nil t)))))) - -(provide 'package-lint) -;; Local Variables: -;; indent-tabs-mode: nil -;; End: -;;; package-lint.el ends here diff --git a/elpa/package-lint-20200419.406/package-lint.elc b/elpa/package-lint-20200419.406/package-lint.elc deleted file mode 100644 index 5d91f37a00974fcb6d16cb9dac223b95c415ad86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43931 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 LOhZMST3!DCeRzIK diff --git a/elpa/page-break-lines-20200305.244/page-break-lines-autoloads.el b/elpa/page-break-lines-20200305.244/page-break-lines-autoloads.el deleted file mode 100644 index 331d2451..00000000 --- a/elpa/page-break-lines-20200305.244/page-break-lines-autoloads.el +++ /dev/null @@ -1,62 +0,0 @@ -;;; page-break-lines-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "page-break-lines" "page-break-lines.el" (0 -;;;;;; 0 0 0)) -;;; Generated autoloads from page-break-lines.el - -(autoload 'page-break-lines-mode "page-break-lines" "\ -Toggle Page Break Lines mode. - -In Page Break mode, page breaks (^L characters) are displayed as a -horizontal line of `page-break-lines-char' characters. - -\(fn &optional ARG)" t nil) - -(define-obsolete-function-alias 'turn-on-page-break-lines-mode 'page-break-lines-mode) - -(autoload 'page-break-lines-mode-maybe "page-break-lines" "\ -Enable `page-break-lines-mode' in the current buffer if desired. -When `major-mode' is listed in `page-break-lines-modes', then -`page-break-lines-mode' will be enabled. - -\(fn)" nil nil) - -(defvar global-page-break-lines-mode nil "\ -Non-nil if Global Page-Break-Lines mode is enabled. -See the `global-page-break-lines-mode' command -for a description of this minor mode. -Setting this variable directly does not take effect; -either customize it (see the info node `Easy Customization') -or call the function `global-page-break-lines-mode'.") - -(custom-autoload 'global-page-break-lines-mode "page-break-lines" nil) - -(autoload 'global-page-break-lines-mode "page-break-lines" "\ -Toggle Page-Break-Lines mode in all buffers. -With prefix ARG, enable Global Page-Break-Lines mode if ARG is positive; -otherwise, disable it. If called from Lisp, enable the mode if -ARG is omitted or nil. - -Page-Break-Lines mode is enabled in all buffers where -`page-break-lines-mode-maybe' would do it. -See `page-break-lines-mode' for more information on Page-Break-Lines mode. - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "page-break-lines" '("page-break-lines-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; page-break-lines-autoloads.el ends here diff --git a/elpa/page-break-lines-20200305.244/page-break-lines-pkg.el b/elpa/page-break-lines-20200305.244/page-break-lines-pkg.el deleted file mode 100644 index a9a9df09..00000000 --- a/elpa/page-break-lines-20200305.244/page-break-lines-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "page-break-lines" "20200305.244" "Display ^L page breaks as tidy horizontal lines" '((emacs "24.4")) :commit "314b397910b3d16bb7cbcc25098696348e678080" :keywords '("convenience" "faces") :authors '(("Steve Purcell" . "steve@sanityinc.com")) :maintainer '("Steve Purcell" . "steve@sanityinc.com") :url "https://github.com/purcell/page-break-lines") diff --git a/elpa/page-break-lines-20200305.244/page-break-lines.el b/elpa/page-break-lines-20200305.244/page-break-lines.el deleted file mode 100644 index f384a849..00000000 --- a/elpa/page-break-lines-20200305.244/page-break-lines.el +++ /dev/null @@ -1,181 +0,0 @@ -;;; page-break-lines.el --- Display ^L page breaks as tidy horizontal lines -*- lexical-binding: t -*- - -;; Copyright (C) 2012-2015 Steve Purcell - -;; Author: Steve Purcell -;; URL: https://github.com/purcell/page-break-lines -;; Package-Version: 20200305.244 -;; Package-X-Original-Version: 0 -;; Package-Requires: ((emacs "24.4")) -;; Keywords: convenience, faces - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This library provides a global mode which displays form feed -;; characters as horizontal rules. - -;; Install from Melpa or Marmalade, or add to `load-path' and use -;; (require 'page-break-lines). - -;; Use `page-break-lines-mode' to enable the mode in specific buffers, -;; or customize `page-break-lines-modes' and enable the mode globally with -;; `global-page-break-lines-mode'. - -;; Issues and limitations: - -;; If `page-break-lines-char' is displayed at a different width to -;; regular characters, the rule may be either too short or too long: -;; rules may then wrap if `truncate-lines' is nil. On some systems, -;; Emacs may erroneously choose a different font for the page break -;; symbol, which choice can be overridden using code such as: - -;; (set-fontset-font "fontset-default" -;; (cons page-break-lines-char page-break-lines-char) -;; (face-attribute 'default :family)) - -;; Use `describe-char' on a page break char to determine whether this -;; is the case. - -;; Additionally, the use of `text-scale-increase' or -;; `text-scale-decrease' will cause the rule width to be incorrect, -;; because the reported window width (in characters) will continue to -;; be the width in the frame's default font, not the scaled font used to -;; display the rule. - -;; Adapted from code http://www.emacswiki.org/emacs/PageBreaks - -;;; Code: - -(defgroup page-break-lines nil - "Display ugly ^L page breaks as tidy horizontal lines." - :prefix "page-break-lines-" - :group 'faces) - -(defcustom page-break-lines-char ?─ - "Character used to render page break lines." - :type 'character - :group 'page-break-lines) - -(defcustom page-break-lines-lighter " PgLn" - "Mode-line indicator for `page-break-lines-mode'." - :type '(choice (const :tag "No lighter" "") string) - :group 'page-break-lines) - -(defcustom page-break-lines-max-width nil - "If non-nil, maximum width (in characters) of page break indicator. -If nil, indicator will span the width of the frame." - :type '(choice integer (const :tag "Full width" nil)) - :group 'page-break-lines) - -(defcustom page-break-lines-modes - '(emacs-lisp-mode lisp-mode scheme-mode compilation-mode outline-mode help-mode) - "Modes in which to enable `page-break-lines-mode'." - :type '(repeat symbol) - :group 'page-break-lines) - -(defface page-break-lines - '((t :inherit font-lock-comment-face :bold nil :italic nil)) - "Face used to colorize page break lines. -If using :bold or :italic, please ensure `page-break-lines-char' -is available in that variant of your font, otherwise it may be -displayed as a junk character." - :group 'page-break-lines) - - - -;;;###autoload -(define-minor-mode page-break-lines-mode - "Toggle Page Break Lines mode. - -In Page Break mode, page breaks (^L characters) are displayed as a -horizontal line of `page-break-lines-char' characters." - :lighter page-break-lines-lighter - :group 'page-break-lines - (page-break-lines--update-display-tables)) - -;;;###autoload -(define-obsolete-function-alias 'turn-on-page-break-lines-mode 'page-break-lines-mode) - -(dolist (hook '(window-configuration-change-hook - window-size-change-functions - after-setting-font-hook - display-line-numbers-mode-hook)) - (add-hook hook 'page-break-lines--update-display-tables)) - - - -(defun page-break-lines--update-display-table (window) - "Modify a display-table that displays page-breaks prettily. -If the buffer inside WINDOW has `page-break-lines-mode' enabled, -its display table will be modified as necessary." - (with-current-buffer (window-buffer window) - (with-selected-window window - (if page-break-lines-mode - (progn - (unless buffer-display-table - (setq buffer-display-table (make-display-table))) - (let ((default-height (face-attribute 'default :height nil 'default))) - (set-face-attribute 'page-break-lines nil :height default-height) - (let* ((cwidth (char-width page-break-lines-char)) - (wwidth-pix (- (window-width nil t) - (if (and (bound-and-true-p display-line-numbers) - (fboundp 'line-number-display-width)) - (line-number-display-width t) - 0))) - (width (- (/ wwidth-pix (frame-char-width) cwidth) - (if (display-graphic-p) 0 1))) - (width (if page-break-lines-max-width - (min width page-break-lines-max-width) - width)) - (glyph (make-glyph-code page-break-lines-char 'page-break-lines)) - (new-display-entry (vconcat (make-list width glyph)))) - (unless (equal new-display-entry (elt buffer-display-table ?\^L)) - (aset buffer-display-table ?\^L new-display-entry))))) - (when (and (apply 'derived-mode-p page-break-lines-modes) - buffer-display-table) - (aset buffer-display-table ?\^L nil)))))) - -(defun page-break-lines--update-display-tables (&optional frame) - "Function called for updating display table in windows of FRAME." - (unless (minibufferp) - (mapc 'page-break-lines--update-display-table (window-list frame 'no-minibuffer)))) - - - -;;;###autoload -(defun page-break-lines-mode-maybe () - "Enable `page-break-lines-mode' in the current buffer if desired. -When `major-mode' is listed in `page-break-lines-modes', then -`page-break-lines-mode' will be enabled." - (if (and (not (minibufferp)) - (apply 'derived-mode-p page-break-lines-modes)) - (page-break-lines-mode 1))) - -;;;###autoload -(define-global-minor-mode global-page-break-lines-mode - page-break-lines-mode page-break-lines-mode-maybe - :require 'page-break-lines - :group 'page-break-lines) - - -(provide 'page-break-lines) - -;; Local Variables: -;; coding: utf-8 -;; checkdoc-minor-mode: t -;; End: - -;;; page-break-lines.el ends here diff --git a/elpa/page-break-lines-20200305.244/page-break-lines.elc b/elpa/page-break-lines-20200305.244/page-break-lines.elc deleted file mode 100644 index 1b16dde8d96664fae0b7a42cc8fc3919e14d82b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10025 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 ZD-S%R9@b5>Y6L$yUGVe6x|;~H{SOH)nyml; diff --git a/elpa/pickle-20190923.354/pickle-autoloads.el b/elpa/pickle-20190923.354/pickle-autoloads.el deleted file mode 100644 index adfea227..00000000 --- a/elpa/pickle-20190923.354/pickle-autoloads.el +++ /dev/null @@ -1,32 +0,0 @@ -;;; pickle-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "pickle" "pickle.el" (0 0 0 0)) -;;; Generated autoloads from pickle.el - -(autoload 'pickle-mode "pickle" "\ - - -\(fn)" t nil) - -(autoload 'pickle-config "pickle" "\ -Default pickle setup and bindings. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pickle" '("pickle-" "default-tab-width"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; pickle-autoloads.el ends here diff --git a/elpa/pickle-20190923.354/pickle-pkg.el b/elpa/pickle-20190923.354/pickle-pkg.el deleted file mode 100644 index 707357ae..00000000 --- a/elpa/pickle-20190923.354/pickle-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "pickle" "20190923.354" "Major mode for editing cucumber gherkin files." '((emacs "25.1") (cl-lib "0.6.1")) :commit "3a0a717f2a24827667f34bc53830a3b81cd57460" :keywords '("ahungry" "languages" "cucumber" "gherkin") :authors '(("Matthew Carter" . "m@ahungry.com")) :maintainer '("Matthew Carter" . "m@ahungry.com") :url "https://github.com/ahungry/pickle-mode") diff --git a/elpa/pickle-20190923.354/pickle.el b/elpa/pickle-20190923.354/pickle.el deleted file mode 100644 index a2cd1c5d..00000000 --- a/elpa/pickle-20190923.354/pickle.el +++ /dev/null @@ -1,101 +0,0 @@ -;;; pickle.el --- Major mode for editing cucumber gherkin files. -*- lexical-binding: t -*- - -;; Copyright (C) 2018-2019 Matthew Carter - -;; Author: Matthew Carter -;; Maintainer: Matthew Carter -;; URL: https://github.com/ahungry/pickle-mode -;; Package-Version: 20190923.354 -;; Version: 0.0.3 -;; Date: 2018-02-15 -;; Keywords: ahungry languages cucumber gherkin -;; Package-Requires: ((emacs "25.1") (cl-lib "0.6.1")) - -;; This file is NOT part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; A major mode for handling Gherkin files and syntax highlighting. -;; -;; This mode is not coupled to an underlying Cucumber system such as feature-mode. -;; -;; If you want a full-fledged IDE like experience, see: feature-mode (no affiliation). -;; -;; If you just want syntax highlighting in a lightweight mode, use this. -;; - -;;; Code: - -(require 'cl-lib) - -(defvar pickle-mode-default-tab-width 2) - -(defconst pickle-mode-font-lock-keywords-1 - (list - '("#.*" . font-lock-comment-face) - '(" \"\\(.*?\\)\" " . font-lock-variable-name-face) - '("\\(When\\|Then\\|Given\\)" . font-lock-keyword-face) - '("\\(\\w+\\)(" 1 font-lock-function-name-face) - '("Feature: \\(.*\\)" 1 font-lock-variable-name-face) - '("Scenario: \\(.*\\)" 1 font-lock-preprocessor-face) - '("\\(.*?\\): " . font-lock-type-face) - '(") is \\(\\w+\\)" 1 font-lock-preprocessor-face) - )) - -(defvar default-tab-width 2) - -;; This is easy because the syntax just cascades the indent until it -;; resets to 0 again. No need to go back one level at a time etc. -(defun pickle-indent-line () - "Properly indent based on what we're looking at." - (interactive) - (beginning-of-line) - (if (bobp) - (indent-line-to 0) - (let ((not-indented t) - cur-indent) - (if (looking-at "^[ \t]*Feature:") - (setq cur-indent 0) - (save-excursion - (while not-indented - (forward-line -1) - (if (looking-at "^[ \t]*\\(Feature\\|Scenario\\):") - (progn - (setq cur-indent (+ default-tab-width (current-indentation))) - (setq not-indented nil)) - (if (bobp) (setq not-indented nil)) - ))) - ) - (if cur-indent (indent-line-to cur-indent) (indent-line-to 0)))) - ) - -;;;###autoload -(define-derived-mode pickle-mode text-mode "Pickle" () - "Major mode for editing Gherkin (Cucumber) files." - :group 'languages - (set (make-local-variable 'indent-line-function) 'pickle-indent-line) - (set (make-local-variable 'font-lock-defaults) - '(pickle-mode-font-lock-keywords-1))) - -;;;###autoload -(defun pickle-config () - "Default pickle setup and bindings." - (interactive) - (add-to-list 'auto-mode-alist '("\\.feature\\'" . pickle-mode))) - -(provide 'pickle) - -;;; pickle.el ends here diff --git a/elpa/pickle-20190923.354/pickle.elc b/elpa/pickle-20190923.354/pickle.elc deleted file mode 100644 index 8fe56a88b656af439a63afbdfd43e283b835b64c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4038 zcmbtXOK;mo5O#V>6(m4=NYmutiBv#RY6>DL`H8ei-Lx^%21XO0htP#r4n)k`b-7xO)R{@0yG#gN!s&6lSRsAYQ1cvx}3|dH&|`=!n9ZC`71W;+9q~(um58 zLXpx$Qj&>=lFF5mq$rYD7Nlk%^n9ZiA^4;}HsDkLTCG;Ekbf=WLQ*$OoFty~TfIn5 zFGN9k9G)lAnP-u7a3mIqa+H`j%Q!+tJVS^`A-Xo{6tQ!XEIfD4U z#%)}92#4WfiD3VX*&l9b#SdAiecFc5-ugfH63frA;z3RkiO0c zje&NbmsH3S07UT=D2j@&g>&^YVo$O~8iC~$K<}{AT@nkG&7m{I@L16V(JLud1EQXu z8emk#LZaylJzjLAYO&=2(4l4K4RD)_oKOmJ8n4m8zDHVaP6PAx=HgsBWiEAsmMc{0`%2$O@{D;V=95UE z2i>QgeNZ}To;$FpPdAOvhTM+Z>G#PLgRQUqMn949mdo<0#g^92&59ZUGm5ku(rMf< zEVZBO;C@71gr2;Rk=X!Hwmb@ye6RGu361+LOp9HYeieVhSngT$hGwB@kj+Jq&cLTiv*vM!BimYE7iS8a++?97b~*f`8Kw-=X3LaJ7j3nSbCoN4 zDYHVk-)d1Kln$z=yVX3h!vpBRUS|j2u@l&BwU)CuoWbKlIvCjrCO4Hc5oOEE_`vco z18$djmPQP1I<3679s%{DNCOCAOo((vj6KGyD$F{V^Z0DW{$5Ci%B_|LK7E5npckT~ zL91b@#=b2=koX=*C9pYTnUg8tGX@??DwWJz(Lw{RMly_UvsS~p;2*0^I8y)JG~Trp z^<39DP&fb11BMDc>AAbVz?b(WAK~LOu=$Sw3NFBmTi;~}FjqBbjqhma=`z*!9enNZ zMyMgo8wOL>qv!RQ_W_L_^pwROfWh;EDZc%h!*Gr6;%v-9hNIs$?%vyEdi=uaw!XTz zd01)pc33-GM)x1}K>}Fxw{ceO42f8o?lB3T zbED`3-7R{#q$}ZWJlkd0xUkFBKnXT(kuU=3{TQpqy7_EIY9H$f+cpM-i9qS{L^hq| zROMGnRZXb+q~1Y{8irqf7cxj$)07H*BZ{ceEyS{JptX_D_QpAriuR2iXntz|IBX|g z^Z4ZguCfg*yAdOM1*>=X+JEcL+VlZR{AN>9&rZbU`w0S5y~Omn3+;5;47w4GVYbac z$!bsY#_n#tsCAzC+w`MRTv^AiEOHGzyr}>%${Y7;yl+k8v-L{NqZU1Y*~-<;iz@Fw zD#Jp`FTL1+jKSz|JooTsHJF-rm>}r#%aP?n|AhR?Sbuly)yDR)f?dSG_G-27xBds3 CDe^A> diff --git a/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el b/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el deleted file mode 100644 index 44ce6b58..00000000 --- a/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el +++ /dev/null @@ -1,127 +0,0 @@ -;;; pkg-info-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "pkg-info" "pkg-info.el" (0 0 0 0)) -;;; Generated autoloads from pkg-info.el - -(autoload 'pkg-info-library-original-version "pkg-info" "\ -Get the original version in the header of LIBRARY. - -The original version is stored in the X-Original-Version header. -This header is added by the MELPA package archive to preserve -upstream version numbers. - -LIBRARY is either a symbol denoting a named feature, or a library -name as string. - -If SHOW is non-nil, show the version in the minibuffer. - -Return the version from the header of LIBRARY as list. Signal an -error if the LIBRARY was not found or had no X-Original-Version -header. - -See Info node `(elisp)Library Headers' for more information -about library headers. - -\(fn LIBRARY &optional SHOW)" t nil) - -(autoload 'pkg-info-library-version "pkg-info" "\ -Get the version in the header of LIBRARY. - -LIBRARY is either a symbol denoting a named feature, or a library -name as string. - -If SHOW is non-nil, show the version in the minibuffer. - -Return the version from the header of LIBRARY as list. Signal an -error if the LIBRARY was not found or had no proper header. - -See Info node `(elisp)Library Headers' for more information -about library headers. - -\(fn LIBRARY &optional SHOW)" t nil) - -(autoload 'pkg-info-defining-library-original-version "pkg-info" "\ -Get the original version of the library defining FUNCTION. - -The original version is stored in the X-Original-Version header. -This header is added by the MELPA package archive to preserve -upstream version numbers. - -If SHOW is non-nil, show the version in mini-buffer. - -This function is mainly intended to find the version of a major -or minor mode, i.e. - - (pkg-info-defining-library-version 'flycheck-mode) - -Return the version of the library defining FUNCTION. Signal an -error if FUNCTION is not a valid function, if its defining -library was not found, or if the library had no proper version -header. - -\(fn FUNCTION &optional SHOW)" t nil) - -(autoload 'pkg-info-defining-library-version "pkg-info" "\ -Get the version of the library defining FUNCTION. - -If SHOW is non-nil, show the version in mini-buffer. - -This function is mainly intended to find the version of a major -or minor mode, i.e. - - (pkg-info-defining-library-version 'flycheck-mode) - -Return the version of the library defining FUNCTION. Signal an -error if FUNCTION is not a valid function, if its defining -library was not found, or if the library had no proper version -header. - -\(fn FUNCTION &optional SHOW)" t nil) - -(autoload 'pkg-info-package-version "pkg-info" "\ -Get the version of an installed PACKAGE. - -If SHOW is non-nil, show the version in the minibuffer. - -Return the version as list, or nil if PACKAGE is not installed. - -\(fn PACKAGE &optional SHOW)" t nil) - -(autoload 'pkg-info-version-info "pkg-info" "\ -Obtain complete version info for LIBRARY and PACKAGE. - -LIBRARY is a symbol denoting a named feature, or a library name -as string. PACKAGE is a symbol denoting an ELPA package. If -omitted or nil, default to LIBRARY. - -If SHOW is non-nil, show the version in the minibuffer. - -When called interactively, prompt for LIBRARY. When called -interactively with prefix argument, prompt for PACKAGE as well. - -Return a string with complete version information for LIBRARY. -This version information contains the version from the headers of -LIBRARY, and the version of the installed PACKAGE, the LIBRARY is -part of. If PACKAGE is not installed, or if the PACKAGE version -is the same as the LIBRARY version, do not include a package -version. - -\(fn LIBRARY &optional PACKAGE SHOW)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pkg-info" '("pkg-info-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; pkg-info-autoloads.el ends here diff --git a/elpa/pkg-info-20150517.1143/pkg-info-pkg.el b/elpa/pkg-info-20150517.1143/pkg-info-pkg.el deleted file mode 100644 index d4b90e1e..00000000 --- a/elpa/pkg-info-20150517.1143/pkg-info-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "pkg-info" "20150517.1143" "Information about packages" '((epl "0.8")) :commit "76ba7415480687d05a4353b27fea2ae02b8d9d61" :keywords '("convenience") :authors '(("Sebastian Wiesner" . "swiesner@lunaryorn.com")) :maintainer '("Sebastian Wiesner" . "swiesner@lunaryorn.com") :url "https://github.com/lunaryorn/pkg-info.el") diff --git a/elpa/pkg-info-20150517.1143/pkg-info.el b/elpa/pkg-info-20150517.1143/pkg-info.el deleted file mode 100644 index e6a03a18..00000000 --- a/elpa/pkg-info-20150517.1143/pkg-info.el +++ /dev/null @@ -1,331 +0,0 @@ -;;; pkg-info.el --- Information about packages -*- lexical-binding: t; -*- - -;; Copyright (C) 2013-2015 Sebastian Wiesner - -;; Author: Sebastian Wiesner -;; URL: https://github.com/lunaryorn/pkg-info.el -;; Package-Version: 20150517.1143 -;; Keywords: convenience -;; Version: 0.7-cvs -;; Package-Requires: ((epl "0.8")) - -;; This file is not part of GNU Emacs. - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This library extracts information from installed packages. - -;;;; Functions: - -;; `pkg-info-library-version' extracts the version from the header of a library. -;; -;; `pkg-info-defining-library-version' extracts the version from the header of a -;; library defining a function. -;; -;; `pkg-info-package-version' gets the version of an installed package. -;; -;; `pkg-info-format-version' formats a version list as human readable string. -;; -;; `pkg-info-version-info' returns complete version information for a specific -;; package. -;; -;; `pkg-info-get-melpa-recipe' gets the MELPA recipe for a package. -;; -;; `pkg-info-get-melpa-fetcher' gets the fetcher used to build a package on -;; MELPA. -;; -;; `pkg-info-wiki-package-p' determines whether a package was build from -;; EmacsWiki on MELPA. - -;;; Code: - -(require 'epl) - -(require 'lisp-mnt) -(require 'find-func) -(require 'json) ; `json-read' -(require 'url-http) ; `url-http-parse-response' - -(defvar url-http-end-of-headers) - - -;;; Version information -(defun pkg-info-format-version (version) - "Format VERSION as human-readable string. - -Return a human-readable string representing VERSION." - ;; XXX: Find a better, more flexible way of formatting? - (package-version-join version)) - -(defsubst pkg-info--show-version-and-return (version show) - "Show and return VERSION. - -When SHOW is non-nil, show VERSION in minibuffer. - -Return VERSION." - (when show - (message (if (listp version) (pkg-info-format-version version) version))) - version) - -(defun pkg-info--read-library () - "Read a library from minibuffer." - (completing-read "Load library: " - (apply-partially 'locate-file-completion-table - load-path - (get-load-suffixes)))) - -(defun pkg-info--read-function () - "Read a function name from minibuffer." - (let ((input (completing-read "Function: " obarray #'boundp :require-match))) - (if (string= input "") nil (intern input)))) - -(defun pkg-info--read-package () - "Read a package name from minibuffer." - (let* ((installed (epl-installed-packages)) - (names (sort (mapcar (lambda (pkg) - (symbol-name (epl-package-name pkg))) - installed) - #'string<)) - (default (car names))) - (completing-read "Installed package: " names nil 'require-match - nil nil default))) - -(defun pkg-info-library-source (library) - "Get the source file of LIBRARY. - -LIBRARY is either a symbol denoting a named feature, or a library -name as string. - -Return the source file of LIBRARY as string." - (find-library-name (if (symbolp library) (symbol-name library) library))) - -(defun pkg-info-defining-library (function) - "Get the source file of the library defining FUNCTION. - -FUNCTION is a function symbol. - -Return the file name of the library as string. Signal an error -if the library does not exist, or if the definition of FUNCTION -was not found." - (unless (functionp function) - (signal 'wrong-type-argument (list 'functionp function))) - (let ((library (symbol-file function 'defun))) - (unless library - (error "Can't find definition of %s" function)) - library)) - -(defun pkg-info-x-original-version (file) - "Read the X-Original-Version header from FILE. - -Return the value as version list, or return nil if FILE lacks -this header. Signal an error, if the value of the header is not -a valid version." - (let ((version-str (with-temp-buffer - (insert-file-contents file) - (lm-header "X-Original-Version")))) - (when version-str - (version-to-list version-str)))) - -;;;###autoload -(defun pkg-info-library-original-version (library &optional show) - "Get the original version in the header of LIBRARY. - -The original version is stored in the X-Original-Version header. -This header is added by the MELPA package archive to preserve -upstream version numbers. - -LIBRARY is either a symbol denoting a named feature, or a library -name as string. - -If SHOW is non-nil, show the version in the minibuffer. - -Return the version from the header of LIBRARY as list. Signal an -error if the LIBRARY was not found or had no X-Original-Version -header. - -See Info node `(elisp)Library Headers' for more information -about library headers." - (interactive (list (pkg-info--read-library) t)) - (let ((version (pkg-info-x-original-version - (pkg-info-library-source library)))) - (if version - (pkg-info--show-version-and-return version show) - (error "Library %s has no original version" library)))) - -;;;###autoload -(defun pkg-info-library-version (library &optional show) - "Get the version in the header of LIBRARY. - -LIBRARY is either a symbol denoting a named feature, or a library -name as string. - -If SHOW is non-nil, show the version in the minibuffer. - -Return the version from the header of LIBRARY as list. Signal an -error if the LIBRARY was not found or had no proper header. - -See Info node `(elisp)Library Headers' for more information -about library headers." - (interactive (list (pkg-info--read-library) t)) - (let* ((source (pkg-info-library-source library)) - (version (epl-package-version (epl-package-from-file source)))) - (pkg-info--show-version-and-return version show))) - -;;;###autoload -(defun pkg-info-defining-library-original-version (function &optional show) - "Get the original version of the library defining FUNCTION. - -The original version is stored in the X-Original-Version header. -This header is added by the MELPA package archive to preserve -upstream version numbers. - -If SHOW is non-nil, show the version in mini-buffer. - -This function is mainly intended to find the version of a major -or minor mode, i.e. - - (pkg-info-defining-library-version 'flycheck-mode) - -Return the version of the library defining FUNCTION. Signal an -error if FUNCTION is not a valid function, if its defining -library was not found, or if the library had no proper version -header." - (interactive (list (pkg-info--read-function) t)) - (pkg-info-library-original-version (pkg-info-defining-library function) show)) - -;;;###autoload -(defun pkg-info-defining-library-version (function &optional show) - "Get the version of the library defining FUNCTION. - -If SHOW is non-nil, show the version in mini-buffer. - -This function is mainly intended to find the version of a major -or minor mode, i.e. - - (pkg-info-defining-library-version 'flycheck-mode) - -Return the version of the library defining FUNCTION. Signal an -error if FUNCTION is not a valid function, if its defining -library was not found, or if the library had no proper version -header." - (interactive (list (pkg-info--read-function) t)) - (pkg-info-library-version (pkg-info-defining-library function) show)) - -;;;###autoload -(defun pkg-info-package-version (package &optional show) - "Get the version of an installed PACKAGE. - -If SHOW is non-nil, show the version in the minibuffer. - -Return the version as list, or nil if PACKAGE is not installed." - (interactive (list (pkg-info--read-package) t)) - (let* ((name (if (stringp package) (intern package) package)) - (package (car (epl-find-installed-packages name)))) - (unless package - (error "Can't find installed package %s" name)) - (pkg-info--show-version-and-return (epl-package-version package) show))) - -;;;###autoload -(defun pkg-info-version-info (library &optional package show) - "Obtain complete version info for LIBRARY and PACKAGE. - -LIBRARY is a symbol denoting a named feature, or a library name -as string. PACKAGE is a symbol denoting an ELPA package. If -omitted or nil, default to LIBRARY. - -If SHOW is non-nil, show the version in the minibuffer. - -When called interactively, prompt for LIBRARY. When called -interactively with prefix argument, prompt for PACKAGE as well. - -Return a string with complete version information for LIBRARY. -This version information contains the version from the headers of -LIBRARY, and the version of the installed PACKAGE, the LIBRARY is -part of. If PACKAGE is not installed, or if the PACKAGE version -is the same as the LIBRARY version, do not include a package -version." - (interactive (list (pkg-info--read-library) - (when current-prefix-arg - (pkg-info--read-package)) - t)) - (let* ((package (or package (if (stringp library) (intern library) library))) - (orig-version (condition-case nil - (pkg-info-library-original-version library) - (error nil))) - ;; If we have X-Original-Version, we assume that MELPA replaced the - ;; library version with its generated version, so we use the - ;; X-Original-Version header instead, and ignore the library version - ;; header - (lib-version (or orig-version (pkg-info-library-version library))) - (pkg-version (condition-case nil - (pkg-info-package-version package) - (error nil))) - (version (if (and pkg-version - (not (version-list-= lib-version pkg-version))) - (format "%s (package: %s)" - (pkg-info-format-version lib-version) - (pkg-info-format-version pkg-version)) - (pkg-info-format-version lib-version)))) - (pkg-info--show-version-and-return version show))) - -(defconst pkg-info-melpa-recipe-url "http://melpa.org/recipes.json" - "The URL from which to fetch MELPA recipes.") - -(defvar pkg-info-melpa-recipes nil - "An alist of MELPA recipes.") - -(defun pkg-info-retrieve-melpa-recipes () - "Retrieve MELPA recipes from MELPA archive." - (let ((buffer (url-retrieve-synchronously pkg-info-melpa-recipe-url))) - (with-current-buffer buffer - (unwind-protect - (let ((response-code (url-http-parse-response))) - (unless (equal response-code 200) - (error "Failed to retrieve MELPA recipes from %s (code %s)" - pkg-info-melpa-recipe-url response-code)) - (goto-char url-http-end-of-headers) - (json-read)) - (when (and buffer (buffer-live-p buffer)) - (kill-buffer buffer)))))) - -(defun pkg-info-get-melpa-recipes () - "Get MELPA recipes." - (setq pkg-info-melpa-recipes - (or pkg-info-melpa-recipes - (pkg-info-retrieve-melpa-recipes)))) - -(defun pkg-info-get-melpa-recipe (package) - "Get the MELPA recipe for PACKAGE. - -Return nil if PACKAGE is not on MELPA." - (cdr (assq package (pkg-info-get-melpa-recipes)))) - -(defun pkg-info-get-melpa-fetcher (package) - "Get the MELPA fetcher for PACKAGE." - (cdr (assq 'fetcher (pkg-info-get-melpa-recipe package)))) - -(defun pkg-info-wiki-package-p (package) - "Determine whether PACKAGE is build from the EmacsWiki." - (equal (pkg-info-get-melpa-fetcher package) "wiki")) - -(provide 'pkg-info) - -;; Local Variables: -;; indent-tabs-mode: nil -;; coding: utf-8 -;; End: - -;;; pkg-info.el ends here diff --git a/elpa/pkg-info-20150517.1143/pkg-info.elc b/elpa/pkg-info-20150517.1143/pkg-info.elc deleted file mode 100644 index bf38ae9d6e4ce25abce9d348a5561e435e58bc0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9914 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 diff --git a/elpa/plantuml-mode-20191102.2056/plantuml-mode-autoloads.el b/elpa/plantuml-mode-20191102.2056/plantuml-mode-autoloads.el deleted file mode 100644 index 3fdef07f..00000000 --- a/elpa/plantuml-mode-20191102.2056/plantuml-mode-autoloads.el +++ /dev/null @@ -1,32 +0,0 @@ -;;; plantuml-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "plantuml-mode" "plantuml-mode.el" (0 0 0 0)) -;;; Generated autoloads from plantuml-mode.el - -(add-to-list 'auto-mode-alist '("\\.\\(plantuml\\|pum\\|plu\\)\\'" . plantuml-mode)) - -(autoload 'plantuml-mode "plantuml-mode" "\ -Major mode for plantuml. - -Shortcuts Command Name -\\[plantuml-complete-symbol] `plantuml-complete-symbol' - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "plantuml-mode" '("plantuml-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; plantuml-mode-autoloads.el ends here diff --git a/elpa/plantuml-mode-20191102.2056/plantuml-mode-pkg.el b/elpa/plantuml-mode-20191102.2056/plantuml-mode-pkg.el deleted file mode 100644 index fe72ce94..00000000 --- a/elpa/plantuml-mode-20191102.2056/plantuml-mode-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "plantuml-mode" "20191102.2056" "Major mode for PlantUML" '((dash "2.0.0") (emacs "25.0")) :commit "ea45a13707abd2a70df183f1aec6447197fc9ccc" :keywords '("uml" "plantuml" "ascii") :authors '(("Zhang Weize (zwz)")) :maintainer '("Carlo Sciolla (skuro)")) diff --git a/elpa/plantuml-mode-20191102.2056/plantuml-mode.el b/elpa/plantuml-mode-20191102.2056/plantuml-mode.el deleted file mode 100644 index 7bfc2110..00000000 --- a/elpa/plantuml-mode-20191102.2056/plantuml-mode.el +++ /dev/null @@ -1,762 +0,0 @@ -;;; plantuml-mode.el --- Major mode for PlantUML -*- lexical-binding: t; -*- - -;; Filename: plantuml-mode.el -;; Description: Major mode for PlantUML diagrams sources -;; Compatibility: Tested with Emacs 25 through 27 (current master) -;; Author: Zhang Weize (zwz) -;; Maintainer: Carlo Sciolla (skuro) -;; Keywords: uml plantuml ascii -;; Version: 1.2.9 -;; Package-Version: 20191102.2056 -;; Package-X-Original-Version: 1.2.9 -;; Package-Requires: ((dash "2.0.0") (emacs "25.0")) - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: -;; -;; A major mode for plantuml, see: http://plantuml.sourceforge.net/ -;; Plantuml is an open-source tool in java that allows to quickly write : -;; - sequence diagram, -;; - use case diagram, -;; - class diagram, -;; - activity diagram, -;; - component diagram, -;; - state diagram -;; - object diagram - -;;; Change log: -;; -;; version 1.4.1, 2019-09-03 Better indentation; more bugfixing; actually adding `executable' mode -;; version 1.4.0, 2019-08-21 Added `executable' exec mode to use locally installed `plantuml' binaries, various bugfixes -;; version 1.3.1, 2019-08-02 Fixed interactive behavior of `plantuml-set-exec-mode' -;; version 1.3.0, 2019-05-31 Added experimental support for multiple rendering modes and, specifically, preview using a PlantUML server -;; version 1.2.11, 2019-04-09 Added `plantuml-download-jar' -;; version 1.2.10, 2019-04-03 Avoid messing with window layouts and buffers -- courtesy of https://github.com/wailo -;; version 1.2.9, Revamped indentation support, now working with a greater number of keywords -;; version 1.2.8, 2019-01-07 Support indentation for activate / deactivate blocks; allow customization of `plantuml-java-args' -;; version 1.2.7, 2018-08-15 Added support for indentation; Fixed the comiling error when installing with melpa -;; version 1.2.6, 2018-07-17 Introduced custom variable `plantuml-jar-args' to control which arguments are passed to PlantUML jar. Fix the warning of failing to specify types of 'defcustom' variables -;; version 1.2.5, 2017-08-19 #53 Fixed installation warnings -;; version 1.2.4, 2017-08-18 #60 Licensed with GPLv3+ to be compatible with Emacs -;; version 1.2.3, 2016-12-25 #50 unicode support in generated output -;; version 1.2.2, 2016-11-11 Fixed java commands handling under windows; support spaces in `plantuml-jar-path' -;; version 1.2.1, 2016-11-11 Support for paths like `~/.plantuml/plantuml.jar' for `plantuml-jar-path' (the tilde was previously unsupported) -;; version 1.2.0, 2016-11-09 Added `plantuml-preview-current-buffer', courtesy of @7mamu4 -;; version 1.1.1, 2016-11-08 Fix process handling with Windows native emacs; better file extention match for autoloading the mode -;; version 1.1.0, 2016-10-18 Make PlantUML run headless by default; introduced custom variable `plantuml-java-args' to control which arguments are passed to Plantuml. -;; version 1.0.1, 2016-10-17 Bugfix release: proper auto-mode-alist regex; init delayed at mode load; avoid calling hooks twice. -;; version 1.0.0, 2016-10-16 Moved the mode to plantuml-mode, superseding zwz/plantuml-mode and skuro/puml-mode. Added preview for the currently selected region. -;; version 0.6.7, 2016-10-11 [from puml-mode] Added deprecation warning in favor of plantuml-mode -;; version 0.6.6, 2016-07-19 [from puml-mode] Added autoload, minor bug fixes -;; version 0.6.5, 2016-03-24 [from puml-mode] Added UTF8 support and open in new window / frame shortcuts -;; version 0.6.4, 2015-12-12 [from puml-mode] Added support for comments (single and multiline) -- thanks to https://github.com/nivekuil -;; version 0.6.3, 2015-11-07 [from puml-mode] Added per-buffer configurability of output type (thanks to https://github.com/davazp) -;; version 0.6.2, 2015-11-07 [from puml-mode] Added debugging capabilities to improve issue analysis -;; version 0.6.1, 2015-09-26 [from puml-mode] Bugfix: use eq to compare symbols instead of cl-equalp -;; version 0.6, 2015-09-26 [from puml-mode] Fixed PNG preview -;; version 0.5, 2015-09-21 [from puml-mode] Added preview capabilities -;; version 0.4, 2015-06-14 [from puml-mode] Use a puml- prefix to distinguish from the other plantuml-mode -;; version 0.3, 2015-06-13 [from puml-mode] Compatibility with Emacs 24.x -;; version 0.2, 2010-09-20 [from puml-mode] Initialize the keywords from the -language output of plantuml.jar instead of the hard-coded way. -;; version 0.1, 2010-08-25 [from puml-mode] First version - -;;; Code: -(require 'thingatpt) -(require 'dash) -(require 'xml) - -(defgroup plantuml-mode nil - "Major mode for editing plantuml file." - :group 'languages) - -(defcustom plantuml-jar-path - (expand-file-name "~/plantuml.jar") - "The location of the PlantUML executable JAR." - :type 'string - :group 'plantuml) - -(defcustom plantuml-executable-path - "plantuml" - "The location of the PlantUML executable." - :type 'string - :group 'plantuml) - -(defvar plantuml-mode-hook nil "Standard hook for plantuml-mode.") - -(defconst plantuml-mode-version "20190905.838" "The plantuml-mode version string.") - -(defvar plantuml-mode-debug-enabled nil) - -(defvar plantuml-font-lock-keywords nil) - -(defvar plantuml-mode-map - (let ((keymap (make-sparse-keymap))) - (define-key keymap (kbd "C-c C-c") 'plantuml-preview) - keymap) - "Keymap for plantuml-mode.") - -(defcustom plantuml-java-command "java" - "The java command used to execute PlantUML." - :type 'string - :group 'plantuml) - -(defcustom plantuml-java-args (list "-Djava.awt.headless=true" "-jar" "--illegal-access=deny") - "The parameters passed to `plantuml-java-command' when executing PlantUML." - :type '(repeat string) - :group 'plantuml) - -(defcustom plantuml-jar-args (list "-charset" "UTF-8" ) - "The parameters passed to `plantuml.jar', when executing PlantUML." - :type '(repeat string) - :group 'plantuml) - -(defcustom plantuml-server-url "https://www.plantuml.com/plantuml" - "The base URL of the PlantUML server." - :type 'string - :group 'plantuml) - -(defcustom plantuml-executable-args (list "-headless") - "The parameters passed to plantuml executable when executing PlantUML." - :type '(repeat string) - :group 'plantuml) - -(defcustom plantuml-default-exec-mode 'server - "Default execution mode for PlantUML. Valid values are: -- `jar': run PlantUML as a JAR file (requires a local install of the PlantUML JAR file, see `plantuml-jar-path'" - :type 'symbol - :group 'plantuml - :options '(jar server executable)) - -(defcustom plantuml-suppress-deprecation-warning t - "To silence the deprecation warning when `puml-mode' is found upon loading." - :type 'boolean - :group 'plantuml) - -(defcustom plantuml-indent-level 8 - "Indentation level of PlantUML lines") - -(defun plantuml-jar-render-command (&rest arguments) - "Create a command line to execute PlantUML with arguments (as ARGUMENTS)." - (let* ((cmd-list (append plantuml-java-args (list (expand-file-name plantuml-jar-path)) plantuml-jar-args arguments)) - (cmd (mapconcat 'identity cmd-list "|"))) - (plantuml-debug (format "Command is [%s]" cmd)) - cmd-list)) - -;;; syntax table -(defvar plantuml-mode-syntax-table - (let ((synTable (make-syntax-table))) - (modify-syntax-entry ?\/ ". 14c" synTable) - (modify-syntax-entry ?' "< 23" synTable) - (modify-syntax-entry ?\n ">" synTable) - (modify-syntax-entry ?\r ">" synTable) - (modify-syntax-entry ?! "w" synTable) - (modify-syntax-entry ?@ "w" synTable) - (modify-syntax-entry ?# "'" synTable) - synTable) - "Syntax table for `plantuml-mode'.") - -(defvar plantuml-types nil) -(defvar plantuml-keywords nil) -(defvar plantuml-preprocessors nil) -(defvar plantuml-builtins nil) - -;; keyword completion -(defvar plantuml-kwdList nil "The plantuml keywords.") - -;; PlantUML execution mode -(defvar-local plantuml-exec-mode nil - "The Plantuml execution mode override. See `plantuml-default-exec-mode' for acceptable values.") - -(defun plantuml-set-exec-mode (mode) - "Set the execution mode MODE for PlantUML." - (interactive (let* ((completion-ignore-case t) - (supported-modes '("jar" "server" "executable"))) - (list (completing-read (format "Exec mode [%s]: " plantuml-exec-mode) - supported-modes - nil - t - nil - nil - plantuml-exec-mode)))) - (if (member mode '("jar" "server" "executable")) - (setq plantuml-exec-mode (intern mode)) - (error (concat "Unsupported mode:" mode)))) - -(defun plantuml-get-exec-mode () - "Retrieves the currently active PlantUML exec mode." - (or plantuml-exec-mode - plantuml-default-exec-mode)) - -(defun plantuml-enable-debug () - "Enables debug messages into the *PLANTUML Messages* buffer." - (interactive) - (setq plantuml-mode-debug-enabled t)) - -(defun plantuml-disable-debug () - "Stops any debug messages to be added into the *PLANTUML Messages* buffer." - (interactive) - (setq plantuml-mode-debug-enabled nil)) - -(defun plantuml-debug (msg) - "Writes msg (as MSG) into the *PLANTUML Messages* buffer without annoying the user." - (if plantuml-mode-debug-enabled - (let* ((log-buffer-name "*PLANTUML Messages*") - (log-buffer (get-buffer-create log-buffer-name))) - (save-excursion - (with-current-buffer log-buffer - (goto-char (point-max)) - (insert msg) - (insert "\n")))))) - -(defun plantuml-download-jar () - "Download the latest PlantUML JAR file and install it into `plantuml-jar-path'." - (interactive) - (if (y-or-n-p (format "Download the latest PlantUML JAR file into %s? " plantuml-jar-path)) - (if (or (not (file-exists-p plantuml-jar-path)) - (y-or-n-p (format "The PlantUML jar file already exists at %s, overwrite? " plantuml-jar-path))) - (with-current-buffer (url-retrieve-synchronously "https://search.maven.org/solrsearch/select?q=g:net.sourceforge.plantuml+AND+a:plantuml&core=gav&start=0&rows=1&wt=xml") - (mkdir (file-name-directory plantuml-jar-path) t) - (let* ((parse-tree (xml-parse-region)) - (doc (->> parse-tree - (assq 'response) - (assq 'result) - (assq 'doc))) - (strs (xml-get-children doc 'str)) - (version (->> strs - (--filter (string-equal "v" (xml-get-attribute it 'name))) - (car) - (xml-node-children) - (car)))) - (message (concat "Downloading PlantUML v" version " into " plantuml-jar-path)) - (url-copy-file (format "https://search.maven.org/remotecontent?filepath=net/sourceforge/plantuml/plantuml/%s/plantuml-%s.jar" version version) plantuml-jar-path t) - (kill-buffer))) - (message "Aborted.")) - (message "Aborted."))) - -(defun plantuml-jar-java-version () - "Inspects the Java runtime version of the configured Java command in `plantuml-java-command'." - (save-excursion - (save-match-data - (with-temp-buffer - (call-process plantuml-java-command nil t nil "-XshowSettings:properties" "-version") - (re-search-backward "java.version = \\(1.\\)?\\([[:digit:]]+\\)") - (string-to-number (match-string 2)))))) - -(defun plantuml-jar-get-language (buf) - "Retrieve the language specification from the PlantUML JAR file and paste it into BUF." - (unless (or (eq system-type 'cygwin) (file-exists-p plantuml-jar-path)) - (error "Could not find plantuml.jar at %s" plantuml-jar-path)) - (with-current-buffer buf - (let ((cmd-args (append (list plantuml-java-command nil t nil) - (plantuml-jar-render-command "-language")))) - (apply 'call-process cmd-args) - (goto-char (point-min))))) - -(defun plantuml-server-get-language (buf) - "Retrieve the language specification from the PlantUML server and paste it into BUF." - (let ((lang-url (concat plantuml-server-url "/language"))) - (with-current-buffer buf - (url-insert-file-contents lang-url)))) - -(defun plantuml-executable-get-language (buf) - "Retrieve the language specification from the PlantUML executable and paste it into BUF." - (with-current-buffer buf - (let ((cmd-args (append (list plantuml-executable-path nil t nil) (list "-language")))) - (apply 'call-process cmd-args) - (goto-char (point-min))))) - -(defun plantuml-get-language (mode buf) - "Retrieve the language spec using the preferred PlantUML execution mode MODE. Paste the result into BUF." - (let ((get-fn (pcase mode - ('jar #'plantuml-jar-get-language) - ('server #'plantuml-server-get-language) - ('executable #'plantuml-executable-get-language)))) - (if get-fn - (funcall get-fn buf) - (error "Unsupported execution mode %s" mode)))) - -(defun plantuml-init (mode) - "Initialize the keywords or builtins from the cmdline language output. Use exec mode MODE to load the language details." - (with-temp-buffer - (plantuml-get-language mode (current-buffer)) - (let ((found (search-forward ";" nil t)) - (word "") - (count 0) - (pos 0)) - (while found - (forward-char) - (setq word (current-word)) - (if (string= word "EOF") (setq found nil) - ;; else - (forward-line) - (setq count (string-to-number (current-word))) - (beginning-of-line 2) - (setq pos (point)) - (forward-line count) - (cond ((string= word "type") - (setq plantuml-types - (split-string - (buffer-substring-no-properties pos (point))))) - ((string= word "keyword") - (setq plantuml-keywords - (split-string - (buffer-substring-no-properties pos (point))))) - ((string= word "preprocessor") - (setq plantuml-preprocessors - (split-string - (buffer-substring-no-properties pos (point))))) - (t (setq plantuml-builtins - (append - plantuml-builtins - (split-string - (buffer-substring-no-properties pos (point))))))) - (setq found (search-forward ";" nil nil))))))) - -(defconst plantuml-preview-buffer "*PLANTUML Preview*") - -(defvar plantuml-output-type - (if (not (display-images-p)) - "txt" - (cond ((image-type-available-p 'svg) "svg") - ((image-type-available-p 'png) "png") - (t "txt"))) - "Specify the desired output type to use for generated diagrams.") - -(defun plantuml-read-output-type () - "Read from the minibuffer a output type." - (let* ((completion-ignore-case t) - (available-types - (append - (and (image-type-available-p 'svg) '("svg")) - (and (image-type-available-p 'png) '("png")) - '("txt")))) - (completing-read (format "Output type [%s]: " plantuml-output-type) - available-types - nil - t - nil - nil - plantuml-output-type))) - -(defun plantuml-set-output-type (type) - "Set the desired output type (as TYPE) for the current buffer. -If the -major mode of the current buffer mode is not plantuml-mode, set the -default output type for new buffers." - (interactive (list (plantuml-read-output-type))) - (setq plantuml-output-type type)) - -(defun plantuml-is-image-output-p () - "Return non-nil if the diagram output format is an image, false if it's text based." - (not (equal "txt" plantuml-output-type))) - -(defun plantuml-jar-output-type-opt (output-type) - "Create the flag to pass to PlantUML according to OUTPUT-TYPE. -Note that output type `txt' is promoted to `utxt' for better rendering." - (concat "-t" (pcase output-type - ("txt" "utxt") - (_ output-type)))) - -(defun plantuml-jar-start-process (buf) - "Run PlantUML as an Emacs process and puts the output into the given buffer (as BUF)." - (let ((java-args (if (<= 8 (plantuml-jar-java-version)) - (remove "--illegal-access=deny" plantuml-java-args) - plantuml-java-args))) - (apply #'start-process - "PLANTUML" buf plantuml-java-command - `(,@java-args - ,(expand-file-name plantuml-jar-path) - ,(plantuml-jar-output-type-opt plantuml-output-type) - ,@plantuml-jar-args - "-p")))) - -(defun plantuml-executable-start-process (buf) - "Run PlantUML as an Emacs process and puts the output into the given buffer (as BUF)." - (apply #'start-process - "PLANTUML" buf plantuml-executable-path - `(,@plantuml-executable-args - ,(plantuml-jar-output-type-opt plantuml-output-type) - "-p"))) - -(defun plantuml-update-preview-buffer (prefix buf) - "Show the preview in the preview buffer BUF. -Window is selected according to PREFIX: -- 4 (when prefixing the command with C-u) -> new window -- 16 (when prefixing the command with C-u C-u) -> new frame. -- else -> new buffer" - (let ((imagep (and (display-images-p) - (plantuml-is-image-output-p)))) - (cond - ((= prefix 16) (switch-to-buffer-other-frame buf)) - ((= prefix 4) (switch-to-buffer-other-window buf)) - (t (display-buffer buf))) - (when imagep - (with-current-buffer buf - (image-mode) - (set-buffer-multibyte t))))) - -(defun plantuml-jar-preview-string (prefix string buf) - "Preview the diagram from STRING by running the PlantUML JAR. -Put the result into buffer BUF. Window is selected according to PREFIX: -- 4 (when prefixing the command with C-u) -> new window -- 16 (when prefixing the command with C-u C-u) -> new frame. -- else -> new buffer" - (let* ((process-connection-type nil) - (ps (plantuml-jar-start-process buf))) - (process-send-string ps string) - (process-send-eof ps) - (set-process-sentinel ps - (lambda (_ps event) - (unless (equal event "finished\n") - (error "PLANTUML Preview failed: %s" event)) - (plantuml-update-preview-buffer prefix buf))))) - -(defun plantuml-server-encode-url (string) - "Encode the string STRING into a URL suitable for PlantUML server interactions." - (let* ((coding-system (or buffer-file-coding-system - "utf8")) - (encoded-string (base64-encode-string (encode-coding-string string coding-system) t))) - (concat plantuml-server-url "/" plantuml-output-type "/-base64-" encoded-string))) - -(defun plantuml-server-preview-string (prefix string buf) - "Preview the diagram from STRING as rendered by the PlantUML server. -Put the result into buffer BUF and place it according to PREFIX: -- 4 (when prefixing the command with C-u) -> new window -- 16 (when prefixing the command with C-u C-u) -> new frame. -- else -> new buffer" - (let* ((url-request-location (plantuml-server-encode-url string))) - (save-current-buffer - (save-match-data - (url-retrieve url-request-location - (lambda (status) - ;; TODO: error check - (goto-char (point-min)) - ;; skip the HTTP headers - (while (not (looking-at "\n")) - (forward-line)) - (kill-region (point-min) (+ 1 (point))) - (copy-to-buffer buf (point-min) (point-max)) - (plantuml-update-preview-buffer prefix buf))))))) - -(defun plantuml-executable-preview-string (prefix string buf) - "Preview the diagram from STRING by running the PlantUML JAR. -Put the result into buffer BUF. Window is selected according to PREFIX: -- 4 (when prefixing the command with C-u) -> new window -- 16 (when prefixing the command with C-u C-u) -> new frame. -- else -> new buffer" - (let* ((process-connection-type nil) - (ps (plantuml-executable-start-process buf))) - (process-send-string ps string) - (process-send-eof ps) - (set-process-sentinel ps - (lambda (_ps event) - (unless (equal event "finished\n") - (error "PLANTUML Preview failed: %s" event)) - (plantuml-update-preview-buffer prefix buf))))) - -(defun plantuml-exec-mode-preview-string (prefix mode string buf) - "Preview the diagram from STRING using the execution mode MODE. -Put the result into buffer BUF, selecting the window according to PREFIX: -- 4 (when prefixing the command with C-u) -> new window -- 16 (when prefixing the command with C-u C-u) -> new frame. -- else -> new buffer" - (let ((preview-fn (pcase mode - ('jar #'plantuml-jar-preview-string) - ('server #'plantuml-server-preview-string) - ('executable #'plantuml-executable-preview-string)))) - (if preview-fn - (funcall preview-fn prefix string buf) - (error "Unsupported execution mode %s" mode)))) - -(defun plantuml-preview-string (prefix string) - "Preview diagram from PlantUML sources (as STRING), using prefix (as PREFIX) -to choose where to display it." - (let ((b (get-buffer plantuml-preview-buffer))) - (when b - (kill-buffer b))) - - (let* ((imagep (and (display-images-p) - (plantuml-is-image-output-p))) - (buf (get-buffer-create plantuml-preview-buffer)) - (coding-system-for-read (and imagep 'binary)) - (coding-system-for-write (and imagep 'binary))) - (plantuml-exec-mode-preview-string prefix (plantuml-get-exec-mode) string buf))) - -(defun plantuml-preview-buffer (prefix) - "Preview diagram from the PlantUML sources in the current buffer. -Uses prefix (as PREFIX) to choose where to display it: -- 4 (when prefixing the command with C-u) -> new window -- 16 (when prefixing the command with C-u C-u) -> new frame. -- else -> new buffer" - (interactive "p") - (plantuml-preview-string prefix (buffer-string))) - -(defun plantuml-preview-region (prefix begin end) - "Preview diagram from the PlantUML sources in from BEGIN to END. -Uses the current region when called interactively. -Uses prefix (as PREFIX) to choose where to display it: -- 4 (when prefixing the command with C-u) -> new window -- 16 (when prefixing the command with C-u C-u) -> new frame. -- else -> new buffer" - (interactive "p\nr") - (plantuml-preview-string prefix (concat "@startuml\n" - (buffer-substring-no-properties - begin end) - "\n@enduml"))) - -(defun plantuml-preview-current-block (prefix) - "Preview diagram from the PlantUML sources from the previous @startuml to the next @enduml. -Uses prefix (as PREFIX) to choose where to display it: -- 4 (when prefixing the command with C-u) -> new window -- 16 (when prefixing the command with C-u C-u) -> new frame. -- else -> new buffer" - (interactive "p") - (save-restriction - (narrow-to-region - (search-backward "@startuml") (search-forward "@enduml")) - (plantuml-preview-buffer prefix))) - -(defun plantuml-preview (prefix) - "Preview diagram from the PlantUML sources. -Uses the current region if one is active, or the entire buffer otherwise. -Uses prefix (as PREFIX) to choose where to display it: -- 4 (when prefixing the command with C-u) -> new window -- 16 (when prefixing the command with C-u C-u) -> new frame. -- else -> new buffer" - (interactive "p") - (if mark-active - (plantuml-preview-region prefix (region-beginning) (region-end)) - (plantuml-preview-buffer prefix))) - -(defun plantuml-init-once (&optional mode) - "Ensure initialization only happens once. Use exec mode MODE to load the language details or by first querying `plantuml-get-exec-mode'." - (let ((mode (or mode (plantuml-get-exec-mode)))) - (unless plantuml-kwdList - (plantuml-init mode) - (defvar plantuml-types-regexp (concat "^\\s *\\(" (regexp-opt plantuml-types 'words) "\\|\\<\\(note\\s +over\\|note\\s +\\(left\\|right\\|bottom\\|top\\)\\s +\\(of\\)?\\)\\>\\|\\<\\(\\(left\\|center\\|right\\)\\s +\\(header\\|footer\\)\\)\\>\\)")) - (defvar plantuml-keywords-regexp (concat "^\\s *" (regexp-opt plantuml-keywords 'words) "\\|\\(<\\|<|\\|\\*\\|o\\)\\(\\.+\\|-+\\)\\|\\(\\.+\\|-+\\)\\(>\\||>\\|\\*\\|o\\)\\|\\.\\{2,\\}\\|-\\{2,\\}")) - (defvar plantuml-builtins-regexp (regexp-opt plantuml-builtins 'words)) - (defvar plantuml-preprocessors-regexp (concat "^\\s *" (regexp-opt plantuml-preprocessors 'words))) - - ;; Below are the regexp's for indentation. - ;; Notes: - ;; - there is some control on what it is indented by overriding some of below - ;; X-start and X-end regexp before plantuml-mode is loaded. E.g., to disable - ;; indentation on activate, you might define in your .emacs something like - ;; (setq plantuml-indent-regexp-activate-start - ;; "NEVER MATCH THIS EXPRESSION"); define _before_ load plantuml-mode! - ;; (setq plantuml-indent-regexp-activate-end - ;; "NEVER MATCH THIS EXPRESSION"); define _before_ load plantuml-mode! - ;; - due to the nature of using (context-insensitive) regexp, indentation have - ;; following limitations - ;; - commands commented out by /' ... '/ will _not_ be ignored - ;; and potentially lead to miss-indentation - ;; - you can though somewhat correct mis-indentation by adding in '-comment lines - ;; PLANTUML_MODE_INDENT_INCREASE and/or PLANTUML_MODE_INDENT_DECREASE - ;; to increase and/or decrease the level of indentation - ;; (Note: the line with the comment should not contain any text matching other indent - ;; regexp or this user-control instruction will be ignored; also at most will count - ;; per line ...) - (defvar plantuml-indent-regexp-block-start "^.*{\s*$" - "Indentation regex for all plantuml elements that might define a {} block. -Plantuml elements like skinparam, rectangle, sprite, package, etc. -The opening { has to be the last visible character in the line (whitespace -might follow).") - (defvar plantuml-indent-regexp-note-start "^\s*\\(floating\s+\\)?[hr]?note\s+\\(right\\|left\\|top\\|bottom\\|over\\)[^:]*?$" "simplyfied regex; note syntax is especially inconsistent across diagrams") - (defvar plantuml-indent-regexp-group-start "^\s*\\(alt\\|else\\|opt\\|loop\\|par\\|break\\|critical\\|group\\)\\(?:\s+.+\\|$\\)" - "Indentation regex for plantuml group elements that are defined for sequence diagrams. -Two variants for groups: keyword is either followed by whitespace and some text -or it is followed by line end.") - (defvar plantuml-indent-regexp-activate-start "^\s*activate\s+.+$") - (defvar plantuml-indent-regexp-box-start "^\s*box\s+.+$") - (defvar plantuml-indent-regexp-ref-start "^\s*ref\s+over\s+[^:]+?$") - (defvar plantuml-indent-regexp-title-start "^\s*title\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-header-start "^\s*\\(?:\\(?:center\\|left\\|right\\)\s+header\\|header\\)\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-footer-start "^\s*\\(?:\\(?:center\\|left\\|right\\)\s+footer\\|footer\\)\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-legend-start "^\s*\\(?:legend\\|legend\s+\\(?:bottom\\|top\\)\\|legend\s+\\(?:center\\|left\\|right\\)\\|legend\s+\\(?:bottom\\|top\\)\s+\\(?:center\\|left\\|right\\)\\)\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-oldif-start "^.*if\s+\".*\"\s+then\s*\\('.*\\)?$" "used in current activity diagram, sometimes already mentioned as deprecated") - (defvar plantuml-indent-regexp-newif-start "^\s*\\(?:else\\)?if\s+(.*)\s+then\s*.*$") - (defvar plantuml-indent-regexp-loop-start "^\s*\\(?:repeat\s*\\|while\s+(.*).*\\)$") - (defvar plantuml-indent-regexp-fork-start "^\s*\\(?:fork\\|split\\)\\(?:\s+again\\)?\s*$") - (defvar plantuml-indent-regexp-macro-start "^\s*!definelong.*$") - (defvar plantuml-indent-regexp-user-control-start "^.*'.*\s*PLANTUML_MODE_INDENT_INCREASE\s*.*$") - (defvar plantuml-indent-regexp-start (list plantuml-indent-regexp-block-start - plantuml-indent-regexp-group-start - plantuml-indent-regexp-activate-start - plantuml-indent-regexp-box-start - plantuml-indent-regexp-ref-start - plantuml-indent-regexp-legend-start - plantuml-indent-regexp-note-start - plantuml-indent-regexp-newif-start - plantuml-indent-regexp-loop-start - plantuml-indent-regexp-fork-start - plantuml-indent-regexp-title-start - plantuml-indent-regexp-header-start - plantuml-indent-regexp-footer-start - plantuml-indent-regexp-macro-start - plantuml-indent-regexp-oldif-start - plantuml-indent-regexp-user-control-start)) - (defvar plantuml-indent-regexp-block-end "^\s*\\(?:}\\|endif\\|else\s*.*\\|end\\)\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-note-end "^\s*\\(end\s+note\\|end[rh]note\\)\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-group-end "^\s*end\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-activate-end "^\s*deactivate\s+.+$") - (defvar plantuml-indent-regexp-box-end "^\s*end\s+box\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-ref-end "^\s*end\s+ref\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-title-end "^\s*end\s+title\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-header-end "^\s*endheader\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-footer-end "^\s*endfooter\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-legend-end "^\s*endlegend\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-oldif-end "^\s*\\(endif\\|else\\)\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-newif-end "^\s*\\(endif\\|elseif\\|else\\)\s*.*$") - (defvar plantuml-indent-regexp-loop-end "^\s*\\(repeat\s*while\\|endwhile\\)\s*.*$") - (defvar plantuml-indent-regexp-fork-end "^\s*\\(\\(fork\\|split\\)\s+again\\|end\s+\\(fork\\|split\\)\\)\s*$") - (defvar plantuml-indent-regexp-macro-end "^\s*!enddefinelong\s*\\('.*\\)?$") - (defvar plantuml-indent-regexp-user-control-end "^.*'.*\s*PLANTUML_MODE_INDENT_DECREASE\s*.*$") - (defvar plantuml-indent-regexp-end (list plantuml-indent-regexp-block-end - plantuml-indent-regexp-group-end - plantuml-indent-regexp-activate-end - plantuml-indent-regexp-box-end - plantuml-indent-regexp-ref-end - plantuml-indent-regexp-legend-end - plantuml-indent-regexp-note-end - plantuml-indent-regexp-newif-end - plantuml-indent-regexp-loop-end - plantuml-indent-regexp-fork-end - plantuml-indent-regexp-title-end - plantuml-indent-regexp-header-end - plantuml-indent-regexp-footer-end - plantuml-indent-regexp-macro-end - plantuml-indent-regexp-oldif-end - plantuml-indent-regexp-user-control-end)) - (setq plantuml-font-lock-keywords - `( - (,plantuml-types-regexp . font-lock-type-face) - (,plantuml-keywords-regexp . font-lock-keyword-face) - (,plantuml-builtins-regexp . font-lock-builtin-face) - (,plantuml-preprocessors-regexp . font-lock-preprocessor-face) - ;; note: order matters - )) - - (setq plantuml-kwdList (make-hash-table :test 'equal)) - (mapc (lambda (x) (puthash x t plantuml-kwdList)) plantuml-types) - (mapc (lambda (x) (puthash x t plantuml-kwdList)) plantuml-keywords) - (mapc (lambda (x) (puthash x t plantuml-kwdList)) plantuml-builtins) - (mapc (lambda (x) (puthash x t plantuml-kwdList)) plantuml-preprocessors) - (put 'plantuml-kwdList 'risky-local-variable t) - - ;; clear memory - (setq plantuml-types nil) - (setq plantuml-keywords nil) - (setq plantuml-builtins nil) - (setq plantuml-preprocessors nil) - (setq plantuml-types-regexp nil) - (setq plantuml-keywords-regexp nil) - (setq plantuml-builtins-regexp nil) - (setq plantuml-preprocessors-regexp nil)))) - -(defun plantuml-complete-symbol () - "Perform keyword completion on word before cursor." - (interactive) - (let ((posEnd (point)) - (meat (thing-at-point 'symbol)) - maxMatchResult) - - (when (not meat) (setq meat "")) - - (setq maxMatchResult (try-completion meat plantuml-kwdList)) - (cond ((eq maxMatchResult t)) - ((null maxMatchResult) - (message "Can't find completion for \"%s\"" meat) - (ding)) - ((not (string= meat maxMatchResult)) - (delete-region (- posEnd (length meat)) posEnd) - (insert maxMatchResult)) - (t (message "Making completion list...") - (with-output-to-temp-buffer "*Completions*" - (display-completion-list - (all-completions meat plantuml-kwdList))) - (message "Making completion list...%s" "done"))))) - - -;; indentation - - -(defun plantuml-current-block-depth () - "Trace the current block indentation level by recursively looking back line by line." - (save-excursion - (let ((relative-depth 0)) - ;; current line - (beginning-of-line) - (if (-any? 'looking-at plantuml-indent-regexp-end) - (setq relative-depth (1- relative-depth))) - - ;; from current line backwards to beginning of buffer - (while (not (bobp)) - (forward-line -1) - (if (-any? 'looking-at plantuml-indent-regexp-end) - (setq relative-depth (1- relative-depth))) - (if (-any? 'looking-at plantuml-indent-regexp-start) - (setq relative-depth (1+ relative-depth)))) - - (if (<= relative-depth 0) - 0 - relative-depth)))) - -(defun plantuml-indent-line () - "Indent the current line to its desired indentation level. -Restore point to same position in text of the line as before indentation." - (interactive) - ;; store position of point in line measured from end of line - (let ((original-position-eol (- (line-end-position) (point)))) - (save-excursion - (beginning-of-line) - (indent-line-to (* plantuml-indent-level (plantuml-current-block-depth)))) - - ;; restore position in text of line - (goto-char (- (line-end-position) original-position-eol)))) - - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.\\(plantuml\\|pum\\|plu\\)\\'" . plantuml-mode)) - -;;;###autoload -(define-derived-mode plantuml-mode prog-mode "plantuml" - "Major mode for plantuml. - -Shortcuts Command Name -\\[plantuml-complete-symbol] `plantuml-complete-symbol'" - (plantuml-init-once) - (make-local-variable 'plantuml-output-type) - (set (make-local-variable 'comment-start-skip) "\\('+\\|/'+\\)\\s *") - (set (make-local-variable 'comment-start) "/'") - (set (make-local-variable 'comment-end) "'/") - (set (make-local-variable 'comment-multi-line) t) - (set (make-local-variable 'comment-style) 'extra-line) - (set (make-local-variable 'indent-line-function) 'plantuml-indent-line) - (setq font-lock-defaults '((plantuml-font-lock-keywords) nil t))) - -(defun plantuml-deprecation-warning () - "Warns the user about the deprecation of the `puml-mode' project." - (if (and plantuml-suppress-deprecation-warning - (featurep 'puml-mode)) - (display-warning :warning - "`puml-mode' is now deprecated and no longer updated, but it's still present in your system. \ -You should move your configuration to use `plantuml-mode'. \ -See more at https://github.com/skuro/puml-mode/issues/26"))) - -(add-hook 'plantuml-mode-hook 'plantuml-deprecation-warning) - -(provide 'plantuml-mode) -;;; plantuml-mode.el ends here diff --git a/elpa/plantuml-mode-20191102.2056/plantuml-mode.elc b/elpa/plantuml-mode-20191102.2056/plantuml-mode.elc deleted file mode 100644 index 389929e994895e6f53b984f9bc3c1915d697799a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30921 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 Hefj?Z6l^Z_ diff --git a/elpa/poet-theme-20191215.201/poet-dark-monochrome-theme.el b/elpa/poet-theme-20191215.201/poet-dark-monochrome-theme.el deleted file mode 100644 index 3db55cbc..00000000 --- a/elpa/poet-theme-20191215.201/poet-dark-monochrome-theme.el +++ /dev/null @@ -1,276 +0,0 @@ -;;; poet-dark-monochrome-theme.el --- A dark monochrome theme for prose. - -;; Copyright 2018-now Kunal Bhalla - -;; Author: Kunal Bhalla -;; URL: https://github.com/kunalb/poet/ -;; Version: 2.0 - -;;; Commentary: - -;; Emacs has very good support for multiple fonts in a single -;; file. Poet uses this support to make it much more convenient to -;; write prose within Emacs, with particular attention paid to -;; org-mode and markdown-mode. Code blocks, tables, etc are -;; formatted in monospace text with the appropriate backgrounds. - -;; Theme Customizations -;; - `poet-variable-headers` -;; Enable / disable different text heights for different faces. - -;; Recommended customizations for using this theme -;; -;; - Set up the base fonts you'd like to use in Emacs before loading Poet -;; (set-face-attribute 'default nil :family "Iosevka" :height 130) -;; (set-face-attribute 'fixed-pitch nil :family "Iosevka") -;; (set-face-attribute 'variable-pitch nil :family "Baskerville") -;; On loading this theme captures the default and treats that for fixed-pitch -;; rendering. -;; -;; - Enable variable pitch mode for editing text -;; (add-hook 'text-mode-hook -;; (lambda () -;; (variable-pitch-mode 1)) -;; -;; - Some other modes I like to enable/disable -;; (olivetti-mode 1) ;; Centers text in the buffer -;; (flyspell-mode 1) ;; Catch Spelling mistakes -;; (typo-mode 1) ;; Good for symbols like em-dash -;; (blink-cursor-mode 0) ;; Reduce visual noise -;; (linum-mode 0) ;; No line numbers for prose -;; -;; - And prettier org mode bullets: -;; (setq org-bullets-bullet-list -;; '("◉" "○")) -;; (org-bullets 1) - -;;; Code: - -(defvar poet--monospace-height - (face-attribute 'fixed-pitch :height nil 'default) - "The original height stored as a defvar to stay constant across reloads.") - -(defgroup poet-theme nil - "Customizations to change the behavior of poet") - -(defcustom poet-variable-headers t - "Use varying sizes for headers in org and markdown" - :group 'poet-theme - :type 'boolean) - -(defun poet--height (multiplier) - "Returns the height as MULTIPLIER * monospace-height." - (if poet-variable-headers - (truncate (* poet--monospace-height multiplier)) - poet--monospace-height)) -(deftheme poet-dark-monochrome - "A dark monochrome prose friendly theme.") - -(let ((fg "#e4e4e4") - (bg "#0f0f0f") - (emph "#ededed") - (sep "#434343") - (hlt "#000000") - (bg-hlt "#191919") - (muted "#a9a9a9") - (meta "#e4e4e4") - (link "#d1d1d1") - (link-underline "#d1d1d1") - (vlink-underline "#fefefe") - (header "#b5b5b5") - (button "#a9a9a9") - (glyph "#e7e7e7") - (cursor "#dddddd") - (paren-match-bg "#8a8a8a") - (paren-match-fg "#fefefe") - (search-fg "#fefefe") - (search-bg "#9d9d9d") - (search-fail-bg "#d8d8d8") - (tooltip-fg "#101010") - (tooltip-bg "#b9b9b9") - (shadow "#989898") - (secondary-bg "#000000") - (trailing-bg "#b1b1b1") - (fci "#dddddd") - (lazy-hlt-fg "#000000") - (lazy-hlt-bg "#fefefe") - (evil-rep-fg "#fefefe") - (evil-rep-bg "#3d3d3d") - (mode-line-fg "#d7d7d7") - (header-line-bg "#101010") - (mode-line-hlt "#000000") - (mode-line-inactive "#878787") - (error "#979797") - (builtin "#838383") - (string "#dcdcdc") - (function-name "#9d9d9d") - (keyword "#b4b4b4") - (constant "#a9a9a9") - (type "#b9b9b9") - (variable "#b9b9b9") - (org-meta "#b8b8b8") - (org-document-info "#b8b8b8") - (org-table "#161616") - (org-quote-fg "#efefef") - (org-quote-bg "#161616") - (org-date "#b8b8b8") - (org-title "#929292") - (org-title-underline "#929292") - (org-checkbox "#989898") - (org-scheduled "#dcdcdc") - (org-scheduled-today "#fefefe") - (org-done "#717171") - (org-todo "#7f7f7f") - (org-tag "#a9a9a9") - (org-block-line "#060606") - (org-block-bg "#161616") - (org-agenda-structure-fg "#a9a9a9") - (org-agenda-structure-bg "#101010") - (org-agenda-today-fg "#dcdcdc") - (org-agenda-today-bg "#000000") - (org-special-keyword "#767676") - (org-sched-prev "#d9d9d9") - (org-agenda-done "#bebebe") - (hl-line "#1e1e1e") - (linum-hlt "#bababa") - (linum "#545454") - (markdown-markup "#777777") - (markdown-metadata "#767676") - (markdown-language "#afafaf") - (markdown-list "#fefefe") - (markdown-code-bg "#161616") - (markdown-pre-bg "#161616") - (markdown-header-delimiter "#777777") - (imenu "#b5b5b5")) - (custom-theme-set-faces 'poet-dark-monochrome - `(variable-pitch ((t (:family ,(face-attribute 'variable-pitch :family) :height (lambda (_x) (poet--height 1.23)))))) - `(default ((t (:background ,bg :foreground ,fg)))) - `(italic ((t (:foreground ,emph :slant italic)))) - `(highlight ((t (:background ,hlt :overline nil)))) - `(region ((t (:background ,bg-hlt)))) - `(fringe ((t (:background ,bg)))) - `(button ((t (:inherit default :foreground ,button)))) - `(escape-glyph ((t (:foreground ,glyph)))) - `(link ((t (:underline (:color ,link-underline :style line) :foreground ,link)))) - `(link-visited ((t (:inherit link :foreground ,link :underline (:color ,vlink-underline :style line))))) - `(cursor ((t (:background ,cursor)))) - `(show-paren-match ((t (:background ,paren-match-fg :foreground ,paren-match-bg)))) - `(isearch ((t (:foreground ,search-fg :background ,search-bg)))) - `(isearch-fail ((t (:background ,search-fail-bg)))) - `(query-replace ((t (:inherit isearch)))) - `(tooltip ((t (:inherit default :foreground ,tooltip-fg :background ,tooltip-bg)))) - `(shadow ((t (:foreground ,shadow)))) - `(secondary-selection ((t (:background ,secondary-bg)))) - `(trailing-whitespace ((t (:background ,trailing-bg)))) - `(lazy-highlight ((t (:foreground ,lazy-hlt-fg :background ,lazy-hlt-bg)))) - `(next-error ((t (:inherit region)))) - `(window-divider ((t (:background ,sep :foreground ,sep)))) - `(vertical-border ((t (:background ,sep :foreground ,sep)))) - `(evil-ex-substitute-replacement ((t (:foreground ,evil-rep-fg :background ,evil-rep-bg :underline nil)))) - `(minibuffer-prompt ((t (:inherit fixed-pitch :weight bold :foreground ,meta)))) - `(mode-line ((t (:inherit fixed-pitch :foreground ,mode-line-fg :background ,bg :overline ,sep :box (:line-width 3 :color ,bg))))) - `(header-line ((t (:overline nil :background ,header-line-bg :box (:line-width 3 :color ,header-line-bg) :underline ,sep :inherit mode-line)))) - `(mode-line-buffer-id ((t (:weight bold)))) - `(mode-line-emphasis ((t (:weight bold)))) - `(mode-line-highlight ((t (:background ,mode-line-hlt)))) - `(mode-line-inactive ((t (:inherit mode-line :background ,bg :foreground ,mode-line-inactive :box (:color ,bg :line-width 3))))) - `(error ((t (:foreground ,error :inherit fixed-pitch)))) - `(font-lock-comment-face ((t (:foreground ,muted :inherit fixed-pitch)))) - `(font-lock-builtin-face ((t (:foreground ,builtin :inherit fixed-pitch)))) - `(font-lock-string-face ((t (:inherit fixed-pitch :foreground ,string)))) - `(font-lock-function-name-face ((t (:inherit fixed-pitch :foreground ,function-name)))) - `(font-lock-keyword-face ((t (:inherit fixed-pitch :foreground ,keyword)))) - `(font-lock-comment-delimiter-face ((t (:inherit fixed-pitch :inherit font-lock-comment-face)))) - `(font-lock-constant-face ((t (:inherit fixed-pitch :foreground ,constant)))) - `(font-lock-doc-face ((t (:inherit fixed-pitch :inherit font-lock-string-face)))) - `(font-lock-preprocessor-face ((t (:inherit fixed-pitch :inherit font-lock-builtin-face)))) - `(font-lock-regexp-grouping-backslash ((t (:inherit fixed-pitch :inherit bold)))) - `(font-lock-regexp-grouping-construct ((t (:inherit fixed-pitch :inherit bold)))) - `(font-lock-type-face ((t (:foreground ,type :inherit fixed-pitch)))) - `(font-lock-variable-name-face ((t (:inherit fixed-pitch :foreground ,variable)))) - `(font-lock-warning-face ((t (:inherit error)))) - `(org-level-1 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.5)))))) - `(org-level-2 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.4)))))) - `(org-level-3 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.3)))))) - `(org-level-4 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-5 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-6 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-7 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-8 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-meta-line ((t (:inherit fixed-pitch :foreground ,org-meta)))) - `(org-document-info-keyword ((t (:inherit fixed-pitch :foreground ,org-document-info)))) - `(org-document-info ((t (:inherit default :foreground ,org-document-info)))) - `(org-verbatim ((t (:inherit fixed-pitch)))) - `(org-code ((t (:inherit fixed-pitch)))) - `(org-table ((t (:inherit fixed-pitch :background ,org-table)))) - `(org-formula ((t (:inherit org-table :height (lambda (_x) (poet--height 1)))))) - `(org-verse ((t (:inherit default :foreground ,org-quote-fg :background ,org-quote-bg)))) - `(org-quote ((t (:inherit default :foreground ,org-quote-fg :background ,org-quote-bg)))) - `(org-hide ((t (:inherit fixed-pitch :foreground ,bg)))) - `(org-indent ((t (:inherit org-hide)))) - `(org-date ((t (:inherit fixed-pitch :foreground ,org-date :underline nil)))) - `(org-document-title ((t (:inherit default :foreground ,org-title :height (lambda (_x) (poet--height 1.8)) :underline (:color ,org-title-underline))))) - `(org-checkbox ((t (:inherit fixed-pitch :weight bold :foreground ,org-checkbox)))) - `(org-done ((t (:inherit fixed-pitch :foreground ,org-done)))) - `(org-todo ((t (:inherit fixed-pitch :foreground ,org-todo)))) - `(org-tag ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,org-tag)))) - `(org-block-begin-line ((t (:inherit fixed-pitch :background ,org-block-line)))) - `(org-block-end-line ((t (:inherit fixed-pitch :background ,org-block-line)))) - `(org-block ((t (:background ,org-block-bg :inherit fixed-pitch)))) - `(org-priority ((t (:inherit fixed-pitch :weight normal)))) - `(org-agenda-structure ((t (:foreground ,org-agenda-structure-fg :background ,bg :box (:line-width 3 :color ,bg) :underline ,org-agenda-structure-bg)))) - `(org-scheduled ((t (:foreground ,org-scheduled)))) - `(org-scheduled-today ((t (:foreground ,org-scheduled-today)))) - `(org-agenda-date-weekend ((t (:inherit org-agenda-structure)))) - `(org-agenda-date-today ((t (:box (:line-width 3 :color ,org-agenda-today-bg) :foreground ,org-agenda-today-fg :background ,org-agenda-today-bg)))) - `(org-special-keyword ((t (:inherit fixed-pitch :foreground ,org-special-keyword)))) - `(org-scheduled-previously ((t (:foreground ,org-sched-prev)))) - `(org-agenda-done ((t (:foreground ,org-agenda-done)))) - `(org-footnote ((t (:foreground ,link)))) - `(hl-line ((t (:background ,hl-line)))) - `(linum-highlight-face ((t (:inherit fixed-pitch :foreground ,linum-hlt)))) - `(linum ((t (:inherit fixed-pitch :foreground ,linum)))) - `(line-number ((t (:inherit fixed-pitch :foreground ,linum)))) - `(line-number-current-line ((t (:inherit fixed-pitch :foreground ,linum-hlt)))) - `(markdown-header-face-1 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.5)))))) - `(markdown-header-face-2 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.4)))))) - `(markdown-header-face-3 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.3)))))) - `(markdown-header-face-4 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-5 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-6 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-7 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-8 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-markup-face ((t (:inherit fixed-pitch :foreground ,markdown-markup)))) - `(markdown-inline-code-face ((t (:inherit fixed-pitch)))) - `(markdown-metadata-key-face ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,markdown-metadata)))) - `(markdown-metadata-value-face ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,fg)))) - `(markdown-language-keyword-face ((t (:foreground ,markdown-language)))) - `(markdown-list-face ((t (:inherit fixed-pitch :foreground ,markdown-list)))) - `(markdown-code-face ((t (:inherit fixed-pitch :foreground ,fg :background ,markdown-code-bg)))) - `(markdown-pre-face ((t (:inherit fixed-pitch :color ,fg :background ,markdown-pre-bg)))) - `(markdown-header-delimiter-face ((t (:inherit fixed-pitch :foreground ,markdown-header-delimiter)))) - `(markdown-header-rule-face ((t (:inherit fixed-pitch :foreground ,markdown-header-delimiter)))) - `(markdown-url-face ((t (:inherit fixed-pitch :foreground ,link)))) - `(imenu-list-entry-face-0 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-1 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-2 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-3 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-4 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-5 ((t (:foreground ,imenu)))) - `(helm-source-header ((t (:height (lambda (_x) (poet--height 1)))))) - `(ein:cell-input-area ((t (:background ,org-block-bg)))) - `(ein:cell-input-prompt ((t (:foreground ,org-tag :background ,bg)))) - `(ein:cell-output-prompt ((t (:foreground ,org-tag :background ,bg))))) - (custom-theme-set-variables 'poet-dark-monochrome - '(line-spacing .2) - `(fci-rule-color ,fci))) - -;;;###autoload -(when (and (boundp 'custom-theme-load-path) - load-file-name) - (add-to-list 'custom-theme-load-path - (file-name-as-directory - (file-name-directory load-file-name)))) - -(provide-theme 'poet-dark-monochrome) -;;; poet-dark-monochrome-theme ends here diff --git a/elpa/poet-theme-20191215.201/poet-dark-monochrome-theme.elc b/elpa/poet-theme-20191215.201/poet-dark-monochrome-theme.elc deleted file mode 100644 index fc72ef1b38a25f15a3e1fbbc190c01beea5704b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11401 zcmb_i`*-8EvG(3Rl59_P@9q1EBHo_H?kRoDha}tiCD~W9?dG-Fq)no2N|BJonj#gF zve(;g`>*$#0YE~O?RB;>j%08!FU$-E;6QKQdwA!kTU%Q<-+c2;d8b?~vs|V8kQMUY zB2H>~s;W9G3mJ^|0vXQ^G4Q9S;1s+En}Ig*=Y>@OF-juG7tV2uxe73buBAJQ?K`a zb92XFE=$#T-l8nZdKo9mGdy=@^bj}j&2-f$`Nk}Js#0&6HOX8a8Kff1_D%!S3$Oo#}a_yrfK(+@6H{`}p|y1o(uvCV@|Y2%jN7BYeh_kYPab=@b0! zl}WHa-j-h^D@^pD)@UIpJrtx z%NY}H%N|b{EQ_azOlE7JUZDXjwOZIBCbx- z@~qgFM_SXP=6nei$}(4R@kAc%!i~d7K2pu9D!?218DqkI?|t&{@q-T^KDhTt{$BQ7 zVtf|o88F|_ZZo8}zSvp71=*5fcUNw|3fqN~Vhe^1Uz-$PzD~A$%^39JNosz5nX+Rm zn`%`gaigBd(75_w6z)FR@U`Pk-#5PY;dnp92R`@Vb00`Pd>$YUXe{s%6YzULec%y1 z0B!)>0JwnbanOVq3xOK~Hzb}I4-GE$Ep7VO|qsaUR zZ3LQ#{)2Zk)^L)?w4fh?*N}9k|9B=`>XSUeA(=zq4?#b~*pQwfa|E0baA<5qdT3gf zPw*i8+0TFR%U}Ikyd~Zix5XWCSKJf##XI6%@j(1h{7F0%?}_)t2jWBVk$5CN7LUaz z;#2Ww@fY!#_*{G;CKK^Q{8fA@{w88E6^TfN5;Jiu<{}e+7bhYY3sHztEX7x%618Z= zN}P%_@l>3PXW}2?pW?arm-x3p!0gkPPhSCjh4dBC7bY~q1Zd%oFu@T$V}c|5JepwL zkN0oizI*2`I+z!sjDrC&KqsWm@V*{33^Wj2$3sg;EL%D-8ISb{lmh)25#9~&-z9E5 z;_t7GM0Vs{gEfwi2T}}T&sh--4lHRncxvgMyL91}5fW_;{%N|yt=qSm({qQ@$fbfb z@Fzx)_uP=Vto~tOV`3Ey$KN%xIkWl%gEOnoBnX@tu9)X(Cpn<0v0=hNgTY`>JA>^6 zgF)pmw7LXQPi|*Pp(%ou&AzLt*1^Y}d)yVvntJ#;tS0!4o~>F`2bB$@tP( z=QTFz#EqdBD?c`Cww=4p5zlxW2R;bsMBwn(3x+;^(8KTBwvWHQTyc(k0sm2t{|ofT z{;{S%`GE4qW%KoW`ePAYjo;JXe}VpfPk+C!|5`|W(RvIAlAa=Kh@V@;&wE(b+${o* zB_^48(WabHO81NZk`Juu$)lh&U6fi(Y~6#~R7 zT(pj8Vw>n6YP-S)PBNiAgmt5x&hF-aVtIhuJ=Gfi%3aiMcz<*q^Qhzc$ZlpIb+C^t z499#U1n&rXoF{Lg!NsEAz0Y=hzzV7Qu4ON!t2eIna4%!=T;|z!a*w+936L?eFg^)CophY zXyd^mxTgcWf^8zWrvtp3Z6K_j4)DUZiLj=_Xj6yLnhthvCyy8 zrb#>d+Gez7u(vxG(9X{b1^fLa6g=FnaXtw^ueaQ&M4Vo_bbI6!K_G`vY?a*`%+?J% zq3_#pyP-j>c|X)AGdqR z^e1R1bS~LS1m=N?D3J9~VuNc~zncc@fal_}gzw!sdFO#YQbw$yt@D zBF)dK2)Iyt+j9Gsil|XgA|Q={ysJ8O%JIt-oYUn!~7{4^}>`I_0lml>K%-! zQSWd}jbY&d8sjA?8ug|THSQfu(WvK-s8Nrn!PYnos1a=JQ{&!jj7Giv5jBR5#%R>z z39-&oMU7y-qDH-GOpSWOh#K|A{71cbMy)Lvv!lEk1#_y7;|9bOj!jv-kw-IJYQUqt z;`xp(nD6BAVw%Qs=gX(4m+P9Vsp0y2LAblSO9gx?r^};hoSaY%8CB&YRGXFQXALUA ziQGA=5vGmQkGpb?n}D2e19px|TxaB2!L{+-F02=-iPN}=9SGtQ)pX#l7W&(pL-aiN zm>flI56hrPV=pbij-KmePS*gHI@OO$m1J@5ov8D(vPv0dNSZQ@&uNu8Y&2}P2E+Bw zDnT`zSEPg6!43X2FOw6?P(QS4HnHXj0VNAuS9pcXE02Y1t!WYj<0m{MC)4sNKQvjB zD-T9DCM1Ozrn#d2&7H4SCGI!OLvSOx{A`i4dBl%{ay`Zrc zoT182_hugM#}qDc=x$6-R~gFtg;Z6Adxr(3FPb_yWGMZ|8RQ+)SgoKk5*oX74R3MNE`LXK(Wr-`D!dt|+RPuU{z)MzDjp-ie=gT=v&@{Mg)ORlO6zZHfZo1%6 zvb7huyh`Qt*aS8%%hXb;1u?|jFjZWKd2}tQ?TuwdSDHx8bbEA^6?0W(jZ}3KFLC+A znjCe}ag>xfG{j@kd3ke7mBl)s*pr*t=!<& z*ST0c(>I#aGRIw-4O`h|v?E%lM`UO3EK70S9GZyG8H+9hJ5#j`kZaq%XQXHF4I9=G z$rE-^DNf=V_tqCnaDqt>c_|?&A6od4cm;QZ6`2(3bIHY?BCh|9LUC&K?@M zlem^)`hzA7837%URkJ-^8H}~qbf(y?olPDzRW`Ldr0=OWv4dlmuIIfae4&{ri>rcWsDpMb1~{GYL}(Ap)v3xoAE9cFIai*5hM?o^Rg(qRB#YL`a6Nr3 zX?)!3l#H%PrjKbI-S8#pMlVS>eo4B6uT4iAXm=7^JI=HRz8x|IHiapE?6bH$EOlfP zF8?NEeYbJeLx+bWFMfQ0qw-pG5eI$3x{iy9n~5m;g^zP|<0zYBN0U4O>~XwXZO9@N z=CQGnktVH4^a=4gD(&IdG4iTKVDvSIT^vV>&IKBX19=Yw&)VaGYfC-1Wrg3qWX*Zc zk`AIgGJ9YFo5y);Gjot{58|4ieIvk8*gI3|1nTrylWF?2eWrL3Q5T)a`PCvTS2fFT9ea{juIC8e^LV#&GfLY9=~UW%p8dl&Mg6!=Z^r1bbr^Q6@IP4lF*`c3d8 z!>*QQM{TW~6&%)Fu)1Kgbrvx%u$Iog>r13LSzHTM_RzU6$$Y6<;8IS5_oV4 zJiG)RT>{5)nX7!^)#a+-Jh{IY;Eg58JT|d@<(*PtYH2H^ng_p2FJt-{ diff --git a/elpa/poet-theme-20191215.201/poet-dark-theme.el b/elpa/poet-theme-20191215.201/poet-dark-theme.el deleted file mode 100644 index d62650c5..00000000 --- a/elpa/poet-theme-20191215.201/poet-dark-theme.el +++ /dev/null @@ -1,276 +0,0 @@ -;;; poet-dark-theme.el --- A dark theme for prose. - -;; Copyright 2018-now Kunal Bhalla - -;; Author: Kunal Bhalla -;; URL: https://github.com/kunalb/poet/ -;; Version: 2.0 - -;;; Commentary: - -;; Emacs has very good support for multiple fonts in a single -;; file. Poet uses this support to make it much more convenient to -;; write prose within Emacs, with particular attention paid to -;; org-mode and markdown-mode. Code blocks, tables, etc are -;; formatted in monospace text with the appropriate backgrounds. - -;; Theme Customizations -;; - `poet-variable-headers` -;; Enable / disable different text heights for different faces. - -;; Recommended customizations for using this theme -;; -;; - Set up the base fonts you'd like to use in Emacs before loading Poet -;; (set-face-attribute 'default nil :family "Iosevka" :height 130) -;; (set-face-attribute 'fixed-pitch nil :family "Iosevka") -;; (set-face-attribute 'variable-pitch nil :family "Baskerville") -;; On loading this theme captures the default and treats that for fixed-pitch -;; rendering. -;; -;; - Enable variable pitch mode for editing text -;; (add-hook 'text-mode-hook -;; (lambda () -;; (variable-pitch-mode 1)) -;; -;; - Some other modes I like to enable/disable -;; (olivetti-mode 1) ;; Centers text in the buffer -;; (flyspell-mode 1) ;; Catch Spelling mistakes -;; (typo-mode 1) ;; Good for symbols like em-dash -;; (blink-cursor-mode 0) ;; Reduce visual noise -;; (linum-mode 0) ;; No line numbers for prose -;; -;; - And prettier org mode bullets: -;; (setq org-bullets-bullet-list -;; '("◉" "○")) -;; (org-bullets 1) - -;;; Code: - -(defvar poet--monospace-height - (face-attribute 'fixed-pitch :height nil 'default) - "The original height stored as a defvar to stay constant across reloads.") - -(defgroup poet-theme nil - "Customizations to change the behavior of poet") - -(defcustom poet-variable-headers t - "Use varying sizes for headers in org and markdown" - :group 'poet-theme - :type 'boolean) - -(defun poet--height (multiplier) - "Returns the height as MULTIPLIER * monospace-height." - (if poet-variable-headers - (truncate (* poet--monospace-height multiplier)) - poet--monospace-height)) -(deftheme poet-dark - "A prose friendly dark theme.") - -(let ((fg "#EDE7dd") - (bg "#181008") - (emph "#eeeeee") - (sep "#444444") - (hlt "#000000") - (bg-hlt "#012c32") - (muted "#aaaaaa") - (meta "#ede7dd") - (link "#ffdba5") - (link-underline "#ffdba5") - (vlink-underline "#ffffff") - (header "#ceb39e") - (button "#aaaaaa") - (glyph "#f7ffd1") - (cursor "#FFD5BE") - (paren-match-bg "#ff1744") - (paren-match-fg "#ffffff") - (search-fg "#ffffff") - (search-bg "#fb6542") - (search-fail-bg "#f8bbd0") - (tooltip-fg "#111111") - (tooltip-bg "#fff176") - (shadow "#999999") - (secondary-bg "#000000") - (trailing-bg "#ff8a65") - (fci "#dedede") - (lazy-hlt-fg "#000000") - (lazy-hlt-bg "#ffffff") - (evil-rep-fg "#ffffff") - (evil-rep-bg "#4e342e") - (mode-line-fg "#edd3c4") - (header-line-bg "#111111") - (mode-line-hlt "#000000") - (mode-line-inactive "#888888") - (error "#df5286") - (builtin "#b85750") - (string "#dddddd") - (function-name "#80bd9e") - (keyword "#c1caa1") - (constant "#90afc5") - (type "#cfa6a8") - (variable "#ffa575") - (org-meta "#c6b6ad") - (org-document-info "#c6b6ad") - (org-table "#171716") - (org-quote-fg "#e6e6fa") - (org-quote-bg "#171716") - (org-date "#c6b6ad") - (org-title "#ee7e38") - (org-title-underline "#ee7e38") - (org-checkbox "#999999") - (org-scheduled "#dddddd") - (org-scheduled-today "#ffffff") - (org-done "#5EE300") - (org-todo "#FF3D00") - (org-tag "#aaaaaa") - (org-block-line "#070706") - (org-block-bg "#171716") - (org-agenda-structure-fg "#aaaaaa") - (org-agenda-structure-bg "#111111") - (org-agenda-today-fg "#dddddd") - (org-agenda-today-bg "#000000") - (org-special-keyword "#777777") - (org-sched-prev "#ffb6c1") - (org-agenda-done "#b9ccb2") - (hl-line "#3d0000") - (linum-hlt "#bbbbbb") - (linum "#555555") - (markdown-markup "#8D6E63") - (markdown-metadata "#777777") - (markdown-language "#BE8CD4") - (markdown-list "#ffffff") - (markdown-code-bg "#171716") - (markdown-pre-bg "#171716") - (markdown-header-delimiter "#8D6E63") - (imenu "#ceb39e")) - (custom-theme-set-faces 'poet-dark - `(variable-pitch ((t (:family ,(face-attribute 'variable-pitch :family) :height (lambda (_x) (poet--height 1.23)))))) - `(default ((t (:background ,bg :foreground ,fg)))) - `(italic ((t (:foreground ,emph :slant italic)))) - `(highlight ((t (:background ,hlt :overline nil)))) - `(region ((t (:background ,bg-hlt)))) - `(fringe ((t (:background ,bg)))) - `(button ((t (:inherit default :foreground ,button)))) - `(escape-glyph ((t (:foreground ,glyph)))) - `(link ((t (:underline (:color ,link-underline :style line) :foreground ,link)))) - `(link-visited ((t (:inherit link :foreground ,link :underline (:color ,vlink-underline :style line))))) - `(cursor ((t (:background ,cursor)))) - `(show-paren-match ((t (:background ,paren-match-fg :foreground ,paren-match-bg)))) - `(isearch ((t (:foreground ,search-fg :background ,search-bg)))) - `(isearch-fail ((t (:background ,search-fail-bg)))) - `(query-replace ((t (:inherit isearch)))) - `(tooltip ((t (:inherit default :foreground ,tooltip-fg :background ,tooltip-bg)))) - `(shadow ((t (:foreground ,shadow)))) - `(secondary-selection ((t (:background ,secondary-bg)))) - `(trailing-whitespace ((t (:background ,trailing-bg)))) - `(lazy-highlight ((t (:foreground ,lazy-hlt-fg :background ,lazy-hlt-bg)))) - `(next-error ((t (:inherit region)))) - `(window-divider ((t (:background ,sep :foreground ,sep)))) - `(vertical-border ((t (:background ,sep :foreground ,sep)))) - `(evil-ex-substitute-replacement ((t (:foreground ,evil-rep-fg :background ,evil-rep-bg :underline nil)))) - `(minibuffer-prompt ((t (:inherit fixed-pitch :weight bold :foreground ,meta)))) - `(mode-line ((t (:inherit fixed-pitch :foreground ,mode-line-fg :background ,bg :overline ,sep :box (:line-width 3 :color ,bg))))) - `(header-line ((t (:overline nil :background ,header-line-bg :box (:line-width 3 :color ,header-line-bg) :underline ,sep :inherit mode-line)))) - `(mode-line-buffer-id ((t (:weight bold)))) - `(mode-line-emphasis ((t (:weight bold)))) - `(mode-line-highlight ((t (:background ,mode-line-hlt)))) - `(mode-line-inactive ((t (:inherit mode-line :background ,bg :foreground ,mode-line-inactive :box (:color ,bg :line-width 3))))) - `(error ((t (:foreground ,error :inherit fixed-pitch)))) - `(font-lock-comment-face ((t (:foreground ,muted :inherit fixed-pitch)))) - `(font-lock-builtin-face ((t (:foreground ,builtin :inherit fixed-pitch)))) - `(font-lock-string-face ((t (:inherit fixed-pitch :foreground ,string)))) - `(font-lock-function-name-face ((t (:inherit fixed-pitch :foreground ,function-name)))) - `(font-lock-keyword-face ((t (:inherit fixed-pitch :foreground ,keyword)))) - `(font-lock-comment-delimiter-face ((t (:inherit fixed-pitch :inherit font-lock-comment-face)))) - `(font-lock-constant-face ((t (:inherit fixed-pitch :foreground ,constant)))) - `(font-lock-doc-face ((t (:inherit fixed-pitch :inherit font-lock-string-face)))) - `(font-lock-preprocessor-face ((t (:inherit fixed-pitch :inherit font-lock-builtin-face)))) - `(font-lock-regexp-grouping-backslash ((t (:inherit fixed-pitch :inherit bold)))) - `(font-lock-regexp-grouping-construct ((t (:inherit fixed-pitch :inherit bold)))) - `(font-lock-type-face ((t (:foreground ,type :inherit fixed-pitch)))) - `(font-lock-variable-name-face ((t (:inherit fixed-pitch :foreground ,variable)))) - `(font-lock-warning-face ((t (:inherit error)))) - `(org-level-1 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.5)))))) - `(org-level-2 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.4)))))) - `(org-level-3 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.3)))))) - `(org-level-4 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-5 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-6 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-7 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-8 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-meta-line ((t (:inherit fixed-pitch :foreground ,org-meta)))) - `(org-document-info-keyword ((t (:inherit fixed-pitch :foreground ,org-document-info)))) - `(org-document-info ((t (:inherit default :foreground ,org-document-info)))) - `(org-verbatim ((t (:inherit fixed-pitch)))) - `(org-code ((t (:inherit fixed-pitch)))) - `(org-table ((t (:inherit fixed-pitch :background ,org-table)))) - `(org-formula ((t (:inherit org-table :height (lambda (_x) (poet--height 1)))))) - `(org-verse ((t (:inherit default :foreground ,org-quote-fg :background ,org-quote-bg)))) - `(org-quote ((t (:inherit default :foreground ,org-quote-fg :background ,org-quote-bg)))) - `(org-hide ((t (:inherit fixed-pitch :foreground ,bg)))) - `(org-indent ((t (:inherit org-hide)))) - `(org-date ((t (:inherit fixed-pitch :foreground ,org-date :underline nil)))) - `(org-document-title ((t (:inherit default :foreground ,org-title :height (lambda (_x) (poet--height 1.8)) :underline (:color ,org-title-underline))))) - `(org-checkbox ((t (:inherit fixed-pitch :weight bold :foreground ,org-checkbox)))) - `(org-done ((t (:inherit fixed-pitch :foreground ,org-done)))) - `(org-todo ((t (:inherit fixed-pitch :foreground ,org-todo)))) - `(org-tag ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,org-tag)))) - `(org-block-begin-line ((t (:inherit fixed-pitch :background ,org-block-line)))) - `(org-block-end-line ((t (:inherit fixed-pitch :background ,org-block-line)))) - `(org-block ((t (:background ,org-block-bg :inherit fixed-pitch)))) - `(org-priority ((t (:inherit fixed-pitch :weight normal)))) - `(org-agenda-structure ((t (:foreground ,org-agenda-structure-fg :background ,bg :box (:line-width 3 :color ,bg) :underline ,org-agenda-structure-bg)))) - `(org-scheduled ((t (:foreground ,org-scheduled)))) - `(org-scheduled-today ((t (:foreground ,org-scheduled-today)))) - `(org-agenda-date-weekend ((t (:inherit org-agenda-structure)))) - `(org-agenda-date-today ((t (:box (:line-width 3 :color ,org-agenda-today-bg) :foreground ,org-agenda-today-fg :background ,org-agenda-today-bg)))) - `(org-special-keyword ((t (:inherit fixed-pitch :foreground ,org-special-keyword)))) - `(org-scheduled-previously ((t (:foreground ,org-sched-prev)))) - `(org-agenda-done ((t (:foreground ,org-agenda-done)))) - `(org-footnote ((t (:foreground ,link)))) - `(hl-line ((t (:background ,hl-line)))) - `(linum-highlight-face ((t (:inherit fixed-pitch :foreground ,linum-hlt)))) - `(linum ((t (:inherit fixed-pitch :foreground ,linum)))) - `(line-number ((t (:inherit fixed-pitch :foreground ,linum)))) - `(line-number-current-line ((t (:inherit fixed-pitch :foreground ,linum-hlt)))) - `(markdown-header-face-1 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.5)))))) - `(markdown-header-face-2 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.4)))))) - `(markdown-header-face-3 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.3)))))) - `(markdown-header-face-4 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-5 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-6 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-7 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-8 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-markup-face ((t (:inherit fixed-pitch :foreground ,markdown-markup)))) - `(markdown-inline-code-face ((t (:inherit fixed-pitch)))) - `(markdown-metadata-key-face ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,markdown-metadata)))) - `(markdown-metadata-value-face ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,fg)))) - `(markdown-language-keyword-face ((t (:foreground ,markdown-language)))) - `(markdown-list-face ((t (:inherit fixed-pitch :foreground ,markdown-list)))) - `(markdown-code-face ((t (:inherit fixed-pitch :foreground ,fg :background ,markdown-code-bg)))) - `(markdown-pre-face ((t (:inherit fixed-pitch :color ,fg :background ,markdown-pre-bg)))) - `(markdown-header-delimiter-face ((t (:inherit fixed-pitch :foreground ,markdown-header-delimiter)))) - `(markdown-header-rule-face ((t (:inherit fixed-pitch :foreground ,markdown-header-delimiter)))) - `(markdown-url-face ((t (:inherit fixed-pitch :foreground ,link)))) - `(imenu-list-entry-face-0 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-1 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-2 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-3 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-4 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-5 ((t (:foreground ,imenu)))) - `(helm-source-header ((t (:height (lambda (_x) (poet--height 1)))))) - `(ein:cell-input-area ((t (:background ,org-block-bg)))) - `(ein:cell-input-prompt ((t (:foreground ,org-tag :background ,bg)))) - `(ein:cell-output-prompt ((t (:foreground ,org-tag :background ,bg))))) - (custom-theme-set-variables 'poet-dark - '(line-spacing .2) - `(fci-rule-color ,fci))) - -;;;###autoload -(when (and (boundp 'custom-theme-load-path) - load-file-name) - (add-to-list 'custom-theme-load-path - (file-name-as-directory - (file-name-directory load-file-name)))) - -(provide-theme 'poet-dark) -;;; poet-dark-theme.el ends here diff --git a/elpa/poet-theme-20191215.201/poet-dark-theme.elc b/elpa/poet-theme-20191215.201/poet-dark-theme.elc deleted file mode 100644 index 9b77988f8fc753e0addd973f406f4a434560fef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12010 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 aS>cMz9Nw)y2u7z&b<_G>jJ;s@&i?}`EKn@~ diff --git a/elpa/poet-theme-20191215.201/poet-monochrome-theme.el b/elpa/poet-theme-20191215.201/poet-monochrome-theme.el deleted file mode 100644 index a3b0297a..00000000 --- a/elpa/poet-theme-20191215.201/poet-monochrome-theme.el +++ /dev/null @@ -1,276 +0,0 @@ -;;; poet-monochrome-theme.el --- A monochrome theme for prose. - -;; Copyright 2018-now Kunal Bhalla - -;; Author: Kunal Bhalla -;; URL: https://github.com/kunalb/poet/ -;; Version: 2.0 - -;;; Commentary: - -;; Emacs has very good support for multiple fonts in a single -;; file. Poet uses this support to make it much more convenient to -;; write prose within Emacs, with particular attention paid to -;; org-mode and markdown-mode. Code blocks, tables, etc are -;; formatted in monospace text with the appropriate backgrounds. - -;; Theme Customizations -;; - `poet-variable-headers` -;; Enable / disable different text heights for different faces. - -;; Recommended customizations for using this theme -;; -;; - Set up the base fonts you'd like to use in Emacs before loading Poet -;; (set-face-attribute 'default nil :family "Iosevka" :height 130) -;; (set-face-attribute 'fixed-pitch nil :family "Iosevka") -;; (set-face-attribute 'variable-pitch nil :family "Baskerville") -;; On loading this theme captures the default and treats that for fixed-pitch -;; rendering. -;; -;; - Enable variable pitch mode for editing text -;; (add-hook 'text-mode-hook -;; (lambda () -;; (variable-pitch-mode 1)) -;; -;; - Some other modes I like to enable/disable -;; (olivetti-mode 1) ;; Centers text in the buffer -;; (flyspell-mode 1) ;; Catch Spelling mistakes -;; (typo-mode 1) ;; Good for symbols like em-dash -;; (blink-cursor-mode 0) ;; Reduce visual noise -;; (linum-mode 0) ;; No line numbers for prose -;; -;; - And prettier org mode bullets: -;; (setq org-bullets-bullet-list -;; '("◉" "○")) -;; (org-bullets 1) - -;;; Code: - -(defvar poet--monospace-height - (face-attribute 'fixed-pitch :height nil 'default) - "The original height stored as a defvar to stay constant across reloads.") - -(defgroup poet-theme nil - "Customizations to change the behavior of poet") - -(defcustom poet-variable-headers t - "Use varying sizes for headers in org and markdown" - :group 'poet-theme - :type 'boolean) - -(defun poet--height (multiplier) - "Returns the height as MULTIPLIER * monospace-height." - (if poet-variable-headers - (truncate (* poet--monospace-height multiplier)) - poet--monospace-height)) -(deftheme poet-monochrome - "A monochrome prose friendly theme.") - -(let ((fg "#434343") - (bg "#d0d0d0") - (emph "#212121") - (sep "#ededed") - (hlt "#eeeeee") - (bg-hlt "#efefef") - (muted "#606060") - (meta "#3d3d3d") - (link "#676767") - (link-underline "#969696") - (vlink-underline "#4b4b4b") - (header "#404040") - (button "#606060") - (glyph "#787878") - (cursor "#323232") - (paren-match-bg "#8a8a8a") - (paren-match-fg "#fefefe") - (search-fg "#6c6c6c") - (search-bg "#fefefe") - (search-fail-bg "#d8d8d8") - (tooltip-fg "#101010") - (tooltip-bg "#b9b9b9") - (shadow "#989898") - (secondary-bg "#cdcdcd") - (trailing-bg "#b1b1b1") - (fci "#dddddd") - (lazy-hlt-fg "#000000") - (lazy-hlt-bg "#fefefe") - (evil-rep-fg "#fefefe") - (evil-rep-bg "#3d3d3d") - (mode-line-fg "#101010") - (header-line-bg "#dfdfdf") - (mode-line-hlt "#fefefe") - (mode-line-inactive "#878787") - (error "#979797") - (builtin "#606060") - (string "#585858") - (function-name "#626262") - (keyword "#656565") - (constant "#696969") - (type "#797979") - (variable "#545454") - (org-meta "#777777") - (org-document-info "#606060") - (org-table "#dfdfdf") - (org-quote-fg "#4f4f4f") - (org-quote-bg "#dfdfdf") - (org-date "#434343") - (org-title "#696969") - (org-title-underline "#a9a9a9") - (org-checkbox "#a9a9a9") - (org-scheduled "#323232") - (org-scheduled-today "#101010") - (org-done "#626262") - (org-todo "#656565") - (org-tag "#767676") - (org-block-line "#c6c6c6") - (org-block-bg "#dfdfdf") - (org-agenda-structure-fg "#545454") - (org-agenda-structure-bg "#dfdfdf") - (org-agenda-today-fg "#000000") - (org-agenda-today-bg "#ededed") - (org-special-keyword "#767676") - (org-sched-prev "#1f1f1f") - (org-agenda-done "#767676") - (hl-line "#eeeeee") - (linum-hlt "#545454") - (linum "#a9a9a9") - (markdown-markup "#777777") - (markdown-metadata "#767676") - (markdown-language "#606060") - (markdown-list "#000000") - (markdown-code-bg "#dfdfdf") - (markdown-pre-bg "#dfdfdf") - (markdown-header-delimiter "#777777") - (imenu "#3d3d3d")) - (custom-theme-set-faces 'poet-monochrome - `(variable-pitch ((t (:family ,(face-attribute 'variable-pitch :family) :height (lambda (_x) (poet--height 1.23)))))) - `(default ((t (:background ,bg :foreground ,fg)))) - `(italic ((t (:foreground ,emph :slant italic)))) - `(highlight ((t (:background ,hlt :overline nil)))) - `(region ((t (:background ,bg-hlt)))) - `(fringe ((t (:background ,bg)))) - `(button ((t (:inherit default :foreground ,button)))) - `(escape-glyph ((t (:foreground ,glyph)))) - `(link ((t (:underline (:color ,link-underline :style line) :foreground ,link)))) - `(link-visited ((t (:inherit link :foreground ,link :underline (:color ,vlink-underline :style line))))) - `(cursor ((t (:background ,cursor)))) - `(show-paren-match ((t (:background ,paren-match-fg :foreground ,paren-match-bg)))) - `(isearch ((t (:foreground ,search-fg :background ,search-bg)))) - `(isearch-fail ((t (:background ,search-fail-bg)))) - `(query-replace ((t (:inherit isearch)))) - `(tooltip ((t (:inherit default :foreground ,tooltip-fg :background ,tooltip-bg)))) - `(shadow ((t (:foreground ,shadow)))) - `(secondary-selection ((t (:background ,secondary-bg)))) - `(trailing-whitespace ((t (:background ,trailing-bg)))) - `(lazy-highlight ((t (:foreground ,lazy-hlt-fg :background ,lazy-hlt-bg)))) - `(next-error ((t (:inherit region)))) - `(window-divider ((t (:background ,sep :foreground ,sep)))) - `(vertical-border ((t (:background ,sep :foreground ,sep)))) - `(evil-ex-substitute-replacement ((t (:foreground ,evil-rep-fg :background ,evil-rep-bg :underline nil)))) - `(minibuffer-prompt ((t (:inherit fixed-pitch :weight bold :foreground ,meta)))) - `(mode-line ((t (:inherit fixed-pitch :foreground ,mode-line-fg :background ,bg :overline ,sep :box (:line-width 3 :color ,bg))))) - `(header-line ((t (:overline nil :background ,header-line-bg :box (:line-width 3 :color ,header-line-bg) :underline ,sep :inherit mode-line)))) - `(mode-line-buffer-id ((t (:weight bold)))) - `(mode-line-emphasis ((t (:weight bold)))) - `(mode-line-highlight ((t (:background ,mode-line-hlt)))) - `(mode-line-inactive ((t (:inherit mode-line :background ,bg :foreground ,mode-line-inactive :box (:color ,bg :line-width 3))))) - `(error ((t (:foreground ,error :inherit fixed-pitch)))) - `(font-lock-comment-face ((t (:foreground ,muted :inherit fixed-pitch)))) - `(font-lock-builtin-face ((t (:foreground ,builtin :inherit fixed-pitch)))) - `(font-lock-string-face ((t (:inherit fixed-pitch :foreground ,string)))) - `(font-lock-function-name-face ((t (:inherit fixed-pitch :foreground ,function-name)))) - `(font-lock-keyword-face ((t (:inherit fixed-pitch :foreground ,keyword)))) - `(font-lock-comment-delimiter-face ((t (:inherit fixed-pitch :inherit font-lock-comment-face)))) - `(font-lock-constant-face ((t (:inherit fixed-pitch :foreground ,constant)))) - `(font-lock-doc-face ((t (:inherit fixed-pitch :inherit font-lock-string-face)))) - `(font-lock-preprocessor-face ((t (:inherit fixed-pitch :inherit font-lock-builtin-face)))) - `(font-lock-regexp-grouping-backslash ((t (:inherit fixed-pitch :inherit bold)))) - `(font-lock-regexp-grouping-construct ((t (:inherit fixed-pitch :inherit bold)))) - `(font-lock-type-face ((t (:foreground ,type :inherit fixed-pitch)))) - `(font-lock-variable-name-face ((t (:inherit fixed-pitch :foreground ,variable)))) - `(font-lock-warning-face ((t (:inherit error)))) - `(org-level-1 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.5)))))) - `(org-level-2 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.4)))))) - `(org-level-3 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.3)))))) - `(org-level-4 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-5 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-6 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-7 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-8 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-meta-line ((t (:inherit fixed-pitch :foreground ,org-meta)))) - `(org-document-info-keyword ((t (:inherit fixed-pitch :foreground ,org-document-info)))) - `(org-document-info ((t (:inherit default :foreground ,org-document-info)))) - `(org-verbatim ((t (:inherit fixed-pitch)))) - `(org-code ((t (:inherit fixed-pitch)))) - `(org-table ((t (:inherit fixed-pitch :background ,org-table)))) - `(org-formula ((t (:inherit org-table :height (lambda (_x) (poet--height 1)))))) - `(org-verse ((t (:inherit default :foreground ,org-quote-fg :background ,org-quote-bg)))) - `(org-quote ((t (:inherit default :foreground ,org-quote-fg :background ,org-quote-bg)))) - `(org-hide ((t (:inherit fixed-pitch :foreground ,bg)))) - `(org-indent ((t (:inherit org-hide)))) - `(org-date ((t (:inherit fixed-pitch :foreground ,org-date :underline nil)))) - `(org-document-title ((t (:inherit default :foreground ,org-title :height (lambda (_x) (poet--height 1.8)) :underline (:color ,org-title-underline))))) - `(org-checkbox ((t (:inherit fixed-pitch :weight bold :foreground ,org-checkbox)))) - `(org-done ((t (:inherit fixed-pitch :foreground ,org-done)))) - `(org-todo ((t (:inherit fixed-pitch :foreground ,org-todo)))) - `(org-tag ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,org-tag)))) - `(org-block-begin-line ((t (:inherit fixed-pitch :background ,org-block-line)))) - `(org-block-end-line ((t (:inherit fixed-pitch :background ,org-block-line)))) - `(org-block ((t (:background ,org-block-bg :inherit fixed-pitch)))) - `(org-priority ((t (:inherit fixed-pitch :weight normal)))) - `(org-agenda-structure ((t (:foreground ,org-agenda-structure-fg :background ,bg :box (:line-width 3 :color ,bg) :underline ,org-agenda-structure-bg)))) - `(org-scheduled ((t (:foreground ,org-scheduled)))) - `(org-scheduled-today ((t (:foreground ,org-scheduled-today)))) - `(org-agenda-date-weekend ((t (:inherit org-agenda-structure)))) - `(org-agenda-date-today ((t (:box (:line-width 3 :color ,org-agenda-today-bg) :foreground ,org-agenda-today-fg :background ,org-agenda-today-bg)))) - `(org-special-keyword ((t (:inherit fixed-pitch :foreground ,org-special-keyword)))) - `(org-scheduled-previously ((t (:foreground ,org-sched-prev)))) - `(org-agenda-done ((t (:foreground ,org-agenda-done)))) - `(org-footnote ((t (:foreground ,link)))) - `(hl-line ((t (:background ,hl-line)))) - `(linum-highlight-face ((t (:inherit fixed-pitch :foreground ,linum-hlt)))) - `(linum ((t (:inherit fixed-pitch :foreground ,linum)))) - `(line-number ((t (:inherit fixed-pitch :foreground ,linum)))) - `(line-number-current-line ((t (:inherit fixed-pitch :foreground ,linum-hlt)))) - `(markdown-header-face-1 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.5)))))) - `(markdown-header-face-2 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.4)))))) - `(markdown-header-face-3 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.3)))))) - `(markdown-header-face-4 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-5 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-6 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-7 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-8 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-markup-face ((t (:inherit fixed-pitch :foreground ,markdown-markup)))) - `(markdown-inline-code-face ((t (:inherit fixed-pitch)))) - `(markdown-metadata-key-face ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,markdown-metadata)))) - `(markdown-metadata-value-face ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,fg)))) - `(markdown-language-keyword-face ((t (:foreground ,markdown-language)))) - `(markdown-list-face ((t (:inherit fixed-pitch :foreground ,markdown-list)))) - `(markdown-code-face ((t (:inherit fixed-pitch :foreground ,fg :background ,markdown-code-bg)))) - `(markdown-pre-face ((t (:inherit fixed-pitch :color ,fg :background ,markdown-pre-bg)))) - `(markdown-header-delimiter-face ((t (:inherit fixed-pitch :foreground ,markdown-header-delimiter)))) - `(markdown-header-rule-face ((t (:inherit fixed-pitch :foreground ,markdown-header-delimiter)))) - `(markdown-url-face ((t (:inherit fixed-pitch :foreground ,link)))) - `(imenu-list-entry-face-0 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-1 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-2 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-3 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-4 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-5 ((t (:foreground ,imenu)))) - `(helm-source-header ((t (:height (lambda (_x) (poet--height 1)))))) - `(ein:cell-input-area ((t (:background ,org-block-bg)))) - `(ein:cell-input-prompt ((t (:foreground ,org-tag :background ,bg)))) - `(ein:cell-output-prompt ((t (:foreground ,org-tag :background ,bg))))) - (custom-theme-set-variables 'poet-monochrome - '(line-spacing .2) - `(fci-rule-color ,fci))) - -;;;###autoload -(when (and (boundp 'custom-theme-load-path) - load-file-name) - (add-to-list 'custom-theme-load-path - (file-name-as-directory - (file-name-directory load-file-name)))) - -(provide-theme 'poet-monochrome) -;;; poet-monochrome-theme.el ends here diff --git a/elpa/poet-theme-20191215.201/poet-monochrome-theme.elc b/elpa/poet-theme-20191215.201/poet-monochrome-theme.elc deleted file mode 100644 index 14e3c3dcd7d33bf53b416782ee32d813370b7f30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11374 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 -;; URL: https://github.com/kunalb/poet/ -;; Version: 2.0 - -;;; Commentary: - -;; Emacs has very good support for multiple fonts in a single -;; file. Poet uses this support to make it much more convenient to -;; write prose within Emacs, with particular attention paid to -;; org-mode and markdown-mode. Code blocks, tables, etc are -;; formatted in monospace text with the appropriate backgrounds. - -;; Theme Customizations -;; - `poet-variable-headers` -;; Enable / disable different text heights for different faces. - -;; Recommended customizations for using this theme -;; -;; - Set up the base fonts you'd like to use in Emacs before loading Poet -;; (set-face-attribute 'default nil :family "Iosevka" :height 130) -;; (set-face-attribute 'fixed-pitch nil :family "Iosevka") -;; (set-face-attribute 'variable-pitch nil :family "Baskerville") -;; On loading this theme captures the default and treats that for fixed-pitch -;; rendering. -;; -;; - Enable variable pitch mode for editing text -;; (add-hook 'text-mode-hook -;; (lambda () -;; (variable-pitch-mode 1)) -;; -;; - Some other modes I like to enable/disable -;; (olivetti-mode 1) ;; Centers text in the buffer -;; (flyspell-mode 1) ;; Catch Spelling mistakes -;; (typo-mode 1) ;; Good for symbols like em-dash -;; (blink-cursor-mode 0) ;; Reduce visual noise -;; (linum-mode 0) ;; No line numbers for prose -;; -;; - And prettier org mode bullets: -;; (setq org-bullets-bullet-list -;; '("◉" "○")) -;; (org-bullets 1) - -;;; Code: - -(defvar poet--monospace-height - (face-attribute 'fixed-pitch :height nil 'default) - "The original height stored as a defvar to stay constant across reloads.") - -(defgroup poet-theme nil - "Customizations to change the behavior of poet") - -(defcustom poet-variable-headers t - "Use varying sizes for headers in org and markdown" - :group 'poet-theme - :type 'boolean) - -(defun poet--height (multiplier) - "Returns the height as MULTIPLIER * monospace-height." - (if poet-variable-headers - (truncate (* poet--monospace-height multiplier)) - poet--monospace-height)) -(deftheme poet - "A prose friendly theme.") - -(let ((fg "#444444") - (bg "#e1d9c2") - (emph "#222222") - (sep "#eeeeee") - (hlt "#efefef") - (bg-hlt "#fff8e1") - (muted "#795548") - (meta "#4e342e") - (link "#303f9f") - (link-underline "#304ffe") - (vlink-underline "#1a237e") - (header "#770b0b") - (button "#616161") - (glyph "#673AB7") - (cursor "#333333") - (paren-match-bg "#ff1744") - (paren-match-fg "#ffffff") - (search-fg "#c2185b") - (search-bg "#ffffff") - (search-fail-bg "#f8bbd0") - (tooltip-fg "#111111") - (tooltip-bg "#fff176") - (shadow "#999999") - (secondary-bg "#fff59d") - (trailing-bg "#ff8a65") - (fci "#dedede") - (lazy-hlt-fg "#000000") - (lazy-hlt-bg "#ffffff") - (evil-rep-fg "#ffffff") - (evil-rep-bg "#4e342e") - (mode-line-fg "#111111") - (header-line-bg "#e0e0e0") - (mode-line-hlt "#ffffff") - (mode-line-inactive "#888888") - (error "#df5286") - (builtin "#795548") - (string "#6C3082") - (function-name "#388E3C") - (keyword "#bf360c") - (constant "#0288D1") - (type "#3f51b5") - (variable "#455A64") - (org-meta "#8D6E63") - (org-document-info "#795548") - (org-table "#e0e0e0") - (org-quote-fg "#4A148C") - (org-quote-bg "#e0e0e0") - (org-date "#444444") - (org-title "#B71C1C") - (org-title-underline "#aaaaaa") - (org-checkbox "#aaaaaa") - (org-scheduled "#333333") - (org-scheduled-today "#111111") - (org-done "#388E3C") - (org-todo "#BF360C") - (org-tag "#777777") - (org-block-line "#c7c7c7") - (org-block-bg "#e0e0e0") - (org-agenda-structure-fg "#555555") - (org-agenda-structure-bg "#e0e0e0") - (org-agenda-today-fg "#000000") - (org-agenda-today-bg "#eeeeee") - (org-special-keyword "#777777") - (org-sched-prev "#3f0000") - (org-agenda-done "#777777") - (hl-line "#efefef") - (linum-hlt "#555555") - (linum "#aaaaaa") - (markdown-markup "#8D6E63") - (markdown-metadata "#777777") - (markdown-language "#7b1fa2") - (markdown-list "#000000") - (markdown-code-bg "#e0e0e0") - (markdown-pre-bg "#e0e0e0") - (markdown-header-delimiter "#8D6E63") - (imenu "#4e342e")) - (custom-theme-set-faces 'poet - `(variable-pitch ((t (:family ,(face-attribute 'variable-pitch :family) :height (lambda (_x) (poet--height 1.23)))))) - `(default ((t (:background ,bg :foreground ,fg)))) - `(italic ((t (:foreground ,emph :slant italic)))) - `(highlight ((t (:background ,hlt :overline nil)))) - `(region ((t (:background ,bg-hlt)))) - `(fringe ((t (:background ,bg)))) - `(button ((t (:inherit default :foreground ,button)))) - `(escape-glyph ((t (:foreground ,glyph)))) - `(link ((t (:underline (:color ,link-underline :style line) :foreground ,link)))) - `(link-visited ((t (:inherit link :foreground ,link :underline (:color ,vlink-underline :style line))))) - `(cursor ((t (:background ,cursor)))) - `(show-paren-match ((t (:background ,paren-match-fg :foreground ,paren-match-bg)))) - `(isearch ((t (:foreground ,search-fg :background ,search-bg)))) - `(isearch-fail ((t (:background ,search-fail-bg)))) - `(query-replace ((t (:inherit isearch)))) - `(tooltip ((t (:inherit default :foreground ,tooltip-fg :background ,tooltip-bg)))) - `(shadow ((t (:foreground ,shadow)))) - `(secondary-selection ((t (:background ,secondary-bg)))) - `(trailing-whitespace ((t (:background ,trailing-bg)))) - `(lazy-highlight ((t (:foreground ,lazy-hlt-fg :background ,lazy-hlt-bg)))) - `(next-error ((t (:inherit region)))) - `(window-divider ((t (:background ,sep :foreground ,sep)))) - `(vertical-border ((t (:background ,sep :foreground ,sep)))) - `(evil-ex-substitute-replacement ((t (:foreground ,evil-rep-fg :background ,evil-rep-bg :underline nil)))) - `(minibuffer-prompt ((t (:inherit fixed-pitch :weight bold :foreground ,meta)))) - `(mode-line ((t (:inherit fixed-pitch :foreground ,mode-line-fg :background ,bg :overline ,sep :box (:line-width 3 :color ,bg))))) - `(header-line ((t (:overline nil :background ,header-line-bg :box (:line-width 3 :color ,header-line-bg) :underline ,sep :inherit mode-line)))) - `(mode-line-buffer-id ((t (:weight bold)))) - `(mode-line-emphasis ((t (:weight bold)))) - `(mode-line-highlight ((t (:background ,mode-line-hlt)))) - `(mode-line-inactive ((t (:inherit mode-line :background ,bg :foreground ,mode-line-inactive :box (:color ,bg :line-width 3))))) - `(error ((t (:foreground ,error :inherit fixed-pitch)))) - `(font-lock-comment-face ((t (:foreground ,muted :inherit fixed-pitch)))) - `(font-lock-builtin-face ((t (:foreground ,builtin :inherit fixed-pitch)))) - `(font-lock-string-face ((t (:inherit fixed-pitch :foreground ,string)))) - `(font-lock-function-name-face ((t (:inherit fixed-pitch :foreground ,function-name)))) - `(font-lock-keyword-face ((t (:inherit fixed-pitch :foreground ,keyword)))) - `(font-lock-comment-delimiter-face ((t (:inherit fixed-pitch :inherit font-lock-comment-face)))) - `(font-lock-constant-face ((t (:inherit fixed-pitch :foreground ,constant)))) - `(font-lock-doc-face ((t (:inherit fixed-pitch :inherit font-lock-string-face)))) - `(font-lock-preprocessor-face ((t (:inherit fixed-pitch :inherit font-lock-builtin-face)))) - `(font-lock-regexp-grouping-backslash ((t (:inherit fixed-pitch :inherit bold)))) - `(font-lock-regexp-grouping-construct ((t (:inherit fixed-pitch :inherit bold)))) - `(font-lock-type-face ((t (:foreground ,type :inherit fixed-pitch)))) - `(font-lock-variable-name-face ((t (:inherit fixed-pitch :foreground ,variable)))) - `(font-lock-warning-face ((t (:inherit error)))) - `(org-level-1 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.5)))))) - `(org-level-2 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.4)))))) - `(org-level-3 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.3)))))) - `(org-level-4 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-5 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-6 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-7 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-level-8 ((t (:inherit default :foreground ,header :height (lambda (_x) (poet--height 1.23)))))) - `(org-meta-line ((t (:inherit fixed-pitch :foreground ,org-meta)))) - `(org-document-info-keyword ((t (:inherit fixed-pitch :foreground ,org-document-info)))) - `(org-document-info ((t (:inherit default :foreground ,org-document-info)))) - `(org-verbatim ((t (:inherit fixed-pitch)))) - `(org-code ((t (:inherit fixed-pitch)))) - `(org-table ((t (:inherit fixed-pitch :background ,org-table)))) - `(org-formula ((t (:inherit org-table :height (lambda (_x) (poet--height 1)))))) - `(org-verse ((t (:inherit default :foreground ,org-quote-fg :background ,org-quote-bg)))) - `(org-quote ((t (:inherit default :foreground ,org-quote-fg :background ,org-quote-bg)))) - `(org-hide ((t (:inherit fixed-pitch :foreground ,bg)))) - `(org-indent ((t (:inherit org-hide)))) - `(org-date ((t (:inherit fixed-pitch :foreground ,org-date :underline nil)))) - `(org-document-title ((t (:inherit default :foreground ,org-title :height (lambda (_x) (poet--height 1.8)) :underline (:color ,org-title-underline))))) - `(org-checkbox ((t (:inherit fixed-pitch :weight bold :foreground ,org-checkbox)))) - `(org-done ((t (:inherit fixed-pitch :foreground ,org-done)))) - `(org-todo ((t (:inherit fixed-pitch :foreground ,org-todo)))) - `(org-tag ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,org-tag)))) - `(org-block-begin-line ((t (:inherit fixed-pitch :background ,org-block-line)))) - `(org-block-end-line ((t (:inherit fixed-pitch :background ,org-block-line)))) - `(org-block ((t (:background ,org-block-bg :inherit fixed-pitch)))) - `(org-priority ((t (:inherit fixed-pitch :weight normal)))) - `(org-agenda-structure ((t (:foreground ,org-agenda-structure-fg :background ,bg :box (:line-width 3 :color ,bg) :underline ,org-agenda-structure-bg)))) - `(org-scheduled ((t (:foreground ,org-scheduled)))) - `(org-scheduled-today ((t (:foreground ,org-scheduled-today)))) - `(org-agenda-date-weekend ((t (:inherit org-agenda-structure)))) - `(org-agenda-date-today ((t (:box (:line-width 3 :color ,org-agenda-today-bg) :foreground ,org-agenda-today-fg :background ,org-agenda-today-bg)))) - `(org-special-keyword ((t (:inherit fixed-pitch :foreground ,org-special-keyword)))) - `(org-scheduled-previously ((t (:foreground ,org-sched-prev)))) - `(org-agenda-done ((t (:foreground ,org-agenda-done)))) - `(org-footnote ((t (:foreground ,link)))) - `(hl-line ((t (:background ,hl-line)))) - `(linum-highlight-face ((t (:inherit fixed-pitch :foreground ,linum-hlt)))) - `(linum ((t (:inherit fixed-pitch :foreground ,linum)))) - `(line-number ((t (:inherit fixed-pitch :foreground ,linum)))) - `(line-number-current-line ((t (:inherit fixed-pitch :foreground ,linum-hlt)))) - `(markdown-header-face-1 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.5)))))) - `(markdown-header-face-2 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.4)))))) - `(markdown-header-face-3 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.3)))))) - `(markdown-header-face-4 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-5 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-6 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-7 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-header-face-8 ((t (:foreground ,header :inherit default :height (lambda (_x) (poet--height 1.23)))))) - `(markdown-markup-face ((t (:inherit fixed-pitch :foreground ,markdown-markup)))) - `(markdown-inline-code-face ((t (:inherit fixed-pitch)))) - `(markdown-metadata-key-face ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,markdown-metadata)))) - `(markdown-metadata-value-face ((t (:inherit fixed-pitch :height (lambda (_x) (poet--height 1)) :foreground ,fg)))) - `(markdown-language-keyword-face ((t (:foreground ,markdown-language)))) - `(markdown-list-face ((t (:inherit fixed-pitch :foreground ,markdown-list)))) - `(markdown-code-face ((t (:inherit fixed-pitch :foreground ,fg :background ,markdown-code-bg)))) - `(markdown-pre-face ((t (:inherit fixed-pitch :color ,fg :background ,markdown-pre-bg)))) - `(markdown-header-delimiter-face ((t (:inherit fixed-pitch :foreground ,markdown-header-delimiter)))) - `(markdown-header-rule-face ((t (:inherit fixed-pitch :foreground ,markdown-header-delimiter)))) - `(markdown-url-face ((t (:inherit fixed-pitch :foreground ,link)))) - `(imenu-list-entry-face-0 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-1 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-2 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-3 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-4 ((t (:foreground ,imenu)))) - `(imenu-list-entry-face-5 ((t (:foreground ,imenu)))) - `(helm-source-header ((t (:height (lambda (_x) (poet--height 1)))))) - `(ein:cell-input-area ((t (:background ,org-block-bg)))) - `(ein:cell-input-prompt ((t (:foreground ,org-tag :background ,bg)))) - `(ein:cell-output-prompt ((t (:foreground ,org-tag :background ,bg))))) - (custom-theme-set-variables 'poet - '(line-spacing .2) - `(fci-rule-color ,fci))) - -;;;###autoload -(when (and (boundp 'custom-theme-load-path) - load-file-name) - (add-to-list 'custom-theme-load-path - (file-name-as-directory - (file-name-directory load-file-name)))) - -(provide-theme 'poet) -;;; poet-theme.el ends here diff --git a/elpa/poet-theme-20191215.201/poet-theme.elc b/elpa/poet-theme-20191215.201/poet-theme.elc deleted file mode 100644 index 81d64d9b0219572a38def5816dec33a855268415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11395 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. -;; -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;;; Code: - -;; FONT-LOCK COMPONENTS: -;; -;; All * functions are lazy in poly-lock and jit-lock because they just mark -;; 'fontified nil. -;; -;; fontification-functions -> jit-lock-function / poly-lock-function -;; font-lock-ensure -> font-lock-ensure-function -> jit-lock-fontify-now/poly-lock-fontify-now -;; *font-lock-flush -> font-lock-flush-function -> jit-lock-refontify / poly-lock-flush -;; *font-lock-fontify-buffer -> font-lock-fontify-buffer-function -> jit-lock-refontify / poly-lock-flush -;; font-lock-fontify-region -> font-lock-fontify-region-function -> font-lock-default-fontify-region -;; font-lock-unfontify-region -> font-lock-unfontify-region-function -> font-lock-default-unfontify-region -;; font-lock-unfontify-buffer -> font-lock-unfontify-buffer-function -> font-lock-default-unfontify-buffer -;; -;; Jit-lock components: -;; fontification-functions (called by display engine) -;; --> jit-lock-function -;; --> jit-lock-fontify-now (or deferred through timer/text-properties) -;; --> jit-lock--run-functions -;; --> jit-lock-functions (font-lock-fontify-region bug-reference-fontify etc.) -;; -;; -;; Poly-lock components: -;; fontification-functions -;; --> poly-lock-function -;; --> poly-lock-fontify-now -;; --> jit-lock-fontify-now -;; ... -;; -;; `font-lock-mode' call graph: -;; -> font-lock-function <---- replaced by `poly-lock-mode' -;; -> font-lock-default-function -;; -> font-lock-mode-internal -;; -> font-lock-turn-on-thing-lock -;; -> font-lock-turn-on-thing-lock -;; -> (setq font-lock-flush-function jit-lock-refontify) -;; -> (setq font-lock-ensure-function jit-lock-fontify-now) -;; -> (setq font-lock-fontify-buffer-function jit-lock-refontify) -;; -> (jit-lock-register #'font-lock-fontify-region) -;; -> (add-hook 'jit-lock-functions #'font-lock-fontify-region nil t) -;; -> jit-lock-mode - -(require 'jit-lock) -(require 'polymode-core) - -(defvar poly-lock-allow-fontification t) -(defvar poly-lock-allow-background-adjustment t) -(defvar poly-lock-fontification-in-progress nil) -(defvar poly-lock-defer-after-change t) -(defvar-local poly-lock-mode nil) - -(eval-when-compile - (defmacro with-buffer-prepared-for-poly-lock (&rest body) - "Execute BODY in current buffer, overriding several variables. -Preserves the `buffer-modified-p' state of the current buffer." - (declare (debug t)) - `(let ((inhibit-point-motion-hooks t)) - (with-silent-modifications - ,@body)))) - -;; FIXME: Can this hack be avoided if poly-lock is registered in -;; `font-lock-support-mode'? -(defun poly-lock-no-jit-lock-in-polymode-buffers (fun arg) - "Don't activate FUN in `polymode' buffers. -When not in polymode buffers apply FUN to ARG." - (unless polymode-mode - (funcall fun arg))) -(pm-around-advice 'jit-lock-mode #'poly-lock-no-jit-lock-in-polymode-buffers) -;; see the comment in pm--mode-setup for these -(pm-around-advice 'font-lock-fontify-region #'polymode-inhibit-during-initialization) -(pm-around-advice 'font-lock-fontify-buffer #'polymode-inhibit-during-initialization) -(pm-around-advice 'font-lock-ensure #'polymode-inhibit-during-initialization) - -(defun poly-lock-mode (arg) - "This is the value of `font-lock-function' in all polymode buffers. -Mode activated when ARG is positive; happens when font-lock is -switched on." - (unless polymode-mode - (error "Calling `poly-lock-mode' in a non-polymode buffer (%s)" (current-buffer))) - - (setq poly-lock-mode arg) - - (if arg - (progn - ;; a lot of the following is inspired by what jit-lock does in - ;; `font-lock-turn-on-thing-lock' - - (setq-local font-lock-support-mode 'poly-lock-mode) - (setq-local font-lock-dont-widen t) - - ;; Re-use jit-lock registration. Some minor modes (adaptive-wrap) - ;; register extra functionality. [Unfortunately `jit-lock-register' - ;; calls `jit-lock-mode' which we don't want. Hence the advice. TOTHINK: - ;; Simply add-hook to `jit-lock-functions'?] - (jit-lock-register 'font-lock-fontify-region) - - ;; don't allow other functions - (setq-local fontification-functions '(poly-lock-function)) - - (setq-local font-lock-flush-function 'poly-lock-flush) - (setq-local font-lock-fontify-buffer-function 'poly-lock-flush) - (setq-local font-lock-ensure-function 'poly-lock-fontify-now) - - ;; There are some more, jit-lock doesn't change those, neither do we: - ;; font-lock-unfontify-region-function (defaults to font-lock-default-unfontify-region) - ;; font-lock-unfontify-buffer-function (defualts to font-lock-default-unfontify-buffer) - - ;; Don't fontify eagerly (and don't abort if the buffer is large). NB: - ;; `font-lock-flush' is not triggered if this is nil. - (setq-local font-lock-fontified t) - - ;; Now we can finally call `font-lock-default-function' because - ;; `font-lock-support-mode' is set to "unrecognizible" value, only core - ;; font-lock setup happens. - (font-lock-default-function arg) - - ;; Must happen after call to `font-lock-default-function' - (remove-hook 'after-change-functions 'font-lock-after-change-function t) - (remove-hook 'after-change-functions 'jit-lock-after-change t) - (add-hook 'after-change-functions 'poly-lock-after-change nil t) - - ;; Reusing jit-lock var becuase modes populate it directly. We are using - ;; this in `poly-lock-after-change' below. Taken from `jit-lock - ;; initialization. - (add-hook 'jit-lock-after-change-extend-region-functions - 'font-lock-extend-jit-lock-region-after-change - nil t)) - - (remove-hook 'after-change-functions 'poly-lock-after-change t) - (remove-hook 'fontification-functions 'poly-lock-function t)) - (current-buffer)) - -(defvar poly-lock-chunk-size 2500 - "Poly-lock fontifies chunks of at most this many characters at a time.") - -(defun poly-lock-function (start) - "The only function in `fontification-functions' in polymode buffers. -This is the entry point called by the display engine. START is -defined in `fontification-functions'. This function has the same -scope as `jit-lock-function'." - (unless pm-initialization-in-progress - (if (and poly-lock-mode (not memory-full)) - (unless (input-pending-p) - (let ((end (min (or (text-property-any start (point-max) 'fontified t) - (point-max)) - (+ start poly-lock-chunk-size)))) - (when (< start end) - (poly-lock-fontify-now start end)))) - (with-buffer-prepared-for-poly-lock - (put-text-property start (point-max) 'fontified t))))) - -(defun poly-lock-fontify-now (beg end &optional _verbose) - "Polymode main fontification function. -Fontifies chunk-by chunk within the region BEG END." - (unless (or poly-lock-fontification-in-progress - pm-initialization-in-progress) - (let* ((font-lock-dont-widen t) - ;; For now we fontify entire chunks at once. This simplicity is - ;; warranted in multi-mode use cases. - (font-lock-extend-region-functions nil) - ;; Fontification in one buffer can trigger fontification in another - ;; buffer. Particularly, this happens when new indirect buffers are - ;; created and `normal-mode' triggers font-lock in those buffers. We - ;; avoid this by dynamically binding - ;; `poly-lock-fontification-in-progress' and un-setting - ;; `fontification-functions' in case re-display suddenly decides to - ;; fontify something else in other buffer. There are also font-lock - ;; guards in pm--mode-setup. - (poly-lock-fontification-in-progress t) - (fontification-functions nil) - (protect-host (or - (with-current-buffer (pm-base-buffer) - (eieio-oref pm/chunkmode 'protect-font-lock)) - ;; HACK: Some inner modes use syntax-table text - ;; property. If there is, for example, a comment - ;; syntax somewhere in the body span, havoc is spelled - ;; in font-lock-fontify-syntactically-region which - ;; calls parse-partial-sexp. For example fortran block - ;; in ../poly-markdown/tests/input/markdown.md. We do - ;; our best and protect the host in such cases. - (/= (next-single-property-change beg 'syntax-table nil end) - end)))) - (save-restriction - (widen) - (save-excursion - - ;; TEMPORARY HACK: extend to the next span boundary in code blocks - ;; (needed because re-display fontifies by small regions) - (let ((end-span (pm-innermost-span end))) - (if (car end-span) - (when (< (nth 1 end-span) end) - (setq end (nth 2 end-span))) - ;; in host extend to paragraphs as in poly-lock--extend-region - (goto-char end) - (when (search-forward "\n\n" nil t) - (setq end (min (1- (point)) (nth 2 end-span)))))) - - ;; Fontify the whole region in host first. It's ok for modes like - ;; markdown, org and slim which understand inner mode chunks. - (unless protect-host - (let ((span (pm-innermost-span beg))) - (when (or (null (pm-true-span-type span)) - ;; in inner spans fontify only if region is bigger than the span - (< (nth 2 span) end)) - (with-current-buffer (pm-base-buffer) - (with-buffer-prepared-for-poly-lock - (when poly-lock-allow-fontification - (put-text-property beg end 'fontified nil) ; just in case - ;; (message "jlrf-host:%d-%d %s" beg end major-mode) - (condition-case-unless-debug err - ;; NB: Some modes fontify beyond the limits (org-mode). - ;; We need a reliably way to detect the actual limit of - ;; the fontification. - (save-restriction - (widen) - (jit-lock--run-functions beg end)) - (error - (message "(jit-lock--run-functions %s %s) [UNPR HOST %s]: %s" - beg end (current-buffer) (error-message-string err))))) - (put-text-property beg end 'fontified t)))))) - (pm-map-over-spans - (lambda (span) - (when (or (pm-true-span-type span) - protect-host) - (let ((sbeg (nth 1 span)) - (send (nth 2 span))) - ;; skip empty spans - (with-buffer-prepared-for-poly-lock - (when (> send sbeg) - (if (not (and poly-lock-allow-fontification - poly-lock-mode)) - (put-text-property sbeg send 'fontified t) - (let ((new-beg (max sbeg beg)) - (new-end (min send end))) - (put-text-property new-beg new-end 'fontified nil) - ;; (message "jlrf:%d-%d %s" new-beg new-end major-mode) - (condition-case-unless-debug err - (if (eieio-oref pm/chunkmode 'protect-font-lock) - (pm-with-narrowed-to-span span - (jit-lock--run-functions new-beg new-end)) - (jit-lock--run-functions new-beg new-end)) - (error - (message "(jit-lock--run-functions %s %s) [span %d %d %s] -> (font-lock-default-fontify-region %s %s): %s" - new-beg new-end sbeg send (current-buffer) new-beg new-end - (error-message-string err)))) - ;; even if failed set to t - (put-text-property new-beg new-end 'fontified t))) - (when poly-lock-allow-background-adjustment - (poly-lock-adjust-span-face span))))))) - beg end)))) - (current-buffer))) - -(defun poly-lock-flush (&optional beg end) - "Force refontification of the region BEG..END. -This function is placed in `font-lock-flush-function''" - (unless poly-lock-fontification-in-progress - (let ((beg (or beg (point-min))) - (end (or end (point-max)))) - (with-buffer-prepared-for-poly-lock - (save-restriction - (widen) - (pm-flush-span-cache beg end) - (put-text-property beg end 'fontified nil)))))) - -(defvar jit-lock-start) -(defvar jit-lock-end) -(defun poly-lock--extend-region (beg end) - "Our own extension function which runs first on BEG END change. -Assumes widen buffer. Sets `jit-lock-start' and `jit-lock-end'." - ;; NB: Debug this like - ;; (with-silent-modifications (insert "`") (poly-lock-after-change 65 66 0)) - - ;; FIXME: this one extends to whole spans; not good. old span can disappear, - ;; shrunk, extend etc - - ;; TOCHECK: Pretty surely we need not use 'no-cache here. - - ;; With differed after change, any function calling pm-innermost-span (mostly - ;; syntax-propertize) will reset the spans, so the extension relying on - ;; :pm-span cache will not detect the change. Use instead the especially setup - ;; for this purpose :pm-span-old cache in poly-lock-after-change. - (let* ((prop-name (if poly-lock-defer-after-change :pm-span-old :pm-span)) - (old-beg (or (previous-single-property-change beg prop-name) - (point-min))) - (old-end (or (next-single-property-change end prop-name) - (point-max))) - ;; need this here before pm-innermost-span call - (old-beg-obj (nth 3 (get-text-property old-beg prop-name))) - (beg-span (pm-innermost-span beg 'no-cache)) - (end-span (if (<= end (nth 2 beg-span)) - beg-span - (pm-innermost-span end 'no-cache))) - (sbeg (nth 1 beg-span)) - (send (nth 2 end-span))) - - (if (< old-beg sbeg) - (let ((new-beg-span (pm-innermost-span old-beg))) - (if (eq old-beg-obj (nth 3 new-beg-span)) ; old-beg == (nth 1 new-beg-span) for sure - ;; new span appeared within an old span, don't refontify the old part (common case) - (setq jit-lock-start (min sbeg (nth 2 new-beg-span))) - ;; wrong span shrunk to its correct size (rare or never) - (setq jit-lock-start old-beg))) - ;; refontify the entire new span - (setq jit-lock-start sbeg)) - - ;; (dbg (pm-format-span beg-span)) - ;; always include head - (when (and (eq (car beg-span) 'tail) - (> jit-lock-start (point-min))) - (setq jit-lock-start (nth 1 (pm-innermost-span (1- jit-lock-start))))) - (when (and (eq (car beg-span) 'body) - (> jit-lock-start (point-min))) - (setq jit-lock-start (nth 1 (pm-innermost-span (1- jit-lock-start))))) - - ;; I think it's not possible to do better than this. When region is shrunk, - ;; previous region could be incorrectly fontified even if the mode is - ;; preserved due to wrong ppss - (setq jit-lock-end (max send old-end)) - - ;; Check if the type of following span changed (for example when - ;; modification is in head of an auto-chunk). Do this repeatedly till no - ;; change. [TOTHINK: Do we need similar extension backwards?] - (let ((go-on t)) - (while (and (< jit-lock-end (point-max)) - go-on) - (let ((ospan (get-text-property jit-lock-end prop-name)) - (nspan (pm-innermost-span jit-lock-end 'no-cache))) - ;; (dbg "N" (pm-format-span nspan)) - ;; (dbg "O" (pm-format-span ospan)) - ;; if spans have just been moved by buffer modification, stop - (if ospan - (if (and (eq (nth 3 nspan) (nth 3 ospan)) - (= (- (nth 2 nspan) (nth 1 nspan)) - (- (nth 2 ospan) (nth 1 ospan)))) - (setq go-on nil) - (setq jit-lock-end (nth 2 nspan) - end-span nspan)) - (setq go-on nil - jit-lock-end (point-max)))))) - - ;; This extension is needed because some host modes (org) either don't - ;; fontify the head correctly when tail is not there or worse, fontify - ;; larger spans than asked for. It's mostly for unprotected hosts, but - ;; doing it here for all cases to err on the safe side. - - ;; always include body of the head - (when (and (eq (car end-span) 'head) - (< jit-lock-end (point-max))) - (setq end-span (pm-innermost-span jit-lock-end) - jit-lock-end (nth 2 end-span))) - - ;; always include tail - (when (and (eq (car end-span) 'body) - (< jit-lock-end (point-max))) - (setq jit-lock-end (nth 2 (pm-innermost-span jit-lock-end)) - end-span (pm-innermost-span jit-lock-end))) - - ;; Temporary hack for large host mode chunks - narrow to empty lines - (when (> (* 2 poly-lock-chunk-size) - (- jit-lock-end jit-lock-start)) - - (when (eq (car beg-span) nil) - (let ((tbeg (min beg (nth 2 beg-span)))) - (when (> (- tbeg jit-lock-start) poly-lock-chunk-size) - (goto-char (- tbeg poly-lock-chunk-size)) - (when (search-backward "\n\n" nil t) - (setq jit-lock-start (max jit-lock-start (1+ (point)))))))) - - (when (eq (car end-span) nil) - (let ((tend (max end (nth 1 end-span)))) - (when (> (- jit-lock-end tend) poly-lock-chunk-size) - (goto-char (+ tend poly-lock-chunk-size)) - (when (search-forward "\n\n" nil t) - (setq jit-lock-end (min jit-lock-end (1- (point))))))))) - - (cons jit-lock-start jit-lock-end))) - -;; (defun poly-lock--jit-lock-extend-region-span (span old-len) -;; "Call `jit-lock-after-change-extend-region-functions' protected to SPAN. -;; Extend `jit-lock-start' and `jit-lock-end' by side effect. -;; OLD-LEN is passed to the extension function." -;; ;; FIXME: for multi-span regions this function seems to reset -;; ;; jit-lock-start/end to spans limits -;; (let ((beg jit-lock-start) -;; (end jit-lock-end)) -;; (let ((sbeg (nth 1 span)) -;; (send (nth 2 span))) -;; (when (or (> beg sbeg) (< end send)) -;; (pm-with-narrowed-to-span span -;; (setq jit-lock-start (max beg sbeg) -;; jit-lock-end (min end send)) -;; (condition-case err -;; (progn -;; ;; set jit-lock-start and jit-lock-end by side effect -;; (run-hook-with-args 'jit-lock-after-change-extend-region-functions -;; jit-lock-start jit-lock-end old-len)) -;; (error (message "(after-change-extend-region-functions %s %s %s) -> %s" -;; jit-lock-start jit-lock-end old-len -;; (error-message-string err)))) -;; ;; FIXME: this is not in the right buffer, we need to do it in the -;; ;; original buffer. -;; (setq jit-lock-start (min beg (max jit-lock-start sbeg)) -;; jit-lock-end (max end (min jit-lock-end send)))) -;; (cons jit-lock-start jit-lock-end))))) - -(defvar-local poly-lock--timer nil) -(defvar-local poly-lock--beg-change most-positive-fixnum) -(defvar-local poly-lock--end-change most-negative-fixnum) -(defun poly-lock--after-change-internal (buffer _old-len) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (setq poly-lock--timer nil) - ;; FIXME: timers can overlap; remove this check with global timer - (when (> poly-lock--end-change 0) - (with-buffer-prepared-for-poly-lock - (save-excursion - (save-restriction - (widen) - (let ((beg poly-lock--beg-change) - (end (min (point-max) poly-lock--end-change))) - (setq poly-lock--beg-change most-positive-fixnum - poly-lock--end-change most-negative-fixnum) - (save-match-data - (poly-lock--extend-region beg end) - ;; no need for 'no-cache; poly-lock--extend-region re-computed the spans - - ;; FIXME: currently poly-lock--extend-region extends to whole - ;; spans, which could get crazy for very large chunks, but - ;; seems to work really well with the deferred after-change - ;; hook. So the following jit-lock extensions are not needed - ;; and probably even harm. - - ;; This extension hooks are run for major-mode's syntactic - ;; hacks mostly and not that much for actual extension. For - ;; example, markdown can syntactically propertize in this hook - ;; markdown-font-lock-extend-region-function. Call on the - ;; entire region host hooks to account for such patterns. - ;; (let ((hostmode (oref pm/polymode -hostmode))) - ;; (unless (eieio-oref hostmode 'protect-font-lock) - ;; (with-current-buffer (pm-base-buffer) - ;; (run-hook-with-args 'jit-lock-after-change-extend-region-functions - ;; beg end old-len) - ;; (setq beg jit-lock-start - ;; end jit-lock-end))) - ;; (let ((bspan (pm-innermost-span jit-lock-start))) - ;; ;; FIXME: these are currently always protected and set - ;; ;; jit-lock-end/start in their own buffers, not the buffer - ;; ;; which invoked the after-change-hook - ;; (unless (eq (nth 3 bspan) hostmode) - ;; (poly-lock--jit-lock-extend-region-span bspan old-len)) - ;; (when (< (nth 2 bspan) jit-lock-end) - ;; (let ((espan (pm-innermost-span jit-lock-end))) - ;; (unless (eq (nth 3 espan) hostmode) - ;; (poly-lock--jit-lock-extend-region-span espan old-len))))) - ;; ) - - ;; ;; Why is this still needed? poly-lock--extend-region re-computes the spans - ;; (pm-flush-span-cache jit-lock-start jit-lock-end) - ;; (dbg (cb) jit-lock-start jit-lock-end) - ;; (put-text-property jit-lock-end jit-lock-end :poly-lock-refontify nil) - (put-text-property jit-lock-start jit-lock-end 'fontified nil)))))))))) - -(defun poly-lock-after-change (beg end old-len) - "Mark changed region with 'fontified nil. -Extend the region to spans which need to be updated. BEG, END and -OLD-LEN are as in `after-change-functions'. When -`poly-lock-defer-after-change' is non-nil (the default), run fontification" - (when (and poly-lock-mode - pm-allow-after-change-hook - (not memory-full)) - ;; Extension is slow but after-change functions can be called in rapid - ;; succession (#200 with string-rectangle on which combine-change-calls is - ;; of little help). Thus we do that in a timer. - (when (timerp poly-lock--timer) - ;; FIXME: Instead of local timer, make a global one iterating over - ;; relevant buffers - (cancel-timer poly-lock--timer)) - (if poly-lock-defer-after-change - (progn - (with-silent-modifications - ;; don't re-fontify before we extend - (put-text-property beg end 'fontified t) - (setq poly-lock--beg-change (min beg end poly-lock--beg-change) - poly-lock--end-change (max beg end poly-lock--end-change)) - ;; between this call and deferred extension pm-inner-span can be - ;; called, so we cache a few :pm-span properties around beg/end - (poly-lock--cache-pm-span-property beg end)) - (setq-local poly-lock--timer - (run-at-time 0.05 nil #'poly-lock--after-change-internal - (current-buffer) old-len))) - (setq poly-lock--beg-change beg - poly-lock--end-change end) - (poly-lock--after-change-internal (current-buffer) old-len)))) - -(defun poly-lock--cache-pm-span-property (beg end) - ;; cache one previous and 5 forward spans - (let ((new-beg (or (previous-single-property-change beg :pm-span) - (point-min)))) - (put-text-property new-beg beg :pm-span-old (get-text-property new-beg :pm-span))) - (let ((i 5)) - (while (and (< 0 i) (< end (point-max))) - (let ((new-end (or (next-single-property-change end :pm-span) - (point-max)))) - (put-text-property new-end end :pm-span-old (get-text-property (1- new-end) :pm-span)) - (setq end new-end - i (1- i)))))) - -(defun poly-lock--adjusted-background (prop) - ;; if > lighten on dark backgroun. Oposite on light. - (color-lighten-name (face-background 'default) - (if (eq (frame-parameter nil 'background-mode) 'light) - (- prop) ;; darken - prop))) - -(declare-function pm-get-adjust-face "polymode-methods") -(defvar poly-lock--extra-span-props (when (fboundp 'set-face-extend) (list :extend t))) -(defun poly-lock-adjust-span-face (span) - "Adjust 'face property of SPAN.. -How adjustment is made is defined in :adjust-face slot of the -SPAN's chunkmode." - (interactive "r") - (let ((face (pm-get-adjust-face (nth 3 span) (car span)))) - (let ((face (if (numberp face) - (unless (= face 0) - (list (append (list :background (poly-lock--adjusted-background face)) - poly-lock--extra-span-props))) - face))) - (when face - (font-lock-append-text-property - (nth 1 span) (nth 2 span) 'face face))))) - -(provide 'poly-lock) -;;; poly-lock.el ends here diff --git a/elpa/polymode-20200411.915/poly-lock.elc b/elpa/polymode-20200411.915/poly-lock.elc deleted file mode 100644 index 15ebec92fe2330ebe56582d966bd8a01601aca4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10944 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. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;;; Code: - -(require 'polymode-core) - - -;; HOST MODES - -(define-obsolete-variable-alias 'pm-host/ada 'poly-ada-hostmode "v0.2") -(define-hostmode poly-ada-hostmode :mode 'ada-mode) - -(define-obsolete-variable-alias 'pm-host/coffee 'poly-coffee-hostmode "v0.2") -(define-hostmode poly-coffee-hostmode :mode 'coffee-mode) - -(define-obsolete-variable-alias 'pm-host/emacs-lisp 'poly-emacs-lisp-hostmode "v0.2") -(define-hostmode poly-emacs-lisp-hostmode :mode 'emacs-lisp-mode) - -(define-obsolete-variable-alias 'pm-host/fundamental 'poly-fundamental-hostmode "v0.2") -(define-hostmode poly-fundamental-hostmode :mode 'fundamental-mode) - -(define-obsolete-variable-alias 'pm-host/java 'poly-java-hostmode "v0.2") -(define-hostmode poly-java-hostmode :mode 'java-mode) - -(define-obsolete-variable-alias 'pm-host/js 'poly-js-hostmode "v0.2") -(define-hostmode poly-js-hostmode :mode 'js-mode) - -(define-obsolete-variable-alias 'pm-host/latex 'poly-latex-hostmode "v0.2") -(define-hostmode poly-latex-hostmode :mode 'latex-mode) - -(define-obsolete-variable-alias 'pm-host/html 'poly-html-hostmode "v0.2") -(define-hostmode poly-html-hostmode - :mode 'html-mode - :indent-offset 'sgml-basic-offset - :protect-font-lock nil - :protect-syntax t) - -(define-obsolete-variable-alias 'pm-host/R 'poly-R-hostmode "v0.2") -(define-hostmode poly-R-hostmode :mode 'R-mode) - -(define-obsolete-variable-alias 'pm-host/perl 'poly-perl-hostmode "v0.2") -(define-hostmode poly-perl-hostmode :mode 'perl-mode) - -(define-obsolete-variable-alias 'pm-host/ruby 'poly-ruby-hostmode "v0.2") -(define-hostmode poly-ruby-hostmode :mode 'ruby-mode) - -(define-obsolete-variable-alias 'pm-host/pascal 'poly-pascal-hostmode "v0.2") -(define-hostmode poly-pascal-hostmode :mode 'pascal-mode) - -(define-obsolete-variable-alias 'pm-host/C++ 'poly-c++-hostmode "v0.2") -(define-hostmode poly-c++-hostmode :mode 'C++-mode :protect-font-lock nil) - -(define-obsolete-variable-alias 'pm-host/sgml 'poly-sgml-hostmode "v0.2") -(define-hostmode poly-sgml-hostmode :mode 'sgml-mode) - -(define-obsolete-variable-alias 'pm-host/text 'poly-text-hostmode "v0.2") -(define-hostmode poly-text-hostmode :mode 'text-mode) - -(define-obsolete-variable-alias 'pm-host/yaml 'poly-yaml-hostmode "v0.2") -(define-hostmode poly-yaml-hostmode :mode 'yaml-mode) - - -;;; ROOT POLYMODES - -;; These are simple generic configuration objects. More specialized polymodes -;; should clone these. - -(define-obsolete-variable-alias 'pm-poly/brew 'poly-brew-root-polymode "v0.2") -(defvar poly-brew-root-polymode - (pm-polymode :name "brew-root" :hostmode 'poly-text-hostmode) - "Brew root configuration.") - -(define-obsolete-variable-alias 'pm-poly/html 'poly-html-root-polymode "v0.2") -(defvar poly-html-root-polymode - (pm-polymode :name "html-root" :hostmode 'poly-html-hostmode) - "HTML root configuration.") - -(define-obsolete-variable-alias 'pm-poly/C++ 'poly-c++-root-polymode "v0.2") -(defvar poly-c++-root-polymode - (pm-polymode :name "c++-root" :hostmode 'poly-c++-hostmode) - "C++ root configuration.") - -(define-obsolete-variable-alias 'pm-poly/latex 'poly-latex-root-polymode "v0.2") -(defvar poly-latex-root-polymode - (pm-polymode :name "latex-root" :hostmode 'poly-latex-hostmode) - "LaTeX root configuration.") - -(defvar poly-js-root-polymode - (pm-polymode :name "js-root" :hostmode 'poly-js-hostmode) - "JS root polymode.") - -(defvar poly-coffee-root-polymode - (pm-polymode :name "coffee-root" :hostmode 'poly-coffee-hostmode) - "JS root polymode.") - -(provide 'polymode-base) -;;; polymode-base.el ends here diff --git a/elpa/polymode-20200411.915/polymode-base.elc b/elpa/polymode-20200411.915/polymode-base.elc deleted file mode 100644 index 394727d590b97cfc1731f35827e6d37ef9a63d3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9056 zcmdU!OK;mo5XYUOKmqjw^q7s^!V+vM;zOilUz{2NlETfw@u5K7!-`y4j44v#Qc9Fh z-^0gG0Nzx2QG1ghn*N0m1VU$Qyeg{`HK%-e>1>ATE}T$#jvcqdPx zHkJwFo+mt(N71K4W4dz>FM@l7QNr9POgK2Nlesp5l2Ci~{_^cx<}P^5-2^0_Qg|ME zOh(M*A)5&nM7$CteH6(Aj{{%CELnh~VXC)#PadZrBfs&DP$o`JS$F&~|wu*x7610L~_~nWD27m-Umu$7v z7LiO|a*vaj1_qU&I}81Q^(Eg3PuuWdEm&s9KA#16yX8`Z$$+ia30v}ep+z$p1p;0T zL?9n_xET$NL#$ngvuGW9|1f9JJGwAz_68zToOu+(r^ew!S%>#>_`KIw8XF|_Q^gwj zQtLDLdI1C6;Ei9VE!Qxg$4n$Lwo2k#l}J#m>t(@~x|ptNC` zk*=F|*B}Y(e6_%rEA^=szxM;nG^?y;4E(b{?}2G_5MWl7JR|C67X4JHV2APOwx~L1>J0qiYC1@J%{yp;f$*$Ao4$ zRcNH4xqGaNYR80rIUj0N?idZrnsyEhOf6v2p?#2hf-S7W5xLWPw9gvt%;1 zx&|ZQiTJE|khv!$lPVIWqB&7&vf9CrW6nl3E9Z)7jGeCGStQGJ077d|aB7_xX=r9s z71fRg{cz2;2B&VJ0bq@8q(i2*`)wxC0O2lcZp|vL% zwNxVw&8b!u)s6)Haw^oQ+y`1?t8;Vlcs<*y6hZ6zfFTXdV5*|p!JuCbh8k7COuILC zSaIoQ>mz0F2~KSrBGu81r!K4=kn+qCr47rF#xT5eZFIRjIZ?^uo}BCnPi^-O0=JAY z6-n)2z%8e82~VNs4vjN|Y#uOnCY@Wb;_OGEqInSRz0#BJbHPd)niHuis+|`4<+!L( zIfZQ4pYB=;!3rr+V9?rA64hn~q@fv1Ra83|^vl6eqY4;X@7zwpmS-7**7pHJ8k)gW zMYV%LzZ?uTDuZ!GPw9YSgl9*!GYQk-KT6VVdKOPnpCq%zvKn#Ot zi*x^O9n(2x{e-AN4U)*Er6)wW8-U1r-ecOQs^nKTz&MuvgjP7MRA}u^PeH5h$EWh< z=Fh7KP-#%pL?w6Ir9xF1shrBhctSgHtyEwVQ_RU8o5`4AxUVM)%(7}(+e9Su+696& zbsiI=6MdK3exx)}+lG(L#9>$bM*Q^vDouKtxD. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;;; Code: - -(require 'eieio) -(require 'eieio-base) -(require 'eieio-custom) - -(defvar pm--object-counter 0) - -(defun pm--filter-slots (slots) - (delq nil (mapcar (lambda (slot) - (unless (or (= (elt (symbol-name slot) 0) ?-) - (eq slot 'parent-instance) - (eq slot 'name)) - (intern (concat ":" (symbol-name slot))))) - slots))) - -(defclass pm-root (eieio-instance-inheritor) - ((name - :initarg :name - :initform "UNNAMED" - :type string - :custom string - :documentation - "Name of the object used to for display and info.") - (-props - :initform '() - :type list - :documentation - "[Internal] Plist used to store various extra metadata such as user history. -Use `pm--prop-get' and `pm--prop-put' to place key value pairs -into this list.")) - "Root polymode class.") - -(cl-defmethod eieio-object-name-string ((obj pm-root)) - (eieio-oref obj 'name)) - -(cl-defmethod clone ((obj pm-root) &rest params) - (let ((new-obj (cl-call-next-method obj))) - ;; Emacs bug: clone method for eieio-instance-inheritor instantiates all - ;; slots for cloned objects. We want them unbound to allow for the healthy - ;; inheritance. - (pm--complete-clonned-object new-obj obj params))) - -(defun pm--complete-clonned-object (new-obj old-obj params) - (let ((old-name (eieio-oref old-obj 'name))) - (when (equal old-name (eieio-oref new-obj 'name)) - (let ((new-name (concat old-name ":"))) - (eieio-oset new-obj 'name new-name)))) - (dolist (descriptor (eieio-class-slots (eieio-object-class old-obj))) - (let ((slot (eieio-slot-descriptor-name descriptor))) - (unless (memq slot '(parent-instance name)) - (slot-makeunbound new-obj slot)))) - (when params - (shared-initialize new-obj params)) - new-obj) - -(defun pm--safe-clone (end-class obj &rest params) - "Clone to an object of END-CLASS. -If END-CLASS is same as class of OBJ then just call `clone'. -Otherwise do a bit more work by setting extra slots of the -end-class. PARAMS are passed to clone or constructor functions." - (if (eq end-class (eieio-object-class obj)) - (apply #'clone obj params) - (let ((new-obj (pm--complete-clonned-object - (apply end-class params) - obj params))) - (eieio-oset new-obj 'parent-instance obj) - new-obj))) - -(defclass pm-polymode (pm-root) - ((hostmode - :initarg :hostmode - :initform nil - :type symbol - :custom symbol - :documentation - "Symbol pointing to a `pm-host-chunkmode' object. -When nil, any host-mode will be matched (suitable for -poly-minor-modes. ") - (innermodes - :initarg :innermodes - :type list - :initform nil - :custom (repeat symbol) - :documentation - "List of inner-mode names (symbols) associated with this polymode. -A special marker :inherit in this list is replaced with the -innermodes of the parent. This allows for a simple way to add -innermodes to the child without explicitly listing all the -innermodes of the parent.") - (exporters - :initarg :exporters - :initform '(pm-exporter/pandoc) - :custom (repeat symbol) - :documentation - "List of names of polymode exporters available for this polymode.") - (exporter - :initarg :exporter - :initform nil - :type symbol - :custom symbol - :documentation - "Current exporter name. -If non-nil should be the name of the default exporter for this -polymode. Can be set with `polymode-set-exporter' command.") - (weavers - :initarg :weavers - :initform '() - :type list - :custom (repeat symbol) - :documentation - "List of names of polymode weavers available for this polymode.") - (weaver - :initarg :weaver - :initform nil - :type symbol - :custom symbol - :documentation - "Current weaver name. -If non-nil this is the default weaver for this polymode. Can be -dynamically set with `polymode-set-weaver'") - (switch-buffer-functions - :initarg :switch-buffer-functions - :initform '() - :type list - :custom (repeat symbol) - :documentation - "List of functions to run at polymode buffer switch. -Each function is run with two arguments, OLD-BUFFER and -NEW-BUFFER.") - (keylist - :initarg :keylist - :initform 'polymode-minor-mode-map - :type (or symbol list) - :custom (choice (symbol :tag "Keymap") - (repeat (cons string symbol))) - :documentation - "A list of elements of the form (KEY . BINDING). -This slot is reserved for building hierarchies through cloning -and should not be used in `define-polymode'.") - (keep-in-mode - :initarg :keep-in-mode - :initform nil - :type symbol - :custom symbol - :documentation - ;; NB: Using major-modes instead of innermode symbols for the sake of - ;; simplicity of the implementation and to allow for auto-modes. - "Major mode to keep in when polymode switches implementation buffers. -When a special symbol 'host, keep in hostmode. The buffer with -this major mode must be installed by one of the innermodes or the -hostmode. If multiple innermodes installed buffers of this mode, -the first buffer is used.") - - (-minor-mode - :initform 'polymode-minor-mode - :initarg -minor-mode - :type symbol - :documentation - "[Internal] Symbol pointing to minor-mode function.") - (-hostmode - :type (or null pm-chunkmode) - :documentation - "[Dynamic] Dynamically populated `pm-chunkmode' object.") - (-innermodes - :type list - :initform '() - :documentation - "[Dynamic] List of chunkmodes objects.") - (-auto-innermodes - :type list - :initform '() - :documentation - "[Dynamic] List of auto chunkmodes.") - (-buffers - :initform '() - :type list - :documentation - "[Dynamic] Holds all buffers associated with current buffer.")) - - "Polymode Configuration object. -Each polymode buffer holds a local variable `pm/polymode' -instantiated from this class or a subclass of this class.") - -(defclass pm-chunkmode (pm-root) - ((mode - :initarg :mode - :initform nil - :type symbol - :custom symbol - :documentation - "Emacs major mode for the chunk's body. -If :mode slot is nil (anonymous chunkmodes), use the value of -`polymode-default-inner-mode' is when set, or use the value of -the slot :fallback-mode. A special value 'host means to use the -host mode (useful auto-chunkmodes only).") - (fallback-mode - :initarg :fallback-mode - :initform 'poly-fallback-mode - :type symbol - :custom symbol - :documentation - "Mode to use when mode lookup fails for various reasons. Can - take a special value 'host. Note that, when set, - `polymode-default-inner-mode' takes precedence over this - value.") - (allow-nested - :initarg :allow-nested - :initform t - :type symbol - :custom symbol - :documentation - "Non-nil if other inner-modes are allowed to nest within this -inner-mode.") - (indent-offset - :initarg :indent-offset - :initform 2 - :type (or number symbol) - :custom (choice number symbol) - :documentation - "Indentation offset for this mode. -Currently this is only used in +indent and -indent cookies which -when placed on a line cause manual shift in indentation with -respect to how polymode would normally indent a line. Should be -used in cases when indentation of the line is incorrect. Can be a -number, a variable name or a function name to be called with no -arguments.") - (pre-indent-offset - :initarg :pre-indent-offset - :initform 0 - :type (or number function) - :custom (choice number function) - :documentation - "Function to compute the offset first line of this chunk. -Offset is relative to how the host mode would indent it. Called -with no-arguments with the point at the begging of the chunk.") - (post-indent-offset - :initarg :post-indent-offset - :initform 0 - :type (or number function) - :custom (choice number function) - :documentation - "Function to compute the offset of the following line after this chunk. -Offset is relative to how the host mode would indent it. Called -without arguments with point at the end of the chunk but before -the trailing white spaces if any.") - (protect-indent - :initarg :protect-indent - :initform nil - :type boolean - :custom boolean - :documentation - "Whether to narrowing to current span before indent.") - (protect-font-lock - :initarg :protect-font-lock - :initform nil - :type boolean - :custom boolean - :documentation - "Whether to narrow to span during font lock.") - (protect-syntax - :initarg :protect-syntax - :initform nil - :type boolean - :custom boolean - :documentation - "Whether to narrow to span when calling `syntax-propertize-function'.") - (adjust-face - :initarg :adjust-face - :initform nil - :type (or number face list) - :custom (choice number face sexp) - :documentation - "Fontification adjustment for the body of the chunk. -It should be either, nil, number, face or a list of text -properties as in `put-text-property' specification. If nil or 0 -no highlighting occurs. If a face, use that face. If a number, it -is a percentage by which to lighten/darken the default chunk -background. If positive - lighten the background on dark themes -and darken on light thems. If negative - darken in dark thems and -lighten in light thems.") - (init-functions - :initarg :init-functions - :initform '() - :type list - :custom hook - :documentation - "List of functions called after the initialization. -Functions are called with one argument TYPE in the buffer -associated with this chunkmode's span. TYPE is either 'host, -'head, 'body or 'tail. All init-functions in the inheritance -chain are called in parent-first order. Either customize this -slot or use `object-add-to-list' function.") - (switch-buffer-functions - :initarg :switch-buffer-functions - :initform '() - :type list - :custom hook - :documentation - "List of functions to run at polymode buffer switch. -Each function is run with two arguments, OLD-BUFFER and -NEW-BUFFER. In contrast to identically named slot in -`pm-polymode' class, these functions are run only when NEW-BUFFER -is of this chunkmode.") - (keep-in-mode - :initarg :keep-in-mode - :initform nil - :type symbol - :custom symbol - :documentation - "Major mode to keep in when polymode switches implementation buffers. -When a special symbol 'host, keep in hostmode. The buffer with -this major mode must be installed by one of the innermodes or the -hostmode. If multiple innermodes installed buffers of this mode, -the first buffer is used.") - - (-buffer - :type (or null buffer) - :initform nil)) - "Generic chunkmode object. -Please note that by default :protect-xyz slots are nil in -hostmodes and t in innermodes.") - -(defclass pm-host-chunkmode (pm-chunkmode) - ((allow-nested - ;; currently ignored in code as it doesn't make sense to not allow - ;; innermodes in hosts - :initform 'always)) - "This chunkmode doesn't know how to compute spans and takes -over all the other space not claimed by other chunkmodes in the -buffer.") - -(defclass pm-inner-chunkmode (pm-chunkmode) - ((protect-font-lock - :initform t) - (protect-syntax - :initform t) - (protect-indent - :initform t) - (body-indent-offset - :initarg :body-indent-offset - :initform 0 - :type (or number symbol function) - :custom (choice number symbol) - :documentation - "Indentation offset of the body span relative to the head. -Can be a number, symbol holding a number or a function. When a -function, it is called with no arguments at the beginning of the -body span.") - (can-nest - :initarg :can-nest - :initform nil - :type boolean - :custom boolean - :documentation - "Non-nil if this inner-mode can nest within other inner-modes. -All chunks can nest within the host-mode.") - (can-overlap - :initarg :can-overlap - :initform nil - :type boolean - :custom boolean - :documentation - "Non-nil if chunks of this type can overlap with other chunks of the same type. -See noweb for an example.") - (head-mode - :initarg :head-mode - :initform 'poly-head-tail-mode - :type symbol - :custom symbol - :documentation - "Chunk's head mode. -If set to 'host or 'body use host or body's mode respectively.") - (tail-mode - :initarg :tail-mode - :initform 'poly-head-tail-mode - :type symbol - :custom (choice (const nil :tag "From Head") - function) - :documentation - "Chunk's tail mode. -If set to 'host or 'body use host or body's mode respectively.") - (head-matcher - :initarg :head-matcher - :type (or string cons function) - :custom (choice string (cons string integer) function) - :documentation - "A regexp, a cons (REGEXP . SUB-MATCH) or a function. -When a function, the matcher must accept one argument that can -take either values 1 (forwards search) or -1 (backward search) -and behave similarly to how search is performed by -`re-search-forward' function. This function must return either -nil (no match) or a (cons BEG END) representing the span of the -head or tail respectively. See the code of `pm-fun-matcher' for a -simple example.") - (tail-matcher - :initarg :tail-matcher - :type (or string cons function) - :custom (choice string (cons string integer) function) - :documentation - "A regexp, a cons (REGEXP . SUB-MATCH) or a function. -Like :head-matcher but for the chunk's tail. Currently, it is -always called with the point at the end of the matched head and -with the positive argument (aka match forward).") - (adjust-face - :initform 2) - (head-adjust-face - :initarg :head-adjust-face - :initform 'bold - :type (or number face list) - :custom (choice number face sexp) - :documentation - "Head's face adjustment. -Can be a number, a list of properties or a face.") - (tail-adjust-face - :initarg :tail-adjust-face - :initform nil - :type (or null number face list) - :custom (choice (const :tag "From Head" nil) - number face sexp) - :documentation - "Tail's face adjustment. -A number, a list of properties, a face or nil. When nil, take the -configuration from :head-adjust-face.") - - (-head-buffer - :type (or null buffer) - :initform nil - :documentation - "[Internal] This buffer is set automatically to -buffer if -:head-mode is 'body, and to base-buffer if :head-mode is 'host.") - (-tail-buffer - :initform nil - :type (or null buffer) - :documentation - "[Internal] Same as -head-buffer, but for tail span.")) - - "Inner-chunkmodes represent innermodes (or sub-modes) within a -buffer. Chunks are commonly delimited by head and tail markup but -can be delimited by some other logic (e.g. indentation). In the -latter case, heads or tails have zero length and are not -physically present in the buffer.") - -(defclass pm-inner-auto-chunkmode (pm-inner-chunkmode) - ((mode-matcher - :initarg :mode-matcher - :type (or string cons function) - :custom (choice string (cons string integer) function) - :documentation - "Matcher used to retrieve the mode's symbol from the chunk's head. -Can be either a regexp string, cons of the form (REGEXP . -SUBEXPR) or a function to be called with no arguments. If a -function, it must return a string name of the mode. Function is -called at the beginning of the head span.")) - - "Inner chunkmodes with unknown (at definition time) mode of the -body span. The body mode is determined dynamically by retrieving -the name with the :mode-matcher.") - -(provide 'polymode-classes) -;;; polymode-classes.el ends here diff --git a/elpa/polymode-20200411.915/polymode-classes.elc b/elpa/polymode-20200411.915/polymode-classes.elc deleted file mode 100644 index 05e14d0eb6d11be4970105e2af4fea0d44443cdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20056 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 U0mT#eS}^y`1yUgqWNY{S54xF#zW@LL diff --git a/elpa/polymode-20200411.915/polymode-compat.el b/elpa/polymode-20200411.915/polymode-compat.el deleted file mode 100644 index 9397dd1a..00000000 --- a/elpa/polymode-20200411.915/polymode-compat.el +++ /dev/null @@ -1,388 +0,0 @@ -;;; polymode-compat.el --- Various compatibility fixes for other packages -*- lexical-binding: t -*- -;; -;; Author: Vitalie Spinu -;; Maintainer: Vitalie Spinu -;; Copyright (C) 2013-2019, Vitalie Spinu -;; Version: 0.1 -;; URL: https://github.com/polymode/polymode -;; Keywords: emacs -;; -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; This file is *NOT* part of GNU Emacs. -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 3, or -;; (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . -;; -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;; -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Code: - -(require 'polymode-core) -(require 'advice nil t) - -(defgroup polymode-compat nil - "Polymode compatibility settings." - :group 'polymode) - - -;;; emacs 25 compat - -(unless (fboundp 'assoc-delete-all) - - (defun assoc-delete-all (key alist &optional test) - "Delete from ALIST all elements whose car is KEY. -Compare keys with TEST. Defaults to `equal'. -Return the modified alist. -Elements of ALIST that are not conses are ignored." - (unless test (setq test #'equal)) - (while (and (consp (car alist)) - (funcall test (caar alist) key)) - (setq alist (cdr alist))) - (let ((tail alist) tail-cdr) - (while (setq tail-cdr (cdr tail)) - (if (and (consp (car tail-cdr)) - (funcall test (caar tail-cdr) key)) - (setcdr tail (cdr tail-cdr)) - (setq tail tail-cdr)))) - alist) - - (defun assq-delete-all (key alist) - "Delete from ALIST all elements whose car is `eq' to KEY. -Return the modified alist. -Elements of ALIST that are not conses are ignored." - (assoc-delete-all key alist #'eq))) - - - -;;; Various Wrappers for Around Advice - -(defvar *span* nil) - -;; advice doesn't provide named symbols. So we need to define specialized -;; wrappers for some key functions (unfinished) -(defmacro pm-define-wrapp-protected (fun) - "Declare protected function with the name fun--pm-wrapped. -Return new name (symbol). FUN is an unquoted name of a function." - (let* ((fun-name (symbol-name fun)) - (new-fun (intern (format "%s--pm-wrapped" fun-name))) - (new-doc (format " Error Protected function created with `pm-define-protected-wrapp'.\n\n%s" - (or (documentation fun) "")))) - `(progn - (defun ,new-fun (&rest args) - ,new-doc - (condition-case err - (apply ',fun args) - (error (message "(%s %s): %s" - ,fun-name - (mapconcat (lambda (x) (format "%s" x)) args " ") - (error-message-string err))))) - ',new-fun))) - -(defun pm-apply-protected (fun args) - (when fun - (condition-case-unless-debug err - (apply fun args) - (error (message "(%s %s): %s %s" - (if (symbolp fun) - (symbol-name fun) - "anonymous") - (mapconcat (lambda (x) (format "%s" x)) args " ") - (error-message-string err) - ;; (or (and (symbolp fun) "") - ;; (replace-regexp-in-string "\n" "" (format "[%s]" fun))) - "[M-x pm-debug-mode RET for more info]") - nil)))) - -(defun pm-override-output-position (orig-fun &rest args) - "Restrict returned value of ORIG-FUN to fall into the current span. -*span* in `pm-map-over-spans` has precedence over span at point. - ARGS are passed to ORIG-FUN." - (if (and polymode-mode pm/polymode) - (let ((range (or (pm-span-to-range *span*) - (pm-innermost-range))) - (pos (pm-apply-protected orig-fun args))) - (and pos - (min (max pos (car range)) - (cdr range)))) - (apply orig-fun args))) - -(defun pm-override-output-cons (orig-fun &rest args) - "Restrict returned (beg . end) of ORIG-FUN to fall into the current span. -*span* in `pm-map-over-spans` has precedence over span at point. -This will break badly if (point) is not inside expected range. -ARGS are passed to ORIG-FUN." - (if (and polymode-mode pm/polymode) - (let ((range (or (pm-span-to-range *span*) - (pm-innermost-range))) - (be (pm-apply-protected orig-fun args))) - (let ((out (and be - (cons (and (car be) - (min (max (car be) (car range)) - (cdr range))) - (and (cdr be) - (max (min (cdr be) (cdr range)) - (car range))))))) - out)) - (apply orig-fun args))) - -(defun pm-narrowed-override-output-cons (orig-fun &rest args) - "Restrict returned (beg . end) of ORIG-FUN to fall into the current span. -Run ORIG-FUN with buffer narrowed to span. *span* in -`pm-map-over-spans` has precedence over span at point. ARGS are -passed to ORIG-FUN." - (if (and polymode-mode pm/polymode) - (let ((*span* (or *span* (pm-innermost-span)))) - (pm-with-narrowed-to-span *span* - (apply #'pm-override-output-cons orig-fun args))) - (apply orig-fun args))) - -(defun pm-substitute-beg-end (orig-fun beg end &rest args) - "Execute ORIG-FUN with first BEG and END arguments limited to current span. -*span* in `pm-map-over-spans` has precedence over span at point. - ARGS are passed to ORIG-FUN." - (if (and polymode-mode pm/polymode) - (let* ((pos (if (and (<= (point) end) (>= (point) beg)) - (point) - end)) - (range (or (pm-span-to-range *span*) - (pm-innermost-range pos))) - (new-beg (max beg (car range))) - (new-end (min end (cdr range)))) - (pm-apply-protected orig-fun (append (list new-beg new-end) args))) - (apply orig-fun beg end args))) - -(defun pm-execute-narrowed-to-span (orig-fun &rest args) - "Execute ORIG-FUN narrowed to the current span. -*span* in `pm-map-over-spans` has precedence over span at point. - ARGS are passed to ORIG-FUN." - (if (and polymode-mode pm/polymode) - (pm-with-narrowed-to-span *span* - (pm-apply-protected orig-fun args)) - (apply orig-fun args))) - - -;;; Flyspel -(defun pm--flyspel-dont-highlight-in-chunkmodes (beg end _poss) - (or (car (get-text-property beg :pm-span)) - (car (get-text-property end :pm-span)))) - - -;;; C/C++/Java -(pm-around-advice 'c-before-context-fl-expand-region #'pm-override-output-cons) -;; (advice-remove 'c-before-context-fl-expand-region #'pm-override-output-cons) -(pm-around-advice 'c-state-semi-safe-place #'pm-override-output-position) -;; (advice-remove 'c-state-semi-safe-place #'pm-override-output-position) -;; c-font-lock-fontify-region calls it directly -;; (pm-around-advice 'font-lock-default-fontify-region #'pm-substitute-beg-end) -(pm-around-advice 'c-determine-limit #'pm-execute-narrowed-to-span) - - -;;; Python -(declare-function pm--first-line-indent "polymode-methods") -(defun pm--python-dont-indent-to-0 (fun) - "Fix indent FUN not to cycle to 0 indentation." - (if (and polymode-mode pm/type) - (let ((last-command (unless (eq (pm--first-line-indent) (current-indentation)) - last-command))) - (funcall fun)) - (funcall fun))) - -(pm-around-advice 'python-indent-line-function #'pm--python-dont-indent-to-0) - - -;;; Core Font Lock -(defvar font-lock-beg) -(defvar font-lock-end) -(defun pm-check-for-real-change-in-extend-multiline (fun) - "Protect FUN from inf-looping at ‘point-max’. -FUN is `font-lock-extend-region-multiline'. Propagate only real -changes." - ;; fixme: report this ASAP! - (let ((obeg font-lock-beg) - (oend font-lock-end) - (change (funcall fun))) - (and change - (not (eq obeg font-lock-beg)) - (not (eq oend font-lock-end))))) - -(pm-around-advice #'font-lock-extend-region-multiline - #'pm-check-for-real-change-in-extend-multiline) - - -;;; Editing - -;; (pm-around-advice 'fill-paragraph #'pm-execute-narrowed-to-span) -;; (advice-remove 'fill-paragraph #'pm-execute-narrowed-to-span) - -;; Synchronization of points does not work always as expected because some low -;; level functions move indirect buffers' points when operate in the base -;; buffer. See comment in `polymode-with-current-base-buffer'. - -;; (defun polymode-with-save-excursion (orig-fun &rest args) -;; "Execute ORIG-FUN surrounded with `save-excursion'. -;; This function is intended to be used in advises of functions -;; which modify the buffer in the background and thus trigger -;; `pm-switch-to-buffer' on next post-command hook in a wrong place. -;; ARGS are passed to ORIG-FUN." -;; (if polymode-mode -;; (save-excursion -;; (apply orig-fun args)) -;; (apply orig-fun args))) -;; -;; `save-buffer` misbehaves because after each replacement modification hooks -;; are triggered and poly buffer is switched in unpredictable fashion (#93). -;; This happens because basic-save-buffer uses save-buffer but not -;; save-excursion. Thus if base and indirect buffer don't have same point, at -;; the end of the function inner buffer will have the point from the base -;; buffer. Can be reproduced with (add-hook 'before-save-hook -;; 'delete-trailing-whitespace nil t) in the base buffer. -;; -;; (pm-around-advice 'basic-save-buffer #'polymode-with-save-excursion) -;; (advice-remove 'basic-save-buffer #'polymode-with-save-excursion) - -;; Query replace were probably misbehaving due to unsaved match data (#92). The -;; following is probably not necessary. (pm-around-advice 'perform-replace -;; 'pm-execute-inhibit-modification-hooks) - -;; No longer needed. See comment at pm-switch-to-buffer. -;; (defun polymode-newline-remove-hook-in-orig-buffer (fn &rest args) -;; "`newline' temporary sets `post-self-insert-hook' and removes it in wrong buffer. -;; This ARGS are passed to `newline'." -;; (if polymode-mode -;; (let* ((cbuf (current-buffer)) -;; (old-hook (buffer-local-value 'post-self-insert-hook cbuf))) -;; (prog1 (apply fn args) -;; (unless (eq cbuf (current-buffer)) -;; (unless (eq old-hook (buffer-local-value 'post-self-insert-hook cbuf)) -;; (with-current-buffer cbuf -;; (if old-hook -;; (setq post-self-insert-hook old-hook) -;; (kill-local-variable 'post-self-insert-hook))))))) -;; (apply fn args))) - -;; (pm-around-advice 'newline #'polymode-newline-remove-hook-in-orig-buffer) - - -;;; DESKTOP SAVE #194 #240 - -;; NB: desktop-save will not save indirect buffer. -;; For base buffer, if it's hidden as per #34, we will save it unhide by removing left whitespaces. - -(defun polymode-fix-desktop-buffer-info (fn buffer) - "Unhide poly-mode base buffer which is hidden as per #34. -This is done by modifying `uniquify-buffer-base-name' to `pm--core-buffer-name'." - (with-current-buffer buffer - (let ((out (funcall fn buffer)) - (name (buffer-name))) - (when (and polymode-mode - (not (buffer-base-buffer)) - (not (car out))) - (setf (car out) pm--core-buffer-name)) - out))) - -(declare-function desktop-buffer-info "desktop") -(with-eval-after-load "desktop" - (advice-add #'desktop-buffer-info :around #'polymode-fix-desktop-buffer-info)) - -(defun polymode-fix-desktop-save-buffer-p (_ bufname &rest _args) - "Dont save polymode buffers which are indirect buffers." - (with-current-buffer bufname - (not (and polymode-mode - (buffer-base-buffer))))) - -(declare-function desktop-save-buffer-p "desktop") -(with-eval-after-load "desktop" - (advice-add #'desktop-save-buffer-p :before-while #'polymode-fix-desktop-save-buffer-p)) - - -;;; MATLAB #199 -;; matlab-mode is an old non-standard mode which doesn't trigger -;; `after-change-major-mode-hook`. As a result polymode cannot detect that -;; font-lock-mode is on and sets the `poly-lock-allow-fontification` to nil. -;; Explicitly trigger font-lock as a workaround. -(add-hook 'matlab-mode-hook (lambda () (font-lock-mode t))) - - -;;; Undo Tree (#230) -;; Not clear why this fix works, or even why the problem occurs. -(declare-function make-undo-tree "undo-tree") -(defun polymode-init-undo-tree-maybe () - (when (and (boundp 'undo-tree-mode) - undo-tree-mode - (null buffer-undo-tree)) - (setq buffer-undo-tree (make-undo-tree)))) - -(eval-after-load 'undo-tree - '(add-hook 'polymode-init-inner-hook 'polymode-init-undo-tree-maybe)) - - -;;; EVIL -(declare-function evil-change-state "evil-core") -(defun polymode-switch-buffer-keep-evil-state-maybe (old-buffer new-buffer) - (when (and (boundp 'evil-state) - evil-state) - (let ((old-state (buffer-local-value 'evil-state old-buffer)) - (new-state (buffer-local-value 'evil-state new-buffer))) - (unless (eq old-state new-state) - (with-current-buffer new-buffer - (evil-change-state old-state)))))) - -(eval-after-load 'evil-core - '(add-hook 'polymode-after-switch-buffer-hook 'polymode-switch-buffer-keep-evil-state-maybe)) - - -;;; HL line -(defvar hl-line-mode) -(defvar global-hl-line-mode) -(declare-function hl-line-unhighlight "hl-line") -(declare-function global-hl-line-unhighlight "hl-line") -(add-to-list 'polymode-move-these-minor-modes-from-old-buffer 'hl-line-mode) -(defun polymode-switch-buffer-hl-unhighlight (old-buffer _new-buffer) - (with-current-buffer old-buffer - ;; We are moving hl-line-mode already - (when hl-line-mode - (hl-line-unhighlight)) - (when global-hl-line-mode - (global-hl-line-unhighlight)))) -(eval-after-load 'hl-line - '(add-hook 'polymode-after-switch-buffer-hook 'polymode-switch-buffer-hl-unhighlight)) - - -;;; YAS - -(with-eval-after-load "yasnippet" - (add-hook 'yas-before-expand-snippet-hook #'polymode-disable-post-command) - (add-hook 'yas-after-exit-snippet-hook #'polymode-enable-post-command)) - -(provide 'polymode-compat) - - -;;; Multiple cursors - -(defun polymode-disable-post-command-with-multiple-cursors (orig-fun &rest args) - (unless mc--executing-command-for-fake-cursor - (polymode-disable-post-command) - (apply orig-fun args) - (polymode-enable-post-command))) - -(with-eval-after-load "multiple-cursors-core" - (advice-add #'mc/execute-this-command-for-all-cursors :around - #'polymode-disable-post-command-with-multiple-cursors)) - -;;; polymode-compat.el ends here diff --git a/elpa/polymode-20200411.915/polymode-compat.elc b/elpa/polymode-20200411.915/polymode-compat.elc deleted file mode 100644 index a731445517a6203017720d2f2bbad9f49226eeb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 zcmd5?YjfMy5fvrHN!Ur-)F09|?PLu_5t$YW0q`N&?O0MoXFN@ujO-_ z#yO3PfxSa<65IPvKYsj}f}x-JL4j@mC`K{^c7jhUZa7JbMM%7_<}z!J{~^J4fC*to3?q_Irey><810d2eTay z%NxyOYX#R$zQ?C^Y?&GS1k0UH`2@SWjgCdnGxcH|W{T1znv8HB913@S{~`<&#bHDR z1>?L(Ms{BX5!7v;Wyv_5pFc|df~+sh2BIODOD~MVVnVqp3g|iCw&?!iN*Wk&{X9`27VMm*&EM0odz`IIu1+sI)sCI+_qb(?A^x`@AoS_wz{{s&VuoMWuM1a zapS(eQo($OpYVG9)a%L;z5L~GJyPoHfQ9YXwZghgba;osR6w%uiD&wrY+Zt4lqhmQO~#B&u)Iqc5K@`hHB~_{A9e z_Vo;a=1;c=#WF6KTYpc^r#)c{ufSo$Sm`&}vx9Bbz>Qf#+i(}R)zJV|?lD042$QTG zTYS&gV1h>LwR=FW{VR5-Hf-N(2&JrnAe?pl5kA2;vqtOA@!$~O?SljS#XJ|(<2rZV z!e95`;NbAlF<$x_&s;z38iUXx+oB*ayn@|=E=NogoB6!DEV78YLa|@m)O3(3kZNCR z{B)*)sq9)8>>bDPW^PeG3C8Si60OLx7{0TZ`D7eZ?So9^>=b8ton4|IGMskc!!g0~ z1pJ~22{0U2c$Oyr5kiE22BxlU=CqmD@8gd}HK;wsHUXrnMgFMQ_o;SOr`k+Xi>?rI zcq@o$VMz9~&3?9yK>U(={e+wj)i&M-ijL>G^%F!9SYn5!=0N*LpFF)`6LRP|V=z9- z9M$@R(53Tp{&L{47Lytf)Hboci#zXK9&Cy|xWD7;GSGCuiU>0s_~T$0Mo~r^L=F(J zK^h*^8=q-KK~z!UGJT24=FP(Lkt`tMjG@YzBIhhv4lTsYWILzS6JioF{Ph(R6bBqx?8ai>uNu)E^`0M`G`E*-&WvM?wp69R@g zUii^i5xn;EqsO1v?A72cM65_>GfWM^ILly%#JsXyHS~gPi;Wo4+6giln+Nk#8Y0l8 znF>^2#fZ5)Bl)4Ymkcc~gG@0Pi>!rud~;39)&sflEw0Zt3{Ax_7d={|(y%#@lRX#x|xY zh3GvUeN;Xu`4-Ax9oR);XMPM1!-Fu6RW?fUV)p2|jmtd;80{~v*KTXLnEh_TRqLrU zxRr|g^`8_p$&xQam_-jfc1}IN4}J*;R1;L|91A!)BYg%Yq^?pOXhap;RYvgDL(Zwd z0^A)9cZU)F9=JW7IRV|)roPnBbJEmkxk$a%_P<%%J2@!xEg^}Y)+kC6bvwHqV-(&i zG>Rj{k*TLi&ej_b25{KeM-aQzo+(aW+ISdO|1+nb`h4}j^7-;$LOJu!f5Q^q)s}#W z5ChM)gbj~=3otonXbKfbfg&MdZEfR2_HzuiUef1hF3y@_r`LyM9*`$GjNtio!s0W} z9N+W2hQYYeqVAOn#)Y~D&mhbY^AEb8Anoc?_sJoLW62S6icr{cdI2*1AM!PyjnDNR zyq%AGc@Y+n&IXs+U^2My&hD;Z?6wB3y>hzx6(I3`y>hztwYk8T`x~i)O6QgmvC*vD zTd(Y$tTS^1!8>oTo35`P;=gc{|&fG+oZ8?)t_4Ue89b{;k(O}%ATfy5>IQgXVn=12I(c;?3z=-oo)%F zEu-?LyKC|u*D-l#X`Ekt{`6+1}zm$gu^r7P)4 z*+-Ec%EA+!-%e8$C)Gav4AhHpeK^}Id&ba)$g_bBlK96d} z&ebTibAO=hH1d(pEtx;fySVFt>S)Aeov;zlzRhS($m5(8InJZ-3Rwfv#X@RIP9m7Y zCILEfxM-L`se-F<@ag^7KpSNpDe2%l+B)Bn{D3pSCjI##0BoUpj5#Zlj7~lA`11BdJ6CY{X0qIc?!)$PM9*G=_%Ft(+fH8}n>6Ivz7Z4Qm%c+cJU} z8Dz(4xz3gIZIbG0-y>6diZ-Q#gSxz~x zkCNaVs1=|wV^`i3c5Z>~cB(kN@)U0HoYqjYzr@}^wrBC0$sr^It-kNY$KYBe2+s!P;7 zw_>@p#LE7`Cl~FvTJ&W+L%O>m>L9Oh2NR*A+FI{5O@qwdkQV!LdR z4#F$AZGK)PX}O%sNZ=stv5Y}@fj^CkG+|s4KSHMx)XpB#M3a&!kiU5@%B?0hHKnuI zZezq1k6IFQZywsHNw-?&W!2XwR3^l&&MtQqsx^i3)%FLV9T=|PC(Fo!*7bAlwVH0U zP$^D4?eR%R7&O^OJLRVE_q9jP+QPSJ3B|iq);k^@!gnb5FJ`@GBMf&-8FX%6!lluj zM)j@bDLv+I4AGPQ&$_p#P0Qfox0RTskhk4*$;v8%7NgWUju|FU8dKcOtY?{mn}(j+ z?ruvIyri`+%H*<{QA~H-9xOr$67BDzy{rBx*lANO} zQ$&7GJW@Ycun+DFEOLre`Navj=&d4Bac{NkU6xpcaah=hwuxP2N`Xx$_$8>^mb;S; z-WK#FU?4G)NQ2BsyN=_$ZQeS!2lsRgF4L!Eepwj#=W6yoKH3ro*qSXXkHRqN=4qKI zOtmuAqR1kpjMmQLz;sV7Bs3ys?=?(f_4%iVwq_Z6(*3KsyoGRb6q>=XwA*u~Qd?bw zk;ykoC6>K;KDSomhF0SSt51~6t()0prJ_T`y_IZLJOE?f>OF9eCLyEh*{e#e8f_!& zfk|{TOeUEaC27zso^%>5N#wsbU;BQ)&~M?s-OB)_xo%O3V&GH67RQz2s?@T1~wW-I@94%@sEwYS6~d-b&Tj~GH<9whoBjw zc|Q~MIWuS=&@@_aYiBAW%>1$FEJ}KSbm3WfGyj@v^X7&inW4iD0?rSj!x<%(1Su(c z$uHNr(VXW;wE(_=Trf7AMP-FUTVFIOPqjFG~wkPni9#u}445{a%FP zfm@(uw#@vivA))=9?Q!-N7%)Ye|QL^~5Bih^y z(`j#t(<713lWf*$6dwNtn;sVl5(Zse&gziJc@amGQDB?;hku(l;!74hU@F(!&U|m# zNz9KBQ|Df)ma^pCaa~PL*Uik5{CZ9lNf(!4zdT181s|1lT!H^Bu^. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;;; Code: - -(require 'gv) -(require 'font-lock) -(require 'color) -(require 'polymode-classes) -(require 'format-spec) -(require 'subr-x) -(eval-when-compile - (require 'cl-lib) - (require 'derived)) - - -;;; ESSENTIAL DECLARATIONS -(defvar *span* nil) -(defvar-local pm/polymode nil) -(put 'pm/polymode 'permanent-local t) -(defvar-local pm/chunkmode nil) -(defvar-local pm/current nil) ;; fixme: unused -(defvar-local pm/type nil) ;; fixme: remove this -(defvar-local polymode-mode nil - "Non-nil if current \"mode\" is a polymode.") -(defvar pm--emacs>26 (version<= "26" emacs-version)) - -;; overwrites -(defvar-local pm--indent-region-function-original nil) -(defvar-local pm--fill-forward-paragraph-original nil) -(defvar-local pm--indent-line-function-original nil) -(defvar-local pm--syntax-propertize-function-original nil) - -;; silence the compiler -(defvar pm--output-file nil) -(defvar pm--input-buffer nil) -(defvar pm--input-file nil) -(defvar pm--export-spec nil) -(defvar pm--input-not-real nil) -(defvar pm--output-not-real nil) - -;; methods api from polymode-methods.el -(declare-function pm-initialize "polymode-methods") -(declare-function pm-get-buffer-of-mode "polymode-methods") -(declare-function pm-get-buffer-create "polymode-methods") -(declare-function pm-get-adjust-face "polymode-methods") -(declare-function pm-get-span "polymode-methods") - -;; eieio silence "unknown slot" -;; http://emacs.1067599.n8.nabble.com/Fixing-quot-Unknown-slot-quot-warnings-td419119.html -(eval-when-compile - (defclass dummy () - ((function) (from-to)))) - -(defun pm-object-name (obj) - ;; gives warnings on e25,26 but fine in e27 - (with-no-warnings - (eieio-object-name-string obj))) - -;; SHIELDS - -(defvar pm-allow-after-change-hook t) - -(defvar pm-allow-post-command-hook t) -(defun polymode-disable-post-command () - (when polymode-mode - (setq pm-allow-post-command-hook nil))) -(defun polymode-enable-post-command () - (when polymode-mode - (setq pm-allow-post-command-hook t))) - -;; We need this during cascaded call-next-method in pm-initialize. -innermodes -;; are initialized after the hostmode setup has taken place. This means that -;; pm-get-span and all the functionality that relies on it will fail to work -;; correctly during the initialization in the call-next-method. This is -;; particularly relevant to font-lock setup and user hooks. -(defvar pm-initialization-in-progress nil) - -(defvar pm-hide-implementation-buffers t) -(defvar-local pm--core-buffer-name nil) - -(defun pm--hidden-buffer-name () - (generate-new-buffer-name (concat " " pm--core-buffer-name))) - -(defun pm--visible-buffer-name () - (generate-new-buffer-name - (replace-regexp-in-string "^ +" "" pm--core-buffer-name))) - - - -;;; CUSTOM - -;;;###autoload -(defvar-local polymode-default-inner-mode nil - "Inner mode for chunks with unspecified modes. -Intended to be used as local variable in polymode buffers. A -special value 'host means use the host mode.") -;;;###autoload -(put 'polymode-default-inner-mode 'safe-local-variable 'symbolp) - -(defgroup polymode nil - "Object oriented framework for multiple modes based on indirect buffers" - :link '(emacs-commentary-link "polymode") - :group 'tools) - -(defgroup poly-modes nil - "Polymode Configuration Objects" - :group 'polymode) - -(defgroup poly-hostmodes nil - "Polymode Host Chunkmode Objects" - :group 'polymode) - -(defgroup poly-innermodes nil - "Polymode Chunkmode Objects" - :group 'polymode) - -(defcustom polymode-display-output-file t - "Whether to display woven and exported output buffers. -When non-nil automatically visit and call `display-buffer' on -output files from processor engines (e.g. weavers and exporters). -Can also be a function, in which case it is called with the -output file name as the only argument. If this function returns -non-nil, the file is visited and displayed with `display-buffer'. -See `display-buffer-alist' for how to customize the display." - :group 'polymode - :type '(choice (const t) (const nil) function)) - -(defcustom polymode-display-process-buffers t - "When non-nil, display weaving and exporting process buffers." - :group 'polymode - :type 'boolean) - -(defcustom polymode-skip-processing-when-unmodified t - "If non-nil, consider modification times of input and output files. -Skip weaving or exporting process when output file is more recent -than the input file." - :group 'polymode - :type 'boolean) - -(define-obsolete-variable-alias 'polymode-mode-name-override-alist 'polymode-mode-name-aliases "2018-08") -(define-obsolete-variable-alias 'polymode-mode-name-alias-alist 'polymode-mode-name-aliases "2019-04") -(defcustom polymode-mode-name-aliases - '((elisp . emacs-lisp) - (el . emacs-lisp) - (bash . sh-mode)) - "An alist of inner mode overrides. -When inner mode is automatically detected from the header of the -inner chunk (such as in markdown mode), the detected symbol might -not correspond to the desired mode. This alist maps discovered -symbols into desired modes. For example - - (add-to-list 'polymode-mode-name-aliases '(julia . ess-julia)) - -will cause installation of `ess-julia-mode' in markdown ```julia chunks." - :group 'polymode - :type 'alist) - -(defvar polymode-mode-abbrev-aliases nil - "An alist of abbreviation mappings from mode names to their abbreviations. -Used to compute mode post-fixes in buffer names. Example: - - (add-to-list 'polymode-mode-abbrevs-aliases '(\"ess-r\" . \"R\"))") - -(defvar polymode-before-switch-buffer-hook nil - "Hook run just before switching to a different polymode buffer. -Each function is run with two arguments `old-buffer' and -`new-buffer'. This hook is commonly used to transfer state -between buffers. Hook is run before transfer of variables, modes -and overlays.") - -(define-obsolete-variable-alias 'polymode-switch-buffer-hook 'polymode-after-switch-buffer-hook "v0.2") -(defvar polymode-after-switch-buffer-hook nil - "Hook run after switching to a different polymode buffer. -Each function is run with two arguments `old-buffer' and -`new-buffer'. This hook is commonly used to transfer state -between buffers. Slot :switch-buffer-functions in `pm-polymode' -and `pm-chunkmode' objects provides same functionality for -narrower scope.") - -(defvar polymode-init-host-hook nil - "Hook run on initialization of every hostmode. -Ran in a base buffer from `pm-initialze' -methods. Slot :init-functions in `pm-polymode' objects provides -similar hook for more focused scope. See -`polymode-init-inner-hook' and :init-functions slot in -`pm-chunkmode' objects for similar hooks for inner chunkmodes.") - -(defvar polymode-init-inner-hook nil - "Hook run on initialization of every `pm-chunkmode' object. -The hook is run in chunkmode's body buffer from `pm-initialze' -`pm-chunkmode' methods. Slot :init-functions `pm-chunkmode' -objects provides same functionality for narrower scope. See also -`polymode-init-host-hook'.") - - -;;; Mode Macros - -(defun polymode--define-chunkmode (constructor name parent doc key-args) - (let* ((type (format "%smode" - (replace-regexp-in-string - "-.*$" "" (replace-regexp-in-string "^pm-" "" (symbol-name constructor))))) - (sname (symbol-name name)) - (root-name (replace-regexp-in-string (format "poly-\\|-%s" type) "" sname))) - (when (keywordp parent) - (progn - (push doc key-args) - (push parent key-args) - (setq doc nil parent nil))) - - (unless (stringp doc) - (when (keywordp doc) - (push doc key-args)) - (setq doc (format "%s for %s chunks." (capitalize type) root-name))) - - (unless (string-match-p (format "-%s$" type) sname) - (error "%s must end in '-%s'" (capitalize type) type)) - (unless (symbolp parent) - ;; fixme: check inheritance - (error "PARENT must be a name of an `%s'" type)) - - `(progn - (makunbound ',name) - (defvar ,name - ,(if parent - `(pm--safe-clone ',constructor ,parent :name ,root-name ,@key-args) - `(,constructor :name ,root-name ,@key-args)) - ,doc)) - ;; `(progn - ;; (defvar ,name) - ;; (defcustom ,name nil - ;; ,doc - ;; :group ',(intern (format "poly-%ss" type)) - ;; :type 'object) - ;; (setq ,name - ;; ,(if parent - ;; `(clone ,parent :name ,root-name ,@key-args) - ;; `(,constructor :name ,root-name ,@key-args)))) - )) - -;;;###autoload -(defmacro define-hostmode (name &optional parent doc &rest key-args) - "Define a hostmode with name NAME. -Optional PARENT is a name of a hostmode to be derived (cloned) -from. If missing, the optional documentation string DOC is -generated automatically. KEY-ARGS is a list of key-value pairs. -See the documentation of the class `pm-host-chunkmode' for -possible values." - (declare (doc-string 3)) - (polymode--define-chunkmode 'pm-host-chunkmode name parent doc key-args)) - -;;;###autoload -(defmacro define-innermode (name &optional parent doc &rest key-args) - "Ddefine an innermode with name NAME. -Optional PARENT is a name of a innermode to be derived (cloned) -from. If missing the optional documentation string DOC is -generated automatically. KEY-ARGS is a list of key-value pairs. -See the documentation of the class `pm-inner-chunkmode' for -possible values." - (declare (doc-string 3)) - (polymode--define-chunkmode 'pm-inner-chunkmode name parent doc key-args)) - -;;;###autoload -(defmacro define-auto-innermode (name &optional parent doc &rest key-args) - "Ddefine an auto innermode with name NAME. -Optional PARENT is a name of an auto innermode to be -derived (cloned) from. If missing the optional documentation -string DOC is generated automatically. KEY-ARGS is a list of -key-value pairs. See the documentation of the class -`pm-inner-auto-chunkmode' for possible values." - (declare (doc-string 3)) - (polymode--define-chunkmode 'pm-inner-auto-chunkmode name parent doc key-args)) - - - -;;; MESSAGES - -(defvar pm-extra-span-info nil) - -(defun pm-format-span (&optional span prefixp) - (let* ((span (cond - ((number-or-marker-p span) (pm-innermost-span span)) - ((null span) (pm-innermost-span)) - (span))) - (message-log-max nil) - (beg (nth 1 span)) - (end (nth 2 span)) - (type (and span (or (car span) 'host))) - (oname (if span - (eieio-object-name (nth 3 span)) - (current-buffer))) - (extra (if pm-extra-span-info - (format (if prefixp "%s " " (%s)") pm-extra-span-info) - ""))) - (if prefixp - (format "%s[%s %s-%s %s]" extra type beg end oname) - (format "[%s %s-%s %s]%s" type beg end oname extra)))) - - -;;; SPANS - -(defsubst pm-base-buffer () - "Return base buffer of current buffer, or the current buffer if it's direct." - (or (buffer-base-buffer (current-buffer)) - (current-buffer))) - -(defun pm-span-mode (&optional span) - "Retrieve the major mode associated with SPAN." - (pm--true-mode-symbol - (buffer-local-value 'major-mode (pm-span-buffer span)))) - -(defun pm-span-buffer (&optional span) - "Retrieve the buffer associated with SPAN." - (setq span (or span (pm-innermost-span))) - (let* ((chunkmode (nth 3 span)) - (type (pm-true-span-type span))) - (if type - (pm-get-buffer-create chunkmode type) - ;; ignore span's chunkmode as inner spans can request host span - (pm-get-buffer-create (oref pm/polymode -hostmode))))) - -(defun pm-true-span-type (chunkmode &optional type) - "Retrieve the TYPE of buffer to be installed for CHUNKMODE. -`pm-innermost-span' returns a raw type (head, body or tail) but -the actual type installed depends on the values of :host-mode and -:tail-mode of the CHUNKMODE object. Always return nil if TYPE is -nil (aka a host span). CHUNKMODE could also be a span, in which -case TYPE is ignored." - ;; fixme: this works on inner modes only. Fix naming. - (when (listp chunkmode) - ;; a span - (setq type (car chunkmode) - chunkmode (nth 3 chunkmode))) - (when (object-of-class-p chunkmode 'pm-inner-chunkmode) - (unless (or (null type) (eq type 'host)) - (with-slots (mode head-mode tail-mode fallback-mode) chunkmode - (cond ((eq type 'body) - (unless (or (eq mode 'host) - ;; for efficiency don't check if modes are valid - (and (null mode) - (if polymode-default-inner-mode - (eq polymode-default-inner-mode 'host) - (eq fallback-mode 'host)))) - 'body)) - ((eq type 'head) - (cond ((eq head-mode 'host) nil) - ((eq head-mode 'body) 'body) - (t 'head))) - ((eq type 'tail) - (cond ((eq tail-mode 'host) nil) - ((eq tail-mode 'body) 'body) - (t 'tail))) - (t (error "Type must be one of nil, 'host, 'head, 'tail or 'body"))))))) - -(defun pm-cache-span (span) - ;; cache span - (unless pm-initialization-in-progress - (with-silent-modifications - ;; (message "caching: %s %s" (car span) (pm-span-to-range span)) - (let ((sbeg (nth 1 span)) - (send (nth 2 span))) - (put-text-property sbeg send :pm-span span) - (put-text-property sbeg send :pm-mode (pm-span-mode span)))))) - -(defun pm-flush-span-cache (beg end &optional buffer) - (with-silent-modifications - (remove-list-of-text-properties beg end '(:pm-span) buffer))) - -(defun pm--outspan-p (span thespan) - "Non-nil if SPAN outspans THESPAN. -Return non-nil if SPAN contains THESPAN's chunk (strictly from -the front)." - (let ((type (car thespan)) - (beg (nth 1 thespan)) - (end (nth 2 thespan)) - (sbeg (nth 1 span)) - (send (nth 2 span))) - ;; The following check is to ensure that the outer span really - ;; spans outside of the entire thespan's chunk (poly-markdown#6) - (and - (< sbeg beg) - (cond - ((eq type 'body) - (and (let ((hspan (pm-get-span (nth 3 thespan) (1- beg)))) - (< sbeg (nth 1 hspan))) - ;; Ends might coincide due to eob - (if (< end send) - (let ((tspan (pm-get-span (nth 3 thespan) (1+ end)))) - (<= (nth 2 tspan) send)) - (= end send)))) - ((eq type 'tail) - (let ((bspan (pm-get-span (nth 3 thespan) (1- beg)))) - (when (< sbeg (nth 1 bspan)) - (let ((hspan (pm-get-span (nth 3 thespan) (1- (nth 1 bspan))))) - (< sbeg (nth 1 hspan)))))) - ;; Ends might coincide due to eob - ((eq type 'head) - (if (< end send) - (let ((bspan (pm-get-span (nth 3 thespan) (1+ end)))) - (if (< (nth 2 bspan) send) - (let ((tspan (pm-get-span (nth 3 thespan) (1+ (nth 2 bspan))))) - (<= (nth 2 tspan) send)) - (= (nth 2 bspan) send))) - (= end send))))))) - -(defun pm--intersect-spans (thespan span) - ;; ASSUMPTION: first thespan should be of the form (nil MIN MAX HOSTMODE) - (when span - (let ((allow-nested (eieio-oref (nth 3 span) 'allow-nested)) - (is-host (null (car span)))) - (cond - ;; 1. nil means host and it can be an intersection of spans returned - ;; by two neighboring inner chunkmodes. When `allow-nested` is - ;; 'always the innermode essentially behaves like the host-mode. - ((or is-host (eq allow-nested 'always)) - ;; when span is already an inner span, new host spans are irrelevant - (unless (car thespan) - (setq thespan - (list (unless is-host (car span)) - (max (nth 1 span) (nth 1 thespan)) - (min (nth 2 span) (nth 2 thespan)) - (nth 3 (if is-host thespan span)))))) - ;; 2. Inner span - ((and (>= (nth 1 span) (nth 1 thespan)) - (<= (nth 2 span) (nth 2 thespan))) - ;; Accepted only nested spans. In case of crossing (incorrect spans), - ;; first span wins. - (when (or (null (car thespan)) - (eieio-oref (nth 3 span) 'can-nest)) - (setq thespan span))) - ;; 3. Outer span; overwrite previous span if nesting is not allowed. - ;; This case is very hard because it can result in big invalid span - ;; when a head occurs within a inner-chunk. For example $ for inline - ;; latex can occur within R or python. The hard way to fix this would - ;; require non-local information (e.g. checking if outer span's - ;; extremities are within a host span) and still might not be the full - ;; proof solution. Instead, make use of 'allow-nested property. - ((and (eq allow-nested t) - (car thespan) ; span is an inner span - (not (eieio-oref (nth 3 thespan) 'can-nest)) - (pm--outspan-p span thespan)) - (setq thespan span))))) - thespan) - -(defun pm--get-intersected-span (config &optional pos) - ;; fixme: host should be last, to take advantage of the chunkmodes computation? - (let* ((start (point-min)) - (end (point-max)) - (pos (or pos (point))) - (hostmode (oref config -hostmode)) - (chunkmodes (cons hostmode (oref config -innermodes))) - (thespan (list nil start end hostmode))) - (dolist (cm chunkmodes) - ;; Optimization opportunity: this searches till the end of buffer but the - ;; outermost pm-get-span caller has computed a few spans already so we can - ;; pass limits or narrow to pre-computed span. - (setq thespan (pm--intersect-spans thespan (pm-get-span cm pos)))) - - (unless (and (<= start end) (<= pos end) (>= pos start)) - (error "Bad polymode selection: span:%s pos:%s" - (list start end) pos)) - (pm-cache-span thespan) - thespan)) - -(defun pm--chop-span (span beg end) - ;; destructive! - (when (> beg (nth 1 span)) - (setcar (cdr span) beg)) - (when (< end (nth 2 span)) - (setcar (cddr span) end)) - span) - -(defun pm--innermost-span (config &optional pos) - (let ((pos (or pos (point))) - (omin (point-min)) - (omax (point-max)) - ;; `re-search-forward' and other search functions trigger full - ;; `internal--syntax-propertize' on the whole buffer on every - ;; single buffer modification. This is a small price to pay for a - ;; much improved efficiency in modes which heavily rely on - ;; `syntax-propertize' like `markdown-mode'. - (parse-sexp-lookup-properties nil) - (case-fold-search t)) - (save-excursion - (save-restriction - (widen) - (let ((span (pm--get-intersected-span config pos))) - (if (= omax pos) - (when (and (= omax (nth 1 span)) - (> omax omin)) - ;; When pos == point-max and it's beg of span, return the - ;; previous span. This occurs because the computation of - ;; pm--get-intersected-span is done on a widened buffer. - (setq span (pm--get-intersected-span config (1- pos)))) - (when (= pos (nth 2 span)) - (error "Span ends at %d in (pm--inermost-span %d) %s" - pos pos (pm-format-span span)))) - (pm--chop-span span omin omax)))))) - -(defun pm--cached-span (&optional pos) - ;; fixme: add basic miss statistics - (unless pm-initialization-in-progress - (let* ((omin (point-min)) - (omax (point-max)) - (pos (or pos (point))) - (pos (if (= pos omax) - (max (point-min) (1- pos)) - pos)) - (span (get-text-property pos :pm-span))) - (when span - (save-restriction - (widen) - (let* ((beg (nth 1 span)) - (end (1- (nth 2 span)))) - (when (and (< end (point-max)) ; buffer size might have changed - (<= pos end) - (<= beg pos) - (eq span (get-text-property beg :pm-span)) - (eq span (get-text-property end :pm-span)) - (not (eq span (get-text-property (1+ end) :pm-span))) - (or (= beg (point-min)) - (not (eq span (get-text-property (1- beg) :pm-span))))) - (pm--chop-span (copy-sequence span) omin omax)))))))) - -(define-obsolete-function-alias 'pm-get-innermost-span 'pm-innermost-span "2018-08") -(defun pm-innermost-span (&optional pos no-cache) - "Get span object at POS. -If NO-CACHE is non-nil, don't use cache and force re-computation -of the span. Return a cons (type start end chunkmode). POS -defaults to point. Guarantied to return a non-empty span." - (when (and pos (or (< pos (point-min)) (> pos (point-max)))) - (signal 'args-out-of-range - (list :pos pos - :point-min (point-min) - :point-max (point-max)))) - (save-match-data - (or (unless no-cache - (pm--cached-span pos)) - (pm--innermost-span pm/polymode pos)))) - -(defun pm-span-to-range (span) - (and span (cons (nth 1 span) (nth 2 span)))) - -(define-obsolete-function-alias 'pm-get-innermost-range 'pm-innermost-range "2018-08") -(defun pm-innermost-range (&optional pos no-cache) - (pm-span-to-range (pm-innermost-span pos no-cache))) - -(defun pm-fun-matcher (matcher) - "Make a function matcher given a MATCHER. -MATCHER is one of the forms accepted by \=`pm-inner-chunkmode''s -:head-matcher slot." - (cond - ((stringp matcher) - (lambda (ahead) - (if (< ahead 0) - (if (re-search-backward matcher nil t) - (cons (match-beginning 0) (match-end 0))) - (if (re-search-forward matcher nil t) - (cons (match-beginning 0) (match-end 0)))))) - ((functionp matcher) - matcher) - ((consp matcher) - (lambda (ahead) - (when (re-search-forward (car matcher) nil t ahead) - (cons (match-beginning (cdr matcher)) - (match-end (cdr matcher)))))) - (t (error "Head and tail matchers must be either regexp strings, cons cells or functions")))) - -(defun pm-same-indent-tail-matcher (_arg) - "Get the end position of block with the higher indent than the current column. -Used as tail matcher for blocks identified by same indent. See -function `poly-slim-mode' for examples. ARG is ignored; always search -forward." - ;; we are at the head end; so either use head indent or this code indent - (let* ((cur-indent (current-indentation)) - (cur-col (current-column)) - (block-col (if (< cur-indent cur-col) - cur-indent - (1- cur-indent))) - (end (point-at-eol))) - (forward-line 1) - (while (and (not (eobp)) - (or (looking-at-p "[ \t]*$") - (and (> (current-indentation) block-col) - (setq end (point-at-eol))))) - (forward-line 1)) - ;; end at bol for the sake of indentation - (setq end (min (point-max) (1+ end))) - (cons end end))) - -(defun pm--get-property-nearby (property accessor ahead) - (let ((ahead (> ahead 0))) - (let* ((pos (if ahead - (if (get-text-property (point) property) - (point) - (next-single-property-change (point) property)) - (previous-single-property-change (point) property))) - (val (when pos - (or (get-text-property pos property) - (and (setq pos (previous-single-property-change pos property nil (point-min))) - (get-text-property pos property)))))) - (when val - (if accessor - (let ((val (save-excursion - (goto-char pos) - (funcall accessor val)))) - (cond - ((numberp val) (cons val val)) - ((consp val) (cons (car val) (if (listp (cdr val)) - (cadr val) - (cdr val)))) - (t (cons pos (next-single-property-change pos property nil (point-max)))))) - (cons pos (next-single-property-change pos property nil (point-max)))))))) - -(defun pm-make-text-property-matcher (property &optional accessor) - "Return a head or tail matcher for PROPERTY with ACCESSOR. -ACCESSOR is either a function or a keyword. When a function it is -applied to the PROPERTY's value to retrieve the position of the -head in the buffer. It should return either a number in which -case head has 0 length, a cons of the form (BEG . END), or a -list (BEG END). ACCESSOR is called at the beginning of the -PROPERTY region. When ACCESSOR is nil the head span is the region -covered by the same value of PROPERTY. When ACCESSOR is a keyword -the property is searched as when ACCESSOR is nil but is adapted -according to the keyword. Currently :inc-end means increment the -END of the span, when :dec-beg, decrement the beginning of the -span." - (lambda (ahead) - (if (keywordp accessor) - (let ((loc (pm--get-property-nearby property nil ahead))) - (when loc - (cond - ((eq accessor :inc-end) (setcdr loc (1+ (cdr loc)))) - ((eq accessor :dec-beg) (setcar loc (1- (cdr loc)))) - (t (error "Invalid ACCESSOR keyword"))) - loc)) - (pm--get-property-nearby property accessor ahead)))) - -(defun pm--span-at-point (head-matcher tail-matcher &optional pos can-overlap do-chunk) - "Span detector with head and tail matchers. -HEAD-MATCHER and TAIL-MATCHER is as in :head-matcher slot of -`pm-inner-chunkmode' object. POS defaults to (point). When -CAN-OVERLAP is non-nil nested chunks of this type are allowed. - -Return a list of the form (TYPE SPAN-START SPAN-END) where TYPE -is one of the following symbols: - nil - pos is between ‘point-min’ and head-matcher, or between - tail-matcher and ‘point-max’ - body - pos is between head-matcher and tail-matcher (exclusively) - head - head span - tail - tail span - -Non-nil DO-CHUNK makes this function return a list of the -form (TYPE HEAD-START HEAD-END TAIL-START TAIL-END)." - (setq pos (or pos (point))) - (save-restriction - (widen) - (save-excursion - (goto-char pos) - (let* ((at-max (= pos (point-max))) - (head-matcher (pm-fun-matcher head-matcher)) - (tail-matcher (pm-fun-matcher tail-matcher)) - (head1 (funcall head-matcher -1))) - (if head1 - (if (or (< pos (cdr head1)) - (and at-max (= (cdr head1) pos))) - ;; -----| - ;; host)[head) ; can occur with sub-head == 0 only - (if do-chunk - (pm--find-tail-from-head pos head1 head-matcher tail-matcher can-overlap 'head) - (list 'head (car head1) (cdr head1))) - ;; ------------------------ - ;; host)[head)[body)[tail)[host)[head)[body) - (pm--find-tail-from-head pos head1 head-matcher tail-matcher can-overlap do-chunk)) - ;; ---------- - ;; host)[head)[body)[tail)[host - (goto-char (point-min)) - (let ((head2 (funcall head-matcher 1))) - (if head2 - (if (< pos (car head2)) - ;; ---- - ;; host)[head)[body)[tail)[host - (if do-chunk - (list nil (point-min) (point-min) (car head2) (car head2)) - (list nil (point-min) (car head2))) - (if (< pos (cdr head2)) - ;; ----- - ;; host)[head)[body)[tail)[host - (if do-chunk - (pm--find-tail-from-head pos head2 head-matcher tail-matcher can-overlap 'head) - (list 'head (car head2) (cdr head2))) - ;; ----------------- - ;; host)[head)[body)[tail)[host - (pm--find-tail-from-head pos head2 head-matcher tail-matcher can-overlap do-chunk))) - ;; no span found - nil))))))) - -;; fixme: find a simpler way with recursion where head-matcher and tail-matcher could be reversed -(defun pm--find-tail-from-head (pos head head-matcher tail-matcher can-overlap do-chunk) - (goto-char (cdr head)) - (let ((tail (funcall tail-matcher 1)) - (at-max (= pos (point-max))) - (type 'tail)) - (when can-overlap - (save-excursion - ;; search for next head and pick the earliest - (goto-char (cdr head)) - (let ((match (funcall head-matcher 1))) - (when (or (null tail) - (and match (< (car match) (car tail)))) - (setq tail match - type 'head))))) - (if tail - (if (< pos (car tail)) - ;; ----- - ;; host)[head)[body)[tail)[host)[head) - (if do-chunk - (list (if (eq do-chunk t) 'body do-chunk) - (car head) (cdr head) (car tail) (cdr tail)) - (list 'body (cdr head) (car tail))) - (if (or (< pos (cdr tail)) - (and at-max (= pos (cdr tail)))) - ;; ----- - ;; host)[head)[body)[tail)[host)[head) - (if do-chunk - (if (eq type 'tail) - (list (if (eq do-chunk t) 'tail do-chunk) - (car head) (cdr head) (car tail) (cdr tail)) - ;; can-overlap case - (pm--find-tail-from-head pos tail head-matcher tail-matcher can-overlap do-chunk)) - (list type (car tail) (cdr tail))) - (goto-char (cdr tail)) - ;; ----------- - ;; host)[head)[body)[tail)[host)[head) - (let ((match (funcall head-matcher 1)) - (type 'head)) - (when can-overlap - (save-excursion - ;; search for next head and pick the earliest - (goto-char (cdr tail)) - (let ((match2 (funcall tail-matcher 1))) - (when (or (null match) - (and match2 (< (car match2) (car match)))) - (setq match match2 - type 'tail))))) - (if match - (if (< pos (car match)) - ;; ----- - ;; host)[head)[body)[tail)[host)[head) - (if do-chunk - (list nil (cdr tail) (cdr tail) (car match) (car match)) - (list nil (cdr tail) (car match))) - (if (or (< pos (cdr match)) - (and at-max (= pos (cdr match)))) - ;; ----- - ;; host)[head)[body)[tail)[host)[head)[body - (if do-chunk - (if (eq type 'tail) - ;; can-overlap case - (list (if (eq do-chunk t) 'tail do-chunk) - (car head) (cdr head) (car match) (cdr match)) - (pm--find-tail-from-head pos match head-matcher tail-matcher can-overlap 'head)) - (list type (car match) (cdr match))) - ;; ---- - ;; host)[head)[body)[tail)[host)[head)[body - (pm--find-tail-from-head pos match head-matcher tail-matcher can-overlap do-chunk))) - ;; ----- - ;; host)[head)[body)[tail)[host) - (if do-chunk - (list nil (cdr tail) (cdr tail) (point-max) (point-max)) - (list nil (cdr tail) (point-max))))))) - ;; ----- - ;; host)[head)[body) - (if do-chunk - (list (if (eq do-chunk t) 'body do-chunk) (cdr head) (cdr head) (point-max) (point-max)) - (list 'body (cdr head) (point-max)))))) - -(defun pm--next-chunk (head-matcher tail-matcher &optional pos can-overlap) - "Forward only span detector. -For HEAD-MATCHER, TAIL-MATCHER, POS and CAN-OVERLAP see -`pm--span-at-point'. Return a list of the form (HEAD-START -HEAD-END TAIL-START TAIL-END). Can return nil if there are no -forward spans from pos." - (setq pos (or pos (point))) - (save-restriction - (widen) - (save-excursion - (goto-char pos) - (let ((parse-sexp-lookup-properties nil) - (case-fold-search t) - (head-matcher (pm-fun-matcher head-matcher)) - (tail-matcher (pm-fun-matcher tail-matcher)) - (head nil)) - ;; start from bol !! ASSUMPTION !! - (forward-line 0) - (setq head (funcall head-matcher 1)) - (while (and head (< (car head) pos)) - (setq head (funcall head-matcher 1))) - (when head - (goto-char (cdr head)) - (let ((tail (or (funcall tail-matcher 1) - (cons (point-max) (point-max))))) - (when can-overlap - (goto-char (cdr head)) - (when-let ((hbeg (car (funcall head-matcher 1)))) - (when (< hbeg (car tail)) - (setq tail (cons hbeg hbeg))))) - (list (car head) (cdr head) (car tail) (cdr tail)))))))) - -(defun pm-goto-span-of-type (type N) - "Skip to N - 1 spans of TYPE and stop at the start of a span of TYPE. -TYPE is either a symbol or a list of symbols of span types." - (let* ((sofar 0) - (types (if (symbolp type) - (list type) - type)) - (back (< N 0)) - (N (if back (- N) N)) - (beg (if back (point-min) (point))) - (end (if back (point) (point-max)))) - (unless (memq (car (pm-innermost-span)) types) - (setq sofar 1)) - (condition-case nil - (pm-map-over-spans - (lambda (span) - (when (memq (car span) types) - (goto-char (nth 1 span)) - (when (>= sofar N) - (signal 'quit nil)) - (setq sofar (1+ sofar)))) - beg end nil back) - (quit nil)) - sofar)) - - -;;; OBJECT HOOKS - -(defun pm--run-derived-mode-hooks () - ;; Minor modes run-hooks, major-modes run-mode-hooks. Polymodes is a minor - ;; mode but with major-mode flavor. We run hooks of all modes stored in - ;; '-minor-mode slot of all parent objects in parent-first order. - (let* ((this-mode (eieio-oref pm/polymode '-minor-mode)) - (this-state (symbol-value this-mode))) - (mapc (lambda (mm) - (let ((old-state (symbol-value mm))) - (unwind-protect - (progn - (set mm this-state) - (run-hooks (derived-mode-hook-name mm))) - (set mm old-state)))) - (pm--collect-parent-slots pm/polymode '-minor-mode)))) - -(defun pm--run-init-hooks (object type &optional emacs-hook) - (unless pm-initialization-in-progress - (when emacs-hook - (run-hooks emacs-hook)) - (pm--run-hooks object :init-functions (or type 'host)))) - -(defun pm--collect-parent-slots (object slot &optional do-when inclusive) - "Descend into parents of OBJECT and return a list of SLOT values. -Returned list is in parent first order. If non-nil DO-WHEN must -be a function which would take an object and return non-nil if -the recursion should descend into the parent. When nil, all -parents are descended. If INCLUSIVE is non-nil, include the slot -of the first object for which DO-WHEN failed." - (let ((inst object) - (vals nil) - (failed nil)) - (while inst - (if (not (slot-boundp inst slot)) - (setq inst (and (slot-boundp inst :parent-instance) - (eieio-oref inst 'parent-instance))) - (push (eieio-oref inst slot) vals) - (setq inst (and - (or (null do-when) - (if failed - (progn (setq failed nil) t) - (or (funcall do-when inst) - (and inclusive - (setq failed t))))) - (slot-boundp inst :parent-instance) - (eieio-oref inst 'parent-instance))))) - vals)) - -(defun pm--run-hooks (object slot &rest args) - "Run hooks from SLOT of OBJECT and its parent instances. -Parents' hooks are run first." - (let ((funs (delete-dups - (copy-sequence - (apply #'append - (pm--collect-parent-slots object slot)))))) - (if args - (mapc (lambda (fn) - (apply fn args)) - funs) - (mapc #'funcall funs)))) - - -;;; BUFFER SELECTION - -;; Transfer of the buffer-undo-list is managed internally by emacs -(define-obsolete-variable-alias 'pm-move-vars-from-base 'polymode-move-these-vars-from-base-buffer "v0.1.6") -(defvar polymode-move-these-vars-from-base-buffer - '(buffer-file-name - ;; ideally this one should be merged across all buffers - buffer-display-table - outline-regexp - outline-level - polymode-default-inner-mode - tab-width) - "Variables transferred from base buffer on buffer switch.") - -(define-obsolete-variable-alias 'pm-move-vars-from-old-buffer 'polymode-move-these-vars-from-old-buffer "v0.1.6") -(defvar polymode-move-these-vars-from-old-buffer - '(buffer-face-mode - buffer-face-mode-face - buffer-face-mode-remapping - buffer-invisibility-spec - buffer-read-only - buffer-undo-list - buffer-undo-tree - display-line-numbers - face-remapping-alist - isearch-mode ; this seems to be enough to avoid isearch glitching - line-move-visual - overwrite-mode - selective-display - text-scale-mode - text-scale-mode-amount - ;; transient-mark-mode stores here the state of selection - ;; when the shift-select-mode is enabled - transient-mark-mode - truncate-lines - truncate-partial-width-windows - word-wrap - ;; multiple-cursors stores here a command in a pre-command-hook - ;; and executes it for all cursors in a post-command-hook so we - ;; need to transfer in case the buffer was switched. - mc--this-command) - "Variables transferred from old buffer on buffer switch.") - -(defvar polymode-move-these-minor-modes-from-base-buffer nil - "List of minor modes to move from base buffer.") -(defvar polymode-move-these-minor-modes-from-old-buffer - '(linum-mode - visual-line-mode - visual-fill-column-mode - writeroom-mode - multiple-cursors-mode) - "List of minor modes to move from the old buffer.") - -(defun pm-own-buffer-p (&optional buffer) - "Return t if BUFFER is owned by polymode. -Owning a buffer means that the BUFFER is either the base buffer -or an indirect implementation buffer. If nil, the buffer was -created outside of polymode with `clone-indirect-buffer'." - (when pm/polymode - (memq (or buffer (current-buffer)) - (eieio-oref pm/polymode '-buffers)))) - -(defun pm-select-buffer (span &optional visibly) - "Select the buffer associated with SPAN. -Install a new indirect buffer if it is not already installed. -Chunkmode's class should define `pm-get-buffer-create' method. If -VISIBLY is non-nil perform extra adjustment for \"visual\" buffer -switch." - (let ((buffer (pm-span-buffer span)) - (own (pm-own-buffer-p)) - (cbuf (current-buffer))) - ;; FIXME: investigate why this one is still needed. - ;; polymode-syntax-propertize should have taken care of it. - (with-current-buffer buffer - (pm--reset-ppss-cache span)) - (when (and own visibly) - ;; always sync to avoid issues with tooling working in different buffers - (pm--synchronize-points cbuf) - (let ((mode (or (eieio-oref (nth 3 span) 'keep-in-mode) - (eieio-oref pm/polymode 'keep-in-mode)))) - (setq buffer (cond - ((null mode) buffer) - ((eq mode 'host) (pm-base-buffer)) - (mode (or (pm-get-buffer-of-mode mode) - ;; not throwing because in auto-modes mode might not - ;; be installed yet and there is no way install it - ;; from here - buffer)))))) - ;; (message "setting buffer %d-%d [%s]" (nth 1 span) (nth 2 span) cbuf) - ;; no further action if BUFFER is already the current buffer - (unless (eq buffer cbuf) - (when (and own visibly) - (run-hook-with-args 'polymode-before-switch-buffer-hook - cbuf buffer)) - (pm--move-vars polymode-move-these-vars-from-base-buffer - (pm-base-buffer) buffer) - (pm--move-vars polymode-move-these-vars-from-old-buffer - cbuf buffer) - (if visibly - ;; Slow, visual selection. Don't perform in foreign indirect buffers. - (when own - (pm--select-existing-buffer-visibly buffer)) - (set-buffer buffer))))) - -(defvar text-scale-mode) -(defvar text-scale-mode-amount) -(defun pm--select-existing-buffer-visibly (new-buffer) - (let ((old-buffer (current-buffer)) - (point (point)) - (window-start (window-start)) - (visible (pos-visible-in-window-p)) - (ractive (region-active-p)) - (mkt (mark t))) - - (when pm-hide-implementation-buffers - (rename-buffer (pm--hidden-buffer-name))) - - (setq pm/current nil) - - (pm--move-minor-modes polymode-move-these-minor-modes-from-base-buffer - (pm-base-buffer) new-buffer) - (pm--move-minor-modes polymode-move-these-minor-modes-from-old-buffer - old-buffer new-buffer) - - (pm--move-overlays old-buffer new-buffer) - - (switch-to-buffer new-buffer) - (bury-buffer-internal old-buffer) - (set-window-prev-buffers nil (assq-delete-all old-buffer (window-prev-buffers nil))) - - (setq pm/current t) - - ;; fixme: what is the right way to do this ... activate-mark-hook? - (if (not ractive) - (deactivate-mark) - (set-mark mkt) - (activate-mark)) - - (when pm-hide-implementation-buffers - (rename-buffer (pm--visible-buffer-name))) - - ;; avoid display jumps - (goto-char point) - (when visible - (set-window-start (get-buffer-window new-buffer t) window-start)) - - (run-hook-with-args 'polymode-after-switch-buffer-hook old-buffer new-buffer) - (pm--run-hooks pm/polymode :switch-buffer-functions old-buffer new-buffer) - (pm--run-hooks pm/chunkmode :switch-buffer-functions old-buffer new-buffer))) - -(defun pm--move-overlays (from-buffer to-buffer) - (with-current-buffer from-buffer - (mapc (lambda (o) - (unless (or (overlay-get o 'linum-str) - (overlay-get o 'yas--snippet)) - (move-overlay o (overlay-start o) (overlay-end o) to-buffer))) - (overlays-in 1 (1+ (buffer-size)))))) - -(defun pm--move-vars (vars from-buffer &optional to-buffer) - (let ((to-buffer (or to-buffer (current-buffer)))) - (unless (eq to-buffer from-buffer) - (with-current-buffer to-buffer - (dolist (var vars) - (when (default-boundp var) - (make-variable-buffer-local var) - (set var (buffer-local-value var from-buffer)))))))) - -(defun pm--move-minor-modes (modes from-buffer &optional to-buffer) - (let ((to-buffer (or to-buffer (current-buffer)))) - (unless (eq to-buffer from-buffer) - (with-current-buffer to-buffer - (dolist (m modes) - (when (default-boundp m) - (let ((from-state (buffer-local-value m from-buffer))) - (unless (equal from-state (symbol-value m)) - (funcall (symbol-function m) (if from-state 1 -1)))))))))) - -(defun pm-set-buffer (&optional pos-or-span) - "Set buffer to polymode buffer appropriate for POS-OR-SPAN. -This is done with `set-buffer' and no visual adjustments (like -overlay transport) are done. See `pm-switch-to-buffer' for a more -comprehensive alternative." - (let ((span (if (or (null pos-or-span) - (number-or-marker-p pos-or-span)) - (pm-innermost-span pos-or-span) - pos-or-span))) - (pm-select-buffer span))) - -;; NB: Polymode functions used in emacs utilities should not switch buffers -;; under any circumstances. Switching should happen only in post-command. For -;; example `pm-indent-line-dispatcher' used to switch buffers, but it was called -;; from electric-indent-post-self-insert-function in post-self-insert-hook which -;; was triggered by self-insert-command called from `newline'. `newline' sets a -;; temporary local post-self-insert-hook and makes the assumption that buffer -;; stays the same. It was moved away from original buffer by polymode's -;; indentation dispatcher its post-self-insert-hook hanged permanently in the -;; old buffer (#226). -(defun pm-switch-to-buffer (&optional pos-or-span) - "Bring the appropriate polymode buffer to front. -POS-OR-SPAN can be either a position in a buffer or a span. All -expensive adjustment for a visible switch (like overlay -transport) are performed." - (let ((span (if (or (null pos-or-span) - (number-or-marker-p pos-or-span)) - (pm-innermost-span pos-or-span) - pos-or-span))) - (pm-select-buffer span 'visibly))) - -(defun pm-map-over-modes (fn beg end) - (when (< beg end) - (save-restriction - (widen) - (let* ((hostmode (eieio-oref pm/polymode '-hostmode)) - (pos beg) - (ttype 'dummy) - span nspan nttype) - (when (< (point-min) beg) - (setq span (pm-innermost-span beg) - beg (nth 1 span) - pos (nth 2 span) - ttype (pm-true-span-type span)) - (while (and (memq (car span) '(head body)) - (< pos end)) - (setq nspan (pm-innermost-span (nth 2 span)) - nttype (pm-true-span-type nspan)) - (if (eq ttype nttype) - (setq pos (nth 2 nspan)) - (with-current-buffer (pm-span-buffer span) - (funcall fn beg pos)) - (setq beg (nth 1 nspan) - pos (nth 2 nspan))) - (setq span nspan - ttype nttype))) - (when (< pos end) - (let ((ichunks (cl-loop for im in (eieio-oref pm/polymode '-innermodes) - collect (cons im nil))) - (tichunks nil) - (spans nil)) - (while (< pos end) - ;; 1. recompute outdated chunks - (setq tichunks nil) - (dolist (ichunk ichunks) - (if (and (cdr ichunk) - (< pos (nth 5 ichunk))) - (push ichunk tichunks) - (let ((nchunk (pm-next-chunk (car ichunk) pos))) - (when nchunk - (push (cons (car ichunk) nchunk) tichunks))))) - (setq ichunks (reverse tichunks)) - ;; 2. Compute all (next) spans - (setq spans nil) - (dolist (ichunk ichunks) - (let ((chunk (cdr ichunk))) - (let ((span (cond - ((< pos (nth 1 chunk)) (list nil pos (nth 1 chunk) (car chunk))) - ((< pos (nth 2 chunk)) (list 'head (nth 1 chunk) (nth 2 chunk) (car chunk))) - ((< pos (nth 3 chunk)) (list 'body (nth 2 chunk) (nth 3 chunk) (car chunk))) - ((< pos (nth 4 chunk)) (list 'tail (nth 3 chunk) (nth 4 chunk) (car chunk)))))) - (push span spans)))) - (setq spans (nreverse spans)) - ;; 3. Intersect - (setq nspan (list nil pos (point-max) hostmode)) - (dolist (s spans) - (setq nspan (pm--intersect-spans nspan s))) - ;; (setq pm--span-counter (1+ pm--span-counter)) ;; for debugging - (pm-cache-span nspan) - (setq nttype (pm-true-span-type nspan)) - ;; 4. funcall on region if type changed - (unless (eq ttype nttype) - (when span - (with-current-buffer (pm-span-buffer span) - (funcall fn beg pos))) - (setq ttype nttype - beg (nth 1 nspan))) - (setq span nspan - pos (nth 2 nspan))))) - (with-current-buffer (pm-span-buffer span) - (funcall fn beg pos)))))) - -;; ;; do not delete: speed and consistency checks -;; (defvar pm--span-counter 0) -;; (defvar pm--mode-counter 0) -;; (defun pm-debug-map-over-modes-test (&optional beg end) -;; (interactive) -;; (setq pm--span-counter 0) -;; (setq pm--mode-counter 0) -;; (pm-map-over-modes -;; (lambda (beg end) -;; (setq pm--mode-counter (1+ pm--mode-counter))) -;; (or beg (point-min)) -;; (or end (point-max))) -;; (cons pm--span-counter pm--mode-counter)) -;; (defun pm-debug-map-over-spans-test (&optional beg end) -;; (interactive) -;; (setq pm--span-counter 0) -;; (pm-map-over-spans -;; (lambda (span) -;; (setq pm--span-counter (1+ pm--span-counter))) -;; (or beg (point-min)) -;; (or end (point-max))) -;; pm--span-counter) - -(defun pm-map-over-spans (fun &optional beg end count backwardp visibly no-cache) - "For all spans between BEG and END, execute FUN. -FUN is a function of one argument a span object (also available -in a dynamic variable *span*). Buffer is *not* narrowed to the -span, nor point is moved. If COUNT is non-nil, jump at most that -many times. If BACKWARDP is non-nil, map backwards. Point -synchronization across indirect buffers is not taken care of. -Modification of the buffer during mapping is an undefined -behavior." - ;; Important! Don't forget to save-excursion when calling map-overs-spans and - ;; synchronize points if needed. Mapping can end in different buffer and - ;; invalidate the caller assumptions. - (save-restriction - (widen) - (setq beg (or beg (point-min)) - end (if end - (min end (point-max)) - (point-max))) - (unless count - (setq count most-positive-fixnum)) - (let* ((nr 0) - (pos (if backwardp end beg)) - (*span* (pm-innermost-span pos no-cache))) - (while *span* - (setq nr (1+ nr)) - (pm-select-buffer *span* visibly) - ;; FUN might change buffer and invalidate our *span*. Should we care or - ;; reserve pm-map-over-spans for "read-only" actions only? Does - ;; after-change run immediately or after this function ends? - (funcall fun *span*) - ;; enter previous/next chunk - (setq pos - (if backwardp - (max 1 (1- (nth 1 *span*))) - (min (point-max) (nth 2 *span*)))) - (setq *span* - (and (if backwardp - (> pos beg) - (< pos end)) - (< nr count) - (pm-innermost-span pos no-cache))))))) - -(defun pm-narrow-to-span (&optional span) - "Narrow to current SPAN." - (interactive) - (unless (= (point-min) (point-max)) - (let ((span (or span - (pm-innermost-span)))) - (let ((sbeg (nth 1 span)) - (send (nth 2 span))) - (unless pm--emacs>26 - (pm--reset-ppss-cache span)) - (narrow-to-region sbeg send))))) - -(defmacro pm-with-narrowed-to-span (span &rest body) - (declare (indent 1) (debug body)) - `(save-restriction - (pm-narrow-to-span ,span) - ,@body)) - - - -;;; HOOKS -;; There is also `poly-lock-after-change' in poly-lock.el - -(defun polymode-flush-syntax-ppss-cache (beg end _) - "Run `syntax-ppss-flush-cache' from BEG to END in all polymode buffers." - ;; Modification hooks are run only in current buffer and not in other (base or - ;; indirect) buffers. Thus some actions like flush of ppss cache must be taken - ;; care explicitly. We run some safety hooks checks here as well. - (dolist (buff (oref pm/polymode -buffers)) - (when (buffer-live-p buff) - (with-current-buffer buff - ;; micro-optimization to avoid calling the flush twice - (when (memq 'syntax-ppss-flush-cache before-change-functions) - (remove-hook 'before-change-functions 'syntax-ppss-flush-cache t)) - ;; need to be the first to avoid breaking preceding hooks - (unless (eq (car after-change-functions) - 'polymode-flush-syntax-ppss-cache) - (delq 'polymode-flush-syntax-ppss-cache after-change-functions) - (add-hook 'after-change-functions 'polymode-flush-syntax-ppss-cache nil t)) - (syntax-ppss-flush-cache beg end) - ;; Check if something has changed our hooks. (Am I theoretically paranoid or - ;; this is indeed needed?) `fontification-functions' (and others?) should be - ;; checked as well I guess. - ;; (when (memq 'font-lock-after-change-function after-change-functions) - ;; (remove-hook 'after-change-functions 'font-lock-after-change-function t)) - ;; (when (memq 'jit-lock-after-change after-change-functions) - ;; (remove-hook 'after-change-functions 'jit-lock-after-change t)) - )))) - -(defun polymode-pre-command-synchronize-state () - "Synchronize state between buffers. -Currently synchronize points only. Runs in local `pre-command-hook'." - (pm--synchronize-points (current-buffer))) - -(defun polymode-post-command-select-buffer () - "Select the appropriate (indirect) buffer corresponding to point's context. -This funciton is placed in local `post-command-hook'." - (when (and pm-allow-post-command-hook - polymode-mode - pm/chunkmode) - (condition-case err - (pm-switch-to-buffer) - (error (message "(pm-switch-to-buffer %s): %s" - (point) (error-message-string err)))))) - -(defvar-local pm--killed nil) -(defun polymode-after-kill-fixes () - "Various fixes for polymode indirect buffers." - (when (pm-own-buffer-p) - (let ((base (pm-base-buffer))) - (set-buffer-modified-p nil) - ;; Prevent various tools like `find-file' to re-find this file. - ;; - ;; We use buffer-list instead of `-buffers' slot here because on some - ;; occasions there are other indirect buffers (e.g. switch from polymode - ;; to other mode and then back, or when user or a tool (e.g. org-capture) - ;; creates an indirect buffer manually). - (dolist (b (buffer-list)) - (when (and (buffer-live-p b) - (eq (buffer-base-buffer b) base)) - (with-current-buffer b - (setq pm--killed t) - (setq buffer-file-name nil) - (setq buffer-file-number nil) - (setq buffer-file-truename nil))))))) - -(defun pm-turn-polymode-off (&optional new-mode) - "Remove all polymode indirect buffers and install NEW-MODE if any. -NEW-MODE can be t in which case mode is picked from the -`pm/polymode' object." - (when pm/polymode - (let* ((base (pm-base-buffer)) - (mmode (buffer-local-value 'major-mode base)) - (kill-buffer-hook (delete 'polymode-after-kill-fixes (copy-sequence kill-buffer-hook)))) - ;; remove only our own indirect buffers - (dolist (b (eieio-oref pm/polymode '-buffers)) - (unless (eq b base) - (kill-buffer b))) - (with-current-buffer base - (setq pm/polymode nil) - (when new-mode - (if (eq new-mode t) - (funcall mmode) - (funcall new-mode))))))) - -(defun polymode-after-change-major-mode-cleanup () - "Remove all polymode implementation buffers on mode change." - ;; pm/polymode is permanent local. Nil polymode-mode means that the user - ;; called another mode on top of polymode. - (when (and pm/polymode (not polymode-mode)) - ;; if another mode was called from an innermode, it was installed in a wrong place - (let* ((base (pm-base-buffer)) - (mmode (unless (eq base (current-buffer)) - major-mode))) - (unless (eq base (current-buffer)) - (when (eq (window-buffer) (current-buffer)) - (switch-to-buffer base))) - (pm-turn-polymode-off mmode)))) - -(add-hook 'after-change-major-mode-hook #'polymode-after-change-major-mode-cleanup) - - -;;; CORE ADVICE - -(defun pm-around-advice (fun advice) - "Apply around ADVICE to FUN. -If FUN is a list, apply ADVICE to each element of it." - (cond ((listp fun) - (dolist (el fun) (pm-around-advice el advice))) - ((and (symbolp fun) - (not (advice-member-p advice fun))) - (advice-add fun :around advice)))) - -(defun polymode-inhibit-during-initialization (orig-fun &rest args) - "Don't run ORIG-FUN (with ARGS) during polymode setup." - (unless pm-initialization-in-progress - (apply orig-fun args))) - -(defun polymode-with-current-base-buffer (orig-fun &rest args) - "Switch to base buffer and apply ORIG-FUN to ARGS. -Used in advises." - (if (and polymode-mode - (not pm--killed) - (buffer-live-p (buffer-base-buffer))) - (let (;; (pm-initialization-in-progress t) ; just in case - (cur-buf (current-buffer)) - (base (buffer-base-buffer)) - (first-arg (car-safe args))) - (prog1 (with-current-buffer base - (if (or (eq first-arg cur-buf) - (equal first-arg (buffer-name cur-buf))) - (apply orig-fun base (cdr args)) - (apply orig-fun args))) - ;; The sync of points doesn't work as expected in the following corner - ;; case: if current buffer is an indirect one and a function operates - ;; on the base buffer (like save-buffer) and somehow inadvertently - ;; moves points in the indirect buffer then we synchronize wrong point - ;; (from the current indirect buffer). For unclear reasons the very - ;; low level scan-lists moves points in indirect buffers (FIXME: EMACS - ;; bug, report ASAP). Unfortunately save-excursion protects only from - ;; point moves in the current buffer. - (when pm/polymode - (pm--synchronize-points base)))) - (apply orig-fun args))) - -;; (pm-around-advice #'kill-buffer #'polymode-with-current-base-buffer) -(pm-around-advice #'find-alternate-file #'polymode-with-current-base-buffer) -(pm-around-advice #'write-file #'polymode-with-current-base-buffer) -(pm-around-advice #'basic-save-buffer #'polymode-with-current-base-buffer) -;; (advice-remove #'kill-buffer #'polymode-with-current-base-buffer) -;; (advice-remove #'find-alternate-file #'polymode-with-current-base-buffer) - - -;;; FILL - -;; FIXME: this is an incomplete heuristic and breaks on adjacent multi-span -;; fill-region depending on the mode's fill-forward-paragraph-function. For a -;; complete solution one might likely need to define fill-paragraph-function as -;; well. -(defun polymode-fill-forward-paragraph (&optional arg) - "Function for `fill-forward-paragraph-function'. -ARG is the same as in `forward-paragraph'" - (let* ((neg (< arg 0)) - (cur-span (pm-innermost-span (if neg (1- (point)) (point)))) - (cur-mode (pm-span-mode cur-span)) - (out (funcall (or pm--fill-forward-paragraph-original - #'forward-paragraph) - arg)) - (new-mode (pm-span-mode (pm-innermost-span (point))))) - (unless (eq cur-mode new-mode) - ;; adjust to the most recent span border and hope for the best - (pm-goto-span-of-type (car cur-span) (if neg 1 -1))) - out)) - - -;;; SYNTAX - -(defun pm--call-syntax-propertize-original (start end) - (condition-case err - (funcall pm--syntax-propertize-function-original start end) - (error - (message "ERROR: (%s %d %d) -> %s" - (if (symbolp pm--syntax-propertize-function-original) - pm--syntax-propertize-function-original - (format "polymode-syntax-propertize:%s" major-mode)) - start end - ;; (backtrace) - (error-message-string err))))) - -(defun polymode-syntax-propertize-extend-region-in-host (start end) - (let ((base (pm-base-buffer)) - (min (point-min)) - (max (point-max))) - (when base - (with-current-buffer base - (save-restriction - (narrow-to-region min max) - ;; Relevant part from syntax-propertize - (let ((funs syntax-propertize-extend-region-functions) - (extended nil)) - (while funs - (let* ((syntax-propertize--done most-positive-fixnum) - (fn (pop funs)) - (new (unless (eq fn 'syntax-propertize-wholelines) - (funcall fn start end)))) - (when (and new - (or (< (car new) start) - (> (cdr new) end))) - (setq extended t - start (car new) - end (cdr new)) - ;; If there's been a change, we should go through the list again - ;; since this new position may warrant a different answer from - ;; one of the funs we've already seen. - (unless (eq funs (cdr syntax-propertize-extend-region-functions)) - (setq funs syntax-propertize-extend-region-functions))))) - (when extended (cons start end)))))))) - -;; used for hard debugging of syntax properties in batch mode -(defun pm--syntax-after (pos) - (let ((syntax (syntax-after pos))) - (with-temp-buffer - (internal-describe-syntax-value syntax) - (buffer-string)))) - -;; called from syntax-propertize and thus at the beginning of syntax-ppss -(defun polymode-syntax-propertize (beg end) - ;; (message "SP:%d-%d" beg end) - (unless pm-initialization-in-progress - (save-restriction - (widen) - (save-excursion - - ;; some modes don't save data in their syntax propertize functions - (save-match-data - (let ((real-end end) - (base (pm-base-buffer)) - (protect-host (with-current-buffer (pm-base-buffer) - (eieio-oref pm/chunkmode 'protect-syntax)))) - - ;; 1. host if no protection - (unless protect-host - (with-current-buffer base - (set 'syntax-propertize--done end) - ;; (message "sp:%s:%d-%d" major-mode beg end) - (when pm--syntax-propertize-function-original - ;; For syntax matchers the host mode syntax prioritization - ;; should be smart enough to install relevant elements around - ;; end for the followup map-over-modes to work correctly. - (pm--call-syntax-propertize-original beg end)))) - - ;; 2. all others - (let ((last-ppss nil)) - (pm-map-over-modes - (lambda (mbeg mend) - ;; Cannot set this earlier because some buffers might not be - ;; created when this function is called. One major reason to - ;; set this here is to avoid recurring into syntax-propertize - ;; when propertize functions call syntax-ppss. `setq' doesn't - ;; have an effect because the var is let bound but `set' - ;; works. - (set 'syntax-propertize--done (max end mend)) - ;; (message "sp:%s:%d-%d" major-mode (max beg mbeg) mend) - (if (eq base (current-buffer)) - (when protect-host - (pm--reset-ppss-cache-0 mbeg last-ppss) - (when pm--syntax-propertize-function-original - (pm--call-syntax-propertize-original (max beg mbeg) mend)) - (setq last-ppss (syntax-ppss mend))) - (pm--reset-ppss-cache-0 mbeg) - (when pm--syntax-propertize-function-original - (pm--call-syntax-propertize-original (max beg mbeg) mend)))) - beg end)))))))) - -(defvar syntax-ppss-wide) -(defvar syntax-ppss-last) -(defvar syntax-ppss-cache) -(defun pm--reset-ppss-cache (span) - "Reset `syntax-ppss-last' cache if it was recorded before SPAN's start." - (let ((sbeg (nth 1 span)) - new-ppss) - (unless (car span) - ;; Host chunk is special. Pick ppss from end of last span. Body chunks - ;; with nested inner chunks should be treated the same but no practical - ;; example showed so far. - (save-restriction - (widen) - (save-excursion - (let ((pos sbeg)) - (while (and (null new-ppss) - (not (= pos (point-min)))) - (let ((prev-span (pm-innermost-span (1- pos)))) - (if (null (car prev-span)) - (setq new-ppss (syntax-ppss pos)) - (setq pos (nth 1 prev-span))))))))) - (pm--reset-ppss-cache-0 sbeg new-ppss))) - -(defun pm--reset-ppss-cache-0 (pos &optional new-ppss) - (unless new-ppss - (setq new-ppss (list 0 nil pos nil nil nil 0 nil nil nil nil))) - ;; in emacs 26 there are two caches syntax-ppss-wide and - ;; syntax-ppss-narrow. The latter is reset automatically each time a - ;; different narrowing is in place so we don't deal with it for now. - (let ((cache (if pm--emacs>26 - (cdr syntax-ppss-wide) - syntax-ppss-cache))) - (while (and cache (>= (caar cache) pos)) - (setq cache (cdr cache))) - (setq cache (cons (cons pos new-ppss) cache)) - (if pm--emacs>26 - ;; syntax-ppss involves an aggressive cache cleaning; protect for one - ;; such cleaning by double entry - (setq syntax-ppss-wide (cons (car cache) cache)) - (setq syntax-ppss-cache cache) - (setq syntax-ppss-last (cons pos new-ppss)))) - new-ppss) - - -;; (defun polymode-reset-ppss-cache (&optional pos) -;; "Reset `syntax-ppss' cache to POS in polymode buffers. -;; Used in :before advice of `syntax-ppss'." -;; (when polymode-mode -;; (pm--reset-ppss-cache (pm-innermost-span pos)))) - -;; (advice-add #'syntax-ppss :before #'polymode-reset-ppss-cache) -;; (unless pm--emacs>26 -;; (advice-add #'syntax-ppss :before #'polymode-reset-ppss-cache)) - -;; (defun polymode-restrict-syntax-propertize-extension (orig-fun beg end) -;; (if (and polymode-mode pm/polymode) -;; (let ((span (pm-innermost-span beg))) -;; (if (eieio-oref (nth 3 span) 'protect-syntax) -;; (let ((range (pm-span-to-range span))) -;; (if (and (eq beg (car range)) -;; (eq end (cdr range))) -;; ;; in the most common case when span == beg-end, simply return -;; range -;; (let ((be (funcall orig-fun beg end))) -;; (and be -;; (cons (max (car be) (car range)) -;; (min (cdr be) (cdr range))))))) -;; (funcall orig-fun beg end))) -;; (funcall orig-fun beg end))) - - -;;; INTERNAL UTILITIES - -(defun pm--set-transient-map (commands) - "Set transient map with COMMANDS. -COMMANDS is a list of commands which are bound to their -accessible keys as well as the basic event of those keys. Used -for \"cycling\" commands." - (let ((map (make-sparse-keymap))) - (mapc (lambda (cmd) - (mapc (lambda (vec) - (define-key map vec cmd) - (let ((basic-ev (elt vec (1- (length vec))))) - (define-key map (vector basic-ev) cmd))) - (where-is-internal cmd))) - commands) - (set-transient-map map))) - -(defun pm--display-file (ofile) - (when ofile - ;; errors might occur (most notably with open-with package errors are intentional) - ;; We need to catch those if we want to display multiple files like with Rmarkdown - (condition-case-unless-debug err - (let ((buff (get-file-buffer ofile))) - (when buff - (with-current-buffer buff - (with-demoted-errors "Error while reverting: %s" - ;; FIXME: something is not right with pdflatex export with - ;; pdf-tools viewer within emacs - (revert-buffer t t)))) - (when (if (functionp polymode-display-output-file) - (funcall polymode-display-output-file ofile) - polymode-display-output-file) - (if (string-match-p "html\\|htm$" ofile) - (browse-url ofile) - (display-buffer (find-file-noselect ofile 'nowarn))))) - (error (message "Error while displaying '%s': %s" - (file-name-nondirectory ofile) - (error-message-string err)))))) - -(defun pm--symbol-name (str-or-symbol) - (if (symbolp str-or-symbol) - (symbol-name str-or-symbol) - str-or-symbol)) - -(defun pm--true-mode-symbol (mode) - "Resolve aliases of MODE and return the true MODE name." - (while (and mode (symbolp (symbol-function mode))) - (setq mode (symbol-function mode))) - mode) - -(defun pm--get-existing-mode (mode fallback) - "Return MODE symbol if it's defined and is a valid function. -If so, return it, otherwise check in turn -`polymode-default-inner-mode', the FALLBACK and ultimately -`poly-fallback-mode'." - (pm--true-mode-symbol - (cond ((fboundp mode) mode) - ((eq polymode-default-inner-mode 'host) (buffer-local-value 'major-mode (pm-base-buffer))) - ((fboundp polymode-default-inner-mode) polymode-default-inner-mode) - ((eq fallback 'host) (buffer-local-value 'major-mode (pm-base-buffer))) - ((fboundp fallback) fallback) - (t 'poly-fallback-mode)))) - -(defun pm--get-innermode-mode (chunkmode type) - "Retrieve the mode name of for inner CHUNKMODE for span of TYPE." - (pm--get-existing-mode - (cl-case (pm-true-span-type chunkmode type) - (body (eieio-oref chunkmode 'mode)) - (head (eieio-oref chunkmode 'head-mode)) - (tail (eieio-oref chunkmode 'tail-mode)) - (t (error "Invalid type (%s); must be one of body, head tail" type))) - (eieio-oref chunkmode 'fallback-mode))) - -;; Used in auto innermode detection only and can return symbol 'host as that's -;; needed in pm--get-auto-chunkmode. -(defun pm-get-mode-symbol-from-name (name &optional fallback) - "Guess and return mode function from short NAME. -Return FALLBACK if non-nil, otherwise the value of -`polymode-default-inner-mode' if non-nil, otherwise value of slot -:fallback-mode which globally defaults to `poly-fallback-mode'." - (pm--true-mode-symbol - (cond - ;; anonymous chunk - ((or (null name) - (and (stringp name) (= (length name) 0))) - (or - (when (or (eq polymode-default-inner-mode 'host) - (fboundp polymode-default-inner-mode)) - polymode-default-inner-mode) - (when (or (eq fallback 'host) - (fboundp fallback)) - fallback) - 'poly-fallback-mode)) - ;; proper mode symbol - ((and (symbolp name) (fboundp name) name)) - ;; compute from name - ((let* ((str (pm--symbol-name - (or (cdr (assq (intern (pm--symbol-name name)) - polymode-mode-name-aliases)) - name))) - (mname (if (string-match-p "-mode$" str) - str - (concat str "-mode")))) - (or - ;; direct search - (let ((mode (intern mname))) - (when (fboundp mode) - mode)) - ;; downcase - (let ((mode (intern (downcase mname)))) - (when (fboundp mode) - mode)) - ;; auto-mode alist - (let ((dummy-file (concat "a." str))) - (cl-loop for (k . v) in auto-mode-alist - if (and (string-match-p k dummy-file) - (not (string-match-p "^poly-" (symbol-name v)))) - return v)) - (when (or (eq polymode-default-inner-mode 'host) - (fboundp polymode-default-inner-mode)) - polymode-default-inner-mode) - (when (or (eq fallback 'host) - (fboundp fallback)) - fallback) - 'poly-fallback-mode)))))) - -(defun pm--oref-with-parents (object slot) - "Merge slots SLOT from the OBJECT and all its parent instances." - (let (VALS) - (while object - (setq VALS (append (and (slot-boundp object slot) ; don't cascade - (eieio-oref object slot)) - VALS) - object (and (slot-boundp object :parent-instance) - (eieio-oref object 'parent-instance)))) - VALS)) - -(defun pm--abrev-names (abrev-regexp list) - "Abbreviate names in LIST by erasing ABREV-REGEXP matches. -Elements of LIST can be either strings or symbols." - (mapcar (lambda (nm) - (let* ((str-nm (if (symbolp nm) - (symbol-name nm) - nm)) - (prefix (replace-regexp-in-string "^poly-[^-]+\\(.+\\)" "" str-nm nil nil 1)) - (is-lib (or (string= prefix "poly-r") ; ugly special case as the library is called poly-R - (featurep (intern prefix))))) - (cons (replace-regexp-in-string abrev-regexp "" - (if is-lib - (replace-regexp-in-string "^poly-[^-]+-" "" str-nm) - str-nm)) - str-nm))) - list)) - -(defun pm--object-value (obj) - (cond - ((functionp obj) - (funcall obj)) - ((symbolp obj) - (symbol-value obj)) - (t obj))) - -(defun pm--oref-value (object slot) - (pm--object-value (eieio-oref object slot))) - -(defun pm--prop-put (key val &optional object) - (oset (or object pm/polymode) -props - (plist-put (oref (or object pm/polymode) -props) key val))) - -(defun pm--prop-get (key &optional object) - (plist-get (oref (or object pm/polymode) -props) key)) - -(defun pm--comment-region (beg end) - ;; mark as syntactic comment - (when (> end 1) - (with-silent-modifications - (let ((beg (or beg (region-beginning))) - (end (or end (region-end)))) - (let ((ch-beg (char-after beg)) - (ch-end (char-before end))) - (add-text-properties beg (1+ beg) - (list 'syntax-table (cons 11 ch-beg) - 'rear-nonsticky t - 'polymode-comment 'start)) - (add-text-properties (1- end) end - (list 'syntax-table (cons 12 ch-end) - 'rear-nonsticky t - 'polymode-comment 'end))))))) - -(defun pm--uncomment-region (beg end) - ;; Remove all syntax-table properties. - ;; fixme: this beggs for problems - (when (> end 1) - (with-silent-modifications - (let ((props '(syntax-table nil rear-nonsticky nil polymode-comment nil))) - (remove-text-properties (max beg (point-min)) (min end (point-max)) props) - ;; (remove-text-properties beg (1+ beg) props) - ;; (remove-text-properties end (1- end) props) - )))) - -(defun pm--synchronize-points (&optional buffer) - "Synchronize the point in polymode buffers with the point in BUFFER." - (setq buffer (current-buffer)) - (when (and polymode-mode - (buffer-live-p buffer)) - (let* ((bufs (eieio-oref pm/polymode '-buffers)) - ;; (buffer (or buffer - ;; (cl-loop for b in bufs - ;; if (and (buffer-live-p b) - ;; (buffer-local-value 'pm/current b)) - ;; return b) - ;; (current-buffer))) - (pos (with-current-buffer buffer (point)))) - (dolist (b bufs) - (when (buffer-live-p b) - (with-current-buffer b - (goto-char pos))))))) - -(defun pm--completing-read (prompt collection &optional predicate require-match - initial-input hist def inherit-input-method) - ;; Wrapper for `completing-read'. - ;; Take care when collection is an alist of (name . meta-info). If - ;; so, asks for names, but returns meta-info for that name. Enforce - ;; require-match = t. Also takes care of adding the most relevant - ;; DEF from history. - (if (and (listp collection) - (listp (car collection))) - (let* ((candidates (mapcar #'car collection)) - (thirst (and hist - (delq nil (mapcar (lambda (x) (car (member x candidates))) - (symbol-value hist))))) - (def (or def (car thirst) (car candidates)))) - (assoc (completing-read prompt candidates predicate t initial-input hist def inherit-input-method) - collection)) - (completing-read prompt collection predicate require-match initial-input hist def inherit-input-method))) - - -;;; WEAVING and EXPORTING -;; fixme: move all these into separate polymode-process.el? -(defvar polymode-exporter-output-file-format) -(defvar polymode-weaver-output-file-format) -(declare-function pm-export "polymode-export") -(declare-function pm-weave "polymode-weave") -(declare-function comint-exec "comint") -(declare-function comint-mode "comint") - -(defun pm--wrap-callback (processor slot _ifile) - ;; replace processor :sentinel or :callback temporally in order to export-spec as a - ;; followup step or display the result - (let ((sentinel1 (eieio-oref processor slot)) - (cur-dir default-directory) - (exporter (symbol-value (eieio-oref pm/polymode 'exporter))) - (obuffer (current-buffer))) - (if pm--export-spec - ;; 2-stage weaver->exporter - (let ((espec pm--export-spec)) - (lambda (&rest args) - (with-current-buffer obuffer - (let ((wfile (apply sentinel1 args)) - (pm--export-spec nil) - (pm--input-not-real t)) - ;; If no wfile, probably errors occurred. So we stop. - (when wfile - (when (listp wfile) - ;; In an unlikely situation weaver can generate multiple - ;; files. Pick the first one. - (setq wfile (car wfile))) - (pm-export exporter (car espec) (cdr espec) wfile)))))) - (lambda (&rest args) - (with-current-buffer obuffer - (let ((ofile (apply sentinel1 args))) - (when ofile - (let ((ofiles (if (listp ofile) ofile (list ofile)))) - (dolist (f ofiles) - (pm--display-file (expand-file-name f cur-dir))))))))))) - -(defun pm--file-mod-time (file) - (and (stringp file) - (file-exists-p file) - (nth 5 (file-attributes file)))) - -(defvar-local pm--process-buffer nil) -;; Simplified version of TeX-run-TeX. Run shell COMMAND interactively in BUFFER. -;; Run COMMAND in a buffer (in comint-shell-mode) in order to be able to accept -;; user interaction. -(defun pm--run-shell-command (command sentinel buff-name message) - (require 'comint) - (let* ((buffer (get-buffer-create buff-name)) - (process nil) - ;; weave/export buffers are re-usable; need to transfer some vars - (dd default-directory) - ;; (command (shell-quote-argument command)) - (inhibit-read-only t)) - (with-current-buffer buffer - (setq-local default-directory dd) - (setq buffer-read-only nil) - (erase-buffer) - (insert message) - (comint-exec buffer buff-name shell-file-name nil - (list shell-command-switch command)) - (setq process (get-buffer-process buffer)) - (comint-mode) - (goto-address-mode 1) - (set-process-sentinel process sentinel) - (setq pm--process-buffer t) - (set-marker (process-mark process) (point-max)) - ;; for communication with sentinel - (process-put process :output-file pm--output-file) - (process-put process :output-file-mod-time (pm--file-mod-time pm--output-file)) - (process-put process :input-file pm--input-file) - (when polymode-display-process-buffers - (display-buffer buffer `(nil . ((inhibit-same-window . ,pop-up-windows))))) - nil))) - -(defun pm--make-shell-command-sentinel (action) - (lambda (process _name) - "Sentinel built with `pm--make-shell-command-sentinel'." - (let ((buff (process-buffer process)) - (status (process-exit-status process))) - (if (> status 0) - (progn - (message "Errors during %s; process exit status %d" action status) - (ding) (sit-for 1) - nil) - (with-current-buffer buff - (let ((ofile (process-get process :output-file))) - (cond - ;; 1. output-file guesser - ((functionp ofile) (funcall ofile)) - ;; 2. string - (ofile - (let ((otime (process-get process :output-file-mod-time)) - (ntime (pm--file-mod-time ofile))) - (if (or (null ntime) - (and otime - (not (time-less-p otime ntime)))) - ;; mod time didn't change - ;; tothink: shall we still return ofile for display? - (progn - (display-buffer (current-buffer)) - (message "Output file unchanged. Either input unchanged or errors during %s." action) - (ding) (sit-for 1) - ofile) - ;; else, all is good, we return the file name - ;; (display-buffer (current-buffer)) - (message "Done with %s" action) - ofile))) - ;; 3. output file is not known; display process buffer - (t (display-buffer (current-buffer)) nil)))))))) - -(fset 'pm-default-shell-export-sentinel (pm--make-shell-command-sentinel "export")) -(fset 'pm-default-shell-weave-sentinel (pm--make-shell-command-sentinel "weaving")) - -(defun pm--make-selector (specs elements) - (cond ((functionp elements) elements) - ((listp elements) - (let ((spec-alist (cl-mapcar #'cons specs elements))) - (lambda (selsym &rest _ignore) - (cdr (assoc selsym spec-alist))))) - (t (error "Elements argument must be either a list or a function")))) - -(defun pm--selector (processor type id) - (let ((spec (or (assoc id (eieio-oref processor type)) - (error "%s spec '%s' cannot be found in '%s'" - (symbol-name type) id (eieio-object-name processor)))) - (names (cond - ;; exporter slots - ((eq type :from) '(regexp doc command)) - ((eq type :to) '(ext doc t-spec)) - ;; weaver slot - ((eq type :from-to) '(regexp ext doc command)) - (t (error "Invalid type '%s'" type))))) - (cons id (pm--make-selector names (cdr spec))))) - -(defun pm--selector-match (el &optional file) - (let* ((id (car el)) - (regexp (funcall (cdr el) 'regexp id))) - (or (funcall (cdr el) 'match id file) - (and regexp - (string-match-p regexp (or file buffer-file-name)))))) - -(defun pm--matched-selectors (translator slot) - (let ((translator (if (symbolp translator) - (symbol-value translator) - translator))) - (cl-loop for el in (pm--selectors translator slot) - when (pm--selector-match el) - collect el))) - -(defun pm--selectors (processor type) - (let ((ids (mapcar #'car (eieio-oref processor type)))) - (mapcar (lambda (id) (pm--selector processor type id)) ids))) - -(defun pm--output-command.file (output-file-format sfrom &optional sto quote) - ;; !!Must be run in input buffer!! - (cl-flet ((squote (arg) (or (and (stringp arg) - (if quote (shell-quote-argument arg) arg)) - ""))) - (let* ((el (or sto sfrom)) - (base-ofile (or (funcall (cdr el) 'output-file (car el)) - (let ((ext (funcall (cdr el) 'ext (car el)))) - (when ext - (concat (format output-file-format - (file-name-base buffer-file-name)) - "." ext))))) - (ofile (and (stringp base-ofile) - (expand-file-name base-ofile))) - (oname (and (stringp base-ofile) - (file-name-base base-ofile))) - (t-spec (and sto (funcall (cdr sto) 't-spec (car sto)))) - (command-w-formats (or (and sto (funcall (cdr sto) 'command (car sto))) - (and (listp t-spec) (car t-spec)) - (funcall (cdr sfrom) 'command (car sfrom)))) - (command (format-spec command-w-formats - (list (cons ?i (squote (file-name-nondirectory buffer-file-name))) - (cons ?I (squote buffer-file-name)) - (cons ?o (squote base-ofile)) - (cons ?O (squote ofile)) - (cons ?b (squote oname)) - (cons ?t (squote t-spec)))))) - (cons command (or ofile base-ofile))))) - -(defun pm--process-internal (processor from to ifile &optional callback quote) - (let ((is-exporter (object-of-class-p processor 'pm-exporter))) - (if is-exporter - (unless (and from to) - (error "For exporter both FROM and TO must be supplied (from: %s, to: %s)" from to)) - (unless from - ;; it represents :from-to slot - (error "For weaver FROM must be supplied (from: %s)" from))) - (let* ((sfrom (if is-exporter - (pm--selector processor :from from) - (pm--selector processor :from-to from))) - (sto (and is-exporter (pm--selector processor :to to))) - (ifile (or ifile buffer-file-name)) - ;; fixme: nowarn is only right for inputs from weavers, you need to - ;; save otherwise - (ibuffer (if pm--input-not-real - ;; for exporter input we silently re-fetch the file - ;; even if it was modified - (find-file-noselect ifile t) - ;; if real user file, get it or fetch it - (or (get-file-buffer ifile) - (find-file-noselect ifile)))) - (output-format (if is-exporter - polymode-exporter-output-file-format - polymode-weaver-output-file-format))) - (when (buffer-live-p ibuffer) - (with-current-buffer ibuffer - ;; FIXME: could be deleted buffer in weaver->exporter pipeline? - (save-buffer) - (let ((comm.ofile (pm--output-command.file output-format sfrom sto quote))) - (let* ((pm--output-file (cdr comm.ofile)) - (pm--input-file ifile) - ;; skip weaving step if possible - ;; :fixme this should not happen after weaver/exporter change - ;; or after errors in previous exporter - (omt (and polymode-skip-processing-when-unmodified - (stringp pm--output-file) - (pm--file-mod-time pm--output-file))) - (imt (and omt (pm--file-mod-time pm--input-file))) - (action (if is-exporter "exporting" "weaving")) - (ofile (if (and imt (time-less-p imt omt)) - (progn - (message "Not re-%s as input file '%s' hasn't changed" - (file-name-nondirectory ifile) action) - pm--output-file) - (message "%s '%s' with '%s' ..." - (capitalize action) - (file-name-nondirectory ifile) - (eieio-object-name processor)) - (let ((fn (with-no-warnings - (eieio-oref processor 'function))) - ;; `to` is nil for weavers - (args (delq nil (list from to))) - (comm (car comm.ofile))) - (if callback - ;; the display is handled within the - ;; callback and return value of :function - ;; slot is ignored - (progn (apply fn comm callback args) - nil) - (apply fn comm args)))))) - (when ofile - (if pm--export-spec - ;; same logic as in pm--wrap-callback - (let ((pm--input-not-real t) - (espec pm--export-spec) - (pm--export-spec nil)) - (when (listp ofile) - (setq ofile (car ofile))) - (pm-export (symbol-value (eieio-oref pm/polymode 'exporter)) - (car espec) (cdr espec) - ofile)) - (pm--display-file ofile)))))))))) - -;; (defun replace-poly-spec () -;; (interactive) -;; (when (re-search-forward "defcustom +pm-\\(inner\\|host\\|poly\\)/\\([^ \n]+\\)" nil t) -;; (let* ((mode (match-string 2)) -;; (type (match-string 1)) -;; (new-name (format "poly-%s-%smode" mode type))) -;; (previous-line 1) -;; (insert (format "(define-obsolete-variable-alias 'pm-%s/%s '%s \"v0.2\")\n" type mode new-name)) -;; (insert (format "(define-%smode %s\n)" type new-name))))) - -(provide 'polymode-core) -;;; polymode-core.el ends here diff --git a/elpa/polymode-20200411.915/polymode-core.elc b/elpa/polymode-20200411.915/polymode-core.elc deleted file mode 100644 index 9c4a093656ff98375c7554984dcc9b4e4740ce92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53647 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 SRo^P`X(exgc)8Bn;{OjkPlB=l diff --git a/elpa/polymode-20200411.915/polymode-debug.el b/elpa/polymode-20200411.915/polymode-debug.el deleted file mode 100644 index a1a2b763..00000000 --- a/elpa/polymode-20200411.915/polymode-debug.el +++ /dev/null @@ -1,557 +0,0 @@ -;;; polymode-debug.el --- Interactive debugging utilities for polymode -*- lexical-binding: t -*- -;; -;; Copyright (C) 2016-2018 Vitalie Spinu -;; Author: Vitalie Spinu -;; URL: https://github.com/polymode/polymode -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; This file is *NOT* part of GNU Emacs. -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 3, or -;; (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; - -;;; Commentary: -;; - -;;; Code: - -(require 'polymode-core) -(require 'poly-lock) -(require 'trace) - - -;;; MINOR MODE - -(defvar pm--underline-overlay - (let ((overlay (make-overlay (point) (point)))) - (overlay-put overlay 'face '(:underline (:color "tomato" :style wave))) - overlay) - "Overlay used in function `pm-debug-mode'.") - -(defvar pm--highlight-overlay - (let ((overlay (make-overlay (point) (point)))) - (overlay-put overlay 'face '(:inverse-video t)) - overlay) - "Overlay used by `pm-debug-map-over-spans-and-highlight'.") - -(defvar pm-debug-minor-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "M-n M-i") #'pm-debug-info-on-current-span) - (define-key map (kbd "M-n i") #'pm-debug-info-on-current-span) - (define-key map (kbd "M-n M-p") #'pm-debug-print-relevant-variables) - (define-key map (kbd "M-n p") #'pm-debug-print-relevant-variables) - (define-key map (kbd "M-n M-h") #'pm-debug-map-over-spans-and-highlight) - (define-key map (kbd "M-n h") #'pm-debug-map-over-spans-and-highlight) - (define-key map (kbd "M-n M-t t") #'pm-toggle-tracing) - (define-key map (kbd "M-n M-t i") #'pm-debug-toogle-info-message) - (define-key map (kbd "M-n M-t f") #'pm-debug-toggle-fontification) - (define-key map (kbd "M-n M-t p") #'pm-debug-toggle-post-command) - (define-key map (kbd "M-n M-t c") #'pm-debug-toggle-after-change) - (define-key map (kbd "M-n M-t a") #'pm-debug-toggle-all) - (define-key map (kbd "M-n M-t M-t") #'pm-toggle-tracing) - (define-key map (kbd "M-n M-t M-i") #'pm-debug-toogle-info-message) - (define-key map (kbd "M-n M-t M-f") #'pm-debug-toggle-fontification) - (define-key map (kbd "M-n M-t M-p") #'pm-debug-toggle-post-command) - (define-key map (kbd "M-n M-t M-c") #'pm-debug-toggle-after-change) - (define-key map (kbd "M-n M-t M-a") #'pm-debug-toggle-all) - (define-key map (kbd "M-n M-f s") #'pm-debug-fontify-current-span) - (define-key map (kbd "M-n M-f b") #'pm-debug-fontify-current-buffer) - (define-key map (kbd "M-n M-f M-t") #'pm-debug-toggle-fontification) - (define-key map (kbd "M-n M-f M-s") #'pm-debug-fontify-current-span) - (define-key map (kbd "M-n M-f M-b") #'pm-debug-fontify-current-buffer) - map)) - -;;;###autoload -(define-minor-mode pm-debug-minor-mode - "Turns on/off useful facilities for debugging polymode. - -Key bindings: -\\{pm-debug-minor-mode-map}" - nil - " PMDBG" - :group 'polymode - (if pm-debug-minor-mode - (progn - ;; this is global hook. No need to complicate with local hooks - (add-hook 'post-command-hook 'pm-debug-highlight-current-span)) - (delete-overlay pm--underline-overlay) - (delete-overlay pm--highlight-overlay) - (remove-hook 'post-command-hook 'pm-debug-highlight-current-span))) - -;;;###autoload -(defun pm-debug-minor-mode-on () - ;; activating everywhere (in case font-lock infloops in a polymode buffer ) - ;; this doesn't activate in fundamental mode - (unless (eq major-mode 'minibuffer-inactive-mode) - (pm-debug-minor-mode t))) - -;;;###autoload -(define-globalized-minor-mode pm-debug-mode pm-debug-minor-mode pm-debug-minor-mode-on) - - -;;; INFO - -(cl-defgeneric pm-debug-info (chunkmode)) -(cl-defmethod pm-debug-info (chunkmode) - (eieio-object-name chunkmode)) -(cl-defmethod pm-debug-info ((chunkmode pm-inner-chunkmode)) - (format "%s head-matcher:\"%s\" tail-matcher:\"%s\"" - (cl-call-next-method) - (eieio-oref chunkmode 'head-matcher) - (eieio-oref chunkmode 'tail-matcher))) -(cl-defmethod pm-debug-info ((_chunkmode pm-inner-auto-chunkmode)) - (cl-call-next-method)) - -(defvar syntax-ppss-wide) -(defvar syntax-ppss-last) -(defun pm--debug-info (&optional span as-list) - (let* ((span (or span (and polymode-mode (pm-innermost-span)))) - (message-log-max nil) - (beg (nth 1 span)) - (end (nth 2 span)) - (obj (nth 3 span)) - (type (and span (or (car span) 'host)))) - (let ((out (list (current-buffer) - (point-min) (point) (point-max) - major-mode - type beg end - (and obj (pm-debug-info obj)) - (format "lppss:%s" - (if pm--emacs>26 - (car syntax-ppss-wide) - syntax-ppss-last))))) - (if as-list - out - (apply #'format - "(%s) min:%d pos:%d max:%d || (%s) type:%s span:%s-%s %s %s" - out))))) - -(defun pm-debug-info-on-current-span (no-cache) - "Show info on current span. -With NO-CACHE prefix, don't use cached values of the span." - (interactive "P") - (if (not polymode-mode) - (message "not in a polymode buffer") - (let ((span (pm-innermost-span nil no-cache))) - (message (pm--debug-info span)) - ;; (move-overlay pm--highlight-overlay (nth 1 span) (nth 2 span) (current-buffer)) - (pm-debug-flick-region (nth 1 span) (nth 2 span))))) - -(defun pm-debug-report-points (&optional where) - (when polymode-mode - (let* ((bufs (eieio-oref pm/polymode '-buffers)) - (poses (mapcar (lambda (b) - (format "%s:%d" b (with-current-buffer b (point)))) - bufs))) - (message "<%s> cb:%s %s" (or where "") (current-buffer) poses))) - nil) - - -;;; TOGGLING - -(defvar pm-debug-display-info-message nil) -(defun pm-debug-toogle-info-message () - "Toggle permanent info display." - (interactive) - (setq pm-debug-display-info-message (not pm-debug-display-info-message))) - -(defvar poly-lock-allow-fontification) -(defun pm-debug-toggle-fontification () - "Enable or disable fontification in polymode buffers." - (interactive) - (if poly-lock-allow-fontification - (progn - (message "fontificaiton disabled") - (dolist (b (buffer-list)) - (with-current-buffer b - (when polymode-mode - (setq poly-lock-allow-fontification nil - font-lock-mode nil - fontification-functions nil))))) - (message "fontificaiton enabled") - (dolist (b (buffer-list)) - (with-current-buffer b - (when polymode-mode - (setq poly-lock-allow-fontification t - font-lock-mode t - fontification-functions '(poly-lock-function))))))) - -(defun pm-debug-toggle-after-change () - "Allow or disallow polymode actions in `after-change-functions'." - (interactive) - (if pm-allow-after-change-hook - (progn - (message "after-change disabled") - (setq pm-allow-after-change-hook nil)) - (message "after-change enabled") - (setq pm-allow-after-change-hook t))) - -(defun pm-debug-toggle-post-command () - "Allow or disallow polymode actions in `post-command-hook'." - (interactive) - (if pm-allow-post-command-hook - (progn - (message "post-command disabled") - (setq pm-allow-post-command-hook nil)) - (message "post-command enabled") - (setq pm-allow-post-command-hook t))) - -(defun pm-debug-toggle-all () - "Toggle all polymode guards back and forth." - (interactive) - (if poly-lock-allow-fontification - (progn - (message "fontificaiton, after-chnage and command-hook disabled") - (setq poly-lock-allow-fontification nil - pm-allow-after-change-hook nil - pm-allow-post-command-hook nil)) - (message "fontificaiton, after-change and command-hook enabled") - (setq poly-lock-allow-fontification t - pm-allow-after-change-hook t - pm-allow-post-command-hook t))) - - -;;; FONT-LOCK - -(defun pm-debug-fontify-current-span () - "Fontify current span." - (interactive) - (let ((span (pm-innermost-span)) - (poly-lock-allow-fontification t)) - (poly-lock-flush (nth 1 span) (nth 2 span)) - (poly-lock-fontify-now (nth 1 span) (nth 2 span)))) - -(defun pm-debug-fontify-current-buffer () - "Fontify current buffer." - (interactive) - (let ((poly-lock-allow-fontification t)) - (font-lock-unfontify-buffer) - (poly-lock-flush (point-min) (point-max)) - (poly-lock-fontify-now (point-min) (point-max)))) - - -;;; TRACING - -(defvar pm-traced-functions - '( - ;; core initialization - (0 (pm-initialize - pm--common-setup - pm--mode-setup)) - ;; core hooks - (1 (polymode-post-command-select-buffer - polymode-after-kill-fixes - ;; this one indicates the start of a sequence - poly-lock-after-change)) - ;; advises - (2 (pm-override-output-cons - pm-around-advice - polymode-with-current-base-buffer)) - ;; font-lock - (3 (font-lock-default-fontify-region - font-lock-fontify-keywords-region - font-lock-fontify-region - font-lock-fontify-syntactically-region - font-lock-unfontify-region - jit-lock--run-functions - jit-lock-fontify-now - poly-lock--after-change-internal - poly-lock--extend-region - poly-lock--extend-region-span - poly-lock-after-change - poly-lock-flush - poly-lock-fontify-now - poly-lock-function)) - ;; syntax - (4 (syntax-ppss - pm--call-syntax-propertize-original - polymode-syntax-propertize - polymode-restrict-syntax-propertize-extension - pm-flush-syntax-ppss-cache - pm--reset-ppss-cache)) - ;; core functions - (5 (pm-select-buffer - pm-map-over-spans - pm--get-intersected-span - pm--cached-span)) - ;; (13 . "^syntax-") - (14 . "^polymode-") - (15 . "^pm-"))) - -(defvar pm--do-trace nil) -;;;###autoload -(defun pm-toggle-tracing (level) - "Toggle polymode tracing. -With numeric prefix toggle tracing for that LEVEL. Currently -universal argument toggles maximum level of tracing (4). Default -level is 3." - (interactive "P") - (setq level (prefix-numeric-value (or level 3))) - (with-current-buffer (get-buffer-create "*Messages*") - (read-only-mode -1)) - (setq pm--do-trace (not pm--do-trace)) - (if pm--do-trace - (progn (dolist (kv pm-traced-functions) - (when (<= (car kv) level) - (if (stringp (cdr kv)) - (pm-trace-functions-by-regexp (cdr kv)) - (dolist (fn (cadr kv)) - (pm-trace fn))))) - (message "Polymode tracing activated")) - (untrace-all) - (message "Polymode tracing deactivated"))) - - -;;;###autoload -(defun pm-trace (fn) - "Trace function FN. -Use `untrace-function' to untrace or `untrace-all' to untrace all -currently traced functions." - (interactive (trace--read-args "Trace: ")) - (let ((buff (get-buffer "*Messages*"))) - (unless (advice-member-p trace-advice-name fn) - (advice-add - fn :around - (let ((advice (trace-make-advice - fn buff 'background - #'pm-trace--tracing-context))) - (lambda (body &rest args) - (when (eq fn 'polymode-flush-syntax-ppss-cache) - (with-current-buffer buff - (save-excursion - (goto-char (point-max)) - (insert "\n")))) - (if polymode-mode - (apply advice body args) - (apply body args)))) - `((name . ,trace-advice-name) - (depth . -100)))))) - -(defun pm-trace-functions-by-regexp (regexp) - "Trace all functions whose name matched REGEXP." - (interactive "sRegex: ") - (cl-loop for sym being the symbols - when (and (fboundp sym) - (not (memq sym '(pm-toggle-tracing - pm-trace--tracing-context - pm-format-span - pm-fun-matcher - pm--find-tail-from-head))) - (not (string-match "^pm-\\(trace\\|debug\\)" (symbol-name sym))) - (string-match regexp (symbol-name sym))) - do (pm-trace sym))) - -(defun pm-trace--tracing-context () - (let ((span (or *span* - (get-text-property (point) :pm-span)))) - (format " [%s pos:%d(%d-%d) %s%s (%f)]" - (current-buffer) (point) (point-min) (point-max) - (or (when span - (when (not (and (= (point-min) (nth 1 span)) - (= (point-max) (nth 2 span)))) - "UNPR ")) - "") - (when span - (pm-format-span span)) - (float-time)))) - -;; fix object printing -(defun pm-trace--fix-1-arg-for-tracing (arg) - (cond - ((eieio-object-p arg) (eieio-object-name arg)) - ((and (listp arg) (eieio-object-p (nth 3 arg))) - (list (nth 0 arg) (nth 1 arg) (nth 2 arg) (eieio-object-name (nth 3 arg)))) - (arg))) - -(defun pm-trace--fix-args-for-tracing (orig-fn fn level args context) - (let ((args (or (and (listp args) - (listp (cdr args)) - (ignore-errors (mapcar #'pm-trace--fix-1-arg-for-tracing args))) - args))) - (funcall orig-fn fn level args context))) - -(advice-add #'trace-entry-message :around #'pm-trace--fix-args-for-tracing) -(advice-add #'trace-exit-message :around #'pm-trace--fix-args-for-tracing) -;; (advice-remove #'trace-entry-message #'pm-trace--fix-args-for-tracing) -;; (advice-remove #'trace-exit-message #'pm-trace--fix-args-for-tracing) - - -;;; RELEVANT VARIABLES - -(defvar pm-debug-relevant-variables - `(:change - (before-change-functions after-change-functions) - :command (pre-command-hook - post-command-hook) - :font-lock (fontification-functions - font-lock-function - font-lock-flush-function - font-lock-ensure-function - font-lock-fontify-region-function - font-lock-fontify-buffer-function - font-lock-unfontify-region-function - font-lock-unfontify-buffer-function - jit-lock-after-change-extend-region-functions - jit-lock-functions - poly-lock-defer-after-change) - ;; If any of these are reset by host mode it can create issues with - ;; font-lock and syntax (e.g. scala-mode in #195) - :search (parse-sexp-lookup-properties - parse-sexp-ignore-comments - ;; (syntax-table) - ;; font-lock-syntax-table - case-fold-search) - :indent (indent-line-function - indent-region-function - pm--indent-line-function-original) - :revert (revert-buffer-function - before-revert-hook - after-revert-hook) - :save (after-save-hook - before-save-hook - write-contents-functions - local-write-file-hooks - write-file-functions) - :syntax (syntax-propertize-function - syntax-propertize-extend-region-functions - pm--syntax-propertize-function-original))) - -;;;###autoload -(defun pm-debug-relevant-variables (&optional out-type) - "Get the relevant polymode variables. -If OUT-TYPE is 'buffer, print the variables in the dedicated -buffer, if 'message issue a message, if nil just return a list of values." - (interactive (list 'buffer)) - (let* ((cbuff (current-buffer)) - (vars (cl-loop for v on pm-debug-relevant-variables by #'cddr - collect (cons (car v) - (mapcar (lambda (v) - (cons v (buffer-local-value v cbuff))) - (cadr v)))))) - (require 'pp) - (cond - ((eq out-type 'buffer) - (with-current-buffer (get-buffer-create "*polymode-vars*") - (erase-buffer) - (goto-char (point-max)) - (insert (format "\n================== %s ===================\n" cbuff)) - (insert (pp-to-string vars)) - (toggle-truncate-lines -1) - (goto-char (point-max)) - (view-mode) - (display-buffer (current-buffer)))) - ((eq out-type 'message) - (message "%s" (pp-to-string vars))) - (t vars)))) - -(defun pm-debug-diff-local-vars (&optional buffer1 buffer2) - "Print differences between local variables in BUFFER1 and BUFFER2." - (interactive) - (let* ((buffer1 (or buffer1 (read-buffer "Buffer1: " (buffer-name (current-buffer))))) - (buffer2 (or buffer2 (read-buffer "Buffer2: " (buffer-name (nth 2 (buffer-list)))))) - (vars1 (buffer-local-variables (get-buffer buffer1))) - (vars2 (buffer-local-variables (get-buffer buffer2))) - (all-keys (delete-dups (append (mapcar #'car vars1) - (mapcar #'car vars2)))) - (out-buf (get-buffer-create "*pm-debug-output"))) - (with-current-buffer out-buf - (erase-buffer) - (pp (delq nil - (mapcar (lambda (k) - (let ((val1 (cdr (assoc k vars1))) - (val2 (cdr (assoc k vars2)))) - (unless (equal val1 val2) - (list k val1 val2)))) - all-keys)) - out-buf)) - (pop-to-buffer out-buf))) - - -;;; HIGHLIGHT - -(defun pm-debug-highlight-current-span () - (when polymode-mode - (with-silent-modifications - (unless (memq this-command '(pm-debug-info-on-current-span - pm-debug-highlight-last-font-lock-error-region)) - (delete-overlay pm--highlight-overlay)) - (condition-case-unless-debug err - (let ((span (pm-innermost-span))) - (when pm-debug-display-info-message - (message (pm--debug-info span))) - (move-overlay pm--underline-overlay (nth 1 span) (nth 2 span) (current-buffer))) - (error (message "%s" (error-message-string err))))))) - -(defun pm-debug-flick-region (start end &optional delay) - (move-overlay pm--highlight-overlay start end (current-buffer)) - (run-with-timer (or delay 0.4) nil (lambda () (delete-overlay pm--highlight-overlay)))) - -(defun pm-debug-map-over-spans-and-highlight () - "Map over all spans in the buffer and highlight briefly." - (interactive) - (pm-map-over-spans (lambda (span) - (let ((start (nth 1 span)) - (end (nth 2 span))) - (pm-debug-flick-region start end) - (sit-for 1))) - (point-min) (point-max) nil nil t)) - -(defun pm-debug-map-over-modes-and-highlight (&optional beg end) - "Map over all spans between BEG and END and highlight modes." - (interactive) - (let ((cbuf (current-buffer))) - (pm-fast-map-over-modes - (lambda (beg end) - (goto-char beg) - ;; (dbg beg end (pm-format-span)) - (with-current-buffer cbuf - (recenter-top-bottom) - (pm-debug-flick-region (max beg (point-min)) - (min end (point-max)))) - (sit-for 1)) - (or beg (point-min)) - (or end (point-max))))) - -(defun pm-debug-run-over-check (no-cache) - "Map over all spans and report the time taken. -Switch to buffer is performed on every position in the buffer. -On prefix NO-CACHE don't use cached spans." - (interactive) - (goto-char (point-min)) - (let ((start (current-time)) - (count 1) - (pm-initialization-in-progress no-cache)) - (pm-switch-to-buffer) - (while (< (point) (point-max)) - (setq count (1+ count)) - (forward-char) - (pm-switch-to-buffer)) - (let ((elapsed (float-time (time-subtract (current-time) start)))) - (message "Elapsed: %s per-char: %s" elapsed (/ elapsed count))))) - -(defun pm-dbg (msg &rest args) - (let ((cbuf (current-buffer)) - (cpos (point))) - (with-current-buffer (get-buffer-create "*pm-dbg*") - (save-excursion - (goto-char (point-max)) - (insert "\n") - (insert (apply 'format (concat "%f [%s at %d]: " msg) - (float-time) cbuf cpos args)))))) - -(provide 'polymode-debug) -;;; polymode-debug.el ends here diff --git a/elpa/polymode-20200411.915/polymode-debug.elc b/elpa/polymode-20200411.915/polymode-debug.elc deleted file mode 100644 index ce83d5b87137c7ca3dfdc5d1ff5232c22debad29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20448 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. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; - -;;; Commentary: -;; - -;;; Code: - -(require 'polymode-core) -(require 'polymode-classes) - -(defgroup polymode-export nil - "Polymode Exporters" - :group 'polymode) - -(defcustom polymode-exporter-output-file-format "%s-exported" - "Format of the exported files. -%s is substituted with the current file name sans extension." - :group 'polymode-export - :type 'string) - -(defclass pm-exporter (pm-root) - ((from - :initarg :from - :initform '() - :type list - :custom list - :documentation - "Input exporter specifications. - This is an alist of elements of the form (id regexp doc - commmand) or (id . selector). ID is the unique identifier of - the spec. REGEXP is a regexp which, if matched on current - file name, implies that the current file can be exported - with this specification. DOC is a short help string shown - during interactive export. COMMAND is the exporter - command (string). It can contain the following format specs: - - %i - input file (no dir) - %I - input file (full path) - %o - output file (no dir) - %O - output file (full path) - %b - output file (base name only) - %t - 4th element of the :to spec - - When specification is of the form (id . selector), SELECTOR - is a function of variable arguments that accepts at least - one argument ACTION. ACTION is a symbol and can be one of - the following: - - match - must return non-nil if this specification - applies to the file that current buffer is visiting, - or :nomatch if specification does not apply. This - selector can receive an optional file-name - argument. In that case the decision must be made - solely on that file and current buffer must be - ignored. This is useful for matching exporters to - weavers when exported file does not exist yet. - - regexp - return a string which is used to match input - file name. If nil, `match' selector must return - non-nil value. This selector is ignored if `match' - returned non-nil. - - doc - return documentation string - - commmand - return a string with optional %i, %f, - etc. format specs as described above. It will be - passed to the processing :function.") - - (to - :initarg :to - :initform '() - :type list - :custom list - :documentation - " - Output specifications alist. Each element is either a list - of the form (id ext doc t-spec) or a cons (id . selector). - - In the former case EXT is an extension of the output file. - DOC is a short documentation string. t-spec is a string what - is substituted instead of %t in :from spec commmand. - `t-spec' can be a list of one element '(command), in which - case the whole :from spec command is substituted with - command from %t-spec. - - When specification is of the form (id . selector), SELECTOR - is a function of variable arguments with first two arguments - being ACTION and ID of the specification. This function is - called in a buffer visiting input file. ACTION is a symbol - and can one of the following: - - output-file - return an output file name or a list of file - names. Receives input-file as argument. If this - command returns nil, the output is built from input - file and value of 'output-ext command. - - - This selector can also return a function. This - function will be called in the callback or sentinel of - the weaving process after the weaving was - completed. This function should sniff the output of - the process for errors or file names. It must return a - file name, a list of file names or nil if no such - files have been detected. - - ext - extension of output file. If nil and `output-file' - also returned nil, the exporter won't be able to - identify the output file and no automatic display or - preview will be available. - - doc - return documentation string - - command - return a string to be used instead of - the :from command. If nil, :from spec command is used. - - t-spec - return a string to be substituted as %t :from - spec in :from command. If `command' selector returned - non-nil, this spec is ignored.") - (function - :initarg :function - :initform (lambda (command from to) - (error "Function not defined for this exporter")) - :type (or symbol function) - :documentation - "Function to process the commmand. Must take 3 arguments - COMMAND, FROM-ID and TO-ID and return an output file name or - a list of output file names. COMMAND is the 4th argument of - :from spec with all the formats substituted. FROM-ID is the - id of requested :from spec, TO-ID is the id of the :to - spec.")) - "Root exporter class.") - -(defclass pm-callback-exporter (pm-exporter) - ((callback - :initarg :callback - :initform nil - :type (or symbol function) - :documentation - "Callback function to be called by function in :function - slot. Callback must return an output file name or a list of - output file-names. There is no default callback.")) - "Class to represent asynchronous exporters. -:function slot must be a function with 4 arguments COMMAND, -CALLBACK, FROM-ID and TO-ID.") - -(defclass pm-shell-exporter (pm-exporter) - ((function - :initform 'pm-default-shell-export-function) - (sentinel - :initarg :sentinel - :initform 'pm-default-shell-export-sentinel - :type (or symbol function) - :documentation - "Sentinel function to be called by :function when a shell - call is involved. Sentinel should return the output file - name.") - (quote - :initarg :quote - :initform nil - :type boolean - :documentation "Non-nil when file arguments must be quoted - with `shell-quote-argument'.")) - "Class to represent exporters that call external processes.") - -(defun pm-default-shell-export-function (command sentinel from to) - "Run exporting COMMAND interactively to convert FROM to TO. -Run command in a buffer (in comint-shell-mode) so that it accepts -user interaction. This is a default function in all exporters -that call a shell command. SENTINEL is the process sentinel." - (pm--run-shell-command command sentinel "*polymode export*" - (concat "Exporting " from "-->" to " with command:\n\n " - command "\n\n"))) - - -;;; METHODS - -(cl-defgeneric pm-export (exporter from to &optional ifile) - "Process IFILE with EXPORTER.") - -(cl-defmethod pm-export ((exporter pm-exporter) from to &optional ifile) - (pm--process-internal exporter from to ifile)) - -(cl-defmethod pm-export ((exporter pm-callback-exporter) from to &optional ifile) - (let ((cb (pm--wrap-callback exporter :callback ifile))) - (pm--process-internal exporter from to ifile cb))) - -(cl-defmethod pm-export ((exporter pm-shell-exporter) from to &optional ifile) - (let ((cb (pm--wrap-callback exporter :sentinel ifile))) - (pm--process-internal exporter from to ifile cb (eieio-oref exporter 'quote)))) - - -;; UI - -(defvar pm--exporter-hist nil) -(defvar pm--export:from-hist nil) -(defvar pm--export:from-last nil) -(defvar pm--export:to-hist nil) -(defvar pm--export:to-last nil) -(declare-function polymode-set-weaver "polymode-weave") -(declare-function pm-weave "polymode-weave") - -(defun polymode-export (&optional from to) - "Export current file. - -FROM and TO are the ids of the :from and :to slots of the current -exporter. If the current exporter hasn't been set yet, set the -exporter with `polymode-set-exporter'. You can always change the -exporter manually by invoking `polymode-set-exporter'. - -When FROM or TO are missing they are determined automatically -from the current exporter's specifications and file's -extension. If no appropriate export specification has been found, -look into current weaver and try to match weaver's output to -exporters input extension. When such combination is possible, -settle on weaving first and exporting the weaved output. When -none of the above worked, ask the user for `from' and `to' specs. - -When called with prefix argument, ask for FROM and TO -interactively. See constructor function ‘pm-exporter’ for the -complete specification." - (interactive "P") - (cl-flet ((to-name.id (el) (let* ((ext (funcall (cdr el) 'ext (car el))) - (name (if ext - (format "%s (%s)" (funcall (cdr el) 'doc (car el)) ext) - (funcall (cdr el) 'doc (car el))))) - (cons name (car el)))) - (from-name.id (el) (cons (funcall (cdr el) 'doc (car el)) (car el)))) - (let* ((exporter (symbol-value (or (eieio-oref pm/polymode 'exporter) - (polymode-set-exporter t)))) - (fname (file-name-nondirectory buffer-file-name)) - (gprompt nil) - (case-fold-search t) - - (from-opts (mapcar #'from-name.id (pm--selectors exporter :from))) - (from-id - (cond - ;; A: guess from spec - ((null from) - (or - ;; 1. repeated export; don't ask - pm--export:from-last - - ;; 2. select :from entries which match to current context - (let ((matched (pm--matched-selectors exporter :from))) - (when matched - (if (> (length matched) 1) - (cdr (pm--completing-read "Multiple `from' specs matched. Choose one: " - (mapcar #'from-name.id matched))) - (caar matched)))) - - ;; 3. guess from weaver and return a cons (weaver-id . exporter-id) - (let ((weaver (symbol-value (or (eieio-oref pm/polymode 'weaver) - (progn - (setq gprompt "Choose `from' spec: ") - (polymode-set-weaver)))))) - (when weaver - ;; fixme: weaver was not yet ported to selectors - ;; fixme: currently only first match is returned - (let ((pair (cl-loop for w in (eieio-oref weaver 'from-to) - ;; weaver input extension matches the filename - if (string-match-p (nth 1 w) fname) - return (cl-loop for el in (pm--selectors exporter :from) - ;; input exporter extensnion matches weaver output extension - when (pm--selector-match el (concat "dummy." (nth 2 w))) - return (cons (car w) (car el)))))) - (when pair - (message "Matching weaver found. Weaving to '%s' first." (car pair)) - pair)))) - - ;; 4. nothing matched; ask - (let* ((prompt (or gprompt "No `from' specs matched. Choose one: ")) - (sel (pm--completing-read prompt from-opts nil t nil 'pm--export:from-hist))) - (cdr sel)))) - - ;; B: C-u, force a :from spec - ((equal from '(4)) - (cdr (if (> (length from-opts) 1) - (pm--completing-read "Input type: " from-opts nil t nil 'pm--export:from-hist) - (car from-opts)))) - - ;; C. string - ((stringp from) - (if (assoc from (eieio-oref exporter 'from)) - from - (error "Cannot find `from' spec '%s' in %s exporter" - from (eieio-object-name exporter)))) - ;; D. error - (t (error "'from' argument must be nil, universal argument or a string")))) - - (to-opts (mapcar #'to-name.id (pm--selectors exporter :to))) - (to-id - (cond - ;; A. guess from spec - ((null to) - (or - ;; 1. repeated export; don't ask and use first entry in history - (unless (equal from '(4)) - pm--export:to-last) - - ;; 2. First export or C-u - (if (= (length to-opts) 1) - (cdar to-opts) - (cdr (pm--completing-read "Export to: " to-opts nil t nil 'pm--export:to-hist))))) - - ;; B. string - ((stringp to) - (if (assoc to (eieio-oref exporter 'to)) - to - (error "Cannot find output spec '%s' in %s exporter" - to (eieio-object-name exporter)))) - ;; C . Error - (t (error "'to' argument must be nil or a string"))))) - - (setq-local pm--export:from-last from-id) - (setq-local pm--export:to-last to-id) - - (if (consp from-id) - ;; run through weaver - (let ((pm--export-spec (cons (cdr from-id) to-id)) - (pm--output-not-real t)) - (pm-weave (symbol-value (eieio-oref pm/polymode 'weaver)) (car from-id))) - (pm-export exporter from-id to-id))))) - -(defun polymode-set-exporter (&optional no-ask-if-1) - "Interactively set exporter for the current file. -If NO-ASK-IF-1 is non-nil, don't ask if there is only one exporter." - (interactive) - (unless pm/polymode - (error "No pm/polymode object found. Not in polymode buffer?")) - (let* ((weavers (delete-dups (pm--oref-with-parents pm/polymode :weavers))) - (exporters (pm--abrev-names - "pm-exporter/\\|-exporter" - (cl-delete-if-not - (lambda (el) - (or (pm--matched-selectors el :from) - ;; FIXME: rewrite this abomination - ;; Match weaver to the exporter. - (cl-loop for weaver in weavers - if (cl-loop for w in (eieio-oref (symbol-value weaver) 'from-to) - ;; weaver input extension matches the filename - if (string-match-p (nth 1 w) buffer-file-name) - return (cl-loop for el in (pm--selectors (symbol-value el) :from) - ;; input exporter extensnion matches weaver output extension - when (pm--selector-match el (concat "dummy." (nth 2 w))) - return t)) - return t))) - (delete-dups (pm--oref-with-parents pm/polymode :exporters))))) - (sel (if exporters - (if (and no-ask-if-1 (= (length exporters) 1)) - (car exporters) - (pm--completing-read "Choose exporter: " exporters nil t nil 'pm--exporter-hist)) - (user-error "No valid exporters in current context"))) - (out (intern (cdr sel)))) - (setq pm--exporter-hist (delete-dups pm--exporter-hist)) - (setq-local pm--export:from-last nil) - (setq-local pm--export:to-last nil) - (oset pm/polymode :exporter out) - out)) - -(defmacro polymode-register-exporter (exporter default &rest configs) - "Add EXPORTER to :exporters slot of all config objects in CONFIGS. -When DEFAULT is non-nil, also make EXPORTER the default exporter -for each polymode in CONFIGS." - `(dolist (pm ',configs) - (object-add-to-list (symbol-value pm) :exporters ',exporter) - (when ,default (oset (symbol-value pm) :exporter ',exporter)))) - - -;;; GLOBAL EXPORTERS -(define-obsolete-variable-alias 'pm-exporter/pandoc 'poly-pandoc-exporter "v0.2") -(defcustom poly-pandoc-exporter - (pm-shell-exporter - :name "pandoc" - :from - '(;; ("json" "\\.json\\'" "JSON native AST" "pandoc %i -f json -t %t -o %o") - ("markdown" "\\.md\\'" "pandoc's markdown" "pandoc %i -f markdown -t %t -o %o") - ("markdown_strict" "\\.md\\'" "original markdown" "pandoc %i -f markdown_strict -t %t -o %o") - ("markdown_phpextra" "\\.md\\'" "PHP markdown" "pandoc %i -f markdown_phpextra -t %t -o %o") - ("markdown_phpextra" "\\.md\\'" "github markdown" "pandoc %i -f markdown_phpextra -t %t -o %o") - ("textile" "\\.textile\\'" "Textile" "pandoc %i -f textile -t %t -o %o") - ("rst" "\\.rst\\'" "reStructuredText" "pandoc %i -f rst -t %t -o %o") - ("html" "\\.x?html?\\'" "HTML" "pandoc %i -f html -t %t -o %o") - ("docbook" "\\.xml\\'" "DocBook" "pandoc %i -f docbook -t %t -o %o") - ("mediawiki" "\\.wiki\\'" "MediaWiki" "pandoc %i -f mediawiki -t %t -o %o") - ("latex" "\\.tex\\'" "LaTeX" "pandoc %i -f latex -t %t -o %o")) - :to - '(;; ("json" "json" "JSON version of native AST" "json") - ("plain" "txt" "plain text" "plain") - ("markdown" "md" "pandoc's extended markdown" "markdown") - ("markdown_strict" "md" "original markdown" "markdown_strict") - ("markdown_phpextra" "md" "PHP extended markdown" "markdown_phpextra") - ("markdown_github" "md" "github extended markdown" "markdown_github") - ("rst" "rst" "reStructuredText" "rst") - ("html" "html" "XHTML 1" "html") - ("html5" "html" "HTML 5" "html5") - ("latex" "tex" "LaTeX" "latex") - ("beamer" "tex" "LaTeX beamer" "beamer") - ("context" "tex" "ConTeXt" "context") - ("man" "man" "groff man" "man") - ("mediawiki" "wiki" "MediaWiki markup" "mediawiki") - ("textile" "textile" "Textile" "textile") - ("org" "org" "Emacs Org-Mode" "org") - ("texinfo" "info" "GNU Texinfo" "texinfo") - ("docbook" "xml" "DocBook XML" "docbook") - ("opendocument" "xml" "OpenDocument XML" "opendocument") - ("odt" "odt" "OpenOffice text document" "odt") - ("pdf" "pdf" "Portable Document Format" "latex") - ("docx" "docx" "Word docx" "docx") - ("epub" "epub" "EPUB book" "epub") - ("epub3" "epub" "EPUB v3" "epub3") - ("fb2" "fb" "FictionBook2 e-book" "fb2") - ("asciidoc" "txt" "AsciiDoc" "asciidoc") - ("slidy" "html" "Slidy HTML slide show" "slidy") - ("slideous" "html" "Slideous HTML slide show" "slideous") - ("dzslides" "html" "HTML5 slide show" "dzslides") - ("s5" "html" "S5 HTML slide show" "s5") - ("rtf" "rtf" "rich text format" "rtf")) - :function 'pm-default-shell-export-function - :sentinel 'pm-default-shell-export-sentinel) - "Pandoc exporter." - :group 'polymode-export - :type 'object) - -(provide 'polymode-export) -;;; polymode-export.el ends here diff --git a/elpa/polymode-20200411.915/polymode-export.elc b/elpa/polymode-20200411.915/polymode-export.elc deleted file mode 100644 index 85b5066212ccb9041d7bd4ebf556557a51fc746f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18628 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. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;;; Code: - -(require 'polymode-core) - - -;;; INITIALIZATION - -(cl-defgeneric pm-initialize (object) - "Initialize current buffer with OBJECT.") - -(cl-defmethod pm-initialize ((config pm-polymode)) - "Initialization of host buffers. -Ran by the polymode mode function." - ;; Not calling config's '-minor-mode in hosts because this pm-initialize is - ;; called from minor-mode itself. - (let* ((hostmode-name (eieio-oref config 'hostmode)) - (hostmode (if hostmode-name - (clone (symbol-value hostmode-name)) - (pm-host-chunkmode :name "ANY" :mode nil)))) - (let ((pm-initialization-in-progress t) - ;; Set if nil! This allows unspecified host chunkmodes to be used in - ;; minor modes. - (host-mode (or (eieio-oref hostmode 'mode) - (oset hostmode :mode major-mode)))) - ;; host-mode hooks are run here, but polymode is not initialized - (pm--mode-setup host-mode) - (oset hostmode -buffer (current-buffer)) - (oset config -hostmode hostmode) - (setq pm--core-buffer-name (buffer-name) - pm/polymode config - pm/chunkmode hostmode - pm/current t - pm/type nil) - (pm--common-setup) - ;; Initialize innermodes - (pm--initialize-innermodes config) - ;; FIXME: must go into polymode-compat.el - (add-hook 'flyspell-incorrect-hook - 'pm--flyspel-dont-highlight-in-chunkmodes nil t)) - (pm--run-init-hooks hostmode 'host 'polymode-init-host-hook))) - -(defun pm--initialize-innermodes (config) - (let ((inner-syms (delete-dups - (delq :inherit - (apply #'append - (pm--collect-parent-slots - config 'innermodes - (lambda (obj) - (memq :inherit - (eieio-oref obj 'innermodes))))))))) - (oset config -innermodes - (mapcar (lambda (sub-name) - (clone (symbol-value sub-name))) - inner-syms)))) - -(cl-defmethod pm-initialize ((chunkmode pm-inner-chunkmode) &optional type mode) - "Initialization of the innermodes' (indirect) buffers." - ;; run in chunkmode indirect buffer - (setq mode (or mode (pm--get-innermode-mode chunkmode type))) - (let* ((pm-initialization-in-progress t) - (post-fix (replace-regexp-in-string "poly-\\|-mode" "" (symbol-name mode))) - (core-name (format "%s[%s]" (buffer-name (pm-base-buffer)) - (or (cdr (assoc post-fix polymode-mode-abbrev-aliases)) - post-fix))) - (new-name (generate-new-buffer-name core-name))) - (rename-buffer new-name) - (pm--mode-setup mode) - (pm--move-vars '(pm/polymode buffer-file-coding-system) (pm-base-buffer)) - ;; fixme: This breaks if different chunkmodes use same-mode buffer. Even for - ;; head/tail the value of pm/type will be wrong for tail - (setq pm--core-buffer-name core-name - pm/chunkmode chunkmode - pm/type (pm-true-span-type chunkmode type)) - ;; Call polymode mode for the sake of the keymap. Same minor mode which runs - ;; in the host buffer but without all the heavy initialization. - (funcall (eieio-oref pm/polymode '-minor-mode)) - ;; FIXME: should not be here? - (vc-refresh-state) - (pm--common-setup) - (add-hook 'syntax-propertize-extend-region-functions - #'polymode-syntax-propertize-extend-region-in-host - -90 t) - (pm--move-vars polymode-move-these-vars-from-base-buffer (pm-base-buffer)) - ;; If this rename happens before the mode setup font-lock doesn't work in - ;; inner buffers. - (when pm-hide-implementation-buffers - (rename-buffer (generate-new-buffer-name (concat " " pm--core-buffer-name))))) - (pm--run-init-hooks chunkmode type 'polymode-init-inner-hook)) - -(defvar poly-lock-allow-fontification) -(defun pm--mode-setup (mode &optional buffer) - ;; General major-mode install. Should work for both indirect and base buffers. - ;; PM objects are not yet initialized (pm/polymode, pm/chunkmode, pm/type) - (with-current-buffer (or buffer (current-buffer)) - ;; don't re-install if already there; polymodes can be used as minor modes. - (unless (eq major-mode mode) - (let ((polymode-mode t) ;major-modes might check this - (base (buffer-base-buffer)) - ;; Some modes (or minor-modes which are run in their hooks) call - ;; font-lock functions directly on the entire buffer (#212 for an - ;; example). They were inhibited here before, but these variables - ;; are designed to be set by modes, so our setup doesn't have an - ;; effect in those cases and we get "Making xyz buffer-local while - ;; locally let-bound!" warning which seems to be harmless but - ;; annoying. The only solution seems to be to advice those - ;; functions, particularly `font-lock-fontify-region`. - ;; (font-lock-flush-function 'ignore) - ;; (font-lock-ensure-function 'ignore) - ;; (font-lock-fontify-buffer-function 'ignore) - ;; (font-lock-fontify-region-function 'ignore) - (font-lock-function 'ignore) - ;; Mode functions can do arbitrary things. We inhibt all PM hooks - ;; because PM objects have not been setup yet. - (pm-allow-after-change-hook nil) - (poly-lock-allow-fontification nil)) - ;; run-mode-hooks needs buffer-file-name, so we transfer base vars twice - (when base - (pm--move-vars polymode-move-these-vars-from-base-buffer base)) - (condition-case-unless-debug err - ;; !! run-mode-hooks and hack-local-variables run here - (funcall mode) - (error (message "Polymode error (pm--mode-setup '%s): %s" - mode (error-message-string err)))) - ;; In emacs 27 this is called from run-mode-hooks - (and (bound-and-true-p syntax-propertize-function) - (not (local-variable-p 'parse-sexp-lookup-properties)) - (setq-local parse-sexp-lookup-properties t)))) - (setq polymode-mode t) - (current-buffer))) - -(defvar syntax-ppss-wide) -(defun pm--common-setup (&optional buffer) - "Run common setup in BUFFER. -Runs after major mode and core polymode structures have been -initialized. Return the buffer." - (with-current-buffer (or buffer (current-buffer)) - (object-add-to-list pm/polymode '-buffers (current-buffer)) - - ;; INDENTATION - (setq-local pm--indent-line-function-original - (if (memq indent-line-function '(indent-relative indent-relative-maybe)) - #'pm--indent-line-basic - indent-line-function)) - (setq-local indent-line-function #'pm-indent-line-dispatcher) - (setq-local pm--indent-region-function-original - (if (memq indent-region-function '(nil indent-region-line-by-line)) - #'pm--indent-region-line-by-line - indent-region-function)) - (setq-local indent-region-function #'pm-indent-region) - - ;; FILL - (setq-local pm--fill-forward-paragraph-original fill-forward-paragraph-function) - (setq-local fill-forward-paragraph-function #'polymode-fill-forward-paragraph) - - ;; HOOKS - (add-hook 'kill-buffer-hook #'polymode-after-kill-fixes nil t) - (add-hook 'post-command-hook #'polymode-post-command-select-buffer nil t) - (add-hook 'pre-command-hook #'polymode-pre-command-synchronize-state nil t) - - ;; FONT LOCK (see poly-lock.el) - (setq-local font-lock-function 'poly-lock-mode) - ;; Font lock is a globalized minor mode and is thus initialized in - ;; `after-change-major-mode-hook' within `run-mode-hooks'. As a result - ;; poly-lock won't get installed if polymode is installed as a minor mode or - ;; interactively. We add font/poly-lock in all buffers (because this is how - ;; inner buffers are installed) but use `poly-lock-allow-fontification' to - ;; disallow fontification in buffers which don't want font-lock (aka those - ;; buffers where `turn-on-font-lock-if-desired' doesn't activate font-lock). - (turn-on-font-lock-if-desired) ; <- need this for the sake of poly-minor-modes - ;; FIXME: can poly-lock-mode be used here instead? - (setq-local poly-lock-allow-fontification font-lock-mode) - ;; Make sure to re-install with our font-lock-function as - ;; `turn-on-font-lock-if-desired' from above might actually not call it. - (font-lock-mode t) - (font-lock-flush) - - ;; SYNTAX (must be done after font-lock for after-change order) - - (with-no-warnings - ;; [OBSOLETE as of 25.1 but we still protect it] - (pm-around-advice syntax-begin-function 'pm-override-output-position)) - ;; (advice-remove 'c-beginning-of-syntax #'pm-override-output-position) - - ;; Ideally this should be called in some hook to avoid minor-modes messing - ;; it up. Setting even if syntax-propertize-function is nil to have more - ;; control over syntax-propertize--done. - (unless (eq syntax-propertize-function #'polymode-syntax-propertize) - (setq-local pm--syntax-propertize-function-original syntax-propertize-function) - (setq-local syntax-propertize-function #'polymode-syntax-propertize)) - (setq-local syntax-ppss-wide (cons nil nil)) - ;; Flush ppss in all buffers. Must be done in first after-change (see - ;; https://lists.gnu.org/archive/html/emacs-devel/2019-03/msg00500.html) - ;; TODO: Consider just advising syntax-ppss-flush-cache once the above is - ;; fixed in emacs. - (add-hook 'after-change-functions 'polymode-flush-syntax-ppss-cache nil t) - - (current-buffer))) - - -;;; BUFFER CREATION - -(cl-defgeneric pm-get-buffer-create (chunkmode &optional type) - "Get the indirect buffer associated with SUBMODE and SPAN-TYPE. -Create and initialize the buffer if does not exist yet.") - -(cl-defmethod pm-get-buffer-create ((chunkmode pm-host-chunkmode) &optional type) - (when type - (error "Cannot create host buffer of type '%s'" type)) - (let ((buff (eieio-oref chunkmode '-buffer))) - (if (buffer-live-p buff) - buff - (error "Cannot create host buffer for host chunkmode %s" (eieio-object-name chunkmode))))) - -(cl-defmethod pm-get-buffer-create ((chunkmode pm-inner-chunkmode) &optional type) - (let ((buff (cl-case type - (body (eieio-oref chunkmode '-buffer)) - (head (eieio-oref chunkmode '-head-buffer)) - (tail (eieio-oref chunkmode '-tail-buffer)) - (t (error "Don't know how to select buffer of type '%s' for chunkmode '%s'" - type (eieio-object-name chunkmode)))))) - (if (buffer-live-p buff) - buff - (let ((new-buff (pm--get-innermode-buffer-create chunkmode type))) - (pm--set-innermode-buffer chunkmode type new-buff))))) - -(defun pm--get-innermode-buffer-create (chunkmode type &optional force-new) - (let ((mode (pm--get-innermode-mode chunkmode type))) - (or - ;; 1. search through the existing buffer list - (unless force-new - (cl-loop for bf in (eieio-oref pm/polymode '-buffers) - when (let ((out (and (buffer-live-p bf) - (eq mode (buffer-local-value 'major-mode bf))))) - out) - return bf)) - ;; 2. create new - (with-current-buffer (pm-base-buffer) - (let* ((new-name (generate-new-buffer-name (buffer-name))) - (new-buffer (make-indirect-buffer (current-buffer) new-name))) - (with-current-buffer new-buffer - (pm-initialize chunkmode type mode)) - new-buffer))))) - -(defun pm-get-buffer-of-mode (mode) - (let ((mode (pm--true-mode-symbol mode))) - (or - ;; 1. search through the existing buffer list - (cl-loop for bf in (eieio-oref pm/polymode '-buffers) - when (and (buffer-live-p bf) - (eq mode (buffer-local-value 'major-mode bf))) - return bf) - ;; 2. create new if body mode matched - (cl-loop for imode in (eieio-oref pm/polymode '-innermodes) - when (eq mode (eieio-oref imode 'mode)) - return (pm--get-innermode-buffer-create imode 'body 'force))))) - -(defun pm--set-innermode-buffer (obj type buff) - "Assign BUFF to OBJ's slot(s) corresponding to TYPE." - (with-slots (-buffer head-mode -head-buffer tail-mode -tail-buffer) obj - (pcase (list type head-mode tail-mode) - (`(body body ,(or `nil `body)) - (setq -buffer buff - -head-buffer buff - -tail-buffer buff)) - (`(body ,_ body) - (setq -buffer buff - -tail-buffer buff)) - (`(body ,_ ,_ ) - (setq -buffer buff)) - (`(head ,_ ,(or `nil `head)) - (setq -head-buffer buff - -tail-buffer buff)) - (`(head ,_ ,_) - (setq -head-buffer buff)) - (`(tail ,_ ,(or `nil `head)) - (setq -tail-buffer buff - -head-buffer buff)) - (`(tail ,_ ,_) - (setq -tail-buffer buff)) - (_ (error "Type must be one of 'body, 'head or 'tail"))))) - - -;;; SPAN MANIPULATION - -(cl-defgeneric pm-get-span (chunkmode &optional pos) - "Ask the CHUNKMODE for the span at point. -Return a list of three elements (TYPE BEG END OBJECT) where TYPE -is a symbol representing the type of the span surrounding -POS (head, tail, body). BEG and END are the coordinates of the -span. OBJECT is a suitable object which is 'responsible' for this -span. This is an object that could be dispatched upon with -`pm-select-buffer'. Should return nil if there is no SUBMODE -specific span around POS. Not to be used in programs directly; -use `pm-innermost-span'.") - -(cl-defmethod pm-get-span (chunkmode &optional _pos) - "Return nil. -Host modes usually do not compute spans." - (unless chunkmode - (error "Dispatching `pm-get-span' on a nil object")) - nil) - -(cl-defmethod pm-get-span ((chunkmode pm-inner-chunkmode) &optional pos) - "Return a list of the form (TYPE POS-START POS-END SELF). -TYPE can be 'body, 'head or 'tail. SELF is the CHUNKMODE." - (with-slots (head-matcher tail-matcher head-mode tail-mode) chunkmode - (let ((span (pm--span-at-point head-matcher tail-matcher pos - (eieio-oref chunkmode 'can-overlap)))) - (when span - (append span (list chunkmode)))))) - -(cl-defmethod pm-get-span ((_chunkmode pm-inner-auto-chunkmode) &optional _pos) - (let ((span (cl-call-next-method))) - (if (null (car span)) - span - (setf (nth 3 span) (apply #'pm--get-auto-chunkmode span)) - span))) - -;; (defun pm-get-chunk (ichunkmode &optional pos) -;; (with-slots (head-matcher tail-matcher head-mode tail-mode) ichunkmode -;; (pm--span-at-point -;; head-matcher tail-matcher (or pos (point)) -;; (eieio-oref ichunkmode 'can-overlap) -;; t))) - - -(cl-defgeneric pm-next-chunk (chunkmode &optional pos) - "Ask the CHUNKMODE for the chunk after POS. -Return a list of three elements (CHUNKMODE HEAD-BEG HEAD-END -TAIL-BEG TAIL-END).") - -(cl-defmethod pm-next-chunk (chunkmode &optional _pos) - nil) - -(cl-defmethod pm-next-chunk ((chunkmode pm-inner-chunkmode) &optional pos) - (with-slots (head-matcher tail-matcher head-mode tail-mode) chunkmode - (let ((raw-chunk (pm--next-chunk - head-matcher tail-matcher (or pos (point)) - (eieio-oref chunkmode 'can-overlap)))) - (when raw-chunk - (cons chunkmode raw-chunk))))) - -(cl-defmethod pm-next-chunk ((chunkmode pm-inner-auto-chunkmode) &optional pos) - (with-slots (head-matcher tail-matcher head-mode tail-mode) chunkmode - (let ((raw-chunk (pm--next-chunk - head-matcher tail-matcher (or pos (point)) - (eieio-oref chunkmode 'can-overlap)))) - (when raw-chunk - (cons (pm--get-auto-chunkmode 'head (car raw-chunk) (cadr raw-chunk) chunkmode) - raw-chunk))))) - -;; FIXME: cache somehow? -(defun pm--get-auto-chunkmode (type beg end proto) - (save-excursion - (goto-char beg) - (unless (eq type 'head) - (goto-char end) ; fixme: add multiline matchers to micro-optimize this - (let ((matcher (pm-fun-matcher (eieio-oref proto 'head-matcher)))) - ;; can be multiple incomplete spans within a span - (while (< beg (goto-char (car (funcall matcher -1))))))) - (let* ((str (let ((matcher (eieio-oref proto 'mode-matcher))) - (when (stringp matcher) - (setq matcher (cons matcher 0))) - (cond ((consp matcher) - (re-search-forward (car matcher) (point-at-eol) t) - (match-string-no-properties (cdr matcher))) - ((functionp matcher) - (funcall matcher))))) - (mode (pm-get-mode-symbol-from-name str (eieio-oref proto 'fallback-mode)))) - (if (eq mode 'host) - (oref pm/polymode -hostmode) - ;; chunkname:MODE serves as ID (e.g. `markdown-fenced-code:emacs-lisp-mode`). - ;; Head/tail/body indirect buffers are shared across chunkmodes and span - ;; types. - (let ((automodes (eieio-oref pm/polymode '-auto-innermodes))) - (if (memq proto automodes) - ;; a. if proto already part of the list return - proto - (let ((name (concat (pm-object-name proto) ":" (symbol-name mode)))) - (or - ;; b. loop through installed inner modes - (cl-loop for obj in automodes - when (equal name (pm-object-name obj)) - return obj) - ;; c. create new - (let ((innermode (clone proto :name name :mode mode))) - (object-add-to-list pm/polymode '-auto-innermodes innermode) - innermode))))))))) - - -;;; INDENT - -;; indent-region-line-by-line for polymode buffers (more efficient, works on -;; emacs 25, but no progress reporter) -(defun pm--indent-region-line-by-line (start end) - (save-excursion - ;; called from pm--indent-raw; so we know we are in the same span with - ;; buffer set and narrowed to span if 'protect-indent is non-nil - (let ((span (pm-innermost-span start))) - (setq end (copy-marker end)) - (goto-char start) - (while (< (point) end) - (unless (and (bolp) (eolp)) - ;; fixme: html-erb jumps line here; need save-excursion. why? - (save-excursion (pm-indent-line (nth 3 span) span))) - (forward-line 1)) - (move-marker end nil)))) - -(defun pm--indent-line-basic () - "Used as `indent-line-function' for modes with tab indent." - ;; adapted from indent-according-to-mode - (let ((column (save-excursion - (beginning-of-line) - (if (bobp) 0 - (beginning-of-line 0) - (if (looking-at "[ \t]*$") 0 (current-indentation)))))) - (if (<= (current-column) (current-indentation)) - (indent-line-to column) - (save-excursion (indent-line-to column))))) - -(defun pm--indent-raw (span fn-sym &rest args) - ;; fixme: do save-excursion instead of this? - (let ((point (point))) - ;; do fast synchronization here - (save-current-buffer - (pm-set-buffer span) - (goto-char point) - (let ((fn (symbol-value fn-sym))) - (when fn - (if (eieio-oref (nth 3 span) 'protect-indent) - (pm-with-narrowed-to-span span - (apply fn args)) - (apply fn args)))) - (setq point (point))) - (goto-char point))) - -(defun pm--indent-line-raw (span) - (pm--indent-raw span 'pm--indent-line-function-original) - (pm--reindent-with+-indent span (point-at-bol) (point-at-eol))) - -(defun pm--indent-region-raw (span beg end) - (pm--indent-raw span 'pm--indent-region-function-original beg end) - (pm--reindent-with+-indent span beg end)) - -(defun pm-indent-region (beg end) - "Indent region between BEG and END in polymode buffers. -Function used for `indent-region-function'." - ;; (message "(pm-indent-region %d %d)" beg end) - ;; cannot use pm-map-over-spans here because of the buffer modifications - (let ((inhibit-point-motion-hooks t) - (end (copy-marker end))) - (save-excursion - (while (< beg end) - (goto-char beg) - (back-to-indentation) - (setq beg (point)) - (let ((span (pm-innermost-span beg 'no-cache))) - (let* ((end-span (copy-marker (nth 2 span))) - (end1 (min end end-span))) - (goto-char beg) - ;; (pm-switch-to-buffer) - ;; indent first line separately - (pm-indent-line (nth 3 span) span) - (beginning-of-line 2) - (when (< (point) end1) - ;; we know that span end was moved, hard reset without recomputation - (setf (nth 2 span) end-span) - (pm--indent-region-raw span (point) end1)) - (setq beg (max end1 (point))))))) - (move-marker end nil))) - -(defun pm-indent-line-dispatcher (&optional span) - "Dispatch `pm-indent-line' methods on current SPAN. -Value of `indent-line-function' in polymode buffers." - ;; NB: No buffer switching in indentation functions. See comment at - ;; pm-switch-to-buffer. - (let ((span (or span (pm-innermost-span - (save-excursion (back-to-indentation) (point))))) - (inhibit-read-only t)) - (pm-indent-line (nth 3 span) span))) - -(cl-defgeneric pm-indent-line (chunkmode &optional span) - "Indent current line. -Protect and call original indentation function associated with -the chunkmode.") - -(cl-defmethod pm-indent-line ((_chunkmode pm-chunkmode) span) - (let ((pos (point)) - (delta)) - (back-to-indentation) - (setq delta (- pos (point))) - (let* ((bol (point-at-bol)) - (span (or span (pm-innermost-span))) - (prev-span-pos) - (first-line (save-excursion - (goto-char (nth 1 span)) - (unless (bobp) - (setq prev-span-pos (1- (point)))) - (forward-line) - (<= bol (point))))) - (pm--indent-line-raw span) - (when (and first-line prev-span-pos) - (pm--reindent-with-extra-offset (pm-innermost-span prev-span-pos) - 'post-indent-offset))) - (when (and delta (> delta 0)) - (goto-char (+ (point) delta))))) - -(cl-defmethod pm-indent-line ((_chunkmode pm-inner-chunkmode) span) - "Indent line in inner chunkmodes. -When point is at the beginning of head or tail, use parent chunk -to indent." - (let ((pos (point)) - (delta)) - (back-to-indentation) - (setq delta (- pos (point))) - (unwind-protect - (cond - - ;; 1. HEAD or TAIL (we assume head or tail fits in one line for now) - ((or (eq 'head (car span)) - (eq 'tail (car span))) - (goto-char (nth 1 span)) - (when (not (bobp)) - ;; ind-point need not be in prev-span; there might be other spans in between - (let ((prev-span (pm-innermost-span (1- (point))))) - (if (eq 'tail (car span)) - (indent-line-to (pm--head-indent prev-span)) - ;; head indent and adjustments - ;; (pm-indent-line (nth 3 prev-span) prev-span) - (pm--indent-line-raw prev-span) - (let ((prev-tail-pos (save-excursion - (beginning-of-line) - (skip-chars-backward " \t\n") - (if (bobp) (point) (1- (point)))))) - (setq prev-span (pm-innermost-span prev-tail-pos))) - (pm--reindent-with-extra-offset prev-span 'post-indent-offset) - (pm--reindent-with-extra-offset span 'pre-indent-offset))))) - - ;; 2. BODY - (t - (if (< (point) (nth 1 span)) - ;; first body line in the same line with header (re-indent at indentation) - (pm-indent-line-dispatcher) - (let ((fl-indent (pm--first-line-indent span))) - (if fl-indent - ;; We are not on the 1st line - (progn - ;; thus indent according to mode - (pm--indent-line-raw span) - (when (bolp) - ;; When original mode's indented to bol, match with the - ;; first line indent. Otherwise it's a continuation - ;; indentation and we assume the original function did it - ;; correctly with respect to previous lines. - (indent-to fl-indent))) - ;; On the first line. Indent with respect to header line. - (let ((delta (save-excursion - (goto-char (nth 1 span)) - (+ - (pm--oref-value (nth 3 span) 'body-indent-offset) - (cond - ;; empty line - ((looking-at-p "[ \t]*$") 0) - ;; inner span starts at bol; honor +-indent cookie - ((= (point) (point-at-bol)) - (pm--+-indent-offset-on-this-line span)) - ;; code after header - (t - (end-of-line) - (skip-chars-forward "\t\n") - (pm--indent-line-raw span) - (- (point) (point-at-bol)))))))) - (indent-line-to - ;; indent with respect to header line - (+ delta (pm--head-indent span))))))))) - - ;; keep point on same characters - (when (and delta (> delta 0)) - (goto-char (+ (point) delta)))))) - -(defun pm--first-line-indent (&optional span) - (save-excursion - (let ((pos (point))) - (goto-char (nth 1 (or span (pm-innermost-span)))) - ;; when body starts at bol move to previous line - (when (and (= (point) (point-at-bol)) - (not (bobp))) - (backward-char 1)) - (skip-chars-forward " \t\n") - (when (< (point-at-eol) pos) - (- (point) (point-at-bol)))))) - -;; SPAN is a body span; do nothing if narrowed to body -(defun pm--head-indent (&optional span) - (save-restriction - (widen) - (save-excursion - (let ((sbeg (nth 1 (or span (pm-innermost-span))))) - (goto-char sbeg) - (backward-char 1) - (let ((head-span (pm-innermost-span))) - (if (eq (car head-span) 'head) - (goto-char (nth 1 head-span)) - ;; body span is not preceded by a head span. We don't have such - ;; practical cases yet, but headless spans are real - indented blocks - ;; for instance. - (goto-char sbeg))) - (back-to-indentation) - (- (point) (point-at-bol)))))) - -(defun pm--+-indent-offset-on-this-line (span) - (if (re-search-forward "\\([+-]\\)indent" (point-at-eol) t) - (let ((basic-offset (pm--oref-value (nth 3 span) 'indent-offset))) - (if (string= (match-string 1) "-") - (- basic-offset) - basic-offset)) - 0)) - -(defun pm--reindent-with+-indent (span beg end) - (save-excursion - (goto-char beg) - (let ((basic-offset (pm--oref-value (nth 3 span) 'indent-offset))) - (while (and (< (point) end) - (re-search-forward "\\([+-]\\)indent" end t)) - (let ((offset (if (string= (match-string 1) "-") - (- basic-offset) - basic-offset))) - (indent-line-to (max 0 (+ (current-indentation) offset))) - (forward-line)))))) - -(defun pm--reindent-with-extra-offset (span offset-type &optional offset2) - (let ((offset (eieio-oref (nth 3 span) offset-type))) - (unless (and (numberp offset) (= offset 0)) - (let ((pos (nth (if (eq offset-type 'post-indent-offset) 2 1) span))) - (save-excursion - (goto-char pos) - (setq offset (pm--object-value offset))) - (indent-line-to (max 0 (+ (current-indentation) offset (or offset2 0)))))))) - - -;;; FACES -(cl-defgeneric pm-get-adjust-face (chunkmode type)) - -(cl-defmethod pm-get-adjust-face ((chunkmode pm-chunkmode) _type) - (eieio-oref chunkmode 'adjust-face)) - -(cl-defmethod pm-get-adjust-face ((chunkmode pm-inner-chunkmode) type) - (cond ((eq type 'head) - (eieio-oref chunkmode 'head-adjust-face)) - ((eq type 'tail) - (or (eieio-oref chunkmode 'tail-adjust-face) - (eieio-oref chunkmode 'head-adjust-face))) - (t (eieio-oref chunkmode 'adjust-face)))) - -(provide 'polymode-methods) - -;;; polymode-methods.el ends here diff --git a/elpa/polymode-20200411.915/polymode-methods.elc b/elpa/polymode-20200411.915/polymode-methods.elc deleted file mode 100644 index 31032ad42dc809372a5b317b24f0a86e771cec82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18440 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. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;;; Code: - -(defgroup polymode-tangle nil - "Polymode Tanglers." - :group 'polymode) - -(provide 'polymode-tangle) -;;; polymode-tangle.el ends here diff --git a/elpa/polymode-20200411.915/polymode-tangle.elc b/elpa/polymode-20200411.915/polymode-tangle.elc deleted file mode 100644 index fa0307108d7ae0470d1c7d5662a04814abdfac03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmbtRv1-FG6wK@&=z292T8K?-w`o&PC1eP6C^TEs;YCtnfh-wGPD#JMFK#G=j(Ko{ z?vA@Bsb0L!uSTO$Qr9)+uI;o@ayV#v8f>AOm#y#WVW?dFXVah13*X86f#fRuabZsV;FyvLX^RDmEIdf<^ iD~n`z{3}))q;Dq@tAX?(Pw{;2N9WyMOZAEAUGf9wOQQw= diff --git a/elpa/polymode-20200411.915/polymode-test-utils.el b/elpa/polymode-20200411.915/polymode-test-utils.el deleted file mode 100644 index 8a748505..00000000 --- a/elpa/polymode-20200411.915/polymode-test-utils.el +++ /dev/null @@ -1,464 +0,0 @@ -;;; polymode-test-utils.el --- Testing utilities for polymode -*- lexical-binding: t -*- -;; -;; Copyright (C) 2018-2019, Vitalie Spinu -;; Author: Vitalie Spinu -;; URL: https://github.com/polymode/polymode -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; This file is *NOT* part of GNU Emacs. -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 3, or -;; (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; -;;; Commentary: -;; -;; This file should be loaded only in tests. -;; -;;; Code: - -(require 'ert) -(require 'polymode) -(eval-when-compile - (require 'cl-lib)) - -;; (require 'font-lock) -;; (global-font-lock-mode t) -;; (add-hook 'after-change-major-mode-hook #'global-font-lock-mode-enable-in-buffers) -;; (message "ACMH: %s GFL:%s" after-change-major-mode-hook global-font-lock-mode) - -(setq ert-batch-backtrace-right-margin 200) -(defvar pm-verbose (getenv "PM_VERBOSE")) - -(defvar pm-test-current-change-set nil) -(defun pm-test-get-file (name) - "Find the file with NAME from inside a poly-xyz repo. -Look into tests/input directory then in samples directory." - (let ((files (list (expand-file-name (format "./tests/input/%s" name) default-directory) - (expand-file-name (format "./input/%s" name) default-directory) - (expand-file-name (format "./samples/%s" name) default-directory) - (expand-file-name (format "../samples/%s" name) default-directory)))) - (or (cl-loop for f in files - if (file-exists-p f) return f) - (error "No file with name '%s' found in '%s'" name default-directory)))) - -(defun pm-test-matcher (string span-alist matcher &optional dry-run) - (with-temp-buffer - (insert string) - (goto-char (point-min)) - (let (prev-span) - (when dry-run - (message "(")) - (while (not (eobp)) - (if dry-run - (let ((span (funcall matcher))) - (unless (equal prev-span span) - (setq prev-span span) - (message " (%d . %S)" (nth 1 span) span))) - (let* ((span (funcall matcher)) - (sbeg (nth 1 span)) - (ref-span (alist-get sbeg span-alist))) - (unless (equal span ref-span) - (ert-fail (list :pos (point) :span span :ref-span ref-span))) - (when (and prev-span - (not (or (eq (nth 1 prev-span) sbeg) - (eq (nth 2 prev-span) sbeg)))) - (ert-fail (list :pos (point) :span span :prev-span prev-span))) - (setq prev-span span))) - (forward-char 1)) - (when dry-run - (message ")")) - nil))) - -(defmacro pm-test-run-on-string (mode string &rest body) - "Run BODY in a temporary buffer containing STRING in MODE. -MODE is a quoted symbol." - (declare (indent 1) (debug (form form body))) - `(let ((*buf* "*pm-test-string-buffer*")) - (when (get-buffer *buf*) - (kill-buffer *buf*)) - (with-current-buffer (get-buffer-create *buf*) - (insert (substring-no-properties ,string)) - (funcall ,mode) - (setq-default indent-tabs-mode nil) - ;; In emacs 27 this is called from run-mode-hooks - (and (bound-and-true-p syntax-propertize-function) - (not (local-variable-p 'parse-sexp-lookup-properties)) - (setq-local parse-sexp-lookup-properties t)) - (goto-char (point-min)) - (let ((poly-lock-allow-background-adjustment nil)) - (when polymode-mode - ;; font-lock not activated in batch mode - (setq-local poly-lock-allow-fontification t) - (poly-lock-mode t)) - (font-lock-ensure) - ,@body) - (current-buffer)))) - -(defun pm-test-spans (mode string) - (declare (indent 1)) - (pm-test-run-on-string mode - string - (pm-map-over-spans - (lambda (span) - (let ((range0 (pm-span-to-range span))) - (goto-char (car range0)) - (while (< (point) (cdr range0)) - (let ((range-pos (pm-innermost-range (point) 'no-cache))) - (unless (equal range0 range-pos) - (switch-to-buffer (current-buffer)) - (ert-fail (list :pos (point) - :range0 range0 - :range-pos range-pos)))) - (forward-char))))))) - -(defun pm-test-spans-on-file (mode file-name) - (let ((file (pm-test-get-file file-name))) - (pm-test-spans mode - (with-current-buffer (find-file-noselect file) - (substring-no-properties (buffer-string)))))) - -(defmacro pm-test-run-on-file (mode file-name &rest body) - "Run BODY in a buffer with the content of FILE-NAME in MODE." - (declare (indent 2) (debug (sexp sexp body))) - (let ((pre-form (when (eq (car body) :pre-form) - (prog1 (cadr body) - (setq body (cddr body)))))) - `(let ((poly-lock-allow-background-adjustment nil) - ;; snapshot it during the expansion to be able to run polymode-organization tests - (file ,(pm-test-get-file file-name)) - (pm-extra-span-info nil) - (buf "*pm-test-file-buffer*")) - (when (get-buffer buf) - (kill-buffer buf)) - (with-current-buffer (get-buffer-create buf) - (when pm-verbose - (message "\n=================== testing %s =======================" file)) - (switch-to-buffer buf) - (insert-file-contents file) - (remove-hook 'text-mode-hook 'flyspell-mode) ;; triggers "too much reentrancy" error - (let ((inhibit-message (not pm-verbose))) - (funcall-interactively ',mode)) - ;; (flyspell-mode -1) ;; triggers "too much reentrancy" error - (hack-local-variables 'ignore-mode) - (goto-char (point-min)) - ,pre-form - ;; need this to activate all chunks - (font-lock-ensure) - (goto-char (point-min)) - (save-excursion - (let ((font-lock-mode t)) - (pm-map-over-spans - (lambda (_) - (setq font-lock-mode t) - ;; This is not picked up because font-lock is nil on innermode - ;; initialization. Don't know how to fix this more elegantly. - ;; For now our tests are all with font-lock, so we are fine for - ;; now. - ;; !! Font-lock is not activated in batch mode !! - (setq-local poly-lock-allow-fontification t) - (poly-lock-mode t) - ;; redisplay is not triggered in batch and often it doesn't trigger - ;; fontification in X either (waf?) - (add-hook 'after-change-functions #'pm-test-invoke-fontification t t)) - (point-min) (point-max)))) - (font-lock-ensure) - ,@body - (current-buffer))))) - -(defun pm-test-span-faces (span &optional allow-failed-faces) - ;; head/tail is usually highlighted incorrectly by host modes when only head - ;; is in the buffer, so we just skip those head-tails which have - ;; :head/tail-mode 'host - (when (eq (car span) (pm-true-span-type *span*)) - (let* ((poly-lock-allow-background-adjustment nil) - (sbeg (nth 1 span)) - (send (nth 2 span)) - (smode major-mode) - (stext (buffer-substring-no-properties sbeg send)) - ;; other buffer - (ref-buf (pm-test-run-on-string smode stext)) - (ref-pos 1)) - (when pm-verbose - (message "---- testing %s ----" (pm-format-span span t))) - ;; NB: String delimiters '' in pascal mode don't work in batch - ;; (require 'polymode-debug) - ;; (when (and (eq smode 'pascal-mode) - ;; (> (buffer-size ref-buf) 29) - ;; (> (buffer-size) 700)) - ;; (message "%s" - ;; (list - ;; :parse-sexp-lookup-properties parse-sexp-lookup-properties - ;; :font-lock-keywords-only font-lock-keywords-only - ;; :font-lock-syntactic-face-function font-lock-syntactic-face-function - ;; :font-lock-sk font-lock-syntactic-keywords - ;; :syntax-prop-fun syntax-propertize-function - ;; :ppss (syntax-ppss 675) - ;; :char (pm--syntax-after 675))) - ;; (with-current-buffer ref-buf - ;; (message "%s" - ;; (list - ;; :parse-sexp-lookup-properties parse-sexp-lookup-properties - ;; :font-lock-keywords-only font-lock-keywords-only - ;; :font-lock-syntactic-face-function font-lock-syntactic-face-function - ;; :font-lock-sk font-lock-syntactic-keywords - ;; :syntax-prop-fun syntax-propertize-function - ;; :ppss-29 (syntax-ppss 29) - ;; :char-29 (pm--syntax-after 29))))) - (while ref-pos - (let* ((pos (1- (+ ref-pos sbeg))) - (face (get-text-property pos 'face)) - (ref-face (get-text-property ref-pos 'face ref-buf))) - (unless (or - ;; in markdown fence regexp matches end of line; it's likely - ;; to be a common mismatch between host mode and polymode, - ;; thus don't check first pos if it's a new line - (and (= ref-pos 1) - (with-current-buffer ref-buf - (eq (char-after 1) ?\n))) - (member face allow-failed-faces) - (equal face ref-face)) - (let ((data - (append - (when pm-test-current-change-set - (list :change pm-test-current-change-set)) - (list - ;; :af poly-lock-allow-fontification - ;; :fl font-lock-mode - :face face - :ref-face ref-face - :pos pos - :ref-pos ref-pos - :line (progn (goto-char pos) - (buffer-substring-no-properties (point-at-bol) (point-at-eol))) - :ref-line (with-current-buffer ref-buf - (goto-char ref-pos) - (buffer-substring-no-properties (point-at-bol) (point-at-eol))) - :mode smode)))) - ;; for the interactive convenience - (switch-to-buffer (current-buffer)) - (ert-fail data))) - (setq ref-pos (next-single-property-change ref-pos 'face ref-buf))))))) - -(defun pm-test-faces (&optional allow-failed-faces) - "Execute `pm-test-span-faces' for every span in the buffer. -ALLOW-FAILED-FACES should be a list of faces on which failures -are OK." - (save-excursion - (pm-map-over-spans - (lambda (span) (pm-test-span-faces span allow-failed-faces))))) - -(defun pm-test-goto-loc (loc) - "Go to LOC and switch to polymode indirect buffer. -LOC can be either - - a number giving position in the buffer - - regexp to search for from ‘point-min’ - - a cons of the form (ROW . COL) -In the last case ROW can be either a number or a regexp to search -for and COL either a column number or symbols beg or end -indicating beginning or end of the line. When COL is nil, goto -indentation." - (cond - ((numberp loc) - (goto-char loc)) - ((stringp loc) - (goto-char (point-min)) - (re-search-forward loc)) - ((consp loc) - (goto-char (point-min)) - (let ((row (car loc))) - (goto-char (point-min)) - (cond - ((stringp row) - (re-search-forward row)) - ((numberp row) - (forward-line (1- row))) - (t (error "Invalid row spec %s" row)))) - (let* ((col (cdr loc)) - (col (if (listp col) - (car col) - col))) - (cond - ((numberp col) - (forward-char col)) - ((eq col 'end) - (end-of-line)) - ((eq col 'beg) - (beginning-of-line)) - ((null col) - (back-to-indentation)) - (t (error "Invalid col spec %s" col)))))) - (when polymode-mode - ;; pm-set-buffer would do for programs but not for interactive debugging - (pm-switch-to-buffer (point)))) - -(defun pm-test-goto-loc-other-window () - "Utility to navigate to loc at point in other buffer. -LOC is as in `pm-test-goto-loc'." - (interactive) - (let ((loc (or (sexp-at-point) - (read--expression "Loc: ")))) - (when (symbolp loc) - (setq loc (string-to-number (thing-at-point 'word)))) - (other-window 1) - (pm-test-goto-loc loc))) - -(defun pm-test-invoke-fontification (&rest _ignore) - "Mimic calls to fontification functions by redisplay. -Needed because redisplay is not triggered in batch mode." - (when fontification-functions - (save-match-data - (save-restriction - (widen) - (save-excursion - (let (pos) - (while (setq pos (text-property-any (point-min) (point-max) 'fontified nil)) - (let ((inhibit-modification-hooks t) - (poly-lock-defer-after-change nil) - (inhibit-redisplay t)) - (when pm-verbose - (message "after change fontification-functions (%s)" pos)) - (run-hook-with-args 'fontification-functions pos))))))))) - -(defmacro pm-test-poly-lock (mode file &rest change-sets) - "Test font-lock for MODE and FILE. -CHANGE-SETS is a collection of forms of the form (NAME-LOC &rest -BODY). NAME-LOC is a list of the form (NAME LOCK) where NAME is a -symbol, LOC is the location as in `pm-test-goto-loc'. Before and -after execution of the BODY ‘undo-boundary’ is set and after the -execution undo is called once. After each change-set -`pm-test-faces' on the whole file is run." - (declare (indent 2) - (debug (sexp sexp &rest ((name sexp) &rest form)))) - `(kill-buffer - (pm-test-run-on-file ,mode ,file - (pm-test-faces) - (dolist (cset ',change-sets) - (let ((poly-lock-defer-after-change nil) - (pm-test-current-change-set (caar cset))) - (setq pm-extra-span-info (caar cset)) - (undo-boundary) - (pm-test-goto-loc (nth 1 (car cset))) - (eval (cons 'progn (cdr cset))) - (undo-boundary) - (pm-test-faces) - (let ((inhibit-message (not pm-verbose))) - (undo))))))) - -(defun pm-test--run-indentation-tests () - "Run an automatic batch of indentation tests. -First run `indent-line' on every line and compare original and -indented version. Then compute stasrt,middle and end points of -each span and call `indent-region' on a shuffled set of these -points." - (goto-char (point-min)) - (set-buffer-modified-p nil) - (while (not (eobp)) - (let ((orig-line (buffer-substring-no-properties (point-at-eol) (point-at-bol)))) - (unless (string-match-p "no-indent-test" orig-line) - (undo-boundary) - ;; (pm-switch-to-buffer) - ;; (message "line:%d pos:%s buf:%s ppss:%s spd:%s" - ;; (line-number-at-pos) (point) (current-buffer) - ;; (syntax-ppss) syntax-propertize--done) - (pm-indent-line-dispatcher) - (unless (equal orig-line (buffer-substring-no-properties (point-at-eol) (point-at-bol))) - (undo-boundary) - (pm-switch-to-buffer (point)) - (ert-fail (list :pos (point) :line (line-number-at-pos) - :mode major-mode - :indent-line (buffer-substring-no-properties (point-at-bol) (point-at-eol))))))) - (forward-line 1)) - (let (points1 points2) - (pm-map-over-spans (lambda (span) (push (/ (+ (nth 1 span) (nth 2 span)) 2) points1))) - (random "some-seed") - (let ((len (length points1))) - (dotimes (_ len) - (push (elt points1 (random len)) points2))) - (let ((points2 (reverse points1))) - (cl-mapc - (lambda (beg end) - (unless (= beg end) - (let ((orig-region (buffer-substring-no-properties beg end))) - (unless (string-match-p "no-indent-test" orig-region) - (undo-boundary) - (indent-region beg end) - (unless (equal orig-region (buffer-substring-no-properties beg end)) - (undo-boundary) - (pm-switch-to-buffer beg) - (ert-fail `(indent-region ,beg ,end))))))) - points1 points2)))) - -(defmacro pm-test-indentation (mode file) - "Test indentation for MODE and FILE." - `(pm-test-run-on-file ,mode ,file - (undo-boundary) - (let ((inhibit-message (not pm-verbose))) - (unwind-protect - (pm-test--run-indentation-tests) - (undo-boundary))))) - -(defmacro pm-test-file-indent (mode file-with-indent &optional file-no-indent) - `(pm-test-run-on-file ,mode ,(or file-no-indent file-with-indent) - (let ((indent-tabs-mode nil) - (right (with-current-buffer (find-file-noselect - ,(pm-test-get-file file-with-indent)) - (substring-no-properties (buffer-string)))) - (inhibit-message t)) - (unless ,file-no-indent - (goto-char 1) - (while (re-search-forward "^[ \t]+" nil t) - (replace-match "")) - (goto-char 1)) - (indent-region (point-min) (point-max)) - (let ((new (substring-no-properties (buffer-string)))) - (unless (string= right new) - (require 'pascal) - (let ((pos (1+ (pascal-string-diff right new)))) - (ert-fail (list "Wrong indent" :pos pos - :ref (with-temp-buffer - (insert right) - (goto-char pos) - (buffer-substring-no-properties (point-at-bol) (point-at-eol))) - :new (progn - (goto-char pos) - (buffer-substring-no-properties (point-at-bol) (point-at-eol))))))))))) - -(defmacro pm-test-map-over-modes (mode file) - `(pm-test-run-on-file ,mode ,file - (let ((beg (point-min)) - (end (point-max))) - (with-buffer-prepared-for-poly-lock - (remove-text-properties beg end '(:pm-span :pm-face))) - (pm-map-over-modes (lambda (b e)) beg end) - (while (< beg end) - (let ((span (get-text-property beg :pm-span)) - (mid (next-single-property-change beg :pm-span nil end))) - (dolist (pos (list beg - (/ (+ beg mid) 2) - (1- mid))) - (let ((ispan (pm-innermost-span pos t))) - (unless (equal span ispan) - (let ((span (copy-sequence span)) - (ispan (copy-sequence ispan))) - (setf (nth 3 span) (eieio-object-name (nth 3 span))) - (setf (nth 3 ispan) (eieio-object-name (nth 3 ispan))) - (pm-switch-to-buffer pos) - (ert-fail (list :pos pos :mode-span span :innermost-span ispan)))))) - (setq beg (nth 2 span))))))) - -(provide 'polymode-test-utils) -;;; polymode-test-utils.el ends here diff --git a/elpa/polymode-20200411.915/polymode-test-utils.elc b/elpa/polymode-20200411.915/polymode-test-utils.elc deleted file mode 100644 index 15aa0f6adcef010f8bb39bf27318f7efb851cd9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13765 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. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;;; Code: - -(require 'polymode-core) -(require 'polymode-classes) - -(defgroup polymode-weave nil - "Polymode Weavers" - :group 'polymode) - -(define-obsolete-variable-alias 'polymode-weave-output-file-format 'polymode-weaver-output-file-format "2018-08") -(defcustom polymode-weaver-output-file-format "%s-woven" - "Format of the weaved files. -%s is substituted with the current file name sans extension." - :group 'polymode-weave - :type 'string) - -(defclass pm-weaver (pm-root) - ((from-to - :initarg :from-to - :initform '() - :type list - :custom list - :documentation - " - Input-output specifications. An alist with elements of the - form (id reg-from ext-to doc command) or (id . selector). - - In both cases ID is the unique identifier of the spec. In - the former case REG-FROM is a regexp used to identify if - current file can be weaved with the spec. EXT-TO is the - extension of the output file. DOC is a short help string - used for interactive completion and messages. COMMAND is a - weaver specific specific command. It can contain the - following format specs: - - %i - input file (no dir) - %I - input file (full path) - %o - output file (no dir) - %O - output file (full path) - %b - output file (base name only) - %t - 4th element of the :to spec - - When specification is of the form (id . selector), SELECTOR - is a function of variable arguments with first two arguments - being ACTION and ID of the specification. This function is - called in a buffer visiting input file. ACTION is a symbol - and can one of the following: - - match - must return non-nil if this specification - applies to the file that current buffer is visiting, - or :nomatch if specification does not apply. - - regexp - return a string which is used to match input - file name. If nil, `match' selector must return - non-nil value. This selector is ignored if `match' - returned non-nil. - - output-file - return an output file name or a list of - file names. Receives input-file as argument. If this - command returns nil, the output is built from the - input file name and value of 'output-ext command. - - This selector can also return a function. This - function will be called in the callback or sentinel of - the weaving process after the weaving was - completed. This function should sniff the output of - the process for errors or file names. It must return a - file name, a list of file names or nil if no such - files have been detected. - - ext - extension of output file. If nil and - `output' also returned nil, the exporter won't be able - to identify the output file and no automatic display - or preview will be available. - - doc - return documentation string - - command - return a string to be used instead of - the :from command. If nil, :from spec command is used.") - (function - :initarg :function - :initform (lambda (command id) - (error "No weaving function declared for this weaver")) - :type (or symbol function) - :documentation - "Function to perform the weaving. Must take 2 arguments - COMMAND and ID. COMMAND is the 5th argument of :from-to spec - with all the formats substituted. ID is the id the - corresponding element in :from-to spec. - - If this function returns a filename that file will be - displayed to the user.")) - "Root weaver class.") - -(defclass pm-callback-weaver (pm-weaver) - ((callback - :initarg :callback - :initform nil - :type (or symbol function) - :documentation - "Callback function to be called by :function. There is no - default callback. Callbacks must return the output file.")) - "Class to represent weavers that call processes spanned by - Emacs.") - -(defclass pm-shell-weaver (pm-weaver) - ((function - :initform 'pm-default-shell-weave-function) - (sentinel - :initarg :sentinel - :initform 'pm-default-shell-weave-sentinel - :type (or symbol function) - :documentation - "Sentinel function to be called by :function when a shell - call is involved. Sentinel must return the output file - name.") - (quote - :initarg :quote - :initform nil - :type boolean - :documentation "Non-nil when file arguments must be quoted - with `shell-quote-argument'.")) - "Class for weavers that call external processes.") - -(defun pm-default-shell-weave-function (command sentinel from-to-id &rest _args) - "Run weaving COMMAND interactively with SENTINEL. -Run command in a buffer (in comint-shell-mode) so that it accepts -user interaction. This is a default function in all weavers that -call a shell command. FROM-TO-ID is the idea of the weaver. ARGS -are ignored." - (pm--run-shell-command command sentinel "*polymode weave*" - (concat "weaving " from-to-id " with command:\n\n " - command "\n\n"))) - - -;;; METHODS - -(declare-function pm-export "polymode-export") - -(cl-defgeneric pm-weave (weaver from-to-id &optional ifile) - "Weave current FILE with WEAVER. -WEAVER is an object of class `pm-weaver'. EXPORT is a list of the -form (FROM TO) suitable to be passed to `polymode-export'. If -EXPORT is provided, corresponding exporter's (from to) -specification will be called.") - -(cl-defmethod pm-weave ((weaver pm-weaver) from-to-id &optional ifile) - (pm--process-internal weaver from-to-id nil ifile)) - -(cl-defmethod pm-weave ((weaver pm-callback-weaver) fromto-id &optional ifile) - (let ((cb (pm--wrap-callback weaver :callback ifile)) - ;; with transitory output, callback might not run - (pm--export-spec (and pm--output-not-real pm--export-spec))) - (pm--process-internal weaver fromto-id nil ifile cb))) - -(cl-defmethod pm-weave ((weaver pm-shell-weaver) fromto-id &optional ifile) - (let ((cb (pm--wrap-callback weaver :sentinel ifile)) - ;; with transitory output, callback might not run - (pm--export-spec (and pm--output-not-real pm--export-spec))) - (pm--process-internal weaver fromto-id nil ifile cb (eieio-oref weaver 'quote)))) - - -;; UI - -(defvar-local pm--weaver-hist nil) -(defvar-local pm--weave:fromto-hist nil) -(defvar-local pm--weave:fromto-last nil) - -(defun polymode-weave (&optional from-to) - "Weave current file. -First time this command is called in a buffer the user is asked -for the weaver to use from a list of known weavers. - -FROM-TO is the id of the specification declared in :from-to slot -of the current weaver. If the weaver hasn't been set yet, set the -weaver with `polymode-set-weaver'. You can always change the -weaver manually by invoking `polymode-set-weaver'. - -If `from-to' dismissing detect automatically based on current -weaver :from-to specifications. If this detection is ambiguous -ask the user. - -When `from-to' is universal argument ask user for specification -for the specification. See also `pm-weaveer' for the complete -specification." - (interactive "P") - (cl-flet ((name.id (el) (cons (funcall (cdr el) 'doc (car el)) (car el)))) - (let* ((weaver (symbol-value (or (eieio-oref pm/polymode 'weaver) - (polymode-set-weaver)))) - (case-fold-search t) - - (opts (mapcar #'name.id (pm--selectors weaver :from-to))) - (ft-id - (cond - ;; A. guess from-to spec - ((null from-to) - (or - ;; 1. repeated weaving; don't ask - pm--weave:fromto-last - - ;; 2. select :from entries which match to current file - (let ((matched (pm--matched-selectors weaver :from-to))) - (when matched - (if (> (length matched) 1) - (cdr (pm--completing-read "Multiple `from-to' specs matched. Choose one: " - (mapcar #'name.id matched))) - (caar matched)))) - - ;; 3. nothing matched, ask - (let* ((prompt "No `from-to' specs matched. Choose one: ") - (sel (pm--completing-read prompt opts nil t nil 'pm--weave:fromto-hist))) - (cdr sel)))) - - ;; B. C-u, force a :from-to spec - ((equal from-to '(4)) - (cdr (if (> (length opts) 1) - (pm--completing-read "Weaver type: " opts nil t nil 'pm--weave:fromto-hist) - (car opts)))) - ;; C. string - ((stringp from-to) - (if (assoc from-to (eieio-oref weaver 'from-to)) - from-to - (error "Cannot find `from-to' spec '%s' in %s weaver" - from-to (eieio-object-name weaver)))) - (t (error "'from-to' argument must be nil, universal argument or a string"))))) - - (setq-local pm--weave:fromto-last ft-id) - (pm-weave weaver ft-id)))) - -(defmacro polymode-register-weaver (weaver default &rest configs) - "Add WEAVER to :weavers slot of all config objects in CONFIGS. -When DEFAULT is non-nil, also make weaver the default WEAVER for -each polymode in CONFIGS." - `(dolist (pm ',configs) - (object-add-to-list (symbol-value pm) :weavers ',weaver) - (when ,default (oset (symbol-value pm) :weaver ',weaver)))) - -(defun polymode-set-weaver () - "Set the current weaver for this polymode." - (interactive) - (unless pm/polymode - (error "No pm/polymode object found. Not in polymode buffer?")) - (let* ((weavers (pm--abrev-names - "pm-weaver/\\|-weaver$" - (delete-dups (pm--oref-with-parents pm/polymode :weavers)))) - (sel (pm--completing-read "Choose weaver: " weavers nil t nil 'pm--weaver-hist)) - (out (intern (cdr sel)))) - (setq pm--weaver-hist (delete-dups pm--weaver-hist)) - (setq-local pm--weave:fromto-last nil) - (oset pm/polymode :weaver out) - out)) - -(provide 'polymode-weave) -;;; polymode-weave.el ends here diff --git a/elpa/polymode-20200411.915/polymode-weave.elc b/elpa/polymode-20200411.915/polymode-weave.elc deleted file mode 100644 index 6fccb70d39f325b11aeefc67910a01f6f0656a84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12582 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 diff --git a/elpa/polymode-20200411.915/polymode.el b/elpa/polymode-20200411.915/polymode.el deleted file mode 100644 index 04467582..00000000 --- a/elpa/polymode-20200411.915/polymode.el +++ /dev/null @@ -1,690 +0,0 @@ -;;; polymode.el --- Extensible framework for multiple major modes -*- lexical-binding: t -*- -;; -;; Author: Vitalie Spinu -;; Maintainer: Vitalie Spinu -;; Copyright (C) 2013-2019, Vitalie Spinu -;; Version: 0.2.2 -;; Package-Requires: ((emacs "25")) -;; URL: https://github.com/polymode/polymode -;; Keywords: languages, multi-modes, processes -;; -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; This file is *NOT* part of GNU Emacs. -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 3, or -;; (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . -;; -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;; Documentation at https://polymode.github.io -;; -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Code: - -(require 'polymode-core) -(require 'polymode-classes) -(require 'polymode-methods) -(require 'polymode-compat) -(require 'polymode-export) -(require 'polymode-weave) -(require 'polymode-base) -(require 'poly-lock) -(require 'easymenu) -(require 'derived) - -(defvar polymode-prefix-key nil - "[Obsoleted] Prefix key for the polymode mode keymap. -Not effective after loading the polymode library.") -(make-obsolete-variable 'polymode-prefix-key "Unbind in `polymode-mode-map'" "v0.1.6") - -(defvar polymode-map - (let ((map (define-prefix-command 'polymode-map))) - ;; eval - (define-key map "v" 'polymode-eval-map) - ;; navigation - (define-key map "\C-n" 'polymode-next-chunk) - (define-key map "\C-p" 'polymode-previous-chunk) - (define-key map "\C-\M-n" 'polymode-next-chunk-same-type) - (define-key map "\C-\M-p" 'polymode-previous-chunk-same-type) - ;; chunk manipulation - (define-key map "\M-k" 'polymode-kill-chunk) - (define-key map "\M-m" 'polymode-mark-or-extend-chunk) - (define-key map "\C-t" 'polymode-toggle-chunk-narrowing) - ;; backends - (define-key map "e" 'polymode-export) - (define-key map "E" 'polymode-set-exporter) - (define-key map "w" 'polymode-weave) - (define-key map "W" 'polymode-set-weaver) - (define-key map "t" 'polymode-tangle) - (define-key map "T" 'polymode-set-tangler) - (define-key map "$" 'polymode-show-process-buffer) - map) - "Polymode prefix map. -Lives on `polymode-prefix-key' in polymode buffers.") - -(defvaralias 'polymode-mode-map 'polymode-minor-mode-map) -(defvar polymode-minor-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (or polymode-prefix-key "\M-n") 'polymode-map) - map) - "The minor mode keymap which is inherited by all polymodes.") - -(easy-menu-define polymode-menu polymode-minor-mode-map - "Menu for polymode." - '("Polymode" - ["Next chunk" polymode-next-chunk] - ["Previous chunk" polymode-previous-chunk] - ["Next chunk same type" polymode-next-chunk-same-type] - ["Previous chunk same type" polymode-previous-chunk-same-type] - ["Mark or extend chunk" polymode-mark-or-extend-chunk] - ["Kill chunk" polymode-kill-chunk] - "--" - ["Weave" polymode-weave] - ["Set Weaver" polymode-set-weaver] - "--" - ["Export" polymode-export] - ["Set Exporter" polymode-set-exporter])) - - -;;; NAVIGATION - -(defun polymode-next-chunk (&optional N) - "Go N chunks forwards. -Return the number of actually moved over chunks. This command is -a \"cycling\" command (see `polymode-next-chunk-same-type' for an -example)." - (interactive "p") - (pm-goto-span-of-type '(nil body) N) - ;; If head/tail end before eol we move to the next line - (when (looking-at "\\s *$") - (forward-line 1)) - (pm--set-transient-map (list #'polymode-previous-chunk - #'polymode-next-chunk))) - -;;fixme: problme with long chunks .. point is recentered -;;todo: merge into next-chunk -(defun polymode-previous-chunk (&optional N) - "Go N chunks backwards. -This command is a \"cycling\" command (see -`polymode-next-chunk-same-type' for an example). Return the -number of chunks jumped over." - (interactive "p") - (polymode-next-chunk (- N))) - -(defun polymode-next-chunk-same-type (&optional N) - "Go to next N chunk. -Return the number of chunks of the same type moved over. This -command is a \"cycling\" command in the sense that you can repeat -the basic key without the prefix multiple times to invoke the -command multiple times." - (interactive "p") - (let* ((sofar 0) - (back (< N 0)) - (beg (if back (point-min) (point))) - (end (if back (point) (point-max))) - (N (if back (- N) N)) - (orig-pos (point)) - (pos (point)) - this-type this-name) - (condition-case-unless-debug nil - (pm-map-over-spans - (lambda (span) - (unless (memq (car span) '(head tail)) - (when (and (equal this-name - (eieio-object-name-string (nth 3 span))) - (eq this-type (car span))) - (setq pos (nth 1 span)) - (setq sofar (1+ sofar))) - (unless this-name - (setq this-name (eieio-object-name-string (nth 3 span)) - this-type (car span))) - (when (>= sofar N) - (signal 'quit nil)))) - beg end nil back) - (quit (when (looking-at "\\s *$") - (forward-line)))) - (goto-char pos) - (when (or (eobp) (bobp) (eq pos orig-pos)) - (message "No more chunks of type %s" this-name) - (ding)) - (pm--set-transient-map (list #'polymode-previous-chunk-same-type - #'polymode-next-chunk-same-type)) - sofar)) - -(defun polymode-previous-chunk-same-type (&optional N) - "Go to previous N chunk. -Return the number of chunks of the same type moved over." - (interactive "p") - (polymode-next-chunk-same-type (- N))) - - -;;; KILL and NARROWING - -(defun pm--kill-span (types) - (let ((span (pm-innermost-span))) - (when (memq (car span) types) - (delete-region (nth 1 span) (nth 2 span))))) - -(defun polymode-kill-chunk () - "Kill current chunk." - (interactive) - (pcase (pm-innermost-span) - (`(,(or `nil `host) ,beg ,end ,_) (delete-region beg end)) - (`(body ,beg ,_ ,_) - (goto-char beg) - (pm--kill-span '(body)) - (pm--kill-span '(head tail)) - (pm--kill-span '(head tail))) - (`(tail ,beg ,end ,_) - (if (eq beg (point-min)) - (delete-region beg end) - (goto-char (1- beg)) - (polymode-kill-chunk))) - (`(head ,_ ,end ,_) - (goto-char end) - (polymode-kill-chunk)) - (_ (error "Canoot find chunk to kill")))) - -(defun polymode-toggle-chunk-narrowing () - "Toggle narrowing of the body of current chunk." - (interactive) - (if (buffer-narrowed-p) - (progn (widen) (recenter)) - (pcase (pm-innermost-span) - (`(head ,_ ,end ,_) - (goto-char end) - (pm-narrow-to-span)) - (`(tail ,beg ,_ ,_) - (if (eq beg (point-min)) - (error "Invalid chunk") - (goto-char (1- beg)) - (pm-narrow-to-span))) - (_ (pm-narrow-to-span))))) - -(defun pm-chunk-range (&optional pos) - "Return a range (BEG . END) for a chunk at POS." - (setq pos (or pos (point))) - (let ((span (pm-innermost-span pos)) - (pmin (point-min)) - (pmax (point-max))) - (cl-case (car span) - ((nil) (pm-span-to-range span)) - (body (cons (if (= pmin (nth 1 span)) - pmin - (nth 1 (pm-innermost-span (1- (nth 1 span))))) - (if (= pmax (nth 2 span)) - pmax - (nth 2 (pm-innermost-span (nth 2 span)))))) - (head (if (= pmax (nth 2 span)) - (pm-span-to-range span) - (pm-chunk-range (nth 2 span)))) - (tail (if (= pmin (nth 1 span)) - (pm-span-to-range span) - (pm-chunk-range (1- (nth 1 span)))))))) - -(defun polymode-mark-or-extend-chunk () - "DWIM command to repeatedly mark chunk or extend region. -When no region is active, mark the current span if in body of a -chunk or the whole chunk if in head or tail. On repeated -invocation extend the region either forward or backward. You need -not use the prefix key on repeated invocation. For example -assuming we are in the body of the inner chunk and this command -is bound on M\\=-n M\\=-m (the default) - - [M\\=-n M\\=-m M\\=-m M\\=-m] selects body, expand selection to chunk then - expand selection to previous chunk - - [M\\=-n M\\=-m C\\=-x C\\=-x M\\=-m] selects body, expand selection to chunk, - then reverse point and mark, then extend the - selection to the following chunk" - (interactive) - (let ((span (pm-innermost-span))) - (if (region-active-p) - (if (< (mark) (point)) - ;; forward extension - (if (eobp) - (user-error "End of buffer") - (if (eq (car span) 'head) - (goto-char (cdr (pm-chunk-range))) - (goto-char (nth 2 span)) - ;; special dwim when extending from body - (when (and (eq (car span) 'tail) - (not (= (point-min) (nth 1 span)))) - (let ((body-span (pm-innermost-span (1- (nth 1 span))))) - (when (and (= (nth 1 body-span) (mark)) - (not (= (nth 1 body-span) (point-min)))) - (let ((head-span (pm-innermost-span (1- (nth 1 body-span))))) - (when (eq (car head-span) 'head) - (set-mark (nth 1 head-span))))))))) - ;; backward extension - (if (bobp) - (user-error "Beginning of buffer") - (goto-char (car (if (= (point) (nth 1 span)) - (pm-chunk-range (1- (point))) - (pm-chunk-range (point))))) - ;; special dwim when extending from body - (when (and (eq (car span) 'body) - (= (nth 2 span) (mark))) - (let ((tail-span (pm-innermost-span (nth 2 span)))) - (when (eq (car tail-span) 'tail) - (set-mark (nth 2 tail-span))))))) - (let ((range (if (memq (car span) '(nil body)) - (pm-span-to-range span) - (pm-chunk-range)))) - (set-mark (cdr range)) - (goto-char (car range))))) - (let ((map (make-sparse-keymap))) - (define-key map (vector last-command-event) #'polymode-mark-or-extend-chunk) - (define-key map (car (where-is-internal #'exchange-point-and-mark)) #'exchange-point-and-mark) - (let ((ev (event-basic-type last-command-event))) - (define-key map (vector ev) #'polymode-mark-or-extend-chunk)) - (set-transient-map map (lambda () (eq this-command 'exchange-point-and-mark))))) - -(defun polymode-show-process-buffer () - "Show the process buffer used by weaving and exporting programs." - (interactive) - (let ((buf (cl-loop for b being the buffers - if (buffer-local-value 'pm--process-buffer b) - return b))) - (if buf - (pop-to-buffer buf `(nil . ((inhibit-same-window . ,pop-up-windows)))) - (message "No polymode process buffers found.")))) - - -;;; EVALUATION - -(defvar polymode-eval-map - (let (polymode-eval-map) - (define-prefix-command 'polymode-eval-map) - (define-key polymode-eval-map "v" #'polymode-eval-region-or-chunk) - (define-key polymode-eval-map "b" #'polymode-eval-buffer) - (define-key polymode-eval-map "u" #'polymode-eval-buffer-from-beg-to-point) - (define-key polymode-eval-map "d" #'polymode-eval-buffer-from-point-to-end) - (define-key polymode-eval-map (kbd "") #'polymode-eval-buffer-from-beg-to-point) - (define-key polymode-eval-map (kbd "") #'polymode-eval-buffer-from-point-to-end) - polymode-eval-map) - "Keymap for polymode evaluation commands.") - -(defvar-local polymode-eval-region-function nil - "Function taking three arguments which does mode specific evaluation. -First two arguments are BEG and END of the region. The third -argument is the message describing the evaluation type. If the -value of this variable is non-nil in the host mode then all inner -spans are evaluated within the host buffer and values of this -variable for the inner modes are ignored.") - -(defun polymode-eval-region (beg end &optional msg) - "Eval all spans within region defined by BEG and END. -MSG is a message to be passed to `polymode-eval-region-function'; -defaults to \"Eval region\"." - (interactive "r") - (save-excursion - (let* ((base (pm-base-buffer)) - (host-fun (buffer-local-value 'polymode-eval-region-function base)) - (msg (or msg "Eval region")) - evalled mapped) - (if host-fun - (pm-map-over-spans - (lambda (span) - (when (eq (car span) 'body) - (with-current-buffer base - (funcall host-fun (max beg (nth 1 span)) (min end (nth 2 span)) msg)))) - beg end) - (pm-map-over-spans - (lambda (span) - (when (eq (car span) 'body) - (setq mapped t) - (when polymode-eval-region-function - (setq evalled t) - (funcall polymode-eval-region-function - (max beg (nth 1 span)) - (min end (nth 2 span)) - msg)))) - beg end) - (unless mapped - (user-error "No inner spans in the region")) - (unless evalled - (user-error "None of the inner spans have `polymode-eval-region-function' defined")))))) - -(defun polymode-eval-chunk (span-or-pos &optional no-error) - "Eval the body span of the inner chunk at point. -SPAN-OR-POS is either a span or a point. When NO-ERROR is -non-nil, don't throw if `polymode-eval-region-function' is nil." - (interactive "d") - (let* ((span (if (number-or-marker-p span-or-pos) - (pm-innermost-span span-or-pos) - span-or-pos)) - (body-span (pcase (car span) - ('head (pm-innermost-span (nth 2 span))) - ('tail (pm-innermost-span (1- (nth 1 span)))) - ('body span) - (_ (user-error "Not in an inner chunk")))) - (base (pm-base-buffer)) - (host-fun (buffer-local-value 'polymode-eval-region-function base)) - (msg "Eval chunk")) - (save-excursion - (pm-set-buffer body-span) - (if host-fun - (with-current-buffer base - (funcall host-fun (nth 1 body-span) (nth 2 body-span) msg)) - (if polymode-eval-region-function - (funcall polymode-eval-region-function (nth 1 body-span) (nth 2 body-span) msg) - (unless no-error - (error "Undefined `polymode-eval-region-function' in buffer %s" (current-buffer)))))))) - -(defun polymode-eval-region-or-chunk () - "Eval all inner chunks in region if active, or current chunk otherwise." - (interactive) - (if (use-region-p) - (polymode-eval-region (region-beginning) (region-end)) - (polymode-eval-chunk (point)))) - -(defun polymode-eval-buffer () - "Eval all inner chunks in the buffer." - (interactive) - (polymode-eval-region (point-min) (point-max) "Eval buffer")) - -(defun polymode-eval-buffer-from-beg-to-point () - "Eval all inner chunks from beginning of buffer till point." - (interactive) - (polymode-eval-region (point-min) (point) "Eval buffer till point")) - -(defun polymode-eval-buffer-from-point-to-end () - "Eval all inner chunks from point to the end of buffer." - (interactive) - (polymode-eval-region (point) (point-max) "Eval buffer till end")) - - -;;; DEFINE - -(defun pm--config-name (symbol &optional must-exist) - (let* ((poly-name (replace-regexp-in-string "pm-poly/\\|poly-\\|-mode\\|-polymode\\|-minor-mode" "" - (symbol-name symbol))) - (config-name - (if (and (boundp symbol) - (symbol-value symbol) - (object-of-class-p (symbol-value symbol) 'pm-polymode)) - symbol - (intern (concat "poly-" poly-name "-polymode"))))) - (when must-exist - (unless (boundp config-name) - (let ((old-config-name (intern (concat "pm-poly/" poly-name)))) - (if (boundp old-config-name) - (setq config-name old-config-name) - (error "No pm-polymode config object with name `%s'" config-name)))) - (unless (object-of-class-p (symbol-value config-name) 'pm-polymode) - (error "`%s' is not a `pm-polymode' config object" config-name))) - config-name)) - -(defun pm--get-keylist.keymap-from-parent (keymap parent-conf) - (let ((keylist (copy-sequence keymap)) - (pi parent-conf) - (parent-map)) - (while pi - (let ((map (and (slot-boundp pi :keylist) - (eieio-oref pi 'keylist)))) - (when map - (if (and (symbolp map) - (keymapp (symbol-value map))) - ;; if one of the parent's :keylist is a keymap, use it as our - ;; parent-map and stop further descent - (setq parent-map map - pi nil) - ;; list, descend to next parent and append the key list to keylist - (setq pi (and (slot-boundp pi :parent-instance) - (eieio-oref pi 'parent-instance)) - keylist (append map keylist)))))) - (when (and parent-map (symbolp parent-map)) - (setq parent-map (symbol-value parent-map))) - (cons (reverse keylist) - (or parent-map polymode-minor-mode-map)))) - -;;;###autoload -(defmacro define-polymode (mode &optional parent doc &rest body) - "Define a new polymode MODE. -This macro defines command MODE and an indicator variable MODE -which becomes t when MODE is active and nil otherwise. - -MODE command can be used as both major and minor mode. Using -polymodes as minor modes makes sense when :hostmode (see below) -is not specified, in which case polymode installs only inner -modes and doesn't touch current major mode. - -Standard hook MODE-hook is run at the end of the initialization -of each polymode buffer (both indirect and base buffers). - -This macro also defines the MODE-map keymap from the :keymap -argument and PARENT-map (see below) and poly-[MODE-NAME]-polymode -variable which holds an object of class `pm-polymode' which holds -the entire configuration for this polymode. - -PARENT is either the polymode configuration object or a polymode -mode (there is 1-to-1 correspondence between config -objects (`pm-polymode') and mode functions). The new polymode -MODE inherits alll the behavior from PARENT except for the -overwrites specified by the keywords (see below). The new MODE -runs all the hooks from the PARENT-mode and inherits its MODE-map -from PARENT-map. - -DOC is an optional documentation string. If present PARENT must -be provided, but can be nil. - -BODY is executed after the complete initialization of the -polymode but before MODE-hook. It is executed once for each -polymode buffer - host buffer on initialization and every inner -buffer subsequently created. - -Before the BODY code keyword arguments (i.e. alternating keywords -and values) are allowed. The following special keywords -controlling the behavior of the new MODE are supported: - -:lighter Optional LIGHTER is displayed in the mode line when the - mode is on. If omitted, it defaults to the :lighter slot of - CONFIG object. - -:keymap If nil, a new MODE-map keymap is created what directly - inherits from the PARENT's keymap. The last keymap in the - inheritance chain is always `polymode-minor-mode-map'. If a - keymap it is used directly as it is. If a list of binding of - the form (KEY . BINDING) it is merged the bindings are added to - the newly create keymap. - -:after-hook A single form which is evaluated after the mode hooks - have been run. It should not be quoted. - -Other keywords are added to the `pm-polymode' configuration -object and should be valid slots in PARENT config object or the -root config `pm-polymode' object if PARENT is nil. By far the -most frequently used slots are: - -:hostmode Symbol pointing to a `pm-host-chunkmode' object - specifying the behavior of the hostmode. If missing or nil, - MODE will behave as a minor-mode in the sense that it will - reuse the currently installed major mode and will install only - the inner modes. - -:innermodes List of symbols pointing to `pm-inner-chunkmode' - objects which specify the behavior of inner modes (or submodes)." - (declare - (doc-string 3) - (debug (&define name - [&optional [¬ keywordp] name] - [&optional stringp] - [&rest [keywordp sexp]] - def-body))) - - (let* ((last-message (make-symbol "last-message")) - (mode-name (symbol-name mode)) - (config-name (pm--config-name mode)) - (root-name (replace-regexp-in-string "poly-\\|-mode" "" mode-name)) - (keymap-name (intern (concat mode-name "-map"))) - keymap keylist slots after-hook keyw lighter) - - (if (keywordp parent) - (progn - (push doc body) - (push parent body) - (setq doc nil - parent nil)) - (unless (stringp doc) - (push doc body) - (setq doc (format "Polymode for %s." root-name)))) - - (unless (symbolp parent) - (error "PARENT must be a name of a `pm-polymode' config or a polymode mode function")) - - ;; Check keys - (while (keywordp (setq keyw (car body))) - (setq body (cdr body)) - (pcase keyw - (`:lighter (setq lighter (purecopy (pop body)))) - (`:keymap (setq keymap (pop body))) - (`:after-hook (setq after-hook (pop body))) - (`:keylist (setq keylist (pop body))) - (_ (push (pop body) slots) (push keyw slots)))) - - - `(progn - - ;; Define the variable to enable or disable the mode. - (defvar-local ,mode nil ,(format "Non-nil if `%s' polymode is enabled." mode)) - - (let* ((parent ',parent) - (keymap ,keymap) - (keylist ,keylist) - (parent-conf-name (and parent (pm--config-name parent 'must-exist))) - (parent-conf (and parent-conf-name (symbol-value parent-conf-name)))) - - ;; define the minor-mode's keymap - (makunbound ',keymap-name) - (defvar ,keymap-name - (if (keymapp keymap) - keymap - (let ((parent-map (unless (keymapp keymap) - ;; keymap is either nil or a list - (cond - ;; 1. if parent is config object, merge all list - ;; keymaps from parents - ((eieio-object-p (symbol-value parent)) - (let ((klist.kmap (pm--get-keylist.keymap-from-parent - keymap (symbol-value parent)))) - (setq keymap (append keylist (car klist.kmap))) - (cdr klist.kmap))) - ;; 2. If parent is polymode function, take the - ;; minor-mode from the parent config - (parent - (symbol-value - (derived-mode-map-name - (eieio-oref parent-conf '-minor-mode)))) - ;; 3. nil - (t polymode-minor-mode-map))))) - (easy-mmode-define-keymap keymap nil nil (list :inherit parent-map)))) - ,(format "Keymap for %s." mode-name)) - - - ,@(unless (eq parent config-name) - `((makunbound ',config-name) - (defvar ,config-name - (if parent-conf-name - (clone parent-conf - :name ,(symbol-name config-name) - '-minor-mode ',mode - ,@slots) - (pm-polymode :name ,(symbol-name config-name) - '-minor-mode ',mode - ,@slots)) - ,(format "Configuration object for `%s' polymode." mode)))) - - ;; The actual mode function: - (defun ,mode (&optional arg) - ,(format "%s\n\n\\{%s}" - ;; fixme: add inheretance info here and warning if body is - ;; non-nil (like in define-mirror-mode) - doc keymap-name) - (interactive) - (let ((,last-message (current-message)) - (state (cond - ((numberp arg) (> arg 0)) - (arg t) - ((not ,mode))))) - (setq ,mode state) - (if state - (unless (buffer-base-buffer) - ;; Call in indirect buffers only. Inner modes during - ;; initialization call this polymode minor-mode which triggers - ;; this `pm-initialize'. - (when ,mode - (let ((obj (clone ,config-name))) - ;; (eieio-oset obj '-minor-mode ',mode) - (pm-initialize obj)) - ;; when host mode is reset in pm-initialize we end up with new - ;; minor mode in hosts - (setq ,mode t))) - (let ((base (pm-base-buffer))) - (pm-turn-polymode-off t) - (switch-to-buffer base))) - ;; `body` and `hooks` are executed in all buffers; pm/polymode has been set - ,@body - (when state - (pm--run-derived-mode-hooks) - ,@(when after-hook `(,after-hook))) - (unless (buffer-base-buffer) - ;; Avoid overwriting a message shown by the body, - ;; but do overwrite previous messages. - (when (and (called-interactively-p 'any) - (or (null (current-message)) - (not (equal ,last-message - (current-message))))) - (message ,(concat root-name " polymode %s") - (if state "enabled" "disabled")))) - (force-mode-line-update)) - ;; Return the new state - ,mode) - - (add-minor-mode ',mode ,(or lighter " PM") ,keymap-name))))) - -(define-minor-mode polymode-minor-mode - "Polymode minor mode, used to make everything work." - nil " PM") - -(define-derived-mode poly-head-tail-mode prog-mode "HeadTail" - "Default major mode for polymode head and tail spans." - (let ((base (pm-base-buffer))) - ;; (#119) hideshow needs comment regexp and throws if not found. We are - ;; using these values from the host mode which should have been installed - ;; already. - (setq-local comment-start (buffer-local-value 'comment-start base)) - (setq-local comment-end (buffer-local-value 'comment-end base)))) - -(define-derived-mode poly-fallback-mode prog-mode "FallBack" - ;; fixme: - ;; 1. doesn't work as fallback for hostmode - ;; 2. highlighting is lost (Rnw with inner fallback) - "Default major mode for modes which were not found. -This is better than fundamental-mode because it allows running -globalized minor modes and can run user hooks.") - -;; indulge elisp font-lock (FIXME: check if this is needed; why host/inner defs work?) -(dolist (mode '(emacs-lisp-mode lisp-interaction-mode)) - (font-lock-add-keywords - mode - '(("(\\(define-polymode\\)\\s +\\(\\(\\w\\|\\s_\\)+\\)" - (1 font-lock-keyword-face) - (2 font-lock-variable-name-face))))) - -(provide 'polymode) -;;; polymode.el ends here diff --git a/elpa/polymode-20200411.915/polymode.elc b/elpa/polymode-20200411.915/polymode.elc deleted file mode 100644 index a4a7a9c0372dde6155fb01c96ba11f720402132e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26100 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 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)))) - (x-gtk-use-system-tooltips nil) ; Don't use Gtk+ tooltip in Emacs 24 - (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 origin 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 doesn'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 diff --git a/elpa/pos-tip-20191227.1356/pos-tip.elc b/elpa/pos-tip-20191227.1356/pos-tip.elc deleted file mode 100644 index 6c052bf8222bf228eaf73de9829d3e5120abf3c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25349 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")) :maintainer '("Frédéric Perrin ") :url "http://github.com/jschaf/powershell.el") diff --git a/elpa/powershell-20190421.2038/powershell.el b/elpa/powershell-20190421.2038/powershell.el deleted file mode 100644 index 91ce5454..00000000 --- a/elpa/powershell-20190421.2038/powershell.el +++ /dev/null @@ -1,1386 +0,0 @@ -;;; powershell.el --- Mode for editing PowerShell scripts -*- lexical-binding: t; -*- - -;; Copyright (C) 2009, 2010 Frédéric Perrin -;; Copyright (C) 2012 Richard Bielawski rbielaws-at-i1-dot-net -;; http://www.emacswiki.org/emacs/Rick_Bielawski - -;; Author: Frédéric Perrin -;; URL: http://github.com/jschaf/powershell.el -;; Package-Version: 20190421.2038 -;; Version: 0.3 -;; Package-Requires: ((emacs "24")) -;; Keywords: powershell, languages - -;; This file is NOT part of GNU Emacs. - -;; This file is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published -;; by the Free Software Foundation, either version 3 of the License, -;; or (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Installation: - -;; Place powershell.el on your `load-path' by adding the following -;; code to your `user-init-file', which is usually ~/.emacs.d/init.el -;; or ~/.emacs. -;; -;; (add-to-list 'load-path "~/path/to/powershell") -;; - -;;; Commentary: - -;; powershell.el is a combination of powershell.el by Dino Chiesa -;; and powershell-mode.el by Frédéric Perrin -;; and Richard Bielawski. Joe Schafer combined the work into a single -;; file. - -;;; Frédéric Perrin Comments: -;; -;; The original powershell-mode.el was written from scratch, without -;; using Vivek Sharma's code: it had issues I wanted to correct, but -;; unfortunately there were no licence indication, and Vivek didn't -;; answered my mails. -;; -;;; Rick Bielawski Comments 2012/09/28: -;; -;; On March 31, 2012 Frédéric gave me permission to take over support -;; for powershell-mode.el. I've added support for multi-line comments -;; and here-strings as well as enhancement/features such as: Functions -;; to quote, unquote and escape a selection, and one to wrap a -;; selection in $(). Meanwhile I hope I didn't break anything. -;; -;; Joe Schafer Comments 2013-06-06: -;; -;; I combined powershell.el and powershell-mode.el. Since -;; powershell.el was licensed with the new BSD license I combined the -;; two files using the more restrictive license, the GPL. I also -;; cleaned up the documentation and reorganized some of the code. - -;;; Updates: - -;; 2012/10/01 Fixed several bugs in highlighting variables and types. -;; Renamed some variables to be more descriptive. -;; 2012/10/02 Enhanced PowerShell-mode indenting & syntax table. -;; Fixed dangling parens and re-indented the elisp itself. -;; 2012/10/05 Added eldoc support. Fixed bug where indent could loop. -;; See comment below on how to generate powershell-eldoc.el -;; 2013/06/06 Merged powershell.el and powershell-mode.el - -;;; Code: - -(eval-when-compile (require 'thingatpt)) -(require 'shell) -(require 'compile) - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.ps[dm]?1\\'" . powershell-mode)) - - -;; User Variables - -(defgroup powershell nil - "Customization of PowerShell mode." - :link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces) - :group 'languages) - -(defcustom powershell-indent 4 - "Amount of horizontal space to indent. -After, for instance, an opening brace" - :type 'integer - :group 'powershell) - -(defcustom powershell-continuation-indent 2 - "Amount of horizontal space to indent a continuation line." - :type 'integer - :group 'powershell) - -(defcustom powershell-continued-regexp ".*\\(|[\\t ]*\\|`\\)$" - "Regexp matching a continued line. -Ending either with an explicit backtick, or with a pipe." - :type 'integer - :group 'powershell) - -;; Note: There are no explicit references to the variable -;; `explicit-powershell.exe-args'. It is used implicitly by M-x shell -;; when the shell is `powershell.exe'. See -;; http://blogs.msdn.com/b/dotnetinterop/archive/2008/04/10/run-powershell-as-a-shell-within-emacs.aspx -;; for details. -(defcustom explicit-powershell.exe-args '("-Command" "-" ) - "Args passed to inferior shell by \\[shell], if the shell is powershell.exe. -Value is a list of strings, which may be nil." - :type '(repeat (string :tag "Argument")) - :group 'powershell) - -(defun powershell-continuation-line-p () - "Return t is the current line is a continuation line. -The current line is a continued line when the previous line ends -with a backtick or a pipe" - (interactive) - (save-excursion - (forward-line -1) - (looking-at powershell-continued-regexp))) - -;; Rick added significant complexity to Frédéric's original version -(defun powershell-indent-line-amount () - "Return the column to which the current line ought to be indented." - (interactive) - (save-excursion - (beginning-of-line) - (if (powershell-continuation-line-p) - ;; on a continuation line (i.e. prior line ends with backtick - ;; or pipe), indent relative to the continued line. - (progn - (while (and (not (bobp))(powershell-continuation-line-p)) - (forward-line -1)) - (+ (current-indentation) powershell-continuation-indent)) - ;; otherwise, indent relative to the block's opening char ([{ - ;; \\s- includes newline, which make the line right before closing paren not indented - (let ((closing-paren (looking-at "[ \t]*\\s)")) - new-indent - block-open-line) - (condition-case nil - (progn - (backward-up-list) ;when at top level, throw to no-indent - (setq block-open-line (line-number-at-pos)) - ;; We're in a block, calculate/return indent amount. - (if (not (looking-at "\\s(\\s-*\\(#.*\\)?$")) - ;; code (not comments) follow the block open so - ;; vertically align the block with the code. - (if closing-paren - ;; closing indent = open - (setq new-indent (current-column)) - ;; block indent = first line of code - (forward-char) - (skip-syntax-forward " ") - (setq new-indent (current-column))) - ;; otherwise block open is at eol so indent is relative to - ;; bol or another block open on the same line. - (if closing-paren ; this sets the default indent - (setq new-indent (current-indentation)) - (setq new-indent (+ powershell-indent (current-indentation)))) - ;; now see if the block is nested on the same line - (when (condition-case nil - (progn - (backward-up-list) - (= block-open-line (line-number-at-pos))) - (scan-error nil)) - (forward-char) - (skip-syntax-forward " ") - (if closing-paren - (setq new-indent (current-column)) - (setq new-indent (+ powershell-indent (current-column)))))) - new-indent) - (scan-error ;; most likely, we are at the top-level - 0)))))) - -(defun powershell-indent-line () - "Indent the current line of powershell mode. -Leave the point in place if it is inside the meat of the line" - (interactive) - (let ((savep (> (current-column) (current-indentation))) - (amount (powershell-indent-line-amount))) - (if savep - (save-excursion (indent-line-to amount)) - (indent-line-to amount)))) - -(defun powershell-quote-selection (beg end) - "Quotes the selection between BEG and END. -Quotes with single quotes and doubles embedded single quotes." - (interactive `(,(region-beginning) ,(region-end))) - (if (not mark-active) - (error "Command requires a marked region")) - (goto-char beg) - (while (re-search-forward "'" end t) - (replace-match "''")(setq end (1+ end))) - (goto-char beg) - (insert "'") - (setq end (1+ end)) - (goto-char end) - (insert "'")) - -(defun powershell-unquote-selection (beg end) - "Unquotes the selected text between BEG and END. -Remove doubled single quotes as we go." - (interactive `(,(region-beginning) ,(region-end))) - (if (not mark-active) - (error "Command requires a marked region")) - (goto-char beg) - (cond ((looking-at "'") - (goto-char end) - (when (looking-back "'" nil) - (delete-char -1) - (setq end (1- end)) - (goto-char beg) - (delete-char 1) - (setq end (1- end)) - (while (search-forward "'" end t) - (delete-char -1) - (forward-char) - (setq end (1- end))))) - ((looking-at "\"") - (goto-char end) - (when (looking-back "\"" nil) - (delete-char -1) - (setq end (1- end)) - (goto-char beg) - (delete-char 1) - (setq end (1- end)) - (while (search-forward "\"" end t) - (delete-char -1) - (forward-char) - (setq end (1- end))) - (while (search-forward "`" end t) - (delete-char -1) - (forward-char) - (setq end (1- end))))) - (t (error "Must select quoted text exactly")))) - -(defun powershell-escape-selection (beg end) - "Escape variables between BEG and END. -Also extend existing escapes." - (interactive `(,(region-beginning) ,(region-end))) - (if (not mark-active) - (error "Command requires a marked region")) - (goto-char beg) - (while (re-search-forward "`" end t) - (replace-match "```")(setq end (+ end 2))) - (goto-char beg) - (while (re-search-forward "\\(?:\\=\\|[^`]\\)[$]" end t) - (goto-char (car (cdr (match-data)))) - (backward-char) - (insert "`") - (forward-char) - (setq end (1+ end)))) - -(defun powershell-doublequote-selection (beg end) - "Quotes the text between BEG and END with double quotes. -Embedded quotes are doubled." - (interactive `(,(region-beginning) ,(region-end))) - (if (not mark-active) - (error "Command requires a marked region")) - (goto-char beg) - (while (re-search-forward "\"" end t) - (replace-match "\"\"")(setq end (1+ end))) - (goto-char beg) - (while (re-search-forward "`'" end t) - (replace-match "```")(setq end (+ 2 end))) - (goto-char beg) - (insert "\"") - (setq end (1+ end)) - (goto-char end) - (insert "\"")) - -(defun powershell-dollarparen-selection (beg end) - "Wraps the text between BEG and END with $(). -The point is moved to the closing paren." - (interactive `(,(region-beginning) ,(region-end))) - (if (not mark-active) - (error "Command requires a marked region")) - (save-excursion - (goto-char end) - (insert ")") - (goto-char beg) - (insert "$(")) - (forward-char)) - -(defun powershell-regexp-to-regex (beg end) - "Turn the text between BEG and END into a regex. -The text is assumed to be `regexp-opt' output." - (interactive `(,(region-beginning) ,(region-end))) - (if (not mark-active) - (error "Command requires a marked region")) - (save-restriction - (narrow-to-region beg end) - (goto-char (point-min)) - (while (re-search-forward "\\\\(" nil t) - (replace-match "(")) - (goto-char (point-min)) - (while (re-search-forward "\\\\)" nil t) - (replace-match ")")) - (goto-char (point-min)) - (while (re-search-forward "\\\\|" nil t) - (replace-match "|")))) - - -;; Taken from About_Keywords -(defvar powershell-keywords - (concat "\\_<" - (regexp-opt - '("begin" "break" "catch" "class" "continue" "data" "define" "do" "default" - "dynamicparam" "else" "elseif" "end" "enum" "exit" "filter" "finally" - "for" "foreach" "from" "function" "hidden" "if" "in" "param" "process" - "return" "static" "switch" "throw" "trap" "try" "until" "using" "var" "where" "while" - ;; Questionable, specific to workflow sessions - "inlinescript") - t) - "\\_>") - "PowerShell keywords.") - -;; Taken from About_Comparison_Operators and some questionable sources :-) -(defvar powershell-operators - (concat "\\_<" - (regexp-opt - '("-eq" "-ne" "-gt" "-ge" "-lt" "-le" - ;; case sensitive versions - "-ceq" "-cne" "-cgt" "-cge" "-clt" "-cle" - ;; explicitly case insensitive - "-ieq" "-ine" "-igt" "-ige" "-ilt" "-ile" - "-band" "-bor" "-bxor" "-bnot" - "-and" "-or" "-xor" "-not" "!" - "-like" "-notlike" "-clike" "-cnotlike" "-ilike" "-inotlike" - "-match" "-notmatch" "-cmatch" "-cnotmatch" "-imatch" "-inotmatch" - "-contains" "-notcontains" "-ccontains" "-cnotcontains" - "-icontains" "-inotcontains" - "-replace" "-creplace" "-ireplace" - "-is" "-isnot" "-as" "-f" - "-in" "-cin" "-iin" "-notin" "-cnotin" "-inotin" - "-split" "-csplit" "-isplit" - "-join" - "-shl" "-shr" - ;; Questionable --> specific to certain contexts - "-casesensitive" "-wildcard" "-regex" "-exact" ;specific to case - "-begin" "-process" "-end" ;specific to scriptblock - ) t) - "\\_>") - "PowerShell operators.") - -(defvar powershell-scope-names - '("global" "local" "private" "script" ) - "Names of scopes in PowerShell mode.") - -(defvar powershell-variable-drive-names - (append '("env" "function" "variable" "alias" "hklm" "hkcu" "wsman") powershell-scope-names) - "Names of scopes in PowerShell mode.") - -(defconst powershell-variables-regexp - ;; There are 2 syntaxes detected: ${[scope:]name} and $[scope:]name - ;; Match 0 is the entire variable name. - ;; Match 1 is scope when the former syntax is found. - ;; Match 2 is scope when the latter syntax is found. - (concat - "\\_<$\\(?:{\\(?:" (regexp-opt powershell-variable-drive-names t) - ":\\)?[^}]+}\\|" - "\\(?:" (regexp-opt powershell-variable-drive-names t) - ":\\)?[a-zA-Z0-9_]+\\_>\\)") - "Identifies legal powershell variable names.") - -(defconst powershell-function-names-regex - ;; Syntax detected is [scope:]verb-noun - ;; Match 0 is the entire name. - ;; Match 1 is the scope if any. - ;; Match 2 is the function name (which must exist) - (concat - "\\_<\\(?:" (regexp-opt powershell-scope-names t) ":\\)?" - "\\([A-Z][a-zA-Z0-9]*-[A-Z0-9][a-zA-Z0-9]*\\)\\_>") - "Identifies legal function & filter names.") - -(defconst powershell-object-types-regexp - ;; Syntax is \[name[.name]\] (where the escaped []s are literal) - ;; Only Match 0 is returned. - "\\[\\(?:[a-zA-Z_][a-zA-Z0-9]*\\)\\(?:\\.[a-zA-Z_][a-zA-Z0-9]*\\)*\\]" - "Identifies object type references. I.E. [object.data.type] syntax.") - -(defconst powershell-function-switch-names-regexp - ;; Only Match 0 is returned. - "\\_<-[a-zA-Z][a-zA-Z0-9]*\\_>" - "Identifies function parameter names of the form -xxxx.") - -;; Taken from Get-Variable on a fresh shell, merged with man -;; about_automatic_variables -(defvar powershell-builtin-variables-regexp - (regexp-opt - '("$" "?" - "^" "_" - "args" "ConsoleFileName" - "Error" "Event" - "EventArgs" - "EventSubscriber" "ExecutionContext" - "false" "Foreach" - "HOME" "Host" - "input" "lsCoreCLR" - "lsLinux" "lsMacOS" - "lsWindows" "LASTEXITCODE" - "Matches" "MyInvocation" - "NestedPromptLevel" "null" - "PID" "PROFILE" - "PSBoundParameters" "PSCmdlet" - "PSCommandPath" - "PSCulture" "PSDebugContext" - "PSHOME" "PSITEM" - "PSScriptRoot" "PSSenderInfo" - "PSUICulture" "PSVersionTable" - "PWD" "ReportErrorShowExceptionClass" - "ReportErrorShowInnerException" "ReportErrorShowSource" - "ReportErrorShowStackTrace" "Sender" - "ShellId" "SourceArgs" - "SourceEventArgs" "StackTrace" - "this" "true" ) t) - "The names of the built-in PowerShell variables. -They are highlighted differently from the other variables.") - -(defvar powershell-config-variables-regexp - (regexp-opt - '("ConfirmPreference" "DebugPreference" - "ErrorActionPreference" "ErrorView" - "FormatEnumerationLimit" "InformationPreference" - "LogCommandHealthEvent" - "LogCommandLifecycleEvent" "LogEngineHealthEvent" - "LogEngineLifecycleEvent" "LogProviderHealthEvent" - "LogProviderLifecycleEvent" "MaximumAliasCount" - "MaximumDriveCount" "MaximumErrorCount" - "MaximumFunctionCount" "MaximumHistoryCount" - "MaximumVariableCount" "OFS" - "OutputEncoding" "ProgressPreference" - "PSDefaultParameterValues" "PSEmailServer" - "PSModuleAutoLoadingPreference" "PSSessionApplicationName" - "PSSessionConfigurationName" "PSSessionOption" - "VerbosePreference" "WarningPreference" - "WhatIfPreference" ) t) - "Names of variables that configure powershell features.") - - -(defun powershell-find-syntactic-comments (limit) - "Find PowerShell comment begin and comment end characters. -Returns match 1 and match 2 for <# #> comment sequences respectively. -Returns match 3 and optionally match 4 for #/eol comments. -Match 4 is returned only if eol is found before LIMIT" - (when (search-forward "#" limit t) - (cond - ((looking-back "<#" nil) - (set-match-data (list (match-beginning 0) (1+ (match-beginning 0)) - (match-beginning 0) (1+ (match-beginning 0))))) - ((looking-at ">") - (set-match-data (list (match-beginning 0) (match-end 0) - nil nil - (match-beginning 0) (match-end 0))) - (forward-char)) - (t - (let ((start (point))) - (if (search-forward "\n" limit t) - (set-match-data (list (1- start) (match-end 0) - nil nil nil nil - (1- start) start - (match-beginning 0) (match-end 0))) - (set-match-data (list start (match-end 0) - nil nil nil nil - (1- start) start)))))) - t)) - -(defun powershell-find-syntactic-quotes (limit) - "Find PowerShell hear string begin and end sequences upto LIMIT. -Returns match 1 and match 2 for @' '@ sequences respectively. -Returns match 3 and match 4 for @\" \"@ sequences respectively." - (when (search-forward "@" limit t) - (cond - ((looking-at "'$") - (set-match-data (list (match-beginning 0) (1+ (match-beginning 0)) - (match-beginning 0) (1+ (match-beginning 0)))) - (forward-char)) - ((looking-back "^'@" nil) - (set-match-data (list (1- (match-end 0)) (match-end 0) - nil nil - (1- (match-end 0)) (match-end 0)))) - ((looking-at "\"$") - (set-match-data (list (match-beginning 0) (1+ (match-beginning 0)) - nil nil - nil nil - (match-beginning 0) (1+ (match-beginning 0)))) - (forward-char)) - ((looking-back "^\"@" nil) - (set-match-data (list (1- (match-end 0)) (match-end 0) - nil nil - nil nil - nil nil - (1- (match-end 0)) (match-end 0))))) - t)) -(defvar powershell-font-lock-syntactic-keywords - `((powershell-find-syntactic-comments (1 "!" t t) (2 "!" t t) - (3 "<" t t) (4 ">" t t)) - (powershell-find-syntactic-quotes (1 "|" t t) (2 "|" t t) - (3 "|" t t) (4 "|" t t))) - "A list of regexp's or functions. -Used to add `syntax-table' properties to -characters that can't be set by the `syntax-table' alone.") - - -(defvar powershell-font-lock-keywords-1 - `( ;; Type annotations - (,powershell-object-types-regexp . font-lock-type-face) - ;; syntaxic keywords - (,powershell-keywords . font-lock-keyword-face) - ;; operators - (,powershell-operators . font-lock-builtin-face) - ;; the REQUIRES mark - ("^#\\(REQUIRES\\)" 1 font-lock-warning-face t)) - "Keywords for the first level of font-locking in PowerShell mode.") - -(defvar powershell-font-lock-keywords-2 - (append - powershell-font-lock-keywords-1 - `( ;; Built-in variables - (,(concat "\\$\\(" powershell-builtin-variables-regexp "\\)\\>") - 0 font-lock-builtin-face t) - (,(concat "\\$\\(" powershell-config-variables-regexp "\\)\\>") - 0 font-lock-builtin-face t))) - "Keywords for the second level of font-locking in PowerShell mode.") - -(defvar powershell-font-lock-keywords-3 - (append - powershell-font-lock-keywords-2 - `( ;; user variables - (,powershell-variables-regexp - (0 font-lock-variable-name-face) - (1 (cons font-lock-type-face '(underline)) t t) - (2 (cons font-lock-type-face '(underline)) t t)) - ;; function argument names - (,powershell-function-switch-names-regexp - (0 font-lock-reference-face) - (1 (cons font-lock-type-face '(underline)) t t) - (2 (cons font-lock-type-face '(underline)) t t)) - ;; function names - (,powershell-function-names-regex - (0 font-lock-function-name-face) - (1 (cons font-lock-type-face '(underline)) t t)))) - "Keywords for the maximum level of font-locking in PowerShell mode.") - - -(defun powershell-setup-font-lock () - "Set up the buffer local value for `font-lock-defaults'." - ;; I use font-lock-syntactic-keywords to set some properties and I - ;; don't want them ignored. - (set (make-local-variable 'parse-sexp-lookup-properties) t) - ;; This is where all the font-lock stuff actually gets set up. Once - ;; font-lock-defaults has its value, setting font-lock-mode true should - ;; cause all your syntax highlighting dreams to come true. - (setq font-lock-defaults - ;; The first value is all the keyword expressions. - '((powershell-font-lock-keywords-1 - powershell-font-lock-keywords-2 - powershell-font-lock-keywords-3) - ;; keywords-only means no strings or comments get fontified - nil - ;; case-fold (t ignores case) - t - ;; syntax-alist nothing special here - nil - ;; syntax-begin - no function defined to move outside syntactic block - nil - ;; font-lock-syntactic-keywords - ;; takes (matcher (match syntax override lexmatch) ...)... - (font-lock-syntactic-keywords - . powershell-font-lock-syntactic-keywords)))) - -(defvar powershell-mode-syntax-table - (let ((powershell-mode-syntax-table (make-syntax-table))) - (modify-syntax-entry ?$ "_" powershell-mode-syntax-table) - (modify-syntax-entry ?: "_" powershell-mode-syntax-table) - (modify-syntax-entry ?- "_" powershell-mode-syntax-table) - (modify-syntax-entry ?^ "_" powershell-mode-syntax-table) - (modify-syntax-entry ?\\ "_" powershell-mode-syntax-table) - (modify-syntax-entry ?\{ "(}" powershell-mode-syntax-table) - (modify-syntax-entry ?\} "){" powershell-mode-syntax-table) - (modify-syntax-entry ?\[ "(]" powershell-mode-syntax-table) - (modify-syntax-entry ?\] ")[" powershell-mode-syntax-table) - (modify-syntax-entry ?\( "()" powershell-mode-syntax-table) - (modify-syntax-entry ?\) ")(" powershell-mode-syntax-table) - (modify-syntax-entry ?` "\\" powershell-mode-syntax-table) - (modify-syntax-entry ?_ "w" powershell-mode-syntax-table) - (modify-syntax-entry ?= "." powershell-mode-syntax-table) - (modify-syntax-entry ?| "." powershell-mode-syntax-table) - (modify-syntax-entry ?+ "." powershell-mode-syntax-table) - (modify-syntax-entry ?* "." powershell-mode-syntax-table) - (modify-syntax-entry ?/ "." powershell-mode-syntax-table) - (modify-syntax-entry ?' "\"" powershell-mode-syntax-table) - (modify-syntax-entry ?# "<" powershell-mode-syntax-table) - powershell-mode-syntax-table) - "Syntax for PowerShell major mode.") - -(defvar powershell-mode-map - (let ((powershell-mode-map (make-keymap))) - ;; (define-key powershell-mode-map "\r" 'powershell-indent-line) - (define-key powershell-mode-map (kbd "M-\"") - 'powershell-doublequote-selection) - (define-key powershell-mode-map (kbd "M-'") 'powershell-quote-selection) - (define-key powershell-mode-map (kbd "C-'") 'powershell-unquote-selection) - (define-key powershell-mode-map (kbd "C-\"") 'powershell-unquote-selection) - (define-key powershell-mode-map (kbd "M-`") 'powershell-escape-selection) - (define-key powershell-mode-map (kbd "C-$") - 'powershell-dollarparen-selection) - powershell-mode-map) - "Keymap for PS major mode.") - -(defun powershell-setup-menu () - "Add a menu of PowerShell specific functions to the menu bar." - (define-key (current-local-map) [menu-bar powershell-menu] - (cons "PowerShell" (make-sparse-keymap "PowerShell"))) - (define-key (current-local-map) [menu-bar powershell-menu doublequote] - '(menu-item "DoubleQuote Selection" powershell-doublequote-selection - :key-sequence(kbd "M-\"") - :help - "DoubleQuotes the selection escaping embedded double quotes")) - (define-key (current-local-map) [menu-bar powershell-menu quote] - '(menu-item "SingleQuote Selection" powershell-quote-selection - :key-sequence (kbd "M-'") - :help - "SingleQuotes the selection escaping embedded single quotes")) - (define-key (current-local-map) [menu-bar powershell-menu unquote] - '(menu-item "UnQuote Selection" powershell-unquote-selection - :key-sequence (kbd "C-'") - :help "Un-Quotes the selection un-escaping any escaped quotes")) - (define-key (current-local-map) [menu-bar powershell-menu escape] - '(menu-item "Escape Selection" powershell-escape-selection - :key-sequence (kbd "M-`") - :help (concat "Escapes variables in the selection" - " and extends existing escapes."))) - (define-key (current-local-map) [menu-bar powershell-menu dollarparen] - '(menu-item "DollarParen Selection" powershell-dollarparen-selection - :key-sequence (kbd "C-$") - :help "Wraps the selection in $()"))) - - -;;; Eldoc support - -(defcustom powershell-eldoc-def-files nil - "List of files containing function help strings used by function `eldoc-mode'. -These are the strings function `eldoc-mode' displays as help for -functions near point. The format of the file must be exactly as -follows or who knows what happens. - - (set (intern \"\" powershell-eldoc-obarray) \"\") - (set (intern \"\" powershell-eldoc-obarray) \"\") -... - -Where is the name of the function to which applies. - is the string to display when point is near ." - :type '(repeat string) - :group 'powershell) - -(defvar powershell-eldoc-obarray () - "Array for file entries by the function `eldoc'. -`powershell-eldoc-def-files' entries are added into this array.") - -(defun powershell-eldoc-function () - "Return a documentation string appropriate for the current context or nil." - (let ((word (thing-at-point 'symbol))) - (if word - (eval (intern-soft word powershell-eldoc-obarray))))) - -(defun powershell-setup-eldoc () - "Load the function documentation for use with eldoc." - (when (not (null powershell-eldoc-def-files)) - (set (make-local-variable 'eldoc-documentation-function) - 'powershell-eldoc-function) - (unless (vectorp powershell-eldoc-obarray) - (setq powershell-eldoc-obarray (make-vector 41 0)) - (condition-case var (mapc 'load powershell-eldoc-def-files) - (error (message "*** powershell-setup-eldoc ERROR *** %s" var)))))) -;;; Note: You can create quite a bit of help with these commands: -;; -;; function Get-Signature ($Cmd) { -;; if ($Cmd -is [Management.Automation.PSMethod]) { -;; $List = @($Cmd)} -;; elseif ($Cmd -isnot [string]) { -;; throw ("Get-Signature {|}`n" + -;; "'$Cmd' is not a method or command")} -;; else {$List = @(Get-Command $Cmd -ErrorAction SilentlyContinue)} -;; if (!$List[0] ) { -;; throw "Command '$Cmd' not found"} -;; foreach ($O in $List) { -;; switch -regex ($O.GetType().Name) { -;; 'AliasInfo' { -;; Get-Signature ($O.Definition)} -;; '(Cmdlet|ExternalScript)Info' { -;; $O.Definition} # not sure what to do with ExternalScript -;; 'F(unction|ilter)Info'{ -;; if ($O.Definition -match '^param *\(') { -;; $t = [Management.Automation.PSParser]::tokenize($O.Definition, -;; [ref]$null) -;; $c = 1;$i = 1 -;; while($c -and $i++ -lt $t.count) { -;; switch ($t[$i].Type.ToString()) { -;; GroupStart {$c++} -;; GroupEnd {$c--}}} -;; $O.Definition.substring(0,$t[$i].start + 1)} #needs parsing -;; else {$O.Name}} -;; 'PSMethod' { -;; foreach ($t in @($O.OverloadDefinitions)) { -;; while (($b=$t.IndexOf('`1[[')) -ge 0) { -;; $t=$t.remove($b,$t.IndexOf(']]')-$b+2)} -;; $t}}}}} -;; get-command| -;; ?{$_.CommandType -ne 'Alias' -and $_.Name -notlike '*:'}| -;; %{$_.Name}| -;; sort| -;; %{("(set (intern ""$($_.Replace('\','\\'))"" powershell-eldoc-obarray)" + -;; " ""$(Get-Signature $_|%{$_.Replace('\','\\').Replace('"','\"')})"")" -;; ).Replace("`r`n"")",""")")} > .\powershell-eldoc.el - - -(defvar powershell-imenu-expression - `(("Functions" ,(concat "function " powershell-function-names-regex) 2) - ("Filters" ,(concat "filter " powershell-function-names-regex) 2) - ("Top variables" - , (concat "^\\(" powershell-object-types-regexp "\\)?\\(" - powershell-variables-regexp "\\)\\s-*=") - 2)) - "List of regexps matching important expressions, for speebar & imenu.") - -(defun powershell-setup-imenu () - "Install `powershell-imenu-expression'." - (when (require 'imenu nil t) - ;; imenu doc says these are buffer-local by default - (setq imenu-generic-expression powershell-imenu-expression) - (setq imenu-case-fold-search nil) - (imenu-add-menubar-index))) - -(defun powershell-setup-speedbar () - "Install `speedbar-add-supported-extension'." - (when (require 'speedbar nil t) - (speedbar-add-supported-extension ".ps1?"))) - -;; A better command would be something like "powershell.exe -NoLogo -;; -NonInteractive -Command & (buffer-file-name)". But it will just -;; sit there waiting... The following will only work when .ps1 files -;; are associated with powershell.exe. And if they don't contain spaces. -(defvar powershell-compile-command - '(buffer-file-name) - "Default command used to invoke a powershell script.") - -;; The column number will be off whenever tabs are used. Since this is -;; the default in this mode, we will not capture the column number. -(setq compilation-error-regexp-alist - (cons '("At \\(.*\\):\\([0-9]+\\) char:\\([0-9]+\\)" 1 2) - compilation-error-regexp-alist)) - - -(add-hook 'powershell-mode-hook #'imenu-add-menubar-index) - -;;;###autoload -(define-derived-mode powershell-mode prog-mode "PS" - "Major mode for editing PowerShell scripts. - -\\{powershell-mode-map} -Entry to this mode calls the value of `powershell-mode-hook' if -that value is non-nil." - (powershell-setup-font-lock) - (setq-local indent-line-function 'powershell-indent-line) - (setq-local compile-command powershell-compile-command) - (setq-local comment-start "#") - (setq-local comment-start-skip "#+\\s*") - (setq-local parse-sexp-ignore-comments t) - ;; Support electric-pair-mode - (setq-local electric-indent-chars - (append "{}():;," electric-indent-chars)) - (powershell-setup-imenu) - (powershell-setup-speedbar) - (powershell-setup-menu) - (powershell-setup-eldoc)) - -;;; PowerShell inferior mode - -;;; Code: -(defcustom powershell-location-of-exe - (or (executable-find "powershell") (executable-find "pwsh")) - "A string, providing the location of the powershell executable." - :group 'powershell) - -(defcustom powershell-log-level 3 - "The current log level for powershell internal operations. -0 = NONE, 1 = Info, 2 = VERBOSE, 3 = DEBUG." - :group 'powershell) - -(defcustom powershell-squish-results-of-silent-commands t -"The function `powershell-invoke-command-silently' returns the results -of a command in a string. PowerShell by default, inserts newlines when -the output exceeds the configured width of the powershell virtual -window. In some cases callers might want to get the results with the -newlines and formatting removed. Set this to true, to do that." -:group 'powershell) - -(defvar powershell-prompt-regex "PS [^#$%>]+> " - "Regexp to match the powershell prompt. -powershell.el uses this regex to determine when a command has -completed. Therefore, you need to set this appropriately if you -explicitly change the prompt function in powershell. Any value -should include a trailing space, if the powershell prompt uses a -trailing space, but should not include a trailing newline. - -The default value will match the default PowerShell prompt.") - -(defvar powershell-command-reply nil - "The reply of powershell commands. -This is retained for housekeeping purposes.") - -(defvar powershell--max-window-width 0 - "The maximum width of a powershell window. -You shouldn't need to ever set this. It gets set automatically, -once, when the powershell starts up.") - -(defvar powershell-command-timeout-seconds 12 - "The timeout for a powershell command. -powershell.el will wait this long before giving up.") - -(defvar powershell--need-rawui-resize t - "No need to fuss with this. It's intended for internal use -only. It gets set when powershell needs to be informed that -emacs has resized its window.") - -(defconst powershell--find-max-window-width-command - (concat - "function _Emacs_GetMaxPhsWindowSize" - " {" - " $rawui = (Get-Host).UI.RawUI;" - " $mpws_exists = ($rawui | Get-Member | Where-Object" - " {$_.Name -eq \"MaxPhysicalWindowSize\"});" - " if ($mpws_exists -eq $null) {" - " 210" - " } else {" - " $rawui.MaxPhysicalWindowSize.Width" - " }" - " };" - " _Emacs_GetMaxPhsWindowSize") - "The powershell logic to determine the max physical window width.") - -(defconst powershell--set-window-width-fn-name "_Emacs_SetWindowWidth" - "The name of the function this mode defines in PowerShell to -set the window width. Intended for internal use only.") - -(defconst powershell--text-of-set-window-width-ps-function - ;; see - ;; http://blogs.msdn.com/lior/archive/2009/05/27/ResizePowerShellConsoleWindow.aspx - ;; - ;; When making the console window narrower, you mus set the window - ;; size first. When making the console window wider, you must set the - ;; buffer size first. - - (concat "function " powershell--set-window-width-fn-name - "([string] $pswidth)" - " {" - " $rawui = (Get-Host).UI.RawUI;" - " $bufsize = $rawui.BufferSize;" - " $winsize = $rawui.WindowSize;" - " $cwidth = $winsize.Width;" - " $winsize.Width = $pswidth;" - " $bufsize.Width = $pswidth;" - " if ($cwidth -lt $pswidth) {" - " $rawui.BufferSize = $bufsize;" - " $rawui.WindowSize = $winsize;" - " }" - " elseif ($cwidth -gt $pswidth) {" - " $rawui.WindowSize = $winsize;" - " $rawui.BufferSize = $bufsize;" - " };" - " Set-Variable -name rawui -value $null;" - " Set-Variable -name winsize -value $null;" - " Set-Variable -name bufsize -value $null;" - " Set-Variable -name cwidth -value $null;" - " }") - - "The text of the powershell function that will be used at runtime to -set the width of the virtual Window in PowerShell, as the Emacs window -gets resized.") - -(defun powershell-log (level text &rest args) - "Log a message at level LEVEL. -If LEVEL is higher than `powershell-log-level', the message is -ignored. Otherwise, it is printed using `message'. -TEXT is a format control string, and the remaining arguments ARGS -are the string substitutions (see `format')." - (if (<= level powershell-log-level) - (let* ((msg (apply 'format text args))) - (message "%s" msg)))) - -;; (defun dino-powershell-complete (arg) -;; "do powershell completion on the given STRING. Pop up a buffer -;; with the completion list." -;; (interactive -;; (list (read-no-blanks-input "\ -;; Stub to complete: "))) - -;; (let ((proc -;; (get-buffer-process (current-buffer)))) -;; (comint-proc-query proc (concat "Get-Command " arg "*\n")) -;; ) -;; ) - -;; (defun dino-powershell-cmd-complete () -;; "try to get powershell completion to work." -;; (interactive) -;; (let ((proc -;; (get-buffer-process (current-buffer)))) -;; ;; (comint-proc-query proc "Get-a\t") -;; ;; (comint-simple-send proc "Get-a\t") -;; (comint-send-string proc "Get-a\t\n") -;; ;; (process-send-eof) -;; ) -;; ) - -(defun powershell--define-set-window-width-function (proc) - "Sends a function definition to the PowerShell instance -identified by PROC. The function sets the window width of the -PowerShell virtual window. Later, the function will be called -when the width of the emacs window changes." - (if proc - (progn - ;;process-send-string - (comint-simple-send - proc - powershell--text-of-set-window-width-ps-function)))) - -(defun powershell--get-max-window-width (buffer-name) - "Gets the maximum width of the virtual window for PowerShell running -in the buffer with name BUFFER-NAME. - -In PowerShell 1.0, the maximum WindowSize.Width for -PowerShell is 210, hardcoded, I believe. In PowerShell 2.0, the max -windowsize.Width is provided in the RawUI.MaxPhysicalWindowSize -property. - -This function does the right thing, and sets the buffer-local -`powershell--max-window-width' variable with the correct value." - (let ((proc (get-buffer-process buffer-name))) - - (if proc - (with-current-buffer buffer-name - (powershell-invoke-command-silently - proc - powershell--find-max-window-width-command - 0.90) - - ;; store the retrieved width - (setq powershell--max-window-width - (if (and (not (null powershell-command-reply)) - (string-match - "\\([1-9][0-9]*\\)[ \t\f\v\n]+" - powershell-command-reply)) - (string-to-number (match-string 1 powershell-command-reply)) - 200)))))) ;; could go to 210, but let's use 200 to be safe - -(defun powershell--set-window-width (proc) - "Run the PowerShell function that sets the RawUI width -appropriately for a PowerShell shell. - -This is necessary to get powershell to do the right thing, as far -as text formatting, when the emacs window gets resized. - -The function gets defined in powershell upon powershell startup." - (let ((ps-width - (number-to-string (min powershell--max-window-width (window-width))))) - (progn - ;;(process-send-string - (comint-simple-send - proc - (concat powershell--set-window-width-fn-name - "('" ps-width "')"))))) - -;;;###autoload -(defun powershell (&optional buffer prompt-string) - "Run an inferior PowerShell. -If BUFFER is non-nil, use it to hold the powershell -process. Defaults to *PowerShell*. - -Interactively, a prefix arg means to prompt for BUFFER. - -If BUFFER exists but the shell process is not running, it makes a -new shell. - -If BUFFER exists and the shell process is running, just switch to -BUFFER. - -If PROMPT-STRING is non-nil, sets the prompt to the given value. - -See the help for `shell' for more details. \(Type -\\[describe-mode] in the shell buffer for a list of commands.)" - (interactive - (list - (and current-prefix-arg - (read-buffer "Shell buffer: " - (generate-new-buffer-name "*PowerShell*"))))) - - (setq buffer (get-buffer-create (or buffer "*PowerShell*"))) - (powershell-log 1 "powershell starting up...in buffer %s" (buffer-name buffer)) - (let ((explicit-shell-file-name (if (eq system-type 'cygwin) - (cygwin-convert-file-name-from-windows powershell-location-of-exe) - powershell-location-of-exe))) - ;; set arguments for the powershell exe. - ;; Does this need to be tunable? - - (shell buffer)) - - ;; (powershell--get-max-window-width "*PowerShell*") - ;; (powershell-invoke-command-silently (get-buffer-process "*csdeshell*") - ;; "[Ionic.Csde.Utilities]::Version()" 2.9) - - ;; (comint-simple-send (get-buffer-process "*csdeshell*") "prompt\n") - - (let ((proc (get-buffer-process buffer))) - - (make-local-variable 'powershell-prompt-regex) - (make-local-variable 'powershell-command-reply) - (make-local-variable 'powershell--max-window-width) - (make-local-variable 'powershell-command-timeout-seconds) - (make-local-variable 'powershell-squish-results-of-silent-commands) - (make-local-variable 'powershell--need-rawui-resize) - (make-local-variable 'comint-prompt-read-only) - - ;; disallow backspace over the prompt: - (setq comint-prompt-read-only t) - - ;; We need to tell powershell how wide the emacs window is, because - ;; powershell pads its output to the width it thinks its window is. - ;; - ;; The way it's done: every time the width of the emacs window changes, we - ;; set a flag. Then, before sending a powershell command that is - ;; typed into the buffer, to the actual powershell process, we check - ;; that flag. If it is set, we resize the powershell window appropriately, - ;; before sending the command. - - ;; If we didn't do this, powershell output would get wrapped at a - ;; column width that would be different than the emacs buffer width, - ;; and everything would look ugly. - - ;; get the maximum width for powershell - can't go beyond this - (powershell--get-max-window-width buffer) - - ;; define the function for use within powershell to resize the window - (powershell--define-set-window-width-function proc) - - ;; add the hook that sets the flag - (add-hook 'window-size-change-functions - '(lambda (&optional x) - (setq powershell--need-rawui-resize t))) - - ;; set the flag so we resize properly the first time. - (setq powershell--need-rawui-resize t) - - (if prompt-string - (progn - ;; This sets up a prompt for the PowerShell. The prompt is - ;; important because later, after sending a command to the - ;; shell, the scanning logic that grabs the output looks for - ;; the prompt string to determine that the output is complete. - (comint-simple-send - proc - (concat "function prompt { '" prompt-string "' }")) - - (setq powershell-prompt-regex prompt-string))) - - ;; hook the kill-buffer action so we can kill the inferior process? - (add-hook 'kill-buffer-hook 'powershell-delete-process) - - ;; wrap the comint-input-sender with a PS version - ;; must do this after launching the shell! - (make-local-variable 'comint-input-sender) - (setq comint-input-sender 'powershell-simple-send) - - ;; set a preoutput filter for powershell. This will trim newlines - ;; after the prompt. - (add-hook 'comint-preoutput-filter-functions - 'powershell-preoutput-filter-for-prompt) - - ;; send a carriage-return (get the prompt) - (comint-send-input) - (accept-process-output proc)) - - ;; The launch hooks for powershell has not (yet?) been implemented - ;;(run-hooks 'powershell-launch-hook) - - ;; return the buffer created - buffer) - -;; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- -;; Using powershell on emacs23, I get an error: -;; -;; ansi-color-process-output: Marker does not point anywhere -;; -;; Here's what's happening. -;; -;; In order to be able to read the output from powershell, this shell -;; starts powershell.exe in "interactive mode", using the -i -;; option. This which has the curious side-effect of turning off the -;; prompt in powershell. Normally powershell will return its results, -;; then emit a prompt to indicate that it is ready for more input. In -;; interactive mode it doesn't emit the prompt. To work around this, -;; this code (powershell.el) sends an explicit `prompt` command after -;; sending any user-entered command to powershell. This tells powershell -;; to explicitly return the prompt, after the results of the prior -;; command. The prompt then shows up in the powershell buffer. Lovely. -;; -;; But, `ansi-color-apply-on-region` gets called after every command -;; gets sent to powershell. It gets called with args `(begin end)`, -;; which are both markers. Turns out the very first time this fn is -;; called, the position for the begin marker is nil. -;; -;; `ansi-color-apply-on-region` calls `(goto-char begin)` (effectively), -;; and when the position on the marker is nil, the call errors with -;; "Marker does not point anywhere." -;; -;; The following advice suppresses the call to -;; `ansi-color-apply-on-region` when the begin marker points -;; nowhere. -(defadvice ansi-color-apply-on-region (around - powershell-throttle-ansi-colorizing - (begin end) - compile) - (progn - (let ((start-pos (marker-position begin))) - (cond - (start-pos - (progn - ad-do-it)))))) - -(defun powershell--silent-cmd-filter (process result) -"A process filter that captures output from a shell and stores it -to `powershell-command-reply', rather than allowing the output to -be displayed in the shell buffer. - -This function is intended for internal use only." - (let ((end-of-result - (string-match (concat ".*\n\\(" powershell-prompt-regex "\\)[ \n]*\\'") - result))) - (if (and end-of-result (numberp end-of-result)) - - (progn - ;; Store everything except the follow-on prompt. - ;; The result probably includes a final newline! - (setq result (substring result 0 (match-beginning 1))) - - (if powershell-squish-results-of-silent-commands - (setq result - (replace-regexp-in-string "\n" "" result))) - - (setq powershell-command-reply - (concat powershell-command-reply result))) - - (progn - (if powershell-squish-results-of-silent-commands - (setq result - (replace-regexp-in-string "\n" "" result))) - - (setq powershell-command-reply - (concat powershell-command-reply result)) - - ;; recurse. For very very long output, the recursion can - ;; cause stack overflow. Careful! - (accept-process-output process powershell-command-timeout-seconds))))) - -(defun powershell-invoke-command-silently (proc command - &optional timeout-seconds) - "In the PowerShell instance PROC, invoke COMMAND silently. -Neither the COMMAND is echoed nor the results to the associated -buffer. Use TIMEOUT-SECONDS as the timeout, waiting for a -response. The COMMAND should be a string, and need not be -terminated with a newline. - -This is helpful when, for example, doing setup work. Or other sneaky -stuff, such as resetting the size of the PowerShell virtual window. - -Returns the result of the command, a string, without the follow-on -command prompt. The result will probably end in a newline. This result -is also stored in the buffer-local variable `powershell-command-reply'. - -In some cases the result can be prepended with the command prompt, as -when, for example, several commands have been send in succession and the -results of the prior command were not fully processed by the application. - -If a PowerShell buffer is not the current buffer, this function -should be invoked within a call to `with-current-buffer' or -similar in order to insure that the buffer-local values of -`powershell-command-reply', `powershell-prompt-regex', and -`powershell-command-timeout-seconds' are used. - -Example: - - (with-current-buffer powershell-buffer-name - (powershell-invoke-command-silently - proc - command-string - 1.90))" - - (let ((old-timeout powershell-command-timeout-seconds) - (original-filter (process-filter proc))) - - (setq powershell-command-reply nil) - - (if timeout-seconds - (setq powershell-command-timeout-seconds timeout-seconds)) - - (set-process-filter proc 'powershell--silent-cmd-filter) - - ;; Send the command plus the "prompt" command. The filter - ;; will know the command is finished when it sees the command - ;; prompt. - ;; - (process-send-string proc (concat command "\nprompt\n")) - - (accept-process-output proc powershell-command-timeout-seconds) - - ;; output of the command is now available in powershell-command-reply - - ;; Trim prompt from the beginning of the output. - ;; this can happen for the first command through - ;; the shell. I think there's a race condition. - (if (and powershell-command-reply - (string-match (concat "^" powershell-prompt-regex "\\(.*\\)\\'") - powershell-command-reply)) - (setq powershell-command-reply - (substring powershell-command-reply - (match-beginning 1) - (match-end 1)))) - - ;; restore the original filter - (set-process-filter proc original-filter) - - ;; restore the original timeout - (if timeout-seconds - (setq powershell-command-timeout-seconds old-timeout)) - - ;; the result: - powershell-command-reply)) - -(defun powershell-delete-process (&optional proc) - "Delete the current buffer process or PROC." - (or proc - (setq proc (get-buffer-process (current-buffer)))) - (and (processp proc) - (delete-process proc))) - -(defun powershell-preoutput-filter-for-prompt (string) - "Trim the newline from STRING, the prompt that we get back from -powershell. This fn is set into the preoutput filters, so the -newline is trimmed before being put into the output buffer." - (if (string-match (concat powershell-prompt-regex "\n\\'") string) - (substring string 0 -1) ;; remove newline - string)) - -(defun powershell-simple-send (proc string) - "Override of the comint-simple-send function, with logic -specifically designed for powershell. This just sends STRING, -plus the prompt command. - -When running as an inferior shell with stdin/stdout redirected, -powershell is in noninteractive mode. This means no prompts get -emitted when a PS command completes. This makes it difficult for -a comint mode to determine when the command has completed. -Therefore, we send an explicit request for the prompt, after -sending the actual (primary) command. When the primary command -completes, PowerShell then responds to the \"prompt\" command, -and emits the prompt. - -This insures we get and display the prompt." - ;; Tell PowerShell to resize its virtual window, if necessary. We do - ;; this by calling a resize function in the PowerShell, before sending - ;; the user-entered command to the shell. - ;; - ;; PowerShell keeps track of its \"console\", and formats its output - ;; according to the width it thinks it is using. This is true even when - ;; powershell is invoked with the - argument, which tells it to use - ;; stdin as input. - - ;; Therefore, if the user has resized the emacs window since the last - ;; PowerShell command, we need to tell PowerShell to change the size - ;; of its virtual window. Calling that function does not change the - ;; size of a window that is visible on screen - it only changes the - ;; size of the virtual window that PowerShell thinks it is using. We - ;; do that by invoking the PowerShell function that this module - ;; defined for that purpose. - ;; - (if powershell--need-rawui-resize - (progn - (powershell--set-window-width proc) - (setq powershell--need-rawui-resize nil))) - (comint-simple-send proc (concat string "\n")) - (comint-simple-send proc "prompt\n")) - -;; Notes on TAB for completion. -;; ------------------------------------------------------- -;; Emacs calls comint-dynamic-complete when the TAB key is pressed in a shell. -;; This is set up in shell-mode-map. -;; -;; comint-dynamic-complete calls the functions in -;; comint-dynamic-complete-functions, until one of them returns -;; non-nil. -;; -;; comint-dynamic-complete-functions is a good thing to set in the mode hook. -;; -;; The default value for that var in a powershell shell is: -;; (comint-replace-by-expanded-history -;; shell-dynamic-complete-environment-variable -;; shell-dynamic-complete-command -;; shell-replace-by-expanded-directory -;; comint-dynamic-complete-filename) - -;; (defun powershell-dynamic-complete-command () -;; "Dynamically complete the command at point. This function is -;; similar to `comint-dynamic-complete-filename', except that it -;; searches the commands from powershell and then the `exec-path' -;; (minus the trailing Emacs library path) for completion candidates. - -;; Completion is dependent on the value of -;; `shell-completion-execonly', plus those that effect file -;; completion. See `powershell-dynamic-complete-as-command'. - -;; Returns t if successful." -;; (interactive) -;; (let ((filename (comint-match-partial-filename))) -;; (if (and filename -;; (save-match-data (not (string-match "[~/]" filename))) -;; (eq (match-beginning 0) -;; (save-excursion (shell-backward-command 1) (point)))) -;; (prog2 (message "Completing command name...") -;; (powershell-dynamic-complete-as-command))))) - -;; (defun powershell-dynamic-complete-as-command () -;; "Dynamically complete at point as a command. -;; See `shell-dynamic-complete-filename'. Returns t if successful." -;; (let* ((filename (or (comint-match-partial-filename) "")) -;; (filenondir (file-name-nondirectory filename)) -;; (path-dirs (cdr (reverse exec-path))) -;; (cwd (file-name-as-directory (expand-file-name default-directory))) -;; (ignored-extensions -;; (and comint-completion-fignore -;; (mapconcat (function (lambda (x) (concat (regexp-quote x) "$"))) -;; comint-completion-fignore "\\|"))) -;; (dir "") (comps-in-dir ()) -;; (file "") (abs-file-name "") (completions ())) - -;; ;; Go thru each cmd in powershell's lexicon, finding completions. - -;; ;; Go thru each dir in the search path, finding completions. -;; (while path-dirs -;; (setq dir (file-name-as-directory (comint-directory (or (car path-dirs) "."))) -;; comps-in-dir (and (file-accessible-directory-p dir) -;; (file-name-all-completions filenondir dir))) -;; ;; Go thru each completion found, to see whether it should be used. -;; (while comps-in-dir -;; (setq file (car comps-in-dir) -;; abs-file-name (concat dir file)) -;; (if (and (not (member file completions)) -;; (not (and ignored-extensions -;; (string-match ignored-extensions file))) -;; (or (string-equal dir cwd) -;; (not (file-directory-p abs-file-name))) -;; (or (null shell-completion-execonly) -;; (file-executable-p abs-file-name))) -;; (setq completions (cons file completions))) -;; (setq comps-in-dir (cdr comps-in-dir))) -;; (setq path-dirs (cdr path-dirs))) -;; ;; OK, we've got a list of completions. -;; (let ((success (let ((comint-completion-addsuffix nil)) -;; (comint-dynamic-simple-complete filenondir completions)))) -;; (if (and (memq success '(sole shortest)) comint-completion-addsuffix -;; (not (file-directory-p (comint-match-partial-filename)))) -;; (insert " ")) -;; success))) - -(provide 'powershell) - -;;; powershell.el ends here diff --git a/elpa/powershell-20190421.2038/powershell.elc b/elpa/powershell-20190421.2038/powershell.elc deleted file mode 100644 index a2494db6fd6ad002e07be1148d59b664453157c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33635 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 - -;; Author: Bozhidar Batsov -;; URL: https://github.com/bbatsov/projectile -;; Package-Version: 20200329.1908 -;; Keywords: project, convenience -;; Version: 2.2.0-snapshot -;; Package-Requires: ((emacs "25.1") (pkg-info "0.4")) - -;; This file is NOT part of GNU Emacs. - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. - -;;; Commentary: -;; -;; This library provides easy project management and navigation. The -;; concept of a project is pretty basic - just a folder containing -;; special file. Currently git, mercurial and bazaar repos are -;; considered projects by default. If you want to mark a folder -;; manually as a project just create an empty .projectile file in -;; it. See the README for more details. -;; -;;; Code: - -(require 'cl-lib) -(require 'thingatpt) -(require 'ibuffer) -(require 'ibuf-ext) -(require 'compile) -(require 'grep) -(eval-when-compile - (require 'find-dired) - (require 'subr-x)) - -(eval-when-compile - (defvar ag-ignore-list) - (defvar ggtags-completion-table) - (defvar tags-completion-table) - (defvar tags-loop-scan) - (defvar tags-loop-operate) - (defvar eshell-buffer-name) - (defvar explicit-shell-file-name)) - -(declare-function tags-completion-table "etags") -(declare-function make-term "term") -(declare-function term-mode "term") -(declare-function term-char-mode "term") -(declare-function eshell-search-path "esh-ext") -(declare-function vc-dir "vc-dir") -(declare-function vc-dir-busy "vc-dir") -(declare-function string-trim "subr-x") -(declare-function fileloop-continue "fileloop") -(declare-function fileloop-initialize-replace "fileloop") - -(declare-function ggtags-ensure-project "ext:ggtags") -(declare-function ggtags-update-tags "ext:ggtags") -(declare-function pkg-info-version-info "ext:pkg-info") -(declare-function ripgrep-regexp "ext:ripgrep") -(declare-function vterm "ext:vterm") -(declare-function vterm-send-return "ext:vterm") -(declare-function vterm-send-string "ext:vterm") - -(defvar grep-files-aliases) -(defvar grep-find-ignored-directories) -(defvar grep-find-ignored-files) - - -;;; Customization -(defgroup projectile nil - "Manage and navigate projects easily." - :group 'tools - :group 'convenience - :link '(url-link :tag "GitHub" "https://github.com/bbatsov/projectile") - :link '(url-link :tag "Online Manual" "https://docs.projectile.mx/") - :link '(emacs-commentary-link :tag "Commentary" "projectile")) - -(defcustom projectile-indexing-method (if (eq system-type 'windows-nt) 'native 'alien) - "Specifies the indexing method used by Projectile. - -There are three indexing methods - native, hybrid and alien. - -The native method is implemented in Emacs Lisp (therefore it is -native to Emacs). Its advantage is that it is portable and will -work everywhere that Emacs does. Its disadvantage is that it is a -bit slow (especially for large projects). Generally it's a good -idea to pair the native indexing method with caching. - -The hybrid indexing method uses external tools (e.g. git, find, -etc) to speed up the indexing process. Still, the files will be -post-processed by Projectile for sorting/filtering purposes. -In this sense that approach is a hybrid between native indexing -and alien indexing. - -The alien indexing method optimizes to the limit the speed -of the hybrid indexing method. This means that Projectile will -not do any processing of the files returned by the external -commands and you're going to get the maximum performance -possible. This behaviour makes a lot of sense for most people, -as they'd typically be putting ignores in their VCS config and -won't care about any additional ignores/unignores/sorting that -Projectile might also provide. - -The disadvantage of the hybrid and alien methods is that they are not well -supported on Windows systems. That's why by default alien indexing is the -default on all operating systems, except Windows." - :group 'projectile - :type '(radio - (const :tag "Native" native) - (const :tag "Hybrid" hybrid) - (const :tag "Alien" alien))) - -(defcustom projectile-enable-caching (eq projectile-indexing-method 'native) - "When t enables project files caching. - -Project caching is automatically enabled by default if you're -using the native indexing method." - :group 'projectile - :type 'boolean) - -(defcustom projectile-kill-buffers-filter 'kill-all - "Determine which buffers are killed by `projectile-kill-buffers'. - -When the kill-all option is selected, kills each buffer. - -When the kill-only-files option is selected, kill only the buffer -associated to a file. - -Otherwise, it should be a predicate that takes one argument: the buffer to -be killed." - :group 'projectile - :type '(radio - (const :tag "All project buffers" kill-all) - (const :tag "Project file buffers" kill-only-files) - (function :tag "Predicate"))) - -(defcustom projectile-file-exists-local-cache-expire nil - "Number of seconds before the local file existence cache expires. -Local refers to a file on a local file system. - -A value of nil disables this cache. -See `projectile-file-exists-p' for details." - :group 'projectile - :type '(choice (const :tag "Disabled" nil) - (integer :tag "Seconds"))) - -(defcustom projectile-file-exists-remote-cache-expire (* 5 60) - "Number of seconds before the remote file existence cache expires. -Remote refers to a file on a remote file system such as tramp. - -A value of nil disables this cache. -See `projectile-file-exists-p' for details." - :group 'projectile - :type '(choice (const :tag "Disabled" nil) - (integer :tag "Seconds"))) - -(defcustom projectile-files-cache-expire nil - "Number of seconds before project files list cache expires. - -A value of nil means the cache never expires." - :group 'projectile - :type '(choice (const :tag "Disabled" nil) - (integer :tag "Seconds"))) - -(defcustom projectile-auto-update-cache t - "Wether the cache should automatically be updated when files are opened or deleted." - :group 'projectile - :type 'boolean) - -(defcustom projectile-require-project-root 'prompt - "Require the presence of a project root to operate when true. -When set to 'prompt Projectile will ask you to select a project -directory if you're not in a project. - -When nil Projectile will consider the current directory the project root." - :group 'projectile - :type '(choice (const :tag "No" nil) - (const :tag "Yes" t) - (const :tag "Prompt for project" prompt))) - -(defcustom projectile-completion-system 'ido - "The completion system to be used by Projectile." - :group 'projectile - :type '(radio - (const :tag "Ido" ido) - (const :tag "Helm" helm) - (const :tag "Ivy" ivy) - (const :tag "Default" default) - (function :tag "Custom function"))) - -(defcustom projectile-keymap-prefix nil - "Projectile keymap prefix." - :group 'projectile - :type 'string) - -(make-obsolete-variable 'projectile-keymap-prefix "Use (define-key projectile-mode-map (kbd ...) 'projectile-command-map) instead." "2.0.0") - -(defcustom projectile-cache-file - (expand-file-name "projectile.cache" user-emacs-directory) - "The name of Projectile's cache file." - :group 'projectile - :type 'string) - -(defcustom projectile-tags-file-name "TAGS" - "The tags filename Projectile's going to use." - :group 'projectile - :type 'string) - -(defcustom projectile-tags-command "ctags -Re -f \"%s\" %s \"%s\"" - "The command Projectile's going to use to generate a TAGS file." - :group 'projectile - :type 'string) - -(defcustom projectile-tags-backend 'auto - "The tag backend that Projectile should use. - -If set to 'auto', `projectile-find-tag' will automatically choose -which backend to use. Preference order is ggtags -> xref --> etags-select -> `find-tag'. Variable can also be set to specify which -backend to use. If selected backend is unavailable, fall back to -`find-tag'. - -If this variable is set to 'auto' and ggtags is available, or if -set to 'ggtags', then ggtags will be used for -`projectile-regenerate-tags'. For all other settings -`projectile-tags-command' will be used." - :group 'projectile - :type '(radio - (const :tag "auto" auto) - (const :tag "xref" xref) - (const :tag "ggtags" ggtags) - (const :tag "etags" etags-select) - (const :tag "standard" find-tag)) - :package-version '(projectile . "0.14.0")) - -(defcustom projectile-sort-order 'default - "The sort order used for a project's files. - -Note that files aren't sorted if `projectile-indexing-method' -is set to 'alien'." - :group 'projectile - :type '(radio - (const :tag "Default (no sorting)" default) - (const :tag "Recently opened files" recentf) - (const :tag "Recently active buffers, then recently opened files" recently-active) - (const :tag "Access time (atime)" access-time) - (const :tag "Modification time (mtime)" modification-time))) - -(defcustom projectile-verbose t - "Echo messages that are not errors." - :group 'projectile - :type 'boolean) - -(defcustom projectile-buffers-filter-function nil - "A function used to filter the buffers in `projectile-project-buffers'. - -The function should accept and return a list of Emacs buffers. -Two example filter functions are shipped by default - -`projectile-buffers-with-file' and -`projectile-buffers-with-file-or-process'." - :group 'projectile - :type 'function) - -(defcustom projectile-project-name nil - "If this value is non-nil, it will be used as project name. - -It has precedence over function `projectile-project-name-function'." - :group 'projectile - :type 'string - :package-version '(projectile . "0.14.0")) - -(defcustom projectile-project-name-function 'projectile-default-project-name - "A function that receives the project-root and returns the project name. - -If variable `projectile-project-name' is non-nil, this function will not be used." - :group 'projectile - :type 'function - :package-version '(projectile . "0.14.0")) - -(defcustom projectile-project-root-files - '("rebar.config" ; Rebar project file - "project.clj" ; Leiningen project file - "build.boot" ; Boot-clj project file - "deps.edn" ; Clojure CLI project file - "SConstruct" ; Scons project file - "pom.xml" ; Maven project file - "build.sbt" ; SBT project file - "gradlew" ; Gradle wrapper script - "build.gradle" ; Gradle project file - ".ensime" ; Ensime configuration file - "Gemfile" ; Bundler file - "requirements.txt" ; Pip file - "setup.py" ; Setuptools file - "pyproject.toml" ; Python project file - "tox.ini" ; Tox file - "composer.json" ; Composer project file - "Cargo.toml" ; Cargo project file - "mix.exs" ; Elixir mix project file - "stack.yaml" ; Haskell's stack tool based project - "info.rkt" ; Racket package description file - "DESCRIPTION" ; R package description file - "TAGS" ; etags/ctags are usually in the root of project - "GTAGS" ; GNU Global tags - "configure.in" ; autoconf old style - "configure.ac" ; autoconf new style - "cscope.out" ; cscope - ) - "A list of files considered to mark the root of a project. -The topmost match has precedence." - :group 'projectile - :type '(repeat string)) - -(defcustom projectile-project-root-files-bottom-up - '(".projectile" ; projectile project marker - ".git" ; Git VCS root dir - ".hg" ; Mercurial VCS root dir - ".fslckout" ; Fossil VCS root dir - "_FOSSIL_" ; Fossil VCS root DB on Windows - ".bzr" ; Bazaar VCS root dir - "_darcs" ; Darcs VCS root dir - ) - "A list of files considered to mark the root of a project. -The bottommost (parentmost) match has precedence." - :group 'projectile - :type '(repeat string)) - -(defcustom projectile-project-root-files-top-down-recurring - '(".svn" ; Svn VCS root dir - "CVS" ; Csv VCS root dir - "Makefile") - "A list of files considered to mark the root of a project. -The search starts at the top and descends down till a directory -that contains a match file but its parent does not. Thus, it's a -bottommost match in the topmost sequence of directories -containing a root file." - :group 'projectile - :type '(repeat string)) - -(defcustom projectile-project-root-files-functions - '(projectile-root-local - projectile-root-bottom-up - projectile-root-top-down - projectile-root-top-down-recurring) - "A list of functions for finding project roots." - :group 'projectile - :type '(repeat function)) - -(defcustom projectile-globally-ignored-files - (list projectile-tags-file-name) - "A list of files globally ignored by projectile." - :group 'projectile - :type '(repeat string)) - -(defcustom projectile-globally-unignored-files nil - "A list of files globally unignored by projectile. - -Regular expressions can be used." - :group 'projectile - :type '(repeat string) - :package-version '(projectile . "0.14.0")) - -(defcustom projectile-globally-ignored-file-suffixes - nil - "A list of file suffixes globally ignored by projectile." - :group 'projectile - :type '(repeat string)) - -(defcustom projectile-globally-ignored-directories - '(".idea" - ".ensime_cache" - ".eunit" - ".git" - ".hg" - ".fslckout" - "_FOSSIL_" - ".bzr" - "_darcs" - ".tox" - ".svn" - ".stack-work") - "A list of directories globally ignored by projectile. - -Regular expressions can be used." - :safe (lambda (x) (not (remq t (mapcar #'stringp x)))) - :group 'projectile - :type '(repeat string)) - -(defcustom projectile-globally-unignored-directories nil - "A list of directories globally unignored by projectile." - :group 'projectile - :type '(repeat string) - :package-version '(projectile . "0.14.0")) - -(defcustom projectile-globally-ignored-modes - '("erc-mode" - "help-mode" - "completion-list-mode" - "Buffer-menu-mode" - "gnus-.*-mode" - "occur-mode") - "A list of regular expressions for major modes ignored by projectile. - -If a buffer is using a given major mode, projectile will ignore -it for functions working with buffers." - :group 'projectile - :type '(repeat string)) - -(defcustom projectile-globally-ignored-buffers nil - "A list of buffer-names ignored by projectile. - -You can use either exact buffer names or regular expressions. -If a buffer is in the list projectile will ignore it for -functions working with buffers." - :group 'projectile - :type '(repeat string) - :package-version '(projectile . "0.12.0")) - -(defcustom projectile-find-file-hook nil - "Hooks run when a file is opened with `projectile-find-file'." - :group 'projectile - :type 'hook) - -(defcustom projectile-find-dir-hook nil - "Hooks run when a directory is opened with `projectile-find-dir'." - :group 'projectile - :type 'hook) - -(defcustom projectile-switch-project-action 'projectile-find-file - "Action invoked after switching projects with `projectile-switch-project'. - -Any function that does not take arguments will do." - :group 'projectile - :type 'function) - -(defcustom projectile-find-dir-includes-top-level nil - "If true, add top-level dir to options offered by `projectile-find-dir'." - :group 'projectile - :type 'boolean) - -(defcustom projectile-use-git-grep nil - "If true, use `vc-git-grep' in git projects." - :group 'projectile - :type 'boolean) - -(defcustom projectile-grep-finished-hook nil - "Hooks run when `projectile-grep' finishes." - :group 'projectile - :type 'hook - :package-version '(projectile . "0.14.0")) - -(defcustom projectile-test-prefix-function 'projectile-test-prefix - "Function to find test files prefix based on PROJECT-TYPE." - :group 'projectile - :type 'function) - -(defcustom projectile-test-suffix-function 'projectile-test-suffix - "Function to find test files suffix based on PROJECT-TYPE." - :group 'projectile - :type 'function) - -(defcustom projectile-related-files-fn-function 'projectile-related-files-fn - "Function to find related files based on PROJECT-TYPE." - :group 'projectile - :type 'function) - -(defcustom projectile-dynamic-mode-line t - "If true, update the mode-line dynamically. -Only file buffers are affected by this, as the update happens via -`find-file-hook'. - -See also `projectile-mode-line-function' and `projectile-update-mode-line'." - :group 'projectile - :type 'boolean - :package-version '(projectile . "2.0.0")) - -(defcustom projectile-mode-line-function 'projectile-default-mode-line - "The function to use to generate project-specific mode-line. -The default function adds the project name and type to the mode-line. -See also `projectile-update-mode-line'." - :group 'projectile - :type 'function - :package-version '(projectile . "2.0.0")) - - -;;; Idle Timer -(defvar projectile-idle-timer nil - "The timer object created when `projectile-enable-idle-timer' is non-nil.") - -(defcustom projectile-idle-timer-seconds 30 - "The idle period to use when `projectile-enable-idle-timer' is non-nil." - :group 'projectile - :type 'number) - -(defcustom projectile-idle-timer-hook '(projectile-regenerate-tags) - "The hook run when `projectile-enable-idle-timer' is non-nil." - :group 'projectile - :type '(repeat symbol)) - -(defcustom projectile-enable-idle-timer nil - "Enables idle timer hook `projectile-idle-timer-functions'. - -When `projectile-enable-idle-timer' is non-nil, the hook -`projectile-idle-timer-hook' is run each time Emacs has been idle -for `projectile-idle-timer-seconds' seconds and we're in a -project." - :group 'projectile - :set (lambda (symbol value) - (set symbol value) - (when projectile-idle-timer - (cancel-timer projectile-idle-timer)) - (setq projectile-idle-timer nil) - (when projectile-enable-idle-timer - (setq projectile-idle-timer (run-with-idle-timer - projectile-idle-timer-seconds t - (lambda () - (when (projectile-project-p) - (run-hooks 'projectile-idle-timer-hook))))))) - :type 'boolean) - -(defvar projectile-projects-cache nil - "A hashmap used to cache project file names to speed up related operations.") - -(defvar projectile-projects-cache-time nil - "A hashmap used to record when we populated `projectile-projects-cache'.") - -(defvar projectile-project-root-cache (make-hash-table :test 'equal) - "Cached value of function `projectile-project-root`.") - -(defvar projectile-project-type-cache (make-hash-table :test 'equal) - "A hashmap used to cache project type to speed up related operations.") - -(defvar projectile-known-projects nil - "List of locations where we have previously seen projects. -The list of projects is ordered by the time they have been accessed. - -See also `projectile-remove-known-project', -`projectile-cleanup-known-projects' and `projectile-clear-known-projects'.") - -(defvar projectile-known-projects-on-file nil - "List of known projects reference point. - -Contains a copy of `projectile-known-projects' when it was last -synchronized with `projectile-known-projects-file'.") - -(defcustom projectile-known-projects-file - (expand-file-name "projectile-bookmarks.eld" - user-emacs-directory) - "Name and location of the Projectile's known projects file." - :group 'projectile - :type 'string) - -(defcustom projectile-ignored-projects nil - "A list of projects not to be added to `projectile-known-projects'." - :group 'projectile - :type '(repeat :tag "Project list" directory) - :package-version '(projectile . "0.11.0")) - -(defcustom projectile-ignored-project-function nil - "Function to decide if a project is added to `projectile-known-projects'. - -Can be either nil, or a function that takes the truename of the -project root as argument and returns non-nil if the project is to -be ignored or nil otherwise. - -This function is only called if the project is not listed in -`projectile-ignored-projects'. - -A suitable candidate would be `file-remote-p' to ignore remote -projects." - :group 'projectile - :type '(choice - (const :tag "Nothing" nil) - (const :tag "Remote files" file-remote-p) - function) - :package-version '(projectile . "0.13.0")) - -(defcustom projectile-track-known-projects-automatically t - "Controls whether Projectile will automatically register known projects. - -When set to nil you'll have always add projects explicitly with -`projectile-add-known-project'." - :group 'projectile - :type 'boolean - :package-version '(projectile . "1.0.0")) - -(defcustom projectile-project-search-path nil - "List of folders where projectile is automatically going to look for projects. -You can think of something like $PATH, but for projects instead of executables. -Examples of such paths might be ~/projects, ~/work, etc." - :group 'projectile - :type 'list - :package-version '(projectile . "1.0.0")) - -(defcustom projectile-git-command "git ls-files -zco --exclude-standard" - "Command used by projectile to get the files in a git project." - :group 'projectile - :type 'string) - -(defcustom projectile-git-submodule-command "git submodule --quiet foreach 'echo $path' | tr '\\n' '\\0'" - "Command used by projectile to list submodules of a given git repository. -Set to nil to disable listing submodules contents." - :group 'projectile - :type 'string) - -(defcustom projectile-git-ignored-command "git ls-files -zcoi --exclude-standard" - "Command used by projectile to get the ignored files in a git project." - :group 'projectile - :type 'string - :package-version '(projectile . "0.14.0")) - -(defcustom projectile-hg-command "hg locate -f -0 -I ." - "Command used by projectile to get the files in a hg project." - :group 'projectile - :type 'string) - -(defcustom projectile-fossil-command (concat "fossil ls | " - (when (string-equal system-type - "windows-nt") - "dos2unix | ") - "tr '\\n' '\\0'") - "Command used by projectile to get the files in a fossil project." - :group 'projectile - :type 'string) - -(defcustom projectile-bzr-command "bzr ls -R --versioned -0" - "Command used by projectile to get the files in a bazaar project." - :group 'projectile - :type 'string) - -(defcustom projectile-darcs-command "darcs show files -0 . " - "Command used by projectile to get the files in a darcs project." - :group 'projectile - :type 'string) - -(defcustom projectile-svn-command "svn list -R . | grep -v '$/' | tr '\\n' '\\0'" - "Command used by projectile to get the files in a svn project." - :group 'projectile - :type 'string) - -(defcustom projectile-generic-command - (if (executable-find "fd") - "fd . -0 --type f --color=never" - "find . -type f -print0") - "Command used by projectile to get the files in a generic project." - :group 'projectile - :type 'string) - -(defcustom projectile-vcs-dirty-state '("edited" "unregistered" "needs-update" "needs-merge" "unlocked-changes" "conflict") - "List of states checked by `projectile-browse-dirty-projects'. -Possible checked states are: -\"edited\", \"unregistered\", \"needs-update\", \"needs-merge\", -\"unlocked-changes\" and \"conflict\", -as defined in `vc.el'." - :group 'projectile - :type '(repeat (string)) - :package-version '(projectile . "1.0.0")) - -(defcustom projectile-other-file-alist - '( ;; handle C/C++ extensions - ("cpp" . ("h" "hpp" "ipp")) - ("ipp" . ("h" "hpp" "cpp")) - ("hpp" . ("h" "ipp" "cpp" "cc")) - ("cxx" . ("h" "hxx" "ixx")) - ("ixx" . ("h" "hxx" "cxx")) - ("hxx" . ("h" "ixx" "cxx")) - ("c" . ("h")) - ("m" . ("h")) - ("mm" . ("h")) - ("h" . ("c" "cc" "cpp" "ipp" "hpp" "cxx" "ixx" "hxx" "m" "mm")) - ("cc" . ("h" "hh" "hpp")) - ("hh" . ("cc")) - - ;; vertex shader and fragment shader extensions in glsl - ("vert" . ("frag")) - ("frag" . ("vert")) - - ;; handle files with no extension - (nil . ("lock" "gpg")) - ("lock" . ("")) - ("gpg" . ("")) - ) - "Alist of extensions for switching to file with the same name, - using other extensions based on the extension of current - file." - :type 'alist) - -(defcustom projectile-create-missing-test-files nil - "During toggling, if non-nil enables creating test files if not found. - -When not-nil, every call to projectile-find-implementation-or-test-* -creates test files if not found on the file system. Defaults to nil. -It assumes the test/ folder is at the same level as src/." - :group 'projectile - :type 'boolean) - -(defcustom projectile-after-switch-project-hook nil - "Hooks run right after project is switched." - :group 'projectile - :type 'hook) - -(defcustom projectile-before-switch-project-hook nil - "Hooks run when right before project is switched." - :group 'projectile - :type 'hook) - -(defcustom projectile-current-project-on-switch 'remove - "Determines whether to display current project when switching projects. - -When set to 'remove current project is not included, 'move-to-end -will display current project and the end of the list of known -projects, 'keep will leave the current project at the default -position." - :group 'projectile - :type '(radio - (const :tag "Remove" remove) - (const :tag "Move to end" move-to-end) - (const :tag "Keep" keep))) - - -;;; Version information - -;;;###autoload -(defun projectile-version (&optional show-version) - "Get the Projectile version as string. - -If called interactively or if SHOW-VERSION is non-nil, show the -version in the echo area and the messages buffer. - -The returned string includes both, the version from package.el -and the library version, if both a present and different. - -If the version number could not be determined, signal an error, -if called interactively, or if SHOW-VERSION is non-nil, otherwise -just return nil." - (interactive (list t)) - (if (require 'pkg-info nil t) - (let ((version (pkg-info-version-info 'projectile))) - (when show-version - (message "Projectile %s" version)) - version) - (error "Cannot determine version without package pkg-info"))) - -;;; Misc utility functions -(defun projectile-difference (list1 list2) - (cl-remove-if - (lambda (x) (member x list2)) - list1)) - -(defun projectile-unixy-system-p () - "Check to see if unixy text utilities are installed." - (cl-every - (lambda (x) (executable-find x)) - '("grep" "cut" "uniq"))) - -(defun projectile-symbol-or-selection-at-point () - "Get the symbol or selected text at point." - (if (use-region-p) - (buffer-substring-no-properties (region-beginning) (region-end)) - (projectile-symbol-at-point))) - -(defun projectile-symbol-at-point () - "Get the symbol at point and strip its properties." - (substring-no-properties (or (thing-at-point 'symbol) ""))) - -(defun projectile-generate-process-name (process make-new) - "Infer the buffer name for PROCESS or generate a new one if MAKE-NEW is true." - (let* ((project (projectile-ensure-project (projectile-project-root))) - (base-name (format "*%s %s*" process (projectile-project-name project)))) - (if make-new - (generate-new-buffer-name base-name) - base-name))) - - -;;; Serialization -(defun projectile-serialize (data filename) - "Serialize DATA to FILENAME. - -The saved data can be restored with `projectile-unserialize'." - (when (file-writable-p filename) - (with-temp-file filename - (insert (let (print-length) (prin1-to-string data)))))) - -(defun projectile-unserialize (filename) - "Read data serialized by `projectile-serialize' from FILENAME." - (with-demoted-errors - "Error during file deserialization: %S" - (when (file-exists-p filename) - (with-temp-buffer - (insert-file-contents filename) - ;; this will blow up if the contents of the file aren't - ;; lisp data structures - (read (buffer-string)))))) - - -;;; Caching -(defvar projectile-file-exists-cache - (make-hash-table :test 'equal) - "Cached `projectile-file-exists-p' results.") - -(defvar projectile-file-exists-cache-timer nil - "Timer for scheduling`projectile-file-exists-cache-cleanup'.") - -(defun projectile-file-exists-cache-cleanup () - "Removed timed out cache entries and reschedules or remove the -timer if no more items are in the cache." - (let ((now (current-time))) - (maphash (lambda (key value) - (if (time-less-p (cdr value) now) - (remhash key projectile-file-exists-cache))) - projectile-file-exists-cache) - (setq projectile-file-exists-cache-timer - (if (> (hash-table-count projectile-file-exists-cache) 0) - (run-with-timer 10 nil 'projectile-file-exists-cache-cleanup))))) - -(defun projectile-file-exists-p (filename) - "Return t if file FILENAME exist. -A wrapper around `file-exists-p' with additional caching support." - (let* ((file-remote (file-remote-p filename)) - (expire-seconds - (if file-remote - (and projectile-file-exists-remote-cache-expire - (> projectile-file-exists-remote-cache-expire 0) - projectile-file-exists-remote-cache-expire) - (and projectile-file-exists-local-cache-expire - (> projectile-file-exists-local-cache-expire 0) - projectile-file-exists-local-cache-expire))) - (remote-file-name-inhibit-cache (if expire-seconds - expire-seconds - remote-file-name-inhibit-cache))) - (if (not expire-seconds) - (file-exists-p filename) - (let* ((current-time (current-time)) - (cached (gethash filename projectile-file-exists-cache)) - (cached-value (if cached (car cached))) - (cached-expire (if cached (cdr cached))) - (cached-expired (if cached (time-less-p cached-expire current-time) t)) - (value (or (and (not cached-expired) cached-value) - (if (file-exists-p filename) 'found 'notfound)))) - (when (or (not cached) cached-expired) - (puthash filename - (cons value (time-add current-time (seconds-to-time expire-seconds))) - projectile-file-exists-cache)) - (unless projectile-file-exists-cache-timer - (setq projectile-file-exists-cache-timer - (run-with-timer 10 nil 'projectile-file-exists-cache-cleanup))) - (equal value 'found))))) - -;;;###autoload -(defun projectile-invalidate-cache (prompt) - "Remove the current project's files from `projectile-projects-cache'. - -With a prefix argument PROMPT prompts for the name of the project whose cache -to invalidate." - (interactive "P") - (let ((project-root - (if prompt - (completing-read "Remove cache for: " - (hash-table-keys projectile-projects-cache)) - (projectile-ensure-project (projectile-project-root))))) - (setq projectile-project-root-cache (make-hash-table :test 'equal)) - (remhash project-root projectile-project-type-cache) - (remhash project-root projectile-projects-cache) - (remhash project-root projectile-projects-cache-time) - (projectile-serialize-cache) - (when projectile-verbose - (message "Invalidated Projectile cache for %s." - (propertize project-root 'face 'font-lock-keyword-face)))) - (when (fboundp 'recentf-cleanup) - (recentf-cleanup))) - -(defun projectile-time-seconds () - "Return the number of seconds since the unix epoch." - (cl-destructuring-bind (high low _usec _psec) (current-time) - (+ (lsh high 16) low))) - -(defun projectile-cache-project (project files) - "Cache PROJECTs FILES. -The cache is created both in memory and on the hard drive." - (when projectile-enable-caching - (puthash project files projectile-projects-cache) - (puthash project (projectile-time-seconds) projectile-projects-cache-time) - (projectile-serialize-cache))) - -;;;###autoload -(defun projectile-purge-file-from-cache (file) - "Purge FILE from the cache of the current project." - (interactive - (list (projectile-completing-read - "Remove file from cache: " - (projectile-current-project-files)))) - (let* ((project-root (projectile-project-root)) - (project-cache (gethash project-root projectile-projects-cache))) - (if (projectile-file-cached-p file project-root) - (progn - (puthash project-root (remove file project-cache) projectile-projects-cache) - (projectile-serialize-cache) - (when projectile-verbose - (message "%s removed from cache" file))) - (error "%s is not in the cache" file)))) - -;;;###autoload -(defun projectile-purge-dir-from-cache (dir) - "Purge DIR from the cache of the current project." - (interactive - (list (projectile-completing-read - "Remove directory from cache: " - (projectile-current-project-dirs)))) - (let* ((project-root (projectile-project-root)) - (project-cache (gethash project-root projectile-projects-cache))) - (puthash project-root - (cl-remove-if (lambda (str) (string-prefix-p dir str)) project-cache) - projectile-projects-cache))) - -(defun projectile-file-cached-p (file project) - "Check if FILE is already in PROJECT cache." - (member file (gethash project projectile-projects-cache))) - -;;;###autoload -(defun projectile-cache-current-file () - "Add the currently visited file to the cache." - (interactive) - (let ((current-project (projectile-project-root))) - (when (and (buffer-file-name) (gethash (projectile-project-root) projectile-projects-cache)) - (let* ((abs-current-file (file-truename (buffer-file-name))) - (current-file (file-relative-name abs-current-file current-project))) - (unless (or (projectile-file-cached-p current-file current-project) - (projectile-ignored-directory-p (file-name-directory abs-current-file)) - (projectile-ignored-file-p abs-current-file)) - (puthash current-project - (cons current-file (gethash current-project projectile-projects-cache)) - projectile-projects-cache) - (projectile-serialize-cache) - (message "File %s added to project %s cache." - (propertize current-file 'face 'font-lock-keyword-face) - (propertize current-project 'face 'font-lock-keyword-face))))))) - -;; cache opened files automatically to reduce the need for cache invalidation -(defun projectile-cache-files-find-file-hook () - "Function for caching files with `find-file-hook'." - (let ((project-root (projectile-project-p))) - (when (and projectile-enable-caching - project-root - (not (projectile-ignored-project-p project-root))) - (projectile-cache-current-file)))) - -(defun projectile-track-known-projects-find-file-hook () - "Function for caching projects with `find-file-hook'." - (when (and projectile-track-known-projects-automatically (projectile-project-p)) - (projectile-add-known-project (projectile-project-root)))) - -(defun projectile-maybe-invalidate-cache (force) - "Invalidate if FORCE or project's dirconfig newer than cache." - (when (or force (file-newer-than-file-p (projectile-dirconfig-file) - projectile-cache-file)) - (projectile-invalidate-cache nil))) - -;;;###autoload -(defun projectile-discover-projects-in-directory (directory) - "Discover any projects in DIRECTORY and add them to the projectile cache. -This function is not recursive and only adds projects with roots -at the top level of DIRECTORY." - (interactive - (list (read-directory-name "Starting directory: "))) - (let ((subdirs (directory-files directory t))) - (mapcar - (lambda (dir) - (when (and (file-directory-p dir) - (not (member (file-name-nondirectory dir) '(".." ".")))) - (when (projectile-project-p dir) - (projectile-add-known-project dir)))) - subdirs))) - -;;;###autoload -(defun projectile-discover-projects-in-search-path () - "Discover projects in `projectile-project-search-path'. -Invoked automatically when `projectile-mode' is enabled." - (interactive) - (mapcar #'projectile-discover-projects-in-directory projectile-project-search-path)) - - -(defun delete-file-projectile-remove-from-cache (filename &optional _trash) - (if (and projectile-enable-caching projectile-auto-update-cache (projectile-project-p)) - (let* ((project-root (projectile-project-root)) - (true-filename (file-truename filename)) - (relative-filename (file-relative-name true-filename project-root))) - (if (projectile-file-cached-p relative-filename project-root) - (projectile-purge-file-from-cache relative-filename))))) - - -;;; Project root related utilities -(defun projectile-parent (path) - "Return the parent directory of PATH. -PATH may be a file or directory and directory paths may end with a slash." - (directory-file-name (file-name-directory (directory-file-name (expand-file-name path))))) - -(defun projectile-locate-dominating-file (file name) - "Look up the directory hierarchy from FILE for a directory containing NAME. -Stop at the first parent directory containing a file NAME, -and return the directory. Return nil if not found. -Instead of a string, NAME can also be a predicate taking one argument -\(a directory) and returning a non-nil value if that directory is the one for -which we're looking." - ;; copied from files.el (stripped comments) emacs-24 bzr branch 2014-03-28 10:20 - (setq file (abbreviate-file-name file)) - (let ((root nil) - try) - (while (not (or root - (null file) - (string-match locate-dominating-stop-dir-regexp file))) - (setq try (if (stringp name) - (projectile-file-exists-p (expand-file-name name file)) - (funcall name file))) - (cond (try (setq root file)) - ((equal file (setq file (file-name-directory - (directory-file-name file)))) - (setq file nil)))) - (and root (expand-file-name (file-name-as-directory root))))) - -(defvar-local projectile-project-root nil - "Defines a custom Projectile project root. -This is intended to be used as a file local variable.") - -(defun projectile-root-local (_dir) - "A simple wrapper around `projectile-project-root'." - projectile-project-root) - -(defun projectile-root-top-down (dir &optional list) - "Identify a project root in DIR by top-down search for files in LIST. -If LIST is nil, use `projectile-project-root-files' instead. -Return the first (topmost) matched directory or nil if not found." - (projectile-locate-dominating-file - dir - (lambda (dir) - (cl-find-if (lambda (f) (projectile-file-exists-p (expand-file-name f dir))) - (or list projectile-project-root-files))))) - -(defun projectile-root-bottom-up (dir &optional list) - "Identify a project root in DIR by bottom-up search for files in LIST. -If LIST is nil, use `projectile-project-root-files-bottom-up' instead. -Return the first (bottommost) matched directory or nil if not found." - (cl-some (lambda (name) (projectile-locate-dominating-file dir name)) - (or list projectile-project-root-files-bottom-up))) - -(defun projectile-root-top-down-recurring (dir &optional list) - "Identify a project root in DIR by recurring top-down search for files in LIST. -If LIST is nil, use `projectile-project-root-files-top-down-recurring' -instead. Return the last (bottommost) matched directory in the -topmost sequence of matched directories. Nil otherwise." - (cl-some - (lambda (f) - (projectile-locate-dominating-file - dir - (lambda (dir) - (and (projectile-file-exists-p (expand-file-name f dir)) - (or (string-match locate-dominating-stop-dir-regexp (projectile-parent dir)) - (not (projectile-file-exists-p (expand-file-name f (projectile-parent dir))))))))) - (or list projectile-project-root-files-top-down-recurring))) - -(defun projectile-project-root (&optional dir) - "Retrieves the root directory of a project if available. -If DIR is not supplied its set to the current directory by default." - ;; the cached value will be 'none in the case of no project root (this is to - ;; ensure it is not reevaluated each time when not inside a project) so use - ;; cl-subst to replace this 'none value with nil so a nil value is used - ;; instead - (let ((dir (or dir default-directory))) - ;; Back out of any archives, the project will live on the outside and - ;; searching them is slow. - (when (and (fboundp 'tramp-archive-file-name-archive) - (tramp-archive-file-name-p dir)) - (setq dir (file-name-directory (tramp-archive-file-name-archive dir)))) - (cl-subst nil 'none - ;; The `is-local' and `is-connected' variables are - ;; used to fix the behavior where Emacs hangs - ;; because of Projectile when you open a file over - ;; TRAMP. It basically prevents Projectile from - ;; trying to find information about files for which - ;; it's not possible to get that information right - ;; now. - (or (let ((is-local (not (file-remote-p dir))) ;; `true' if the file is local - (is-connected (file-remote-p dir nil t))) ;; `true' if the file is remote AND we are connected to the remote - (when (or is-local is-connected) - (cl-some - (lambda (func) - (let* ((cache-key (format "%s-%s" func dir)) - (cache-value (gethash cache-key projectile-project-root-cache))) - (if (and cache-value (file-exists-p cache-value)) - cache-value - (let ((value (funcall func (file-truename dir)))) - (puthash cache-key value projectile-project-root-cache) - value)))) - projectile-project-root-files-functions))) - ;; set cached to none so is non-nil so we don't try - ;; and look it up again - 'none)))) - -(defun projectile-ensure-project (dir) - "Ensure that DIR is non-nil. -Useful for commands that expect the presence of a project. -Controlled by `projectile-require-project-root'." - (if dir - dir - (cond - ((eq projectile-require-project-root 'prompt) (projectile-completing-read - "Switch to project: " projectile-known-projects)) - (projectile-require-project-root (error "Projectile can't find a project definition in %s" dir)) - (t default-directory)))) - -(defun projectile-project-p (&optional dir) - "Check if DIR is a project. -Defaults to the current directory if not provided -explicitly." - (projectile-project-root (or dir default-directory))) - -(defun projectile-default-project-name (project-root) - "Default function used create project name to be displayed based on the value of PROJECT-ROOT." - (file-name-nondirectory (directory-file-name project-root))) - -(defun projectile-project-name (&optional project) - "Return project name. -If PROJECT is not specified acts on the current project." - (or projectile-project-name - (let ((project-root (or project (projectile-project-root)))) - (if project-root - (funcall projectile-project-name-function project-root) - "-")))) - - -;;; Project indexing -(defun projectile-get-project-directories (project-dir) - "Get the list of PROJECT-DIR directories that are of interest to the user." - (mapcar (lambda (subdir) (concat project-dir subdir)) - (or (nth 0 (projectile-parse-dirconfig-file)) '("")))) - -(defun projectile--directory-p (directory) - "Checks if DIRECTORY is a string designating a valid directory." - (and (stringp directory) (file-directory-p directory))) - -(defun projectile-dir-files (directory) - "List the files in DIRECTORY and in its sub-directories. -Files are returned as relative paths to DIRECTORY." - (unless (projectile--directory-p directory) - (error "Directory %S does not exist" directory)) - ;; check for a cache hit first if caching is enabled - (let ((files-list (and projectile-enable-caching - (gethash directory projectile-projects-cache)))) - ;; cache disabled or cache miss - (or files-list - (let ((vcs (projectile-project-vcs directory))) - (pcase projectile-indexing-method - ('native (projectile-dir-files-native directory)) - ;; use external tools to get the project files - ('hybrid (projectile-adjust-files directory vcs (projectile-dir-files-alien directory))) - ('alien (projectile-dir-files-alien directory)) - (_ (user-error "Unsupported indexing method `%S'" projectile-indexing-method))))))) - -;;; Native Project Indexing -;; -;; This corresponds to `projectile-indexing-method' being set to native. -(defun projectile-dir-files-native (directory) - "Get the files for ROOT under DIRECTORY using just Emacs Lisp." - (let ((progress-reporter - (make-progress-reporter - (format "Projectile is indexing %s" - (propertize directory 'face 'font-lock-keyword-face))))) - ;; we need the files with paths relative to the project root - (mapcar (lambda (file) (file-relative-name file directory)) - (projectile-index-directory directory (projectile-filtering-patterns) - progress-reporter)))) - -(defun projectile-index-directory (directory patterns progress-reporter) - "Index DIRECTORY taking into account PATTERNS. -The function calls itself recursively until all sub-directories -have been indexed. The PROGRESS-REPORTER is updated while the -function is executing." - (apply #'append - (mapcar - (lambda (f) - (unless (or (and patterns (projectile-ignored-rel-p f directory patterns)) - (member (file-name-nondirectory (directory-file-name f)) - '("." ".." ".svn" ".cvs"))) - (progress-reporter-update progress-reporter) - (if (file-directory-p f) - (unless (projectile-ignored-directory-p - (file-name-as-directory f)) - (projectile-index-directory f patterns progress-reporter)) - (unless (projectile-ignored-file-p f) - (list f))))) - (directory-files directory t)))) - -;;; Alien Project Indexing -;; -;; This corresponds to `projectile-indexing-method' being set to hybrid or alien. -;; The only difference between the two methods is that alien doesn't do -;; any post-processing of the files obtained via the external command. -(defun projectile-dir-files-alien (directory) - "Get the files for DIRECTORY using external tools." - (let ((vcs (projectile-project-vcs directory))) - (cond - ((eq vcs 'git) - (nconc (projectile-files-via-ext-command directory (projectile-get-ext-command vcs)) - (projectile-get-sub-projects-files directory vcs))) - (t (projectile-files-via-ext-command directory (projectile-get-ext-command vcs)))))) - -(define-obsolete-function-alias 'projectile-dir-files-external 'projectile-dir-files-alien "2.0.0") -(define-obsolete-function-alias 'projectile-get-repo-files 'projectile-dir-files-alien "2.0.0") - -(defun projectile-get-ext-command (vcs) - "Determine which external command to invoke based on the project's VCS. -Fallback to a generic command when not in a VCS-controlled project." - (pcase vcs - ('git projectile-git-command) - ('hg projectile-hg-command) - ('fossil projectile-fossil-command) - ('bzr projectile-bzr-command) - ('darcs projectile-darcs-command) - ('svn projectile-svn-command) - (_ projectile-generic-command))) - -(defun projectile-get-sub-projects-command (vcs) - "Get the sub-projects command for VCS. -Currently that's supported just for Git (sub-projects being Git -sub-modules there)." - (pcase vcs - ('git projectile-git-submodule-command) - (_ ""))) - -(defun projectile-get-ext-ignored-command (vcs) - "Determine which external command to invoke based on the project's VCS." - (pcase vcs - ('git projectile-git-ignored-command) - ;; TODO: Add support for other VCS - (_ nil))) - -(defun projectile-flatten (lst) - "Take a nested list LST and return its contents as a single, flat list." - (if (and (listp lst) (listp (cdr lst))) - (cl-mapcan 'projectile-flatten lst) - (list lst))) - -(defun projectile-get-all-sub-projects (project) - "Get all sub-projects for a given project. - -PROJECT is base directory to start search recursively." - (let ((submodules (projectile-get-immediate-sub-projects project))) - (cond - ((null submodules) - nil) - (t - (nconc submodules (projectile-flatten - ;; recursively get sub-projects of each sub-project - (mapcar (lambda (s) - (projectile-get-all-sub-projects s)) submodules))))))) - -(defun projectile-get-immediate-sub-projects (path) - "Get immediate sub-projects for a given project without recursing. - -PATH is the vcs root or project root from which to start -searching, and should end with an appropriate path delimiter, such as -'/' or a '\\'. - -If the vcs get-sub-projects query returns results outside of path, -they are excluded from the results of this function." - (let* ((vcs (projectile-project-vcs path)) - ;; search for sub-projects under current project `project' - (submodules (mapcar - (lambda (s) - (file-name-as-directory (expand-file-name s path))) - (projectile-files-via-ext-command path (projectile-get-sub-projects-command vcs)))) - (project-child-folder-regex - (concat "\\`" - (regexp-quote path)))) - - ;; If project root is inside of an VCS folder, but not actually an - ;; VCS root itself, submodules external to the project will be - ;; included in the VCS get sub-projects result. Let's remove them. - (cl-remove-if-not - (lambda (submodule) - (string-match-p project-child-folder-regex - submodule)) - submodules))) - -(defun projectile-get-sub-projects-files (project-root _vcs) - "Get files from sub-projects for PROJECT-ROOT recursively." - (projectile-flatten - (mapcar (lambda (sub-project) - (let ((project-relative-path - (file-name-as-directory (file-relative-name - sub-project project-root)))) - (mapcar (lambda (file) - (concat project-relative-path file)) - ;; TODO: Seems we forgot git hardcoded here - (projectile-files-via-ext-command sub-project projectile-git-command)))) - (projectile-get-all-sub-projects project-root)))) - -(defun projectile-get-repo-ignored-files (project vcs) - "Get a list of the files ignored in the PROJECT using VCS." - (let ((cmd (projectile-get-ext-ignored-command vcs))) - (when cmd - (projectile-files-via-ext-command project cmd)))) - -(defun projectile-get-repo-ignored-directory (project dir vcs) - "Get a list of the files ignored in the PROJECT in the directory DIR. -VCS is the VCS of the project." - (let ((cmd (projectile-get-ext-ignored-command vcs))) - (when cmd - (projectile-files-via-ext-command project (concat cmd " " dir))))) - -(defun projectile-files-via-ext-command (root command) - "Get a list of relative file names in the project ROOT by executing COMMAND. - -If `command' is nil or an empty string, return nil. -This allows commands to be disabled." - (when (stringp command) - (let ((default-directory root)) - (split-string (shell-command-to-string command) "\0" t)))) - -(defun projectile-adjust-files (project vcs files) - "First remove ignored files from FILES, then add back unignored files." - (projectile-add-unignored project vcs (projectile-remove-ignored files))) - -(defun projectile-remove-ignored (files) - "Remove ignored files and folders from FILES. - -If ignored directory prefixed with '*', then ignore all -directories/subdirectories with matching filename, -otherwise operates relative to project root." - (let ((ignored-files (projectile-ignored-files-rel)) - (ignored-dirs (projectile-ignored-directories-rel))) - (cl-remove-if - (lambda (file) - (or (cl-some - (lambda (f) - (string= f (file-name-nondirectory file))) - ignored-files) - (cl-some - (lambda (dir) - ;; if the directory is prefixed with '*' then ignore all directories matching that name - (if (string-prefix-p "*" dir) - ;; remove '*' and trailing slash from ignored directory name - (let ((d (substring dir 1 (if (equal (substring dir -1) "/") -1 nil)))) - (cl-some - (lambda (p) - (string= d p)) - ;; split path by '/', remove empty strings, and check if any subdirs match name 'd' - (delete "" (split-string (or (file-name-directory file) "") "/")))) - (string-prefix-p dir file))) - ignored-dirs) - (cl-some - (lambda (suf) - (string-suffix-p suf file t)) - projectile-globally-ignored-file-suffixes))) - files))) - -(defun projectile-keep-ignored-files (project vcs files) - "Filter FILES to retain only those that are ignored." - (when files - (cl-remove-if-not - (lambda (file) - (cl-some (lambda (f) (string-prefix-p f file)) files)) - (projectile-get-repo-ignored-files project vcs)))) - -(defun projectile-keep-ignored-directories (project vcs directories) - "Get ignored files within each of DIRECTORIES." - (when directories - (let (result) - (dolist (dir directories result) - (setq result (append result - (projectile-get-repo-ignored-directory project dir vcs)))) - result))) - -(defun projectile-add-unignored (project vcs files) - "This adds unignored files to FILES. - -Useful because the VCS may not return ignored files at all. In -this case unignored files will be absent from FILES." - (let ((unignored-files (projectile-keep-ignored-files - project - vcs - (projectile-unignored-files-rel))) - (unignored-paths (projectile-remove-ignored - (projectile-keep-ignored-directories - project - vcs - (projectile-unignored-directories-rel))))) - (append files unignored-files unignored-paths))) - -(defun projectile-buffers-with-file (buffers) - "Return only those BUFFERS backed by files." - (cl-remove-if-not (lambda (b) (buffer-file-name b)) buffers)) - -(defun projectile-buffers-with-file-or-process (buffers) - "Return only those BUFFERS backed by files or processes." - (cl-remove-if-not (lambda (b) (or (buffer-file-name b) - (get-buffer-process b))) buffers)) - -(defun projectile-project-buffers (&optional project) - "Get a list of a project's buffers. -If PROJECT is not specified the command acts on the current project." - (let* ((project-root (or project (projectile-project-root))) - (all-buffers (cl-remove-if-not - (lambda (buffer) - (projectile-project-buffer-p buffer project-root)) - (buffer-list)))) - (if projectile-buffers-filter-function - (funcall projectile-buffers-filter-function all-buffers) - all-buffers))) - -(defun projectile-process-current-project-buffers (action) - "Process the current project's buffers using ACTION." - (let ((project-buffers (projectile-project-buffers))) - (dolist (buffer project-buffers) - (funcall action buffer)))) - -(defun projectile-project-buffer-files (&optional project) - "Get a list of a project's buffer files. -If PROJECT is not specified the command acts on the current project." - (let ((project-root (or project (projectile-project-root)))) - (mapcar - (lambda (buffer) - (file-relative-name - (buffer-file-name buffer) - project-root)) - (projectile-buffers-with-file - (projectile-project-buffers project))))) - -(defun projectile-project-buffer-p (buffer project-root) - "Check if BUFFER is under PROJECT-ROOT." - (with-current-buffer buffer - (and (not (string-prefix-p " " (buffer-name buffer))) - (not (projectile-ignored-buffer-p buffer)) - default-directory - (string-equal (file-remote-p default-directory) - (file-remote-p project-root)) - (not (string-match-p "^http\\(s\\)?://" default-directory)) - (string-prefix-p project-root (file-truename default-directory) (eq system-type 'windows-nt))))) - -(defun projectile-ignored-buffer-p (buffer) - "Check if BUFFER should be ignored. - -Regular expressions can be use." - (or - (with-current-buffer buffer - (cl-some - (lambda (name) - (string-match-p name (buffer-name))) - projectile-globally-ignored-buffers)) - (with-current-buffer buffer - (cl-some - (lambda (mode) - (string-match-p (concat "^" mode "$") - (symbol-name major-mode))) - projectile-globally-ignored-modes)))) - -(defun projectile-recently-active-files () - "Get list of recently active files. - -Files are ordered by recently active buffers, and then recently -opened through use of recentf." - (let ((project-buffer-files (projectile-project-buffer-files))) - (append project-buffer-files - (projectile-difference - (projectile-recentf-files) - project-buffer-files)))) - -(defun projectile-project-buffer-names () - "Get a list of project buffer names." - (mapcar #'buffer-name (projectile-project-buffers))) - -(defun projectile-prepend-project-name (string) - "Prepend the current project's name to STRING." - (format "[%s] %s" (projectile-project-name) string)) - -(defun projectile-read-buffer-to-switch (prompt) - "Read the name of a buffer to switch to, prompting with PROMPT. - -This function excludes the current buffer from the offered -choices." - (projectile-completing-read - prompt - (delete (buffer-name (current-buffer)) - (projectile-project-buffer-names)))) - -;;;###autoload -(defun projectile-switch-to-buffer () - "Switch to a project buffer." - (interactive) - (switch-to-buffer - (projectile-read-buffer-to-switch "Switch to buffer: "))) - -;;;###autoload -(defun projectile-switch-to-buffer-other-window () - "Switch to a project buffer and show it in another window." - (interactive) - (switch-to-buffer-other-window - (projectile-read-buffer-to-switch "Switch to buffer: "))) - -;;;###autoload -(defun projectile-switch-to-buffer-other-frame () - "Switch to a project buffer and show it in another window." - (interactive) - (switch-to-buffer-other-frame - (projectile-read-buffer-to-switch "Switch to buffer: "))) - -;;;###autoload -(defun projectile-display-buffer () - "Display a project buffer in another window without selecting it." - (interactive) - (display-buffer - (projectile-completing-read - "Display buffer: " - (projectile-project-buffer-names)))) - -;;;###autoload -(defun projectile-project-buffers-other-buffer () - "Switch to the most recently selected buffer project buffer. -Only buffers not visible in windows are returned." - (interactive) - (switch-to-buffer (car (projectile-project-buffers-non-visible))) nil t) - -(defun projectile-project-buffers-non-visible () - "Get a list of non visible project buffers." - (cl-remove-if-not - (lambda (buffer) - (not (get-buffer-window buffer 'visible))) - (projectile-project-buffers))) - -;;;###autoload -(defun projectile-multi-occur (&optional nlines) - "Do a `multi-occur' in the project's buffers. -With a prefix argument, show NLINES of context." - (interactive "P") - (let ((project (projectile-ensure-project (projectile-project-root)))) - (multi-occur (projectile-project-buffers project) - (car (occur-read-primary-args)) - nlines))) - -(defun projectile-normalise-paths (patterns) - "Remove leading `/' from the elements of PATTERNS." - (delq nil (mapcar (lambda (pat) (and (string-prefix-p "/" pat) - ;; remove the leading / - (substring pat 1))) - patterns))) - -(defun projectile-expand-paths (paths) - "Expand the elements of PATHS. - -Elements containing wildcards are expanded and spliced into the -resulting paths. The returned PATHS are absolute, based on the -projectile project root." - (let ((default-directory (projectile-project-root))) - (projectile-flatten (mapcar - (lambda (pattern) - (or (file-expand-wildcards pattern t) - (projectile-expand-root pattern))) - paths)))) - -(defun projectile-normalise-patterns (patterns) - "Remove paths from PATTERNS." - (cl-remove-if (lambda (pat) (string-prefix-p "/" pat)) patterns)) - -(defun projectile-make-relative-to-root (files) - "Make FILES relative to the project root." - (let ((project-root (projectile-project-root))) - (mapcar (lambda (f) (file-relative-name f project-root)) files))) - -(defun projectile-ignored-directory-p (directory) - "Check if DIRECTORY should be ignored. - -Regular expressions can be used." - (cl-some - (lambda (name) - (string-match-p name directory)) - (projectile-ignored-directories))) - -(defun projectile-ignored-file-p (file) - "Check if FILE should be ignored. - -Regular expressions can be used." - (cl-some - (lambda (name) - (string-match-p name file)) - (projectile-ignored-files))) - -(defun projectile-check-pattern-p (file pattern) - "Check if FILE meets PATTERN." - (or (string-suffix-p (directory-file-name pattern) - (directory-file-name file)) - (member file (file-expand-wildcards pattern t)))) - -(defun projectile-ignored-rel-p (file directory patterns) - "Check if FILE should be ignored relative to DIRECTORY -according to PATTERNS: (ignored . unignored)" - (let ((default-directory directory)) - (and (cl-some - (lambda (pat) (projectile-check-pattern-p file pat)) - (car patterns)) - (cl-notany - (lambda (pat) (projectile-check-pattern-p file pat)) - (cdr patterns))))) - -(defun projectile-ignored-files () - "Return list of ignored files." - (projectile-difference - (mapcar - #'projectile-expand-root - (append - projectile-globally-ignored-files - (projectile-project-ignored-files))) - (projectile-unignored-files))) - -(defun projectile-ignored-directories () - "Return list of ignored directories." - (projectile-difference - (mapcar - #'file-name-as-directory - (mapcar - #'projectile-expand-root - (append - projectile-globally-ignored-directories - (projectile-project-ignored-directories)))) - (projectile-unignored-directories))) - -(defun projectile-ignored-directories-rel () - "Return list of ignored directories, relative to the root." - (projectile-make-relative-to-root (projectile-ignored-directories))) - -(defun projectile-ignored-files-rel () - "Return list of ignored files, relative to the root." - (projectile-make-relative-to-root (projectile-ignored-files))) - -(defun projectile-project-ignored-files () - "Return list of project ignored files. -Unignored files are not included." - (cl-remove-if 'file-directory-p (projectile-project-ignored))) - -(defun projectile-project-ignored-directories () - "Return list of project ignored directories. -Unignored directories are not included." - (cl-remove-if-not 'file-directory-p (projectile-project-ignored))) - -(defun projectile-paths-to-ignore () - "Return a list of ignored project paths." - (projectile-normalise-paths (nth 1 (projectile-parse-dirconfig-file)))) - -(defun projectile-patterns-to-ignore () - "Return a list of relative file patterns." - (projectile-normalise-patterns (nth 1 (projectile-parse-dirconfig-file)))) - -(defun projectile-project-ignored () - "Return list of project ignored files/directories. -Unignored files/directories are not included." - (let ((paths (projectile-paths-to-ignore))) - (projectile-expand-paths paths))) - -(defun projectile-unignored-files () - "Return list of unignored files." - (mapcar - #'projectile-expand-root - (append - projectile-globally-unignored-files - (projectile-project-unignored-files)))) - -(defun projectile-unignored-directories () - "Return list of unignored directories." - (mapcar - #'file-name-as-directory - (mapcar - #'projectile-expand-root - (append - projectile-globally-unignored-directories - (projectile-project-unignored-directories))))) - -(defun projectile-unignored-directories-rel () - "Return list of unignored directories, relative to the root." - (projectile-make-relative-to-root (projectile-unignored-directories))) - -(defun projectile-unignored-files-rel () - "Return list of unignored files, relative to the root." - (projectile-make-relative-to-root (projectile-unignored-files))) - -(defun projectile-project-unignored-files () - "Return list of project unignored files." - (cl-remove-if 'file-directory-p (projectile-project-unignored))) - -(defun projectile-project-unignored-directories () - "Return list of project unignored directories." - (cl-remove-if-not 'file-directory-p (projectile-project-unignored))) - -(defun projectile-paths-to-ensure () - "Return a list of unignored project paths." - (projectile-normalise-paths (nth 2 (projectile-parse-dirconfig-file)))) - -(defun projectile-files-to-ensure () - (projectile-flatten (mapcar (lambda (pat) (file-expand-wildcards pat t)) - (projectile-patterns-to-ensure)))) - -(defun projectile-patterns-to-ensure () - "Return a list of relative file patterns." - (projectile-normalise-patterns (nth 2 (projectile-parse-dirconfig-file)))) - -(defun projectile-filtering-patterns () - (cons (projectile-patterns-to-ignore) - (projectile-patterns-to-ensure))) - -(defun projectile-project-unignored () - "Return list of project ignored files/directories." - (delete-dups (append (projectile-expand-paths (projectile-paths-to-ensure)) - (projectile-expand-paths (projectile-files-to-ensure))))) - - -(defun projectile-dirconfig-file () - "Return the absolute path to the project's dirconfig file." - (expand-file-name ".projectile" (projectile-project-root))) - -(defun projectile-parse-dirconfig-file () - "Parse project ignore file and return directories to ignore and keep. - -The return value will be a list of three elements, the car being -the list of directories to keep, the cadr being the list of files -or directories to ignore, and the caddr being the list of files -or directories to ensure. - -Strings starting with + will be added to the list of directories -to keep, and strings starting with - will be added to the list of -directories to ignore. For backward compatibility, without a -prefix the string will be assumed to be an ignore string." - (let (keep ignore ensure (dirconfig (projectile-dirconfig-file))) - (when (projectile-file-exists-p dirconfig) - (with-temp-buffer - (insert-file-contents dirconfig) - (while (not (eobp)) - (pcase (char-after) - (?+ (push (buffer-substring (1+ (point)) (line-end-position)) keep)) - (?- (push (buffer-substring (1+ (point)) (line-end-position)) ignore)) - (?! (push (buffer-substring (1+ (point)) (line-end-position)) ensure)) - (_ (push (buffer-substring (point) (line-end-position)) ignore))) - (forward-line))) - (list (mapcar (lambda (f) (file-name-as-directory (string-trim f))) - (delete "" (reverse keep))) - (mapcar #'string-trim - (delete "" (reverse ignore))) - (mapcar #'string-trim - (delete "" (reverse ensure))))))) - -(defun projectile-expand-root (name) - "Expand NAME to project root. - -Never use on many files since it's going to recalculate the -project-root for every file." - (expand-file-name name (projectile-project-root))) - -(cl-defun projectile-completing-read (prompt choices &key initial-input action) - "Present a project tailored PROMPT with CHOICES." - (let ((prompt (projectile-prepend-project-name prompt)) - res) - (setq res - (cond - ((eq projectile-completion-system 'ido) - (ido-completing-read prompt choices nil nil initial-input)) - ((eq projectile-completion-system 'default) - (completing-read prompt choices nil nil initial-input)) - ((eq projectile-completion-system 'helm) - (if (and (fboundp 'helm) - (fboundp 'helm-make-source)) - (helm :sources - (helm-make-source "Projectile" 'helm-source-sync - :candidates choices - :action (if action - (prog1 action - (setq action nil)) - #'identity)) - :prompt prompt - :input initial-input - :buffer "*helm-projectile*") - (user-error "Please install helm from \ -https://github.com/emacs-helm/helm"))) - ((eq projectile-completion-system 'ivy) - (if (fboundp 'ivy-read) - (ivy-read prompt choices - :initial-input initial-input - :action (prog1 action - (setq action nil)) - :caller 'projectile-completing-read) - (user-error "Please install ivy from \ -https://github.com/abo-abo/swiper"))) - (t (funcall projectile-completion-system prompt choices)))) - (if action - (funcall action res) - res))) - -(defun projectile-project-files (project-root) - "Return a list of files for the PROJECT-ROOT." - (let (files) - ;; If the cache is too stale, don't use it. - (when projectile-files-cache-expire - (let ((cache-time - (gethash project-root projectile-projects-cache-time))) - (when (or (null cache-time) - (< (+ cache-time projectile-files-cache-expire) - (projectile-time-seconds))) - (remhash project-root projectile-projects-cache) - (remhash project-root projectile-projects-cache-time)))) - - ;; Use the cache, if requested and available. - (when projectile-enable-caching - (setq files (gethash project-root projectile-projects-cache))) - - ;; Calculate the list of files. - (when (null files) - (when projectile-enable-caching - (message "Projectile is initializing cache for %s ..." project-root)) - (setq files - (if (eq projectile-indexing-method 'alien) - ;; In alien mode we can just skip reading - ;; .projectile and find all files in the root dir. - (projectile-dir-files-alien project-root) - ;; If a project is defined as a list of subfolders - ;; then we'll have the files returned for each subfolder, - ;; so they are relative to the project root. - ;; - ;; TODO: That's pretty slow and we need to improve it. - ;; One options would be to pass explicitly the subdirs - ;; to commands like `git ls-files` which would return - ;; files paths relative to the project root. - (cl-mapcan - (lambda (dir) - (mapcar (lambda (f) - (file-relative-name (concat dir f) - project-root)) - (projectile-dir-files dir))) - (projectile-get-project-directories project-root)))) - - ;; Save the cached list. - (when projectile-enable-caching - (projectile-cache-project project-root files))) - - ;;; Sorting - ;; - ;; Files can't be cached in sorted order as some sorting schemes - ;; require dynamic data. Sorting is ignored completely when in - ;; alien mode. - (if (eq projectile-indexing-method 'alien) - files - (projectile-sort-files files)))) - -(defun projectile-current-project-files () - "Return a list of the files in the current project." - (projectile-project-files (projectile-project-root))) - -(defun projectile-process-current-project-files (action) - "Process the current project's files using ACTION." - (let ((project-files (projectile-current-project-files)) - (default-directory (projectile-project-root))) - (dolist (filename project-files) - (funcall action filename)))) - -(defun projectile-project-dirs (project) - "Return a list of dirs for PROJECT." - (delete-dups - (delq nil - (mapcar #'file-name-directory - (projectile-project-files project))))) - -(defun projectile-current-project-dirs () - "Return a list of dirs for the current project." - (projectile-project-dirs (projectile-ensure-project (projectile-project-root)))) - -(defun projectile-get-other-files (file-name &optional flex-matching) - "Return a list of other files for FILE-NAME. -The list depends on `:related-files-fn' project option and -`projectile-other-file-alist'. For the latter, FLEX-MATCHING can be used -to match any basename." - (if-let ((plist (projectile--related-files-plist-by-kind file-name :other))) - (projectile--related-files-from-plist plist) - (projectile--other-extension-files file-name - (projectile-current-project-files) - flex-matching))) - -(defun projectile--find-other-file (&optional flex-matching ff-variant) - "Switch between files with the same name but different extensions. -With FLEX-MATCHING, match any file that contains the base name of current file. -Other file extensions can be customized with the variable -`projectile-other-file-alist'. With FF-VARIANT set to a defun, use that -instead of `find-file'. A typical example of such a defun would be -`find-file-other-window' or `find-file-other-frame'" - (let ((ff (or ff-variant #'find-file)) - (other-files (projectile-get-other-files (buffer-file-name) flex-matching))) - (if other-files - (let ((file-name (projectile--choose-from-candidates other-files))) - (funcall ff (expand-file-name file-name - (projectile-project-root)))) - (error "No other file found")))) - - -;;; Interactive commands -;;;###autoload -(defun projectile-find-other-file (&optional flex-matching) - "Switch between files with the same name but different extensions. -With FLEX-MATCHING, match any file that contains the base name of current file. -Other file extensions can be customized with the variable `projectile-other-file-alist'." - (interactive "P") - (projectile--find-other-file flex-matching)) - -;;;###autoload -(defun projectile-find-other-file-other-window (&optional flex-matching) - "Switch between files with the same name but different extensions in other window. -With FLEX-MATCHING, match any file that contains the base name of current file. -Other file extensions can be customized with the variable `projectile-other-file-alist'." - (interactive "P") - (projectile--find-other-file flex-matching - #'find-file-other-window)) - -;;;###autoload -(defun projectile-find-other-file-other-frame (&optional flex-matching) - "Switch between files with the same name but different extensions in other window. -With FLEX-MATCHING, match any file that contains the base name of current file. -Other file extensions can be customized with the variable `projectile-other-file-alist'." - (interactive "P") - (projectile--find-other-file flex-matching - #'find-file-other-frame)) - -(defun projectile--file-name-sans-extensions (file-name) - "Return FILE-NAME sans any extensions. -The extensions, in a filename, are what follows the first '.', with the exception of a leading '.'" - (setq file-name (file-name-nondirectory file-name)) - (substring file-name 0 (string-match "\\..*" file-name 1))) - -(defun projectile--file-name-extensions (file-name) - "Return FILE-NAME's extensions. -The extensions, in a filename, are what follows the first '.', with the exception of a leading '.'" - ;;would it make sense to return nil instead of an empty string if no extensions are found? - (setq file-name (file-name-nondirectory file-name)) - (let (extensions-start) - (substring file-name - (if (setq extensions-start (string-match "\\..*" file-name 1)) - (1+ extensions-start) - (length file-name))))) - -(defun projectile-associated-file-name-extensions (file-name) - "Return projectile-other-file-extensions associated to FILE-NAME's extensions. -If no associated other-file-extensions for the complete (nested) extension are found, remove subextensions from FILENAME's extensions until a match is found." - (let ((current-extensions (projectile--file-name-extensions (file-name-nondirectory file-name))) - associated-extensions) - (catch 'break - (while (not (string= "" current-extensions)) - (if (setq associated-extensions (cdr (assoc current-extensions projectile-other-file-alist))) - (throw 'break associated-extensions)) - (setq current-extensions (projectile--file-name-extensions current-extensions)))))) - -(defun projectile--other-extension-files (current-file project-file-list &optional flex-matching) - "Narrow to files with the same names but different extensions. -Returns a list of possible files for users to choose. - -With FLEX-MATCHING, match any file that contains the base name of current file" - (let* ((file-ext-list (projectile-associated-file-name-extensions current-file)) - (fulldirname (if (file-name-directory current-file) - (file-name-directory current-file) "./")) - (dirname (file-name-nondirectory (directory-file-name fulldirname))) - (filename (regexp-quote (projectile--file-name-sans-extensions current-file))) - (file-list (mapcar (lambda (ext) - (if flex-matching - (concat ".*" filename ".*" "\." ext "\\'") - (concat "^" filename - (unless (equal ext "") - (concat "\." ext)) - "\\'"))) - file-ext-list)) - (candidates (cl-remove-if-not - (lambda (project-file) - (string-match filename project-file)) - project-file-list)) - (candidates - (projectile-flatten (mapcar - (lambda (file) - (cl-remove-if-not - (lambda (project-file) - (string-match file - (concat (file-name-base project-file) - (unless (equal (file-name-extension project-file) nil) - (concat "\." (file-name-extension project-file)))))) - candidates)) - file-list))) - (candidates - (cl-remove-if-not (lambda (file) (not (backup-file-name-p file))) candidates)) - (candidates - (cl-sort (copy-sequence candidates) - (lambda (file _) - (let ((candidate-dirname (file-name-nondirectory (directory-file-name (file-name-directory file))))) - (unless (equal fulldirname (file-name-directory file)) - (equal dirname candidate-dirname))))))) - candidates)) - -(defun projectile-select-files (project-files &optional invalidate-cache) - "Select a list of files based on filename at point. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first." - (projectile-maybe-invalidate-cache invalidate-cache) - (let* ((file (if (region-active-p) - (buffer-substring (region-beginning) (region-end)) - (or (thing-at-point 'filename) ""))) - (file (if (string-match "\\.?\\./" file) - (file-relative-name (file-truename file) (projectile-project-root)) - file)) - (files (if file - (cl-remove-if-not - (lambda (project-file) - (string-match file project-file)) - project-files) - nil))) - files)) - -(defun projectile--find-file-dwim (invalidate-cache &optional ff-variant) - "Jump to a project's files using completion based on context. - -With a INVALIDATE-CACHE invalidates the cache first. - -With FF-VARIANT set to a defun, use that instead of `find-file'. -A typical example of such a defun would be `find-file-other-window' or -`find-file-other-frame' - -Subroutine for `projectile-find-file-dwim' and -`projectile-find-file-dwim-other-window'" - (let* ((project-root (projectile-project-root)) - (project-files (projectile-project-files project-root)) - (files (projectile-select-files project-files invalidate-cache)) - (file (cond ((= (length files) 1) - (car files)) - ((> (length files) 1) - (projectile-completing-read "Switch to: " files)) - (t - (projectile-completing-read "Switch to: " project-files)))) - (ff (or ff-variant #'find-file))) - (funcall ff (expand-file-name file project-root)) - (run-hooks 'projectile-find-file-hook))) - -;;;###autoload -(defun projectile-find-file-dwim (&optional invalidate-cache) - "Jump to a project's files using completion based on context. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first. - -If point is on a filename, Projectile first tries to search for that -file in project: - -- If it finds just a file, it switches to that file instantly. This works even -if the filename is incomplete, but there's only a single file in the current project -that matches the filename at point. For example, if there's only a single file named -\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete), -`projectile-find-file-dwim' still switches to \"projectile/projectile.el\" immediately - because this is the only filename that matches. - -- If it finds a list of files, the list is displayed for selecting. A list of -files is displayed when a filename appears more than one in the project or the -filename at point is a prefix of more than two files in a project. For example, -if `projectile-find-file-dwim' is executed on a filepath like \"projectile/\", it lists -the content of that directory. If it is executed on a partial filename like - \"projectile/a\", a list of files with character 'a' in that directory is presented. - -- If it finds nothing, display a list of all files in project for selecting." - (interactive "P") - (projectile--find-file-dwim invalidate-cache)) - -;;;###autoload -(defun projectile-find-file-dwim-other-window (&optional invalidate-cache) - "Jump to a project's files using completion based on context in other window. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first. - -If point is on a filename, Projectile first tries to search for that -file in project: - -- If it finds just a file, it switches to that file instantly. This works even -if the filename is incomplete, but there's only a single file in the current project -that matches the filename at point. For example, if there's only a single file named -\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete), -`projectile-find-file-dwim-other-window' still switches to \"projectile/projectile.el\" -immediately because this is the only filename that matches. - -- If it finds a list of files, the list is displayed for selecting. A list of -files is displayed when a filename appears more than one in the project or the -filename at point is a prefix of more than two files in a project. For example, -if `projectile-find-file-dwim-other-window' is executed on a filepath like \"projectile/\", it lists -the content of that directory. If it is executed on a partial filename -like \"projectile/a\", a list of files with character 'a' in that directory -is presented. - -- If it finds nothing, display a list of all files in project for selecting." - (interactive "P") - (projectile--find-file-dwim invalidate-cache #'find-file-other-window)) - -;;;###autoload -(defun projectile-find-file-dwim-other-frame (&optional invalidate-cache) - "Jump to a project's files using completion based on context in other frame. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first. - -If point is on a filename, Projectile first tries to search for that -file in project: - -- If it finds just a file, it switches to that file instantly. This works even -if the filename is incomplete, but there's only a single file in the current project -that matches the filename at point. For example, if there's only a single file named -\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete), -`projectile-find-file-dwim-other-frame' still switches to \"projectile/projectile.el\" -immediately because this is the only filename that matches. - -- If it finds a list of files, the list is displayed for selecting. A list of -files is displayed when a filename appears more than one in the project or the -filename at point is a prefix of more than two files in a project. For example, -if `projectile-find-file-dwim-other-frame' is executed on a filepath like \"projectile/\", it lists -the content of that directory. If it is executed on a partial filename -like \"projectile/a\", a list of files with character 'a' in that directory -is presented. - -- If it finds nothing, display a list of all files in project for selecting." - (interactive "P") - (projectile--find-file-dwim invalidate-cache #'find-file-other-frame)) - -(defun projectile--find-file (invalidate-cache &optional ff-variant) - "Jump to a project's file using completion. -With INVALIDATE-CACHE invalidates the cache first. With FF-VARIANT set to a -defun, use that instead of `find-file'. A typical example of such a defun -would be `find-file-other-window' or `find-file-other-frame'" - (interactive "P") - (projectile-maybe-invalidate-cache invalidate-cache) - (let* ((project-root (projectile-ensure-project (projectile-project-root))) - (file (projectile-completing-read "Find file: " - (projectile-project-files project-root))) - (ff (or ff-variant #'find-file))) - (when file - (funcall ff (expand-file-name file project-root)) - (run-hooks 'projectile-find-file-hook)))) - -;;;###autoload -(defun projectile-find-file (&optional invalidate-cache) - "Jump to a project's file using completion. -With a prefix arg INVALIDATE-CACHE invalidates the cache first." - (interactive "P") - (projectile--find-file invalidate-cache)) - -;;;###autoload -(defun projectile-find-file-other-window (&optional invalidate-cache) - "Jump to a project's file using completion and show it in another window. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first." - (interactive "P") - (projectile--find-file invalidate-cache #'find-file-other-window)) - -;;;###autoload -(defun projectile-find-file-other-frame (&optional invalidate-cache) - "Jump to a project's file using completion and show it in another frame. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first." - (interactive "P") - (projectile--find-file invalidate-cache #'find-file-other-frame)) - -;;;###autoload -(defun projectile-toggle-project-read-only () - "Toggle project read only." - (interactive) - (let ((inhibit-read-only t) - (val (not buffer-read-only)) - (default-directory (projectile-ensure-project (projectile-project-root)))) - (add-dir-local-variable nil 'buffer-read-only val) - (save-buffer) - (kill-buffer) - (when buffer-file-name - (read-only-mode (if val +1 -1)) - (message "[%s] read-only-mode is %s" (projectile-project-name) (if val "on" "off"))))) - - -;;;; Sorting project files -(defun projectile-sort-files (files) - "Sort FILES according to `projectile-sort-order'." - (cl-case projectile-sort-order - (default files) - (recentf (projectile-sort-by-recentf-first files)) - (recently-active (projectile-sort-by-recently-active-first files)) - (modification-time (projectile-sort-by-modification-time files)) - (access-time (projectile-sort-by-access-time files)))) - -(defun projectile-sort-by-recentf-first (files) - "Sort FILES by a recent first scheme." - (let ((project-recentf-files (projectile-recentf-files))) - (append project-recentf-files - (projectile-difference files project-recentf-files)))) - -(defun projectile-sort-by-recently-active-first (files) - "Sort FILES by most recently active buffers or opened files." - (let ((project-recently-active-files (projectile-recently-active-files))) - (append project-recently-active-files - (projectile-difference files project-recently-active-files)))) - -(defun projectile-sort-by-modification-time (files) - "Sort FILES by modification time." - (let ((default-directory (projectile-project-root))) - (cl-sort - (copy-sequence files) - (lambda (file1 file2) - (let ((file1-mtime (nth 5 (file-attributes file1))) - (file2-mtime (nth 5 (file-attributes file2)))) - (not (time-less-p file1-mtime file2-mtime))))))) - -(defun projectile-sort-by-access-time (files) - "Sort FILES by access time." - (let ((default-directory (projectile-project-root))) - (cl-sort - (copy-sequence files) - (lambda (file1 file2) - (let ((file1-atime (nth 4 (file-attributes file1))) - (file2-atime (nth 4 (file-attributes file2)))) - (not (time-less-p file1-atime file2-atime))))))) - - -;;;; Find directory in project functionality -(defun projectile--find-dir (invalidate-cache &optional dired-variant) - "Jump to a project's directory using completion. - -With INVALIDATE-CACHE invalidates the cache first. With DIRED-VARIANT set to a -defun, use that instead of `dired'. A typical example of such a defun would be -`dired-other-window' or `dired-other-frame'" - (projectile-maybe-invalidate-cache invalidate-cache) - (let* ((project (projectile-ensure-project (projectile-project-root))) - (dir (projectile-complete-dir project)) - (dired-v (or dired-variant #'dired))) - (funcall dired-v (expand-file-name dir project)) - (run-hooks 'projectile-find-dir-hook))) - -;;;###autoload -(defun projectile-find-dir (&optional invalidate-cache) - "Jump to a project's directory using completion. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first." - (interactive "P") - (projectile--find-dir invalidate-cache)) - -;;;###autoload -(defun projectile-find-dir-other-window (&optional invalidate-cache) - "Jump to a project's directory in other window using completion. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first." - (interactive "P") - (projectile--find-dir invalidate-cache #'dired-other-window)) - -;;;###autoload -(defun projectile-find-dir-other-frame (&optional invalidate-cache) - "Jump to a project's directory in other window using completion. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first." - (interactive "P") - (projectile--find-dir invalidate-cache #'dired-other-frame)) - -(defun projectile-complete-dir (project) - (let ((project-dirs (projectile-project-dirs project))) - (projectile-completing-read - "Find dir: " - (if projectile-find-dir-includes-top-level - (append '("./") project-dirs) - project-dirs)))) - -;;;###autoload -(defun projectile-find-test-file (&optional invalidate-cache) - "Jump to a project's test file using completion. - -With a prefix arg INVALIDATE-CACHE invalidates the cache first." - (interactive "P") - (projectile-maybe-invalidate-cache invalidate-cache) - (let ((file (projectile-completing-read "Find test file: " - (projectile-current-project-test-files)))) - (find-file (expand-file-name file (projectile-project-root))))) - -(defun projectile-test-files (files) - "Return only the test FILES." - (cl-remove-if-not 'projectile-test-file-p files)) - -(defun projectile--merge-related-files-fns (related-files-fns) - "Merge multiple RELATED-FILES-FNS into one function." - (lambda (path) - (let (merged-plist) - (dolist (fn related-files-fns merged-plist) - (let ((plist (funcall fn path))) - (cl-loop for (key value) on plist by #'cddr - do (let ((values (if (consp value) value (list value)))) - (if (plist-member merged-plist key) - (nconc (plist-get merged-plist key) values) - (setq merged-plist (plist-put merged-plist key values)))))))))) - -(defun projectile--related-files-plist (project-root file) - "Return a plist containing all related files information for FILE in PROJECT-ROOT." - (if-let ((rel-path (if (file-name-absolute-p file) - (file-relative-name file project-root) - file)) - (custom-function (funcall projectile-related-files-fn-function (projectile-project-type)))) - (funcall (cond ((functionp custom-function) - custom-function) - ((consp custom-function) - (projectile--merge-related-files-fns custom-function)) - (t - (error "Unsupported value type of :related-files-fn"))) - rel-path))) - -(defun projectile--related-files-plist-by-kind (file kind) - "Return a plist containing :paths and/or :predicate of KIND for FILE." - (if-let ((project-root (projectile-project-root)) - (plist (projectile--related-files-plist project-root file)) - (has-kind? (plist-member plist kind))) - (let* ((kind-value (plist-get plist kind)) - (values (if (cl-typep kind-value '(or string function)) - (list kind-value) - kind-value)) - (paths (delete-dups (cl-remove-if-not 'stringp values))) - (predicates (delete-dups (cl-remove-if-not 'functionp values)))) - (append - ;; Make sure that :paths exists even with nil if there is no predicates - (when (or paths (null predicates)) - (list :paths (cl-remove-if-not - (lambda (f) - (projectile-file-exists-p (expand-file-name f project-root))) - paths))) - (when predicates - (list :predicate (if (= 1 (length predicates)) - (car predicates) - (lambda (other-file) - (cl-some (lambda (predicate) - (funcall predicate other-file)) - predicates))))))))) - -(defun projectile--related-files-from-plist (plist) - "Return a list of files matching to PLIST from current project files." - (let* ((predicate (plist-get plist :predicate)) - (paths (plist-get plist :paths))) - (delete-dups (append - paths - (when predicate - (cl-remove-if-not predicate (projectile-current-project-files))))))) - -(defun projectile--related-files-kinds(file) - "Return a list o keywords meaning available related kinds for FILE." - (if-let ((project-root (projectile-project-root)) - (plist (projectile--related-files-plist project-root file))) - (cl-loop for key in plist by #'cddr - collect key))) - -(defun projectile--related-files (file kind) - "Return a list of related files of KIND for FILE." - (projectile--related-files-from-plist (projectile--related-files-plist-by-kind file kind))) - -(defun projectile--find-related-file (file &optional kind) - "Choose a file from files related to FILE as KIND. -If KIND is not provided, a list of possible kinds can be chosen." - (unless kind - (if-let ((available-kinds (projectile--related-files-kinds file))) - (setq kind (if (= (length available-kinds) 1) - (car available-kinds) - (intern (projectile-completing-read "Kind :" available-kinds)))) - (error "No related files found"))) - - (if-let ((candidates (projectile--related-files file kind))) - (projectile-expand-root (projectile--choose-from-candidates candidates)) - (error - "No matching related file as `%s' found for project type `%s'" - kind (projectile-project-type)))) - -;;;###autoload -(defun projectile-find-related-file-other-window () - "Open related file in other window." - (interactive) - (find-file-other-window - (projectile--find-related-file (buffer-file-name)))) - -;;;###autoload -(defun projectile-find-related-file-other-frame () - "Open related file in other frame." - (interactive) - (find-file-other-frame - (projectile--find-related-file (buffer-file-name)))) - -;;;###autoload -(defun projectile-find-related-file() - "Open related file." - (interactive) - (find-file - (projectile--find-related-file (buffer-file-name)))) - -;;;###autoload -(defun projectile-related-files-fn-groups(kind groups) - "Generate a related-files-fn which relates as KIND for files in each of GROUPS." - (lambda (path) - (if-let ((group-found (cl-find-if (lambda (group) - (member path group)) - groups))) - (list kind (cl-remove path group-found :test 'equal))))) - -;;;###autoload -(defun projectile-related-files-fn-extensions(kind extensions) - "Generate a related-files-fn which relates as KIND for files having EXTENSIONS." - (lambda (path) - (let* ((ext (file-name-extension path)) - (basename (file-name-base path)) - (basename-regexp (regexp-quote basename))) - (when (member ext extensions) - (list kind (lambda (other-path) - (and (string-match-p basename-regexp other-path) - (equal basename (file-name-base other-path)) - (let ((other-ext (file-name-extension other-path))) - (and (member other-ext extensions) - (not (equal other-ext ext))))))))))) - -;;;###autoload -(defun projectile-related-files-fn-test-with-prefix(extension test-prefix) - "Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-PREFIX." - (lambda (path) - (when (equal (file-name-extension path) extension) - (let* ((file-name (file-name-nondirectory path)) - (find-impl? (string-prefix-p test-prefix file-name)) - (file-name-to-find (if find-impl? - (substring file-name (length test-prefix)) - (concat test-prefix file-name)))) - (list (if find-impl? :impl :test) - (lambda (other-path) - (and (string-suffix-p file-name-to-find other-path) - (equal (file-name-nondirectory other-path) file-name-to-find)))))))) - -;;;###autoload -(defun projectile-related-files-fn-test-with-suffix(extension test-suffix) - "Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-SUFFIX." - (lambda (path) - (when (equal (file-name-extension path) extension) - (let* ((file-name (file-name-nondirectory path)) - (dot-ext (concat "." extension)) - (suffix-ext (concat test-suffix dot-ext)) - (find-impl? (string-suffix-p suffix-ext file-name)) - (file-name-to-find (if find-impl? - (concat (substring file-name 0 (- (length suffix-ext))) - dot-ext) - (concat (substring file-name 0 (- (length dot-ext))) - suffix-ext)))) - (list (if find-impl? :impl :test) - (lambda (other-path) - (and (string-suffix-p file-name-to-find other-path) - (equal (file-name-nondirectory other-path) file-name-to-find)))))))) - -(defun projectile-test-file-p (file) - "Check if FILE is a test file." - (let ((kinds (projectile--related-files-kinds file))) - (cond ((member :impl kinds) t) - ((member :test kinds) nil) - (t (or (cl-some (lambda (pat) (string-prefix-p pat (file-name-nondirectory file))) - (delq nil (list (funcall projectile-test-prefix-function (projectile-project-type))))) - (cl-some (lambda (pat) (string-suffix-p pat (file-name-sans-extension (file-name-nondirectory file)))) - (delq nil (list (funcall projectile-test-suffix-function (projectile-project-type)))))))))) - -(defun projectile-current-project-test-files () - "Return a list of test files for the current project." - (projectile-test-files (projectile-current-project-files))) - -(defvar projectile-project-types nil - "An alist holding all project types that are known to Projectile. -The project types are symbols and they are linked to plists holding -the properties of the various project types.") - -(cl-defun projectile-register-project-type - (project-type marker-files &key compilation-dir configure compile test run test-suffix test-prefix src-dir test-dir related-files-fn) - "Register a project type with projectile. - -A project type is defined by PROJECT-TYPE, a set of MARKER-FILES, -and optional keyword arguments: -COMPILATION-DIR the directory to run the tests- and compilations in, -CONFIGURE which specifies a command that configures the project - `%s' in the command will be substituted with (projectile-project-root) - before the command is run, -COMPILE which specifies a command that builds the project, -TEST which specified a command that tests the project, -RUN which specifies a command that runs the project, -TEST-SUFFIX which specifies test file suffix, and -TEST-PREFIX which specifies test file prefix. -SRC-DIR which specifies the path to the source relative to the project root. -TEST-DIR which specifies the path to the tests relative to the project root. -RELATED-FILES-FN which specifies a custom function to find the related files such as -test/impl/other files as below: - CUSTOM-FUNCTION accepts FILE as relative path from the project root and returns - a plist containing :test, :impl or :other as key and the relative path/paths or - predicate as value. PREDICATE accepts a relative path as the input." - (let ((project-plist (list 'marker-files marker-files - 'compilation-dir compilation-dir - 'configure-command configure - 'compile-command compile - 'test-command test - 'run-command run))) - ;; There is no way for the function to distinguish between an - ;; explicit argument of nil and an omitted argument. However, the - ;; body of the function is free to consider nil an abbreviation - ;; for some other meaningful value - (when test-suffix - (plist-put project-plist 'test-suffix test-suffix)) - (when test-prefix - (plist-put project-plist 'test-prefix test-prefix)) - (when src-dir - (plist-put project-plist 'src-dir src-dir)) - (when test-dir - (plist-put project-plist 'test-dir test-dir)) - (when related-files-fn - (plist-put project-plist 'related-files-fn related-files-fn)) - - (setq projectile-project-types - (cons `(,project-type . ,project-plist) - projectile-project-types)))) - -(defun projectile-cabal-project-p () - "Check if a project contains *.cabal files but no stack.yaml file." - (and (projectile-verify-file-wildcard "?*.cabal") - (not (projectile-verify-file "stack.yaml")))) - -(defun projectile-dotnet-project-p () - (or (projectile-verify-file-wildcard "?*.csproj") - (projectile-verify-file-wildcard "?*.fsproj"))) - -(defun projectile-go-project-p () - "Check if a project contains Go source files." - (or (projectile-verify-file "go.mod") - (projectile-verify-file-wildcard "*.go"))) - -(define-obsolete-variable-alias 'projectile-go-function 'projectile-go-project-test-function "1.0.0") -(defcustom projectile-go-project-test-function #'projectile-go-project-p - "Function to determine if project's type is go." - :group 'projectile - :type 'function) - -;;; Project type registration -;; -;; Project type detection happens in a reverse order with respect to -;; project type registration (invocations of `projectile-register-project-type'). -;; -;; As function-based project type detection is pretty slow, so it -;; should be tried at the end if everything else failed (meaning here -;; it should be listed first). -;; -;; Ideally common project types should be checked earlier than exotic ones. - -;; Function-based detection project type -(projectile-register-project-type 'haskell-cabal #'projectile-cabal-project-p - :compile "cabal build" - :test "cabal test" - :run "cabal run" - :test-suffix "Spec") -(projectile-register-project-type 'dotnet #'projectile-dotnet-project-p - :compile "dotnet build" - :run "dotnet run" - :test "dotnet test") -(projectile-register-project-type 'go projectile-go-project-test-function - :compile "go build" - :test "go test ./..." - :test-suffix "_test") -;; File-based detection project types - -;; Universal -(projectile-register-project-type 'scons '("SConstruct") - :compile "scons" - :test "scons test" - :test-suffix "test") -(projectile-register-project-type 'meson '("meson.build") - :compilation-dir "build" - :configure "meson %s" - :compile "ninja" - :test "ninja test") -(projectile-register-project-type 'nix '("default.nix") - :compile "nix-build" - :test "nix-build") -;; Make & CMake -(projectile-register-project-type 'make '("Makefile") - :compile "make" - :test "make test") -(projectile-register-project-type 'cmake '("CMakeLists.txt") - :compilation-dir "build" - :configure "cmake %s -B %s" - :compile "cmake --build ." - :test "ctest") -;; PHP -(projectile-register-project-type 'php-symfony '("composer.json" "app" "src" "vendor") - :compile "app/console server:run" - :test "phpunit -c app " - :test-suffix "Test") -;; Erlang & Elixir -(projectile-register-project-type 'rebar '("rebar.config") - :compile "rebar" - :test "rebar eunit" - :test-suffix "_SUITE") -(projectile-register-project-type 'elixir '("mix.exs") - :compile "mix compile" - :src-dir "lib/" - :test "mix test" - :test-suffix "_test") -;; JavaScript -(projectile-register-project-type 'grunt '("Gruntfile.js") - :compile "grunt" - :test "grunt test") -(projectile-register-project-type 'gulp '("gulpfile.js") - :compile "gulp" - :test "gulp test") -(projectile-register-project-type 'npm '("package.json") - :compile "npm install" - :test "npm test" - :test-suffix ".test") -;; Angular -(projectile-register-project-type 'angular '("angular.json" ".angular-cli.json") - :compile "ng build" - :run "ng serve" - :test "ng test") -;; Python -(projectile-register-project-type 'django '("manage.py") - :compile "python manage.py runserver" - :test "python manage.py test" - :test-prefix "test_" - :test-suffix"_test") -(projectile-register-project-type 'python-pip '("requirements.txt") - :compile "python setup.py build" - :test "python -m unittest discover" - :test-prefix "test_" - :test-suffix"_test") -(projectile-register-project-type 'python-pkg '("setup.py") - :compile "python setup.py build" - :test "python -m unittest discover" - :test-prefix "test_" - :test-suffix"_test") -(projectile-register-project-type 'python-tox '("tox.ini") - :compile "tox -r --notest" - :test "tox" - :test-prefix "test_" - :test-suffix"_test") -(projectile-register-project-type 'python-pipenv '("Pipfile") - :compile "pipenv run build" - :test "pipenv run test" - :test-prefix "test_" - :test-suffix "_test") -;; Java & friends -(projectile-register-project-type 'maven '("pom.xml") - :compile "mvn clean install" - :test "mvn test" - :test-suffix "Test" - :src-dir "main/src/" - :test-dir "main/test/") -(projectile-register-project-type 'gradle '("build.gradle") - :compile "gradle build" - :test "gradle test" - :test-suffix "Spec") -(projectile-register-project-type 'gradlew '("gradlew") - :compile "./gradlew build" - :test "./gradlew test" - :test-suffix "Spec") -(projectile-register-project-type 'grails '("application.properties" "grails-app") - :compile "grails package" - :test "grails test-app" - :test-suffix "Spec") -(projectile-register-project-type 'sbt '("build.sbt") - :compile "sbt compile" - :test "sbt test" - :test-suffix "Spec") -(projectile-register-project-type 'lein-test '("project.clj") - :compile "lein compile" - :test "lein test" - :test-suffix "_test") -(projectile-register-project-type 'lein-midje '("project.clj" ".midje.clj") - :compile "lein compile" - :test "lein midje" - :test-prefix "t_") -(projectile-register-project-type 'boot-clj '("build.boot") - :compile "boot aot" - :test "boot test" - :test-suffix "_test") -(projectile-register-project-type 'clojure-cli '("deps.edn") - :test-suffix "_test") -(projectile-register-project-type 'bloop '(".bloop") - :compile "bloop compile root" - :test "bloop test --propagate --reporter scalac root" - :src-dir "src/main/" - :test-dir "src/test/" - :test-suffix "Spec") -;; Ruby -(projectile-register-project-type 'ruby-rspec '("Gemfile" "lib" "spec") - :compile "bundle exec rake" - :src-dir "lib/" - :test "bundle exec rspec" - :test-dir "spec/" - :test-suffix "_spec") -(projectile-register-project-type 'ruby-test '("Gemfile" "lib" "test") - :compile"bundle exec rake" - :src-dir "lib/" - :test "bundle exec rake test" - :test-suffix "_test") -;; Rails needs to be registered after npm, otherwise `package.json` makes it `npm`. -;; https://github.com/bbatsov/projectile/pull/1191 -(projectile-register-project-type 'rails-test '("Gemfile" "app" "lib" "db" "config" "test") - :compile "bundle exec rails server" - :src-dir "lib/" - :test "bundle exec rake test" - :test-suffix "_test") -(projectile-register-project-type 'rails-rspec '("Gemfile" "app" "lib" "db" "config" "spec") - :compile "bundle exec rails server" - :src-dir "lib/" - :test "bundle exec rspec" - :test-dir "spec/" - :test-suffix "_spec") -;; Crystal -(projectile-register-project-type 'crystal-spec '("shard.yml") - :src-dir "src/" - :test "crystal spec" - :test-dir "spec/" - :test-suffix "_spec") - -;; Emacs -(projectile-register-project-type 'emacs-cask '("Cask") - :compile "cask install" - :test-prefix "test-" - :test-suffix "-test") - -;; R -(projectile-register-project-type 'r '("DESCRIPTION") - :compile "R CMD INSTALL --with-keep.source ." - :test (concat "R CMD check -o " temporary-file-directory " .")) - -;; Haskell -(projectile-register-project-type 'haskell-stack '("stack.yaml") - :compile "stack build" - :test "stack build --test" - :test-suffix "Spec") - -;; Rust -(projectile-register-project-type 'rust-cargo '("Cargo.toml") - :compile "cargo build" - :test "cargo test" - :run "cargo run") - -;; Racket -(projectile-register-project-type 'racket '("info.rkt") - :test "raco test .") - - -(defvar-local projectile-project-type nil - "Buffer local var for overriding the auto-detected project type. -Normally you'd set this from .dir-locals.el.") -(put 'projectile-project-type 'safe-local-variable #'symbolp) - -(defun projectile-detect-project-type () - "Detect the type of the current project. -Fallsback to a generic project type when the type can't be determined." - (let ((project-type - (or (car (cl-find-if - (lambda (project-type-record) - (let ((project-type (car project-type-record)) - (marker (plist-get (cdr project-type-record) 'marker-files))) - (if (listp marker) - (and (projectile-verify-files marker) project-type) - (and (funcall marker) project-type)))) - projectile-project-types)) - 'generic))) - (puthash (projectile-project-root) project-type projectile-project-type-cache) - project-type)) - -(defun projectile-project-type (&optional dir) - "Determine a project's type based on its structure. -When DIR is specified it checks it, otherwise it acts -on the current project. - -The project type is cached for improved performance." - (if projectile-project-type - projectile-project-type - (let* ((dir (or dir default-directory)) - (project-root (projectile-project-root dir))) - (if project-root - (or (gethash project-root projectile-project-type-cache) - (projectile-detect-project-type)) - ;; if we're not in a project we just return nil - nil)))) - -;;;###autoload -(defun projectile-project-info () - "Display info for current project." - (interactive) - (message "Project dir: %s ## Project VCS: %s ## Project type: %s" - (projectile-project-root) - (projectile-project-vcs) - (projectile-project-type))) - -(defun projectile-verify-files (files) - "Check whether all FILES exist in the current project." - (cl-every #'projectile-verify-file files)) - -(defun projectile-verify-file (file) - "Check whether FILE exists in the current project." - (file-exists-p (projectile-expand-root file))) - -(defun projectile-verify-file-wildcard (file) - "Check whether FILE exists in the current project. -Expands wildcards using `file-expand-wildcards' before checking." - (file-expand-wildcards (projectile-expand-root file))) - -(defun projectile-project-vcs (&optional project-root) - "Determine the VCS used by the project if any. -PROJECT-ROOT is the targeted directory. If nil, use -`projectile-project-root'." - (or project-root (setq project-root (projectile-project-root))) - (cond - ((projectile-file-exists-p (expand-file-name ".git" project-root)) 'git) - ((projectile-file-exists-p (expand-file-name ".hg" project-root)) 'hg) - ((projectile-file-exists-p (expand-file-name ".fslckout" project-root)) 'fossil) - ((projectile-file-exists-p (expand-file-name "_FOSSIL_" project-root)) 'fossil) - ((projectile-file-exists-p (expand-file-name ".bzr" project-root)) 'bzr) - ((projectile-file-exists-p (expand-file-name "_darcs" project-root)) 'darcs) - ((projectile-file-exists-p (expand-file-name ".svn" project-root)) 'svn) - ((projectile-locate-dominating-file project-root ".git") 'git) - ((projectile-locate-dominating-file project-root ".hg") 'hg) - ((projectile-locate-dominating-file project-root ".fslckout") 'fossil) - ((projectile-locate-dominating-file project-root "_FOSSIL_") 'fossil) - ((projectile-locate-dominating-file project-root ".bzr") 'bzr) - ((projectile-locate-dominating-file project-root "_darcs") 'darcs) - ((projectile-locate-dominating-file project-root ".svn") 'svn) - (t 'none))) - -(defun projectile--test-name-for-impl-name (impl-file-path) - "Determine the name of the test file for IMPL-FILE-PATH." - (let* ((project-type (projectile-project-type)) - (impl-file-name (file-name-sans-extension (file-name-nondirectory impl-file-path))) - (impl-file-ext (file-name-extension impl-file-path)) - (test-prefix (funcall projectile-test-prefix-function project-type)) - (test-suffix (funcall projectile-test-suffix-function project-type))) - (cond - (test-prefix (concat test-prefix impl-file-name "." impl-file-ext)) - (test-suffix (concat impl-file-name test-suffix "." impl-file-ext)) - (t (error "Project type `%s' not supported!" project-type))))) - -(defun projectile-create-test-file-for (impl-file-path) - "Create a test file for IMPL-FILE-PATH." - (let* ((test-file (projectile--test-name-for-impl-name impl-file-path)) - (project-root (projectile-project-root)) - (relative-dir (file-name-directory (file-relative-name impl-file-path project-root))) - (src-dir-name (projectile-src-directory (projectile-project-type))) - (test-dir-name (projectile-test-directory (projectile-project-type))) - (test-dir (expand-file-name (replace-regexp-in-string src-dir-name test-dir-name relative-dir) project-root)) - (test-path (expand-file-name test-file test-dir))) - (unless (file-exists-p test-path) - (progn (unless (file-exists-p test-dir) - (make-directory test-dir :create-parents)) - test-path)))) - -(defun projectile-find-implementation-or-test (file-name) - "Given a FILE-NAME return the matching implementation or test filename. - -If `projectile-create-missing-test-files' is non-nil, create the missing -test file." - (unless file-name (error "The current buffer is not visiting a file")) - (if (projectile-test-file-p file-name) - ;; find the matching impl file - (let ((impl-file (projectile-find-matching-file file-name))) - (if impl-file - (projectile-expand-root impl-file) - (error - "No matching source file found for project type `%s'" - (projectile-project-type)))) - ;; find the matching test file - (let ((test-file (projectile-find-matching-test file-name))) - (if test-file - (projectile-expand-root test-file) - (if projectile-create-missing-test-files - (projectile-create-test-file-for file-name) - (error "No matching test file found for project type `%s'" - (projectile-project-type))))))) - -;;;###autoload -(defun projectile-find-implementation-or-test-other-window () - "Open matching implementation or test file in other window." - (interactive) - (find-file-other-window - (projectile-find-implementation-or-test (buffer-file-name)))) - -;;;###autoload -(defun projectile-find-implementation-or-test-other-frame () - "Open matching implementation or test file in other frame." - (interactive) - (find-file-other-frame - (projectile-find-implementation-or-test (buffer-file-name)))) - -;;;###autoload -(defun projectile-toggle-between-implementation-and-test () - "Toggle between an implementation file and its test file." - (interactive) - (find-file - (projectile-find-implementation-or-test (buffer-file-name)))) - - -(defun projectile-project-type-attribute (project-type key &optional default-value) - "Return the value of some PROJECT-TYPE attribute identified by KEY. -Fallback to DEFAULT-VALUE for missing attributes." - (let ((project (alist-get project-type projectile-project-types))) - (if (and project (plist-member project key)) - (plist-get project key) - default-value))) - -(defun projectile-test-prefix (project-type) - "Find default test files prefix based on PROJECT-TYPE." - (projectile-project-type-attribute project-type 'test-prefix)) - -(defun projectile-test-suffix (project-type) - "Find default test files suffix based on PROJECT-TYPE." - (projectile-project-type-attribute project-type 'test-suffix)) - -(defun projectile-related-files-fn (project-type) - "Find relative file based on PROJECT-TYPE." - (projectile-project-type-attribute project-type 'related-files-fn)) - -(defun projectile-src-directory (project-type) - "Find default src directory based on PROJECT-TYPE." - (projectile-project-type-attribute project-type 'src-dir "src/")) - -(defun projectile-test-directory (project-type) - "Find default test directory based on PROJECT-TYPE." - (projectile-project-type-attribute project-type 'test-dir "test/")) - -(defun projectile-dirname-matching-count (a b) - "Count matching dirnames ascending file paths." - (setq a (reverse (split-string (or (file-name-directory a) "") "/" t)) - b (reverse (split-string (or (file-name-directory b) "") "/" t))) - (let ((common 0)) - (while (and a b (string-equal (pop a) (pop b))) - (setq common (1+ common))) - common)) - -(defun projectile-group-file-candidates (file candidates) - "Group file candidates by dirname matching count." - (cl-sort (copy-sequence - (let (value result) - (while (setq value (pop candidates)) - (let* ((key (projectile-dirname-matching-count file value)) - (kv (assoc key result))) - (if kv - (setcdr kv (cons value (cdr kv))) - (push (list key value) result)))) - (mapcar (lambda (x) - (cons (car x) (nreverse (cdr x)))) - (nreverse result)))) - (lambda (a b) (> (car a) (car b))))) - -(defun projectile--best-or-all-candidates-based-on-parents-dirs (file candidates) - "Return a list containing the best one one for FILE from CANDIDATES or all CANDIDATES." - (let ((grouped-candidates (projectile-group-file-candidates file candidates))) - (if (= (length (car grouped-candidates)) 2) - (list (car (last (car grouped-candidates)))) - (apply #'append (mapcar #'cdr grouped-candidates))))) - -(defun projectile--impl-to-test-predicate (impl-file) - "Return a predicate, which returns t for any test files for IMPL-FILE." - (let* ((basename (file-name-sans-extension (file-name-nondirectory impl-file))) - (test-prefix (funcall projectile-test-prefix-function (projectile-project-type))) - (test-suffix (funcall projectile-test-suffix-function (projectile-project-type))) - (prefix-name (when test-prefix (concat test-prefix basename))) - (suffix-name (when test-suffix (concat basename test-suffix)))) - (lambda (current-file) - (let ((name (file-name-sans-extension (file-name-nondirectory current-file)))) - (or (string-equal prefix-name name) - (string-equal suffix-name name)))))) - -(defun projectile--find-matching-test (impl-file) - "Return a list of test files for IMPL-FILE." - (if-let ((plist (projectile--related-files-plist-by-kind impl-file :test))) - (projectile--related-files-from-plist plist) - (if-let ((predicate (projectile--impl-to-test-predicate impl-file))) - (projectile--best-or-all-candidates-based-on-parents-dirs - impl-file (cl-remove-if-not predicate (projectile-current-project-files)))))) - -(defun projectile--test-to-impl-predicate (test-file) - "Return a predicate, which returns t for any impl files for TEST-FILE." - (let* ((basename (file-name-sans-extension (file-name-nondirectory test-file))) - (test-prefix (funcall projectile-test-prefix-function (projectile-project-type))) - (test-suffix (funcall projectile-test-suffix-function (projectile-project-type)))) - (lambda (current-file) - (let ((name (file-name-nondirectory (file-name-sans-extension current-file)))) - (or (when test-prefix (string-equal (concat test-prefix name) basename)) - (when test-suffix (string-equal (concat name test-suffix) basename))))))) - -(defun projectile--find-matching-file (test-file) - "Return a list of impl files tested by TEST-FILE." - (if-let ((plist (projectile--related-files-plist-by-kind test-file :impl))) - (projectile--related-files-from-plist plist) - (if-let ((predicate (projectile--test-to-impl-predicate test-file))) - (projectile--best-or-all-candidates-based-on-parents-dirs - test-file (cl-remove-if-not predicate (projectile-current-project-files)))))) - -(defun projectile--choose-from-candidates (candidates) - "Choose one item from CANDIDATES." - (if (= (length candidates) 1) - (car candidates) - (projectile-completing-read "Switch to: " candidates))) - -(defun projectile-find-matching-test (impl-file) - "Compute the name of the test matching IMPL-FILE." - (if-let ((candidates (projectile--find-matching-test impl-file))) - (projectile--choose-from-candidates candidates))) - -(defun projectile-find-matching-file (test-file) - "Compute the name of a file matching TEST-FILE." - (if-let ((candidates (projectile--find-matching-file test-file))) - (projectile--choose-from-candidates candidates))) - -(defun projectile-grep-default-files () - "Try to find a default pattern for `projectile-grep'. -This is a subset of `grep-read-files', where either a matching entry from -`grep-files-aliases' or file name extension pattern is returned." - (when buffer-file-name - (let* ((fn (file-name-nondirectory buffer-file-name)) - (default-alias - (let ((aliases (remove (assoc "all" grep-files-aliases) - grep-files-aliases)) - alias) - (while aliases - (setq alias (car aliases) - aliases (cdr aliases)) - (if (string-match (mapconcat - #'wildcard-to-regexp - (split-string (cdr alias) nil t) - "\\|") - fn) - (setq aliases nil) - (setq alias nil))) - (cdr alias))) - (default-extension - (let ((ext (file-name-extension fn))) - (and ext (concat "*." ext))))) - (or default-alias default-extension)))) - -(defun projectile--globally-ignored-file-suffixes-glob () - "Return ignored file suffixes as a list of glob patterns." - (mapcar (lambda (pat) (concat "*" pat)) projectile-globally-ignored-file-suffixes)) - -(defun projectile--read-search-string-with-default (prefix-label) - (let* ((prefix-label (projectile-prepend-project-name prefix-label)) - (default-value (projectile-symbol-or-selection-at-point)) - (default-label (if (or (not default-value) - (string= default-value "")) - "" - (format " (default %s)" default-value)))) - (read-string (format "%s%s: " prefix-label default-label) nil nil default-value))) - -(defvar projectile-grep-find-ignored-paths) -(defvar projectile-grep-find-unignored-paths) -(defvar projectile-grep-find-ignored-patterns) -(defvar projectile-grep-find-unignored-patterns) - -(defun projectile-rgrep-default-command (regexp files dir) - "Compute the command for \\[rgrep] to use by default. - -Extension of the Emacs 25.1 implementation of `rgrep-default-command', with -which it shares its arglist." - (require 'find-dired) ; for `find-name-arg' - (grep-expand-template - grep-find-template - regexp - (concat (shell-quote-argument "(") - " " find-name-arg " " - (mapconcat - #'shell-quote-argument - (split-string files) - (concat " -o " find-name-arg " ")) - " " - (shell-quote-argument ")")) - dir - (concat - (and grep-find-ignored-directories - (concat "-type d " - (shell-quote-argument "(") - ;; we should use shell-quote-argument here - " -path " - (mapconcat - #'identity - (delq nil (mapcar - #'(lambda (ignore) - (cond ((stringp ignore) - (shell-quote-argument - (concat "*/" ignore))) - ((consp ignore) - (and (funcall (car ignore) dir) - (shell-quote-argument - (concat "*/" - (cdr ignore))))))) - grep-find-ignored-directories)) - " -o -path ") - " " - (shell-quote-argument ")") - " -prune -o ")) - (and grep-find-ignored-files - (concat (shell-quote-argument "!") " -type d " - (shell-quote-argument "(") - ;; we should use shell-quote-argument here - " -name " - (mapconcat - #'(lambda (ignore) - (cond ((stringp ignore) - (shell-quote-argument ignore)) - ((consp ignore) - (and (funcall (car ignore) dir) - (shell-quote-argument - (cdr ignore)))))) - grep-find-ignored-files - " -o -name ") - " " - (shell-quote-argument ")") - " -prune -o ")) - (and projectile-grep-find-ignored-paths - (concat (shell-quote-argument "(") - " -path " - (mapconcat - (lambda (ignore) (shell-quote-argument - (concat "./" ignore))) - projectile-grep-find-ignored-paths - " -o -path ") - " " - (shell-quote-argument ")") - " -prune -o ")) - (and projectile-grep-find-ignored-patterns - (concat (shell-quote-argument "(") - (and (or projectile-grep-find-unignored-paths - projectile-grep-find-unignored-patterns) - (concat " " - (shell-quote-argument "("))) - " -path " - (mapconcat - (lambda (ignore) - (shell-quote-argument - (if (string-prefix-p "*" ignore) ignore - (concat "*/" ignore)))) - projectile-grep-find-ignored-patterns - " -o -path ") - (and (or projectile-grep-find-unignored-paths - projectile-grep-find-unignored-patterns) - (concat " " - (shell-quote-argument ")") - " -a " - (shell-quote-argument "!") - " " - (shell-quote-argument "(") - (and projectile-grep-find-unignored-paths - (concat " -path " - (mapconcat - (lambda (ignore) (shell-quote-argument - (concat "./" ignore))) - projectile-grep-find-unignored-paths - " -o -path "))) - (and projectile-grep-find-unignored-paths - projectile-grep-find-unignored-patterns - " -o") - (and projectile-grep-find-unignored-patterns - (concat " -path " - (mapconcat - (lambda (ignore) - (shell-quote-argument - (if (string-prefix-p "*" ignore) ignore - (concat "*/" ignore)))) - projectile-grep-find-unignored-patterns - " -o -path "))) - " " - (shell-quote-argument ")"))) - " " - (shell-quote-argument ")") - " -prune -o "))))) - -;;;###autoload -(defun projectile-grep (&optional regexp arg) - "Perform rgrep in the project. - -With a prefix ARG asks for files (globbing-aware) which to grep in. -With prefix ARG of `-' (such as `M--'), default the files (without prompt), -to `projectile-grep-default-files'. - -With REGEXP given, don't query the user for a regexp." - (interactive "i\nP") - (require 'grep) ;; for `rgrep' - (let* ((roots (projectile-get-project-directories (projectile-project-root))) - (search-regexp (or regexp - (projectile--read-search-string-with-default "Grep for"))) - (files (and arg (or (and (equal current-prefix-arg '-) - (projectile-grep-default-files)) - (read-string (projectile-prepend-project-name "Grep in: ") - (projectile-grep-default-files)))))) - (dolist (root-dir roots) - (require 'vc-git) ;; for `vc-git-grep' - ;; in git projects users have the option to use `vc-git-grep' instead of `rgrep' - (if (and (eq (projectile-project-vcs) 'git) - projectile-use-git-grep - (fboundp 'vc-git-grep)) - (vc-git-grep search-regexp (or files "") root-dir) - ;; paths for find-grep should relative and without trailing / - (let ((grep-find-ignored-files - (cl-union (projectile--globally-ignored-file-suffixes-glob) - grep-find-ignored-files)) - (projectile-grep-find-ignored-paths - (append (mapcar (lambda (f) (directory-file-name (file-relative-name f root-dir))) - (projectile-ignored-directories)) - (mapcar (lambda (file) - (file-relative-name file root-dir)) - (projectile-ignored-files)))) - (projectile-grep-find-unignored-paths - (append (mapcar (lambda (f) (directory-file-name (file-relative-name f root-dir))) - (projectile-unignored-directories)) - (mapcar (lambda (file) - (file-relative-name file root-dir)) - (projectile-unignored-files)))) - (projectile-grep-find-ignored-patterns (projectile-patterns-to-ignore)) - (projectile-grep-find-unignored-patterns (projectile-patterns-to-ensure))) - (grep-compute-defaults) - (cl-letf (((symbol-function 'rgrep-default-command) #'projectile-rgrep-default-command)) - (rgrep search-regexp (or files "* .*") root-dir) - (when (get-buffer "*grep*") - ;; When grep is using a global *grep* buffer rename it to be - ;; scoped to the current root to allow multiple concurrent grep - ;; operations, one per root - (with-current-buffer "*grep*" - (rename-buffer (concat "*grep <" root-dir ">*")))))))) - (run-hooks 'projectile-grep-finished-hook))) - -;;;###autoload -(defun projectile-ag (search-term &optional arg) - "Run an ag search with SEARCH-TERM in the project. - -With an optional prefix argument ARG SEARCH-TERM is interpreted as a -regular expression." - (interactive - (list (projectile--read-search-string-with-default - (format "Ag %ssearch for" (if current-prefix-arg "regexp " ""))) - current-prefix-arg)) - (if (require 'ag nil 'noerror) - (let ((ag-command (if arg 'ag-regexp 'ag)) - (ag-ignore-list (delq nil - (delete-dups - (append - ag-ignore-list - (projectile--globally-ignored-file-suffixes-glob) - ;; ag supports git ignore files directly - (unless (eq (projectile-project-vcs) 'git) - (append (projectile-ignored-files-rel) - (projectile-ignored-directories-rel) - grep-find-ignored-files - grep-find-ignored-directories - '())))))) - ;; reset the prefix arg, otherwise it will affect the ag-command - (current-prefix-arg nil)) - (funcall ag-command search-term (projectile-project-root))) - (error "Package 'ag' is not available"))) - -;;;###autoload -(defun projectile-ripgrep (search-term &optional arg) - "Run a Ripgrep search with `SEARCH-TERM' at current project root. - -With an optional prefix argument ARG SEARCH-TERM is interpreted as a -regular expression." - (interactive - (list (projectile--read-search-string-with-default - (format "Ripgrep %ssearch for" (if current-prefix-arg "regexp " ""))) - current-prefix-arg)) - (if (require 'ripgrep nil 'noerror) - (let ((args (mapcar (lambda (val) (concat "--glob !" val)) - (append projectile-globally-ignored-files - projectile-globally-ignored-directories)))) - (ripgrep-regexp search-term - (projectile-project-root) - (if arg - args - (cons "--fixed-strings" args)))) - (error "Package `ripgrep' is not available"))) - -(defun projectile-tags-exclude-patterns () - "Return a string with exclude patterns for ctags." - (mapconcat (lambda (pattern) (format "--exclude=\"%s\"" - (directory-file-name pattern))) - (projectile-ignored-directories-rel) " ")) - -;;;###autoload -(defun projectile-regenerate-tags () - "Regenerate the project's [e|g]tags." - (interactive) - (if (and (boundp 'ggtags-mode) - (memq projectile-tags-backend '(auto ggtags))) - (progn - (let* ((ggtags-project-root (projectile-project-root)) - (default-directory ggtags-project-root)) - (ggtags-ensure-project) - (ggtags-update-tags t))) - (let* ((project-root (projectile-project-root)) - (tags-exclude (projectile-tags-exclude-patterns)) - (default-directory project-root) - (tags-file (expand-file-name projectile-tags-file-name)) - (command (format projectile-tags-command tags-file tags-exclude default-directory)) - shell-output exit-code) - (with-temp-buffer - (setq exit-code - (call-process-shell-command command nil (current-buffer)) - shell-output (string-trim - (buffer-substring (point-min) (point-max))))) - (unless (zerop exit-code) - (error shell-output)) - (visit-tags-table tags-file) - (message "Regenerated %s" tags-file)))) - -(defun projectile-visit-project-tags-table () - "Visit the current project's tags table." - (when (projectile-project-p) - (let ((tags-file (projectile-expand-root projectile-tags-file-name))) - (when (file-exists-p tags-file) - (with-demoted-errors "Error loading tags-file: %s" - (visit-tags-table tags-file t)))))) - -(defun projectile-determine-find-tag-fn () - "Determine which function to use for a call to `projectile-find-tag'." - (or - (cond - ((eq projectile-tags-backend 'auto) - (cond - ((fboundp 'ggtags-find-tag-dwim) - 'ggtags-find-tag-dwim) - ((fboundp 'xref-find-definitions) - 'xref-find-definitions) - ((fboundp 'etags-select-find-tag) - 'etags-select-find-tag))) - ((eq projectile-tags-backend 'xref) - (when (fboundp 'xref-find-definitions) - 'xref-find-definitions)) - ((eq projectile-tags-backend 'ggtags) - (when (fboundp 'ggtags-find-tag-dwim) - 'ggtags-find-tag-dwim)) - ((eq projectile-tags-backend 'etags-select) - (when (fboundp 'etags-select-find-tag) - 'etags-select-find-tag))) - 'find-tag)) - -;;;###autoload -(defun projectile-find-tag () - "Find tag in project." - (interactive) - (projectile-visit-project-tags-table) - ;; Auto-discover the user's preference for tags - (let ((find-tag-fn (projectile-determine-find-tag-fn))) - (call-interactively find-tag-fn))) - -(defmacro projectile-with-default-dir (dir &rest body) - "Invoke in DIR the BODY." - (declare (debug t) (indent 1)) - `(let ((default-directory ,dir)) - ,@body)) - -;;;###autoload -(defun projectile-run-command-in-root () - "Invoke `execute-extended-command' in the project's root." - (interactive) - (projectile-with-default-dir (projectile-ensure-project (projectile-project-root)) - (call-interactively #'execute-extended-command))) - -;;;###autoload -(defun projectile-run-shell-command-in-root () - "Invoke `shell-command' in the project's root." - (interactive) - (projectile-with-default-dir (projectile-ensure-project (projectile-project-root)) - (call-interactively #'shell-command))) - -;;;###autoload -(defun projectile-run-async-shell-command-in-root () - "Invoke `async-shell-command' in the project's root." - (interactive) - (projectile-with-default-dir (projectile-ensure-project (projectile-project-root)) - (call-interactively #'async-shell-command))) - -;;;###autoload -(defun projectile-run-gdb () - "Invoke `gdb' in the project's root." - (interactive) - (projectile-with-default-dir (projectile-ensure-project (projectile-project-root)) - (call-interactively 'gdb))) - -;;;###autoload -(defun projectile-run-shell (arg) - "Invoke `shell' in the project's root. - -Switch to the project specific shell buffer if it already exists. - -Use a prefix argument ARG to indicate creation of a new process instead." - (interactive "P") - (projectile-with-default-dir (projectile-ensure-project (projectile-project-root)) - (shell (projectile-generate-process-name "shell" arg)))) - -;;;###autoload -(defun projectile-run-eshell (arg) - "Invoke `eshell' in the project's root. - -Switch to the project specific eshell buffer if it already exists. - -Use a prefix argument ARG to indicate creation of a new process instead." - (interactive "P") - (projectile-with-default-dir (projectile-ensure-project (projectile-project-root)) - (let ((eshell-buffer-name (projectile-generate-process-name "eshell" arg))) - (eshell)))) - -;;;###autoload -(defun projectile-run-ielm (arg) - "Invoke `ielm' in the project's root. - -Switch to the project specific ielm buffer if it already exists. - -Use a prefix argument ARG to indicate creation of a new process instead." - (interactive "P") - (let* ((project (projectile-ensure-project (projectile-project-root))) - (ielm-buffer-name (projectile-generate-process-name "ielm" arg))) - (if (get-buffer ielm-buffer-name) - (switch-to-buffer ielm-buffer-name) - (projectile-with-default-dir project - (ielm)) - ;; ielm's buffer name is hardcoded, so we have to rename it after creation - (rename-buffer ielm-buffer-name)))) - -;;;###autoload -(defun projectile-run-term (arg) - "Invoke `term' in the project's root. - -Switch to the project specific term buffer if it already exists. - -Use a prefix argument ARG to indicate creation of a new process instead." - (interactive "P") - (let ((project (projectile-ensure-project (projectile-project-root))) - (buffer-name (projectile-generate-process-name "term" arg)) - (default-program (or explicit-shell-file-name - (getenv "ESHELL") - (getenv "SHELL") - "/bin/sh"))) - (unless (get-buffer buffer-name) - (require 'term) - (let ((program (read-from-minibuffer "Run program: " default-program))) - (projectile-with-default-dir project - (set-buffer (term-ansi-make-term buffer-name program)) - (term-mode) - (term-char-mode)))) - (switch-to-buffer buffer-name))) - -;;;###autoload -(defun projectile-run-vterm (&optional arg) - "Invoke `vterm' in the project's root. - -Switch to the project specific term buffer if it already exists. - -Use a prefix argument ARG to indicate creation of a new process instead." - (interactive "P") - (let* ((project (projectile-ensure-project (projectile-project-root))) - (buffer (projectile-generate-process-name "vterm" arg))) - (unless (buffer-live-p (get-buffer buffer)) - (unless (require 'vterm nil 'noerror) - (error "Package 'vterm' is not available")) - (projectile-with-default-dir project - (vterm buffer))) - (switch-to-buffer buffer))) - -(defun projectile-files-in-project-directory (directory) - "Return a list of files in DIRECTORY." - (let* ((project (projectile-ensure-project (projectile-project-root))) - (dir (file-relative-name (expand-file-name directory) - project))) - (cl-remove-if-not - (lambda (f) (string-prefix-p dir f)) - (projectile-project-files project)))) - -(defun projectile-files-from-cmd (cmd directory) - "Use a grep-like CMD to search for files within DIRECTORY. - -CMD should include the necessary search params and should output -equivalently to grep -HlI (only unique matching filenames). -Returns a list of expanded filenames." - (let ((default-directory directory)) - (mapcar (lambda (str) - (concat directory - (if (string-prefix-p "./" str) - (substring str 2) - str))) - (split-string - (string-trim (shell-command-to-string cmd)) - "\n+" - t)))) - -(defun projectile-files-with-string (string directory) - "Return a list of all files containing STRING in DIRECTORY. - -Tries to use ag, ack, git-grep, and grep in that order. If those -are impossible (for instance on Windows), returns a list of all -files in the project." - (if (projectile-unixy-system-p) - (let* ((search-term (shell-quote-argument string)) - (cmd (cond ((executable-find "ag") - (concat "ag --literal --nocolor --noheading -l -- " - search-term)) - ((executable-find "ack") - (concat "ack --literal --noheading --nocolor -l -- " - search-term)) - ((and (executable-find "git") - (eq (projectile-project-vcs) 'git)) - (concat "git grep -HlI " search-term)) - (t - ;; -r: recursive - ;; -H: show filename for each match - ;; -l: show only file names with matches - ;; -I: no binary files - (format "grep -rHlI %s ." search-term))))) - (projectile-files-from-cmd cmd directory)) - ;; we have to reject directories as a workaround to work with git submodules - (cl-remove-if - #'file-directory-p - (mapcar #'projectile-expand-root (projectile-dir-files directory))))) - -;;;###autoload -(defun projectile-replace (&optional arg) - "Replace literal string in project using non-regexp `tags-query-replace'. - -With a prefix argument ARG prompts you for a directory on which -to run the replacement." - (interactive "P") - (let* ((directory (if arg - (file-name-as-directory - (read-directory-name "Replace in directory: ")) - (projectile-ensure-project (projectile-project-root)))) - (old-text (read-string - (projectile-prepend-project-name "Replace: ") - (projectile-symbol-or-selection-at-point))) - (new-text (read-string - (projectile-prepend-project-name - (format "Replace %s with: " old-text)))) - (files (projectile-files-with-string old-text directory))) - (if (fboundp #'fileloop-continue) - ;; Emacs 27+ - (progn (fileloop-initialize-replace old-text new-text files 'default) - (fileloop-continue)) - ;; Emacs 25 and 26 - ;; - ;; Adapted from `tags-query-replace' for literal strings (not regexp) - (setq tags-loop-scan `(let ,(unless (equal old-text (downcase old-text)) - '((case-fold-search nil))) - (if (search-forward ',old-text nil t) - ;; When we find a match, move back to - ;; the beginning of it so - ;; perform-replace will see it. - (goto-char (match-beginning 0)))) - tags-loop-operate `(perform-replace ',old-text ',new-text t nil nil - nil multi-query-replace-map)) - (tags-loop-continue (or (cons 'list files) t))))) - -;;;###autoload -(defun projectile-replace-regexp (&optional arg) - "Replace a regexp in the project using `tags-query-replace'. - -With a prefix argument ARG prompts you for a directory on which -to run the replacement." - (interactive "P") - (let* ((directory (if arg - (file-name-as-directory - (read-directory-name "Replace regexp in directory: ")) - (projectile-ensure-project (projectile-project-root)))) - (old-text (read-string - (projectile-prepend-project-name "Replace regexp: ") - (projectile-symbol-or-selection-at-point))) - (new-text (read-string - (projectile-prepend-project-name - (format "Replace regexp %s with: " old-text)))) - (files - ;; We have to reject directories as a workaround to work with git submodules. - ;; - ;; We can't narrow the list of files with - ;; `projectile-files-with-string' because those regexp tools - ;; don't support Emacs regular expressions. - (cl-remove-if - #'file-directory-p - (mapcar #'projectile-expand-root (projectile-dir-files directory))))) - (tags-query-replace old-text new-text nil (cons 'list files)))) - -;;;###autoload -(defun projectile-kill-buffers () - "Kill project buffers. - -The buffer are killed according to the value of -`projectile-kill-buffers-filter'." - (interactive) - (let* ((project (projectile-ensure-project (projectile-project-root))) - (project-name (projectile-project-name project)) - (buffers (projectile-project-buffers project))) - (when (yes-or-no-p - (format "Are you sure you want to kill %s buffers for '%s'? " - (length buffers) project-name)) - (dolist (buffer buffers) - (when (and - ;; we take care not to kill indirect buffers directly - ;; as we might encounter them after their base buffers are killed - (not (buffer-base-buffer buffer)) - (if (functionp projectile-kill-buffers-filter) - (funcall projectile-kill-buffers-filter buffer) - (pcase projectile-kill-buffers-filter - ('kill-all t) - ('kill-only-files (buffer-file-name buffer)) - (_ (user-error "Invalid projectile-kill-buffers-filter value: %S" projectile-kill-buffers-filter))))) - (kill-buffer buffer)))))) - -;;;###autoload -(defun projectile-save-project-buffers () - "Save all project buffers." - (interactive) - (let* ((project (projectile-ensure-project (projectile-project-root))) - (project-name (projectile-project-name project)) - (modified-buffers (cl-remove-if-not (lambda (buf) - (and (buffer-file-name buf) - (buffer-modified-p buf))) - (projectile-project-buffers project)))) - (if (null modified-buffers) - (message "[%s] No buffers need saving" project-name) - (dolist (buf modified-buffers) - (with-current-buffer buf - (save-buffer))) - (message "[%s] Saved %d buffers" project-name (length modified-buffers))))) - -;;;###autoload -(defun projectile-dired () - "Open `dired' at the root of the project." - (interactive) - (dired (projectile-ensure-project (projectile-project-root)))) - -;;;###autoload -(defun projectile-dired-other-window () - "Open `dired' at the root of the project in another window." - (interactive) - (dired-other-window (projectile-ensure-project (projectile-project-root)))) - -;;;###autoload -(defun projectile-dired-other-frame () - "Open `dired' at the root of the project in another frame." - (interactive) - (dired-other-frame (projectile-ensure-project (projectile-project-root)))) - -;;;###autoload -(defun projectile-vc (&optional project-root) - "Open `vc-dir' at the root of the project. - -For git projects `magit-status-internal' is used if available. -For hg projects `monky-status' is used if available. - -If PROJECT-ROOT is given, it is opened instead of the project -root directory of the current buffer file. If interactively -called with a prefix argument, the user is prompted for a project -directory to open." - (interactive (and current-prefix-arg - (list - (projectile-completing-read - "Open project VC in: " - projectile-known-projects)))) - (or project-root (setq project-root (projectile-project-root))) - (let ((vcs (projectile-project-vcs project-root))) - (cl-case vcs - (git - (cond ((fboundp 'magit-status-internal) - (magit-status-internal project-root)) - ((fboundp 'magit-status) - (with-no-warnings (magit-status project-root))) - (t - (vc-dir project-root)))) - (hg - (if (fboundp 'monky-status) - (monky-status project-root) - (vc-dir project-root))) - (t (vc-dir project-root))))) - -;;;###autoload -(defun projectile-recentf () - "Show a list of recently visited files in a project." - (interactive) - (if (boundp 'recentf-list) - (find-file (projectile-expand-root - (projectile-completing-read - "Recently visited files: " - (projectile-recentf-files)))) - (message "recentf is not enabled"))) - -(defun projectile-recentf-files () - "Return a list of recently visited files in a project." - (and (boundp 'recentf-list) - (let ((project-root (projectile-ensure-project (projectile-project-root)))) - (mapcar - (lambda (f) (file-relative-name f project-root)) - (cl-remove-if-not - (lambda (f) (string-prefix-p project-root (expand-file-name f))) - recentf-list))))) - -(defun projectile-serialize-cache () - "Serializes the memory cache to the hard drive." - (projectile-serialize projectile-projects-cache projectile-cache-file)) - -(defvar projectile-configure-cmd-map - (make-hash-table :test 'equal) - "A mapping between projects and the last configure command used on them.") - -(defvar projectile-compilation-cmd-map - (make-hash-table :test 'equal) - "A mapping between projects and the last compilation command used on them.") - -(defvar projectile-test-cmd-map - (make-hash-table :test 'equal) - "A mapping between projects and the last test command used on them.") - -(defvar projectile-run-cmd-map - (make-hash-table :test 'equal) - "A mapping between projects and the last run command used on them.") - -(defvar projectile-project-configure-cmd nil - "The command to use with `projectile-configure-project'. -It takes precedence over the default command for the project type when set. -Should be set via .dir-locals.el.") - -(defvar projectile-project-compilation-cmd nil - "The command to use with `projectile-compile-project'. -It takes precedence over the default command for the project type when set. -Should be set via .dir-locals.el.") - -(defvar projectile-project-compilation-dir nil - "The directory to use with `projectile-compile-project'. -The directory path is relative to the project root. -Should be set via .dir-locals.el.") - -(defvar projectile-project-test-cmd nil - "The command to use with `projectile-test-project'. -It takes precedence over the default command for the project type when set. -Should be set via .dir-locals.el.") - -(defvar projectile-project-run-cmd nil - "The command to use with `projectile-run-project'. -It takes precedence over the default command for the project type when set. -Should be set via .dir-locals.el.") - -(defun projectile-default-generic-command (project-type command-type) - "Generic retrieval of COMMAND-TYPEs default cmd-value for PROJECT-TYPE. - -If found, checks if value is symbol or string. In case of symbol -resolves to function `funcall's. Return value of function MUST -be string to be executed as command." - (let ((command (plist-get (alist-get project-type projectile-project-types) command-type))) - (cond - ((not command) nil) - ((stringp command) command) - ((functionp command) - (if (fboundp command) - (funcall (symbol-function command)))) - (t - (error "The value for: %s in project-type: %s was neither a function nor a string" command-type project-type))))) - -(defun projectile-default-configure-command (project-type) - "Retrieve default configure command for PROJECT-TYPE." - (projectile-default-generic-command project-type 'configure-command)) - -(defun projectile-default-compilation-command (project-type) - "Retrieve default compilation command for PROJECT-TYPE." - (projectile-default-generic-command project-type 'compile-command)) - -(defun projectile-default-compilation-dir (project-type) - "Retrieve default compilation directory for PROJECT-TYPE." - (projectile-default-generic-command project-type 'compilation-dir)) - -(defun projectile-default-test-command (project-type) - "Retrieve default test command for PROJECT-TYPE." - (projectile-default-generic-command project-type 'test-command)) - -(defun projectile-default-run-command (project-type) - "Retrieve default run command for PROJECT-TYPE." - (projectile-default-generic-command project-type 'run-command)) - -(defun projectile-configure-command (compile-dir) - "Retrieve the configure command for COMPILE-DIR. - -The command is determined like this: - -- first we check `projectile-configure-cmd-map' for the last -configure command that was invoked on the project - -- then we check for `projectile-project-configure-cmd' supplied -via .dir-locals.el - -- finally we check for the default configure command for a -project of that type" - (or (gethash compile-dir projectile-configure-cmd-map) - projectile-project-configure-cmd - (let ((cmd-format-string (projectile-default-configure-command (projectile-project-type)))) - (when cmd-format-string - (format cmd-format-string (projectile-project-root) compile-dir))))) - -(defun projectile-compilation-command (compile-dir) - "Retrieve the compilation command for COMPILE-DIR. - -The command is determined like this: - -- first we check `projectile-compilation-cmd-map' for the last -compile command that was invoked on the project - -- then we check for `projectile-project-compilation-cmd' supplied -via .dir-locals.el - -- finally we check for the default compilation command for a -project of that type" - (or (gethash compile-dir projectile-compilation-cmd-map) - projectile-project-compilation-cmd - (projectile-default-compilation-command (projectile-project-type)))) - -(defun projectile-test-command (compile-dir) - "Retrieve the test command for COMPILE-DIR. - -The command is determined like this: - -- first we check `projectile-test-cmd-map' for the last -test command that was invoked on the project - -- then we check for `projectile-project-test-cmd' supplied -via .dir-locals.el - -- finally we check for the default test command for a -project of that type" - (or (gethash compile-dir projectile-test-cmd-map) - projectile-project-test-cmd - (projectile-default-test-command (projectile-project-type)))) - -(defun projectile-run-command (compile-dir) - "Retrieve the run command for COMPILE-DIR. - -The command is determined like this: - -- first we check `projectile-run-cmd-map' for the last -run command that was invoked on the project - -- then we check for `projectile-project-run-cmd' supplied -via .dir-locals.el - -- finally we check for the default run command for a -project of that type" - (or (gethash compile-dir projectile-run-cmd-map) - projectile-project-run-cmd - (projectile-default-run-command (projectile-project-type)))) - -(defun projectile-read-command (prompt command) - "Adapted from `compilation-read-command'." - (read-shell-command prompt command - (if (equal (car compile-history) command) - '(compile-history . 1) - 'compile-history))) - -(defun projectile-compilation-dir () - "Retrieve the compilation directory for this project." - (let* ((type (projectile-project-type)) - (directory (or projectile-project-compilation-dir - (projectile-default-compilation-dir type)))) - (if directory - (file-truename - (concat (file-name-as-directory (projectile-project-root)) - (file-name-as-directory directory))) - (projectile-project-root)))) - -(defun projectile-maybe-read-command (arg default-cmd prompt) - "Prompt user for command unless DEFAULT-CMD is an Elisp function." - (if (and (or (stringp default-cmd) (null default-cmd)) - (or compilation-read-command arg)) - (projectile-read-command prompt default-cmd) - default-cmd)) - -(defun projectile-run-compilation (cmd) - "Run external or Elisp compilation command CMD." - (if (functionp cmd) - (funcall cmd) - (compile cmd))) - -(defvar projectile-project-command-history (make-hash-table :test 'equal) - "The history of last executed project commands, per project. - -Projects are indexed by their project-root value.") - -(defun projectile--get-command-history (project-root) - (or (gethash project-root projectile-project-command-history) - (puthash project-root - (make-ring 16) - projectile-project-command-history))) - -(cl-defun projectile--run-project-cmd - (command command-map &key show-prompt prompt-prefix save-buffers) - "Run a project COMMAND, typically a test- or compile command. - -Cache the COMMAND for later use inside the hash-table COMMAND-MAP. - -Normally you'll be prompted for a compilation command, unless -variable `compilation-read-command'. You can force the prompt -by setting SHOW-PROMPT. The prompt will be prefixed with PROMPT-PREFIX. - -If SAVE-BUFFERS is non-nil save all projectile buffers before -running the command. - -The command actually run is returned." - (let* ((project-root (projectile-project-root)) - (default-directory (projectile-compilation-dir)) - (command (projectile-maybe-read-command show-prompt - command - prompt-prefix))) - (when command-map - (puthash default-directory command command-map) - (ring-insert (projectile--get-command-history project-root) command)) - (when save-buffers - (save-some-buffers (not compilation-ask-about-save) - (lambda () - (projectile-project-buffer-p (current-buffer) - project-root)))) - (unless (file-directory-p default-directory) - (mkdir default-directory)) - (projectile-run-compilation command) - command)) - -;;;###autoload -(defun projectile-configure-project (arg) - "Run project configure command. - -Normally you'll be prompted for a compilation command, unless -variable `compilation-read-command'. You can force the prompt -with a prefix ARG." - (interactive "P") - (let ((command (projectile-configure-command (projectile-compilation-dir)))) - (projectile--run-project-cmd command projectile-configure-cmd-map - :show-prompt arg - :prompt-prefix "Configure command: " - :save-buffers t))) - -;;;###autoload -(defun projectile-compile-project (arg) - "Run project compilation command. - -Normally you'll be prompted for a compilation command, unless -variable `compilation-read-command'. You can force the prompt -with a prefix ARG." - (interactive "P") - (let ((command (projectile-compilation-command (projectile-compilation-dir)))) - (projectile--run-project-cmd command projectile-compilation-cmd-map - :show-prompt arg - :prompt-prefix "Compile command: " - :save-buffers t))) - -;;;###autoload -(defun projectile-test-project (arg) - "Run project test command. - -Normally you'll be prompted for a compilation command, unless -variable `compilation-read-command'. You can force the prompt -with a prefix ARG." - (interactive "P") - (let ((command (projectile-test-command (projectile-compilation-dir)))) - (projectile--run-project-cmd command projectile-test-cmd-map - :show-prompt arg - :prompt-prefix "Test command: " - :save-buffers t))) - -;;;###autoload -(defun projectile-run-project (arg) - "Run project run command. - -Normally you'll be prompted for a compilation command, unless -variable `compilation-read-command'. You can force the prompt -with a prefix ARG." - (interactive "P") - (let ((command (projectile-run-command (projectile-compilation-dir)))) - (projectile--run-project-cmd command projectile-run-cmd-map - :show-prompt arg - :prompt-prefix "Run command: "))) - -;;;###autoload -(defun projectile-repeat-last-command (show-prompt) - "Run last projectile external command. - -External commands are: `projectile-configure-project', -`projectile-compile-project', `projectile-test-project' and -`projectile-run-project'. - -If the prefix argument SHOW_PROMPT is non nil, the command can be edited." - (interactive "P") - (let* ((project-root - (projectile-ensure-project (projectile-project-root))) - (command-history (projectile--get-command-history project-root)) - (command (car-safe (ring-elements command-history))) - (compilation-read-command show-prompt) - executed-command) - (unless command - (user-error "No command has been run yet for this project")) - (setq executed-command - (projectile--run-project-cmd command - nil - :save-buffers t - :prompt-prefix "Execute command: ")) - (unless (string= command executed-command) - (ring-insert command-history executed-command)))) - -(defun compilation-find-file-projectile-find-compilation-buffer (orig-fun marker filename directory &rest formats) - "Try to find a buffer for FILENAME, if we cannot find it, -fallback to the original function." - (when (and (not (file-exists-p (expand-file-name filename))) - (projectile-project-p)) - (let* ((root (projectile-project-root)) - (dirs (cons "" (projectile-current-project-dirs))) - (new-filename (car (cl-remove-if-not - #'file-exists-p - (mapcar - (lambda (f) - (expand-file-name - filename - (expand-file-name f root))) - dirs))))) - (when new-filename - (setq filename new-filename)))) - - (apply orig-fun `(,marker ,filename ,directory ,@formats))) - -(defun projectile-open-projects () - "Return a list of all open projects. -An open project is a project with any open buffers." - (delete-dups - (delq nil - (mapcar (lambda (buffer) - (with-current-buffer buffer - (when (projectile-project-p) - (abbreviate-file-name (projectile-project-root))))) - (buffer-list))))) - -(defun projectile--remove-current-project (projects) - "Remove the current project (if any) from the list of PROJECTS." - (if-let ((project (projectile-project-root))) - (projectile-difference projects - (list (abbreviate-file-name project))) - projects)) - -(defun projectile--move-current-project-to-end (projects) - "Move current project (if any) to the end of list in the list of PROJECTS." - (if-let ((project (projectile-project-root))) - (append - (projectile--remove-current-project projects) - (list (abbreviate-file-name project))) - projects)) - -(defun projectile-relevant-known-projects () - "Return a list of known projects." - (pcase projectile-current-project-on-switch - ('remove (projectile--remove-current-project projectile-known-projects)) - ('move-to-end (projectile--move-current-project-to-end projectile-known-projects)) - ('keep projectile-known-projects))) - -(defun projectile-relevant-open-projects () - "Return a list of open projects." - (let ((open-projects (projectile-open-projects))) - (pcase projectile-current-project-on-switch - ('remove (projectile--remove-current-project open-projects)) - ('move-to-end (projectile--move-current-project-to-end open-projects)) - ('keep open-projects)))) - -;;;###autoload -(defun projectile-switch-project (&optional arg) - "Switch to a project we have visited before. -Invokes the command referenced by `projectile-switch-project-action' on switch. -With a prefix ARG invokes `projectile-commander' instead of -`projectile-switch-project-action.'" - (interactive "P") - (let ((projects (projectile-relevant-known-projects))) - (if projects - (projectile-completing-read - "Switch to project: " projects - :action (lambda (project) - (projectile-switch-project-by-name project arg))) - (user-error "There are no known projects")))) - -;;;###autoload -(defun projectile-switch-open-project (&optional arg) - "Switch to a project we have currently opened. -Invokes the command referenced by `projectile-switch-project-action' on switch. -With a prefix ARG invokes `projectile-commander' instead of -`projectile-switch-project-action.'" - (interactive "P") - (let ((projects (projectile-relevant-open-projects))) - (if projects - (projectile-completing-read - "Switch to open project: " projects - :action (lambda (project) - (projectile-switch-project-by-name project arg))) - (user-error "There are no open projects")))) - -(defun projectile-switch-project-by-name (project-to-switch &optional arg) - "Switch to project by project name PROJECT-TO-SWITCH. -Invokes the command referenced by `projectile-switch-project-action' on switch. -With a prefix ARG invokes `projectile-commander' instead of -`projectile-switch-project-action.'" - (unless (projectile-project-p project-to-switch) - (projectile-remove-known-project project-to-switch) - (error "Directory %s is not a project" project-to-switch)) - (let ((switch-project-action (if arg - 'projectile-commander - projectile-switch-project-action))) - (run-hooks 'projectile-before-switch-project-hook) - (let ((default-directory project-to-switch)) - ;; use a temporary buffer to load PROJECT-TO-SWITCH's dir-locals before calling SWITCH-PROJECT-ACTION - (with-temp-buffer - (hack-dir-local-variables-non-file-buffer)) - ;; Normally the project name is determined from the current - ;; buffer. However, when we're switching projects, we want to - ;; show the name of the project being switched to, rather than - ;; the current project, in the minibuffer. This is a simple hack - ;; to tell the `projectile-project-name' function to ignore the - ;; current buffer and the caching mechanism, and just return the - ;; value of the `projectile-project-name' variable. - (let ((projectile-project-name (funcall projectile-project-name-function - project-to-switch))) - (funcall switch-project-action))) - (run-hooks 'projectile-after-switch-project-hook))) - -;;;###autoload -(defun projectile-find-file-in-directory (&optional directory) - "Jump to a file in a (maybe regular) DIRECTORY. - -This command will first prompt for the directory the file is in." - (interactive "DFind file in directory: ") - (unless (projectile--directory-p directory) - (user-error "Directory %S does not exist" directory)) - (let ((default-directory directory)) - (if (projectile-project-p) - ;; target directory is in a project - (let ((file (projectile-completing-read "Find file: " - (projectile-dir-files directory)))) - (find-file (expand-file-name file directory)) - (run-hooks 'projectile-find-file-hook)) - ;; target directory is not in a project - (projectile-find-file)))) - -(defun projectile-all-project-files () - "Get a list of all files in all projects." - (cl-mapcan - (lambda (project) - (when (file-exists-p project) - (mapcar (lambda (file) - (expand-file-name file project)) - (projectile-project-files project)))) - projectile-known-projects)) - -;;;###autoload -(defun projectile-find-file-in-known-projects () - "Jump to a file in any of the known projects." - (interactive) - (find-file (projectile-completing-read "Find file in projects: " (projectile-all-project-files)))) - -(defun projectile-keep-project-p (project) - "Determine whether we should cleanup (remove) PROJECT or not. - -It handles the case of remote projects as well. -See `projectile--cleanup-known-projects'." - ;; Taken from from `recentf-keep-default-predicate' - (cond - ((file-remote-p project nil t) (file-readable-p project)) - ((file-remote-p project)) - ((file-readable-p project)))) - -(defun projectile--cleanup-known-projects () - "Remove known projects that don't exist anymore and return a list of projects removed." - (projectile-merge-known-projects) - (let ((projects-kept (cl-remove-if-not #'projectile-keep-project-p projectile-known-projects)) - (projects-removed (cl-remove-if #'projectile-keep-project-p projectile-known-projects))) - (setq projectile-known-projects projects-kept) - (projectile-merge-known-projects) - projects-removed)) - -;;;###autoload -(defun projectile-cleanup-known-projects () - "Remove known projects that don't exist anymore." - (interactive) - (if-let ((projects-removed (projectile--cleanup-known-projects))) - (message "Projects removed: %s" - (mapconcat #'identity projects-removed ", ")) - (message "No projects needed to be removed."))) - -;;;###autoload -(defun projectile-clear-known-projects () - "Clear both `projectile-known-projects' and `projectile-known-projects-file'." - (interactive) - (setq projectile-known-projects nil) - (projectile-save-known-projects)) - -;;;###autoload -(defun projectile-remove-known-project (&optional project) - "Remove PROJECT from the list of known projects." - (interactive (list (projectile-completing-read - "Remove from known projects: " projectile-known-projects - :action 'projectile-remove-known-project))) - (unless (called-interactively-p 'any) - (setq projectile-known-projects - (cl-remove-if - (lambda (proj) (string= project proj)) - projectile-known-projects)) - (projectile-merge-known-projects) - (when projectile-verbose - (message "Project %s removed from the list of known projects." project)))) - -;;;###autoload -(defun projectile-remove-current-project-from-known-projects () - "Remove the current project from the list of known projects." - (interactive) - (projectile-remove-known-project (abbreviate-file-name (projectile-project-root)))) - -(defun projectile-ignored-projects () - "A list of projects that should not be save in `projectile-known-projects'." - (mapcar #'file-truename projectile-ignored-projects)) - -(defun projectile-ignored-project-p (project-root) - "Return t if PROJECT-ROOT should not be added to `projectile-known-projects'." - (or (member project-root (projectile-ignored-projects)) - (and (functionp projectile-ignored-project-function) - (funcall projectile-ignored-project-function project-root)))) - -;;;###autoload -(defun projectile-add-known-project (project-root) - "Add PROJECT-ROOT to the list of known projects." - (interactive (list (read-directory-name "Add to known projects: "))) - (unless (projectile-ignored-project-p project-root) - (setq projectile-known-projects - (delete-dups - (cons (file-name-as-directory (abbreviate-file-name project-root)) - projectile-known-projects))) - (projectile-merge-known-projects))) - -(defun projectile-load-known-projects () - "Load saved projects from `projectile-known-projects-file'. -Also set `projectile-known-projects'." - (setq projectile-known-projects - (projectile-unserialize projectile-known-projects-file)) - (setq projectile-known-projects-on-file - (and (sequencep projectile-known-projects) - (copy-sequence projectile-known-projects)))) - -(defun projectile-save-known-projects () - "Save PROJECTILE-KNOWN-PROJECTS to PROJECTILE-KNOWN-PROJECTS-FILE." - (projectile-serialize projectile-known-projects - projectile-known-projects-file) - (setq projectile-known-projects-on-file - (and (sequencep projectile-known-projects) - (copy-sequence projectile-known-projects)))) - -(defun projectile-merge-known-projects () - "Merge any change from `projectile-known-projects-file' and save to disk. - -This enables multiple Emacs processes to make changes without -overwriting each other's changes." - (let* ((known-now projectile-known-projects) - (known-on-last-sync projectile-known-projects-on-file) - (known-on-file - (projectile-unserialize projectile-known-projects-file)) - (removed-after-sync (projectile-difference known-on-last-sync known-now)) - (removed-in-other-process - (projectile-difference known-on-last-sync known-on-file)) - (result (delete-dups - (projectile-difference - (append known-now known-on-file) - (append removed-after-sync removed-in-other-process))))) - (setq projectile-known-projects result) - (projectile-save-known-projects))) - - -;;; IBuffer integration -(define-ibuffer-filter projectile-files - "Show Ibuffer with all buffers in the current project." - (:reader (read-directory-name "Project root: " (projectile-project-root)) - :description nil) - (with-current-buffer buf - (equal (file-name-as-directory (expand-file-name qualifier)) - (projectile-project-root)))) - -(defun projectile-ibuffer-by-project (project-root) - "Open an IBuffer window showing all buffers in PROJECT-ROOT." - (let ((project-name (funcall projectile-project-name-function project-root))) - (ibuffer nil (format "*%s Buffers*" project-name) - (list (cons 'projectile-files project-root))))) - -;;;###autoload -(defun projectile-ibuffer (prompt-for-project) - "Open an IBuffer window showing all buffers in the current project. - -Let user choose another project when PROMPT-FOR-PROJECT is supplied." - (interactive "P") - (let ((project-root (if prompt-for-project - (projectile-completing-read - "Project name: " - (projectile-relevant-known-projects)) - (projectile-project-root)))) - - (projectile-ibuffer-by-project project-root))) - - -;;;; projectile-commander - -(defconst projectile-commander-help-buffer "*Projectile Commander Help*") - -(defvar projectile-commander-methods nil - "List of file-selection methods for the `projectile-commander' command. -Each element is a list (KEY DESCRIPTION FUNCTION). -DESCRIPTION is a one-line description of what the key selects.") - -;;;###autoload -(defun projectile-commander () - "Execute a Projectile command with a single letter. -The user is prompted for a single character indicating the action to invoke. -The `?' character describes then -available actions. - -See `def-projectile-commander-method' for defining new methods." - (interactive) - (let* ((choices (mapcar #'car projectile-commander-methods)) - (prompt (concat "Select Projectile command [" choices "]: ")) - (ch (read-char-choice prompt choices)) - (fn (nth 2 (assq ch projectile-commander-methods)))) - (funcall fn))) - -(defmacro def-projectile-commander-method (key description &rest body) - "Define a new `projectile-commander' method. - -KEY is the key the user will enter to choose this method. - -DESCRIPTION is a one-line sentence describing how the method. - -BODY is a series of forms which are evaluated when the find -is chosen." - (let ((method `(lambda () - ,@body))) - `(setq projectile-commander-methods - (cl-sort (copy-sequence - (cons (list ,key ,description ,method) - (assq-delete-all ,key projectile-commander-methods))) - (lambda (a b) (< (car a) (car b))))))) - -(def-projectile-commander-method ?? "Commander help buffer." - (ignore-errors (kill-buffer projectile-commander-help-buffer)) - (with-current-buffer (get-buffer-create projectile-commander-help-buffer) - (insert "Projectile Commander Methods:\n\n") - (dolist (met projectile-commander-methods) - (insert (format "%c:\t%s\n" (car met) (cadr met)))) - (goto-char (point-min)) - (help-mode) - (display-buffer (current-buffer) t)) - (projectile-commander)) - -(defun projectile-commander-bindings () - "Setup the keybindings for the Projectile Commander." - (def-projectile-commander-method ?f - "Find file in project." - (projectile-find-file)) - - (def-projectile-commander-method ?T - "Find test file in project." - (projectile-find-test-file)) - - (def-projectile-commander-method ?b - "Switch to project buffer." - (projectile-switch-to-buffer)) - - (def-projectile-commander-method ?d - "Find directory in project." - (projectile-find-dir)) - - (def-projectile-commander-method ?D - "Open project root in dired." - (projectile-dired)) - - (def-projectile-commander-method ?v - "Open project root in vc-dir or magit." - (projectile-vc)) - - (def-projectile-commander-method ?V - "Browse dirty projects" - (projectile-browse-dirty-projects)) - - (def-projectile-commander-method ?r - "Replace a string in the project." - (projectile-replace)) - - (def-projectile-commander-method ?R - "Regenerate the project's [e|g]tags." - (projectile-regenerate-tags)) - - (def-projectile-commander-method ?g - "Run grep on project." - (projectile-grep)) - - (def-projectile-commander-method ?a - "Run ag on project." - (call-interactively #'projectile-ag)) - - (def-projectile-commander-method ?s - "Switch project." - (projectile-switch-project)) - - (def-projectile-commander-method ?o - "Run multi-occur on project buffers." - (projectile-multi-occur)) - - (def-projectile-commander-method ?j - "Find tag in project." - (projectile-find-tag)) - - (def-projectile-commander-method ?k - "Kill all project buffers." - (projectile-kill-buffers)) - - (def-projectile-commander-method ?e - "Find recently visited file in project." - (projectile-recentf))) - - -;;; Dirty (modified) project check related functionality -(defun projectile-check-vcs-status (&optional project-path) - "Check the status of the current project. -If PROJECT-PATH is a project, check this one instead." - (let ((project-path (or project-path (projectile-project-root))) - (project-status nil)) - (save-excursion - (vc-dir project-path) - ;; wait until vc-dir is done - (while (vc-dir-busy) (sleep-for 0 100)) - ;; check for status - (save-excursion - (save-match-data - (dolist (check projectile-vcs-dirty-state) - (goto-char (point-min)) - (when (search-forward check nil t) - (setq project-status (cons check project-status)))))) - (kill-buffer) - project-status))) - -(defvar projectile-cached-dirty-projects-status nil - "Cache of the last dirty projects check.") - -(defun projectile-check-vcs-status-of-known-projects () - "Return the list of dirty projects. -The list is composed of sublists~: (project-path, project-status). -Raise an error if their is no dirty project." - (save-window-excursion - (message "Checking for modifications in known projects...") - (let ((projects projectile-known-projects) - (status ())) - (dolist (project projects) - (when (and (projectile-keep-project-p project) (not (string= 'none (projectile-project-vcs project)))) - (let ((tmp-status (projectile-check-vcs-status project))) - (when tmp-status - (setq status (cons (list project tmp-status) status)))))) - (when (= (length status) 0) - (message "No dirty projects have been found")) - (setq projectile-cached-dirty-projects-status status) - status))) - -;;;###autoload -(defun projectile-browse-dirty-projects (&optional cached) - "Browse dirty version controlled projects. - -With a prefix argument, or if CACHED is non-nil, try to use the cached -dirty project list." - (interactive "P") - (let ((status (if (and cached projectile-cached-dirty-projects-status) - projectile-cached-dirty-projects-status - (projectile-check-vcs-status-of-known-projects))) - (mod-proj nil)) - (while (not (= (length status) 0)) - (setq mod-proj (cons (car (pop status)) mod-proj))) - (projectile-completing-read "Select project: " mod-proj - :action 'projectile-vc))) - - -;;; Find next/previous project buffer -(defun projectile--repeat-until-project-buffer (orig-fun &rest args) - "Repeat ORIG-FUN with ARGS until the current buffer is a project buffer." - (if (projectile-project-root) - (let* ((other-project-buffers (make-hash-table :test 'eq)) - (projectile-project-buffers (projectile-project-buffers)) - (max-iterations (length (buffer-list))) - (counter 0)) - (dolist (buffer projectile-project-buffers) - (unless (eq buffer (current-buffer)) - (puthash buffer t other-project-buffers))) - (when (cdr-safe projectile-project-buffers) - (while (and (< counter max-iterations) - (not (gethash (current-buffer) other-project-buffers))) - (apply orig-fun args) - (cl-incf counter)))) - (apply orig-fun args))) - -(defun projectile-next-project-buffer () - "In selected window switch to the next project buffer. - -If the current buffer does not belong to a project, call `next-buffer'." - (interactive) - (projectile--repeat-until-project-buffer #'next-buffer)) - -(defun projectile-previous-project-buffer () - "In selected window switch to the previous project buffer. - -If the current buffer does not belong to a project, call `previous-buffer'." - (interactive) - (projectile--repeat-until-project-buffer #'previous-buffer)) - - -;;; Editing a project's .dir-locals -(defun projectile-read-variable () - "Prompt for a variable and return its name." - (completing-read "Variable: " - obarray - (lambda (v) - (and (boundp v) (not (keywordp v)))) - t)) - -(define-skeleton projectile-skel-variable-cons - "Insert a variable-name and a value in a cons-cell." - "Value: " - "(" - (projectile-read-variable) - " . " - str - ")") - -(define-skeleton projectile-skel-dir-locals - "Insert a .dir-locals.el template." - nil - "((nil . (" - ("" '(projectile-skel-variable-cons) \n) - resume: - ")))") - -;;;###autoload -(defun projectile-edit-dir-locals () - "Edit or create a .dir-locals.el file of the project." - (interactive) - (let ((file (expand-file-name ".dir-locals.el" (projectile-project-root)))) - (find-file file) - (when (not (file-exists-p file)) - (unwind-protect - (projectile-skel-dir-locals) - (save-buffer))))) - - -;;; Projectile Minor mode -(define-obsolete-variable-alias 'projectile-mode-line-lighter 'projectile-mode-line-prefix) -(defcustom projectile-mode-line-prefix - " Projectile" - "Mode line lighter prefix for Projectile. -It's used by `projectile-default-mode-line' -when using dynamic mode line lighter and is the only -thing shown in the mode line otherwise." - :group 'projectile - :type 'string - :package-version '(projectile . "0.12.0")) - -(defvar-local projectile--mode-line projectile-mode-line-prefix) - -(defun projectile-default-mode-line () - "Report project name and type in the modeline." - (let ((project-name (projectile-project-name)) - (project-type (projectile-project-type))) - (format "%s[%s%s]" - projectile-mode-line-prefix - (or project-name "-") - (if project-type - (format ":%s" project-type) - "")))) - -(defun projectile-update-mode-line () - "Update the Projectile mode-line." - (let ((mode-line (funcall projectile-mode-line-function))) - (setq projectile--mode-line mode-line)) - (force-mode-line-update)) - -(defvar projectile-command-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "4 a") #'projectile-find-other-file-other-window) - (define-key map (kbd "4 b") #'projectile-switch-to-buffer-other-window) - (define-key map (kbd "4 C-o") #'projectile-display-buffer) - (define-key map (kbd "4 d") #'projectile-find-dir-other-window) - (define-key map (kbd "4 D") #'projectile-dired-other-window) - (define-key map (kbd "4 f") #'projectile-find-file-other-window) - (define-key map (kbd "4 g") #'projectile-find-file-dwim-other-window) - (define-key map (kbd "4 t") #'projectile-find-implementation-or-test-other-window) - (define-key map (kbd "5 a") #'projectile-find-other-file-other-frame) - (define-key map (kbd "5 b") #'projectile-switch-to-buffer-other-frame) - (define-key map (kbd "5 d") #'projectile-find-dir-other-frame) - (define-key map (kbd "5 D") #'projectile-dired-other-frame) - (define-key map (kbd "5 f") #'projectile-find-file-other-frame) - (define-key map (kbd "5 g") #'projectile-find-file-dwim-other-frame) - (define-key map (kbd "5 t") #'projectile-find-implementation-or-test-other-frame) - (define-key map (kbd "!") #'projectile-run-shell-command-in-root) - (define-key map (kbd "&") #'projectile-run-async-shell-command-in-root) - (define-key map (kbd "a") #'projectile-find-other-file) - (define-key map (kbd "b") #'projectile-switch-to-buffer) - (define-key map (kbd "C") #'projectile-configure-project) - (define-key map (kbd "c") #'projectile-compile-project) - (define-key map (kbd "d") #'projectile-find-dir) - (define-key map (kbd "D") #'projectile-dired) - (define-key map (kbd "e") #'projectile-recentf) - (define-key map (kbd "E") #'projectile-edit-dir-locals) - (define-key map (kbd "f") #'projectile-find-file) - (define-key map (kbd "g") #'projectile-find-file-dwim) - (define-key map (kbd "F") #'projectile-find-file-in-known-projects) - (define-key map (kbd "i") #'projectile-invalidate-cache) - (define-key map (kbd "I") #'projectile-ibuffer) - (define-key map (kbd "j") #'projectile-find-tag) - (define-key map (kbd "k") #'projectile-kill-buffers) - (define-key map (kbd "l") #'projectile-find-file-in-directory) - (define-key map (kbd "m") #'projectile-commander) - (define-key map (kbd "o") #'projectile-multi-occur) - (define-key map (kbd "p") #'projectile-switch-project) - (define-key map (kbd "q") #'projectile-switch-open-project) - (define-key map (kbd "P") #'projectile-test-project) - (define-key map (kbd "r") #'projectile-replace) - (define-key map (kbd "R") #'projectile-regenerate-tags) - (define-key map (kbd "s g") #'projectile-grep) - (define-key map (kbd "s r") #'projectile-ripgrep) - (define-key map (kbd "s s") #'projectile-ag) - (define-key map (kbd "S") #'projectile-save-project-buffers) - (define-key map (kbd "t") #'projectile-toggle-between-implementation-and-test) - (define-key map (kbd "T") #'projectile-find-test-file) - (define-key map (kbd "u") #'projectile-run-project) - (define-key map (kbd "v") #'projectile-vc) - (define-key map (kbd "V") #'projectile-browse-dirty-projects) - (define-key map (kbd "x e") #'projectile-run-eshell) - (define-key map (kbd "x i") #'projectile-run-ielm) - (define-key map (kbd "x t") #'projectile-run-term) - (define-key map (kbd "x s") #'projectile-run-shell) - (define-key map (kbd "x g") #'projectile-run-gdb) - (define-key map (kbd "x v") #'projectile-run-vterm) - (define-key map (kbd "z") #'projectile-cache-current-file) - (define-key map (kbd "") #'projectile-previous-project-buffer) - (define-key map (kbd "") #'projectile-next-project-buffer) - (define-key map (kbd "ESC") #'projectile-project-buffers-other-buffer) - map) - "Keymap for Projectile commands after `projectile-keymap-prefix'.") -(fset 'projectile-command-map projectile-command-map) - -(defvar projectile-mode-map - (let ((map (make-sparse-keymap))) - (when projectile-keymap-prefix - (define-key map projectile-keymap-prefix 'projectile-command-map)) - (easy-menu-define projectile-mode-menu map - "Menu for Projectile" - '("Projectile" - ["Find file" projectile-find-file] - ["Find file in known projects" projectile-find-file-in-known-projects] - ["Find test file" projectile-find-test-file] - ["Find directory" projectile-find-dir] - ["Find file in directory" projectile-find-file-in-directory] - ["Find other file" projectile-find-other-file] - ["Switch to buffer" projectile-switch-to-buffer] - ["Jump between implementation file and test file" projectile-toggle-between-implementation-and-test] - ["Kill project buffers" projectile-kill-buffers] - ["Save project buffers" projectile-save-project-buffers] - ["Recent files" projectile-recentf] - ["Previous buffer" projectile-previous-project-buffer] - ["Next buffer" projectile-next-project-buffer] - "--" - ["Toggle project wide read-only" projectile-toggle-project-read-only] - ["Edit .dir-locals.el" projectile-edit-dir-locals] - "--" - ["Switch to project" projectile-switch-project] - ["Switch to open project" projectile-switch-open-project] - ["Discover projects in directory" projectile-discover-projects-in-directory] - ["Browse dirty projects" projectile-browse-dirty-projects] - ["Open project in dired" projectile-dired] - "--" - ["Search in project (grep)" projectile-grep] - ["Search in project (ag)" projectile-ag] - ["Replace in project" projectile-replace] - ["Multi-occur in project" projectile-multi-occur] - "--" - ["Run GDB" projectile-run-gdb] - "--" - ["Run shell" projectile-run-shell] - ["Run eshell" projectile-run-eshell] - ["Run ielm" projectile-run-ielm] - ["Run term" projectile-run-term] - "--" - ["Cache current file" projectile-cache-current-file] - ["Invalidate cache" projectile-invalidate-cache] - ["Regenerate [e|g]tags" projectile-regenerate-tags] - "--" - ["Configure project" projectile-configure-project] - ["Compile project" projectile-compile-project] - ["Test project" projectile-test-project] - ["Run project" projectile-run-project] - ["Repeat last external command" projectile-repeat-last-command] - "--" - ["Project info" projectile-project-info] - ["About" projectile-version])) - map) - "Keymap for Projectile mode.") - -(defun projectile-find-file-hook-function () - "Called by `find-file-hook' when `projectile-mode' is on. - -The function does pretty much nothing when triggered on remote files -as all the operations it normally performs are extremely slow over -tramp." - (unless (file-remote-p default-directory) - (when projectile-dynamic-mode-line - (projectile-update-mode-line)) - (when projectile-auto-update-cache - (projectile-cache-files-find-file-hook)) - (projectile-track-known-projects-find-file-hook) - (projectile-visit-project-tags-table))) - -;;;###autoload -(define-minor-mode projectile-mode - "Minor mode to assist project management and navigation. - -When called interactively, toggle `projectile-mode'. With prefix -ARG, enable `projectile-mode' if ARG is positive, otherwise disable -it. - -When called from Lisp, enable `projectile-mode' if ARG is omitted, -nil or positive. If ARG is `toggle', toggle `projectile-mode'. -Otherwise behave as if called interactively. - -\\{projectile-mode-map}" - :lighter projectile--mode-line - :keymap projectile-mode-map - :group 'projectile - :require 'projectile - :global t - (cond - (projectile-mode - ;; setup the commander bindings - (projectile-commander-bindings) - ;; initialize the projects cache if needed - (unless projectile-projects-cache - (setq projectile-projects-cache - (or (projectile-unserialize projectile-cache-file) - (make-hash-table :test 'equal)))) - (unless projectile-projects-cache-time - (setq projectile-projects-cache-time - (make-hash-table :test 'equal))) - ;; load the known projects - (projectile-load-known-projects) - ;; update the list of known projects - (projectile--cleanup-known-projects) - (projectile-discover-projects-in-search-path) - (add-hook 'find-file-hook 'projectile-find-file-hook-function) - (add-hook 'projectile-find-dir-hook #'projectile-track-known-projects-find-file-hook t) - (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook t t) - (advice-add 'compilation-find-file :around #'compilation-find-file-projectile-find-compilation-buffer) - (advice-add 'delete-file :before #'delete-file-projectile-remove-from-cache)) - (t - (remove-hook 'find-file-hook #'projectile-find-file-hook-function) - (remove-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook t) - (advice-remove 'compilation-find-file #'compilation-find-file-projectile-find-compilation-buffer) - (advice-remove 'delete-file #'delete-file-projectile-remove-from-cache)))) - -;;;###autoload -(define-obsolete-function-alias 'projectile-global-mode 'projectile-mode "1.0") - -(provide 'projectile) - -;;; projectile.el ends here diff --git a/elpa/projectile-20200329.1908/projectile.elc b/elpa/projectile-20200329.1908/projectile.elc deleted file mode 100644 index d8b1411bd2206e1ad790e8617ac2827f821054dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174672 zcmeFa4SO5Ml_n}mGGjAOW|E!Rna%FpyDi8vC9goC8)$%3t`pOgWGj&+g`}K#Oiu&? zAc=?s7yy*a%QHO?@IUGQ9qiFqh5Cu?GB>DaW~hA zO=TJlx|743+Tl9*rk zFA0A%!ym2iM;iWUyC0pMCL4-l{7dk!iGMBoO!3*qKbFB~!gBnKKl+h&pP)v98VPD7 zD4nz)JiuR;XFDk0BO_9$2l1=hS+XtM$3n`r@2gk8`ztX|;ZpuZ1x^xx$fsDSw|{ z`RIdimd|o+JhwJ}U20?VN&sTCww0^5ZS`K{>os!=k6K^lYW>D){kBjm3DE_$zRuP9 zXRGy1p;o7r&2nd_FwJjsP5g^B@w-A3*x?>fFAFVnb1m#z3%z^`sNF9BYLKh9XZ7|= z^$rU4hPisbw|cKi^$rX5j&k)zR&QLYcU-9Vhg`jh)ti>;%?kBSa`j$Yy*H(L-vvl` zT7c~zb8Y;qwei18ZTz1?-~X1Y_kXP(*03R+aWUPOq|_MRHVfmxqgJj-JV>)v+wj1DRfK6PgK1iT=^S{Z zMR2AWIMegNnHIsBX5dVV;4H63S_Ef1182Jo&JYysqy&mK#~UtAyX61JPX@

RY4pATnWob1-3+QDpg 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

t(l*B`WY=JK!D;_7vpRCRw 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 U!m8E9 -;; URL: https://github.com/fgallina/python-django.el -;; Package-Version: 20150822.404 -;; Version: 0.1 -;; Maintainer: FSF -;; Created: Jul 2011 -;; Keywords: languages - -;; This file is NOT part of GNU Emacs. - -;; python-django.el is free software: you can redistribute 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. - -;; python-django.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with python-django.el. If not, see -;; . - -;;; Commentary: - -;; Django project management package with the goodies you would expect -;; and then some. The project buffer workings is pretty much inspired -;; by the good ol' `magit-status' buffer. - -;; This package relies heavily in fgallina's `python.el' available in -;; stock Emacs>=24.3 (or https://github.com/fgallina/python.el). - -;; Implements File navigation (per app, STATIC_ROOT, MEDIA_ROOT and -;; TEMPLATE_DIRS), Etag building, Grep in project, Quick jump (to -;; settings, project root, virtualenv and docs), Management commands -;; and Quick management commands. - -;; File navigation: After opening a project, a directory tree for each -;; installed app, the STATIC_ROOT, the MEDIA_ROOT and each -;; TEMPLATE_DIRS is created. Several commands are provided to work -;; with the current directory at point. - -;; Etags building: Provides a simple wrapper to create etags for -;; current opened project. - -;; Grep in project: Provides a simple way to grep relevant project -;; directories using `rgrep'. You can override the use of `rgrep' by -;; tweaking the `python-django-cmd-grep-function'. - -;; Quick jump: fast key bindings to jump to the settings module, the -;; project root, the current virtualenv and Django official web docs -;; are provided. - -;; Management commands: You can run any management command from the -;; project buffer via `python-django-mgmt-run-command' or via the -;; quick management commands accesible from the Django menu. -;; Completion is provided for all arguments and you can cycle through -;; opened management command process buffers very easily. Another -;; cool feature is that comint processes are spiced up with special -;; processing, for instance if are using runserver and get a -;; breakpoint via pdb or ipdb the pdb-tracking provided by -;; `python-mode' will trigger or if you enter dbshell the proper -;; `sql-mode' will be used. - -;; Quick management commands: This mode provides quick management -;; commands (management commands with sane defaults, smart prompt -;; completion and process extra processing) defined to work with the -;; most used Django built-in management commands like syncdb, shell, -;; runserver, test; several good ones from `django-extensions' like -;; shell_plus, clean_pyc; and `south' ones like convert_to_south, -;; migrate, schemamigration. You can define new quick commands via -;; the `python-django-qmgmt-define' and define ways to handle when -;; it's finished by defining a callback function. - -;;; Usage: - -;; The main entry point is the `python-django-open-project' -;; interactive function, see its documentation for more info on its -;; behavior. Mainly this function requires two things, a project path -;; and a settings module. How you chose them really depends on your -;; project's directory layout. The recommended way to chose your -;; project root, is to use the directory containing your settings -;; module; for instance if your settings module is in -;; /path/django/settings.py, use /path/django/ as your project path -;; and django.settings as your settings module. Remember to always -;; set `python-shell-interpreter' to either python or python2 and -;; never use iPython directly as Django enables it automatically when -;; the shell is started. - -;;; Installation: - -;; Add this to your .emacs: - -;; (add-to-list 'load-path "/folder/containing/file") -;; (require 'python-django) - -;;; Code: - -(require 'hippie-exp) -(require 'json) -(require 'python) -(require 'sql) -(require 'tree-widget) -(require 'wid-edit) -(require 'widget) - -;; Avoid compiler warnings -(defvar view-return-to-alist) - -(defgroup python-django nil - "Python Django project goodies." - :group 'convenience - :version "24.2") - - -;;; keymaps - -(defvar python-django-mode-map - (let ((map (make-keymap))) - (suppress-keymap map t) - (define-key map [remap next-line] 'python-django-ui-widget-forward) - (define-key map [remap previous-line] 'python-django-ui-widget-backward) - (define-key map [remap forward-char] 'widget-forward) - (define-key map [remap backward-char] 'widget-backward) - (define-key map [remap beginning-of-buffer] - 'python-django-ui-beginning-of-widgets) - (define-key map [remap newline] 'python-django-ui-safe-button-press) - (define-key map (kbd "^") 'python-django-ui-move-up-tree) - (define-key map (kbd "p") 'python-django-ui-widget-backward) - (define-key map (kbd "n") 'python-django-ui-widget-forward) - (define-key map (kbd "b") 'widget-backward) - (define-key map (kbd "f") 'widget-forward) - (define-key map (kbd "d") 'python-django-cmd-dired-at-point) - (define-key map (kbd "w") 'python-django-cmd-directory-at-point) - (define-key map (kbd "ja") 'python-django-cmd-jump-to-app) - (define-key map (kbd "jm") 'python-django-cmd-jump-to-media) - (define-key map (kbd "jt") 'python-django-cmd-jump-to-template-dir) - (define-key map (kbd "vs") 'python-django-cmd-visit-settings) - (define-key map (kbd "vr") 'python-django-cmd-visit-project-root) - (define-key map (kbd "vv") 'python-django-cmd-visit-virtualenv) - (define-key map (kbd "t") 'python-django-cmd-build-etags) - (define-key map (kbd "s") 'python-django-cmd-grep) - (define-key map (kbd "o") 'python-django-cmd-open-docs) - (define-key map (kbd "h") 'python-django-help) - (define-key map (kbd "m") 'python-django-mgmt-run-command) - (define-key map (kbd "g") 'python-django-refresh-project) - (define-key map (kbd "q") 'python-django-close-project) - (define-key map (kbd "k") 'python-django-mgmt-kill) - (define-key map (kbd "K") 'python-django-mgmt-kill-all) - (define-key map (kbd "u") 'universal-argument) - (define-key map (kbd "$") 'python-django-mgmt-cycle-buffers-forward) - (define-key map (kbd "#") 'python-django-mgmt-cycle-buffers-backward) - (easy-menu-define python-django-menu map "Python Django Mode menu" - `("Django" - :help "Django project tools" - ["Run management command" - python-django-mgmt-run-command - :help "Run management command in current project"] - ["Kill all running commands" - python-django-mgmt-kill-all - :help "Kill all running commands for current project"] - ["Get command help" python-django-help - :help "Get help for any project's management commands"] - ["Cycle to next running management command" - python-django-mgmt-cycle-buffers-forward - :help "Cycle to next running management command"] - ["Cycle to previous running management command" - python-django-mgmt-cycle-buffers-backward - :help "Cycle to previous running management command"] - "--" - ;; Reserved for quick management commands - "---" - ["Browse Django documentation" - python-django-cmd-open-docs - :help "Open a Browser with Django's documentation"] - ["Build Tags" - python-django-cmd-build-etags - :help "Build TAGS file for python source in project"] - ["Dired at point" - python-django-cmd-dired-at-point - :help "Open dired at current tree node"] - ["Grep in project directories" - python-django-cmd-grep - :help "Grep in project directories"] - ["Refresh project" - python-django-refresh-project - :help "Refresh project"] - "--" - ["Visit settings file" - python-django-cmd-visit-settings - :help "Visit settings file"] - ["Visit virtualenv directory" - python-django-cmd-visit-virtualenv - :help "Visit virtualenv directory"] - ["Visit project root directory" - python-django-cmd-visit-project-root - :help "Visit project root directory"] - "--" - ["Jump to app's directory" - python-django-cmd-jump-to-app - :help "Jump to app's directory"] - ["Jump to a media directory" - python-django-cmd-jump-to-media - :help "Jump to a media directory"] - ["Jump to a template directory" - python-django-cmd-jump-to-template-dir - :help "Jump to a template directory"])) - map) - "Keymap for `python-django-mode'.") - - -;;; Main vars - -(defvar python-django-project-root nil - "Django project root directory.") - -(defvar python-django-project-manage.py nil - "Django project manage.py path.") - -(defvar python-django-project-settings nil - "Django project settings module.") - -(defvar python-django-project-name nil - "Django project name.") - -(define-obsolete-variable-alias - 'python-django-settings-module - 'python-django-project-settings - "24.2") - -(define-obsolete-variable-alias - 'python-django-info-project-name - 'python-django-project-name - "24.2") - - -;;; Faces - -(defgroup python-django-faces nil - "Customize the appearance of Django buffers." - :prefix "python-django-" - :group 'faces - :group 'python-django) - -(defface python-django-face-header - '((t :inherit font-lock-function-name-face)) - "Face for generic header lines. - -Many Django faces inherit from this one by default." - :group 'python-django-faces) - -(defface python-django-face-path - '((t :inherit font-lock-type-face)) - "Face for paths." - :group 'python-django-faces) - -(defface python-django-face-title - '((t :inherit font-lock-keyword-face)) - "Face for titles." - :group 'python-django-faces) - -(defface python-django-face-django-version - '((t :inherit python-django-face-header)) - "Face for project's Django version." - :group 'python-django-faces) - -(defface python-django-face-project-root - '((t :inherit python-django-face-path)) - "Face for project path." - :group 'python-django-faces) - -(defface python-django-face-settings-module - '((t :inherit python-django-face-header)) - "Face for project settings module." - :group 'python-django-faces) - -(defface python-django-face-virtualenv-path - '((t :inherit python-django-face-header)) - "Face for project settings module." - :group 'python-django-faces) - - -;;; Dev tools - -(font-lock-add-keywords - 'emacs-lisp-mode - `(("(\\(python-django-qmgmt-define\\)\\>[ \t]\\([^ \t]+\\)" - (1 'font-lock-keyword-face) - (2 'font-lock-function-name-face)))) - - -;;; Error logging - -(defvar python-django-error-log-formatter - #'python-django-error-default-formatter) - -(defun python-django-error-default-formatter (error-string) - "Formats ERROR-STRING to be placed in the error log." - (format - (concat - "An error occurred retrieving project information.\n" - "Check your project settings and try again:\n\n" - "Current values:\n" - " + python-django-project-root: %s\n" - " + python-django-project-settings: %s\n" - " + python-shell-interpreter: %s\n" - " - found in %s\n\n" - "Details: \n\n%s\n") - python-django-project-root - python-django-project-settings - python-shell-interpreter - (let* ((process-environment - (python-django-info-calculate-process-environment)) - (exec-path (python-shell-calculate-exec-path))) - (executable-find python-shell-interpreter)) - error-string)) - -(defun python-django-error-log (error-string) - "Log ERROR-STRING by calling `user-error'." - (user-error "%s" (funcall python-django-error-log-formatter error-string))) - - -;;; Utility functions - -(defun python-django-util-clone-local-variables () - "Clone local variables from manage.py file. -This function is intended to be used so the project buffer gets -the same variables of python files." - (let* ((file-name - (expand-file-name - python-django-project-manage.py)) - (manage.py-exists (get-file-buffer file-name)) - (flymake-start-syntax-check-on-find-file nil) - (manage.py-buffer - (or manage.py-exists - (prog1 - (find-file-noselect file-name t) - (message nil))))) - ;; TODO: Add a predicate parameter to - ;; `python-util-clone-local-variables' itself to handle vars not - ;; intended to be changed by the variable cloning and replace the - ;; following code with that. - (mapc - (lambda (pair) - (and (symbolp (car pair)) - (string-match "^python-" (symbol-name (car pair))) - (not (memq (car pair) - '(python-django-project-root - python-django-project-settings - python-django-project-name - python-django-project-manage.py))) - (set (make-local-variable (car pair)) - (cdr pair)))) - (buffer-local-variables manage.py-buffer)) - (when (not manage.py-exists) - (kill-buffer manage.py-buffer)))) - -(defmacro python-django-util-alist-add (key value alist) - "Update for KEY the VALUE in ALIST." - `(let* ((k (if (bufferp ,key) - (buffer-name ,key) - ,key)) - (v (if (bufferp ,value) - (buffer-name ,value) - ,value)) - (elt (assoc k ,alist))) - (if (not elt) - (setq ,alist (cons (list k v) ,alist)) - (and (not (member v (cdr elt))) - (setf (cdr elt) - (cons v (cdr elt))))))) - -(defmacro python-django-util-alist-del (key value alist) - "Remove for KEY the VALUE in ALIST." - `(let* ((k (if (bufferp ,key) - (buffer-name ,key) - ,key)) - (v (if (bufferp ,value) - (buffer-name ,value) - ,value)) - (elt (assoc k ,alist))) - (and elt (setf (cdr elt) (remove v (cdr elt)))))) - -(defmacro python-django-util-alist-del-key (key alist) - "Empty KEY in ALIST." - `(let* ((k (if (bufferp ,key) - (buffer-name ,key) - ,key)) - (elt (assoc k ,alist))) - (and elt (setf (cdr elt) nil)))) - -(defun python-django-util-alist-get (key alist) - "Get values for KEY in ALIST." - (and (bufferp key) (setq key (buffer-name key))) - (cdr (assoc key alist))) - -;; Based on `file-name-extension' -(defun python-django-util-file-name-extension (filename) - "Return FILENAME's final \"extension\" sans dot." - (save-match-data - (let ((file (file-name-nondirectory filename))) - (if (and (string-match "\\.[^.]*\\'" file) - (not (eq 0 (match-beginning 0)))) - (substring file (+ (match-beginning 0) 1)))))) - -(defun python-django-util-shell-command-to-string (command) - "Execute shell COMMAND and return its output as a string. -Returns a cons cell where the car is the exit status and the cdr -is the captured output." - (with-temp-buffer - (cons - (apply 'call-process shell-file-name - nil t nil (list shell-command-switch command)) - (buffer-string)))) - -(defun python-django-util-shell-command-or-error (command) - "Execute shell COMMAND and return its output as a string. -If the exit status is an error `python-django-error-log' is used -to display command output." - (let* ((result (python-django-util-shell-command-to-string command)) - (status (car result)) - (output (cdr result))) - (if (zerop status) - output - (python-django-error-log - (concat "Error executing: " command "\n\n" output))))) - -(defun python-django-util-shorten-settings (&optional settings) - "Return a shorter SETTINGS module string. -Optional Argument SETTINGS defaults to the value of -`python-django-project-settings'." - (or settings (setq settings python-django-project-settings)) - (let ((beg (string-match "settings\\." settings))) - (if beg - (substring - settings - (+ beg (length (match-string-no-properties 0 settings)))) - settings))) - - -;;; Help - -(defun python-django--help-get (&optional command) - "Get help for COMMAND." - (let* ((process-environment - (python-django-info-calculate-process-environment)) - (exec-path (python-shell-calculate-exec-path))) - (python-django-util-shell-command-or-error - ;; "--help" is better than "help" because it won't make the command end - ;; with failure on Django<1.4. - (format "%s %s %s--help" - (executable-find python-shell-interpreter) - python-django-project-manage.py - (if command (format "%s " command) ""))))) - -(defun python-django-help (&optional command show-help) - "Get help for given COMMAND. -Optional argument SHOW-HELP when non-nil causes the help buffer to pop." - (interactive - (list - (python-django-minibuffer-read-command))) - (if (or show-help (called-interactively-p 'interactive)) - (with-help-window (help-buffer) - (princ (python-django--help-get command))) - (python-django--help-get command))) - -(defun python-django-help-close () - "Close help window if visible." - (let ((win (get-buffer-window (help-buffer)))) - (and win - (delete-window win)))) - - -;;; Project info - -(defun python-django-info-calculate-process-environment () - "Calculate process environment given current Django project." - (let* ((process-environment (python-shell-calculate-process-environment)) - (pythonpath (getenv "PYTHONPATH")) - (project-pythonpath - (mapconcat - 'identity - (list (expand-file-name python-django-project-root) - (expand-file-name "../" python-django-project-root)) - path-separator))) - (setenv "PYTHONPATH" (if (not pythonpath) - project-pythonpath - (format "%s%s%s" - pythonpath - path-separator - project-pythonpath))) - (setenv "DJANGO_SETTINGS_MODULE" - python-django-project-settings) - process-environment)) - -(defun python-django-info-find-manage.py (&optional dir) - "Find manage.py script starting from DIR." - (let ((dir (expand-file-name (or dir default-directory)))) - (if (not (directory-files dir nil "^manage\\.py$")) - (and - ;; Check dir is not directory root. - (not (string-equal "/" dir)) - (not - (and (memq system-type '(windows-nt ms-dos)) - (string-match "\\`[a-zA-Z]:[/\\]\\'" dir))) - (python-django-info-find-manage.py - (expand-file-name - (file-name-as-directory "..") dir))) - (expand-file-name "manage.py" dir)))) - -(defvar python-django-info-prefetched-settings - '("INSTALLED_APPS" "DATABASES" "MEDIA_ROOT" "STATIC_ROOT" "TEMPLATE_DIRS" - "STATICFILES_DIRS")) - -(defvar python-django-info--get-setting-cache nil - "Alist with cached list of settings.") - -(defvar python-django-info--get-version-cache nil - "Alist with cached list of settings.") - -(defun python-django-info-get-version (&optional force) - "Get current Django version path. -Values retrieved by this function are cached so when FORCE is -non-nil the cached value is invalidated." - (or - (and (not force) python-django-info--get-version-cache)) - (setq - python-django-info--get-version-cache - (let* ((process-environment - (python-django-info-calculate-process-environment)) - (exec-path (python-shell-calculate-exec-path))) - (python-django-util-shell-command-or-error - (format - "%s -c \"%s\"" - (executable-find python-shell-interpreter) - (concat - "from __future__ import print_function\n" - "import django\n" - "print(django.get_version(), end='')")))))) - -(defvar python-django-info-imports-code - (concat "\n" - "from __future__ import print_function\n" - "import os\n" - "import sys\n" - "from os.path import dirname, abspath\n" - "stdout = sys.stdout; stderr = sys.stderr\n" - "sys.stdout = sys.stderr = open(os.devnull, 'w')\n" - "from django.conf import settings\n" - "# Try to import json really hard\n" - "try:\n" - " import json\n" - "except ImportError:\n" - " from django.utils import simplejson as json\n" - "# Force settings loading so all output is sent to devnull.\n" - "settings.DEBUG\n" - "sys.stdout = stdout; sys.stderr = stderr\n\n") - "All imports code used to get info. -It contains output redirecting features so settings import -doesn't break the JSON output.") - -(defun python-django-info-get-settings (&optional force) - "Prefretch most common used settings for project. -Values retrieved by this function are cached so when FORCE is -non-nil the cached value is invalidated." - (let ((cached - (mapcar - #'(lambda (setting) - (assq (intern setting) - python-django-info--get-setting-cache)) - python-django-info-prefetched-settings))) - (if (and (not force) - (catch 'exit - (dolist (elt cached) - (when (null elt) - (throw 'exit nil))) - t)) - cached - (let* ((process-environment - (python-django-info-calculate-process-environment)) - (exec-path (python-shell-calculate-exec-path)) - (settings-list-string - (concat "[" - (mapconcat - #'(lambda (str) (concat "'" str "'")) - python-django-info-prefetched-settings - ", ") - "]")) - (value - (json-read-from-string - (python-django-util-shell-command-or-error - (format "%s -c \"%s%s\"" - (executable-find python-shell-interpreter) - python-django-info-imports-code - (concat - "acc = {}\n" - "for name in " settings-list-string ":\n" - " acc[name] = getattr(settings, name, None)\n" - "print(json.dumps(acc), end='')")))))) - (mapc - (lambda (elt) - (let ((cached-val - (assq (car elt) python-django-info--get-setting-cache))) - (if cached-val - (setcdr cached-val (cdr elt)) - (setq python-django-info--get-setting-cache - (cons elt python-django-info--get-setting-cache))))) - value))))) - -(defun python-django-info-get-setting (setting &optional force) - "Get SETTING value from django.conf.settings in JSON format. -Values retrieved by this function are cached so when FORCE is -non-nil the cached value is invalidated." - (let ((cached - (or (and - (member setting python-django-info-prefetched-settings) - (assq (intern setting) (python-django-info-get-settings force))) - (assq (intern setting) - python-django-info--get-setting-cache)))) - (if (and (not force) cached) - (cdr cached) - (let* ((process-environment - (python-django-info-calculate-process-environment)) - (exec-path (python-shell-calculate-exec-path)) - (value - (json-read-from-string - (python-django-util-shell-command-or-error - (format - "%s -c \"%s%s\"" - (executable-find python-shell-interpreter) - python-django-info-imports-code - (format - (concat - "print(json.dumps(" - "getattr(settings, '%s', None)), end='')") - setting))))) - (already-cached (assq (intern setting) - python-django-info--get-setting-cache))) - (if already-cached - (setcdr already-cached value) - (setq python-django-info--get-setting-cache - (cons (cons (intern setting) value) - python-django-info--get-setting-cache))) - value)))) - -(defvar python-django-info--get-app-paths-cache nil - "Cached list of apps and paths.") - -(defun python-django-info-get-app-paths (&optional force) - "Get project paths path. -Values retrieved by this function are cached so when FORCE is -non-nil the cached value is invalidated." - (if (or force (not python-django-info--get-app-paths-cache)) - (setq - python-django-info--get-app-paths-cache - (let* ((process-environment - (python-django-info-calculate-process-environment)) - (exec-path (python-shell-calculate-exec-path))) - (json-read-from-string - (python-django-util-shell-command-or-error - (format "%s -c \"%s%s\"" - (executable-find python-shell-interpreter) - python-django-info-imports-code - " -try: - from django.apps import apps -except ImportError: - # Django<1.7 app loading. - import os.path - from django.utils.importlib import import_module - app_paths = {} - for app_string in settings.INSTALLED_APPS: - app_module = import_module(app_string) - app_path = os.path.dirname(app_module.__file__) - # Keep the last part (e.g: 'django.contrib.admin' -> 'admin') - app_label = app_string.rpartition('.')[2] - app_paths[app_label] = app_path -else: - # Django>=1.7 app loading. - apps.populate(installed_apps=settings.INSTALLED_APPS) - app_paths = {app.label: app.path for app in apps.get_app_configs()} -print(json.dumps(app_paths), end='')"))))) - python-django-info--get-app-paths-cache)) - -(defun python-django-info-get-app-path (app &optional force) - "Get APP's path. -Values retrieved by this function are cached so when FORCE is -non-nil the cached value is invalidated." - (cdr (assq (intern app) (python-django-info-get-app-paths force)))) - -(defun python-django-info-get-installed-apps (&optional force) - "Get list of strings of installed app labels. -Values retrieved by this function are cached so when FORCE is -non-nil the cached value is invalidated." - (mapcar - (lambda (elt) - (symbol-name (car elt))) - (python-django-info-get-app-paths force))) - -(defun python-django-info-get-app-migrations (app) - "Get APP's list of migrations." - (mapcar (lambda (file) - file) - (ignore-errors - (directory-files - (expand-file-name - "migrations" - (python-django-info-get-app-path app)) - nil "^[0-9]\\{4\\}_.*\\.py$")))) - -(defun python-django-info-module-path (module) - "Get MODULE's path." - (let* ((process-environment - (python-django-info-calculate-process-environment)) - (exec-path (python-shell-calculate-exec-path))) - (python-django-util-shell-command-or-error - (format "%s -c \"%s%s%s\"" - (executable-find python-shell-interpreter) - python-django-info-imports-code - (format "import %s\n" module) - (format - "print(%s.__file__.replace('.pyc', '.py'), end='')" module))))) - -(defun python-django-info-directory-basename (&optional dir) - "Get innermost directory name for given DIR." - (car (last (split-string dir "/" t)))) - - -;;; Hippie expand completion - -(defun python-django-minibuffer-try-complete-args (old) - "Try to complete word as a management command argument. -The argument OLD has to be nil the first call of this function, and t -for subsequent calls (for further possible completions of the same -string). It returns t if a new completion is found, nil otherwise." - (save-excursion - (unless old - (he-init-string (he-dabbrev-beg) (point)) - (when (not (equal he-search-string "")) - (setq he-expand-list - (sort (all-completions - he-search-string - minibuffer-completion-table) - 'string<)))) - (while (and he-expand-list - (he-string-member (car he-expand-list) he-tried-table)) - (setq he-expand-list (cdr he-expand-list))) - (if (null he-expand-list) - (progn (if old (he-reset-string)) ()) - (progn - (he-substitute-string (car he-expand-list)) - (setq he-tried-table (cons (car he-expand-list) - (cdr he-tried-table))) - t)))) - -(defun python-django-minibuffer-try-complete-filenames (old) - "Try to complete filenames in command arguments. -The argument OLD has to be nil the first call of this function, and t -for subsequent calls (for further possible completions of the same -string). It returns t if a new completion is found, nil otherwise." - (if (not old) - (progn - (he-init-string (let ((max-point (point))) - (save-excursion - (goto-char (he-file-name-beg)) - (re-search-forward "--?[a-z0-9_-]+=?" max-point t) - (point))) - (point)) - (let ((name-part (file-name-nondirectory he-search-string)) - (dir-part (expand-file-name (or (file-name-directory - he-search-string) "")))) - (if (not (he-string-member name-part he-tried-table)) - (setq he-tried-table (cons name-part he-tried-table))) - (if (and (not (equal he-search-string "")) - (file-directory-p dir-part)) - (setq he-expand-list (sort (file-name-all-completions - name-part - dir-part) - 'string-lessp)) - (setq he-expand-list ()))))) - (while (and he-expand-list - (he-string-member (car he-expand-list) he-tried-table)) - (setq he-expand-list (cdr he-expand-list))) - (if (null he-expand-list) - (progn - (if old (he-reset-string)) - ()) - (let ((filename (he-concat-directory-file-name - (file-name-directory he-search-string) - (car he-expand-list)))) - (he-substitute-string filename) - (setq he-tried-table (cons (car he-expand-list) (cdr he-tried-table))) - (setq he-expand-list (cdr he-expand-list)) - t))) - - -;;; Minibuffer - -(defvar python-django-minibuffer-complete-command-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map minibuffer-local-must-match-map) - map) - "Keymap used for completing commands in minibuffer.") - -(defvar python-django-minibuffer-complete-command-args-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map minibuffer-local-map) - (define-key map "\t" 'hippie-expand) - (define-key map [remap scroll-other-window] - 'python-django-minibuffer-scroll-help-window) - (define-key map [remap scroll-other-window-down] - 'python-django-minibuffer-scroll-help-window-down) - map) - "Keymap used for completing command args in minibuffer.") - -(defun python-django-minibuffer-read-command (&optional trigger-help) - "Read django management command from minibuffer. -Optional argument TRIGGER-HELP sets if help buffer with commmand -details should be displayed." - (let* ((current-buffer (current-buffer)) - (command - (minibuffer-with-setup-hook - (lambda () - (python-util-clone-local-variables current-buffer) - (setq minibuffer-completion-table - (python-django-mgmt-list-commands))) - (read-from-minibuffer - "./manage.py: " nil - python-django-minibuffer-complete-command-map)))) - (when trigger-help - (python-django-help command t)) - command)) - -(defun python-django-minibuffer-read-command-args (command) - "Read django management arguments for command from minibuffer. -Arguments are parsed for especific COMMAND." - (let* ((current-buffer (current-buffer))) - (minibuffer-with-setup-hook - (lambda () - (python-util-clone-local-variables current-buffer) - (setq minibuffer-completion-table - (python-django-mgmt-list-command-args command)) - (set (make-local-variable 'hippie-expand-try-functions-list) - '(python-django-minibuffer-try-complete-args - python-django-minibuffer-try-complete-filenames))) - (read-from-minibuffer - (format "./manage.py %s (args): " command) - nil python-django-minibuffer-complete-command-args-map)))) - -(defun python-django-minibuffer-read-list (thing &rest args) - "Helper function to read list of THING from minibuffer. -Optional argument ARGS are the args passed to the THING." - (let ((objs)) - (catch 'exit - (while t - (add-to-list - 'objs - (apply thing args) t) - (when (not (y-or-n-p "Add another? ")) - (throw 'exit (mapconcat 'identity objs " "))))))) - -(defun python-django-minibuffer-read-file-name (prompt) - "Read a single file name from minibuffer. -PROMPT is a string to prompt user for filenames." - (let ((use-dialog-box nil)) - ;; Lets make shell expansion work. - (replace-regexp-in-string - "[\\]\\*" "*" - (shell-quote-argument - (let ((func - (if ido-mode - 'ido-read-file-name - 'read-file-name))) - (funcall func prompt python-django-project-root - python-django-project-root nil)))))) - -(defun python-django-minibuffer-read-file-names (prompt) - "Read a list of file names from minibuffer. -PROMPT is a string to prompt user for filenames." - (python-django-minibuffer-read-list - 'python-django-minibuffer-read-file-name prompt)) - -(defun python-django-minibuffer-read-app (prompt &optional initial-input) - "Read django app from minibuffer. -PROMPT is a string to prompt user for app. Optional argument -INITIAL-INPUT is the initial prompted value." - (let ((apps (python-django-info-get-installed-apps)) - (current-buffer (current-buffer))) - (minibuffer-with-setup-hook - (lambda () - (python-util-clone-local-variables current-buffer) - (setq minibuffer-completion-table apps)) - (catch 'app - (while t - (let ((app (read-from-minibuffer - prompt initial-input minibuffer-local-must-match-map))) - (when (> (length app) 0) - (throw 'app app)))))))) - -(defun python-django-minibuffer-read-apps (prompt &optional initial-input) - "Read django apps from minibuffer. -PROMPT is a string to prompt user for app. Optional argument -INITIAL-INPUT is the initial prompted value." - (python-django-minibuffer-read-list - 'python-django-minibuffer-read-app prompt)) - -(defun python-django-minibuffer-read-database (prompt &optional initial-input) - "Read django database router name from minibuffer. -PROMPT is a string to prompt user for database. -Optional argument INITIAL-INPUT is the initial prompted value." - (let ((databases (mapcar (lambda (router) - (format "%s" (car router))) - (python-django-info-get-setting "DATABASES"))) - (current-buffer (current-buffer))) - (minibuffer-with-setup-hook - (lambda () - (python-util-clone-local-variables current-buffer) - (setq minibuffer-completion-table databases)) - (catch 'db - (while t - (let ((db (read-from-minibuffer - prompt initial-input minibuffer-local-must-match-map))) - (when (> (length db) 0) - (throw 'db db)))))))) - -(defun python-django-minibuffer-read-migration (prompt app) - "Read south migration number for given app from minibuffer. -PROMPT is a string to prompt user for database. APP is the app -to read migrations from." - (let* ((migrations (python-django-info-get-app-migrations app))) - (minibuffer-with-setup-hook - (lambda () - (setq minibuffer-completion-table migrations)) - (let ((migration (read-from-minibuffer - prompt nil minibuffer-local-must-match-map))) - (when (not (string= migration "")) - (substring migration 0 4)))))) - -(defun python-django-minibuffer-read-from-list (prompt lst &optional default) - "Read a value from a list from minibuffer. -PROMPT is a string to prompt user. LST is the list containing -the values to choose from. Optional argument DEFAULT is the -default value." - (minibuffer-with-setup-hook - (lambda () - (setq minibuffer-completion-table lst)) - (read-from-minibuffer prompt default minibuffer-local-must-match-map))) - - -;;; Management commands - -(defvar python-django-mgmt--available-commands nil - "Alist with cached list of management commands for each project.") - -(defun python-django-mgmt-list-commands (&optional force) - "List available management commands. -Optional argument FORCE makes the function to recalculate the -list of command for current project instead of getting it from -the `python-django-mgmt--available-commands' cache." - (and force - (set (make-local-variable 'python-django-mgmt--available-commands) nil)) - (cdr - (or python-django-mgmt--available-commands - (let ((help-string (python-django-help)) - (commands)) - (set (make-local-variable 'python-django-mgmt--available-commands) - (with-temp-buffer - (insert help-string) - (goto-char (point-min)) - (re-search-forward "Available subcommands:\n") - (delete-region (point-min) (point)) - (while (re-search-forward " +\\([a-z0-9_]+\\)\n" nil t) - (setq commands - (cons (match-string-no-properties 1) commands))) - (reverse commands))))))) - -(defun python-django-mgmt-list-command-args (command) - "List available arguments for COMMAND." - (let ((help-string (python-django-help command)) - (args)) - (with-temp-buffer - (insert help-string) - (goto-char (point-min)) - (when (re-search-forward "^Options:\n" nil t) - (while (re-search-forward "--[a-z0-9_-]+=?" nil t) - (setq args (cons (match-string 0) args)) - (append args (match-string 0))) - (sort args 'string<))))) - -(defun python-django-mgmt-make-comint (command process-name) - "Run COMMAND with PROCESS-NAME in generic Comint buffer." - (apply 'make-comint process-name - (executable-find python-shell-interpreter) nil - (split-string-and-unquote command))) - -(defun python-django-mgmt-make-comint-for-shell (command process-name) - "Run COMMAND with PROCESS-NAME in generic Comint buffer." - (let ((python-shell-interpreter-args command)) - (python-shell-make-comint (python-shell-parse-command) process-name))) - -(defun python-django-mgmt-make-comint-for-runserver (command process-name) - "Run COMMAND with PROCESS-NAME in generic Comint buffer." - (let ((python-shell-enable-font-lock nil)) - (python-django-mgmt-make-comint-for-shell command process-name))) - -(defun python-django-mgmt-make-comint-for-dbshell (command process-name) - "Run COMMAND with PROCESS-NAME in generic Comint buffer." - (let* ((dbsetting (python-django-info-get-setting "DATABASES")) - (dbengine (cdr (assoc 'ENGINE (assoc 'default dbsetting)))) - (sql-interactive-product-1 - (cond ((string= dbengine "django.db.backends.mysql") - 'mysql) - ((string= dbengine "django.db.backends.oracle") - 'oracle) - ((string= dbengine "django.db.backends.postgresql") - 'postgres) - ((string= dbengine "django.db.backends.sqlite3") - 'sqlite) - (t nil))) - (buffer - (python-django-mgmt-make-comint command process-name))) - (with-current-buffer buffer - (setq sql-buffer (current-buffer) - sql-interactive-product sql-interactive-product-1) - (sql-interactive-mode)) - buffer)) - -(defcustom python-django-mgmt-buffer-switch-function 'display-buffer - "Function for switching to the process buffer. -The function receives one argument, the management command -process buffer." - :group 'python-django - :type '(radio (function-item switch-to-buffer) - (function-item pop-to-buffer) - (function-item display-buffer) - (function :tag "Other"))) - -(defvar python-django-mgmt--previous-window-configuration nil - "Snapshot of previous window configuration before executing command. -This variable is for internal purposes, don't use it directly.") - -(defun python-django-mgmt-restore-window-configuration () - "Restore window configuration after running a management command." - (and python-django-mgmt--previous-window-configuration - (set-window-configuration - python-django-mgmt--previous-window-configuration))) - -(defvar python-django-mgmt-parent-buffer nil - "Parent project buffer for current process.") - -(defvar python-django-mgmt--opened-buffers nil - "Alist of currently opened process buffers.") - -(defun python-django-mgmt-buffer-list (&optional parent-buffer) - "Return all opened buffer names for PARENT-BUFFER. -Optional Argument PARENT-BUFFER defaults to the current buffer." - (python-django-util-alist-get - (or parent-buffer (current-buffer)) - python-django-mgmt--opened-buffers)) - -(defvar python-django-mgmt--buffer-index 0) - -(defun python-django-mgmt-buffer-get (&optional index) - "Get management buffer by INDEX. -Optional Argument INDEX defaults to the value of -`python-django-mgmt--buffer-index'." - (let ((buffer-list (python-django-mgmt-buffer-list))) - (and buffer-list - (nth (mod (or index python-django-mgmt--buffer-index) - (length buffer-list)) buffer-list)))) - -(defun python-django-mgmt-cycle-buffers-forward (&optional arg) - "Cycle opened process buffers forward. -With Optional Argument ARG cycle that many buffers." - (interactive "p") - (setq arg (or arg 1)) - (let ((buffers (python-django-mgmt-buffer-list))) - (and buffers - (let ((newindex - (mod (+ python-django-mgmt--buffer-index arg) - (length buffers)))) - (set (make-local-variable - 'python-django-mgmt--buffer-index) newindex) - (display-buffer (nth newindex buffers)))))) - -(defun python-django-mgmt-cycle-buffers-backward (&optional arg) - "Cycle opened process buffers backward. -With Optional Argument ARG cycle that many buffers." - (interactive "p") - (python-django-mgmt-cycle-buffers-forward (- (or arg 1)))) - -(defun python-django-mgmt-run-command (command - &optional args capture-ouput no-pop - make-comint-function) - "Run management COMMAND with given ARGS. -When optional argument CAPTURE-OUPUT is non-nil process output is -not truncated by the `comint-truncate-buffer' output filter. If -optional argument NO-POP is provided the process buffer is not -displayed automatically. When optional argument -MAKE-COMINT-FUNCTION is non-nil use that function to create the -comint process, defaults to `python-django-mgmt-make-comint'." - (interactive - (list - (setq command - (python-django-minibuffer-read-command t)) - (python-django-minibuffer-read-command-args command))) - (python-django-help-close) - (when (not (member command (python-django-mgmt-list-commands))) - (error - "Management command %s is not available in current project" command)) - (let* ((args (or args "")) - (process-environment - (python-django-info-calculate-process-environment)) - (exec-path (python-shell-calculate-exec-path)) - (process-name - (replace-regexp-in-string - "[\t ]+$" "" - (format "[Django: %s (%s)] ./manage.py %s %s" - python-django-project-name - (python-django-util-shorten-settings) - command args))) - (buffer-name (format "*%s*" process-name)) - (current-buffer (current-buffer)) - (make-comint-function (or make-comint-function - #'python-django-mgmt-make-comint)) - (full-command - (format "%s %s %s" - python-django-project-manage.py - command args))) - (funcall make-comint-function full-command process-name) - (with-current-buffer buffer-name - (python-util-clone-local-variables current-buffer) - (and (not capture-ouput) - (add-hook 'comint-output-filter-functions - 'comint-truncate-buffer nil t)) - (set (make-local-variable - 'python-django-mgmt-parent-buffer) current-buffer) - (python-django-util-alist-add - current-buffer (current-buffer) - python-django-mgmt--opened-buffers) - (add-hook - 'kill-buffer-hook - (lambda () - (python-django-util-alist-del - python-django-mgmt-parent-buffer (current-buffer) - python-django-mgmt--opened-buffers)) - nil t)) - (unless no-pop - (funcall python-django-mgmt-buffer-switch-function buffer-name) - (with-current-buffer buffer-name - (and (get-buffer-process (current-buffer)) - (comint-goto-process-mark)))) - buffer-name)) - -(add-to-list 'debug-ignored-errors - "^Management command .* is not available in current project.") - -(defun python-django-mgmt-kill (&optional buffer) - "Kill current command's BUFFER." - (interactive) - (setq buffer (or buffer (python-django-mgmt-buffer-get))) - (when (and buffer (or (not (called-interactively-p 'any)) - (y-or-n-p - (format "Kill %s? " buffer)))) - (let ((win (get-buffer-window buffer 0)) - (proc (get-buffer-process buffer))) - (and win (delete-window win)) - (and proc (set-process-query-on-exit-flag proc nil)) - (kill-buffer buffer) - (python-django-mgmt-cycle-buffers-forward)))) - -(defun python-django-mgmt-kill-all (&optional command) - "Kill all running commands for current project after CONFIRM. -When called with universal argument you can filter the COMMAND to kill." - (interactive - (list - (and current-prefix-arg - (python-django-minibuffer-read-command nil)))) - (when (or (not (called-interactively-p 'any)) - (y-or-n-p - (format "Do you want to kill all running commands for %s? " - python-django-project-name))) - (dolist (buffer - (python-django-mgmt-buffer-list (current-buffer))) - (when (or (not command) - (string-match - (format "\\./manage.py %s" (or command "")) buffer)) - (let ((win (get-buffer-window buffer 0)) - (proc (get-buffer-process buffer))) - (and win (delete-window win)) - (and proc (set-process-query-on-exit-flag proc nil))) - (kill-buffer buffer))))) - - -;;; Management shortcuts - -(eval-and-compile - (defun python-django-qmgmt--make-fn-symbol (name) - "Return a quick management command defun symbol from NAME." - (intern (format "python-django-qmgmt-%s" name))) - - (defun python-django-qmgmt--make-functions-symbol (name) - "Return a quick management command functions symbol from NAME." - (intern (format "python-django-qmgmt-%s-functions" name))) - - (defun python-django-qmgmt--make-spec - (command &optional switches interactive-switches) - "Return human readable spec for COMMAND. - -The spec is the shell command with placeholders in it. Example: - - ./manage.py cmd --all --database= --app= - -Where \"--all\" is SWITCHES value, while database and app are -generated from INTERACTIVE-SWITCHES." - (concat - (format "./manage.py %s " command) - (unless (zerop (length switches)) - (format "%s " switches)) - (when interactive-switches - (mapconcat - (lambda (arg) - (let* ((switch (nth 3 arg)) - (switch - (cond - ((eq (length switch) 0) - "") - ((eq ?= (car (last (append switch nil)))) - switch) - (t (format "%s " switch)))) - (varname (symbol-name (nth 0 arg)))) - (format "%s<%s>" switch varname))) - interactive-switches - " ")))) - - (defun python-django-qmgmt--make-docstring - (command &optional switches interactive-switches docstring) - "Return documentation string for auto-generated command. -Arguments COMMAND, SWITCHES, INTERACTIVE-SWITCHES and DOCSTRING -are used to generate the string." - (format - "%s\n\n%s" - ;; Show either the spec, or the docstring *and* the spec. - (concat - (unless (zerop (length docstring)) - (concat docstring "\n\n")) - "Run: " - (python-django-qmgmt--make-spec - command switches interactive-switches)) - (concat - "This is an interactive command defined via " - "`python-django-qmgmt-define' macro.\n" - "Parameter defaults can be overriden by " - "calling this command with `prefix-arg' .\n\n" - (when switches - (format "Default switches: \n\n * %s\n\n" switches)) - (when interactive-switches - (format - "Arguments: \n\n%s" - (mapconcat - (lambda (arg) - (let* ((default (nth 2 arg)) - (switch (nth 3 arg)) - (switch - (cond - ((eq (length switch) 0) - nil) - ((eq ?= (car (last (append switch nil)))) - switch) - (t (format "%s " switch)))) - (force-ask (nth 4 arg))) - (concat - (format " * %s:\n" - (upcase (symbol-name (car arg)))) - (format " + Switch: %s\n" switch) - (format " + Defaults: %s\n" - (prin1-to-string default)) - (format " + Read SPEC: %s\n" - (prin1-to-string (nth 1 arg))) - (format " + Force prompt: %s\n" - force-ask) - (format " + Requires user interaction?: %s" - (if (or force-ask (not default)) - "yes" "no"))))) - interactive-switches "\n\n")))))) - - (defun python-django-qmgmt--make-functions-docstring - (fn-symbol) - "Return documentation string for auto-generated functions variable. -Argument FN-SYMBOL is the symbol of the command." - (format - "A function or list of called after `%s's bound process finishes. -Functions defined here are called in order and must receive two -arguments: The first must be a STATUS-OK which is non-nil if the -process exited successfully and ARGS which is a plist with the -switches and arguments given to it. See -`python-django-qmgmt-define' docstring for details." fn-symbol)) - - (defun python-django-qmgmt--make-interactive-form (interactive-switches) - "Return interactive form from INTERACTIVE-SWITCHES." - (mapcar - (lambda (arg) - ;; Interactive switch form: (VARNAME PROMPT DEFAULT SWITCH FORCE-ASK) - (let* ((default (nth 2 arg)) - (switch (nth 3 arg)) - (switch - (cond ((zerop (length switch)) - ;; This is a positional argument. Skip prefix. - "") - ((eq ?= (car (last (append switch nil)))) - ;; Long switch (e.g "--database="), keep it as prefix. - switch) - ;; Shor switch (e.g "-d"), add space suffix. - (t (format "%s " switch)))) - (force-ask (nth 4 arg)) - (read-func - (if (stringp (nth 1 arg)) - ;; Use string as prompt. - `(read-string ,(nth 1 arg) default) - ;; Execute form to read argument value. - (nth 1 arg)))) - `(concat - ,switch - (setq ,(car arg) - (let ((default ,default)) - (if (or ,force-ask - current-prefix-arg - (not default)) - ,read-func - default)))))) - interactive-switches)) - - (defun python-django-qmgmt--add-binding (symbol &optional binding) - "Add keybinding to SYMBOL using BINDING." - (when binding - (ignore-errors - (define-key python-django-mode-map (concat "c" binding) symbol)))) - - (defun python-django-qmgmt--add-menu-item - (symbol submenu command &optional switches interactive-switches docstring) - "Add menu item for SYMBOL in SUBMENU to execute mangament COMMAND. -Arguments SWITCHES, INTERACTIVE-SWITCHES and DOCSTRING are used -to generate a descriptive item." - (let* ((spec (python-django-qmgmt--make-spec - command switches interactive-switches)) - (help (if (zerop (length docstring)) ; also handle empty string - (format "Run ./manage.py %s" spec) - (car (split-string docstring "\n"))))) - (easy-menu-add-item - 'python-django-menu nil (list submenu) "---") - (easy-menu-add-item - 'python-django-menu (list submenu) - `[,spec - ,symbol - :help ,help - :active (member ,command (python-django-mgmt-list-commands))] - "---")))) - -(defmacro python-django-qmgmt-define (name doc-or-args - &optional args &rest interactive-switches) - "Define a quick management command. -Argument NAME is a symbol and it is used to calculate the -management command this command will execute, so it should have -the form cmdname[-rest]. Argument DOC-OR-ARGS might be the -docstring for the defined command or the list of arguments, when -a docstring is supplied ARGS is used as the list of arguments -instead. The rest INTERACTIVE-SWITCHES is a list of interactive -switches the user will be prompted for. - -This is a full example that will define how to execute Django's -dumpdata for the current application quickly: - - (python-django-qmgmt-define dumpdata-app - \"Run dumpdata for current application.\" - (:submenu \"Database\" :switches \"--format=json\" :binding \"dda\") - (database \"Database\" \"default\" \"--database=\") - (app \"App\")) - -When that's is evaled a command called -`python-django-qmgmt-dumpdata-app' is created and will react -depending on the arguments passed to this macro. - -All commands defined by this macro, when called with `prefix-arg' -will ask the user for values instead of using defaults. - -ARGS is a property list. Valid keys are (all optional): - - + :binding, when defined, the new command is bound to the - default prefix for quick management commands plus this value. - - + :capture-output, when non-nil, the command output is not - truncated by the `comint-truncate-buffer' output filter. - - + :msg, when defined, commands that use the - `python-django-qmgmt-kill-and-msg-function' show this instead - of the buffer contents. - - + :no-pop, when non-nil, causes the process buffer to not be - displayed. - - + :submenu, when defined, the quick management command is - added within that submenu tree. If omitted the item is added - to the root. - - + :switches, when defined, the new command is executed with - these fixed switches. - - + :make-comint-function, a function to be used to create the - comint process, defaults to `python-django-mgmt-make-comint'. - - + :functions, If the value is a function, it is called with - two arguments. If it is a list, the elements are called, in - order, with same two arguments each. The first argument is - non-nil if the process ended successfully; the second - argument is a property-list containing passed ARGS and - INTERACTIVE-SWITCHES with symbols as keys. E.g: '(app - \"auth\" :command \"test\"). - -If you define any extra keys they will not be taken into account -by this macro but you may well use them in your command's -callback. - -INTERACTIVE-SWITCHES have the form (VARNAME PROMPT DEFAULT SWITCH -FORCE-ASK), you can add 0 or more INTERACTIVE-SWITCHES depending -on the number of parameters you need to pass to the management -command. The description for each element of the list are: - - + VARNAME must be a unique symbol not used in other switch. - - + PROMPT must be a string for the prompt that will be shown - when user is asked for a value using `read-string' or it can - be a expresion that will be used to read the value for - VARNAME. When you need to use the calculated value of - DEFAULT in the provided expression you can just use that - variable like this: - - (read-file-name \"Fixture: \" nil default) - - + DEFAULT is an expression to be executed in order to - calculate the default value for VARNAME. This is optional - and in the case is not provided or returns nil after executed - the user will be prompted to insert a value for VARNAME. - - + SWITCH is a string that represents the switch used to pass - the VARNAME's value to Django's management command. - - + FORCE-ASK might be nil or non-nil, when is non-nil the user - will be asked to insert a value for VARNAME even if a default - value is available. - -Each command defined via this macro may have a callback to be -executed when the process finishes correctly. The way to define -callbacks is to append -callback to the defined name, for -instance if you defined a quick management command called syncdb, -then you need to create a function named -`python-django-qmgmt-syncdb-callback' and it will be called with -an alist containing all INTERACTIVE-SWITCHES and ARGS with the -additional :command key holding the executed command. See the -`python-django-qmgmt-kill-and-msg-function' function for a nice -example of a callback." - (declare (indent defun)) - (let* ((docstring (when (stringp doc-or-args) doc-or-args)) - (args (if docstring args doc-or-args)) - (args (if (eq ?: (string-to-char (symbol-name (car args)))) - args - ;; args is not a plist, append it to interactive-switches and - ;; set args to nil. - (setq interactive-switches (cons args interactive-switches)) - nil)) - (fn-symbol (python-django-qmgmt--make-fn-symbol name)) - (callback (intern (format "%s-callback" fn-symbol))) - (command (car (split-string (format "%s" name) "-"))) - (binding (plist-get args :binding)) - (capture-output (plist-get args :capture-output)) - (functions (plist-get args :functions)) - (no-pop (plist-get args :no-pop)) - (submenu (plist-get args :submenu)) - (switches (plist-get args :switches)) - (make-comint-function (plist-get args :make-comint-function)) - (defargs (mapcar 'car interactive-switches)) - ;; Abnormal hooks AKA functions - (functions-symbol (python-django-qmgmt--make-functions-symbol name)) - (functions-docstring - (python-django-qmgmt--make-functions-docstring fn-symbol))) - `(progn - (defvar ,functions-symbol nil - ,functions-docstring) - (setq ,functions-symbol ,functions) - (defun ,fn-symbol ,defargs - ,(python-django-qmgmt--make-docstring - command switches interactive-switches docstring) - (interactive - (list ,@(python-django-qmgmt--make-interactive-form - interactive-switches))) - (setq python-django-mgmt--previous-window-configuration - (current-window-configuration)) - (let* ((cmd-args (concat ,switches (and ,switches " ") - (mapconcat #'symbol-value ',defargs " "))) - (process (get-buffer-process - (python-django-mgmt-run-command - ,command cmd-args - ,capture-output ,no-pop - ,make-comint-function)))) - (message "Running: ./manage.py %s %s" ,command cmd-args) - (set-process-sentinel - process - (lambda (process status) - (when (and (not (process-live-p process)) - (buffer-live-p (process-buffer process))) - (with-current-buffer (process-buffer process) - (run-hook-with-args - ',functions-symbol - (string= status "finished\n") - (let ((plist ',args)) - (plist-put plist :command ,command) - (mapc - #'(lambda (sym) - (message "[%s]" sym) - (let* ((cmd-switch (symbol-value sym)) - (value - (cond - ((string-match "^--" cmd-switch) - (substring - cmd-switch - (1+ (string-match "=" cmd-switch)))) - ((string-match "^-" cmd-switch) - (substring cmd-switch 3)) - (t cmd-switch)))) - (plist-put plist sym value))) - ',defargs) - plist)))))))) - (python-django-qmgmt--add-binding #',fn-symbol ,binding) - (python-django-qmgmt--add-menu-item - #',fn-symbol ,submenu ,command ,switches ',interactive-switches ,docstring) - ;; Just like defun, return the defined function. - #',fn-symbol))) - -(defun python-django-qmgmt-kill-and-msg-function (status-ok args) - "Kill the process buffer and show message or output. -Argument STATUS-OK is non-nil if process exited successfully. -Argument ARGS is a plist with the switches and arguments passed -to the command. See `python-django-qmgmt-define' docstring for -details." - (when status-ok - (let ((msg (or (plist-get args :msg) - (buffer-substring-no-properties - (point-min) (point-max)))) - (buffer-name (buffer-name))) - (kill-buffer) - (python-django-mgmt-restore-window-configuration) - (display-message-or-buffer msg buffer-name)))) - -(python-django-qmgmt-define collectstatic - "Collect static files." - (:submenu "Tools" :binding "ocs" - :functions #'python-django-qmgmt-kill-and-msg-function)) - -(python-django-qmgmt-define clean_pyc - "Remove all python compiled files from the project." - (:submenu "Tools" :binding "ocp" :no-pop t - :msg "All *.pyc and *.pyo cleaned." - :functions #'python-django-qmgmt-kill-and-msg-function)) - -(defun python-django-qmgmt-create_command-function (status-ok args) - "Callback for create_command quick management command. -Argument STATUS-OK is non-nil if process exited successfully. -Argument ARGS is a plist with the switches and arguments passed -to the command. See `python-django-qmgmt-define' docstring for -details." - (when status-ok - (let* ((appname (plist-get args 'app)) - (manage-directory - (file-name-directory - (with-current-buffer - python-django-mgmt-parent-buffer - python-django-project-manage.py))) - (default-app-dir - (expand-file-name appname manage-directory)) - (default-create-dir - (expand-file-name "management" default-app-dir)) - (delete-safe - (and (file-exists-p default-app-dir) - (equal (directory-files default-app-dir) - '("." ".." "management"))))) - ;; TODO: cleanup. Do not offer moving, the command does the right thing. - (when (y-or-n-p - (format "Created in app %s. Move it? " default-app-dir)) - (let ((newdir - (read-directory-name - "Move app to: " manage-directory nil t))) - (if (not (file-exists-p - (expand-file-name "management" newdir))) - (rename-file default-create-dir newdir) - (message - "Directory structure already exists in %s" appname)) - (and delete-safe (delete-directory default-app-dir t))))) - (kill-buffer) - (python-django-mgmt-restore-window-configuration))) - -(python-django-qmgmt-define create_command - "Create management commands directory structure for app." - (:submenu "Tools" :binding "occ" :no-pop t - :functions #'python-django-qmgmt-create_command-function) - (app (python-django-minibuffer-read-app "App name: "))) - -(defun python-django-qmgmt-startapp-function (status-ok args) - "Callback for clean_pyc quick management command. -Argument STATUS-OK is non-nil if process exited successfully. -Argument ARGS is a plist with the switches and arguments passed -to the command. See `python-django-qmgmt-define' docstring for -details." - (when status-ok - (let ((appname (plist-get args 'app)) - (manage-directory - (file-name-directory - (with-current-buffer - python-django-mgmt-parent-buffer - python-django-project-manage.py)))) - (when (y-or-n-p - (format - "App created in %s. Do you want to move it? " - manage-directory)) - (rename-file - (expand-file-name appname manage-directory) - (read-directory-name - "Move app to: " manage-directory nil t)))) - (kill-buffer) - (python-django-mgmt-restore-window-configuration))) - -(python-django-qmgmt-define startapp - "Create new Django app for current project." - (:submenu "Tools" :binding "osa" :no-pop t - :functions #'python-django-qmgmt-startapp-function) - (app "App name: ")) - -;; Shell - -(python-django-qmgmt-define shell - "Run a Python interpreter for this project." - (:submenu "Shell" :binding "ss" - :make-comint-function #'python-django-mgmt-make-comint-for-shell)) - -(python-django-qmgmt-define shell_plus - "Like the 'shell' but autoloads all models." - (:submenu "Shell" :binding "sp" - :make-comint-function #'python-django-mgmt-make-comint-for-shell)) - -;; Database - -(python-django-qmgmt-define syncdb - "Sync database tables for all INSTALLED_APPS." - (:submenu "Database" :binding "dsy" :no-pop t - :functions #'python-django-qmgmt-kill-and-msg-function) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=")) - -(python-django-qmgmt-define dbshell - "Run the command-line client for specified database." - (:submenu "Database" :binding "dsh" - :make-comint-function #'python-django-mgmt-make-comint-for-dbshell) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=")) - -(defvar python-django-qmgmt-dumpdata-formats '("json" "xml" "yaml") - "Valid formats for dumpdata management command.") - -(defcustom python-django-qmgmt-dumpdata-default-format "json" - "Default format for quick dumpdata." - :group 'python-django - :type `(choice - ,@(mapcar (lambda (fmt) - `(string :tag ,fmt ,fmt)) - python-django-qmgmt-dumpdata-formats)) - :safe 'stringp) - -(defcustom python-django-qmgmt-dumpdata-default-indent 4 - "Default indent value quick dumpdata." - :group 'python-django - :type 'integer - :safe 'integerp) - -(defun python-django-qmgmt-dumpdata-function (status-ok args) - "Callback executed after dumpdata finishes. -Argument STATUS-OK is non-nil if process exited successfully. -Argument ARGS is a plist with the switches and arguments passed -to the command. See `python-django-qmgmt-define' docstring for -details." - (when status-ok - (let ((file-name - (catch 'file-name - (while t - (let ((file-name - (read-file-name - "Save fixture to file: " - (expand-file-name - (with-current-buffer - python-django-mgmt-parent-buffer - python-django-project-root)) nil nil nil))) - (if (not (file-exists-p file-name)) - (throw 'file-name file-name) - (when (y-or-n-p - (format "File `%s' exists; overwrite? " file-name)) - (throw 'file-name file-name))))))) - (output-buffer (buffer-substring-no-properties - (point-min) (point-max)))) - (with-temp-buffer - (set (make-local-variable 'require-final-newline) t) - (insert output-buffer) - ;; Ensure there's a final newline - (and (> (point-max) (point-min)) - (not (= (char-after (1- (point-max))) ?\n)) - (insert "\n")) - (write-region - (progn - ;; Remove possible logs from output. - (goto-char (point-min)) - (re-search-forward - "^\\[\\|^<\\?xml +version=\"\\|^- +fields: " nil t) - (beginning-of-line 1) - (point)) - (point-max) - file-name)) - (kill-buffer) - (python-django-mgmt-restore-window-configuration) - (message "Fixture saved to file `%s'." file-name)))) - -(python-django-qmgmt-define dumpdata-all - "Save the contents of the database as a fixture for all apps." - (:submenu "Database" :binding "ddp" :no-pop t :capture-output t - :functions #'python-django-qmgmt-dumpdata-function) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=") - (indent (number-to-string - (read-number "Indent Level: " - (string-to-number default))) - (number-to-string python-django-qmgmt-dumpdata-default-indent) - "--indent=") - (format (python-django-minibuffer-read-from-list - "Dump to format: " python-django-qmgmt-dumpdata-formats default) - "json" "--format=")) - -(python-django-qmgmt-define dumpdata-app - "Save the contents of the database as a fixture for the specified app." - (:submenu "Database" :binding "dda" :no-pop t :capture-output t - :functions #'python-django-qmgmt-dumpdata-function) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=") - (indent (number-to-string - (read-number "Indent Level: " - (string-to-number default))) "4" "--indent=") - (format (python-django-minibuffer-read-from-list - "Dump to format: " python-django-qmgmt-dumpdata-formats default) - "json" "--format=") - (app (python-django-minibuffer-read-app "Dumpdata for App: "))) - -(python-django-qmgmt-define flush - "Execute 'sqlflush' on the given database." - (:submenu "Database" :binding "df" :msg "Flushed database" - :functions #'python-django-qmgmt-kill-and-msg-function) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=")) - -(python-django-qmgmt-define loaddata - "Install the named fixture(s) in the database." - (:submenu "Database" :binding "dl" - :functions #'python-django-qmgmt-kill-and-msg-function) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=") - (fixtures (python-django-minibuffer-read-file-names "Fixtures: "))) - -(python-django-qmgmt-define validate - "Validate all installed models." - (:submenu "Database" :binding "dv" - :functions #'python-django-qmgmt-kill-and-msg-function)) - -(defun python-django-qmgmt-graph_models-function (status-ok args) - "Callback for graph_model quick management command. -Argument STATUS-OK is non-nil if process exited successfully. -Argument ARGS is a plist with the switches and arguments passed -to the command. See `python-django-qmgmt-define' docstring for -details." - (when status-ok - (let ((open (y-or-n-p "Open generated graph? "))) - (kill-buffer) - (python-django-mgmt-restore-window-configuration) - (when open - (find-file (plist-get args 'filename)))))) - -(python-django-qmgmt-define graph_models-all - "Creates a Graph of models for all project apps." - (:submenu "Database" :switches "-ag" :binding "dgg" - :functions #'python-django-qmgmt-graph_models-function) - (filename - (expand-file-name - (read-file-name "Filename for generated Graph: " - default default)) - (expand-file-name - "graph_all.png" python-django-project-root) - "--output=" t)) - -(python-django-qmgmt-define graph_models-apps - "Creates a Graph of models for given apps." - (:submenu "Database" :binding "dga" - :functions #'python-django-qmgmt-graph_models-function) - (apps (python-django-minibuffer-read-apps "Graph for App: ")) - (filename - (expand-file-name - (read-file-name "Filename for generated Graph: " default default)) - (expand-file-name - (format "graph_%s.png" (replace-regexp-in-string " " "_" apps)) - python-django-project-root) - "--output=" t)) - -;; i18n - -(python-django-qmgmt-define makemessages-all - "Create/Update translation string files." - (:submenu "i18n" :switches "--all" :binding "im" - :functions #'python-django-qmgmt-kill-and-msg-function)) - -(python-django-qmgmt-define compilemessages-all - "Compile project .po files to .mo." - (:submenu "i18n" :binding "ic" - :functions #'python-django-qmgmt-kill-and-msg-function)) - -;; Dev Server - -(defcustom python-django-qmgmt-runserver-default-bindaddr "localhost:8000" - "Default binding address for quick runserver." - :group 'python-django - :type 'string - :safe 'stringp) - -(defcustom python-django-qmgmt-testserver-default-bindaddr "localhost:8000" - "Default binding address for quick testserver." - :group 'python-django - :type 'string - :safe 'stringp) - -(defcustom python-django-qmgmt-mail_debug-default-bindaddr "localhost:1025" - "Default binding address for quick mail_debug." - :group 'python-django - :type 'string - :safe 'stringp) - -(python-django-qmgmt-define runserver - "Start development Web server." - (:submenu "Server" :binding "rr" - :make-comint-function #'python-django-mgmt-make-comint-for-runserver) - (bindaddr "Serve on [ip]:[port]: " - python-django-qmgmt-runserver-default-bindaddr)) - -(python-django-qmgmt-define runserver_plus - "Start extended development Web server." - (:submenu "Server" :binding "rp" - :make-comint-function #'python-django-mgmt-make-comint-for-runserver) - (bindaddr "Serve on [ip]:[port]: " - python-django-qmgmt-runserver-default-bindaddr)) - -(python-django-qmgmt-define testserver - "Start development server with data from the given fixture(s)." - (:submenu "Server" :binding "rt") - (bindaddr "Serve on [ip]:[port]: " - python-django-qmgmt-testserver-default-bindaddr) - (fixtures (python-django-minibuffer-read-file-names "Fixtures: "))) - -(python-django-qmgmt-define mail_debug - "Start a test mail server for development." - (:submenu "Server" :binding "rm") - (bindaddr "Serve on [ip]:[port]: " - python-django-qmgmt-mail_debug-default-bindaddr)) - -;; Testing - -(python-django-qmgmt-define test-all - "Run the test suite for the entire project." - (:submenu "Test" :binding "tp" - :functions #'python-django-qmgmt-kill-and-msg-function)) - -(python-django-qmgmt-define test-app - "Run the test suite for the specified app." - (:submenu "Test" :binding "ta" - :functions #'python-django-qmgmt-kill-and-msg-function) - (app (python-django-minibuffer-read-app "Test App: "))) - -;; South integration - -(defun python-django-qmgmt-open-migration-function (status-ok args) - "Callback for commands that create migrations. -Argument STATUS-OK is non-nil if process exited successfully. -Argument ARGS is a plist with the switches and arguments passed -to the command. See `python-django-qmgmt-define' docstring for -details." - (when status-ok - (let ((app (cdr (assq 'app args)))) - (python-django-qmgmt-kill-and-msg-function status-ok args) - (and (y-or-n-p "Open the created migration? ") - (find-file - (expand-file-name - (car (last (python-django-info-get-app-migrations app))) - (expand-file-name - "migrations" - (python-django-info-get-app-path app)))))))) - -(python-django-qmgmt-define convert_to_south - "Convert given app to South." - (:submenu "South" :binding "soc" - :functions #'python-django-qmgmt-kill-and-msg-function) - (app (python-django-minibuffer-read-app "Convert App: "))) - -(python-django-qmgmt-define datamigration - "Create a new datamigration for the given app." - (:submenu "South" :binding "sod" - :functions #'python-django-qmgmt-open-migration-function) - (app (python-django-minibuffer-read-app "Datamigration for App: ")) - (name "Datamigration name: ")) - -(python-django-qmgmt-define migrate-all - "Run all migrations for all apps." - (:submenu "South" :switches "--all" :binding "somp" - :functions #'python-django-qmgmt-kill-and-msg-function) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=")) - -(python-django-qmgmt-define migrate-app - "Run all migrations for given app." - (:submenu "South" :binding "soma" - :functions #'python-django-qmgmt-kill-and-msg-function) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=") - (app (python-django-minibuffer-read-app "Migrate App: "))) - -(python-django-qmgmt-define migrate-list - "Run all migrations for all apps." - (:submenu "South" :switches "--list" :binding "soml" - :functions #'python-django-qmgmt-kill-and-msg-function) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=")) - -(python-django-qmgmt-define migrate-app-to - "Run migrations for given app [up|down]-to given number." - (:submenu "South" :binding "somt" - :functions #'python-django-qmgmt-kill-and-msg-function) - (database (python-django-minibuffer-read-database "Database: " default) - "default" "--database=") - (app (python-django-minibuffer-read-app "Migrate App: ")) - (migration (python-django-minibuffer-read-migration "To migration: " app))) - -(python-django-qmgmt-define schemamigration-initial - "Create the initial schemamigration for the given app." - (:submenu "South" :switches "--initial" :binding "sosi" - :functions #'python-django-qmgmt-kill-and-msg-function) - (app (python-django-minibuffer-read-app - "Initial schemamigration for App: "))) - -(python-django-qmgmt-define schemamigration - "Create new empty schemamigration for the given app." - (:submenu "South" :switches "--empty" :binding "soss" - :functions #'python-django-qmgmt-open-migration-function) - (app (python-django-minibuffer-read-app - "Initial schemamigration for App: ")) - (name "Schemamigration name: ")) - -(python-django-qmgmt-define schemamigration-auto - "Create an automatic schemamigration for the given app." - (:submenu "South" :switches "--auto" :binding "sosa" - :functions #'python-django-qmgmt-open-migration-function) - (app (python-django-minibuffer-read-app - "Auto schemamigration for App: "))) - - -;;; Fast commands - -(defcustom python-django-cmd-etags-command - "etags `find -name \"*.py\"`" - "Command used to build tags tables." - :group 'python-django - :type 'string) - -(defcustom python-django-cmd-grep-function nil - "Function to grep on a directory. -The function receives no args, however `default-directory' will -default to a sane value." - :group 'python-django - :type 'function) - -(defun python-django-cmd-build-etags () - "Build tags for current project." - (interactive) - (let ((current-dir default-directory)) - (cd - (file-name-directory - python-django-project-manage.py)) - (if (eq 0 - (shell-command - python-django-cmd-etags-command)) - (message "Tags created sucessfully") - (message "Tags creation failed")) - (cd current-dir))) - -(defun python-django-cmd-grep () - "Grep in project directories." - (interactive) - (let ((default-directory - (or (python-django-ui-directory-at-point) - (file-name-directory - python-django-project-manage.py)))) - (if (not python-django-cmd-grep-function) - (call-interactively #'rgrep) - (funcall - python-django-cmd-grep-function default-directory)))) - -(defun python-django-cmd-open-docs () - "Open Django documentation in a browser." - (interactive) - (browse-url - (format - "https://docs.djangoproject.com/en/%s/" - (substring (python-django-info-get-version) 0 3)))) - -(defun python-django-cmd-visit-settings () - "Visit settings file." - (interactive) - (find-file (python-django-info-module-path - python-django-project-settings))) - -(defun python-django-cmd-visit-virtualenv () - "Visit virtualenv directory." - (interactive) - (and python-shell-virtualenv-path - (dired python-shell-virtualenv-path))) - -(defun python-django-cmd-visit-project-root () - "Visit project root directory." - (interactive) - (dired python-django-project-root)) - -(defun python-django-cmd-dired-at-point () - "Open dired at current tree node." - (interactive) - (let ((dir (python-django-ui-directory-at-point))) - (and dir (dired dir)))) - -(defun python-django-cmd-directory-at-point () - "Message the current directory at point." - (interactive) - (message (or (python-django-ui-directory-at-point) ""))) - -(defun python-django-cmd-jump-to-app (app) - "Jump to APP's directory." - (interactive - (list - (python-django-minibuffer-read-app "Jump to app: "))) - (when (python-django-info-get-app-path app) - (goto-char (point-min)) - (re-search-forward (format " %s" app)) - (python-django-ui-move-to-closest-icon))) - -(defun python-django-cmd-jump-to-media (which) - "Jump to a WHICH media directory." - (interactive - (list - (python-django-minibuffer-read-from-list - "Jump to: " '("MEDIA_ROOT" "STATIC_ROOT")))) - (goto-char (point-min)) - (re-search-forward (format " %s" which)) - (python-django-ui-move-to-closest-icon)) - -(defun python-django-cmd-jump-to-template-dir (which) - "Jump to a WHICH template directory." - (interactive - (list - (python-django-minibuffer-read-from-list - "Jump to: " - (mapcar 'identity (python-django-info-get-setting "TEMPLATE_DIRS"))))) - (goto-char (point-min)) - (re-search-forward (format " %s" which)) - (python-django-ui-move-to-closest-icon)) - - - -;;; UI stuff - -(defvar python-django-ui-ignored-dirs - '("." ".." ".bzr" ".cdv" "~.dep" "~.dot" "~.nib" "~.plst" ".git" ".hg" ".pc" - ".svn" "_MTN" "blib" "CVS" "RCS" "SCCS" "_darcs" "_sgbak" "autom4te.cache" - "cover_db" "_build" ".ropeproject" "__pycache__") - "Directories ignored when scanning project files.") - -(defvar python-django-ui-allowed-extensions - '("css" "gif" "htm" "html" "jpg" "js" "json" "mo" "png" "po" "py" "txt" "xml" - "yaml" "scss" "less") - "Allowed extensions when scanning project files.") - -(defcustom python-django-ui-image-enable t - "Enable images for widgets?" - :group 'python-django - :type 'boolean - :safe 'booleanp) - -(defcustom python-django-ui-theme "folder" - "Default theme for widgets." - :group 'python-django - :type 'boolean - :safe 'stringp) - -(defcustom python-django-ui-buffer-switch-function 'switch-to-buffer - "Function for switching to the project buffer. -The function receives one argument, the status buffer." - :group 'python-django - :type '(radio (function-item switch-to-buffer) - (function-item pop-to-buffer) - (function-item display-buffer) - (function :tag "Other"))) - -(defun python-django-ui-show-buffer (buffer) - "Show the Project BUFFER." - (funcall python-django-ui-buffer-switch-function buffer)) - -(defun python-django-ui-clean () - "Empty current UI buffer." - (let ((inhibit-read-only t)) - (erase-buffer))) - -(defun python-django-ui-insert-header () - "Draw header information." - (insert - (format "%s\t\t%s\n" - (propertize - "Django Version:" - 'face 'python-django-face-title) - (propertize - (python-django-info-get-version) - 'face 'python-django-face-django-version)) - (format "%s\t\t%s\n" - (propertize - "Project:" - 'face 'python-django-face-title) - (propertize - python-django-project-root - 'face 'python-django-face-project-root)) - (format "%s\t\t%s\n" - (propertize - "Settings:" - 'face 'python-django-face-title) - (propertize - python-django-project-settings - 'face 'python-django-face-settings-module)) - (format "%s\t\t%s" - (propertize - "Virtualenv:" - 'face 'python-django-face-title) - (propertize - (or python-shell-virtualenv-path "None") - 'face 'python-django-face-virtualenv-path)) - "\n\n\n")) - -(defun python-django-ui-build-section-alist () - "Create section Alist for current project." - (list - (cons - "Apps" - (mapcar - (lambda (app) - (cons app (python-django-info-get-app-path app))) - (python-django-info-get-installed-apps))) - (cons - "Media" - (list - (cons "MEDIA_ROOT" (python-django-info-get-setting "MEDIA_ROOT")) - (cons "STATIC_ROOT" (python-django-info-get-setting "STATIC_ROOT")))) - (cons - "Static Content" (mapcar - (lambda (dir) - ;; STATICFILES_DIRS elements can be either a - ;; string or a size-two tuple with the first - ;; element being the prefix and the latter - ;; being the path: http://bit.ly/16Fw9xW - (if (stringp dir) - (cons dir dir) - (cons (aref dir 0) (aref dir 1)))) - (python-django-info-get-setting "STATICFILES_DIRS"))) - (cons - "Templates" (mapcar - (lambda (dir) - (cons dir dir)) - (python-django-info-get-setting "TEMPLATE_DIRS"))))) - -;; Many kudos to Ye Wenbin since dirtree.el was of great help when -;; looking for examples of `tree-widget': -;; https://github.com/zkim/emacs-dirtree/blob/master/ -(define-widget 'python-django-ui-tree-section-widget 'tree-widget - "Tree widget for sections of Django Project buffer." - :expander 'python-django-ui-tree-section-widget-expand - :help-echo 'ignore - :has-children t) - -(define-widget 'python-django-ui-tree-section-node-widget 'push-button - "Widget for a nodes of `python-django-ui-tree-section-widget'." - :format "%[%t%]\n" - :button-face 'default - :notify 'python-django-ui-tree-section-widget-expand) - -(define-widget 'python-django-ui-tree-dir-widget 'tree-widget - "Tree widget for directories of Django Project." - :expander 'python-django-ui-tree-dir-widget-expand - :help-echo 'ignore - :has-children t) - -(define-widget 'python-django-ui-tree-file-widget 'push-button - "Widget for a files inside the `python-django-ui-tree-dir-widget'." - :format "%[%t%]\n" - :button-face 'default - :notify 'python-django-ui-tree-file-widget-select) - -(defun python-django-ui-tree-section-widget-expand (tree &rest ignore) - "Expand directory for given section TREE widget. -Optional argument IGNORE is there for compatibility." - (or (widget-get tree :args) - (let ((section-alist (widget-get tree :section-alist))) - (mapcar (lambda (section) - (let ((name (car section)) - (dir (cdr section))) - `(python-django-ui-tree-dir-widget - :node (python-django-ui-tree-file-widget - :tag ,name - :file ,dir) - :file ,dir - :open nil - :indent 0))) - section-alist)))) - -(defun python-django-ui-tree-dir-widget-expand (tree) - "Expand directory for given TREE widget." - (or (widget-get tree :args) - (let* ((dir (widget-get tree :file)) - dir-list file-list) - (when (and dir (file-exists-p dir)) - (dolist (file (directory-files dir t)) - (let ((basename (file-name-nondirectory file))) - (if (file-directory-p file) - (when (not (member basename python-django-ui-ignored-dirs)) - (setq dir-list (cons basename dir-list))) - (when (member (python-django-util-file-name-extension file) - python-django-ui-allowed-extensions) - (setq file-list (cons basename file-list)))))) - (setq dir-list (sort dir-list 'string<)) - (setq file-list (sort file-list 'string<)) - (append - (mapcar (lambda (file) - `(python-django-ui-tree-dir-widget - :file ,(expand-file-name file dir) - :node (python-django-ui-tree-file-widget - :tag ,file - :file ,(expand-file-name file dir)))) - dir-list) - (mapcar (lambda (file) - `(python-django-ui-tree-file-widget - :file ,(and file (not (string= file "")) - (expand-file-name file dir)) - :tag ,file)) - file-list)))))) - -(defun python-django-ui-tree-file-widget-select (node &rest ignore) - "Open file in other window. -Argument NODE and IGNORE are just for compatibility." - (let ((file (widget-get node :file))) - (and file (find-file-other-window file)))) - -(defun python-django-ui-tree-section-insert (name section-alist) - "Create tree widget for NAME and SECTION-ALIST." - (apply 'widget-create - `(python-django-ui-tree-section-widget - :node (python-django-ui-tree-section-node-widget - :tag ,name) - :section-alist ,section-alist - :open t))) - -(defun python-django-ui-widget-move (arg) - "Move between widgets sensibly in the project buffer. -Movement between widgets of the tree happen line by line, leaving -point next to the closest icon available. With positive ARG move -forward that many times, else backwards." - (let* ((success-moves 0) - (forward (> arg 0)) - (func (if forward - 'widget-forward - 'widget-backward)) - (abs-arg (abs arg))) - (catch 'nowidget - (while (> abs-arg success-moves) - (if (memq (widget-type (widget-at (point))) - '(tree-widget-close-icon - tree-widget-empty-icon - tree-widget-leaf-icon - tree-widget-open-icon)) - (ignore-errors (funcall func 2)) - (ignore-errors (funcall func 1))) - (when (not (widget-at (point))) - (throw 'nowidget t)) - (setq success-moves (1+ success-moves)))) - (python-django-ui-move-to-closest-icon) - (setq default-directory - (or (python-django-ui-directory-at-point) - (file-name-directory python-django-project-manage.py))))) - -(defun python-django-ui-widget-forward (arg) - "Move point to the next line's main widget. -With optional ARG, move across that many fields." - (interactive "p") - (python-django-ui-widget-move arg)) - -(defun python-django-ui-widget-backward (arg) - "Move point to the previous line's main widget. -With optional ARG, move across that many fields." - (interactive "p") - (python-django-ui-widget-move (- arg))) - -(defun python-django-ui-move-up-tree (arg) - "Move point to the parent widget of the tree. -With optional ARG, move across that many fields." - (interactive "p") - (and (< arg 0) (setq arg (- arg))) - (python-django-ui-move-to-closest-icon) - (let ((start-depth (- (point) (line-beginning-position)))) - (when (not (= 0 start-depth)) - (while (<= start-depth (- (point) (line-beginning-position))) - (python-django-ui-widget-backward 1))))) - -(defun python-django-ui-beginning-of-widgets () - "Move to the first widget. -With optional ARG, move across that many fields." - (interactive) - (goto-char (point-min)) - (python-django-ui-widget-forward 1)) - -(defun python-django-ui-end-of-widgets () - "Move point to last widget. -With optional ARG, move across that many fields." - (interactive) - (goto-char (point-max)) - (python-django-ui-widget-backward 1)) - -(defun python-django-ui-move-to-closest-icon () - "Move to closest button from point." - (interactive) - (if (and - (not (widget-at (point))) - (not (widget-at (1- (point))))) - (progn - (widget-backward 1) - (beginning-of-line 1) - (widget-forward 1)) - (beginning-of-line 1) - (and (not (widget-at (point))) - (widget-forward 1)))) - -(defun python-django-ui-safe-button-press () - "Move to closest button from point and press it." - (interactive) - (and (not (widget-at (point))) - (python-django-ui-move-to-closest-icon)) - (widget-button-press (point))) - -(defun python-django-ui-widget-type-at-point () - "Return the node type for current position." - (let* ((widget (widget-at (point))) - (file-p (widget-get - (tree-widget-node widget) - :tree-widget--guide-flags))) - (and widget (if file-p 'file 'dir)))) - -(defun python-django-ui-directory-at-point () - "Return the node type for current position." - (widget-get - (widget-get (tree-widget-node (widget-at (point))) :parent) :file)) - - -;;;Main functions - -(defcustom python-django-known-projects nil - "Alist of known projects." - :group 'python-django - :type '(repeat (list string string string)) - :safe (lambda (val) - (and - (stringp (car val)) - (stringp (nth 1 val)) - (stringp (nth 2 val))))) - -(defun python-django-mode-find-next-buffer () - "Find the next Django project buffer available." - (let ((current-buffer (current-buffer))) - (catch 'buffer - (dolist (buf (buffer-list)) - (and (with-current-buffer buf - (and (eq major-mode 'python-django-mode) - (not (equal buf current-buffer)))) - (throw 'buffer buf)))))) - -(defun python-django-mode-on-kill-buffer () - "Hook run on `buffer-kill-hook'." - (and (python-django-mgmt-buffer-list (current-buffer)) - (call-interactively 'python-django-mgmt-kill-all))) - -(define-derived-mode python-django-mode special-mode "Django" - "Major mode to manage Django projects. - -\\{python-django-mode-map}") - -;;;###autoload -(defun python-django-open-project (directory settings &optional existing) - "Open a Django project at given DIRECTORY using SETTINGS. -Optional argument EXISTING is internal and should not be used. - -The recommended way to chose your project root, is to use the -directory containing your settings module; for instance if your -settings module is in /path/django/settings.py, use /path/django/ -as your project path and django.settings as your settings module. - -When called with no `prefix-arg', this function will try to find -an opened project-buffer, if current buffer is already a project -buffer it will cycle to next opened project. If no project -buffers are found, then the user prompted for the project path -and settings module unless `python-django-project-root' and -`python-django-project-settings' are somehow set, normally via -directory local variables. If none of the above matched or the -function is called with one `prefix-arg' and there are projects -defined in the `python-django-known-projects' variable the user -is prompted for any of those known projects, if the variable -turns to be nil the user will be prompted for project-path and -settings module (the same happens when called with two or more -`prefix-arg')." - (interactive - (let ((buf - ;; Get an existing project buffer that's not the current. - (python-django-mode-find-next-buffer))) - (cond - ((and (not current-prefix-arg) - (not buf) - python-django-project-root - python-django-project-settings) - ;; There's no existing buffer but project variables are - ;; set, so use them to open the project. - (list python-django-project-root - python-django-project-settings - ;; if the user happens to be in the project buffer - ;; itself, do nothing. - (and (eq major-mode 'python-django-mode) - (current-buffer)))) - ((and (not current-prefix-arg) buf) - ;; there's an existing buffer move/cycle to it. - (with-current-buffer buf - (list - python-django-project-root - python-django-project-settings - buf))) - ((or (and python-django-known-projects - (<= (prefix-numeric-value current-prefix-arg) 4))) - ;; When there are known projects and called at most with one - ;; prefix arg try opening a known project. - (cdr - (assoc - (python-django-minibuffer-read-from-list - "Project: " python-django-known-projects) - python-django-known-projects))) - (t - (let ((root)) - ;; When called with two or more prefix arguments or all - ;; input methods failed. - (list - (setq root (read-directory-name - "Project Root: " python-django-project-root nil t)) - (read-string - "Settings module: " - (or python-django-project-settings - (format "%s.settings" - (python-django-info-directory-basename root)))))))))) - (if (not existing) - (let* ((directory (expand-file-name directory)) - (project-name (python-django-info-directory-basename directory)) - (buffer-name - (format "*Django: %s (%s)*" - project-name - (python-django-util-shorten-settings settings))) - (success t)) - (with-current-buffer (get-buffer-create buffer-name) - (let ((inhibit-read-only t)) - (python-django-mode) - (python-django-ui-clean) - (set (make-local-variable - 'python-django-info--get-setting-cache) nil) - (set (make-local-variable - 'python-django-info--get-version-cache) nil) - (set (make-local-variable - 'python-django-info--get-app-paths-cache) nil) - (set (make-local-variable - 'python-django-project-root) directory) - (set (make-local-variable - 'python-django-project-settings) settings) - (set (make-local-variable - 'python-django-project-name) project-name) - (set (make-local-variable - 'python-django-project-manage.py) - (python-django-info-find-manage.py directory)) - (set (make-local-variable 'default-directory) - (file-name-directory - python-django-project-manage.py)) - (python-django-util-clone-local-variables) - (set (make-local-variable 'tree-widget-image-enable) - python-django-ui-image-enable) - (tree-widget-set-theme python-django-ui-theme) - (condition-case err - (progn - (python-django-ui-insert-header) - (mapc (lambda (section) - (python-django-ui-tree-section-insert - (car section) (cdr section)) - (insert "\n")) - (python-django-ui-build-section-alist))) - (user-error - (setq success nil) - (insert (error-message-string err)) - (goto-char (point-min))))) - (when success - (add-hook 'kill-buffer-hook - #'python-django-mode-on-kill-buffer nil t) - (python-django-ui-beginning-of-widgets)) - (python-django-ui-show-buffer (current-buffer)))) - (python-django-ui-show-buffer existing))) - -;; Stolen from magit. -(defun python-django-close-project (&optional kill-buffer) - "Bury the buffer and delete its window. -With a prefix argument, KILL-BUFFER instead." - (interactive "P") - (quit-window kill-buffer (selected-window))) - -(defun python-django-refresh-project () - "Refresh Django project." - (interactive) - (python-django-open-project - python-django-project-root - python-django-project-settings)) - -(provide 'python-django) - -;; Local Variables: -;; coding: utf-8 -;; indent-tabs-mode: nil -;; End: - -;;; python-django.el ends here diff --git a/elpa/python-django-20150822.404/python-django.elc b/elpa/python-django-20150822.404/python-django.elc deleted file mode 100644 index 635771fa58433ed45e428df20aa30a50d226b262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161109 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 At^fc4 diff --git a/elpa/python-docstring-20190716.921/docstring_wrap.py b/elpa/python-docstring-20190716.921/docstring_wrap.py deleted file mode 100644 index 9f9c5664..00000000 --- a/elpa/python-docstring-20190716.921/docstring_wrap.py +++ /dev/null @@ -1,664 +0,0 @@ -# Copyright (C) 2012 -# See LICENSE.txt for details. - -""" -General Python docstring wrapper -================================ - -Utility for wrapping docstrings in Python; specifically, docstrings in -U{Epytext } or Sphinx -ReStructureText format. - -The wrapping herein generally adheres to all the conventions set forth by the -Twisted project U{http://twistedmatrix.com/}, but should be generally accurate -for most Python projects. -""" - -from __future__ import unicode_literals - -import argparse -import sys -import re - -from io import StringIO -from uuid import uuid4 - - -__all__ = [ - "wrapPythonDocstring" -] - - -if sys.version_info[0] <= 2: - makeID = lambda: unicode(uuid4()) - fromStdin = lambda s: s.decode("utf-8") - toStdout = lambda s: s.encode("utf-8") - PY2 = True -else: - makeID = lambda: str(uuid4()) - fromStdin = lambda s: s - toStdout = lambda s: s - PY2 = False - - - -def isUnderline(expr): - return bool(re.match("[=]+$", expr) or re.match("[-]+$", expr)) - - - -def startslist(x): - return (x == '-' or (x.endswith(".") and (x[:-1].isdigit() - or x[:-1] == '#'))) - - - -def isAcronym(word): - """ - Is the given word an acronym (separated by periods, so it doesn't end a - sentence)? cf. lots of interesting acronyms, e.g. this is one. solve for - x. a.b.c. is also one. You might also want to give an example - parenthetically (e.g. this one). - """ - word = word.strip("(") - return ((len(word) > 2 and word[1::2] == '.' * int(len(word) / 2)) or - word in ["cf.", "viz."]) - - - -def isSentenceEnd(prevWord): - """ - Is the given word the end of a sentence? - """ - if not prevWord: - return False - # Exclamation points and question marks generally end sentences. - if prevWord[-1] in "?!": - return True - # Now, if it's not a period, it's probably not the end of a sentence. - if prevWord[-1] != ".": - return False - if isAcronym(prevWord): - return False - return True - - - -def beginsField(line): - """ - Does the given (stripped) line begin an epytext or ReST field? - """ - if line.startswith("@"): - return True - sphinxwords = """ - param params return type rtype summary var ivar cvar raises raise except - exception - """.split() - for word in sphinxwords: - if line.startswith(":" + word): - return True - return False - - - -class RegularParagraph(object): - otherIndent = "" - - def __init__(self, pointTracker, fixedIndent="", hangIndent="", - followIndent="", originalIndent=0): - self.words = [] - self.fixedIndent = fixedIndent - self.hangIndent = hangIndent - self.followIndent = followIndent - self.more = None - self.prev = None - self.pointTracker = pointTracker - # originalIndent is the width of the indentation of the line this - # paragraph originally came from in the input text. - self.originalIndent = originalIndent - self._unwrappedLines = 0 - self._headingType = None - self._headingPoints = [] - - - def matchesTag(self, other): - return False - - - def __nonzero__(self): - return bool(self.words) - - - def all(self): - while self is not None: - #print self.__class__.__name__ - if self: - yield self - self = self.more - - - def setIsHeading(self, headingType): - self._headingType = headingType - - - def isHeading(self): - return bool(self._headingType) - - def connect(self, more): - self.more = more - more.prev = self - return more - - def islist(self): - return self.words and startslist(self.words[0]) - - def previousListPeer(self): - """ - Find a previous paragraph that is also a list element, of the same - indentation level if one exists. - """ - previous = self.prev - matched = None - while previous: - if not previous.words: - previous = previous.prev - continue - if not previous.islist(): - break - if previous.originalIndent <= self.originalIndent: - return previous - if previous.originalIndent > self.originalIndent: - matched = previous - previous = previous.prev - if matched: - return matched - - def add(self, line): - clean = self.pointTracker.peek(line) - stripped = clean.strip() - thisLineIndent = len(clean) - len(clean.lstrip()) - - if stripped: - self._unwrappedLines += 1 - active = self - firstword = list(self.pointTracker.filterWords(line.split()))[0] - if beginsField(stripped): - fp = FieldParagraph(pointTracker=self.pointTracker, originalIndent=thisLineIndent) - fp.words.extend(line.split()) - active = active.connect(fp) - elif isUnderline(stripped) and self._unwrappedLines == 2: - # This paragraph is actually a section heading. - active.setIsHeading(stripped[0]) - self._headingPoints = self.pointTracker.extractPoints(line) - # FIXME: should respect leading indentation. - active = active.connect(self.genRegular(originalIndent=thisLineIndent)) - elif startslist(firstword): - # Aesthetically I prefer a 2-space indent here, but the - # convention in the codebase seems to be 4 spaces. - LIST_INDENT = 4 - # FIXME: this also needs to respect leading indentation so it - # can properly represent nested lists. - hangIndent = self.pointTracker.lengthOf(firstword) + 1 - fi = self.fixedIndent - if not (self.words and startslist(self.words[0])): - fi += (" " * LIST_INDENT) - fp = RegularParagraph( - pointTracker=self.pointTracker, - fixedIndent=fi, - hangIndent=" " * hangIndent, - followIndent=self.followIndent, - originalIndent=thisLineIndent, - ) - fp.words.extend(line.split()) - fp.prev = self - peer = fp.previousListPeer() - if peer: - if peer.originalIndent >= fp.originalIndent: - fp.fixedIndent = peer.fixedIndent - else: - fp.fixedIndent = peer.fixedIndent + (" " * LIST_INDENT) - active = active.connect(fp) - else: - self.words.extend(line.split()) - if stripped.endswith("::"): - active = active.connect(PreFormattedParagraph( - active, - indentBegins=thisLineIndent - )) - return active - else: - rawstrip = line.strip() - if rawstrip: - self.words.append(rawstrip) - if len(list(self.pointTracker.filterWords(self.words))): - return self.connect(self.genRegular(originalIndent=thisLineIndent)) - return self - - - def wrap(self, output, indentation, width, initialBlank, singleSpace): - maxWidthThisLine = width - if not self.words: - return - if initialBlank: - thisLine = self.firstIndent(indentation) - else: - thisLine = '' - maxWidthThisLine -= (3 + len(indentation)) - first = True - prevWord = '' - for num, word in enumerate(self.words): - if not self.pointTracker.isWord(word): - thisLine += word - continue - normalPrevWord = self.pointTracker.peek(prevWord) - if num == 1 and startslist(normalPrevWord): - spaces = 1 - elif isSentenceEnd(normalPrevWord) and singleSpace: - spaces = 2 - else: - spaces = 1 - prevWord = word - thisLineWidthWithThisWord = (self.pointTracker.lengthOf(thisLine) + - self.pointTracker.lengthOf(word) + - spaces) - if thisLineWidthWithThisWord <= maxWidthThisLine or first: - if first: - first = not first - else: - thisLine += (" " * spaces) - thisLine += word - else: - output.write(self.pointTracker.scan(thisLine, output.tell())) - output.write("\n") - maxWidthThisLine = width - thisLine = self.restIndent(indentation) + word - output.write(self.pointTracker.scan(thisLine, output.tell())) - output.write("\n") - if self.isHeading(): - indentText = self.firstIndent(indentation) - lineSize = self.pointTracker.lengthOf(thisLine) - len(indentText) - output.write(self.pointTracker.scan( - indentText + ''.join(self._headingPoints) + - (self._headingType * lineSize), output.tell() - )) - output.write("\n") - - - def firstIndent(self, indentation): - return indentation + self.fixedIndent - - - def restIndent(self, indentation): - return (indentation + self.fixedIndent + self.hangIndent + - self.otherIndent) - - - def genRegular(self, originalIndent=0): - return RegularParagraph(pointTracker=self.pointTracker, - fixedIndent=self.nextIndent(), - followIndent=self.nextIndent(), - originalIndent=originalIndent) - - - def nextIndent(self): - return self.followIndent - - - -class FieldParagraph(RegularParagraph): - - @property - def otherIndent(self): - """ - Compute the other indent appropriate to the length of a sphinx field, - if we're wrapping a sphinx field. - """ - if self.words[0].startswith(':'): - accumulatedLength = 0 - for word in self.words: - word = self.pointTracker.peek(word) - # Add the length of the word - accumulatedLength += len(word) - # Add the following space - accumulatedLength += 1 - # If it gets too long then give up and go with the default. - if accumulatedLength > 10: - break - if word.endswith(":"): - return accumulatedLength * " " - return " " - - - def nextIndent(self): - return " " - - - def matchesTag(self, other): - if isinstance(other, FieldParagraph): - myWords = list(self.pointTracker.filterWords(self.words)) - theirWords = list(self.pointTracker.filterWords(other.words)) - if ( set([myWords[0], theirWords[0]]) == - set(["@return:", "@rtype:"]) ): - # matching @return and @rtype fields. - return True - elif myWords[0][0] == theirWords[0][0] == ':': - # hack for sphinx: prevailing style seems to be 'group @params - # together' - if myWords[0] == theirWords[0]: - return True - elif ( set([myWords[0], theirWords[0]]) == - set([":return:", ":rtype:"]) ): - return True - elif ( set([myWords[0], theirWords[0]]) == - set([":param", ":type"]) and - len(myWords) > 1 and len(theirWords) > 1 and - myWords[1] == theirWords[1]): - # same as "matching @param and @type" below, but stricter; - # FIXME: these should be merged. - return True - else: - return False - elif len(myWords) > 1 and len(theirWords) > 1: - # matching @param and @type fields. - return myWords[1] == theirWords[1] - return False - else: - return False - - - -class PreFormattedParagraph(object): - - def __init__(self, before, indentBegins): - self.lines = [] - self.before = before - - pointTracker = before.pointTracker - - fixedIndent = (before.fixedIndent + before.hangIndent + - before.otherIndent) - - self.indentBegins = indentBegins - self.fixedIndent = fixedIndent - self.more = None - self.prev = None - self.pointTracker = pointTracker - - - def islist(self): - """ - It's not a list. - """ - return False - - - def connect(self, more): - self.more = more - more.prev = self - return more - - - @property - def originalIndent(self): - return self.indentBegins - - - @property - def words(self): - """ - Used by wrapper below to see if there are any words in a given - paragraph and whether it should be skipped. - """ - return bool(self.lines) - - - def matchesTag(self, other): - return False - - - def add(self, line): - actualLine = self.pointTracker.peek(line) - - if actualLine.strip(): - if len(actualLine) - len(actualLine.lstrip()) <= self.indentBegins: - next = self.connect(self.before.genRegular()) - return next.add(line) - self.lines.append(line.rstrip()) - else: - self.lines.append(line.strip()) - return self - - - def fixIndentation(self): - while self.lines and not self.lines[0].strip(): - self.lines.pop(0) - while self.lines and not self.lines[-1].strip(): - self.lines.pop() - if not self.lines: - return - cleanLines = list(map(self.pointTracker.peek, self.lines)) - commonLeadingIndent = min([len(x) - len(x.lstrip()) for x in cleanLines - if x.strip()] or [0]) - newLines = [] - for actualLine, line in zip(cleanLines, self.lines): - if actualLine != line and line[:commonLeadingIndent].strip(): - # There's a marker, and it's in the leading whitespace. - # Explicitly reposition the marker at the beginning of the - # fixed indentation. - line = (self.pointTracker.marker + - actualLine[commonLeadingIndent:]) - else: - line = line.rstrip()[commonLeadingIndent:] - newLines.append(line) - self.lines = newLines - - - def wrap(self, output, indentation, width, initialBlank, singleSpace): - # OK, now we know about all the lines we're going to know about. - self.fixIndentation() - for line in self.lines: - if self.pointTracker.peek(line): - output.write(indentation + " " + self.fixedIndent) - output.write(self.pointTracker.scan(line, output.tell())) - output.write("\n") - - - -class PointTracker(object): - """ - Object for keeping track of where the insertion points are. - """ - - def __init__(self, point): - self.point = point - self.marker = "{" + makeID() + "}" - self.outPoints = [] - - - def annotate(self, text): - """ - Add point references to a block of text. - """ - return text[:self.point] + self.marker + text[self.point:] - - - def filterWords(self, words): - for word in words: - if self.isWord(word): - yield self.peek(word) - - - def isWord(self, text): - """ - Is the given word actually a word, or just an artifact of the - point-tracking process? If it's just the point marker by itself, then - no, it isn't, and don't insert additional whitespace after it. - """ - return not (text == self.marker) - - - def lengthOf(self, word): - """ - How long would this word be if it didn't have any point-markers in it? - """ - return len(self.peek(word)) - - - def peek(self, word): - """ - What would this word look like if it didn't have any point-markers in - it? - """ - return word.replace(self.marker, "") - - - def extractPoints(self, text): - """ - Return a C{list} of all point markers contained in the text. - """ - if self.marker in text: - return [self.marker] - return [] - - - def scan(self, text, offset): - """ - Scan some text for point markers, remember them, and remove them. - """ - idx = text.find(self.marker) - if idx == -1: - return text - self.outPoints.append(idx + offset) - return self.peek(text) - - - -def wrapPythonDocstring(docstring, output, indentation=" ", - width=79, point=0, initialBlank=True, - singleSpace=False): - """ - Wrap a given Python docstring. - - @param docstring: the docstring itself (just the stuff between the quotes). - @type docstring: unicode - - @param output: The unicode output file to write the wrapped docstring to. - @type output: L{file}-like (C{write} takes unicode.) - - @param indentation: a string (consisting only of spaces) indicating the - amount of space to shift by. Don't adjust this. It's always 4 spaces. - PEP8 says so. - @type indentation: L{unicode} - - @param width: The maximum number of characters allowed in a wrapped line. - @type width: L{int} - - @param point: The location of the cursor in the text, as an offset from the - beginning of the docstring. If this function is being used from within - a graphical editor, this parameter can be used (in addition to the - return value of this function) to reposition the cursor at the relative - position which the user will expect. - - @param singleSpace: If true, use a single space between sentences instead - of two. - - @return: The new location of the cursor. - """ - # TODO: multiple points; usable, for example, for start and end of a - # currently active selection. - pt = PointTracker(point) - start = paragraph = RegularParagraph(pt) - docstring = pt.annotate(docstring) - for line in docstring.split("\n"): - paragraph = paragraph.add(line) - prevp = None - # output.write("{}".format(initialBlank)) - for paragraph in start.all(): - if initialBlank: - if paragraph.words and not paragraph.matchesTag(prevp): - output.write("\n") - prevp = paragraph - paragraph.wrap(output, indentation, width, initialBlank, singleSpace) - initialBlank = True - output.write(indentation) - return pt.outPoints[0] if pt.outPoints else 0 - - - -def indentHeuristic(lines, io): - """ - Determine the indentation. - """ - for num, line in enumerate(lines): - if num == 0: - initialBlank = not bool(line) - if not initialBlank: - continue - indentation = (len(line) - len(line.lstrip())) - if indentation: - return (initialBlank, indentation) - # TODO: investigate the case where this happens. - return True, 0 - - - -def sampleDocstring(): - """This is a sample docstring where the last word is a little bit too long - go go. - - This is another part of the docstring. - """ - - -def main(argv, indata): - parser = argparse.ArgumentParser() - parser.add_argument("--offset", type = int) - parser.add_argument("--indent", type = int) - parser.add_argument("--width", type = int, default = 79) - parser.add_argument("--linewise", action='store_true') - parser.add_argument("--single-space", action='store_false') - namespace = parser.parse_args(argv[1:]) - - io = StringIO() - inlines = indata.split("\n") - if namespace.linewise: - inlines.insert(0, "") - initialBlank, indentCount = indentHeuristic(inlines, io) - point = 0 - width = namespace.width - - if namespace.offset is not None: - point = namespace.offset - if namespace.indent is not None: - indentCount = namespace.indent - - offset = wrapPythonDocstring( - indata, io, - indentation=" " * indentCount, - width=width, - point=point, - initialBlank=initialBlank, - singleSpace=namespace.single_space - ) - prefix = StringIO() - if namespace.offset is not None: - prefix.write("{:d}".format(offset)) - prefix.write(" ") - - output = prefix.getvalue() + io.getvalue() - if namespace.linewise: - output = "\n".join(output.split("\n")[1:-1]) - return output - - -if __name__ == '__main__': - sys.stdout.write( - toStdout( - main( - sys.argv, - fromStdin(sys.stdin.read()), - ) - ) - ) - - sys.stdout.flush() diff --git a/elpa/python-docstring-20190716.921/python-docstring-autoloads.el b/elpa/python-docstring-20190716.921/python-docstring-autoloads.el deleted file mode 100644 index e852f478..00000000 --- a/elpa/python-docstring-20190716.921/python-docstring-autoloads.el +++ /dev/null @@ -1,45 +0,0 @@ -;;; python-docstring-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "python-docstring" "python-docstring.el" (0 -;;;;;; 0 0 0)) -;;; Generated autoloads from python-docstring.el - -(autoload 'python-docstring-fill "python-docstring" "\ -Wrap Python docstrings as epytext or ReStructured Text. - -\(fn)" t nil) - -(autoload 'python-docstring-mode "python-docstring" "\ -Toggle python-docstring-mode. -With no argument, this command toggles the mode. -Non-null prefix argument turns on the mode. -Null prefix argument turns off the mode. - -\(fn &optional ARG)" t nil) - -(autoload 'python-docstring-install "python-docstring" "\ -Add python-docstring-mode as a hook to python.mode. - -\(fn)" nil nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "python-docstring" '("python-docstring-"))) - -;;;*** - -;;;### (autoloads nil nil ("python-docstring-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; python-docstring-autoloads.el ends here diff --git a/elpa/python-docstring-20190716.921/python-docstring-pkg.el b/elpa/python-docstring-20190716.921/python-docstring-pkg.el deleted file mode 100644 index 78e8264b..00000000 --- a/elpa/python-docstring-20190716.921/python-docstring-pkg.el +++ /dev/null @@ -1,4 +0,0 @@ -(define-package "python-docstring" "20190716.921" "Smart Python docstring formatting" 'nil) -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/python-docstring-20190716.921/python-docstring.el b/elpa/python-docstring-20190716.921/python-docstring.el deleted file mode 100644 index de9781eb..00000000 --- a/elpa/python-docstring-20190716.921/python-docstring.el +++ /dev/null @@ -1,182 +0,0 @@ -;;; python-docstring.el --- Smart Python docstring formatting - -;; Copyright (c) 2014-2015 The Authors -;; -;; Permission is hereby granted, free of charge, to any person obtaining -;; a copy of this software and associated documentation files (the -;; "Software"), to deal in the Software without restriction, including -;; without limitation the rights to use, copy, modify, merge, publish, -;; distribute, sublicense, and/or sell copies of the Software, and to -;; permit persons to whom the Software is furnished to do so, subject to -;; the following conditions: -;; -;; The above copyright notice and this permission notice shall be -;; included in all copies or substantial portions of the Software. -;; -;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -;; LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -;; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -;; WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -;;; Commentary: - -;; python-docstring-mode.el is a minor mode for intelligently -;; reformatting (refilling) and highlighting Python docstrings. It -;; understands both epytext and Sphinx formats (even intermingled!), -;; so it knows how to reflow them correctly. It will also highlight -;; markup in your docstrings, including epytext and reStructuredText. - -;;; Code: - -(defcustom python-docstring-sentence-end-double-space t - "If non-nil, use double spaces when formatting text. - -Operates simililarly to `sentence-end-double-space'. When nil, a -single space is used." - :type 'boolean - :group 'python-docstring) - -(defvar python-docstring-script - (concat (if load-file-name - (file-name-directory load-file-name) - default-directory) - "docstring_wrap.py") - "The location of the docstring_wrap.py script.") - -;;;###autoload -(defun python-docstring-fill () - "Wrap Python docstrings as epytext or ReStructured Text." - (interactive) - (let ((fill-it-anyway nil)) - (catch 'not-a-string - (let* ((to-forward - (save-excursion - (let* ((orig-point (point)) - (syx (syntax-ppss)) - (in-string (if (nth 3 syx) t - (progn - (setf fill-it-anyway t) - (throw 'not-a-string nil)))) - (string-start (+ (goto-char (nth 8 syx)) - 3)) - (rawchar (if (eql (char-before (point)) ?r) - 1 - 0)) - ;; at the beginning of the screen here - (indent-count (- (- string-start (+ rawchar 3)) - (save-excursion - (beginning-of-line) - (point)))) - (string-end - (- (condition-case () ; for unbalanced quotes - (progn (forward-sexp) - (point)) - (error (point-max))) - 3)) - (orig-offset (- orig-point string-start))) - (let* - ((offset-within - (progn - (shell-command-on-region - string-start string-end - (format - (concat "python3 %s --offset %s --indent %s --width %s" - (unless python-docstring-sentence-end-double-space - " --single-space")) - (shell-quote-argument python-docstring-script) - orig-offset - indent-count - fill-column - ) - :replace t) - (goto-char string-start) - (forward-sexp) - (string-to-number - (buffer-substring-no-properties string-start orig-point)) - ))) - (delete-region string-start (+ 1 (point))) - offset-within))))) - (forward-char to-forward))) - (if fill-it-anyway - (call-interactively 'fill-paragraph)))) - -(defvar python-docstring-field-with-arg-re - "^\\s-*\\([@:]\\)\\(param\\|parameter\\|arg\\|argument\\|type\\|keyword\\|kwarg\\|kwparam\\|raise\\|raises\\|except\\|exception\\|ivar\\|ivariable\\|cvar\\|cvariable\\|var\\|variable\\|type\\|group\\|todo\\|newfield\\)\\s-+\\([a-zA-Z_][a-zA-Z0-9_,. ]*?\\)\\(:\\)") - -(defvar python-docstring-field-no-arg-re - "^\\s-*\\([@:]\\)\\(raise\\|raises\\|return\\|returns\\|rtype\\|returntype\\|type\\|sort\\|see\\|seealso\\|note\\|attention\\|bug\\|warning\\|warn\\|version\\|todo\\|deprecated\\|since\\|status\\|change\\|changed\\|permission\\|requires\\|require\\|requirement\\|precondition\\|precond\\|postcondition\\|postcod\\|invariant\\|author\\|organization\\|org\\|copyright\\|(c)\\|license\\|contact\\|summary\\|params\\|param\\)\\(:\\)") - -(defvar python-docstring-epytext-markup-link "[UL]{\\([^}]*?\\)\\(<.*?>\\|\\)?}") -(defvar python-docstring-epytext-markup-style-code "C{\\(.*?\\)}") -(defvar python-docstring-epytext-markup-style-italic "I{\\(.*?\\)}") -(defvar python-docstring-epytext-markup-style-bold "B{\\(.*?\\)}") - -;; hack for sphinx -(defvar python-docstring-sphinx-markup-link "\\(:[^:]+?:\\)\\(`.+?`\\)") -(defvar python-docstring-sphinx-markup-code "``\\(.+?\\)``") - -(defvar python-docstring-keywords - `((,python-docstring-field-with-arg-re 1 font-lock-keyword-face t) - (,python-docstring-field-with-arg-re 2 font-lock-type-face t) - (,python-docstring-field-with-arg-re 3 font-lock-variable-name-face t) - (,python-docstring-field-with-arg-re 4 font-lock-keyword-face t) - (,python-docstring-field-no-arg-re 1 font-lock-keyword-face t) - (,python-docstring-field-no-arg-re 2 font-lock-type-face t) - (,python-docstring-field-no-arg-re 3 font-lock-keyword-face t) - - ;; :foo:`bar` - (,python-docstring-sphinx-markup-link 1 font-lock-function-name-face t) - (,python-docstring-sphinx-markup-link 2 font-lock-constant-face t) - ;; ``bar`` - (,python-docstring-sphinx-markup-code 0 font-lock-constant-face t) - ;; inline markup - 1 - (,python-docstring-sphinx-markup-code 1 '(bold italic) t) - - ;; L/U - 1 - (,python-docstring-epytext-markup-link 0 font-lock-constant-face t) - ;; Inline Markup - 1 - (,python-docstring-epytext-markup-link 1 font-lock-function-name-face t) - ;; Link - 2 - (,python-docstring-epytext-markup-link 2 font-lock-keyword-face t) - - ;; C/I/B - 0 - (,python-docstring-epytext-markup-style-code 0 font-lock-constant-face t) - ;; inline markup - 1 - (,python-docstring-epytext-markup-style-code 1 '(bold italic) t) - ;; C/I/B - 0 - (,python-docstring-epytext-markup-style-bold 0 font-lock-constant-face t) - ;; inline markup - 1 - (,python-docstring-epytext-markup-style-bold 1 (quote bold) t) - ;; C/I/B - 0 - (,python-docstring-epytext-markup-style-italic 0 font-lock-constant-face t) - ;; inline markup - 1 - (,python-docstring-epytext-markup-style-italic 1 (quote italic) t))) - -;;;###autoload -(define-minor-mode python-docstring-mode - "Toggle python-docstring-mode. -With no argument, this command toggles the mode. -Non-null prefix argument turns on the mode. -Null prefix argument turns off the mode." - ;; The initial value. - nil - ;; The indicator for the mode line. - " DS" - ;; The minor mode bindings. - `(([(meta q)] . python-docstring-fill)) - ;; &rest BODY - (if python-docstring-mode - (font-lock-add-keywords nil python-docstring-keywords) - (font-lock-remove-keywords nil python-docstring-keywords))) - -;;;###autoload -(defun python-docstring-install () - "Add python-docstring-mode as a hook to python.mode." - (add-hook 'python-mode-hook (lambda () (python-docstring-mode t)))) - -(provide 'python-docstring) - -;;; python-docstring.el ends here diff --git a/elpa/python-docstring-20190716.921/python-docstring.elc b/elpa/python-docstring-20190716.921/python-docstring.elc deleted file mode 100644 index 1958de6ff351a3abb504d55c9db9428f0c2a7e78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6203 zcmb_g`*YOD5%!N@Dy~$L%3Z?6G;1910@~=Y4{YwjVYsSLxgsQnPz5rqRvOtVYc)bM zvb`7Xf6v!5TCdIeL5{e}JENKIo_^1CKm6gxCtocsEiFHM_>i8+Ntxv$F&|k$KTM)n z(V?hRCJXWhUEk~+WqO~YJSSP|Y?A#HX>6;Q!EP|0l3zw^8hP_^LXdUvu70VM^zMSuz24b z9~B8HNpV!rSWqsbGlw*yC=yYXXQCp#4?sV#=RyTv^v4W*>EH75^4j-a&!=apk+R70 z`>aVQupUFHs*GZ&FJuQJhmNFMG!q#3T>vEA^2m0s@>E%9KGd8Y9GKJw-C5=zL zKdPd#TTV&ERaR=|HxVg#q($xw1hvOgEu2^;f?C%?-wncIDGXfy+HHLJH9aF8vX|URXR}1^gcJdw_8LZ_Mo1_zW0}(ZkkFeD(l3HYnjY82TeX5AH6F zc2ax+hRO69dB|jNQsBFP3e#U%ls9}ZmOR459d+KUuHwu0{>gBGU33|7hgozJ#(J}Q z>w1{JStWqp#yCYy+SLiD{Jfc^nmTJGo3IUn_+ea zHo-*@gz0r)tlkOJ(aVnvv2v#y7MOUe>vac=crH6eKlB5ZBNoII~b9=XV7ds$H+Ivtrhc~%H&i>i`Uhtt4OR3!+!6Dd3p3)ieRE%rHf!dI^Vx1idq${J^5?Or@ zfw2!=GGCCWX62eIgp-(6c_YALlwXwYE=&mK)L7>Aq(FLMwK#mu;l_b1jfQs#F=ONR z!RCVw+i|yZajHo(ktc=FR9q=83c0T(Kq$7*X_vyP!^j=N@tp?O7M z)+izoC9VQoylfhTOKd3XNY~5@V!qhp6+2-Vxc?+m{Hnr7B|g-+N(|d}I$z}IVtA03 zMUpjqHJ`j8l|Hj$zWIo(F!nR(QH?vA?JldmsAwK+_7lIcET_m{`+QJ4hEIOXvse_y zo6NH-HtMR8QmQF-jmI&!jq9-&UuDMpe{Lo9Z>7-s~>m&!%p+==Mx9{wtM%{ zUqKsw^62NwJmnLLN>6b=+Y9{(69pa6_}@un8h2_;t!H0CWGwT9THBvVLY2rf$7glJ zI(_?YYxmwGRxQ3p-FuHlS47WQLRJ|gAhm%D)Y0fNg*M4WeeyQK?Z17E-vRvVx#ri~ z#{0@g%UrVEYC>hWzWh+aaC@zGnyD4#74a1%A)`_P1B?4)F(e7;dlN zsS&t#0G8h${;s)n7t;JYkqKefqOY`znm+L!UUKN)sE57RVZ`ieg;Pi5?w|87chjv2RVX`dnNHEB?0y- zud@ziD1RQPC5^(wGv$cqdGwr(g%@g;HdTr9bXI54gbOBAg`(i%FX=A7LS@ROSo7ed z(ZaEevcWZ|z5M_U{F$d-R;ih@n31Mt#6uW7wkOfSy!>>U=OtH$`8j0})8I188}#X= z+~dmjTn4+#ueqmDNW#0rJi6{%MrU$qgRG3KOtiaf)KsI&!eyLh$0vxyZxKa!awrmX+xq0TQ@l+p%_KM zhLWWbvMIh=G!wSJI+yeYItI@r zoJS%XP88u0kH!#Z&NEq#GbZ;i$EaZwpp4j=*v=b-m$^g_FJp^NX^di5QKr$8YnwhQ z5YhG#YzxzHHO?^;MRhx9DfKwN1w;C~m`>10V#te_y`(K>jKKJxsNdtpk?o41V}iIw zyxv^8_AQ6?S8R{KcFb<_90|kiUkh8aCdq`_?YHfT&=Gy;?4s|tphT{^I~_ud;_MP# zSv7Sgh8Hy1*y-#JnNA1ZIf;MmSe)(s%>xLYqx+_csSU6SeT|!wljs Jv=}?f{{?F}6{G+F diff --git a/elpa/pyvenv-20191202.1039/pyvenv-autoloads.el b/elpa/pyvenv-20191202.1039/pyvenv-autoloads.el deleted file mode 100644 index 1258decb..00000000 --- a/elpa/pyvenv-20191202.1039/pyvenv-autoloads.el +++ /dev/null @@ -1,82 +0,0 @@ -;;; pyvenv-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "pyvenv" "pyvenv.el" (0 0 0 0)) -;;; Generated autoloads from pyvenv.el - -(autoload 'pyvenv-activate "pyvenv" "\ -Activate the virtual environment in DIRECTORY. - -\(fn DIRECTORY)" t nil) - -(autoload 'pyvenv-deactivate "pyvenv" "\ -Deactivate any current virtual environment. - -\(fn)" t nil) - -(autoload 'pyvenv-workon "pyvenv" "\ -Activate a virtual environment from $WORKON_HOME. - -If the virtual environment NAME is already active, this function -does not try to reactivate the environment. - -\(fn NAME)" t nil) - -(defvar pyvenv-mode nil "\ -Non-nil if Pyvenv mode is enabled. -See the `pyvenv-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 `pyvenv-mode'.") - -(custom-autoload 'pyvenv-mode "pyvenv" nil) - -(autoload 'pyvenv-mode "pyvenv" "\ -Global minor mode for pyvenv. - -Will show the current virtualenv in the mode line, and respect a -`pyvenv-workon' setting in files. - -\(fn &optional ARG)" t nil) - -(defvar pyvenv-tracking-mode nil "\ -Non-nil if Pyvenv-Tracking mode is enabled. -See the `pyvenv-tracking-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 `pyvenv-tracking-mode'.") - -(custom-autoload 'pyvenv-tracking-mode "pyvenv" nil) - -(autoload 'pyvenv-tracking-mode "pyvenv" "\ -Global minor mode to track the current virtualenv. - -When this mode is active, pyvenv will activate a buffer-specific -virtualenv whenever the user switches to a buffer with a -buffer-local `pyvenv-workon' or `pyvenv-activate' variable. - -\(fn &optional ARG)" t nil) - -(autoload 'pyvenv-restart-python "pyvenv" "\ -Restart Python inferior processes. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pyvenv" '("pyvenv-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; pyvenv-autoloads.el ends here diff --git a/elpa/pyvenv-20191202.1039/pyvenv-pkg.el b/elpa/pyvenv-20191202.1039/pyvenv-pkg.el deleted file mode 100644 index 6061af9e..00000000 --- a/elpa/pyvenv-20191202.1039/pyvenv-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "pyvenv" "20191202.1039" "Python virtual environment interface" 'nil :commit "861998b6d157ae73b829f02a5a6c8a9118310831" :keywords '("python" "virtualenv" "tools") :authors '(("Jorgen Schaefer" . "contact@jorgenschaefer.de")) :maintainer '("Jorgen Schaefer" . "contact@jorgenschaefer.de") :url "http://github.com/jorgenschaefer/pyvenv") diff --git a/elpa/pyvenv-20191202.1039/pyvenv.el b/elpa/pyvenv-20191202.1039/pyvenv.el deleted file mode 100644 index a79728f6..00000000 --- a/elpa/pyvenv-20191202.1039/pyvenv.el +++ /dev/null @@ -1,567 +0,0 @@ -;;; pyvenv.el --- Python virtual environment interface -*- lexical-binding: t -*- - -;; Copyright (C) 2013-2017 Jorgen Schaefer - -;; Author: Jorgen Schaefer -;; URL: http://github.com/jorgenschaefer/pyvenv -;; Package-Version: 20191202.1039 -;; Version: 1.21 -;; Keywords: Python, Virtualenv, Tools - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This is a simple global minor mode which will replicate the changes -;; done by virtualenv activation inside Emacs. - -;; The main entry points are `pyvenv-activate', which queries the user -;; for a virtual environment directory to activate, and -;; `pyvenv-workon', which queries for a virtual environment in -;; $WORKON_HOME (from virtualenvwrapper.sh). - -;; If you want your inferior Python processes to be restarted -;; automatically when you switch your virtual environment, add -;; `pyvenv-restart-python' to `pyvenv-post-activate-hooks'. - -;;; Code: - -(require 'eshell) -(require 'json) - -;; User customization - -(defgroup pyvenv nil - "Python Virtual Environment Interface." - :prefix "pyvenv-" - :group 'languages) - -(defcustom pyvenv-workon nil - "The intended virtualenv in the virtualenvwrapper directory. - -This is rarely useful to set globally. Rather, set this in file- -or directory-local variables using \\[add-file-local-variable] or -\\[add-dir-local-variable]. - -When `pyvenv-mode' is enabled, pyvenv will switch to this -virtualenv. If a virtualenv is already enabled, it will ask first." - :type 'pyvenv-workon - :safe #'stringp - :group 'pyvenv) - -(defcustom pyvenv-activate nil - "The intended virtualenv directory. - -This is rarely useful to set globally. Rather, set this in file- -or directory-local variables using \\[add-file-local-variable] or -\\[add-dir-local-variable]. - -When `pyvenv-mode' is enabled, pyvenv will switch to this -virtualenv. If a virtualenv is already enabled, it will ask first." - :type 'directory - :safe #'stringp - :group 'pyvenv) - -(defcustom pyvenv-tracking-ask-before-change nil - "Non-nil means pyvenv will ask before automatically changing a virtualenv. - -This can happen when a new file is opened with a buffer-local -value (from file-local or directory-local variables) for -`pyvenv-workon' or `pyvenv-workon', or if `pyvenv-tracking-mode' -is active, after every command." - :type 'boolean - :group 'pyvenv) - -(defcustom pyvenv-virtualenvwrapper-python - (or (getenv "VIRTUALENVWRAPPER_PYTHON") - (executable-find "python") - (executable-find "py") - (executable-find "pythonw") - "python") - "The python process which has access to the virtualenvwrapper module. - -This should be $VIRTUALENVWRAPPER_PYTHON outside of Emacs, but -virtualenvwrapper.sh does not export that variable. We make an -educated guess, but that can be off." - :type '(file :must-match t) - :safe #'file-directory-p - :group 'pyvenv) - -(defcustom pyvenv-exec-shell - (or (executable-find "bash") - (executable-find "sh") - shell-file-name) - "The path to a POSIX compliant shell to use for running - virtualenv hooks. Useful if you use a non-POSIX shell (e.g. - fish)." - :type '(file :must-match t) - :group 'pyvenv) - -(defcustom pyvenv-default-virtual-env-name nil - "Default directory to use when prompting for a virtualenv directory -in `pyvenv-activate'." - :type 'string - :group 'pyvenv) - -;; API for other libraries - -(defvar pyvenv-virtual-env nil - "The current virtual environment. - -Do not set this variable directly; use `pyvenv-activate' or -`pyvenv-workon'.") - -(defvar pyvenv-virtual-env-name nil - "The name of the current virtual environment. - -This is usually the base name of `pyvenv-virtual-env'.") - - -(defvar pyvenv-pre-create-hooks nil - "Hooks run before a virtual environment is created.") - - -(defvar pyvenv-post-create-hooks nil - "Hooks run after a virtual environment is created.") - - -(defvar pyvenv-pre-activate-hooks nil - "Hooks run before a virtual environment is activated. - -`pyvenv-virtual-env' is already set.") - -(defvar pyvenv-post-activate-hooks nil - "Hooks run after a virtual environment is activated. - -`pyvenv-virtual-env' is set.") - -(defvar pyvenv-pre-deactivate-hooks nil - "Hooks run before a virtual environment is deactivated. - -`pyvenv-virtual-env' is set.") - -(defvar pyvenv-post-deactivate-hooks nil - "Hooks run after a virtual environment is deactivated. - -`pyvenv-virtual-env' is still set.") - -(defvar pyvenv-mode-line-indicator '(pyvenv-virtual-env-name - ("[" pyvenv-virtual-env-name "] ")) - "How `pyvenv-mode' will indicate the current environment in the mode line.") - -;; Internal code. - -(defvar pyvenv-old-process-environment nil - "The old process environment before the last activate.") - -(defvar pyvenv-old-exec-path nil - "The old exec path before the last activate.") - -(defvar pyvenv-old-eshell-path nil - "The old eshell path before the last activate.") - - -(defun pyvenv-create (venv-name python-executable) - "Create virtualenv. VENV-NAME PYTHON-EXECUTABLE." - (interactive (list - (read-from-minibuffer "Name of virtual environment: ") - (read-file-name "Python interpreter to use: " - (file-name-directory (executable-find "python")) - nil nil "python"))) - (let ((venv-dir (concat (file-name-as-directory (pyvenv-workon-home)) - venv-name))) - (unless (file-exists-p venv-dir) - (run-hooks 'pyvenv-pre-create-hooks) - (cond - ((executable-find "virtualenv") - (with-current-buffer (generate-new-buffer "*virtualenv*") - (call-process "virtualenv" nil t t - "-p" python-executable venv-dir) - (display-buffer (current-buffer)))) - ((= 0 (call-process python-executable nil nil nil - "-m" "venv" "-h")) - (with-current-buffer (generate-new-buffer "*venv*") - (call-process python-executable nil t t - "-m" "venv" venv-dir) - (display-buffer (current-buffer)))) - (t - (error "Pyvenv necessitates the 'virtualenv' python package"))) - (run-hooks 'pyvenv-post-create-hooks)) - (pyvenv-activate venv-dir))) - - -;;;###autoload -(defun pyvenv-activate (directory) - "Activate the virtual environment in DIRECTORY." - (interactive (list (read-directory-name "Activate venv: " nil nil nil - pyvenv-default-virtual-env-name))) - (setq directory (expand-file-name directory)) - (pyvenv-deactivate) - (setq pyvenv-virtual-env (file-name-as-directory directory) - pyvenv-virtual-env-name (file-name-nondirectory - (directory-file-name directory)) - python-shell-virtualenv-path directory - python-shell-virtualenv-root directory) - ;; Set venv name as parent directory for generic directories or for - ;; the user's default venv name - (when (or (member pyvenv-virtual-env-name '("venv" ".venv" "env" ".env")) - (and pyvenv-default-virtual-env-name - (string= pyvenv-default-virtual-env-name - pyvenv-virtual-env-name))) - (setq pyvenv-virtual-env-name - (file-name-nondirectory - (directory-file-name - (file-name-directory - (directory-file-name directory)))))) - ;; Preserve variables from being overwritten. - (let ((old-exec-path exec-path) - (old-eshell-path eshell-path-env) - (old-process-environment process-environment)) - (unwind-protect - (pyvenv-run-virtualenvwrapper-hook "pre_activate" pyvenv-virtual-env) - (setq exec-path old-exec-path - eshell-path-env old-eshell-path - process-environment old-process-environment))) - (run-hooks 'pyvenv-pre-activate-hooks) - (let ((new-directories (append - ;; Unix - (when (file-exists-p (format "%s/bin" directory)) - (list (format "%s/bin" directory))) - ;; Windows - (when (file-exists-p (format "%s/Scripts" directory)) - (list (format "%s/Scripts" directory) - ;; Apparently, some virtualenv - ;; versions on windows put the - ;; python.exe in the virtualenv root - ;; for some reason? - directory))))) - (setq pyvenv-old-exec-path exec-path - pyvenv-old-eshell-path eshell-path-env - pyvenv-old-process-environment process-environment - ;; For some reason, Emacs adds some directories to `exec-path' - ;; but not to `process-environment'? - exec-path (append new-directories exec-path) - ;; set eshell path to same as exec-path - eshell-path-env (mapconcat 'identity exec-path ":") - process-environment (append - (list - (format "VIRTUAL_ENV=%s" directory) - (format "PATH=%s" - (mapconcat 'identity - (append new-directories - (split-string (getenv "PATH") - path-separator)) - path-separator)) - ;; No "=" means to unset - "PYTHONHOME") - process-environment) - )) - (pyvenv-run-virtualenvwrapper-hook "post_activate") - (run-hooks 'pyvenv-post-activate-hooks)) - -;;;###autoload -(defun pyvenv-deactivate () - "Deactivate any current virtual environment." - (interactive) - (when pyvenv-virtual-env - (pyvenv-run-virtualenvwrapper-hook "pre_deactivate") - (run-hooks 'pyvenv-pre-deactivate-hooks)) - (when pyvenv-old-process-environment - (setq process-environment pyvenv-old-process-environment - pyvenv-old-process-environment nil)) - (when pyvenv-old-exec-path - (setq exec-path pyvenv-old-exec-path - pyvenv-old-exec-path nil)) - (when pyvenv-old-eshell-path - (setq eshell-path-env pyvenv-old-eshell-path - pyvenv-old-eshell-path nil)) - (when pyvenv-virtual-env - ;; Make sure this does not change `exec-path', as $PATH is - ;; different - (let ((old-exec-path exec-path) - (old-eshell-path eshell-path-env) - (old-process-environment process-environment)) - (unwind-protect - (pyvenv-run-virtualenvwrapper-hook "post_deactivate" - pyvenv-virtual-env) - (setq exec-path old-exec-path - eshell-path-env old-eshell-path - process-environment old-process-environment))) - (run-hooks 'pyvenv-post-deactivate-hooks)) - (setq pyvenv-virtual-env nil - pyvenv-virtual-env-name nil - python-shell-virtualenv-root nil - python-shell-virtualenv-path nil)) - -(defvar pyvenv-workon-history nil - "Prompt history for `pyvenv-workon'.") - -;;;###autoload -(defun pyvenv-workon (name) - "Activate a virtual environment from $WORKON_HOME. - -If the virtual environment NAME is already active, this function -does not try to reactivate the environment." - (interactive - (list - (completing-read "Work on: " (pyvenv-virtualenv-list) - nil t nil 'pyvenv-workon-history nil nil))) - (unless (member name (list "" nil pyvenv-virtual-env-name)) - (pyvenv-activate (format "%s/%s" - (pyvenv-workon-home) - name)))) - -(defun pyvenv-virtualenv-list (&optional noerror) - "Prompt the user for a name in $WORKON_HOME. - -If NOERROR is set, do not raise an error if WORKON_HOME is not -configured." - (let ((workon-home (pyvenv-workon-home)) - (result nil)) - (if (not (file-directory-p workon-home)) - (when (not noerror) - (error "Can't find a workon home directory, set $WORKON_HOME")) - (dolist (name (directory-files workon-home)) - (when (or (file-exists-p (format "%s/%s/bin/activate" - workon-home name)) - (file-exists-p (format "%s/%s/bin/python" - workon-home name)) - (file-exists-p (format "%s/%s/Scripts/activate.bat" - workon-home name)) - (file-exists-p (format "%s/%s/python.exe" - workon-home name))) - (setq result (cons name result)))) - (sort result (lambda (a b) - (string-lessp (downcase a) - (downcase b))))))) - -(define-widget 'pyvenv-workon 'choice - "Select an available virtualenv from virtualenvwrapper." - :convert-widget - (lambda (widget) - (setq widget (widget-copy widget)) - (widget-put widget - :args (cons '(const :tag "None" nil) - (mapcar (lambda (env) - (list 'const env)) - (pyvenv-virtualenv-list t)))) - (widget-types-convert-widget widget)) - - :prompt-value (lambda (_widget prompt _value _unbound) - (let ((name (completing-read - prompt - (cons "None" - (pyvenv-virtualenv-list t)) - nil t))) - (if (equal name "None") - nil - name)))) - -(defvar pyvenv-mode-map (make-sparse-keymap) - "The mode keymap for `pyvenv-mode'.") - -(easy-menu-define pyvenv-menu pyvenv-mode-map - "Pyvenv Menu" - '("Virtual Envs" - :visible pyvenv-mode - ("Workon" - :help "Activate a virtualenvwrapper environment" - :filter (lambda (&optional ignored) - (mapcar (lambda (venv) - (vector venv `(pyvenv-workon ,venv) - :style 'radio - :selected `(equal pyvenv-virtual-env-name - ,venv))) - (pyvenv-virtualenv-list t)))) - ["Activate" pyvenv-activate - :help "Activate a virtual environment by directory"] - ["Deactivate" pyvenv-deactivate - :help "Deactivate the current virtual environment" - :active pyvenv-virtual-env - :suffix pyvenv-virtual-env-name] - ["Restart Python Processes" pyvenv-restart-python - :help "Restart all Python processes to use the current environment"])) - -;;;###autoload -(define-minor-mode pyvenv-mode - "Global minor mode for pyvenv. - -Will show the current virtualenv in the mode line, and respect a -`pyvenv-workon' setting in files." - :global t - (cond - (pyvenv-mode - (add-to-list 'mode-line-misc-info '(pyvenv-mode pyvenv-mode-line-indicator)) - (add-hook 'hack-local-variables-hook #'pyvenv-track-virtualenv)) - ((not pyvenv-mode) - (setq mode-line-misc-info (delete '(pyvenv-mode pyvenv-mode-line-indicator) - mode-line-misc-info)) - (remove-hook 'hack-local-variables-hook #'pyvenv-track-virtualenv)))) - -;;;###autoload -(define-minor-mode pyvenv-tracking-mode - "Global minor mode to track the current virtualenv. - -When this mode is active, pyvenv will activate a buffer-specific -virtualenv whenever the user switches to a buffer with a -buffer-local `pyvenv-workon' or `pyvenv-activate' variable." - :global t - (if pyvenv-tracking-mode - (add-hook 'post-command-hook 'pyvenv-track-virtualenv) - (remove-hook 'post-command-hook 'pyvenv-track-virtualenv))) - -(defun pyvenv-track-virtualenv () - "Set a virtualenv as specified for the current buffer. - -If either `pyvenv-activate' or `pyvenv-workon' are specified, and -they specify a virtualenv different from the current one, switch -to that virtualenv." - (cond - (pyvenv-activate - (when (and (not (equal (file-name-as-directory pyvenv-activate) - pyvenv-virtual-env)) - (or (not pyvenv-tracking-ask-before-change) - (y-or-n-p (format "Switch to virtualenv %s (currently %s)" - pyvenv-activate pyvenv-virtual-env)))) - (pyvenv-activate pyvenv-activate))) - (pyvenv-workon - (when (and (not (equal pyvenv-workon pyvenv-virtual-env-name)) - (or (not pyvenv-tracking-ask-before-change) - (y-or-n-p (format "Switch to virtualenv %s (currently %s)" - pyvenv-workon pyvenv-virtual-env-name)))) - (pyvenv-workon pyvenv-workon))))) - -(defun pyvenv-run-virtualenvwrapper-hook (hook &rest args) - "Run a virtualenvwrapper hook, and update the environment. - -This will run a virtualenvwrapper hook and update the local -environment accordingly. - -CAREFUL! This will modify your `process-environment' and -`exec-path'." - (when (pyvenv-virtualenvwrapper-supported) - (with-temp-buffer - (let ((tmpfile (make-temp-file "pyvenv-virtualenvwrapper-")) - (shell-file-name pyvenv-exec-shell)) - (unwind-protect - (let ((default-directory (pyvenv-workon-home))) - (apply #'call-process - pyvenv-virtualenvwrapper-python - nil t nil - "-m" "virtualenvwrapper.hook_loader" - "--script" tmpfile - (if (getenv "HOOK_VERBOSE_OPTION") - (cons (getenv "HOOK_VERBOSE_OPTION") - (cons hook args)) - (cons hook args))) - (call-process-shell-command - (format ". '%s' ; python -c 'import os, json; print(\"\\n=-=-=\"); print(json.dumps(dict(os.environ)))'" - tmpfile) - nil t nil)) - (delete-file tmpfile))) - (goto-char (point-min)) - (when (and (not (re-search-forward "No module named '?virtualenvwrapper'?" nil t)) - (re-search-forward "\n=-=-=\n" nil t)) - (let ((output (buffer-substring (point-min) - (match-beginning 0)))) - (when (> (length output) 0) - (with-help-window "*Virtualenvwrapper Hook Output*" - (with-current-buffer "*Virtualenvwrapper Hook Output*" - (let ((inhibit-read-only t)) - (erase-buffer) - (insert - (format - "Output from the virtualenvwrapper hook %s:\n\n" - hook) - output)))))) - (dolist (binding (json-read)) - (let ((env (format "%s=%s" (car binding) (cdr binding)))) - (when (not (member env process-environment)) - (setq process-environment (cons env process-environment)))) - (when (eq (car binding) 'PATH) - (setq exec-path (split-string (cdr binding) - path-separator)))))))) - -;;;###autoload -(defun pyvenv-restart-python () - "Restart Python inferior processes." - (interactive) - (dolist (buf (buffer-list)) - (with-current-buffer buf - (when (and (eq major-mode 'inferior-python-mode) - (get-buffer-process buf)) - (let ((cmd (combine-and-quote-strings (process-command - (get-buffer-process buf)))) - (dedicated (if (string-match "\\[.*\\]$" (buffer-name buf)) - t - nil)) - (show nil)) - (delete-process (get-buffer-process buf)) - (goto-char (point-max)) - (insert "\n\n" - "###\n" - (format "### Restarting in virtualenv %s (%s)\n" - pyvenv-virtual-env-name pyvenv-virtual-env) - "###\n" - "\n\n") - (run-python cmd dedicated show) - (goto-char (point-max))))))) - -(defun pyvenv-hook-dir () - "Return the current hook directory. - -This is usually the value of $VIRTUALENVWRAPPER_HOOK_DIR, but -virtualenvwrapper has stopped exporting that variable, so we go -back to the default of $WORKON_HOME or even just ~/.virtualenvs/." - (or (getenv "VIRTUALENVWRAPPER_HOOK_DIR") - (pyvenv-workon-home))) - -(defun pyvenv-workon-home () - "Return the current workon home. - -This is the value of $WORKON_HOME or ~/.virtualenvs." - (or (getenv "WORKON_HOME") - (expand-file-name "~/.virtualenvs"))) - -(defun pyvenv-virtualenvwrapper-supported () - "Return true iff virtualenvwrapper is supported. - -Right now, this just checks if WORKON_HOME is set." - (getenv "WORKON_HOME")) - -;;; Compatibility - -(when (not (fboundp 'file-name-base)) - ;; Emacs 24.3 - (defun file-name-base (&optional filename) - "Return the base name of the FILENAME: no directory, no extension. -FILENAME defaults to `buffer-file-name'." - (file-name-sans-extension - (file-name-nondirectory (or filename (buffer-file-name))))) - ) - -(when (not (boundp 'mode-line-misc-info)) - (defvar mode-line-misc-info nil - "Compatibility variable for 24.3+") - (let ((line mode-line-format)) - (while line - (when (eq 'which-func-mode - (car-safe (car-safe (cdr line)))) - (setcdr line (cons 'mode-line-misc-format - (cdr line))) - (setq line (cdr line))) - (setq line (cdr line))))) - -(provide 'pyvenv) -;;; pyvenv.el ends here diff --git a/elpa/pyvenv-20191202.1039/pyvenv.elc b/elpa/pyvenv-20191202.1039/pyvenv.elc deleted file mode 100644 index f8f8a33bc42f08cd68aacb83bde28604d01f987f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19134 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 diff --git a/elpa/racket-mode-20200417.1741/dir b/elpa/racket-mode-20200417.1741/dir deleted file mode 100644 index 3f80b544..00000000 --- a/elpa/racket-mode-20200417.1741/dir +++ /dev/null @@ -1,18 +0,0 @@ -This is the file .../info/dir, which contains the -topmost node of the Info hierarchy, called (dir)Top. -The first time you invoke Info you start off looking at this node. - -File: dir, Node: Top This is the top of the INFO tree - - This (the Directory node) gives a menu of major topics. - Typing "q" exits, "H" lists all Info commands, "d" returns here, - "h" gives a primer for first-timers, - "mEmacs" visits the Emacs manual, etc. - - In Emacs, you can click mouse button 2 on a menu item or cross reference - to select it. - -* Menu: - -Emacs -* Racket Mode: (racket-mode). Edit and REPL major modes for Racket lang. diff --git a/elpa/racket-mode-20200417.1741/racket-bug-report.el b/elpa/racket-mode-20200417.1741/racket-bug-report.el deleted file mode 100644 index 25b6dd2d..00000000 --- a/elpa/racket-mode-20200417.1741/racket-bug-report.el +++ /dev/null @@ -1,84 +0,0 @@ -;;; racket-bug-report.el - -;; Copyright (c) 2013-2016 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'cl-lib) -(require 'package) -(require 'racket-util) - -;;;###autoload -(defun racket-bug-report () - "Fill a buffer with data to make a Racket Mode bug report." - (interactive) - (let ((help-window-select t)) - (with-help-window "*racket-mode bug report*" - (princ "Please copy all of the following lines and paste them into your bug report\n") - (princ "at .\n\n") - - (princ "

\n") - (princ "```\n") - (pp (cons '(alist-get 'racket-mode package-alist) - (let ((v (assq 'racket-mode package-alist))) - (and v (cdr v))))) - (cl-labels ((id-val (id) (list id - (condition-case () (symbol-value id) - (error 'UNDEFINED))))) - (let ((emacs-uptime (emacs-uptime))) - (pp `(,@(mapcar #'id-val - `(emacs-version - emacs-uptime - system-type - major-mode - racket--el-source-dir - racket--rkt-source-dir - racket-program - racket-command-port - racket-command-timeout - racket-memory-limit - racket-error-context - racket-error-context - racket-history-filter-regexp - racket-images-inline - racket-images-keep-last - racket-use-repl-submit-predicate - racket-images-system-viewer - racket-pretty-print - racket-indent-curly-as-sequence - racket-indent-sequence-depth - racket-pretty-lambda - racket-smart-open-bracket-enable - racket-module-forms - racket-logger-config))))) - ;; Show lists of enabled and disabled minor modes, each sorted by name. - (let* ((minor-modes (cl-remove-duplicates - (append minor-mode-list - (mapcar #'car minor-mode-alist)))) - (modes/values (mapcar #'id-val minor-modes)) - (sorted (sort modes/values - (lambda (a b) - (string-lessp (format "%s" (car a)) - (format "%s" (car b))))))) - (cl-labels ((f (x) (list (car x)))) ;car as a list so pp line-wraps - (pp `(enabled-minor-modes ,@(mapcar #'f (cl-remove-if-not #'cadr sorted)))) - (pp `(disabled-minor-modes ,@(mapcar #'f (cl-remove-if #'cadr sorted))))))) - (princ "```\n") - (princ "
\n")) - (forward-line 2))) - -(provide 'racket-bug-report) - -;;; racket-bug-report.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-bug-report.elc b/elpa/racket-mode-20200417.1741/racket-bug-report.elc deleted file mode 100644 index 381664dd42cf9502b7ec161472ff0352269e0767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2597 zcmbtWTW{Mo6!z25dZ?ds)wvc=(;~_~h)j)2~~tR{P}SgiduB(^!vR7^t0))|$r>|I!mb;N~` zg06NM-yekcKZqeTV&vLUtaHcVT)KqagC=KB{yKf}g5otdJa$O&ZnZtn1zAlo&uJ+s z)%@Bf^-(NIZc-%;xiuWaXtys)@L3<9z~_G2?e^hv>m-Y{kQB_L(Fo7@_B7ypF& zLIh!S9MEec-^k zo`+$y%N{4lpU$K4_{*o?eT(0azQT8eXX1}E{=VC97Ilxhcc7o*nbpUwgyTIS9PJBD ziNbImVZ$h#bnec>XyyZV8HzN0)atM&{ipS!(Q$VGujzsRo>BJzKYr zT)f8wPwj#A*FD&-6k&5lUy8}(_Q4%<>+P1f-pakQ3c!7fxT^aZmrm9e9JRiRbxSjNr9caO{pwnNdo zC9W*kTI6vqJea=-LYE&dXSXpG}S1`ic*z>jXc8?+&by483+tr zv(=^9i#g8&3b><(Yv&64U^rZXG0Wv3*4c1nsRf*K+Win+JRf{DP$~37mvvD6$7e=pukH!mS%y0|LQ_}l7pPeqR)S1k* z*@6)>b)~CL2Y$_+y!?M9Mw#==G0reyz;Y{jSu{JU4E$=D$~`RJQ*NXzSPGCdddxyk zk~nj@L@KN>QmB{%M0GvtXm!!fmApWI)iyXgx5XM@tj%YxW zp_zi8Y_Ooo!mq#dNPc`;J6$el4189}3YMw7#+u#BM" - (make-process - :name racket--cmd-process-name - :connection-type 'pipe - :noquery t - :buffer (get-buffer-create (concat " *" racket--cmd-process-name "*")) - :stderr (get-buffer-create (concat " *" racket--cmd-process-name "-stderr*")) - :command (list racket-program - (funcall racket-adjust-run-rkt racket--run.rkt) - (number-to-string racket-command-port) - (setq racket--cmd-auth (format "%S" `(auth ,(random))))) - :filter #'racket--cmd-process-filter)) - -(defun racket--cmd-close () - (pcase (get-process racket--cmd-process-name) - ((and (pred (processp)) proc) (delete-process proc)))) - -(defun racket--call-when-connected-to-command-server (func) - "Call FUNC, starting the back end process if necessary." - (unless (racket--cmd-open-p) - (racket--cmd-open)) - (funcall func (get-process racket--cmd-process-name))) - -(defun racket--cmd-process-filter (proc string) - "Parse complete sexprs from the process output and give them to -`racket--cmd-dispatch-response'." - (let ((buffer (process-buffer proc))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (goto-char (point-max)) - (insert string) - (goto-char (point-min)) - (while - (condition-case () - (progn - (forward-sexp 1) - (let ((sexp (buffer-substring (point-min) (point)))) - (delete-region (point-min) (point)) - (ignore-errors - (racket--cmd-dispatch-response (read sexp)) - t))) - (scan-error nil))))))) - -(defvar racket--cmd-nonce->callback (make-hash-table :test 'eq) - "A hash from nonce to callback function.") -(defvar racket--cmd-nonce 0 - "Number that increments for each command request we send.") - -(defun racket--cmd-dispatch-response (response) - "Do something with a sexpr sent to us from the command server. -Mostly these are responses to command requests. Strictly speaking -'debug-break is a \"notification\", i.e. /not/ one direct response -to one command request." - (pcase response - (`(debug-break . ,response) - (run-at-time 0.001 nil #'racket--debug-on-break response)) - (`(,nonce . ,response) - (let ((callback (gethash nonce racket--cmd-nonce->callback))) - (when callback - (remhash nonce racket--cmd-nonce->callback) - (run-at-time 0.001 nil callback response)))) - (_ nil))) - -(defun racket--cmd/async-raw (repl-session-id command-sexpr &optional callback) - "Send COMMAND-SEXPR and return. Later call CALLBACK with the response sexp. - -REPL-SESSION-ID may be nil for commands that do not need to run -in a specific namespace. - -If CALLBACK is not supplied or nil, defaults to `ignore'. - -Otherwise CALLBACK is called after the command server returns a -response. Because command responses are obtained from the dynamic -extent of a `set-process-filter' proc -- which may have -limitations on what it can or should do -- CALLBACK is not called -immediately but instead using `run-at-time' with a very small -delay. - -Important: Do not assume that `current-buffer' is the same when -CALLBACK is called, as it was when the command was sent. If you -need to do something to do that original buffer, save the -`current-buffer' in a `let' and use it in a `with-current-buffer' -form. See `racket--restoring-current-buffer'." - (racket--call-when-connected-to-command-server - (lambda (process) - (cl-incf racket--cmd-nonce) - (when (and callback - (not (equal callback #'ignore))) - (puthash racket--cmd-nonce callback racket--cmd-nonce->callback)) - (process-send-string - process - (format "%S\n" (cons racket--cmd-nonce - (cons repl-session-id - command-sexpr))))))) - -(defun racket--cmd/async (repl-session-id command-sexpr &optional callback) - "You probably want to use this instead of `racket--cmd/async-raw'. - -REPL-SESSION-ID may be nil for commands that do not need to run -in a specific namespace. - -CALLBACK is only called for 'ok responses, with (ok v ...) -unwrapped to (v ...). - -'error responses are handled here. Note: We use `message' not -`error' here because: - - 1. It would show \"error running timer:\" which, although true, - is confusing or at best N/A for end users. - - 2. More simply, we don't need to escape any call stack, we only - need to ... not call the callback! - -'break responses are handled here, too. This is used when a -command is somehow canceled, with no useful response except the -indication we should clean up the pending callback as usual. - -The original value of `current-buffer' is temporarily restored -during CALLBACK, because neglecting to do so is a likely -mistake." - (let ((buf (current-buffer))) - (racket--cmd/async-raw - repl-session-id - command-sexpr - (if callback - (lambda (response) - (pcase response - (`(ok ,v) (with-current-buffer buf (funcall callback v))) - (`(error ,m) (message "%s" m)) - (`(break) nil) - (v (message "Unknown command response: %S" v)))) - #'ignore)))) - -(defun racket--cmd/await (repl-session-id command-sexpr) - "Send COMMAND-SEXPR. Await and return an 'ok response value, or raise `error'. - -REPL-SESSION-ID may be nil for commands that do not need to run -in a specific namespace." - (let* ((awaiting 'RACKET-REPL-AWAITING) - (response awaiting)) - (racket--cmd/async-raw repl-session-id - command-sexpr - (lambda (v) (setq response v))) - (with-timeout (racket-command-timeout - (error "racket-command process timeout")) - (while (eq response awaiting) - (accept-process-output nil 0.001)) - (pcase response - (`(ok ,v) v) - (`(error ,m) (error "%s" m)) - (v (error "Unknown command response: %S" v)))))) - -(provide 'racket-cmd) - -;; racket-cmd.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-cmd.elc b/elpa/racket-mode-20200417.1741/racket-cmd.elc deleted file mode 100644 index 03a2fe3b3d51a3e7d35822ff607d65d61e9f01ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8327 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 F{sTuu?qUD{ diff --git a/elpa/racket-mode-20200417.1741/racket-collection.el b/elpa/racket-mode-20200417.1741/racket-collection.el deleted file mode 100644 index d1ad563b..00000000 --- a/elpa/racket-mode-20200417.1741/racket-collection.el +++ /dev/null @@ -1,327 +0,0 @@ -;;; racket-collection.el - -;; Copyright (c) 2013-2016 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'ido) -(require 'tq) -(require 'racket-repl) -(require 'racket-complete) ;for `racket--symbol-at-point-or-prompt' -(require 'racket-custom) ;for `racket-program' -(require 'racket-util) - -;;; racket-find-collection - -(defun racket-find-collection (&optional prefix) - "Given a collection name, try to find its directory and files. - -Takes a collection name from point (or, with a prefix, prompts you). - -If only one directory is found, `ido-find-file-in-dir' lets you -pick a file there. - -If more than one directory is found, `ido-completing-read' lets -you pick one, then `ido-find-file-in-dir' lets you pick a file -there. - -Note: This requires the `raco-find-collection' package to be -installed. To install it, in `shell' enter: - - raco pkg install raco-find-collection - -Tip: This works best with `ido-enable-flex-matching' set to t. -Also handy is the `flx-ido' package from MELPA. - -See also: `racket-visit-module' and `racket-open-require-path'." - (interactive "P") - (pcase (racket--symbol-at-point-or-prompt prefix "Collection name: ") - (`() nil) - (coll - (racket--cmd/async - nil - `(find-collection ,coll) - (lambda (result) - (pcase result - (`() - (user-error (format "Collection `%s' not found" coll))) - (`(,path) - (racket--find-file-in-dir path)) - (paths - (let ((done nil)) - (while (not done) - ;; `(ido-find-file-in-dir (ido-completing-read paths))` - ;; -- except we want to let the user press C-g inside - ;; ido-find-file-in-dir to back up and pick a different - ;; module path. - (let ((dir (ido-completing-read "Directory: " paths))) - (condition-case () - (progn (racket--find-file-in-dir dir) - (setq done t)) - (quit nil)))))))))))) - -(defun racket--find-file-in-dir (dir) - "Like `ido-find-file-in-dir', but allows C-d to `dired' as does `ido-find-file'." - (ido-file-internal ido-default-file-method nil dir)) - - -;;; racket-open-require-path - - -;; From looking at ido-mode and ido-vertical-mode: -;; -;; Just use read-from-minibuffer. -;; -;; We're doing vertical mode, so we don't need var like ido-eoinput. -;; We can simply look for the first \n in the minibuffer -- that's the -;; end of user input. -;; -;; Everything after the input and first \n, is the candiates we -;; display, \n separated. The minibuffer automatically grows -;; vertically. -;; -;; Have some maximum number of candidates to display (10?). If > 10, print -;; last line 10 as "...", like ido-vertical-mode. -;; -;; Also use a keymap for commands: -;; - C-n and C-p, which move through the candidates -;; - ENTER -;; - on a dir will add its contents to the candidates (like DrR's -;; "Enter Subsellection" button. -;; - on a file will exit and open the file. -;; -;; Remember that typing a letter triggers `self-insert-command'. -;; Therefore the pre and post command hooks will run then, too. -;; -;; Early version of this used racket--eval/sexpr. Couldn't keep up -;; with typing. Instead: run dedicated Racket process and more direct -;; pipe style; the process does a read-line and responds with each -;; choice on its own line, terminated by a blank like (like HTTP -;; headers). - -(defvar racket--orp/tq nil - "tq queue") -(defvar racket--orp/active nil ;;FIXME: Use minibuffer-exit-hook instead? - "Is `racket-open-require-path' using the minibuffer?") -(defvar racket--orp/input "" - "The current user input. Unless user C-g's this persists, as with DrR.") -(defvar racket--orp/matches nil - "The current user matches. Unless user C-g's this persists, as with DrR.") -(defvar racket--orp/match-index 0 - "The index of the current match selected by the user.") -(defvar racket--orp/max-height 10 - "The maximum height of the minibuffer.") -(defvar racket--orp/keymap - (racket--easy-keymap-define - '((("RET" "C-j") racket--orp/enter) - ("C-g" racket--orp/quit) - (("C-p" "") racket--orp/prev) - (("C-n" "") racket--orp/next) - ;; Some keys should be no-ops. - (("SPC" "TAB" "C-v" "" "M-v" "" "M-<" "" "M->" "") - racket--orp/nop)))) - -(defun racket--orp/process () - "Start process to run find-module-path-completions.rkt." - (let ((name "racket-find-module-path-completions-process") - (buffer " *racket-find-module-path-completions*") - (stderr " *racket-find-module-path-completions-stderr*") - (rkt (funcall racket-adjust-run-rkt - (expand-file-name "find-module-path-completions.rkt" - racket--rkt-source-dir)))) - (make-process :name name - :buffer buffer - :command (list racket-program rkt) - :connection-type 'pipe - :stderr stderr))) - -(defun racket--orp/begin () - (setq racket--orp/tq (tq-create (racket--orp/process)))) - -(defun racket--orp/request-tx-matches (input) - "Request matches from the Racket process; delivered to `racket--orp/rx-matches'." - (when racket--orp/tq - (tq-enqueue racket--orp/tq - (concat input "\n") - ".*\n\n" - (current-buffer) - 'racket--orp/rx-matches))) - -(defun racket--orp/rx-matches (buffer answer) - "Completion proc; receives answer to request by `racket--orp/request-tx-matches'." - (when racket--orp/active - (setq racket--orp/matches (mapcar racket-path-from-racket-to-emacs-function - (split-string answer "\n" t))) - (setq racket--orp/match-index 0) - (with-current-buffer buffer - (racket--orp/draw-matches)))) - -(defun racket--orp/end () - (when racket--orp/tq - (tq-close racket--orp/tq) - (setq racket--orp/tq nil))) - -(defun racket-open-require-path () - "Like Dr Racket's Open Require Path. - -Type (or delete) characters that are part of a module path name. -\"Fuzzy\" matches appear. For example try typing \"t/t/r\". - -Choices are displayed in a vertical list. The current choice is -at the top, marked with \"->\". - -- C-n and C-p move among the choices. -- RET on a directory adds its contents to the choices. -- RET on a file exits doing `find-file'. -- C-g aborts." - (interactive) - (racket--orp/begin) - (setq racket--orp/active t) - (setq racket--orp/match-index 0) - ;; We do NOT initialize `racket--orp/input' or `racket--orp/matches' - ;; here. Like DrR, we remember from last time invoked. We DO - ;; initialize them in racket--orp/quit i.e. user presses C-g. - (add-hook 'minibuffer-setup-hook #'racket--orp/minibuffer-setup) - (condition-case () - (progn - (read-from-minibuffer "Open require path: " - racket--orp/input - racket--orp/keymap) - (when racket--orp/matches - (find-file (elt racket--orp/matches racket--orp/match-index)))) - (error (setq racket--orp/input "") - (setq racket--orp/matches nil))) - (setq racket--orp/active nil) - (racket--orp/end)) - -(defun racket--orp/minibuffer-setup () - (add-hook 'pre-command-hook #'racket--orp/pre-command nil t) - (add-hook 'post-command-hook #'racket--orp/post-command nil t) - (when racket--orp/active - (racket--orp/draw-matches))) - -(defun racket--orp/eoinput () - "Return position where user input ends, i.e. the first \n before the -candidates or (point-max)." - (save-excursion - (goto-char (point-min)) - (condition-case () - (1- (re-search-forward "\n")) - (error (point-max))))) - -(defun racket--orp/get-user-input () - "Get the user's input from the mini-buffer." - (buffer-substring-no-properties (minibuffer-prompt-end) - (racket--orp/eoinput))) - -(defun racket--orp/pre-command () - nil) - -(defun racket--orp/post-command () - "Update matches if input changed. -Also constrain point in case user tried to navigate past -`racket--orp/eoinput'." - (when racket--orp/active - (let ((input (racket--orp/get-user-input))) - (when (not (string-equal input racket--orp/input)) - (racket--orp/on-input-changed input))) - (let ((eoi (racket--orp/eoinput))) - (when (> (point) eoi) - (goto-char eoi))))) - -(defun racket--orp/on-input-changed (input) - (setq racket--orp/input input) - (cond ((string-equal input "") ;"" => huge list; ignore like DrR - (setq racket--orp/match-index 0) - (setq racket--orp/matches nil) - (racket--orp/draw-matches)) - (t (racket--orp/request-tx-matches input)))) - -(defun racket--orp/draw-matches () - (save-excursion - (let* ((inhibit-read-only t) - (eoi (racket--orp/eoinput)) - (len (length racket--orp/matches)) - (n (min racket--orp/max-height len)) - (i racket--orp/match-index)) - (delete-region eoi (point-max)) ;delete existing - (while (> n 0) - (insert "\n") - (cond ((= i racket--orp/match-index) (insert "-> ")) - (t (insert " "))) - (insert (elt racket--orp/matches i)) - (setq n (1- n)) - (cond ((< (1+ i) len) (setq i (1+ i))) - (t (setq i 0)))) - (when (< racket--orp/max-height len) - (insert "\n ...")) - (put-text-property eoi (point-max) 'read-only 'fence)))) - -(defun racket--orp/enter () - "On a dir, adds its contents to choices. On a file, opens the file." - (interactive) - (when racket--orp/active - (let ((match (and racket--orp/matches - (elt racket--orp/matches racket--orp/match-index)))) - (cond (;; Pressing RET on a directory inserts its contents, like - ;; "Enter subcollection" button in DrR. - (and match (file-directory-p match)) - (setq racket--orp/matches - (delete-dups ;if they RET same item more than once - (sort (append racket--orp/matches - (directory-files match t "[^.]+$")) - #'string-lessp))) - (racket--orp/draw-matches)) - (;; Pressing ENTER on a file selects it. We exit the - ;; minibuffer; our main function treats non-nil - ;; racket--orp/matches and racket--orp/match-index as a - ;; choice (as opposed to quitting w/o a choice. - t - (exit-minibuffer)))))) - -(defun racket--orp/quit () - "Our replacement for `keyboard-quit'." - (interactive) - (when racket--orp/active - (setq racket--orp/input "") - (setq racket--orp/matches nil) - (exit-minibuffer))) - -(defun racket--orp/next () - "Select the next match." - (interactive) - (when racket--orp/active - (setq racket--orp/match-index (1+ racket--orp/match-index)) - (when (>= racket--orp/match-index (length racket--orp/matches)) - (setq racket--orp/match-index 0)) - (racket--orp/draw-matches))) - -(defun racket--orp/prev () - "Select the previous match." - (interactive) - (when racket--orp/active - (setq racket--orp/match-index (1- racket--orp/match-index)) - (when (< racket--orp/match-index 0) - (setq racket--orp/match-index (max 0 (1- (length racket--orp/matches))))) - (racket--orp/draw-matches))) - -(defun racket--orp/nop () - "A do-nothing command target." - (interactive) - nil) - -(provide 'racket-collection) - -;; racket-collection.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-collection.elc b/elpa/racket-mode-20200417.1741/racket-collection.elc deleted file mode 100644 index 7fe3c5653baf962cbc3ea8fb88fb0a32092e205a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8253 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 b$$fs;0!J%|IhfFyk5AFXm$Su(r)KTH{huGL diff --git a/elpa/racket-mode-20200417.1741/racket-common.el b/elpa/racket-mode-20200417.1741/racket-common.el deleted file mode 100644 index 04d8e5aa..00000000 --- a/elpa/racket-mode-20200417.1741/racket-common.el +++ /dev/null @@ -1,401 +0,0 @@ -;;; racket-common.el -*- lexical-binding: t; -*- - -;; Copyright (c) 2013-2019 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -;; Things used by both racket-mode and racket-repl-mode - -(require 'cl-lib) -(require 'thingatpt) -(require 'racket-custom) -(require 'racket-keywords-and-builtins) -(require 'racket-font-lock) -(require 'racket-indent) -(require 'racket-parens) -(require 'racket-ppss) -(require 'racket-util) - -(defvar racket-mode-abbrev-table nil) -(define-abbrev-table 'racket-mode-abbrev-table ()) - -;;; syntax-table and syntax-propertize-function - -(defvar racket-mode-syntax-table - (let ((st (make-syntax-table)) - (i 0)) - ;; Symbol constituents - (while (< i ?0) - (modify-syntax-entry i "_ " st) - (setq i (1+ i))) - (setq i (1+ ?9)) - (while (< i ?A) - (modify-syntax-entry i "_ " st) - (setq i (1+ i))) - (setq i (1+ ?Z)) - (while (< i ?a) - (modify-syntax-entry i "_ " st) - (setq i (1+ i))) - (setq i (1+ ?z)) - (while (< i 128) - (modify-syntax-entry i "_ " st) - (setq i (1+ i))) - - ;; Whitespace (except ?\n, see below in comment section) - (modify-syntax-entry ?\t " " st) - (modify-syntax-entry ?\f " " st) - (modify-syntax-entry ?\r " " st) - (modify-syntax-entry ?\s " " st) - - ;; These characters are delimiters but otherwise undefined. - ;; Brackets and braces balance for editing convenience. - (modify-syntax-entry ?\( "() " st) - (modify-syntax-entry ?\) ")( " st) - (modify-syntax-entry ?\[ "(] " st) - (modify-syntax-entry ?\] ")[ " st) - (modify-syntax-entry ?{ "(} " st) - (modify-syntax-entry ?} "){ " st) - - ;; Other atom delimiters - (modify-syntax-entry ?\" "\" " st) - (modify-syntax-entry ?' "' " st) - (modify-syntax-entry ?` "' " st) - (modify-syntax-entry ?, "' " st) - (modify-syntax-entry ?@ "' " st) - (modify-syntax-entry ?\\ "\\ " st) - - ;; Comment related - (modify-syntax-entry ?\; "< " st) ;line comments but NOT sexp #; - (modify-syntax-entry ?\n "> " st) - - (modify-syntax-entry ?# "w 14" st) ;not necessarily prefix - (modify-syntax-entry ?| "_ 23bn" st) - - st)) - -(defun racket-syntax-propertize-function (start end) - (goto-char start) - (racket--syntax-propertize-here-string end) - (funcall - (syntax-propertize-rules - ;; here strings: The main responsibility here is to set the "|" - ;; char syntax around the "body" so it's treated as a string for - ;; indent, nav, font-lock. Think of the \n in #<" - (if (or (racket--ppss-quote-p ppss) - (< 1 (count-lines start eol))) - ;; If we matched several lines, make sure we refontify them - ;; together. Furthermore, if the \n is quoted, it means the - ;; right \n is actually further down. Don't bother fixing it - ;; now, but place a multiline property so that when - ;; jit-lock-context-* refontifies the rest of the buffer, it - ;; also refontifies the current line with it. - (put-text-property start (1+ eol) 'syntax-multiline t)) - (put-text-property eol (1+ eol) 'racket-here-string string) - (goto-char (+ 3 start)) - (string-to-syntax "|")))) - -(defun racket--syntax-propertize-here-string (end) - "If in a here string that ends before END, add | syntax for its close." - (let ((ppss (syntax-ppss))) - (when (eq (racket--ppss-string-p ppss) t) ;t as opposed to ?" or ?' - (let ((key (get-text-property (racket--ppss-string/comment-start ppss) - 'racket-here-string))) - (when (and key - (re-search-forward (concat "^" (regexp-quote key) "\\(\n\\)") - end t)) - (let ((eol (match-beginning 1))) - (put-text-property eol (1+ eol) - 'syntax-table - (string-to-syntax "|")))))))) - -;;; - -(defun racket--common-variables () - "Set variables common to `racket-mode' and `racket-repl-mode'." - ;;; Syntax - (set-syntax-table racket-mode-syntax-table) - (setq-local multibyte-syntax-as-symbol t) - (setq-local parse-sexp-ignore-comments t) - (setq-local syntax-propertize-function #'racket-syntax-propertize-function) - (syntax-propertize (point-max)) ;for e.g. paredit: see issue #222 - ;; ----------------------------------------------------------------- - ;; Font-lock - (setq-local font-lock-defaults - (list racket-font-lock-keywords ;keywords - nil ;keywords-only? - nil ;case-fold? - nil ;syntax-alist - nil ;syntax-begin - ;; Additional variables: - (cons 'font-lock-mark-block-function #'mark-defun) - (cons 'parse-sexp-lookup-properties t) - (cons 'font-lock-multiline t) - (cons 'font-lock-syntactic-face-function - #'racket-font-lock-syntactic-face-function) - (list 'font-lock-extend-region-functions - #'font-lock-extend-region-wholelines - #'font-lock-extend-region-multiline))) - ;; ----------------------------------------------------------------- - ;; Comments. Mostly borrowed from lisp-mode and/or scheme-mode - (setq-local comment-start ";") - (setq-local comment-add 1) ;default to `;;' in comment-region - (setq-local comment-start-skip ";+ *") - (setq-local comment-column 40) - (setq-local comment-multi-line t) ;for auto-fill-mode and #||# comments - ;; Font lock mode uses this only when it knows a comment is starting: - (setq-local font-lock-comment-start-skip ";+ *") - ;; ----------------------------------------------------------------- - ;; Indent - (setq-local indent-line-function #'racket-indent-line) - (racket--set-indentation) - (setq-local indent-tabs-mode nil) - ;; ----------------------------------------------------------------- - ;;; Misc - (setq-local local-abbrev-table racket-mode-abbrev-table) - (setq-local paragraph-start (concat "$\\|" page-delimiter)) - (setq-local paragraph-separate paragraph-start) - (setq-local paragraph-ignore-fill-prefix t) - (setq-local fill-paragraph-function #'lisp-fill-paragraph) - (setq-local adaptive-fill-mode nil) - (setq-local outline-regexp ";;; \\|(....") - (setq-local beginning-of-defun-function #'racket--beginning-of-defun-function)) - - -;;; Insert lambda char (like DrRacket) - -(defconst racket-lambda-char (make-char 'greek-iso8859-7 107) - "Character inserted by `racket-insert-labmda'.") - -(defun racket-insert-lambda () - "Insert λ. - -To insert Unicode symbols generally, see `racket-unicode-input-method-enable'." - (interactive) - (insert-char racket-lambda-char 1)) -(put 'racket-insert-lambda 'delete-selection t) - - -;;; racket--beginning-of-defun - -(defun racket--beginning-of-defun-function () - "Like `beginning-of-defun' but aware of Racket module forms." - (let ((orig (point))) - (racket--escape-string-or-comment) - (pcase (racket--module-level-form-start) - (`() (ignore-errors (backward-sexp 1))) - (pos (goto-char pos))) - (/= orig (point)))) - -(defun racket--module-level-form-start () - "Start position of the module-level form point is within. - -A module-level form is the outermost form not nested in a Racket -module form. - -If point is not within a module-level form, returns nil. - -If point is already exactly at the start of a module-level form, --- i.e. on the opening ?\( -- returns nil. - -If point is within a string or comment, returns nil. - -This is NOT suitable for the variable `syntax-begin-function' -because it (i) doesn't move point, and (ii) doesn't know how to -find the start of a string or comment." - (save-excursion - (ignore-errors - (let ((pos nil) - (parse-sexp-ignore-comments t)) - (while (ignore-errors - (goto-char (scan-lists (point) -1 1)) - (unless (looking-at racket-module-forms) - (setq pos (point))) - t)) - (and pos - (or (racket--sexp-comment-start pos) - pos)))))) - -(defun racket--sexp-comment-start (pos) - "Start pos of sexp comment (if any) immediately before POS. - -Allows #; to be followed by zero or more space or newline chars." - (save-excursion - (goto-char pos) - (while (memq (char-before) '(32 ?\n)) - (goto-char (1- (point)))) - (when (string= "#;" (buffer-substring-no-properties (- (point) 2) (point))) - (- (point) 2)))) - - -;;; racket--what-to-run - -(defun racket--what-to-run () - (cons (racket--buffer-file-name) - (racket--submod-path))) - -(defun racket--submod-path () - (and (racket--lang-p) - (racket--modules-at-point))) - -(defun racket--lang-p () - "Is #lang the first sexpr in the file, after an optional shebang?" - (save-excursion - (goto-char (point-min)) - (ignore-errors - (forward-sexp) - (backward-sexp) - (when (looking-at (rx "#!")) - (forward-line) - (forward-sexp) - (backward-sexp)) - (looking-at (rx "#lang"))))) - -(defun racket--modules-at-point () - "List of module names that point is within, from outer to inner. -Ignores module forms nested (at any depth) in any sort of plain -or syntax quoting, because those won't be valid Racket syntax." - (let ((xs nil)) - (condition-case () - (save-excursion - (save-match-data - (racket--escape-string-or-comment) - (while t - (when (racket--looking-at-module-form) - (push (intern (match-string-no-properties 1)) xs)) - (when (racket--looking-at-quoted-form) - (push nil xs)) - (backward-up-list)))) - (scan-error xs)) - (racket--take-while xs #'identity))) - -(defun racket--looking-at-module-form () - "Sets match data group 1 to the module name." - (looking-at (rx ?\( - (or "module" "module*" "module+") - (1+ " ") - (group (+ (or (syntax symbol) - (syntax word))))))) - -(defun racket--looking-at-quoted-form () - (or (memq (char-before) '(?\' ?\` ?\,)) - (and (eq (char-before (1- (point))) ?\,) - (eq (char-before) ?\@)) - (looking-at - (rx ?\( - (or "quote" "quasiquote" - "unquote" "unquote-splicing" - "quote-syntax" - "syntax" "syntax/loc" - "quasisyntax" "quasisyntax/loc" - "unsyntax" "unsyntax-splicing") - " ")))) - -;;; Misc - -(defun racket--escape-string-or-comment () - "If point is in a string or comment, move to its start. - -Note that this can be expensive, as it uses `syntax-ppss' which -parses from the start of the buffer. Although `syntax-ppss' uses -a cache, that is invalidated after any changes to the buffer. As -a result, the worst case would be to call this function after -every character is inserted to a buffer." - (pcase (racket--ppss-string/comment-start (syntax-ppss)) - (`() nil) - (pos (goto-char pos)))) - -(defun racket-backward-up-list () - "Like `backward-up-list' but works when point is in a string or comment. - -Typically you should not use this command in Emacs Lisp -- -especially not repeatedly. Instead, initially use -`racket--escape-string-or-comment' to move to the start of a -string or comment, if any, then use normal `backward-up-list' -repeatedly." - (interactive) - (racket--escape-string-or-comment) - (backward-up-list 1)) - -(provide 'racket-common) - -;; racket-common.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-common.elc b/elpa/racket-mode-20200417.1741/racket-common.elc deleted file mode 100644 index f156be9d17e527bbccf0da9559fdd432b2d543b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10201 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 diff --git a/elpa/racket-mode-20200417.1741/racket-complete.el b/elpa/racket-mode-20200417.1741/racket-complete.el deleted file mode 100644 index 1911bb86..00000000 --- a/elpa/racket-mode-20200417.1741/racket-complete.el +++ /dev/null @@ -1,52 +0,0 @@ -;;; racket-complete.el -*- lexical-binding: t -*- - -;; Copyright (c) 2013-2020 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'racket-common) - -(defun racket--call-with-completion-prefix-positions (proc) - (let ((beg (save-excursion (skip-syntax-backward "^-()>") (point)))) - (unless (or (eq beg (point-max)) - (member (char-syntax (char-after beg)) '(?\" ?\( ?\)))) - (condition-case nil - (save-excursion - (goto-char beg) - (forward-sexp 1) - (let ((end (point))) - (and - (<= (+ beg 2) end) ;prefix at least 2 chars - (funcall proc beg end)))) - (scan-error nil))))) - -(defun racket--in-require-form-p () - (save-excursion - (save-match-data - (racket--escape-string-or-comment) - (let ((done nil) - (result nil)) - (condition-case () - (while (not done) - (backward-up-list) - (when (looking-at (rx ?\( (or "require" "#%require"))) - (setq done t) - (setq result t))) - (scan-error nil)) - result)))) - -(provide 'racket-complete) - -;; racket-complete.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-complete.elc b/elpa/racket-mode-20200417.1741/racket-complete.elc deleted file mode 100644 index 48242e34d2710b7932a9e3673f7dc560db04577e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1185 zcmbu8-*3|}5XaL>yyTG=_QtIpB9Z1Uj@xuw1p`%kn1loZ9*~wI+{B?)lQ`IJ_v5eU zoOHhgZ;NWzzO(OqpRYYT|1^K)d7eL;&0wyoMwTLPC$fg~if0D4LK~@Sh?5a(Jy+7M zfR`nx#>z_Ga*J*=@>}Qkl{8Rb6xbMHAit@3B{RrXW~`R=Z*z!VZ7lFS7dhN#p(msG zB#%ov#C>4K_WLJs- z!F4Hx2D`$AG3)Xof@gj10MGq=-w(9-vyocBTdZs?EXh<=sXFwBA1DL#7d3qO`gtC{ z_Jdp$yp-JBuO%4@L!3fxTT=?B4QaF}o7yCF$ zum~1S5Ag6w%4h^#6_nyX?w~PcUaw_zgp5$BogX7m2PR^B&Yn0D{kuWW0on6fF4K<7 z1ECgK2X05I;x=26oLdeRUkkFlu>y6@1-KHrlRGhD2i&pU;=9SX#W$Q;r4cn=r$<4= zmN!asD;B_DciV_S%#9%3b0tc*_fOQ;5q_${omgbkkW%8CE|ps28z-1?5Tt2vcKXl_ g-=t}HwquV&{0+b^VCr;gwAxB6 - -The default value sets some known \"noisy\" topics to be one -level quieter. That way you can set the '* topic to a level like -'debug and not get overhwelmed by these noisy topics." - :tag "Logger Configuration" - :type '(alist :key-type symbol :value-type symbol) - :safe (lambda (xs) - (cl-every (lambda (x) - (and (symbolp (car x)) - (symbolp (cdr x)))) - xs)) - :group 'racket-other) - -(defcustom racket-show-functions - (list #'racket-show-echo-area - ;; #'racket-show-header-line - #'racket-show-pos-tip) - "A special hook variable to customize `racket-show'. - -Example functions include - - - `racket-show-echo-area' - - `racket-show-pos-tip' - - `racket-show-header-line' - -Each function should accept two arguments: VAL and POS. - -VAL is: - - - Non-blank string: Display the string somehow. - - - Blank string: Hide any previously displayed string. - - - nil: Hide any persistent UI that might have been created to - show strings, such as by `racket-show-header-line'. - -POS is the buffer position for which to show the message, nil -meaning use some default position." - :tag "Racket Show Functions" - :type 'hook - :options '(racket-show-echo-area - racket-show-header-line - racket-show-pos-tip) - :safe #'functionp - :group 'racket-other) - -;;; Faces - -(defgroup racket-faces nil - "Racket Faces" - :tag "Racket Faces" - :group 'faces - :group 'racket) - -(defmacro defface-racket (id facespec docstr tag) - `(progn - (defconst ,id ',id) - (defface ,id - ,facespec - ,docstr - :tag ,tag - :group 'racket-faces))) - -(defface-racket racket-xp-def-face - '((t (:inherit match :underline (:style line)))) - "Face `racket-xp-mode' uses to highlight definitions." - "Definition Face") - -(defface-racket racket-xp-use-face - '((t (:inherit match))) - "Face `racket-xp-mode' uses to highlight uses." - "Use Face") - -(defface-racket racket-xp-error-face - '((t (:underline (:color "red" :style wave)))) - "Face `racket-xp-mode' uses to highlight errors." - "Error Face") - -(defface-racket racket-xp-unused-face - '((t (:strike-through t))) - "Face `racket-xp-mode' uses to highlight unused requires or definitions." - "Unused Face") - -(defface-racket racket-keyword-argument-face - '((((background dark)) - (:foreground "IndianRed")) - (((background light)) - (:foreground "Red3"))) - "Face for `#:keyword` arguments." - "Keyword Argument Face") - -(define-obsolete-face-alias - 'racket-paren-face - "Instead use the `paren-face' package: ." - "2017-06-13") - -(defface-racket racket-selfeval-face - '((t (:foreground "SeaGreen"))) - "Face for self-evaluating expressions like numbers, symbols, strings." - "Selfeval Face") - -(defface-racket racket-here-string-face - '((t (:inherit sh-heredoc-face))) - "Face for here strings." - "Here String Face") - -(defface-racket racket-logger-config-face - '((t (:inherit font-lock-comment-face :slant italic))) - "Face for `racket-logger-mode' configuration." - "Racket Logger Config Face") - -(defface-racket racket-logger-topic-face - '((t (:inherit font-lock-function-name-face :slant italic))) - "Face for `racket-logger-mode' topics." - "Racket Logger Config Face") - -(defface-racket racket-logger-fatal-face - '((t (:inherit error :weight bold))) - "Face for `racket-logger-mode' fatal level." - "Racket Logger Fatal Face") - -(defface-racket racket-logger-error-face - '((t (:inherit error))) - "Face for `racket-logger-mode' error level." - "Racket Logger Error Face") - -(defface-racket racket-logger-warning-face - '((t (:inherit warning))) - "Face for `racket-logger-mode' warning level." - "Racket Logger Warning Face") - -(defface-racket racket-logger-info-face - '((t (:inherit font-lock-string-face))) - "Face for `racket-logger-mode' info level." - "Racket Logger Info Face") - -(defface-racket racket-logger-debug-face - '((t (:inherit font-lock-constant-face))) - "Face for `racket-logger-mode' debug level." - "Racket Logger Debug Face") - -(defface-racket racket-debug-break-face - '((t (:background "red"))) - "Face for `racket-debug-mode' break position." - "Racket Debug Break Face") - -(defface-racket racket-debug-locals-face - '((t (:inherit racket-selfeval-face :box (:line-width -1) :slant italic))) - "Face for `racket-debug-mode' local variables." - "Racket Debug Locals Face") - -(defface-racket racket-debug-result-face - '((t (:inherit racket-selfeval-face :box (:line-width -1) :slant italic :weight bold))) - "Face for `racket-debug-mode' result values." - "Racket Debug Result Face") - -(provide 'racket-custom) - -;; racket-custom.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-custom.elc b/elpa/racket-mode-20200417.1741/racket-custom.elc deleted file mode 100644 index d9c22f877abd55120b69ab6f088d0cc61ec44fd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17268 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 (point)))) - (goto-char (pcase (cl-find-if pred ps) - (`nil (car ps)) - (v v))))) - (_ (user-error "No breakable positions in this buffer")))) - -(defun racket-debug-disable () - (interactive) - (racket--cmd/async (racket--repl-session-id) `(debug-disable)) - (racket-debug-mode -1) - (setq racket--debug-break-positions nil) - (setq racket--debug-break-locals nil) - (setq racket--debug-break-info nil)) - -(add-hook 'racket--repl-before-run-hook #'racket-debug-disable) - -(defun racket-debug-help () - (interactive) - (describe-function 'racket-debug-mode)) - -(defvar racket--debug-overlays nil) - -(define-minor-mode racket-debug-mode - "Minor mode for debug breaks. - -This feature is **EXPERIMENTAL**!!! It is likely to have -significant limitations and bugs. You are welcome to open an -issue to provide feedback. Please understand that this feature -might never be improved -- it might even be removed someday if it -turns out to have too little value and/or too much cost. - -How to debug: - -1. \"Instrument\" code for step debugging. You can instrument - entire files, and also individual functions. - - a. Entire Files - - Choose `racket-run' with two prefixes -- C-u C-u C-c C-c. The - file will be instrumented for step debugging before it is run. - Also instrumented are files determined by the variable - `racket-debuggable-files'. - - The run will break at the first breakable position. - - Tip: After you run to completion and return to a normal - REPL prompt, the code remains instrumented. You may enter - expressions that evaluate instrumented code and it will - break so you can step debug again. - - b. Function Definitions - - Put point in a function `define` form and C-u C-M-x to - \"instrument\" the function for step debugging. Then in the - REPL, enter an expression that causes the instrumented - function to be run, directly or indirectly. - - You can instrument any number of functions. - - You can even instrument while stopped at a break. For - example, to instrument a function you are about to call, so - you can \"step into\" it: - - - M-. a.k.a. `racket-visit-definition'. - - C-u C-M-x to instrument the definition. - - M-, a.k.a. `racket-unvisit'. - - Continue stepping. - - Limitation: Instrumenting a function `require`d from - another module won't redefine that function. Instead, it - attempts to define an instrumented function of the same - name, in the module the REPL is inside. The define will - fail if it needs definitions visible only in that other - module. In that case you'll probably need to use - entire-file instrumentation as described above. - -2. When a break occurs, the `racket-repl-mode' prompt changes. In - this debug REPL, local variables are available for you to use - and even to `set!`. - - Also, in the `racket-mode' buffer where the break is located, - `racket-debug-mode' is enabled. This minor mode makes the - buffer read-only, provides visual feedback -- about the break - position, local variable values, and result values -- and - provides shortcut keys: - -\\{racket-debug-mode-map} -" - :lighter " RacketDebug" - :keymap (racket--easy-keymap-define - '(("SPC" racket-debug-step) - ("o" racket-debug-step-over) - ("u" racket-debug-step-out) - ("c" racket-debug-continue) - ("n" racket-debug-next-breakable) - ("p" racket-debug-prev-breakable) - ("h" racket-debug-run-to-here) - ("?" racket-debug-help))) - (unless (eq major-mode 'racket-mode) - (setq racket-debug-mode nil) - (user-error "racket-debug-mode only works with racket-mode")) - (cond - (racket-debug-mode - (racket--debug-make-overlay - (point) (1+ (point)) - 'face racket-debug-break-face - 'priority 99) - (dolist (local racket--debug-break-locals) - (pcase-let ((`(,_src ,pos ,span ,_name ,val) local)) - (racket--debug-make-overlay - pos (+ pos span) - 'after-string (propertize val 'face racket-debug-locals-face)))) - (pcase racket--debug-break-info - (`(,_id after (,_ . ,str)) - (let ((eol (line-end-position))) - (racket--debug-make-overlay - (1- eol) eol - 'after-string (propertize (concat "⇒ (values " (substring str 1)) - 'face racket-debug-result-face))))) - (read-only-mode 1)) - (t - (read-only-mode -1) - (dolist (o racket--debug-overlays) - (delete-overlay o)) - (setq racket--debug-overlays nil)))) - -(defun racket--debug-make-overlay (beg end &rest props) - (let ((o (make-overlay beg end))) - (push o racket--debug-overlays) - (overlay-put o 'name 'racket-debug-overlay) - (overlay-put o 'priority 100) - (while props - (overlay-put o (pop props) (pop props))) - o)) - -(provide 'racket-debug) - -;; racket-debug.el ends here - diff --git a/elpa/racket-mode-20200417.1741/racket-debug.elc b/elpa/racket-mode-20200417.1741/racket-debug.elc deleted file mode 100644 index 4dfbc05742cd7112153d9bb6479c638a9cd2ec7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12836 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 QVqAm!kwV>Ep|M{1e-zAG9RL6T diff --git a/elpa/racket-mode-20200417.1741/racket-describe.el b/elpa/racket-mode-20200417.1741/racket-describe.el deleted file mode 100644 index 9b2f00fc..00000000 --- a/elpa/racket-mode-20200417.1741/racket-describe.el +++ /dev/null @@ -1,122 +0,0 @@ -;;; racket-describe.el -*- lexical-binding: t -*- - -;; Copyright (c) 2013-2020 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'racket-cmd) -(require 'racket-util) -(require 'racket-visit) -(require 'shr) - -(defun racket--do-describe (how - repl-session-id - str - &optional - display-and-pop-to-p - visit-thunk - doc-thunk) - "Create a `racket-describe-mode' buffer. - -HOW is supplied as the first argument to the back-end -\"describe\" command. See it for details that we don't need to -know or care about in this function. - -STR is the string form of an identifier that is to be described. - -DISPLAY-AND-POP-TO-P should be t for use by direct user commands -like `racket-xp-describe' and `racket-repl-describe' -- in which -the buffer is displayed -- and nil for use as -a :company-doc-buffer function. - -VISIT-THUNK and DOC-THUNK are, when not nil, used to insert -\"Visit Definition\" and \"Documentation in Browser\" buttons. - -Returns the buffer in which the description was written." - ;; Work around what seems to be a bug with `shr-insert-document' -- - ;; elements are out of order when an existing Racket Describe buffer - ;; hasn't had a `quit-window' -- by re-creating the buffer. - (with-current-buffer (racket--get-buffer-recreate "*Racket Describe*") - (let* ((html (racket--cmd/await repl-session-id - `(describe ,how ,str))) - ;; Because shr removes leading   from elements -- - ;; which messes up the indentation of s-expressions - ;; including contracts -- replace   with `spc' in the - ;; source HTML. Below we'll replace `spc' with " " in the - ;; result of `shr-insert-document'. - (spc (string #x2020)) ;unlikely character (hopefully) - (dom (with-temp-buffer - (insert html) - (goto-char (point-min)) - (while (re-search-forward " " nil t) - (replace-match spc t t)) - (libxml-parse-html-region (point-min) (point-max))))) - (racket-describe-mode) - (read-only-mode -1) - (let ((shr-use-fonts nil)) - (shr-insert-document dom)) - (goto-char (point-min)) - (while (re-search-forward spc nil t) - (replace-match " " t t)) - (when display-and-pop-to-p - (goto-char (point-max)) - (insert "\n") - (when visit-thunk - (insert-text-button "Visit Definition" - 'follow-link t - 'action - (lambda (_btn) (funcall visit-thunk))) - (insert " ")) - (when doc-thunk - (insert-text-button "Documentation in Browser" - 'follow-link t - 'action - (lambda (_btn) (funcall doc-thunk)))) - (insert " [q]uit")) - (read-only-mode 1) - (goto-char (point-min)) - (when display-and-pop-to-p - (display-buffer (current-buffer) t) - (pop-to-buffer (current-buffer)) - (message "Type TAB to move to links, 'q' to restore previous window")) - (current-buffer)))) - -(defvar racket-describe-mode-map - (let ((m (make-sparse-keymap))) - (set-keymap-parent m special-mode-map) - (mapc (lambda (x) - (define-key m (kbd (car x)) (cadr x))) - '(("" racket-describe--next-button) - ("S-" racket-describe--prev-button))) - m) - "Keymap for Racket Describe mode.") - -(define-derived-mode racket-describe-mode special-mode - "RacketDescribe" - "Major mode for describing Racket functions. -\\{racket-describe-mode-map}" - (setq show-trailing-whitespace nil)) - -(defun racket-describe--next-button () - (interactive) - (forward-button 1 t t)) - -(defun racket-describe--prev-button () - (interactive) - (forward-button -1 t t)) - -(provide 'racket-describe) - -;; racket-describe.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-describe.elc b/elpa/racket-mode-20200417.1741/racket-describe.elc deleted file mode 100644 index 81d7dc05fee6cdce6c0a60441fbf1cea5d897564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5447 zcmbtY|8LvI6?d8?%Ty%5_Cr@-8Tw2&wUzli@r$G+ZihIwff!94!}i(^k%64Zlf{`L z8S-RB8}`5N^X^D}N#vzNZP4bCcklcAy!W_!_-g-;Yinzb-Q8W<&qjHisK_khlnzHS zEa_SmWt^qtb#{F7W)kZm$t0mH*YPO+m(+M&?ljEH^I=@l090sPs*<8b7~N|ln7ERt9iq=(q(`IawC@T-1UfM5I5Xf(F^Q>{dpMT(rB z-)iA<*L$AJH+*@E3x9DDVA1M2^rlen#&MwtrnypDgrlgw9qTx$@2}%B)>ICQ3-X$c zjptpzMf-)4T9Kr;)!9guVG;M07(t*->W>ElRlr^^U;jk#bUDs*STZ76!kDV|ZE-ms zsZ^8B%+o&P5GsutPEF2%M@J)gYlqI1BFHhw3W^k*oG>M+X`&D{>87SsfxgZfS7|mO z>)@Cw{!(oGkx0YrJqqxiyIfW6hhbg4+A)AY3kYz*CGqBEOIu%GW zQ5_u2P4eT>+0nT;fBE<0@6Gvx*ZcLVP}|_CQj=t$yUj$|+7Jdh>4x*8iIM{~h|`!& z>=+WxK^7Vpo8)K7UliE{CmaZ_wZ(%|rN>2TeNn4Zsc8IT?E(-1x=av2lOonyu@koj zDRG3I9-h1sXNPBJN3V~?(E+h@zhT(PQkl?7M=dHlQ?&V2V=GbvnZ#hTS%o&NHM2i$ zym8z9Q*sJUHV%KclWo4Jx<6ruFg9CbbG$rS}(B8t@gS&>3X<)Tmi23 z9c*+ve9rBDjh&s(LME&Fmbiz6_Hf9h*cs1&drjQ)2YzyN_~4S+lU(IYE!5EzQLD^@kd;L{ZE z-$b!vC_)-Y5_FCJR{ct!ZX05^Te*?fv0}8{ys}#xmS|fz&0*jU3)aLR##3OVKwgLe zs!&>P+OQS?0SlbY<5PpVbWq{uV`sJ>F#K0Jk-)kd5Nd>a;&}mGs#FyKUy-Uw zox~13)@qc4$Vgr(F|Q0QQyXCB7W=)`{vA|nK?A#l%-5)xAyD)h@C2xMQwfS{tmrCE zl8OVMp9&>P6vS`{{fdb!B67Y-`(?iC7^KnI0Q?D20;CRyl*Ik_qeSGgfJKHHw}rao z6kb&^a8^blOOvT7AS7HaIKqMp!4Y^h#o^`33ZKtd}JXpkjIHW5jjUJ

r`f*SQ!ydxLvY)6~a@h)i#H28#KBB!uo3}%>Wkv+?+T=@Bw>=v&THbf9tr~MW}}@u0E~ct9qkJEzYZIkL?kt zsyv)|6=|_>!oWEf(O`X%w88t}MZFP`#lbTtjgUdZVM5OB+GM|1GvY9`I-D$=uNir* z86)mrpq*_^!2RZ!ll?v?46+U*-zpavc&OuLMNsBr6wfT5lCyw$Z&y*;-1*-@QBE-< zzOO|2CDB1!i5&GKi41qY+jxc}LXUC*VUhG$;byf;OPn^`jb_ur+R}69%*aF5G#uwQ zYPBH8#wS=W+1s)8L%C<2q0ZWWLSlVI3fXPa0TX5Q*kE=XKK%ZQtz_%EH#bcw&8`0PxqZxWIHrS6G zRoPu0BbG22bA)ZpObXU{*F{V2wyJL3b$^eQ_XmE2%V$jS|Ac%r9W%1dOb_-|jTi0D z4WMlDuFmK9)1|tOV}uwmA1=*4I$XX(;?j4#-o*iQ{R3`!>l3Efc)@)z1O%ho;i!As{$VBJ@A8L^F0v{~2LgN=I?#67Z6u3dB z$$b#I*^kHWS-vdxWV5{C5`_RpO|rwU394!?sV4%LGzz;JPCm_Kp`ZJ|m|#-*kPEt@ PYkWbPeL$!+X*T`~lKi6o diff --git a/elpa/racket-mode-20200417.1741/racket-edit.el b/elpa/racket-mode-20200417.1741/racket-edit.el deleted file mode 100644 index 6e7da0bc..00000000 --- a/elpa/racket-mode-20200417.1741/racket-edit.el +++ /dev/null @@ -1,405 +0,0 @@ -;;; racket-edit.el -*- lexical-binding: t -*- - -;; Copyright (c) 2013-2020 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -;; racket-mode per se, i.e. the mode for .rkt file buffers - -(require 'cl-lib) -(require 'cl-macs) -(require 'comint) -(require 'racket-custom) -(require 'racket-cmd) -(require 'racket-common) -(require 'racket-complete) -(require 'racket-repl) -(require 'racket-util) -(require 'hideshow) - -(defun racket-racket () - "Do \"racket \" in a shell buffer." - (interactive) - (racket--shell (concat (shell-quote-argument racket-program) - " " - (shell-quote-argument (racket--buffer-file-name))))) - -(defun racket-raco-test () - "Do \"raco test -x \" in a shell buffer to run the \"test\" submodule." - (interactive) - (racket--shell (concat (shell-quote-argument racket-program) - " -l raco test -x " - (shell-quote-argument (racket--buffer-file-name))))) - -(defun racket--shell (cmd) - (racket--save-if-changed) - (let ((w (selected-window))) - (pcase (get-buffer-window "*shell*" t) - (`() (other-window -1)) - (win (select-window win))) - (with-temp-message cmd - (shell) - (pop-to-buffer-same-window "*shell*") - (comint-send-string "*shell*" (concat cmd "\n")) - (select-window w) - (sit-for 3)))) - -;;; code folding - -;;;###autoload -(add-to-list 'hs-special-modes-alist - '(racket-mode "(" ")" ";" nil nil)) - -(defun racket--for-all-tests (verb f) - (save-excursion - (goto-char (point-min)) - (let ((n 0)) - (while (re-search-forward "^(module[+*]? test" (point-max) t) - (funcall f) - (cl-incf n) - (goto-char (match-end 0))) - (message "%s %d test submodules" verb n)))) - -(defun racket-fold-all-tests () - "Fold (hide) all test submodules." - (interactive) - (racket--for-all-tests "Folded" 'hs-hide-block)) - -(defun racket-unfold-all-tests () - "Unfold (show) all test submodules." - (interactive) - (racket--for-all-tests "Unfolded" 'hs-show-block)) - -;;; requires - -(defun racket-tidy-requires () - "Make a single top-level \"require\" form, modules sorted, one per line. - -All top-level require forms are combined into a single form. -Within that form: - -- A single subform is used for each phase level, sorted in this - order: for-syntax, for-template, for-label, for-meta, and - plain (phase 0). - - - Within each level subform, the modules are sorted: - - - Collection path modules -- sorted alphabetically. - - - Subforms such as only-in. - - - Quoted relative requires -- sorted alphabetically. - -At most one module is listed per line. - -Note: This only works for requires at the top level of a source -file using #lang. It does NOT work for require forms inside -module forms. - -See also: `racket-trim-requires' and `racket-base-requires'." - (interactive) - (unless (eq major-mode 'racket-mode) - (user-error "Current buffer is not a racket-mode buffer")) - (pcase (racket--top-level-requires 'find) - (`nil (user-error "The file module has no requires; nothing to do")) - (reqs (racket--cmd/async - nil - `(requires/tidy ,reqs) - (lambda (result) - (pcase result - ("" nil) - (new (goto-char (racket--top-level-requires 'kill)) - (insert (concat new "\n"))))))))) - -(defun racket-trim-requires () - "Like `racket-tidy-requires' but also deletes unnecessary requires. - -Note: This only works when the source file can be fully expanded -with no errors. - -Note: This only works for requires at the top level of a source -file using #lang. It does NOT work for require forms inside -module forms. Furthermore, it is not smart about module+ or -module* forms -- it might delete top level requires that are -actually needed by such submodules. - -See also: `racket-base-requires'." - (interactive) - (unless (eq major-mode 'racket-mode) - (user-error "Current buffer is not a racket-mode buffer")) - (when (racket--ok-with-module+*) - (racket--save-if-changed) - (pcase (racket--top-level-requires 'find) - (`nil (user-error "The file module has no requires; nothing to do")) - (reqs (racket--cmd/async - nil - `(requires/trim - ,(racket--buffer-file-name) - ,reqs) - (lambda (result) - (pcase result - (`nil (user-error "Syntax error in source file")) - ("" (goto-char (racket--top-level-requires 'kill))) - (new (goto-char (racket--top-level-requires 'kill)) - (insert (concat new "\n")))))))))) - -(defun racket-base-requires () - "Change from \"#lang racket\" to \"#lang racket/base\". - -Adds explicit requires for imports that are provided by -\"racket\" but not by \"racket/base\". - -This is a recommended optimization for Racket applications. -Avoiding loading all of \"racket\" can reduce load time and -memory footprint. - -Also, as does `racket-trim-requires', this removes unneeded -modules and tidies everything into a single, sorted require form. - -Note: This only works when the source file can be fully expanded -with no errors. - -Note: This only works for requires at the top level of a source -file using #lang. It does NOT work for require forms inside -module forms. Furthermore, it is not smart about module+ or -module* forms -- it might delete top level requires that are -actually needed by such submodules. - -Note: Currently this only helps change \"#lang racket\" to -\"#lang racket/base\". It does not help with other similar -conversions, such as changing \"#lang typed/racket\" to \"#lang -typed/racket/base\"." - (interactive) - (unless (eq major-mode 'racket-mode) - (user-error "Current buffer is not a racket-mode buffer")) - (when (racket--buffer-start-re "^#lang.*? racket/base$") - (user-error "Already using #lang racket/base. Nothing to change.")) - (unless (racket--buffer-start-re "^#lang.*? racket$") - (user-error "File does not use use #lang racket. Cannot change.")) - (when (racket--ok-with-module+*) - (racket--save-if-changed) - (let ((reqs (racket--top-level-requires 'find))) - (racket--cmd/async - nil - `(requires/base - ,(racket--buffer-file-name) - ,reqs) - (lambda (result) - (pcase result - (`nil (user-error "Syntax error in source file")) - (new (goto-char (point-min)) - (re-search-forward "^#lang.*? racket$") - (insert "/base") - (goto-char (or (racket--top-level-requires 'kill) - (progn (insert "\n\n") (point)))) - (unless (string= "" new) - (insert (concat new "\n")))))))))) - -(defun racket--ok-with-module+* () - (save-excursion - (goto-char (point-min)) - (or (not (re-search-forward (rx ?\( "module" (or "+" "*")) nil t)) - (prog1 - (y-or-n-p "Analysis will be unreliable due to module+ or module* forms -- proceed anyway? ") - (message ""))))) - -(defun racket--buffer-start-re (re) - (save-excursion - (ignore-errors - (goto-char (point-min)) - (re-search-forward re) - t))) - -(defun racket--top-level-requires (what) - "Identify all top-level requires and do WHAT. - -When WHAT is 'find, returns the top-level require forms. - -When WHAT is 'kill, kill the top-level requires, returning the -location of the first one." - (save-excursion - (goto-char (point-min)) - (let ((first-beg nil) - (requires nil)) - (while (re-search-forward "^(require " nil t) - (let* ((beg (progn (up-list -1) (point))) - (end (progn (forward-sexp) (point))) - (str (buffer-substring-no-properties beg end)) - (sexpr (read str))) - (unless first-beg (setq first-beg beg)) - (setq requires (cons sexpr requires)) - (when (eq 'kill what) - (kill-sexp -1) - (delete-blank-lines)))) - (if (eq 'kill what) first-beg requires)))) - -;;; align - -(defun racket-align () - "Align values in the same column. - -Useful for binding forms like \"let\" and \"parameterize\", -conditionals like \"cond\" and \"match\", association lists, and -any series of couples like the arguments to \"hash\". - -Before choosing this command, put point on the first of a series -of \"couples\". A couple is: - -- A list of two or more sexprs: \"[sexpr val sexpr ...]\". -- Two sexprs: \"sexpr val\". - -Each \"val\" moves to the same column and is -`prog-indent-sexp'-ed (in case it is a multi-line form). - -For example with point on the \"[\" before \"a\": - -#+BEGIN_SRC racket - Before After - - (let ([a 12] (let ([a 12] - [bar 23]) [bar 23]) - ....) ....) - - '([a . 12] '([a . 12] - [bar . 23]) [bar . 23]) - - (cond [a? #t] (cond [a? #t] - [b? (f x [b? (f x - y)] y)] - [else #f]) [else #f]) -#+END_SRC - -Or with point on the quote before \"a\": - -#+BEGIN_SRC racket - (list 'a 12 (list 'a 12 - 'bar 23) 'bar 23) -#+END_SRC - -If more than one couple is on the same line, none are aligned, -because it is unclear where the value column should be. For -example the following form will not change; `racket-align' will -display an error message: - -#+BEGIN_SRC racket - (let ([a 0][b 1] - [c 2]) error; unchanged - ....) -#+END_SRC - -When a couple's sexprs start on different lines, that couple is -ignored. Other, single-line couples in the series are aligned as -usual. For example: - -#+BEGIN_SRC racket - (let ([foo (let ([foo - 0] 0] - [bar 1] [bar 1] - [x 2]) [x 2]) - ....) ....) -#+END_SRC - -See also: `racket-unalign'." - (interactive) - (save-excursion - (let ((listp (eq ?\( (char-syntax (char-after)))) - (prev-line 0) - (max-col 0)) - (racket--for-each-couple listp - (lambda () - (setq max-col (max max-col (current-column))) - (let ((this-line (line-number-at-pos))) - (when (= prev-line this-line) - (user-error - "Can't align if any couples are on same line")) - (setq prev-line this-line)))) - (racket--for-each-couple listp - (lambda () - (indent-to max-col) - (prog-indent-sexp)))))) - -(defun racket-unalign () - "The opposite of `racket-align'. - -Effectively does M-x `just-one-space' and `prog-indent-sexp' for -each couple's value." - (interactive) - (save-excursion - (let ((listp (eq ?\( (char-syntax (char-after))))) - (racket--for-each-couple listp - (lambda () - (just-one-space) - (prog-indent-sexp)))))) - -(defun racket--for-each-couple (listp f) - "Move point to each value sexp of a couple, and `funcall' F. - -Only call F when the couple's sexprs are on the same line. - -When LISTP is true, expects couples to be `[id val]`, else `id val`." - (save-excursion - (condition-case () - (while t - (when listp - (down-list)) - (forward-sexp) - (let ((line (line-number-at-pos))) - (forward-sexp) - (backward-sexp) - (when (= line (line-number-at-pos)) - ;; Defensive: Backup over any prefix or punctuation - ;; chars just in case backward-sexp didn't (although it - ;; should have if our syntax table is correct). - (while (memq (char-syntax (char-before)) '(?\' ?\.)) - (goto-char (1- (point)))) - (funcall f))) - ;; On to the next couple... - (if listp - (up-list) - (forward-sexp))) - (scan-error nil)))) - -;;; Completion - -(defvar racket--completion-candidates (list racket-type-list - racket-keywords - racket-builtins-1-of-2 - racket-builtins-2-of-2)) - -(defun racket--completion-candidates-for-prefix (prefix) - (cl-reduce (lambda (results strs) - (append results (all-completions prefix strs))) - racket--completion-candidates - :initial-value ())) - -(defun racket-complete-at-point () - "A value for the variable `completion-at-point-functions'. - -Completion candidates are drawn from the same symbols used for -font-lock. This is a static list. If you want dynamic, smarter -completion candidates, enable the minor mode `racket-xp-mode'." - (racket--call-with-completion-prefix-positions - (lambda (beg end) - (list beg - end - (completion-table-dynamic - #'racket--completion-candidates-for-prefix) - :predicate #'identity - :exclusive 'no)))) - - -(provide 'racket-edit) - -;; racket-edit.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-edit.elc b/elpa/racket-mode-20200417.1741/racket-edit.elc deleted file mode 100644 index a53b6066d1dc45b2307d4a36e560af42a5423232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11702 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 diff --git a/elpa/racket-mode-20200417.1741/racket-eldoc.el b/elpa/racket-mode-20200417.1741/racket-eldoc.el deleted file mode 100644 index be70f92c..00000000 --- a/elpa/racket-mode-20200417.1741/racket-eldoc.el +++ /dev/null @@ -1,47 +0,0 @@ -;;; racket-eldoc.el -*- lexical-binding: t -*- - -;; Copyright (c) 2013-2020 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'racket-cmd) - -(defun racket--do-eldoc (how repl-session-id) - (and (racket--cmd-open-p) - (> (point) (point-min)) - (save-excursion - (condition-case nil - ;; The char-before and looking-at checks below are to - ;; skip when the sexp is quoted or when its first elem - ;; couldn't be a Racket function name. - (let* ((beg (progn - (backward-up-list) - (and (not (memq (char-before) '(?` ?' ?,))) - (progn (forward-char 1) (point))))) - (beg (and beg (looking-at "[^0-9#'`,\"]") beg)) - (end (and beg (progn (forward-sexp) (point)))) - (end (and end - (char-after (point)) - (eq ?\s (char-syntax (char-after (point)))) - end)) - (sym (and beg end (buffer-substring-no-properties beg end))) - (str (and sym (racket--cmd/await repl-session-id - `(type ,how ,sym))))) - str) - (scan-error nil))))) - -(provide 'racket-eldoc) - -;; racket-eldoc.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-eldoc.elc b/elpa/racket-mode-20200417.1741/racket-eldoc.elc deleted file mode 100644 index 81c282896b1e922ba12204e67631bcdb11ac043d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 928 zcmbtSZEw>s5RL|_ME(FDIZ~uGqAq!Bx2obzr4p4U1{A@Ewo~2MS*@jZu$_(V*K@x9G+ku1u|OH)4DPeU!(KA{F9uT> zLn;fol9r-zZ3}XWh$Qc4id&LzS?IUlC8vO7A>rfs5BNIyd`4!I*=&0L ziA+C)&-@PK1uX?N_kM&a!b|KtwCDXegJ6+H5iF9Zf9b9G_nojv;so(HW*%M%(s8t! z6)2}~-Z~R-cvd$!9z(HKBPV|G z4yGujas23L5gd>Uha{~Qo@wjJVOZu1G0x7CXZMq(jKE5Mmq}b%ldUsD)sD5s_j0c-375%K!?c8#lv$ zRgfmIu8V?eV(Rs7wuw}v(wI?Ofphy;8L#LK6&CDm#X*X432_3Q_6z7imPX++^gHNx NE!dw=Z$2*ce*@E71StRj diff --git a/elpa/racket-mode-20200417.1741/racket-font-lock.el b/elpa/racket-mode-20200417.1741/racket-font-lock.el deleted file mode 100644 index b07e52fd..00000000 --- a/elpa/racket-mode-20200417.1741/racket-font-lock.el +++ /dev/null @@ -1,379 +0,0 @@ -;;; racket-font-lock.el - -;; Copyright (c) 2013-2018 by Greg Hendershott. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'cl-lib) -(require 'racket-custom) -(require 'racket-keywords-and-builtins) -(require 'racket-ppss) -(require 'racket-util) - - -;; Define 3 levels of font-lock, as documented in 23.6.5 "Levels of -;; Font Lock". User may control using `font-lock-maximum-decoration'. - -;; Note: font-lock iterates by matcher, doing an re-search-forward -;; over the entire region. As a result, it's faster to consolidate -;; matchers that will yield the same result (unless they need to be -;; tried in a certain order). - -;; Note: This relies on our character syntax already having been -;; applied. For example a Racket identifier like `|name with spaces|` -;; will already have word/symbol syntax on everything including the -;; pipe and space chars. - -(defconst racket-font-lock-keywords-0 - (eval-when-compile - `( - ;; #shebang - (,(rx bol "#!" (+ nonl) eol) . font-lock-comment-face) - - ;; #lang - (,(rx (group (group "#lang") - (1+ " ") - (group (1+ not-newline)))) - (2 font-lock-keyword-face nil t) - (3 font-lock-variable-name-face nil t)) - - ;; #; sexp comments - ;; - ;; We don't put any comment syntax on these -- that way things - ;; like indent and nav work within the sexp. They are solely - ;; font-locked as comments, here. - (,#'racket--font-lock-sexp-comments) - - ;; #<< here strings - ;; - ;; We only handle the opening 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 OTw;3mb<4W9^M3)C8u9Z0 diff --git a/elpa/racket-mode-20200417.1741/racket-imenu.el b/elpa/racket-mode-20200417.1741/racket-imenu.el deleted file mode 100644 index 7ef7f4b6..00000000 --- a/elpa/racket-mode-20200417.1741/racket-imenu.el +++ /dev/null @@ -1,89 +0,0 @@ -;;; racket-imenu.el - -;; Copyright (c) 2013-2016 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'cl-lib) -(require 'imenu) - -(defun racket--variables-imenu () - (set (make-local-variable 'imenu-case-fold-search) t) - (set (make-local-variable 'imenu-create-index-function) - #'racket--imenu-create-index-function)) - -(defun racket--imenu-create-index-function () - "A function for the variable `imenu-create-index-function'. - -Knows about Racket module forms, and prefixes identiers with -their parent module name(s)." - (save-excursion - (goto-char (point-min)) - (racket--next-sexp) - (racket--walk-sexps ""))) - -(defun racket--walk-sexps (prefix) - "With point at the start of a sexp, walk all the sepxs. - -`racket--menu-sexp' will walk into Racket module forms and call -us recursively." - (cl-loop append (racket--menu-sexp prefix) into xs - while (racket--next-next-sexp) - finally return xs)) - -(defun racket--menu-sexp (prefix) - "Return the identifier for the sexp at point if any, else nil. - -If sexp at point is a Racket module form, descend and walk that." - (cond ((looking-at (rx "(define" (* (or (syntax word) (syntax symbol))) - (+ (syntax whitespace)) - (? ?\() - (group (+ (or (syntax word) (syntax symbol)))))) - (let* ((beg (match-beginning 1)) - (beg (if imenu-use-markers - (save-excursion (goto-char beg) (point-marker)) - beg))) - (list (cons (concat prefix (match-string-no-properties 1)) - beg)))) - ((looking-at (rx "(module" (? (any ?+ ?*)) - (+ (syntax whitespace)) - (group (+ (or (syntax word) (syntax symbol)))))) - (save-excursion - (goto-char (match-end 1)) - (racket--next-sexp) - (racket--walk-sexps (concat prefix (match-string-no-properties 1) ":")))) - (t nil))) - -(defun racket--next-sexp () - "Move point to start of next sexp in buffer." - (forward-sexp 1) - (forward-sexp -1)) - -(defun racket--next-next-sexp () - "If another sexp, move point to its start and return t, else return nil." - (condition-case nil - (progn - (forward-sexp 1) - (let ((orig (point))) - (forward-sexp 1) - (if (or (eobp) (equal orig (point))) - nil - (forward-sexp -1) - t))) - (scan-error nil))) - -(provide 'racket-imenu) - -;;; racket-imenu.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-imenu.elc b/elpa/racket-mode-20200417.1741/racket-imenu.elc deleted file mode 100644 index df5abb5b202b9ecb54a241f947ddc62a97552b83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304 zcmbtV!EWO=5H))8`qUnZ&8eL@1!5;rU`n==Y!2x**hA13XtxD=h=PWesF;XEsw9;- zML)hX6s06sV=rq!mMD^MMsMCco`3k|^6g+S7@eP=!=&n!F$W2IIQ zFOL&H^C;aKcv*t3ovh@)+~Kr69{I^X*V00PD9~78A%9Z5k{RSWv(89$XOD2!SO+}M zMGk!wc6J<}eS(o|#8BEnrj_HkxN${vif>f({*TM6E6CQ|@XTR~M?O4PIam!DSFjRL zYW^xn_!J9*n^Fn`ZjB4$q>YOde9?~*_|o5KG@7iQoQN`=3mB)#Y=#%xO=Ct6bj3KB zos8kyh<_Ss1Y~7Y$`!~;sOARZ>1dLRf|rt8*hg~ig^QvGZX{oo!bW}>>|HBadiH1agLGMHzA_m8)e*zsL*8|S>!QWw~?dF2#$$Mm5WVOG%6!mK*jGxRO*bE zeGcHDODh0w+lgOtGac>y$QBIVLyuQzs+xfAgW&cv82eb*pOt>Jz*o9)@X@mYmChR! zC_+^zN0Ll!L?Jh*HJJfhV0ETkkKWFKk3M)#``PH$t-6NvRKM~wv|vIgzqL6lG1 z33`$L-u0yAecB3f2PsH~_&0yEn~q6|3uI?D|7tMoc-h!cDj@mtx)xZxPqOacc=~z{ zZ(ttSIy+^7t@sQ+3fCCrX=R8L1BN-HP@B<-s3loHcn4XSMm zPe+gon^C?bIL|1$kK4{tUjP)%E0PkThYTRu8xTQh9M5;&(D>~Dl@t#QVi>)zfd;I#~@CG3f`E$6PfO@6$0(zm=@w+iq{8>aS zK22H`%@^>ieh{Jl*d=|t5n?M3JiAs+Q3$iW;Lo9-otezO_u*I0kK%mfhWr 0 - - {} forms when `racket-indent-curly-as-sequence' is not nil - -See `racket-indent-line' for more information about users setting -the `racket-indent-function` property." - (goto-char (racket--ppss-containing-sexp state)) - (let ((body-indent (+ (current-column) lisp-body-indent))) - (forward-char 1) - (if (or (racket--hash-literal-or-keyword-p) - (racket--data-sequence-p)) - (progn (backward-prefix-chars) (current-column)) - (let* ((head (buffer-substring (point) (progn (forward-sexp 1) (point)))) - (method (racket--get-indent-function-method head))) - (cond ((integerp method) - (racket--indent-special-form method indent-point state)) - ((eq method 'defun) - body-indent) - (method - (funcall method indent-point state)) - ((string-match (rx bos (or "def" "with-")) head) - body-indent) ;just like 'defun - ((string-match (rx bos "begin") head) - (racket--indent-special-form 0 indent-point state)) - ((string-match (rx bos (or "for/" "for*/")) head) - (racket--indent-for indent-point state)) - (t - (racket--normal-indent indent-point state))))))) - -(defun racket--hash-literal-or-keyword-p () - "Looking at things like #fl() #hash() or #:keyword ? -The last occurs in Racket contract forms, e.g. (->* () (#:kw kw)). -Returns nil for #% identifiers like #%app." - (looking-at (rx ?\# (or ?\: - (not (any ?\%)))))) - -(defun racket--data-sequence-p () - "Looking at \"data\" sequences where we align under head item? - -These sequences include '() `() #() -- and {} when -`racket-indent-curly-as-sequence' is t -- but never #'() #`() ,() -,@(). - -To handle nested items, we search `backward-up-list' up to -`racket-indent-sequence-depth' times." - (and (< 0 racket-indent-sequence-depth) - (save-excursion - (ignore-errors - (let ((answer 'unknown) - (depth racket-indent-sequence-depth)) - (while (and (eq answer 'unknown) - (< 0 depth)) - (backward-up-list) - (cl-decf depth) - (cond ((or - ;; a quoted '( ) or quasiquoted `( ) list -- - ;; but NOT syntax #'( ) or quasisyntax #`( ) - (and (memq (char-before (point)) '(?\' ?\`)) - (eq (char-after (point)) ?\() - (not (eq (char-before (1- (point))) ?#))) - ;; a vector literal: #( ) - (and (eq (char-before (point)) ?#) - (eq (char-after (point)) ?\()) - ;; { } - (and racket-indent-curly-as-sequence - (eq (char-after (point)) ?{))) - (setq answer t)) - (;; unquote or unquote-splicing - (and (or (eq (char-before (point)) ?,) - (and (eq (char-before (1- (point))) ?,) - (eq (char-before (point)) ?@))) - (eq (char-after (point)) ?\()) - (setq answer nil)))) - (eq answer t)))))) - -(defun racket--normal-indent (_indent-point state) - ;; Credit: Substantially borrowed from clojure-mode - (goto-char (racket--ppss-last-sexp state)) - (backward-prefix-chars) - (let ((last-sexp nil)) - (if (ignore-errors - ;; `backward-sexp' until we reach the start of a sexp that is the - ;; first of its line (the start of the enclosing sexp). - (while (string-match (rx (not blank)) - (buffer-substring (line-beginning-position) - (point))) - (setq last-sexp (prog1 (point) - (forward-sexp -1)))) - t) - ;; Here we've found an arg before the arg we're indenting - ;; which is at the start of a line. - (current-column) - ;; Here we've reached the start of the enclosing sexp (point is - ;; now at the function name), so the behavior depends on whether - ;; there's also an argument on this line. - (when (and last-sexp - (< last-sexp (line-end-position))) - ;; There's an arg after the function name, so align with it. - (goto-char last-sexp)) - (current-column)))) - -(defun racket--indent-special-form (method indent-point state) - "METHOD must be a nonnegative integer -- the number of - \"special\" args that get extra indent when not on the first - line. Any additinonl args get normal indent." - ;; Credit: Substantially borrowed from clojure-mode - (let ((containing-column (save-excursion - (goto-char (racket--ppss-containing-sexp state)) - (current-column))) - (pos -1)) - (condition-case nil - (while (and (<= (point) indent-point) - (not (eobp))) - (forward-sexp 1) - (cl-incf pos)) - ;; If indent-point is _after_ the last sexp in the current sexp, - ;; we detect that by catching the `scan-error'. In that case, we - ;; should return the indentation as if there were an extra sexp - ;; at point. - (scan-error (cl-incf pos))) - (cond ((= method pos) ;first non-distinguished arg - (+ containing-column lisp-body-indent)) - ((< method pos) ;more non-distinguished args - (racket--normal-indent indent-point state)) - (t ;distinguished args - (+ containing-column (* 2 lisp-body-indent)))))) - -(defun racket--conditional-indent (indent-point state looking-at-regexp true false) - (skip-chars-forward " \t") - (let ((n (if (looking-at looking-at-regexp) true false))) - (racket--indent-special-form n indent-point state))) - -(defconst racket--identifier-regexp - (rx (or (syntax symbol) (syntax word) (syntax punctuation))) - "A regexp matching valid Racket identifiers.") - -(defun racket--indent-maybe-named-let (indent-point state) - "Indent a let form, handling named let (let ...)" - (racket--conditional-indent indent-point state - racket--identifier-regexp - 2 1)) - -(defun racket--indent-for (indent-point state) - "Indent function for all for/ and for*/ forms EXCEPT -for/fold and for*/fold. - -Checks for either of: - - maybe-type-ann e.g. (for/list : T ([x xs]) x) - - for/vector optional length, (for/vector #:length ([x xs]) x)" - (racket--conditional-indent indent-point state - (rx (or ?\: ?\#)) - 3 1)) - -(defun racket--indent-for/fold (indent-point state) - "Indent function for for/fold and for*/fold." - ;; check for maybe-type-ann e.g. (for/fold : T ([n 0]) ([x xs]) x) - (skip-chars-forward " \t\n") - (if (looking-at ":") - (racket--indent-special-form 4 indent-point state) - (racket--indent-for/fold-untyped indent-point state))) - -(defun racket--indent-for/fold-untyped (indent-point state) - (let* ((containing-sexp-start (racket--ppss-containing-sexp state)) - (_ (goto-char containing-sexp-start)) - (containing-sexp-column (current-column)) - (containing-sexp-line (line-number-at-pos)) - (body-indent (+ containing-sexp-column lisp-body-indent)) - (clause-indent nil)) - ;; Move to the open paren of the first, accumulator sexp - (forward-char 1) ;past the open paren - (forward-sexp 2) ;to the next sexp, past its close paren - (backward-sexp 1) ;back to its open paren - ;; If the first, accumulator sexp is not on the same line as - ;; `for/fold`, then this is simply specform 2. - (if (/= (line-number-at-pos) containing-sexp-line) ;expensive? - (racket--indent-special-form 2 indent-point state) - (setq clause-indent (current-column)) - (forward-sexp 1) ;past close paren - ;; Now go back to the beginning of the line holding - ;; the indentation point. Count the sexps on the way. - (parse-partial-sexp (point) indent-point 1 t) - (let ((n 1)) - (while (and (< (point) indent-point) - (ignore-errors - (cl-incf n) - (forward-sexp 1) - (parse-partial-sexp (point) indent-point 1 t)))) - (if (= 1 n) clause-indent body-indent))))) - -(defun racket--get-indent-function-method (head) - "Get property of racket- or scheme-indent-function. - -Ignores certain with-xxx indents defined by scheme-mode -- -because we automatically indent with- forms just like def forms. -However if a _user_ has defined their own legacy scheme-mode -indents for _other_ with- forms, those _will_ be used. We only -ignore a short list defined by scheme-mode itself." - (let ((sym (intern-soft head))) - (or (get sym 'racket-indent-function) - (and (not (memq sym '(call-with-values - with-mode - with-input-from-file - with-input-from-port - with-output-to-file - with-output-to-port - with-input-from-string - with-output-to-string - with-values))) - (get sym 'scheme-indent-function))))) - -(defun racket--set-indentation () - "Set indentation for various Racket forms. - -Note that `racket-indent-function' handles some forms -- e.g. -`begin*`, `def*` `for/*`, `with-*` -- with regexp matches for -anything not explicitly listed here. - -Note that indentation is set for the symbol alone, and also with -a : suffix for legacy Typed Racket. For example both `let` and -`let:`. Although this is overzealous in the sense that Typed -Racket does not define its own variant of all of these, it -doesn't hurt to do so." - (mapc (lambda (x) - (put (car x) 'racket-indent-function (cadr x)) - (let ((typed (intern (format "%s:" (car x))))) - (put typed 'racket-indent-function (cadr x)))) - '(;; begin* forms default to 0 unless otherwise specified here - (begin0 1) - (c-declare 0) - (c-lambda 2) - (call-with-input-file defun) - (call-with-input-file* defun) - (call-with-output-file defun) - (call-with-output-file* defun) - (case 1) - (case-lambda 0) - (catch 1) - (class defun) - (class* defun) - (compound-unit/sig 0) - (cond 0) - ;; def* forms default to 'defun unless otherwise specified here - (delay 0) - (do 2) - (dynamic-wind 0) - (fn 1) ;alias for lambda (although not officially in Racket) - ;; for/ and for*/ forms default to racket--indent-for unless - ;; otherwise specified here - (for 1) - (for/list racket--indent-for) - (for/lists racket--indent-for/fold) - (for/fold racket--indent-for/fold) - (for* 1) - (for*/lists racket--indent-for/fold) - (for*/fold racket--indent-for/fold) - (instantiate 2) - (interface 1) - (λ 1) - (lambda 1) - (lambda/kw 1) - (let racket--indent-maybe-named-let) - (let* 1) - (letrec 1) - (letrec-values 1) - (let-values 1) - (let*-values 1) - (let+ 1) - (let-syntax 1) - (let-syntaxes 1) - (letrec-syntax 1) - (letrec-syntaxes 1) - (letrec-syntaxes+values racket--indent-for/fold-untyped) - (local 1) - (let/cc 1) - (let/ec 1) - (match 1) - (match* 1) - (match-define defun) - (match-lambda 0) - (match-lambda* 0) - (match-let 1) - (match-let* 1) - (match-let*-values 1) - (match-let-values 1) - (match-letrec 1) - (match-letrec-values 1) - (match/values 1) - (mixin 2) - (module 2) - (module+ 1) - (module* 2) - (opt-lambda 1) - (parameterize 1) - (parameterize-break 1) - (parameterize* 1) - (quasisyntax/loc 1) - (receive 2) - (require/typed 1) - (require/typed/provide 1) - (send* 1) - (shared 1) - (sigaction 1) - (splicing-let 1) - (splicing-letrec 1) - (splicing-let-values 1) - (splicing-letrec-values 1) - (splicing-let-syntax 1) - (splicing-letrec-syntax 1) - (splicing-let-syntaxes 1) - (splicing-letrec-syntaxes 1) - (splicing-letrec-syntaxes+values racket--indent-for/fold-untyped) - (splicing-local 1) - (splicing-syntax-parameterize 1) - (struct defun) - (syntax-case 2) - (syntax-case* 3) - (syntax-rules 1) - (syntax-id-rules 1) - (syntax-parse 1) - (syntax-parser 0) - (syntax-parameterize 1) - (syntax/loc 1) - (syntax-parse 1) - (test-begin 0) - (test-case 1) - (unit defun) - (unit/sig 2) - (unless 1) - (when 1) - (while 1) - ;; with- forms default to 1 unless otherwise specified here - ))) - -(provide 'racket-indent) - -;; racket-indent.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-indent.elc b/elpa/racket-mode-20200417.1741/racket-indent.elc deleted file mode 100644 index b5e9b6a1c4459fb2316dd16670e4e236a34f2465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12692 zcmcIq4RhO8c9ku!H)dzsPIo$;&U9v9s5qh&K_b8peI#pJaTG_bV`nU7lSWibkN`!j zL4YAZOUkCdtpB0Esps7H9tcvD8)v2-+XUYCyYJp}&%F#d+t*c8v!;ZE5)Bwd=cwU1GkA3X6 zs@6W**bpf}*th(tR4TRJbsjqXGze9-)2P?+&;79DxqRS1ul&*|zcleu->s^%N%+$= zn&1dxCysgw(tZ=>&NPo=``n*qc{;Lh<8hXqD{rH+_GI5v-wne=bxkK{goQX^5apR; zipJ|Wnk*0fKuxo-Xc;9znBEWn-t*+3|z7Q9o2`XN|qqOauyhYjlzoN&t`E->uxe+o_rj`{QwZZFjS5$+oUE z&$();+S*5ITeTYA#<^_1{@$A(Ptps!`YgN}zt`5yYS{1pXV;6Xo9%gbuf;vzqHOiX zKT*)G2)hBfH|otbqk}AL;U5dzwy^dIIKgiy>E>0|`-x>nceR0V0Wo~tAT z+yHE-&N%@LmOLWH1hArh9$#;%C|4*)gP`J1VLAZ4zKn87YvE91=y|5zgx47+eiN!! zN2j#?)5FiV)mQ0d2!LX{$|$-R<_g$^cg%@_WeC9KAi9_mc(4JnPQ6)y*DVDdi2Xy`}MTpg_dN*(m zkbkDvBV#EUtJ(`MqNECB;WPm8X*Ts^!0NSbTGVG~LZAr)h~Pcv0Qgj~T#R1jq>i2L z#$;#+QKNccwy&T~lPTmP5DyiBJjP)^8bo~xCJ7)lt8TJS9#e`l$ipPq68(Y-SmzKW zIDGMyd0MHgee(Iyv*Q=9PhLGW>W+27lZ~gjI{DA9KY#hWz)URxXE06r^u6l%#TQ2} zPGJV09KHC015_%e2R6V%O?ap{Nj@8E;PSMhR@ZYNwA1%9>==8f=;63|KcN>6FL3xc zW%kalN4+#w)pdwynpC$nV3vDSOph&TKMMVXDs2`b+65ufLzb1b*b3**`onM(T2!@F z2iCl~j6pPkQ!&%}lZ&Y+b43nA%#zlt#e_{*fAcOS(}ShpUBJ9iRdrk4@;5{OT7L4*nI(r_f*Lik-Zn7}6!fZnl&qB&%kiiS{2 z%%5KD50{nAEeN3V8|Ekt&BwVBkFgEo&KFd3T@7*CNeXmK$KfQ$NkG!RQKPL}j#^YN zCMN`xL_s(SVLX1E57X(zP~>Oq7rI6)$doqNK=ojdT6@S_1l*#FB*g&RN)7^gm?i*! z2w@n;|{Ym5lC_$EAQXMZNI2`y5x&oLv$FzcqfHAP_+r$c$CBgcb6g*8Z^mkvq ze17B{egDl;l4VXs9OBxU*J^8C1y1F<@Z7DP6+Q*sAK=qnme#v?^62F+`F1z@7R{P} zl4jjsr0B2GELi>FJC5+lN^tjwUdL;<@dkp{_U_<8$f#zYz?YbU0=G4GDTq&SaMFP| zB~?`qsw#=%bG2uvnd>#`8&U*?d*bak)vGX{P7(#i2aSR_b8AfECq=y${r__i4D0=m z69e{yJNP*cR>rvlIYKzG=?JF@_pB*Jo^Ds5`El6`U3!F$etx2?+jnX96oB@jp4BK3MMoOIvq7#Q*KP z{C{`#!@F$0sfi<$;NMqPS@7o-Y65;R6_t%o4Y&Tg-wAt1D_ednPp42Kw;rJ(s_-KU z)v$`SfpRL&Fgxx2n&2AqsL#=r^7(jeR&sX>Owy zhD-?3B*di(mn)66S;sZg=7!g*>qw*Fy6QPuBG%r1f@GrjJ zR-aGviYC8#nyL)cldTb@lM4ewF_Yt{aOQb|g4F<&A;BnlSgp{|3_tZ1G_9`n-{uH1 zsxuaX<)$!;UUZ?ldfi=8wJrkKi9fmS0(7s&ljW*?>v?MxH$gO%R1ghHi~wdpJ#BV8 zuXO^AGhs81(Vz5(P7jy`AqJ}YW2ckV1e736c!WCQ4TDXM{dQBIW~<#&Phox#2pmvx zPKy?|PRU(_h$Kv$A}9ls*F47g=H>B=Qyw5;W}Ie`kUQb+QD6H#fsS5Cf$2dwC7Cl^ z%E{^B>5=W;y{YQ!#2mmSJ+Q!*okBo|2Z^c8Il>Vp0Vca(>jO{mY&^D+>8M7s}w**FOpajG4r<$$^{2btighiP2p(hdxSqU0Lvb9ct zNMw5E_MV>`Z?w?It>3wiKQs^TO0XDZ z?w?uxc!k(*OHrUv+hRCcH|R#(#;SmNC_${psv&TMZ(oiXQL_= zVt-Y*uA-GR#aQy&>1;mUL1X>5T5R1+jb=p=s49sYqx$TB}o~CaI z1wbMM4&c2ycv>68wGAcKj9&~oLxRU(G2l7ynkwzX49RnB;Aw$D8!i$Q+ZWra<~-U| z7^Q|WF4ddMjg9S!W_rT2#3a`qDo~{)N3=~N)L8NmL~yxNxc#8#yaLQX>yzH3gH2Y~ zM2rWJ``M2V&nb3fM~!G&?e@MFjkh-^nkx0CIuB*QkV}xW7%_+fE`sI{nKp&?jUJQf zh2WqToG7DyJOvqChakEXE&jo`(s2Xlh;Wq!v{{aDIeYbhR*58?);Qi82iyYYZat|% zw#-Th#3MI=;2&OuYs$8`Tq9vh&$q?K@}UjfP#ASgFF0Ra0u?Y%`)$fP*eM=!H#%#A_TRIGi^Uy>7ESG zw*80*_GG2Ymt7eKFKAeA@9QRRT}pohPNMK=uJEMPuleK31CA9)nSsWDa3ukcK;$3v zAdwlQ!I8l-T-Qwbwp`ILtr+>lcbl)3Zjj(?8TPlU{}I}S=3ON z(wqxn$YOQ;9=tz9l9F8;#2@DP($vSlA>bBJ((s8&K0J+7Su^xv*=(9Fs7}8{x`761T zb-iYd+PAKq?e4m8lp0nF617oi%=$|A-uF1Z*4oPGvHnF}lPY9X#dS|h`XU_${n&aXwUPNdm5{rQ8C;1?&+xaIU4|uUP~)#&inBhoOUh4jj3a7 zbWRm!WM|%fyjdi=>$XiKid@ibHmRP!eEA>8FP=Gvr_QURXGkuo(^uafsV@(opByb^ zuZ)O!vP?-?Ubc4TdgY6}OR+N8>ndGu;slj%v8`0 z$BYBwmEr7u!Ox}s*{<4&_gxqFytqo;wHa$)#ZYjZ(P(QHSTQG$+c8w&MmkrYMZqKW zSr3~c!@?uO-A8JBdmDGg?-4*)BS1E@7dkQtF0%6yc)EA*QuhQe9~wE|zEfMX+GdXxF}ICSv!fT5BchkQjHs8dxtyHZ!#`G&eG;?SM9xYNUWirlIG zAYeXLcxB zMO+s}ai$56J~&rxV|#n;rb)@XH`Op`vN(3>?BF}d1bPv6Q;S@4hkrAT1)5_>6VTpr%)Ncj9DD-->oee8ap8o-qQNl6sLOA305ZpNO@ym| z+*0A5U9wxw)zy_DB)48MIZlz=XQ;R2%3BX*uu-9eV75jNWGyoHO%^cHf z_=(w+z&zX`k%PzJX#Kf6uHp&|nyX%?gvZzA8F@vKBFucvE6CS2af^FfWQcJQR?*jE zynq;{6D|$w!_q+2ZrrBf8=x>A7;5&_(cu@%Ilw!TAiR6p1sOv|*5sdnBQKzg?LS&& z^d1QbE8ZKdCKVtnog_|{4hqL?ZPwm{*N}0I9m$o*Ee+C%yylmyKzWK1T(dd6W_2Y0 zyjVD<2&53nJ~qwMQo~uoc)Mj;JrwZ-xX5cH9Ef_BHqU$v5Q1&mg18D=_mPnBw;FD$t!Jkw^SDz zu-R2zqM^KtOi+T5fRA%@3WK3t1=sA79RiVOJTQ)K*c;qx|_Ggo}L^=vvoB2JncgE*xhFd3$8^(DqJxB0l>$8x)1 zKwS=m`-Ct*=pqW4-6msl{6%tq@^gqOAyt?^elSXg9YlGBefX)-5FaA&8X&-3O1eBt0!bJs)aPxpB;s^oI-Z0O zG>MTv?!!UNZ0ZTB-POYfc}rKPn{n?+3$ZGGU9wzNAO#v6r3}`r zst>aRq``P|oOBY>i0_#etJOql>dHm(u8-V8A9vxnCXu(;AN2ws9~PpjuuNky{6rM; znwEl^WXAgq{|ZhxPx4- zyur2?#$E_d*d@&MqVa&Q?rcXqItI+mPz$e{3-6!Uo=$d+>)ES?SD3CDha=B7nUySS z6=t89g)Hm^XE(=3xf%K1!%Vc(FLtwIHYRbXEJU94#^n(vMCV&*zb-5(Zn0%lS%^wn+YQ6Gmc-js60UDgn}UNAgF z!ho9SXRS@;0;h*h6W_?b%EfwXKTUny9?K!`K;Y5}D-D^$;#$mS&^r<&m|FQTT9@pA zBEIFv7hDCfKG36PxZZ&;kwV;v>o4r&OZB9 ze`hIzmm_wfz`0R|$qc^FW(R#1vzV1EtY=j%0yq=U{8zw5k|TX&m#BzHBde)dav4fPw9{{_bBo~8f* diff --git a/elpa/racket-mode-20200417.1741/racket-keywords-and-builtins.el b/elpa/racket-mode-20200417.1741/racket-keywords-and-builtins.el deleted file mode 100644 index d74ef0b2..00000000 --- a/elpa/racket-mode-20200417.1741/racket-keywords-and-builtins.el +++ /dev/null @@ -1,2819 +0,0 @@ -;;; racket-keywords-and-builtins.el - -;; Copyright (c) 2013-2016 by Greg Hendershott. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(defconst racket-type-list - ;; This list was generated using keywords.rkt -- don't edit - ;; individual items here! - '("All" - "Any" - "AnyValues" - "Async-ChannelTop" - "Async-Channelof" - "Boolean" - "Bot" - "BoxTop" - "Boxof" - "Byte" - "Byte-PRegexp" - "Byte-Regexp" - "Bytes" - "Bytes-Converter" - "ChannelTop" - "Channelof" - "Char" - "Class" - "ClassTop" - "Compiled-Expression" - "Compiled-Module-Expression" - "Complex" - "Continuation-Mark-KeyTop" - "Continuation-Mark-Keyof" - "Continuation-Mark-Set" - "Custodian" - "Custodian-Boxof" - "Datum" - "EOF" - "Environment-Variables" - "Ephemeronof" - "Evtof" - "Exact-Nonnegative-Integer" - "Exact-Number" - "Exact-Positive-Integer" - "Exact-Rational" - "ExtFlVector" - "ExtFlonum" - "ExtFlonum-Nan" - "ExtFlonum-Negative-Zero" - "ExtFlonum-Positive-Zero" - "ExtFlonum-Zero" - "FSemaphore" - "False" - "Fixnum" - "FlVector" - "Float" - "Float-Complex" - "Float-Nan" - "Float-Negative-Zero" - "Float-Positive-Zero" - "Float-Zero" - "Flonum" - "Flonum-Nan" - "Flonum-Negative-Zero" - "Flonum-Positive-Zero" - "Flonum-Zero" - "Futureof" - "FxVector" - "HashTable" - "HashTableTop" - "Identifier" - "Immutable-HashTable" - "Impersonator-Property" - "Index" - "Inexact-Complex" - "Inexact-Real" - "Inexact-Real-Nan" - "Inexact-Real-Negative-Zero" - "Inexact-Real-Positive-Zero" - "Inexact-Real-Zero" - "Input-Port" - "Inspector" - "Instance" - "Integer" - "Internal-Definition-Context" - "Intersection" - "Keyword" - "List" - "List*" - "Listof" - "Log-Level" - "Log-Receiver" - "Logger" - "MListof" - "MPairTop" - "MPairof" - "Module-Path" - "Module-Path-Index" - "Mutable-HashTable" - "Mutable-HashTableTop" - "Namespace" - "Namespace-Anchor" - "Natural" - "Negative-Exact-Rational" - "Negative-ExtFlonum" - "Negative-Fixnum" - "Negative-Float" - "Negative-Flonum" - "Negative-Inexact-Real" - "Negative-Integer" - "Negative-Real" - "Negative-Single-Flonum" - "Nonnegative-Exact-Rational" - "Nonnegative-ExtFlonum" - "Nonnegative-Fixnum" - "Nonnegative-Float" - "Nonnegative-Flonum" - "Nonnegative-Inexact-Real" - "Nonnegative-Integer" - "Nonnegative-Real" - "Nonnegative-Single-Flonum" - "Nonpositive-Exact-Rational" - "Nonpositive-ExtFlonum" - "Nonpositive-Fixnum" - "Nonpositive-Float" - "Nonpositive-Flonum" - "Nonpositive-Inexact-Real" - "Nonpositive-Integer" - "Nonpositive-Real" - "Nonpositive-Single-Flonum" - "Nothing" - "Null" - "Number" - "Object" - "One" - "Opaque" - "Option" - "Output-Port" - "PRegexp" - "Pair" - "Pairof" - "Parameter" - "Parameterization" - "Parameterof" - "Path" - "Path-For-Some-System" - "Path-String" - "Place" - "Place-Channel" - "Port" - "Positive-Byte" - "Positive-Exact-Rational" - "Positive-ExtFlonum" - "Positive-Fixnum" - "Positive-Float" - "Positive-Flonum" - "Positive-Index" - "Positive-Inexact-Real" - "Positive-Integer" - "Positive-Real" - "Positive-Single-Flonum" - "Prefab" - "Pretty-Print-Style-Table" - "Procedure" - "Promise" - "Prompt-TagTop" - "Prompt-Tagof" - "Pseudo-Random-Generator" - "Read-Table" - "Real" - "Real-Zero" - "Rec" - "Refine" - "Refinement" - "Regexp" - "Resolved-Module-Path" - "Row" - "Security-Guard" - "Semaphore" - "Sequenceof" - "Setof" - "Sexp" - "Sexpof" - "Single-Flonum" - "Single-Flonum-Complex" - "Single-Flonum-Nan" - "Single-Flonum-Negative-Zero" - "Single-Flonum-Positive-Zero" - "Single-Flonum-Zero" - "Special-Comment" - "String" - "Struct" - "Struct-Type" - "Struct-Type-Property" - "Struct-TypeTop" - "Subprocess" - "Symbol" - "Syntax" - "Syntax-E" - "Syntaxof" - "TCP-Listener" - "Thread" - "Thread-CellTop" - "Thread-Cellof" - "Thread-Group" - "Top" - "True" - "Tuple" - "U" - "UDP-Socket" - "Un" - "Undefined" - "Union" - "Unit" - "UnitTop" - "Values" - "Variable-Reference" - "Vector" - "VectorTop" - "Vectorof" - "Void" - "Weak-BoxTop" - "Weak-Boxof" - "Weak-HashTable" - "Weak-HashTableTop" - "Will-Executor" - "Zero") - "Typed Racket builtin types") - -(defconst racket-keywords - ;; This list was generated using keywords.rkt -- don't edit - ;; individual items here! - '("#%app" - "#%datum" - "#%declare" - "#%expression" - "#%module-begin" - "#%plain-app" - "#%plain-lambda" - "#%plain-module-begin" - "#%printing-module-begin" - "#%provide" - "#%require" - "#%stratified-body" - "#%top" - "#%top-interaction" - "#%variable-reference" - "..." - ":do-in" - "=>" - "_" - "all-defined-out" - "all-from-out" - "and" - "apply" - "arity-at-least" - "begin" - "begin-for-syntax" - "begin0" - "call-with-input-file" - "call-with-input-file*" - "call-with-output-file" - "call-with-output-file*" - "case" - "case-lambda" - "combine-in" - "combine-out" - "cond" - "date" - "date*" - "define" - "define-for-syntax" - "define-logger" - "define-namespace-anchor" - "define-sequence-syntax" - "define-struct" - "define-struct/derived" - "define-syntax" - "define-syntax-rule" - "define-syntaxes" - "define-values" - "define-values-for-syntax" - "do" - "else" - "except-in" - "except-out" - "exn" - "exn:break" - "exn:break:hang-up" - "exn:break:terminate" - "exn:fail" - "exn:fail:contract" - "exn:fail:contract:arity" - "exn:fail:contract:continuation" - "exn:fail:contract:divide-by-zero" - "exn:fail:contract:non-fixnum-result" - "exn:fail:contract:variable" - "exn:fail:filesystem" - "exn:fail:filesystem:errno" - "exn:fail:filesystem:exists" - "exn:fail:filesystem:missing-module" - "exn:fail:filesystem:version" - "exn:fail:network" - "exn:fail:network:errno" - "exn:fail:out-of-memory" - "exn:fail:read" - "exn:fail:read:eof" - "exn:fail:read:non-char" - "exn:fail:syntax" - "exn:fail:syntax:missing-module" - "exn:fail:syntax:unbound" - "exn:fail:unsupported" - "exn:fail:user" - "file" - "for" - "for*" - "for*/and" - "for*/first" - "for*/fold" - "for*/fold/derived" - "for*/hash" - "for*/hasheq" - "for*/hasheqv" - "for*/last" - "for*/list" - "for*/lists" - "for*/or" - "for*/product" - "for*/sum" - "for*/vector" - "for-label" - "for-meta" - "for-syntax" - "for-template" - "for/and" - "for/first" - "for/fold" - "for/fold/derived" - "for/hash" - "for/hasheq" - "for/hasheqv" - "for/last" - "for/list" - "for/lists" - "for/or" - "for/product" - "for/sum" - "for/vector" - "gen:custom-write" - "gen:equal+hash" - "if" - "in-bytes" - "in-bytes-lines" - "in-directory" - "in-hash" - "in-hash-keys" - "in-hash-pairs" - "in-hash-values" - "in-immutable-hash" - "in-immutable-hash-keys" - "in-immutable-hash-pairs" - "in-immutable-hash-values" - "in-indexed" - "in-input-port-bytes" - "in-input-port-chars" - "in-lines" - "in-list" - "in-mlist" - "in-mutable-hash" - "in-mutable-hash-keys" - "in-mutable-hash-pairs" - "in-mutable-hash-values" - "in-naturals" - "in-port" - "in-producer" - "in-range" - "in-string" - "in-value" - "in-vector" - "in-weak-hash" - "in-weak-hash-keys" - "in-weak-hash-pairs" - "in-weak-hash-values" - "lambda" - "let" - "let*" - "let*-values" - "let-syntax" - "let-syntaxes" - "let-values" - "let/cc" - "let/ec" - "letrec" - "letrec-syntax" - "letrec-syntaxes" - "letrec-syntaxes+values" - "letrec-values" - "lib" - "local-require" - "log-debug" - "log-error" - "log-fatal" - "log-info" - "log-warning" - "module" - "module*" - "module+" - "only-in" - "only-meta-in" - "open-input-file" - "open-input-output-file" - "open-output-file" - "or" - "parameterize" - "parameterize*" - "parameterize-break" - "planet" - "prefix-in" - "prefix-out" - "protect-out" - "provide" - "quasiquote" - "quasisyntax" - "quasisyntax/loc" - "quote" - "quote-syntax" - "quote-syntax/prune" - "regexp-match*" - "regexp-match-peek-positions*" - "regexp-match-positions*" - "relative-in" - "rename-in" - "rename-out" - "require" - "set!" - "set!-values" - "sort" - "srcloc" - "struct" - "struct-copy" - "struct-field-index" - "struct-out" - "submod" - "syntax" - "syntax-case" - "syntax-case*" - "syntax-id-rules" - "syntax-rules" - "syntax/loc" - "time" - "unless" - "unquote" - "unquote-splicing" - "unsyntax" - "unsyntax-splicing" - "when" - "with-continuation-mark" - "with-handlers" - "with-handlers*" - "with-input-from-file" - "with-output-to-file" - "with-syntax" - "λ") - "Racket \"keywords\": syntax from racket/base") - -(defconst racket-builtins-1-of-2 - ;; This list was generated using keywords.rkt -- don't edit - ;; individual items here! - '("!" - "*" - "*list/c" - "+" - "-" - "->" - "->*" - "->*m" - "->d" - "->dm" - "->i" - "->m" - "/" - ":" - ":print-type" - ":query-type/args" - ":query-type/result" - ":type" - "<" - "" - ">/c" - ">=" - ">=/c" - "abort-current-continuation" - "abs" - "absent" - "absolute-path?" - "abstract" - "acos" - "add-between" - "add1" - "alarm-evt" - "always-evt" - "and/c" - "andmap" - "angle" - "ann" - "any" - "any/c" - "append" - "append*" - "append-map" - "argmax" - "argmin" - "arithmetic-shift" - "arity-at-least-value" - "arity-at-least?" - "arity-checking-wrapper" - "arity-includes?" - "arity=?" - "arrow-contract-info" - "arrow-contract-info-accepts-arglist" - "arrow-contract-info-chaperone-procedure" - "arrow-contract-info-check-first-order" - "arrow-contract-info?" - "asin" - "assert" - "assf" - "assoc" - "assq" - "assv" - "atan" - "augment" - "augment*" - "augment-final" - "augment-final*" - "augride" - "augride*" - "bad-number-of-results" - "banner" - "base->-doms/c" - "base->-rngs/c" - "base->?" - "between/c" - "bitwise-and" - "bitwise-bit-field" - "bitwise-bit-set?" - "bitwise-ior" - "bitwise-not" - "bitwise-xor" - "blame-add-car-context" - "blame-add-cdr-context" - "blame-add-context" - "blame-add-missing-party" - "blame-add-nth-arg-context" - "blame-add-range-context" - "blame-add-unknown-context" - "blame-context" - "blame-contract" - "blame-fmt->-string" - "blame-missing-party?" - "blame-negative" - "blame-original?" - "blame-positive" - "blame-replace-negative" - "blame-source" - "blame-swap" - "blame-swapped?" - "blame-update" - "blame-value" - "blame?" - "boolean=?" - "boolean?" - "bound-identifier=?" - "box" - "box-cas!" - "box-immutable" - "box-immutable/c" - "box/c" - "box?" - "break-enabled" - "break-parameterization?" - "break-thread" - "build-chaperone-contract-property" - "build-compound-type-name" - "build-contract-property" - "build-flat-contract-property" - "build-list" - "build-path" - "build-path/convention-type" - "build-string" - "build-vector" - "byte-pregexp" - "byte-pregexp?" - "byte-ready?" - "byte-regexp" - "byte-regexp?" - "byte?" - "bytes" - "bytes->immutable-bytes" - "bytes->list" - "bytes->path" - "bytes->path-element" - "bytes->string/latin-1" - "bytes->string/locale" - "bytes->string/utf-8" - "bytes-append" - "bytes-append*" - "bytes-close-converter" - "bytes-convert" - "bytes-convert-end" - "bytes-converter?" - "bytes-copy" - "bytes-copy!" - "bytes-environment-variable-name?" - "bytes-fill!" - "bytes-join" - "bytes-length" - "bytes-no-nuls?" - "bytes-open-converter" - "bytes-ref" - "bytes-set!" - "bytes-utf-8-index" - "bytes-utf-8-length" - "bytes-utf-8-ref" - "bytes?" - "bytes?" - "caaaar" - "caaadr" - "caaar" - "caadar" - "caaddr" - "caadr" - "caar" - "cadaar" - "cadadr" - "cadar" - "caddar" - "cadddr" - "caddr" - "cadr" - "call-in-nested-thread" - "call-with-atomic-output-file" - "call-with-break-parameterization" - "call-with-composable-continuation" - "call-with-continuation-barrier" - "call-with-continuation-prompt" - "call-with-current-continuation" - "call-with-default-reading-parameterization" - "call-with-escape-continuation" - "call-with-exception-handler" - "call-with-file-lock/timeout" - "call-with-immediate-continuation-mark" - "call-with-input-bytes" - "call-with-input-string" - "call-with-output-bytes" - "call-with-output-string" - "call-with-parameterization" - "call-with-semaphore" - "call-with-semaphore/enable-break" - "call-with-values" - "call/cc" - "call/ec" - "car" - "cartesian-product" - "case->" - "case->m" - "case-lambda:" - "case→" - "cast" - "cdaaar" - "cdaadr" - "cdaar" - "cdadar" - "cdaddr" - "cdadr" - "cdar" - "cddaar" - "cddadr" - "cddar" - "cdddar" - "cddddr" - "cdddr" - "cddr" - "cdr" - "ceiling" - "channel-get" - "channel-put" - "channel-put-evt" - "channel-put-evt?" - "channel-try-get" - "channel/c" - "channel?" - "chaperone-box" - "chaperone-channel" - "chaperone-continuation-mark-key" - "chaperone-contract-property?" - "chaperone-contract?" - "chaperone-evt" - "chaperone-hash" - "chaperone-hash-set" - "chaperone-of?" - "chaperone-procedure" - "chaperone-procedure*" - "chaperone-prompt-tag" - "chaperone-struct" - "chaperone-struct-type" - "chaperone-vector" - "chaperone-vector*" - "chaperone?" - "char->integer" - "char-alphabetic?" - "char-blank?" - "char-ci<=?" - "char-ci=?" - "char-ci>?" - "char-downcase" - "char-foldcase" - "char-general-category" - "char-graphic?" - "char-in" - "char-in/c" - "char-iso-control?" - "char-lower-case?" - "char-numeric?" - "char-punctuation?" - "char-ready?" - "char-symbolic?" - "char-title-case?" - "char-titlecase" - "char-upcase" - "char-upper-case?" - "char-utf-8-length" - "char-whitespace?" - "char<=?" - "char=?" - "char>?" - "char?" - "check-duplicate-identifier" - "check-duplicates" - "check-tail-contract" - "checked-procedure-check-and-extract" - "choice-evt" - "class" - "class*" - "class->interface" - "class-field-accessor" - "class-field-mutator" - "class-info" - "class-seal" - "class-unseal" - "class/c" - "class/derived" - "class?" - "cleanse-path" - "close-input-port" - "close-output-port" - "coerce-chaperone-contract" - "coerce-chaperone-contracts" - "coerce-contract" - "coerce-contract/f" - "coerce-contracts" - "coerce-flat-contract" - "coerce-flat-contracts" - "collect-garbage" - "collection-file-path" - "collection-path" - "combinations" - "command-line" - "compile" - "compile-allow-set!-undefined" - "compile-context-preservation-enabled" - "compile-enforce-module-constants" - "compile-syntax" - "compiled-expression-recompile" - "compiled-expression?" - "compiled-module-expression?" - "complete-path?" - "complex?" - "compose" - "compose1" - "compound-unit" - "compound-unit/infer" - "conjoin" - "conjugate" - "cons" - "cons/c" - "cons/dc" - "cons?" - "const" - "continuation-mark-key/c" - "continuation-mark-key?" - "continuation-mark-set->context" - "continuation-mark-set->list" - "continuation-mark-set->list*" - "continuation-mark-set-first" - "continuation-mark-set?" - "continuation-marks" - "continuation-prompt-available?" - "continuation-prompt-tag?" - "continuation?" - "contract" - "contract-continuation-mark-key" - "contract-custom-write-property-proc" - "contract-exercise" - "contract-first-order" - "contract-first-order-passes?" - "contract-late-neg-projection" - "contract-name" - "contract-out" - "contract-proc" - "contract-projection" - "contract-property?" - "contract-random-generate" - "contract-random-generate-fail" - "contract-random-generate-fail?" - "contract-random-generate-get-current-environment" - "contract-random-generate-stash" - "contract-random-generate/choose" - "contract-stronger?" - "contract-struct" - "contract-struct-exercise" - "contract-struct-generate" - "contract-struct-late-neg-projection" - "contract-struct-list-contract?" - "contract-val-first-projection" - "contract?" - "contracted" - "convert-stream" - "copy-directory/files" - "copy-file" - "copy-port" - "cos" - "cosh" - "count" - "current-blame-format" - "current-break-parameterization" - "current-code-inspector" - "current-command-line-arguments" - "current-compile" - "current-compiled-file-roots" - "current-continuation-marks" - "current-contract-region" - "current-custodian" - "current-directory" - "current-directory-for-user" - "current-drive" - "current-environment-variables" - "current-error-port" - "current-eval" - "current-evt-pseudo-random-generator" - "current-force-delete-permissions" - "current-future" - "current-gc-milliseconds" - "current-get-interaction-input-port" - "current-inexact-milliseconds" - "current-input-port" - "current-inspector" - "current-library-collection-links" - "current-library-collection-paths" - "current-load" - "current-load-extension" - "current-load-relative-directory" - "current-load/use-compiled" - "current-locale" - "current-logger" - "current-memory-use" - "current-milliseconds" - "current-module-declare-name" - "current-module-declare-source" - "current-module-name-resolver" - "current-module-path-for-load" - "current-namespace" - "current-output-port" - "current-parameterization" - "current-plumber" - "current-preserved-thread-cell-values" - "current-print" - "current-process-milliseconds" - "current-prompt-read" - "current-pseudo-random-generator" - "current-read-interaction" - "current-reader-guard" - "current-readtable" - "current-recorded-disappeared-uses" - "current-seconds" - "current-security-guard" - "current-subprocess-custodian-mode" - "current-syntax-context" - "current-thread" - "current-thread-group" - "current-thread-initial-stack-size" - "current-write-relative-directory" - "curry" - "curryr" - "custodian-box-value" - "custodian-box?" - "custodian-limit-memory" - "custodian-managed-list" - "custodian-memory-accounting-available?" - "custodian-require-memory" - "custodian-shutdown-all" - "custodian?" - "custom-print-quotable-accessor" - "custom-print-quotable?" - "custom-write-accessor" - "custom-write-property-proc" - "custom-write?" - "date*-nanosecond" - "date*-time-zone-name" - "date*?" - "date-day" - "date-dst?" - "date-hour" - "date-minute" - "date-month" - "date-second" - "date-time-zone-offset" - "date-week-day" - "date-year" - "date-year-day" - "date?" - "datum->syntax" - "datum-intern-literal" - "declare-refinement" - "default-continuation-prompt-tag" - "define-compound-unit" - "define-compound-unit/infer" - "define-contract-struct" - "define-custom-hash-types" - "define-custom-set-types" - "define-local-member-name" - "define-match-expander" - "define-member-name" - "define-module-boundary-contract" - "define-new-subtype" - "define-opt/c" - "define-predicate" - "define-serializable-class" - "define-serializable-class*" - "define-signature" - "define-signature-form" - "define-simple-macro" - "define-struct/contract" - "define-struct/exec" - "define-struct/exec:" - "define-struct:" - "define-type" - "define-type-alias" - "define-typed-struct" - "define-typed-struct/exec" - "define-unit" - "define-unit-binding" - "define-unit-from-context" - "define-unit/contract" - "define-unit/new-import-export" - "define-unit/s" - "define-values-for-export" - "define-values/invoke-unit" - "define-values/invoke-unit/infer" - "define/augment" - "define/augment-final" - "define/augride" - "define/contract" - "define/final-prop" - "define/match" - "define/overment" - "define/override" - "define/override-final" - "define/private" - "define/public" - "define/public-final" - "define/pubment" - "define/subexpression-pos-prop" - "define/subexpression-pos-prop/name" - "define/with-syntax" - "define:" - "defined?" - "degrees->radians" - "delay" - "delay/idle" - "delay/name" - "delay/strict" - "delay/sync" - "delay/thread" - "delete-directory" - "delete-directory/files" - "delete-file" - "denominator" - "dict->list" - "dict-can-functional-set?" - "dict-can-remove-keys?" - "dict-clear" - "dict-clear!" - "dict-copy" - "dict-count" - "dict-empty?" - "dict-for-each" - "dict-has-key?" - "dict-implements/c" - "dict-implements?" - "dict-iter-contract" - "dict-iterate-first" - "dict-iterate-key" - "dict-iterate-next" - "dict-iterate-value" - "dict-key-contract" - "dict-keys" - "dict-map" - "dict-mutable?" - "dict-ref" - "dict-ref!" - "dict-remove" - "dict-remove!" - "dict-set" - "dict-set!" - "dict-set*" - "dict-set*!" - "dict-update" - "dict-update!" - "dict-value-contract" - "dict-values" - "dict?" - "directory-exists?" - "directory-list" - "disjoin" - "display" - "display-lines" - "display-lines-to-file" - "display-to-file" - "displayln" - "do-standard-inits" - "do:" - "double-flonum?" - "drop" - "drop-common-prefix" - "drop-right" - "dropf" - "dropf-right" - "dump-memory-stats" - "dup-input-port" - "dup-output-port" - "dynamic->*" - "dynamic-get-field" - "dynamic-object/c" - "dynamic-place" - "dynamic-place*" - "dynamic-require" - "dynamic-require-for-syntax" - "dynamic-send" - "dynamic-set-field!" - "dynamic-wind" - "eighth" - "empty" - "empty-sequence" - "empty-stream" - "empty?" - "environment-variables-copy" - "environment-variables-names" - "environment-variables-ref" - "environment-variables-set!" - "environment-variables?" - "eof" - "eof-evt" - "eof-object?" - "ephemeron-value" - "ephemeron?" - "eprintf" - "eq-contract-val" - "eq-contract?" - "eq-hash-code" - "eq?" - "equal-contract-val" - "equal-contract?" - "equal-hash-code" - "equal-secondary-hash-code" - "equal<%>" - "equal?" - "equal?/recur" - "eqv-hash-code" - "eqv?" - "error" - "error-display-handler" - "error-escape-handler" - "error-print-context-length" - "error-print-source-location" - "error-print-width" - "error-value->string-handler" - "eval" - "eval-jit-enabled" - "eval-syntax" - "even?" - "evt/c" - "evt?" - "exact->inexact" - "exact-ceiling" - "exact-floor" - "exact-integer?" - "exact-nonnegative-integer?" - "exact-positive-integer?" - "exact-round" - "exact-truncate" - "exact?" - "except" - "executable-yield-handler" - "exit" - "exit-handler" - "exn-continuation-marks" - "exn-message" - "exn:break-continuation" - "exn:break:hang-up?" - "exn:break:terminate?" - "exn:break?" - "exn:fail:contract:arity?" - "exn:fail:contract:blame" - "exn:fail:contract:blame-object" - "exn:fail:contract:blame?" - "exn:fail:contract:continuation?" - "exn:fail:contract:divide-by-zero?" - "exn:fail:contract:non-fixnum-result?" - "exn:fail:contract:variable-id" - "exn:fail:contract:variable?" - "exn:fail:contract?" - "exn:fail:filesystem:errno-errno" - "exn:fail:filesystem:errno?" - "exn:fail:filesystem:exists?" - "exn:fail:filesystem:missing-module-path" - "exn:fail:filesystem:missing-module?" - "exn:fail:filesystem:version?" - "exn:fail:filesystem?" - "exn:fail:network:errno-errno" - "exn:fail:network:errno?" - "exn:fail:network?" - "exn:fail:object" - "exn:fail:object?" - "exn:fail:out-of-memory?" - "exn:fail:read-srclocs" - "exn:fail:read:eof?" - "exn:fail:read:non-char?" - "exn:fail:read?" - "exn:fail:syntax-exprs" - "exn:fail:syntax:missing-module-path" - "exn:fail:syntax:missing-module?" - "exn:fail:syntax:unbound?" - "exn:fail:syntax?" - "exn:fail:unsupported?" - "exn:fail:user?" - "exn:fail?" - "exn:misc:match?" - "exn:missing-module-accessor" - "exn:missing-module?" - "exn:srclocs-accessor" - "exn:srclocs?" - "exn?" - "exp" - "expand" - "expand-for-clause" - "expand-once" - "expand-syntax" - "expand-syntax-once" - "expand-syntax-to-top-form" - "expand-to-top-form" - "expand-user-path" - "explode-path" - "export" - "expt" - "extends" - "externalizable<%>" - "failure-cont" - "failure-result/c" - "false" - "false/c" - "false?" - "field" - "field-bound?" - "field-names" - "fifth" - "file->bytes" - "file->bytes-lines" - "file->lines" - "file->list" - "file->string" - "file->value" - "file-exists?" - "file-name-from-path" - "file-or-directory-identity" - "file-or-directory-modify-seconds" - "file-or-directory-permissions" - "file-position" - "file-position*" - "file-size" - "file-stream-buffer-mode" - "file-stream-port?" - "file-truncate" - "filename-extension" - "filesystem-change-evt" - "filesystem-change-evt-cancel" - "filesystem-change-evt?" - "filesystem-root-list" - "filter" - "filter-map" - "filter-not" - "filter-read-input-port" - "find-executable-path" - "find-files" - "find-library-collection-links" - "find-library-collection-paths" - "find-relative-path" - "find-system-path" - "findf" - "first" - "first-or/c" - "fixnum?" - "flat-contract" - "flat-contract-predicate" - "flat-contract-property?" - "flat-contract-with-explanation" - "flat-contract?" - "flat-murec-contract" - "flat-named-contract" - "flat-rec-contract" - "flatten" - "floating-point-bytes->real" - "flonum?" - "floor" - "flush-output" - "fold-files" - "foldl" - "foldr" - "for*/and:" - "for*/async" - "for*/extflvector:" - "for*/first:" - "for*/flvector:" - "for*/fold:" - "for*/hash:" - "for*/hasheq:" - "for*/hasheqv:" - "for*/last:" - "for*/list:" - "for*/lists:" - "for*/mutable-set" - "for*/mutable-seteq" - "for*/mutable-seteqv" - "for*/or:" - "for*/product:" - "for*/set" - "for*/set:" - "for*/seteq" - "for*/seteqv" - "for*/stream" - "for*/sum:" - "for*/vector:" - "for*/weak-set" - "for*/weak-seteq" - "for*/weak-seteqv" - "for*:" - "for-clause-syntax-protect" - "for-each" - "for/and:" - "for/async" - "for/extflvector:" - "for/first:" - "for/flvector:" - "for/fold:" - "for/hash:" - "for/hasheq:" - "for/hasheqv:" - "for/last:" - "for/list:" - "for/lists:" - "for/mutable-set" - "for/mutable-seteq" - "for/mutable-seteqv" - "for/or:" - "for/product:" - "for/set" - "for/set:" - "for/seteq" - "for/seteqv" - "for/stream" - "for/sum:" - "for/vector:" - "for/weak-set" - "for/weak-seteq" - "for/weak-seteqv" - "for:" - "force" - "format" - "format-id" - "format-symbol" - "fourth" - "fprintf" - "free-identifier=?" - "free-label-identifier=?" - "free-template-identifier=?" - "free-transformer-identifier=?" - "fsemaphore-count" - "fsemaphore-post" - "fsemaphore-try-wait?" - "fsemaphore-wait" - "fsemaphore?" - "future" - "future?" - "futures-enabled?" - "gcd" - "gen:dict" - "gen:set" - "gen:stream" - "generate-member-key" - "generate-temporaries" - "generate-temporary" - "generic" - "generic-set?" - "generic?" - "gensym" - "get-field" - "get-output-bytes" - "get-output-string" - "get-preference" - "get/build-late-neg-projection" - "get/build-val-first-projection" - "getenv" - "global-port-print-handler" - "group-by" - "group-execute-bit" - "group-read-bit" - "group-write-bit" - "guard-evt" - "handle-evt" - "handle-evt?" - "has-blame?" - "has-contract?" - "hash" - "hash->list" - "hash-clear" - "hash-clear!" - "hash-copy" - "hash-copy-clear" - "hash-count" - "hash-empty?" - "hash-eq?" - "hash-equal?" - "hash-eqv?" - "hash-for-each" - "hash-has-key?" - "hash-iterate-first" - "hash-iterate-key" - "hash-iterate-key+value" - "hash-iterate-next" - "hash-iterate-pair" - "hash-iterate-value" - "hash-keys" - "hash-keys-subset?" - "hash-map" - "hash-placeholder?" - "hash-ref" - "hash-ref!" - "hash-remove" - "hash-remove!" - "hash-set" - "hash-set!" - "hash-set*" - "hash-set*!" - "hash-update" - "hash-update!" - "hash-values" - "hash-weak?" - "hash/c" - "hash/dc" - "hash?" - "hasheq" - "hasheqv" - "identifier-binding" - "identifier-binding-symbol" - "identifier-label-binding" - "identifier-prune-lexical-context" - "identifier-prune-to-source-module" - "identifier-remove-from-definition-context" - "identifier-template-binding" - "identifier-transformer-binding" - "identifier?" - "identity" - "if/c" - "imag-part" - "immutable?" - "impersonate-box" - "impersonate-channel" - "impersonate-continuation-mark-key" - "impersonate-hash" - "impersonate-hash-set" - "impersonate-procedure" - "impersonate-procedure*" - "impersonate-prompt-tag" - "impersonate-struct" - "impersonate-vector" - "impersonate-vector*" - "impersonator-contract?" - "impersonator-ephemeron" - "impersonator-of?" - "impersonator-prop:application-mark" - "impersonator-prop:blame" - "impersonator-prop:contracted" - "impersonator-property-accessor-procedure?" - "impersonator-property?" - "impersonator?" - "implementation?" - "implementation?/c" - "implies" - "import" - "in-combinations" - "in-cycle" - "in-dict" - "in-dict-keys" - "in-dict-pairs" - "in-dict-values" - "in-immutable-set" - "in-mutable-set" - "in-parallel" - "in-permutations" - "in-sequences" - "in-set" - "in-slice" - "in-stream" - "in-syntax" - "in-values*-sequence" - "in-values-sequence" - "in-weak-set" - "include" - "include-at/relative-to" - "include-at/relative-to/reader" - "include/reader" - "index-of" - "index-where" - "index?" - "indexes-of" - "indexes-where" - "inexact->exact" - "inexact-real?" - "inexact?" - "infinite?" - "inherit" - "inherit-field" - "inherit/inner" - "inherit/super" - "init" - "init-depend" - "init-field" - "init-rest" - "inner" - "input-port-append" - "input-port?" - "inspect" - "inspector-superior?" - "inspector?" - "inst" - "instanceof/c" - "instantiate" - "integer->char" - "integer->integer-bytes" - "integer-bytes->integer" - "integer-in" - "integer-length" - "integer-sqrt" - "integer-sqrt/remainder" - "integer?" - "interactive-command-procedure" - "interactive-command?" - "interface" - "interface*" - "interface->method-names" - "interface-extension?" - "interface?" - "internal-definition-context-apply" - "internal-definition-context-binding-identifiers" - "internal-definition-context-introduce" - "internal-definition-context-seal" - "internal-definition-context?" - "invariant-assertion" - "invoke-unit" - "invoke-unit/infer" - "is-a?" - "is-a?/c" - "keyword->string" - "keyword-apply" - "keywordbytes" - "list->mutable-set" - "list->mutable-seteq" - "list->mutable-seteqv" - "list->set" - "list->seteq" - "list->seteqv" - "list->string" - "list->vector" - "list->weak-set" - "list->weak-seteq" - "list->weak-seteqv" - "list-contract?" - "list-prefix?" - "list-ref" - "list-set" - "list-tail" - "list-update" - "list/c" - "list?" - "listen-port-number?" - "listof" - "load" - "load-extension" - "load-on-demand-enabled" - "load-relative" - "load-relative-extension" - "load/cd" - "load/use-compiled" - "local" - "local-expand" - "local-expand/capture-lifts" - "local-transformer-expand" - "local-transformer-expand/capture-lifts" - "locale-string-encoding" - "log" - "log-all-levels" - "log-level-evt" - "log-level?" - "log-max-level" - "log-message" - "log-receiver?" - "logger-name" - "logger?" - "magnitude" - "make-arity-at-least" - "make-base-empty-namespace" - "make-base-namespace" - "make-bytes" - "make-channel" - "make-chaperone-contract" - "make-continuation-mark-key" - "make-continuation-prompt-tag" - "make-contract" - "make-custodian" - "make-custodian-box" - "make-custom-hash" - "make-custom-hash-types" - "make-custom-set" - "make-custom-set-types" - "make-date" - "make-date*" - "make-derived-parameter" - "make-directory" - "make-directory*" - "make-do-sequence" - "make-empty-namespace" - "make-environment-variables" - "make-ephemeron" - "make-exn" - "make-exn:break" - "make-exn:break:hang-up" - "make-exn:break:terminate" - "make-exn:fail" - "make-exn:fail:contract" - "make-exn:fail:contract:arity" - "make-exn:fail:contract:blame" - "make-exn:fail:contract:continuation" - "make-exn:fail:contract:divide-by-zero" - "make-exn:fail:contract:non-fixnum-result" - "make-exn:fail:contract:variable" - "make-exn:fail:filesystem" - "make-exn:fail:filesystem:errno" - "make-exn:fail:filesystem:exists" - "make-exn:fail:filesystem:missing-module" - "make-exn:fail:filesystem:version" - "make-exn:fail:network" - "make-exn:fail:network:errno" - "make-exn:fail:object" - "make-exn:fail:out-of-memory" - "make-exn:fail:read" - "make-exn:fail:read:eof" - "make-exn:fail:read:non-char" - "make-exn:fail:syntax" - "make-exn:fail:syntax:missing-module" - "make-exn:fail:syntax:unbound" - "make-exn:fail:unsupported" - "make-exn:fail:user" - "make-file-or-directory-link" - "make-flat-contract" - "make-fsemaphore" - "make-generic" - "make-handle-get-preference-locked" - "make-hash" - "make-hash-placeholder" - "make-hasheq" - "make-hasheq-placeholder" - "make-hasheqv" - "make-hasheqv-placeholder" - "make-immutable-custom-hash" - "make-immutable-hash" - "make-immutable-hasheq" - "make-immutable-hasheqv") - "Racket \"builtins\": extra from #lang racket and #lang typed/racket") - -(defconst racket-builtins-2-of-2 - ;; This list was generated using keywords.rkt -- don't edit - ;; individual items here! - '("make-impersonator-property" - "make-input-port" - "make-input-port/read-to-peek" - "make-inspector" - "make-keyword-procedure" - "make-known-char-range-list" - "make-limited-input-port" - "make-list" - "make-lock-file-name" - "make-log-receiver" - "make-logger" - "make-mixin-contract" - "make-mutable-custom-set" - "make-none/c" - "make-object" - "make-output-port" - "make-parameter" - "make-parent-directory*" - "make-phantom-bytes" - "make-pipe" - "make-pipe-with-specials" - "make-placeholder" - "make-plumber" - "make-polar" - "make-predicate" - "make-prefab-struct" - "make-primitive-class" - "make-proj-contract" - "make-pseudo-random-generator" - "make-reader-graph" - "make-readtable" - "make-rectangular" - "make-rename-transformer" - "make-resolved-module-path" - "make-security-guard" - "make-semaphore" - "make-set!-transformer" - "make-shared-bytes" - "make-sibling-inspector" - "make-special-comment" - "make-srcloc" - "make-string" - "make-struct-field-accessor" - "make-struct-field-mutator" - "make-struct-type" - "make-struct-type-property" - "make-syntax-delta-introducer" - "make-syntax-introducer" - "make-temporary-file" - "make-tentative-pretty-print-output-port" - "make-thread-cell" - "make-thread-group" - "make-vector" - "make-weak-box" - "make-weak-custom-hash" - "make-weak-custom-set" - "make-weak-hash" - "make-weak-hasheq" - "make-weak-hasheqv" - "make-will-executor" - "map" - "match" - "match*" - "match*/derived" - "match-...-nesting" - "match-define" - "match-define-values" - "match-equality-test" - "match-expander?" - "match-lambda" - "match-lambda*" - "match-lambda**" - "match-let" - "match-let*" - "match-let*-values" - "match-let-values" - "match-letrec" - "match-letrec-values" - "match/derived" - "match/values" - "matches-arity-exactly?" - "max" - "mcar" - "mcdr" - "mcons" - "member" - "member-name-key" - "member-name-key-hash-code" - "member-name-key=?" - "member-name-key?" - "memf" - "memq" - "memv" - "merge-input" - "method-in-interface?" - "min" - "mixin" - "mixin-contract" - "module->exports" - "module->imports" - "module->indirect-exports" - "module->language-info" - "module->namespace" - "module-compiled-cross-phase-persistent?" - "module-compiled-exports" - "module-compiled-imports" - "module-compiled-indirect-exports" - "module-compiled-language-info" - "module-compiled-name" - "module-compiled-submodules" - "module-declared?" - "module-path-index-join" - "module-path-index-resolve" - "module-path-index-split" - "module-path-index-submodule" - "module-path-index?" - "module-path?" - "module-predefined?" - "module-provide-protected?" - "modulo" - "mpair?" - "mu" - "mutable-set" - "mutable-seteq" - "mutable-seteqv" - "n->th" - "nack-guard-evt" - "namespace-anchor->empty-namespace" - "namespace-anchor->namespace" - "namespace-anchor?" - "namespace-attach-module" - "namespace-attach-module-declaration" - "namespace-base-phase" - "namespace-mapped-symbols" - "namespace-module-identifier" - "namespace-module-registry" - "namespace-require" - "namespace-require/constant" - "namespace-require/copy" - "namespace-require/expansion-time" - "namespace-set-variable-value!" - "namespace-symbol->identifier" - "namespace-syntax-introduce" - "namespace-undefine-variable!" - "namespace-unprotect-module" - "namespace-variable-value" - "namespace?" - "nan?" - "nand" - "natural-number/c" - "natural?" - "negate" - "negative-integer?" - "negative?" - "never-evt" - "new" - "new-∀/c" - "new-∃/c" - "newline" - "ninth" - "non-empty-listof" - "non-empty-string?" - "none/c" - "nonnegative-integer?" - "nonpositive-integer?" - "nor" - "normal-case-path" - "normalize-arity" - "normalize-path" - "normalized-arity?" - "not" - "not/c" - "null" - "null?" - "number->string" - "number?" - "numerator" - "object%" - "object->vector" - "object-contract" - "object-info" - "object-interface" - "object-method-arity-includes?" - "object-name" - "object-or-false=?" - "object/c" - "object=?" - "object?" - "odd?" - "one-of/c" - "only" - "open" - "open-input-bytes" - "open-input-string" - "open-output-bytes" - "open-output-nowhere" - "open-output-string" - "opt-lambda:" - "opt/c" - "or/c" - "order-of-magnitude" - "ormap" - "other-execute-bit" - "other-read-bit" - "other-write-bit" - "output-port?" - "overment" - "overment*" - "override" - "override*" - "override-final" - "override-final*" - "pair?" - "parameter-procedure=?" - "parameter/c" - "parameter?" - "parameterization?" - "parametric->/c" - "parse-command-line" - "parse-leftover->*" - "partition" - "path->bytes" - "path->complete-path" - "path->directory-path" - "path->string" - "path-add-extension" - "path-add-suffix" - "path-convention-type" - "path-element->bytes" - "path-element->string" - "path-element?" - "path-for-some-system?" - "path-get-extension" - "path-has-extension?" - "path-list-string->path-list" - "path-only" - "path-replace-extension" - "path-replace-suffix" - "path-string?" - "pathbytes" - "port->bytes-lines" - "port->lines" - "port->list" - "port->string" - "port-closed-evt" - "port-closed?" - "port-commit-peeked" - "port-count-lines!" - "port-count-lines-enabled" - "port-counts-lines?" - "port-display-handler" - "port-file-identity" - "port-file-unlock" - "port-next-location" - "port-number?" - "port-print-handler" - "port-progress-evt" - "port-provides-progress-evts?" - "port-read-handler" - "port-try-file-lock?" - "port-write-handler" - "port-writes-atomic?" - "port-writes-special?" - "port?" - "positive-integer?" - "positive?" - "pred" - "predicate/c" - "prefab-key->struct-type" - "prefab-key?" - "prefab-struct-key" - "preferences-lock-file-mode" - "prefix" - "pregexp" - "pregexp?" - "pretty-display" - "pretty-format" - "pretty-print" - "pretty-print-.-symbol-without-bars" - "pretty-print-abbreviate-read-macros" - "pretty-print-columns" - "pretty-print-current-style-table" - "pretty-print-depth" - "pretty-print-exact-as-decimal" - "pretty-print-extend-style-table" - "pretty-print-handler" - "pretty-print-newline" - "pretty-print-post-print-hook" - "pretty-print-pre-print-hook" - "pretty-print-print-hook" - "pretty-print-print-line" - "pretty-print-remap-stylable" - "pretty-print-show-inexactness" - "pretty-print-size-hook" - "pretty-print-style-table?" - "pretty-printing" - "pretty-write" - "primitive-closure?" - "primitive-result-arity" - "primitive?" - "print" - "print-as-expression" - "print-boolean-long-form" - "print-box" - "print-graph" - "print-hash-table" - "print-mpair-curly-braces" - "print-pair-curly-braces" - "print-reader-abbreviations" - "print-struct" - "print-syntax-width" - "print-unreadable" - "print-vector-length" - "printable/c" - "printable<%>" - "printf" - "println" - "private" - "private*" - "procedure->method" - "procedure-arity" - "procedure-arity-includes/c" - "procedure-arity-includes?" - "procedure-arity?" - "procedure-closure-contents-eq?" - "procedure-extract-target" - "procedure-impersonator*?" - "procedure-keywords" - "procedure-reduce-arity" - "procedure-reduce-keyword-arity" - "procedure-rename" - "procedure-result-arity" - "procedure-specialize" - "procedure-struct-type?" - "procedure?" - "process" - "process*" - "process*/ports" - "process/ports" - "processor-count" - "progress-evt?" - "promise-forced?" - "promise-running?" - "promise/c" - "promise/name?" - "promise?" - "prompt-tag/c" - "prop:arity-string" - "prop:arrow-contract" - "prop:arrow-contract-get-info" - "prop:arrow-contract?" - "prop:authentic" - "prop:blame" - "prop:chaperone-contract" - "prop:checked-procedure" - "prop:contract" - "prop:contracted" - "prop:custom-print-quotable" - "prop:custom-write" - "prop:dict" - "prop:dict/contract" - "prop:equal+hash" - "prop:evt" - "prop:exn:missing-module" - "prop:exn:srclocs" - "prop:expansion-contexts" - "prop:flat-contract" - "prop:impersonator-of" - "prop:input-port" - "prop:legacy-match-expander" - "prop:liberal-define-context" - "prop:match-expander" - "prop:object-name" - "prop:opt-chaperone-contract" - "prop:opt-chaperone-contract-get-test" - "prop:opt-chaperone-contract?" - "prop:orc-contract" - "prop:orc-contract-get-subcontracts" - "prop:orc-contract?" - "prop:output-port" - "prop:place-location" - "prop:procedure" - "prop:recursive-contract" - "prop:recursive-contract-unroll" - "prop:recursive-contract?" - "prop:rename-transformer" - "prop:sequence" - "prop:set!-transformer" - "prop:stream" - "proper-subset?" - "provide-signature-elements" - "provide/contract" - "provide:" - "pseudo-random-generator->vector" - "pseudo-random-generator-vector?" - "pseudo-random-generator?" - "public" - "public*" - "public-final" - "public-final*" - "pubment" - "pubment*" - "put-preferences" - "putenv" - "quotient" - "quotient/remainder" - "radians->degrees" - "raise" - "raise-argument-error" - "raise-arguments-error" - "raise-arity-error" - "raise-blame-error" - "raise-contract-error" - "raise-mismatch-error" - "raise-not-cons-blame-error" - "raise-range-error" - "raise-result-error" - "raise-syntax-error" - "raise-type-error" - "raise-user-error" - "random" - "random-seed" - "range" - "rational?" - "rationalize" - "read" - "read-accept-bar-quote" - "read-accept-box" - "read-accept-compiled" - "read-accept-dot" - "read-accept-graph" - "read-accept-infix-dot" - "read-accept-lang" - "read-accept-quasiquote" - "read-accept-reader" - "read-byte" - "read-byte-or-special" - "read-bytes" - "read-bytes!" - "read-bytes!-evt" - "read-bytes-avail!" - "read-bytes-avail!*" - "read-bytes-avail!-evt" - "read-bytes-avail!/enable-break" - "read-bytes-evt" - "read-bytes-line" - "read-bytes-line-evt" - "read-case-sensitive" - "read-cdot" - "read-char" - "read-char-or-special" - "read-curly-brace-as-paren" - "read-curly-brace-with-tag" - "read-decimal-as-inexact" - "read-eval-print-loop" - "read-language" - "read-line" - "read-line-evt" - "read-on-demand-source" - "read-square-bracket-as-paren" - "read-square-bracket-with-tag" - "read-string" - "read-string!" - "read-string!-evt" - "read-string-evt" - "read-syntax" - "read-syntax/recursive" - "read/recursive" - "readtable-mapping" - "readtable?" - "real->decimal-string" - "real->double-flonum" - "real->floating-point-bytes" - "real->single-flonum" - "real-in" - "real-part" - "real?" - "recontract-out" - "record-disappeared-uses" - "recursive-contract" - "reencode-input-port" - "reencode-output-port" - "regexp" - "regexp-match" - "regexp-match-evt" - "regexp-match-exact?" - "regexp-match-peek" - "regexp-match-peek-immediate" - "regexp-match-peek-positions" - "regexp-match-peek-positions-immediate" - "regexp-match-peek-positions-immediate/end" - "regexp-match-peek-positions/end" - "regexp-match-positions" - "regexp-match-positions/end" - "regexp-match/end" - "regexp-match?" - "regexp-max-lookbehind" - "regexp-quote" - "regexp-replace" - "regexp-replace*" - "regexp-replace-quote" - "regexp-replaces" - "regexp-split" - "regexp-try-match" - "regexp?" - "relative-path?" - "relocate-input-port" - "relocate-output-port" - "remainder" - "remf" - "remf*" - "remove" - "remove*" - "remove-duplicates" - "remq" - "remq*" - "remv" - "remv*" - "rename" - "rename-contract" - "rename-file-or-directory" - "rename-inner" - "rename-super" - "rename-transformer-target" - "rename-transformer?" - "replace-evt" - "require-typed-struct" - "require-typed-struct/provide" - "require/opaque-type" - "require/typed" - "require/typed/provide" - "reroot-path" - "resolve-path" - "resolved-module-path-name" - "resolved-module-path?" - "rest" - "reverse" - "round" - "row-inst" - "second" - "seconds->date" - "security-guard?" - "semaphore-peek-evt" - "semaphore-peek-evt?" - "semaphore-post" - "semaphore-try-wait?" - "semaphore-wait" - "semaphore-wait/enable-break" - "semaphore?" - "send" - "send*" - "send+" - "send-generic" - "send/apply" - "send/keyword-apply" - "sequence->list" - "sequence->stream" - "sequence-add-between" - "sequence-andmap" - "sequence-append" - "sequence-count" - "sequence-filter" - "sequence-fold" - "sequence-for-each" - "sequence-generate" - "sequence-generate*" - "sequence-length" - "sequence-map" - "sequence-ormap" - "sequence-ref" - "sequence-tail" - "sequence/c" - "sequence?" - "set" - "set!-transformer-procedure" - "set!-transformer?" - "set->list" - "set->stream" - "set-add" - "set-add!" - "set-box!" - "set-clear" - "set-clear!" - "set-copy" - "set-copy-clear" - "set-count" - "set-empty?" - "set-eq?" - "set-equal?" - "set-eqv?" - "set-field!" - "set-first" - "set-for-each" - "set-implements/c" - "set-implements?" - "set-intersect" - "set-intersect!" - "set-map" - "set-mcar!" - "set-mcdr!" - "set-member?" - "set-mutable?" - "set-phantom-bytes!" - "set-port-next-location!" - "set-remove" - "set-remove!" - "set-rest" - "set-subtract" - "set-subtract!" - "set-symmetric-difference" - "set-symmetric-difference!" - "set-union" - "set-union!" - "set-weak?" - "set/c" - "set=?" - "set?" - "seteq" - "seteqv" - "seventh" - "sgn" - "shared" - "shared-bytes" - "shell-execute" - "shrink-path-wrt" - "shuffle" - "simple-form-path" - "simplify-path" - "sin" - "single-flonum?" - "sinh" - "sixth" - "skip-projection-wrapper?" - "sleep" - "some-system-path->string" - "special-comment-value" - "special-comment?" - "special-filter-input-port" - "split-at" - "split-at-right" - "split-common-prefix" - "split-path" - "splitf-at" - "splitf-at-right" - "sqr" - "sqrt" - "srcloc->string" - "srcloc-column" - "srcloc-line" - "srcloc-position" - "srcloc-source" - "srcloc-span" - "srcloc?" - "stop-after" - "stop-before" - "stream" - "stream*" - "stream->list" - "stream-add-between" - "stream-andmap" - "stream-append" - "stream-cons" - "stream-count" - "stream-empty?" - "stream-filter" - "stream-first" - "stream-fold" - "stream-for-each" - "stream-length" - "stream-map" - "stream-ormap" - "stream-ref" - "stream-rest" - "stream-tail" - "stream/c" - "stream?" - "string" - "string->bytes/latin-1" - "string->bytes/locale" - "string->bytes/utf-8" - "string->immutable-string" - "string->keyword" - "string->list" - "string->number" - "string->path" - "string->path-element" - "string->some-system-path" - "string->symbol" - "string->uninterned-symbol" - "string->unreadable-symbol" - "string-append" - "string-append*" - "string-ci<=?" - "string-ci=?" - "string-ci>?" - "string-contains?" - "string-copy" - "string-copy!" - "string-downcase" - "string-environment-variable-name?" - "string-fill!" - "string-foldcase" - "string-join" - "string-len/c" - "string-length" - "string-locale-ci?" - "string-locale-downcase" - "string-locale-upcase" - "string-locale?" - "string-no-nuls?" - "string-normalize-nfc" - "string-normalize-nfd" - "string-normalize-nfkc" - "string-normalize-nfkd" - "string-normalize-spaces" - "string-port?" - "string-prefix?" - "string-ref" - "string-replace" - "string-set!" - "string-split" - "string-suffix?" - "string-titlecase" - "string-trim" - "string-upcase" - "string-utf-8-length" - "string<=?" - "string=?" - "string>?" - "string?" - "struct*" - "struct->vector" - "struct-accessor-procedure?" - "struct-constructor-procedure?" - "struct-info" - "struct-mutator-procedure?" - "struct-predicate-procedure?" - "struct-type-info" - "struct-type-make-constructor" - "struct-type-make-predicate" - "struct-type-property-accessor-procedure?" - "struct-type-property/c" - "struct-type-property?" - "struct-type?" - "struct/c" - "struct/ctc" - "struct/dc" - "struct:" - "struct:arity-at-least" - "struct:arrow-contract-info" - "struct:date" - "struct:date*" - "struct:exn" - "struct:exn:break" - "struct:exn:break:hang-up" - "struct:exn:break:terminate" - "struct:exn:fail" - "struct:exn:fail:contract" - "struct:exn:fail:contract:arity" - "struct:exn:fail:contract:blame" - "struct:exn:fail:contract:continuation" - "struct:exn:fail:contract:divide-by-zero" - "struct:exn:fail:contract:non-fixnum-result" - "struct:exn:fail:contract:variable" - "struct:exn:fail:filesystem" - "struct:exn:fail:filesystem:errno" - "struct:exn:fail:filesystem:exists" - "struct:exn:fail:filesystem:missing-module" - "struct:exn:fail:filesystem:version" - "struct:exn:fail:network" - "struct:exn:fail:network:errno" - "struct:exn:fail:object" - "struct:exn:fail:out-of-memory" - "struct:exn:fail:read" - "struct:exn:fail:read:eof" - "struct:exn:fail:read:non-char" - "struct:exn:fail:syntax" - "struct:exn:fail:syntax:missing-module" - "struct:exn:fail:syntax:unbound" - "struct:exn:fail:unsupported" - "struct:exn:fail:user" - "struct:srcloc" - "struct:wrapped-extra-arg-arrow" - "struct?" - "sub1" - "subbytes" - "subclass?" - "subclass?/c" - "subprocess" - "subprocess-group-enabled" - "subprocess-kill" - "subprocess-pid" - "subprocess-status" - "subprocess-wait" - "subprocess?" - "subset?" - "substring" - "suggest/c" - "super" - "super-instantiate" - "super-make-object" - "super-new" - "symbol->string" - "symbol-interned?" - "symbol-unreadable?" - "symboldatum" - "syntax->list" - "syntax-arm" - "syntax-column" - "syntax-debug-info" - "syntax-disarm" - "syntax-e" - "syntax-line" - "syntax-local-bind-syntaxes" - "syntax-local-certifier" - "syntax-local-context" - "syntax-local-eval" - "syntax-local-expand-expression" - "syntax-local-get-shadower" - "syntax-local-identifier-as-binding" - "syntax-local-introduce" - "syntax-local-lift-context" - "syntax-local-lift-expression" - "syntax-local-lift-module" - "syntax-local-lift-module-end-declaration" - "syntax-local-lift-provide" - "syntax-local-lift-require" - "syntax-local-lift-values-expression" - "syntax-local-make-definition-context" - "syntax-local-make-delta-introducer" - "syntax-local-match-introduce" - "syntax-local-module-defined-identifiers" - "syntax-local-module-exports" - "syntax-local-module-required-identifiers" - "syntax-local-name" - "syntax-local-phase-level" - "syntax-local-submodules" - "syntax-local-transforming-module-provides?" - "syntax-local-value" - "syntax-local-value/immediate" - "syntax-local-value/record" - "syntax-original?" - "syntax-parse" - "syntax-parser" - "syntax-pattern-variable?" - "syntax-position" - "syntax-property" - "syntax-property-preserved?" - "syntax-property-symbol-keys" - "syntax-protect" - "syntax-rearm" - "syntax-recertify" - "syntax-shift-phase-level" - "syntax-source" - "syntax-source-module" - "syntax-span" - "syntax-taint" - "syntax-tainted?" - "syntax-track-origin" - "syntax-transforming-module-expression?" - "syntax-transforming-with-lifts?" - "syntax-transforming?" - "syntax/c" - "syntax?" - "system" - "system*" - "system*/exit-code" - "system-big-endian?" - "system-idle-evt" - "system-language+country" - "system-library-subpath" - "system-path-convention-type" - "system-type" - "system/exit-code" - "tag" - "tail-marks-match?" - "take" - "take-common-prefix" - "take-right" - "takef" - "takef-right" - "tan" - "tanh" - "tcp-abandon-port" - "tcp-accept" - "tcp-accept-evt" - "tcp-accept-ready?" - "tcp-accept/enable-break" - "tcp-addresses" - "tcp-close" - "tcp-connect" - "tcp-connect/enable-break" - "tcp-listen" - "tcp-listener?" - "tcp-port?" - "tentative-pretty-print-port-cancel" - "tentative-pretty-print-port-transfer" - "tenth" - "terminal-port?" - "the-unsupplied-arg" - "third" - "this" - "this%" - "thread" - "thread-cell-ref" - "thread-cell-set!" - "thread-cell-values?" - "thread-cell?" - "thread-dead-evt" - "thread-dead?" - "thread-group?" - "thread-receive" - "thread-receive-evt" - "thread-resume" - "thread-resume-evt" - "thread-rewind-receive" - "thread-running?" - "thread-send" - "thread-suspend" - "thread-suspend-evt" - "thread-try-receive" - "thread-wait" - "thread/suspend-to-kill" - "thread?" - "thunk" - "thunk*" - "time-apply" - "touch" - "transplant-input-port" - "transplant-output-port" - "true" - "truncate" - "typecheck-fail" - "udp-addresses" - "udp-bind!" - "udp-bound?" - "udp-close" - "udp-connect!" - "udp-connected?" - "udp-multicast-interface" - "udp-multicast-join-group!" - "udp-multicast-leave-group!" - "udp-multicast-loopback?" - "udp-multicast-set-interface!" - "udp-multicast-set-loopback!" - "udp-multicast-set-ttl!" - "udp-multicast-ttl" - "udp-open-socket" - "udp-receive!" - "udp-receive!*" - "udp-receive!-evt" - "udp-receive!/enable-break" - "udp-receive-ready-evt" - "udp-send" - "udp-send*" - "udp-send-evt" - "udp-send-ready-evt" - "udp-send-to" - "udp-send-to*" - "udp-send-to-evt" - "udp-send-to/enable-break" - "udp-send/enable-break" - "udp?" - "unbox" - "uncaught-exception-handler" - "unconstrained-domain->" - "unit" - "unit-from-context" - "unit/c" - "unit/new-import-export" - "unit/s" - "unit?" - "unspecified-dom" - "unsupplied-arg?" - "use-collection-link-paths" - "use-compiled-file-check" - "use-compiled-file-paths" - "use-user-specific-search-paths" - "user-execute-bit" - "user-read-bit" - "user-write-bit" - "value-blame" - "value-contract" - "values" - "values/drop" - "variable-reference->empty-namespace" - "variable-reference->module-base-phase" - "variable-reference->module-declaration-inspector" - "variable-reference->module-path-index" - "variable-reference->module-source" - "variable-reference->namespace" - "variable-reference->phase" - "variable-reference->resolved-module-path" - "variable-reference-constant?" - "variable-reference?" - "vector" - "vector->immutable-vector" - "vector->list" - "vector->pseudo-random-generator" - "vector->pseudo-random-generator!" - "vector->values" - "vector-append" - "vector-argmax" - "vector-argmin" - "vector-copy" - "vector-copy!" - "vector-count" - "vector-drop" - "vector-drop-right" - "vector-fill!" - "vector-filter" - "vector-filter-not" - "vector-immutable" - "vector-immutable/c" - "vector-immutableof" - "vector-length" - "vector-map" - "vector-map!" - "vector-member" - "vector-memq" - "vector-memv" - "vector-ref" - "vector-set!" - "vector-set*!" - "vector-set-performance-stats!" - "vector-sort" - "vector-sort!" - "vector-split-at" - "vector-split-at-right" - "vector-take" - "vector-take-right" - "vector/c" - "vector?" - "vectorof" - "version" - "void" - "void?" - "weak-box-value" - "weak-box?" - "weak-set" - "weak-seteq" - "weak-seteqv" - "will-execute" - "will-executor?" - "will-register" - "will-try-execute" - "with-asserts" - "with-contract" - "with-contract-continuation-mark" - "with-disappeared-uses" - "with-input-from-bytes" - "with-input-from-string" - "with-method" - "with-output-to-bytes" - "with-output-to-string" - "with-syntax*" - "with-type" - "would-be-future" - "wrap-evt" - "wrapped-extra-arg-arrow" - "wrapped-extra-arg-arrow-extra-neg-party-argument" - "wrapped-extra-arg-arrow-real-func" - "wrapped-extra-arg-arrow?" - "writable<%>" - "write" - "write-byte" - "write-bytes" - "write-bytes-avail" - "write-bytes-avail*" - "write-bytes-avail-evt" - "write-bytes-avail/enable-break" - "write-char" - "write-special" - "write-special-avail*" - "write-special-evt" - "write-string" - "write-to-file" - "writeln" - "wrong-syntax" - "xor" - "zero?" - "~.a" - "~.s" - "~.v" - "~a" - "~e" - "~r" - "~s" - "~v" - "λ:" - "→" - "∀" - "∩") - "Racket \"builtins\": extra from #lang racket and #lang typed/racket") - -(provide 'racket-keywords-and-builtins) - -;; racket-keywords-and-builtins.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-keywords-and-builtins.elc b/elpa/racket-mode-20200417.1741/racket-keywords-and-builtins.elc deleted file mode 100644 index 2423b7ca79a85cd19adbf10f7ff1d7affe44fe60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50837 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 diff --git a/elpa/racket-mode-20200417.1741/racket-logger.el b/elpa/racket-mode-20200417.1741/racket-logger.el deleted file mode 100644 index 9b806c90..00000000 --- a/elpa/racket-mode-20200417.1741/racket-logger.el +++ /dev/null @@ -1,263 +0,0 @@ -;;; racket-logger.el -*- lexical-binding: t; -*- - -;; Copyright (c) 2013-2016 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'easymenu) -(require 'rx) -(require 'racket-custom) -(require 'racket-repl) - -;; Need to define this before racket-logger-mode -(defvar racket-logger-mode-map - (racket--easy-keymap-define - '(("l" racket-logger-topic-level) - ("w" toggle-truncate-lines) - ("n" racket-logger-next-item) - ("p" racket-logger-previous-item) - ("g" racket-logger-clear) - ("x" racket-logger-exit) - ("C-c C-z" racket-repl)))) - -(easy-menu-define racket-logger-mode-menu racket-logger-mode-map - "Menu for Racket logger mode." - '("Racket" - ["Configure Topic and Level" racket-logger-topic-level] - ["Toggle Truncate Lines" toggle-truncate-lines] - "---" - ["Switch to REPL" racket-repl] - "---" - ["Clear and Reconnect" racket-logger-clear] - ["Exit Logger" racket-logger-exit])) - -(defconst racket-logger-font-lock-keywords - (eval-when-compile - `((,#'racket--font-lock-config . racket-logger-config-face) - (,(rx bol "[ fatal]") . racket-logger-fatal-face) - (,(rx bol "[ error]") . racket-logger-error-face) - (,(rx bol "[warning]") . racket-logger-warning-face) - (,(rx bol "[ info]") . racket-logger-info-face) - (,(rx bol "[ debug]") . racket-logger-debug-face) - (,(rx bol ?\[ (+? anything) ?\] space - (group (+? anything) ?:) space) - 1 racket-logger-topic-face)))) - -(defconst racket-logger--print-config-prefix - "racket-logger-config:\n") - -(defun racket--font-lock-config (limit) - "Handle multi-line font-lock of the configuration info." - (ignore-errors - (when (re-search-forward (concat "^" racket-logger--print-config-prefix) limit t) - (let ((md (match-data))) - (goto-char (match-end 0)) - (forward-sexp 1) - (setf (elt md 1) (point)) ;; set (match-end 0) - (set-match-data md) - t)))) - -(define-derived-mode racket-logger-mode special-mode "Racket-Logger" - "Major mode for Racket logger output. -\\ - -The customization variable `racket-logger-config' determines the -levels for topics. During a session you may change topic levels -using `racket-logger-topic-level'. - -For more information see: - - -\\{racket-logger-mode-map} -" - (setq-local font-lock-defaults (list racket-logger-font-lock-keywords)) - (setq-local truncate-lines t)) - -(defvar racket-logger--buffer-name "*Racket Logger*") -(defvar racket-logger--process nil) -(defvar racket-logger--connect-timeout 3) - -(defun racket-logger--connect () - (unless racket-logger--process - (with-temp-message "Connecting to logger process..." - (with-timeout (racket-logger--connect-timeout - (error "Could not connect; try `racket-run' first")) - (while (not racket-logger--process) - (condition-case () - (setq racket-logger--process - (let ((process-connection-type nil)) ;use pipe not pty - (open-network-stream "racket-logger" - (get-buffer-create racket-logger--buffer-name) - "127.0.0.1" - (1+ racket-command-port)))) - (error (sit-for 0.1))))) - (process-send-string racket-logger--process - (format "%S\n" racket--cmd-auth)) - (racket-logger--activate-config) - (set-process-sentinel racket-logger--process - #'racket-logger--process-sentinel)))) - -(defun racket-logger--process-sentinel (proc change) - (funcall (process-filter proc) proc change) ;display in buffer - (unless (memq (process-status proc) '(run open connect)) - (setq racket-logger--process nil))) - -(defun racket-logger--disconnect () - (when racket-logger--process - (with-temp-message "Disconnecting from logger process..." - (set-process-sentinel racket-logger--process (lambda (_p _c))) - (delete-process racket-logger--process) - (setq racket-logger--process nil)))) - -(defun racket-logger--activate-config () - "Send config to Racket process, and, display it in the buffer." - (process-send-string racket-logger--process - (format "%S" racket-logger-config)) - (funcall (process-filter racket-logger--process) - racket-logger--process - (propertize (concat racket-logger--print-config-prefix - (pp-to-string racket-logger-config)) - 'font-lock-multiline t))) - -(defun racket-logger--set (topic level) - (unless (symbolp topic) (error "TOPIC must be symbolp")) - (unless (symbolp level) (error "LEVEL must be symbolp")) - (pcase (assq topic racket-logger-config) - (`() (add-to-list 'racket-logger-config (cons topic level))) - (v (setcdr v level))) - (racket-logger--activate-config)) - -(defun racket-logger--unset (topic) - (unless (symbolp topic) (error "TOPIC must be symbolp")) - (when (eq topic '*) - (user-error "Cannot unset the level for the '* topic")) - (setq racket-logger-config - (assq-delete-all topic racket-logger-config)) - (racket-logger--activate-config)) - -(defun racket-logger--topics () - "Effectively (sort (dict-keys racket-logger-config))." - (sort (mapcar (lambda (x) (format "%s" (car x))) - racket-logger-config) - #'string<)) - -(defun racket-logger--topic-level (topic not-found) - "Effectively (dict-ref racket-logger-config topic not-found)." - (or (cdr (assq topic racket-logger-config)) - not-found)) - -;;; commands - -(defun racket-logger () - "Create the `racket-logger-mode' buffer and connect to logger output. - -If the `racket-repl-mode' buffer is displayed in a window, split -that window and put the logger in the bottom window. Otherwise, -use `pop-to-buffer'." - (interactive) - ;; Create buffer if necessary - (unless (get-buffer racket-logger--buffer-name) - (with-current-buffer (get-buffer-create racket-logger--buffer-name) - (racket-logger-mode)) - (racket-logger--connect)) - ;; Give it a window if necessary - (unless (get-buffer-window racket-logger--buffer-name) - (pcase (get-buffer-window racket-repl-buffer-name) - (`() (pop-to-buffer (get-buffer racket-logger--buffer-name))) - (win (set-window-buffer (split-window win) - (get-buffer racket-logger--buffer-name))))) - ;; Select the window - (select-window (get-buffer-window racket-logger--buffer-name))) - -(defun racket-logger-exit () - "Disconnect, kill the buffer, and delete the window." - (interactive) - (when (y-or-n-p "Disconnect and kill buffer? ") - (racket-logger--disconnect) - (kill-buffer) - (delete-window))) - -(defun racket-logger-clear () - "Clear the buffer and reconnect." - (interactive) - (when (y-or-n-p "Clear buffer and reconnect? ") - (let ((inhibit-read-only t)) - (delete-region (point-min) (point-max))) - (racket-logger--disconnect) - (racket-logger--connect))) - -(defconst racket-logger--item-rx - (rx bol ?\[ (0+ space) (or "fatal" "error" "warning" "info" "debug") ?\] space)) - -(defun racket-logger-next-item (&optional count) - "Move point N items forward. - -An \"item\" is a line starting with a log level in brackets. - -Interactively, N is the numeric prefix argument. -If N is omitted or nil, move point 1 item forward." - (interactive "P") - (forward-char 1) - (if (re-search-forward racket-logger--item-rx nil t count) - (beginning-of-line) - (backward-char 1))) - -(defun racket-logger-previous-item (&optional count) - "Move point N items backward. - -An \"item\" is a line starting with a log level in brackets. - -Interactively, N is the numeric prefix argument. -If N is omitted or nil, move point 1 item backward." - (interactive "P") - (re-search-backward racket-logger--item-rx nil t count)) - -(defun racket-logger-topic-level () - "Set or unset the level for a topic. - -For convenience, input choices using `ido-completing-read'. - -The topic labeled \"*\" is the level to use for all topics not -specifically assigned a level. - -The level choice \"*\" means the topic will no longer have its -own level, therefore will follow the level specified for the -\"*\" topic." - (interactive) - (let* ((topic (ido-completing-read - "Topic: " - (racket-logger--topics))) - (topic (pcase topic - ("" "*") - (v v))) - (topic (intern topic)) - (levels (list "fatal" "error" "warning" "info" "debug")) - (levels (if (eq topic '*) levels (cons "*" levels))) - (level (ido-completing-read - (format "Level for topic `%s': " topic) - levels - nil t nil nil - (format "%s" (racket-logger--topic-level topic "*")))) - (level (pcase level - ("" nil) - ("*" nil) - (v (intern v))))) - (if level - (racket-logger--set topic level) - (racket-logger--unset topic)))) - -(provide 'racket-logger) - -;;; racket-logger.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-logger.elc b/elpa/racket-mode-20200417.1741/racket-logger.elc deleted file mode 100644 index aaf4541ab5444adfda149b8bd0017ee243497d4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10966 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 | test-->>∃ (racket/redex) | -| vdash | ⊢ | - -To see a table of all key sequences use \"M-x -describe-input-method racket-unicode\". - -If you want to add your own mappings to the \"racket-unicode\" -input method, you may add code like the following example in your -Emacs init file: - -#+BEGIN_SRC elisp - ;; Either (require 'racket-mode) here, or, if you use - ;; use-package, put the code below in the :config section. - (with-temp-buffer - (racket-unicode-input-method-enable) - (set-input-method \"racket-unicode\") - (let ((quail-current-package (assoc \"racket-unicode\" - quail-package-alist))) - (quail-define-rules ((append . t)) - (\"^o\" [\"áµ’\"])))) -#+END_SRC - -If you don’t like the highlighting of partially matching tokens you -can turn it off by setting `input-method-highlight-flag' to nil. - -\(fn)" t nil) - -;;;*** - -;;;### (autoloads nil "racket-util" "racket-util.el" (0 0 0 0)) -;;; Generated autoloads from racket-util.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "racket-util" '("racket--"))) - -;;;*** - -;;;### (autoloads nil "racket-visit" "racket-visit.el" (0 0 0 0)) -;;; Generated autoloads from racket-visit.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "racket-visit" '("racket-"))) - -;;;*** - -;;;### (autoloads nil "racket-wsl" "racket-wsl.el" (0 0 0 0)) -;;; Generated autoloads from racket-wsl.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "racket-wsl" '("racket-"))) - -;;;*** - -;;;### (autoloads nil "racket-xp" "racket-xp.el" (0 0 0 0)) -;;; Generated autoloads from racket-xp.el - -(autoload 'racket-xp-mode "racket-xp" "\ -A minor mode that analyzes expanded code to explain and explore. - -This minor mode is an optional enhancement to `racket-mode' edit -buffers. Like any minor mode, you can turn it on or off for a -specific buffer. If you always want to use it, put the following -code in your Emacs init file: - -#+BEGIN_SRC elisp - (require 'racket-xp) - (add-hook 'racket-mode-hook #'racket-xp-mode) -#+END_SRC - -Note: This mode won't do anything unless/until the Racket Mode -back end is running. It will try to start the back end -automatically. You do /not/ need to `racket-run' the buffer you -are editing. - -This mode uses the drracket/check-syntax package to analyze -fully-expanded programs, without needing to evaluate a.k.a. -\"run\" them. The resulting analysis provides information for: - -- Visually annotating bindings -- local or imported definitions - and references to them. - -- Completion candidates. - -- Defintions' source and documentation. - -When point is on a definition or use, related items are -highlighted using `racket-xp-def-face' and `racket-xp-use-face' --- instead of drawing arrows as in Dr Racket. Information is -displayed using the function(s) in the hook variable -`racket-show-functions'; it is also available when hovering the -mouse cursor. Note: If you find these features too distracting -and/or slow, you may disable `cursor-sensor-mode'. The remaining -features discussed below will still work. - -You may also use commands to navigate among a definition and its -uses, or to rename a local definitions and all its uses. - -In the following little example, not only does -drracket/check-syntax distinguish the various \"x\" bindings, it -understands the two different imports of \"define\": - -#+BEGIN_SRC racket - #lang racket/base - (define x 1) - x - (let ([x x]) - (+ x 1)) - (module m typed/racket/base - (define x 2) - x) -#+END_SRC - -The function `racket-xp-complete-at-point' is added to the -variable `completion-at-point-functions'. Note that in this case, -it is not smart about submodules; identifiers are assumed to be -definitions from the file's module or its imports. In addition to -supplying completion candidates, it supports the -\":company-location\" property to inspect the definition of a -candidate and the \":company-doc-buffer\" property to view its -documentation. - -When you edit the buffer, existing annotations are retained; -their positions are updated to reflect the edit. Annotations for -new or deleted text are not requested until after -`racket-xp-after-change-refresh-delay' seconds. The request is -made asynchronously so that Emacs will not block -- for -moderately complex source files, it can take some seconds simply -to fully expand them, as well as a little more time for the -drracket/check-syntax analysis. When the results are ready, all -annotations for the buffer are completely refreshed. - -You may also set `racket-xp-after-change-refresh-delay' to nil -and use the `racket-xp-annotate' command manually. - -The mode line changes to reflect the current status of -annotations, and whether or not you had a syntax error. - -If you have one or more syntax errors, `racket-xp-next-error' and -`racket-xp-previous-error' to navigate among them. Although most -languages will stop after the first syntax error, some like Typed -Racket will try to collect and report multiple errors. - -Tip: This mode follows the convention that a minor mode may only -use a prefix key consisting of \"C-c\" followed by a punctuation -key. As a result, `racket-xp-control-c-hash-keymap' is bound to -\"C-c #\" by default. Although you might find this awkward to -type, remember that as an Emacs user, you are free to bind this -map to a more convenient prefix, and/or bind any individual -commands directly to whatever keys you prefer. - -\\{racket-xp-mode-map} - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "racket-xp" '("racket-"))) - -;;;*** - -;;;### (autoloads nil "racket-xp-complete" "racket-xp-complete.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from racket-xp-complete.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "racket-xp-complete" '("racket-"))) - -;;;*** - -;;;### (autoloads nil nil ("racket-mode-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; racket-mode-autoloads.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-mode-pkg.el b/elpa/racket-mode-20200417.1741/racket-mode-pkg.el deleted file mode 100644 index 34ceeb18..00000000 --- a/elpa/racket-mode-20200417.1741/racket-mode-pkg.el +++ /dev/null @@ -1,12 +0,0 @@ -(define-package "racket-mode" "20200417.1741" "Major mode for Racket language." - '((emacs "25.1") - (faceup "0.0.2") - (pos-tip "20191127.1028")) - :authors - '(("Greg Hendershott")) - :maintainer - '("Greg Hendershott") - :url "https://www.racket-mode.com/") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/racket-mode-20200417.1741/racket-mode.el b/elpa/racket-mode-20200417.1741/racket-mode.el deleted file mode 100644 index 8adcb1cb..00000000 --- a/elpa/racket-mode-20200417.1741/racket-mode.el +++ /dev/null @@ -1,212 +0,0 @@ -;;; racket-mode.el --- Major mode for Racket language. - -;; Copyright (c) 2013-2020 by Greg Hendershott. - -;; Package: racket-mode -;; Package-Requires: ((emacs "25.1") (faceup "0.0.2") (pos-tip "20191127.1028")) -;; Author: Greg Hendershott -;; URL: https://www.racket-mode.com/ - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -;;; Commentary: - -;; Goals: -;; - Focus on Racket lang. -;; - Follow DrRacket concepts where applicable. -;; - Thorough font-lock and indent. -;; - Compatible with Emacs 25.1+ and Racket 6.9+. -;; -;; Details: https://github.com/greghendershott/racket-mode - -;;; Code: - -(require 'racket-edit) -(require 'racket-xp) -(require 'racket-custom) -(require 'racket-smart-open) -(require 'racket-imenu) -(require 'racket-profile) -(require 'racket-logger) -(require 'racket-stepper) -(require 'racket-repl) -(require 'racket-repl-buffer-name) -(require 'racket-collection) -(require 'racket-bug-report) -(require 'racket-util) -(require 'easymenu) - -(defvar racket-mode-map - (racket--easy-keymap-define - '((("C-c C-c" - "C-c C-k") racket-run-module-at-point) - ("C-c C-z" racket-repl) - ("" racket-run-and-switch-to-repl) - ("M-C-" racket-racket) - ("C-" racket-test) - ("C-c C-t" racket-test) - ("C-c C-l" racket-logger) - ("C-c C-o" racket-profile) - ("M-C-x" racket-send-definition) - ("C-x C-e" racket-send-last-sexp) - ("C-c C-r" racket-send-region) - ("C-c C-e f" racket-expand-file) - ("C-c C-e x" racket-expand-definition) - ("C-c C-e e" racket-expand-last-sexp) - ("C-c C-e r" racket-expand-region) - ("C-c C-x C-f" racket-open-require-path) - ("TAB" indent-for-tab-command) - ("M-C-u" racket-backward-up-list) - ("C-c C-p" racket-cycle-paren-shapes) - ("M-C-y" racket-insert-lambda) - ("M-C-." racket-visit-module) - ("M-," racket-unvisit) - ("C-c C-f" racket-fold-all-tests) - ("C-c C-u" racket-unfold-all-tests) - ((")" "]" "}") racket-insert-closing))) - "Keymap for Racket mode.") - -(easy-menu-define racket-mode-menu racket-mode-map - "Menu for Racket mode." - '("Racket" - ("Run" - ["in REPL" racket-run] - ["in REPL and switch to REPL" racket-run-and-switch-to-repl] - ["in *shell* using `racket`" racket-racket]) - ("Tests" - ["in REPL" racket-test] - ["in *shell* using `raco test`" racket-raco-test] - "---" - ["Fold All" racket-fold-all-tests] - ["Unfold All" racket-unfold-all-tests]) - ("Eval" - ["Region" racket-send-region :active (region-active-p)] - ["Definition" racket-send-definition] - ["Last S-Expression" racket-send-last-sexp]) - ("Macro Expand" - ["File" racket-expand-file] - ["Region" racket-expand-region :active (region-active-p)] - ["Definition" racket-expand-definition] - ["Last S-Expression" racket-expand-last-sexp]) - ["Switch to REPL" racket-repl] - ("Tools" - ["Profile" racket-profile] - ["Error Trace" racket-run-with-errortrace] - ["Step Debug" racket-run-with-debugging] - ["Toggle XP Mode" racket-xp-mode]) - "---" - ["Comment" comment-dwim] - ["Insert λ" racket-insert-lambda] - ["Indent Region" indent-region] - ["Cycle Paren Shapes" racket-cycle-paren-shapes] - ["Align" racket-align] - ["Unalign" racket-unalign] - "---" - ["Visit Module" racket-visit-module] - ["Return from Visit" racket-unvisit] - "---" - ["Open Require Path" racket-open-require-path] - ["Find Collection" racket-find-collection] - "---" - ["Next Error or Link" next-error] - ["Previous Error" previous-error] - "---" - ["Tidy Requires" racket-tidy-requires] - ["Trim Requires" racket-trim-requires] - ["Use #lang racket/base" racket-base-requires] - "---" - ["Start Faster" racket-mode-optimize-startup] - ["Customize..." customize-mode])) - -(defun racket--variables-imenu () - (setq-local imenu-case-fold-search t) - (setq-local imenu-create-index-function #'racket--imenu-create-index-function)) - -;;;###autoload -(define-derived-mode racket-mode prog-mode - "Racket" - "Major mode for editing Racket. -\\{racket-mode-map}" - (racket--common-variables) - (racket--variables-imenu) - (hs-minor-mode t) - (setq-local completion-at-point-functions (list #'racket-complete-at-point)) - (setq-local eldoc-documentation-function nil) - (funcall (or (and (functionp racket-repl-buffer-name-function) - racket-repl-buffer-name-function) - #'racket-repl-buffer-name-shared)) - (add-hook 'kill-buffer-hook - #'racket-mode-maybe-offer-to-kill-repl-buffer)) - -;;;###autoload -(progn - (add-to-list 'auto-mode-alist '("\\.rkt[dl]?\\'" . racket-mode)) - (modify-coding-system-alist 'file "\\.rkt[dl]?\\'" 'utf-8) - (add-to-list 'interpreter-mode-alist '("racket" . racket-mode))) - -;;;###autoload -(defun racket-mode-start-faster () - "Compile Racket Mode's .rkt files for faster startup. - -Racket Mode is implemented as an Emacs Lisp \"front end\" that -talks to a Racket process \"back end\". Because Racket Mode is -delivered as an Emacs package instead of a Racket package, -installing it does not do the `raco setup` that is normally done -for Racket packages. - -This command will do a `raco make` of Racket Mode's .rkt files, -creating bytecode files in `compiled/` subdirectories. As a -result, when a `racket-run' or `racket-repl' command must start -the Racket process, it will start faster. - -If you run this command, ever, you should run it again after: - -- Installing an updated version of Racket Mode. Otherwise, you - might lose some of the speed-up. - -- Installing a new version of Racket and/or changing the value of - the variable `racket-program'. Otherwise, you might get an - error message due to the bytecode being different versions." - (interactive) - (let* ((racket (executable-find racket-program)) - (rkts0 (expand-file-name "*.rkt" racket--rkt-source-dir) ) - (rkts1 (expand-file-name "commands/*.rkt" racket--rkt-source-dir)) - (command (format "%s -l raco make -v %s %s" - (shell-quote-wildcard-pattern racket) - (shell-quote-wildcard-pattern rkts0) - (shell-quote-wildcard-pattern rkts1))) - (prompt (format "Do `%s` " command))) - (when (y-or-n-p prompt) - (async-shell-command command)))) - -;;; Commands that predate `racket-xp-mode' - -(defun racket-doc () - "Instead please use `racket-xp-documentation' or `racket-repl-documentation'. -See: " - (interactive) - (describe-function 'racket-doc)) - -(defun racket-describe () - "Instead please use `racket-xp-describe' or `racket-repl-describe'. -See: " - (interactive) - (describe-function 'racket-describe)) - -(defun racket-visit-definition () - "Instead please use `racket-xp-visit-definition' or `racket-repl-visit-definition'. -See: " - (interactive) - (describe-function 'racket-visit-definition)) - -(provide 'racket-mode) - -;;; racket-mode.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-mode.elc b/elpa/racket-mode-20200417.1741/racket-mode.elc deleted file mode 100644 index 696029641d71d21b8116897fc968821930bfff32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8428 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 L?a#3$4txIt;gP|6 diff --git a/elpa/racket-mode-20200417.1741/racket-mode.info b/elpa/racket-mode-20200417.1741/racket-mode.info deleted file mode 100644 index 9b2acf5e..00000000 --- a/elpa/racket-mode-20200417.1741/racket-mode.info +++ /dev/null @@ -1,2729 +0,0 @@ -This is racket-mode.info, produced by makeinfo version 6.5 from -racket-mode.texi. - -INFO-DIR-SECTION Emacs -START-INFO-DIR-ENTRY -* Racket Mode: (racket-mode). Edit and REPL major modes for Racket lang. -END-INFO-DIR-ENTRY - - -File: racket-mode.info, Node: Top, Next: Introduction, Up: (dir) - -Racket Mode -*********** - -* Menu: - -* Introduction:: -* Install:: -* Configure:: -* Reference:: -* Commands:: -* Variables:: -* Faces:: - -— The Detailed Node Listing — - -Install - -* Configure Emacs to use MELPA:: -* Install Racket Mode:: -* Minimal Racket:: -* Uninstall:: -* Update:: - -Configure - -* Key bindings:: -* Font-lock (syntax highlighting):: -* Completion:: -* Indent:: -* paredit:: -* smartparens:: -* Edit buffers and REPL buffers:: -* eldoc:: -* Start faster:: -* Unicode input method:: - -Commands - -* Edit:: -* Explore:: -* Run:: -* Test:: -* Eval:: -* Collections:: -* Macro expand:: -* Other:: -* Showing information:: -* Associating edit buffers with REPL buffers:: - -Edit - -* racket-insert-lambda:: -* racket-fold-all-tests:: -* racket-unfold-all-tests:: -* racket-tidy-requires:: -* racket-trim-requires:: -* racket-base-requires:: -* racket-indent-line:: -* racket-smart-open-bracket-mode:: -* racket-insert-closing:: -* racket-cycle-paren-shapes:: -* racket-backward-up-list:: -* racket-unicode-input-method-enable:: -* racket-align:: -* racket-unalign:: -* racket-complete-at-point:: - -Explore - -* racket-xp-mode:: -* racket-xp-visit-definition:: -* racket-xp-describe:: -* racket-xp-documentation:: - -Run - -* racket-run:: -* racket-run-and-switch-to-repl:: -* racket-run-module-at-point:: -* racket-repl:: -* racket-repl-describe:: -* racket-repl-documentation:: -* racket-repl-visit-definition:: -* racket-racket:: -* racket-profile:: -* racket-profile-mode:: -* racket-logger:: -* racket-logger-mode:: -* racket-debug-mode:: - -Test - -* racket-test:: -* racket-raco-test:: - -Eval - -* racket-send-region:: -* racket-send-definition:: -* racket-send-last-sexp:: - -Collections - -* racket-visit-module:: -* racket-open-require-path:: -* racket-find-collection:: - -Macro expand - -* racket-stepper-mode:: -* racket-expand-file:: -* racket-expand-region:: -* racket-expand-definition:: -* racket-expand-last-sexp:: - -Other - -* racket-unvisit:: -* racket-mode-start-faster:: - -Showing information - -* racket-show-echo-area:: -* racket-show-header-line:: -* racket-show-pos-tip:: - -Associating edit buffers with REPL buffers - -* racket-repl-buffer-name-shared:: -* racket-repl-buffer-name-unique:: -* racket-repl-buffer-name-project:: -Variables - -* General variables:: -* REPL variables:: -* Other variables:: -* Experimental debugger variables:: -* Showing information: Showing informationx. - -General variables - -* racket-program:: -* racket-command-port:: -* racket-command-timeout:: -* racket-memory-limit:: -* racket-error-context:: -* racket-user-command-line-arguments:: -* racket-path-from-emacs-to-racket-function:: -* racket-path-from-racket-to-emacs-function:: -* racket-xp-after-change-refresh-delay:: -* racket-xp-highlight-unused-regexp:: - -REPL variables - -* racket-repl-buffer-name-function:: -* racket-history-filter-regexp:: -* racket-images-inline:: -* racket-images-keep-last:: -* racket-images-system-viewer:: -* racket-pretty-print:: - -Other variables - -* racket-indent-curly-as-sequence:: -* racket-indent-sequence-depth:: -* racket-pretty-lambda:: -* racket-smart-open-bracket-enable:: -* racket-logger-config:: - -Experimental debugger variables - -* racket-debuggable-files:: - -Showing information - -* racket-show-functions:: -Faces - -* All:: - -All - -* racket-keyword-argument-face:: -* racket-selfeval-face:: -* racket-here-string-face:: -* racket-xp-def-face:: -* racket-xp-use-face:: -* racket-xp-unused-face:: -* racket-logger-config-face:: -* racket-logger-topic-face:: -* racket-logger-fatal-face:: -* racket-logger-error-face:: -* racket-logger-warning-face:: -* racket-logger-info-face:: -* racket-logger-debug-face:: - - -File: racket-mode.info, Node: Introduction, Next: Install, Prev: Top, Up: Top - -1 Introduction -************** - -The Racket Mode (https://www.racket-mode.com/) package consists of a -variety of Emacs major and minor modes, including: - - • ‘racket-mode’: A major mode for editing ‘.rkt’ files. - - • *note racket-xp-mode::: An optional minor mode that enhances - ‘racket-mode’ to explain and explore code. - - • ‘racket-repl-mode’: A major mode for running programs providing a - REPL. - - • Various other modes to support specific features: - • *note racket-logger-mode:: - • *note racket-profile-mode:: - • *note racket-debug-mode:: - - Racket Mode uses a “back end server†written in Racket, which is -responsible for running files and implementing commands that cannot be -implemented in Emacs Lisp.(1) - - For code, issues, and pull requests, see the Git repo -(https://github.com/greghendershott/racket-mode). - - To fund this work, see GitHub Sponsors -(https://github.com/users/greghendershott/sponsorship) or PayPal -(https://www.paypal.me/greghendershott). - - ---------- Footnotes ---------- - - (1) Racket Mode’s Racket code is also delivered as part of the Emacs -package — _not_ as a Racket package. Delivering both Emacs and Racket -code in one Emacs package simplifies installation and updates. The main -drawback is that the Racket code is not automatically byte-compiled, as -would normally be done by ‘raco pkg install’. To address this: *Note -racket-mode-start-faster::. - - -File: racket-mode.info, Node: Install, Next: Configure, Prev: Introduction, Up: Top - -2 Install -********* - -The recommended way to use Racket Mode is to install the package from -MELPA (https://melpa.org/). -* Menu: - -* Configure Emacs to use MELPA:: -* Install Racket Mode:: -* Minimal Racket:: -* Uninstall:: -* Update:: - - -File: racket-mode.info, Node: Configure Emacs to use MELPA, Next: Install Racket Mode, Up: Install - -2.1 Configure Emacs to use MELPA -================================ - -To use MELPA: - - • Add the following to your ~/.emacs or ~/.emacs.d/init.el: - - (require 'package) - (add-to-list 'package-archives - '("melpa" . "https://melpa.org/packages/") - t) - - • Restart Emacs. - - • Type ‘M-x’ ‘package-refresh-contents’ ‘RET’ . - - -File: racket-mode.info, Node: Install Racket Mode, Next: Minimal Racket, Prev: Configure Emacs to use MELPA, Up: Install - -2.2 Install Racket Mode -======================= - -When Emacs is configured to use MELPA, simply type ‘M-x’ package-install -‘RET’ racket-mode ‘RET’ . - - -File: racket-mode.info, Node: Minimal Racket, Next: Uninstall, Prev: Install Racket Mode, Up: Install - -2.3 Minimal Racket -================== - -If you have installed the minimal Racket distribution (for example by -using the homebrew formula -(https://github.com/Homebrew/homebrew-core/blob/master/Formula/minimal-racket.rb)) -Racket Mode needs some additional packages (like ‘errortrace’ and -‘macro-debugger’). A simple way to get all these packages is to install -the ‘drracket’ Racket package. In a command shell: - - raco pkg install drracket - - -File: racket-mode.info, Node: Uninstall, Next: Update, Prev: Minimal Racket, Up: Install - -2.4 Uninstall -============= - -To uninstall Racket Mode, simply type ‘M-x’ ‘package-delete’ ‘RET’ -‘racket-mode’ ‘RET’ . - - You should probably also exit and restart Emacs. - - -File: racket-mode.info, Node: Update, Prev: Uninstall, Up: Install - -2.5 Update -========== - -Be aware that updating an Emacs package doesn’t necessarily fully update -Emacs’ state. (One example symptom: an “invalid function†error -message.) - - After updating the package, you might need to restart Emacs. - - In some cases, you might even need to: - - 1. Uninstall Racket Mode. - - 2. Exit and restart Emacs. - - 3. Install Racket Mode. - - -File: racket-mode.info, Node: Configure, Next: Reference, Prev: Install, Up: Top - -3 Configure -*********** - -Although Racket Mode can be customized with many *note Variables::, -there is only one that you might _need_ to set: *note racket-program::. -This is the name or pathname of the Racket executable. It defaults to -‘Racket.exe’ on Windows else ‘racket’. - - On Windows or Linux, this default will probably work for you. - - On macOS, downloading Racket doesn’t add its ‘bin’ directory to your -‘PATH’. Even after you add it, GUI Emacs doesn’t automatically use your -path (unless you use the handy exec-path-from-shell -(https://melpa.org/#/exec-path-from-shell) package). Therefore you -might want to set ‘racket-program’ to a full pathname like -‘/usr/racket/bin/racket’. - - You can ‘setq’ this directly in your Emacs init file (~/.emacs or -~/.emacs.d/init.el), or, use ‘M-x’ ‘customize’, as you prefer. -* Menu: - -* Key bindings:: -* Font-lock (syntax highlighting):: -* Completion:: -* Indent:: -* paredit:: -* smartparens:: -* Edit buffers and REPL buffers:: -* eldoc:: -* Start faster:: -* Unicode input method:: - - -File: racket-mode.info, Node: Key bindings, Next: Font-lock (syntax highlighting), Up: Configure - -3.1 Key bindings -================ - -To customize things like key bindings, you can use ‘racket-mode-hook’ in -your Emacs init file to modify ‘racket-mode-map’. For example, although -‘C-c C-c’ is bound by default to the ‘racket-run’ command, let’s say you -wanted ‘F5’ to be an additional binding: - - (add-hook 'racket-mode-hook - (lambda () - (define-key racket-mode-map (kbd "") 'racket-run))) - - Likewise for ‘racket-repl-mode-hook’ and ‘racket-repl-mode-map’. - - -File: racket-mode.info, Node: Font-lock (syntax highlighting), Next: Completion, Prev: Key bindings, Up: Configure - -3.2 Font-lock (syntax highlighting) -=================================== - -Font-lock (as Emacs calls syntax highlighting) can be controlled using -the variable ‘font-lock-maximum-decoration’, which defaults to ‘t’ -(maximum). You can set it to a number, where ‘0’ is the lowest level. -You can even supply an association list to specify different values for -different major modes. - - Historically you might choose a lower level for speed. These days -you might do so because you prefer a simpler appearance. - - Racket Mode supports four, increasing levels of font-lock: - - • ‘0’: Just strings, comments, and ‘#lang’. - • ‘1’: ‘#:keyword’ and self-evaluating literals like numbers, quoted - symbols (including symbols with spaces delimited by ‘|’ - characters), and ‘#rx’ and ‘#px’ regular expressions. - • ‘2’: Identifiers in ‘define’-like and ‘let’-like forms. - • ‘3’: Identifiers provided by ‘racket’, ‘typed/racket’, - ‘racket/syntax’, and ‘syntax/parse’. (This level effectively - treats Racket as a language, instead of a language for making - languages.). - - -File: racket-mode.info, Node: Completion, Next: Indent, Prev: Font-lock (syntax highlighting), Up: Configure - -3.3 Completion -============== - -In Emacs, a major mode may supply a “completion-at-point functionâ€. -This function is used by manual completion commands like -‘complete-symbol’ (bound by default to ‘C-M-i’ ), as well as by -auto-completion packages like ‘company-mode’. - - • ‘racket-mode’ supplies ‘racket-complete-at-point’, which simply - supplies the same symbols that it knows how to font-lock. This - does _not_ require the Racket Mode back end to be running. But of - course the completion candidates do not correspond to your - program’s definitions or those it imports. This is a static, - “better than nothing†fallback. - - • ‘racket-xp-mode’ — an optional minor mode that enhances - ‘racket-mode’ — supplies ‘racket-xp-complete-at-point’, which uses - a static anaylsis to find local and imported binding names. - Although this requires the Racket Mode back end to be running — and - will automatically start it — it does _not_ require the edit buffer - to be ‘racket-run’. - - • ‘racket-repl-mode’ supplies ‘racket-repl-complete-at-point’, which - uses the result of ‘namespace-mapped-symbols’ on the program - currently running in the REPL. - - These completion functions are set by default. (However, -‘racket-xp-mode’ is not enabled by default. To do so: *note -racket-xp-mode::.) - - If you want ‘TAB’ to do completion as well as indent, add the -following to your Emacs init file: - - (setq tab-always-indent 'complete) - - This changes the behavior of Emacs’ standard -‘indent-for-tab-command’, to which ‘TAB’ is bound by default in -‘racket-mode’ and ‘racket-repl-mode’. - - -File: racket-mode.info, Node: Indent, Next: paredit, Prev: Completion, Up: Configure - -3.4 Indent -========== - -Indentation can be customized in a way similar to lisp-mode and -scheme-mode: *note racket-indent-line::. - - -File: racket-mode.info, Node: paredit, Next: smartparens, Prev: Indent, Up: Configure - -3.5 paredit -=========== - -If you use paredit (https://melpa.org/#/paredit), you might want to add -keybindings to ‘paredit-mode-map’: - - • Bind the curly brace keys to ‘paredit-open-curly’ and - ‘paredit-close-curly’. - - • Bind whatever keys you prefer for ‘paredit-wrap-square’ and - ‘paredit-wrap-curly’. - - For example, with ‘use-package’ (https://melpa.org/#/use-package): - - (use-package paredit - :ensure t - :config - (dolist (m '(emacs-lisp-mode-hook - racket-mode-hook - racket-repl-mode-hook)) - (add-hook m #'paredit-mode)) - (bind-keys :map paredit-mode-map - ("{" . paredit-open-curly) - ("}" . paredit-close-curly)) - (unless terminal-frame - (bind-keys :map paredit-mode-map - ("M-[" . paredit-wrap-square) - ("M-{" . paredit-wrap-curly)))) - - -File: racket-mode.info, Node: smartparens, Next: Edit buffers and REPL buffers, Prev: paredit, Up: Configure - -3.6 smartparens -=============== - -If instead of paredit you prefer smartparens -(https://melpa.org/#/smartparens), you can use the default configuration -it provides for Lisp modes generally and for Racket Mode specifically: - - (require 'smartparens-config) - - -File: racket-mode.info, Node: Edit buffers and REPL buffers, Next: eldoc, Prev: smartparens, Up: Configure - -3.7 Edit buffers and REPL buffers -================================= - -By default, all ‘racket-mode’ edit buffers share one ‘racket-repl-mode’ -buffer. For example, if you ‘racket-run’ “foo.rktâ€, the REPL prompt -changes to “foo.rkt>â€, and the REPL is inside the file module namespace. -If you then ‘racket-run’ “bar.rktâ€, the REPL prompt changes to -“bar.rkt>â€, and you are in that namespace. - - If you prefer, you can use more than one REPL buffer, by customizing -the variable *note racket-repl-buffer-name-function::: Another option is -to have one REPL buffer for each edit buffer, similar to Dr Racket. Yet -another option is to have files belong to the same project all share the -same REPL buffer. You can also define your own, custom function. - - -File: racket-mode.info, Node: eldoc, Next: Start faster, Prev: Edit buffers and REPL buffers, Up: Configure - -3.8 eldoc -========= - -By default Racket Mode sets ‘eldoc-documentation-function’ to ‘nil’ — no -‘eldoc-mode’ support. You may set it to ‘racket-eldoc-function’ in a -‘racket-mode-hook’ and ‘racket-repl-mode-hook’ if you really want to use -‘eldoc-mode’ with Racket. But it is not a very satisfying experience -because Racket is not a very “eldoc-friendly†language. Although Racket -Mode attempts to discover argument lists, contracts, or types this -doesn’t work in many common cases: - - • Many Racket primitives are defined in ‘#%kernel’ or ‘#%runtime’. - There’s no easy way to determine their argument lists. Most do not - ‘provide’ a contract. - - • Many of the interesting Racket forms are syntax (macros) not - functions. There’s no easy way to determine their “argument - listsâ€. - - • When a form has documentation, Racket Mode can show the \"bluebox\†- – but often that does not fit in a single line as you would - normally expect with eldoc. - - A more satisfying experience is to use *note racket-xp-describe:: or -*note racket-xp-documentation::. - - -File: racket-mode.info, Node: Start faster, Next: Unicode input method, Prev: eldoc, Up: Configure - -3.9 Start faster -================ - -You can use *note racket-mode-start-faster:: to make the Racket REPL -start faster. - - -File: racket-mode.info, Node: Unicode input method, Prev: Start faster, Up: Configure - -3.10 Unicode input method -========================= - -An optional Emacs input method, ‘racket-unicode’, lets you easily type -various Unicode symbols that might be useful when writing Racket code. - - To automatically enable the ‘racket-unicode’ input method in -‘racket-mode’ and ‘racket-repl-mode’ buffers, put the following code in -your Emacs init file: - - (add-hook 'racket-mode-hook #'racket-unicode-input-method-enable) - (add-hook 'racket-repl-mode-hook #'racket-unicode-input-method-enable) - - *Note racket-unicode-input-method-enable::. - - *Note racket-insert-lambda::. - - -File: racket-mode.info, Node: Reference, Next: Commands, Prev: Configure, Up: Top - -4 Reference -*********** - -The following sections are generated from the doc strings for each -command, variable, or face. (As a result, some of the formatting might -not be quite as nice or correct as the previous sections.) - - You can also view these by using the normal Emacs help mechanism: - - • ‘C-h f’ and enter the name of a command. - • ‘C-h v’ and enter the name of a variable. - - -File: racket-mode.info, Node: Commands, Next: Variables, Prev: Reference, Up: Top - -5 Commands -********** - -* Menu: - -* Edit:: -* Explore:: -* Run:: -* Test:: -* Eval:: -* Collections:: -* Macro expand:: -* Other:: -* Showing information:: -* Associating edit buffers with REPL buffers:: - - -File: racket-mode.info, Node: Edit, Next: Explore, Up: Commands - -5.1 Edit -======== - -* Menu: - -* racket-insert-lambda:: -* racket-fold-all-tests:: -* racket-unfold-all-tests:: -* racket-tidy-requires:: -* racket-trim-requires:: -* racket-base-requires:: -* racket-indent-line:: -* racket-smart-open-bracket-mode:: -* racket-insert-closing:: -* racket-cycle-paren-shapes:: -* racket-backward-up-list:: -* racket-unicode-input-method-enable:: -* racket-align:: -* racket-unalign:: -* racket-complete-at-point:: - - -File: racket-mode.info, Node: racket-insert-lambda, Next: racket-fold-all-tests, Up: Edit - -5.1.1 racket-insert-lambda --------------------------- - -‘C-M-y’ - - Insert λ. - - To insert Unicode symbols generally, see *note -racket-unicode-input-method-enable::. - - -File: racket-mode.info, Node: racket-fold-all-tests, Next: racket-unfold-all-tests, Prev: racket-insert-lambda, Up: Edit - -5.1.2 racket-fold-all-tests ---------------------------- - -‘C-c C-f’ - - Fold (hide) all test submodules. - - -File: racket-mode.info, Node: racket-unfold-all-tests, Next: racket-tidy-requires, Prev: racket-fold-all-tests, Up: Edit - -5.1.3 racket-unfold-all-tests ------------------------------ - -‘C-c C-u’ - - Unfold (show) all test submodules. - - -File: racket-mode.info, Node: racket-tidy-requires, Next: racket-trim-requires, Prev: racket-unfold-all-tests, Up: Edit - -5.1.4 racket-tidy-requires --------------------------- - -‘M-x’ ‘racket-tidy-requires’ ‘RET’ - - Make a single top-level “require†form, modules sorted, one per line. - - All top-level require forms are combined into a single form. Within -that form: - - • A single subform is used for each phase level, sorted in this - order: for-syntax, for-template, for-label, for-meta, and plain - (phase 0). - - • Within each level subform, the modules are sorted: - - • Collection path modules – sorted alphabetically. - - • Subforms such as only-in. - - • Quoted relative requires – sorted alphabetically. - - At most one module is listed per line. - - Note: This only works for requires at the top level of a source file -using #lang. It does NOT work for require forms inside module forms. - - See also: *note racket-trim-requires:: and *note -racket-base-requires::. - - -File: racket-mode.info, Node: racket-trim-requires, Next: racket-base-requires, Prev: racket-tidy-requires, Up: Edit - -5.1.5 racket-trim-requires --------------------------- - -‘M-x’ ‘racket-trim-requires’ ‘RET’ - - Like *note racket-tidy-requires:: but also deletes unnecessary -requires. - - Note: This only works when the source file can be fully expanded with -no errors. - - Note: This only works for requires at the top level of a source file -using #lang. It does NOT work for require forms inside module forms. -Furthermore, it is not smart about module+ or module* forms – it might -delete top level requires that are actually needed by such submodules. - - See also: *note racket-base-requires::. - - -File: racket-mode.info, Node: racket-base-requires, Next: racket-indent-line, Prev: racket-trim-requires, Up: Edit - -5.1.6 racket-base-requires --------------------------- - -‘M-x’ ‘racket-base-requires’ ‘RET’ - - Change from “#lang racket†to “#lang racket/baseâ€. - - Adds explicit requires for imports that are provided by “racket†but -not by “racket/baseâ€. - - This is a recommended optimization for Racket applications. Avoiding -loading all of “racket†can reduce load time and memory footprint. - - Also, as does *note racket-trim-requires::, this removes unneeded -modules and tidies everything into a single, sorted require form. - - Note: This only works when the source file can be fully expanded with -no errors. - - Note: This only works for requires at the top level of a source file -using #lang. It does NOT work for require forms inside module forms. -Furthermore, it is not smart about module+ or module* forms – it might -delete top level requires that are actually needed by such submodules. - - Note: Currently this only helps change “#lang racket†to “#lang -racket/baseâ€. It does not help with other similar conversions, such as -changing “#lang typed/racket†to “#lang typed/racket/baseâ€. - - -File: racket-mode.info, Node: racket-indent-line, Next: racket-smart-open-bracket-mode, Prev: racket-base-requires, Up: Edit - -5.1.7 racket-indent-line ------------------------- - -‘M-x’ ‘racket-indent-line’ ‘RET’ - - Indent current line as Racket code. - - Normally you don’t need to use this command directly, it is used -automatically when you press keys like RET or TAB. However you might -refer to it when configuring custom indentation, explained below. - - This behaves like ‘lisp-indent-line’, except that whole-line comments -are treated the same regardless of whether they start with single or -double semicolons. - - • Automatically indents forms that start with “begin†in the usual - way that “begin†is indented. - - • Automatically indents forms that start with “def†or “with-†in the - usual way that “define†is indented. - - • Has rules for many specific standard Racket forms. - - To extend, use your Emacs init file to - - (put SYMBOL 'racket-indent-function INDENT) - - SYMBOL is the name of the Racket form like “’test-case†and INDENT is -an integer or the symbol “’defunâ€. When INDENT is an integer, the -meaning is the same as for lisp-indent-function and -scheme-indent-function: Indent the first INDENT arguments specially and -indent any further arguments like a body. - - For example: - - (put 'test-case 'racket-indent-function 1) - - This will change the indent of ‘test-case’ from this: - - (test-case foo - blah - blah) - - to this: - - (test-case foo - blah - blah) - - If ‘racket-indent-function’ has no property for a symbol, -scheme-indent-function is also considered, although the “with-†indents -defined by scheme-mode are ignored. This is only to help people who may -have extensive scheme-indent-function settings, particularly in the form -of file or dir local variables. Otherwise prefer putting properties on -‘racket-indent-function’. - - -File: racket-mode.info, Node: racket-smart-open-bracket-mode, Next: racket-insert-closing, Prev: racket-indent-line, Up: Edit - -5.1.8 racket-smart-open-bracket-mode ------------------------------------- - -‘M-x’ ‘racket-smart-open-bracket-mode’ ‘RET’ - - Minor mode to let you always type ‘[’’ to insert ‘(’ or ‘[’ -automatically. - - Behaves like the “Automatically adjust opening square brackets†-feature in Dr. Racket. - - By default, inserts a ‘(’. Inserts a ‘[’ in the following cases: - - • ‘let’-like bindings – forms with ‘let’ in the name as well as - things like ‘parameterize’, ‘with-handlers’, and ‘with-syntax’. - - • ‘case’, ‘cond’, ‘match’, ‘syntax-case’, ‘syntax-parse’, and - ‘syntax-rules’ clauses. - - • ‘for’-like bindings and ‘for/fold’ accumulators. - - • ‘class’ declaration syntax, such as ‘init’ and ‘inherit’. - - When the previous s-expression in a sequence is a compound -expression, uses the same kind of delimiter. - - To force insert ‘[’, use ‘quoted-insert’. - - Combined with *note racket-insert-closing:: this means that you can -press the unshifted ‘[’ and ‘]’ keys to get whatever delimiters follow -the Racket conventions for these forms. When something like -‘electric-pair-mode’ or ‘paredit-mode’ is active, you need not even -press ‘]’. - - Tip: When also using ‘paredit-mode’, enable that first so that the -binding for the ‘[’’ key in the map for *note -racket-smart-open-bracket-mode:: has higher priority. See also the -variable ‘minor-mode-map-alist’. - - -File: racket-mode.info, Node: racket-insert-closing, Next: racket-cycle-paren-shapes, Prev: racket-smart-open-bracket-mode, Up: Edit - -5.1.9 racket-insert-closing ---------------------------- - -‘]’ or ‘)’ - - Insert a matching closing delimiter. - - With a prefix, insert the typed character as-is. - - This is handy if you’re not yet using something like ‘paredit-mode’, -‘smartparens-mode’, ‘parinfer-mode’, or simply ‘electric-pair-mode’ -added in Emacs 24.5. - - -File: racket-mode.info, Node: racket-cycle-paren-shapes, Next: racket-backward-up-list, Prev: racket-insert-closing, Up: Edit - -5.1.10 racket-cycle-paren-shapes --------------------------------- - -‘C-c C-p’ - - Cycle the sexpr among () [] {}. - - -File: racket-mode.info, Node: racket-backward-up-list, Next: racket-unicode-input-method-enable, Prev: racket-cycle-paren-shapes, Up: Edit - -5.1.11 racket-backward-up-list ------------------------------- - -‘C-M-u’ - - Like ‘backward-up-list’ but works when point is in a string or -comment. - - Typically you should not use this command in Emacs Lisp – especially -not repeatedly. Instead, initially use -‘racket--escape-string-or-comment’ to move to the start of a string or -comment, if any, then use normal ‘backward-up-list’ repeatedly. - - -File: racket-mode.info, Node: racket-unicode-input-method-enable, Next: racket-align, Prev: racket-backward-up-list, Up: Edit - -5.1.12 racket-unicode-input-method-enable ------------------------------------------ - -‘M-x’ ‘racket-unicode-input-method-enable’ ‘RET’ - - Set input method to racket-unicode. - - The racket-unicode input method lets you easily type various Unicode -symbols that might be useful when writing Racket code. - - To automatically enable the racket-unicode input method in -racket-mode and racket-repl-mode buffers, put the following code in your -Emacs init file: - - (add-hook 'racket-mode-hook #'racket-unicode-input-method-enable) - (add-hook 'racket-repl-mode-hook #'racket-unicode-input-method-enable) - - To temporarily enable this input method for a single buffer you can -use “M-x racket-unicode-input-method-enableâ€. - - Use the standard Emacs key C-\ to toggle the input method. - - When the racket-unicode input method is active, you can for example -type “All†and it is immediately replaced with “∀â€. A few other -examples: - -omega ω -x_1 xâ‚ -x^1 x¹ -A 𔸠-test–>>E test–>>∃ (racket/redex) -vdash ⊢ - - To see a table of all key sequences use “M-x describe-input-method - racket-unicodeâ€. - - If you want to add your own mappings to the “racket-unicode†input -method, you may add code like the following example in your Emacs init -file: - - ;; Either (require 'racket-mode) here, or, if you use - ;; use-package, put the code below in the :config section. - (with-temp-buffer - (racket-unicode-input-method-enable) - (set-input-method "racket-unicode") - (let ((quail-current-package (assoc "racket-unicode" - quail-package-alist))) - (quail-define-rules ((append . t)) - ("^o" ["áµ’"])))) - - If you don’t like the highlighting of partially matching tokens you -can turn it off by setting ‘input-method-highlight-flag’ to nil. - - -File: racket-mode.info, Node: racket-align, Next: racket-unalign, Prev: racket-unicode-input-method-enable, Up: Edit - -5.1.13 racket-align -------------------- - -‘M-x’ ‘racket-align’ ‘RET’ - - Align values in the same column. - - Useful for binding forms like “let†and “parameterizeâ€, conditionals -like “cond†and “matchâ€, association lists, and any series of couples -like the arguments to “hashâ€. - - Before choosing this command, put point on the first of a series of -“couplesâ€. A couple is: - - • A list of two or more sexprs: "[sexpr val sexpr ...]". - • Two sexprs: “sexpr valâ€. - - Each “val†moves to the same column and is ‘prog-indent-sexp’-ed (in -case it is a multi-line form). - - For example with point on the "[" before “aâ€: - - Before After - - (let ([a 12] (let ([a 12] - [bar 23]) [bar 23]) - ....) ....) - - '([a . 12] '([a . 12] - [bar . 23]) [bar . 23]) - - (cond [a? #t] (cond [a? #t] - [b? (f x [b? (f x - y)] y)] - [else #f]) [else #f]) - - Or with point on the quote before “aâ€: - - (list 'a 12 (list 'a 12 - 'bar 23) 'bar 23) - - If more than one couple is on the same line, none are aligned, -because it is unclear where the value column should be. For example the -following form will not change; *note racket-align:: will display an -error message: - - (let ([a 0][b 1] - [c 2]) error; unchanged - ....) - - When a couple’s sexprs start on different lines, that couple is -ignored. Other, single-line couples in the series are aligned as usual. -For example: - - (let ([foo (let ([foo - 0] 0] - [bar 1] [bar 1] - [x 2]) [x 2]) - ....) ....) - - See also: *note racket-unalign::. - - -File: racket-mode.info, Node: racket-unalign, Next: racket-complete-at-point, Prev: racket-align, Up: Edit - -5.1.14 racket-unalign ---------------------- - -‘M-x’ ‘racket-unalign’ ‘RET’ - - The opposite of *note racket-align::. - - Effectively does M-x ‘just-one-space’ and ‘prog-indent-sexp’ for each -couple’s value. - - -File: racket-mode.info, Node: racket-complete-at-point, Prev: racket-unalign, Up: Edit - -5.1.15 racket-complete-at-point -------------------------------- - -A value for the variable ‘completion-at-point-functions’. - - Completion candidates are drawn from the same symbols used for -font-lock. This is a static list. If you want dynamic, smarter -completion candidates, enable the minor mode *note racket-xp-mode::. - - -File: racket-mode.info, Node: Explore, Next: Run, Prev: Edit, Up: Commands - -5.2 Explore -=========== - -* Menu: - -* racket-xp-mode:: -* racket-xp-visit-definition:: -* racket-xp-describe:: -* racket-xp-documentation:: - - -File: racket-mode.info, Node: racket-xp-mode, Next: racket-xp-visit-definition, Up: Explore - -5.2.1 racket-xp-mode --------------------- - -‘M-x’ ‘racket-xp-mode’ ‘RET’ - - A minor mode that analyzes expanded code to explain and explore. - - This minor mode is an optional enhancement to ‘racket-mode’ edit -buffers. Like any minor mode, you can turn it on or off for a specific -buffer. If you always want to use it, put the following code in your -Emacs init file: - - (require 'racket-xp) - (add-hook 'racket-mode-hook #'racket-xp-mode) - - Note: This mode won’t do anything unless/until the Racket Mode back -end is running. It will try to start the back end automatically. You -do _not_ need to *note racket-run:: the buffer you are editing. - - This mode uses the drracket/check-syntax package to analyze -fully-expanded programs, without needing to evaluate a.k.a. “run†them. -The resulting analysis provides information for: - - • Visually annotating bindings – local or imported definitions and - references to them. - - • Completion candidates. - - • Defintions’ source and documentation. - - When point is on a definition or use, related items are highlighted -using *note racket-xp-def-face:: and *note racket-xp-use-face:: – -instead of drawing arrows as in Dr Racket. Information is displayed -using the function(s) in the hook variable *note -racket-show-functions::; it is also available when hovering the mouse -cursor. Note: If you find these features too distracting and/or slow, -you may disable ‘cursor-sensor-mode’. The remaining features discussed -below will still work. - - You may also use commands to navigate among a definition and its -uses, or to rename a local definitions and all its uses. - - In the following little example, not only does drracket/check-syntax -distinguish the various “x†bindings, it understands the two different -imports of “defineâ€: - - #lang racket/base - (define x 1) - x - (let ([x x]) - (+ x 1)) - (module m typed/racket/base - (define x 2) - x) - - The function ‘racket-xp-complete-at-point’ is added to the variable -‘completion-at-point-functions’. Note that in this case, it is not -smart about submodules; identifiers are assumed to be definitions from -the file’s module or its imports. In addition to supplying completion -candidates, it supports the “:company-location†property to inspect the -definition of a candidate and the “:company-doc-buffer†property to view -its documentation. - - When you edit the buffer, existing annotations are retained; their -positions are updated to reflect the edit. Annotations for new or -deleted text are not requested until after *note -racket-xp-after-change-refresh-delay:: seconds. The request is made -asynchronously so that Emacs will not block – for moderately complex -source files, it can take some seconds simply to fully expand them, as -well as a little more time for the drracket/check-syntax analysis. When -the results are ready, all annotations for the buffer are completely -refreshed. - - You may also set *note racket-xp-after-change-refresh-delay:: to nil -and use the ‘racket-xp-annotate’ command manually. - - The mode line changes to reflect the current status of annotations, -and whether or not you had a syntax error. - - If you have one or more syntax errors, ‘racket-xp-next-error’ and -‘racket-xp-previous-error’ to navigate among them. Although most -languages will stop after the first syntax error, some like Typed Racket -will try to collect and report multiple errors. - - Tip: This mode follows the convention that a minor mode may only use -a prefix key consisting of “C-c†followed by a punctuation key. As a -result, ‘racket-xp-control-c-hash-keymap’ is bound to “C-c #†by -default. Although you might find this awkward to type, remember that as -an Emacs user, you are free to bind this map to a more convenient -prefix, and/or bind any individual commands directly to whatever keys -you prefer. - -Key Binding -‘M-.’ *note racket-xp-visit-definition:: -‘C-c C-d’ *note racket-xp-documentation:: -‘C-c C-.’ *note racket-xp-describe:: -‘C-c # P’ ‘racket-xp-previous-error’ -‘C-c # N’ ‘racket-xp-next-error’ -‘C-c # g’ ‘racket-xp-annotate’ -‘C-c # r’ ‘racket-xp-rename’ -‘C-c # .’ *note racket-xp-visit-definition:: -‘C-c # p’ ‘racket-xp-previous-use’ -‘C-c # n’ ‘racket-xp-next-use’ -‘C-c # k’ ‘racket-xp-previous-definition’ -‘C-c # j’ ‘racket-xp-next-definition’ - - -File: racket-mode.info, Node: racket-xp-visit-definition, Next: racket-xp-describe, Prev: racket-xp-mode, Up: Explore - -5.2.2 racket-xp-visit-definition --------------------------------- - -‘M-x’ ‘racket-xp-visit-definition’ ‘RET’ - - When point is on a use, go to its definition. - - With a prefix, prompts you, but in this case beware it assumes -definitions in or imported by the file module – not locals or -definitions in submodules. - - -File: racket-mode.info, Node: racket-xp-describe, Next: racket-xp-documentation, Prev: racket-xp-visit-definition, Up: Explore - -5.2.3 racket-xp-describe ------------------------- - -‘M-x’ ‘racket-xp-describe’ ‘RET’ - - Describe the identifier at point in a ‘*Racket Describe*’ buffer. - - With a prefix, prompts you, but in this case beware it assumes -definitions in or imported by the file module – not locals or -definitions in submodules. - - The intent is to give a quick reminder or introduction to something, -regardless of whether it has installed documentation – and to do so -within Emacs, without switching to a web browser. - - This buffer is also displayed when you use ‘company-mode’ and press -F1 or C-h in its pop up completion list. - - • If the identifier has installed Racket documentation, then a - simplified version of the HTML is presented in the buffer, - including the “blue boxâ€, documentation prose, and examples. - - • Otherwise, if the identifier is a function, then its signature is - displayed, for example "(name arg-1-name arg-2-name)". - - You can quit the buffer by pressing q. Also, at the bottom of the -buffer are Emacs buttons – which you may navigate among using TAB, and -activate using RET – for *note racket-xp-visit-definition:: and *note -racket-xp-documentation::. - - -File: racket-mode.info, Node: racket-xp-documentation, Prev: racket-xp-describe, Up: Explore - -5.2.4 racket-xp-documentation ------------------------------ - -‘M-x’ ‘racket-xp-documentation’ ‘RET’ - - Show documentation for the identifier at point. - - This gives a “file:†URL to ‘browse-url’, which typically opens an -external web browser, but see that and the variable -‘browse-url-browser-function’. - - With a prefix, prompts you, but in this case beware it assumes -definitions in or imported by the file module – not locals or -definitions in submodules. - - -File: racket-mode.info, Node: Run, Next: Test, Prev: Explore, Up: Commands - -5.3 Run -======= - -* Menu: - -* racket-run:: -* racket-run-and-switch-to-repl:: -* racket-run-module-at-point:: -* racket-repl:: -* racket-repl-describe:: -* racket-repl-documentation:: -* racket-repl-visit-definition:: -* racket-racket:: -* racket-profile:: -* racket-profile-mode:: -* racket-logger:: -* racket-logger-mode:: -* racket-debug-mode:: - - -File: racket-mode.info, Node: racket-run, Next: racket-run-and-switch-to-repl, Up: Run - -5.3.1 racket-run ----------------- - -‘M-x’ ‘racket-run’ ‘RET’ - - Save the buffer in REPL and run your program. - - Runs the “main†submodule, if any, otherwise the file’s module. See -also *note racket-run-module-at-point::. - - With one C-u prefix, uses errortrace for improved stack traces. -Otherwise follows the *note racket-error-context:: setting. - - With two C-u prefixes, instruments code for step debugging. See -*note racket-debug-mode:: and the variable *note -racket-debuggable-files::. - - Each run occurs within a Racket custodian. Any prior run’s custodian -is shut down, releasing resources like threads and ports. Each run’s -evaluation environment is reset to the contents of the source file. In -other words, like Dr Racket, this provides the benefit that your source -file is the “single source of truthâ€. At the same time, the run gives -you a REPL inside the namespace of the module, giving you the ability to -explore it interactively. Any explorations are temporary, unless you -also make them to your source file, they will be lost on the next run. - - See also *note racket-run-and-switch-to-repl::, which is even more -like Dr Racket’s Run command because it selects the REPL window after -running. - - In the ‘racket-repl-mode’ buffer, output that describes a file and -position is automatically “linkifiedâ€. Examples of such text include: - - • Racket error messages. - • rackunit test failure location messages. - • print representation of path objects. - - To visit these locations, move point there and press RET or mouse -click. Or, use the standard ‘next-error’ and ‘previous-error’ commands. - - -File: racket-mode.info, Node: racket-run-and-switch-to-repl, Next: racket-run-module-at-point, Prev: racket-run, Up: Run - -5.3.2 racket-run-and-switch-to-repl ------------------------------------ - -‘’ - - This is *note racket-run:: followed by selecting the REPL buffer -window. - - -File: racket-mode.info, Node: racket-run-module-at-point, Next: racket-repl, Prev: racket-run-and-switch-to-repl, Up: Run - -5.3.3 racket-run-module-at-point --------------------------------- - -‘C-c C-k’ or ‘C-c C-c’ - - Save the buffer and run the moudule at point. - - Like *note racket-run:: but runs the innermost module around point. -This may be a submodule nested at any depth, or the file’s module. - - -File: racket-mode.info, Node: racket-repl, Next: racket-repl-describe, Prev: racket-run-module-at-point, Up: Run - -5.3.4 racket-repl ------------------ - -‘C-c C-z’ - - Show a Racket REPL buffer in some window. - - *IMPORTANT* - - The main, intended use of Racket Mode’s REPL is that you ‘find-file’ -some specific .rkt file, then *note racket-run:: it. The REPL will then -match that file. - - If the REPL isn’t running, and you want to start it for no file in -particular? Then you could use this command. But the resulting REPL -will have a minimal “#lang racket/base†namespace. You could enter -"(require racket)" if you want the equivalent of “#lang racketâ€. You -could also "(require racket/enter)" if you want things like “enter!â€. -But in some sense you’d be “using it wrongâ€. If you really don’t want -to use Racket Mode’s REPL as intended, then you might as well use a -plain Emacs shell buffer to run command-line Racket. - - -File: racket-mode.info, Node: racket-repl-describe, Next: racket-repl-documentation, Prev: racket-repl, Up: Run - -5.3.5 racket-repl-describe --------------------------- - -‘M-x’ ‘racket-repl-describe’ ‘RET’ - - Describe the identifier at point in a ‘*Racket Describe*’ buffer. - - The intent is to give a quick reminder or introduction to something, -regardless of whether it has installed documentation – and to do so -within Emacs, without switching to a web browser. - - This buffer is also displayed when you use ‘company-mode’ and press -F1 or C-h in its pop up completion list. - - • If the identifier has installed Racket documentation, then a - simplified version of the HTML is presented in the buffer, - including the “blue boxâ€, documentation prose, and examples. - - • Otherwise, if the identifier is a function, then its signature is - displayed, for example ‘(name arg-1-name arg-2-name)’. If it has a - contract or a Typed Racket type, that is also displayed. - - You can quit the buffer by pressing q. Also, at the bottom of the -buffer are Emacs buttons – which you may navigate among using TAB, and -activate using RET – for ‘racket-visit-definition’ and ‘racket-doc’. - - -File: racket-mode.info, Node: racket-repl-documentation, Next: racket-repl-visit-definition, Prev: racket-repl-describe, Up: Run - -5.3.6 racket-repl-documentation -------------------------------- - -‘M-x’ ‘racket-repl-documentation’ ‘RET’ - - View documentation of the identifier or string at point. - - Uses the default external web browser. - - If point is an identifier required in the current namespace that has -help, opens the web browser directly at that help topic. (i.e. Uses -the identifier variant of racket/help.) - - Otherwise, opens the ‘search for a term’ page, where you can choose -among multiple possibilities. (i.e. Uses the string variant of -racket/help.) - - With a C-u prefix, prompts for the identifier or quoted string, -instead of looking at point. - - -File: racket-mode.info, Node: racket-repl-visit-definition, Next: racket-racket, Prev: racket-repl-documentation, Up: Run - -5.3.7 racket-repl-visit-definition ----------------------------------- - -‘M-x’ ‘racket-repl-visit-definition’ ‘RET’ - - Visit definition of identifier at point. - - If there is no identifier at point, prompt for it. - - With a prefix, always prompt for the identifier. - - Use *note racket-unvisit:: to return. - - Please keep in mind the following limitations: - - • Finds symbols defined in the REPL’s namespace, which only includes - imported and module binding – but not local bindings. - - • If the definition is found in Racket’s “#%kernel†module, it will - tell you so but won’t visit the definition site. - - -File: racket-mode.info, Node: racket-racket, Next: racket-profile, Prev: racket-repl-visit-definition, Up: Run - -5.3.8 racket-racket -------------------- - -‘’ - - Do “racket †in a shell buffer. - - -File: racket-mode.info, Node: racket-profile, Next: racket-profile-mode, Prev: racket-racket, Up: Run - -5.3.9 racket-profile --------------------- - -‘C-c C-o’ - - Runs with profiling instrumentation and shows results. - - Results are presented in a *note racket-profile-mode:: buffer, which -also lets you quickly view the source code. - - You may evaluate expressions in the REPL. They are also profiled. -Use ‘racket--profile-refresh’ to see the updated results. (In other -words a possible workflow is: *note racket-profile:: a .rkt file, call -one its functions in the REPL, and refresh the profile results.) - - Caveat: Only source files are instrumented. You may need to delete -compiled/*.zo files. - - -File: racket-mode.info, Node: racket-profile-mode, Next: racket-logger, Prev: racket-profile, Up: Run - -5.3.10 racket-profile-mode --------------------------- - -‘M-x’ ‘racket-profile-mode’ ‘RET’ - - Major mode for results of *note racket-profile::. - -Key Binding -‘,’ ‘racket--profile-sort’ -‘RET’ ‘racket--profile-visit’ -‘z’ ‘racket--profile-show-zero’ -‘p’ ‘racket--profile-prev’ -‘n’ ‘racket--profile-next’ -‘g’ ‘racket--profile-refresh’ -‘q’ ‘racket--profile-quit’ - - In addition to any hooks its parent mode ‘special-mode’ might have -run, this mode runs the hook ‘racket-profile-mode-hook’, as the final -step during initialization. - - -File: racket-mode.info, Node: racket-logger, Next: racket-logger-mode, Prev: racket-profile-mode, Up: Run - -5.3.11 racket-logger --------------------- - -‘C-c C-l’ - - Create the *note racket-logger-mode:: buffer and connect to logger -output. - - If the ‘racket-repl-mode’ buffer is displayed in a window, split that -window and put the logger in the bottom window. Otherwise, use -‘pop-to-buffer’. - - -File: racket-mode.info, Node: racket-logger-mode, Next: racket-debug-mode, Prev: racket-logger, Up: Run - -5.3.12 racket-logger-mode -------------------------- - -‘M-x’ ‘racket-logger-mode’ ‘RET’ - - Major mode for Racket logger output. - - The customization variable *note racket-logger-config:: determines -the levels for topics. During a session you may change topic levels -using ‘racket-logger-topic-level’. - - For more information see: - - -Key Binding -‘C-c C-z’ *note racket-repl:: -‘x’ ‘racket-logger-exit’ -‘g’ ‘racket-logger-clear’ -‘p’ ‘racket-logger-previous-item’ -‘n’ ‘racket-logger-next-item’ -‘w’ ‘toggle-truncate-lines’ -‘l’ ‘racket-logger-topic-level’ - - In addition to any hooks its parent mode ‘special-mode’ might have -run, this mode runs the hook ‘racket-logger-mode-hook’, as the final -step during initialization. - - -File: racket-mode.info, Node: racket-debug-mode, Prev: racket-logger-mode, Up: Run - -5.3.13 racket-debug-mode ------------------------- - -‘M-x’ ‘racket-debug-mode’ ‘RET’ - - Minor mode for debug breaks. - - This feature is **EXPERIMENTAL**!!! It is likely to have significant -limitations and bugs. You are welcome to open an issue to provide -feedback. Please understand that this feature might never be improved – -it might even be removed someday if it turns out to have too little -value and/or too much cost. - - How to debug: - - 1. “Instrument†code for step debugging. You can instrument entire - files, and also individual functions. - - a. Entire Files - - Choose *note racket-run:: with two prefixes – C-u C-u C-c C-c. The - file will be instrumented for step debugging before it is run. - Also instrumented are files determined by the variable *note - racket-debuggable-files::. - - The run will break at the first breakable position. - - Tip: After you run to completion and return to a normal REPL - prompt, the code remains instrumented. You may enter expressions - that evaluate instrumented code and it will break so you can step - debug again. - - b. Function Definitions - - Put point in a function ‘define’ form and C-u C-M-x to “instrument†- the function for step debugging. Then in the REPL, enter an - expression that causes the instrumented function to be run, - directly or indirectly. - - You can instrument any number of functions. - - You can even instrument while stopped at a break. For example, to - instrument a function you are about to call, so you can “step into†- it: - - • M-. a.k.a. ‘racket-visit-definition’. - • C-u C-M-x to instrument the definition. - • M-, a.k.a. *note racket-unvisit::. - • Continue stepping. - Limitation: Instrumenting a function ~require~d from another module - won’t redefine that function. Instead, it attempts to define an - instrumented function of the same name, in the module the REPL is - inside. The define will fail if it needs definitions visible only - in that other module. In that case you’ll probably need to use - entire-file instrumentation as described above. - - 2. When a break occurs, the ‘racket-repl-mode’ prompt changes. In - this debug REPL, local variables are available for you to use and - even to ‘set!’. - - Also, in the ‘racket-mode’ buffer where the break is located, *note - racket-debug-mode:: is enabled. This minor mode makes the buffer - read-only, provides visual feedback – about the break position, - local variable values, and result values – and provides shortcut - keys: - -Key Binding -‘?’ ‘racket-debug-help’ -‘h’ ‘racket-debug-run-to-here’ -‘p’ ‘racket-debug-prev-breakable’ -‘n’ ‘racket-debug-next-breakable’ -‘c’ ‘racket-debug-continue’ -‘u’ ‘racket-debug-step-out’ -‘o’ ‘racket-debug-step-over’ -‘SPC’ ‘racket-debug-step’ - - -File: racket-mode.info, Node: Test, Next: Eval, Prev: Run, Up: Commands - -5.4 Test -======== - -* Menu: - -* racket-test:: -* racket-raco-test:: - - -File: racket-mode.info, Node: racket-test, Next: racket-raco-test, Up: Test - -5.4.1 racket-test ------------------ - -‘’ or ‘C-c C-t’ - - Run the “test†submodule. - - With prefix, runs with coverage instrumentation and highlights -uncovered code. - - Put your tests in a “test†submodule. For example: - - (module+ test - (require rackunit) - (check-true #t)) - - Any rackunit test failure messages show the location. You may use -‘next-error’ to jump to the location of each failing test. - - See also: - • *note racket-fold-all-tests:: - • *note racket-unfold-all-tests:: - - -File: racket-mode.info, Node: racket-raco-test, Prev: racket-test, Up: Test - -5.4.2 racket-raco-test ----------------------- - -‘M-x’ ‘racket-raco-test’ ‘RET’ - - Do “raco test -x †in a shell buffer to run the “test†-submodule. - - -File: racket-mode.info, Node: Eval, Next: Collections, Prev: Test, Up: Commands - -5.5 Eval -======== - -* Menu: - -* racket-send-region:: -* racket-send-definition:: -* racket-send-last-sexp:: - - -File: racket-mode.info, Node: racket-send-region, Next: racket-send-definition, Up: Eval - -5.5.1 racket-send-region ------------------------- - -‘C-c C-r’ - - Send the current region (if any) to the Racket REPL. - - -File: racket-mode.info, Node: racket-send-definition, Next: racket-send-last-sexp, Prev: racket-send-region, Up: Eval - -5.5.2 racket-send-definition ----------------------------- - -‘C-M-x’ - - Send the current definition to the Racket REPL. - - -File: racket-mode.info, Node: racket-send-last-sexp, Prev: racket-send-definition, Up: Eval - -5.5.3 racket-send-last-sexp ---------------------------- - -‘C-x C-e’ - - Send the previous sexp to the Racket REPL. - - When the previous sexp is a sexp comment the sexp itself is sent, -without the #; prefix. - - -File: racket-mode.info, Node: Collections, Next: Macro expand, Prev: Eval, Up: Commands - -5.6 Collections -=============== - -* Menu: - -* racket-visit-module:: -* racket-open-require-path:: -* racket-find-collection:: - - -File: racket-mode.info, Node: racket-visit-module, Next: racket-open-require-path, Up: Collections - -5.6.1 racket-visit-module -------------------------- - -‘C-M-.’ - - Visit definition of module at point, e.g. net/url or “file.rktâ€. - - If there is no module at point, prompt for it. - - With a prefix, always prompt for the module. - - Use *note racket-unvisit:: to return. - - See also: *note racket-find-collection::. - - -File: racket-mode.info, Node: racket-open-require-path, Next: racket-find-collection, Prev: racket-visit-module, Up: Collections - -5.6.2 racket-open-require-path ------------------------------- - -‘C-c C-x C-f’ - - Like Dr Racket’s Open Require Path. - - Type (or delete) characters that are part of a module path name. -“Fuzzy†matches appear. For example try typing “t/t/râ€. - - Choices are displayed in a vertical list. The current choice is at -the top, marked with “->â€. - - • C-n and C-p move among the choices. - • RET on a directory adds its contents to the choices. - • RET on a file exits doing ‘find-file’. - • C-g aborts. - - -File: racket-mode.info, Node: racket-find-collection, Prev: racket-open-require-path, Up: Collections - -5.6.3 racket-find-collection ----------------------------- - -‘M-x’ ‘racket-find-collection’ ‘RET’ - - Given a collection name, try to find its directory and files. - - Takes a collection name from point (or, with a prefix, prompts you). - - If only one directory is found, ‘ido-find-file-in-dir’ lets you pick -a file there. - - If more than one directory is found, ‘ido-completing-read’ lets you -pick one, then ‘ido-find-file-in-dir’ lets you pick a file there. - - Note: This requires the ‘raco-find-collection’ package to be -installed. To install it, in ‘shell’ enter: - - raco pkg install raco-find-collection - - Tip: This works best with ‘ido-enable-flex-matching’ set to t. Also -handy is the ‘flx-ido’ package from MELPA. - - See also: *note racket-visit-module:: and *note -racket-open-require-path::. - - -File: racket-mode.info, Node: Macro expand, Next: Other, Prev: Collections, Up: Commands - -5.7 Macro expand -================ - -* Menu: - -* racket-stepper-mode:: -* racket-expand-file:: -* racket-expand-region:: -* racket-expand-definition:: -* racket-expand-last-sexp:: - - -File: racket-mode.info, Node: racket-stepper-mode, Next: racket-expand-file, Up: Macro expand - -5.7.1 racket-stepper-mode -------------------------- - -‘M-x’ ‘racket-stepper-mode’ ‘RET’ - - Major mode for Racket stepper output. - - Used by the commands *note racket-expand-file::, *note -racket-expand-definition::, *note racket-expand-region::, and *note -racket-expand-last-sexp::. - -Key Binding -‘k’ ‘racket-stepper-previous-item’ -‘p’ ‘racket-stepper-previous-item’ -‘j’ ‘racket-stepper-next-item’ -‘n’ ‘racket-stepper-next-item’ -‘RET’ ‘racket-stepper-step’ - - In addition to any hooks its parent mode ‘special-mode’ might have -run, this mode runs the hook ‘racket-stepper-mode-hook’, as the final -step during initialization. - - -File: racket-mode.info, Node: racket-expand-file, Next: racket-expand-region, Prev: racket-stepper-mode, Up: Macro expand - -5.7.2 racket-expand-file ------------------------- - -‘C-c C-e f’ - - Expand the ‘racket-mode’ buffer’s file in *note -racket-stepper-mode::. - - Uses the ‘macro-debugger’ package to do the expansion. - - You do need to *note racket-run:: the file first; the namespace -active in the REPL is not used. - - If the file is non-trivial and/or is not compiled to a .zo bytecode -file, then it might take many seconds before the original form is -displayed and you can start stepping. - - With a prefix, also expands syntax from racket/base – which can -result in very many expansion steps. - - -File: racket-mode.info, Node: racket-expand-region, Next: racket-expand-definition, Prev: racket-expand-file, Up: Macro expand - -5.7.3 racket-expand-region --------------------------- - -‘C-c C-e r’ - - Expand the active region using *note racket-stepper-mode::. - - Uses Racket’s ‘expand-once’ in the namespace from the most recent -*note racket-run::. - - -File: racket-mode.info, Node: racket-expand-definition, Next: racket-expand-last-sexp, Prev: racket-expand-region, Up: Macro expand - -5.7.4 racket-expand-definition ------------------------------- - -‘C-c C-e x’ - - Expand the definition around point using *note racket-stepper-mode::. - - Uses Racket’s ‘expand-once’ in the namespace from the most recent -*note racket-run::. - - -File: racket-mode.info, Node: racket-expand-last-sexp, Prev: racket-expand-definition, Up: Macro expand - -5.7.5 racket-expand-last-sexp ------------------------------ - -‘C-c C-e e’ - - Expand the sexp before point using *note racket-stepper-mode::. - - Uses Racket’s ‘expand-once’ in the namespace from the most recent -*note racket-run::. - - -File: racket-mode.info, Node: Other, Next: Showing information, Prev: Macro expand, Up: Commands - -5.8 Other -========= - -* Menu: - -* racket-unvisit:: -* racket-mode-start-faster:: - - -File: racket-mode.info, Node: racket-unvisit, Next: racket-mode-start-faster, Up: Other - -5.8.1 racket-unvisit --------------------- - -‘M-,’ - - Return from previous ‘racket-visit-definition’ or *note -racket-visit-module::. - - -File: racket-mode.info, Node: racket-mode-start-faster, Prev: racket-unvisit, Up: Other - -5.8.2 racket-mode-start-faster ------------------------------- - -‘M-x’ ‘racket-mode-start-faster’ ‘RET’ - - Compile Racket Mode’s .rkt files for faster startup. - - Racket Mode is implemented as an Emacs Lisp “front end†that talks to -a Racket process “back endâ€. Because Racket Mode is delivered as an -Emacs package instead of a Racket package, installing it does not do the -‘raco setup’ that is normally done for Racket packages. - - This command will do a ‘raco make’ of Racket Mode’s .rkt files, -creating bytecode files in ‘compiled/’ subdirectories. As a result, -when a *note racket-run:: or *note racket-repl:: command must start the -Racket process, it will start faster. - - If you run this command, ever, you should run it again after: - - • Installing an updated version of Racket Mode. Otherwise, you might - lose some of the speed-up. - - • Installing a new version of Racket and/or changing the value of the - variable *note racket-program::. Otherwise, you might get an error - message due to the bytecode being different versions. - - -File: racket-mode.info, Node: Showing information, Next: Associating edit buffers with REPL buffers, Prev: Other, Up: Commands - -5.9 Showing information -======================= - -* Menu: - -* racket-show-echo-area:: -* racket-show-header-line:: -* racket-show-pos-tip:: - - -File: racket-mode.info, Node: racket-show-echo-area, Next: racket-show-header-line, Up: Showing information - -5.9.1 racket-show-echo-area ---------------------------- - -Show things in the echo area. - - A value for the variable *note racket-show-functions::. - - -File: racket-mode.info, Node: racket-show-header-line, Next: racket-show-pos-tip, Prev: racket-show-echo-area, Up: Showing information - -5.9.2 racket-show-header-line ------------------------------ - -Show things using a buffer header line. - - A value for the variable *note racket-show-functions::. - - When there is nothing to show, keep a blank header-line. That way, -the buffer below doesn’t “jump up and down†by a line as messages appear -and disappear. Only when V is nil do we remove the header line. - - -File: racket-mode.info, Node: racket-show-pos-tip, Prev: racket-show-header-line, Up: Showing information - -5.9.3 racket-show-pos-tip -------------------------- - -Show things using ‘pos-tip-show’ if available. - - A value for the variable *note racket-show-functions::. - - -File: racket-mode.info, Node: Associating edit buffers with REPL buffers, Prev: Showing information, Up: Commands - -5.10 Associating edit buffers with REPL buffers -=============================================== - -* Menu: - -* racket-repl-buffer-name-shared:: -* racket-repl-buffer-name-unique:: -* racket-repl-buffer-name-project:: - - -File: racket-mode.info, Node: racket-repl-buffer-name-shared, Next: racket-repl-buffer-name-unique, Up: Associating edit buffers with REPL buffers - -5.10.1 racket-repl-buffer-name-shared -------------------------------------- - -‘M-x’ ‘racket-repl-buffer-name-shared’ ‘RET’ - - All ‘racket-mode’ edit buffers share one ‘racket-repl-mode’ buffer. - - A value for the variable *note racket-repl-buffer-name-function::. - - -File: racket-mode.info, Node: racket-repl-buffer-name-unique, Next: racket-repl-buffer-name-project, Prev: racket-repl-buffer-name-shared, Up: Associating edit buffers with REPL buffers - -5.10.2 racket-repl-buffer-name-unique -------------------------------------- - -‘M-x’ ‘racket-repl-buffer-name-unique’ ‘RET’ - - Each ‘racket-mode’ edit buffer gets its own ‘racket-repl-mode’ -buffer. - - A value for the variable *note racket-repl-buffer-name-function::. - - -File: racket-mode.info, Node: racket-repl-buffer-name-project, Prev: racket-repl-buffer-name-unique, Up: Associating edit buffers with REPL buffers - -5.10.3 racket-repl-buffer-name-project --------------------------------------- - -‘M-x’ ‘racket-repl-buffer-name-project’ ‘RET’ - - All ‘racket-mode’ buffers in a project share a ‘racket-repl-mode’ -buffer. - - A value for the variable *note racket-repl-buffer-name-function::. - - The “project†is determined by trying, in order: - - • ‘projectile-project-root’ - • ‘vc-root-dir’ - • ‘file-name-directory’ - - -File: racket-mode.info, Node: Variables, Next: Faces, Prev: Commands, Up: Top - -6 Variables -*********** - -* Menu: - -* General variables:: -* REPL variables:: -* Other variables:: -* Experimental debugger variables:: -* Showing information: Showing informationx. - - -File: racket-mode.info, Node: General variables, Next: REPL variables, Up: Variables - -6.1 General variables -===================== - -* Menu: - -* racket-program:: -* racket-command-port:: -* racket-command-timeout:: -* racket-memory-limit:: -* racket-error-context:: -* racket-user-command-line-arguments:: -* racket-path-from-emacs-to-racket-function:: -* racket-path-from-racket-to-emacs-function:: -* racket-xp-after-change-refresh-delay:: -* racket-xp-highlight-unused-regexp:: - - -File: racket-mode.info, Node: racket-program, Next: racket-command-port, Up: General variables - -6.1.1 racket-program --------------------- - -Pathname of the racket executable. - - -File: racket-mode.info, Node: racket-command-port, Next: racket-command-timeout, Prev: racket-program, Up: General variables - -6.1.2 racket-command-port -------------------------- - -Port number for Racket REPL server. - - -File: racket-mode.info, Node: racket-command-timeout, Next: racket-memory-limit, Prev: racket-command-port, Up: General variables - -6.1.3 racket-command-timeout ----------------------------- - -How many seconds to wait for command server responses. - - Note: This is mostly obsolete, fortunately, because it applies only -to commands that must block the Emacs UI until they get a response. -Instead most Racket Mode commands these days receive their response -asychronously. - - -File: racket-mode.info, Node: racket-memory-limit, Next: racket-error-context, Prev: racket-command-timeout, Up: General variables - -6.1.4 racket-memory-limit -------------------------- - -Terminate the Racket process if memory use exceeds this value in MB. - - Changes to this value take effect upon the next *note racket-run::. -A value of 0 means no limit. - - Caveat: This uses Racket’s ‘custodian-limit-memory’, which does not -enforce the limit exactly. Instead, the program will be terminated upon -the first garbage collection where memory exceeds the limit (maybe by a -significant amount). - - -File: racket-mode.info, Node: racket-error-context, Next: racket-user-command-line-arguments, Prev: racket-memory-limit, Up: General variables - -6.1.5 racket-error-context --------------------------- - -The level of context used for *note racket-run:: error stack traces. - - Each level improves stack trace information, but causes your program -to run more slowly. - - • ‘low corresponds to ‘compile-context-preservation-enabled’ ‘#f’. - - • ‘medium corresponds to ‘compile-context-preservation-enabled’ ‘#t’, - which disables some optimizations like inlining. - - • ‘high corresponds to ‘compile-context-preservation-enabled’ ‘#t’ - and to use of ‘errortrace’, which heavily instruments your code and - therefore may be significantly slower. - - Tip: Regardless of this setting, you can enable ‘high errortrace for -a specific *note racket-run:: using a C-u prefix. This lets you -normally run with a faster setting, and temporarily re-run to get a -more-helpful error message. - - -File: racket-mode.info, Node: racket-user-command-line-arguments, Next: racket-path-from-emacs-to-racket-function, Prev: racket-error-context, Up: General variables - -6.1.6 racket-user-command-line-arguments ----------------------------------------- - -List of command-line arguments to supply to your Racket program. - - Accessible in your Racket program in the usual way — the parameter -‘current-command-line-arguments’ and friends. - - This is an Emacs buffer-local variable — convenient to set as a file -local variable. For example at the end of your .rkt file: - - ;; Local Variables: - ;; racket-user-command-line-arguments: ("-f" "bar") - ;; End: - - Set this way, the value must be an *unquoted* list of strings. For -example: - - ("-f" "bar") - - The following values will _not_ work: - - '("-f" "bar") - (list "-f" "bar") - - -File: racket-mode.info, Node: racket-path-from-emacs-to-racket-function, Next: racket-path-from-racket-to-emacs-function, Prev: racket-user-command-line-arguments, Up: General variables - -6.1.7 racket-path-from-emacs-to-racket-function ------------------------------------------------ - -A function used to transform Emacs Lisp pathnames before supplying to -the Racket back end. - - If you run Emacs on Windows Subsystem for Linux, and want to run -Racket programs using Windows Racket.exe rather than Linux racket, you -can set this to ‘racket-wsl-to-windows’. In that case you probably also -want to customize the “reverseâ€: *note -racket-path-from-racket-to-emacs-function::. - - -File: racket-mode.info, Node: racket-path-from-racket-to-emacs-function, Next: racket-xp-after-change-refresh-delay, Prev: racket-path-from-emacs-to-racket-function, Up: General variables - -6.1.8 racket-path-from-racket-to-emacs-function ------------------------------------------------ - -A function used to transform pathnames supplied by the Racket back end -before using them in Emacs. - - The default on Windows replaces back with forward slashes. The -default elsewhere is ‘identity’. - - If you run Emacs on Windows Subsystem for Linux, and want to run -Racket programs using Windows Racket.exe rather than Linux racket, you -can set this to ‘racket-windows-to-wsl’. In that case you probably also -want to customize the “reverseâ€: *note -racket-path-from-emacs-to-racket-function::. - - -File: racket-mode.info, Node: racket-xp-after-change-refresh-delay, Next: racket-xp-highlight-unused-regexp, Prev: racket-path-from-racket-to-emacs-function, Up: General variables - -6.1.9 racket-xp-after-change-refresh-delay ------------------------------------------- - -Seconds to wait before refreshing *note racket-xp-mode:: annotations. - - Set to nil to disable automatic refresh and manually use -‘racket-xp-annotate’. - - -File: racket-mode.info, Node: racket-xp-highlight-unused-regexp, Prev: racket-xp-after-change-refresh-delay, Up: General variables - -6.1.10 racket-xp-highlight-unused-regexp ----------------------------------------- - -Only give *note racket-xp-unused-face:: to unused bindings that match -this regexp. - - The default is to highlight identifiers that do not start with an -underline, which is a common convention. - - -File: racket-mode.info, Node: REPL variables, Next: Other variables, Prev: General variables, Up: Variables - -6.2 REPL variables -================== - -* Menu: - -* racket-repl-buffer-name-function:: -* racket-history-filter-regexp:: -* racket-images-inline:: -* racket-images-keep-last:: -* racket-images-system-viewer:: -* racket-pretty-print:: - - -File: racket-mode.info, Node: racket-repl-buffer-name-function, Next: racket-history-filter-regexp, Up: REPL variables - -6.2.1 racket-repl-buffer-name-function --------------------------------------- - -How to associate ‘racket-mode’ edit buffers with ‘racket-repl-mode’ -buffers. - - The default is nil, which is equivalent to supplying *note -racket-repl-buffer-name-shared::: One REPL buffer is shared. - - Other predefined choices include *note -racket-repl-buffer-name-unique:: and *note -racket-repl-buffer-name-project::. - - This is used when a ‘racket-mode’ buffer is created. Changing this -to a new value only affects ‘racket-mode’ buffers created later. - - Any such function takes no arguments, should look at -‘buffer-file-name’ if necessary, and either ‘setq-default’ or -‘setq-local’ the variable ‘racket-repl-buffer-name’ to a desired -‘racket-repl-mode’ buffer name. As a result, *note racket-run:: -commands will use a buffer of that name, creating it if necessary. - - -File: racket-mode.info, Node: racket-history-filter-regexp, Next: racket-images-inline, Prev: racket-repl-buffer-name-function, Up: REPL variables - -6.2.2 racket-history-filter-regexp ----------------------------------- - -Input matching this regexp are not saved on the history list. Defaults -to a regexp ignoring all inputs of 0, 1, or 2 letters. - - -File: racket-mode.info, Node: racket-images-inline, Next: racket-images-keep-last, Prev: racket-history-filter-regexp, Up: REPL variables - -6.2.3 racket-images-inline --------------------------- - -Whether to display inline images in the REPL. - - -File: racket-mode.info, Node: racket-images-keep-last, Next: racket-images-system-viewer, Prev: racket-images-inline, Up: REPL variables - -6.2.4 racket-images-keep-last ------------------------------ - -How many images to keep in the image cache. - - -File: racket-mode.info, Node: racket-images-system-viewer, Next: racket-pretty-print, Prev: racket-images-keep-last, Up: REPL variables - -6.2.5 racket-images-system-viewer ---------------------------------- - -Which system image viewer program to invoke upon M-x -‘racket-view-last-image’. - - -File: racket-mode.info, Node: racket-pretty-print, Prev: racket-images-system-viewer, Up: REPL variables - -6.2.6 racket-pretty-print -------------------------- - -Use pretty-print instead of print in REPL? - - -File: racket-mode.info, Node: Other variables, Next: Experimental debugger variables, Prev: REPL variables, Up: Variables - -6.3 Other variables -=================== - -* Menu: - -* racket-indent-curly-as-sequence:: -* racket-indent-sequence-depth:: -* racket-pretty-lambda:: -* racket-smart-open-bracket-enable:: -* racket-logger-config:: - - -File: racket-mode.info, Node: racket-indent-curly-as-sequence, Next: racket-indent-sequence-depth, Up: Other variables - -6.3.1 racket-indent-curly-as-sequence -------------------------------------- - -Indent ‘{}’ with items aligned with the head item? - - This is indirectly disabled if *note racket-indent-sequence-depth:: -is 0. This is safe to set as a file-local variable. - - -File: racket-mode.info, Node: racket-indent-sequence-depth, Next: racket-pretty-lambda, Prev: racket-indent-curly-as-sequence, Up: Other variables - -6.3.2 racket-indent-sequence-depth ----------------------------------- - -To what depth should *note racket-indent-line:: search. - - This affects the indentation of forms like ’() ‘() #() – and {} if -*note racket-indent-curly-as-sequence:: is t — but not #’() #‘() ,() -,@(). A zero value disables, giving the normal indent behavior of -DrRacket or Emacs ‘lisp-mode’ derived modes like ‘scheme-mode’. Setting -this to a high value can make indentation noticeably slower. This is -safe to set as a file-local variable. - - -File: racket-mode.info, Node: racket-pretty-lambda, Next: racket-smart-open-bracket-enable, Prev: racket-indent-sequence-depth, Up: Other variables - -6.3.3 racket-pretty-lambda --------------------------- - -Display lambda keywords using λ. This is DEPRECATED. - - Instead use ‘prettify-symbols-mode’ in newer verisons of Emacs, or, -use *note racket-insert-lambda:: to insert actual λ characters. - - -File: racket-mode.info, Node: racket-smart-open-bracket-enable, Next: racket-logger-config, Prev: racket-pretty-lambda, Up: Other variables - -6.3.4 racket-smart-open-bracket-enable --------------------------------------- - -This variable is obsolete and has no effect. - - Instead of using this variable, you may bind the ‘[’ key to the -‘racket-smart-open-bracket’ command in the ‘racket-mode-map’ and/or -‘racket-repl-mode-map’ keymaps. - - -File: racket-mode.info, Node: racket-logger-config, Prev: racket-smart-open-bracket-enable, Up: Other variables - -6.3.5 racket-logger-config --------------------------- - -Configuration of *note racket-logger-mode:: topics and levels - - The topic ‘* respresents the default level used for topics not -assigned a level. Otherwise, the topic symbols are the same as used by -Racket’s ‘define-logger’. - - The levels are those used by Racket’s logging system: ‘debug, ‘info, -‘warning, ‘error, ‘fatal. - - For more information see: - - - The default value sets some known “noisy†topics to be one level -quieter. That way you can set the ‘* topic to a level like ‘debug and -not get overhwelmed by these noisy topics. - - -File: racket-mode.info, Node: Experimental debugger variables, Next: Showing informationx, Prev: Other variables, Up: Variables - -6.4 Experimental debugger variables -=================================== - -* Menu: - -* racket-debuggable-files:: - - -File: racket-mode.info, Node: racket-debuggable-files, Up: Experimental debugger variables - -6.4.1 racket-debuggable-files ------------------------------ - -Used to tell *note racket-run:: what files may be instrumented for -debugging. Must be a list of strings that are pathnames, such as from -‘racket--buffer-file-name’, -or-, a function that returns such a list -given the pathname of the file being run. If any path strings are -relative, they are made absolute using ‘expand-file-name’ with the -directory of the file being run. The symbol ‘run-file may be supplied -in the list; it will be replaced with the pathname of the file being -run. Safe to set as a file-local variable. - - -File: racket-mode.info, Node: Showing informationx, Prev: Experimental debugger variables, Up: Variables - -6.5 Showing information -======================= - -* Menu: - -* racket-show-functions:: - - -File: racket-mode.info, Node: racket-show-functions, Up: Showing informationx - -6.5.1 racket-show-functions ---------------------------- - -A special hook variable to customize ‘racket-show’. - - Example functions include - - • *note racket-show-echo-area:: - • *note racket-show-pos-tip:: - • *note racket-show-header-line:: - - Each function should accept two arguments: VAL and POS. - - VAL is: - - • Non-blank string: Display the string somehow. - - • Blank string: Hide any previously displayed string. - - • nil: Hide any persistent UI that might have been created to show - strings, such as by *note racket-show-header-line::. - - POS is the buffer position for which to show the message, nil meaning -use some default position. - - -File: racket-mode.info, Node: Faces, Prev: Variables, Up: Top - -7 Faces -******* - -* Menu: - -* All:: - - -File: racket-mode.info, Node: All, Up: Faces - -7.1 All -======= - -* Menu: - -* racket-keyword-argument-face:: -* racket-selfeval-face:: -* racket-here-string-face:: -* racket-xp-def-face:: -* racket-xp-use-face:: -* racket-xp-unused-face:: -* racket-logger-config-face:: -* racket-logger-topic-face:: -* racket-logger-fatal-face:: -* racket-logger-error-face:: -* racket-logger-warning-face:: -* racket-logger-info-face:: -* racket-logger-debug-face:: - - -File: racket-mode.info, Node: racket-keyword-argument-face, Next: racket-selfeval-face, Up: All - -7.1.1 racket-keyword-argument-face ----------------------------------- - -Face for ‘#:keyword’ arguments. - - -File: racket-mode.info, Node: racket-selfeval-face, Next: racket-here-string-face, Prev: racket-keyword-argument-face, Up: All - -7.1.2 racket-selfeval-face --------------------------- - -Face for self-evaluating expressions like numbers, symbols, strings. - - -File: racket-mode.info, Node: racket-here-string-face, Next: racket-xp-def-face, Prev: racket-selfeval-face, Up: All - -7.1.3 racket-here-string-face ------------------------------ - -Face for here strings. - - -File: racket-mode.info, Node: racket-xp-def-face, Next: racket-xp-use-face, Prev: racket-here-string-face, Up: All - -7.1.4 racket-xp-def-face ------------------------- - -Face *note racket-xp-mode:: uses to highlight definitions. - - -File: racket-mode.info, Node: racket-xp-use-face, Next: racket-xp-unused-face, Prev: racket-xp-def-face, Up: All - -7.1.5 racket-xp-use-face ------------------------- - -Face *note racket-xp-mode:: uses to highlight uses. - - -File: racket-mode.info, Node: racket-xp-unused-face, Next: racket-logger-config-face, Prev: racket-xp-use-face, Up: All - -7.1.6 racket-xp-unused-face ---------------------------- - -Face *note racket-xp-mode:: uses to highlight unused requires or -definitions. - - -File: racket-mode.info, Node: racket-logger-config-face, Next: racket-logger-topic-face, Prev: racket-xp-unused-face, Up: All - -7.1.7 racket-logger-config-face -------------------------------- - -Face for *note racket-logger-mode:: configuration. - - -File: racket-mode.info, Node: racket-logger-topic-face, Next: racket-logger-fatal-face, Prev: racket-logger-config-face, Up: All - -7.1.8 racket-logger-topic-face ------------------------------- - -Face for *note racket-logger-mode:: topics. - - -File: racket-mode.info, Node: racket-logger-fatal-face, Next: racket-logger-error-face, Prev: racket-logger-topic-face, Up: All - -7.1.9 racket-logger-fatal-face ------------------------------- - -Face for *note racket-logger-mode:: fatal level. - - -File: racket-mode.info, Node: racket-logger-error-face, Next: racket-logger-warning-face, Prev: racket-logger-fatal-face, Up: All - -7.1.10 racket-logger-error-face -------------------------------- - -Face for *note racket-logger-mode:: error level. - - -File: racket-mode.info, Node: racket-logger-warning-face, Next: racket-logger-info-face, Prev: racket-logger-error-face, Up: All - -7.1.11 racket-logger-warning-face ---------------------------------- - -Face for *note racket-logger-mode:: warning level. - - -File: racket-mode.info, Node: racket-logger-info-face, Next: racket-logger-debug-face, Prev: racket-logger-warning-face, Up: All - -7.1.12 racket-logger-info-face ------------------------------- - -Face for *note racket-logger-mode:: info level. - - -File: racket-mode.info, Node: racket-logger-debug-face, Prev: racket-logger-info-face, Up: All - -7.1.13 racket-logger-debug-face -------------------------------- - -Face for *note racket-logger-mode:: debug level. - - - -Tag Table: -Node: Top220 -Node: Introduction3813 -Ref: Introduction-Footnote-14972 -Node: Install5367 -Node: Configure Emacs to use MELPA5688 -Node: Install Racket Mode6161 -Node: Minimal Racket6450 -Node: Uninstall7014 -Node: Update7302 -Node: Configure7749 -Node: Key bindings8905 -Node: Font-lock (syntax highlighting)9522 -Node: Completion10806 -Node: Indent12646 -Node: paredit12867 -Node: smartparens13860 -Node: Edit buffers and REPL buffers14235 -Node: eldoc15129 -Node: Start faster16388 -Node: Unicode input method16613 -Node: Reference17311 -Node: Commands17800 -Node: Edit18083 -Node: racket-insert-lambda18582 -Node: racket-fold-all-tests18850 -Node: racket-unfold-all-tests19087 -Node: racket-tidy-requires19330 -Node: racket-trim-requires20387 -Node: racket-base-requires21107 -Node: racket-indent-line22367 -Node: racket-smart-open-bracket-mode24352 -Node: racket-insert-closing26007 -Node: racket-cycle-paren-shapes26498 -Node: racket-backward-up-list26749 -Node: racket-unicode-input-method-enable27309 -Node: racket-align29319 -Node: racket-unalign31297 -Node: racket-complete-at-point31640 -Node: Explore32062 -Node: racket-xp-mode32280 -Node: racket-xp-visit-definition37469 -Node: racket-xp-describe37923 -Node: racket-xp-documentation39276 -Node: Run39863 -Node: racket-run40280 -Node: racket-run-and-switch-to-repl42047 -Node: racket-run-module-at-point42337 -Node: racket-repl42756 -Node: racket-repl-describe43724 -Node: racket-repl-documentation44969 -Node: racket-repl-visit-definition45762 -Node: racket-racket46538 -Node: racket-profile46759 -Node: racket-profile-mode47474 -Node: racket-logger48535 -Node: racket-logger-mode48948 -Node: racket-debug-mode50318 -Node: Test53793 -Node: racket-test53938 -Node: racket-raco-test54559 -Node: Eval54816 -Node: racket-send-region55008 -Node: racket-send-definition55226 -Node: racket-send-last-sexp55475 -Node: Collections55785 -Node: racket-visit-module56003 -Node: racket-open-require-path56436 -Node: racket-find-collection57106 -Node: Macro expand58063 -Node: racket-stepper-mode58333 -Node: racket-expand-file59381 -Node: racket-expand-region60105 -Node: racket-expand-definition60471 -Node: racket-expand-last-sexp60860 -Node: Other61212 -Node: racket-unvisit61395 -Node: racket-mode-start-faster61630 -Node: Showing information62821 -Node: racket-show-echo-area63092 -Node: racket-show-header-line63354 -Node: racket-show-pos-tip63874 -Node: Associating edit buffers with REPL buffers64151 -Node: racket-repl-buffer-name-shared64484 -Node: racket-repl-buffer-name-unique64923 -Node: racket-repl-buffer-name-project65405 -Node: Variables66007 -Node: General variables66269 -Node: racket-program66744 -Node: racket-command-port66924 -Node: racket-command-timeout67146 -Node: racket-memory-limit67621 -Node: racket-error-context68227 -Node: racket-user-command-line-arguments69258 -Node: racket-path-from-emacs-to-racket-function70117 -Node: racket-path-from-racket-to-emacs-function70804 -Node: racket-xp-after-change-refresh-delay71606 -Node: racket-xp-highlight-unused-regexp72038 -Node: REPL variables72453 -Node: racket-repl-buffer-name-function72796 -Node: racket-history-filter-regexp73812 -Node: racket-images-inline74165 -Node: racket-images-keep-last74412 -Node: racket-images-system-viewer74662 -Node: racket-pretty-print74958 -Node: Other variables75166 -Node: racket-indent-curly-as-sequence75502 -Node: racket-indent-sequence-depth75885 -Node: racket-pretty-lambda76575 -Node: racket-smart-open-bracket-enable76982 -Node: racket-logger-config77438 -Node: Experimental debugger variables78233 -Node: racket-debuggable-files78479 -Node: Showing informationx79173 -Node: racket-show-functions79369 -Node: Faces80126 -Node: All80229 -Node: racket-keyword-argument-face80669 -Node: racket-selfeval-face80879 -Node: racket-here-string-face81138 -Node: racket-xp-def-face81347 -Node: racket-xp-use-face81580 -Node: racket-xp-unused-face81804 -Node: racket-logger-config-face82067 -Node: racket-logger-topic-face82317 -Node: racket-logger-fatal-face82561 -Node: racket-logger-error-face82809 -Node: racket-logger-warning-face83061 -Node: racket-logger-info-face83318 -Node: racket-logger-debug-face83566 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: diff --git a/elpa/racket-mode-20200417.1741/racket-parens.el b/elpa/racket-mode-20200417.1741/racket-parens.el deleted file mode 100644 index e94ec254..00000000 --- a/elpa/racket-mode-20200417.1741/racket-parens.el +++ /dev/null @@ -1,166 +0,0 @@ -;;; racket-parens.el -*- lexical-binding: t; -*- - -;; Copyright (c) 2013-2019 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -;; Things related to parens, paredit, electric-pair-mode - -(require 'racket-custom) -(require 'racket-ppss) -(require 'racket-util) - -;;; racket--self-insert - -(defun racket--self-insert (event) - "Simulate a `self-insert-command' of EVENT. - -Using this intead of `insert' allows self-insert hooks to run, -which is important for things like `'electric-pair-mode'. - -A command using this should probably set its 'delete-selection -property to t so that `delete-selection-mode' works: - - (put 'racket-command 'delete-selection t) - -If necessary the value of the property can be a function, for -example `racket--electric-pair-mode-not-active'." - (let ((last-command-event event)) ;set this for hooks - (self-insert-command (prefix-numeric-value nil)))) - -(defun racket--electric-pair-mode-not-active () - "A suitable value for the 'delete-selection property of -commands that insert parens: Inserted text should replace the -selection unless a mode like `electric-pair-mode' is enabled, in -which case the selection is to be wrapped in parens." - (not (and (boundp 'electric-pair-mode) - electric-pair-mode))) - - -;;; Automatically insert matching \?) \?] or \?} - -(defconst racket--matching-parens - '(( ?\( . ?\) ) - ( ?\[ . ?\] ) - ( ?\{ . ?\} ))) - -(defun racket-insert-closing (&optional prefix) - "Insert a matching closing delimiter. - -With a prefix, insert the typed character as-is. - -This is handy if you're not yet using something like -`paredit-mode', `smartparens-mode', `parinfer-mode', or simply -`electric-pair-mode' added in Emacs 24.5." - (interactive "P") - (let* ((do-it (not (or prefix - (and (string= "#\\" - (buffer-substring-no-properties - (- (point) 2) (point) ))) - (racket--ppss-string-p (syntax-ppss))))) - (open-char (and do-it (racket--open-paren #'backward-up-list))) - (close-pair (and open-char (assq open-char racket--matching-parens))) - (close-char (and close-pair (cdr close-pair)))) - (racket--self-insert (or close-char last-command-event)))) - -(put 'racket-insert-closing 'delete-selection - #'racket--electric-pair-mode-not-active) - -;;; paredit and reader literals - -(defun racket--reader-literal-paredit-space-for-delimiter-predicate (endp _delimiter) - "`paredit-mode' shouldn't insert space beteween # and open delimiters. - -Examples: #() #2() #fl() #hasheq etc. - -This function is a suitable element for the list variable -`paredit-space-for-delimiter-predicates'." - (if (and (racket--mode-edits-racket-p) - (not endp)) - (not (looking-back (rx ?# (* (or (syntax word) (syntax symbol)))) - nil)) - t)) - -(eval-after-load 'paredit - '(add-hook 'paredit-space-for-delimiter-predicates - #'racket--reader-literal-paredit-space-for-delimiter-predicate)) - -;;; paredit and at-expressions - -(defun racket--at-expression-paredit-space-for-delimiter-predicate (endp delimiter) - "`paredit-mode' shouldn't insert space before [ or { in Racket at-expressions. - -This function is a suitable element for the list variable -`paredit-space-for-delimiter-predicates'." - (if (and (racket--mode-edits-racket-p) - (not endp)) - (not (or - ;; @foo[ @foo{ - (and (memq delimiter '(?\[ ?\{)) - (looking-back (rx ?@ (* (or (syntax word) (syntax symbol)))) - nil)) - ;; @foo[]{ - (and (eq delimiter ?\{) - (looking-back (rx ?@ (* (or (syntax word) (syntax symbol))) - ?\[ - (* (or (syntax word) (syntax symbol))) - ?\]) - nil)))) - t)) - -(eval-after-load 'paredit - '(add-hook 'paredit-space-for-delimiter-predicates - #'racket--at-expression-paredit-space-for-delimiter-predicate)) - - -;;; Cycle paren shapes - -(defconst racket--paren-shapes - '( (?\( ?\[ ?\] ) - (?\[ ?\{ ?\} ) - (?\{ ?\( ?\) )) - "This is not user-configurable because we expect them have to - have actual ?\( and ?\) char syntax.") - -(defun racket-cycle-paren-shapes () - "Cycle the sexpr among () [] {}." - (interactive) - (save-excursion - (unless (eq ?\( (char-syntax (char-after))) - (backward-up-list)) - (pcase (assq (char-after) racket--paren-shapes) - (`(,_ ,open ,close) - (delete-char 1) - (insert open) - (backward-char 1) - (forward-sexp 1) - (backward-delete-char 1) - (insert close)) - (_ - (user-error "Don't know that paren shape"))))) - -(defun racket--open-paren (back-func) - "Use BACK-FUNC to find an opening ( [ or { if any. -BACK-FUNC should be something like #'backward-sexp or #'backward-up-list." - (save-excursion - (ignore-errors - (funcall back-func) - (let ((ch (char-after))) - (and (eq ?\( (char-syntax ch)) - ch))))) - -(provide 'racket-parens) - -;; racket-parens.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-parens.elc b/elpa/racket-mode-20200417.1741/racket-parens.elc deleted file mode 100644 index 7cb4903b888591ab975adf073edae0f7509c4343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4585 zcmd5O2eqp5v~3lIQtfkH#mNo1Bdh;> zGIi-qoYsk`Bnet5nM8J+DOqBIJWUbI0p$^0{`KsSA}=eERTSln0n>t#_*T+lAQKsYD1lvwxU^G5 zVSts-K>)oUu&UdGTIF>TQc>nhu}n5txuUpIGzc*XLWrGUE^yPrkOGI=@K!432XL=w z@%}io9If;6Rz0ySqG3^2G-yNG>|k$tsz#P|6;UPwsgx+O%u3RoNNULe;zqZDhM0n) zI@5bYI^?A#??qZ5XBN#`_I?;_q=5~p$9Fm+!wC7wxQsrthM|l^5(^x?{eByT{<2mAuC$4FgJ9 zBqER;X{!UB>MQ{q;5Cz|q1S#`2TVwr@h-y?tk$qJ5K7O-aWEv}ai9-WWnGG*Fxq9d zb$Sqj{k66rr2h3-r#GW9<|Ll}{OF@+4IcZS(lW2Jut4HAk#-zs#-V2HA&wB#7W!0F z0jCr)h+{^B;czkrHWOz=!!rj@XC9s$*TbXZPDdjR*nHdsmm}6pK|zx1d_$%{=^?Yo z#jmyeH)PsG z%j4(1=P>-H%kLfW<45>z*7gl`*Ez;H$2`~R(Jwm9H(GDEaJ7gZNatl8ahO!SG-Vi6 zv>Q>1QDR-{^?kqBafl0s-Ha?qZBTsg?d>XJLr^ob9xbtrwJ1ZoF6<=UV&ayD+|axw z?sRfCqTZ_>lXqKR-;3_P%y#0o5A9ZF8TIjKmp_eEWP?soRKb$5M4?zqnNgqEI`FBe zBRg~V(kL^er#~D~-{pUzg#TR$wUXZx$tq|$-ikVFg?Lau>^EgiZS_wF=?>Io)p;Pg z-jR(#cDDmygd7M^pB0xuE&4BCyrLJEUtRs>>h0z0gFLlM)MlWaaK?&6!^D~NZx?_f zO`VCc90a0yA0IK_CLc3RyPDzmv_=_n8{^TE5GreP!YaE_q5}Razhxz2hG>QjpFQz? zwf6nL`z#i9RS^H{_X0H+KGOt^r#~*Q`=MLO1EP4jqZgmiGW!vCZ!E^8bZPJG=Wp zDnZvYml}OzLj92`_A4!!XnLAZ4C9Qn-l0AH1DaDbja`|UAuavp4dh+bJ3v3Kb|`bB z_jvf+_x}|SxhVDyzW4p>L!aIBcDVca@&BB=AAnCw-Lo@lOEZ^ZT-Zu@y)25qt4nR$ zmNF3NrL`n56h4T{e2O}L2XmCeAnPZX(i(;H*-%U9vypZHP0?tq(XK<$Mch^^QK0k~ zdjh1iD=~;^TVgB_k5>*_d||KVsr}P(pq2a-yy%Kf!Bn(NtwrYu)}vx1S%MbJ^BC zueN)5#y=k&|4efj)J6rzv=|yR^Uvz$0fwM`4QJ3bjxlfsPXMvQ?@R0rj=^*IF8I*> z=5Y7*PPfaM=mzigwKst_opvB%g$53Lb-uYjvEd_!Y=;Y+HUbRD!|?54nq#soA%VRY zIhW(xEMEgfSbe=F3N>iayCG-XVm_b4x$-rGOS?01=p88er}K+1?JwTFykJuv#i-r5 z$#ePU>*25y*$Ca6Q|n=Lb7g>y-}Rf+A9Ux_+s6*Kx*BWK)ZlKq!{v9&8$H~;m|$b) zQ_Tu$z;+_$Ku5aiFZEkM>K?OibbrHbUFKSRhB|gS9DwBE;x%#SbA26vsk@7D-)YT~ J4yqbi{{()go9+Mr diff --git a/elpa/racket-mode-20200417.1741/racket-ppss.el b/elpa/racket-mode-20200417.1741/racket-ppss.el deleted file mode 100644 index ca16116e..00000000 --- a/elpa/racket-mode-20200417.1741/racket-ppss.el +++ /dev/null @@ -1,79 +0,0 @@ -;;; racket-ppss.el - -;; Copyright (c) 2013-2017 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -;; Note: These doc strings are from the Parser State info topic, as of -;; Emacs 25.1. - -(defun racket--ppss-paren-depth (xs) - "The depth in parentheses, counting from 0. -*Warning:* this can be negative if there are more close parens -than open parens between the parser’s starting point and end -point." - (elt xs 0)) - -(defun racket--ppss-containing-sexp (xs) - "The character position of the start of the innermost parenthetical -grouping containing the stopping point; ‘nil’ if none." - (elt xs 1)) - -(defun racket--ppss-last-sexp (xs) - "The character position of the start of the last complete -subexpression terminated; ‘nil’ if none. -Valid only for `parse-partial-sexp' -- NOT `syntax-ppss'." - (elt xs 2)) - -(defun racket--ppss-string-p (xs) - "Non-‘nil’ if inside a string. -More precisely, this is the character that will terminate the -string, or ‘t’ if a generic string delimiter character should -terminate it." - (elt xs 3)) - -(defun racket--ppss-comment-p (xs) - "‘t’ if inside a non-nestable comment (of any comment style; -*note Syntax Flags::); or the comment nesting level if inside a -comment that can be nested." - (elt xs 4)) - -(defun racket--ppss-quote-p (xs) - "‘t’ if the end point is just after a quote character." - (elt xs 5)) - -(defun racket--ppss-min-paren-depth (xs) - "The minimum parenthesis depth encountered during this scan. -Valid only for `parse-partial-sexp' -- NOT `syntax-ppss'." - (elt xs 6)) - -(defun racket--ppss-comment-type (xs) - "What kind of comment is active: ‘nil’ if not in a comment or -in a comment of style ‘a’; 1 for a comment of style ‘b’; 2 for a -comment of style ‘c’; and ‘syntax-table’ for a comment that -should be ended by a generic comment delimiter character." - (elt xs 7)) - -(defun racket--ppss-string/comment-start (xs) - "The string or comment start position. -While inside a comment, this is the position where the comment -began; while inside a string, this is the position where the -string began. When outside of strings and comments, this element -is ‘nil’." - (elt xs 8)) - -(provide 'racket-ppss) - -;; racket-ppss.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-ppss.elc b/elpa/racket-mode-20200417.1741/racket-ppss.elc deleted file mode 100644 index dff175c5e89f2c544399bb27ccccef12f640f525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2705 zcmcImO>f&q5Y4gJKhR?batcd^saljQSyq8IFj62un;v4+hd6*&;!4_Pwaao>meo^! zM*H{jOZsL>>Z48BT&ja%lC#5kZ{ED&GEQbHBW;7LYDiOZ1u0n=t%|N_^O5${t!amgReal0fh?Q`Kq0&R;9BKzTGT+=?!`;_OZq7B{ZXC@}jVl3BEBfzCWC(sSHbg(763mBXKzabA^K zy$DOhyIfVT@i-ec3YR#69+fTkjtuOBT7rpzmKe$gXMlE{#ZVwD`dl7?C@tIGZLU!T}A~Z{CbL477!;h0cEYUg}|~; zArQZyCmA_wwo#Q2v7y|QprwhmpHh<0>z{Aw!EZ6KPqA&M4cNJw|3sbcQD2RF6>8}E zHEiIBXgGwS&5zeUY>k?TGdQK9H?d#zgOLk=echQb=*UtP%-LA%Mm;LSqORX1 z>U5FConLr}r~z?xC~1T|IDp(ASA%>xK19qV!Z|R^>?7#xuWQI#&bb?sep@rNU85W7 ziIL6KTpm<29Mm%GjpOiPZ1ifq+PQ^CDWy*-8%-9TnNhZ8S(YmFpsM?Sj1)@wT%#Nw zKpI^QN=>E1OSYZ(!bn?mEyF;`n-wQGwR@n8XxKs22_7 z;KV`1G)AOl#7O7&mFZYRAl%gC)-eZso+A!TBq8{S9=ub>> zgI;R=hHb8z4109I@OXS#F+514Xv(qYNvn&9dvUj!y5erhUqAJz)nUgzw%cQyxR?)y zR!p(B?SwYRS!!F03%)YLe@NbT nckbLkWm(QQHKQd34Lk5^Pbs#3bcJ?axJP#W`g4K57CPcDrG (nth racket--profile-sort-col a) - (nth racket--profile-sort-col b)))) - "\n")) - (read-only-mode 1) - (goto-char (point-min))) - -(defun racket--profile-sort () - "Toggle sort between Calls and Msec." - (interactive) - (setq racket--profile-sort-col (if (= racket--profile-sort-col 0) 1 0)) - (racket--profile-draw)) - -(defun racket--profile-show-zero () - "Toggle between showing results with zero Calls or Msec." - (interactive) - (setq racket--profile-show-zero (not racket--profile-show-zero)) - (racket--profile-draw)) - -(defun racket--profile-visit () - (interactive) - (let ((win (selected-window))) - (pcase (get-text-property (point) 'racket-profile-location) - (`(,file ,beg ,end) - (setq racket--profile-overlay-this - (make-overlay (save-excursion (beginning-of-line) (point)) - (save-excursion (end-of-line) (point)) - (current-buffer))) - (overlay-put racket--profile-overlay-this 'face 'next-error) - (find-file-other-window file) - (setq racket--profile-overlay-that (make-overlay beg end (current-buffer))) - (overlay-put racket--profile-overlay-that 'face 'next-error) - (goto-char beg) - (add-hook 'pre-command-hook #'racket--profile-remove-overlay) - (select-window win))))) - -(defun racket--profile-remove-overlay () - (delete-overlay racket--profile-overlay-this) - (delete-overlay racket--profile-overlay-that) - (remove-hook 'pre-command-hook #'racket--profile-remove-overlay)) - -(defun racket--profile-next () - (interactive) - (forward-line 1) - (racket--profile-visit)) - -(defun racket--profile-prev () - (interactive) - (forward-line -1) - (racket--profile-visit)) - -(defun racket--profile-quit () - (interactive) - (setq racket--profile-results nil) - (quit-window)) - -(defvar racket-profile-mode-map - (let ((m (make-sparse-keymap))) - (set-keymap-parent m nil) - (mapc (lambda (x) - (define-key m (kbd (car x)) (cadr x))) - '(("q" racket--profile-quit) - ("g" racket--profile-refresh) - ("n" racket--profile-next) - ("p" racket--profile-prev) - ("z" racket--profile-show-zero) - ("RET" racket--profile-visit) - ("," racket--profile-sort))) - m) - "Keymap for Racket Profile mode.") - -(define-derived-mode racket-profile-mode special-mode - "RacketProfile" - "Major mode for results of `racket-profile'. - -\\{racket-profile-mode-map} -" - (setq show-trailing-whitespace nil)) - -(provide 'racket-profile) - -;; racket-profile.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-profile.elc b/elpa/racket-mode-20200417.1741/racket-profile.elc deleted file mode 100644 index bd2215cf58e4a6b4118a4c2f89436183b237901a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7343 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 Lpm(LvU$6WZv84vQ diff --git a/elpa/racket-mode-20200417.1741/racket-repl-buffer-name.el b/elpa/racket-mode-20200417.1741/racket-repl-buffer-name.el deleted file mode 100644 index 9da15d95..00000000 --- a/elpa/racket-mode-20200417.1741/racket-repl-buffer-name.el +++ /dev/null @@ -1,101 +0,0 @@ -;;; racket-repl-buffer-name.el -*- lexical-binding: t; -*- - -;; Copyright (c) 2013-2020 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'racket-custom) -(require 'racket-repl) -(require 'racket-util) - -;;;###autoload -(defun racket-repl-buffer-name-shared () - "All `racket-mode' edit buffers share one `racket-repl-mode' buffer. - -A value for the variable `racket-repl-buffer-name-function'." - (interactive) - (setq-default racket-repl-buffer-name "*Racket REPL*")) - -;;;###autoload -(defun racket-repl-buffer-name-unique () - "Each `racket-mode' edit buffer gets its own `racket-repl-mode' buffer. - -A value for the variable `racket-repl-buffer-name-function'." - (interactive) - (let ((name (format "*Racket REPL <%s>*" (racket--buffer-file-name)))) - (setq-local racket-repl-buffer-name name))) - -;;;###autoload -(defun racket-repl-buffer-name-project () - "All `racket-mode' buffers in a project share a `racket-repl-mode' buffer. - -A value for the variable `racket-repl-buffer-name-function'. - -The \"project\" is determined by trying, in order: - -- `projectile-project-root' -- `vc-root-dir' -- `file-name-directory'" - (interactive) - (let* ((dir (file-name-directory (racket--buffer-file-name))) - (root (or (and (fboundp 'projectile-project-root) - (projectile-project-root dir)) - (and (fboundp 'vc-root-dir) - (vc-root-dir)) - dir)) - (name (format "*Racket REPL <%s>*" root))) - (setq-local racket-repl-buffer-name name))) - -(defun racket-mode-maybe-offer-to-kill-repl-buffer () - "Maybe offer to kill a `racket-repl-mode' buffer. - -A value for `kill-buffer-hook'. - -Offer to kill a `racket-repl-mode' buffer when killing the last -`racket-mode' buffer using it. Although is not necessary to do -so, a user might want to do some \"cleanup\" -- especially if -they're using a `racket-repl-buffer-name-function' such as -`racket-repl-buffer-name-unique'." - (when (eq major-mode 'racket-mode) - (pcase (get-buffer racket-repl-buffer-name) - ((and (pred bufferp) repl-buffer) - (let ((n (1- - (length - (racket--buffers-using-repl racket-repl-buffer-name))))) - (if (zerop n) - (when (y-or-n-p - (format "No other buffers using %s -- also kill it? " - racket-repl-buffer-name)) - ;; They already said yes. Avoid another prompt about - ;; killing the buffer's process. - (pcase (get-buffer-process repl-buffer) - ((and (pred processp) repl-process) - (set-process-query-on-exit-flag repl-process nil))) - (kill-buffer repl-buffer)) - (message "%s other buffer%s still using %s" - n - (if (= n 1) "" "s") - racket-repl-buffer-name))))))) - -(defun racket--buffers-using-repl (repl-buffer-name) - (seq-filter (lambda (buffer) - (with-current-buffer buffer - (and (eq major-mode 'racket-mode) - (equal racket-repl-buffer-name repl-buffer-name)))) - (buffer-list))) - -(provide 'racket-repl-buffer-name) - -;; racket-repl-buffer-name.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-repl-buffer-name.elc b/elpa/racket-mode-20200417.1741/racket-repl-buffer-name.elc deleted file mode 100644 index 86bd58191be112f8d156d8e49869f0aeeb2c2fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3006 zcmc&$TW{Mo6n64ZECLGjZ4Vo;6QzOUA`Eni?PS?43(_rEFI(C^#RWo3bj(H~9g%Y8 z{ra6lNw#wXQWV1sC?Un8L-IQxzmEsUua3TMwOZc6!2ulUd?GWEx{g$Eob$xMR1`*P z1yOG&b|cr)j)7+x=!uoN{D)f{Hanghd_R^3MwkUkBMhW7#dDcJsuN=isV>YmjuyrO zPg9Y?e3o#3C)&T0Bh{EgX$y%~mSb>fM{Ez@D0cYn=;Q>FF)w&xaf#b*dahD18WOHx zC?M1P#w7Jt3S;{b&JS`tv+*YdEulB{~)058@!eCtM#yAvNfU zmOC+ag1!%Dg}5qZApp_16qY5Wu{v*hg_vYbyR~u%Sd74ELdPdPz?Nf`v&(+Y0Att8@-(b{1>MV95_Ax^VJLg zBgC+^@f>!b8^#?_2ulUZE*$e@JYV}ARNz8b0}>y7t>$6>3ofOSSBQIqOXx6(gBTE) zIM~G}sMr#PAyO!O*07~w$sLHWfH}7}k%AvK%}+1<23A&=k1-4PQcMstjuHo_KFe&sWk=UAe{6B-&^WGy-{dzhdP_={V%B~X+ZzmSloi&onlV+C zj(q&AMa>mz_r9ez4RzhnH`MJyJwla_gC0KpRboY@BcI2Lrqqj#Jj{mCP?sv5G=;p4 z6fB`cdhsCL?qyZCKCxjK?=5H*_jchmpP}GuQZ29=E+y*PoB(FrSg#SkWwAt8q!?*;@F3W+E-%JJJ+e3@5@8H4ka`;Z(ldG+cYrQh zKrS!F7OuIn)fie_j^s@;!Bsi&fiVzfA`*$NJOerMP=se~6z*!aTR7aS!(d9(JZ|Qz zzO4t`V&(9(UiiNTaadU0eU{ zUES_|Ai5t=aKB=27_JR`VtV%vd>clqm?DhbQHXcz6yfd)zU-1e^m?n6dxkxXjDpC0 zg}I`D25`P8baVWU*`kOdPN)^HJ;#rumE}LqYIFWc7tR8kQ?RtlN)ne0mE59cR_&^j z=Ck^>VXjP!vOoYchS?RH%umM~4H^qt%uTtf>ZYN(^9-*$j_uO^4F1w=Bv8aCI*Igu z0%VePhoNm0IFn-HZ)w>m;}_(BE>pAGoalIgJj0om7l2)Zmx!!p*QW6y1m6eWpr`IN zC$t~;JI+v}F5snRq@3-tUq8Hjd3?&=9KJs8+$Vp`Nom zN0Ch|eMlBqU5$*mVyML^?v+(7?pH2tK_s{$imYLp*m3h|YoM?b45B#dRB5Jo1x?T! ur%uV??DJSahUjBXML<*-bo{!YER)7AkVC>ogxnUEYAW#-_|UDW racket-repl-mode associations - -;; There are some nuances here regarding these variables being -;; buffer-local or not, and, whether the variables have any meaning in -;; certain modes, or not. We use Emacs variable semantics to handle -;; the association between `racket-mode' edit buffers and -;; `racket-repl-mode' buffers, for a variety of use cases the user -;; might prefer. These range from all edit buffers sharing one REPL -;; buffer (the traditional default for Racket Mode), up to each edit -;; buffers having its own REPL (as in Dr Racket), or anything in -;; between (such as one REPL per projectile project, or whatever). -;; Some of these scenarios might benefit from some higher-level UI. -;; But ultimately they reduce to setting the variable -;; `racket-repl-buffer-name' globally and/or locally for `racket-mode' -;; buffers -- that is the fundamental representation. Similarly, each -;; `racket-repl-mode' buffer has an always-buffer-local value for the -;; variable `racket--repl-session-id'. (Note that -;; `racket-repl-buffer-name' only has meaning for `racket-mode' -;; buffers, and `racket--repl-session-id' only has meaning for -;; `racket-repl-mode' buffers. Emacs variables exist for all buffers -;; using all major modes. All we can do is remember in which buffers -;; they mean something as opposed to being ignored..) - -(defvar racket-repl-buffer-name "*Racket REPL*" - "The name of the `racket-repl-mode' buffer associated with `racket-mode' buffer. - -Important: This variable only means something in each -`racket-mode' buffer. It has no meaning in `racket-repl-mode' or -other buffers. - -By default all `racket-mode' edit buffers share the same REPL. -However, a buffer may `setq-local' this to some other value. See -the defcustom `racket-repl-buffer-name-function' and example -values for it in racket-repl-buffer-name.el.") - -(defvar-local racket--repl-session-id nil - "The REPL session ID returned from the back end. - -Must be supplied in command requests, although for some commands -it can be nil. - -Important: This variable only means something in each -`racket-repl-mode' buffer. It has no meaning in `racket-mode' or -other buffers. Futhermore, it is /always/ buffer-local in each -`racket-repl-mode' buffer. Instead of accessing this directly, -use the function `racket--repl-session-id', which helps select -the correct `racket-repl-mode' buffer, if any.") - -(defun racket--repl-session-id () - "Use this to get a REPL session ID. -The result might be nil if no REPL buffer exists, or if it does -but does not have a live session." - (if (eq major-mode 'racket-repl-mode) - racket--repl-session-id - (let ((buffer (get-buffer racket-repl-buffer-name))) - (when buffer - (with-current-buffer racket-repl-buffer-name - racket--repl-session-id))))) - -(defun racket--call-with-repl-buffer (thunk) - (pcase (get-buffer (if (eq major-mode 'racket-repl-mode) - (buffer-file-name) - racket-repl-buffer-name)) - ((and (pred bufferp) buf) - (with-current-buffer buf (funcall thunk))))) - -(defmacro with-racket-repl-buffer (&rest body) - "Execute forms in BODY with `racket-repl-mode' temporarily current buffer." - (declare (indent 0) (debug t)) - `(racket--call-with-repl-buffer (lambda () ,@body))) - -(defun racket--repl-live-p () - "Does a Racket REPL buffer exist and have a live Racket process?" - (and (racket--repl-session-id) - (comint-check-proc racket-repl-buffer-name))) - -;;; Misc - -(defun racket-repl--input-filter (str) - "Don't save anything matching `racket-history-filter-regexp'." - (not (string-match racket-history-filter-regexp str))) - -(defalias 'racket-repl-eval-or-newline-and-indent #'racket-repl-submit) - -(defun racket-repl-submit (&optional prefix) - "Submit your input to the Racket REPL. - -If the REPL is running a Racket lang whose language-info has a -'drracket:submit-predicate, that is first called to see if the -input is valid to be submitted. - -With a prefix: After sending your input and a newline, also calls -`process-send-eof' -- because some langs require EOF to mark the -end of an interactive expression/statement." - (interactive "P") - (let* ((proc (get-buffer-process (current-buffer))) - (_ (unless proc (user-error "Current buffer has no process"))) - (text (substring-no-properties (funcall comint-get-old-input))) - (submitp - (if racket-use-repl-submit-predicate - (cl-case (racket--cmd/await (racket--repl-session-id) - `(repl-submit? ,text t)) - ((t) t) - ((nil) (user-error "Not a complete expression, according to the current lang's submit-predicate.")) - ((default) (racket--repl-complete-sexp-p proc))) - (racket--repl-complete-sexp-p proc)))) - (if (not submitp) - (newline-and-indent) - (comint-send-input) - (remove-text-properties comint-last-input-start - comint-last-input-end - '(font-lock-face comint-highlight-input)) - ;; Hack for datalog/lang - (when prefix (process-send-eof proc))))) - -(defun racket--repl-complete-sexp-p (proc) - (condition-case nil - (let* ((beg (marker-position (process-mark proc))) - (end (save-excursion - (goto-char beg) - (forward-list 1) ;scan-error unless complete sexp - (point))) - (blankp (save-excursion - (save-match-data - (goto-char beg) - (equal end - (re-search-forward (rx (1+ (or (syntax whitespace) - (syntax comment-start) - (syntax comment-end)))) - end - t)))))) - (not (or (equal beg end) blankp))) - (scan-error nil))) - -(defun racket-repl-break () - "Send a break to the REPL program's main thread." - (interactive) - (cond ((racket--cmd-open-p) ;don't auto-start the back end - (racket--cmd/async (racket--repl-session-id) `(break break))) - (t - (user-error "Back end is not running")))) - -(defun racket-repl-exit (&optional killp) - "Send a terminate break to the REPL program's main thread. - -Effectively the same as entering `(exit)` at the prompt, but -works even when the module language doesn't provide any binding -for `exit`. - -With a prefix, closes the entire back end process --- the command -server and all REPL sessions." - (interactive "P") - (cond (killp - (message "Killing entire Racket Mode back end process") - (racket--cmd-close)) - ((racket--cmd-open-p) ;don't auto-start the back end - (racket--cmd/async (racket--repl-session-id) `(break terminate))) - (t - (user-error "Back end is not running")))) - -;;;###autoload -(defun racket-repl (&optional noselect) - "Show a Racket REPL buffer in some window. - -*IMPORTANT* - -The main, intended use of Racket Mode's REPL is that you -`find-file' some specific .rkt file, then `racket-run' it. The -REPL will then match that file. - -If the REPL isn't running, and you want to start it for no file -in particular? Then you could use this command. But the resulting -REPL will have a minimal \"#lang racket/base\" namespace. You -could enter \"(require racket)\" if you want the equivalent of -\"#lang racket\". You could also \"(require racket/enter)\" if -you want things like \"enter!\". But in some sense you'd be -\"using it wrong\". If you really don't want to use Racket Mode's -REPL as intended, then you might as well use a plain Emacs shell -buffer to run command-line Racket." - (interactive "P") - (cl-labels - ((display-and-maybe-select - () - (display-buffer racket-repl-buffer-name) - (unless noselect - (select-window (get-buffer-window racket-repl-buffer-name t))))) - (if (racket--repl-live-p) - (display-and-maybe-select) - (racket--repl-start - (lambda () - (racket--repl-refresh-namespace-symbols) - (display-and-maybe-select)))))) - -;;; Run - -;; Note: These commands are to be run when current-buffer is a -;; `racket-mode' buffer. The reason they are defined here is because -;; they use a `racket-repl-mode' buffer, and, one could use -;; `racket-mode' to edit files without using these commands. - -;;;###autoload -(defun racket-run (&optional prefix) - "Save the buffer in REPL and run your program. - -Runs the \"main\" submodule, if any, otherwise the file's module. -See also `racket-run-module-at-point'. - -With one C-u prefix, uses errortrace for improved stack traces. -Otherwise follows the `racket-error-context' setting. - -With two C-u prefixes, instruments code for step debugging. See -`racket-debug-mode' and the variable `racket-debuggable-files'. - -Each run occurs within a Racket custodian. Any prior run's -custodian is shut down, releasing resources like threads and -ports. Each run's evaluation environment is reset to the contents -of the source file. In other words, like Dr Racket, this provides -the benefit that your source file is the \"single source of -truth\". At the same time, the run gives you a REPL inside the -namespace of the module, giving you the ability to explore it -interactively. Any explorations are temporary, unless you also -make them to your source file, they will be lost on the next run. - -See also `racket-run-and-switch-to-repl', which is even more like -Dr Racket's Run command because it selects the REPL window after -running. - -In the `racket-repl-mode' buffer, output that describes a file -and position is automatically \"linkified\". Examples of such -text include: - -- Racket error messages. -- rackunit test failure location messages. -- print representation of path objects. - -To visit these locations, move point there and press RET or mouse -click. Or, use the standard `next-error' and `previous-error' -commands." - (interactive "P") - (racket--repl-run (list (racket--buffer-file-name) 'main) - (pcase prefix - (`(4) 'high) - (`(16) 'debug) - (_ racket-error-context)))) - -;;;###autoload -(defun racket-run-module-at-point (&optional prefix) - "Save the buffer and run the moudule at point. - -Like `racket-run' but runs the innermost module around point. -This may be a submodule nested at any depth, or the file's -module." - (interactive "P") - (racket--repl-run (racket--what-to-run) - (pcase prefix - (`(4) 'high) - (`(16) 'debug) - (_ racket-error-context)))) - -(defun racket-run-with-errortrace () - "Run with `racket-error-context' temporarily set to \"high\". -This is just `racket-run' with a C-u prefix. Defined as a function so -it can be a menu target." - (interactive) - (racket-run '(4))) - -(defun racket-run-with-debugging () - "Run with `racket-error-context' temporarily set to 'debug. -This is just `racket-run' with a double C-u prefix. Defined as a -function so it can be a menu target." - (interactive) - (racket-run '(16))) - -(defun racket-run-and-switch-to-repl (&optional prefix) - "This is `racket-run' followed by selecting the REPL buffer window." - (interactive "P") - (racket--repl-run (list (racket--buffer-file-name) 'main) - (pcase prefix - (`(4) 'high) - (`(16) 'debug) - (_ racket-error-context)) - (lambda () - (display-buffer racket-repl-buffer-name) - (select-window (get-buffer-window racket-repl-buffer-name t))))) - -(defun racket-test (&optional coverage) - "Run the \"test\" submodule. - -With prefix, runs with coverage instrumentation and highlights -uncovered code. - -Put your tests in a \"test\" submodule. For example: - -#+BEGIN_SRC racket - (module+ test - (require rackunit) - (check-true #t)) -#+END_SRC - -Any rackunit test failure messages show the location. You may use -`next-error' to jump to the location of each failing test. - -See also: -- `racket-fold-all-tests' -- `racket-unfold-all-tests' -" - (interactive "P") - (let ((mod-path (list 'submod (racket--buffer-file-name) 'test)) - (buf (current-buffer))) - (if (not coverage) - (racket--repl-run mod-path) - (message "Running test submodule with coverage instrumentation...") - (racket--repl-run - mod-path - 'coverage - (lambda () - (message "Getting coverage results...") - (racket--cmd/async - (racket--repl-session-id) - `(get-uncovered) - (lambda (xs) - (pcase xs - (`() (message "Full coverage.")) - ((and xs `((,beg0 . ,_) . ,_)) - (message "Missing coverage in %s place(s)." (length xs)) - (with-current-buffer buf - (dolist (x xs) - (let ((o (make-overlay (car x) (cdr x) buf))) - (overlay-put o 'name 'racket-uncovered-overlay) - (overlay-put o 'priority 100) - (overlay-put o 'face font-lock-warning-face))) - (goto-char beg0))))))))))) - -(add-hook 'racket--repl-before-run-hook #'racket--remove-coverage-overlays) - -(defun racket--remove-coverage-overlays () - (remove-overlays (point-min) (point-max) 'name 'racket-uncovered-overlay)) - -(defvar-local racket-user-command-line-arguments - nil - "List of command-line arguments to supply to your Racket program. - -Accessible in your Racket program in the usual way --- the -parameter `current-command-line-arguments` and friends. - -This is an Emacs buffer-local variable --- convenient to set as a -file local variable. For example at the end of your .rkt file: - -#+BEGIN_SRC elisp - ;; Local Variables: - ;; racket-user-command-line-arguments: (\"-f\" \"bar\") - ;; End: -#+END_SRC - -Set this way, the value must be an *unquoted* list of strings. -For example: - -#+BEGIN_SRC elisp - (\"-f\" \"bar\") -#+END_SRC - -The following values will /not/ work: - -#+BEGIN_SRC elisp - '(\"-f\" \"bar\") - (list \"-f\" \"bar\") -#+END_SRC -") - -(defvar racket--repl-before-run-hook nil - "Thunks to do before each `racket--repl-run'.") - -(defvar racket--repl-after-run-hook nil - "Thunks to do after each `racket--repl-run'. -Here \"after\" means that the run has completed and e.g. the REPL -is waiting at another prompt.") - -(defun racket--repl-run (&optional what-to-run context-level callback) - "Do an initial or subsequent run. - -WHAT-TO-RUN should be a cons of a file name to a list of -submodule symbols. Or if nil, defaults to `racket--what-to-run'. - -CONTEXT-LEVEL should be a valid value for the variable -`racket-error-context', 'coverage, or 'profile. Or if nil, -defaults to the variable `racket-error-context'. - -CALLBACK is used as the callback for `racket--cmd/async'; it may -be nil which is equivalent to #'ignore. - -- If the REPL is not live, create it. - -- If the REPL is live, send a 'run command to the backend's TCP - server." - (unless (eq major-mode 'racket-mode) - (user-error "Only works from a `racket-mode' buffer")) - (run-hook-with-args 'racket--repl-before-run-hook) - (let* ((cmd (racket--repl-make-run-command (or what-to-run (racket--what-to-run)) - (or context-level racket-error-context))) - (after (lambda (_ignore) - (run-hook-with-args 'racket--repl-after-run-hook) - (when callback - (funcall callback))))) - (cond ((racket--repl-live-p) - (racket--cmd/async (racket--repl-session-id) cmd after) - (display-buffer racket-repl-buffer-name)) - (t - (racket--repl-start - (lambda () - (racket--cmd/async (racket--repl-session-id) cmd after) - (display-buffer racket-repl-buffer-name))))))) - -(defun racket--repl-make-run-command (what-to-run &optional context-level) - "Form a `run` command sexpr for the backend. -WHAT-TO-RUN may be nil, meaning just a `racket/base` namespace." - (let ((context-level (or context-level racket-error-context))) - (list 'run - what-to-run - racket-memory-limit - racket-pretty-print - context-level - racket-user-command-line-arguments - (when (and what-to-run (eq context-level 'debug)) - (racket--debuggable-files (car what-to-run)))))) - -(defun racket--repl-start (callback) - "Create a `comint-mode' / `racket-repl-mode' buffer connected to a REPL session. - -Sets `racket--repl-session-id'. - -This does not display the buffer or change the selected window." - (racket--cmd/async - nil - `(no-op) ;automatically start back-end if necessary - (lambda (_n/a) - (with-current-buffer (get-buffer-create racket-repl-buffer-name) - ;; Add a pre-output hook that reads `(ok ,id) -- possibly over - ;; multiple calls -- to set `racket--repl-session-id' then - ;; removes itself. - (let ((hook nil) - (buf (generate-new-buffer " *racket-repl-session-id-reader*"))) - (setq hook (lambda (txt) - (with-current-buffer buf - (goto-char (point-max)) - (insert txt) - (goto-char (point-min))) - (pcase (ignore-errors (read buf)) - (`(ok ,id) - (setq racket--repl-session-id id) - (run-with-timer 0.001 nil callback) - (remove-hook 'comint-preoutput-filter-functions hook t) - (prog1 - (with-current-buffer buf - (buffer-substring (if (eq (char-after) ?\n) - (1+ (point)) - (point)) - (point-max))) - (kill-buffer buf))) - (_ "")))) - (add-hook 'comint-preoutput-filter-functions hook nil t)) - - (make-comint-in-buffer racket-repl-buffer-name - (current-buffer) - (cons "127.0.0.1" racket-command-port)) - (process-send-string (get-buffer-process (current-buffer)) - (format "%S\n" racket--cmd-auth)) - (set-process-coding-system (get-buffer-process (current-buffer)) - 'utf-8 'utf-8) ;for e.g. λ - (racket-repl-mode))))) - -;;; Misc - -(defun racket-repl-file-name () - "Return the file running in the REPL, or nil. - -The result can be nil if the REPL is not started, or if it is -running no particular file." - (when (comint-check-proc racket-repl-buffer-name) - (racket--cmd/await (racket--repl-session-id) `(path)))) - -(defun racket--in-repl-or-its-file-p () - "Is current-buffer `racket-repl-mode' or buffer for file active in it?" - (or (eq (current-buffer) - (get-buffer racket-repl-buffer-name)) - (let ((buf-file (racket--buffer-file-name)) - (repl-file (racket-repl-file-name))) - (and buf-file repl-file (string-equal buf-file repl-file))))) - -(defun racket-repl-switch-to-edit () - "Switch to the window for the buffer of the file running in the REPL. - -If no buffer is visting the file, `find-file' it in `other-window'. - -If the REPL is running no file -- if the prompt is `>` -- use the -most recent `racket-mode' buffer, if any." - (interactive) - (pcase (racket-repl-file-name) - (`() (let ((buffer (racket--most-recent-racket-mode-buffer))) - (unless buffer - (user-error "There are no racket-mode buffers")) - (pop-to-buffer buffer t))) - (path (let ((buffer (find-buffer-visiting path))) - (if buffer - (pop-to-buffer buffer t) - (other-window 1) - (find-file path)))))) - -(defun racket--most-recent-racket-mode-buffer () - (cl-some (lambda (b) - (with-current-buffer b - (and (eq major-mode 'racket-mode) b))) - (buffer-list))) - -;;; send to REPL - -(defun racket--send-region-to-repl (start end) - "Internal function to send the region to the Racket REPL. - -Before sending the region, calls `racket-repl' and -`racket--repl-forget-errors'. Also inserts a ?\n at the process -mark so that output goes on a fresh line, not on the same line as -the prompt. - -Afterwards displays the buffer in some window." - (unless (and start end) - (error "start and end must not be nil")) - ;; Save the current buffer in case something changes it before we - ;; call `comint-send-region'; see e.g. issue 407. - (let ((source-buffer (current-buffer))) - (racket-repl t) - (racket--repl-forget-errors) - (let ((proc (get-buffer-process racket-repl-buffer-name))) - (with-racket-repl-buffer - (save-excursion - (goto-char (process-mark proc)) - (insert ?\n) - (set-marker (process-mark proc) (point)))) - (with-current-buffer source-buffer - (comint-send-region proc start end) - (comint-send-string proc "\n"))) - (display-buffer racket-repl-buffer-name))) - -(defun racket-send-region (start end) - "Send the current region (if any) to the Racket REPL." - (interactive "r") - (unless (region-active-p) - (user-error "No region")) - (racket--send-region-to-repl start end)) - -(defun racket-send-definition (&optional prefix) - "Send the current definition to the Racket REPL." - (interactive "P") - (save-excursion - (end-of-defun) - (let ((end (point))) - (beginning-of-defun) - (if prefix - (racket--debug-send-definition (point) end) - (racket--send-region-to-repl (point) end))))) - -(defun racket-send-last-sexp () - "Send the previous sexp to the Racket REPL. - -When the previous sexp is a sexp comment the sexp itself is sent, -without the #; prefix." - (interactive) - (racket--send-region-to-repl (racket--repl-last-sexp-start) - (point))) - -(defun racket-eval-last-sexp () - "Eval the previous sexp asynchronously and `message' the result." - (interactive) - (unless (racket--repl-live-p) - (user-error "No REPL session available")) - (racket--cmd/async - (racket--repl-session-id) - `(eval - ,(buffer-substring-no-properties (racket--repl-last-sexp-start) - (point))) - (lambda (v) - (message "%s" v)))) - -(defun racket--repl-last-sexp-start () - (save-excursion - (condition-case () - (progn - (backward-sexp) - (if (save-match-data (looking-at "#;")) - (+ (point) 2) - (point))) - (scan-error (user-error "There isn't a complete s-expression before point"))))) - -(defun racket--repl-forget-errors () - "Forget existing errors in the REPL. -Although they remain clickable they will be ignored by -`next-error' and `previous-error'" - (with-racket-repl-buffer - (compilation-forget-errors) - ;; `compilation-forget-errors' may have just set - ;; `compilation-messages-start' to a marker at position 1. But in - ;; that case process output (including error messages) will be - ;; inserted ABOVE the marker, in which case `next-error' won't see - ;; them. Instead use a non-marker position like 1 or use nil. - (when (and (markerp compilation-messages-start) - (equal (marker-position compilation-messages-start) 1) - (equal (marker-buffer compilation-messages-start) (current-buffer))) - (setq compilation-messages-start nil)))) - -(add-hook 'racket--repl-before-run-hook #'racket--repl-forget-errors) - -;;; Inline images in REPL - -(defvar racket-image-cache-dir nil) - -(defun racket-repl--list-image-cache () - "List all the images in the image cache." - (and racket-image-cache-dir - (file-directory-p racket-image-cache-dir) - (let ((files (directory-files-and-attributes - racket-image-cache-dir t "racket-image-[0-9]*.png"))) - (mapcar #'car - (sort files (lambda (a b) - (< (float-time (nth 6 a)) - (float-time (nth 6 b))))))))) - -(defun racket-repl--clean-image-cache () - "Clean all except for the last `racket-images-keep-last' -images in 'racket-image-cache-dir'." - (interactive) - (dolist (file (butlast (racket-repl--list-image-cache) - racket-images-keep-last)) - (delete-file file))) - -(defun racket-repl-display-images (_txt) - "Replace all image patterns with actual images. -A value for the variable `comint-output-filter-functions'." - (with-silent-modifications - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "\"#\"" nil t) - ;; can't pass a filename to create-image because emacs might - ;; not display it before it gets deleted (race condition) - (let* ((file (match-string 1)) - (begin (match-beginning 0)) - (end (match-end 0))) - (delete-region begin end) - (goto-char begin) - (if (and racket-images-inline (display-images-p)) - (insert-image (create-image file) "[image]") - (goto-char begin) - (insert "[image] ; use M-x racket-view-last-image to view")) - (setq racket-image-cache-dir (file-name-directory file)) - (racket-repl--clean-image-cache)))))) - -(defun racket-view-last-image (n) - "Open the last displayed image using `racket-images-system-viewer'. - -With prefix arg, open the N-th last shown image." - (interactive "p") - (let ((images (reverse (racket-repl--list-image-cache)))) - (if (>= (length images) n) - (start-process "Racket image view" - nil - racket-images-system-viewer - (nth (- n 1) images)) - (error "There aren't %d recent images" n)))) - -;;; Completion - -(defvar racket--repl-namespace-symbols nil) - -(defun racket--repl-refresh-namespace-symbols () - (racket--cmd/async - (racket--repl-session-id) - '(syms) - (lambda (syms) - (setq racket--repl-namespace-symbols syms)))) - -(add-hook 'racket--repl-after-run-hook #'racket--repl-refresh-namespace-symbols) - -(defun racket--repl-completion-candidates-for-prefix (prefix) - (all-completions prefix racket--repl-namespace-symbols)) - -(defun racket-repl-complete-at-point () - "A value for the variable `completion-at-point-functions'. - -Completion candidates are drawn from the REPL namespace symbols. - -Returns extra :company-doc-buffer and :company-location -properties for use by the `company-mode' backend `company-capf' --- but not :company-docsig, because it is frequently impossible -to supply this quickly enough or at all." - (racket--call-with-completion-prefix-positions - (lambda (beg end) - (list beg - end - (completion-table-dynamic - #'racket--repl-completion-candidates-for-prefix) - :predicate #'identity - :exclusive 'no - :company-doc-buffer #'racket--repl-company-doc-buffer - :company-location #'racket--repl-company-location)))) - -(defun racket--repl-company-doc-buffer (str) - (racket--do-describe 'namespace (racket--repl-session-id) str)) - -(defun racket--repl-company-location (str) - (pcase (racket--cmd/await (racket--repl-session-id) - `(def-in-namespace ,str)) - (`(,path ,line ,_) (cons path line)))) - -(defun racket-repl-eldoc-function () - "A value for the variable `eldoc-documentation-function'. - -By default `racket-repl-mode' sets `eldoc-documentation-function' -to nil -- no `eldoc-mode' support. You may set it to this -function in a `racket-repl-mode-hook' if you really want to use -`eldoc-mode'. But it is not a very satisfying experience because -Racket is not a very \"eldoc friendly\" language. - -Sometimes we can discover argument lists from source -- but this -can be slow. - -For code that has been run in the REPL, we can use its namespace -to discover contracts or types -- but otherwise we cannot. - -Many interesting Racket forms are syntax (macros) without any -easy way to discover their \"argument lists\". Similarly many -Racket functions or syntax are defined in #%kernel and the source -is not available. If they have documentation with a \"bluebox\", -we can show it -- but often it is not a single-line format -typical for eldoc. - -So if you are expecting an eldoc experience similar to Emacs -Lisp, you will be disappointed. - -A more satisfying experience is to use `racket-repl-describe' or -`racket-repl-documentation'." - (racket--do-eldoc 'namespace (racket--repl-session-id))) - -;;; describe - -(defun racket-repl-describe (&optional prefix) -"Describe the identifier at point in a `*Racket Describe*` buffer. - -The intent is to give a quick reminder or introduction to -something, regardless of whether it has installed documentation --- and to do so within Emacs, without switching to a web browser. - -This buffer is also displayed when you use `company-mode' and -press F1 or C-h in its pop up completion list. - -- If the identifier has installed Racket documentation, then a - simplified version of the HTML is presented in the buffer, - including the \"blue box\", documentation prose, and examples. - -- Otherwise, if the identifier is a function, then its signature - is displayed, for example `(name arg-1-name arg-2-name)`. If it - has a contract or a Typed Racket type, that is also displayed. - -You can quit the buffer by pressing q. Also, at the bottom of the -buffer are Emacs buttons -- which you may navigate among using -TAB, and activate using RET -- for `racket-repl-visit-definition' -and `racket-repl-documentation'." - (interactive "P") - (pcase (racket--symbol-at-point-or-prompt prefix "Describe: " - racket--repl-namespace-symbols) - ((and (pred stringp) str) - (racket--do-describe - 'namespace - (racket--repl-session-id) - str - t - (lambda () - (racket--do-visit-def-or-mod (racket--repl-session-id) - `(def namespace ,str))) - (lambda () - (racket--cmd/async (racket--repl-session-id) - `(doc namespace ,str) - #'browse-url)))))) - -;;; Visit - -(defun racket-repl-visit-definition (&optional prefix) - "Visit definition of identifier at point. - -If there is no identifier at point, prompt for it. - -With a prefix, always prompt for the identifier. - -Use `racket-unvisit' to return. - -Please keep in mind the following limitations: - -- Finds symbols defined in the REPL's namespace, which only - includes imported and module binding -- but not local bindings. - -- If the definition is found in Racket's \"#%kernel\" module, it - will tell you so but won't visit the definition site." - (interactive "P") - (pcase (racket--symbol-at-point-or-prompt prefix "Visit definition of: " - racket--repl-namespace-symbols) - ((and (pred stringp) str) (racket--repl-visit-symbol-definition str)))) - -;; TODO: Move to `racket-xp-mode', or arrange for this to call that or -;; this depending on current-buffer. -(defun racket-lispy-visit-symbol-definition (str) - "Function called by lispy.el's `lispy-goto-symbol' for Racket -symbol definition lookup." - (racket--repl-visit-symbol-definition str)) - -(defun racket--repl-visit-symbol-definition (str) - (racket--do-visit-def-or-mod (racket--repl-session-id) - `(def namespace ,str))) - -;;; Doc - -(defun racket-repl-documentation (&optional prefix) - "View documentation of the identifier or string at point. - -Uses the default external web browser. - -If point is an identifier required in the current namespace that -has help, opens the web browser directly at that help -topic. (i.e. Uses the identifier variant of racket/help.) - -Otherwise, opens the 'search for a term' page, where you can -choose among multiple possibilities. (i.e. Uses the string -variant of racket/help.) - -With a C-u prefix, prompts for the identifier or quoted string, -instead of looking at point." - (interactive "P") - (pcase (racket--symbol-at-point-or-prompt prefix "Documentation for: " - racket--repl-namespace-symbols) - ((and (pred stringp) str) (racket--cmd/async (racket--repl-session-id) - `(doc namespace ,str) - #'browse-url)))) - -;;; racket-repl-mode - -(defvar racket-repl-mode-map - (racket--easy-keymap-define - '(("C-m" racket-repl-submit) - ("C-j" newline-and-indent) - ("TAB" indent-for-tab-command) - ("C-M-u" racket-backward-up-list) - ("C-M-q" prog-indent-sexp) - ("C-a" comint-bol) - ("C-w" comint-kill-region) - ("" comint-kill-whole-line) - ("C-c C-e f" racket-expand-file) - ("C-c C-e x" racket-expand-definition) - ("C-c C-e e" racket-expand-last-sexp) - ("C-c C-e r" racket-expand-region) - ("M-C-y" racket-insert-lambda) - ("C-c C-d" racket-repl-documentation) - ("C-c C-." racket-repl-describe) - ("M-." racket-repl-visit-definition) - ("C-M-." racket-visit-module) - ("M-," racket-unvisit) - ("C-c C-z" racket-repl-switch-to-edit) - ("C-c C-l" racket-logger) - ("C-c C-c" racket-repl-break) - ("C-c C-\\" racket-repl-exit) - ((")" "]" "}") racket-insert-closing))) - "Keymap for Racket REPL mode.") - -(easy-menu-define racket-repl-mode-menu racket-repl-mode-map - "Menu for Racket REPL mode." - '("Racket-REPL" - ["Break" racket-repl-break] - ["Exit" racket-repl-exit] - "---" - ["Insert Lambda" racket-insert-lambda] ;λ in string breaks menu - ["Indent Region" indent-region] - ["Cycle Paren Shapes" racket-cycle-paren-shapes] - ("Macro Expand" - ["File" racket-expand-file] - ["Region" racket-expand-region :active (region-active-p)] - ["Definition" racket-expand-definition] - ["Last S-Expression" racket-expand-last-sexp]) - "---" - ["Visit Definition" racket-visit-definition] - ["Visit Module" racket-visit-module] - ["Return from Visit" racket-unvisit] - "---" - ["Racket Documentation" racket-doc] - ["Describe" racket-describe] - "---" - ["Switch to Edit Buffer" racket-repl-switch-to-edit])) - -(define-derived-mode racket-repl-mode comint-mode "Racket-REPL" - "Major mode for Racket REPL. -\\{racket-repl-mode-map}" - (racket--common-variables) - (setq-local comint-use-prompt-regexp nil) - (setq-local comint-prompt-read-only t) - (setq-local comint-scroll-show-maximum-output nil) ;t slow for big outputs - (setq-local mode-line-process nil) - (setq-local completion-at-point-functions (list #'racket-repl-complete-at-point)) - (setq-local eldoc-documentation-function nil) - (add-hook 'comint-output-filter-functions #'racket-repl-display-images) - (compilation-setup t) - (setq-local - compilation-error-regexp-alist - (list - ;; Any apparent file:line:col - (list (rx (group-n 1 (+? (not (syntax whitespace)))) - (any ?\: ?\.) - (group-n 2 (+ digit)) - (any ?\: ?\.) - (group-n 3 (+ digit))) - #'racket--adjust-group-1 2 3) - ;; Any path struct - (list (rx "#)))) ?\>) - #'racket--adjust-group-1 nil nil 0))) - ;; Persistent history - (setq-local comint-input-filter #'racket-repl--input-filter) - (make-directory racket--config-dir t) - (setq-local comint-input-ring-file-name - (expand-file-name (racket--buffer-name-slug) - racket--config-dir)) - (comint-read-input-ring t) - (add-hook 'kill-buffer-hook #'comint-write-input-ring) - (add-hook 'kill-emacs-hook #'racket--repl-save-all-histories)) - -(defun racket--repl-save-all-histories () - "Call comint-write-input-ring for all `racket-repl-mode' buffers. -A suitable value for the hook `kill-emacs-hook'." - (dolist (buf (buffer-list)) - (with-current-buffer buf - (when (eq major-mode 'racket-repl-mode) - (comint-write-input-ring))))) - -(defun racket--buffer-name-slug () - "Change `buffer-name' to a string that is a valid filename." - ;; 3. Finally use `shell-quote-argument' to try to catch anything - ;; else. - (shell-quote-argument - ;; 2. But not leading or trailing ?- - (replace-regexp-in-string - (rx (or (seq bos (+ ?-)) - (seq (+ ?-) eos))) - "" - ;; 1. Replace runs of anything that is not alnum with a single ?-. - (replace-regexp-in-string - (rx (+ (not (any alnum)))) - "-" - (buffer-name))))) - -(defun racket--adjust-group-1 () - (list (funcall racket-path-from-racket-to-emacs-function (match-string 1)))) - -(provide 'racket-repl) - -;; racket-repl.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-repl.elc b/elpa/racket-mode-20200417.1741/racket-repl.elc deleted file mode 100644 index ff90ec390d5a15c6d82bc6cd063ebbf988226967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34856 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 diff --git a/elpa/racket-mode-20200417.1741/racket-smart-open.el b/elpa/racket-mode-20200417.1741/racket-smart-open.el deleted file mode 100644 index bec4fc9c..00000000 --- a/elpa/racket-mode-20200417.1741/racket-smart-open.el +++ /dev/null @@ -1,253 +0,0 @@ -;;; racket-smart-open.el -*- lexical-binding: t; -*- - -;; Copyright (c) 2013-2019 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -;;; racket-smart-open-bracket-mode - -(require 'racket-custom) -(require 'racket-parens) -(require 'racket-ppss) -(require 'racket-util) - -;;;###autoload -(define-minor-mode racket-smart-open-bracket-mode - "Minor mode to let you always type `[`' to insert `(` or `[` automatically. - -Behaves like the \"Automatically adjust opening square brackets\" -feature in Dr. Racket. - -By default, inserts a `(`. Inserts a `[` in the following cases: - - - `let`-like bindings -- forms with `let` in the name as well - as things like `parameterize`, `with-handlers`, and - `with-syntax`. - - - `case`, `cond`, `match`, `syntax-case`, `syntax-parse`, and - `syntax-rules` clauses. - - - `for`-like bindings and `for/fold` accumulators. - - - `class` declaration syntax, such as `init` and `inherit`. - -When the previous s-expression in a sequence is a compound -expression, uses the same kind of delimiter. - -To force insert `[`, use `quoted-insert'. - -Combined with `racket-insert-closing' this means that you can -press the unshifted `[` and `]` keys to get whatever delimiters -follow the Racket conventions for these forms. When something -like `electric-pair-mode' or `paredit-mode' is active, you need -not even press `]`. - -Tip: When also using `paredit-mode', enable that first so that -the binding for the `[`' key in the map for -`racket-smart-open-bracket-mode' has higher priority. See also -the variable `minor-mode-map-alist'." - :lighter " RacketSmartOpen" - :keymap (racket--easy-keymap-define - '(("[" racket-smart-open-bracket))) - (unless (memq major-mode '(racket-mode racket-repl-mode)) - (setq racket-smart-open-bracket-mode nil) - (user-error "racket-smart-open-bracket-mode only works with with Racket Mode buffers"))) - -(defconst racket--smart-open-bracket-data - (eval-when-compile - `(;; cond-like - (0 0 ,(rx (seq "(" - (or "augment" - "augment-final" - "augride" - "cond" - "field" - "inherit" - "inherit-field" - "inherit/super" - "inherit/inner" - "init" - "init-field" - "match-lambda" - "match-lambda*" - "match-lambda**" - "overment" - "override" - "override-final" - "public" - "pubment" - "public-final" - "rename-inner" - "rename-super" - "super-new") - (or space line-end)))) - ;; case-like - (2 0 ,(rx (seq "(" - (or "case" - "new" - "match" - "match*" - "syntax-parse" - "syntax-rules") - (or space line-end)))) - ;; syntax-case - (3 0 ,(rx (seq "(" - (or "syntax-case") - (or space line-end)))) - ;; syntax-case* - (4 0 ,(rx (seq "(" - (or "syntax-case*") - (or space line-end)))) - ;; let-like - ;; - ;; In addition to the obvious suspects with 'let' in the name, - ;; handles forms like 'parameterize', 'with-handlers', 'for', - ;; and 'for/fold' accumulator bindings. - (0 1 ,(rx (seq (or "for" - "for/list" - "for/vector" - "for/hash" - "for/hasheq" - "for/hasheqv" - "for/and" - "for/or" - "for/lists" - "for/first" - "for/last" - "for/fold" - "for/flvector" - "for/extflvector" - "for/set" - "for/sum" - "for/product" - "for*" - "for*/list" - "for*/vector" - "for*/hash" - "for*/hasheq" - "for*/hasheqv" - "for*/and" - "for*/or" - "for*/lists" - "for*/first" - "for*/last" - "for*/fold" - "for*/flvector" - "for*/extflvector" - "for*/set" - "for*/sum" - "for*/product" - "fluid-let" - "let" - "let*" - "let*-values" - "let-struct" - "let-syntax" - "let-syntaxes" - "let-values" - "let/cc" - "let/ec" - "letrec" - "letrec-syntax" - "letrec-syntaxes" - "letrec-syntaxes+values" - "letrec-values" - "match-let" - "match-let*" - "match-let-values" - "match-let*-values" - "match-letrec" - "parameterize" - "parameterize*" - "with-handlers" - "with-handlers*" - "with-syntax" - "with-syntax*") - (or space line-end)))) - ;; for/fold bindings - ;; - ;; Note: Previous item handles the first, accumulators subform. - (0 2 ,(rx (seq (or "for/fold" - "for*/fold") - (or space line-end)))) - ;; named-let bindings - ;; - (0 2 ,(rx (seq "let" (1+ whitespace) (1+ (not (in "()[]{}\",'`;#|\" ")))))))) - "A list of lists. Each sub list is arguments to supply to - `racket--smart-open-bracket-helper'.") - -(defun racket--smart-open-bracket-helper (pre-backward-sexps - post-backward-sexps - regexp) - "Is point at a subform of a known form REGEXP that should open with '['. - -Returns '[' or nil." - - (and (save-excursion - (ignore-errors - (backward-sexp pre-backward-sexps) t)) - (save-excursion - (ignore-errors - (backward-up-list) - (backward-sexp post-backward-sexps) - (when (looking-at-p regexp) - ?\[))))) - -(defun racket-smart-open-bracket (&optional prefix) - "Automatically insert a `(` or a `[` as appropriate. - -See `racket-smart-open-bracket-mode'." - (interactive "P") - (let ((ch (or (and (save-excursion - (let ((pt (point))) - (beginning-of-defun) - (let ((state (parse-partial-sexp (point) pt))) - (or (racket--ppss-string-p state) - (racket--ppss-comment-p state))))) - ?\[) - (cl-some (lambda (xs) - (apply #'racket--smart-open-bracket-helper xs)) - racket--smart-open-bracket-data) - (racket--open-paren #'backward-sexp) - ?\())) - (if (fboundp 'racket--paredit-aware-open) - (racket--paredit-aware-open prefix ch) - (racket--self-insert ch)))) - -(put 'racket-smart-open-bracket 'delete-selection - #'racket--electric-pair-mode-not-active) - -(eval-after-load 'paredit - '(progn - (declare-function paredit-open-round 'paredit) - (declare-function paredit-open-square 'paredit) - (declare-function paredit-open-curly 'paredit) - (defun racket--paredit-aware-open (prefix ch) - "A paredit-aware helper for `racket-smart-open-bracket'. - -When `paredit-mode' is active, use its functions, such as -`paredit-open-round'. Note: This function isn't defined unless -paredit is loaded, so check for this function's existence using -`fboundp'." - (let ((paredit-active (and (boundp 'paredit-mode) paredit-mode))) - (cond ((not paredit-active) (racket--self-insert ch)) - ((eq ch ?\() (paredit-open-round prefix)) - ((eq ch ?\[) (paredit-open-square prefix)) - ((eq ch ?\{) (paredit-open-curly prefix)) - (t (racket--self-insert ch))))))) - -(provide 'racket-smart-open) - -;; racket-smart-open.el ends her diff --git a/elpa/racket-mode-20200417.1741/racket-smart-open.elc b/elpa/racket-mode-20200417.1741/racket-smart-open.elc deleted file mode 100644 index cd86ea6823d8f72eef3e7a6ecb66d1f8aefbf732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7025 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 R*VSjJBr1JesjgJL{|EFT;=up_ diff --git a/elpa/racket-mode-20200417.1741/racket-stepper.el b/elpa/racket-mode-20200417.1741/racket-stepper.el deleted file mode 100644 index 6d091d01..00000000 --- a/elpa/racket-mode-20200417.1741/racket-stepper.el +++ /dev/null @@ -1,212 +0,0 @@ -;;; racket-stepper.el -*- lexical-binding: t; -*- - -;; Copyright (c) 2018-2020 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'easymenu) -(require 'rx) -(require 'racket-cmd) -(require 'racket-custom) -(require 'racket-repl) -(require 'racket-util) - -;; Need to define this before racket-stepper-mode -(defvar racket-stepper-mode-map - (racket--easy-keymap-define - '((("C-m") racket-stepper-step) - (("n" "j") racket-stepper-next-item) - (("p" "k") racket-stepper-previous-item)))) - -(easy-menu-define racket-stepper-mode-menu racket-stepper-mode-map - "Menu for Racket stepper mode." - '("Racket" - ["Step" racket-stepper-step] - ["Next" racket-stepper-next-item] - ["Previous" racket-stepper-previous-item])) - -(defconst racket-stepper-font-lock-keywords - (eval-when-compile - `((,(rx bol "! " (zero-or-more any) eol) . font-lock-warning-face) - (,(rx bol alphanumeric (zero-or-more any) eol) . font-lock-function-name-face) - (,(rx bol "@@" (zero-or-more any) "@@" eol) . font-lock-comment-face) - (,(rx bol "-" (zero-or-more any) eol) . 'diff-removed) - (,(rx bol "+" (zero-or-more any) eol) . 'diff-added)))) - -(define-derived-mode racket-stepper-mode special-mode "Racket-Stepper" - "Major mode for Racket stepper output. -\\ - -Used by the commands `racket-expand-file', -`racket-expand-definition', `racket-expand-region', and -`racket-expand-last-sexp'. - -\\{racket-stepper-mode-map} -" - (setq header-line-format - "Press RET to step. C-u RET to step all. C-h m to see help.") - (setq-local font-lock-defaults - (list racket-stepper-font-lock-keywords - t))) ;keywords only -- not strings/comments - -(defvar racket-stepper--buffer-name "*Racket Stepper*") - -;;; commands - -(defun racket-expand-file (&optional into-base) - "Expand the `racket-mode' buffer's file in `racket-stepper-mode'. - -Uses the `macro-debugger` package to do the expansion. - -You do _not_ need to `racket-run' the file first; the namespace -active in the REPL is not used. - -If the file is non-trivial and/or is not compiled to a .zo -bytecode file, then it might take many seconds before the -original form is displayed and you can start stepping. - -With a prefix, also expands syntax from racket/base -- which can -result in very many expansion steps." - (interactive "P") - (unless (eq major-mode 'racket-mode) - (user-error "Only works in racket-mode buffer")) - (racket--save-if-changed) - (racket-stepper--start 'file (racket--buffer-file-name) into-base)) - -(defun racket-expand-region (start end &optional into-base) - "Expand the active region using `racket-stepper-mode'. - -Uses Racket's `expand-once` in the namespace from the most recent -`racket-run'." - (interactive "rP") - (unless (region-active-p) - (user-error "No region")) - (racket-stepper--expand-text into-base - (lambda () - (cons start end)))) - -(defun racket-expand-definition (&optional into-base) - "Expand the definition around point using `racket-stepper-mode'. - -Uses Racket's `expand-once` in the namespace from the most recent -`racket-run'." - (interactive "P") - (racket-stepper--expand-text into-base - (lambda () - (save-excursion - (cons (progn (beginning-of-defun) (point)) - (progn (end-of-defun) (point))))))) - -(defun racket-expand-last-sexp (&optional into-base) - "Expand the sexp before point using `racket-stepper-mode'. - -Uses Racket's `expand-once` in the namespace from the most recent -`racket-run'." - (interactive "P") - (racket-stepper--expand-text into-base - (lambda () - (save-excursion - (cons (progn (backward-sexp) (point)) - (progn (forward-sexp) (point))))))) - -(defun racket-stepper--expand-text (prefix get-region) - (pcase (funcall get-region) - (`(,beg . ,end) - (racket-stepper--start 'expr - (buffer-substring-no-properties beg end) - prefix)))) - -(defvar racket--stepper-repl-session-id nil - "The REPL session used when stepping. -May be nil for 'file stepping, but must be valid for 'expr stepping.") - -(defun racket-stepper--start (which str into-base) - "Ensure buffer and issue initial command. -WHICH should be 'expr or 'file. -STR should be the expression or pathname. -INTO-BASE is treated as a raw prefix arg and converted to boolp." - (unless (eq major-mode 'racket-mode) - (error "Only works from racket-mode buffers")) - (setq racket--stepper-repl-session-id (racket--repl-session-id)) - (unless (or racket--stepper-repl-session-id - (eq which 'file)) - (error "Only works when the racket-mode buffer has a REPL buffer, and, you should racket-run first")) - ;; Create buffer if necessary - (unless (get-buffer racket-stepper--buffer-name) - (with-current-buffer (get-buffer-create racket-stepper--buffer-name) - (racket-stepper-mode))) - ;; Give it a window if necessary - (unless (get-buffer-window racket-stepper--buffer-name) - (pop-to-buffer (get-buffer racket-stepper--buffer-name))) - ;; Select the stepper window and insert - (select-window (get-buffer-window racket-stepper--buffer-name)) - (let ((inhibit-read-only t)) - (delete-region (point-min) (point-max)) - (insert "Starting macro expansion stepper... please wait...\n")) - (racket--cmd/async racket--stepper-repl-session-id - `(macro-stepper (,which . ,str) - ,(and into-base t)) - #'racket-stepper--insert)) - -(defun racket-stepper--insert (steps) - (with-current-buffer racket-stepper--buffer-name - (let ((inhibit-read-only t)) - (goto-char (point-max)) - (dolist (step steps) - (pcase step - (`(original . ,text) - (delete-region (point-min) (point-max)) - (insert "Original\n" text "\n" "\n")) - (`(final . ,text) (insert "Final\n" text "\n")) - (`(,label . ,diff) (insert label "\n" diff "\n")))) - (racket-stepper-previous-item) - (when (equal (selected-window) (get-buffer-window (current-buffer))) - (recenter))))) - -(defun racket-stepper-step (prefix) - (interactive "P") - (racket--cmd/async racket--stepper-repl-session-id - `(macro-stepper/next ,(if prefix 'all 'next)) - #'racket-stepper--insert)) - -(defconst racket-stepper--item-rx - (rx bol alphanumeric (zero-or-more any) eol)) - -(defun racket-stepper-next-item (&optional count) - "Move point N items forward. - -An \"item\" is a line starting with a log level in brackets. - -Interactively, N is the numeric prefix argument. -If N is omitted or nil, move point 1 item forward." - (interactive "P") - (forward-char 1) - (if (re-search-forward racket-stepper--item-rx nil t count) - (beginning-of-line) - (backward-char 1))) - -(defun racket-stepper-previous-item (&optional count) - "Move point N items backward. - -An \"item\" is a line starting with a log level in brackets. - -Interactively, N is the numeric prefix argument. -If N is omitted or nil, move point 1 item backward." - (interactive "P") - (re-search-backward racket-stepper--item-rx nil t count)) - -(provide 'racket-stepper) - -;;; racket-stepper.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-stepper.elc b/elpa/racket-mode-20200417.1741/racket-stepper.elc deleted file mode 100644 index 31c258c672bebc2e8daf76404df281977e2feb9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8779 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 Od4i7zS4!2*#=ihzJ??%0 diff --git a/elpa/racket-mode-20200417.1741/racket-unicode-input-method.el b/elpa/racket-mode-20200417.1741/racket-unicode-input-method.el deleted file mode 100644 index f716ae25..00000000 --- a/elpa/racket-mode-20200417.1741/racket-unicode-input-method.el +++ /dev/null @@ -1,256 +0,0 @@ -;;; racket-unicode-input-method.el --- Racket Unicode helper functions - -;; Copyright (c) 2015-2019 by Greg Hendershott -;; Portions Copyright (c) 2010-2011 by Roel van Dijk - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -;; Following the example of haskell-unicode-input-method.el - -(require 'quail) - -;;;###autoload -(defun racket-unicode-input-method-enable () - "Set input method to racket-unicode. - -The racket-unicode input method lets you easily type various -Unicode symbols that might be useful when writing Racket code. - -To automatically enable the racket-unicode input method in -racket-mode and racket-repl-mode buffers, put the following code -in your Emacs init file: - -#+BEGIN_SRC elisp - (add-hook 'racket-mode-hook #'racket-unicode-input-method-enable) - (add-hook 'racket-repl-mode-hook #'racket-unicode-input-method-enable) -#+END_SRC - -To temporarily enable this input method for a single buffer you -can use \"M-x racket-unicode-input-method-enable\". - -Use the standard Emacs key C-\\ to toggle the input method. - -When the racket-unicode input method is active, you can for -example type \"All\" and it is immediately replaced with \"∀\". A -few other examples: - -| omega | ω | -| x_1 | xâ‚ | -| x^1 | x¹ | -| A | 𔸠| -| test-->>E | test-->>∃ (racket/redex) | -| vdash | ⊢ | - -To see a table of all key sequences use \"M-x -describe-input-method racket-unicode\". - -If you want to add your own mappings to the \"racket-unicode\" -input method, you may add code like the following example in your -Emacs init file: - -#+BEGIN_SRC elisp - ;; Either (require 'racket-mode) here, or, if you use - ;; use-package, put the code below in the :config section. - (with-temp-buffer - (racket-unicode-input-method-enable) - (set-input-method \"racket-unicode\") - (let ((quail-current-package (assoc \"racket-unicode\" - quail-package-alist))) - (quail-define-rules ((append . t)) - (\"^o\" [\"áµ’\"])))) -#+END_SRC - -If you don’t like the highlighting of partially matching tokens you -can turn it off by setting `input-method-highlight-flag' to nil." - (interactive) - (set-input-method "racket-unicode")) - -(quail-define-package - "racket-unicode" ;name - "UTF-8" ;language - "λ" ;title (in mode line) - t ;guidance - "Racket Unicode input method." ;docstring - nil ;translation-keys - nil ;forget-last-selection - nil ;deterministic - nil ;kbd-translate - nil ;show-layout - nil ;create-decode-map - nil ;maximum-shortest - nil ;overlay-plist - nil ;update-translation-function - nil ;conversion-keys - t) ;simple - -(quail-define-rules - ;; Typed Racket - ("All " ["∀"]) - ("Union " ["U"]) - ("Intersection " ["∩"]) - - ;; Redex - ("test-->>E " ["test-->>∃"]) - - ;; Turnstile - ("vdash " ["⊢"]) - ("gg " ["≫"]) - ("rightarrow " ["→"]) - ("Rightarrow " ["⇒"]) - ("Leftarrow " ["â‡"]) - ("succ " ["≻"]) - - ;; Other type rule symbols - ("times " ["×"]) - ("Uparrow " ["⇑"]) - ("Downarrow " ["⇓"]) - ("vee " ["∨"]) - ("wedge " ["∧"]) - ("sqsubset " ["âŠ"]) - ("sqsupset " ["âŠ"]) - ("sqsubseteq " ["⊑"]) - ("sqsupseteq " ["⊒"]) - ("sqcap " ["⊓"]) - ("sqcup " ["⊔"]) - ("models " ["⊧"]) - - ;; Greek letters - ("alpha " ["α"]) - ("Alpha " ["Α"]) - ("beta " ["β"]) - ("Beta " ["Î’"]) - ("gamma " ["γ"]) - ("Gamma " ["Γ"]) - ("delta " ["δ"]) - ("Delta " ["Δ"]) - ("epsilon " ["ε"]) - ("Epsilon " ["Ε"]) - ("zeta " ["ζ"]) - ("Zeta " ["Ζ"]) - ("eta " ["η"]) - ("Eta " ["Η"]) - ("theta " ["θ"]) - ("Theta " ["Θ"]) - ("iota " ["ι"]) - ("Iota " ["Ι"]) - ("kappa " ["κ"]) - ("Kappa " ["Κ"]) - ("lambda " ["λ"]) - ("Lambda " ["Λ"]) - ("lamda " ["λ"]) - ("Lamda " ["Λ"]) - ("mu " ["μ"]) - ("Mu " ["Îœ"]) - ("nu " ["ν"]) - ("Nu " ["Î"]) - ("xi " ["ξ"]) - ("Xi " ["Ξ"]) - ("omicron " ["ο"]) - ("Omicron " ["Ο"]) - ("pi " ["Ï€"]) - ("Pi " ["Π"]) - ("rho " ["Ï"]) - ("Rho " ["Ρ"]) - ("sigma " ["σ"]) - ("Sigma " ["Σ"]) - ("tau " ["Ï„"]) - ("Tau " ["Τ"]) - ("upsilon " ["Ï…"]) - ("Upsilon " ["Î¥"]) - ("phi " ["φ"]) - ("Phi " ["Φ"]) - ("chi " ["χ"]) - ("Chi " ["Χ"]) - ("psi " ["ψ"]) - ("Psi " ["Ψ"]) - ("omega " ["ω"]) - ("Omega " ["Ω"]) - ("digamma " ["Ï"]) - ("Digamma " ["Ïœ"]) - ("san " ["Ï»"]) - ("San " ["Ϻ"]) - ("qoppa " ["Ï™"]) - ("Qoppa " ["Ϙ"]) - ("sampi " ["Ï¡"]) - ("Sampi " ["Ï "]) - ("stigma " ["Ï›"]) - ("Stigma " ["Ïš"]) - ("heta " ["ͱ"]) - ("Heta " ["Í°"]) - ("sho " ["ϸ"]) - ("Sho " ["Ï·"]) - - ;; Double-struck letters - ("|A|" ["ð”¸"]) - ("|B|" ["ð”¹"]) - ("|C|" ["â„‚"]) - ("|D|" ["ð”»"]) - ("|E|" ["ð”¼"]) - ("|F|" ["ð”½"]) - ("|G|" ["ð”¾"]) - ("|H|" ["â„"]) - ("|I|" ["ð•€"]) - ("|J|" ["ð•"]) - ("|K|" ["ð•‚"]) - ("|L|" ["ð•ƒ"]) - ("|M|" ["ð•„"]) - ("|N|" ["â„•"]) - ("|O|" ["ð•†"]) - ("|P|" ["â„™"]) - ("|Q|" ["â„š"]) - ("|R|" ["â„"]) - ("|S|" ["ð•Š"]) - ("|T|" ["ð•‹"]) - ("|U|" ["ð•Œ"]) - ("|V|" ["ð•"]) - ("|W|" ["ð•Ž"]) - ("|X|" ["ð•"]) - ("|Y|" ["ð•"]) - ("|Z|" ["ℤ"]) - ("|gamma|" ["ℽ"]) - ("|Gamma|" ["ℾ"]) - ("|pi|" ["ℼ"]) - ("|Pi|" ["â„¿"]) - - ;; Quantifiers - ("forall " ["∀"]) - ("exists " ["∃"]) - - ;; Numeric subscripts - ("_0 " ["â‚€"]) - ("_1 " ["â‚"]) - ("_2 " ["â‚‚"]) - ("_3 " ["₃"]) - ("_4 " ["â‚„"]) - ("_5 " ["â‚…"]) - ("_6 " ["₆"]) - ("_7 " ["₇"]) - ("_8 " ["₈"]) - ("_9 " ["₉"]) - - ;; Numeric superscripts - ("^0 " ["â°"]) - ("^1 " ["¹"]) - ("^2 " ["²"]) - ("^3 " ["³"]) - ("^4 " ["â´"]) - ("^5 " ["âµ"]) - ("^6 " ["â¶"]) - ("^7 " ["â·"]) - ("^8 " ["â¸"]) - ("^9 " ["â¹"])) - -(provide 'racket-unicode-input-method) - -;;; racket-unicode-input-method.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-unicode-input-method.elc b/elpa/racket-mode-20200417.1741/racket-unicode-input-method.elc deleted file mode 100644 index b44cd2a95ad458fc4dbdd86946d7c481044362ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11664 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 diff --git a/elpa/racket-mode-20200417.1741/racket-util.el b/elpa/racket-mode-20200417.1741/racket-util.el deleted file mode 100644 index 685cae47..00000000 --- a/elpa/racket-mode-20200417.1741/racket-util.el +++ /dev/null @@ -1,186 +0,0 @@ -;;; racket-util.el -*- lexical-binding: t -*- - -;; Copyright (c) 2013-2019 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'racket-custom) - -(defun racket--easy-keymap-define (spec) - "Make a sparse keymap with the bindings in SPEC. - -SPEC is - (list (list KEY-OR-KEYS DEF) ...) - -KEY-OR-KEYS is either a string given to `kbd', or, for the case -where multiple keys bind to the same command, a list of such -strings. - -DEF is the same as DEF for `define-key'." - (let ((m (make-sparse-keymap))) - (mapc (lambda (x) - (let ((keys (if (listp (car x)) - (car x) - (list (car x)))) - (def (cadr x))) - (mapc (lambda (key) - (define-key m (kbd key) def)) - keys))) - spec) - m)) - -(defun racket--buffer-file-name (&optional no-adjust) - "Like `buffer-file-name' but always a non-propertized string. - -Unless NO-ADJUST is not nil, applies the name to the function -variable `racket-path-from-emacs-to-racket-function'." - (let ((v (and (buffer-file-name) - (substring-no-properties (buffer-file-name))))) - (if no-adjust - v - (funcall racket-path-from-emacs-to-racket-function - v)))) - -(defun racket--get-buffer-recreate (bufname) - "Like `get-buffer-create' but re-creates the buffer if it already exists." - (let* ((buf (get-buffer bufname)) - (_ (when buf (kill-buffer buf))))) - (get-buffer-create bufname)) - -(defun racket--save-if-changed () - (unless (eq major-mode 'racket-mode) - (user-error "Current buffer is not a racket-mode buffer")) - (when (or (buffer-modified-p) - (and (buffer-file-name) - (not (file-exists-p (buffer-file-name))))) - (save-buffer))) - -(add-hook 'racket--repl-before-run-hook #'racket--save-if-changed) - -(defun racket--mode-edits-racket-p () - "Return non-nil if the current major mode is one that edits Racket code. - -This is intended to be used with commands that customize their -behavior based on whether they are editing Racket, such as -Paredit bindings, without each of those commands needing to have -a list of all modes in which Racket is edited." - (memq major-mode '(racket-mode racket-repl-mode))) - -(defun racket--take-while (xs pred) - (pcase xs - (`() `()) - (`(,x . ,xs) (if (funcall pred x) - (cons x (racket--take-while xs pred)) - `())))) - -(defconst racket--el-source-dir - (file-name-directory (or load-file-name (racket--buffer-file-name))) - "Path to dir of our Emacs Lisp source files. -When installed as a package, this can be found from the variable -`load-file-name'. When developing interactively, get it from the -.el buffer file name.") - -(defconst racket--rkt-source-dir - (expand-file-name "./racket/" racket--el-source-dir) - "Path to dir of our Racket source files. ") - -;;; trace - -(defvar racket--trace-enable nil) - -(defun racket--trace (p &optional s retval) - (when racket--trace-enable - (let ((b (get-buffer-create "*Racket Trace*")) - (deactivate-mark deactivate-mark)) - (save-excursion - (save-restriction - (with-current-buffer b - (insert p ": " (if (stringp s) s (format "%S" s)) "\n")))))) - retval) - -(defun racket--toggle-trace (arg) - (interactive "P") - (setq racket--trace-enable (or arg (not racket--trace-enable))) - (if racket--trace-enable - (message "Racket trace on") - (message "Racket trace off")) - (let ((b (get-buffer-create "*Racket Trace*"))) - (pop-to-buffer b t t) - (setq truncate-lines t))) - -(defun racket--restoring-current-buffer (proc) - "Return a procedure restoring `current-buffer' during the dynamic extent of PROC." - (let ((buf (current-buffer))) - (lambda (&rest args) - (with-current-buffer buf - (apply proc args))))) - -;;; string trim - -;; "inline" the one thing we used from `s' so we can drop the dep. -;; TO-DO: Rewrite racket--trim more simply; I just don't want to -;; detour now. - -(defun racket--trim-left (s) - "Remove whitespace at the beginning of S." - (save-match-data - (if (string-match "\\`[ \t\n\r]+" s) - (replace-match "" t t s) - s))) - -(defun racket--trim-right (s) - "Remove whitespace at the end of S." - (save-match-data - (if (string-match "[ \t\n\r]+\\'" s) - (replace-match "" t t s) - s))) - -(defun racket--trim (s) - "Remove whitespace at the beginning and end of S." - (racket--trim-left (racket--trim-right s))) - -(defun racket--non-empty-string-p (v) - (and (stringp v) - (not (string-match-p "\\`[ \t\n\r]*\\'" v)))) ;`string-blank-p' - -;;; at-point - -(defun racket--symbol-at-point-or-prompt (force-prompt-p prompt &optional completions) - "Helper for functions that want symbol-at-point, or, to prompt -when there is no symbol-at-point or FORCE-PROMPT-P is true. The -prompt uses `read-from-minibuffer' when COMPLETIONS is nil, else -`ido-completing-read'. Returns `stringp' not `symbolp' to -simplify using the result in a sexpr that can be passed to Racket -backend. Likewise text properties are stripped." - (let ((sap (thing-at-point 'symbol t))) - (if (or force-prompt-p (not sap)) - (let ((s (if completions - (ido-completing-read prompt completions nil nil sap) - (read-from-minibuffer prompt sap)))) - (if (or (not s) - (equal "" - (racket--trim - (substring-no-properties s)))) - nil - s)) - sap))) - - -(defconst racket--config-dir (file-name-as-directory - (locate-user-emacs-file "racket-mode"))) - -(provide 'racket-util) - -;; racket-util.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-util.elc b/elpa/racket-mode-20200417.1741/racket-util.elc deleted file mode 100644 index 9506fd6378d3862a6fc863337d8ba4fba6f9d68e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6009 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 diff --git a/elpa/racket-mode-20200417.1741/racket-visit.el b/elpa/racket-mode-20200417.1741/racket-visit.el deleted file mode 100644 index 779eca8a..00000000 --- a/elpa/racket-mode-20200417.1741/racket-visit.el +++ /dev/null @@ -1,124 +0,0 @@ -;;; racket-visit.el -*- lexical-binding: t -*- - -;; Copyright (c) 2013-2020 by Greg Hendershott. -;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc. - -;; Author: Greg Hendershott -;; URL: https://github.com/greghendershott/racket-mode - -;; License: -;; This is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. This is distributed in the hope that it will be -;; useful, but without any warranty; without even the implied warranty -;; of merchantability or fitness for a particular purpose. See the GNU -;; General Public License for more details. See -;; http://www.gnu.org/licenses/ for details. - -(require 'racket-cmd) -(require 'racket-ppss) -(require 'racket-util) - -;;; visiting defs and mods - -(defun racket-visit-module (&optional prefix) - "Visit definition of module at point, e.g. net/url or \"file.rkt\". - -If there is no module at point, prompt for it. - -With a prefix, always prompt for the module. - -Use `racket-unvisit' to return. - -See also: `racket-find-collection'." - (interactive "P") - (let* ((v (racket--module-at-point)) - (v (if (or prefix (not v)) - (read-from-minibuffer "Visit module: " (or v "")) - v))) - ;; If the module name is quoted e.g. "file.rkt", just do - ;; equivalent of `find-file-at-point'. Else ask back-end. - (cond ((and (equal "\"" (substring v 0 1)) - (equal "\"" (substring v -1 nil))) - (racket--push-loc) - (find-file (expand-file-name (substring v 1 -1))) - (message "Type M-, to return")) - (t (racket--do-visit-def-or-mod nil `(mod ,v)))))) - -(defun racket--module-at-point () - "Treat point as a Racket module path name, possibly in a multi-in form." - ;; `thing-at-point' 'filename matches both net/url and "file.rkt". - ;; But. 1. Returns both without the quotes; use `syntax-ppss' to - ;; detect latter (string). 2. Returns nil if on the opening quote; - ;; use `forward-char' then. - (save-excursion - (when (eq ?\" (char-syntax (char-after))) ;2 - (forward-char)) - (pcase (thing-at-point 'filename t) - (`() `()) - (v - (let* ((ppss (syntax-ppss)) - (relative-p (and (racket--ppss-string-p ppss) t)) ;1 - (multi-in (condition-case () - (progn - (when relative-p - (goto-char (racket--ppss-string/comment-start ppss))) - (backward-up-list 1) - (backward-sexp 2) - (when (looking-at-p "multi-in") - (forward-sexp 2) - (backward-sexp 1) - (when (eq ?\" (char-syntax (char-after))) ;2 - (forward-char)) - (unless (eq relative-p - (and (racket--ppss-string-p ppss) t)) ;1 - (user-error "multi-in mixes absolute and relative paths")) - (thing-at-point 'filename t))) - (scan-error nil)))) - (concat (if relative-p "\"" "") ;1 - (if multi-in - (concat multi-in "/") - "") - v - (if relative-p "\"" ""))))))) ;1 - -(defun racket--do-visit-def-or-mod (repl-session-id cmd) - (unless (memq major-mode '(racket-mode racket-repl-mode racket-describe-mode)) - (user-error "That doesn't work in %s" major-mode)) - (racket--cmd/async - repl-session-id - cmd - (lambda (result) - (pcase result - (`(,path ,line ,col) - (racket--push-loc) - (find-file (funcall racket-path-from-racket-to-emacs-function path)) - (goto-char (point-min)) - (forward-line (1- line)) - (forward-char col) - (message "Type M-, to return")) - (`kernel - (message "Defined in #%%kernel -- source not available")) - (_ - (message "Not found")))))) - -(defvar racket--loc-stack '()) - -(defun racket--push-loc () - (push (cons (current-buffer) (point)) - racket--loc-stack)) - -(defun racket-unvisit () - "Return from previous `racket-visit-definition' or `racket-visit-module'." - (interactive) - (if racket--loc-stack - (pcase (pop racket--loc-stack) - (`(,buffer . ,pt) - (pop-to-buffer-same-window buffer) - (goto-char pt))) - (message "Stack empty."))) - -(provide 'racket-visit) - -;; racket-visit.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-visit.elc b/elpa/racket-mode-20200417.1741/racket-visit.elc deleted file mode 100644 index 88020dbdfbe9c747e901a4adb7a378f5871a959d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3090 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 amt 0) - (if (>= ix-next (length uses)) 0 ix-next) - (if (< ix-next 0) (1- (length uses)) ix-next))) - (next (nth ix-next uses))) - (goto-char (car next)))))) - (_ (pcase (get-text-property (point) 'racket-xp-def) - (`(,_kind ,_id ((,beg ,_end) . ,_)) (goto-char beg)))))) - -(defun racket-xp-next-use () - "When point is on a use, go to the next, sibling use." - (interactive) - (racket-xp--forward-use 1)) - -(defun racket-xp-previous-use () - "When point is on a use, go to the previous, sibling use." - (interactive) - (racket-xp--forward-use -1)) - -(defun racket-xp-rename () - "Rename a local definition and its uses in the current file." - (interactive) - (pcase-let* - (;; Try to get a def prop and a use prop at point - (def-prop (get-text-property (point) 'racket-xp-def)) - (uses-prop (get-text-property (point) 'racket-xp-use)) - (_ (unless (or uses-prop def-prop) - (user-error "Not a definition or use"))) - ;; OK, we have one of the props. Use it to get the the other one. - (uses-prop (or uses-prop - (pcase-let ((`(,_kind ,_id ((,beg ,_end) . ,_)) def-prop)) - (get-text-property beg 'racket-xp-use)))) - (def-prop (or def-prop - (pcase-let ((`(,beg ,_end) uses-prop)) - (get-text-property beg 'racket-xp-def)))) - (`(,kind ,old-id ,uses-locs) def-prop) - (_ (unless (eq kind 'local) - (user-error "Can only rename local definitions, not imports"))) - (def-loc uses-prop) - (locs (cons def-loc uses-locs)) - (new-id (read-from-minibuffer (format "Rename %s to: " old-id))) - (marker-pairs (mapcar (lambda (loc) - (let ((beg (make-marker)) - (end (make-marker))) - (set-marker beg (nth 0 loc) (current-buffer)) - (set-marker end (nth 1 loc) (current-buffer)) - (list beg end))) - locs)) - (point-marker (let ((m (make-marker))) - (set-marker m (point) (current-buffer))))) - ;; Don't let our after-change hook run until all changes are - ;; made, otherwise check-syntax will find a syntax error. - (let ((inhibit-modification-hooks t)) - (dolist (marker-pair marker-pairs) - (let ((beg (marker-position (nth 0 marker-pair))) - (end (marker-position (nth 1 marker-pair)))) - (delete-region beg end) - (goto-char beg) - (insert new-id)))) - (goto-char (marker-position point-marker)) - (racket-xp-annotate))) - -(defun racket--xp-forward-prop (prop amt) - "Move point to the next or previous occurrence of PROP, if any. -If moved, return the new position, else nil." - ;; Someday/maybe: Handle more than just -1 or 1. - (let ((f (cl-case amt - (-1 #'previous-single-property-change) - ( 1 #'next-single-property-change)))) - (pcase (and f (funcall f (point) prop)) - ((and (pred integerp) pos) - ;; Unless this is where the prop starts, find that. - (unless (get-text-property pos prop) - (setq pos (funcall f pos prop))) - (when pos (goto-char pos)) - pos)))) - -(defun racket-xp-next-definition () - "Move point to the next definition." - (interactive) - (racket--xp-forward-prop 'racket-xp-def 1)) - -(defun racket-xp-previous-definition () - "Move point to the previous definition." - (interactive) - (racket--xp-forward-prop 'racket-xp-def -1)) - -;;; Errors - -(defvar-local racket--xp-errors (vector)) -(defvar-local racket--xp-errors-index 0) - -(defun racket--xp-clear-errors () - (setq racket--xp-errors (vector)) - (setq racket--xp-errors-index 0)) - -(defun racket--xp-add-error (path beg str) - (setq racket--xp-errors - (vconcat racket--xp-errors - (vector (list path beg str))))) - -(defun racket--xp-next-error (&optional amt reset) - "Move AMT errors, if any. - -If there are any check-syntax errors, moves among them, wrapping -around at the first and last errors. - -Otherwise delegate to `next-error'. That way, things still work -as you would want when using `racket-run' -- e.g. for runtime -evaluation errors that won't be found merely from expansion -- or -`compilation-mode'." - (interactive) - (let ((len (length racket--xp-errors))) - (if (zerop len) - (next-error amt reset) - (if reset - (setq racket--xp-errors-index 0) - (setq racket--xp-errors-index - (mod (+ racket--xp-errors-index amt) - len))) - (pcase-let ((`(,path ,pos ,str) - (aref racket--xp-errors - racket--xp-errors-index))) - (cond ((equal path (racket--buffer-file-name)) - (goto-char pos)) - (t - (find-file path) - (goto-char pos))) - (message "%s" str))))) - -(defun racket-xp-next-error () - (interactive) - (racket--xp-next-error 1 nil)) - -(defun racket-xp-previous-error () - (interactive) - (racket--xp-next-error -1 nil)) - -;;; Change hook and idle timer - -(defvar-local racket--xp-annotate-idle-timer nil) - -(defun racket--xp-after-change-hook (_beg _end _len) - (when (timerp racket--xp-annotate-idle-timer) - (cancel-timer racket--xp-annotate-idle-timer)) - (racket--xp-set-status 'outdated) - (when racket-xp-after-change-refresh-delay - (racket--xp-start-idle-timer (current-buffer)))) - -(defun racket--xp-start-idle-timer (buffer) - (setq racket--xp-annotate-idle-timer - (run-with-idle-timer racket-xp-after-change-refresh-delay - nil ;no repeat - #'racket--xp-on-idle-timer - buffer))) - -(defun racket--xp-on-idle-timer (buffer) - "Handle after-change-hook => idle-timer expiration. -If no longer current-buffer, don't annotate at all. Otherwise, if -we detect some completion process is underway, don't annotate -now, set timer to check again later. Why? Typically, if the user -then makes some completion choice, that will edit the buffer, -causing the after-change-hook to run again, and schedule another -idle timer. But just in case they don't, we schedule a retry." - (when (equal buffer (current-buffer)) - (if (racket--xp-completing-p) - (racket--xp-start-idle-timer buffer) - (racket--xp-annotate)))) - -(defun racket--xp-completing-p () - "Is completion underway? -This is ad hoc and forensic." - (or (get-buffer-window "*Completions*") - (and (boundp 'company-pseudo-tooltip-overlay) - company-pseudo-tooltip-overlay))) - -;;; Annotation - -(defun racket-xp-annotate () - "Request the buffer to be analyzed and annotated. - -If you have set `racket-xp-after-change-refresh-delay' to nil -- -or to a very large amount -- you can use this command to annotate -manually." - (interactive) - (racket--xp-annotate - (lambda () ;nudge the cursor-sensor stuff to refresh - (when (and (boundp 'cursor-sensor-mode) cursor-sensor-mode) - (racket--xp-cursor-sensor (selected-window) - (point-min) - 'entered))))) - -(defun racket--xp-annotate (&optional after-thunk) - (racket--xp-set-status 'running) - (racket--cmd/async - nil - `(check-syntax ,(or (racket--buffer-file-name) (buffer-name)) - ,(buffer-substring-no-properties (point-min) (point-max))) - (racket--restoring-current-buffer - (lambda (response) - (racket-show "") - (racket--xp-clear-errors) - (pcase response - (`(check-syntax-ok - (completions . ,completions) - (annotations . ,annotations)) - (racket--xp-clear) - (setq-local racket--xp-binding-completions completions) - (racket--xp-insert annotations) - (racket--xp-set-status 'ok) - (when (and annotations after-thunk) - (funcall after-thunk))) - (`(check-syntax-errors . ,xs) - ;; Don't do full `racket--xp-clear': The old completions and - ;; some old annotations may be helpful to user while editing - ;; to correct the error. However do clear things related to - ;; previous _errors_. - (racket--xp-clear t) - (racket--xp-insert xs) - (racket--xp-set-status 'err))))))) - -(defun racket--xp-insert (xs) - "Insert text properties." - (with-silent-modifications - (overlay-recenter (point-max)) - (dolist (x xs) - (pcase x - (`(error ,path ,beg ,end ,str) - (racket--xp-add-error path beg str) - (when (equal path (racket--buffer-file-name)) - (remove-text-properties - beg end - (list 'help-echo nil - 'racket-xp-def nil - 'racket-xp-use nil - 'cursor-sensor-functions nil)) - (racket--add-overlay beg end racket-xp-error-face) - (add-text-properties - beg end - (list 'help-echo str - 'cursor-sensor-functions (list #'racket--xp-cursor-sensor))))) - (`(info ,beg ,end ,str) - (add-text-properties - beg end - (list 'help-echo str - 'cursor-sensor-functions (list #'racket--xp-cursor-sensor))) - (when (and (string-equal str "no bound occurrences") - (string-match-p racket-xp-highlight-unused-regexp - (buffer-substring beg end))) - (racket--add-overlay beg end racket-xp-unused-face))) - (`(unused-require ,beg ,end) - (add-text-properties - beg end - (list 'help-echo "unused require" - 'cursor-sensor-functions (list #'racket--xp-cursor-sensor))) - (racket--add-overlay beg end racket-xp-unused-face)) - (`(def/uses ,def-beg ,def-end ,req ,id ,uses) - (let ((def-beg (copy-marker def-beg t)) - (def-end (copy-marker def-end t)) - (uses (mapcar (lambda (use) - (mapcar (lambda (pos) - (copy-marker pos t)) - use)) - uses))) - (add-text-properties - (marker-position def-beg) - (marker-position def-end) - (list 'racket-xp-def (list req id uses) - 'cursor-sensor-functions (list #'racket--xp-cursor-sensor))) - (dolist (use uses) - (pcase-let* ((`(,use-beg ,use-end) use)) - (add-text-properties - (marker-position use-beg) - (marker-position use-end) - (append - (list 'racket-xp-use (list def-beg def-end) - 'cursor-sensor-functions (list #'racket--xp-cursor-sensor)) - (when (eq req 'local) - (list 'help-echo "Defined locally")))))))) - (`(external-def ,beg ,end ,path ,subs ,ids) - (add-text-properties - beg end - (list 'racket-xp-visit (list path subs ids)))) - (`(doc ,beg ,end ,path ,anchor) - (add-text-properties - beg end - (list 'racket-xp-doc (list path anchor)))))))) - -(defun racket--xp-clear (&optional only-errors-p) - (with-silent-modifications - (racket--xp-clear-errors) - (racket--remove-overlays-in-buffer racket-xp-error-face) - (unless only-errors-p - (setq-local racket--xp-binding-completions nil) - (racket--remove-overlays-in-buffer racket-xp-def-face - racket-xp-use-face - racket-xp-unused-face) - (remove-text-properties - (point-min) (point-max) - (list 'help-echo nil - 'racket-xp-def nil - 'racket-xp-use nil - 'racket-xp-visit nil - 'racket-xp-doc nil - 'cursor-sensor-functions nil))))) - -;;; Mode line status - -(defvar-local racket--xp-mode-status nil) - -(defun racket--xp-set-status (&optional which) - (setq racket--xp-mode-status which) - (force-mode-line-update)) - -(defun racket--xp-mode-lighter () - (let ((prefix "Rkt")) - (pcase-let* - ((status (and (racket--cmd-open-p) - racket--xp-mode-status)) - (`(,suffix ,face ,help-echo) - (cl-case status - ((ok) '("✓" nil - "Syntax OK")) - ((err) `("✗" (face (:inherit error)) - "Syntax error")) - ((outdated) `("…" nil - "Outdated: Waiting for `racket-xp-after-change-refresh-delay' or manual `racket-xp-annotate'")) - ((running) '("λ" nil - "Getting analysis from Racket Mode back-end and annotating")) - (otherwise '("λ" (face (:strike-through t)) - "Racket Mode back-end not available"))))) - `(" " (:propertize ,(concat prefix suffix) - ,@face - help-echo ,help-echo))))) - -(provide 'racket-xp) - -;; racket-xp.el ends here diff --git a/elpa/racket-mode-20200417.1741/racket-xp.elc b/elpa/racket-mode-20200417.1741/racket-xp.elc deleted file mode 100644 index 0048f24a91746d1c3e2bdaebf0f6c412011e7f1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28683 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 AE&u=k diff --git a/elpa/racket-mode-20200417.1741/racket/command-server.rkt b/elpa/racket-mode-20200417.1741/racket/command-server.rkt deleted file mode 100644 index 740282cd..00000000 --- a/elpa/racket-mode-20200417.1741/racket/command-server.rkt +++ /dev/null @@ -1,192 +0,0 @@ -#lang racket/base - -(require racket/contract - racket/format - racket/lazy-require - racket/match - "debug.rkt" - "elisp.rkt" - "mod.rkt" - "repl.rkt" - "repl-session.rkt" - "util.rkt") - -(lazy-require - ["commands/check-syntax.rkt" (check-syntax)] - ["commands/coverage.rkt" (get-uncovered)] - ["commands/describe.rkt" (describe - type)] - ["commands/find-module.rkt" (find-module)] - ["commands/help.rkt" (doc)] - ["commands/macro.rkt" (macro-stepper macro-stepper/next)] - ["commands/profile.rkt" (get-profile)] - ["commands/requires.rkt" (requires/tidy requires/trim requires/base)] - ["commands/module-names.rkt" (module-names)] - ["find.rkt" (find-definition - find-definition/drracket-jump)]) - -(provide command-server-loop) - -;; Command requests and responses are a subset of valid Emacs Lisp -;; s-expressions: See elisp-read and elisp-write. -;; -;; Command requests are (nonce session-id command param ...). -;; -;; `session-id` should be a REPL session ID returned from opening a -;; new connection to the REPL server, for commands that need to be -;; associated with a specific REPL session. (For other commands, this -;; may be nil a.k.a. #f). -;; -;; A thread is spun off to handle each request, so that a long-running -;; command won't block others. The nonce supplied with the request is -;; returned with the response, so that the client can match the -;; response with the request. The nonce needn't be random, just -;; unique; an increasing integer is fine. -;; -;; Command responses are (nonce 'ok sexp ...+) or (nonce 'error -;; "message") or (nonce 'break). The 'error response normally can and -;; should be displayed to the user in Emacs via error or message. We -;; handle exn:fail? up here; generally we're fine letting Racket -;; exceptions percolate up and be shown to the user. The 'break -;; response is for commands that can be aborted by other commands. -;; Typically our Emacs code will silently ignore these; the -;; affirmative break response allows the command callback to be -;; cleaned up. - -(define (command-server-loop in out) - ;; Because we have multiple command threads running, we should - ;; synchronize writing responses to the output port. To do so, we - ;; use a channel. Threads running `do-command/queue-response` put to - ;; the channel. The `write-reponses-forever` thread empties it. - (define response-channel (make-channel)) - - (define (do-command/queue-response nonce sid sexp) - (define (thk) - (channel-put - response-channel - (cons - nonce - (with-handlers ([exn:fail? (λ (e) `(error ,(exn-message e)))] - [exn:break? (λ (e) `(break))]) - `(ok ,(call-with-session-context sid command sexp)))))) - ;; Make "label" for logging. A thread name comes from its thunk ∴ - ;; renaming the thunk lets us log the thread more informatively. - (define label (command-invocation-label nonce sid sexp)) - (log-racket-mode-info label) - (procedure-rename thk (string->symbol label))) - - (define (write-responses-forever) - (elisp-writeln (sync response-channel - debug-notify-channel) - out) - (flush-output out) - (write-responses-forever)) - - ;; With all the pieces defined, let's go: - (thread write-responses-forever) - (elisp-writeln `(ready) out) - (let read-a-command () - (match (elisp-read in) - [(list* nonce sid sexp) (thread (do-command/queue-response nonce sid sexp)) - (read-a-command)] - [(? eof-object?) (void)])) ) - -(define (command-invocation-label nonce sid sexp) - (~v - (list nonce - (if (null? sid) "*" sid) - (let limit-strings ([v sexp]) - (cond [(list? v) (map limit-strings v)] - [(string? v) (~a #:max-width 80 #:limit-marker "⋯" v)] - [else v]))))) - -(define/contract (command sexpr) - (-> pair? any/c) - (define-values (dir file mod-path) (maybe-mod->dir/file/rmp - (current-session-maybe-mod))) - (define path (and dir file (build-path dir file))) - ;; Note: Intentionally no "else" match clause -- let caller handle - ;; exn and supply a consistent exn response format. - (match sexpr - ;; Currently, we're called from `call-with-session-context` which - ;; uses the possibly non-nil session id to look up the possible - ;; REPL session, and set some parameters. That's because I chose - ;; to make the session ID an additional "prefix" parameter for ALL - ;; commands, like the nonce, and just after the nonce (see above). - ;; That was convenient to let call-with-session-context wrap - ;; everything, and not fiddle with individual commands. However. - ;; Only _some_ commands need a valid session ID. It might be - ;; clearer (if more tedious) to make that be an explicit new - ;; argument for only such commands. And for those commands that - ;; already have a "how" argument, instead of supplying 'namespace, - ;; they would supply the session ID. Just in case I do that, - ;; someday, I'm grouping the commands in these three categories, - ;; below. - - ;; Commands that do NOT need a REPL session - [`(no-op) #t] - [`(check-syntax ,path-str ,code) (check-syntax path-str code)] - [`(macro-stepper ,str ,into-base?) (macro-stepper str into-base?)] - [`(macro-stepper/next ,what) (macro-stepper/next what)] - [`(find-collection ,str) (find-collection str)] - [`(module-names) (module-names)] - [`(requires/tidy ,reqs) (requires/tidy reqs)] - [`(requires/trim ,path-str ,reqs) (requires/trim path-str reqs)] - [`(requires/base ,path-str ,reqs) (requires/base path-str reqs)] - - ;; Commands that MIGHT need a REPL session for context (e.g. its - ;; namespace), if their first "how" argument is 'namespace. - [`(def ,how ,str) (find-definition how str)] - [`(def/drr ,how ,path ,subs ,ids) (find-definition/drracket-jump how path subs ids)] - [`(describe ,how ,str) (describe how str)] - [`(doc ,how ,str) (doc how str)] - [`(type ,how ,v) (type how v)] - - ;; Commands that DEFINITELY DO need a REPL session for context, - ;; e.g. its namespace. Should they pass a session-id explicitly, - ;; now? - [`(run ,what ,mem ,pp? ,ctx ,args ,dbg) - (run what mem pp? ctx args dbg)] - [`(path) (or path 'top)] - [`(syms) (syms)] - [`(mod ,sym) (find-module sym (current-session-maybe-mod))] - [`(get-profile) (get-profile)] - [`(get-uncovered) (get-uncovered path)] - [`(eval ,v) (eval-command v)] - [`(repl-submit? ,str ,eos?) (repl-submit? str eos?)] - [`(debug-eval ,src ,l ,c ,p ,code) (debug-eval src l c p code)] - [`(debug-resume ,v) (debug-resume v)] - [`(debug-disable) (debug-disable)] - [`(break ,kind) (break-repl-thread (current-session-id) kind)])) - -;;; A few commands defined here - -(define/contract (repl-submit? text eos) - (-> string? elisp-bool/c (or/c 'default #t #f)) - (if (current-session-submit-pred) - ((current-session-submit-pred) (open-input-string text) (as-racket-bool eos)) - 'default)) - -(define (syms) - (sort (map symbol->string (namespace-mapped-symbols)) - string string? string?) - (call-with-values (λ () - ((current-eval) (string->namespace-syntax str))) - (λ vs - (apply ~a #:separator "\n" (map ~v vs))))) - -;;; find-collection - -(define-polyfill (find-collection-dir str) - #:module find-collection/find-collection - (error 'find-collection-dir - "For this to work, you need to `raco pkg install raco-find-collection`")) - -(define/contract (find-collection str) - (-> path-string? (listof string?)) - (map path->string (find-collection-dir str))) diff --git a/elpa/racket-mode-20200417.1741/racket/commands/check-syntax.rkt b/elpa/racket-mode-20200417.1741/racket/commands/check-syntax.rkt deleted file mode 100644 index 8252478d..00000000 --- a/elpa/racket-mode-20200417.1741/racket/commands/check-syntax.rkt +++ /dev/null @@ -1,360 +0,0 @@ -#lang racket/base - -(require (for-syntax racket/base) - racket/format - (only-in racket/list remove-duplicates) - racket/match - racket/set - racket/class - drracket/check-syntax - (only-in version/utils version<=?) - "../imports.rkt" - "../syntax.rkt" - "../util.rkt") - -(provide check-syntax) - -(module+ test - (require rackunit)) - -;; Our front-end issues check-syntax requests after the user edits a -;; buffer, plus a short idle delay (e.g. 1 second). -;; -;; On complex inputs it can take many seconds to expand and analyze. -;; (By far mostly the expansion; although we do cache expanded syntax, -;; that doesn't always help.) -;; -;; As a result, we might be called to do a path-str for which a -;; previous command thread is still running. Although that will work -;; _correctly_, eventually, it is wasteful -- both here in the -;; back-end (calculating) and in the front-end (updating buffer -;; properties). -;; -;; Instead: We'd like to kill the old command thread and inform our -;; front-end that the old command was "canceled". We can do so here -;; simply by `break-threading`ing the thread already running the -;; command for the same file. -;; -;; How/why this works: See how command-server.rkt handles exn:break by -;; returning a `(break)` response, and, how racket-cmd.el handles that -;; by doing nothing (except cleaning up its nonce->callback -;; hash-table). - -(define check-syntax - (let ([sema (make-semaphore 1)] ;guard concurrent use of ht - [ht (make-hash)]) ;path-str -> thread - (λ (path-str code-str) - (dynamic-wind - (λ () (call-with-semaphore - sema - (λ () - (define (break-thread/log thd) - (log-racket-mode-info "cancel ~v" thd) - (break-thread thd)) - (cond [(hash-ref ht path-str #f) => break-thread/log]) - (hash-set! ht path-str (current-thread))))) - (λ () (do-check-syntax path-str code-str)) - (λ () (call-with-semaphore - sema - (λ () - (hash-remove! ht path-str)))))))) - -;; Note: Instead of using the `show-content` wrapper, we give already -;; fully expanded syntax directly to `make-traversal`. Why? Expansion -;; can be slow. 1. We need exp stx for other purposes here. Dumb to -;; expand twice. 2. We might not even need to expand once, now: -;; string->expanded-syntax maintains a cache. -;; -;; [One nuance of caching expanded syntax is that we also cache the -;; namespace used while expanding -- that needs to be the -;; current-namespace for things like module->imports. Likewise -;; current-load-relative-directory. That is why -;; string->expanded-syntax uses a "call-with" "continuation style": it -;; sets parameters when calling the continuation function.] - -(define (do-check-syntax path-str code-str) - (define path (string->path path-str)) - (parameterize ([error-display-handler (our-error-display-handler path-str code-str)] - [pre-exn-errors '()]) - (with-handlers ([exn:fail? (handle-fail path-str code-str)]) - (with-time/log (~a "total " path-str) - (string->expanded-syntax path - code-str - (analyze path code-str)))))) - -(define ((analyze path code-str) stx) - (define o (new annotations-collector% - [src path] - [code-str code-str])) - (parameterize ([current-annotations o]) - (define-values (expanded-expression expansion-completed) - (make-traversal (current-namespace) - (current-load-relative-directory))) - (with-time/log 'drracket/check-syntax/expanded-expression - (expanded-expression stx)) - (with-time/log 'drracket/check-syntax/expansion-completed - (expansion-completed))) - - (define annotations (send o get-annotations)) - - (define completions-set (send o get-locals)) - (with-time/log 'imports - (imports stx completions-set)) - (define completions (sort (set->list completions-set) - string<=?)) - (list 'check-syntax-ok - (cons 'completions completions) - (cons 'annotations annotations))) - -(define annotations-collector% - (class (annotations-mixin object%) - (init-field src code-str) - - (define infos (mutable-set)) - (define ht-defs/uses (make-hash)) - (define locals (mutable-set)) - - ;; Give infos all a common prefix so we can sort. - (define (item sym beg end . more) - (list* sym (add1 beg) (add1 end) more)) - - ;; I've seen drracket/check-syntax return bogus positions for e.g. - ;; add-mouse-over-status so here's some validation. - (define code-len (string-length code-str)) - (define (valid-pos? pos) (and (<= 0 pos) (< pos code-len))) - (define (valid-beg/end? beg end) - (and (< beg end) (valid-pos? beg) (valid-pos? end))) - - (define/override (syncheck:find-source-object stx) - (and (equal? src (syntax-source stx)) - src)) - - #;(define/override (syncheck:add-tail-arrow _from-text _from-pos _to-text to-pos) (void)) - - (define/override (syncheck:add-arrow/name-dup/pxpy - _def-text def-beg def-end _def-px _def-py - _use-text use-beg use-end _use-px _use-py - _actual? _level require-arrow? _name-dup?) - ;; Consolidate the add-arrow/name-dup items into a hash table - ;; with one item per definition. The key is the definition position. - ;; The value is the set of its uses' positions. - (hash-update! ht-defs/uses - (list (substring code-str def-beg def-end) - (match require-arrow? - ['module-lang 'module-lang] - [#t 'import] - [#f 'local]) - (add1 def-beg) - (add1 def-end)) - (λ (v) (set-add v (list (add1 use-beg) - (add1 use-end)))) - (set))) - - (define/override (syncheck:add-mouse-over-status _text beg end status) - (when (valid-beg/end? beg end) - ;; Avoid silly "imported from “\"file.rkt\"â€" - (define cleansed (regexp-replace* #px"[“â€â€]" status "")) - (set-add! infos (item 'info beg end - cleansed)) - - ;; Local completions candidates. When a definition isn't yet - ;; used, there will be no syncheck:add-arrow annotation - ;; because drracket doesn't need to draw an arrow from - ;; something to nothing. There _will_ however be a "no bound - ;; occurrences" mouseover. Although it's hacky to match on a - ;; string like that, it's the best way to get _all_ local - ;; completion candidates. It's the same reason why we go to - ;; the work in imported-completions to find _everything_ - ;; imported that _could_ be used. - (when (or (equal? status "no bound occurrences") - (regexp-match? #px"^\\d+ bound occurrences?$" status)) - (set-add! locals (substring code-str beg end))))) - - #;(define/override (syncheck:add-background-color _text start fin color) (void)) - - (define/override (syncheck:add-jump-to-definition text beg end id-sym path submods) - ;; - drracket/check-syntax only reports the file, not the - ;; position within. We can find that using our - ;; def-in-file. - ;; - ;; - drracket/check-syntax uses identifier-binding which - ;; isn't smart about contracting and/or renaming - ;; provides. As a result, the value of the id here can - ;; be wrong. e.g. For "make-traversal" it will report - ;; "provide/contract-id-make-traversal.1". It's good to - ;; try both ids with def-in-file. - ;; - ;; However, calling def-in-file here/now for all jumps - ;; would be quite slow. Futhermore, a user might not - ;; actually use the jumps -- maybe not any, probably not - ;; most, certainly not all. - ;; - ;; Sound like a job for a thunk, e.g. racket/promise - ;; delay/force? We can't marshal a promise between Racket - ;; back end and Emacs front end. We can do the moral - ;; equivalent: Simply return the info that the front end - ;; should give to the "def/drr" command if/as/when needed. - (when (file-exists? path) - (define drracket-id-str (symbol->string id-sym)) - (set-add! infos - (item 'external-def beg end - (path->string path) - submods - (if (equal? drracket-id-str text) - (list drracket-id-str) - (list drracket-id-str text)))))) - - #;(define/override (syncheck:add-definition-target _text start-pos end-pos id mods) (void)) - #;(define/override (syncheck:add-require-open-menu _text start-pos end-pos file) (void)) - - (define/override (syncheck:add-docs-menu _text beg end _sym _label path _anchor anchor-text) - (set-add! infos (item 'doc beg end - (path->string path) - anchor-text))) - - #;(define/override (syncheck:add-id-set to-be-renamed/poss dup-name?) (void)) - - (define/override (syncheck:add-unused-require _req-src beg end) - (set-add! infos (item 'unused-require beg end))) - - (define/public (get-annotations) - ;; Convert ht-defs/uses to a list of defs, each of whose uses - ;; are sorted by positions. - (define defs/uses - (with-time/log 'defs/uses - (for/list ([(def uses) (in-hash ht-defs/uses)]) - (match-define (list sym req def-beg def-end) def) - (list 'def/uses - def-beg def-end - req sym - (sort (set->list uses) < #:key car))))) - ;; annotations = infos + defs/uses, converted to a list sorted - ;; by positions. - (sort (append (set->list infos) - defs/uses) - < #:key cadr)) - - (define/public (get-locals) - locals) - - (super-new))) - -;; Typed Racket can report multiple errors. The protocol: it calls -;; error-display-handler for each one. There is a final, actual -;; exn:fail:syntax raised, but it's not useful for us: Although its -;; srclocs correspond to the locations, its message is just a summary. -;; Here we collect each message and location in a parameter, and when -;; the final summary exn is raised, we ignore it and use these. Note -;; that Typed Racket is the only such example I'm aware of, but if -;; something else wanted to report multiple errors, and it used a -;; similar approach, we'd handle it here, too. -(define pre-exn-errors (make-parameter '())) -(define ((our-error-display-handler path-str code-str) msg exn) - (when (and (exn:fail:syntax? exn) - (exn:srclocs? exn)) - (pre-exn-errors (append (pre-exn-errors) - (exn->errors path-str code-str exn))))) - -(define ((handle-fail path-str code-str) e) - (cons - 'check-syntax-errors - (cond - ;; Multiple errors. See comment above. - [(not (null? (pre-exn-errors))) - (pre-exn-errors)] - ;; The intended use of exn:srclocs is a _single_ error, with zero - ;; or more locations from least to most specific -- not multiple - ;; errors. - [(exn:srclocs? e) - (exn->errors path-str code-str e)] - ;; A single error with no srcloc at all. Although probably - ;; unlikely with exn:fail:syntax during expansion (as opposed to - ;; runtime errors) do handle it: - [else - (default-errors path-str code-str e)]))) - -(define (exn->errors path-str code-str e) - (define (->path-string v) - (match v - [(? path-string? v) v] - [(? path? v) (path->string v)])) - (match ((exn:srclocs-accessor e) e) - [(list) - (match e - ;; exn:fail:syntax and exn:fail:read can have empty srclocs - ;; list -- but additional struct member has list of syntaxes - ;; from least to most specific. Use the most-specific, only. - [(or (exn:fail:syntax msg _marks (list _ ... stx)) - (exn:fail:read msg _marks (list _ ... stx))) - #:when (not (exn:fail:read:eof? e)) - (define pos (syntax-position stx)) - (define span (syntax-span stx)) - (cond [(and pos span) - (list - (list 'error - (->path-string (or (syntax-source stx) path-str)) - pos - (+ pos span) - msg))] - [else (default-errors path-str code-str e)])] - [_ (default-errors path-str code-str e)])] - [(list _ ... (? srcloc? most-specific)) - (match-define (srcloc path _ _ pos span) most-specific) - (list - (list 'error - (->path-string path) - pos - (+ pos span) - (exn-message e)))] - [_ (default-errors path-str code-str e)])) - -(define (default-errors path-str code-str e) - ;; As a fallback, here, we extract position from the exn-message. - ;; Unfortunately that's line:col and we need to return beg:end. - (define pos (exn-message->pos code-str (exn-message e))) - (list - (list 'error - path-str - pos - (add1 pos) - (exn-message e)))) - -(define (exn-message->pos code-str msg) - (match msg - [(pregexp "^.+?:(\\d+)[:.](\\d+): " - (list _ (app string->number line) (app string->number col))) - (define in (open-input-string code-str)) - (port-count-lines! in) - (let loop ([n 1]) - (cond [(= n line) (+ 1 (file-position in) col)] - [(eof-object? (read-line in)) 1] - [else (loop (add1 n))]))] - [_ 1])) - -(module+ test - (check-equal? - (exn-message->pos "12\n4567\n9" - ; ^ - "/path/to/foo.rkt:2:2: some problem") - 6) - (check-equal? - (exn-message->pos "012\n4567\n9" - ; ^ - "/path/to/foo.rkt:999:2: some problem") - 1)) - -(module+ example - (require racket/file) - (define (check-file path) - (time (do-check-syntax path (file->string path)))) - (check-file (path->string (syntax-source #'here)))) - -(module+ test - (require racket/file) - (define (check-this-file path) - (check-not-exn - (λ () - (time (void (do-check-syntax path (file->string path))))))) - (check-this-file (path->string (syntax-source #'here))) - ;; Again to exercise and test cache - (check-this-file (path->string (syntax-source #'here)))) diff --git a/elpa/racket-mode-20200417.1741/racket/commands/coverage.rkt b/elpa/racket-mode-20200417.1741/racket/commands/coverage.rkt deleted file mode 100644 index cce3de0d..00000000 --- a/elpa/racket-mode-20200417.1741/racket/commands/coverage.rkt +++ /dev/null @@ -1,50 +0,0 @@ -#lang racket/base - -(require racket/list - racket/match - (only-in "../instrument.rkt" get-test-coverage-info)) - -(provide get-uncovered) - -(define (get-uncovered file) - (consolidate-coverage-ranges - (for*/list ([x (in-list (get-test-coverage-info))] - [covered? (in-value (first x))] - #:when (not covered?) - [src (in-value (second x))] - #:when (equal? file src) - [pos (in-value (third x))] - [span (in-value (fourth x))]) - (cons pos (+ pos span))))) - -(define (consolidate-coverage-ranges xs) - (remove-duplicates (sort xs < #:key car) - same?)) - -(define (same? x y) - ;; Is x a subset of y or vice versa? - (match-define (cons x/beg x/end) x) - (match-define (cons y/beg y/end) y) - (or (and (<= x/beg y/beg) (<= y/end x/end)) - (and (<= y/beg x/beg) (<= x/end y/end)))) - -(module+ test - (require rackunit) - (check-true (same? '(0 . 9) '(0 . 9))) - (check-true (same? '(0 . 9) '(4 . 5))) - (check-true (same? '(4 . 5) '(0 . 9))) - (check-false (same? '(0 . 1) '(1 . 2))) - (check-equal? (consolidate-coverage-ranges - '((10 . 20) (10 . 11) (19 . 20) (10 . 20) - (20 . 30) (20 . 21) (29 . 30) (20 . 30))) - '((10 . 20) - (20 . 30))) - ;; This is a test of actual coverage data I got from one example, - ;; where the maximal subsets were (164 . 197) and (214. 247). - (check-equal? - (consolidate-coverage-ranges - '((164 . 197) (164 . 197) (164 . 197) - (173 . 180) (173 . 180) (173 . 180) (173 . 180) (173 . 180) (187 . 196) - (214 . 247) (214 . 247) (214 . 247) - (223 . 230) (223 . 230) (223 . 230) (223 . 230) (223 . 230) (237 . 246))) - '((164 . 197) (214 . 247)))) diff --git a/elpa/racket-mode-20200417.1741/racket/commands/describe.rkt b/elpa/racket-mode-20200417.1741/racket/commands/describe.rkt deleted file mode 100644 index 346a4067..00000000 --- a/elpa/racket-mode-20200417.1741/racket/commands/describe.rkt +++ /dev/null @@ -1,127 +0,0 @@ -#lang racket/base - -(require racket/contract - racket/format - racket/match - racket/port - (only-in xml xexpr->string) - (only-in "../find.rkt" find-signature) - "../identifier.rkt" - "../scribble.rkt") - -(provide type - describe) - -(module+ test - (require rackunit)) - -;;; type - -(define/contract (type how str) - (-> how/c string? (or/c #f string?)) - (or (and (eq? how 'namespace) - (->identifier 'namespace str type-or-contract)) - (->identifier how str identifier->bluebox) - (match (find-signature how str) - [#f #f] - [x (~a x)]))) - -(define (type-or-contract v) ;any/c -> (or/c #f string?) - (or - ;; 1. Try using Typed Racket's REPL simplified type. - (with-handlers ([exn:fail? (λ _ #f)]) - (match (with-output-to-string - (λ () - ((current-eval) - (cons '#%top-interaction v)))) - [(pregexp "^- : (.*) \\.\\.\\..*\n" (list _ t)) t] - [(pregexp "^- : (.*)\n$" (list _ t)) t])) - ;; 2. Try to find a contract. - (with-handlers ([exn:fail? (λ _ #f)]) - (parameterize ([error-display-handler (λ _ (void))]) - ((current-eval) - (cons '#%top-interaction - `(if (has-contract? ,v) - (~a (contract-name (value-contract ,v))) - (error "")))))))) - -;;; describe - -;; If a symbol has installed documentation, display it. -;; -;; Otherwise, walk the source to find a function definition signature -;; (the argument names may have explanatory value). When using a -;; module->namespace, also look for Typed Racket type or a contract, -;; if any. - -(define/contract (describe how str) - (-> (or/c how/c - (cons/c path-string? string?) - (list/c path-string?)) - string? - string?) - (match how - [(list (? path-string? path)) - (or (path+anchor->html (cons path #f)) - "Documentation not found")] - [(cons (? path-string? path) (? string? anchor)) - (or (path+anchor->html (cons path anchor)) - "Documentation not found")] - [(and (or 'namespace (? path-string?)) how) - (->identifier how str - (λ (stx) - (or (path+anchor->html (binding->path+anchor stx)) - (sig-and/or-type how stx))))])) - -(define/contract (sig-and/or-type how stx) - (-> how/c identifier? string?) - (define dat (syntax->datum stx)) - (define s (match (find-signature how (symbol->string dat)) - [#f #f] - [x (~a x)])) - (define t (and (eq? how 'namespace) - (type-or-contract stx))) - (xexpr->string - `(div () - (h1 () ,(or s (~a dat))) - ,(cond [(not (or s t)) - `(p () - (em () ,(if (eq? how 'namespace) - "(Found no documentation, signature, type, or contract.)" - "(Found no documentation or signature.")))] - [t `(pre () ,t)] - [else ""]) - (br ())))) - -(module+ test - (require rackunit - (only-in xml string->xexpr) - "../syntax.rkt") - ;; Check something that is in the namespace resulting from - ;; module->namespace on, say, this source file. - (parameterize ([current-namespace (module->namespace (syntax-source #'this-file))]) - (check-equal? - ;; Convert back to an xexpr because easier to grok test and also - ;; older xexpr->string probably used
instead of
. - (string->xexpr (describe 'namespace "describe")) - `(div () - (h1 () "(describe how str)") - (pre () "(-" ">" " (or/c (or/c (quote namespace) path-string?) (cons/c path-string? string?) (list/c path-string?)) string? string?)") - (br ())))) - - ;; Check something that is not in the current namespace, but is an - ;; identifier in the lexical context of an expanded module form -- - ;; including imported identifiers -- from the expanded syntax - ;; cache. - (define path-str "/path/to/foobar.rkt") - (define code-str (~a '(module foobar racket/base - (define (fun a b c) - (void))))) - ;; Get the expanded syntax in our cache - (string->expanded-syntax path-str code-str void) - ;; Note that this doesn't find contracts, just sigs. - (check-equal? - (string->xexpr (describe path-str "fun")) - `(div () - (h1 () "(fun a b c)") - (br ())))) diff --git a/elpa/racket-mode-20200417.1741/racket/commands/find-module.rkt b/elpa/racket-mode-20200417.1741/racket/commands/find-module.rkt deleted file mode 100644 index 899906dd..00000000 --- a/elpa/racket-mode-20200417.1741/racket/commands/find-module.rkt +++ /dev/null @@ -1,46 +0,0 @@ -#lang racket/base - -(require racket/contract - racket/match - syntax/modresolve - "../mod.rkt") - -(provide find-module) - -(define/contract (find-module str maybe-mod) - (-> string? (or/c #f mod?) - (or/c #f (list/c path-string? number? number?))) - (define-values (dir _file maybe-rmp) (maybe-mod->dir/file/rmp maybe-mod)) - (parameterize ([current-load-relative-directory dir]) - (or (mod-loc str maybe-rmp) - (mod-loc (string->symbol str) maybe-rmp)))) - -(define (mod-loc v maybe-rmp) - (match (with-handlers ([exn:fail? (λ _ #f)]) - (resolve-module-path v maybe-rmp)) - [(? path-string? path) - #:when (file-exists? path) - (list (path->string path) 1 0)] - [_ #f])) - -(module+ test - (require rackunit - racket/runtime-path) - (define-runtime-path here ".") - (let* ([here (simplify-path here)] ;nuke trailing dot - ;; Examples of finding relative and absolute: - [requires.rkt (path->string (build-path here "requires.rkt"))] - [pe-racket/string (pregexp "collects/racket/string.rkt$")]) - ;; Examples of having no current module (i.e. plain racket/base - ;; REPL) and having one ("coverage.rkt"). - (let ([mod #f]) - (parameterize ([current-directory here]) - (check-match (find-module "requires.rkt" mod) - (list (== requires.rkt) 1 0)) - (check-match (find-module "racket/string" mod) - (list pe-racket/string 1 0)))) - (let ([mod (->mod/existing (build-path here "coverage.rkt"))]) - (check-match (find-module "requires.rkt" mod) - (list (== requires.rkt) 1 0)) - (check-match (find-module "racket/string" mod) - (list pe-racket/string 1 0))))) diff --git a/elpa/racket-mode-20200417.1741/racket/commands/help.rkt b/elpa/racket-mode-20200417.1741/racket/commands/help.rkt deleted file mode 100644 index 00ac366a..00000000 --- a/elpa/racket-mode-20200417.1741/racket/commands/help.rkt +++ /dev/null @@ -1,51 +0,0 @@ -#lang at-exp racket/base - -(require (only-in scribble/core tag?) - scribble/xref - setup/dirs - setup/xref - net/uri-codec - racket/contract - racket/format - racket/match - "../identifier.rkt") - -(provide doc) - -;; Once upon a time, you could enter commands in the REPL like ",doc". -;; It made sense to open the browser here -- despite needing junk to -;; convince macOS to open a file: URL using anchors a.k.a. fragments. -;; -;; But nowadays? Just return the URL. Let Emacs open the browser. -;; Especially because now check-syntax sometimes returns a help URL, -;; in which case the front end should just open the browser. Given -;; that case, let's always open the browser one consistent way -- in -;; Emacs using browse-url. - -;; We are lazy-required so `delay`-ing would be N/A. -(define xref (load-collections-xref)) - -(define/contract (doc how str) - (-> how/c string? string?) - (or (->identifier how str stx->uri-string) - (search str))) - -(define (stx->uri-string stx) - (~a "file://" - (match (and xref (xref-binding->definition-tag xref stx 0)) - [(? tag? tag) - (define-values (path anchor) (xref-tag->path+anchor xref tag)) - (~a path "#" anchor)] - [_ (search (~a (syntax->datum stx)))]))) - -(define (search str) - (~a (for/or ([f (in-list (list find-user-doc-dir find-doc-dir))]) - (search-dir f)) - "?q=" - (uri-encode str))) - -(define (search-dir f) - (match (f) - [(? path? dir) (define path (build-path dir "search/index.html")) - (and (file-exists? path) (path->string path))] - [_ #f])) diff --git a/elpa/racket-mode-20200417.1741/racket/commands/macro.rkt b/elpa/racket-mode-20200417.1741/racket/commands/macro.rkt deleted file mode 100644 index cd616f92..00000000 --- a/elpa/racket-mode-20200417.1741/racket/commands/macro.rkt +++ /dev/null @@ -1,169 +0,0 @@ -#lang racket/base - -(require (only-in macro-debugger/stepper-text - stepper-text) - racket/contract - racket/file - racket/format - racket/match - (only-in racket/path - path-only) - racket/pretty - racket/system - "../elisp.rkt" - "../repl-session.rkt" - "../syntax.rkt" - "../util.rkt") - -(provide macro-stepper - macro-stepper/next) - -(define step/c (cons/c (or/c 'original string? 'final) string?)) -(define step-proc/c (-> (or/c 'next 'all) (listof step/c))) -(define step-proc #f) - -(define/contract (make-expr-stepper str) - (-> string? step-proc/c) - (unless (current-session-id) - (error 'make-expr-stepper "Does not work without a running REPL")) - (define step-num #f) - (define last-stx (string->namespace-syntax str)) - (define/contract (step what) step-proc/c - (cond [(not step-num) - (set! step-num 0) - (list (cons 'original - (pretty-format-syntax last-stx)))] - [else - (define result - (let loop () - (define this-stx (expand-once last-stx)) - (cond [(equal? (syntax->datum last-stx) - (syntax->datum this-stx)) - (cond [(eq? what 'all) - (list (cons 'final - (pretty-format-syntax this-stx)))] - [else (list)])] - [else - (set! step-num (add1 step-num)) - (define step - (cons (~a step-num ": expand-once") - (diff-text (pretty-format-syntax last-stx) - (pretty-format-syntax this-stx) - #:unified 3))) - (set! last-stx this-stx) - (cond [(eq? what 'all) (cons step (loop))] - [else (list step)])]))) - (match result - [(list) (list (cons 'final - (pretty-format-syntax last-stx)))] - [v v])])) - step) - -(define/contract (make-file-stepper path into-base?) - (-> (and/c path-string? absolute-path?) boolean? step-proc/c) - (assert-file-stepper-works) - (define stx (file->syntax path)) - (define dir (path-only path)) - (define ns (make-base-namespace)) - (define raw-step (parameterize ([current-load-relative-directory dir] - [current-namespace ns]) - (stepper-text stx - (if into-base? (λ _ #t) (not-in-base))))) - (define step-num #f) - (define step-last-after "") - (log-racket-mode-debug "~v ~v ~v" path into-base? raw-step) - (define/contract (step what) step-proc/c - (cond [(not step-num) - (set! step-num 0) - (list (cons 'original - (pretty-format-syntax stx)))] - [else - (define out (open-output-string)) - (cond [(parameterize ([current-output-port out]) - (raw-step what)) - (log-racket-mode-debug "~v" (get-output-string out)) - (define in (open-input-string (get-output-string out))) - (let loop () - (match (parameterize ([current-input-port in]) - (read-step)) - [(? eof-object?) - (cond [(eq? what 'all) - (list (cons 'final step-last-after))] - [else (list)])] - [(list title before after) - (set! step-num (add1 step-num)) - (set! step-last-after after) - (cons (cons (~a step-num ": " title) - (diff-text before after #:unified 3)) - (loop))]))] - [else - (list (cons 'final step-last-after))])])) - step) - -(define (read-step) - (define title (read-line)) - (define before (read)) - (define _arrow (read)) ; '==> - (define after (read)) - (read-line) - (match (read-line) - [(? eof-object? e) e] - [_ (list title - (pretty-format #:mode 'write before) - (pretty-format #:mode 'write after))])) - -(define (assert-file-stepper-works) - (define step (stepper-text #'(module example racket/base 42))) - (unless (step 'next) - (error 'macro-debugger/stepper-text - "does not work in your version of Racket.\nPlease try an older or newer version."))) - -(define/contract (macro-stepper what into-base?) - (-> (or/c (cons/c 'expr string?) (cons/c 'file path-string?)) elisp-bool/c - (list/c step/c)) - (set! step-proc - (match what - [(cons 'expr str) (make-expr-stepper str)] - [(cons 'file path) (make-file-stepper path (as-racket-bool into-base?))])) - (macro-stepper/next 'next)) - -(define/contract (macro-stepper/next what) step-proc/c - (unless step-proc - (error 'macro-stepper "Nothing to expand")) - (define v (step-proc what)) - (match v - [(list (cons 'final _)) (set! step-proc #f)] - [_ (void)]) - v) - -;; Borrowed from xrepl. -(define not-in-base - (λ () (let ([base-stxs #f]) - (unless base-stxs - (set! base-stxs ; all ids that are bound to a syntax in racket/base - (parameterize ([current-namespace (make-base-namespace)]) - (let-values ([(vals stxs) (module->exports 'racket/base)]) - (map (λ (s) (namespace-symbol->identifier (car s))) - (cdr (assq 0 stxs))))))) - (λ (id) (not (ormap (λ (s) (free-identifier=? id s)) base-stxs)))))) - -(define (diff-text before-text after-text #:unified [-U 3]) - (define template "racket-mode-syntax-diff-~a") - (define (make-temporary-file-with-text str) - (define file (make-temporary-file template)) - (with-output-to-file file #:mode 'text #:exists 'replace - (λ () (displayln str))) - file) - (define before-file (make-temporary-file-with-text before-text)) - (define after-file (make-temporary-file-with-text after-text)) - (define out (open-output-string)) - (begin0 (parameterize ([current-output-port out]) - (system (format "diff -U ~a ~a ~a" -U before-file after-file)) - (match (get-output-string out) - ["" " \n"] - [(pregexp "\n(@@.+@@\n.+)$" (list _ v)) v])) - (delete-file before-file) - (delete-file after-file))) - -(define (pretty-format-syntax stx) - (pretty-format #:mode 'write (syntax->datum stx))) diff --git a/elpa/racket-mode-20200417.1741/racket/commands/module-names.rkt b/elpa/racket-mode-20200417.1741/racket/commands/module-names.rkt deleted file mode 100644 index 9890cd36..00000000 --- a/elpa/racket-mode-20200417.1741/racket/commands/module-names.rkt +++ /dev/null @@ -1,90 +0,0 @@ -#lang racket/base - -(require racket/contract - racket/match - racket/set - racket/string - (only-in "../util.rkt" - path-has-extension? - path-replace-extension)) - -(provide module-names) - -(struct collection - (maybe-prefix ;(or/c #f string?) when a rktd link entry starts with a string - path)) ;path? - -(define (module-names) - (define results (mutable-set)) - (for ([coll (in-set (collections))]) - (define top (collection-path coll)) - (when (safe-directory-exists? top) - (parameterize ([current-directory top]) - (for ([raw-p (in-directory #f use?)]) - (define p (maybe-prefix-path-for-collection coll raw-p)) - (define-values (base name dir?) (split-path p)) - (define name-str (path->string name)) - (when (and (use? p) - (or dir? - (path-has-extension? p #"rkt") - (path-has-extension? p #"ss"))) - (define v (path->string - ;; path/to/main.rkt => path/to - (match (explode-path p) - [(list xs ..1 (== (build-path "main.rkt"))) - (apply build-path xs)] - [_ (path-replace-extension p #"")]))) - (set-add! results v)))))) - (sort (set->list results) - stringstring name)) - (and (not (string-prefix? name-str ".")) - (not (member name-str '("compiled" - "info.rkt" - "private" - "scribblings" - "tests"))))) - -(define (collections) - (define results (mutable-set)) - (for ([link-file (in-list (current-library-collection-links))]) - (cond [link-file - (when (file-exists? link-file) - (define-values (base name dir?) (split-path link-file)) - (match (with-handlers ([exn:fail? (λ (x) '())]) - (call-with-input-file link-file read)) - [(? list? vs) - (for ([v (in-list vs)]) - (when (if (and (list? v) (= 3 (length v))) - (and (regexp? (list-ref v 2)) - (regexp-match (list-ref v 2) (version))) - #t) - (define prefix (if (string? (list-ref v 0)) - (list-ref v 0) - #f)) - (define path (simplify-path - (if (relative-path? (list-ref v 1)) - (build-path base (list-ref v 1)) - (list-ref v 1)))) - (set-add! results - (collection prefix - path))))] - [_ (void)]))] - [else - (for ([p (in-list (current-library-collection-paths))]) - (set-add! results (collection #f - (simplify-path p))))])) - results) - -(define (maybe-prefix-path-for-collection coll path) - (if (collection-maybe-prefix coll) - (build-path (collection-maybe-prefix coll) path) - path)) - -(define/contract (safe-directory-exists? d) - (-> path-string? boolean?) - (with-handlers ([exn:fail? (λ (x) #f)]) - (directory-exists? d))) diff --git a/elpa/racket-mode-20200417.1741/racket/commands/profile.rkt b/elpa/racket-mode-20200417.1741/racket/commands/profile.rkt deleted file mode 100644 index c466799b..00000000 --- a/elpa/racket-mode-20200417.1741/racket/commands/profile.rkt +++ /dev/null @@ -1,19 +0,0 @@ -#lang racket/base - -(require racket/match - (only-in "../instrument.rkt" get-profile-info)) - -(provide get-profile) - -(define (get-profile) - ;; TODO: Filter files from racket-mode itself, b/c just noise? - (for/list ([x (in-list (get-profile-info))]) - (match-define (list count msec name stx _ ...) x) - (list count - msec - (and name (symbol->string name)) - (and (syntax-source stx) (path? (syntax-source stx)) - (path->string (syntax-source stx))) - (syntax-position stx) - (and (syntax-position stx) (syntax-span stx) - (+ (syntax-position stx) (syntax-span stx)))))) diff --git a/elpa/racket-mode-20200417.1741/racket/commands/requires.rkt b/elpa/racket-mode-20200417.1741/racket/commands/requires.rkt deleted file mode 100644 index 5a6b1272..00000000 --- a/elpa/racket-mode-20200417.1741/racket/commands/requires.rkt +++ /dev/null @@ -1,459 +0,0 @@ -#lang at-exp racket/base - -(require (only-in macro-debugger/analysis/check-requires show-requires) - racket/contract - racket/format - racket/function - (only-in racket/list append* append-map add-between filter-map) - racket/match - racket/set - racket/string) - -(provide requires/tidy - requires/trim - requires/base) - -(module+ test - (require rackunit)) - -(define require-subform? (or/c module-path? list?)) -(define require-form? (cons/c 'require (listof require-subform?))) - -(define level? (or/c #f number? 'racket/require)) -(define denormalized? (hash/c level? (set/c require-subform?))) - - -(define/contract (requires/tidy reqs) - (-> (listof require-form?) string?) - (require-pretty-format - (normalize - (denormalize reqs)))) - -(module+ test - (check-equal? - (requires/tidy '((require z) - (require (prefix-in a: a)) - (require c d e))) - "(require (prefix-in a: a)\n c\n d\n e\n z)\n")) - -;; Note: Why pass in a list of the existing require forms -- why not -;; just use the "keep" list from show-requires? Because the keep list -;; only states the module name, not the original form. Therefore if -;; the original require has a subform like `(only-in mod f)` (or -;; rename-in, except-in, &c), we won't know how to preserve that -;; unless we're given it. That's why our strategy must be to look for -;; things to drop, as opposed to things to keep. -(define/contract (requires/trim path-str reqs) - (-> path-string? (listof require-form?) string?) - (require-pretty-format - (normalize - (denormalize reqs - #:drops (requires-to-drop (analyze path-str)))))) - -(define/contract (requires/base path-str reqs) - (-> path-string? (listof require-form?) string?) - (define a (analyze path-str)) - (require-pretty-format - (normalize - (denormalize reqs - #:adds (requires-to-add a) - #:drops (requires-to-drop a))))) - -;;; analyze - -(define requires-analysis? (listof (or/c (list/c 'keep module-path? number?) - (list/c 'bypass module-path? number? list?) - (list/c 'drop module-path? number?)))) -(define mod+level? (list/c module-path? number?)) - -(define/contract (analyze path-str) - (-> path-string? requires-analysis?) - (define-values (base name _) (split-path (string->path path-str))) - (parameterize ([current-load-relative-directory base] - [current-directory base]) - (show-requires name))) - -;; Use `bypass` convert from `#lang racket` to `#lang racket/base` -;; plus explicit requires. Hardcoded to `#lang racket`, only. -(define/contract (requires-to-drop a) - (-> requires-analysis? (listof mod+level?)) - (filter-map (λ (x) - (match x - [(list 'drop mod lvl) (list mod lvl)] - [_ #f])) - a)) - -(define/contract (requires-to-add a) - (-> requires-analysis? (listof mod+level?)) - (append* - (filter-map (λ (x) - (match x - [(list 'bypass 'racket 0 (list (list mod lvl _) ...)) - (filter (λ (x) - (match x - [(list 'racket/base 0) #f] - [_ #t])) - (map list mod lvl))] - [_ #f])) - a))) - -;;; denormalize / normalize - -(define/contract (denormalize reqs - #:drops [drops '()] - #:adds [adds '()]) - (->* ((listof require-form?)) - (#:adds (listof mod+level?) - #:drops (listof mod+level?)) - denormalized?) - (define ht (make-hasheq)) - (define (add* level v) - (unless (and (not (eq? v 'racket/require)) ;always keep - (member (list (form-mod v) level) drops)) - (hash-update! ht - (if (eq? v 'racket/require) 'racket/require level) - (λ (s) (set-add s v)) - set))) - (define (add level v) - (match v - [(list* 'multi-in vs) (for-each (curry add* level) (multi vs))] - [v (add* level v)])) - (for ([add (in-list adds)]) - (match-define (list mod level) add) - (add* level mod)) - (for ([req (in-list reqs)]) - (match-define (cons 'require vs) req) - (for ([v (in-list vs)]) - (match v - [(list* 'for-meta level vs) (for-each (curry add level) vs)] - [(list* 'for-syntax vs) (for-each (curry add 1 ) vs)] - [(list* 'for-template vs) (for-each (curry add -1 ) vs)] - [(list* 'for-label vs) (for-each (curry add #f ) vs)] - [v (add 0 v)]))) - ht) - -;; `multi` from racket/require adapted for plain sexprs not stxs -(define (multi xs) - (define (loop xs) - (if (null? xs) - '(()) - (let ([first (car xs)] - [rest (loop (cdr xs))]) - (if (list? first) - (let ([bads (filter list? first)]) - (if (null? bads) - (append-map (λ (x) (map (λ (y) (cons x y)) rest)) first) - (error 'multi-in "not a simple element" (car bads)))) - (map (λ (x) (cons first x)) rest))))) - (define options (loop xs)) - (define (try pred? ->str str->) - (and (andmap (λ (x) (andmap pred? x)) options) - (map (λ (x) - (let* ([d x] - [r (apply string-append - (add-between (if ->str (map ->str d) d) - "/"))]) - (if str-> (str-> r) r))) - options))) - (or (try string? #f #f) - (try symbol? symbol->string string->symbol) - (error 'multi-in "only accepts all strings or all symbols"))) - -(module+ test - (let ([ht (denormalize '((require a b c) - (require d e) - (require a f) - (require - (for-syntax s t u) - (for-label l0 l1 l2)) - (require - (for-meta 1 m1a m1b) - (for-meta 2 m2a m2b)) - (require - (multi-in foo (bar baz)) - (multi-in "foo" ("bar.rkt" "baz.rkt")))))]) - (check-equal? (hash-ref ht 0) - (set 'a 'e 'd 'foo/bar "foo/baz.rkt" "foo/bar.rkt" 'c 'f 'b 'foo/baz)) - (check-equal? (hash-ref ht 1) - (set 'm1a 'm1b 't 'u 's)) - (check-equal? (hash-ref ht 2) - (set 'm2b 'm2a)) - (check-equal? (hash-ref ht #f) - (set 'l1 'l2 'l0)))) - -;; Sort the subforms by phase level: for-syntax, for-template, -;; for-label, for-meta, and plain (0). Within each such group, sort -;; them first by module paths then relative requires. Within each such -;; group, sort alphabetically. If racket/require is present, sort it -;; first and use multi-in. -(define/contract (normalize ht) - (-> denormalized? require-form?) - (define (mod-set->mod-list mod-set) - (sort (set->list mod-set) modmod-list mods)))] - [mods - (k (mod-set->mod-list mods))])) - (define (preface . pres) - (λ (mods) `((,@pres ,@mods)))) - (define (meta-levels) - (sort (for/list ([x (hash-keys ht)] - #:when (not (member x '(racket/require -1 0 1 #f)))) - x) - <)) - `(require - ,@(for-level 'racket/require values) - ,@(for-level 1 (preface 'for-syntax)) - ,@(for-level -1 (preface 'for-template)) - ,@(for-level #f (preface 'for-label)) - ,@(append* (for/list ([level (in-list (meta-levels))]) - (for-level level (preface 'for-meta level)))) - ,@(for-level 0 values))) - -(module+ test - ;; with racket/require - (check-equal? (normalize - (denormalize - '((require z c b a) - (require racket/require) ; <==== - (require (multi-in mi-z (mi-z0 mi-z1))) - (require mi-z/mi-z2) - (require (multi-in mi-a (mi-a1 mi-a0))) - (require mi-a/mi-a2) - (require (for-meta 4 m41 m40)) - (require (for-meta -4 m-41 m-40)) - (require (for-label l1 l0)) - (require (for-template t1 t0)) - (require (for-syntax s1 s0)) - (require - "a.rkt" "b.rkt" "c.rkt" "z.rkt" - (only-in "mod.rkt" oi) - (only-in mod oi))))) - '(require - racket/require - (for-syntax s0 s1) - (for-template t0 t1) - (for-label l0 l1) - (for-meta -4 m-40 m-41) - (for-meta 4 m40 m41) - a b c - (multi-in mi-a (mi-a0 mi-a1 mi-a2)) ;b/c racket/require - (multi-in mi-z (mi-z0 mi-z1 mi-z2)) ;b/c racket/require - (only-in mod oi) z - "a.rkt" "b.rkt" "c.rkt" (only-in "mod.rkt" oi) "z.rkt")) - ;; without racket/require - (check-equal? (normalize - (denormalize - '((require z c b a) - (require mi-a/mi-a0) - (require mi-a/mi-a1) - (require mi-z/mi-z0) - (require mi-z/mi-z1) - (require (for-meta 4 m41 m40)) - (require (for-meta -4 m-41 m-40)) - (require (for-label l1 l0)) - (require (for-template t1 t0)) - (require (for-syntax s1 s0)) - (require - "a.rkt" "b.rkt" "c.rkt" "z.rkt" - (only-in "mod.rkt" oi) - (only-in mod oi))))) - '(require - (for-syntax s0 s1) - (for-template t0 t1) - (for-label l0 l1) - (for-meta -4 m-40 m-41) - (for-meta 4 m40 m41) - a b c - mi-a/mi-a0 - mi-a/mi-a1 - mi-z/mi-z0 - mi-z/mi-z1 - (only-in mod oi) z - "a.rkt" "b.rkt" "c.rkt" (only-in "mod.rkt" oi) "z.rkt"))) - -(define (add-multi-in xs) - ;; (-> (listof require-subform?) (listof require-subform?)) - ;; 1. Assumes xs are sorted. 2. Only tries to discover/add multi-in - ;; forms where the first element is a single item -- e.g. (multi-in - ;; a (b c)) but not (multi-in (a b) (c d)). - (define (split v) - (cond [(string? v) (string-split v #px"/")] - [(symbol? v) (map string->symbol (string-split (symbol->string v) #px"/"))] - [else (list)])) - (define (join vs) - (cond [(andmap string? vs) (string-join vs "/")] - [(andmap symbol? vs) (string->symbol (string-join (map symbol->string vs) "/"))] - [else (error 'add-multi-in "not strings or symbols")])) - (let loop ([xs xs]) - (match xs - [(list) (list)] - [(list x) (list x)] - [(list* (and `(multi-in ,pre ,vs) this) next more) - (define-values (pres this-rest next-rest) (split-common-prefix (split pre) (split next))) - (cond [(equal? (split pre) pres) - (loop (list* `(multi-in ,pre ,(append vs (list (join next-rest)))) - more))] - [else - (cons this (loop (list* next more)))])] - [(list* this next more) - (define-values (pres this-rest next-rest) (split-common-prefix (split this) (split next))) - (cond [(null? pres) - (cons this (loop (list* next more)))] - [else - (loop (list* `(multi-in ,(join pres) (,(join this-rest) ,(join next-rest))) - more))])]))) - -(module+ test - (check-equal? (add-multi-in '(a b c)) - '(a b c)) - (check-equal? (add-multi-in '(a (prefix-in b: b) c)) - '(a (prefix-in b: b) c)) - (check-equal? (add-multi-in '(racket/string b c)) - '(racket/string b c)) - (check-equal? (add-multi-in '(racket/format racket/string s t)) - '((multi-in racket (format string)) s t)) - (check-equal? (add-multi-in '(racket/contract racket/format racket/string s t)) - '((multi-in racket (contract format string)) s t)) - (check-equal? (add-multi-in '(a/b/x a/b/y)) - '((multi-in a/b (x y)))) - (check-equal? (add-multi-in '("a.rkt" "b.rkt" "c.rkt")) - '("a.rkt" "b.rkt" "c.rkt")) - (check-equal? (add-multi-in '("a.rkt" (prefix-in b: "b.rkt") "c.rkt")) - '("a.rkt" (prefix-in b: "b.rkt") "c.rkt")) - (check-equal? (add-multi-in '("a/x.rkt" "b.rkt" "c.rkt")) - '("a/x.rkt" "b.rkt" "c.rkt")) - (check-equal? (add-multi-in '("a/x.rkt" "a/y.rkt" "b.rkt" "c.rkt")) - '((multi-in "a" ("x.rkt" "y.rkt")) "b.rkt" "c.rkt")) - (check-equal? (add-multi-in '("a/x.rkt" "a/y.rkt" "a/z.rkt" "b.rkt" "c.rkt")) - '((multi-in "a" ("x.rkt" "y.rkt" "z.rkt")) "b.rkt" "c.rkt")) - (check-equal? (add-multi-in '("a/b/x.rkt" "a/b/y.rkt")) - '((multi-in "a/b" ("x.rkt" "y.rkt"))))) - -;; Defined here b/c not in Racket < 6.3 and we support 6.2 -(define (split-common-prefix as bs) - (let loop ([as as] [bs bs]) - (if (and (pair? as) (pair? bs) (equal? (car as) (car bs))) - (let-values ([(prefix atail btail) (loop (cdr as) (cdr bs))]) - (values (cons (car as) prefix) atail btail)) - (values null as bs)))) - -(define (form-mod x) - (match x - [(list 'only-in m _ ...) (form-mod m)] - [(list 'except-in m _ ...) (form-mod m)] - [(list 'prefix-in _ m) (form-mod m)] - [(list 'relative-in _ m _ ...) (form-mod m)] - [(list 'multi-in m _) (form-mod m)] - [m m])) - -(define (modstring a) (symbol->string b)))))) - -(module+ test - (check-true (mod list? string?) - (define out (open-output-string)) - (parameterize ([current-output-port out]) - (require-pretty-print x)) - (get-output-string out)) - -(module+ test - (check-equal? (require-pretty-format - '(require a)) - @~a{(require a) - - }) - (check-equal? (require-pretty-format - '(require a b)) - @~a{(require a - b) - - }) - (check-equal? (require-pretty-format - '(require (for-syntax a b) (for-meta 2 c d) e f)) - @~a{(require (for-syntax a - b) - (for-meta 2 c - d) - e - f) - - }) - (check-equal? (require-pretty-format - `(require (only-in m a b) (except-in m a b))) - @~a{(require (only-in m - a - b) - (except-in m - a - b)) - - })) - -;; Pretty print a require form with one module per line and with -;; indentation for the `for-X` subforms. Example: -;; -;; (require (for-syntax racket/base -;; syntax/parse) -;; (for-meta 3 racket/a -;; racket/b) -;; racket/format -;; racket/string -;; "a.rkt" -;; "b.rkt") -(define/contract (require-pretty-print x) - (-> list? any) - (define (prn x first? indent) - (define (indent-string) - (if first? "" (make-string indent #\space))) - (define (prn-form pre this more) - (define new-indent (+ indent (+ 2 (string-length pre)))) - (printf "~a(~a " (indent-string) pre) - (prn this #t new-indent) - (for ([x more]) - (newline) - (prn x #f new-indent)) - (display ")")) - (match x - [(list 'require) - (void)] - [(list* (and pre (or 'require 'for-syntax 'for-template 'for-label - 'only-in 'except-in)) - this more) - (prn-form (format "~s" pre) this more) - (when (eq? pre 'require) - (newline))] - [(list* 'for-meta level this more) - (prn-form (format "for-meta ~a" level) this more)] - [this - (printf "~a~s" (indent-string) this)])) - (prn x #t 0)) diff --git a/elpa/racket-mode-20200417.1741/racket/debug-annotator.rkt b/elpa/racket-mode-20200417.1741/racket/debug-annotator.rkt deleted file mode 100644 index 33a3ab30..00000000 --- a/elpa/racket-mode-20200417.1741/racket/debug-annotator.rkt +++ /dev/null @@ -1,381 +0,0 @@ -#lang racket/base - -(require (for-syntax racket/base) - gui-debugger/marks - (only-in mzscheme [apply plain-apply]) - (prefix-in kernel: syntax/kerncase)) - -;; This is like gui-debugger/annotate except: -;; -;; 0. Our annotate-stx does NOT add breaks to syntax sources not -;; matching the syntax it is given. See -;; https://github.com/racket/drracket/issues/230 and below. -;; -;; 1. Our module-annotate disarms/rearms module level expressions. See -;; https://github.com/racket/drracket/issues/231 and below. -;; -;; 2. "Modernize": Use racket/base not racket/scheme. Don't need -;; opt-lambda. -;; -;; 3. We remove the record-bound-id and record-top-level-id callbacks -;; that we don't use, from annotate-for-single-stepping (but leave -;; them for now in annotate-stx). -;; -;; 4. We remove the source arg that is completely unused (I'm guessing -;; historical). - -(provide annotate-for-single-stepping) - -(define (annotate-for-single-stepping stx break? break-before break-after) - (define (break-wrap debug-info annotated raw is-tail?) - (let* ([start (syntax-position raw)] - [end (+ start (syntax-span raw) -1)] - [break? (break? (syntax-source raw))]) - (if is-tail? - #`(let-values ([(value-list) #f]) - (if (#%plain-app #,break? #,start) - (set! value-list (#%plain-app - #,break-before - #,debug-info - (#%plain-app current-continuation-marks))) - (#%plain-app void)) - (if (#%plain-app not value-list) - #,annotated - (#%plain-app plain-apply values value-list))) - #`(let-values ([(value-list) #f]) - (if (#%plain-app #,break? #,start) - (set! value-list (#%plain-app - #,break-before - #,debug-info - (#%plain-app current-continuation-marks))) - (#%plain-app void)) - (if (#%plain-app not value-list) - (#%plain-app - call-with-values - (#%plain-lambda () #,annotated) - (case-lambda - [(val) (if (#%plain-app #,break? #,end) - (#%plain-app - #,break-after - #,debug-info - (#%plain-app current-continuation-marks) - val) - val)] - [vals (if (#%plain-app - #,break? #,end) - (#%plain-app - plain-apply - #,break-after - #,debug-info - (#%plain-app current-continuation-marks) - vals) - (#%plain-app plain-apply values vals))])) - (if (#%plain-app #,break? #,end) - (#%plain-app - plain-apply #,break-after - #,debug-info - (#%plain-app current-continuation-marks) - value-list) - (#%plain-app plain-apply values value-list))))))) - (annotate-stx stx break-wrap)) - -(define (annotate-stx stx break-wrap [record-bound-id void] [record-top-level-id void]) - (define breakpoints (make-hasheq)) - - (define (previous-bindings bound-vars) - (if (null? bound-vars) - #'null - #'(#%plain-app debugger-local-bindings))) - - (define (top-level-annotate stx) - (kernel:kernel-syntax-case/phase - stx (namespace-base-phase) - [(module identifier name mb) - (module-annotate stx)] - [else-stx - (general-top-level-expr-iterator stx #f)])) - - (define (module-annotate stx) - (syntax-case stx () - [(_ identifier name mb) - (syntax-case (disarm #'mb) () - [(plain-module-begin . module-level-exprs) - (with-syntax ([(module . _) stx]) - (quasisyntax/loc stx - (module identifier name - #,(rearm - #'mb - #`(plain-module-begin - #,@(map (lambda (e) - ;; https://github.com/racket/drracket/issues/231 - (rearm - e - (module-level-expr-iterator - (disarm e) - (list (syntax-e #'identifier) - (syntax-source #'identifier))))) - (syntax->list #'module-level-exprs)))))))])])) - - (define (module-level-expr-iterator stx module-name) - (kernel:kernel-syntax-case - stx #f - [(#%provide . provide-specs) - stx] - [(#%declare . declare-specs) - stx] - [else-stx - (general-top-level-expr-iterator stx module-name)])) - - (define (general-top-level-expr-iterator stx module-name) - (kernel:kernel-syntax-case - stx #f - [(define-values (var ...) expr) - (begin - (for-each (lambda (v) (record-bound-id 'bind v v)) - (syntax->list #'(var ...))) - (quasisyntax/loc stx - (begin - (define-values (var ...) #,(annotate #`expr '() #t module-name)) - #,(if (syntax-source stx) - #`(begin (#%plain-app - #,record-top-level-id '#,module-name #'var - (case-lambda - [() var] - [(v) (set! var v)])) ...) - #'(#%plain-app void)) - (#%plain-app void))))] - [(define-syntaxes (var ...) expr) - stx] - [(begin-for-syntax . exprs) - ;; compile time, so treat it like define-syntaxes - stx] - [(begin . top-level-exprs) - (quasisyntax/loc stx - (begin #,@(map (lambda (expr) - (module-level-expr-iterator expr module-name)) - (syntax->list #'top-level-exprs))))] - [(#%require . require-specs) - stx] - [(module . _) - ;; a submodule: - (module-annotate stx)] - [(module* . _) - ;; a submodule: - (module-annotate stx)] - [else - (annotate stx '() #f module-name)])) - - (define (annotate expr bound-vars is-tail? module-name) - - (define annotate-break? - (let ([pos (syntax-position expr)] - [src (syntax-source expr)]) - (and src pos - ;; https://github.com/racket/drracket/issues/230 - (equal? src (syntax-source stx)) - (hash-ref breakpoints pos (lambda () #t)) - (kernel:kernel-syntax-case - expr #f - [(if test then else) #t] - [(begin . bodies) #t] - [(begin0 . bodies) #t] - [(let-values . clause) #t] - [(letrec-values . clause) #t] - [(set! var val) #t] - [(with-continuation-mark key mark body) #t] - [(#%plain-app . exprs) #t] - [_ #f]) - (begin - (hash-set! breakpoints pos #f) - (when (not is-tail?) - (hash-set! breakpoints (+ pos (syntax-span expr) -1) #f)) - #t)))) - - (define (let/rec-values-annotator letrec?) - (kernel:kernel-syntax-case - (disarm expr) #f - [(label (((var ...) rhs) ...) . bodies) - (let* ([new-bindings (apply append - (map syntax->list - (syntax->list #`((var ...) ...))))] - [all-bindings (append new-bindings bound-vars)] - [new-rhs (map (lambda (expr) - (annotate expr - (if letrec? all-bindings bound-vars) - #f module-name)) - (syntax->list #'(rhs ...)))] - [last-body (car (reverse (syntax->list #'bodies)))] - [all-but-last-body (reverse (cdr (reverse (syntax->list #'bodies))))] - [bodies (append (map (lambda (expr) - (annotate expr all-bindings #f module-name)) - all-but-last-body) - (list (annotate - last-body - all-bindings - is-tail? module-name)))] - [local-debug-info (assemble-debug-info new-bindings new-bindings 'normal #f)] - [previous-bindings (previous-bindings bound-vars)]) - (for-each (lambda (id) (record-bound-id 'bind id id)) new-bindings) - (with-syntax ([(new-rhs/trans ...) new-rhs] - [previous-bindings previous-bindings]) - (if letrec? - (quasisyntax/loc expr - (let ([old-bindings previous-bindings]) - (label (((debugger-local-bindings) - (#%plain-lambda () - (#%plain-app - list* - #,@local-debug-info - old-bindings))) - ((var ...) new-rhs/trans) ...) - #,@bodies))) - (quasisyntax/loc expr - (label (((var ...) new-rhs/trans) ...) - (let ([debugger-local-bindings - (#%plain-lambda () - (#%plain-app - list* - #,@local-debug-info - previous-bindings))]) - #,@bodies))))))])) - - (define (lambda-clause-annotator clause) - (kernel:kernel-syntax-case - clause #f - [(arg-list . bodies) - (let* ([new-bound-vars (arglist-bindings #'arg-list)] - [all-bound-vars (append new-bound-vars bound-vars)] - [new-bodies (let loop ([bodies (syntax->list #'bodies)]) - (if (equal? '() (cdr bodies)) - (list (annotate (car bodies) all-bound-vars #t module-name)) - (cons (annotate (car bodies) all-bound-vars #f module-name) - (loop (cdr bodies)))))]) - (for-each (lambda (id) (record-bound-id 'bind id id)) new-bound-vars) - (quasisyntax/loc clause - (arg-list - (let ([debugger-local-bindings - (#%plain-lambda () - (#%plain-app - list* - #,@(assemble-debug-info new-bound-vars new-bound-vars 'normal #f) - #,(previous-bindings bound-vars)))]) - #,@new-bodies))))])) - - (define annotated - (rearm - expr - (kernel:kernel-syntax-case - (disarm expr) #f - [var-stx (identifier? (syntax var-stx)) - (let ([binder (and (syntax-original? expr) - (member expr bound-vars free-identifier=?))]) - (if binder - (record-bound-id 'ref expr (car binder)) - (record-bound-id 'top-level expr expr)) - expr)] - - [(#%plain-lambda . clause) - (quasisyntax/loc expr - (#%plain-lambda #,@(lambda-clause-annotator #'clause)))] - - [(case-lambda . clauses) - (quasisyntax/loc expr - (case-lambda #,@(map lambda-clause-annotator (syntax->list #'clauses))))] - - [(if test then else) - (quasisyntax/loc expr - (if #,(annotate #'test bound-vars #f module-name) - #,(annotate #'then bound-vars is-tail? module-name) - #,(annotate #'else bound-vars is-tail? module-name)))] - - [(begin . bodies) - (letrec ([traverse - (lambda (lst) - (if (and (pair? lst) (equal? '() (cdr lst))) - `(,(annotate (car lst) bound-vars is-tail? module-name)) - (cons (annotate (car lst) bound-vars #f module-name) - (traverse (cdr lst)))))]) - (quasisyntax/loc expr - (begin #,@(traverse (syntax->list #'bodies)))))] - - - [(begin0 body) - (quasisyntax/loc expr - (begin0 #,(annotate #'body bound-vars #t module-name)))] - - [(begin0 . bodies) - (quasisyntax/loc expr - (begin0 #,@(map (lambda (expr) - (annotate expr bound-vars #f module-name)) - (syntax->list #'bodies))))] - - [(let-values . clause) - (let/rec-values-annotator #f)] - - [(letrec-values . clause) - (let/rec-values-annotator #t)] - - [(set! var val) - (let ([binder (and (syntax-original? #'var) - (member #'var bound-vars free-identifier=?))]) - (when binder - (record-bound-id 'set expr (car binder))) - (quasisyntax/loc expr - (set! var #,(annotate #`val bound-vars #f module-name))))] - - [(quote _) expr] - - [(quote-syntax _) expr] - - [(quote-syntax _ #:local) expr] - - [(with-continuation-mark key mark body) - (quasisyntax/loc expr - (with-continuation-mark key - #,(annotate #'mark bound-vars #f module-name) - #,(annotate #'body bound-vars is-tail? module-name)))] - - [(#%plain-app . exprs) - (let ([subexprs (map (lambda (expr) - (annotate expr bound-vars #f module-name)) - (syntax->list #'exprs))]) - (if (or is-tail? (not (syntax-source expr))) - (quasisyntax/loc expr (#%plain-app . #,subexprs)) - (wcm-wrap (make-debug-info module-name expr - bound-vars bound-vars - 'normal #f (previous-bindings bound-vars)) - (quasisyntax/loc expr - (#%plain-app . #,subexprs)))))] - - [(#%top . var) expr] - [(#%variable-reference . _) expr] - - [else (error 'expr-syntax-object-iterator "unknown expr: ~a" - (syntax->datum expr))]))) - - (if annotate-break? - (break-wrap - (make-debug-info module-name expr bound-vars bound-vars - 'at-break #f (previous-bindings bound-vars)) - annotated - expr - is-tail?) - annotated)) - - (values (top-level-annotate stx) (hash-map breakpoints (lambda (k v) k)))) - -(define (arglist-bindings arglist-stx) - (syntax-case arglist-stx () - [var - (identifier? arglist-stx) - (list arglist-stx)] - [(var ...) - (syntax->list arglist-stx)] - [(var . others) - (cons #'var (arglist-bindings #'others))])) - -(define (disarm stx) (syntax-disarm stx code-insp)) -(define (rearm old new) (syntax-rearm new old)) - -(define code-insp (variable-reference->module-declaration-inspector - (#%variable-reference))) diff --git a/elpa/racket-mode-20200417.1741/racket/debug.rkt b/elpa/racket-mode-20200417.1741/racket/debug.rkt deleted file mode 100644 index 4357122a..00000000 --- a/elpa/racket-mode-20200417.1741/racket/debug.rkt +++ /dev/null @@ -1,363 +0,0 @@ -#lang racket/base - -(require (for-syntax racket/base) - gui-debugger/marks - racket/contract - racket/format - racket/list - racket/match - (only-in racket/path path-only) - racket/set - syntax/modread - "debug-annotator.rkt" - "elisp.rkt" - "interactions.rkt" - "repl-session.rkt" - "util.rkt") - -(module+ test - (require rackunit)) - -(provide (rename-out [on-break-channel debug-notify-channel]) - debug-eval - debug-resume - debug-disable - make-debug-eval-handler - next-break) - -;; A gui-debugger/marks "mark" is a thunk that returns a -;; full-mark-struct -- although gui-debugger/marks doesn't provide -;; that struct. Instead the thunk can be passed to various accessor -;; functions. -(define mark/c (-> any/c)) - -;; A "mark-binding" is a list whose first element is syntax of the -;; identifier, and whose second element is a get/set! procedure. -(define get/set!/c (case-> (-> any/c) - (-> any/c void))) - -(define breakable-positions/c (hash/c path? (set/c #:cmp 'eq pos/c))) -(define/contract breakable-positions breakable-positions/c (make-hash)) -(define/contract (breakable-position? src pos) - (-> path? pos/c boolean?) - (set-member? (hash-ref breakable-positions src (seteq)) pos)) - -(define/contract (annotate stx) - (-> syntax? syntax?) - (define source (syntax-source stx)) - (display-commented (format "Debug annotate ~v" source)) - (define-values (annotated breakables) - (annotate-for-single-stepping stx break? break-before break-after)) - (hash-update! breakable-positions - source - (λ (s) (set-union s (list->seteq breakables))) - (seteq)) - annotated) - -;; The first contract is suitable for "edge" with Emacs Lisp. Second -;; is important for actual `next-break` value so that `break?` compare -;; of source works; see #425. -(define break-when/c (or/c 'all 'none (cons/c path-string? pos/c))) -(define break-when-strict/c (or/c 'all 'none (cons/c path? pos/c))) - -(define/contract next-break - (case-> (-> break-when-strict/c) - (-> break-when-strict/c void)) - (let ([v 'none]) - (case-lambda [() v] - [(v!) (set! v v!)]))) - -;; If this returns #t, either break-before or break-after will be -;; called next. -(define ((break? src) pos) - (match (next-break) - ['none #f] - ['all #t] - [(cons (== src) (== pos)) #t] - [_ #f])) - -(define/contract (break-before top-mark ccm) - (-> mark/c continuation-mark-set? (or/c #f (listof any/c))) - (break 'before top-mark ccm #f)) - -(define/contract (break-after top-mark ccm . vals) - (->* (mark/c continuation-mark-set?) #:rest (listof any/c) - any) - (apply values (break 'after top-mark ccm vals))) - -(define/contract (break before/after top-mark ccm vals) - (-> (or/c 'before 'after) mark/c continuation-mark-set? (or/c #f (listof any/c)) - (or/c #f (listof any/c))) - (define stx (mark-source top-mark)) - (define src (syntax-source stx)) - (define pos (case before/after - [(before) (syntax-position stx)] - [(after) (+ (syntax-position stx) (syntax-span stx) -1)])) - (define max-width 128) - (define limit-marker "⋯") - (define locals - (for*/list ([binding (in-list (mark-bindings top-mark))] - [stx (in-value (first binding))] - [get/set! (in-value (second binding))] - #:when (and (syntax-original? stx) (syntax-source stx))) - (list (syntax-source stx) - (syntax-position stx) - (syntax-span stx) - (syntax->datum stx) - (~v #:max-width max-width - #:limit-marker limit-marker - (get/set!))))) - ;; Start a debug repl on its own thread, because below we're going to - ;; block indefinitely with (channel-get on-resume-channel), waiting for - ;; the Emacs front end to issue a debug-resume command. - (define repl-thread (thread (repl src pos top-mark))) - ;; The on-break-channel is how we notify the Emacs front-end. This - ;; is a synchronous channel-put but it should return fairly quickly, - ;; as soon as the command server gets and writes it. In other words, - ;; this is sent as a notification, unlike a command response as a - ;; result of a request. - (define this-break-id (new-break-id)) - ;; If it is not possible to round-trip serialize/deserialize the - ;; values, use the original values when stepping (don't attempt to - ;; substitute user-supplied values). - (define (maybe-serialized-vals) - (let ([str (~s vals)]) - (if (and (serializable? vals) - (<= (string-length str) max-width)) - (cons #t str) - (cons #f (~s #:max-width max-width - #:limit-marker limit-marker - vals))))) - (channel-put on-break-channel - (list 'debug-break - (cons src pos) - breakable-positions - locals - (cons this-break-id - (case before/after - [(before) (list 'before)] - [(after) (list 'after (maybe-serialized-vals))])))) - ;; Wait for debug-resume command to put to on-resume-channel. If - ;; wrong break ID, ignore and wait again. - (let wait () - (begin0 - (match (channel-get on-resume-channel) - [(list break-when (list (== this-break-id) 'before)) - (next-break (calc-next-break before/after break-when top-mark ccm)) - #f] - [(list break-when (list (== this-break-id) 'before new-vals-str)) - (next-break (calc-next-break before/after break-when top-mark ccm)) - (read-str/default new-vals-str vals)] - [(list break-when (list (== this-break-id) 'after new-vals-pair)) - (next-break (calc-next-break before/after break-when top-mark ccm)) - (match new-vals-pair - [(cons #t new-vals-str) (read-str/default new-vals-str vals)] - [(cons '() _) vals])] - [_ (wait)]) - (kill-thread repl-thread) - (newline)))) - -(define (serializable? v) - (with-handlers ([exn:fail:read? (λ _ #f)]) - (equal? v (write/read v)))) - -(module+ test - (check-true (serializable? 42)) - (check-true (serializable? 'foo)) - (check-false (serializable? (open-output-string)))) - -(define (write/read v) - (define out (open-output-string)) - (write v out) - (define in (open-input-string (get-output-string out))) - (read in)) - -(module+ test - (check-equal? (write/read 42) 42) - (check-equal? (write/read 'foo) 'foo)) - -(define (read-str/default str default) - (with-handlers ([exn:fail:read? (λ _ default)]) - (read (open-input-string str)))) - -(define/contract (calc-next-break before/after break-when top-mark ccm) - (-> (or/c 'before 'after) (or/c break-when/c 'over 'out) mark/c continuation-mark-set? - break-when-strict/c) - (define (big-step frames) - (define num-marks (length (debug-marks (current-continuation-marks)))) - (or (for/or ([frame (in-list frames)] - [depth (in-range (length frames) -1 -1)] - #:when (<= num-marks depth)) - (let* ([stx (mark-source frame)] - [src (syntax-source stx)] - [left (syntax-position stx)] - [right (and left (+ left (syntax-span stx) -1))]) - (and right - (breakable-position? src right) - (cons src right)))) - 'all)) - (match* [break-when before/after] - [['none _] 'none] - [['all _] 'all] - [['out _] (big-step (debug-marks ccm))] - [['over 'before] (big-step (cons top-mark (debug-marks ccm)))] - [['over 'after] 'all] - [[(cons (? path? path) pos) _] - (cons path pos)] - [[(cons (? path-string? path-str) pos) _] - (cons (string->path path-str) pos)])) - -(define break-id/c nat/c) -(define/contract new-break-id - (-> break-id/c) - (let ([n 0]) (λ () (begin0 n (set! n (add1 n)))))) - -(define/contract (debug-marks ccm) - (-> continuation-mark-set? (listof mark/c)) - (continuation-mark-set->list ccm debug-key)) - -;;; Debug REPL - -(define ((repl src pos top-mark)) - (parameterize ([current-prompt-read (make-prompt-read src pos top-mark)]) - (read-eval-print-loop))) - -(define ((make-prompt-read src pos top-mark)) - (define-values (_base name _dir) (split-path src)) - (define stx (get-interaction (format "[~a:~a]" name pos))) - (call-with-session-context (current-session-id) - with-locals stx (mark-bindings top-mark))) - -(define (with-locals stx bindings) - ;; Before or during module->namespace -- i.e. during a racket-run -- - ;; current-namespace won't (can't) yet be a namespace with module - ;; body bindings. Indeed it might be from make-base-empty-namespace, - ;; and not even include racket/base bindings such as #%app. In that - ;; case make them available. That way the debug REPL at least can - ;; handle expressions involving local bindings. - (unless (member '#%app (namespace-mapped-symbols)) - (log-racket-mode-debug "debug prompt-read namespace-require racket/base") - (namespace-require 'racket/base)) - ;; Note that mark-bindings is ordered from inner to outer scopes -- - ;; and can include outer variables shadowed by inner ones. So use - ;; only the first occurence of each identifier symbol we encounter. - ;; e.g. in (let ([x _]) (let ([x _]) ___)) we want only the inner x. - (define ht (make-hasheq)) - (for* ([binding (in-list bindings)] - [sym (in-value (syntax->datum (first binding)))] - #:unless (hash-has-key? ht sym) - [get/set! (in-value (second binding))]) - (hash-set! ht sym get/set!)) - (syntax-case stx () - ;; I couldn't figure out how to get a set! transformer to work for - ;; Typed Racket -- how to annotate or cast a get/set! as (-> Any - ;; Void). So instead, just intercept (set! id e) as a datum and - ;; effectively (get/set! (eval e debug-repl-ns)) here. In other - ;; words treat the stx like a REPL "command". Of course this - ;; totally bypasses type-checking, but this is a debugger. YOLO! - [(set! id e) - (and (module-declared? 'typed/racket/base) - (eq? 'set! (syntax->datum #'set!)) - (identifier? #'id) - (hash-has-key? ht (syntax->datum #'id))) - (let ([set (hash-ref ht (syntax->datum #'id))] - [v (eval #'e)]) - (set v) - #`(void))] - ;; Wrap stx in a let-syntax form with a make-set!-transformer for - ;; every local variable in the mark-bindings results. - [_ - (let ([syntax-bindings - (for/list ([(sym get/set!) (in-hash ht)]) - (define id (datum->syntax #f sym)) - (define xform - (make-set!-transformer - (λ (stx) - (syntax-case stx (set!) - [(set! id v) (identifier? #'id) #`(#%plain-app #,get/set! v)] - [id (identifier? #'id) #`'#,(get/set!)])))) - #`(#,id #,xform))]) - #`(let-syntax #,syntax-bindings - #,stx))])) - - -;;; Command interface - -;; Intended use is for `code` to be a function definition form. It -;; will be re-defined annotated for single stepping: When executed it -;; will call our break?, break-before, and break-after functions. -(define/contract (debug-eval source-str line col pos code) - (-> path-string? pos/c nat/c pos/c string? #t) - (define source (string->path source-str)) - (define in (open-input-string code)) - (port-count-lines! in) - (set-port-next-location! in line col pos) - (eval (annotate (expand (read-syntax source in)))) - (next-break 'all) - #t) - -(define locals/c (listof (list/c path-string? pos/c pos/c symbol? string?))) -(define break-vals/c (cons/c break-id/c - (or/c (list/c 'before) - (list/c 'after (cons/c boolean? string?))))) -(define on-break/c (list/c 'debug-break - break-when/c - breakable-positions/c - locals/c - break-vals/c)) -(define/contract on-break-channel (channel/c on-break/c) (make-channel)) - -(define resume-vals/c (cons/c break-id/c - (or/c (list/c 'before) - (list/c 'before string?) - (list/c 'after (cons/c elisp-bool/c string?))))) -(define on-resume/c (list/c (or/c break-when/c 'out 'over) resume-vals/c)) -(define/contract on-resume-channel (channel/c on-resume/c) (make-channel)) - -(define/contract (debug-resume resume-info) - (-> on-resume/c #t) - (channel-put on-resume-channel resume-info) - #t) - -(define (debug-disable) - (next-break 'none) - (for ([k (in-hash-keys breakable-positions)]) - (hash-remove! breakable-positions k))) - - -;;; Make eval handler to instrument entire files - -(define eval-handler/c (-> any/c any)) - -(define/contract ((make-debug-eval-handler files [orig-eval (current-eval)]) v) - (->* ((set/c path?)) (eval-handler/c) eval-handler/c) - (cond [(compiled-expression? (syntax-or-sexpr->sexpr v)) - (orig-eval v)] - [else - (define stx (syntax-or-sexpr->syntax v)) - (define top-stx (expand-syntax-to-top-form stx)) - (cond [(set-member? files (syntax-source stx)) - (next-break 'all) - (parameterize* ([current-eval orig-eval] - [current-load/use-compiled - (let ([orig (current-load/use-compiled)]) - (λ (file mod) - (cond [(set-member? files file) - (load-module/annotate file mod)] - [else - (orig file mod)])))]) - (eval-syntax (annotate (expand-syntax top-stx))))] - [else (orig-eval top-stx)])])) - -(define (load-module/annotate file m) - (display-commented (format "~v" `(load-module/annotate ,file ,m))) - (call-with-input-file* file - (λ (in) - (port-count-lines! in) - (parameterize ([read-accept-compiled #f] - [current-load-relative-directory (path-only file)]) - (with-module-reading-parameterization - (λ () - (define e (parameterize ([current-namespace (make-base-namespace)]) - (expand (read-syntax file in)))) - (eval (annotate (check-module-form e m file))))))))) diff --git a/elpa/racket-mode-20200417.1741/racket/elisp.rkt b/elpa/racket-mode-20200417.1741/racket/elisp.rkt deleted file mode 100644 index c7892cb5..00000000 --- a/elpa/racket-mode-20200417.1741/racket/elisp.rkt +++ /dev/null @@ -1,57 +0,0 @@ -#lang racket/base - -(require racket/contract - racket/match - racket/port - racket/set) - -(provide elisp-read - elisp-writeln - elisp-bool/c - as-racket-bool) - -;;; read/write Emacs Lisp values - -(define (elisp-read in) - (elisp->racket (read in))) - -(define (elisp-writeln v out) - (elisp-write v out) - (newline out)) - -(define (elisp-write v out) - (write (racket->elisp v) out)) - -(define elisp-bool/c (or/c #t '())) -(define (as-racket-bool v) - ;; elisp->racket "de-puns" 'nil as '() -- not #f. Use this helper to - ;; treat as a boolean. - (and v (not (null? v)))) - -(define (elisp->racket v) - (match v - ['nil '()] ;not #f -- see as-racket-bool - ['t #t] - [(? list? xs) (map elisp->racket xs)] - [(cons x y) (cons (elisp->racket x) (elisp->racket y))] - [(vector s _ ...) s] ;Emacs strings can be #("string" . properties) - [v v])) - -(define (racket->elisp v) - (match v - [(or #f (list)) 'nil] - [#t 't] - [(? list? xs) (map racket->elisp xs)] - [(cons x y) (cons (racket->elisp x) (racket->elisp y))] - [(? path? v) (path->string v)] - [(? hash? v) (for/list ([(k v) (in-hash v)]) - (cons (racket->elisp k) (racket->elisp v)))] - [(? generic-set? v) (map racket->elisp (set->list v))] - [v v])) - -(module+ test - (require rackunit) - (check-equal? (with-output-to-string - (λ () (elisp-write '(1 #t nil () (a . b) #hash((1 . 2) (3 . 4))) - (current-output-port)))) - "(1 t nil nil (a . b) ((1 . 2) (3 . 4)))")) diff --git a/elpa/racket-mode-20200417.1741/racket/error.rkt b/elpa/racket-mode-20200417.1741/racket/error.rkt deleted file mode 100644 index 6269ca7d..00000000 --- a/elpa/racket-mode-20200417.1741/racket/error.rkt +++ /dev/null @@ -1,209 +0,0 @@ -#lang at-exp racket/base - -(require (only-in pkg/db get-catalogs) - (only-in pkg/lib pkg-catalog-suggestions-for-module) - racket/format - racket/match - (only-in racket/path path-only) - racket/runtime-path - racket/string - setup/collects - setup/dirs - "fresh-line.rkt" - "instrument.rkt" - "util.rkt") - -(provide display-exn - our-error-display-handler - show-full-path-in-errors) - -(module+ test - (require rackunit)) - -(define (display-exn exn) - (our-error-display-handler (exn-message exn) exn)) - -(define (our-error-display-handler str v) - (cond [(exn? v) - (unless (equal? "Check failure" (exn-message v)) ;rackunit check fails - (fresh-line) - (display-commented (fully-qualify-error-path str)) - (display-srclocs v) - (unless (exn:fail:user? v) - (display-context v)) - (maybe-suggest-packages v))] - [else - (fresh-line) - (display-commented str)])) - -(define (display-srclocs exn) - (when (exn:srclocs? exn) - (define srclocs - (match ((exn:srclocs-accessor exn) exn) - ;; Some exceptions like exn:fail:read? include the first - ;; srcloc in exn-message -- don't show it again. - [(cons _ xs) - #:when (or (exn:fail:read? exn) - (exn:fail:contract:variable? exn)) - xs] - ;; Some exceptions like exn:fail:syntax? with Typed Racket - ;; include _all_ in exn-message -- don't show _any_. - [_ - #:when (exn:fail:syntax? exn) - '()] - [xs xs])) - (for ([s (in-list srclocs)]) - (display-commented (source-location->string s))))) - -(define (display-context exn) - (cond [(instrumenting-enabled) - (define p (open-output-string)) - (print-error-trace p exn) - (match (get-output-string p) - ["" (void)] - [s (display-commented (string-append "Context (errortrace):" - ;; et prepends a \n - s))])] - [else - (match (context->string - (continuation-mark-set->context (exn-continuation-marks exn))) - ["" (void)] - [s (display-commented (string-append "Context:\n" - s))])])) - -(define (context->string xs) - ;; Limit the context in two ways: - ;; 1. Don't go beyond error-print-context-length - ;; 2. Don't go into "system" context that's just noisy. - (string-join (for/list ([x xs] - [_ (error-print-context-length)] - #:unless (system-context? x)) - (context-item->string x)) - "\n")) - -(define-runtime-path here "error.rkt") -(define (system-context? ci) - (match-define (cons id src) ci) - (or (not src) - (let ([src (srcloc-source src)]) - (and (path? src) - (or (equal? (path-only src) (path-only here)) - (under-system-path? src)))))) - -(define (under-system-path? path) - (match (path->collects-relative path) - [`(collects #"mred" . ,_) #t] - [`(collects #"racket" #"contract" . ,_) #t] - [`(collects #"racket" #"private" . ,_) #t] - [`(collects #"typed-racket" . ,_) #t] - [_ #f])) - -(define (context-item->string ci) - (match-define (cons id src) ci) - (string-append (if (or src id) " " "") - (if src (source-location->string src) "") - (if (and src id) " " "") - (if id (format "~a" id) ""))) - -;; Don't use source-location->string from syntax/srcloc. Don't want -;; the setup/path-to-relative behavior that replaces full pathnames -;; with , etc. Instead want full pathnames for Emacs' -;; compilation-mode. HOWEVER note that or might be -;; baked into exn-message string already; we handle that in -;; `fully-qualify-error-path`. Here we handle only strings we create -;; ourselves, such as for the Context "stack trace". -(define (source-location->string x) - (define src - ;; Although I want to find/fix this properly upstream -- is - ;; something a path-string? when it should be a path? -- for now - ;; just catch here the case where the source is a string like - ;; "\"/path/to/file.rkt\"" i.e. in quotes. - (match (srcloc-source x) - [(pregexp "^\"(.+)\"$" (list _ unquoted)) unquoted] - [v v])) - (define line (or (srcloc-line x) "1")) - (define col (or (srcloc-column x) "1")) - (format "~a:~a:~a" src line col)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Fully qualified pathnames in error messages, so that Emacs -;; compilation-mode can do its stuff. - -;; srcloc->string uses current-directory-for-user to shorten error -;; messages. But we always want full pathnames. Setting it to -;; 'pref-dir -- very unlikely user .rkt file will be there -- is -;; least-worst way AFAIK. -(define (show-full-path-in-errors) - (current-directory-for-user (find-system-path 'pref-dir))) - -;; If this looks like a Racket error message, but the filename is -;; not fully-qualified, prepend curdir to the filename. -;; -;; This covers Racket 5.3.6 and earlier. In fact, this might be -;; sufficient for _all_ versions of Racket and we don't need the -;; `show-full-path-in-errors` thing above, at all. Not yet sure. -(define (fully-qualify-error-path s) - (match s - [(pregexp "^([^:]+):(\\d+)[:.](\\d+)(.*)$" - (list _ path line col more)) - #:when (not (absolute-path? path)) - (string-append - (string-join (list (path->string (build-path (current-directory) path)) - line - col) - ":") - more)] - [s s])) - -(module+ test - (require rackunit) - (case (system-type 'os) - [(windows) - (check-equal? - (parameterize ([current-directory "c:\\tmp"]) - (fully-qualify-error-path "foo.rkt:3:0: f: unbound identifier\n in: f")) - "c:\\tmp\\foo.rkt:3:0: f: unbound identifier\n in: f") - (check-equal? - (fully-qualify-error-path "c:\\tmp\\foo.rkt:3:0: f: unbound identifier\n in: f") - "c:\\tmp\\foo.rkt:3:0: f: unbound identifier\n in: f")] - [(macosx unix) - (check-equal? - (parameterize ([current-directory "/tmp/"]) - (fully-qualify-error-path "foo.rkt:3:0: f: unbound identifier\n in: f")) - "/tmp/foo.rkt:3:0: f: unbound identifier\n in: f") - (check-equal? - (fully-qualify-error-path "/tmp/foo.rkt:3:0: f: unbound identifier\n in: f") - "/tmp/foo.rkt:3:0: f: unbound identifier\n in: f")]) - (let ([o (open-output-string)]) - (parameterize ([current-error-port o]) - (display-srclocs (make-exn:fail:read "..." - (current-continuation-marks) - '()))) - (check-equal? (get-output-string o) ""))) - -(define (maybe-suggest-packages exn) - (when (exn:missing-module? exn) - (match (get-catalogs) - [(list) - (display-commented - @~a{----- - Can't suggest packages to install, because pkg/db get-catalogs is '(). - To configure: - 1. Start DrRacket. - 2. Choose "File | Package Manager". - 3. Click "Available from Catalog". - 4. When prompted, click "Update". - -----})] - [_ - (define mod ((exn:missing-module-accessor exn) exn)) - (match (pkg-catalog-suggestions-for-module mod) - [(list) void] - [(list p) - (display-commented - @~a{Try "raco pkg install @|p|" ?})] - [(? list? ps) - (display-commented - @~a{Try "raco pkg install" one of @(string-join ps ", ") ?})] - [_ void])]))) - diff --git a/elpa/racket-mode-20200417.1741/racket/example/example.rkt b/elpa/racket-mode-20200417.1741/racket/example/example.rkt deleted file mode 100644 index 2c0d8c07..00000000 --- a/elpa/racket-mode-20200417.1741/racket/example/example.rkt +++ /dev/null @@ -1,355 +0,0 @@ -;; -*- racket-indent-sequence-depth: 100; racket-indent-curly-as-sequence: t; -*- - -;;; NOTE: After changing this file you will need to M-x faceup-write-file -;;; to regenerate the .faceup test comparison file. -;;; -;;; NOTE: You may need to disable certain features -- for example -;;; global-paren-face-mode -- during the M-x faceup-write-file. - -#lang racket - -(require xml) -(provide valid-bucket-name?) - -;; Various def* forms are font-locked: - -(define (function foo) - #t) - -(define ((curried-function x) y) - (list x y)) - -(define a-var 10) - -(define/contract (f2 x) - (any/c . -> . any) - #t) - -(define-values (1st-var 2nd-var) (values 1 2)) - -(define-thing foo) ;bug 276 - -;; let: font-lock identifiers - -(let ([foo 10] - [bar 20]) - foo) - -(let loop ([x 10]) - (unless (zero? x) - (loop (sub1 x)))) - -(let* ([foo 10] - [bar 20]) - foo) - -(let-values ([(a b) (values 1 2)]) - (values a b)) - -(let*-values ([(a b) (values 1 2)]) - (values a b)) - -(letrec-values ([(a b) (values 1 2)]) - (values a b)) - -(let-syntax ([foo #'foo]) - foo) - -(letrec-syntax ([foo #'foo]) - foo) - -(let-syntaxes ([(foo) #'foo]) - foo) - -(letrec-syntaxes ([(foo) #'foo]) - foo) - -(letrec-syntaxes+values ([(foo) #'foo]) - ([(a b) (values 1 2)]) - foo) - -;; for/fold is indented correctly: -(for/fold ([str ""]) - ([ss '("a" "b" "c")]) - (string-append str ss)) - -;; Auto-converts word `lambda` to `λ`: -(lambda (x) #t) - -;; Or use M-C-y to insert to insert `λ` char. - -;; Smart indentation for quoted lists: -'(1 2 - 3 4) - -;; Smart indentation for vector literals: -#(1 2 - 3 4) - -;; Smart indentation for Rackjure dict literals: -(module x rackjure - {'a 0 - 'b 2}) - -;; Silly test submodule example. -;; Try using C-c C-f to Fold (hide) it, and C-c C-u to Unfold it. -(module+ test - (require rackunit) - (check-true #t)) - -;; Single line comment - -#| - -Multi-line -comment - -|# - -;; Issue 362 - -#|aaa() |# - -#|(hello)|# - -#;(sexpr comment) - -;; Nested sexpr comments - -(list 2 - #;2) - -(list 1 - #;4 - #;(3)) - -(let (#;[x #;1] - [y 2]) - y) - -;; Issue 388 -1 ; #; -2 - -;; Issue 408 - -"#;"whatever -"#;"(whatever) -"#;" -(whatever) - -;; Issue 432 - -#; #; 'comment-me 'comment-me 'but-not-me - -#;#; 'comment-me 'comment-me 'but-not-me - -#; #; #; 'comment-me 'comment-me 'comment-me 'but-not-me - -#;#;#; 'comment-me 'comment-me 'comment-me 'but-not-me - -#; ;; comment -;; comment -#; #| comment |# -'comment-me -'comment-me -'but-not-me - - -(define x #<* . boolean?) - (cond - [dns-compliant? - (and (<= 3 (string-length s)) (<= (string-length s) 63) - (not (regexp-match #px"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}" s)) - (for/and ([s (regexp-split #rx"\\." s)]) - (define (valid-first-or-last? c) - (or (char-lower-case? (string-ref s 0)) - (char-numeric? (string-ref s 0)))) - (define (valid-mid? c) - (or (valid-first-or-last? c) - (equal? c #\-))) - (define len (string-length s)) - (and (< 0 len) - (valid-first-or-last? (string-ref s 0)) - (valid-first-or-last? (string-ref s (sub1 len))) - (or (<= len 2) - (for/and ([c (substring s 1 (sub1 len))]) - (valid-mid? c))))))] - [else - (and (<= (string-length s) 255) - (for/and ([c s]) - (or (char-numeric? c) - (char-lower-case? c) - (char-upper-case? c) - (equal? c #\.) - (equal? c #\-) - (equal? c #\_))))])) - -(displayln "I'm running!") - -;; Issue 366 -#"1" -#"22" -#"333" diff --git a/elpa/racket-mode-20200417.1741/racket/example/example.rkt.faceup b/elpa/racket-mode-20200417.1741/racket/example/example.rkt.faceup deleted file mode 100644 index ece6895f..00000000 --- a/elpa/racket-mode-20200417.1741/racket/example/example.rkt.faceup +++ /dev/null @@ -1,355 +0,0 @@ -«m:;; »«x:-*- racket-indent-sequence-depth: 100; racket-indent-curly-as-sequence: t; -*- -» -«m:;;; »«x:NOTE: After changing this file you will need to M-x faceup-write-file -»«m:;;; »«x:to regenerate the .faceup test comparison file. -»«m:;;;»«x: -»«m:;;; »«x:NOTE: You may need to disable certain features -- for example -»«m:;;; »«x:global-paren-face-mode -- during the M-x faceup-write-file. -» -«k:#lang» «v:racket» - -(«k:require» xml) -(«k:provide» valid-bucket-name?) - -«m:;; »«x:Various def* forms are font-locked: -» -(«k:define» («f:function» foo) - «:racket-selfeval-face:#t») - -(«k:define» ((«f:curried-function» x) y) - («b:list» x y)) - -(«k:define» «v:a-var» «:racket-selfeval-face:10») - -(«b:define/contract» («f:f2» x) - («b:any/c» . «b:->» . «b:any») - «:racket-selfeval-face:#t») - -(«k:define-values» («v:1st-var 2nd-var») («b:values» «:racket-selfeval-face:1» «:racket-selfeval-face:2»)) - -(define-thing «v:foo») «m:;»«x:bug 276 -» -«m:;; »«x:let: font-lock identifiers -» -(«k:let» ([«v:foo» «:racket-selfeval-face:10»] - [«v:bar» «:racket-selfeval-face:20»]) - foo) - -(«k:let» «f:loop» ([«v:x» «:racket-selfeval-face:10»]) - («k:unless» («b:zero?» x) - (loop («b:sub1» x)))) - -(«k:let*» ([«v:foo» «:racket-selfeval-face:10»] - [«v:bar» «:racket-selfeval-face:20»]) - foo) - -(«k:let-values» ([(«v:a» «v:b») («b:values» «:racket-selfeval-face:1» «:racket-selfeval-face:2»)]) - («b:values» a b)) - -(«k:let*-values» ([(«v:a» «v:b») («b:values» «:racket-selfeval-face:1» «:racket-selfeval-face:2»)]) - («b:values» a b)) - -(«k:letrec-values» ([(«v:a» «v:b») («b:values» «:racket-selfeval-face:1» «:racket-selfeval-face:2»)]) - («b:values» a b)) - -(«k:let-syntax» ([«v:foo» #«:racket-selfeval-face:'foo»]) - foo) - -(«k:letrec-syntax» ([«v:foo» #«:racket-selfeval-face:'foo»]) - foo) - -(«k:let-syntaxes» ([(«v:foo») #«:racket-selfeval-face:'foo»]) - foo) - -(«k:letrec-syntaxes» ([(«v:foo») #«:racket-selfeval-face:'foo»]) - foo) - -(«k:letrec-syntaxes+values» ([(«v:foo») #«:racket-selfeval-face:'foo»]) - ([(a b) («b:values» «:racket-selfeval-face:1» «:racket-selfeval-face:2»)]) - foo) - -«m:;; »«x:for/fold is indented correctly: -»(«k:for/fold» ([str «s:""»]) - ([ss '(«s:"a"» «s:"b"» «s:"c"»)]) - («b:string-append» str ss)) - -«m:;; »«x:Auto-converts word `lambda` to `λ`: -»(«k:lambda» (x) «:racket-selfeval-face:#t») - -«m:;; »«x:Or use M-C-y to insert to insert `λ` char. -» -«m:;; »«x:Smart indentation for quoted lists: -»'(«:racket-selfeval-face:1» «:racket-selfeval-face:2» - «:racket-selfeval-face:3» «:racket-selfeval-face:4») - -«m:;; »«x:Smart indentation for vector literals: -»#(«:racket-selfeval-face:1» «:racket-selfeval-face:2» - «:racket-selfeval-face:3» «:racket-selfeval-face:4») - -«m:;; »«x:Smart indentation for Rackjure dict literals: -»(«k:module» «f:x» «v:rackjure» - {«:racket-selfeval-face:'a» «:racket-selfeval-face:0» - «:racket-selfeval-face:'b» «:racket-selfeval-face:2»}) - -«m:;; »«x:Silly test submodule example. -»«m:;; »«x:Try using C-c C-f to Fold (hide) it, and C-c C-u to Unfold it. -»(«k:module+» «f:test» - («k:require» rackunit) - (check-true «:racket-selfeval-face:#t»)) - -«m:;; »«x:Single line comment -» -«x:#| - -Multi-line -comment - -|#» - -«m:;; »«x:Issue 362 -» -«x:#|aaa() |#» - -«x:#|(hello)|#» - -«m:#;»«x:(sexpr comment)» - -«m:;; »«x:Nested sexpr comments -» -(«b:list» «:racket-selfeval-face:2» - «m:#;»«x:2») - -(«b:list» «:racket-selfeval-face:1» - «m:#;»«x:4» - «m:#;»«x:(3)») - -(«k:let» («m:#;»«x:[x #;1]» - [«v:y» «:racket-selfeval-face:2»]) - y) - -«m:;; »«x:Issue 388 -»«:racket-selfeval-face:1» «m:; »«x:#; -»«:racket-selfeval-face:2» - -«m:;; »«x:Issue 408 -» -«s:"#;"»whatever -«s:"#;"»(whatever) -«s:"#;"» -(whatever) - -«m:;; »«x:Issue 432 -» -«m:#;» «m:#;» «x:'comment-me» «x:'comment-me» «:racket-selfeval-face:'but-not-me» - -«m:#;#;» «x:'comment-me» «x:'comment-me» «:racket-selfeval-face:'but-not-me» - -«m:#;» «m:#;» «m:#;» «x:'comment-me» «x:'comment-me» «x:'comment-me» «:racket-selfeval-face:'but-not-me» - -«m:#;#;#;» «x:'comment-me» «x:'comment-me» «x:'comment-me» «:racket-selfeval-face:'but-not-me» - -«m:#;» «m:;; »«x:comment -»«m:;; »«x:comment -»«m:#;» «x:#| comment |#» -«x:'comment-me» -«x:'comment-me» -«:racket-selfeval-face:'but-not-me» - - -(«k:define» «v:x» «:racket-here-string-face:#<*» . «b:boolean?») - («k:cond» - [dns-compliant? - («k:and» («b:<=» «:racket-selfeval-face:3» («b:string-length» s)) («b:<=» («b:string-length» s) «:racket-selfeval-face:63») - («b:not» («b:regexp-match» «:racket-selfeval-face:#px»«s:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"» s)) - («k:for/and» ([s («b:regexp-split» «:racket-selfeval-face:#rx»«s:"\\."» s)]) - («k:define» («f:valid-first-or-last?» c) - («k:or» («b:char-lower-case?» («b:string-ref» s «:racket-selfeval-face:0»)) - («b:char-numeric?» («b:string-ref» s «:racket-selfeval-face:0»)))) - («k:define» («f:valid-mid?» c) - («k:or» (valid-first-or-last? c) - («b:equal?» c «:racket-selfeval-face:#\-»))) - («k:define» «v:len» («b:string-length» s)) - («k:and» («b:<» «:racket-selfeval-face:0» len) - (valid-first-or-last? («b:string-ref» s «:racket-selfeval-face:0»)) - (valid-first-or-last? («b:string-ref» s («b:sub1» len))) - («k:or» («b:<=» len «:racket-selfeval-face:2») - («k:for/and» ([c («b:substring» s «:racket-selfeval-face:1» («b:sub1» len))]) - (valid-mid? c))))))] - [«k:else» - («k:and» («b:<=» («b:string-length» s) «:racket-selfeval-face:255») - («k:for/and» ([c s]) - («k:or» («b:char-numeric?» c) - («b:char-lower-case?» c) - («b:char-upper-case?» c) - («b:equal?» c «:racket-selfeval-face:#\.») - («b:equal?» c «:racket-selfeval-face:#\-») - («b:equal?» c «:racket-selfeval-face:#\_»))))])) - -(«b:displayln» «s:"I'm running!"») - -«m:;; »«x:Issue 366 -»#«s:"1"» -#«s:"22"» -#«s:"333"» diff --git a/elpa/racket-mode-20200417.1741/racket/example/indent.rkt b/elpa/racket-mode-20200417.1741/racket/example/indent.rkt deleted file mode 100644 index 91bcbb41..00000000 --- a/elpa/racket-mode-20200417.1741/racket/example/indent.rkt +++ /dev/null @@ -1,325 +0,0 @@ -;; -*- racket-indent-sequence-depth: 100; racket-indent-curly-as-sequence: t; -*- - -;;; NOTE: After changing this file you will need to M-x faceup-write-file -;;; to regenerate the .faceup test comparison file. -;;; -;;; NOTE: You may need to disable certain features -- for example -;;; global-paren-face-mode -- during the M-x faceup-write-file. - -;;; Quoted list - -'(a b - (a b - c)) - -'((1) 2 3 - (3) - 4 5) - -;;; Quasiquoted list (align with head) and unquote or unquote-splicing -;;; (use normal indent rules for the form). - -`(Part () - (PartNumber () - ,part) - (ETag () - ,etag)) - -`((,(x) - ,y)) - -`(Delete - ,@(for/list ([p (in-list paths)]) - `(Object () - (Key () ,p)))) - -;;; Syntax - -#'(for/list ([x xs]) - x) - -#`(for/list ([x xs]) - x) - -#'(#%app (#%app hasheq (quote a) (quote 42)) - (quote a)) - -(#%app (#%app hasheq (quote a) (quote 42)) - (quote a)) - -#'(foo (#%app hasheq (quote a) (quote 42)) - (quote a)) - -;;; Rackjure style dictionary (when racket-indent-curly-as-sequence is t). - -{a b - c d} - -{a b - c d - b '(a x - s (x y - x v))} - -;;; Vector - -#(a b - c d) - -;;; List with a keyword as first member (e.g. in many contracts) - -(#:x y - #:y x) - -;;; Normal function application. - -(foobar x - y - z) - -(foobar - x - y - z) - -(dict-set a - b - c) - -(dict-set - a - b - c) - -(call-with-values (lambda () (values 1 2)) - +) - -(call-with-values - (lambda () (values 1 2)) - +) - -;;; Forms with special indentation - -(let ([x 0]) - x) - -;; indent 2 - -(syntax-case stx () - [(_ x) #'#f] - [(_ x y) #'#t]) - -;; indent 3 - -(syntax-case* stx () x - [(_ x) #'#f] - [(_ x y) #'#t]) - -(syntax-case* - stx - (#%module-begin - module - define-values - define-syntaxes - define - define/contract - define-syntax - struct - define-struct) - x - [(_ x) #'#f] - [(_ x y) #'#t]) - -;; begin and cond have 0 style -(begin - 0 - 0) - -(begin 0 - 0) - -(cond [1 2] - [3 4]) - -(cond - [1 2] - [3 4]) - -(if a - x - x) - -;; begin* - -(begin-for-foo 0 - 0) - -(begin-for-foo - 0 - 0) - -(with-handlers ([x y]) - a b c) - -;; def, with-, call-with- and other 'defun style - -(define (x) x x - x) - -(struct x x - ()) - -(match-define (list x y) - (list 1 2)) - -(with-output-to-file path #:mode 'text #:exists 'replace - (λ () (display "Hello, world."))) - -(call-with-output-file path #:mode 'text #:exists 'replace - (λ (out) (display "Hello, world." out))) - - -;;; Special forms: When the first non-distinguished form is on the -;;; same line as distinguished forms, disregard it for indent. - -;; module has indent 2 - -(module 1 - 2 - 3 - 4 - 5) - -;; Normal case -(module 1 2 - 3 - 4 - 5) - -;; Weird case -- but this is how scheme-mode indents it. -(module 1 2 3 - 4 - 5) - -;; Weird case -- but this is how scheme-mode indents it. -(module 1 2 3 4 - 5) - -;;; for/fold - -;; for/fold untyped, accum on same line -(for/fold ([a 0] - [b 0]) - ([x 0] - [y 0]) - #t) - -;; for/fold untyped, accum on different line -(for/fold - ([a 0] - [b 0]) - ([x 0] - [y 0]) - #t) - -;; for/fold typed, type on same line -(for/fold : T - ([a 0] - [b 0]) - ([x 0] - [y 0]) - #t) - -;; for/fold typed, type on different line -(for/fold - : T - ([a 0] - [b 0]) - ([x 0] - [y 0]) - #t) - -;;; Bug #50 - -'((x - y) A - z - (x - y) A - z) - -(match args - [(list x) (x - y)] ... - [(list x) (x y)] ... - [(list x) (x y)] ...) - -(define-syntax (fstruct stx) - (syntax-parse stx - [(_ id:id (field:id ...)) - (with-syntax ([(accessor ...) - (for/list ([fld (in-list (syntax->list #'(field ...)))]) - (format-id stx "~a-~a" (syntax->datum #'id) fld))]) - #'(serializable-struct - id (field ...) #:transparent - #:property prop:procedure - (lambda (self . args) - (match args - [(list 'field) (accessor self)] ... - [(list (list 'field)) (accessor self)] ... - [(list (list-rest 'field fields)) ((accessor self) fields)] ... - [(list-rest 'field f args) - (struct-copy id self - [field (apply f (accessor self) args)])] ... - [(list-rest (list 'field) f args) ;<-- THIS SEXPR IS INDENTED TOO FAR - (struct-copy id self - [field (apply f (accessor self) args)])] ... - [(list-rest (list-rest 'field fields) args) - (struct-copy id self - [field (apply (accessor self) fields args)])] ...))))])) - -;; Bug #123 - -#hash([a . (#hash() - 0)] - [b . (#hasheq() - 0)] - [c . (#fx(0 1 2) - 0)] - [d . (#fx3(0 1 2) - 0)] - [e . (#fl(0.0 1.0 2.0) - 0)] - [f . (#fl3(0.0 1.0 2.0) - 0)] - [g . (#s(foo x) - 0)] - [h . (#3(0 1 2) - 0)]) - -;; Bug #136 - -#;(list 1 - #;2 - 3) - -(list 1 - #;(list 1 - (let ([x 2] - #;[y 3]) - x) - 3) - 2 - 3) - -;; Bug #243 -(cond [x y - z] - [(= a x) y - z]) - -;; Bug #262 -(define-metafunction λL - ∪ : (x ...) ... -> (x ...) - [(∪ any_ls ...) - ,(apply append (term (any_ls ...)))]) diff --git a/elpa/racket-mode-20200417.1741/racket/example/indent.rkt.faceup b/elpa/racket-mode-20200417.1741/racket/example/indent.rkt.faceup deleted file mode 100644 index b1b47d26..00000000 --- a/elpa/racket-mode-20200417.1741/racket/example/indent.rkt.faceup +++ /dev/null @@ -1,325 +0,0 @@ -«m:;; »«x:-*- racket-indent-sequence-depth: 100; racket-indent-curly-as-sequence: t; -*- -» -«m:;;; »«x:NOTE: After changing this file you will need to M-x faceup-write-file -»«m:;;; »«x:to regenerate the .faceup test comparison file. -»«m:;;;»«x: -»«m:;;; »«x:NOTE: You may need to disable certain features -- for example -»«m:;;; »«x:global-paren-face-mode -- during the M-x faceup-write-file. -» -«m:;;; »«x:Quoted list -» -'(a b - (a b - c)) - -'((«:racket-selfeval-face:1») «:racket-selfeval-face:2» «:racket-selfeval-face:3» - («:racket-selfeval-face:3») - «:racket-selfeval-face:4» «:racket-selfeval-face:5») - -«m:;;; »«x:Quasiquoted list (align with head) and unquote or unquote-splicing -»«m:;;; »«x:(use normal indent rules for the form). -» -`(Part () - (PartNumber () - ,part) - (ETag () - ,etag)) - -`((,(x) - ,y)) - -`(Delete - ,@(«k:for/list» ([p («k:in-list» paths)]) - `(«t:Object» () - (Key () ,p)))) - -«m:;;; »«x:Syntax -» -#'(«k:for/list» ([x xs]) - x) - -#`(«k:for/list» ([x xs]) - x) - -#'(«k:#%app» («k:#%app» «b:hasheq» («k:quote» a) («k:quote» «:racket-selfeval-face:42»)) - («k:quote» a)) - -(«k:#%app» («k:#%app» «b:hasheq» («k:quote» a) («k:quote» «:racket-selfeval-face:42»)) - («k:quote» a)) - -#'(foo («k:#%app» «b:hasheq» («k:quote» a) («k:quote» «:racket-selfeval-face:42»)) - («k:quote» a)) - -«m:;;; »«x:Rackjure style dictionary (when racket-indent-curly-as-sequence is t). -» -{a b - c d} - -{a b - c d - b '(a x - s (x y - x v))} - -«m:;;; »«x:Vector -» -#(a b - c d) - -«m:;;; »«x:List with a keyword as first member (e.g. in many contracts) -» -(«:racket-keyword-argument-face:#:x» y - «:racket-keyword-argument-face:#:y» x) - -«m:;;; »«x:Normal function application. -» -(foobar x - y - z) - -(foobar - x - y - z) - -(«b:dict-set» a - b - c) - -(«b:dict-set» - a - b - c) - -(«b:call-with-values» («k:lambda» () («b:values» «:racket-selfeval-face:1» «:racket-selfeval-face:2»)) - «b:+») - -(«b:call-with-values» - («k:lambda» () («b:values» «:racket-selfeval-face:1» «:racket-selfeval-face:2»)) - «b:+») - -«m:;;; »«x:Forms with special indentation -» -(«k:let» ([«v:x» «:racket-selfeval-face:0»]) - x) - -«m:;; »«x:indent 2 -» -(«k:syntax-case» stx () - [(«k:_» x) #«:racket-selfeval-face:'#f»] - [(«k:_» x y) #«:racket-selfeval-face:'#t»]) - -«m:;; »«x:indent 3 -» -(«k:syntax-case*» stx () x - [(«k:_» x) #«:racket-selfeval-face:'#f»] - [(«k:_» x y) #«:racket-selfeval-face:'#t»]) - -(«k:syntax-case*» - stx - («k:#%module-begin» - «k:module» - «k:define-values» - «k:define-syntaxes» - «k:define» - «b:define/contract» - «k:define-syntax» - «k:struct» - «k:define-struct») - x - [(«k:_» x) #«:racket-selfeval-face:'#f»] - [(«k:_» x y) #«:racket-selfeval-face:'#t»]) - -«m:;; »«x:begin and cond have 0 style -»(«k:begin» - «:racket-selfeval-face:0» - «:racket-selfeval-face:0») - -(«k:begin» «:racket-selfeval-face:0» - «:racket-selfeval-face:0») - -(«k:cond» [«:racket-selfeval-face:1» «:racket-selfeval-face:2»] - [«:racket-selfeval-face:3» «:racket-selfeval-face:4»]) - -(«k:cond» - [«:racket-selfeval-face:1» «:racket-selfeval-face:2»] - [«:racket-selfeval-face:3» «:racket-selfeval-face:4»]) - -(«k:if» a - x - x) - -«m:;; »«x:begin* -» -(begin-for-foo «:racket-selfeval-face:0» - «:racket-selfeval-face:0») - -(begin-for-foo - «:racket-selfeval-face:0» - «:racket-selfeval-face:0») - -(«k:with-handlers» ([x y]) - a b c) - -«m:;; »«x:def, with-, call-with- and other 'defun style -» -(«k:define» («f:x») x x - x) - -(«k:struct» x x - ()) - -(«b:match-define» («b:list» x y) - («b:list» «:racket-selfeval-face:1» «:racket-selfeval-face:2»)) - -(«k:with-output-to-file» path «:racket-keyword-argument-face:#:mode» «:racket-selfeval-face:'text» «:racket-keyword-argument-face:#:exists» «:racket-selfeval-face:'replace» - («k:λ» () («b:display» «s:"Hello, world."»))) - -(«k:call-with-output-file» path «:racket-keyword-argument-face:#:mode» «:racket-selfeval-face:'text» «:racket-keyword-argument-face:#:exists» «:racket-selfeval-face:'replace» - («k:λ» (out) («b:display» «s:"Hello, world."» out))) - - -«m:;;; »«x:Special forms: When the first non-distinguished form is on the -»«m:;;; »«x:same line as distinguished forms, disregard it for indent. -» -«m:;; »«x:module has indent 2 -» -(«k:module» «:racket-selfeval-face:1» - «:racket-selfeval-face:2» - «:racket-selfeval-face:3» - «:racket-selfeval-face:4» - «:racket-selfeval-face:5») - -«m:;; »«x:Normal case -»(«k:module» «:racket-selfeval-face:1» «:racket-selfeval-face:2» - «:racket-selfeval-face:3» - «:racket-selfeval-face:4» - «:racket-selfeval-face:5») - -«m:;; »«x:Weird case -- but this is how scheme-mode indents it. -»(«k:module» «:racket-selfeval-face:1» «:racket-selfeval-face:2» «:racket-selfeval-face:3» - «:racket-selfeval-face:4» - «:racket-selfeval-face:5») - -«m:;; »«x:Weird case -- but this is how scheme-mode indents it. -»(«k:module» «:racket-selfeval-face:1» «:racket-selfeval-face:2» «:racket-selfeval-face:3» «:racket-selfeval-face:4» - «:racket-selfeval-face:5») - -«m:;;; »«x:for/fold -» -«m:;; »«x:for/fold untyped, accum on same line -»(«k:for/fold» ([a «:racket-selfeval-face:0»] - [b «:racket-selfeval-face:0»]) - ([x «:racket-selfeval-face:0»] - [y «:racket-selfeval-face:0»]) - «:racket-selfeval-face:#t») - -«m:;; »«x:for/fold untyped, accum on different line -»(«k:for/fold» - ([a «:racket-selfeval-face:0»] - [b «:racket-selfeval-face:0»]) - ([x «:racket-selfeval-face:0»] - [y «:racket-selfeval-face:0»]) - «:racket-selfeval-face:#t») - -«m:;; »«x:for/fold typed, type on same line -»(«k:for/fold» «b::» T - ([a «:racket-selfeval-face:0»] - [b «:racket-selfeval-face:0»]) - ([x «:racket-selfeval-face:0»] - [y «:racket-selfeval-face:0»]) - «:racket-selfeval-face:#t») - -«m:;; »«x:for/fold typed, type on different line -»(«k:for/fold» - «b::» T - ([a «:racket-selfeval-face:0»] - [b «:racket-selfeval-face:0»]) - ([x «:racket-selfeval-face:0»] - [y «:racket-selfeval-face:0»]) - «:racket-selfeval-face:#t») - -«m:;;; »«x:Bug #50 -» -'((x - y) A - z - (x - y) A - z) - -(«b:match» args - [(«b:list» x) (x - y)] «k:...» - [(«b:list» x) (x y)] «k:...» - [(«b:list» x) (x y)] «k:...») - -(«k:define-syntax» («f:fstruct» stx) - («b:syntax-parse» stx - [(«k:_» id:id (field:id «k:...»)) - («k:with-syntax» ([(accessor «k:...») - («k:for/list» ([fld («k:in-list» («b:syntax->list» #'(«b:field» «k:...»)))]) - («b:format-id» stx «s:"~a-~a"» («b:syntax->datum» #«:racket-selfeval-face:'id») fld))]) - #'(serializable-struct - id («b:field» «k:...») «:racket-keyword-argument-face:#:transparent» - «:racket-keyword-argument-face:#:property» «b:prop:procedure» - («k:lambda» (self . args) - («b:match» args - [(«b:list» «:racket-selfeval-face:'field») (accessor self)] «k:...» - [(«b:list» («b:list» «:racket-selfeval-face:'field»)) (accessor self)] «k:...» - [(«b:list» (list-rest «:racket-selfeval-face:'field» fields)) ((accessor self) fields)] «k:...» - [(list-rest «:racket-selfeval-face:'field» f args) - («k:struct-copy» id self - [«b:field» («k:apply» f (accessor self) args)])] «k:...» - [(list-rest («b:list» «:racket-selfeval-face:'field») f args) «m:;»«x:<-- THIS SEXPR IS INDENTED TOO FAR -» («k:struct-copy» id self - [«b:field» («k:apply» f (accessor self) args)])] «k:...» - [(list-rest (list-rest «:racket-selfeval-face:'field» fields) args) - («k:struct-copy» id self - [«b:field» («k:apply» (accessor self) fields args)])] «k:...»))))])) - -«m:;; »«x:Bug #123 -» -#hash([a . (#hash() - «:racket-selfeval-face:0»)] - [b . (#hasheq() - «:racket-selfeval-face:0»)] - [c . (#fx(«:racket-selfeval-face:0» «:racket-selfeval-face:1» «:racket-selfeval-face:2») - «:racket-selfeval-face:0»)] - [d . (#fx3(«:racket-selfeval-face:0» «:racket-selfeval-face:1» «:racket-selfeval-face:2») - «:racket-selfeval-face:0»)] - [e . (#fl(«:racket-selfeval-face:0.0» «:racket-selfeval-face:1.0» «:racket-selfeval-face:2.0») - «:racket-selfeval-face:0»)] - [f . (#fl3(«:racket-selfeval-face:0.0» «:racket-selfeval-face:1.0» «:racket-selfeval-face:2.0») - «:racket-selfeval-face:0»)] - [g . (#s(foo x) - «:racket-selfeval-face:0»)] - [h . (#3(«:racket-selfeval-face:0» «:racket-selfeval-face:1» «:racket-selfeval-face:2») - «:racket-selfeval-face:0»)]) - -«m:;; »«x:Bug #136 -» -«m:#;»«x:(list 1 - #;2 - 3)» - -(«b:list» «:racket-selfeval-face:1» - «m:#;»«x:(list 1 - (let ([x 2] - #;[y 3]) - x) - 3)» - «:racket-selfeval-face:2» - «:racket-selfeval-face:3») - -«m:;; »«x:Bug #243 -»(«k:cond» [x y - z] - [(«b:=» a x) y - z]) - -«m:;; »«x:Bug #262 -»(define-metafunction «v:λL» - ∪ «b::» (x «k:...») «k:...» «b:->» (x «k:...») - [(∪ any_ls «k:...») - ,(«k:apply» «b:append» (term (any_ls «k:...»)))]) diff --git a/elpa/racket-mode-20200417.1741/racket/find-module-path-completions.rkt b/elpa/racket-mode-20200417.1741/racket/find-module-path-completions.rkt deleted file mode 100644 index c1f4bad1..00000000 --- a/elpa/racket-mode-20200417.1741/racket/find-module-path-completions.rkt +++ /dev/null @@ -1,45 +0,0 @@ -#lang racket/base - -;;; `racket-open-require-path' uses `tq' to run us. We repeatedly -;;; read-line a query and display the answer as lines terminated by a -;;; blank line. -;;; -;;; This was created because the original attempt, using -;;; `racket--eval/sexpr', couldn't keep up with fast typing. This new -;;; approach is more direct (e.g. no converting to/from sexprs) and -;;; fast enough. Using `tq' provides a "type-ahead buffer" (in lieu of -;;; the old approach's use of `run-with-timer') even though in my -;;; testing so far it's rarely needed. -;;; -;;; The case where `find-module-path-completions' isn't available: We -;;; don't error, we simply always return empty matches. (This might -;;; not be ideal but I initially had trouble making `tq' recognize -;;; e.g. an (exit 1) here and handle it smoothly. Maybe it would work -;;; to change our "protocol" to have an initial question and answer -;;; devoted to this. For example "HELLO?\n" => "OK\n\n" / "ERROR\n\n". -;;; Thereafter the status quo loop.) - -(require racket/match - "util.rkt") - -(module+ main - (define dir (current-directory)) ;FIXME: Get from command-line - (define display-choices (init dir)) - (let loop () - (define str (read-line)) - (unless (string=? "" str) - (display-choices str) - (displayln "") ;; terminating blank line - (flush-output) - (loop))) - (exit 0)) - -(define-polyfill (find-module-path-completions dir) - #:module drracket/find-module-path-completions - (λ (_str) (list))) - -(define (init dir) - (define get (find-module-path-completions dir)) - (λ (str) - (for ([x (in-list (get str))]) - (displayln (path->string (cadr x)))))) diff --git a/elpa/racket-mode-20200417.1741/racket/find.rkt b/elpa/racket-mode-20200417.1741/racket/find.rkt deleted file mode 100644 index d481aa37..00000000 --- a/elpa/racket-mode-20200417.1741/racket/find.rkt +++ /dev/null @@ -1,338 +0,0 @@ -#lang racket/base - -(require racket/contract - (only-in racket/function curry) - racket/list - racket/match - "identifier.rkt" - "syntax.rkt") - -(provide find-definition - find-definition/drracket-jump - find-signature) - -(module+ test - (require rackunit - racket/format)) - -;; Note: Unfortunately identifier-binding can't report the definition -;; id in the case of a contract-out and a rename-out, both. For -;; `(provide (contract-out [rename orig new contract]))` -;; identifier-binding reports (1) the contract wrapper as the id, and -;; (2) `new` as the nominal-id -- but NOT (3) `orig`. We handle such -;; cases; see `find-def-in-file` and its use of `$renaming-provde`, -;; below. -;; -;; Another tricky case: "foo" is defined in def.rkt. repro.rkt -;; requires def.rkt and re-provides "foo" using contract-out. When -;; user.rkt requires repro.rkt, identifier-binding will report "foo" -;; the id (yay!) but report the defining file is repro.rkt -- not -;; def.rkt (boo!). We handle such cases. - -(define location/c (list/c path-string? natural-number/c natural-number/c)) - -;; Try to find a definition, using as a head start information -;; supplied by drracket/check-syntax. It did the "fast" work for all -;; uses (calling identifier-binding) and we recorded that answer to -;; give the front end. If the user wants to visit any of those, the -;; front end gives us that info, and we do the "slow" work. -(define/contract (find-definition/drracket-jump how-path src-path submods id-strs) - (-> (and/c how/c (not/c 'namespace)) path-string? (listof symbol?) (listof string?) - (or/c #f 'kernel location/c)) - (or (for/or ([id-str (in-list id-strs)]) - (match (find-def-in-file (string->symbol id-str) how-path src-path submods) - [(list stx path _submods) - (list (->path-string (or (syntax-source stx) path)) - (or (syntax-line stx) 1) - (or (syntax-column stx) 0))] - [v v])) - ;; Handle possible re-provide with a contract: Try again - ;; starting with that other src-path. i.e. Do automatically what - ;; the user could: Open that file, and try visit-definition - ;; again, there. from that. - (and (not (path-string-equal? how-path src-path)) - (for/or ([id-str (in-list id-strs)]) - (find-definition src-path id-str))) - ;; As a final fallback, return the reported file:1:0. At least - ;; give user a head start. - (list src-path 1 0))) - -;; Try to find a definition. -(define/contract (find-definition how str) - (-> how/c string? - (or/c #f 'kernel location/c)) - (match (find-def how str) - [(list stx path _submods) - (list (->path-string (or (syntax-source stx) path)) - (or (syntax-line stx) 1) - (or (syntax-column stx) 0))] - [v v])) - -;; Try to find the definition of `str`, returning its signature or #f. -;; When defined in 'kernel, returns a form saying so, not #f. -(define/contract (find-signature how str) - (-> how/c string? - (or/c #f pair?)) - (match (find-def how str) - ['kernel '("defined in #%kernel, signature unavailable")] - [(list id-stx path submods) - (get-syntax how path - (λ (mod-stx) - (match ($signature (syntax-e id-stx) - (submodule-syntax submods mod-stx)) - [(? syntax? stx) (syntax->datum stx)] - [_ #f])))] - [v v])) - -(define stx+path+mods/c (list/c syntax? path-string? (listof symbol?))) - -(define/contract (find-def how str) - (-> how/c string? - (or/c #f 'kernel stx+path+mods/c)) - (->identifier-resolved-binding-info - how str - (λ (results) - (match results - [(? list? bindings) - (or (for/or ([x (in-list (remove-duplicates bindings))]) - (match x - [(cons _id 'kernel) 'kernel] - [(list* id path submods) (find-def-in-file id how path submods)])) - ;; Handle possible re-provide with a contract: Try again - ;; starting with that other src-path. i.e. Automatically - ;; do what the user could: Open that file, and try - ;; visit-definition again, there. - (match results - [(list (list* src-id src-path src-subs) - (list* nom-id _)) - (or (and (or (equal? how 'namespace) - (not (path-string-equal? how src-path))) - (for/or ([id (in-list (list src-id nom-id))]) - (find-def (path->string src-path) (symbol->string id)))) - ;; As a final fallback, return the reported - ;; file:1:0. At least give user a head start. - (list (datum->syntax #f src-id (list src-path 1 0 #f #f)) - src-path - '()))] - [_ #f]))] - [_ #f])))) - -(define/contract (find-def-in-file id-sym how path submods) - (-> symbol? how/c path-string? (listof symbol?) - (or/c #f stx+path+mods/c)) - (define subs (curry submodule-syntax submods)) - (match (or (get-expanded-syntax - how path - (λ (stx) - ($definition id-sym (subs stx)))) - (get-syntax - how path - (λ (stx) - (match ($renaming-provide id-sym (subs stx)) - [(? identifier? id) - (define id-sym (syntax-e id)) - (get-expanded-syntax - how path - (λ (stx) - ($definition id-sym (subs stx))))] - [_ #f])))) - [(? syntax? stx) (list stx path submods)] - [_ #f])) - -;; Given a submodule path as a list of symbols, and the syntax for a -;; file's entire module form: Return the (sub)module contents as -;; #'(begin . contents). -(define/contract (submodule-syntax sub-mod-syms stx) - (-> (listof symbol?) syntax? (or/c #f syntax?)) - ;; Prepend #f as the outermost module name to match, meaning "any". - (sub-stx (cons #f sub-mod-syms) stx)) - -(define (sub-stx mods stx) - (match-define (cons this more) mods) - (define (subs stxs) - (if (empty? more) - #`(begin . #,stxs) - (ormap (λ (stx) (sub-stx more stx)) - (syntax->list stxs)))) - (syntax-case* stx (module #%module-begin) syntax-e-eq? - [(module name _ (#%module-begin . stxs)) - (or (not this) (eq? this (syntax-e #'name))) - (subs #'stxs)] - [(module name _ . stxs) - (or (not this) (eq? this (syntax-e #'name))) - (subs #'stxs)] - [_ #f])) - -(module+ test - (check-equal? (syntax->datum - (submodule-syntax '(a b c) - #'(module file racket - (module a racket - (module not-b racket #f) - (module b racket - (module not-c racket #f) - (module c racket "bingo") - (module not-c racket #f)) - (module not-b racket #f))))) - '(begin "bingo"))) - -;; Given a symbol and syntax, return syntax corresponding to the -;; definition. Intentionally does NOT walk into module forms, so, give -;; us the module bodies wrapped in begin. -;; -;; If `stx` is expanded we can find things defined via definer -;; macros. -;; -;; If `stx` is not expanded, we will miss some things, however the -;; syntax will be closer to what a human expects -- e.g. `(define (f -;; x) x)` instead of `(define-values (f) (lambda (x) x))`. -(define ($definition sym stx) ;;symbol? syntax? -> syntax? - (define eq-sym? (make-eq-sym? sym)) - ;; This is a hack to handle definer macros that neglect to set - ;; srcloc properly using syntax/loc or (format-id ___ #:source __): - ;; If the stx lacks srcloc and its parent stx has srcloc, return the - ;; parent stx instead. Caveats: 1. Assumes caller only cares about - ;; the srcloc. 2. We only check immediate parent. 3. We only use - ;; this for define-values and define-syntaxes, below, on the - ;; assumption that this only matters for fully-expanded syntax. - (define (loc s) - (if (and (not (syntax-line s)) - (syntax-line stx)) - stx - s)) - (syntax-case* stx - (begin define-values define-syntaxes - define define/contract - define-syntax struct define-struct) - syntax-e-eq? - [(begin . stxs) (ormap (λ (stx) ($definition sym stx)) - (syntax->list #'stxs))] - [(define (s . _) . _) (eq-sym? #'s) stx] - [(define/contract (s . _) . _) (eq-sym? #'s) stx] - [(define s . _) (eq-sym? #'s) stx] - [(define-values (ss ...) . _) (ormap eq-sym? (syntax->list #'(ss ...))) - (loc (ormap eq-sym? (syntax->list #'(ss ...))))] - [(define-syntax (s . _) . _) (eq-sym? #'s) stx] - [(define-syntax s . _) (eq-sym? #'s) stx] - [(define-syntaxes (ss ...) . _) (ormap eq-sym? (syntax->list #'(ss ...))) - (loc (ormap eq-sym? (syntax->list #'(ss ...))))] - [(define-struct s . _) (eq-sym? #'s) stx] - [(define-struct (s _) . _) (eq-sym? #'s) stx] - [(struct s . _) (eq-sym? #'s) stx] - [(struct (s _) . _) (eq-sym? #'s) stx] - [_ #f])) - -;; Given a symbol and syntax, return syntax corresponding to the -;; function definition signature. The input syntax should NOT be -;; `expand`ed. This intentionally does NOT walk into module forms, so, -;; give us the module bodies wrapped in begin. -(define ($signature sym stx) ;;symbol? syntax? -> (or/c #f list?) - (define eq-sym? (make-eq-sym? sym)) - (syntax-case* stx (begin define define/contract case-lambda) syntax-e-eq? - [(begin . stxs) (ormap (λ (stx) ($signature sym stx)) - (syntax->list #'stxs))] - [(define (s . as) . _) (eq-sym? #'s) #'(s . as)] - [(define/contract (s . as) . _) (eq-sym? #'s) #'(s . as)] - [(define s (case-lambda [(ass ...) . _] ...)) (eq-sym? #'s) #'((s ass ...) ...)] - [_ #f])) - -;; Find sym in a contracting and/or renaming provide, and return the -;; syntax for the ORIGINAL identifier (before being contracted and/or -;; renamed). The input syntax should NOT be expanded. -(define ($renaming-provide sym stx) ;;symbol? syntax? -> syntax? - (define eq-sym? (make-eq-sym? sym)) - (syntax-case* stx (begin provide provide/contract) syntax-e-eq? - [(begin . stxs) - (ormap (λ (stx) ($renaming-provide sym stx)) - (syntax->list #'stxs))] - [(provide/contract . stxs) - (for/or ([stx (syntax->list #'stxs)]) - (syntax-case stx () - [(s _) (eq-sym? #'s)] - [_ #f]))] - [(provide . stxs) - (for/or ([stx (syntax->list #'stxs)]) - (syntax-case* stx (contract-out rename-out) syntax-e-eq? - [(contract-out . stxs) - (for/or ([stx (syntax->list #'stxs)]) - (syntax-case* stx (rename) syntax-e-eq? - [(rename orig s _) (eq-sym? #'s) #'orig] - [(s _) (eq-sym? #'s) #'s] - [_ #f]))] - [(rename-out . stxs) - (for/or ([stx (syntax->list #'stxs)]) - (syntax-case* stx () syntax-e-eq? - [(orig s) (eq-sym? #'s) #'orig] - [_ #f]))] - [_ #f]))] - [_ #f])) - -(module+ test - ;; Just a quick smoke test. See test/find.rkt for many more tests. - ;; - ;; Exercise where the "how" is a path-string, meaning look up that - ;; path from our cache, not on disk. - (let ([path-str "/tmp/x.rkt"] - [code-str (~a `(module x racket/base - (define (module-function-binding x y z) (+ 1 x)) - (define module-variable-binding 42)))]) - (string->expanded-syntax path-str code-str void) - (check-equal? (find-signature path-str "module-function-binding") - '(module-function-binding x y z)) - (check-equal? (find-definition path-str "module-function-binding") - `(,path-str 1 31)) - (check-equal? (find-definition path-str "module-variable-binding") - `(,path-str 1 79))) - ;; Exercise the "make-traversal" scenario described in comments - ;; above. - (let ([path-str "/tmp/x.rkt"] - [code-str (~a `(module x racket/base - (require drracket/check-syntax) - "make-traversal"))]) - (string->expanded-syntax path-str code-str void) - (check-match (find-definition path-str "make-traversal") - (list (pregexp "private/syncheck/traversals.rkt$") _ _)))) - -;; These `get-syntax` and `get-expanded-syntax` functions handle where -;; we get the syntax. -;; -;; The special case is when `how` is a path-string. That path doesn't -;; necessarily exist as a file, or the file may be outdated. The path -;; may simply be the syntax-source for a string from an unsaved Emacs -;; buffer. So when we need to get syntax for such a path, we need to -;; get it from our cache -- NOT from a file. (How it got in the cache -;; previously was from some check-syntax.) -;; -;; Things like identifier-binding may tell us to look at such a path, -;; or at a path for a real existing/updated file. This helps sort out -;; the various cases. - -(define (get-syntax how path-str k) - (match how - ['namespace (file->syntax path-str k)] - [(? path-string? how-path) (if (path-string-equal? path-str how-path) - (path->existing-syntax path-str k) - (file->syntax path-str k))])) - -;; For when we use syntax-case* simply for syntax-e equality. -(define (syntax-e-eq? a b) - (eq? (syntax-e a) (syntax-e b))) - -(define ((make-eq-sym? sym) stx) - (and (eq? sym (syntax-e stx)) stx)) - -(define (get-expanded-syntax how path-str k) - (match how - ['namespace (file->expanded-syntax path-str k)] - [(? path-string? how-path) (if (path-string-equal? path-str how-path) - (path->existing-expanded-syntax path-str k) - (file->expanded-syntax path-str k))])) - -(define (path-string-equal? a b) - (equal? (->path-string a) - (->path-string b))) - -(define (->path-string v) - (cond [(path? v) (path->string v)] - [(path-string? v) v] - [else (error 'path-string-equal? "not a path or path-string?" v)])) diff --git a/elpa/racket-mode-20200417.1741/racket/fresh-line.rkt b/elpa/racket-mode-20200417.1741/racket/fresh-line.rkt deleted file mode 100644 index e294be37..00000000 --- a/elpa/racket-mode-20200417.1741/racket/fresh-line.rkt +++ /dev/null @@ -1,37 +0,0 @@ -#lang racket/base - -(provide fresh-line - zero-column!) - -;; Borrowed from xrepl - -(define last-output-port (make-parameter #f)) -(define last-error-port (make-parameter #f)) - -(define (maybe-new-output-ports) - (define (maybe last cur) - (unless (eq? (last) (cur)) - (when (and (last) - (not (port-closed? (last)))) - (flush-output (last))) ;just in case - (last (cur)) - (flush-output (last)) - (port-count-lines! (last)))) - (maybe last-output-port current-output-port) - (maybe last-error-port current-error-port)) - -(define (fresh-line [stderr? #f]) - (maybe-new-output-ports) - (define port (if stderr? (last-error-port) (last-output-port))) - (flush-output port) - (define-values [line col pos] (port-next-location port)) - (unless (eq? col 0) (newline))) - -(define (zero-column!) - ;; there's a problem whenever there's some printout followed by a - ;; read: the cursor will be at column zero, but the port counting - ;; will think that it's still right after the printout; call this - ;; function in such cases to adjust the column to 0. - (maybe-new-output-ports) - (define-values [line col pos] (port-next-location (last-output-port))) - (set-port-next-location! (last-output-port) line 0 pos)) diff --git a/elpa/racket-mode-20200417.1741/racket/gui.rkt b/elpa/racket-mode-20200417.1741/racket/gui.rkt deleted file mode 100644 index 4b8daec7..00000000 --- a/elpa/racket-mode-20200417.1741/racket/gui.rkt +++ /dev/null @@ -1,42 +0,0 @@ -#lang at-exp racket/base - -(require (only-in racket/format ~a) - "util.rkt") - -(provide gui-required? - require-gui - txt/gui) - -(define root-eventspace #f) ;#f until racket/gui/base required first time - -(define (gui-required?) - (and root-eventspace #t)) - -;; Extra explanation for situations like issue 93, entering `(require -;; redex)` in the REPL, as opposed to having it in a .rkt file. -(define more-explanation - @~a{The namespace was reset. Any `require`s you entered in the REPL were "undone". - This includes the `require` you just entered. You may want to enter it again.}) - -;; This must be called from the main thread, under the main custodian! -(define (require-gui in-repl?) - (when (gui-required?) - (error 'require-gui "Already required")) - (display-commented "On-demand, one-time instantiation of racket/gui/base.") - (when in-repl? - (display-commented more-explanation)) - (define current-eventspace (gui-dyn-req 'current-eventspace)) - (define make-eventspace (gui-dyn-req 'make-eventspace)) - (set! root-eventspace (make-eventspace)) - (current-eventspace root-eventspace)) - -;; Like mz/mr from racket/sandbox. -(define-syntax txt/gui - (syntax-rules () - [(_ txtval guisym) - (if (gui-required?) - (gui-dyn-req 'guisym) - txtval)])) - -(define (gui-dyn-req sym) - (dynamic-require 'racket/gui/base sym)) diff --git a/elpa/racket-mode-20200417.1741/racket/identifier.rkt b/elpa/racket-mode-20200417.1741/racket/identifier.rkt deleted file mode 100644 index 94b35d86..00000000 --- a/elpa/racket-mode-20200417.1741/racket/identifier.rkt +++ /dev/null @@ -1,190 +0,0 @@ -#lang racket/base - -(require racket/contract - racket/format - racket/match - "syntax.rkt") - -(provide how/c - ->identifier - ->identifier-resolved-binding-info) - -;;; Creating identifiers from symbols or strings - -;; A simplifying helper for commands that want to work both ways, and -;; accept a first "how" or "context" argument that is either -;; 'namespace or a path-string. -(define how/c (or/c 'namespace path-string?)) - -(define/contract (->identifier how v k) - (-> how/c (or/c symbol? string?) (-> syntax? any) any) - (match how - ['namespace (->identifier/namespace v k)] - [(? (and string? path-string?) p) (->identifier/expansion p v k)])) - -(define/contract (->identifier/namespace v k) - (-> (or/c symbol? string?) (-> identifier? any/c) any/c) - (define sym->id namespace-symbol->identifier) - (k (cond [(string? v) (sym->id (string->symbol v))] - [(symbol? v) (sym->id v)]))) - -;; We use path-str to get expanded module syntax from the cache via -;; path->existing-expanded-syntax, and use the 'module-body-context -;; syntax property -- starting in Racket 6.5 -- which can be used as -;; lexical context to make an identifier. This lets identifier-binding -;; work for identifiers as if they were in that body's lexical context -;; -- including imported identifiers that aren't actually used as -;; bindings in the module body. -(define/contract (->identifier/expansion path-str v k) - (-> path-string? - (or/c symbol? string?) - (-> identifier? any/c) - any/c) - (path->existing-expanded-syntax - path-str - (λ (stx) - (define (sym->id v) - (expanded-module+symbol->identifier path-str stx v)) - (k (cond [(string? v) (sym->id (string->symbol v))] - [(symbol? v) (sym->id v)]))))) - -(define/contract (expanded-module+symbol->identifier path-str exp-mod-stx sym) - (-> path-string? syntax? symbol? identifier?) - ;; For imported bindings, this creates syntax where - ;; identifier-binding will report a module-path-index that can be - ;; resolved to a path that exists. Great! - ;; - ;; For module bindings, identifier-binding will say that the binding - ;; exists. Good! But. Until a module declaration is evaluated, the - ;; module has no name. As a result, the module-path-index is - ;; reported as #. That would - ;; resolve to -- wrong. - ;; - ;; Work-around: Let's record the path in the identifier's - ;; syntax-source. Doing so won't change what identifier-binding - ;; reports, but it means mpi->path can handle such a module path - ;; index by instead using the path from syntax-source. - (datum->syntax (syntax-property exp-mod-stx 'module-body-context) - sym - (list (string->path path-str) #f #f #f #f))) - - -;;; Massaging values returned by identifier-binding - - ;; A composition that does the right thing, including when making an -;; identifier that is a module binding. -(define (->identifier-resolved-binding-info how v k) - (->identifier how v - (λ (id) - (k (resolve-identifier-binding-info - id - (identifier-binding id)))))) - -;; Given an identifier and the result from identifier-binding, returns -;; a subset of the information, where the module path indexes are -;; resolved to actual paths, and where the 'lexical value is treated -;; as #f. -(define/contract (resolve-identifier-binding-info id binding-info) - (-> identifier? - (or/c 'lexical - #f - (list/c module-path-index? - symbol? - module-path-index? - symbol? - exact-nonnegative-integer? - (or/c exact-integer? #f) - (or/c exact-integer? #f)) - (list/c symbol?)) - (or/c #f - (listof (cons/c symbol? - (or/c 'kernel - (cons/c path-string? (listof symbol?))))))) - (match binding-info - [(list source-mpi source-id - nominal-source-mpi nominal-source-id - source-phase - import-phase - nominal-export-phase) - (list (cons source-id (id+mpi->path id source-mpi)) - (cons nominal-source-id (id+mpi->path id nominal-source-mpi)))] - [_ #f])) - -(define/contract (id+mpi->path id mpi) - (-> identifier? - module-path-index? - (or/c 'kernel - (cons/c path-string? (listof symbol?)))) - (cond [;; We could check below for the interned -- or not in older - ;; Rackets -- symbol '|expanded module|. That seems smelly. - ;; Instead if we're a "self" module, and if the identifier - ;; has a location -- probably supplied above by our - ;; expanded-module+symbol->identifier -- use that source. - (and (self-module? mpi) - (syntax-source id)) - (list (syntax-source id))] - [else - (match (resolved-module-path-name - (module-path-index-resolve mpi)) - [(? hash-percent-symbol) 'kernel] - [(? path-string? path) (list path)] - [(? symbol? sym) - (list (build-path (current-load-relative-directory) - (~a sym ".rkt")))] - [(list (? path-string? path) (? symbol? subs) ...) - (list* path subs)] - ;; I've seen this odd case occur only when running - ;; test/find.rkt. The module path index is - ;; #, and resolving that is (find-examples m) when - ;; it should be '(# m). - [(list (? symbol?) (? symbol? subs) ...) - (list* (syntax-source id) subs)])])) - -(define (self-module? mpi) - (define-values (a b) (module-path-index-split mpi)) - (and (not a) (not b))) - -(define (hash-percent-symbol v) - (and (symbol? v) - (regexp-match? #px"^#%" (symbol->string v)))) - -(module+ test - (require rackunit - "syntax.rkt") - ;; Check something that is in the namespace resulting from - ;; module->namespace on, say, this source file. - (parameterize ([current-namespace (module->namespace (syntax-source #'here))]) - (check-not-false (->identifier-resolved-binding-info 'namespace 'match values)) - (check-not-false (->identifier-resolved-binding-info 'namespace "match" values))) - - ;; Check something that is not in the current namespace, but is an - ;; identifier in the lexical context of an expanded module form -- - ;; including imported identifiers -- from the expanded syntax - ;; cache. - (define path-str "/path/to/foobar.rkt") - (define code-str (~a '(module foobar racket/base - (require net/url racket/set) - (let ([a-lexical-binding 42]) - a-lexical-binding) - (define a-module-binding 42) - a-module-binding))) - ;; Get the expanded syntax in our cache - (string->expanded-syntax path-str code-str void) - ;; Simple imported binding - (check-not-false (->identifier-resolved-binding-info path-str 'set? values)) - (check-not-false (->identifier-resolved-binding-info path-str "set?" values)) - ;; Import where renaming/contracting is involved - (check-not-false (->identifier-resolved-binding-info path-str 'get-pure-port values)) - (check-not-false (->identifier-resolved-binding-info path-str "get-pure-port" values)) - ;; Get a module binding - (check-equal? (->identifier-resolved-binding-info path-str "a-module-binding" values) - (let ([path (string->path path-str)]) - `((a-module-binding ,path) - (a-module-binding ,path)))) - ;; Get a lexical binding: Should return false - (check-false (->identifier-resolved-binding-info path-str "a-lexical-binding" values)) - ;; Get something that's not a binding in at all: Should return false - (check-false (->identifier-resolved-binding-info path-str "ASDFASDFDS" values)) - ;; Get whatever in some file not in expanded syntax cache: Should return false - (check-false (->identifier-resolved-binding-info "not/yet/expanded.rkt" "whatever" values))) diff --git a/elpa/racket-mode-20200417.1741/racket/image.rkt b/elpa/racket-mode-20200417.1741/racket/image.rkt deleted file mode 100644 index e964a90b..00000000 --- a/elpa/racket-mode-20200417.1741/racket/image.rkt +++ /dev/null @@ -1,26 +0,0 @@ -#lang racket/base - -;;; Portions Copyright (C) 2012 Jose Antonio Ortega Ruiz. - -(require file/convertible - racket/file - racket/vector) - -(provide convert-image? - convert-image) - -;; save-temporary-image : bytes? -> string? -;; -;; Write bytes to a temporary file and return "#". -(define (save-temporary-image png-bytes) - (define filename (make-temporary-file "racket-image-~a.png")) - (with-output-to-file filename #:exists 'truncate - (λ () (display png-bytes))) - (format "#" filename)) - -(define (convert-image? v) - (convertible? v)) - -(define (convert-image v) - (cond [(and (convertible? v) (convert v 'png-bytes)) => save-temporary-image] - [else v])) diff --git a/elpa/racket-mode-20200417.1741/racket/imports.rkt b/elpa/racket-mode-20200417.1741/racket/imports.rkt deleted file mode 100644 index e635c761..00000000 --- a/elpa/racket-mode-20200417.1741/racket/imports.rkt +++ /dev/null @@ -1,268 +0,0 @@ -#lang racket/base - -(require racket/contract - racket/format - racket/match - racket/set - "util.rkt") - -(provide imports) - -;;; Finding completion candidates from imports - -;; drracket/check-syntax tells us about local definitions (which is -;; great!), and, tells us about imported definitions -- but only those -;; already _used_. Obviously, a major use case for completion is -;; typing _new_ uses of available definitions, too. e.g. "What is that -;; string-xxx function I'm not yet using in this file?" So we want to -;; supply that full set. -;; -;; If you have a namespace from module->namespace, you can use -;; namespace-mapped-symbols -- easy! However we do NOT want to -;; instantiate the module, i.e. "run the user's code". We want to -;; supply this information using the same sort of "passive" analaysis -;; done by check-syntax, before the user even runs the file (if ever). -;; -;; module->exports is a good starting point, but not the whole answer: -;; Imports can be filtered and renamed -- e.g. only-in, except-in, -;; prefix-in, rename-in. -;; -;; AFAICT there is no good way to get completions from all imported -;; identifiers, except attempting to parse the complete #%require -;; grammar including `prefix` and renaming forms like `just-meta`, and -;; apply that information to tweak the answer from module->exports. - -;; It is important to run this with the correct parameterization of -;; current-namespace and current-load-relative-directory. -(define/contract (imports stx [sos (mutable-set)]) - (->* (syntax?) (set-mutable?) set-mutable?) - - (define (handle-module stx) - (syntax-case stx (module #%module-begin #%plain-module-begin #%require) - [(module _id lang (#%module-begin e ...)) - (handle-module-level #'(e ...) #'lang)] - [(module _id lang (#%plain-module-begin e ...)) - (handle-module-level #'(e ...) #'lang)])) - - (define (handle-module-level es lang) - (module-exported-strings lang lang) - (for ([e (in-syntax es)]) - (syntax-case* e (#%require module module*) symbolic-compare? - [(#%require e ...) - (for ([spec (in-syntax #'(e ...))]) - (handle-raw-require-spec spec lang))] - [(module _id sub-mod-lang (_mb e ...)) - (handle-module-level #'(e ...) #'sub-mod-lang)] - [(module* _id sub-mod-lang (_mb e ...)) - (handle-module-level #'(e ...) (if (syntax-e #'sub-mod-lang) - #'sub-mod-lang - lang))] - [ _ (void)]))) - - (define (handle-raw-require-spec spec lang) - (syntax-case* spec (for-meta for-syntax for-template for-label just-meta) symbolic-compare? - [(for-meta _phase specs ...) - (for ([spec (in-syntax #'(specs ...))]) - (handle-phaseless-spec spec lang))] - [(for-syntax specs ...) - (for ([spec (in-syntax #'(specs ...))]) - (handle-phaseless-spec spec lang))] - [(for-template specs ...) - (for ([spec (in-syntax #'(specs ...))]) - (handle-phaseless-spec spec lang))] - [(for-label specs ...) - (for ([spec (in-syntax #'(specs ...))]) - (handle-phaseless-spec spec lang))] - [(just-meta phase specs ...) - (for ([spec (in-syntax #'(specs ...))]) - (handle-raw-require-spec spec lang))] - [raw-module-path - (handle-phaseless-spec #'raw-module-path lang)])) - - (define (handle-phaseless-spec spec lang) - (syntax-case* spec (only prefix all-except prefix-all-except rename) - symbolic-compare? - [(only _raw-module-path id ...) - (set-union! sos - (syntax->string-set #'(id ...)))] - [(prefix prefix-id raw-module-path) - (module-exported-strings #'raw-module-path - lang - #:prefix #'prefix-id)] - [(all-except raw-module-path id ...) - (module-exported-strings #'raw-module-path - lang - #:except (syntax->string-set #'(id ...)))] - [(prefix-all-except prefix-id raw-module-path id ...) - (module-exported-strings #'raw-module-path - lang - #:prefix #'prefix-id - #:except (syntax->string-set #'(id ...)))] - [(rename raw-module-path local-id exported-id) - (begin - (unless (eq? (syntax-e #'raw-module-path) (syntax-e lang)) - (set-remove! sos (->str #'exported-id))) - (set-add! sos (->str #'local-id)))] - [raw-module-path - (module-path? (syntax->datum #'raw-module-path)) - (module-exported-strings #'raw-module-path - lang)])) - - (define (module-exported-strings raw-module-path - lang - #:except [exceptions (set)] - #:prefix [prefix #'""]) - ;; NOTE: Important to run this with the correct parameterization of - ;; current-namespace and current-load-relative-directory. - (define (add-exports mp) - (define-values (vars stxs) (module->exports mp)) - (define orig - (for*/mutable-set ([vars+stxs (in-list (list vars stxs))] - [phases (in-list vars+stxs)] - [export (in-list (cdr phases))]) - (->str (car export)))) - ;; If imports are from the module language, then {except rename - ;; prefix}-in do NOT remove imports under the original name. - ;; Otherwise they do. - (if (eq? (syntax-e raw-module-path) (syntax-e lang)) - (set-union! sos orig) - (set-subtract! sos orig exceptions)) - (for ([v (in-set orig)]) - (set-add! sos (~a (->str prefix) v)))) - - ;; Ignore non-external module paths: module->exports can't handle - ;; them, and anyway, drracket/check-syntax will contribute - ;; completion candidates for local definitions, we don't need to - ;; find them here. - (syntax-case* raw-module-path (quote submod) symbolic-compare? - [(quote _) sos] - [(submod "." . _) sos] - [_ (add-exports (syntax->datum raw-module-path))])) - - (handle-module stx) - sos) - -(define (->str v) - (match v - [(? syntax?) (->str (syntax-e v))] - [(? symbol?) (symbol->string v)] - [(? string?) v])) - -(define (syntax->string-set s) - (for/mutable-set ([s (in-syntax s)]) - (->str s))) - -(define (symbolic-compare? x y) - (eq? (syntax-e x) (syntax-e y))) - -(module+ completions-example - (parameterize ([current-namespace (make-base-namespace)]) - (define stx - (expand - #'(module m racket/base - (module sub racket/base (void)) - (require racket/require - (submod "." sub) - (except-in "../error.rkt" show-full-path-in-errors) - (prefix-in XXX: (except-in racket/file other-write-bit)) - (rename-in racket/path [path-only PATH-ONLY]))))) - (syntax->datum stx) - (imports stx))) - -(module+ test - (require rackunit - version/utils) - ;; Compare the results to namespace-mapped-symbols. - (module mod racket/base - (module sub racket/base - (define provided-by-submodule 42) - (provide provided-by-submodule)) - (require (rename-in racket/path - [path-only PATH-ONLY]) - (except-in racket/base println) - (rename-in racket/base - [display DISPLAY]) - (prefix-in PREFIX: (only-in racket/base displayln)) - (for-syntax (rename-in racket/syntax [format-id FORMAT-ID])) - (submod "." sub)) - (define-namespace-anchor nsa) - (define nsms (map symbol->string - (namespace-mapped-symbols - (namespace-anchor->namespace nsa)))) - (provide nsms)) - (require 'mod) - (define mod/stx - (expand - #`(module mod racket/base - (module sub racket/base - (define provided-by-submodule 42) - (provide provided-by-submodule)) - (require (rename-in racket/path - [path-only PATH-ONLY]) - (except-in racket/base println) - (rename-in racket/base - [display DISPLAY]) - (prefix-in PREFIX: (only-in racket/base displayln)) - (for-syntax (rename-in racket/syntax [format-id FORMAT-ID])) - (submod "." sub)) - (eprintf "I should not print!")))) - (let (;; The world according to `namespace-mapped-symbols` - [nsms (list->set nsms)] - ;; The world according to our `imports` - [cs (parameterize ([current-namespace (make-base-namespace)]) - (define stx (expand mod/stx)) - (time (imports stx)))]) - ;; Test {prefix rename except}-in, keeping mind that they work - ;; differently for requires that modify the module language - ;; imports. - (check-false (set-member? cs "path-only") - "rename-in not from module language hides old name") - (check-true (set-member? cs "PATH-ONLY") - "rename-in not from module language has new name ") - (check-true (set-member? cs "display") - "rename-in from module language does not hide old name") - (check-true (set-member? cs "DISPLAY") - "rename-in from module language has new name") - (check-true (set-member? cs "displayln") - "prefix-in from module language does not hide old name") - (check-true (set-member? cs "PREFIX:displayln") - "prefix-in from module language is available under new name") - ;; namespace-mapped-symbols will return some definitions beyond - ;; those imported -- it includes {top module}-level bindings. This - ;; test accounts for that with a dumb ad hoc list. (More nifty - ;; would be to walk our test stx and build that list.) - ;; - ;; FIXME? Travis CI says this test fails prior to Racket 7.0: - ;; namespace-mapped-symbols reports ~400 more symbols -- - ;; apparently from full racket (should be racket/base). Huh?? - ;; Well, _our_ results are correct. For now, let's just do the - ;; test on Racket 7.0+. - (when (version<=? "7.0" (version)) - (check-equal? (set-subtract nsms cs) - (set "tmp.1" "nsms" "nsa" "provided-by-submodule") - "namespace-mapped-symbols returns only a few more, non-imported definitions")))) - -(module+ slow-test - ;; Exercise our parsing of the #%require grammar: Try doing - ;; (check-not-exn (imports stx)) on many files in the Racket - ;; distribution. Grammar mistakes will raise exn:fail:syntax. - (require rackunit - racket/path - "syntax.rkt") - (define (check path) - (parameterize ([current-load-relative-directory (path-only path)] - [current-namespace (make-base-namespace)]) - (file->expanded-syntax - path - (λ (stx) - (check-not-exn (λ () (imports stx)) - (format "#%require grammar handles ~v" path)))))) - (for* ([roots (in-list '(("racket.rkt" "typed") - ("core.rkt" "typed-racket") - ("main.rkt" "racket")))] - [path (in-directory - (path-only - (apply collection-file-path roots)))] - #:when (equal? #"rkt" (filename-extension path))) - (println path) - (check path))) diff --git a/elpa/racket-mode-20200417.1741/racket/instrument.rkt b/elpa/racket-mode-20200417.1741/racket/instrument.rkt deleted file mode 100644 index 370f4b79..00000000 --- a/elpa/racket-mode-20200417.1741/racket/instrument.rkt +++ /dev/null @@ -1,218 +0,0 @@ -#lang at-exp racket/base - -(require (only-in errortrace/errortrace-key - errortrace-key) - (only-in errortrace/errortrace-lib - print-error-trace - error-context-display-depth) - (only-in errortrace/stacktrace - stacktrace^ - stacktrace@ - stacktrace-imports^ - original-stx - expanded-stx) - racket/format - racket/match - racket/unit - syntax/parse - "util.rkt") - -(provide make-instrumented-eval-handler - error-context-display-depth - print-error-trace - instrumenting-enabled - test-coverage-enabled - clear-test-coverage-info! - get-test-coverage-info - profiling-enabled - clear-profile-info! - get-profile-info) - -;;; Core instrumenting - -(define instrumenting-enabled (make-parameter #f)) - -(define ((make-instrumented-eval-handler [orig-eval (current-eval)]) orig-exp) - ;; This is modeled after the one in DrRacket. - (cond - [(or (not (instrumenting-enabled)) - (compiled-expression? (syntax-or-sexpr->sexpr orig-exp))) - (orig-eval orig-exp)] - [else - (let loop ([exp (syntax-or-sexpr->syntax orig-exp)]) - (let ([top-e (expand-syntax-to-top-form exp)]) - (syntax-case top-e (begin) - [(begin expr ...) - ;; Found a `begin', so expand/eval each contained - ;; expression one at a time - (let i-loop ([exprs (syntax->list #'(expr ...))] - [last-one (list (void))]) - (cond - [(null? exprs) - (apply values last-one)] - [else - (i-loop (cdr exprs) - (call-with-values - (λ () - (call-with-continuation-prompt - (λ () (loop (car exprs))) - (default-continuation-prompt-tag) - (λ args - (apply - abort-current-continuation - (default-continuation-prompt-tag) - args)))) - list))]))] - [_else - ;; Not `begin', so proceed with normal expand and eval - (let* ([expanded-e (expand-syntax top-e)] - ;; For make-st-mark to work correctly we need to - ;; parameterize original-stx and expanded-stx. - [annotated (parameterize ([original-stx top-e] - [expanded-stx expanded-e]) - (annotate-top expanded-e - (namespace-base-phase)))]) - (warn-about-time-apply expanded-e) - (orig-eval annotated))])))])) - -(define (warn-about-time-apply stx) - (syntax-parse stx - #:datum-literals (#%app time-apply) - [(#%app time-apply . _) - (display-commented - @~a{Warning: time or time-apply used in errortrace annotated code. - For meaningful timings, use command-line racket instead!}) - #t] - [(ss ...) (for/or ([stx (in-list (syntax->list #'(ss ...)))]) - (warn-about-time-apply stx))] - [_ #f])) - - -;;; Better stack traces ("basic errortrace") - -(define base-phase - (variable-reference->module-base-phase (#%variable-reference))) - -(define (with-mark mark expr phase) - ;; This is modeled after the one in errortrace-lib. Specifically, - ;; use `make-st-mark' for its capture of the original syntax to show - ;; in the stack trace error message. - (match (make-st-mark mark phase) - [#f expr] - [loc (define phase-shift (- phase base-phase)) - (with-syntax ([expr expr] - [loc loc] - [errortrace-key errortrace-key] - [qte (syntax-shift-phase-level #'quote phase-shift)] - [wcm (syntax-shift-phase-level #'with-continuation-mark - phase-shift)]) - (syntax (wcm (qte errortrace-key) - loc - expr)))])) - -;; print-error-trace -;; -;; Just re-provide the one from errortrace-lib because (a) it works -;; and (b) the `make-st-mark' representation is intentionally not -;; documented. - - -;;; Test coverage - -(define test-coverage-enabled (make-parameter #f)) ;stacktrace-imports^ - -(define test-coverage-info (make-hasheq)) ;(hash/c syntax? mpair?). -;; This approach taken from DrR. Presumably set-mcar! is faster than a -;; box, which in turn is faster than hash-set!. The cdr cell is -;; ignored. - -(define (clear-test-coverage-info!) - (hash-clear! test-coverage-info)) - -(define (initialize-test-coverage-point expr) ;stacktrace-imports^ - (hash-set! test-coverage-info expr (mcons #f #f))) - -(define (test-covered expr) ;stacktrace-imports^ - (define v (hash-ref test-coverage-info expr #f)) - (and v (with-syntax ([v v]) - #'(#%plain-app set-mcar! v #t)))) - -(define (get-test-coverage-info) - ;; Due to macro expansion (e.g. to an `if` form), there may be - ;; multiple data points for the exact same source location. We want - ;; to logically OR them: If any are true, the source location is - ;; covered. - (define ht (make-hash)) ;; (list src pos span) => cover? - (for* ([(stx v) (in-hash test-coverage-info)] - [cover? (in-value (mcar v))] - [loc (in-value (list (syntax-source stx) - (syntax-position stx) - (syntax-span stx)))]) - (match (hash-ref ht loc 'none) - ['none (hash-set! ht loc cover?)] - [#f (when cover? (hash-set! ht loc #t))] - [#t (void)])) - (for/list ([(loc cover?) (in-hash ht)]) - (cons cover? loc))) - -;;; Profiling - -(define profile-key (gensym)) ;stacktrace-imports^ - -(define profiling-enabled (make-parameter #f)) ;stacktrace-imports^ - -(define profile-info (make-hasheq)) ;(hash/c any/c prof?) - - -(define (clear-profile-info!) - (hash-clear! profile-info)) - -(struct prof - (nest? ;guard nested calls - num ;exact-nonnegative-integer? - time ;exact-nonnegative-integer? - name ;(or/c #f symbol?) - expr) ;syntax? - #:mutable - #:transparent) - -(define (initialize-profile-point key name expr) ;stacktrace-imports^ - (hash-set! profile-info - key - (prof #f 0 0 (and (syntax? name) (syntax-e name)) expr))) - -(define (register-profile-start key) ;stacktrace-imports^ - (define p (hash-ref profile-info key)) - (set-prof-num! p (add1 (prof-num p))) - (cond [(prof-nest? p) #f] - [else (set-prof-nest?! p #t) - (current-process-milliseconds)])) - -(define (register-profile-done key start) ;stacktrace-imports^ - (void - (when start - (define p (hash-ref profile-info key)) - (set-prof-nest?! p #f) - (set-prof-time! p (+ (- (current-process-milliseconds) start) - (prof-time p)))))) - -(define (get-profile-info) - (for/list ([x (in-list (hash-values profile-info))]) - (match-define (prof nest? count msec name stx) x) - (list count msec name stx))) - - -;;; Finally, invoke the unit -(define-values/invoke-unit/infer stacktrace@) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; example - -;; (parameterize ([instrumenting-enabled #t] -;; [test-coverage-enabled #t] -;; [profiling-enabled #f] -;; [current-eval (make-instrumented-eval-handler (current-eval))]) -;; (namespace-require (string->path "/tmp/simple.rkt"))) -;; (get-test-coverage-info) -;; (get-profile-info) diff --git a/elpa/racket-mode-20200417.1741/racket/interactions.rkt b/elpa/racket-mode-20200417.1741/racket/interactions.rkt deleted file mode 100644 index bace50f9..00000000 --- a/elpa/racket-mode-20200417.1741/racket/interactions.rkt +++ /dev/null @@ -1,76 +0,0 @@ -#lang racket/base - -(require racket/match - "fresh-line.rkt" - "util.rkt") - -(provide current-interaction-chan - current-sync/yield - make-get-interaction - get-interaction) - -;; A channel to which a thread puts interactions that it reads using -;; the current-read-interaction handler (which can be set by a lang -;; from its configure-runtime, so, this should be compatible with -;; any lang, even non-sexpr langs). -;; -;; This is its own thread and channel for a couple reasons: -;; -;; - Issue #311. A consumer can use sync/timeout to avoid displaying a -;; prompt when multiple interactions are waiting. -;; -;; - Debugging. We can switch from the normal REPL to a debugger REPL, -;; without input being stuck inside a read call for the former. -;; -;; One wrinkle is we need to be careful about calling yield instead of -;; sync when the gui is active. See issue #326. -;; -;; Another wrinkle: We should handle eof-object? and exn:fail:network? -;; by doing an exit and letting the exit-handler in run.rkt cleanup -;; the TCP connection. This handles the case where e.g. the user kills -;; the REPL buffer and its process on the client/Emacs side. We used -;; to have code here in an effort support lang/datalog using eof as an -;; expression separator -- but that just causes an endless loop 100% -;; CPU spike with an abandoned tcp-input-port. So give up on that, -;; reverting issue #305. - -(define current-interaction-chan (make-parameter #f)) - -;; Call this from a REPL manager thread after current-input-port is -;; set appropriately (e.g. to a TCP input port not stdin). -(define (make-get-interaction) - (define ch (make-channel)) - (current-interaction-chan ch) - (thread read-interaction/put-channel) - ch) - -(define (read-interaction/put-channel) - (define in ((current-get-interaction-input-port))) - (define (read-interaction) - (with-handlers ([exn:fail? values]) - ((current-read-interaction) (object-name in) in))) - (match (read-interaction) - [(? eof-object?) (log-racket-mode-info "read-interaction: eof") - (exit 'get-interaction-eof)] - [(? exn:fail? e) (channel-put (current-interaction-chan) e)] ;raise in other thread - [v (channel-put (current-interaction-chan) v)]) - (read-interaction/put-channel)) - -(define current-sync/yield (make-parameter sync)) ;see issue #326 - -(define (get-interaction prompt) - (match (or (sync/timeout 0.01 (current-interaction-chan)) ;see issue #311 - (begin (display-prompt prompt) - ((current-sync/yield) (current-interaction-chan)))) - [(? exn:fail:network?) (log-racket-mode-info "get-interaction: exn:fail:network\n") - (exit 'get-interaction-exn:fail:network)] - [(? exn:fail? exn) (raise exn)] - [v v])) - -(define (display-prompt str) - (flush-output (current-error-port)) - (fresh-line) - (display str) - (display "> ") - (flush-output) - (zero-column!)) diff --git a/elpa/racket-mode-20200417.1741/racket/keywords.rkt b/elpa/racket-mode-20200417.1741/racket/keywords.rkt deleted file mode 100644 index 47b320b1..00000000 --- a/elpa/racket-mode-20200417.1741/racket/keywords.rkt +++ /dev/null @@ -1,98 +0,0 @@ -#lang typed/racket/no-check - -(require racket/syntax) - -;; Generate lists for Racket keywords, builtins, and types. -;; -;; The question of what is a "keyword" and a "builtin" is not so -;; simple in Racket: -;; -;; 1. The distinction between the two is squishy, and from one point -;; of view Racket has 1400+ "primitives" (!). -;; -;; 2. As for "builtins", there are many, many "batteries included" -;; libraries in the main distribution. Where to draw the line? -;; -;; 3. More fundamentally, Racket is a language for making languages. -;; Ultimately the only way to be 100% correct is to do something -;; "live" with namespace-mapped-symbols. But I don't see that as -;; performant for Emacs font-lock. -;; -;; Here I'm saying that: -;; -;; (a) "keywords" are syntax (only) from racket/base -;; -;; (b) "builtins" are everything else provided by #lang racket and -;; #lang typed/racket (except the capitalized Types from typed/racket -;; go into their own list). Plus for modern macros, racket/syntax and -;; a few items from syntax/parse (but not its the syntax classes, -;; because `id` and `str` are too "generic" and too likely to be user -;; program identifiers). -;; -;; Is that somewhat arbitrary? Hell yes. It's my least-worst, -;; practical idea for now. Also, IMHO it's an improvement over getting -;; pull requests to add people's favorites, a few at a time. At least -;; this way is consistent, and can be regenerated programatically as -;; Racket evolves. - -(define (symbol<=? a b) - (string<=? (symbol->string a) (symbol->string b))) - -(define (exports mod #:only-stx? [only-stx? #f]) - (define (ids phases) - (for*/list ([phase phases] - [item (cdr phase)]) - (car item))) - (define-values (vars stxs) (module->exports mod)) - (sort (remove-duplicates (append (ids stxs) - (if only-stx? '() (ids vars))) - eq?) - symbol<=?)) - -(define (subtract xs ys) - (for*/list ([x xs] #:when (not (memq x ys))) x)) - -(define base-stx (exports 'racket/base #:only-stx? #t)) - -(define rkt (append (exports 'racket) - (exports 'racket/syntax) - '(syntax-parse syntax-parser define-simple-macro))) -(define rkt+ (subtract rkt base-stx)) - -(define tr (exports 'typed/racket)) -(define tr+ (subtract tr rkt)) ;This includes Types, too - -(define Types (for/list ([x tr+] - #:when (char-upper-case? (string-ref (symbol->string x) 0))) - x)) - -;;; The final lists - -(define keywords base-stx) - -(define builtins - (sort (subtract (remove-duplicates (append rkt+ - (subtract tr+ Types)) - eq?) - base-stx) - symbol<=?)) -;; So many builtins, Emacs gives "regexp too long" error, so split into two: -(define-values (builtins1 builtins2) - (let ([mid (/ (length builtins) 2)]) - (for/fold ([xs '()] - [ys '()]) - ([x builtins] - [i (in-naturals)]) - (cond [(< i mid) (values (cons x xs) ys)] - [else (values xs (cons x ys))])))) - -(define types Types) - -(define (prn xs) - (pretty-print (map symbol->string (sort xs symbol<=?)))) - -;; Run these to print, copy and paste into racket-keywords-and-builtins.el -;; (prn types) -;; (prn keywords) -;; (prn builtins1) -;; (prn builtins2) diff --git a/elpa/racket-mode-20200417.1741/racket/logger.rkt b/elpa/racket-mode-20200417.1741/racket/logger.rkt deleted file mode 100644 index 2b001b58..00000000 --- a/elpa/racket-mode-20200417.1741/racket/logger.rkt +++ /dev/null @@ -1,93 +0,0 @@ -#lang at-exp racket/base - -(require racket/match - racket/format - racket/tcp - "elisp.rkt" - "util.rkt") - -(provide start-logger-server) - -;; "On start-up, Racket creates an initial logger that is used to -;; record events from the core run-time system. For example, an 'debug -;; event is reported for each garbage collection (see Garbage -;; Collection)." Use that; don't create new one. See issue #325. -(define global-logger (current-logger)) - -(define (start-logger-server port launch-token) - (void (thread (logger-thread port launch-token)))) - -(define ((logger-thread port launch-token)) - (define listener (tcp-listen port 4 #t "127.0.0.1")) - (let accept () - (define-values (in out) (tcp-accept listener)) - (unless (or (not launch-token) - (equal? launch-token (elisp-read in))) - (display-commented "Authorization failed; exiting") - (exit 1)) - ;; Assumption: Any network fail means the client has disconnected, - ;; therefore we should go back to waiting to accept a connection. - (with-handlers ([exn:fail:network? void]) - (let wait ([receiver never-evt]) - ;; Assumption: Our Emacs code will write complete sexprs, - ;; therefore when `in` becomes ready `read` will return - ;; without blocking. - (match (sync in receiver) - [(? input-port? in) (match (read in) - [(? eof-object?) (void)] - [v (wait (make-receiver v))])] - [(vector level message _v topic) - (parameterize ([current-output-port out]) - (display-log level topic message) - (flush-output)) - (wait receiver)]))) - (close-input-port in) - (close-output-port out) - (accept))) - -(define (display-log level topic message) - (display (label level)) - (display " ") - (display (ensure-topic-in-message topic message)) - (newline)) - -(define (ensure-topic-in-message topic message) - (match message - [(pregexp (format "^~a: " (regexp-quote (~a topic)))) - message] - [message-without-topic - (format "~a: ~a" (or topic "*") message-without-topic)])) - -(module+ test - (require rackunit) - (check-equal? (ensure-topic-in-message 'topic "topic: message") - "topic: message") - (check-equal? (ensure-topic-in-message 'topic "message") - "topic: message") - (check-equal? (ensure-topic-in-message #f "message") - "*: message")) - -(define (label level) - ;; justify - (case level - [(debug) "[ debug]"] - [(info) "[ info]"] - [(warning) "[warning]"] - [(error) "[ error]"] - [(fatal) "[ fatal]"] - [else @~a{[level]}])) - -(define (make-receiver alist) - (apply make-log-receiver (list* global-logger - (alist->spec alist)))) - -;; Convert from ([logger . level] ...) alist to the format used by -;; make-log-receiver: (level logger ... ... default-level). In the -;; alist, treat the logger '* as the default level. -(define (alist->spec xs) ;(Listof (Pairof Symbol Symbol)) -> (Listof Symbol) - (for/fold ([spec '()]) - ([x (in-list xs)]) - (append spec - (match x - [(cons '* level) (list level)] - [(cons logger level) (list level logger)])))) diff --git a/elpa/racket-mode-20200417.1741/racket/main.rkt b/elpa/racket-mode-20200417.1741/racket/main.rkt deleted file mode 100644 index a540921f..00000000 --- a/elpa/racket-mode-20200417.1741/racket/main.rkt +++ /dev/null @@ -1,35 +0,0 @@ -#lang racket/base - -(require racket/match - racket/port - version/utils - "logger.rkt" - "command-server.rkt" - "repl.rkt") - -(module+ main - (define expected-version "6.9") - (define actual-version (version)) - (unless (version<=? expected-version actual-version) - (error 'racket-mode "needs at least Racket ~a but you have ~a" - expected-version - actual-version)) - - (define-values (command-port launch-token) - (match (current-command-line-arguments) - [(vector port token) - (values (string->number port) token)] - [v - (eprintf "Bad command-line arguments: ~v\n" v) - (exit)])) - - ;; Save original current-{input output}-port to give to - ;; command-server-loop for command I/O. - (let ([stdin (current-input-port)] - [stdout (current-output-port)]) - ;; Set no-ops so e.g. rando print can't bork the command I/O. - (parameterize ([current-input-port (open-input-bytes #"")] - [current-output-port (open-output-nowhere)]) - (start-repl-session-server command-port launch-token) - (start-logger-server (add1 command-port) launch-token) - (command-server-loop stdin stdout)))) diff --git a/elpa/racket-mode-20200417.1741/racket/mod.rkt b/elpa/racket-mode-20200417.1741/racket/mod.rkt deleted file mode 100644 index 16db1d2f..00000000 --- a/elpa/racket-mode-20200417.1741/racket/mod.rkt +++ /dev/null @@ -1,151 +0,0 @@ -#lang at-exp racket/base - -(require (for-syntax racket/base - syntax/parse) - racket/contract/base - racket/contract/region - racket/format - racket/match - racket/string - syntax/location - "util.rkt") - -(provide relative-module-path? - (struct-out mod) - ->mod/existing - maybe-mod->dir/file/rmp - maybe-mod->prompt-string - maybe-warn-about-submodules) - -(module+ test - (require rackunit)) - -;; The subset of module-path? with a relative filename -(define (relative-module-path? v) - (define (rel-path? v) ;real predicate taking any/c, unlike relative-path? - (and (path-string? v) (relative-path? v))) - (and (module-path? v) - (match v - [(? rel-path?) #t] - [(list 'submod (? rel-path?) (? symbol?) ..1) #t] - [_ #f]))) - -(module+ test - (check-true (relative-module-path? "f.rkt")) - (check-true (relative-module-path? '(submod "f.rkt" a b))) - (check-false (relative-module-path? "/path/to/f.rkt")) - (check-false (relative-module-path? '(submod "/path/to/f.rkt" a b))) - (check-false (relative-module-path? 'racket/base)) - (check-false (relative-module-path? '(submod 'racket/base a b)))) - -(define-struct/contract mod - ([dir absolute-path?] ;# - [file relative-path?] ;# - [rmp relative-module-path?]) ;# or '(submod bar) - #:transparent) - -(define/contract (->mod/simple v) - (-> any/c (or/c #f mod?)) - (match v - [(? symbol? s) (->mod/simple (~a s))] ;treat 'file.rkt as "file.rkt" - [(or (? path? ap) (? path-string? ap)) - (let*-values ([(dir file _) (split-path (simplify-path ap))] - [(dir) (match dir ['relative (current-directory)][dir dir])]) - (mod dir file file))] - [_ #f])) - -(define/contract (->mod v) - (-> any/c (or/c #f mod?)) - (define-match-expander mm - (syntax-parser - [(_ dir:id file:id rmp:id) - #'(app ->mod/simple (mod dir file rmp))])) - (match v - [(list 'submod - (mm d f _) (? symbol? ss) ..1) (mod d f (list* 'submod f ss))] - [(list (mm d f _) (? symbol? ss) ..1) (mod d f (list* 'submod f ss))] - [(list (mm d f mp)) (mod d f mp)] - [(mm d f mp) (mod d f mp)] - [_ #f])) - -(module+ test - (define-syntax-rule (= x y) (check-equal? x y)) - (define f.rkt (string->path "f.rkt")) - ;; rel path - (let ([dir (current-directory)]) - (= (->mod "f.rkt") (mod dir f.rkt f.rkt)) - (= (->mod 'f.rkt) (mod dir f.rkt f.rkt)) - (= (->mod '(submod "f.rkt" a b)) (mod dir f.rkt `(submod ,f.rkt a b))) - (= (->mod '(submod f.rkt a b)) (mod dir f.rkt `(submod ,f.rkt a b))) - (= (->mod '("f.rkt" a b)) (mod dir f.rkt `(submod ,f.rkt a b))) - (= (->mod '(f.rkt a b)) (mod dir f.rkt `(submod ,f.rkt a b))) - (= (->mod '("f.rkt")) (mod dir f.rkt f.rkt)) - (= (->mod '(f.rkt)) (mod dir f.rkt f.rkt))) - ;; abs path - (let ([dir (string->path "/p/t/")]) - (= (->mod "/p/t/f.rkt") (mod dir f.rkt f.rkt)) - (= (->mod '/p/t/f.rkt) (mod dir f.rkt f.rkt)) - (= (->mod '(submod "/p/t/f.rkt" a b)) (mod dir f.rkt `(submod ,f.rkt a b))) - (= (->mod '(submod /p/t/f.rkt a b)) (mod dir f.rkt `(submod ,f.rkt a b))) - (= (->mod '("/p/t/f.rkt" a b)) (mod dir f.rkt `(submod ,f.rkt a b))) - (= (->mod '(/p/t/f.rkt a b)) (mod dir f.rkt `(submod ,f.rkt a b))) - (= (->mod '("/p/t/f.rkt")) (mod dir f.rkt f.rkt)) - (= (->mod '(/p/t/f.rkt)) (mod dir f.rkt f.rkt))) - ;; nonsense input => #f - (= (->mod 42) #f) - (= (->mod '(42 'bar)) #f) - (= (->mod '(submod 42 'bar)) #f) - (= (->mod '(submod (submod "f.rkt" foo) bar)) #f)) - -(define/contract (->mod/existing v) - (-> any/c (or/c #f mod?)) - (match (->mod v) - [(and v (mod dir file mp)) - (define path (build-path dir file)) - (cond [(file-exists? path) v] - [else (display-commented (format "~a does not exist" path)) - #f])] - [_ #f])) - -(define/contract (maybe-mod->dir/file/rmp maybe-mod) - (-> (or/c #f mod?) (values absolute-path? - (or/c #f relative-path?) - (or/c #f relative-module-path?))) - (match maybe-mod - [(mod d f mp) (values d f mp)] - [#f (values (current-directory) #f #f)])) - -(define/contract (maybe-mod->prompt-string m) - (-> (or/c #f mod?) string?) - (match m - [(mod _ _ (? path? file)) (~a file)] - [(mod _ _ (list* 'submod xs)) (string-join (map ~a xs) "/")] - [#f ""])) - -;; Check whether Racket is new enough (newer than 6.2.1) that -;; module->namespace works with module+ and (module* _ #f __) -;; forms when errortrace is enabled. -(module+ check - (define x 42)) -(define (can-enter-module+-namespace?) - (define mp (quote-module-path check)) - (dynamic-require mp #f) - (with-handlers ([exn:fail? (λ _ #f)]) - (eval 'x (module->namespace mp)) - #t)) - -(define warned? #f) -(define/contract (maybe-warn-about-submodules mp context) - (-> (or/c #f module-path?) symbol? any) - (unless (or warned? - (not (pair? mp)) ;not submodule - (memq context '(low medium)) - (can-enter-module+-namespace?)) - (set! warned? #t) - (display-commented - @~a{Note: @~v[@mp] will be evaluated. - However your Racket version is old. You will be unable to - use the REPL to examine definitions in the body of a module+ - or (module* _ #f ___) form when errortrace is enabled. Either - upgrade Racket, or, set the Emacs variable racket-error-context - to 'low or 'medium.}))) diff --git a/elpa/racket-mode-20200417.1741/racket/print.rkt b/elpa/racket-mode-20200417.1741/racket/print.rkt deleted file mode 100644 index 562a169d..00000000 --- a/elpa/racket-mode-20200417.1741/racket/print.rkt +++ /dev/null @@ -1,41 +0,0 @@ -#lang racket/base - -(require racket/pretty - racket/runtime-path - "image.rkt") - -(provide set-print-parameters) - -(define (set-print-parameters pretty-print?) - (cond [pretty-print? - (current-print pretty-print-handler) - (pretty-print-print-hook (make-pretty-print-print-hook)) - (pretty-print-size-hook (make-pretty-print-size-hook))] - [else - (current-print plain-print-handler)]) - (print-syntax-width +inf.0)) - -(define (plain-print-handler v) - (void (unless (void? v) - (print (convert-image v)) - (newline)))) - -;; We have nothing valuable to say about (a) pretty-print-columns as -;; it relates to Emacs window width or (b) the width in "characters" -;; of any particular image. Even so, we must say something. We must -;; supply a pretty-print-size-hook that returns _some_ integer width -;; -- else our pretty-print-hook won't be called. So simply return -;; pretty-print-columns. This means that e.g. a list of images will be -;; printed on multiple lines even if they could fit on one line. -;; That's less-worse than trying to be "clever"; see issue #402. -(define (make-pretty-print-size-hook) - (let ([orig (pretty-print-size-hook)]) - (λ (value display? port) - (cond [(convert-image? value) (pretty-print-columns)] - [else (orig value display? port)])))) - -(define (make-pretty-print-print-hook) - (let ([orig (pretty-print-print-hook)]) - (λ (value display? port) - (cond [(convert-image? value) (print (convert-image value) port)] - [else (orig value display? port)])))) diff --git a/elpa/racket-mode-20200417.1741/racket/repl-session.rkt b/elpa/racket-mode-20200417.1741/racket/repl-session.rkt deleted file mode 100644 index 6e940f71..00000000 --- a/elpa/racket-mode-20200417.1741/racket/repl-session.rkt +++ /dev/null @@ -1,86 +0,0 @@ -#lang at-exp racket/base - -(require racket/format - racket/match - "interactions.rkt" - "util.rkt") - -(provide next-session-id! - call-with-session-context - current-session-id - current-repl-msg-chan - current-session-maybe-mod - current-session-submit-pred - (struct-out session) - get-session - set-session! - remove-session!) - -;;; REPL session "housekeeping" - -;; Session IDs are strings based on a number -(define next-session-number 0) - -(define (next-session-id!) - (format "repl-session-~a" - (begin0 next-session-number - (inc! next-session-number)))) - -;; Each REPL session has an entry in this hash-table. -(define sessions (make-hash)) ;string? => (or/c base-session? session?) - -;; Before module->namespace has returned, this is what we have in the -;; `sessions` hash-table. Most importantly, knowing the repl thread -;; allows us to break-thread it even while module->namespace is still -;; running; see the command break-repl-thread, below. -(struct session - (thread ;thread? the repl manager thread - repl-msg-chan ;channel? - interaction-chan ;channel? - maybe-mod ;(or/c #f mod?) - namespace ;namespace? - submit-pred) ;(or/c #f drracket:submit-predicate/c) - #:transparent) - -(define current-session-id (make-parameter #f)) -(define current-repl-msg-chan (make-parameter #f)) -;current-interaction-chan defined in "interactions.rkt" -(define current-session-maybe-mod (make-parameter #f)) -(define current-session-submit-pred (make-parameter #f)) - -;; A way to parameterize e.g. commands that need to work with a -;; specific REPL session. Called from e.g. a command-server thread. -(define (call-with-session-context sid proc . args) - (match (get-session sid) - [(? session? s) - (log-racket-mode-debug @~a{(call-with-session-context @~v[sid] @~v[proc] @~v[args]) => @~v[s]}) - (parameterize ([current-session-id sid] - [current-repl-msg-chan (session-repl-msg-chan s)] - [current-interaction-chan (session-interaction-chan s)] - [current-session-maybe-mod (session-maybe-mod s)] - [current-namespace (session-namespace s)] - [current-session-submit-pred (session-submit-pred s)]) - (apply proc args))] - [_ - (if (equal? sid '()) - (log-racket-mode-debug @~a{(call-with-session-context @~v[sid] @~v[proc] @~v[args]): no specific session}) - (log-racket-mode-warning @~a{(call-with-session-context @~v[sid] @~v[proc] @~v[args]): @~v[sid] not found in @~v[sessions]})) - (apply proc args)])) - -(define (get-session sid) - (hash-ref sessions sid #f)) - -(define (set-session! sid maybe-mod repl-submit-predicate) - (hash-set! sessions - sid - (session (current-thread) - (current-repl-msg-chan) - (current-interaction-chan) - maybe-mod - (current-namespace) - repl-submit-predicate)) - (log-racket-mode-debug @~a{(set-session! @~v[sid] @~v[maybe-mod] @~v[repl-submit-predicate]) => sessions: @~v[sessions]})) - -(define (remove-session! sid) - (hash-remove! sessions sid) - (log-racket-mode-debug @~a{(remove-session! @~v[sid]) => sessions: @~v[sessions]})) diff --git a/elpa/racket-mode-20200417.1741/racket/repl.rkt b/elpa/racket-mode-20200417.1741/racket/repl.rkt deleted file mode 100644 index 952a0c6b..00000000 --- a/elpa/racket-mode-20200417.1741/racket/repl.rkt +++ /dev/null @@ -1,387 +0,0 @@ -#lang racket/base -;; Do NOT use `at-exp` in this file! See issue #290. - -(require racket/contract - racket/match - racket/set - racket/tcp - (only-in "debug.rkt" make-debug-eval-handler next-break) - "elisp.rkt" - "error.rkt" - "gui.rkt" - "instrument.rkt" - "interactions.rkt" - "mod.rkt" - "print.rkt" - "repl-session.rkt" - (only-in "syntax.rkt" with-expanded-syntax-caching-evaluator) - "util.rkt") - -(provide start-repl-session-server - run - break-repl-thread) - -;;; Messages to each repl manager thread - -;; Definitions for context-level member of run-config struct - -(define profile/coverage-levels - ;; "sibling" levels that need instrument plus... - '(profile ;profiling-enabled - coverage)) ;execute-counts-enabled - -(define instrument-levels - `(high ;compile-context-preservation-enabled #t + instrument - ,@profile/coverage-levels)) - -(define context-levels - `(low ;compile-context-preservation-enabled #f - medium ;compile-context-preservation-enabled #t - ,@instrument-levels - debug)) - -(define (context-level? v) (memq? v context-levels)) -(define (instrument-level? v) (memq? v instrument-levels)) -(define (profile/coverage-level? v) (memq? v profile/coverage-levels)) -(define (debug-level? v) (eq? v 'debug)) - -;; The message structs - -(define-struct/contract repl-manager-thread-message ()) - -(define-struct/contract (load-gui repl-manager-thread-message) - ([in-repl? boolean?])) - -(define-struct/contract (run-config repl-manager-thread-message) - ([maybe-mod (or/c #f mod?)] - [memory-limit exact-nonnegative-integer?] ;0 = no limit - [pretty-print? boolean?] - [context-level context-level?] - [cmd-line-args (vectorof string?)] - [debug-files (set/c path?)] - [ready-thunk (-> any/c)])) - -(define (initial-run-config ready-thunk) - (run-config #f ;maybe-mod - 0 ;memory-limit - #f ;pretty-print? - 'low ;context-level - #() ;cmd-line-args - (set) ;debug-files - ready-thunk)) - -;; Command. Called from a command-server thread -(define/contract (break-repl-thread sid kind) - (-> any/c (or/c 'break 'hang-up 'terminate) any) - (match (get-session sid) - [(struct* session ([thread t])) - (log-racket-mode-debug "break-repl-thread: ~v ~v" sid kind) - (break-thread t (case kind [(hang-up terminate) kind] [else #f]))] - [_ (log-racket-mode-error "break-repl-thread: ~v not in `sessions`" sid)])) - -;; Command. Called from a command-server thread -(define/contract (run what mem pp ctx args dbgs) - (-> list? number? elisp-bool/c context-level? list? (listof path-string?) - list?) - (define ready-channel (make-channel)) - (channel-put (current-repl-msg-chan) - (run-config (->mod/existing what) - mem - (as-racket-bool pp) - ctx - (list->vector args) - (list->set (map string->path dbgs)) - (λ () (channel-put ready-channel what)))) - ;; Waiting for this allows the command response to be used as the - ;; all-clear for additional commands that need the module load to be - ;; done and entering a REPL for that module. For example, to compose - ;; run with get-profile or get-uncovered. - (sync ready-channel)) - -;;; REPL session server - -(define (start-repl-session-server port launch-token) - (thread (listener-thread-thunk port launch-token))) - -(define ((listener-thread-thunk port launch-token)) - (define listener (tcp-listen port 4 #t "127.0.0.1")) - (let accept-a-connection () - (define custodian (make-custodian)) - (parameterize ([current-custodian custodian]) - ;; `exit` in a REPL should terminate that REPL session -- not - ;; the entire back end server. Also, this is opportunity to - ;; remove the session from `sessions` hash table. - (define (our-exit-handler code) - (log-racket-mode-info "(our-exit-handler ~v) ~v" - code (current-session-id)) - (when (current-session-id) ;might exit before session created - (remove-session! (current-session-id))) - (custodian-shutdown-all custodian)) - (parameterize ([exit-handler our-exit-handler]) - (define-values (in out) (tcp-accept listener)) - (parameterize ([current-input-port in] - [current-output-port out] - [current-error-port out]) - (for ([p (in-list (list in out))]) - (file-stream-buffer-mode p 'none)) ;would 'line be sufficient? - ;; Immediately after connecting, the client must send us - ;; exactly the same launch token value that it gave us as a - ;; command line argument when it started us. Else we close - ;; the connection. See issue #327. - (define supplied-token (elisp-read in)) - (unless (equal? launch-token supplied-token) - (log-racket-mode-fatal "Authorization failed: ~v" - supplied-token) - (exit 'racket-mode-repl-auth-failure)) - (thread repl-manager-thread-thunk)))) - (accept-a-connection))) - -(define (repl-manager-thread-thunk) - (define session-id (next-session-id!)) - (log-racket-mode-info "start ~v" session-id) - (parameterize* ([error-display-handler our-error-display-handler] - [current-session-id session-id] ;before make-get-interaction - [current-repl-msg-chan (make-channel)] - [current-interaction-chan (make-get-interaction)]) - (do-run - (initial-run-config - (λ () - ;; Write a sexpr containing the session-id, which the client - ;; can use in certain commands that need to run in the context - ;; of a specific REPL. We wait to do so until this ready-thunk - ;; to ensure the `sessions` hash table has this session before - ;; any subsequent commands use call-with-session-context. - (elisp-writeln `(ok ,session-id) (current-output-port)) - (flush-output) - (display-commented (string-append "\n" (banner)))))))) - -(define (do-run cfg) ;run-config? -> void? - (match-define (run-config maybe-mod - mem-limit - pretty-print? - context-level - cmd-line-args - debug-files - ready-thunk) cfg) - (define-values (dir file mod-path) (maybe-mod->dir/file/rmp maybe-mod)) - ;; Always set current-directory and current-load-relative-directory - ;; to match the source file. - (current-directory dir) - (current-load-relative-directory dir) - ;; Make src-loc->string provide full pathnames - (show-full-path-in-errors) - ;; Custodian for the REPL. - (define repl-cust (make-custodian)) - (when (< 0 mem-limit) - (custodian-limit-memory repl-cust - (inexact->exact (round (* 1024 1024 mem-limit))) - repl-cust)) - ;; If racket/gui/base isn't loaded, the current-eventspace parameter - ;; doesn't exist, so make a "dummy" parameter of that name. - (define current-eventspace (txt/gui (make-parameter #f) current-eventspace)) - - ;; Create REPL thread - (define repl-thread - (parameterize* ;; Use `parameterize*` because the order matters. - (;; FIRST: current-custodian and current-namespace, so in - ;; effect for later parameterizations. - [current-custodian repl-cust] - [current-namespace (if mod-path - ((txt/gui make-base-empty-namespace - make-gui-empty-namespace)) - ((txt/gui make-base-namespace - make-gui-namespace)))] - ;; OTHERS: - [compile-enforce-module-constants #f] - [compile-context-preservation-enabled (not (eq? context-level 'low))] - [current-eval - (cond [(debug-level? context-level) (make-debug-eval-handler debug-files)] - [(instrument-level? context-level)(make-instrumented-eval-handler)] - [else (current-eval)])] - [instrumenting-enabled (instrument-level? context-level)] - [profiling-enabled (eq? context-level 'profile)] - [test-coverage-enabled (eq? context-level 'coverage)] - [current-sync/yield (txt/gui sync yield)] - ;; LAST: `current-eventspace` because `make-eventspace` - ;; creates an event handler thread -- now. We want that - ;; thread to inherit the parameterizations above. (Otherwise - ;; in the non-gui case, we call `thread` below in the body of - ;; the parameterize* form, so that's fine.) - [current-eventspace ((txt/gui void make-eventspace))]) - ;; repl-thunk will either be used as the thunk for a thread we - ;; make directly -- or, when racket/gui/base is instantiated, - ;; installed as the current eventspace's event queue via - ;; queue-callback, running under (eventspace-handler-thread - ;; (current-eventspace)). - (define (repl-thunk) - ;; 0. Command line arguments - (current-command-line-arguments cmd-line-args) - ;; 1. Set print hooks and output handlers - (set-print-parameters pretty-print?) - (set-output-handlers) - ;; 2. Record as much info about our session as we can, before - ;; possibly entering module->namespace. - (set-session! (current-session-id) maybe-mod #f) - ;; 3. If module, require and enter its namespace, etc. - (with-expanded-syntax-caching-evaluator maybe-mod - (when (and maybe-mod mod-path) - (parameterize ([current-module-name-resolver module-name-resolver-for-run]) - ;; When exn:fail during module load, re-run. - (define (load-exn-handler exn) - (define new-mod - (match mod-path - [`(submod ,(== file) main) - (log-racket-mode-debug "~v not found, retry as ~v" - mod-path (build-path dir file)) - (->mod/existing (build-path dir file))] - ;; Else display exn and retry as "empty" REPL. - [_ - (display-exn exn) - #f])) - (channel-put (current-repl-msg-chan) - (struct-copy run-config cfg [maybe-mod new-mod])) - (sync never-evt)) ;manager thread will shutdown custodian - (with-handlers ([exn? load-exn-handler]) - (maybe-configure-runtime mod-path) ;FIRST: see #281 - (current-namespace - (parameterize ([current-load-relative-directory dir] - [current-directory dir]) - (dynamic-require mod-path #f) - (module->namespace mod-path))) - (maybe-warn-about-submodules mod-path context-level) - (check-#%top-interaction))))) - ;; 4. Update information about our session -- now that - ;; current-namespace is possibly updated, and, it is OK to - ;; call get-repl-submit-predicate. - (set-session! (current-session-id) - maybe-mod - (get-repl-submit-predicate maybe-mod)) - ;; 5. Now that the program has run, and `sessions` is updated, - ;; call the ready-thunk. On REPL startup this lets us wait - ;; sending the repl-session-id until `sessions` is updated. - ;; And for subsequent run commands, this lets us it wait to - ;; send a response. - (ready-thunk) - ;; 6. read-eval-print-loop - (parameterize ([current-prompt-read (make-prompt-read maybe-mod)] - [current-module-name-resolver module-name-resolver-for-repl]) - ;; Note that read-eval-print-loop catches all non-break - ;; exceptions. - (read-eval-print-loop))) - - ;; Main thread: Run repl-thunk on a plain thread, or, on the - ;; eventspace thread via queue-callback. Return the thread. - (define t/v ((txt/gui thread queue-callback ) repl-thunk)) - (define thd ((txt/gui (λ _ t/v) eventspace-handler-thread) (current-eventspace))) - thd)) - - ;; Main thread: Wait for message from REPL thread on channel. Also - ;; catch breaks, in which case we (a) break the REPL thread so - ;; display-exn runs there, and (b) continue from the break instead - ;; of re-running so that the REPL environment is maintained. - (define message - (call-with-exception-handler - (match-lambda - [(and (or (? exn:break:terminate?) (? exn:break:hang-up?)) e) e] - [(exn:break _msg _marks continue) (break-thread repl-thread) (continue)] - [e e]) - (λ () (sync (current-repl-msg-chan))))) - (match context-level - ['profile (clear-profile-info!)] - ['coverage (clear-test-coverage-info!)] - [_ (void)]) - (custodian-shutdown-all repl-cust) - (newline) ;; FIXME: Move this to racket-mode.el instead? - (match message - [(? run-config? new-cfg) (do-run new-cfg)] - [(load-gui repl?) (require-gui repl?) (do-run cfg)])) - -(define/contract ((make-prompt-read m)) - (-> (or/c #f mod?) (-> any)) - (begin0 (get-interaction (maybe-mod->prompt-string m)) - ;; let debug-instrumented code break again - (next-break 'all))) - -;; -(define drracket:submit-predicate/c (-> input-port? boolean? boolean?)) -(define/contract (get-repl-submit-predicate m) - (-> (or/c #f mod?) (or/c #f drracket:submit-predicate/c)) - (define-values (dir file rmp) (maybe-mod->dir/file/rmp m)) - (define path (and dir file (build-path dir file))) - (and path rmp - (or (with-handlers ([exn:fail? (λ _ #f)]) - (match (with-input-from-file (build-path dir file) read-language) - [(? procedure? get-info) - (match (get-info 'drracket:submit-predicate #f) - [#f #f] - [v v])] - [_ #f])) - (with-handlers ([exn:fail? (λ _ #f)]) - (match (module->language-info rmp #t) - [(vector mp name val) - (define get-info ((dynamic-require mp name) val)) - (get-info 'drracket:submit-predicate #f)] - [_ #f]))))) - -(define (maybe-configure-runtime mod-path) - ;; Do configure-runtime when available. - ;; Important for langs like Typed Racket. - (with-handlers ([exn:fail? void]) - (match (module->language-info mod-path #t) - [(vector mp name val) - (define get-info ((dynamic-require mp name) val)) - (define configs (get-info 'configure-runtime '())) - (for ([config (in-list configs)]) - (match-let ([(vector mp name val) config]) - ((dynamic-require mp name) val)))] - [_ (void)]) - (define cr-submod `(submod - ,@(match mod-path - [(list 'submod sub-paths ...) sub-paths] - [_ (list mod-path)]) - configure-runtime)) - (when (module-declared? cr-submod) - (dynamic-require cr-submod #f)))) - -(define (check-#%top-interaction) - ;; Check that the lang defines #%top-interaction - (unless (memq '#%top-interaction (namespace-mapped-symbols)) - (display-commented - "Because the language used by this module provides no #%top-interaction\n you will be unable to evaluate expressions here in the REPL."))) - -;; Catch attempt to load racket/gui/base for the first time. -(define (make-module-name-resolver repl?) - (let ([orig-resolver (current-module-name-resolver)]) - (define (resolve mp rmp stx load?) - (when (and load? (memq mp '(racket/gui/base - racket/gui/dynamic - scheme/gui/base))) - (unless (gui-required?) - (channel-put (current-repl-msg-chan) - (load-gui repl?)) - (sync never-evt))) - (orig-resolver mp rmp stx load?)) - (case-lambda - [(rmp ns) (orig-resolver rmp ns)] - [(mp rmp stx) (resolve mp rmp stx #t)] - [(mp rmp stx load?) (resolve mp rmp stx load?)]))) -(define module-name-resolver-for-run (make-module-name-resolver #f)) -(define module-name-resolver-for-repl (make-module-name-resolver #t)) - -;;; Output handlers; see issues #381 #397 - -;; These are plain procedures not parameters. Therefore to reset them -;; for each user program run, we must call them each time with the -;; original value. What original value? It suffices to use the value -;; in effect when this back end starts, i.e. the default -;; port-xxx-handler. - -(define the-default-output-handlers - (for/hash ([get/set (in-list (list port-write-handler - port-display-handler - port-print-handler))]) - (values get/set (get/set (current-output-port))))) - -(define (set-output-handlers) - (for ([(get/set v) (in-hash the-default-output-handlers)]) - (get/set (current-output-port) v))) diff --git a/elpa/racket-mode-20200417.1741/racket/scribble.rkt b/elpa/racket-mode-20200417.1741/racket/scribble.rkt deleted file mode 100644 index f5b19984..00000000 --- a/elpa/racket-mode-20200417.1741/racket/scribble.rkt +++ /dev/null @@ -1,241 +0,0 @@ -#lang racket/base - -(require (only-in html - read-html-as-xml) - racket/contract - racket/file - racket/format - racket/function - racket/match - racket/path - racket/promise - racket/string - (only-in scribble/core - tag?) - scribble/xref - scribble/blueboxes - setup/xref - (only-in xml - xml->xexpr - element - xexpr->string)) - -(provide binding->path+anchor - path+anchor->html - identifier->bluebox) - -(module+ test - (require rackunit)) - -(define xref (delay/thread (load-collections-xref))) - -(define/contract (binding->path+anchor stx) - (-> identifier? (or/c #f (cons/c path-string? (or/c #f string?)))) - (let* ([xref (force xref)] - [tag (xref-binding->definition-tag xref stx 0)] - [p+a (and tag (tag->path+anchor xref tag))]) - p+a)) - -(define (tag->path+anchor xref tag) - (define-values (path anchor) (xref-tag->path+anchor xref tag)) - (and path anchor (cons path anchor))) - -;;; Scribble docs as HTML suitable for Emacs' shr renderer - -(define/contract (path+anchor->html path+anchor) - (-> (or/c #f (cons/c path-string? (or/c #f string?))) - (or/c #f string?)) - (match path+anchor - [(cons path anchor) - (let* ([xexpr (get-raw-xexpr path anchor)] - [xexpr (and xexpr (massage-xexpr path xexpr))] - [html (and xexpr (xexpr->string xexpr))]) - html)] - [_ #f])) - -(define (get-raw-xexpr path anchor) - (define (heading-element? x) - (match x - [(cons (or 'h1 'h2 'h3 'h4 'h5 'h6) _) #t] - [_ #f])) - (match (let loop ([es (main-elements (html-file->xexpr path))]) - (match es - [(list) (list)] - [(cons (? (curryr anchored-element anchor) this) more) - ;; Accumulate until another intrapara with an anchor, or - ;; until a heading element indicating a new subsection. - (cons this - (let get ([es more]) - (match es - [(list) (list)] - [(cons (? heading-element?) _) (list)] ;stop - [(cons (? anchored-element) _) (list)] ;stop - [(cons this more) (cons this (get more))])))] - [(cons _ more) (loop more)])) - [(list) #f] - [xs `(div () ,@xs)])) - -(module+ test - (test-case "procedure" - (check-not-false (path+anchor->html (binding->path+anchor #'print)))) - (test-case "syntax" - (check-not-false (path+anchor->html (binding->path+anchor #'match)))) - (test-case "parameter" - (check-not-false (path+anchor->html (binding->path+anchor #'current-eval)))) - (test-case "indented sub-item" - (check-not-false (path+anchor->html (binding->path+anchor #'struct-out)))) - (test-case "deftogether" - (test-case "1 of 2" - (check-not-false (path+anchor->html (binding->path+anchor #'lambda)))) - (test-case "2 of 2" - (check-not-false (path+anchor->html (binding->path+anchor #'λ))))) - (check-not-false (path+anchor->html (binding->path+anchor #'xref-binding->definition-tag)))) - -(define (main-elements x) - (match x - [`(x () "\n" - (html () - (head ,_ . ,_) - (body ,_ - (div ([class "tocset"]) . ,_) - (div ([class "maincolumn"]) - (div ([class "main"]) . ,es)) - . ,_))) - es] - [_ '()])) - -;; anchored-element : xexpr? (or/c #f string?) -> (or/c #f string?) -;; When `name` is #f, return the first anchor having any name. -;; Otherwise, return the first anchor having `name`. -(define (anchored-element x [name #f]) - (define (anchor xs) - (for/or ([x (in-list xs)]) - (match x - [`(a ((name ,a)) . ,_) (or (not name) (equal? name a))] - [`(,tag ,attrs . ,es) (anchor es)] - [_ #f]))) - (match x - [`(div ((class "SIntrapara")) - (blockquote ((class "SVInsetFlow")) - (table ,(list-no-order `(class "boxed RBoxed") _ ...) - . ,es))) - ;; That's likely sufficient to say we're in HTML resulting from a - ;; Scribble defXXX form. From here on out, there can be some - ;; variation, so just look recursively for anchors within `es'. - (anchor es)] - [`(blockquote ((class "leftindent")) - (p ()) - (div ((class "SIntrapara")) - (blockquote ((class "SVInsetFlow")) - (table ,(list-no-order `(class "boxed RBoxed") _ ...) - . ,es))) - ,_ ...) - (anchor es)] - [_ #f])) - -(define (html-file->xexpr pathstr) - (xml->xexpr - (element #f #f 'x '() - (read-html-as-xml (open-input-string (file->string pathstr)))))) - -;; This is a big ole pile of poo, attempting to simplify and massage -;; the HTML so that Emacs shr renders it in the least-worst way. -;; -;; Note: Emacs shr renderer removes leading spaces and nbsp from -;; elements -- which messes up the alignment of s-expressions -;; including contracts. But actually, the best place to address that -;; is up in Elisp, not here -- replace   in the HTML with some -;; temporary character, then replace that character in the shr output. -(define (massage-xexpr html-pathname xexpr) - ;; In addition to the main x-expression value handled by `walk`, we - ;; have a couple annoying side values. Rather than "thread" them - ;; through `walk` as additional values -- literally or using some - ;; monadic hand-wavery -- I'm just going to set! them. Won't even - ;; try to hide my sin by using make-parameter. I hereby accept the - ;; deduction of Functional Experience Points. - (define kind-xexprs '()) - (define provide-xexprs '()) - (define (walk x) - (match x - ;; The "Provided" title/tooltip. Set aside for later. - [`(span ([title ,(and s (pregexp "^Provided from:"))]) . ,xs) - (set! provide-xexprs (list s)) - `(span () ,@(map walk xs))] - ;; The HTML for the "kind" (e.g. procedure or syntax or - ;; parameter) comes before the rest of the bluebox. Simple HTML - ;; renderers like shr don't handle this well. Set aside for - ;; later. - [`(div ([class "RBackgroundLabel SIEHidden"]) - (div ([class "RBackgroundLabelInner"]) (p () . ,xs))) - (set! kind-xexprs `((i () ,@xs))) - ""] - ;; Bold RktValDef, which is the name of the thing. - [`(a ([class ,(pregexp "RktValDef|RktStxDef")] . ,_) . ,xs) - `(b () ,@(map walk xs))] - ;; Kill links. (Often these won't work anyway -- e.g. due to - ;; problems with "open" and file: links on macOS.) - [`(a ,_ . ,xs) - `(span () ,@(map walk xs))] - ;; Kill "see also" notes, since they're N/A w/o links. - [`(div ([class "SIntrapara"]) - (blockquote ([class "refpara"]) . ,_)) - `(span ())] - ;; Delete some things that produce unwanted blank lines and/or - ;; indents in simple rendering engines like Emacs' shr. - [`(blockquote ([class ,(or "SVInsetFlow" "SubFlow")]) . ,xs) - `(span () ,@(map walk xs))] - [`(p ([class "RForeground"]) . ,xs) - `(div () ,@(map walk xs))] - ;; Let's italicize all RktXXX classes except RktPn. - [`(span ([class ,(pregexp "^Rkt(?!Pn)")]) . ,xs) - `(i () ,@(map walk xs))] - ;; Image sources need path prepended. - [`(img ,(list-no-order `[src ,src] more ...)) - `(img ([src ,(~a "file://" (path-only html-pathname) src)] . ,more))] - ;; Misc element: Just walk kids. - [`(,tag ,attrs . ,xs) - `(,tag ,attrs ,@(map walk xs))] - [x x])) - (match (walk xexpr) - [`(div () . ,xs) - (define hs - (match* [kind-xexprs provide-xexprs] - [[`() `()] `()] - [[ks ps] `((span () ,@ks 'nbsp ,@ps))])) - `(div () ,@hs ,@xs)])) - -(module+ test - (check-equal? ;issue 410 - (massage-xexpr (string->path "/path/to/file.html") - `(div () - (img ([x "x"] [src "foo.png"] [y "y"])))) - `(div () - (img ([src "file:///path/to/foo.png"] [x "x"] [y "y"]))))) - -;;; Blueboxes - -(define bluebox-cache (delay/thread (make-blueboxes-cache #t))) - -(define/contract (identifier->bluebox stx) - (-> identifier? (or/c #f string?)) - (match (xref-binding->definition-tag (force xref) stx 0) - [(? tag? tag) - (match (fetch-blueboxes-strs tag #:blueboxes-cache (force bluebox-cache)) - [(list* _kind strs) - (string-replace (string-join strs "\n") - "\u00A0" - " ")] - [_ #f])] - [_ #f])) - -(module+ test - ;; This test succeeds on all Racket versions before and after 6.10. - ;; I spent an hour installing 6.10 locally and exploring the problem - ;; but so far have no clue. As neither 6.10 nor I are getting any - ;; younger, I am choosing to ignore this, for now. - ;; - ;; Probably https://github.com/racket/drracket/issues/118 - (unless (equal? (version) "6.10") - (check-equal? (identifier->bluebox #'list) - "(list v ...) -> list?\n v : any/c")) - (check-false (identifier->bluebox (datum->syntax #f (gensym))))) diff --git a/elpa/racket-mode-20200417.1741/racket/syntax.rkt b/elpa/racket-mode-20200417.1741/racket/syntax.rkt deleted file mode 100644 index 66947852..00000000 --- a/elpa/racket-mode-20200417.1741/racket/syntax.rkt +++ /dev/null @@ -1,227 +0,0 @@ -#lang racket/base - -(require (only-in openssl/md5 md5) - racket/contract - racket/match - (only-in racket/path path-only) - syntax/modread - syntax/parse/define - "mod.rkt") - -(provide with-expanded-syntax-caching-evaluator - file->syntax - file->expanded-syntax - string->expanded-syntax - path->existing-syntax - path->existing-expanded-syntax) - -(define-logger racket-mode-syntax-cache) - -;; Return a syntax object for the contents of `path`. The resulting -;; syntax is applied to `k` while the parameter -;; current-load-relative-directory is set correctly for `path`. -(define/contract (file->syntax path [k values]) - (->* (path-string?) - ((-> syntax? any)) - any) - (define dir (path-only path)) - (parameterize ([current-load-relative-directory dir] - [current-directory dir]) - (k - (with-module-reading-parameterization - (λ () - (with-input-from-file path - (λ () - (port-count-lines! (current-input-port)) - (match (read-syntax) - [(? eof-object?) #'""] - [stx stx])))))))) - -;; Same but from a string, where `path` is used for the load relative -;; directory and given to read-syntax as the source -(define/contract (string->syntax path code-str [k values]) - (->* (path-string? string?) - ((-> syntax? any)) - any) - (define dir (path-only path)) - (parameterize ([current-load-relative-directory dir] - [current-directory dir]) - (k - (with-module-reading-parameterization - (λ () - (define in (open-input-string code-str)) - (port-count-lines! in) - (match (read-syntax path in) - [(? eof-object?) #'""] - [stx stx])))))) - -;;; expanded syntax caching - -(define/contract (call-with-expanded-syntax-caching-evaluator maybe-mod thk) - (-> (or/c mod? #f) (-> any) any) - (before-run maybe-mod) - (begin0 - (parameterize ([current-eval (make-eval-handler maybe-mod)]) - (thk)) - (after-run maybe-mod))) - -(define-simple-macro (with-expanded-syntax-caching-evaluator mm:expr e:expr ...+) - (call-with-expanded-syntax-caching-evaluator mm (λ () e ...))) - -;; Call this early in a file run, _before_ any evaluation. -(define (before-run _maybe-mod) - ;; Don't actually flush the entire cache anymore. Because we're also - ;; using this for check-syntax. TODO: Some new strategy, or, let the - ;; cache grow indefinitely? - ;; - ;; Note: The case of same path with different digest is handled when - ;; we lookup items from the hash. It's considered a cache miss, we - ;; expand again, and that is the new value in the hash for that - ;; path. - (void)) - -(define ((make-eval-handler _maybe-mod [orig-eval (current-eval)]) e) - (cond [(and (syntax? e) - (syntax-source e) - (path-string? (syntax-source e)) - (not (compiled-expression? (syntax-e e)))) - (define expanded-stx (expand e)) - (cache-set! (syntax-source e) - e - expanded-stx - (file->digest (syntax-source e)) - (current-namespace) - (current-load-relative-directory)) - (orig-eval expanded-stx)] - [else (orig-eval e)])) - -(define (after-run _maybe-mod) - (void)) - -;; cache : (hash/c path? cache-entry?) -(struct cache-entry (stx exp-stx digest namespace load-relative-directory)) -(define cache (make-hash)) -(define last-mod #f) - -(define/contract (cache-set! path stx exp-stx digest namespace load-rel-dir) - (-> path? syntax? syntax? string? namespace? path-string? any) - (hash-set! cache path - (cache-entry stx - exp-stx - digest - namespace - load-rel-dir))) - -(define (->path v) - (cond [(path? v) v] - [(path-string? v) (string->path v)] - [else (error '->path "not path? or path-string?" v)])) - -;; Returns the result of applying `k` to the expanded syntax, with the -;; correct parameterization of current-namespace and -;; current-load-relative-directory. Note that `k` deliberately does -;; not default to `values` because trying to use the syntax without -;; the correct parameterizations will often result in bugs, sometimes -;; subtle and confusing. So this "CPS" approach guides you to do the -;; right thing. -(define/contract (file->expanded-syntax path-str k) - (-> path-string? (-> syntax? any) any) - (define path (->path path-str)) - (define digest (file->digest path)) - (match (hash-ref cache path #f) - [(cache-entry _stx exp-stx (== digest) namespace load-rel-dir) - (log-racket-mode-syntax-cache-info "file->expanded-syntax cache hit ~v ~v" path digest) - (parameterize ([current-namespace namespace] - [current-load-relative-directory load-rel-dir] - [current-directory load-rel-dir]) - (k exp-stx))] - [_ - (log-racket-mode-syntax-cache-info "file->expanded-syntax cache MISS ~v ~v" path digest) - (file->syntax - path - (λ (stx) - ;; Create and parameterize a namespace here. file->syntax - ;; already parameterized the directory before calling us. - (parameterize ([current-namespace (make-base-namespace)]) - (define exp-stx (expand stx)) - (cache-set! path stx exp-stx digest (current-namespace) (current-load-relative-directory)) - (k exp-stx))))])) - -;; Same but when you don't have a file. -(define/contract (string->expanded-syntax path-str code-str k) - (-> path-string? string? (-> syntax? any) any) - (define path (->path path-str)) - (define digest (string->digest code-str)) - (match (hash-ref cache path #f) - [(cache-entry _stx exp-stx (== digest) namespace load-rel-dir) - (log-racket-mode-syntax-cache-info "string->expanded-syntax cache hit ~v ~v" path digest) - (parameterize ([current-namespace namespace] - [current-load-relative-directory load-rel-dir] - [current-directory load-rel-dir]) - (k exp-stx))] - [_ - (log-racket-mode-syntax-cache-info "string->expanded-syntax cache MISS ~v ~v" path digest) - (string->syntax - path-str code-str - (λ (stx) - ;; Create and parameterize a namespace here. string->syntax - ;; already parameterized the directory before calling us. - (parameterize ([current-namespace (make-base-namespace)]) - (define exp-stx (expand stx)) - (cache-set! path stx exp-stx digest (current-namespace) (current-load-relative-directory)) - (k exp-stx))))])) - -(define/contract (file->digest path) - (-> path? string?) - (call-with-input-file path md5)) - -(define/contract (string->digest str) - (-> string? string?) - (md5 (open-input-string str))) - -;; Like string->syntax but given only the path-str and only if syntax -;; already in the cache, as a result of previously calling -;; string->expanded-syntax. Intended for use by identifier.rkt. -(define/contract (path->existing-syntax path-str k) - (-> path-string? (-> syntax? any) any) - (define path (->path path-str)) - (match (hash-ref cache path #f) - [(cache-entry stx _exp-stx _digest namespace load-rel-dir) - (log-racket-mode-syntax-cache-info "path->existing-syntax cache hit ~v (ignoring digest)" path) - (parameterize ([current-namespace namespace] - [current-load-relative-directory load-rel-dir] - [current-directory load-rel-dir]) - (k stx))] - [#f - (log-racket-mode-syntax-cache-warning "path->existing-syntax cache MISS ~v (ignoring digest)" path) - #f])) - -;; Like string->expanded-syntax but given only the path-str and only -;; if expanded syntax already in the cache, as a result of previously -;; calling string->expanded-syntax. Intended for use by -;; identifier.rkt. -(define/contract (path->existing-expanded-syntax path-str k) - (-> path-string? (-> syntax? any) any) - (define path (->path path-str)) - (match (hash-ref cache path #f) - [(cache-entry _stx exp-stx _digest namespace load-rel-dir) - (log-racket-mode-syntax-cache-info "path->existing-expanded-syntax cache hit ~v (ignoring digest)" path) - (parameterize ([current-namespace namespace] - [current-load-relative-directory load-rel-dir] - [current-directory load-rel-dir]) - (k exp-stx))] - [#f - (log-racket-mode-syntax-cache-warning "path->existing-expanded-syntax cache MISS ~v (ignoring digest)" path) - #f])) - -(module+ test - (require rackunit - racket/file) - (define this-path (syntax-source #'here)) - (define this-string (file->string this-path)) - (check-equal? (file->digest this-path) - (string->digest this-string)) - (check-equal? (file->expanded-syntax this-path values) - (string->expanded-syntax this-path this-string values)) - (check-equal? (path->existing-expanded-syntax this-path (λ (_stx) 42)) - 42)) diff --git a/elpa/racket-mode-20200417.1741/racket/test/find-examples.rkt b/elpa/racket-mode-20200417.1741/racket/test/find-examples.rkt deleted file mode 100644 index adf7ecbb..00000000 --- a/elpa/racket-mode-20200417.1741/racket/test/find-examples.rkt +++ /dev/null @@ -1,61 +0,0 @@ -#lang racket/base - -(require racket/contract) - -;; Examples for test/find.rkt. - -(define (plain x) x) -(provide plain) -(provide (rename-out [plain renamed])) - -(define (contracted1 x) x) -(provide (contract-out [contracted1 (-> any/c any)])) -(define (contracted2 x) x) -(provide/contract [contracted2 (-> any/c any)]) - -(define (c/r x) x) -(provide (contract-out [rename c/r contracted/renamed (-> any/c any)])) - -(define-syntax-rule (plain-definer name) - (begin - (define (name x) x) - (provide name))) -(plain-definer plain-by-macro) - -(define-syntax-rule (contracted-definer name) - (begin - (define (name x) x) - (provide (contract-out [name (-> any/c any)])))) -(contracted-definer contracted-by-macro) - -;; This is here to try to trip naive matching, by having a definition -;; of `sub` that is not actually provided, unlike the one in the `sub` -;; module just below. -(module red-herring racket/base - (define (sub) #f)) - -(module sub racket/base - (define (sub x) x) - (provide sub - (rename-out [sub sub/renamed]))) -(require 'sub) -(provide sub sub/renamed) - -;; Likewise, another case of naive matching: -(module red-herring-2 racket/base - (define (foo) #f)) - -(define (foo x) x) -(provide foo) - -;; Issue 317 -(define a-number 42) -(provide a-number) -(define a-parameter (make-parameter #f)) -(provide a-parameter) - -(module m racket/base - (define from-m #f) - (provide from-m)) -(require 'm) -(provide (contract-out [from-m any/c])) diff --git a/elpa/racket-mode-20200417.1741/racket/test/find.rkt b/elpa/racket-mode-20200417.1741/racket/test/find.rkt deleted file mode 100644 index ceb1abf8..00000000 --- a/elpa/racket-mode-20200417.1741/racket/test/find.rkt +++ /dev/null @@ -1,136 +0,0 @@ -#lang at-exp racket/base - -(require racket/format - racket/match - racket/runtime-path - rackunit - syntax/modread - "../find.rkt" - "../syntax.rkt" - "find-examples.rkt") - -(define (not-0 v) (not (= 0 v))) -(define (not-1 v) (not (= 1 v))) - -(define-runtime-path parent-dir "..") - -(define (test how) - (check-equal? (find-definition how "display") - 'kernel) - (check-equal? (find-signature how "display") - '("defined in #%kernel, signature unavailable")) - - (check-match (find-definition how "displayln") - (list (pregexp "/racket/private/misc\\.rkt$") - (? not-1) - (? not-0))) - (check-equal? (find-signature how "displayln") - '((displayln v) (displayln v p))) ;case-lambda defn - - ;; Test a definer macro that (as of Racket 6.7) does not properly - ;; set srcloc: Can we at least return a specfic location for its - ;; parent syntax (as opposed to line 1 column 0)? - (check-match (find-definition how "in-hash") - (list (pregexp "/racket/private/for.rkt$") - (? not-1) - (? not-0))) - - ;; Tests for specific locations in find-examples.rkt - - (check-match (find-definition how "plain") - (list (pregexp "find-examples.rkt$") 7 9)) - (check-equal? (find-signature how "plain") - '(plain x)) - - (check-match (find-definition how "renamed") - (list (pregexp "find-examples.rkt$") 7 9)) - (check-equal? (find-signature how "renamed") - '(plain x)) - - (check-match (find-definition how "contracted1") - (list (pregexp "find-examples.rkt$") 11 9)) - (check-equal? (find-signature how "contracted1") - '(contracted1 x)) - - (check-match (find-definition how "contracted2") - (list (pregexp "find-examples.rkt$") 13 9)) - (check-equal? (find-signature how "contracted2") - '(contracted2 x)) - - (check-match (find-definition how "contracted/renamed") - (list (pregexp "find-examples.rkt$") 16 9)) - (check-equal? (find-signature how "contracted/renamed") - '(c/r x)) - - (check-match (find-definition how "plain-by-macro") - (list (pregexp "find-examples.rkt$") 23 15)) - (check-false (find-signature how "plain-by-macro")) - - (check-match (find-definition how "contracted-by-macro") - (list (pregexp "find-examples.rkt$") 29 20)) - (check-false (find-signature how "contracted-by-macro")) - - (check-match (find-definition how "sub") - (list (pregexp "find-examples.rkt$") 38 11)) - (check-equal? (find-signature how "sub") - '(sub x)) - - (check-match (find-definition how "sub/renamed") - (list (pregexp "find-examples.rkt$") 38 11)) - (check-equal? (find-signature how "sub/renamed") - '(sub x)) - - (check-match (find-definition how "foo") - (list (pregexp "find-examples.rkt$") 48 9)) - (check-equal? (find-signature how "foo") - '(foo x)) - - (check-match (find-definition how "a-number") - (list (pregexp "find-examples.rkt$") 52 8)) - - (check-match (find-definition how "a-parameter") - (list (pregexp "find-examples.rkt$") 54 8)) - - (check-match (find-definition how "from-m") - (list (pregexp "find-examples.rkt$") 58 10)) - - ;; This is (roughly) a test of opening a Racket source file and - ;; doing M-. on every non-list sexpr: Call find-definition on each - ;; sexpr. Not-found (#f) is fine. But fail test for (list _ 1 0) -- - ;; i.e. the source file was found, but not the location within. - (define (check-non-bof-location file) - (define ht (make-hash)) - (define (find k) ;memoized find-definition how - (hash-ref ht k - (λ () - (define v (find-definition how (format "~a" k))) - (hash-set! ht k v) - v))) - (define (walk v) - (if (list? v) - (for-each walk v) - (match (find v) - [(list where 1 0) - (fail @~a{can't find definition of `@|v|` in @where})] - [_ (void)]))) - (walk - (with-module-reading-parameterization - ;; Why read not read-syntax? Because we only care about the - ;; sexprs as text: `find-definition` takes a string, because - ;; `racket-visit-definition` takes text from an Emacs buffer. - (λ () (with-input-from-file file read))))) - (for ([file '("commands/requires.rkt" - "repl.rkt")]) - (check-non-bof-location (build-path parent-dir file)))) - - -;; Exercise "how" = 'namespace -(define-namespace-anchor nsa) -(parameterize ([current-namespace (namespace-anchor->namespace nsa)]) - (test 'namespace)) - -;; Exercise "how" = a specific file -(define this-file (path->string (syntax-source #'here))) -(file->expanded-syntax this-file - (λ (_stx) - (test this-file))) diff --git a/elpa/racket-mode-20200417.1741/racket/util.rkt b/elpa/racket-mode-20200417.1741/racket/util.rkt deleted file mode 100644 index 10ac3d0d..00000000 --- a/elpa/racket-mode-20200417.1741/racket/util.rkt +++ /dev/null @@ -1,110 +0,0 @@ -#lang racket/base - -(require (for-syntax racket/base) - syntax/stx - syntax/parse/define - racket/format - (only-in racket/path - filename-extension)) - -(provide display-commented - string->namespace-syntax - syntax-or-sexpr->syntax - syntax-or-sexpr->sexpr - nat/c - pos/c - inc! - memq? - in-syntax - log-racket-mode-debug - log-racket-mode-info - log-racket-mode-warning - log-racket-mode-error - log-racket-mode-fatal - time-apply/log - with-time/log - define-polyfill - path-has-extension? - path-replace-extension) - -(define (display-commented str) - (eprintf "; ~a\n" - (regexp-replace* "\n" str "\n; "))) - -(define (string->namespace-syntax str) - (namespace-syntax-introduce - (read-syntax #f (open-input-string str)))) - -(define (syntax-or-sexpr->syntax v) - (if (syntax? v) - v - (namespace-syntax-introduce (datum->syntax #f v)))) - -(define (syntax-or-sexpr->sexpr v) - (if (syntax? v) - (syntax-e v) - v)) - -(define nat/c exact-nonnegative-integer?) -(define pos/c exact-positive-integer?) - -(define-simple-macro (inc! v:id) - (set! v (add1 v))) - -(define (memq? x xs) - (and (memq x xs) #t)) - -;;; in-syntax: Not defined until Racket 6.3 - -(define-sequence-syntax in-syntax - (λ () #'in-syntax/proc) - (λ (stx) - (syntax-case stx () - [[(id) (_ arg)] - #'[(id) (in-list (in-syntax/proc arg))]]))) - -(define (in-syntax/proc stx) - (or (stx->list stx) - (raise-type-error 'in-syntax "stx-list" stx))) - -;;; logger / timing - -(define-logger racket-mode) - -(define (time-apply/log what proc args) - (define-values (vs cpu real gc) (time-apply proc args)) - (define (fmt n) (~v #:align 'right #:min-width 4 n)) - (log-racket-mode-debug "~a cpu | ~a real | ~a gc <= ~a" - (fmt cpu) (fmt real) (fmt gc) what) - (apply values vs)) - -(define-simple-macro (with-time/log what e ...+) - (time-apply/log what (λ () e ...) '())) - -;;; Path extension for Racket versions < 6.6 - -(define-simple-macro (define-polyfill (id:id arg:expr ...) - #:module mod:id - body:expr ...+) - (define id - (with-handlers ([exn:fail? (λ (_exn) - (λ (arg ...) body ...))]) - (dynamic-require 'mod 'id)))) - -(define-polyfill (path-has-extension? path ext) - #:module racket/path - (let ([ext (if (string? ext) (string->bytes/utf-8 ext) ext)]) - (equal? (filename-extension path) ext))) - -(define-polyfill (path-replace-extension path ext) - #:module racket/path - (path-replace-suffix path ext)) - -(module+ test - (require rackunit) - (check-true (path-has-extension? "/path/to/foo.EXT" "EXT")) - (check-true (path-has-extension? (build-path "/path/to/foo.EXT") "EXT")) - (check-equal? (path-replace-extension "/path/to/foo.OLD" ".NEW") - (build-path "/path/to/foo.NEW")) - (check-equal? (path-replace-extension (build-path "/path/to/foo.OLD") ".NEW") - (build-path "/path/to/foo.NEW"))) diff --git a/elpa/reformatter-20200327.2358/reformatter-autoloads.el b/elpa/reformatter-20200327.2358/reformatter-autoloads.el deleted file mode 100644 index 733e7941..00000000 --- a/elpa/reformatter-20200327.2358/reformatter-autoloads.el +++ /dev/null @@ -1,74 +0,0 @@ -;;; reformatter-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "reformatter" "reformatter.el" (0 0 0 0)) -;;; Generated autoloads from reformatter.el - -(autoload 'reformatter-define "reformatter" "\ -Define a reformatter command with NAME. - -When called, the reformatter will use PROGRAM and any ARGS to -reformat the current buffer. The contents of the buffer will be -passed as standard input to the reformatter, which should output -them to standard output. A nonzero exit code will be reported as -failure, and the output of the command to standard error will be -displayed to the user. - -The macro accepts the following keyword arguments: - -:program (required) - - Provides a form which should evaluate to a string at runtime, - e.g. a literal string, or the name of a variable which holds - the program path. - -:args - - If provided, this is a form which evaluates to a list of - strings at runtime. Default is the empty list. - -:mode - - Unless nil, also generate a minor mode that will call the - reformatter command from `before-save-hook' when enabled. - Default is t. - -:group - - If provided, this is the custom group used for any generated - modes or custom variables. Don't forget to declare this group - using a `defgroup' form. - -:lighter - - If provided, this is a mode lighter string which will be used - for the \"-on-save\" minor mode. It should have a leading - space. The supplied value will be used as the default for a - generated custom variable which specifies the mode lighter. - Default is nil, ie. no lighter. - -:keymap - - If provided, this is the symbol name of the \"-on-save\" mode's - keymap, which you must declare yourself. Default is no keymap. - -\(fn NAME &key PROGRAM ARGS (MODE t) LIGHTER KEYMAP GROUP)" nil t) - -(function-put 'reformatter-define 'lisp-indent-function 'defun) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "reformatter" '("reformatter-replace-buffer-contents-from-file"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; reformatter-autoloads.el ends here diff --git a/elpa/reformatter-20200327.2358/reformatter-pkg.el b/elpa/reformatter-20200327.2358/reformatter-pkg.el deleted file mode 100644 index bc5cfd90..00000000 --- a/elpa/reformatter-20200327.2358/reformatter-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "reformatter" "20200327.2358" "Define commands which run reformatters on the current buffer" '((emacs "24.3")) :commit "e8f70b20caf6672353a2b0ee3161d4791c412696" :keywords '("convenience" "tools") :authors '(("Steve Purcell" . "steve@sanityinc.com")) :maintainer '("Steve Purcell" . "steve@sanityinc.com") :url "https://github.com/purcell/reformatter.el") diff --git a/elpa/reformatter-20200327.2358/reformatter.el b/elpa/reformatter-20200327.2358/reformatter.el deleted file mode 100644 index 06c24f18..00000000 --- a/elpa/reformatter-20200327.2358/reformatter.el +++ /dev/null @@ -1,223 +0,0 @@ -;;; reformatter.el --- Define commands which run reformatters on the current buffer -*- lexical-binding: t; -*- - -;; Copyright (C) 2019 Steve Purcell - -;; Author: Steve Purcell -;; Keywords: convenience, tools -;; Homepage: https://github.com/purcell/reformatter.el -;; Package-Requires: ((emacs "24.3")) -;; Package-Version: 20200327.2358 -;; Package-X-Original-Version: 0 - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This library lets elisp authors easily define an idiomatic command -;; to reformat the current buffer using a command-line program, -;; together with an optional minor mode which can apply this command -;; automatically on save. - -;; In its initial release it supports only reformatters which read -;; from stdin and write to stdout, but a more versatile interface will -;; be provided as development continues. - -;; As an example, let's define a reformat command that applies the -;; "dhall format" command. We'll assume here that we've already defined a -;; variable `dhall-command' which holds the string name or path of the -;; dhall executable: - -;; (reformatter-define dhall-format -;; :program dhall-command -;; :args '("format")) - -;; The `reformatter-define' macro expands to code which generates -;; `dhall-format-buffer' and `dhall-format-region' interactive -;; commands, and a local minor mode called -;; `dhall-format-on-save-mode'. The :args" and :program expressions -;; will be evaluated at runtime, so they can refer to variables that -;; may (later) have a buffer-local value. A custom variable will be -;; generated for the mode lighter, with the supplied value becoming -;; the default. - -;; The generated minor mode allows idiomatic per-directory or per-file -;; customisation, via the "modes" support baked into Emacs' file-local -;; and directory-local variables mechanisms. For example, users of -;; the above example might add the following to a project-specific -;; .dir-locals.el file: - -;; ((dhall-mode -;; (mode . dhall-format-on-save))) - -;; See the documentation for `reformatter-define', which provides a -;; number of options for customising the generated code. - -;; Library authors might like to provide autoloads for the generated -;; code, e.g.: - -;; ;;;###autoload (autoload 'dhall-format-buffer "current-file" nil t) -;; ;;;###autoload (autoload 'dhall-format-region "current-file" nil t) -;; ;;;###autoload (autoload 'dhall-format-on-save-mode "current-file" nil t) - -;;; Code: -(eval-when-compile - (require 'cl-lib)) -(require 'ansi-color) - -;;;###autoload -(cl-defmacro reformatter-define (name &key program args (mode t) lighter keymap group) - "Define a reformatter command with NAME. - -When called, the reformatter will use PROGRAM and any ARGS to -reformat the current buffer. The contents of the buffer will be -passed as standard input to the reformatter, which should output -them to standard output. A nonzero exit code will be reported as -failure, and the output of the command to standard error will be -displayed to the user. - -The macro accepts the following keyword arguments: - -:program (required) - - Provides a form which should evaluate to a string at runtime, - e.g. a literal string, or the name of a variable which holds - the program path. - -:args - - If provided, this is a form which evaluates to a list of - strings at runtime. Default is the empty list. - -:mode - - Unless nil, also generate a minor mode that will call the - reformatter command from `before-save-hook' when enabled. - Default is t. - -:group - - If provided, this is the custom group used for any generated - modes or custom variables. Don't forget to declare this group - using a `defgroup' form. - -:lighter - - If provided, this is a mode lighter string which will be used - for the \"-on-save\" minor mode. It should have a leading - space. The supplied value will be used as the default for a - generated custom variable which specifies the mode lighter. - Default is nil, ie. no lighter. - -:keymap - - If provided, this is the symbol name of the \"-on-save\" mode's - keymap, which you must declare yourself. Default is no keymap." - (declare (indent defun)) - (cl-assert (symbolp name)) - (cl-assert program) - ;; Note: we skip using `gensym' here because the macro arguments are only - ;; referred to once below, but this may have to change later. - (let* ((buffer-fn-name (intern (format "%s-buffer" name))) - (region-fn-name (intern (format "%s-region" name))) - (minor-mode-form - (when mode - (let ((on-save-mode-name (intern (format "%s-on-save-mode" name))) - (lighter-name (intern (format "%s-on-save-mode-lighter" name)))) - `(progn - (defcustom ,lighter-name ,lighter - ,(format "Mode lighter for `%s'." on-save-mode-name) - :group ,group - :type 'string) - (define-minor-mode ,on-save-mode-name - ,(format "When enabled, call `%s' when this buffer is saved. - -To enable this unconditionally in a major mode, add this mode -to the major mode's hook. To enable it in specific files or directories, -use the local variables \"mode\" mechanism, e.g. in \".dir-locals.el\" you -might use: - - ((some-major-mode - (mode . %s-on-save))) - " buffer-fn-name name) nil - :global nil - :lighter ,lighter-name - :keymap ,keymap - :group ,group - (if ,on-save-mode-name - (add-hook 'before-save-hook ',buffer-fn-name nil t) - (remove-hook 'before-save-hook ',buffer-fn-name t)))))))) - `(progn - (defun ,region-fn-name (beg end &optional display-errors) - "Reformats the region from BEG to END. -When called interactively, or with prefix argument -DISPLAY-ERRORS, shows a buffer if the formatting fails." - (interactive "rp") - (let* ((err-file (make-temp-file ,(symbol-name name))) - (out-file (make-temp-file ,(symbol-name name))) - ;; Setting this coding system might not universally be - ;; the best default, but was apparently necessary for - ;; some hand-rolled reformatter functions that this - ;; library was written to replace. - (coding-system-for-read 'utf-8) - (coding-system-for-write 'utf-8)) - (unwind-protect - (let* ((error-buffer (get-buffer-create ,(format "*%s errors*" name))) - (retcode - (apply 'call-process-region beg end ,program - nil (list (list :file out-file) err-file) - nil - ,args))) - (with-current-buffer error-buffer - (let ((inhibit-read-only t)) - (insert-file-contents err-file nil nil nil t) - (ansi-color-apply-on-region (point-min) (point-max))) - (special-mode)) - (if (zerop retcode) - (save-restriction - ;; This replacement method minimises - ;; disruption to marker positions and the - ;; undo list - (narrow-to-region beg end) - (reformatter-replace-buffer-contents-from-file out-file)) - (if display-errors - (display-buffer error-buffer) - (message ,(concat (symbol-name name) " failed: see %s") (buffer-name error-buffer))))) - (delete-file err-file) - (delete-file out-file)))) - - (defun ,buffer-fn-name (&optional display-errors) - "Reformats the current buffer. -When called interactively, or with prefix argument -DISPLAY-ERRORS, shows a buffer if the formatting fails." - (interactive "p") - (message "Formatting buffer") - (,region-fn-name (point-min) (point-max) display-errors)) - - ;; This alias will be removed in a future version - (defalias ',name ',buffer-fn-name) - - ,minor-mode-form))) - -(defun reformatter-replace-buffer-contents-from-file (file) - "Replace the accessible portion of the current buffer with the contents of FILE." - ;; While the function `replace-buffer-contents' exists in recent - ;; Emacs versions, it exhibits pathologically slow behaviour in many - ;; cases, and the simple replacement approach we use instead is well - ;; proven and typically preserves point and markers to a reasonable - ;; degree. - (insert-file-contents file nil nil nil t)) - - -(provide 'reformatter) -;;; reformatter.el ends here diff --git a/elpa/reformatter-20200327.2358/reformatter.elc b/elpa/reformatter-20200327.2358/reformatter.elc deleted file mode 100644 index bf8da61c646e02f3352a72f8475fde5efc7fcfe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5186 zcmc&&|8LvI6?d~%Z8Q}7f^Ho!V0)pLipoSm67{8afFMdNdq(5NaNG?=6d)(^Byk~m zERVFK{`LF3J5rI|WM9x9CfE}1?!9;Ky?b9i$A`0LPruyT+iO02_>i8eB#UAhnn9G( zED?dGE1By^r8F3KeY0{M6>Ac4Oe!m)B>GVlSk~R9S-f0FnwF44rIwn)O)8Qopil+6 z$fI5HeQrxdJ3E`kCo zcFgu74M{5sL`n-uu@W~nsZ7x%MIJ{or(zAlfp7PP3x3vz75KTIX0z$$@`p0YCACDV zBQH>~%G=HT$NkY@Ohz)X3A z;X1o2+TXs8--KTu~ zKgwK@d>e6OgtFciMrJB6%*M^7h~hGr9b+7Oz)GkUuAR2Khs<-8*TR}%q_bFTAgxjw z9?RicHXoS*1w;_Y3_f7#OBKiJ8WB!!Lh8Zl zB?zuW9*G5#(z<%B;!uN~iE70%QLJIyA+*-4+Ub&)SUVFy$ZGuEP_xz#_OpU^{QND-u{C9lsxvqMzcDwt~}OHmF?pCG*7d&J{MW;~tF2jjsB#O zqWk^EXOAEq>t{S1++6iBHN5kfRq6LC9y~QZJ-}cnm}7+h@jYJugy*7qZer%<{-B5d zKK=)dc{+FQ?acU%Ut)sUSjYsNTjF73zPw31YJ6@d#vq&AY23vR#QIPM>cM&z@B95H z=7XmJ++`^I#@)tm_p!qOvqSsa8?k`ixbbVl`Wvi__}Pbae=_%ny~gj4@WbNp1I{6Q zf!Qy4c8J;I`Cv5pdYQB%m_iPWY z!`$)S6DIwXpHFahaL%vTIlabbN3)N42?C6Be2`2WdWp)T3ont$0*GkaZcRHQ(_hF% zjo>7!D<@Uefo!=a_q|*nqCQ0DQP-YAy~sUew1(i@Q{2eNf(qxGTd08UTV$({!RXQd z)8=i5g4pvIW91CKJ;pkyyRNNenJH%NZEKGJ)$-Id4)jguzV<9ybIfxtR}f*JtMc!0 zq5bKMSM?IdNKUz!SAESn+if*m++W|BqWy(#P>7t>3?KhwW$zbsP#(lBCY;1D)^uR#A3|AZ!N3(!Oe7{{HJ zhx4>Tbnhryniv{zC)-K}x`Z5UTTozbHKv(|K<7cBaT(`Id{4c;u#j*mGRsmG?00ka8Kv1e8@Hue_U6q1Ri5sjK`{ZUg8a? zi%6>bcDvoivV(|@)dJc?0Doat zL;8yEf9!9nkg{h&9f{yvRJRk`wrzxw0b@^QCkz*7-yY!@cP=ULG-KGHh^}P3F%Z^V zXEHRr=fLO3O4^StpUmrNYxP`gz2mq}OwHW=fpa7s5 zYH%J?eLAkeXYwB_4xmyn%zspqX8D6a;;8rx;Is{XZ3@&~}zEAG{Ur-E({-FJ;-EO*z4IF8* zg%KQJ4Dc|+V4z>%HB4CCfRbjS#^bjWyU|ghYot-;Az^Wm_i9>O3188W-^&~f=)wk) zX#@ODK")) :maintainer '("Takafumi Arakaki ") :url "https://github.com/tkf/emacs-request") diff --git a/elpa/request-20200219.2257/request.el b/elpa/request-20200219.2257/request.el deleted file mode 100644 index d6e9319a..00000000 --- a/elpa/request-20200219.2257/request.el +++ /dev/null @@ -1,1304 +0,0 @@ -;;; request.el --- Compatible layer for URL request in Emacs -*- lexical-binding: t; -*- - -;; Copyright (C) 2012 Takafumi Arakaki -;; Copyright (C) 1985-1986, 1992, 1994-1995, 1999-2012 -;; Free Software Foundation, Inc. - -;; Author: Takafumi Arakaki -;; URL: https://github.com/tkf/emacs-request -;; Package-Version: 20200219.2257 -;; Package-Requires: ((emacs "24.4")) -;; Version: 0.3.2 - -;; This file is NOT part of GNU Emacs. - -;; request.el is free software: you can redistribute 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. - -;; request.el is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with request.el. -;; If not, see . - -;;; Commentary: - -;; Request.el is a HTTP request library with multiple backends. It -;; supports url.el which is shipped with Emacs and curl command line -;; program. User can use curl when s/he has it, as curl is more reliable -;; than url.el. Library author can use request.el to avoid imposing -;; external dependencies such as curl to users while giving richer -;; experience for users who have curl. - -;; Following functions are adapted from GNU Emacs source code. -;; Free Software Foundation holds the copyright of them. -;; * `request--process-live-p' -;; * `request--url-default-expander' - -;;; Code: - -(eval-when-compile - (defvar url-http-method) - (defvar url-http-response-status)) - -(require 'cl-lib) -(require 'url) -(require 'mail-utils) -(require 'autorevert) -(require 'auth-source) - -(defgroup request nil - "Compatible layer for URL request in Emacs." - :group 'comm - :prefix "request-") - -(defconst request-version "0.3.0") - - -;;; Customize variables - -(defcustom request-storage-directory - (concat (file-name-as-directory user-emacs-directory) "request") - "Directory to store data related to request.el." - :type 'directory) - -(defcustom request-curl "curl" - "Executable for curl command." - :type 'string) - -(defcustom request-curl-options nil - "curl command options. - -List of strings that will be passed to every curl invocation. You can pass -extra options here, like setting the proxy." - :type '(repeat string)) - -(defcustom request-backend (if (executable-find request-curl) - 'curl - 'url-retrieve) - "Backend to be used for HTTP request. -Automatically set to `curl' if curl command is found." - :type '(choice (const :tag "cURL backend" curl) - (const :tag "url-retrieve backend" url-retrieve))) - -(defcustom request-timeout nil - "Default request timeout in second. -`nil' means no timeout." - :type '(choice (integer :tag "Request timeout seconds") - (boolean :tag "No timeout" nil))) - -(defcustom request-temp-prefix "emacs-request" - "Prefix for temporary files created by Request." - :type 'string - :risky t) - -(defcustom request-log-level -1 - "Logging level for request. -One of `error'/`warn'/`info'/`verbose'/`debug'/`trace'/`blather'. --1 means no logging." - :type '(choice (integer :tag "No logging" -1) - (const :tag "Level error" error) - (const :tag "Level warn" warn) - (const :tag "Level info" info) - (const :tag "Level Verbose" verbose) - (const :tag "Level DEBUG" debug) - (const :tag "Level TRACE" trace) - (const :tag "Level BLATHER" blather))) - -(defcustom request-message-level 'warn - "Logging level for request. -See `request-log-level'." - :type '(choice (integer :tag "No logging" -1) - (const :tag "Level error" error) - (const :tag "Level warn" warn) - (const :tag "Level info" info) - (const :tag "Level Verbose" verbose) - (const :tag "Level DEBUG" debug) - (const :tag "Level TRACE" trace) - (const :tag "Level BLATHER" blather))) - - -;;; Utilities - -(defun request--safe-apply (function &rest arguments) - "Apply FUNCTION with ARGUMENTS, suppressing any errors." - (condition-case nil - (apply #'apply function arguments) - ((debug error)))) - -(defun request--safe-call (function &rest arguments) - (request--safe-apply function arguments)) - -;; (defun request--url-no-cache (url) -;; "Imitate `cache=false' of `jQuery.ajax'. -;; See: http://api.jquery.com/jQuery.ajax/" -;; ;; FIXME: parse URL before adding ?_=TIME. -;; (concat url (format-time-string "?_=%s"))) - -(defmacro request--document-function (function docstring) - "Document FUNCTION with DOCSTRING. Use this for defstruct accessor etc." - (declare (indent defun) - (doc-string 2)) - `(put ',function 'function-documentation ,docstring)) - -(defun request--process-live-p (process) - "Copied from `process-live-p' for backward compatibility (Emacs < 24). -Adapted from lisp/subr.el. -FSF holds the copyright of this function: - Copyright (C) 1985-1986, 1992, 1994-1995, 1999-2012 - Free Software Foundation, Inc." - (memq (process-status process) '(run open listen connect stop))) - - -;;; Logging - -(defconst request--log-level-def - '(;; debugging - (blather . 60) (trace . 50) (debug . 40) - ;; information - (verbose . 30) (info . 20) - ;; errors - (warn . 10) (error . 0)) - "Named logging levels.") - -(defun request--log-level-as-int (level) - (if (integerp level) - level - (or (cdr (assq level request--log-level-def)) - 0))) - -(defvar request-log-buffer-name " *request-log*") - -(defun request--log-buffer () - (get-buffer-create request-log-buffer-name)) - -(defmacro request-log (level fmt &rest args) - (declare (indent 1)) - `(let ((level (request--log-level-as-int ,level)) - (log-level (request--log-level-as-int request-log-level)) - (msg-level (request--log-level-as-int request-message-level))) - (when (<= level (max log-level msg-level)) - (let ((msg (format "[%s] %s" ,level - (condition-case err - (format ,fmt ,@args) - (error (format " -!!! Logging error while executing: -%S -!!! Error: -%S" - ',args err)))))) - (when (<= level log-level) - (with-current-buffer (request--log-buffer) - (setq buffer-read-only t) - (let ((inhibit-read-only t)) - (goto-char (point-max)) - (insert msg "\n")))) - (when (<= level msg-level) - (message "%s" msg)))))) - - -;;; HTTP specific utilities - -(defconst request--url-unreserved-chars - '(?a ?b ?c ?d ?e ?f ?g ?h ?i ?j ?k ?l ?m ?n ?o ?p ?q ?r ?s ?t ?u ?v ?w ?x ?y ?z - ?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K ?L ?M ?N ?O ?P ?Q ?R ?S ?T ?U ?V ?W ?X ?Y ?Z - ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 - ?- ?_ ?. ?~) - "`url-unreserved-chars' copied from Emacs 24.3 release candidate. -This is used for making `request--urlencode-alist' RFC 3986 compliant -for older Emacs versions.") - -(defun request--urlencode-alist (alist) - ;; FIXME: make monkey patching `url-unreserved-chars' optional - (let ((url-unreserved-chars request--url-unreserved-chars)) - (cl-loop for sep = "" then "&" - for (k . v) in alist - concat sep - concat (url-hexify-string (format "%s" k)) - concat "=" - concat (url-hexify-string (format "%s" v))))) - - -;;; Header parser - -(defun request--parse-response-at-point () - "Parse the first header line such as \"HTTP/1.1 200 OK\"." - (when (re-search-forward "\\=[ \t\n]*HTTP/\\([0-9\\.]+\\) +\\([0-9]+\\)" nil t) - (list :version (match-string 1) - :code (string-to-number (match-string 2))))) - -(defun request--goto-next-body (&optional noerror) - (re-search-forward "^\r\n" nil noerror)) - - -;;; Response object - -(cl-defstruct request-response - "A structure holding all relevant information of a request." - status-code history data error-thrown symbol-status url - done-p settings - ;; internal variables - -buffer -raw-header -timer -backend -tempfiles) - -(defmacro request--document-response (function docstring) - (declare (indent defun) - (doc-string 2)) - `(request--document-function ,function ,(concat docstring " - -.. This is an accessor for `request-response' object. - -\(fn RESPONSE)"))) - -(request--document-response request-response-status-code - "Integer HTTP response code (e.g., 200).") - -(request--document-response request-response-history - "Redirection history (a list of response object). -The first element is the oldest redirection. - -You can use restricted portion of functions for the response -objects in the history slot. It also depends on backend. Here -is the table showing what functions you can use for the response -objects in the history slot. - -==================================== ============== ============== -Slots Backends ------------------------------------- ----------------------------- -\\ curl url-retrieve -==================================== ============== ============== -request-response-url yes yes -request-response-header yes no -other functions no no -==================================== ============== ============== -") - -(request--document-response request-response-data - "Response parsed by the given parser.") - -(request--document-response request-response-error-thrown - "Error thrown during request. -It takes the form of ``(ERROR-SYMBOL . DATA)``, which can be -re-raised (`signal'ed) by ``(signal ERROR-SYMBOL DATA)``.") - -(request--document-response request-response-symbol-status - "A symbol representing the status of request (not HTTP response code). -One of success/error/timeout/abort/parse-error.") - -(request--document-response request-response-url - "Final URL location of response.") - -(request--document-response request-response-done-p - "Return t when the request is finished or aborted.") - -(request--document-response request-response-settings - "Keyword arguments passed to `request' function. -Some arguments such as HEADERS is changed to the one actually -passed to the backend. Also, it has additional keywords such -as URL which is the requested URL.") - -(defun request-response-header (response field-name) - "Fetch the values of RESPONSE header field named FIELD-NAME. - -It returns comma separated values when the header has multiple -field with the same name, as :RFC:`2616` specifies. - -Examples:: - - (request-response-header response - \"content-type\") ; => \"text/html; charset=utf-8\" - (request-response-header response - \"unknown-field\") ; => nil -" - (let ((raw-header (request-response--raw-header response))) - (when raw-header - (with-temp-buffer - (erase-buffer) - (insert raw-header) - ;; ALL=t to fetch all fields with the same name to get comma - ;; separated value [#rfc2616-sec4]_. - (mail-fetch-field field-name nil t))))) -;; .. [#rfc2616-sec4] RFC2616 says this is the right thing to do -;; (see http://tools.ietf.org/html/rfc2616.html#section-4.2). -;; Python's requests module does this too. - - -;;; Backend dispatcher - -(defconst request--backend-alist - '((url-retrieve - . ((request . request--url-retrieve) - (request-sync . request--url-retrieve-sync) - (terminate-process . delete-process) - (get-cookies . request--url-retrieve-get-cookies))) - (curl - . ((request . request--curl) - (request-sync . request--curl-sync) - (terminate-process . interrupt-process) - (get-cookies . request--curl-get-cookies)))) - "Map backend and method name to actual method (symbol). - -It's alist of alist, of the following form:: - - ((BACKEND . ((METHOD . FUNCTION) ...)) ...) - -It would be nicer if I can use EIEIO. But as CEDET is included -in Emacs by 23.2, using EIEIO means abandon older Emacs versions. -It is probably necessary if I need to support more backends. But -let's stick to manual dispatch for now.") -;; See: (view-emacs-news "23.2") - -(defun request--choose-backend (method) - "Return `fucall'able object for METHOD of current `request-backend'." - (assoc-default - method - (or (assoc-default request-backend request--backend-alist) - (error "%S is not valid `request-backend'." request-backend)))) - - -;;; Cookie - -(defun request-cookie-string (host &optional localpart secure) - "Return cookie string (like `document.cookie'). - -Example:: - - (request-cookie-string \"127.0.0.1\" \"/\") ; => \"key=value; key2=value2\" -" - (mapconcat (lambda (nv) (concat (car nv) "=" (cdr nv))) - (request-cookie-alist host localpart secure) - "; ")) - -(defun request-cookie-alist (host &optional localpart secure) - "Return cookies as an alist. - -Example:: - - (request-cookie-alist \"127.0.0.1\" \"/\") ; => ((\"key\" . \"value\") ...) -" - (funcall (request--choose-backend 'get-cookies) host localpart secure)) - - -;;; Main - -(cl-defun request-default-error-callback (url &key symbol-status - &allow-other-keys) - (request-log 'error - "request-default-error-callback: %s %s" url symbol-status)) - -(cl-defun request (url &rest settings - &key - (params nil) - (data nil) - (headers nil) - (encoding 'utf-8) - (error nil) - (sync nil) - (response (make-request-response)) - &allow-other-keys) - "Send request to URL. - -Request.el has a single entry point. It is `request'. - -==================== ======================================================== -Keyword argument Explanation -==================== ======================================================== -TYPE (string) type of request to make: POST/GET/PUT/DELETE -PARAMS (alist) set \"?key=val\" part in URL -DATA (string/alist) data to be sent to the server -FILES (alist) files to be sent to the server (see below) -PARSER (symbol) a function that reads current buffer and return data -HEADERS (alist) additional headers to send with the request -ENCODING (symbol) encoding for request body (utf-8 by default) -SUCCESS (function) called on success -ERROR (function) called on error -COMPLETE (function) called on both success and error -TIMEOUT (number) timeout in second -STATUS-CODE (alist) map status code (int) to callback -SYNC (bool) If `t', wait until request is done. Default is `nil'. -==================== ======================================================== - - -* Callback functions - -Callback functions STATUS, ERROR, COMPLETE and `cdr's in element of -the alist STATUS-CODE take same keyword arguments listed below. For -forward compatibility, these functions must ignore unused keyword -arguments (i.e., it's better to use `&allow-other-keys' [#]_).:: - - (CALLBACK ; SUCCESS/ERROR/COMPLETE/STATUS-CODE - :data data ; whatever PARSER function returns, or nil - :error-thrown error-thrown ; (ERROR-SYMBOL . DATA), or nil - :symbol-status symbol-status ; success/error/timeout/abort/parse-error - :response response ; request-response object - ...) - -.. [#] `&allow-other-keys' is a special \"markers\" available in macros - in the CL library for function definition such as `cl-defun' and - `cl-function'. Without this marker, you need to specify all arguments - to be passed. This becomes problem when request.el adds new arguments - when calling callback functions. If you use `&allow-other-keys' - (or manually ignore other arguments), your code is free from this - problem. See info node `(cl) Argument Lists' for more information. - -Arguments data, error-thrown, symbol-status can be accessed by -`request-response-data', `request-response-error-thrown', -`request-response-symbol-status' accessors, i.e.:: - - (request-response-data RESPONSE) ; same as data - -Response object holds other information which can be accessed by -the following accessors: -`request-response-status-code', -`request-response-url' and -`request-response-settings' - -* STATUS-CODE callback - -STATUS-CODE is an alist of the following format:: - - ((N-1 . CALLBACK-1) - (N-2 . CALLBACK-2) - ...) - -Here, N-1, N-2,... are integer status codes such as 200. - - -* FILES - -FILES is an alist of the following format:: - - ((NAME-1 . FILE-1) - (NAME-2 . FILE-2) - ...) - -where FILE-N is a list of the form:: - - (FILENAME &key PATH BUFFER STRING MIME-TYPE) - -FILE-N can also be a string (path to the file) or a buffer object. -In that case, FILENAME is set to the file name or buffer name. - -Example FILES argument:: - - `((\"passwd\" . \"/etc/passwd\") ; filename = passwd - (\"scratch\" . ,(get-buffer \"*scratch*\")) ; filename = *scratch* - (\"passwd2\" . (\"password.txt\" :file \"/etc/passwd\")) - (\"scratch2\" . (\"scratch.txt\" :buffer ,(get-buffer \"*scratch*\"))) - (\"data\" . (\"data.csv\" :data \"1,2,3\\n4,5,6\\n\"))) - -.. note:: FILES is implemented only for curl backend for now. - As furl.el_ supports multipart POST, it should be possible to - support FILES in pure elisp by making furl.el_ another backend. - Contributions are welcome. - - .. _furl.el: http://code.google.com/p/furl-el/ - - -* PARSER function - -PARSER function takes no argument and it is executed in the -buffer with HTTP response body. The current position in the HTTP -response buffer is at the beginning of the buffer. As the HTTP -header is stripped off, the cursor is actually at the beginning -of the response body. So, for example, you can pass `json-read' -to parse JSON object in the buffer. To fetch whole response as a -string, pass `buffer-string'. - -When using `json-read', it is useful to know that the returned -type can be modified by `json-object-type', `json-array-type', -`json-key-type', `json-false' and `json-null'. See docstring of -each function for what it does. For example, to convert JSON -objects to plist instead of alist, wrap `json-read' by `lambda' -like this.:: - - (request - \"http://...\" - :parser (lambda () - (let ((json-object-type 'plist)) - (json-read))) - ...) - -This is analogous to the `dataType' argument of jQuery.ajax_. -Only this function can access to the process buffer, which -is killed immediately after the execution of this function. - -* SYNC - -Synchronous request is functional, but *please* don't use it -other than testing or debugging. Emacs users have better things -to do rather than waiting for HTTP request. If you want a better -way to write callback chains, use `request-deferred'. - -If you can't avoid using it (e.g., you are inside of some hook -which must return some value), make sure to set TIMEOUT to -relatively small value. - -Due to limitation of `url-retrieve-synchronously', response slots -`request-response-error-thrown', `request-response-history' and -`request-response-url' are unknown (always `nil') when using -synchronous request with `url-retrieve' backend. - -* Note - -API of `request' is somewhat mixture of jQuery.ajax_ (Javascript) -and requests.request_ (Python). - -.. _jQuery.ajax: http://api.jquery.com/jQuery.ajax/ -.. _requests.request: http://docs.python-requests.org -" - (declare (indent defun)) - ;; FIXME: support CACHE argument (if possible) - ;; (unless cache - ;; (setq url (request--url-no-cache url))) - (unless error - (setq error (apply-partially #'request-default-error-callback url)) - (setq settings (plist-put settings :error error))) - (unless (or (stringp data) - (null data) - (assoc-string "Content-Type" headers t)) - (setq data (request--urlencode-alist data)) - (setq settings (plist-put settings :data data))) - (when params - (cl-assert (listp params) nil "PARAMS must be an alist. Given: %S" params) - (setq url (concat url (if (string-match-p "\\?" url) "&" "?") - (request--urlencode-alist params)))) - (setq settings (plist-put settings :url url)) - (setq settings (plist-put settings :response response)) - (setq settings (plist-put settings :encoding encoding)) - (setf (request-response-settings response) settings) - (setf (request-response-url response) url) - (setf (request-response--backend response) request-backend) - ;; Call `request--url-retrieve'(`-sync') or `request--curl'(`-sync'). - (apply (if sync - (request--choose-backend 'request-sync) - (request--choose-backend 'request)) - url settings) - response) - -(defun request--clean-header (response) - "Strip off carriage returns in the header of REQUEST." - (let* ((buffer (request-response--buffer response)) - (backend (request-response--backend response)) - ;; FIXME: a workaround when `url-http-clean-headers' fails... - (sep-regexp (if (eq backend 'url-retrieve) "^\r?$" "^\r$"))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (goto-char (point-min)) - (when (and (re-search-forward sep-regexp nil t) - (not (equal (match-string 0) ""))) - (request-log 'trace "request--clean-header: cleaning\n%s" - (buffer-substring (save-excursion - (forward-line -1) - (line-beginning-position)) - (save-excursion - (forward-line 1) - (line-end-position)))) - (while (re-search-backward "\r$" (point-min) t) - (replace-match ""))))))) - -(defun request--cut-header (response) - "Cut the first header part in the buffer of RESPONSE and move it to -raw-header slot." - (let ((buffer (request-response--buffer response))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (goto-char (point-min)) - (when (re-search-forward "^$" nil t) - (setf (request-response--raw-header response) - (buffer-substring (point-min) (point))) - (request-log 'trace "request--cut-header: cutting\n%s" - (buffer-substring (point-min) (min (1+ (point)) (point-max)))) - (delete-region (point-min) (min (1+ (point)) (point-max)))))))) - -(defun request-untrampify-filename (file) - "Return FILE as the local file name." - (or (file-remote-p file 'localname) file)) - -(defun request--parse-data (response encoding parser) - "For buffer held by RESPONSE, first decode via user's ENCODING elective, -then send to PARSER." - (let ((buffer (request-response--buffer response))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (request-log 'trace "request--parse-data: %s" (buffer-string)) - (unless (eq (request-response-status-code response) 204) - (recode-region (point-min) (point-max) encoding 'no-conversion) - (goto-char (point-min)) - (setf (request-response-data response) - (if parser (funcall parser) (buffer-string)))))))) - -(defsubst request-url-file-p (url) - "Return non-nil if URL looks like a file URL." - (let ((scheme (and (stringp url) (url-type (url-generic-parse-url url))))) - (and (stringp scheme) - (not (string-match-p "^http" scheme))))) - -(cl-defun request--callback (buffer - &key - parser success error complete - status-code response - encoding - &allow-other-keys) - (request-log 'debug "request--callback: UNPARSED\n%s" - (when (buffer-live-p buffer) - (with-current-buffer buffer (buffer-string)))) - - ;; Sometimes BUFFER given as the argument is different from the - ;; buffer already set in RESPONSE. That's why it is reset here. - ;; FIXME: Refactor how BUFFER is passed around. - (setf (request-response--buffer response) buffer) - (request-response--cancel-timer response) - (cl-symbol-macrolet - ((error-thrown (request-response-error-thrown response)) - (symbol-status (request-response-symbol-status response)) - (data (request-response-data response)) - (done-p (request-response-done-p response))) - (let* ((response-url (request-response-url response)) - (curl-file-p (and (eq (request-response--backend response) 'curl) - (request-url-file-p response-url)))) - (unless curl-file-p - (request--clean-header response) - (request--cut-header response))) - - ;; Parse response even if `error-thrown' is set, e.g., timeout - (condition-case err - (request--parse-data response encoding parser) - (error (unless error-thrown (setq error-thrown err)) - (unless symbol-status (setq symbol-status 'parse-error)))) - (kill-buffer buffer) - - ;; Ensuring `symbol-status' and `error-thrown' are consistent - ;; is why we should get rid of `symbol-status' - ;; (but downstream apps might ill-advisedly rely on it). - (if error-thrown - (progn - (request-log 'error "request--callback: %s" - (error-message-string error-thrown)) - (unless symbol-status (setq symbol-status 'error))) - (unless symbol-status (setq symbol-status 'success)) - (request-log 'debug "request--callback: PARSED\n%s" data)) - - (let ((args (list :data data - :symbol-status symbol-status - :error-thrown error-thrown - :response response))) - (let* ((success-p (eq symbol-status 'success)) - (cb (if success-p success error)) - (name (if success-p "success" "error"))) - (when cb - (request-log 'debug "request--callback: executing %s" name) - (request--safe-apply cb args))) - - (let ((cb (cdr (assq (request-response-status-code response) - status-code)))) - (when cb - (request-log 'debug "request--callback: executing status-code") - (request--safe-apply cb args))) - - (when complete - (request-log 'debug "request--callback: executing complete") - (request--safe-apply complete args))) - - (setq done-p t) - - ;; Remove temporary files - ;; FIXME: Make tempfile cleanup more reliable. It is possible - ;; callback is never called. - (request--safe-delete-files (request-response--tempfiles response)))) - -(cl-defun request-response--timeout-callback (response) - (setf (request-response-symbol-status response) 'timeout) - (setf (request-response-error-thrown response) '(error . ("Timeout"))) - (let* ((buffer (request-response--buffer response)) - (proc (and (buffer-live-p buffer) (get-buffer-process buffer)))) - (if proc - ;; This will call `request--callback': - (funcall (request--choose-backend 'terminate-process) proc) - (cl-symbol-macrolet ((done-p (request-response-done-p response))) - (unless done-p - (when (buffer-live-p buffer) - (cl-destructuring-bind (&key code &allow-other-keys) - (with-current-buffer buffer - (goto-char (point-min)) - (request--parse-response-at-point)) - (setf (request-response-status-code response) code))) - (apply #'request--callback - buffer - (request-response-settings response)) - (setq done-p t)))))) - -(defun request-response--cancel-timer (response) - (cl-symbol-macrolet ((timer (request-response--timer response))) - (when timer - (cancel-timer timer) - (setq timer nil)))) - - -(defun request-abort (response) - "Abort request for RESPONSE (the object returned by `request'). -Note that this function invoke ERROR and COMPLETE callbacks. -Callbacks may not be called immediately but called later when -associated process is exited." - (cl-symbol-macrolet ((buffer (request-response--buffer response)) - (symbol-status (request-response-symbol-status response)) - (done-p (request-response-done-p response))) - (let ((process (get-buffer-process buffer))) - (unless symbol-status ; should I use done-p here? - (setq symbol-status 'abort) - (setq done-p t) - (when (and - (processp process) ; process can be nil when buffer is killed - (request--process-live-p process)) - (funcall (request--choose-backend 'terminate-process) process)))))) - - -;;; Backend: `url-retrieve' - -(cl-defun request--url-retrieve-preprocess-settings - (&rest settings &key type data files headers &allow-other-keys) - (when files - (error "`url-retrieve' backend does not support FILES.")) - (when (and (equal type "POST") - data - (not (assoc-string "Content-Type" headers t))) - (push '("Content-Type" . "application/x-www-form-urlencoded") headers) - (setq settings (plist-put settings :headers headers))) - settings) - -(cl-defun request--url-retrieve (url &rest settings - &key type data timeout response - &allow-other-keys - &aux headers) - (setq settings (apply #'request--url-retrieve-preprocess-settings settings)) - (setq headers (plist-get settings :headers)) - (let* ((url-request-extra-headers headers) - (url-request-method type) - (url-request-data data) - (buffer (url-retrieve url #'request--url-retrieve-callback - (nconc (list :response response) settings))) - (proc (get-buffer-process buffer))) - (request--install-timeout timeout response) - (setf (request-response--buffer response) buffer) - (process-put proc :request-response response) - (set-process-query-on-exit-flag proc nil))) - -(cl-defun request--url-retrieve-callback (status &rest settings - &key response url - &allow-other-keys) - (when (featurep 'url-http) - (setf (request-response-status-code response) url-http-response-status)) - (let ((redirect (plist-get status :redirect))) - (when redirect - (setf (request-response-url response) redirect))) - ;; Construct history slot - (cl-loop for v in - (cl-loop with first = t - with l = nil - for (k v) on status by 'cddr - when (eq k :redirect) - if first - do (setq first nil) - else - do (push v l) - finally do (cons url l)) - do (let ((r (make-request-response :-backend 'url-retrieve))) - (setf (request-response-url r) v) - (push r (request-response-history response)))) - - (cl-symbol-macrolet ((error-thrown (request-response-error-thrown response)) - (status-error (plist-get status :error))) - (when status-error - (request-log 'warn "request--url-retrieve-callback: %s" status-error) - (unless error-thrown - (setq error-thrown status-error)))) - - (apply #'request--callback (current-buffer) settings)) - -(cl-defun request--url-retrieve-sync (url &rest settings - &key type data timeout response - &allow-other-keys - &aux headers) - (setq settings (apply #'request--url-retrieve-preprocess-settings settings)) - (setq headers (plist-get settings :headers)) - (let* ((url-request-extra-headers headers) - (url-request-method type) - (url-request-data data) - (buffer (if timeout - (with-timeout - (timeout - (setf (request-response-symbol-status response) - 'timeout) - (setf (request-response-done-p response) t) - nil) - (url-retrieve-synchronously url)) - (url-retrieve-synchronously url)))) - (setf (request-response--buffer response) buffer) - ;; It seems there is no way to get redirects and URL here... - (when buffer - ;; Fetch HTTP response code - (with-current-buffer buffer - (goto-char (point-min)) - (cl-destructuring-bind (&key code &allow-other-keys) - (request--parse-response-at-point) - (setf (request-response-status-code response) code))) - ;; Parse response body, etc. - (apply #'request--callback buffer settings))) - response) - -(defun request--url-retrieve-get-cookies (host localpart secure) - (mapcar - (lambda (c) (cons (url-cookie-name c) (url-cookie-value c))) - (url-cookie-retrieve host localpart secure))) - - -;;; Backend: curl - -(defvar request--curl-cookie-jar nil - "Override what the function `request--curl-cookie-jar' returns. -Currently it is used only for testing.") - -(defun request--curl-cookie-jar () - "Cookie storage for curl backend." - (or request--curl-cookie-jar - (expand-file-name "curl-cookie-jar" request-storage-directory))) - -(defvar request--curl-capabilities-cache - (make-hash-table :test 'eq :weakness 'key) - "Used to avoid invoking curl more than once for version info. By skeeto/elfeed.") - -(defun request--curl-capabilities () - "Return capabilities plist for curl. By skeeto/elfeed. -:version -- cURL's version string -:compression -- non-nil if --compressed is supported." - (let ((cache-value (gethash request-curl request--curl-capabilities-cache))) - (if cache-value - cache-value - (with-temp-buffer - (call-process request-curl nil t nil "--version") - (let ((version - (progn - (setf (point) (point-min)) - (when (re-search-forward "[.0-9]+" nil t) - (match-string 0)))) - (compression - (progn - (setf (point) (point-min)) - (not (null (re-search-forward "libz\\>" nil t)))))) - (setf (gethash request-curl request--curl-capabilities-cache) - `(:version ,version :compression ,compression))))))) - -(defconst request--curl-write-out-template - (if (eq system-type 'windows-nt) - "\\n(:num-redirects %{num_redirects} :url-effective %{url_effective})" - "\\n(:num-redirects %{num_redirects} :url-effective \"%{url_effective}\")")) - -(defun request--curl-mkdir-for-cookie-jar () - (ignore-errors - (make-directory (file-name-directory (request--curl-cookie-jar)) t))) - -(cl-defun request--curl-command - (url &key type data headers response files* unix-socket encoding auth - &allow-other-keys - &aux (cookie-jar (convert-standard-filename - (expand-file-name (request--curl-cookie-jar))))) - "BUG: Simultaneous requests are a known cause of cookie-jar corruption." - (append - (list request-curl - "--silent" "--location" - "--cookie" cookie-jar "--cookie-jar" cookie-jar) - (when auth - (let* ((host (url-host (url-generic-parse-url url))) - (auth-source-creation-prompts `((user . ,(format "%s user: " host)) - (secret . "Password for %u: "))) - (cred (car (auth-source-search - :host host :require '(:user :secret) :create t :max 1)))) - (split-string (format "--%s --user %s:%s" - auth - (plist-get cred :user) - (let ((secret (plist-get cred :secret))) - (if (functionp secret) - (funcall secret) - secret)))))) - (unless (request-url-file-p url) - (list "--include" "--write-out" request--curl-write-out-template)) - request-curl-options - (when (plist-get (request--curl-capabilities) :compression) (list "--compressed")) - (when unix-socket (list "--unix-socket" unix-socket)) - (cl-loop for (name filename path mime-type) in files* - collect "--form" - collect (format "%s=@%s;filename=%s%s" name - (request-untrampify-filename path) filename - (if mime-type - (format ";type=%s" mime-type) - ""))) - (when data - (let ((tempfile (request--make-temp-file))) - (push tempfile (request-response--tempfiles response)) - ;; We dynamic-let the global `buffer-file-coding-system' to `no-conversion' - ;; in case the user-configured `encoding' doesn't fly. - ;; If we do not dynamic-let the global, `select-safe-coding-system' would - ;; plunge us into an undesirable interactive dialogue. - (let ((buffer-file-coding-system-orig - (default-value 'buffer-file-coding-system)) - (select-safe-coding-system-accept-default-p - (lambda (&rest _) t))) - (unwind-protect - (progn - (setf (default-value 'buffer-file-coding-system) 'no-conversion) - (with-temp-file tempfile - (setq-local buffer-file-coding-system encoding) - (insert data))) - (setf (default-value 'buffer-file-coding-system) - buffer-file-coding-system-orig))) - (list "--data-binary" (concat "@" (request-untrampify-filename tempfile))))) - (when type (list "--request" type)) - (cl-loop for (k . v) in headers - collect "--header" - collect (format "%s: %s" k v)) - (list url))) - -(defun request--curl-normalize-files-1 (files get-temp-file) - (cl-loop for (name . item) in files - collect - (cl-destructuring-bind - (filename &key file buffer data mime-type) - (cond - ((stringp item) (list (file-name-nondirectory item) :file item)) - ((bufferp item) (list (buffer-name item) :buffer item)) - (t item)) - (unless (= (cl-loop for v in (list file buffer data) if v sum 1) 1) - (error "Only one of :file/:buffer/:data must be given. Got: %S" - (cons name item))) - (cond - (file - (list name filename file mime-type)) - (buffer - (let ((tf (funcall get-temp-file))) - (with-current-buffer buffer - (write-region (point-min) (point-max) tf nil 'silent)) - (list name filename tf mime-type))) - (data - (let ((tf (funcall get-temp-file))) - (with-temp-buffer - (erase-buffer) - (insert data) - (write-region (point-min) (point-max) tf nil 'silent)) - (list name filename tf mime-type))))))) - - -(declare-function tramp-get-remote-tmpdir "tramp") -(declare-function tramp-dissect-file-name "tramp") - -(defun request--make-temp-file () - "Create a temporary file." - (if (file-remote-p default-directory) - (let ((temporary-file-directory - (tramp-get-remote-tmpdir (tramp-dissect-file-name default-directory)))) - (make-temp-file request-temp-prefix)) - (make-temp-file request-temp-prefix))) - -(defun request--curl-normalize-files (files) - "Change FILES into a list of (NAME FILENAME PATH MIME-TYPE). -This is to make `request--curl-command' cleaner by converting -FILES to a homogeneous list. It returns a list (FILES* TEMPFILES) -where FILES* is a converted FILES and TEMPFILES is a list of -temporary file paths." - (let (tempfiles noerror) - (unwind-protect - (let* ((get-temp-file (lambda () - (let ((tf (request--make-temp-file))) - (push tf tempfiles) - tf))) - (files* (request--curl-normalize-files-1 files get-temp-file))) - (setq noerror t) - (list files* tempfiles)) - (unless noerror - ;; Remove temporary files only when an error occurs - (request--safe-delete-files tempfiles))))) - -(defun request--safe-delete-files (files) - "Remove FILES but do not raise error when failed to do so." - (mapc (lambda (f) (condition-case err - (delete-file f) - (error (request-log 'error - "request--safe-delete-files: %s %s" - f (error-message-string err))))) - files)) - -(defun request--install-timeout (timeout response) - "Out-of-band trigger after TIMEOUT seconds to prevent hangs." - (when (numberp timeout) - (setf (request-response--timer response) - (run-at-time timeout nil - #'request-response--timeout-callback response)))) - -(defun request--curl-occlude-secret (command) - "Simple regex filter on anything looking like a secret." - (let ((matched - (string-match (concat (regexp-quote "--user") "\\s-*\\(\\S-+\\)") command))) - (if matched - (replace-match "elided" nil nil command 1) - command))) - -(cl-defun request--curl (url &rest settings - &key files timeout response encoding semaphore - &allow-other-keys) - "cURL-based request backend. - -Redirection handling strategy ------------------------------ - -curl follows redirection when --location is given. However, -all headers are printed when it is used with --include option. -Number of redirects is printed out sexp-based message using ---write-out option (see `request--curl-write-out-template'). -This number is used for removing extra headers and parse -location header from the last redirection header. - -Sexp at the end of buffer and extra headers for redirects are -removed from the buffer before it is shown to the parser function. -" - (request--curl-mkdir-for-cookie-jar) - (let* (;; Use pipe instead of pty. Otherwise, curl process hangs. - (process-connection-type nil) - ;; Avoid starting program in non-existing directory. - (home-directory (or (file-remote-p default-directory) "~/")) - (default-directory (expand-file-name home-directory)) - (buffer (generate-new-buffer " *request curl*")) - (command (cl-destructuring-bind - (files* tempfiles) - (request--curl-normalize-files files) - (setf (request-response--tempfiles response) tempfiles) - (apply #'request--curl-command url :files* files* - :response response :encoding encoding settings))) - (proc (apply #'start-process "request curl" buffer command))) - (request--install-timeout timeout response) - (request-log 'debug "request--curl: %s" - (request--curl-occlude-secret (mapconcat 'identity command " "))) - (setf (request-response--buffer response) buffer) - (process-put proc :request-response response) - (set-process-coding-system proc 'no-conversion 'no-conversion) - (set-process-query-on-exit-flag proc nil) - (let ((callback-2 (apply-partially #'request--curl-callback url))) - (if semaphore - (set-process-sentinel proc (lambda (&rest args) - (apply callback-2 args) - (apply semaphore args))) - (set-process-sentinel proc callback-2))))) - -(defun request--curl-read-and-delete-tail-info () - "Read a sexp at the end of buffer and remove it and preceding character. -This function moves the point at the end of buffer by side effect. -See also `request--curl-write-out-template'." - (let (forward-sexp-function) - (goto-char (point-max)) - (forward-sexp -1) - (let ((beg (1- (point)))) - (prog1 - (read (current-buffer)) - (delete-region beg (point-max)))))) - -(defconst request--cookie-reserved-re - (mapconcat - (lambda (x) (concat "\\(^" x "\\'\\)")) - '("comment" "commenturl" "discard" "domain" "max-age" "path" "port" - "secure" "version" "expires") - "\\|") - "Uninterested keys in cookie. -See \"set-cookie-av\" in http://www.ietf.org/rfc/rfc2965.txt") - -(defun request--consume-100-continue () - "Remove \"HTTP/* 100 Continue\" header at the point." - (cl-destructuring-bind (&key code &allow-other-keys) - (save-excursion (request--parse-response-at-point)) - (when (equal code 100) - (request-log 'debug "request--consume-100-continue: consuming\n%s" - (buffer-substring (point) - (save-excursion - (request--goto-next-body t) - (point)))) - (delete-region (point) (progn (request--goto-next-body) (point))) - ;; FIXME: Does this make sense? Is it possible to have multiple 100? - (request--consume-100-continue)))) - -(defun request--consume-200-connection-established () - "Remove \"HTTP/* 200 Connection established\" header at the point." - (when (looking-at-p "HTTP/1\\.[0-1] 200 Connection established") - (delete-region (point) (progn (request--goto-next-body) (point))))) - -(defun request--curl-preprocess (&optional url) - "Pre-process current buffer before showing it to user." - (let (history) - (cl-destructuring-bind (&key num-redirects url-effective) - (if (request-url-file-p url) - `(:num-redirects 0 :url-effective ,url) - (request--curl-read-and-delete-tail-info)) - (goto-char (point-min)) - (request--consume-100-continue) - (request--consume-200-connection-established) - (when (> num-redirects 0) - (cl-loop with case-fold-search = t - repeat num-redirects - ;; Do not store code=100 headers: - do (request--consume-100-continue) - do (let ((response (make-request-response - :-buffer (current-buffer) - :-backend 'curl))) - (request--clean-header response) - (request--cut-header response) - (push response history)))) - - (goto-char (point-min)) - (nconc (list :num-redirects num-redirects :url-effective url-effective - :history (nreverse history)) - (request--parse-response-at-point))))) - -(defun request--curl-absolutify-redirects (start-url redirects) - "Convert relative paths in REDIRECTS to absolute URLs. -START-URL is the URL requested." - (cl-loop for prev-url = start-url then url - for url in redirects - unless (string-match url-nonrelative-link url) - do (setq url (url-expand-file-name url prev-url)) - collect url)) - -(defun request--curl-absolutify-location-history (start-url history) - "Convert relative paths in HISTORY to absolute URLs. -START-URL is the URL requested." - (when history - (setf (request-response-url (car history)) start-url)) - (cl-loop for url in (request--curl-absolutify-redirects - start-url - (mapcar (lambda (response) - (or (request-response-header response "location") - (request-response-url response))) - history)) - for response in (cdr history) - do (setf (request-response-url response) url))) - -(defun request--curl-callback (url proc event) - (let* ((buffer (process-buffer proc)) - (response (process-get proc :request-response)) - (settings (request-response-settings response))) - (request-log 'debug "request--curl-callback: event %s" event) - (request-log 'trace "request--curl-callback: raw-bytes=\n%s" - (when (buffer-live-p buffer) - (with-current-buffer buffer (buffer-string)))) - (cond - ((and (memq (process-status proc) '(exit signal)) - (/= (process-exit-status proc) 0)) - (setf (request-response-error-thrown response) (cons 'error event)) - (apply #'request--callback buffer settings)) - ((cl-search "finished" event) - (cl-destructuring-bind (&key code history error url-effective &allow-other-keys) - (condition-case err - (with-current-buffer buffer - (request--curl-preprocess url)) - ((debug error) - (list :error err))) - (request--curl-absolutify-location-history (plist-get settings :url) - history) - (setf (request-response-status-code response) code) - (setf (request-response-url response) url-effective) - (setf (request-response-history response) history) - (setf (request-response-error-thrown response) - (or error (and (numberp code) (>= code 400) `(error . (http ,code))))) - (apply #'request--callback buffer settings)))))) - -(defun request-auto-revert-notify-rm-watch () - "Backport of M. Engdegard's fix of `auto-revert-notify-rm-watch'." - (let ((desc auto-revert-notify-watch-descriptor) - (table (if (boundp 'auto-revert--buffers-by-watch-descriptor) - auto-revert--buffers-by-watch-descriptor - auto-revert-notify-watch-descriptor-hash-list))) - (when desc - (let ((buffers (delq (current-buffer) (gethash desc table)))) - (if buffers - (puthash desc buffers table) - (remhash desc table))) - (condition-case nil ;; ignore-errors doesn't work for me, sorry - (file-notify-rm-watch desc) - (error)) - (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch t))) - (setq auto-revert-notify-watch-descriptor nil - auto-revert-notify-modified-p nil)) - -(cl-defun request--curl-sync (url &rest settings &key response &allow-other-keys) - (let (finished) - (prog1 (apply #'request--curl url - :semaphore (lambda (&rest _) (setq finished t)) - settings) - (let ((proc (get-buffer-process (request-response--buffer response)))) - (auto-revert-set-timer) - (when auto-revert-use-notify - (dolist (buf (buffer-list)) - (with-current-buffer buf - (request-auto-revert-notify-rm-watch)))) - (with-local-quit - (cl-loop with iter = 0 - until (or (>= iter 10) finished) - do (accept-process-output nil 0.3) - unless (request--process-live-p proc) - do (cl-incf iter) - end - finally (when (>= iter 10) - (let ((m "request--curl-sync: semaphore never called")) - (princ (format "%s\n" m) #'external-debugging-output) - (request-log 'error m))))))))) - -(defun request--curl-get-cookies (host localpart secure) - (request--netscape-get-cookies (request--curl-cookie-jar) - host localpart secure)) - - -;;; Netscape cookie.txt parser - -(defun request--netscape-cookie-parse () - "Parse Netscape/Mozilla cookie format." - (goto-char (point-min)) - (let ((tsv-re (concat "^\\(#HttpOnly_\\)?" - (cl-loop repeat 6 concat "\\([^\t\n]+\\)\t") - "\\(.*\\)")) - cookies) - (while (not (eobp)) - ;; HttpOnly cookie starts with '#' but its line is not comment line(#60) - (cond ((and (looking-at-p "^#") (not (looking-at-p "^#HttpOnly_"))) t) - ((looking-at-p "^$") t) - ((looking-at tsv-re) - (let ((cookie (cl-loop for i from 1 to 8 collect (match-string i)))) - (push cookie cookies)))) - (forward-line 1)) - (setq cookies (nreverse cookies)) - (cl-loop for (http-only domain flag path secure expiration name value) in cookies - collect (list domain - (equal flag "TRUE") - path - (equal secure "TRUE") - (null (not http-only)) - (string-to-number expiration) - name - value)))) - -(defun request--netscape-filter-cookies (cookies host localpart secure) - (cl-loop for (domain _flag path secure-1 _http-only _expiration name value) in cookies - when (and (equal domain host) - (equal path localpart) - (or secure (not secure-1))) - collect (cons name value))) - -(defun request--netscape-get-cookies (filename host localpart secure) - (when (file-readable-p filename) - (with-temp-buffer - (erase-buffer) - (insert-file-contents filename) - (request--netscape-filter-cookies (request--netscape-cookie-parse) - host localpart secure)))) - -(provide 'request) - -;;; request.el ends here diff --git a/elpa/request-20200219.2257/request.elc b/elpa/request-20200219.2257/request.elc deleted file mode 100644 index d80f470d1cb3d41d1db3393d6a88229d39fa0876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69406 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 T24@SfGT$ooVMrdgIQ#zr6621c diff --git a/elpa/restclient-20191009.1208/restclient-autoloads.el b/elpa/restclient-20191009.1208/restclient-autoloads.el deleted file mode 100644 index 2a86a2b7..00000000 --- a/elpa/restclient-20191009.1208/restclient-autoloads.el +++ /dev/null @@ -1,44 +0,0 @@ -;;; restclient-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "restclient" "restclient.el" (0 0 0 0)) -;;; Generated autoloads from restclient.el - -(autoload 'restclient-http-send-current "restclient" "\ -Sends current request. -Optional argument RAW don't reformat response if t. -Optional argument STAY-IN-WINDOW do not move focus to response buffer if t. - -\(fn &optional RAW STAY-IN-WINDOW)" t nil) - -(autoload 'restclient-http-send-current-raw "restclient" "\ -Sends current request and get raw result (no reformatting or syntax highlight of XML, JSON or images). - -\(fn)" t nil) - -(autoload 'restclient-http-send-current-stay-in-window "restclient" "\ -Send current request and keep focus in request window. - -\(fn)" t nil) - -(autoload 'restclient-mode "restclient" "\ -Turn on restclient mode. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "restclient" '("restclient-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; restclient-autoloads.el ends here diff --git a/elpa/restclient-20191009.1208/restclient-pkg.el b/elpa/restclient-20191009.1208/restclient-pkg.el deleted file mode 100644 index 71551096..00000000 --- a/elpa/restclient-20191009.1208/restclient-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "restclient" "20191009.1208" "An interactive HTTP client for Emacs" 'nil :commit "e8ca809ace13549a1ddffb4e4aaa5d5fce750f3d" :keywords '("http") :authors '(("Pavel Kurnosov" . "pashky@gmail.com")) :maintainer '("Pavel Kurnosov" . "pashky@gmail.com")) diff --git a/elpa/restclient-20191009.1208/restclient.el b/elpa/restclient-20191009.1208/restclient.el deleted file mode 100644 index 0dc02b29..00000000 --- a/elpa/restclient-20191009.1208/restclient.el +++ /dev/null @@ -1,631 +0,0 @@ -;;; restclient.el --- An interactive HTTP client for Emacs -;; -;; Public domain. - -;; Author: Pavel Kurnosov -;; Maintainer: Pavel Kurnosov -;; Created: 01 Apr 2012 -;; Keywords: http -;; Package-Version: 20191009.1208 - -;; This file is not part of GNU Emacs. -;; This file is public domain software. Do what you want. - -;;; Commentary: -;; -;; This is a tool to manually explore and test HTTP REST -;; webservices. Runs queries from a plain-text query sheet, displays -;; results as a pretty-printed XML, JSON and even images. - -;;; Code: -;; -(require 'url) -(require 'json) -(require 'outline) - -(defgroup restclient nil - "An interactive HTTP client for Emacs." - :group 'tools) - -(defcustom restclient-log-request t - "Log restclient requests to *Messages*." - :group 'restclient - :type 'boolean) - -(defcustom restclient-same-buffer-response t - "Re-use same buffer for responses or create a new one each time." - :group 'restclient - :type 'boolean) - -(defcustom restclient-same-buffer-response-name "*HTTP Response*" - "Name for response buffer." - :group 'restclient - :type 'string) - -(defcustom restclient-inhibit-cookies nil - "Inhibit restclient from sending cookies implicitly." - :group 'restclient - :type 'boolean) - -(defcustom restclient-content-type-modes '(("text/xml" . xml-mode) - ("text/plain" . text-mode) - ("application/xml" . xml-mode) - ("application/json" . js-mode) - ("image/png" . image-mode) - ("image/jpeg" . image-mode) - ("image/jpg" . image-mode) - ("image/gif" . image-mode) - ("text/html" . html-mode)) - "An association list mapping content types to buffer modes" - :group 'restclient - :type '(alist :key-type string :value-type symbol)) - -(defgroup restclient-faces nil - "Faces used in Restclient Mode" - :group 'restclient - :group 'faces) - -(defface restclient-variable-name-face - '((t (:inherit font-lock-preprocessor-face))) - "Face for variable name." - :group 'restclient-faces) - -(defface restclient-variable-string-face - '((t (:inherit font-lock-string-face))) - "Face for variable value (string)." - :group 'restclient-faces) - -(defface restclient-variable-elisp-face - '((t (:inherit font-lock-function-name-face))) - "Face for variable value (Emacs lisp)." - :group 'restclient-faces) - -(defface restclient-variable-multiline-face - '((t (:inherit font-lock-doc-face))) - "Face for multi-line variable value marker." - :group 'restclient-faces) - -(defface restclient-variable-usage-face - '((t (:inherit restclient-variable-name-face))) - "Face for variable usage (only used when headers/body is represented as a single variable, not highlighted when variable appears in the middle of other text)." - :group 'restclient-faces) - -(defface restclient-method-face - '((t (:inherit font-lock-keyword-face))) - "Face for HTTP method." - :group 'restclient-faces) - -(defface restclient-url-face - '((t (:inherit font-lock-function-name-face))) - "Face for variable value (Emacs lisp)." - :group 'restclient-faces) - -(defface restclient-file-upload-face - '((t (:inherit restclient-variable-multiline-face))) - "Face for highlighting upload file paths." - :group 'restclient-faces) - -(defface restclient-header-name-face - '((t (:inherit font-lock-variable-name-face))) - "Face for HTTP header name." - :group 'restclient-faces) - -(defface restclient-header-value-face - '((t (:inherit font-lock-string-face))) - "Face for HTTP header value." - :group 'restclient-faces) - -(defvar restclient-within-call nil) - -(defvar restclient-request-time-start nil) -(defvar restclient-request-time-end nil) - -(defvar restclient-response-loaded-hook nil - "Hook run after response buffer is formatted.") - -(defvar restclient-http-do-hook nil - "Hook to run before making request.") - -(defvar restclient-response-received-hook nil - "Hook run after data is loaded into response buffer.") - -(defcustom restclient-vars-max-passes 10 - "Maximum number of recursive variable references. This is to prevent hanging if two variables reference each other directly or indirectly." - :group 'restclient - :type 'integer) - -(defconst restclient-comment-separator "#") -(defconst restclient-comment-start-regexp (concat "^" restclient-comment-separator)) -(defconst restclient-comment-not-regexp (concat "^[^" restclient-comment-separator "]")) -(defconst restclient-empty-line-regexp "^\\s-*$") - -(defconst restclient-method-url-regexp - "^\\(GET\\|POST\\|DELETE\\|PUT\\|HEAD\\|OPTIONS\\|PATCH\\) \\(.*\\)$") - -(defconst restclient-header-regexp - "^\\([^](),/:;@[\\{}= \t]+\\): \\(.*\\)$") - -(defconst restclient-use-var-regexp - "^\\(:[^: \n]+\\)$") - -(defconst restclient-var-regexp - (concat "^\\(:[^:= ]+\\)[ \t]*\\(:?\\)=[ \t]*\\(<<[ \t]*\n\\(\\(.*\n\\)*?\\)" restclient-comment-separator "\\|\\([^<].*\\)$\\)")) - -(defconst restclient-svar-regexp - "^\\(:[^:= ]+\\)[ \t]*=[ \t]*\\(.+?\\)$") - -(defconst restclient-evar-regexp - "^\\(:[^: ]+\\)[ \t]*:=[ \t]*\\(.+?\\)$") - -(defconst restclient-mvar-regexp - "^\\(:[^: ]+\\)[ \t]*:?=[ \t]*\\(<<\\)[ \t]*$") - -(defconst restclient-file-regexp - "^<[ \t]*\\([^<>\n\r]+\\)[ \t]*$") - -(defconst restclient-content-type-regexp - "^Content-[Tt]ype: \\(\\w+\\)/\\(?:[^\\+\r\n]*\\+\\)*\\([^;\r\n]+\\)") - -;; The following disables the interactive request for user name and -;; password should an API call encounter a permission-denied response. -;; This API is meant to be usable without constant asking for username -;; and password. -(defadvice url-http-handle-authentication (around restclient-fix) - (if restclient-within-call - (setq ad-return-value t) - ad-do-it)) -(ad-activate 'url-http-handle-authentication) - -(defadvice url-cache-extract (around restclient-fix-2) - (unless restclient-within-call - ad-do-it)) -(ad-activate 'url-cache-extract) - -(defadvice url-http-user-agent-string (around restclient-fix-3) - (if restclient-within-call - (setq ad-return-value nil) - ad-do-it)) -(ad-activate 'url-http-user-agent-string) - -(defun restclient-http-do (method url headers entity &rest handle-args) - "Send ENTITY and HEADERS to URL as a METHOD request." - (if restclient-log-request - (message "HTTP %s %s Headers:[%s] Body:[%s]" method url headers entity)) - (let ((url-request-method (encode-coding-string method 'us-ascii)) - (url-request-extra-headers '()) - (url-request-data (encode-coding-string entity 'utf-8)) - (url-mime-charset-string (url-mime-charset-string)) - (url-mime-language-string nil) - (url-mime-encoding-string nil) - (url-mime-accept-string nil) - (url-personal-mail-address nil)) - - (dolist (header headers) - (let* ((mapped (assoc-string (downcase (car header)) - '(("from" . url-personal-mail-address) - ("accept-encoding" . url-mime-encoding-string) - ("accept-charset" . url-mime-charset-string) - ("accept-language" . url-mime-language-string) - ("accept" . url-mime-accept-string))))) - - (if mapped - (set (cdr mapped) (encode-coding-string (cdr header) 'us-ascii)) - (let* ((hkey (encode-coding-string (car header) 'us-ascii)) - (hvalue (encode-coding-string (cdr header) 'us-ascii))) - (setq url-request-extra-headers (cons (cons hkey hvalue) url-request-extra-headers)))))) - - (setq restclient-within-call t) - (setq restclient-request-time-start (current-time)) - (run-hooks 'restclient-http-do-hook) - (url-retrieve url 'restclient-http-handle-response - (append (list method url (if restclient-same-buffer-response - restclient-same-buffer-response-name - (format "*HTTP %s %s*" method url))) handle-args) nil restclient-inhibit-cookies))) - -(defun restclient-prettify-response (method url) - (save-excursion - (let ((start (point)) (guessed-mode) (end-of-headers)) - (while (and (not (looking-at restclient-empty-line-regexp)) - (eq (progn - (when (looking-at restclient-content-type-regexp) - (setq guessed-mode - (cdr (assoc-string (concat - (match-string-no-properties 1) - "/" - (match-string-no-properties 2)) - restclient-content-type-modes - t)))) - (forward-line)) 0))) - (setq end-of-headers (point)) - (while (and (looking-at restclient-empty-line-regexp) - (eq (forward-line) 0))) - (unless guessed-mode - (setq guessed-mode - (or (assoc-default nil - ;; magic mode matches - '(("<\\?xml " . xml-mode) - ("{\\s-*\"" . js-mode)) - (lambda (re _dummy) - (looking-at re))) 'js-mode))) - (let ((headers (buffer-substring-no-properties start end-of-headers))) - (when guessed-mode - (delete-region start (point)) - (unless (eq guessed-mode 'image-mode) - (apply guessed-mode '()) - (if (fboundp 'font-lock-flush) - (font-lock-flush) - (with-no-warnings - (font-lock-fontify-buffer)))) - - (cond - ((eq guessed-mode 'xml-mode) - (goto-char (point-min)) - (while (search-forward-regexp "\>[ \\t]*\<" nil t) - (backward-char) (insert "\n")) - (indent-region (point-min) (point-max))) - - ((eq guessed-mode 'image-mode) - (let* ((img (buffer-string))) - (delete-region (point-min) (point-max)) - (fundamental-mode) - (insert-image (create-image img nil t)))) - - ((eq guessed-mode 'js-mode) - (let ((json-special-chars (remq (assoc ?/ json-special-chars) json-special-chars)) - ;; Emacs 27 json.el uses `replace-buffer-contents' for - ;; pretty-printing which is great because it keeps point and - ;; markers intact but can be very slow with huge minimalized - ;; JSON. We don't need that here. - (json-pretty-print-max-secs 0)) - (ignore-errors (json-pretty-print-buffer))) - (restclient-prettify-json-unicode))) - - (goto-char (point-max)) - (or (eq (point) (point-min)) (insert "\n")) - (let ((hstart (point))) - (insert method " " url "\n" headers) - (insert (format "Request duration: %fs\n" (float-time (time-subtract restclient-request-time-end restclient-request-time-start)))) - (unless (member guessed-mode '(image-mode text-mode)) - (comment-region hstart (point))))))))) - -(defun restclient-prettify-json-unicode () - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "\\\\[Uu]\\([0-9a-fA-F]\\{4\\}\\)" nil t) - (replace-match (char-to-string (decode-char 'ucs (string-to-number (match-string 1) 16))) t nil)))) - -(defun restclient-http-handle-response (status method url bufname raw stay-in-window) - "Switch to the buffer returned by `url-retreive'. -The buffer contains the raw HTTP response sent by the server." - (setq restclient-within-call nil) - (setq restclient-request-time-end (current-time)) - (if (= (point-min) (point-max)) - (signal (car (plist-get status :error)) (cdr (plist-get status :error))) - (when (buffer-live-p (current-buffer)) - (with-current-buffer (restclient-decode-response - (current-buffer) - bufname - restclient-same-buffer-response) - (run-hooks 'restclient-response-received-hook) - (unless raw - (restclient-prettify-response method url)) - (buffer-enable-undo) - (restclient-response-mode) - (run-hooks 'restclient-response-loaded-hook) - (if stay-in-window - (display-buffer (current-buffer) t) - (switch-to-buffer-other-window (current-buffer))))))) - -(defun restclient-decode-response (raw-http-response-buffer target-buffer-name same-name) - "Decode the HTTP response using the charset (encoding) specified in the Content-Type header. If no charset is specified, default to UTF-8." - (let* ((charset-regexp "^Content-Type.*charset=\\([-A-Za-z0-9]+\\)") - (image? (save-excursion - (search-forward-regexp "^Content-Type.*[Ii]mage" nil t))) - (encoding (if (save-excursion - (search-forward-regexp charset-regexp nil t)) - (intern (downcase (match-string 1))) - 'utf-8))) - (if image? - ;; Dont' attempt to decode. Instead, just switch to the raw HTTP response buffer and - ;; rename it to target-buffer-name. - (with-current-buffer raw-http-response-buffer - ;; We have to kill the target buffer if it exists, or `rename-buffer' - ;; will raise an error. - (when (get-buffer target-buffer-name) - (kill-buffer target-buffer-name)) - (rename-buffer target-buffer-name) - raw-http-response-buffer) - ;; Else, switch to the new, empty buffer that will contain the decoded HTTP - ;; response. Set its encoding, copy the content from the unencoded - ;; HTTP response buffer and decode. - (let ((decoded-http-response-buffer - (get-buffer-create - (if same-name target-buffer-name (generate-new-buffer-name target-buffer-name))))) - (with-current-buffer decoded-http-response-buffer - (setq buffer-file-coding-system encoding) - (save-excursion - (erase-buffer) - (insert-buffer-substring raw-http-response-buffer)) - (kill-buffer raw-http-response-buffer) - (condition-case nil - (decode-coding-region (point-min) (point-max) encoding) - (error - (message (concat "Error when trying to decode http response with encoding: " - (symbol-name encoding))))) - decoded-http-response-buffer))))) - -(defun restclient-current-min () - (save-excursion - (beginning-of-line) - (if (looking-at restclient-comment-start-regexp) - (if (re-search-forward restclient-comment-not-regexp (point-max) t) - (point-at-bol) (point-max)) - (if (re-search-backward restclient-comment-start-regexp (point-min) t) - (point-at-bol 2) - (point-min))))) - -(defun restclient-current-max () - (save-excursion - (if (re-search-forward restclient-comment-start-regexp (point-max) t) - (max (- (point-at-bol) 1) 1) - (progn (goto-char (point-max)) - (if (looking-at "^$") (- (point) 1) (point)))))) - -(defun restclient-replace-all-in-string (replacements string) - (if replacements - (let ((current string) - (pass restclient-vars-max-passes) - (continue t)) - (while (and continue (> pass 0)) - (setq pass (- pass 1)) - (setq current (replace-regexp-in-string (regexp-opt (mapcar 'car replacements)) - (lambda (key) - (setq continue t) - (cdr (assoc key replacements))) - current t t))) - current) - string)) - -(defun restclient-replace-all-in-header (replacements header) - (cons (car header) - (restclient-replace-all-in-string replacements (cdr header)))) - -(defun restclient-chop (text) - (if text (replace-regexp-in-string "\n$" "" text) nil)) - -(defun restclient-find-vars-before-point () - (let ((vars nil) - (bound (point))) - (save-excursion - (goto-char (point-min)) - (while (search-forward-regexp restclient-var-regexp bound t) - (let ((name (match-string-no-properties 1)) - (should-eval (> (length (match-string 2)) 0)) - (value (or (restclient-chop (match-string-no-properties 4)) (match-string-no-properties 3)))) - (setq vars (cons (cons name (if should-eval (restclient-eval-var value) value)) vars)))) - vars))) - -(defun restclient-eval-var (string) - (with-output-to-string (princ (eval (read string))))) - -(defun restclient-make-header (&optional string) - (cons (match-string-no-properties 1 string) - (match-string-no-properties 2 string))) - -(defun restclient-parse-headers (string) - (let ((start 0) - (headers '())) - (while (string-match restclient-header-regexp string start) - (setq headers (cons (restclient-make-header string) headers) - start (match-end 0))) - headers)) - -(defun restclient-read-file (path) - (with-temp-buffer - (insert-file-contents path) - (buffer-string))) - -(defun restclient-parse-body (entity vars) - (if (= 0 (or (string-match restclient-file-regexp entity) 1)) - (restclient-read-file (match-string 1 entity)) - (restclient-replace-all-in-string vars entity))) - -(defun restclient-http-parse-current-and-do (func &rest args) - (save-excursion - (goto-char (restclient-current-min)) - (when (re-search-forward restclient-method-url-regexp (point-max) t) - (let ((method (match-string-no-properties 1)) - (url (match-string-no-properties 2)) - (vars (restclient-find-vars-before-point)) - (headers '())) - (forward-line) - (while (cond - ((and (looking-at restclient-header-regexp) (not (looking-at restclient-empty-line-regexp))) - (setq headers (cons (restclient-replace-all-in-header vars (restclient-make-header)) headers))) - ((looking-at restclient-use-var-regexp) - (setq headers (append headers (restclient-parse-headers (restclient-replace-all-in-string vars (match-string 1))))))) - (forward-line)) - (when (looking-at restclient-empty-line-regexp) - (forward-line)) - (let* ((cmax (restclient-current-max)) - (entity (restclient-parse-body (buffer-substring (min (point) cmax) cmax) vars)) - (url (restclient-replace-all-in-string vars url))) - (apply func method url headers entity args)))))) - -(defun restclient-copy-curl-command () - "Formats the request as a curl command and copies the command to the clipboard." - (interactive) - (restclient-http-parse-current-and-do - '(lambda (method url headers entity) - (let ((header-args - (apply 'append - (mapcar (lambda (header) - (list "-H" (format "%s: %s" (car header) (cdr header)))) - headers)))) - (kill-new (concat "curl " - (mapconcat 'shell-quote-argument - (append '("-i") - header-args - (list (concat "-X" method)) - (list url) - (when (> (string-width entity) 0) - (list "-d" entity))) - " ")))) - (message "curl command copied to clipboard.")))) - -;;;###autoload -(defun restclient-http-send-current (&optional raw stay-in-window) - "Sends current request. -Optional argument RAW don't reformat response if t. -Optional argument STAY-IN-WINDOW do not move focus to response buffer if t." - (interactive) - (restclient-http-parse-current-and-do 'restclient-http-do raw stay-in-window)) - -;;;###autoload -(defun restclient-http-send-current-raw () - "Sends current request and get raw result (no reformatting or syntax highlight of XML, JSON or images)." - (interactive) - (restclient-http-send-current t)) - -;;;###autoload -(defun restclient-http-send-current-stay-in-window () - "Send current request and keep focus in request window." - (interactive) - (restclient-http-send-current nil t)) - -(defun restclient-jump-next () - "Jump to next request in buffer." - (interactive) - (let ((last-min nil)) - (while (not (eq last-min (goto-char (restclient-current-min)))) - (goto-char (restclient-current-min)) - (setq last-min (point)))) - (goto-char (+ (restclient-current-max) 1)) - (goto-char (restclient-current-min))) - -(defun restclient-jump-prev () - "Jump to previous request in buffer." - (interactive) - (let* ((current-min (restclient-current-min)) - (end-of-entity - (save-excursion - (progn (goto-char (restclient-current-min)) - (while (and (or (looking-at "^\s*\\(#.*\\)?$") - (eq (point) current-min)) - (not (eq (point) (point-min)))) - (forward-line -1) - (beginning-of-line)) - (point))))) - (unless (eq (point-min) end-of-entity) - (goto-char end-of-entity) - (goto-char (restclient-current-min))))) - -(defun restclient-mark-current () - "Mark current request." - (interactive) - (goto-char (restclient-current-min)) - (set-mark-command nil) - (goto-char (restclient-current-max)) - (backward-char 1) - (setq deactivate-mark nil)) - -(defun restclient-narrow-to-current () - "Narrow to region of current request" - (interactive) - (narrow-to-region (restclient-current-min) (restclient-current-max))) - -(defun restclient-toggle-body-visibility () - (interactive) - ;; If we are not on the HTTP call line, don't do anything - (let ((at-header (save-excursion - (beginning-of-line) - (looking-at restclient-method-url-regexp)))) - (when at-header - (save-excursion - (end-of-line) - ;; If the overlays at this point have 'invisible set, toggling - ;; must make the region visible. Else it must hide the region - - ;; This part of code is from org-hide-block-toggle method of - ;; Org mode - (let ((overlays (overlays-at (point)))) - (if (memq t (mapcar - (lambda (o) - (eq (overlay-get o 'invisible) 'outline)) - overlays)) - (outline-flag-region (point) (restclient-current-max) nil) - (outline-flag-region (point) (restclient-current-max) t)))) t))) - -(defun restclient-toggle-body-visibility-or-indent () - (interactive) - (unless (restclient-toggle-body-visibility) - (indent-for-tab-command))) - -(defconst restclient-mode-keywords - (list (list restclient-method-url-regexp '(1 'restclient-method-face) '(2 'restclient-url-face)) - (list restclient-svar-regexp '(1 'restclient-variable-name-face) '(2 'restclient-variable-string-face)) - (list restclient-evar-regexp '(1 'restclient-variable-name-face) '(2 'restclient-variable-elisp-face t)) - (list restclient-mvar-regexp '(1 'restclient-variable-name-face) '(2 'restclient-variable-multiline-face t)) - (list restclient-use-var-regexp '(1 'restclient-variable-usage-face)) - (list restclient-file-regexp '(0 'restclient-file-upload-face)) - (list restclient-header-regexp '(1 'restclient-header-name-face t) '(2 'restclient-header-value-face t)) - )) - -(defconst restclient-mode-syntax-table - (let ((table (make-syntax-table))) - (modify-syntax-entry ?\# "<" table) - (modify-syntax-entry ?\n ">#" table) - table)) - -(defvar restclient-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-c C-c") 'restclient-http-send-current) - (define-key map (kbd "C-c C-r") 'restclient-http-send-current-raw) - (define-key map (kbd "C-c C-v") 'restclient-http-send-current-stay-in-window) - (define-key map (kbd "C-c C-n") 'restclient-jump-next) - (define-key map (kbd "C-c C-p") 'restclient-jump-prev) - (define-key map (kbd "C-c C-.") 'restclient-mark-current) - (define-key map (kbd "C-c C-u") 'restclient-copy-curl-command) - (define-key map (kbd "C-c n n") 'restclient-narrow-to-current) - map) - "Keymap for restclient-mode.") - -(define-minor-mode restclient-outline-mode - "Minor mode to allow show/hide of request bodies by TAB." - :init-value nil - :lighter nil - :keymap '(("\t" . restclient-toggle-body-visibility-or-indent) - ("\C-c\C-a" . restclient-toggle-body-visibility-or-indent)) - :group 'restclient) - -(define-minor-mode restclient-response-mode - "Minor mode to allow additional keybindings in restclient response buffer." - :init-value nil - :lighter nil - :keymap '(("q" . (lambda () - (interactive) - (quit-window (get-buffer-window (current-buffer)))))) - :group 'restclient) - -;;;###autoload -(define-derived-mode restclient-mode fundamental-mode "REST Client" - "Turn on restclient mode." - (set (make-local-variable 'comment-start) "# ") - (set (make-local-variable 'comment-start-skip) "# *") - (set (make-local-variable 'comment-column) 48) - - (set (make-local-variable 'font-lock-defaults) '(restclient-mode-keywords)) - ;; We use outline-mode's method outline-flag-region to hide/show the - ;; body. As a part of it, it sets 'invisibility text property to - ;; 'outline. To get ellipsis, we need 'outline to be in - ;; buffer-invisibility-spec - (add-to-invisibility-spec '(outline . t))) - -(add-hook 'restclient-mode-hook 'restclient-outline-mode) - -(provide 'restclient) - -(eval-after-load 'helm - '(ignore-errors (require 'restclient-helm))) - -;;; restclient.el ends here diff --git a/elpa/restclient-20191009.1208/restclient.elc b/elpa/restclient-20191009.1208/restclient.elc deleted file mode 100644 index af77516b821af4a39706ac7e0b7b623e7149e328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23927 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 MzyjQah_=rE4_vhr#Q*>R diff --git a/elpa/restclient-test-20180106.2046/restclient-test-autoloads.el b/elpa/restclient-test-20180106.2046/restclient-test-autoloads.el deleted file mode 100644 index fe23e216..00000000 --- a/elpa/restclient-test-20180106.2046/restclient-test-autoloads.el +++ /dev/null @@ -1,43 +0,0 @@ -;;; restclient-test-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "restclient-test" "restclient-test.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from restclient-test.el - -(autoload 'restclient-test-current "restclient-test" "\ -Test query at point. -When the test contains an \"Expect\" entry, return `pass' if the -test passed and `fail' if the test failed. Else return nil.' - -\(fn)" t nil) - -(autoload 'restclient-test-buffer "restclient-test" "\ -Test every query in the current buffer. - -\(fn)" t nil) - -(autoload 'restclient-test-mode "restclient-test" "\ -Minor mode with key-bindings for restclient-test commands. -With a prefix argument ARG, enable the mode if ARG is positive, -and disable it otherwise. If called from Lisp, enable the mode -if ARG is omitted or nil. - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "restclient-test" '("restclient-test-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; restclient-test-autoloads.el ends here diff --git a/elpa/restclient-test-20180106.2046/restclient-test-pkg.el b/elpa/restclient-test-20180106.2046/restclient-test-pkg.el deleted file mode 100644 index 61090a47..00000000 --- a/elpa/restclient-test-20180106.2046/restclient-test-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "restclient-test" "20180106.2046" "Run tests with restclient.el" '((emacs "24.4") (restclient "0")) :commit "4518561bc9661fedacb6fb352e9677207f45c418" :authors '(("Simen Heggestøyl" . "simenheg@gmail.com")) :maintainer '("Simen Heggestøyl" . "simenheg@gmail.com") :url "https://github.com/simenheg/restclient-test.el") diff --git a/elpa/restclient-test-20180106.2046/restclient-test.el b/elpa/restclient-test-20180106.2046/restclient-test.el deleted file mode 100644 index 1f5cb0bd..00000000 --- a/elpa/restclient-test-20180106.2046/restclient-test.el +++ /dev/null @@ -1,146 +0,0 @@ -;;; restclient-test.el --- Run tests with restclient.el -*- lexical-binding: t; -*- - -;; Copyright (C) 2016-2018 Simen Heggestøyl - -;; Author: Simen Heggestøyl -;; Created: 14 May 2016 -;; Version: 0.2 -;; Package-Version: 20180106.2046 -;; Package-Requires: ((emacs "24.4") (restclient "0")) -;; Homepage: https://github.com/simenheg/restclient-test.el - -;; 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 . - -;;; Commentary: - -;; Turn your restclient.el documents into interactive test suites! - -;; See README.org for more information. - -;;; Code: - -(require 'restclient) -(require 'subr-x) - -(defun restclient-test--goto-entry (entry) - "Move point to ENTRY and save it in the match data. -The whole entry is saved in the match data at index 0, while its -value is saved at index 1." - (re-search-backward - (concat "# " entry ":\\(.*\\)") - (save-excursion (backward-sentence)) t)) - -(defun restclient-test--update-entry (entry value) - "Update or create ENTRY with value VALUE." - (let ((entry-header (concat "# " entry ":"))) - (save-excursion - (when (restclient-test--goto-entry entry) - (delete-region (point) (line-end-position)) - (backward-delete-char 1))) - (insert entry-header " " value "\n"))) - -;;;###autoload -(defun restclient-test-current () - "Test query at point. -When the test contains an \"Expect\" entry, return `pass' if the -test passed and `fail' if the test failed. Else return nil.'" - (interactive) - (save-window-excursion - (save-excursion - (goto-char (restclient-current-min)) - (if (not (looking-at-p restclient-method-url-regexp)) - (when (called-interactively-p 'interactive) - (message "This doesn't look like a query")) - (let ((buf (current-buffer))) - (restclient-http-send-current t t) - (while restclient-within-call - (sit-for 0.05)) - (switch-to-buffer "*HTTP Response*") - (let ((response (buffer-substring-no-properties - (point-min) (line-end-position)))) - (switch-to-buffer buf) - (restclient-test--update-entry "Response" response) - (let ((expect - (save-excursion - (restclient-test--goto-entry "Expect") - (match-string-no-properties 1)))) - (when expect - (let ((passed - (string-match-p (string-trim expect) response))) - (restclient-test--update-entry - "Result" (if passed "Passed" "Failed")) - (if passed 'pass 'fail)))))))))) - -;;;###autoload -(defun restclient-test-buffer () - "Test every query in the current buffer." - (interactive) - (let ((restclient-log-request nil) - (num-pass 0) - (num-fail 0)) - (save-excursion - ;; Attempt to find the first query in the buffer - (goto-char (point-min)) - (restclient-jump-next) - (restclient-jump-prev) - (while (let ((res (restclient-test-current))) - (cond - ((eq res 'pass) (setq num-pass (+ num-pass 1))) - ((eq res 'fail) (setq num-fail (+ num-fail 1)))) - (goto-char (restclient-current-min)) - (let ((prev (point))) - (restclient-jump-next) - (goto-char (restclient-current-min)) - (/= prev (point)))))) - (message "Test results: %d passed, %d failed" num-pass num-fail))) - -(defun restclient-test-next-error (arg) - "Jump to the first failed test found after point. -The numeric argument ARG decides how many failed tests to jump -forward, or backward with a negative argument." - (interactive "p") - (let ((orig-pos (point))) - (if (< arg 0) - (beginning-of-line) - (end-of-line)) - (let ((found-failure (search-forward "Result: Failed" nil t arg))) - (beginning-of-line) - (unless found-failure - (goto-char orig-pos) - (message "No more failed tests %s point" - (if (< arg 0) "before" "after")))))) - -(defun restclient-test-previous-error (arg) - "Jump to the first failed test found before point." - (interactive "p") - (restclient-test-next-error (* arg -1))) - -;;;###autoload -(define-minor-mode restclient-test-mode - "Minor mode with key-bindings for restclient-test commands. -With a prefix argument ARG, enable the mode if ARG is positive, -and disable it otherwise. If called from Lisp, enable the mode -if ARG is omitted or nil." - :lighter " REST Test" - :keymap `((,(kbd "C-c C-b") . restclient-test-buffer) - (,(kbd "C-c C-t") . restclient-test-current) - (,(kbd "M-g n") . restclient-test-next-error) - (,(kbd "M-g M-n") . restclient-test-next-error) - (,(kbd "M-g p") . restclient-test-previous-error) - (,(kbd "M-g M-p") . restclient-test-previous-error))) - -(provide 'restclient-test) -;;; restclient-test.el ends here diff --git a/elpa/restclient-test-20180106.2046/restclient-test.elc b/elpa/restclient-test-20180106.2046/restclient-test.elc deleted file mode 100644 index 1e43566aededb62a52c1f6e1a0f484a1d48f7e69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5701 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 Kv(G7LHU9@xY0owQ diff --git a/elpa/s-20180406.808/s-autoloads.el b/elpa/s-20180406.808/s-autoloads.el deleted file mode 100644 index a232497a..00000000 --- a/elpa/s-20180406.808/s-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; s-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "s" "s.el" (0 0 0 0)) -;;; Generated autoloads from s.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "s" '("s-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; s-autoloads.el ends here diff --git a/elpa/s-20180406.808/s-pkg.el b/elpa/s-20180406.808/s-pkg.el deleted file mode 100644 index 7080f87a..00000000 --- a/elpa/s-20180406.808/s-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "s" "20180406.808" "The long lost Emacs string manipulation library." 'nil :commit "03410e6a7a2b11e47e1fea3b7d9899c7df26435e" :keywords '("strings") :authors '(("Magnar Sveen" . "magnars@gmail.com")) :maintainer '("Magnar Sveen" . "magnars@gmail.com")) diff --git a/elpa/s-20180406.808/s.el b/elpa/s-20180406.808/s.el deleted file mode 100644 index d8e359a1..00000000 --- a/elpa/s-20180406.808/s.el +++ /dev/null @@ -1,747 +0,0 @@ -;;; s.el --- The long lost Emacs string manipulation library. - -;; Copyright (C) 2012-2015 Magnar Sveen - -;; Author: Magnar Sveen -;; 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 . - -;;; Commentary: - -;; The long lost Emacs string manipulation library. -;; -;; See documentation on https://github.com/magnars/s.el#functions - -;;; Code: - -;; Silence byte-compiler -(defvar ucs-normalize-combining-chars) ; Defined in `ucs-normalize' -(autoload 'slot-value "eieio") - -(defun s-trim-left (s) - "Remove whitespace at the beginning of S." - (declare (pure t) (side-effect-free t)) - (save-match-data - (if (string-match "\\`[ \t\n\r]+" s) - (replace-match "" t t s) - s))) - -(defun s-trim-right (s) - "Remove whitespace at the end of S." - (save-match-data - (declare (pure t) (side-effect-free t)) - (if (string-match "[ \t\n\r]+\\'" s) - (replace-match "" t t s) - s))) - -(defun s-trim (s) - "Remove whitespace at the beginning and end of S." - (declare (pure t) (side-effect-free t)) - (s-trim-left (s-trim-right s))) - -(defun s-collapse-whitespace (s) - "Convert all adjacent whitespace characters to a single space." - (declare (pure t) (side-effect-free t)) - (replace-regexp-in-string "[ \t\n\r]+" " " s)) - -(defun s-split (separator s &optional omit-nulls) - "Split S into substrings bounded by matches for regexp SEPARATOR. -If OMIT-NULLS is non-nil, zero-length substrings are omitted. - -This is a simple wrapper around the built-in `split-string'." - (declare (side-effect-free t)) - (save-match-data - (split-string s separator omit-nulls))) - -(defun s-split-up-to (separator s n &optional omit-nulls) - "Split S up to N times into substrings bounded by matches for regexp SEPARATOR. - -If OMIT-NULLS is non-nil, zero-length substrings are omitted. - -See also `s-split'." - (declare (side-effect-free t)) - (save-match-data - (let ((op 0) - (r nil)) - (with-temp-buffer - (insert s) - (setq op (goto-char (point-min))) - (while (and (re-search-forward separator nil t) - (< 0 n)) - (let ((sub (buffer-substring op (match-beginning 0)))) - (unless (and omit-nulls - (equal sub "")) - (push sub r))) - (setq op (goto-char (match-end 0))) - (setq n (1- n))) - (let ((sub (buffer-substring op (point-max)))) - (unless (and omit-nulls - (equal sub "")) - (push sub r)))) - (nreverse r)))) - -(defun s-lines (s) - "Splits S into a list of strings on newline characters." - (declare (pure t) (side-effect-free t)) - (s-split "\\(\r\n\\|[\n\r]\\)" s)) - -(defun s-join (separator strings) - "Join all the strings in STRINGS with SEPARATOR in between." - (declare (pure t) (side-effect-free t)) - (mapconcat 'identity strings separator)) - -(defun s-concat (&rest strings) - "Join all the string arguments into one string." - (declare (pure t) (side-effect-free t)) - (apply 'concat strings)) - -(defun s-prepend (prefix s) - "Concatenate PREFIX and S." - (declare (pure t) (side-effect-free t)) - (concat prefix s)) - -(defun s-append (suffix s) - "Concatenate S and SUFFIX." - (declare (pure t) (side-effect-free t)) - (concat s suffix)) - -(defun s-repeat (num s) - "Make a string of S repeated NUM times." - (declare (pure t) (side-effect-free t)) - (let (ss) - (while (> num 0) - (setq ss (cons s ss)) - (setq num (1- num))) - (apply 'concat ss))) - -(defun s-chop-suffix (suffix s) - "Remove SUFFIX if it is at end of S." - (declare (pure t) (side-effect-free t)) - (let ((pos (- (length suffix)))) - (if (and (>= (length s) (length suffix)) - (string= suffix (substring s pos))) - (substring s 0 pos) - s))) - -(defun s-chop-suffixes (suffixes s) - "Remove SUFFIXES one by one in order, if they are at the end of S." - (declare (pure t) (side-effect-free t)) - (while suffixes - (setq s (s-chop-suffix (car suffixes) s)) - (setq suffixes (cdr suffixes))) - s) - -(defun s-chop-prefix (prefix s) - "Remove PREFIX if it is at the start of S." - (declare (pure t) (side-effect-free t)) - (let ((pos (length prefix))) - (if (and (>= (length s) (length prefix)) - (string= prefix (substring s 0 pos))) - (substring s pos) - s))) - -(defun s-chop-prefixes (prefixes s) - "Remove PREFIXES one by one in order, if they are at the start of S." - (declare (pure t) (side-effect-free t)) - (while prefixes - (setq s (s-chop-prefix (car prefixes) s)) - (setq prefixes (cdr prefixes))) - s) - -(defun s-shared-start (s1 s2) - "Returns the longest prefix S1 and S2 have in common." - (declare (pure t) (side-effect-free t)) - (let ((search-length (min (length s1) (length s2))) - (i 0)) - (while (and (< i search-length) - (= (aref s1 i) (aref s2 i))) - (setq i (1+ i))) - (substring s1 0 i))) - -(defun s-shared-end (s1 s2) - "Returns the longest suffix S1 and S2 have in common." - (declare (pure t) (side-effect-free t)) - (let* ((l1 (length s1)) - (l2 (length s2)) - (search-length (min l1 l2)) - (i 0)) - (while (and (< i search-length) - (= (aref s1 (- l1 i 1)) (aref s2 (- l2 i 1)))) - (setq i (1+ i))) - ;; If I is 0, then it means that there's no common suffix between - ;; S1 and S2. - ;; - ;; However, since (substring s (- 0)) will return the whole - ;; string, `s-shared-end' should simply return the empty string - ;; when I is 0. - (if (zerop i) - "" - (substring s1 (- i))))) - -(defun s-chomp (s) - "Remove one trailing `\\n`, `\\r` or `\\r\\n` from S." - (declare (pure t) (side-effect-free t)) - (s-chop-suffixes '("\n" "\r") s)) - -(defun s-truncate (len s &optional ellipsis) - "If S is longer than LEN, cut it down and add ELLIPSIS to the end. - -The resulting string, including ellipsis, will be LEN characters -long. - -When not specified, ELLIPSIS defaults to ‘...’." - (declare (pure t) (side-effect-free t)) - (unless ellipsis - (setq ellipsis "...")) - (if (> (length s) len) - (format "%s%s" (substring s 0 (- len (length ellipsis))) ellipsis) - s)) - -(defun s-word-wrap (len s) - "If S is longer than LEN, wrap the words with newlines." - (declare (side-effect-free t)) - (save-match-data - (with-temp-buffer - (insert s) - (let ((fill-column len)) - (fill-region (point-min) (point-max))) - (buffer-substring (point-min) (point-max))))) - -(defun s-center (len s) - "If S is shorter than LEN, pad it with spaces so it is centered." - (declare (pure t) (side-effect-free t)) - (let ((extra (max 0 (- len (length s))))) - (concat - (make-string (ceiling extra 2) ? ) - s - (make-string (floor extra 2) ? )))) - -(defun s-pad-left (len padding s) - "If S is shorter than LEN, pad it with PADDING on the left." - (declare (pure t) (side-effect-free t)) - (let ((extra (max 0 (- len (length s))))) - (concat (make-string extra (string-to-char padding)) - s))) - -(defun s-pad-right (len padding s) - "If S is shorter than LEN, pad it with PADDING on the right." - (declare (pure t) (side-effect-free t)) - (let ((extra (max 0 (- len (length s))))) - (concat s - (make-string extra (string-to-char padding))))) - -(defun s-left (len s) - "Returns up to the LEN first chars of S." - (declare (pure t) (side-effect-free t)) - (if (> (length s) len) - (substring s 0 len) - s)) - -(defun s-right (len s) - "Returns up to the LEN last chars of S." - (declare (pure t) (side-effect-free t)) - (let ((l (length s))) - (if (> l len) - (substring s (- l len) l) - s))) - -(defun s-ends-with? (suffix s &optional ignore-case) - "Does S end with SUFFIX? - -If IGNORE-CASE is non-nil, the comparison is done without paying -attention to case differences. - -Alias: `s-suffix?'" - (declare (pure t) (side-effect-free t)) - (let ((start-pos (- (length s) (length suffix)))) - (and (>= start-pos 0) - (eq t (compare-strings suffix nil nil - s start-pos nil ignore-case))))) - -(defun s-starts-with? (prefix s &optional ignore-case) - "Does S start with PREFIX? - -If IGNORE-CASE is non-nil, the comparison is done without paying -attention to case differences. - -Alias: `s-prefix?'. This is a simple wrapper around the built-in -`string-prefix-p'." - (declare (pure t) (side-effect-free t)) - (string-prefix-p prefix s ignore-case)) - -(defun s--truthy? (val) - (declare (pure t) (side-effect-free t)) - (not (null val))) - -(defun s-contains? (needle s &optional ignore-case) - "Does S contain NEEDLE? - -If IGNORE-CASE is non-nil, the comparison is done without paying -attention to case differences." - (declare (pure t) (side-effect-free t)) - (let ((case-fold-search ignore-case)) - (s--truthy? (string-match-p (regexp-quote needle) s)))) - -(defun s-equals? (s1 s2) - "Is S1 equal to S2? - -This is a simple wrapper around the built-in `string-equal'." - (declare (pure t) (side-effect-free t)) - (string-equal s1 s2)) - -(defun s-less? (s1 s2) - "Is S1 less than S2? - -This is a simple wrapper around the built-in `string-lessp'." - (declare (pure t) (side-effect-free t)) - (string-lessp s1 s2)) - -(defun s-matches? (regexp s &optional start) - "Does REGEXP match S? -If START is non-nil the search starts at that index. - -This is a simple wrapper around the built-in `string-match-p'." - (declare (side-effect-free t)) - (s--truthy? (string-match-p regexp s start))) - -(defun s-blank? (s) - "Is S nil or the empty string?" - (declare (pure t) (side-effect-free t)) - (or (null s) (string= "" s))) - -(defun s-blank-str? (s) - "Is S nil or the empty string or string only contains whitespace?" - (declare (pure t) (side-effect-free t)) - (or (s-blank? s) (s-blank? (s-trim s)))) - -(defun s-present? (s) - "Is S anything but nil or the empty string?" - (declare (pure t) (side-effect-free t)) - (not (s-blank? s))) - -(defun s-presence (s) - "Return S if it's `s-present?', otherwise return nil." - (declare (pure t) (side-effect-free t)) - (and (s-present? s) s)) - -(defun s-lowercase? (s) - "Are all the letters in S in lower case?" - (declare (side-effect-free t)) - (let ((case-fold-search nil)) - (not (string-match-p "[[:upper:]]" s)))) - -(defun s-uppercase? (s) - "Are all the letters in S in upper case?" - (declare (side-effect-free t)) - (let ((case-fold-search nil)) - (not (string-match-p "[[:lower:]]" s)))) - -(defun s-mixedcase? (s) - "Are there both lower case and upper case letters in S?" - (let ((case-fold-search nil)) - (s--truthy? - (and (string-match-p "[[:lower:]]" s) - (string-match-p "[[:upper:]]" s))))) - -(defun s-capitalized? (s) - "In S, is the first letter upper case, and all other letters lower case?" - (declare (side-effect-free t)) - (let ((case-fold-search nil)) - (s--truthy? - (string-match-p "^[[:upper:]][^[:upper:]]*$" s)))) - -(defun s-numeric? (s) - "Is S a number?" - (declare (pure t) (side-effect-free t)) - (s--truthy? - (string-match-p "^[0-9]+$" s))) - -(defun s-replace (old new s) - "Replaces OLD with NEW in S." - (declare (pure t) (side-effect-free t)) - (replace-regexp-in-string (regexp-quote old) new s t t)) - -(defalias 's-replace-regexp 'replace-regexp-in-string) - -(defun s--aget (alist key) - (declare (pure t) (side-effect-free t)) - (cdr (assoc-string key alist))) - -(defun s-replace-all (replacements s) - "REPLACEMENTS is a list of cons-cells. Each `car` is replaced with `cdr` in S." - (declare (pure t) (side-effect-free t)) - (replace-regexp-in-string (regexp-opt (mapcar 'car replacements)) - (lambda (it) (s--aget replacements it)) - s t t)) - -(defun s-downcase (s) - "Convert S to lower case. - -This is a simple wrapper around the built-in `downcase'." - (declare (side-effect-free t)) - (downcase s)) - -(defun s-upcase (s) - "Convert S to upper case. - -This is a simple wrapper around the built-in `upcase'." - (declare (side-effect-free t)) - (upcase s)) - -(defun s-capitalize (s) - "Convert the first word's first character to upper case and the rest to lower case in S." - (declare (side-effect-free t)) - (concat (upcase (substring s 0 1)) (downcase (substring s 1)))) - -(defun s-titleize (s) - "Convert each word's first character to upper case and the rest to lower case in S. - -This is a simple wrapper around the built-in `capitalize'." - (declare (side-effect-free t)) - (capitalize s)) - -(defmacro s-with (s form &rest more) - "Threads S through the forms. Inserts S as the last item -in the first form, making a list of it if it is not a list -already. If there are more forms, inserts the first form as the -last item in second form, etc." - (declare (debug (form &rest [&or (function &rest form) fboundp]))) - (if (null more) - (if (listp form) - `(,(car form) ,@(cdr form) ,s) - (list form s)) - `(s-with (s-with ,s ,form) ,@more))) - -(put 's-with 'lisp-indent-function 1) - -(defun s-index-of (needle s &optional ignore-case) - "Returns first index of NEEDLE in S, or nil. - -If IGNORE-CASE is non-nil, the comparison is done without paying -attention to case differences." - (declare (pure t) (side-effect-free t)) - (let ((case-fold-search ignore-case)) - (string-match-p (regexp-quote needle) s))) - -(defun s-reverse (s) - "Return the reverse of S." - (declare (pure t) (side-effect-free t)) - (save-match-data - (if (multibyte-string-p s) - (let ((input (string-to-list s)) - output) - (require 'ucs-normalize) - (while input - ;; Handle entire grapheme cluster as a single unit - (let ((grapheme (list (pop input)))) - (while (memql (car input) ucs-normalize-combining-chars) - (push (pop input) grapheme)) - (setq output (nconc (nreverse grapheme) output)))) - (concat output)) - (concat (nreverse (string-to-list s)))))) - -(defun s-match-strings-all (regex string) - "Return a list of matches for REGEX in STRING. - -Each element itself is a list of matches, as per -`match-string'. Multiple matches at the same position will be -ignored after the first." - (declare (side-effect-free t)) - (save-match-data - (let ((all-strings ()) - (i 0)) - (while (and (< i (length string)) - (string-match regex string i)) - (setq i (1+ (match-beginning 0))) - (let (strings - (num-matches (/ (length (match-data)) 2)) - (match 0)) - (while (/= match num-matches) - (push (match-string match string) strings) - (setq match (1+ match))) - (push (nreverse strings) all-strings))) - (nreverse all-strings)))) - -(defun s-matched-positions-all (regexp string &optional subexp-depth) - "Return a list of matched positions for REGEXP in STRING. -SUBEXP-DEPTH is 0 by default." - (declare (side-effect-free t)) - (if (null subexp-depth) - (setq subexp-depth 0)) - (save-match-data - (let ((pos 0) result) - (while (and (string-match regexp string pos) - (< pos (length string))) - (let ((m (match-end subexp-depth))) - (push (cons (match-beginning subexp-depth) (match-end subexp-depth)) result) - (setq pos (match-end 0)))) - (nreverse result)))) - -(defun s-match (regexp s &optional start) - "When the given expression matches the string, this function returns a list -of the whole matching string and a string for each matched subexpressions. -If it did not match the returned value is an empty list (nil). - -When START is non-nil the search will start at that index." - (declare (side-effect-free t)) - (save-match-data - (if (string-match regexp s start) - (let ((match-data-list (match-data)) - result) - (while match-data-list - (let* ((beg (car match-data-list)) - (end (cadr match-data-list)) - (subs (if (and beg end) (substring s beg end) nil))) - (setq result (cons subs result)) - (setq match-data-list - (cddr match-data-list)))) - (nreverse result))))) - -(defun s-slice-at (regexp s) - "Slices S up at every index matching REGEXP." - (declare (side-effect-free t)) - (if (= 0 (length s)) (list "") - (save-match-data - (let (i) - (setq i (string-match regexp s 1)) - (if i - (cons (substring s 0 i) - (s-slice-at regexp (substring s i))) - (list s)))))) - -(defun s-split-words (s) - "Split S into list of words." - (declare (side-effect-free t)) - (s-split - "[^[:word:]0-9]+" - (let ((case-fold-search nil)) - (replace-regexp-in-string - "\\([[:lower:]]\\)\\([[:upper:]]\\)" "\\1 \\2" - (replace-regexp-in-string "\\([[:upper:]]\\)\\([[:upper:]][0-9[:lower:]]\\)" "\\1 \\2" s))) - t)) - -(defun s--mapcar-head (fn-head fn-rest list) - "Like MAPCAR, but applies a different function to the first element." - (if list - (cons (funcall fn-head (car list)) (mapcar fn-rest (cdr list))))) - -(defun s-lower-camel-case (s) - "Convert S to lowerCamelCase." - (declare (side-effect-free t)) - (s-join "" (s--mapcar-head 'downcase 'capitalize (s-split-words s)))) - -(defun s-upper-camel-case (s) - "Convert S to UpperCamelCase." - (declare (side-effect-free t)) - (s-join "" (mapcar 'capitalize (s-split-words s)))) - -(defun s-snake-case (s) - "Convert S to snake_case." - (declare (side-effect-free t)) - (s-join "_" (mapcar 'downcase (s-split-words s)))) - -(defun s-dashed-words (s) - "Convert S to dashed-words." - (declare (side-effect-free t)) - (s-join "-" (mapcar 'downcase (s-split-words s)))) - -(defun s-capitalized-words (s) - "Convert S to Capitalized words." - (declare (side-effect-free t)) - (let ((words (s-split-words s))) - (s-join " " (cons (capitalize (car words)) (mapcar 'downcase (cdr words)))))) - -(defun s-titleized-words (s) - "Convert S to Titleized Words." - (declare (side-effect-free t)) - (s-join " " (mapcar 's-titleize (s-split-words s)))) - -(defun s-word-initials (s) - "Convert S to its initials." - (declare (side-effect-free t)) - (s-join "" (mapcar (lambda (ss) (substring ss 0 1)) - (s-split-words s)))) - -;; Errors for s-format -(progn - (put 's-format-resolve - 'error-conditions - '(error s-format s-format-resolve)) - (put 's-format-resolve - 'error-message - "Cannot resolve a template to values")) - -(defun s-format (template replacer &optional extra) - "Format TEMPLATE with the function REPLACER. - -REPLACER takes an argument of the format variable and optionally -an extra argument which is the EXTRA value from the call to -`s-format'. - -Several standard `s-format' helper functions are recognized and -adapted for this: - - (s-format \"${name}\" 'gethash hash-table) - (s-format \"${name}\" 'aget alist) - (s-format \"$0\" 'elt sequence) - -The REPLACER function may be used to do any other kind of -transformation." - (let ((saved-match-data (match-data))) - (unwind-protect - (replace-regexp-in-string - "\\$\\({\\([^}]+\\)}\\|[0-9]+\\)" - (lambda (md) - (let ((var - (let ((m (match-string 2 md))) - (if m m - (string-to-number (match-string 1 md))))) - (replacer-match-data (match-data))) - (unwind-protect - (let ((v - (cond - ((eq replacer 'gethash) - (funcall replacer var extra)) - ((eq replacer 'aget) - (funcall 's--aget extra var)) - ((eq replacer 'elt) - (funcall replacer extra var)) - ((eq replacer 'oref) - (funcall #'slot-value extra (intern var))) - (t - (set-match-data saved-match-data) - (if extra - (funcall replacer var extra) - (funcall replacer var)))))) - (if v (format "%s" v) (signal 's-format-resolve md))) - (set-match-data replacer-match-data)))) template - ;; Need literal to make sure it works - t t) - (set-match-data saved-match-data)))) - -(defvar s-lex-value-as-lisp nil - "If `t' interpolate lisp values as lisp. - -`s-lex-format' inserts values with (format \"%S\").") - -(defun s-lex-fmt|expand (fmt) - "Expand FMT into lisp." - (declare (side-effect-free t)) - (list 's-format fmt (quote 'aget) - (append '(list) - (mapcar - (lambda (matches) - (list - 'cons - (cadr matches) - `(format - (if s-lex-value-as-lisp "%S" "%s") - ,(intern (cadr matches))))) - (s-match-strings-all "${\\([^}]+\\)}" fmt))))) - -(defmacro s-lex-format (format-str) - "`s-format` with the current environment. - -FORMAT-STR may use the `s-format' variable reference to refer to -any variable: - - (let ((x 1)) - (s-lex-format \"x is: ${x}\")) - -The values of the variables are interpolated with \"%s\" unless -the variable `s-lex-value-as-lisp' is `t' and then they are -interpolated with \"%S\"." - (declare (debug (form))) - (s-lex-fmt|expand format-str)) - -(defun s-count-matches (regexp s &optional start end) - "Count occurrences of `regexp' in `s'. - -`start', inclusive, and `end', exclusive, delimit the part of `s' to -match. `start' and `end' are both indexed starting at 1; the initial -character in `s' is index 1. - -This function starts looking for the next match from the end of the -previous match. Hence, it ignores matches that overlap a previously -found match. To count overlapping matches, use -`s-count-matches-all'." - (declare (side-effect-free t)) - (save-match-data - (with-temp-buffer - (insert s) - (goto-char (point-min)) - (count-matches regexp (or start 1) (or end (point-max)))))) - -(defun s-count-matches-all (regexp s &optional start end) - "Count occurrences of `regexp' in `s'. - -`start', inclusive, and `end', exclusive, delimit the part of `s' to -match. `start' and `end' are both indexed starting at 1; the initial -character in `s' is index 1. - -This function starts looking for the next match from the second -character of the previous match. Hence, it counts matches that -overlap a previously found match. To ignore matches that overlap a -previously found match, use `s-count-matches'." - (declare (side-effect-free t)) - (let* ((anchored-regexp (format "^%s" regexp)) - (match-count 0) - (i 0) - (narrowed-s (substring s - (when start (1- start)) - (when end (1- end))))) - (save-match-data - (while (< i (length narrowed-s)) - (when (s-matches? anchored-regexp (substring narrowed-s i)) - (setq match-count (1+ match-count))) - (setq i (1+ i)))) - match-count)) - -(defun s-wrap (s prefix &optional suffix) - "Wrap string S with PREFIX and optionally SUFFIX. - -Return string S with PREFIX prepended. If SUFFIX is present, it -is appended, otherwise PREFIX is used as both prefix and -suffix." - (declare (pure t) (side-effect-free t)) - (concat prefix s (or suffix prefix))) - - -;;; Aliases - -(defalias 's-blank-p 's-blank?) -(defalias 's-blank-str-p 's-blank-str?) -(defalias 's-capitalized-p 's-capitalized?) -(defalias 's-contains-p 's-contains?) -(defalias 's-ends-with-p 's-ends-with?) -(defalias 's-equals-p 's-equals?) -(defalias 's-less-p 's-less?) -(defalias 's-lowercase-p 's-lowercase?) -(defalias 's-matches-p 's-matches?) -(defalias 's-mixedcase-p 's-mixedcase?) -(defalias 's-numeric-p 's-numeric?) -(defalias 's-prefix-p 's-starts-with?) -(defalias 's-prefix? 's-starts-with?) -(defalias 's-present-p 's-present?) -(defalias 's-starts-with-p 's-starts-with?) -(defalias 's-suffix-p 's-ends-with?) -(defalias 's-suffix? 's-ends-with?) -(defalias 's-uppercase-p 's-uppercase?) - - -(provide 's) -;;; s.el ends here diff --git a/elpa/s-20180406.808/s.elc b/elpa/s-20180406.808/s.elc deleted file mode 100644 index a71dd70d5342f28140befb949df8aafc1c66c0c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28393 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 diff --git a/elpa/scss-mode-20180123.1708/scss-mode-autoloads.el b/elpa/scss-mode-20180123.1708/scss-mode-autoloads.el deleted file mode 100644 index df4ed27f..00000000 --- a/elpa/scss-mode-20180123.1708/scss-mode-autoloads.el +++ /dev/null @@ -1,31 +0,0 @@ -;;; scss-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "scss-mode" "scss-mode.el" (0 0 0 0)) -;;; Generated autoloads from scss-mode.el - -(autoload 'scss-mode "scss-mode" "\ -Major mode for editing SCSS files, http://sass-lang.com/ -Special commands: -\\{scss-mode-map} - -\(fn)" t nil) - -(add-to-list 'auto-mode-alist '("\\.scss\\'" . scss-mode)) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "scss-mode" '("flymake-scss-init" "scss-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; scss-mode-autoloads.el ends here diff --git a/elpa/scss-mode-20180123.1708/scss-mode-pkg.el b/elpa/scss-mode-20180123.1708/scss-mode-pkg.el deleted file mode 100644 index 34f0b062..00000000 --- a/elpa/scss-mode-20180123.1708/scss-mode-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "scss-mode" "20180123.1708" "Major mode for editing SCSS files" 'nil :commit "cf58dbec5394280503eb5502938f3b5445d1b53d" :keywords '("scss" "css" "mode") :authors '(("Anton Johansson" . "anton.johansson@gmail.com")) :maintainer '("Anton Johansson" . "anton.johansson@gmail.com") :url "https://github.com/antonj/scss-mode") diff --git a/elpa/scss-mode-20180123.1708/scss-mode.el b/elpa/scss-mode-20180123.1708/scss-mode.el deleted file mode 100644 index 71169066..00000000 --- a/elpa/scss-mode-20180123.1708/scss-mode.el +++ /dev/null @@ -1,127 +0,0 @@ -;;; scss-mode.el --- Major mode for editing SCSS files -;; -;; Author: Anton Johansson - http://antonj.se -;; URL: https://github.com/antonj/scss-mode -;; Package-Version: 20180123.1708 -;; Created: Sep 1 23:11:26 2010 -;; Version: 0.5.0 -;; Keywords: scss css mode -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2 of -;; the License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be -;; useful, but WITHOUT ANY WARRANTY; without even the implied -;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -;; PURPOSE. See the GNU General Public License for more details. -;; -;;; Commentary: -;; -;; Command line utility sass is required, see http://sass-lang.com/ -;; To install sass: -;; gem install sass -;; -;; Also make sure sass location is in emacs PATH, example: -;; (setq exec-path (cons (expand-file-name "~/.gem/ruby/1.8/bin") exec-path)) -;; or customize `scss-sass-command' to point to your sass executable. -;; -;;; Code: - -(require 'derived) -(require 'compile) -(require 'flymake) - -(defgroup scss nil - "Scss mode" - :prefix "scss-" - :group 'css) - -(defcustom scss-sass-command "sass" - "Command used to compile SCSS files. -Should be sass or the complete path to your sass runnable -example: \"~/.gem/ruby/1.8/bin/sass\"" - :type 'string - :group 'scss) - -(defcustom scss-compile-at-save nil - "If not nil the SCSS buffers will be compiled after each save." - :type 'boolean - :group 'scss) - -(defcustom scss-sass-options '() - "Command line Options for sass executable, for example: -'(\"--cache-location\" \"'/tmp/.sass-cache'\")" - :type '(repeat string) - :group 'scss) - -(defcustom scss-output-directory nil - "Output directory for compiled files, for example: \"../css\". -If nil, do not add any output directory option to `scss-sass-command'." - :type '(choice (const :tag "Same dir" nil) - (string :tag "Relative dir")) - :group 'scss) - -(defcustom scss-compile-error-regex '("\\(Syntax error:\s*.*\\)\n\s*on line\s*\\([0-9]+\\) of \\([^, \n]+\\)" 3 2 nil nil 1) - "Regex for finding line number file and error message in -compilation buffers, syntax from -`compilation-error-regexp-alist' (REGEXP FILE LINE COLUMN TYPE -HYPERLINK HIGHLIGHT)" - :type 'regexp - :group 'scss) - -(defconst scss-font-lock-keywords - ;; Variables - '(("$[a-z_-][a-z-_0-9]*" . font-lock-constant-face))) - -(defun scss-compile-maybe() - "Runs `scss-compile' on if `scss-compile-at-save' is t" - (if scss-compile-at-save - (scss-compile))) - -(defun scss-compile() - "Compiles the directory belonging to the current buffer, using the --update option" - (interactive) - (compile (concat scss-sass-command " " (mapconcat 'identity scss-sass-options " ") " --update " - (when (string-match ".*/" buffer-file-name) - (concat "'" (match-string 0 buffer-file-name) "'")) - (when scss-output-directory - (concat ":'" scss-output-directory "'"))))) - -;;;###autoload -(define-derived-mode scss-mode css-mode "SCSS" - "Major mode for editing SCSS files, http://sass-lang.com/ -Special commands: -\\{scss-mode-map}" - (font-lock-add-keywords nil scss-font-lock-keywords) - ;; Add the single-line comment syntax ('//', ends with newline) - ;; as comment style 'b' (see "Syntax Flags" in elisp manual) - (modify-syntax-entry ?/ ". 124" css-mode-syntax-table) - (modify-syntax-entry ?* ". 23b" css-mode-syntax-table) - (modify-syntax-entry ?\n ">" css-mode-syntax-table) - (add-to-list 'compilation-error-regexp-alist scss-compile-error-regex) - (add-hook 'after-save-hook 'scss-compile-maybe nil t)) - -(define-key scss-mode-map "\C-c\C-c" 'scss-compile) - -(defun flymake-scss-init () - "Flymake support for SCSS files" - (let* ((temp-file (flymake-init-create-temp-buffer-copy - 'flymake-create-temp-inplace)) - (local-file (file-relative-name - temp-file - (file-name-directory buffer-file-name)))) - (list scss-sass-command (append scss-sass-options (list "--scss" "--check" local-file))))) - -(push '(".+\\.scss$" flymake-scss-init) flymake-allowed-file-name-masks) - -;;;; TODO: Not possible to use multiline regexs flymake? flymake-err-[line]-patterns -;; '("Syntax error:\s*\\(.*\\)\n\s*on line\s*\\([0-9]+\\) of \\([^ ]+\\)$" 3 2 nil 1) -(push '("on line \\([0-9]+\\) of \\([^ ]+\\)$" 2 1 nil 2) flymake-err-line-patterns) - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.scss\\'" . scss-mode)) - -(provide 'scss-mode) -;;; scss-mode.el ends here diff --git a/elpa/scss-mode-20180123.1708/scss-mode.elc b/elpa/scss-mode-20180123.1708/scss-mode.elc deleted file mode 100644 index b08cda47600cd5efc552868a351ad7a6902ddb9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5500 zcmbtY|8LvY5jRkvOBKx6_QP6i7A+ZaugG|q+%q1QZ-PZk%6 zEYRv(@%GHb~+CqKBUuhnZ*ke$xEEj z*;0oEU7Ng!(}cXEfiF96<8n@Vv7j_7<7ND#F0ow4lBlmPPS4LNoa0v&m{1f+I8`Gc>Lf0%$|2a<$}rul?y5lR9;Or z9Ji@FoMT>|UsLf(UfZSuFOR8eUOr2`LFGdN^YXF75`FNzg$fdU@bj4;Q}HdojZq!wtRv8sxfe?xpif|UnLW3M)mmFsfzd7U}ZR8yRA5n?mtJS(Vy||E6 zCoWmel-5v5C2=xc=2`Am|Dt-;bo!D%&{A${m=jEshQ z^`VIL3~7Z-3FlDg+6)|;rs={UVK$~<1VHXnR}6ew8)6YBhMv`1Gh9`!Y~Go$D)~x) z04z4w3X*OwaFhxm$*4sd3Z4WGuG>8l`lMBvRi%m$ zAYqy2D{`L63T;+c>iT+&Q4B^cO(1bFI7ATOGf3E2@!|l`B}M~Ykxo`*<+Qk38?f_U zZwv!591~qwtryPII5hZ#rAoL-Um+It5^)^o4$J6MuXdZ=d|?)_0UX8z{rY~j;>zTC znycJgnRnFfIYH37SOFW~k!+mM{$M`{`awebz-;jZ-g~cx>cQm~*r0Sq{Qi#v3KCgy z$R|%Sgq`U2$$25n*)p>@i2&M`Pf{(XhzJ39j(-tIOH&m3$^glO#Of&iqdKk*sIcnI z@^l#_uUjPTt7J+q;-c(Q@5R|SXMcN6U!OlYqbKK2&*=2olfQiTlwSV*`B{)W#{U;s z{+1q}fAjbWo|gy+u|{@D$Nf$(GBayvamEaFgJbHAdSg~^(>y|~_Il3!S6cn}gSzAo z^#j{x-=P75p`jKQ8gDZlnts3E+56LYOfM?Ly7hAHjxNE<@oamsNw_Yd7M7ojPPm?i zY*DIlaQyKOpwcCLWxU%WZj!jYcu6kx_U=P-_t-z~U$UCVepAOG z8%e$i|EXD|$rZa3u`1|O<+(}9+EoXr*s_U3N>y2;flD^HKX`>kd1yVl!_~ne{c!RL zzw80QxgyvKlLQW5@l#yU`CH5UQ(Six%s2?R^1*gPuATl~ zUH)OR;h1eQ`mCW@TfCtewoSH?+0-$GPOMtuvNlTrndCfXrBH7g$WH+L90^h%m<7=A zX-Zk10=$<6(ygc#u-Obzga~g~bF_1>HchJ}!jad2Ou2BEbcMnUi6Pp?6`^V&594w` z)RTUZ(=WyP#@Ogph7)lJhprH=o3EONdl=WJrcc9m&04ii zh`Tu)5f|n@ z(DT4~lW<~aJ)P#}T1nw<1v1;R@z5q!0R* zdJDarMjGknez|u7I)x@dK^K(K8~L`ybI;vFHMIdCMX8qM)D_g;k?Y>JrY(tkw+Y!Y zkrg898@06~F#na9lRhM>Zf$LhBS;yZxka^6J!XIhF4A}UpU{#QZ37b_3z~$j8=HAq zW+#Wz9jb*+t_A?U!_Gx!!dNf34dVW!IOzoc7AO^8!>Rx2bj|?;5pzUoL#5!RhZB-B zwm_pQI*I7ljb>e1##i%_=GEuRFW_-F+s zS2By|s%BQ0vPSr3CA1AsErHeH-w!MbG&DttywG{1w)A6Ox6rmxq@C;P%AnJ?dK9#^ z!+K&;Z0W$fw}frlP_Cfs#+C5{7mjDEh8*aCL1#2UZ$hp&a%kl7SI?h1gm8EM=x`>h zGF9AM*Rzil{#$x)A(bSR$xlW`+pn}+PB@X9R%CVC@f!#c2AkLR)$wx-J9cYHC^z?A z-?c%O=BBOk({#_RLFkf>>h8-QyO>}$-4`ZNHsB_5BnX|4K618uaRyf3qp#~<5{fFz z(!3OK-Hh>Dm{b4gpyUP&POV;8nzDPqoZ$pru{-?aUf}$O+gg{gz;*;dauzuIe@5PO zDwPH`OeU)vZLGDL?1`-Z(*`$su}Uh;F((@(+-t^Cl^de=ew<_r3_CL4VZO8@s7>K@ zPu&`?bq1uyk044cfW{aT{M>|Z&;n4Sskuj&d==Dq@z0xfq@&!6X`p zVLHf*EJ{xDT|CY5LIlHMI27eB_Q9TWu(ZZ7#TrRkh(VeZ0VdCik-3kN#C&}C7-Vr2W}+BlqT|Yap@Kj3A06P2{?}+U z?mp`D#7}8@3Mpb(L!6DnLXOoC!ChGIg2O|n9yBkVoR(gCKF zXGj`)B%Kx0S+OU?^Frj~bQTXu@uM`3(=(hM2gJ!|qY;!1B!s)X@-Qd@QKSvb%)N;5GGi*Qf?|5BNgDXVNm+Q`_ZL1U0kqNFgPSUgoS?uw`oXAyi2s)~}R zh=Mr!1$u>{fL&VTF`XK3U)v5K+Wkh}oqY5J0U8F&mmzGhq3cv$fF1vrQu&hSGXqJF@(gaijCQr_ZfrApB z(;%lXtzt7fRl3`N|I)ef0wV1ts*4h$sS}DC3nw{H(Z$^te+>r#G5}%-Rx}v{1{9O% zWL$`okVqf)1|X&}xKX=H9-SmXEKC)A`tTicO@a>xKE6xBPlcEUgVPWMco=*Pc{D|I zhtMZ%cA7!dx~#xB92GRRdUD5hr9;`h4l7YbEY_5yhEXt!wbn`x+quN;+Bj%K*)~3B z#IrN}SG z%~JfzCcOixR}Y&=>eoK}>h00%w?~rI2u0fC7ia?kJ;=rO!v5m!yB$Rf-%*mCl2815 zIGaq)+oDzX9m}oP>Z@D0=&j;UXIPuw@?ERzCtI8N?X7Ly_FdZ&cktJ4Ucp~yealb2 zr#E+N@BPu+jVriztQsDm5 z6z~1I-};Muid#!GukvE9-NBx;l52PIucvQ1#?`I+CSK^Z#JdH#=lWIBD->&mPJ-+d z$xJd#&xk@4$cc+MJ5|3XPs_s?8CN(o)qJv;ywtu?SwYR2rn&hs$|C?8!A-qsPT|C~ zmR>0f2jFc4g&q0Z7C}K-EBreGK7;sJxGJ1D`v+e8m^1F)f%pMbOm)*wk6%80@$3z; z?dvzMp6rUlqc_iA{s=$M!qF^_&*2}>*n!|6piyE>aPc^pPQwI+4y8x{aYp_l36ovw zun0h;(xP!FcJRQ^7fJ6x`8`T=GJxmx@%k4>g$hbl~-5RXhrAy+Ums_YZ!Nv z+O&DqxJH+KVqXv2b=N-NujMB+`i@3B#`U`2;z6tx)P~H=b!O%^&+Gh$=7I4s5B^{| z8Qnt=2h{Dib}>Z0A%URmcOf}|VaTFNmnOqY0>uQy$g+$bCPS1oM<_Ef#%VPwJd{}i z4$`U+apkh)Pcw2P{DEXdy0ms5V)~+FuqH}7KOxKc!s=v(yICy#)A`>?wR6 zn9AxEXFJ%pq_cTFPy85tM9rbSjTkjg;Ttk!?;>Xn2dA9%llM@6Bur4bp(xR+q`Xb{ zDL~iAD9>d=HO(TVJ`8%CTKfYh+Ny338wu$zE{hA5qEmuc@tdmSN}nVxM6q;n)uf=Z z345tiQSztCV7)O8Ub?!hpS5eGi55nUP|XahRtsop2e^8sD_9GWlRBq ze908YSH|WVws2l;+)@+WPE9?<)f)0c3p;w{Ag&Vaq1)?YRKmcgpJx?0$s<}r5NqMlhzGB>inq9}PGimb7`*`BqT2Yq8xPwJ_ zJ;}Q6gB8}w1K1RaG36{2MoOlBSYwUMq;Wm`e%IVKwy~;vx&mItzNah3_M_$w-t8DW zkLGG35_kJ6MthYYLRUMFZ{W%~!3&Q!w)trLYLO4LzjwnQK~=mglJqVC&FVJq`^oBC z+6ij&pfTLOYCbS1B4Cz7vmn+3mI{|0e^fUf+}*g}HfRe>@p>z(>uQCrL(^#v8HV6R zQINrR1ADJ;FmfN(+SVRPP9aCf+de17ebwHh*sZSTRU{26!ZEoitlrfry2atgGzYQS zkJG`asn|n$v}vMHD#HsM%yMK=M1_S65KLxrZ8Si$5XAxd+dObAoMV+5%2C`b&M1SD zVvvR1kwkH~mP!xZ?NJj{NGrw}3KccRaZOXN8e7PvWiB@e^3X*49N`xqDNr*jITn&z z_4>S(q01#nmeux*-n|m8^oc6Lf-aHVqLC(7SY&5;hmH#brDmI)Q)zPHQY2w1Y8fRi zUWkdnXARPXUSy%eiL5~P;k+2`T3HQC(5DiG8x0q7 zlPT~I5&$Pr_9t^YjKP!n-ocowTm*0jdsS|%>W$s0Jh8jgo3iA^0*+OA;@FiNtNO%R zc;Zy1Ir@eRa{CG>({T|O9F$5H9o2IGR$D{Vk+RwL9U2-#K!*x(*Xc6trD}jE*Xga( z_?*7z;YD?z_V-;E&gJT(fs9?3cdS(KDrHmPxD0{>vUz9fvdL(YiwgTCS4?YZ^8+htmyA2_yCChGfF%u-(rGBc{SQNOeoqpxxHl&5Rv)V zUBn&Bfnx&Wve2PgjUZ2MCrgTD)>B~tvuF)87(P3b#G^QH3AjlArOICF9Gh4N0(0|w z58BeLo?g%C%(dlNN(Gv$N@e{TTV<@Z3;H0*AwR_Unj9Lf6v)q+YKI;ACJi7_l75Ss zL}5-FqqePEEKYq@I{9iH*`Lf-IClZ9QQol-wwLH#AyawyC7MzIxDW+Z(3}@>XnCWG zQyN+H%mpA^5?D(+EJIf+ZAiAz$lbS`-rN>8K3D!s|IflS#Rn#8os=KnYJ`nL&1<`b?yQs_Jy9smAbFk4$ZRg5$4qCe*DE@Dc^Q z8og))^rGUOHTLUbCQMnnEwGVj36w=27B3UQYpR1%Y!&-xO@W|C5i gVu~-d5ol^^Rlwsp9xRcyKzr0XqR$h$Ki_Wr4 -;; License: GNU GPL (same license as Emacs) -;; -;;; Installation: -;; -;; Add something like this to your .emacs: -;; -;; (add-to-list 'load-path "") -;; (add-hook 'slime-load-hook (lambda () (require 'inferior-slime))) -;; (add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode 1))) -(require 'slime) -(require 'cl-lib) - -(define-minor-mode inferior-slime-mode - "\\\ -Inferior SLIME mode: The Inferior Superior Lisp Mode for Emacs. - -This mode is intended for use with `inferior-lisp-mode'. It provides a -subset of the bindings from `slime-mode'. - -\\{inferior-slime-mode-map}" - :keymap - ;; Fake binding to coax `define-minor-mode' to create the keymap - '((" " 'undefined)) - - (slime-setup-completion) - (setq-local tab-always-indent 'complete)) - -(defun inferior-slime-return () - "Handle the return key in the inferior-lisp buffer. -The current input should only be sent if a whole expression has been -entered, i.e. the parenthesis are matched. - -A prefix argument disables this behaviour." - (interactive) - (if (or current-prefix-arg (inferior-slime-input-complete-p)) - (comint-send-input) - (insert "\n") - (inferior-slime-indent-line))) - -(defun inferior-slime-indent-line () - "Indent the current line, ignoring everything before the prompt." - (interactive) - (save-restriction - (let ((indent-start - (save-excursion - (goto-char (process-mark (get-buffer-process (current-buffer)))) - (let ((inhibit-field-text-motion t)) - (beginning-of-line 1)) - (point)))) - (narrow-to-region indent-start (point-max))) - (lisp-indent-line))) - -(defun inferior-slime-input-complete-p () - "Return true if the input is complete in the inferior lisp buffer." - (slime-input-complete-p (process-mark (get-buffer-process (current-buffer))) - (point-max))) - -(defun inferior-slime-closing-return () - "Send the current expression to Lisp after closing any open lists." - (interactive) - (goto-char (point-max)) - (save-restriction - (narrow-to-region (process-mark (get-buffer-process (current-buffer))) - (point-max)) - (while (ignore-errors (save-excursion (backward-up-list 1) t)) - (insert ")"))) - (comint-send-input)) - -(defun inferior-slime-change-directory (directory) - "Set default-directory in the *inferior-lisp* buffer to DIRECTORY." - (let* ((proc (slime-process)) - (buffer (and proc (process-buffer proc)))) - (when buffer - (with-current-buffer buffer - (cd-absolute directory))))) - -(defun inferior-slime-init-keymap () - (let ((map inferior-slime-mode-map)) - (set-keymap-parent map slime-parent-map) - (slime-define-keys map - ([return] 'inferior-slime-return) - ([(control return)] 'inferior-slime-closing-return) - ([(meta control ?m)] 'inferior-slime-closing-return) - ;;("\t" 'slime-indent-and-complete-symbol) - (" " 'slime-space)))) - -(inferior-slime-init-keymap) - -(defun inferior-slime-hook-function () - (inferior-slime-mode 1)) - -(defun inferior-slime-switch-to-repl-buffer () - (switch-to-buffer (process-buffer (slime-inferior-process)))) - -(defun inferior-slime-show-transcript (string) - (remove-hook 'comint-output-filter-functions - 'inferior-slime-show-transcript t) - (with-current-buffer (process-buffer (slime-inferior-process)) - (let ((window (display-buffer (current-buffer) t))) - (set-window-point window (point-max))))) - -(defun inferior-slime-start-transcript () - (let ((proc (slime-inferior-process))) - (when proc - (with-current-buffer (process-buffer proc) - (add-hook 'comint-output-filter-functions - 'inferior-slime-show-transcript - nil t))))) - -(defun inferior-slime-stop-transcript () - (let ((proc (slime-inferior-process))) - (when proc - (with-current-buffer (process-buffer (slime-inferior-process)) - (run-with-timer 0.2 nil - (lambda (buffer) - (with-current-buffer buffer - (remove-hook 'comint-output-filter-functions - 'inferior-slime-show-transcript t))) - (current-buffer)))))) - -(defun inferior-slime-init () - (add-hook 'slime-inferior-process-start-hook 'inferior-slime-hook-function) - (add-hook 'slime-change-directory-hooks 'inferior-slime-change-directory) - (add-hook 'slime-transcript-start-hook 'inferior-slime-start-transcript) - (add-hook 'slime-transcript-stop-hook 'inferior-slime-stop-transcript) - (def-slime-selector-method ?r - "SLIME Read-Eval-Print-Loop." - (process-buffer (slime-inferior-process)))) - -(provide 'inferior-slime) diff --git a/elpa/slime-20200414.1444/contrib/inferior-slime.elc b/elpa/slime-20200414.1444/contrib/inferior-slime.elc deleted file mode 100644 index 12d3b458822cd5ab94c70edaeecf9c38b7427bca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6114 zcmb_gYi}FJ71c+HABv)B-~=s@E6T1&!%OUg56gC%q^w}bY5rop zsFRBPuZ>Z3c6##qn0SxR=pC$BchtEyn@;00r`K%tQWXZ)2)Tx89;U>qRLmQcLZ^MVv(pb6OTEr4Q>pAL5Pk|8^M2#{6P@ zD3Vx|onD}W_k+K1zNrj;62-+(gJVKp?Ew`HHSm|n3+xSs~OD)-nR$O5>Zx8D$7y;Ww5dn zQI%LYBDoefr2}WntU{hMdcwLW@T;9)sf!EnP+rJo{L#tk6krH}yrh=onyhgUxjIL( zrFkORxunsl*K0A#X~Er+iaK*vN?n#+`_es~9Y{o;)!nyTnod}NT!cj+Gca0wC6gN` zCz0JyA2S>4$Rtdk8ZY%5xZh6hN2Si}M`fS-GQ(FC;}Osfr3NvmB9l&?N1~GFG`0yk zed-Ts0HjwmKo&Iqv<~EO92%bvhv!J-Pba;x2$_#j9c=anAs^3|j3ox7W;py0G&XdD zfkaobXh*i}0a-y31j^^1L#d!@% zOG_$bStk{f=LXp^ZL%IMRGmeb@&PiYtvw`BS1QFuIFL8QJOG$fBcg#O8ceJTAdmTl z#dE`uay0BC4$O7Ig#ICKzzKR}_g3#^T;>zna=Z5x`+8UBFdVZ01%=>n2c1)WHcPorQTx>B`t59lv&gaBK!X`#M-mBgde}ON&M|LM2ansgv5YjkcR?ew|H3d4&Jj4_c`$6Jq|KU0-S4-ke_Gl?9ed23%NBZ*uepZ({IR^#Zna0emdFY%xiwEC7nhd#O0KFW1Kb=6zHNSII8s9T> z!G9NsHs`WLO?Lx-;Bg_5TPCPT<20}Cb&Qb?y#a`;_7036*yEmhnk_@YSJanR`DXPoMkMN$f@Kp@dBb~~C2B4=4=sC`j~ zZ}ACNE__PZT3XA!heNNeN4r-pah3~LPNk63d18rn`wa-5Py5Y#)>ABcw!qX_W}{_$ zfvfvBvQpPhRfwz%i#V_NP-kvMOe(a65B4(Fuqhf?(SDN#vz&Y9eF&20?t);Ol(>d0 zsB45XRaerUDU1}Wx&rS*kP_6wt&8s*Vo=X)>~5`5)(722b6Jun;->K{qtfif$rUOA z3kv3#&f~3?!%eRkH8w?x<%U1*urE-;Hh$1N+qeh+XAg0zG$7$HX2KRQ_2zzchBjAa5P>4O{bHWhftA`AWmVl^u>n?#S0SGeDs6 z1Q1y4Hon~iV&hipvi~E%7#g4R8uRb1TwQOi;a+ahN0ye2xn;_bxZT3{XP{p@i;FxD zZZ-EG$9TX5FTj-s?mYtEefT$gV;%d81?l$|U6$`;qNNhI4b@8FsMjK?J4+k`bA9S- zL1~6=5}#=^7j0|d)cJfTW4A|H(61Thp10mfJM-d=xxj1JhRZD=h@QwN+z+KjSX!J5K9Z+@tW+TXDsm{u3TT7(~MaMTjUGL J?aRYq?|*j$xB~zH diff --git a/elpa/slime-20200414.1444/contrib/slime-asdf.el b/elpa/slime-20200414.1444/contrib/slime-asdf.el deleted file mode 100644 index fa4b176e..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-asdf.el +++ /dev/null @@ -1,313 +0,0 @@ -(require 'slime) -(require 'cl-lib) -(require 'grep) - -(define-slime-contrib slime-asdf - "ASDF support." - (:authors "Daniel Barlow " - "Marco Baringer " - "Edi Weitz " - "Stas Boukarev " - "Tobias C Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-asdf) - (:on-load - (add-to-list 'slime-edit-uses-xrefs :depends-on t) - (define-key slime-who-map [?d] 'slime-who-depends-on))) - -;;; NOTE: `system-name' is a predefined variable in Emacs. Try to -;;; avoid it as local variable name. - -;;; Utilities - -(defgroup slime-asdf nil - "ASDF support for Slime." - :prefix "slime-asdf-" - :group 'slime) - -(defvar slime-system-history nil - "History list for ASDF system names.") - -(defun slime-read-system-name (&optional prompt - default-value - determine-default-accurately) - "Read a system name from the minibuffer, prompting with PROMPT. -If no `default-value' is given, one is tried to be determined: if -`determine-default-accurately' is true, by an RPC request which -grovels through all defined systems; if it's not true, by looking -in the directory of the current buffer." - (let* ((completion-ignore-case nil) - (prompt (or prompt "System")) - (system-names (slime-eval `(swank:list-asdf-systems))) - (default-value - (or default-value - (if determine-default-accurately - (slime-determine-asdf-system (buffer-file-name) - (slime-current-package)) - (slime-find-asd-file (or default-directory - (buffer-file-name)) - system-names)))) - (prompt (concat prompt (if default-value - (format " (default `%s'): " default-value) - ": ")))) - (completing-read prompt (slime-bogus-completion-alist system-names) - nil nil nil - 'slime-system-history default-value))) - - - -(defun slime-find-asd-file (directory system-names) - "Tries to find an ASDF system definition file in the -`directory' and returns it if it's in `system-names'." - (let ((asd-files - (directory-files (file-name-directory directory) nil "\.asd$"))) - (cl-loop for system in asd-files - for candidate = (file-name-sans-extension system) - when (cl-find candidate system-names :test #'string-equal) - do (cl-return candidate)))) - -(defun slime-determine-asdf-system (filename buffer-package) - "Try to determine the asdf system that `filename' belongs to." - (slime-eval - `(swank:asdf-determine-system ,(and filename - (slime-to-lisp-filename filename)) - ,buffer-package))) - -(defun slime-who-depends-on-rpc (system) - (slime-eval `(swank:who-depends-on ,system))) - -(defcustom slime-asdf-collect-notes t - "Collect and display notes produced by the compiler. - -See also `slime-highlight-compiler-notes' and -`slime-compilation-finished-hook'." - :group 'slime-asdf) - -(defun slime-asdf-operation-finished-function (system) - (if slime-asdf-collect-notes - #'slime-compilation-finished - (slime-curry (lambda (system result) - (let (slime-highlight-compiler-notes - slime-compilation-finished-hook) - (slime-compilation-finished result))) - system))) - -(defun slime-oos (system operation &rest keyword-args) - "Operate On System." - (slime-save-some-lisp-buffers) - (slime-display-output-buffer) - (message "Performing ASDF %S%s on system %S" - operation (if keyword-args (format " %S" keyword-args) "") - system) - (slime-repl-shortcut-eval-async - `(swank:operate-on-system-for-emacs ,system ',operation ,@keyword-args) - (slime-asdf-operation-finished-function system))) - - -;;; Interactive functions - -(defun slime-load-system (&optional system) - "Compile and load an ASDF system. - -Default system name is taken from first file matching *.asd in current -buffer's working directory" - (interactive (list (slime-read-system-name))) - (slime-oos system 'load-op)) - -(defun slime-open-system (name &optional load interactive) - "Open all files in an ASDF system." - (interactive (list (slime-read-system-name) nil t)) - (when (or load - (and interactive - (not (slime-eval `(swank:asdf-system-loaded-p ,name))) - (y-or-n-p "Load it? "))) - (slime-load-system name)) - (slime-eval-async - `(swank:asdf-system-files ,name) - (lambda (files) - (when files - (let ((files (mapcar 'slime-from-lisp-filename - (nreverse files)))) - (find-file-other-window (car files)) - (mapc 'find-file (cdr files))))))) - -(defun slime-browse-system (name) - "Browse files in an ASDF system using Dired." - (interactive (list (slime-read-system-name))) - (slime-eval-async `(swank:asdf-system-directory ,name) - (lambda (directory) - (when directory - (dired (slime-from-lisp-filename directory)))))) - -(if (fboundp 'rgrep) - (defun slime-rgrep-system (sys-name regexp) - "Run `rgrep' on the base directory of an ASDF system." - (interactive (progn (grep-compute-defaults) - (list (slime-read-system-name nil nil t) - (grep-read-regexp)))) - (rgrep regexp "*.lisp" - (slime-from-lisp-filename - (slime-eval `(swank:asdf-system-directory ,sys-name))))) - (defun slime-rgrep-system () - (interactive) - (error "This command is only supported on GNU Emacs >21.x."))) - -(if (boundp 'multi-isearch-next-buffer-function) - (defun slime-isearch-system (sys-name) - "Run `isearch-forward' on the files of an ASDF system." - (interactive (list (slime-read-system-name nil nil t))) - (let* ((files (mapcar 'slime-from-lisp-filename - (slime-eval `(swank:asdf-system-files ,sys-name)))) - (multi-isearch-next-buffer-function - (lexical-let* - ((buffers-forward (mapcar #'find-file-noselect files)) - (buffers-backward (reverse buffers-forward))) - #'(lambda (current-buffer wrap) - ;; Contrarily to the docstring of - ;; `multi-isearch-next-buffer-function', the first - ;; arg is not necessarily a buffer. Report sent - ;; upstream. (2009-11-17) - (setq current-buffer (or current-buffer (current-buffer))) - (let* ((buffers (if isearch-forward - buffers-forward - buffers-backward))) - (if wrap - (car buffers) - (second (memq current-buffer buffers)))))))) - (isearch-forward))) - (defun slime-isearch-system () - (interactive) - (error "This command is only supported on GNU Emacs >23.1.x."))) - -(defun slime-read-query-replace-args (format-string &rest format-args) - (let* ((minibuffer-setup-hook (slime-minibuffer-setup-hook)) - (minibuffer-local-map slime-minibuffer-map) - (common (query-replace-read-args (apply #'format format-string - format-args) - t t))) - (list (nth 0 common) (nth 1 common) (nth 2 common)))) - -(defun slime-query-replace-system (name from to &optional delimited) - "Run `query-replace' on an ASDF system." - (interactive (let ((system (slime-read-system-name nil nil t))) - (cons system (slime-read-query-replace-args - "Query replace throughout `%s'" system)))) - (condition-case c - ;; `tags-query-replace' actually uses `query-replace-regexp' - ;; internally. - (tags-query-replace (regexp-quote from) to delimited - '(mapcar 'slime-from-lisp-filename - (slime-eval `(swank:asdf-system-files ,name)))) - (error - ;; Kludge: `tags-query-replace' does not actually return but - ;; signals an unnamed error with the below error - ;; message. (<=23.1.2, at least.) - (unless (string-equal (error-message-string c) "All files processed") - (signal (car c) (cdr c))) ; resignal - t))) - -(defun slime-query-replace-system-and-dependents - (name from to &optional delimited) - "Run `query-replace' on an ASDF system and all the systems -depending on it." - (interactive (let ((system (slime-read-system-name nil nil t))) - (cons system (slime-read-query-replace-args - "Query replace throughout `%s'+dependencies" - system)))) - (slime-query-replace-system name from to delimited) - (dolist (dep (slime-who-depends-on-rpc name)) - (when (y-or-n-p (format "Descend into system `%s'? " dep)) - (slime-query-replace-system dep from to delimited)))) - -(defun slime-delete-system-fasls (name) - "Delete FASLs produced by compiling a system." - (interactive (list (slime-read-system-name))) - (slime-repl-shortcut-eval-async - `(swank:delete-system-fasls ,name) - 'message)) - -(defun slime-reload-system (system) - "Reload an ASDF system without reloading its dependencies." - (interactive (list (slime-read-system-name))) - (slime-save-some-lisp-buffers) - (slime-display-output-buffer) - (message "Performing ASDF LOAD-OP on system %S" system) - (slime-repl-shortcut-eval-async - `(swank:reload-system ,system) - (slime-asdf-operation-finished-function system))) - -(defun slime-who-depends-on (system-name) - (interactive (list (slime-read-system-name))) - (slime-xref :depends-on system-name)) - -(defun slime-save-system (system) - "Save files belonging to an ASDF system." - (interactive (list (slime-read-system-name))) - (slime-eval-async - `(swank:asdf-system-files ,system) - (lambda (files) - (dolist (file files) - (let ((buffer (get-file-buffer (slime-from-lisp-filename file)))) - (when buffer - (with-current-buffer buffer - (save-buffer buffer))))) - (message "Done.")))) - - -;;; REPL shortcuts - -(defslime-repl-shortcut slime-repl-load/force-system ("force-load-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'load-op :force t))) - (:one-liner "Recompile and load an ASDF system.")) - -(defslime-repl-shortcut slime-repl-load-system ("load-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'load-op))) - (:one-liner "Compile (as needed) and load an ASDF system.")) - -(defslime-repl-shortcut slime-repl-test/force-system ("force-test-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'test-op :force t))) - (:one-liner "Recompile and test an ASDF system.")) - -(defslime-repl-shortcut slime-repl-test-system ("test-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'test-op))) - (:one-liner "Compile (as needed) and test an ASDF system.")) - -(defslime-repl-shortcut slime-repl-compile-system ("compile-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'compile-op))) - (:one-liner "Compile (but not load) an ASDF system.")) - -(defslime-repl-shortcut slime-repl-compile/force-system - ("force-compile-system") - (:handler (lambda () - (interactive) - (slime-oos (slime-read-system-name) 'compile-op :force t))) - (:one-liner "Recompile (but not completely load) an ASDF system.")) - -(defslime-repl-shortcut slime-repl-open-system ("open-system") - (:handler 'slime-open-system) - (:one-liner "Open all files in an ASDF system.")) - -(defslime-repl-shortcut slime-repl-browse-system ("browse-system") - (:handler 'slime-browse-system) - (:one-liner "Browse files in an ASDF system using Dired.")) - -(defslime-repl-shortcut slime-repl-delete-system-fasls ("delete-system-fasls") - (:handler 'slime-delete-system-fasls) - (:one-liner "Delete FASLs of an ASDF system.")) - -(defslime-repl-shortcut slime-repl-reload-system ("reload-system") - (:handler 'slime-reload-system) - (:one-liner "Recompile and load an ASDF system.")) - -(provide 'slime-asdf) diff --git a/elpa/slime-20200414.1444/contrib/slime-asdf.elc b/elpa/slime-20200414.1444/contrib/slime-asdf.elc deleted file mode 100644 index 21b55f4891c77e424029a09c21bede8905c1d364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15831 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

v#rKGEGs4vABi}E;6IE3n3zjrx&K+1Kx;D zeDlA5*VXZ_U8nt~ZGl^ur=AF{vl%!~WJei_&B3W1Bc0Ik)-Gt7(xd63JwHsq=tHTn zRtO|gY;jr!&~W+J`4o=S`3#$(T0j@v;u(3?7W-2W2<*;rKBr$_ps7EM|FT(hD2j$$ zEkJnyUf4w@r~Z&nc6&p&H~7WV`(OSR7kyDMHUk;uNpzm3*@lhqe(r-A*;%db|N5eYTDA^L!3O6k3GBwp?VY-+0|!m9u{1^*V+z7?O3K`ec$6 zD*L}!ng5c5<$tX}9cXcHuWbC~bE@-rpP?YMPfcQFbvXX|VBbU$Q{hlD1~3({w5ajm zEwSZp=_C;R1kWSND-^-1Y~a$+>yb)@4Q0tok1cFk!JyHU-$qo7)xcKYvt4@aOO}aX z(2zW_b3g$yz2JipKafo5iLenF_H$ch{F?OZwvzMr#V1rADbGJPhT|@t*Cca+Oe z`M$2hAy;Kln`@LDbq04hJi_BSoeip0p}6T$Q};_mQ^(!d-vIeCJ`f2f3!EuFmt*t; zL?Cw9j<=U~c?5d8uqWimtzMs1b~O(&wK`Tu~tyI49&VtzzmgMd6n9kEhArCS9P zJ=9XrF-8-Js)KV>BEy87q>VFfDnu&n zG;L7ds@J`^fJUk-5+CIbgmomd0J1>V2jFYfQ^^|%QJG2)27~U;6;59nWd^=$J#WCiFl77;a!Q_A?wf!Qr!gmZ#pUAV46`4e87^1&^lb zwY8Vo+e7dA>`mouy9UxFA}tTq6T2cb80}ruIv9zspRWNEH>Lm^g&Yt1v8sh8+r-`2WCp zgMwHVb28VQHsiz=i;lsvD=W!$zwLdBMzP0>P^5zdg%37a z=D3$$WGNm+3VecJoV4Br2T^)KR(gAN?eI3TQY=fYCYI-g@fHiJ8g$M_CAAk-YJRsm zs6lkjA1o!yO4ZN$*UJfs5?-x&dqEm!%~NC>GrZ|w<5dQ75z59`jyR+H8ZzqslE?*9 zI1(r_e&VjYnC68& zAkAadVfTl@JI$I6Uk5DfO+OWxX12OeD&QO;|EK?vpvX=!zWQ=u`$mO!EsB3@bT8HM z0S5SH0Twad?CrgVc{Ax1jHnvvcMOzi4Atk5*4}(nqZn0r+lIVe_5Xf2!)plrI+ZWS z{=C!k+9mm$6Z6F{r3DR%yn~DTC2JGn_^EPhn;2blk#q+W!O79m+ER diff --git a/elpa/slime-20200414.1444/contrib/slime-autodoc.el b/elpa/slime-20200414.1444/contrib/slime-autodoc.el deleted file mode 100644 index 3463b47f..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-autodoc.el +++ /dev/null @@ -1,219 +0,0 @@ -(require 'slime) -(require 'eldoc) -(require 'cl-lib) -(require 'slime-parse) - -(define-slime-contrib slime-autodoc - "Show fancy arglist in echo area." - (:license "GPL") - (:authors "Luke Gorrie " - "Lawrence Mitchell " - "Matthias Koeppe " - "Tobias C. Rittweiler ") - (:slime-dependencies slime-parse) - (:swank-dependencies swank-arglists) - (:on-load (slime-autodoc--enable)) - (:on-unload (slime-autodoc--disable))) - -(defcustom slime-autodoc-accuracy-depth 10 - "Number of paren levels that autodoc takes into account for - context-sensitive arglist display (local functions. etc)" - :type 'integer - :group 'slime-ui) - -;;;###autoload -(defcustom slime-autodoc-mode-string (purecopy " adoc") - "String to display in mode line when Autodoc Mode is enabled; nil for none." - :type '(choice string (const :tag "None" nil)) - :group 'slime-ui) - - - -(defun slime-arglist (name) - "Show the argument list for NAME." - (interactive (list (slime-read-symbol-name "Arglist of: " t))) - (let ((arglist (slime-retrieve-arglist name))) - (if (eq arglist :not-available) - (error "Arglist not available") - (message "%s" (slime-autodoc--fontify arglist))))) - -;; used also in slime-c-p-c.el. -(defun slime-retrieve-arglist (name) - (let ((name (cl-etypecase name - (string name) - (symbol (symbol-name name))))) - (car (slime-eval `(swank:autodoc '(,name ,slime-cursor-marker)))))) - -(defun slime-autodoc-manually () - "Like autodoc informtion forcing multiline display." - (interactive) - (let ((doc (slime-autodoc t))) - (cond (doc (eldoc-message doc)) - (t (eldoc-message nil))))) - -;; Must call eldoc-add-command otherwise (eldoc-display-message-p) -;; returns nil and eldoc clears the echo area instead. -(eldoc-add-command 'slime-autodoc-manually) - -(defun slime-autodoc-space (n) - "Like `slime-space' but nicer." - (interactive "p") - (self-insert-command n) - (let ((doc (slime-autodoc))) - (when doc - (eldoc-message doc)))) - -(eldoc-add-command 'slime-autodoc-space) - - -;;;; Autodoc cache - -(defvar slime-autodoc--cache-last-context nil) -(defvar slime-autodoc--cache-last-autodoc nil) - -(defun slime-autodoc--cache-get (context) - "Return the cached autodoc documentation for `context', or nil." - (and (equal context slime-autodoc--cache-last-context) - slime-autodoc--cache-last-autodoc)) - -(defun slime-autodoc--cache-put (context autodoc) - "Update the autodoc cache for CONTEXT with AUTODOC." - (setq slime-autodoc--cache-last-context context) - (setq slime-autodoc--cache-last-autodoc autodoc)) - - -;;;; Formatting autodoc - -(defsubst slime-autodoc--canonicalize-whitespace (string) - (replace-regexp-in-string "[ \n\t]+" " " string)) - -(defun slime-autodoc--format (doc multilinep) - (let ((doc (slime-autodoc--fontify doc))) - (cond (multilinep doc) - (t (slime-oneliner (slime-autodoc--canonicalize-whitespace doc)))))) - -(defun slime-autodoc--fontify (string) - "Fontify STRING as `font-lock-mode' does in Lisp mode." - (with-current-buffer (get-buffer-create (slime-buffer-name :fontify 'hidden)) - (erase-buffer) - (unless (eq major-mode 'lisp-mode) - ;; Just calling (lisp-mode) will turn slime-mode on in that buffer, - ;; which may interfere with this function - (setq major-mode 'lisp-mode) - (lisp-mode-variables t)) - (insert string) - (let ((font-lock-verbose nil)) - (font-lock-fontify-buffer)) - (goto-char (point-min)) - (when (re-search-forward "===> \\(\\(.\\|\n\\)*\\) <===" nil t) - (let ((highlight (match-string 1))) - ;; Can't use (replace-match highlight) here -- broken in Emacs 21 - (delete-region (match-beginning 0) (match-end 0)) - (slime-insert-propertized '(face eldoc-highlight-function-argument) highlight))) - (buffer-substring (point-min) (point-max)))) - -(define-obsolete-function-alias 'slime-fontify-string - 'slime-autodoc--fontify - "SLIME 2.10") - - -;;;; Autodocs (automatic context-sensitive help) - -(defun slime-autodoc (&optional force-multiline) - "Returns the cached arglist information as string, or nil. -If it's not in the cache, the cache will be updated asynchronously." - (save-excursion - (save-match-data - (let ((context (slime-autodoc--parse-context))) - (when context - (let* ((cached (slime-autodoc--cache-get context)) - (multilinep (or force-multiline - eldoc-echo-area-use-multiline-p))) - (cond (cached (slime-autodoc--format cached multilinep)) - (t - (when (slime-background-activities-enabled-p) - (slime-autodoc--async context multilinep)) - nil)))))))) - -;; Return the context around point that can be passed to -;; swank:autodoc. nil is returned if nothing reasonable could be -;; found. -(defun slime-autodoc--parse-context () - (and (slime-autodoc--parsing-safe-p) - (let ((levels slime-autodoc-accuracy-depth)) - (slime-parse-form-upto-point levels)))) - -(defun slime-autodoc--parsing-safe-p () - (cond ((fboundp 'slime-repl-inside-string-or-comment-p) - (not (slime-repl-inside-string-or-comment-p))) - (t - (not (slime-inside-string-or-comment-p))))) - -(defun slime-autodoc--async (context multilinep) - (slime-eval-async - `(swank:autodoc ',context ;; FIXME: misuse of quote - :print-right-margin ,(window-width (minibuffer-window))) - (slime-curry #'slime-autodoc--async% context multilinep))) - -(defun slime-autodoc--async% (context multilinep doc) - (cl-destructuring-bind (doc &optional cache-p) doc - (unless (eq doc :not-available) - (when cache-p - (slime-autodoc--cache-put context doc)) - ;; Now that we've got our information, - ;; get it to the user ASAP. - (when (eldoc-display-message-p) - (eldoc-message (slime-autodoc--format doc multilinep)))))) - - -;;; Minor mode definition - -;; Compute the prefix for slime-doc-map, usually this is C-c C-d. -(defun slime-autodoc--doc-map-prefix () - (concat - (car (rassoc '(slime-prefix-map) slime-parent-bindings)) - (car (rassoc '(slime-doc-map) slime-prefix-bindings)))) - -(define-minor-mode slime-autodoc-mode - "Toggle echo area display of Lisp objects at point." - :lighter slime-autodoc-mode-string - :keymap (let ((prefix (slime-autodoc--doc-map-prefix))) - `((,(concat prefix "A") . slime-autodoc-manually) - (,(concat prefix (kbd "C-A")) . slime-autodoc-manually) - (,(kbd "SPC") . slime-autodoc-space))) - (set (make-local-variable 'eldoc-minor-mode-string) nil) - (if (boundp 'eldoc-documentation-functions) - (add-hook 'eldoc-documentation-functions 'slime-autodoc nil t) - (set (make-local-variable 'eldoc-documentation-function) 'slime-autodoc)) - (eldoc-mode arg) - (setq slime-autodoc-mode t) - (when (called-interactively-p 'interactive) - (message "Slime autodoc mode %s." - (if slime-autodoc-mode "enabled" "disabled")))) - - -;;; Noise to enable/disable slime-autodoc-mode - -(defun slime-autodoc--on () (slime-autodoc-mode 1)) -(defun slime-autodoc--off () (slime-autodoc-mode 0)) - -(defvar slime-autodoc--relevant-hooks - '(slime-mode-hook slime-repl-mode-hook sldb-mode-hook)) - -(defun slime-autodoc--enable () - (dolist (h slime-autodoc--relevant-hooks) - (add-hook h 'slime-autodoc--on)) - (dolist (b (buffer-list)) - (with-current-buffer b - (when slime-mode - (slime-autodoc--on))))) - -(defun slime-autodoc--disable () - (dolist (h slime-autodoc--relevant-hooks) - (remove-hook h 'slime-autodoc--on)) - (dolist (b (buffer-list)) - (with-current-buffer b - (when slime-autodoc-mode - (slime-autodoc--off))))) - -(provide 'slime-autodoc) diff --git a/elpa/slime-20200414.1444/contrib/slime-autodoc.elc b/elpa/slime-20200414.1444/contrib/slime-autodoc.elc deleted file mode 100644 index d96ab576de90234c3ef14d234816881185240c69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9187 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" - "Luke Gorrie ") - (:license "GPL") - (:on-load (setq slime-repl-banner-function 'slime-startup-message)) - (:on-unload (setq slime-repl-banner-function 'slime-repl-insert-banner))) - -(defcustom slime-startup-animation (fboundp 'animate-string) - "Enable the startup animation." - :type '(choice (const :tag "Enable" t) (const :tag "Disable" nil)) - :group 'slime-ui) - -(defcustom slime-header-line-p (boundp 'header-line-format) - "If non-nil, display a header line in Slime buffers." - :type 'boolean - :group 'slime-repl) - -(defun slime-startup-message () - (when slime-header-line-p - (setq header-line-format - (format "%s Port: %s Pid: %s" - (slime-lisp-implementation-type) - (slime-connection-port (slime-connection)) - (slime-pid)))) - (when (zerop (buffer-size)) - (let ((welcome (concat "; SLIME " slime-version))) - (if slime-startup-animation - (animate-string welcome 0 0) - (insert welcome))))) - -(provide 'slime-banner) diff --git a/elpa/slime-20200414.1444/contrib/slime-banner.elc b/elpa/slime-20200414.1444/contrib/slime-banner.elc deleted file mode 100644 index d952505a18ad605cd293185a9ee598b0d6e59eee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1825 zcmbtVO>Y}F5Y?@La&b>R^fKABu~c{k?QZNeRuH6ch17rx7;t-ve4x0q77;GVl3WMQ zukY|<9T{;>5kN0Fe4Ke4z8SC97iT|BCX?xEwSqI<8zHfc3!z}$Gw$FPtrJ>7eX?lc z&L`n_z@!9iyy(Se=4sn4rg8J1op8{R7Z@BmXzvv31&3C1=dDmT?ud4+^T65`Tey!> zyzw*&)@}aZ`u9as59(-5+P8L=Eadmcn4t&Qftd6^y*EOKp0^g#rq znh4p;{{FKkOt$3Q&WgWK_7r0+B^AV*9ft2auKS*fObTZf3jNyxii_bR!h3D4K!7)r zR_`2Dw^=xRTg+iryuZAlFCU!Oec2+H%wl=VtYBMe2PydY{7i{H_6?YITRo`Oz+ti> zNhCCiITULZPx>95PO^dfbBh8_{hdLW@tqbte5na}GP0ZTWC5Od?c4tpF1Rd0g64BL zy|H>Qnc5)oWQWu>EZtpUX<#CRygl9CX;g=uj(**0w ze+hm38=*;x>hkAJ7fv6B^~uw)AF7*#yR7Gvr+iM6&|4C<{VSV%tCW|NfP91TKg1`L zq?>O)bv{)5>Hsda^`{VLq79QGI}4I4MQ") - (:license "GPL") - (:swank-dependencies swank-buffer-streams)) - -(defslimefun slime-make-buffer-stream-target (thread name) - (message "making target %s" name) - (slime-buffer-streams--get-target-marker name) - `(:stream-target-created ,thread ,name)) - -(defun slime-buffer-streams--get-target-name (target) - (format "*slime-target %s*" target)) - -(defvar-local slime-buffer-stream-target nil) - -;; TODO: tell backend that the buffer has been closed, so it can close -;; the stream -(defun slime-buffer-streams--cleanup-markers () - (when slime-buffer-stream-target - (message "Removing target: %s" slime-buffer-stream-target) - (remhash slime-buffer-stream-target slime-output-target-to-marker))) - -(defun slime-buffer-streams--get-target-marker (target) - (or (gethash target slime-output-target-to-marker) - (with-current-buffer - (generate-new-buffer (slime-buffer-streams--get-target-name target)) - (setq slime-buffer-stream-target target) - (add-hook 'kill-buffer-hook 'slime-buffer-streams--cleanup-markers) - (setf (gethash target slime-output-target-to-marker) - (point-marker))))) - -(provide 'slime-buffer-streams) diff --git a/elpa/slime-20200414.1444/contrib/slime-buffer-streams.elc b/elpa/slime-20200414.1444/contrib/slime-buffer-streams.elc deleted file mode 100644 index 247f051f31e6a27710c9e4796d780118b1b6c17f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2004 zcmbtVL2uJA6z(xA;=+Xk99~la?O3X&SvR%<0!AniAYaTZ0Ei2ec$_%(fI1(Wuwt(jz%N65c!H_G_eni!#F3gf;E+j2@ZpkUSxM} znO*?NG7u}xa`u~O+*ZA&-Tbv+3R27hg`x_QJ5F*ILn30OCF65-gu7B{AW1?K*i;G6 zdV{kEITC?6xX=&_t_dD4bQ*lX6&`&3d2x9O@q$PaYlL`Y%M+e}5)cy(GYXj?J4IY8 z3Mi2oqZ0H24-TTTE>iGcmjUp z+^f@_LNxt5nt~hFAH!2y-6fvgX&S^Lp?hsq;7vj?@F zw8I|cL@v>X=jAL{t1;%)H2JrIyPwX&GCf&l%66<5Y&&)q9J*A}!2v*3;Em3GRM#Z@nl^7d6f6!d4w~C&FkyO%rLDXW)(o>(N``S3E_tY7BCE}A- zLsriATCE#1a^4Fx@y6rjKzgqZUgK)?%y=9oY5TpKNT=Y_tv$g>JN(o>UqgFfZ#bf+ zOPEtmCC*~N>8*2L-AJh5ey4T{@&6Vqgjm9oWm#ohyHEoH-`|%SrLhQBf^qGnnZmL8 U0>f}hFq2T|pAzk_b`4~r0mpa1{> diff --git a/elpa/slime-20200414.1444/contrib/slime-c-p-c.el b/elpa/slime-20200414.1444/contrib/slime-c-p-c.el deleted file mode 100644 index 22a267b1..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-c-p-c.el +++ /dev/null @@ -1,305 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -(defvar slime-c-p-c-init-undo-stack nil) - -(define-slime-contrib slime-c-p-c - "ILISP style Compound Prefix Completion." - (:authors "Luke Gorrie " - "Edi Weitz " - "Matthias Koeppe " - "Tobias C. Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-parse slime-editing-commands slime-autodoc) - (:swank-dependencies swank-c-p-c) - (:on-load - (push - `(progn - (remove-hook 'slime-completion-at-point-functions - #'slime-c-p-c-completion-at-point) - (remove-hook 'slime-connected-hook 'slime-c-p-c-on-connect) - ,@(when (featurep 'slime-repl) - `((define-key slime-mode-map "\C-c\C-s" - ',(lookup-key slime-mode-map "\C-c\C-s")) - (define-key slime-repl-mode-map "\C-c\C-s" - ',(lookup-key slime-repl-mode-map "\C-c\C-s"))))) - slime-c-p-c-init-undo-stack) - (add-hook 'slime-completion-at-point-functions - #'slime-c-p-c-completion-at-point) - (define-key slime-mode-map "\C-c\C-s" 'slime-complete-form) - (when (featurep 'slime-repl) - (define-key slime-repl-mode-map "\C-c\C-s" 'slime-complete-form))) - (:on-unload - (while slime-c-p-c-init-undo-stack - (eval (pop slime-c-p-c-init-undo-stack))))) - -(defcustom slime-c-p-c-unambiguous-prefix-p t - "If true, set point after the unambigous prefix. -If false, move point to the end of the inserted text." - :type 'boolean - :group 'slime-ui) - -(defcustom slime-complete-symbol*-fancy nil - "Use information from argument lists for DWIM'ish symbol completion." - :group 'slime-mode - :type 'boolean) - - -;; FIXME: this is the old code to display completions. Remove it once -;; `slime-complete-symbol*' and `slime-fuzzy-complete-symbol' can be -;; used together with `completion-at-point'. - -(defvar slime-completions-buffer-name "*Completions*") - -;; FIXME: can probably use quit-window instead -(make-variable-buffer-local - (defvar slime-complete-saved-window-configuration nil - "Window configuration before we show the *Completions* buffer. -This is buffer local in the buffer where the completion is -performed.")) - -(make-variable-buffer-local - (defvar slime-completions-window nil - "The window displaying *Completions* after saving window configuration. -If this window is no longer active or displaying the completions -buffer then we can ignore `slime-complete-saved-window-configuration'.")) - -(defun slime-complete-maybe-save-window-configuration () - "Maybe save the current window configuration. -Return true if the configuration was saved." - (unless (or slime-complete-saved-window-configuration - (get-buffer-window slime-completions-buffer-name)) - (setq slime-complete-saved-window-configuration - (current-window-configuration)) - t)) - -(defun slime-complete-delay-restoration () - (add-hook 'pre-command-hook - 'slime-complete-maybe-restore-window-configuration - 'append - 'local)) - -(defun slime-complete-forget-window-configuration () - (setq slime-complete-saved-window-configuration nil) - (setq slime-completions-window nil)) - -(defun slime-complete-restore-window-configuration () - "Restore the window config if available." - (remove-hook 'pre-command-hook - 'slime-complete-maybe-restore-window-configuration) - (when (and slime-complete-saved-window-configuration - (slime-completion-window-active-p)) - (save-excursion (set-window-configuration - slime-complete-saved-window-configuration)) - (setq slime-complete-saved-window-configuration nil) - (when (buffer-live-p slime-completions-buffer-name) - (kill-buffer slime-completions-buffer-name)))) - -(defun slime-complete-maybe-restore-window-configuration () - "Restore the window configuration, if the following command -terminates a current completion." - (remove-hook 'pre-command-hook - 'slime-complete-maybe-restore-window-configuration) - (condition-case err - (cond ((cl-find last-command-event "()\"'`,# \r\n:") - (slime-complete-restore-window-configuration)) - ((not (slime-completion-window-active-p)) - (slime-complete-forget-window-configuration)) - (t - (slime-complete-delay-restoration))) - (error - ;; Because this is called on the pre-command-hook, we mustn't let - ;; errors propagate. - (message "Error in slime-complete-restore-window-configuration: %S" - err)))) - -(defun slime-completion-window-active-p () - "Is the completion window currently active?" - (and (window-live-p slime-completions-window) - (equal (buffer-name (window-buffer slime-completions-window)) - slime-completions-buffer-name))) - -(defun slime-display-completion-list (completions start end) - (let ((savedp (slime-complete-maybe-save-window-configuration))) - (with-output-to-temp-buffer slime-completions-buffer-name - (display-completion-list completions) - (with-current-buffer standard-output - (setq completion-base-position (list start end)) - (set-syntax-table lisp-mode-syntax-table))) - (when savedp - (setq slime-completions-window - (get-buffer-window slime-completions-buffer-name))))) - -(defun slime-display-or-scroll-completions (completions start end) - (cond ((and (eq last-command this-command) - (slime-completion-window-active-p)) - (slime-scroll-completions)) - (t - (slime-display-completion-list completions start end))) - (slime-complete-delay-restoration)) - -(defun slime-scroll-completions () - (let ((window slime-completions-window)) - (with-current-buffer (window-buffer window) - (if (pos-visible-in-window-p (point-max) window) - (set-window-start window (point-min)) - (save-selected-window - (select-window window) - (scroll-up)))))) - -(defun slime-minibuffer-respecting-message (format &rest format-args) - "Display TEXT as a message, without hiding any minibuffer contents." - (let ((text (format " [%s]" (apply #'format format format-args)))) - (if (minibuffer-window-active-p (minibuffer-window)) - (minibuffer-message text) - (message "%s" text)))) - -(defun slime-maybe-complete-as-filename () - "If point is at a string starting with \", complete it as filename. - Return nil if point is not at filename." - (when (save-excursion (re-search-backward "\"[^ \t\n]+\\=" - (max (point-min) - (- (point) 1000)) t)) - (let ((comint-completion-addsuffix '("/" . "\""))) - (comint-replace-by-expanded-filename) - t))) - - -(defun slime-complete-symbol* () - "Expand abbreviations and complete the symbol at point." - ;; NB: It is only the name part of the symbol that we actually want - ;; to complete -- the package prefix, if given, is just context. - (or (slime-maybe-complete-as-filename) - (slime-expand-abbreviations-and-complete))) - -(defun slime-c-p-c-completion-at-point () - #'slime-complete-symbol*) - -;; FIXME: factorize -(defun slime-expand-abbreviations-and-complete () - (let* ((end (move-marker (make-marker) (slime-symbol-end-pos))) - (beg (move-marker (make-marker) (slime-symbol-start-pos))) - (prefix (buffer-substring-no-properties beg end)) - (completion-result (slime-contextual-completions beg end)) - (completion-set (cl-first completion-result)) - (completed-prefix (cl-second completion-result))) - (if (null completion-set) - (progn (slime-minibuffer-respecting-message - "Can't find completion for \"%s\"" prefix) - (ding) - (slime-complete-restore-window-configuration)) - ;; some XEmacs issue makes this distinction necessary - (cond ((> (length completed-prefix) (- end beg)) - (goto-char end) - (insert-and-inherit completed-prefix) - (delete-region beg end) - (goto-char (+ beg (length completed-prefix)))) - (t nil)) - (cond ((and (member completed-prefix completion-set) - (slime-length= completion-set 1)) - (slime-minibuffer-respecting-message "Sole completion") - (when slime-complete-symbol*-fancy - (slime-complete-symbol*-fancy-bit)) - (slime-complete-restore-window-configuration)) - ;; Incomplete - (t - (when (member completed-prefix completion-set) - (slime-minibuffer-respecting-message - "Complete but not unique")) - (when slime-c-p-c-unambiguous-prefix-p - (let ((unambiguous-completion-length - (cl-loop for c in completion-set - minimizing (or (cl-mismatch completed-prefix c) - (length completed-prefix))))) - (goto-char (+ beg unambiguous-completion-length)))) - (slime-display-or-scroll-completions completion-set - beg - (max (point) end))))))) - -(defun slime-complete-symbol*-fancy-bit () - "Do fancy tricks after completing a symbol. -\(Insert a space or close-paren based on arglist information.)" - (let ((arglist (slime-retrieve-arglist (slime-symbol-at-point)))) - (unless (eq arglist :not-available) - (let ((args - ;; Don't intern these symbols - (let ((obarray (make-vector 10 0))) - (cdr (read arglist)))) - (function-call-position-p - (save-excursion - (backward-sexp) - (equal (char-before) ?\()))) - (when function-call-position-p - (if (null args) - (execute-kbd-macro ")") - (execute-kbd-macro " ") - (when (and (slime-background-activities-enabled-p) - (not (minibuffer-window-active-p (minibuffer-window)))) - (slime-echo-arglist)))))))) - -(cl-defun slime-contextual-completions (beg end) - "Return a list of completions of the token from BEG to END in the -current buffer." - (let ((token (buffer-substring-no-properties beg end))) - (cond - ((and (< beg (point-max)) - (string= (buffer-substring-no-properties beg (1+ beg)) ":")) - ;; Contextual keyword completion - (let ((completions - (slime-completions-for-keyword token - (save-excursion - (goto-char beg) - (slime-parse-form-upto-point))))) - (when (cl-first completions) - (cl-return-from slime-contextual-completions completions)) - ;; If no matching keyword was found, do regular symbol - ;; completion. - )) - ((and (>= (length token) 2) - (string= (cl-subseq token 0 2) "#\\")) - ;; Character name completion - (cl-return-from slime-contextual-completions - (slime-completions-for-character token)))) - ;; Regular symbol completion - (slime-completions token))) - -(defun slime-completions (prefix) - (slime-eval `(swank:completions ,prefix ',(slime-current-package)))) - -(defun slime-completions-for-keyword (prefix buffer-form) - (slime-eval `(swank:completions-for-keyword ,prefix ',buffer-form))) - -(defun slime-completions-for-character (prefix) - (cl-labels ((append-char-syntax (string) (concat "#\\" string))) - (let ((result (slime-eval `(swank:completions-for-character - ,(cl-subseq prefix 2))))) - (when (car result) - (list (mapcar #'append-char-syntax (car result)) - (append-char-syntax (cadr result))))))) - - -;;; Complete form - -(defun slime-complete-form () - "Complete the form at point. -This is a superset of the functionality of `slime-insert-arglist'." - (interactive) - ;; Find the (possibly incomplete) form around point. - (let ((buffer-form (slime-parse-form-upto-point))) - (let ((result (slime-eval `(swank:complete-form ',buffer-form)))) - (if (eq result :not-available) - (error "Could not generate completion for the form `%s'" buffer-form) - (progn - (just-one-space (if (looking-back "\\s(" (1- (point))) - 0 - 1)) - (save-excursion - (insert result) - (let ((slime-close-parens-limit 1)) - (slime-close-all-parens-in-sexp))) - (save-excursion - (backward-up-list 1) - (indent-sexp))))))) - -(provide 'slime-c-p-c) - diff --git a/elpa/slime-20200414.1444/contrib/slime-c-p-c.elc b/elpa/slime-20200414.1444/contrib/slime-c-p-c.elc deleted file mode 100644 index 8fc20ffab9b3fe75ba23f1f4eaaeb2a7df71ea86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10903 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 mp%evD&0l -;; Created: July 1987 -;; Maintainer: FSF -;; Keywords: lisp, tools -;; Package: emacs - -;; This file is forked from cl-indent.el, which is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: - -;; This package supplies a single entry point, common-lisp-indent-function, -;; which performs indentation in the preferred style for Common Lisp code. -;; To enable it: -;; -;; (setq lisp-indent-function 'common-lisp-indent-function) -;; -;; This file is substantially patched from original cl-indent.el, -;; which is in Emacs proper. It does not require SLIME, but is instead -;; required by one of it's contribs, `slime-indentation'. -;; -;; Before making modifications to this file, consider adding them to -;; Emacs's own `cl-indent' and refactoring this file to be an -;; extension of Emacs's. - -;;; Code: - -(require 'slime) ; only for its cl-lib loading smartness -(require 'cl-lib) -(eval-when-compile (require 'cl)) - -(defgroup lisp-indent nil - "Indentation in Lisp." - :group 'lisp) - -(defcustom lisp-indent-maximum-backtracking 6 - "Maximum depth to backtrack out from a sublist for structured indentation. -If this variable is 0, no backtracking will occur and forms such as `flet' -may not be correctly indented if this value is less than 4." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-tag-indentation 1 - "Indentation of tags relative to containing list. -This variable is used by the function `lisp-indent-tagbody'." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-tag-body-indentation 3 - "Indentation of non-tagged lines relative to containing list. -This variable is used by the function `lisp-indent-tagbody' to indent normal -lines (lines without tags). -The indentation is relative to the indentation of the parenthesis enclosing -the special form. If the value is t, the body of tags will be indented -as a block at the same indentation as the first s-expression following -the tag. In this case, any forms before the first tag are indented -by `lisp-body-indent'." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-backquote-indentation t - "Whether or not to indent backquoted lists as code. -If nil, indent backquoted lists as data, i.e., like quoted lists." - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-loop-indent-subclauses t - "Whether or not to indent loop subclauses." - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-simple-loop-indentation 2 - "Indentation of forms in simple loop forms." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-loop-clauses-indentation 2 - "Indentation of loop clauses if `loop' is immediately followed by a newline." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-loop-indent-body-forms-relative-to-loop-start nil - "When true, indent loop body clauses relative to the open paren of the loop -form, instead of the keyword position." - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-loop-body-forms-indentation 3 - "Indentation of loop body clauses." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-loop-indent-forms-like-keywords nil - "Whether or not to indent loop subforms just like -loop keywords. Only matters when `lisp-loop-indent-subclauses' -is nil." - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-align-keywords-in-calls t - "Whether to align keyword arguments vertically or not. -If t (the default), keywords in contexts where no other -indentation rule takes precedence are aligned like this: - -\(make-instance 'foo :bar t - :quux 42) - -If nil, they are indented like any other function -call arguments: - -\(make-instance 'foo :bar t - :quux 42)" - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-lambda-list-indentation t - "Whether to indent lambda-lists specially. Defaults to t. Setting this to -nil makes `lisp-lambda-list-keyword-alignment', -`lisp-lambda-list-keyword-parameter-alignment', and -`lisp-lambda-list-keyword-parameter-indentation' meaningless, causing -lambda-lists to be indented as if they were data: - -\(defun example (a b &optional o1 o2 - o3 o4 - &rest r - &key k1 k2 - k3 k4) - #|...|#)" - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-lambda-list-keyword-alignment nil - "Whether to vertically align lambda-list keywords together. -If nil (the default), keyworded lambda-list parts are aligned -with the initial mandatory arguments, like this: - -\(defun foo (arg1 arg2 &rest rest - &key key1 key2) - #|...|#) - -If non-nil, alignment is done with the first keyword -\(or falls back to the previous case), as in: - -\(defun foo (arg1 arg2 &rest rest - &key key1 key2) - #|...|#)" - :type 'boolean - :group 'lisp-indent) - -(defcustom lisp-lambda-list-keyword-parameter-indentation 2 - "Indentation of lambda list keyword parameters. -See `lisp-lambda-list-keyword-parameter-alignment' -for more information." - :type 'integer - :group 'lisp-indent) - -(defcustom lisp-lambda-list-keyword-parameter-alignment nil - "Whether to vertically align lambda-list keyword parameters together. -If nil (the default), the parameters are aligned -with their corresponding keyword, plus the value of -`lisp-lambda-list-keyword-parameter-indentation', like this: - -\(defun foo (arg1 arg2 &key key1 key2 - key3 key4) - #|...|#) - -If non-nil, alignment is done with the first parameter -\(or falls back to the previous case), as in: - -\(defun foo (arg1 arg2 &key key1 key2 - key3 key4) - #|...|#)" - :type 'boolean - :group 'lisp-indent) - - -(defvar lisp-indent-defun-method '(4 &lambda &body) - "Defun-like indentation method. -This applies when the value of the `common-lisp-indent-function' property -is set to `defun'.") - - -;;;; Named styles. -;;;; -;;;; -*- common-lisp-style: foo -*- -;;;; -;;;; sets the style for the buffer. -;;;; -;;;; A Common Lisp style is a list of the form: -;;;; -;;;; (NAME INHERIT VARIABLES INDENTATION HOOK DOCSTRING) -;;;; -;;;; where NAME is a symbol naming the style, INHERIT is the name of the style -;;;; it inherits from, VARIABLES is an alist specifying buffer local variables -;;;; for the style, and INDENTATION is an alist specifying non-standard -;;;; indentations for Common Lisp symbols. HOOK is a function to call when -;;;; activating the style. DOCSTRING is the documentation for the style. -;;;; -;;;; Convenience accessors `common-lisp-style-name', &co exist. -;;;; -;;;; `common-lisp-style' stores the name of the current style. -;;;; -;;;; `common-lisp-style-default' stores the name of the style to use when none -;;;; has been specified. -;;;; -;;;; `common-lisp-active-style' stores a cons of the list specifying the -;;;; current style, and a hash-table containing all indentation methods of -;;;; that style and any styles it inherits from. Whenever we're indenting, we -;;;; check that this is up to date, and recompute when necessary. -;;;; -;;;; Just setting the buffer local common-lisp-style will be enough to have -;;;; the style take effect. `common-lisp-set-style' can also be called -;;;; explicitly, however, and offers name completion, etc. - -;;; Convenience accessors -(defun common-lisp-style-name (style) (first style)) -(defun common-lisp-style-inherits (style) (second style)) -(defun common-lisp-style-variables (style) (third style)) -(defun common-lisp-style-indentation (style) (fourth style)) -(defun common-lisp-style-hook (style) (fifth style)) -(defun common-lisp-style-docstring (style) (sixth style)) - -(defun common-lisp-make-style (stylename inherits variables indentation hook - documentation) - (list stylename inherits variables indentation hook documentation)) - -(defvar common-lisp-style nil) - -;;; `define-common-lisp-style' updates the docstring of -;;; `common-lisp-style', using this as the base. -(put 'common-lisp-style 'common-lisp-style-base-doc - "Name of the Common Lisp indentation style used in the current buffer. -Set this by giving eg. - - ;; -*- common-lisp-style: sbcl -*- - -in the first line of the file, or by calling `common-lisp-set-style'. If -buffer has no style specified, but `common-lisp-style-default' is set, that -style is used instead. Use `define-common-lisp-style' to define new styles.") - -(make-variable-buffer-local 'common-lisp-style) -(set-default 'common-lisp-style nil) - -;;; `lisp-mode' kills all buffer-local variables. Setting the -;;; `permanent-local' property allows us to retain the style. -(put 'common-lisp-style 'permanent-local t) - -;;; Mark as safe when the style doesn't evaluate arbitrary code. -(put 'common-lisp-style 'safe-local-variable 'common-lisp-safe-style-p) - -;;; Common Lisp indentation style specifications. -(defvar common-lisp-styles (make-hash-table :test 'equal)) - -(defun common-lisp-delete-style (stylename) - (remhash stylename common-lisp-styles)) - -(defun common-lisp-find-style (stylename) - (let ((name (if (symbolp stylename) - (symbol-name stylename) - stylename))) - (or (gethash name common-lisp-styles) - (error "Unknown Common Lisp style: %s" name)))) - -(defun common-lisp-safe-style-p (stylename) - "True for known Common Lisp style without an :EVAL option. -Ie. styles that will not evaluate arbitrary code on activation." - (let* ((style (ignore-errors (common-lisp-find-style stylename))) - (base (common-lisp-style-inherits style))) - (and style - (not (common-lisp-style-hook style)) - (or (not base) - (common-lisp-safe-style-p base))))) - -(defun common-lisp-add-style (stylename inherits variables indentation hooks - documentation) - ;; Invalidate indentation methods cached in common-lisp-active-style. - (maphash (lambda (k v) - (puthash k (cl-copy-list v) common-lisp-styles)) - common-lisp-styles) - ;; Add/Redefine the specified style. - (puthash stylename - (common-lisp-make-style stylename inherits variables indentation - hooks documentation) - common-lisp-styles) - ;; Frob `common-lisp-style' docstring. - (let ((doc (get 'common-lisp-style 'common-lisp-style-base-doc)) - (all nil)) - (setq doc (concat doc "\n\nAvailable styles are:\n")) - (maphash (lambda (name style) - (push (list name (common-lisp-style-docstring style)) all)) - common-lisp-styles) - (dolist (info (sort all (lambda (a b) (string< (car a) (car b))))) - (let ((style-name (first info)) - (style-doc (second info))) - (if style-doc - (setq doc (concat doc - "\n " style-name "\n" - " " style-doc "\n")) - (setq doc (concat doc - "\n " style-name " (undocumented)\n"))))) - (put 'common-lisp-style 'variable-documentation doc)) - stylename) - -;;; Activate STYLENAME, adding its indentation methods to METHODS -- and -;;; recurse on style inherited from. -(defun common-lisp-activate-style (stylename methods) - (let* ((style (common-lisp-find-style stylename)) - (basename (common-lisp-style-inherits style))) - ;; Recurse on parent. - (when basename - (common-lisp-activate-style basename methods)) - ;; Copy methods - (dolist (spec (common-lisp-style-indentation style)) - (puthash (first spec) (second spec) methods)) - ;; Bind variables. - (dolist (var (common-lisp-style-variables style)) - (set (make-local-variable (first var)) (second var))) - ;; Run hook. - (let ((hook (common-lisp-style-hook style))) - (when hook - (funcall hook))))) - -;;; When a style is being used, `common-lisp-active-style' holds a cons -;;; -;;; (STYLE . METHODS) -;;; -;;; where STYLE is the list specifying the currently active style, and -;;; METHODS is the table of indentation methods -- including inherited -;;; ones -- for it. `common-lisp-active-style-methods' is reponsible -;;; for keeping this up to date. -(make-variable-buffer-local (defvar common-lisp-active-style nil)) - -;;; Makes sure common-lisp-active-style corresponds to common-lisp-style, and -;;; pick up redefinitions, etc. Returns the method table for the currently -;;; active style. -(defun common-lisp-active-style-methods () - (let* ((name common-lisp-style) - (style (when name (common-lisp-find-style name)))) - (if (eq style (car common-lisp-active-style)) - (cdr common-lisp-active-style) - (when style - (let ((methods (make-hash-table :test 'equal))) - (common-lisp-activate-style name methods) - (setq common-lisp-active-style (cons style methods)) - methods))))) - -(defvar common-lisp-set-style-history nil) - -(defun common-lisp-style-names () - (let (names) - (maphash (lambda (k v) - (push (cons k v) names)) - common-lisp-styles) - names)) - -(defun common-lisp-set-style (stylename) - "Set current buffer to use the Common Lisp style STYLENAME. -STYLENAME, a string, must be an existing Common Lisp style. Styles -are added (and updated) using `define-common-lisp-style'. - -The buffer-local variable `common-lisp-style' will get set to STYLENAME. - -A Common Lisp style is composed of local variables, indentation -specifications, and may also contain arbitrary elisp code to run upon -activation." - (interactive - (list (let ((completion-ignore-case t) - (prompt "Specify Common Lisp indentation style: ")) - (completing-read prompt - (common-lisp-style-names) nil t nil - 'common-lisp-set-style-history)))) - (setq common-lisp-style (common-lisp-style-name - (common-lisp-find-style stylename)) - common-lisp-active-style nil) - ;; Actually activates the style. - (common-lisp-active-style-methods) - stylename) - -(defmacro define-common-lisp-style (name documentation &rest options) - "Define a Common Lisp indentation style. - -NAME is the name of the style. - -DOCUMENTATION is the docstring for the style, automatically added to the -docstring of `common-lisp-style'. - -OPTIONS are: - - (:variables (name value) ...) - - Specifying the buffer local variables associated with the style. - - (:indentation (symbol spec) ...) - - Specifying custom indentations associated with the style. SPEC is - a normal `common-lisp-indent-function' indentation specification. - - (:inherit style) - - Inherit variables and indentations from another Common Lisp style. - - (:eval form ...) - - Lisp code to evaluate when activating the style. This can be used to - eg. activate other modes. It is possible that over the lifetime of - a buffer same style gets activated multiple times, so code in :eval - option should cope with that. -" - (when (consp documentation) - (setq options (cons documentation options) - documentation nil)) - `(common-lisp-add-style ,name - ',(cadr (assoc :inherit options)) - ',(cdr (assoc :variables options)) - ',(cdr (assoc :indentation options)) - ,(when (assoc :eval options) - `(lambda () - ,@(cdr (assoc :eval options)))) - ,documentation)) - -(define-common-lisp-style "basic-common" - (:variables - (lisp-indent-maximum-backtracking 6) - (lisp-tag-indentation 1) - (lisp-tag-body-indentation 3) - (lisp-backquote-indentation t) - (lisp-loop-indent-subclauses t) - (lisp-loop-indent-forms-like-keywords nil) - (lisp-simple-loop-indentation 2) - (lisp-align-keywords-in-calls t) - (lisp-lambda-list-indentation t) - (lisp-lambda-list-keyword-alignment nil) - (lisp-lambda-list-keyword-parameter-indentation 2) - (lisp-lambda-list-keyword-parameter-alignment nil) - (lisp-indent-defun-method (4 &lambda &body)) - (lisp-loop-clauses-indentation 2) - (lisp-loop-indent-body-forms-relative-to-loop-start nil) - (lisp-loop-body-forms-indentation 3))) - -(define-common-lisp-style "basic-emacs25" - "This style adds a workaround needed for Emacs 25" - (:inherit "basic-common") - (:variables - ;; Without these (;;foo would get a space inserted between - ;; ( and ; by indent-sexp. - (comment-indent-function (lambda () nil)))) - -(define-common-lisp-style "basic-emacs26" - "This style is the same as basic-common. It doesn't need or - want the workaround used in Emacs 25. In Emacs 26, that - workaround introduces a weird behavior where a single - semicolon breaks the mode and causes the cursor to move to the - start of the line after every character inserted." - (:inherit "basic-common")) - -(if (>= emacs-major-version 26) - (define-common-lisp-style "basic" - "This style merely gives all identation variables their default values, - making it easy to create new styles that are proof against user - customizations. It also adjusts comment indentation from default. - All other predefined modes inherit from basic." - (:inherit "basic-emacs26")) - (define-common-lisp-style "basic" - "This style merely gives all identation variables their default values, - making it easy to create new styles that are proof against user - customizations. It also adjusts comment indentation from default. - All other predefined modes inherit from basic." - (:inherit "basic-emacs25"))) - -(define-common-lisp-style "classic" - "This style of indentation emulates the most striking features of 1995 - vintage cl-indent.el once included as part of Slime: IF indented by two - spaces, and CASE clause bodies indentented more deeply than the keys." - (:inherit "basic") - (:variables - (lisp-lambda-list-keyword-parameter-indentation 0)) - (:indentation - (case (4 &rest (&whole 2 &rest 3))) - (if (4 2 2)))) - -(define-common-lisp-style "modern" - "A good general purpose style. Turns on lambda-list keyword and keyword - parameter alignment, and turns subclause aware loop indentation off. - (Loop indentation so because simpler style is more prevalent in existing - sources, not because it is necessarily preferred.)" - (:inherit "basic") - (:variables - (lisp-lambda-list-keyword-alignment t) - (lisp-lambda-list-keyword-parameter-alignment t) - (lisp-lambda-list-keyword-parameter-indentation 0) - (lisp-loop-indent-subclauses nil))) - -(define-common-lisp-style "sbcl" - "Style used in SBCL sources. A good if somewhat intrusive general purpose - style based on the \"modern\" style. Adds indentation for a few SBCL - specific constructs, sets indentation to use spaces instead of tabs, - fill-column to 78, and activates whitespace-mode to show tabs and trailing - whitespace." - (:inherit "modern") - (:eval - (whitespace-mode 1)) - (:variables - (whitespace-style (tabs trailing)) - (indent-tabs-mode nil) - (comment-fill-column nil) - (fill-column 78)) - (:indentation - (def!constant (as defconstant)) - (def!macro (as defmacro)) - (def!method (as defmethod)) - (def!struct (as defstruct)) - (def!type (as deftype)) - (defmacro-mundanely (as defmacro)) - (define-source-transform (as defun)) - (!def-type-translator (as defun)) - (!def-debug-command (as defun)))) - -(defcustom common-lisp-style-default nil - "Name of the Common Lisp indentation style to use in lisp-mode buffers if -none has been specified." - :type `(choice (const :tag "None" nil) - ,@(mapcar (lambda (spec) - `(const :tag ,(car spec) ,(car spec))) - (common-lisp-style-names)) - (string :tag "Other")) - :group 'lisp-indent) - -;;; If style is being used, that's a sufficient invitation to snag -;;; the indentation function. -(defun common-lisp-lisp-mode-hook () - (let ((style (or common-lisp-style common-lisp-style-default))) - (when style - (set (make-local-variable 'lisp-indent-function) - 'common-lisp-indent-function) - (common-lisp-set-style style)))) -(add-hook 'lisp-mode-hook 'common-lisp-lisp-mode-hook) - - -;;;; The indentation specs are stored at three levels. In order of priority: -;;;; -;;;; 1. Indentation as set by current style, from the indentation table -;;;; in the current style. -;;;; -;;;; 2. Globally set indentation, from the `common-lisp-indent-function' -;;;; property of the symbol. -;;;; -;;;; 3. Per-package indentation derived by the system. A live Common Lisp -;;;; system may (via Slime, eg.) add indentation specs to -;;;; common-lisp-system-indentation, where they are associated with -;;;; the package of the symbol. Then we run some lossy heuristics and -;;;; find something that looks promising. -;;;; -;;;; FIXME: for non-system packages the derived indentation should probably -;;;; take precedence. - -;;; This maps symbols into lists of (INDENT . PACKAGES) where INDENT is -;;; an indentation spec, and PACKAGES are the names of packages where this -;;; applies. -;;; -;;; We never add stuff here by ourselves: this is for things like Slime to -;;; fill. -(defvar common-lisp-system-indentation (make-hash-table :test 'equal)) - -(defun common-lisp-guess-current-package () - (let (pkg) - (save-excursion - (ignore-errors - (when (let ((case-fold-search t)) - (search-backward "(in-package ")) - (re-search-forward "[ :\"]+") - (let ((start (point))) - (re-search-forward "[\":)]") - (setf pkg (upcase (buffer-substring-no-properties - start (1- (point))))))))) - pkg)) - -(defvar common-lisp-current-package-function 'common-lisp-guess-current-package - "Used to derive the package name to use for indentation at a -given point. Defaults to `common-lisp-guess-current-package'.") - -(defun common-lisp-symbol-package (string) - (if (and (stringp string) (string-match ":" string)) - (let ((p (match-beginning 0))) - (if (eql 0 p) - "KEYWORD" - (upcase (substring string 0 p)))) - (funcall common-lisp-current-package-function))) - -(defun common-lisp-get-indentation (name &optional full) - "Retrieves the indentation information for NAME." - (let ((method - (or - ;; From style - (when common-lisp-style - (gethash name (common-lisp-active-style-methods))) - ;; From global settings. - (get name 'common-lisp-indent-function) - ;; From system derived information. - (let ((system-info (gethash name common-lisp-system-indentation))) - (if (not (cdr system-info)) - (caar system-info) - (let ((guess nil) - (guess-n 0) - (package (common-lisp-symbol-package full))) - (dolist (info system-info guess) - (let* ((pkgs (cdr info)) - (n (length pkgs))) - (cond ((member package pkgs) - ;; This is it. - (return (car info))) - ((> n guess-n) - ;; If we can't find the real thing, go with the one - ;; accessible in most packages. - (setf guess (car info) - guess-n n))))))))))) - (if (and (consp method) (eq 'as (car method))) - (common-lisp-get-indentation (cadr method)) - method))) - -;;;; LOOP indentation, the simple version - -(defun common-lisp-loop-type (loop-start) - "Returns the type of the loop form at LOOP-START. -Possible types are SIMPLE, SIMPLE/SPLIT, EXTENDED, and EXTENDED/SPLIT. */SPLIT -refers to extended loops whose body does not start on the same line as the -opening parenthesis of the loop." - (let (comment-split) - (condition-case () - (save-excursion - (goto-char loop-start) - (let ((line (line-number-at-pos)) - (maybe-split t)) - (forward-char 1) - (forward-sexp 1) - (save-excursion - (when (looking-at "\\s-*\\\n*;") - (search-forward ";") - (backward-char 1) - (if (= line (line-number-at-pos)) - (setq maybe-split nil) - (setq comment-split t)))) - (forward-sexp 1) - (backward-sexp 1) - (if (eql (char-after) ?\() - (if (or (not maybe-split) (= line (line-number-at-pos))) - 'simple - 'simple/split) - (if (or (not maybe-split) (= line (line-number-at-pos))) - 'extended - 'extended/split)))) - (error - (if comment-split - 'simple/split - 'simple))))) - -(defun common-lisp-trailing-comment () - (ignore-errors - ;; If we had a trailing comment just before this, find it. - (save-excursion - (backward-sexp) - (forward-sexp) - (when (looking-at "\\s-*;") - (search-forward ";") - (1- (current-column)))))) - -;;;###autoload -(defun common-lisp-indent-function (indent-point state) - "Function to indent the arguments of a Lisp function call. -This is suitable for use as the value of the variable -`lisp-indent-function'. INDENT-POINT is the point at which the -indentation function is called, and STATE is the -`parse-partial-sexp' state at that position. Browse the -`lisp-indent' customize group for options affecting the behavior -of this function. - -If the indentation point is in a call to a Lisp function, that -function's common-lisp-indent-function property specifies how -this function should indent it. Possible values for this -property are: - -* defun, meaning indent according to `lisp-indent-defun-method'; - i.e., like (4 &lambda &body), as explained below. - -* any other symbol, meaning a function to call. The function should - take the arguments: PATH STATE INDENT-POINT SEXP-COLUMN NORMAL-INDENT. - PATH is a list of integers describing the position of point in terms of - list-structure with respect to the containing lists. For example, in - ((a b c (d foo) f) g), foo has a path of (0 3 1). In other words, - to reach foo take the 0th element of the outermost list, then - the 3rd element of the next list, and finally the 1st element. - STATE and INDENT-POINT are as in the arguments to - `common-lisp-indent-function'. SEXP-COLUMN is the column of - the open parenthesis of the innermost containing list. - NORMAL-INDENT is the column the indentation point was - originally in. This function should behave like `lisp-indent-259'. - -* an integer N, meaning indent the first N arguments like - function arguments, and any further arguments like a body. - This is equivalent to (4 4 ... &body). - -* a list starting with `as' specifies an indirection: indentation is done as - if the form being indented had started with the second element of the list. - -* any other list. The list element in position M specifies how to indent the - Mth function argument. If there are fewer elements than function arguments, - the last list element applies to all remaining arguments. The accepted list - elements are: - - * nil, meaning the default indentation. - - * an integer, specifying an explicit indentation. - - * &lambda. Indent the argument (which may be a list) by 4. - - * &rest. When used, this must be the penultimate element. The - element after this one applies to all remaining arguments. - - * &body. This is equivalent to &rest lisp-body-indent, i.e., indent - all remaining elements by `lisp-body-indent'. - - * &whole. This must be followed by nil, an integer, or a - function symbol. This indentation is applied to the - associated argument, and as a base indent for all remaining - arguments. For example, an integer P means indent this - argument by P, and all remaining arguments by P, plus the - value specified by their associated list element. - - * a symbol. A function to call, with the 6 arguments specified above. - - * a list, with elements as described above. This applies when the - associated function argument is itself a list. Each element of the list - specifies how to indent the associated argument. - -For example, the function `case' has an indent property -\(4 &rest (&whole 2 &rest 1)), meaning: - * indent the first argument by 4. - * arguments after the first should be lists, and there may be any number - of them. The first list element has an offset of 2, all the rest - have an offset of 2+1=3." - (common-lisp-indent-function-1 indent-point state)) - -;;; XEmacs doesn't have looking-back, so we define a simple one. Faster to -;;; boot, and sufficient for our needs. -(defun common-lisp-looking-back (string) - (let ((len (length string))) - (dotimes (i len t) - (unless (eql (elt string (- len i 1)) (char-before (- (point) i))) - (return nil))))) - -(defvar common-lisp-feature-expr-regexp "#!?\\(+\\|-\\)") - -;;; Semi-feature-expression aware keyword check. -(defun common-lisp-looking-at-keyword () - (or (looking-at ":") - (and (looking-at common-lisp-feature-expr-regexp) - (save-excursion - (forward-sexp) - (skip-chars-forward " \t\n") - (common-lisp-looking-at-keyword))))) - -;;; Semi-feature-expression aware backwards movement for keyword -;;; argument pairs. -(defun common-lisp-backward-keyword-argument () - (ignore-errors - (backward-sexp 2) - (when (looking-at common-lisp-feature-expr-regexp) - (cond ((ignore-errors - (save-excursion - (backward-sexp 2) - (looking-at common-lisp-feature-expr-regexp))) - (common-lisp-backward-keyword-argument)) - ((ignore-errors - (save-excursion - (backward-sexp 1) - (looking-at ":"))) - (backward-sexp)))) - t)) - -(defun common-lisp-indent-function-1 (indent-point state) - ;; If we're looking at a splice, move to the first comma. - (when (or (common-lisp-looking-back ",") (common-lisp-looking-back ",@")) - (when (re-search-backward "[^,@'],") - (forward-char 1))) - (let ((normal-indent (current-column))) - ;; Walk up list levels until we see something - ;; which does special things with subforms. - (let ((depth 0) - ;; Path describes the position of point in terms of - ;; list-structure with respect to containing lists. - ;; `foo' has a path of (0 3 1) in `((a b c (d foo) f) g)'. - (path ()) - ;; set non-nil when somebody works out the indentation to use - calculated - ;; If non-nil, this is an indentation to use - ;; if nothing else specifies it more firmly. - tentative-calculated - (last-point indent-point) - ;; the position of the open-paren of the innermost containing list - (containing-form-start (common-lisp-indent-parse-state-start state)) - ;; the column of the above - sexp-column) - ;; Move to start of innermost containing list - (goto-char containing-form-start) - (setq sexp-column (current-column)) - - ;; Look over successively less-deep containing forms - (while (and (not calculated) - (< depth lisp-indent-maximum-backtracking)) - (let ((containing-sexp (point))) - (forward-char 1) - (parse-partial-sexp (point) indent-point 1 t) - ;; Move to the car of the relevant containing form - (let (tem full function method tentative-defun) - (if (not (looking-at "\\sw\\|\\s_")) - ;; This form doesn't seem to start with a symbol - (setq function nil method nil full nil) - (setq tem (point)) - (forward-sexp 1) - (setq full (downcase (buffer-substring-no-properties - tem (point))) - function full) - (goto-char tem) - (setq tem (intern-soft function) - method (common-lisp-get-indentation tem)) - (cond ((and (null method) - (string-match ":[^:]+" function)) - ;; The pleblisp package feature - (setq function (substring function - (1+ (match-beginning 0))) - method (common-lisp-get-indentation - (intern-soft function) full))) - ((and (null method)) - ;; backwards compatibility - (setq method (common-lisp-get-indentation tem))))) - (let ((n 0)) - ;; How far into the containing form is the current form? - (if (< (point) indent-point) - (while (condition-case () - (progn - (forward-sexp 1) - (if (>= (point) indent-point) - nil - (parse-partial-sexp (point) - indent-point 1 t) - (setq n (1+ n)) - t)) - (error nil)))) - (setq path (cons n path))) - - ;; Guess. - (when (and (not method) function (null (cdr path))) - ;; (package prefix was stripped off above) - (cond ((and (string-match "\\`def" function) - (not (string-match "\\`default" function)) - (not (string-match "\\`definition" function)) - (not (string-match "\\`definer" function))) - (setq tentative-defun t)) - ((string-match - (eval-when-compile - (concat "\\`\\(" - (regexp-opt '("with" "without" "do")) - "\\)-")) - function) - (setq method '(&lambda &body))))) - - ;; #+ and #- cleverness. - (save-excursion - (goto-char indent-point) - (backward-sexp) - (let ((indent (current-column))) - (when (or (looking-at common-lisp-feature-expr-regexp) - (ignore-errors - (backward-sexp) - (when (looking-at - common-lisp-feature-expr-regexp) - (setq indent (current-column)) - (let ((line (line-number-at-pos))) - (while - (ignore-errors - (backward-sexp 2) - (and - (= line (line-number-at-pos)) - (looking-at - common-lisp-feature-expr-regexp))) - (setq indent (current-column)))) - t))) - (setq calculated (list indent containing-form-start))))) - - (cond ((and (or (eq (char-after (1- containing-sexp)) ?\') - (and (not lisp-backquote-indentation) - (eq (char-after (1- containing-sexp)) ?\`))) - (not (eq (char-after (- containing-sexp 2)) ?\#))) - ;; No indentation for "'(...)" elements - (setq calculated (1+ sexp-column))) - ((eq (char-after (1- containing-sexp)) ?\#) - ;; "#(...)" - (setq calculated (1+ sexp-column))) - ((null method) - ;; If this looks like a call to a `def...' form, - ;; think about indenting it as one, but do it - ;; tentatively for cases like - ;; (flet ((defunp () - ;; nil))) - ;; Set both normal-indent and tentative-calculated. - ;; The latter ensures this value gets used - ;; if there are no relevant containing constructs. - ;; The former ensures this value gets used - ;; if there is a relevant containing construct - ;; but we are nested within the structure levels - ;; that it specifies indentation for. - (if tentative-defun - (setq tentative-calculated - (common-lisp-indent-call-method - function lisp-indent-defun-method - path state indent-point - sexp-column normal-indent) - normal-indent tentative-calculated) - (when lisp-align-keywords-in-calls - ;; No method so far. If we're looking at a keyword, - ;; align with the first keyword in this expression. - ;; This gives a reasonable indentation to most things - ;; with keyword arguments. - (save-excursion - (goto-char indent-point) - (back-to-indentation) - (when (common-lisp-looking-at-keyword) - (while (common-lisp-backward-keyword-argument) - (when (common-lisp-looking-at-keyword) - (setq calculated - (list (current-column) - containing-form-start))))))))) - ((integerp method) - ;; convenient top-level hack. - ;; (also compatible with lisp-indent-function) - ;; The number specifies how many `distinguished' - ;; forms there are before the body starts - ;; Equivalent to (4 4 ... &body) - (setq calculated (cond ((cdr path) - normal-indent) - ((<= (car path) method) - ;; `distinguished' form - (list (+ sexp-column 4) - containing-form-start)) - ((= (car path) (1+ method)) - ;; first body form. - (+ sexp-column lisp-body-indent)) - (t - ;; other body form - normal-indent)))) - (t - (setq calculated - (common-lisp-indent-call-method - function method path state indent-point - sexp-column normal-indent))))) - (goto-char containing-sexp) - (setq last-point containing-sexp) - (unless calculated - (condition-case () - (progn (backward-up-list 1) - (setq depth (1+ depth))) - (error - (setq depth lisp-indent-maximum-backtracking)))))) - - (or calculated tentative-calculated - ;; Fallback. - ;; - ;; Instead of punting directly to calculate-lisp-indent we - ;; handle a few of cases it doesn't deal with: - ;; - ;; A: (foo ( - ;; bar zot - ;; quux)) - ;; - ;; would align QUUX with ZOT. - ;; - ;; B: - ;; (foo (or x - ;; y) t - ;; z) - ;; - ;; would align the Z with Y. - ;; - ;; C: - ;; (foo ;; Comment - ;; (bar) - ;; ;; Comment 2 - ;; (quux)) - ;; - ;; would indent BAR and QUUX by one. - (ignore-errors - (save-excursion - (goto-char indent-point) - (back-to-indentation) - (let ((p (point))) - (goto-char containing-form-start) - (down-list) - (let ((one (current-column))) - (skip-chars-forward " \t") - (if (or (eolp) (looking-at ";")) - ;; A. - (list one containing-form-start) - (forward-sexp 2) - (backward-sexp) - (if (/= p (point)) - ;; B. - (list (current-column) containing-form-start) - (backward-sexp) - (forward-sexp) - (let ((tmp (+ (current-column) 1))) - (skip-chars-forward " \t") - (if (looking-at ";") - ;; C. - (list tmp containing-form-start))))))))))))) - - -(defun common-lisp-indent-call-method (function method path state indent-point - sexp-column normal-indent) - (let ((lisp-indent-error-function function)) - (if (symbolp method) - (funcall method - path state indent-point - sexp-column normal-indent) - (lisp-indent-259 method path state indent-point - sexp-column normal-indent)))) - -;; Dynamically bound in common-lisp-indent-call-method. -(defvar lisp-indent-error-function) - -(defun lisp-indent-report-bad-format (m) - (error "%s has a badly-formed %s property: %s" - ;; Love those free variable references!! - lisp-indent-error-function 'common-lisp-indent-function m)) - - -;; Lambda-list indentation is now done in LISP-INDENT-LAMBDA-LIST. -;; See also `lisp-lambda-list-keyword-alignment', -;; `lisp-lambda-list-keyword-parameter-alignment' and -;; `lisp-lambda-list-keyword-parameter-indentation' -- dvl - -(defvar lisp-indent-lambda-list-keywords-regexp - "&\\(\ -optional\\|rest\\|key\\|allow-other-keys\\|aux\\|whole\\|body\\|\ -environment\\|more\ -\\)\\>" - "Regular expression matching lambda-list keywords.") - -(defun lisp-indent-lambda-list - (indent-point sexp-column containing-form-start) - (if (not lisp-lambda-list-indentation) - (1+ sexp-column) - (lisp-properly-indent-lambda-list - indent-point sexp-column containing-form-start))) - -(defun lisp-properly-indent-lambda-list - (indent-point sexp-column containing-form-start) - (let (limit) - (cond - ((save-excursion - (goto-char indent-point) - (back-to-indentation) - (setq limit (point)) - (looking-at lisp-indent-lambda-list-keywords-regexp)) - ;; We're facing a lambda-list keyword. - (if lisp-lambda-list-keyword-alignment - ;; Align to the first keyword if any, or to the beginning of - ;; the lambda-list. - (save-excursion - (goto-char containing-form-start) - (down-list) - (let ((key-indent nil) - (next t)) - (while (and next (< (point) indent-point)) - (if (looking-at lisp-indent-lambda-list-keywords-regexp) - (setq key-indent (current-column) - next nil) - (setq next (ignore-errors (forward-sexp) t)) - (if next - (ignore-errors - (forward-sexp) - (backward-sexp))))) - (or key-indent - (1+ sexp-column)))) - ;; Align to the beginning of the lambda-list. - (1+ sexp-column))) - (t - ;; Otherwise, align to the first argument of the last lambda-list - ;; keyword, the keyword itself, or the beginning of the - ;; lambda-list. - (save-excursion - (goto-char indent-point) - (let ((indent nil) - (next t)) - (while (and next (> (point) containing-form-start)) - (setq next (ignore-errors (backward-sexp) t)) - (let* ((col (current-column)) - (pos - (save-excursion - (ignore-errors (forward-sexp)) - (skip-chars-forward " \t") - (if (eolp) - (+ col - lisp-lambda-list-keyword-parameter-indentation) - col)))) - (if (looking-at lisp-indent-lambda-list-keywords-regexp) - (setq indent - (if lisp-lambda-list-keyword-parameter-alignment - (or indent pos) - (+ col - lisp-lambda-list-keyword-parameter-indentation)) - next nil) - (setq indent col)))) - (or indent (1+ sexp-column)))))))) - -(defun common-lisp-lambda-list-initial-value-form-p (point) - (let ((state 'x) - (point (save-excursion - (goto-char point) - (back-to-indentation) - (point)))) - (save-excursion - (backward-sexp) - (ignore-errors (down-list 1)) - (while (and point (< (point) point)) - (cond ((or (looking-at "&key") (looking-at "&optional") - (looking-at "&aux")) - (setq state 'key)) - ((looking-at lisp-indent-lambda-list-keywords-regexp) - (setq state 'x))) - (if (not (ignore-errors (forward-sexp) t)) - (setq point nil) - (ignore-errors - (forward-sexp) - (backward-sexp)) - (cond ((> (point) point) - (backward-sexp) - (when (eq state 'var) - (setq state 'x)) - (or (ignore-errors - (down-list 1) - (cond ((> (point) point) - (backward-up-list)) - ((eq 'key state) - (setq state 'var))) - t) - (setq point nil))) - ((eq state 'var) - (setq state 'form)))))) - (eq 'form state))) - -;; Blame the crufty control structure on dynamic scoping -;; -- not on me! -(defun lisp-indent-259 - (method path state indent-point sexp-column normal-indent) - (catch 'exit - (let* ((p (cdr path)) - (containing-form-start (elt state 1)) - (n (1- (car path))) - tem tail) - (if (not (consp method)) - (lisp-indent-report-bad-format method)) - (while n - ;; This while loop is for advancing along a method - ;; until the relevant (possibly &rest/&body) pattern - ;; is reached. - ;; n is set to (1- n) and method to (cdr method) - ;; each iteration. - (setq tem (car method)) - - (or (eq tem 'nil) ;default indentation - (eq tem '&lambda) ;lambda list - (and (eq tem '&body) (null (cdr method))) - (and (eq tem '&rest) - (consp (cdr method)) - (null (cddr method))) - (integerp tem) ;explicit indentation specified - (and (consp tem) ;destructuring - (or (consp (car tem)) - (and (eq (car tem) '&whole) - (or (symbolp (cadr tem)) - (integerp (cadr tem)))))) - (and (symbolp tem) ;a function to call to do the work. - (null (cdr method))) - (lisp-indent-report-bad-format method)) - (cond ((eq tem '&body) - ;; &body means (&rest ) - (throw 'exit - (if (null p) - (+ sexp-column lisp-body-indent) - normal-indent))) - ((eq tem '&rest) - ;; this pattern holds for all remaining forms - (setq tail (> n 0) - n 0 - method (cdr method))) - ((> n 0) - ;; try next element of pattern - (setq n (1- n) - method (cdr method)) - (if (< n 0) - ;; Too few elements in pattern. - (throw 'exit normal-indent))) - ((eq tem 'nil) - (throw 'exit (if (consp normal-indent) - normal-indent - (list normal-indent containing-form-start)))) - ((eq tem '&lambda) - (throw 'exit - (cond ((not (common-lisp-looking-back ")")) - ;; If it's not a list at all, indent it - ;; like body instead. - (if (null p) - (+ sexp-column lisp-body-indent) - normal-indent)) - ((common-lisp-lambda-list-initial-value-form-p - indent-point) - (if (consp normal-indent) - normal-indent - (list normal-indent containing-form-start))) - ((null p) - (list (+ sexp-column 4) containing-form-start)) - (t - ;; Indentation within a lambda-list. -- dvl - (list (lisp-indent-lambda-list - indent-point - sexp-column - containing-form-start) - containing-form-start))))) - ((integerp tem) - (throw 'exit - (if (null p) ;not in subforms - (list (+ sexp-column tem) containing-form-start) - normal-indent))) - ((symbolp tem) ;a function to call - (throw 'exit - (funcall tem path state indent-point - sexp-column normal-indent))) - (t - ;; must be a destructing frob - (if p - ;; descend - (setq method (cddr tem) - n (car p) - p (cdr p) - tail nil) - (let ((wholep (eq '&whole (car tem)))) - (setq tem (cadr tem)) - (throw 'exit - (cond (tail - (if (and wholep (integerp tem) - (save-excursion - (goto-char indent-point) - (back-to-indentation) - (looking-at "\\sw"))) - ;; There's a further level of - ;; destructuring, but we're looking at a - ;; word -- indent to sexp. - (+ sexp-column tem) - normal-indent)) - ((not tem) - (list normal-indent - containing-form-start)) - ((integerp tem) - (list (+ sexp-column tem) - containing-form-start)) - (t - (funcall tem path state indent-point - sexp-column normal-indent)))))))))))) - -(defun lisp-indent-tagbody (path state indent-point sexp-column normal-indent) - (if (not (null (cdr path))) - normal-indent - (save-excursion - (goto-char indent-point) - (back-to-indentation) - (list (cond ((looking-at "\\sw\\|\\s_") - ;; a tagbody tag - (+ sexp-column lisp-tag-indentation)) - ((integerp lisp-tag-body-indentation) - (+ sexp-column lisp-tag-body-indentation)) - ((eq lisp-tag-body-indentation 't) - (condition-case () - (progn (backward-sexp 1) (current-column)) - (error (1+ sexp-column)))) - (t (+ sexp-column lisp-body-indent))) -; (cond ((integerp lisp-tag-body-indentation) -; (+ sexp-column lisp-tag-body-indentation)) -; ((eq lisp-tag-body-indentation 't) -; normal-indent) -; (t -; (+ sexp-column lisp-body-indent))) - (elt state 1) - )))) - -(defun lisp-indent-do (path state indent-point sexp-column normal-indent) - (if (>= (car path) 3) - (let ((lisp-tag-body-indentation lisp-body-indent)) - (funcall (function lisp-indent-tagbody) - path state indent-point sexp-column normal-indent)) - (funcall (function lisp-indent-259) - '((&whole nil &rest - ;; the following causes weird indentation - ;;(&whole 1 1 2 nil) - ) - (&whole nil &rest 1)) - path state indent-point sexp-column normal-indent))) - -(defun lisp-indent-defsetf - (path state indent-point sexp-column normal-indent) - (list - (cond - ;; Inside the lambda-list in a long-form defsetf. - ((and (eql 2 (car path)) (cdr path)) - (lisp-indent-lambda-list indent-point sexp-column (elt state 1))) - ;; Long form: has a lambda-list. - ((or (cdr path) - (save-excursion - (goto-char (elt state 1)) - (ignore-errors - (down-list) - (forward-sexp 3) - (backward-sexp) - (looking-at "nil\\|(")))) - (+ sexp-column - (case (car path) - ((1 3) 4) - (2 4) - (t 2)))) - ;; Short form. - (t - (+ sexp-column - (case (car path) - (1 4) - (2 4) - (t 2))))) - (elt state 1))) - -(defun lisp-beginning-of-defmethod-qualifiers () - (let ((regexp-1 "(defmethod\\|(DEFMETHOD") - (regexp-2 "(:method\\|(:METHOD")) - (while (and (not (or (looking-at regexp-1) - (looking-at regexp-2))) - (ignore-errors (backward-up-list) t))) - (cond ((looking-at regexp-1) - (forward-char) - ;; Skip name. - (forward-sexp 2) - 1) - ((looking-at regexp-2) - (forward-char) - (forward-sexp 1) - 0)))) - -;; LISP-INDENT-DEFMETHOD now supports the presence of more than one method -;; qualifier and indents the method's lambda list properly. -- dvl -(defun lisp-indent-defmethod - (path state indent-point sexp-column normal-indent) - (lisp-indent-259 - (let ((nskip nil)) - (if (save-excursion - (when (setq nskip (lisp-beginning-of-defmethod-qualifiers)) - (skip-chars-forward " \t\n") - (while (looking-at "\\sw\\|\\s_") - (incf nskip) - (forward-sexp) - (skip-chars-forward " \t\n")) - t)) - (append (make-list nskip 4) '(&lambda &body)) - (common-lisp-get-indentation 'defun))) - path state indent-point sexp-column normal-indent)) - -(defun lisp-indent-function-lambda-hack (path state indent-point - sexp-column normal-indent) - ;; indent (function (lambda () )) kludgily. - (if (or (cdr path) ; wtf? - (> (car path) 3)) - ;; line up under previous body form - normal-indent - ;; line up under function rather than under lambda in order to - ;; conserve horizontal space. (Which is what #' is for.) - (condition-case () - (save-excursion - (backward-up-list 2) - (forward-char 1) - (if (looking-at "\\(lisp:+\\)?function\\(\\Sw\\|\\S_\\)") - (+ lisp-body-indent -1 (current-column)) - (+ sexp-column lisp-body-indent))) - (error (+ sexp-column lisp-body-indent))))) - -(defun lisp-indent-loop (path state indent-point sexp-column normal-indent) - (if (cdr path) - normal-indent - (let* ((loop-start (elt state 1)) - (type (common-lisp-loop-type loop-start))) - (cond ((and lisp-loop-indent-subclauses - (member type '(extended extended/split))) - (list (common-lisp-indent-loop-macro-1 state indent-point) - (common-lisp-indent-parse-state-start state))) - (t - (common-lisp-loop-part-indentation indent-point state type)))))) - -;;;; LOOP indentation, the complex version -- handles subclause indentation - -;; Regexps matching various varieties of loop macro keyword ... -(defvar common-lisp-body-introducing-loop-macro-keyword - "\\(#?:\\)?\\(do\\(ing\\)?\\|finally\\|initially\\)" - "Regexp matching loop macro keywords which introduce body forms.") - -;; Not currenctly used -(defvar common-lisp-accumlation-loop-macro-keyword - "\\(#?:\\)?\\(collect\\(ing\\)?\\|append\\(ing\\)?\\|nconc\\(ing\\)?\\|\ -count\\(ing\\)?\\|sum\\(ming\\)?\\|maximiz\\(e\\|ing\\)\\|\ -minimiz\\(e\\|ing\\)\\)" - "Regexp matching loop macro keywords which introduce accumulation clauses.") - -;; This is so "and when" and "else when" get handled right -;; (not to mention "else do" !!!) -(defvar common-lisp-prefix-loop-macro-keyword - "\\(#?:\\)?\\(and\\|else\\)" - "Regexp matching loop macro keywords which are prefixes.") - -(defvar common-lisp-indent-clause-joining-loop-macro-keyword - "\\(#?:\\)?and" - "Regexp matching 'and', and anything else there ever comes to be like it.") - -(defvar common-lisp-indent-indented-loop-macro-keyword - "\\(#?:\\)?\\(\\(up\\|down\\)?(from\\|to)\\|below\\|above\\|in\\(to\\)?\\|\ -on\\|=\\|then\\|across\\|being\\|each\\|the\\|of\\|using\\|\ -\\(present-\\|external-\\)?symbols?\\|fixnum\\|float\\|t\\|nil\\|of-type\\)" - "Regexp matching keywords introducing loop subclauses. -Always indented two.") - -(defvar common-lisp-indenting-loop-macro-keyword - "\\(#?:\\)?\\(when\\|unless\\|if\\)" - "Regexp matching keywords introducing conditional clauses. -Cause subsequent clauses to be indented.") - -(defvar common-lisp-loop-macro-else-keyword "\\(#?:\\)?else") - -;;; Attempt to indent the loop macro ... - -(defun common-lisp-indent-parse-state-depth (parse-state) - (car parse-state)) - -(defun common-lisp-indent-parse-state-start (parse-state) - (car (cdr parse-state))) - -(defun common-lisp-indent-parse-state-prev (parse-state) - (car (cdr (cdr parse-state)))) - -(defun common-lisp-loop-part-indentation (indent-point state type) - "Compute the indentation of loop form constituents." - (let* ((loop-start (elt state 1)) - (loop-indentation (save-excursion - (goto-char loop-start) - (if (eq type 'extended/split) - (- (current-column) 4) - (current-column)))) - (indent nil) - (re "\\(\\(#?:\\)?\\sw+\\|)\\|\n\\)")) - (goto-char indent-point) - (back-to-indentation) - (cond ((eq type 'simple/split) - (+ loop-indentation lisp-simple-loop-indentation)) - ((eq type 'simple) - (+ loop-indentation 6)) - ;; We are already in a body, with forms in it. - ((and (not (looking-at re)) - (save-excursion - (while (and (ignore-errors (backward-sexp) t) - (not (looking-at re))) - (setq indent (current-column))) - (when (and indent - (looking-at - common-lisp-body-introducing-loop-macro-keyword)) - t))) - (list indent loop-start)) - ;; Keyword-style or comment outside body - ((or lisp-loop-indent-forms-like-keywords - (looking-at re) - (looking-at ";")) - (if (and (looking-at ";") - (let ((p (common-lisp-trailing-comment))) - (when p - (setq loop-indentation p)))) - (list loop-indentation loop-start) - (list (+ loop-indentation 6) loop-start))) - ;; Form-style - (t - (list (+ loop-indentation 9) loop-start))))) - -(defun common-lisp-indent-loop-macro-1 (parse-state indent-point) - (catch 'return-indentation - (save-excursion - ;; Find first clause of loop macro, and use it to establish - ;; base column for indentation - (goto-char (common-lisp-indent-parse-state-start parse-state)) - (let ((loop-start-column (current-column))) - (common-lisp-loop-advance-past-keyword-on-line) - - (when (eolp) - (forward-line 1) - (end-of-line) - ;; If indenting first line after "(loop " - ;; cop out ... - (if (<= indent-point (point)) - (throw 'return-indentation (+ lisp-loop-clauses-indentation - loop-start-column))) - (back-to-indentation)) - - (let* ((case-fold-search t) - (loop-macro-first-clause (point)) - (previous-expression-start - (common-lisp-indent-parse-state-prev parse-state)) - (default-value (current-column)) - (loop-body-p nil) - (loop-body-indentation nil) - (indented-clause-indentation (+ 2 default-value))) - ;; Determine context of this loop clause, starting with the - ;; expression immediately preceding the line we're trying to indent - (goto-char previous-expression-start) - - ;; Handle a body-introducing-clause which ends a line specially. - (if (looking-at common-lisp-body-introducing-loop-macro-keyword) - (let ((keyword-position (current-column))) - (setq loop-body-p t) - (setq loop-body-indentation - (if (common-lisp-loop-advance-past-keyword-on-line) - (current-column) - (back-to-indentation) - (if (/= (current-column) keyword-position) - (+ 2 (current-column)) - (+ lisp-loop-body-forms-indentation - (if lisp-loop-indent-body-forms-relative-to-loop-start - loop-start-column - keyword-position)))))) - - (back-to-indentation) - (if (< (point) loop-macro-first-clause) - (goto-char loop-macro-first-clause)) - ;; If there's an "and" or "else," advance over it. - ;; If it is alone on the line, the next "cond" will treat it - ;; as if there were a "when" and indent under it ... - (let ((exit nil)) - (while (and (null exit) - (looking-at common-lisp-prefix-loop-macro-keyword)) - (if (null (common-lisp-loop-advance-past-keyword-on-line)) - (progn (setq exit t) - (back-to-indentation))))) - - ;; Found start of loop clause preceding the one we're - ;; trying to indent. Glean context ... - (cond - ((looking-at "(") - ;; We're in the middle of a clause body ... - (setq loop-body-p t) - (setq loop-body-indentation (current-column))) - ((looking-at common-lisp-body-introducing-loop-macro-keyword) - (setq loop-body-p t) - ;; Know there's something else on the line (or would - ;; have been caught above) - (common-lisp-loop-advance-past-keyword-on-line) - (setq loop-body-indentation (current-column))) - (t - (setq loop-body-p nil) - (if (or (looking-at common-lisp-indenting-loop-macro-keyword) - (looking-at common-lisp-prefix-loop-macro-keyword)) - (setq default-value (+ 2 (current-column)))) - (setq indented-clause-indentation (+ 2 (current-column))) - ;; We still need loop-body-indentation for "syntax errors" ... - (goto-char previous-expression-start) - (setq loop-body-indentation (current-column))))) - - ;; Go to first non-blank character of the line we're trying - ;; to indent. (if none, wind up poised on the new-line ...) - (goto-char indent-point) - (back-to-indentation) - (cond - ((looking-at "(") - ;; Clause body ... - loop-body-indentation) - ((or (eolp) (looking-at ";")) - ;; Blank line. If body-p, indent as body, else indent as - ;; vanilla clause. - (if loop-body-p - loop-body-indentation - (or (and (looking-at ";") (common-lisp-trailing-comment)) - default-value))) - ((looking-at common-lisp-indent-indented-loop-macro-keyword) - indented-clause-indentation) - ((looking-at common-lisp-indent-clause-joining-loop-macro-keyword) - (let ((stolen-indent-column nil)) - (forward-line -1) - (while (and (null stolen-indent-column) - (> (point) loop-macro-first-clause)) - (back-to-indentation) - (if (and (< (current-column) loop-body-indentation) - (looking-at "\\(#?:\\)?\\sw")) - (progn - (if (looking-at common-lisp-loop-macro-else-keyword) - (common-lisp-loop-advance-past-keyword-on-line)) - (setq stolen-indent-column - (current-column))) - (forward-line -1))) - (if stolen-indent-column - stolen-indent-column - default-value))) - (t default-value))))))) - -(defun common-lisp-loop-advance-past-keyword-on-line () - (forward-word 1) - (while (and (looking-at "\\s-") (not (eolp))) - (forward-char 1)) - (if (eolp) - nil - (current-column))) - -;;;; IF* is not standard, but a plague upon the land -;;;; ...let's at least try to indent it. - -(defvar common-lisp-indent-if*-keyword - "threnret\\|elseif\\|then\\|else" - "Regexp matching if* keywords") - -(defun common-lisp-indent-if* - (path parse-state indent-point sexp-column normal-indent) - (list (common-lisp-indent-if*-1 parse-state indent-point) - (common-lisp-indent-parse-state-start parse-state))) - -(defun common-lisp-indent-if*-1 (parse-state indent-point) - (catch 'return-indentation - (save-excursion - ;; Find first clause of if* macro, and use it to establish - ;; base column for indentation - (goto-char (common-lisp-indent-parse-state-start parse-state)) - (let ((if*-start-column (current-column))) - (common-lisp-indent-if*-advance-past-keyword-on-line) - (let* ((case-fold-search t) - (if*-first-clause (point)) - (previous-expression-start - (common-lisp-indent-parse-state-prev parse-state)) - (default-value (current-column)) - (if*-body-p nil) - (if*-body-indentation nil)) - ;; Determine context of this if* clause, starting with the - ;; expression immediately preceding the line we're trying to indent - (goto-char previous-expression-start) - ;; Handle a body-introducing-clause which ends a line specially. - (back-to-indentation) - (if (< (point) if*-first-clause) - (goto-char if*-first-clause)) - ;; Found start of if* clause preceding the one we're trying - ;; to indent. Glean context ... - (cond - ((looking-at common-lisp-indent-if*-keyword) - (setq if*-body-p t) - ;; Know there's something else on the line (or would - ;; have been caught above) - (common-lisp-indent-if*-advance-past-keyword-on-line) - (setq if*-body-indentation (current-column))) - ((looking-at "#'\\|'\\|(") - ;; We're in the middle of a clause body ... - (setq if*-body-p t) - (setq if*-body-indentation (current-column))) - (t - (setq if*-body-p nil) - ;; We still need if*-body-indentation for "syntax errors" ... - (goto-char previous-expression-start) - (setq if*-body-indentation (current-column)))) - - ;; Go to first non-blank character of the line we're trying - ;; to indent. (if none, wind up poised on the new-line ...) - (goto-char indent-point) - (back-to-indentation) - (cond - ((or (eolp) (looking-at ";")) - ;; Blank line. If body-p, indent as body, else indent as - ;; vanilla clause. - (if if*-body-p - if*-body-indentation - default-value)) - ((not (looking-at common-lisp-indent-if*-keyword)) - ;; Clause body ... - if*-body-indentation) - (t - (- (+ 7 if*-start-column) - (- (match-end 0) (match-beginning 0)))))))))) - -(defun common-lisp-indent-if*-advance-past-keyword-on-line () - (forward-word 1) - (block move-forward - (while (and (looking-at "\\s-") (not (eolp))) - (forward-char 1))) - (if (eolp) - nil - (current-column))) - - -;;;; Indentation specs for standard symbols, and a few semistandard ones. -(defun common-lisp-init-standard-indentation () - (let ((l '((block 1) - (case (4 &rest (&whole 2 &rest 1))) - (ccase (as case)) - (ecase (as case)) - (typecase (as case)) - (etypecase (as case)) - (ctypecase (as case)) - (catch 1) - (cond (&rest (&whole 2 &rest nil))) - ;; for DEFSTRUCT - (:constructor (4 &lambda)) - (defvar (4 2 2)) - (defclass (6 (&whole 4 &rest 1) - (&whole 2 &rest 1) - (&whole 2 &rest 1))) - (defconstant (as defvar)) - (defcustom (4 2 2 2)) - (defparameter (as defvar)) - (defconst (as defcustom)) - (define-condition (as defclass)) - (define-modify-macro (4 &lambda &body)) - (defsetf lisp-indent-defsetf) - (defun (4 &lambda &body)) - (defgeneric (4 &lambda &body)) - (define-setf-method (as defun)) - (define-setf-expander (as defun)) - (defmacro (as defun)) - (defsubst (as defun)) - (deftype (as defun)) - (defmethod lisp-indent-defmethod) - (defpackage (4 2)) - (defstruct ((&whole 4 &rest (&whole 2 &rest 1)) - &rest (&whole 2 &rest 1))) - (destructuring-bind (&lambda 4 &body)) - (do lisp-indent-do) - (do* (as do)) - (dolist ((&whole 4 2 1) &body)) - (dotimes (as dolist)) - (eval-when 1) - (flet ((&whole 4 &rest (&whole 1 4 &lambda &body)) &body)) - (labels (as flet)) - (macrolet (as flet)) - (generic-flet (as flet)) - (generic-labels (as flet)) - (handler-case (4 &rest (&whole 2 &lambda &body))) - (restart-case (as handler-case)) - ;; single-else style (then and else equally indented) - (if (&rest nil)) - (if* common-lisp-indent-if*) - (lambda (&lambda &rest lisp-indent-function-lambda-hack)) - (let ((&whole 4 &rest (&whole 1 1 2)) &body)) - (let* (as let)) - (compiler-let (as let)) - (handler-bind (as let)) - (restart-bind (as let)) - (locally 1) - (loop lisp-indent-loop) - (:method lisp-indent-defmethod) ; in `defgeneric' - (multiple-value-bind ((&whole 6 &rest 1) 4 &body)) - (multiple-value-call (4 &body)) - (multiple-value-prog1 1) - (multiple-value-setq (4 2)) - (multiple-value-setf (as multiple-value-setq)) - (named-lambda (4 &lambda &rest lisp-indent-function-lambda-hack)) - (pprint-logical-block (4 2)) - (print-unreadable-object ((&whole 4 1 &rest 1) &body)) - ;; Combines the worst features of BLOCK, LET and TAGBODY - (prog (&lambda &rest lisp-indent-tagbody)) - (prog* (as prog)) - (prog1 1) - (prog2 2) - (progn 0) - (progv (4 4 &body)) - (return 0) - (return-from (nil &body)) - (symbol-macrolet (as let)) - (tagbody lisp-indent-tagbody) - (throw 1) - (unless 1) - (unwind-protect (5 &body)) - (when 1) - (with-accessors (as multiple-value-bind)) - (with-compilation-unit ((&whole 4 &rest 1) &body)) - (with-condition-restarts (as multiple-value-bind)) - (with-output-to-string (4 2)) - (with-slots (as multiple-value-bind)) - (with-standard-io-syntax (2))))) - (dolist (el l) - (let* ((name (car el)) - (spec (cdr el)) - (indentation - (if (symbolp spec) - (error "Old style indirect indentation spec: %s" el) - (when (cdr spec) - (error "Malformed indentation specification: %s" el)) - (car spec)))) - (unless (symbolp name) - (error "Cannot set Common Lisp indentation of a non-symbol: %s" - name)) - (put name 'common-lisp-indent-function indentation))))) -(common-lisp-init-standard-indentation) - -(provide 'cl-indent) -(provide 'slime-cl-indent) - -;;; slime-cl-indent.el ends here diff --git a/elpa/slime-20200414.1444/contrib/slime-cl-indent.elc b/elpa/slime-20200414.1444/contrib/slime-cl-indent.elc deleted file mode 100644 index a2da12a560ea32ba92739db4f2fa063435aacaba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40324 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 diff --git a/elpa/slime-20200414.1444/contrib/slime-clipboard.el b/elpa/slime-20200414.1444/contrib/slime-clipboard.el deleted file mode 100644 index 4f5dd17f..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-clipboard.el +++ /dev/null @@ -1,172 +0,0 @@ -(require 'slime) -(require 'slime-repl) -(require 'cl-lib) -(eval-when-compile - (require 'cl)) ; lexical-let - -(define-slime-contrib slime-clipboard - "This add a few commands to put objects into a clipboard and to -insert textual references to those objects. - -The clipboard command prefix is C-c @. - - C-c @ + adds an object to the clipboard - C-c @ @ inserts a reference to an object in the clipboard - C-c @ ? displays the clipboard - -This package also also binds the + key in the inspector and -debugger to add the object at point to the clipboard." - (:authors "Helmut Eller ") - (:license "GPL") - (:swank-dependencies swank-clipboard)) - -(define-derived-mode slime-clipboard-mode fundamental-mode - "Slime-Clipboard" - "SLIME Clipboad Mode. - -\\{slime-clipboard-mode-map}") - -(slime-define-keys slime-clipboard-mode-map - ("g" 'slime-clipboard-redisplay) - ((kbd "C-k") 'slime-clipboard-delete-entry) - ("i" 'slime-clipboard-inspect)) - -(defvar slime-clipboard-map (make-sparse-keymap)) - -(slime-define-keys slime-clipboard-map - ("?" 'slime-clipboard-display) - ("+" 'slime-clipboard-add) - ("@" 'slime-clipboard-ref)) - -(define-key slime-mode-map (kbd "C-c @") slime-clipboard-map) -(define-key slime-repl-mode-map (kbd "C-c @") slime-clipboard-map) - -(slime-define-keys slime-inspector-mode-map - ("+" 'slime-clipboard-add-from-inspector)) - -(slime-define-keys sldb-mode-map - ("+" 'slime-clipboard-add-from-sldb)) - -(defun slime-clipboard-add (exp package) - "Add an object to the clipboard." - (interactive (list (slime-read-from-minibuffer - "Add to clipboard (evaluated): " - (slime-sexp-at-point)) - (slime-current-package))) - (slime-clipboard-add-internal `(:string ,exp ,package))) - -(defun slime-clipboard-add-internal (datum) - (slime-eval-async `(swank-clipboard:add ',datum) - (lambda (result) (message "%s" result)))) - -(defun slime-clipboard-display () - "Display the content of the clipboard." - (interactive) - (slime-eval-async `(swank-clipboard:entries) - #'slime-clipboard-display-entries)) - -(defun slime-clipboard-display-entries (entries) - (slime-with-popup-buffer ((slime-buffer-name :clipboard) - :mode 'slime-clipboard-mode) - (slime-clipboard-insert-entries entries))) - -(defun slime-clipboard-insert-entries (entries) - (let ((fstring "%2s %3s %s\n")) - (insert (format fstring "Nr" "Id" "Value") - (format fstring "--" "--" "-----" )) - (save-excursion - (cl-loop for i from 0 for (ref . value) in entries do - (slime-insert-propertized `(slime-clipboard-entry ,i - slime-clipboard-ref ,ref) - (format fstring i ref value)))))) - -(defun slime-clipboard-redisplay () - "Update the clipboard buffer." - (interactive) - (lexical-let ((saved (point))) - (slime-eval-async - `(swank-clipboard:entries) - (lambda (entries) - (let ((inhibit-read-only t)) - (erase-buffer) - (slime-clipboard-insert-entries entries) - (when (< saved (point-max)) - (goto-char saved))))))) - -(defun slime-clipboard-entry-at-point () - (or (get-text-property (point) 'slime-clipboard-entry) - (error "No clipboard entry at point"))) - -(defun slime-clipboard-ref-at-point () - (or (get-text-property (point) 'slime-clipboard-ref) - (error "No clipboard ref at point"))) - -(defun slime-clipboard-inspect (&optional entry) - "Inspect the current clipboard entry." - (interactive (list (slime-clipboard-ref-at-point))) - (slime-inspect (prin1-to-string `(swank-clipboard::clipboard-ref ,entry)))) - -(defun slime-clipboard-delete-entry (&optional entry) - "Delete the current entry from the clipboard." - (interactive (list (slime-clipboard-entry-at-point))) - (slime-eval-async `(swank-clipboard:delete-entry ,entry) - (lambda (result) - (slime-clipboard-redisplay) - (message "%s" result)))) - -(defun slime-clipboard-ref () - "Ask for a clipboard entry number and insert a reference to it." - (interactive) - (slime-clipboard-read-entry-number #'slime-clipboard-insert-ref)) - -;; insert a reference to clipboard entry ENTRY at point. The text -;; receives a special 'display property to make it look nicer. We -;; remove this property in a modification when a user tries to modify -;; he real text. -(defun slime-clipboard-insert-ref (entry) - (cl-destructuring-bind (ref . string) - (slime-eval `(swank-clipboard:entry-to-ref ,entry)) - (slime-insert-propertized - `(display ,(format "#@%d%s" ref string) - modification-hooks (slime-clipboard-ref-modified) - rear-nonsticky t) - (format "(swank-clipboard::clipboard-ref %d)" ref)))) - -(defun slime-clipboard-ref-modified (start end) - (when (get-text-property start 'display) - (let ((inhibit-modification-hooks t)) - (save-excursion - (goto-char start) - (cl-destructuring-bind (dstart dend) (slime-property-bounds 'display) - (unless (and (= start dstart) (= end dend)) - (remove-list-of-text-properties - dstart dend '(display modification-hooks)))))))) - -;; Read a entry number. -;; Written in CPS because the display the clipboard before reading. -(defun slime-clipboard-read-entry-number (k) - (slime-eval-async - `(swank-clipboard:entries) - (slime-rcurry - (lambda (entries window-config k) - (slime-clipboard-display-entries entries) - (let ((entry (unwind-protect - (read-from-minibuffer "Entry number: " nil nil t) - (set-window-configuration window-config)))) - (funcall k entry))) - (current-window-configuration) - k))) - -(defun slime-clipboard-add-from-inspector () - (interactive) - (let ((part (or (get-text-property (point) 'slime-part-number) - (error "No part at point")))) - (slime-clipboard-add-internal `(:inspector ,part)))) - -(defun slime-clipboard-add-from-sldb () - (interactive) - (slime-clipboard-add-internal - `(:sldb ,(sldb-frame-number-at-point) - ,(sldb-var-number-at-point)))) - -(provide 'slime-clipboard) diff --git a/elpa/slime-20200414.1444/contrib/slime-clipboard.elc b/elpa/slime-20200414.1444/contrib/slime-clipboard.elc deleted file mode 100644 index 84564a2376c3f605c469d5d1cd0f70efa9766c0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8345 zcmcIp|8LvI6*tk6K-%qx%0MWQvRP9k zOHxj~VgLI+@7*0mO0r_0r~%2;@p$*{efhl4dwg{A{PAD5wzgW29zCMR=`4%lFpwWn zLMJnSQqX0X7g3s!JKXo=&a0?ACqIrU&B|yN{l_nHyV!5Z%^%LAf~Hu7=0#XgaFzJ8 zXhK0cDat%b&WcZQH!n)^gCGp3+QoUe?><~vBS^7El9n_{lhViJc{#NoU?j1RUp#*H zj3(!P?oUdH_^E8~Cjk{HP5gw$A;qcR*hC+tpwQ3bD9oum$3)jt`$7f3>5m2Yt$(dn zt24eTLwk}2Az34@*Tcuz8@Uc&@W-wH@bIH|V9`%`_{%)XLn`8EroZhx%wn3vb{vgQ z$?di}K{)l}$S>%=OtU9(l#NqA59}z3N^1XoA^S z`;$0^Q_?@qL%ukgq_Y`3J&uZOKMBjvtuA$}r{6!fpi4*F^U}{(_L{+W?DI6eVA-JZ zHR|~ehwhK2TUt%xWVrUA3~{tRehk>R`nS!TN_}QdPb+TuREzB)T;z}A&_?*rXCXqE zp@LY`*4HdwK2OM>B76xqL&gVsA#nEDfJ=SOgwCP*}2UHe#PsXZXJMyxGX@RU6@S9IGzJ>j734Bv|Wo{&<{+mv+fM zcfGBQVb^$NHs=t}uE_eQXkI+x<+{D@?{9XB;tJmWs}|)Z-a(z%pN#{bI&J5(_8}gz z%UNbaSVTR3UF$TBo!U;j+a={fbqTB&@{5#e*w3#$RZWieYqoCaTWu{z4eiDq$tuTU zo0|v_00=I_z!n@q8~_?lY0z!8kDQ@HFP=a9_JlM(1oSP#L#s9V?>Zyd2%i77S`y>D z8siN@{X8Uz@U<#Xi18^QOY%g7wGXC~Qx+xwod_rb*DAxT70d;%BK-olr+t7kaCYq@;;&wuRVhQt;IBpiY;_OF!2_-F-O z;O8`#0YT8~QHgc5K2{ozwN||iD~r>`DIk`eR&bw6x`^V~2I|_)J1etkhNayQ3kI#9daaaVYqfn{U{E5&+FjZw*L8tRWOJrYvW`~A^KeSmn`>?`0h#9M4D3%V0~lHM&}vE% z2Vm*2T>HrL=onj}G)c!l!=O~Af<+ab*o-nPX8Wg3_-jU)Ke_PF!mf~dapUcs6N4GG z32ViQn36I29jej|(&>Ql`VV?Y4Iri^b<~OS(AQ_30TIXZ=@g{S;$uMgN^t6gmwr44 zh6de3vdqH;M6vzS&Qk1&{H52N%yR~R+nl1ixqe_(Rx(2YfnUyN>ga|XdD~B(z^xZW zjLgxeXVGjQ@G_yL+U1Z{`pY~8^kZE`KWhtbS2dAlrn9gppmwtE6&9B$&>TdEVIR^H z9pIc>xPrj>C}kpxpN8{pHm~u}MIK=$rA}ySGi8(7ftCxDLq?G(EV?U}*UJmcU;@N9 zMt?Z)DwISNT~kReJujYU_TqYW2xxF_-^p=VG10xfUv%DcvkyK59(X1X_T^&d{p~+t zbnwnClM9FMyk{=43do{*-gPp$%50q%g-b!t3BriUxi@gB?SfxvpTdBHbdI(GSHbDL z2%zvxz%lz8;j-Kw>%3V6XvBcoZc`?vw3Dj5&q$jF_GSl>q~`?jnt|=lojCm)+t3Imhk2{gte`^Y&A1ZL^ z(T^GMENp@aDJyTrlm+ovpo*jmjwa_ef8BZc9RGS?o~p#ee_;nuos@j|?*dyLKrFud zU!9DsZaoM^frZb+-c})aY3h{OI7QpZw)I_;U~dFprfB*E&|8vh!dJH4)r#W|m2@58 zm~9V{|I{0J#j76hr^=r7_8Fo8d4Y4naFlS3ZA>bT&Jb01rB&}!J{jgY zc#DMwOy!rNzAJ*SOU9NQr&=4=Bn9~K?;;_`$2$2WZko~|`#zv&iifEPQS4&*RGR|@ z7G#ReS?v>Uf2YikL{Bw708Jwb_TWaMXr)FK@aFjpwWDK~sjbmwnQ$y}1G3O`!Mp|! z4xATbQZd74hK@71R+S?1vNDH#Ixa3$mvGr_D4Ea3puGG7LWMc` zoFhUo*a;vx<$mMF<^cQb0)2(k84p@L9*Bt&QE$6ELy4e#$CSCle*eJ@@MQ6*;cizN zCSlY*{93XBeA~OVwZqrP?{X%_fP05Q27L*Y8FrpN8Cf6H^TR0FX>*GB@=JV6;zxaG zakf_749V8cK_gr9Mt^HYlDtTg1gwtDKD9#Gm3k0itk)ts<3N3tr^%VERA#3Lmi$cG z(&!uG{e>acCXKg`?gb$5=*Xr)G)3=N7^G^imt##@=e<_c8`ibmYRL>Eh$gQJYYh|onb2zsH}d<{KU{E63v zgr=g)xq7}bA=_26_t6}{ zNVdpArn)fm7MSMnUXl`") - (:license "GPL")) - -(defun slime-maybe-list-compiler-notes (notes) - "Show the compiler notes if appropriate." - ;; don't pop up a buffer if all notes are already annotated in the - ;; buffer itself - (unless (cl-every #'slime-note-has-location-p notes) - (slime-list-compiler-notes notes))) - -(defun slime-list-compiler-notes (notes) - "Show the compiler notes NOTES in tree view." - (interactive (list (slime-compiler-notes))) - (with-temp-message "Preparing compiler note tree..." - (slime-with-popup-buffer ((slime-buffer-name :notes) - :mode 'slime-compiler-notes-mode) - (when (null notes) - (insert "[no notes]")) - (let ((collapsed-p)) - (dolist (tree (slime-compiler-notes-to-tree notes)) - (when (slime-tree.collapsed-p tree) (setf collapsed-p t)) - (slime-tree-insert tree "") - (insert "\n")) - (goto-char (point-min)))))) - -(defvar slime-tree-printer 'slime-tree-default-printer) - -(defun slime-tree-for-note (note) - (make-slime-tree :item (slime-note.message note) - :plist (list 'note note) - :print-fn slime-tree-printer)) - -(defun slime-tree-for-severity (severity notes collapsed-p) - (make-slime-tree :item (format "%s (%d)" - (slime-severity-label severity) - (length notes)) - :kids (mapcar #'slime-tree-for-note notes) - :collapsed-p collapsed-p)) - -(defun slime-compiler-notes-to-tree (notes) - (let* ((alist (slime-alistify notes #'slime-note.severity #'eq)) - (collapsed-p (slime-length> alist 1))) - (cl-loop for (severity . notes) in alist - collect (slime-tree-for-severity severity notes - collapsed-p)))) - -(defvar slime-compiler-notes-mode-map) - -(define-derived-mode slime-compiler-notes-mode fundamental-mode - "Compiler-Notes" - "\\\ -\\{slime-compiler-notes-mode-map} -\\{slime-popup-buffer-mode-map} -" - (slime-set-truncate-lines)) - -(slime-define-keys slime-compiler-notes-mode-map - ((kbd "RET") 'slime-compiler-notes-default-action-or-show-details) - ([return] 'slime-compiler-notes-default-action-or-show-details) - ([mouse-2] 'slime-compiler-notes-default-action-or-show-details/mouse)) - -(defun slime-compiler-notes-default-action-or-show-details/mouse (event) - "Invoke the action pointed at by the mouse, or show details." - (interactive "e") - (cl-destructuring-bind (mouse-2 (w pos &rest _) &rest __) event - (save-excursion - (goto-char pos) - (let ((fn (get-text-property (point) - 'slime-compiler-notes-default-action))) - (if fn (funcall fn) (slime-compiler-notes-show-details)))))) - -(defun slime-compiler-notes-default-action-or-show-details () - "Invoke the action at point, or show details." - (interactive) - (let ((fn (get-text-property (point) 'slime-compiler-notes-default-action))) - (if fn (funcall fn) (slime-compiler-notes-show-details)))) - -(defun slime-compiler-notes-show-details () - (interactive) - (let* ((tree (slime-tree-at-point)) - (note (plist-get (slime-tree.plist tree) 'note)) - (inhibit-read-only t)) - (cond ((not (slime-tree-leaf-p tree)) - (slime-tree-toggle tree)) - (t - (slime-show-source-location (slime-note.location note) t))))) - - -;;;;;; Tree Widget - -(cl-defstruct (slime-tree (:conc-name slime-tree.)) - item - (print-fn #'slime-tree-default-printer :type function) - (kids '() :type list) - (collapsed-p t :type boolean) - (prefix "" :type string) - (start-mark nil) - (end-mark nil) - (plist '() :type list)) - -(defun slime-tree-leaf-p (tree) - (not (slime-tree.kids tree))) - -(defun slime-tree-default-printer (tree) - (princ (slime-tree.item tree) (current-buffer))) - -(defun slime-tree-decoration (tree) - (cond ((slime-tree-leaf-p tree) "-- ") - ((slime-tree.collapsed-p tree) "[+] ") - (t "-+ "))) - -(defun slime-tree-insert-list (list prefix) - "Insert a list of trees." - (cl-loop for (elt . rest) on list - do (cond (rest - (insert prefix " |") - (slime-tree-insert elt (concat prefix " |")) - (insert "\n")) - (t - (insert prefix " `") - (slime-tree-insert elt (concat prefix " ")))))) - -(defun slime-tree-insert-decoration (tree) - (insert (slime-tree-decoration tree))) - -(defun slime-tree-indent-item (start end prefix) - "Insert PREFIX at the beginning of each but the first line. -This is used for labels spanning multiple lines." - (save-excursion - (goto-char end) - (beginning-of-line) - (while (< start (point)) - (insert-before-markers prefix) - (forward-line -1)))) - -(defun slime-tree-insert (tree prefix) - "Insert TREE prefixed with PREFIX at point." - (with-struct (slime-tree. print-fn kids collapsed-p start-mark end-mark) tree - (let ((line-start (line-beginning-position))) - (setf start-mark (point-marker)) - (slime-tree-insert-decoration tree) - (funcall print-fn tree) - (slime-tree-indent-item start-mark (point) (concat prefix " ")) - (add-text-properties line-start (point) (list 'slime-tree tree)) - (set-marker-insertion-type start-mark t) - (when (and kids (not collapsed-p)) - (terpri (current-buffer)) - (slime-tree-insert-list kids prefix)) - (setf (slime-tree.prefix tree) prefix) - (setf end-mark (point-marker))))) - -(defun slime-tree-at-point () - (cond ((get-text-property (point) 'slime-tree)) - (t (error "No tree at point")))) - -(defun slime-tree-delete (tree) - "Delete the region for TREE." - (delete-region (slime-tree.start-mark tree) - (slime-tree.end-mark tree))) - -(defun slime-tree-toggle (tree) - "Toggle the visibility of TREE's children." - (with-struct (slime-tree. collapsed-p start-mark end-mark prefix) tree - (setf collapsed-p (not collapsed-p)) - (slime-tree-delete tree) - (insert-before-markers " ") ; move parent's end-mark - (backward-char 1) - (slime-tree-insert tree prefix) - (delete-char 1) - (goto-char start-mark))) - -(provide 'slime-compiler-notes-tree) diff --git a/elpa/slime-20200414.1444/contrib/slime-compiler-notes-tree.elc b/elpa/slime-20200414.1444/contrib/slime-compiler-notes-tree.elc deleted file mode 100644 index c6672bb58bf762c15381c22b02c3d43973f77455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19100 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 LLw-R~^~(PPiBv#j diff --git a/elpa/slime-20200414.1444/contrib/slime-editing-commands.el b/elpa/slime-20200414.1444/contrib/slime-editing-commands.el deleted file mode 100644 index db7bb01e..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-editing-commands.el +++ /dev/null @@ -1,183 +0,0 @@ -(require 'slime) -(require 'slime-repl) -(require 'cl-lib) - -(define-slime-contrib slime-editing-commands - "Editing commands without server interaction." - (:authors "Thomas F. Burdick " - "Luke Gorrie " - "Bill Clementson " - "Tobias C. Rittweiler ") - (:license "GPL") - (:on-load - (define-key slime-mode-map "\M-\C-a" 'slime-beginning-of-defun) - (define-key slime-mode-map "\M-\C-e" 'slime-end-of-defun) - (define-key slime-mode-map "\C-c\M-q" 'slime-reindent-defun) - (define-key slime-mode-map "\C-c\C-]" 'slime-close-all-parens-in-sexp))) - -(defun slime-beginning-of-defun () - (interactive) - (if (and (boundp 'slime-repl-input-start-mark) - slime-repl-input-start-mark) - (slime-repl-beginning-of-defun) - (let ((this-command 'beginning-of-defun)) ; needed for push-mark - (call-interactively 'beginning-of-defun)))) - -(defun slime-end-of-defun () - (interactive) - (if (eq major-mode 'slime-repl-mode) - (slime-repl-end-of-defun) - (end-of-defun))) - -(defvar slime-comment-start-regexp - "\\(\\(^\\|[^\n\\\\]\\)\\([\\\\][\\\\]\\)*\\);+[ \t]*" - "Regexp to match the start of a comment.") - -(defun slime-beginning-of-comment () - "Move point to beginning of comment. -If point is inside a comment move to beginning of comment and return point. -Otherwise leave point unchanged and return NIL." - (let ((boundary (point))) - (beginning-of-line) - (cond ((re-search-forward slime-comment-start-regexp boundary t) - (point)) - (t (goto-char boundary) - nil)))) - -(defvar slime-close-parens-limit nil - "Maxmimum parens for `slime-close-all-sexp' to insert. NIL -means to insert as many parentheses as necessary to correctly -close the form.") - -(defun slime-close-all-parens-in-sexp (&optional region) - "Balance parentheses of open s-expressions at point. -Insert enough right parentheses to balance unmatched left parentheses. -Delete extra left parentheses. Reformat trailing parentheses -Lisp-stylishly. - -If REGION is true, operate on the region. Otherwise operate on -the top-level sexp before point." - (interactive "P") - (let ((sexp-level 0) - point) - (save-excursion - (save-restriction - (when region - (narrow-to-region (region-beginning) (region-end)) - (goto-char (point-max))) - ;; skip over closing parens, but not into comment - (skip-chars-backward ") \t\n") - (when (slime-beginning-of-comment) - (forward-line) - (skip-chars-forward " \t")) - (setq point (point)) - ;; count sexps until either '(' or comment is found at first column - (while (and (not (looking-at "^[(;]")) - (ignore-errors (backward-up-list 1) t)) - (incf sexp-level)))) - (when (> sexp-level 0) - ;; insert correct number of right parens - (goto-char point) - (dotimes (i sexp-level) (insert ")")) - ;; delete extra right parens - (setq point (point)) - (skip-chars-forward " \t\n)") - (skip-chars-backward " \t\n") - (let* ((deleted-region (delete-and-extract-region point (point))) - (deleted-text (substring-no-properties deleted-region)) - (prior-parens-count (cl-count ?\) deleted-text))) - ;; Remember: we always insert as many parentheses as necessary - ;; and only afterwards delete the superfluously-added parens. - (when slime-close-parens-limit - (let ((missing-parens (- sexp-level prior-parens-count - slime-close-parens-limit))) - (dotimes (i (max 0 missing-parens)) - (delete-char -1)))))))) - -(defun slime-insert-balanced-comments (arg) - "Insert a set of balanced comments around the s-expression -containing the point. If this command is invoked repeatedly -\(without any other command occurring between invocations), the -comment progressively moves outward over enclosing expressions. -If invoked with a positive prefix argument, the s-expression arg -expressions out is enclosed in a set of balanced comments." - (interactive "*p") - (save-excursion - (when (eq last-command this-command) - (when (search-backward "#|" nil t) - (save-excursion - (delete-char 2) - (while (and (< (point) (point-max)) (not (looking-at " *|#"))) - (forward-sexp)) - (replace-match "")))) - (while (> arg 0) - (backward-char 1) - (cond ((looking-at ")") (incf arg)) - ((looking-at "(") (decf arg)))) - (insert "#|") - (forward-sexp) - (insert "|#"))) - -(defun slime-remove-balanced-comments () - "Remove a set of balanced comments enclosing point." - (interactive "*") - (save-excursion - (when (search-backward "#|" nil t) - (delete-char 2) - (while (and (< (point) (point-max)) (not (looking-at " *|#"))) - (forward-sexp)) - (replace-match "")))) - - -;; SLIME-CLOSE-PARENS-AT-POINT is obsolete: - -;; It doesn't work correctly on the REPL, because there -;; BEGINNING-OF-DEFUN-FUNCTION and END-OF-DEFUN-FUNCTION is bound to -;; SLIME-REPL-MODE-BEGINNING-OF-DEFUN (and -;; SLIME-REPL-MODE-END-OF-DEFUN respectively) which compromises the -;; way how they're expect to work (i.e. END-OF-DEFUN does not signal -;; an UNBOUND-PARENTHESES error.) - -;; Use SLIME-CLOSE-ALL-PARENS-IN-SEXP instead. - -;; (defun slime-close-parens-at-point () -;; "Close parenthesis at point to complete the top-level-form. Simply -;; inserts ')' characters at point until `beginning-of-defun' and -;; `end-of-defun' execute without errors, or `slime-close-parens-limit' -;; is exceeded." -;; (interactive) -;; (loop for i from 1 to slime-close-parens-limit -;; until (save-excursion -;; (slime-beginning-of-defun) -;; (ignore-errors (slime-end-of-defun) t)) -;; do (insert ")"))) - -(defun slime-reindent-defun (&optional force-text-fill) - "Reindent the current defun, or refill the current paragraph. -If point is inside a comment block, the text around point will be -treated as a paragraph and will be filled with `fill-paragraph'. -Otherwise, it will be treated as Lisp code, and the current defun -will be reindented. If the current defun has unbalanced parens, -an attempt will be made to fix it before reindenting. - -When given a prefix argument, the text around point will always -be treated as a paragraph. This is useful for filling docstrings." - (interactive "P") - (save-excursion - (if (or force-text-fill (slime-beginning-of-comment)) - (fill-paragraph nil) - (let ((start (progn (unless (or (and (zerop (current-column)) - (eq ?\( (char-after))) - (and slime-repl-input-start-mark - (slime-repl-at-prompt-start-p))) - (slime-beginning-of-defun)) - (point))) - (end (ignore-errors (slime-end-of-defun) (point)))) - (unless end - (forward-paragraph) - (slime-close-all-parens-in-sexp) - (slime-end-of-defun) - (setf end (point))) - (indent-region start end nil))))) - -(provide 'slime-editing-commands) diff --git a/elpa/slime-20200414.1444/contrib/slime-editing-commands.elc b/elpa/slime-20200414.1444/contrib/slime-editing-commands.elc deleted file mode 100644 index 9c54fcaf25f827bf599bd0219fe5709fb4673f77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5665 zcmcIo`)?b^5hjpdBpNaDXwjsp?eVF#MOjDi?)Xruv{0-#h5*M794Glfl%eC@lHBSZ z?B1PZ7ViJvZ+7>nqf8YAf(jye`5moot$*!ydv~%dg&XCu zAZHx(diZz`$G*o8{PCNO0FBeD z}vs!Wd$>T!|9jggPW!Em)y37N$rE9+$+-K!TxNnQvSinxnViHyzU7UJFFjQVH) zi&d+P1F>OO?NgY{XS?dt-#qRa1uS|)DClME65|MV&j5yJ$7nCqwtuu$TXs>E);f$L zB`1Y#-gG}H5#_kEY1Rw|a!1<^OclS#%4*!%roG;W!Z~+*E*)zL}sS zLi=czhBE0Qj(OUfe8NF~+@;sDEUyIENMX-N9Zi)G6ImAB81g!_>pcJQh0{4BZxcE; z#L_i1*zP?BU+{5j%lx1xAoeF7`d{K}zz+{Q*2Q%IFA~@dK5>gOR3(C4U4VyVQKOJ1 zd6mTr>jlQJyFrr;T?`e71{s18<)uiLK)rS!@Ut;cn_#dEkz;{$EC@aWeEGA9Gk zq~SkuMRm$vzPnK55cFc zbNu+fZ*5I#`mO_3$6=_J|IOZOnwpIKs}s zh<*s)r82EjGSo^~MCX=(RB0=5!ru*fISuxb)tZ?m>r0i=2c^p!nWsqyq&MKu^OY%p$}Jrv|$% zf+Syvj0zWuD{RjN5`|^$>=S(q5?Nl&=A`6oj-keS4jU`B$}}ht0g0Hd&FZ$l19g^y z#Jf_39}W|M#b?8|7?*I)Y;BYF3t23Ho@FA7d9p+egm`}a?D@&7mxO>WRVDWM7%Idb zAX|ndP==#)={j1kC$xD&nJ?T#fP0922HZdci=$03ds}8j-0nW&@-olD#O~VBC5g^) zUwnyJ_3`Ng;t1l;K~-Ll@a56JIgDc)%$S72n8Kd&#IH8^fjcHsbG3!qkX@QW0x5rssXsxkH zO<@jgJE-LI3$E%A%+A}>-NQ4Gwoocp9UvvTV4iU+C@68W@W41u2Xz38u74e?n+qZZ zDuIZotko>4iMgD(S?(?rhjb~y9w?n7T$r0TP|eB&V3TOGB8Fj^>yq-g2FtZ8!C z8jqwBe1M~v&NCX+tP+fRi18mC&5gmxBTEw@u%vUL<%GD-K%f-GwSvi*4X$b1>k>nr zQK??($MQUq3FDInO}fiP-h4LJq9)I@&zwP(a3C?W4&4}$fKx2aR#vyfx-$D zC$q~uGB?1^K5vG-bzX)|@|os7u0(V?EC^C{NP5;>RH7lf!=S8WO=CFkj5MGDa}@ph%4mn=G??kCgZrZ>FdN=FhgN8CM8hO z*0wI0o&Zy;%AA2a)HxR2Ojp1$D20ngkWH+4;1L#Z>F)8RuGiO1W+|j;@WJnRR9}+x znhwYg?8MX(yyT%#rDtjhz9~k(ZH+TcD4(%_eJfs*S1*7b*-u#FtpAjhG!f7&|bqz7G$YUVXs5I#Fq_a+9-@_3FpgDe!r1>Hn84uZym}e{jH-vxb8@ zukCeL69l6gfP&|6V@B3j-~+tGN!A8ISm8{Ci@CPX1iWfU;IT}Q{;`AG>4W|R&#)cm+UNDVK%SoCgG;{?Z6QaQA{w_))VShrR!*CD9)J%tQBhXgFmYFj4k9 zt!?f$^v8?QgF(J+f*YBRydih=O^0SfRAP)E$ob<}y6o$p@RWg`f`?)KU>ALczR?}# zOwjON4YeC*Y2IN!xRrB(VlJX4nQtsl)&o;BV2}E}rr@yTssdqR@2d6PeodZvSydM` zX2a&idBvJ55Y+dw)inttjki") - (:license "GPL")) - -(defun slime-parse-sexp-at-point (&optional n) - "Returns the sexps at point as a list of strings, otherwise nil. -\(If there are not as many sexps as N, a list with < N sexps is -returned.\) -If SKIP-BLANKS-P is true, leading whitespaces &c are skipped. -" - (interactive "p") (or n (setq n 1)) - (save-excursion - (let ((result nil)) - (dotimes (i n) - ;; Is there an additional sexp in front of us? - (save-excursion - (unless (slime-point-moves-p (ignore-errors (forward-sexp))) - (cl-return))) - (push (slime-sexp-at-point) result) - ;; Skip current sexp - (ignore-errors (forward-sexp) (skip-chars-forward "[:space:]"))) - (nreverse result)))) - -(defun slime-has-symbol-syntax-p (string) - (if (and string (not (zerop (length string)))) - (member (char-syntax (aref string 0)) - '(?w ?_ ?\' ?\\)))) - -(defun slime-beginning-of-string () - (let* ((parser-state (slime-current-parser-state)) - (inside-string-p (nth 3 parser-state)) - (string-start-pos (nth 8 parser-state))) - (if inside-string-p - (goto-char string-start-pos) - (error "We're not within a string")))) - -(defun slime-enclosing-form-specs (&optional max-levels) - "Return the list of ``raw form specs'' of all the forms -containing point from right to left. - -As a secondary value, return a list of indices: Each index tells -for each corresponding form spec in what argument position the -user's point is. - -As tertiary value, return the positions of the operators that are -contained in the returned form specs. - -When MAX-LEVELS is non-nil, go up at most this many levels of -parens. - -\(See SWANK::PARSE-FORM-SPEC for more information about what -exactly constitutes a ``raw form specs'') - -Examples: - - A return value like the following - - (values ((\"quux\") (\"bar\") (\"foo\")) (3 2 1) (p1 p2 p3)) - - can be interpreted as follows: - - The user point is located in the 3rd argument position of a - form with the operator name \"quux\" (which starts at P1.) - - This form is located in the 2nd argument position of a form - with the operator name \"bar\" (which starts at P2.) - - This form again is in the 1st argument position of a form - with the operator name \"foo\" (which itself begins at P3.) - - For instance, the corresponding buffer content could have looked - like `(foo (bar arg1 (quux 1 2 |' where `|' denotes point. -" - (let ((level 1) - (parse-sexp-lookup-properties nil) - (initial-point (point)) - (result '()) (arg-indices '()) (points '())) - ;; The expensive lookup of syntax-class text properties is only - ;; used for interactive balancing of #<...> in presentations; we - ;; do not need them in navigating through the nested lists. - ;; This speeds up this function significantly. - (ignore-errors - (save-excursion - ;; Make sure we get the whole thing at point. - (if (not (slime-inside-string-p)) - (slime-end-of-symbol) - (slime-beginning-of-string) - (forward-sexp)) - (save-restriction - ;; Don't parse more than 20000 characters before point, so we don't spend - ;; too much time. - (narrow-to-region (max (point-min) (- (point) 20000)) (point-max)) - (narrow-to-region (save-excursion (beginning-of-defun) (point)) - (min (1+ (point)) (point-max))) - (while (or (not max-levels) - (<= level max-levels)) - (let ((arg-index 0)) - ;; Move to the beginning of the current sexp if not already there. - (if (or (and (char-after) - (member (char-syntax (char-after)) '(?\( ?'))) - (member (char-syntax (char-before)) '(?\ ?>))) - (cl-incf arg-index)) - (ignore-errors (backward-sexp 1)) - (while (and (< arg-index 64) - (ignore-errors (backward-sexp 1) - (> (point) (point-min)))) - (cl-incf arg-index)) - (backward-up-list 1) - (when (member (char-syntax (char-after)) '(?\( ?')) - (cl-incf level) - (forward-char 1) - (let ((name (slime-symbol-at-point))) - (push (and name `(,name)) result) - (push arg-index arg-indices) - (push (point) points)) - (backward-up-list 1))))))) - (cl-values - (nreverse result) - (nreverse arg-indices) - (nreverse points)))) - -(defvar slime-variable-binding-ops-alist - '((let &bindings &body) - (let* &bindings &body))) - -(defvar slime-function-binding-ops-alist - '((flet &bindings &body) - (labels &bindings &body) - (macrolet &bindings &body))) - -(defun slime-lookup-binding-op (op &optional binding-type) - (cl-labels ((lookup-in (list) (cl-assoc op list :test 'cl-equalp :key 'symbol-name))) - (cond ((eq binding-type :variable) (lookup-in slime-variable-binding-ops-alist)) - ((eq binding-type :function) (lookup-in slime-function-binding-ops-alist)) - (t (or (lookup-in slime-variable-binding-ops-alist) - (lookup-in slime-function-binding-ops-alist)))))) - -(defun slime-binding-op-p (op &optional binding-type) - (and (slime-lookup-binding-op op binding-type) t)) - -(defun slime-binding-op-body-pos (op) - (let ((special-lambda-list (slime-lookup-binding-op op))) - (if special-lambda-list (cl-position '&body special-lambda-list)))) - -(defun slime-binding-op-bindings-pos (op) - (let ((special-lambda-list (slime-lookup-binding-op op))) - (if special-lambda-list (cl-position '&bindings special-lambda-list)))) - -(defun slime-enclosing-bound-names () - "Returns all bound function names as first value, and the -points where their bindings are established as second value." - (cl-multiple-value-call #'slime-find-bound-names - (slime-enclosing-form-specs))) - -(defun slime-find-bound-names (ops indices points) - (let ((binding-names) (binding-start-points)) - (save-excursion - (cl-loop for (op . nil) in ops - for index in indices - for point in points - do (when (and (slime-binding-op-p op) - ;; Are the bindings of OP in scope? - (>= index (slime-binding-op-body-pos op))) - (goto-char point) - (forward-sexp (slime-binding-op-bindings-pos op)) - (down-list) - (ignore-errors - (cl-loop - (down-list) - (push (slime-symbol-at-point) binding-names) - (push (save-excursion (backward-up-list) (point)) - binding-start-points) - (up-list))))) - (cl-values (nreverse binding-names) (nreverse binding-start-points))))) - - -(defun slime-enclosing-bound-functions () - (cl-multiple-value-call #'slime-find-bound-functions - (slime-enclosing-form-specs))) - -(defun slime-find-bound-functions (ops indices points) - (let ((names) (arglists) (start-points)) - (save-excursion - (cl-loop for (op . nil) in ops - for index in indices - for point in points - do (when (and (slime-binding-op-p op :function) - ;; Are the bindings of OP in scope? - (>= index (slime-binding-op-body-pos op))) - (goto-char point) - (forward-sexp (slime-binding-op-bindings-pos op)) - (down-list) - ;; If we're at the end of the bindings, an error will - ;; be signalled by the `down-list' below. - (ignore-errors - (cl-loop - (down-list) - (cl-destructuring-bind (name arglist) - (slime-parse-sexp-at-point 2) - (cl-assert (slime-has-symbol-syntax-p name)) - (cl-assert arglist) - (push name names) - (push arglist arglists) - (push (save-excursion (backward-up-list) (point)) - start-points)) - (up-list))))) - (cl-values (nreverse names) - (nreverse arglists) - (nreverse start-points))))) - - -(defun slime-enclosing-bound-macros () - (cl-multiple-value-call #'slime-find-bound-macros - (slime-enclosing-form-specs))) - -(defun slime-find-bound-macros (ops indices points) - ;; Kludgy! - (let ((slime-function-binding-ops-alist '((macrolet &bindings &body)))) - (slime-find-bound-functions ops indices points))) - -(provide 'slime-enclosing-context) diff --git a/elpa/slime-20200414.1444/contrib/slime-enclosing-context.elc b/elpa/slime-20200414.1444/contrib/slime-enclosing-context.elc deleted file mode 100644 index 5f1f0a5ac53a73655b3a0679710bc564d33629b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7340 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 diff --git a/elpa/slime-20200414.1444/contrib/slime-fancy-inspector.el b/elpa/slime-20200414.1444/contrib/slime-fancy-inspector.el deleted file mode 100644 index 02d01319..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-fancy-inspector.el +++ /dev/null @@ -1,42 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-fancy-inspector - "Fancy inspector for CLOS objects." - (:authors "Marco Baringer and others") - (:license "GPL") - (:slime-dependencies slime-parse) - (:swank-dependencies swank-fancy-inspector) - (:on-load - (add-hook 'slime-edit-definition-hooks 'slime-edit-inspector-part)) - (:on-unload - (remove-hook 'slime-edit-definition-hooks 'slime-edit-inspector-part))) - -(defun slime-inspect-definition () - "Inspect definition at point" - (interactive) - (slime-inspect (slime-definition-at-point))) - -(defun slime-disassemble-definition () - "Disassemble definition at point" - (interactive) - (slime-eval-describe `(swank:disassemble-form - ,(slime-definition-at-point t)))) - -(defun slime-edit-inspector-part (name &optional where) - (and (eq major-mode 'slime-inspector-mode) - (cl-destructuring-bind (&optional property value) - (slime-inspector-property-at-point) - (when (eq property 'slime-part-number) - (let ((location (slime-eval `(swank:find-definition-for-thing - (swank:inspector-nth-part ,value)))) - (name (format "Inspector part %s" value))) - (when (and (consp location) - (not (eq (car location) :error))) - (slime-edit-definition-cont - (list (make-slime-xref :dspec `(,name) - :location location)) - name - where))))))) - -(provide 'slime-fancy-inspector) diff --git a/elpa/slime-20200414.1444/contrib/slime-fancy-inspector.elc b/elpa/slime-20200414.1444/contrib/slime-fancy-inspector.elc deleted file mode 100644 index 6b3bed21b105df6e031a22bd5467c0b7ea153db4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2120 zcmbtV-*4MC5cXs1q5}pL7`h+WRoYs6D-BC>;wD+zbaqh$Xtx2|Ta^b|qGGlZsghKJ z?62REq9QvEO+~#W#b&V0dtF01H{wykxoCZ~<>BnrS#=N^>b7 z-kl`w#WTodrj6p_R6oa4r47(L zXE|I(iS{P(-ZdY&L?1#L$fPh7FE^$jFVG^$>%SMr$B?b5qM1R6&s}&ba?lboDqzK+ zlyobIPelWxs^m<8S>wexY2#uE?)0+&?)n=JhojYnVI-3|gCI?&Q+%Q)X&l*wePY~9 z=K*|B>~q5v16}gU|C5?3%}yX54@WsGXvwLDXYK+isK_n|7rJJdkqTGbK=?uMvX5ik zr@=2*3 zo11kDn{Gbxg&zg)smdh$POT2$@cmY;j#f;w2{$jn4z4t79OM8)2XFs+7hq)~ByxBZ z@4<0PTj*H<)Icq{Fh5?Wy649Rhpx6Ax*=*I`xksY`XGcF;)38v!6^I*CJ;q?@fdJw zkaOWtlE9K{sx_-tsCoUHx53N%H*SI0b^pn78!J1bCBCLJY%h+zZPNax$3m*=%ZUJv z%dAT!na#UYuE~WP!tFuBB92hb89cShF9j{(96QFw5ZptwyNAfaoj(V-oC9h|^w|Er z{yL3k@wfN;^>?_QCL!MIDU9pn{@XNNdaV&?m^puc*n3F(2!$t_KUiWlk{GEUM-S5A zd+YUweH-`v;NcNkunlNkoB`{#QfO8TYcd8H0{Id>V gpD86(7v+lLT19Akdjh*wTrsaRjwQSKTQVO02Xft|9smFU diff --git a/elpa/slime-20200414.1444/contrib/slime-fancy-trace.el b/elpa/slime-20200414.1444/contrib/slime-fancy-trace.el deleted file mode 100644 index 06a1fab2..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-fancy-trace.el +++ /dev/null @@ -1,68 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-fancy-trace - "Enhanced version of slime-trace capable of tracing local functions, -methods, setf functions, and other entities supported by specific -swank:swank-toggle-trace backends. Invoke via C-u C-t." - (:authors "Matthias Koeppe " - "Tobias C. Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-parse)) - -(defun slime-trace-query (spec) - "Ask the user which function to trace; SPEC is the default. -The result is a string." - (cond ((null spec) - (slime-read-from-minibuffer "(Un)trace: ")) - ((stringp spec) - (slime-read-from-minibuffer "(Un)trace: " spec)) - ((symbolp spec) ; `slime-extract-context' can return symbols. - (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec))) - (t - (slime-dcase spec - ((setf n) - (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec))) - ((:defun n) - (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string n))) - ((:defgeneric n) - (let* ((name (prin1-to-string n)) - (answer (slime-read-from-minibuffer "(Un)trace: " name))) - (cond ((and (string= name answer) - (y-or-n-p (concat "(Un)trace also all " - "methods implementing " - name "? "))) - (prin1-to-string `(:defgeneric ,n))) - (t - answer)))) - ((:defmethod &rest _) - (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec))) - ((:call caller callee) - (let* ((callerstr (prin1-to-string caller)) - (calleestr (prin1-to-string callee)) - (answer (slime-read-from-minibuffer "(Un)trace: " - calleestr))) - (cond ((and (string= calleestr answer) - (y-or-n-p (concat "(Un)trace only when " calleestr - " is called by " callerstr "? "))) - (prin1-to-string `(:call ,caller ,callee))) - (t - answer)))) - (((:labels :flet) &rest _) - (slime-read-from-minibuffer "(Un)trace local function: " - (prin1-to-string spec))) - (t (error "Don't know how to trace the spec %S" spec)))))) - -(defun slime-toggle-fancy-trace (&optional using-context-p) - "Toggle trace." - (interactive "P") - (let* ((spec (if using-context-p - (slime-extract-context) - (slime-symbol-at-point))) - (spec (slime-trace-query spec))) - (message "%s" (slime-eval `(swank:swank-toggle-trace ,spec))))) - -;; override slime-toggle-trace-fdefinition -(define-key slime-prefix-map "\C-t" 'slime-toggle-fancy-trace) - -(provide 'slime-fancy-trace) diff --git a/elpa/slime-20200414.1444/contrib/slime-fancy-trace.elc b/elpa/slime-20200414.1444/contrib/slime-fancy-trace.elc deleted file mode 100644 index a26d6accc24f14025c00dff03327a9f59b0db3ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2835 zcmbtW-EZ4A5O*FnI4`hkM?T&g$| z;EjjOaF(%NfS)9gEKpj;Vy+$_S1JvD z81fLVrMQPf@9-8zm?4J9Gz6K@J{~S~WIsfTuuor~J$nYh!k2!aQN;&Fye~pf83ew7 z8HXhEH-uECDB!+KVlF{1@Sw*^x#)tg`jG-(`)jpY{n<)$JIF!~)|5F8K5lpFxwN3i z!;Les;H~8Eidb?`Nt{;ycJ52XFToqM`XP_}B=!~DHwWy<7s1Nb=q_%@BG%A*E8^s% z41%6oYl0Y3Mno~vQa=wMDnvk$@0XB9ngJV>TG+Kthg&a@5V4*5^N`O9IUk1n z4-2e|Y(`(54dGR+^^#-pNqD3Kc@jy^XR%i1-~js8)0fXJ^q7nJ(K~rKf>U*cHDGF0 z!g3J@3lm~0XwVs$WI2Y{FVD{a%bHG7RuzdJwk~iZxxzKEd??F%xN|%4%9MLoaJj-z z_f^h=0a#7+`KZ~b17ec8d5lE%-8HdUW?%D=$en941+Uqyc$l#6y_27|Pk%P?6ckaz zVlNtZi22J?B(XOHaom_jC%EwbLM(TL4<>{=o<>ifOs!vQRgh%hf1{Icws7lC33gJ# zE=$P_fd4>R7wO7IvSV&3Q#`MqXRNqElPCq$!aaT*BlVABiU zL9H!w8h1LqT4wFE!HwhN^7!K|6N}C+TINkmFs5wG8tq*Q(diHP8hNGI3EQ-Bmu&3p zwRcZC`y{2k*X`Uli~Vk=U(0XzOPl*^HjgoOWH57(%b457&%Dvp8#~_^vx#qP9=G?} z`{%~&hg%3R{I<4&c@%oaN-O@^y0(~6_LwxewwPfuu`%ZC@Ax$}Xv%cxxsQ8CI?Zi1 zcA@9tCd2i?A@mroB@Qg)IM5s6&bEUDTd2~u4WjBGlKY_@$t<-~?Ao&;imJMaqT7;fk&52#dN9 z<~8SnOPtp$JCnAs^EF90@^P|K_s5=-a=pkx1#y}uoRDy|6a7#8Be;?eM`l`h>nNE> zR@iE|pySj!=m_2fW-HvLJVo96M~Oe4sJNPH@-o@+X@F?s3ki2U+7J4u#K*=RGF7Ayvx)CTwTHh z`n_Ekg6nu}fCI31;vT?7HlO2_$VBXuEzKWHeY#*}6u&~Df6cJrAGDoU?UQX| zr8pi?vfiO3gM0Wt+V0Y8W7chBQJcm?d3gg3jDO0(gz$8qszp^fs8;DLOKcxSXR)Yf z&OjhqSE^U|Wr!sZlrn`9o@ zg#+5$f3WDB1FBO~US" - "Tobias C Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-repl - slime-autodoc - slime-c-p-c - slime-editing-commands - slime-fancy-inspector - slime-fancy-trace - slime-fuzzy - slime-mdot-fu - slime-macrostep - slime-presentations - slime-scratch - slime-references - slime-package-fu - slime-fontifying-fu - slime-trace-dialog - slime-indentation) - (:on-load - (slime-trace-dialog-init) - (slime-repl-init) - (slime-autodoc-init) - (slime-c-p-c-init) - (slime-editing-commands-init) - (slime-fancy-inspector-init) - (slime-fancy-trace-init) - (slime-fuzzy-init) - (slime-presentations-init) - (slime-scratch-init) - (slime-references-init) - (slime-package-fu-init) - (slime-fontifying-fu-init) - (slime-indentation-init))) - -(provide 'slime-fancy) diff --git a/elpa/slime-20200414.1444/contrib/slime-fancy.elc b/elpa/slime-20200414.1444/contrib/slime-fancy.elc deleted file mode 100644 index a5c7f4b94edc4b0f2adcf9b937a4aac89c124e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2836 zcmd^B-;3Kg5Z=cl|3F{oQfL#XLuBudD_f41rId0#D80UQ_d${5MAVjCNp8vh^_65P z8SQrOrEnZHpfK~zc*fFvn(^i9cUO;2PEKZ*mzQv*`$2YsM@1@l-BV`at1wn-1@-x= ziI#8D?SOV2=)uWe-cskyb~TH}k2`6h^-*B7!UEqb+DispGwY00Tl>sgjdegd7aR^* z$n#bG{9X*MeGH`?Fs&T*&ZBFqKRlwUSN~kSeG6k>g7XlZhu}Ol&Qpgx>x(&jGUCf9jR4!pKK)ll4BZ4& zbadJ?Cuyu2sw@jGooACjroQ(zx5=fYitQ_@>>!xara+x1O3u-ax3~Lb?YVYUJ7$eC zqpcG|(g!1~@Z5_WPnczfI<`xi5v?#nG0)VvjcTCmGu?_~%+`}vw)^nDhdl9ZDlTcK zx9K^lc+PYK^>Vi0qNSar7M@Ol^X{aB$Dfq!j{FF;xSk`DG#)uUAZL(F=UKQ&0$FE) zWTDPNlZDeP6#=za0 zV_QC&RQUU*>AX?KNCE7Zcu+u@3>YjJfenck7&>wTqep^Zv|tG~V5(po@g>5`10knN z6&Ny|?n4p&hgJB`PxtOA-avEn;N2Tl7%30kzJF(XdbZ?y0ZxoBpnIGztan-e1LIWs z(h!BAi4tuj&4DLm-nDB6+A91xQdfunF{%XX&Sp_vz~fn z=$y^^%&&95F0Pv}XbJJFe)8Mnsc(|t8s=fF@G$1C6~0Q0+~md|%K=6(ZTweA7-@b! zMGxHe%8r-)ex2F2gkxjM1U}4x2}q?~%>Sm&?ZO27ON(I;05AH_QF_@^*{yo&cB@gz zs;65nHlx|DxcGAp^N)HHp1Oh$(z$QKe~ub>;h1^Z8X-2)+32@~#r)0tck?9-Mt_xD J+yL=&_dAaAx4-}Z diff --git a/elpa/slime-20200414.1444/contrib/slime-fontifying-fu.el b/elpa/slime-20200414.1444/contrib/slime-fontifying-fu.el deleted file mode 100644 index 42de251b..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-fontifying-fu.el +++ /dev/null @@ -1,231 +0,0 @@ -(require 'slime) -(require 'slime-parse) -(require 'slime-autodoc) -(require 'font-lock) -(require 'cl-lib) - -;;; Fontify WITH-FOO, DO-FOO, and DEFINE-FOO like standard macros. -;;; Fontify CHECK-FOO like CHECK-TYPE. -(defvar slime-additional-font-lock-keywords - '(("(\\(\\(\\s_\\|\\w\\)*:\\(define-\\|do-\\|with-\\|without-\\)\\(\\s_\\|\\w\\)*\\)" 1 font-lock-keyword-face) - ("(\\(\\(define-\\|do-\\|with-\\)\\(\\s_\\|\\w\\)*\\)" 1 font-lock-keyword-face) - ("(\\(check-\\(\\s_\\|\\w\\)*\\)" 1 font-lock-warning-face) - ("(\\(assert-\\(\\s_\\|\\w\\)*\\)" 1 font-lock-warning-face))) - -;;;; Specially fontify forms suppressed by a reader conditional. -(defcustom slime-highlight-suppressed-forms t - "Display forms disabled by reader conditionals as comments." - :type '(choice (const :tag "Enable" t) (const :tag "Disable" nil)) - :group 'slime-mode) - -(define-slime-contrib slime-fontifying-fu - "Additional fontification tweaks: -Fontify WITH-FOO, DO-FOO, DEFINE-FOO like standard macros. -Fontify CHECK-FOO like CHECK-TYPE." - (:authors "Tobias C. Rittweiler ") - (:license "GPL") - (:on-load - (font-lock-add-keywords - 'lisp-mode slime-additional-font-lock-keywords) - (when slime-highlight-suppressed-forms - (slime-activate-font-lock-magic))) - (:on-unload - ;; FIXME: remove `slime-search-suppressed-forms', and remove the - ;; extend-region hook. - (font-lock-remove-keywords - 'lisp-mode slime-additional-font-lock-keywords))) - -(defface slime-reader-conditional-face - '((t (:inherit font-lock-comment-face))) - "Face for compiler notes while selected." - :group 'slime-mode-faces) - -(defvar slime-search-suppressed-forms-match-data (list nil nil)) - -(defun slime-search-suppressed-forms-internal (limit) - (when (search-forward-regexp slime-reader-conditionals-regexp limit t) - (let ((start (match-beginning 0)) ; save match data - (state (slime-current-parser-state))) - (if (or (nth 3 state) (nth 4 state)) ; inside string or comment? - (slime-search-suppressed-forms-internal limit) - (let* ((char (char-before)) - (expr (read (current-buffer))) - (val (slime-eval-feature-expression expr))) - (when (<= (point) limit) - (if (or (and (eq char ?+) (not val)) - (and (eq char ?-) val)) - ;; If `slime-extend-region-for-font-lock' did not - ;; fully extend the region, the assertion below may - ;; fail. This should only happen on XEmacs and older - ;; versions of GNU Emacs. - (ignore-errors - (forward-sexp) (backward-sexp) - ;; Try to suppress as far as possible. - (slime-forward-sexp) - (cl-assert (<= (point) limit)) - (let ((md (match-data nil slime-search-suppressed-forms-match-data))) - (setf (cl-first md) start) - (setf (cl-second md) (point)) - (set-match-data md) - t)) - (slime-search-suppressed-forms-internal limit)))))))) - -(defun slime-search-suppressed-forms (limit) - "Find reader conditionalized forms where the test is false." - (when (and slime-highlight-suppressed-forms - (slime-connected-p)) - (let ((result 'retry)) - (while (and (eq result 'retry) (<= (point) limit)) - (condition-case condition - (setq result (slime-search-suppressed-forms-internal limit)) - (end-of-file ; e.g. #+( - (setq result nil)) - ;; We found a reader conditional we couldn't process for - ;; some reason; however, there may still be other reader - ;; conditionals before `limit'. - (invalid-read-syntax ; e.g. #+#.foo - (setq result 'retry)) - (scan-error ; e.g. #+nil (foo ... - (setq result 'retry)) - (slime-incorrect-feature-expression ; e.g. #+(not foo bar) - (setq result 'retry)) - (slime-unknown-feature-expression ; e.g. #+(foo) - (setq result 'retry)) - (error - (setq result nil) - (slime-display-warning - (concat "Caught error during fontification while searching for forms\n" - "that are suppressed by reader-conditionals. The error was: %S.") - condition)))) - result))) - - -(defun slime-search-directly-preceding-reader-conditional () - "Search for a directly preceding reader conditional. Return its -position, or nil." - ;;; We search for a preceding reader conditional. Then we check that - ;;; between the reader conditional and the point where we started is - ;;; no other intervening sexp, and we check that the reader - ;;; conditional is at the same nesting level. - (condition-case nil - (let* ((orig-pt (point)) - (reader-conditional-pt - (search-backward-regexp slime-reader-conditionals-regexp - ;; We restrict the search to the - ;; beginning of the /previous/ defun. - (save-excursion - (beginning-of-defun) - (point)) - t))) - (when reader-conditional-pt - (let* ((parser-state - (parse-partial-sexp - (progn (goto-char (+ reader-conditional-pt 2)) - (forward-sexp) ; skip feature expr. - (point)) - orig-pt)) - (paren-depth (car parser-state)) - (last-sexp-pt (cl-caddr parser-state))) - (if (and paren-depth - (not (cl-plusp paren-depth)) ; no '(' in between? - (not last-sexp-pt)) ; no complete sexp in between? - reader-conditional-pt - nil)))) - (scan-error nil))) ; improper feature expression - - -;;; We'll push this onto `font-lock-extend-region-functions'. In past, -;;; we didn't do so which made our reader-conditional font-lock magic -;;; pretty unreliable (it wouldn't highlight all suppressed forms, and -;;; worked quite non-deterministic in general.) -;;; -;;; Cf. _Elisp Manual_, 23.6.10 Multiline Font Lock Constructs. -;;; -;;; We make sure that `font-lock-beg' and `font-lock-end' always point -;;; to the beginning or end of a toplevel form. So we never miss a -;;; reader-conditional, or point in mid of one. -(defvar font-lock-beg) ; shoosh compiler -(defvar font-lock-end) - -(defun slime-extend-region-for-font-lock () - (when slime-highlight-suppressed-forms - (condition-case c - (let (changedp) - (cl-multiple-value-setq (changedp font-lock-beg font-lock-end) - (slime-compute-region-for-font-lock font-lock-beg font-lock-end)) - changedp) - (error - (slime-display-warning - (concat "Caught error when trying to extend the region for fontification.\n" - "The error was: %S\n" - "Further: font-lock-beg=%d, font-lock-end=%d.") - c font-lock-beg font-lock-end))))) - -(defun slime-beginning-of-tlf () - (let ((pos (syntax-ppss-toplevel-pos (slime-current-parser-state)))) - (if pos (goto-char pos)))) - -(defun slime-compute-region-for-font-lock (orig-beg orig-end) - (let ((beg orig-beg) - (end orig-end)) - (goto-char beg) - (inline (slime-beginning-of-tlf)) - (cl-assert (not (cl-plusp (nth 0 (slime-current-parser-state))))) - (setq beg (let ((pt (point))) - (cond ((> (- beg pt) 20000) beg) - ((slime-search-directly-preceding-reader-conditional)) - (t pt)))) - (goto-char end) - (while (search-backward-regexp slime-reader-conditionals-regexp beg t) - (setq end (max end (save-excursion - (ignore-errors (slime-forward-reader-conditional)) - (point))))) - (cl-values (or (/= beg orig-beg) (/= end orig-end)) beg end))) - - -(defun slime-activate-font-lock-magic () - (if (featurep 'xemacs) - (let ((pattern `((slime-search-suppressed-forms - (0 slime-reader-conditional-face t))))) - (dolist (sym '(lisp-font-lock-keywords - lisp-font-lock-keywords-1 - lisp-font-lock-keywords-2)) - (set sym (append (symbol-value sym) pattern)))) - (font-lock-add-keywords - 'lisp-mode - `((slime-search-suppressed-forms 0 ,''slime-reader-conditional-face t))) - - (add-hook 'lisp-mode-hook - #'(lambda () - (add-hook 'font-lock-extend-region-functions - 'slime-extend-region-for-font-lock t t))))) - -(let ((byte-compile-warnings '())) - (mapc (lambda (sym) - (cond ((fboundp sym) - (unless (byte-code-function-p (symbol-function sym)) - (byte-compile sym))) - (t (error "%S is not fbound" sym)))) - '(slime-extend-region-for-font-lock - slime-compute-region-for-font-lock - slime-search-directly-preceding-reader-conditional - slime-search-suppressed-forms - slime-beginning-of-tlf))) - -(cl-defun slime-initialize-lisp-buffer-for-test-suite - (&key (font-lock-magic t) (autodoc t)) - (let ((hook lisp-mode-hook)) - (unwind-protect - (progn - (set (make-local-variable 'slime-highlight-suppressed-forms) - font-lock-magic) - (setq lisp-mode-hook nil) - (lisp-mode) - (slime-mode 1) - (when (boundp 'slime-autodoc-mode) - (if autodoc - (slime-autodoc-mode 1) - (slime-autodoc-mode -1)))) - (setq lisp-mode-hook hook)))) - -(provide 'slime-fontifying-fu) diff --git a/elpa/slime-20200414.1444/contrib/slime-fontifying-fu.elc b/elpa/slime-20200414.1444/contrib/slime-fontifying-fu.elc deleted file mode 100644 index 0f80eef8e9cf80fb6d6c1d8b95cd5aeb3e49ae99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6876 zcmbtY`E%6B6`uU&qo4{%Hr(5cfz<$VsiirLx$HHtMIa#wu$9Wn6>Fp(k7A9a=&+fs z{p0h!?$$`-85?%jWsTH#_v`O{?|Aa+-QJ&Dt=8I;Cr{X3GD*Wo1hNpu?A65cb9OAU zJWOI{_ctBcauOC}=0y=p(juIMKYIn5^UXEc_;DQOY=l`@nTwnS)7YDYJ_`~*FS0N` z%pajO%M0cOfe6@a75;eBe!MV8kYJ8DDVU$cg@?{%F*3JM6Pvpq_TIc<{@BYrzrYqB z$>qH`V0prPFJ?o*qQsk9L?0z*!poviWULsYqwT15A%fraM;rLPe`{-N#&B8)(@z4y z+OA_+c=#RH=JY|2-7GlGLbqAypUo-Wxy!!UaBEj{r5kzc8 ziGRfW$c)0_KC?S(Mj%GVUZw_{xU-Nh+l$OuZ}Uh@Pm(Oi*>{G~He6Tz=l^ltUtIUZ zbvqBXQHgoNSeU2`68a?&Rqv!M@Y#_=o8wT|X1v~5wUjyXe9>XE)y|mvH%{n}g@1(o z;2h^}=ETcl0D5jSUY?7L4)d!9cRFhuJAI424D&SdrZ{jmf$D_0H-t8_;gn?pK+Z@D zstd@Om!mwHh`7i%zg;u@GB1*e83;e}GGXGaJ`~JC(OY_kxGtU)fOC$^QC{6@ySjL_fezr5pgcycUvp_s=6Yu=+ z_jh=o(l{a|y&0vh;P9EcN|s=TQ7~gWjK?Aa-0M5gdaS4f3ev!^tFPWCURf zPsU_fa}f#HykN6kshT<%K~Bz*?=!wY-Z_k(KVDFObK(`K4!pu+3#JEm_)=dA&`%a& z30}{dIE-PJVJm=L1GXmwYmh&I$-wgf}{3M1ZSaJmefC~mJs74gbV)+z4)@L(K^PD-XtFipW+a<8;zT%iX z1K|}VED)^*GefRp7t{5aA+jvVI)rPvbWU3xdj3&esuZ-*0nUi2%qnIAx}g98GoC(U zMw$R&9d+0aYrt3%wJ4g%#>T#Ip2qkI=$1d**gj?(Hof*)4?HbR^y?4~=AtzYf5xVi zH9diH3pkc|1Pmv6!(NmNGSTo;=1kxjqHXHS3a%VlV%Y$kMG&k@y=$aLJ&k3{Y8|*S zq2Iw{QTIMC=r!O+cyWt+^y2(SdfEIh^m6z!dUf5HaL6xN@{iX0r6oT}8%ay~rA}Ro zN~yZd$|ZG+RSPw!;Jr)uk^H~zwy_G-4(qSCR%yi=?&ml#fLR$88uc^M)%T5ZEZNdb zadAa9o#D_>Xe;BRI5`2d7H|uyS6#vwmImggIHME74O4^L2xDL^B*pRqQ>hf@5piH9 zBa;H7&KH0{;8?A4;^o`y-iOUL+yJKhMSH8??MThove^g8E3^jl;JcEv zqA3Ff_#&VUEGi8QtpHQR45oE0O>!ApJYtvtCqGADs>#jS#Ml3?`xuj{EF1F@r zi>?T?sDa@0ds_sA1%?x!3qn2?ljNObwF_KbkYu>;AbRlCxAYoZgE%cW1{;uUZ|+=j zN4q8{+-)|Jj`M@p1zzVsq5pzGbQ<_Z|X_)r9?R2LcUnvg-Gg#9Y^H%*uxgi)r+ z{26D|I!T^c37>xH*=()j=PNEu1;m|E48)2A=9z>gO^2FPDwFb7wOVhw@q$LW@#`{! zy~(y4r@)z>-3yRwse*bFQ=^8|x4-PB=73N{qw0EaAu`}#(m-4#c(1oshLyabwoSjm zERr-5$09OMHJlOZoGV1QjZ#nOe&h#^02gv)723-A4XvOm!cg0TlV$ZTLn�QA$D4!`UE3r#h8NIk>fc;om4Z=wUg$1+UGr2h>Lz-2R|-p>xHJD?;d9ytIzC zJ~^vW^kUtOUsaCX z!f_b^g3eFkB)+I!v@=BwPj0!-M0qp=O=(o-DKlUP&{bPFzl425{-?<-9sDu)5*A!T z${m3TWCZbb{CfuBU<=w(&ii_cM5h;BY^dB^<(4gQ4$^^3qwNNw2^kXADtmy^Via9# z&Ka@2p+%<;S{qZHRRX90;3`5gx_tKGLkr zc>VrwAI*2~_uiU+-TmRso=n8;e){EQv8Fu?8!S00lW+q@{-CXar9Q*4(7{ z1nGbfK_YJHKD=n8;3)2qmXC_2S%vJlm4Qq!^;d`(t=%11X@v6l=BoY*)!Vx}*H>;3 zfjZx})^||jJg36L7Q7|`?-i8nYt*&7@_ZNEY&nmqBx8)aQH29LT0Jr3YOCXpVDfE{ zD+LQS)Yn$@z4{IL2E9L`q7K$kpai%K;i>z8kk|XKWNXVg#F7-T%RZKkYFTuwJCD$f zP`$x78n#nr>sXa2mqDSF5$+_1doauQDczO&oT3sDsF)0qyxFc*R83`&ejs+;uI8*N zjD@bVF5AdKCMRY>rk>JuISoHmCG}4E>+QEHFAq=uu%s+8yQg#_i3LkW$U~jpRJ9V4 z?wWq!n<4VkB3VLHNC@pi&5wYs1S!%w>8wC~PRKSBndT;$E#*vWx*D!!qcW)`-$zP9 X#T|XC$ECZOX324gH0!dIa%b)T0-<-2 diff --git a/elpa/slime-20200414.1444/contrib/slime-fuzzy.el b/elpa/slime-20200414.1444/contrib/slime-fuzzy.el deleted file mode 100644 index b2f22f1f..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-fuzzy.el +++ /dev/null @@ -1,604 +0,0 @@ -(require 'slime) -(require 'slime-repl) -(require 'slime-c-p-c) -(require 'cl-lib) - -(define-slime-contrib slime-fuzzy - "Fuzzy symbol completion." - (:authors "Brian Downing " - "Tobias C. Rittweiler " - "Attila Lendvai ") - (:license "GPL") - (:swank-dependencies swank-fuzzy) - (:on-load - (define-key slime-mode-map "\C-c\M-i" 'slime-fuzzy-complete-symbol) - (when (featurep 'slime-repl) - (define-key slime-repl-mode-map "\C-c\M-i" - 'slime-fuzzy-complete-symbol)))) - -(defcustom slime-fuzzy-completion-in-place t - "When non-NIL the fuzzy symbol completion is done in place as -opposed to moving the point to the completion buffer." - :group 'slime-mode - :type 'boolean) - -(defcustom slime-fuzzy-completion-limit 300 - "Only return and present this many symbols from swank." - :group 'slime-mode - :type 'integer) - -(defcustom slime-fuzzy-completion-time-limit-in-msec 1500 - "Limit the time spent (given in msec) in swank while gathering -completions." - :group 'slime-mode - :type 'integer) - -(defcustom slime-when-complete-filename-expand nil - "Use comint-replace-by-expanded-filename instead of -comint-filename-completion to complete file names" - :group 'slime-mode - :type 'boolean) - - -(defvar slime-fuzzy-target-buffer nil - "The buffer that is the target of the completion activities.") -(defvar slime-fuzzy-saved-window-configuration nil - "The saved window configuration before the fuzzy completion -buffer popped up.") -(defvar slime-fuzzy-start nil - "The beginning of the completion slot in the target buffer. -This is a non-advancing marker.") -(defvar slime-fuzzy-end nil - "The end of the completion slot in the target buffer. -This is an advancing marker.") -(defvar slime-fuzzy-original-text nil - "The original text that was in the completion slot in the -target buffer. This is what is put back if completion is -aborted.") -(defvar slime-fuzzy-text nil - "The text that is currently in the completion slot in the -target buffer. If this ever doesn't match, the target buffer has -been modified and we abort without touching it.") -(defvar slime-fuzzy-first nil - "The position of the first completion in the completions buffer. -The descriptive text and headers are above this.") -(defvar slime-fuzzy-last nil - "The position of the last completion in the completions buffer. -If the time limit has exhausted during generation possible completion -choices inside SWANK, an indication is printed below this.") -(defvar slime-fuzzy-current-completion nil - "The current completion object. If this is the same before and -after point moves in the completions buffer, the text is not -replaced in the target for efficiency.") -(defvar slime-fuzzy-current-completion-overlay nil - "The overlay representing the current completion in the completion -buffer. This is used to hightlight the text.") - -;;;;;;; slime-target-buffer-fuzzy-completions-mode -;; NOTE: this mode has to be able to override key mappings in slime-mode - -(defvar slime-target-buffer-fuzzy-completions-map - (let ((map (make-sparse-keymap))) - (cl-labels ((def (keys command) - (unless (listp keys) - (setq keys (list keys))) - (dolist (key keys) - (define-key map key command)))) - (def `([remap keyboard-quit] - ,(kbd "C-g")) - 'slime-fuzzy-abort) - (def `([remap slime-fuzzy-indent-and-complete-symbol] - [remap slime-indent-and-complete-symbol] - ,(kbd "")) - 'slime-fuzzy-select-or-update-completions) - (def `([remap previous-line] - ,(kbd "")) - 'slime-fuzzy-prev) - (def `([remap next-line] - ,(kbd "")) - 'slime-fuzzy-next) - (def `([remap isearch-forward] - ,(kbd "C-s")) - 'slime-fuzzy-continue-isearch-in-fuzzy-buffer) - ;; some unconditional direct bindings - (def (list (kbd "") (kbd "RET") (kbd "") "(" ")" "[" "]") - 'slime-fuzzy-select-and-process-event-in-target-buffer)) - map) - "Keymap for slime-target-buffer-fuzzy-completions-mode. -This will override the key bindings in the target buffer -temporarily during completion.") - -;; Make sure slime-fuzzy-target-buffer-completions-mode's map is -;; before everything else. -(setf minor-mode-map-alist - (cl-stable-sort minor-mode-map-alist - (lambda (a b) - (eq a 'slime-fuzzy-target-buffer-completions-mode)) - :key #'car)) - -(defun slime-fuzzy-continue-isearch-in-fuzzy-buffer () - (interactive) - (select-window (get-buffer-window (slime-get-fuzzy-buffer))) - (call-interactively 'isearch-forward)) - -(define-minor-mode slime-fuzzy-target-buffer-completions-mode - "This minor mode is intented to override key bindings during -fuzzy completions in the target buffer. Most of the bindings will -do an implicit select in the completion window and let the -keypress be processed in the target buffer." - nil - nil - slime-target-buffer-fuzzy-completions-map) - -(add-to-list 'minor-mode-alist - '(slime-fuzzy-target-buffer-completions-mode - " Fuzzy Target Buffer Completions")) - -(defvar slime-fuzzy-completions-map - (let ((map (make-sparse-keymap))) - (cl-labels ((def (keys command) - (unless (listp keys) - (setq keys (list keys))) - (dolist (key keys) - (define-key map key command)))) - (def `([remap keyboard-quit] - "q" - ,(kbd "C-g")) - 'slime-fuzzy-abort) - (def `([remap previous-line] - "p" - "\M-p" - ,(kbd "")) - 'slime-fuzzy-prev) - (def `([remap next-line] - "n" - "\M-n" - ,(kbd "")) - 'slime-fuzzy-next) - (def "\d" 'scroll-down) - (def `([remap slime-fuzzy-indent-and-complete-symbol] - [remap slime-indent-and-complete-symbol] - ,(kbd "")) - 'slime-fuzzy-select) - (def (kbd "") 'slime-fuzzy-select/mouse) - (def `(,(kbd "RET") - ,(kbd "")) - 'slime-fuzzy-select)) - map) - "Keymap for slime-fuzzy-completions-mode when in the completion buffer.") - -(define-derived-mode slime-fuzzy-completions-mode - fundamental-mode "Fuzzy Completions" - "Major mode for presenting fuzzy completion results. - -When you run `slime-fuzzy-complete-symbol', the symbol token at -point is completed using the Fuzzy Completion algorithm; this -means that the token is taken as a sequence of characters and all -the various possibilities that this sequence could meaningfully -represent are offered as selectable choices, sorted by how well -they deem to be a match for the token. (For instance, the first -choice of completing on \"mvb\" would be \"multiple-value-bind\".) - -Therefore, a new buffer (*Fuzzy Completions*) will pop up that -contains the different completion choices. Simultaneously, a -special minor-mode will be temporarily enabled in the original -buffer where you initiated fuzzy completion (also called the -``target buffer'') in order to navigate through the *Fuzzy -Completions* buffer without leaving. - -With focus in *Fuzzy Completions*: - Type `n' and `p' (`UP', `DOWN') to navigate between completions. - Type `RET' or `TAB' to select the completion near point. - Type `q' to abort. - -With focus in the target buffer: - Type `UP' and `DOWN' to navigate between completions. - Type a character that does not constitute a symbol name - to insert the current choice and then that character (`(', `)', - `SPACE', `RET'.) Use `TAB' to simply insert the current choice. - Use C-g to abort. - -Alternatively, you can click on a completion to select it. - - -Complete listing of keybindings within the target buffer: - -\\\ -\\{slime-target-buffer-fuzzy-completions-map} - -Complete listing of keybindings with *Fuzzy Completions*: - -\\\ -\\{slime-fuzzy-completions-map}" - (use-local-map slime-fuzzy-completions-map) - (set (make-local-variable 'slime-fuzzy-current-completion-overlay) - (make-overlay (point) (point) nil t nil))) - -(defun slime-fuzzy-completions (prefix &optional default-package) - "Get the list of sorted completion objects from completing -`prefix' in `package' from the connected Lisp." - (let ((prefix (cl-etypecase prefix - (symbol (symbol-name prefix)) - (string prefix)))) - (slime-eval `(swank:fuzzy-completions ,prefix - ,(or default-package - (slime-current-package)) - :limit ,slime-fuzzy-completion-limit - :time-limit-in-msec - ,slime-fuzzy-completion-time-limit-in-msec)))) - -(defun slime-fuzzy-selected (prefix completion) - "Tell the connected Lisp that the user selected completion -`completion' as the completion for `prefix'." - (let ((no-properties (copy-sequence prefix))) - (set-text-properties 0 (length no-properties) nil no-properties) - (slime-eval `(swank:fuzzy-completion-selected ,no-properties - ',completion)))) - -(defun slime-fuzzy-indent-and-complete-symbol () - "Indent the current line and perform fuzzy symbol completion. First -indent the line. If indenting doesn't move point, complete the -symbol. If there's no symbol at the point, show the arglist for the -most recently enclosed macro or function." - (interactive) - (let ((pos (point))) - (unless (get-text-property (line-beginning-position) 'slime-repl-prompt) - (lisp-indent-line)) - (when (= pos (point)) - (cond ((save-excursion (re-search-backward "[^() \n\t\r]+\\=" nil t)) - (slime-fuzzy-complete-symbol)) - ((memq (char-before) '(?\t ?\ )) - (slime-echo-arglist)))))) - -(cl-defun slime-fuzzy-complete-symbol () - "Fuzzily completes the abbreviation at point into a symbol." - (interactive) - (when (save-excursion (re-search-backward "\"[^ \t\n]+\\=" nil t)) - (cl-return-from slime-fuzzy-complete-symbol - ;; don't add space after completion - (let ((comint-completion-addsuffix '("/" . ""))) - (if slime-when-complete-filename-expand - (comint-replace-by-expanded-filename) - ;; FIXME: use `comint-filename-completion' when dropping emacs23 - (funcall (if (>= emacs-major-version 24) - 'comint-filename-completion - 'comint-dynamic-complete-as-filename)))))) - (let* ((end (move-marker (make-marker) (slime-symbol-end-pos))) - (beg (move-marker (make-marker) (slime-symbol-start-pos))) - (prefix (buffer-substring-no-properties beg end))) - (cl-destructuring-bind (completion-set interrupted-p) - (slime-fuzzy-completions prefix) - (if (null completion-set) - (progn (slime-minibuffer-respecting-message - "Can't find completion for \"%s\"" prefix) - (ding) - (slime-fuzzy-done)) - (goto-char end) - (cond ((slime-length= completion-set 1) - ;; insert completed string - (insert-and-inherit (caar completion-set)) - (delete-region beg end) - (goto-char (+ beg (length (caar completion-set)))) - (slime-minibuffer-respecting-message "Sole completion") - (slime-fuzzy-done)) - ;; Incomplete - (t - (slime-fuzzy-choices-buffer completion-set interrupted-p - beg end) - (slime-minibuffer-respecting-message - "Complete but not unique"))))))) - - -(defun slime-get-fuzzy-buffer () - (get-buffer-create "*Fuzzy Completions*")) - -(defvar slime-fuzzy-explanation - "For help on how the use this buffer, see `slime-fuzzy-completions-mode'. - -Flags: boundp fboundp generic-function class macro special-operator package -\n" - "The explanation that gets inserted at the beginning of the -*Fuzzy Completions* buffer.") - -(defun slime-fuzzy-insert-completion-choice (completion max-length) - "Inserts the completion object `completion' as a formatted -completion choice into the current buffer, and mark it with the -proper text properties." - (cl-destructuring-bind (symbol-name score chunks classification-string) - completion - (let ((start (point)) - (end)) - (insert symbol-name) - (setq end (point)) - (dolist (chunk chunks) - (put-text-property (+ start (cl-first chunk)) - (+ start (cl-first chunk) - (length (cl-second chunk))) - 'face 'bold)) - (put-text-property start (point) 'mouse-face 'highlight) - (dotimes (i (- max-length (- end start))) - (insert " ")) - (insert (format " %s %s\n" - classification-string - score)) - (put-text-property start (point) 'completion completion)))) - -(defun slime-fuzzy-insert (text) - "Inserts `text' into the target buffer in the completion slot. -If the buffer has been modified in the meantime, abort the -completion process. Otherwise, update all completion variables -so that the new text is present." - (with-current-buffer slime-fuzzy-target-buffer - (cond - ((not (string-equal slime-fuzzy-text - (buffer-substring slime-fuzzy-start - slime-fuzzy-end))) - (slime-fuzzy-done) - (beep) - (message "Target buffer has been modified!")) - (t - (goto-char slime-fuzzy-start) - (delete-region slime-fuzzy-start slime-fuzzy-end) - (insert-and-inherit text) - (setq slime-fuzzy-text text) - (goto-char slime-fuzzy-end))))) - -(defun slime-minibuffer-p (buffer) - (if (featurep 'xemacs) - (eq buffer (window-buffer (minibuffer-window))) - (minibufferp buffer))) - -(defun slime-fuzzy-choices-buffer (completions interrupted-p start end) - "Creates (if neccessary), populates, and pops up the *Fuzzy -Completions* buffer with the completions from `completions' and -the completion slot in the current buffer bounded by `start' and -`end'. This saves the window configuration before popping the -buffer so that it can possibly be restored when the user is -done." - (let ((new-completion-buffer (not slime-fuzzy-target-buffer)) - (connection (slime-connection))) - (when new-completion-buffer - (setq slime-fuzzy-saved-window-configuration - (current-window-configuration))) - (slime-fuzzy-enable-target-buffer-completions-mode) - (setq slime-fuzzy-target-buffer (current-buffer)) - (setq slime-fuzzy-start (move-marker (make-marker) start)) - (setq slime-fuzzy-end (move-marker (make-marker) end)) - (set-marker-insertion-type slime-fuzzy-end t) - (setq slime-fuzzy-original-text (buffer-substring start end)) - (setq slime-fuzzy-text slime-fuzzy-original-text) - (slime-fuzzy-fill-completions-buffer completions interrupted-p) - (pop-to-buffer (slime-get-fuzzy-buffer)) - (slime-fuzzy-next) - (setq slime-buffer-connection connection) - (when new-completion-buffer - ;; Hook to nullify window-config restoration if the user changes - ;; the window configuration himself. - (when (boundp 'window-configuration-change-hook) - (add-hook 'window-configuration-change-hook - 'slime-fuzzy-window-configuration-change)) - (add-hook 'kill-buffer-hook 'slime-fuzzy-abort 'append t) - (set (make-local-variable 'cursor-type) nil) - (setq buffer-quit-function 'slime-fuzzy-abort)) ; M-Esc Esc - (when slime-fuzzy-completion-in-place - ;; switch back to the original buffer - (if (slime-minibuffer-p slime-fuzzy-target-buffer) - (select-window (minibuffer-window)) - (switch-to-buffer-other-window slime-fuzzy-target-buffer))))) - -(defun slime-fuzzy-fill-completions-buffer (completions interrupted-p) - "Erases and fills the completion buffer with the given completions." - (with-current-buffer (slime-get-fuzzy-buffer) - (setq buffer-read-only nil) - (erase-buffer) - (slime-fuzzy-completions-mode) - (insert slime-fuzzy-explanation) - (let ((max-length 12)) - (dolist (completion completions) - (setf max-length (max max-length (length (cl-first completion))))) - - (insert "Completion:") - (dotimes (i (- max-length 10)) (insert " ")) - ;; Flags: Score: - ;; ... ------- -------- - ;; bfgctmsp - (let* ((example-classification-string (cl-fourth (cl-first completions))) - (classification-length (length example-classification-string)) - (spaces (- classification-length (length "Flags:")))) - (insert "Flags:") - (dotimes (i spaces) (insert " ")) - (insert " Score:\n") - (dotimes (i max-length) (insert "-")) - (insert " ") - (dotimes (i classification-length) (insert "-")) - (insert " --------\n") - (setq slime-fuzzy-first (point))) - - (dolist (completion completions) - (setq slime-fuzzy-last (point)) ; will eventually become the last entry - (slime-fuzzy-insert-completion-choice completion max-length)) - - (when interrupted-p - (insert "...\n") - (insert "[Interrupted: time limit exhausted]")) - - (setq buffer-read-only t)) - (setq slime-fuzzy-current-completion - (caar completions)) - (goto-char 0))) - -(defun slime-fuzzy-enable-target-buffer-completions-mode () - "Store the target buffer's local map, so that we can restore it." - (unless slime-fuzzy-target-buffer-completions-mode -; (slime-log-event "Enabling target buffer completions mode") - (slime-fuzzy-target-buffer-completions-mode 1))) - -(defun slime-fuzzy-disable-target-buffer-completions-mode () - "Restores the target buffer's local map when completion is finished." - (when slime-fuzzy-target-buffer-completions-mode -; (slime-log-event "Disabling target buffer completions mode") - (slime-fuzzy-target-buffer-completions-mode 0))) - -(defun slime-fuzzy-insert-from-point () - "Inserts the completion that is under point in the completions -buffer into the target buffer. If the completion in question had -already been inserted, it does nothing." - (with-current-buffer (slime-get-fuzzy-buffer) - (let ((current-completion (get-text-property (point) 'completion))) - (when (and current-completion - (not (eq slime-fuzzy-current-completion - current-completion))) - (slime-fuzzy-insert - (cl-first (get-text-property (point) 'completion))) - (setq slime-fuzzy-current-completion - current-completion))))) - -(defun slime-fuzzy-post-command-hook () - "The post-command-hook for the *Fuzzy Completions* buffer. -This makes sure the completion slot in the target buffer matches -the completion that point is on in the completions buffer." - (condition-case err - (when slime-fuzzy-target-buffer - (slime-fuzzy-insert-from-point)) - (error - ;; Because this is called on the post-command-hook, we mustn't let - ;; errors propagate. - (message "Error in slime-fuzzy-post-command-hook: %S" err)))) - -(defun slime-fuzzy-next () - "Moves point directly to the next completion in the completions -buffer." - (interactive) - (with-current-buffer (slime-get-fuzzy-buffer) - (let ((point (next-single-char-property-change - (point) 'completion nil slime-fuzzy-last))) - (set-window-point (get-buffer-window (current-buffer)) point) - (goto-char point)) - (slime-fuzzy-highlight-current-completion))) - -(defun slime-fuzzy-prev () - "Moves point directly to the previous completion in the -completions buffer." - (interactive) - (with-current-buffer (slime-get-fuzzy-buffer) - (let ((point (previous-single-char-property-change - (point) - 'completion nil slime-fuzzy-first))) - (set-window-point (get-buffer-window (current-buffer)) point) - (goto-char point)) - (slime-fuzzy-highlight-current-completion))) - -(defun slime-fuzzy-highlight-current-completion () - "Highlights the current completion, -so that the user can see it on the screen." - (let ((pos (point))) - (when (overlayp slime-fuzzy-current-completion-overlay) - (move-overlay slime-fuzzy-current-completion-overlay - (point) (1- (search-forward " "))) - (overlay-put slime-fuzzy-current-completion-overlay - 'face 'secondary-selection)) - (goto-char pos))) - -(defun slime-fuzzy-abort () - "Aborts the completion process, setting the completions slot in -the target buffer back to its original contents." - (interactive) - (when slime-fuzzy-target-buffer - (slime-fuzzy-done))) - -(defun slime-fuzzy-select () - "Selects the current completion, making sure that it is inserted -into the target buffer. This tells the connected Lisp what completion -was selected." - (interactive) - (when slime-fuzzy-target-buffer - (with-current-buffer (slime-get-fuzzy-buffer) - (let ((completion (get-text-property (point) 'completion))) - (when completion - (slime-fuzzy-insert (cl-first completion)) - (slime-fuzzy-selected slime-fuzzy-original-text - completion) - (slime-fuzzy-done)))))) - -(defun slime-fuzzy-select-or-update-completions () - "If there were no changes since the last time fuzzy completion was started -this function will select the current completion. -Otherwise refreshes the completion list based on the changes made." - (interactive) -; (slime-log-event "Selecting or updating completions") - (if (string-equal slime-fuzzy-original-text - (buffer-substring slime-fuzzy-start - slime-fuzzy-end)) - (slime-fuzzy-select) - (slime-fuzzy-complete-symbol))) - -(defun slime-fuzzy-process-event-in-completions-buffer () - "Simply processes the event in the target buffer" - (interactive) - (with-current-buffer (slime-get-fuzzy-buffer) - (push last-input-event unread-command-events))) - -(defun slime-fuzzy-select-and-process-event-in-target-buffer () - "Selects the current completion, making sure that it is inserted -into the target buffer and processes the event in the target buffer." - (interactive) -; (slime-log-event "Selecting and processing event in target buffer") - (when slime-fuzzy-target-buffer - (let ((buff slime-fuzzy-target-buffer)) - (slime-fuzzy-select) - (with-current-buffer buff - (slime-fuzzy-disable-target-buffer-completions-mode) - (push last-input-event unread-command-events))))) - -(defun slime-fuzzy-select/mouse (event) - "Handle a mouse-2 click on a completion choice as if point were -on the completion choice and the slime-fuzzy-select command was -run." - (interactive "e") - (with-current-buffer (window-buffer (posn-window (event-end event))) - (save-excursion - (goto-char (posn-point (event-end event))) - (when (get-text-property (point) 'mouse-face) - (slime-fuzzy-insert-from-point) - (slime-fuzzy-select))))) - -(defun slime-fuzzy-done () - "Cleans up after the completion process. This removes all hooks, -and attempts to restore the window configuration. If this fails, -it just burys the completions buffer and leaves the window -configuration alone." - (when slime-fuzzy-target-buffer - (set-buffer slime-fuzzy-target-buffer) - (slime-fuzzy-disable-target-buffer-completions-mode) - (if (slime-fuzzy-maybe-restore-window-configuration) - (bury-buffer (slime-get-fuzzy-buffer)) - ;; We couldn't restore the windows, so just bury the fuzzy - ;; completions buffer and let something else fill it in. - (pop-to-buffer (slime-get-fuzzy-buffer)) - (bury-buffer)) - (if (slime-minibuffer-p slime-fuzzy-target-buffer) - (select-window (minibuffer-window)) - (pop-to-buffer slime-fuzzy-target-buffer)) - (goto-char slime-fuzzy-end) - (setq slime-fuzzy-target-buffer nil) - (remove-hook 'window-configuration-change-hook - 'slime-fuzzy-window-configuration-change))) - -(defun slime-fuzzy-maybe-restore-window-configuration () - "Restores the saved window configuration if it has not been -nullified." - (when (boundp 'window-configuration-change-hook) - (remove-hook 'window-configuration-change-hook - 'slime-fuzzy-window-configuration-change)) - (if (not slime-fuzzy-saved-window-configuration) - nil - (set-window-configuration slime-fuzzy-saved-window-configuration) - (setq slime-fuzzy-saved-window-configuration nil) - t)) - -(defun slime-fuzzy-window-configuration-change () - "Called on window-configuration-change-hook. Since the window -configuration was changed, we nullify our saved configuration." - (setq slime-fuzzy-saved-window-configuration nil)) - -(provide 'slime-fuzzy) diff --git a/elpa/slime-20200414.1444/contrib/slime-fuzzy.elc b/elpa/slime-20200414.1444/contrib/slime-fuzzy.elc deleted file mode 100644 index 7ee4387995c7b8b0febbac41074129e50aa6002e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24742 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") - (:license "GPL") - (:on-load (add-hook 'slime-mode-hook 'slime-activate-highlight-edits)) - (:on-unload (remove-hook 'slime-mode-hook 'slime-activate-highlight-edits))) - -(defun slime-activate-highlight-edits () - (slime-highlight-edits-mode 1)) - -(defface slime-highlight-edits-face - `((((class color) (background light)) - (:background "lightgray")) - (((class color) (background dark)) - (:background "dimgray")) - (t (:background "yellow"))) - "Face for displaying edit but not compiled code." - :group 'slime-mode-faces) - -(define-minor-mode slime-highlight-edits-mode - "Minor mode to highlight not-yet-compiled code." nil) - -(add-hook 'slime-highlight-edits-mode-on-hook - 'slime-highlight-edits-init-buffer) - -(add-hook 'slime-highlight-edits-mode-off-hook - 'slime-highlight-edits-reset-buffer) - -(defun slime-highlight-edits-init-buffer () - (make-local-variable 'after-change-functions) - (add-to-list 'after-change-functions - 'slime-highlight-edits) - (add-to-list 'slime-before-compile-functions - 'slime-highlight-edits-compile-hook)) - -(defun slime-highlight-edits-reset-buffer () - (setq after-change-functions - (remove 'slime-highlight-edits after-change-functions)) - (slime-remove-edits (point-min) (point-max))) - -;; FIXME: what's the LEN arg for? -(defun slime-highlight-edits (beg end &optional len) - (save-match-data - (when (and (slime-connected-p) - (not (slime-inside-comment-p)) - (not (slime-only-whitespace-p beg end))) - (let ((overlay (make-overlay beg end))) - (overlay-put overlay 'face 'slime-highlight-edits-face) - (overlay-put overlay 'slime-edit t))))) - -(defun slime-remove-edits (start end) - "Delete the existing Slime edit hilights in the current buffer." - (save-excursion - (goto-char start) - (while (< (point) end) - (dolist (o (overlays-at (point))) - (when (overlay-get o 'slime-edit) - (delete-overlay o))) - (goto-char (next-overlay-change (point)))))) - -(defun slime-highlight-edits-compile-hook (start end) - (when slime-highlight-edits-mode - (let ((start (save-excursion (goto-char start) - (skip-chars-backward " \t\n\r") - (point))) - (end (save-excursion (goto-char end) - (skip-chars-forward " \t\n\r") - (point)))) - (slime-remove-edits start end)))) - -(defun slime-only-whitespace-p (beg end) - "Contains the region from BEG to END only whitespace?" - (save-excursion - (goto-char beg) - (skip-chars-forward " \n\t\r" end) - (<= end (point)))) - -(provide 'slime-highlight-edits) diff --git a/elpa/slime-20200414.1444/contrib/slime-highlight-edits.elc b/elpa/slime-20200414.1444/contrib/slime-highlight-edits.elc deleted file mode 100644 index 95d4072ec6dc1d5c98608e34716141e25e637d8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4654 zcmbtYYmeK;71f7)*p-o@Xo|K;faaR2V=)K?k(9K4H1($THVKd#1>7_RtOa&Nj--Lf zp*lnDTKV-ocSvd}St~4%1tgI(!1C0xR3=k*qcmOQ zBC&KWja7xFXflZ1%#A9SB(jW(RjG3IizqQ|2VFP$@1?Rd$1b$C(o(w7B3B8eMPf^% z^um6PSz}8QX)06No)SJCL{C51BQ3CpE=o!YT?#B-m-FBWMs)D)o0mWQK*>@Vk(4m; zYj?cRDcOP&p=l;5E5yzrwJVmSFqx8u$|V*?adj?2@T>mVfM5I9?RNXKO(}zN?3aA76ePRSZ4T? zflO6t1Ep0-y|-Frx99NoQ?GScyfZSw-58$fyVwKQ*trNxrZ&jVun1&<=%c6K! z59e^IeUHqkYXNWfY`diR@*WFnPG6C<&8aG!<~lS~*H%ta#aLUc9P#~;>O3)0961CwVWdABgd8qT=_ z@G!A-x6-a?PnZy>W2(ep})fT;k*c2|kuu z%)sk|?oU>N^CS+)bI$eE-3fS1C3qD4xZp>y$+a+ww;6olxCOU|5gNEt*{*)?FEpTV zG;HeuL7Cf76-j7r2N%>2UF$KE(Ige}2~#@Kp1n zKVvS8c-0qt6*m+bf_lO+gFSx5kB^8i!XmjJm;(E z0f-_T`aZ5>>;n4WlerD_!f$%dfcG-UrL_X-f+xpPQ^h=48zc4YLuIj8plh#;oU8YN zUgy%N1o_I=l7?i~+7b61tmJauX7+7{>Sn{?4gl9yGdR3tKCjkrLy;-y3%%X3ip(~_ ziiF;f$Eu+=AGO0c@~H9MJ5mXctSf^@)+0}9e4!9MuE<1I4rEHpV7*Gwk}he~;P-4e z0xM(+qNNWIHi4@n#le1D1<&{Eu64XNDhE*@D2m!hmaR9(Y z)quB6WH@AejsM_4bp~XFkE;I7-3Fj+!;wcEB)9$h?)neV?T(xzfflRkxTMKF)KvT2Jy{5ZIr+&thVi&1 zIH<*aedTE0QOuU?D+B~pGYMENx;F+FtFj1OWgYaQ_J1akBo;f4<69dXd}zClGkQ-Y z*^X9AtGL=bnR>rvpJlqO8i(i){i&qo;iT20wfb}l{C>8HgDWF~7HmgkPZL@-L zVT6}W$u}cVNlctiUta~S<{Xpw>$S*aeOldY-3As8vC6G=a43NKhyX=b9hCqVlC?hSH%y$<<*~H_2~DV zuP_l_J#-smB>Jf1sQ2(rCZ3pI3Qv_MD;B>?4ShhM5oTV)2shBIc") - (:license "GPL") - (:swank-dependencies swank-hyperdoc) - (:on-load - (setq slime-documentation-lookup-function 'slime-hyperdoc-lookup)) - (:on-unload - (setq slime-documentation-lookup-function - slime-old-documentation-lookup-function))) - -;;; TODO: `url-http-file-exists-p' is slow, make it optional behaviour. - -(defun slime-hyperdoc-lookup-rpc (symbol-name) - (slime-eval-async `(swank:hyperdoc ,symbol-name) - (lexical-let ((symbol-name symbol-name)) - #'(lambda (result) - (slime-log-event result) - (cl-loop with foundp = nil - for (doc-type . url) in result do - (when (and url (stringp url) - (let ((url-show-status nil)) - (url-http-file-exists-p url))) - (message "Visiting documentation for %s `%s'..." - (substring (symbol-name doc-type) 1) - symbol-name) - (browse-url url) - (setq foundp t)) - finally - (unless foundp - (error "Could not find documentation for `%s'." - symbol-name))))))) - -(defun slime-hyperdoc-lookup (symbol-name) - (interactive (list (slime-read-symbol-name "Symbol: "))) - (if (memq :hyperdoc (slime-lisp-features)) - (slime-hyperdoc-lookup-rpc symbol-name) - (slime-hyperspec-lookup symbol-name))) - -(provide 'slime-hyperdoc) diff --git a/elpa/slime-20200414.1444/contrib/slime-hyperdoc.elc b/elpa/slime-20200414.1444/contrib/slime-hyperdoc.elc deleted file mode 100644 index e8cf2f541251ba47a6a63917f7a3b332099bed44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2185 zcmb_dZExE)5cWsc#)f4ZFtl5Ni-fio5E_=`I8EGj4ZO7I5MVDY_9ZqjTB2hjl&F%F zJ@41=NJ)>%pwvu5y2)wA6G&yEjpF&GKEP9@4bU`Y zDQvBT$NlK|j*e8Kj$9f@WNs)5mu5j;;!aLZKTO`ghh#|=O$@qt;LOuJ1uY?=Im{Ud zNpBdbL(#yf5}YY8OB9Ua$}U3iSwHK*=l(jKPH(<3j3hE;;7#Mf07tk#jY9ijN3^?$ zaWOdZ;6kxaC07iz;2C1C1X&tWz+B0-W(3zWh=NWpWs4P6l@yU8C775pV+gKIA`wzv zl?7Rpd1BYK+=DWeQYtvr@WNRq%T2))ULri_2K#${{wNzbd@aX9^&9AmD1@-aP#VX<%#IuJ2DRWDuCY1KxHW2GR z2IEpt8U9~Dy%SaK;62p1;Yx+?A?}TE98F`(nh;SAqvvhE_OmEWje>nuiqG{eP(ZOn zDtt(mOUOhgeC?0ViuIkzO4z#rV0HNzUA;FU?#n}uR*&W-M;?6ns_ z&wKaVxfjeJtQmVhxoWN|Ouv88)0=EA1;J{=0!OwO0T{M_#@WGPA5Hk!PEXqBmVLo( zfDoh@#lztvJ0HG13$8PJtsMODNB@M7M35bmgn%F6{;I}|t*9VWZ}J2j|4te-FtJyx zz6l<=slx+7vw2FP_gpb7k6k_9u?p`K_?8j*FUHo#0`O>8@RotU?Qy-2V zx1YEmG3f7qnC2&#|M+cdn!m9yd}F6moQKi3U3>CVt2?g#?WL!P!JxYzG&>cEEJoAC zzD3Cj{rctJFUTrKvcqm|HyrIv^HZz+YrGtN(Rze`!{1wY2?-eu@J{vG4=U&C@?|4{ zg)H;50DstEjKvDE#qwo42r*b#Ty4`!xh5KmR@rb@$VobIjArnul!omlb_T}}R-TIG_cGj-Q+RDN)J1d$vCX`F^vHYng>7Lsf@>01 zFH~@irJf;($e&v!py>qmb?v-oU9hA+!hTYf1XN?7R|zRb(_K!3_rX1#6Yzq-##t!2 M;@H`4b&8<#FOU$bqyPW_ diff --git a/elpa/slime-20200414.1444/contrib/slime-indentation.el b/elpa/slime-20200414.1444/contrib/slime-indentation.el deleted file mode 100644 index 8e323e05..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-indentation.el +++ /dev/null @@ -1,31 +0,0 @@ -(require 'slime) -(require 'slime-cl-indent) -(require 'cl-lib) - -(define-slime-contrib slime-indentation - "Contrib interfacing `slime-cl-indent' and SLIME." - (:swank-dependencies swank-indentation) - (:on-load - (setq common-lisp-current-package-function 'slime-current-package))) - -(defun slime-update-system-indentation (symbol indent packages) - (let ((list (gethash symbol common-lisp-system-indentation)) - (ok nil)) - (if (not list) - (puthash symbol (list (cons indent packages)) - common-lisp-system-indentation) - (dolist (spec list) - (cond ((equal (car spec) indent) - (dolist (p packages) - (unless (member p (cdr spec)) - (push p (cdr spec)))) - (setf ok t)) - (t - (setf (cdr spec) - (cl-set-difference (cdr spec) packages :test 'equal))))) - (unless ok - (puthash symbol (cons (cons indent packages) - list) - common-lisp-system-indentation))))) - -(provide 'slime-indentation) diff --git a/elpa/slime-20200414.1444/contrib/slime-indentation.elc b/elpa/slime-20200414.1444/contrib/slime-indentation.elc deleted file mode 100644 index d5f889a25fed707c04efcf006caa0d9a91e08ffc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1513 zcmbtUT~FIE6wM<9HLyJ}X_L?$owgQX)Fh=0s%b#Q1JYim?P;XaT*qlG5<80>Q1|P1 z?FQ(e(;kTA)*r|B`rcl znE}mnP^A%t_)QHS>jU2%exC^q8Cro_a}DWS(n2su71O2?a;o?7w9*D>n(`Fxy@baH z(eV=-sX`l48DL5pis0I0c?oPrE6NOpxbNIknSxfpsDufJT+zRrG^uFd zw8{mqz|0UB#S6bk!LvRaz;i#}_dAoh;e@G_!)_AydN{(jNfg?N9ntb4#zpUF7p^M) zs}>apor|LRB`haGrd%R@ImyLj3{ltbq&%a!pc+0nYy)v3;#?SLUrCWW-=TGfBTjak z0PId5$Kn0X08hfLCJLsC0=3D7E(xov3VoB3vTHi!B&#K}l>!AV8Q7JrA?s=p$6W>; zeM{x_a#-C4@yOyB;_-j-siiG}rHmY#E-TE)5%)Nn#_9?Y+%-$af&xp-A&vo#qa=3v z99lBoueBT7Wo_<4$NH_rL^sQYERJ)iI8zl?trZSscQ{AOzlm77zL4yxl8em85U!HE zE>ns%rsvx5Vwq`Vs-x${MCI6-u5udnbk`NcU~L_R$9!MgMBiYV{cX?YzLsRI^U=CZ zJhG+YZCKP!%ffa7+>Pg65S-fOcI!0Bk|;)8FaGJZ9B}gi_~Rb98MMw2h@|%VU%g;q zY%ACdw$9Fzs2^HK-5@{=TD4C418)zb318woD(`N*z^w>Pp{EeV3;XX@Uk1D^KjT%a zV(%fXjq~;P9&Xzb3;;*WgI((aX2v? wZ(~POY>tvMAS6}RBEd&6Cj?4pho9OfH_(pk-x!W;CzO@C5%_F8ZS1c92O)jI!T, R. Mattes ") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-listener-hooks)) - -(provide 'slime-listener-hooks) diff --git a/elpa/slime-20200414.1444/contrib/slime-listener-hooks.elc b/elpa/slime-20200414.1444/contrib/slime-listener-hooks.elc deleted file mode 100644 index 4fe6b4d3c488b7f23492869d25d28845904a178d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1082 zcmbtSO>5gg5cRR>5A-@!ptZpgmeeK<4k00g5=fz>y~RGPcE|CM)vmg`N=SZvXC*gv zTDLt!Fi7*Ed2im#{QUCl^=LFo=JPq6*`_6ps&~l1c_XBUJ9M6`fpR~u`pi9rH3+T2 zwt*UY6oJz|Px|DyHF;QZ7w9~CP!C2lBtco}gCld}r<`>@fKUn*JfRead3pFp4`sQB zu>qttL2z*wR@q06nC$fH*~JCOwQxcPra0~4g;C%wNMWEx&{jMH*^J@=h0}x%!kP=q zYQSX)Ui3r)FMX0E8P^X1Gienp$rFKr+t}X=bNd_WWC_*s|J*tgm-#n#|K>9M`x9t~y#0{XY#1#L zT+KeP?Xw*$s;GQXu$6CL?F~v4u{18C2X4EtnKYiMquOuW=lX&}X&v8ZToEt0FWnYx z!p<&*c6J-KwR4Xft;Xr8=JUSl0x!8ncLQ)FIN~yW(sWI&F*g{Fr*M_SXTe1tj$Cu% ekyK`lCWE=c -;; Jon Oddie " - "Jon Oddie ") - (:license "GPL") - (:swank-dependencies swank-macrostep) - (:on-load - (easy-menu-add-item slime-mode-map '(menu-bar SLIME Debugging) - ["Macro stepper..." macrostep-expand (slime-connected-p)] - "Create Trace Buffer") - (add-hook 'slime-mode-hook #'macrostep-slime-mode-hook) - (define-key slime-mode-map (kbd "C-c M-e") #'macrostep-expand) - (eval-after-load 'slime-repl - '(progn - (add-hook 'slime-repl-mode-hook #'macrostep-slime-mode-hook) - (define-key slime-repl-mode-map (kbd "C-c M-e") #'macrostep-expand))))) - -(defun macrostep-slime-mode-hook () - (setq macrostep-sexp-at-point-function #'macrostep-slime-sexp-at-point) - (setq macrostep-environment-at-point-function #'macrostep-slime-context) - (setq macrostep-expand-1-function #'macrostep-slime-expand-1) - (setq macrostep-print-function #'macrostep-slime-insert) - (setq macrostep-macro-form-p-function #'macrostep-slime-macro-form-p)) - -(defun macrostep-slime-sexp-at-point (&rest _ignore) - (slime-sexp-at-point)) - -(defun macrostep-slime-context () - (let (defun-start defun-end) - (save-excursion - (while - (condition-case nil - (progn (backward-up-list) t) - (scan-error nil))) - (setq defun-start (point)) - (setq defun-end (scan-sexps (point) 1))) - (list (buffer-substring-no-properties - defun-start (point)) - (buffer-substring-no-properties - (scan-sexps (point) 1) defun-end)))) - -(defun macrostep-slime-expand-1 (string context) - (slime-dcase - (slime-eval - `(swank-macrostep:macrostep-expand-1 - ,string ,macrostep-expand-compiler-macros ',context)) - ((:error error-message) - (error "%s" error-message)) - ((:ok expansion positions) - (list expansion positions)))) - -(defun macrostep-slime-insert (result _ignore) - "Insert RESULT at point, indenting to match the current column." - (cl-destructuring-bind (expansion positions) result - (let ((start (point)) - (column-offset (current-column))) - (insert expansion) - (macrostep-slime--propertize-macros start positions) - (indent-rigidly start (point) column-offset)))) - -(defun macrostep-slime--propertize-macros (start-offset positions) - "Put text properties on macro forms." - (dolist (position positions) - (cl-destructuring-bind (operator type start) - position - (let ((open-paren-position - (+ start-offset start))) - (put-text-property open-paren-position - (1+ open-paren-position) - 'macrostep-macro-start - t) - ;; this assumes that the operator starts right next to the - ;; opening parenthesis. We could probably be more robust. - (let ((op-start (1+ open-paren-position))) - (put-text-property op-start - (+ op-start (length operator)) - 'font-lock-face - (if (eq type :macro) - 'macrostep-macro-face - 'macrostep-compiler-macro-face))))))) - -(defun macrostep-slime-macro-form-p (string context) - (slime-dcase - (slime-eval - `(swank-macrostep:macro-form-p - ,string ,macrostep-expand-compiler-macros ',context)) - ((:error error-message) - (error "%s" error-message)) - ((:ok result) - result))) - - - -(provide 'slime-macrostep) diff --git a/elpa/slime-20200414.1444/contrib/slime-macrostep.elc b/elpa/slime-20200414.1444/contrib/slime-macrostep.elc deleted file mode 100644 index 1d072d0b4bb7aeae425d7708161438f2541c0b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4416 zcmb_fYjfMy5#^V5Bx=lwtcRV%R=1!X6HP8n0DQ=@(@M2nk2}gFt>w;i1WpAKmlPrp zfbo!`{HOkk{;{6D0Qgjte2`{9UEIgs-Lq#Oc=`7D^@B>KQhoXICA|(Ok>^WSy?6n= zojAjUE@hl}VL)cLX{nVfFFhy6_bH50Z{q#zq*zXxRke6>?j>UcpySvnH? z6oi2|`tbVwdm5fQu`^5|_8WD?30z7-8ahD`rZkY`hmI><@`5xhbTCZ{W0FqndopfT z8+@cO2(!SA=$T|SMWLo%CH`x?qJ|U85iKlI!w}T)WiW;X3oE*=(_fCt!$}%@!C3e* zNutGlq?wjhZj*5gt+cbJ$uqig5?Gw$Mv!9Jslr&pL`;(!Txra3jIPzQ)WrwH~$LmFklkU7XY zPJG;rRV`Z|RL3WaBZMuG6XZ9Ro&; zSOm5;o7xOQA%BV#`SLr#@j!ygu88zLX|H1mPtytLE$Oe>XvALUJI}-LqEK_fW~lcW zzHLD*3UpOPsOK{Xop@{rj{ncjgbntY6x}r>p zVdM*?Ap^anc`VDtyHX##>-VYCzmXwY zd-ub!2ErQV0`k91$Qk&Z&j3|-lkvI_pjun_F%Zkfc0r^$A&3>>q#_ED$pr^27m9ff z2bW$P1_;IU_I)bmgmIIM2$}ju;YtsIOgs_MO$T$(lX)HIRLfV{m-44{Wj;>=!dO{A zxs&ng{&`*cWG?c34lqvFVo{~~Y2&L{CMo^L8wX)5^}Hz1Lf9@Gfm?6CptNe{RFfU} z@N@jC;4n5T@NXM;s8rr*;WBflqFyn2h*7KkyUH1}pnJwtu(i*0X2bd!lD5kE(}gu# z`_r33TjaGY5E8{ZA0?>+v^a$~5|n?T3aU;6XLxbt#IDF9;d`(h5y;DIW8}^qsNNt zBmCyI$vUXqmsylQNNh2gg=^oJ24`{a9&`yYKXXIJ z&1r$7h`q7r`qv0yYSf=llg#~2S65E3dh`QIvC7A@V5hR6aL+wSZb$ltdsPZR5-RPQ z`W~r(d!#NWMdJ(L)frUm0FiANKpzQ#z0y-&c~sfpnWL@JD|L=dMxMKr?go41(cG5D z8;5(FwfnVA+uq~yY1VMkFitR3y|HSRYg;FK+iDSol@r7}+s13>9)7ytLLciR-_pa# z{1--MOC4+e-VToVz zsUpz&b)TbU66~iE@9Vibsr)T+`lN6ginkvQFT{vj<~&oZ>{e?t5-ldG{A4ar{g$qT z>Vb&x5s2T?USuw{2a#P6%re^@CfMB9&+Mi=Ky#JzP6A!^9o3Ajg_^N-Q_a{?Nu61c z*Np9=W;pEmg__YXYR1k?=szm89VPVNyn9xNc37y+v{7PMvUw-f;YDk%I_xi0hZnzE d9g0TnuIj>FRfW6)G>~sDJ$#QZe;Di4{{z)kT;l)$ diff --git a/elpa/slime-20200414.1444/contrib/slime-mdot-fu.el b/elpa/slime-20200414.1444/contrib/slime-mdot-fu.el deleted file mode 100644 index ed2e96ae..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-mdot-fu.el +++ /dev/null @@ -1,31 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -(define-slime-contrib slime-mdot-fu - "Making M-. work on local functions." - (:authors "Tobias C. Rittweiler ") - (:license "GPL") - (:slime-dependencies slime-enclosing-context) - (:on-load - (add-hook 'slime-edit-definition-hooks 'slime-edit-local-definition)) - (:on-unload - (remove-hook 'slime-edit-definition-hooks 'slime-edit-local-definition))) - - -(defun slime-edit-local-definition (name &optional where) - "Like `slime-edit-definition', but tries to find the definition -in a local function binding near point." - (interactive (list (slime-read-symbol-name "Name: "))) - (cl-multiple-value-bind (binding-name point) - (cl-multiple-value-call #'cl-some #'(lambda (binding-name point) - (when (cl-equalp binding-name name) - (cl-values binding-name point))) - (slime-enclosing-bound-names)) - (when (and binding-name point) - (slime-edit-definition-cont - `((,binding-name - ,(make-slime-buffer-location (buffer-name (current-buffer)) point))) - name - where)))) - -(provide 'slime-mdot-fu) diff --git a/elpa/slime-20200414.1444/contrib/slime-mdot-fu.elc b/elpa/slime-20200414.1444/contrib/slime-mdot-fu.elc deleted file mode 100644 index e13ea05b26325ee8367935704e12846a3c88a1fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1773 zcmbtVT~FIE6zwB)KVTm(yQC8|8m^j#GN9W8DriDN)3otME6quq)xxne+bLtee%DS) z+riKzB3X?;;&bjj=iZLaF2>JWtyX(98o^i!BfaoYOLn+huOtlZ7k3%V;S6`M2Ee> z;k`RDg?C70Ayv{+JY3nF9N>y1C*Q{B=a9~*rm01WyB?m(42*)5N=O(8Mb|)@Pz*4t z1!o%U3=a>eFtwyUDF(Bvl!MU=sKHIHIk|AaXBm3|1#GPWtZxxYF!r z#We#Xc)=hQMDV1Z5GGTh4CWp$m6rXoQy7HpZpLydI5n{2zad4YEXgavCAZMIl3XnD z9qc4nAra%s-rdR&XZtwbxfM^Rpk)eqB~#~MUHbFe#2Cqik zUvM1Ye5pX}j1omS2HP8*Mvk(wO}?B3G*1@kYeWalQl+tUoO`@Y@XSAT3&Dx>fNR#5 znlyKVOO-gEjeGEwTYJN>J7{=sQ+=Fk#u9E#FJm8r5W2yqFBbtu9-%=y$5DR|F8DQr z?~Q@heXz3&3C4xtV3V*4`wAAnoiSKirHw6vVjDnvcsDxxK!WG68bD$ffKqX3d#~@8 z19M=18w)+t#fHXU+x0#r@!Fdi(=7C*vL*sx?xX0%@ym^q<5!!g!?4qu$mSOX+H?xx zh|4Wp4o=6~PsA zBX#>A@d<7G4#5O}k>Acw(U|H3Ps$}LN7Vh#nT&m%X zg+*}9NG)hmi8`d") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-media) - (:on-load - (add-hook 'slime-event-hooks 'slime-dispatch-media-event))) - -(defun slime-media-decode-image (image) - (mapcar (lambda (image) - (if (plist-get image :data) - (plist-put image :data (base64-decode-string (plist-get image :data))) - image)) - image)) - -(defun slime-dispatch-media-event (event) - (slime-dcase event - ((:write-image image string) - (let ((img (or (find-image (slime-media-decode-image image)) - (create-image image)))) - (slime-media-insert-image img string)) - t) - ((:popup-buffer bufname string mode) - (slime-with-popup-buffer (bufname :connection t :package t) - (when mode (funcall mode)) - (princ string) - (goto-char (point-min))) - t) - (t nil))) - -(defun slime-media-insert-image (image string &optional bol) - (with-current-buffer (slime-output-buffer) - (let ((marker (slime-repl-output-target-marker :repl-result))) - (goto-char marker) - (slime-propertize-region `(face slime-repl-result-face - rear-nonsticky (face)) - (insert-image image string)) - ;; Move the input-start marker after the REPL result. - (set-marker marker (point))) - (slime-repl-show-maximum-output))) - -(provide 'slime-media) diff --git a/elpa/slime-20200414.1444/contrib/slime-media.elc b/elpa/slime-20200414.1444/contrib/slime-media.elc deleted file mode 100644 index fd61afe699acc411bd2595651b8ed4888ba6a609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2634 zcmbtWS#KLR5Z0rkAbKc@v}tR3EVYS*W{usYj@oVu2X0^l$V1WNsWK31my!tY6_Ojr z{q_BL*p`#HFA=aS&Tu&AH^V)C`TF#$PN&m7K0cx$CZ z0dqT-(rkzq1=Wp_rTmv0Z0m!r+x%-IHLak9S}io?R~0X1MtPlSqhz(#&#|ktA)e;4_}pK&+Z`>hjEJ&27c^L~IL4FgFVe&=?303s z=L7mjiMOp(f^;Fv@Q##digQZG-BB)9ypUYeGq)d=B9}apl{7T`r;^33a;tMO*s{RD zncQ%upk{dHmg5YUyvb3O zXBcwRv?fGiA*Osh0GK_3{tJg9{EbpX|av)^A25N>imKyo;ki%6DyEs)faTZ|o85NVw5+@QdV zSS)b$q2!KBoW%?KqJuT_3=1ouIqdGcob80fd38;JK%%uUbd+<$$`SXtJK zFBj<~1t)!msC?=1&lan*-xh=2#p-TnjV?AH6 zG`5;xH?}EqE~JS|FI%MZx%Z;K2RG8xx$&mc+jDL_#-I0NbH|U~p7oB8s9__z{LclnUoBsFxAF!BF;LP2kH+=lGw-`KrwqPvojocvW*~sAI zH0kvAgE&iiyKYk~{dtDS7;`KvCXHJiJg}y=!cN$apzJhrg`r{c%kapQO~eiv4O0-c zT_-eTSSyToP$>;3prR-%FlK<4h&+14+k%cRmBjq?jFhxoSG=H0Rafh%YRjciQN4<| zTDK);4{jHX!j*(xe`348?({;Y1i#U{EhQ^0lnKXy+oo>XCR(nK~RazUZVu)hqIBlNJ0Vm*ZMGZb8a2yMO4}=LPK6(fqoyM({b%KxMj1T zf7=x=o{(*ff?r)L^o@l4t!X&@AgPD}x3?f?XgI^}t)nQzl!kNgLP%gtNE=j$t30Y( zW1Ci18@ZGQRpQ`P#Z_?3XXk@#1m>*`!Z2u@-*-Yhr|JFI!JTSc&oB68zdh)w{bH#t z9+q{1A%G@`Clp%1Pj(B_dfmk!cZ-G%1B{}$LDiAl0@~ZcrgaN)_DVJ4J+P(f z21t|`|DzSpu0ghSFmh}ZLq+(6(ne+%S6+5Jc8%aYb0_qszJ&4jvTVyx&X9Q6c_#tA J?GKA__dj&#A`t)p diff --git a/elpa/slime-20200414.1444/contrib/slime-mrepl.el b/elpa/slime-20200414.1444/contrib/slime-mrepl.el deleted file mode 100644 index d9ebc38b..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-mrepl.el +++ /dev/null @@ -1,150 +0,0 @@ -;; An experimental implementation of multiple REPLs multiplexed over a -;; single Slime socket. M-x slime-new-mrepl creates a new REPL buffer. -;; -(require 'slime) -(require 'inferior-slime) ; inferior-slime-indent-lime -(require 'cl-lib) - -(define-slime-contrib slime-mrepl - "Multiple REPLs." - (:authors "Helmut Eller ") - (:license "GPL") - (:swank-dependencies swank-mrepl)) - -(require 'comint) - -(defvar slime-mrepl-remote-channel nil) -(defvar slime-mrepl-expect-sexp nil) - -(define-derived-mode slime-mrepl-mode comint-mode "mrepl" - ;; idea lifted from ielm - (unless (get-buffer-process (current-buffer)) - (let* ((process-connection-type nil) - (proc (start-process "mrepl (dummy)" (current-buffer) "hexl"))) - (set-process-query-on-exit-flag proc nil))) - (set (make-local-variable 'comint-use-prompt-regexp) nil) - (set (make-local-variable 'comint-inhibit-carriage-motion) t) - (set (make-local-variable 'comint-input-sender) 'slime-mrepl-input-sender) - (set (make-local-variable 'comint-output-filter-functions) nil) - (set (make-local-variable 'slime-mrepl-expect-sexp) t) - ;;(set (make-local-variable 'comint-get-old-input) 'ielm-get-old-input) - (set-syntax-table lisp-mode-syntax-table) - ) - -(slime-define-keys slime-mrepl-mode-map - ((kbd "RET") 'slime-mrepl-return) - ([return] 'slime-mrepl-return) - ;;((kbd "TAB") 'slime-indent-and-complete-symbol) - ((kbd "C-c C-b") 'slime-interrupt) - ((kbd "C-c C-c") 'slime-interrupt)) - -(defun slime-mrepl-process% () (get-buffer-process (current-buffer))) ;stupid -(defun slime-mrepl-mark () (process-mark (slime-mrepl-process%))) - -(defun slime-mrepl-insert (string) - (comint-output-filter (slime-mrepl-process%) string)) - -(slime-define-channel-type listener) - -(slime-define-channel-method listener :prompt (package prompt) - (with-current-buffer (slime-channel-get self 'buffer) - (slime-mrepl-prompt package prompt))) - -(defun slime-mrepl-prompt (package prompt) - (setf slime-buffer-package package) - (slime-mrepl-insert (format "%s%s> " - (cl-case (current-column) - (0 "") - (t "\n")) - prompt)) - (slime-mrepl-recenter)) - -(defun slime-mrepl-recenter () - (when (get-buffer-window) - (recenter -1))) - -(slime-define-channel-method listener :write-result (result) - (with-current-buffer (slime-channel-get self 'buffer) - (goto-char (point-max)) - (slime-mrepl-insert result))) - -(slime-define-channel-method listener :evaluation-aborted () - (with-current-buffer (slime-channel-get self 'buffer) - (goto-char (point-max)) - (slime-mrepl-insert "; Evaluation aborted\n"))) - -(slime-define-channel-method listener :write-string (string) - (slime-mrepl-write-string self string)) - -(defun slime-mrepl-write-string (self string) - (with-current-buffer (slime-channel-get self 'buffer) - (goto-char (slime-mrepl-mark)) - (slime-mrepl-insert string))) - -(slime-define-channel-method listener :set-read-mode (mode) - (with-current-buffer (slime-channel-get self 'buffer) - (cl-ecase mode - (:read (setq slime-mrepl-expect-sexp nil) - (message "[Listener is waiting for input]")) - (:eval (setq slime-mrepl-expect-sexp t))))) - -(defun slime-mrepl-return (&optional end-of-input) - (interactive "P") - (slime-check-connected) - (goto-char (point-max)) - (cond ((and slime-mrepl-expect-sexp - (or (slime-input-complete-p (slime-mrepl-mark) (point)) - end-of-input)) - (comint-send-input)) - ((not slime-mrepl-expect-sexp) - (unless end-of-input - (insert "\n")) - (comint-send-input t)) - (t - (insert "\n") - (inferior-slime-indent-line) - (message "[input not complete]"))) - (slime-mrepl-recenter)) - -(defun slime-mrepl-input-sender (proc string) - (slime-mrepl-send-string (substring-no-properties string))) - -(defun slime-mrepl-send-string (string &optional command-string) - (slime-mrepl-send `(:process ,string))) - -(defun slime-mrepl-send (msg) - "Send MSG to the remote channel." - (slime-send-to-remote-channel slime-mrepl-remote-channel msg)) - -(defun slime-new-mrepl () - "Create a new listener window." - (interactive) - (let ((channel (slime-make-channel slime-listener-channel-methods))) - (slime-eval-async - `(swank-mrepl:create-mrepl ,(slime-channel.id channel)) - (slime-rcurry - (lambda (result channel) - (cl-destructuring-bind (remote thread-id package prompt) result - (pop-to-buffer (generate-new-buffer (slime-buffer-name :mrepl))) - (slime-mrepl-mode) - (setq slime-current-thread thread-id) - (setq slime-buffer-connection (slime-connection)) - (set (make-local-variable 'slime-mrepl-remote-channel) remote) - (slime-channel-put channel 'buffer (current-buffer)) - (slime-channel-send channel `(:prompt ,package ,prompt)))) - channel)))) - -(defun slime-mrepl () - (let ((conn (slime-connection))) - (cl-find-if (lambda (x) - (with-current-buffer x - (and (eq major-mode 'slime-mrepl-mode) - (eq (slime-current-connection) conn)))) - (buffer-list)))) - -(def-slime-selector-method ?m - "First mrepl-buffer" - (or (slime-mrepl) - (error "No mrepl buffer (%s)" (slime-connection-name)))) - -(provide 'slime-mrepl) diff --git a/elpa/slime-20200414.1444/contrib/slime-mrepl.elc b/elpa/slime-20200414.1444/contrib/slime-mrepl.elc deleted file mode 100644 index 3d206a5dccd8a8bd497de9f8b698cda0f8f43ca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8543 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 F^") - (:license "GPL") - (:swank-dependencies swank-package-fu) - (:on-load - (push `(progn (define-key slime-mode-map "\C-cx" - ',(lookup-key slime-mode-map "\C-cx"))) - slime-package-fu-init-undo-stack) - (define-key slime-mode-map "\C-cx" 'slime-export-symbol-at-point)) - (:on-unload - (while slime-c-p-c-init-undo-stack - (eval (pop slime-c-p-c-init-undo-stack))))) - -(defvar slime-package-file-candidates - (mapcar #'file-name-nondirectory - '("package.lisp" "packages.lisp" "pkgdcl.lisp" - "defpackage.lisp"))) - -(defvar slime-export-symbol-representation-function - #'(lambda (n) (format "#:%s" n))) - -(defvar slime-export-symbol-representation-auto t - "Determine automatically which style is used for symbols, #: or : -If it's mixed or no symbols are exported so far, -use `slime-export-symbol-representation-function'.") - -(defvar slime-export-save-file nil - "Save the package file after each automatic modification") - -(defvar slime-defpackage-regexp - "^(\\(cl:\\|common-lisp:\\|uiop:\\|uiop/package:\\)?\\(defpackage\\|define-package\\)\\>[ \t']*") - -(defun slime-find-package-definition-rpc (package) - (slime-eval `(swank:find-definition-for-thing - (swank::guess-package ,package)))) - -(defun slime-find-package-definition-regexp (package) - (save-excursion - (save-match-data - (goto-char (point-min)) - (cl-block nil - (while (re-search-forward slime-defpackage-regexp nil t) - (when (slime-package-equal package (slime-sexp-at-point)) - (backward-sexp) - (cl-return (make-slime-file-location (buffer-file-name) - (1- (point)))))))))) - -(defun slime-package-equal (designator1 designator2) - ;; First try to be lucky and compare the strings themselves (for the - ;; case when one of the designated packages isn't loaded in the - ;; image.) Then try to do it properly using the inferior Lisp which - ;; will also resolve nicknames for us &c. - (or (cl-equalp (slime-cl-symbol-name designator1) - (slime-cl-symbol-name designator2)) - (slime-eval `(swank:package= ,designator1 ,designator2)))) - -(defun slime-export-symbol (symbol package) - "Unexport `symbol' from `package' in the Lisp image." - (slime-eval `(swank:export-symbol-for-emacs ,symbol ,package))) - -(defun slime-unexport-symbol (symbol package) - "Export `symbol' from `package' in the Lisp image." - (slime-eval `(swank:unexport-symbol-for-emacs ,symbol ,package))) - - -(defun slime-find-possible-package-file (buffer-file-name) - (cl-labels ((file-name-subdirectory (dirname) - (expand-file-name - (concat (file-name-as-directory (slime-to-lisp-filename dirname)) - (file-name-as-directory "..")))) - (try (dirname) - (cl-dolist (package-file-name slime-package-file-candidates) - (let ((f (slime-to-lisp-filename - (concat dirname package-file-name)))) - (when (file-readable-p f) - (cl-return f)))))) - (when buffer-file-name - (let ((buffer-cwd (file-name-directory buffer-file-name))) - (or (try buffer-cwd) - (try (file-name-subdirectory buffer-cwd)) - (try (file-name-subdirectory - (file-name-subdirectory buffer-cwd)))))))) - -(defun slime-goto-package-source-definition (package) - "Tries to find the DEFPACKAGE form of `package'. If found, -places the cursor at the start of the DEFPACKAGE form." - (cl-labels ((try (location) - (when (slime-location-p location) - (slime-goto-source-location location) - t))) - (or (try (slime-find-package-definition-rpc package)) - (try (slime-find-package-definition-regexp package)) - (try (let ((package-file (slime-find-possible-package-file - (buffer-file-name)))) - (when package-file - (with-current-buffer (find-file-noselect package-file t) - (slime-find-package-definition-regexp package))))) - (error "Couldn't find source definition of package: %s" package)))) - -(defun slime-at-expression-p (pattern) - (when (ignore-errors - ;; at a list? - (= (point) (progn (down-list 1) - (backward-up-list 1) - (point)))) - (save-excursion - (down-list 1) - (slime-in-expression-p pattern)))) - -(defun slime-goto-next-export-clause () - ;; Assumes we're inside the beginning of a DEFPACKAGE form. - (let ((point)) - (save-excursion - (cl-block nil - (while (ignore-errors (slime-forward-sexp) t) - (skip-chars-forward " \n\t") - (when (slime-at-expression-p '(:export *)) - (setq point (point)) - (cl-return))))) - (if point - (goto-char point) - (error "No next (:export ...) clause found")))) - -(defun slime-search-exports-in-defpackage (symbol-name) - "Look if `symbol-name' is mentioned in one of the :EXPORT clauses." - ;; Assumes we're inside the beginning of a DEFPACKAGE form. - (cl-labels ((target-symbol-p (symbol) - (string-match-p (format "^\\(\\(#:\\)\\|:\\)?%s$" - (regexp-quote symbol-name)) - symbol))) - (save-excursion - (cl-block nil - (while (ignore-errors (slime-goto-next-export-clause) t) - (let ((clause-end (save-excursion (forward-sexp) (point)))) - (save-excursion - (while (search-forward symbol-name clause-end t) - (when (target-symbol-p (slime-symbol-at-point)) - (cl-return (if (slime-inside-string-p) - ;; Include the following " - (1+ (point)) - (point)))))))))))) - -(defun slime-export-symbols () - "Return a list of symbols inside :export clause of a defpackage." - ;; Assumes we're at the beginning of :export - (cl-labels ((read-sexp () - (ignore-errors - (forward-comment (point-max)) - (buffer-substring-no-properties - (point) (progn (forward-sexp) (point)))))) - (save-excursion - (cl-loop for sexp = (read-sexp) while sexp collect sexp)))) - -(defun slime-defpackage-exports () - "Return a list of symbols inside :export clause of a defpackage." - ;; Assumes we're inside the beginning of a DEFPACKAGE form. - (cl-labels ((normalize-name (name) - (if (string-prefix-p "\"" name) - (read name) - (replace-regexp-in-string "^\\(\\(#:\\)\\|:\\)" - "" name)))) - (save-excursion - (mapcar #'normalize-name - (cl-loop while (ignore-errors (slime-goto-next-export-clause) t) - do (down-list) (forward-sexp) - append (slime-export-symbols) - do (up-list) (backward-sexp)))))) - -(defun slime-symbol-exported-p (name symbols) - (cl-member name symbols :test 'cl-equalp)) - -(defun slime-frob-defpackage-form (current-package do-what symbols) - "Adds/removes `symbol' from the DEFPACKAGE form of `current-package' -depending on the value of `do-what' which can either be `:export', -or `:unexport'. - -Returns t if the symbol was added/removed. Nil if the symbol was -already exported/unexported." - (save-excursion - (slime-goto-package-source-definition current-package) - (down-list 1) ; enter DEFPACKAGE form - (forward-sexp) ; skip DEFPACKAGE symbol - ;; Don't or will fail if (:export ...) is immediately following - ;; (forward-sexp) ; skip package name - (let ((exported-symbols (slime-defpackage-exports)) - (symbols (if (consp symbols) - symbols - (list symbols))) - (number-of-actions 0)) - (cl-ecase do-what - (:export - (slime-add-export) - (dolist (symbol symbols) - (let ((symbol-name (slime-cl-symbol-name symbol))) - (unless (slime-symbol-exported-p symbol-name exported-symbols) - (cl-incf number-of-actions) - (slime-insert-export symbol-name))))) - (:unexport - (dolist (symbol symbols) - (let ((symbol-name (slime-cl-symbol-name symbol))) - (when (slime-symbol-exported-p symbol-name exported-symbols) - (slime-remove-export symbol-name) - (cl-incf number-of-actions)))))) - (when slime-export-save-file - (save-buffer)) - number-of-actions))) - -(defun slime-add-export () - (let (point) - (save-excursion - (while (ignore-errors (slime-goto-next-export-clause) t) - (setq point (point)))) - (cond (point - (goto-char point) - (down-list) - (slime-end-of-list)) - (t - (slime-end-of-list) - (unless (looking-back "^\\s-*") - (newline-and-indent)) - (insert "(:export ") - (save-excursion (insert ")")))))) - -(defun slime-determine-symbol-style () - ;; Assumes we're inside :export - (save-excursion - (slime-beginning-of-list) - (slime-forward-sexp) - (let ((symbols (slime-export-symbols))) - (cond ((null symbols) - slime-export-symbol-representation-function) - ((cl-every (lambda (x) - (string-match "^:" x)) - symbols) - (lambda (n) (format ":%s" n))) - ((cl-every (lambda (x) - (string-match "^#:" x)) - symbols) - (lambda (n) (format "#:%s" n))) - ((cl-every (lambda (x) - (string-prefix-p "\"" x)) - symbols) - (lambda (n) (prin1-to-string (upcase (substring-no-properties n))))) - (t - slime-export-symbol-representation-function))))) - -(defun slime-format-symbol-for-defpackage (symbol-name) - (funcall (if slime-export-symbol-representation-auto - (slime-determine-symbol-style) - slime-export-symbol-representation-function) - symbol-name)) - -(defun slime-insert-export (symbol-name) - ;; Assumes we're at the inside :export after the last symbol - (let ((symbol-name (slime-format-symbol-for-defpackage symbol-name))) - (unless (looking-back "^\\s-*") - (newline-and-indent)) - (insert symbol-name))) - -(defun slime-remove-export (symbol-name) - ;; Assumes we're inside the beginning of a DEFPACKAGE form. - (let ((point)) - (while (setq point (slime-search-exports-in-defpackage symbol-name)) - (save-excursion - (goto-char point) - (backward-sexp) - (delete-region (point) point) - (beginning-of-line) - (when (looking-at "^\\s-*$") - (join-line) - (delete-trailing-whitespace (point) (line-end-position))))))) - -(defun slime-export-symbol-at-point () - "Add the symbol at point to the defpackage source definition -belonging to the current buffer-package. With prefix-arg, remove -the symbol again. Additionally performs an EXPORT/UNEXPORT of the -symbol in the Lisp image if possible." - (interactive) - (let ((package (slime-current-package)) - (symbol (slime-symbol-at-point))) - (unless symbol (error "No symbol at point.")) - (cond (current-prefix-arg - (if (cl-plusp (slime-frob-defpackage-form package :unexport symbol)) - (message "Symbol `%s' no longer exported form `%s'" - symbol package) - (message "Symbol `%s' is not exported from `%s'" - symbol package)) - (slime-unexport-symbol symbol package)) - (t - (if (cl-plusp (slime-frob-defpackage-form package :export symbol)) - (message "Symbol `%s' now exported from `%s'" - symbol package) - (message "Symbol `%s' already exported from `%s'" - symbol package)) - (slime-export-symbol symbol package))))) - -(defun slime-export-class (name) - "Export acessors, constructors, etc. associated with a structure or a class" - (interactive (list (slime-read-from-minibuffer "Export structure named: " - (slime-symbol-at-point)))) - (let* ((package (slime-current-package)) - (symbols (slime-eval `(swank:export-structure ,name ,package)))) - (message "%s symbols exported from `%s'" - (slime-frob-defpackage-form package :export symbols) - package))) - -(defalias 'slime-export-structure 'slime-export-class) - -(provide 'slime-package-fu) - -;; Local Variables: -;; indent-tabs-mode: nil -;; End: diff --git a/elpa/slime-20200414.1444/contrib/slime-package-fu.elc b/elpa/slime-20200414.1444/contrib/slime-package-fu.elc deleted file mode 100644 index e0164da2614aa49a80f8f2c94c1120102e225df8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11011 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" - "Tobias C. Rittweiler ") - (:license "GPL")) - -(defun slime-parse-form-until (limit form-suffix) - "Parses form from point to `limit'." - ;; For performance reasons, this function does not use recursion. - (let ((todo (list (point))) ; stack of positions - (sexps) ; stack of expressions - (cursexp) - (curpos) - (depth 1)) ; This function must be called from the - ; start of the sexp to be parsed. - (while (and (setq curpos (pop todo)) - (progn - (goto-char curpos) - ;; (Here we also move over suppressed - ;; reader-conditionalized code! Important so CL-side - ;; of autodoc won't see that garbage.) - (ignore-errors (slime-forward-cruft)) - (< (point) limit))) - (setq cursexp (pop sexps)) - (cond - ;; End of an sexp? - ((or (looking-at "\\s)") (eolp)) - (cl-decf depth) - (push (nreverse cursexp) (car sexps))) - ;; Start of a new sexp? - ((looking-at "\\s'*@*\\s(") - (let ((subpt (match-end 0))) - (ignore-errors - (forward-sexp) - ;; (In case of error, we're at an incomplete sexp, and - ;; nothing's left todo after it.) - (push (point) todo)) - (push cursexp sexps) - (push subpt todo) ; to descend into new sexp - (push nil sexps) - (cl-incf depth))) - ;; In mid of an sexp.. - (t - (let ((pt1 (point)) - (pt2 (condition-case e - (progn (forward-sexp) (point)) - (scan-error - (cl-fourth e))))) ; end of sexp - (push (buffer-substring-no-properties pt1 pt2) cursexp) - (push pt2 todo) - (push cursexp sexps))))) - (when sexps - (setf (car sexps) (cl-nreconc form-suffix (car sexps))) - (while (> depth 1) - (push (nreverse (pop sexps)) (car sexps)) - (cl-decf depth)) - (nreverse (car sexps))))) - -(defun slime-compare-char-syntax (get-char-fn syntax &optional unescaped) - "Returns t if the character that `get-char-fn' yields has -characer syntax of `syntax'. If `unescaped' is true, it's ensured -that the character is not escaped." - (let ((char (funcall get-char-fn (point))) - (char-before (funcall get-char-fn (1- (point))))) - (if (and char (eq (char-syntax char) (aref syntax 0))) - (if unescaped - (or (null char-before) - (not (eq (char-syntax char-before) ?\\))) - t) - nil))) - -(defconst slime-cursor-marker 'swank::%cursor-marker%) - -(defun slime-parse-form-upto-point (&optional max-levels) - (save-restriction - ;; Don't parse more than 500 lines before point, so we don't spend - ;; too much time. NB. Make sure to go to beginning of line, and - ;; not possibly anywhere inside comments or strings. - (narrow-to-region (line-beginning-position -500) (point-max)) - (save-excursion - (let ((suffix (list slime-cursor-marker))) - (cond ((slime-compare-char-syntax #'char-after "(" t) - ;; We're at the start of some expression, so make sure - ;; that SWANK::%CURSOR-MARKER% will come after that - ;; expression. If the expression is not balanced, make - ;; still sure that the marker does *not* come directly - ;; after the preceding expression. - (or (ignore-errors (forward-sexp) t) - (push "" suffix))) - ((or (bolp) (slime-compare-char-syntax #'char-before " " t)) - ;; We're after some expression, so we have to make sure - ;; that %CURSOR-MARKER% does *not* come directly after - ;; that expression. - (push "" suffix)) - ((slime-compare-char-syntax #'char-before "(" t) - ;; We're directly after an opening parenthesis, so we - ;; have to make sure that something comes before - ;; %CURSOR-MARKER%. - (push "" suffix)) - (t - ;; We're at a symbol, so make sure we get the whole symbol. - (slime-end-of-symbol))) - (let ((pt (point))) - (ignore-errors (up-list (if max-levels (- max-levels) -5))) - (ignore-errors (down-list)) - (slime-parse-form-until pt suffix)))))) - -(require 'bytecomp) - -(mapc (lambda (sym) - (cond ((fboundp sym) - (unless (byte-code-function-p (symbol-function sym)) - (byte-compile sym))) - (t (error "%S is not fbound" sym)))) - '(slime-parse-form-upto-point - slime-parse-form-until - slime-compare-char-syntax)) - -;;;; Test cases -(defun slime-extract-context () - "Parse the context for the symbol at point. -Nil is returned if there's no symbol at point. Otherwise we detect -the following cases (the . shows the point position): - - (defun n.ame (...) ...) -> (:defun name) - (defun (setf n.ame) (...) ...) -> (:defun (setf name)) - (defmethod n.ame (...) ...) -> (:defmethod name (...)) - (defun ... (...) (labels ((n.ame (...) -> (:labels (:defun ...) name) - (defun ... (...) (flet ((n.ame (...) -> (:flet (:defun ...) name) - (defun ... (...) ... (n.ame ...) ...) -> (:call (:defun ...) name) - (defun ... (...) ... (setf (n.ame ...) -> (:call (:defun ...) (setf name)) - - (defmacro n.ame (...) ...) -> (:defmacro name) - (defsetf n.ame (...) ...) -> (:defsetf name) - (define-setf-expander n.ame (...) ...) -> (:define-setf-expander name) - (define-modify-macro n.ame (...) ...) -> (:define-modify-macro name) - (define-compiler-macro n.ame (...) ...) -> (:define-compiler-macro name) - (defvar n.ame (...) ...) -> (:defvar name) - (defparameter n.ame ...) -> (:defparameter name) - (defconstant n.ame ...) -> (:defconstant name) - (defclass n.ame ...) -> (:defclass name) - (defstruct n.ame ...) -> (:defstruct name) - (defpackage n.ame ...) -> (:defpackage name) -For other contexts we return the symbol at point." - (let ((name (slime-symbol-at-point))) - (if name - (let ((symbol (read name))) - (or (progn ;;ignore-errors - (slime-parse-context symbol)) - symbol))))) - -(defun slime-parse-context (name) - (save-excursion - (cond ((slime-in-expression-p '(defun *)) `(:defun ,name)) - ((slime-in-expression-p '(defmacro *)) `(:defmacro ,name)) - ((slime-in-expression-p '(defgeneric *)) `(:defgeneric ,name)) - ((slime-in-expression-p '(setf *)) - ;;a setf-definition, but which? - (backward-up-list 1) - (slime-parse-context `(setf ,name))) - ((slime-in-expression-p '(defmethod *)) - (unless (looking-at "\\s ") - (forward-sexp 1)) ; skip over the methodname - (let (qualifiers arglist) - (cl-loop for e = (read (current-buffer)) - until (listp e) do (push e qualifiers) - finally (setq arglist e)) - `(:defmethod ,name ,@qualifiers - ,(slime-arglist-specializers arglist)))) - ((and (symbolp name) - (slime-in-expression-p `(,name))) - ;; looks like a regular call - (let ((toplevel (ignore-errors (slime-parse-toplevel-form)))) - (cond ((slime-in-expression-p `(setf (*))) ;a setf-call - (if toplevel - `(:call ,toplevel (setf ,name)) - `(setf ,name))) - ((not toplevel) - name) - ((slime-in-expression-p `(labels ((*)))) - `(:labels ,toplevel ,name)) - ((slime-in-expression-p `(flet ((*)))) - `(:flet ,toplevel ,name)) - (t - `(:call ,toplevel ,name))))) - ((slime-in-expression-p '(define-compiler-macro *)) - `(:define-compiler-macro ,name)) - ((slime-in-expression-p '(define-modify-macro *)) - `(:define-modify-macro ,name)) - ((slime-in-expression-p '(define-setf-expander *)) - `(:define-setf-expander ,name)) - ((slime-in-expression-p '(defsetf *)) - `(:defsetf ,name)) - ((slime-in-expression-p '(defvar *)) `(:defvar ,name)) - ((slime-in-expression-p '(defparameter *)) `(:defparameter ,name)) - ((slime-in-expression-p '(defconstant *)) `(:defconstant ,name)) - ((slime-in-expression-p '(defclass *)) `(:defclass ,name)) - ((slime-in-expression-p '(defpackage *)) `(:defpackage ,name)) - ((slime-in-expression-p '(defstruct *)) - `(:defstruct ,(if (consp name) - (car name) - name))) - (t - name)))) - - -(defun slime-in-expression-p (pattern) - "A helper function to determine the current context. -The pattern can have the form: - pattern ::= () ;matches always - | (*) ;matches inside a list - | ( ) ;matches if the first element in - ; the current list is and - ; if matches. - | (()) ;matches if we are in a nested list." - (save-excursion - (let ((path (reverse (slime-pattern-path pattern)))) - (cl-loop for p in path - always (ignore-errors - (cl-etypecase p - (symbol (slime-beginning-of-list) - (eq (read (current-buffer)) p)) - (number (backward-up-list p) - t))))))) - -(defun slime-pattern-path (pattern) - ;; Compute the path to the * in the pattern to make matching - ;; easier. The path is a list of symbols and numbers. A number - ;; means "(down-list )" and a symbol "(look-at )") - (if (null pattern) - '() - (cl-etypecase (car pattern) - ((member *) '()) - (symbol (cons (car pattern) (slime-pattern-path (cdr pattern)))) - (cons (cons 1 (slime-pattern-path (car pattern))))))) - -(defun slime-beginning-of-list (&optional up) - "Move backward to the beginning of the current expression. -Point is placed before the first expression in the list." - (backward-up-list (or up 1)) - (down-list 1) - (skip-syntax-forward " ")) - -(defun slime-end-of-list (&optional up) - (backward-up-list (or up 1)) - (forward-list 1) - (down-list -1)) - -(defun slime-parse-toplevel-form () - (ignore-errors ; (foo) - (save-excursion - (goto-char (car (slime-region-for-defun-at-point))) - (down-list 1) - (forward-sexp 1) - (slime-parse-context (read (current-buffer)))))) - -(defun slime-arglist-specializers (arglist) - (cond ((or (null arglist) - (member (cl-first arglist) '(&optional &key &rest &aux))) - (list)) - ((consp (cl-first arglist)) - (cons (cl-second (cl-first arglist)) - (slime-arglist-specializers (cl-rest arglist)))) - (t - (cons 't - (slime-arglist-specializers (cl-rest arglist)))))) - -(defun slime-definition-at-point (&optional only-functional) - "Return object corresponding to the definition at point." - (let ((toplevel (slime-parse-toplevel-form))) - (if (or (symbolp toplevel) - (and only-functional - (not (member (car toplevel) - '(:defun :defgeneric :defmethod - :defmacro :define-compiler-macro))))) - (error "Not in a definition") - (slime-dcase toplevel - (((:defun :defgeneric) symbol) - (format "#'%s" symbol)) - (((:defmacro :define-modify-macro) symbol) - (format "(macro-function '%s)" symbol)) - ((:define-compiler-macro symbol) - (format "(compiler-macro-function '%s)" symbol)) - ((:defmethod symbol &rest args) - (declare (ignore args)) - (format "#'%s" symbol)) - (((:defparameter :defvar :defconstant) symbol) - (format "'%s" symbol)) - (((:defclass :defstruct) symbol) - (format "(find-class '%s)" symbol)) - ((:defpackage symbol) - (format "(or (find-package '%s) (error \"Package %s not found\"))" - symbol symbol)) - (t - (error "Not in a definition")))))) - -(defsubst slime-current-parser-state () - ;; `syntax-ppss' does not save match data as it invokes - ;; `beginning-of-defun' implicitly which does not save match - ;; data. This issue has been reported to the Emacs maintainer on - ;; Feb27. - (syntax-ppss)) - -(defun slime-inside-string-p () - (nth 3 (slime-current-parser-state))) - -(defun slime-inside-comment-p () - (nth 4 (slime-current-parser-state))) - -(defun slime-inside-string-or-comment-p () - (let ((state (slime-current-parser-state))) - (or (nth 3 state) (nth 4 state)))) - -;;; The following two functions can be handy when inspecting -;;; source-location while debugging `M-.'. -;;; -(defun slime-current-tlf-number () - "Return the current toplevel number." - (interactive) - (let ((original-pos (car (slime-region-for-defun-at-point))) - (n 0)) - (save-excursion - ;; We use this and no repeated `beginning-of-defun's to get - ;; reader conditionals right. - (goto-char (point-min)) - (while (progn (slime-forward-sexp) - (< (point) original-pos)) - (cl-incf n))) - n)) - -;;; This is similiar to `slime-enclosing-form-paths' in the -;;; `slime-parse' contrib except that this does not do any duck-tape -;;; parsing, and gets reader conditionals right. -(defun slime-current-form-path () - "Returns the path from the beginning of the current toplevel -form to the atom at point, or nil if we're in front of a tlf." - (interactive) - (let ((source-path nil)) - (save-excursion - ;; Moving forward to get reader conditionals right. - (cl-loop for inner-pos = (point) - for outer-pos = (cl-nth-value 1 (slime-current-parser-state)) - while outer-pos do - (goto-char outer-pos) - (unless (eq (char-before) ?#) ; when at #(...) continue. - (forward-char) - (let ((n 0)) - (while (progn (slime-forward-sexp) - (< (point) inner-pos)) - (cl-incf n)) - (push n source-path) - (goto-char outer-pos))))) - source-path)) - -(provide 'slime-parse) diff --git a/elpa/slime-20200414.1444/contrib/slime-parse.elc b/elpa/slime-20200414.1444/contrib/slime-parse.elc deleted file mode 100644 index 5f19580db1ed9c2b6a8d710a66dabf61a3c74f66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10811 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 PUCvvosFc4Z>}>uAIJ6`m diff --git a/elpa/slime-20200414.1444/contrib/slime-presentation-streams.el b/elpa/slime-20200414.1444/contrib/slime-presentation-streams.el deleted file mode 100644 index 786c549c..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-presentation-streams.el +++ /dev/null @@ -1,18 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-presentation-streams - "Streams that allow attaching object identities to portions of - output." - (:authors "Alan Ruttenberg " - "Matthias Koeppe " - "Helmut Eller ") - (:license "GPL") - (:on-load - (add-hook 'slime-connected-hook 'slime-presentation-streams-on-connected)) - (:swank-dependencies swank-presentation-streams)) - -(defun slime-presentation-streams-on-connected () - (slime-eval `(swank:init-presentation-streams))) - -(provide 'slime-presentation-streams) diff --git a/elpa/slime-20200414.1444/contrib/slime-presentation-streams.elc b/elpa/slime-20200414.1444/contrib/slime-presentation-streams.elc deleted file mode 100644 index 4f82b7f59f4ad23b7353907b6b6b3f3cd6e53d21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1307 zcmbtT+iuf95bY!K5AZs;5+qV>#Wu8*R47#xK}C@e@YdvEZBOD=_F{I|smj+gYr82e zrmEDHM%uaTT+W%DE-vRU4-O83>2wNnEo&~YY!$9xAz5KzhsJWPAU%$=)^p8W1xyIg zwd0ciW{%u84qE5Wid$Gy7HBM5C~p*#yns>{))}rg_K3X3I$&jqCG4vtr*V4vPmWSk z4y7FwS~*6+jax_W$)ck3AM=X~C@N-H;i$!_LitNXp!*nxJLvlGHD~OxP!wh z#RY`RY%(E9NYZ7vOcSqp$w=PrE$>J>COPqz$w>%TlGO#Q8&!CEeX6#F=(eMgy=H1V zSbyvZjVi6T{TpITAu)5$IM_K2u@7EBwtDKsjq?2dZ|1>y`tFXDVJyvz&?nb5E&TX#_4G9JdZD=<=rG8xhphfsmOuO)*gdN|H_Z;iqqx;dli}`c#VlUX6!D kzv_ADFu)xX&|&$(e}&;CT|w&Ct2TPaiT&<}4TlDQ0CoeYMF0Q* diff --git a/elpa/slime-20200414.1444/contrib/slime-presentations.el b/elpa/slime-20200414.1444/contrib/slime-presentations.el deleted file mode 100644 index 75bf7d03..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-presentations.el +++ /dev/null @@ -1,872 +0,0 @@ -(require 'slime) -(require 'bridge) -(require 'cl-lib) -(eval-when-compile - (require 'cl)) - -(define-slime-contrib slime-presentations - "Imitate LispM presentations." - (:authors "Alan Ruttenberg " - "Matthias Koeppe ") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-presentations) - (:on-load - (add-hook 'slime-repl-mode-hook - (lambda () - ;; Respect the syntax text properties of presentation. - (set (make-local-variable 'parse-sexp-lookup-properties) t) - (add-hook 'after-change-functions - 'slime-after-change-function 'append t))) - (add-hook 'slime-event-hooks 'slime-dispatch-presentation-event) - (setq slime-write-string-function 'slime-presentation-write) - (add-hook 'slime-connected-hook 'slime-presentations-on-connected) - (add-hook 'slime-repl-return-hooks 'slime-presentation-on-return-pressed) - (add-hook 'slime-repl-current-input-hooks 'slime-presentation-current-input) - (add-hook 'slime-open-stream-hooks 'slime-presentation-on-stream-open) - (add-hook 'slime-repl-clear-buffer-hook 'slime-clear-presentations) - (add-hook 'slime-edit-definition-hooks 'slime-edit-presentation) - (setq sldb-insert-frame-variable-value-function - 'slime-presentation-sldb-insert-frame-variable-value) - (slime-presentation-init-keymaps) - (slime-presentation-add-easy-menu))) - -;; To get presentations in the inspector as well, add this to your -;; init file. -;; -;; (eval-after-load 'slime-presentations -;; '(setq slime-inspector-insert-ispec-function -;; 'slime-presentation-inspector-insert-ispec)) -;; -(defface slime-repl-output-mouseover-face - '((t (:box (:line-width 1 :color "black" :style released-button) - :inherit slime-repl-inputed-output-face))) - "Face for Lisp output in the SLIME REPL, when the mouse hovers over it" - :group 'slime-repl) - -(defface slime-repl-inputed-output-face - '((((class color) (background light)) (:foreground "Red")) - (((class color) (background dark)) (:foreground "light salmon")) - (t (:slant italic))) - "Face for the result of an evaluation in the SLIME REPL." - :group 'slime-repl) - -;; FIXME: This conditional is not right - just used because the code -;; here does not work in XEmacs. -(when (boundp 'text-property-default-nonsticky) - (pushnew '(slime-repl-presentation . t) text-property-default-nonsticky - :test 'equal) - (pushnew '(slime-repl-result-face . t) text-property-default-nonsticky - :test 'equal)) - -(make-variable-buffer-local - (defvar slime-presentation-start-to-point (make-hash-table))) - -(defun slime-mark-presentation-start (id &optional target) - "Mark the beginning of a presentation with the given ID. -TARGET can be nil (regular process output) or :repl-result." - (setf (gethash id slime-presentation-start-to-point) - ;; We use markers because text can also be inserted before this presentation. - ;; (Output arrives while we are writing presentations within REPL results.) - (copy-marker (slime-repl-output-target-marker target) nil))) - -(defun slime-mark-presentation-start-handler (process string) - (if (and string (string-match "<\\([-0-9]+\\)" string)) - (let* ((match (substring string (match-beginning 1) (match-end 1))) - (id (car (read-from-string match)))) - (slime-mark-presentation-start id)))) - -(defun slime-mark-presentation-end (id &optional target) - "Mark the end of a presentation with the given ID. -TARGET can be nil (regular process output) or :repl-result." - (let ((start (gethash id slime-presentation-start-to-point))) - (remhash id slime-presentation-start-to-point) - (when start - (let* ((marker (slime-repl-output-target-marker target)) - (buffer (and marker (marker-buffer marker)))) - (with-current-buffer buffer - (let ((end (marker-position marker))) - (slime-add-presentation-properties start end - id nil))))))) - -(defun slime-mark-presentation-end-handler (process string) - (if (and string (string-match ">\\([-0-9]+\\)" string)) - (let* ((match (substring string (match-beginning 1) (match-end 1))) - (id (car (read-from-string match)))) - (slime-mark-presentation-end id)))) - -(cl-defstruct slime-presentation text id) - -(defvar slime-presentation-syntax-table - (let ((table (copy-syntax-table lisp-mode-syntax-table))) - ;; We give < and > parenthesis syntax, so that #< ... > is treated - ;; as a balanced expression. This allows to use C-M-k, C-M-SPC, - ;; etc. to deal with a whole presentation. (For Lisp mode, this - ;; is not desirable, since we do not wish to get a mismatched - ;; paren highlighted everytime we type < or >.) - (modify-syntax-entry ?< "(>" table) - (modify-syntax-entry ?> ")<" table) - table) - "Syntax table for presentations.") - -(defun slime-add-presentation-properties (start end id result-p) - "Make the text between START and END a presentation with ID. -RESULT-P decides whether a face for a return value or output text is used." - (let* ((text (buffer-substring-no-properties start end)) - (presentation (make-slime-presentation :text text :id id))) - (let ((inhibit-modification-hooks t)) - (add-text-properties start end - `(modification-hooks (slime-after-change-function) - insert-in-front-hooks (slime-after-change-function) - insert-behind-hooks (slime-after-change-function) - syntax-table ,slime-presentation-syntax-table - rear-nonsticky t)) - ;; Use the presentation as the key of a text property - (case (- end start) - (0) - (1 - (add-text-properties start end - `(slime-repl-presentation ,presentation - ,presentation :start-and-end))) - (t - (add-text-properties start (1+ start) - `(slime-repl-presentation ,presentation - ,presentation :start)) - (when (> (- end start) 2) - (add-text-properties (1+ start) (1- end) - `(,presentation :interior))) - (add-text-properties (1- end) end - `(slime-repl-presentation ,presentation - ,presentation :end)))) - ;; Also put an overlay for the face and the mouse-face. This enables - ;; highlighting of nested presentations. However, overlays get lost - ;; when we copy a presentation; their removal is also not undoable. - ;; In these cases the mouse-face text properties need to take over --- - ;; but they do not give nested highlighting. - (slime-ensure-presentation-overlay start end presentation)))) - -(defvar slime-presentation-map (make-sparse-keymap)) - -(defun slime-ensure-presentation-overlay (start end presentation) - (unless (cl-find presentation (overlays-at start) - :key (lambda (overlay) - (overlay-get overlay 'slime-repl-presentation))) - (let ((overlay (make-overlay start end (current-buffer) t nil))) - (overlay-put overlay 'slime-repl-presentation presentation) - (overlay-put overlay 'mouse-face 'slime-repl-output-mouseover-face) - (overlay-put overlay 'help-echo - (if (eq major-mode 'slime-repl-mode) - "mouse-2: copy to input; mouse-3: menu" - "mouse-2: inspect; mouse-3: menu")) - (overlay-put overlay 'face 'slime-repl-inputed-output-face) - (overlay-put overlay 'keymap slime-presentation-map)))) - -(defun slime-remove-presentation-properties (from to presentation) - (let ((inhibit-read-only t)) - (remove-text-properties from to - `(,presentation t syntax-table t rear-nonsticky t)) - (when (eq (get-text-property from 'slime-repl-presentation) presentation) - (remove-text-properties from (1+ from) `(slime-repl-presentation t))) - (when (eq (get-text-property (1- to) 'slime-repl-presentation) presentation) - (remove-text-properties (1- to) to `(slime-repl-presentation t))) - (dolist (overlay (overlays-at from)) - (when (eq (overlay-get overlay 'slime-repl-presentation) presentation) - (delete-overlay overlay))))) - -(defun slime-insert-presentation (string output-id &optional rectangle) - "Insert STRING in current buffer and mark it as a presentation -corresponding to OUTPUT-ID. If RECTANGLE is true, indent multi-line -strings to line up below the current point." - (cl-labels ((insert-it () - (if rectangle - (slime-insert-indented string) - (insert string)))) - (let ((start (point))) - (insert-it) - (slime-add-presentation-properties start (point) output-id t)))) - -(defun slime-presentation-whole-p (presentation start end &optional object) - (let ((object (or object (current-buffer)))) - (string= (etypecase object - (buffer (with-current-buffer object - (buffer-substring-no-properties start end))) - (string (substring-no-properties object start end))) - (slime-presentation-text presentation)))) - -(defun slime-presentations-around-point (point &optional object) - (let ((object (or object (current-buffer)))) - (loop for (key value . rest) on (text-properties-at point object) by 'cddr - when (slime-presentation-p key) - collect key))) - -(defun slime-presentation-start-p (tag) - (memq tag '(:start :start-and-end))) - -(defun slime-presentation-stop-p (tag) - (memq tag '(:end :start-and-end))) - -(cl-defun slime-presentation-start (point presentation - &optional (object (current-buffer))) - "Find start of `presentation' at `point' in `object'. -Return buffer index and whether a start-tag was found." - (let* ((this-presentation (get-text-property point presentation object))) - (while (not (slime-presentation-start-p this-presentation)) - (let ((change-point (previous-single-property-change - point presentation object (point-min)))) - (unless change-point - (return-from slime-presentation-start - (values (etypecase object - (buffer (with-current-buffer object 1)) - (string 0)) - nil))) - (setq this-presentation (get-text-property change-point - presentation object)) - (unless this-presentation - (return-from slime-presentation-start - (values point nil))) - (setq point change-point))) - (values point t))) - -(cl-defun slime-presentation-end (point presentation - &optional (object (current-buffer))) - "Find end of presentation at `point' in `object'. Return buffer -index (after last character of the presentation) and whether an -end-tag was found." - (let* ((this-presentation (get-text-property point presentation object))) - (while (not (slime-presentation-stop-p this-presentation)) - (let ((change-point (next-single-property-change - point presentation object))) - (unless change-point - (return-from slime-presentation-end - (values (etypecase object - (buffer (with-current-buffer object (point-max))) - (string (length object))) - nil))) - (setq point change-point) - (setq this-presentation (get-text-property point - presentation object)))) - (if this-presentation - (let ((after-end (next-single-property-change point - presentation object))) - (if (not after-end) - (values (etypecase object - (buffer (with-current-buffer object (point-max))) - (string (length object))) - t) - (values after-end t))) - (values point nil)))) - -(cl-defun slime-presentation-bounds (point presentation - &optional (object (current-buffer))) - "Return start index and end index of `presentation' around `point' -in `object', and whether the presentation is complete." - (multiple-value-bind (start good-start) - (slime-presentation-start point presentation object) - (multiple-value-bind (end good-end) - (slime-presentation-end point presentation object) - (values start end - (and good-start good-end - (slime-presentation-whole-p presentation - start end object)))))) - -(defun slime-presentation-around-point (point &optional object) - "Return presentation, start index, end index, and whether the -presentation is complete." - (let ((object (or object (current-buffer))) - (innermost-presentation nil) - (innermost-start 0) - (innermost-end most-positive-fixnum)) - (dolist (presentation (slime-presentations-around-point point object)) - (multiple-value-bind (start end whole-p) - (slime-presentation-bounds point presentation object) - (when whole-p - (when (< (- end start) (- innermost-end innermost-start)) - (setq innermost-start start - innermost-end end - innermost-presentation presentation))))) - (values innermost-presentation - innermost-start innermost-end))) - -(defun slime-presentation-around-or-before-point (point &optional object) - (let ((object (or object (current-buffer)))) - (multiple-value-bind (presentation start end whole-p) - (slime-presentation-around-point point object) - (if (or presentation (= point (point-min))) - (values presentation start end whole-p) - (slime-presentation-around-point (1- point) object))))) - -(defun slime-presentation-around-or-before-point-or-error (point) - (multiple-value-bind (presentation start end whole-p) - (slime-presentation-around-or-before-point point) - (unless presentation - (error "No presentation at point")) - (values presentation start end whole-p))) - -(cl-defun slime-for-each-presentation-in-region (from to function - &optional (object (current-buffer))) - "Call `function' with arguments `presentation', `start', `end', -`whole-p' for every presentation in the region `from'--`to' in the -string or buffer `object'." - (cl-labels ((handle-presentation (presentation point) - (multiple-value-bind (start end whole-p) - (slime-presentation-bounds point presentation object) - (funcall function presentation start end whole-p)))) - ;; Handle presentations active at `from'. - (dolist (presentation (slime-presentations-around-point from object)) - (handle-presentation presentation from)) - ;; Use the `slime-repl-presentation' property to search for new presentations. - (let ((point from)) - (while (< point to) - (setq point (next-single-property-change point 'slime-repl-presentation - object to)) - (let* ((presentation (get-text-property point 'slime-repl-presentation object)) - (status (get-text-property point presentation object))) - (when (slime-presentation-start-p status) - (handle-presentation presentation point))))))) - -;; XEmacs compatibility hack, from message by Stephen J. Turnbull on -;; xemacs-beta@xemacs.org of 18 Mar 2002 -(unless (boundp 'undo-in-progress) - (defvar undo-in-progress nil - "Placeholder defvar for XEmacs compatibility from SLIME.") - (defadvice undo-more (around slime activate) - (let ((undo-in-progress t)) ad-do-it))) - -(defun slime-after-change-function (start end &rest ignore) - "Check all presentations within and adjacent to the change. -When a presentation has been altered, change it to plain text." - (let ((inhibit-modification-hooks t)) - (let ((real-start (max 1 (1- start))) - (real-end (min (1+ (buffer-size)) (1+ end))) - (any-change nil)) - ;; positions around the change - (slime-for-each-presentation-in-region - real-start real-end - (lambda (presentation from to whole-p) - (cond - (whole-p - (slime-ensure-presentation-overlay from to presentation)) - ((not undo-in-progress) - (slime-remove-presentation-properties from to - presentation) - (setq any-change t))))) - (when any-change - (undo-boundary))))) - -(defun slime-presentation-around-click (event) - "Return the presentation around the position of the mouse-click EVENT. -If there is no presentation, signal an error. -Also return the start position, end position, and buffer of the presentation." - (when (and (featurep 'xemacs) (not (button-press-event-p event))) - (error "Command must be bound to a button-press-event")) - (let ((point (if (featurep 'xemacs) (event-point event) (posn-point (event-end event)))) - (window (if (featurep 'xemacs) (event-window event) (caadr event)))) - (with-current-buffer (window-buffer window) - (multiple-value-bind (presentation start end) - (slime-presentation-around-point point) - (unless presentation - (error "No presentation at click")) - (values presentation start end (current-buffer)))))) - -(defun slime-check-presentation (from to buffer presentation) - (unless (slime-eval `(cl:nth-value 1 (swank:lookup-presented-object - ',(slime-presentation-id presentation)))) - (with-current-buffer buffer - (slime-remove-presentation-properties from to presentation)))) - -(defun slime-copy-or-inspect-presentation-at-mouse (event) - (interactive "e") ; no "@" -- we don't want to select the clicked-at window - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-check-presentation start end buffer presentation) - (if (with-current-buffer buffer - (eq major-mode 'slime-repl-mode)) - (slime-copy-presentation-at-mouse-to-repl event) - (slime-inspect-presentation-at-mouse event)))) - -(defun slime-inspect-presentation (presentation start end buffer) - (let ((reset-p - (with-current-buffer buffer - (not (eq major-mode 'slime-inspector-mode))))) - (slime-eval-async `(swank:inspect-presentation ',(slime-presentation-id presentation) ,reset-p) - 'slime-open-inspector))) - -(defun slime-inspect-presentation-at-mouse (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-inspect-presentation presentation start end buffer))) - -(defun slime-inspect-presentation-at-point (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (slime-inspect-presentation presentation start end (current-buffer)))) - - -(defun slime-M-.-presentation (presentation start end buffer &optional where) - (let* ((id (slime-presentation-id presentation)) - (presentation-string (format "Presentation %s" id)) - (location (slime-eval `(swank:find-definition-for-thing - (swank:lookup-presented-object - ',(slime-presentation-id presentation)))))) - (unless (eq (car location) :error) - (slime-edit-definition-cont - (and location (list (make-slime-xref :dspec `(,presentation-string) - :location location))) - presentation-string - where)))) - -(defun slime-M-.-presentation-at-mouse (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-M-.-presentation presentation start end buffer))) - -(defun slime-M-.-presentation-at-point (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (slime-M-.-presentation presentation start end (current-buffer)))) - -(defun slime-edit-presentation (name &optional where) - (if (or current-prefix-arg (not (equal (slime-symbol-at-point) name))) - nil ; NAME came from user explicitly, so decline. - (multiple-value-bind (presentation start end whole-p) - (slime-presentation-around-or-before-point (point)) - (when presentation - (slime-M-.-presentation presentation start end (current-buffer) where))))) - -(defun slime-copy-presentation-to-repl (presentation start end buffer) - (let ((text (with-current-buffer buffer - ;; we use the buffer-substring rather than the - ;; presentation text to capture any overlays - (buffer-substring start end))) - (id (slime-presentation-id presentation))) - (unless (integerp id) - (setq id (slime-eval `(swank:lookup-and-save-presented-object-or-lose ',id)))) - (unless (eql major-mode 'slime-repl-mode) - (slime-switch-to-output-buffer)) - (cl-flet ((do-insertion () - (unless (looking-back "\\s-" (- (point) 1)) - (insert " ")) - (slime-insert-presentation text id) - (unless (or (eolp) (looking-at "\\s-")) - (insert " ")))) - (if (>= (point) slime-repl-prompt-start-mark) - (do-insertion) - (save-excursion - (goto-char (point-max)) - (do-insertion)))))) - -(defun slime-copy-presentation-at-mouse-to-repl (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-copy-presentation-to-repl presentation start end buffer))) - -(defun slime-copy-presentation-at-point-to-repl (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (slime-copy-presentation-to-repl presentation start end (current-buffer)))) - -(defun slime-copy-presentation-at-mouse-to-point (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (let ((presentation-text - (with-current-buffer buffer - (buffer-substring start end)))) - (when (not (string-match "\\s-" - (buffer-substring (1- (point)) (point)))) - (insert " ")) - (insert presentation-text) - (slime-after-change-function (point) (point)) - (when (and (not (eolp)) (not (looking-at "\\s-"))) - (insert " "))))) - -(defun slime-copy-presentation-to-kill-ring (presentation start end buffer) - (let ((presentation-text - (with-current-buffer buffer - (buffer-substring start end)))) - (kill-new presentation-text) - (message "Saved presentation \"%s\" to kill ring" presentation-text))) - -(defun slime-copy-presentation-at-mouse-to-kill-ring (event) - (interactive "e") - (multiple-value-bind (presentation start end buffer) - (slime-presentation-around-click event) - (slime-copy-presentation-to-kill-ring presentation start end buffer))) - -(defun slime-copy-presentation-at-point-to-kill-ring (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (slime-copy-presentation-to-kill-ring presentation start end (current-buffer)))) - -(defun slime-describe-presentation (presentation) - (slime-eval-describe - `(swank::describe-to-string - (swank:lookup-presented-object ',(slime-presentation-id presentation))))) - -(defun slime-describe-presentation-at-mouse (event) - (interactive "@e") - (multiple-value-bind (presentation) (slime-presentation-around-click event) - (slime-describe-presentation presentation))) - -(defun slime-describe-presentation-at-point (point) - (interactive "d") - (multiple-value-bind (presentation) - (slime-presentation-around-or-before-point-or-error point) - (slime-describe-presentation presentation))) - -(defun slime-pretty-print-presentation (presentation) - (slime-eval-describe - `(swank::swank-pprint - (cl:list - (swank:lookup-presented-object ',(slime-presentation-id presentation)))))) - -(defun slime-pretty-print-presentation-at-mouse (event) - (interactive "@e") - (multiple-value-bind (presentation) (slime-presentation-around-click event) - (slime-pretty-print-presentation presentation))) - -(defun slime-pretty-print-presentation-at-point (point) - (interactive "d") - (multiple-value-bind (presentation) - (slime-presentation-around-or-before-point-or-error point) - (slime-pretty-print-presentation presentation))) - -(defun slime-mark-presentation (point) - (interactive "d") - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error point) - (goto-char start) - (push-mark end nil t))) - -(defun slime-previous-presentation (&optional arg) - "Move point to the beginning of the first presentation before point. -With ARG, do this that many times. -A negative argument means move forward instead." - (interactive "p") - (unless arg (setq arg 1)) - (slime-next-presentation (- arg))) - -(defun slime-next-presentation (&optional arg) - "Move point to the beginning of the next presentation after point. -With ARG, do this that many times. -A negative argument means move backward instead." - (interactive "p") - (unless arg (setq arg 1)) - (cond - ((plusp arg) - (dotimes (i arg) - ;; First skip outside the current surrounding presentation (if any) - (multiple-value-bind (presentation start end) - (slime-presentation-around-point (point)) - (when presentation - (goto-char end))) - (let ((p (next-single-property-change (point) 'slime-repl-presentation))) - (unless p - (error "No next presentation")) - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error p) - (goto-char start))))) - ((minusp arg) - (dotimes (i (- arg)) - ;; First skip outside the current surrounding presentation (if any) - (multiple-value-bind (presentation start end) - (slime-presentation-around-point (point)) - (when presentation - (goto-char start))) - (let ((p (previous-single-property-change (point) 'slime-repl-presentation))) - (unless p - (error "No previous presentation")) - (multiple-value-bind (presentation start end) - (slime-presentation-around-or-before-point-or-error p) - (goto-char start))))))) - -(define-key slime-presentation-map [mouse-2] 'slime-copy-or-inspect-presentation-at-mouse) -(define-key slime-presentation-map [mouse-3] 'slime-presentation-menu) - -(when (featurep 'xemacs) - (define-key slime-presentation-map [button2] 'slime-copy-or-inspect-presentation-at-mouse) - (define-key slime-presentation-map [button3] 'slime-presentation-menu)) - -;; protocol for handling up a menu. -;; 1. Send lisp message asking for menu choices for this object. -;; Get back list of strings. -;; 2. Let used choose -;; 3. Call back to execute menu choice, passing nth and string of choice - -(defun slime-menu-choices-for-presentation (presentation buffer from to choice-to-lambda) - "Return a menu for `presentation' at `from'--`to' in `buffer', suitable for `x-popup-menu'." - (let* ((what (slime-presentation-id presentation)) - (choices (with-current-buffer buffer - (slime-eval - `(swank::menu-choices-for-presentation-id ',what))))) - (cl-labels ((savel (f) ;; IMPORTANT - xemacs can't handle lambdas in x-popup-menu. So give them a name - (let ((sym (cl-gensym))) - (setf (gethash sym choice-to-lambda) f) - sym))) - (etypecase choices - (list - `(,(format "Presentation %s" (truncate-string-to-width - (slime-presentation-text presentation) - 30 nil nil t)) - ("" - ("Find Definition" . ,(savel 'slime-M-.-presentation-at-mouse)) - ("Inspect" . ,(savel 'slime-inspect-presentation-at-mouse)) - ("Describe" . ,(savel 'slime-describe-presentation-at-mouse)) - ("Pretty-print" . ,(savel 'slime-pretty-print-presentation-at-mouse)) - ("Copy to REPL" . ,(savel 'slime-copy-presentation-at-mouse-to-repl)) - ("Copy to kill ring" . ,(savel 'slime-copy-presentation-at-mouse-to-kill-ring)) - ,@(unless buffer-read-only - `(("Copy to point" . ,(savel 'slime-copy-presentation-at-mouse-to-point)))) - ,@(let ((nchoice 0)) - (mapcar - (lambda (choice) - (incf nchoice) - (cons choice - (savel `(lambda () - (interactive) - (slime-eval - '(swank::execute-menu-choice-for-presentation-id - ',what ,nchoice ,(nth (1- nchoice) choices))))))) - choices))))) - (symbol ; not-present - (with-current-buffer buffer - (slime-remove-presentation-properties from to presentation)) - (sit-for 0) ; allow redisplay - `("Object no longer recorded" - ("sorry" . ,(if (featurep 'xemacs) nil '(nil))))))))) - -(defun slime-presentation-menu (event) - (interactive "e") - (let* ((point (if (featurep 'xemacs) (event-point event) - (posn-point (event-end event)))) - (window (if (featurep 'xemacs) (event-window event) (caadr event))) - (buffer (window-buffer window)) - (choice-to-lambda (make-hash-table))) - (multiple-value-bind (presentation from to) - (with-current-buffer buffer - (slime-presentation-around-point point)) - (unless presentation - (error "No presentation at event position")) - (let ((menu (slime-menu-choices-for-presentation - presentation buffer from to choice-to-lambda))) - (let ((choice (x-popup-menu event menu))) - (when choice - (call-interactively (gethash choice choice-to-lambda)))))))) - -(defun slime-presentation-expression (presentation) - "Return a string that contains a CL s-expression accessing -the presented object." - (let ((id (slime-presentation-id presentation))) - (etypecase id - (number - ;; Make sure it works even if *read-base* is not 10. - (format "(swank:lookup-presented-object-or-lose %d.)" id)) - (list - ;; for frame variables and inspector parts - (format "(swank:lookup-presented-object-or-lose '%s)" id))))) - -(defun slime-buffer-substring-with-reified-output (start end) - (let ((str-props (buffer-substring start end)) - (str-no-props (buffer-substring-no-properties start end))) - (slime-reify-old-output str-props str-no-props))) - -(defun slime-reify-old-output (str-props str-no-props) - (let ((pos (slime-property-position 'slime-repl-presentation str-props))) - (if (null pos) - str-no-props - (multiple-value-bind (presentation start-pos end-pos whole-p) - (slime-presentation-around-point pos str-props) - (if (not presentation) - str-no-props - (concat (substring str-no-props 0 pos) - ;; Eval in the reader so that we play nice with quote. - ;; -luke (19/May/2005) - "#." (slime-presentation-expression presentation) - (slime-reify-old-output (substring str-props end-pos) - (substring str-no-props end-pos)))))))) - - - -(defun slime-repl-grab-old-output (replace) - "Resend the old REPL output at point. -If replace it non-nil the current input is replaced with the old -output; otherwise the new input is appended." - (multiple-value-bind (presentation beg end) - (slime-presentation-around-or-before-point (point)) - (slime-check-presentation beg end (current-buffer) presentation) - (let ((old-output (buffer-substring beg end))) ;;keep properties - ;; Append the old input or replace the current input - (cond (replace (goto-char slime-repl-input-start-mark)) - (t (goto-char (point-max)) - (unless (eq (char-before) ?\ ) - (insert " ")))) - (delete-region (point) (point-max)) - (let ((inhibit-read-only t)) - (insert old-output))))) - -;;; Presentation-related key bindings, non-context menu - -(defvar slime-presentation-command-map nil - "Keymap for presentation-related commands. Bound to a prefix key.") - -(defvar slime-presentation-bindings - '((?i slime-inspect-presentation-at-point) - (?d slime-describe-presentation-at-point) - (?w slime-copy-presentation-at-point-to-kill-ring) - (?r slime-copy-presentation-at-point-to-repl) - (?p slime-previous-presentation) - (?n slime-next-presentation) - (?\ slime-mark-presentation))) - -(defun slime-presentation-init-keymaps () - (slime-init-keymap 'slime-presentation-command-map nil t - slime-presentation-bindings) - (define-key slime-presentation-command-map "\M-o" 'slime-clear-presentations) - ;; C-c C-v is the prefix for the presentation-command map. - (define-key slime-prefix-map "\C-v" slime-presentation-command-map)) - -(defun slime-presentation-around-or-before-point-p () - (multiple-value-bind (presentation beg end) - (slime-presentation-around-or-before-point (point)) - presentation)) - -(defvar slime-presentation-easy-menu - (let ((P '(slime-presentation-around-or-before-point-p))) - `("Presentations" - [ "Find Definition" slime-M-.-presentation-at-point ,P ] - [ "Inspect" slime-inspect-presentation-at-point ,P ] - [ "Describe" slime-describe-presentation-at-point ,P ] - [ "Pretty-print" slime-pretty-print-presentation-at-point ,P ] - [ "Copy to REPL" slime-copy-presentation-at-point-to-repl ,P ] - [ "Copy to kill ring" slime-copy-presentation-at-point-to-kill-ring ,P ] - [ "Mark" slime-mark-presentation ,P ] - "--" - [ "Previous presentation" slime-previous-presentation ] - [ "Next presentation" slime-next-presentation ] - "--" - [ "Clear all presentations" slime-clear-presentations ]))) - -(defun slime-presentation-add-easy-menu () - (easy-menu-define menubar-slime-presentation slime-mode-map "Presentations" slime-presentation-easy-menu) - (easy-menu-define menubar-slime-presentation slime-repl-mode-map "Presentations" slime-presentation-easy-menu) - (easy-menu-define menubar-slime-presentation sldb-mode-map "Presentations" slime-presentation-easy-menu) - (easy-menu-define menubar-slime-presentation slime-inspector-mode-map "Presentations" slime-presentation-easy-menu) - (easy-menu-add slime-presentation-easy-menu 'slime-mode-map) - (easy-menu-add slime-presentation-easy-menu 'slime-repl-mode-map) - (easy-menu-add slime-presentation-easy-menu 'sldb-mode-map) - (easy-menu-add slime-presentation-easy-menu 'slime-inspector-mode-map)) - -;;; hook functions (hard to isolate stuff) - -(defun slime-dispatch-presentation-event (event) - (slime-dcase event - ((:presentation-start id &optional target) - (slime-mark-presentation-start id target) - t) - ((:presentation-end id &optional target) - (slime-mark-presentation-end id target) - t) - (t nil))) - -(defun slime-presentation-write-result (string) - (with-current-buffer (slime-output-buffer) - (let ((marker (slime-repl-output-target-marker :repl-result)) - (saved-point (point-marker))) - (goto-char marker) - (slime-propertize-region `(face slime-repl-result-face - rear-nonsticky (face)) - (insert string)) - ;; Move the input-start marker after the REPL result. - (set-marker marker (point)) - (set-marker slime-output-end (point)) - ;; Restore point before insertion but only it if was farther - ;; than `marker'. Omitting this breaks REPL test - ;; `repl-type-ahead'. - (when (> saved-point (point)) - (goto-char saved-point))) - (slime-repl-show-maximum-output))) - -(defun slime-presentation-write (string &optional target) - (case target - ((nil) ; Regular process output - (slime-repl-emit string)) - (:repl-result - (slime-presentation-write-result string)) - (t (slime-repl-emit-to-target string target)))) - -(defun slime-presentation-current-input (&optional until-point-p) - "Return the current input as string. -The input is the region from after the last prompt to the end of -buffer. Presentations of old results are expanded into code." - (slime-buffer-substring-with-reified-output (slime-repl-history-yank-start) - (if until-point-p - (point) - (point-max)))) - -(defun slime-presentation-on-return-pressed (end-of-input) - (when (and (car (slime-presentation-around-or-before-point (point))) - (< (point) slime-repl-input-start-mark)) - (slime-repl-grab-old-output end-of-input) - (slime-repl-recenter-if-needed) - t)) - -(defun slime-presentation-bridge-insert (process output) - (slime-output-filter process (or output ""))) - -(defun slime-presentation-on-stream-open (stream) - (install-bridge) - (setq bridge-insert-function #'slime-presentation-bridge-insert) - (setq bridge-destination-insert nil) - (setq bridge-source-insert nil) - (setq bridge-handlers - (list* '("<" . slime-mark-presentation-start-handler) - '(">" . slime-mark-presentation-end-handler) - bridge-handlers))) - -(defun slime-clear-presentations () - "Forget all objects associated to SLIME presentations. -This allows the garbage collector to remove these objects -even on Common Lisp implementations without weak hash tables." - (interactive) - (slime-eval-async `(swank:clear-repl-results)) - (unless (eql major-mode 'slime-repl-mode) - (slime-switch-to-output-buffer)) - (slime-for-each-presentation-in-region 1 (1+ (buffer-size)) - (lambda (presentation from to whole-p) - (slime-remove-presentation-properties from to - presentation)))) - -(defun slime-presentation-inspector-insert-ispec (ispec) - (if (stringp ispec) - (insert ispec) - (slime-dcase ispec - ((:value string id) - (slime-propertize-region - (list 'slime-part-number id - 'mouse-face 'highlight - 'face 'slime-inspector-value-face) - (slime-insert-presentation string `(:inspected-part ,id) t))) - ((:label string) - (insert (slime-inspector-fontify label string))) - ((:action string id) - (slime-insert-propertized (list 'slime-action-number id - 'mouse-face 'highlight - 'face 'slime-inspector-action-face) - string))))) - -(defun slime-presentation-sldb-insert-frame-variable-value (value frame index) - (slime-insert-presentation - (sldb-in-face local-value value) - `(:frame-var ,slime-current-thread ,(car frame) ,index) t)) - -(defun slime-presentations-on-connected () - (slime-eval-async `(swank:init-presentations))) - -(provide 'slime-presentations) diff --git a/elpa/slime-20200414.1444/contrib/slime-presentations.elc b/elpa/slime-20200414.1444/contrib/slime-presentations.elc deleted file mode 100644 index 5e50e0627988fc81ca1285806f69a56bfd07e6d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37143 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 D7Cwk1 diff --git a/elpa/slime-20200414.1444/contrib/slime-quicklisp.el b/elpa/slime-20200414.1444/contrib/slime-quicklisp.el deleted file mode 100644 index 97f5ece8..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-quicklisp.el +++ /dev/null @@ -1,51 +0,0 @@ -(require 'slime) -(require 'cl-lib) - -;;; bits of the following taken from slime-asdf.el - -(define-slime-contrib slime-quicklisp - "Quicklisp support." - (:authors "Matthew Kennedy ") - (:license "GPL") - (:slime-dependencies slime-repl) - (:swank-dependencies swank-quicklisp)) - -;;; Utilities - -(defgroup slime-quicklisp nil - "Quicklisp support for Slime." - :prefix "slime-quicklisp-" - :group 'slime) - -(defvar slime-quicklisp-system-history nil - "History list for Quicklisp system names.") - - - -(defun slime-read-quicklisp-system-name (&optional prompt default-value) - "Read a Quick system name from the minibuffer, prompting with PROMPT." - (let* ((completion-ignore-case nil) - (prompt (or prompt "Quicklisp system")) - (quicklisp-system-names (slime-eval `(swank:list-quicklisp-systems))) - (prompt (concat prompt (if default-value - (format " (default `%s'): " default-value) - ": ")))) - (completing-read prompt (slime-bogus-completion-alist quicklisp-system-names) - nil nil nil - 'slime-quicklisp-system-history default-value))) - -(defun slime-quicklisp-quickload (system) - "Load a Quicklisp system." - (slime-save-some-lisp-buffers) - (slime-display-output-buffer) - (slime-repl-shortcut-eval-async `(ql:quickload ,system))) - -;;; REPL shortcuts - -(defslime-repl-shortcut slime-repl-quicklisp-quickload ("quicklisp-quickload" "ql") - (:handler (lambda () - (interactive) - (slime-quicklisp-quickload (slime-read-quicklisp-system-name)))) - (:one-liner "Load a system known to Quicklisp.")) - -(provide 'slime-quicklisp) diff --git a/elpa/slime-20200414.1444/contrib/slime-quicklisp.elc b/elpa/slime-20200414.1444/contrib/slime-quicklisp.elc deleted file mode 100644 index 6e6b74ffde229f6914f3fbfabb9007b970fb9277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2714 zcmcIm&2QT_6wfWTb6HPIciD@)rWOzxmgIai*@|pQu@+0QtnIBfFj}H)A`+>Pls)gS z-y{}rF#&w*r_<^5CQD6&M5GkFQ9Kyn3J*q6XdcXp);BS3 z2B#i;mh`@2l7h-vK_SV5oK4&&khILl5c!>6N;8r(qTr=f3-FcXE@!F?7-t%~pE=7P zoEl#vZ_RUzlA)1Uj|C|c$SR%~DD<2`Y=6meS(xa#|3U_Y+aP_Rx{{`|S<>CY92n2vVBlMABd?MOA`@!e0$QKviWa zq=rmL_-JD9dvIP#nz4Vt+YSYfoDq94h7iHmy&OjHmZ2xP1jL*(wdP={G%Wz>f~x+H z7OQh2AEmCWT7WEL4Vfr=-JhTjVHh9##?9#fK2Sss0c#xG8`dynQWQA!6bc0Vq{=cX zkDx>$G8vzOWwzT7f4;x{REMxJE)vZ?KscyFF%ct7dxwS&1t)oJ5X`hyxen$euc&Y5 zYPjD#DB6Uxg5Y}K$k6LiKI*!ywpVw7VkR{@&rJs()k66O9|h6i zfh8MEAO3!!Ui#-K@yu5fBcCEKVV4|qCSqDCoQ75WSa(FoHm)|CKZdiW_fdT2Bb{_F zqZ7C>v{5(Ta9a(4ryBZD68Gc?r{~ccumOPp$k6PDnSDRe;8k|%JVpRZy=&TJAs9iEzmA2GVM^K@Dp z+}=cQ$Q$VdFHpQi*_`IfZN`O0b-Nj>uvRI2X*%%ovB1Iz#_P`*|0XvZ9&R|<^6@na zEFr(xNBCPxZjZcYt@dxvd@~egCYty-T?9=9S0Ukb)W`x&Ciu5xgMT;5zW&maB@BP@ zo{%H3?{n{eE*p3?tZTU4ak1c_h2uB_HsoWx^(8F?LXc&Kk#HQ%KL}gZ)" - "Luke Gorrie " - "Tobias C. Rittweiler ") - (:license "GPL") - (:on-load - (ad-enable-advice 'slime-note.message 'after 'slime-note.message+references) - (ad-activate 'slime-note.message) - (setq slime-tree-printer 'slime-tree-print-with-references) - (add-hook 'sldb-extras-hooks 'sldb-maybe-insert-references)) - (:on-unload - (ad-disable-advice 'slime-note.message 'after 'slime-note.message+references) - (ad-deactivate 'slime-note.message) - (setq slime-tree-printer 'slime-tree-default-printer) - (remove-hook 'sldb-extras-hooks 'sldb-maybe-insert-references))) - -(defcustom slime-sbcl-manual-root "http://www.sbcl.org/manual/" - "*The base URL of the SBCL manual, for documentation lookup." - :type '(choice (string :tag "HTML Documentation") - (const :tag "Info Documentation" :info)) - :group 'slime-mode) - -(defface sldb-reference-face - (list (list t '(:underline t))) - "Face for references." - :group 'slime-debugger) - - -;;;;; SBCL-style references - -(defvar slime-references-local-keymap - (let ((map (make-sparse-keymap "local keymap for slime references"))) - (define-key map [mouse-2] 'slime-lookup-reference-at-mouse) - (define-key map [return] 'slime-lookup-reference-at-point) - map)) - -(defun slime-reference-properties (reference) - "Return the properties for a reference. -Only add clickability to properties we actually know how to lookup." - (cl-destructuring-bind (where type what) reference - (if (or (and (eq where :sbcl) (eq type :node)) - (and (eq where :ansi-cl) - (memq type '(:function :special-operator :macro - :type :system-class - :section :glossary :issue)))) - `(slime-reference ,reference - font-lock-face sldb-reference-face - follow-link t - mouse-face highlight - help-echo "mouse-2: visit documentation." - keymap ,slime-references-local-keymap)))) - -(defun slime-insert-reference (reference) - "Insert documentation reference from a condition. -See SWANK-BACKEND:CONDITION-REFERENCES for the datatype." - (cl-destructuring-bind (where type what) reference - (insert "\n" (slime-format-reference-source where) ", ") - (slime-insert-propertized (slime-reference-properties reference) - (slime-format-reference-node what)) - (insert (format " [%s]" type)))) - -(defun slime-insert-references (references) - (when references - (insert "\nSee also:") - (slime-with-rigid-indentation 2 - (mapc #'slime-insert-reference references)))) - -(defun slime-format-reference-source (where) - (cl-case where - (:amop "The Art of the Metaobject Protocol") - (:ansi-cl "Common Lisp Hyperspec") - (:sbcl "SBCL Manual") - (t (format "%S" where)))) - -(defun slime-format-reference-node (what) - (if (listp what) - (mapconcat #'prin1-to-string what ".") - what)) - -(defun slime-lookup-reference-at-point () - "Browse the documentation reference at point." - (interactive) - (let ((refs (get-text-property (point) 'slime-reference))) - (if (null refs) - (error "No references at point") - (cl-destructuring-bind (where type what) refs - (cl-case where - (:ansi-cl - (cl-case type - (:section - (browse-url (funcall common-lisp-hyperspec-section-fun what))) - (:glossary - (browse-url (funcall common-lisp-hyperspec-glossary-function what))) - (:issue - (browse-url (common-lisp-issuex what))) - (:special-operator - (browse-url (common-lisp-special-operator (downcase name)))) - (t - (hyperspec-lookup what)))) - (t - (case slime-sbcl-manual-root - (:info - (info (format "(sbcl)%s" what))) - (t - (browse-url - (format "%s#%s" slime-sbcl-manual-root - (subst-char-in-string ?\ ?\- what))))))))))) - -(defun slime-lookup-reference-at-mouse (event) - "Invoke the action pointed at by the mouse." - (interactive "e") - (cl-destructuring-bind (mouse-1 (w pos . _) . _) event - (save-excursion - (goto-char pos) - (slime-lookup-reference-at-point)))) - -;;;;; Hook into *SLIME COMPILATION* - -(defun slime-note.references (note) - (plist-get note :references)) - -;;; FIXME: `compilation-mode' will swallow the `mouse-face' -;;; etc. properties. -(defadvice slime-note.message (after slime-note.message+references) - (setq ad-return-value - (concat ad-return-value - (with-temp-buffer - (slime-insert-references - (slime-note.references (ad-get-arg 0))) - (buffer-string))))) - -;;;;; Hook into slime-compiler-notes-tree - -(defun slime-tree-print-with-references (tree) - ;; for SBCL-style references - (slime-tree-default-printer tree) - (let ((note (plist-get (slime-tree.plist tree) 'note))) - (when note - (let ((references (slime-note.references note))) - (when references - (terpri (current-buffer)) - (slime-insert-references references)))))) - -;;;;; Hook into SLDB - -(defun sldb-maybe-insert-references (extra) - (slime-dcase extra - ((:references references) (slime-insert-references references) t) - (t nil))) - -(provide 'slime-references) diff --git a/elpa/slime-20200414.1444/contrib/slime-references.elc b/elpa/slime-20200414.1444/contrib/slime-references.elc deleted file mode 100644 index 70295700b28cd677487e1cfed3aa810b3932b974..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6423 zcmb_g{cjsL5;d-ep6#IR^>DarlNL8#HI0;J745DhH%eRBb=)MVlNL#e{ty|L)ryk# zyjrRxWz`4V|9)@CU42yho5rDjBNmXVy8be#S-Ht5#%UEBF;lxiAa7Mg0Iseh5j<20eZ zOtevHKGgTntF)oG-xqzFuM#|{hYv2z(U+JbmxdCVn;61VGw{DeOYR@OJbL<+l2NSU z#6ZP+cKJB(la`dkIrRi(GG1Av*or0*t1K0Y%m{*E@O%GucXzA33nTnQ z_62#}sL{X^>~+I{U-$`^KO%fI_C0#7#4poS3DQ|Q7BKF4niLFv8FqAl&{12(_HP#;o=i=FHKr<+_81dz z#U&h&5{XpcC)-|#t)P3={np3(1x%{m(MYA*$jM01ixG%I6MdCv6$S?&J`?xqxiH^& z8^d>UuIk|1txWXz;<|Nd+?t8-^v zs^NVna39OxeT6;rVlC*W7bheKU}Qlrzdbs^sq-X=7E*Ean2rT@#*qfBF3+Zux{>H-W};~{xZUOhXZN6X`Q4=_4HkCS+s59FEzby76eYSbAjIh_=H8Z#BI zZF>+~dIb&4$;7v9hN_)u-WP~3xgb*`?>iRdUCbplba#i_7rp6lDAXwh1tG(pMc+c) z&m@S@KNA<=MOupwmYVlIV%TpNxNnt=VOuOG+m`KG0al)79G?kaPhzD-IkRWip<*3Y z*=o6@xJU47Y>Y?H>#;}=VNCV#Y^*pAjW?wvUb=e!^(5YY-f738%4UN>y* zcL(<{%;g6Kxlkqey3+A|_^A@w_&&`>i27uGX*P;W8k=ubufi`PoeuLjqnVQV(9fsi zo>0CV_^}#VCq=@BfZbtdr%ukk(}{DPVnMhD$8_t&9X%0A3RJUsV}oPuAlp>3aO#e} z&_;|gDApR2iDJ|+lZfu>0-mb%RMgge1pvtnD}3hM(MIa|R$SXaW|^G%aL_X{V4BRV$xSokE;^4e_2)yiZSUGO#*o z0bd#@IR>6VOZ}A1Qr~?kz<)mfoqF;JuR4`!JtVWY#$jpoNU@!#g++iYwkJ^7m*YwWx0RDcXZvZNM=sw536` zV|T_%mmN*l@i*>3Vz=mMyN+AjvF|##UJ5W>nFl+T6Tg6z;<20{^MU&uDpMvM&yW_$ z-hV(e^rMnSCNe{YQ8Jf@+IWoI<0RD+dIE=2%wG_&H0Rlj<(bV`JoZh%i@e(}am>+M z*}_7|S|a9@Vf!oWA-ci4vEiMK65$LR`v^Lg&Mi@Ml_XIk83emD4}2s2A_wy7SemPj z%0aVD-zqsnhGqF;IU`ykBA$aI@FpJF6xXfrQo+)GV=d3sVek=jY<>Xc-4Sqwig*}B zTl0t+gqCnCSAB$K8Vcht zlh(zh*eaAloc5l}1#mQ#$noeciP*VdkrB)zd(UFjpDOt0T98M0TzyJyGX_Ynqk8zpx-9Zbdl*wjzTml0&S}iG_iBxZDM41K{Sv0Hr8_6rKrT( zatBS|O2&uNP-ii$;CsGR!d+2uIaS=Qt=vJ;ovKrOrFHpcij!y*lf@iaJnr>ln^{-2 zFu(A{l`E=Hfup3ir7cH-OYQa&3#s(P?@b4&0Z=E~`-k;duFDRm(PB@m1Mia)d}`EC z9ar5g0t{IPylOiSeCbtgg62uour_ znd+AM*RQu0Xy9xd<sl?R6C6D&mU!N6s7V zW#!!O4{q)p-h$z5B!yvZ;N$`nHv0q>ZP2js`O~fL-~c8JKVuUj8Wq=z11@DhWvjkt zt$G))oQ{R}t?|FWt95F=AayCG0sNXMk!+SJ`8}XYgp5<+!X95CRhny6=@I~K#8~eRAlz&DazAJx8Jqh{{tIy+fV=i diff --git a/elpa/slime-20200414.1444/contrib/slime-repl.el b/elpa/slime-20200414.1444/contrib/slime-repl.el deleted file mode 100644 index 5a3cba73..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-repl.el +++ /dev/null @@ -1,1805 +0,0 @@ -;;; slime-repl.el --- -;; -;; Original Author: Helmut Eller -;; Contributors: too many to mention -;; License: GNU GPL (same license as Emacs) -;; -;;; Description: -;; - -;; -;;; Installation: -;; -;; Call slime-setup and include 'slime-repl as argument: -;; -;; (slime-setup '(slime-repl [others conribs ...])) -;; -(require 'slime) -(require 'slime-parse) -(require 'cl-lib) -(eval-when-compile (require 'cl)) ; slime-def-connection-var, which - ; expands to defsetf not in cl-lib - -(define-slime-contrib slime-repl - "Read-Eval-Print Loop written in Emacs Lisp. - -This contrib implements a Lisp Listener along with some niceties like -a persistent history and various \"shortcut\" commands. Nothing here -depends on comint.el; I/O is multiplexed over SLIME's socket. - -This used to be the default REPL for SLIME, but it was hard to -maintain." - (:authors "too many to mention") - (:license "GPL") - (:on-load - (slime-repl-add-hooks) - (setq slime-find-buffer-package-function 'slime-repl-find-buffer-package)) - (:on-unload (slime-repl-remove-hooks)) - (:swank-dependencies swank-repl)) - -;;;;; slime-repl - -(defgroup slime-repl nil - "The Read-Eval-Print Loop (*slime-repl* buffer)." - :prefix "slime-repl-" - :group 'slime) - -(defcustom slime-repl-shortcut-dispatch-char ?\, - "Character used to distinguish repl commands from lisp forms." - :type '(character) - :group 'slime-repl) - -(defcustom slime-repl-only-save-lisp-buffers t - "When T we only attempt to save lisp-mode file buffers. When - NIL slime will attempt to save all buffers (as per - save-some-buffers). This applies to all ASDF related repl - shortcuts." - :type '(boolean) - :group 'slime-repl) - -(defcustom slime-repl-auto-right-margin nil - "When T we bind CL:*PRINT-RIGHT-MARGIN* to the width of the -current repl's (as per slime-output-buffer) window." - :type '(boolean) - :group 'slime-repl) - -(defface slime-repl-prompt-face - '((t (:inherit font-lock-keyword-face))) - "Face for the prompt in the SLIME REPL." - :group 'slime-repl) - -(defface slime-repl-output-face - '((t (:inherit font-lock-string-face))) - "Face for Lisp output in the SLIME REPL." - :group 'slime-repl) - -(defface slime-repl-input-face - '((t (:bold t))) - "Face for previous input in the SLIME REPL." - :group 'slime-repl) - -(defface slime-repl-result-face - '((t ())) - "Face for the result of an evaluation in the SLIME REPL." - :group 'slime-repl) - -(defcustom slime-repl-history-file "~/.slime-history.eld" - "File to save the persistent REPL history to." - :type 'string - :group 'slime-repl) - -(defcustom slime-repl-history-size 200 - "*Maximum number of lines for persistent REPL history." - :type 'integer - :group 'slime-repl) - -(defcustom slime-repl-history-file-coding-system - (cond ((slime-find-coding-system 'utf-8-unix) 'utf-8-unix) - (t slime-net-coding-system)) - "*The coding system for the history file." - :type 'symbol - :group 'slime-repl) - - -;; dummy defvar for compiler -(defvar slime-repl-read-mode) - -(defun slime-reading-p () - "True if Lisp is currently reading input from the REPL." - (with-current-buffer (slime-output-buffer) - slime-repl-read-mode)) - - -;;;; Stream output - -(slime-def-connection-var slime-connection-output-buffer nil - "The buffer for the REPL. May be nil or a dead buffer.") - -(make-variable-buffer-local - (defvar slime-output-start nil - "Marker for the start of the output for the evaluation.")) - -(make-variable-buffer-local - (defvar slime-output-end nil - "Marker for end of output. New output is inserted at this mark.")) - -;; dummy definitions for the compiler -(defvar slime-repl-package-stack) -(defvar slime-repl-directory-stack) -(defvar slime-repl-input-start-mark) -(defvar slime-repl-prompt-start-mark) - -(defvar slime-repl-history-use-mark nil - "A non-nil value means that history will be replaced from the mark. - -Instead of replacing form input-start, look up history and replace input -from the mark. Calling 'slime-repl-previous-input', - 'slime-repl-previous-matching-input' or their -next counterparts with a prefix - argument sets this variable for the duration of one history lookup.") - -(defun slime-repl-history-yank-start () - "The position which 'slime-repl-previous-input' will replace from. - -When 'slime-repl-history-use-mark' is non-nil, and (mark) is after the current -input start, return it. Otherwise, return 'slime-repl-input-start-mark'." - (if (and slime-repl-history-use-mark (mark)) - (max (mark) slime-repl-input-start-mark) - slime-repl-input-start-mark)) - -(defun slime-output-buffer (&optional noprompt) - "Return the output buffer, create it if necessary." - (let ((buffer (slime-connection-output-buffer))) - (or (if (buffer-live-p buffer) buffer) - (setf (slime-connection-output-buffer) - (let ((connection (slime-connection))) - (with-current-buffer (slime-repl-buffer t connection) - (unless (eq major-mode 'slime-repl-mode) - (slime-repl-mode)) - (setq slime-buffer-connection connection) - (setq slime-buffer-package (slime-lisp-package connection)) - (slime-reset-repl-markers) - (unless noprompt - (slime-repl-insert-prompt)) - (current-buffer))))))) - -(defvar slime-repl-banner-function 'slime-repl-insert-banner) - -(defun slime-repl-update-banner () - (funcall slime-repl-banner-function) - (slime-move-point (point-max)) - (slime-mark-output-start) - (slime-mark-input-start) - (slime-repl-insert-prompt)) - -(defun slime-repl-insert-banner () - (when (zerop (buffer-size)) - (let ((welcome (concat "; SLIME " slime-version))) - (insert welcome)))) - -(defun slime-init-output-buffer (connection) - (with-current-buffer (slime-output-buffer t) - (setq slime-buffer-connection connection - slime-repl-directory-stack '() - slime-repl-package-stack '()) - (slime-repl-update-banner))) - -(defun slime-display-output-buffer () - "Display the output buffer and scroll to bottom." - (with-current-buffer (slime-output-buffer) - (goto-char (point-max)) - (unless (get-buffer-window (current-buffer) t) - (display-buffer (current-buffer) t)) - (slime-repl-show-maximum-output))) - -(defun slime-output-filter (process string) - (with-current-buffer (process-buffer process) - (when (and (plusp (length string)) - (eq (process-status slime-buffer-connection) 'open)) - (slime-write-string string)))) - -(defvar slime-open-stream-hooks) - -(defun slime-open-stream-to-lisp (port coding-system) - (let ((stream (open-network-stream "*lisp-output-stream*" - (slime-with-connection-buffer () - (current-buffer)) - (car (process-contact (slime-connection))) - port)) - (emacs-coding-system (car (cl-find coding-system - slime-net-valid-coding-systems - :key #'cl-third)))) - (slime-set-query-on-exit-flag stream) - (set-process-filter stream 'slime-output-filter) - (set-process-coding-system stream emacs-coding-system emacs-coding-system) - (let ((secret (slime-secret))) - (when secret - (slime-net-send secret stream))) - (run-hook-with-args 'slime-open-stream-hooks stream) - stream)) - -(defun slime-io-speed-test (&optional profile) - "A simple minded benchmark for stream performance. -If a prefix argument is given, instrument the slime package for -profiling before running the benchmark." - (interactive "P") - (eval-and-compile - (require 'elp)) - (elp-reset-all) - (elp-restore-all) - (load "slime.el") - ;;(byte-compile-file "slime-net.el" t) - ;;(setq slime-log-events nil) - (setq slime-enable-evaluate-in-emacs t) - ;;(setq slime-repl-enable-presentations nil) - (when profile - (elp-instrument-package "slime-")) - (kill-buffer (slime-output-buffer)) - (switch-to-buffer (slime-output-buffer)) - (delete-other-windows) - (sit-for 0) - (slime-repl-send-string "(swank:io-speed-test 4000 1)") - (let ((proc (slime-inferior-process))) - (when proc - (display-buffer (process-buffer proc) t) - (goto-char (point-max))))) - -(defvar slime-write-string-function 'slime-repl-write-string) - -(defun slime-write-string (string &optional target) - "Insert STRING in the REPL buffer or some other TARGET. -If TARGET is nil, insert STRING as regular process -output. If TARGET is :repl-result, insert STRING as the result of the -evaluation. Other values of TARGET map to an Emacs marker via the -hashtable `slime-output-target-to-marker'; output is inserted at this marker." - (funcall slime-write-string-function string target)) - -(defun slime-repl-write-string (string &optional target) - (case target - ((nil) (slime-repl-emit string)) - (:repl-result (slime-repl-emit-result string t)) - (t (slime-repl-emit-to-target string target)))) - -(defvar slime-repl-popup-on-output nil - "Display the output buffer when some output is written. -This is set to nil after displaying the buffer.") - -(defmacro slime-save-marker (marker &rest body) - (declare (debug (sexp &rest form))) - (let ((pos (cl-gensym "pos"))) - `(let ((,pos (marker-position ,marker))) - (prog1 (progn . ,body) - (set-marker ,marker ,pos))))) - -(put 'slime-save-marker 'lisp-indent-function 1) - -(defun slime-repl-emit (string) - ;; insert the string STRING in the output buffer - (with-current-buffer (slime-output-buffer) - (save-excursion - (goto-char slime-output-end) - (slime-save-marker slime-output-start - (slime-propertize-region '(face slime-repl-output-face - slime-repl-output t - rear-nonsticky (face)) - (let ((inhibit-read-only t)) - (insert-before-markers string) - (when (and (= (point) slime-repl-prompt-start-mark) - (not (bolp))) - (insert-before-markers "\n") - (set-marker slime-output-end (1- (point)))))))) - (when slime-repl-popup-on-output - (setq slime-repl-popup-on-output nil) - (display-buffer (current-buffer))) - (slime-repl-show-maximum-output))) - -(defun slime-repl-emit-result (string &optional bol) - ;; insert STRING and mark it as evaluation result - (with-current-buffer (slime-output-buffer) - (save-excursion - (goto-char slime-repl-input-start-mark) - (slime-save-marker slime-output-start - (goto-char slime-repl-input-start-mark) - (when (and bol (not (bolp))) (insert-before-markers-and-inherit "\n")) - (slime-save-marker slime-output-end - (slime-propertize-region `(face slime-repl-result-face - rear-nonsticky (face)) - (insert-before-markers string))) - (set-marker slime-output-end (point)))) - (slime-repl-show-maximum-output))) - -(defvar slime-last-output-target-id 0 - "The last integer we used as a TARGET id.") - -(defun slime-repl-emit-to-target (string target) - "Insert STRING at target TARGET. -See `slime-output-target-to-marker'." - (let* ((marker (slime-repl-output-target-marker target)) - (buffer (and marker (marker-buffer marker)))) - (when buffer - (with-current-buffer buffer - (save-excursion - ;; Insert STRING at MARKER, then move MARKER behind - ;; the insertion. - (goto-char marker) - (insert-before-markers string) - (set-marker marker (point))))))) - -(defun slime-repl-output-target-marker (target) - (case target - ((nil) - (with-current-buffer (slime-output-buffer) - slime-output-end)) - (:repl-result - (with-current-buffer (slime-output-buffer) - slime-repl-input-start-mark)) - (t - (slime-output-target-marker target)))) - - -(defun slime-switch-to-output-buffer () - "Select the output buffer, when possible in an existing window. - -Hint: You can use `display-buffer-reuse-frames' and -`special-display-buffer-names' to customize the frame in which -the buffer should appear." - (interactive) - (pop-to-buffer (slime-output-buffer)) - (goto-char (point-max))) - - -;;;; REPL -;; -;; The REPL uses some markers to separate input from output. The -;; usual configuration is as follows: -;; -;; ... output ... ... result ... prompt> ... input ... -;; ^ ^ ^ ^ ^ -;; output-start output-end prompt-start input-start point-max -;; -;; input-start is a right inserting marker, because -;; we want it to stay behind when the user inserts text. -;; -;; We maintain the following invariant: -;; -;; output-start <= output-end <= input-start. -;; -;; This invariant is important, because we must be prepared for -;; asynchronous output and asynchronous reads. ("Asynchronous" means, -;; triggered by Lisp and not by Emacs.) -;; -;; All output is inserted at the output-end marker. Some care must be -;; taken when output-end and input-start are at the same position: if -;; we insert at that point, we must move the right markers. We should -;; also not leave (window-)point in the middle of the new output. The -;; idiom we use is a combination to slime-save-marker, -;; insert-before-markers, and manually updating window-point -;; afterwards. -;; -;; A "synchronous" evaluation request proceeds as follows: the user -;; inserts some text between input-start and point-max and then hits -;; return. We send that region to Lisp, move the output and input -;; makers to the line after the input and wait. When we receive the -;; result, we insert it together with a prompt between the output-end -;; and input-start mark. See `slime-repl-insert-prompt'. -;; -;; It is possible that some output for such an evaluation request -;; arrives after the result. This output is inserted before the -;; result (and before the prompt). -;; -;; If we are in "reading" state, e.g., during a call to Y-OR-N-P, -;; there is no prompt between output-end and input-start. -;; - -;; FIXME: slime-lisp-package should be local in a REPL buffer -(slime-def-connection-var slime-lisp-package - "COMMON-LISP-USER" - "The current package name of the Superior lisp. -This is automatically synchronized from Lisp.") - -(slime-def-connection-var slime-lisp-package-prompt-string - "CL-USER" - "The current package name of the Superior lisp. -This is automatically synchronized from Lisp.") - -(slime-make-variables-buffer-local - (defvar slime-repl-package-stack nil - "The stack of packages visited in this repl.") - - (defvar slime-repl-directory-stack nil - "The stack of default directories associated with this repl.") - - (defvar slime-repl-prompt-start-mark) - (defvar slime-repl-input-start-mark) - (defvar slime-repl-old-input-counter 0 - "Counter used to generate unique `slime-repl-old-input' properties. -This property value must be unique to avoid having adjacent inputs be -joined together.")) - -(defun slime-reset-repl-markers () - (dolist (markname '(slime-output-start - slime-output-end - slime-repl-prompt-start-mark - slime-repl-input-start-mark)) - (set markname (make-marker)) - (set-marker (symbol-value markname) (point)))) - -;;;;; REPL mode setup - -(defvar slime-repl-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map lisp-mode-map) - map)) - -(slime-define-keys slime-prefix-map - ("\C-z" 'slime-switch-to-output-buffer) - ("\M-p" 'slime-repl-set-package)) - -(slime-define-keys slime-mode-map - ("\C-c~" 'slime-sync-package-and-default-directory) - ("\C-c\C-y" 'slime-call-defun) - ("\C-c\C-j" 'slime-eval-last-expression-in-repl)) - -(slime-define-keys slime-connection-list-mode-map - ((kbd "RET") 'slime-goto-connection) - ([return] 'slime-goto-connection)) - -(slime-define-keys slime-repl-mode-map - ("\C-m" 'slime-repl-return) - ([return] 'slime-repl-return) - ("\C-j" 'slime-repl-newline-and-indent) - ("\C-\M-m" 'slime-repl-closing-return) - ([(control return)] 'slime-repl-closing-return) - ("\M-p" 'slime-repl-previous-input) - ((kbd "C-") 'slime-repl-backward-input) - ("\M-n" 'slime-repl-next-input) - ((kbd "C-") 'slime-repl-forward-input) - ("\M-r" 'slime-repl-previous-matching-input) - ("\M-s" 'slime-repl-next-matching-input) - ("\C-c\C-c" 'slime-interrupt) - (" " 'slime-space) - ((string slime-repl-shortcut-dispatch-char) 'slime-handle-repl-shortcut) - ("\C-c\C-o" 'slime-repl-clear-output) - ("\C-c\M-o" 'slime-repl-clear-buffer) - ("\C-c\C-u" 'slime-repl-kill-input) - ("\C-c\C-n" 'slime-repl-next-prompt) - ("\C-c\C-p" 'slime-repl-previous-prompt) - ("\C-c\C-z" 'slime-nop) - ("\C-cI" 'slime-repl-inspect) - ("\C-x\C-e" 'slime-eval-last-expression)) - -(slime-define-keys slime-inspector-mode-map - ((kbd "M-RET") 'slime-inspector-copy-down-to-repl)) - -(slime-define-keys sldb-mode-map - ("\C-y" 'sldb-insert-frame-call-to-repl) - ((kbd "M-RET") 'sldb-copy-down-to-repl)) - -(def-slime-selector-method ?r - "SLIME Read-Eval-Print-Loop." - (slime-output-buffer)) - -(define-minor-mode slime-repl-map-mode - "Minor mode which makes slime-repl-mode-map available. -\\{slime-repl-mode-map}" - nil - nil - slime-repl-mode-map) - -(defun slime-repl-mode () - "Major mode for interacting with a superior Lisp. -\\{slime-repl-mode-map}" - (interactive) - (kill-all-local-variables) - (setq major-mode 'slime-repl-mode) - (slime-editing-mode 1) - (slime-repl-map-mode 1) - (lisp-mode-variables t) - (set (make-local-variable 'lisp-indent-function) - 'common-lisp-indent-function) - (slime-setup-completion) - (set (make-local-variable 'tab-always-indent) 'complete) - (setq font-lock-defaults nil) - (setq mode-name "REPL") - (setq slime-current-thread :repl-thread) - (set (make-local-variable 'scroll-conservatively) 20) - (set (make-local-variable 'scroll-margin) 0) - (when slime-repl-history-file - (slime-repl-safe-load-history) - (add-hook 'kill-buffer-hook - 'slime-repl-safe-save-merged-history - 'append t)) - (add-hook 'kill-emacs-hook 'slime-repl-save-all-histories) - ;; At the REPL, we define beginning-of-defun and end-of-defun to be - ;; the start of the previous prompt or next prompt respectively. - ;; Notice the interplay with SLIME-REPL-BEGINNING-OF-DEFUN. - (set (make-local-variable 'beginning-of-defun-function) - 'slime-repl-mode-beginning-of-defun) - (set (make-local-variable 'end-of-defun-function) - 'slime-repl-mode-end-of-defun) - (run-mode-hooks 'slime-repl-mode-hook)) - -(defun slime-repl-buffer (&optional create connection) - "Get the REPL buffer for the current connection; optionally create." - (funcall (if create #'get-buffer-create #'get-buffer) - (format "*slime-repl %s*" (slime-connection-name connection)))) - -(defun slime-repl () - (interactive) - (slime-switch-to-output-buffer) - (current-buffer)) - -(defun slime-repl-mode-beginning-of-defun (&optional arg) - (if (and arg (< arg 0)) - (slime-repl-mode-end-of-defun (- arg)) - (dotimes (i (or arg 1)) - (slime-repl-previous-prompt)))) - -(defun slime-repl-mode-end-of-defun (&optional arg) - (if (and arg (< arg 0)) - (slime-repl-mode-beginning-of-defun (- arg)) - (dotimes (i (or arg 1)) - (slime-repl-next-prompt)))) - -(defun slime-repl-send-string (string &optional command-string) - (cond (slime-repl-read-mode - (slime-repl-return-string string)) - (t (slime-repl-eval-string string)))) - -(defun slime-repl-eval-string (string) - (slime-rex () - ((if slime-repl-auto-right-margin - `(swank-repl:listener-eval - ,string - :window-width - ,(with-current-buffer (slime-output-buffer) - (window-width))) - `(swank-repl:listener-eval ,string)) - (slime-lisp-package)) - ((:ok result) - (slime-repl-insert-result result)) - ((:abort condition) - (slime-repl-show-abort condition)))) - -(defun slime-repl-insert-result (result) - (with-current-buffer (slime-output-buffer) - (save-excursion - (when result - (slime-dcase result - ((:values &rest strings) - (cond ((null strings) - (slime-repl-emit-result "; No value\n" t)) - (t - (dolist (s strings) - (slime-repl-emit-result s t))))))) - (slime-repl-insert-prompt)) - (slime-repl-show-maximum-output))) - -(defun slime-repl-show-abort (condition) - (with-current-buffer (slime-output-buffer) - (save-excursion - (slime-save-marker slime-output-start - (slime-save-marker slime-output-end - (goto-char slime-output-end) - (insert-before-markers (format "; Evaluation aborted on %s.\n" - condition)) - (slime-repl-insert-prompt)))) - (slime-repl-show-maximum-output))) - -(defvar slime-repl-suppress-prompt nil - "Supresses Slime REPL prompt when bound to T.") - -(defun slime-repl-insert-prompt () - "Insert the prompt (before markers!). -Set point after the prompt. -Return the position of the prompt beginning. - -If `slime-repl-suppress-prompt' is true, does nothing and returns nil." - (goto-char slime-repl-input-start-mark) - (unless slime-repl-suppress-prompt - (slime-save-marker slime-output-start - (slime-save-marker slime-output-end - (unless (bolp) (insert-before-markers "\n")) - (let ((prompt-start (point)) - (prompt (format "%s> " (slime-lisp-package-prompt-string)))) - (slime-propertize-region - '(face slime-repl-prompt-face - read-only t slime-repl-prompt t - rear-nonsticky t front-sticky (read-only) - inhibit-line-move-field-capture t - field output) - (insert-before-markers prompt)) - (set-marker slime-repl-prompt-start-mark prompt-start) - (setq buffer-undo-list nil) - prompt-start))))) - -(defun slime-repl-show-maximum-output () - "Put the end of the buffer at the bottom of the window." - (when (eobp) - (let ((win (if (eq (window-buffer) (current-buffer)) - (selected-window) - (get-buffer-window (current-buffer) t)))) - (when win - (with-selected-window win - (set-window-point win (point-max)) - (recenter -1)))))) - -(defvar slime-repl-current-input-hooks) - -(defun slime-repl-current-input (&optional until-point-p) - "Return the current input as string. -The input is the region from after the last prompt to the end of -buffer." - (or (run-hook-with-args-until-success 'slime-repl-current-input-hooks - until-point-p) - (buffer-substring-no-properties (slime-repl-history-yank-start) - (if until-point-p - (point) - (point-max))))) - -(defun slime-property-position (text-property &optional object) - "Return the first position of TEXT-PROPERTY, or nil." - (if (get-text-property 0 text-property object) - 0 - (next-single-property-change 0 text-property object))) - -(defun slime-mark-input-start () - (set-marker slime-repl-input-start-mark (point) (current-buffer))) - -(defun slime-mark-output-start () - (set-marker slime-output-start (point)) - (set-marker slime-output-end (point))) - -(defun slime-mark-output-end () - ;; Don't put slime-repl-output-face again; it would remove the - ;; special presentation face, for instance in the SBCL inspector. - (add-text-properties slime-output-start slime-output-end - '(;;face slime-repl-output-face - rear-nonsticky (face)))) - -(defun slime-preserve-zmacs-region () - "In XEmacs, ensure that the zmacs-region stays active after this command." - (when (boundp 'zmacs-region-stays) - (set 'zmacs-region-stays t))) - -(defun slime-repl-in-input-area-p () - (<= slime-repl-input-start-mark (point))) - -(defun slime-repl-at-prompt-start-p () - ;; This will not work on non-current prompts. - (= (point) slime-repl-input-start-mark)) - -(defun slime-repl-beginning-of-defun () - "Move to beginning of defun." - (interactive) - ;; We call BEGINNING-OF-DEFUN if we're at the start of a prompt - ;; already, to trigger SLIME-REPL-MODE-BEGINNING-OF-DEFUN by means - ;; of the locally bound BEGINNING-OF-DEFUN-FUNCTION, in order to - ;; jump to the start of the previous prompt. - (if (and (not (slime-repl-at-prompt-start-p)) - (slime-repl-in-input-area-p)) - (goto-char slime-repl-input-start-mark) - (beginning-of-defun)) - t) - -;; FIXME: this looks very strange -(defun slime-repl-end-of-defun () - "Move to next of defun." - (interactive) - ;; C.f. SLIME-REPL-BEGINNING-OF-DEFUN. - (if (and (not (= (point) (point-max))) - (slime-repl-in-input-area-p)) - (goto-char (point-max)) - (end-of-defun)) - t) - -(defun slime-repl-previous-prompt () - "Move backward to the previous prompt." - (interactive) - (slime-repl-find-prompt t)) - -(defun slime-repl-next-prompt () - "Move forward to the next prompt." - (interactive) - (slime-repl-find-prompt)) - -(defun slime-repl-find-prompt (&optional backward) - (let ((origin (point)) - (prop 'slime-repl-prompt)) - (while (progn - (slime-search-property-change prop backward) - (not (or (slime-end-of-proprange-p prop) (bobp) (eobp))))) - (unless (slime-end-of-proprange-p prop) - (goto-char origin)))) - -(defun slime-search-property-change (prop &optional backward) - (cond (backward - (goto-char (or (previous-single-char-property-change (point) prop) - (point-min)))) - (t - (goto-char (or (next-single-char-property-change (point) prop) - (point-max)))))) - -(defun slime-end-of-proprange-p (property) - (and (get-char-property (max 1 (1- (point))) property) - (not (get-char-property (point) property)))) - -(defvar slime-repl-return-hooks) - -(defun slime-repl-return (&optional end-of-input) - "Evaluate the current input string, or insert a newline. -Send the current input only if a whole expression has been entered, -i.e. the parenthesis are matched. - -With prefix argument send the input even if the parenthesis are not -balanced." - (interactive "P") - (slime-check-connected) - (cond (end-of-input - (slime-repl-send-input)) - (slime-repl-read-mode ; bad style? - (slime-repl-send-input t)) - ((and (get-text-property (point) 'slime-repl-old-input) - (< (point) slime-repl-input-start-mark)) - (slime-repl-grab-old-input end-of-input) - (slime-repl-recenter-if-needed)) - ((run-hook-with-args-until-success 'slime-repl-return-hooks end-of-input)) - ((slime-input-complete-p slime-repl-input-start-mark (point-max)) - (slime-repl-send-input t)) - (t - (slime-repl-newline-and-indent) - (message "[input not complete]")))) - -(defun slime-repl-recenter-if-needed () - "Make sure that (point) is visible." - (unless (pos-visible-in-window-p (point-max)) - (save-excursion - (goto-char (point-max)) - (recenter -1)))) - -(defun slime-repl-send-input (&optional newline) - "Goto to the end of the input and send the current input. -If NEWLINE is true then add a newline at the end of the input." - (unless (slime-repl-in-input-area-p) - (error "No input at point.")) - (goto-char (point-max)) - (let ((end (point))) ; end of input, without the newline - (slime-repl-add-to-input-history - (buffer-substring slime-repl-input-start-mark end)) - (when newline - (insert "\n") - (slime-repl-show-maximum-output)) - (let ((inhibit-modification-hooks t)) - (add-text-properties slime-repl-input-start-mark - (point) - `(slime-repl-old-input - ,(incf slime-repl-old-input-counter)))) - (let ((overlay (make-overlay slime-repl-input-start-mark end))) - ;; These properties are on an overlay so that they won't be taken - ;; by kill/yank. - (overlay-put overlay 'face 'slime-repl-input-face))) - (let ((input (slime-repl-current-input))) - (goto-char (point-max)) - (slime-mark-input-start) - (slime-mark-output-start) - (slime-repl-send-string input))) - -(defun slime-repl-grab-old-input (replace) - "Resend the old REPL input at point. -If replace is non-nil the current input is replaced with the old -input; otherwise the new input is appended. The old input has the -text property `slime-repl-old-input'." - (multiple-value-bind (beg end) (slime-property-bounds 'slime-repl-old-input) - (let ((old-input (buffer-substring beg end)) ;;preserve - ;;properties, they will be removed later - (offset (- (point) beg))) - ;; Append the old input or replace the current input - (cond (replace (goto-char slime-repl-input-start-mark)) - (t (goto-char (point-max)) - (unless (eq (char-before) ?\ ) - (insert " ")))) - (delete-region (point) (point-max)) - (save-excursion - (insert old-input) - (when (equal (char-before) ?\n) - (delete-char -1))) - (forward-char offset)))) - -(defun slime-repl-closing-return () - "Evaluate the current input string after closing all open lists." - (interactive) - (goto-char (point-max)) - (save-restriction - (narrow-to-region slime-repl-input-start-mark (point)) - (while (ignore-errors (save-excursion (backward-up-list 1)) t) - (insert ")"))) - (slime-repl-return)) - -(defun slime-repl-newline-and-indent () - "Insert a newline, then indent the next line. -Restrict the buffer from the prompt for indentation, to avoid being -confused by strange characters (like unmatched quotes) appearing -earlier in the buffer." - (interactive) - (save-restriction - (narrow-to-region slime-repl-prompt-start-mark (point-max)) - (insert "\n") - (lisp-indent-line))) - -(defun slime-repl-delete-current-input () - "Delete all text from the prompt." - (interactive) - (delete-region (slime-repl-history-yank-start) (point-max))) - -(defun slime-eval-last-expression-in-repl (prefix) - "Evaluates last expression in the Slime REPL. - -Switches REPL to current package of the source buffer for the duration. If -used with a prefix argument (C-u), doesn't switch back afterwards." - (interactive "P") - (let ((expr (slime-last-expression)) - (buffer-name (buffer-name (current-buffer))) - (new-package (slime-current-package)) - (old-package (slime-lisp-package)) - (slime-repl-suppress-prompt t) - (yank-back nil)) - (with-current-buffer (slime-output-buffer) - (unless (eq (current-buffer) (window-buffer)) - (pop-to-buffer (current-buffer) t)) - (goto-char (point-max)) - ;; Kill pending input in the REPL - (when (< (marker-position slime-repl-input-start-mark) (point)) - (kill-region slime-repl-input-start-mark (point)) - (setq yank-back t)) - (unwind-protect - (progn - (insert-before-markers (format "\n;;; from %s\n" buffer-name)) - (when new-package - (slime-repl-set-package new-package)) - (let ((slime-repl-suppress-prompt nil)) - (slime-repl-insert-prompt)) - (insert expr) - (slime-repl-return)) - (unless (or prefix (equal (slime-lisp-package) old-package)) - ;; Switch back. - (slime-repl-set-package old-package) - (let ((slime-repl-suppress-prompt nil)) - (slime-repl-insert-prompt)))) - ;; Put pending input back. - (when yank-back - (yank))))) - -(defun slime-repl-kill-input () - "Kill all text from the prompt to point." - (interactive) - (cond ((< (marker-position slime-repl-input-start-mark) (point)) - (kill-region slime-repl-input-start-mark (point))) - ((= (point) (marker-position slime-repl-input-start-mark)) - (slime-repl-delete-current-input)))) - -(defun slime-repl-replace-input (string) - (slime-repl-delete-current-input) - (insert-and-inherit string)) - -(defun slime-repl-input-line-beginning-position () - (save-excursion - (goto-char slime-repl-input-start-mark) - (let ((inhibit-field-text-motion t)) - (line-beginning-position)))) - -(defun slime-clear-repl-variables () - (interactive) - (slime-eval-async `(swank-repl:clear-repl-variables))) - -(defvar slime-repl-clear-buffer-hook) - -(add-hook 'slime-repl-clear-buffer-hook 'slime-clear-repl-variables) - -(defun slime-repl-clear-buffer () - "Delete the output generated by the Lisp process." - (interactive) - (let ((inhibit-read-only t)) - (delete-region (point-min) slime-repl-prompt-start-mark) - (delete-region slime-output-start slime-output-end) - (when (< (point) slime-repl-input-start-mark) - (goto-char slime-repl-input-start-mark)) - (recenter t)) - (run-hooks 'slime-repl-clear-buffer-hook)) - -(defun slime-repl-clear-output () - "Delete the output inserted since the last input." - (interactive) - (let ((start (save-excursion - (when (>= (point) slime-repl-input-start-mark) - (goto-char slime-repl-input-start-mark)) - (slime-repl-previous-prompt) - (ignore-errors (forward-sexp)) - (forward-line) - (point))) - (end (1- (slime-repl-input-line-beginning-position)))) - (when (< start end) - (let ((inhibit-read-only t)) - (delete-region start end) - (save-excursion - (goto-char start) - (insert ";;; output flushed")))))) - -(defun slime-repl-set-package (package) - "Set the package of the REPL buffer to PACKAGE." - (interactive (list (let* ((p (slime-current-package)) - (p (and p (slime-pretty-package-name p))) - (p (and (not (equal p (slime-lisp-package))) p))) - (slime-read-package-name "Package: " p)))) - (with-current-buffer (slime-output-buffer) - (let ((previouse-point (- (point) slime-repl-input-start-mark)) - (previous-prompt (slime-lisp-package-prompt-string))) - (destructuring-bind (name prompt-string) - (slime-repl-shortcut-eval `(swank:set-package ,package)) - (setf (slime-lisp-package) name) - (setf slime-buffer-package name) - (unless (equal previous-prompt prompt-string) - (setf (slime-lisp-package-prompt-string) prompt-string) - (slime-repl-insert-prompt)) - (when (plusp previouse-point) - (goto-char (+ previouse-point slime-repl-input-start-mark))))))) - - -;;;;; History - -(defcustom slime-repl-wrap-history nil - "*T to wrap history around when the end is reached." - :type 'boolean - :group 'slime-repl) - -(make-variable-buffer-local - (defvar slime-repl-input-history '() - "History list of strings read from the REPL buffer.")) - -(defun slime-repl-add-to-input-history (string) - "Add STRING to the input history. -Empty strings and duplicates are ignored." - (setq string (slime-trim-whitespace string)) - (unless (equal string "") - (setq slime-repl-input-history - (remove string slime-repl-input-history)) - (unless (equal string (car slime-repl-input-history)) - (push string slime-repl-input-history)))) - -;; These two vars contain the state of the last history search. We -;; only use them if `last-command' was 'slime-repl-history-replace, -;; otherwise we reinitialize them. - -(defvar slime-repl-input-history-position -1 - "Newer items have smaller indices.") - -(defvar slime-repl-history-pattern nil - "The regexp most recently used for finding input history.") - -(defun slime-repl-history-replace (direction &optional regexp) - "Replace the current input with the next line in DIRECTION. -DIRECTION is 'forward' or 'backward' (in the history list). -If REGEXP is non-nil, only lines matching REGEXP are considered." - (setq slime-repl-history-pattern regexp) - (let* ((min-pos -1) - (max-pos (length slime-repl-input-history)) - (pos0 (cond ((slime-repl-history-search-in-progress-p) - slime-repl-input-history-position) - (t min-pos))) - (pos (slime-repl-position-in-history pos0 direction (or regexp "") - (slime-repl-current-input))) - (msg nil)) - (cond ((and (< min-pos pos) (< pos max-pos)) - (slime-repl-replace-input (nth pos slime-repl-input-history)) - (setq msg (format "History item: %d" pos))) - ((not slime-repl-wrap-history) - (setq msg (cond ((= pos min-pos) "End of history") - ((= pos max-pos) "Beginning of history")))) - (slime-repl-wrap-history - (setq pos (if (= pos min-pos) max-pos min-pos)) - (setq msg "Wrapped history"))) - (when (or (<= pos min-pos) (<= max-pos pos)) - (when regexp - (setq msg (concat msg "; no matching item")))) - ;;(message "%s [%d %d %s]" msg start-pos pos regexp) - (message "%s%s" msg (cond ((not regexp) "") - (t (format "; current regexp: %s" regexp)))) - (setq slime-repl-input-history-position pos) - (setq this-command 'slime-repl-history-replace))) - -(defun slime-repl-history-search-in-progress-p () - (eq last-command 'slime-repl-history-replace)) - -(defun slime-repl-terminate-history-search () - (setq last-command this-command)) - -(defun slime-repl-position-in-history (start-pos direction regexp - &optional exclude-string) - "Return the position of the history item matching REGEXP. -Return -1 resp. the length of the history if no item matches. -If EXCLUDE-STRING is specified then it's excluded from the search." - ;; Loop through the history list looking for a matching line - (let* ((step (ecase direction - (forward -1) - (backward 1))) - (history slime-repl-input-history) - (len (length history))) - (loop for pos = (+ start-pos step) then (+ pos step) - if (< pos 0) return -1 - if (<= len pos) return len - for history-item = (nth pos history) - if (and (string-match regexp history-item) - (not (equal history-item exclude-string))) - return pos))) - -(defun slime-repl-previous-input () - "Cycle backwards through input history. -If the `last-command' was a history navigation command use the -same search pattern for this command. -Otherwise use the current input as search pattern. - -With a prefix-arg, do replacement from the mark." - (interactive) - (let ((slime-repl-history-use-mark (or slime-repl-history-use-mark - current-prefix-arg))) - (slime-repl-history-replace 'backward (slime-repl-history-pattern t)))) - -(defun slime-repl-next-input () - "Cycle forwards through input history. -See `slime-repl-previous-input'. - -With a prefix-arg, do replacement from the mark." - (interactive) - (let ((slime-repl-history-use-mark (or slime-repl-history-use-mark - current-prefix-arg))) - (slime-repl-history-replace 'forward (slime-repl-history-pattern t)))) - -(defun slime-repl-forward-input () - "Cycle forwards through input history." - (interactive) - (slime-repl-history-replace 'forward (slime-repl-history-pattern))) - -(defun slime-repl-backward-input () - "Cycle backwards through input history." - (interactive) - (slime-repl-history-replace 'backward (slime-repl-history-pattern))) - -(defun slime-repl-previous-matching-input (regexp) - "Insert the previous matching input. - -With a prefix-arg, do the insertion at the mark." - (interactive (list (slime-read-from-minibuffer - "Previous element matching (regexp): "))) - (slime-repl-terminate-history-search) - (let ((slime-repl-history-use-mark (or slime-repl-history-use-mark - current-prefix-arg))) - (slime-repl-history-replace 'backward regexp))) - -(defun slime-repl-next-matching-input (regexp) - "Insert the next matching input. - -With a prefix-arg, do the insertion at the mark." - (interactive (list (slime-read-from-minibuffer - "Next element matching (regexp): "))) - (slime-repl-terminate-history-search) - (let ((slime-repl-history-use-mark (or slime-repl-history-use-mark - current-prefix-arg))) - (slime-repl-history-replace 'forward regexp))) - -(defun slime-repl-history-pattern (&optional use-current-input) - "Return the regexp for the navigation commands." - (cond ((slime-repl-history-search-in-progress-p) - slime-repl-history-pattern) - (use-current-input - (goto-char (max (slime-repl-history-yank-start) (point))) - (let ((str (slime-repl-current-input t))) - (cond ((string-match "^[ \t\n]*$" str) nil) - (t (concat "^" (regexp-quote str)))))) - (t nil))) - -(defun slime-repl-delete-from-input-history (string) - "Delete STRING from the repl input history. - -When string is not provided then clear the current repl input and -use it as an input. This is useful to get rid of unwanted repl -history entries while navigating the repl history." - (interactive (list (slime-repl-current-input))) - (let ((merged-history - (slime-repl-merge-histories (slime-repl-read-history nil t) - slime-repl-input-history))) - (setq slime-repl-input-history - (cl-delete string merged-history :test #'string=)) - (slime-repl-save-history)) - (slime-repl-delete-current-input)) - -;;;;; Persistent History - -(defun slime-repl-merge-histories (old-hist new-hist) - "Merge entries from OLD-HIST and NEW-HIST." - ;; Newer items in each list are at the beginning. - (let* ((ht (make-hash-table :test #'equal)) - (test (lambda (entry) - (or (gethash entry ht) - (progn (setf (gethash entry ht) t) - nil))))) - (append (cl-remove-if test new-hist) - (cl-remove-if test old-hist)))) - -(defun slime-repl-load-history (&optional filename) - "Set the current SLIME REPL history. -It can be read either from FILENAME or `slime-repl-history-file' or -from a user defined filename." - (interactive (list (slime-repl-read-history-filename))) - (let ((file (or filename slime-repl-history-file))) - (setq slime-repl-input-history (slime-repl-read-history file t)))) - -(defun slime-repl-read-history (&optional filename noerrer) - "Read and return the history from FILENAME. -The default value for FILENAME is `slime-repl-history-file'. -If NOERROR is true return and the file doesn't exits return nil." - (let ((file (or filename slime-repl-history-file))) - (cond ((not (file-readable-p file)) '()) - (t (with-temp-buffer - (insert-file-contents file) - (read (current-buffer))))))) - -(defun slime-repl-read-history-filename () - (read-file-name "Use SLIME REPL history from file: " - slime-repl-history-file)) - -(defun slime-repl-save-merged-history (&optional filename) - "Read the history file, merge the current REPL history and save it. -This tries to be smart in merging the history from the file and the -current history in that it tries to detect the unique entries using -`slime-repl-merge-histories'." - (interactive (list (slime-repl-read-history-filename))) - (let ((file (or filename slime-repl-history-file))) - (with-temp-message "saving history..." - (let ((hist (slime-repl-merge-histories (slime-repl-read-history file t) - slime-repl-input-history))) - (slime-repl-save-history file hist))))) - -(defun slime-repl-save-history (&optional filename history) - "Simply save the current SLIME REPL history to a file. -When SLIME is setup to always load the old history and one uses only -one instance of slime all the time, there is no need to merge the -files and this function is sufficient. - -When the list is longer than `slime-repl-history-size' it will be -truncated. That part is untested, though!" - (interactive (list (slime-repl-read-history-filename))) - (let ((file (or filename slime-repl-history-file)) - (hist (or history slime-repl-input-history))) - (unless (file-writable-p file) - (error (format "History file not writable: %s" file))) - (let ((hist (cl-subseq hist 0 (min (length hist) slime-repl-history-size)))) - ;;(message "saving %s to %s\n" hist file) - (with-temp-file file - (let ((cs slime-repl-history-file-coding-system) - (print-length nil) (print-level nil)) - (setq buffer-file-coding-system cs) - (insert (format ";; -*- coding: %s -*-\n" cs)) - (insert ";; History for SLIME REPL. Automatically written.\n" - ";; Edit only if you know what you're doing\n") - (prin1 (mapcar #'substring-no-properties hist) (current-buffer))))))) - -(defun slime-repl-save-all-histories () - "Save the history in each repl buffer." - (dolist (b (buffer-list)) - (with-current-buffer b - (when (eq major-mode 'slime-repl-mode) - (slime-repl-safe-save-merged-history))))) - -(defun slime-repl-safe-save-merged-history () - (slime-repl-call-with-handler - #'slime-repl-save-merged-history - "%S while saving the history. Continue? ")) - -(defun slime-repl-safe-load-history () - (slime-repl-call-with-handler - #'slime-repl-load-history - "%S while loading the history. Continue? ")) - -(defun slime-repl-call-with-handler (fun query) - "Call FUN in the context of an error handler. -The handler will use qeuery to ask the use if the error should be ingored." - (condition-case err - (funcall fun) - (error - (if (y-or-n-p (format query (error-message-string err))) - nil - (signal (car err) (cdr err)))))) - - -;;;;; REPL Read Mode - -(defvar slime-repl-read-mode-map - (let ((map (make-sparse-keymap))) - (define-key map "\C-m" 'slime-repl-return) - (define-key map [return] 'slime-repl-return) - (define-key map (kbd "TAB") 'self-insert-command) - (define-key map "\C-c\C-b" 'slime-repl-read-break) - (define-key map "\C-c\C-c" 'slime-repl-read-break) - (define-key map [remap slime-indent-and-complete-symbol] 'ignore) - (define-key map [remap slime-handle-repl-shortcut] 'self-insert-command) - map)) - -(define-minor-mode slime-repl-read-mode - "Mode to read input from Emacs -\\{slime-repl-read-mode-map}" - nil - "[read]") - -(make-variable-buffer-local - (defvar slime-read-string-threads nil)) - -(make-variable-buffer-local - (defvar slime-read-string-tags nil)) - -(defun slime-repl-read-string (thread tag) - (slime-switch-to-output-buffer) - (push thread slime-read-string-threads) - (push tag slime-read-string-tags) - (goto-char (point-max)) - (slime-mark-output-end) - (slime-mark-input-start) - (slime-repl-read-mode 1)) - -(defun slime-repl-return-string (string) - (slime-dispatch-event `(:emacs-return-string - ,(pop slime-read-string-threads) - ,(pop slime-read-string-tags) - ,string)) - (slime-repl-read-mode -1)) - -(defun slime-repl-read-break () - (interactive) - (slime-dispatch-event `(:emacs-interrupt ,(car slime-read-string-threads)))) - -(defun slime-repl-abort-read (thread tag) - (with-current-buffer (slime-output-buffer) - (pop slime-read-string-threads) - (pop slime-read-string-tags) - (slime-repl-read-mode -1) - (message "Read aborted"))) - - -;;;;; REPL handlers - -(cl-defstruct (slime-repl-shortcut (:conc-name slime-repl-shortcut.)) - symbol names handler one-liner) - -(defvar slime-repl-shortcut-table nil - "A list of slime-repl-shortcuts") - -(defvar slime-repl-shortcut-history '() - "History list of shortcut command names.") - -(defvar slime-within-repl-shortcut-handler-p nil - "Bound to T if we're in a REPL shortcut handler invoked from the REPL.") - -(defun slime-handle-repl-shortcut () - (interactive) - (if (> (point) slime-repl-input-start-mark) - (insert (string slime-repl-shortcut-dispatch-char)) - (let ((shortcut (slime-lookup-shortcut - (completing-read "Command: " - (slime-bogus-completion-alist - (slime-list-all-repl-shortcuts)) - nil t nil - 'slime-repl-shortcut-history)))) - (with-struct (slime-repl-shortcut. handler) shortcut - (let ((slime-within-repl-shortcut-handler-p t)) - (call-interactively handler)))))) - -(defun slime-list-all-repl-shortcuts () - (loop for shortcut in slime-repl-shortcut-table - append (slime-repl-shortcut.names shortcut))) - -(defun slime-lookup-shortcut (name) - (cl-find-if (lambda (s) (member name (slime-repl-shortcut.names s))) - slime-repl-shortcut-table)) - -(defmacro defslime-repl-shortcut (elisp-name names &rest options) - "Define a new repl shortcut. ELISP-NAME is a symbol specifying -the name of the interactive function to create, or NIL if no -function should be created. - -NAMES is a list of \(full-name . aliases\). - -OPTIONS is an plist specifying the handler doing the actual work -of the shortcut \(`:handler'\), and a help text \(`:one-liner'\)." - `(progn - ,(when elisp-name - `(defun ,elisp-name () - (interactive) - (call-interactively ,(second (assoc :handler options))))) - (let ((new-shortcut (make-slime-repl-shortcut - :symbol ',elisp-name - :names (list ,@names) - ,@(apply #'append options)))) - (setq slime-repl-shortcut-table - (cl-remove-if (lambda (s) - (member ',(car names) (slime-repl-shortcut.names s))) - slime-repl-shortcut-table)) - (push new-shortcut slime-repl-shortcut-table) - ',elisp-name))) - -(defun slime-repl-shortcut-eval (sexp &optional package) - "This function should be used by REPL shortcut handlers instead -of `slime-eval' to evaluate their final expansion. (This -expansion will be added to the REPL's history.)" - (when slime-within-repl-shortcut-handler-p ; were we invoked via ,foo? - (slime-repl-add-to-input-history (prin1-to-string sexp))) - (slime-eval sexp package)) - -(defun slime-repl-shortcut-eval-async (sexp &optional cont package) - "This function should be used by REPL shortcut handlers instead -of `slime-eval-async' to evaluate their final expansion. (This -expansion will be added to the REPL's history.)" - (when slime-within-repl-shortcut-handler-p ; were we invoked via ,foo? - (slime-repl-add-to-input-history (prin1-to-string sexp))) - (slime-eval-async sexp cont package)) - -(defun slime-list-repl-short-cuts () - (interactive) - (slime-with-popup-buffer ((slime-buffer-name :repl-help)) - (let ((table (cl-sort (cl-copy-list slime-repl-shortcut-table) #'string< - :key (lambda (x) - (car (slime-repl-shortcut.names x)))))) - (save-excursion - (dolist (shortcut table) - (let ((names (slime-repl-shortcut.names shortcut))) - (insert (pop names)) ;; first print the "full" name - (when names - ;; we also have aliases - (insert " (aka ") - (while (cdr names) - (insert (pop names) ", ")) - (insert (car names) ")")) - (when (slime-repl-shortcut.one-liner shortcut) - (insert "\n " (slime-repl-shortcut.one-liner shortcut))) - (insert "\n"))))))) - -(defun slime-save-some-lisp-buffers () - (if slime-repl-only-save-lisp-buffers - (save-some-buffers nil (lambda () - (and (memq major-mode slime-lisp-modes) - (not (null buffer-file-name))))) - (save-some-buffers))) - -(defun slime-kill-all-buffers () - "Kill all the SLIME-related buffers." - (dolist (buf (buffer-list)) - (when (or (string= (buffer-name buf) slime-event-buffer-name) - (string-match "^\\*inferior-lisp*" (buffer-name buf)) - (string-match "^\\*slime-repl .*\\*$" (buffer-name buf)) - (string-match "^\\*sldb .*\\*$" (buffer-name buf)) - (string-match "^\\*SLIME.*\\*$" (buffer-name buf))) - (kill-buffer buf)))) - -(defslime-repl-shortcut slime-repl-shortcut-help ("help") - (:handler 'slime-list-repl-short-cuts) - (:one-liner "Display the help.")) - -(defslime-repl-shortcut nil ("change-directory" "!d" "cd") - (:handler 'slime-set-default-directory) - (:one-liner "Change the current directory.")) - -(defslime-repl-shortcut nil ("pwd") - (:handler (lambda () - (interactive) - (let ((dir (slime-eval `(swank:default-directory)))) - (message "Directory %s" dir)))) - (:one-liner "Show the current directory.")) - -(defslime-repl-shortcut slime-repl-push-directory - ("push-directory" "+d" "pushd") - (:handler (lambda (directory) - (interactive - (list (read-directory-name - "Push directory: " - (slime-eval '(swank:default-directory)) - nil nil ""))) - (push (slime-eval '(swank:default-directory)) - slime-repl-directory-stack) - (slime-set-default-directory directory))) - (:one-liner "Save the current directory and set it to a new one.")) - -(defslime-repl-shortcut slime-repl-pop-directory - ("pop-directory" "-d" "popd") - (:handler (lambda () - (interactive) - (if (null slime-repl-directory-stack) - (message "Directory stack is empty.") - (slime-set-default-directory - (pop slime-repl-directory-stack))))) - (:one-liner "Restore the last saved directory.")) - -(defslime-repl-shortcut nil ("change-package" "!p" "in-package" "in") - (:handler 'slime-repl-set-package) - (:one-liner "Change the current package.")) - -(defslime-repl-shortcut slime-repl-push-package ("push-package" "+p") - (:handler (lambda (package) - (interactive (list (slime-read-package-name "Package: "))) - (push (slime-lisp-package) slime-repl-package-stack) - (slime-repl-set-package package))) - (:one-liner "Save the current package and set it to a new one.")) - -(defslime-repl-shortcut slime-repl-pop-package ("pop-package" "-p") - (:handler (lambda () - (interactive) - (if (null slime-repl-package-stack) - (message "Package stack is empty.") - (slime-repl-set-package - (pop slime-repl-package-stack))))) - (:one-liner "Restore the last saved package.")) - -(defslime-repl-shortcut slime-repl-resend ("resend-form") - (:handler (lambda () - (interactive) - (insert (car slime-repl-input-history)) - (insert "\n") - (slime-repl-send-input))) - (:one-liner "Resend the last form.")) - -(defslime-repl-shortcut slime-repl-disconnect ("disconnect") - (:handler 'slime-disconnect) - (:one-liner "Disconnect the current connection.")) - -(defslime-repl-shortcut slime-repl-disconnect-all ("disconnect-all") - (:handler 'slime-disconnect-all) - (:one-liner "Disconnect all connections.")) - -(defslime-repl-shortcut slime-repl-sayoonara ("sayoonara") - (:handler (lambda () - (interactive) - (when (slime-connected-p) - (slime-quit-lisp)) - (slime-kill-all-buffers))) - (:one-liner "Quit all Lisps and close all SLIME buffers.")) - -(defslime-repl-shortcut slime-repl-quit ("quit") - (:handler (lambda () - (interactive) - ;; `slime-quit-lisp' determines the connection to quit - ;; on behalf of the REPL's `slime-buffer-connection'. - (let ((repl-buffer (slime-output-buffer))) - (slime-quit-lisp) - (kill-buffer repl-buffer)))) - (:one-liner "Quit the current Lisp.")) - -(defslime-repl-shortcut slime-repl-defparameter ("defparameter" "!") - (:handler (lambda (name value) - (interactive (list (slime-read-symbol-name "Name (symbol): " t) - (slime-read-from-minibuffer "Value: " "*"))) - (insert "(cl:defparameter " name " " value - " \"REPL generated global variable.\")") - (slime-repl-send-input t))) - (:one-liner "Define a new global, special, variable.")) - -(defslime-repl-shortcut slime-repl-compile-and-load ("compile-and-load" "cl") - (:handler (lambda (filename) - (interactive (list (expand-file-name - (read-file-name "File: " nil nil nil nil)))) - (slime-save-some-lisp-buffers) - (slime-repl-shortcut-eval-async - `(swank:compile-file-if-needed - ,(slime-to-lisp-filename filename) t) - #'slime-compilation-finished))) - (:one-liner "Compile (if neccessary) and load a lisp file.")) - -(defslime-repl-shortcut nil ("restart-inferior-lisp") - (:handler 'slime-restart-inferior-lisp) - (:one-liner "Restart *inferior-lisp* and reconnect SLIME.")) - -(defun slime-redirect-inferior-output (&optional noerror) - "Redirect output of the inferior-process to the REPL buffer." - (interactive) - (let ((proc (slime-inferior-process))) - (cond (proc - (let ((filter (slime-rcurry #'slime-inferior-output-filter - (slime-current-connection)))) - (set-process-filter proc filter))) - (noerror) - (t (error "No inferior lisp process"))))) - -(defun slime-inferior-output-filter (proc string conn) - (cond ((eq (process-status conn) 'closed) - (message "Connection closed. Removing inferior output filter.") - (message "Lost output: %S" string) - (set-process-filter proc nil)) - (t - (slime-output-filter conn string)))) - -(defun slime-redirect-trace-output () - "Redirect the trace output to a separate Emacs buffer." - (interactive) - (let ((buffer (get-buffer-create (slime-buffer-name :trace)))) - (with-current-buffer buffer - (let ((marker (copy-marker (buffer-size))) - (target (incf slime-last-output-target-id))) - (puthash target marker slime-output-target-to-marker) - (slime-eval `(swank-repl:redirect-trace-output ,target)))) - ;; Note: We would like the entries in - ;; slime-output-target-to-marker to disappear when the buffers are - ;; killed. We cannot just make the hash-table ":weakness 'value" - ;; -- there is no reference from the buffers to the markers in the - ;; buffer, so entries would disappear even though the buffers are - ;; alive. Best solution might be to make buffer-local variables - ;; that keep the markers. --mkoeppe - (pop-to-buffer buffer))) - -(defun slime-call-defun () - "Insert a call to the toplevel form defined around point into the REPL." - (interactive) - (cl-labels ((insert-call - (name &key (function t) - defclass) - (let* ((setf (and function - (consp name) - (= (length name) 2) - (eql (car name) 'setf))) - (symbol (if setf - (cadr name) - name)) - (qualified-symbol-name - (slime-qualify-cl-symbol-name symbol)) - (symbol-name (slime-cl-symbol-name qualified-symbol-name)) - (symbol-package (slime-cl-symbol-package - qualified-symbol-name)) - (call (if (cl-equalp (slime-lisp-package) symbol-package) - symbol-name - qualified-symbol-name))) - (slime-switch-to-output-buffer) - (goto-char slime-repl-input-start-mark) - (insert (if function - "(" - " ")) - (when setf - (insert "setf (")) - (if defclass - (insert "make-instance '")) - (insert call) - (cond (setf - (insert " ") - (save-excursion (insert ") )"))) - (function - (insert " ") - (save-excursion (insert ")")))) - (unless function - (goto-char slime-repl-input-start-mark))))) - (let ((toplevel (slime-parse-toplevel-form))) - (if (symbolp toplevel) - (error "Not in a function definition") - (slime-dcase toplevel - (((:defun :defgeneric :defmacro :define-compiler-macro) symbol) - (insert-call symbol)) - ((:defmethod symbol &rest args) - (declare (ignore args)) - (insert-call symbol)) - (((:defparameter :defvar :defconstant) symbol) - (insert-call symbol :function nil)) - (((:defclass) symbol) - (insert-call symbol :defclass t)) - (t - (error "Not in a function definition"))))))) - -(defun slime-repl-copy-down-to-repl (slimefun &rest args) - (slime-eval-async `(swank-repl:listener-save-value ',slimefun ,@args) - #'(lambda (_ignored) - (with-current-buffer (slime-repl) - (slime-eval-async '(swank-repl:listener-get-value) - #'(lambda (_ignored) - (slime-repl-insert-prompt))))))) - -(defun slime-inspector-copy-down-to-repl (number) - "Evaluate the inspector slot at point via the REPL (to set `*')." - (interactive (list (or (get-text-property (point) 'slime-part-number) - (error "No part at point")))) - (slime-repl-copy-down-to-repl 'swank:inspector-nth-part number)) - -(defun sldb-copy-down-to-repl (frame-id var-id) - "Evaluate the frame var at point via the REPL (to set `*')." - (interactive (list (sldb-frame-number-at-point) (sldb-var-number-at-point))) - (slime-repl-copy-down-to-repl 'swank/backend:frame-var-value frame-id var-id)) - -(defun sldb-insert-frame-call-to-repl () - "Insert a call to a frame at point." - (interactive) - (let ((call (slime-eval `(swank/backend::frame-call - ,(sldb-frame-number-at-point))))) - (slime-switch-to-output-buffer) - (if (>= (point) slime-repl-prompt-start-mark) - (insert call) - (save-excursion - (goto-char (point-max)) - (insert call)))) - (slime-repl)) - -(defun slime-set-default-directory (directory) - "Make DIRECTORY become Lisp's current directory." - (interactive (list (read-directory-name "Directory: " nil nil t))) - (let ((dir (expand-file-name directory))) - (message "default-directory: %s" - (slime-from-lisp-filename - (slime-repl-shortcut-eval `(swank:set-default-directory - ,(slime-to-lisp-filename dir))))) - (with-current-buffer (slime-output-buffer) - (setq default-directory dir)))) - -(defun slime-sync-package-and-default-directory () - "Set Lisp's package and directory to the values in current buffer." - (interactive) - (let* ((package (slime-current-package)) - (exists-p (or (null package) - (slime-eval `(cl:packagep - (swank::guess-package ,package))))) - (directory default-directory)) - (when (and package exists-p) - (slime-repl-set-package package)) - (slime-set-default-directory directory) - ;; Sync *inferior-lisp* dir - (let* ((proc (slime-process)) - (buffer (and proc (process-buffer proc)))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (setq default-directory directory)))) - (message "package: %s%s directory: %s" - (with-current-buffer (slime-output-buffer) - (slime-lisp-package)) - (if exists-p "" (format " (package %s doesn't exist)" package)) - directory))) - -(defun slime-goto-connection () - "Switch to the REPL buffer for the connection at point." - (interactive) - (let ((slime-dispatching-connection (slime-connection-at-point))) - (switch-to-buffer (slime-output-buffer)))) - -(defun slime-repl-inside-string-or-comment-p () - (save-restriction - (when (and (boundp 'slime-repl-input-start-mark) - slime-repl-input-start-mark - (>= (point) slime-repl-input-start-mark)) - (narrow-to-region slime-repl-input-start-mark (point))) - (slime-inside-string-or-comment-p))) - -(defvar slime-repl-easy-menu - (let ((C '(slime-connected-p))) - `("REPL" - [ "Send Input" slime-repl-return ,C ] - [ "Close and Send Input " slime-repl-closing-return ,C ] - [ "Interrupt Lisp process" slime-interrupt ,C ] - "--" - [ "Previous Input" slime-repl-previous-input t ] - [ "Next Input" slime-repl-next-input t ] - [ "Goto Previous Prompt " slime-repl-previous-prompt t ] - [ "Goto Next Prompt " slime-repl-next-prompt t ] - [ "Clear Last Output" slime-repl-clear-output t ] - [ "Clear Buffer " slime-repl-clear-buffer t ] - [ "Kill Current Input" slime-repl-kill-input t ]))) - -(defun slime-repl-add-easy-menu () - (easy-menu-define menubar-slime-repl slime-repl-mode-map - "REPL" slime-repl-easy-menu) - (easy-menu-define menubar-slime slime-repl-mode-map - "SLIME" slime-easy-menu) - (easy-menu-add slime-repl-easy-menu 'slime-repl-mode-map)) - -(add-hook 'slime-repl-mode-hook 'slime-repl-add-easy-menu) - -(defun slime-hide-inferior-lisp-buffer () - "Display the REPL buffer instead of the *inferior-lisp* buffer." - (let* ((buffer (if (slime-process) - (process-buffer (slime-process)))) - (window (if buffer (get-buffer-window buffer t))) - (repl-buffer (slime-output-buffer t)) - (repl-window (get-buffer-window repl-buffer))) - (when buffer - (bury-buffer buffer)) - (cond (repl-window - (when window - (delete-window window))) - (window - (set-window-buffer window repl-buffer)) - (t - (pop-to-buffer repl-buffer) - (goto-char (point-max)))))) - -(defun slime-repl-choose-coding-system () - (let ((candidates (slime-connection-coding-systems))) - (or (cl-find (symbol-name (car default-process-coding-system)) - candidates - :test (lambda (s1 s2) - (if (fboundp 'coding-system-equal) - (coding-system-equal (intern s1) (intern s2))))) - (car candidates) - (error "Can't find suitable coding-system")))) - -(defun slime-repl-connected-hook-function () - (destructuring-bind (package prompt) - (let ((slime-current-thread t) - (cs (slime-repl-choose-coding-system))) - (slime-eval `(swank-repl:create-repl nil :coding-system ,cs))) - (setf (slime-lisp-package) package) - (setf (slime-lisp-package-prompt-string) prompt)) - (slime-hide-inferior-lisp-buffer) - (slime-init-output-buffer (slime-connection))) - -(defun slime-repl-event-hook-function (event) - (slime-dcase event - ((:write-string output &optional target) - (slime-write-string output target) - t) - ((:read-string thread tag) - (assert thread) - (slime-repl-read-string thread tag) - t) - ((:read-aborted thread tag) - (slime-repl-abort-read thread tag) - t) - ((:open-dedicated-output-stream port coding-system) - (slime-open-stream-to-lisp port coding-system) - t) - ((:new-package package prompt-string) - (setf (slime-lisp-package) package) - (setf (slime-lisp-package-prompt-string) prompt-string) - (let ((buffer (slime-connection-output-buffer))) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (setq slime-buffer-package package)))) - t) - (t nil))) - -(defun slime-change-repl-to-default-connection () - "Change current REPL to the REPL of the default connection. -If the current buffer is not a REPL, don't do anything." - (when (equal major-mode 'slime-repl-mode) - (let ((slime-buffer-connection slime-default-connection)) - (pop-to-buffer-same-window (slime-connection-output-buffer))))) - -(defun slime-repl-find-buffer-package () - (or (slime-search-buffer-package) - (slime-lisp-package))) - -(defun slime-repl-add-hooks () - (add-hook 'slime-event-hooks 'slime-repl-event-hook-function) - (add-hook 'slime-connected-hook 'slime-repl-connected-hook-function) - (add-hook 'slime-cycle-connections-hook - 'slime-change-repl-to-default-connection)) - -(defun slime-repl-remove-hooks () - (remove-hook 'slime-event-hooks 'slime-repl-event-hook-function) - (remove-hook 'slime-connected-hook 'slime-repl-connected-hook-function) - (remove-hook 'slime-cycle-connections-hook - 'slime-change-repl-to-default-connection)) - -(defun slime-repl-sexp-at-point () - "Returns the current sexp at point (or NIL if none is found) -while ignoring the repl prompt text." - (if (<= slime-repl-input-start-mark (point)) - (save-restriction - (narrow-to-region slime-repl-input-start-mark (point-max)) - (slime-sexp-at-point)) - (slime-sexp-at-point))) - -(defun slime-repl-inspect (string) - (interactive - (list (slime-read-from-minibuffer "Inspect value (evaluated): " - (slime-repl-sexp-at-point)))) - (slime-inspect string)) - -(require 'bytecomp) - -;; (mapc (lambda (sym) -;; (cond ((fboundp sym) -;; (unless (byte-code-function-p (symbol-function sym)) -;; (byte-compile sym))) -;; (t (error "%S is not fbound" sym)))) -;; '(slime-repl-event-hook-function -;; slime-write-string -;; slime-repl-write-string -;; slime-repl-emit -;; slime-repl-show-maximum-output)) - -(provide 'slime-repl) diff --git a/elpa/slime-20200414.1444/contrib/slime-repl.elc b/elpa/slime-20200414.1444/contrib/slime-repl.elc deleted file mode 100644 index 0c9581bd991e8f2ecf5e3956884b27aeba46c0b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78118 zcmeHwiGLgCc_y>jY)R@T#-}XFHZufei&O*_Gq^~lNvMOCwUK45q%=-LwFC)JLPP>I z09t0d?ccu7^Byzb00UBr?{w431P0%H=X+n@Z?^8=es5-GX8t$7`Au}Ye|XeA=(Oca zw-;?4w)Te6SDnGI+wVn5W34K`yzGviN3DZ{sDCu-9(Mn|HNwxswR!pR$@A_o+D9+Z z@vt+D+9$o%VRtWT_xFaQLAUp8cpbkEhNGy}Zg<*II!e5;mTXM)(e9&$f{mX}emf;9tD7oy7dWe@XbIiZ7LB zDf-Kx^W|}O(20fz-9!6t`KUD*cA~w5@lDt%29Kzs_4CnCpGj{&Z zyBmU9H0bR02cRrOE}*6~5b&J_u!2(o6dCZXlt%qNkf3)GjqtbABT|%Bqm|O#hxhS! z?|3-sAC}vly@S@EQ+_t+A0I`fC(k?4qfV<`-ukL_P<{w9I*RW1`$y5rwQPuMk>cFy zS}D45H0bPizm7`T&t*K-?&R6{NME%E-PSIscJRjVd4Dk4J06wW-QiJdwD-JBY8%yR zQR%jmT~hfr*Mc@9koV*6@Huwt=l~S^5bJD%84UV|(E+-M_WOgwA*VMwIqF0!Decao zdcSvYQXaN|a(u@K$uJs4r9VCI^r9!x%TB~LQEN2n93G80IGf85J0dn%w*WdvD=TUYmxA{*3l7I2qxASUU>8I zolmgvgVqT9!3~g?Z3nsNmEC^-pwsH*7TY==^~;0qv*)AoVQcUV3@%vZE(mFK`~Hn< z4^222M+ojQpm>NE2^8Gu$eN=K_go~haO-`LVfWuV zQBtWyrE8zHzV03#A4a|7!(B*BnD#-p2e{{%PU#(8gG6Z7qB~-{7jqedXg`_v_Ut_XTjMZ}mE(e6QU2YfrET+Erv@IV}24a5~(J zlS3T;(8GsaH@&*w?-ni8Q$iFI*v7~wV$VHC< zSZ*ABNe()@niHKw9Ao!N$8=#iyu}2gmE|kZT9mBUl2r;jQ-qHtmkbYEFFIwX?=F}D zSz8Cu%0cUJx7|XI@o$%JKsYRq4v*Lt90}j>!8RA?)9Z)?SI$l627l1Lmg8mRR7xjP zoR@8hqR(0=*WyH>(c;Rgs)1+v?;p|P7QA5#PA_plOBmc7n!h$H9j zCbQVq#=;CfRw3lsM+g9w`qGkY{G4yRz4+?uv=?k6C*F%Xg8>#;dH^LP-L%r#a^f;3 zClkcq2G369eLkT`B~L_7aY?$I6IcolCwlf(x%2fAm@p6#yVdSTAA|Tn^%^|mPN82& zOOW$1^6cCdgG99A?|d0@$o{YcHhUHruy<0YPE>Rv9B1~nk2JTnWh13qFK;TaQ@5mm zJ{Ik~J1$M;gi2kA+*cp%imQiVOuGkHlvfLtCsx4>~V>ERd#dZ`c`7?r1?80$szx2QN6{)2K#j2Jt+) zDM~ZZj~u51*|XJy@bVn5I3*OZ2slbA1g_my$&I8<`kSA>*8{Z%+F~NwhEx!1JycRy zmaVuBt-Jpsg52u;QYW`Qwc&h9Go|C`He@e$6)L69ccGmE(yv~hFaGtAaw$29HY07p zgu8>N-0OTzv%xVK(Ey6@Xb6dib_MBnpNn%KmV9)(wSM=hS&%1liiDa8P+o4__91)%Io5(%{oOp^|SXrFI7r?5Ys#gaq3^&OIfq zm@|T*B%*kegWtyIBj5}BhcV7ttyw4I1ecGYR>^X>3yNFDldea5;KL(G0Fe3iBakC- zm)78(f6>QFuGgr^g2$Q-!1BRvM0O3^cfoa7c%W>5> z6+Xt%B{l*xi0gCPC1GIOJ$!5Y7CqIbP(ebpNS~rZ2~b{bU&IE8$YFmvZ&dR|8vf{SO4MZXlASnK*B!Lg(rY#*Sn~v^| zn7fYpG&0x&?2+?YMcUwbfNWDY5x6(iDrdW`Q}Gp1Vu&a({1KC`3t6bmJ|y5?+H<(o zIk<89W#<3}hmOOR=r7P-eq&0e3t%{s995#3#+PPr1pLi#!Q@F1%v5lkeG~I)a4K&B z*DB4(=aao;`!Ee_j%k0?lps9jM-roC%$79a8OXeh4K-T~RE zRMQ6rhrVGt|NP3H0WWRe)II^bk59qQCs;NNR4>7CL_f6|W@y-mubw*ITawRnbW>X zN(^!KBiJ1JN3eM5f?vYU(gDxp6iu5L2WGZri%#pX46_mmpDYhnJkx*(>+}4kWAxADdS;-~WJ|W_#ZV4-B{acp&G`)T zAJW=^oq@Cm&OVZ@g^W0YwThyM{8YLo%)$UfA6_e^hmr%p0No2UzVt0L1cu`T4q&>0 z0Coc=GJb);nOc;|j=ntZz`6rbt@AZ#(*8l~83j|aA&MR}`(%1p9)!bYd9#Uvj;&a~ zaLb0&CI-hnacY!B>eJ$$aILcKtMluMn* z_7P?wY6Y#{UT1Co9_(D$46#S2A~(d(XJG%m>(pIF1C_%`rDO_`vupG+j}5@usUGZh z@Ez*Oaj(a(Y@QBZM7z5E^6;qBX_rS-dUJA_cG^)y5CzydXWbcQ;NpUOWja`VXhA-n>!yemApck94)=c6Cpx|N21e8pd z3khx}B83uL*h19oq#E55RXlq91Sb2t0B(U&vAo(I5KAbi$RVf$ZE<>k zCK`ia5dSk%lMaMqoF#9f=s}OT&Lw;~J4Wk5U(95N^$MV2s;C-vb^1KOSz&^tX^oSq zo};`_n**+kF|W>_8u}B}Ju0|V0cGO&6wl43i_jUmrT(yU_$92i5WaF=q|PC<)DC_L zPd`K_HX!Q5HvzoXjS)bRA8@l)9AVgcNTw%XUW1Fe)QFaUlL|&3NzdL=kcYU z!PLG0lz&%{N`JnFwvAMG4-O)*XN3D==Q9pP4bTIRVX`KKJOM2Mvt}L&r@&Al1eIZ~ zh5V%+c7dkCW(=e|8@`nItFwCwERj|R8&RNKN6S@3nRR1G3K=jpBx21zXhF_)&o9C> zBsK)1ODh#n+7lF?@3?hAxlp;=hA^m3&bR`M7mInbGA3Km*C7H%Dnvc*bfTRc%36n+ z1X3hkq|}a*iglTRvOZ9@QKRJ+HYmVqU3hw(JUxy@Y+r&Qx2L9AP{%o^j*W8yu5$oJ zfH4T(HP>owC}U9u89BluGc&NVrC4htLiSQIT;M!2IXAA<;Mtyv#)X4m6T;P3DYn#9 zZ22Xv)|I+)1NEhnJFrDlTP%hxwtK=!fpZlxep5WN<>$^TquR3c30$0%e{ABm5mRKK zqSd*T49?-`G4v8>=oF5%Y3c+JSqF$b>@qeA;ygn(zSdADkD!^K{}eEPBl>gySmI6r z_0dkAFhlmDH)wy*I_wOu()c#NLq6R_IM-N9gv+uCWG9WrVIT%4Chu|v;whTvBL|u1 z{bR(fARY-kq6okvg01mDC^sZ-~)20$)fmsYCJ+Xt#3aDA=kUm>F+1*ARIT_>~A&JARNN{Pi6$k z2K?S&{Jw)WLI@@_gy}Q=&H;Vu#(Xbe57^gu9P%>!6P*Tst4j!77P{%mRS=+a%5Ht@ zAv&jw^#dWxv;#{~M+sCeSZ8R&i$SHY6Q?F(L*9Xw#-%}ahocQlz%t@9@^rq7t2AqvD(ei?o}74i5dzs6 z?`Pf6diYfzg8lQ>S2O{&+JA+n3lFnQX^58Fy}!ccj9nS^VKju&BL`7=8m$+QA80eM zsK}&L5*~u=P=85d+AgMo`r^#oCcnHv_7&a7$I9&grZk?K7v^sAcbXV#vorj`C3N;J zk^>^)`amq$GF#n)avA0oNdz!)N|nOgqcK4in=@V89zRPFq+m`$?3ykv)4#_IWsGt_ z8{`4x*>)mvCRJENVNwi&OxaZEL;9kOg5ZAS2{Ck=4Y;%Vk@-V7BMLVYVx5WlAcAhL z;u9r@=@XhY;ao8d9Xs3L6Sy|wMy?GgYLfLs_oAk`q>bbedPnIBVC>y(Y9c`;!>njw>Wf}U%+ewZXv%k`t# zG2vU97L$9D(8G$9nA}5jRnK+B6q$N6Y@?|$xhI%XBiD~6#^l0AV9eMWxH`ubQTlfq*qC-bkiEd~`LY^z;An->9GXbFmZ|vw=Qo zktI>-=a;-Sbs9$V9wWiz=QK>}Z0YbZxhOzL5J#mY{qLW4@95E!~Lp_Y}?%6Nu*ba?K4# zqSD1*`12w_jQ$cMw=ixtYj9JHW7l5)=mbppWsf!rE<7p;u(x+{pkj^}gGpHc-mRJ<@b6x=^UhNQ&sB9ttPiAftFS0StWr~Vmui} zmP+kyiWwl6bUz7;Ch>~!OR~maEJAb%pQ&WoepYBZFahjG$!g@<#O0;}RrU2ya44N|i1yn2 zA7Oo?mB-Q#qn&_aK)jLTSMwUs3Ck4u8*-IoKTcSu1*QD8z!4cYD%EvLMLDe{ue5}r z0^S7|)Lf4~>-J!OlDTW(H@nFNp{7vU`U)Z^o$G7!+y4=+#W>S{7G@k_cYMgaLJo_$ z*|MXH5XKN~0>EOlb?^6tFagX4tl9v&e|}5B55f?Ac-2LMUBXts;-@q{Tti<7pyHu} zkj;-(gf~;*-cFEsY(K>fx(P+v(=LCHjv(rx%T0bt&WTKb&}2l$;7vMX@grHfIPQc~ zIecOz2Fm$EQjO6JfWT^nW@r`9BqoM&NM+=*!34O+*fHohl{6MAe*^|C5+zkM6kXH| zkShLde_wwj1wssx(0IgwA?gYFtw*o{LmZ&y>846Wvr>kCMUei{kf6~12tMah2W-3q z>v4(M3VTol2ob_#HA*-z{x^~uqFh!e=0q!iJl`DCFFBWfmcrf)Gjxh6o7W&zRHF>zJdenN$i*=X)q_TsD zJX=|R0I$JSi(vPVOXq~7FwX+X6n9A+x6=b5R%r6fo1V<(4=$jSqT_*U#%*9pa#-} z=bir2c$3(#cr9vRTFN4+fYv1O+oS>S5c%IlOVQ=5qojTT&*f3WA2lyrSRnLNZ-aJJ zy_f^b9kA2^3mZ^ri)%=1<6Pti^a;JqST4J(Hm$o_<-)IYgqlydmRtZK)Y1lMC3Gmr zjSx+GJfZ?|P>7~`**X~l<3-BNa-&T`M<@v~RSXLXh>nh<=WxxoHLi{VyO6Rpbu&+# zcsTlYr;QXM2+hJy;zF>IsmiF1IZUV*-jyFi*e1wY;o5XK=p%^E0eeLhsH860N6qal zG1d(k{z8*&JsM|D1p~E z9r87ejOifwEO;BVCW>{qJ8pTiu^!!JG!}%SFc6U>Lj)zO z8Ib9B2-CB)S{#$6K^3_b<%mt*%z3vgb1Lf)5{Kk>iFHjRh&iCFa0n5C$rK=SlpM(> zItWEh`!N$jB?A%B0HvT9M)c7Tf!lgU**pa2f_+-ARi=mg1*A`D%aM@)LxWVv%}LVC z&!!>Le4#}7iF!NJ;3c<-DyYe}{Zd4!>YqsKe#woi&HhEUN)pH<$pVzDQoVE;K`v}n zzsgohu;-qD{E2Zhxj5s7O)~s$M5`tWICX|VcLoTS^C&3O%t2?4xQr=%=0BXi;9O5X z#-$cuaBjhY27KCL!_Z~%xQqp>nqp#(y*z59A);0Nlt!@%u8}#IXb_qO>^B-nJY+f` zPNG?>8R4`vte_bc27N&_1u#-T9D(m$f)(;V09yn6r)j}}kOrdFPtX7mCJpX@ks{lW zX(GV(dh-{K*ulIeE1%?S9b+s}Uu39+)S>Ahbzl_TP(nWFd<~`2%SPP*>p~=#3jHJ4J za2M;YNc7`}Gu!){+?Xran9NtWy?^)4cIiVrs-0gVP9}dAgq0nWB3sCO)6N#(%zC>$ zv+$<$2HR)Q+rpddZIRkqW8tl=KUK8g1Nb#YP#tPnBhy&qp_U{X&eiAVO0--o^}yW>y&! zt8cV+X+R0!LBh@SspZqyneVlr(eFbE?zGhgvD_G&8wfl_pgyd3O#E+5jdIG*0SBwI z!Ko6Q!`N2rSoJd|=muxql;hDb?dn}SYc#Bp+6ITK(j^WRaw(Fb;u^A@;&@R)Sa0zN z-(_-Dzs6@3o~a%KLJ^~*36&?$)XS!c+r3>p6(bw=7k_b(NJs<0k}t?Y z<%b?TKsYTASB7IP_{vbyT6!G1BqK3n;i5?+zw2O$S*U2zgz#;EoNs0_mO2Boz+>A= z&5ANtp_Ju;p_!Slv_@KKA;By7R#AZOqan0b7meg}^G7mm7y%&~R^BGA)N2y?8Ly{lHI!Ga`xVOu(_I-Z zt**^KhLo#$%UNjyZM`=CD9iItBlImE%sNcjKk6zVrDi9D&HOB-r~-BQ>nLl9wWB^I zOHeSZ&m0v({ie#y`3*M>Tf?B|XoahjzLT{8Joy)~&k{s0+*NWE1Uz>HSjl1mj1f4% zFBjj~0hs|mTKJ^{aBbmDwo|v<>cU$KRNmny)4+RvzVPEpR8PeT#1e~1*H9*p6B`q06~$05-X>@?0{R~ff0w#ZLROv+L=lDZ%(#37 zjx=uC(gSjw%iw1sMjvI-z#JK4uOa&)zA?K1)i*5RK&*9=Z@=F~0WWwfjv&UtD2)r{t?@(Q6miH^hq{RY3#=37Zbp{X6=yVe_x5zA4j z|05faa+6iF>L^^xab<23|Fr~3d`f29sc{ElYg}9UwX;b~)@u2QuL7n4lMHb_jCZkb zwqA8;q>V!TQyb!l#NGxOs9ZJ@OrsleYv~Hf-pmYW>aiiq7E{Am!?MjI>s5#tW;xj@ z1^F?b3#^7#q7v?6TZ_^{JQo{iRA#o1nFtc>vz3^4I5ToyHa5OyQWDIcj)B9>)M zlWS<10f0p<5;f(mnH|E>+cN?TA|&N{NX`Aaxe!^0s4T}J;O}BwZir2}X^8;_b|Ecp zJ3QXi%|T)gX^SWK1i0u1nylarRLArT>QyNe0^F;HN1*kQLpJqf>x(DlhmSsgxb^7C zpRd!D4K`i0lQs)D7`(6$HZmk~Cqdd|fA_BdRozd@MF<#zogQYHo**MWGSrb48vBK? zo9|4!5cJ6ZP(jHYIM?aThs!#h7D|4?=@!D_MiRTrAt%+5ufv4OfHk9aRw!r(b{KLm zIoDvTgSJBTrs(L>Z(cm}j4M->j2MXOPml%&5` z9;Ptir#Pv{WwmAv*)!1>lD>N#^nEB?hQ+^#$^S0Z5)7ZQ+b0N96i-!JBMK;Qc8g-D zLp>x`yRcgXBsi9P=Z_HRarqDeC6dsFOQ#*U2A-S7eat_7v`&=+b z99mkSvburPPP2q!8*1q`kTjgV1HhAswePgK@wGPzMzqRSs&CF%=^2+CxHqzLfZ5~` zX!!SYnqxB=0)} zY1>AH;~}D>P?Li1AQkt76|ETsqCXlq@JAR-P_`cNWQFzQr}Tnl%47=HDx!&$vPyQu zq(jYarUUbXu-U3VydVHA0FkandQG9om@3O>Pb?(lx=K;+ta{8Xi` zx_Bbu9em@75NN!)hy%I7nP|?91Qn>RyJ5oObj#C<08178|MCriKl7&5TlXCbq6r#Pz`29qm@eD$cL z(qD9Wdc%o$)H_d^P3S5@9rO>NAmwRL$F+f&j~Ad;sr0rYN|BWFWHJlG#HOj^1&a>& zP+RFLkQz49te6`BDoJAtp;MG?6tK}$%Y-5rXqaAQGeLx$Bpf4x4-SR92qAXfs+QIoY^ z;0a19a0moh4=^et1a9#?KMF0J1_VwV6_duod+E_|O9PNoa1^~sEkL%e)bIq~Zg(G< zuJoGZ09lAriZp;|sh=A`ejTuoU~Y^tSt_l2ZHH>cSVX}FZ;9^Gw>LesV?0*8$Z{kX z22IpC2zpK@t#K_rWBV)Fc;iJkbeqPX<}`kr`-C>C1BYszYN^451jfv%DI>u(<#^p- z*(qg+aHBqg`ef_{t57TY*e22>&9h-pI5?J-^ey0q_|e*>31-NAK4@!kUxao5d!&@F zybHL_NT@jsf7V>oSr`P@+Bga5Ho2MZgc^9!M zzPNd5_9h&x+r9tTnfsUbKVSu01fMRPS5FP({Ocz3?>we|twIB0?K)XlEZDcx{=b5R z^!DuQ6KM#AKx0uEY#PL=t)4qBn+PLbH1T^PPzr8OXgFpKWg&EKiGr^0v4My0Nm*3a zoc$iu=Ou~VQtxQlMlXMZE;Q7Y!(f?hkD{aKX z*%>w!`Z}g2jPoECW(0T;CRAivB#+akm5G*E}SfeW`=8 z3+g!%wIaB*j4`=j=*K-1Kcg>?`>0m9YSkRr0TdRwstnoW`>JeRVOx;8buDFYD_EzT5+c;pU+JH5WXp6zrM^}}EXhgqGGu0l4(_H8N%I&P?1 zVA$qMpwds|9#@x(%&e&(vYylsxIx<-6_9v+BgLL!B-ZLcVX#epoO&~%4?LDgFZlT+ zdJf0y5{gHNm@G5wA0rIg4rro+{2J=?%?lvVq7Tt!T*FvF{?e*?6nj_UV3JV<>=l=( z;TK}AgzijB;u0;6s!S@<07X$e3&b`e?c{%8OOKO_moC5m!H00Jz?b+XkrxgaxV440 zZkI?f>wJd7G$9rr(y2K!+FLDJ7=$CpT4 z0)h20wwLzQ#RBh0Ieq9~v|tGR!7Rl_HS*pi6u1jYt5AqQ@Jwp4ml#zu#v0&r=?%?I zj*tRWO~eQy;aE~uP^~7Hg{Hd0%it?qdnlabUE02K1X!iJ6SfX=5XS-pa?WfJgr|@h ziprt6b9TFjD-zXd^wDrE5+O`=3`Wll5uURt(S(8U@i-3&rd zh!knLC|Faem7J9dNg0iTqfb%dJb)F`t6ODx5!;S0V-aaG@o<(!rLn6sQ z^Dwh`dY_$M(m7_-6&l@Q&Ms;PWU-1x9U;jzA-8hlDm5mFRS)yY^hKjz;je`~(z{=A zj!Yp!i4$xpTI>O3oV7;$ec(R@d^$m=!hAS(U^}i~?98d$-8(0LceeM1F(9XG--E2+ zw8s@pLeBBYwQ4~EKb|y9B1Gv)fkaRGbbs7w(7&;A} zDBN15S+r+$VFwh+O=Jy$$}_gsPR9WX;J!2aXHX3~W>dhYB~ZyeC23_iGqe7I z8)>q(iOnw7o9hB$6R1}@!CL50n??;7;|5M*o3(#%JcRi+u$=+W;9gJVzS?@k_%K4h zb8wT}!lVcg{D(Jh|KaA{t*K`eGAT+|kUfwt3#P)r6pJCbU=*b4sEJxF+ebMYODWsG-W{AZ=nL^~@bu6Goi zzwqwr`3o237SNSwxV5Kpt4#LFqw!Z3-nsA|AObPb5Q4TFyU}TK~*nZjS+O;t+VzZdp}ERsa7`X zS*|B^uxq$i5fx&zuQ4GO6=eAv?XPJQ9Nh?xF`I*?sU7i7OmDeDYxN51%JbSi?>Jl* z8|xc>M#x*p^;deRSaSmw5w;|g&6ltN(o`hI2Y)320e_j~LI%?Gt9=!<@FYnuI~=>h z)Y)@*N-qaU`E=7GNe*s_q@>5^=>=ac+`Nljkswym43ar9t+m8U$FjLP8N=7UHopa^6>A0T5Acp*>Fr}&b_;Vcv|u{R5c`jKv+3TgLMtzb zrA|~;Q4}p8(SeSL19p`L2@~`M!$11wEMohz$Fp;{*qR~oLW?G7Kz^GP@X+Y6j0Ag3 z8{mhM1|@6}!!0wj8Yp1Rg0QM}UaN-^-)N5nU{tDtr{xd^3_e0&HiRN$3V^B*pmIZJ zdK@f!8p;ffHfcyGbA4Sbt5EL9?hgA%$5tr>iFRTe06RqJCk8_}asE(Fy=o3wG06Sx z2?O;p8%f>5r|U2f3P;6ekAx`HFkZK zA!t|KJ$*G=F}sOFDX75+0okxwKiayx^~J-$WDVagFK^~Ztf{WI_jxnI77S*?E^e$m z1-xt+K{TE#AWN&>P?*o0@4C%^Hoddy^0~VxP)@rCM5#AsXjV=TNYYz;51h5K@ZQ2j zQL_nxY7&XAEJC}8tBaSndkdFDmc28xaLL5lJ8V~5xO8q^uLZl!!s#su19Fgf(ef6EA}Ft|9}jN1@|b`8Coq*Gr~z5S z-@tj30Y1A7YCe24l+q5rNwHM79D}0FL$CfXYl1Pgk%|HIJEm0%!ptgY&GEq|X0FRM1MZgv)^glZxrC@0W38*@t?nr}34m!PO zFy@ZGkNYC~K`-DNB!ydF+`j+EJ6mPH8wOay63{S5NK^~rNk+J{z4P_n!7(EeQa-LL zo~n-&LAPa#+Os9O;7Sl`Q!p^}W>sT&Z5*PolP1H5d>> zRsdwCNu@5&8lX`;pZ7_3p}*kchmxiU3W$Wbw-?{xU{1oE?z%YSZ)Q)-Sw;-eVB{ zw`j5!l3ATWip)jI9e4mT8CPeZT;<2a(^|f-^mi^Ksn0CDyGAlg9LP2wS*f|Oket-u z^Z_MG6nmM8XUvu^LT9z`dReX=QZqaG)X3p=p%N?pn!h7DFl<~%5)r8h4jph^AF)gd zgj%4UQ>lJWxxgUsgG%B5;JbP#NoEYD@{km$BQ=x)GEX;d3AlX%yGptmdX*t(KYKnV z>kwNglk9{PU!XqM3C_-?dP=kE*l(z53FX+9|1(E zCXEz9BT5DHbD%hT37J;`r3Im5WEQr{E28(b6*xeC!zFk(r@(c%hK)FITth&(C+;hu zKMtvxFd&;d6=F%V)CNQ$%#tf!jSjdbl&&4oF;o(jCu=Ync?!IMLLRhk3PPs;M!H~R zJAj0#qE^txML>rZ-|ApLaqTLsu2yQyUxodLbdlAqx@O-iJv1_aYX&<)IeiNvUplNq zVj5cB%x3_Ls+zX`wvR-Ji1+@}Iu1kL@HFa3uX>f!c)-xES2zin(E|zEpa|m%zD%-Y zx0p=2`W%#;FhXR_; z{`D{L|M#9=yP{W%mHw3$Ez${GAB(`D@Z>jQyX78&vHSi^^+;tD;_&h-*v^+$Jjmko5zNl3^}TW>D%LwnKd^A%*A+|BoN{kLA{BlyHg$ zs0k1C>9_}{C~M+#M)S5qjM^Wt4i`*#kQyDjU>YN#mAPBXsdARN#fA6?Ah{k%n^9>$^b zo{hlL=lAcFKfU+(iP(w}t}S1t9?JN-aTJVF;lvrxEgux&mCMPAP$q8D94ChXB!Dyn zl%6|>za@A7KZk>lcl~-V60j-#iaDMam7;_{qU3E4)ro=e32Dg7N0(}SCZ~OSX7=(N zD=^@uZ~V8R#YqvE4Y1Iom$xDeD(cf$TFc`rrYdlx2y&SGl^Q9`#FVH$7>?3vw@5$; zRHf!d)pN38i*|3Nk)FA!N0_V3mm}T&DmGK(6{s_$#z-!aorDM) z$8WpP;*CQf4ksuR34hGvaImZ#!a!^B42tS{vH|&SOdc7-Fxd>Q*ML06Wpj_{OQGw- zf{aLVY-;%p*35WX%y`v@6vmO@zw`h=^QInv<~Mx4_2|*(k4PM)La2?%!8s~7NeYcH zERdIjQ|T5X76`-C6UuE!;R%7V!}k_;KHk&tzZr;5J&EHy7o|G<9;J9JNkiDV!I! z5BC9|qJGI4%aO_YWuB!!f{jjMy+R+GK|ThcOH^xuh+Bc!9GIfbb<`6kx#n}HB;pu! zSSFN_Z-8Oj?Y+u#;TZ&3f&WV)JERvnrE>j4q|YGKz;)h7@d3m&1YHOMLE3X0p}`hb zZ5PBit3PIPBQD3wB1gu!#qy+G6!sC%c3>Gp;*aY~U%X&_jnBM4?L$V9d z!XF16<%wVk>*mQ=_iJlNxFOO6Hl_L-Gjm*&#v=k4tD1ny@(#2!)rjyEf0q+fhy%L# zpfLND=y^bYgfxesbW&Nn<&a8`9a;EOjx6QM=;VYKE+%l&Zs78f*Cpar7*rm2ky8gx zHsL$OfC8)nytjnZuBia5O+b4GobDrN| z3m7pCloGC-pN7K&6-z&!ULlhwC?sb7Q zv_()}=j!Nn<*x@Q$p>Z*;iFf`d4{;t5H+kusCk3H*InfGAOeogea-v50i- zuv@n|RoZEnrkQSXhgXPnzEuJ80f!)FA*k)#2grb{G_df9)lasLaSlp{5302ggjw@+U`kC18 zv~em@vw<>x_EqNf>c$V%{11&ACJGcgM>|G>u$5?P-cmh=5Hwk&rt>9?|5?G@a#})H z!#@MIs^LDyTcy`mVz6)?ggpE-ZcEaHz`dw^tqfB<106V3eq}H?e@WK_$u&dNwdiK9 zzPjHy?{96P1f+%*boZkZT*dmL*MAAk5xazMSAl13M4~-o^CN^~#jxoe?JP(!I{YlI#J#k- z(BxZ);IW93S|zT(wp2@c=!DQ#0SXm$5YeQ{v>w}3iBfPpUm!aZy`T<*kHB+g*CRt_ zoZEb3Fss6%$o_N-R|UHp5_Gs4+`A@8wl!DdcBM2i$(dic7L;8#;1Xg-UH+S7N0q^%7;h2mrgh-V6>A3iTcBEjcqg~d2rmaM#@#(Rdy(wtn7mT@=&@Nl z@GH4`AaAWjw;`Q&d&iyMyWm$G$}h7X)6fL%zR`4Z9cJ_7 z9aGxYQZT$%SrUkCqg1Q%T@ywH-Wq+`Iqrbmky#I4NFRI(jAwV+0fIq!9WsPhOzYGr zwaL=~=i(JvxcJbm0o8bRW>!M0X?%bho0;kCHyCE)Ap7vPinTS(Ts2k*L{2IVmt{j5mVV*<@ z?7v}#XCl(mQ;RRO>s<}aL zMoTXnGmT0V-0U{7IfTD-4)$SHmE3+2W4^sYA9w&%JP$EOePOFgTG^O#Ezu)d4uljz7JH?8iPBSi z&5McB_e9{=z`t6ujyz$+)1DH58fKEDeMk*R7CHhA1%B~4Fo?cHu@Fh=u>1`o>8tQQ zA5Fc7C~XCz8JPItJBKJpApASKh$vg{w{{az+NCA}jl;X(f5BZu*=zl8^D?4GDSZEJ zw-MDqf#5d&Cbtn~E0f$OFt>>SatR)PK!xH}t|I~=BO})$br;}Z5^s^*P9#)NZ2)-4 zK=bqoEdlam+!2t?FQY!0rAW?8CJt&Y_l|uF_ZX!^Ui~p&WR%V_DuFb^#8&cZe-uzo zAz7~xGY@C8InDI`8QcvVFEfAPpmn(0Zb5{`*JzxX25+?x^e(R;G;&&|qAbK*I-qNI z)6J-r5;cMeg4W+eCFNUhdli>TT_j&Xnu@^WlmtDuzxahY#?XQ}J?DV154W4}?akah_M8=_mI6kdF55~+Ff z4dyz*7KOB@Hzn<<_lY5tW_S2TIEf3^Xgg5wi>zM#mHO+ndm<=P_#C|-H{Z${St7SS zRU42qSK%U4e1y)-ZZf?qM+K(Mym)R>^_Mq*QZ*qe;NR4FNHupcI+La5KyLtuN;H3; z8(x{c`385pGKcLpDKNj^E}{8$Oq+H9@6gFoa4X8$$`d+9FS?nq^oXp(iqXS%tx>u4 z8e{T~V8Ot}XRWH! zCr2F=w6wwTB5>pww`LZtk6XMNjX<>s2vO7Z{(8Kjbx&hu5k+#CDm@-R1$0OwV{5!zDHgDTNRzf-jCXoYE(d*OY3xqVq% zUA@XE9iVb_`+oV0>Gm@tOg<@|wC-q#S2d}tnTDgx;%Xluny-dvxt$d}tLO1d8ho#4rqlniVi_V2{5FPKGu~)^yI7`cpNeFS z%IhPU8Dn1s&8+DUk7zcL?-kWxeH)Y7nhlh%qBuVt)qJ9_hHPW|E9lnDqnkDPUJ=e0 z@nc0fL@=Z%w_a)L-JfTOps&u@eD%|jE_r>VLl}WnKpDIW+NF(uc*IMm^1Y%SO!H%? zw_e*&`DHrlWmA1MC?~e zZ$%$N?3Z}`=;Ifilj!lEKfCq${fN=JkE2g-KDcv#>rwRigRL^FUO!sR#oSCA!(q`5 zUMt~$%pyB5WqNL>*4$B}oTvHT+@xQV-(c1*q3*7KL#4-?n{ojie?t)H&CL&HKV;Q} z>Zdd3H}R}WJ3uv_Ie+settRi{TOx_Swb|d@+~jY+hi4SAa=9O+C=uQlwT7=OvKXw^ zGs0h5+UpC9yTe7ZxOZ{?!_M+nv9Uwc7ed(*L=nIM zgZoLN8}{}Mm5y%s`!})NR?#7 zyD+N)qf+a9g&|Sq79cZeggSjUplahSHBU{08zx)radL$!`x*VOa#jLrD3s^bPHG#q zdO&ig4m?3@r?qs@7BaieAPCjAVS=Flc!eYZ)@5+LKCXUSQ4GfiA&K~FG!dUtq6ncX?XiekibH@D zfEbD@=Qp#$RFlkbsO)Skj>TCex?*+?7op({xMpZw11?ak)guEX_6zv#Z&9pfDHCN2 zW`LVEf``6^V;}`eY9%$}=$6#|LIA`Qh84Z+Fme##N-dNqLgr06qO*=}@2ma`X3Tgj zJey6-fFWSW2h7fAQ-k|uhTv5RYcnNJiw{)JIy|#u9v%1aa%o2&KkdxY{OMa<% zfI)!^QR@)|zxl?MQ~#G#zxT%~q$tqVs$LTRjBPs`C@p)^5apoXe}U@p>6o>)&5tg-~@@LKh=O|{TyH)KEzTI4UBHb+kmpzJ5|+2!}=ZV-sBBW&|6!jS+F5_|Rq z6c#DSG16H{TF+oXvLLFTE}@int@d^n&zbxKuSc&o3xLFT-!MHBPJyqG*ZgMY z1?qh}8Y}E8TZ^{t-+TP9EUAWwcWb$XuCgz>2mqk zgM0T$etZ4-v;ju6xK3@ytGZNWl3|@EAb=AnDZ{NH-J;tFCC*Xib zuI7D0;NAt4F}jM7J$k>_2pk=(=SY{qwG1PbHv2~`SWU!Dh)7@CUt*3WjD!UJ$0`dmwYVZUUvNas`_afhO z6iU)G-}F4DN>Z-Tsm5)(pMVQWv$12j_J(;rUlvJJ8SZNBNaXCIxR^!~;UG-4Tq$xL zZmVM|8bX39`dz!mZ$~IzEJ@4hY6<|vT0_wCw8VPSY|>jwxhrmLptdBSy8vMjBP}Jq z3q=?tHsUs6bP9Mp3}4NohzOu$dCDF*b;DxH63h^*IGvu3LJl*w?Yh=A1KEcQ!E+Fi68=}kUb z(vsXDg~^e~)mpm;-?d`<+&i=H;!AzOK^DXmRCs}TZh;l-$|7UxlLh+L8;e&cr7t4M zj7932jhTgyHZNQueO|b-wD7UW4xdq2$2M!$+QJnR9v0Y)(gWVV%KzTHfIqbaN&<>} z;$x-yUwE@xu?Mi^Rakp8Y)e9)<;KBcw};<1N%ym-xw)VgUuF7qs#Q#f3u(k0nR5=- z0dAF?@ot)>SJfM(Ru?`J1LOs6P^~d@9lc^xt8$$f*j2593vaO8BhSv&yxV@Shxj0n zv2v|iRe96M03IYz9l+CZ=Z?iof=U*bx3_$xJO#0b09YGCc-&+Pp2EJh7NO;afSU>u zFd#yF@r-v6_BKR;-l%m@mS{zmILDO|Ba~ECwV4tjDxp&{6a%&}Ii*zp6y2by8AR0r z-#m`%)OZsbaVc@WR&3X6sxb6}KmD8Kb*O49trsoctahFMfoZ1(;iwn!fB2r=FoR2X zp#0fZYeXw5rVdfL@5FalWG?=c-&Q@Oj0}JZ*oN!2r%W3b+CKLjzjk4+eH95^ggcgC zrSdXGiIYUJVgHbxKnR7pgp>{mFO>YbES6CiASj1k_KE`xmcZ=fvUHj2EgQu9=ZsuW zOhf*9zxUgIgOoh&J>9*03L{s@XunjSXa<+=Kst~VPw3DGOhC3m4TWW+q;3P{LZ4tp zh{v-J?=bn05;2NEAjudqD+q(!YO8v!{=!{KpHjP(_W7sWQ}&X73Q;*!|c4HwQFdEdQtYgy_7*K@60$M_J$Qxg|^=Wh*bQHBze8l@$F(L{AN$L1oZ^EbKH8k^@ z4-^(Y&hr*0^WcwNaw#1Ef zixh!ke7~a79i?Nc#iBJzK!68i`pPmYJN#A*4!$cE#aqjp9KvYBoXO#ptPRYD{w5X& zIdqnsfN7AouWRjGq_+cjmsoUr5C75aCF>(JqU282EGpfW7iAl~3`yDv_JrH8EUL3W z(RZ>3)o-{5%eCK@j$UG+872u`Ut$3)0eo1RJZc|{3sey3n7mqwH%jC;hFa=yh+Aq1 zDS$#L8GyPTVX{F~di)#-^VHXVsI9Agv#mQNTZj5}04Lejo<*b}FQovaMi+scrP*6= z;5g*&JrR%sq)*#JN94VP>GxMVsZ-$F>7r%MNlHfAyH##@NJ~Qckd|ySJcv$xbt;5N z+>9V#iA6VkD3eG|A;H)N;i)96LV$%-VwYkTnZYd{PKv(+QaOICpq2SYpc%g=;owt2 zssEm*3EcL=4->d8mP?RRsn5h3IHnQo<#`?h_I3fSnW{iX>@`;KNbD6)UfXWKZU!b?m;n1K=P@4 zg8yLAN#b~&gm{hi-vwUhPm5?BJ^@0P1*`i<8K0yY^rJeW2-$8d&Lg%{y=a&^7Vc7V z7Ceb!KSe3c3?Dd@B}l0ymc3Owt$cBaR_!^sMz%;+vlo9Fk{aSfrsd8F6LN#lYY7|n zl8G9TiWzheP7oJsX+nk%rsP93@%*Fl{dWQ~Ru~iMpWd;ko54kGuPqh8L8PuIp&Xzg zF*1L@4~f864l|$11NHy_`D=hEWIB8BBi-f#cI``|oAJK|v-SnQ4)%NlR&B!>Hl>XE zp;9v1f+5LIu<1#p`dc~l4}vS;sp&QwkG1c>l(JyTk7`S&a#Wl3BtQKri>wINW{HN^ zM}SRn<$(Cc{()7?$A#0eBBGg{+<;mx>_*ZA+|8*m&Y8y9TH%?7x$i(~^bG?j>&G&y zY^8>j+3#*&1TcA6w4TT{&m8&h3moApF>lsufTW5e*{eTp0LtdcaKuvf)rHvXiI`k{ zKSG;X=JES`J$}SMrhXw1nX@$LaS-6^KNT?0rRG3^k0!xE8qx~yAi+J#Kwi&U3OFuLUGGp-`ajrDDMo!Cd#XjI_YV4qntX0dUU8nmIau+%!@54FJmzA*_Dq`(m&f@>s&`-xpZIV~4`12$aAjY_A2L z5{0gpj+ik+Bg#QVV3}>izc2#Jnyd}CB8g>3FDfY^9fr8@_*YUi5B&%H`>v& zgZ?gpKM{>DB@5T!g>*(ZrZPlO8tS4nOj?&T-^iR*53u4i1&O{Y$w@}9LB<85>K>iyZB1GvhyFkJ0y2j?W4z6baHxbkD zQ`YXSo>&fTbRPb;0+c!|FON?m^H5fEBX(Bad z;{w9en2jpf-+@8HcR7O*FyQfrAR>FvNMO|V{r>+zkpTvQ0%1W~UNTx?N>N9OzqMH4 zoz`?gz7{i9QI#E#H7Qv9q?~fFe2sYVdoC(4;LZg^{MhR0y9+ltJdeWY9z;`%`xu9s8rvTfKU=~c`OS)ufxpYEI@ zj5R|bnb%cnG@9#GEy7da9i1{2dgQo7ORC{qZ1)gV3rSXP4!OYXb2(Pn9lwwYEBC`A z-pPfsC8WjplyGZ}F0)JTUWW1o0wG4njBbSTi>mz|CU-jv+}EFQf$5{pA#OoM(vPpg zfl4PPjS-c4rpSCO-iNF5?Wb#n$cTH)6Z@8Vhgk9_oxEa!t)8|=vf ze{dVuU8E2#zBjw@-V*QSk+?@RNGdDv={rJP>g3EPG%<8iK)pwN?) zcDg+KK63Oc)!)sW+r;k)v&gDfXU=Icr?>GfA;&^ygB5easSt{=_t}rwiMWCHadM!) zc;%g$RRCY5{scSBf&%h^o7^O*@f(xe_Aw%8Ip2zLFI%PhZ)h$hqX;qkxT}r#vwgU< zxQGwQ!s626ukfMD4-q~{np?C07Rq<=FPT~R760HL&Tw&&sdQRlA9;1VoEs;FmIN)P zF-uzkc*}f~x>hV%fZwa;IOX+pcn29}cxD-MtgaDPtaVco*fezxkAWi9s{BsIO@yiI zy^Hb*KjvE2wB?*!A%qR8&v345jAN5xSB>Q?l^2v?57ZPnKTSVut8XQM04}pXR_Q9u z0$w4%fdWP=kM^;0BmFUZI8ngro7S|N90TT}B6MLF@nki^oW;x~w*=ubCr-HwzeH}v z@}nxN_S~mHGHxtRH0tpRDda6kQQPjZJe-tJkP1~RxFhQ}%N6k8?reQ>`~J5}vgB_}1~<<2BDG8YI5>GtE;p=dMBvBX?;Z2t;R9gKy4#Jtx?L?DT#}7s!PR~L%B&)chKZS@kd9-S{%Esv7f?WV7mgZN5H!Bb^P>g|Rq*Y6~ zXRPKyb?B%w7@eR}1Le0>ua?IS%097`OiSYPbQfT$W^y_7(Mo>T_G$5_eKTzuz4C^& zcZ+vP`lOi6sySVPlEcpI90Yg)*ReLQuy6mki}*JLxZKcJ*|)$_CL1>^b=3dz%^MzI ze%jUuMGKp#TL%ookL+UnC*38;L-*v8H&8L5pQ7|gXX!qTi_GW{CyNuZK}CGdkeVzo z-3RPPExIG=RC*iF&fK4|F;(39Bpex^QIeAETyO2sr>o2-q(~tqRHJbMMjC?I)i<`ZI1sgzc~s z-G`+M)i@>+LB{tKHx#1+YEhaU=tmmEt^fviXm&dyZO#_?3$Z4iTe^c%2O=PXs-bqt zmnM(J@mnq~r`<6)UdprP6Z*J={6%0?}#bzFvo@O>W^7xWoJ7$GEO(M z>e#O2c8VbwDm*rmq_*M9EfyZZZ+OX&<>Mp$9>kSmFwV*?HVLz-M0k@6-e3S0ba{7X zXI3~4zVG~}Vhb+q$}g}`UGTf|beYpx;DcKuKU=KQ?V&Vk~PrWqgcmy*0D zLlnItgM`g*A9Nrn-iJvw`do~`zD!kR_^VrZrF(6E>ll|{4f3~d82+>-ua_lZWpzClg=HG7nU%qqcRNPpm3=ylGAr{P7 zWD&Ct z92M5wE5PPB3|QnKtv1x|$PLuqJw$E&=mNkLFGRE2O!VfGLKNJ?!J}r>UZ1zJ!%l^R zJWM$fXuRABPP$&3+gwVkMgq?&jrV3|H}x-mmLifV*WH8Q*=B1$eU678J&Y(xLgM80k4+; zhZX%3x>4Yjp)tHBewPo$nI>gh zwYhWeuI5`1(sM1g_bg$>Qr8X655ptGDhfPD{aiDZqfImBf zROhGDNtkv+YpQ!SbNz?AK#LJLy@`j}o***8B(q88sfD1%;c7)511TUo!sWMldG4lM z%0Xv0sU!}ty2WbCaZC-X3ZN3#*3EZvKt(PqKC10~0@a6MBe+}eN(G7-8f6Wk!lCi@ zwp9|uZ?*FaAF3uVZeP5U{P|~?2Fk(WSB*5Ic2?8*EG`n(s{-pgaLaIxH!t9i`Uaop zhFe$^58E3Hi<^tTT0lvKO6_Yl5U3Y|O^9B21CAc7*&NUL8Dt*BW@0mlvKfeT2Rf@gc7FI>6 zM<>@-L3u#d3|!*GwRHh)E&Z;p&| zXkJ3TJmz%{Jd@5Tq!MM0a!-GpeXIq+$sB{=rljBBY zMZ?@6DluT8S;Go{o7@v{jJ5fDTF~5IwOvG>IIs87DE)K3#)Qg9NzAJsIyhv~lv1XD0EHf}WjTbx3xiJnSPP(o zuB+43Rr1@kmL`UwDysfAA;0!SJKT+%;xkMyE`T|J#n`Eutj@oD4%QKgdl&dGUGQ*eu@ZX_EJ{U0K>&bb zWOhtLjoFZqN#9NpM=<*e{ zO=_X5-X?mv4jfiUx7O^P%y%*`Xd>0;p7k%zjR;b(x|`dpbe80b>4*EHuGXRp1x") - (:license "GPL") - (:slime-dependencies slime-references) - (:swank-dependencies swank-sbcl-exts)) - -(defun slime-sbcl-bug-at-point () - (save-excursion - (save-match-data - (unless (looking-at "#[0-9]\\{6\\}") - (search-backward-regexp "#\\<" (line-beginning-position) t)) - (when (looking-at "#[0-9]\\{6\\}") - (buffer-substring-no-properties (match-beginning 0) (match-end 0)))))) - -(defun slime-read-sbcl-bug (prompt &optional query) - "Either read a sbcl bug or choose the one at point. -The user is prompted if a prefix argument is in effect, if there is no -symbol at point, or if QUERY is non-nil." - (let ((bug (slime-sbcl-bug-at-point))) - (cond ((or current-prefix-arg query (not bug)) - (slime-read-from-minibuffer prompt bug)) - (t bug)))) - -(defun slime-visit-sbcl-bug (bug) - "Visit the Launchpad site that describes `bug' (#nnnnnn)." - (interactive (list (slime-read-sbcl-bug "Bug number (#nnnnnn): "))) - (browse-url (format "http://bugs.launchpad.net/sbcl/+bug/%s" - (substring bug 1)))) - -(provide 'slime-sbcl-exts) diff --git a/elpa/slime-20200414.1444/contrib/slime-sbcl-exts.elc b/elpa/slime-20200414.1444/contrib/slime-sbcl-exts.elc deleted file mode 100644 index 477a7b1be89bae5fde907033a12898cb5525fef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2085 zcmbtVU2oeq6!l}~J?vq?+PB`xTWh0{W691}Qw;5bU?>n^TbB(OA_JqOYnzBfsw9<< z4*Tyrlx)XInqfc%&@#!(`*H5!(b382@sm!c(>*#mqGMfFvf#X#NJS^5$Shs5u~I9F z_lDzU=SsQ-iJ~A~Ia$h&!eQGEyUpg=LRy-^3)Pk_Z*p-o}V*UpAgNk_eN zC5zk8K4KDV#2;g2;#ZourKmER)hhFZ=(i4U12!H9>pa>N`}Rtxi`%e+DUGN9nOCiR zCm+k~|K!nnSVj5-!cCduQCplZc|6+1*u&UQ#vc4A!ib-5^_G=awObbE$!TP2m(w+# zWH{3Xg!DZ@M;oh$APul|50U$x+Rof>*AkX~aHdn=&*LGzm(E==uAiaTE;DathB=ka z4s-q?K%n5KUrqzS5IstSw4R5;g_V}-mJ4y@0g31-eq(UK!_q+I={NbhgXtPA@^As9 zhOld+-DfarAxz?U;-SQQHwj)Y;k4qC!&10x5$3`PRE%4#L_xP}8w7~9noL$KeDtto zx8aodQdHUq$DVSK2YmraLb(+5&PUw(rX|&O6wUeTWIUFmAg>surj)0<0PbPG^Gis-g^`6P3QzViar?z zwFPicbU}&Vg&*=1%)W6 z^|-8e^Jd(k>PmW$-VDfuCB&@l26|2X-gh*lXfm1%8vJ(;=nsjmH5i`?=+~k`8?fSG z2jDr|40jqm`wL-Sz=3L>!KXmE^serpf-@}y5RFDm#-6aC{b={+Bv^^IuQxUN%5qqn zf@a!)>=Z1Vt6uHwVAl?dRc=GYZpV{k=Os3FzPABIgeFaCZ&ls?!9K2dA@OxxEAeKx ff*%o2)ny6-t?PM3!N6nU8+j@5(YgOs7 -;; -;; License: GNU GPL (same license as Emacs) -;; -;;; Installation: -;; -;; Add this to your .emacs: -;; -;; (add-to-list 'load-path "") -;; (add-hook 'slime-load-hook (lambda () (require 'slime-scheme))) -;; -(eval-and-compile - (require 'slime)) - -(defun slime-scheme-mode-hook () - (slime-mode 1)) - -(defun slime-scheme-indentation-update (symbol indent packages) - ;; Does the symbol have an indentation value that we set? - (when (equal (get symbol 'scheme-indent-function) - (get symbol 'slime-scheme-indent)) - (put symbol 'slime-scheme-indent indent) - (put symbol 'scheme-indent-function indent))) - - -;;; Initialization - -(defun slime-scheme-init () - (add-hook 'scheme-mode-hook 'slime-scheme-mode-hook) - (add-hook 'slime-indentation-update-hooks 'slime-scheme-indentation-update) - (add-to-list 'slime-lisp-modes 'scheme-mode)) - -(defun slime-scheme-unload () - (remove-hook 'scheme-mode-hook 'slime-scheme-mode-hook) - (remove-hook 'slime-indentation-update-hooks 'slime-scheme-indentation-update) - (setq slime-lisp-modes (remove 'scheme-mode slime-lisp-modes))) - -(provide 'slime-scheme) diff --git a/elpa/slime-20200414.1444/contrib/slime-scheme.elc b/elpa/slime-20200414.1444/contrib/slime-scheme.elc deleted file mode 100644 index e254ea422e0c8067bae94d95e53f40fea7515fd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1215 zcmbtT!A|2a5bY6i+RKXTP!8Klq-vZN7WK5MI3TUK?A}NZ#&(H?V`pur2)>@NlNPcC z4iL#vX2yB%%^Q1h`FnXZ7z~odVgXB2)lvx_1F7M%qRhcYSSO7JayH3h90S_t1Dn7wUl|3cpB-c=HLu4s^M0EGPFn1wcx>R2f%kyeI_v^3@(PHwbRFf8)v z6jyd!km>mlZsPxO8)PdWtM{R#<^l~4gG`&6Q!fy6AKM@&_gS_SA@FpE0}$#U;6)D z2pWrFrzEJ!gQ8t#j?o#e^N@-1@I") - (:license "GPL") - (:on-load - (def-slime-selector-method ?s "*slime-scratch* buffer." - (slime-scratch-buffer)))) - - -;;; Code - -(defvar slime-scratch-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map lisp-mode-map) - map)) - -(defun slime-scratch () - (interactive) - (slime-switch-to-scratch-buffer)) - -(defun slime-switch-to-scratch-buffer () - (set-buffer (slime-scratch-buffer)) - (unless (eq (current-buffer) (window-buffer)) - (pop-to-buffer (current-buffer) t))) - -(defvar slime-scratch-file nil) - -(defun slime-scratch-buffer () - "Return the scratch buffer, create it if necessary." - (or (get-buffer (slime-buffer-name :scratch)) - (with-current-buffer (if slime-scratch-file - (find-file slime-scratch-file) - (get-buffer-create (slime-buffer-name :scratch))) - (rename-buffer (slime-buffer-name :scratch)) - (lisp-mode) - (use-local-map slime-scratch-mode-map) - (slime-mode t) - (current-buffer)))) - -(slime-define-keys slime-scratch-mode-map - ("\C-j" 'slime-eval-print-last-expression)) - -(provide 'slime-scratch) diff --git a/elpa/slime-20200414.1444/contrib/slime-scratch.elc b/elpa/slime-20200414.1444/contrib/slime-scratch.elc deleted file mode 100644 index f7e9fcab71726e09fbfb736eccf1fd0c12e5115f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2255 zcmbtW&2QT_6!+2bslX2FZO=-#*u!w?v_wZlB~m46XW3uB z_b5uXl4h3*kj#(A_xXE2`r_){<=2D3V03YD0hhX}Whrt$kqWLVo>|xnW2IJ*EN7|T zxs|Q}UY4M1CoB0ccerh5Bft4~AuViC3+$}0kl!g@$qaIxS!blWv1hnztOK6sB8SdO z{BoAOe4r!Os6%N7nO2UY@Xl@73tUm`m-m-%-$GV!!!w62o_X_J_sd>*x z2*rZnrj){fD^M^=8@rf-FM7yOJglPAK_%3+U6+59)Xy?gmUV$aleLS3N?NPxc(R+tf>p3Z9yQx-wsuj z_3wtKL3h1#A(hngMs93BvtUG~4R$%99^1sr9093^^&Wm$h-?!5F3JkcT$Lqq0K6^) z4c=tBs*qSpY3rF1?x$!9ljyfU-$m0k#G$SBn83c$3LBMSLf~HbEig|SBo137ktms9 z-NA}~6wKD#Si!JJBw!IX&5+@`P!2OZeY|GJ#Ui*9VuP0*DB8R|W{jO*_rfrN`*9S}kg&JIXm~4NspwH9M>6=9Y ze+joU3RxUUu(1%D>I^a?xD$YUC%2$PM$KpLX5Tzcj-gEt^w>}%0@t&|k`2rdqf9-? zEE<}4N)Z!~J;29fpAwuRTeeFLv&M6*3z1G7p9C^*DAP~s794$O`Dpt~9cT_*5%Ac! z&+xj%UT?FpMQUPR%|V`p)F7--wk<*jNxHXLsga&NsvGlU)>j55r_W#p@hVwPAGUmq z_d;`{U^jb;^<+#Wdj!dVg)S7lt)%kM$6HB7As(?u4{H3&;8@A6W8$CMU=it`NNx09 NqC>sZtl@k*`VaE}x1az3 diff --git a/elpa/slime-20200414.1444/contrib/slime-snapshot.el b/elpa/slime-20200414.1444/contrib/slime-snapshot.el deleted file mode 100644 index 1643ecca..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-snapshot.el +++ /dev/null @@ -1,34 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-snapshot - "Save&restore memory images without disconnecting" - (:authors "Helmut Eller ") - (:license "GPL v3") - (:swank-dependencies swank-snapshot)) - -(defun slime-snapshot (filename &optional background) - "Save a memory image to the file FILENAME." - (interactive (list (read-file-name "Image file: ") - current-prefix-arg)) - (let ((file (expand-file-name filename))) - (when (and (file-exists-p file) - (not (yes-or-no-p (format "File exists %s. Overwrite it? " - filename)))) - (signal 'quit nil)) - (slime-eval-with-transcript - `(,(if background - 'swank-snapshot:background-save-snapshot - 'swank-snapshot:save-snapshot) - ,file)))) - -(defun slime-restore (filename) - "Restore a memory image stored in file FILENAME." - (interactive (list (read-file-name "Image file: "))) - ;; bypass event dispatcher because we don't expect a reply. FIXME. - (slime-net-send `(:emacs-rex (swank-snapshot:restore-snapshot - ,(expand-file-name filename)) - nil t nil) - (slime-connection))) - -(provide 'slime-snapshot) diff --git a/elpa/slime-20200414.1444/contrib/slime-snapshot.elc b/elpa/slime-20200414.1444/contrib/slime-snapshot.elc deleted file mode 100644 index f94e656b9b53cdd517a9e6ae26890dce5fa68245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1707 zcmbtUSx?(Q5ato`2iiV$VtUvT8<9Aisd@mRMWTn=zBN27_9R(h@4CC20R8oyv7H1$ zL6xwy$)0n3-+a^SpB_G0Sy^fHdObKad7&~)%Z1X=&t>9Ziq5j$JFiyP>uidNuM^+`vFhB_ z%NayqF)@~Ef}tdL<)t$3(}J5gi(eK&?5a*7}!$K2R!P`Ml-ctf>_m2i$vPWxXzeD1fN z-%mXu9DJm&GomHe(ma4t?+f36R|N@C@U|!;EN6J7oOhytYjna`p$*N4 z#^%yPaLg^Ex&bd;3*ak>_0lSjp!_=sz^M^uNYd~(>K3Om6Wox5w^F;rs)8!wRt@hj z0uzp)pBMM?y<3N8(1mdQ1+-vyw@XA4s~$+2@@87WNl6}Ow+}>jGO-r57lp;4x)Rck zB2o{Lz6amYc|)RJ;=SA~+aMc(hp4x;g&WLQBv+EJb+g($Vv-LI=yx0DvS;fh6IDf1 zc?yTrEBBFmJjwrR8I9WA0\ -\\{slime-sprof-browser-mode-map}" - :syntax-table lisp-mode-syntax-table - (setq buffer-read-only t)) - -(set-keymap-parent slime-sprof-browser-mode-map slime-parent-map) - -(slime-define-keys slime-sprof-browser-mode-map - ("h" 'describe-mode) - ("d" 'slime-sprof-browser-disassemble-function) - ("g" 'slime-sprof-browser-go-to) - ("v" 'slime-sprof-browser-view-source) - ("s" 'slime-sprof-toggle-swank-exclusion) - ((kbd "RET") 'slime-sprof-browser-toggle)) - -;; Start / stop profiling - -(cl-defun slime-sprof-start (&optional (mode :cpu)) - (interactive) - (slime-eval `(swank:swank-sprof-start :mode ,mode))) - -(defun slime-sprof-start-alloc () - (interactive) - (slime-sprof-start :alloc)) - -(defun slime-sprof-start-time () - (interactive) - (slime-sprof-start :time)) - -(defun slime-sprof-stop () - (interactive) - (slime-eval `(swank:swank-sprof-stop))) - -;; Reporting - -(defun slime-sprof-format (graph) - (with-current-buffer (slime-buffer-name :sprof) - (let ((inhibit-read-only t)) - (erase-buffer) - (insert (format "%4s %-54s %6s %6s %6s\n" - "Rank" - "Name" - "Self%" - "Cumul%" - "Total%")) - (dolist (data graph) - (slime-sprof-browser-insert-line data 54)))) - (forward-line 2)) - -(cl-defun slime-sprof-update (&optional (exclude-swank slime-sprof-exclude-swank)) - (slime-eval-async `(swank:swank-sprof-get-call-graph - :exclude-swank ,exclude-swank) - 'slime-sprof-format)) - -(defalias 'slime-sprof-browser 'slime-sprof-report) - -(defun slime-sprof-report () - (interactive) - (slime-with-popup-buffer ((slime-buffer-name :sprof) - :connection t - :select t - :mode 'slime-sprof-browser-mode) - (slime-sprof-update))) - -(defun slime-sprof-toggle-swank-exclusion () - (interactive) - (setq slime-sprof-exclude-swank - (not slime-sprof-exclude-swank)) - (slime-sprof-update)) - -(defun slime-sprof-browser-insert-line (data name-length) - (cl-destructuring-bind (index name self cumul total) - data - (if index - (insert (format "%-4d " index)) - (insert " ")) - (slime-insert-propertized - (slime-sprof-browser-name-properties) - (format (format "%%-%ds " name-length) - (slime-sprof-abbreviate-name name name-length))) - (insert (format "%6.2f " self)) - (when cumul - (insert (format "%6.2f " cumul)) - (when total - (insert (format "%6.2f" total)))) - (when index - (slime-sprof-browser-add-line-text-properties - `(profile-index ,index expanded nil))) - (insert "\n"))) - -(defun slime-sprof-abbreviate-name (name max-length) - (cl-subseq name 0 (min (length name) max-length))) - -;; Expanding / collapsing - -(defun slime-sprof-browser-toggle () - (interactive) - (let ((index (get-text-property (point) 'profile-index))) - (when index - (save-excursion - (if (slime-sprof-browser-line-expanded-p) - (slime-sprof-browser-collapse) - (slime-sprof-browser-expand)))))) - -(defun slime-sprof-browser-collapse () - (let ((inhibit-read-only t)) - (slime-sprof-browser-add-line-text-properties '(expanded nil)) - (forward-line) - (cl-loop until (or (eobp) - (get-text-property (point) 'profile-index)) - do - (delete-region (point-at-bol) (point-at-eol)) - (unless (eobp) - (delete-char 1))))) - -(defun slime-sprof-browser-expand () - (lexical-let* ((buffer (current-buffer)) - (point (point)) - (index (get-text-property point 'profile-index))) - (slime-eval-async `(swank:swank-sprof-expand-node ,index) - (lambda (data) - (with-current-buffer buffer - (save-excursion - (destructuring-bind (&key callers calls) - data - (slime-sprof-browser-add-expansion callers - "Callers" - 0) - (slime-sprof-browser-add-expansion calls - "Calls" - 0)))))))) - -(defun slime-sprof-browser-add-expansion (data type nesting) - (when data - (let ((inhibit-read-only t)) - (slime-sprof-browser-add-line-text-properties '(expanded t)) - (end-of-line) - (insert (format "\n %s" type)) - (dolist (node data) - (cl-destructuring-bind (index name cumul) node - (insert (format (format "\n%%%ds" (+ 7 (* 2 nesting))) "")) - (slime-insert-propertized - (slime-sprof-browser-name-properties) - (let ((len (- 59 (* 2 nesting)))) - (format (format "%%-%ds " len) - (slime-sprof-abbreviate-name name len)))) - (slime-sprof-browser-add-line-text-properties - `(profile-sub-index ,index)) - (insert (format "%6.2f" cumul))))))) - -(defun slime-sprof-browser-line-expanded-p () - (get-text-property (point) 'expanded)) - -(defun slime-sprof-browser-add-line-text-properties (properties) - (add-text-properties (point-at-bol) - (point-at-eol) - properties)) - -(defun slime-sprof-browser-name-properties () - '(face sldb-restart-number-face)) - -;; "Go to function" - -(defun slime-sprof-browser-go-to () - (interactive) - (let ((sub-index (get-text-property (point) 'profile-sub-index))) - (when sub-index - (let ((pos (text-property-any - (point-min) (point-max) 'profile-index sub-index))) - (when pos (goto-char pos)))))) - -;; Disassembly - -(defun slime-sprof-browser-disassemble-function () - (interactive) - (let ((index (or (get-text-property (point) 'profile-index) - (get-text-property (point) 'profile-sub-index)))) - (when index - (slime-eval-describe `(swank:swank-sprof-disassemble - ,index))))) - -;; View source - -(defun slime-sprof-browser-view-source () - (interactive) - (let ((index (or (get-text-property (point) 'profile-index) - (get-text-property (point) 'profile-sub-index)))) - (when index - (slime-eval-async - `(swank:swank-sprof-source-location ,index) - (lambda (source-location) - (slime-dcase source-location - ((:error message) - (message "%s" message) - (ding)) - (t - (slime-show-source-location source-location)))))))) - -(provide 'slime-sprof) diff --git a/elpa/slime-20200414.1444/contrib/slime-sprof.elc b/elpa/slime-20200414.1444/contrib/slime-sprof.elc deleted file mode 100644 index 45e42d7a61c4cfd83b96575e02f6438fb6a85123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9956 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 diff --git a/elpa/slime-20200414.1444/contrib/slime-trace-dialog.el b/elpa/slime-20200414.1444/contrib/slime-trace-dialog.el deleted file mode 100644 index fd25c7b8..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-trace-dialog.el +++ /dev/null @@ -1,837 +0,0 @@ -;;; -*- coding: utf-8; lexical-binding: t -*- -;;; -;;; slime-trace-dialog.el -- a navigable dialog of inspectable trace entries -;;; -;;; TODO: implement better wrap interface for sbcl method, labels and such -;;; TODO: backtrace printing is very slow -;;; -(require 'slime) -(require 'slime-parse) -(require 'slime-repl) -(require 'cl-lib) - -(define-slime-contrib slime-trace-dialog - "Provide an interfactive trace dialog buffer for managing and -inspecting details of traced functions. Invoke this dialog with C-c T." - (:authors "João Távora ") - (:license "GPL") - (:swank-dependencies swank-trace-dialog) - (:on-load (add-hook 'slime-mode-hook 'slime-trace-dialog-enable) - (add-hook 'slime-repl-mode-hook 'slime-trace-dialog-enable)) - (:on-unload (remove-hook 'slime-mode-hook 'slime-trace-dialog-enable) - (remove-hook 'slime-repl-mode-hook 'slime-trace-dialog-enable))) - - -;;;; Variables -;;; -(defvar slime-trace-dialog-flash t - "Non-nil means flash the updated region of the SLIME Trace Dialog. ") - -(defvar slime-trace-dialog--specs-overlay nil) - -(defvar slime-trace-dialog--progress-overlay nil) - -(defvar slime-trace-dialog--tree-overlay nil) - -(defvar slime-trace-dialog--collapse-chars (cons "-" "+")) - - -;;;; Local trace entry model -(defvar slime-trace-dialog--traces nil) - -(cl-defstruct (slime-trace-dialog--trace - (:constructor slime-trace-dialog--make-trace)) - id - parent - spec - args - retlist - depth - beg - end - collapse-button-marker - summary-beg - children-end - collapsed-p) - -(defun slime-trace-dialog--find-trace (id) - (gethash id slime-trace-dialog--traces)) - - -;;;; Modes and mode maps -;;; -(defvar slime-trace-dialog-mode-map - (let ((map (make-sparse-keymap)) - (remaps '((slime-inspector-operate-on-point . nil) - (slime-inspector-operate-on-click . nil) - (slime-inspector-reinspect - . slime-trace-dialog-fetch-status) - (slime-inspector-next-inspectable-object - . slime-trace-dialog-next-button) - (slime-inspector-previous-inspectable-object - . slime-trace-dialog-prev-button)))) - (set-keymap-parent map slime-inspector-mode-map) - (cl-loop for (old . new) in remaps - do (substitute-key-definition old new map)) - (set-keymap-parent map slime-parent-map) - (define-key map (kbd "G") 'slime-trace-dialog-fetch-traces) - (define-key map (kbd "C-k") 'slime-trace-dialog-clear-fetched-traces) - (define-key map (kbd "g") 'slime-trace-dialog-fetch-status) - (define-key map (kbd "M-RET") 'slime-trace-dialog-copy-down-to-repl) - (define-key map (kbd "q") 'quit-window) - map)) - -(define-derived-mode slime-trace-dialog-mode fundamental-mode - "SLIME Trace Dialog" "Mode for controlling SLIME's Trace Dialog" - (set-syntax-table lisp-mode-syntax-table) - (read-only-mode 1) - (add-to-list (make-local-variable 'slime-trace-dialog-after-toggle-hook) - 'slime-trace-dialog-fetch-status)) - -(define-derived-mode slime-trace-dialog--detail-mode slime-inspector-mode - "SLIME Trace Detail" - "Mode for viewing a particular trace from SLIME's Trace Dialog") - -(setq slime-trace-dialog--detail-mode-map - (let ((map (make-sparse-keymap)) - (remaps '((slime-inspector-next-inspectable-object - . slime-trace-dialog-next-button) - (slime-inspector-previous-inspectable-object - . slime-trace-dialog-prev-button)))) - (set-keymap-parent map slime-trace-dialog-mode-map) - (cl-loop for (old . new) in remaps - do (substitute-key-definition old new map)) - map)) - -(defvar slime-trace-dialog-minor-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-c T") 'slime-trace-dialog) - (define-key map (kbd "C-c M-t") 'slime-trace-dialog-toggle-trace) - map)) - -(define-minor-mode slime-trace-dialog-minor-mode - "Add keybindings for accessing SLIME's Trace Dialog.") - -(defun slime-trace-dialog-enable () - (slime-trace-dialog-minor-mode 1)) - -(easy-menu-define slime-trace-dialog--menubar (list slime-trace-dialog-minor-mode-map - slime-trace-dialog-mode-map) - "A menu for accessing some features of SLIME's Trace Dialog" - (let* ((in-dialog '(eq major-mode 'slime-trace-dialog-mode)) - (dialog-live `(and ,in-dialog - (memq slime-buffer-connection slime-net-processes))) - (connected '(slime-connected-p))) - `("Trace" - ["Toggle trace" slime-trace-dialog-toggle-trace ,connected] - ["Trace complex spec" slime-trace-dialog-toggle-complex-trace ,connected] - ["Open Trace dialog" slime-trace-dialog (and ,connected (not ,in-dialog))] - "--" - [ "Refresh traces and progress" slime-trace-dialog-fetch-status ,dialog-live] - [ "Fetch next batch" slime-trace-dialog-fetch-traces ,dialog-live] - [ "Clear all fetched traces" slime-trace-dialog-clear-fetched-traces ,dialog-live] - [ "Toggle details" slime-trace-dialog-hide-details-mode ,in-dialog] - [ "Toggle autofollow" slime-trace-dialog-autofollow-mode ,in-dialog]))) - -(define-minor-mode slime-trace-dialog-hide-details-mode - "Hide details in `slime-trace-dialog-mode'" - nil " Brief" - :group 'slime-trace-dialog - (unless (derived-mode-p 'slime-trace-dialog-mode) - (error "Not a SLIME Trace Dialog buffer")) - (slime-trace-dialog--set-hide-details-mode)) - -(define-minor-mode slime-trace-dialog-autofollow-mode - "Automatically open buffers with trace details from `slime-trace-dialog-mode'" - nil " Autofollow" - :group 'slime-trace-dialog - (unless (derived-mode-p 'slime-trace-dialog-mode) - (error "Not a SLIME Trace Dialog buffer"))) - - -;;;; Helper functions -;;; -(defun slime-trace-dialog--call-refreshing (buffer - overlay - dont-erase - recover-point-p - fn) - (with-current-buffer buffer - (let ((inhibit-point-motion-hooks t) - (inhibit-read-only t) - (saved (point))) - (save-restriction - (when overlay - (narrow-to-region (overlay-start overlay) - (overlay-end overlay))) - (unwind-protect - (if dont-erase - (goto-char (point-max)) - (delete-region (point-min) (point-max))) - (funcall fn) - (when recover-point-p - (goto-char saved))) - (when slime-trace-dialog-flash - (slime-flash-region (point-min) (point-max))))) - buffer)) - -(cl-defmacro slime-trace-dialog--refresh ((&key - overlay - dont-erase - recover-point-p - buffer) - &rest body) - (declare (indent 1) - (debug (sexp &rest form))) - `(slime-trace-dialog--call-refreshing ,(or buffer - `(current-buffer)) - ,overlay - ,dont-erase - ,recover-point-p - #'(lambda () ,@body))) - -(defmacro slime-trace-dialog--insert-and-overlay (string overlay) - `(save-restriction - (let ((inhibit-read-only t)) - (narrow-to-region (point) (point)) - (insert ,string "\n") - (set (make-local-variable ',overlay) - (let ((overlay (make-overlay (point-min) - (point-max) - (current-buffer) - nil - t))) - (move-overlay overlay (overlay-start overlay) - (1- (overlay-end overlay))) - ;; (overlay-put overlay 'face '(:background "darkslategrey")) - overlay))))) - -(defun slime-trace-dialog--buffer-name () - (format "*traces for %s*" - (slime-connection-name slime-default-connection))) - -(defun slime-trace-dialog--live-dialog (&optional buffer-or-name) - (let ((buffer-or-name (or buffer-or-name - (slime-trace-dialog--buffer-name)))) - (and (buffer-live-p (get-buffer buffer-or-name)) - (with-current-buffer buffer-or-name - (memq slime-buffer-connection slime-net-processes)) - buffer-or-name))) - -(defun slime-trace-dialog--ensure-buffer () - (let ((name (slime-trace-dialog--buffer-name))) - (or (slime-trace-dialog--live-dialog name) - (with-current-buffer (get-buffer-create name) - (let ((inhibit-read-only t)) - (erase-buffer)) - (slime-trace-dialog-mode) - (save-excursion - (buffer-disable-undo) - (slime-trace-dialog--insert-and-overlay - "[waiting for the traced specs to be available]" - slime-trace-dialog--specs-overlay) - (slime-trace-dialog--insert-and-overlay - "[waiting for some info on trace download progress ]" - slime-trace-dialog--progress-overlay) - (slime-trace-dialog--insert-and-overlay - "[waiting for the actual traces to be available]" - slime-trace-dialog--tree-overlay) - (current-buffer)) - (setq slime-buffer-connection slime-default-connection) - (current-buffer))))) - -(defun slime-trace-dialog--make-autofollow-fn (id) - (let ((requested nil)) - #'(lambda (_before after) - (let ((inhibit-point-motion-hooks t) - (id-after (get-text-property after 'slime-trace-dialog--id))) - (when (and (= after (point)) - slime-trace-dialog-autofollow-mode - id-after - (= id-after id) - (not requested)) - (setq requested t) - (slime-eval-async `(swank-trace-dialog:report-trace-detail - ,id-after) - #'(lambda (detail) - (setq requested nil) - (when detail - (let ((inhibit-point-motion-hooks t)) - (slime-trace-dialog--open-detail detail - 'no-pop)))))))))) - -(defun slime-trace-dialog--set-collapsed (collapsed-p trace button) - (save-excursion - (setf (slime-trace-dialog--trace-collapsed-p trace) collapsed-p) - (slime-trace-dialog--go-replace-char-at - button - (if collapsed-p - (cdr slime-trace-dialog--collapse-chars) - (car slime-trace-dialog--collapse-chars))) - (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-summary-beg trace) - (slime-trace-dialog--trace-end trace) - (if collapsed-p 1 -1)) - (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-end trace) - (slime-trace-dialog--trace-children-end trace) - (if collapsed-p 1 -1)))) - -(defun slime-trace-dialog--hide-unhide (start-pos end-pos delta) - (cl-loop with inhibit-read-only = t - for pos = start-pos then next - for next = (next-single-property-change - pos - 'slime-trace-dialog--hidden-level - nil - end-pos) - for hidden-level = (+ (or (get-text-property - pos - 'slime-trace-dialog--hidden-level) - 0) - delta) - do (add-text-properties pos next - (list 'slime-trace-dialog--hidden-level - hidden-level - 'invisible - (cl-plusp hidden-level))) - while (< next end-pos))) - -(defun slime-trace-dialog--set-hide-details-mode () - (cl-loop for trace being the hash-values of slime-trace-dialog--traces - do (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-summary-beg trace) - (slime-trace-dialog--trace-end trace) - (if slime-trace-dialog-hide-details-mode 1 -1)))) - -(defun slime-trace-dialog--format-part (part-id part-text trace-id type) - (slime-trace-dialog--button - (format "%s" part-text) - #'(lambda (_button) - (slime-eval-async - `(swank-trace-dialog:inspect-trace-part ,trace-id ,part-id ,type) - #'slime-open-inspector)) - 'mouse-face 'highlight - 'slime-trace-dialog--part-id part-id - 'slime-trace-dialog--type type - 'face 'slime-inspector-value-face)) - -(defun slime-trace-dialog--format-trace-entry (id external) - (slime-trace-dialog--button - (format "%s" external) - #'(lambda (_button) - (slime-eval-async - `(swank::inspect-object (swank-trace-dialog::find-trace ,id)) - #'slime-open-inspector)) - 'face 'slime-inspector-value-face)) - -(defun slime-trace-dialog--format (fmt-string &rest args) - (let* ((string (apply #'format fmt-string args)) - (indent (make-string (max 2 - (- 50 (length string))) ? ))) - (format "%s%s" string indent))) - -(defun slime-trace-dialog--button (title lambda &rest props) - (let ((string (format "%s" title))) - (apply #'make-text-button string nil - 'action #'(lambda (button) - (funcall lambda button)) - 'mouse-face 'highlight - 'face 'slime-inspector-action-face - props) - string)) - -(defun slime-trace-dialog--call-maintaining-properties (pos fn) - (save-excursion - (goto-char pos) - (let* ((saved-props (text-properties-at pos)) - (saved-point (point)) - (inhibit-read-only t) - (inhibit-point-motion-hooks t)) - (funcall fn) - (add-text-properties saved-point (point) saved-props) - (if (markerp pos) (set-marker pos saved-point))))) - -(cl-defmacro slime-trace-dialog--maintaining-properties (pos - &body body) - (declare (indent 1)) - `(slime-trace-dialog--call-maintaining-properties ,pos #'(lambda () ,@body))) - -(defun slime-trace-dialog--go-replace-char-at (pos char) - (slime-trace-dialog--maintaining-properties pos - (delete-char 1) - (insert char))) - - -;;;; Handlers for the *trace-dialog* and *trace-detail* buffers -;;; -(defun slime-trace-dialog--open-specs (traced-specs) - (cl-labels ((make-report-spec-fn - (&optional form) - #'(lambda (_button) - (slime-eval-async - `(cl:progn - ,form - (swank-trace-dialog:report-specs)) - #'(lambda (results) - (slime-trace-dialog--open-specs results)))))) - (slime-trace-dialog--refresh - (:overlay slime-trace-dialog--specs-overlay - :recover-point-p t) - (insert - (slime-trace-dialog--format "Traced specs (%s)" (length traced-specs)) - (slime-trace-dialog--button "[refresh]" - (make-report-spec-fn)) - "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[untrace all]" - (make-report-spec-fn `(swank-trace-dialog:dialog-untrace-all))) - "\n\n") - (cl-loop for spec in traced-specs - do (insert - " " - (slime-trace-dialog--button - "[untrace]" - (make-report-spec-fn - `(swank-trace-dialog:dialog-untrace ',spec))) - (format " %s" spec) - "\n"))))) - -(defvar slime-trace-dialog--fetch-key nil) - -(defvar slime-trace-dialog--stop-fetching nil) - -(defun slime-trace-dialog--update-progress (total &optional show-stop-p remaining-p) - ;; `remaining-p' indicates `total' is the number of remaining traces. - (slime-trace-dialog--refresh - (:overlay slime-trace-dialog--progress-overlay - :recover-point-p t) - (let* ((done (hash-table-count slime-trace-dialog--traces)) - (total (if remaining-p (+ done total) total))) - (insert - (slime-trace-dialog--format "Trace collection status (%d/%s)" - done - (or total "0")) - (slime-trace-dialog--button "[refresh]" - #'(lambda (_button) - (slime-trace-dialog-fetch-progress)))) - - (when (and total (cl-plusp (- total done))) - (insert "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[fetch next batch]" - #'(lambda (_button) - (slime-trace-dialog-fetch-traces nil))) - "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[fetch all]" - #'(lambda (_button) - (slime-trace-dialog-fetch-traces t))))) - (when total - (insert "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[clear]" - #'(lambda (_button) - (slime-trace-dialog-clear-fetched-traces))))) - (when show-stop-p - (insert "\n" (make-string 50 ? ) - (slime-trace-dialog--button - "[stop]" - #'(lambda (_button) - (setq slime-trace-dialog--stop-fetching t))))) - (insert "\n\n")))) - -(defun slime-trace-dialog--open-detail (trace-tuple &optional no-pop) - (slime-with-popup-buffer ("*trace-detail*" :select (not no-pop) - :mode 'slime-trace-dialog--detail-mode) - (cl-destructuring-bind (id _parent-id _spec args retlist backtrace external) - trace-tuple - (let ((headline (slime-trace-dialog--format-trace-entry id external))) - (setq headline (format "%s\n%s\n" - headline - (make-string (length headline) ?-))) - (insert headline)) - (cl-loop for (type objects label) - in `((:arg ,args "Called with args:") - (:retval ,retlist "Returned values:")) - do (insert (format "\n%s\n" label)) - (insert (cl-loop for object in objects - for i from 0 - concat (format " %s: %s\n" i - (slime-trace-dialog--format-part - (cl-first object) - (cl-second object) - id - type))))) - (when backtrace - (insert "\nBacktrace:\n" - (cl-loop for (i spec) in backtrace - concat (format " %s: %s\n" i spec))))))) - - -;;;; Rendering traces -;;; -(defun slime-trace-dialog--draw-tree-lines (start offset direction) - (save-excursion - (let ((inhibit-point-motion-hooks t)) - (goto-char start) - (cl-loop with replace-set = (if (eq direction 'down) - '(? ) - '(? ?`)) - for line-beginning = (line-beginning-position - (if (eq direction 'down) - 2 0)) - for pos = (+ line-beginning offset) - while (and (< (point-min) line-beginning) - (< line-beginning (point-max)) - (memq (char-after pos) replace-set)) - do - (slime-trace-dialog--go-replace-char-at pos "|") - (goto-char pos))))) - -(defun slime-trace-dialog--make-indent (depth suffix) - (concat (make-string (* 3 (max 0 (1- depth))) ? ) - (if (cl-plusp depth) suffix))) - -(defun slime-trace-dialog--make-collapse-button (trace) - (slime-trace-dialog--button (if (slime-trace-dialog--trace-collapsed-p trace) - (cdr slime-trace-dialog--collapse-chars) - (car slime-trace-dialog--collapse-chars)) - #'(lambda (button) - (slime-trace-dialog--set-collapsed - (not (slime-trace-dialog--trace-collapsed-p - trace)) - trace - button)))) - - -(defun slime-trace-dialog--insert-trace (trace) - (let* ((id (slime-trace-dialog--trace-id trace)) - (parent (slime-trace-dialog--trace-parent trace)) - (has-children-p (slime-trace-dialog--trace-children-end trace)) - (indent-spec (slime-trace-dialog--make-indent - (slime-trace-dialog--trace-depth trace) - "`--")) - (indent-summary (slime-trace-dialog--make-indent - (slime-trace-dialog--trace-depth trace) - " ")) - (autofollow-fn (slime-trace-dialog--make-autofollow-fn id)) - (id-string (slime-trace-dialog--button - (format "%4s" id) - #'(lambda (_button) - (slime-eval-async - `(swank-trace-dialog:report-trace-detail - ,id) - #'slime-trace-dialog--open-detail)))) - (spec (slime-trace-dialog--trace-spec trace)) - (summary (cl-loop for (type objects marker) in - `((:arg ,(slime-trace-dialog--trace-args trace) - " > ") - (:retval ,(slime-trace-dialog--trace-retlist trace) - " < ")) - concat (cl-loop for object in objects - concat " " - concat indent-summary - concat marker - concat (slime-trace-dialog--format-part - (cl-first object) - (cl-second object) - id - type) - concat "\n")))) - (puthash id trace slime-trace-dialog--traces) - ;; insert and propertize the text - ;; - (setf (slime-trace-dialog--trace-beg trace) (point-marker)) - (insert id-string " ") - (insert indent-spec) - (if has-children-p - (insert (slime-trace-dialog--make-collapse-button trace)) - (setf (slime-trace-dialog--trace-collapse-button-marker trace) - (point-marker)) - (insert "-")) - (insert (format " %s\n" spec)) - (setf (slime-trace-dialog--trace-summary-beg trace) (point-marker)) - (insert summary) - (setf (slime-trace-dialog--trace-end trace) (point-marker)) - (set-marker-insertion-type (slime-trace-dialog--trace-beg trace) t) - - (add-text-properties (slime-trace-dialog--trace-beg trace) - (slime-trace-dialog--trace-end trace) - (list 'slime-trace-dialog--id id - 'point-entered autofollow-fn - 'point-left autofollow-fn)) - ;; respect brief mode and collapsed state - ;; - (cl-loop for condition in (list slime-trace-dialog-hide-details-mode - (slime-trace-dialog--trace-collapsed-p trace)) - when condition - do (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-summary-beg - trace) - (slime-trace-dialog--trace-end trace) - 1)) - (cl-loop for tr = trace then parent - for parent = (slime-trace-dialog--trace-parent tr) - while parent - when (slime-trace-dialog--trace-collapsed-p parent) - do (slime-trace-dialog--hide-unhide - (slime-trace-dialog--trace-beg trace) - (slime-trace-dialog--trace-end trace) - (+ 1 - (or (get-text-property (slime-trace-dialog--trace-beg parent) - 'slime-trace-dialog--hidden-level) - 0))) - (cl-return)) - ;; maybe add the collapse-button to the parent in case it didn't - ;; have one already - ;; - (when (and parent - (slime-trace-dialog--trace-collapse-button-marker parent)) - (slime-trace-dialog--maintaining-properties - (slime-trace-dialog--trace-collapse-button-marker parent) - (delete-char 1) - (insert (slime-trace-dialog--make-collapse-button parent)) - (setf (slime-trace-dialog--trace-collapse-button-marker parent) - nil))) - ;; draw the tree lines - ;; - (when parent - (slime-trace-dialog--draw-tree-lines (slime-trace-dialog--trace-beg trace) - (+ 2 (length indent-spec)) - 'up)) - (when has-children-p - (slime-trace-dialog--draw-tree-lines (slime-trace-dialog--trace-beg trace) - (+ 5 (length indent-spec)) - 'down)) - ;; set the "children-end" slot - ;; - (unless (slime-trace-dialog--trace-children-end trace) - (cl-loop for parent = trace - then (slime-trace-dialog--trace-parent parent) - while parent - do - (setf (slime-trace-dialog--trace-children-end parent) - (slime-trace-dialog--trace-end trace)))))) - -(defun slime-trace-dialog--render-trace (trace) - ;; Render the trace entry in the appropriate place. - ;; - ;; A trace becomes a few lines of slightly propertized text in the - ;; buffer, inserted by `slime-trace-dialog--insert-trace', bound by - ;; point markers that we use here. - ;; - ;; The new trace might be replacing an existing one, or otherwise - ;; must be placed under its existing parent which might or might not - ;; be the last entry inserted. - ;; - (let ((existing (slime-trace-dialog--find-trace - (slime-trace-dialog--trace-id trace))) - (parent (slime-trace-dialog--trace-parent trace))) - (cond (existing - ;; Other traces might already reference `existing' and with - ;; need to maintain that eqness. Best way to do that is - ;; destructively modify `existing' with the new retlist... - ;; - (setf (slime-trace-dialog--trace-retlist existing) - (slime-trace-dialog--trace-retlist trace)) - ;; Now, before deleting and re-inserting `existing' at an - ;; arbitrary point in the tree, note that it's - ;; "children-end" marker is already non-nil, and informs us - ;; about its parenthood status. We want to 1. leave it - ;; alone if it's already a parent, or 2. set it to nil if - ;; it's a leaf, thus forcing the needed update of the - ;; parents' "children-end" marker. - ;; - (when (= (slime-trace-dialog--trace-children-end existing) - (slime-trace-dialog--trace-end existing)) - (setf (slime-trace-dialog--trace-children-end existing) nil)) - (delete-region (slime-trace-dialog--trace-beg existing) - (slime-trace-dialog--trace-end existing)) - (goto-char (slime-trace-dialog--trace-end existing)) - ;; Remember to set `trace' to be `existing' - ;; - (setq trace existing)) - (parent - (goto-char (1+ (slime-trace-dialog--trace-children-end parent)))) - (;; top level trace - t - (goto-char (point-max)))) - (goto-char (line-beginning-position)) - (slime-trace-dialog--insert-trace trace))) - -(defun slime-trace-dialog--update-tree (tuples) - (save-excursion - (slime-trace-dialog--refresh - (:overlay slime-trace-dialog--tree-overlay - :dont-erase t) - (cl-loop for tuple in tuples - for parent = (slime-trace-dialog--find-trace (cl-second tuple)) - for trace = (slime-trace-dialog--make-trace - :id (cl-first tuple) - :parent parent - :spec (cl-third tuple) - :args (cl-fourth tuple) - :retlist (cl-fifth tuple) - :depth (if parent - (1+ (slime-trace-dialog--trace-depth - parent)) - 0)) - do (slime-trace-dialog--render-trace trace))))) - -(defun slime-trace-dialog--clear-local-tree () - (set (make-local-variable 'slime-trace-dialog--fetch-key) - (cl-gensym "slime-trace-dialog-fetch-key-")) - (set (make-local-variable 'slime-trace-dialog--traces) - (make-hash-table)) - (slime-trace-dialog--refresh - (:overlay slime-trace-dialog--tree-overlay)) - (slime-trace-dialog--update-progress nil)) - -(defun slime-trace-dialog--on-new-results (results &optional recurse) - (cl-destructuring-bind (tuples remaining reply-key) - results - (cond ((and slime-trace-dialog--fetch-key - (string= (symbol-name slime-trace-dialog--fetch-key) - (symbol-name reply-key))) - (slime-trace-dialog--update-tree tuples) - (slime-trace-dialog--update-progress - remaining - (and recurse - (cl-plusp remaining)) - t) - (when (and recurse - (not (prog1 slime-trace-dialog--stop-fetching - (setq slime-trace-dialog--stop-fetching nil))) - (cl-plusp remaining)) - (slime-eval-async `(swank-trace-dialog:report-partial-tree - ',reply-key) - #'(lambda (results) (slime-trace-dialog--on-new-results - results - recurse)))))))) - - -;;;; Interactive functions -;;; -(defun slime-trace-dialog-fetch-specs () - "Refresh just list of traced specs." - (interactive) - (slime-eval-async `(swank-trace-dialog:report-specs) - #'slime-trace-dialog--open-specs)) - -(defun slime-trace-dialog-fetch-progress () - (interactive) - (slime-eval-async - '(swank-trace-dialog:report-total) - #'(lambda (total) - (slime-trace-dialog--update-progress - total)))) - -(defun slime-trace-dialog-fetch-status () - "Refresh just the status part of the SLIME Trace Dialog" - (interactive) - (slime-trace-dialog-fetch-specs) - (slime-trace-dialog-fetch-progress)) - -(defun slime-trace-dialog-clear-fetched-traces (&optional interactive) - "Clear local and remote traces collected so far" - (interactive "p") - (when (or (not interactive) - (y-or-n-p "Clear all collected and fetched traces?")) - (slime-eval-async - '(swank-trace-dialog:clear-trace-tree) - #'(lambda (_ignored) - (slime-trace-dialog--clear-local-tree))))) - -(defun slime-trace-dialog-fetch-traces (&optional recurse) - (interactive "P") - (setq slime-trace-dialog--stop-fetching nil) - (slime-eval-async `(swank-trace-dialog:report-partial-tree - ',slime-trace-dialog--fetch-key) - #'(lambda (results) (slime-trace-dialog--on-new-results results - recurse)))) - -(defun slime-trace-dialog-next-button (&optional goback) - (interactive) - (let ((finder (if goback - #'previous-single-property-change - #'next-single-property-change))) - (cl-loop for pos = (funcall finder (point) 'action) - while pos - do (goto-char pos) - until (get-text-property pos 'action)))) - -(defun slime-trace-dialog-prev-button () - (interactive) - (slime-trace-dialog-next-button 'goback)) - -(defvar slime-trace-dialog-after-toggle-hook nil - "Hooks run after toggling a dialog-trace") - -(defun slime-trace-dialog-toggle-trace (&optional using-context-p) - "Toggle the dialog-trace of the spec at point. - -When USING-CONTEXT-P, attempt to decipher lambdas. methods and -other complicated function specs." - (interactive "P") - ;; Notice the use of "spec strings" here as opposed to the - ;; proper cons specs we use on the swank side. - ;; - ;; Notice the conditional use of `slime-trace-query' found in - ;; swank-fancy-trace.el - ;; - (let* ((spec-string (if using-context-p - (slime-extract-context) - (slime-symbol-at-point))) - (spec-string (if (fboundp 'slime-trace-query) - (slime-trace-query spec-string) - spec-string))) - (message "%s" (slime-eval `(swank-trace-dialog:dialog-toggle-trace - (swank::from-string ,spec-string)))) - (run-hooks 'slime-trace-dialog-after-toggle-hook))) - -(defun slime-trace-dialog--update-existing-dialog () - (let ((existing (slime-trace-dialog--live-dialog))) - (when existing - (with-current-buffer existing - (slime-trace-dialog-fetch-status))))) - -(add-hook 'slime-trace-dialog-after-toggle-hook - 'slime-trace-dialog--update-existing-dialog) - -(defun slime-trace-dialog-toggle-complex-trace () - "Toggle the dialog-trace of the complex spec at point. - -See `slime-trace-dialog-toggle-trace'." - (interactive) - (slime-trace-dialog-toggle-trace t)) - -(defun slime-trace-dialog (&optional clear-and-fetch) - "Show trace dialog and refresh trace collection status. - -With optional CLEAR-AND-FETCH prefix arg, clear the current tree -and fetch a first batch of traces." - (interactive "P") - (with-current-buffer - (pop-to-buffer (slime-trace-dialog--ensure-buffer)) - (slime-trace-dialog-fetch-status) - (when (or clear-and-fetch - (null slime-trace-dialog--fetch-key)) - (slime-trace-dialog--clear-local-tree)) - (when clear-and-fetch - (slime-trace-dialog-fetch-traces nil)))) - -(defun slime-trace-dialog-copy-down-to-repl (id part-id type) - "Eval the Trace Dialog entry under point in the REPL (to set *)" - (interactive (cl-loop for prop in '(slime-trace-dialog--id - slime-trace-dialog--part-id - slime-trace-dialog--type) - collect (get-text-property (point) prop))) - (unless (and id part-id type) (error "No trace part at point %s" (point))) - (slime-repl-send-string - (format "%s" `(nth-value 0 - (swank-trace-dialog::find-trace-part - ,id ,part-id ,type)))) - (slime-repl)) - -(provide 'slime-trace-dialog) diff --git a/elpa/slime-20200414.1444/contrib/slime-trace-dialog.elc b/elpa/slime-20200414.1444/contrib/slime-trace-dialog.elc deleted file mode 100644 index ec449ef03a9c791a57a7b77800305d821fb635bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52508 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 diff --git a/elpa/slime-20200414.1444/contrib/slime-tramp.el b/elpa/slime-20200414.1444/contrib/slime-tramp.el deleted file mode 100644 index 1e3f14cb..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-tramp.el +++ /dev/null @@ -1,121 +0,0 @@ -(require 'slime) -(require 'tramp) -(eval-when-compile (require 'cl)) ; lexical-let - -(define-slime-contrib slime-tramp - "Filename translations for tramp" - (:authors "Marco Baringer ") - (:license "GPL") - (:on-load - (setq slime-to-lisp-filename-function #'slime-tramp-to-lisp-filename) - (setq slime-from-lisp-filename-function #'slime-tramp-from-lisp-filename))) - -(defcustom slime-filename-translations nil - "Assoc list of hostnames and filename translation functions. -Each element is of the form (HOSTNAME-REGEXP TO-LISP FROM-LISP). - -HOSTNAME-REGEXP is a regexp which is applied to the connection's -slime-machine-instance. If HOSTNAME-REGEXP maches then the -corresponding TO-LISP and FROM-LISP functions will be used to -translate emacs filenames and lisp filenames. - -TO-LISP will be passed the filename of an emacs buffer and must -return a string which the underlying lisp understandas as a -pathname. FROM-LISP will be passed a pathname as returned by the -underlying lisp and must return something that emacs will -understand as a filename (this string will be passed to -find-file). - -This list will be traversed in order, so multiple matching -regexps are possible. - -Example: - -Assuming you run emacs locally and connect to slime running on -the machine 'soren' and you can connect with the username -'animaliter': - - (push (list \"^soren$\" - (lambda (emacs-filename) - (subseq emacs-filename (length \"/ssh:animaliter@soren:\"))) - (lambda (lisp-filename) - (concat \"/ssh:animaliter@soren:\" lisp-filename))) - slime-filename-translations) - -See also `slime-create-filename-translator'." - :type '(repeat (list :tag "Host description" - (regexp :tag "Hostname regexp") - (function :tag "To lisp function") - (function :tag "From lisp function"))) - :group 'slime-lisp) - -(defun slime-find-filename-translators (hostname) - (cond ((cdr (cl-assoc-if (lambda (regexp) (string-match regexp hostname)) - slime-filename-translations))) - (t (list #'identity #'identity)))) - -(defun slime-make-tramp-file-name (username remote-host lisp-filename) - "Tramp compatability function. - -Handles the signature of `tramp-make-tramp-file-name' changing -over time." - (cond - ((>= emacs-major-version 26) - ;; Emacs 26 requires the method to be provided and the signature of - ;; `tramp-make-tramp-file-name' has changed. - (tramp-make-tramp-file-name (tramp-find-method nil username remote-host) - username - nil - remote-host - nil - lisp-filename)) - ((boundp 'tramp-multi-methods) - (tramp-make-tramp-file-name nil nil - username - remote-host - lisp-filename)) - (t - (tramp-make-tramp-file-name nil - username - remote-host - lisp-filename)))) - -(cl-defun slime-create-filename-translator (&key machine-instance - remote-host - username) - "Creates a three element list suitable for push'ing onto -slime-filename-translations which uses Tramp to load files on -hostname using username. MACHINE-INSTANCE is a required -parameter, REMOTE-HOST defaults to MACHINE-INSTANCE and USERNAME -defaults to (user-login-name). - -MACHINE-INSTANCE is the value returned by slime-machine-instance, -which is just the value returned by cl:machine-instance on the -remote lisp. REMOTE-HOST is the fully qualified domain name (or -just the IP) of the remote machine. USERNAME is the username we -should login with. -The functions created here expect your tramp-default-method or - tramp-default-method-alist to be setup correctly." - (lexical-let ((remote-host (or remote-host machine-instance)) - (username (or username (user-login-name)))) - (list (concat "^" machine-instance "$") - (lambda (emacs-filename) - (tramp-file-name-localname - (tramp-dissect-file-name emacs-filename))) - `(lambda (lisp-filename) - (slime-make-tramp-file-name - ,username - ,remote-host - lisp-filename))))) - -(defun slime-tramp-to-lisp-filename (filename) - (funcall (if (slime-connected-p) - (first (slime-find-filename-translators (slime-machine-instance))) - 'identity) - (expand-file-name filename))) - -(defun slime-tramp-from-lisp-filename (filename) - (funcall (second (slime-find-filename-translators (slime-machine-instance))) - filename)) - -(provide 'slime-tramp) diff --git a/elpa/slime-20200414.1444/contrib/slime-tramp.elc b/elpa/slime-20200414.1444/contrib/slime-tramp.elc deleted file mode 100644 index 0140decf280926bc9375f68be4a284f39956d146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5201 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 Vt@x3NVNNsk9$neWk4)Xxe*t3arsDtr diff --git a/elpa/slime-20200414.1444/contrib/slime-typeout-frame.el b/elpa/slime-20200414.1444/contrib/slime-typeout-frame.el deleted file mode 100644 index 7979b195..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-typeout-frame.el +++ /dev/null @@ -1,92 +0,0 @@ -(require 'slime) -(require 'slime-autodoc) -(require 'cl-lib) - -(defvar slime-typeout-frame-unbind-stack ()) - -(define-slime-contrib slime-typeout-frame - "Display messages in a dedicated frame." - (:authors "Luke Gorrie ") - (:license "GPL") - (:on-load - (unless (slime-typeout-tty-only-p) - (add-hook 'slime-connected-hook 'slime-ensure-typeout-frame) - (add-hook 'slime-autodoc-mode-hook 'slime-typeout-wrap-autodoc) - (cl-loop for (var value) in - '((slime-message-function slime-typeout-message) - (slime-background-message-function slime-typeout-message)) - do (slime-typeout-frame-init-var var value)))) - (:on-unload - (remove-hook 'slime-connected-hook 'slime-ensure-typeout-frame) - (remove-hook 'slime-autodoc-mode-hook 'slime-typeout-wrap-autodoc) - (cl-loop for (var value) in slime-typeout-frame-unbind-stack - do (cond ((eq var 'slime-unbound) (makunbound var)) - (t (set var value)))) - (setq slime-typeout-frame-unbind-stack nil))) - -(defun slime-typeout-frame-init-var (var value) - (push (list var (if (boundp var) (symbol-value var) 'slime-unbound)) - slime-typeout-frame-unbind-stack) - (set var value)) - -(defun slime-typeout-tty-only-p () - (cond ((featurep 'xemacs) - (null (remove 'tty (mapcar #'device-type (console-device-list))))) - (t (not (window-system))))) - - -;;;; Typeout frame - -;; When a "typeout frame" exists it is used to display certain -;; messages instead of the echo area or pop-up windows. - -(defvar slime-typeout-window nil - "The current typeout window.") - -(defvar slime-typeout-frame-properties - '((height . 10) (minibuffer . nil)) - "The typeout frame properties (passed to `make-frame').") - -(defun slime-typeout-buffer () - (with-current-buffer (get-buffer-create (slime-buffer-name :typeout)) - (setq buffer-read-only t) - (current-buffer))) - -(defun slime-typeout-active-p () - (and slime-typeout-window - (window-live-p slime-typeout-window))) - -(defun slime-typeout-message-aux (format-string &rest format-args) - (slime-ensure-typeout-frame) - (with-current-buffer (slime-typeout-buffer) - (let ((inhibit-read-only t) - (msg (apply #'format format-string format-args))) - (unless (string= msg "") - (erase-buffer) - (insert msg))))) - -(defun slime-typeout-message (format-string &rest format-args) - (apply #'slime-typeout-message-aux format-string format-args)) - -(defun slime-make-typeout-frame () - "Create a frame for displaying messages (e.g. arglists)." - (interactive) - (let ((frame (make-frame slime-typeout-frame-properties))) - (save-selected-window - (select-window (frame-selected-window frame)) - (switch-to-buffer (slime-typeout-buffer)) - (setq slime-typeout-window (selected-window))))) - -(defun slime-ensure-typeout-frame () - "Create the typeout frame unless it already exists." - (interactive) - (if (slime-typeout-active-p) - (save-selected-window - (select-window slime-typeout-window) - (switch-to-buffer (slime-typeout-buffer))) - (slime-make-typeout-frame))) - -(defun slime-typeout-wrap-autodoc () - (setq eldoc-message-function 'slime-typeout-message-aux)) - -(provide 'slime-typeout-frame) diff --git a/elpa/slime-20200414.1444/contrib/slime-typeout-frame.elc b/elpa/slime-20200414.1444/contrib/slime-typeout-frame.elc deleted file mode 100644 index 1f943b5348969bd479e45f5459e91590868a1826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4028 zcmd52D#U5H4iwsM$ouygVWLZ&k$cF*zw>m&+iMEC4tt6Gy z`}MmcDa%UTBtS7>1|&;-IUetM?m6n{_1WnUjYgw=baVu#S&~OF5A{ow!s~)?8Th*ADpE^eaSU0mq9pohBnenL6D`2;ow5eonNpebx!_1eft)IB@--A=;FR!o~0qk z3<8$Ij6tyv-LMUxo)AcrWA93}SdutH@RcnD%Aj%MfJ_1nFW&o7xU!yL8Bc~&TA zE?B~yBArEP=t#wa3rM5bjAn7fBs|x4uT6;3NI~~K4%MEH(77>QlWE7gODzYRE$$Fr zp~K^o#?*IRyga=8a=dQAIqrDfGI^+{d#?NFF+DwLzQFnZt48w}*Kl{~c7pejcmLk; z1Dtx$nx>D#WR9*LF_l4tNR4@{b0~C)-78e}4UcDz_c>wbw4T$Zu zO%sJ$tk*G7YUN~UymE5lwzJH#3p*akn{p&+t&yj)5PUsbLtw{S+?)hCuxY1+>q@YE z4Q{VzoJzQqY{4CJmlE=H9vZwGI*@`PS!WlfZAoUbLx-I*kKl3muo{7*?y zaTWa~kRf3g)nmnK3)>dS!Gyu&9Qt@s8q@QbqK*F;B}!|9)3avRhAS^rMR*kZncT)0 z5Io2Psx%1|%3Mk#HAcbWlZf*z(rY;SqxJj!<}^iCX~NK? zTS;T2Mx&D3(H5C=@NdeY4S}gd*9aMN{2l?-1TCIRu3eJXK(W z3uf%#$1l_a)2%`2b$@~ZctiKFPxi(WZLhRrR4W%*&V`DwR`+ryCDwJ7!3U%q$`O^8 z=lw4(WnkX0@VwVs@@TPCxU4%w027p$Suvk;(Z@II&LO!&#cV5_W_YPH0+AxxYC7-j zeIyAW@OJXP#m$U&1ZSa^a9D8V*v0@`RasGO8=h%6yeNa9Zov)DClTg;Ui#C-Rma~D ze_Tx}0*8-I&vtY>5SzKI;Ah_m7o(RZGSgek1$bmoF*g5!zHwlT4gNNS1zP$(!o zV<@At&h2Kai;_!v>P|g>sLS?K(o|2+nx?_eHhT57HdcW|F7Sl6jAmFPs^FTv-cbKa z39vBYSuxM!mGvJw9pHjVZUH)n@g3rF=a^`c;NEZDoAIfR+Xe_mSTSJ^;M6dPfyovO z5QLG;W40n}>>NxTK3EI@(TO9eWSKEFe(Q`XqhqX9N-%2fVX;Ig9}}Vzgm#T(YtK|c zd**`j%_k_`-F>^+`er`MOtYY5$Ysf6bD*&lr9M0 z4+;H|MSt9~P@9?!dpc*Sbkh_qJU0Zk&IcQ|dgEH#DiHn$(B2V5eFFJBr;sZaO@HK# tOEkY&Y-*?R3KUdL^YuYd<}rSU-SMD}C;LxU?6E9fM))1L?dz-G{ufg36^#G@ diff --git a/elpa/slime-20200414.1444/contrib/slime-xref-browser.el b/elpa/slime-20200414.1444/contrib/slime-xref-browser.el deleted file mode 100644 index 45a7ad83..00000000 --- a/elpa/slime-20200414.1444/contrib/slime-xref-browser.el +++ /dev/null @@ -1,99 +0,0 @@ -(eval-and-compile - (require 'slime)) - -(define-slime-contrib slime-xref-browser - "Xref browsing with tree-widget" - (:authors "Rui Patrocínio ") - (:license "GPL")) - - -;;;; classes browser - -(defun slime-expand-class-node (widget) - (or (widget-get widget :args) - (let ((name (widget-get widget :tag))) - (cl-loop for kid in (slime-eval `(swank:mop :subclasses ,name)) - collect `(tree-widget :tag ,kid - :expander slime-expand-class-node - :has-children t))))) - -(defun slime-browse-classes (name) - "Read the name of a class and show its subclasses." - (interactive (list (slime-read-symbol-name "Class Name: "))) - (slime-call-with-browser-setup - (slime-buffer-name :browser) (slime-current-package) "Class Browser" - (lambda () - (widget-create 'tree-widget :tag name - :expander 'slime-expand-class-node - :has-echildren t)))) - -(defvar slime-browser-map nil - "Keymap for tree widget browsers") - -(require 'tree-widget) -(unless slime-browser-map - (setq slime-browser-map (make-sparse-keymap)) - (set-keymap-parent slime-browser-map widget-keymap) - (define-key slime-browser-map "q" 'bury-buffer)) - -(defun slime-call-with-browser-setup (buffer package title fn) - (switch-to-buffer buffer) - (kill-all-local-variables) - (setq slime-buffer-package package) - (let ((inhibit-read-only t)) (erase-buffer)) - (widget-insert title "\n\n") - (save-excursion - (funcall fn)) - (lisp-mode-variables t) - (slime-mode t) - (use-local-map slime-browser-map) - (widget-setup)) - - -;;;; Xref browser - -(defun slime-fetch-browsable-xrefs (type name) - "Return a list ((LABEL DSPEC)). -LABEL is just a string for display purposes. -DSPEC can be used to expand the node." - (let ((xrefs '())) - (cl-loop for (_file . specs) in (slime-eval `(swank:xref ,type ,name)) do - (cl-loop for (dspec . _location) in specs do - (let ((exp (ignore-errors (read (downcase dspec))))) - (cond ((and (consp exp) (eq 'flet (car exp))) - ;; we can't expand FLET references so they're useless - ) - ((and (consp exp) (eq 'method (car exp))) - ;; this isn't quite right, but good enough for now - (push (list dspec (string (cl-second exp))) xrefs)) - (t - (push (list dspec dspec) xrefs)))))) - xrefs)) - -(defun slime-expand-xrefs (widget) - (or (widget-get widget :args) - (let* ((type (widget-get widget :xref-type)) - (dspec (widget-get widget :xref-dspec)) - (xrefs (slime-fetch-browsable-xrefs type dspec))) - (cl-loop for (label dspec) in xrefs - collect `(tree-widget :tag ,label - :xref-type ,type - :xref-dspec ,dspec - :expander slime-expand-xrefs - :has-children t))))) - -(defun slime-browse-xrefs (name type) - "Show the xref graph of a function in a tree widget." - (interactive - (list (slime-read-from-minibuffer "Name: " - (slime-symbol-at-point)) - (read (completing-read "Type: " (slime-bogus-completion-alist - '(":callers" ":callees" ":calls")) - nil t ":")))) - (slime-call-with-browser-setup - (slime-buffer-name :xref) (slime-current-package) "Xref Browser" - (lambda () - (widget-create 'tree-widget :tag name :xref-type type :xref-dspec name - :expander 'slime-expand-xrefs :has-echildren t)))) - -(provide 'slime-xref-browser) diff --git a/elpa/slime-20200414.1444/contrib/slime-xref-browser.elc b/elpa/slime-20200414.1444/contrib/slime-xref-browser.elc deleted file mode 100644 index 7337a5d4c61dac2249e705ab67aa8187629bc6de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3989 zcmcInYj5Mm71g)cGNSe7u}zy~b4_h_NhB0RQj!yGlG^gRMUX|X$)-htrGbv5p~ada z89wYd|Ea&Ce=O(D3}wld(R_&jku$@2+~>Jxo}a!v`BSUaYCnJeoKCW39w&0HI&n&; zOED|yQWj;LrR0x#f%72@pW+F|qil&m1Ow8q+;Y*EOFHa?Q=xnw6YJ%%c_Xeb2pJ? znQzV`%MYw(nk))PW&Qip@)=!;5*lm!QG{V_JU?K;69H{4>OOHCWhEH%09a9*sX_{ZKv0jbZ6OI-jY_!I8bs1 z{UKy$Ek^hsh5_s0c~5t`p|AGN>&nQ?K~}`m(sb7?Lxr4W1wxChh$Gd+HFekLYAfoQ z8{6NI8Z1%tZrg27J6?NRp)c`z@9i_6mj7yRA^6DGQA=~=AX#^}DWuj2W+tQ=*R;f_)sF6@tj7TRjyFtq;M7z1yA_w?W|cn55( z4?haiF{TIoR+t{Wi($6q;T{^p$z&2nllQ{(m}kC&S^fvDFbe(P@N;8PeK@6J30b_a zyJHv9xtF4FUAl6-KGu{MP)nzeT>dq0`cWbVtA*5JXAucf2a!UQMRrAT zg~(VP-}~flF6lJVu7H5>1KU7*VUgKaRz&n-F-qmgt8YPvXi*1$ZjA*%-!;OIn5HSqfz2}*lrh0fXHRj4^n` z=`x^wJcm2GD-;~D?G%&%L=-Oi8*Vg`xO}3qt)-8A7* zb}Rw5<5Ybo>t~Cmb#d+LcsQfM7F1w3-WExSNxh7kP^sby1vW}`n2vUo_N*VVZoBUw z>H8nz;i*T>?MX)@g}&kZLT~+pc+aBRg-xOqZwbk>`zoD^*>jKocG6_RHhR=}UU?`qk-) zqD|Ix>Lsve*nwDyj8=skWM<2mr(52MGO zX6oYykM}zrGrJ$OIvq9r(Y~6`uYv#Q0V2cmULdO4Hc%;0NI$!qk~aAAfAJRG3Mn+`h`ZV@-^W~Rj)Ty5I-O%~KkD$8 zr>)QSRQFx(by}b8IA}1R;fjrbY3y>RfR(ufkG);OZivrX!Q!pRR>aN$fk1tU64bb* ztQHxlgyMzN4K|D6oDZPxU~?2czQImE@P`bBcetFP0$PPzEWluvVgdhTSmOcMnpuEu zd!fY)z=!KqYBLQmgy7>9HDLFKk#fKfDEr#C%E-s?DhEU7!4YEyBf;=(Jo>wMc-S-W zMj#LT>+DYu2$6CCBB<|oTOBwoIP5X%vKI`bD>rD17^QB}i9}3g(qQZwf#BJ$T0K@x zy@yWc?a9C%Tt{V9tTA15x;!afD^6eRYso6$AubEIV+u)t(yb$?<6z5pF9j&8l#-)_)A;P_k+p&TjLKf3Y5uyL3YpR7BW-OXd)vpknQYha)Qd zr+dchEBPCb-pf8%l)L`Dhm`PSkV@u$8+^p`*9b`v9D3UbNmOJ@cL`c -;; Tobias C. Rittweiler -;; and others -;; -;; License: Public Domain -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-c-p-c)) - -;;;; Utilities - -(defun compose (&rest functions) - "Compose FUNCTIONS right-associatively, returning a function" - #'(lambda (x) - (reduce #'funcall functions :initial-value x :from-end t))) - -(defun length= (seq n) - "Test for whether SEQ contains N number of elements. I.e. it's equivalent - to (= (LENGTH SEQ) N), but besides being more concise, it may also be more - efficiently implemented." - (etypecase seq - (list (do ((i n (1- i)) - (list seq (cdr list))) - ((or (<= i 0) (null list)) - (and (zerop i) (null list))))) - (sequence (= (length seq) n)))) - -(declaim (inline memq)) -(defun memq (item list) - (member item list :test #'eq)) - -(defun exactly-one-p (&rest values) - "If exactly one value in VALUES is non-NIL, this value is returned. -Otherwise NIL is returned." - (let ((found nil)) - (dolist (v values) - (when v (if found - (return-from exactly-one-p nil) - (setq found v)))) - found)) - -(defun valid-operator-symbol-p (symbol) - "Is SYMBOL the name of a function, a macro, or a special-operator?" - (or (fboundp symbol) - (macro-function symbol) - (special-operator-p symbol) - (member symbol '(declare declaim)))) - -(defun function-exists-p (form) - (and (valid-function-name-p form) - (fboundp form) - t)) - -(defmacro multiple-value-or (&rest forms) - (if (null forms) - nil - (let ((first (first forms)) - (rest (rest forms))) - `(let* ((values (multiple-value-list ,first)) - (primary-value (first values))) - (if primary-value - (values-list values) - (multiple-value-or ,@rest)))))) - -(defun arglist-available-p (arglist) - (not (eql arglist :not-available))) - -(defmacro with-available-arglist ((var &rest more-vars) form &body body) - `(multiple-value-bind (,var ,@more-vars) ,form - (if (eql ,var :not-available) - :not-available - (progn ,@body)))) - - -;;;; Arglist Definition - -(defstruct (arglist (:conc-name arglist.) (:predicate arglist-p)) - provided-args ; list of the provided actual arguments - required-args ; list of the required arguments - optional-args ; list of the optional arguments - key-p ; whether &key appeared - keyword-args ; list of the keywords - rest ; name of the &rest or &body argument (if any) - body-p ; whether the rest argument is a &body - allow-other-keys-p ; whether &allow-other-keys appeared - aux-args ; list of &aux variables - any-p ; whether &any appeared - any-args ; list of &any arguments [*] - known-junk ; &whole, &environment - unknown-junk) ; unparsed stuff - -;;; -;;; [*] The &ANY lambda keyword is an extension to ANSI Common Lisp, -;;; and is only used to describe certain arglists that cannot be -;;; described in another way. -;;; -;;; &ANY is very similiar to &KEY but while &KEY is based upon -;;; the idea of a plist (key1 value1 key2 value2), &ANY is a -;;; cross between &OPTIONAL, &KEY and *FEATURES* lists: -;;; -;;; a) (&ANY :A :B :C) means that you can provide any (non-null) -;;; set consisting of the keywords `:A', `:B', or `:C' in -;;; the arglist. E.g. (:A) or (:C :B :A). -;;; -;;; (This is not restricted to keywords only, but any self-evaluating -;;; expression is allowed.) -;;; -;;; b) (&ANY (key1 v1) (key2 v2) (key3 v3)) means that you can -;;; provide any (non-null) set consisting of lists where -;;; the CAR of the list is one of `key1', `key2', or `key3'. -;;; E.g. ((key1 100) (key3 42)), or ((key3 66) (key2 23)) -;;; -;;; -;;; For example, a) let us describe the situations of EVAL-WHEN as -;;; -;;; (EVAL-WHEN (&ANY :compile-toplevel :load-toplevel :execute) &BODY body) -;;; -;;; and b) let us describe the optimization qualifiers that are valid -;;; in the declaration specifier `OPTIMIZE': -;;; -;;; (DECLARE (OPTIMIZE &ANY (compilation-speed 1) (safety 1) ...)) -;;; - -;; This is a wrapper object around anything that came from Slime and -;; could not reliably be read. -(defstruct (arglist-dummy - (:conc-name #:arglist-dummy.) - (:constructor make-arglist-dummy (string-representation))) - string-representation) - -(defun empty-arg-p (dummy) - (and (arglist-dummy-p dummy) - (zerop (length (arglist-dummy.string-representation dummy))))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter +lambda-list-keywords+ - '(&provided &required &optional &rest &key &any))) - -(defmacro do-decoded-arglist (decoded-arglist &body clauses) - (assert (loop for clause in clauses - thereis (member (car clause) +lambda-list-keywords+))) - (flet ((parse-clauses (clauses) - (let* ((size (length +lambda-list-keywords+)) - (initial (make-hash-table :test #'eq :size size)) - (main (make-hash-table :test #'eq :size size)) - (final (make-hash-table :test #'eq :size size))) - (loop for clause in clauses - for lambda-list-keyword = (first clause) - for clause-parameter = (second clause) - do - (case clause-parameter - (:initially - (setf (gethash lambda-list-keyword initial) clause)) - (:finally - (setf (gethash lambda-list-keyword final) clause)) - (t - (setf (gethash lambda-list-keyword main) clause))) - finally - (return (values initial main final))))) - (generate-main-clause (clause arglist) - (dcase clause - ((&provided (&optional arg) . body) - (let ((gensym (gensym "PROVIDED-ARG+"))) - `(dolist (,gensym (arglist.provided-args ,arglist)) - (declare (ignorable ,gensym)) - (let (,@(when arg `((,arg ,gensym)))) - ,@body)))) - ((&required (&optional arg) . body) - (let ((gensym (gensym "REQUIRED-ARG+"))) - `(dolist (,gensym (arglist.required-args ,arglist)) - (declare (ignorable ,gensym)) - (let (,@(when arg `((,arg ,gensym)))) - ,@body)))) - ((&optional (&optional arg init) . body) - (let ((optarg (gensym "OPTIONAL-ARG+"))) - `(dolist (,optarg (arglist.optional-args ,arglist)) - (declare (ignorable ,optarg)) - (let (,@(when arg - `((,arg (optional-arg.arg-name ,optarg)))) - ,@(when init - `((,init (optional-arg.default-arg ,optarg))))) - ,@body)))) - ((&key (&optional keyword arg init) . body) - (let ((keyarg (gensym "KEY-ARG+"))) - `(dolist (,keyarg (arglist.keyword-args ,arglist)) - (declare (ignorable ,keyarg)) - (let (,@(when keyword - `((,keyword (keyword-arg.keyword ,keyarg)))) - ,@(when arg - `((,arg (keyword-arg.arg-name ,keyarg)))) - ,@(when init - `((,init (keyword-arg.default-arg ,keyarg))))) - ,@body)))) - ((&rest (&optional arg body-p) . body) - `(when (arglist.rest ,arglist) - (let (,@(when arg `((,arg (arglist.rest ,arglist)))) - ,@(when body-p `((,body-p (arglist.body-p ,arglist))))) - ,@body))) - ((&any (&optional arg) . body) - (let ((gensym (gensym "REQUIRED-ARG+"))) - `(dolist (,gensym (arglist.any-args ,arglist)) - (declare (ignorable ,gensym)) - (let (,@(when arg `((,arg ,gensym)))) - ,@body))))))) - (let ((arglist (gensym "DECODED-ARGLIST+"))) - (multiple-value-bind (initially-clauses main-clauses finally-clauses) - (parse-clauses clauses) - `(let ((,arglist ,decoded-arglist)) - (block do-decoded-arglist - ,@(loop for keyword in '(&provided &required - &optional &rest &key &any) - append (cddr (gethash keyword initially-clauses)) - collect (let ((clause (gethash keyword main-clauses))) - (when clause - (generate-main-clause clause arglist))) - append (cddr (gethash keyword finally-clauses))))))))) - -;;;; Arglist Printing - -(defun undummy (x) - (if (typep x 'arglist-dummy) - (arglist-dummy.string-representation x) - (prin1-to-string x))) - -(defun print-decoded-arglist (arglist &key operator provided-args highlight) - (let ((first-space-after-operator (and operator t))) - (macrolet ((space () - ;; Kludge: When OPERATOR is not given, we don't want to - ;; print a space for the first argument. - `(if (not operator) - (setq operator t) - (progn (write-char #\space) - (if first-space-after-operator - (setq first-space-after-operator nil) - (pprint-newline :fill))))) - (with-highlighting ((&key index) &body body) - `(if (eql ,index (car highlight)) - (progn (princ "===> ") ,@body (princ " <===")) - (progn ,@body))) - (print-arglist-recursively (argl &key index) - `(if (eql ,index (car highlight)) - (print-decoded-arglist ,argl :highlight (cdr highlight)) - (print-decoded-arglist ,argl)))) - (let ((index 0)) - (pprint-logical-block (nil nil :prefix "(" :suffix ")") - (when operator - (print-arg operator) - (pprint-indent :current 1)) ; 1 due to possibly added space - (do-decoded-arglist (remove-given-args arglist provided-args) - (&provided (arg) - (space) - (print-arg arg :literal-strings t) - (incf index)) - (&required (arg) - (space) - (if (arglist-p arg) - (print-arglist-recursively arg :index index) - (with-highlighting (:index index) - (print-arg arg))) - (incf index)) - (&optional :initially - (when (arglist.optional-args arglist) - (space) - (princ '&optional))) - (&optional (arg init-value) - (space) - (if (arglist-p arg) - (print-arglist-recursively arg :index index) - (with-highlighting (:index index) - (if (null init-value) - (print-arg arg) - (format t "~:@<~A ~A~@:>" - (undummy arg) (undummy init-value))))) - (incf index)) - (&key :initially - (when (arglist.key-p arglist) - (space) - (princ '&key))) - (&key (keyword arg init) - (space) - (if (arglist-p arg) - (pprint-logical-block (nil nil :prefix "(" :suffix ")") - (prin1 keyword) (space) - (print-arglist-recursively arg :index keyword)) - (with-highlighting (:index keyword) - (cond ((and init (keywordp keyword)) - (format t "~:@<~A ~A~@:>" keyword (undummy init))) - (init - (format t "~:@<(~A ..) ~A~@:>" - (undummy keyword) (undummy init))) - ((not (keywordp keyword)) - (format t "~:@<(~S ..)~@:>" keyword)) - (t - (princ keyword)))))) - (&key :finally - (when (arglist.allow-other-keys-p arglist) - (space) - (princ '&allow-other-keys))) - (&any :initially - (when (arglist.any-p arglist) - (space) - (princ '&any))) - (&any (arg) - (space) - (print-arg arg)) - (&rest (args bodyp) - (space) - (princ (if bodyp '&body '&rest)) - (space) - (if (arglist-p args) - (print-arglist-recursively args :index index) - (with-highlighting (:index index) - (print-arg args)))) - ;; FIXME: add &UNKNOWN-JUNK? - )))))) - -(defun print-arg (arg &key literal-strings) - (let ((arg (if (arglist-dummy-p arg) - (arglist-dummy.string-representation arg) - arg))) - (if (or - (and literal-strings - (stringp arg)) - (keywordp arg)) - (prin1 arg) - (princ arg)))) - -(defun print-decoded-arglist-as-template (decoded-arglist &key - (prefix "(") (suffix ")")) - (let ((first-p t)) - (flet ((space () - (unless first-p - (write-char #\space)) - (setq first-p nil)) - (print-arg-or-pattern (arg) - (etypecase arg - (symbol (if (keywordp arg) (prin1 arg) (princ arg))) - (string (princ arg)) - (list (princ arg)) - (arglist-dummy (princ - (arglist-dummy.string-representation arg))) - (arglist (print-decoded-arglist-as-template arg))) - (pprint-newline :fill))) - (pprint-logical-block (nil nil :prefix prefix :suffix suffix) - (do-decoded-arglist decoded-arglist - (&provided ()) ; do nothing; provided args are in the buffer already. - (&required (arg) - (space) (print-arg-or-pattern arg)) - (&optional (arg) - (space) (princ "[") (print-arg-or-pattern arg) (princ "]")) - (&key (keyword arg) - (space) - (prin1 (if (keywordp keyword) keyword `',keyword)) - (space) - (print-arg-or-pattern arg) - (pprint-newline :linear)) - (&any (arg) - (space) (print-arg-or-pattern arg)) - (&rest (args) - (when (or (not (arglist.keyword-args decoded-arglist)) - (arglist.allow-other-keys-p decoded-arglist)) - (space) - (format t "~A..." args)))))))) - -(defvar *arglist-pprint-bindings* - '((*print-case* . :downcase) - (*print-pretty* . t) - (*print-circle* . nil) - (*print-readably* . nil) - (*print-level* . 10) - (*print-length* . 20) - (*print-escape* . nil))) - -(defvar *arglist-show-packages* t) - -(defmacro with-arglist-io-syntax (&body body) - (let ((package (gensym))) - `(let ((,package *package*)) - (with-standard-io-syntax - (let ((*package* (if *arglist-show-packages* - *package* - ,package))) - (with-bindings *arglist-pprint-bindings* - ,@body)))))) - -(defun decoded-arglist-to-string (decoded-arglist - &key operator highlight - print-right-margin) - (with-output-to-string (*standard-output*) - (with-arglist-io-syntax - (let ((*print-right-margin* print-right-margin)) - (print-decoded-arglist decoded-arglist - :operator operator - :highlight highlight))))) - -(defun decoded-arglist-to-template-string (decoded-arglist - &key (prefix "(") (suffix ")")) - (with-output-to-string (*standard-output*) - (with-arglist-io-syntax - (print-decoded-arglist-as-template decoded-arglist - :prefix prefix - :suffix suffix)))) - -;;;; Arglist Decoding / Encoding - -(defun decode-required-arg (arg) - "ARG can be a symbol or a destructuring pattern." - (etypecase arg - (symbol arg) - (arglist-dummy arg) - (list (decode-arglist arg)))) - -(defun encode-required-arg (arg) - (etypecase arg - (symbol arg) - (arglist (encode-arglist arg)))) - -(defstruct (keyword-arg - (:conc-name keyword-arg.) - (:constructor %make-keyword-arg)) - keyword - arg-name - default-arg) - -(defun canonicalize-default-arg (form) - (if (equalp ''nil form) - nil - form)) - -(defun make-keyword-arg (keyword arg-name default-arg) - (%make-keyword-arg :keyword keyword - :arg-name arg-name - :default-arg (canonicalize-default-arg default-arg))) - -(defun decode-keyword-arg (arg) - "Decode a keyword item of formal argument list. -Return three values: keyword, argument name, default arg." - (flet ((intern-as-keyword (arg) - (intern (etypecase arg - (symbol (symbol-name arg)) - (arglist-dummy (arglist-dummy.string-representation arg))) - keyword-package))) - (cond ((or (symbolp arg) (arglist-dummy-p arg)) - (make-keyword-arg (intern-as-keyword arg) arg nil)) - ((and (consp arg) - (consp (car arg))) - (make-keyword-arg (caar arg) - (decode-required-arg (cadar arg)) - (cadr arg))) - ((consp arg) - (make-keyword-arg (intern-as-keyword (car arg)) - (car arg) (cadr arg))) - (t - (error "Bad keyword item of formal argument list"))))) - -(defun encode-keyword-arg (arg) - (cond - ((arglist-p (keyword-arg.arg-name arg)) - ;; Destructuring pattern - (let ((keyword/name (list (keyword-arg.keyword arg) - (encode-required-arg - (keyword-arg.arg-name arg))))) - (if (keyword-arg.default-arg arg) - (list keyword/name - (keyword-arg.default-arg arg)) - (list keyword/name)))) - ((eql (intern (symbol-name (keyword-arg.arg-name arg)) - keyword-package) - (keyword-arg.keyword arg)) - (if (keyword-arg.default-arg arg) - (list (keyword-arg.arg-name arg) - (keyword-arg.default-arg arg)) - (keyword-arg.arg-name arg))) - (t - (let ((keyword/name (list (keyword-arg.keyword arg) - (keyword-arg.arg-name arg)))) - (if (keyword-arg.default-arg arg) - (list keyword/name - (keyword-arg.default-arg arg)) - (list keyword/name)))))) - -(progn - (assert (equalp (decode-keyword-arg 'x) - (make-keyword-arg :x 'x nil))) - (assert (equalp (decode-keyword-arg '(x t)) - (make-keyword-arg :x 'x t))) - (assert (equalp (decode-keyword-arg '((:x y))) - (make-keyword-arg :x 'y nil))) - (assert (equalp (decode-keyword-arg '((:x y) t)) - (make-keyword-arg :x 'y t)))) - -;;; FIXME suppliedp? -(defstruct (optional-arg - (:conc-name optional-arg.) - (:constructor %make-optional-arg)) - arg-name - default-arg) - -(defun make-optional-arg (arg-name default-arg) - (%make-optional-arg :arg-name arg-name - :default-arg (canonicalize-default-arg default-arg))) - -(defun decode-optional-arg (arg) - "Decode an optional item of a formal argument list. -Return an OPTIONAL-ARG structure." - (etypecase arg - (symbol (make-optional-arg arg nil)) - (arglist-dummy (make-optional-arg arg nil)) - (list (make-optional-arg (decode-required-arg (car arg)) - (cadr arg))))) - -(defun encode-optional-arg (optional-arg) - (if (or (optional-arg.default-arg optional-arg) - (arglist-p (optional-arg.arg-name optional-arg))) - (list (encode-required-arg - (optional-arg.arg-name optional-arg)) - (optional-arg.default-arg optional-arg)) - (optional-arg.arg-name optional-arg))) - -(progn - (assert (equalp (decode-optional-arg 'x) - (make-optional-arg 'x nil))) - (assert (equalp (decode-optional-arg '(x t)) - (make-optional-arg 'x t)))) - -(define-modify-macro nreversef () nreverse "Reverse the list in PLACE.") - -(defun decode-arglist (arglist) - "Parse the list ARGLIST and return an ARGLIST structure." - (if (eq arglist :not-available) - :not-available - (loop - with mode = nil - with result = (make-arglist) - for arg = (if (consp arglist) - (pop arglist) - (progn - (prog1 arglist - (setf mode '&rest - arglist nil)))) - do (cond - ((eql mode '&unknown-junk) - ;; don't leave this mode -- we don't know how the arglist - ;; after unknown lambda-list keywords is interpreted - (push arg (arglist.unknown-junk result))) - ((eql arg '&allow-other-keys) - (setf (arglist.allow-other-keys-p result) t)) - ((eql arg '&key) - (setf (arglist.key-p result) t - mode arg)) - ((memq arg '(&optional &rest &body &aux)) - (setq mode arg)) - ((memq arg '(&whole &environment)) - (setq mode arg) - (push arg (arglist.known-junk result))) - ((and (symbolp arg) - (string= (symbol-name arg) (string '#:&any))) ; may be interned - (setf (arglist.any-p result) t) ; in any *package*. - (setq mode '&any)) - ((memq arg lambda-list-keywords) - (setq mode '&unknown-junk) - (push arg (arglist.unknown-junk result))) - (t - (ecase mode - (&key - (push (decode-keyword-arg arg) - (arglist.keyword-args result))) - (&optional - (push (decode-optional-arg arg) - (arglist.optional-args result))) - (&body - (setf (arglist.body-p result) t - (arglist.rest result) arg)) - (&rest - (setf (arglist.rest result) arg)) - (&aux - (push (decode-optional-arg arg) - (arglist.aux-args result))) - ((nil) - (push (decode-required-arg arg) - (arglist.required-args result))) - ((&whole &environment) - (setf mode nil) - (push arg (arglist.known-junk result))) - (&any - (push arg (arglist.any-args result)))))) - until (null arglist) - finally (nreversef (arglist.required-args result)) - finally (nreversef (arglist.optional-args result)) - finally (nreversef (arglist.keyword-args result)) - finally (nreversef (arglist.aux-args result)) - finally (nreversef (arglist.any-args result)) - finally (nreversef (arglist.known-junk result)) - finally (nreversef (arglist.unknown-junk result)) - finally (assert (or (and (not (arglist.key-p result)) - (not (arglist.any-p result))) - (exactly-one-p (arglist.key-p result) - (arglist.any-p result)))) - finally (return result)))) - -(defun encode-arglist (decoded-arglist) - (append (mapcar #'encode-required-arg - (arglist.required-args decoded-arglist)) - (when (arglist.optional-args decoded-arglist) - '(&optional)) - (mapcar #'encode-optional-arg - (arglist.optional-args decoded-arglist)) - (when (arglist.key-p decoded-arglist) - '(&key)) - (mapcar #'encode-keyword-arg - (arglist.keyword-args decoded-arglist)) - (when (arglist.allow-other-keys-p decoded-arglist) - '(&allow-other-keys)) - (when (arglist.any-args decoded-arglist) - `(&any ,@(arglist.any-args decoded-arglist))) - (cond ((not (arglist.rest decoded-arglist)) - '()) - ((arglist.body-p decoded-arglist) - `(&body ,(arglist.rest decoded-arglist))) - (t - `(&rest ,(arglist.rest decoded-arglist)))) - (when (arglist.aux-args decoded-arglist) - `(&aux ,(arglist.aux-args decoded-arglist))) - (arglist.known-junk decoded-arglist) - (arglist.unknown-junk decoded-arglist))) - -;;;; Arglist Enrichment - -(defun arglist-keywords (lambda-list) - "Return the list of keywords in ARGLIST. -As a secondary value, return whether &allow-other-keys appears." - (let ((decoded-arglist (decode-arglist lambda-list))) - (values (arglist.keyword-args decoded-arglist) - (arglist.allow-other-keys-p decoded-arglist)))) - - -(defun methods-keywords (methods) - "Collect all keywords in the arglists of METHODS. -As a secondary value, return whether &allow-other-keys appears somewhere." - (let ((keywords '()) - (allow-other-keys nil)) - (dolist (method methods) - (multiple-value-bind (kw aok) - (arglist-keywords - (swank-mop:method-lambda-list method)) - (setq keywords (remove-duplicates (append keywords kw) - :key #'keyword-arg.keyword) - allow-other-keys (or allow-other-keys aok)))) - (values keywords allow-other-keys))) - -(defun generic-function-keywords (generic-function) - "Collect all keywords in the methods of GENERIC-FUNCTION. -As a secondary value, return whether &allow-other-keys appears somewhere." - (methods-keywords - (swank-mop:generic-function-methods generic-function))) - -(defun applicable-methods-keywords (generic-function arguments) - "Collect all keywords in the methods of GENERIC-FUNCTION that are -applicable for argument of CLASSES. As a secondary value, return -whether &allow-other-keys appears somewhere." - (methods-keywords - (multiple-value-bind (amuc okp) - (swank-mop:compute-applicable-methods-using-classes - generic-function (mapcar #'class-of arguments)) - (if okp - amuc - (compute-applicable-methods generic-function arguments))))) - -(defgeneric extra-keywords (operator args) - (:documentation "Return a list of extra keywords of OPERATOR (a -symbol) when applied to the (unevaluated) ARGS. -As a secondary value, return whether other keys are allowed. -As a tertiary value, return the initial sublist of ARGS that was needed -to determine the extra keywords.")) - -;;; We make sure that symbol-from-KEYWORD-using keywords come before -;;; symbol-from-arbitrary-package-using keywords. And we sort the -;;; latter according to how their home-packages relate to *PACKAGE*. -;;; -;;; Rationale is to show those key parameters first which make most -;;; sense in the current context. And in particular: to put -;;; implementation-internal stuff last. -;;; -;;; This matters tremendeously on Allegro in combination with -;;; AllegroCache as that does some evil tinkering with initargs, -;;; obfuscating the arglist of MAKE-INSTANCE. -;;; - -(defmethod extra-keywords :around (op args) - (declare (ignorable op args)) - (multiple-value-bind (keywords aok enrichments) (call-next-method) - (values (sort-extra-keywords keywords) aok enrichments))) - -(defun make-package-comparator (reference-packages) - "Returns a two-argument test function which compares packages -according to their used-by relation with REFERENCE-PACKAGES. Packages -will be sorted first which appear first in the PACKAGE-USE-LIST of the -reference packages." - (let ((package-use-table (make-hash-table :test 'eq))) - ;; Walk the package dependency graph breadth-fist, and fill - ;; PACKAGE-USE-TABLE accordingly. - (loop with queue = (copy-list reference-packages) - with bfn = 0 ; Breadth-First Number - for p = (pop queue) - unless (gethash p package-use-table) - do (setf (gethash p package-use-table) (shiftf bfn (1+ bfn))) - and do (setf queue (nconc queue (copy-list (package-use-list p)))) - while queue) - #'(lambda (p1 p2) - (let ((bfn1 (gethash p1 package-use-table)) - (bfn2 (gethash p2 package-use-table))) - (cond ((and bfn1 bfn2) (<= bfn1 bfn2)) - (bfn1 bfn1) - (bfn2 nil) ; p2 is used, p1 not - (t (string<= (package-name p1) (package-name p2)))))))) - -(defun sort-extra-keywords (kwds) - (stable-sort kwds (make-package-comparator (list keyword-package *package*)) - :key (compose #'symbol-package #'keyword-arg.keyword))) - -(defun keywords-of-operator (operator) - "Return a list of KEYWORD-ARGs that OPERATOR accepts. -This function is useful for writing EXTRA-KEYWORDS methods for -user-defined functions which are declared &ALLOW-OTHER-KEYS and which -forward keywords to OPERATOR." - (with-available-arglist (arglist) (arglist-from-form (ensure-list operator)) - (values (arglist.keyword-args arglist) - (arglist.allow-other-keys-p arglist)))) - -(defmethod extra-keywords (operator args) - ;; default method - (declare (ignore args)) - (let ((symbol-function (symbol-function operator))) - (if (typep symbol-function 'generic-function) - (generic-function-keywords symbol-function) - nil))) - -(defun class-from-class-name-form (class-name-form) - (when (and (listp class-name-form) - (= (length class-name-form) 2) - (eq (car class-name-form) 'quote)) - (let* ((class-name (cadr class-name-form)) - (class (find-class class-name nil))) - (when (and class - (not (swank-mop:class-finalized-p class))) - ;; Try to finalize the class, which can fail if - ;; superclasses are not defined yet - (ignore-errors (swank-mop:finalize-inheritance class))) - class))) - -(defun extra-keywords/slots (class) - (multiple-value-bind (slots allow-other-keys-p) - (if (swank-mop:class-finalized-p class) - (values (swank-mop:class-slots class) nil) - (values (swank-mop:class-direct-slots class) t)) - (let ((slot-init-keywords - (loop for slot in slots append - (mapcar (lambda (initarg) - (make-keyword-arg - initarg - (swank-mop:slot-definition-name slot) - (and (swank-mop:slot-definition-initfunction slot) - (swank-mop:slot-definition-initform slot)))) - (swank-mop:slot-definition-initargs slot))))) - (values slot-init-keywords allow-other-keys-p)))) - -(defun extra-keywords/make-instance (operator args) - (declare (ignore operator)) - (unless (null args) - (let* ((class-name-form (car args)) - (class (class-from-class-name-form class-name-form))) - (when class - (multiple-value-bind (slot-init-keywords class-aokp) - (extra-keywords/slots class) - (multiple-value-bind (allocate-instance-keywords ai-aokp) - (applicable-methods-keywords - #'allocate-instance (list class)) - (multiple-value-bind (initialize-instance-keywords ii-aokp) - (ignore-errors - (applicable-methods-keywords - #'initialize-instance - (list (swank-mop:class-prototype class)))) - (multiple-value-bind (shared-initialize-keywords si-aokp) - (ignore-errors - (applicable-methods-keywords - #'shared-initialize - (list (swank-mop:class-prototype class) t))) - (values (append slot-init-keywords - allocate-instance-keywords - initialize-instance-keywords - shared-initialize-keywords) - (or class-aokp ai-aokp ii-aokp si-aokp) - (list class-name-form)))))))))) - -(defun extra-keywords/change-class (operator args) - (declare (ignore operator)) - (unless (null args) - (let* ((class-name-form (car args)) - (class (class-from-class-name-form class-name-form))) - (when class - (multiple-value-bind (slot-init-keywords class-aokp) - (extra-keywords/slots class) - (declare (ignore class-aokp)) - (multiple-value-bind (shared-initialize-keywords si-aokp) - (ignore-errors - (applicable-methods-keywords - #'shared-initialize - (list (swank-mop:class-prototype class) t))) - ;; FIXME: much as it would be nice to include the - ;; applicable keywords from - ;; UPDATE-INSTANCE-FOR-DIFFERENT-CLASS, I don't really see - ;; how to do it: so we punt, always declaring - ;; &ALLOW-OTHER-KEYS. - (declare (ignore si-aokp)) - (values (append slot-init-keywords shared-initialize-keywords) - t - (list class-name-form)))))))) - -(defmethod extra-keywords ((operator (eql 'make-instance)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'make-condition)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'error)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'signal)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'warn)) - args) - (multiple-value-or (extra-keywords/make-instance operator args) - (call-next-method))) - -(defmethod extra-keywords ((operator (eql 'cerror)) - args) - (multiple-value-bind (keywords aok determiners) - (extra-keywords/make-instance operator (cdr args)) - (if keywords - (values keywords aok - (cons (car args) determiners)) - (call-next-method)))) - -(defmethod extra-keywords ((operator (eql 'change-class)) - args) - (multiple-value-bind (keywords aok determiners) - (extra-keywords/change-class operator (cdr args)) - (if keywords - (values keywords aok - (cons (car args) determiners)) - (call-next-method)))) - -(defun enrich-decoded-arglist-with-keywords (decoded-arglist keywords - allow-other-keys-p) - "Modify DECODED-ARGLIST using KEYWORDS and ALLOW-OTHER-KEYS-P." - (when keywords - (setf (arglist.key-p decoded-arglist) t) - (setf (arglist.keyword-args decoded-arglist) - (remove-duplicates - (append (arglist.keyword-args decoded-arglist) - keywords) - :key #'keyword-arg.keyword))) - (setf (arglist.allow-other-keys-p decoded-arglist) - (or (arglist.allow-other-keys-p decoded-arglist) - allow-other-keys-p))) - -(defun enrich-decoded-arglist-with-extra-keywords (decoded-arglist form) - "Determine extra keywords from the function call FORM, and modify -DECODED-ARGLIST to include them. As a secondary return value, return -the initial sublist of ARGS that was needed to determine the extra -keywords. As a tertiary return value, return whether any enrichment -was done." - (multiple-value-bind (extra-keywords extra-aok determining-args) - (extra-keywords (car form) (cdr form)) - ;; enrich the list of keywords with the extra keywords - (enrich-decoded-arglist-with-keywords decoded-arglist - extra-keywords extra-aok) - (values decoded-arglist - determining-args - (or extra-keywords extra-aok)))) - -(defgeneric compute-enriched-decoded-arglist (operator-form argument-forms) - (:documentation - "Return three values: DECODED-ARGLIST, DETERMINING-ARGS, and -ANY-ENRICHMENT, just like enrich-decoded-arglist-with-extra-keywords. -If the arglist is not available, return :NOT-AVAILABLE.")) - -(defmethod compute-enriched-decoded-arglist (operator-form argument-forms) - (with-available-arglist (decoded-arglist) - (decode-arglist (arglist operator-form)) - (enrich-decoded-arglist-with-extra-keywords decoded-arglist - (cons operator-form - argument-forms)))) - -(defmethod compute-enriched-decoded-arglist - ((operator-form (eql 'with-open-file)) argument-forms) - (declare (ignore argument-forms)) - (multiple-value-bind (decoded-arglist determining-args) - (call-next-method) - (let ((first-arg (first (arglist.required-args decoded-arglist))) - (open-arglist (compute-enriched-decoded-arglist 'open nil))) - (when (and (arglist-p first-arg) (arglist-p open-arglist)) - (enrich-decoded-arglist-with-keywords - first-arg - (arglist.keyword-args open-arglist) - nil))) - (values decoded-arglist determining-args t))) - -(defmethod compute-enriched-decoded-arglist ((operator-form (eql 'apply)) - argument-forms) - (let ((function-name-form (car argument-forms))) - (when (and (listp function-name-form) - (length= function-name-form 2) - (memq (car function-name-form) '(quote function))) - (let ((function-name (cadr function-name-form))) - (when (valid-operator-symbol-p function-name) - (let ((function-arglist - (compute-enriched-decoded-arglist function-name - (cdr argument-forms)))) - (return-from compute-enriched-decoded-arglist - (values - (make-arglist :required-args - (list 'function) - :optional-args - (append - (mapcar #'(lambda (arg) - (make-optional-arg arg nil)) - (arglist.required-args function-arglist)) - (arglist.optional-args function-arglist)) - :key-p - (arglist.key-p function-arglist) - :keyword-args - (arglist.keyword-args function-arglist) - :rest - 'args - :allow-other-keys-p - (arglist.allow-other-keys-p function-arglist)) - (list function-name-form) - t))))))) - (call-next-method)) - -(defmethod compute-enriched-decoded-arglist - ((operator-form (eql 'multiple-value-call)) argument-forms) - (compute-enriched-decoded-arglist 'apply argument-forms)) - -(defun delete-given-args (decoded-arglist args) - "Delete given ARGS from DECODED-ARGLIST." - (macrolet ((pop-or-return (list) - `(if (null ,list) - (return-from do-decoded-arglist) - (pop ,list)))) - (do-decoded-arglist decoded-arglist - (&provided () - (assert (eq (pop-or-return args) - (pop (arglist.provided-args decoded-arglist))))) - (&required () - (pop-or-return args) - (pop (arglist.required-args decoded-arglist))) - (&optional () - (pop-or-return args) - (pop (arglist.optional-args decoded-arglist))) - (&key (keyword) - ;; N.b. we consider a keyword to be given only when the keyword - ;; _and_ a value has been given for it. - (loop for (key value) on args by #'cddr - when (and (eq keyword key) value) - do (setf (arglist.keyword-args decoded-arglist) - (remove keyword (arglist.keyword-args decoded-arglist) - :key #'keyword-arg.keyword)))))) - decoded-arglist) - -(defun remove-given-args (decoded-arglist args) - ;; FIXME: We actually needa deep copy here. - (delete-given-args (copy-arglist decoded-arglist) args)) - -;;;; Arglist Retrieval - -(defun arglist-from-form (form) - (if (null form) - :not-available - (arglist-dispatch (car form) (cdr form)))) - -(export 'arglist-dispatch) -(defgeneric arglist-dispatch (operator arguments) - ;; Default method - (:method (operator arguments) - (unless (and (symbolp operator) (valid-operator-symbol-p operator)) - (return-from arglist-dispatch :not-available)) - (when (equalp (package-name (symbol-package operator)) "closer-mop") - (let ((standard-symbol (or (find-symbol (symbol-name operator) :cl) - (find-symbol (symbol-name operator) :swank-mop)))) - (when standard-symbol - (return-from arglist-dispatch - (arglist-dispatch standard-symbol arguments))))) - - (multiple-value-bind (decoded-arglist determining-args) - (compute-enriched-decoded-arglist operator arguments) - (with-available-arglist (arglist) decoded-arglist - ;; replace some formal args by determining actual args - (setf arglist (delete-given-args arglist determining-args)) - (setf (arglist.provided-args arglist) determining-args) - arglist)))) - -(defmethod arglist-dispatch ((operator (eql 'defmethod)) arguments) - (match (cons operator arguments) - (('defmethod (#'function-exists-p gf-name) . rest) - (let ((gf (fdefinition gf-name))) - (when (typep gf 'generic-function) - (with-available-arglist (arglist) (decode-arglist (arglist gf)) - (let ((qualifiers (loop for x in rest - until (or (listp x) (empty-arg-p x)) - collect x))) - (return-from arglist-dispatch - (make-arglist :provided-args (cons gf-name qualifiers) - :required-args (list arglist) - :rest "body" :body-p t))))))) - (_)) ; Fall through - (call-next-method)) - -(defmethod arglist-dispatch ((operator (eql 'define-compiler-macro)) arguments) - (match (cons operator arguments) - (('define-compiler-macro (#'function-exists-p gf-name) . _) - (let ((gf (fdefinition gf-name))) - (with-available-arglist (arglist) (decode-arglist (arglist gf)) - (return-from arglist-dispatch - (make-arglist :provided-args (list gf-name) - :required-args (list arglist) - :rest "body" :body-p t))))) - (_)) ; Fall through - (call-next-method)) - - -(defmethod arglist-dispatch ((operator (eql 'eval-when)) arguments) - (declare (ignore arguments)) - (let ((eval-when-args '(:compile-toplevel :load-toplevel :execute))) - (make-arglist - :required-args (list (make-arglist :any-p t :any-args eval-when-args)) - :rest '#:body :body-p t))) - - -(defmethod arglist-dispatch ((operator (eql 'declare)) arguments) - (let* ((declaration (cons operator (last arguments))) - (typedecl-arglist (arglist-for-type-declaration declaration))) - (if (arglist-available-p typedecl-arglist) - typedecl-arglist - (match declaration - (('declare ((#'consp typespec) . decl-args)) - (with-available-arglist (typespec-arglist) - (decoded-arglist-for-type-specifier typespec) - (make-arglist - :required-args (list (make-arglist - :required-args (list typespec-arglist) - :rest '#:variables))))) - (('declare (decl-identifier . decl-args)) - (decoded-arglist-for-declaration decl-identifier decl-args)) - (_ (make-arglist :rest '#:declaration-specifiers)))))) - -(defmethod arglist-dispatch ((operator (eql 'declaim)) arguments) - (arglist-dispatch 'declare arguments)) - - -(defun arglist-for-type-declaration (declaration) - (flet ((%arglist-for-type-declaration (identifier typespec rest-var-name) - (with-available-arglist (typespec-arglist) - (decoded-arglist-for-type-specifier typespec) - (make-arglist - :required-args (list (make-arglist - :provided-args (list identifier) - :required-args (list typespec-arglist) - :rest rest-var-name)))))) - (match declaration - (('declare ('type (#'consp typespec) . decl-args)) - (%arglist-for-type-declaration 'type typespec '#:variables)) - (('declare ('ftype (#'consp typespec) . decl-args)) - (%arglist-for-type-declaration 'ftype typespec '#:function-names)) - (('declare ((#'consp typespec) . decl-args)) - (with-available-arglist (typespec-arglist) - (decoded-arglist-for-type-specifier typespec) - (make-arglist - :required-args (list (make-arglist - :required-args (list typespec-arglist) - :rest '#:variables))))) - (_ :not-available)))) - -(defun decoded-arglist-for-declaration (decl-identifier decl-args) - (declare (ignore decl-args)) - (with-available-arglist (arglist) - (decode-arglist (declaration-arglist decl-identifier)) - (setf (arglist.provided-args arglist) (list decl-identifier)) - (make-arglist :required-args (list arglist)))) - -(defun decoded-arglist-for-type-specifier (type-specifier) - (etypecase type-specifier - (arglist-dummy :not-available) - (cons (decoded-arglist-for-type-specifier (car type-specifier))) - (symbol - (with-available-arglist (arglist) - (decode-arglist (type-specifier-arglist type-specifier)) - (setf (arglist.provided-args arglist) (list type-specifier)) - arglist)))) - -;;; Slimefuns - -;;; We work on a RAW-FORM, or BUFFER-FORM, which represent the form at -;;; user's point in Emacs. A RAW-FORM looks like -;;; -;;; ("FOO" ("BAR" ...) "QUUX" ("ZURP" SWANK::%CURSOR-MARKER%)) -;;; -;;; The expression before the cursor marker is the expression where -;;; user's cursor points at. An explicit marker is necessary to -;;; disambiguate between -;;; -;;; ("IF" ("PRED") -;;; ("F" "X" "Y" %CURSOR-MARKER%)) -;;; -;;; and -;;; ("IF" ("PRED") -;;; ("F" "X" "Y") %CURSOR-MARKER%) - -;;; Notice that for a form like (FOO (BAR |) QUUX), where | denotes -;;; user's point, the following should be sent ("FOO" ("BAR" "" -;;; %CURSOR-MARKER%)). Only the forms up to point should be -;;; considered. - -(defslimefun autodoc (raw-form &key print-right-margin) - "Return a list of two elements. -First, a string representing the arglist for the deepest subform in -RAW-FORM that does have an arglist. The highlighted parameter is -wrapped in ===> X <===. - -Second, a boolean value telling whether the returned string can be cached." - (handler-bind ((serious-condition - #'(lambda (c) - (unless (debug-on-swank-error) - (let ((*print-right-margin* print-right-margin)) - (return-from autodoc - (format nil "Arglist Error: \"~A\"" c))))))) - (with-buffer-syntax () - (multiple-value-bind (form arglist obj-at-cursor form-path) - (find-subform-with-arglist (parse-raw-form raw-form)) - (cond ((boundp-and-interesting obj-at-cursor) - (list (print-variable-to-string obj-at-cursor) nil)) - (t - (list - (with-available-arglist (arglist) arglist - (decoded-arglist-to-string - arglist - :print-right-margin print-right-margin - :operator (car form) - :highlight (form-path-to-arglist-path form-path - form - arglist))) - t))))))) - -(defun boundp-and-interesting (symbol) - (and symbol - (symbolp symbol) - (boundp symbol) - (not (memq symbol '(cl:t cl:nil))) - (not (keywordp symbol)))) - -(defun print-variable-to-string (symbol) - "Return a short description of VARIABLE-NAME, or NIL." - (let ((*print-pretty* t) (*print-level* 4) - (*print-length* 10) (*print-lines* 1) - (*print-readably* nil) - (value (symbol-value symbol))) - (call/truncated-output-to-string - 75 (lambda (s) - (without-printing-errors (:object value :stream s) - (format s "~A ~A~S" symbol *echo-area-prefix* value)))))) - - -(defslimefun complete-form (raw-form) - "Read FORM-STRING in the current buffer package, then complete it - by adding a template for the missing arguments." - ;; We do not catch errors here because COMPLETE-FORM is an - ;; interactive command, not automatically run in the background like - ;; ARGLIST-FOR-ECHO-AREA. - (with-buffer-syntax () - (multiple-value-bind (arglist provided-args) - (find-immediately-containing-arglist (parse-raw-form raw-form)) - (with-available-arglist (arglist) arglist - (decoded-arglist-to-template-string - (delete-given-args arglist - (remove-if #'empty-arg-p provided-args - :from-end t :count 1)) - :prefix "" :suffix ""))))) - -(defslimefun completions-for-keyword (keyword-string raw-form) - "Return a list of possible completions for KEYWORD-STRING relative -to the context provided by RAW-FORM." - (with-buffer-syntax () - (let ((arglist (find-immediately-containing-arglist - (parse-raw-form raw-form)))) - (when (arglist-available-p arglist) - ;; It would be possible to complete keywords only if we are in - ;; a keyword position, but it is not clear if we want that. - (let* ((keywords - (append (mapcar #'keyword-arg.keyword - (arglist.keyword-args arglist)) - (remove-if-not #'keywordp (arglist.any-args arglist)))) - (keyword-name - (tokenize-symbol keyword-string)) - (matching-keywords - (find-matching-symbols-in-list - keyword-name keywords (make-compound-prefix-matcher #\-))) - (converter (completion-output-symbol-converter keyword-string)) - (strings - (mapcar converter - (mapcar #'symbol-name matching-keywords))) - (completion-set - (format-completion-set strings nil ""))) - (list completion-set - (longest-compound-prefix completion-set))))))) - -(defparameter +cursor-marker+ '%cursor-marker%) - -(defun find-subform-with-arglist (form) - "Returns four values: - - The appropriate subform of `form' which is closest to the - +CURSOR-MARKER+ and whose operator is valid and has an - arglist. The +CURSOR-MARKER+ is removed from that subform. - - Second value is the arglist. Local function and macro definitions - appearing in `form' into account. - - Third value is the object in front of +CURSOR-MARKER+. - - Fourth value is a form path to that object." - (labels - ((yield-success (form local-ops) - (multiple-value-bind (form obj-at-cursor form-path) - (extract-cursor-marker form) - (values form - (let ((entry (assoc (car form) local-ops :test #'op=))) - (if entry - (decode-arglist (cdr entry)) - (arglist-from-form form))) - obj-at-cursor - form-path))) - (yield-failure () - (values nil :not-available)) - (operator-p (operator local-ops) - (or (and (symbolp operator) (valid-operator-symbol-p operator)) - (assoc operator local-ops :test #'op=))) - (op= (op1 op2) - (cond ((and (symbolp op1) (symbolp op2)) - (eq op1 op2)) - ((and (arglist-dummy-p op1) (arglist-dummy-p op2)) - (string= (arglist-dummy.string-representation op1) - (arglist-dummy.string-representation op2))))) - (grovel-form (form local-ops) - "Descend FORM top-down, always taking the rightest branch, - until +CURSOR-MARKER+." - (assert (listp form)) - (destructuring-bind (operator . args) form - ;; N.b. the user's cursor is at the rightmost, deepest - ;; subform right before +CURSOR-MARKER+. - (let ((last-subform (car (last form))) - (new-ops)) - (cond - ((eq last-subform +cursor-marker+) - (if (operator-p operator local-ops) - (yield-success form local-ops) - (yield-failure))) - ((not (operator-p operator local-ops)) - (grovel-form last-subform local-ops)) - ;; Make sure to pick up the arglists of local - ;; function/macro definitions. - ((setq new-ops (extract-local-op-arglists operator args)) - (multiple-value-or (grovel-form last-subform - (nconc new-ops local-ops)) - (yield-success form local-ops))) - ;; Some typespecs clash with function names, so we make - ;; sure to bail out early. - ((member operator '(cl:declare cl:declaim)) - (yield-success form local-ops)) - ;; Mostly uninteresting, hence skip. - ((memq operator '(cl:quote cl:function)) - (yield-failure)) - (t - (multiple-value-or (grovel-form last-subform local-ops) - (yield-success form local-ops)))))))) - (if (null form) - (yield-failure) - (grovel-form form '())))) - -(defun extract-cursor-marker (form) - "Returns three values: normalized `form' without +CURSOR-MARKER+, -the object in front of +CURSOR-MARKER+, and a form path to that -object." - (labels ((grovel (form last path) - (let ((result-form)) - (loop for (car . cdr) on form do - (cond ((eql car +cursor-marker+) - (decf (first path)) - (return-from grovel - (values (nreconc result-form cdr) - last - (nreverse path)))) - ((consp car) - (multiple-value-bind (new-car new-last new-path) - (grovel car last (cons 0 path)) - (when new-path ; CAR contained cursor-marker? - (return-from grovel - (values (nreconc - (cons new-car result-form) cdr) - new-last - new-path)))))) - (push car result-form) - (setq last car) - (incf (first path)) - finally - (return-from grovel - (values (nreverse result-form) nil nil)))))) - (grovel form nil (list 0)))) - -(defgeneric extract-local-op-arglists (operator args) - (:documentation - "If the form `(OPERATOR ,@ARGS) is a local operator binding form, - return a list of pairs (OP . ARGLIST) for each locally bound op.") - (:method (operator args) - (declare (ignore operator args)) - nil) - ;; FLET - (:method ((operator (eql 'cl:flet)) args) - (let ((defs (first args)) - (body (rest args))) - (cond ((null body) nil) ; `(flet ((foo (x) |' - ((atom defs) nil) ; `(flet ,foo (|' - (t (%collect-op/argl-alist defs))))) - ;; LABELS - (:method ((operator (eql 'cl:labels)) args) - ;; Notice that we only have information to "look backward" and - ;; show arglists of previously occuring local functions. - (destructuring-bind (defs . body) args - (unless (or (atom defs) (null body)) ; `(labels ,foo (|' - (let ((current-def (car (last defs)))) - (cond ((atom current-def) nil) ; `(labels ((foo (x) ...)|' - ((not (null body)) - (extract-local-op-arglists 'cl:flet args)) - (t - (let ((def.body (cddr current-def))) - (when def.body - (%collect-op/argl-alist defs))))))))) - ;; MACROLET - (:method ((operator (eql 'cl:macrolet)) args) - (extract-local-op-arglists 'cl:labels args))) - -(defun %collect-op/argl-alist (defs) - (setq defs (remove-if-not #'(lambda (x) - ;; Well-formed FLET/LABELS def? - (and (consp x) (second x))) - defs)) - (loop for (name arglist . nil) in defs - collect (cons name arglist))) - -(defun find-immediately-containing-arglist (form) - "Returns the arglist of the subform _immediately_ containing -+CURSOR-MARKER+ in `form'. Notice, however, that +CURSOR-MARKER+ may -be in a nested arglist \(e.g. `(WITH-OPEN-FILE ('\), and the -arglist of the appropriate parent form \(WITH-OPEN-FILE\) will be -returned in that case." - (flet ((try (form-path form arglist) - (let* ((arglist-path (form-path-to-arglist-path form-path - form - arglist)) - (argl (apply #'arglist-ref - arglist - arglist-path)) - (args (apply #'provided-arguments-ref - (cdr form) - arglist - arglist-path))) - (when (and (arglist-p argl) (listp args)) - (values argl args))))) - (multiple-value-bind (form arglist obj form-path) - (find-subform-with-arglist form) - (declare (ignore obj)) - (with-available-arglist (arglist) arglist - ;; First try the form the cursor is in (in case of a normal - ;; form), then try the surrounding form (in case of a nested - ;; macro form). - (multiple-value-or (try form-path form arglist) - (try (butlast form-path) form arglist) - :not-available))))) - -(defun form-path-to-arglist-path (form-path form arglist) - "Convert a form path to an arglist path consisting of arglist -indices." - (labels ((convert (path args arglist) - (if (null path) - nil - (let* ((idx (car path)) - (idx* (arglist-index idx args arglist)) - (arglist* (and idx* (arglist-ref arglist idx*))) - (args* (and idx* (provided-arguments-ref args - arglist - idx*)))) - ;; The FORM-PATH may be more detailed than ARGLIST; - ;; consider (defun foo (x y) ...), a form path may - ;; point into the function's lambda-list, but the - ;; arglist of DEFUN won't contain as much information. - ;; So we only recurse if possible. - (cond ((null idx*) - nil) - ((arglist-p arglist*) - (cons idx* (convert (cdr path) args* arglist*))) - (t - (list idx*))))))) - (convert - ;; FORM contains irrelevant operator. Adjust FORM-PATH. - (cond ((null form-path) nil) - ((equal form-path '(0)) nil) - (t - (destructuring-bind (car . cdr) form-path - (cons (1- car) cdr)))) - (cdr form) - arglist))) - -(defun arglist-index (provided-argument-index provided-arguments arglist) - "Return the arglist index into `arglist' for the parameter belonging -to the argument (NTH `provided-argument-index' `provided-arguments')." - (let ((positional-args# (positional-args-number arglist)) - (arg-index provided-argument-index)) - (with-struct (arglist. key-p rest) arglist - (cond - ((< arg-index positional-args#) ; required + optional - arg-index) - ((and (not key-p) (not rest)) ; more provided than allowed - nil) - ((not key-p) ; rest + body - (assert (arglist.rest arglist)) - positional-args#) - (t ; key - ;; Find last provided &key parameter - (let* ((argument (nth arg-index provided-arguments)) - (provided-keys (subseq provided-arguments positional-args#))) - (loop for (key value) on provided-keys by #'cddr - when (eq value argument) - return (match key - (('quote symbol) symbol) - (_ key))))))))) - -(defun arglist-ref (arglist &rest indices) - "Returns the parameter in ARGLIST along the INDICIES path. Numbers -represent positional parameters (required, optional), keywords -represent key parameters." - (flet ((ref-positional-arg (arglist index) - (check-type index (integer 0 *)) - (with-struct (arglist. provided-args required-args - optional-args rest) - arglist - (loop for args in (list provided-args required-args - (mapcar #'optional-arg.arg-name - optional-args)) - for args# = (length args) - if (< index args#) - return (nth index args) - else - do (decf index args#) - finally (return (or rest nil))))) - (ref-keyword-arg (arglist keyword) - ;; keyword argument may be any symbol, - ;; not only from the KEYWORD package. - (let ((keyword (match keyword - (('quote symbol) symbol) - (_ keyword)))) - (do-decoded-arglist arglist - (&key (kw arg) (when (eq kw keyword) - (return-from ref-keyword-arg arg))))) - nil)) - (dolist (index indices) - (assert (arglist-p arglist)) - (setq arglist (if (numberp index) - (ref-positional-arg arglist index) - (ref-keyword-arg arglist index)))) - arglist)) - -(defun provided-arguments-ref (provided-args arglist &rest indices) - "Returns the argument in PROVIDED-ARGUMENT along the INDICES path -relative to ARGLIST." - (check-type arglist arglist) - (flet ((ref (provided-args arglist index) - (if (numberp index) - (nth index provided-args) - (let ((provided-keys (subseq provided-args - (positional-args-number arglist)))) - (loop for (key value) on provided-keys - when (eq key index) - return value))))) - (dolist (idx indices) - (setq provided-args (ref provided-args arglist idx)) - (setq arglist (arglist-ref arglist idx))) - provided-args)) - -(defun positional-args-number (arglist) - (+ (length (arglist.provided-args arglist)) - (length (arglist.required-args arglist)) - (length (arglist.optional-args arglist)))) - -(defun parse-raw-form (raw-form) - "Parse a RAW-FORM into a Lisp form. I.e. substitute strings by -symbols if already interned. For strings not already interned, use -ARGLIST-DUMMY." - (unless (null raw-form) - (loop for element in raw-form - collect (etypecase element - (string (read-conversatively element)) - (list (parse-raw-form element)) - (symbol (prog1 element - ;; Comes after list, so ELEMENT can't be NIL. - (assert (eq element +cursor-marker+)))))))) - -(defun read-conversatively (string) - "Tries to find the symbol that's represented by STRING. - -If it can't, this either means that STRING does not represent a -symbol, or that the symbol behind STRING would have to be freshly -interned. Because this function is supposed to be called from the -automatic arglist display stuff from Slime, interning freshly -symbols is a big no-no. - -In such a case (that no symbol could be found), an object of type -ARGLIST-DUMMY is returned instead, which works as a placeholder -datum for subsequent logics to rely on." - (let* ((string (string-left-trim '(#\Space #\Tab #\Newline) string)) - (length (length string)) - (type (cond ((zerop length) nil) - ((eql (aref string 0) #\') - :quoted-symbol) - ((search "#'" string :end2 (min length 2)) - :sharpquoted-symbol) - ((char= (char string 0) (char string (1- length)) - #\") - :string) - (t - :symbol)))) - (multiple-value-bind (symbol found?) - (case type - (:symbol (parse-symbol string)) - (:quoted-symbol (parse-symbol (subseq string 1))) - (:sharpquoted-symbol (parse-symbol (subseq string 2))) - (:string (values string t)) - (t (values string nil))) - (if found? - (ecase type - (:symbol symbol) - (:quoted-symbol `(quote ,symbol)) - (:sharpquoted-symbol `(function ,symbol)) - (:string (if (> length 1) - (subseq string 1 (1- length)) - string))) - (make-arglist-dummy string))))) - -(defun test-print-arglist () - (flet ((test (arglist &rest strings) - (let* ((*package* (find-package :swank)) - (actual (decoded-arglist-to-string - (decode-arglist arglist) - :print-right-margin 1000))) - (unless (loop for string in strings - thereis (string= actual string)) - (warn "Test failed: ~S => ~S~% Expected: ~A" - arglist actual - (if (cdr strings) - (format nil "One of: ~{~S~^, ~}" strings) - (format nil "~S" (first strings)))))))) - (test '(function cons) "(function cons)") - (test '(quote cons) "(quote cons)") - (test '(&key (function #'+)) - "(&key (function #'+))" "(&key (function (function +)))") - (test '(&whole x y z) "(y z)") - (test '(x &aux y z) "(x)") - (test '(x &environment env y) "(x y)") - (test '(&key ((function f))) "(&key ((function ..)))") - (test - '(eval-when (&any :compile-toplevel :load-toplevel :execute) &body body) - "(eval-when (&any :compile-toplevel :load-toplevel :execute) &body body)") - (test '(declare (optimize &any (speed 1) (safety 1))) - "(declare (optimize &any (speed 1) (safety 1)))"))) - -(defun test-arglist-ref () - (macrolet ((soft-assert (form) - `(unless ,form - (warn "Assertion failed: ~S~%" ',form)))) - (let ((sample (decode-arglist '(x &key ((:k (y z))))))) - (soft-assert (eq (arglist-ref sample 0) 'x)) - (soft-assert (eq (arglist-ref sample :k 0) 'y)) - (soft-assert (eq (arglist-ref sample :k 1) 'z)) - - (soft-assert (eq (provided-arguments-ref '(a :k (b c)) sample 0) - 'a)) - (soft-assert (eq (provided-arguments-ref '(a :k (b c)) sample :k 0) - 'b)) - (soft-assert (eq (provided-arguments-ref '(a :k (b c)) sample :k 1) - 'c))))) - -(test-print-arglist) -(test-arglist-ref) - -(provide :swank-arglists) diff --git a/elpa/slime-20200414.1444/contrib/swank-asdf.lisp b/elpa/slime-20200414.1444/contrib/swank-asdf.lisp deleted file mode 100644 index 175402d3..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-asdf.lisp +++ /dev/null @@ -1,533 +0,0 @@ -;;; swank-asdf.lisp -- ASDF support -;; -;; Authors: Daniel Barlow -;; Marco Baringer -;; Edi Weitz -;; Francois-Rene Rideau -;; and others -;; License: Public Domain -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) -;;; The best way to load ASDF is from an init file of an -;;; implementation. If ASDF is not loaded at the time swank-asdf is -;;; loaded, it will be tried first with (require "asdf"), if that -;;; doesn't help and *asdf-path* is set, it will be loaded from that -;;; file. -;;; To set *asdf-path* put the following into ~/.swank.lisp: -;;; (defparameter swank::*asdf-path* #p"/path/to/asdf/asdf.lisp") - (defvar *asdf-path* nil - "Path to asdf.lisp file, to be loaded in case (require \"asdf\") fails.")) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (member :asdf *features*) - (ignore-errors (funcall 'require "asdf")))) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (member :asdf *features*) - (handler-bind ((warning #'muffle-warning)) - (when *asdf-path* - (load *asdf-path* :if-does-not-exist nil))))) - -;; If still not found, error out. -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (member :asdf *features*) - (error "Could not load ASDF. -Please update your implementation or -install a recent release of ASDF and in your ~~/.swank.lisp specify: - (defparameter swank::*asdf-path* #p\"/path/containing/asdf/asdf.lisp\")"))) - -;;; If ASDF is too old, punt. -;; As of January 2014, Quicklisp has been providing 2.26 for a year -;; (and previously had 2.014.6 for over a year), whereas -;; all SLIME-supported implementations provide ASDF3 (i.e. 2.27 or later) -;; except LispWorks (stuck with 2.019) and SCL (which hasn't been released -;; in years and doesn't provide ASDF at all, but is fully supported by ASDF). -;; If your implementation doesn't provide ASDF, or provides an old one, -;; install an upgrade yourself and configure *asdf-path*. -;; It's just not worth the hassle supporting something -;; that doesn't even have COERCE-PATHNAME. -;; -;; NB: this version check is duplicated in swank-loader.lisp so that we don't -;; try to load this contrib when ASDF is too old since that will abort the SLIME -;; connection. -#-asdf3 -(eval-when (:compile-toplevel :load-toplevel :execute) - (unless (and #+asdf2 (asdf:version-satisfies (asdf:asdf-version) "2.14.6")) - (error "Your ASDF is too old. ~ - The oldest version supported by swank-asdf is 2.014.6."))) -;;; Import functionality from ASDF that isn't available in all ASDF versions. -;;; Please do NOT depend on any of the below as reference: -;;; they are sometimes stripped down versions, for compatibility only. -;;; Indeed, they are supposed to work on *OLDER*, not *NEWER* versions of ASDF. -;;; -;;; The way I got these is usually by looking at the current definition, -;;; using git blame in one screen to locate which commit last modified it, -;;; and git log in another to determine which release that made it in. -;;; It is OK for some of the below definitions to be or become obsolete, -;;; as long as it will make do with versions older than the tagged version: -;;; if ASDF is more recent, its more recent version will win. -;;; -;;; If your software is hacking ASDF, use its internals. -;;; If you want ASDF utilities in user software, please use ASDF-UTILS. - -(defun asdf-at-least (version) - (asdf:version-satisfies (asdf:asdf-version) version)) - -(defmacro asdefs (version &rest defs) - (flet ((defun* (version name aname rest) - `(progn - (defun ,name ,@rest) - (declaim (notinline ,name)) - (when (asdf-at-least ,version) - (setf (fdefinition ',name) (fdefinition ',aname))))) - (defmethod* (version aname rest) - `(unless (asdf-at-least ,version) - (defmethod ,aname ,@rest))) - (defvar* (name aname rest) - `(progn - (define-symbol-macro ,name ,aname) - (defvar ,aname ,@rest)))) - `(progn - ,@(loop :for (def name . args) :in defs - :for aname = (intern (string name) :asdf) - :collect - (ecase def - ((defun) (defun* version name aname args)) - ((defmethod) (defmethod* version aname args)) - ((defvar) (defvar* name aname args))))))) - -(asdefs "2.15" - (defvar *wild* #-cormanlisp :wild #+cormanlisp "*") - - (defun collect-asds-in-directory (directory collect) - (map () collect (directory-asd-files directory))) - - (defun register-asd-directory (directory &key recurse exclude collect) - (if (not recurse) - (collect-asds-in-directory directory collect) - (collect-sub*directories-asd-files - directory :exclude exclude :collect collect)))) - -(asdefs "2.16" - (defun load-sysdef (name pathname) - (declare (ignore name)) - (let ((package (asdf::make-temporary-package))) - (unwind-protect - (let ((*package* package) - (*default-pathname-defaults* - (asdf::pathname-directory-pathname - (translate-logical-pathname pathname)))) - (asdf::asdf-message - "~&; Loading system definition from ~A into ~A~%" ; - pathname package) - (load pathname)) - (delete-package package)))) - - (defun directory* (pathname-spec &rest keys &key &allow-other-keys) - (apply 'directory pathname-spec - (append keys - '#.(or #+allegro - '(:directories-are-files nil - :follow-symbolic-links nil) - #+clozure - '(:follow-links nil) - #+clisp - '(:circle t :if-does-not-exist :ignore) - #+(or cmu scl) - '(:follow-links nil :truenamep nil) - #+sbcl - (when (find-symbol "RESOLVE-SYMLINKS" '#:sb-impl) - '(:resolve-symlinks nil))))))) -(asdefs "2.17" - (defun collect-sub*directories-asd-files - (directory &key - (exclude asdf::*default-source-registry-exclusions*) - collect) - (asdf::collect-sub*directories - directory - (constantly t) - (lambda (x) (not (member (car (last (pathname-directory x))) - exclude :test #'equal))) - (lambda (dir) (collect-asds-in-directory dir collect)))) - - (defun system-source-directory (system-designator) - (asdf::pathname-directory-pathname - (asdf::system-source-file system-designator))) - - (defun filter-logical-directory-results (directory entries merger) - (if (typep directory 'logical-pathname) - (loop for f in entries - when - (if (typep f 'logical-pathname) - f - (let ((u (ignore-errors (funcall merger f)))) - (and u - (equal (ignore-errors (truename u)) - (truename f)) - u))) - collect it) - entries)) - - (defun directory-asd-files (directory) - (directory-files directory asdf::*wild-asd*))) - -(asdefs "2.19" - (defun subdirectories (directory) - (let* ((directory (asdf::ensure-directory-pathname directory)) - #-(or abcl cormanlisp xcl) - (wild (asdf::merge-pathnames* - #-(or abcl allegro cmu lispworks sbcl scl xcl) - asdf::*wild-directory* - #+(or abcl allegro cmu lispworks sbcl scl xcl) "*.*" - directory)) - (dirs - #-(or abcl cormanlisp xcl) - (ignore-errors - (directory* wild . #.(or #+clozure '(:directories t :files nil) - #+mcl '(:directories t)))) - #+(or abcl xcl) (system:list-directory directory) - #+cormanlisp (cl::directory-subdirs directory)) - #+(or abcl allegro cmu lispworks sbcl scl xcl) - (dirs (loop for x in dirs - for d = #+(or abcl xcl) (extensions:probe-directory x) - #+allegro (excl:probe-directory x) - #+(or cmu sbcl scl) (asdf::directory-pathname-p x) - #+lispworks (lw:file-directory-p x) - when d collect #+(or abcl allegro xcl) d - #+(or cmu lispworks sbcl scl) x))) - (filter-logical-directory-results - directory dirs - (let ((prefix (or (normalize-pathname-directory-component - (pathname-directory directory)) - ;; because allegro 8.x returns NIL for #p"FOO:" - '(:absolute)))) - (lambda (d) - (let ((dir (normalize-pathname-directory-component - (pathname-directory d)))) - (and (consp dir) (consp (cdr dir)) - (make-pathname - :defaults directory :name nil :type nil :version nil - :directory - (append prefix - (make-pathname-component-logical - (last dir)))))))))))) - -(asdefs "2.21" - (defun component-loaded-p (c) - (and (gethash 'load-op (asdf::component-operation-times - (asdf::find-component c nil))) t)) - - (defun normalize-pathname-directory-component (directory) - (cond - #-(or cmu sbcl scl) - ((stringp directory) `(:absolute ,directory) directory) - ((or (null directory) - (and (consp directory) - (member (first directory) '(:absolute :relative)))) - directory) - (t - (error "Unrecognized pathname directory component ~S" directory)))) - - (defun make-pathname-component-logical (x) - (typecase x - ((eql :unspecific) nil) - #+clisp (string (string-upcase x)) - #+clisp (cons (mapcar 'make-pathname-component-logical x)) - (t x))) - - (defun make-pathname-logical (pathname host) - (make-pathname - :host host - :directory (make-pathname-component-logical (pathname-directory pathname)) - :name (make-pathname-component-logical (pathname-name pathname)) - :type (make-pathname-component-logical (pathname-type pathname)) - :version (make-pathname-component-logical (pathname-version pathname))))) - -(asdefs "2.22" - (defun directory-files (directory &optional (pattern asdf::*wild-file*)) - (let ((dir (pathname directory))) - (when (typep dir 'logical-pathname) - (when (wild-pathname-p dir) - (error "Invalid wild pattern in logical directory ~S" directory)) - (unless (member (pathname-directory pattern) - '(() (:relative)) :test 'equal) - (error "Invalid file pattern ~S for logical directory ~S" - pattern directory)) - (setf pattern (make-pathname-logical pattern (pathname-host dir)))) - (let ((entries (ignore-errors - (directory* (asdf::merge-pathnames* pattern dir))))) - (filter-logical-directory-results - directory entries - (lambda (f) - (make-pathname :defaults dir - :name (make-pathname-component-logical - (pathname-name f)) - :type (make-pathname-component-logical - (pathname-type f)) - :version (make-pathname-component-logical - (pathname-version f))))))))) - -(asdefs "2.26.149" - (defmethod component-relative-pathname ((system asdf:system)) - (asdf::coerce-pathname - (and (slot-boundp system 'asdf::relative-pathname) - (slot-value system 'asdf::relative-pathname)) - :type :directory - :defaults (system-source-directory system))) - (defun load-asd (pathname &key name &allow-other-keys) - (asdf::load-sysdef (or name (string-downcase (pathname-name pathname))) - pathname))) - - -;;; Taken from ASDF 1.628 -(defmacro while-collecting ((&rest collectors) &body body) - `(asdf::while-collecting ,collectors ,@body)) - -;;; Now for SLIME-specific stuff - -(defun asdf-operation (operation) - (or (asdf::find-symbol* operation :asdf) - (error "Couldn't find ASDF operation ~S" operation))) - -(defun map-system-components (fn system) - (map-component-subcomponents fn (asdf:find-system system))) - -(defun map-component-subcomponents (fn component) - (when component - (funcall fn component) - (when (typep component 'asdf:module) - (dolist (c (asdf:module-components component)) - (map-component-subcomponents fn c))))) - -;;; Maintaining a pathname to component table - -(defvar *pathname-component* (make-hash-table :test 'equal)) - -(defun clear-pathname-component-table () - (clrhash *pathname-component*)) - -(defun register-system-pathnames (system) - (map-system-components 'register-component-pathname system)) - -(defun recompute-pathname-component-table () - (clear-pathname-component-table) - (asdf::map-systems 'register-system-pathnames)) - -(defun pathname-component (x) - (gethash (pathname x) *pathname-component*)) - -(defmethod asdf:component-pathname :around ((component asdf:component)) - (let ((p (call-next-method))) - (when (pathnamep p) - (setf (gethash p *pathname-component*) component)) - p)) - -(defun register-component-pathname (component) - (asdf:component-pathname component)) - -(recompute-pathname-component-table) - -;;; This is a crude hack, see ASDF's LP #481187. -(defslimefun who-depends-on (system) - (flet ((system-dependencies (op system) - (mapcar (lambda (dep) - (asdf::coerce-name (if (consp dep) (second dep) dep))) - (cdr (assoc op (asdf:component-depends-on op system)))))) - (let ((system-name (asdf::coerce-name system)) - (result)) - (asdf::map-systems - (lambda (system) - (when (member system-name - (system-dependencies 'asdf:load-op system) - :test #'string=) - (push (asdf:component-name system) result)))) - result))) - -(defmethod xref-doit ((type (eql :depends-on)) thing) - (when (typep thing '(or string symbol)) - (loop for dependency in (who-depends-on thing) - for asd-file = (asdf:system-definition-pathname dependency) - when asd-file - collect (list dependency - (swank/backend:make-location - `(:file ,(namestring asd-file)) - `(:position 1) - `(:snippet ,(format nil "(defsystem :~A" dependency) - :align t)))))) - -(defslimefun operate-on-system-for-emacs (system-name operation &rest keywords) - "Compile and load SYSTEM using ASDF. -Record compiler notes signalled as `compiler-condition's." - (collect-notes - (lambda () - (apply #'operate-on-system system-name operation keywords)))) - -(defun operate-on-system (system-name operation-name &rest keyword-args) - "Perform OPERATION-NAME on SYSTEM-NAME using ASDF. -The KEYWORD-ARGS are passed on to the operation. -Example: -\(operate-on-system \"cl-ppcre\" 'compile-op :force t)" - (handler-case - (with-compilation-hooks () - (apply #'asdf:operate (asdf-operation operation-name) - system-name keyword-args) - t) - ((or asdf:compile-error #+asdf3 asdf/lisp-build:compile-file-error) - () nil))) - -(defun unique-string-list (&rest lists) - (sort (delete-duplicates (apply #'append lists) :test #'string=) #'string<)) - -(defslimefun list-all-systems-in-central-registry () - "Returns a list of all systems in ASDF's central registry -AND in its source-registry. (legacy name)" - (unique-string-list - (mapcar - #'pathname-name - (while-collecting (c) - (loop for dir in asdf:*central-registry* - for defaults = (eval dir) - when defaults - do (collect-asds-in-directory defaults #'c)) - (asdf:ensure-source-registry) - (if (or #+asdf3 t - #-asdf3 (asdf:version-satisfies (asdf:asdf-version) "2.15")) - (loop :for k :being :the :hash-keys :of asdf::*source-registry* - :do (c k)) - #-asdf3 - (dolist (entry (asdf::flatten-source-registry)) - (destructuring-bind (directory &key recurse exclude) entry - (register-asd-directory - directory - :recurse recurse :exclude exclude :collect #'c)))))))) - -(defslimefun list-all-systems-known-to-asdf () - "Returns a list of all systems ASDF knows already." - (while-collecting (c) - (asdf::map-systems (lambda (system) (c (asdf:component-name system)))))) - -(defslimefun list-asdf-systems () - "Returns the systems in ASDF's central registry and those which ASDF -already knows." - (unique-string-list - (list-all-systems-known-to-asdf) - (list-all-systems-in-central-registry))) - -(defun asdf-component-source-files (component) - (while-collecting (c) - (labels ((f (x) - (typecase x - (asdf:source-file (c (asdf:component-pathname x))) - (asdf:module (map () #'f (asdf:module-components x)))))) - (f component)))) - -(defun make-operation (x) - #+#.(swank/backend:with-symbol 'make-operation 'asdf) - (asdf:make-operation x) - #-#.(swank/backend:with-symbol 'make-operation 'asdf) - (make-instance x)) - -(defun asdf-component-output-files (component) - (while-collecting (c) - (labels ((f (x) - (typecase x - (asdf:source-file - (map () #'c - (asdf:output-files (make-operation 'asdf:compile-op) x))) - (asdf:module (map () #'f (asdf:module-components x)))))) - (f component)))) - -(defslimefun asdf-system-files (name) - (let* ((system (asdf:find-system name)) - (files (mapcar #'namestring - (cons - (asdf:system-definition-pathname system) - (asdf-component-source-files system)))) - (main-file (find name files - :test #'equalp :key #'pathname-name :start 1))) - (if main-file - (cons main-file (remove main-file files - :test #'equal :count 1)) - files))) - -(defslimefun asdf-system-loaded-p (name) - (component-loaded-p name)) - -(defslimefun asdf-system-directory (name) - (namestring (translate-logical-pathname (asdf:system-source-directory name)))) - -(defun pathname-system (pathname) - (let ((component (pathname-component pathname))) - (when component - (asdf:component-name (asdf:component-system component))))) - -(defslimefun asdf-determine-system (file buffer-package-name) - (or - (and file - (pathname-system file)) - (and file - (progn - ;; If not found, let's rebuild the table first - (recompute-pathname-component-table) - (pathname-system file))) - ;; If we couldn't find an already defined system, - ;; try finding a system that's named like BUFFER-PACKAGE-NAME. - (loop with package = (guess-buffer-package buffer-package-name) - for name in (package-names package) - for system = (asdf:find-system (asdf::coerce-name name) nil) - when (and system - (or (not file) - (pathname-system file))) - return (asdf:component-name system)))) - -(defslimefun delete-system-fasls (name) - (let ((removed-count - (loop for file in (asdf-component-output-files - (asdf:find-system name)) - when (probe-file file) - count it - and - do (delete-file file)))) - (format nil "~d file~:p ~:*~[were~;was~:;were~] removed" removed-count))) - -(defvar *recompile-system* nil) - -(defmethod asdf:operation-done-p :around - ((operation asdf:compile-op) - component) - (unless (eql *recompile-system* - (asdf:component-system component)) - (call-next-method))) - -(defslimefun reload-system (name) - (let ((*recompile-system* (asdf:find-system name))) - (operate-on-system-for-emacs name 'asdf:load-op))) - -;;; Hook for compile-file-for-emacs - -(defun try-compile-file-with-asdf (pathname load-p &rest options) - (declare (ignore options)) - (let ((component (pathname-component pathname))) - (when component - ;;(format t "~&Compiling ASDF component ~S~%" component) - (let ((op (make-operation 'asdf:compile-op))) - (with-compilation-hooks () - (asdf:perform op component)) - (when load-p - (asdf:perform (make-operation 'asdf:load-op) component)) - (values t t nil (first (asdf:output-files op component))))))) - -(defun try-compile-asd-file (pathname load-p &rest options) - (declare (ignore load-p options)) - (when (equalp (pathname-type pathname) "asd") - (load-asd pathname) - (values t t nil pathname))) - -(pushnew 'try-compile-asd-file *compile-file-for-emacs-hook*) - -;;; (pushnew 'try-compile-file-with-asdf *compile-file-for-emacs-hook*) - -(provide :swank-asdf) diff --git a/elpa/slime-20200414.1444/contrib/swank-buffer-streams.lisp b/elpa/slime-20200414.1444/contrib/swank-buffer-streams.lisp deleted file mode 100644 index 4d901e24..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-buffer-streams.lisp +++ /dev/null @@ -1,39 +0,0 @@ -;;; swank-buffer-streams.lisp --- Streams that output to a buffer -;;; -;;; Authors: Ed Langley -;;; -;;; License: This code has been placed in the Public Domain. All warranties -;;; are disclaimed. - -(in-package :swank) - -(defpackage :swank-buffer-streams - (:use :cl) - (:import-from :swank - defslimefun - add-hook - encode-message - send-event - find-thread - dcase - current-socket-io - send-to-emacs - current-thread-id - wait-for-event - - *emacs-connection* - *event-hook*) - (:export make-buffer-output-stream)) - -(in-package :swank-buffer-streams) - -(defun get-temporary-identifier () - (intern (symbol-name (gensym "BUFFER")) - :keyword)) - -(defun make-buffer-output-stream (&optional (target-identifier (get-temporary-identifier))) - (swank:ed-rpc '#:slime-make-buffer-stream-target (current-thread-id) target-identifier) - (values (swank:make-output-stream-for-target *emacs-connection* target-identifier) - target-identifier)) - -(provide :swank-buffer-streams) diff --git a/elpa/slime-20200414.1444/contrib/swank-c-p-c.lisp b/elpa/slime-20200414.1444/contrib/swank-c-p-c.lisp deleted file mode 100644 index 6a766fbd..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-c-p-c.lisp +++ /dev/null @@ -1,298 +0,0 @@ -;;; swank-c-p-c.lisp -- ILISP style Compound Prefix Completion -;; -;; Author: Luke Gorrie -;; Edi Weitz -;; Matthias Koeppe -;; Tobias C. Rittweiler -;; and others -;; -;; License: Public Domain -;; - - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-util)) - -(defslimefun completions (string default-package-name) - "Return a list of completions for a symbol designator STRING. - -The result is the list (COMPLETION-SET COMPLETED-PREFIX), where -COMPLETION-SET is the list of all matching completions, and -COMPLETED-PREFIX is the best (partial) completion of the input -string. - -Simple compound matching is supported on a per-hyphen basis: - - (completions \"m-v-\" \"COMMON-LISP\") - ==> ((\"multiple-value-bind\" \"multiple-value-call\" - \"multiple-value-list\" \"multiple-value-prog1\" - \"multiple-value-setq\" \"multiple-values-limit\") - \"multiple-value\") - -\(For more advanced compound matching, see FUZZY-COMPLETIONS.) - -If STRING is package qualified the result list will also be -qualified. If string is non-qualified the result strings are -also not qualified and are considered relative to -DEFAULT-PACKAGE-NAME. - -The way symbols are matched depends on the symbol designator's -format. The cases are as follows: - FOO - Symbols with matching prefix and accessible in the buffer package. - PKG:FOO - Symbols with matching prefix and external in package PKG. - PKG::FOO - Symbols with matching prefix and accessible in package PKG. -" - (multiple-value-bind (name package-name package internal-p) - (parse-completion-arguments string default-package-name) - (let* ((symbol-set (symbol-completion-set - name package-name package internal-p - (make-compound-prefix-matcher #\-))) - (package-set (package-completion-set - name package-name package internal-p - (make-compound-prefix-matcher '(#\. #\-)))) - (completion-set - (format-completion-set (nconc symbol-set package-set) - internal-p package-name))) - (when completion-set - (list completion-set (longest-compound-prefix completion-set)))))) - - -;;;;; Find completion set - -(defun symbol-completion-set (name package-name package internal-p matchp) - "Return the set of completion-candidates as strings." - (mapcar (completion-output-symbol-converter name) - (and package - (mapcar #'symbol-name - (find-matching-symbols name - package - (and (not internal-p) - package-name) - matchp))))) - -(defun package-completion-set (name package-name package internal-p matchp) - (declare (ignore package internal-p)) - (mapcar (completion-output-package-converter name) - (and (not package-name) - (find-matching-packages name matchp)))) - -(defun find-matching-symbols (string package external test) - "Return a list of symbols in PACKAGE matching STRING. -TEST is called with two strings. If EXTERNAL is true, only external -symbols are returned." - (let ((completions '()) - (converter (completion-output-symbol-converter string))) - (flet ((symbol-matches-p (symbol) - (and (or (not external) - (symbol-external-p symbol package)) - (funcall test string - (funcall converter (symbol-name symbol)))))) - (do-symbols* (symbol package) - (when (symbol-matches-p symbol) - (push symbol completions)))) - completions)) - -(defun find-matching-symbols-in-list (string list test) - "Return a list of symbols in LIST matching STRING. -TEST is called with two strings." - (let ((completions '()) - (converter (completion-output-symbol-converter string))) - (flet ((symbol-matches-p (symbol) - (funcall test string - (funcall converter (symbol-name symbol))))) - (dolist (symbol list) - (when (symbol-matches-p symbol) - (push symbol completions)))) - (remove-duplicates completions))) - -(defun find-matching-packages (name matcher) - "Return a list of package names matching NAME with MATCHER. -MATCHER is a two-argument predicate." - (let ((converter (completion-output-package-converter name))) - (remove-if-not (lambda (x) - (funcall matcher name (funcall converter x))) - (mapcar (lambda (pkgname) - (concatenate 'string pkgname ":")) - (loop for package in (list-all-packages) - nconcing (package-names package)))))) - - -;; PARSE-COMPLETION-ARGUMENTS return table: -;; -;; user behaviour | NAME | PACKAGE-NAME | PACKAGE -;; ----------------+--------+--------------+----------------------------------- -;; asdf [tab] | "asdf" | NIL | # -;; | | | or *BUFFER-PACKAGE* -;; asdf: [tab] | "" | "asdf" | # -;; | | | -;; asdf:foo [tab] | "foo" | "asdf" | # -;; | | | -;; as:fo [tab] | "fo" | "as" | NIL -;; | | | -;; : [tab] | "" | "" | # -;; | | | -;; :foo [tab] | "foo" | "" | # -;; -(defun parse-completion-arguments (string default-package-name) - "Parse STRING as a symbol designator. -Return these values: - SYMBOL-NAME - PACKAGE-NAME, or nil if the designator does not include an explicit package. - PACKAGE, generally the package to complete in. (However, if PACKAGE-NAME is - NIL, return the respective package of DEFAULT-PACKAGE-NAME instead; - if PACKAGE is non-NIL but a package cannot be found under that name, - return NIL.) - INTERNAL-P, if the symbol is qualified with `::'." - (multiple-value-bind (name package-name internal-p) - (tokenize-symbol string) - (flet ((default-package () - (or (guess-package default-package-name) *buffer-package*))) - (let ((package (cond - ((not package-name) - (default-package)) - ((equal package-name "") - (guess-package (symbol-name :keyword))) - ((find-locally-nicknamed-package - package-name (default-package))) - (t - (guess-package package-name))))) - (values name package-name package internal-p))))) - -(defun completion-output-case-converter (input &optional with-escaping-p) - "Return a function to convert strings for the completion output. -INPUT is used to guess the preferred case." - (ecase (readtable-case *readtable*) - (:upcase (cond ((or with-escaping-p - (and (plusp (length input)) - (not (some #'lower-case-p input)))) - #'identity) - (t #'string-downcase))) - (:invert (lambda (output) - (multiple-value-bind (lower upper) (determine-case output) - (cond ((and lower upper) output) - (lower (string-upcase output)) - (upper (string-downcase output)) - (t output))))) - (:downcase (cond ((or with-escaping-p - (and (zerop (length input)) - (not (some #'upper-case-p input)))) - #'identity) - (t #'string-upcase))) - (:preserve #'identity))) - -(defun completion-output-package-converter (input) - "Return a function to convert strings for the completion output. -INPUT is used to guess the preferred case." - (completion-output-case-converter input)) - -(defun completion-output-symbol-converter (input) - "Return a function to convert strings for the completion output. -INPUT is used to guess the preferred case. Escape symbols when needed." - (let ((case-converter (completion-output-case-converter input)) - (case-converter-with-escaping (completion-output-case-converter input t))) - (lambda (str) - (if (or (multiple-value-bind (lowercase uppercase) - (determine-case str) - ;; In these readtable cases, symbols with letters from - ;; the wrong case need escaping - (case (readtable-case *readtable*) - (:upcase lowercase) - (:downcase uppercase) - (t nil))) - (some (lambda (el) - (or (member el '(#\: #\Space #\Newline #\Tab)) - (multiple-value-bind (macrofun nonterminating) - (get-macro-character el) - (and macrofun - (not nonterminating))))) - str)) - (concatenate 'string "|" (funcall case-converter-with-escaping str) "|") - (funcall case-converter str))))) - - -(defun determine-case (string) - "Return two booleans LOWER and UPPER indicating whether STRING -contains lower or upper case characters." - (values (some #'lower-case-p string) - (some #'upper-case-p string))) - - -;;;;; Compound-prefix matching - -(defun make-compound-prefix-matcher (delimiter &key (test #'char=)) - "Returns a matching function that takes a `prefix' and a -`target' string and which returns T if `prefix' is a -compound-prefix of `target', and otherwise NIL. - -Viewing each of `prefix' and `target' as a series of substrings -delimited by DELIMITER, if each substring of `prefix' is a prefix -of the corresponding substring in `target' then we call `prefix' -a compound-prefix of `target'. - -DELIMITER may be a character, or a list of characters." - (let ((delimiters (etypecase delimiter - (character (list delimiter)) - (cons (assert (every #'characterp delimiter)) - delimiter)))) - (lambda (prefix target) - (declare (type simple-string prefix target)) - (loop with tpos = 0 - for ch across prefix - always (and (< tpos (length target)) - (let ((delimiter (car (member ch delimiters :test test)))) - (if delimiter - (setf tpos (position delimiter target :start tpos)) - (funcall test ch (aref target tpos))))) - do (incf tpos))))) - - -;;;;; Extending the input string by completion - -(defun longest-compound-prefix (completions &optional (delimiter #\-)) - "Return the longest compound _prefix_ for all COMPLETIONS." - (flet ((tokenizer (string) (tokenize-completion string delimiter))) - (untokenize-completion - (loop for token-list in (transpose-lists (mapcar #'tokenizer completions)) - if (notevery #'string= token-list (rest token-list)) - ;; Note that we possibly collect the "" here as well, so that - ;; UNTOKENIZE-COMPLETION will append a delimiter for us. - collect (longest-common-prefix token-list) - and do (loop-finish) - else collect (first token-list)) - delimiter))) - -(defun tokenize-completion (string delimiter) - "Return all substrings of STRING delimited by DELIMITER." - (loop with end - for start = 0 then (1+ end) - until (> start (length string)) - do (setq end (or (position delimiter string :start start) (length string))) - collect (subseq string start end))) - -(defun untokenize-completion (tokens &optional (delimiter #\-)) - (format nil (format nil "~~{~~A~~^~a~~}" delimiter) tokens)) - -(defun transpose-lists (lists) - "Turn a list-of-lists on its side. -If the rows are of unequal length, truncate uniformly to the shortest. - -For example: -\(transpose-lists '((ONE TWO THREE) (1 2))) - => ((ONE 1) (TWO 2))" - (cond ((null lists) '()) - ((some #'null lists) '()) - (t (cons (mapcar #'car lists) - (transpose-lists (mapcar #'cdr lists)))))) - - -;;;; Completion for character names - -(defslimefun completions-for-character (prefix) - (let* ((matcher (make-compound-prefix-matcher #\_ :test #'char-equal)) - (completion-set (character-completion-set prefix matcher)) - (completions (sort completion-set #'string<))) - (list completions (longest-compound-prefix completions #\_)))) - -(provide :swank-c-p-c) diff --git a/elpa/slime-20200414.1444/contrib/swank-clipboard.lisp b/elpa/slime-20200414.1444/contrib/swank-clipboard.lisp deleted file mode 100644 index 52b10858..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-clipboard.lisp +++ /dev/null @@ -1,71 +0,0 @@ -;;; swank-clipboard.lisp --- Object clipboard -;; -;; Written by Helmut Eller in 2008. -;; License: Public Domain - -(defpackage :swank-clipboard - (:use :cl) - (:import-from :swank :defslimefun :with-buffer-syntax :dcase) - (:export :add :delete-entry :entries :entry-to-ref :ref)) - -(in-package :swank-clipboard) - -(defstruct clipboard entries (counter 0)) - -(defvar *clipboard* (make-clipboard)) - -(defslimefun add (datum) - (let ((value (dcase datum - ((:string string package) - (with-buffer-syntax (package) - (eval (read-from-string string)))) - ((:inspector part) - (swank:inspector-nth-part part)) - ((:sldb frame var) - (swank/backend:frame-var-value frame var))))) - (clipboard-add value) - (format nil "Added: ~a" - (entry-to-string (1- (length (clipboard-entries *clipboard*))))))) - -(defslimefun entries () - (loop for (ref . value) in (clipboard-entries *clipboard*) - collect `(,ref . ,(to-line value)))) - -(defslimefun delete-entry (entry) - (let ((msg (format nil "Deleted: ~a" (entry-to-string entry)))) - (clipboard-delete-entry entry) - msg)) - -(defslimefun entry-to-ref (entry) - (destructuring-bind (ref . value) (clipboard-entry entry) - (list ref (to-line value 5)))) - -(defun clipboard-add (value) - (setf (clipboard-entries *clipboard*) - (append (clipboard-entries *clipboard*) - (list (cons (incf (clipboard-counter *clipboard*)) - value))))) - -(defun clipboard-ref (ref) - (let ((tail (member ref (clipboard-entries *clipboard*) :key #'car))) - (cond (tail (cdr (car tail))) - (t (error "Invalid clipboard ref: ~s" ref))))) - -(defun clipboard-entry (entry) - (elt (clipboard-entries *clipboard*) entry)) - -(defun clipboard-delete-entry (index) - (let* ((list (clipboard-entries *clipboard*)) - (tail (nthcdr index list))) - (setf (clipboard-entries *clipboard*) - (append (ldiff list tail) (cdr tail))))) - -(defun entry-to-string (entry) - (destructuring-bind (ref . value) (clipboard-entry entry) - (format nil "#@~d(~a)" ref (to-line value)))) - -(defun to-line (object &optional (width 75)) - (with-output-to-string (*standard-output*) - (write object :right-margin width :lines 1))) - -(provide :swank-clipboard) diff --git a/elpa/slime-20200414.1444/contrib/swank-fancy-inspector.lisp b/elpa/slime-20200414.1444/contrib/swank-fancy-inspector.lisp deleted file mode 100644 index c2201a81..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-fancy-inspector.lisp +++ /dev/null @@ -1,1006 +0,0 @@ -;;; swank-fancy-inspector.lisp --- Fancy inspector for CLOS objects -;; -;; Author: Marco Baringer and others -;; License: Public Domain -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-util)) - -(defmethod emacs-inspect ((symbol symbol)) - (let ((package (symbol-package symbol))) - (multiple-value-bind (_symbol status) - (and package (find-symbol (string symbol) package)) - (declare (ignore _symbol)) - (append - (label-value-line "Its name is" (symbol-name symbol)) - ;; - ;; Value - (cond ((boundp symbol) - (append - (label-value-line (if (constantp symbol) - "It is a constant of value" - "It is a global variable bound to") - (symbol-value symbol) :newline nil) - ;; unbinding constants might be not a good idea, but - ;; implementations usually provide a restart. - `(" " (:action "[unbind]" - ,(lambda () (makunbound symbol)))) - '((:newline)))) - (t '("It is unbound." (:newline)))) - (docstring-ispec "Documentation" symbol 'variable) - (multiple-value-bind (expansion definedp) (macroexpand symbol) - (if definedp - (label-value-line "It is a symbol macro with expansion" - expansion))) - ;; - ;; Function - (if (fboundp symbol) - (append (if (macro-function symbol) - `("It a macro with macro-function: " - (:value ,(macro-function symbol))) - `("It is a function: " - (:value ,(symbol-function symbol)))) - `(" " (:action "[unbind]" - ,(lambda () (fmakunbound symbol)))) - `((:newline))) - `("It has no function value." (:newline))) - (docstring-ispec "Function documentation" symbol 'function) - (when (compiler-macro-function symbol) - (append - (label-value-line "It also names the compiler macro" - (compiler-macro-function symbol) :newline nil) - `(" " (:action "[remove]" - ,(lambda () - (setf (compiler-macro-function symbol) nil))) - (:newline)))) - (docstring-ispec "Compiler macro documentation" - symbol 'compiler-macro) - ;; - ;; Package - (if package - `("It is " ,(string-downcase (string status)) - " to the package: " - (:value ,package ,(package-name package)) - ,@(if (eq :internal status) - `(" " - (:action "[export]" - ,(lambda () (export symbol package))))) - " " - (:action "[unintern]" - ,(lambda () (unintern symbol package))) - (:newline)) - '("It is a non-interned symbol." (:newline))) - ;; - ;; Plist - (label-value-line "Property list" (symbol-plist symbol)) - ;; - ;; Class - (if (find-class symbol nil) - `("It names the class " - (:value ,(find-class symbol) ,(string symbol)) - " " - (:action "[remove]" - ,(lambda () (setf (find-class symbol) nil))) - (:newline))) - ;; - ;; More package - (if (find-package symbol) - (label-value-line "It names the package" (find-package symbol))) - (inspect-type-specifier symbol))))) - -#-sbcl -(defun inspect-type-specifier (symbol) - (declare (ignore symbol))) - -#+sbcl -(defun inspect-type-specifier (symbol) - (let* ((kind (sb-int:info :type :kind symbol)) - (fun (case kind - (:defined - (or (sb-int:info :type :expander symbol) t)) - (:primitive - (or #.(if (swank/sbcl::sbcl-version>= 1 3 1) - '(let ((x (sb-int:info :type :expander symbol))) - (if (consp x) - (car x) - x)) - '(sb-int:info :type :translator symbol)) - t))))) - (when fun - (append - (list - (format nil "It names a ~@[primitive~* ~]type-specifier." - (eq kind :primitive)) - '(:newline)) - (docstring-ispec "Type-specifier documentation" symbol 'type) - (unless (eq t fun) - (let ((arglist (arglist fun))) - (append - `("Type-specifier lambda-list: " - ;; Could use ~:s, but inspector-princ does a bit more, - ;; and not all NILs in the arglist should be printed that way. - ,(if arglist - (inspector-princ arglist) - "()") - (:newline)) - (multiple-value-bind (expansion ok) - (handler-case (sb-ext:typexpand-1 symbol) - (error () (values nil nil))) - (when ok - (list "Type-specifier expansion: " - (princ-to-string expansion))))))))))) - -(defun docstring-ispec (label object kind) - "Return a inspector spec if OBJECT has a docstring of kind KIND." - (let ((docstring (documentation object kind))) - (cond ((not docstring) nil) - ((< (+ (length label) (length docstring)) - 75) - (list label ": " docstring '(:newline))) - (t - (list label ":" '(:newline) " " docstring '(:newline)))))) - -(unless (find-method #'emacs-inspect '() (list (find-class 'function)) nil) - (defmethod emacs-inspect ((f function)) - (inspect-function f))) - -(defun inspect-function (f) - (append - (label-value-line "Name" (function-name f)) - `("Its argument list is: " - ,(inspector-princ (arglist f)) (:newline)) - (docstring-ispec "Documentation" f t) - (if (function-lambda-expression f) - (label-value-line "Lambda Expression" - (function-lambda-expression f))))) - -(defun method-specializers-for-inspect (method) - "Return a \"pretty\" list of the method's specializers. Normal - specializers are replaced by the name of the class, eql - specializers are replaced by `(eql ,object)." - (mapcar (lambda (spec) - (typecase spec - (swank-mop:eql-specializer - `(eql ,(swank-mop:eql-specializer-object spec))) - #-sbcl - (t - (swank-mop:class-name spec)) - #+sbcl - (t - ;; SBCL has extended specializers - (let ((gf (sb-mop:method-generic-function method))) - (cond (gf - (sb-pcl:unparse-specializer-using-class gf spec)) - ((typep spec 'class) - (class-name spec)) - (t - spec)))))) - (swank-mop:method-specializers method))) - -(defun method-for-inspect-value (method) - "Returns a \"pretty\" list describing METHOD. The first element - of the list is the name of generic-function method is - specialiazed on, the second element is the method qualifiers, - the rest of the list is the method's specialiazers (as per - method-specializers-for-inspect)." - (append (list (swank-mop:generic-function-name - (swank-mop:method-generic-function method))) - (swank-mop:method-qualifiers method) - (method-specializers-for-inspect method))) - -(defmethod emacs-inspect ((object standard-object)) - (let ((class (class-of object))) - `("Class: " (:value ,class) (:newline) - ,@(all-slots-for-inspector object)))) - -(defvar *gf-method-getter* 'methods-by-applicability - "This function is called to get the methods of a generic function. -The default returns the method sorted by applicability. -See `methods-by-applicability'.") - -(defun specializer< (specializer1 specializer2) - "Return true if SPECIALIZER1 is more specific than SPECIALIZER2." - (let ((s1 specializer1) (s2 specializer2) ) - (cond ((typep s1 'swank-mop:eql-specializer) - (not (typep s2 'swank-mop:eql-specializer))) - ((typep s1 'class) - (flet ((cpl (class) - (and (swank-mop:class-finalized-p class) - (swank-mop:class-precedence-list class)))) - (member s2 (cpl s1))))))) - -(defun methods-by-applicability (gf) - "Return methods ordered by most specific argument types. - -`method-specializer<' is used for sorting." - ;; FIXME: argument-precedence-order and qualifiers are ignored. - (labels ((method< (meth1 meth2) - (loop for s1 in (swank-mop:method-specializers meth1) - for s2 in (swank-mop:method-specializers meth2) - do (cond ((specializer< s2 s1) (return nil)) - ((specializer< s1 s2) (return t)))))) - (stable-sort (copy-seq (swank-mop:generic-function-methods gf)) - #'method<))) - -(defun abbrev-doc (doc &optional (maxlen 80)) - "Return the first sentence of DOC, but not more than MAXLAN characters." - (subseq doc 0 (min (1+ (or (position #\. doc) (1- maxlen))) - maxlen - (length doc)))) - -(defstruct (inspector-checklist (:conc-name checklist.) - (:constructor %make-checklist (buttons))) - (buttons nil :type (or null simple-vector)) - (count 0)) - -(defun make-checklist (n) - (%make-checklist (make-array n :initial-element nil))) - -(defun reinitialize-checklist (checklist) - ;; Along this counter the buttons are created, so we have to - ;; initialize it to 0 everytime the inspector page is redisplayed. - (setf (checklist.count checklist) 0) - checklist) - -(defun make-checklist-button (checklist) - (let ((buttons (checklist.buttons checklist)) - (i (checklist.count checklist))) - (incf (checklist.count checklist)) - `(:action ,(if (svref buttons i) - "[X]" - "[ ]") - ,#'(lambda () - (setf (svref buttons i) (not (svref buttons i)))) - :refreshp t))) - -(defmacro do-checklist ((idx checklist) &body body) - "Iterate over all set buttons in CHECKLIST." - (let ((buttons (gensym "buttons"))) - `(let ((,buttons (checklist.buttons ,checklist))) - (dotimes (,idx (length ,buttons)) - (when (svref ,buttons ,idx) - ,@body))))) - -(defun box (thing) (cons :box thing)) -(defun ref (box) - (assert (eq (car box) :box)) - (cdr box)) -(defun (setf ref) (value box) - (assert (eq (car box) :box)) - (setf (cdr box) value)) - -(defvar *inspector-slots-default-order* :alphabetically - "Accepted values: :alphabetically and :unsorted") - -(defvar *inspector-slots-default-grouping* :all - "Accepted values: :inheritance and :all") - -(defgeneric all-slots-for-inspector (object)) - -(defmethod all-slots-for-inspector ((object standard-object)) - (let* ((class (class-of object)) - (direct-slots (swank-mop:class-direct-slots class)) - (effective-slots (swank-mop:class-slots class)) - (longest-slot-name-length - (loop for slot :in effective-slots - maximize (length (symbol-name - (swank-mop:slot-definition-name slot))))) - (checklist - (reinitialize-checklist - (ensure-istate-metadata object :checklist - (make-checklist (length effective-slots))))) - (grouping-kind - ;; We box the value so we can re-set it. - (ensure-istate-metadata object :grouping-kind - (box *inspector-slots-default-grouping*))) - (sort-order - (ensure-istate-metadata object :sort-order - (box *inspector-slots-default-order*))) - (sort-predicate (ecase (ref sort-order) - (:alphabetically #'string<) - (:unsorted (constantly nil)))) - (sorted-slots (sort (copy-seq effective-slots) - sort-predicate - :key #'swank-mop:slot-definition-name)) - (effective-slots - (ecase (ref grouping-kind) - (:all sorted-slots) - (:inheritance (stable-sort-by-inheritance sorted-slots - class sort-predicate))))) - `("--------------------" - (:newline) - " Group slots by inheritance " - (:action ,(ecase (ref grouping-kind) - (:all "[ ]") - (:inheritance "[X]")) - ,(lambda () - ;; We have to do this as the order of slots will - ;; be sorted differently. - (fill (checklist.buttons checklist) nil) - (setf (ref grouping-kind) - (ecase (ref grouping-kind) - (:all :inheritance) - (:inheritance :all)))) - :refreshp t) - (:newline) - " Sort slots alphabetically " - (:action ,(ecase (ref sort-order) - (:unsorted "[ ]") - (:alphabetically "[X]")) - ,(lambda () - (fill (checklist.buttons checklist) nil) - (setf (ref sort-order) - (ecase (ref sort-order) - (:unsorted :alphabetically) - (:alphabetically :unsorted)))) - :refreshp t) - (:newline) - ,@ (case (ref grouping-kind) - (:all - `((:newline) - "All Slots:" - (:newline) - ,@(make-slot-listing checklist object class - effective-slots direct-slots - longest-slot-name-length))) - (:inheritance - (list-all-slots-by-inheritance checklist object class - effective-slots direct-slots - longest-slot-name-length))) - (:newline) - (:action "[set value]" - ,(lambda () - (do-checklist (idx checklist) - (query-and-set-slot class object - (nth idx effective-slots)))) - :refreshp t) - " " - (:action "[make unbound]" - ,(lambda () - (do-checklist (idx checklist) - (swank-mop:slot-makunbound-using-class - class object (nth idx effective-slots)))) - :refreshp t) - (:newline)))) - -(defun list-all-slots-by-inheritance (checklist object class effective-slots - direct-slots longest-slot-name-length) - (flet ((slot-home-class (slot) - (slot-home-class-using-class slot class))) - (let ((current-slots '())) - (append - (loop for slot in effective-slots - for previous-home-class = (slot-home-class slot) then home-class - for home-class = previous-home-class then (slot-home-class slot) - if (eq home-class previous-home-class) - do (push slot current-slots) - else - collect '(:newline) - and collect (format nil "~A:" (class-name previous-home-class)) - and collect '(:newline) - and append (make-slot-listing checklist object class - (nreverse current-slots) - direct-slots - longest-slot-name-length) - and do (setf current-slots (list slot))) - (and current-slots - `((:newline) - ,(format nil "~A:" - (class-name (slot-home-class-using-class - (car current-slots) class))) - (:newline) - ,@(make-slot-listing checklist object class - (nreverse current-slots) direct-slots - longest-slot-name-length))))))) - -(defun make-slot-listing (checklist object class effective-slots direct-slots - longest-slot-name-length) - (flet ((padding-for (slot-name) - (make-string (- longest-slot-name-length (length slot-name)) - :initial-element #\Space))) - (loop - for effective-slot :in effective-slots - for direct-slot = (find (swank-mop:slot-definition-name effective-slot) - direct-slots - :key #'swank-mop:slot-definition-name) - for slot-name = (inspector-princ - (swank-mop:slot-definition-name effective-slot)) - collect (make-checklist-button checklist) - collect " " - collect `(:value ,(if direct-slot - (list direct-slot effective-slot) - effective-slot) - ,slot-name) - collect (padding-for slot-name) - collect " = " - collect (slot-value-for-inspector class object effective-slot) - collect '(:newline)))) - -(defgeneric slot-value-for-inspector (class object slot) - (:method (class object slot) - (let ((boundp (swank-mop:slot-boundp-using-class class object slot))) - (if boundp - `(:value ,(swank-mop:slot-value-using-class class object slot)) - "#")))) - -(defun slot-home-class-using-class (slot class) - (let ((slot-name (swank-mop:slot-definition-name slot))) - (loop for class in (reverse (swank-mop:class-precedence-list class)) - thereis (and (member slot-name (swank-mop:class-direct-slots class) - :key #'swank-mop:slot-definition-name - :test #'eq) - class)))) - -(defun stable-sort-by-inheritance (slots class predicate) - (stable-sort slots predicate - :key #'(lambda (s) - (class-name (slot-home-class-using-class s class))))) - -(defun query-and-set-slot (class object slot) - (let* ((slot-name (swank-mop:slot-definition-name slot)) - (value-string (read-from-minibuffer-in-emacs - (format nil "Set slot ~S to (evaluated) : " - slot-name)))) - (when (and value-string (not (string= value-string ""))) - (with-simple-restart (abort "Abort setting slot ~S" slot-name) - (setf (swank-mop:slot-value-using-class class object slot) - (eval (read-from-string value-string))))))) - - -(defmethod emacs-inspect ((gf standard-generic-function)) - (flet ((lv (label value) (label-value-line label value))) - (append - (lv "Name" (swank-mop:generic-function-name gf)) - (lv "Arguments" (swank-mop:generic-function-lambda-list gf)) - (docstring-ispec "Documentation" gf t) - (lv "Method class" (swank-mop:generic-function-method-class gf)) - (lv "Method combination" - (swank-mop:generic-function-method-combination gf)) - `("Methods: " (:newline)) - (loop for method in (funcall *gf-method-getter* gf) append - `((:value ,method ,(inspector-princ - ;; drop the name of the GF - (cdr (method-for-inspect-value method)))) - " " - (:action "[remove method]" - ,(let ((m method)) ; LOOP reassigns method - (lambda () - (remove-method gf m)))) - (:newline))) - `((:newline)) - (all-slots-for-inspector gf)))) - -(defmethod emacs-inspect ((method standard-method)) - `(,@(if (swank-mop:method-generic-function method) - `("Method defined on the generic function " - (:value ,(swank-mop:method-generic-function method) - ,(inspector-princ - (swank-mop:generic-function-name - (swank-mop:method-generic-function method))))) - '("Method without a generic function")) - (:newline) - ,@(docstring-ispec "Documentation" method t) - "Lambda List: " (:value ,(swank-mop:method-lambda-list method)) - (:newline) - "Specializers: " (:value ,(swank-mop:method-specializers method) - ,(inspector-princ - (method-specializers-for-inspect method))) - (:newline) - "Qualifiers: " (:value ,(swank-mop:method-qualifiers method)) - (:newline) - "Method function: " (:value ,(swank-mop:method-function method)) - (:newline) - ,@(all-slots-for-inspector method))) - -(defun specializer-direct-methods (class) - (sort (copy-seq (swank-mop:specializer-direct-methods class)) - #'string< - :key - (lambda (x) - (symbol-name - (let ((name (swank-mop::generic-function-name - (swank-mop::method-generic-function x)))) - (if (symbolp name) - name - (second name))))))) - -(defmethod emacs-inspect ((class standard-class)) - `("Name: " - (:value ,(class-name class)) - (:newline) - "Super classes: " - ,@(common-seperated-spec (swank-mop:class-direct-superclasses class)) - (:newline) - "Direct Slots: " - ,@(common-seperated-spec - (swank-mop:class-direct-slots class) - (lambda (slot) - `(:value ,slot ,(inspector-princ - (swank-mop:slot-definition-name slot))))) - (:newline) - "Effective Slots: " - ,@(if (swank-mop:class-finalized-p class) - (common-seperated-spec - (swank-mop:class-slots class) - (lambda (slot) - `(:value ,slot ,(inspector-princ - (swank-mop:slot-definition-name slot))))) - `("# " - (:action "[finalize]" - ,(lambda () (swank-mop:finalize-inheritance class))))) - (:newline) - ,@(let ((doc (documentation class t))) - (when doc - `("Documentation:" (:newline) ,(inspector-princ doc) (:newline)))) - "Sub classes: " - ,@(common-seperated-spec (swank-mop:class-direct-subclasses class) - (lambda (sub) - `(:value ,sub - ,(inspector-princ (class-name sub))))) - (:newline) - "Precedence List: " - ,@(if (swank-mop:class-finalized-p class) - (common-seperated-spec - (swank-mop:class-precedence-list class) - (lambda (class) - `(:value ,class ,(inspector-princ (class-name class))))) - '("#")) - (:newline) - ,@(when (swank-mop:specializer-direct-methods class) - `("It is used as a direct specializer in the following methods:" - (:newline) - ,@(loop - for method in (specializer-direct-methods class) - collect " " - collect `(:value ,method - ,(inspector-princ - (method-for-inspect-value method))) - collect '(:newline) - if (documentation method t) - collect " Documentation: " and - collect (abbrev-doc (documentation method t)) and - collect '(:newline)))) - "Prototype: " ,(if (swank-mop:class-finalized-p class) - `(:value ,(swank-mop:class-prototype class)) - '"#") - (:newline) - ,@(all-slots-for-inspector class))) - -(defmethod emacs-inspect ((slot swank-mop:standard-slot-definition)) - `("Name: " - (:value ,(swank-mop:slot-definition-name slot)) - (:newline) - ,@(when (swank-mop:slot-definition-documentation slot) - `("Documentation:" (:newline) - (:value ,(swank-mop:slot-definition-documentation - slot)) - (:newline))) - "Init args: " - (:value ,(swank-mop:slot-definition-initargs slot)) - (:newline) - "Init form: " - ,(if (swank-mop:slot-definition-initfunction slot) - `(:value ,(swank-mop:slot-definition-initform slot)) - "#") - (:newline) - "Init function: " - (:value ,(swank-mop:slot-definition-initfunction slot)) - (:newline) - ,@(all-slots-for-inspector slot))) - - -;; Wrapper structure over the list of symbols of a package that should -;; be displayed with their respective classification flags. This is -;; because we need a unique type to dispatch on in EMACS-INSPECT. -;; Used by the Inspector for packages. -(defstruct (%package-symbols-container - (:conc-name %container.) - (:constructor %%make-package-symbols-container)) - title ;; A string; the title of the inspector page in Emacs. - description ;; A list of renderable objects; used as description. - symbols ;; A list of symbols. Supposed to be sorted alphabetically. - grouping-kind) ;; Either :SYMBOL or :CLASSIFICATION. Cf. MAKE-SYMBOLS-LISTING - - -(defun %make-package-symbols-container (&key title description symbols) - (%%make-package-symbols-container :title title :description description - :symbols symbols :grouping-kind :symbol)) - -(defgeneric make-symbols-listing (grouping-kind symbols)) - -(defmethod make-symbols-listing ((grouping-kind (eql :symbol)) symbols) - "Returns an object renderable by Emacs' inspector side that -alphabetically lists all the symbols in SYMBOLS together with a -concise string representation of what each symbol -represents (see SYMBOL-CLASSIFICATION-STRING)" - (let ((max-length (loop for s in symbols - maximizing (length (symbol-name s)))) - (distance 10)) ; empty distance between name and classification - (flet ((string-representations (symbol) - (let* ((name (symbol-name symbol)) - (length (length name)) - (padding (- max-length length))) - (values - (concatenate 'string - name - (make-string (+ padding distance) - :initial-element #\Space)) - (symbol-classification-string symbol))))) - `("" ; 8 is (length "Symbols:") - "Symbols:" ,(make-string (+ -8 max-length distance) - :initial-element #\Space) - "Flags:" - (:newline) - ,(concatenate 'string ; underlining dashes - (make-string (+ max-length distance -1) - :initial-element #\-) - " " - (symbol-classification-string '#:foo)) - (:newline) - ,@(loop for symbol in symbols appending - (multiple-value-bind (symbol-string classification-string) - (string-representations symbol) - `((:value ,symbol ,symbol-string) ,classification-string - (:newline) - ))))))) - -(defmethod make-symbols-listing ((grouping-kind (eql :classification)) symbols) - "For each possible classification (cf. CLASSIFY-SYMBOL), group -all the symbols in SYMBOLS to all of their respective -classifications. (If a symbol is, for instance, boundp and a -generic-function, it'll appear both below the BOUNDP group and -the GENERIC-FUNCTION group.) As macros and special-operators are -specified to be FBOUNDP, there is no general FBOUNDP group, -instead there are the three explicit FUNCTION, MACRO and -SPECIAL-OPERATOR groups." - (let ((table (make-hash-table :test #'eq)) - (+default-classification+ :misc)) - (flet ((normalize-classifications (classifications) - (cond ((null classifications) `(,+default-classification+)) - ;; Convert an :FBOUNDP in CLASSIFICATIONS to - ;; :FUNCTION if possible. - ((and (member :fboundp classifications) - (not (member :macro classifications)) - (not (member :special-operator classifications))) - (substitute :function :fboundp classifications)) - (t (remove :fboundp classifications))))) - (loop for symbol in symbols do - (loop for classification in - (normalize-classifications (classify-symbol symbol)) - ;; SYMBOLS are supposed to be sorted alphabetically; - ;; this property is preserved here except for reversing. - do (push symbol (gethash classification table))))) - (let* ((classifications (loop for k being each hash-key in table - collect k)) - (classifications (sort classifications - ;; Sort alphabetically, except - ;; +DEFAULT-CLASSIFICATION+ which - ;; sort to the end. - (lambda (a b) - (cond ((eql a +default-classification+) - nil) - ((eql b +default-classification+) - t) - (t (string< a b))))))) - (loop for classification in classifications - for symbols = (gethash classification table) - appending`(,(symbol-name classification) - (:newline) - ,(make-string 64 :initial-element #\-) - (:newline) - ,@(mapcan (lambda (symbol) - `((:value ,symbol ,(symbol-name symbol)) - (:newline))) - ;; restore alphabetic order. - (nreverse symbols)) - (:newline)))))) - -(defmethod emacs-inspect ((%container %package-symbols-container)) - (with-struct (%container. title description symbols grouping-kind) %container - `(,title (:newline) (:newline) - ,@description - (:newline) - " " ,(ecase grouping-kind - (:symbol - `(:action "[Group by classification]" - ,(lambda () - (setf grouping-kind :classification)) - :refreshp t)) - (:classification - `(:action "[Group by symbol]" - ,(lambda () (setf grouping-kind :symbol)) - :refreshp t))) - (:newline) (:newline) - ,@(make-symbols-listing grouping-kind symbols)))) - -(defun display-link (type symbols length &key title description) - (if (null symbols) - (format nil "0 ~A symbols." type) - `(:value ,(%make-package-symbols-container :title title - :description description - :symbols symbols) - ,(format nil "~D ~A symbol~P." length type length)))) - -(defmethod emacs-inspect ((package package)) - (let ((package-name (package-name package)) - (package-nicknames (package-nicknames package)) - (package-use-list (package-use-list package)) - (package-used-by-list (package-used-by-list package)) - (shadowed-symbols (package-shadowing-symbols package)) - (present-symbols '()) (present-symbols-length 0) - (internal-symbols '()) (internal-symbols-length 0) - (inherited-symbols '()) (inherited-symbols-length 0) - (external-symbols '()) (external-symbols-length 0)) - - (do-symbols* (sym package) - (let ((status (symbol-status sym package))) - (when (eq status :inherited) - (push sym inherited-symbols) (incf inherited-symbols-length) - (go :continue)) - (push sym present-symbols) (incf present-symbols-length) - (cond ((eq status :internal) - (push sym internal-symbols) (incf internal-symbols-length)) - (t - (push sym external-symbols) (incf external-symbols-length)))) - :continue) - - (setf package-nicknames (sort (copy-list package-nicknames) - #'string<) - package-use-list (sort (copy-list package-use-list) - #'string< :key #'package-name) - package-used-by-list (sort (copy-list package-used-by-list) - #'string< :key #'package-name) - shadowed-symbols (sort (copy-list shadowed-symbols) - #'string<)) - ;;; SORT + STRING-LESSP conses on at least SBCL 0.9.18. - (setf present-symbols (sort present-symbols #'string<) - internal-symbols (sort internal-symbols #'string<) - external-symbols (sort external-symbols #'string<) - inherited-symbols (sort inherited-symbols #'string<)) - `("" ;; dummy to preserve indentation. - "Name: " (:value ,package-name) (:newline) - - "Nick names: " ,@(common-seperated-spec package-nicknames) (:newline) - - ,@(when (documentation package t) - `("Documentation:" (:newline) - ,(documentation package t) (:newline))) - - "Use list: " ,@(common-seperated-spec - package-use-list - (lambda (package) - `(:value ,package ,(package-name package)))) - (:newline) - - "Used by list: " ,@(common-seperated-spec - package-used-by-list - (lambda (package) - `(:value ,package ,(package-name package)))) - (:newline) - - ,(display-link "present" present-symbols present-symbols-length - :title - (format nil "All present symbols of package \"~A\"" - package-name) - :description - '("A symbol is considered present in a package if it's" - (:newline) - "\"accessible in that package directly, rather than" - (:newline) - "being inherited from another package.\"" - (:newline) - "(CLHS glossary entry for `present')" - (:newline))) - - (:newline) - ,(display-link "external" external-symbols external-symbols-length - :title - (format nil "All external symbols of package \"~A\"" - package-name) - :description - '("A symbol is considered external of a package if it's" - (:newline) - "\"part of the `external interface' to the package and" - (:newline) - "[is] inherited by any other package that uses the" - (:newline) - "package.\" (CLHS glossary entry of `external')" - (:newline))) - (:newline) - ,(display-link "internal" internal-symbols internal-symbols-length - :title - (format nil "All internal symbols of package \"~A\"" - package-name) - :description - '("A symbol is considered internal of a package if it's" - (:newline) - "present and not external---that is if the package is" - (:newline) - "the home package of the symbol, or if the symbol has" - (:newline) - "been explicitly imported into the package." - (:newline) - (:newline) - "Notice that inherited symbols will thus not be listed," - (:newline) - "which deliberately deviates from the CLHS glossary" - (:newline) - "entry of `internal' because it's assumed to be more" - (:newline) - "useful this way." - (:newline))) - (:newline) - ,(display-link "inherited" inherited-symbols inherited-symbols-length - :title - (format nil "All inherited symbols of package \"~A\"" - package-name) - :description - '("A symbol is considered inherited in a package if it" - (:newline) - "was made accessible via USE-PACKAGE." - (:newline))) - (:newline) - ,(display-link "shadowed" shadowed-symbols (length shadowed-symbols) - :title - (format nil "All shadowed symbols of package \"~A\"" - package-name) - :description nil)))) - - -(defmethod emacs-inspect ((pathname pathname)) - `(,(if (wild-pathname-p pathname) - "A wild pathname." - "A pathname.") - (:newline) - ,@(label-value-line* - ("Namestring" (namestring pathname)) - ("Host" (pathname-host pathname)) - ("Device" (pathname-device pathname)) - ("Directory" (pathname-directory pathname)) - ("Name" (pathname-name pathname)) - ("Type" (pathname-type pathname)) - ("Version" (pathname-version pathname))) - ,@ (unless (or (wild-pathname-p pathname) - (not (probe-file pathname))) - (label-value-line "Truename" (truename pathname))))) - -(defmethod emacs-inspect ((pathname logical-pathname)) - (append - (label-value-line* - ("Namestring" (namestring pathname)) - ("Physical pathname: " (translate-logical-pathname pathname))) - `("Host: " - (:value ,(pathname-host pathname)) - " (" - (:value ,(logical-pathname-translations - (pathname-host pathname))) - " other translations)" - (:newline)) - (label-value-line* - ("Directory" (pathname-directory pathname)) - ("Name" (pathname-name pathname)) - ("Type" (pathname-type pathname)) - ("Version" (pathname-version pathname)) - ("Truename" (if (not (wild-pathname-p pathname)) - (probe-file pathname)))))) - -(defmethod emacs-inspect ((n number)) - `("Value: " ,(princ-to-string n))) - -(defun format-iso8601-time (time-value &optional include-timezone-p) - "Formats a universal time TIME-VALUE in ISO 8601 format, with - the time zone included if INCLUDE-TIMEZONE-P is non-NIL" - ;; Taken from http://www.pvv.ntnu.no/~nsaa/ISO8601.html - ;; Thanks, Nikolai Sandved and Thomas Russ! - (flet ((format-iso8601-timezone (zone) - (if (zerop zone) - "Z" - (multiple-value-bind (h m) (truncate (abs zone) 1.0) - ;; Tricky. Sign of time zone is reversed in ISO 8601 - ;; relative to Common Lisp convention! - (format nil "~:[+~;-~]~2,'0D:~2,'0D" - (> zone 0) h (round (* 60 m))))))) - (multiple-value-bind (second minute hour day month year dow dst zone) - (decode-universal-time time-value) - (declare (ignore dow)) - (format nil "~4,'0D-~2,'0D-~2,'0DT~2,'0D:~2,'0D:~2,'0D~:[~*~;~A~]" - year month day hour minute second - include-timezone-p (format-iso8601-timezone (if dst - (+ zone 1) - zone)))))) - -(defmethod emacs-inspect ((i integer)) - (append - `(,(format nil "Value: ~D = #x~8,'0X = #o~O = #b~,,' ,8:B~@[ = ~E~]" - i i i i (ignore-errors (coerce i 'float))) - (:newline)) - (when (< -1 i char-code-limit) - (label-value-line "Code-char" (code-char i))) - (label-value-line "Integer-length" (integer-length i)) - (ignore-errors - (label-value-line "Universal-time" (format-iso8601-time i t))))) - -(defmethod emacs-inspect ((c complex)) - (label-value-line* - ("Real part" (realpart c)) - ("Imaginary part" (imagpart c)))) - -(defmethod emacs-inspect ((r ratio)) - (label-value-line* - ("Numerator" (numerator r)) - ("Denominator" (denominator r)) - ("As float" (float r)))) - -(defmethod emacs-inspect ((f float)) - (cond - ((float-nan-p f) - ;; try NaN first because the next tests may perform operations - ;; that are undefined for NaNs. - (list "Not a Number.")) - ((not (float-infinity-p f)) - (multiple-value-bind (significand exponent sign) (decode-float f) - (append - `("Scientific: " ,(format nil "~E" f) (:newline) - "Decoded: " - (:value ,sign) " * " - (:value ,significand) " * " - (:value ,(float-radix f)) "^" - (:value ,exponent) (:newline)) - (label-value-line "Digits" (float-digits f)) - (label-value-line "Precision" (float-precision f))))) - ((> f 0) - (list "Positive infinity.")) - ((< f 0) - (list "Negative infinity.")))) - -(defun make-pathname-ispec (pathname position) - `("Pathname: " - (:value ,pathname) - (:newline) " " - ,@(when position - `((:action "[visit file and show current position]" - ,(lambda () - (ed-in-emacs `(,pathname :position ,position :bytep t))) - :refreshp nil) - (:newline))))) - -(defun make-file-stream-ispec (stream) - ;; SBCL's socket stream are file-stream but are not associated to - ;; any pathname. - (let ((pathname (ignore-errors (pathname stream)))) - (when pathname - (make-pathname-ispec pathname (and (open-stream-p stream) - (file-position stream)))))) - -(defmethod emacs-inspect ((stream file-stream)) - (multiple-value-bind (content) - (call-next-method) - (append (make-file-stream-ispec stream) content))) - -(defmethod emacs-inspect ((condition stream-error)) - (multiple-value-bind (content) - (call-next-method) - (let ((stream (stream-error-stream condition))) - (append (when (typep stream 'file-stream) - (make-file-stream-ispec stream)) - content)))) - -(defun common-seperated-spec (list &optional (callback (lambda (v) - `(:value ,v)))) - (butlast - (loop - for i in list - collect (funcall callback i) - collect ", "))) - -(defun inspector-princ (list) - "Like princ-to-string, but don't rewrite (function foo) as #'foo. -Do NOT pass circular lists to this function." - (let ((*print-pprint-dispatch* (copy-pprint-dispatch))) - (set-pprint-dispatch '(cons (member function)) nil) - (princ-to-string list))) - -(provide :swank-fancy-inspector) diff --git a/elpa/slime-20200414.1444/contrib/swank-fuzzy.lisp b/elpa/slime-20200414.1444/contrib/swank-fuzzy.lisp deleted file mode 100644 index bfd274fe..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-fuzzy.lisp +++ /dev/null @@ -1,706 +0,0 @@ -;;; swank-fuzzy.lisp --- fuzzy symbol completion -;; -;; Authors: Brian Downing -;; Tobias C. Rittweiler -;; and others -;; -;; License: Public Domain -;; - - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-util) - (swank-require :swank-c-p-c)) - -(defvar *fuzzy-duplicate-symbol-filter* :nearest-package - "Specifies how fuzzy-matching handles \"duplicate\" symbols. -Possible values are :NEAREST-PACKAGE, :HOME-PACKAGE, :ALL, or a custom -function. See Fuzzy Completion in the manual for details.") - -(export '*fuzzy-duplicate-symbol-filter*) - -;;; For nomenclature of the fuzzy completion section, please read -;;; through the following docstring. - -(defslimefun fuzzy-completions (string default-package-name - &key limit time-limit-in-msec) -"Returns a list of two values: - - An (optionally limited to LIMIT best results) list of fuzzy - completions for a symbol designator STRING. The list will be - sorted by score, most likely match first. - - A flag that indicates whether or not TIME-LIMIT-IN-MSEC has - been exhausted during computation. If that parameter's value is - NIL or 0, no time limit is assumed. - -The main result is a list of completion objects, where a completion -object is: - - (COMPLETED-STRING SCORE (&rest CHUNKS) CLASSIFICATION-STRING) - -where a CHUNK is a description of a matched substring: - - (OFFSET SUBSTRING) - -and FLAGS is short string describing properties of the symbol (see -SYMBOL-CLASSIFICATION-STRING). - -E.g., completing \"mvb\" in a package that uses COMMON-LISP would -return something like: - - ((\"multiple-value-bind\" 26.588236 ((0 \"m\") (9 \"v\") (15 \"b\")) - (:FBOUNDP :MACRO)) - ...) - -If STRING is package qualified the result list will also be -qualified. If string is non-qualified the result strings are -also not qualified and are considered relative to -DEFAULT-PACKAGE-NAME. - -Which symbols are candidates for matching depends on the symbol -designator's format. The cases are as follows: - FOO - Symbols accessible in the buffer package. - PKG:FOO - Symbols external in package PKG. - PKG::FOO - Symbols accessible in package PKG." - ;; For Emacs we allow both NIL and 0 as value of TIME-LIMIT-IN-MSEC - ;; to denote an infinite time limit. Internally, we only use NIL for - ;; that purpose, to be able to distinguish between "no time limit - ;; alltogether" and "current time limit already exhausted." So we've - ;; got to canonicalize its value at first: - (let* ((no-time-limit-p (or (not time-limit-in-msec) - (zerop time-limit-in-msec))) - (time-limit (if no-time-limit-p nil time-limit-in-msec))) - (multiple-value-bind (completion-set interrupted-p) - (fuzzy-completion-set string default-package-name :limit limit - :time-limit-in-msec time-limit) - ;; We may send this as elisp [] arrays to spare a coerce here, - ;; but then the network serialization were slower by handling arrays. - ;; Instead we limit the number of completions that is transferred - ;; (the limit is set from Emacs.) - (list (coerce completion-set 'list) interrupted-p)))) - - -;;; A Fuzzy Matching -- Not to be confused with a fuzzy completion -;;; object that will be sent back to Emacs, as described above. - -(defstruct (fuzzy-matching (:conc-name fuzzy-matching.) - (:predicate fuzzy-matching-p) - (:constructor make-fuzzy-matching - (symbol package-name score package-chunks - symbol-chunks &key (symbol-p t)))) - symbol ; The symbol that has been found to match. - symbol-p ; To deffirentiate between completeing - ; package: and package:nil - package-name ; The name of the package where SYMBOL was found in. - ; (This is not necessarily the same as the home-package - ; of SYMBOL, because the SYMBOL can be internal to - ; lots of packages; also think of package nicknames.) - score ; The higher the better SYMBOL is a match. - package-chunks ; Chunks pertaining to the package identifier of SYMBOL. - symbol-chunks) ; Chunks pertaining to SYMBOL's name. - -(defun %fuzzy-extract-matching-info (fuzzy-matching user-input-string) - (multiple-value-bind (_ user-package-name __ input-internal-p) - (parse-completion-arguments user-input-string nil) - (declare (ignore _ __)) - (with-struct (fuzzy-matching. score symbol package-name package-chunks - symbol-chunks symbol-p) - fuzzy-matching - (let (symbol-name real-package-name internal-p) - (cond (symbol-p ; symbol fuzzy matching? - (setf symbol-name (symbol-name symbol)) - (setf internal-p input-internal-p) - (setf real-package-name (cond ((keywordp symbol) "") - ((not user-package-name) nil) - (t package-name)))) - (t ; package fuzzy matching? - (setf symbol-name "") - (setf real-package-name package-name) - ;; If no explicit package name was given by the user - ;; (e.g. input was "asdf"), we want to append only - ;; one colon ":" to the package names. - (setf internal-p (if user-package-name input-internal-p nil)))) - (values symbol-name - real-package-name - (if user-package-name internal-p nil) - (completion-output-symbol-converter user-input-string) - (completion-output-package-converter user-input-string)))))) - -(defun fuzzy-format-matching (fuzzy-matching user-input-string) - "Returns the completion (\"foo:bar\") that's represented by FUZZY-MATCHING." - (multiple-value-bind (symbol-name package-name internal-p - symbol-converter package-converter) - (%fuzzy-extract-matching-info fuzzy-matching user-input-string) - (setq symbol-name (and symbol-name - (funcall symbol-converter symbol-name))) - (setq package-name (and package-name - (funcall package-converter package-name))) - (let ((result (untokenize-symbol package-name internal-p symbol-name))) - ;; We return the length of the possibly added prefix as second value. - (values result (search symbol-name result))))) - -(defun fuzzy-convert-matching-for-emacs (fuzzy-matching user-input-string) - "Converts a result from the fuzzy completion core into something -that emacs is expecting. Converts symbols to strings, fixes case -issues, and adds information (as a string) describing if the symbol is -bound, fbound, a class, a macro, a generic-function, a -special-operator, or a package." - (with-struct (fuzzy-matching. symbol score package-chunks symbol-chunks - symbol-p) - fuzzy-matching - (multiple-value-bind (name added-length) - (fuzzy-format-matching fuzzy-matching user-input-string) - (list name - (format nil "~,2f" score) - (append package-chunks - (mapcar (lambda (chunk) - ;; Fix up chunk positions to account for possible - ;; added package identifier. - (let ((offset (first chunk)) - (string (second chunk))) - (list (+ added-length offset) string))) - symbol-chunks)) - (if symbol-p - (symbol-classification-string symbol) - "-------p"))))) - -(defun fuzzy-completion-set (string default-package-name - &key limit time-limit-in-msec) - "Returns two values: an array of completion objects, sorted by -their score, that is how well they are a match for STRING -according to the fuzzy completion algorithm. If LIMIT is set, -only the top LIMIT results will be returned. Additionally, a flag -is returned that indicates whether or not TIME-LIMIT-IN-MSEC was -exhausted." - (check-type limit (or null (integer 0 #.(1- most-positive-fixnum)))) - (check-type time-limit-in-msec - (or null (integer 0 #.(1- most-positive-fixnum)))) - (multiple-value-bind (matchings interrupted-p) - (fuzzy-generate-matchings string default-package-name time-limit-in-msec) - (when (and limit - (> limit 0) - (< limit (length matchings))) - (if (array-has-fill-pointer-p matchings) - (setf (fill-pointer matchings) limit) - (setf matchings (make-array limit :displaced-to matchings)))) - (map-into matchings #'(lambda (m) - (fuzzy-convert-matching-for-emacs m string)) - matchings) - (values matchings interrupted-p))) - - -(defun fuzzy-generate-matchings (string default-package-name - time-limit-in-msec) - "Does all the hard work for FUZZY-COMPLETION-SET. If -TIME-LIMIT-IN-MSEC is NIL, an infinite time limit is assumed." - (multiple-value-bind (parsed-symbol-name parsed-package-name - package internal-p) - (parse-completion-arguments string default-package-name) - (flet ((fix-up (matchings parent-package-matching) - ;; The components of each matching in MATCHINGS have been computed - ;; relatively to PARENT-PACKAGE-MATCHING. Make them absolute. - (let* ((p parent-package-matching) - (p.name (fuzzy-matching.package-name p)) - (p.score (fuzzy-matching.score p)) - (p.chunks (fuzzy-matching.package-chunks p))) - (map-into - matchings - (lambda (m) - (let ((m.score (fuzzy-matching.score m))) - (setf (fuzzy-matching.package-name m) p.name) - (setf (fuzzy-matching.package-chunks m) p.chunks) - (setf (fuzzy-matching.score m) - (if (equal parsed-symbol-name "") - ;; Make package matchings be sorted before all - ;; the relative symbol matchings while preserving - ;; over all orderness. - (/ p.score 100) - (+ p.score m.score))) - m)) - matchings))) - (find-symbols (designator package time-limit &optional filter) - (fuzzy-find-matching-symbols designator package - :time-limit-in-msec time-limit - :external-only (not internal-p) - :filter (or filter #'identity))) - (find-packages (designator time-limit) - (fuzzy-find-matching-packages designator - :time-limit-in-msec time-limit)) - (maybe-find-local-package (name) - (or (find-locally-nicknamed-package name *buffer-package*) - (find-package name)))) - (let ((time-limit time-limit-in-msec) (symbols) (packages) (results) - (dedup-table (make-hash-table :test #'equal))) - (cond ((not parsed-package-name) ; E.g. STRING = "asd" - ;; We don't know if user is searching for a package or a symbol - ;; within his current package. So we try to find either. - (setf (values packages time-limit) - (find-packages parsed-symbol-name time-limit)) - (setf (values symbols time-limit) - (find-symbols parsed-symbol-name package time-limit))) - ((string= parsed-package-name "") ; E.g. STRING = ":" or ":foo" - (setf (values symbols time-limit) - (find-symbols parsed-symbol-name package time-limit))) - (t ; E.g. STRING = "asd:" or "asd:foo" - ;; Find fuzzy matchings of the denoted package identifier part. - ;; After that, find matchings for the denoted symbol identifier - ;; relative to all the packages found. - (multiple-value-bind (symbol-packages rest-time-limit) - (find-packages parsed-package-name time-limit-in-msec) - ;; We want to traverse the found packages in the order of - ;; their score, since those with higher score presumably - ;; represent better choices. (This is important because some - ;; packages may never be looked at if time limit exhausts - ;; during traversal.) - (setf symbol-packages - (sort symbol-packages #'fuzzy-matching-greaterp)) - (loop - for package-matching across symbol-packages - for package = (maybe-find-local-package - (fuzzy-matching.package-name - package-matching)) - while (or (not time-limit) (> rest-time-limit 0)) do - (multiple-value-bind (matchings remaining-time) - ;; The duplication filter removes all those symbols - ;; which are present in more than one package - ;; match. See *FUZZY-DUPLICATE-SYMBOL-FILTER* - (find-symbols parsed-symbol-name package rest-time-limit - (%make-duplicate-symbols-filter - package-matching symbol-packages dedup-table)) - (setf matchings (fix-up matchings package-matching)) - (setf symbols (concatenate 'vector symbols matchings)) - (setf rest-time-limit remaining-time) - (let ((guessed-sort-duration - (%guess-sort-duration (length symbols)))) - (when (and rest-time-limit - (<= rest-time-limit guessed-sort-duration)) - (decf rest-time-limit guessed-sort-duration) - (loop-finish)))) - finally - (setf time-limit rest-time-limit) - (when (equal parsed-symbol-name "") ; E.g. STRING = "asd:" - (setf packages symbol-packages)))))) - ;; Sort by score; thing with equal score, sort alphabetically. - ;; (Especially useful when PARSED-SYMBOL-NAME is empty, and all - ;; possible completions are to be returned.) - (setf results (concatenate 'vector symbols packages)) - (setf results (sort results #'fuzzy-matching-greaterp)) - (values results (and time-limit (<= time-limit 0))))))) - -(defun %guess-sort-duration (length) - ;; These numbers are pretty much arbitrary, except that they're - ;; vaguely correct on my machine with SBCL. Yes, this is an ugly - ;; kludge, but it's better than before (where this didn't exist at - ;; all, which essentially meant, that this was taken to be 0.) - (if (zerop length) - 0 - (let ((comparasions (* 3.8 (* length (log length 2))))) - (* 1000 (* comparasions (expt 10 -7)))))) ; msecs - -(defun %make-duplicate-symbols-filter (current-package-matching fuzzy-package-matchings dedup-table) - ;; Returns a filter function based on *FUZZY-DUPLICATE-SYMBOL-FILTER*. - (case *fuzzy-duplicate-symbol-filter* - (:home-package - ;; Return a filter function that takes a symbol, and which returns T - ;; if and only if /no/ matching in FUZZY-PACKAGE-MATCHINGS represents - ;; the home-package of the symbol passed. - (let ((packages (mapcar #'(lambda (m) - (find-package (fuzzy-matching.package-name m))) - (remove current-package-matching - (coerce fuzzy-package-matchings 'list))))) - #'(lambda (symbol) - (not (member (symbol-package symbol) packages))))) - (:nearest-package - ;; Keep only the first occurence of the symbol. - #'(lambda (symbol) - (unless (gethash (symbol-name symbol) dedup-table) - (setf (gethash (symbol-name symbol) dedup-table) t)))) - (:all - ;; No filter - #'identity) - (t - (typecase *fuzzy-duplicate-symbol-filter* - (function - ;; Custom filter - (funcall *fuzzy-duplicate-symbol-filter* - (fuzzy-matching.package-name current-package-matching) - (map 'list #'fuzzy-matching.package-name fuzzy-package-matchings) - dedup-table)) - (t - ;; Bad filter value - (warn "bad *FUZZY-DUPLICATE-SYMBOL-FILTER* value: ~s" - *fuzzy-duplicate-symbol-filter*) - #'identity))))) - -(defun fuzzy-matching-greaterp (m1 m2) - "Returns T if fuzzy-matching M1 should be sorted before M2. -Basically just the scores of the two matchings are compared, and -the match with higher score wins. For the case that the score is -equal, the one which comes alphabetically first wins." - (declare (type fuzzy-matching m1 m2)) - (let ((score1 (fuzzy-matching.score m1)) - (score2 (fuzzy-matching.score m2))) - (cond ((> score1 score2) t) - ((< score1 score2) nil) ; total order - (t - (let ((name1 (symbol-name (fuzzy-matching.symbol m1))) - (name2 (symbol-name (fuzzy-matching.symbol m2)))) - (string< name1 name2)))))) - -(declaim (ftype (function () (integer 0)) get-real-time-msecs)) -(defun get-real-time-in-msecs () - (let ((units-per-msec (max 1 (floor internal-time-units-per-second 1000)))) - (values (floor (get-internal-real-time) units-per-msec)))) - -(defun fuzzy-find-matching-symbols - (string package &key (filter #'identity) external-only time-limit-in-msec) - "Returns two values: a vector of fuzzy matchings for matching -symbols in PACKAGE, using the fuzzy completion algorithm, and the -remaining time limit. - -Only those symbols are considered of which FILTER does return T. - -If EXTERNAL-ONLY is true, only external symbols are considered. A -TIME-LIMIT-IN-MSEC of NIL is considered no limit; if it's zero or -negative, perform a NOP." - (let ((time-limit-p (and time-limit-in-msec t)) - (time-limit (or time-limit-in-msec 0)) - (rtime-at-start (get-real-time-in-msecs)) - (package-name (package-name package)) - (count 0)) - (declare (type boolean time-limit-p)) - (declare (type integer time-limit rtime-at-start)) - (declare (type (integer 0 #.(1- most-positive-fixnum)) count)) - - (flet ((recompute-remaining-time (old-remaining-time) - (cond ((not time-limit-p) - ;; propagate NIL back as infinite time limit - (values nil nil)) - ((> count 0) ; ease up on getting internal time like crazy - (setf count (mod (1+ count) 128)) - (values nil old-remaining-time)) - (t (let* ((elapsed-time (- (get-real-time-in-msecs) - rtime-at-start)) - (remaining (- time-limit elapsed-time))) - (values (<= remaining 0) remaining))))) - (perform-fuzzy-match (string symbol-name) - (let* ((converter (completion-output-symbol-converter string)) - (converted-symbol-name (funcall converter symbol-name))) - (compute-highest-scoring-completion string - converted-symbol-name)))) - (let ((completions (make-array 256 :adjustable t :fill-pointer 0)) - (rest-time-limit time-limit)) - (do-symbols* (symbol package) - (multiple-value-bind (exhausted? remaining-time) - (recompute-remaining-time rest-time-limit) - (setf rest-time-limit remaining-time) - (cond (exhausted? (return)) - ((not (and (or (not external-only) - (symbol-external-p symbol package)) - (funcall filter symbol)))) - ((string= "" string) ; "" matches always - (vector-push-extend - (make-fuzzy-matching symbol package-name - 0.0 '() '()) - completions)) - (t - (multiple-value-bind (match-result score) - (perform-fuzzy-match string (symbol-name symbol)) - (when match-result - (vector-push-extend - (make-fuzzy-matching symbol package-name score - '() match-result) - completions))))))) - (values completions rest-time-limit))))) - -(defun fuzzy-find-matching-packages (name &key time-limit-in-msec) - "Returns a vector of fuzzy matchings for each package that is -similiar to NAME, and the remaining time limit. -Cf. FUZZY-FIND-MATCHING-SYMBOLS." - (let ((time-limit-p (and time-limit-in-msec t)) - (time-limit (or time-limit-in-msec 0)) - (rtime-at-start (get-real-time-in-msecs)) - (converter (completion-output-package-converter name)) - (completions (make-array 32 :adjustable t :fill-pointer 0))) - (declare (type boolean time-limit-p)) - (declare (type integer time-limit rtime-at-start)) - (declare (type function converter)) - (flet ((match-package (names) - (loop with max-pkg-name = "" - with max-result = nil - with max-score = 0 - for package-name in names - for converted-name = (funcall converter package-name) - do - (multiple-value-bind (result score) - (compute-highest-scoring-completion name - converted-name) - (when (and result (> score max-score)) - (setf max-pkg-name package-name) - (setf max-result result) - (setf max-score score))) - finally - (when max-result - (vector-push-extend - (make-fuzzy-matching nil max-pkg-name - max-score max-result '() - :symbol-p nil) - completions))))) - (cond ((and time-limit-p (<= time-limit 0)) - (values #() time-limit)) - (t - (loop for (nick) in (package-local-nicknames *buffer-package*) - do - (match-package (list nick))) - (loop for package in (list-all-packages) - do - ;; Find best-matching package-nickname: - (match-package (package-names package)) - finally - (return - (values completions - (and time-limit-p - (let ((elapsed-time (- (get-real-time-in-msecs) - rtime-at-start))) - (- time-limit elapsed-time))))))))))) - - -(defslimefun fuzzy-completion-selected (original-string completion) - "This function is called by Slime when a fuzzy completion is -selected by the user. It is for future expansion to make -testing, say, a machine learning algorithm for completion scoring -easier. - -ORIGINAL-STRING is the string the user completed from, and -COMPLETION is the completion object (see docstring for -SWANK:FUZZY-COMPLETIONS) corresponding to the completion that the -user selected." - (declare (ignore original-string completion)) - nil) - - -;;;;; Fuzzy completion core - -(defparameter *fuzzy-recursion-soft-limit* 30 - "This is a soft limit for recursion in -RECURSIVELY-COMPUTE-MOST-COMPLETIONS. Without this limit, -completing a string such as \"ZZZZZZ\" with a symbol named -\"ZZZZZZZZZZZZZZZZZZZZZZZ\" will result in explosive recursion to -find all the ways it can match. - -Most natural language searches and symbols do not have this -problem -- this is only here as a safeguard.") -(declaim (fixnum *fuzzy-recursion-soft-limit*)) - -(defvar *all-chunks* '()) -(declaim (type list *all-chunks*)) - -(defun compute-highest-scoring-completion (short full) - "Finds the highest scoring way to complete the abbreviation -SHORT onto the string FULL, using CHAR= as a equality function for -letters. Returns two values: The first being the completion -chunks of the highest scorer, and the second being the score." - (let* ((scored-results - (mapcar #'(lambda (result) - (cons (score-completion result short full) result)) - (compute-most-completions short full))) - (winner (first (sort scored-results #'> :key #'first)))) - (values (rest winner) (first winner)))) - -(defun compute-most-completions (short full) - "Finds most possible ways to complete FULL with the letters in SHORT. -Calls RECURSIVELY-COMPUTE-MOST-COMPLETIONS recursively. Returns -a list of (&rest CHUNKS), where each CHUNKS is a description of -how a completion matches." - (let ((*all-chunks* nil)) - (recursively-compute-most-completions short full 0 0 nil nil nil t) - *all-chunks*)) - -(defun recursively-compute-most-completions - (short full - short-index initial-full-index - chunks current-chunk current-chunk-pos - recurse-p) - "Recursively (if RECURSE-P is true) find /most/ possible ways -to fuzzily map the letters in SHORT onto FULL, using CHAR= to -determine if two letters match. - -A chunk is a list of elements that have matched consecutively. -When consecutive matches stop, it is coerced into a string, -paired with the starting position of the chunk, and pushed onto -CHUNKS. - -Whenever a letter matches, if RECURSE-P is true, -RECURSIVELY-COMPUTE-MOST-COMPLETIONS calls itself with a position -one index ahead, to find other possibly higher scoring -possibilities. If there are less than -*FUZZY-RECURSION-SOFT-LIMIT* results in *ALL-CHUNKS* currently, -this call will also recurse. - -Once a word has been completely matched, the chunks are pushed -onto the special variable *ALL-CHUNKS* and the function returns." - (declare (optimize speed) - (type fixnum short-index initial-full-index) - (type list current-chunk) - (simple-string short full)) - (flet ((short-cur () - "Returns the next letter from the abbreviation, or NIL - if all have been used." - (if (= short-index (length short)) - nil - (aref short short-index))) - (add-to-chunk (char pos) - "Adds the CHAR at POS in FULL to the current chunk, - marking the start position if it is empty." - (unless current-chunk - (setf current-chunk-pos pos)) - (push char current-chunk)) - (collect-chunk () - "Collects the current chunk to CHUNKS and prepares for - a new chunk." - (when current-chunk - (let ((current-chunk-as-string - (nreverse - (make-array (length current-chunk) - :element-type 'character - :initial-contents current-chunk)))) - (push (list current-chunk-pos current-chunk-as-string) chunks) - (setf current-chunk nil - current-chunk-pos nil))))) - ;; If there's an outstanding chunk coming in collect it. Since - ;; we're recursively called on skipping an input character, the - ;; chunk can't possibly continue on. - (when current-chunk (collect-chunk)) - (do ((pos initial-full-index (1+ pos))) - ((= pos (length full))) - (let ((cur-char (aref full pos))) - (if (and (short-cur) - (char= cur-char (short-cur))) - (progn - (when recurse-p - ;; Try other possibilities, limiting insanely deep - ;; recursion somewhat. - (recursively-compute-most-completions - short full short-index (1+ pos) - chunks current-chunk current-chunk-pos - (not (> (length *all-chunks*) - *fuzzy-recursion-soft-limit*)))) - (incf short-index) - (add-to-chunk cur-char pos)) - (collect-chunk)))) - (collect-chunk) - ;; If we've exhausted the short characters we have a match. - (if (short-cur) - nil - (let ((rev-chunks (reverse chunks))) - (push rev-chunks *all-chunks*) - rev-chunks)))) - - -;;;;; Fuzzy completion scoring - -(defvar *fuzzy-completion-symbol-prefixes* "*+-%&?<" - "Letters that are likely to be at the beginning of a symbol. -Letters found after one of these prefixes will be scored as if -they were at the beginning of ths symbol.") -(defvar *fuzzy-completion-symbol-suffixes* "*+->" - "Letters that are likely to be at the end of a symbol. -Letters found before one of these suffixes will be scored as if -they were at the end of the symbol.") -(defvar *fuzzy-completion-word-separators* "-/." - "Letters that separate different words in symbols. Letters -after one of these symbols will be scores more highly than other -letters.") - -(defun score-completion (completion short full) - "Scores the completion chunks COMPLETION as a completion from -the abbreviation SHORT to the full string FULL. COMPLETION is a -list like: - ((0 \"mul\") (9 \"v\") (15 \"b\")) -Which, if SHORT were \"mulvb\" and full were \"multiple-value-bind\", -would indicate that it completed as such (completed letters -capitalized): - MULtiple-Value-Bind - -Letters are given scores based on their position in the string. -Letters at the beginning of a string or after a prefix letter at -the beginning of a string are scored highest. Letters after a -word separator such as #\- are scored next highest. Letters at -the end of a string or before a suffix letter at the end of a -string are scored medium, and letters anywhere else are scored -low. - -If a letter is directly after another matched letter, and its -intrinsic value in that position is less than a percentage of the -previous letter's value, it will use that percentage instead. - -Finally, a small scaling factor is applied to favor shorter -matches, all other things being equal." - (labels ((at-beginning-p (pos) - (= pos 0)) - (after-prefix-p (pos) - (and (= pos 1) - (find (aref full 0) *fuzzy-completion-symbol-prefixes*))) - (word-separator-p (pos) - (find (aref full pos) *fuzzy-completion-word-separators*)) - (after-word-separator-p (pos) - (find (aref full (1- pos)) *fuzzy-completion-word-separators*)) - (at-end-p (pos) - (= pos (1- (length full)))) - (before-suffix-p (pos) - (and (= pos (- (length full) 2)) - (find (aref full (1- (length full))) - *fuzzy-completion-symbol-suffixes*))) - (score-or-percentage-of-previous (base-score pos chunk-pos) - (if (zerop chunk-pos) - base-score - (max base-score - (+ (* (score-char (1- pos) (1- chunk-pos)) 0.85) - (expt 1.2 chunk-pos))))) - (score-char (pos chunk-pos) - (score-or-percentage-of-previous - (cond ((at-beginning-p pos) 10) - ((after-prefix-p pos) 10) - ((word-separator-p pos) 1) - ((after-word-separator-p pos) 8) - ((at-end-p pos) 6) - ((before-suffix-p pos) 6) - (t 1)) - pos chunk-pos)) - (score-chunk (chunk) - (loop for chunk-pos below (length (second chunk)) - for pos from (first chunk) - summing (score-char pos chunk-pos)))) - (let* ((chunk-scores (mapcar #'score-chunk completion)) - (length-score (/ 10.0 (1+ (- (length full) (length short)))))) - (values - (+ (reduce #'+ chunk-scores) length-score) - (list (mapcar #'list chunk-scores completion) length-score))))) - -(defun highlight-completion (completion full) - "Given a chunk definition COMPLETION and the string FULL, -HIGHLIGHT-COMPLETION will create a string that demonstrates where -the completion matched in the string. Matches will be -capitalized, while the rest of the string will be lower-case." - (let ((highlit (nstring-downcase (copy-seq full)))) - (dolist (chunk completion) - (setf highlit (nstring-upcase highlit - :start (first chunk) - :end (+ (first chunk) - (length (second chunk)))))) - highlit)) - -(defun format-fuzzy-completion-set (winners) - "Given a list of completion objects such as on returned by -FUZZY-COMPLETION-SET, format the list into user-readable output -for interactive debugging purpose." - (let ((max-len - (loop for winner in winners maximizing (length (first winner))))) - (loop for (sym score result) in winners do - (format t "~&~VA score ~8,2F ~A" - max-len (highlight-completion result sym) score result)))) - -(provide :swank-fuzzy) diff --git a/elpa/slime-20200414.1444/contrib/swank-goo.goo b/elpa/slime-20200414.1444/contrib/swank-goo.goo deleted file mode 100644 index 562401dc..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-goo.goo +++ /dev/null @@ -1,995 +0,0 @@ -;;;; swank-goo.goo --- Swank server for GOO -;;; -;;; Copyright (C) 2005 Helmut Eller -;;; -;;; This file is licensed under the terms of the GNU General Public -;;; License as distributed with Emacs (press C-h C-c to view it). - -;;;; Installation -;; -;; 1. Add something like this to your .emacs: -;; -;; (setq slime-lisp-implementations -;; '((goo ("g2c") :init goo-slime-init))) -;; -;; (defun goo-slime-init (file _) -;; (format "%S\n%S\n" -;; `(set goo/system:*module-search-path* -;; (cat '(".../slime/contrib/") -;; goo/system:*module-search-path*)) -;; `(swank-goo:start-swank ,file))) -;; -;; 2. Start everything with M-- M-x slime goo -;; - -;;;; Code - -(use goo) -(use goo/boot) -(use goo/x) -(use goo/io/port) -(use goo/io/write) -(use goo/eval) -(use goo/system) -(use goo/conditions) -(use goo/fun) -(use goo/loc) -(use goo/chr) -(use eval/module) -(use eval/ast) -(use eval/g2c) - - -;;;; server setup - -(df create-server (port-number) (setup-server port-number announce-port)) - -(df start-swank (port-file) - (setup-server 0 (fun (s) (write-port-file (%local-port s) port-file)))) - -(df setup-server (port-number announce) - (let ((s (create-socket port-number))) - (fin (seq - (announce s) - (let ((c (accept s))) - ;;(post "connection: %s" c) - (fin (serve-requests c) - (%close (@fd c))))) - (post "closing socket: %s" s) - (%close s)))) - -(df announce-port (socket) - (post "Listening on port: %d\n" (%local-port socket))) - -(df write-port-file (port-number filename) - (with-port (file (open filename)) - (msg file "%d\n" port-number))) - -(dc ()) - -(dc ()) -(dp @socket ( => )) -(dp @in ( => )) -(dp @out ( => )) - -(dv emacs-connection|(t? ) #f) - -(df serve-requests (socket) - (dlet ((emacs-connection (new - @socket socket - @out (new @socket socket) - @in (new @socket socket)))) - (dlet ((out (@out emacs-connection)) - (in (@in emacs-connection))) - (while #t - (simple-restart - "SLIME top-level" - (fun () (process-next-event socket))))))) - -(d. (t= 'nil)) -(d. t #t) -(d. cons pair) - -(dv tag-counter| 0) - -(df process-next-event (port) (dispatch-event (decode-message port) port)) - -(df dispatch-event (event port) - ;; (post "%=\n" event) - (match event - ((:emacs-rex ,form ,package ,_thread-id ,id) - (eval-for-emacs form package port id)) - ((:read-string ,_) - (def tag (incf tag-counter)) - (encode-message `(:read-string ,_ ,tag) port) - (rep loop () - (match (decode-message port) - ((:emacs-return-string ,_ ,rtag ,str) - (assert (= tag rtag) "Unexpected reply tag: %d" rtag) - str) - ((,@evt) - (try-recover - (fun () (dispatch-event evt port)) - (fun () (encode-message `(:read-aborted ,_ ,tag) port))) - (loop))))) - ((:emacs-return-string ,_ ,rtag ,str) - (error "Unexpected event: %=" event)) - ((,@_) (encode-message event port)))) - -(dc ()) -(dp @module ( => )) -(dp @id ( => )) -(dp @port ( => )) -(dp @prev ( => (t? ))) - -;; should be ddv -(dv eval-context|(t? ) #f) - -(df buffer-module () (@module eval-context)) - -(df eval-for-emacs (form| package|(t+ ) port id|) - (try-recover - (fun () - (try debugger-hook - (dlet ((eval-context (new - @module (find-buffer-module package) @id id - @port port @prev eval-context))) - (def result (eval (frob-form-for-eval form) 'swank-goo)) - (force-out out) - (dispatch-event `(:return (:ok ,result) ,id) port)))) - (fun () (dispatch-event `(:return (:abort) ,id) port)))) - -(dm find-buffer-module (name| => ) - (or (elt-or (all-modules) (as-sym name) #f) - (find-buffer-module 'nil))) - -(dm find-buffer-module (name| => ) default-module) - -(dv default-module| (runtime-module 'goo/user)) - -(d. slimefuns (fab 100)) - -(ds defslimefun (,name ,args ,@body) - `(set (elt slimefuns ',name) - (df ,(cat-sym 'swank@ name) ,args ,@body))) - -(df slimefun (name) - (or (elt-or slimefuns name #f) - (error "Undefined slimefun: %=" name))) - -;; rewrite (swank:foo ...) to ((slimefun 'foo) ...) -(df frob-form-for-eval (form) - (match form - ((,op ,@args) - (match (map as-sym (split (sym-name op) #\:)) - ((swank ,name) - `((slimefun ',name) ,@args)))))) - - -;;;; debugger - -(dc ()) -(dp @level ( => )) -(dp @top-frame ( => )) -(dp @restarts ( => )) -(dp @condition ( => )) -(dp @eval-context ( => (t? ))) - -(dv sldb-context|(t? ) #f) - -(df debugger-hook (c| resume) - (let ((tf (find-top-frame 'debugger-hook 2)) - (rs (compute-restarts c)) - (l (if sldb-context (1+ (@level sldb-context)) 1))) - (cond ((> l 10) (emergency-abort c)) - (#t - (dlet ((sldb-context (new - @level l @top-frame tf - @restarts rs @condition c - @eval-context eval-context))) - (let ((bt (compute-backtrace tf 0 10))) - (force-out out) - (dispatch-event `(:debug 0 ,l - ,@(debugger-info c rs bt eval-context)) - (@port eval-context)) - (sldb-loop l (@port eval-context)))))))) - -(df emergency-abort (c) - (post "Maximum debug level reached aborting...\n") - (post "%s\n" (describe-condition c)) - (do-stack-frames (fun (f args) (msg out " %= %=\n" f args))) - (invoke-handler-interactively (find-restart ) in out)) - -(df sldb-loop (level port) - (fin (while #t - (dispatch-event `(:debug-activate 0 ,level) port) - (simple-restart - (msg-to-str "Return to SLDB level %s" level) - (fun () (process-next-event port)))) - (dispatch-event `(:debug-return 0 ,level nil) port))) - -(defslimefun backtrace (start| end|(t+ )) - (backtrace-for-emacs - (compute-backtrace (@top-frame sldb-context) - start - (if (isa? end ) end #f)))) - -(defslimefun throw-to-toplevel () - (invoke-handler-interactively (find-restart ) in out)) - -(defslimefun invoke-nth-restart-for-emacs (sldb-level| n|) - (when (= (@level sldb-context) sldb-level) - (invoke-handler-interactively (elt (@restarts sldb-context) n) in out))) - -(defslimefun debugger-info-for-emacs (start end) - (debugger-info (@condition sldb-context) - (@restarts sldb-context) - (compute-backtrace (@top-frame sldb-context) - start - (if (isa? end ) end #f)))) - -(defslimefun frame-locals-and-catch-tags (frame-idx) - (def frame (nth-frame frame-idx)) - (list - (map-keyed (fun (i name) - (lst ':name (sym-name name) ':id 0 - ':value (safe-write-to-string (frame-var-value frame i)))) - (frame-var-names frame)) - '())) - -(defslimefun inspect-frame-var (frame-idx var-idx) - (reset-inspector) - (inspect-object (frame-var-value (nth-frame frame-idx) var-idx))) - -(defslimefun inspect-current-condition () - (reset-inspector) - (inspect-object (@condition sldb-context))) - -(defslimefun frame-source-location (frame-idx) - (match (nth-frame frame-idx) - ((,f ,@_) - (or (emacs-src-loc f) - `(:error ,(msg-to-str "No src-loc available for: %s" f)))))) - -(defslimefun eval-string-in-frame (string frame-idx) - (def frame (nth-frame frame-idx)) - (let ((names (frame-var-names frame)) - (values (frame-var-values frame))) - (write-to-string - (app (eval `(fun ,names ,(read-from-string string)) - (module-name (buffer-module))) - values)))) - -(df debugger-info (condition restarts backtrace eval-context) - (lst `(,(try-or (fun () (describe-condition condition)) "<...>") - ,(cat " [class: " (class-name-str condition) "]") - ()) - (restarts-for-emacs restarts) - (backtrace-for-emacs backtrace) - (pending-continuations eval-context))) - -(df backtrace-for-emacs (backtrace) - (map (fun (f) - (match f - ((,idx (,f ,@args)) - (lst idx (cat (if (fun-name f) - (sym-name (fun-name f)) - (safe-write-to-string f)) - (safe-write-to-string args)))))) - backtrace)) - -(df restarts-for-emacs (restarts) - (map (fun (x) `(,(sym-name (class-name (%handler-condition-type x))) - ,(describe-restart x))) - restarts)) - -(df describe-restart (restart) - (describe-handler (%handler-info restart) (%handler-condition-type restart))) - -(df compute-restarts (condition) - (packing (%do-handlers-of-type (fun (c) (pack c))))) - -(df find-restart (type) - (esc ret - (%do-handlers-of-type type ret) - #f)) - -(df pending-continuations (context|(t? )) - (if context - (pair (@id context) (pending-continuations (@prev context))) - '())) - -(df find-top-frame (fname| offset|) - (esc ret - (let ((top-seen? #f)) - (do-stack-frames (fun (f args) - (cond (top-seen? - (cond ((== offset 0) - (ret (pair f args))) - (#t (decf offset)))) - ((== (fun-name f) fname) - (set top-seen? #t)))))))) - -(df compute-backtrace (top-frame start| end) - (packing - (esc break - (do-user-frames (fun (idx f args) - (when (and end (<= end idx)) - (break #f)) - (when (<= start idx) - (pack (lst idx (pair f args))))) - top-frame)))) - -(df nth-frame (n|) - (esc ret - (do-user-frames - (fun (idx f args) - (when (= idx n) - (ret (pair f args)))) - (@top-frame sldb-context)))) - -(df frame-var-value (frame var-idx) - (match frame - ((,f ,@args) - (def sig (fun-sig f)) - (def arity (sig-arity sig)) - (def nary? (sig-nary? sig)) - (cond ((< var-idx arity) (elt args var-idx)) - (nary? (sub* args arity)))))) - -(df frame-var-names (frame) - (match frame - ((,f ,@_) (fun-info-names (fun-info f))))) - -(df frame-var-values (frame) - (map (curry frame-var-value frame) (keys (frame-var-names frame)))) - -(df do-user-frames (f| top-frame) - (let ((idx -1) - (top-seen? #f)) - (do-stack-frames - (fun (ffun args) - (cond (top-seen? - (incf idx) - (f idx ffun (rev args))) - ((= (pair ffun args) top-frame) - (set top-seen? #t))))))) - - -;;;; Write some classes a little less verbose - -;; (dm recurring-write (port| x d| recur|) -;; (msg port "#{%s &%s}" (class-name-str x) -;; (num-to-str-base (address-of x) 16))) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s %s}" (class-name-str x) (module-name x))) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s %s}" (class-name-str x) (binding-name x))) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s %s}" (class-name-str x) (len x))) - -(dm recurring-write (port| x| - d| recur|) - (msg port "#{%s}" (class-name-str x))) - -(dm recurring-write (port| x| - d| recur|) - (msg port "#{%s}" (class-name-str x))) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s %s:%=}" (class-name-str x) - (src-loc-file x) (src-loc-line x))) - - -;;;; Inspector - -(dc ()) -(dp! @object ( => )) -(dp! @parts ( => ) (new )) -(dp! @stack ( => ) '()) - -(dv inspector #f) - -(defslimefun init-inspector (form|) - (reset-inspector) - (inspect-object (str-eval form (buffer-module)))) - -(defslimefun quit-inspector () (reset-inspector) 'nil) - -(defslimefun inspect-nth-part (n|) - (inspect-object (elt (@parts inspector) n))) - -(defslimefun inspector-pop () - (cond ((<= 2 (len (@stack inspector))) - (popf (@stack inspector)) - (inspect-object (popf (@stack inspector)))) - (#t 'nil))) - -(df reset-inspector () (set inspector (new ))) - -(df inspect-object (o) - (set (@object inspector) o) - (set (@parts inspector) (new )) - (pushf (@stack inspector) o) - (lst ':title (safe-write-to-string o) ; ':type (class-name-str o) - ':content (inspector-content - `("class: " (:value ,(class-of o)) "\n" - ,@(inspect o))))) - -(df inspector-content (content) - (map (fun (part) - (case-by part isa? - (() part) - (() - (match part - ((:value ,o ,@str) - `(:value ,@(if (nul? str) - (lst (safe-write-to-string o)) - str) - ,(assign-index o))))) - (#t (error "Bad inspector content: %=" part)))) - content)) - -(df assign-index (o) - (pushf (@parts inspector) o) - (1- (len (@parts inspector)))) - -(dg inspect (o)) - -;; a list of dangerous functions -(d. getter-blacklist (lst fun-code fun-env class-row)) - -(dm inspect (o) - (join (map (fun (p) - (let ((getter (prop-getter p))) - `(,(sym-name (fun-name getter)) ": " - ,(cond ((mem? getter-blacklist getter) "<...>") - ((not (prop-bound? o getter)) "") - (#t (try-or (fun () `(:value ,(getter o))) - "<...>")))))) - (class-props (class-of o))) - '("\n"))) - -(dm inspect (o|) - (join (packing (do-keyed (fun (pos val) - (pack `(,(num-to-str pos) ": " (:value ,val)))) - o)) - '("\n"))) - -(dm inspect (o|) - (join (packing (do-keyed (fun (key val) - (pack `((:value ,key) "\t: " (:value ,val)))) - o)) - '("\n"))) - -;; inspecting the env of closures is broken -;; (dm inspect (o|) -;; (cat (sup o) -;; '("\n") -;; (if (%fun-env? o) -;; (inspect (packing (for ((i (below (%fun-env-len o)))) -;; (pack (%fun-env-elt o i))))) -;; '()))) -;; -;; (df %fun-env? (f| => ) #eb{ FUNENV($f) != $#f }) -;; (df %fun-env-len (f| => ) #ei{ ((ENV)FUNENV ($f))->size }) -;; (df %fun-env-elt (f| i| => ) #eg{ FUNENVGET($f, @i) }) - - -;;;; init - -(defslimefun connection-info () - `(:pid - ,(process-id) :style nil - :lisp-implementation (:type "GOO" :name "goo" - :version ,(%lookup '*goo-version* 'eval/main)) - :machine (:instance "" :type "" :version "") - :features () - :package (:name "goo/user" :prompt "goo/user"))) - -(defslimefun quit-lisp () #ei{ exit (0),0 }) - -(defslimefun set-default-directory (dir|) #ei{ chdir(@dir) } dir) - - -;;;; eval - -(defslimefun ping () "PONG") - -(defslimefun create-repl (_) - (let ((name (sym-name (module-name (buffer-module))))) - `(,name ,name))) - -(defslimefun listener-eval (string) - (clear-input in) - `(:values ,(write-to-string (str-eval string (buffer-module))))) - -(defslimefun interactive-eval (string) - (cat "=> " (write-to-string (str-eval string (buffer-module))))) - -(df str-eval (s| m|) - (eval (read-from-string s) (module-name m))) - -(df clear-input (in|) (while (ready? in) (get in))) - -(dc ()) - -(defslimefun simple-break () - (simple-restart - "Continue from break" - (fun () (sig (new - condition-message "Interrupt from Emacs")))) - 'nil) - -(defslimefun clear-repl-results () 'nil) - - -;;;; compile - -(defslimefun compile-string-for-emacs (string buffer position directory) - (def start (current-time)) - (def r (g2c-eval (read-from-string string) - (module-target-environment (buffer-module)))) - (lst (write-to-string r) - (/ (as (- (current-time) start)) 1000000.0))) - -(defslimefun compiler-notes-for-emacs () 'nil) - -(defslimefun filename-to-modulename (filename| => (t+ )) - (try-or (fun () (sym-name (filename-to-modulename filename))) 'nil)) - -(df filename-to-modulename (filename| => ) - (def paths (map pathname-to-components - (map simplify-filename - (pick file-exists? *module-search-path*)))) - (def filename (pathname-to-components filename)) - (def moddir (rep parent ((modpath filename)) - (cond ((any? (curry = modpath) paths) - modpath) - (#t - (parent (components-parent-directory modpath)))))) - (def modfile (components-to-pathname (sub* filename (len moddir)))) - (as-sym (sub modfile 0 (- (len modfile) (len *goo-extension*))))) - - - -;;;; Load - -(defslimefun load-file (filename) - (let ((file (cond ((= (sub (rev filename) 0 4) "oog.") filename) - (#t (cat filename ".goo"))))) - (safe-write-to-string (load-file file (filename-to-modulename file))))) - - -;;;; background activities - -(defslimefun operator-arglist (op _) - (try-or (fun () - (let ((value (str-eval op (buffer-module)))) - (if (isa? value ) - (write-to-string value) - 'nil))) - 'nil)) - - -;;;; M-. - -(defslimefun find-definitions-for-emacs (name|) - (match (parse-symbol name) - ((,sym ,modname) - (def env (module-target-environment (runtime-module modname))) - (def b (find-binding sym env)) - (cond (b (find-binding-definitions b)) - (#t 'nil))))) - -(df parse-symbol (name| => ) - (if (mem? name #\:) - (match (split name #\:) - ((,module ,name) (lst (as-sym name) (as-sym module)))) - (lst (as-sym name) (module-name (buffer-module))))) - -(df find-binding-definitions (b|) - (def value (case (binding-kind b) - (('runtime) (loc-val (binding-locative b))) - (('global) (let ((box (binding-global-box b))) - (and box (global-box-value box)))) - (('macro) (binding-info b)) - (#t (error "unknown binding kind %=" (binding-kind b))))) - (map (fun (o) - (def loc (emacs-src-loc o)) - `(,(write-to-string (dspec o)) - ,(or loc `(:error "no src-loc available")))) - (defining-objects value))) - -(dm defining-objects (o => ) '()) -(dm defining-objects (o| => ) (lst o)) -(dm defining-objects (o| => ) (pair o (fun-mets o))) - -(dm emacs-src-loc (o|) - (def loc (fun-src-loc o)) - (and loc `(:location (:file ,(simplify-filename - (find-goo-file-in-path - (module-name-to-relpath (src-loc-file loc)) - *module-search-path*))) - (:line ,(src-loc-line loc)) - ()))) - -(dm dspec (f|) - (cond ((fun-name f) - `(,(if (isa? f ) 'dg 'dm) ,(fun-name f) ,@(dspec-arglist f))) - (#t f))) - -(df dspec-arglist (f|) - (map2 (fun (name class) - (cond ((= class ) name) - ((isa? class ) - `(,name ,(class-name class))) - (#t `(,name ,class)))) - (fun-info-names (fun-info f)) - (sig-specs (fun-sig f)))) - -(defslimefun buffer-first-change (filename) 'nil) - - -;;;; apropos - -(defslimefun apropos-list-for-emacs - (pattern only-external? case-sensitive? package) - (def matches (fab 100)) - (do-all-bindings - (fun (b) - (when (finds (binding-name-str b) pattern) - (set (elt matches - (cat-sym (binding-name b) - (module-name (binding-module b)))) - b)))) - (set matches (sort-by (packing-as (for ((b matches)) (pack b))) - (fun (x y) - (< (binding-name x) - (binding-name y))))) - (map (fun (b) - `(:designator - ,(cat (sym-name (module-name (binding-module b))) ":" - (binding-name-str b) - "\tkind: " (sym-name (binding-kind b))))) - (as matches))) - -(df do-all-bindings (f|) - (for ((module (%module-loader-modules (runtime-module-loader)))) - (do f (environment-bindings (module-target-environment module))))) - -(dm < (s1| s2| => ) - (let ((l1 (len s1)) (l2 (len s2))) - (rep loop ((i 0)) - (cond ((= i l1) (~= l1 l2)) - ((= i l2) #f) - ((< (elt s1 i) (elt s2 i)) #t) - ((= (elt s1 i) (elt s2 i)) (loop (1+ i))) - (#t #f))))) - -(df %binding-info (name| module|) - (binding-info - (find-binding - name (module-target-environment (runtime-module module))))) - - -;;;; completion - -(defslimefun simple-completions (pattern| package) - (def matches (lst)) - (for ((b (environment-bindings (module-target-environment (buffer-module))))) - (when (prefix? (binding-name-str b) pattern) - (pushf matches b))) - (def strings (map binding-name-str matches)) - `(,strings ,(cond ((nul? strings) pattern) - (#t (fold+ common-prefix strings))))) - -(df common-prefix (s1| s2|) - (let ((limit (min (len s1) (len s2)))) - (rep loop ((i 0)) - (cond ((or (= i limit) - (~= (elt s1 i) (elt s2 i))) - (sub s1 0 i)) - (#t (loop (1+ i))))))) - -(defslimefun list-all-package-names (_|...) - (map sym-name (keys (all-modules)))) - -(df all-modules () (%module-loader-modules (runtime-module-loader))) - - -;;;; Macroexpand - -(defslimefun swank-macroexpand-1 (str|) - (write-to-string - (%ast-macro-expand (read-from-string str) - (module-target-environment (buffer-module)) - #f))) - - -;;;; streams - -(dc ()) -(dp @socket ( => )) -(dp! @buf-len ( => ) 0) -(dp @buf ( => ) (new )) -(dp! @timestamp ( => ) 0) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s buf-len: %s}" (class-name-str x) (@buf-len x))) - -(dm put (p| c|) - (add! (@buf p) c) - (incf (@buf-len p)) - (maybe-flush p (= c #\newline))) - -(dm puts (p| s|) - (add! (@buf p) s) - (incf (@buf-len p) (len s)) - (maybe-flush p (mem? s #\newline))) - -(df maybe-flush (p| newline?|) - (and (or (> (@buf-len p) 4000) newline?) - (> (- (current-time) (@timestamp p)) 100000) - (force-out p))) - -(dm force-out (p|) - (unless (zero? (@buf-len p)) - (dispatch-event `(:write-string ,(%buf-to-str (@buf p))) (@socket p)) - (set (@buf-len p) 0) - (zap! (@buf p))) - (set (@timestamp p) (current-time))) - -(df %buf-to-str (buf|) - (packing-as - (for ((i buf)) - (cond ((isa? i ) (for ((c i)) (pack c))) - (#t (pack i)))))) - -(dc ()) -(dp @socket ( => )) -(dp! @idx ( => ) 0) -(dp! @buf ( => ) "") - -(df receive-input (p|) - (dispatch-event `(:read-string ,0) (@socket p))) - -(dm get (p| => ) - (cond ((< (@idx p) (len (@buf p))) - (def c (elt (@buf p) (@idx p))) - (incf (@idx p)) - c) - (#t - (def input (receive-input p)) - (cond ((zero? (len input)) (eof-object)) - (#t (set (@buf p) input) - (set (@idx p) 0) - (get p)))))) - -(dm ready? (p| => ) (< (@idx p) (len (@buf p)))) - -(dm peek (p| => ) - (let ((c (get p))) - (unless (eof-object? c) - (decf (@idx p))) - c)) - - -;;;; Message encoding - -(df decode-message (port|) - (read-from-string (get-block port (read-message-length port)))) - -(df read-message-length (port) - (or (str-to-num (cat "#x" (get-block port 6))) - (error "can't parse message length"))) - -(df encode-message (message port) - (let ((string (dlet ((*max-print-length* 1000000) - (*max-print-depth* 1000000)) - (write-to-string message)))) - (puts port (encode-message-length (len string))) - (puts port string) - (force-out port))) - -(df encode-message-length (n) - (loc ((hex (byte) - (if (< byte #x10) - (cat "0" (num-to-str-base byte 16)) - (num-to-str-base byte 16))) - (byte (i) (hex (& (>> n (* i 8)) 255)))) - (cat (byte 2) (byte 1) (byte 0)))) - - -;;;; semi general utilities - -;; Return the name of O's class as string. -(df class-name-str (o => ) (sym-name (class-name (class-of o)))) - -(df binding-name-str (b| => ) (sym-name (binding-name b))) - -(df as-sym (str|) (as str)) - -;; Replace '//' in the middle of a filename with with a '/' -(df simplify-filename (str| => ) - (match (pathname-to-components str) - ((,hd ,@tl) - (components-to-pathname (cons hd (del-vals tl 'root)))))) - -;; Execute BODY and only if BODY exits abnormally execute RECOVER. -(df try-recover (body recover) - (let ((ok #f)) - (fin (let ((val (body))) - (set ok #t) - val) - (unless ok - (recover))))) - -;; like CL's IGNORE-ERRORS but return VALUE in case of an error. -(df try-or (body| value) - (esc ret - (try (fun (condition resume) (ret value)) - (body)))) - -(df simple-restart (type msg body) - (esc restart - (try ((type type) (description msg)) - (fun (c r) (restart #f)) - (body)))) - -(df safe-write-to-string (o) - (esc ret - (try (fun (c r) - (ret (cat "#"))) - (write-to-string o)))) - -;; Read a string of length COUNT. -(df get-block (port| count| => ) - (packing-as - (for ((i (below count))) - (let ((c (get port))) - (cond ((eof-object? c) - (error "Premature EOF (read %d of %d)" i count)) - (#t (pack c))))))) - - -;;;; import some internal bindings - -(df %lookup (name| module|) - (loc-val - (binding-locative - (find-binding - name (module-target-environment (runtime-module module)))))) - -(d. %handler-info (%lookup 'handler-info 'goo/conditions)) -(d. %handler-condition-type (%lookup 'handler-condition-type 'goo/conditions)) -(d. %do-handlers-of-type (%lookup 'do-handlers-of-type 'goo/conditions)) -(d. %module-loader-modules (%lookup 'module-loader-modules 'eval/module)) -(d. %ast-macro-expand (%lookup 'ast-macro-expand 'eval/ast)) - - -;;;; low level socket stuff -;;; this shouldn't be here - -#{ -#include -#include -#include -#include -#include -#include -#include - -/* convert a goo number to a C long */ -static long g2i (P o) { return untag (o); } - -static int -set_reuse_address (int socket, int value) { - return setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, &value, sizeof value); -} - -static int -bind_socket (int socket, int port) { - struct sockaddr_in addr; - addr.sin_family = AF_INET; - addr.sin_port = htons (port); - addr.sin_addr.s_addr = htonl (INADDR_ANY); - return bind (socket, (struct sockaddr *)&addr, sizeof addr); -} - -static int -local_port (int socket) { - struct sockaddr_in addr; - socklen_t len = sizeof addr; - int code = getsockname (socket, (struct sockaddr *)&addr, &len); - return (code == -1) ? -1 : ntohs (addr.sin_port); -} - -static int -c_accept (int socket) { - struct sockaddr_in addr; - socklen_t len = sizeof addr; - return accept (socket, (struct sockaddr *)&addr, &len); -} - -static P tup3 (P e0, P e1, P e2) { - P tup = YPPtfab ((P)3, YPfalse); - YPtelt_setter (e0, tup, (P)0); - YPtelt_setter (e1, tup, (P)1); - YPtelt_setter (e2, tup, (P)2); - return tup; -} - -static P -current_time (void) { - struct timeval timeval; - int code = gettimeofday (&timeval, NULL); - if (code == 0) { - return tup3 (YPib ((P)(timeval.tv_sec >> 24)), - YPib ((P)(timeval.tv_sec & 0xffffff)), - YPib ((P)(timeval.tv_usec))); - } else return YPib ((P)errno); -} -} - -;; Return the current time in microsecs -(df current-time (=> ) - (def t #eg{ current_time () }) - (cond ((isa? t ) (error "%s" (strerror t))) - (#t (+ (* (+ (<< (1st t) 24) - (2nd t)) - 1000000) - (3rd t))))) - -(dm strerror (e| => ) #es{ strerror (g2i ($e)) }) -(dm strerror (e|(t= #f) => ) #es{ strerror (errno) }) - -(df checkr (value|) - (cond ((~== value -1) value) - (#t (error "%s" (strerror #f))))) - -(df create-socket (port| => ) - (let ((socket (checkr #ei{ socket (PF_INET, SOCK_STREAM, 0) }))) - (checkr #ei{ set_reuse_address (g2i ($socket), 1) }) - (checkr #ei{ bind_socket (g2i ($socket), g2i ($port)) }) - (checkr #ei{ listen (g2i ($socket), 1)}) - socket)) - -(df %local-port (fd|) (checkr #ei{ local_port (g2i ($fd)) })) -(df %close (fd|) (checkr #ei{ close (g2i ($fd)) })) - -(dc ( )) -(dp @fd ( => )) -(dp @in ( => )) -(dp @out ( => )) - -(dm recurring-write (port| x| d| recur|) - (msg port "#{%s fd: %s}" (class-name-str x) (@fd x))) - -(dm get (port| => ) (get (@in port))) - -(dm puts (port| s|) (puts (@out port) s)) -(dm force-out (port|) (force-out (@out port))) - -(dm fdopen (fd| type|(t= ) => ) - (new @fd fd - @in (new port-handle (%fdopen fd "r")) - @out (new port-handle (%fdopen fd "w")))) - -(df %fdopen (fd| mode| => ) - (def addr #ei{ fdopen (g2i ($fd), @mode) }) - (when (zero? addr) - (error "fdopen failed: %s" (strerror #f))) - (%lb (%iu addr))) - -(df accept (socket| => ) - (fdopen (checkr #ei{ c_accept (g2i ($socket)) }) )) - -(export - start-swank - create-server) - -;;; swank-goo.goo ends here \ No newline at end of file diff --git a/elpa/slime-20200414.1444/contrib/swank-hyperdoc.lisp b/elpa/slime-20200414.1444/contrib/swank-hyperdoc.lisp deleted file mode 100644 index 1e34a1d0..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-hyperdoc.lisp +++ /dev/null @@ -1,18 +0,0 @@ -(in-package :swank) - -(defslimefun hyperdoc (string) - (let ((hyperdoc-package (find-package :hyperdoc))) - (when hyperdoc-package - (multiple-value-bind (symbol foundp symbol-name package) - (parse-symbol string *buffer-package*) - (declare (ignore symbol)) - (when foundp - (funcall (find-symbol (string :lookup) hyperdoc-package) - (package-name (if (member package (cons *buffer-package* - (package-use-list - *buffer-package*))) - *buffer-package* - package)) - symbol-name)))))) - -(provide :swank-hyperdoc) diff --git a/elpa/slime-20200414.1444/contrib/swank-ikarus.ss b/elpa/slime-20200414.1444/contrib/swank-ikarus.ss deleted file mode 100644 index e048446c..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-ikarus.ss +++ /dev/null @@ -1,86 +0,0 @@ -;; swank-larceny.scm --- Swank server for Ikarus -;; -;; License: Public Domain -;; Author: Helmut Eller -;; -;; In a shell execute: -;; ikarus swank-ikarus.ss -;; and then `M-x slime-connect' in Emacs. -;; - -(library (swank os) - (export getpid make-server-socket accept local-port close-socket) - (import (rnrs) - (only (ikarus foreign) make-c-callout dlsym dlopen - pointer-set-c-long! pointer-ref-c-unsigned-short - malloc free pointer-size) - (rename (only (ikarus ipc) tcp-server-socket accept-connection - close-tcp-server-socket) - (tcp-server-socket make-server-socket) - (close-tcp-server-socket close-socket)) - (only (ikarus) - struct-type-descriptor - struct-type-field-names - struct-field-accessor) - ) - - (define libc (dlopen)) - (define (cfun name return-type arg-types) - ((make-c-callout return-type arg-types) (dlsym libc name))) - - (define getpid (cfun "getpid" 'signed-int '())) - - (define (accept socket codec) - (let-values (((in out) (accept-connection socket))) - (values (transcoded-port in (make-transcoder codec)) - (transcoded-port out (make-transcoder codec))))) - - (define (socket-fd socket) - (let ((rtd (struct-type-descriptor socket))) - (do ((i 0 (+ i 1)) - (names (struct-type-field-names rtd) (cdr names))) - ((eq? (car names) 'fd) ((struct-field-accessor rtd i) socket))))) - - (define sockaddr_in/size 16) - (define sockaddr_in/sin_family 0) - (define sockaddr_in/sin_port 2) - (define sockaddr_in/sin_addr 4) - - (define (local-port socket) - (let* ((fd (socket-fd socket)) - (addr (malloc sockaddr_in/size)) - (size (malloc (pointer-size)))) - (pointer-set-c-long! size 0 sockaddr_in/size) - (let ((code (getsockname fd addr size)) - (port (ntohs (pointer-ref-c-unsigned-short - addr sockaddr_in/sin_port)))) - (free addr) - (free size) - (cond ((= code -1) (error "getsockname failed")) - (#t port))))) - - (define getsockname - (cfun "getsockname" 'signed-int '(signed-int pointer pointer))) - - (define ntohs (cfun "ntohs" 'unsigned-short '(unsigned-short))) - - ) - - -(library (swank sys) - (export implementation-name eval-in-interaction-environment) - (import (rnrs) - (rnrs eval) - (only (ikarus) interaction-environment)) - - (define (implementation-name) "ikarus") - - (define (eval-in-interaction-environment form) - (eval form (interaction-environment))) - - ) - -(import (only (ikarus) load)) -(load "swank-r6rs.scm") -(import (swank)) -(start-server #f) diff --git a/elpa/slime-20200414.1444/contrib/swank-indentation.lisp b/elpa/slime-20200414.1444/contrib/swank-indentation.lisp deleted file mode 100644 index 67e638d5..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-indentation.lisp +++ /dev/null @@ -1,140 +0,0 @@ -(in-package :swank) - -(defvar *application-hints-tables* '() - "A list of hash tables mapping symbols to indentation hints (lists -of symbols and numbers as per cl-indent.el). Applications can add hash -tables to the list to change the auto indentation slime sends to -emacs.") - -(defun has-application-indentation-hint-p (symbol) - (let ((default (load-time-value (gensym)))) - (dolist (table *application-hints-tables*) - (let ((indentation (gethash symbol table default))) - (unless (eq default indentation) - (return-from has-application-indentation-hint-p - (values indentation t)))))) - (values nil nil)) - -(defun application-indentation-hint (symbol) - (let ((indentation (has-application-indentation-hint-p symbol))) - (labels ((walk (indentation-spec) - (etypecase indentation-spec - (null nil) - (number indentation-spec) - (symbol (string-downcase indentation-spec)) - (cons (cons (walk (car indentation-spec)) - (walk (cdr indentation-spec))))))) - (walk indentation)))) - -;;; override swank version of this function -(defun symbol-indentation (symbol) - "Return a form describing the indentation of SYMBOL. - -The form is to be used as the `common-lisp-indent-function' property -in Emacs." - (cond - ((has-application-indentation-hint-p symbol) - (application-indentation-hint symbol)) - ((and (macro-function symbol) - (not (known-to-emacs-p symbol))) - (let ((arglist (arglist symbol))) - (etypecase arglist - ((member :not-available) - nil) - (list - (macro-indentation arglist))))) - (t nil))) - -;;; More complex version. -(defun macro-indentation (arglist) - (labels ((frob (list &optional base) - (if (every (lambda (x) - (member x '(nil "&rest") :test #'equal)) - list) - ;; If there was nothing interesting, don't return anything. - nil - ;; Otherwise substitute leading NIL's with 4 or 1. - (let ((ok t)) - (substitute-if (if base - 4 - 1) - (lambda (x) - (if (and ok (not x)) - t - (setf ok nil))) - list)))) - (walk (list level &optional firstp) - (when (consp list) - (let ((head (car list))) - (if (consp head) - (let ((indent (frob (walk head (+ level 1) t)))) - (cons (list* "&whole" (if (zerop level) - 4 - 1) - indent) (walk (cdr list) level))) - (case head - ;; &BODY is &BODY, this is clear. - (&body - '("&body")) - ;; &KEY is tricksy. If it's at the base level, we want - ;; to indent them normally: - ;; - ;; (foo bar quux - ;; :quux t - ;; :zot nil) - ;; - ;; If it's at a destructuring level, we want indent of 1: - ;; - ;; (with-foo (var arg - ;; :foo t - ;; :quux nil) - ;; ...) - (&key - (if (zerop level) - '("&rest" nil) - '("&rest" 1))) - ;; &REST is tricksy. If it's at the front of - ;; destructuring, we want to indent by 1, otherwise - ;; normally: - ;; - ;; (foo (bar quux - ;; zot) - ;; ...) - ;; - ;; but - ;; - ;; (foo bar quux - ;; zot) - (&rest - (if (and (plusp level) firstp) - '("&rest" 1) - '("&rest" nil))) - ;; &WHOLE and &ENVIRONMENT are skipped as if they weren't there - ;; at all. - ((&whole &environment) - (walk (cddr list) level firstp)) - ;; &OPTIONAL is indented normally -- and the &OPTIONAL marker - ;; itself is not counted. - (&optional - (walk (cdr list) level)) - ;; Indent normally, walk the tail -- but - ;; unknown lambda-list keywords terminate the walk. - (otherwise - (unless (member head lambda-list-keywords) - (cons nil (walk (cdr list) level)))))))))) - (frob (walk arglist 0 t) t))) - -#+nil -(progn - (assert (equal '(4 4 ("&whole" 4 "&rest" 1) "&body") - (macro-indentation '(bar quux (&rest slots) &body body)))) - (assert (equal nil - (macro-indentation '(a b c &rest more)))) - (assert (equal '(4 4 4 "&body") - (macro-indentation '(a b c &body more)))) - (assert (equal '(("&whole" 4 1 1 "&rest" 1) "&body") - (macro-indentation '((name zot &key foo bar) &body body)))) - (assert (equal nil - (macro-indentation '(x y &key z))))) - -(provide :swank-indentation) diff --git a/elpa/slime-20200414.1444/contrib/swank-jolt.k b/elpa/slime-20200414.1444/contrib/swank-jolt.k deleted file mode 100644 index 93e53abf..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-jolt.k +++ /dev/null @@ -1,998 +0,0 @@ -;;; swank-jolt.k --- Swank server for Jolt -*- goo -*- -;; -;; Copyright (C) 2008 Helmut Eller -;; -;; This file is licensed under the terms of the GNU General Public -;; License as distributed with Emacs (press C-h C-c for details). - -;;; Commentary: -;; -;; Jolt/Coke is a Lisp-like language wich operates at the semantic level of -;; C, i.e. most objects are machine words and memory pointers. The -;; standard boot files define an interface to Id Smalltalk. So we can -;; also pretend to do OOP, but we must be careful to pass properly -;; tagged pointers to Smalltalk. -;; -;; This file only implements a minimum of SLIME's functionality. We -;; install a handler with atexit(3) to invoke the debugger. This way -;; we can stop Jolt from terminating the process on every error. -;; Unfortunately, the backtrace doesn't contain much information and -;; we also have no error message (other than the exit code). Jolt -;; usually prints some message to stdout before calling exit, so you -;; have to look in the *inferior-lisp* buffer for hints. We do -;; nothing (yet) to recover from SIGSEGV. - -;;; Installation -;; -;; 1. Download and build cola. See . -;; I used the svn version: -;; svn co http://piumarta.com/svn2/idst/trunk idst -;; 2. Add something like this to your .emacs: -;; -;; (add-to-list 'slime-lisp-implementations -;; '(jolt (".../idst/function/jolt-burg/main" -;; "boot.k" ".../swank-jolt.k" "-") ; note the "-" -;; :init jolt-slime-init -;; :init-function slime-redirect-inferior-output) -;; (defun jolt-slime-init (file _) (format "%S\n" `(start-swank ,file))) -;; (defun jolt () (interactive) (slime 'jolt)) -;; -;; 3. Use `M-x jolt' to start it. -;; - -;;; Code - -;; In this file I use 2-3 letters for often used names, like DF or -;; VEC, even if those names are abbreviations. I think that after a -;; little getting used to, this style is just as readable as the more -;; traditional DEFUN and VECTOR. Shorter names make it easier to -;; write terse code, in particular 1-line definitions. - -;; `df' is like `defun' in a traditional lisp -(syntax df - (lambda (form compiler) - (printf "df %s ...\n" [[[form second] asString] _stringValue]) - `(define ,[form second] (lambda ,@[form copyFrom: '2])))) - -;; (! args ...) is the same as [args ...] but easier to edit. -(syntax ! - (lambda (form compiler) - (cond ((== [form size] '3) - (if [[form third] isSymbol] - `(send ',[form third] ,[form second]) - [compiler errorSyntax: [form third]])) - ((and [[form size] > '3] - (== [[form size] \\ '2] '0)) - (let ((args [OrderedCollection new]) - (keys [OrderedCollection new]) - (i '2) (len [form size])) - (while (< i len) - (let ((key [form at: i])) - (if (or [key isKeyword] - (and (== i '2) [key isSymbol])) ; for [X + Y] - [keys addLast: [key asString]] - [compiler errorSyntax: key])) - [args addLast: [form at: [i + '1]]] - (set i [i + '2])) - `(send ',[[keys concatenated] asSymbol] ,[form second] ,@args))) - (1 [compiler errorArgumentCount: form])))) - -(define Integer (import "Integer")) -(define Symbol (import "Symbol")) ;; aka. _selector -(define StaticBlockClosure (import "StaticBlockClosure")) -(define BlockClosure (import "BlockClosure")) -(define SequenceableCollection (import "SequenceableCollection")) -(define _vtable (import "_vtable")) -(define ByteArray (import "ByteArray")) -(define CodeGenerator (import "CodeGenerator")) -(define TheGlobalEnvironment (import "TheGlobalEnvironment")) - -(df error (msg) (! Object error: msg)) -(df print-to-string (obj) - (let ((len '200) - (stream (! WriteStream on: (! String new: len)))) - (! stream print: obj) - (! stream contents))) -(df assertion-failed (exp) - (error (! '"Assertion failed: " , (print-to-string exp)))) - -(syntax assert - (lambda (form) - `(if (not ,(! form second)) - (assertion-failed ',(! form second))))) - -(df isa? (obj type) (! obj isKindOf: type)) -(df equal (o1 o2) (! o1 = o2)) - -(define nil 0) -(define false 0) -(define true (! Object notNil)) -(df bool? (obj) (or (== obj false) (== obj true))) -(df int? (obj) (isa? obj Integer)) - -;; In this file the convention X>Y is used for operations that convert -;; X-to-Y. And _ means "machine word". So _>int is the operator that -;; converts a machine word to an Integer. - -(df _>int (word) (! Integer value_: word)) -(df int>_ (i) (! i _integerValue)) - -;; Fixnum operators. Manual tagging/untagging would probably be more -;; efficent than invoking methods. - -(df fix? (obj) (& obj 1)) -(df _>fix (n) (! SmallInteger value_: n)) -(df fix>_ (i) (! i _integerValue)) -(df fx+ (fx1 fx2) (! fx1 + fx2)) -(df fx* (fx1 fx2) (! fx1 * fx2)) -(df fx1+ (fx) (! fx + '1)) -(df fx1- (fx) (! fx - '1)) - -(df str? (obj) (isa? obj String)) -(df >str (o) (! o asString)) -(df str>_ (s) (! s _stringValue)) -(df _>str (s) (! String value_: s)) -(df sym? (obj) (isa? obj Symbol)) -(df seq? (obj) (isa? obj SequenceableCollection)) -(df array? (obj) (isa? obj Array)) -(df len (obj) (! obj size)) -(df len_ (obj) (! (! obj size) _integerValue)) -(df ref (obj idx) (! obj at: idx)) -(df set-ref (obj idx elt) (! obj at: idx put: elt)) -(df first (obj) (! obj first)) -(df second (obj) (! obj second)) - -(df puts (string stream) (! stream nextPutAll: string)) - -(define _GC_base (dlsym "GC_base")) - -;; Is ADDR a pointer to a heap allocated object? The Boehm GC nows -;; such things. This is useful for debugging, because we can quite -;; safely (i.e. without provoking SIGSEGV) access such addresses. -(df valid-pointer? (addr) - (let ((ptr (& addr (~ 1)))) - (and (_GC_base ptr) - (_GC_base (long@ ptr -1))))) - -;; Print OBJ as a Lisp printer would do. -(df prin1 (obj stream) - (cond ((fix? obj) (! stream print: obj)) - ((== obj nil) (puts '"nil" stream)) - ((== obj false) (puts '"#f" stream)) - ((== obj true) (puts '"#t" stream)) - ((not (valid-pointer? obj)) - (begin (puts '"#int obj) stream) - (puts '">" stream))) - ((int? obj) (! stream print: obj)) - ((sym? obj) (puts (>str obj) stream)) - ((isa? obj StaticBlockClosure) - (begin (puts '"#" stream))) - ((and (str? obj) (len obj)) - (! obj printEscapedOn: stream delimited: (ref '"\"" '0))) - ((and (array? obj) (len obj)) - (begin (puts '"(" stream) - (let ((max (- (len_ obj) 1))) - (for (i 0 1 max) - (prin1 (ref obj (_>fix i)) stream) - (if (!= i max) - (puts '" " stream)))) - (puts '")" stream))) - ((and (isa? obj OrderedCollection) (len obj)) - (begin (puts '"#[" stream) - (let ((max (- (len_ obj) 1))) - (for (i 0 1 max) - (prin1 (ref obj (_>fix i)) stream) - (if (!= i max) - (puts '" " stream)))) - (puts '"]" stream))) - (true - (begin (puts '"#<" stream) - (puts (! obj debugName) stream) - (puts '">" stream)))) - obj) - -(df print (obj) - (prin1 obj StdOut) - (puts '"\n" StdOut)) - -(df prin1-to-string (obj) - (let ((len '100) - (stream (! WriteStream on: (! String new: len)))) - (prin1 obj stream) - (! stream contents))) - -;;(df %vable-tally (_vtable) (long@ _vtable)) -(df cr () (printf "\n")) -(df print-object-selectors (obj) - (let ((vtable (! obj _vtable)) - (tally (long@ vtable 0)) - (bindings (long@ vtable 1))) - (for (i 1 1 tally) - (print (long@ (long@ bindings i))) - (cr)))) - -(df print-object-slots (obj) - (let ((size (! obj _sizeof)) - (end (+ obj size))) - (while (< obj end) - (print (long@ obj)) - (cr) - (incr obj 4)))) - -(df intern (string) (! Symbol intern: string)) - -;; Jolt doesn't seem to have an equivalent for gensym, but it's damn -;; hard to write macros without it. So here we adopt the conventions -;; that symbols which look like ".[0-9]+" are reserved for gensym and -;; shouldn't be used for "user visible variables". -(define gensym-counter 0) -(df gensym () - (set gensym-counter (+ gensym-counter 1)) - (intern (! '"." , (>str (_>fix gensym-counter))))) - -;; Surprisingly, SequenceableCollection doesn't have a indexOf method. -;; So we even need to implement such mundane things. -(df index-of (seq elt) - (let ((max (len seq)) - (i '0)) - (while (! i < max) - (if (equal (ref seq i) elt) - (return i) - (set i (! i + '1)))) - nil)) - -(df find-dot (array) (index-of array '.)) - -;; What followes is the implementation of the pattern matching macro MIF. -;; The syntax is (mif (PATTERN EXP) THEN ELSE). -;; The THEN-branch is executed if PATTERN matches the value produced by EXP. -;; ELSE gets only executed if the match failes. -;; A pattern can be -;; 1) a symbol, which matches all values, but also binds the variable to the -;; value -;; 2) (quote LITERAL), matches if the value is `equal' to LITERAL. -;; 3) (PS ...) matches sequences, if the elements match PS. -;; 4) (P1 ... Pn . Ptail) matches if P1 ... Pn match the respective elements -;; at indices 1..n and if Ptail matches the rest -;; of the sequence -;; Examples: -;; (mif (x 10) x 'else) => 10 -;; (mif ('a 'a) 'then 'else) => then -;; (mif ('a 'b) 'then 'else) => else -;; (mif ((a b) '(1 2)) b 'else) => 2 -;; (mif ((a . b) '(1 2)) b 'else) => '(2) -;; (mif ((. x) '(1 2)) x 'else) => '(1 2) - -(define mif% 0) ;; defer -(df mif%array (compiler pattern i value then fail) - ;;(print `(mif%array ,pattern ,i ,value)) - (cond ((== i (len_ pattern)) then) - ((== (ref pattern (_>fix i)) '.) - (begin - (if (!= (- (len_ pattern) 2) i) - (begin - (print pattern) - (! compiler error: (! '"dot in strange position: " - , (>str (_>fix i)))))) - (mif% compiler - (ref pattern (_>fix (+ i 1))) - `(! ,value copyFrom: ',(_>fix i)) - then fail))) - (true - (mif% compiler - (ref pattern (_>fix i)) - `(ref ,value ',(_>fix i)) - (mif%array compiler pattern (+ i 1) value then fail) - fail)))) - -(df mif% (compiler pattern value then fail) - ;;(print `(mif% ,pattern ,value ,then)) - (cond ((== pattern '_) then) - ((== pattern '.) (! compiler errorSyntax: pattern)) - ((sym? pattern) - `(let ((,pattern ,value)) ,then)) - ((seq? pattern) - (cond ((== (len_ pattern) 0) - `(if (== (len_ ,value) 0) ,then (goto ,fail))) - ((== (first pattern) 'quote) - (begin - (if (not (== (len_ pattern) 2)) - (! compiler errorSyntax: pattern)) - `(if (equal ,value ,pattern) ,then (goto ,fail)))) - (true - (let ((tmp (gensym)) (tmp2 (gensym)) - (pos (find-dot pattern))) - `(let ((,tmp2 ,value) - (,tmp ,tmp2)) - (if (and (seq? ,tmp) - ,(if (find-dot pattern) - `(>= (len ,tmp) - ',(_>fix (- (len_ pattern) 2))) - `(== (len ,tmp) ',(len pattern)))) - ,(mif%array compiler pattern 0 tmp then fail) - (goto ,fail))))))) - (true (! compiler errorSyntax: pattern)))) - -(syntax mif - (lambda (node compiler) - ;;(print `(mif ,node)) - (if (not (or (== (len_ node) 4) - (== (len_ node) 3))) - (! compiler errorArgumentCount: node)) - (if (not (and (array? (ref node '1)) - (== (len_ (ref node '1)) 2))) - (! compiler errorSyntax: (ref node '1))) - (let ((pattern (first (ref node '1))) - (value (second (ref node '1))) - (then (ref node '2)) - (else (if (== (len_ node) 4) - (ref node '3) - `(error "mif failed"))) - (destination (gensym)) - (fail (! compiler newLabel)) - (success (! compiler newLabel))) - `(let ((,destination 0)) - ,(mif% compiler pattern value - `(begin (set ,destination ,then) - (goto ,success)) - fail) - (label ,fail) - (set ,destination ,else) - (label ,success) - ,destination)))) - -;; (define *catch-stack* nil) -;; -(df bar (o) (mif ('a o) 'yes 'no)) -(assert (== (bar 'a) 'yes)) -(assert (== (bar 'b) 'no)) -(df foo (o) (mif (('a) o) 'yes 'no)) -(assert (== (foo '(a)) 'yes)) -(assert (== (foo '(b)) 'no)) -(df baz (o) (mif (('a 'b) o) 'yes 'no)) -(assert (== (baz '(a b)) 'yes)) -(assert (== (baz '(a c)) 'no)) -(assert (== (baz '(b c)) 'no)) -(assert (== (baz 'a) 'no)) -(df mifvar (o) (mif (y o) y 'no)) -(assert (== (mifvar 'foo) 'foo)) -(df mifvec (o) (mif ((y) o) y 'no)) -(assert (== (mifvec '(a)) 'a)) -(assert (== (mifvec 'x) 'no)) -(df mifvec2 (o) (mif (('a y) o) y 'no)) -(assert (== (mifvec2 '(a b)) 'b)) -(assert (== (mifvec2 '(b c)) 'no)) -(assert (== (mif ((x) '(a)) x 'no) 'a)) -(assert (== (mif ((x . y) '(a b)) x 'no) 'a)) -(assert (== (mif ((x y . z) '(a b)) y 'no) 'b)) -(assert (equal (mif ((x . y) '(a b)) y 'no) '(b))) -(assert (equal (mif ((. x) '(a b)) x 'no) '(a b))) -(assert (equal (mif (((. x)) '((a b))) x 'no) '(a b))) -(assert (equal (mif (((. x) . y) '((a b) c)) y 'no) '(c))) -(assert (== (mif (() '()) 'yes 'no) 'yes)) -(assert (== (mif (() '(a)) 'yes 'no) 'no)) - -;; Now that we have a somewhat convenient pattern matcher we can write -;; a more convenient macro defining macro: -(syntax defmacro - (lambda (node compiler) - (mif (('defmacro name (. args) . body) node) - (begin - (printf "defmacro %s ...\n" (str>_ (>str name))) - `(syntax ,name - (lambda (node compiler) - (mif ((',name ,@args) node) - (begin ,@body) - (! compiler errorSyntax: node))))) - (! compiler errorSyntax: node)))) - -;; and an even more convenient pattern matcher: -(defmacro mcase (value . clauses) - (let ((tmp (gensym))) - `(let ((,tmp ,value)) - ,(mif (() clauses) - `(begin (print ,tmp) - (error "mcase failed")) - (mif (((pattern . body) . more) clauses) - `(mif (,pattern ,tmp) - (begin ,@(mif (() body) '(0) body)) - (mcase ,tmp ,@more)) - (! compiler errorSyntax: clauses)))))) - -;; and some traditional macros -(defmacro when (test . body) `(if ,test (begin ,@body))) -(defmacro unless (test . body) `(if ,test 0 (begin ,@body))) -(defmacro or (. args) ; the built in OR returns 1 on success. - (mcase args - (() 0) - ((e) e) - ((e1 . more) - (let ((tmp (gensym))) - `(let ((,tmp ,e1)) - (if ,tmp ,tmp (or ,@more))))))) - -(defmacro dotimes_ ((var n) . body) - (let ((tmp (gensym))) - `(let ((,tmp ,n) - (,var 0)) - (while (< ,var ,tmp) - ,@body - (set ,var (+ ,var 1)))))) - -(defmacro dotimes ((var n) . body) - (let ((tmp (gensym))) - `(let ((,tmp ,n) - (,var '0)) - (while (< ,var ,tmp) - ,@body - (set ,var (fx1+ ,var)))))) - -;; DOVEC is like the traditional DOLIST but works on "vectors" -;; i.e. sequences which can be indexed efficently. -(defmacro dovec ((var seq) . body) - (let ((i (gensym)) - (max (gensym)) - (tmp (gensym))) - `(let ((,i 0) - (,tmp ,seq) - (,max (len_ ,tmp))) - (while (< ,i ,max) - (let ((,var (! ,tmp at: (_>fix ,i)))) - ,@body - (set ,i (+ ,i 1))))))) - -;; "Packing" is what Lispers usually call "collecting". -;; The Lisp idiom (let ((result '())) .. (push x result) .. (nreverse result)) -;; translates to (packing (result) .. (pack x result)) -(defmacro packing ((var) . body) - `(let ((,var (! OrderedCollection new))) - ,@body - (! ,var asArray))) - -(df pack (elt packer) (! packer addLast: elt)) - -(assert (equal (packing (p) (dotimes_ (i 2) (pack (_>fix i) p))) - '(0 1))) - -(assert (equal (packing (p) (dovec (e '(2 3)) (pack e p))) - '(2 3))) - -(assert (equal (packing (p) - (let ((a '(2 3))) - (dotimes (i (len a)) - (pack (ref a i) p)))) - '(2 3))) - -;; MAPCAR (more or less) -(df map (fun col) - (packing (r) - (dovec (e col) - (pack (fun e) r)))) - -;; VEC allocates and initializes a new array. -;; The macro translates (vec x y z) to `(,x ,y ,z). -(defmacro vec (. args) - `(quasiquote - (,@(map (lambda (arg) `(,'unquote ,arg)) - args)))) - -(assert (equal (vec '0 '1) '(0 1))) -(assert (equal (vec) '())) -(assert (== (len (vec 0 1 2 3 4)) '5)) - -;; Concatenate. -(defmacro cat (. args) `(! (vec '"" ,@args) concatenated)) - -(assert (equal (cat '"a" '"b" '"c") '"abc")) - -;; Take a vector of bytes and copy the bytes to a continuous -;; block of memory -(df assemble_ (col) (! (! ByteArray withAll: col) _bytes)) - -;; Jolt doesn't seem to have catch/throw or something equivalent. -;; Here I use a pair of assembly routines as substitue. -;; (catch% FUN) calls FUN with the current stack pointer. -;; (throw% VALUE K) unwinds the stack to K and then returns VALUE. -;; catch% is a bit like call/cc. -;; -;; [Would setjmp/longjmp work from Jolt? or does setjmp require -;; C-compiler magic?] -;; [I figure Smalltalk has a way to do non-local-exits but, I don't know -;; how to use that in Jolt.] -;; -(define catch% - (assemble_ - '(0x55 ; push %ebp - 0x89 0xe5 ; mov %esp,%ebp - 0x54 ; push %esp - 0x8b 0x45 0x08 ; mov 0x8(%ebp),%eax - 0xff 0xd0 ; call *%eax - 0xc9 ; leave - 0xc3 ; ret - ))) - -(define throw% - (assemble_ - `(,@'() - 0x8b 0x44 0x24 0x04 ; mov 0x4(%esp),%eax - 0x8b 0x6c 0x24 0x08 ; mov 0x8(%esp),%ebp - 0xc9 ; leave - 0xc3 ; ret - ))) - -(df bar (i k) - (if (== i 0) - (throw% 100 k) - (begin - (printf "bar %d\n" i) - (bar (- i 1) k)))) -(df foo (k) - (printf "foo.1\n") - (printf "foo.2 %d\n" (bar 10 k))) - -;; Our way to produce closures: we compile a new little function which -;; hardcodes the addresses of the code resp. the data-vector. The -;; nice thing is that such closures can be used called C function -;; pointers. It's probably slow to invoke the compiler for such -;; things, so use with care. -(df make-closure (addr state) - (int>_ - (! `(lambda (a b c d) - (,(_>int addr) ,(_>int state) a b c d)) - eval))) - -;; Return a closure which calls FUN with ARGS and the arguments -;; that the closure was called with. -;; Example: ((curry printf "%d\n") 10) -(defmacro curry (fun . args) - `(make-closure - (lambda (state a b c d) - ((ref state '0) - ,@(packing (sv) - (dotimes (i (len args)) - (pack `(ref state ',(fx1+ i)) sv))) - a b c d)) - (vec ,fun ,@args))) - -(df parse-closure-arglist (vars) - (let ((pos (or (index-of vars '|) - (return nil))) - (cvars (! vars copyFrom: '0 to: (fx1- pos))) - (lvars (! vars copyFrom: (fx1+ pos)))) - (vec cvars lvars))) - -;; Create a closure, to-be-closed-over variables must enumerated -;; explicitly. -;; Example: ((let ((x 1)) (closure (x | y) (+ x y))) 3) => 4. -;; The variables before the "|" are captured by the closure. -(defmacro closure ((. vars) . body) - (mif ((cvars lvars) (parse-closure-arglist vars)) - `(curry (lambda (,@cvars ,@lvars) ,@body) - ,@cvars) - (! compiler errorSyntax: vars))) - -;; The analog for Smalltalkish "blocks". -(defmacro block ((. vars) . body) - (mif ((cvars lvars) (parse-closure-arglist vars)) - `(! StaticBlockClosure - function_: (curry (lambda (,@cvars _closure _self ,@lvars) ,@body) - ,@cvars) - arity_: ,(len lvars)) - (! compiler errorSyntax: vars))) - -(define %mkstemp (dlsym "mkstemp")) -(df make-temp-file () - (let ((name (! '"/tmp/jolt-tmp.XXXXXX" copy)) - (fd (%mkstemp (! name _stringValue)))) - (if (== fd -1) - (error "mkstemp failed")) - `(,fd ,name))) -(define %unlink (dlsym "unlink")) -(df unlink (filename) (%unlink (! filename _stringValue))) - -(define write (dlsym "write")) -(df write-bytes (addr count fd) - (let ((written (write fd addr count))) - (if (!= written count) - (begin - (printf "write failed %p %d %d => %d" addr count fd written) - (error '"write failed"))))) - -(define system (dlsym "system")) -(define main (dlsym "main")) - -;; Starting at address ADDR, disassemble COUNT bytes. -;; This is implemented by writing the memory region to a file -;; and call ndisasm on it. -(df disas (addr count) - (let ((fd+name (make-temp-file))) - (write-bytes addr count (first fd+name)) - (let ((cmd (str>_ (cat '"ndisasm -u -o " - (>str (_>fix addr)) - '" " (second fd+name))))) - (printf "Running: %s\n" cmd) - (system cmd)) - (unlink (second fd+name)))) - -(df rep () - (let ((result (! (! CokeScanner read: StdIn) eval))) - (puts '"=> " StdOut) - (print result) - (puts '"\n" StdOut))) - -;; Perhaps we could use setcontext/getcontext to return from signal -;; handlers (or not). -(define +ucontext-size+ 350) -(define _getcontext (dlsym "getcontext")) -(define _setcontext (dlsym "setcontext")) -(df getcontext () - (let ((context (malloc 350))) - (_getcontext context) - context)) - -(define on_exit (dlsym "on_exit")) ; "atexit" doesn't work. why? - -(define *top-level-restart* 0) -(define *top-level-context* 0) -(define *debugger-hook* 0) - -;; Jolt's error handling strategy is charmingly simple: call exit. -;; We invoke the SLIME debugger from an exit handler. -;; (The handler is registered with atexit, that's a libc function.) - -(df exit-handler (reason arg) - (printf "exit-handler 0x%x\n" reason) - ;;(backtrace) - (on_exit exit-handler nil) - (when *debugger-hook* - (*debugger-hook* `(exit ,reason))) - (cond (*top-level-context* - (_setcontext *top-level-context*)) - (*top-level-restart* - (throw% reason *top-level-restart*)))) - -(df repl () - (set *top-level-context* (getcontext)) - (while (not (! (! StdIn readStream) atEnd)) - (printf "top-level\n") - (catch% - (lambda (k) - (set *top-level-restart* k) - (printf "repl\n") - (while 1 - (rep))))) - (printf "EOF\n")) - -;; (repl) - - -;;; Socket code. (How boring. Duh, should have used netcat instead.) - -(define strerror (dlsym "strerror")) - -(df check-os-code (value) - (if (== value -1) - (error (_>str (strerror (fix>_ (! OS errno))))) - value)) - -;; For now just hard-code constants which usually reside in header -;; files (just like a Forth guy would do). -(define PF_INET 2) -(define SOCK_STREAM 1) -(define SOL_SOCKET 1) -(define SO_REUSEADDR 2) -(define socket (dlsym "socket")) -(define setsockopt (dlsym "setsockopt")) - -(df set-reuse-address (sock value) - (let ((word-size 4) - (val (! Object _balloc: (_>fix word-size)))) - (set-int@ val value) - (check-os-code - (setsockopt sock SOL_SOCKET SO_REUSEADDR val word-size)))) - -(define sockaddr_in/size 16) -(define sockaddr_in/sin_family 0) -(define sockaddr_in/sin_port 2) -(define sockaddr_in/sin_addr 4) -(define INADDR_ANY 0) -(define AF_INET 2) -(define htons (dlsym "htons")) -(define bind (dlsym "bind")) - -(df bind-socket (sock port) - (let ((addr (! OS _balloc: (_>fix sockaddr_in/size)))) - (set-short@ (+ addr sockaddr_in/sin_family) AF_INET) - (set-short@ (+ addr sockaddr_in/sin_port) (htons port)) - (set-int@ (+ addr sockaddr_in/sin_addr) INADDR_ANY) - (check-os-code - (bind sock addr sockaddr_in/size)))) - -(define listen (dlsym "listen")) - -(df create-socket (port) - (let ((sock (check-os-code (socket PF_INET SOCK_STREAM 0)))) - (set-reuse-address sock 1) - (bind-socket sock port) - (check-os-code (listen sock 1)) - sock)) - -(define accept% (dlsym "accept")) -(df accept (sock) - (let ((addr (! OS _balloc: (_>fix sockaddr_in/size))) - (len (! OS _balloc: 4))) - (set-int@ len sockaddr_in/size) - (check-os-code (accept% sock addr len)))) - -(define getsockname (dlsym "getsockname")) -(define ntohs (dlsym "ntohs")) -(df local-port (sock) - (let ((addr (! OS _balloc: (_>fix sockaddr_in/size))) - (len (! OS _balloc: 4))) - (set-int@ len sockaddr_in/size) - (check-os-code - (getsockname sock addr len)) - (ntohs (short@ (+ addr sockaddr_in/sin_port))))) - -(define close (dlsym "close")) -(define _read (dlsym "read")) - -;; Now, after 2/3 of the file we can begin with the actual Swank -;; server. - -(df read-string (fd count) - (let ((buffer (! String new: count)) - (buffer_ (str>_ buffer)) - (count_ (int>_ count)) - (start 0)) - (while (> (- count_ start) 0) - (let ((rcount (check-os-code (_read fd - (+ buffer_ start) - (- count_ start))))) - (set start (+ start rcount)))) - buffer)) - -;; Read and parse a message from the wire. -(df read-packet (fd) - (let ((header (read-string fd '6)) - (length (! Integer fromString: header base: '16)) - (payload (read-string fd length))) - (! CokeScanner read: payload))) - -;; Print a messag to the wire. -(df send-to-emacs (event fd) - (let ((stream (! WriteStream on: (! String new: '100)))) - (! stream position: '6) - (prin1 event stream) - (let ((len (! stream position))) - (! stream position: '0) - (! (fx+ len '-6) printOn: stream base: '16 width: '6) - (write-bytes (str>_ (! stream collection)) (int>_ len) fd)))) - -(df add-quotes (form) - (mcase form - ((fun . args) - `(,fun ,@(packing (s) - (dovec (e args) - (pack `(quote ,e) s))))))) - -(define sldb 0) ;defer - -(df eval-for-emacs (form id fd abort) - (let ((old-hook *debugger-hook*)) - (mcase (catch% - (closure (form fd | k) - (set *debugger-hook* (curry sldb fd k)) - `(ok ,(int>_ (! (add-quotes form) eval))))) - (('ok value) - (set *debugger-hook* old-hook) - (send-to-emacs `(:return (:ok ,value) ,id) fd) - 'ok) - (arg - (set *debugger-hook* old-hook) - (send-to-emacs `(:return (:abort) ,id) fd) - (throw% arg abort))))) - -(df process-events (fd) - (on_exit exit-handler nil) - (let ((done nil)) - (while (not done) - (mcase (read-packet fd) - ((':emacs-rex form package thread id) - (mcase (catch% (closure (form id fd | abort) - (eval-for-emacs form id fd abort))) - ('ok) - ;;('abort nil) - ('top-level) - (other - ;;(return other) ; compiler breaks with return - (set done 1)))))))) - -(df next-frame (fp) - (let ((next (get-caller-fp fp))) - (if (and (!= next fp) - (<= next %top-level-fp)) - next - nil))) - -(df nth-frame (n top) - (let ((fp top) - (i 0)) - (while fp - (if (== i n) (return fp)) - (set fp (next-frame fp)) - (set i (+ i 1))) - nil)) - -(define Dl_info/size 16) -(define Dl_info/dli_fname 0) -(define Dl_info/dli_sname 8) - -(df get-dl-sym-name (addr) - (let ((info (! OS _balloc: (_>fix Dl_info/size)))) - (when (== (dladdr addr info) 0) - (return nil)) - (let ((sname (long@ (+ info Dl_info/dli_sname)) ) - (fname (long@ (+ info Dl_info/dli_fname)))) - (cond ((and sname fname) - (cat (_>str sname) '" in " (_>str fname))) - (sname (_>str fname)) - (fname (cat '" " (_>str fname))) - (true nil))))) - -;;(get-dl-sym-name printf) - -(df guess-function-name (ip) - (let ((fname (get-function-name ip))) - (if fname - (_>str fname) - (get-dl-sym-name ip)))) - -(df backtrace>el (top_ from_ to_) - (let ((fp (nth-frame from_ top_)) - (i from_)) - (packing (bt) - (while (and fp (< i to_)) - (let ((ip (get-frame-ip fp))) - (pack (vec (_>int i) - (cat (or (guess-function-name ip) '"(no-name)") - '" " ;;(>str (_>int ip)) - )) - bt)) - (set i (+ i 1)) - (set fp (next-frame fp)))))) - -(df debugger-info (fp msg) - (vec `(,(prin1-to-string msg) " [type ...]" ()) - '(("quit" "Return to top level")) - (backtrace>el fp 0 20) - '())) - -(define *top-frame* 0) -(define *sldb-quit* 0) - -(df debugger-loop (fd args abort) - (let ((fp (get-current-fp))) - (set *top-frame* fp) - (send-to-emacs `(:debug 0 1 ,@(debugger-info fp args)) fd) - (while 1 - (mcase (read-packet fd) - ((':emacs-rex form package thread id) - (mcase (catch% (closure (form id fd | k) - (set *sldb-quit* k) - (eval-for-emacs form id fd k) - 'ok)) - ('ok nil) - (other - (send-to-emacs `(:return (:abort) ,id) fd) - (throw% other abort)))))))) - -(df sldb (fd abort args) - (let ((old-top-frame *top-frame*) - (old-sldb-quit *sldb-quit*)) - (mcase (catch% (curry debugger-loop fd args)) - (value - (set *top-frame* old-top-frame) - (set *sldb-quit* old-sldb-quit) - (send-to-emacs `(:debug-return 0 1 nil) fd) - (throw% value abort))))) - -(df swank:backtrace (start end) - (backtrace>el *top-frame* (int>_ start) (int>_ end))) - -(df sldb-quit () - (assert *sldb-quit*) - (throw% 'top-level *sldb-quit*)) - -(df swank:invoke-nth-restart-for-emacs (...) (sldb-quit)) -(df swank:throw-to-toplevel (...) (sldb-quit)) - -(df setup-server (port announce) - (let ((sock (create-socket port))) - (announce sock) - (let ((client (accept sock))) - (process-events client) - (close client)) - (printf "Closing socket: %d %d\n" sock (local-port sock)) - (close sock))) - -(df announce-port (sock) - (printf "Listening on port: %d\n" (local-port sock))) - -(df create-server (port) (setup-server port announce-port)) - -(df write-port-file (filename sock) - (let ((f (! File create: filename))) - (! f write: (print-to-string (_>int (local-port sock)))) - (! f close))) - -(df start-swank (port-file) - (setup-server 0 (curry write-port-file (_>str port-file)))) - -(define getpid (dlsym "getpid")) -(df swank:connection-info () - `(,@'() - :pid ,(_>int (getpid)) - :style nil - :lisp-implementation (,@'() - :type "Coke" - :name "jolt" - :version ,(! CodeGenerator versionString)) - :machine (:instance "" :type ,(! OS architecture) :version "") - :features () - :package (:name "jolt" :prompt "jolt"))) - -(df swank:listener-eval (string) - (let ((result (! (! CokeScanner read: string) eval))) - `(:values ,(prin1-to-string (if (or (fix? result) - (and (valid-pointer? result) - (int? result))) - (int>_ result) - result)) - ,(prin1-to-string result)))) - -(df swank:interactive-eval (string) - (let ((result (! (! CokeScanner read: string) eval))) - (cat '"=> " (prin1-to-string (if (or (fix? result) - (and (valid-pointer? result) - (int? result))) - (int>_ result) - result)) - '", " (prin1-to-string result)))) - -(df swank:operator-arglist () nil) -(df swank:buffer-first-change () nil) -(df swank:create-repl (_) '("jolt" "jolt")) - -(df min (x y) (if (<= x y) x y)) - -(df common-prefix2 (e1 e2) - (let ((i '0) - (max (min (len e1) (len e2)))) - (while (and (< i max) - (== (ref e1 i) (ref e2 i))) - (set i (fx1+ i))) - (! e1 copyFrom: '0 to: (fx1- i)))) - -(df common-prefix (seq) - (mcase seq - (() nil) - (_ - (let ((prefix (ref seq '0))) - (dovec (e seq) - (set prefix (common-prefix2 prefix e))) - prefix)))) - -(df swank:simple-completions (prefix _package) - (let ((matches (packing (s) - (dovec (e (! TheGlobalEnvironment keys)) - (let ((name (>str e))) - (when (! name beginsWith: prefix) - (pack name s))))))) - (vec matches (or (common-prefix matches) prefix)))) - - -;; swank-jolt.k ends here diff --git a/elpa/slime-20200414.1444/contrib/swank-kawa.scm b/elpa/slime-20200414.1444/contrib/swank-kawa.scm deleted file mode 100644 index 3dd9c07a..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-kawa.scm +++ /dev/null @@ -1,2504 +0,0 @@ -;;;; swank-kawa.scm --- Swank server for Kawa -;;; -;;; Copyright (C) 2007 Helmut Eller -;;; -;;; This file is licensed under the terms of the GNU General Public -;;; License as distributed with Emacs (press C-h C-c for details). - -;;;; Installation -;; -;; 1. You need Kawa (version 2.x) and a JVM with debugger support. -;; -;; 2. Compile this file and create swank-kawa.jar with: -;; java -cp kawa.jar:$JAVA_HOME/lib/tools.jar \ -;; -Xss2M kawa.repl --r7rs -d classes -C swank-kawa.scm && -;; jar cf swank-kawa.jar -C classes . -;; -;; 3. Add something like this to your .emacs: -#| -;; Kawa, Swank, and the debugger classes (tools.jar) must be in the -;; classpath. You also need to start the debug agent. -(setq slime-lisp-implementations - '((kawa - ("java" - ;; needed jar files - "-cp" "kawa-2.0.1.jar:swank-kawa.jar:/opt/jdk1.8.0/lib/tools.jar" - ;; channel for debugger - "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n" - ;; depending on JVM, compiler may need more stack - "-Xss2M" - ;; kawa without GUI - "kawa.repl" "-s") - :init kawa-slime-init))) - -(defun kawa-slime-init (file _) - (setq slime-protocol-version 'ignore) - (format "%S\n" - `(begin (import (swank-kawa)) - (start-swank ,file) - ;; Optionally add source paths of your code so - ;; that M-. works better: - ;;(set! swank-java-source-path - ;; (append - ;; '(,(expand-file-name "~/lisp/slime/contrib/") - ;; "/scratch/kawa") - ;; swank-java-source-path)) - ))) - -;; Optionally define a command to start it. -(defun kawa () - (interactive) - (slime 'kawa)) - -|# -;; 4. Start everything with M-- M-x slime kawa -;; -;; - - -;;; Code: - -(define-library (swank macros) - (export df fun seq set fin esc - ! !! !s @ @s - when unless while dotimes dolist for packing with pushf == assert - mif mcase mlet mlet* typecase ignore-errors - ferror - ) - (import (scheme base) - (only (kawa base) - syntax - quasisyntax - syntax-case - define-syntax-case - identifier? - - invoke - invoke-static - field - static-field - instance? - try-finally - try-catch - primitive-throw - - format - reverse! - as - )) - (begin " -(" - -(define (ferror fstring #!rest args) - (let ((err ( - (as (apply format fstring args))))) - (primitive-throw err))) - -(define (rewrite-lambda-list args) - (syntax-case args () - (() #`()) - ((rest x ...) (eq? #'rest #!rest) args) - ((optional x ...) (eq? #'optional #!optional) args) - ((var args ...) (identifier? #'var) - #`(var #,@(rewrite-lambda-list #'(args ...)))) - (((var type) args ...) (identifier? #'var) - #`((var :: type) #,@(rewrite-lambda-list #'(args ...)))))) - -(define-syntax df - (lambda (stx) - (syntax-case stx (=>) - ((df name (args ... => return-type) body ...) - #`(define (name #,@(rewrite-lambda-list #'(args ...))) :: return-type - (seq body ...))) - ((df name (args ...) body ...) - #`(define (name #,@(rewrite-lambda-list #'(args ...))) - (seq body ...)))))) - -(define-syntax fun - (lambda (stx) - (syntax-case stx (=>) - ((fun (args ... => return-type) body ...) - #`(lambda #,(rewrite-lambda-list #'(args ...)) :: return-type - (seq body ...))) - ((fun (args ...) body ...) - #`(lambda #,(rewrite-lambda-list #'(args ...)) - (seq body ...)))))) - -(define-syntax fin - (syntax-rules () - ((fin body handler ...) - (try-finally body (seq handler ...))))) - -(define-syntax seq - (syntax-rules () - ((seq) - (begin #!void)) - ((seq body ...) - (begin body ...)))) - -(define-syntax esc - (syntax-rules () - ((esc abort body ...) - (let* ((key ()) - (abort (lambda (val) (throw key val)))) - (catch key - (lambda () body ...) - (lambda (key val) val)))))) - -(define-syntax ! - (syntax-rules () - ((! name obj args ...) - (invoke obj 'name args ...)))) - -(define-syntax !! - (syntax-rules () - ((!! name1 name2 obj args ...) - (! name1 (! name2 obj args ...))))) - -(define-syntax !s - (syntax-rules () - ((! class name args ...) - (invoke-static class 'name args ...)))) - -(define-syntax @ - (syntax-rules () - ((@ name obj) - (field obj 'name)))) - -(define-syntax @s - (syntax-rules (quote) - ((@s class name) - (static-field class (quote name))))) - -(define-syntax while - (syntax-rules () - ((while exp body ...) - (do () ((not exp)) body ...)))) - -(define-syntax dotimes - (syntax-rules () - ((dotimes (i n result) body ...) - (let ((max :: n)) - (do ((i :: 0 (as (+ i 1)))) - ((= i max) result) - body ...))) - ((dotimes (i n) body ...) - (dotimes (i n #f) body ...)))) - -(define-syntax dolist - (syntax-rules () - ((dolist (e list) body ... ) - (for ((e list)) body ...)))) - -(define-syntax for - (syntax-rules () - ((for ((var iterable)) body ...) - (let ((iter (! iterator iterable))) - (while (! has-next iter) - ((lambda (var) body ...) - (! next iter))))))) - -(define-syntax packing - (syntax-rules () - ((packing (var) body ...) - (let ((var :: '())) - (let ((var (lambda (v) (set! var (cons v var))))) - body ...) - (reverse! var))))) - -;;(define-syntax loop -;; (syntax-rules (for = then collect until) -;; ((loop for var = init then step until test collect exp) -;; (packing (pack) -;; (do ((var init step)) -;; (test) -;; (pack exp)))) -;; ((loop while test collect exp) -;; (packing (pack) (while test (pack exp)))))) - -(define-syntax with - (syntax-rules () - ((with (vars ... (f args ...)) body ...) - (f args ... (lambda (vars ...) body ...))))) - -(define-syntax pushf - (syntax-rules () - ((pushf value var) - (set! var (cons value var))))) - -(define-syntax == - (syntax-rules () - ((== x y) - (eq? x y)))) - -(define-syntax set - (syntax-rules () - ((set x y) - (let ((tmp y)) - (set! x tmp) - tmp)) - ((set x y more ...) - (begin (set! x y) (set more ...))))) - -(define-syntax assert - (syntax-rules () - ((assert test) - (seq - (when (not test) - (error "Assertion failed" 'test)) - 'ok)) - ((assert test fstring args ...) - (seq - (when (not test) - (error "Assertion failed" 'test (format #f fstring args ...))) - 'ok)))) - -(define-syntax mif - (syntax-rules (quote unquote _) - ((mif ('x value) then else) - (if (equal? 'x value) then else)) - ((mif (,x value) then else) - (if (eq? x value) then else)) - ((mif (() value) then else) - (if (eq? value '()) then else)) - #| This variant produces no lambdas but breaks the compiler - ((mif ((p . ps) value) then else) - (let ((tmp value) - (fail? :: 0) - (result #!null)) - (if (instance? tmp ) - (let ((tmp :: tmp)) - (mif (p (! get-car tmp)) - (mif (ps (! get-cdr tmp)) - (set! result then) - (set! fail? -1)) - (set! fail? -1))) - (set! fail? -1)) - (if (= fail? 0) result else))) - |# - ((mif ((p . ps) value) then else) - (let ((fail (lambda () else)) - (tmp value)) - (if (instance? tmp ) - (let ((tmp :: tmp)) - (mif (p (! get-car tmp)) - (mif (ps (! get-cdr tmp)) - then - (fail)) - (fail))) - (fail)))) - ((mif (_ value) then else) - then) - ((mif (var value) then else) - (let ((var value)) then)) - ((mif (pattern value) then) - (mif (pattern value) then (values))))) - -(define-syntax mcase - (syntax-rules () - ((mcase exp (pattern body ...) more ...) - (let ((tmp exp)) - (mif (pattern tmp) - (begin body ...) - (mcase tmp more ...)))) - ((mcase exp) (ferror "mcase failed ~s\n~a" 'exp exp)))) - -(define-syntax mlet - (syntax-rules () - ((mlet (pattern value) body ...) - (let ((tmp value)) - (mif (pattern tmp) - (begin body ...) - (error "mlet failed" tmp)))))) - -(define-syntax mlet* - (syntax-rules () - ((mlet* () body ...) (begin body ...)) - ((mlet* ((pattern value) ms ...) body ...) - (mlet (pattern value) (mlet* (ms ...) body ...))))) - -(define-syntax typecase% - (syntax-rules (eql or satisfies) - ((typecase% var (#t body ...) more ...) - (seq body ...)) - ((typecase% var ((eql value) body ...) more ...) - (cond ((eqv? var 'value) body ...) - (else (typecase% var more ...)))) - ((typecase% var ((satisfies predicate) body ...) more ...) - (cond ((predicate var) body ...) - (else (typecase% var more ...)))) - ((typecase% var ((or type) body ...) more ...) - (typecase% var (type body ...) more ...)) - ((typecase% var ((or type ...) body ...) more ...) - (let ((f (lambda (var) body ...))) - (typecase% var - (type (f var)) ... - (#t (typecase% var more ...))))) - ((typecase% var (type body ...) more ...) - (cond ((instance? var type) - (let ((var :: type (as type var))) - body ...)) - (else (typecase% var more ...)))) - ((typecase% var) - (error "typecase% failed" var - (! getClass (as var)))))) - -(define-syntax typecase - (lambda (stx) - (syntax-case stx () - ((_ exp more ...) (identifier? (syntax exp)) - #`(typecase% exp more ...)) - ((_ exp more ...) - #`(let ((tmp exp)) - (typecase% tmp more ...)))))) - -(define-syntax ignore-errors - (syntax-rules () - ((ignore-errors body ...) - (try-catch (seq body ...) - (v #f) - (v #f))))) - -)) - -(define-library (swank-kawa) - (export start-swank - create-swank-server - swank-java-source-path - break) - (import (scheme base) - (scheme file) - (scheme repl) - (scheme read) - (scheme write) - (scheme eval) - (scheme process-context) - (swank macros) - (only (kawa base) - - define-alias - define-variable - - define-simple-class - this - - invoke-special - instance? - as - - primitive-throw - try-finally - try-catch - synchronized - - call-with-input-string - call-with-output-string - force-output - format - - make-process - command-parse - - runnable - - scheme-implementation-version - reverse! - ) - (rnrs hashtables) - (only (gnu kawa slib syntaxutils) expand) - (only (kawa regex) regex-match)) - (begin " -(" - - -;;(define-syntax dc -;; (syntax-rules () -;; ((dc name () %% (props ...) prop more ...) -;; (dc name () %% (props ... (prop )) more ...)) -;; ;;((dc name () %% (props ...) (prop type) more ...) -;; ;; (dc name () %% (props ... (prop type)) more ...)) -;; ((dc name () %% ((prop type) ...)) -;; (define-simple-class name () -;; ((*init* (prop :: type) ...) -;; (set (field (this) 'prop) prop) ...) -;; (prop :type type) ...)) -;; ((dc name () props ...) -;; (dc name () %% () props ...)))) - - -;;;; Aliases - -(define-alias java.net.ServerSocket) -(define-alias java.net.Socket) -(define-alias java.io.InputStreamReader) -(define-alias java.io.OutputStreamWriter) -(define-alias gnu.kawa.io.InPort) -(define-alias gnu.kawa.io.OutPort) -(define-alias java.io.File) -(define-alias java.lang.String) -(define-alias java.lang.StringBuilder) -(define-alias java.lang.Throwable) -(define-alias gnu.text.SourceError) -(define-alias gnu.expr.ModuleInfo) -(define-alias java.lang.Iterable) -(define-alias java.lang.Thread) -(define-alias java.util.concurrent.LinkedBlockingQueue) -(define-alias java.util.concurrent.Exchanger) -(define-alias java.util.concurrent.TimeUnit) -(define-alias com.sun.jdi.VirtualMachine) -(define-alias com.sun.jdi.Mirror) -(define-alias com.sun.jdi.Value) -(define-alias com.sun.jdi.ThreadReference) -(define-alias com.sun.jdi.ObjectReference) -(define-alias com.sun.jdi.ArrayReference) -(define-alias com.sun.jdi.StringReference) -(define-alias com.sun.jdi.Method) -(define-alias com.sun.jdi.ClassType) -(define-alias com.sun.jdi.ReferenceType) -(define-alias com.sun.jdi.StackFrame) -(define-alias com.sun.jdi.Field) -(define-alias com.sun.jdi.LocalVariable) -(define-alias com.sun.jdi.Location) -(define-alias com.sun.jdi.AbsentInformationException) -(define-alias com.sun.jdi.event.Event) -(define-alias com.sun.jdi.event.ExceptionEvent) -(define-alias com.sun.jdi.event.StepEvent) -(define-alias com.sun.jdi.event.BreakpointEvent) -(define-alias gnu.mapping.Environment) - -(define-simple-class () - (owner :: #:init (!s java.lang.Thread currentThread)) - (peer :: ) - (queue :: #:init ()) - (lock #:init ())) - - -;;;; Entry Points - -(df create-swank-server (port-number) - (setup-server port-number announce-port)) - -(df start-swank (port-file) - (let ((announce (fun ((socket )) - (with (f (call-with-output-file port-file)) - (format f "~d\n" (! get-local-port socket)))))) - (spawn (fun () - (setup-server 0 announce))))) - -(df setup-server ((port-number ) announce) - (! set-name (current-thread) "swank") - (let ((s ( port-number))) - (announce s) - (let ((c (! accept s))) - (! close s) - (log "connection: ~s\n" c) - (fin (dispatch-events c) - (log "closing socket: ~a\n" s) - (! close c))))) - -(df announce-port ((socket )) - (log "Listening on port: ~d\n" (! get-local-port socket))) - - -;;;; Event dispatcher - -(define-variable *the-vm* #f) -(define-variable *last-exception* #f) -(define-variable *last-stacktrace* #f) -(df %vm (=> ) *the-vm*) - -;; FIXME: this needs factorization. But I guess the whole idea of -;; using bidirectional channels just sucks. Mailboxes owned by a -;; single thread to which everybody can send are much easier to use. - -(df dispatch-events ((s )) - (mlet* ((charset "iso-8859-1") - (ins ( (! getInputStream s) charset)) - (outs ( (! getOutputStream s) charset)) - ((in . _) (spawn/chan/catch (fun (c) (reader ins c)))) - ((out . _) (spawn/chan/catch (fun (c) (writer outs c)))) - ((dbg . _) (spawn/chan/catch vm-monitor)) - (user-env (interaction-environment)) - (x (seq - (! set-flag user-env #t #|:THREAD_SAFE|# 8) - (! set-flag user-env #f #|:DIRECT_INHERITED_ON_SET|# 16) - #f)) - ((listener . _) - (spawn/chan (fun (c) (listener c user-env)))) - (inspector #f) - (threads '()) - (repl-thread #f) - (extra '()) - (vm (let ((vm #f)) (fun () (or vm (rpc dbg `(get-vm))))))) - (while #t - (mlet ((c . event) (recv* (append (list in out dbg listener) - (if inspector (list inspector) '()) - (map car threads) - extra))) - ;;(log "event: ~s\n" event) - (mcase (list c event) - ((_ (':emacs-rex ('|swank:debugger-info-for-emacs| from to) - pkg thread id)) - (send dbg `(debug-info ,thread ,from ,to ,id))) - ((_ (':emacs-rex ('|swank:throw-to-toplevel|) pkg thread id)) - (send dbg `(throw-to-toplevel ,thread ,id))) - ((_ (':emacs-rex ('|swank:sldb-continue|) pkg thread id)) - (send dbg `(thread-continue ,thread ,id))) - ((_ (':emacs-rex ('|swank:frame-source-location| frame) - pkg thread id)) - (send dbg `(frame-src-loc ,thread ,frame ,id))) - ((_ (':emacs-rex ('|swank:frame-locals-and-catch-tags| frame) - pkg thread id)) - (send dbg `(frame-details ,thread ,frame ,id))) - ((_ (':emacs-rex ('|swank:sldb-disassemble| frame) - pkg thread id)) - (send dbg `(disassemble-frame ,thread ,frame ,id))) - ((_ (':emacs-rex ('|swank:backtrace| from to) pkg thread id)) - (send dbg `(thread-frames ,thread ,from ,to ,id))) - ((_ (':emacs-rex ('|swank:list-threads|) pkg thread id)) - (send dbg `(list-threads ,id))) - ((_ (':emacs-rex ('|swank:debug-nth-thread| n) _ _ _)) - (send dbg `(debug-nth-thread ,n))) - ((_ (':emacs-rex ('|swank:quit-thread-browser|) _ _ id)) - (send dbg `(quit-thread-browser ,id))) - ((_ (':emacs-rex ('|swank:init-inspector| str . _) pkg _ id)) - (set inspector (make-inspector user-env (vm))) - (send inspector `(init ,str ,id))) - ((_ (':emacs-rex ('|swank:inspect-frame-var| frame var) - pkg thread id)) - (mlet ((im . ex) (chan)) - (set inspector (make-inspector user-env (vm))) - (send dbg `(get-local ,ex ,thread ,frame ,var)) - (send inspector `(init-mirror ,im ,id)))) - ((_ (':emacs-rex ('|swank:inspect-current-condition|) pkg thread id)) - (mlet ((im . ex) (chan)) - (set inspector (make-inspector user-env (vm))) - (send dbg `(get-exception ,ex ,thread)) - (send inspector `(init-mirror ,im ,id)))) - ((_ (':emacs-rex ('|swank:inspect-nth-part| n) pkg _ id)) - (send inspector `(inspect-part ,n ,id))) - ((_ (':emacs-rex ('|swank:inspector-pop|) pkg _ id)) - (send inspector `(pop ,id))) - ((_ (':emacs-rex ('|swank:quit-inspector|) pkg _ id)) - (send inspector `(quit ,id))) - ((_ (':emacs-interrupt id)) - (let* ((vm (vm)) - (t (find-thread id (map cdr threads) repl-thread vm))) - (send dbg `(interrupt-thread ,t)))) - ((_ (':emacs-rex form _ _ id)) - (send listener `(,form ,id))) - ((_ ('get-vm c)) - (send dbg `(get-vm ,c))) - ((_ ('get-channel c)) - (mlet ((im . ex) (chan)) - (pushf im extra) - (send c ex))) - ((_ ('forward x)) - (send out x)) - ((_ ('set-listener x)) - (set repl-thread x)) - ((_ ('publish-vm vm)) - (set *the-vm* vm)) - ))))) - -(df find-thread (id threads listener (vm )) - (cond ((== id ':repl-thread) listener) - ((== id 't) listener - ;;(if (null? threads) - ;; listener - ;; (vm-mirror vm (car threads))) - ) - (#t - (let ((f (find-if threads - (fun (t :: ) - (= id (! uniqueID - (as (vm-mirror vm t))))) - #f))) - (cond (f (vm-mirror vm f)) - (#t listener)))))) - - -;;;; Reader thread - -(df reader ((in ) (c )) - (! set-name (current-thread) "swank-net-reader") - (let ((rt (!s gnu.kawa.lispexpr.ReadTable createInitial))) ; ':' not special - (while #t - (send c (decode-message in rt))))) - -(df decode-message ((in ) (rt ) => ) - (let* ((header (read-chunk in 6)) - (len (!s java.lang.Integer parseInt header 16))) - (call-with-input-string (read-chunk in len) - (fun ((port )) - (%read port rt))))) - -(df read-chunk ((in ) (len ) => ) - (let ((chars ( #:length len))) - (let loop ((offset :: 0)) - (cond ((= offset len) ( chars)) - (#t (let ((count (! read in chars offset (- len offset)))) - (assert (not (= count -1)) "partial packet") - (loop (+ offset count)))))))) - -;;; FIXME: not thread safe -(df %read ((port ) (table )) - (let ((old (!s gnu.kawa.lispexpr.ReadTable getCurrent))) - (try-finally - (seq (!s gnu.kawa.lispexpr.ReadTable setCurrent table) - (read port)) - (!s gnu.kawa.lispexpr.ReadTable setCurrent old)))) - - -;;;; Writer thread - -(df writer ((out ) (c )) - (! set-name (current-thread) "swank-net-writer") - (while #t - (encode-message out (recv c)))) - -(df encode-message ((out ) (message )) - (let ((builder ( (as 512)))) - (print-for-emacs message builder) - (! write out (! toString (format "~6,'0x" (! length builder)))) - (! write out builder) - (! flush out))) - -(df print-for-emacs (obj (out )) - (let ((pr (fun (o) (! append out (! toString (format "~s" o))))) - (++ (fun ((s )) (! append out (! toString s))))) - (cond ((null? obj) (++ "nil")) - ((string? obj) (pr obj)) - ((number? obj) (pr obj)) - ;;((keyword? obj) (++ ":") (! append out (to-str obj))) - ((symbol? obj) (pr obj)) - ((pair? obj) - (++ "(") - (let loop ((obj obj)) - (print-for-emacs (car obj) out) - (let ((cdr (cdr obj))) - (cond ((null? cdr) (++ ")")) - ((pair? cdr) (++ " ") (loop cdr)) - (#t (++ " . ") (print-for-emacs cdr out) (++ ")")))))) - (#t (error "Unprintable object" obj))))) - -;;;; SLIME-EVAL - -(df eval-for-emacs ((form ) env (id ) (c )) - ;;(! set-uncaught-exception-handler (current-thread) - ;; ( (fun (t e) (reply-abort c id)))) - (reply c (%eval form env) id)) - -(define-variable *slime-funs*) -(set *slime-funs* (tab)) - -(df %eval (form env) - (apply (lookup-slimefun (car form) *slime-funs*) env (cdr form))) - -(df lookup-slimefun ((name ) tab) - ;; name looks like '|swank:connection-info| - (or (get tab name #f) - (ferror "~a not implemented" name))) - -(df %defslimefun ((name ) (fun )) - (let ((string (symbol->string name))) - (cond ((regex-match #/:/ string) - (put *slime-funs* name fun)) - (#t - (let ((qname (string->symbol (string-append "swank:" string)))) - (put *slime-funs* qname fun)))))) - -(define-syntax defslimefun - (syntax-rules () - ((defslimefun name (args ...) body ...) - (seq - (df name (args ...) body ...) - (%defslimefun 'name name))))) - -(defslimefun connection-info ((env )) - (let ((prop (fun (name) (!s java.lang.System getProperty name)))) - `(:pid - 0 - :style :spawn - :lisp-implementation (:type "Kawa" :name "kawa" - :version ,(scheme-implementation-version)) - :machine (:instance ,(prop "java.vm.name") :type ,(prop "os.name") - :version ,(prop "java.runtime.version")) - :features () - :package (:name "??" :prompt ,(! getName env)) - :encoding (:coding-systems ("iso-8859-1")) - ))) - - -;;;; Listener - -(df listener ((c ) (env )) - (! set-name (current-thread) "swank-listener") - (log "listener: ~s ~s ~s ~s\n" - (current-thread) (! hashCode (current-thread)) c env) - (let ((out (make-swank-outport (rpc c `(get-channel))))) - (set (current-output-port) out) - (let ((vm (as (rpc c `(get-vm))))) - (send c `(set-listener ,(vm-mirror vm (current-thread)))) - (request-uncaught-exception-events vm) - ;;stack snaphost are too expensive - ;;(request-caught-exception-events vm) - ) - (rpc c `(get-vm)) - (listener-loop c env out))) - -(define-simple-class () - ((*init*) - (invoke-special (this) '*init* )) - ((abort) :: void - (primitive-throw (this)))) - -(df listener-loop ((c ) (env ) port) - (while (not (nul? c)) - ;;(log "listener-loop: ~s ~s\n" (current-thread) c) - (mlet ((form id) (recv c)) - (let ((restart (fun () - (close-port port) - (reply-abort c id) - (send (car (spawn/chan - (fun (cc) - (listener (recv cc) env)))) - c) - (set c #!null)))) - (! set-uncaught-exception-handler (current-thread) - ( (fun (t e) (restart)))) - (try-catch - (let* ((val (%eval form env))) - (force-output) - (reply c val id)) - (ex (invoke-debugger ex) (restart)) - (ex (invoke-debugger ex) (restart)) - (ex - (let ((flag (!s java.lang.Thread interrupted))) - (log "listener-abort: ~s ~a\n" ex flag)) - (restart)) - ))))) - -(df invoke-debugger (condition) - ;;(log "should now invoke debugger: ~a" condition) - (try-catch - (break condition) - (ex (seq)))) - -(defslimefun |swank-repl:create-repl| (env #!rest _) - (list "user" "user")) - -(defslimefun interactive-eval (env str) - (values-for-echo-area (eval (read-from-string str) env))) - -(defslimefun interactive-eval-region (env (s )) - (with (port (call-with-input-string s)) - (values-for-echo-area - (let next ((result (values))) - (let ((form (read port))) - (cond ((== form #!eof) result) - (#t (next (eval form env))))))))) - -(defslimefun |swank-repl:listener-eval| (env string) - (let* ((form (read-from-string string)) - (list (values-to-list (eval form env)))) - `(:values ,@(map pprint-to-string list)))) - -(defslimefun pprint-eval (env string) - (let* ((form (read-from-string string)) - (l (values-to-list (eval form env)))) - (apply cat (map pprint-to-string l)))) - -(defslimefun eval-and-grab-output (env string) - (let ((form (read (open-input-string string)))) - (let-values ((values (eval form env))) - (list "" - (format #f "~{~S~^~%~}" values))))) - -(df call-with-abort (f) - (try-catch (f) (ex (exception-message ex)))) - -(df exception-message ((ex )) - (typecase ex - ( (! to-string ex)) - ( (format "~a: ~a" - (class-name-sans-package ex) - (! getMessage ex))))) - -(df values-for-echo-area (values) - (let ((values (values-to-list values))) - (cond ((null? values) "; No value") - (#t (format "~{~a~^, ~}" (map pprint-to-string values)))))) - -;;;; Compilation - -(defslimefun compile-file-for-emacs (env (filename ) load? - #!optional options) - (let ((jar (cat (path-sans-extension (filepath filename)) ".jar"))) - (wrap-compilation - (fun ((m )) - (!s kawa.lang.CompileFile read filename m)) - jar (if (lisp-bool load?) env #f) #f))) - -(df wrap-compilation (f jar env delete?) - (let ((start-time (current-time)) - (messages ())) - (try-catch - (let ((c (as (f messages)))) - (set (@ explicit c) #t) - (! compile-to-archive c (! get-module c) jar)) - (ex - (log "error during compilation: ~a\n~a" ex (! getStackTrace ex)) - (! error messages (as #\f) - (to-str (exception-message ex)) #!null) - #f)) - (log "compilation done.\n") - (let ((success? (zero? (! get-error-count messages)))) - (when (and env success?) - (log "loading ...\n") - (eval `(load ,jar) env) - (log "loading ... done.\n")) - (when delete? - (ignore-errors (delete-file jar) #f)) - (let ((end-time (current-time))) - (list ':compilation-result - (compiler-notes-for-emacs messages) - (if success? 't 'nil) - (/ (- end-time start-time) 1000.0)))))) - -(defslimefun compile-string-for-emacs (env string buffer offset dir) - (wrap-compilation - (fun ((m )) - (let ((c (as - (call-with-input-string - string - (fun ((p )) - (! set-path p - (format "~s" - `(buffer ,buffer offset ,offset str ,string))) - (!s kawa.lang.CompileFile read p m)))))) - (let ((o (@ currentOptions c))) - (! set o "warn-invoke-unknown-method" #t) - (! set o "warn-undefined-variable" #t)) - (let ((m (! getModule c))) - (! set-name m (format ":~a/~a" buffer (current-time)))) - c)) - "/tmp/kawa-tmp.zip" env #t)) - -(df compiler-notes-for-emacs ((messages )) - (packing (pack) - (do ((e (! get-errors messages) (@ next e))) - ((nul? e)) - (pack (source-error>elisp e))))) - -(df source-error>elisp ((e ) => ) - (list ':message (to-string (@ message e)) - ':severity (case (integer->char (@ severity e)) - ((#\e #\f) ':error) - ((#\w) ':warning) - (else ':note)) - ':location (error-loc>elisp e))) - -(df error-loc>elisp ((e )) - (cond ((nul? (@ filename e)) `(:error "No source location")) - ((! starts-with (@ filename e) "(buffer ") - (mlet (('buffer b 'offset ('quote ((:position o) _)) 'str s) - (read-from-string (@ filename e))) - (let ((off (line>offset (1- (@ line e)) s)) - (col (1- (@ column e)))) - `(:location (:buffer ,b) (:position ,(+ o off col)) nil)))) - (#t - `(:location (:file ,(to-string (@ filename e))) - (:line ,(@ line e) ,(1- (@ column e))) - nil)))) - -(df line>offset ((line ) (s ) => ) - (let ((offset :: 0)) - (dotimes (i line) - (set offset (! index-of s (as #\newline) offset)) - (assert (>= offset 0)) - (set offset (as (+ offset 1)))) - (log "line=~a offset=~a\n" line offset) - offset)) - -(defslimefun load-file (env filename) - (format "Loaded: ~a => ~s" filename (eval `(load ,filename) env))) - -;;;; Completion - -(defslimefun simple-completions (env (pattern ) _) - (let* ((env (as env)) - (matches (packing (pack) - (let ((iter (! enumerate-all-locations env))) - (while (! has-next iter) - (let ((l (! next-location iter))) - (typecase l - ( - (let ((name (!! get-name get-key-symbol l))) - (when (! starts-with name pattern) - (pack name))))))))))) - `(,matches ,(cond ((null? matches) pattern) - (#t (fold+ common-prefix matches)))))) - -(df common-prefix ((s1 ) (s2 ) => ) - (let ((limit (min (! length s1) (! length s2)))) - (let loop ((i 0)) - (cond ((or (= i limit) - (not (== (! char-at s1 i) - (! char-at s2 i)))) - (! substring s1 0 i)) - (#t (loop (1+ i))))))) - -(df fold+ (f list) - (let loop ((s (car list)) - (l (cdr list))) - (cond ((null? l) s) - (#t (loop (f s (car l)) (cdr l)))))) - -;;; Quit - -(defslimefun quit-lisp (env) - (exit)) - -;;(defslimefun set-default-directory (env newdir)) - - -;;;; Dummy defs - -(defslimefun buffer-first-change (#!rest y) '()) -(defslimefun swank-require (#!rest y) '()) -(defslimefun frame-package-name (#!rest y) '()) - -;;;; arglist - -(defslimefun operator-arglist (env name #!rest _) - (mcase (try-catch `(ok ,(eval (read-from-string name) env)) - (ex 'nil)) - (('ok obj) - (mcase (arglist obj) - ('#f 'nil) - ((args rtype) - (format "(~a~{~^ ~a~})~a" name - (map (fun (e) - (if (equal (cadr e) "java.lang.Object") (car e) e)) - args) - (if (equal rtype "java.lang.Object") - "" - (format " => ~a" rtype)))))) - (_ 'nil))) - -(df arglist (obj) - (typecase obj - ( - (let* ((mref (module-method>meth-ref obj))) - (list (mapi (! arguments mref) - (fun ((v )) - (list (! name v) (! typeName v)))) - (! returnTypeName mref)))) - ( #f))) - -;;;; M-. - -(defslimefun find-definitions-for-emacs (env name) - (mcase (try-catch `(ok ,(eval (read-from-string name) env)) - (ex `(error ,(exception-message ex)))) - (('ok obj) (mapi (all-definitions obj) - (fun (d) - `(,(format "~a" d) ,(src-loc>elisp (src-loc d)))))) - (('error msg) `((,name (:error ,msg)))))) - -(define-simple-class () - (file #:init #f) - (line #:init #f) - ((*init* file name) - (set (@ file (this)) file) - (set (@ line (this)) line)) - ((lineNumber) :: (or line (absent))) - ((lineNumber (s :: )) :: int (! lineNumber (this))) - ((method) :: (absent)) - ((sourcePath) :: (or file (absent))) - ((sourcePath (s :: )) :: (! sourcePath (this))) - ((sourceName) :: (absent)) - ((sourceName (s :: )) :: (! sourceName (this))) - ((declaringType) :: (absent)) - ((codeIndex) :: -1) - ((virtualMachine) :: *the-vm*) - ((compareTo o) :: - (typecase o - ( (- (! codeIndex (this)) (! codeIndex o)))))) - -(df absent () (primitive-throw ())) - -(df all-definitions (o) - (typecase o - ( (list o)) - ( (list o)) - ( (append (mappend all-definitions (gf-methods o)) - (let ((s (! get-setter o))) - (if s (all-definitions s) '())))) - ( (list o)) - ( (all-definitions (! get-class o))) - ( (list o)) - ( (all-definitions (! getReflectClass o))) - ( '()) - )) - -(df gf-methods ((f )) - (let* ((o :: (vm-mirror *the-vm* f)) - (f (! field-by-name (! reference-type o) "methods")) - (ms (vm-demirror *the-vm* (! get-value o f)))) - (filter (array-to-list ms) (fun (x) (not (nul? x)))))) - -(df src-loc (o => ) - (typecase o - ( (src-loc (@ method o))) - ( (module-method>src-loc o)) - ( ( #f #f)) - ( (class>src-loc o)) - ( ( #f #f)) - ( (bytemethod>src-loc o)))) - -(df module-method>src-loc ((f )) - (! location (module-method>meth-ref f))) - -(df module-method>meth-ref ((f ) => ) - (let* ((module (! reference-type - (as (vm-mirror *the-vm* (@ module f))))) - (1st-method-by-name (fun (name) - (let ((i (! methods-by-name module name))) - (cond ((! is-empty i) #f) - (#t (1st i))))))) - (as (or (1st-method-by-name (! get-name f)) - (let ((mangled (mangled-name f))) - (or (1st-method-by-name mangled) - (1st-method-by-name (cat mangled "$V")) - (1st-method-by-name (cat mangled "$X")))))))) - -(df mangled-name ((f )) - (let* ((name0 (! get-name f)) - (name (cond ((nul? name0) (format "lambda~d" (@ selector f))) - (#t (!s gnu.expr.Compilation mangleName name0))))) - name)) - -(df class>src-loc ((c ) => ) - (let* ((type (class>ref-type c)) - (locs (! all-line-locations type))) - (cond ((not (! isEmpty locs)) (1st locs)) - (#t ( (1st (! source-paths type "Java")) - #f))))) - -(df class>ref-type ((class ) => ) - (! reflectedType (as - (vm-mirror *the-vm* class)))) - -(df class>class-type ((class ) => ) - (as (class>ref-type class))) - -(df bytemethod>src-loc ((m ) => ) - (let* ((cls (class>class-type (! get-reflect-class - (! get-declaring-class m)))) - (name (! get-name m)) - (sig (! get-signature m)) - (meth (! concrete-method-by-name cls name sig))) - (! location meth))) - -(df src-loc>elisp ((l )) - (df src-loc>list ((l )) - (list (ignore-errors (! source-name l "Java")) - (ignore-errors (! source-path l "Java")) - (ignore-errors (! line-number l "Java")))) - (mcase (src-loc>list l) - ((name path line) - (cond ((not path) - `(:error ,(call-with-abort (fun () (! source-path l))))) - ((! starts-with (as path) "(buffer ") - (mlet (('buffer b 'offset o 'str s) (read-from-string path)) - `(:location (:buffer ,b) - (:position ,(+ o (line>offset line s))) - nil))) - (#t - `(:location ,(or (find-file-in-path name (source-path)) - (find-file-in-path path (source-path)) - (ferror "Can't find source-path: ~s ~s ~a" - path name (source-path))) - (:line ,(or line -1)) ())))))) - -(df src-loc>str ((l )) - (cond ((nul? l) "") - (#t (format "~a ~a ~a" - (or (ignore-errors (! source-path l)) - (ignore-errors (! source-name l)) - (ignore-errors (!! name declaring-type l))) - (ignore-errors (!! name method l)) - (ignore-errors (! lineNumber l)))))) - -;;;;;; class-path hacking - -;; (find-file-in-path "kawa/lib/kawa/hashtable.scm" (source-path)) - -(df find-file-in-path ((filename ) (path )) - (let ((f ( filename))) - (cond ((! isAbsolute f) `(:file ,filename)) - (#t (let ((result #f)) - (find-if path (fun (dir) - (let ((x (find-file-in-dir f dir))) - (set result x))) - #f) - result))))) - -(df find-file-in-dir ((file ) (dir )) - (let ((filename :: (! getPath file))) - (or (let ((child ( ( dir) filename))) - (and (! exists child) - `(:file ,(! getPath child)))) - (try-catch - (and (not (nul? (! getEntry ( dir) filename))) - `(:zip ,dir ,filename)) - (ex #f))))) - -(define swank-java-source-path - (let* ((jre-home :: (!s getProperty "java.home")) - (parent :: (! get-parent ( jre-home)))) - (list (! get-path ( parent "src.zip"))))) - -(df source-path () - (mlet ((base) (search-path-prop "user.dir")) - (append - (list base) - (map (fun ((s )) - (let ((f ( s)) - (base :: (as base))) - (cond ((! isAbsolute f) s) - (#t (! getPath ( base s)))))) - (class-path)) - swank-java-source-path))) - -(df class-path () - (append (search-path-prop "java.class.path") - (search-path-prop "sun.boot.class.path"))) - -(df search-path-prop ((name )) - (array-to-list (! split (!s java.lang.System getProperty name) - (@s pathSeparator)))) - -;;;; Disassemble - -(defslimefun disassemble-form (env form) - (mcase (read-from-string form) - (('quote name) - (let ((f (eval name env))) - (typecase f - ( - (disassemble-to-string (module-method>meth-ref f)))))))) - -(df disassemble-to-string ((mr ) => ) - (with-sink #f (fun (out) (disassemble-meth-ref mr out)))) - -(df disassemble-meth-ref ((mr ) (out )) - (let* ((t (! declaring-type mr))) - (disas-header mr out) - (disas-code (! constant-pool t) - (! constant-pool-count t) - (! bytecodes mr) - out))) - -(df disas-header ((mr ) (out )) - (let* ((++ (fun ((str )) (! write out str))) - (? (fun (flag str) (if flag (++ str))))) - (? (! is-static mr) "static ") - (? (! is-final mr) "final ") - (? (! is-private mr) "private ") - (? (! is-protected mr) "protected ") - (? (! is-public mr) "public ") - (++ (! name mr)) (++ (! signature mr)) (++ "\n"))) - -(df disas-code ((cpool ) (cpoolcount ) (bytecode ) - (out )) - (let* ((ct ( "foo")) - (met (! addMethod ct "bar" 0)) - (ca ( met)) - (constants (let* ((bs ()) - (s ( bs))) - (! write-short s cpoolcount) - (! write s cpool) - (! flush s) - (! toByteArray bs)))) - (vm-set-slot *the-vm* ct "constants" - ( - ( - ( - constants)))) - (! setCode ca bytecode) - (let ((w ( ct out 0))) - (! print ca w) - (! flush w)))) - -(df with-sink (sink (f )) - (cond ((instance? sink ) (f sink)) - ((== sink #t) (f (as (current-output-port)))) - ((== sink #f) - (let* ((buffer ()) - (out ( buffer))) - (f out) - (! flush out) - (! toString buffer))) - (#t (ferror "Invalid sink designator: ~s" sink)))) - -(df test-disas ((c ) (m )) - (let* ((vm (as *the-vm*)) - (c (as (1st (! classes-by-name vm c)))) - (m (as (1st (! methods-by-name c m))))) - (with-sink #f (fun (out) (disassemble-meth-ref m out))))) - -;; (test-disas "java.lang.Class" "toString") - - -;;;; Macroexpansion - -(defslimefun swank-expand-1 (env s) (%swank-macroexpand s env)) -(defslimefun swank-expand (env s) (%swank-macroexpand s env)) -(defslimefun swank-expand-all (env s) (%swank-macroexpand s env)) - -(df %swank-macroexpand (string env) - (pprint-to-string (%macroexpand (read-from-string string) env))) - -(df %macroexpand (sexp env) (expand sexp #:env env)) - - -;;;; Inspector - -(define-simple-class () - (object #:init #!null) - (parts :: #:init () ) - (stack :: #:init '()) - (content :: #:init '())) - -(df make-inspector (env (vm ) => ) - (car (spawn/chan (fun (c) (inspector c env vm))))) - -(df inspector ((c ) env (vm )) - (! set-name (current-thread) "inspector") - (let ((state :: ()) - (open #t)) - (while open - (mcase (recv c) - (('init str id) - (set state ()) - (let ((obj (try-catch (eval (read-from-string str) env) - (ex ex)))) - (reply c (inspect-object obj state vm) id))) - (('init-mirror cc id) - (set state ()) - (let* ((mirror (recv cc)) - (obj (vm-demirror vm mirror))) - (reply c (inspect-object obj state vm) id))) - (('inspect-part n id) - (let ((part (! get (@ parts state) n))) - (reply c (inspect-object part state vm) id))) - (('pop id) - (reply c (inspector-pop state vm) id)) - (('quit id) - (reply c 'nil id) - (set open #f)))))) - -(df inspect-object (obj (state ) (vm )) - (set (@ object state) obj) - (set (@ parts state) ()) - (pushf obj (@ stack state)) - (set (@ content state) (inspector-content - `("class: " (:value ,(! getClass obj)) "\n" - ,@(inspect obj vm)) - state)) - (cond ((nul? obj) (list ':title "#!null" ':id 0 ':content `())) - (#t - (list ':title (pprint-to-string obj) - ':id (assign-index obj state) - ':content (let ((c (@ content state))) - (content-range c 0 (len c))))))) - -(df inspect (obj vm) - (let ((obj (as (vm-mirror vm obj)))) - (typecase obj - ( (inspect-array-ref vm obj)) - ( (inspect-obj-ref vm obj))))) - -(df inspect-array-ref ((vm ) (obj )) - (packing (pack) - (let ((i 0)) - (for (((v :: ) (! getValues obj))) - (pack (format "~d: " i)) - (pack `(:value ,(vm-demirror vm v))) - (pack "\n") - (set i (1+ i)))))) - -(df inspect-obj-ref ((vm ) (obj )) - (let* ((type (! referenceType obj)) - (fields (! allFields type)) - (values (! getValues obj fields)) - (ifields '()) (sfields '()) (imeths '()) (smeths '()) - (frob (lambda (lists) (apply append (reverse lists))))) - (for (((f :: ) fields)) - (let* ((val (as (! get values f))) - (l `(,(! name f) ": " (:value ,(vm-demirror vm val)) "\n"))) - (if (! is-static f) - (pushf l sfields) - (pushf l ifields)))) - (for (((m :: ) (! allMethods type))) - (let ((l `(,(! name m) ,(! signature m) "\n"))) - (if (! is-static m) - (pushf l smeths) - (pushf l imeths)))) - `(,@(frob ifields) - "--- static fields ---\n" ,@(frob sfields) - "--- methods ---\n" ,@(frob imeths) - "--- static methods ---\n" ,@(frob smeths)))) - -(df inspector-content (content (state )) - (map (fun (part) - (mcase part - ((':value val) - `(:value ,(pprint-to-string val) ,(assign-index val state))) - (x (to-string x)))) - content)) - -(df assign-index (obj (state ) => ) - (! add (@ parts state) obj) - (1- (! size (@ parts state)))) - -(df content-range (l start end) - (let* ((len (length l)) (end (min len end))) - (list (subseq l start end) len start end))) - -(df inspector-pop ((state ) vm) - (cond ((<= 2 (len (@ stack state))) - (let ((obj (cadr (@ stack state)))) - (set (@ stack state) (cddr (@ stack state))) - (inspect-object obj state vm))) - (#t 'nil))) - -;;;; IO redirection - -(define-simple-class () - (q :: #:init ( (as 100))) - ((*init*) (invoke-special (this) '*init*)) - ((write (buffer :: ) (from :: ) (to :: )) :: - (synchronized (this) - (assert (not (== q #!null))) - (! put q `(write ,( buffer from to))))) - ((close) :: - (synchronized (this) - (! put q 'close) - (set! q #!null))) - ((flush) :: - (synchronized (this) - (assert (not (== q #!null))) - (let ((ex ())) - (! put q `(flush ,ex)) - (! exchange ex #!null))))) - -(df swank-writer ((in ) (q )) - (! set-name (current-thread) "swank-redirect-thread") - (let* ((out (as (recv in))) - (builder ()) - (flush (fun () - (unless (zero? (! length builder)) - (send out `(forward (:write-string ,( builder)))) - (! setLength builder 0)))) - (closed #f)) - (while (not closed) - (mcase (! poll q (as long 200) (@s MILLISECONDS)) - ('#!null (flush)) - (('write s) - (! append builder (as s)) - (when (> (! length builder) 4000) - (flush))) - (('flush ex) - (flush) - (! exchange (as ex) #!null)) - ('close - (set closed #t) - (flush)))))) - -(df make-swank-outport ((out )) - (let ((w ())) - (mlet ((in . _) (spawn/chan (fun (c) (swank-writer c (@ q w))))) - (send in out)) - ( w #t #t))) - - -;;;; Monitor - -;;(define-simple-class () -;; (threadmap type: (tab))) - -(df vm-monitor ((c )) - (! set-name (current-thread) "swank-vm-monitor") - (let ((vm (vm-attach))) - (log-vm-props vm) - (request-breakpoint vm) - (mlet* (((ev . _) (spawn/chan/catch - (fun (c) - (let ((q (! eventQueue vm))) - (while #t - (send c `(vm-event ,(to-list (! remove q))))))))) - (to-string (vm-to-string vm)) - (state (tab))) - (send c `(publish-vm ,vm)) - (while #t - (mcase (recv* (list c ev)) - ((_ . ('get-vm cc)) - (send cc vm)) - ((,c . ('debug-info thread from to id)) - (reply c (debug-info thread from to state) id)) - ((,c . ('throw-to-toplevel thread id)) - (set state (throw-to-toplevel thread id c state))) - ((,c . ('thread-continue thread id)) - (set state (thread-continue thread id c state))) - ((,c . ('frame-src-loc thread frame id)) - (reply c (frame-src-loc thread frame state) id)) - ((,c . ('frame-details thread frame id)) - (reply c (list (frame-locals thread frame state) '()) id)) - ((,c . ('disassemble-frame thread frame id)) - (reply c (disassemble-frame thread frame state) id)) - ((,c . ('thread-frames thread from to id)) - (reply c (thread-frames thread from to state) id)) - ((,c . ('list-threads id)) - (reply c (list-threads vm state) id)) - ((,c . ('interrupt-thread ref)) - (set state (interrupt-thread ref state c))) - ((,c . ('debug-nth-thread n)) - (let ((t (nth (get state 'all-threads #f) n))) - ;;(log "thread ~d : ~a\n" n t) - (set state (interrupt-thread t state c)))) - ((,c . ('quit-thread-browser id)) - (reply c 't id) - (set state (del state 'all-threads))) - ((,ev . ('vm-event es)) - ;;(log "vm-events: len=~a\n" (len es)) - (for (((e :: ) (as es))) - (set state (process-vm-event e c state)))) - ((_ . ('get-exception from tid)) - (mlet ((_ _ es) (get state tid #f)) - (send from (let ((e (car es))) - (typecase e - ( (! exception e)) - ( e)))))) - ((_ . ('get-local rc tid frame var)) - (send rc (frame-local-var tid frame var state))) - ))))) - -(df reply ((c ) value id) - (send c `(forward (:return (:ok ,value) ,id)))) - -(df reply-abort ((c ) id) - (send c `(forward (:return (:abort nil) ,id)))) - -(df process-vm-event ((e ) (c ) state) - ;;(log "vm-event: ~s\n" e) - (typecase e - ( - ;;(log "exception: ~s\n" (! exception e)) - ;;(log "exception-message: ~s\n" - ;; (exception-message (vm-demirror *the-vm* (! exception e)))) - ;;(log "exception-location: ~s\n" (src-loc>str (! location e))) - ;;(log "exception-catch-location: ~s\n" (src-loc>str (! catch-location e))) - (cond ((! notifyUncaught (as - (! request e))) - (process-exception e c state)) - (#t - (let* ((t (! thread e)) - (r (! request e)) - (ex (! exception e))) - (unless (eq? *last-exception* ex) - (set *last-exception* ex) - (set *last-stacktrace* (copy-stack t))) - (! resume t)) - state))) - ( - (let* ((r (! request e)) - (k (! get-property r 'continuation))) - (! disable r) - (log "k: ~s\n" k) - (k e)) - state) - ( - (log "breakpoint event: ~a\n" e) - (debug-thread (! thread e) e state c)) - )) - -(df process-exception ((e ) (c ) state) - (let* ((tref (! thread e)) - (tid (! uniqueID tref)) - (s (get state tid #f))) - (mcase s - ('#f - ;; XXX redundant in debug-thread - (let* ((level 1) - (state (put state tid (list tref level (list e))))) - (send c `(forward (:debug ,tid ,level - ,@(debug-info tid 0 15 state)))) - (send c `(forward (:debug-activate ,tid ,level))) - state)) - ((_ level exs) - (send c `(forward (:debug-activate ,(! uniqueID tref) ,level))) - (put state tid (list tref (1+ level) (cons e exs))))))) - -(define-simple-class () - (loc :: ) - (args) - (names) - (values :: ) - (self) - ((*init* (loc :: ) args names (values :: ) self) - (set (@ loc (this)) loc) - (set (@ args (this)) args) - (set (@ names (this)) names) - (set (@ values (this)) values) - (set (@ self (this)) self)) - ((toString) :: - (format "#" (src-loc>str loc)))) - -(df copy-stack ((t )) - (packing (pack) - (iter (! frames t) - (fun ((f )) - (let ((vars (ignore-errors (! visibleVariables f)))) - (pack ( - (or (ignore-errors (! location f)) #!null) - (ignore-errors (! getArgumentValues f)) - (or vars #!null) - (or (and vars (ignore-errors (! get-values f vars))) - #!null) - (ignore-errors (! thisObject f))))))))) - -(define-simple-class () - (thread :: ) - ((*init* (thread :: )) (set (@ thread (this)) thread)) - ((request) :: #!null) - ((virtualMachine) :: (! virtualMachine thread))) - -(df break (#!optional condition) - ((breakpoint condition))) - -;; We set a breakpoint on this function. It returns a function which -;; specifies what the debuggee should do next (the actual return value -;; is set via JDI). Lets hope that the compiler doesn't optimize this -;; away. -(df breakpoint (condition => ) - (fun () #!null)) - -;; Enable breakpoints event on the breakpoint function. -(df request-breakpoint ((vm )) - (let* ((swank-classes (! classesByName vm "swank-kawa")) - (swank-classes-legacy (! classesByName vm "swank$Mnkawa")) - (class :: (1st (if (= (length swank-classes) 0) - swank-classes-legacy - swank-classes))) - (meth :: (1st (! methodsByName class "breakpoint"))) - (erm (! eventRequestManager vm)) - (req (! createBreakpointRequest erm (! location meth)))) - (! setSuspendPolicy req (@ SUSPEND_EVENT_THREAD req)) - (! put-property req 'swank #t) - (! put-property req 'argname "condition") - (! enable req))) - -(df log-vm-props ((vm )) - (letrec-syntax ((p (syntax-rules () - ((p name) (log "~s: ~s\n" 'name (! name vm))))) - (p* (syntax-rules () - ((p* n ...) (seq (p n) ...))))) - (p* canBeModified - canRedefineClasses - canAddMethod - canUnrestrictedlyRedefineClasses - canGetBytecodes - canGetConstantPool - canGetSyntheticAttribute - canGetSourceDebugExtension - canPopFrames - canForceEarlyReturn - canGetMethodReturnValues - canGetInstanceInfo - ))) - -;;;;; Debugger - -(df debug-thread ((tref ) (ev ) state (c )) - (unless (! is-suspended tref) - (! suspend tref)) - (let* ((id (! uniqueID tref)) - (level 1) - (state (put state id (list tref level (list ev))))) - (send c `(forward (:debug ,id ,level ,@(debug-info id 0 10 state)))) - (send c `(forward (:debug-activate ,id ,level))) - state)) - -(df interrupt-thread ((tref ) state (c )) - (debug-thread tref ( tref) state c)) - -(df debug-info ((tid ) (from ) to state) - (mlet ((thread-ref level evs) (get state tid #f)) - (let* ((tref (as thread-ref)) - (vm (! virtualMachine tref)) - (ev (as (car evs))) - (ex (typecase ev - ( (breakpoint-condition ev)) - ( (! exception ev)) - ( ( "Interrupt")))) - (desc (typecase ex - ( - ;;(log "ex: ~a ~a\n" ex (vm-demirror vm ex)) - (! toString (vm-demirror vm ex))) - ( (! toString ex)))) - (type (format " [type ~a]" - (typecase ex - ( (! name (! referenceType ex))) - ( (!! getName getClass ex))))) - (bt (thread-frames tid from to state))) - `((,desc ,type nil) (("quit" "terminate current thread")) ,bt ())))) - -(df breakpoint-condition ((e ) => ) - (let ((frame (! frame (! thread e) 0))) - (1st (! get-argument-values frame)))) - -(df thread-frames ((tid ) (from ) to state) - (mlet ((thread level evs) (get state tid #f)) - (let* ((thread (as thread)) - (fcount (! frameCount thread)) - (stacktrace (event-stacktrace (car evs))) - (missing (cond ((zero? (len stacktrace)) 0) - (#t (- (len stacktrace) fcount)))) - (fstart (max (- from missing) 0)) - (flen (max (- to from missing) 0)) - (frames (! frames thread fstart (min flen (- fcount fstart))))) - (packing (pack) - (let ((i from)) - (dotimes (_ (max (- missing from) 0)) - (pack (list i (format "~a" (stacktrace i)))) - (set i (1+ i))) - (iter frames (fun ((f )) - (let ((s (frame-to-string f))) - (pack (list i s)) - (set i (1+ i)))))))))) - -(df event-stacktrace ((ev )) - (let ((nothing (fun () ())) - (vm (! virtualMachine ev))) - (typecase ev - ( - (let ((condition (vm-demirror vm (breakpoint-condition ev)))) - (cond ((instance? condition ) - (throwable-stacktrace vm condition)) - (#t (nothing))))) - ( - (throwable-stacktrace vm (vm-demirror vm (! exception ev)))) - ( (nothing))))) - -(df throwable-stacktrace ((vm ) (ex )) - (cond ((== ex (ignore-errors (vm-demirror vm *last-exception*))) - *last-stacktrace*) - (#t - (! getStackTrace ex)))) - -(df frame-to-string ((f )) - (let ((loc (! location f)) - (vm (! virtualMachine f))) - (format "~a (~a)" (!! name method loc) - (call-with-abort - (fun () (format "~{~a~^ ~}" - (mapi (! getArgumentValues f) - (fun (arg) - (pprint-to-string - (vm-demirror vm arg)))))))))) - -(df frame-src-loc ((tid ) (n ) state) - (try-catch - (mlet* (((frame vm) (nth-frame tid n state)) - (vm (as vm))) - (src-loc>elisp - (typecase frame - ( (! location frame)) - ( (@ loc frame)) - ( - (let* ((classname (! getClassName frame)) - (classes (! classesByName vm classname)) - (t (as (1st classes)))) - (1st (! locationsOfLine t (! getLineNumber frame)))))))) - (ex - (let ((msg (! getMessage ex))) - `(:error ,(if (== msg #!null) - (! toString ex) - msg)))))) - -(df nth-frame ((tid ) (n ) state) - (mlet ((tref level evs) (get state tid #f)) - (let* ((thread (as tref)) - (fcount (! frameCount thread)) - (stacktrace (event-stacktrace (car evs))) - (missing (cond ((zero? (len stacktrace)) 0) - (#t (- (len stacktrace) fcount)))) - (vm (! virtualMachine thread)) - (frame (cond ((< n missing) - (stacktrace n)) - (#t (! frame thread (- n missing)))))) - (list frame vm)))) - -;;;;; Locals - -(df frame-locals ((tid ) (n ) state) - (mlet ((thread _ _) (get state tid #f)) - (let* ((thread (as thread)) - (vm (! virtualMachine thread)) - (p (fun (x) (pprint-to-string - (call-with-abort (fun () (vm-demirror vm x))))))) - (map (fun (x) - (mlet ((name value) x) - (list ':name name ':value (p value) ':id 0))) - (%frame-locals tid n state))))) - -(df frame-local-var ((tid ) (frame ) (var ) state => ) - (cadr (nth (%frame-locals tid frame state) var))) - -(df %frame-locals ((tid ) (n ) state) - (mlet ((frame _) (nth-frame tid n state)) - (typecase frame - ( - (let* ((visible (try-catch (! visibleVariables frame) - (ex - '()))) - (map (! getValues frame visible)) - (p (fun (x) x))) - (packing (pack) - (let ((self (ignore-errors (! thisObject frame)))) - (when self - (pack (list "this" (p self))))) - (iter (! entrySet map) - (fun ((e )) - (let ((var (as (! getKey e))) - (val (as (! getValue e)))) - (pack (list (! name var) (p val))))))))) - ( - (packing (pack) - (when (@ self frame) - (pack (list "this" (@ self frame)))) - (iter (! entrySet (@ values frame)) - (fun ((e )) - (let ((var (as (! getKey e))) - (val (as (! getValue e)))) - (pack (list (! name var) val))))))) - ( '())))) - -(df disassemble-frame ((tid ) (frame ) state) - (mlet ((frame _) (nth-frame tid frame state)) - (typecase frame - ( "") - ( - (let* ((l (! location frame)) - (m (! method l)) - (c (! declaringType l))) - (disassemble-to-string m)))))) - -;;;;; Restarts - -;; FIXME: factorize -(df throw-to-toplevel ((tid ) (id ) (c ) state) - (mlet ((tref level exc) (get state tid #f)) - (let* ((t (as tref)) - (ev (car exc))) - (typecase ev - ( ; actually uncaughtException - (! resume t) - (reply-abort c id) - ;;(send-debug-return c tid state) - (do ((level level (1- level)) - (exc exc (cdr exc))) - ((null? exc)) - (send c `(forward (:debug-return ,tid ,level nil)))) - (del state tid)) - ( - ;; XXX race condition? - (log "resume from from break (suspendCount: ~d)\n" (! suspendCount t)) - (let ((vm (! virtualMachine t)) - (k (fun () (primitive-throw ())))) - (reply-abort c id) - (! force-early-return t (vm-mirror vm k)) - (! resume t) - (do ((level level (1- level)) - (exc exc (cdr exc))) - ((null? exc)) - (send c `(forward (:debug-return ,tid ,level nil)))) - (del state tid))) - ( - (log "resume from from interrupt\n") - (let ((vm (! virtualMachine t))) - (! stop t (vm-mirror vm ())) - (! resume t) - (reply-abort c id) - (do ((level level (1- level)) - (exc exc (cdr exc))) - ((null? exc)) - (send c `(forward (:debug-return ,tid ,level nil)))) - (del state tid)) - ))))) - -(df thread-continue ((tid ) (id ) (c ) state) - (mlet ((tref level exc) (get state tid #f)) - (log "thread-continue: ~a ~a ~a \n" tref level exc) - (let* ((t (as tref))) - (! resume t)) - (reply-abort c id) - (do ((level level (1- level)) - (exc exc (cdr exc))) - ((null? exc)) - (send c `(forward (:debug-return ,tid ,level nil)))) - (del state tid))) - -(df thread-step ((t ) k) - (let* ((vm (! virtual-machine t)) - (erm (! eventRequestManager vm)) - ( ) - (req (! createStepRequest erm t - (@s STEP_MIN) - (@s STEP_OVER)))) - (! setSuspendPolicy req (@ SUSPEND_EVENT_THREAD req)) - (! addCountFilter req 1) - (! put-property req 'continuation k) - (! enable req))) - -(df eval-in-thread ((t ) sexp - #!optional (env :: (!s current))) - (let* ((vm (! virtualMachine t)) - (sc :: - (1st (! classes-by-name vm "kawa.standard.Scheme"))) - (ev :: - (1st (! methods-by-name sc "eval" - (cat "(Ljava/lang/Object;Lgnu/mapping/Environment;)" - "Ljava/lang/Object;"))))) - (! invokeMethod sc t ev (list sexp env) - (@s INVOKE_SINGLE_THREADED)))) - -;;;;; Threads - -(df list-threads (vm :: state) - (let* ((threads (! allThreads vm))) - (put state 'all-threads threads) - (packing (pack) - (pack '(\:id \:name \:status \:priority)) - (iter threads (fun ((t )) - (pack (list (! uniqueID t) - (! name t) - (let ((s (thread-status t))) - (if (! is-suspended t) - (cat "SUSPENDED/" s) - s)) - 0))))))) - -(df thread-status (t :: ) - (let ((s (! status t))) - (cond ((= s (@s THREAD_STATUS_UNKNOWN)) "UNKNOWN") - ((= s (@s THREAD_STATUS_ZOMBIE)) "ZOMBIE") - ((= s (@s THREAD_STATUS_RUNNING)) "RUNNING") - ((= s (@s THREAD_STATUS_SLEEPING)) "SLEEPING") - ((= s (@s THREAD_STATUS_MONITOR)) "MONITOR") - ((= s (@s THREAD_STATUS_WAIT)) "WAIT") - ((= s (@s THREAD_STATUS_NOT_STARTED)) "NOT_STARTED") - (#t "")))) - -;;;;; Bootstrap - -(df vm-attach (=> ) - (attach (getpid) 20)) - -(df attach (pid timeout) - (log "attaching: ~a ~a\n" pid timeout) - (let* (( ) - ( ) - (vmm (!s com.sun.jdi.Bootstrap virtualMachineManager)) - (pa (as - (or - (find-if (! attaching-connectors vmm) - (fun (x :: ) - (! equals (! name x) "com.sun.jdi.ProcessAttach")) - #f) - (error "ProcessAttach connector not found")))) - (args (! default-arguments pa))) - (! set-value (as (! get args (to-str "pid"))) pid) - (when timeout - (! set-value (as (! get args (to-str "timeout"))) timeout)) - (log "attaching2: ~a ~a\n" pa args) - (! attach pa args))) - -(df getpid () - (let ((p (make-process (command-parse "echo $PPID") #!null))) - (! waitFor p) - (! read-line ( ( (! get-input-stream p)))))) - -(df request-uncaught-exception-events ((vm )) - (let* ((erm (! eventRequestManager vm)) - (req (! createExceptionRequest erm #!null #f #t))) - (! setSuspendPolicy req (@ SUSPEND_EVENT_THREAD req)) - (! addThreadFilter req (vm-mirror vm (current-thread))) - (! enable req))) - - -(df request-caught-exception-events ((vm )) - (let* ((erm (! eventRequestManager vm)) - (req (! createExceptionRequest erm #!null #t #f))) - (! setSuspendPolicy req (@ SUSPEND_EVENT_THREAD req)) - (! addThreadFilter req (vm-mirror vm (current-thread))) - (! addClassExclusionFilter req "java.lang.ClassLoader") - (! addClassExclusionFilter req "java.net.URLClassLoader") - (! addClassExclusionFilter req "java.net.URLClassLoader$1") - (! enable req))) - -(df set-stacktrace-recording ((vm ) (flag )) - (for (((e :: ) - (!! exceptionRequests eventRequestManager vm))) - (when (! notify-caught e) - (! setEnabled e flag)))) - -;; (set-stacktrace-recording *the-vm* #f) - -(df vm-to-string ((vm )) - (let* ((obj (as (1st (! classesByName vm "java.lang.Object")))) - (met (as (1st (! methodsByName obj "toString"))))) - (fun ((o ) (t )) - (! value - (as - (! invokeMethod o t met '() - (@s INVOKE_SINGLE_THREADED))))))) - -(define-simple-class () - (var #:allocation 'static)) - -(define-variable *global-get-mirror* #!null) -(define-variable *global-set-mirror* #!null) -(define-variable *global-get-raw* #!null) -(define-variable *global-set-raw* #!null) - -(df init-global-field ((vm )) - (when (nul? *global-get-mirror*) - (set (@s var) #!null) ; prepare class - (let* ((swank-global-variable-classes - (! classes-by-name vm "swank-global-variable")) - (swank-global-variable-classes-legacy - (! classes-by-name vm "swank$Mnglobal$Mnvariable")) - (c (as - (1st (if (= (length swank-global-variable-classes) 0) - swank-global-variable-classes-legacy - swank-global-variable-classes)))) - (f (! fieldByName c "var"))) - (set *global-get-mirror* (fun () (! getValue c f))) - (set *global-set-mirror* (fun ((v )) (! setValue c f v)))) - (set *global-get-raw* (fun () '() (@s var))) - (set *global-set-raw* (fun (x) - (set (@s var) x))))) - -(df vm-mirror ((vm ) obj) - (synchronized vm - (init-global-field vm) - (*global-set-raw* obj) - (*global-get-mirror*))) - -(df vm-demirror ((vm ) (v )) - (synchronized vm - (if (== v #!null) - #!null - (typecase v - ( (init-global-field vm) - (*global-set-mirror* v) - (*global-get-raw*)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)) - ( (! value v)))))) - -(df vm-set-slot ((vm ) (o ) (name ) value) - (let* ((o (as (vm-mirror vm o))) - (t (! reference-type o)) - (f (! field-by-name t name))) - (! set-value o f (vm-mirror vm value)))) - -(define-simple-class - () - (f :: ) - ((*init* (f :: )) (set (@ f (this)) f)) - ((uncaughtException (t :: ) (e :: )) - :: - (! println (@s java.lang.System err) (to-str "uhexc:::")) - (! apply2 f t e) - #!void)) - -;;;; Channels - -(df spawn (f) - (let ((thread ( (%%runnable f)))) - (! start thread) - thread)) - - -;; gnu.mapping.RunnableClosure uses the try{...}catch(Throwable){...} -;; idiom which defeats all attempts to use a break-on-error-style -;; debugger. Previously I had my own version of RunnableClosure -;; without that deficiency but something in upstream changed and it no -;; longer worked. Now we use the normal RunnableClosure and at the -;; cost of taking stack snapshots on every throw. -(df %%runnable (f => ) - ;;( f) - ;;( f) - ;;(runnable f) - (%runnable f) - ) - -(df %runnable (f => ) - (runnable - (fun () - (try-catch (f) - (ex - (log "exception in thread ~s: ~s" (current-thread) - ex) - (! printStackTrace ex)))))) - -(df chan () - (let ((lock ()) - (im ()) - (ex ())) - (set (@ lock im) lock) - (set (@ lock ex) lock) - (set (@ peer im) ex) - (set (@ peer ex) im) - (cons im ex))) - -(df immutable? (obj) - (or (== obj #!null) - (symbol? obj) - (number? obj) - (char? obj) - (instance? obj ) - (null? obj))) - -(df send ((c ) value => ) - (df pass (obj) - (cond ((immutable? obj) obj) - ((string? obj) (! to-string obj)) - ((pair? obj) - (let loop ((r (list (pass (car obj)))) - (o (cdr obj))) - (cond ((null? o) (reverse! r)) - ((pair? o) (loop (cons (pass (car o)) r) (cdr o))) - (#t (append (reverse! r) (pass o)))))) - ((instance? obj ) - (let ((o :: obj)) - (assert (== (@ owner o) (current-thread))) - (synchronized (@ lock c) - (set (@ owner o) (@ owner (@ peer c)))) - o)) - ((or (instance? obj ) - (instance? obj )) - ;; those can be shared, for pragmatic reasons - obj - ) - (#t (error "can't send" obj (class-name-sans-package obj))))) - ;;(log "send: ~s ~s -> ~s\n" value (@ owner c) (@ owner (@ peer c))) - (assert (== (@ owner c) (current-thread))) - ;;(log "lock: ~s send\n" (@ owner (@ peer c))) - (synchronized (@ owner (@ peer c)) - (! put (@ queue (@ peer c)) (pass value)) - (! notify (@ owner (@ peer c)))) - ;;(log "unlock: ~s send\n" (@ owner (@ peer c))) - ) - -(df recv ((c )) - (cdr (recv/timeout (list c) 0))) - -(df recv* ((cs )) - (recv/timeout cs 0)) - -(df recv/timeout ((cs ) (timeout )) - (let ((self (current-thread)) - (end (if (zero? timeout) - 0 - (+ (current-time) timeout)))) - ;;(log "lock: ~s recv\n" self) - (synchronized self - (let loop () - ;;(log "receive-loop: ~s\n" self) - (let ((ready (find-if cs - (fun ((c )) - (not (! is-empty (@ queue c)))) - #f))) - (cond (ready - ;;(log "unlock: ~s recv\n" self) - (cons ready (! take (@ queue (as ready))))) - ((zero? timeout) - ;;(log "wait: ~s recv\n" self) - (! wait self) (loop)) - (#t - (let ((now (current-time))) - (cond ((<= end now) - 'timeout) - (#t - ;;(log "wait: ~s recv\n" self) - (! wait self (- end now)) - (loop))))))))))) - -(df rpc ((c ) msg) - (mlet* (((im . ex) (chan)) - ((op . args) msg)) - (send c `(,op ,ex . ,args)) - (recv im))) - -(df spawn/chan (f) - (mlet ((im . ex) (chan)) - (let ((thread ( (%%runnable (fun () (f ex)))))) - (set (@ owner ex) thread) - (! start thread) - (cons im thread)))) - -(df spawn/chan/catch (f) - (spawn/chan - (fun (c) - (try-catch - (f c) - (ex - (send c `(error ,(! toString ex) - ,(class-name-sans-package ex) - ,(map (fun (e) (! to-string e)) - (array-to-list (! get-stack-trace ex)))))))))) - -;;;; Logging - -(define swank-log-port (current-error-port)) -(df log (fstr #!rest args) - (synchronized swank-log-port - (apply format swank-log-port fstr args) - (force-output swank-log-port)) - #!void) - -;;;; Random helpers - -(df 1+ (x) (+ x 1)) -(df 1- (x) (- x 1)) - -(df len (x => ) - (typecase x - ( (length x)) - ( (! length x)) - ( (string-length x)) - ( (vector-length x)) - ( (! size x)) - ( (@ length x)))) - -;;(df put (tab key value) (hash-table-set! tab key value) tab) -;;(df get (tab key default) (hash-table-ref/default tab key default)) -;;(df del (tab key) (hash-table-delete! tab key) tab) -;;(df tab () (make-hash-table)) - -(df put (tab key value) (hashtable-set! tab key value) tab) -(df get (tab key default) (hashtable-ref tab key default)) -(df del (tab key) (hashtable-delete! tab key) tab) -(df tab () (make-eqv-hashtable)) - -(df equal (x y => ) (equal? x y)) - -(df current-thread (=> ) (!s java.lang.Thread currentThread)) -(df current-time (=> ) (!s java.lang.System currentTimeMillis)) - -(df nul? (x) (== x #!null)) - -(df read-from-string (str) - (call-with-input-string str read)) - -;;(df print-to-string (obj) (call-with-output-string (fun (p) (write obj p)))) - -(df pprint-to-string (obj) - (let* ((w ()) - (p ( w #t #f))) - (try-catch (print-object obj p) - (ex - (format p "#" - ex (class-name-sans-package ex)))) - (! flush p) - (to-string (! getBuffer w)))) - -(df print-object (obj stream) - (typecase obj - #; - ((or (eql #!null) (eql #!eof) - ) - (write obj stream)) - (#t - #;(print-unreadable-object obj stream) - (write obj stream) - ))) - -(df print-unreadable-object ((o ) stream) - (let* ((string (! to-string o)) - (class (! get-class o)) - (name (! get-name class)) - (simplename (! get-simple-name class))) - (cond ((! starts-with string "#<") - (format stream "~a" string)) - ((or (! starts-with string name) - (! starts-with string simplename)) - (format stream "#<~a>" string)) - (#t - (format stream "#<~a ~a>" name string))))) - -(define cat string-append) - -(df values-to-list (values) - (typecase values - ( (array-to-list (! getValues values))) - ( (list values)))) - -;; (to-list (as-list (values 1 2 2))) - -(df array-to-list ((array ) => ) - (packing (pack) - (dotimes (i (@ length array)) - (pack (array i))))) - -(df lisp-bool (obj) - (cond ((== obj 'nil) #f) - ((== obj 't) #t) - (#t (error "Can't map lisp boolean" obj)))) - -(df path-sans-extension ((p path) => ) - (let ((ex (! get-extension p)) - (str (! to-string p))) - (to-string (cond ((not ex) str) - (#t (! substring str 0 (- (len str) (len ex) 1))))))) - -(df class-name-sans-package ((obj )) - (cond ((nul? obj) "<#!null>") - (#t - (try-catch - (let* ((c (! get-class obj)) - (n (! get-simple-name c))) - (cond ((equal n "") (! get-name c)) - (#t n))) - (e - (format "#<~a: ~a>" e (! get-message e))))))) - -(df list-env (#!optional (env :: (!s current))) - (let ((enum (! enumerateAllLocations env))) - (packing (pack) - (while (! hasMoreElements enum) - (pack (! nextLocation enum)))))) - -(df list-file (filename) - (with (port (call-with-input-file filename)) - (let* ((lang (!s gnu.expr.Language getDefaultLanguage)) - (messages ()) - (comp (! parse lang (as port) messages 0))) - (! get-module comp)))) - -(df list-decls (file) - (let* ((module (as (list-file file)))) - (do ((decl :: - (! firstDecl module) (! nextDecl decl))) - ((nul? decl)) - (format #t "~a ~a:~d:~d\n" decl - (! getFileName decl) - (! getLineNumber decl) - (! getColumnNumber decl) - )))) - -(df %time (f) - (define-alias ) - (define-alias ) - (let* ((gcs (!s getGarbageCollectorMXBeans)) - (mem (!s getMemoryMXBean)) - (jit (!s getCompilationMXBean)) - (oldjit (! getTotalCompilationTime jit)) - (oldgc (packing (pack) - (iter gcs (fun ((gc )) - (pack (cons gc - (list (! getCollectionCount gc) - (! getCollectionTime gc)))))))) - (heap (!! getUsed getHeapMemoryUsage mem)) - (nonheap (!! getUsed getNonHeapMemoryUsage mem)) - (start (!s java.lang.System nanoTime)) - (values (f)) - (end (!s java.lang.System nanoTime)) - (newheap (!! getUsed getHeapMemoryUsage mem)) - (newnonheap (!! getUsed getNonHeapMemoryUsage mem))) - (format #t "~&") - (let ((njit (! getTotalCompilationTime jit))) - (format #t "; JIT compilation: ~:d ms (~:d)\n" (- njit oldjit) njit)) - (iter gcs (fun ((gc )) - (mlet ((_ count time) (assoc gc oldgc)) - (format #t "; GC ~a: ~:d ms (~d)\n" - (! getName gc) - (- (! getCollectionTime gc) time) - (- (! getCollectionCount gc) count))))) - (format #t "; Heap: ~@:d (~:d)\n" (- newheap heap) newheap) - (format #t "; Non-Heap: ~@:d (~:d)\n" (- newnonheap nonheap) newnonheap) - (format #t "; Elapsed time: ~:d us\n" (/ (- end start) 1000)) - values)) - -(define-syntax time - (syntax-rules () - ((time form) - (%time (lambda () form))))) - -(df gc () - (let* ((mem (!s java.lang.management.ManagementFactory getMemoryMXBean)) - (oheap (!! getUsed getHeapMemoryUsage mem)) - (onheap (!! getUsed getNonHeapMemoryUsage mem)) - (_ (! gc mem)) - (heap (!! getUsed getHeapMemoryUsage mem)) - (nheap (!! getUsed getNonHeapMemoryUsage mem))) - (format #t "; heap: ~@:d (~:d) non-heap: ~@:d (~:d)\n" - (- heap oheap) heap (- onheap nheap) nheap))) - -(df room () - (let* ((pools (!s java.lang.management.ManagementFactory - getMemoryPoolMXBeans)) - (mem (!s java.lang.management.ManagementFactory getMemoryMXBean)) - (heap (!! getUsed getHeapMemoryUsage mem)) - (nheap (!! getUsed getNonHeapMemoryUsage mem))) - (iter pools (fun ((p )) - (format #t "~&; ~a~1,16t: ~10:d\n" - (! getName p) - (!! getUsed getUsage p)))) - (format #t "; Heap~1,16t: ~10:d\n" heap) - (format #t "; Non-Heap~1,16t: ~10:d\n" nheap))) - -;; (df javap (class #!key method signature) -;; (let* (( ) -;; (bytes -;; (typecase class -;; ( (read-bytes ( (to-str class)))) -;; ( class) -;; ( (read-class-file class)))) -;; (cdata ( ( bytes))) -;; (p ( -;; ( bytes) -;; (current-output-port) -;; ()))) -;; (cond (method -;; (dolist ((m ) -;; (array-to-list (! getMethods cdata))) -;; (when (and (equal (to-str method) (! getName m)) -;; (or (not signature) -;; (equal signature (! getInternalSig m)))) -;; (! printMethodSignature p m (! getAccess m)) -;; (! printExceptions p m) -;; (newline) -;; (! printVerboseHeader p m) -;; (! printcodeSequence p m)))) -;; (#t (p:print))) -;; (values))) - -(df read-bytes ((is ) => ) - (let ((os ())) - (let loop () - (let ((c (! read is))) - (cond ((= c -1)) - (#t (! write os c) (loop))))) - (! to-byte-array os))) - -(df read-class-file ((name ) => ) - (let ((f (cat (! replace (to-str name) (as #\.) (as #\/)) - ".class"))) - (mcase (find-file-in-path f (class-path)) - ('#f (ferror "Can't find classfile for ~s" name)) - ((:zip zipfile entry) - (let* ((z ( (as zipfile))) - (e (! getEntry z (as entry)))) - (read-bytes (! getInputStream z e)))) - ((:file s) (read-bytes ( (as s))))))) - -(df all-instances ((vm ) (classname )) - (mappend (fun ((c )) (to-list (! instances c (as long 9999)))) - (%all-subclasses vm classname))) - -(df %all-subclasses ((vm ) (classname )) - (mappend (fun ((c )) (cons c (to-list (! subclasses c)))) - (to-list (! classes-by-name vm classname)))) - -(df with-output-to-string (thunk => ) - (call-with-output-string - (fun (s) (parameterize ((current-output-port s)) (thunk))))) - -(df find-if ((i ) test default) - (let ((iter (! iterator i)) - (found #f)) - (while (and (not found) (! has-next iter)) - (let ((e (! next iter))) - (when (test e) - (set found #t) - (set default e)))) - default)) - -(df filter ((i ) test => ) - (packing (pack) - (for ((e i)) - (when (test e) - (pack e))))) - -(df iter ((i ) f) - (for ((e i)) (f e))) - -(df mapi ((i ) f => ) - (packing (pack) (for ((e i)) (pack (f e))))) - -(df nth ((i ) (n )) - (let ((iter (! iterator i))) - (dotimes (i n) - (! next iter)) - (! next iter))) - -(df 1st ((i )) (!! next iterator i)) - -(df to-list ((i ) => ) - (packing (pack) (for ((e i)) (pack e)))) - -(df as-list ((o ) => ) - (!s java.util.Arrays asList o)) - -(df mappend (f list) - (apply append (map f list))) - -(df subseq (s from to) - (typecase s - ( (apply list (! sub-list s from to))) - ( (apply vector (! sub-list s from to))) - ( (! substring s from to)) - ( (let* ((len (as (- to from))) - (t ( #:length len))) - (!s java.lang.System arraycopy s from t 0 len) - t)))) - -(df to-string (obj => ) - (typecase obj - ( ( obj)) - ((satisfies string?) obj) - ((satisfies symbol?) (symbol->string obj)) - ( ( obj)) - ( ( obj)) - (#t (error "Not a string designator" obj - (class-name-sans-package obj))))) - -(df to-str (obj => ) - (cond ((instance? obj ) obj) - ((string? obj) (! toString obj)) - ((symbol? obj) (! getName (as obj))) - (#t (error "Not a string designator" obj - (class-name-sans-package obj))))) - -)) - -;; Local Variables: -;; mode: goo -;; compile-command: "\ -;; rm -rf classes && \ -;; JAVA_OPTS=-Xss2M kawa --r7rs -d classes -C swank-kawa.scm && \ -;; jar cf swank-kawa.jar -C classes ." -;; End: diff --git a/elpa/slime-20200414.1444/contrib/swank-larceny.scm b/elpa/slime-20200414.1444/contrib/swank-larceny.scm deleted file mode 100644 index e4d730d2..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-larceny.scm +++ /dev/null @@ -1,176 +0,0 @@ -;; swank-larceny.scm --- Swank server for Larceny -;; -;; License: Public Domain -;; Author: Helmut Eller -;; -;; In a shell execute: -;; larceny -r6rs -program swank-larceny.scm -;; and then `M-x slime-connect' in Emacs. - -(library (swank os) - (export getpid make-server-socket accept local-port close-socket) - (import (rnrs) - (primitives foreign-procedure - ffi/handle->address - ffi/string->asciiz - sizeof:pointer - sizeof:int - %set-pointer - %get-int)) - - (define getpid (foreign-procedure "getpid" '() 'int)) - (define fork (foreign-procedure "fork" '() 'int)) - (define close (foreign-procedure "close" '(int) 'int)) - (define dup2 (foreign-procedure "dup2" '(int int) 'int)) - - (define bytevector-content-offset$ sizeof:pointer) - - (define execvp% (foreign-procedure "execvp" '(string boxed) 'int)) - (define (execvp file . args) - (let* ((nargs (length args)) - (argv (make-bytevector (* (+ nargs 1) - sizeof:pointer)))) - (do ((offset 0 (+ offset sizeof:pointer)) - (as args (cdr as))) - ((null? as)) - (%set-pointer argv - offset - (+ (ffi/handle->address (ffi/string->asciiz (car as))) - bytevector-content-offset$))) - (%set-pointer argv (* nargs sizeof:pointer) 0) - (execvp% file argv))) - - (define pipe% (foreign-procedure "pipe" '(boxed) 'int)) - (define (pipe) - (let ((array (make-bytevector (* sizeof:int 2)))) - (let ((r (pipe% array))) - (values r (%get-int array 0) (%get-int array sizeof:int))))) - - (define (fork/exec file . args) - (let ((pid (fork))) - (cond ((= pid 0) - (apply execvp file args)) - (#t pid)))) - - (define (start-process file . args) - (let-values (((r1 down-out down-in) (pipe)) - ((r2 up-out up-in) (pipe)) - ((r3 err-out err-in) (pipe))) - (assert (= 0 r1)) - (assert (= 0 r2)) - (assert (= 0 r3)) - (let ((pid (fork))) - (case pid - ((-1) - (error "Failed to fork a subprocess.")) - ((0) - (close up-out) - (close err-out) - (close down-in) - (dup2 down-out 0) - (dup2 up-in 1) - (dup2 err-in 2) - (apply execvp file args) - (exit 1)) - (else - (close down-out) - (close up-in) - (close err-in) - (list pid - (make-fd-io-stream up-out down-in) - (make-fd-io-stream err-out err-out))))))) - - (define (make-fd-io-stream in out) - (let ((write (lambda (bv start count) (fd-write out bv start count))) - (read (lambda (bv start count) (fd-read in bv start count))) - (closeit (lambda () (close in) (close out)))) - (make-custom-binary-input/output-port - "fd-stream" read write #f #f closeit))) - - (define write% (foreign-procedure "write" '(int ulong int) 'int)) - (define (fd-write fd bytevector start count) - (write% fd - (+ (ffi/handle->address bytevector) - bytevector-content-offset$ - start) - count)) - - (define read% (foreign-procedure "read" '(int ulong int) 'int)) - (define (fd-read fd bytevector start count) - ;;(printf "fd-read: ~a ~s ~a ~a\n" fd bytevector start count) - (read% fd - (+ (ffi/handle->address bytevector) - bytevector-content-offset$ - start) - count)) - - (define (make-server-socket port) - (let* ((args `("/bin/bash" "bash" - "-c" - ,(string-append - "netcat -s 127.0.0.1 -q 0 -l -v " - (if port - (string-append "-p " (number->string port)) - "")))) - (nc (apply start-process args)) - (err (transcoded-port (list-ref nc 2) - (make-transcoder (latin-1-codec)))) - (line (get-line err)) - (pos (last-index-of line '#\]))) - (cond (pos - (let* ((tail (substring line (+ pos 1) (string-length line))) - (port (get-datum (open-string-input-port tail)))) - (list (car nc) (cadr nc) err port))) - (#t (error "netcat failed: " line))))) - - (define (accept socket codec) - (let* ((line (get-line (caddr socket))) - (pos (last-index-of line #\]))) - (cond (pos - (close-port (caddr socket)) - (let ((stream (cadr socket))) - (let ((io (transcoded-port stream (make-transcoder codec)))) - (values io io)))) - (else (error "accept failed: " line))))) - - (define (local-port socket) - (list-ref socket 3)) - - (define (last-index-of str chr) - (let loop ((i (string-length str))) - (cond ((<= i 0) #f) - (#t (let ((i (- i 1))) - (cond ((char=? (string-ref str i) chr) - i) - (#t - (loop i)))))))) - - (define (close-socket socket) - ;;(close-port (cadr socket)) - #f - ) - - ) - -(library (swank sys) - (export implementation-name eval-in-interaction-environment) - (import (rnrs) - (primitives system-features - aeryn-evaluator)) - - (define (implementation-name) "larceny") - - ;; see $LARCENY/r6rsmode.sch: - ;; Larceny's ERR5RS and R6RS modes. - ;; Code names: - ;; Aeryn ERR5RS - ;; D'Argo R6RS-compatible - ;; Spanky R6RS-conforming (not yet implemented) - (define (eval-in-interaction-environment form) - (aeryn-evaluator form)) - - ) - -(import (rnrs) (rnrs eval) (larceny load)) -(load "swank-r6rs.scm") -(eval '(start-server #f) (environment '(swank))) diff --git a/elpa/slime-20200414.1444/contrib/swank-listener-hooks.lisp b/elpa/slime-20200414.1444/contrib/swank-listener-hooks.lisp deleted file mode 100644 index f289c90f..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-listener-hooks.lisp +++ /dev/null @@ -1,91 +0,0 @@ -;;; swank-listener-hooks.lisp --- listener with special hooks -;; -;; Author: Alan Ruttenberg - -;; Provides *slime-repl-eval-hooks* special variable which -;; can be used for easy interception of SLIME REPL form evaluation -;; for purposes such as integration with application event loop. - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-repl)) - -(defvar *slime-repl-advance-history* nil - "In the dynamic scope of a single form typed at the repl, is set to nil to - prevent the repl from advancing the history - * ** *** etc.") - -(defvar *slime-repl-suppress-output* nil - "In the dynamic scope of a single form typed at the repl, is set to nil to - prevent the repl from printing the result of the evalation.") - -(defvar *slime-repl-eval-hook-pass* (gensym "PASS") - "Token to indicate that a repl hook declines to evaluate the form") - -(defvar *slime-repl-eval-hooks* nil - "A list of functions. When the repl is about to eval a form, first try running each of - these hooks. The first hook which returns a value which is not *slime-repl-eval-hook-pass* - is considered a replacement for calling eval. If there are no hooks, or all - pass, then eval is used.") - -(export '*slime-repl-eval-hooks*) - -(defslimefun repl-eval-hook-pass () - "call when repl hook declines to evaluate the form" - (throw *slime-repl-eval-hook-pass* *slime-repl-eval-hook-pass*)) - -(defslimefun repl-suppress-output () - "In the dynamic scope of a single form typed at the repl, call to - prevent the repl from printing the result of the evalation." - (setq *slime-repl-suppress-output* t)) - -(defslimefun repl-suppress-advance-history () - "In the dynamic scope of a single form typed at the repl, call to - prevent the repl from advancing the history - * ** *** etc." - (setq *slime-repl-advance-history* nil)) - -(defun %eval-region (string) - (with-input-from-string (stream string) - (let (- values) - (loop - (let ((form (read stream nil stream))) - (when (eq form stream) - (fresh-line) - (finish-output) - (return (values values -))) - (setq - form) - (if *slime-repl-eval-hooks* - (setq values (run-repl-eval-hooks form)) - (setq values (multiple-value-list (eval form)))) - (finish-output)))))) - -(defun run-repl-eval-hooks (form) - (loop for hook in *slime-repl-eval-hooks* - for res = (catch *slime-repl-eval-hook-pass* - (multiple-value-list (funcall hook form))) - until (not (eq res *slime-repl-eval-hook-pass*)) - finally (return - (if (eq res *slime-repl-eval-hook-pass*) - (multiple-value-list (eval form)) - res)))) - -(defun %listener-eval (string) - (clear-user-input) - (with-buffer-syntax () - (swank-repl::track-package - (lambda () - (let ((*slime-repl-suppress-output* :unset) - (*slime-repl-advance-history* :unset)) - (multiple-value-bind (values last-form) (%eval-region string) - (unless (or (and (eq values nil) (eq last-form nil)) - (eq *slime-repl-advance-history* nil)) - (setq *** ** ** * * (car values) - /// // // / / values)) - (setq +++ ++ ++ + + last-form) - (unless (eq *slime-repl-suppress-output* t) - (funcall swank-repl::*send-repl-results-function* values))))))) - nil) - -(setq swank-repl::*listener-eval-function* '%listener-eval) - -(provide :swank-listener-hooks) diff --git a/elpa/slime-20200414.1444/contrib/swank-macrostep.lisp b/elpa/slime-20200414.1444/contrib/swank-macrostep.lisp deleted file mode 100644 index 7595e36b..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-macrostep.lisp +++ /dev/null @@ -1,227 +0,0 @@ -;;; swank-macrostep.lisp -- fancy macro-expansion via macrostep.el -;; -;; Authors: Luis Oliveira -;; Jon Oddie -;; -;; License: Public Domain - -(defpackage swank-macrostep - (:use cl swank) - (:import-from swank - #:*macroexpand-printer-bindings* - #:with-buffer-syntax - #:with-bindings - #:to-string - #:macroexpand-all - #:compiler-macroexpand-1 - #:defslimefun - #:collect-macro-forms) - (:export #:macrostep-expand-1 - #:macro-form-p)) - -(in-package #:swank-macrostep) - -(defslimefun macrostep-expand-1 (string compiler-macros? context) - (with-buffer-syntax () - (let ((form (read-from-string string))) - (multiple-value-bind (expansion error-message) - (expand-form-once form compiler-macros? context) - (if error-message - `(:error ,error-message) - (multiple-value-bind (macros compiler-macros) - (collect-macro-forms-in-context expansion context) - (let* ((all-macros (append macros compiler-macros)) - (pretty-expansion (pprint-to-string expansion)) - (positions (collect-form-positions expansion - pretty-expansion - all-macros)) - (subform-info - (loop - for form in all-macros - for (start end) in positions - when (and start end) - collect (let ((op-name (to-string (first form))) - (op-type - (if (member form macros) - :macro - :compiler-macro))) - (list op-name - op-type - start))))) - `(:ok ,pretty-expansion ,subform-info)))))))) - -(defun expand-form-once (form compiler-macros? context) - (multiple-value-bind (expansion expanded?) - (macroexpand-1-in-context form context) - (if expanded? - (values expansion nil) - (if (not compiler-macros?) - (values nil "Not a macro form") - (multiple-value-bind (expansion expanded?) - (compiler-macroexpand-1 form) - (if expanded? - (values expansion nil) - (values nil "Not a macro or compiler-macro form"))))))) - -(defslimefun macro-form-p (string compiler-macros? context) - (with-buffer-syntax () - (let ((form - (handler-case - (read-from-string string) - (error (condition) - (unless (debug-on-swank-error) - (return-from macro-form-p - `(:error ,(format nil "Read error: ~A" condition)))))))) - `(:ok ,(macro-form-type form compiler-macros? context))))) - -(defun macro-form-type (form compiler-macros? context) - (cond - ((or (not (consp form)) - (not (symbolp (car form)))) - nil) - ((multiple-value-bind (expansion expanded?) - (macroexpand-1-in-context form context) - (declare (ignore expansion)) - expanded?) - :macro) - ((and compiler-macros? - (multiple-value-bind (expansion expanded?) - (compiler-macroexpand-1 form) - (declare (ignore expansion)) - expanded?)) - :compiler-macro) - (t - nil))) - - -;;;; Hacks to support macro-expansion within local context - -(defparameter *macrostep-tag* (gensym)) - -(defparameter *macrostep-placeholder* '*macrostep-placeholder*) - -(define-condition expansion-in-context-failed (simple-error) - ()) - -(defmacro throw-expansion (form &environment env) - (throw *macrostep-tag* (macroexpand-1 form env))) - -(defmacro throw-collected-macro-forms (form &environment env) - (throw *macrostep-tag* (collect-macro-forms form env))) - -(defun macroexpand-1-in-context (form context) - (handler-case - (macroexpand-and-catch - `(throw-expansion ,form) context) - (error () - (macroexpand-1 form)))) - -(defun collect-macro-forms-in-context (form context) - (handler-case - (macroexpand-and-catch - `(throw-collected-macro-forms ,form) context) - (error () - (collect-macro-forms form)))) - -(defun macroexpand-and-catch (form context) - (catch *macrostep-tag* - (macroexpand-all (enclose-form-in-context form context)) - (error 'expansion-in-context-failed))) - -(defun enclose-form-in-context (form context) - (with-buffer-syntax () - (destructuring-bind (prefix suffix) context - (let* ((placeholder-form - (read-from-string - (concatenate - 'string - prefix (prin1-to-string *macrostep-placeholder*) suffix))) - (substituted-form (subst form *macrostep-placeholder* - placeholder-form))) - (if (not (equal placeholder-form substituted-form)) - substituted-form - (error 'expansion-in-context-failed)))))) - - -;;;; Tracking Pretty Printer - -(defun marker-char-p (char) - (<= #xe000 (char-code char) #xe8ff)) - -(defun make-marker-char (id) - ;; using the private-use characters U+E000..U+F8FF as markers, so - ;; that's our upper limit for how many we can use. - (assert (<= 0 id #x8ff)) - (code-char (+ #xe000 id))) - -(defun marker-char-id (char) - (assert (marker-char-p char)) - (- (char-code char) #xe000)) - -(defparameter +whitespace+ (mapcar #'code-char '(9 13 10 32))) - -(defun whitespacep (char) - (member char +whitespace+)) - -(defun pprint-to-string (object &optional pprint-dispatch) - (let ((*print-pprint-dispatch* (or pprint-dispatch *print-pprint-dispatch*))) - (with-bindings *macroexpand-printer-bindings* - (to-string object)))) - -#-clisp -(defun collect-form-positions (expansion printed-expansion forms) - (loop for (start end) - in (collect-marker-positions - (pprint-to-string expansion (make-tracking-pprint-dispatch forms)) - (length forms)) - collect (when (and start end) - (list (find-non-whitespace-position printed-expansion start) - (find-non-whitespace-position printed-expansion end))))) - -;; The pprint-dispatch table constructed by -;; MAKE-TRACKING-PPRINT-DISPATCH causes an infinite loop and stack -;; overflow under CLISP version 2.49. Make the COLLECT-FORM-POSITIONS -;; entry point a no-op in thi case, so that basic macro-expansion will -;; still work (without detection of inner macro forms) -#+clisp -(defun collect-form-positions (expansion printed-expansion forms) - nil) - -(defun make-tracking-pprint-dispatch (forms) - (let ((original-table *print-pprint-dispatch*) - (table (copy-pprint-dispatch))) - (flet ((maybe-write-marker (position stream) - (when position - (write-char (make-marker-char position) stream)))) - (set-pprint-dispatch 'cons - (lambda (stream cons) - (let ((pos (position cons forms))) - (maybe-write-marker pos stream) - ;; delegate printing to the original table. - (funcall (pprint-dispatch cons original-table) - stream - cons) - (maybe-write-marker pos stream))) - most-positive-fixnum - table)) - table)) - -(defun collect-marker-positions (string position-count) - (let ((positions (make-array position-count :initial-element nil))) - (loop with p = 0 - for char across string - unless (whitespacep char) - do (if (marker-char-p char) - (push p (aref positions (marker-char-id char))) - (incf p))) - (map 'list #'reverse positions))) - -(defun find-non-whitespace-position (string position) - (loop with non-whitespace-position = -1 - for i from 0 and char across string - unless (whitespacep char) - do (incf non-whitespace-position) - until (eql non-whitespace-position position) - finally (return i))) - -(provide :swank-macrostep) diff --git a/elpa/slime-20200414.1444/contrib/swank-media.lisp b/elpa/slime-20200414.1444/contrib/swank-media.lisp deleted file mode 100644 index 3d5ef7cc..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-media.lisp +++ /dev/null @@ -1,25 +0,0 @@ -;;; swank-media.lisp --- insert other media (images) -;; -;; Authors: Christophe Rhodes -;; -;; Licence: GPLv2 or later -;; - -(in-package :swank) - -;; this file is empty of functionality. The slime-media contrib -;; allows swank to return messages other than :write-string as repl -;; results; this is used in the R implementation of swank to display R -;; objects with graphical representations (such as trellis objects) as -;; image presentations in the swank repl. In R, this is done by -;; having a hook function for the preparation of the repl results, in -;; addition to the already-existing hook for sending the repl results -;; (*send-repl-results-function*, used by swank-presentations.lisp). -;; The swank-media.R contrib implementation defines a generic function -;; for use as this hook, along with methods for commonly-encountered -;; graphical R objects. (This strategy is harder in CL, where methods -;; can only be defined if their specializers already exist; in R's S3 -;; object system, methods are ordinary functions with a special naming -;; convention) - -(provide :swank-media) diff --git a/elpa/slime-20200414.1444/contrib/swank-mit-scheme.scm b/elpa/slime-20200414.1444/contrib/swank-mit-scheme.scm deleted file mode 100644 index e7729ff0..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-mit-scheme.scm +++ /dev/null @@ -1,870 +0,0 @@ -;;; swank-mit-scheme.scm --- SLIME server for MIT Scheme -;; -;; Copyright (C) 2008 Helmut Eller -;; -;; This file is licensed under the terms of the GNU General Public -;; License as distributed with Emacs (press C-h C-c for details). - -;;;; Installation: -#| - -1. You need MIT Scheme 9.2 - -2. The Emacs side needs some fiddling. I have the following in - my .emacs: - -(setq slime-lisp-implementations - '((mit-scheme ("mit-scheme") :init mit-scheme-init))) - -(defun mit-scheme-init (file encoding) - (format "%S\n\n" - `(begin - (load-option 'format) - (load-option 'sos) - (eval - '(create-package-from-description - (make-package-description '(swank) (list (list)) - (vector) (vector) (vector) false)) - (->environment '(package))) - (load ,(expand-file-name - ".../contrib/swank-mit-scheme.scm" ; <-- insert your path - slime-path) - (->environment '(swank))) - (eval '(start-swank ,file) (->environment '(swank)))))) - -(defun mit-scheme () - (interactive) - (slime 'mit-scheme)) - -(defun find-mit-scheme-package () - (save-excursion - (let ((case-fold-search t)) - (and (re-search-backward "^[;]+ package: \\((.+)\\).*$" nil t) - (match-string-no-properties 1))))) - -(setq slime-find-buffer-package-function 'find-mit-scheme-package) -(add-hook 'scheme-mode-hook (lambda () (slime-mode 1))) - - The `mit-scheme-init' function first loads the SOS and FORMAT - libraries, then creates a package "(swank)", and loads this file - into that package. Finally it starts the server. - - `find-mit-scheme-package' tries to figure out which package the - buffer belongs to, assuming that ";;; package: (FOO)" appears - somewhere in the file. Luckily, this assumption is true for many of - MIT Scheme's own files. Alternatively, you could add Emacs style - -*- slime-buffer-package: "(FOO)" -*- file variables. - -4. Start everything with `M-x mit-scheme'. - -|# - -;;; package: (swank) - -(if (< (car (get-subsystem-version "Release")) - '9) - (error "This file requires MIT Scheme Release 9")) - -(define (swank port) - (accept-connections (or port 4005) #f)) - -;; ### hardcoded port number for now. netcat-openbsd doesn't print -;; the listener port anymore. -(define (start-swank port-file) - (accept-connections 4055 port-file) - ) - -;;;; Networking - -(define (accept-connections port port-file) - (let ((sock (open-tcp-server-socket port (host-address-loopback)))) - (format #t "Listening on port: ~s~%" port) - (if port-file (write-port-file port port-file)) - (dynamic-wind - (lambda () #f) - (lambda () (serve (tcp-server-connection-accept sock #t #f))) - (lambda () (close-tcp-server-socket sock))))) - -(define (write-port-file portnumber filename) - (call-with-output-file filename (lambda (p) (write portnumber p)))) - -(define *top-level-restart* #f) -(define (serve socket) - (with-simple-restart - 'disconnect "Close connection." - (lambda () - (with-keyboard-interrupt-handler - (lambda () (main-loop socket)))))) - -(define (disconnect) - (format #t "Disconnecting ...~%") - (invoke-restart (find-restart 'disconnect))) - -(define (main-loop socket) - (do () (#f) - (with-simple-restart - 'abort "Return to SLIME top-level." - (lambda () - (fluid-let ((*top-level-restart* (find-restart 'abort))) - (dispatch (read-packet socket) socket 0)))))) - -(define (with-keyboard-interrupt-handler fun) - (define (set-^G-handler exp) - (eval `(vector-set! keyboard-interrupt-vector (char->ascii #\G) ,exp) - (->environment '(runtime interrupt-handler)))) - (dynamic-wind - (lambda () #f) - (lambda () - (set-^G-handler - `(lambda (char) (with-simple-restart - 'continue "Continue from interrupt." - (lambda () (error "Keyboard Interrupt."))))) - (fun)) - (lambda () - (set-^G-handler '^G-interrupt-handler)))) - - -;;;; Reading/Writing of SLIME packets - -(define (read-packet in) - "Read an S-expression from STREAM using the SLIME protocol." - (let* ((len (read-length in)) - (buffer (make-string len))) - (fill-buffer! in buffer) - (read-from-string buffer))) - -(define (write-packet message out) - (let* ((string (write-to-string message))) - (log-event "WRITE: [~a]~s~%" (string-length string) string) - (write-length (string-length string) out) - (write-string string out) - (flush-output out))) - -(define (fill-buffer! in buffer) - (read-string! buffer in)) - -(define (read-length in) - (if (eof-object? (peek-char in)) (disconnect)) - (do ((len 6 (1- len)) - (sum 0 (+ (* sum 16) (char->hex-digit (read-char in))))) - ((zero? len) sum))) - -(define (ldb size position integer) - "LoaD a Byte of SIZE bits at bit position POSITION from INTEGER." - (fix:and (fix:lsh integer (- position)) - (1- (fix:lsh 1 size)))) - -(define (write-length len out) - (do ((pos 20 (- pos 4))) - ((< pos 0)) - (write-hex-digit (ldb 4 pos len) out))) - -(define (write-hex-digit n out) - (write-char (hex-digit->char n) out)) - -(define (hex-digit->char n) - (digit->char n 16)) - -(define (char->hex-digit c) - (char->digit c 16)) - - -;;;; Event dispatching - -(define (dispatch request socket level) - (log-event "READ: ~s~%" request) - (case (car request) - ((:emacs-rex) (apply emacs-rex socket level (cdr request))))) - -(define (swank-package) - (or (name->package '(swank)) - (name->package '(user)))) - -(define *buffer-package* #f) -(define (find-buffer-package name) - (if (elisp-false? name) - #f - (let ((v (ignore-errors - (lambda () (name->package (read-from-string name)))))) - (and (package? v) v)))) - -(define swank-env (->environment (swank-package))) -(define (user-env buffer-package) - (cond ((string? buffer-package) - (let ((p (find-buffer-package buffer-package))) - (if (not p) (error "Invalid package name: " buffer-package)) - (package/environment p))) - (else (nearest-repl/environment)))) - -;; quote keywords -(define (hack-quotes list) - (map (lambda (x) - (cond ((symbol? x) `(quote ,x)) - (#t x))) - list)) - -(define (emacs-rex socket level sexp package thread id) - (let ((ok? #f) (result #f) (condition #f)) - (dynamic-wind - (lambda () #f) - (lambda () - (bind-condition-handler - (list condition-type:serious-condition) - (lambda (c) (set! condition c) (invoke-sldb socket (1+ level) c)) - (lambda () - (fluid-let ((*buffer-package* package)) - (set! result - (eval (cons* (car sexp) socket (hack-quotes (cdr sexp))) - swank-env)) - (set! ok? #t))))) - (lambda () - (write-packet `(:return - ,(if ok? `(:ok ,result) - `(:abort - ,(if condition - (format #f "~a" - (condition/type condition)) - ""))) - ,id) - socket))))) - -(define (swank:connection-info _) - (let ((p (environment->package (user-env #f)))) - `(:pid ,(unix/current-pid) - :package (:name ,(write-to-string (package/name p)) - :prompt ,(write-to-string (package/name p))) - :lisp-implementation - (:type "MIT Scheme" :version ,(get-subsystem-version-string "release")) - :encoding (:coding-systems ("iso-8859-1")) - ))) - -(define (swank:quit-lisp _) - (%exit)) - - -;;;; Evaluation - -(define (swank-repl:listener-eval socket string) - ;;(call-with-values (lambda () (eval-region string socket)) - ;; (lambda values `(:values . ,(map write-to-string values)))) - `(:values ,(write-to-string (eval-region string socket)))) - -(define (eval-region string socket) - (let ((sexp (read-from-string string))) - (if (eof-object? exp) - (values) - (with-output-to-repl socket - (lambda () (eval sexp (user-env *buffer-package*))))))) - -(define (with-output-to-repl socket fun) - (let ((p (make-port repl-port-type socket))) - (dynamic-wind - (lambda () #f) - (lambda () (with-output-to-port p fun)) - (lambda () (flush-output p))))) - -(define (swank:interactive-eval socket string) - ;;(call-with-values (lambda () (eval-region string)) format-for-echo-area) - (format-values (eval-region string socket)) - ) - -(define (format-values . values) - (if (null? values) - "; No value" - (with-string-output-port - (lambda (out) - (write-string "=> " out) - (do ((vs values (cdr vs))) ((null? vs)) - (write (car vs) out) - (if (not (null? (cdr vs))) - (write-string ", " out))))))) - -(define (swank:pprint-eval _ string) - (pprint-to-string (eval (read-from-string string) - (user-env *buffer-package*)))) - -(define (swank:interactive-eval-region socket string) - (format-values (eval-region string socket))) - -(define (swank:set-package _ package) - (set-repl/environment! (nearest-repl) - (->environment (read-from-string package))) - (let* ((p (environment->package (user-env #f))) - (n (write-to-string (package/name p)))) - (list n n))) - - -(define (repl-write-substring port string start end) - (cond ((< start end) - (write-packet `(:write-string ,(substring string start end)) - (port/state port)))) - (- end start)) - -(define (repl-write-char port char) - (write-packet `(:write-string ,(string char)) - (port/state port))) - -(define repl-port-type - (make-port-type `((write-substring ,repl-write-substring) - (write-char ,repl-write-char)) #f)) - -(define (swank-repl:create-repl socket . _) - (let* ((env (user-env #f)) - (name (format #f "~a" (package/name (environment->package env))))) - (list name name))) - - -;;;; Compilation - -(define (swank:compile-string-for-emacs _ string . x) - (apply - (lambda (errors seconds) - `(:compilation-result ,errors t ,seconds nil nil)) - (call-compiler - (lambda () - (let* ((sexps (snarf-string string)) - (env (user-env *buffer-package*)) - (scode (syntax `(begin ,@sexps) env)) - (compiled-expression (compile-scode scode #t))) - (scode-eval compiled-expression env)))))) - -(define (snarf-string string) - (with-input-from-string string - (lambda () - (let loop () - (let ((e (read))) - (if (eof-object? e) '() (cons e (loop)))))))) - -(define (call-compiler fun) - (let ((time #f)) - (with-timings fun - (lambda (run-time gc-time real-time) - (set! time real-time))) - (list 'nil (internal-time/ticks->seconds time)))) - -(define (swank:compiler-notes-for-emacs _) nil) - -(define (swank:compile-file-for-emacs socket file load?) - (apply - (lambda (errors seconds) - (list ':compilation-result errors 't seconds load? - (->namestring (pathname-name file)))) - (call-compiler - (lambda () (with-output-to-repl socket (lambda () (compile-file file))))))) - -(define (swank:load-file socket file) - (with-output-to-repl socket - (lambda () - (pprint-to-string - (load file (user-env *buffer-package*)))))) - -(define (swank:disassemble-form _ string) - (let ((sexp (let ((sexp (read-from-string string))) - (cond ((and (pair? sexp) (eq? (car sexp) 'quote)) - (cadr sexp)) - (#t sexp))))) - (with-output-to-string - (lambda () - (compiler:disassemble - (eval sexp (user-env *buffer-package*))))))) - -(define (swank:disassemble-symbol _ string) - (with-output-to-string - (lambda () - (compiler:disassemble - (eval (read-from-string string) - (user-env *buffer-package*)))))) - - -;;;; Macroexpansion - -(define (swank:swank-macroexpand-all _ string) - (with-output-to-string - (lambda () - (pp (syntax (read-from-string string) - (user-env *buffer-package*)))))) -(define swank:swank-macroexpand-1 swank:swank-macroexpand-all) -(define swank:swank-macroexpand swank:swank-macroexpand-all) - - -;;; Arglist - -(define (swank:operator-arglist socket name pack) - (let ((v (ignore-errors - (lambda () - (string-trim-right - (with-output-to-string - (lambda () - (carefully-pa - (eval (read-from-string name) (user-env pack)))))))))) - (if (condition? v) 'nil v))) - -(define (carefully-pa o) - (cond ((arity-dispatched-procedure? o) - ;; MIT Scheme crashes for (pa /) - (display "arity-dispatched-procedure")) - ((procedure? o) (pa o)) - (else (error "Not a procedure")))) - - -;;; Some unimplemented stuff. -(define (swank:buffer-first-change . _) nil) -(define (swank:filename-to-modulename . _) nil) -(define (swank:swank-require . _) nil) - -;; M-. is beyond my capabilities. -(define (swank:find-definitions-for-emacs . _) nil) - - -;;; Debugger - -(define-structure (sldb-state (conc-name sldb-state.)) condition restarts) - -(define *sldb-state* #f) -(define (invoke-sldb socket level condition) - (fluid-let ((*sldb-state* (make-sldb-state condition (bound-restarts)))) - (dynamic-wind - (lambda () #f) - (lambda () - (write-packet `(:debug 0 ,level ,@(sldb-info *sldb-state* 0 20)) - socket) - (sldb-loop level socket)) - (lambda () - (write-packet `(:debug-return 0 ,level nil) socket))))) - -(define (sldb-loop level socket) - (write-packet `(:debug-activate 0 ,level) socket) - (with-simple-restart - 'abort (format #f "Return to SLDB level ~a." level) - (lambda () (dispatch (read-packet socket) socket level))) - (sldb-loop level socket)) - -(define (sldb-info state start end) - (let ((c (sldb-state.condition state)) - (rs (sldb-state.restarts state))) - (list (list (condition/report-string c) - (format #f " [~a]" (%condition-type/name (condition/type c))) - nil) - (sldb-restarts rs) - (sldb-backtrace c start end) - ;;'((0 "dummy frame")) - '()))) - -(define %condition-type/name - (eval '%condition-type/name (->environment '(runtime error-handler)))) - -(define (sldb-restarts restarts) - (map (lambda (r) - (list (symbol->string (restart/name r)) - (with-string-output-port - (lambda (p) (write-restart-report r p))))) - restarts)) - -(define (swank:throw-to-toplevel . _) - (invoke-restart *top-level-restart*)) - -(define (swank:sldb-abort . _) - (abort (sldb-state.restarts *sldb-state*))) - -(define (swank:sldb-continue . _) - (continue (sldb-state.restarts *sldb-state*))) - -(define (swank:invoke-nth-restart-for-emacs _ _sldb-level n) - (invoke-restart (list-ref (sldb-state.restarts *sldb-state*) n))) - -(define (swank:debugger-info-for-emacs _ from to) - (sldb-info *sldb-state* from to)) - -(define (swank:backtrace _ from to) - (sldb-backtrace (sldb-state.condition *sldb-state*) from to)) - -(define (sldb-backtrace condition from to) - (sldb-backtrace-aux (condition/continuation condition) from to)) - -(define (sldb-backtrace-aux k from to) - (let ((l (map frame>string (substream (continuation>frames k) from to)))) - (let loop ((i from) (l l)) - (if (null? l) - '() - (cons (list i (car l)) (loop (1+ i) (cdr l))))))) - -;; Stack parser fails for this: -;; (map (lambda (x) x) "/tmp/x.x") - -(define (continuation>frames k) - (let loop ((frame (continuation->stack-frame k))) - (cond ((not frame) (stream)) - (else - (let ((next (ignore-errors - (lambda () (stack-frame/next-subproblem frame))))) - (cons-stream frame - (if (condition? next) - (stream next) - (loop next)))))))) - -(define (frame>string frame) - (if (condition? frame) - (format #f "Bogus frame: ~a ~a" frame - (condition/report-string frame)) - (with-string-output-port (lambda (p) (print-frame frame p))))) - -(define (print-frame frame port) - (define (invalid-subexpression? subexpression) - (or (debugging-info/undefined-expression? subexpression) - (debugging-info/unknown-expression? subexpression))) - (define (invalid-expression? expression) - (or (debugging-info/undefined-expression? expression) - (debugging-info/compiled-code? expression))) - (with-values (lambda () (stack-frame/debugging-info frame)) - (lambda (expression environment subexpression) - (cond ((debugging-info/compiled-code? expression) - (write-string ";unknown compiled code" port)) - ((not (debugging-info/undefined-expression? expression)) - (fluid-let ((*unparse-primitives-by-name?* #t)) - (write - (unsyntax (if (invalid-subexpression? subexpression) - expression - subexpression)) - port))) - ((debugging-info/noise? expression) - (write-string ";" port) - (write-string ((debugging-info/noise expression) #f) - port)) - (else - (write-string ";undefined expression" port)))))) - -(define (substream s from to) - (let loop ((i 0) (l '()) (s s)) - (cond ((or (= i to) (stream-null? s)) (reverse l)) - ((< i from) (loop (1+ i) l (stream-cdr s))) - (else (loop (1+ i) (cons (stream-car s) l) (stream-cdr s)))))) - -(define (swank:frame-locals-and-catch-tags _ frame) - (list (map frame-var>elisp (frame-vars (sldb-get-frame frame))) - '())) - -(define (frame-vars frame) - (with-values (lambda () (stack-frame/debugging-info frame)) - (lambda (expression environment subexpression) - (cond ((environment? environment) - (environment>frame-vars environment)) - (else '()))))) - -(define (environment>frame-vars environment) - (let loop ((e environment)) - (cond ((environment->package e) '()) - (else (append (environment-bindings e) - (if (environment-has-parent? e) - (loop (environment-parent e)) - '())))))) - -(define (frame-var>elisp b) - (list ':name (write-to-string (car b)) - ':value (cond ((null? (cdr b)) "{unavailable}") - (else (>line (cadr b)))) - ':id 0)) - -(define (sldb-get-frame index) - (stream-ref (continuation>frames - (condition/continuation - (sldb-state.condition *sldb-state*))) - index)) - -(define (frame-var-value frame var) - (let ((binding (list-ref (frame-vars frame) var))) - (cond ((cdr binding) (cadr binding)) - (else unspecific)))) - -(define (swank:inspect-frame-var _ frame var) - (reset-inspector) - (inspect-object (frame-var-value (sldb-get-frame frame) var))) - - -;;;; Completion - -(define (swank:simple-completions _ string package) - (let ((strings (all-completions string (user-env package) string-prefix?))) - (list (sort strings stringstring (environment-names env)))) - (keep-matching-items ss (lambda (s) (match? pattern s))))) - -;; symbol->string is too slow -(define %symbol->string symbol-name) - -(define (environment-names env) - (append (environment-bound-names env) - (if (environment-has-parent? env) - (environment-names (environment-parent env)) - '()))) - -(define (longest-common-prefix strings) - (define (common-prefix s1 s2) - (substring s1 0 (string-match-forward s1 s2))) - (reduce common-prefix "" strings)) - - -;;;; Apropos - -(define (swank:apropos-list-for-emacs _ name #!optional - external-only case-sensitive package) - (let* ((pkg (and (string? package) - (find-package (read-from-string package)))) - (parent (and (not (default-object? external-only)) - (elisp-false? external-only))) - (ss (append-map (lambda (p) - (map (lambda (s) (cons p s)) - (apropos-list name p (and pkg parent)))) - (if pkg (list pkg) (all-packages)))) - (ss (sublist ss 0 (min (length ss) 200)))) - (map (lambda (e) - (let ((p (car e)) (s (cdr e))) - (list ':designator (format #f "~a ~a" s (package/name p)) - ':variable (>line - (ignore-errors - (lambda () (package-lookup p s))))))) - ss))) - -(define (swank:list-all-package-names . _) - (map (lambda (p) (write-to-string (package/name p))) - (all-packages))) - -(define (all-packages) - (define (package-and-children package) - (append (list package) - (append-map package-and-children (package/children package)))) - (package-and-children system-global-package)) - - -;;;; Inspector - -(define-structure (inspector-state (conc-name istate.)) - object parts next previous content) - -(define istate #f) - -(define (reset-inspector) - (set! istate #f)) - -(define (swank:init-inspector _ string) - (reset-inspector) - (inspect-object (eval (read-from-string string) - (user-env *buffer-package*)))) - -(define (inspect-object o) - (let ((previous istate) - (content (inspect o)) - (parts (make-eqv-hash-table))) - (set! istate (make-inspector-state o parts #f previous content)) - (if previous (set-istate.next! previous istate)) - (istate>elisp istate))) - -(define (istate>elisp istate) - (list ':title (>line (istate.object istate)) - ':id (assign-index (istate.object istate) (istate.parts istate)) - ':content (prepare-range (istate.parts istate) - (istate.content istate) - 0 500))) - -(define (assign-index o parts) - (let ((i (hash-table/count parts))) - (hash-table/put! parts i o) - i)) - -(define (prepare-range parts content from to) - (let* ((cs (substream content from to)) - (ps (prepare-parts cs parts))) - (list ps - (if (< (length cs) (- to from)) - (+ from (length cs)) - (+ to 1000)) - from to))) - -(define (prepare-parts ps parts) - (define (line label value) - `(,(format #f "~a: " label) - (:value ,(>line value) ,(assign-index value parts)) - "\n")) - (append-map (lambda (p) - (cond ((string? p) (list p)) - ((symbol? p) (list (symbol->string p))) - (#t - (case (car p) - ((line) (apply line (cdr p))) - (else (error "Invalid part:" p)))))) - ps)) - -(define (swank:inspect-nth-part _ index) - (inspect-object (hash-table/get (istate.parts istate) index 'no-such-part))) - -(define (swank:quit-inspector _) - (reset-inspector)) - -(define (swank:inspector-pop _) - (cond ((istate.previous istate) - (set! istate (istate.previous istate)) - (istate>elisp istate)) - (else 'nil))) - -(define (swank:inspector-next _) - (cond ((istate.next istate) - (set! istate (istate.next istate)) - (istate>elisp istate)) - (else 'nil))) - -(define (swank:inspector-range _ from to) - (prepare-range (istate.parts istate) - (istate.content istate) - from to)) - -(define-syntax stream* - (syntax-rules () - ((stream* tail) tail) - ((stream* e1 e2 ...) (cons-stream e1 (stream* e2 ...))))) - -(define (iline label value) `(line ,label ,value)) - -(define-generic inspect (o)) - -(define-method inspect ((o )) - (cond ((environment? o) (inspect-environment o)) - ((vector? o) (inspect-vector o)) - ((procedure? o) (inspect-procedure o)) - ((compiled-code-block? o) (inspect-code-block o)) - ;;((system-pair? o) (inspect-system-pair o)) - ((probably-scode? o) (inspect-scode o)) - (else (inspect-fallback o)))) - -(define (inspect-fallback o) - (let* ((class (object-class o)) - (slots (class-slots class))) - (stream* - (iline "Class" class) - (let loop ((slots slots)) - (cond ((null? slots) (stream)) - (else - (let ((n (slot-name (car slots)))) - (stream* (iline n (slot-value o n)) - (loop (cdr slots)))))))))) - -(define-method inspect ((o )) - (if (or (pair? (cdr o)) (null? (cdr o))) - (inspect-list o) - (inspect-cons o))) - -(define (inspect-cons o) - (stream (iline "car" (car o)) - (iline "cdr" (cdr o)))) - -(define (inspect-list o) - (let loop ((i 0) (o o)) - (cond ((null? o) (stream)) - ((or (pair? (cdr o)) (null? (cdr o))) - (stream* (iline i (car o)) - (loop (1+ i) (cdr o)))) - (else - (stream (iline i (car o)) - (iline "tail" (cdr o))))))) - -(define (inspect-environment o) - (stream* - (iline "(package)" (environment->package o)) - (let loop ((bs (environment-bindings o))) - (cond ((null? bs) - (if (environment-has-parent? o) - (stream (iline "()" (environment-parent o))) - (stream))) - (else - (let* ((b (car bs)) (s (car b))) - (cond ((null? (cdr b)) - (stream* s " {" (environment-reference-type o s) "}\n" - (loop (cdr bs)))) - (else - (stream* (iline s (cadr b)) - (loop (cdr bs))))))))))) - -(define (inspect-vector o) - (let ((len (vector-length o))) - (let loop ((i 0)) - (cond ((= i len) (stream)) - (else (stream* (iline i (vector-ref o i)) - (loop (1+ i)))))))) - -(define (inspect-procedure o) - (cond ((primitive-procedure? o) - (stream (iline "name" (primitive-procedure-name o)) - (iline "arity" (primitive-procedure-arity o)) - (iline "doc" (primitive-procedure-documentation o)))) - ((compound-procedure? o) - (stream (iline "arity" (procedure-arity o)) - (iline "lambda" (procedure-lambda o)) - (iline "env" (ignore-errors - (lambda () (procedure-environment o)))))) - (else - (stream - (iline "block" (compiled-entry/block o)) - (with-output-to-string (lambda () (compiler:disassemble o))))))) - -(define (inspect-code-block o) - (stream-append - (let loop ((i (compiled-code-block/constants-start o))) - (cond ((>= i (compiled-code-block/constants-end o)) (stream)) - (else - (stream* - (iline i (system-vector-ref o i)) - (loop (+ i compiled-code-block/bytes-per-object)))))) - (stream (iline "debuginfo" (compiled-code-block/debugging-info o)) - (iline "env" (compiled-code-block/environment o)) - (with-output-to-string (lambda () (compiler:disassemble o)))))) - -(define (inspect-scode o) - (stream (pprint-to-string o))) - -(define (probably-scode? o) - (define tests (list access? assignment? combination? comment? - conditional? definition? delay? disjunction? lambda? - quotation? sequence? the-environment? variable?)) - (let loop ((tests tests)) - (cond ((null? tests) #f) - (((car tests) o)) - (else (loop (cdr tests)))))) - -(define (inspect-system-pair o) - (stream (iline "car" (system-pair-car o)) - (iline "cdr" (system-pair-cdr o)))) - - -;;;; Auxilary functions - -(define nil '()) -(define t 't) -(define (elisp-false? o) (member o '(nil ()))) -(define (elisp-true? o) (not (elisp-false? o))) -(define (>line o) - (let ((r (write-to-string o 100))) - (cond ((not (car r)) (cdr r)) - (else (string-append (cdr r) " .."))))) -;; Must compile >line otherwise we can't write unassigend-reference-traps. -(set! >line (compile-procedure >line)) -(define (read-from-string s) (with-input-from-string s read)) -(define (pprint-to-string o) - (with-string-output-port - (lambda (p) - (fluid-let ((*unparser-list-breadth-limit* 10) - (*unparser-list-depth-limit* 4) - (*unparser-string-length-limit* 100)) - (pp o p))))) -;(define (1+ n) (+ n 1)) -(define (1- n) (- n 1)) -(define (package-lookup package name) - (let ((p (if (package? package) package (find-package package)))) - (environment-lookup (package/environment p) name))) -(define log-port (current-output-port)) -(define (log-event fstring . args) - ;;(apply format log-port fstring args) - #f - ) - -;;; swank-mit-scheme.scm ends here diff --git a/elpa/slime-20200414.1444/contrib/swank-mlworks.sml b/elpa/slime-20200414.1444/contrib/swank-mlworks.sml deleted file mode 100644 index 3efac53e..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-mlworks.sml +++ /dev/null @@ -1,348 +0,0 @@ -(* swank-mlworks.sml -- SWANK server for MLWorks - * - * This code has been placed in the Public Domain. - *) - -(* This is an experiment to see how the interfaces/modules would look - * in a language with a supposedly "good" module system. - * - * MLWorks is probably the only SML implementation that tries to - * support "interactive programming". Since MLWorks wasn't maintained - * the last 15 or so years, big chunks of the SML Basis Library are - * missing or not the way as required by the standard. That makes it - * rather hard to do anything; it also shows that MLWorks hasn't been - * "used in anger" for a long time. - *) - -structure Swank = struct - - structure Util = struct - fun utf8ToString (v:Word8Vector.vector) : string = Byte.bytesToString v - fun stringToUtf8 s = Byte.stringToBytes s - end - - structure Map = struct - datatype ('a, 'b) map = Alist of {list: ('a * 'b) list ref, - eq: ('a * 'a) -> bool} - - fun stringMap () = - Alist {list = ref [], - eq = (fn (x:string,y:string) => x = y)} - - - fun lookup (Alist {list, eq}, key) = - let fun search [] = NONE - | search ((key', value) :: xs) = - if eq (key', key) then SOME value - else search xs - in search (!list) - end - - fun put (Alist {list, eq}, key, value) = - let val l = (key, value) :: (!list) - in list := l - end - - end - - structure CharBuffer = struct - local - structure C = CharArray - datatype buffer = B of {array : C.array ref, - index: int ref} - in - - fun new hint = B {array = ref (C.array (hint, #"\000")), - index = ref 0} - - fun append (buffer as B {array, index}, char) = - let val a = !array - val i = !index - val len = C.length a - in if i < len then - (C.update (a, i, char); - index := i + 1; - ()) - else let val aa = C.array (2 * len, #"\000") - fun copy (src, dst) = - let val len = C.length src - fun loop i = - if i = len then () - else (C.update (dst, i, C.sub (src, i)); - loop (i + 1)) - in loop 0 end - in copy (a, aa); - C.update (aa, i, char); - array := aa; - index := i + 1; - () - end - end - - fun toString (B {array, index}) = - let val a = !array - val i = !index - in CharVector.tabulate (i, fn i => C.sub (a, i)) end - - end - - end - - - structure Sexp = struct - structure Type = struct - datatype sexp = Int of int - | Str of string - | Lst of sexp list - | Sym of string - | QSym of string * string - | T - | Nil - | Quote - end - open Type - - exception ReadError - - fun fromUtf8 v = - let val len = Word8Vector.length v - val index = ref 0 - fun getc () = - case getc' () of - SOME c => c - | NONE => raise ReadError - and getc' () = - let val i = !index - in if i = len then NONE - else (index := i + 1; - SOME (Byte.byteToChar (Word8Vector.sub (v, i)))) - end - and ungetc () = index := !index - 1 - and sexp () : sexp = - case getc () of - #"\"" => string (CharBuffer.new 100) - | #"(" => lst () - | #"'" => Lst [Quote, sexp ()] - | _ => (ungetc(); token ()) - and string buf : sexp = - case getc () of - #"\"" => Str (CharBuffer.toString buf) - | #"\\" => (CharBuffer.append (buf, getc ()); string buf) - | c => (CharBuffer.append (buf, c); string buf) - and lst () = - let val x = sexp () - in case getc () of - #")" => Lst [x] - | #" " => let val Lst y = lst () in Lst (x :: y) end - | _ => raise ReadError - end - and token () = - let val tok = token' (CharBuffer.new 50) - val c0 = String.sub (tok, 0) - in if Char.isDigit c0 then (case Int.fromString tok of - SOME i => Int i - | NONE => raise ReadError) - else - Sym (tok) - end - and token' buf : string = - case getc' () of - NONE => CharBuffer.toString buf - | SOME #"\\" => (CharBuffer.append (buf, getc ()); - token' buf) - | SOME #" " => (ungetc (); CharBuffer.toString buf) - | SOME #")" => (ungetc (); CharBuffer.toString buf) - | SOME c => (CharBuffer.append (buf, c); token' buf) - in - sexp () - end - - fun toString sexp = - case sexp of - (Str s) => "\"" ^ String.toCString s ^ "\"" - | (Lst []) => "nil" - | (Lst xs) => "(" ^ String.concatWith " " (map toString xs) ^ ")" - | Sym (name) => name - | QSym (pkg, name) => pkg ^ ":" ^ name - | Quote => "quote" - | T => "t" - | Nil => "nil" - | Int i => Int.toString i - - fun toUtf8 sexp = Util.stringToUtf8 (toString sexp) - end - - structure Net = struct - local - structure S = Socket - structure I = INetSock - structure W = Word8Vector - - fun createSocket (port) = - let val sock : S.passive I.stream_sock = I.TCP.socket () - val SOME localhost = NetHostDB.fromString "127.0.0.1" - in - S.Ctl.setREUSEADDR (sock, true); - S.bind (sock, I.toAddr (localhost, port)); - S.listen (sock, 2); - sock - end - - fun addrToString sockAddr = - let val (ip, port) = I.fromAddr sockAddr - in NetHostDB.toString ip ^ ":" ^ Int.toString port - end - - exception ShortRead of W.vector - exception InvalidHexString of string - in - - fun acceptConnection port = - let val sock = createSocket port - val addr = S.Ctl.getSockName sock - val _ = print ("Listening on: " ^ addrToString addr ^ "\n") - val (peer, addr) = S.accept sock - in - S.close sock; - print ("Connection from: " ^ addrToString addr ^ "\n"); - peer - end - - fun receivePacket socket = - let val v = S.recvVec (socket, 6) - val _ = if W.length v = 6 then () - else raise ShortRead v - val s = Util.utf8ToString v - val _ = print ("s = " ^ s ^ "\n") - val len = - case StringCvt.scanString (Int.scan StringCvt.HEX) s of - SOME len => len - | NONE => raise InvalidHexString s - val _ = print ("len = " ^ Int.toString len ^ "\n") - val payload = S.recvVec (socket, len) - val plen = W.length payload - val _ = print ("plen = " ^ Int.toString plen ^ "\n") - val _ = if plen = len then () - else raise ShortRead payload - in - payload - end - - fun nibbleToHex i:string = Int.fmt StringCvt.HEX i - - fun loadNibble i pos = - Word32.toInt (Word32.andb (Word32.>> (Word32.fromInt i, - Word.fromInt (pos * 4)), - 0wxf)) - - fun hexDigit i pos = nibbleToHex (loadNibble i pos) - - fun lenToHex i = - concat [hexDigit i 5, - hexDigit i 4, - hexDigit i 3, - hexDigit i 2, - hexDigit i 1, - hexDigit i 0] - - fun sendPacket (payload:W.vector, socket) = - let val len = W.length payload - val header = Util.stringToUtf8 (lenToHex len) - val packet = W.concat [header, payload] - in print ("len = " ^ Int.toString len ^ "\n" - ^ "header = " ^ lenToHex len ^ "\n" - ^ "paylad = " ^ Util.utf8ToString payload ^ "\n"); - S.sendVec (socket, {buf = packet, i = 0, sz = NONE}) - end - - end - end - - structure Rpc = struct - open Sexp.Type - - val funTable : (string, sexp list -> sexp) Map.map - = Map.stringMap () - - fun define name f = Map.put (funTable, name, f) - - exception UnknownFunction of string - fun call (name, args) = - (print ("call: " ^ name ^ "\n"); - case Map.lookup (funTable, name) of - SOME f => f args - | NONE => raise UnknownFunction name) - - - local fun getpid () = - Word32.toInt (Posix.Process.pidToWord (Posix.ProcEnv.getpid ())) - in - fun connectionInfo [] = - Lst [Sym ":pid", Int (getpid ()), - Sym ":lisp-implementation", Lst [Sym ":type", Str "MLWorks", - Sym ":name", Str "mlworks", - Sym ":version", Str "2.x"], - Sym ":machine", Lst [Sym ":instance", Str "", - Sym ":type", Str "", - Sym ":version", Str ""], - Sym ":features", Nil, - Sym ":package", Lst [Sym ":name", Str "root", - Sym ":prompt", Str "-"]] - end - - fun nyi _ = Nil - - local structure D = Shell.Dynamic - in - fun interactiveEval [Str string] = - let val x = D.eval string - in Str (concat [D.printValue x, " : ", D.printType (D.getType x)]) - end - end - - val _ = - (define "swank:connection-info" connectionInfo; - define "swank:swank-require" nyi; - define "swank:interactive-eval" interactiveEval; - ()) - end - - structure EventLoop = struct - open Sexp.Type - - fun execute (sexp, pkg) = - (print ("sexp = " ^ (Sexp.toString sexp) ^ "\n"); - case sexp of - Lst (Sym name :: args) => Rpc.call (name, args)) - - fun emacsRex (sexp, pkg, id as Int _, sock) = - let val result = (Lst [Sym (":ok"), execute (sexp, pkg)] - handle exn => (Lst [Sym ":abort", - Str (exnName exn ^ ": " - ^ exnMessage exn)])) - val reply = Lst [Sym ":return", result, id] - in Net.sendPacket (Sexp.toUtf8 reply, sock) - end - - fun dispatch (Lst ((Sym key) :: args), sock) = - case key of - ":emacs-rex" => let val [sexp, pkg, _, id] = args - in emacsRex (sexp, pkg, id, sock) - end - - fun processRequests socket:unit = - let val sexp = Sexp.fromUtf8 (Net.receivePacket socket) - in print ("request: " - ^ Util.utf8ToString (Sexp.toUtf8 sexp) - ^ "\n"); - dispatch (sexp, socket); - processRequests socket - end - - end - - (* val _ = EventLoop.processRequests (Net.acceptConnection 4005) *) - val _ = () - end - -(* (Swank.EventLoop.processRequests (Swank.Net.acceptConnection 4005)) *) diff --git a/elpa/slime-20200414.1444/contrib/swank-mrepl.lisp b/elpa/slime-20200414.1444/contrib/swank-mrepl.lisp deleted file mode 100644 index cc8ce811..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-mrepl.lisp +++ /dev/null @@ -1,162 +0,0 @@ -;;; swank-mrepl.lisp -;; -;; Licence: public domain - -(in-package :swank) -(eval-when (:compile-toplevel :load-toplevel :execute) - (let ((api '( - *emacs-connection* - channel - channel-id - define-channel-method - defslimefun - dcase - log-event - process-requests - send-to-remote-channel - use-threads-p - wait-for-event - with-bindings - with-connection - with-top-level-restart - with-slime-interrupts - ))) - (eval `(defpackage #:swank-api - (:use) - (:import-from #:swank . ,api) - (:export . ,api))))) - -(defpackage :swank-mrepl - (:use :cl :swank-api) - (:export #:create-mrepl)) - -(in-package :swank-mrepl) - -(defclass listener-channel (channel) - ((remote :initarg :remote) - (env :initarg :env) - (mode :initform :eval) - (tag :initform nil))) - -(defun package-prompt (package) - (reduce (lambda (x y) (if (<= (length x) (length y)) x y)) - (cons (package-name package) (package-nicknames package)))) - -(defslimefun create-mrepl (remote) - (let* ((pkg *package*) - (conn *emacs-connection*) - (thread (if (use-threads-p) - (spawn-listener-thread conn) - nil)) - (ch (make-instance 'listener-channel :remote remote :thread thread))) - (setf (slot-value ch 'env) (initial-listener-env ch)) - (when thread - (swank/backend:send thread `(:serve-channel ,ch))) - (list (channel-id ch) - (swank/backend:thread-id (or thread (swank/backend:current-thread))) - (package-name pkg) - (package-prompt pkg)))) - -(defun initial-listener-env (listener) - `((*package* . ,*package*) - (*standard-output* . ,(make-listener-output-stream listener)) - (*standard-input* . ,(make-listener-input-stream listener)))) - -(defun spawn-listener-thread (connection) - (swank/backend:spawn - (lambda () - (with-connection (connection) - (dcase (swank/backend:receive) - ((:serve-channel c) - (loop - (with-top-level-restart (connection (drop-unprocessed-events c)) - (process-requests nil))))))) - :name "mrepl thread")) - -(defun drop-unprocessed-events (channel) - (with-slots (mode) channel - (let ((old-mode mode)) - (setf mode :drop) - (unwind-protect - (process-requests t) - (setf mode old-mode))) - (send-prompt channel))) - -(define-channel-method :process ((c listener-channel) string) - (log-event ":process ~s~%" string) - (with-slots (mode remote) c - (ecase mode - (:eval (mrepl-eval c string)) - (:read (mrepl-read c string)) - (:drop)))) - -(defun mrepl-eval (channel string) - (with-slots (remote env) channel - (let ((aborted t)) - (with-bindings env - (unwind-protect - (let ((result (with-slime-interrupts (read-eval-print string)))) - (send-to-remote-channel remote `(:write-result ,result)) - (setq aborted nil)) - (setf env (loop for (sym) in env - collect (cons sym (symbol-value sym)))) - (cond (aborted - (send-to-remote-channel remote `(:evaluation-aborted))) - (t - (send-prompt channel)))))))) - -(defun send-prompt (channel) - (with-slots (env remote) channel - (let ((pkg (or (cdr (assoc '*package* env)) *package*)) - (out (cdr (assoc '*standard-output* env))) - (in (cdr (assoc '*standard-input* env)))) - (when out (force-output out)) - (when in (clear-input in)) - (send-to-remote-channel remote `(:prompt ,(package-name pkg) - ,(package-prompt pkg)))))) - -(defun mrepl-read (channel string) - (with-slots (tag) channel - (assert tag) - (throw tag string))) - -(defun read-eval-print (string) - (with-input-from-string (in string) - (setq / ()) - (loop - (let* ((form (read in nil in))) - (cond ((eq form in) (return)) - (t (setq / (multiple-value-list (eval (setq + form)))))))) - (force-output) - (if / - (format nil "~{~s~%~}" /) - "; No values"))) - -(defun make-listener-output-stream (channel) - (let ((remote (slot-value channel 'remote))) - (swank/backend:make-output-stream - (lambda (string) - (send-to-remote-channel remote `(:write-string ,string)))))) - -(defun make-listener-input-stream (channel) - (swank/backend:make-input-stream (lambda () (read-input channel)))) - -(defun set-mode (channel new-mode) - (with-slots (mode remote) channel - (unless (eq mode new-mode) - (send-to-remote-channel remote `(:set-read-mode ,new-mode))) - (setf mode new-mode))) - -(defun read-input (channel) - (with-slots (mode tag remote) channel - (force-output) - (let ((old-mode mode) - (old-tag tag)) - (setf tag (cons nil nil)) - (set-mode channel :read) - (unwind-protect - (catch tag (process-requests nil)) - (setf tag old-tag) - (set-mode channel old-mode))))) - -(provide :swank-mrepl) diff --git a/elpa/slime-20200414.1444/contrib/swank-package-fu.lisp b/elpa/slime-20200414.1444/contrib/swank-package-fu.lisp deleted file mode 100644 index a22807a1..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-package-fu.lisp +++ /dev/null @@ -1,65 +0,0 @@ - -(in-package :swank) - -(defslimefun package= (string1 string2) - (let* ((pkg1 (guess-package string1)) - (pkg2 (guess-package string2))) - (and pkg1 pkg2 (eq pkg1 pkg2)))) - -(defslimefun export-symbol-for-emacs (symbol-str package-str) - (let ((package (guess-package package-str))) - (when package - (let ((*buffer-package* package)) - (export `(,(from-string symbol-str)) package))))) - -(defslimefun unexport-symbol-for-emacs (symbol-str package-str) - (let ((package (guess-package package-str))) - (when package - (let ((*buffer-package* package)) - (unexport `(,(from-string symbol-str)) package))))) - -#+sbcl -(defun list-structure-symbols (name) - (let ((dd (sb-kernel:find-defstruct-description name ))) - (list* name - (sb-kernel:dd-default-constructor dd) - (sb-kernel:dd-predicate-name dd) - (sb-kernel::dd-copier-name dd) - (mapcar #'sb-kernel:dsd-accessor-name - (sb-kernel:dd-slots dd))))) - -#+ccl -(defun list-structure-symbols (name) - (let ((definition (gethash name ccl::%defstructs%))) - (list* name - (ccl::sd-constructor definition) - (ccl::sd-refnames definition)))) - -(defun list-class-symbols (name) - (let* ((class (find-class name)) - (slots (swank-mop:class-direct-slots class))) - (labels ((extract-symbol (name) - (if (and (consp name) (eql (car name) 'setf)) - (cadr name) - name)) - (slot-accessors (slot) - (nintersection (copy-list (swank-mop:slot-definition-readers slot)) - (copy-list (swank-mop:slot-definition-readers slot)) - :key #'extract-symbol))) - (list* (class-name class) - (mapcan #'slot-accessors slots))))) - -(defslimefun export-structure (name package) - (let ((*package* (guess-package package))) - (when *package* - (let* ((name (from-string name)) - (symbols (cond #+(or sbcl ccl) - ((or (not (find-class name nil)) - (subtypep name 'structure-object)) - (list-structure-symbols name)) - (t - (list-class-symbols name))))) - (export symbols) - symbols)))) - -(provide :swank-package-fu) diff --git a/elpa/slime-20200414.1444/contrib/swank-presentation-streams.lisp b/elpa/slime-20200414.1444/contrib/swank-presentation-streams.lisp deleted file mode 100644 index 93a6d1d4..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-presentation-streams.lisp +++ /dev/null @@ -1,334 +0,0 @@ -;;; swank-presentation-streams.lisp --- Streams that allow attaching object identities -;;; to portions of output -;;; -;;; Authors: Alan Ruttenberg -;;; Matthias Koeppe -;;; Helmut Eller -;;; -;;; License: This code has been placed in the Public Domain. All warranties -;;; are disclaimed. - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-presentations)) - -;; This file contains a mechanism for printing to the slime repl so -;; that the printed result remembers what object it is associated -;; with. This extends the recording of REPL results. -;; -;; There are two methods: -;; -;; 1. Depends on the ilisp bridge code being installed and ready to -;; intercept messages in the printed stream. We encode the -;; information with a message saying that we are starting to print -;; an object corresponding to a given id and another when we are -;; done. The process filter notices these and adds the necessary -;; text properties to the output. -;; -;; 2. Use separate protocol messages :presentation-start and -;; :presentation-end for sending presentations. -;; -;; We only do this if we know we are printing to a slime stream, -;; checked with the method slime-stream-p. Initially this checks for -;; the knows slime streams looking at *connections*. In cmucl, sbcl, and -;; openmcl it also checks if it is a pretty-printing stream which -;; ultimately prints to a slime stream. -;; -;; Method 1 seems to be faster, but the printed escape sequences can -;; disturb the column counting, and thus the layout in pretty-printing. -;; We use method 1 when a dedicated output stream is used. -;; -;; Method 2 is cleaner and works with pretty printing if the pretty -;; printers support "annotations". We use method 2 when no dedicated -;; output stream is used. - -;; Control -(defvar *enable-presenting-readable-objects* t - "set this to enable automatically printing presentations for some -subset of readable objects, such as pathnames." ) - -;; doing it - -(defmacro presenting-object (object stream &body body) - "What you use in your code. Wrap this around some printing and that text will -be sensitive and remember what object it is in the repl" - `(presenting-object-1 ,object ,stream #'(lambda () ,@body))) - -(defmacro presenting-object-if (predicate object stream &body body) - "What you use in your code. Wrap this around some printing and that text will -be sensitive and remember what object it is in the repl if predicate is true" - (let ((continue (gensym))) - `(let ((,continue #'(lambda () ,@body))) - (if ,predicate - (presenting-object-1 ,object ,stream ,continue) - (funcall ,continue))))) - -;;; Get pretty printer patches for SBCL at load (not compile) time. -#+#:disable-dangerous-patching ; #+sbcl -(eval-when (:load-toplevel) - (handler-bind ((simple-error - (lambda (c) - (declare (ignore c)) - (let ((clobber-it (find-restart 'sb-kernel::clobber-it))) - (when clobber-it (invoke-restart clobber-it)))))) - (sb-ext:without-package-locks - (swank/sbcl::with-debootstrapping - (load (make-pathname - :name "sbcl-pprint-patch" - :type "lisp" - :directory (pathname-directory - swank-loader:*source-directory*))))))) - -(let ((last-stream nil) - (last-answer nil)) - (defun slime-stream-p (stream) - "Check if stream is one of the slime streams, since if it isn't we -don't want to present anything. -Two special return values: -:DEDICATED -- Output ends up on a dedicated output stream -:REPL-RESULT -- Output ends up on the :repl-results target. -" - (if (eq last-stream stream) - last-answer - (progn - (setq last-stream stream) - (if (eq stream t) - (setq stream *standard-output*)) - (setq last-answer - (or #+openmcl - (and (typep stream 'ccl::xp-stream) - ;(slime-stream-p (ccl::xp-base-stream (slot-value stream 'ccl::xp-structure))) - (slime-stream-p (ccl::%svref (slot-value stream 'ccl::xp-structure) 1))) - #+cmu - (or (and (typep stream 'lisp::indenting-stream) - (slime-stream-p (lisp::indenting-stream-stream stream))) - (and (typep stream 'pretty-print::pretty-stream) - (fboundp 'pretty-print::enqueue-annotation) - (let ((slime-stream-p - (slime-stream-p (pretty-print::pretty-stream-target stream)))) - (and ;; Printing through CMUCL pretty - ;; streams is only cleanly - ;; possible if we are using the - ;; bridge-less protocol with - ;; annotations, because the bridge - ;; escape sequences disturb the - ;; pretty printer layout. - (not (eql slime-stream-p :dedicated-output)) - ;; If OK, return the return value - ;; we got from slime-stream-p on - ;; the target stream (could be - ;; :repl-result): - slime-stream-p)))) - #+sbcl - (let () - (declare (notinline sb-pretty::pretty-stream-target)) - (and (typep stream (find-symbol "PRETTY-STREAM" 'sb-pretty)) - (find-symbol "ENQUEUE-ANNOTATION" 'sb-pretty) - (not *use-dedicated-output-stream*) - (slime-stream-p (sb-pretty::pretty-stream-target stream)))) - #+allegro - (and (typep stream 'excl:xp-simple-stream) - (slime-stream-p (excl::stream-output-handle stream))) - (loop for connection in *connections* - thereis (or (and (eq stream (connection.dedicated-output connection)) - :dedicated) - (eq stream (connection.socket-io connection)) - (eq stream (connection.user-output connection)) - (eq stream (connection.user-io connection)) - (and (eq stream (connection.repl-results connection)) - :repl-result))))))))) - -(defun can-present-readable-objects (&optional stream) - (declare (ignore stream)) - *enable-presenting-readable-objects*) - -;; If we are printing to an XP (pretty printing) stream, printing the -;; escape sequences directly would mess up the layout because column -;; counting is disturbed. Use "annotations" instead. -#+allegro -(defun write-annotation (stream function arg) - (if (typep stream 'excl:xp-simple-stream) - (excl::schedule-annotation stream function arg) - (funcall function arg stream nil))) -#+cmu -(defun write-annotation (stream function arg) - (if (and (typep stream 'pp:pretty-stream) - (fboundp 'pp::enqueue-annotation)) - (pp::enqueue-annotation stream function arg) - (funcall function arg stream nil))) -#+sbcl -(defun write-annotation (stream function arg) - (let ((enqueue-annotation - (find-symbol "ENQUEUE-ANNOTATION" 'sb-pretty))) - (if (and enqueue-annotation - (typep stream (find-symbol "PRETTY-STREAM" 'sb-pretty))) - (funcall enqueue-annotation stream function arg) - (funcall function arg stream nil)))) -#-(or allegro cmu sbcl) -(defun write-annotation (stream function arg) - (funcall function arg stream nil)) - -(defstruct presentation-record - (id) - (printed-p) - (target)) - -(defun presentation-start (record stream truncatep) - (unless truncatep - ;; Don't start new presentations when nothing is going to be - ;; printed due to *print-lines*. - (let ((pid (presentation-record-id record)) - (target (presentation-record-target record))) - (case target - (:dedicated - ;; Use bridge protocol - (write-string "<" stream) - (prin1 pid stream) - (write-string "" stream)) - (t - (finish-output stream) - (send-to-emacs `(:presentation-start ,pid ,target))))) - (setf (presentation-record-printed-p record) t))) - -(defun presentation-end (record stream truncatep) - (declare (ignore truncatep)) - ;; Always end old presentations that were started. - (when (presentation-record-printed-p record) - (let ((pid (presentation-record-id record)) - (target (presentation-record-target record))) - (case target - (:dedicated - ;; Use bridge protocol - (write-string ">" stream) - (prin1 pid stream) - (write-string "" stream)) - (t - (finish-output stream) - (send-to-emacs `(:presentation-end ,pid ,target))))))) - -(defun presenting-object-1 (object stream continue) - "Uses the bridge mechanism with two messages >id and ) - (pp-end-block stream ">")) - nil)) - (defmethod print-object :around ((pathname pathname) stream) - (swank::presenting-object-if - (swank::can-present-readable-objects stream) - pathname stream (call-next-method)))) - (ccl::def-load-pointers clear-presentations () - (swank::clear-presentation-tables))) - -(in-package :swank) - -#+cmu -(progn - (fwrappers:define-fwrapper presenting-unreadable-wrapper (object stream type identity body) - (presenting-object object stream - (fwrappers:call-next-function))) - - (fwrappers:define-fwrapper presenting-pathname-wrapper (pathname stream depth) - (presenting-object-if (can-present-readable-objects stream) pathname stream - (fwrappers:call-next-function))) - - (defun monkey-patch-stream-printing () - (fwrappers::fwrap 'lisp::%print-pathname #'presenting-pathname-wrapper) - (fwrappers::fwrap 'lisp::%print-unreadable-object #'presenting-unreadable-wrapper))) - -#+sbcl -(progn - (defvar *saved-%print-unreadable-object* - (fdefinition 'sb-impl::%print-unreadable-object)) - - (defun monkey-patch-stream-printing () - (sb-ext:without-package-locks - (when (eq (fdefinition 'sb-impl::%print-unreadable-object) - *saved-%print-unreadable-object*) - (setf (fdefinition 'sb-impl::%print-unreadable-object) - (lambda (object stream &rest args) - (presenting-object object stream - (apply *saved-%print-unreadable-object* - object stream args))))) - (defmethod print-object :around ((object pathname) stream) - (presenting-object object stream - (call-next-method)))))) - -#+allegro -(progn - (excl:def-fwrapper presenting-unreadable-wrapper (object stream type identity continuation) - (swank::presenting-object object stream (excl:call-next-fwrapper))) - (excl:def-fwrapper presenting-pathname-wrapper (pathname stream depth) - (presenting-object-if (can-present-readable-objects stream) pathname stream - (excl:call-next-fwrapper))) - (defun monkey-patch-stream-printing () - (excl:fwrap 'excl::print-unreadable-object-1 - 'print-unreadable-present 'presenting-unreadable-wrapper) - (excl:fwrap 'excl::pathname-printer - 'print-pathname-present 'presenting-pathname-wrapper))) - -#-(or allegro sbcl cmu openmcl) -(defun monkey-patch-stream-printing () - (values)) - -;; Hook into SWANK. - -(defslimefun init-presentation-streams () - (monkey-patch-stream-printing) - ;; FIXME: import/use swank-repl to avoid package qualifier. - (setq swank-repl:*send-repl-results-function* - 'present-repl-results-via-presentation-streams)) - -(provide :swank-presentation-streams) diff --git a/elpa/slime-20200414.1444/contrib/swank-presentations.lisp b/elpa/slime-20200414.1444/contrib/swank-presentations.lisp deleted file mode 100644 index 11326afe..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-presentations.lisp +++ /dev/null @@ -1,246 +0,0 @@ -;;; swank-presentations.lisp --- imitate LispM's presentations -;; -;; Authors: Alan Ruttenberg -;; Luke Gorrie -;; Helmut Eller -;; Matthias Koeppe -;; -;; License: This code has been placed in the Public Domain. All warranties -;; are disclaimed. -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-repl)) - -;;;; Recording and accessing results of computations - -(defvar *record-repl-results* t - "Non-nil means that REPL results are saved for later lookup.") - -(defvar *object-to-presentation-id* - (make-weak-key-hash-table :test 'eq) - "Store the mapping of objects to numeric identifiers") - -(defvar *presentation-id-to-object* - (make-weak-value-hash-table :test 'eql) - "Store the mapping of numeric identifiers to objects") - -(defun clear-presentation-tables () - (clrhash *object-to-presentation-id*) - (clrhash *presentation-id-to-object*)) - -(defvar *presentation-counter* 0 "identifier counter") - -(defvar *nil-surrogate* (make-symbol "nil-surrogate")) - -;; XXX thread safety? [2006-09-13] mb: not in the slightest (fwiw the -;; rest of slime isn't thread safe either), do we really care? -(defun save-presented-object (object) - "Save OBJECT and return the assigned id. -If OBJECT was saved previously return the old id." - (let ((object (if (null object) *nil-surrogate* object))) - ;; We store *nil-surrogate* instead of nil, to distinguish it from - ;; an object that was garbage collected. - (or (gethash object *object-to-presentation-id*) - (let ((id (incf *presentation-counter*))) - (setf (gethash id *presentation-id-to-object*) object) - (setf (gethash object *object-to-presentation-id*) id) - id)))) - -(defslimefun lookup-presented-object (id) - "Retrieve the object corresponding to ID. -The secondary value indicates the absence of an entry." - (etypecase id - (integer - ;; - (multiple-value-bind (object foundp) - (gethash id *presentation-id-to-object*) - (cond - ((eql object *nil-surrogate*) - ;; A stored nil object - (values nil t)) - ((null object) - ;; Object that was replaced by nil in the weak hash table - ;; when the object was garbage collected. - (values nil nil)) - (t - (values object foundp))))) - (cons - (dcase id - ((:frame-var thread-id frame index) - (declare (ignore thread-id)) ; later - (handler-case - (frame-var-value frame index) - (t (condition) - (declare (ignore condition)) - (values nil nil)) - (:no-error (value) - (values value t)))) - ((:inspected-part part-index) - (inspector-nth-part part-index)))))) - -(defslimefun lookup-presented-object-or-lose (id) - "Get the result of the previous REPL evaluation with ID." - (multiple-value-bind (object foundp) (lookup-presented-object id) - (cond (foundp object) - (t (error "Attempt to access unrecorded object (id ~D)." id))))) - -(defslimefun lookup-and-save-presented-object-or-lose (id) - "Get the object associated with ID and save it in the presentation tables." - (let ((obj (lookup-presented-object-or-lose id))) - (save-presented-object obj))) - -(defslimefun clear-repl-results () - "Forget the results of all previous REPL evaluations." - (clear-presentation-tables) - t) - -(defun present-repl-results (values) - ;; Override a function in swank.lisp, so that - ;; presentations are associated with every REPL result. - (flet ((send (value) - (let ((id (and *record-repl-results* - (save-presented-object value)))) - (send-to-emacs `(:presentation-start ,id :repl-result)) - (send-to-emacs `(:write-string ,(prin1-to-string value) - :repl-result)) - (send-to-emacs `(:presentation-end ,id :repl-result)) - (send-to-emacs `(:write-string ,(string #\Newline) - :repl-result))))) - (fresh-line) - (finish-output) - (if (null values) - (send-to-emacs `(:write-string "; No value" :repl-result)) - (mapc #'send values)))) - - -;;;; Presentation menu protocol -;; -;; To define a menu for a type of object, define a method -;; menu-choices-for-presentation on that object type. This function -;; should return a list of two element lists where the first element is -;; the name of the menu action and the second is a function that will be -;; called if the menu is chosen. The function will be called with 3 -;; arguments: -;; -;; choice: The string naming the action from above -;; -;; object: The object -;; -;; id: The presentation id of the object -;; -;; You might want append (when (next-method-p) (call-next-method)) to -;; pick up the Menu actions of superclasses. -;; - -(defvar *presentation-active-menu* nil) - -(defun menu-choices-for-presentation-id (id) - (multiple-value-bind (ob presentp) (lookup-presented-object id) - (cond ((not presentp) 'not-present) - (t - (let ((menu-and-actions (menu-choices-for-presentation ob))) - (setq *presentation-active-menu* (cons id menu-and-actions)) - (mapcar 'car menu-and-actions)))))) - -(defun swank-ioify (thing) - (cond ((keywordp thing) thing) - ((and (symbolp thing)(not (find #\: (symbol-name thing)))) - (intern (symbol-name thing) 'swank-io-package)) - ((consp thing) (cons (swank-ioify (car thing)) - (swank-ioify (cdr thing)))) - (t thing))) - -(defun execute-menu-choice-for-presentation-id (id count item) - (let ((ob (lookup-presented-object id))) - (assert (equal id (car *presentation-active-menu*)) () - "Bug: Execute menu call for id ~a but menu has id ~a" - id (car *presentation-active-menu*)) - (let ((action (second (nth (1- count) (cdr *presentation-active-menu*))))) - (swank-ioify (funcall action item ob id))))) - - -(defgeneric menu-choices-for-presentation (object) - (:method (ob) (declare (ignore ob)) nil)) ; default method - -;; Pathname -(defmethod menu-choices-for-presentation ((ob pathname)) - (let* ((file-exists (ignore-errors (probe-file ob))) - (lisp-type (make-pathname :type "lisp")) - (source-file (and (not (member (pathname-type ob) '("lisp" "cl") - :test 'equal)) - (let ((source (merge-pathnames lisp-type ob))) - (and (ignore-errors (probe-file source)) - source)))) - (fasl-file (and file-exists - (equal (ignore-errors - (namestring - (truename - (compile-file-pathname - (merge-pathnames lisp-type ob))))) - (namestring (truename ob)))))) - (remove nil - (list* - (and (and file-exists (not fasl-file)) - (list "Edit this file" - (lambda(choice object id) - (declare (ignore choice id)) - (ed-in-emacs (namestring (truename object))) - nil))) - (and file-exists - (list "Dired containing directory" - (lambda (choice object id) - (declare (ignore choice id)) - (ed-in-emacs (namestring - (truename - (merge-pathnames - (make-pathname :name "" :type "") - object)))) - nil))) - (and fasl-file - (list "Load this fasl file" - (lambda (choice object id) - (declare (ignore choice id object)) - (load ob) - nil))) - (and fasl-file - (list "Delete this fasl file" - (lambda (choice object id) - (declare (ignore choice id object)) - (let ((nt (namestring (truename ob)))) - (when (y-or-n-p-in-emacs "Delete ~a? " nt) - (delete-file nt))) - nil))) - (and source-file - (list "Edit lisp source file" - (lambda (choice object id) - (declare (ignore choice id object)) - (ed-in-emacs (namestring (truename source-file))) - nil))) - (and source-file - (list "Load lisp source file" - (lambda(choice object id) - (declare (ignore choice id object)) - (load source-file) - nil))) - (and (next-method-p) (call-next-method)))))) - -(defmethod menu-choices-for-presentation ((ob function)) - (list (list "Disassemble" - (lambda (choice object id) - (declare (ignore choice id)) - (disassemble object))))) - -(defslimefun inspect-presentation (id reset-p) - (let ((what (lookup-presented-object-or-lose id))) - (when reset-p - (reset-inspector)) - (inspect-object what))) - -(defslimefun init-presentations () - ;; FIXME: import/use swank-repl to avoid package qualifier. - (setq swank-repl:*send-repl-results-function* 'present-repl-results)) - -(provide :swank-presentations) diff --git a/elpa/slime-20200414.1444/contrib/swank-quicklisp.lisp b/elpa/slime-20200414.1444/contrib/swank-quicklisp.lisp deleted file mode 100644 index 36545991..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-quicklisp.lisp +++ /dev/null @@ -1,17 +0,0 @@ -;;; swank-quicklisp.lisp -- Quicklisp support -;; -;; Authors: Matthew Kennedy -;; License: Public Domain -;; - -(in-package :swank) - -(defslimefun list-quicklisp-systems () - "Returns the Quicklisp systems list." - (if (member :quicklisp *features*) - (let ((ql-dist-name (find-symbol "NAME" "QL-DIST")) - (ql-system-list (find-symbol "SYSTEM-LIST" "QL"))) - (mapcar ql-dist-name (funcall ql-system-list))) - (error "Could not find Quicklisp already loaded."))) - -(provide :swank-quicklisp) diff --git a/elpa/slime-20200414.1444/contrib/swank-r6rs.scm b/elpa/slime-20200414.1444/contrib/swank-r6rs.scm deleted file mode 100644 index 4e480507..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-r6rs.scm +++ /dev/null @@ -1,416 +0,0 @@ -;; swank-r6rs.sls --- Shareable code between swank-ikarus and swank-larceny -;; -;; Licence: public domain -;; Author: Helmut Eller -;; -;; This is a Swank server barely capable enough to process simple eval -;; requests from Emacs before dying. No fancy features like -;; backtraces, module redefintion, M-. etc. are implemented. Don't -;; even think about pc-to-source mapping. -;; -;; Despite standard modules, this file uses (swank os) and (swank sys) -;; which define implementation dependend functionality. There are -;; multiple modules in this files, which is probably not standardized. -;; - -;; Naive FORMAT implementation which supports: ~a ~s ~d ~x ~c -(library (swank format) - (export format printf fprintf) - (import (rnrs)) - - (define (format f . args) - (call-with-string-output-port - (lambda (port) (apply fprintf port f args)))) - - (define (printf f . args) - (let ((port (current-output-port))) - (apply fprintf port f args) - (flush-output-port port))) - - (define (fprintf port f . args) - (let ((len (string-length f))) - (let loop ((i 0) (args args)) - (cond ((= i len) (assert (null? args))) - ((and (char=? (string-ref f i) #\~) - (< (+ i 1) len)) - (dispatch-format (string-ref f (+ i 1)) port (car args)) - (loop (+ i 2) (cdr args))) - (else - (put-char port (string-ref f i)) - (loop (+ i 1) args)))))) - - (define (dispatch-format char port arg) - (let ((probe (assoc char format-dispatch-table))) - (cond (probe ((cdr probe) arg port)) - (else (error "invalid format char: " char))))) - - (define format-dispatch-table - `((#\a . ,display) - (#\s . ,write) - (#\d . ,(lambda (arg port) (put-string port (number->string arg 10)))) - (#\x . ,(lambda (arg port) (put-string port (number->string arg 16)))) - (#\c . ,(lambda (arg port) (put-char port arg)))))) - - -;; CL-style restarts to let us continue after errors. -(library (swank restarts) - (export with-simple-restart compute-restarts invoke-restart restart-name - write-restart-report) - (import (rnrs)) - - (define *restarts* '()) - - (define-record-type restart - (fields name reporter continuation)) - - (define (with-simple-restart name reporter thunk) - (call/cc - (lambda (k) - (let ((old-restarts *restarts*) - (restart (make-restart name (coerce-to-reporter reporter) k))) - (dynamic-wind - (lambda () (set! *restarts* (cons restart old-restarts))) - thunk - (lambda () (set! *restarts* old-restarts))))))) - - (define (compute-restarts) *restarts*) - - (define (invoke-restart restart . args) - (apply (restart-continuation restart) args)) - - (define (write-restart-report restart port) - ((restart-reporter restart) port)) - - (define (coerce-to-reporter obj) - (cond ((string? obj) (lambda (port) (put-string port obj))) - (#t (assert (procedure? obj)) obj))) - - ) - -;; This module encodes & decodes messages from the wire and queues them. -(library (swank event-queue) - (export make-event-queue wait-for-event enqueue-event - read-event write-event) - (import (rnrs) - (rnrs mutable-pairs) - (swank format)) - - (define-record-type event-queue - (fields (mutable q) wait-fun) - (protocol (lambda (init) - (lambda (wait-fun) - (init '() wait-fun))))) - - (define (wait-for-event q pattern) - (or (poll q pattern) - (begin - ((event-queue-wait-fun q) q) - (wait-for-event q pattern)))) - - (define (poll q pattern) - (let loop ((lag #f) - (l (event-queue-q q))) - (cond ((null? l) #f) - ((event-match? (car l) pattern) - (cond (lag - (set-cdr! lag (cdr l)) - (car l)) - (else - (event-queue-q-set! q (cdr l)) - (car l)))) - (else (loop l (cdr l)))))) - - (define (event-match? event pattern) - (cond ((or (number? pattern) - (member pattern '(t nil))) - (equal? event pattern)) - ((symbol? pattern) #t) - ((pair? pattern) - (case (car pattern) - ((quote) (equal? event (cadr pattern))) - ((or) (exists (lambda (p) (event-match? event p)) (cdr pattern))) - (else (and (pair? event) - (event-match? (car event) (car pattern)) - (event-match? (cdr event) (cdr pattern)))))) - (else (error "Invalid pattern: " pattern)))) - - (define (enqueue-event q event) - (event-queue-q-set! q - (append (event-queue-q q) - (list event)))) - - (define (write-event event port) - (let ((payload (call-with-string-output-port - (lambda (port) (write event port))))) - (write-length (string-length payload) port) - (put-string port payload) - (flush-output-port port))) - - (define (write-length len port) - (do ((i 24 (- i 4))) - ((= i 0)) - (put-string port - (number->string (bitwise-bit-field len (- i 4) i) - 16)))) - - (define (read-event port) - (let* ((header (string-append (get-string-n port 2) - (get-string-n port 2) - (get-string-n port 2))) - (_ (printf "header: ~s\n" header)) - (len (string->number header 16)) - (_ (printf "len: ~s\n" len)) - (payload (get-string-n port len))) - (printf "payload: ~s\n" payload) - (read (open-string-input-port payload)))) - - ) - -;; Entry points for SLIME commands. -(library (swank rpc) - (export connection-info interactive-eval - ;;compile-string-for-emacs - throw-to-toplevel sldb-abort - operator-arglist buffer-first-change - create-repl listener-eval) - (import (rnrs) - (rnrs eval) - (only (rnrs r5rs) scheme-report-environment) - (swank os) - (swank format) - (swank restarts) - (swank sys) - ) - - (define (connection-info . _) - `(,@'() - :pid ,(getpid) - :package (:name ">" :prompt ">") - :lisp-implementation (,@'() - :name ,(implementation-name) - :type "R6RS-Scheme"))) - - (define (interactive-eval string) - (call-with-values - (lambda () - (eval-in-interaction-environment (read-from-string string))) - (case-lambda - (() "; no value") - ((value) (format "~s" value)) - (values (format "values: ~s" values))))) - - (define (throw-to-toplevel) (invoke-restart-by-name-or-nil 'toplevel)) - - (define (sldb-abort) (invoke-restart-by-name-or-nil 'abort)) - - (define (invoke-restart-by-name-or-nil name) - (let ((r (find (lambda (r) (eq? (restart-name r) name)) - (compute-restarts)))) - (if r (invoke-restart r) 'nil))) - - (define (create-repl target) - (list "" "")) - - (define (listener-eval string) - (call-with-values (lambda () (eval-region string)) - (lambda values `(:values ,@(map (lambda (v) (format "~s" v)) values))))) - - (define (eval-region string) - (let ((sexp (read-from-string string))) - (if (eof-object? exp) - (values) - (eval-in-interaction-environment sexp)))) - - (define (read-from-string string) - (call-with-port (open-string-input-port string) read)) - - (define (operator-arglist . _) 'nil) - (define (buffer-first-change . _) 'nil) - - ) - -;; The server proper. Does the TCP stuff and exception handling. -(library (swank) - (export start-server) - (import (rnrs) - (rnrs eval) - (swank os) - (swank format) - (swank event-queue) - (swank restarts)) - - (define-record-type connection - (fields in-port out-port event-queue)) - - (define (start-server port) - (accept-connections (or port 4005) #f)) - - (define (start-server/port-file port-file) - (accept-connections #f port-file)) - - (define (accept-connections port port-file) - (let ((sock (make-server-socket port))) - (printf "Listening on port: ~s\n" (local-port sock)) - (when port-file - (write-port-file (local-port sock) port-file)) - (let-values (((in out) (accept sock (latin-1-codec)))) - (dynamic-wind - (lambda () #f) - (lambda () - (close-socket sock) - (serve in out)) - (lambda () - (close-port in) - (close-port out)))))) - - (define (write-port-file port port-file) - (call-with-output-file - (lambda (file) - (write port file)))) - - (define (serve in out) - (let ((err (current-error-port)) - (q (make-event-queue - (lambda (q) - (let ((e (read-event in))) - (printf "read: ~s\n" e) - (enqueue-event q e)))))) - (dispatch-loop (make-connection in out q)))) - - (define-record-type sldb-state - (fields level condition continuation next)) - - (define (dispatch-loop conn) - (let ((event (wait-for-event (connection-event-queue conn) 'x))) - (case (car event) - ((:emacs-rex) - (with-simple-restart - 'toplevel "Return to SLIME's toplevel" - (lambda () - (apply emacs-rex conn #f (cdr event))))) - (else (error "Unhandled event: ~s" event)))) - (dispatch-loop conn)) - - (define (recover thunk on-error-thunk) - (let ((ok #f)) - (dynamic-wind - (lambda () #f) - (lambda () - (call-with-values thunk - (lambda vals - (set! ok #t) - (apply values vals)))) - (lambda () - (unless ok - (on-error-thunk)))))) - - ;; Couldn't resist to exploit the prefix feature. - (define rpc-entries (environment '(prefix (swank rpc) swank:))) - - (define (emacs-rex conn sldb-state form package thread tag) - (let ((out (connection-out-port conn))) - (recover - (lambda () - (with-exception-handler - (lambda (condition) - (call/cc - (lambda (k) - (sldb-exception-handler conn condition k sldb-state)))) - (lambda () - (let ((value (apply (eval (car form) rpc-entries) (cdr form)))) - (write-event `(:return (:ok ,value) ,tag) out))))) - (lambda () - (write-event `(:return (:abort) ,tag) out))))) - - (define (sldb-exception-handler connection condition k sldb-state) - (when (serious-condition? condition) - (let ((level (if sldb-state (+ (sldb-state-level sldb-state) 1) 1)) - (out (connection-out-port connection))) - (write-event `(:debug 0 ,level ,@(debugger-info condition connection)) - out) - (dynamic-wind - (lambda () #f) - (lambda () - (sldb-loop connection - (make-sldb-state level condition k sldb-state))) - (lambda () (write-event `(:debug-return 0 ,level nil) out)))))) - - (define (sldb-loop connection state) - (apply emacs-rex connection state - (cdr (wait-for-event (connection-event-queue connection) - '(':emacs-rex . _)))) - (sldb-loop connection state)) - - (define (debugger-info condition connection) - (list `(,(call-with-string-output-port - (lambda (port) (print-condition condition port))) - ,(format " [type ~s]" (if (record? condition) - (record-type-name (record-rtd condition)) - )) - ()) - (map (lambda (r) - (list (format "~a" (restart-name r)) - (call-with-string-output-port - (lambda (port) - (write-restart-report r port))))) - (compute-restarts)) - '() - '())) - - (define (print-condition obj port) - (cond ((condition? obj) - (let ((list (simple-conditions obj))) - (case (length list) - ((0) - (display "Compuond condition with zero components" port)) - ((1) - (assert (eq? obj (car list))) - (print-simple-condition (car list) port)) - (else - (display "Compound condition:\n" port) - (for-each (lambda (c) - (display " " port) - (print-simple-condition c port) - (newline port)) - list))))) - (#t - (fprintf port "Non-condition object: ~s" obj)))) - - (define (print-simple-condition condition port) - (fprintf port "~a" (record-type-name (record-rtd condition))) - (case (count-record-fields condition) - ((0) #f) - ((1) - (fprintf port ": ") - (do-record-fields condition (lambda (name value) (write value port)))) - (else - (fprintf port ":") - (do-record-fields condition (lambda (name value) - (fprintf port "\n~a: ~s" name value)))))) - - ;; Call FUN with RECORD's rtd and parent rtds. - (define (do-record-rtds record fun) - (do ((rtd (record-rtd record) (record-type-parent rtd))) - ((not rtd)) - (fun rtd))) - - ;; Call FUN with RECORD's field names and values. - (define (do-record-fields record fun) - (do-record-rtds - record - (lambda (rtd) - (let* ((names (record-type-field-names rtd)) - (len (vector-length names))) - (do ((i 0 (+ 1 i))) - ((= i len)) - (fun (vector-ref names i) ((record-accessor rtd i) record))))))) - - ;; Return the number of fields in RECORD - (define (count-record-fields record) - (let ((i 0)) - (do-record-rtds - record (lambda (rtd) - (set! i (+ i (vector-length (record-type-field-names rtd)))))) - i)) - - ) diff --git a/elpa/slime-20200414.1444/contrib/swank-repl.lisp b/elpa/slime-20200414.1444/contrib/swank-repl.lisp deleted file mode 100644 index 259c9ea3..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-repl.lisp +++ /dev/null @@ -1,441 +0,0 @@ -;;; swank-repl.lisp --- Server side part of the Lisp listener. -;; -;; License: public domain -(in-package swank) - -(defpackage swank-repl - (:use cl swank/backend) - (:export *send-repl-results-function*) - (:import-from - swank - - *default-worker-thread-bindings* - - *loopback-interface* - - add-hook - *connection-closed-hook* - - eval-region - with-buffer-syntax - - connection - connection.socket-io - connection.repl-results - connection.user-input - connection.user-output - connection.user-io - connection.trace-output - connection.dedicated-output - connection.env - - multithreaded-connection - mconn.active-threads - mconn.repl-thread - mconn.auto-flush-thread - use-threads-p - - *emacs-connection* - default-connection - with-connection - - send-to-emacs - *communication-style* - handle-requests - wait-for-event - make-tag - thread-for-evaluation - socket-quest - - authenticate-client - encode-message - - auto-flush-loop - clear-user-input - - current-thread-id - cat - with-struct* - with-retry-restart - with-bindings - - package-string-for-prompt - find-external-format-or-lose - - defslimefun - - ;; FIXME: those should be exported from swank-repl only, but how to - ;; do that whithout breaking init files? - *use-dedicated-output-stream* - *dedicated-output-stream-port* - *globally-redirect-io*)) - -(in-package swank-repl) - -(defvar *use-dedicated-output-stream* nil - "When T swank will attempt to create a second connection to Emacs -which is used just to send output.") - -(defvar *dedicated-output-stream-port* 0 - "Which port we should use for the dedicated output stream.") - -(defvar *dedicated-output-stream-buffering* - (if (eq *communication-style* :spawn) t nil) - "The buffering scheme that should be used for the output stream. -Valid values are nil, t, :line") - -(defvar *globally-redirect-io* :started-from-emacs - "When T globally redirect all standard streams to Emacs. -When :STARTED-FROM-EMACS redirect when launched by M-x slime") - -(defun globally-redirect-io-p () - (case *globally-redirect-io* - ((t) t) - (:started-from-emacs swank-loader:*started-from-emacs*))) - -(defun open-streams (connection properties) - "Return the 5 streams for IO redirection: -DEDICATED-OUTPUT INPUT OUTPUT IO REPL-RESULTS" - (let* ((input-fn - (lambda () - (with-connection (connection) - (with-simple-restart (abort-read - "Abort reading input from Emacs.") - (read-user-input-from-emacs))))) - (dedicated-output (if *use-dedicated-output-stream* - (open-dedicated-output-stream - connection - (getf properties :coding-system)))) - (in (make-input-stream input-fn)) - (out (or dedicated-output - (make-output-stream (make-output-function connection)))) - (io (make-two-way-stream in out)) - (repl-results (swank:make-output-stream-for-target connection - :repl-result))) - (typecase connection - (multithreaded-connection - (setf (mconn.auto-flush-thread connection) - (make-auto-flush-thread out)))) - (values dedicated-output in out io repl-results))) - -(defun make-output-function (connection) - "Create function to send user output to Emacs." - (lambda (string) - (with-connection (connection) - (send-to-emacs `(:write-string ,string))))) - -(defun open-dedicated-output-stream (connection coding-system) - "Open a dedicated output connection to the Emacs on SOCKET-IO. -Return an output stream suitable for writing program output. - -This is an optimized way for Lisp to deliver output to Emacs." - (let ((socket (socket-quest *dedicated-output-stream-port* nil)) - (ef (find-external-format-or-lose coding-system))) - (unwind-protect - (let ((port (local-port socket))) - (encode-message `(:open-dedicated-output-stream ,port - ,coding-system) - (connection.socket-io connection)) - (let ((dedicated (accept-connection - socket - :external-format ef - :buffering *dedicated-output-stream-buffering* - :timeout 30))) - (authenticate-client dedicated) - (close-socket socket) - (setf socket nil) - dedicated)) - (when socket - (close-socket socket))))) - -(defmethod thread-for-evaluation ((connection multithreaded-connection) - (id (eql :find-existing))) - (or (car (mconn.active-threads connection)) - (find-repl-thread connection))) - -(defmethod thread-for-evaluation ((connection multithreaded-connection) - (id (eql :repl-thread))) - (find-repl-thread connection)) - -(defun find-repl-thread (connection) - (cond ((not (use-threads-p)) - (current-thread)) - (t - (let ((thread (mconn.repl-thread connection))) - (cond ((not thread) nil) - ((thread-alive-p thread) thread) - (t - (setf (mconn.repl-thread connection) - (spawn-repl-thread connection "new-repl-thread")))))))) - -(defun spawn-repl-thread (connection name) - (spawn (lambda () - (with-bindings *default-worker-thread-bindings* - (repl-loop connection))) - :name name)) - -(defun repl-loop (connection) - (handle-requests connection)) - -;;;;; Redirection during requests -;;; -;;; We always redirect the standard streams to Emacs while evaluating -;;; an RPC. This is done with simple dynamic bindings. - -(defslimefun create-repl (target &key coding-system) - (assert (eq target nil)) - (let ((conn *emacs-connection*)) - (initialize-streams-for-connection conn `(:coding-system ,coding-system)) - (with-struct* (connection. @ conn) - (setf (@ env) - `((*standard-input* . ,(@ user-input)) - ,@(unless (globally-redirect-io-p) - `((*standard-output* . ,(@ user-output)) - (*trace-output* . ,(or (@ trace-output) (@ user-output))) - (*error-output* . ,(@ user-output)) - (*debug-io* . ,(@ user-io)) - (*query-io* . ,(@ user-io)) - (*terminal-io* . ,(@ user-io)))))) - (maybe-redirect-global-io conn) - (add-hook *connection-closed-hook* 'update-redirection-after-close) - (typecase conn - (multithreaded-connection - (setf (mconn.repl-thread conn) - (spawn-repl-thread conn "repl-thread")))) - (list (package-name *package*) - (package-string-for-prompt *package*))))) - -(defun initialize-streams-for-connection (connection properties) - (multiple-value-bind (dedicated in out io repl-results) - (open-streams connection properties) - (setf (connection.dedicated-output connection) dedicated - (connection.user-io connection) io - (connection.user-output connection) out - (connection.user-input connection) in - (connection.repl-results connection) repl-results) - connection)) - -(defun read-user-input-from-emacs () - (let ((tag (make-tag))) - (force-output) - (send-to-emacs `(:read-string ,(current-thread-id) ,tag)) - (let ((ok nil)) - (unwind-protect - (prog1 (caddr (wait-for-event `(:emacs-return-string ,tag value))) - (setq ok t)) - (unless ok - (send-to-emacs `(:read-aborted ,(current-thread-id) ,tag))))))) - -;;;;; Listener eval - -(defvar *listener-eval-function* 'repl-eval) - -(defvar *listener-saved-value* nil) - -(defslimefun listener-save-value (slimefun &rest args) - "Apply SLIMEFUN to ARGS and save the value. -The saved value should be visible to all threads and retrieved via -LISTENER-GET-VALUE." - (setq *listener-saved-value* (apply slimefun args)) - t) - -(defslimefun listener-get-value () - "Get the last value saved by LISTENER-SAVE-VALUE. -The value should be produced as if it were requested through -LISTENER-EVAL directly, so that spacial variables *, etc are set." - (listener-eval (let ((*package* (find-package :keyword))) - (write-to-string '*listener-saved-value*)))) - -(defslimefun listener-eval (string &key (window-width nil window-width-p)) - (if window-width-p - (let ((*print-right-margin* window-width)) - (funcall *listener-eval-function* string)) - (funcall *listener-eval-function* string))) - -(defslimefun clear-repl-variables () - (let ((variables '(*** ** * /// // / +++ ++ +))) - (loop for variable in variables - do (setf (symbol-value variable) nil)))) - -(defvar *send-repl-results-function* 'send-repl-results-to-emacs) - -(defun repl-eval (string) - (clear-user-input) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME REPL evaluation request.") - (track-package - (lambda () - (multiple-value-bind (values last-form) (eval-region string) - (setq *** ** ** * * (car values) - /// // // / / values - +++ ++ ++ + + last-form) - (funcall *send-repl-results-function* values)))))) - nil) - -(defun track-package (fun) - (let ((p *package*)) - (unwind-protect (funcall fun) - (unless (eq *package* p) - (send-to-emacs (list :new-package (package-name *package*) - (package-string-for-prompt *package*))))))) - -(defun send-repl-results-to-emacs (values) - (finish-output) - (if (null values) - (send-to-emacs `(:write-string "; No value" :repl-result)) - (dolist (v values) - (send-to-emacs `(:write-string ,(cat (prin1-to-string v) #\newline) - :repl-result))))) - -(defslimefun redirect-trace-output (target) - (setf (connection.trace-output *emacs-connection*) - (swank:make-output-stream-for-target *emacs-connection* target)) - nil) - - - -;;;; IO to Emacs -;;; -;;; This code handles redirection of the standard I/O streams -;;; (`*standard-output*', etc) into Emacs. The `connection' structure -;;; contains the appropriate streams, so all we have to do is make the -;;; right bindings. - -;;;;; Global I/O redirection framework -;;; -;;; Optionally, the top-level global bindings of the standard streams -;;; can be assigned to be redirected to Emacs. When Emacs connects we -;;; redirect the streams into the connection, and they keep going into -;;; that connection even if more are established. If the connection -;;; handling the streams closes then another is chosen, or if there -;;; are no connections then we revert to the original (real) streams. -;;; -;;; It is slightly tricky to assign the global values of standard -;;; streams because they are often shadowed by dynamic bindings. We -;;; solve this problem by introducing an extra indirection via synonym -;;; streams, so that *STANDARD-INPUT* is a synonym stream to -;;; *CURRENT-STANDARD-INPUT*, etc. We never shadow the "current" -;;; variables, so they can always be assigned to affect a global -;;; change. - -;;;;; Global redirection setup - -(defvar *saved-global-streams* '() - "A plist to save and restore redirected stream objects. -E.g. the value for '*standard-output* holds the stream object -for *standard-output* before we install our redirection.") - -(defun setup-stream-indirection (stream-var &optional stream) - "Setup redirection scaffolding for a global stream variable. -Supposing (for example) STREAM-VAR is *STANDARD-INPUT*, this macro: - -1. Saves the value of *STANDARD-INPUT* in `*SAVED-GLOBAL-STREAMS*'. - -2. Creates *CURRENT-STANDARD-INPUT*, initially with the same value as -*STANDARD-INPUT*. - -3. Assigns *STANDARD-INPUT* to a synonym stream pointing to -*CURRENT-STANDARD-INPUT*. - -This has the effect of making *CURRENT-STANDARD-INPUT* contain the -effective global value for *STANDARD-INPUT*. This way we can assign -the effective global value even when *STANDARD-INPUT* is shadowed by a -dynamic binding." - (let ((current-stream-var (prefixed-var '#:current stream-var)) - (stream (or stream (symbol-value stream-var)))) - ;; Save the real stream value for the future. - (setf (getf *saved-global-streams* stream-var) stream) - ;; Define a new variable for the effective stream. - ;; This can be reassigned. - (proclaim `(special ,current-stream-var)) - (set current-stream-var stream) - ;; Assign the real binding as a synonym for the current one. - (let ((stream (make-synonym-stream current-stream-var))) - (set stream-var stream) - (set-default-initial-binding stream-var `(quote ,stream))))) - -(defun prefixed-var (prefix variable-symbol) - "(PREFIXED-VAR \"FOO\" '*BAR*) => SWANK::*FOO-BAR*" - (let ((basename (subseq (symbol-name variable-symbol) 1))) - (intern (format nil "*~A-~A" (string prefix) basename) :swank))) - -(defvar *standard-output-streams* - '(*standard-output* *error-output* *trace-output*) - "The symbols naming standard output streams.") - -(defvar *standard-input-streams* - '(*standard-input*) - "The symbols naming standard input streams.") - -(defvar *standard-io-streams* - '(*debug-io* *query-io* *terminal-io*) - "The symbols naming standard io streams.") - -(defun init-global-stream-redirection () - (when (globally-redirect-io-p) - (cond (*saved-global-streams* - (warn "Streams already redirected.")) - (t - (mapc #'setup-stream-indirection - (append *standard-output-streams* - *standard-input-streams* - *standard-io-streams*)))))) - -(defun globally-redirect-io-to-connection (connection) - "Set the standard I/O streams to redirect to CONNECTION. -Assigns *CURRENT-* for all standard streams." - (dolist (o *standard-output-streams*) - (set (prefixed-var '#:current o) - (connection.user-output connection))) - ;; FIXME: If we redirect standard input to Emacs then we get the - ;; regular Lisp top-level trying to read from our REPL. - ;; - ;; Perhaps the ideal would be for the real top-level to run in a - ;; thread with local bindings for all the standard streams. Failing - ;; that we probably would like to inhibit it from reading while - ;; Emacs is connected. - ;; - ;; Meanwhile we just leave *standard-input* alone. - #+NIL - (dolist (i *standard-input-streams*) - (set (prefixed-var '#:current i) - (connection.user-input connection))) - (dolist (io *standard-io-streams*) - (set (prefixed-var '#:current io) - (connection.user-io connection)))) - -(defun revert-global-io-redirection () - "Set *CURRENT-* to *REAL-* for all standard streams." - (dolist (stream-var (append *standard-output-streams* - *standard-input-streams* - *standard-io-streams*)) - (set (prefixed-var '#:current stream-var) - (getf *saved-global-streams* stream-var)))) - -;;;;; Global redirection hooks - -(defvar *global-stdio-connection* nil - "The connection to which standard I/O streams are globally redirected. -NIL if streams are not globally redirected.") - -(defun maybe-redirect-global-io (connection) - "Consider globally redirecting to CONNECTION." - (when (and (globally-redirect-io-p) (null *global-stdio-connection*) - (connection.user-io connection)) - (unless *saved-global-streams* - (init-global-stream-redirection)) - (setq *global-stdio-connection* connection) - (globally-redirect-io-to-connection connection))) - -(defun update-redirection-after-close (closed-connection) - "Update redirection after a connection closes." - (check-type closed-connection connection) - (when (eq *global-stdio-connection* closed-connection) - (if (and (default-connection) (globally-redirect-io-p)) - ;; Redirect to another connection. - (globally-redirect-io-to-connection (default-connection)) - ;; No more connections, revert to the real streams. - (progn (revert-global-io-redirection) - (setq *global-stdio-connection* nil))))) - -(provide :swank-repl) diff --git a/elpa/slime-20200414.1444/contrib/swank-sbcl-exts.lisp b/elpa/slime-20200414.1444/contrib/swank-sbcl-exts.lisp deleted file mode 100644 index 6cbe09d9..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-sbcl-exts.lisp +++ /dev/null @@ -1,67 +0,0 @@ -;;; swank-sbcl-exts.lisp --- Misc extensions for SBCL -;; -;; Authors: Tobias C. Rittweiler -;; -;; License: Public Domain -;; - -(in-package :swank) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (swank-require :swank-arglists)) - -;; We need to do this so users can place `slime-sbcl-exts' into their -;; ~/.emacs, and still use any implementation they want. -#+sbcl -(progn - -;;; Display arglist of instructions. -;;; -(defmethod compute-enriched-decoded-arglist ((operator-form (eql 'sb-assem:inst)) - argument-forms) - (flet ((decode-instruction-arglist (instr-name instr-arglist) - (let ((decoded-arglist (decode-arglist instr-arglist))) - ;; The arglist of INST is (instruction ...INSTR-ARGLIST...). - (push 'sb-assem::instruction (arglist.required-args decoded-arglist)) - (values decoded-arglist - (list instr-name) - t)))) - (if (null argument-forms) - (call-next-method) - (destructuring-bind (instruction &rest args) argument-forms - (declare (ignore args)) - (let* ((instr-name - (typecase instruction - (arglist-dummy - (string-upcase (arglist-dummy.string-representation instruction))) - (symbol - (string-downcase instruction)))) - (instr-fn - #+#.(swank/backend:with-symbol 'op-encoder-name 'sb-assem) - (or (sb-assem::op-encoder-name instr-name) - (sb-assem::op-encoder-name (string-upcase instr-name))) - #+#.(swank/backend:with-symbol 'inst-emitter-symbol 'sb-assem) - (sb-assem::inst-emitter-symbol instr-name) - #+(and - (not #.(swank/backend:with-symbol 'inst-emitter-symbol 'sb-assem)) - #.(swank/backend:with-symbol '*assem-instructions* 'sb-assem)) - (gethash instr-name sb-assem:*assem-instructions*))) - (cond ((functionp instr-fn) - (with-available-arglist (arglist) (arglist instr-fn) - (decode-instruction-arglist instr-name arglist))) - ((fboundp instr-fn) - (with-available-arglist (arglist) (arglist instr-fn) - ;; SB-ASSEM:INST invokes a symbolic INSTR-FN with - ;; current segment and current vop implicitly. - (decode-instruction-arglist instr-name - (if (or (get instr-fn :macro) - (macro-function instr-fn)) - arglist - (cddr arglist))))) - (t - (call-next-method)))))))) - - -) ; PROGN - -(provide :swank-sbcl-exts) diff --git a/elpa/slime-20200414.1444/contrib/swank-snapshot.lisp b/elpa/slime-20200414.1444/contrib/swank-snapshot.lisp deleted file mode 100644 index 52a87ed0..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-snapshot.lisp +++ /dev/null @@ -1,67 +0,0 @@ - -(defpackage swank-snapshot - (:use cl) - (:export restore-snapshot save-snapshot background-save-snapshot) - (:import-from swank defslimefun)) -(in-package swank-snapshot) - -(defslimefun save-snapshot (image-file) - (swank/backend:save-image image-file - (let ((c swank::*emacs-connection*)) - (lambda () (resurrect c)))) - (format nil "Dumped lisp to ~A" image-file)) - -(defslimefun restore-snapshot (image-file) - (let* ((conn swank::*emacs-connection*) - (stream (swank::connection.socket-io conn)) - (clone (swank/backend:dup (swank/backend:socket-fd stream))) - (style (swank::connection.communication-style conn)) - (repl (if (swank::connection.user-io conn) t)) - (args (list "--swank-fd" (format nil "~d" clone) - "--swank-style" (format nil "~s" style) - "--swank-repl" (format nil "~s" repl)))) - (swank::close-connection conn nil nil) - (swank/backend:exec-image image-file args))) - -(defslimefun background-save-snapshot (image-file) - (let ((connection swank::*emacs-connection*)) - (flet ((complete (success) - (let ((swank::*emacs-connection* connection)) - (swank::background-message - "Dumping lisp image ~A ~:[failed!~;succeeded.~]" - image-file success))) - (awaken () - (resurrect connection))) - (swank/backend:background-save-image image-file - :restart-function #'awaken - :completion-function #'complete) - (format nil "Started dumping lisp to ~A..." image-file)))) - -(in-package :swank) - -(defun swank-snapshot::resurrect (old-connection) - (setq *log-output* nil) - (init-log-output) - (clear-event-history) - (setq *connections* (delete old-connection *connections*)) - (format *error-output* "args: ~s~%" (command-line-args)) - (let* ((fd (read-command-line-arg "--swank-fd")) - (style (read-command-line-arg "--swank-style")) - (repl (read-command-line-arg "--swank-repl")) - (* (format *error-output* "fd=~s style=~s~%" fd style)) - (stream (make-fd-stream fd nil)) - (connection (make-connection nil stream style))) - (let ((*emacs-connection* connection)) - (when repl (swank-repl:create-repl nil)) - (background-message "~A" "Lisp image restored")) - (serve-requests connection) - (simple-repl))) - -(defun read-command-line-arg (name) - (let* ((args (command-line-args)) - (pos (position name args :test #'equal))) - (read-from-string (elt args (1+ pos))))) - -(in-package :swank-snapshot) - -(provide :swank-snapshot) diff --git a/elpa/slime-20200414.1444/contrib/swank-sprof.lisp b/elpa/slime-20200414.1444/contrib/swank-sprof.lisp deleted file mode 100644 index 675240ff..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-sprof.lisp +++ /dev/null @@ -1,154 +0,0 @@ -;;; swank-sprof.lisp -;; -;; Authors: Juho Snellman -;; -;; License: MIT -;; - -(in-package :swank) - -#+sbcl -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :sb-sprof)) - -#+sbcl(progn - -(defvar *call-graph* nil) -(defvar *node-numbers* nil) -(defvar *number-nodes* nil) - -(defun frame-name (name) - (if (consp name) - (case (first name) - ((sb-c::xep sb-c::tl-xep - sb-c::&more-processor - sb-c::top-level-form - sb-c::&optional-processor) - (second name)) - (sb-pcl::fast-method - (cdr name)) - ((flet labels lambda) - (let* ((in (member :in name))) - (if (stringp (cadr in)) - (append (ldiff name in) (cddr in)) - name))) - (t - name)) - name)) - -(defun pretty-name (name) - (let ((*package* (find-package :common-lisp-user)) - (*print-right-margin* most-positive-fixnum)) - (format nil "~S" (frame-name name)))) - -(defun samples-percent (count) - (sb-sprof::samples-percent *call-graph* count)) - -(defun node-values (node) - (values (pretty-name (sb-sprof::node-name node)) - (samples-percent (sb-sprof::node-count node)) - (samples-percent (sb-sprof::node-accrued-count node)))) - -(defun filter-swank-nodes (nodes) - (let ((swank-packages (load-time-value - (mapcar #'find-package - '(swank swank/rpc swank/mop - swank/match swank/backend))))) - (remove-if (lambda (node) - (let ((name (sb-sprof::node-name node))) - (and (symbolp name) - (member (symbol-package name) swank-packages - :test #'eq)))) - nodes))) - -(defun serialize-call-graph (&key exclude-swank) - (let ((nodes (sb-sprof::call-graph-flat-nodes *call-graph*))) - (when exclude-swank - (setf nodes (filter-swank-nodes nodes))) - (setf nodes (sort (copy-list nodes) #'> - ;; :key #'sb-sprof::node-count))) - :key #'sb-sprof::node-accrued-count)) - (setf *number-nodes* (make-hash-table)) - (setf *node-numbers* (make-hash-table)) - (loop for node in nodes - for i from 1 - with total = 0 - collect (multiple-value-bind (name self cumulative) - (node-values node) - (setf (gethash node *node-numbers*) i - (gethash i *number-nodes*) node) - (incf total self) - (list i name self cumulative total)) into list - finally (return - (let ((rest (- 100 total))) - (return (append list - `((nil "Elsewhere" ,rest nil nil))))))))) - -(defslimefun swank-sprof-get-call-graph (&key exclude-swank) - (when (setf *call-graph* (sb-sprof:report :type nil)) - (serialize-call-graph :exclude-swank exclude-swank))) - -(defslimefun swank-sprof-expand-node (index) - (let* ((node (gethash index *number-nodes*))) - (labels ((caller-count (v) - (loop for e in (sb-sprof::vertex-edges v) do - (when (eq (sb-sprof::edge-vertex e) node) - (return-from caller-count (sb-sprof::call-count e)))) - 0) - (serialize-node (node count) - (etypecase node - (sb-sprof::cycle - (list (sb-sprof::cycle-index node) - (sb-sprof::cycle-name node) - (samples-percent count))) - (sb-sprof::node - (let ((name (node-values node))) - (list (gethash node *node-numbers*) - name - (samples-percent count))))))) - (list :callers (loop for node in - (sort (copy-list (sb-sprof::node-callers node)) #'> - :key #'caller-count) - collect (serialize-node node - (caller-count node))) - :calls (let ((edges (sort (copy-list (sb-sprof::vertex-edges node)) - #'> - :key #'sb-sprof::call-count))) - (loop for edge in edges - collect - (serialize-node (sb-sprof::edge-vertex edge) - (sb-sprof::call-count edge)))))))) - -(defslimefun swank-sprof-disassemble (index) - (let* ((node (gethash index *number-nodes*)) - (debug-info (sb-sprof::node-debug-info node))) - (with-output-to-string (s) - (typecase debug-info - (sb-impl::code-component - (sb-disassem::disassemble-memory (sb-vm::code-instructions debug-info) - (sb-vm::%code-code-size debug-info) - :stream s)) - (sb-di::compiled-debug-fun - (let ((component (sb-di::compiled-debug-fun-component debug-info))) - (sb-disassem::disassemble-code-component component :stream s))) - (t `(:error "No disassembly available")))))) - -(defslimefun swank-sprof-source-location (index) - (let* ((node (gethash index *number-nodes*)) - (debug-info (sb-sprof::node-debug-info node))) - (or (when (typep debug-info 'sb-di::compiled-debug-fun) - (let* ((component (sb-di::compiled-debug-fun-component debug-info)) - (function (sb-kernel::%code-entry-points component))) - (when function - (find-source-location function)))) - `(:error "No source location available")))) - -(defslimefun swank-sprof-start (&key (mode :cpu)) - (sb-sprof:start-profiling :mode mode)) - -(defslimefun swank-sprof-stop () - (sb-sprof:stop-profiling)) - -) - -(provide :swank-sprof) diff --git a/elpa/slime-20200414.1444/contrib/swank-trace-dialog.lisp b/elpa/slime-20200414.1444/contrib/swank-trace-dialog.lisp deleted file mode 100644 index 5cf95fd1..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-trace-dialog.lisp +++ /dev/null @@ -1,264 +0,0 @@ -(defpackage :swank-trace-dialog - (:use :cl) - (:import-from :swank :defslimefun :from-string :to-string) - (:export #:clear-trace-tree - #:dialog-toggle-trace - #:dialog-trace - #:dialog-traced-p - #:dialog-untrace - #:dialog-untrace-all - #:inspect-trace-part - #:report-partial-tree - #:report-specs - #:report-total - #:report-trace-detail - #:report-specs - #:trace-format - #:still-inside - #:exited-non-locally - #:*record-backtrace* - #:*traces-per-report* - #:*dialog-trace-follows-trace* - #:find-trace-part - #:find-trace)) - -(in-package :swank-trace-dialog) - -(defparameter *record-backtrace* nil - "Record a backtrace of the last 20 calls for each trace. - -Beware that this may have a drastic performance impact on your -program.") - -(defparameter *traces-per-report* 150 - "Number of traces to report to emacs in each batch.") - - -;;;; `trace-entry' model -;;;; -(defvar *traces* (make-array 1000 :fill-pointer 0 - :adjustable t)) - -(defvar *trace-lock* (swank/backend:make-lock :name "swank-trace-dialog lock")) - -(defvar *current-trace-by-thread* (make-hash-table)) - -(defclass trace-entry () - ((id :reader id-of) - (children :accessor children-of :initform nil) - (backtrace :accessor backtrace-of :initform (when *record-backtrace* - (useful-backtrace))) - - (spec :initarg :spec :accessor spec-of - :initform (error "must provide a spec")) - (args :initarg :args :accessor args-of - :initform (error "must provide args")) - (parent :initarg :parent :reader parent-of - :initform (error "must provide a parent, even if nil")) - (retlist :initarg :retlist :accessor retlist-of - :initform 'still-inside))) - -(defmethod initialize-instance :after ((entry trace-entry) &rest initargs) - (declare (ignore initargs)) - (if (parent-of entry) - (nconc (children-of (parent-of entry)) (list entry))) - (swank/backend:call-with-lock-held - *trace-lock* - #'(lambda () - (setf (slot-value entry 'id) (fill-pointer *traces*)) - (vector-push-extend entry *traces*)))) - -(defmethod print-object ((entry trace-entry) stream) - (print-unreadable-object (entry stream) - (format stream "~a: ~a" (id-of entry) (spec-of entry)))) - -(defun completed-p (trace) (not (eq (retlist-of trace) 'still-inside))) - -(defun find-trace (id) - (when (<= 0 id (1- (length *traces*))) - (aref *traces* id))) - -(defun find-trace-part (id part-id type) - (let* ((trace (find-trace id)) - (l (and trace - (ecase type - (:arg (args-of trace)) - (:retval (swank::ensure-list (retlist-of trace))))))) - (values (nth part-id l) - (< part-id (length l))))) - -(defun useful-backtrace () - (swank/backend:call-with-debugging-environment - #'(lambda () - (loop for i from 0 - for frame in (swank/backend:compute-backtrace 0 20) - collect (list i (swank::frame-to-string frame)))))) - -(defun current-trace () - (gethash (swank/backend:current-thread) *current-trace-by-thread*)) - -(defun (setf current-trace) (trace) - (setf (gethash (swank/backend:current-thread) *current-trace-by-thread*) - trace)) - - -;;;; Control of traced specs -;;; -(defvar *traced-specs* '()) - -(defslimefun dialog-trace (spec) - (flet ((before-hook (args) - (setf (current-trace) (make-instance 'trace-entry - :spec spec - :args args - :parent (current-trace)))) - (after-hook (retlist) - (let ((trace (current-trace))) - (when trace - ;; the current trace might have been wiped away if the - ;; user cleared the tree in the meantime. no biggie, - ;; don't do anything. - ;; - (setf (retlist-of trace) retlist - (current-trace) (parent-of trace)))))) - (when (dialog-traced-p spec) - (warn "~a is apparently already traced! Untracing and retracing." spec) - (dialog-untrace spec)) - (swank/backend:wrap spec 'trace-dialog - :before #'before-hook - :after #'after-hook) - (pushnew spec *traced-specs*) - (format nil "~a is now traced for trace dialog" spec))) - -(defslimefun dialog-untrace (spec) - (swank/backend:unwrap spec 'trace-dialog) - (setq *traced-specs* (remove spec *traced-specs* :test #'equal)) - (format nil "~a is now untraced for trace dialog" spec)) - -(defslimefun dialog-toggle-trace (spec) - (if (dialog-traced-p spec) - (dialog-untrace spec) - (dialog-trace spec))) - -(defslimefun dialog-traced-p (spec) - (find spec *traced-specs* :test #'equal)) - -(defslimefun dialog-untrace-all () - (untrace) - (mapcar #'dialog-untrace *traced-specs*)) - -(defparameter *dialog-trace-follows-trace* nil) - -(setq swank:*after-toggle-trace-hook* - #'(lambda (spec traced-p) - (when *dialog-trace-follows-trace* - (cond (traced-p - (dialog-trace spec) - "traced for trace dialog as well") - (t - (dialog-untrace spec) - "untraced for the trace dialog as well"))))) - - -;;;; A special kind of trace call -;;; -(defun trace-format (format-spec &rest format-args) - "Make a string from FORMAT-SPEC and FORMAT-ARGS and as a trace." - (let* ((line (apply #'format nil format-spec format-args))) - (make-instance 'trace-entry :spec line - :args format-args - :parent (current-trace) - :retlist nil))) - - -;;;; Reporting to emacs -;;; -(defparameter *visitor-idx* 0) - -(defparameter *visitor-key* nil) - -(defvar *unfinished-traces* '()) - -(defun describe-trace-for-emacs (trace) - `(,(id-of trace) - ,(and (parent-of trace) (id-of (parent-of trace))) - ,(spec-of trace) - ,(loop for arg in (args-of trace) - for i from 0 - collect (list i (swank::to-line arg))) - ,(loop for retval in (swank::ensure-list (retlist-of trace)) - for i from 0 - collect (list i (swank::to-line retval))))) - -(defslimefun report-partial-tree (key) - (unless (equal key *visitor-key*) - (setq *visitor-idx* 0 - *visitor-key* key)) - (let* ((recently-finished - (loop with i = 0 - for trace in *unfinished-traces* - while (< i *traces-per-report*) - when (completed-p trace) - collect trace - and do - (incf i) - (setq *unfinished-traces* - (remove trace *unfinished-traces*)))) - (new (loop for i - from (length recently-finished) - below *traces-per-report* - while (< *visitor-idx* (length *traces*)) - for trace = (aref *traces* *visitor-idx*) - collect trace - unless (completed-p trace) - do (push trace *unfinished-traces*) - do (incf *visitor-idx*)))) - (list - (mapcar #'describe-trace-for-emacs - (append recently-finished new)) - (- (length *traces*) *visitor-idx*) - key))) - -(defslimefun report-trace-detail (trace-id) - (swank::call-with-bindings - swank::*inspector-printer-bindings* - #'(lambda () - (let ((trace (find-trace trace-id))) - (when trace - (append - (describe-trace-for-emacs trace) - (list (backtrace-of trace) - (swank::to-line trace)))))))) - -(defslimefun report-specs () - (sort (copy-list *traced-specs*) - #'string< - :key #'princ-to-string)) - -(defslimefun report-total () - (length *traces*)) - -(defslimefun clear-trace-tree () - (setf *current-trace-by-thread* (clrhash *current-trace-by-thread*) - *visitor-key* nil - *unfinished-traces* nil) - (swank/backend:call-with-lock-held - *trace-lock* - #'(lambda () (setf (fill-pointer *traces*) 0))) - nil) - -;; HACK: `swank::*inspector-history*' is unbound by default and needs -;; a reset in that case so that it won't error `swank::inspect-object' -;; before any other object is inspected in the slime session. -;; -(unless (boundp 'swank::*inspector-history*) - (swank::reset-inspector)) - -(defslimefun inspect-trace-part (trace-id part-id type) - (multiple-value-bind (obj found) - (find-trace-part trace-id part-id type) - (if found - (swank::inspect-object obj) - (error "No object found with ~a, ~a and ~a" trace-id part-id type)))) - -(provide :swank-trace-dialog) diff --git a/elpa/slime-20200414.1444/contrib/swank-util.lisp b/elpa/slime-20200414.1444/contrib/swank-util.lisp deleted file mode 100644 index 72743ba1..00000000 --- a/elpa/slime-20200414.1444/contrib/swank-util.lisp +++ /dev/null @@ -1,63 +0,0 @@ -;;; swank-util.lisp --- stuff of questionable utility -;; -;; License: public domain - -(in-package :swank) - -(defmacro do-symbols* ((var &optional (package '*package*) result-form) - &body body) - "Just like do-symbols, but makes sure a symbol is visited only once." - (let ((seen-ht (gensym "SEEN-HT"))) - `(let ((,seen-ht (make-hash-table :test #'eq))) - (do-symbols (,var ,package ,result-form) - (unless (gethash ,var ,seen-ht) - (setf (gethash ,var ,seen-ht) t) - (tagbody ,@body)))))) - -(defun classify-symbol (symbol) - "Returns a list of classifiers that classify SYMBOL according to its -underneath objects (e.g. :BOUNDP if SYMBOL constitutes a special -variable.) The list may contain the following classification -keywords: :BOUNDP, :FBOUNDP, :CONSTANT, :GENERIC-FUNCTION, -:TYPESPEC, :CLASS, :MACRO, :SPECIAL-OPERATOR, and/or :PACKAGE" - (check-type symbol symbol) - (flet ((type-specifier-p (s) - (or (documentation s 'type) - (not (eq (type-specifier-arglist s) :not-available))))) - (let (result) - (when (boundp symbol) (push (if (constantp symbol) - :constant :boundp) result)) - (when (fboundp symbol) (push :fboundp result)) - (when (type-specifier-p symbol) (push :typespec result)) - (when (find-class symbol nil) (push :class result)) - (when (macro-function symbol) (push :macro result)) - (when (special-operator-p symbol) (push :special-operator result)) - (when (find-package symbol) (push :package result)) - (when (and (fboundp symbol) - (typep (ignore-errors (fdefinition symbol)) - 'generic-function)) - (push :generic-function result)) - result))) - -(defun symbol-classification-string (symbol) - "Return a string in the form -f-c---- where each letter stands for -boundp fboundp generic-function class macro special-operator package" - (let ((letters "bfgctmsp") - (result (copy-seq "--------"))) - (flet ((flip (letter) - (setf (char result (position letter letters)) - letter))) - (when (boundp symbol) (flip #\b)) - (when (fboundp symbol) - (flip #\f) - (when (typep (ignore-errors (fdefinition symbol)) - 'generic-function) - (flip #\g))) - (when (type-specifier-p symbol) (flip #\t)) - (when (find-class symbol nil) (flip #\c) ) - (when (macro-function symbol) (flip #\m)) - (when (special-operator-p symbol) (flip #\s)) - (when (find-package symbol) (flip #\p)) - result))) - -(provide :swank-util) diff --git a/elpa/slime-20200414.1444/contrib/swank.rb b/elpa/slime-20200414.1444/contrib/swank.rb deleted file mode 100644 index 69936495..00000000 --- a/elpa/slime-20200414.1444/contrib/swank.rb +++ /dev/null @@ -1,385 +0,0 @@ -# swank.rb --- swank server for Ruby. -# -# This is my first Ruby program and looks probably rather strange. Some -# people write Scheme interpreters when learning new languages, I -# write swank backends. -# -# Only a few things work. -# 1. Start the server with something like: ruby -r swank -e swank -# 2. Use M-x slime-connect to establish a connection - -require "socket" - -def swank(port=4005) - accept_connections port, false -end - -def start_swank(port_file) - accept_connections false, port_file -end - -def accept_connections(port, port_file) - server = TCPServer.new("localhost", port || 0) - puts "Listening on #{server.addr.inspect}\n" - if port_file - write_port_file server.addr[1], port_file - end - socket = begin server.accept ensure server.close end - begin - serve socket.to_io - ensure - socket.close - end -end - -def write_port_file(port, filename) - File.open(filename, File::CREAT|File::EXCL|File::WRONLY) do |f| - f.puts port - end -end - -def serve(io) - main_loop(io) -end - -def main_loop(io) - c = Connection.new(io) - while true - catch :swank_top_level do - c.dispatch(read_packet(io)) - end - end -end - -class Connection - - def initialize(io) - @io = io - end - - def dispatch(event) - puts "dispatch: %s\n" % event.inspect - case event[0] - when :":emacs-rex" - emacs_rex *event[1..4] - else raise "Unhandled event: #{event.inspect}" - end - end - - def send_to_emacs(obj) - payload = write_sexp_to_string(obj) - @io.write("%06x" % payload.length) - @io.write payload - @io.flush - end - - def emacs_rex(form, pkg, thread, id) - proc = $rpc_entries[form[0]] - args = form[1..-1]; - begin - raise "Undefined function: #{form[0]}" unless proc - value = proc[*args] - rescue Exception => exc - begin - pseudo_debug exc - ensure - send_to_emacs [:":return", [:":abort"], id] - end - else - send_to_emacs [:":return", [:":ok", value], id] - end - end - - def pseudo_debug(exc) - level = 1 - send_to_emacs [:":debug", 0, level] + sldb_info(exc, 0, 20) - begin - sldb_loop exc - ensure - send_to_emacs [:":debug-return", 0, level, :nil] - end - end - - def sldb_loop(exc) - $sldb_context = [self,exc] - while true - dispatch(read_packet(@io)) - end - end - - def sldb_info(exc, start, _end) - [[exc.to_s, - " [%s]" % exc.class.name, - :nil], - sldb_restarts(exc), - sldb_backtrace(exc, start, _end), - []] - end - - def sldb_restarts(exc) - [["Quit", "SLIME top-level."]] - end - - def sldb_backtrace(exc, start, _end) - bt = [] - exc.backtrace[start.._end].each_with_index do |frame, i| - bt << [i, frame] - end - bt - end - - def frame_src_loc(exc, frame) - string = exc.backtrace[frame] - match = /([^:]+):([0-9]+)/.match(string) - if match - file,line = match[1..2] - [:":location", [:":file", file], [:":line", line.to_i], :nil] - else - [:":error", "no src-loc for frame: #{string}"] - end - end - -end - -$rpc_entries = Hash.new - -$rpc_entries[:"swank:connection-info"] = lambda do || - [:":pid", $$, - :":package", [:":name", "ruby", :":prompt", "ruby> "], - :":lisp-implementation", [:":type", "Ruby", - :":name", "ruby", - :":version", RUBY_VERSION]] -end - -def swank_interactive_eval(string) - eval(string,TOPLEVEL_BINDING).inspect -end - -$rpc_entries[:"swank:interactive-eval"] = \ -$rpc_entries[:"swank:interactive-eval-region"] = \ -$rpc_entries[:"swank:pprint-eval"] = lambda { |string| - swank_interactive_eval string -} - -$rpc_entries[:"swank:throw-to-toplevel"] = lambda { - throw :swank_top_level -} - -$rpc_entries[:"swank:backtrace"] = lambda do |from, to| - conn, exc = $sldb_context - conn.sldb_backtrace(exc, from, to) -end - -$rpc_entries[:"swank:frame-source-location"] = lambda do |frame| - conn, exc = $sldb_context - conn.frame_src_loc(exc, frame) -end - -#ignored -$rpc_entries[:"swank:buffer-first-change"] = \ -$rpc_entries[:"swank:operator-arglist"] = lambda do - :nil -end - -$rpc_entries[:"swank:simple-completions"] = lambda do |prefix, pkg| - swank_simple_completions prefix, pkg -end - -# def swank_simple_completions(prefix, pkg) - -def read_packet(io) - header = read_chunk(io, 6) - len = header.hex - payload = read_chunk(io, len) - #$deferr.puts payload.inspect - read_sexp_from_string(payload) -end - -def read_chunk(io, len) - buffer = io.read(len) - raise "short read" if buffer.length != len - buffer -end - -def write_sexp_to_string(obj) - string = "" - write_sexp_to_string_loop obj, string - string -end - -def write_sexp_to_string_loop(obj, string) - if obj.is_a? String - string << "\"" - string << obj.gsub(/(["\\])/,'\\\\\1') - string << "\"" - elsif obj.is_a? Array - string << "(" - max = obj.length-1 - obj.each_with_index do |e,i| - write_sexp_to_string_loop e, string - string << " " unless i == max - end - string << ")" - elsif obj.is_a? Symbol or obj.is_a? Numeric - string << obj.to_s - elsif obj == false - string << "nil" - elsif obj == true - string << "t" - else raise "Can't write: #{obj.inspect}" - end -end - -def read_sexp_from_string(string) - stream = StringInputStream.new(string) - reader = LispReader.new(stream) - reader.read -end - -class LispReader - def initialize(io) - @io = io - end - - def read(allow_consing_dot=false) - skip_whitespace - c = @io.getc - case c - when ?( then read_list(true) - when ?" then read_string - when ?' then read_quote - when nil then raise EOFError.new("EOF during read") - else - @io.ungetc(c) - obj = read_number_or_symbol - if obj == :"." and not allow_consing_dot - raise "Consing-dot in invalid context" - end - obj - end - end - - def read_list(head) - list = [] - loop do - skip_whitespace - c = @io.readchar - if c == ?) - break - else - @io.ungetc(c) - obj = read(!head) - if obj == :"." - error "Consing-dot not implemented" # would need real conses - end - head = false - list << obj - end - end - list - end - - def read_string - string = "" - loop do - c = @io.getc - case c - when ?" - break - when ?\\ - c = @io.getc - case c - when ?\\, ?" then string << c - else raise "Invalid escape char: \\%c" % c - end - else - string << c - end - end - string - end - - def read_quote - [:quote, read] - end - - def read_number_or_symbol - token = read_token - if token.empty? - raise EOFError.new - elsif /^[0-9]+$/.match(token) - token.to_i - elsif /^[0-9]+\.[0-9]+$/.match(token) - token.to_f - else - token.intern - end - end - - def read_token - token = "" - loop do - c = @io.getc - if c.nil? - break - elsif terminating?(c) - @io.ungetc(c) - break - else - token << c - end - end - token - end - - def skip_whitespace - loop do - c = @io.getc - case c - when ?\s, ?\n, ?\t then next - when nil then break - else @io.ungetc(c); break - end - end - end - - def terminating?(char) - " \n\t()\"'".include?(char) - end - -end - - -class StringInputStream - def initialize(string) - @string = string - @pos = 0 - @max = string.length - end - - def pos() @pos end - - def getc - if @pos == @max - nil - else - c = @string[@pos] - @pos += 1 - c - end - end - - def readchar - getc or raise EOFError.new - end - - def ungetc(c) - if @pos > 0 && @string[@pos-1] == c - @pos -= 1 - else - raise "Invalid argument: %c [at %d]" % [c, @pos] - end - end - -end - diff --git a/elpa/slime-20200414.1444/dir b/elpa/slime-20200414.1444/dir deleted file mode 100644 index 2b9c3d62..00000000 --- a/elpa/slime-20200414.1444/dir +++ /dev/null @@ -1,18 +0,0 @@ -This is the file .../info/dir, which contains the -topmost node of the Info hierarchy, called (dir)Top. -The first time you invoke Info you start off looking at this node. - -File: dir, Node: Top This is the top of the INFO tree - - This (the Directory node) gives a menu of major topics. - Typing "q" exits, "H" lists all Info commands, "d" returns here, - "h" gives a primer for first-timers, - "mEmacs" visits the Emacs manual, etc. - - In Emacs, you can click mouse button 2 on a menu item or cross reference - to select it. - -* Menu: - -Emacs -* SLIME: (slime). Superior Lisp Interaction Mode for Emacs. diff --git a/elpa/slime-20200414.1444/lib/hyperspec.el b/elpa/slime-20200414.1444/lib/hyperspec.el deleted file mode 100644 index 45c33281..00000000 --- a/elpa/slime-20200414.1444/lib/hyperspec.el +++ /dev/null @@ -1,2511 +0,0 @@ -;;; hyperspec.el --- Browse documentation from the Common Lisp HyperSpec - -;; Copyright 1997 Naggum Software - -;; Author: Erik Naggum -;; Keywords: lisp - -;; This file is not part of GNU Emacs, but distributed under the same -;; conditions as GNU Emacs, and is useless without GNU Emacs. - -;; GNU Emacs is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; Kent Pitman and Xanalys Inc. have made the text of American National -;; Standard for Information Technology -- Programming Language -- Common -;; Lisp, ANSI X3.226-1994 available on the WWW, in the form of the Common -;; Lisp HyperSpec. This package makes it convenient to peruse this -;; documentation from within Emacs. - -;;; Code: - -(require 'cl-lib nil t) -(require 'cl-lib "lib/cl-lib") -(require 'browse-url) ;you need the Emacs 20 version -(require 'thingatpt) - -(defvar common-lisp-hyperspec-root - "http://www.lispworks.com/reference/HyperSpec/" - "The root of the Common Lisp HyperSpec URL. -If you copy the HyperSpec to your local system, set this variable to -something like \"file://usr/local/doc/HyperSpec/\".") - -;;; Added variable for CLHS symbol table. See details below. -;;; -;;; 20011201 Edi Weitz - -(defvar common-lisp-hyperspec-symbol-table nil - "The HyperSpec symbol table file. -If you copy the HyperSpec to your local system, set this variable to -the location of the symbol table which is usually \"Map_Sym.txt\" -or \"Symbol-Table.text\".") - -(defvar common-lisp-hyperspec-history nil - "History of symbols looked up in the Common Lisp HyperSpec.") - -(defvar common-lisp-hyperspec--symbols (make-hash-table :test 'equal) - "Map a symbol name to its list of relative URLs.") - -;; Lookup NAME in 'common-lisp-hyperspec--symbols´ -(defun common-lisp-hyperspec--find (name) - "Get the relative url of a Common Lisp symbol NAME." - (gethash name common-lisp-hyperspec--symbols)) - -(defun common-lisp-hyperspec--insert (name relative-url) - "Insert CL symbol NAME and RELATIVE-URL into master table." - (cl-pushnew relative-url - (gethash name common-lisp-hyperspec--symbols) - :test #'equal)) - -(defun common-lisp-hyperspec--strip-cl-package (name) - (if (string-match "^\\([^:]*\\)::?\\([^:]*\\)$" name) - (let ((package-name (match-string 1 name)) - (symbol-name (match-string 2 name))) - (if (member (downcase package-name) - '("cl" "common-lisp")) - symbol-name - name)) - name)) - -;; Choose the symbol at point or read symbol-name from the minibuffer. -(defun common-lisp-hyperspec-read-symbol-name (&optional symbol-at-point) - (let* ((symbol-at-point (or symbol-at-point (thing-at-point 'symbol))) - (stripped-symbol (and symbol-at-point - (common-lisp-hyperspec--strip-cl-package - (downcase symbol-at-point))))) - (cond ((and stripped-symbol - (common-lisp-hyperspec--find stripped-symbol)) - stripped-symbol) - (t - (completing-read "Look up symbol in Common Lisp HyperSpec: " - common-lisp-hyperspec--symbols nil t - stripped-symbol - 'common-lisp-hyperspec-history))))) - -;; FIXME: is the (sleep-for 1.5) a actually needed? -(defun common-lisp-hyperspec (symbol-name) - "View the documentation on SYMBOL-NAME from the Common Lisp HyperSpec. -If SYMBOL-NAME has more than one definition, all of them are displayed with -your favorite browser in sequence. The browser should have a \"back\" -function to view the separate definitions. - -The Common Lisp HyperSpec is the full ANSI Standard Common Lisp, provided -by Kent Pitman and Xanalys Inc. By default, the Xanalys Web site is -visited to retrieve the information. Xanalys Inc. allows you to transfer -the entire Common Lisp HyperSpec to your own site under certain conditions. -Visit http://www.lispworks.com/reference/HyperSpec/ for more information. -If you copy the HyperSpec to another location, customize the variable -`common-lisp-hyperspec-root' to point to that location." - (interactive (list (common-lisp-hyperspec-read-symbol-name))) - (let ((name (common-lisp-hyperspec--strip-cl-package - (downcase symbol-name)))) - (cl-maplist (lambda (entry) - (browse-url (concat common-lisp-hyperspec-root "Body/" - (car entry))) - (when (cdr entry) - (sleep-for 1.5))) - (or (common-lisp-hyperspec--find name) - (error "The symbol `%s' is not defined in Common Lisp" - symbol-name))))) - -;;; Added dynamic lookup of symbol in CLHS symbol table -;;; -;;; 20011202 Edi Weitz - -;;; Replaced symbol table for v 4.0 with the one for v 6.0 -;;; (which is now online at Xanalys' site) -;;; -;;; 20020213 Edi Weitz - -(defun common-lisp-hyperspec--get-one-line () - (prog1 - (cl-delete ?\n (thing-at-point 'line)) - (forward-line))) - -(defun common-lisp-hyperspec--parse-map-file (file) - (with-current-buffer (find-file-noselect file) - (goto-char (point-min)) - (let ((result '())) - (while (< (point) (point-max)) - (let* ((symbol-name (downcase (common-lisp-hyperspec--get-one-line))) - (relative-url (common-lisp-hyperspec--get-one-line)) - (file (file-name-nondirectory relative-url))) - (push (list symbol-name file) - result))) - (reverse result)))) - -(mapc (lambda (entry) - (common-lisp-hyperspec--insert (car entry) (cadr entry))) - (if common-lisp-hyperspec-symbol-table - (common-lisp-hyperspec--parse-map-file - common-lisp-hyperspec-symbol-table) - '(("&allow-other-keys" "03_da.htm") - ("&aux" "03_da.htm") - ("&body" "03_dd.htm") - ("&environment" "03_dd.htm") - ("&key" "03_da.htm") - ("&optional" "03_da.htm") - ("&rest" "03_da.htm") - ("&whole" "03_dd.htm") - ("*" "a_st.htm") - ("**" "v__stst_.htm") - ("***" "v__stst_.htm") - ("*break-on-signals*" "v_break_.htm") - ("*compile-file-pathname*" "v_cmp_fi.htm") - ("*compile-file-truename*" "v_cmp_fi.htm") - ("*compile-print*" "v_cmp_pr.htm") - ("*compile-verbose*" "v_cmp_pr.htm") - ("*debug-io*" "v_debug_.htm") - ("*debugger-hook*" "v_debugg.htm") - ("*default-pathname-defaults*" "v_defaul.htm") - ("*error-output*" "v_debug_.htm") - ("*features*" "v_featur.htm") - ("*gensym-counter*" "v_gensym.htm") - ("*load-pathname*" "v_ld_pns.htm") - ("*load-print*" "v_ld_prs.htm") - ("*load-truename*" "v_ld_pns.htm") - ("*load-verbose*" "v_ld_prs.htm") - ("*macroexpand-hook*" "v_mexp_h.htm") - ("*modules*" "v_module.htm") - ("*package*" "v_pkg.htm") - ("*print-array*" "v_pr_ar.htm") - ("*print-base*" "v_pr_bas.htm") - ("*print-case*" "v_pr_cas.htm") - ("*print-circle*" "v_pr_cir.htm") - ("*print-escape*" "v_pr_esc.htm") - ("*print-gensym*" "v_pr_gen.htm") - ("*print-length*" "v_pr_lev.htm") - ("*print-level*" "v_pr_lev.htm") - ("*print-lines*" "v_pr_lin.htm") - ("*print-miser-width*" "v_pr_mis.htm") - ("*print-pprint-dispatch*" "v_pr_ppr.htm") - ("*print-pretty*" "v_pr_pre.htm") - ("*print-radix*" "v_pr_bas.htm") - ("*print-readably*" "v_pr_rda.htm") - ("*print-right-margin*" "v_pr_rig.htm") - ("*query-io*" "v_debug_.htm") - ("*random-state*" "v_rnd_st.htm") - ("*read-base*" "v_rd_bas.htm") - ("*read-default-float-format*" "v_rd_def.htm") - ("*read-eval*" "v_rd_eva.htm") - ("*read-suppress*" "v_rd_sup.htm") - ("*readtable*" "v_rdtabl.htm") - ("*standard-input*" "v_debug_.htm") - ("*standard-output*" "v_debug_.htm") - ("*terminal-io*" "v_termin.htm") - ("*trace-output*" "v_debug_.htm") - ("+" "a_pl.htm") - ("++" "v_pl_plp.htm") - ("+++" "v_pl_plp.htm") - ("-" "a__.htm") - ("/" "a_sl.htm") - ("//" "v_sl_sls.htm") - ("///" "v_sl_sls.htm") - ("/=" "f_eq_sle.htm") - ("1+" "f_1pl_1_.htm") - ("1-" "f_1pl_1_.htm") - ("<" "f_eq_sle.htm") - ("<=" "f_eq_sle.htm") - ("=" "f_eq_sle.htm") - (">" "f_eq_sle.htm") - (">=" "f_eq_sle.htm") - ("abort" "a_abort.htm") - ("abs" "f_abs.htm") - ("acons" "f_acons.htm") - ("acos" "f_asin_.htm") - ("acosh" "f_sinh_.htm") - ("add-method" "f_add_me.htm") - ("adjoin" "f_adjoin.htm") - ("adjust-array" "f_adjust.htm") - ("adjustable-array-p" "f_adju_1.htm") - ("allocate-instance" "f_alloca.htm") - ("alpha-char-p" "f_alpha_.htm") - ("alphanumericp" "f_alphan.htm") - ("and" "a_and.htm") - ("append" "f_append.htm") - ("apply" "f_apply.htm") - ("apropos" "f_apropo.htm") - ("apropos-list" "f_apropo.htm") - ("aref" "f_aref.htm") - ("arithmetic-error" "e_arithm.htm") - ("arithmetic-error-operands" "f_arithm.htm") - ("arithmetic-error-operation" "f_arithm.htm") - ("array" "t_array.htm") - ("array-dimension" "f_ar_dim.htm") - ("array-dimension-limit" "v_ar_dim.htm") - ("array-dimensions" "f_ar_d_1.htm") - ("array-displacement" "f_ar_dis.htm") - ("array-element-type" "f_ar_ele.htm") - ("array-has-fill-pointer-p" "f_ar_has.htm") - ("array-in-bounds-p" "f_ar_in_.htm") - ("array-rank" "f_ar_ran.htm") - ("array-rank-limit" "v_ar_ran.htm") - ("array-row-major-index" "f_ar_row.htm") - ("array-total-size" "f_ar_tot.htm") - ("array-total-size-limit" "v_ar_tot.htm") - ("arrayp" "f_arrayp.htm") - ("ash" "f_ash.htm") - ("asin" "f_asin_.htm") - ("asinh" "f_sinh_.htm") - ("assert" "m_assert.htm") - ("assoc" "f_assocc.htm") - ("assoc-if" "f_assocc.htm") - ("assoc-if-not" "f_assocc.htm") - ("atan" "f_asin_.htm") - ("atanh" "f_sinh_.htm") - ("atom" "a_atom.htm") - ("base-char" "t_base_c.htm") - ("base-string" "t_base_s.htm") - ("bignum" "t_bignum.htm") - ("bit" "a_bit.htm") - ("bit-and" "f_bt_and.htm") - ("bit-andc1" "f_bt_and.htm") - ("bit-andc2" "f_bt_and.htm") - ("bit-eqv" "f_bt_and.htm") - ("bit-ior" "f_bt_and.htm") - ("bit-nand" "f_bt_and.htm") - ("bit-nor" "f_bt_and.htm") - ("bit-not" "f_bt_and.htm") - ("bit-orc1" "f_bt_and.htm") - ("bit-orc2" "f_bt_and.htm") - ("bit-vector" "t_bt_vec.htm") - ("bit-vector-p" "f_bt_vec.htm") - ("bit-xor" "f_bt_and.htm") - ("block" "s_block.htm") - ("boole" "f_boole.htm") - ("boole-1" "v_b_1_b.htm") - ("boole-2" "v_b_1_b.htm") - ("boole-and" "v_b_1_b.htm") - ("boole-andc1" "v_b_1_b.htm") - ("boole-andc2" "v_b_1_b.htm") - ("boole-c1" "v_b_1_b.htm") - ("boole-c2" "v_b_1_b.htm") - ("boole-clr" "v_b_1_b.htm") - ("boole-eqv" "v_b_1_b.htm") - ("boole-ior" "v_b_1_b.htm") - ("boole-nand" "v_b_1_b.htm") - ("boole-nor" "v_b_1_b.htm") - ("boole-orc1" "v_b_1_b.htm") - ("boole-orc2" "v_b_1_b.htm") - ("boole-set" "v_b_1_b.htm") - ("boole-xor" "v_b_1_b.htm") - ("boolean" "t_ban.htm") - ("both-case-p" "f_upper_.htm") - ("boundp" "f_boundp.htm") - ("break" "f_break.htm") - ("broadcast-stream" "t_broadc.htm") - ("broadcast-stream-streams" "f_broadc.htm") - ("built-in-class" "t_built_.htm") - ("butlast" "f_butlas.htm") - ("byte" "f_by_by.htm") - ("byte-position" "f_by_by.htm") - ("byte-size" "f_by_by.htm") - ("caaaar" "f_car_c.htm") - ("caaadr" "f_car_c.htm") - ("caaar" "f_car_c.htm") - ("caadar" "f_car_c.htm") - ("caaddr" "f_car_c.htm") - ("caadr" "f_car_c.htm") - ("caar" "f_car_c.htm") - ("cadaar" "f_car_c.htm") - ("cadadr" "f_car_c.htm") - ("cadar" "f_car_c.htm") - ("caddar" "f_car_c.htm") - ("cadddr" "f_car_c.htm") - ("caddr" "f_car_c.htm") - ("cadr" "f_car_c.htm") - ("call-arguments-limit" "v_call_a.htm") - ("call-method" "m_call_m.htm") - ("call-next-method" "f_call_n.htm") - ("car" "f_car_c.htm") - ("case" "m_case_.htm") - ("catch" "s_catch.htm") - ("ccase" "m_case_.htm") - ("cdaaar" "f_car_c.htm") - ("cdaadr" "f_car_c.htm") - ("cdaar" "f_car_c.htm") - ("cdadar" "f_car_c.htm") - ("cdaddr" "f_car_c.htm") - ("cdadr" "f_car_c.htm") - ("cdar" "f_car_c.htm") - ("cddaar" "f_car_c.htm") - ("cddadr" "f_car_c.htm") - ("cddar" "f_car_c.htm") - ("cdddar" "f_car_c.htm") - ("cddddr" "f_car_c.htm") - ("cdddr" "f_car_c.htm") - ("cddr" "f_car_c.htm") - ("cdr" "f_car_c.htm") - ("ceiling" "f_floorc.htm") - ("cell-error" "e_cell_e.htm") - ("cell-error-name" "f_cell_e.htm") - ("cerror" "f_cerror.htm") - ("change-class" "f_chg_cl.htm") - ("char" "f_char_.htm") - ("char-code" "f_char_c.htm") - ("char-code-limit" "v_char_c.htm") - ("char-downcase" "f_char_u.htm") - ("char-equal" "f_chareq.htm") - ("char-greaterp" "f_chareq.htm") - ("char-int" "f_char_i.htm") - ("char-lessp" "f_chareq.htm") - ("char-name" "f_char_n.htm") - ("char-not-equal" "f_chareq.htm") - ("char-not-greaterp" "f_chareq.htm") - ("char-not-lessp" "f_chareq.htm") - ("char-upcase" "f_char_u.htm") - ("char/=" "f_chareq.htm") - ("char<" "f_chareq.htm") - ("char<=" "f_chareq.htm") - ("char=" "f_chareq.htm") - ("char>" "f_chareq.htm") - ("char>=" "f_chareq.htm") - ("character" "a_ch.htm") - ("characterp" "f_chp.htm") - ("check-type" "m_check_.htm") - ("cis" "f_cis.htm") - ("class" "t_class.htm") - ("class-name" "f_class_.htm") - ("class-of" "f_clas_1.htm") - ("clear-input" "f_clear_.htm") - ("clear-output" "f_finish.htm") - ("close" "f_close.htm") - ("clrhash" "f_clrhas.htm") - ("code-char" "f_code_c.htm") - ("coerce" "f_coerce.htm") - ("compilation-speed" "d_optimi.htm") - ("compile" "f_cmp.htm") - ("compile-file" "f_cmp_fi.htm") - ("compile-file-pathname" "f_cmp__1.htm") - ("compiled-function" "t_cmpd_f.htm") - ("compiled-function-p" "f_cmpd_f.htm") - ("compiler-macro" "f_docume.htm") - ("compiler-macro-function" "f_cmp_ma.htm") - ("complement" "f_comple.htm") - ("complex" "a_comple.htm") - ("complexp" "f_comp_3.htm") - ("compute-applicable-methods" "f_comput.htm") - ("compute-restarts" "f_comp_1.htm") - ("concatenate" "f_concat.htm") - ("concatenated-stream" "t_concat.htm") - ("concatenated-stream-streams" "f_conc_1.htm") - ("cond" "m_cond.htm") - ("condition" "e_cnd.htm") - ("conjugate" "f_conjug.htm") - ("cons" "a_cons.htm") - ("consp" "f_consp.htm") - ("constantly" "f_cons_1.htm") - ("constantp" "f_consta.htm") - ("continue" "a_contin.htm") - ("control-error" "e_contro.htm") - ("copy-alist" "f_cp_ali.htm") - ("copy-list" "f_cp_lis.htm") - ("copy-pprint-dispatch" "f_cp_ppr.htm") - ("copy-readtable" "f_cp_rdt.htm") - ("copy-seq" "f_cp_seq.htm") - ("copy-structure" "f_cp_stu.htm") - ("copy-symbol" "f_cp_sym.htm") - ("copy-tree" "f_cp_tre.htm") - ("cos" "f_sin_c.htm") - ("cosh" "f_sinh_.htm") - ("count" "f_countc.htm") - ("count-if" "f_countc.htm") - ("count-if-not" "f_countc.htm") - ("ctypecase" "m_tpcase.htm") - ("debug" "d_optimi.htm") - ("decf" "m_incf_.htm") - ("declaim" "m_declai.htm") - ("declaration" "d_declar.htm") - ("declare" "s_declar.htm") - ("decode-float" "f_dec_fl.htm") - ("decode-universal-time" "f_dec_un.htm") - ("defclass" "m_defcla.htm") - ("defconstant" "m_defcon.htm") - ("defgeneric" "m_defgen.htm") - ("define-compiler-macro" "m_define.htm") - ("define-condition" "m_defi_5.htm") - ("define-method-combination" "m_defi_4.htm") - ("define-modify-macro" "m_defi_2.htm") - ("define-setf-expander" "m_defi_3.htm") - ("define-symbol-macro" "m_defi_1.htm") - ("defmacro" "m_defmac.htm") - ("defmethod" "m_defmet.htm") - ("defpackage" "m_defpkg.htm") - ("defparameter" "m_defpar.htm") - ("defsetf" "m_defset.htm") - ("defstruct" "m_defstr.htm") - ("deftype" "m_deftp.htm") - ("defun" "m_defun.htm") - ("defvar" "m_defpar.htm") - ("delete" "f_rm_rm.htm") - ("delete-duplicates" "f_rm_dup.htm") - ("delete-file" "f_del_fi.htm") - ("delete-if" "f_rm_rm.htm") - ("delete-if-not" "f_rm_rm.htm") - ("delete-package" "f_del_pk.htm") - ("denominator" "f_numera.htm") - ("deposit-field" "f_deposi.htm") - ("describe" "f_descri.htm") - ("describe-object" "f_desc_1.htm") - ("destructuring-bind" "m_destru.htm") - ("digit-char" "f_digit_.htm") - ("digit-char-p" "f_digi_1.htm") - ("directory" "f_dir.htm") - ("directory-namestring" "f_namest.htm") - ("disassemble" "f_disass.htm") - ("division-by-zero" "e_divisi.htm") - ("do" "m_do_do.htm") - ("do*" "m_do_do.htm") - ("do-all-symbols" "m_do_sym.htm") - ("do-external-symbols" "m_do_sym.htm") - ("do-symbols" "m_do_sym.htm") - ("documentation" "f_docume.htm") - ("dolist" "m_dolist.htm") - ("dotimes" "m_dotime.htm") - ("double-float" "t_short_.htm") - ("double-float-epsilon" "v_short_.htm") - ("double-float-negative-epsilon" "v_short_.htm") - ("dpb" "f_dpb.htm") - ("dribble" "f_dribbl.htm") - ("dynamic-extent" "d_dynami.htm") - ("ecase" "m_case_.htm") - ("echo-stream" "t_echo_s.htm") - ("echo-stream-input-stream" "f_echo_s.htm") - ("echo-stream-output-stream" "f_echo_s.htm") - ("ed" "f_ed.htm") - ("eighth" "f_firstc.htm") - ("elt" "f_elt.htm") - ("encode-universal-time" "f_encode.htm") - ("end-of-file" "e_end_of.htm") - ("endp" "f_endp.htm") - ("enough-namestring" "f_namest.htm") - ("ensure-directories-exist" "f_ensu_1.htm") - ("ensure-generic-function" "f_ensure.htm") - ("eq" "f_eq.htm") - ("eql" "a_eql.htm") - ("equal" "f_equal.htm") - ("equalp" "f_equalp.htm") - ("error" "a_error.htm") - ("etypecase" "m_tpcase.htm") - ("eval" "f_eval.htm") - ("eval-when" "s_eval_w.htm") - ("evenp" "f_evenpc.htm") - ("every" "f_everyc.htm") - ("exp" "f_exp_e.htm") - ("export" "f_export.htm") - ("expt" "f_exp_e.htm") - ("extended-char" "t_extend.htm") - ("fboundp" "f_fbound.htm") - ("fceiling" "f_floorc.htm") - ("fdefinition" "f_fdefin.htm") - ("ffloor" "f_floorc.htm") - ("fifth" "f_firstc.htm") - ("file-author" "f_file_a.htm") - ("file-error" "e_file_e.htm") - ("file-error-pathname" "f_file_e.htm") - ("file-length" "f_file_l.htm") - ("file-namestring" "f_namest.htm") - ("file-position" "f_file_p.htm") - ("file-stream" "t_file_s.htm") - ("file-string-length" "f_file_s.htm") - ("file-write-date" "f_file_w.htm") - ("fill" "f_fill.htm") - ("fill-pointer" "f_fill_p.htm") - ("find" "f_find_.htm") - ("find-all-symbols" "f_find_a.htm") - ("find-class" "f_find_c.htm") - ("find-if" "f_find_.htm") - ("find-if-not" "f_find_.htm") - ("find-method" "f_find_m.htm") - ("find-package" "f_find_p.htm") - ("find-restart" "f_find_r.htm") - ("find-symbol" "f_find_s.htm") - ("finish-output" "f_finish.htm") - ("first" "f_firstc.htm") - ("fixnum" "t_fixnum.htm") - ("flet" "s_flet_.htm") - ("float" "a_float.htm") - ("float-digits" "f_dec_fl.htm") - ("float-precision" "f_dec_fl.htm") - ("float-radix" "f_dec_fl.htm") - ("float-sign" "f_dec_fl.htm") - ("floating-point-inexact" "e_floa_1.htm") - ("floating-point-invalid-operation" "e_floati.htm") - ("floating-point-overflow" "e_floa_2.htm") - ("floating-point-underflow" "e_floa_3.htm") - ("floatp" "f_floatp.htm") - ("floor" "f_floorc.htm") - ("fmakunbound" "f_fmakun.htm") - ("force-output" "f_finish.htm") - ("format" "f_format.htm") - ("formatter" "m_format.htm") - ("fourth" "f_firstc.htm") - ("fresh-line" "f_terpri.htm") - ("fround" "f_floorc.htm") - ("ftruncate" "f_floorc.htm") - ("ftype" "d_ftype.htm") - ("funcall" "f_funcal.htm") - ("function" "a_fn.htm") - ("function-keywords" "f_fn_kwd.htm") - ("function-lambda-expression" "f_fn_lam.htm") - ("functionp" "f_fnp.htm") - ("gcd" "f_gcd.htm") - ("generic-function" "t_generi.htm") - ("gensym" "f_gensym.htm") - ("gentemp" "f_gentem.htm") - ("get" "f_get.htm") - ("get-decoded-time" "f_get_un.htm") - ("get-dispatch-macro-character" "f_set__1.htm") - ("get-internal-real-time" "f_get_in.htm") - ("get-internal-run-time" "f_get__1.htm") - ("get-macro-character" "f_set_ma.htm") - ("get-output-stream-string" "f_get_ou.htm") - ("get-properties" "f_get_pr.htm") - ("get-setf-expansion" "f_get_se.htm") - ("get-universal-time" "f_get_un.htm") - ("getf" "f_getf.htm") - ("gethash" "f_gethas.htm") - ("go" "s_go.htm") - ("graphic-char-p" "f_graphi.htm") - ("handler-bind" "m_handle.htm") - ("handler-case" "m_hand_1.htm") - ("hash-table" "t_hash_t.htm") - ("hash-table-count" "f_hash_1.htm") - ("hash-table-p" "f_hash_t.htm") - ("hash-table-rehash-size" "f_hash_2.htm") - ("hash-table-rehash-threshold" "f_hash_3.htm") - ("hash-table-size" "f_hash_4.htm") - ("hash-table-test" "f_hash_5.htm") - ("host-namestring" "f_namest.htm") - ("identity" "f_identi.htm") - ("if" "s_if.htm") - ("ignorable" "d_ignore.htm") - ("ignore" "d_ignore.htm") - ("ignore-errors" "m_ignore.htm") - ("imagpart" "f_realpa.htm") - ("import" "f_import.htm") - ("in-package" "m_in_pkg.htm") - ("incf" "m_incf_.htm") - ("initialize-instance" "f_init_i.htm") - ("inline" "d_inline.htm") - ("input-stream-p" "f_in_stm.htm") - ("inspect" "f_inspec.htm") - ("integer" "t_intege.htm") - ("integer-decode-float" "f_dec_fl.htm") - ("integer-length" "f_intege.htm") - ("integerp" "f_inte_1.htm") - ("interactive-stream-p" "f_intera.htm") - ("intern" "f_intern.htm") - ("internal-time-units-per-second" "v_intern.htm") - ("intersection" "f_isec_.htm") - ("invalid-method-error" "f_invali.htm") - ("invoke-debugger" "f_invoke.htm") - ("invoke-restart" "f_invo_1.htm") - ("invoke-restart-interactively" "f_invo_2.htm") - ("isqrt" "f_sqrt_.htm") - ("keyword" "t_kwd.htm") - ("keywordp" "f_kwdp.htm") - ("labels" "s_flet_.htm") - ("lambda" "a_lambda.htm") - ("lambda-list-keywords" "v_lambda.htm") - ("lambda-parameters-limit" "v_lamb_1.htm") - ("last" "f_last.htm") - ("lcm" "f_lcm.htm") - ("ldb" "f_ldb.htm") - ("ldb-test" "f_ldb_te.htm") - ("ldiff" "f_ldiffc.htm") - ("least-negative-double-float" "v_most_1.htm") - ("least-negative-long-float" "v_most_1.htm") - ("least-negative-normalized-double-float" "v_most_1.htm") - ("least-negative-normalized-long-float" "v_most_1.htm") - ("least-negative-normalized-short-float" "v_most_1.htm") - ("least-negative-normalized-single-float" "v_most_1.htm") - ("least-negative-short-float" "v_most_1.htm") - ("least-negative-single-float" "v_most_1.htm") - ("least-positive-double-float" "v_most_1.htm") - ("least-positive-long-float" "v_most_1.htm") - ("least-positive-normalized-double-float" "v_most_1.htm") - ("least-positive-normalized-long-float" "v_most_1.htm") - ("least-positive-normalized-short-float" "v_most_1.htm") - ("least-positive-normalized-single-float" "v_most_1.htm") - ("least-positive-short-float" "v_most_1.htm") - ("least-positive-single-float" "v_most_1.htm") - ("length" "f_length.htm") - ("let" "s_let_l.htm") - ("let*" "s_let_l.htm") - ("lisp-implementation-type" "f_lisp_i.htm") - ("lisp-implementation-version" "f_lisp_i.htm") - ("list" "a_list.htm") - ("list*" "f_list_.htm") - ("list-all-packages" "f_list_a.htm") - ("list-length" "f_list_l.htm") - ("listen" "f_listen.htm") - ("listp" "f_listp.htm") - ("load" "f_load.htm") - ("load-logical-pathname-translations" "f_ld_log.htm") - ("load-time-value" "s_ld_tim.htm") - ("locally" "s_locall.htm") - ("log" "f_log.htm") - ("logand" "f_logand.htm") - ("logandc1" "f_logand.htm") - ("logandc2" "f_logand.htm") - ("logbitp" "f_logbtp.htm") - ("logcount" "f_logcou.htm") - ("logeqv" "f_logand.htm") - ("logical-pathname" "a_logica.htm") - ("logical-pathname-translations" "f_logica.htm") - ("logior" "f_logand.htm") - ("lognand" "f_logand.htm") - ("lognor" "f_logand.htm") - ("lognot" "f_logand.htm") - ("logorc1" "f_logand.htm") - ("logorc2" "f_logand.htm") - ("logtest" "f_logtes.htm") - ("logxor" "f_logand.htm") - ("long-float" "t_short_.htm") - ("long-float-epsilon" "v_short_.htm") - ("long-float-negative-epsilon" "v_short_.htm") - ("long-site-name" "f_short_.htm") - ("loop" "m_loop.htm") - ("loop-finish" "m_loop_f.htm") - ("lower-case-p" "f_upper_.htm") - ("machine-instance" "f_mach_i.htm") - ("machine-type" "f_mach_t.htm") - ("machine-version" "f_mach_v.htm") - ("macro-function" "f_macro_.htm") - ("macroexpand" "f_mexp_.htm") - ("macroexpand-1" "f_mexp_.htm") - ("macrolet" "s_flet_.htm") - ("make-array" "f_mk_ar.htm") - ("make-broadcast-stream" "f_mk_bro.htm") - ("make-concatenated-stream" "f_mk_con.htm") - ("make-condition" "f_mk_cnd.htm") - ("make-dispatch-macro-character" "f_mk_dis.htm") - ("make-echo-stream" "f_mk_ech.htm") - ("make-hash-table" "f_mk_has.htm") - ("make-instance" "f_mk_ins.htm") - ("make-instances-obsolete" "f_mk_i_1.htm") - ("make-list" "f_mk_lis.htm") - ("make-load-form" "f_mk_ld_.htm") - ("make-load-form-saving-slots" "f_mk_l_1.htm") - ("make-method" "m_call_m.htm") - ("make-package" "f_mk_pkg.htm") - ("make-pathname" "f_mk_pn.htm") - ("make-random-state" "f_mk_rnd.htm") - ("make-sequence" "f_mk_seq.htm") - ("make-string" "f_mk_stg.htm") - ("make-string-input-stream" "f_mk_s_1.htm") - ("make-string-output-stream" "f_mk_s_2.htm") - ("make-symbol" "f_mk_sym.htm") - ("make-synonym-stream" "f_mk_syn.htm") - ("make-two-way-stream" "f_mk_two.htm") - ("makunbound" "f_makunb.htm") - ("map" "f_map.htm") - ("map-into" "f_map_in.htm") - ("mapc" "f_mapc_.htm") - ("mapcan" "f_mapc_.htm") - ("mapcar" "f_mapc_.htm") - ("mapcon" "f_mapc_.htm") - ("maphash" "f_maphas.htm") - ("mapl" "f_mapc_.htm") - ("maplist" "f_mapc_.htm") - ("mask-field" "f_mask_f.htm") - ("max" "f_max_m.htm") - ("member" "a_member.htm") - ("member-if" "f_mem_m.htm") - ("member-if-not" "f_mem_m.htm") - ("merge" "f_merge.htm") - ("merge-pathnames" "f_merge_.htm") - ("method" "t_method.htm") - ("method-combination" "a_method.htm") - ("method-combination-error" "f_meth_1.htm") - ("method-qualifiers" "f_method.htm") - ("min" "f_max_m.htm") - ("minusp" "f_minusp.htm") - ("mismatch" "f_mismat.htm") - ("mod" "a_mod.htm") - ("most-negative-double-float" "v_most_1.htm") - ("most-negative-fixnum" "v_most_p.htm") - ("most-negative-long-float" "v_most_1.htm") - ("most-negative-short-float" "v_most_1.htm") - ("most-negative-single-float" "v_most_1.htm") - ("most-positive-double-float" "v_most_1.htm") - ("most-positive-fixnum" "v_most_p.htm") - ("most-positive-long-float" "v_most_1.htm") - ("most-positive-short-float" "v_most_1.htm") - ("most-positive-single-float" "v_most_1.htm") - ("muffle-warning" "a_muffle.htm") - ("multiple-value-bind" "m_multip.htm") - ("multiple-value-call" "s_multip.htm") - ("multiple-value-list" "m_mult_1.htm") - ("multiple-value-prog1" "s_mult_1.htm") - ("multiple-value-setq" "m_mult_2.htm") - ("multiple-values-limit" "v_multip.htm") - ("name-char" "f_name_c.htm") - ("namestring" "f_namest.htm") - ("nbutlast" "f_butlas.htm") - ("nconc" "f_nconc.htm") - ("next-method-p" "f_next_m.htm") - ("nil" "a_nil.htm") - ("nintersection" "f_isec_.htm") - ("ninth" "f_firstc.htm") - ("no-applicable-method" "f_no_app.htm") - ("no-next-method" "f_no_nex.htm") - ("not" "a_not.htm") - ("notany" "f_everyc.htm") - ("notevery" "f_everyc.htm") - ("notinline" "d_inline.htm") - ("nreconc" "f_revapp.htm") - ("nreverse" "f_revers.htm") - ("nset-difference" "f_set_di.htm") - ("nset-exclusive-or" "f_set_ex.htm") - ("nstring-capitalize" "f_stg_up.htm") - ("nstring-downcase" "f_stg_up.htm") - ("nstring-upcase" "f_stg_up.htm") - ("nsublis" "f_sublis.htm") - ("nsubst" "f_substc.htm") - ("nsubst-if" "f_substc.htm") - ("nsubst-if-not" "f_substc.htm") - ("nsubstitute" "f_sbs_s.htm") - ("nsubstitute-if" "f_sbs_s.htm") - ("nsubstitute-if-not" "f_sbs_s.htm") - ("nth" "f_nth.htm") - ("nth-value" "m_nth_va.htm") - ("nthcdr" "f_nthcdr.htm") - ("null" "a_null.htm") - ("number" "t_number.htm") - ("numberp" "f_nump.htm") - ("numerator" "f_numera.htm") - ("nunion" "f_unionc.htm") - ("oddp" "f_evenpc.htm") - ("open" "f_open.htm") - ("open-stream-p" "f_open_s.htm") - ("optimize" "d_optimi.htm") - ("or" "a_or.htm") - ("otherwise" "m_case_.htm") - ("output-stream-p" "f_in_stm.htm") - ("package" "t_pkg.htm") - ("package-error" "e_pkg_er.htm") - ("package-error-package" "f_pkg_er.htm") - ("package-name" "f_pkg_na.htm") - ("package-nicknames" "f_pkg_ni.htm") - ("package-shadowing-symbols" "f_pkg_sh.htm") - ("package-use-list" "f_pkg_us.htm") - ("package-used-by-list" "f_pkg__1.htm") - ("packagep" "f_pkgp.htm") - ("pairlis" "f_pairli.htm") - ("parse-error" "e_parse_.htm") - ("parse-integer" "f_parse_.htm") - ("parse-namestring" "f_pars_1.htm") - ("pathname" "a_pn.htm") - ("pathname-device" "f_pn_hos.htm") - ("pathname-directory" "f_pn_hos.htm") - ("pathname-host" "f_pn_hos.htm") - ("pathname-match-p" "f_pn_mat.htm") - ("pathname-name" "f_pn_hos.htm") - ("pathname-type" "f_pn_hos.htm") - ("pathname-version" "f_pn_hos.htm") - ("pathnamep" "f_pnp.htm") - ("peek-char" "f_peek_c.htm") - ("phase" "f_phase.htm") - ("pi" "v_pi.htm") - ("plusp" "f_minusp.htm") - ("pop" "m_pop.htm") - ("position" "f_pos_p.htm") - ("position-if" "f_pos_p.htm") - ("position-if-not" "f_pos_p.htm") - ("pprint" "f_wr_pr.htm") - ("pprint-dispatch" "f_ppr_di.htm") - ("pprint-exit-if-list-exhausted" "m_ppr_ex.htm") - ("pprint-fill" "f_ppr_fi.htm") - ("pprint-indent" "f_ppr_in.htm") - ("pprint-linear" "f_ppr_fi.htm") - ("pprint-logical-block" "m_ppr_lo.htm") - ("pprint-newline" "f_ppr_nl.htm") - ("pprint-pop" "m_ppr_po.htm") - ("pprint-tab" "f_ppr_ta.htm") - ("pprint-tabular" "f_ppr_fi.htm") - ("prin1" "f_wr_pr.htm") - ("prin1-to-string" "f_wr_to_.htm") - ("princ" "f_wr_pr.htm") - ("princ-to-string" "f_wr_to_.htm") - ("print" "f_wr_pr.htm") - ("print-not-readable" "e_pr_not.htm") - ("print-not-readable-object" "f_pr_not.htm") - ("print-object" "f_pr_obj.htm") - ("print-unreadable-object" "m_pr_unr.htm") - ("probe-file" "f_probe_.htm") - ("proclaim" "f_procla.htm") - ("prog" "m_prog_.htm") - ("prog*" "m_prog_.htm") - ("prog1" "m_prog1c.htm") - ("prog2" "m_prog1c.htm") - ("progn" "s_progn.htm") - ("program-error" "e_progra.htm") - ("progv" "s_progv.htm") - ("provide" "f_provid.htm") - ("psetf" "m_setf_.htm") - ("psetq" "m_psetq.htm") - ("push" "m_push.htm") - ("pushnew" "m_pshnew.htm") - ("quote" "s_quote.htm") - ("random" "f_random.htm") - ("random-state" "t_rnd_st.htm") - ("random-state-p" "f_rnd_st.htm") - ("rassoc" "f_rassoc.htm") - ("rassoc-if" "f_rassoc.htm") - ("rassoc-if-not" "f_rassoc.htm") - ("ratio" "t_ratio.htm") - ("rational" "a_ration.htm") - ("rationalize" "f_ration.htm") - ("rationalp" "f_rati_1.htm") - ("read" "f_rd_rd.htm") - ("read-byte" "f_rd_by.htm") - ("read-char" "f_rd_cha.htm") - ("read-char-no-hang" "f_rd_c_1.htm") - ("read-delimited-list" "f_rd_del.htm") - ("read-from-string" "f_rd_fro.htm") - ("read-line" "f_rd_lin.htm") - ("read-preserving-whitespace" "f_rd_rd.htm") - ("read-sequence" "f_rd_seq.htm") - ("reader-error" "e_rder_e.htm") - ("readtable" "t_rdtabl.htm") - ("readtable-case" "f_rdtabl.htm") - ("readtablep" "f_rdta_1.htm") - ("real" "t_real.htm") - ("realp" "f_realp.htm") - ("realpart" "f_realpa.htm") - ("reduce" "f_reduce.htm") - ("reinitialize-instance" "f_reinit.htm") - ("rem" "f_mod_r.htm") - ("remf" "m_remf.htm") - ("remhash" "f_remhas.htm") - ("remove" "f_rm_rm.htm") - ("remove-duplicates" "f_rm_dup.htm") - ("remove-if" "f_rm_rm.htm") - ("remove-if-not" "f_rm_rm.htm") - ("remove-method" "f_rm_met.htm") - ("remprop" "f_rempro.htm") - ("rename-file" "f_rn_fil.htm") - ("rename-package" "f_rn_pkg.htm") - ("replace" "f_replac.htm") - ("require" "f_provid.htm") - ("rest" "f_rest.htm") - ("restart" "t_rst.htm") - ("restart-bind" "m_rst_bi.htm") - ("restart-case" "m_rst_ca.htm") - ("restart-name" "f_rst_na.htm") - ("return" "m_return.htm") - ("return-from" "s_ret_fr.htm") - ("revappend" "f_revapp.htm") - ("reverse" "f_revers.htm") - ("room" "f_room.htm") - ("rotatef" "m_rotate.htm") - ("round" "f_floorc.htm") - ("row-major-aref" "f_row_ma.htm") - ("rplaca" "f_rplaca.htm") - ("rplacd" "f_rplaca.htm") - ("safety" "d_optimi.htm") - ("satisfies" "t_satisf.htm") - ("sbit" "f_bt_sb.htm") - ("scale-float" "f_dec_fl.htm") - ("schar" "f_char_.htm") - ("search" "f_search.htm") - ("second" "f_firstc.htm") - ("sequence" "t_seq.htm") - ("serious-condition" "e_seriou.htm") - ("set" "f_set.htm") - ("set-difference" "f_set_di.htm") - ("set-dispatch-macro-character" "f_set__1.htm") - ("set-exclusive-or" "f_set_ex.htm") - ("set-macro-character" "f_set_ma.htm") - ("set-pprint-dispatch" "f_set_pp.htm") - ("set-syntax-from-char" "f_set_sy.htm") - ("setf" "a_setf.htm") - ("setq" "s_setq.htm") - ("seventh" "f_firstc.htm") - ("shadow" "f_shadow.htm") - ("shadowing-import" "f_shdw_i.htm") - ("shared-initialize" "f_shared.htm") - ("shiftf" "m_shiftf.htm") - ("short-float" "t_short_.htm") - ("short-float-epsilon" "v_short_.htm") - ("short-float-negative-epsilon" "v_short_.htm") - ("short-site-name" "f_short_.htm") - ("signal" "f_signal.htm") - ("signed-byte" "t_sgn_by.htm") - ("signum" "f_signum.htm") - ("simple-array" "t_smp_ar.htm") - ("simple-base-string" "t_smp_ba.htm") - ("simple-bit-vector" "t_smp_bt.htm") - ("simple-bit-vector-p" "f_smp_bt.htm") - ("simple-condition" "e_smp_cn.htm") - ("simple-condition-format-arguments" "f_smp_cn.htm") - ("simple-condition-format-control" "f_smp_cn.htm") - ("simple-error" "e_smp_er.htm") - ("simple-string" "t_smp_st.htm") - ("simple-string-p" "f_smp_st.htm") - ("simple-type-error" "e_smp_tp.htm") - ("simple-vector" "t_smp_ve.htm") - ("simple-vector-p" "f_smp_ve.htm") - ("simple-warning" "e_smp_wa.htm") - ("sin" "f_sin_c.htm") - ("single-float" "t_short_.htm") - ("single-float-epsilon" "v_short_.htm") - ("single-float-negative-epsilon" "v_short_.htm") - ("sinh" "f_sinh_.htm") - ("sixth" "f_firstc.htm") - ("sleep" "f_sleep.htm") - ("slot-boundp" "f_slt_bo.htm") - ("slot-exists-p" "f_slt_ex.htm") - ("slot-makunbound" "f_slt_ma.htm") - ("slot-missing" "f_slt_mi.htm") - ("slot-unbound" "f_slt_un.htm") - ("slot-value" "f_slt_va.htm") - ("software-type" "f_sw_tpc.htm") - ("software-version" "f_sw_tpc.htm") - ("some" "f_everyc.htm") - ("sort" "f_sort_.htm") - ("space" "d_optimi.htm") - ("special" "d_specia.htm") - ("special-operator-p" "f_specia.htm") - ("speed" "d_optimi.htm") - ("sqrt" "f_sqrt_.htm") - ("stable-sort" "f_sort_.htm") - ("standard" "07_ffb.htm") - ("standard-char" "t_std_ch.htm") - ("standard-char-p" "f_std_ch.htm") - ("standard-class" "t_std_cl.htm") - ("standard-generic-function" "t_std_ge.htm") - ("standard-method" "t_std_me.htm") - ("standard-object" "t_std_ob.htm") - ("step" "m_step.htm") - ("storage-condition" "e_storag.htm") - ("store-value" "a_store_.htm") - ("stream" "t_stream.htm") - ("stream-element-type" "f_stm_el.htm") - ("stream-error" "e_stm_er.htm") - ("stream-error-stream" "f_stm_er.htm") - ("stream-external-format" "f_stm_ex.htm") - ("streamp" "f_stmp.htm") - ("string" "a_string.htm") - ("string-capitalize" "f_stg_up.htm") - ("string-downcase" "f_stg_up.htm") - ("string-equal" "f_stgeq_.htm") - ("string-greaterp" "f_stgeq_.htm") - ("string-left-trim" "f_stg_tr.htm") - ("string-lessp" "f_stgeq_.htm") - ("string-not-equal" "f_stgeq_.htm") - ("string-not-greaterp" "f_stgeq_.htm") - ("string-not-lessp" "f_stgeq_.htm") - ("string-right-trim" "f_stg_tr.htm") - ("string-stream" "t_stg_st.htm") - ("string-trim" "f_stg_tr.htm") - ("string-upcase" "f_stg_up.htm") - ("string/=" "f_stgeq_.htm") - ("string<" "f_stgeq_.htm") - ("string<=" "f_stgeq_.htm") - ("string=" "f_stgeq_.htm") - ("string>" "f_stgeq_.htm") - ("string>=" "f_stgeq_.htm") - ("stringp" "f_stgp.htm") - ("structure" "f_docume.htm") - ("structure-class" "t_stu_cl.htm") - ("structure-object" "t_stu_ob.htm") - ("style-warning" "e_style_.htm") - ("sublis" "f_sublis.htm") - ("subseq" "f_subseq.htm") - ("subsetp" "f_subset.htm") - ("subst" "f_substc.htm") - ("subst-if" "f_substc.htm") - ("subst-if-not" "f_substc.htm") - ("substitute" "f_sbs_s.htm") - ("substitute-if" "f_sbs_s.htm") - ("substitute-if-not" "f_sbs_s.htm") - ("subtypep" "f_subtpp.htm") - ("svref" "f_svref.htm") - ("sxhash" "f_sxhash.htm") - ("symbol" "t_symbol.htm") - ("symbol-function" "f_symb_1.htm") - ("symbol-macrolet" "s_symbol.htm") - ("symbol-name" "f_symb_2.htm") - ("symbol-package" "f_symb_3.htm") - ("symbol-plist" "f_symb_4.htm") - ("symbol-value" "f_symb_5.htm") - ("symbolp" "f_symbol.htm") - ("synonym-stream" "t_syn_st.htm") - ("synonym-stream-symbol" "f_syn_st.htm") - ("t" "a_t.htm") - ("tagbody" "s_tagbod.htm") - ("tailp" "f_ldiffc.htm") - ("tan" "f_sin_c.htm") - ("tanh" "f_sinh_.htm") - ("tenth" "f_firstc.htm") - ("terpri" "f_terpri.htm") - ("the" "s_the.htm") - ("third" "f_firstc.htm") - ("throw" "s_throw.htm") - ("time" "m_time.htm") - ("trace" "m_tracec.htm") - ("translate-logical-pathname" "f_tr_log.htm") - ("translate-pathname" "f_tr_pn.htm") - ("tree-equal" "f_tree_e.htm") - ("truename" "f_tn.htm") - ("truncate" "f_floorc.htm") - ("two-way-stream" "t_two_wa.htm") - ("two-way-stream-input-stream" "f_two_wa.htm") - ("two-way-stream-output-stream" "f_two_wa.htm") - ("type" "a_type.htm") - ("type-error" "e_tp_err.htm") - ("type-error-datum" "f_tp_err.htm") - ("type-error-expected-type" "f_tp_err.htm") - ("type-of" "f_tp_of.htm") - ("typecase" "m_tpcase.htm") - ("typep" "f_typep.htm") - ("unbound-slot" "e_unboun.htm") - ("unbound-slot-instance" "f_unboun.htm") - ("unbound-variable" "e_unbo_1.htm") - ("undefined-function" "e_undefi.htm") - ("unexport" "f_unexpo.htm") - ("unintern" "f_uninte.htm") - ("union" "f_unionc.htm") - ("unless" "m_when_.htm") - ("unread-char" "f_unrd_c.htm") - ("unsigned-byte" "t_unsgn_.htm") - ("untrace" "m_tracec.htm") - ("unuse-package" "f_unuse_.htm") - ("unwind-protect" "s_unwind.htm") - ("update-instance-for-different-class" "f_update.htm") - ("update-instance-for-redefined-class" "f_upda_1.htm") - ("upgraded-array-element-type" "f_upgr_1.htm") - ("upgraded-complex-part-type" "f_upgrad.htm") - ("upper-case-p" "f_upper_.htm") - ("use-package" "f_use_pk.htm") - ("use-value" "a_use_va.htm") - ("user-homedir-pathname" "f_user_h.htm") - ("values" "a_values.htm") - ("values-list" "f_vals_l.htm") - ("variable" "f_docume.htm") - ("vector" "a_vector.htm") - ("vector-pop" "f_vec_po.htm") - ("vector-push" "f_vec_ps.htm") - ("vector-push-extend" "f_vec_ps.htm") - ("vectorp" "f_vecp.htm") - ("warn" "f_warn.htm") - ("warning" "e_warnin.htm") - ("when" "m_when_.htm") - ("wild-pathname-p" "f_wild_p.htm") - ("with-accessors" "m_w_acce.htm") - ("with-compilation-unit" "m_w_comp.htm") - ("with-condition-restarts" "m_w_cnd_.htm") - ("with-hash-table-iterator" "m_w_hash.htm") - ("with-input-from-string" "m_w_in_f.htm") - ("with-open-file" "m_w_open.htm") - ("with-open-stream" "m_w_op_1.htm") - ("with-output-to-string" "m_w_out_.htm") - ("with-package-iterator" "m_w_pkg_.htm") - ("with-simple-restart" "m_w_smp_.htm") - ("with-slots" "m_w_slts.htm") - ("with-standard-io-syntax" "m_w_std_.htm") - ("write" "f_wr_pr.htm") - ("write-byte" "f_wr_by.htm") - ("write-char" "f_wr_cha.htm") - ("write-line" "f_wr_stg.htm") - ("write-sequence" "f_wr_seq.htm") - ("write-string" "f_wr_stg.htm") - ("write-to-string" "f_wr_to_.htm") - ("y-or-n-p" "f_y_or_n.htm") - ("yes-or-no-p" "f_y_or_n.htm") - ("zerop" "f_zerop.htm")))) - -;;; Added entries for reader macros. -;;; -;;; 20090302 Tobias C Rittweiler, and Stas Boukarev - -(defvar common-lisp-hyperspec--reader-macros (make-hash-table :test #'equal)) - -;;; Data/Map_Sym.txt in does not contain entries for the reader -;;; macros. So we have to enumerate these explicitly. -(mapc (lambda (entry) - (puthash (car entry) (cadr entry) - common-lisp-hyperspec--reader-macros)) - '(("#" "02_dh.htm") - ("##" "02_dhp.htm") - ("#'" "02_dhb.htm") - ("#(" "02_dhc.htm") - ("#*" "02_dhd.htm") - ("#:" "02_dhe.htm") - ("#." "02_dhf.htm") - ("#=" "02_dho.htm") - ("#+" "02_dhq.htm") - ("#-" "02_dhr.htm") - ("#<" "02_dht.htm") - ("#A" "02_dhl.htm") - ("#B" "02_dhg.htm") - ("#C" "02_dhk.htm") - ("#O" "02_dhh.htm") - ("#P" "02_dhn.htm") - ("#R" "02_dhj.htm") - ("#S" "02_dhm.htm") - ("#X" "02_dhi.htm") - ("#\\" "02_dha.htm") - ("#|" "02_dhs.htm") - ("\"" "02_de.htm") - ("'" "02_dc.htm") - ("`" "02_df.htm") - ("," "02_dg.htm") - ("(" "02_da.htm") - (")" "02_db.htm") - (";" "02_dd.htm"))) - -(defun common-lisp-hyperspec-lookup-reader-macro (macro) - "Browse the CLHS entry for the reader-macro MACRO." - (interactive - (list - (let ((completion-ignore-case t)) - (completing-read "Look up reader-macro: " - common-lisp-hyperspec--reader-macros nil t - (common-lisp-hyperspec-reader-macro-at-point))))) - (browse-url - (concat common-lisp-hyperspec-root "Body/" - (gethash macro common-lisp-hyperspec--reader-macros)))) - -(defun common-lisp-hyperspec-reader-macro-at-point () - (let ((regexp "\\(#.?\\)\\|\\([\"',`';()]\\)")) - (when (looking-back regexp nil t) - (match-string-no-properties 0)))) - -;;; FORMAT character lookup by Frode Vatvedt Fjeld 20030902 -;;; -;;; adjusted for ILISP by Nikodemus Siivola 20030903 - -(defvar common-lisp-hyperspec-format-history nil - "History of format characters looked up in the Common Lisp HyperSpec.") - -(defun common-lisp-hyperspec-section-6.0 (indices) - (let ((string (format "%sBody/%s_" - common-lisp-hyperspec-root - (let ((base (pop indices))) - (if (< base 10) - (format "0%s" base) - base))))) - (concat string - (mapconcat (lambda (n) - (make-string 1 (+ ?a (- n 1)))) - indices - "") - ".htm"))) - -(defun common-lisp-hyperspec-section-4.0 (indices) - (let ((string (format "%sBody/sec_" - common-lisp-hyperspec-root))) - (concat string - (mapconcat (lambda (n) - (format "%d" n)) - indices - "-") - ".html"))) - -(defvar common-lisp-hyperspec-section-fun 'common-lisp-hyperspec-section-6.0) - -(defun common-lisp-hyperspec-section (indices) - (funcall common-lisp-hyperspec-section-fun indices)) - -(defvar common-lisp-hyperspec--format-characters - (make-hash-table :test 'equal)) - -(defun common-lisp-hyperspec--read-format-character () - (let ((char-at-point - (ignore-errors (char-to-string (char-after (point)))))) - (if (and char-at-point - (gethash (upcase char-at-point) - common-lisp-hyperspec--format-characters)) - char-at-point - (completing-read - "Look up format control character in Common Lisp HyperSpec: " - common-lisp-hyperspec--format-characters nil t nil - 'common-lisp-hyperspec-format-history)))) - -(defun common-lisp-hyperspec-format (character-name) - (interactive (list (common-lisp-hyperspec--read-format-character))) - (cl-maplist (lambda (entry) - (browse-url (common-lisp-hyperspec-section (car entry)))) - (or (gethash character-name - common-lisp-hyperspec--format-characters) - (error "The symbol `%s' is not defined in Common Lisp" - character-name)))) - -;;; Previously there were entries for "C" and "C: Character", -;;; which unpleasingly crowded the completion buffer, so I made -;;; it show one entry ("C - Character") only. -;;; -;;; 20100131 Tobias C Rittweiler - -(defun common-lisp-hyperspec--insert-format-directive (char section - &optional summary) - (let* ((designator (if summary (format "%s - %s" char summary) char))) - (cl-pushnew section (gethash designator - common-lisp-hyperspec--format-characters) - :test #'equal))) - -(mapc (lambda (entry) - (cl-destructuring-bind (char section &optional summary) entry - (common-lisp-hyperspec--insert-format-directive char section summary) - (when (and (= 1 (length char)) - (not (string-equal char (upcase char)))) - (common-lisp-hyperspec--insert-format-directive - (upcase char) section summary)))) - '(("c" (22 3 1 1) "Character") - ("%" (22 3 1 2) "Newline") - ("&" (22 3 1 3) "Fresh-line") - ("|" (22 3 1 4) "Page") - ("~" (22 3 1 5) "Tilde") - ("r" (22 3 2 1) "Radix") - ("d" (22 3 2 2) "Decimal") - ("b" (22 3 2 3) "Binary") - ("o" (22 3 2 4) "Octal") - ("x" (22 3 2 5) "Hexadecimal") - ("f" (22 3 3 1) "Fixed-Format Floating-Point") - ("e" (22 3 3 2) "Exponential Floating-Point") - ("g" (22 3 3 3) "General Floating-Point") - ("$" (22 3 3 4) "Monetary Floating-Point") - ("a" (22 3 4 1) "Aesthetic") - ("s" (22 3 4 2) "Standard") - ("w" (22 3 4 3) "Write") - ("_" (22 3 5 1) "Conditional Newline") - ("<" (22 3 5 2) "Logical Block") - ("i" (22 3 5 3) "Indent") - ("/" (22 3 5 4) "Call Function") - ("t" (22 3 6 1) "Tabulate") - ("<" (22 3 6 2) "Justification") - (">" (22 3 6 3) "End of Justification") - ("*" (22 3 7 1) "Go-To") - ("[" (22 3 7 2) "Conditional Expression") - ("]" (22 3 7 3) "End of Conditional Expression") - ("{" (22 3 7 4) "Iteration") - ("}" (22 3 7 5) "End of Iteration") - ("?" (22 3 7 6) "Recursive Processing") - ("(" (22 3 8 1) "Case Conversion") - (")" (22 3 8 2) "End of Case Conversion") - ("p" (22 3 8 3) "Plural") - (";" (22 3 9 1) "Clause Separator") - ("^" (22 3 9 2) "Escape Upward") - ("Newline: Ignored Newline" (22 3 9 3)) - ("Nesting of FORMAT Operations" (22 3 10 1)) - ("Missing and Additional FORMAT Arguments" (22 3 10 2)) - ("Additional FORMAT Parameters" (22 3 10 3)))) - - -;;;; Glossary - -(defvar common-lisp-hyperspec-glossary-function 'common-lisp-glossary-6.0 - "Function that creates a URL for a glossary term.") - -(define-obsolete-variable-alias 'common-lisp-glossary-fun - 'common-lisp-hyperspec-glossary-function) - -(defvar common-lisp-hyperspec--glossary-terms (make-hash-table :test #'equal) - "Collection of glossary terms and relative URLs.") - -;;; Functions - -;;; The functions below are used to collect glossary terms and page anchors -;;; from CLHS. They are commented out because they are not needed unless the -;;; list of terms/anchors need to be updated. - -;; (defun common-lisp-hyperspec-glossary-pages () -;; "List of CLHS glossary pages." -;; (mapcar (lambda (end) -;; (format "%sBody/26_glo_%s.htm" -;; common-lisp-hyperspec-root -;; end)) -;; (cons "9" (mapcar #'char-to-string -;; (number-sequence ?a ?z))))) - -;; (defun common-lisp-hyperspec-glossary-download () -;; "Download CLHS glossary pages to temporary files and return a -;; list of file names." -;; (mapcar (lambda (url) -;; (url-file-local-copy url)) -;; (common-lisp-hyperspec-glossary-pages))) - -;; (defun common-lisp-hyperspec-glossary-entries (file) -;; "Given a CLHS glossary file FILE, return a list of -;; term-anchor pairs. - -;; Term is the glossary term and anchor is the term's anchor on the -;; page." -;; (let (entries) -;; (save-excursion -;; (set-buffer (find-file-noselect file)) -;; (goto-char (point-min)) -;; (while (search-forward-regexp "\\(.*?\\)" nil t) -;; (setq entries (cons (list (match-string-no-properties 2) -;; (match-string-no-properties 1)) -;; entries)))) -;; (sort entries (lambda (a b) -;; (string< (car a) (car b)))))) - -;; ;; Add glossary terms by downloading and parsing glossary pages from CLHS -;; (mapc (lambda (entry) -;; (puthash (car entry) (cadr entry) -;; common-lisp-hyperspec--glossary-terms)) -;; (cl-reduce (lambda (a b) -;; (append a b)) -;; (mapcar #'common-lisp-hyperspec-glossary-entries -;; (common-lisp-hyperspec-glossary-download)))) - -;; Add glossary entries to the master hash table -(mapc (lambda (entry) - (puthash (car entry) (cadr entry) - common-lisp-hyperspec--glossary-terms)) - '(("()" "OPCP") - ("absolute" "absolute") - ("access" "access") - ("accessibility" "accessibility") - ("accessible" "accessible") - ("accessor" "accessor") - ("active" "active") - ("actual adjustability" "actual_adjustability") - ("actual argument" "actual_argument") - ("actual array element type" "actual_array_element_type") - ("actual complex part type" "actual_complex_part_type") - ("actual parameter" "actual_parameter") - ("actually adjustable" "actually_adjustable") - ("adjustability" "adjustability") - ("adjustable" "adjustable") - ("after method" "after_method") - ("alist" "alist") - ("alphabetic" "alphabetic") - ("alphanumeric" "alphanumeric") - ("ampersand" "ampersand") - ("anonymous" "anonymous") - ("apparently uninterned" "apparently_uninterned") - ("applicable" "applicable") - ("applicable handler" "applicable_handler") - ("applicable method" "applicable_method") - ("applicable restart" "applicable_restart") - ("apply" "apply") - ("argument" "argument") - ("argument evaluation order" "argument_evaluation_order") - ("argument precedence order" "argument_precedence_order") - ("around method" "around_method") - ("array" "array") - ("array element type" "array_element_type") - ("array total size" "array_total_size") - ("assign" "assign") - ("association list" "association_list") - ("asterisk" "asterisk") - ("at-sign" "at-sign") - ("atom" "atom") - ("atomic" "atomic") - ("atomic type specifier" "atomic_type_specifier") - ("attribute" "attribute") - ("aux variable" "aux_variable") - ("auxiliary method" "auxiliary_method") - ("backquote" "backquote") - ("backslash" "backslash") - ("base character" "base_character") - ("base string" "base_string") - ("before method" "before_method") - ("bidirectional" "bidirectional") - ("binary" "binary") - ("bind" "bind") - ("binding" "binding") - ("bit" "bit") - ("bit array" "bit_array") - ("bit vector" "bit_vector") - ("bit-wise logical operation specifier" "bit-wise_logical_operation_specifier") - ("block" "block") - ("block tag" "block_tag") - ("boa lambda list" "boa_lambda_list") - ("body parameter" "body_parameter") - ("boolean" "boolean") - ("boolean equivalent" "boolean_equivalent") - ("bound" "bound") - ("bound declaration" "bound_declaration") - ("bounded" "bounded") - ("bounding index" "bounding_index") - ("bounding index designator" "bounding_index_designator") - ("break loop" "break_loop") - ("broadcast stream" "broadcast_stream") - ("built-in class" "built-in_class") - ("built-in type" "built-in_type") - ("byte" "byte") - ("byte specifier" "byte_specifier") - ("cadr" "cadr") - ("call" "call") - ("captured initialization form" "captured_initialization_form") - ("car" "car") - ("case" "case") - ("case sensitivity mode" "case_sensitivity_mode") - ("catch" "catch") - ("catch tag" "catch_tag") - ("cddr" "cddr") - ("cdr" "cdr") - ("cell" "cell") - ("character" "character") - ("character code" "character_code") - ("character designator" "character_designator") - ("circular" "circular") - ("circular list" "circular_list") - ("class" "class") - ("class designator" "class_designator") - ("class precedence list" "class_precedence_list") - ("close" "close") - ("closed" "closed") - ("closure" "closure") - ("coalesce" "coalesce") - ("code" "code") - ("coerce" "coerce") - ("colon" "colon") - ("comma" "comma") - ("compilation" "compilation") - ("compilation environment" "compilation_environment") - ("compilation unit" "compilation_unit") - ("compile" "compile") - ("compile time" "compile_time") - ("compile-time definition" "compile-time_definition") - ("compiled code" "compiled_code") - ("compiled file" "compiled_file") - ("compiled function" "compiled_function") - ("compiler" "compiler") - ("compiler macro" "compiler_macro") - ("compiler macro expansion" "compiler_macro_expansion") - ("compiler macro form" "compiler_macro_form") - ("compiler macro function" "compiler_macro_function") - ("complex" "complex") - ("complex float" "complex_float") - ("complex part type" "complex_part_type") - ("complex rational" "complex_rational") - ("complex single float" "complex_single_float") - ("composite stream" "composite_stream") - ("compound form" "compound_form") - ("compound type specifier" "compound_type_specifier") - ("concatenated stream" "concatenated_stream") - ("condition" "condition") - ("condition designator" "condition_designator") - ("condition handler" "condition_handler") - ("condition reporter" "condition_reporter") - ("conditional newline" "conditional_newline") - ("conformance" "conformance") - ("conforming code" "conforming_code") - ("conforming implementation" "conforming_implementation") - ("conforming processor" "conforming_processor") - ("conforming program" "conforming_program") - ("congruent" "congruent") - ("cons" "cons") - ("constant" "constant") - ("constant form" "constant_form") - ("constant object" "constant_object") - ("constant variable" "constant_variable") - ("constituent" "constituent") - ("constituent trait" "constituent_trait") - ("constructed stream" "constructed_stream") - ("contagion" "contagion") - ("continuable" "continuable") - ("control form" "control_form") - ("copy" "copy") - ("correctable" "correctable") - ("current input base" "current_input_base") - ("current logical block" "current_logical_block") - ("current output base" "current_output_base") - ("current package" "current_package") - ("current pprint dispatch table" "current_pprint_dispatch_table") - ("current random state" "current_random_state") - ("current readtable" "current_readtable") - ("data type" "data_type") - ("debug I/O" "debug_iSLo") - ("debugger" "debugger") - ("declaration" "declaration") - ("declaration identifier" "declaration_identifier") - ("declaration specifier" "declaration_specifier") - ("declare" "declare") - ("decline" "decline") - ("decoded time" "decoded_time") - ("default method" "default_method") - ("defaulted initialization argument list" "defaulted_initialization_argument_list") - ("define-method-combination arguments lambda list" "define-method-combination_arguments_lambda_list") - ("define-modify-macro lambda list" "define-modify-macro_lambda_list") - ("defined name" "defined_name") - ("defining form" "defining_form") - ("defsetf lambda list" "defsetf_lambda_list") - ("deftype lambda list" "deftype_lambda_list") - ("denormalized" "denormalized") - ("derived type" "derived_type") - ("derived type specifier" "derived_type_specifier") - ("designator" "designator") - ("destructive" "destructive") - ("destructuring lambda list" "destructuring_lambda_list") - ("different" "different") - ("digit" "digit") - ("dimension" "dimension") - ("direct instance" "direct_instance") - ("direct subclass" "direct_subclass") - ("direct superclass" "direct_superclass") - ("disestablish" "disestablish") - ("disjoint" "disjoint") - ("dispatching macro character" "dispatching_macro_character") - ("displaced array" "displaced_array") - ("distinct" "distinct") - ("documentation string" "documentation_string") - ("dot" "dot") - ("dotted list" "dotted_list") - ("dotted pair" "dotted_pair") - ("double float" "double_float") - ("double-quote" "double-quote") - ("dynamic binding" "dynamic_binding") - ("dynamic environment" "dynamic_environment") - ("dynamic extent" "dynamic_extent") - ("dynamic scope" "dynamic_scope") - ("dynamic variable" "dynamic_variable") - ("echo stream" "echo_stream") - ("effective method" "effective_method") - ("element" "element") - ("element type" "element_type") - ("em" "em") - ("empty list" "empty_list") - ("empty type" "empty_type") - ("end of file" "end_of_file") - ("environment" "environment") - ("environment object" "environment_object") - ("environment parameter" "environment_parameter") - ("error" "error") - ("error output" "error_output") - ("escape" "escape") - ("establish" "establish") - ("evaluate" "evaluate") - ("evaluation" "evaluation") - ("evaluation environment" "evaluation_environment") - ("execute" "execute") - ("execution time" "execution_time") - ("exhaustive partition" "exhaustive_partition") - ("exhaustive union" "exhaustive_union") - ("exit point" "exit_point") - ("explicit return" "explicit_return") - ("explicit use" "explicit_use") - ("exponent marker" "exponent_marker") - ("export" "export") - ("exported" "exported") - ("expressed adjustability" "expressed_adjustability") - ("expressed array element type" "expressed_array_element_type") - ("expressed complex part type" "expressed_complex_part_type") - ("expression" "expression") - ("expressly adjustable" "expressly_adjustable") - ("extended character" "extended_character") - ("extended function designator" "extended_function_designator") - ("extended lambda list" "extended_lambda_list") - ("extension" "extension") - ("extent" "extent") - ("external file format" "external_file_format") - ("external file format designator" "external_file_format_designator") - ("external symbol" "external_symbol") - ("externalizable object" "externalizable_object") - ("false" "false") - ("fbound" "fbound") - ("feature" "feature") - ("feature expression" "feature_expression") - ("features list" "features_list") - ("file" "file") - ("file compiler" "file_compiler") - ("file position" "file_position") - ("file position designator" "file_position_designator") - ("file stream" "file_stream") - ("file system" "file_system") - ("filename" "filename") - ("fill pointer" "fill_pointer") - ("finite" "finite") - ("fixnum" "fixnum") - ("float" "float") - ("for-value" "for-value") - ("form" "form") - ("formal argument" "formal_argument") - ("formal parameter" "formal_parameter") - ("format" "format") - ("format argument" "format_argument") - ("format control" "format_control") - ("format directive" "format_directive") - ("format string" "format_string") - ("free declaration" "free_declaration") - ("fresh" "fresh") - ("freshline" "freshline") - ("funbound" "funbound") - ("function" "function") - ("function block name" "function_block_name") - ("function cell" "function_cell") - ("function designator" "function_designator") - ("function form" "function_form") - ("function name" "function_name") - ("functional evaluation" "functional_evaluation") - ("functional value" "functional_value") - ("further compilation" "further_compilation") - ("general" "general") - ("generalized boolean" "generalized_boolean") - ("generalized instance" "generalized_instance") - ("generalized reference" "generalized_reference") - ("generalized synonym stream" "generalized_synonym_stream") - ("generic function" "generic_function") - ("generic function lambda list" "generic_function_lambda_list") - ("gensym" "gensym") - ("global declaration" "global_declaration") - ("global environment" "global_environment") - ("global variable" "global_variable") - ("glyph" "glyph") - ("go" "go") - ("go point" "go_point") - ("go tag" "go_tag") - ("graphic" "graphic") - ("handle" "handle") - ("handler" "handler") - ("hash table" "hash_table") - ("home package" "home_package") - ("I/O customization variable" "iSLo_customization_variable") - ("identical" "identical") - ("identifier" "identifier") - ("immutable" "immutable") - ("implementation" "implementation") - ("implementation limit" "implementation_limit") - ("implementation-defined" "implementation-defined") - ("implementation-dependent" "implementation-dependent") - ("implementation-independent" "implementation-independent") - ("implicit block" "implicit_block") - ("implicit compilation" "implicit_compilation") - ("implicit progn" "implicit_progn") - ("implicit tagbody" "implicit_tagbody") - ("import" "import") - ("improper list" "improper_list") - ("inaccessible" "inaccessible") - ("indefinite extent" "indefinite_extent") - ("indefinite scope" "indefinite_scope") - ("indicator" "indicator") - ("indirect instance" "indirect_instance") - ("inherit" "inherit") - ("initial pprint dispatch table" "initial_pprint_dispatch_table") - ("initial readtable" "initial_readtable") - ("initialization argument list" "initialization_argument_list") - ("initialization form" "initialization_form") - ("input" "input") - ("instance" "instance") - ("integer" "integer") - ("interactive stream" "interactive_stream") - ("intern" "intern") - ("internal symbol" "internal_symbol") - ("internal time" "internal_time") - ("internal time unit" "internal_time_unit") - ("interned" "interned") - ("interpreted function" "interpreted_function") - ("interpreted implementation" "interpreted_implementation") - ("interval designator" "interval_designator") - ("invalid" "invalid") - ("iteration form" "iteration_form") - ("iteration variable" "iteration_variable") - ("key" "key") - ("keyword" "keyword") - ("keyword parameter" "keyword_parameter") - ("keyword/value pair" "keywordSLvalue_pair") - ("Lisp image" "lisp_image") - ("Lisp printer" "lisp_printer") - ("Lisp read-eval-print loop" "lisp_read-eval-print_loop") - ("Lisp reader" "lisp_reader") - ("lambda combination" "lambda_combination") - ("lambda expression" "lambda_expression") - ("lambda form" "lambda_form") - ("lambda list" "lambda_list") - ("lambda list keyword" "lambda_list_keyword") - ("lambda variable" "lambda_variable") - ("leaf" "leaf") - ("leap seconds" "leap_seconds") - ("left-parenthesis" "left-parenthesis") - ("length" "length") - ("lexical binding" "lexical_binding") - ("lexical closure" "lexical_closure") - ("lexical environment" "lexical_environment") - ("lexical scope" "lexical_scope") - ("lexical variable" "lexical_variable") - ("list" "list") - ("list designator" "list_designator") - ("list structure" "list_structure") - ("literal" "literal") - ("load" "load") - ("load time" "load_time") - ("load time value" "load_time_value") - ("loader" "loader") - ("local declaration" "local_declaration") - ("local precedence order" "local_precedence_order") - ("local slot" "local_slot") - ("logical block" "logical_block") - ("logical host" "logical_host") - ("logical host designator" "logical_host_designator") - ("logical pathname" "logical_pathname") - ("long float" "long_float") - ("loop keyword" "loop_keyword") - ("lowercase" "lowercase") - ("Metaobject Protocol" "metaobject_protocol") - ("macro" "macro") - ("macro character" "macro_character") - ("macro expansion" "macro_expansion") - ("macro form" "macro_form") - ("macro function" "macro_function") - ("macro lambda list" "macro_lambda_list") - ("macro name" "macro_name") - ("macroexpand hook" "macroexpand_hook") - ("mapping" "mapping") - ("metaclass" "metaclass") - ("method" "method") - ("method combination" "method_combination") - ("method-defining form" "method-defining_form") - ("method-defining operator" "method-defining_operator") - ("minimal compilation" "minimal_compilation") - ("modified lambda list" "modified_lambda_list") - ("most recent" "most_recent") - ("multiple escape" "multiple_escape") - ("multiple values" "multiple_values") - ("name" "name") - ("named constant" "named_constant") - ("namespace" "namespace") - ("namestring" "namestring") - ("newline" "newline") - ("next method" "next_method") - ("nickname" "nickname") - ("nil" "nil") - ("non-atomic" "non-atomic") - ("non-constant variable" "non-constant_variable") - ("non-correctable" "non-correctable") - ("non-empty" "non-empty") - ("non-generic function" "non-generic_function") - ("non-graphic" "non-graphic") - ("non-list" "non-list") - ("non-local exit" "non-local_exit") - ("non-nil" "non-nil") - ("non-null lexical environment" "non-null_lexical_environment") - ("non-simple" "non-simple") - ("non-terminating" "non-terminating") - ("non-top-level form" "non-top-level_form") - ("normal return" "normal_return") - ("normalized" "normalized") - ("null" "null") - ("null lexical environment" "null_lexical_environment") - ("number" "number") - ("numeric" "numeric") - ("object" "object") - ("object-traversing" "object-traversing") - ("open" "open") - ("operator" "operator") - ("optimize quality" "optimize_quality") - ("optional parameter" "optional_parameter") - ("ordinary function" "ordinary_function") - ("ordinary lambda list" "ordinary_lambda_list") - ("otherwise inaccessible part" "otherwise_inaccessible_part") - ("output" "output") - ("package" "package") - ("package cell" "package_cell") - ("package designator" "package_designator") - ("package marker" "package_marker") - ("package prefix" "package_prefix") - ("package registry" "package_registry") - ("pairwise" "pairwise") - ("parallel" "parallel") - ("parameter" "parameter") - ("parameter specializer" "parameter_specializer") - ("parameter specializer name" "parameter_specializer_name") - ("pathname" "pathname") - ("pathname designator" "pathname_designator") - ("physical pathname" "physical_pathname") - ("place" "place") - ("plist" "plist") - ("portable" "portable") - ("potential copy" "potential_copy") - ("potential number" "potential_number") - ("pprint dispatch table" "pprint_dispatch_table") - ("predicate" "predicate") - ("present" "present") - ("pretty print" "pretty_print") - ("pretty printer" "pretty_printer") - ("pretty printing stream" "pretty_printing_stream") - ("primary method" "primary_method") - ("primary value" "primary_value") - ("principal" "principal") - ("print name" "print_name") - ("printer control variable" "printer_control_variable") - ("printer escaping" "printer_escaping") - ("printing" "printing") - ("process" "process") - ("processor" "processor") - ("proclaim" "proclaim") - ("proclamation" "proclamation") - ("prog tag" "prog_tag") - ("program" "program") - ("programmer" "programmer") - ("programmer code" "programmer_code") - ("proper list" "proper_list") - ("proper name" "proper_name") - ("proper sequence" "proper_sequence") - ("proper subtype" "proper_subtype") - ("property" "property") - ("property indicator" "property_indicator") - ("property list" "property_list") - ("property value" "property_value") - ("purports to conform" "purports_to_conform") - ("qualified method" "qualified_method") - ("qualifier" "qualifier") - ("query I/O" "query_iSLo") - ("quoted object" "quoted_object") - ("radix" "radix") - ("random state" "random_state") - ("rank" "rank") - ("ratio" "ratio") - ("ratio marker" "ratio_marker") - ("rational" "rational") - ("read" "read") - ("readably" "readably") - ("reader" "reader") - ("reader macro" "reader_macro") - ("reader macro function" "reader_macro_function") - ("readtable" "readtable") - ("readtable case" "readtable_case") - ("readtable designator" "readtable_designator") - ("recognizable subtype" "recognizable_subtype") - ("reference" "reference") - ("registered package" "registered_package") - ("relative" "relative") - ("repertoire" "repertoire") - ("report" "report") - ("report message" "report_message") - ("required parameter" "required_parameter") - ("rest list" "rest_list") - ("rest parameter" "rest_parameter") - ("restart" "restart") - ("restart designator" "restart_designator") - ("restart function" "restart_function") - ("return" "return") - ("return value" "return_value") - ("right-parenthesis" "right-parenthesis") - ("run time" "run_time") - ("run-time compiler" "run-time_compiler") - ("run-time definition" "run-time_definition") - ("run-time environment" "run-time_environment") - ("safe" "safe") - ("safe call" "safe_call") - ("same" "same") - ("satisfy the test" "satisfy_the_test") - ("scope" "scope") - ("script" "script") - ("secondary value" "secondary_value") - ("section" "section") - ("self-evaluating object" "self-evaluating_object") - ("semi-standard" "semi-standard") - ("semicolon" "semicolon") - ("sequence" "sequence") - ("sequence function" "sequence_function") - ("sequential" "sequential") - ("sequentially" "sequentially") - ("serious condition" "serious_condition") - ("session" "session") - ("set" "set") - ("setf expander" "setf_expander") - ("setf expansion" "setf_expansion") - ("setf function" "setf_function") - ("setf function name" "setf_function_name") - ("shadow" "shadow") - ("shadowing symbol" "shadowing_symbol") - ("shadowing symbols list" "shadowing_symbols_list") - ("shared slot" "shared_slot") - ("sharpsign" "sharpsign") - ("short float" "short_float") - ("sign" "sign") - ("signal" "signal") - ("signature" "signature") - ("similar" "similar") - ("similarity" "similarity") - ("simple" "simple") - ("simple array" "simple_array") - ("simple bit array" "simple_bit_array") - ("simple bit vector" "simple_bit_vector") - ("simple condition" "simple_condition") - ("simple general vector" "simple_general_vector") - ("simple string" "simple_string") - ("simple vector" "simple_vector") - ("single escape" "single_escape") - ("single float" "single_float") - ("single-quote" "single-quote") - ("singleton" "singleton") - ("situation" "situation") - ("slash" "slash") - ("slot" "slot") - ("slot specifier" "slot_specifier") - ("source code" "source_code") - ("source file" "source_file") - ("space" "space") - ("special form" "special_form") - ("special operator" "special_operator") - ("special variable" "special_variable") - ("specialize" "specialize") - ("specialized" "specialized") - ("specialized lambda list" "specialized_lambda_list") - ("spreadable argument list designator" "spreadable_argument_list_designator") - ("stack allocate" "stack_allocate") - ("stack-allocated" "stack-allocated") - ("standard character" "standard_character") - ("standard class" "standard_class") - ("standard generic function" "standard_generic_function") - ("standard input" "standard_input") - ("standard method combination" "standard_method_combination") - ("standard object" "standard_object") - ("standard output" "standard_output") - ("standard pprint dispatch table" "standard_pprint_dispatch_table") - ("standard readtable" "standard_readtable") - ("standard syntax" "standard_syntax") - ("standardized" "standardized") - ("startup environment" "startup_environment") - ("step" "step") - ("stream" "stream") - ("stream associated with a file" "stream_associated_with_a_file") - ("stream designator" "stream_designator") - ("stream element type" "stream_element_type") - ("stream variable" "stream_variable") - ("stream variable designator" "stream_variable_designator") - ("string" "string") - ("string designator" "string_designator") - ("string equal" "string_equal") - ("string stream" "string_stream") - ("structure" "structure") - ("structure class" "structure_class") - ("structure name" "structure_name") - ("style warning" "style_warning") - ("subclass" "subclass") - ("subexpression" "subexpression") - ("subform" "subform") - ("subrepertoire" "subrepertoire") - ("subtype" "subtype") - ("superclass" "superclass") - ("supertype" "supertype") - ("supplied-p parameter" "supplied-p_parameter") - ("symbol" "symbol") - ("symbol macro" "symbol_macro") - ("synonym stream" "synonym_stream") - ("synonym stream symbol" "synonym_stream_symbol") - ("syntax type" "syntax_type") - ("system class" "system_class") - ("system code" "system_code") - ("t" "t") - ("tag" "tag") - ("tail" "tail") - ("target" "target") - ("terminal I/O" "terminal_iSLo") - ("terminating" "terminating") - ("tertiary value" "tertiary_value") - ("throw" "throw") - ("tilde" "tilde") - ("time" "time") - ("time zone" "time_zone") - ("token" "token") - ("top level form" "top_level_form") - ("trace output" "trace_output") - ("tree" "tree") - ("tree structure" "tree_structure") - ("true" "true") - ("truename" "truename") - ("two-way stream" "two-way_stream") - ("type" "type") - ("type declaration" "type_declaration") - ("type equivalent" "type_equivalent") - ("type expand" "type_expand") - ("type specifier" "type_specifier") - ("unbound" "unbound") - ("unbound variable" "unbound_variable") - ("undefined function" "undefined_function") - ("unintern" "unintern") - ("uninterned" "uninterned") - ("universal time" "universal_time") - ("unqualified method" "unqualified_method") - ("unregistered package" "unregistered_package") - ("unsafe" "unsafe") - ("unsafe call" "unsafe_call") - ("upgrade" "upgrade") - ("upgraded array element type" "upgraded_array_element_type") - ("upgraded complex part type" "upgraded_complex_part_type") - ("uppercase" "uppercase") - ("use" "use") - ("use list" "use_list") - ("user" "user") - ("valid array dimension" "valid_array_dimension") - ("valid array index" "valid_array_index") - ("valid array row-major index" "valid_array_row-major_index") - ("valid fill pointer" "valid_fill_pointer") - ("valid logical pathname host" "valid_logical_pathname_host") - ("valid pathname device" "valid_pathname_device") - ("valid pathname directory" "valid_pathname_directory") - ("valid pathname host" "valid_pathname_host") - ("valid pathname name" "valid_pathname_name") - ("valid pathname type" "valid_pathname_type") - ("valid pathname version" "valid_pathname_version") - ("valid physical pathname host" "valid_physical_pathname_host") - ("valid sequence index" "valid_sequence_index") - ("value" "value") - ("value cell" "value_cell") - ("variable" "variable") - ("vector" "vector") - ("vertical-bar" "vertical-bar") - ("whitespace" "whitespace") - ("wild" "wild") - ("write" "write") - ("writer" "writer") - ("yield" "yield"))) - -(defun common-lisp-hyperspec-glossary-term (term) - "View the definition of TERM on the Common Lisp Hyperspec." - (interactive - (list - (completing-read "Look up glossary term: " - common-lisp-hyperspec--glossary-terms nil t))) - (browse-url (funcall common-lisp-hyperspec-glossary-function term))) - -(defun common-lisp-glossary-6.0 (term) - "Get a URL for a glossary term TERM." - (let ((anchor (gethash term common-lisp-hyperspec--glossary-terms))) - (if (not anchor) - (message "Unknown glossary term: %s" term) - (format "%sBody/26_glo_%s.htm#%s" - common-lisp-hyperspec-root - (let ((char (string-to-char term))) - (if (and (<= ?a char) - (<= char ?z)) - (make-string 1 char) - "9")) - anchor)))) - -;; Tianxiang Xiong 20151229 -;; Is this function necessary? The link does created does not work. -(defun common-lisp-glossary-4.0 (string) - (format "%sBody/glo_%s.html#%s" - common-lisp-hyperspec-root - (let ((char (string-to-char string))) - (if (and (<= ?a char) - (<= char ?z)) - (make-string 1 char) - "9")) - (subst-char-in-string ?\ ?_ string))) - - -;;;; Issuex - -;; FIXME: the issuex stuff is not used -(defvar common-lisp-hyperspec-issuex-table nil - "The HyperSpec IssueX table file. If you copy the HyperSpec to your -local system, set this variable to the location of the Issue -cross-references table which is usually \"Map_IssX.txt\" or -\"Issue-Cross-Refs.text\".") - -(defvar common-lisp-hyperspec--issuex-symbols - (make-hash-table :test 'equal)) - -(mapc - (lambda (entry) - (puthash (car entry) (cadr entry) common-lisp-hyperspec--issuex-symbols)) - (if common-lisp-hyperspec-issuex-table - (common-lisp-hyperspec--parse-map-file - common-lisp-hyperspec-issuex-table) - '(("&environment-binding-order:first" "iss001.htm") - ("access-error-name" "iss002.htm") - ("adjust-array-displacement" "iss003.htm") - ("adjust-array-fill-pointer" "iss004.htm") - ("adjust-array-not-adjustable:implicit-copy" "iss005.htm") - ("allocate-instance:add" "iss006.htm") - ("allow-local-inline:inline-notinline" "iss007.htm") - ("allow-other-keys-nil:permit" "iss008.htm") - ("aref-1d" "iss009.htm") - ("argument-mismatch-error-again:consistent" "iss010.htm") - ("argument-mismatch-error-moon:fix" "iss011.htm") - ("argument-mismatch-error:more-clarifications" "iss012.htm") - ("arguments-underspecified:specify" "iss013.htm") - ("array-dimension-limit-implications:all-fixnum" "iss014.htm") - ("array-type-element-type-semantics:unify-upgrading" "iss015.htm") - ("assert-error-type:error" "iss016.htm") - ("assoc-rassoc-if-key" "iss017.htm") - ("assoc-rassoc-if-key:yes" "iss018.htm") - ("boa-aux-initialization:error-on-read" "iss019.htm") - ("break-on-warnings-obsolete:remove" "iss020.htm") - ("broadcast-stream-return-values:clarify-minimally" "iss021.htm") - ("butlast-negative:should-signal" "iss022.htm") - ("change-class-initargs:permit" "iss023.htm") - ("char-name-case:x3j13-mar-91" "iss024.htm") - ("character-loose-ends:fix" "iss025.htm") - ("character-proposal:2" "iss026.htm") - ("character-proposal:2-1-1" "iss027.htm") - ("character-proposal:2-1-2" "iss028.htm") - ("character-proposal:2-2-1" "iss029.htm") - ("character-proposal:2-3-1" "iss030.htm") - ("character-proposal:2-3-2" "iss031.htm") - ("character-proposal:2-3-3" "iss032.htm") - ("character-proposal:2-3-4" "iss033.htm") - ("character-proposal:2-3-5" "iss034.htm") - ("character-proposal:2-3-6" "iss035.htm") - ("character-proposal:2-4-1" "iss036.htm") - ("character-proposal:2-4-2" "iss037.htm") - ("character-proposal:2-4-3" "iss038.htm") - ("character-proposal:2-5-2" "iss039.htm") - ("character-proposal:2-5-6" "iss040.htm") - ("character-proposal:2-5-7" "iss041.htm") - ("character-proposal:2-6-1" "iss042.htm") - ("character-proposal:2-6-2" "iss043.htm") - ("character-proposal:2-6-3" "iss044.htm") - ("character-proposal:2-6-5" "iss045.htm") - ("character-vs-char:less-inconsistent-short" "iss046.htm") - ("class-object-specializer:affirm" "iss047.htm") - ("clos-conditions-again:allow-subset" "iss048.htm") - ("clos-conditions:integrate" "iss049.htm") - ("clos-error-checking-order:no-applicable-method-first" "iss050.htm") - ("clos-macro-compilation:minimal" "iss051.htm") - ("close-constructed-stream:argument-stream-only" "iss052.htm") - ("closed-stream-operations:allow-inquiry" "iss053.htm") - ("coercing-setf-name-to-function:all-function-names" "iss054.htm") - ("colon-number" "iss055.htm") - ("common-features:specify" "iss056.htm") - ("common-type:remove" "iss057.htm") - ("compile-argument-problems-again:fix" "iss058.htm") - ("compile-file-handling-of-top-level-forms:clarify" "iss059.htm") - ("compile-file-output-file-defaults:input-file" "iss060.htm") - ("compile-file-package" "iss061.htm") - ("compile-file-pathname-arguments:make-consistent" "iss062.htm") - ("compile-file-symbol-handling:new-require-consistency" "iss063.htm") - ("compiled-function-requirements:tighten" "iss064.htm") - ("compiler-diagnostics:use-handler" "iss065.htm") - ("compiler-let-confusion:eliminate" "iss066.htm") - ("compiler-verbosity:like-load" "iss067.htm") - ("compiler-warning-stream" "iss068.htm") - ("complex-atan-branch-cut:tweak" "iss069.htm") - ("complex-atanh-bogus-formula:tweak-more" "iss070.htm") - ("complex-rational-result:extend" "iss071.htm") - ("compute-applicable-methods:generic" "iss072.htm") - ("concatenate-sequence:signal-error" "iss073.htm") - ("condition-accessors-setfable:no" "iss074.htm") - ("condition-restarts:buggy" "iss075.htm") - ("condition-restarts:permit-association" "iss076.htm") - ("condition-slots:hidden" "iss077.htm") - ("cons-type-specifier:add" "iss078.htm") - ("constant-circular-compilation:yes" "iss079.htm") - ("constant-collapsing:generalize" "iss080.htm") - ("constant-compilable-types:specify" "iss081.htm") - ("constant-function-compilation:no" "iss082.htm") - ("constant-modification:disallow" "iss083.htm") - ("constantp-definition:intentional" "iss084.htm") - ("constantp-environment:add-arg" "iss085.htm") - ("contagion-on-numerical-comparisons:transitive" "iss086.htm") - ("copy-symbol-copy-plist:copy-list" "iss087.htm") - ("copy-symbol-print-name:equal" "iss088.htm") - ("data-io:add-support" "iss089.htm") - ("data-types-hierarchy-underspecified" "iss090.htm") - ("debugger-hook-vs-break:clarify" "iss091.htm") - ("declaration-scope:no-hoisting" "iss092.htm") - ("declare-array-type-element-references:restrictive" "iss093.htm") - ("declare-function-ambiguity:delete-ftype-abbreviation" "iss094.htm") - ("declare-macros:flush" "iss095.htm") - ("declare-type-free:lexical" "iss096.htm") - ("decls-and-doc" "iss097.htm") - ("decode-universal-time-daylight:like-encode" "iss098.htm") - ("defconstant-special:no" "iss099.htm") - ("defgeneric-declare:allow-multiple" "iss100.htm") - ("define-compiler-macro:x3j13-nov89" "iss101.htm") - ("define-condition-syntax:\ -incompatibly-more-like-defclass+emphasize-read-only" "iss102.htm") - ("define-method-combination-behavior:clarify" "iss103.htm") - ("defining-macros-non-top-level:allow" "iss104.htm") - ("defmacro-block-scope:excludes-bindings" "iss105.htm") - ("defmacro-lambda-list:tighten-description" "iss106.htm") - ("defmethod-declaration-scope:corresponds-to-bindings" "iss107.htm") - ("defpackage:addition" "iss108.htm") - ("defstruct-constructor-key-mixture:allow-key" "iss109.htm") - ("defstruct-constructor-options:explicit" "iss110.htm") - ("defstruct-constructor-slot-variables:not-bound" "iss111.htm") - ("defstruct-copier-argument-type:restrict" "iss112.htm") - ("defstruct-copier:argument-type" "iss113.htm") - ("defstruct-default-value-evaluation:iff-needed" "iss114.htm") - ("defstruct-include-deftype:explicitly-undefined" "iss115.htm") - ("defstruct-print-function-again:x3j13-mar-93" "iss116.htm") - ("defstruct-print-function-inheritance:yes" "iss117.htm") - ("defstruct-redefinition:error" "iss118.htm") - ("defstruct-slots-constraints-name:duplicates-error" "iss119.htm") - ("defstruct-slots-constraints-number" "iss120.htm") - ("deftype-destructuring:yes" "iss121.htm") - ("deftype-key:allow" "iss122.htm") - ("defvar-documentation:unevaluated" "iss123.htm") - ("defvar-init-time:not-delayed" "iss124.htm") - ("defvar-initialization:conservative" "iss125.htm") - ("deprecation-position:limited" "iss126.htm") - ("describe-interactive:no" "iss127.htm") - ("describe-underspecified:describe-object" "iss128.htm") - ("destructive-operations:specify" "iss129.htm") - ("destructuring-bind:new-macro" "iss130.htm") - ("disassemble-side-effect:do-not-install" "iss131.htm") - ("displaced-array-predicate:add" "iss132.htm") - ("do-symbols-block-scope:entire-form" "iss133.htm") - ("do-symbols-duplicates" "iss134.htm") - ("documentation-function-bugs:fix" "iss135.htm") - ("documentation-function-tangled:require-argument" "iss136.htm") - ("dotimes-ignore:x3j13-mar91" "iss137.htm") - ("dotted-list-arguments:clarify" "iss138.htm") - ("dotted-macro-forms:allow" "iss139.htm") - ("dribble-technique" "iss140.htm") - ("dynamic-extent-function:extend" "iss141.htm") - ("dynamic-extent:new-declaration" "iss142.htm") - ("equal-structure:maybe-status-quo" "iss143.htm") - ("error-terminology-warning:might" "iss144.htm") - ("eval-other:self-evaluate" "iss145.htm") - ("eval-top-level:load-like-compile-file" "iss146.htm") - ("eval-when-non-top-level:generalize-eval-new-keywords" "iss147.htm") - ("eval-when-obsolete-keywords:x3j13-mar-1993" "iss148.htm") - ("evalhook-step-confusion:fix" "iss149.htm") - ("evalhook-step-confusion:x3j13-nov-89" "iss150.htm") - ("exit-extent-and-condition-system:like-dynamic-bindings" "iss151.htm") - ("exit-extent:minimal" "iss152.htm") - ("expt-ratio:p.211" "iss153.htm") - ("extensions-position:documentation" "iss154.htm") - ("external-format-for-every-file-connection:minimum" "iss155.htm") - ("extra-return-values:no" "iss156.htm") - ("file-open-error:signal-file-error" "iss157.htm") - ("fixnum-non-portable:tighten-definition" "iss158.htm") - ("flet-declarations" "iss159.htm") - ("flet-declarations:allow" "iss160.htm") - ("flet-implicit-block:yes" "iss161.htm") - ("float-underflow:add-variables" "iss162.htm") - ("floating-point-condition-names:x3j13-nov-89" "iss163.htm") - ("format-atsign-colon" "iss164.htm") - ("format-colon-uparrow-scope" "iss165.htm") - ("format-comma-interval" "iss166.htm") - ("format-e-exponent-sign:force-sign" "iss167.htm") - ("format-op-c" "iss168.htm") - ("format-pretty-print:yes" "iss169.htm") - ("format-string-arguments:specify" "iss170.htm") - ("function-call-evaluation-order:more-unspecified" "iss171.htm") - ("function-composition:jan89-x3j13" "iss172.htm") - ("function-definition:jan89-x3j13" "iss173.htm") - ("function-name:large" "iss174.htm") - ("function-type" "iss175.htm") - ("function-type-argument-type-semantics:restrictive" "iss176.htm") - ("function-type-key-name:specify-keyword" "iss177.htm") - ("function-type-rest-list-element:use-actual-argument-type" "iss178.htm") - ("function-type:x3j13-march-88" "iss179.htm") - ("generalize-pretty-printer:unify" "iss180.htm") - ("generic-flet-poorly-designed:delete" "iss181.htm") - ("gensym-name-stickiness:like-teflon" "iss182.htm") - ("gentemp-bad-idea:deprecate" "iss183.htm") - ("get-macro-character-readtable:nil-standard" "iss184.htm") - ("get-setf-method-environment:add-arg" "iss185.htm") - ("hash-table-access:x3j13-mar-89" "iss186.htm") - ("hash-table-key-modification:specify" "iss187.htm") - ("hash-table-package-generators:add-with-wrapper" "iss188.htm") - ("hash-table-rehash-size-integer" "iss189.htm") - ("hash-table-size:intended-entries" "iss190.htm") - ("hash-table-tests:add-equalp" "iss191.htm") - ("ieee-atan-branch-cut:split" "iss192.htm") - ("ignore-use-terminology:value-only" "iss193.htm") - ("import-setf-symbol-package" "iss194.htm") - ("in-package-functionality:mar89-x3j13" "iss195.htm") - ("in-syntax:minimal" "iss196.htm") - ("initialization-function-keyword-checking" "iss197.htm") - ("iso-compatibility:add-substrate" "iss198.htm") - ("jun90-trivial-issues:11" "iss199.htm") - ("jun90-trivial-issues:14" "iss200.htm") - ("jun90-trivial-issues:24" "iss201.htm") - ("jun90-trivial-issues:25" "iss202.htm") - ("jun90-trivial-issues:27" "iss203.htm") - ("jun90-trivial-issues:3" "iss204.htm") - ("jun90-trivial-issues:4" "iss205.htm") - ("jun90-trivial-issues:5" "iss206.htm") - ("jun90-trivial-issues:9" "iss207.htm") - ("keyword-argument-name-package:any" "iss208.htm") - ("last-n" "iss209.htm") - ("lcm-no-arguments:1" "iss210.htm") - ("lexical-construct-global-definition:undefined" "iss211.htm") - ("lisp-package-name:common-lisp" "iss212.htm") - ("lisp-symbol-redefinition-again:more-fixes" "iss213.htm") - ("lisp-symbol-redefinition:mar89-x3j13" "iss214.htm") - ("load-objects:make-load-form" "iss215.htm") - ("load-time-eval:r**2-new-special-form" "iss216.htm") - ("load-time-eval:r**3-new-special-form" "iss217.htm") - ("load-truename:new-pathname-variables" "iss218.htm") - ("locally-top-level:special-form" "iss219.htm") - ("loop-and-discrepancy:no-reiteration" "iss220.htm") - ("loop-for-as-on-typo:fix-typo" "iss221.htm") - ("loop-initform-environment:partial-interleaving-vague" "iss222.htm") - ("loop-miscellaneous-repairs:fix" "iss223.htm") - ("loop-named-block-nil:override" "iss224.htm") - ("loop-present-symbols-typo:flush-wrong-words" "iss225.htm") - ("loop-syntax-overhaul:repair" "iss226.htm") - ("macro-as-function:disallow" "iss227.htm") - ("macro-declarations:make-explicit" "iss228.htm") - ("macro-environment-extent:dynamic" "iss229.htm") - ("macro-function-environment" "iss230.htm") - ("macro-function-environment:yes" "iss231.htm") - ("macro-subforms-top-level-p:add-constraints" "iss232.htm") - ("macroexpand-hook-default:explicitly-vague" "iss233.htm") - ("macroexpand-hook-initial-value:implementation-dependent" "iss234.htm") - ("macroexpand-return-value:true" "iss235.htm") - ("make-load-form-confusion:rewrite" "iss236.htm") - ("make-load-form-saving-slots:no-initforms" "iss237.htm") - ("make-package-use-default:implementation-dependent" "iss238.htm") - ("map-into:add-function" "iss239.htm") - ("mapping-destructive-interaction:explicitly-vague" "iss240.htm") - ("metaclass-of-system-class:unspecified" "iss241.htm") - ("method-combination-arguments:clarify" "iss242.htm") - ("method-initform:forbid-call-next-method" "iss243.htm") - ("muffle-warning-condition-argument" "iss244.htm") - ("multiple-value-setq-order:like-setf-of-values" "iss245.htm") - ("multiple-values-limit-on-variables:undefined" "iss246.htm") - ("nintersection-destruction" "iss247.htm") - ("nintersection-destruction:revert" "iss248.htm") - ("not-and-null-return-value:x3j13-mar-93" "iss249.htm") - ("nth-value:add" "iss250.htm") - ("optimize-debug-info:new-quality" "iss251.htm") - ("package-clutter:reduce" "iss252.htm") - ("package-deletion:new-function" "iss253.htm") - ("package-function-consistency:more-permissive" "iss254.htm") - ("parse-error-stream:split-types" "iss255.htm") - ("pathname-component-case:keyword-argument" "iss256.htm") - ("pathname-component-value:specify" "iss257.htm") - ("pathname-host-parsing:recognize-logical-host-names" "iss258.htm") - ("pathname-logical:add" "iss259.htm") - ("pathname-print-read:sharpsign-p" "iss260.htm") - ("pathname-stream" "iss261.htm") - ("pathname-stream:files-or-synonym" "iss262.htm") - ("pathname-subdirectory-list:new-representation" "iss263.htm") - ("pathname-symbol" "iss264.htm") - ("pathname-syntax-error-time:explicitly-vague" "iss265.htm") - ("pathname-unspecific-component:new-token" "iss266.htm") - ("pathname-wild:new-functions" "iss267.htm") - ("peek-char-read-char-echo:first-read-char" "iss268.htm") - ("plist-duplicates:allow" "iss269.htm") - ("pretty-print-interface" "iss270.htm") - ("princ-readably:x3j13-dec-91" "iss271.htm") - ("print-case-behavior:clarify" "iss272.htm") - ("print-case-print-escape-interaction:vertical-bar-rule-no-upcase" - "iss273.htm") - ("print-circle-shared:respect-print-circle" "iss274.htm") - ("print-circle-structure:user-functions-work" "iss275.htm") - ("print-readably-behavior:clarify" "iss276.htm") - ("printer-whitespace:just-one-space" "iss277.htm") - ("proclaim-etc-in-compile-file:new-macro" "iss278.htm") - ("push-evaluation-order:first-item" "iss279.htm") - ("push-evaluation-order:item-first" "iss280.htm") - ("pushnew-store-required:unspecified" "iss281.htm") - ("quote-semantics:no-copying" "iss282.htm") - ("range-of-count-keyword:nil-or-integer" "iss283.htm") - ("range-of-start-and-end-parameters:integer-and-integer-nil" "iss284.htm") - ("read-and-write-bytes:new-functions" "iss285.htm") - ("read-case-sensitivity:readtable-keywords" "iss286.htm") - ("read-modify-write-evaluation-order:delayed-access-stores" "iss287.htm") - ("read-suppress-confusing:generalize" "iss288.htm") - ("reader-error:new-type" "iss289.htm") - ("real-number-type:x3j13-mar-89" "iss290.htm") - ("recursive-deftype:explicitly-vague" "iss291.htm") - ("reduce-argument-extraction" "iss292.htm") - ("remf-destruction-unspecified:x3j13-mar-89" "iss293.htm") - ("require-pathname-defaults-again:x3j13-dec-91" "iss294.htm") - ("require-pathname-defaults-yet-again:restore-argument" "iss295.htm") - ("require-pathname-defaults:eliminate" "iss296.htm") - ("rest-list-allocation:may-share" "iss297.htm") - ("result-lists-shared:specify" "iss298.htm") - ("return-values-unspecified:specify" "iss299.htm") - ("room-default-argument:new-value" "iss300.htm") - ("self-modifying-code:forbid" "iss301.htm") - ("sequence-type-length:must-match" "iss302.htm") - ("setf-apply-expansion:ignore-expander" "iss303.htm") - ("setf-find-class:allow-nil" "iss304.htm") - ("setf-functions-again:minimal-changes" "iss305.htm") - ("setf-get-default:evaluated-but-ignored" "iss306.htm") - ("setf-macro-expansion:last" "iss307.htm") - ("setf-method-vs-setf-method:rename-old-terms" "iss308.htm") - ("setf-multiple-store-variables:allow" "iss309.htm") - ("setf-of-apply:only-aref-and-friends" "iss310.htm") - ("setf-of-values:add" "iss311.htm") - ("setf-sub-methods:delayed-access-stores" "iss312.htm") - ("shadow-already-present" "iss313.htm") - ("shadow-already-present:works" "iss314.htm") - ("sharp-comma-confusion:remove" "iss315.htm") - ("sharp-o-foobar:consequences-undefined" "iss316.htm") - ("sharp-star-delimiter:normal-delimiter" "iss317.htm") - ("sharpsign-plus-minus-package:keyword" "iss318.htm") - ("slot-missing-values:specify" "iss319.htm") - ("slot-value-metaclasses:less-minimal" "iss320.htm") - ("special-form-p-misnomer:rename" "iss321.htm") - ("special-type-shadowing:clarify" "iss322.htm") - ("standard-input-initial-binding:defined-contracts" "iss323.htm") - ("standard-repertoire-gratuitous:rename" "iss324.htm") - ("step-environment:current" "iss325.htm") - ("step-minimal:permit-progn" "iss326.htm") - ("stream-access:add-types-accessors" "iss327.htm") - ("stream-capabilities:interactive-stream-p" "iss328.htm") - ("string-coercion:make-consistent" "iss329.htm") - ("string-output-stream-bashing:undefined" "iss330.htm") - ("structure-read-print-syntax:keywords" "iss331.htm") - ("subseq-out-of-bounds" "iss332.htm") - ("subseq-out-of-bounds:is-an-error" "iss333.htm") - ("subsetting-position:none" "iss334.htm") - ("subtypep-environment:add-arg" "iss335.htm") - ("subtypep-too-vague:clarify-more" "iss336.htm") - ("sxhash-definition:similar-for-sxhash" "iss337.htm") - ("symbol-macrolet-declare:allow" "iss338.htm") - ("symbol-macrolet-semantics:special-form" "iss339.htm") - ("symbol-macrolet-type-declaration:no" "iss340.htm") - ("symbol-macros-and-proclaimed-specials:signals-an-error" "iss341.htm") - ("symbol-print-escape-behavior:clarify" "iss342.htm") - ("syntactic-environment-access:retracted-mar91" "iss343.htm") - ("tagbody-tag-expansion:no" "iss344.htm") - ("tailp-nil:t" "iss345.htm") - ("test-not-if-not:flush-all" "iss346.htm") - ("the-ambiguity:for-declaration" "iss347.htm") - ("the-values:return-number-received" "iss348.htm") - ("time-zone-non-integer:allow" "iss349.htm") - ("type-declaration-abbreviation:allow-all" "iss350.htm") - ("type-of-and-predefined-classes:type-of-handles-floats" "iss351.htm") - ("type-of-and-predefined-classes:unify-and-extend" "iss352.htm") - ("type-of-underconstrained:add-constraints" "iss353.htm") - ("type-specifier-abbreviation:x3j13-jun90-guess" "iss354.htm") - ("undefined-variables-and-functions:compromise" "iss355.htm") - ("uninitialized-elements:consequences-undefined" "iss356.htm") - ("unread-char-after-peek-char:dont-allow" "iss357.htm") - ("unsolicited-messages:not-to-system-user-streams" "iss358.htm") - ("variable-list-asymmetry:symmetrize" "iss359.htm") - ("with-added-methods:delete" "iss360.htm") - ("with-compilation-unit:new-macro" "iss361.htm") - ("with-open-file-does-not-exist:stream-is-nil" "iss362.htm") - ("with-open-file-setq:explicitly-vague" "iss363.htm") - ("with-open-file-stream-extent:dynamic-extent" "iss364.htm") - ("with-output-to-string-append-style:vector-push-extend" "iss365.htm") - ("with-standard-io-syntax-readtable:x3j13-mar-91" "iss366.htm")))) - -(defun common-lisp-issuex (issue-name) - (let ((entry (gethash (downcase issue-name) - common-lisp-hyperspec--issuex-symbols))) - (concat common-lisp-hyperspec-root "Issues/" entry))) - -(defun common-lisp-special-operator (name) - (format "%sBody/s_%s.htm" common-lisp-hyperspec-root name)) - -;;; Added the following just to provide a common entry point according -;;; to the various 'hyperspec' implementations. -;;; -;;; 19990820 Marco Antoniotti - -(defalias 'hyperspec-lookup 'common-lisp-hyperspec) -(defalias 'hyperspec-lookup-reader-macro - 'common-lisp-hyperspec-lookup-reader-macro) -(defalias 'hyperspec-lookup-format 'common-lisp-hyperspec-format) - -(provide 'hyperspec) - -;;; hyperspec.el ends here diff --git a/elpa/slime-20200414.1444/lib/hyperspec.elc b/elpa/slime-20200414.1444/lib/hyperspec.elc deleted file mode 100644 index e3e93e3a7267e9851ff7bf10cfca0273c55bb581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84726 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 - -;;; **************************************************************** -;;; Metering System ************************************************ -;;; **************************************************************** -;;; -;;; The Metering System is a portable Common Lisp code profiling tool. -;;; It gathers timing and consing statistics for specified functions -;;; while a program is running. -;;; -;;; The Metering System is a combination of -;;; o the Monitor package written by Chris McConnell -;;; o the Profile package written by Skef Wholey and Rob MacLachlan -;;; The two systems were merged and extended by Mark Kantrowitz. -;;; -;;; Address: Carnegie Mellon University -;;; School of Computer Science -;;; Pittsburgh, PA 15213 -;;; -;;; This code is in the public domain and is distributed without warranty -;;; of any kind. -;;; -;;; This copy is from SLIME, http://www.common-lisp.net/project/slime/ -;;; -;;; - -;;; ******************************** -;;; Change Log ********************* -;;; ******************************** -;;; -;;; 26-JUN-90 mk Merged functionality of Monitor and Profile packages. -;;; 26-JUN-90 mk Now handles both inclusive and exclusive statistics -;;; with respect to nested calls. (Allows it to subtract -;;; total monitoring overhead for each function, not just -;;; the time spent monitoring the function itself.) -;;; 26-JUN-90 mk The table is now saved so that one may manipulate -;;; the data (sorting it, etc.) even after the original -;;; source of the data has been cleared. -;;; 25-SEP-90 mk Added get-cons functions for Lucid 3.0, MACL 1.3.2 -;;; required-arguments functions for Lucid 3.0, -;;; Franz Allegro CL, and MACL 1.3.2. -;;; 25-JAN-91 mk Now uses fdefinition if available. -;;; 25-JAN-91 mk Replaced (and :allegro (not :coral)) with :excl. -;;; Much better solution for the fact that both call -;;; themselves :allegro. -;;; 5-JUL-91 mk Fixed warning to occur only when file is loaded -;;; uncompiled. -;;; 5-JUL-91 mk When many unmonitored functions, print out number -;;; instead of whole list. -;;; 24-MAR-92 mk Updated for CLtL2 compatibility. space measuring -;;; doesn't work in MCL, but fixed so that timing -;;; statistics do. -;;; 26-MAR-92 mk Updated for Lispworks. Replaced :ccl with -;;; (and :ccl (not :lispworks)). -;;; 27-MAR-92 mk Added get-cons for Allegro-V4.0. -;;; 01-JAN-93 mk v2.0 Support for MCL 2.0, CMU CL 16d, Allegro V3.1/4.0/4.1, -;;; Lucid 4.0, ibcl -;;; 25-JAN-94 mk v2.1 Patches for CLISP from Bruno Haible. -;;; 01-APR-05 lgorrie Removed support for all Lisps except CLISP and OpenMCL. -;;; Purely to cut down on stale code (e.g. #+cltl2) in this -;;; version that is bundled with SLIME. -;;; 22-Aug-08 stas Define TIME-TYPE for Clozure CL. -;;; 07-Aug-12 heller Break lines at 80 columns -;;; - -;;; ******************************** -;;; To Do ************************** -;;; ******************************** -;;; -;;; - Need get-cons for Allegro, AKCL. -;;; - Speed up monitoring code. Replace use of hash tables with an embedded -;;; offset in an array so that it will be faster than using gethash. -;;; (i.e., svref/closure reference is usually faster than gethash). -;;; - Beware of (get-internal-run-time) overflowing. Yikes! -;;; - Check robustness with respect to profiled functions. -;;; - Check logic of computing inclusive and exclusive time and consing. -;;; Especially wrt incf/setf comment below. Should be incf, so we -;;; sum recursive calls. -;;; - Add option to record caller statistics -- this would list who -;;; called which functions and how often. -;;; - switches to turn timing/CONSING statistics collection on/off. - - -;;; ******************************** -;;; Notes ************************** -;;; ******************************** -;;; -;;; METERING has been tested (successfully) in the following lisps: -;;; CMU Common Lisp (16d, Python Compiler 1.0 ) :new-compiler -;;; CMU Common Lisp (M2.9 15-Aug-90, Compiler M1.8 15-Aug-90) -;;; Macintosh Allegro Common Lisp (1.3.2) -;;; Macintosh Common Lisp (2.0) -;;; ExCL (Franz Allegro CL 3.1.12 [DEC 3100] 11/19/90) :allegro-v3.1 -;;; ExCL (Franz Allegro CL 4.0.1 [Sun4] 2/8/91) :allegro-v4.0 -;;; ExCL (Franz Allegro CL 4.1 [SPARC R1] 8/28/92 14:06) :allegro-v4.1 -;;; ExCL (Franz ACL 5.0.1 [Linux/X86] 6/29/99 16:11) :allegro-v5.0.1 -;;; Lucid CL (Version 2.1 6-DEC-87) -;;; Lucid Common Lisp (3.0) -;;; Lucid Common Lisp (4.0.1 HP-700 12-Aug-91) -;;; AKCL (1.86, June 30, 1987 or later) -;;; Ibuki Common Lisp (Version 2, release 01.027) -;;; CLISP (January 1994) -;;; -;;; METERING needs to be tested in the following lisps: -;;; Symbolics Common Lisp (8.0) -;;; KCL (June 3, 1987 or later) -;;; TI (Release 4.1 or later) -;;; Golden Common Lisp (3.1 IBM-PC) -;;; VAXLisp (2.0, 3.1) -;;; Procyon Common Lisp - - -;;; **************************************************************** -;;; Documentation ************************************************** -;;; **************************************************************** -;;; -;;; This system runs in any valid Common Lisp. Four small -;;; implementation-dependent changes can be made to improve performance -;;; and prettiness. In the section labelled "Implementation Dependent -;;; Changes" below, you should tailor the functions REQUIRED-ARGUMENTS, -;;; GET-CONS, GET-TIME, and TIME-UNITS-PER-SECOND to your implementation -;;; for the best results. If GET-CONS is not specified for your -;;; implementation, no consing information will be reported. The other -;;; functions will default to working forms, albeit inefficient, in -;;; non-CMU implementations. If you tailor these functions for a particular -;;; version of Common Lisp, we'd appreciate receiving the code. -;;; - -;;; **************************************************************** -;;; Usage Notes **************************************************** -;;; **************************************************************** -;;; -;;; SUGGESTED USAGE: -;;; -;;; Start by monitoring big pieces of the program, then carefully choose -;;; which functions close to, but not in, the inner loop are to be -;;; monitored next. Don't monitor functions that are called by other -;;; monitored functions: you will only confuse yourself. -;;; -;;; If the per-call time reported is less than 1/10th of a second, then -;;; consider the clock resolution and profiling overhead before you believe -;;; the time. It may be that you will need to run your program many times -;;; in order to average out to a higher resolution. -;;; -;;; The easiest way to use this package is to load it and execute either -;;; (swank-monitor:with-monitoring (names*) () -;;; your-forms*) -;;; or -;;; (swank-monitor:monitor-form your-form) -;;; The former allows you to specify which functions will be monitored; the -;;; latter monitors all functions in the current package. Both automatically -;;; produce a table of statistics. Other variants can be constructed from -;;; the monitoring primitives, which are described below, along with a -;;; fuller description of these two macros. -;;; -;;; For best results, compile this file before using. -;;; -;;; -;;; CLOCK RESOLUTION: -;;; -;;; Unless you are very lucky, the length of your machine's clock "tick" is -;;; probably much longer than the time it takes a simple function to run. -;;; For example, on the IBM RT, the clock resolution is 1/50th of a second. -;;; This means that if a function is only called a few times, then only the -;;; first couple of decimal places are really meaningful. -;;; -;;; -;;; MONITORING OVERHEAD: -;;; -;;; The added monitoring code takes time to run every time that the monitored -;;; function is called, which can disrupt the attempt to collect timing -;;; information. In order to avoid serious inflation of the times for functions -;;; that take little time to run, an estimate of the overhead due to monitoring -;;; is subtracted from the times reported for each function. -;;; -;;; Although this correction works fairly well, it is not totally accurate, -;;; resulting in times that become increasingly meaningless for functions -;;; with short runtimes. For example, subtracting the estimated overhead -;;; may result in negative times for some functions. This is only a concern -;;; when the estimated profiling overhead is many times larger than -;;; reported total CPU time. -;;; -;;; If you monitor functions that are called by monitored functions, in -;;; :inclusive mode the monitoring overhead for the inner function is -;;; subtracted from the CPU time for the outer function. [We do this by -;;; counting for each function not only the number of calls to *this* -;;; function, but also the number of monitored calls while it was running.] -;;; In :exclusive mode this is not necessary, since we subtract the -;;; monitoring time of inner functions, overhead & all. -;;; -;;; Otherwise, the estimated monitoring overhead is not represented in the -;;; reported total CPU time. The sum of total CPU time and the estimated -;;; monitoring overhead should be close to the total CPU time for the -;;; entire monitoring run (as determined by TIME). -;;; -;;; A timing overhead factor is computed at load time. This will be incorrect -;;; if the monitoring code is run in a different environment than this file -;;; was loaded in. For example, saving a core image on a high performance -;;; machine and running it on a low performance one will result in the use -;;; of an erroneously small overhead factor. -;;; -;;; -;;; If your times vary widely, possible causes are: -;;; - Garbage collection. Try turning it off, then running your code. -;;; Be warned that monitoring code will probably cons when it does -;;; (get-internal-run-time). -;;; - Swapping. If you have enough memory, execute your form once -;;; before monitoring so that it will be swapped into memory. Otherwise, -;;; get a bigger machine! -;;; - Resolution of internal-time-units-per-second. If this value is -;;; too low, then the timings become wild. You can try executing more -;;; of whatever your test is, but that will only work if some of your -;;; paths do not match the timer resolution. -;;; internal-time-units-per-second is so coarse -- on a Symbolics it is -;;; 977, in MACL it is 60. -;;; -;;; - -;;; **************************************************************** -;;; Interface ****************************************************** -;;; **************************************************************** -;;; -;;; WITH-MONITORING (&rest functions) [Macro] -;;; (&optional (nested :exclusive) -;;; (threshold 0.01) -;;; (key :percent-time)) -;;; &body body -;;; The named functions will be set up for monitoring, the body forms executed, -;;; a table of results printed, and the functions unmonitored. The nested, -;;; threshold, and key arguments are passed to report-monitoring below. -;;; -;;; MONITOR-FORM form [Macro] -;;; &optional (nested :exclusive) -;;; (threshold 0.01) -;;; (key :percent-time) -;;; All functions in the current package are set up for monitoring while -;;; the form is executed, and automatically unmonitored after a table of -;;; results has been printed. The nested, threshold, and key arguments -;;; are passed to report-monitoring below. -;;; -;;; *MONITORED-FUNCTIONS* [Variable] -;;; This holds a list of all functions that are currently being monitored. -;;; -;;; MONITOR &rest names [Macro] -;;; The named functions will be set up for monitoring by augmenting -;;; their function definitions with code that gathers statistical information -;;; about code performance. As with the TRACE macro, the function names are -;;; not evaluated. Calls the function SWANK-MONITOR::MONITORING-ENCAPSULATE on each -;;; function name. If no names are specified, returns a list of all -;;; monitored functions. -;;; -;;; If name is not a symbol, it is evaled to return the appropriate -;;; closure. This allows you to monitor closures stored anywhere like -;;; in a variable, array or structure. Most other monitoring packages -;;; can't handle this. -;;; -;;; MONITOR-ALL &optional (package *package*) [Function] -;;; Monitors all functions in the specified package, which defaults to -;;; the current package. -;;; -;;; UNMONITOR &rest names [Macro] -;;; Removes monitoring code from the named functions. If no names are -;;; specified, all currently monitored functions are unmonitored. -;;; -;;; RESET-MONITORING-INFO name [Function] -;;; Resets the monitoring statistics for the specified function. -;;; -;;; RESET-ALL-MONITORING [Function] -;;; Resets the monitoring statistics for all monitored functions. -;;; -;;; MONITORED name [Function] -;;; Predicate to test whether a function is monitored. -;;; -;;; REPORT-MONITORING &optional names [Function] -;;; (nested :exclusive) -;;; (threshold 0.01) -;;; (key :percent-time) -;;; Creates a table of monitoring information for the specified list -;;; of names, and displays the table using display-monitoring-results. -;;; If names is :all or nil, uses all currently monitored functions. -;;; Takes the following arguments: -;;; - NESTED specifies whether nested calls of monitored functions -;;; are included in the times for monitored functions. -;;; o If :inclusive, the per-function information is for the entire -;;; duration of the monitored function, including any calls to -;;; other monitored functions. If functions A and B are monitored, -;;; and A calls B, then the accumulated time and consing for A will -;;; include the time and consing of B. Note: if a function calls -;;; itself recursively, the time spent in the inner call(s) may -;;; be counted several times. -;;; o If :exclusive, the information excludes time attributed to -;;; calls to other monitored functions. This is the default. -;;; - THRESHOLD specifies that only functions which have been executed -;;; more than threshold percent of the time will be reported. Defaults -;;; to 1%. If a threshold of 0 is specified, all functions are listed, -;;; even those with 0 or negative running times (see note on overhead). -;;; - KEY specifies that the table be sorted by one of the following -;;; sort keys: -;;; :function alphabetically by function name -;;; :percent-time by percent of total execution time -;;; :percent-cons by percent of total consing -;;; :calls by number of times the function was called -;;; :time-per-call by average execution time per function -;;; :cons-per-call by average consing per function -;;; :time same as :percent-time -;;; :cons same as :percent-cons -;;; -;;; REPORT &key (names :all) [Function] -;;; (nested :exclusive) -;;; (threshold 0.01) -;;; (sort-key :percent-time) -;;; (ignore-no-calls nil) -;;; -;;; Same as REPORT-MONITORING but we use a nicer keyword interface. -;;; -;;; DISPLAY-MONITORING-RESULTS &optional (threshold 0.01) [Function] -;;; (key :percent-time) -;;; Prints a table showing for each named function: -;;; - the total CPU time used in that function for all calls -;;; - the total number of bytes consed in that function for all calls -;;; - the total number of calls -;;; - the average amount of CPU time per call -;;; - the average amount of consing per call -;;; - the percent of total execution time spent executing that function -;;; - the percent of total consing spent consing in that function -;;; Summary totals of the CPU time, consing, and calls columns are printed. -;;; An estimate of the monitoring overhead is also printed. May be run -;;; even after unmonitoring all the functions, to play with the data. -;;; -;;; SAMPLE TABLE: -#| - Cons - % % Per Total Total -Function Time Cons Calls Sec/Call Call Time Cons ----------------------------------------------------------------------- -FIND-ROLE: 0.58 0.00 136 0.003521 0 0.478863 0 -GROUP-ROLE: 0.35 0.00 365 0.000802 0 0.292760 0 -GROUP-PROJECTOR: 0.05 0.00 102 0.000408 0 0.041648 0 -FEATURE-P: 0.02 0.00 570 0.000028 0 0.015680 0 ----------------------------------------------------------------------- -TOTAL: 1173 0.828950 0 -Estimated total monitoring overhead: 0.88 seconds -|# - -;;; **************************************************************** -;;; METERING ******************************************************* -;;; **************************************************************** - -;;; ******************************** -;;; Warn people using the wrong Lisp -;;; ******************************** - -#-(or clisp openmcl) -(warn "metering.lisp does not support your Lisp implementation!") - -;;; ******************************** -;;; Packages *********************** -;;; ******************************** - -;;; For CLtL2 compatible lisps - -(defpackage "SWANK-MONITOR" (:use "COMMON-LISP") - (:export "*MONITORED-FUNCTIONS*" - "MONITOR" "MONITOR-ALL" "UNMONITOR" "MONITOR-FORM" - "WITH-MONITORING" - "RESET-MONITORING-INFO" "RESET-ALL-MONITORING" - "MONITORED" - "REPORT-MONITORING" - "DISPLAY-MONITORING-RESULTS" - "MONITORING-ENCAPSULATE" "MONITORING-UNENCAPSULATE" - "REPORT")) -(in-package "SWANK-MONITOR") - -;;; Warn user if they're loading the source instead of compiling it first. -(eval-when (eval) - (warn "This file should be compiled before loading for best results.")) - -;;; ******************************** -;;; Version ************************ -;;; ******************************** - -(defparameter *metering-version* "v2.1 25-JAN-94" - "Current version number/date for Metering.") - - -;;; **************************************************************** -;;; Implementation Dependent Definitions *************************** -;;; **************************************************************** - -;;; ******************************** -;;; Timing Functions *************** -;;; ******************************** -;;; The get-time function is called to find the total number of ticks since -;;; the beginning of time. time-units-per-second allows us to convert units -;;; to seconds. - -#-(or clisp openmcl) -(eval-when (compile eval) - (warn - "You may want to supply implementation-specific get-time functions.")) - -(defconstant time-units-per-second internal-time-units-per-second) - -#+openmcl -(progn - (deftype time-type () 'unsigned-byte) - (deftype consing-type () 'unsigned-byte)) - -(defmacro get-time () - `(the time-type (get-internal-run-time))) - -;;; NOTE: In Macintosh Common Lisp, CCL::GCTIME returns the number of -;;; milliseconds spent during GC. We could subtract this from -;;; the value returned by get-internal-run-time to eliminate -;;; the effect of GC on the timing values, but we prefer to let -;;; the user run without GC on. If the application is so big that -;;; it requires GC to complete, then the GC times are part of the -;;; cost of doing business, and will average out in the long run. -;;; If it seems really important to a user that GC times not be -;;; counted, then uncomment the following three lines and read-time -;;; conditionalize the definition of get-time above with #-:openmcl. -;#+openmcl -;(defmacro get-time () -; `(the time-type (- (get-internal-run-time) (ccl:gctime)))) - -;;; ******************************** -;;; Consing Functions ************** -;;; ******************************** -;;; The get-cons macro is called to find the total number of bytes -;;; consed since the beginning of time. - -#+clisp -(defun get-cons () - (multiple-value-bind (real1 real2 run1 run2 gc1 gc2 space1 space2 gccount) - (sys::%%time) - (declare (ignore real1 real2 run1 run2 gc1 gc2 gccount)) - (dpb space1 (byte 24 24) space2))) - -;;; Macintosh Common Lisp 2.0 -;;; Note that this includes bytes that were allocated during GC. -;;; We could subtract this out by advising GC like we did under -;;; MCL 1.3.2, but I'd rather users ran without GC. If they can't -;;; run without GC, then the bytes consed during GC are a cost of -;;; running their program. Metering the code a few times will -;;; avoid the consing values being too lopsided. If a user really really -;;; wants to subtract out the consing during GC, replace the following -;;; two lines with the commented out code. -#+openmcl -(defmacro get-cons () `(the consing-type (ccl::total-bytes-allocated))) - -#-(or clisp openmcl) -(progn - (eval-when (compile eval) - (warn "No consing will be reported unless a get-cons function is ~ - defined.")) - - (defmacro get-cons () '(the consing-type 0))) - -;; actually, neither `get-cons' nor `get-time' are used as is, -;; but only in the following macro `with-time/cons' -#-:clisp -(defmacro with-time/cons ((delta-time delta-cons) form &body post-process) - (let ((start-cons (gensym "START-CONS-")) - (start-time (gensym "START-TIME-"))) - `(let ((,start-time (get-time)) (,start-cons (get-cons))) - (declare (type time-type ,start-time) - (type consing-type ,start-cons)) - (multiple-value-prog1 ,form - (let ((,delta-time (- (get-time) ,start-time)) - (,delta-cons (- (get-cons) ,start-cons))) - ,@post-process))))) - -#+clisp -(progn - (defmacro delta4 (nv1 nv2 ov1 ov2 by) - `(- (dpb (- ,nv1 ,ov1) (byte ,by ,by) ,nv2) ,ov2)) - - (let ((del (find-symbol "DELTA4" "SYS"))) - (when del (setf (fdefinition 'delta4) (fdefinition del)))) - - (if (< internal-time-units-per-second 1000000) - ;; TIME_1: AMIGA, OS/2, UNIX_TIMES - (defmacro delta4-time (new-time1 new-time2 old-time1 old-time2) - `(delta4 ,new-time1 ,new-time2 ,old-time1 ,old-time2 16)) - ;; TIME_2: other UNIX, WIN32 - (defmacro delta4-time (new-time1 new-time2 old-time1 old-time2) - `(+ (* (- ,new-time1 ,old-time1) internal-time-units-per-second) - (- ,new-time2 ,old-time2)))) - - (defmacro delta4-cons (new-cons1 new-cons2 old-cons1 old-cons2) - `(delta4 ,new-cons1 ,new-cons2 ,old-cons1 ,old-cons2 24)) - - ;; avoid consing: when the application conses a lot, - ;; get-cons may return a bignum, so we really should not use it. - (defmacro with-time/cons ((delta-time delta-cons) form &body post-process) - (let ((beg-cons1 (gensym "BEG-CONS1-")) (end-cons1 (gensym "END-CONS1-")) - (beg-cons2 (gensym "BEG-CONS2-")) (end-cons2 (gensym "END-CONS2-")) - (beg-time1 (gensym "BEG-TIME1-")) (end-time1 (gensym "END-TIME1-")) - (beg-time2 (gensym "BEG-TIME2-")) (end-time2 (gensym "END-TIME2-")) - (re1 (gensym)) (re2 (gensym)) (gc1 (gensym)) (gc2 (gensym))) - `(multiple-value-bind (,re1 ,re2 ,beg-time1 ,beg-time2 - ,gc1 ,gc2 ,beg-cons1 ,beg-cons2) - (sys::%%time) - (declare (ignore ,re1 ,re2 ,gc1 ,gc2)) - (multiple-value-prog1 ,form - (multiple-value-bind (,re1 ,re2 ,end-time1 ,end-time2 - ,gc1 ,gc2 ,end-cons1 ,end-cons2) - (sys::%%time) - (declare (ignore ,re1 ,re2 ,gc1 ,gc2)) - (let ((,delta-time (delta4-time ,end-time1 ,end-time2 - ,beg-time1 ,beg-time2)) - (,delta-cons (delta4-cons ,end-cons1 ,end-cons2 - ,beg-cons1 ,beg-cons2))) - ,@post-process))))))) - -;;; ******************************** -;;; Required Arguments ************* -;;; ******************************** -;;; -;;; Required (Fixed) vs Optional Args -;;; -;;; To avoid unnecessary consing in the "encapsulation" code, we find out the -;;; number of required arguments, and use &rest to capture only non-required -;;; arguments. The function Required-Arguments returns two values: the first -;;; is the number of required arguments, and the second is T iff there are any -;;; non-required arguments (e.g. &optional, &rest, &key). - -;;; Lucid, Allegro, and Macintosh Common Lisp -#+openmcl -(defun required-arguments (name) - (let* ((function (symbol-function name)) - (args (ccl:arglist function)) - (pos (position-if #'(lambda (x) - (and (symbolp x) - (let ((name (symbol-name x))) - (and (>= (length name) 1) - (char= (schar name 0) - #\&))))) - args))) - (if pos - (values pos t) - (values (length args) nil)))) - -#+clisp -(defun required-arguments (name) - (multiple-value-bind (name req-num opt-num rest-p key-p keywords allow-p) - (sys::function-signature name t) - (if name ; no error - (values req-num (or (/= 0 opt-num) rest-p key-p keywords allow-p)) - (values 0 t)))) - -#-(or clisp openmcl) -(progn - (eval-when (compile eval) - (warn - "You may want to add an implementation-specific ~ -Required-Arguments function.")) - (eval-when (load eval) - (defun required-arguments (name) - (declare (ignore name)) - (values 0 t)))) - -#| -;;;Examples -(defun square (x) (* x x)) -(defun square2 (x &optional y) (* x x y)) -(defun test (x y &optional (z 3)) 3) -(defun test2 (x y &optional (z 3) &rest fred) 3) - -(required-arguments 'square) => 1 nil -(required-arguments 'square2) => 1 t -(required-arguments 'test) => 2 t -(required-arguments 'test2) => 2 t -|# - - -;;; **************************************************************** -;;; Main METERING Code ********************************************* -;;; **************************************************************** - -;;; ******************************** -;;; Global Variables *************** -;;; ******************************** -(defvar *MONITOR-TIME-OVERHEAD* nil - "The amount of time an empty monitored function costs.") -(defvar *MONITOR-CONS-OVERHEAD* nil - "The amount of cons an empty monitored function costs.") - -(defvar *TOTAL-TIME* 0 - "Total amount of time monitored so far.") -(defvar *TOTAL-CONS* 0 - "Total amount of consing monitored so far.") -(defvar *TOTAL-CALLS* 0 - "Total number of calls monitored so far.") -(proclaim '(type time-type *total-time*)) -(proclaim '(type consing-type *total-cons*)) -(proclaim '(fixnum *total-calls*)) - -;;; ******************************** -;;; Accessor Functions ************* -;;; ******************************** -;;; Perhaps the SYMBOLP should be FBOUNDP? I.e., what about variables -;;; containing closures. -(defmacro PLACE-FUNCTION (function-place) - "Return the function found at FUNCTION-PLACE. Evals FUNCTION-PLACE -if it isn't a symbol, to allow monitoring of closures located in -variables/arrays/structures." - ;; Note that (fboundp 'fdefinition) returns T even if fdefinition - ;; is a macro, which is what we want. - (if (fboundp 'fdefinition) - `(if (fboundp ,function-place) - (fdefinition ,function-place) - (eval ,function-place)) - `(if (symbolp ,function-place) - (symbol-function ,function-place) - (eval ,function-place)))) - -(defsetf PLACE-FUNCTION (function-place) (function) - "Set the function in FUNCTION-PLACE to FUNCTION." - (if (fboundp 'fdefinition) - ;; If we're conforming to CLtL2, use fdefinition here. - `(if (fboundp ,function-place) - (setf (fdefinition ,function-place) ,function) - (eval '(setf ,function-place ',function))) - `(if (symbolp ,function-place) - (setf (symbol-function ,function-place) ,function) - (eval '(setf ,function-place ',function))))) - -#| -;;; before using fdefinition -(defun PLACE-FUNCTION (function-place) - "Return the function found at FUNCTION-PLACE. Evals FUNCTION-PLACE -if it isn't a symbol, to allow monitoring of closures located in -variables/arrays/structures." - (if (symbolp function-place) - (symbol-function function-place) - (eval function-place))) - -(defsetf PLACE-FUNCTION (function-place) (function) - "Set the function in FUNCTION-PLACE to FUNCTION." - `(if (symbolp ,function-place) - (setf (symbol-function ,function-place) ,function) - (eval '(setf ,function-place ',function)))) -|# - -(defun PLACE-FBOUNDP (function-place) - "Test to see if FUNCTION-PLACE is a function." - ;; probably should be - #|(or (and (symbolp function-place)(fboundp function-place)) - (functionp (place-function function-place)))|# - (if (symbolp function-place) - (fboundp function-place) - (functionp (place-function function-place)))) - -(defun PLACE-MACROP (function-place) - "Test to see if FUNCTION-PLACE is a macro." - (when (symbolp function-place) - (macro-function function-place))) - -;;; ******************************** -;;; Measurement Tables ************* -;;; ******************************** -(defvar *monitored-functions* nil - "List of monitored symbols.") - -;;; We associate a METERING-FUNCTIONS structure with each monitored function -;;; name or other closure. This holds the functions that we call to manipulate -;;; the closure which implements the encapsulation. -;;; -(defstruct metering-functions - (name nil) - (old-definition nil :type function) - (new-definition nil :type function) - (read-metering nil :type function) - (reset-metering nil :type function)) - -;;; In general using hash tables in time-critical programs is a bad idea, -;;; because when one has to grow the table and rehash everything, the -;;; timing becomes grossly inaccurate. In this case it is not an issue -;;; because all inserting of entries in the hash table occurs before the -;;; timing commences. The only circumstance in which this could be a -;;; problem is if the lisp rehashes on the next reference to the table, -;;; instead of when the entry which forces a rehash was inserted. -;;; -;;; Note that a similar kind of problem can occur with GC, which is why -;;; one should turn off GC when monitoring code. -;;; -(defvar *monitor* (make-hash-table :test #'equal) - "Hash table in which METERING-FUNCTIONS structures are stored.") -(defun get-monitor-info (name) - (gethash name *monitor*)) -(defsetf get-monitor-info (name) (info) - `(setf (gethash ,name *monitor*) ,info)) - -(defun MONITORED (function-place) - "Test to see if a FUNCTION-PLACE is monitored." - (and (place-fboundp function-place) ; this line necessary? - (get-monitor-info function-place))) - -(defun reset-monitoring-info (name) - "Reset the monitoring info for the specified function." - (let ((finfo (get-monitor-info name))) - (when finfo - (funcall (metering-functions-reset-metering finfo))))) -(defun reset-all-monitoring () - "Reset monitoring info for all functions." - (setq *total-time* 0 - *total-cons* 0 - *total-calls* 0) - (dolist (symbol *monitored-functions*) - (when (monitored symbol) - (reset-monitoring-info symbol)))) - -(defun monitor-info-values (name &optional (nested :exclusive) warn) - "Returns monitoring information values for the named function, -adjusted for overhead." - (let ((finfo (get-monitor-info name))) - (if finfo - (multiple-value-bind (inclusive-time inclusive-cons - exclusive-time exclusive-cons - calls nested-calls) - (funcall (metering-functions-read-metering finfo)) - (unless (or (null warn) - (eq (place-function name) - (metering-functions-new-definition finfo))) - (warn "Funtion ~S has been redefined, so times may be inaccurate.~@ - MONITOR it again to record calls to the new definition." - name)) - (case nested - (:exclusive (values calls - nested-calls - (- exclusive-time - (* calls *monitor-time-overhead*)) - (- exclusive-cons - (* calls *monitor-cons-overhead*)))) - ;; In :inclusive mode, subtract overhead for all the - ;; called functions as well. Nested-calls includes the - ;; calls of the function as well. [Necessary 'cause of - ;; functions which call themselves recursively.] - (:inclusive (values calls - nested-calls - (- inclusive-time - (* nested-calls ;(+ calls) - *monitor-time-overhead*)) - (- inclusive-cons - (* nested-calls ;(+ calls) - *monitor-cons-overhead*)))))) - (values 0 0 0 0)))) - -;;; ******************************** -;;; Encapsulate ******************** -;;; ******************************** -(eval-when (compile load eval) -;; Returns a lambda expression for a function that, when called with the -;; function name, will set up that function for metering. -;; -;; A function is monitored by replacing its definition with a closure -;; created by the following function. The closure records the monitoring -;; data, and updates the data with each call of the function. -;; -;; Other closures are used to read and reset the data. -(defun make-monitoring-encapsulation (min-args optionals-p) - (let (required-args) - (dotimes (i min-args) (push (gensym) required-args)) - `(lambda (name) - (let ((inclusive-time 0) - (inclusive-cons 0) - (exclusive-time 0) - (exclusive-cons 0) - (calls 0) - (nested-calls 0) - (old-definition (place-function name))) - (declare (type time-type inclusive-time) - (type time-type exclusive-time) - (type consing-type inclusive-cons) - (type consing-type exclusive-cons) - (fixnum calls) - (fixnum nested-calls)) - (pushnew name *monitored-functions*) - - (setf (place-function name) - #'(lambda (,@required-args - ,@(when optionals-p - `(&rest optional-args))) - (let ((prev-total-time *total-time*) - (prev-total-cons *total-cons*) - (prev-total-calls *total-calls*) - ;; (old-time inclusive-time) - ;; (old-cons inclusive-cons) - ;; (old-nested-calls nested-calls) - ) - (declare (type time-type prev-total-time) - (type consing-type prev-total-cons) - (fixnum prev-total-calls)) - (with-time/cons (delta-time delta-cons) - ;; form - ,(if optionals-p - `(apply old-definition - ,@required-args optional-args) - `(funcall old-definition ,@required-args)) - ;; post-processing: - ;; Calls - (incf calls) - (incf *total-calls*) - ;; nested-calls includes this call - (incf nested-calls (the fixnum - (- *total-calls* - prev-total-calls))) - ;; (setf nested-calls (+ old-nested-calls - ;; (- *total-calls* - ;; prev-total-calls))) - ;; Time - ;; Problem with inclusive time is that it - ;; currently doesn't add values from recursive - ;; calls to the same function. Change the - ;; setf to an incf to fix this? - (incf inclusive-time (the time-type delta-time)) - ;; (setf inclusive-time (+ delta-time old-time)) - (incf exclusive-time (the time-type - (+ delta-time - (- prev-total-time - *total-time*)))) - (setf *total-time* (the time-type - (+ delta-time - prev-total-time))) - ;; Consing - (incf inclusive-cons (the consing-type delta-cons)) - ;; (setf inclusive-cons (+ delta-cons old-cons)) - (incf exclusive-cons (the consing-type - (+ delta-cons - (- prev-total-cons - *total-cons*)))) - (setf *total-cons* - (the consing-type - (+ delta-cons prev-total-cons))))))) - (setf (get-monitor-info name) - (make-metering-functions - :name name - :old-definition old-definition - :new-definition (place-function name) - :read-metering #'(lambda () - (values inclusive-time - inclusive-cons - exclusive-time - exclusive-cons - calls - nested-calls)) - :reset-metering #'(lambda () - (setq inclusive-time 0 - inclusive-cons 0 - exclusive-time 0 - exclusive-cons 0 - calls 0 - nested-calls 0) - t))))))) -);; End of EVAL-WHEN - -;;; For efficiency reasons, we precompute the encapsulation functions -;;; for a variety of combinations of argument structures -;;; (min-args . optional-p). These are stored in the following hash table -;;; along with any new ones we encounter. Since we're now precomputing -;;; closure functions for common argument signatures, this eliminates -;;; the former need to call COMPILE for each monitored function. -(eval-when (compile eval) - (defconstant precomputed-encapsulations 8)) - -(defvar *existing-encapsulations* (make-hash-table :test #'equal)) -(defun find-encapsulation (min-args optionals-p) - (or (gethash (cons min-args optionals-p) *existing-encapsulations*) - (setf (gethash (cons min-args optionals-p) *existing-encapsulations*) - (compile nil - (make-monitoring-encapsulation min-args optionals-p))))) - -(macrolet ((frob () - (let ((res ())) - (dotimes (i precomputed-encapsulations) - (push `(setf (gethash '(,i . nil) *existing-encapsulations*) - #',(make-monitoring-encapsulation i nil)) - res) - (push `(setf (gethash '(,i . t) *existing-encapsulations*) - #',(make-monitoring-encapsulation i t)) - res)) - `(progn ,@res)))) - (frob)) - -(defun monitoring-encapsulate (name &optional warn) - "Monitor the function Name. If already monitored, unmonitor first." - ;; Saves the current definition of name and inserts a new function which - ;; returns the result of evaluating body. - (cond ((not (place-fboundp name)) ; not a function - (when warn - (warn "Ignoring undefined function ~S." name))) - ((place-macrop name) ; a macro - (when warn - (warn "Ignoring macro ~S." name))) - (t ; tis a function - (when (get-monitor-info name) ; monitored - (when warn - (warn "~S already monitored, so unmonitoring it first." name)) - (monitoring-unencapsulate name)) - (multiple-value-bind (min-args optionals-p) - (required-arguments name) - (funcall (find-encapsulation min-args optionals-p) name))))) - -(defun monitoring-unencapsulate (name &optional warn) - "Removes monitoring encapsulation code from around Name." - (let ((finfo (get-monitor-info name))) - (when finfo ; monitored - (remprop name 'metering-functions) - (setq *monitored-functions* - (remove name *monitored-functions* :test #'equal)) - (if (eq (place-function name) - (metering-functions-new-definition finfo)) - (setf (place-function name) - (metering-functions-old-definition finfo)) - (when warn - (warn "Preserving current definition of redefined function ~S." - name)))))) - -;;; ******************************** -;;; Main Monitoring Functions ****** -;;; ******************************** -(defmacro MONITOR (&rest names) - "Monitor the named functions. As in TRACE, the names are not evaluated. - If a function is already monitored, then unmonitor and remonitor (useful - to notice function redefinition). If a name is undefined, give a warning - and ignore it. See also unmonitor, report-monitoring, - display-monitoring-results and reset-time." - `(progn - ,@(mapcar #'(lambda (name) `(monitoring-encapsulate ',name)) names) - *monitored-functions*)) - -(defmacro UNMONITOR (&rest names) - "Remove the monitoring on the named functions. - Names defaults to the list of all currently monitored functions." - `(dolist (name ,(if names `',names '*monitored-functions*) (values)) - (monitoring-unencapsulate name))) - -(defun MONITOR-ALL (&optional (package *package*)) - "Monitor all functions in the specified package." - (let ((package (if (packagep package) - package - (find-package package)))) - (do-symbols (symbol package) - (when (eq (symbol-package symbol) package) - (monitoring-encapsulate symbol))))) - -(defmacro MONITOR-FORM (form - &optional (nested :exclusive) (threshold 0.01) - (key :percent-time)) - "Monitor the execution of all functions in the current package -during the execution of FORM. All functions that are executed above -THRESHOLD % will be reported." - `(unwind-protect - (progn - (monitor-all) - (reset-all-monitoring) - (prog1 - (time ,form) - (report-monitoring :all ,nested ,threshold ,key :ignore-no-calls))) - (unmonitor))) - -(defmacro WITH-MONITORING ((&rest functions) - (&optional (nested :exclusive) - (threshold 0.01) - (key :percent-time)) - &body body) - "Monitor the specified functions during the execution of the body." - `(unwind-protect - (progn - (dolist (fun ',functions) - (monitoring-encapsulate fun)) - (reset-all-monitoring) - ,@body - (report-monitoring :all ,nested ,threshold ,key)) - (unmonitor))) - -;;; ******************************** -;;; Overhead Calculations ********** -;;; ******************************** -(defconstant overhead-iterations 5000 - "Number of iterations over which the timing overhead is averaged.") - -;;; Perhaps this should return something to frustrate clever compilers. -(defun STUB-FUNCTION (x) - (declare (ignore x)) - nil) -(proclaim '(notinline stub-function)) - -(defun SET-MONITOR-OVERHEAD () - "Determines the average overhead of monitoring by monitoring the execution -of an empty function many times." - (setq *monitor-time-overhead* 0 - *monitor-cons-overhead* 0) - (stub-function nil) - (monitor stub-function) - (reset-all-monitoring) - (let ((overhead-function (symbol-function 'stub-function))) - (dotimes (x overhead-iterations) - (funcall overhead-function overhead-function))) -; (dotimes (x overhead-iterations) -; (stub-function nil)) - (let ((fiter (float overhead-iterations))) - (multiple-value-bind (calls nested-calls time cons) - (monitor-info-values 'stub-function) - (declare (ignore calls nested-calls)) - (setq *monitor-time-overhead* (/ time fiter) - *monitor-cons-overhead* (/ cons fiter)))) - (unmonitor stub-function)) -(set-monitor-overhead) - -;;; ******************************** -;;; Report Data ******************** -;;; ******************************** -(defvar *monitor-results* nil - "A table of monitoring statistics is stored here.") -(defvar *no-calls* nil - "A list of monitored functions which weren't called.") -(defvar *estimated-total-overhead* 0) -;; (proclaim '(type time-type *estimated-total-overhead*)) - -(defstruct (monitoring-info - (:conc-name m-info-) - (:constructor make-monitoring-info - (name calls time cons - percent-time percent-cons - time-per-call cons-per-call))) - name - calls - time - cons - percent-time - percent-cons - time-per-call - cons-per-call) - -(defun REPORT (&key (names :all) - (nested :exclusive) - (threshold 0.01) - (sort-key :percent-time) - (ignore-no-calls nil)) - "Same as REPORT-MONITORING but with a nicer keyword interface" - (declare (type (member :function :percent-time :time :percent-cons - :cons :calls :time-per-call :cons-per-call) - sort-key) - (type (member :inclusive :exclusive) nested)) - (report-monitoring names nested threshold sort-key ignore-no-calls)) - -(defun REPORT-MONITORING (&optional names - (nested :exclusive) - (threshold 0.01) - (key :percent-time) - ignore-no-calls) - "Report the current monitoring state. -The percentage of the total time spent executing unmonitored code -in each function (:exclusive mode), or total time (:inclusive mode) -will be printed together with the number of calls and -the unmonitored time per call. Functions that have been executed -below THRESHOLD % of the time will not be reported. To report on all -functions set NAMES to be either NIL or :ALL." - (when (or (null names) (eq names :all)) (setq names *monitored-functions*)) - - (let ((total-time 0) - (total-cons 0) - (total-calls 0)) - ;; Compute overall time and consing. - (dolist (name names) - (multiple-value-bind (calls nested-calls time cons) - (monitor-info-values name nested :warn) - (declare (ignore nested-calls)) - (incf total-calls calls) - (incf total-time time) - (incf total-cons cons))) - ;; Total overhead. - (setq *estimated-total-overhead* - (/ (* *monitor-time-overhead* total-calls) - time-units-per-second)) - ;; Assemble data for only the specified names (all monitored functions) - (if (zerop total-time) - (format *trace-output* "Not enough execution time to monitor.") - (progn - (setq *monitor-results* nil *no-calls* nil) - (dolist (name names) - (multiple-value-bind (calls nested-calls time cons) - (monitor-info-values name nested) - (declare (ignore nested-calls)) - (when (minusp time) (setq time 0.0)) - (when (minusp cons) (setq cons 0.0)) - (if (zerop calls) - (push (if (symbolp name) - (symbol-name name) - (format nil "~S" name)) - *no-calls*) - (push (make-monitoring-info - (format nil "~S" name) ; name - calls ; calls - (/ time (float time-units-per-second)) ; time in secs - (round cons) ; consing - (/ time (float total-time)) ; percent-time - (if (zerop total-cons) 0 - (/ cons (float total-cons))) ; percent-cons - (/ (/ time (float calls)) ; time-per-call - time-units-per-second) ; sec/call - (round (/ cons (float calls)))) ; cons-per-call - *monitor-results*)))) - (display-monitoring-results threshold key ignore-no-calls))))) - -(defun display-monitoring-results (&optional (threshold 0.01) - (key :percent-time) - (ignore-no-calls t)) - (let ((max-length 8) ; Function header size - (max-cons-length 8) - (total-time 0.0) - (total-consed 0) - (total-calls 0) - (total-percent-time 0) - (total-percent-cons 0)) - (sort-results key) - (dolist (result *monitor-results*) - (when (or (zerop threshold) - (> (m-info-percent-time result) threshold)) - (setq max-length - (max max-length - (length (m-info-name result)))) - (setq max-cons-length - (max max-cons-length - (m-info-cons-per-call result))))) - (incf max-length 2) - (setf max-cons-length (+ 2 (ceiling (log max-cons-length 10)))) - (format *trace-output* - "~%~%~ - ~VT ~VA~ - ~% ~VT % % ~VA ~ -Total Total~ - ~%Function~VT Time Cons Calls Sec/Call ~VA ~ -Time Cons~ - ~%~V,,,'-A" - max-length - max-cons-length "Cons" - max-length - max-cons-length "Per" - max-length - max-cons-length "Call" - (+ max-length 62 (max 0 (- max-cons-length 5))) "-") - (dolist (result *monitor-results*) - (when (or (zerop threshold) - (> (m-info-percent-time result) threshold)) - (format *trace-output* - "~%~A:~VT~6,2F ~6,2F ~7D ~,6F ~VD ~8,3F ~10D" - (m-info-name result) - max-length - (* 100 (m-info-percent-time result)) - (* 100 (m-info-percent-cons result)) - (m-info-calls result) - (m-info-time-per-call result) - max-cons-length - (m-info-cons-per-call result) - (m-info-time result) - (m-info-cons result)) - (incf total-time (m-info-time result)) - (incf total-consed (m-info-cons result)) - (incf total-calls (m-info-calls result)) - (incf total-percent-time (m-info-percent-time result)) - (incf total-percent-cons (m-info-percent-cons result)))) - (format *trace-output* - "~%~V,,,'-A~ - ~%TOTAL:~VT~6,2F ~6,2F ~7D ~9@T ~VA ~8,3F ~10D~ - ~%Estimated monitoring overhead: ~5,2F seconds~ - ~%Estimated total monitoring overhead: ~5,2F seconds" - (+ max-length 62 (max 0 (- max-cons-length 5))) "-" - max-length - (* 100 total-percent-time) - (* 100 total-percent-cons) - total-calls - max-cons-length " " - total-time total-consed - (/ (* *monitor-time-overhead* total-calls) - time-units-per-second) - *estimated-total-overhead*) - (when (and (not ignore-no-calls) *no-calls*) - (setq *no-calls* (sort *no-calls* #'string<)) - (let ((num-no-calls (length *no-calls*))) - (if (> num-no-calls 20) - (format *trace-output* - "~%~@(~r~) monitored functions were not called. ~ - ~%See the variable swank-monitor::*no-calls* for a list." - num-no-calls) - (format *trace-output* - "~%The following monitored functions were not called:~ - ~%~{~<~%~:; ~A~>~}~%" - *no-calls*)))) - (values))) - -(defun sort-results (&optional (key :percent-time)) - (setq *monitor-results* - (case key - (:function (sort *monitor-results* #'string> - :key #'m-info-name)) - ((:percent-time :time) (sort *monitor-results* #'> - :key #'m-info-time)) - ((:percent-cons :cons) (sort *monitor-results* #'> - :key #'m-info-cons)) - (:calls (sort *monitor-results* #'> - :key #'m-info-calls)) - (:time-per-call (sort *monitor-results* #'> - :key #'m-info-time-per-call)) - (:cons-per-call (sort *monitor-results* #'> - :key #'m-info-cons-per-call))))) - -;;; *END OF FILE* - - diff --git a/elpa/slime-20200414.1444/nregex.lisp b/elpa/slime-20200414.1444/nregex.lisp deleted file mode 100644 index 43586efe..00000000 --- a/elpa/slime-20200414.1444/nregex.lisp +++ /dev/null @@ -1,523 +0,0 @@ -;;; -;;; This code was written by: -;;; -;;; Lawrence E. Freil -;;; National Science Center Foundation -;;; Augusta, Georgia 30909 -;;; -;;; This program was released into the public domain on 2005-08-31. -;;; (See the slime-devel mailing list archive for details.) -;;; -;;; nregex.lisp - My 4/8/92 attempt at a Lisp based regular expression -;;; parser. -;;; -;;; This regular expression parser operates by taking a -;;; regular expression and breaking it down into a list -;;; consisting of lisp expressions and flags. The list -;;; of lisp expressions is then taken in turned into a -;;; lambda expression that can be later applied to a -;;; string argument for parsing. -;;;; -;;;; Modifications made 6 March 2001 By Chris Double (chris@double.co.nz) -;;;; to get working with Corman Lisp 1.42, add package statement and export -;;;; relevant functions. -;;;; - -(in-package :cl-user) - -;; Renamed to slime-nregex avoid name clashes with other versions of -;; this file. -- he - -;;;; CND - 6/3/2001 -(defpackage slime-nregex - (:use #:common-lisp) - (:export - #:regex - #:regex-compile - )) - -;;;; CND - 6/3/2001 -(in-package :slime-nregex) - -;;; -;;; First we create a copy of macros to help debug the beast -(eval-when (:compile-toplevel :load-toplevel :execute) -(defvar *regex-debug* nil) ; Set to nil for no debugging code -) - -(defmacro info (message &rest args) - (if *regex-debug* - `(format *standard-output* ,message ,@args))) - -;;; -;;; Declare the global variables for storing the paren index list. -;;; -(defvar *regex-groups* (make-array 10)) -(defvar *regex-groupings* 0) - -;;; -;;; Declare a simple interface for testing. You probably wouldn't want -;;; to use this interface unless you were just calling this once. -;;; -(defun regex (expression string) - "Usage: (regex &optional invert) - Returns either the quoted character or a simple bit vector of bits set for - the matching values" - (let ((first (char char-string 0)) - (result (char char-string 0)) - (used-length 1)) - (cond ((eql first #\n) - (setf result #\NewLine)) - ((eql first #\c) - (setf result #\Return)) - ((eql first #\t) - (setf result #\Tab)) - ((eql first #\d) - (setf result #*0000000000000000000000000000000000000000000000001111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)) - ((eql first #\D) - (setf result #*1111111111111111111111111111111111111111111111110000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)) - ((eql first #\w) - (setf result #*0000000000000000000000000000000000000000000000001111111111000000011111111111111111111111111000010111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)) - ((eql first #\W) - (setf result #*1111111111111111111111111111111111111111111111110000000000111111100000000000000000000000000111101000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)) - ((eql first #\b) - (setf result #*0000000001000000000000000000000011000000000010100000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)) - ((eql first #\B) - (setf result #*1111111110111111111111111111111100111111111101011111111111011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)) - ((eql first #\s) - (setf result #*0000000001100000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)) - ((eql first #\S) - (setf result #*1111111110011111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)) - ((and (>= (char-code first) (char-code #\0)) - (<= (char-code first) (char-code #\9))) - (if (and (> (length char-string) 2) - (and (>= (char-code (char char-string 1)) (char-code #\0)) - (<= (char-code (char char-string 1)) (char-code #\9)) - (>= (char-code (char char-string 2)) (char-code #\0)) - (<= (char-code (char char-string 2)) (char-code #\9)))) - ;; - ;; It is a single character specified in octal - ;; - (progn - (setf result (do ((x 0 (1+ x)) - (return 0)) - ((= x 2) return) - (setf return (+ (* return 8) - (- (char-code (char char-string x)) - (char-code #\0)))))) - (setf used-length 3)) - ;; - ;; We have a group number replacement. - ;; - (let ((group (- (char-code first) (char-code #\0)))) - (setf result `((let ((nstring (subseq string (car (aref *regex-groups* ,group)) - (cadr (aref *regex-groups* ,group))))) - (if (< length (+ index (length nstring))) - (return-from compare nil)) - (if (not (string= string nstring - :start1 index - :end1 (+ index (length nstring)))) - (return-from compare nil) - (incf index (length nstring))))))))) - (t - (setf result first))) - (if (and (vectorp result) invert) - (bit-xor result #*1111111110011111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 t)) - (values result used-length))) - -;;; -;;; Now for the main regex compiler routine. -;;; -(defun regex-compile (source &key (anchored nil)) - "Usage: (regex-compile [ :anchored (t/nil) ]) - This function take a regular expression (supplied as source) and - compiles this into a lambda list that a string argument can then - be applied to. It is also possible to compile this lambda list - for better performance or to save it as a named function for later - use" - (info "Now entering regex-compile with \"~A\"~%" source) - ;; - ;; This routine works in two parts. - ;; The first pass take the regular expression and produces a list of - ;; operators and lisp expressions for the entire regular expression. - ;; The second pass takes this list and produces the lambda expression. - (let ((expression '()) ; holder for expressions - (group 1) ; Current group index - (group-stack nil) ; Stack of current group endings - (result nil) ; holder for built expression. - (fast-first nil)) ; holder for quick unanchored scan - ;; - ;; If the expression was an empty string then it alway - ;; matches (so lets leave early) - ;; - (if (= (length source) 0) - (return-from regex-compile - '(lambda (&rest args) - (declare (ignore args)) - t))) - ;; - ;; If the first character is a caret then set the anchored - ;; flags and remove if from the expression string. - ;; - (cond ((eql (char source 0) #\^) - (setf source (subseq source 1)) - (setf anchored t))) - ;; - ;; If the first sequence is .* then also set the anchored flags. - ;; (This is purely for optimization, it will work without this). - ;; - (if (>= (length source) 2) - (if (string= source ".*" :start1 0 :end1 2) - (setf anchored t))) - ;; - ;; Also, If this is not an anchored search and the first character is - ;; a literal, then do a quick scan to see if it is even in the string. - ;; If not then we can issue a quick nil, - ;; otherwise we can start the search at the matching character to skip - ;; the checks of the non-matching characters anyway. - ;; - ;; If I really wanted to speed up this section of code it would be - ;; easy to recognize the case of a fairly long multi-character literal - ;; and generate a Boyer-Moore search for the entire literal. - ;; - ;; I generate the code to do a loop because on CMU Lisp this is about - ;; twice as fast a calling position. - ;; - (if (and (not anchored) - (not (position (char source 0) *regex-special-chars*)) - (not (and (> (length source) 1) - (position (char source 1) *regex-special-chars*)))) - (setf fast-first `((if (not (dotimes (i length nil) - (if (eql (char string i) - ,(char source 0)) - (return (setf start i))))) - (return-from final-return nil))))) - ;; - ;; Generate the very first expression to save the starting index - ;; so that group 0 will be the entire string matched always - ;; - (add-exp '((setf (aref *regex-groups* 0) - (list index nil)))) - ;; - ;; Loop over each character in the regular expression building the - ;; expression list as we go. - ;; - (do ((eindex 0 (1+ eindex))) - ((= eindex (length source))) - (let ((current (char source eindex))) - (info "Now processing character ~A index = ~A~%" current eindex) - (case current - ((#\.) - ;; - ;; Generate code for a single wild character - ;; - (add-exp '((if (>= index length) - (return-from compare nil) - (incf index))))) - ((#\$) - ;; - ;; If this is the last character of the expression then - ;; anchor the end of the expression, otherwise let it slide - ;; as a standard character (even though it should be quoted). - ;; - (if (= eindex (1- (length source))) - (add-exp '((if (not (= index length)) - (return-from compare nil)))) - (add-exp '((if (not (and (< index length) - (eql (char string index) #\$))) - (return-from compare nil) - (incf index)))))) - ((#\*) - (add-exp '(ASTRISK))) - - ((#\+) - (add-exp '(PLUS))) - - ((#\?) - (add-exp '(QUESTION))) - - ((#\() - ;; - ;; Start a grouping. - ;; - (incf group) - (push group group-stack) - (add-exp `((setf (aref *regex-groups* ,(1- group)) - (list index nil)))) - (add-exp `(,group))) - ((#\)) - ;; - ;; End a grouping - ;; - (let ((group (pop group-stack))) - (add-exp `((setf (cadr (aref *regex-groups* ,(1- group))) - index))) - (add-exp `(,(- group))))) - ((#\[) - ;; - ;; Start of a range operation. - ;; Generate a bit-vector that has one bit per possible character - ;; and then on each character or range, set the possible bits. - ;; - ;; If the first character is carat then invert the set. - (let* ((invert (eql (char source (1+ eindex)) #\^)) - (bitstring (make-array 256 :element-type 'bit - :initial-element - (if invert 1 0))) - (set-char (if invert 0 1))) - (if invert (incf eindex)) - (do ((x (1+ eindex) (1+ x))) - ((eql (char source x) #\]) (setf eindex x)) - (info "Building range with character ~A~%" (char source x)) - (cond ((and (eql (char source (1+ x)) #\-) - (not (eql (char source (+ x 2)) #\]))) - (if (>= (char-code (char source x)) - (char-code (char source (+ 2 x)))) - (error "Invalid range \"~A-~A\". Ranges must be in acending order" - (char source x) (char source (+ 2 x)))) - (do ((j (char-code (char source x)) (1+ j))) - ((> j (char-code (char source (+ 2 x)))) - (incf x 2)) - (info "Setting bit for char ~A code ~A~%" (code-char j) j) - (setf (sbit bitstring j) set-char))) - (t - (cond ((not (eql (char source x) #\])) - (let ((char (char source x))) - ;; - ;; If the character is quoted then find out what - ;; it should have been - ;; - (if (eql (char source x) #\\ ) - (let ((length)) - (multiple-value-setq (char length) - (regex-quoted (subseq source x) invert)) - (incf x length))) - (info "Setting bit for char ~A code ~A~%" char (char-code char)) - (if (not (vectorp char)) - (setf (sbit bitstring (char-code (char source x))) set-char) - (bit-ior bitstring char t)))))))) - (add-exp `((let ((range ,bitstring)) - (if (>= index length) - (return-from compare nil)) - (if (= 1 (sbit range (char-code (char string index)))) - (incf index) - (return-from compare nil))))))) - ((#\\ ) - ;; - ;; Intreprete the next character as a special, range, octal, group or - ;; just the character itself. - ;; - (let ((length) - (value)) - (multiple-value-setq (value length) - (regex-quoted (subseq source (1+ eindex)) nil)) - (cond ((listp value) - (add-exp value)) - ((characterp value) - (add-exp `((if (not (and (< index length) - (eql (char string index) - ,value))) - (return-from compare nil) - (incf index))))) - ((vectorp value) - (add-exp `((let ((range ,value)) - (if (>= index length) - (return-from compare nil)) - (if (= 1 (sbit range (char-code (char string index)))) - (incf index) - (return-from compare nil))))))) - (incf eindex length))) - (t - ;; - ;; We have a literal character. - ;; Scan to see how many we have and if it is more than one - ;; generate a string= verses as single eql. - ;; - (let* ((lit "") - (term (dotimes (litindex (- (length source) eindex) nil) - (let ((litchar (char source (+ eindex litindex)))) - (if (position litchar *regex-special-chars*) - (return litchar) - (progn - (info "Now adding ~A index ~A to lit~%" litchar - litindex) - (setf lit (concatenate 'string lit - (string litchar))))))))) - (if (= (length lit) 1) - (add-exp `((if (not (and (< index length) - (eql (char string index) ,current))) - (return-from compare nil) - (incf index)))) - ;; - ;; If we have a multi-character literal then we must - ;; check to see if the next character (if there is one) - ;; is an astrisk or a plus or a question mark. If so then we must not use this - ;; character in the big literal. - (progn - (if (or (eql term #\*) - (eql term #\+) - (eql term #\?)) - (setf lit (subseq lit 0 (1- (length lit))))) - (add-exp `((if (< length (+ index ,(length lit))) - (return-from compare nil)) - (if (not (string= string ,lit :start1 index - :end1 (+ index ,(length lit)))) - (return-from compare nil) - (incf index ,(length lit))))))) - (incf eindex (1- (length lit)))))))) - ;; - ;; Plug end of list to return t. If we made it this far then - ;; We have matched! - (add-exp '((setf (cadr (aref *regex-groups* 0)) - index))) - (add-exp '((return-from final-return t))) - ;; -;;; (print expression) - ;; - ;; Now take the expression list and turn it into a lambda expression - ;; replacing the special flags with lisp code. - ;; For example: A BEGIN needs to be replace by an expression that - ;; saves the current index, then evaluates everything till it gets to - ;; the END then save the new index if it didn't fail. - ;; On an ASTRISK I need to take the previous expression and wrap - ;; it in a do that will evaluate the expression till an error - ;; occurs and then another do that encompases the remainder of the - ;; regular expression and iterates decrementing the index by one - ;; of the matched expression sizes and then returns nil. After - ;; the last expression insert a form that does a return t so that - ;; if the entire nested sub-expression succeeds then the loop - ;; is broken manually. - ;; - (setf result (copy-tree nil)) - ;; - ;; Reversing the current expression makes building up the - ;; lambda list easier due to the nexting of expressions when - ;; and astrisk has been encountered. - (setf expression (reverse expression)) - (do ((elt 0 (1+ elt))) - ((>= elt (length expression))) - (let ((piece (nth elt expression))) - ;; - ;; Now check for PLUS, if so then ditto the expression and then let the - ;; ASTRISK below handle the rest. - ;; - (cond ((eql piece 'PLUS) - (cond ((listp (nth (1+ elt) expression)) - (setf result (append (list (nth (1+ elt) expression)) - result))) - ;; - ;; duplicate the entire group - ;; NOTE: This hasn't been implemented yet!! - (t - (error "GROUP repeat hasn't been implemented yet~%"))))) - (cond ((listp piece) ;Just append the list - (setf result (append (list piece) result))) - ((eql piece 'QUESTION) ; Wrap it in a block that won't fail - (cond ((listp (nth (1+ elt) expression)) - (setf result - (append `((progn (block compare - ,(nth (1+ elt) - expression)) - t)) - result)) - (incf elt)) - ;; - ;; This is a QUESTION on an entire group which - ;; hasn't been implemented yet!!! - ;; - (t - (error "Optional groups not implemented yet~%")))) - ((or (eql piece 'ASTRISK) ; Do the wild thing! - (eql piece 'PLUS)) - (cond ((listp (nth (1+ elt) expression)) - ;; - ;; This is a single character wild card so - ;; do the simple form. - ;; - (setf result - `((let ((oindex index)) - (block compare - (do () - (nil) - ,(nth (1+ elt) expression))) - (do ((start index (1- start))) - ((< start oindex) nil) - (let ((index start)) - (block compare - ,@result)))))) - (incf elt)) - (t - ;; - ;; This is a subgroup repeated so I must build - ;; the loop using several values. - ;; - )) - ) - (t t)))) ; Just ignore everything else. - ;; - ;; Now wrap the result in a lambda list that can then be - ;; invoked or compiled, however the user wishes. - ;; - (if anchored - (setf result - `(lambda (string &key (start 0) (end (length string))) - (setf *regex-groupings* ,group) - (block final-return - (block compare - (let ((index start) - (length end)) - ,@result))))) - (setf result - `(lambda (string &key (start 0) (end (length string))) - (setf *regex-groupings* ,group) - (block final-return - (let ((length end)) - ,@fast-first - (do ((marker start (1+ marker))) - ((> marker end) nil) - (let ((index marker)) - (if (block compare - ,@result) - (return t))))))))))) - -;; (provide 'nregex) diff --git a/elpa/slime-20200414.1444/packages.lisp b/elpa/slime-20200414.1444/packages.lisp deleted file mode 100644 index b4b159fb..00000000 --- a/elpa/slime-20200414.1444/packages.lisp +++ /dev/null @@ -1,202 +0,0 @@ -(defpackage swank/backend - (:use cl) - (:nicknames swank-backend) - (:export *debug-swank-backend* - *log-output* - sldb-condition - compiler-condition - original-condition - message - source-context - condition - severity - with-compilation-hooks - make-location - location - location-p - location-buffer - location-position - location-hints - position-p - position-pos - print-output-to-string - quit-lisp - references - unbound-slot-filler - declaration-arglist - type-specifier-arglist - with-struct - when-let - defimplementation - converting-errors-to-error-location - make-error-location - deinit-log-output - ;; interrupt macro for the backend - *pending-slime-interrupts* - check-slime-interrupts - *interrupt-queued-handler* - ;; inspector related symbols - emacs-inspect - label-value-line - label-value-line* - boolean-to-feature-expression - with-symbol - choose-symbol - ;; package helper for backend - import-to-swank-mop - import-swank-mop-symbols - ;; - default-directory - set-default-directory - frame-source-location - restart-frame - gdb-initial-commands - sldb-break-on-return - buffer-first-change - - profiled-functions - unprofile-all - profile-report - profile-reset - profile-package - - with-collected-macro-forms - auto-flush-loop - *auto-flush-interval*)) - -(defpackage swank/rpc - (:use :cl) - (:export - read-message - read-packet - swank-reader-error - swank-reader-error.packet - swank-reader-error.cause - write-message)) - -(defpackage swank/match - (:use cl) - (:export match)) - -;; FIXME: rename to sawnk/mop -(defpackage swank-mop - (:use) - (:export - ;; classes - standard-generic-function - standard-slot-definition - standard-method - standard-class - eql-specializer - eql-specializer-object - ;; standard-class readers - class-default-initargs - class-direct-default-initargs - class-direct-slots - class-direct-subclasses - class-direct-superclasses - class-finalized-p - class-name - class-precedence-list - class-prototype - class-slots - specializer-direct-methods - ;; generic function readers - generic-function-argument-precedence-order - generic-function-declarations - generic-function-lambda-list - generic-function-methods - generic-function-method-class - generic-function-method-combination - generic-function-name - ;; method readers - method-generic-function - method-function - method-lambda-list - method-specializers - method-qualifiers - ;; slot readers - slot-definition-allocation - slot-definition-documentation - slot-definition-initargs - slot-definition-initform - slot-definition-initfunction - slot-definition-name - slot-definition-type - slot-definition-readers - slot-definition-writers - slot-boundp-using-class - slot-value-using-class - slot-makunbound-using-class - ;; generic function protocol - compute-applicable-methods-using-classes - finalize-inheritance)) - -(defpackage swank - (:use cl swank/backend swank/match swank/rpc) - (:export #:startup-multiprocessing - #:start-server - #:create-server - #:stop-server - #:restart-server - #:ed-in-emacs - #:inspect-in-emacs - #:print-indentation-lossage - #:invoke-slime-debugger - #:swank-debugger-hook - #:emacs-inspect - ;;#:inspect-slot-for-emacs - ;; These are user-configurable variables: - #:*communication-style* - #:*dont-close* - #:*fasl-pathname-function* - #:*log-events* - #:*use-dedicated-output-stream* - #:*dedicated-output-stream-port* - #:*configure-emacs-indentation* - #:*readtable-alist* - #:*globally-redirect-io* - #:*global-debugger* - #:*sldb-quit-restart* - #:*backtrace-printer-bindings* - #:*default-worker-thread-bindings* - #:*macroexpand-printer-bindings* - #:*swank-pprint-bindings* - #:*record-repl-results* - #:*inspector-verbose* - ;; This is SETFable. - #:debug-on-swank-error - ;; These are re-exported directly from the backend: - #:buffer-first-change - #:frame-source-location - #:gdb-initial-commands - #:restart-frame - #:sldb-step - #:sldb-break - #:sldb-break-on-return - #:profiled-functions - #:profile-report - #:profile-reset - #:unprofile-all - #:profile-package - #:default-directory - #:set-default-directory - #:quit-lisp - #:eval-for-emacs - #:eval-in-emacs - #:ed-rpc - #:ed-rpc-no-wait - #:y-or-n-p-in-emacs - #:*find-definitions-right-trim* - #:*find-definitions-left-trim* - #:*after-toggle-trace-hook* - #:unreadable-result - #:unreadable-result-p - #:unreadable-result-string - #:parse-string - #:from-string - #:to-string - #:*swank-debugger-condition* - #:run-hook-with-args-until-success - #:make-output-function-for-target - #:make-output-stream-for-target)) diff --git a/elpa/slime-20200414.1444/sbcl-pprint-patch.lisp b/elpa/slime-20200414.1444/sbcl-pprint-patch.lisp deleted file mode 100644 index dfdc0bb8..00000000 --- a/elpa/slime-20200414.1444/sbcl-pprint-patch.lisp +++ /dev/null @@ -1,332 +0,0 @@ -;; Pretty printer patch for SBCL, which adds the "annotations" feature -;; required for sending presentations through pretty-printing streams. -;; -;; The section marked "Changed functions" and the DEFSTRUCT -;; PRETTY-STREAM are based on SBCL's pprint.lisp. -;; -;; Public domain. - -(in-package "SB!PRETTY") - -(defstruct (annotation (:include queued-op)) - (handler (constantly nil) :type function) - (record)) - - -(defstruct (pretty-stream (:include sb!kernel:ansi-stream - (out #'pretty-out) - (sout #'pretty-sout) - (misc #'pretty-misc)) - (:constructor make-pretty-stream (target)) - (:copier nil)) - ;; Where the output is going to finally go. - (target (missing-arg) :type stream) - ;; Line length we should format to. Cached here so we don't have to keep - ;; extracting it from the target stream. - (line-length (or *print-right-margin* - (sb!impl::line-length target) - default-line-length) - :type column) - ;; A simple string holding all the text that has been output but not yet - ;; printed. - (buffer (make-string initial-buffer-size) :type (simple-array character (*))) - ;; The index into BUFFER where more text should be put. - (buffer-fill-pointer 0 :type index) - ;; Whenever we output stuff from the buffer, we shift the remaining noise - ;; over. This makes it difficult to keep references to locations in - ;; the buffer. Therefore, we have to keep track of the total amount of - ;; stuff that has been shifted out of the buffer. - (buffer-offset 0 :type posn) - ;; The column the first character in the buffer will appear in. Normally - ;; zero, but if we end up with a very long line with no breaks in it we - ;; might have to output part of it. Then this will no longer be zero. - (buffer-start-column (or (sb!impl::charpos target) 0) :type column) - ;; The line number we are currently on. Used for *PRINT-LINES* - ;; abbreviations and to tell when sections have been split across - ;; multiple lines. - (line-number 0 :type index) - ;; the value of *PRINT-LINES* captured at object creation time. We - ;; use this, instead of the dynamic *PRINT-LINES*, to avoid - ;; weirdness like - ;; (let ((*print-lines* 50)) - ;; (pprint-logical-block .. - ;; (dotimes (i 10) - ;; (let ((*print-lines* 8)) - ;; (print (aref possiblybigthings i) prettystream))))) - ;; terminating the output of the entire logical blockafter 8 lines. - (print-lines *print-lines* :type (or index null) :read-only t) - ;; Stack of logical blocks in effect at the buffer start. - (blocks (list (make-logical-block)) :type list) - ;; Buffer holding the per-line prefix active at the buffer start. - ;; Indentation is included in this. The length of this is stored - ;; in the logical block stack. - (prefix (make-string initial-buffer-size) :type (simple-array character (*))) - ;; Buffer holding the total remaining suffix active at the buffer start. - ;; The characters are right-justified in the buffer to make it easier - ;; to output the buffer. The length is stored in the logical block - ;; stack. - (suffix (make-string initial-buffer-size) :type (simple-array character (*))) - ;; Queue of pending operations. When empty, HEAD=TAIL=NIL. Otherwise, - ;; TAIL holds the first (oldest) cons and HEAD holds the last (newest) - ;; cons. Adding things to the queue is basically (setf (cdr head) (list - ;; new)) and removing them is basically (pop tail) [except that care must - ;; be taken to handle the empty queue case correctly.] - (queue-tail nil :type list) - (queue-head nil :type list) - ;; Block-start queue entries in effect at the queue head. - (pending-blocks nil :type list) - ;; Queue of annotations to the buffer - (annotations-tail nil :type list) - (annotations-head nil :type list)) - - -(defmacro enqueue (stream type &rest args) - (let ((constructor (intern (concatenate 'string - "MAKE-" - (symbol-name type)) - "SB-PRETTY"))) - (once-only ((stream stream) - (entry `(,constructor :posn - (index-posn - (pretty-stream-buffer-fill-pointer - ,stream) - ,stream) - ,@args)) - (op `(list ,entry)) - (head `(pretty-stream-queue-head ,stream))) - `(progn - (if ,head - (setf (cdr ,head) ,op) - (setf (pretty-stream-queue-tail ,stream) ,op)) - (setf (pretty-stream-queue-head ,stream) ,op) - ,entry)))) - -;;; -;;; New helper functions -;;; - -(defun enqueue-annotation (stream handler record) - (enqueue stream annotation :handler handler - :record record)) - -(defun re-enqueue-annotation (stream annotation) - (let* ((annotation-cons (list annotation)) - (head (pretty-stream-annotations-head stream))) - (if head - (setf (cdr head) annotation-cons) - (setf (pretty-stream-annotations-tail stream) annotation-cons)) - (setf (pretty-stream-annotations-head stream) annotation-cons) - nil)) - -(defun re-enqueue-annotations (stream end) - (loop for tail = (pretty-stream-queue-tail stream) then (cdr tail) - while (and tail (not (eql (car tail) end))) - when (annotation-p (car tail)) - do (re-enqueue-annotation stream (car tail)))) - -(defun dequeue-annotation (stream &key end-posn) - (let ((next-annotation (car (pretty-stream-annotations-tail stream)))) - (when next-annotation - (when (or (not end-posn) - (<= (annotation-posn next-annotation) end-posn)) - (pop (pretty-stream-annotations-tail stream)) - (unless (pretty-stream-annotations-tail stream) - (setf (pretty-stream-annotations-head stream) nil)) - next-annotation)))) - -(defun invoke-annotation (stream annotation truncatep) - (let ((target (pretty-stream-target stream))) - (funcall (annotation-handler annotation) - (annotation-record annotation) - target - truncatep))) - -(defun output-buffer-with-annotations (stream end) - (let ((target (pretty-stream-target stream)) - (buffer (pretty-stream-buffer stream)) - (end-posn (index-posn end stream)) - (start 0)) - (loop - for annotation = (dequeue-annotation stream :end-posn end-posn) - while annotation - do - (let ((annotation-index (posn-index (annotation-posn annotation) - stream))) - (when (> annotation-index start) - (write-string buffer target :start start - :end annotation-index) - (setf start annotation-index)) - (invoke-annotation stream annotation nil))) - (when (> end start) - (write-string buffer target :start start :end end)))) - -(defun flush-annotations (stream end truncatep) - (let ((end-posn (index-posn end stream))) - (loop - for annotation = (dequeue-annotation stream :end-posn end-posn) - while annotation - do (invoke-annotation stream annotation truncatep)))) - -;;; -;;; Changed functions -;;; - -(defun maybe-output (stream force-newlines-p) - (declare (type pretty-stream stream)) - (let ((tail (pretty-stream-queue-tail stream)) - (output-anything nil)) - (loop - (unless tail - (setf (pretty-stream-queue-head stream) nil) - (return)) - (let ((next (pop tail))) - (etypecase next - (newline - (when (ecase (newline-kind next) - ((:literal :mandatory :linear) t) - (:miser (misering-p stream)) - (:fill - (or (misering-p stream) - (> (pretty-stream-line-number stream) - (logical-block-section-start-line - (first (pretty-stream-blocks stream)))) - (ecase (fits-on-line-p stream - (newline-section-end next) - force-newlines-p) - ((t) nil) - ((nil) t) - (:dont-know - (return)))))) - (setf output-anything t) - (output-line stream next))) - (indentation - (unless (misering-p stream) - (set-indentation stream - (+ (ecase (indentation-kind next) - (:block - (logical-block-start-column - (car (pretty-stream-blocks stream)))) - (:current - (posn-column - (indentation-posn next) - stream))) - (indentation-amount next))))) - (block-start - (ecase (fits-on-line-p stream (block-start-section-end next) - force-newlines-p) - ((t) - ;; Just nuke the whole logical block and make it look like one - ;; nice long literal. (But don't nuke annotations.) - (let ((end (block-start-block-end next))) - (expand-tabs stream end) - (re-enqueue-annotations stream end) - (setf tail (cdr (member end tail))))) - ((nil) - (really-start-logical-block - stream - (posn-column (block-start-posn next) stream) - (block-start-prefix next) - (block-start-suffix next))) - (:dont-know - (return)))) - (block-end - (really-end-logical-block stream)) - (tab - (expand-tabs stream next)) - (annotation - (re-enqueue-annotation stream next)))) - (setf (pretty-stream-queue-tail stream) tail)) - output-anything)) - -(defun output-line (stream until) - (declare (type pretty-stream stream) - (type newline until)) - (let* ((target (pretty-stream-target stream)) - (buffer (pretty-stream-buffer stream)) - (kind (newline-kind until)) - (literal-p (eq kind :literal)) - (amount-to-consume (posn-index (newline-posn until) stream)) - (amount-to-print - (if literal-p - amount-to-consume - (let ((last-non-blank - (position #\space buffer :end amount-to-consume - :from-end t :test #'char/=))) - (if last-non-blank - (1+ last-non-blank) - 0))))) - (output-buffer-with-annotations stream amount-to-print) - (flush-annotations stream amount-to-consume nil) - (let ((line-number (pretty-stream-line-number stream))) - (incf line-number) - (when (and (not *print-readably*) - (pretty-stream-print-lines stream) - (>= line-number (pretty-stream-print-lines stream))) - (write-string " .." target) - (flush-annotations stream - (pretty-stream-buffer-fill-pointer stream) - t) - (let ((suffix-length (logical-block-suffix-length - (car (pretty-stream-blocks stream))))) - (unless (zerop suffix-length) - (let* ((suffix (pretty-stream-suffix stream)) - (len (length suffix))) - (write-string suffix target - :start (- len suffix-length) - :end len)))) - (throw 'line-limit-abbreviation-happened t)) - (setf (pretty-stream-line-number stream) line-number) - (write-char #\newline target) - (setf (pretty-stream-buffer-start-column stream) 0) - (let* ((fill-ptr (pretty-stream-buffer-fill-pointer stream)) - (block (first (pretty-stream-blocks stream))) - (prefix-len - (if literal-p - (logical-block-per-line-prefix-end block) - (logical-block-prefix-length block))) - (shift (- amount-to-consume prefix-len)) - (new-fill-ptr (- fill-ptr shift)) - (new-buffer buffer) - (buffer-length (length buffer))) - (when (> new-fill-ptr buffer-length) - (setf new-buffer - (make-string (max (* buffer-length 2) - (+ buffer-length - (floor (* (- new-fill-ptr buffer-length) - 5) - 4))))) - (setf (pretty-stream-buffer stream) new-buffer)) - (replace new-buffer buffer - :start1 prefix-len :start2 amount-to-consume :end2 fill-ptr) - (replace new-buffer (pretty-stream-prefix stream) - :end1 prefix-len) - (setf (pretty-stream-buffer-fill-pointer stream) new-fill-ptr) - (incf (pretty-stream-buffer-offset stream) shift) - (unless literal-p - (setf (logical-block-section-column block) prefix-len) - (setf (logical-block-section-start-line block) line-number)))))) - -(defun output-partial-line (stream) - (let* ((fill-ptr (pretty-stream-buffer-fill-pointer stream)) - (tail (pretty-stream-queue-tail stream)) - (count - (if tail - (posn-index (queued-op-posn (car tail)) stream) - fill-ptr)) - (new-fill-ptr (- fill-ptr count)) - (buffer (pretty-stream-buffer stream))) - (when (zerop count) - (error "Output-partial-line called when nothing can be output.")) - (output-buffer-with-annotations stream count) - (incf (pretty-stream-buffer-start-column stream) count) - (replace buffer buffer :end1 new-fill-ptr :start2 count :end2 fill-ptr) - (setf (pretty-stream-buffer-fill-pointer stream) new-fill-ptr) - (incf (pretty-stream-buffer-offset stream) count))) - -(defun force-pretty-output (stream) - (maybe-output stream nil) - (expand-tabs stream nil) - (re-enqueue-annotations stream nil) - (output-buffer-with-annotations stream - (pretty-stream-buffer-fill-pointer stream))) - \ No newline at end of file diff --git a/elpa/slime-20200414.1444/slime-autoloads.el b/elpa/slime-20200414.1444/slime-autoloads.el deleted file mode 100644 index d5e01883..00000000 --- a/elpa/slime-20200414.1444/slime-autoloads.el +++ /dev/null @@ -1,69 +0,0 @@ -;;; slime-autoloads.el --- autoload definitions for SLIME -*- no-byte-compile: t -*- - -;; Copyright (C) 2007 Helmut Eller - -;; This file is protected by the GNU GPLv2 (or later), as distributed -;; with GNU Emacs. - -;;; Commentary: - -;; This code defines the necessary autoloads, so that we don't need to -;; load everything from .emacs. -;; -;; JT@14/01/09: FIXME: This file should be auto-generated with autoload cookies. - -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - -(autoload 'slime "slime" - "Start a Lisp subprocess and connect to its Swank server." t) - -(autoload 'slime-mode "slime" - "SLIME: The Superior Lisp Interaction (Minor) Mode for Emacs." t) - -(autoload 'slime-connect "slime" - "Connect to a running Swank server." t) - -(autoload 'slime-selector "slime" - "Select a new by type, indicated by a single character." t) - -(autoload 'hyperspec-lookup "lib/hyperspec" nil t) - -(autoload 'slime-lisp-mode-hook "slime") - -(autoload 'slime-scheme-mode-hook "slime") - -(defvar slime-contribs '(slime-fancy) - "A list of contrib packages to load with SLIME.") - -(autoload 'slime-setup "slime" - "Setup some SLIME contribs.") - -(define-obsolete-variable-alias 'slime-setup-contribs - 'slime-contribs "2.3.2") - -(add-hook 'lisp-mode-hook 'slime-lisp-mode-hook) - -(provide 'slime-autoloads) - -;;; slime-autoloads.el ends here - -;;;### (autoloads nil "slime" "slime.el" (0 0 0 0)) -;;; Generated autoloads from slime.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "slime" '("sldb-" "slime" "defslimefun" "def-slime-selector-method" "define-sl" "??" "?q" "?i" "?v" "?l" "?d" "?e" "?c" "?n" "?p" "?t" "make-slime-" "inferior-lisp-program"))) - -;;;*** - -;;;### (autoloads nil nil ("slime-pkg.el") (0 0 0 0)) - -;;;*** - -;;;### (autoloads nil "slime-tests" "slime-tests.el" (0 0 0 0)) -;;; Generated autoloads from slime-tests.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "slime-tests" '("symbol-at-point." "sexp-at-point.1" "sbcl-world-lock" "report-condition-with-circular-list" "read" "traditional-recipe" "def-slime-test" "dis" "find-definition" "flow-control" "inspector" "indentation" "inter" "end-of-file" "loop-interrupt-" "locally-bound-debugger-hook" "break" "macroexpand" "utf-8-source" "unwind-to-previous-sldb-level" "arglist" "async-eval-debugging" "comp" "narrowing"))) - -;;;*** diff --git a/elpa/slime-20200414.1444/slime-pkg.el b/elpa/slime-20200414.1444/slime-pkg.el deleted file mode 100644 index 66d52ed7..00000000 --- a/elpa/slime-20200414.1444/slime-pkg.el +++ /dev/null @@ -1,9 +0,0 @@ -(define-package "slime" "20200414.1444" "Superior Lisp Interaction Mode for Emacs" - '((cl-lib "0.5") - (macrostep "0.9")) - :keywords - '("languages" "lisp" "slime") - :url "https://github.com/slime/slime") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/slime-20200414.1444/slime-tests.el b/elpa/slime-20200414.1444/slime-tests.el deleted file mode 100644 index 87f81f13..00000000 --- a/elpa/slime-20200414.1444/slime-tests.el +++ /dev/null @@ -1,1459 +0,0 @@ -;;; slime-tests.el --- Automated tests for slime.el -;; -;;;; License -;; Copyright (C) 2003 Eric Marsden, Luke Gorrie, Helmut Eller -;; Copyright (C) 2004,2005,2006 Luke Gorrie, Helmut Eller -;; Copyright (C) 2007,2008,2009 Helmut Eller, Tobias C. Rittweiler -;; Copyright (C) 2013 -;; -;; For a detailed list of contributors, see the manual. -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2 of -;; the License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public -;; License along with this program; if not, write to the Free -;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -;; MA 02111-1307, USA. - - -;;;; Tests -(require 'slime) -(require 'ert nil t) -(require 'ert "lib/ert" t) ;; look for bundled version for Emacs 23 -(require 'cl-lib) -(require 'bytecomp) ; byte-compile-current-file -(eval-when-compile - (require 'cl)) ; lexical-let - -(defun slime-shuffle-list (list) - (let* ((len (length list)) - (taken (make-vector len nil)) - (result (make-vector len nil))) - (dolist (e list) - (while (let ((i (random len))) - (cond ((aref taken i)) - (t (aset taken i t) - (aset result i e) - nil))))) - (append result '()))) - -(defun slime-batch-test (&optional test-name randomize) - "Run the test suite in batch-mode. -Exits Emacs when finished. The exit code is the number of failed tests." - (interactive) - (let ((ert-debug-on-error nil) - (timeout 30) - (slime-background-message-function #'ignore)) - (slime) - ;; Block until we are up and running. - (lexical-let (timed-out) - (run-with-timer timeout nil - (lambda () (setq timed-out t))) - (while (not (slime-connected-p)) - (sit-for 1) - (when timed-out - (when noninteractive - (kill-emacs 252))))) - (slime-sync-to-top-level 5) - (let* ((selector (if randomize - `(member ,@(slime-shuffle-list - (ert-select-tests (or test-name t) t))) - (or test-name t))) - (ert-fun (if noninteractive - 'ert-run-tests-batch - 'ert))) - (let ((stats (funcall ert-fun selector))) - (if noninteractive - (kill-emacs (ert-stats-completed-unexpected stats))))))) - -(defun slime-skip-test (message) - ;; ERT for Emacs 23 and earlier doesn't have `ert-skip' - (if (fboundp 'ert-skip) - (ert-skip message) - (message (concat "SKIPPING: " message)) - (ert-pass))) - -(defun slime-tests--undefine-all () - (dolist (test (ert-select-tests t t)) - (let* ((sym (ert-test-name test))) - (cl-assert (eq (get sym 'ert--test) test)) - (cl-remprop sym 'ert--test)))) - -(slime-tests--undefine-all) - -(eval-and-compile - (defun slime-tests-auto-tags () - (append '(slime) - (let ((file-name (or load-file-name - byte-compile-current-file))) - (if (and file-name - (string-match "contrib/test/slime-\\(.*\\)\.elc?$" - file-name)) - (list 'contrib (intern (match-string 1 file-name))) - '(core))))) - - (defmacro define-slime-ert-test (name &rest args) - "Like `ert-deftest', but set tags automatically. -Also don't error if `ert.el' is missing." - (if (not (featurep 'ert)) - (warn "No ert.el found: not defining test %s" - name) - (let* ((docstring (and (stringp (second args)) - (second args))) - (args (if docstring - (cddr args) - (cdr args))) - (tags (slime-tests-auto-tags))) - `(ert-deftest ,name () ,(or docstring "No docstring for this test.") - :tags ',tags - ,@args)))) - - (defun slime-test-ert-test-for (name input i doc body fails-for style fname) - `(define-slime-ert-test - ,(intern (format "%s-%d" name i)) () - ,(format "For input %s, %s" (truncate-string-to-width - (format "%s" input) - 15 nil nil 'ellipsis) - (replace-regexp-in-string "^.??\\(\\w+\\)" - (lambda (s) (downcase s)) - doc - t)) - ,@(if fails-for - `(:expected-result '(satisfies - (lambda (result) - (ert-test-result-type-p - result - (if (member - (slime-lisp-implementation-name) - ',fails-for) - :failed - :passed)))))) - - ,@(when style - `((let ((style (slime-communication-style))) - (when (not (member style ',style)) - (slime-skip-test (format "test not applicable for style %s" - style)))))) - (apply #',fname ',input)))) - -(defmacro def-slime-test (name args doc inputs &rest body) - "Define a test case. -NAME ::= SYMBOL | (SYMBOL OPTION*) is a symbol naming the test. -OPTION ::= (:fails-for IMPLEMENTATION*) | (:style COMMUNICATION-STYLE*) -ARGS is a lambda-list. -DOC is a docstring. -INPUTS is a list of argument lists, each tested separately. -BODY is the test case. The body can use `slime-check' to test -conditions (assertions)." - (declare (debug (&define name sexp sexp sexp &rest def-form))) - (if (not (featurep 'ert)) - (warn "No ert.el found: not defining test %s" - name) - `(progn - ,@(cl-destructuring-bind (name &rest options) - (if (listp name) name (list name)) - (let ((fname (intern (format "slime-test-%s" name)))) - (cons `(defun ,fname ,args - (slime-sync-to-top-level 0.3) - ,@body - (slime-sync-to-top-level 0.3)) - (cl-loop for input in (eval inputs) - for i from 1 - with fails-for = (cdr (assoc :fails-for options)) - with style = (cdr (assoc :style options)) - collect (slime-test-ert-test-for name - input - i - doc - body - fails-for - style - fname)))))))) - -(put 'def-slime-test 'lisp-indent-function 4) - -(defmacro slime-check (check &rest body) - (declare (indent defun)) - `(unless (progn ,@body) - (ert-fail ,(cl-etypecase check - (cons `(concat "Ooops, " ,(cons 'format check))) - (string `(concat "Check failed: " ,check)) - (symbol `(concat "Check failed: " ,(symbol-name check))))))) - - -;;;;; Test case definitions -(defun slime-check-top-level () ;(&optional _test-name) - (accept-process-output nil 0.001) - (slime-check "At the top level (no debugging or pending RPCs)" - (slime-at-top-level-p))) - -(defun slime-at-top-level-p () - (and (not (sldb-get-default-buffer)) - (null (slime-rex-continuations)))) - -(defun slime-wait-condition (name predicate timeout) - (let ((end (time-add (current-time) (seconds-to-time timeout)))) - (while (not (funcall predicate)) - (let ((now (current-time))) - (message "waiting for condition: %s [%s.%06d]" name - (format-time-string "%H:%M:%S" now) (third now))) - (cond ((time-less-p end (current-time)) - (error "Timeout waiting for condition: %S" name)) - (t - ;; XXX if a process-filter enters a recursive-edit, we - ;; hang forever - (accept-process-output nil 0.1)))))) - -(defun slime-sync-to-top-level (timeout) - (slime-wait-condition "top-level" #'slime-at-top-level-p timeout)) - -;; XXX: unused function -(defun slime-check-sldb-level (expected) - (let ((sldb-level (let ((sldb (sldb-get-default-buffer))) - (if sldb - (with-current-buffer sldb - sldb-level))))) - (slime-check ("SLDB level (%S) is %S" expected sldb-level) - (equal expected sldb-level)))) - -(defun slime-test-expect (_name expected actual &optional test) - (when (stringp expected) (setq expected (substring-no-properties expected))) - (when (stringp actual) (setq actual (substring-no-properties actual))) - (if test - (should (funcall test expected actual)) - (should (equal expected actual)))) - -(defun sldb-level () - (let ((sldb (sldb-get-default-buffer))) - (if sldb - (with-current-buffer sldb - sldb-level)))) - -(defun slime-sldb-level= (level) - (equal level (sldb-level))) - -(eval-when-compile - (defvar slime-test-symbols - '(("foobar") ("foo@bar") ("@foobar") ("foobar@") ("\\@foobar") - ("|asdf||foo||bar|") - ("\\#") - ("\\(setf\\ car\\)")))) - -(defun slime-check-symbol-at-point (prefix symbol suffix) - ;; We test that `slime-symbol-at-point' works at every - ;; character of the symbol name. - (with-temp-buffer - (lisp-mode) - (insert prefix) - (let ((start (point))) - (insert symbol suffix) - (dotimes (i (length symbol)) - (goto-char (+ start i)) - (slime-test-expect (format "Check `%s' (at %d)..." - (buffer-string) (point)) - symbol - (slime-symbol-at-point) - #'equal))))) - - - -(def-slime-test symbol-at-point.2 (sym) - "fancy symbol-name _not_ at BOB/EOB" - slime-test-symbols - (slime-check-symbol-at-point "(foo " sym " bar)")) - -(def-slime-test symbol-at-point.3 (sym) - "fancy symbol-name with leading ," - (remove-if (lambda (s) (eq (aref (car s) 0) ?@)) slime-test-symbols) - (slime-check-symbol-at-point "," sym "")) - -(def-slime-test symbol-at-point.4 (sym) - "fancy symbol-name with leading ,@" - slime-test-symbols - (slime-check-symbol-at-point ",@" sym "")) - -(def-slime-test symbol-at-point.5 (sym) - "fancy symbol-name with leading `" - slime-test-symbols - (slime-check-symbol-at-point "`" sym "")) - -(def-slime-test symbol-at-point.6 (sym) - "fancy symbol-name wrapped in ()" - slime-test-symbols - (slime-check-symbol-at-point "(" sym ")")) - -(def-slime-test symbol-at-point.7 (sym) - "fancy symbol-name wrapped in #< {DEADBEEF}>" - slime-test-symbols - (slime-check-symbol-at-point "#<" sym " {DEADBEEF}>")) - -;;(def-slime-test symbol-at-point.8 (sym) -;; "fancy symbol-name wrapped in #<>" -;; slime-test-symbols -;; (slime-check-symbol-at-point "#<" sym ">")) - -(def-slime-test symbol-at-point.9 (sym) - "fancy symbol-name wrapped in #| ... |#" - slime-test-symbols - (slime-check-symbol-at-point "#|\n" sym "\n|#")) - -(def-slime-test symbol-at-point.10 (sym) - "fancy symbol-name after #| )))(( |# (1)" - slime-test-symbols - (slime-check-symbol-at-point "#| )))(( #|\n" sym "")) - -(def-slime-test symbol-at-point.11 (sym) - "fancy symbol-name after #| )))(( |# (2)" - slime-test-symbols - (slime-check-symbol-at-point "#| )))(( #|" sym "")) - -(def-slime-test symbol-at-point.12 (sym) - "fancy symbol-name wrapped in \"...\"" - slime-test-symbols - (slime-check-symbol-at-point "\"\n" sym "\"\n")) - -(def-slime-test symbol-at-point.13 (sym) - "fancy symbol-name wrapped in \" )))(( \" (1)" - slime-test-symbols - (slime-check-symbol-at-point "\" )))(( \"\n" sym "")) - -(def-slime-test symbol-at-point.14 (sym) - "fancy symbol-name wrapped in \" )))(( \" (1)" - slime-test-symbols - (slime-check-symbol-at-point "\" )))(( \"" sym "")) - -(def-slime-test symbol-at-point.15 (sym) - "symbol-at-point after #." - slime-test-symbols - (slime-check-symbol-at-point "#." sym "")) - -(def-slime-test symbol-at-point.16 (sym) - "symbol-at-point after #+" - slime-test-symbols - (slime-check-symbol-at-point "#+" sym "")) - - -(def-slime-test sexp-at-point.1 (string) - "symbol-at-point after #'" - '(("foo") - ("#:foo") - ("#'foo") - ("#'(lambda (x) x)") - ("()")) - (with-temp-buffer - (lisp-mode) - (insert string) - (goto-char (point-min)) - (slime-test-expect (format "Check sexp `%s' (at %d)..." - (buffer-string) (point)) - string - (slime-sexp-at-point) - #'equal))) - -(def-slime-test narrowing () - "Check that narrowing is properly sustained." - '() - (slime-check-top-level) - (let ((random-buffer-name (symbol-name (cl-gensym))) - (defun-pos) (tmpbuffer)) - (with-temp-buffer - (dotimes (i 100) (insert (format ";;; %d. line\n" i))) - (setq tmpbuffer (current-buffer)) - (setq defun-pos (point)) - (insert (concat "(defun __foo__ (x y)" "\n" - " 'nothing)" "\n")) - (dotimes (i 100) (insert (format ";;; %d. line\n" (+ 100 i)))) - (slime-check "Checking that newly created buffer is not narrowed." - (not (slime-buffer-narrowed-p))) - - (goto-char defun-pos) - (narrow-to-defun) - (slime-check "Checking that narrowing succeeded." - (slime-buffer-narrowed-p)) - - (slime-with-popup-buffer (random-buffer-name) - (slime-check ("Checking that we're in Slime's temp buffer `%s'" - random-buffer-name) - (equal (buffer-name (current-buffer)) random-buffer-name))) - (with-current-buffer random-buffer-name - ;; Notice that we cannot quit the buffer within the extent - ;; of slime-with-output-to-temp-buffer. - (quit-window t)) - (slime-check ("Checking that we've got back from `%s'" - random-buffer-name) - (and (eq (current-buffer) tmpbuffer) - (= (point) defun-pos))) - - (slime-check "Checking that narrowing sustained \ -after quitting Slime's temp buffer." - (slime-buffer-narrowed-p)) - - (let ((slime-buffer-package "SWANK") - (symbol '*buffer-package*)) - (slime-edit-definition (symbol-name symbol)) - (slime-check ("Checking that we've got M-. into swank.lisp. %S" symbol) - (string= (file-name-nondirectory (buffer-file-name)) - "swank.lisp")) - (slime-pop-find-definition-stack) - (slime-check ("Checking that we've got back.") - (and (eq (current-buffer) tmpbuffer) - (= (point) defun-pos))) - - (slime-check "Checking that narrowing sustained after M-," - (slime-buffer-narrowed-p))) - )) - (slime-check-top-level)) - -(defun slime-test--display-region-eval-arg (line window-height) - (cl-etypecase line - (number line) - (cons (slime-dcase line - ((+h line) - (+ (slime-test--display-region-eval-arg line window-height) - window-height)) - ((-h line) - (- (slime-test--display-region-eval-arg line window-height) - window-height)))))) - -(defun slime-test--display-region-line-to-position (line window-height) - (let ((line (slime-test--display-region-eval-arg line window-height))) - (save-excursion - (goto-char (point-min)) - (forward-line (1- line)) - (line-beginning-position)))) - -(def-slime-test display-region - (start end pos window-start expected-window-start expected-point) - "Test `slime-display-region'." - ;; numbers are actually lines numbers - '(;; region visible, point in region - (2 4 3 1 1 3) - ;; region visible, point visible but ouside region - (2 4 5 1 1 5) - ;; end not visible, point at start - (2 (+h 2) 2 1 2 2) - ;; start not visible, point at start - ((+h 2) (+h 500) (+h 2) 1 (+h 2) (+h 2)) - ;; start not visible, point after end - ((+h 2) (+h 500) (+h 6) 1 (+h 2) (+h 6)) - ;; end - start should be visible, point after end - ((+h 2) (+h 7) (+h 10) 1 (-h (+h 7)) (+h 6)) - ;; region is window-height + 1 and ends with newline - ((+h -2) (+h (+h -3)) (+h -2) 1 (+h -3) (+h -2)) - (2 (+h 1) 3 1 1 3) - (2 (+h 0) 3 1 1 3) - (2 (+h -1) 3 1 1 3) - ;; start and end are the beginning - (1 1 1 1 1 1) - ;; - (1 (+h 1) (+h 22) (+h 20) 1 (+h 0)) - ) - (when noninteractive - (slime-skip-test "Can't test slime-display-region in batch mode")) - (with-temp-buffer - (dotimes (i 1000) - (insert (format "%09d\n" i))) - (let* ((win (display-buffer (current-buffer) t)) - (wh (window-text-height win))) - (cl-macrolet ((l2p (l) - `(slime-test--display-region-line-to-position ,l wh))) - (select-window win) - (set-window-start win (l2p window-start)) - (redisplay) - (goto-char (l2p pos)) - (cl-assert (= (l2p window-start) (window-start win))) - (cl-assert (= (point) (l2p pos))) - (slime--display-region (l2p start) (l2p end)) - (redisplay) - (cl-assert (= (l2p expected-window-start) (window-start))) - (cl-assert (= (l2p expected-point) (point))) - )))) - -(def-slime-test find-definition - (name buffer-package snippet) - "Find the definition of a function or macro in swank.lisp." - '(("start-server" "SWANK" "(defun start-server ") - ("swank::start-server" "CL-USER" "(defun start-server ") - ("swank:start-server" "CL-USER" "(defun start-server ") - ("swank::connection" "CL-USER" "(defstruct (connection") - ("swank::*emacs-connection*" "CL-USER" "(defvar \\*emacs-connection\\*") - ) - (switch-to-buffer "*scratch*") ; not buffer of definition - (slime-check-top-level) - (let ((orig-buffer (current-buffer)) - (orig-pos (point)) - (enable-local-variables nil) ; don't get stuck on -*- eval: -*- - (slime-buffer-package buffer-package)) - (slime-edit-definition name) - ;; Postconditions - (slime-check ("Definition of `%S' is in swank.lisp." name) - (string= (file-name-nondirectory (buffer-file-name)) "swank.lisp")) - (slime-check ("Looking at '%s'." snippet) (looking-at snippet)) - (slime-pop-find-definition-stack) - (slime-check "Returning from definition restores original buffer/position." - (and (eq orig-buffer (current-buffer)) - (= orig-pos (point))))) - (slime-check-top-level)) - -(def-slime-test (find-definition.2 (:fails-for "allegro" "lispworks")) - (buffer-content buffer-package snippet) - "Check that we're able to find definitions even when -confronted with nasty #.-fu." - '(("#.(prog1 nil (defvar *foobar* 42)) - - (defun .foo. (x) - (+ x #.*foobar*)) - - #.(prog1 nil (makunbound '*foobar*)) - " - "SWANK" - "[ \t]*(defun .foo. " - ) - ("#.(prog1 nil (defvar *foobar* 42)) - - ;; some comment - (defun .foo. (x) - (+ x #.*foobar*)) - - #.(prog1 nil (makunbound '*foobar*)) - " - "SWANK" - "[ \t]*(defun .foo. " - ) - ("(in-package swank) - (eval-when (:compile-toplevel) (defparameter *bar* 456)) - (eval-when (:load-toplevel :execute) (makunbound '*bar*)) - (defun bar () #.*bar*) - (defun .foo. () 123)" - "SWANK" - "[ \t]*(defun .foo. () 123)")) - (let ((slime-buffer-package buffer-package)) - (with-temp-buffer - (insert buffer-content) - (slime-check-top-level) - (slime-eval - `(swank:compile-string-for-emacs - ,buffer-content - ,(buffer-name) - '((:position 0) (:line 1 1)) - ,nil - ,nil)) - (let ((bufname (buffer-name))) - (slime-edit-definition ".foo.") - (slime-check ("Definition of `.foo.' is in buffer `%s'." bufname) - (string= (buffer-name) bufname)) - (slime-check "Definition now at point." (looking-at snippet)))))) - -(def-slime-test (find-definition.3 - (:fails-for "abcl" "allegro" "clisp" "lispworks" "sbcl" - "ecl")) - (name source regexp) - "Extra tests for defstruct." - '(("swank::foo-struct" - "(progn - (defun foo-fun ()) - (defstruct (foo-struct (:constructor nil) (:predicate nil))) -)" - "(defstruct (foo-struct")) - (switch-to-buffer "*scratch*") - (with-temp-buffer - (insert source) - (let ((slime-buffer-package "SWANK")) - (slime-eval - `(swank:compile-string-for-emacs - ,source - ,(buffer-name) - '((:position 0) (:line 1 1)) - ,nil - ,nil))) - (let ((temp-buffer (current-buffer))) - (with-current-buffer "*scratch*" - (slime-edit-definition name) - (slime-check ("Definition of %S is in buffer `%s'." - name temp-buffer) - (eq (current-buffer) temp-buffer)) - (slime-check "Definition now at point." (looking-at regexp))) - ))) - -(def-slime-test complete-symbol - (prefix expected-completions) - "Find the completions of a symbol-name prefix." - '(("cl:compile" ("cl:compile" "cl:compile-file" "cl:compile-file-pathname" - "cl:compiled-function" "cl:compiled-function-p" - "cl:compiler-macro" "cl:compiler-macro-function")) - ("cl:foobar" ()) - ("swank::compile-file" ("swank::compile-file" - "swank::compile-file-for-emacs" - "swank::compile-file-if-needed" - "swank::compile-file-output" - "swank::compile-file-pathname")) - ("cl:m-v-l" ())) - (let ((completions (slime-simple-completions prefix))) - (slime-test-expect "Completion set" expected-completions completions))) - -(def-slime-test read-from-minibuffer - (input-keys expected-result) - "Test `slime-read-from-minibuffer' with INPUT-KEYS as events." - '(("( r e v e TAB SPC ' ( 1 SPC 2 SPC 3 ) ) RET" - "(reverse '(1 2 3))") - ("( c l : c o n TAB s t a n t l TAB SPC 4 2 ) RET" - "(cl:constantly 42)")) - (when noninteractive - (slime-skip-test "Can't use unread-command-events in batch mode")) - (let ((keys (eval `(kbd ,input-keys)))) ; kbd is a macro in Emacs 23 - (setq unread-command-events (listify-key-sequence keys))) - (let ((actual-result (slime-read-from-minibuffer "Test: "))) - (accept-process-output) ; run idle timers - (slime-test-expect "Completed string" expected-result actual-result))) - -(def-slime-test arglist - ;; N.B. Allegro apparently doesn't return the default values of - ;; optional parameters. Thus the regexp in the start-server - ;; expected value. In a perfect world we'd find a way to smooth - ;; over this difference between implementations--perhaps by - ;; convincing Franz to provide a function that does what we want. - (function-name expected-arglist) - "Lookup the argument list for FUNCTION-NAME. -Confirm that EXPECTED-ARGLIST is displayed." - '(("swank::operator-arglist" "(swank::operator-arglist name package)") - ("swank::compute-backtrace" "(swank::compute-backtrace start end)") - ("swank::emacs-connected" "(swank::emacs-connected)") - ("swank::compile-string-for-emacs" - "(swank::compile-string-for-emacs \ -string buffer position filename policy)") - ("swank::connection.socket-io" - "(swank::connection.socket-io \ -\\(struct\\(ure\\)?\\|object\\|instance\\|x\\|connection\\))") - ("cl:lisp-implementation-type" "(cl:lisp-implementation-type)") - ("cl:class-name" - "(cl:class-name \\(class\\|object\\|instance\\|structure\\))")) - (let ((arglist (slime-eval `(swank:operator-arglist ,function-name - "swank")))) - (slime-test-expect "Argument list is as expected" - expected-arglist (and arglist (downcase arglist)) - (lambda (pattern arglist) - (and arglist (string-match pattern arglist)))))) - -(defun slime-test--compile-defun (program subform) - (slime-check-top-level) - (with-temp-buffer - (lisp-mode) - (insert program) - (let ((font-lock-verbose nil)) - (setq slime-buffer-package ":swank") - (slime-compile-string (buffer-string) 1) - (setq slime-buffer-package ":cl-user") - (slime-sync-to-top-level 5) - (goto-char (point-max)) - (slime-previous-note) - (slime-check error-location-correct - (equal (read (current-buffer)) subform)))) - (slime-check-top-level)) - -(def-slime-test (compile-defun (:fails-for "allegro" "lispworks" "clisp")) - (program subform) - "Compile PROGRAM containing errors. -Confirm that SUBFORM is correctly located." - '(("(defun cl-user::foo () (cl-user::bar))" (cl-user::bar)) - ("(defun cl-user::foo () - #\\space - ;;Sdf - (cl-user::bar))" - (cl-user::bar)) - ("(defun cl-user::foo () - #+(or)skipped - #| #||# - #||# |# - (cl-user::bar))" - (cl-user::bar)) - ("(defun cl-user::foo () - \"\\\" bla bla \\\"\" - (cl-user::bar))" - (cl-user::bar)) - ("(defun cl-user::foo () - #.*log-events* - (cl-user::bar))" - (cl-user::bar)) - ("#.'(defun x () (/ 1 0)) - (defun foo () - (cl-user::bar)) - - " - (cl-user::bar))) - (slime-test--compile-defun program subform)) - -;; This test ideally would be collapsed into the previous -;; compile-defun test, but only 1 case fails for ccl--and that's here -(def-slime-test (compile-defun-with-reader-conditionals - (:fails-for "allegro" "lispworks" "clisp" "ccl")) - (program subform) - "Compile PROGRAM containing errors. -Confirm that SUBFORM is correctly located." - '(("(defun foo () - #+#.'(:and) (/ 1 0))" - (/ 1 0))) - (slime-test--compile-defun program subform)) - -;; SBCL used to pass this one but since they changed the -;; backquote/unquote reader it fails. -(def-slime-test (compile-defun-with-backquote - (:fails-for "allegro" "lispworks" "clisp" "sbcl")) - (program subform) - "Compile PROGRAM containing errors. -Confirm that SUBFORM is correctly located." - '(("(defun cl-user::foo () - (list `(1 ,(random 10) 2 ,@(make-list (random 10)) 3 - ,(cl-user::bar))))" - (cl-user::bar))) - (slime-test--compile-defun program subform)) - -(def-slime-test (compile-file (:fails-for "allegro" "clisp")) - (string) - "Insert STRING in a file, and compile it." - `((,(pp-to-string '(defun foo () nil)))) - (let ((filename "/tmp/slime-tmp-file.lisp")) - (with-temp-file filename - (insert string)) - (let ((cell (cons nil nil))) - (slime-eval-async - `(swank:compile-file-for-emacs ,filename nil) - (slime-rcurry (lambda (result cell) - (setcar cell t) - (setcdr cell result)) - cell)) - (slime-wait-condition "Compilation finished" (lambda () (car cell)) - 0.5) - (let ((result (cdr cell))) - (slime-check "Compilation successfull" - (eq (slime-compilation-result.successp result) t)))))) - -(def-slime-test utf-8-source - (input output) - "Source code containing utf-8 should work" - (list (let* ((bytes "\343\201\212\343\201\257\343\202\210\343\201\206") - ;;(encode-coding-string (string #x304a #x306f #x3088 #x3046) - ;; 'utf-8) - (string (decode-coding-string bytes 'utf-8-unix))) - (assert (equal bytes (encode-coding-string string 'utf-8-unix))) - (list (concat "(defun cl-user::foo () \"" string "\")") - string))) - (slime-eval `(cl:eval (cl:read-from-string ,input))) - (slime-test-expect "Eval result correct" - output (slime-eval '(cl-user::foo))) - (let ((cell (cons nil nil))) - (let ((hook (slime-curry (lambda (cell &rest _) (setcar cell t)) cell))) - (add-hook 'slime-compilation-finished-hook hook) - (unwind-protect - (progn - (slime-compile-string input 0) - (slime-wait-condition "Compilation finished" - (lambda () (car cell)) - 0.5) - (slime-test-expect "Compile-string result correct" - output (slime-eval '(cl-user::foo)))) - (remove-hook 'slime-compilation-finished-hook hook)) - (let ((filename "/tmp/slime-tmp-file.lisp")) - (setcar cell nil) - (add-hook 'slime-compilation-finished-hook hook) - (unwind-protect - (with-temp-buffer - (when (fboundp 'set-buffer-multibyte) - (set-buffer-multibyte t)) - (setq buffer-file-coding-system 'utf-8-unix) - (setq buffer-file-name filename) - (insert ";; -*- coding: utf-8-unix -*- \n") - (insert input) - (let ((coding-system-for-write 'utf-8-unix)) - (write-region nil nil filename nil t)) - (let ((slime-load-failed-fasl 'always)) - (slime-compile-and-load-file) - (slime-wait-condition "Compilation finished" - (lambda () (car cell)) - 0.5)) - (slime-test-expect "Compile-file result correct" - output (slime-eval '(cl-user::foo)))) - (remove-hook 'slime-compilation-finished-hook hook) - (ignore-errors (delete-file filename))))))) - -(def-slime-test async-eval-debugging (depth) - "Test recursive debugging of asynchronous evaluation requests." - '((1) (2) (3)) - (lexical-let ((depth depth) - (debug-hook-max-depth 0)) - (let ((debug-hook - (lambda () - (with-current-buffer (sldb-get-default-buffer) - (when (> sldb-level debug-hook-max-depth) - (setq debug-hook-max-depth sldb-level) - (if (= sldb-level depth) - ;; We're at maximum recursion - time to unwind - (sldb-quit) - ;; Going down - enter another recursive debug - ;; Recursively debug. - (slime-eval-async '(error)))))))) - (let ((sldb-hook (cons debug-hook sldb-hook))) - (slime-eval-async '(error)) - (slime-sync-to-top-level 5) - (slime-check ("Maximum depth reached (%S) is %S." - debug-hook-max-depth depth) - (= debug-hook-max-depth depth)))))) - -(def-slime-test unwind-to-previous-sldb-level (level2 level1) - "Test recursive debugging and returning to lower SLDB levels." - '((2 1) (4 2)) - (slime-check-top-level) - (lexical-let ((level2 level2) - (level1 level1) - (state 'enter) - (max-depth 0)) - (let ((debug-hook - (lambda () - (with-current-buffer (sldb-get-default-buffer) - (setq max-depth (max sldb-level max-depth)) - (ecase state - (enter - (cond ((= sldb-level level2) - (setq state 'leave) - (sldb-invoke-restart (sldb-first-abort-restart))) - (t - (slime-eval-async `(cl:aref cl:nil ,sldb-level))))) - (leave - (cond ((= sldb-level level1) - (setq state 'ok) - (sldb-quit)) - (t - (sldb-invoke-restart (sldb-first-abort-restart)) - )))))))) - (let ((sldb-hook (cons debug-hook sldb-hook))) - (slime-eval-async `(cl:aref cl:nil 0)) - (slime-sync-to-top-level 15) - (slime-check-top-level) - (slime-check ("Maximum depth reached (%S) is %S." max-depth level2) - (= max-depth level2)) - (slime-check ("Final state reached.") - (eq state 'ok)))))) - -(defun sldb-first-abort-restart () - (let ((case-fold-search t)) - (cl-position-if (lambda (x) (string-match "abort" (car x))) - sldb-restarts))) - -(def-slime-test loop-interrupt-quit - () - "Test interrupting a loop." - '(()) - (slime-check-top-level) - (slime-eval-async '(cl:loop) (lambda (_) ) "CL-USER") - (accept-process-output nil 1) - (slime-check "In eval state." (slime-busy-p)) - (slime-interrupt) - (slime-wait-condition "First interrupt" (lambda () (slime-sldb-level= 1)) 5) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5) - (slime-check-top-level)) - -(def-slime-test loop-interrupt-continue-interrupt-quit - () - "Test interrupting a previously interrupted but continued loop." - '(()) - (slime-check-top-level) - (slime-eval-async '(cl:loop) (lambda (_) ) "CL-USER") - (sleep-for 1) - (slime-wait-condition "running" #'slime-busy-p 5) - (slime-interrupt) - (slime-wait-condition "First interrupt" (lambda () (slime-sldb-level= 1)) 5) - (with-current-buffer (sldb-get-default-buffer) - (sldb-continue)) - (slime-wait-condition "running" (lambda () - (and (slime-busy-p) - (not (sldb-get-default-buffer)))) 5) - (slime-interrupt) - (slime-wait-condition "Second interrupt" (lambda () (slime-sldb-level= 1)) 5) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5) - (slime-check-top-level)) - -(def-slime-test interactive-eval - () - "Test interactive eval and continuing from the debugger." - '(()) - (slime-check-top-level) - (lexical-let ((done nil)) - (let ((sldb-hook (lambda () (sldb-continue) (setq done t)))) - (slime-interactive-eval - "(progn\ - (cerror \"foo\" \"restart\")\ - (cerror \"bar\" \"restart\")\ - (+ 1 2))") - (while (not done) (accept-process-output)) - (slime-sync-to-top-level 5) - (slime-check-top-level) - (unless noninteractive - (let ((message (current-message))) - (slime-check "Minibuffer contains: \"3\"" - (equal "=> 3 (2 bits, #x3, #o3, #b11)" message))))))) - -(def-slime-test report-condition-with-circular-list - (format-control format-argument) - "Test conditions involving circular lists." - '(("~a" "(let ((x (cons nil nil))) (setf (cdr x) x))") - ("~a" "(let ((x (cons nil nil))) (setf (car x) x))") - ("~a" "(let ((x (cons (make-string 100000 :initial-element #\\X) nil)))\ - (setf (cdr x) x))")) - (slime-check-top-level) - (lexical-let ((done nil)) - (let ((sldb-hook (lambda () (sldb-continue) (setq done t)))) - (slime-interactive-eval - (format "(with-standard-io-syntax (cerror \"foo\" \"%s\" %s) (+ 1 2))" - format-control format-argument)) - (while (not done) (accept-process-output)) - (slime-sync-to-top-level 5) - (slime-check-top-level) - (unless noninteractive - (let ((message (current-message))) - (slime-check "Minibuffer contains: \"3\"" - (equal "=> 3 (2 bits, #x3, #o3, #b11)" message))))))) - -(def-slime-test interrupt-bubbling-idiot - () - "Test interrupting a loop that sends a lot of output to Emacs." - '(()) - (accept-process-output nil 1) - (slime-check-top-level) - (slime-eval-async '(cl:loop :for i :from 0 :do (cl:progn (cl:print i) - (cl:finish-output))) - (lambda (_) ) - "CL-USER") - (sleep-for 1) - (slime-interrupt) - (slime-wait-condition "Debugger visible" - (lambda () - (and (slime-sldb-level= 1) - (get-buffer-window (sldb-get-default-buffer)))) - 30) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5)) - -(def-slime-test (interrupt-encode-message (:style :sigio)) - () - "Test interrupt processing during swank::encode-message" - '(()) - (slime-eval-async '(cl:loop :for i :from 0 - :do (swank::background-message "foo ~d" i))) - (sleep-for 1) - (slime-eval-async '(cl:/ 1 0)) - (slime-wait-condition "Debugger visible" - (lambda () - (and (slime-sldb-level= 1) - (get-buffer-window (sldb-get-default-buffer)))) - 30) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5)) - -(def-slime-test inspector - (exp) - "Test basic inspector workingness." - '(((let ((h (make-hash-table))) - (loop for i below 10 do (setf (gethash i h) i)) - h)) - ((make-array 10)) - ((make-list 10)) - ('cons) - (#'cons)) - (slime-inspect (prin1-to-string exp)) - (cl-assert (not (slime-inspector-visible-p))) - (slime-wait-condition "Inspector visible" #'slime-inspector-visible-p 5) - (with-current-buffer (window-buffer (selected-window)) - (slime-inspector-quit)) - (slime-wait-condition "Inspector closed" - (lambda () (not (slime-inspector-visible-p))) - 5) - (slime-sync-to-top-level 1)) - -(defun slime-buffer-visible-p (name) - (let ((buffer (window-buffer (selected-window)))) - (string-match name (buffer-name buffer)))) - -(defun slime-inspector-visible-p () - (slime-buffer-visible-p (slime-buffer-name :inspector))) - -(defun slime-execute-as-command (name) - "Execute `name' as if it was done by the user through the -Command Loop. Similiar to `call-interactively' but also pushes on -the buffer's undo-list." - (undo-boundary) - (call-interactively name)) - -(def-slime-test macroexpand - (macro-defs bufcontent expansion1 search-str expansion2) - "foo" - '((("(defmacro qwertz (&body body) `(list :qwertz ',body))" - "(defmacro yxcv (&body body) `(list :yxcv (qwertz ,@body)))") - "(yxcv :A :B :C)" - "(list :yxcv (qwertz :a :b :c))" - "(qwertz" - "(list :yxcv (list :qwertz '(:a :b :c)))")) - (slime-check-top-level) - (setq slime-buffer-package ":swank") - (with-temp-buffer - (lisp-mode) - (dolist (def macro-defs) - (slime-compile-string def 0) - (slime-sync-to-top-level 5)) - (insert bufcontent) - (goto-char (point-min)) - (slime-execute-as-command 'slime-macroexpand-1) - (slime-wait-condition "Macroexpansion buffer visible" - (lambda () - (slime-buffer-visible-p - (slime-buffer-name :macroexpansion))) - 5) - (with-current-buffer (get-buffer (slime-buffer-name :macroexpansion)) - (slime-test-expect "Initial macroexpansion is correct" - expansion1 - (downcase (buffer-string)) - #'slime-test-macroexpansion=) - (search-forward search-str) - (backward-up-list) - (slime-execute-as-command 'slime-macroexpand-1-inplace) - (slime-sync-to-top-level 3) - (slime-test-expect "In-place macroexpansion is correct" - expansion2 - (downcase (buffer-string)) - #'slime-test-macroexpansion=) - (slime-execute-as-command 'slime-macroexpand-undo) - (slime-test-expect "Expansion after undo is correct" - expansion1 - (downcase (buffer-string)) - #'slime-test-macroexpansion=))) - (setq slime-buffer-package ":cl-user")) - -(defun slime-test-macroexpansion= (string1 string2) - (let ((string1 (replace-regexp-in-string " *\n *" " " string1)) - (string2 (replace-regexp-in-string " *\n *" " " string2))) - (equal string1 string2))) - -(def-slime-test indentation (buffer-content point-markers) - "Check indentation update to work correctly." - '((" -\(in-package :swank) - -\(defmacro with-lolipop (&body body) - `(progn ,@body)) - -\(defmacro lolipop (&body body) - `(progn ,@body)) - -\(with-lolipop - 1 - 2 - 42) - -\(lolipop - 1 - 2 - 23) -" - ("23" "42"))) - (with-temp-buffer - (lisp-mode) - (slime-lisp-mode-hook) - (insert buffer-content) - (slime-compile-region (point-min) (point-max)) - (slime-sync-to-top-level 3) - (slime-update-indentation) - (slime-sync-to-top-level 3) - (dolist (marker point-markers) - (search-backward marker) - (beginning-of-defun) - (indent-sexp)) - (slime-test-expect "Correct buffer content" - buffer-content - (substring-no-properties (buffer-string))))) - -(def-slime-test break - (times exp) - "Test whether BREAK invokes SLDB." - (let ((exp1 '(break))) - `((1 ,exp1) (2 ,exp1) (3 ,exp1))) - (accept-process-output nil 0.2) - (slime-check-top-level) - (slime-eval-async - `(cl:eval (cl:read-from-string - ,(prin1-to-string `(dotimes (i ,times) - (unless (= i 0) - (swank::sleep-for 1)) - ,exp))))) - (dotimes (_i times) - (slime-wait-condition "Debugger visible" - (lambda () - (and (slime-sldb-level= 1) - (get-buffer-window - (sldb-get-default-buffer)))) - 3) - (with-current-buffer (sldb-get-default-buffer) - (sldb-continue)) - (slime-wait-condition "sldb closed" - (lambda () (not (sldb-get-default-buffer))) - 0.5)) - (slime-sync-to-top-level 1)) - -(def-slime-test (break2 (:fails-for "cmucl" "allegro")) - (times exp) - "Backends should arguably make sure that BREAK does not depend -on *DEBUGGER-HOOK*." - (let ((exp2 - '(block outta - (let ((*debugger-hook* (lambda (c h) (return-from outta 42)))) - (break))))) - `((1 ,exp2) (2 ,exp2) (3 ,exp2))) - (slime-test-break times exp)) - -(def-slime-test locally-bound-debugger-hook - () - "Test that binding *DEBUGGER-HOOK* locally works properly." - '(()) - (accept-process-output nil 1) - (slime-check-top-level) - (slime-compile-string - (prin1-to-string `(defun cl-user::quux () - (block outta - (let ((*debugger-hook* - (lambda (c hook) - (declare (ignore c hook)) - (return-from outta 42)))) - (error "FOO"))))) - 0) - (slime-sync-to-top-level 2) - (slime-eval-async '(cl-user::quux)) - ;; FIXME: slime-wait-condition returns immediately if the test returns true - (slime-wait-condition "Checking that Debugger does not popup" - (lambda () - (not (sldb-get-default-buffer))) - 3) - (slime-sync-to-top-level 5)) - -(def-slime-test end-of-file - (expr) - "Signalling END-OF-FILE should invoke the debugger." - '(((cl:error 'cl:end-of-file)) - ((cl:read-from-string ""))) - (let ((value (slime-eval - `(cl:let ((condition nil)) - (cl:with-simple-restart - (cl:continue "continue") - (cl:let ((cl:*debugger-hook* - (cl:lambda (c h) - (cl:setq condition c) - (cl:continue)))) - ,expr)) - (cl:if (cl:typep condition 'cl:end-of-file) t))))) - (slime-test-expect "Debugger invoked" t value))) - -(def-slime-test interrupt-at-toplevel - () - "Let's see what happens if we send a user interrupt at toplevel." - '(()) - (slime-check-top-level) - (unless (and (eq (slime-communication-style) :spawn) - (not (featurep 'slime-repl))) - (slime-interrupt) - (slime-wait-condition - "Debugger visible" - (lambda () - (and (slime-sldb-level= 1) - (get-buffer-window (sldb-get-default-buffer)))) - 5) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 5))) - -(def-slime-test interrupt-in-debugger (interrupts continues) - "Let's see what happens if we interrupt the debugger. -INTERRUPTS ... number of nested interrupts -CONTINUES ... how often the continue restart should be invoked" - '((1 0) (2 1) (4 2)) - (slime-check "No debugger" (not (sldb-get-default-buffer))) - (when (and (eq (slime-communication-style) :spawn) - (not (featurep 'slime-repl))) - (slime-eval-async '(swank::without-slime-interrupts - (swank::receive))) - (sit-for 0.2)) - (dotimes (i interrupts) - (slime-interrupt) - (let ((level (1+ i))) - (slime-wait-condition (format "Debug level %d reachend" level) - (lambda () (equal (sldb-level) level)) - 2))) - (dotimes (i continues) - (with-current-buffer (sldb-get-default-buffer) - (sldb-continue)) - (let ((level (- interrupts (1+ i)))) - (slime-wait-condition (format "Return to debug level %d" level) - (lambda () (equal (sldb-level) level)) - 2))) - (with-current-buffer (sldb-get-default-buffer) - (sldb-quit)) - (slime-sync-to-top-level 1)) - -(def-slime-test flow-control - (n delay interrupts) - "Let Lisp produce output faster than Emacs can consume it." - `((400 0.03 3)) - (when noninteractive - (slime-skip-test "test is currently unstable")) - (slime-check "No debugger" (not (sldb-get-default-buffer))) - (slime-eval-async `(swank:flow-control-test ,n ,delay)) - (sleep-for 0.2) - (dotimes (_i interrupts) - (slime-interrupt) - (slime-wait-condition "In debugger" (lambda () (slime-sldb-level= 1)) 5) - (slime-check "In debugger" (slime-sldb-level= 1)) - (with-current-buffer (sldb-get-default-buffer) - (sldb-continue)) - (slime-wait-condition "No debugger" (lambda () (slime-sldb-level= nil)) 3) - (slime-check "Debugger closed" (slime-sldb-level= nil))) - (slime-sync-to-top-level 8)) - -(def-slime-test sbcl-world-lock - (n delay) - "Print something from *MACROEXPAND-HOOK*. -In SBCL, the compiler grabs a lock which can be problematic because -no method dispatch code can be generated for other threads. -This test will fail more likely before dispatch caches are warmed up." - '((10 0.03) - ;;((cl:+ swank::send-counter-limit 10) 0.03) - ) - (slime-test-expect "no error" - 123 - (slime-eval - `(cl:let ((cl:*macroexpand-hook* - (cl:lambda (fun form env) - (swank:flow-control-test ,n ,delay) - (cl:funcall fun form env)))) - (cl:eval '(cl:macrolet ((foo () 123)) - (foo))))))) - -(def-slime-test (disconnect-one-connection (:style :spawn)) () - "`slime-disconnect' should disconnect only the current connection" - '(()) - (let ((connection-count (length slime-net-processes)) - (old-connection slime-default-connection) - (slime-connected-hook nil)) - (unwind-protect - (let ((slime-dispatching-connection - (slime-connect "localhost" - ;; Here we assume that the request will - ;; be evaluated in its own thread. - (slime-eval `(swank:create-server - :port 0 ; use random port - :style :spawn - :dont-close nil))))) - (slime-sync-to-top-level 3) - (slime-disconnect) - (slime-test-expect "Number of connections must remane the same" - connection-count - (length slime-net-processes))) - (slime-select-connection old-connection)))) - -(def-slime-test disconnect-and-reconnect - () - "Close the connetion. -Confirm that the subprocess continues gracefully. -Reconnect afterwards." - '(()) - (slime-check-top-level) - (let* ((c (slime-connection)) - (p (slime-inferior-process c))) - (with-current-buffer (process-buffer p) - (erase-buffer)) - (delete-process c) - (assert (equal (process-status c) 'closed) nil "Connection not closed") - (accept-process-output nil 0.1) - (assert (equal (process-status p) 'run) nil "Subprocess not running") - (with-current-buffer (process-buffer p) - (assert (< (buffer-size) 500) nil "Unusual output")) - (slime-inferior-connect p (slime-inferior-lisp-args p)) - (lexical-let ((hook nil) (p p)) - (setq hook (lambda () - (slime-test-expect - "We are connected again" p (slime-inferior-process)) - (remove-hook 'slime-connected-hook hook))) - (add-hook 'slime-connected-hook hook) - (slime-wait-condition "Lisp restarted" - (lambda () - (not (member hook slime-connected-hook))) - 5)))) - - -;;;; SLIME-loading tests that launch separate Emacsen -;;;; -(cl-defun slime-test-recipe-test-for (&key preflight - takeoff - landing) - (let ((success nil) - (test-file (make-temp-file "slime-recipe-" nil ".el")) - (test-forms - `((require 'cl) - (labels - ((die - (reason &optional more) - (princ reason) - (terpri) - (and more (pp more)) - (kill-emacs 254))) - (condition-case err - (progn ,@preflight) - (error - (die "Unexpected error running preflight forms" - err))) - (add-hook - 'slime-connected-hook - #'(lambda () - (condition-case err - (progn - ,@landing - (kill-emacs 0)) - (error - (die "Unexpected error running landing forms" - err)))) - t) - (condition-case err - (progn - ,@takeoff - ,(when (null landing) '(kill-emacs 0))) - (error - (die "Unexpected error running takeoff forms" - err))) - (with-timeout - (20 - (die "Timeout waiting for recipe test to finish." - takeoff)) - (while t (sit-for 1))))))) - (unwind-protect - (progn - (with-temp-buffer - (mapc #'insert (mapcar #'pp-to-string test-forms)) - (write-file test-file)) - (with-temp-buffer - (let ((retval - (call-process (concat invocation-directory invocation-name) - nil (list t nil) nil - "-Q" "--batch" - "-l" test-file))) - (unless (= 0 retval) - (ert-fail (buffer-substring - (+ (goto-char (point-min)) - (skip-chars-forward " \t\n")) - (+ (goto-char (point-max)) - (skip-chars-backward " \t\n"))))))) - (setq success t)) - (if success (delete-file test-file) - (message "Test failed: keeping %s for inspection" test-file))))) - -(define-slime-ert-test readme-recipe () - "Test the README.md's autoload recipe." - (slime-test-recipe-test-for - :preflight `((add-to-list 'load-path ,slime-path) - (require 'slime-autoloads) - (setq inferior-lisp-program ,inferior-lisp-program) - (setq slime-contribs '(slime-fancy))) - :takeoff `((call-interactively 'slime)) - :landing `((unless (and (featurep 'slime-repl) - (find 'swank-repl slime-required-modules)) - (die "slime-repl not loaded properly")) - (with-current-buffer (slime-repl-buffer) - (unless (and (string-match "^; +SLIME" (buffer-string)) - (string-match "CL-USER> *$" (buffer-string))) - (die "REPL prompt not properly setup" - (buffer-substring-no-properties (point-min) - (point-max)))))))) - -(define-slime-ert-test traditional-recipe () - "Test the README.md's traditional recipe." - (slime-test-recipe-test-for - :preflight `((add-to-list 'load-path ,slime-path) - (require 'slime) - (setq inferior-lisp-program ,inferior-lisp-program) - (slime-setup '(slime-fancy))) - :takeoff `((call-interactively 'slime)) - :landing `((unless (and (featurep 'slime-repl) - (find 'swank-repl slime-required-modules)) - (die "slime-repl not loaded properly")) - (with-current-buffer (slime-repl-buffer) - (unless (and (string-match "^; +SLIME" (buffer-string)) - (string-match "CL-USER> *$" (buffer-string))) - (die "REPL prompt not properly setup" - (buffer-substring-no-properties (point-min) - (point-max)))))))) - -(define-slime-ert-test readme-recipe-autoload-on-lisp-visit () - "Test more autoload bits in README.md's installation recipe." - (slime-test-recipe-test-for - :preflight `((add-to-list 'load-path ,slime-path) - (require 'slime-autoloads)) - :takeoff `((if (featurep 'slime) - (die "Didn't expect SLIME to be loaded so early!")) - (find-file ,(make-temp-file "slime-lisp-source-file" nil - ".lisp")) - (unless (featurep 'slime) - (die "Expected SLIME to be fully loaded by now"))))) - -(defun slime-test-eval-now (string) - (second (slime-eval `(swank:eval-and-grab-output ,string)))) - -(def-slime-test (slime-recompile-all-xrefs (:fails-for "cmucl")) () - "Test recompilation of all references within an xref buffer." - '(()) - (let* ((cell (cons nil nil)) - (hook (slime-curry (lambda (cell &rest _) (setcar cell t)) cell)) - (filename (make-temp-file "slime-recompile-all-xrefs" nil ".lisp"))) - (add-hook 'slime-compilation-finished-hook hook) - (unwind-protect - (with-temp-file filename - (set-visited-file-name filename) - (slime-test-eval-now "(defparameter swank::*.var.* nil)") - (insert "(in-package :swank) - (defun .fn1. ()) - (defun .fn2. () (.fn1.) #.*.var.*) - (defun .fn3. () (.fn1.) #.*.var.*)") - (save-buffer) - (slime-compile-and-load-file) - (slime-wait-condition "Compilation finished" - (lambda () (car cell)) - 0.5) - (slime-test-eval-now "(setq *.var.* t)") - (setcar cell nil) - (slime-xref :calls ".fn1." - (lambda (&rest args) - (apply #'slime-show-xrefs args) - (setcar cell t))) - (slime-wait-condition "Xrefs computed and displayed" - (lambda () (car cell)) - 0.5) - (setcar cell nil) - (with-current-buffer slime-xref-last-buffer - (slime-recompile-all-xrefs) - (slime-wait-condition "Compilation finished" - (lambda () (car cell)) - 0.5)) - (should (cl-equalp (list (slime-test-eval-now "(.fn2.)") - (slime-test-eval-now "(.fn3.)")) - '("T" "T")))) - (remove-hook 'slime-compilation-finished-hook hook) - (when slime-xref-last-buffer - (kill-buffer slime-xref-last-buffer))))) - -(provide 'slime-tests) diff --git a/elpa/slime-20200414.1444/slime-tests.elc b/elpa/slime-20200414.1444/slime-tests.elc deleted file mode 100644 index a277df61db371837f3afb55151dc9d793baeb0a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97154 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 U)QX0IXKh%`A`C?OVG6qcKeX5cCjbBd diff --git a/elpa/slime-20200414.1444/slime.el b/elpa/slime-20200414.1444/slime.el deleted file mode 100644 index d820624d..00000000 --- a/elpa/slime-20200414.1444/slime.el +++ /dev/null @@ -1,7660 +0,0 @@ -;;; slime.el --- Superior Lisp Interaction Mode for Emacs -*-lexical-binding:t-*- - -;; URL: https://github.com/slime/slime -;; Package-Requires: ((cl-lib "0.5") (macrostep "0.9")) -;; Keywords: languages, lisp, slime -;; Version: 2.24 - -;;;; License and Commentary - -;; Copyright (C) 2003 Eric Marsden, Luke Gorrie, Helmut Eller -;; Copyright (C) 2004,2005,2006 Luke Gorrie, Helmut Eller -;; Copyright (C) 2007,2008,2009 Helmut Eller, Tobias C. Rittweiler -;; -;; For a detailed list of contributors, see the manual. -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2 of -;; the License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public -;; License along with this program; if not, write to the Free -;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -;; MA 02111-1307, USA. - -;;; Commentary: - -;; SLIME is the ``Superior Lisp Interaction Mode for Emacs.'' -;; -;; SLIME extends Emacs with support for interactive programming in -;; Common Lisp. The features are centered around slime-mode, an Emacs -;; minor-mode that complements the standard lisp-mode. While lisp-mode -;; supports editing Lisp source files, slime-mode adds support for -;; interacting with a running Common Lisp process for compilation, -;; debugging, documentation lookup, and so on. -;; -;; The slime-mode programming environment follows the example of -;; Emacs's native Emacs Lisp environment. We have also included good -;; ideas from similar systems (such as ILISP) and some new ideas of -;; our own. -;; -;; SLIME is constructed from two parts: a user-interface written in -;; Emacs Lisp, and a supporting server program written in Common -;; Lisp. The two sides are connected together with a socket and -;; communicate using an RPC-like protocol. -;; -;; The Lisp server is primarily written in portable Common Lisp. The -;; required implementation-specific functionality is specified by a -;; well-defined interface and implemented separately for each Lisp -;; implementation. This makes SLIME readily portable. - -;;; Code: - - -;;;; Dependencies and setup -(eval-and-compile - (require 'cl-lib nil t) - ;; For emacs 23, look for bundled version - (require 'cl-lib "lib/cl-lib")) - -(eval-when-compile (require 'cl)) ; defsetf, lexical-let - -(eval-and-compile - (if (< emacs-major-version 23) - (error "Slime requires an Emacs version of 23, or above"))) - -(require 'hyperspec "lib/hyperspec") -(require 'thingatpt) -(require 'comint) -(require 'pp) -(require 'easymenu) -(require 'outline) -(require 'arc-mode) -(require 'etags) -(require 'compile) - -(eval-when-compile - (require 'apropos) - (require 'gud) - (require 'lisp-mnt)) - -(declare-function lm-version "lisp-mnt") - -(defvar slime-path nil - "Directory containing the Slime package. -This is used to load the supporting Common Lisp library, Swank. -The default value is automatically computed from the location of -the Emacs Lisp package.") -(setq slime-path (file-name-directory load-file-name)) - -(defvar slime-version nil - "The version of SLIME that you're using.") -(setq slime-version - (eval-when-compile - (lm-version - (cl-find "slime.el" - (remove nil - (list load-file-name - (when (boundp 'byte-compile-current-file) - byte-compile-current-file))) - :key #'file-name-nondirectory - :test #'string-equal)))) - -(defvar slime-lisp-modes '(lisp-mode)) -(defvar slime-contribs '(slime-fancy) - "A list of contrib packages to load with SLIME.") -(define-obsolete-variable-alias 'slime-setup-contribs -'slime-contribs "2.3.2") - -(cl-defun slime-setup (&optional (contribs nil contribs-p)) - "Setup Emacs so that lisp-mode buffers always use SLIME. -CONTRIBS is a list of contrib packages to load. If `nil', use -`slime-contribs'. " - (interactive) - (when (member 'lisp-mode slime-lisp-modes) - (add-hook 'lisp-mode-hook 'slime-lisp-mode-hook)) - (when contribs-p - (setq slime-contribs contribs)) - (slime--setup-contribs)) - -(defvar slime-required-modules '()) - -(defun slime--setup-contribs () - "Load and initialize contribs." - (dolist (c slime-contribs) - (unless (featurep c) - (require c) - (let ((init (intern (format "%s-init" c)))) - (when (fboundp init) - (funcall init)))))) - -(defun slime-lisp-mode-hook () - (slime-mode 1) - (set (make-local-variable 'lisp-indent-function) - 'common-lisp-indent-function)) - -(defvar slime-protocol-version nil) -(setq slime-protocol-version slime-version) - - -;;;; Customize groups -;; -;;;;; slime - -(defgroup slime nil - "Interaction with the Superior Lisp Environment." - :prefix "slime-" - :group 'applications) - -;;;;; slime-ui - -(defgroup slime-ui nil - "Interaction with the Superior Lisp Environment." - :prefix "slime-" - :group 'slime) - -(defcustom slime-truncate-lines t - "Set `truncate-lines' in popup buffers. -This applies to buffers that present lines as rows of data, such as -debugger backtraces and apropos listings." - :type 'boolean - :group 'slime-ui) - -(defcustom slime-kill-without-query-p nil - "If non-nil, kill SLIME processes without query when quitting Emacs. -This applies to the *inferior-lisp* buffer and the network connections." - :type 'boolean - :group 'slime-ui) - -;;;;; slime-lisp - -(defgroup slime-lisp nil - "Lisp server configuration." - :prefix "slime-" - :group 'slime) - -(defcustom slime-backend "swank-loader.lisp" - "The name of the Lisp file that loads the Swank server. -This name is interpreted relative to the directory containing -slime.el, but could also be set to an absolute filename." - :type 'string - :group 'slime-lisp) - -(defcustom slime-connected-hook nil - "List of functions to call when SLIME connects to Lisp." - :type 'hook - :group 'slime-lisp) - -(defcustom slime-enable-evaluate-in-emacs nil - "*If non-nil, the inferior Lisp can evaluate arbitrary forms in Emacs. -The default is nil, as this feature can be a security risk." - :type '(boolean) - :group 'slime-lisp) - -(defcustom slime-lisp-host "localhost" - "The default hostname (or IP address) to connect to." - :type 'string - :group 'slime-lisp) - -(defcustom slime-port 4005 - "Port to use as the default for `slime-connect'." - :type 'integer - :group 'slime-lisp) - -(defvar slime-connect-host-history (list slime-lisp-host)) -(defvar slime-connect-port-history (list (prin1-to-string slime-port))) - -(defvar slime-net-valid-coding-systems - '((iso-latin-1-unix nil "iso-latin-1-unix") - (iso-8859-1-unix nil "iso-latin-1-unix") - (binary nil "iso-latin-1-unix") - (utf-8-unix t "utf-8-unix") - (emacs-mule-unix t "emacs-mule-unix") - (euc-jp-unix t "euc-jp-unix")) - "A list of valid coding systems. -Each element is of the form: (NAME MULTIBYTEP CL-NAME)") - -(defun slime-find-coding-system (name) - "Return the coding system for the symbol NAME. -The result is either an element in `slime-net-valid-coding-systems' -of nil." - (let ((probe (assq name slime-net-valid-coding-systems))) - (when (and probe (if (fboundp 'check-coding-system) - (ignore-errors (check-coding-system (car probe))) - (eq (car probe) 'binary))) - probe))) - -(defcustom slime-net-coding-system - (car (cl-find-if 'slime-find-coding-system - slime-net-valid-coding-systems :key 'car)) - "Coding system used for network connections. -See also `slime-net-valid-coding-systems'." - :type (cons 'choice - (mapcar (lambda (x) - (list 'const (car x))) - slime-net-valid-coding-systems)) - :group 'slime-lisp) - -;;;;; slime-mode - -(defgroup slime-mode nil - "Settings for slime-mode Lisp source buffers." - :prefix "slime-" - :group 'slime) - -(defcustom slime-find-definitions-function 'slime-find-definitions-rpc - "Function to find definitions for a name. -The function is called with the definition name, a string, as its -argument." - :type 'function - :group 'slime-mode - :options '(slime-find-definitions-rpc - slime-etags-definitions - (lambda (name) - (append (slime-find-definitions-rpc name) - (slime-etags-definitions name))) - (lambda (name) - (or (slime-find-definitions-rpc name) - (and tags-table-list - (slime-etags-definitions name)))))) - -;; FIXME: remove one day -(defcustom slime-complete-symbol-function 'nil - "Obsolete. Use `slime-completion-at-point-functions' instead." - :group 'slime-mode - :type '(choice (const :tag "Compound" slime-complete-symbol*) - (const :tag "Fuzzy" slime-fuzzy-complete-symbol))) - -(make-obsolete-variable 'slime-complete-symbol-function - 'slime-completion-at-point-functions - "2015-10-18") - -(defcustom slime-completion-at-point-functions - '(slime-filename-completion - slime-simple-completion-at-point) - "List of functions to perform completion. -Works like `completion-at-point-functions'. -`slime--completion-at-point' uses this variable." - :group 'slime-mode) - -;;;;; slime-mode-faces - -(defgroup slime-mode-faces nil - "Faces in slime-mode source code buffers." - :prefix "slime-" - :group 'slime-mode) - -(defface slime-error-face - `((((class color) (background light)) - (:underline "red")) - (((class color) (background dark)) - (:underline "red")) - (t (:underline t))) - "Face for errors from the compiler." - :group 'slime-mode-faces) - -(defface slime-warning-face - `((((class color) (background light)) - (:underline "orange")) - (((class color) (background dark)) - (:underline "coral")) - (t (:underline t))) - "Face for warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-style-warning-face - `((((class color) (background light)) - (:underline "brown")) - (((class color) (background dark)) - (:underline "gold")) - (t (:underline t))) - "Face for style-warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-note-face - `((((class color) (background light)) - (:underline "brown4")) - (((class color) (background dark)) - (:underline "light goldenrod")) - (t (:underline t))) - "Face for notes from the compiler." - :group 'slime-mode-faces) - -(defface slime-early-deprecation-warning-face - `((((type graphic) (class color) (background light)) - (:strike-through "brown")) - (((type graphic) (class color) (background dark)) - (:strike-through "gold")) - (((type graphic)) - (:strike-through t)) - (((class color) (background light)) - (:underline "brown")) - (((class color) (background dark)) - (:underline "gold")) - (t - (:underline t))) - "Face for early deprecation warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-late-deprecation-warning-face - `((((type graphic) (class color) (background light)) - (:strike-through "orange")) - (((type graphic) (class color) (background dark)) - (:strike-through "coral")) - (((type graphic)) - (:strike-through t)) - (((class color) (background light)) - (:underline "orange")) - (((class color) (background dark)) - (:underline "coral")) - (t - (:underline t))) - "Face for late deprecation warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-final-deprecation-warning-face - `((((type graphic) (class color) (background light)) - (:strike-through "red")) - (((type graphic) (class color) (background dark)) - (:strike-through "red")) - (((type graphic)) - (:strike-through t)) - (((class color) (background light)) - (:underline "red")) - (((class color) (background dark)) - (:underline "red")) - (t - (:strike-through t))) - "Face for final deprecation warnings from the compiler." - :group 'slime-mode-faces) - -(defface slime-highlight-face - '((t (:inherit highlight :underline nil))) - "Face for compiler notes while selected." - :group 'slime-mode-faces) - -;;;;; sldb - -(defgroup slime-debugger nil - "Backtrace options and fontification." - :prefix "sldb-" - :group 'slime) - -(defmacro define-sldb-faces (&rest faces) - "Define the set of SLDB faces. -Each face specifiation is (NAME DESCRIPTION &optional PROPERTIES). -NAME is a symbol; the face will be called sldb-NAME-face. -DESCRIPTION is a one-liner for the customization buffer. -PROPERTIES specifies any default face properties." - `(progn ,@(cl-loop for face in faces - collect `(define-sldb-face ,@face)))) - -(defmacro define-sldb-face (name description &optional default) - (let ((facename (intern (format "sldb-%s-face" (symbol-name name))))) - `(defface ,facename - (list (list t ,default)) - ,(format "Face for %s." description) - :group 'slime-debugger))) - -(define-sldb-faces - (topline "the top line describing the error") - (condition "the condition class" - '(:inherit font-lock-warning-face)) - (section "the labels of major sections in the debugger buffer" - '(:inherit header-line)) - (frame-label "backtrace frame numbers" - '(:inherit shadow)) - (restart-type "restart names." - '(:inherit font-lock-keyword-face)) - (restart "restart descriptions") - (restart-number "restart numbers (correspond to keystrokes to invoke)" - '(:bold t)) - (frame-line "function names and arguments in the backtrace") - (restartable-frame-line - "frames which are surely restartable" - '(:foreground "lime green")) - (non-restartable-frame-line - "frames which are surely not restartable") - (detailed-frame-line - "function names and arguments in a detailed (expanded) frame") - (local-name "local variable names" - '(:inherit font-lock-variable-name-face)) - (local-value "local variable values") - (catch-tag "catch tags" - '(:inherit highlight))) - - -;;;; Minor modes - -;;;;; slime-mode - -(defvar slime-mode-indirect-map (make-sparse-keymap) - "Empty keymap which has `slime-mode-map' as it's parent. -This is a hack so that we can reinitilize the real slime-mode-map -more easily. See `slime-init-keymaps'.") - -(defvar slime-buffer-connection) -(defvar slime-dispatching-connection) -(defvar slime-current-thread) - -(defun slime--on () - (slime-setup-completion)) - -(defun slime--off () - (remove-hook 'completion-at-point-functions #'slime--completion-at-point t)) - -(define-minor-mode slime-mode - "\\\ -SLIME: The Superior Lisp Interaction Mode for Emacs (minor-mode). - -Commands to compile the current buffer's source file and visually -highlight any resulting compiler notes and warnings: -\\[slime-compile-and-load-file] - Compile and load the current buffer's file. -\\[slime-compile-file] - Compile (but not load) the current buffer's file. -\\[slime-compile-defun] - Compile the top-level form at point. - -Commands for visiting compiler notes: -\\[slime-next-note] - Goto the next form with a compiler note. -\\[slime-previous-note] - Goto the previous form with a compiler note. -\\[slime-remove-notes] - Remove compiler-note annotations in buffer. - -Finding definitions: -\\[slime-edit-definition] -- Edit the definition of the function called at point. -\\[slime-pop-find-definition-stack] -- Pop the definition stack to go back from a definition. - -Documentation commands: -\\[slime-describe-symbol] - Describe symbol. -\\[slime-apropos] - Apropos search. -\\[slime-disassemble-symbol] - Disassemble a function. - -Evaluation commands: -\\[slime-eval-defun] - Evaluate top-level from containing point. -\\[slime-eval-last-expression] - Evaluate sexp before point. -\\[slime-pprint-eval-last-expression] \ -- Evaluate sexp before point, pretty-print result. - -Full set of commands: -\\{slime-mode-map}" - :keymap slime-mode-indirect-map - :lighter (:eval (slime-modeline-string)) - (cond (slime-mode (slime--on)) - (t (slime--off)))) - - -;;;;;; Modeline - -(defun slime-modeline-string () - "Return the string to display in the modeline. -\"Slime\" only appears if we aren't connected. If connected, -include package-name, connection-name, and possibly some state -information." - (let ((conn (slime-current-connection))) - ;; Bail out early in case there's no connection, so we won't - ;; implicitly invoke `slime-connection' which may query the user. - (if (not conn) - (and slime-mode " Slime") - (let ((local (eq conn slime-buffer-connection)) - (pkg (slime-current-package))) - (concat " " - (if local "{" "[") - (if pkg (slime-pretty-package-name pkg) "?") - " " - ;; ignore errors for closed connections - (ignore-errors (slime-connection-name conn)) - (slime-modeline-state-string conn) - (if local "}" "]")))))) - -(defun slime-pretty-package-name (name) - "Return a pretty version of a package name NAME." - (cond ((string-match "^#?:\\(.*\\)$" name) - (match-string 1 name)) - ((string-match "^\"\\(.*\\)\"$" name) - (match-string 1 name)) - (t name))) - -(defun slime-modeline-state-string (conn) - "Return a string possibly describing CONN's state." - (cond ((not (eq (process-status conn) 'open)) - (format " %s" (process-status conn))) - ((let ((pending (length (slime-rex-continuations conn))) - (sldbs (length (sldb-buffers conn)))) - (cond ((and (zerop sldbs) (zerop pending)) nil) - ((zerop sldbs) (format " %s" pending)) - (t (format " %s/%s" pending sldbs))))))) - -(defun slime--recompute-modelines () - (force-mode-line-update t)) - - -;;;;; Key bindings - -(defvar slime-parent-map nil - "Parent keymap for shared between all Slime related modes.") - -(defvar slime-parent-bindings - '(("\M-." slime-edit-definition) - ("\M-," slime-pop-find-definition-stack) - ("\M-_" slime-edit-uses) ; for German layout - ("\M-?" slime-edit-uses) ; for USian layout - ("\C-x4." slime-edit-definition-other-window) - ("\C-x5." slime-edit-definition-other-frame) - ("\C-x\C-e" slime-eval-last-expression) - ("\C-\M-x" slime-eval-defun) - ;; Include PREFIX keys... - ("\C-c" slime-prefix-map))) - -(defvar slime-prefix-map nil - "Keymap for commands prefixed with `slime-prefix-key'.") - -(defvar slime-prefix-bindings - '(("\C-r" slime-eval-region) - (":" slime-interactive-eval) - ("\C-e" slime-interactive-eval) - ("E" slime-edit-value) - ("\C-l" slime-load-file) - ("\C-b" slime-interrupt) - ("\M-d" slime-disassemble-symbol) - ("\C-t" slime-toggle-trace-fdefinition) - ("I" slime-inspect) - ("\C-xt" slime-list-threads) - ("\C-xn" slime-next-connection) - ("\C-xp" slime-prev-connection) - ("\C-xc" slime-list-connections) - ("<" slime-list-callers) - (">" slime-list-callees) - ;; Include DOC keys... - ("\C-d" slime-doc-map) - ;; Include XREF WHO-FOO keys... - ("\C-w" slime-who-map) - )) - -(defvar slime-editing-map nil - "These keys are useful for buffers where the user can insert and -edit s-exprs, e.g. for source buffers and the REPL.") - -(defvar slime-editing-keys - `(;; Arglist display & completion - (" " slime-space) - ;; Evaluating - ;;("\C-x\M-e" slime-eval-last-expression-display-output :inferior t) - ("\C-c\C-p" slime-pprint-eval-last-expression) - ;; Macroexpand - ("\C-c\C-m" slime-expand-1) - ("\C-c\M-m" slime-macroexpand-all) - ;; Misc - ("\C-c\C-u" slime-undefine-function) - (,(kbd "C-M-.") slime-next-location) - (,(kbd "C-M-,") slime-previous-location) - ;; Obsolete, redundant bindings - ("\C-c\C-i" completion-at-point) - ;;("\M-*" pop-tag-mark) ; almost to clever - )) - -(defvar slime-mode-map nil - "Keymap for slime-mode.") - -(defvar slime-keys - '( ;; Compiler notes - ("\M-p" slime-previous-note) - ("\M-n" slime-next-note) - ("\C-c\M-c" slime-remove-notes) - ("\C-c\C-k" slime-compile-and-load-file) - ("\C-c\M-k" slime-compile-file) - ("\C-c\C-c" slime-compile-defun))) - -(defun slime-nop () - "The null command. Used to shadow currently-unused keybindings." - (interactive) - (call-interactively 'undefined)) - -(defvar slime-doc-map nil - "Keymap for documentation commands. Bound to a prefix key.") - -(defvar slime-doc-bindings - '((?a slime-apropos) - (?z slime-apropos-all) - (?p slime-apropos-package) - (?d slime-describe-symbol) - (?f slime-describe-function) - (?h slime-documentation-lookup) - (?~ common-lisp-hyperspec-format) - (?g common-lisp-hyperspec-glossary-term) - (?# common-lisp-hyperspec-lookup-reader-macro))) - -(defvar slime-who-map nil - "Keymap for who-xref commands. Bound to a prefix key.") - -(defvar slime-who-bindings - '((?c slime-who-calls) - (?w slime-calls-who) - (?r slime-who-references) - (?b slime-who-binds) - (?s slime-who-sets) - (?m slime-who-macroexpands) - (?a slime-who-specializes))) - -(defun slime-init-keymaps () - "(Re)initialize the keymaps for `slime-mode'." - (interactive) - (slime-init-keymap 'slime-doc-map t t slime-doc-bindings) - (slime-init-keymap 'slime-who-map t t slime-who-bindings) - (slime-init-keymap 'slime-prefix-map t nil slime-prefix-bindings) - (slime-init-keymap 'slime-parent-map nil nil slime-parent-bindings) - (slime-init-keymap 'slime-editing-map nil nil slime-editing-keys) - (set-keymap-parent slime-editing-map slime-parent-map) - (slime-init-keymap 'slime-mode-map nil nil slime-keys) - (set-keymap-parent slime-mode-map slime-editing-map) - (set-keymap-parent slime-mode-indirect-map slime-mode-map)) - -(defun slime-init-keymap (keymap-name prefixp bothp bindings) - (set keymap-name (make-sparse-keymap)) - (when prefixp (define-prefix-command keymap-name)) - (slime-bind-keys (eval keymap-name) bothp bindings)) - -(defun slime-bind-keys (keymap bothp bindings) - "Add BINDINGS to KEYMAP. -If BOTHP is true also add bindings with control modifier." - (cl-loop for (key command) in bindings do - (cond (bothp - (define-key keymap `[,key] command) - (unless (equal key ?h) ; But don't bind C-h - (define-key keymap `[(control ,key)] command))) - (t (define-key keymap key command))))) - -(slime-init-keymaps) - -(define-minor-mode slime-editing-mode - "Minor mode which makes slime-editing-map available. -\\{slime-editing-map}" - nil - nil - slime-editing-map) - - -;;;; Framework'ey bits -;;; -;;; This section contains some standard SLIME idioms: basic macros, -;;; ways of showing messages to the user, etc. All the code in this -;;; file should use these functions when applicable. -;;; -;;;;; Syntactic sugar - -(defmacro slime-dcase (value &rest patterns) - (declare (indent 1)) - "Dispatch VALUE to one of PATTERNS. -A cross between `case' and `destructuring-bind'. -The pattern syntax is: - ((HEAD . ARGS) . BODY) -The list of patterns is searched for a HEAD `eq' to the car of -VALUE. If one is found, the BODY is executed with ARGS bound to the -corresponding values in the CDR of VALUE." - (let ((operator (cl-gensym "op-")) - (operands (cl-gensym "rand-")) - (tmp (cl-gensym "tmp-"))) - `(let* ((,tmp ,value) - (,operator (car ,tmp)) - (,operands (cdr ,tmp))) - (cl-case ,operator - ,@(mapcar (lambda (clause) - (if (eq (car clause) t) - `(t ,@(cdr clause)) - (cl-destructuring-bind ((op &rest rands) &rest body) - clause - `(,op (cl-destructuring-bind ,rands ,operands - . ,(or body - '((ignore)) ; suppress some warnings - )))))) - patterns) - ,@(if (eq (caar (last patterns)) t) - '() - `((t (error "slime-dcase failed: %S" ,tmp)))))))) - -(defmacro slime-define-keys (keymap &rest key-command) - "Define keys in KEYMAP. Each KEY-COMMAND is a list of (KEY COMMAND)." - (declare (indent 1)) - `(progn . ,(mapcar (lambda (k-c) `(define-key ,keymap . ,k-c)) - key-command))) - -(cl-defmacro with-struct ((conc-name &rest slots) struct &body body) - "Like with-slots but works only for structs. -\(fn (CONC-NAME &rest SLOTS) STRUCT &body BODY)" - (declare (indent 2)) - (let ((struct-var (cl-gensym "struct")) - (reader (lambda (slot) - (intern (concat (symbol-name conc-name) - (symbol-name slot)))))) - `(let ((,struct-var ,struct)) - (cl-symbol-macrolet - ,(mapcar (lambda (slot) - (cl-etypecase slot - (symbol `(,slot (,(funcall reader slot) ,struct-var))) - (cons `(,(cl-first slot) - (,(funcall reader (cl-second slot)) - ,struct-var))))) - slots) - . ,body)))) - -;;;;; Very-commonly-used functions - -(defvar slime-message-function 'message) - -;; Interface -(defun slime-buffer-name (type &optional hidden) - (cl-assert (keywordp type)) - (concat (if hidden " " "") - (format "*slime-%s*" (substring (symbol-name type) 1)))) - -;; Interface -(defun slime-message (format &rest args) - "Like `message' but with special support for multi-line messages. -Single-line messages use the echo area." - (apply slime-message-function format args)) - -(defun slime-display-warning (message &rest args) - (display-warning '(slime warning) (apply #'format message args))) - -(defvar slime-background-message-function 'slime-display-oneliner) - -;; Interface -(defun slime-background-message (format-string &rest format-args) - "Display a message in passing. -This is like `slime-message', but less distracting because it -will never pop up a buffer or display multi-line messages. -It should be used for \"background\" messages such as argument lists." - (apply slime-background-message-function format-string format-args)) - -(defun slime-display-oneliner (format-string &rest format-args) - (let* ((msg (apply #'format format-string format-args))) - (unless (minibuffer-window-active-p (minibuffer-window)) - (message "%s" (slime-oneliner msg))))) - -(defun slime-oneliner (string) - "Return STRING truncated to fit in a single echo-area line." - (substring string 0 (min (length string) - (or (cl-position ?\n string) most-positive-fixnum) - (1- (window-width (minibuffer-window)))))) - -;; Interface -(defun slime-set-truncate-lines () - "Apply `slime-truncate-lines' to the current buffer." - (when slime-truncate-lines - (set (make-local-variable 'truncate-lines) t))) - -;; Interface -(defun slime-read-package-name (prompt &optional initial-value) - "Read a package name from the minibuffer, prompting with PROMPT." - (let ((completion-ignore-case t)) - (completing-read prompt (slime-bogus-completion-alist - (slime-eval - `(swank:list-all-package-names t))) - nil t initial-value))) - -;; Interface -(defun slime-read-symbol-name (prompt &optional query) - "Either read a symbol name or choose the one at point. -The user is prompted if a prefix argument is in effect, if there is no -symbol at point, or if QUERY is non-nil." - (cond ((or current-prefix-arg query (not (slime-symbol-at-point))) - (slime-read-from-minibuffer prompt (slime-symbol-at-point))) - (t (slime-symbol-at-point)))) - -;; Interface -(defmacro slime-propertize-region (props &rest body) - "Execute BODY and add PROPS to all the text it inserts. -More precisely, PROPS are added to the region between the point's -positions before and after executing BODY." - (declare (indent 1) (debug (sexp &rest form))) - (let ((start (cl-gensym))) - `(let ((,start (point))) - (prog1 (progn ,@body) - (add-text-properties ,start (point) ,props))))) - -(defun slime-add-face (face string) - (declare (indent 1)) - (add-text-properties 0 (length string) (list 'face face) string) - string) - -;; Interface -(defsubst slime-insert-propertized (props &rest args) - "Insert all ARGS and then add text-PROPS to the inserted text." - (slime-propertize-region props (apply #'insert args))) - -(defmacro slime-with-rigid-indentation (level &rest body) - "Execute BODY and then rigidly indent its text insertions. -Assumes all insertions are made at point." - (declare (indent 1)) - (let ((start (cl-gensym)) (l (cl-gensym))) - `(let ((,start (point)) (,l ,(or level '(current-column)))) - (prog1 (progn ,@body) - (slime-indent-rigidly ,start (point) ,l))))) - -(defun slime-indent-rigidly (start end column) - ;; Similar to `indent-rigidly' but doesn't inherit text props. - (let ((indent (make-string column ?\ ))) - (save-excursion - (goto-char end) - (beginning-of-line) - (while (and (<= start (point)) - (progn - (insert-before-markers indent) - (zerop (forward-line -1)))))))) - -(defun slime-insert-indented (&rest strings) - "Insert all arguments rigidly indented." - (slime-with-rigid-indentation nil - (apply #'insert strings))) - -(defun slime-property-bounds (prop) - "Return two the positions of the previous and next changes to PROP. -PROP is the name of a text property." - (cl-assert (get-text-property (point) prop)) - (let ((end (next-single-char-property-change (point) prop))) - (list (previous-single-char-property-change end prop) end))) - -(defun slime-curry (fun &rest args) - "Partially apply FUN to ARGS. The result is a new function. -This idiom is preferred over `lexical-let'." - `(lambda (&rest more) (apply ',fun (append ',args more)))) - -(defun slime-rcurry (fun &rest args) - "Like `slime-curry' but ARGS on the right are applied." - `(lambda (&rest more) (apply ',fun (append more ',args)))) - - -;;;;; Temporary popup buffers - -;; keep compiler quiet -(defvar slime-buffer-package) -(defvar slime-buffer-connection) - -;; Interface -(cl-defmacro slime-with-popup-buffer ((name &key package connection select - mode) - &body body) - "Similar to `with-output-to-temp-buffer'. -Bind standard-output and initialize some buffer-local variables. -Restore window configuration when closed. - -NAME is the name of the buffer to be created. -PACKAGE is the value `slime-buffer-package'. -CONNECTION is the value for `slime-buffer-connection', - if nil, no explicit connection is associated with - the buffer. If t, the current connection is taken. -MODE is the name of a major mode which will be enabled. -" - (declare (indent 1)) - (let ((package-sym (cl-gensym "package-")) - (connection-sym (cl-gensym "connection-"))) - `(let ((,package-sym ,(if (eq package t) - `(slime-current-package) - package)) - (,connection-sym ,(if (eq connection t) - `(slime-current-connection) - connection))) - (with-current-buffer (get-buffer-create ,name) - (let ((inhibit-read-only t) - (standard-output (current-buffer))) - (erase-buffer) - (funcall (or ,mode 'fundamental-mode)) - (setq slime-buffer-package ,package-sym - slime-buffer-connection ,connection-sym) - (set-syntax-table lisp-mode-syntax-table) - ,@body - (slime-popup-buffer-mode 1) - (funcall (if ,select 'pop-to-buffer 'display-buffer) - (current-buffer)) - (current-buffer)))))) - -(defvar slime-popup-buffer-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "q") 'quit-window) - ;;("\C-c\C-z" . slime-switch-to-output-buffer) - (define-key map (kbd "M-.") 'slime-edit-definition) - map)) - -(define-minor-mode slime-popup-buffer-mode - "Mode for displaying read only stuff" - nil nil nil - (setq buffer-read-only t)) - -(add-to-list 'minor-mode-alist - `(slime-popup-buffer-mode - (:eval (unless slime-mode - (slime-modeline-string))))) - -(set-keymap-parent slime-popup-buffer-mode-map slime-parent-map) - -;;;;; Filename translation -;;; -;;; Filenames passed between Emacs and Lisp should be translated using -;;; these functions. This way users who run Emacs and Lisp on separate -;;; machines have a chance to integrate file operations somehow. - -(defvar slime-to-lisp-filename-function #'convert-standard-filename - "Function to translate Emacs filenames to CL namestrings.") -(defvar slime-from-lisp-filename-function #'identity - "Function to translate CL namestrings to Emacs filenames.") - -(defun slime-to-lisp-filename (filename) - "Translate the string FILENAME to a Lisp filename." - (funcall slime-to-lisp-filename-function filename)) - -(defun slime-from-lisp-filename (filename) - "Translate the Lisp filename FILENAME to an Emacs filename." - (funcall slime-from-lisp-filename-function filename)) - - -;;;; Starting SLIME -;;; -;;; This section covers starting an inferior-lisp, compiling and -;;; starting the server, initiating a network connection. - -;;;;; Entry points - -;; We no longer load inf-lisp, but we use this variable for backward -;; compatibility. -(defvar inferior-lisp-program "lisp" - "*Program name for invoking an inferior Lisp with for Inferior Lisp mode.") - -(defvar slime-lisp-implementations nil - "*A list of known Lisp implementations. -The list should have the form: - ((NAME (PROGRAM PROGRAM-ARGS...) &key KEYWORD-ARGS) ...) - -NAME is a symbol for the implementation. -PROGRAM and PROGRAM-ARGS are strings used to start the Lisp process. -For KEYWORD-ARGS see `slime-start'. - -Here's an example: - ((cmucl (\"/opt/cmucl/bin/lisp\" \"-quiet\") :init slime-init-command) - (acl (\"acl7\") :coding-system emacs-mule))") - -(defvar slime-default-lisp nil - "*The name of the default Lisp implementation. -See `slime-lisp-implementations'") - -;; dummy definitions for the compiler -(defvar slime-net-processes) -(defvar slime-default-connection) - -(defun slime (&optional command coding-system) - "Start an inferior^_superior Lisp and connect to its Swank server." - (interactive) - (slime-setup) - (let ((inferior-lisp-program (or command inferior-lisp-program)) - (slime-net-coding-system (or coding-system slime-net-coding-system))) - (slime-start* (cond ((and command (symbolp command)) - (slime-lisp-options command)) - (t (slime-read-interactive-args)))))) - -(defvar slime-inferior-lisp-program-history '() - "History list of command strings. Used by `slime'.") - -(defun slime-read-interactive-args () - "Return the list of args which should be passed to `slime-start'. - -The rules for selecting the arguments are rather complicated: - -- In the most common case, i.e. if there's no prefix-arg in - effect and if `slime-lisp-implementations' is nil, use - `inferior-lisp-program' as fallback. - -- If the table `slime-lisp-implementations' is non-nil use the - implementation with name `slime-default-lisp' or if that's nil - the first entry in the table. - -- If the prefix-arg is `-', prompt for one of the registered - lisps. - -- If the prefix-arg is positive, read the command to start the - process." - (let ((table slime-lisp-implementations)) - (cond ((not current-prefix-arg) (slime-lisp-options)) - ((eq current-prefix-arg '-) - (let ((key (completing-read - "Lisp name: " (mapcar (lambda (x) - (list (symbol-name (car x)))) - table) - nil t))) - (slime-lookup-lisp-implementation table (intern key)))) - (t - (cl-destructuring-bind (program &rest program-args) - (split-string-and-unquote - (read-shell-command "Run lisp: " inferior-lisp-program - 'slime-inferior-lisp-program-history)) - (let ((coding-system - (if (eq 16 (prefix-numeric-value current-prefix-arg)) - (read-coding-system "set slime-coding-system: " - slime-net-coding-system) - slime-net-coding-system))) - (list :program program :program-args program-args - :coding-system coding-system))))))) - -(defun slime-lisp-options (&optional name) - (let ((table slime-lisp-implementations)) - (cl-assert (or (not name) table)) - (cond (table (slime-lookup-lisp-implementation slime-lisp-implementations - (or name slime-default-lisp - (car (car table))))) - (t (cl-destructuring-bind (program &rest args) - (split-string inferior-lisp-program) - (list :program program :program-args args)))))) - -(defun slime-lookup-lisp-implementation (table name) - (let ((arguments (cl-rest (assoc name table)))) - (unless arguments - (error "Could not find lisp implementation with the name '%S'" name)) - (when (and (= (length arguments) 1) - (functionp (cl-first arguments))) - (setf arguments (funcall (cl-first arguments)))) - (cl-destructuring-bind ((prog &rest args) &rest keys) arguments - (cl-list* :name name :program prog :program-args args keys)))) - -(cl-defun slime-start (&key (program inferior-lisp-program) program-args - directory - (coding-system slime-net-coding-system) - (init 'slime-init-command) - name - (buffer "*inferior-lisp*") - init-function - env) - "Start a Lisp process and connect to it. -This function is intended for programmatic use if `slime' is not -flexible enough. - -PROGRAM and PROGRAM-ARGS are the filename and argument strings - for the subprocess. -INIT is a function that should return a string to load and start - Swank. The function will be called with the PORT-FILENAME and ENCODING as - arguments. INIT defaults to `slime-init-command'. -CODING-SYSTEM a symbol for the coding system. The default is - slime-net-coding-system -ENV environment variables for the subprocess (see `process-environment'). -INIT-FUNCTION function to call right after the connection is established. -BUFFER the name of the buffer to use for the subprocess. -NAME a symbol to describe the Lisp implementation -DIRECTORY change to this directory before starting the process. -" - (let ((args (list :program program :program-args program-args :buffer buffer - :coding-system coding-system :init init :name name - :init-function init-function :env env))) - (slime-check-coding-system coding-system) - (when (slime-bytecode-stale-p) - (slime-urge-bytecode-recompile)) - (let ((proc (slime-maybe-start-lisp program program-args env - directory buffer))) - (slime-inferior-connect proc args) - (pop-to-buffer (process-buffer proc))))) - -(defun slime-start* (options) - (apply #'slime-start options)) - -(defun slime-connect (host port &optional _coding-system interactive-p &rest parameters) - "Connect to a running Swank server. Return the connection." - (interactive (list (read-from-minibuffer - "Host: " (cl-first slime-connect-host-history) - nil nil '(slime-connect-host-history . 1)) - (string-to-number - (read-from-minibuffer - "Port: " (cl-first slime-connect-port-history) - nil nil '(slime-connect-port-history . 1))) - nil t)) - (slime-setup) - (when (and interactive-p - slime-net-processes - (y-or-n-p "Close old connections first? ")) - (slime-disconnect-all)) - (message "Connecting to Swank on port %S.." port) - (let* ((process (apply 'slime-net-connect host port parameters)) - (slime-dispatching-connection process)) - (slime-setup-connection process))) - -;; FIXME: seems redundant -(defun slime-start-and-init (options fun) - (let* ((rest (plist-get options :init-function)) - (init (cond (rest `(lambda () (funcall ',rest) (funcall ',fun))) - (t fun)))) - (slime-start* (plist-put (cl-copy-list options) :init-function init)))) - -;;;;; Start inferior lisp -;;; -;;; Here is the protocol for starting SLIME: -;;; -;;; 0. Emacs recompiles/reloads slime.elc if it exists and is stale. -;;; 1. Emacs starts an inferior Lisp process. -;;; 2. Emacs tells Lisp (via stdio) to load and start Swank. -;;; 3. Lisp recompiles the Swank if needed. -;;; 4. Lisp starts the Swank server and writes its TCP port to a temp file. -;;; 5. Emacs reads the temp file to get the port and then connects. -;;; 6. Emacs prints a message of warm encouragement for the hacking ahead. -;;; -;;; Between steps 2-5 Emacs polls for the creation of the temp file so -;;; that it can make the connection. This polling may continue for a -;;; fair while if Swank needs recompilation. - -(defvar slime-connect-retry-timer nil - "Timer object while waiting for an inferior-lisp to start.") - -;;; Recompiling bytecode: - -(defun slime-bytecode-stale-p () - "Return true if slime.elc is older than slime.el." - (let ((libfile (locate-library "slime"))) - (when libfile - (let* ((basename (file-name-sans-extension libfile)) - (sourcefile (concat basename ".el")) - (bytefile (concat basename ".elc"))) - (and (file-exists-p bytefile) - (file-newer-than-file-p sourcefile bytefile)))))) - -(defun slime-recompile-bytecode () - "Recompile and reload slime." - (interactive) - (let ((sourcefile (concat (file-name-sans-extension (locate-library "slime")) - ".el"))) - (byte-compile-file sourcefile t))) - -(defun slime-urge-bytecode-recompile () - "Urge the user to recompile slime.elc. -Return true if we have been given permission to continue." - (when (y-or-n-p "slime.elc is older than source. Recompile first? ") - (slime-recompile-bytecode))) - -(defun slime-abort-connection () - "Abort connection the current connection attempt." - (interactive) - (cond (slime-connect-retry-timer - (slime-cancel-connect-retry-timer) - (message "Cancelled connection attempt.")) - (t (error "Not connecting")))) - -;;; Starting the inferior Lisp and loading Swank: - -(defun slime-maybe-start-lisp (program program-args env directory buffer) - "Return a new or existing inferior lisp process." - (cond ((not (comint-check-proc buffer)) - (slime-start-lisp program program-args env directory buffer)) - ((slime-reinitialize-inferior-lisp-p program program-args env buffer) - (let ((conn (cl-find (get-buffer-process buffer) - slime-net-processes - :key #'slime-inferior-process))) - (when conn - (slime-net-close conn))) - (get-buffer-process buffer)) - (t (slime-start-lisp program program-args env directory - (generate-new-buffer-name buffer))))) - -(defun slime-reinitialize-inferior-lisp-p (program program-args env buffer) - (let ((args (slime-inferior-lisp-args (get-buffer-process buffer)))) - (and (equal (plist-get args :program) program) - (equal (plist-get args :program-args) program-args) - (equal (plist-get args :env) env) - (not (y-or-n-p "Create an additional *inferior-lisp*? "))))) - -(defvar slime-inferior-process-start-hook nil - "Hook called whenever a new process gets started.") - -(defun slime-start-lisp (program program-args env directory buffer) - "Does the same as `inferior-lisp' but less ugly. -Return the created process." - (with-current-buffer (get-buffer-create buffer) - (when directory - (cd (expand-file-name directory))) - (comint-mode) - (let ((process-environment (append env process-environment)) - (process-connection-type nil)) - (comint-exec (current-buffer) "inferior-lisp" program nil program-args)) - (lisp-mode-variables t) - (let ((proc (get-buffer-process (current-buffer)))) - (slime-set-query-on-exit-flag proc) - (run-hooks 'slime-inferior-process-start-hook) - proc))) - -(defun slime-inferior-connect (process args) - "Start a Swank server in the inferior Lisp and connect." - (slime-delete-swank-port-file 'quiet) - (slime-start-swank-server process args) - (slime-read-port-and-connect process)) - -(defvar slime-inferior-lisp-args nil - "A buffer local variable in the inferior proccess. -See `slime-start'.") - -(defun slime-start-swank-server (process args) - "Start a Swank server on the inferior lisp." - (cl-destructuring-bind (&key coding-system init &allow-other-keys) args - (with-current-buffer (process-buffer process) - (make-local-variable 'slime-inferior-lisp-args) - (setq slime-inferior-lisp-args args) - (let ((str (funcall init (slime-swank-port-file) coding-system))) - (goto-char (process-mark process)) - (insert-before-markers str) - (process-send-string process str))))) - -(defun slime-inferior-lisp-args (process) - "Return the initial process arguments. -See `slime-start'." - (with-current-buffer (process-buffer process) - slime-inferior-lisp-args)) - -;; XXX load-server & start-server used to be separated. maybe that was better. -(defun slime-init-command (port-filename _coding-system) - "Return a string to initialize Lisp." - (let ((loader (if (file-name-absolute-p slime-backend) - slime-backend - (concat slime-path slime-backend)))) - ;; Return a single form to avoid problems with buffered input. - (format "%S\n\n" - `(progn - (load ,(slime-to-lisp-filename (expand-file-name loader)) - :verbose t) - (funcall (read-from-string "swank-loader:init") - :from-emacs t) - (funcall (read-from-string "swank:start-server") - ,(slime-to-lisp-filename port-filename)))))) - -(defun slime-swank-port-file () - "Filename where the SWANK server writes its TCP port number." - (expand-file-name (format "slime.%S" (emacs-pid)) (slime-temp-directory))) - -(defun slime-temp-directory () - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - (t "/tmp/"))) - -(defun slime-delete-swank-port-file (&optional quiet) - (condition-case data - (delete-file (slime-swank-port-file)) - (error - (cl-ecase quiet - ((nil) (signal (car data) (cdr data))) - (quiet) - (message (message "Unable to delete swank port file %S" - (slime-swank-port-file))))))) - -(defun slime-read-port-and-connect (inferior-process) - (slime-attempt-connection inferior-process nil 1)) - -(defun slime-attempt-connection (process retries attempt) - ;; A small one-state machine to attempt a connection with - ;; timer-based retries. - (slime-cancel-connect-retry-timer) - (let ((file (slime-swank-port-file))) - (unless (active-minibuffer-window) - (message "Polling %S .. %d (Abort with `M-x slime-abort-connection'.)" - file attempt)) - (cond ((and (file-exists-p file) - (> (nth 7 (file-attributes file)) 0)) ; file size - (let ((port (slime-read-swank-port)) - (args (slime-inferior-lisp-args process))) - (slime-delete-swank-port-file 'message) - (let ((c (slime-connect slime-lisp-host port - (plist-get args :coding-system)))) - (slime-set-inferior-process c process)))) - ((and retries (zerop retries)) - (message "Gave up connecting to Swank after %d attempts." attempt)) - ((eq (process-status process) 'exit) - (message "Failed to connect to Swank: inferior process exited.")) - (t - (when (and (file-exists-p file) - (zerop (nth 7 (file-attributes file)))) - (message "(Zero length port file)") - ;; the file may be in the filesystem but not yet written - (unless retries (setq retries 3))) - (cl-assert (not slime-connect-retry-timer)) - (setq slime-connect-retry-timer - (run-with-timer - 0.3 nil - #'slime-timer-call #'slime-attempt-connection - process (and retries (1- retries)) - (1+ attempt))))))) - -(defun slime-timer-call (fun &rest args) - "Call function FUN with ARGS, reporting all errors. - -The default condition handler for timer functions (see -`timer-event-handler') ignores errors." - (condition-case data - (apply fun args) - ((debug error) - (debug nil (list "Error in timer" fun args data))))) - -(defun slime-cancel-connect-retry-timer () - (when slime-connect-retry-timer - (cancel-timer slime-connect-retry-timer) - (setq slime-connect-retry-timer nil))) - -(defun slime-read-swank-port () - "Read the Swank server port number from the `slime-swank-port-file'." - (save-excursion - (with-temp-buffer - (insert-file-contents (slime-swank-port-file)) - (goto-char (point-min)) - (let ((port (read (current-buffer)))) - (cl-assert (integerp port)) - port)))) - -(defun slime-toggle-debug-on-swank-error () - (interactive) - (if (slime-eval `(swank:toggle-debug-on-swank-error)) - (message "Debug on SWANK error enabled.") - (message "Debug on SWANK error disabled."))) - -;;; Words of encouragement - -(defun slime-user-first-name () - (let ((name (if (string= (user-full-name) "") - (user-login-name) - (user-full-name)))) - (string-match "^[^ ]*" name) - (capitalize (match-string 0 name)))) - -(defvar slime-words-of-encouragement - `("Let the hacking commence!" - "Hacks and glory await!" - "Hack and be merry!" - "Your hacking starts... NOW!" - "May the source be with you!" - "Take this REPL, brother, and may it serve you well." - "Lemonodor-fame is but a hack away!" - "Are we consing yet?" - ,(format "%s, this could be the start of a beautiful program." - (slime-user-first-name))) - "Scientifically-proven optimal words of hackerish encouragement.") - -(defun slime-random-words-of-encouragement () - "Return a string of hackerish encouragement." - (eval (nth (random (length slime-words-of-encouragement)) - slime-words-of-encouragement))) - - -;;;; Networking -;;; -;;; This section covers the low-level networking: establishing -;;; connections and encoding/decoding protocol messages. -;;; -;;; Each SLIME protocol message beings with a 6-byte header followed -;;; by an S-expression as text. The sexp must be readable both by -;;; Emacs and by Common Lisp, so if it contains any embedded code -;;; fragments they should be sent as strings: -;;; -;;; The set of meaningful protocol messages are not specified -;;; here. They are defined elsewhere by the event-dispatching -;;; functions in this file and in swank.lisp. - -(defvar slime-net-processes nil - "List of processes (sockets) connected to Lisps.") - -(defvar slime-net-process-close-hooks '() - "List of functions called when a slime network connection closes. -The functions are called with the process as their argument.") - -(defun slime-secret () - "Find the magic secret from the user's home directory. -Return nil if the file doesn't exist or is empty; otherwise the -first line of the file." - (condition-case _err - (with-temp-buffer - (insert-file-contents "~/.slime-secret") - (goto-char (point-min)) - (buffer-substring (point-min) (line-end-position))) - (file-error nil))) - -;;; Interface - -(defun slime-send-secret (proc) - (let ((secret (slime-secret))) - (when secret - (let* ((payload (encode-coding-string secret 'utf-8-unix)) - (string (concat (slime-net-encode-length (length payload)) - payload))) - (process-send-string proc string))))) - -(defun slime-net-connect (host port &rest parameters) - "Establish a connection with a CL." - (let* ((inhibit-quit nil) - (proc (apply 'open-network-stream "SLIME Lisp" nil host port parameters)) - (buffer (slime-make-net-buffer " *cl-connection*"))) - (push proc slime-net-processes) - (set-process-buffer proc buffer) - (set-process-filter proc 'slime-net-filter) - (set-process-sentinel proc 'slime-net-sentinel) - (slime-set-query-on-exit-flag proc) - (when (fboundp 'set-process-coding-system) - (set-process-coding-system proc 'binary 'binary)) - (slime-send-secret proc) - proc)) - -(defun slime-make-net-buffer (name) - "Make a buffer suitable for a network process." - (let ((buffer (generate-new-buffer name))) - (with-current-buffer buffer - (buffer-disable-undo) - (set (make-local-variable 'kill-buffer-query-functions) nil)) - buffer)) - -(defun slime-set-query-on-exit-flag (process) - "Set PROCESS's query-on-exit-flag to `slime-kill-without-query-p'." - (when slime-kill-without-query-p - ;; avoid byte-compiler warnings - (let ((fun (if (fboundp 'set-process-query-on-exit-flag) - 'set-process-query-on-exit-flag - 'process-kill-without-query))) - (funcall fun process nil)))) - -;;;;; Coding system madness - -(defun slime-check-coding-system (coding-system) - "Signal an error if CODING-SYSTEM isn't a valid coding system." - (interactive) - (let ((props (slime-find-coding-system coding-system))) - (unless props - (error "Invalid slime-net-coding-system: %s. %s" - coding-system (mapcar #'car slime-net-valid-coding-systems))) - (when (and (cl-second props) (boundp 'default-enable-multibyte-characters)) - (cl-assert default-enable-multibyte-characters)) - t)) - -(defun slime-coding-system-mulibyte-p (coding-system) - (cl-second (slime-find-coding-system coding-system))) - -(defun slime-coding-system-cl-name (coding-system) - (cl-third (slime-find-coding-system coding-system))) - -;;; Interface -(defun slime-net-send (sexp proc) - "Send a SEXP to Lisp over the socket PROC. -This is the lowest level of communication. The sexp will be READ and -EVAL'd by Lisp." - (let* ((payload (encode-coding-string - (concat (slime-prin1-to-string sexp) "\n") - 'utf-8-unix)) - (string (concat (slime-net-encode-length (length payload)) - payload))) - (slime-log-event sexp) - (process-send-string proc string))) - -(defun slime-safe-encoding-p (coding-system string) - "Return true iff CODING-SYSTEM can safely encode STRING." - (or (let ((candidates (find-coding-systems-string string)) - (base (coding-system-base coding-system))) - (or (equal candidates '(undecided)) - (memq base candidates))) - (and (not (multibyte-string-p string)) - (not (slime-coding-system-mulibyte-p coding-system))))) - -(defun slime-net-close (process &optional debug) - (setq slime-net-processes (remove process slime-net-processes)) - (when (eq process slime-default-connection) - (setq slime-default-connection nil)) - (cond (debug - (set-process-sentinel process 'ignore) - (set-process-filter process 'ignore) - (delete-process process)) - (t - (run-hook-with-args 'slime-net-process-close-hooks process) - ;; killing the buffer also closes the socket - (kill-buffer (process-buffer process))))) - -(defun slime-net-sentinel (process message) - (message "Lisp connection closed unexpectedly: %s" message) - (slime-net-close process)) - -;;; Socket input is handled by `slime-net-filter', which decodes any -;;; complete messages and hands them off to the event dispatcher. - -(defun slime-net-filter (process string) - "Accept output from the socket and process all complete messages." - (with-current-buffer (process-buffer process) - (goto-char (point-max)) - (insert string)) - (slime-process-available-input process)) - -(defun slime-process-available-input (process) - "Process all complete messages that have arrived from Lisp." - (with-current-buffer (process-buffer process) - (while (slime-net-have-input-p) - (let ((event (slime-net-read-or-lose process)) - (ok nil)) - (slime-log-event event) - (unwind-protect - (save-current-buffer - (slime-dispatch-event event process) - (setq ok t)) - (unless ok - (slime-run-when-idle 'slime-process-available-input process))))))) - -(defun slime-net-have-input-p () - "Return true if a complete message is available." - (goto-char (point-min)) - (and (>= (buffer-size) 6) - (>= (- (buffer-size) 6) (slime-net-decode-length)))) - -(defun slime-run-when-idle (function &rest args) - "Call FUNCTION as soon as Emacs is idle." - (apply #'run-at-time 0 nil function args)) - -(defun slime-handle-net-read-error (error) - (let ((packet (buffer-string))) - (slime-with-popup-buffer ((slime-buffer-name :error)) - (princ (format "%s\nin packet:\n%s" (error-message-string error) packet)) - (goto-char (point-min))) - (cond ((y-or-n-p "Skip this packet? ") - `(:emacs-skipped-packet ,packet)) - (t - (when (y-or-n-p "Enter debugger instead? ") - (debug 'error error)) - (signal (car error) (cdr error)))))) - -(defun slime-net-read-or-lose (process) - (condition-case error - (slime-net-read) - (error - (slime-net-close process t) - (error "net-read error: %S" error)))) - -(defun slime-net-read () - "Read a message from the network buffer." - (goto-char (point-min)) - (let* ((length (slime-net-decode-length)) - (start (+ (point) 6)) - (end (+ start length))) - (cl-assert (cl-plusp length)) - (prog1 (save-restriction - (narrow-to-region start end) - (condition-case error - (progn - (decode-coding-region start end 'utf-8-unix) - (setq end (point-max)) - (read (current-buffer))) - (error - (slime-handle-net-read-error error)))) - (delete-region (point-min) end)))) - -(defun slime-net-decode-length () - (string-to-number (buffer-substring-no-properties (point) (+ (point) 6)) - 16)) - -(defun slime-net-encode-length (n) - (format "%06x" n)) - -(defun slime-prin1-to-string (sexp) - "Like `prin1-to-string' but don't octal-escape non-ascii characters. -This is more compatible with the CL reader." - (let (print-escape-nonascii - print-escape-newlines - print-length - print-level) - (prin1-to-string sexp))) - - -;;;; Connections -;;; -;;; "Connections" are the high-level Emacs<->Lisp networking concept. -;;; -;;; Emacs has a connection to each Lisp process that it's interacting -;;; with. Typically there would only be one, but a user can choose to -;;; connect to many Lisps simultaneously. -;;; -;;; A connection consists of a control socket, optionally an extra -;;; socket dedicated to receiving Lisp output (an optimization), and a -;;; set of connection-local state variables. -;;; -;;; The state variables are stored as buffer-local variables in the -;;; control socket's process-buffer and are used via accessor -;;; functions. These variables include things like the *FEATURES* list -;;; and Unix Pid of the Lisp process. -;;; -;;; One connection is "current" at any given time. This is: -;;; `slime-dispatching-connection' if dynamically bound, or -;;; `slime-buffer-connection' if this is set buffer-local, or -;;; `slime-default-connection' otherwise. -;;; -;;; When you're invoking commands in your source files you'll be using -;;; `slime-default-connection'. This connection can be interactively -;;; reassigned via the connection-list buffer. -;;; -;;; When a command creates a new buffer it will set -;;; `slime-buffer-connection' so that commands in the new buffer will -;;; use the connection that the buffer originated from. For example, -;;; the apropos command creates the *Apropos* buffer and any command -;;; in that buffer (e.g. `M-.') will go to the same Lisp that did the -;;; apropos search. REPL buffers are similarly tied to their -;;; respective connections. -;;; -;;; When Emacs is dispatching some network message that arrived from a -;;; connection it will dynamically bind `slime-dispatching-connection' -;;; so that the event will be processed in the context of that -;;; connection. -;;; -;;; This is mostly transparent. The user should be aware that he can -;;; set the default connection to pick which Lisp handles commands in -;;; Lisp-mode source buffers, and slime hackers should be aware that -;;; they can tie a buffer to a specific connection. The rest takes -;;; care of itself. - -(defvar slime-dispatching-connection nil - "Network process currently executing. -This is dynamically bound while handling messages from Lisp; it -overrides `slime-buffer-connection' and `slime-default-connection'.") - -(make-variable-buffer-local - (defvar slime-buffer-connection nil - "Network connection to use in the current buffer. -This overrides `slime-default-connection'.")) - -(defvar slime-default-connection nil - "Network connection to use by default. -Used for all Lisp communication, except when overridden by -`slime-dispatching-connection' or `slime-buffer-connection'.") - -(defun slime-current-connection () - "Return the connection to use for Lisp interaction. -Return nil if there's no connection." - (or slime-dispatching-connection - slime-buffer-connection - slime-default-connection)) - -(defun slime-connection () - "Return the connection to use for Lisp interaction. -Signal an error if there's no connection." - (let ((conn (slime-current-connection))) - (cond ((and (not conn) slime-net-processes) - (or (slime-auto-select-connection) - (error "No default connection selected."))) - ((not conn) - (or (slime-auto-start) - (error "Not connected."))) - ((not (eq (process-status conn) 'open)) - (error "Connection closed.")) - (t conn)))) - -(define-obsolete-variable-alias 'slime-auto-connect -'slime-auto-start "2.5") -(defcustom slime-auto-start 'never - "Controls auto connection when information from lisp process is needed. -This doesn't mean it will connect right after Slime is loaded." - :group 'slime-mode - :type '(choice (const never) - (const always) - (const ask))) - -(defun slime-auto-start () - (cond ((or (eq slime-auto-start 'always) - (and (eq slime-auto-start 'ask) - (y-or-n-p "No connection. Start Slime? "))) - (save-window-excursion - (slime) - (while (not (slime-current-connection)) - (sleep-for 1)) - (slime-connection))) - (t nil))) - -(defcustom slime-auto-select-connection 'ask - "Controls auto selection after the default connection was closed." - :group 'slime-mode - :type '(choice (const never) - (const always) - (const ask))) - -(defun slime-auto-select-connection () - (let* ((c0 (car slime-net-processes)) - (c (cond ((eq slime-auto-select-connection 'always) c0) - ((and (eq slime-auto-select-connection 'ask) - (y-or-n-p - (format "No default connection selected. %s %s? " - "Switch to" (slime-connection-name c0)))) - c0)))) - (when c - (slime-select-connection c) - (message "Switching to connection: %s" (slime-connection-name c)) - c))) - -(defun slime-select-connection (process) - "Make PROCESS the default connection." - (setq slime-default-connection process)) - -(defvar slime-cycle-connections-hook nil) - -(defun slime-cycle-connections-within (connections) - (let* ((tail (or (cdr (member (slime-current-connection) connections)) - connections)) ; loop around to the beginning - (next (car tail))) - (slime-select-connection next) - (run-hooks 'slime-cycle-connections-hook) - (message "Lisp: %s %s" - (slime-connection-name next) - (process-contact next)))) - -(defun slime-next-connection () - "Change current slime connection, cycling through all connections." - (interactive) - (slime-cycle-connections-within (reverse slime-net-processes))) - -(define-obsolete-function-alias 'slime-cycle-connections - 'slime-next-connection "2.13") - -(defun slime-prev-connection () - "Change current slime connection, cycling through all connections. -Goes in reverse order, relative to `slime-next-connection'." - (interactive) - (slime-cycle-connections-within slime-net-processes)) - -(cl-defmacro slime-with-connection-buffer ((&optional process) &rest body) - "Execute BODY in the process-buffer of PROCESS. -If PROCESS is not specified, `slime-connection' is used. - -\(fn (&optional PROCESS) &body BODY))" - (declare (indent 1)) - `(with-current-buffer - (process-buffer (or ,process (slime-connection) - (error "No connection"))) - ,@body)) - -;;; Connection-local variables: - -(defmacro slime-def-connection-var (varname &rest initial-value-and-doc) - "Define a connection-local variable. -The value of the variable can be read by calling the function of the -same name (it must not be accessed directly). The accessor function is -setf-able. - -The actual variable bindings are stored buffer-local in the -process-buffers of connections. The accessor function refers to -the binding for `slime-connection'." - (declare (indent 2)) - (let ((real-var (intern (format "%s:connlocal" varname)))) - `(progn - ;; Variable - (make-variable-buffer-local - (defvar ,real-var ,@initial-value-and-doc)) - ;; Accessor - (defun ,varname (&optional process) - (slime-with-connection-buffer (process) ,real-var)) - ;; Setf - (defsetf ,varname (&optional process) (store) - `(slime-with-connection-buffer (,process) - (setq (\, (quote (\, real-var))) (\, store)))) - '(\, varname)))) - -(slime-def-connection-var slime-connection-number nil - "Serial number of a connection. -Bound in the connection's process-buffer.") - -(slime-def-connection-var slime-lisp-features '() - "The symbol-names of Lisp's *FEATURES*. -This is automatically synchronized from Lisp.") - -(slime-def-connection-var slime-lisp-modules '() - "The strings of Lisp's *MODULES*.") - -(slime-def-connection-var slime-pid nil - "The process id of the Lisp process.") - -(slime-def-connection-var slime-lisp-implementation-type nil - "The implementation type of the Lisp process.") - -(slime-def-connection-var slime-lisp-implementation-version nil - "The implementation type of the Lisp process.") - -(slime-def-connection-var slime-lisp-implementation-name nil - "The short name for the Lisp implementation.") - -(slime-def-connection-var slime-lisp-implementation-program nil - "The argv[0] of the process running the Lisp implementation.") - -(slime-def-connection-var slime-connection-name nil - "The short name for connection.") - -(slime-def-connection-var slime-inferior-process nil - "The inferior process for the connection if any.") - -(slime-def-connection-var slime-communication-style nil - "The communication style.") - -(slime-def-connection-var slime-machine-instance nil - "The name of the (remote) machine running the Lisp process.") - -(slime-def-connection-var slime-connection-coding-systems nil - "Coding systems supported by the Lisp process.") - -;;;;; Connection setup - -(defvar slime-connection-counter 0 - "The number of SLIME connections made. For generating serial numbers.") - -;;; Interface -(defun slime-setup-connection (process) - "Make a connection out of PROCESS." - (let ((slime-dispatching-connection process)) - (slime-init-connection-state process) - (slime-select-connection process) - process)) - -(defun slime-init-connection-state (proc) - "Initialize connection state in the process-buffer of PROC." - ;; To make life simpler for the user: if this is the only open - ;; connection then reset the connection counter. - (when (equal slime-net-processes (list proc)) - (setq slime-connection-counter 0)) - (slime-with-connection-buffer () - (setq slime-buffer-connection proc)) - (setf (slime-connection-number proc) (cl-incf slime-connection-counter)) - ;; We do the rest of our initialization asynchronously. The current - ;; function may be called from a timer, and if we setup the REPL - ;; from a timer then it mysteriously uses the wrong keymap for the - ;; first command. - (let ((slime-current-thread t)) - (slime-eval-async '(swank:connection-info) - (slime-curry #'slime-set-connection-info proc)))) - -(defun slime-set-connection-info (connection info) - "Initialize CONNECTION with INFO received from Lisp." - (let ((slime-dispatching-connection connection) - (slime-current-thread t)) - (cl-destructuring-bind (&key pid style lisp-implementation machine - features version modules encoding - &allow-other-keys) info - (slime-check-version version connection) - (setf (slime-pid) pid - (slime-communication-style) style - (slime-lisp-features) features - (slime-lisp-modules) modules) - (cl-destructuring-bind (&key type name version program) - lisp-implementation - (setf (slime-lisp-implementation-type) type - (slime-lisp-implementation-version) version - (slime-lisp-implementation-name) name - (slime-lisp-implementation-program) program - (slime-connection-name) (slime-generate-connection-name name))) - (cl-destructuring-bind (&key instance ((:type _)) ((:version _))) machine - (setf (slime-machine-instance) instance)) - (cl-destructuring-bind (&key coding-systems) encoding - (setf (slime-connection-coding-systems) coding-systems))) - (let ((args (let ((p (slime-inferior-process))) - (if p (slime-inferior-lisp-args p))))) - (let ((name (plist-get args ':name))) - (when name - (unless (string= (slime-lisp-implementation-name) name) - (setf (slime-connection-name) - (slime-generate-connection-name (symbol-name name)))))) - (slime-load-contribs) - (run-hooks 'slime-connected-hook) - (let ((fun (plist-get args ':init-function))) - (when fun (funcall fun)))) - (message "Connected. %s" (slime-random-words-of-encouragement)))) - -(defun slime-check-version (version conn) - (or (equal version slime-protocol-version) - (equal slime-protocol-version 'ignore) - (y-or-n-p - (format "Versions differ: %s (slime) vs. %s (swank). Continue? " - slime-protocol-version version)) - (slime-net-close conn) - (top-level))) - -(defun slime-generate-connection-name (lisp-name) - (cl-loop for i from 1 - for name = lisp-name then (format "%s<%d>" lisp-name i) - while (cl-find name slime-net-processes - :key #'slime-connection-name :test #'equal) - finally (cl-return name))) - -(defun slime-connection-close-hook (process) - (when (eq process slime-default-connection) - (when slime-net-processes - (slime-select-connection (car slime-net-processes)) - (message "Default connection closed; switched to #%S (%S)" - (slime-connection-number) - (slime-connection-name))))) - -(add-hook 'slime-net-process-close-hooks 'slime-connection-close-hook) - -;;;;; Commands on connections - -(defun slime-disconnect () - "Close the current connection." - (interactive) - (slime-net-close (slime-connection))) - -(defun slime-disconnect-all () - "Disconnect all connections." - (interactive) - (mapc #'slime-net-close slime-net-processes)) - -(defun slime-connection-port (connection) - "Return the remote port number of CONNECTION." - (cadr (process-contact connection))) - -(defun slime-process (&optional connection) - "Return the Lisp process for CONNECTION (default `slime-connection'). -Return nil if there's no process object for the connection." - (let ((proc (slime-inferior-process connection))) - (if (and proc - (memq (process-status proc) '(run stop))) - proc))) - -;; Non-macro version to keep the file byte-compilable. -(defun slime-set-inferior-process (connection process) - (setf (slime-inferior-process connection) process)) - -(defun slime-use-sigint-for-interrupt (&optional connection) - (let ((c (or connection (slime-connection)))) - (cl-ecase (slime-communication-style c) - ((:fd-handler nil) t) - ((:spawn :sigio) nil)))) - -(defvar slime-inhibit-pipelining t - "*If true, don't send background requests if Lisp is already busy.") - -(defun slime-background-activities-enabled-p () - (and (let ((con (slime-current-connection))) - (and con - (eq (process-status con) 'open))) - (or (not (slime-busy-p)) - (not slime-inhibit-pipelining)))) - - -;;;; Communication protocol - -;;;;; Emacs Lisp programming interface -;;; -;;; The programming interface for writing Emacs commands is based on -;;; remote procedure calls (RPCs). The basic operation is to ask Lisp -;;; to apply a named Lisp function to some arguments, then to do -;;; something with the result. -;;; -;;; Requests can be either synchronous (blocking) or asynchronous -;;; (with the result passed to a callback/continuation function). If -;;; an error occurs during the request then the debugger is entered -;;; before the result arrives -- for synchronous evaluations this -;;; requires a recursive edit. -;;; -;;; You should use asynchronous evaluations (`slime-eval-async') for -;;; most things. Reserve synchronous evaluations (`slime-eval') for -;;; the cases where blocking Emacs is really appropriate (like -;;; completion) and that shouldn't trigger errors (e.g. not evaluate -;;; user-entered code). -;;; -;;; We have the concept of the "current Lisp package". RPC requests -;;; always say what package the user is making them from and the Lisp -;;; side binds that package to *BUFFER-PACKAGE* to use as it sees -;;; fit. The current package is defined as the buffer-local value of -;;; `slime-buffer-package' if set, and otherwise the package named by -;;; the nearest IN-PACKAGE as found by text search (cl-first backwards, -;;; then forwards). -;;; -;;; Similarly we have the concept of the current thread, i.e. which -;;; thread in the Lisp process should handle the request. The current -;;; thread is determined solely by the buffer-local value of -;;; `slime-current-thread'. This is usually bound to t meaning "no -;;; particular thread", but can also be used to nominate a specific -;;; thread. The REPL and the debugger both use this feature to deal -;;; with specific threads. - -(make-variable-buffer-local - (defvar slime-current-thread t - "The id of the current thread on the Lisp side. -t means the \"current\" thread; -:repl-thread the thread that executes REPL requests; -fixnum a specific thread.")) - -(make-variable-buffer-local - (defvar slime-buffer-package nil - "The Lisp package associated with the current buffer. -This is set only in buffers bound to specific packages.")) - -;;; `slime-rex' is the RPC primitive which is used to implement both -;;; `slime-eval' and `slime-eval-async'. You can use it directly if -;;; you need to, but the others are usually more convenient. - -(cl-defmacro slime-rex ((&rest saved-vars) - (sexp &optional - (package '(slime-current-package)) - (thread 'slime-current-thread)) - &rest continuations) - "(slime-rex (VAR ...) (SEXP &optional PACKAGE THREAD) CLAUSES ...) - -Remote EXecute SEXP. - -VARs are a list of saved variables visible in the other forms. Each -VAR is either a symbol or a list (VAR INIT-VALUE). - -SEXP is evaluated and the princed version is sent to Lisp. - -PACKAGE is evaluated and Lisp binds *BUFFER-PACKAGE* to this package. -The default value is (slime-current-package). - -CLAUSES is a list of patterns with same syntax as -`slime-dcase'. The result of the evaluation of SEXP is -dispatched on CLAUSES. The result is either a sexp of the -form (:ok VALUE) or (:abort CONDITION). CLAUSES is executed -asynchronously. - -Note: don't use backquote syntax for SEXP, because various Emacs -versions cannot deal with that." - (declare (indent 2)) - (let ((result (cl-gensym))) - `(lexical-let ,(cl-loop for var in saved-vars - collect (cl-etypecase var - (symbol (list var var)) - (cons var))) - (slime-dispatch-event - (list :emacs-rex ,sexp ,package ,thread - (lambda (,result) - (slime-dcase ,result - ,@continuations))))))) - -;;; Interface -(defun slime-current-package () - "Return the Common Lisp package in the current context. -If `slime-buffer-package' has a value then return that, otherwise -search for and read an `in-package' form." - (or slime-buffer-package - (save-restriction - (widen) - (slime-find-buffer-package)))) - -(defvar slime-find-buffer-package-function 'slime-search-buffer-package - "*Function to use for `slime-find-buffer-package'. -The result should be the package-name (a string) -or nil if nothing suitable can be found.") - -(defun slime-find-buffer-package () - "Figure out which Lisp package the current buffer is associated with." - (funcall slime-find-buffer-package-function)) - -(make-variable-buffer-local - (defvar slime-package-cache nil - "Cons of the form (buffer-modified-tick . package)")) - -;; When modifing this code consider cases like: -;; (in-package #.*foo*) -;; (in-package #:cl) -;; (in-package :cl) -;; (in-package "CL") -;; (in-package |CL|) -;; (in-package #+ansi-cl :cl #-ansi-cl 'lisp) - -(defun slime-search-buffer-package () - (let ((case-fold-search t) - (regexp (concat "^(\\(cl:\\|common-lisp:\\)?in-package\\>[ \t']*" - "\\([^)]+\\)[ \t]*)"))) - (save-excursion - (when (or (re-search-backward regexp nil t) - (re-search-forward regexp nil t)) - (match-string-no-properties 2))))) - -;;; Synchronous requests are implemented in terms of asynchronous -;;; ones. We make an asynchronous request with a continuation function -;;; that `throw's its result up to a `catch' and then enter a loop of -;;; handling I/O until that happens. - -(defvar slime-stack-eval-tags nil - "List of stack-tags of continuations waiting on the stack.") - -(defun slime-eval (sexp &optional package) - "Evaluate EXPR on the superior Lisp and return the result." - (when (null package) (setq package (slime-current-package))) - (let* ((tag (cl-gensym (format "slime-result-%d-" - (1+ (slime-continuation-counter))))) - (slime-stack-eval-tags (cons tag slime-stack-eval-tags))) - (apply - #'funcall - (catch tag - (slime-rex (tag sexp) - (sexp package) - ((:ok value) - (unless (member tag slime-stack-eval-tags) - (error "Reply to canceled synchronous eval request tag=%S sexp=%S" - tag sexp)) - (throw tag (list #'identity value))) - ((:abort _condition) - (throw tag (list #'error "Synchronous Lisp Evaluation aborted")))) - (let ((debug-on-quit t) - (inhibit-quit nil) - (conn (slime-connection))) - (while t - (unless (eq (process-status conn) 'open) - (error "Lisp connection closed unexpectedly")) - (accept-process-output nil 0.01))))))) - -(defun slime-eval-async (sexp &optional cont package) - "Evaluate EXPR on the superior Lisp and call CONT with the result." - (declare (indent 1)) - (slime-rex (cont (buffer (current-buffer))) - (sexp (or package (slime-current-package))) - ((:ok result) - (when cont - (set-buffer buffer) - (funcall cont result))) - ((:abort condition) - (message "Evaluation aborted on %s." condition))) - ;; Guard against arbitrary return values which once upon a time - ;; showed up in the minibuffer spuriously (due to a bug in - ;; slime-autodoc.) If this ever happens again, returning the - ;; following will make debugging much easier: - :slime-eval-async) - -;;; These functions can be handy too: - -(defun slime-connected-p () - "Return true if the Swank connection is open." - (not (null slime-net-processes))) - -(defun slime-check-connected () - "Signal an error if we are not connected to Lisp." - (unless (slime-connected-p) - (error "Not connected. Use `%s' to start a Lisp." - (substitute-command-keys "\\[slime]")))) - -;; UNUSED -(defun slime-debugged-connection-p (conn) - ;; This previously was (AND (SLDB-DEBUGGED-CONTINUATIONS CONN) T), - ;; but an SLDB buffer may exist without having continuations - ;; attached to it, e.g. the one resulting from `slime-interrupt'. - (cl-loop for b in (sldb-buffers) - thereis (with-current-buffer b - (eq slime-buffer-connection conn)))) - -(defun slime-busy-p (&optional conn) - "True if Lisp has outstanding requests. -Debugged requests are ignored." - (let ((debugged (sldb-debugged-continuations (or conn (slime-connection))))) - (cl-remove-if (lambda (id) - (memq id debugged)) - (slime-rex-continuations) - :key #'car))) - -(defun slime-sync () - "Block until the most recent request has finished." - (when (slime-rex-continuations) - (let ((tag (caar (slime-rex-continuations)))) - (while (cl-find tag (slime-rex-continuations) :key #'car) - (accept-process-output nil 0.1))))) - -(defun slime-ping () - "Check that communication works." - (interactive) - (message "%s" (slime-eval "PONG"))) - -;;;;; Protocol event handler (cl-the guts) -;;; -;;; This is the protocol in all its glory. The input to this function -;;; is a protocol event that either originates within Emacs or arrived -;;; over the network from Lisp. -;;; -;;; Each event is a list beginning with a keyword and followed by -;;; arguments. The keyword identifies the type of event. Events -;;; originating from Emacs have names starting with :emacs- and events -;;; from Lisp don't. - -(slime-def-connection-var slime-rex-continuations '() - "List of (ID . FUNCTION) continuations waiting for RPC results.") - -(slime-def-connection-var slime-continuation-counter 0 - "Continuation serial number counter.") - -(defvar slime-event-hooks) - -(defun slime-dispatch-event (event &optional process) - (let ((slime-dispatching-connection (or process (slime-connection)))) - (or (run-hook-with-args-until-success 'slime-event-hooks event) - (slime-dcase event - ((:emacs-rex form package thread continuation) - (when (and (slime-use-sigint-for-interrupt) (slime-busy-p)) - (slime-display-oneliner "; pipelined request... %S" form)) - (let ((id (cl-incf (slime-continuation-counter)))) - (slime-send `(:emacs-rex ,form ,package ,thread ,id)) - (push (cons id continuation) (slime-rex-continuations)) - (slime--recompute-modelines))) - ((:return value id) - (let ((rec (assq id (slime-rex-continuations)))) - (cond (rec (setf (slime-rex-continuations) - (remove rec (slime-rex-continuations))) - (slime--recompute-modelines) - (funcall (cdr rec) value)) - (t - (error "Unexpected reply: %S %S" id value))))) - ((:debug-activate thread level &optional select) - (cl-assert thread) - (sldb-activate thread level select)) - ((:debug thread level condition restarts frames conts) - (cl-assert thread) - (sldb-setup thread level condition restarts frames conts)) - ((:debug-return thread level stepping) - (cl-assert thread) - (sldb-exit thread level stepping)) - ((:emacs-interrupt thread) - (slime-send `(:emacs-interrupt ,thread))) - ((:channel-send id msg) - (slime-channel-send (or (slime-find-channel id) - (error "Invalid channel id: %S %S" id msg)) - msg)) - ((:emacs-channel-send id msg) - (slime-send `(:emacs-channel-send ,id ,msg))) - ((:read-from-minibuffer thread tag prompt initial-value) - (slime-read-from-minibuffer-for-swank thread tag prompt - initial-value)) - ((:y-or-n-p thread tag question) - (slime-y-or-n-p thread tag question)) - ((:emacs-return-string thread tag string) - (slime-send `(:emacs-return-string ,thread ,tag ,string))) - ((:new-features features) - (setf (slime-lisp-features) features)) - ((:indentation-update info) - (slime-handle-indentation-update info)) - ((:eval-no-wait form) - (slime-check-eval-in-emacs-enabled) - (eval (read form))) - ((:eval thread tag form-string) - (slime-check-eval-in-emacs-enabled) - (slime-eval-for-lisp thread tag form-string)) - ((:ed-rpc-no-wait fn-name &rest args) - (let ((fn (intern-soft fn-name))) - (slime-check-rpc-allowed fn) - (apply fn args))) - ((:ed-rpc thread tag fn-name &rest args) - (slime-rpc-from-lisp thread tag (intern-soft fn-name) args)) - ((:emacs-return thread tag value) - (slime-send `(:emacs-return ,thread ,tag ,value))) - ((:ed what) - (slime-ed what)) - ((:inspect what thread tag) - (let ((hook (when (and thread tag) - (slime-curry #'slime-send - `(:emacs-return ,thread ,tag nil))))) - (slime-open-inspector what nil hook))) - ((:background-message message) - (slime-background-message "%s" message)) - ((:debug-condition thread message) - (cl-assert thread) - (message "%s" message)) - ((:ping thread tag) - (slime-send `(:emacs-pong ,thread ,tag))) - ((:reader-error packet condition) - (slime-with-popup-buffer ((slime-buffer-name :error)) - (princ (format "Invalid protocol message:\n%s\n\n%s" - condition packet)) - (goto-char (point-min))) - (error "Invalid protocol message")) - ((:invalid-rpc id message) - (setf (slime-rex-continuations) - (cl-remove id (slime-rex-continuations) :key #'car)) - (error "Invalid rpc: %s" message)) - ((:emacs-skipped-packet _pkg)) - ((:test-delay seconds) ; for testing only - (sit-for seconds)))))) - -(defun slime-send (sexp) - "Send SEXP directly over the wire on the current connection." - (slime-net-send sexp (slime-connection))) - -(defun slime-reset () - "Clear all pending continuations and erase connection buffer." - (interactive) - (setf (slime-rex-continuations) '()) - (mapc #'kill-buffer (sldb-buffers)) - (slime-with-connection-buffer () - (erase-buffer))) - -(defun slime-send-sigint () - (interactive) - (signal-process (slime-pid) 'SIGINT)) - -;;;;; Channels - -;;; A channel implements a set of operations. Those operations can be -;;; invoked by sending messages to the channel. Channels are used for -;;; protocols which can't be expressed naturally with RPCs, e.g. for -;;; streaming data over the wire. -;;; -;;; A channel can be "remote" or "local". Remote channels are -;;; represented by integers. Local channels are structures. Messages -;;; sent to a closed (remote) channel are ignored. - -(slime-def-connection-var slime-channels '() - "Alist of the form (ID . CHANNEL).") - -(slime-def-connection-var slime-channels-counter 0 - "Channel serial number counter.") - -(cl-defstruct (slime-channel (:conc-name slime-channel.) - (:constructor - slime-make-channel% (operations name id plist))) - operations name id plist) - -(defun slime-make-channel (operations &optional name) - (let* ((id (cl-incf (slime-channels-counter))) - (ch (slime-make-channel% operations name id nil))) - (push (cons id ch) (slime-channels)) - ch)) - -(defun slime-close-channel (channel) - (setf (slime-channel.operations channel) 'closed-channel) - (let ((probe (assq (slime-channel.id channel) (slime-channels)))) - (cond (probe (setf (slime-channels) (delete probe (slime-channels)))) - (t (error "Invalid channel: %s" channel))))) - -(defun slime-find-channel (id) - (cdr (assq id (slime-channels)))) - -(defun slime-channel-send (channel message) - (apply (or (gethash (car message) (slime-channel.operations channel)) - (error "Unsupported operation: %S %S" message channel)) - channel (cdr message))) - -(defun slime-channel-put (channel prop value) - (setf (slime-channel.plist channel) - (plist-put (slime-channel.plist channel) prop value))) - -(defun slime-channel-get (channel prop) - (plist-get (slime-channel.plist channel) prop)) - -(eval-and-compile - (defun slime-channel-method-table-name (type) - (intern (format "slime-%s-channel-methods" type)))) - -(defmacro slime-define-channel-type (name) - (declare (indent defun)) - (let ((tab (slime-channel-method-table-name name))) - `(progn - (defvar ,tab) - (setq ,tab (make-hash-table :size 10))))) - -(defmacro slime-define-channel-method (type method args &rest body) - (declare (indent 3) (debug (&define name sexp lambda-list - def-body))) - `(puthash ',method - (lambda (self . ,args) . ,body) - ,(slime-channel-method-table-name type))) - -(defun slime-send-to-remote-channel (channel-id msg) - (slime-dispatch-event `(:emacs-channel-send ,channel-id ,msg))) - -;;;;; Event logging to *slime-events* -;;; -;;; The *slime-events* buffer logs all protocol messages for debugging -;;; purposes. Optionally you can enable outline-mode in that buffer, -;;; which is convenient but slows things down significantly. - -(defvar slime-log-events t - "*Log protocol events to the *slime-events* buffer.") - -(defvar slime-outline-mode-in-events-buffer nil - "*Non-nil means use outline-mode in *slime-events*.") - -(defvar slime-event-buffer-name (slime-buffer-name :events) - "The name of the slime event buffer.") - -(defun slime-log-event (event) - "Record the fact that EVENT occurred." - (when slime-log-events - (with-current-buffer (slime-events-buffer) - ;; trim? - (when (> (buffer-size) 100000) - (goto-char (/ (buffer-size) 2)) - (re-search-forward "^(" nil t) - (delete-region (point-min) (point))) - (goto-char (point-max)) - (save-excursion - (slime-pprint-event event (current-buffer))) - (when (and (boundp 'outline-minor-mode) - outline-minor-mode) - (hide-entry)) - (goto-char (point-max))))) - -(defun slime-pprint-event (event buffer) - "Pretty print EVENT in BUFFER with limited depth and width." - (let ((print-length 20) - (print-level 6) - (pp-escape-newlines t)) - (pp event buffer))) - -(defun slime-events-buffer () - "Return or create the event log buffer." - (or (get-buffer slime-event-buffer-name) - (let ((buffer (get-buffer-create slime-event-buffer-name))) - (with-current-buffer buffer - (buffer-disable-undo) - (set (make-local-variable 'outline-regexp) "^(") - (set (make-local-variable 'comment-start) ";") - (set (make-local-variable 'comment-end) "") - (when slime-outline-mode-in-events-buffer - (outline-minor-mode))) - buffer))) - - -;;;;; Cleanup after a quit - -(defun slime-restart-inferior-lisp () - "Kill and restart the Lisp subprocess." - (interactive) - (cl-assert (slime-inferior-process) () "No inferior lisp process") - (slime-quit-lisp-internal (slime-connection) 'slime-restart-sentinel t)) - -(defun slime-restart-sentinel (process _message) - "Restart the inferior lisp process. -Also rearrange windows." - (cl-assert (process-status process) 'closed) - (let* ((proc (slime-inferior-process process)) - (args (slime-inferior-lisp-args proc)) - (buffer (buffer-name (process-buffer proc))) - ;;(buffer-window (get-buffer-window buffer)) - (new-proc (slime-start-lisp (plist-get args :program) - (plist-get args :program-args) - (plist-get args :env) - nil - buffer))) - (slime-net-close process) - (slime-inferior-connect new-proc args) - (switch-to-buffer buffer) - (goto-char (point-max)))) - - -;;;; Compilation and the creation of compiler-note annotations - -(defvar slime-highlight-compiler-notes t - "*When non-nil annotate buffers with compilation notes etc.") - -(defvar slime-before-compile-functions nil - "A list of function called before compiling a buffer or region. -The function receive two arguments: the beginning and the end of the -region that will be compiled.") - -;; FIXME: remove some of the options -(defcustom slime-compilation-finished-hook 'slime-maybe-show-compilation-log - "Hook called with a list of compiler notes after a compilation." - :group 'slime-mode - :type 'hook - :options '(slime-maybe-show-compilation-log - slime-create-compilation-log - slime-show-compilation-log - slime-maybe-list-compiler-notes - slime-list-compiler-notes - slime-maybe-show-xrefs-for-notes - slime-goto-first-note)) - -;; FIXME: I doubt that anybody uses this directly and it seems to be -;; only an ugly way to pass arguments. -(defvar slime-compilation-policy nil - "When non-nil compile with these optimization settings.") - -(defun slime-compute-policy (arg) - "Return the policy for the prefix argument ARG." - (let ((between (lambda (min n max) - (cond ((< n min) min) - ((> n max) max) - (t n))))) - (let ((n (prefix-numeric-value arg))) - (cond ((not arg) slime-compilation-policy) - ((cl-plusp n) `((cl:debug . ,(funcall between 0 n 3)))) - ((eq arg '-) `((cl:speed . 3))) - (t `((cl:speed . ,(funcall between 0 (abs n) 3)))))))) - -(cl-defstruct (slime-compilation-result - (:type list) - (:conc-name slime-compilation-result.) - (:constructor nil) - (:copier nil)) - tag notes successp duration loadp faslfile) - -(defvar slime-last-compilation-result nil - "The result of the most recently issued compilation.") - -(defun slime-compiler-notes () - "Return all compiler notes, warnings, and errors." - (slime-compilation-result.notes slime-last-compilation-result)) - -(defun slime-compile-and-load-file (&optional policy) - "Compile and load the buffer's file and highlight compiler notes. - -With (positive) prefix argument the file is compiled with maximal -debug settings (`C-u'). With negative prefix argument it is compiled for -speed (`M--'). If a numeric argument is passed set debug or speed settings -to it depending on its sign. - -Each source location that is the subject of a compiler note is -underlined and annotated with the relevant information. The commands -`slime-next-note' and `slime-previous-note' can be used to navigate -between compiler notes and to display their full details." - (interactive "P") - (slime-compile-file t (slime-compute-policy policy))) - -(defcustom slime-compile-file-options '() - "Plist of additional options that C-c C-k should pass to Lisp. -Currently only :fasl-directory is supported." - :group 'slime-lisp - :type '(plist :key-type symbol :value-type (file :must-match t))) - -(defun slime-compile-file (&optional load policy) - "Compile current buffer's file and highlight resulting compiler notes. - -See `slime-compile-and-load-file' for further details." - (interactive) - (unless buffer-file-name - (error "Buffer %s is not associated with a file." (buffer-name))) - (check-parens) - (slime--maybe-save-buffer) - (run-hook-with-args 'slime-before-compile-functions (point-min) (point-max)) - (let ((file (slime-to-lisp-filename (buffer-file-name))) - (options (slime-simplify-plist `(,@slime-compile-file-options - :policy ,policy)))) - (slime-eval-async - `(swank:compile-file-for-emacs ,file ,(if load t nil) - . ,(slime-hack-quotes options)) - #'slime-compilation-finished) - (message "Compiling %s..." file))) - -;; FIXME: compilation-save-buffers-predicate was introduced in 24.1 -(defun slime--maybe-save-buffer () - (let ((slime--this-buffer (current-buffer))) - (save-some-buffers (not compilation-ask-about-save) - (lambda () (eq (current-buffer) slime--this-buffer))))) - -(defun slime-hack-quotes (arglist) - ;; eval is the wrong primitive, we really want funcall - (cl-loop for arg in arglist collect `(quote ,arg))) - -(defun slime-simplify-plist (plist) - (cl-loop for (key val) on plist by #'cddr - append (cond ((null val) '()) - (t (list key val))))) - -(defun slime-compile-defun (&optional raw-prefix-arg) - "Compile the current toplevel form. - -With (positive) prefix argument the form is compiled with maximal -debug settings (`C-u'). With negative prefix argument it is compiled for -speed (`M--'). If a numeric argument is passed set debug or speed settings -to it depending on its sign." - (interactive "P") - (let ((slime-compilation-policy (slime-compute-policy raw-prefix-arg))) - (if (use-region-p) - (slime-compile-region (region-beginning) (region-end)) - (apply #'slime-compile-region (slime-region-for-defun-at-point))))) - -(defun slime-compile-region (start end) - "Compile the region." - (interactive "r") - ;; Check connection before running hooks things like - ;; slime-flash-region don't make much sense if there's no connection - (slime-connection) - (slime-flash-region start end) - (run-hook-with-args 'slime-before-compile-functions start end) - (slime-compile-string (buffer-substring-no-properties start end) start)) - -(defun slime-flash-region (start end &optional timeout) - "Temporarily highlight region from START to END." - (let ((overlay (make-overlay start end))) - (overlay-put overlay 'face 'secondary-selection) - (run-with-timer (or timeout 0.2) nil 'delete-overlay overlay))) - -(defun slime-compile-string (string start-offset) - (let* ((line (save-excursion - (goto-char start-offset) - (list (line-number-at-pos) (1+ (current-column))))) - (position `((:position ,start-offset) (:line ,@line)))) - (slime-eval-async - `(swank:compile-string-for-emacs - ,string - ,(buffer-name) - ',position - ,(if (buffer-file-name) (slime-to-lisp-filename (buffer-file-name))) - ',slime-compilation-policy) - #'slime-compilation-finished))) - -(defcustom slime-load-failed-fasl 'ask - "Which action to take when COMPILE-FILE set FAILURE-P to T. -NEVER doesn't load the fasl -ALWAYS loads the fasl -ASK asks the user." - :type '(choice (const never) - (const always) - (const ask))) - -(defun slime-load-failed-fasl-p () - (cl-ecase slime-load-failed-fasl - (never nil) - (always t) - (ask (y-or-n-p "Compilation failed. Load fasl file anyway? ")))) - -(defun slime-compilation-finished (result) - (with-struct (slime-compilation-result. notes duration successp - loadp faslfile) result - (setf slime-last-compilation-result result) - (slime-show-note-counts notes duration (cond ((not loadp) successp) - (t (and faslfile successp)))) - (when slime-highlight-compiler-notes - (slime-highlight-notes notes)) - (run-hook-with-args 'slime-compilation-finished-hook notes) - (when (and loadp faslfile - (or successp - (slime-load-failed-fasl-p))) - (slime-eval-async `(swank:load-file ,faslfile))))) - -(defun slime-show-note-counts (notes secs successp) - (message (concat - (cond (successp "Compilation finished") - (t (slime-add-face 'font-lock-warning-face - "Compilation failed"))) - (if (null notes) ". (No warnings)" ": ") - (mapconcat - (lambda (messages) - (cl-destructuring-bind (sev . notes) messages - (let ((len (length notes))) - (format "%d %s%s" len (slime-severity-label sev) - (if (= len 1) "" "s"))))) - (sort (slime-alistify notes #'slime-note.severity #'eq) - (lambda (x y) (slime-severity< (car y) (car x)))) - " ") - (if secs (format " [%.2f secs]" secs))))) - -(defun slime-highlight-notes (notes) - "Highlight compiler notes, warnings, and errors in the buffer." - (interactive (list (slime-compiler-notes))) - (with-temp-message "Highlighting notes..." - (save-excursion - (save-restriction - (widen) ; highlight notes on the whole buffer - (slime-remove-old-overlays) - (mapc #'slime-overlay-note (slime-merge-notes-for-display notes)))))) - -(defvar slime-note-overlays '() - "List of overlays created by `slime-make-note-overlay'") - -(defun slime-remove-old-overlays () - "Delete the existing note overlays." - (mapc #'delete-overlay slime-note-overlays) - (setq slime-note-overlays '())) - -(defun slime-filter-buffers (predicate) - "Return a list of where PREDICATE returns true. -PREDICATE is executed in the buffer to test." - (cl-remove-if-not (lambda (%buffer) - (with-current-buffer %buffer - (funcall predicate))) - (buffer-list))) - -;;;;; Recompilation. - -;; FIXME: This whole idea is questionable since it depends so -;; crucially on precise source-locs. - -(defun slime-recompile-location (location) - (save-excursion - (slime-goto-source-location location) - (slime-compile-defun))) - -(defun slime-recompile-locations (locations cont) - (slime-eval-async - `(swank:compile-multiple-strings-for-emacs - ',(cl-loop for loc in locations collect - (save-excursion - (slime-goto-source-location loc) - (cl-destructuring-bind (start end) - (slime-region-for-defun-at-point) - (list (buffer-substring-no-properties start end) - (buffer-name) - (slime-current-package) - start - (if (buffer-file-name) - (slime-to-lisp-filename (buffer-file-name)) - nil))))) - ',slime-compilation-policy) - cont)) - - -;;;;; Merging together compiler notes in the same location. - -(defun slime-merge-notes-for-display (notes) - "Merge together notes that refer to the same location. -This operation is \"lossy\" in the broad sense but not for display purposes." - (mapcar #'slime-merge-notes - (slime-group-similar 'slime-notes-in-same-location-p notes))) - -(defun slime-merge-notes (notes) - "Merge NOTES together. Keep the highest severity, concatenate the messages." - (let* ((new-severity (cl-reduce #'slime-most-severe notes - :key #'slime-note.severity)) - (new-message (mapconcat #'slime-note.message notes "\n"))) - (let ((new-note (cl-copy-list (car notes)))) - (setf (cl-getf new-note :message) new-message) - (setf (cl-getf new-note :severity) new-severity) - new-note))) - -(defun slime-notes-in-same-location-p (a b) - (equal (slime-note.location a) (slime-note.location b))) - - -;;;;; Compiler notes list - -(defun slime-one-line-ify (string) - "Return a single-line version of STRING. -Each newlines and following indentation is replaced by a single space." - (with-temp-buffer - (insert string) - (goto-char (point-min)) - (while (re-search-forward "\n[\n \t]*" nil t) - (replace-match " ")) - (buffer-string))) - -(defun slime-xrefs-for-notes (notes) - (let ((xrefs)) - (dolist (note notes) - (let* ((location (cl-getf note :location)) - (fn (cadr (assq :file (cdr location)))) - (file (assoc fn xrefs)) - (node - (list (format "%s: %s" - (cl-getf note :severity) - (slime-one-line-ify (cl-getf note :message))) - location))) - (when fn - (if file - (push node (cdr file)) - (setf xrefs (cl-acons fn (list node) xrefs)))))) - xrefs)) - -(defun slime-maybe-show-xrefs-for-notes (notes) - "Show the compiler notes NOTES if they come from more than one file." - (let ((xrefs (slime-xrefs-for-notes notes))) - (when (slime-length> xrefs 1) ; >1 file - (slime-show-xrefs - xrefs 'definition "Compiler notes" (slime-current-package))))) - -(defun slime-note-has-location-p (note) - (not (eq ':error (car (slime-note.location note))))) - -(defun slime-redefinition-note-p (note) - (eq (slime-note.severity note) :redefinition)) - -(defun slime-create-compilation-log (notes) - "Create a buffer for `next-error' to use." - (with-current-buffer (get-buffer-create (slime-buffer-name :compilation)) - (let ((inhibit-read-only t)) - (erase-buffer)) - (slime-insert-compilation-log notes) - (compilation-mode))) - -(defun slime-maybe-show-compilation-log (notes) - "Display the log on failed compilations or if NOTES is non-nil." - (slime-create-compilation-log notes) - (with-struct (slime-compilation-result. notes duration successp) - slime-last-compilation-result - (unless successp - (with-current-buffer (slime-buffer-name :compilation) - (let ((inhibit-read-only t)) - (goto-char (point-max)) - (insert "Compilation " (if successp "succeeded." "failed.")) - (goto-char (point-min)) - (display-buffer (current-buffer))))))) - -(defun slime-show-compilation-log (notes) - "Create and display the compilation log buffer." - (interactive (list (slime-compiler-notes))) - (slime-with-popup-buffer ((slime-buffer-name :compilation) - :mode 'compilation-mode) - (slime-insert-compilation-log notes))) - -(defun slime-insert-compilation-log (notes) - "Insert NOTES in format suitable for `compilation-mode'." - (cl-destructuring-bind (grouped-notes canonicalized-locs-table) - (slime-group-and-sort-notes notes) - (with-temp-message "Preparing compilation log..." - (let ((inhibit-read-only t) - (inhibit-modification-hooks t)) ; inefficient font-lock-hook - (insert (format "cd %s\n%d compiler notes:\n\n" - default-directory (length notes))) - (dolist (notes grouped-notes) - (let ((loc (gethash (cl-first notes) canonicalized-locs-table)) - (start (point))) - (insert (slime-canonicalized-location-to-string loc) ":") - (slime-insert-note-group notes) - (insert "\n") - (slime-make-note-overlay (cl-first notes) start (1- (point)))))) - (set (make-local-variable 'compilation-skip-threshold) 0) - (setq next-error-last-buffer (current-buffer))))) - -(defun slime-insert-note-group (notes) - "Insert a group of compiler messages." - (insert "\n") - (dolist (note notes) - (insert " " (slime-severity-label (slime-note.severity note)) ": ") - (let ((start (point))) - (insert (slime-note.message note)) - (let ((ctx (slime-note.source-context note))) - (if ctx (insert "\n" ctx))) - (slime-indent-block start 4)) - (insert "\n"))) - -(defun slime-indent-block (start column) - "If the region back to START isn't a one-liner indent it." - (when (< start (line-beginning-position)) - (save-excursion - (goto-char start) - (insert "\n")) - (slime-indent-rigidly start (point) column))) - -(defun slime-canonicalized-location (location) - "Return a list (FILE LINE COLUMN) for slime-location LOCATION. -This is quite an expensive operation so use carefully." - (save-excursion - (slime-goto-location-buffer (slime-location.buffer location)) - (save-excursion - (slime-goto-source-location location) - (list (or (buffer-file-name) (buffer-name)) - (save-restriction - (widen) - (line-number-at-pos)) - (1+ (current-column)))))) - -(defun slime-canonicalized-location-to-string (loc) - (if loc - (cl-destructuring-bind (filename line col) loc - (format "%s:%d:%d" - (cond ((not filename) "") - ((let ((rel (file-relative-name filename))) - (if (< (length rel) (length filename)) - rel))) - (t filename)) - line col)) - (format "Unknown location"))) - -(defun slime-goto-note-in-compilation-log (note) - "Find `note' in the compilation log and display it." - (with-current-buffer (get-buffer (slime-buffer-name :compilation)) - (let ((pos - (save-excursion - (goto-char (point-min)) - (cl-loop for overlay = (slime-find-next-note) - while overlay - for other-note = (overlay-get overlay 'slime-note) - when (slime-notes-in-same-location-p note other-note) - return (overlay-start overlay))))) - (when pos - (slime--display-position pos nil 0))))) - -(defun slime-group-and-sort-notes (notes) - "First sort, then group NOTES according to their canonicalized locs." - (let ((locs (make-hash-table :test #'eq))) - (mapc (lambda (note) - (let ((loc (slime-note.location note))) - (when (slime-location-p loc) - (puthash note (slime-canonicalized-location loc) locs)))) - notes) - (list (slime-group-similar - (lambda (n1 n2) - (equal (gethash n1 locs nil) (gethash n2 locs t))) - (let* ((bottom most-negative-fixnum) - (+default+ (list "" bottom bottom))) - (sort notes - (lambda (n1 n2) - (cl-destructuring-bind ((filename1 line1 col1) - (filename2 line2 col2)) - (list (gethash n1 locs +default+) - (gethash n2 locs +default+)) - (cond ((string-lessp filename1 filename2) t) - ((string-lessp filename2 filename1) nil) - ((< line1 line2) t) - ((> line1 line2) nil) - (t (< col1 col2)))))))) - locs))) - -(defun slime-note.severity (note) - (plist-get note :severity)) - -(defun slime-note.message (note) - (plist-get note :message)) - -(defun slime-note.source-context (note) - (plist-get note :source-context)) - -(defun slime-note.location (note) - (plist-get note :location)) - -(defun slime-severity-label (severity) - (cl-subseq (symbol-name severity) 1)) - - -;;;;; Adding a single compiler note - -(defun slime-overlay-note (note) - "Add a compiler note to the buffer as an overlay. -If an appropriate overlay for a compiler note in the same location -already exists then the new information is merged into it. Otherwise a -new overlay is created." - (cl-multiple-value-bind (start end) (slime-choose-overlay-region note) - (when start - (goto-char start) - (let ((severity (plist-get note :severity)) - (message (plist-get note :message)) - (overlay (slime-note-at-point))) - (if overlay - (slime-merge-note-into-overlay overlay severity message) - (slime-create-note-overlay note start end severity message)))))) - -(defun slime-make-note-overlay (note start end) - (let ((overlay (make-overlay start end))) - (overlay-put overlay 'slime-note note) - (push overlay slime-note-overlays) - overlay)) - -(defun slime-create-note-overlay (note start end severity message) - "Create an overlay representing a compiler note. -The overlay has several properties: - FACE - to underline the relevant text. - SEVERITY - for future reference :NOTE, :STYLE-WARNING, :WARNING, or :ERROR. - MOUSE-FACE - highlight the note when the mouse passes over. - HELP-ECHO - a string describing the note, both for future reference - and for display as a tooltip (due to the special - property name)." - (let ((overlay (slime-make-note-overlay note start end))) - (cl-macrolet ((putp (name value) `(overlay-put overlay ,name ,value))) - (putp 'face (slime-severity-face severity)) - (putp 'severity severity) - (putp 'mouse-face 'highlight) - (putp 'help-echo message) - overlay))) - -;; XXX Obsolete due to `slime-merge-notes-for-display' doing the -;; work already -- unless we decide to put several sets of notes on a -;; buffer without clearing in between, which only this handles. -(defun slime-merge-note-into-overlay (overlay severity message) - "Merge another compiler note into an existing overlay. -The help text describes both notes, and the highest of the severities -is kept." - (cl-macrolet ((putp (name value) `(overlay-put overlay ,name ,value)) - (getp (name) `(overlay-get overlay ,name))) - (putp 'severity (slime-most-severe severity (getp 'severity))) - (putp 'face (slime-severity-face (getp 'severity))) - (putp 'help-echo (concat (getp 'help-echo) "\n" message)))) - -(defun slime-choose-overlay-region (note) - "Choose the start and end points for an overlay over NOTE. -If the location's sexp is a list spanning multiple lines, then the -region around the first element is used. -Return nil if there's no useful source location." - (let ((location (slime-note.location note))) - (when location - (slime-dcase location - ((:error _)) ; do nothing - ((:location file pos _hints) - (cond ((eq (car file) ':source-form) nil) - ((eq (slime-note.severity note) :read-error) - (slime-choose-overlay-for-read-error location)) - ((equal pos '(:eof)) - (cl-values (1- (point-max)) (point-max))) - (t - (slime-choose-overlay-for-sexp location)))))))) - -(defun slime-choose-overlay-for-read-error (location) - (let ((pos (slime-location-offset location))) - (save-excursion - (goto-char pos) - (cond ((slime-symbol-at-point) - ;; package not found, &c. - (cl-values (slime-symbol-start-pos) (slime-symbol-end-pos))) - (t - (cl-values pos (1+ pos))))))) - -(defun slime-choose-overlay-for-sexp (location) - (slime-goto-source-location location) - (skip-chars-forward "'#`") - (let ((start (point))) - (ignore-errors (slime-forward-sexp)) - (if (slime-same-line-p start (point)) - (cl-values start (point)) - (cl-values (1+ start) - (progn (goto-char (1+ start)) - (ignore-errors (forward-sexp 1)) - (point)))))) - -(defun slime-same-line-p (pos1 pos2) - "Return t if buffer positions POS1 and POS2 are on the same line." - (save-excursion (goto-char (min pos1 pos2)) - (<= (max pos1 pos2) (line-end-position)))) - -(defvar slime-severity-face-plist - '(:error slime-error-face - :read-error slime-error-face - :warning slime-warning-face - :redefinition slime-style-warning-face - :style-warning slime-style-warning-face - :early-deprecation-warning slime-early-deprecation-warning-face - :late-deprecation-warning slime-late-deprecation-warning-face - :final-deprecation-warning slime-final-deprecation-warning-face - :note slime-note-face)) - -(defun slime-severity-face (severity) - "Return the name of the font-lock face representing SEVERITY." - (or (plist-get slime-severity-face-plist severity) - (error "No face for: %S" severity))) - -(defvar slime-severity-order - '(:note - :early-deprecation-warning :style-warning :redefinition - :late-deprecation-warning :final-deprecation-warning - :warning :error :read-error)) - -(defun slime-severity< (sev1 sev2) - "Return true if SEV1 is less severe than SEV2." - (< (cl-position sev1 slime-severity-order) - (cl-position sev2 slime-severity-order))) - -(defun slime-most-severe (sev1 sev2) - "Return the most servere of two conditions." - (if (slime-severity< sev1 sev2) sev2 sev1)) - -;; XXX: unused function -(defun slime-visit-source-path (source-path) - "Visit a full source path including the top-level form." - (goto-char (point-min)) - (slime-forward-source-path source-path)) - -(defun slime-forward-positioned-source-path (source-path) - "Move forward through a sourcepath from a fixed position. -The point is assumed to already be at the outermost sexp, making the -first element of the source-path redundant." - (ignore-errors - (slime-forward-sexp) - (beginning-of-defun)) - (let ((source-path (cdr source-path))) - (when source-path - (down-list 1) - (slime-forward-source-path source-path)))) - -(defun slime-forward-source-path (source-path) - (let ((origin (point))) - (condition-case nil - (progn - (cl-loop for (count . more) on source-path - do (progn - (slime-forward-sexp count) - (when more (down-list 1)))) - ;; Align at beginning - (slime-forward-sexp) - (beginning-of-sexp)) - (error (goto-char origin))))) - - -;; FIXME: really fix this mess -;; FIXME: the check shouln't be done here anyway but by M-. itself. - -(defun slime-filesystem-toplevel-directory () - ;; Windows doesn't have a true toplevel root directory, and all - ;; filenames look like "c:/foo/bar/quux.baz" from an Emacs - ;; perspective anyway. - (if (memq system-type '(ms-dos windows-nt)) - "" - (file-name-as-directory "/"))) - -(defun slime-file-name-merge-source-root (target-filename buffer-filename) - "Returns a filename where the source root directory of TARGET-FILENAME -is replaced with the source root directory of BUFFER-FILENAME. - -If no common source root could be determined, return NIL. - -E.g. (slime-file-name-merge-source-root - \"/usr/local/src/joe/upstream/sbcl/code/late-extensions.lisp\" - \"/usr/local/src/joe/hacked/sbcl/compiler/deftype.lisp\") - - ==> \"/usr/local/src/joe/hacked/sbcl/code/late-extensions.lisp\" -" - (let ((target-dirs (split-string (file-name-directory target-filename) - "/" t)) - (buffer-dirs (split-string (file-name-directory buffer-filename) - "/" t))) - ;; Starting from the end, we look if one of the TARGET-DIRS exists - ;; in BUFFER-FILENAME---if so, it and everything left from that dirname - ;; is considered to be the source root directory of BUFFER-FILENAME. - (cl-loop with target-suffix-dirs = nil - with buffer-dirs* = (reverse buffer-dirs) - with target-dirs* = (reverse target-dirs) - for target-dir in target-dirs* - do (let ((concat-dirs (lambda (dirs) - (apply #'concat - (mapcar #'file-name-as-directory - dirs)))) - (pos (cl-position target-dir buffer-dirs* - :test #'equal))) - (if (not pos) ; TARGET-DIR not in BUFFER-FILENAME? - (push target-dir target-suffix-dirs) - (let* ((target-suffix - ; PUSH reversed for us! - (funcall concat-dirs target-suffix-dirs)) - (buffer-root - (funcall concat-dirs - (reverse (nthcdr pos buffer-dirs*))))) - (cl-return (concat (slime-filesystem-toplevel-directory) - buffer-root - target-suffix - (file-name-nondirectory - target-filename))))))))) - -(defun slime-highlight-differences-in-dirname (base-dirname contrast-dirname) - "Returns a copy of BASE-DIRNAME where all differences between -BASE-DIRNAME and CONTRAST-DIRNAME are propertized with a -highlighting face." - (setq base-dirname (file-name-as-directory base-dirname)) - (setq contrast-dirname (file-name-as-directory contrast-dirname)) - (let ((base-dirs (split-string base-dirname "/" t)) - (contrast-dirs (split-string contrast-dirname "/" t))) - (with-temp-buffer - (cl-loop initially (insert (slime-filesystem-toplevel-directory)) - for base-dir in base-dirs do - (let ((pos (cl-position base-dir contrast-dirs :test #'equal))) - (cond ((not pos) - (slime-insert-propertized '(face highlight) base-dir) - (insert "/")) - (t - (insert (file-name-as-directory base-dir)) - (setq contrast-dirs - (nthcdr (1+ pos) contrast-dirs)))))) - (buffer-substring (point-min) (point-max))))) - -(defvar slime-warn-when-possibly-tricked-by-M-. t - "When working on multiple source trees simultaneously, the way -`slime-edit-definition' (M-.) works can sometimes be confusing: - -`M-.' visits locations that are present in the current Lisp image, -which works perfectly well as long as the image reflects the source -tree that one is currently looking at. - -In the other case, however, one can easily end up visiting a file -in a different source root directory (cl-the one corresponding to -the Lisp image), and is thus easily tricked to modify the wrong -source files---which can lead to quite some stressfull cursing. - -If this variable is T, a warning message is issued to raise the -user's attention whenever `M-.' is about opening a file in a -different source root that also exists in the source root -directory of the user's current buffer. - -There's no guarantee that all possible cases are covered, but -if you encounter such a warning, it's a strong indication that -you should check twice before modifying.") - -(defun slime-maybe-warn-for-different-source-root (target-filename - buffer-filename) - (let ((guessed-target (slime-file-name-merge-source-root target-filename - buffer-filename))) - (when (and guessed-target - (not (equal guessed-target target-filename)) - (file-exists-p guessed-target)) - (slime-message "Attention: This is `%s'." - (concat (slime-highlight-differences-in-dirname - (file-name-directory target-filename) - (file-name-directory guessed-target)) - (file-name-nondirectory target-filename)))))) - -(defun slime-check-location-filename-sanity (filename) - (when slime-warn-when-possibly-tricked-by-M-. - (cl-macrolet ((truename-safe (file) `(and ,file (file-truename ,file)))) - (let ((target-filename (truename-safe filename)) - (buffer-filename (truename-safe (buffer-file-name)))) - (when (and target-filename - buffer-filename) - (slime-maybe-warn-for-different-source-root - target-filename buffer-filename)))))) - -(defun slime-check-location-buffer-name-sanity (buffer-name) - (slime-check-location-filename-sanity - (buffer-file-name (get-buffer buffer-name)))) - - - -(defun slime-goto-location-buffer (buffer) - (slime-dcase buffer - ((:file filename) - (let ((filename (slime-from-lisp-filename filename))) - (slime-check-location-filename-sanity filename) - (set-buffer (or (get-file-buffer filename) - (let ((find-file-suppress-same-file-warnings t)) - (find-file-noselect filename)))))) - ((:buffer buffer-name) - (slime-check-location-buffer-name-sanity buffer-name) - (set-buffer buffer-name)) - ((:buffer-and-file buffer filename) - (slime-goto-location-buffer - (if (get-buffer buffer) - (list :buffer buffer) - (list :file filename)))) - ((:source-form string) - (set-buffer (get-buffer-create (slime-buffer-name :source))) - (erase-buffer) - (lisp-mode) - (insert string) - (goto-char (point-min))) - ((:zip file entry) - (require 'arc-mode) - (set-buffer (find-file-noselect file t)) - (goto-char (point-min)) - (re-search-forward (concat " " entry "$")) - (let ((buffer (save-window-excursion - (archive-extract) - (current-buffer)))) - (set-buffer buffer) - (goto-char (point-min)))))) - -(defun slime-goto-location-position (position) - (slime-dcase position - ((:position pos) - (goto-char 1) - (forward-char (- (1- pos) (slime-eol-conversion-fixup (1- pos))))) - ((:offset start offset) - (goto-char start) - (forward-char offset)) - ((:line start &optional column) - (goto-char (point-min)) - (beginning-of-line start) - (cond (column (move-to-column column)) - (t (skip-chars-forward " \t")))) - ((:function-name name) - (let ((case-fold-search t) - (name (regexp-quote name))) - (goto-char (point-min)) - (when (or - (re-search-forward - (format "\\s *(def\\(\\s_\\|\\sw\\)*\\s +(*%s\\S_" - (regexp-quote name)) nil t) - (re-search-forward - (format "[( \t]%s\\>\\(\\s \\|$\\)" name) nil t)) - (goto-char (match-beginning 0))))) - ((:method name specializers &rest qualifiers) - (slime-search-method-location name specializers qualifiers)) - ((:source-path source-path start-position) - (cond (start-position - (goto-char start-position) - (slime-forward-positioned-source-path source-path)) - (t - (slime-forward-source-path source-path)))) - ((:eof) - (goto-char (point-max))))) - -(defun slime-eol-conversion-fixup (n) - ;; Return the number of \r\n eol markers that we need to cross when - ;; moving N chars forward. N is the number of chars but \r\n are - ;; counted as 2 separate chars. - (cl-case (coding-system-eol-type buffer-file-coding-system) - ((1) - (save-excursion - (cl-do ((pos (+ (point) n)) - (count 0 (1+ count))) - ((>= (point) pos) (1- count)) - (forward-line) - (cl-decf pos)))) - (t 0))) - -(defun slime-search-method-location (name specializers qualifiers) - ;; Look for a sequence of words (def method name - ;; qualifers specializers don't look for "T" since it isn't requires - ;; (arg without t) as class is taken as such. - (let* ((case-fold-search t) - (name (regexp-quote name)) - (qualifiers (mapconcat (lambda (el) (concat ".+?\\<" el "\\>")) - qualifiers "")) - (specializers (mapconcat - (lambda (el) - (if (eql (aref el 0) ?\() - (let ((spec (read el))) - (if (eq (car spec) 'EQL) - (concat - ".*?\\n\\{0,1\\}.*?(EQL.*?'\\{0,1\\}" - (format "%s" (cl-second spec)) ")") - (error "don't understand specializer: %s,%s" - el (car spec)))) - (concat ".+?\n\\{0,1\\}.+?\\<" el "\\>"))) - (remove "T" specializers) "")) - (regexp (format "\\s *(def\\(\\s_\\|\\sw\\)*\\s +%s\\s +%s%s" name - qualifiers specializers))) - (or (and (re-search-forward regexp nil t) - (goto-char (match-beginning 0))) - ;; (slime-goto-location-position `(:function-name ,name)) - ))) - -(defun slime-search-call-site (fname) - "Move to the place where FNAME called. -Don't move if there are multiple or no calls in the current defun." - (save-restriction - (narrow-to-defun) - (let ((start (point)) - (regexp (concat "(" fname "[)\n \t]")) - (case-fold-search t)) - (cond ((and (re-search-forward regexp nil t) - (not (re-search-forward regexp nil t))) - (goto-char (match-beginning 0))) - (t (goto-char start)))))) - -(defun slime-search-edit-path (edit-path) - "Move to EDIT-PATH starting at the current toplevel form." - (when edit-path - (unless (and (= (current-column) 0) - (looking-at "(")) - (beginning-of-defun)) - (slime-forward-source-path edit-path))) - -(defun slime-goto-source-location (location &optional noerror) - "Move to the source location LOCATION. Several kinds of locations -are supported: - - ::= (:location ) - | (:error ) - - ::= (:file ) - | (:buffer ) - | (:buffer-and-file ) - | (:source-form ) - | (:zip ) - - ::= (:position ) ; 1 based (for files) - | (:offset ) ; start+offset (for C-c C-c) - | (:line []) - | (:function-name ) - | (:source-path ) - | (:method . )" - (slime-dcase location - ((:location buffer _position _hints) - (slime-goto-location-buffer buffer) - (let ((pos (slime-location-offset location))) - (cond ((and (<= (point-min) pos) (<= pos (point-max)))) - (widen-automatically (widen)) - (t - (error "Location is outside accessible part of buffer"))) - (goto-char pos))) - ((:error message) - (if noerror - (slime-message "%s" message) - (error "%s" message))))) - -(defun slime-location-offset (location) - "Return the position, as character number, of LOCATION." - (save-restriction - (widen) - (condition-case nil - (slime-goto-location-position - (slime-location.position location)) - (error (goto-char 0))) - (cl-destructuring-bind (&key snippet edit-path call-site align) - (slime-location.hints location) - (when snippet (slime-isearch snippet)) - (when edit-path (slime-search-edit-path edit-path)) - (when call-site (slime-search-call-site call-site)) - (when align - (slime-forward-sexp) - (beginning-of-sexp))) - (point))) - - -;;;;; Incremental search -;; -;; Search for the longest match of a string in either direction. -;; -;; This is for locating text that is expected to be near the point and -;; may have been modified (but hopefully not near the beginning!) - -(defun slime-isearch (string) - "Find the longest occurence of STRING either backwards of forwards. -If multiple matches exist the choose the one nearest to point." - (goto-char - (let* ((start (point)) - (len1 (slime-isearch-with-function 'search-forward string)) - (pos1 (point))) - (goto-char start) - (let* ((len2 (slime-isearch-with-function 'search-backward string)) - (pos2 (point))) - (cond ((and len1 len2) - ;; Have a match in both directions - (cond ((= len1 len2) - ;; Both are full matches -- choose the nearest. - (if (< (abs (- start pos1)) - (abs (- start pos2))) - pos1 pos2)) - ((> len1 len2) pos1) - ((> len2 len1) pos2))) - (len1 pos1) - (len2 pos2) - (t start)))))) - -(defun slime-isearch-with-function (search-fn string) - "Search for the longest substring of STRING using SEARCH-FN. -SEARCH-FN is either the symbol `search-forward' or `search-backward'." - (unless (string= string "") - (cl-loop for i from 1 to (length string) - while (funcall search-fn (substring string 0 i) nil t) - for match-data = (match-data) - do (cl-case search-fn - (search-forward (goto-char (match-beginning 0))) - (search-backward (goto-char (1+ (match-end 0))))) - finally (cl-return (if (null match-data) - nil - ;; Finish based on the last successful match - (store-match-data match-data) - (goto-char (match-beginning 0)) - (- (match-end 0) (match-beginning 0))))))) - - -;;;;; Visiting and navigating the overlays of compiler notes - -(defun slime-next-note () - "Go to and describe the next compiler note in the buffer." - (interactive) - (let ((here (point)) - (note (slime-find-next-note))) - (if note - (slime-show-note note) - (goto-char here) - (message "No next note.")))) - -(defun slime-previous-note () - "Go to and describe the previous compiler note in the buffer." - (interactive) - (let ((here (point)) - (note (slime-find-previous-note))) - (if note - (slime-show-note note) - (goto-char here) - (message "No previous note.")))) - -(defun slime-goto-first-note (&rest _) - "Go to the first note in the buffer." - (let ((point (point))) - (goto-char (point-min)) - (cond ((slime-find-next-note) - (slime-show-note (slime-note-at-point))) - (t (goto-char point))))) - -(defun slime-remove-notes () - "Remove compiler-note annotations from the current buffer." - (interactive) - (slime-remove-old-overlays)) - -(defun slime-show-note (overlay) - "Present the details of a compiler note to the user." - (slime-temporarily-highlight-note overlay) - (if (get-buffer-window (slime-buffer-name :compilation) t) - (slime-goto-note-in-compilation-log (overlay-get overlay 'slime-note)) - (let ((message (get-char-property (point) 'help-echo))) - (slime-message "%s" (if (zerop (length message)) "\"\"" message))))) - -;; FIXME: could probably use flash region -(defun slime-temporarily-highlight-note (overlay) - "Temporarily highlight a compiler note's overlay. -The highlighting is designed to both make the relevant source more -visible, and to highlight any further notes that are nested inside the -current one. - -The highlighting is automatically undone with a timer." - (run-with-timer 0.2 nil - #'overlay-put overlay 'face (overlay-get overlay 'face)) - (overlay-put overlay 'face 'slime-highlight-face)) - - -;;;;; Overlay lookup operations - -(defun slime-note-at-point () - "Return the overlay for a note starting at point, otherwise NIL." - (cl-find (point) (slime-note-overlays-at-point) - :key 'overlay-start)) - -(defun slime-note-overlay-p (overlay) - "Return true if OVERLAY represents a compiler note." - (overlay-get overlay 'slime-note)) - -(defun slime-note-overlays-at-point () - "Return a list of all note overlays that are under the point." - (cl-remove-if-not 'slime-note-overlay-p (overlays-at (point)))) - -(defun slime-find-next-note () - "Go to the next position with the `slime-note' text property. -Retuns the note overlay if such a position is found, otherwise nil." - (slime-search-property 'slime-note nil #'slime-note-at-point)) - -(defun slime-find-previous-note () - "Go to the next position with the `slime-note' text property. -Retuns the note overlay if such a position is found, otherwise nil." - (slime-search-property 'slime-note t #'slime-note-at-point)) - - -;;;; Arglist Display - -(defun slime-space (n) - "Insert a space and print some relevant information (function arglist). -Designed to be bound to the SPC key. Prefix argument can be used to insert -more than one space." - (interactive "p") - (self-insert-command n) - (slime-echo-arglist)) - -(put 'slime-space 'delete-selection t) ; for delete-section-mode & CUA - -(defun slime-echo-arglist () - (when (slime-background-activities-enabled-p) - (let ((op (slime-operator-before-point))) - (when op - (slime-eval-async `(swank:operator-arglist ,op - ,(slime-current-package)) - (lambda (arglist) - (when arglist - (slime-message "%s" arglist)))))))) - -(defvar slime-operator-before-point-function 'slime-lisp-operator-before-point) - -(defun slime-operator-before-point () - (funcall slime-operator-before-point-function)) - -(defun slime-lisp-operator-before-point () - (ignore-errors - (save-excursion - (backward-up-list 1) - (down-list 1) - (slime-symbol-at-point)))) - -;;;; Completion - -;; FIXME: use this in Emacs 24 -;;(define-obsolete-function-alias slime-complete-symbol completion-at-point) - -(defalias 'slime-complete-symbol #'completion-at-point) -(make-obsolete 'slime-complete-symbol #'completion-at-point "2015-10-17") - -;; This is the function that we add to -;; `completion-at-point-functions'. For backward-compatibilty we look -;; at `slime-complete-symbol-function' first. The indirection through -;; `slime-completion-at-point-functions' is used so that users don't -;; have to set `completion-at-point-functions' in every slime-like -;; buffer. -(defun slime--completion-at-point () - (cond (slime-complete-symbol-function - slime-complete-symbol-function) - (t - (run-hook-with-args-until-success - 'slime-completion-at-point-functions)))) - -(defun slime-setup-completion () - (add-hook 'completion-at-point-functions #'slime--completion-at-point nil t)) - -(defun slime-simple-completion-at-point () - "Complete the symbol at point. -Perform completion similar to `elisp-completion-at-point'." - (let* ((end (point)) - (beg (slime-symbol-start-pos))) - (list beg end (completion-table-dynamic #'slime-simple-completions)))) - -(defun slime-filename-completion () - "If point is at a string starting with \", complete it as filename. -Return nil if point is not at filename." - (when (save-excursion (re-search-backward "\"[^ \t\n]+\\=" - (max (point-min) (- (point) 1000)) - t)) - (let ((comint-completion-addsuffix '("/" . "\""))) - (comint-filename-completion)))) - -;; FIXME: for backward compatibility. Remove it one day -;; together with slime-complete-symbol-function. -(defun slime-simple-complete-symbol () - (let ((completion-at-point-functions '(slime-maybe-complete-as-filename - slime-simple-completion-at-point))) - (completion-at-point))) - -;; NOTE: the original idea was to bind this to TAB but that no longer -;; works as `completion-at-point' sets a transient keymap that -;; overrides TAB. So this is rather useless now. -(defun slime-indent-and-complete-symbol () - "Indent the current line and perform symbol completion. -First indent the line. If indenting doesn't move point, complete -the symbol. If there's no symbol at the point, show the arglist -for the most recently enclosed macro or function." - (interactive) - (let ((pos (point))) - (unless (get-text-property (line-beginning-position) 'slime-repl-prompt) - (lisp-indent-line)) - (when (= pos (point)) - (cond ((save-excursion (re-search-backward "[^() \n\t\r]+\\=" nil t)) - (completion-at-point)) - ((memq (char-before) '(?\t ?\ )) - (slime-echo-arglist)))))) - -(make-obsolete 'slime-indent-and-complete-symbol - "Set tab-always-indent to 'complete." - "2015-10-18") - -(defvar slime-minibuffer-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map minibuffer-local-map) - (define-key map "\t" #'completion-at-point) - (define-key map "\M-\t" #'completion-at-point) - map) - "Minibuffer keymap used for reading CL expressions.") - -(defvar slime-minibuffer-history '() - "History list of expressions read from the minibuffer.") - -(defun slime-minibuffer-setup-hook () - (cons (lexical-let ((package (slime-current-package)) - (connection (slime-connection))) - (lambda () - (setq slime-buffer-package package) - (setq slime-buffer-connection connection) - (set-syntax-table lisp-mode-syntax-table) - (slime-setup-completion))) - minibuffer-setup-hook)) - -(defun slime-read-from-minibuffer (prompt &optional initial-value history) - "Read a string from the minibuffer, prompting with PROMPT. -If INITIAL-VALUE is non-nil, it is inserted into the minibuffer before -reading input. The result is a string (\"\" if no input was given)." - (let ((minibuffer-setup-hook (slime-minibuffer-setup-hook))) - (read-from-minibuffer prompt initial-value slime-minibuffer-map - nil (or history 'slime-minibuffer-history)))) - -(defun slime-bogus-completion-alist (list) - "Make an alist out of list. -The same elements go in the CAR, and nil in the CDR. To support the -apparently very stupid `try-completions' interface, that wants an -alist but ignores CDRs." - (mapcar (lambda (x) (cons x nil)) list)) - -(defun slime-simple-completions (prefix) - (cl-destructuring-bind (completions _partial) - (let ((slime-current-thread t)) - (slime-eval - `(swank:simple-completions ,(substring-no-properties prefix) - ',(slime-current-package)))) - completions)) - - -;;;; Edit definition - -(defun slime-push-definition-stack () - "Add point to find-tag-marker-ring." - (require 'etags) - (ring-insert find-tag-marker-ring (point-marker))) - -(defun slime-pop-find-definition-stack () - "Pop the edit-definition stack and goto the location." - (interactive) - (pop-tag-mark)) - -(cl-defstruct (slime-xref (:conc-name slime-xref.) (:type list)) - dspec location) - -(cl-defstruct (slime-location (:conc-name slime-location.) (:type list) - (:constructor nil) - (:copier nil)) - tag buffer position hints) - -(defun slime-location-p (o) (and (consp o) (eq (car o) :location))) - -(defun slime-xref-has-location-p (xref) - (slime-location-p (slime-xref.location xref))) - -(defun make-slime-buffer-location (buffer-name position &optional hints) - `(:location (:buffer ,buffer-name) (:position ,position) - ,(when hints `(:hints ,hints)))) - -(defun make-slime-file-location (file-name position &optional hints) - `(:location (:file ,file-name) (:position ,position) - ,(when hints `(:hints ,hints)))) - -;;; The hooks are tried in order until one succeeds, otherwise the -;;; default implementation involving `slime-find-definitions-function' -;;; is used. The hooks are called with the same arguments as -;;; `slime-edit-definition'. -(defvar slime-edit-definition-hooks) - -(defun slime-edit-definition (&optional name where) - "Lookup the definition of the name at point. -If there's no name at point, or a prefix argument is given, then the -function name is prompted." - (interactive (list (or (and (not current-prefix-arg) - (slime-symbol-at-point)) - (slime-read-symbol-name "Edit Definition of: ")))) - ;; The hooks might search for a name in a different manner, so don't - ;; ask the user if it's missing before the hooks are run - (or (run-hook-with-args-until-success 'slime-edit-definition-hooks - name where) - (slime-edit-definition-cont (slime-find-definitions name) - name where))) - -(defun slime-edit-definition-cont (xrefs name where) - (cl-destructuring-bind (1loc file-alist) (slime-analyze-xrefs xrefs) - (cond ((null xrefs) - (error "No known definition for: %s (in %s)" - name (slime-current-package))) - (1loc - (slime-push-definition-stack) - (slime-pop-to-location (slime-xref.location (car xrefs)) where)) - ((slime-length= xrefs 1) ; ((:error "...")) - (error "%s" (cadr (slime-xref.location (car xrefs))))) - (t - (slime-push-definition-stack) - (slime-show-xrefs file-alist 'definition name - (slime-current-package)))))) - -(defvar slime-edit-uses-xrefs - '(:calls :macroexpands :binds :references :sets :specializes)) - -;;; FIXME. TODO: Would be nice to group the symbols (in each -;;; type-group) by their home-package. -(defun slime-edit-uses (symbol) - "Lookup all the uses of SYMBOL." - (interactive (list (slime-read-symbol-name "Edit Uses of: "))) - (slime-xrefs slime-edit-uses-xrefs - symbol - (lambda (xrefs type symbol package) - (cond - ((null xrefs) - (message "No xref information found for %s." symbol)) - ((and (slime-length= xrefs 1) ; one group - (slime-length= (cdar xrefs) 1)) ; one ref in group - (cl-destructuring-bind (_ (_ loc)) (cl-first xrefs) - (slime-push-definition-stack) - (slime-pop-to-location loc))) - (t - (slime-push-definition-stack) - (slime-show-xref-buffer xrefs type symbol package)))))) - -(defun slime-analyze-xrefs (xrefs) - "Find common filenames in XREFS. -Return a list (SINGLE-LOCATION FILE-ALIST). -SINGLE-LOCATION is true if all xrefs point to the same location. -FILE-ALIST is an alist of the form ((FILENAME . (XREF ...)) ...)." - (list (and xrefs - (let ((loc (slime-xref.location (car xrefs)))) - (and (slime-location-p loc) - (cl-every (lambda (x) (equal (slime-xref.location x) loc)) - (cdr xrefs))))) - (slime-alistify xrefs #'slime-xref-group #'equal))) - -(defun slime-xref-group (xref) - (cond ((slime-xref-has-location-p xref) - (slime-dcase (slime-location.buffer (slime-xref.location xref)) - ((:file filename) filename) - ((:buffer bufname) - (let ((buffer (get-buffer bufname))) - (if buffer - (format "%S" buffer) ; "#" - (format "%s (previously existing buffer)" bufname)))) - ((:buffer-and-file _buffer filename) filename) - ((:source-form _) "(S-Exp)") - ((:zip _zip entry) entry))) - (t - "(No location)"))) - -(defun slime-pop-to-location (location &optional where) - (slime-goto-source-location location) - (let ((point (point))) - (cl-ecase where - ((nil) (switch-to-buffer (current-buffer))) - (window (pop-to-buffer (current-buffer) t)) - (frame (let ((pop-up-frames t)) (pop-to-buffer (current-buffer) t)))) - (goto-char point))) - -(defun slime-postprocess-xref (original-xref) - "Process (for normalization purposes) an Xref comming directly -from SWANK before the rest of Slime sees it. In particular, -convert ETAGS based xrefs to actual file+position based -locations." - (if (not (slime-xref-has-location-p original-xref)) - (list original-xref) - (let ((loc (slime-xref.location original-xref))) - (slime-dcase (slime-location.buffer loc) - ((:etags-file tags-file) - (slime-dcase (slime-location.position loc) - ((:tag &rest tags) - (visit-tags-table tags-file) - (mapcar (lambda (xref) - (let ((old-dspec (slime-xref.dspec original-xref)) - (new-dspec (slime-xref.dspec xref))) - (setf (slime-xref.dspec xref) - (format "%s: %s" old-dspec new-dspec)) - xref)) - (cl-mapcan #'slime-etags-definitions tags))))) - (t - (list original-xref)))))) - -(defun slime-postprocess-xrefs (xrefs) - (cl-mapcan #'slime-postprocess-xref xrefs)) - -(defun slime-find-definitions (name) - "Find definitions for NAME." - (slime-postprocess-xrefs (funcall slime-find-definitions-function name))) - -(defun slime-find-definitions-rpc (name) - (slime-eval `(swank:find-definitions-for-emacs ,name))) - -(defun slime-edit-definition-other-window (name) - "Like `slime-edit-definition' but switch to the other window." - (interactive (list (slime-read-symbol-name "Symbol: "))) - (slime-edit-definition name 'window)) - -(defun slime-edit-definition-other-frame (name) - "Like `slime-edit-definition' but switch to the other window." - (interactive (list (slime-read-symbol-name "Symbol: "))) - (slime-edit-definition name 'frame)) - -(defun slime-edit-definition-with-etags (name) - (interactive (list (slime-read-symbol-name "Symbol: "))) - (let ((xrefs (slime-etags-definitions name))) - (cond (xrefs - (message "Using tag file...") - (slime-edit-definition-cont xrefs name nil)) - (t - (error "No known definition for: %s" name))))) - -(defun slime-etags-to-locations (name) - "Search for definitions matching `name' in the currently active -tags table. Return a possibly empty list of slime-locations." - (let ((locs '())) - (save-excursion - (let ((first-time t)) - (while (visit-tags-table-buffer (not first-time)) - (setq first-time nil) - (goto-char (point-min)) - (while (search-forward name nil t) - (beginning-of-line) - (cl-destructuring-bind (hint line &rest pos) (etags-snarf-tag) - (unless (eq hint t) ; hint==t if we are in a filename line - (push `(:location (:file ,(expand-file-name (file-of-tag))) - (:line ,line) - (:snippet ,hint)) - locs)))))) - (nreverse locs)))) - -(defun slime-etags-definitions (name) - "Search definitions matching NAME in the tags file. -The result is a (possibly empty) list of definitions." - (mapcar (lambda (loc) - (make-slime-xref :dspec (cl-second (slime-location.hints loc)) - :location loc)) - (slime-etags-to-locations name))) - -;;;;; first-change-hook - -(defun slime-first-change-hook () - "Notify Lisp that a source file's buffer has been modified." - ;; Be careful not to disturb anything! - ;; In particular if we muck up the match-data then query-replace - ;; breaks. -luke (26/Jul/2004) - (save-excursion - (save-match-data - (when (and (buffer-file-name) - (file-exists-p (buffer-file-name)) - (slime-background-activities-enabled-p)) - (let ((filename (slime-to-lisp-filename (buffer-file-name)))) - (slime-eval-async `(swank:buffer-first-change ,filename))))))) - -(defun slime-setup-first-change-hook () - (add-hook (make-local-variable 'first-change-hook) - 'slime-first-change-hook)) - -(add-hook 'slime-mode-hook 'slime-setup-first-change-hook) - - -;;;; Eval for Lisp - -(defun slime-lisp-readable-p (x) - (or (stringp x) - (memq x '(nil t)) - (integerp x) - (keywordp x) - (and (consp x) - (let ((l x)) - (while (consp l) - (slime-lisp-readable-p (car x)) - (setq l (cdr l))) - (slime-lisp-readable-p l))))) - -(defun slime--funcall-and-dispatch-result (thread tag fn &rest args) - (let ((ok nil) - (value nil) - (error nil)) - (unwind-protect - (condition-case err - (progn - (setq value (apply fn args)) - (setq ok t)) - ((debug error) - (setq error err))) - (let ((result (cond ((and ok - (not (slime-lisp-readable-p value))) - `(:unreadable ,(slime-prin1-to-string value))) - (ok `(:ok ,value)) - (error `(:error ,(symbol-name (car error)) - . ,(mapcar #'slime-prin1-to-string - (cdr error)))) - (t `(:abort))))) - (slime-dispatch-event `(:emacs-return ,thread ,tag ,result)))))) - -(defun slime-eval-for-lisp (thread tag form-string) - (slime--funcall-and-dispatch-result thread tag - (lambda (s) (eval (read s))) - form-string)) - -(defun slime-check-eval-in-emacs-enabled () - "Raise an error if `slime-enable-evaluate-in-emacs' isn't true." - (unless slime-enable-evaluate-in-emacs - (error (concat "slime-eval-in-emacs disabled for security. " - "Set `slime-enable-evaluate-in-emacs' true to enable it.")))) - - -;;;; RPC from Lisp - -(defmacro defslimefun (name arglist &rest body) - "Define a function via `cl-defun' that can be invoked from SWANK." - `(progn - (put ',name 'slime-rpc t) - (cl-defun ,name ,arglist ,@body))) - -(defun slime-rpc-allowed-p (fn) - (get fn 'slime-rpc)) - -(defun slime-check-rpc-allowed (fn) - "Raise an error if FN does not denote a function defined via -`defslimefun'." - (unless (slime-rpc-allowed-p fn) - (error "Lisp tried to RPC `%s', but it wasn't defined via `defslimefun'." - fn))) - -(defun slime-rpc-from-lisp (thread tag fn args) - (if (not (slime-rpc-allowed-p fn)) - (slime-dispatch-event '(:ed-rpc-forbidden ,thread ,tag ,fn)) - (apply #'slime--funcall-and-dispatch-result thread tag fn args))) - - -;;;; `ED' - -(defvar slime-ed-frame nil - "The frame used by `slime-ed'.") - -(defcustom slime-ed-use-dedicated-frame t - "*When non-nil, `slime-ed' will create and reuse a dedicated frame." - :type 'boolean - :group 'slime-mode) - -(defun slime-ed (what) - "Edit WHAT. - -WHAT can be: - A filename (string), - A list (:filename FILENAME &key LINE COLUMN POSITION), - A function name (:function-name STRING) - nil. - -This is for use in the implementation of COMMON-LISP:ED." - (when slime-ed-use-dedicated-frame - (unless (and slime-ed-frame (frame-live-p slime-ed-frame)) - (setq slime-ed-frame (make-frame))) - (select-frame slime-ed-frame)) - (when what - (slime-dcase what - ((:filename file &key line column position bytep) - (find-file (slime-from-lisp-filename file)) - (when line (slime-goto-line line)) - (when column (move-to-column column)) - (when position - (goto-char (if bytep - (byte-to-position position) - position)))) - ((:function-name name) - (slime-edit-definition name))))) - -(defun slime-goto-line (line-number) - "Move to line LINE-NUMBER (1-based). -This is similar to `goto-line' but without pushing the mark and -the display stuff that we neither need nor want." - (cl-assert (= (buffer-size) (- (point-max) (point-min))) () - "slime-goto-line in narrowed buffer") - (goto-char (point-min)) - (forward-line (1- line-number))) - -(defun slime-y-or-n-p (thread tag question) - (slime-dispatch-event `(:emacs-return ,thread ,tag ,(y-or-n-p question)))) - -(defun slime-read-from-minibuffer-for-swank (thread tag prompt initial-value) - (let ((answer (condition-case nil - (slime-read-from-minibuffer prompt initial-value) - (quit nil)))) - (slime-dispatch-event `(:emacs-return ,thread ,tag ,answer)))) - -;;;; Interactive evaluation. - -(defun slime-interactive-eval (string) - "Read and evaluate STRING and print value in minibuffer. - -Note: If a prefix argument is in effect then the result will be -inserted in the current buffer." - (interactive (list (slime-read-from-minibuffer "Slime Eval: "))) - (cl-case current-prefix-arg - ((nil) - (slime-eval-with-transcript `(swank:interactive-eval ,string))) - ((-) - (slime-eval-save string)) - (t - (slime-eval-print string)))) - -(defvar slime-transcript-start-hook nil - "Hook run before start an evalution.") -(defvar slime-transcript-stop-hook nil - "Hook run after finishing a evalution.") - -(defun slime-display-eval-result (value) - (slime-message "%s" value)) - -(defun slime-eval-with-transcript (form) - "Eval FORM in Lisp. Display output, if any." - (run-hooks 'slime-transcript-start-hook) - (slime-rex () (form) - ((:ok value) - (run-hooks 'slime-transcript-stop-hook) - (slime-display-eval-result value)) - ((:abort condition) - (run-hooks 'slime-transcript-stop-hook) - (message "Evaluation aborted on %s." condition)))) - -(defun slime-eval-print (string) - "Eval STRING in Lisp; insert any output and the result at point." - (slime-eval-async `(swank:eval-and-grab-output ,string) - (lambda (result) - (cl-destructuring-bind (output value) result - (push-mark) - (insert output value))))) - -(defun slime-eval-save (string) - "Evaluate STRING in Lisp and save the result in the kill ring." - (slime-eval-async `(swank:eval-and-grab-output ,string) - (lambda (result) - (cl-destructuring-bind (output value) result - (let ((string (concat output value))) - (kill-new string) - (message "Evaluation finished; pushed result to kill ring.")))))) - -(defun slime-eval-describe (form) - "Evaluate FORM in Lisp and display the result in a new buffer." - (slime-eval-async form (slime-rcurry #'slime-show-description - (slime-current-package)))) - -(defvar slime-description-autofocus nil - "If non-nil select description windows on display.") - -(defun slime-show-description (string package) - ;; So we can have one description buffer open per connection. Useful - ;; for comparing the output of DISASSEMBLE across implementations. - ;; FIXME: could easily be achieved with M-x rename-buffer - (let ((bufname (slime-buffer-name :description))) - (slime-with-popup-buffer (bufname :package package - :connection t - :select slime-description-autofocus) - (princ string) - (goto-char (point-min))))) - -(defun slime-last-expression () - (buffer-substring-no-properties - (save-excursion (backward-sexp) (point)) - (point))) - -(defun slime-eval-last-expression () - "Evaluate the expression preceding point." - (interactive) - (slime-interactive-eval (slime-last-expression))) - -(defun slime-eval-defun () - "Evaluate the current toplevel form. -Use `slime-re-evaluate-defvar' if the from starts with '(defvar'" - (interactive) - (let ((form (slime-defun-at-point))) - (cond ((string-match "^(defvar " form) - (slime-re-evaluate-defvar form)) - (t - (slime-interactive-eval form))))) - -(defun slime-eval-region (start end) - "Evaluate region." - (interactive "r") - (slime-eval-with-transcript - `(swank:interactive-eval-region - ,(buffer-substring-no-properties start end)))) - -(defun slime-pprint-eval-region (start end) - "Evaluate region; pprint the value in a buffer." - (interactive "r") - (slime-eval-describe - `(swank:pprint-eval - ,(buffer-substring-no-properties start end)))) - -(defun slime-eval-buffer () - "Evaluate the current buffer. -The value is printed in the echo area." - (interactive) - (slime-eval-region (point-min) (point-max))) - -(defun slime-re-evaluate-defvar (form) - "Force the re-evaluaton of the defvar form before point. - -First make the variable unbound, then evaluate the entire form." - (interactive (list (slime-last-expression))) - (slime-eval-with-transcript `(swank:re-evaluate-defvar ,form))) - -(defun slime-pprint-eval-last-expression () - "Evaluate the form before point; pprint the value in a buffer." - (interactive) - (slime-eval-describe `(swank:pprint-eval ,(slime-last-expression)))) - -(defun slime-eval-print-last-expression (string) - "Evaluate sexp before point; print value into the current buffer" - (interactive (list (slime-last-expression))) - (insert "\n") - (slime-eval-print string)) - -;;;; Edit Lisp value -;;; -(defun slime-edit-value (form-string) - "\\\ -Edit the value of a setf'able form in a new buffer. -The value is inserted into a temporary buffer for editing and then set -in Lisp when committed with \\[slime-edit-value-commit]." - (interactive - (list (slime-read-from-minibuffer "Edit value (evaluated): " - (slime-sexp-at-point)))) - (slime-eval-async `(swank:value-for-editing ,form-string) - (lexical-let ((form-string form-string) - (package (slime-current-package))) - (lambda (result) - (slime-edit-value-callback form-string result - package))))) - -(make-variable-buffer-local - (defvar slime-edit-form-string nil - "The form being edited by `slime-edit-value'.")) - -(define-minor-mode slime-edit-value-mode - "Mode for editing a Lisp value." - nil - " Edit-Value" - '(("\C-c\C-c" . slime-edit-value-commit))) - -(defun slime-edit-value-callback (form-string current-value package) - (let* ((name (generate-new-buffer-name (format "*Edit %s*" form-string))) - (buffer (slime-with-popup-buffer (name :package package - :connection t - :select t - :mode 'lisp-mode) - (slime-popup-buffer-mode -1) ; don't want binding of 'q' - (slime-mode 1) - (slime-edit-value-mode 1) - (setq slime-edit-form-string form-string) - (insert current-value) - (current-buffer)))) - (with-current-buffer buffer - (setq buffer-read-only nil) - (message "Type C-c C-c when done")))) - -(defun slime-edit-value-commit () - "Commit the edited value to the Lisp image. -\\(See `slime-edit-value'.)" - (interactive) - (if (null slime-edit-form-string) - (error "Not editing a value.") - (let ((value (buffer-substring-no-properties (point-min) (point-max)))) - (lexical-let ((buffer (current-buffer))) - (slime-eval-async `(swank:commit-edited-value ,slime-edit-form-string - ,value) - (lambda (_) - (with-current-buffer buffer - (quit-window t)))))))) - -;;;; Tracing - -(defun slime-untrace-all () - "Untrace all functions." - (interactive) - (slime-eval `(swank:untrace-all))) - -(defun slime-toggle-trace-fdefinition (spec) - "Toggle trace." - (interactive (list (slime-read-from-minibuffer - "(Un)trace: " (slime-symbol-at-point)))) - (message "%s" (slime-eval `(swank:swank-toggle-trace ,spec)))) - - - -(defun slime-disassemble-symbol (symbol-name) - "Display the disassembly for SYMBOL-NAME." - (interactive (list (slime-read-symbol-name "Disassemble: "))) - (slime-eval-describe `(swank:disassemble-form ,(concat "'" symbol-name)))) - -(defun slime-undefine-function (symbol-name) - "Unbind the function slot of SYMBOL-NAME." - (interactive (list (slime-read-symbol-name "fmakunbound: " t))) - (slime-eval-async `(swank:undefine-function ,symbol-name) - (lambda (result) (message "%s" result)))) - -(defun slime-unintern-symbol (symbol-name package) - "Unintern the symbol given with SYMBOL-NAME PACKAGE." - (interactive (list (slime-read-symbol-name "Unintern symbol: " t) - (slime-read-package-name "from package: " - (slime-current-package)))) - (slime-eval-async `(swank:unintern-symbol ,symbol-name ,package) - (lambda (result) (message "%s" result)))) - -(defun slime-delete-package (package-name) - "Delete the package with name PACKAGE-NAME." - (interactive (list (slime-read-package-name "Delete package: " - (slime-current-package)))) - (slime-eval-async `(cl:delete-package - (swank::guess-package ,package-name)))) - -(defun slime-load-file (filename) - "Load the Lisp file FILENAME." - (interactive (list - (read-file-name "Load file: " nil nil - nil (if (buffer-file-name) - (file-name-nondirectory - (buffer-file-name)))))) - (let ((lisp-filename (slime-to-lisp-filename (expand-file-name filename)))) - (slime-eval-with-transcript `(swank:load-file ,lisp-filename)))) - -(defvar slime-change-directory-hooks nil - "Hook run by `slime-change-directory'. -The functions are called with the new (absolute) directory.") - -(defun slime-change-directory (directory) - "Make DIRECTORY become Lisp's current directory. -Return whatever swank:set-default-directory returns." - (let ((dir (expand-file-name directory))) - (prog1 (slime-eval `(swank:set-default-directory - ,(slime-to-lisp-filename dir))) - (slime-with-connection-buffer nil (cd-absolute dir)) - (run-hook-with-args 'slime-change-directory-hooks dir)))) - -(defun slime-cd (directory) - "Make DIRECTORY become Lisp's current directory. -Return whatever swank:set-default-directory returns." - (interactive (list (read-directory-name "Directory: " nil nil t))) - (message "default-directory: %s" (slime-change-directory directory))) - -(defun slime-pwd () - "Show Lisp's default directory." - (interactive) - (message "Directory %s" (slime-eval `(swank:default-directory)))) - - -;;;; Profiling - -(defun slime-toggle-profile-fdefinition (fname-string) - "Toggle profiling for FNAME-STRING." - (interactive (list (slime-read-from-minibuffer - "(Un)Profile: " - (slime-symbol-at-point)))) - (slime-eval-async `(swank:toggle-profile-fdefinition ,fname-string) - (lambda (r) (message "%s" r)))) - -(defun slime-unprofile-all () - "Unprofile all functions." - (interactive) - (slime-eval-async '(swank:unprofile-all) - (lambda (r) (message "%s" r)))) - -(defun slime-profile-report () - "Print profile report." - (interactive) - (slime-eval-with-transcript '(swank:profile-report))) - -(defun slime-profile-reset () - "Reset profile counters." - (interactive) - (slime-eval-async (slime-eval `(swank:profile-reset)) - (lambda (r) (message "%s" r)))) - -(defun slime-profiled-functions () - "Return list of names of currently profiled functions." - (interactive) - (slime-eval-async `(swank:profiled-functions) - (lambda (r) (message "%s" r)))) - -(defun slime-profile-package (package callers methods) - "Profile all functions in PACKAGE. -If CALLER is non-nil names have counts of the most common calling -functions recorded. -If METHODS is non-nil, profile all methods of all generic function -having names in the given package." - (interactive (list (slime-read-package-name "Package: ") - (y-or-n-p "Record the most common callers? ") - (y-or-n-p "Profile methods? "))) - (slime-eval-async `(swank:swank-profile-package ,package ,callers ,methods) - (lambda (r) (message "%s" r)))) - -(defun slime-profile-by-substring (substring &optional package) - "Profile all functions which names contain SUBSTRING. -If PACKAGE is NIL, then search in all packages." - (interactive (list - (slime-read-from-minibuffer - "Profile by matching substring: " - (slime-symbol-at-point)) - (slime-read-package-name "Package (RET for all packages): "))) - (let ((package (unless (equal package "") package))) - (slime-eval-async `(swank:profile-by-substring ,substring ,package) - (lambda (r) (message "%s" r)) ))) - -;;;; Documentation - -(defvar slime-documentation-lookup-function - 'slime-hyperspec-lookup) - -(defun slime-documentation-lookup () - "Generalized documentation lookup. Defaults to hyperspec lookup." - (interactive) - (call-interactively slime-documentation-lookup-function)) - -(defun slime-hyperspec-lookup (symbol-name) - "A wrapper for `hyperspec-lookup'" - (interactive (list (common-lisp-hyperspec-read-symbol-name - (slime-symbol-at-point)))) - (hyperspec-lookup symbol-name)) - -(defun slime-describe-symbol (symbol-name) - "Describe the symbol at point." - (interactive (list (slime-read-symbol-name "Describe symbol: "))) - (when (not symbol-name) - (error "No symbol given")) - (slime-eval-describe `(swank:describe-symbol ,symbol-name))) - -(defun slime-documentation (symbol-name) - "Display function- or symbol-documentation for SYMBOL-NAME." - (interactive (list (slime-read-symbol-name "Documentation for symbol: "))) - (when (not symbol-name) - (error "No symbol given")) - (slime-eval-describe - `(swank:documentation-symbol ,symbol-name))) - -(defun slime-describe-function (symbol-name) - (interactive (list (slime-read-symbol-name "Describe symbol's function: "))) - (when (not symbol-name) - (error "No symbol given")) - (slime-eval-describe `(swank:describe-function ,symbol-name))) - -(defface slime-apropos-symbol - '((t (:inherit bold))) - "Face for the symbol name in Apropos output." - :group 'slime) - -(defface slime-apropos-label - '((t (:inherit italic))) - "Face for label (`Function', `Variable' ...) in Apropos output." - :group 'slime) - -(defun slime-apropos-summary (string case-sensitive-p package only-external-p) - "Return a short description for the performed apropos search." - (concat (if case-sensitive-p "Case-sensitive " "") - "Apropos for " - (format "%S" string) - (if package (format " in package %S" package) "") - (if only-external-p " (external symbols only)" ""))) - -(defun slime-apropos (string &optional only-external-p package - case-sensitive-p) - "Show all bound symbols whose names match STRING. With prefix -arg, you're interactively asked for parameters of the search." - (interactive - (if current-prefix-arg - (list (read-string "SLIME Apropos: ") - (y-or-n-p "External symbols only? ") - (let ((pkg (slime-read-package-name "Package: "))) - (if (string= pkg "") nil pkg)) - (y-or-n-p "Case-sensitive? ")) - (list (read-string "SLIME Apropos: ") t nil nil))) - (let ((buffer-package (or package (slime-current-package)))) - (slime-eval-async - `(swank:apropos-list-for-emacs ,string ,only-external-p - ,case-sensitive-p ',package) - (slime-rcurry #'slime-show-apropos string buffer-package - (slime-apropos-summary string case-sensitive-p - package only-external-p))))) - -(defun slime-apropos-all () - "Shortcut for (slime-apropos nil nil)" - (interactive) - (slime-apropos (read-string "SLIME Apropos: ") nil nil)) - -(defun slime-apropos-package (package &optional internal) - "Show apropos listing for symbols in PACKAGE. -With prefix argument include internal symbols." - (interactive (list (let ((pkg (slime-read-package-name "Package: "))) - (if (string= pkg "") (slime-current-package) pkg)) - current-prefix-arg)) - (slime-apropos "" (not internal) package)) - -(autoload 'apropos-mode "apropos") -(defun slime-show-apropos (plists string package summary) - (if (null plists) - (message "No apropos matches for %S" string) - (slime-with-popup-buffer ((slime-buffer-name :apropos) - :package package :connection t - :mode 'apropos-mode) - (if (boundp 'header-line-format) - (setq header-line-format summary) - (insert summary "\n\n")) - (slime-set-truncate-lines) - (slime-print-apropos plists) - (set-syntax-table lisp-mode-syntax-table) - (goto-char (point-min))))) - -(defvar slime-apropos-namespaces - '((:variable "Variable") - (:function "Function") - (:generic-function "Generic Function") - (:macro "Macro") - (:special-operator "Special Operator") - (:setf "Setf") - (:type "Type") - (:class "Class") - (:alien-type "Alien type") - (:alien-struct "Alien struct") - (:alien-union "Alien type") - (:alien-enum "Alien enum"))) - -(defun slime-print-apropos (plists) - (dolist (plist plists) - (let ((designator (plist-get plist :designator))) - (cl-assert designator) - (slime-insert-propertized `(face slime-apropos-symbol) designator)) - (terpri) - (cl-loop for (prop value) on plist by #'cddr - unless (eq prop :designator) do - (let ((namespace (cadr (or (assq prop slime-apropos-namespaces) - (error "Unknown property: %S" prop)))) - (start (point))) - (princ " ") - (slime-insert-propertized `(face slime-apropos-label) namespace) - (princ ": ") - (princ (cl-etypecase value - (string value) - ((member nil :not-documented) "(not documented)"))) - (add-text-properties - start (point) - (list 'type prop 'action 'slime-call-describer - 'button t 'apropos-label namespace - 'item (plist-get plist :designator))) - (terpri))))) - -(defun slime-call-describer (arg) - (let* ((pos (if (markerp arg) arg (point))) - (type (get-text-property pos 'type)) - (item (get-text-property pos 'item))) - (slime-eval-describe `(swank:describe-definition-for-emacs ,item ,type)))) - -(defun slime-info () - "Open Slime manual" - (interactive) - (let ((file (expand-file-name "doc/slime.info" slime-path))) - (if (file-exists-p file) - (info file) - (message "No slime.info, run `make slime.info' in %s" - (expand-file-name "doc/" slime-path))))) - - -;;;; XREF: cross-referencing - -(defvar slime-xref-mode-map) - -(define-derived-mode slime-xref-mode lisp-mode "Xref" - "slime-xref-mode: Major mode for cross-referencing. -\\\ -The most important commands: -\\[slime-xref-quit] - Dismiss buffer. -\\[slime-show-xref] - Display referenced source and keep xref window. -\\[slime-goto-xref] - Jump to referenced source and dismiss xref window. - -\\{slime-xref-mode-map} -\\{slime-popup-buffer-mode-map} -" - (slime-popup-buffer-mode) - (setq font-lock-defaults nil) - (setq delayed-mode-hooks nil) - (slime-mode -1)) - -(slime-define-keys slime-xref-mode-map - ((kbd "RET") 'slime-goto-xref) - ((kbd "SPC") 'slime-goto-xref) - ("v" 'slime-show-xref) - ("n" 'slime-xref-next-line) - ("p" 'slime-xref-prev-line) - ("." 'slime-xref-next-line) - ("," 'slime-xref-prev-line) - ("\C-c\C-c" 'slime-recompile-xref) - ("\C-c\C-k" 'slime-recompile-all-xrefs) - ("\M-," 'slime-xref-retract) - ([remap next-line] 'slime-xref-next-line) - ([remap previous-line] 'slime-xref-prev-line) - ) - - -;;;;; XREF results buffer and window management - -(cl-defmacro slime-with-xref-buffer ((_xref-type _symbol &optional package) - &body body) - "Execute BODY in a xref buffer, then show that buffer." - (declare (indent 1)) - `(slime-with-popup-buffer ((slime-buffer-name :xref) - :package ,package - :connection t - :select t - :mode 'slime-xref-mode) - (slime-set-truncate-lines) - ,@body)) - -(defun slime-insert-xrefs (xref-alist) - "Insert XREF-ALIST in the current-buffer. -XREF-ALIST is of the form ((GROUP . ((LABEL LOCATION) ...)) ...). -GROUP and LABEL are for decoration purposes. LOCATION is a -source-location." - (cl-loop for (group . refs) in xref-alist do - (slime-insert-propertized '(face bold) group "\n") - (cl-loop for (label location) in refs do - (slime-insert-propertized - (list 'slime-location location - 'face 'font-lock-keyword-face) - " " (slime-one-line-ify label) "\n"))) - ;; Remove the final newline to prevent accidental window-scrolling - (backward-delete-char 1)) - -(defun slime-xref-next-line () - (interactive) - (slime-xref-show-location (slime-search-property 'slime-location))) - -(defun slime-xref-prev-line () - (interactive) - (slime-xref-show-location (slime-search-property 'slime-location t))) - -(defun slime-xref-show-location (loc) - (cl-ecase (car loc) - (:location (slime-show-source-location loc nil 1)) - (:error (message "%s" (cadr loc))) - ((nil)))) - -(defvar slime-next-location-function nil - "Function to call for going to the next location.") - -(defvar slime-previous-location-function nil - "Function to call for going to the previous location.") - -(defvar slime-xref-last-buffer nil - "The most recent XREF results buffer. -This is used by `slime-goto-next-xref'") - -(defun slime-show-xref-buffer (xrefs _type _symbol package) - (slime-with-xref-buffer (_type _symbol package) - (slime-insert-xrefs xrefs) - (setq slime-next-location-function 'slime-goto-next-xref) - (setq slime-previous-location-function 'slime-goto-previous-xref) - (setq slime-xref-last-buffer (current-buffer)) - (goto-char (point-min)))) - -(defun slime-show-xrefs (xrefs type symbol package) - "Show the results of an XREF query." - (if (null xrefs) - (message "No references found for %s." symbol) - (slime-show-xref-buffer xrefs type symbol package))) - - -;;;;; XREF commands - -(defun slime-who-calls (symbol) - "Show all known callers of the function SYMBOL." - (interactive (list (slime-read-symbol-name "Who calls: " t))) - (slime-xref :calls symbol)) - -(defun slime-calls-who (symbol) - "Show all known functions called by the function SYMBOL." - (interactive (list (slime-read-symbol-name "Who calls: " t))) - (slime-xref :calls-who symbol)) - -(defun slime-who-references (symbol) - "Show all known referrers of the global variable SYMBOL." - (interactive (list (slime-read-symbol-name "Who references: " t))) - (slime-xref :references symbol)) - -(defun slime-who-binds (symbol) - "Show all known binders of the global variable SYMBOL." - (interactive (list (slime-read-symbol-name "Who binds: " t))) - (slime-xref :binds symbol)) - -(defun slime-who-sets (symbol) - "Show all known setters of the global variable SYMBOL." - (interactive (list (slime-read-symbol-name "Who sets: " t))) - (slime-xref :sets symbol)) - -(defun slime-who-macroexpands (symbol) - "Show all known expanders of the macro SYMBOL." - (interactive (list (slime-read-symbol-name "Who macroexpands: " t))) - (slime-xref :macroexpands symbol)) - -(defun slime-who-specializes (symbol) - "Show all known methods specialized on class SYMBOL." - (interactive (list (slime-read-symbol-name "Who specializes: " t))) - (slime-xref :specializes symbol)) - -(defun slime-list-callers (symbol-name) - "List the callers of SYMBOL-NAME in a xref window." - (interactive (list (slime-read-symbol-name "List callers: "))) - (slime-xref :callers symbol-name)) - -(defun slime-list-callees (symbol-name) - "List the callees of SYMBOL-NAME in a xref window." - (interactive (list (slime-read-symbol-name "List callees: "))) - (slime-xref :callees symbol-name)) - -;; FIXME: whats the call (slime-postprocess-xrefs result) good for? -(defun slime-xref (type symbol &optional continuation) - "Make an XREF request to Lisp." - (slime-eval-async - `(swank:xref ',type ',symbol) - (slime-rcurry (lambda (result type symbol package cont) - (slime-check-xref-implemented type result) - (let* ((_xrefs (slime-postprocess-xrefs result)) - (file-alist (cadr (slime-analyze-xrefs result)))) - (funcall (or cont 'slime-show-xrefs) - file-alist type symbol package))) - type - symbol - (slime-current-package) - continuation))) - -(defun slime-check-xref-implemented (type xrefs) - (when (eq xrefs :not-implemented) - (error "%s is not implemented yet on %s." - (slime-xref-type type) - (slime-lisp-implementation-name)))) - -(defun slime-xref-type (type) - (format "who-%s" (slime-cl-symbol-name type))) - -(defun slime-xrefs (types symbol &optional continuation) - "Make multiple XREF requests at once." - (slime-eval-async - `(swank:xrefs ',types ',symbol) - #'(lambda (result) - (funcall (or continuation - #'slime-show-xrefs) - (cl-loop for (key . val) in result - collect (cons (slime-xref-type key) val)) - types symbol (slime-current-package))))) - - -;;;;; XREF navigation - -(defun slime-xref-location-at-point () - (save-excursion - ;; When the end of the last line is at (point-max) we can't find - ;; the text property there. Going to bol avoids this problem. - (beginning-of-line 1) - (or (get-text-property (point) 'slime-location) - (error "No reference at point.")))) - -(defun slime-xref-dspec-at-point () - (save-excursion - (beginning-of-line 1) - (with-syntax-table lisp-mode-syntax-table - (forward-sexp) ; skip initial whitespaces - (backward-sexp) - (slime-sexp-at-point)))) - -(defun slime-all-xrefs () - (let ((xrefs nil)) - (save-excursion - (goto-char (point-min)) - (while (zerop (forward-line 1)) - (let ((loc (get-text-property (point) 'slime-location))) - (when loc - (let* ((dspec (slime-xref-dspec-at-point)) - (xref (make-slime-xref :dspec dspec :location loc))) - (push xref xrefs)))))) - (nreverse xrefs))) - -(defun slime-goto-xref () - "Goto the cross-referenced location at point." - (interactive) - (slime-show-xref) - (quit-window)) - -(defun slime-show-xref () - "Display the xref at point in the other window." - (interactive) - (let ((location (slime-xref-location-at-point))) - (slime-show-source-location location t 1))) - -(defun slime-goto-next-xref (&optional backward) - "Goto the next cross-reference location." - (if (not (buffer-live-p slime-xref-last-buffer)) - (error "No XREF buffer alive.") - (cl-destructuring-bind (location pos) - (with-current-buffer slime-xref-last-buffer - (list (slime-search-property 'slime-location backward) - (point))) - (cond ((slime-location-p location) - (slime-pop-to-location location) - ;; We do this here because changing the location can take - ;; a while when Emacs needs to read a file from disk. - (with-current-buffer slime-xref-last-buffer - (goto-char pos) - (slime-highlight-line 0.35))) - ((null location) - (message (if backward "No previous xref" "No next xref."))) - (t ; error location - (slime-goto-next-xref backward)))))) - -(defun slime-goto-previous-xref () - "Goto the previous cross-reference location." - (slime-goto-next-xref t)) - -(defun slime-search-property (prop &optional backward prop-value-fn) - "Search the next text range where PROP is non-nil. -Return the value of PROP. -If BACKWARD is non-nil, search backward. -If PROP-VALUE-FN is non-nil use it to extract PROP's value." - (let ((next-candidate (if backward - #'previous-single-char-property-change - #'next-single-char-property-change)) - (prop-value-fn (or prop-value-fn - (lambda () - (get-text-property (point) prop)))) - (start (point)) - (prop-value)) - (while (progn - (goto-char (funcall next-candidate (point) prop)) - (not (or (setq prop-value (funcall prop-value-fn)) - (eobp) - (bobp))))) - (cond (prop-value) - (t (goto-char start) nil)))) - -(defun slime-next-location () - "Go to the next location, depending on context. -When displaying XREF information, this goes to the next reference." - (interactive) - (when (null slime-next-location-function) - (error "No context for finding locations.")) - (funcall slime-next-location-function)) - -(defun slime-previous-location () - "Go to the previous location, depending on context. -When displaying XREF information, this goes to the previous reference." - (interactive) - (when (null slime-previous-location-function) - (error "No context for finding locations.")) - (funcall slime-previous-location-function)) - -(defun slime-recompile-xref (&optional raw-prefix-arg) - (interactive "P") - (let ((slime-compilation-policy (slime-compute-policy raw-prefix-arg))) - (let ((location (slime-xref-location-at-point)) - (dspec (slime-xref-dspec-at-point))) - (slime-recompile-locations - (list location) - (slime-rcurry #'slime-xref-recompilation-cont - (list dspec) (current-buffer)))))) - -(defun slime-recompile-all-xrefs (&optional raw-prefix-arg) - (interactive "P") - (let ((slime-compilation-policy (slime-compute-policy raw-prefix-arg))) - (let ((dspecs) (locations)) - (dolist (xref (slime-all-xrefs)) - (when (slime-xref-has-location-p xref) - (push (slime-xref.dspec xref) dspecs) - (push (slime-xref.location xref) locations))) - (slime-recompile-locations - locations - (slime-rcurry #'slime-xref-recompilation-cont - dspecs (current-buffer)))))) - -(defun slime-xref-recompilation-cont (results dspecs buffer) - ;; Extreme long-windedness to insert status of recompilation; - ;; sometimes Elisp resembles more of an Ewwlisp. - - ;; FIXME: Should probably throw out the whole recompilation cruft - ;; anyway. -- helmut - ;; TODO: next iteration of fixme cleanup this is going in a contrib -- jt - (with-current-buffer buffer - (slime-compilation-finished (slime-aggregate-compilation-results results)) - (save-excursion - (slime-xref-insert-recompilation-flags - dspecs (cl-loop for r in results collect - (or (slime-compilation-result.successp r) - (and (slime-compilation-result.notes r) - :complained))))))) - -(defun slime-aggregate-compilation-results (results) - `(:compilation-result - ,(cl-reduce #'append (mapcar #'slime-compilation-result.notes results)) - ,(cl-every #'slime-compilation-result.successp results) - ,(cl-reduce #'+ (mapcar #'slime-compilation-result.duration results)))) - -(defun slime-xref-insert-recompilation-flags (dspecs compilation-results) - (let* ((buffer-read-only nil) - (max-column (slime-column-max))) - (goto-char (point-min)) - (cl-loop for dspec in dspecs - for result in compilation-results - do (save-excursion - (cl-loop for dspec2 = (progn (search-forward dspec) - (slime-xref-dspec-at-point)) - until (equal dspec2 dspec)) - (end-of-line) ; skip old status information. - (insert-char ?\ (1+ (- max-column (current-column)))) - (insert (format "[%s]" - (cl-case result - ((t) :success) - ((nil) :failure) - (t result)))))))) - - -;;;; Macroexpansion - -(define-minor-mode slime-macroexpansion-minor-mode - "SLIME mode for macroexpansion" - nil - " Macroexpand" - '(("g" . slime-macroexpand-again))) - -(cl-macrolet ((remap (from to) - `(dolist (mapping - (where-is-internal ,from slime-mode-map)) - (define-key slime-macroexpansion-minor-mode-map - mapping ,to)))) - (remap 'slime-macroexpand-1 'slime-macroexpand-1-inplace) - (remap 'slime-macroexpand-all 'slime-macroexpand-all-inplace) - (remap 'slime-compiler-macroexpand-1 'slime-compiler-macroexpand-1-inplace) - (remap 'slime-expand-1 - 'slime-expand-1-inplace) - (remap 'advertised-undo 'slime-macroexpand-undo) - (remap 'undo 'slime-macroexpand-undo)) - -(defun slime-macroexpand-undo (&optional arg) - (interactive) - ;; Emacs 22.x introduced `undo-only' which - ;; works by binding `undo-no-redo' to t. We do - ;; it this way so we don't break prior Emacs - ;; versions. - (cl-macrolet ((undo-only (arg) `(let ((undo-no-redo t)) (undo ,arg)))) - (let ((inhibit-read-only t)) - (when (fboundp 'slime-remove-edits) - (slime-remove-edits (point-min) (point-max))) - (undo-only arg)))) - -(defvar slime-eval-macroexpand-expression nil - "Specifies the last macroexpansion preformed. -This variable specifies both what was expanded and how.") - -(defun slime-eval-macroexpand (expander &optional string) - (let ((string (or string (slime-sexp-at-point-or-error)))) - (setq slime-eval-macroexpand-expression `(,expander ,string)) - (slime-eval-async slime-eval-macroexpand-expression - #'slime-initialize-macroexpansion-buffer))) - -(defun slime-macroexpand-again () - "Reperform the last macroexpansion." - (interactive) - (slime-eval-async slime-eval-macroexpand-expression - (slime-rcurry #'slime-initialize-macroexpansion-buffer - (current-buffer)))) - -(defun slime-initialize-macroexpansion-buffer (expansion &optional buffer) - (pop-to-buffer (or buffer (slime-create-macroexpansion-buffer))) - (setq buffer-undo-list nil) ; Get rid of undo information from - ; previous expansions. - (let ((inhibit-read-only t) - (buffer-undo-list t)) ; Make the initial insertion not be undoable. - (erase-buffer) - (insert expansion) - (goto-char (point-min)) - (font-lock-fontify-buffer))) - -(defun slime-create-macroexpansion-buffer () - (let ((name (slime-buffer-name :macroexpansion))) - (slime-with-popup-buffer (name :package t :connection t - :mode 'lisp-mode) - (slime-mode 1) - (slime-macroexpansion-minor-mode 1) - (setq font-lock-keywords-case-fold-search t) - (current-buffer)))) - -(defun slime-eval-macroexpand-inplace (expander) - "Substitute the sexp at point with its macroexpansion. - -NB: Does not affect slime-eval-macroexpand-expression" - (interactive) - (let* ((bounds (or (slime-bounds-of-sexp-at-point) - (user-error "No sexp at point")))) - (lexical-let* ((start (copy-marker (car bounds))) - (end (copy-marker (cdr bounds))) - (point (point)) - (package (slime-current-package)) - (buffer (current-buffer))) - (slime-eval-async - `(,expander ,(buffer-substring-no-properties start end)) - (lambda (expansion) - (with-current-buffer buffer - (let ((buffer-read-only nil)) - (when (fboundp 'slime-remove-edits) - (slime-remove-edits (point-min) (point-max))) - (goto-char start) - (delete-region start end) - (slime-insert-indented expansion) - (goto-char point)))))))) - -(defun slime-macroexpand-1 (&optional repeatedly) - "Display the macro expansion of the form starting at point. -The form is expanded with CL:MACROEXPAND-1 or, if a prefix -argument is given, with CL:MACROEXPAND." - (interactive "P") - (slime-eval-macroexpand - (if repeatedly 'swank:swank-macroexpand 'swank:swank-macroexpand-1))) - -(defun slime-macroexpand-1-inplace (&optional repeatedly) - (interactive "P") - (slime-eval-macroexpand-inplace - (if repeatedly 'swank:swank-macroexpand 'swank:swank-macroexpand-1))) - -(defun slime-macroexpand-all () - "Display the recursively macro expanded sexp starting at -point." - (interactive) - (slime-eval-macroexpand 'swank:swank-macroexpand-all)) - -(defun slime-macroexpand-all-inplace () - "Display the recursively macro expanded sexp starting at point." - (interactive) - (slime-eval-macroexpand-inplace 'swank:swank-macroexpand-all)) - -(defun slime-compiler-macroexpand-1 (&optional repeatedly) - "Display the compiler-macro expansion of sexp starting at point." - (interactive "P") - (slime-eval-macroexpand - (if repeatedly - 'swank:swank-compiler-macroexpand - 'swank:swank-compiler-macroexpand-1))) - -(defun slime-compiler-macroexpand-1-inplace (&optional repeatedly) - "Display the compiler-macro expansion of sexp starting at point." - (interactive "P") - (slime-eval-macroexpand-inplace - (if repeatedly - 'swank:swank-compiler-macroexpand - 'swank:swank-compiler-macroexpand-1))) - -(defun slime-expand-1 (&optional repeatedly) - "Display the macro expansion of the form starting at point. -The form is expanded with CL:MACROEXPAND-1 or, if a prefix -argument is given, with CL:MACROEXPAND. If the form denotes a -compiler macro, SWANK/BACKEND:COMPILER-MACROEXPAND or -SWANK/BACKEND:COMPILER-MACROEXPAND-1 are used instead." - (interactive "P") - (slime-eval-macroexpand - (if repeatedly - 'swank:swank-expand - 'swank:swank-expand-1))) - -(defun slime-expand-1-inplace (&optional repeatedly) - "Display the macro expansion of the form at point. -The form is expanded with CL:MACROEXPAND-1 or, if a prefix -argument is given, with CL:MACROEXPAND." - (interactive "P") - (slime-eval-macroexpand-inplace - (if repeatedly - 'swank:swank-expand - 'swank:swank-expand-1))) - -(defun slime-format-string-expand (&optional string) - "Expand the format-string at point and display it." - (interactive (list (or (and (not current-prefix-arg) - (slime-string-at-point)) - (slime-read-from-minibuffer "Expand format: " - (slime-string-at-point))))) - (slime-eval-macroexpand 'swank:swank-format-string-expand string)) - - -;;;; Subprocess control - -(defun slime-interrupt () - "Interrupt Lisp." - (interactive) - (cond ((slime-use-sigint-for-interrupt) (slime-send-sigint)) - (t (slime-dispatch-event `(:emacs-interrupt ,slime-current-thread))))) - -(defun slime-quit () - (error "Not implemented properly. Use `slime-interrupt' instead.")) - -(defun slime-quit-lisp (&optional kill) - "Quit lisp, kill the inferior process and associated buffers." - (interactive "P") - (slime-quit-lisp-internal (slime-connection) 'slime-quit-sentinel kill)) - -(defun slime-quit-lisp-internal (connection sentinel kill) - (let ((slime-dispatching-connection connection)) - (slime-eval-async '(swank:quit-lisp)) - (let* ((process (slime-inferior-process connection))) - (set-process-filter connection nil) - (set-process-sentinel connection sentinel) - (when (and kill process) - (sleep-for 0.2) - (unless (memq (process-status process) '(exit signal)) - (kill-process process)))))) - -(defun slime-quit-sentinel (process _message) - (cl-assert (process-status process) 'closed) - (let* ((inferior (slime-inferior-process process)) - (inferior-buffer (if inferior (process-buffer inferior)))) - (when inferior (delete-process inferior)) - (when inferior-buffer (kill-buffer inferior-buffer)) - (slime-net-close process) - (message "Connection closed."))) - - -;;;; Debugger (SLDB) - -(defvar sldb-hook nil - "Hook run on entry to the debugger.") - -(defcustom sldb-initial-restart-limit 6 - "Maximum number of restarts to display initially." - :group 'slime-debugger - :type 'integer) - - -;;;;; Local variables in the debugger buffer - -;; Small helper. -(defun slime-make-variables-buffer-local (&rest variables) - (mapcar #'make-variable-buffer-local variables)) - -(slime-make-variables-buffer-local - (defvar sldb-condition nil - "A list (DESCRIPTION TYPE) describing the condition being debugged.") - - (defvar sldb-restarts nil - "List of (NAME DESCRIPTION) for each available restart.") - - (defvar sldb-level nil - "Current debug level (recursion depth) displayed in buffer.") - - (defvar sldb-backtrace-start-marker nil - "Marker placed at the first frame of the backtrace.") - - (defvar sldb-restart-list-start-marker nil - "Marker placed at the first restart in the restart list.") - - (defvar sldb-continuations nil - "List of ids for pending continuation.")) - -;;;;; SLDB macros - -;; some macros that we need to define before the first use - -(defmacro sldb-in-face (name string) - "Return STRING propertised with face sldb-NAME-face." - (declare (indent 1)) - (let ((facename (intern (format "sldb-%s-face" (symbol-name name)))) - (var (cl-gensym "string"))) - `(let ((,var ,string)) - (slime-add-face ',facename ,var) - ,var))) - - -;;;;; sldb-mode - -(defvar sldb-mode-syntax-table - (let ((table (copy-syntax-table lisp-mode-syntax-table))) - ;; We give < and > parenthesis syntax, so that #< ... > is treated - ;; as a balanced expression. This enables autodoc-mode to match - ;; # actual arguments in the backtraces with formal - ;; arguments of the function. (For Lisp mode, this is not - ;; desirable, since we do not wish to get a mismatched paren - ;; highlighted everytime we type < or >.) - (modify-syntax-entry ?< "(" table) - (modify-syntax-entry ?> ")" table) - table) - "Syntax table for SLDB mode.") - -(define-derived-mode sldb-mode fundamental-mode "sldb" - "Superior lisp debugger mode. -In addition to ordinary SLIME commands, the following are -available:\\ - -Commands to examine the selected frame: - \\[sldb-toggle-details] - toggle details (local bindings, CATCH tags) - \\[sldb-show-source] - view source for the frame - \\[sldb-eval-in-frame] - eval in frame - \\[sldb-pprint-eval-in-frame] - eval in frame, pretty-print result - \\[sldb-disassemble] - disassemble - \\[sldb-inspect-in-frame] - inspect - -Commands to invoke restarts: - \\[sldb-quit] - quit - \\[sldb-abort] - abort - \\[sldb-continue] - continue - \\[sldb-invoke-restart-0]-\\[sldb-invoke-restart-9] - restart shortcuts - \\[sldb-invoke-restart-by-name] - invoke restart by name - -Commands to navigate frames: - \\[sldb-down] - down - \\[sldb-up] - up - \\[sldb-details-down] - down, with details - \\[sldb-details-up] - up, with details - \\[sldb-cycle] - cycle between restarts & backtrace - \\[sldb-beginning-of-backtrace] - beginning of backtrace - \\[sldb-end-of-backtrace] - end of backtrace - -Miscellaneous commands: - \\[sldb-restart-frame] - restart frame - \\[sldb-return-from-frame] - return from frame - \\[sldb-step] - step - \\[sldb-break-with-default-debugger] - switch to native debugger - \\[sldb-break-with-system-debugger] - switch to system debugger (gdb) - \\[slime-interactive-eval] - eval - \\[sldb-inspect-condition] - inspect signalled condition - -Full list of commands: - -\\{sldb-mode-map}" - (erase-buffer) - (set-syntax-table sldb-mode-syntax-table) - (slime-set-truncate-lines) - ;; Make original slime-connection "sticky" for SLDB commands in this buffer - (setq slime-buffer-connection (slime-connection))) - -(set-keymap-parent sldb-mode-map slime-parent-map) - -(slime-define-keys sldb-mode-map - - ((kbd "RET") 'sldb-default-action) - ("\C-m" 'sldb-default-action) - ([return] 'sldb-default-action) - ([mouse-2] 'sldb-default-action/mouse) - ([follow-link] 'mouse-face) - ("\C-i" 'sldb-cycle) - ("h" 'describe-mode) - ("v" 'sldb-show-source) - ("e" 'sldb-eval-in-frame) - ("d" 'sldb-pprint-eval-in-frame) - ("D" 'sldb-disassemble) - ("i" 'sldb-inspect-in-frame) - ("n" 'sldb-down) - ("p" 'sldb-up) - ("\M-n" 'sldb-details-down) - ("\M-p" 'sldb-details-up) - ("<" 'sldb-beginning-of-backtrace) - (">" 'sldb-end-of-backtrace) - ("t" 'sldb-toggle-details) - ("r" 'sldb-restart-frame) - ("I" 'sldb-invoke-restart-by-name) - ("R" 'sldb-return-from-frame) - ("c" 'sldb-continue) - ("s" 'sldb-step) - ("x" 'sldb-next) - ("o" 'sldb-out) - ("b" 'sldb-break-on-return) - ("a" 'sldb-abort) - ("q" 'sldb-quit) - ("A" 'sldb-break-with-system-debugger) - ("B" 'sldb-break-with-default-debugger) - ("P" 'sldb-print-condition) - ("C" 'sldb-inspect-condition) - (":" 'slime-interactive-eval) - ("\C-c\C-c" 'sldb-recompile-frame-source)) - -;; Keys 0-9 are shortcuts to invoke particular restarts. -(dotimes (number 10) - (let ((fname (intern (format "sldb-invoke-restart-%S" number))) - (docstring (format "Invoke restart numbered %S." number))) - (eval `(defun ,fname () - ,docstring - (interactive) - (sldb-invoke-restart ,number))) - (define-key sldb-mode-map (number-to-string number) fname))) - - -;;;;; SLDB buffer creation & update - -(defun sldb-buffers (&optional connection) - "Return a list of all sldb buffers (belonging to CONNECTION.)" - (if connection - (slime-filter-buffers (lambda () - (and (eq slime-buffer-connection connection) - (eq major-mode 'sldb-mode)))) - (slime-filter-buffers (lambda () (eq major-mode 'sldb-mode))))) - -(defun sldb-find-buffer (thread &optional connection) - (let ((connection (or connection (slime-connection)))) - (cl-find-if (lambda (buffer) - (with-current-buffer buffer - (and (eq slime-buffer-connection connection) - (eq slime-current-thread thread)))) - (sldb-buffers)))) - -(defun sldb-get-default-buffer () - "Get a sldb buffer. -The chosen buffer the default connection's it if exists." - (car (sldb-buffers slime-default-connection))) - -(defun sldb-get-buffer (thread &optional connection) - "Find or create a sldb-buffer for THREAD." - (let ((connection (or connection (slime-connection)))) - (or (sldb-find-buffer thread connection) - (let ((name (format "*sldb %s/%s*" (slime-connection-name) thread))) - (with-current-buffer (generate-new-buffer name) - (setq slime-buffer-connection connection - slime-current-thread thread) - (current-buffer)))))) - -(defun sldb-debugged-continuations (connection) - "Return the all debugged continuations for CONNECTION across SLDB buffers." - (cl-loop for b in (sldb-buffers) - append (with-current-buffer b - (and (eq slime-buffer-connection connection) - sldb-continuations)))) - -(defun sldb--display-buffer-reuse-last-window (buffer _alist) - (let ((window - (get-window-with-predicate (lambda (w) - (window-parameter w 'sldb-last-window))))) - (when (and window - (not (with-current-buffer (window-buffer window) - (derived-mode-p 'sldb-mode)))) - (display-buffer-record-window 'reuse window buffer) - (set-window-buffer window buffer) - window))) - -(defun sldb-display-buffer (buffer) - "Pop to BUFFER reusing the last SLDB window, if any." - (pop-to-buffer buffer '(sldb--display-buffer-reuse-last-window))) - -(defun sldb-setup (thread level condition restarts frames conts) - "Setup a new SLDB buffer. -CONDITION is a string describing the condition to debug. -RESTARTS is a list of strings (NAME DESCRIPTION) for each available restart. -FRAMES is a list (NUMBER DESCRIPTION &optional PLIST) describing the initial -portion of the backtrace. Frames are numbered from 0. -CONTS is a list of pending Emacs continuations." - (with-current-buffer (sldb-get-buffer thread) - (cl-assert (if (equal sldb-level level) - (equal sldb-condition condition) - t) - () "Bug: sldb-level is equal but condition differs\n%s\n%s" - sldb-condition condition) - (unless (equal sldb-level level) - (setq buffer-read-only nil) - (sldb-mode) - (setq slime-current-thread thread) - (setq sldb-level level) - (setq mode-name (format "sldb[%d]" sldb-level)) - (setq sldb-condition condition) - (setq sldb-restarts restarts) - (setq sldb-continuations conts) - (sldb-insert-condition condition) - (insert "\n\n" (sldb-in-face section "Restarts:") "\n") - (setq sldb-restart-list-start-marker (point-marker)) - (sldb-insert-restarts restarts 0 sldb-initial-restart-limit) - (insert "\n" (sldb-in-face section "Backtrace:") "\n") - (setq sldb-backtrace-start-marker (point-marker)) - (save-excursion - (if frames - (sldb-insert-frames (sldb-prune-initial-frames frames) t) - (insert "[No backtrace]"))) - (run-hooks 'sldb-hook) - (set-syntax-table lisp-mode-syntax-table)) - ;; FIXME: remove when dropping Emacs23 support - (let ((saved (selected-window))) - (sldb-display-buffer (current-buffer)) - (set-window-parameter (selected-window) 'sldb-restore saved)) - (unless noninteractive ; needed for tests in batch-mode - (slime--display-region (point-min) (point))) - (setq buffer-read-only t) - (when (and slime-stack-eval-tags - ;; (y-or-n-p "Enter recursive edit? ") - ) - (message "Entering recursive edit..") - (recursive-edit)))) - -(defun sldb-activate (thread level select) - "Display the debugger buffer for THREAD. -If LEVEL isn't the same as in the buffer reinitialize the buffer." - (or (let ((buffer (sldb-find-buffer thread))) - (when buffer - (with-current-buffer buffer - (when (equal sldb-level level) - (when select (pop-to-buffer (current-buffer))) - t)))) - (sldb-reinitialize thread level))) - -(defun sldb-reinitialize (thread level) - (slime-rex (thread level) - ('(swank:debugger-info-for-emacs 0 10) - nil thread) - ((:ok result) - (apply #'sldb-setup thread level result)))) - -(defun sldb--mark-last-window (window) - (dolist (window (window-list)) - (when (window-parameter window 'sldb-last-window) - (set-window-parameter window 'sldb-last-window nil))) - (set-window-parameter (selected-window) 'sldb-last-window t)) - -(defun sldb-exit (thread _level &optional stepping) - "Exit from the debug level LEVEL." - (let ((sldb (sldb-find-buffer thread))) - (when sldb - (with-current-buffer sldb - (cond (stepping - (setq sldb-level nil) - (run-with-timer 0.4 nil 'sldb-close-step-buffer sldb)) - ((not (eq sldb (window-buffer (selected-window)))) - ;; A different window selection means an indirect, - ;; non-interactive exit, we just kill the sldb buffer. - (kill-buffer)) - (t - (sldb--mark-last-window (selected-window)) - ;; An interactive exit should restore configuration per - ;; `quit-window's protocol. FIXME: remove - ;; `previous-window' hack when dropping Emacs23 support - (let ((previous-window (window-parameter (selected-window) - 'sldb-restore))) - (quit-window t) - (if (and (not (>= emacs-major-version 24)) - (window-live-p previous-window)) - (select-window previous-window))))))))) - -(defun sldb-close-step-buffer (buffer) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (when (not sldb-level) - (quit-window t))))) - - -;;;;;; SLDB buffer insertion - -(defun sldb-insert-condition (condition) - "Insert the text for CONDITION. -CONDITION should be a list (MESSAGE TYPE EXTRAS). -EXTRAS is currently used for the stepper." - (cl-destructuring-bind (message type extras) condition - (slime-insert-propertized '(sldb-default-action sldb-inspect-condition) - (sldb-in-face topline message) - "\n" - (sldb-in-face condition type)) - (sldb-dispatch-extras extras))) - -(defvar sldb-extras-hooks) - -(defun sldb-dispatch-extras (extras) - ;; this is (mis-)used for the stepper - (dolist (extra extras) - (slime-dcase extra - ((:show-frame-source n) - (sldb-show-frame-source n)) - (t - (or (run-hook-with-args-until-success 'sldb-extras-hooks extra) - ;;(error "Unhandled extra element:" extra) - ))))) - -(defun sldb-insert-restarts (restarts start count) - "Insert RESTARTS and add the needed text props -RESTARTS should be a list ((NAME DESCRIPTION) ...)." - (let* ((len (length restarts)) - (end (if count (min (+ start count) len) len))) - (cl-loop for (name string) in (cl-subseq restarts start end) - for number from start - do (slime-insert-propertized - `(,@nil restart ,number - sldb-default-action sldb-invoke-restart - mouse-face highlight) - " " (sldb-in-face restart-number (number-to-string number)) - ": [" (sldb-in-face restart-type name) "] " - (sldb-in-face restart string)) - (insert "\n")) - (when (< end len) - (let ((pos (point))) - (slime-insert-propertized - (list 'sldb-default-action - (slime-rcurry #'sldb-insert-more-restarts restarts pos end)) - " --more--\n"))))) - -(defun sldb-insert-more-restarts (restarts position start) - (goto-char position) - (let ((inhibit-read-only t)) - (delete-region position (1+ (line-end-position))) - (sldb-insert-restarts restarts start nil))) - -(defun sldb-frame.string (frame) - (cl-destructuring-bind (_ str &optional _) frame str)) - -(defun sldb-frame.number (frame) - (cl-destructuring-bind (n _ &optional _) frame n)) - -(defun sldb-frame.plist (frame) - (cl-destructuring-bind (_ _ &optional plist) frame plist)) - -(defun sldb-frame-restartable-p (frame) - (and (plist-get (sldb-frame.plist frame) :restartable) t)) - -(defun sldb-prune-initial-frames (frames) - "Return the prefix of FRAMES to initially present to the user. -Regexp heuristics are used to avoid showing SWANK-internal frames." - (let* ((case-fold-search t) - (rx "^\\([() ]\\|lambda\\)*swank\\>")) - (or (cl-loop for frame in frames - until (string-match rx (sldb-frame.string frame)) - collect frame) - frames))) - -(defun sldb-insert-frames (frames more) - "Insert FRAMES into buffer. -If MORE is non-nil, more frames are on the Lisp stack." - (mapc #'sldb-insert-frame frames) - (when more - (slime-insert-propertized - `(,@nil sldb-default-action sldb-fetch-more-frames - sldb-previous-frame-number - ,(sldb-frame.number (cl-first (last frames))) - point-entered sldb-fetch-more-frames - start-open t - face sldb-section-face - mouse-face highlight) - " --more--") - (insert "\n"))) - -(defun sldb-compute-frame-face (frame) - (if (sldb-frame-restartable-p frame) - 'sldb-restartable-frame-line-face - 'sldb-frame-line-face)) - -(defun sldb-insert-frame (frame &optional face) - "Insert FRAME with FACE at point. -If FACE is nil, `sldb-compute-frame-face' is used to determine the face." - (setq face (or face (sldb-compute-frame-face frame))) - (let ((number (sldb-frame.number frame)) - (string (sldb-frame.string frame)) - (props `(frame ,frame sldb-default-action sldb-toggle-details))) - (slime-propertize-region props - (slime-propertize-region '(mouse-face highlight) - (insert " " (sldb-in-face frame-label (format "%2d:" number)) " ") - (slime-insert-indented - (slime-add-face face string))) - (insert "\n")))) - -(defun sldb-fetch-more-frames (&rest _) - "Fetch more backtrace frames. -Called on the `point-entered' text-property hook." - (let ((inhibit-point-motion-hooks t) - (inhibit-read-only t) - (prev (get-text-property (point) 'sldb-previous-frame-number))) - ;; we may be called twice, PREV is nil the second time - (when prev - (let* ((count 40) - (from (1+ prev)) - (to (+ from count)) - (frames (slime-eval `(swank:backtrace ,from ,to))) - (more (slime-length= frames count)) - (pos (point))) - (delete-region (line-beginning-position) (point-max)) - (sldb-insert-frames frames more) - (goto-char pos))))) - - -;;;;;; SLDB examining text props - -(defun sldb-restart-at-point () - (or (get-text-property (point) 'restart) - (error "No restart at point"))) - -(defun sldb-frame-number-at-point () - (let ((frame (get-text-property (point) 'frame))) - (cond (frame (car frame)) - (t (error "No frame at point"))))) - -(defun sldb-var-number-at-point () - (let ((var (get-text-property (point) 'var))) - (cond (var var) - (t (error "No variable at point"))))) - -(defun sldb-previous-frame-number () - (save-excursion - (sldb-backward-frame) - (sldb-frame-number-at-point))) - -(defun sldb-frame-details-visible-p () - (and (get-text-property (point) 'frame) - (get-text-property (point) 'details-visible-p))) - -(defun sldb-frame-region () - (slime-property-bounds 'frame)) - -(defun sldb-forward-frame () - (goto-char (next-single-char-property-change (point) 'frame))) - -(defun sldb-backward-frame () - (when (> (point) sldb-backtrace-start-marker) - (goto-char (previous-single-char-property-change - (if (get-text-property (point) 'frame) - (car (sldb-frame-region)) - (point)) - 'frame - nil sldb-backtrace-start-marker)))) - -(defun sldb-goto-last-frame () - (goto-char (point-max)) - (while (not (get-text-property (point) 'frame)) - (goto-char (previous-single-property-change (point) 'frame)) - ;; Recenter to bottom of the window; -2 to account for the - ;; empty last line displayed in sldb buffers. - (recenter -2))) - -(defun sldb-beginning-of-backtrace () - "Goto the first frame." - (interactive) - (goto-char sldb-backtrace-start-marker)) - - -;;;;;; SLDB recenter & redisplay -;; not sure yet, whether this is a good idea. -;; -;; jt: seconded. Only `sldb-show-frame-details' and -;; `sldb-hide-frame-details' use this. They could avoid it by not -;; removing and reinserting the frame's name line. -(defmacro slime-save-coordinates (origin &rest body) - "Restore line and column relative to ORIGIN, after executing BODY. - -This is useful if BODY deletes and inserts some text but we want to -preserve the current row and column as closely as possible." - (let ((base (make-symbol "base")) - (goal (make-symbol "goal")) - (mark (make-symbol "mark"))) - `(let* ((,base ,origin) - (,goal (slime-coordinates ,base)) - (,mark (point-marker))) - (set-marker-insertion-type ,mark t) - (prog1 (save-excursion ,@body) - (slime-restore-coordinate ,base ,goal ,mark))))) - -(put 'slime-save-coordinates 'lisp-indent-function 1) - -(defun slime-coordinates (origin) - ;; Return a pair (X . Y) for the column and line distance to ORIGIN. - (let ((y (slime-count-lines origin (point))) - (x (save-excursion - (- (current-column) - (progn (goto-char origin) (current-column)))))) - (cons x y))) - -(defun slime-restore-coordinate (base goal limit) - ;; Move point to GOAL. Coordinates are relative to BASE. - ;; Don't move beyond LIMIT. - (save-restriction - (narrow-to-region base limit) - (goto-char (point-min)) - (let ((col (current-column))) - (forward-line (cdr goal)) - (when (and (eobp) (bolp) (not (bobp))) - (backward-char)) - (move-to-column (+ col (car goal)))))) - -(defun slime-count-lines (start end) - "Return the number of lines between START and END. -This is 0 if START and END at the same line." - (- (count-lines start end) - (if (save-excursion (goto-char end) (bolp)) 0 1))) - - -;;;;; SLDB commands - -(defun sldb-default-action () - "Invoke the action at point." - (interactive) - (let ((fn (get-text-property (point) 'sldb-default-action))) - (if fn (funcall fn)))) - -(defun sldb-default-action/mouse (event) - "Invoke the action pointed at by the mouse." - (interactive "e") - (cl-destructuring-bind (_mouse-1 (_w pos &rest ignore)) event - (save-excursion - (goto-char pos) - (let ((fn (get-text-property (point) 'sldb-default-action))) - (if fn (funcall fn)))))) - -(defun sldb-cycle () - "Cycle between restart list and backtrace." - (interactive) - (let ((pt (point))) - (cond ((< pt sldb-restart-list-start-marker) - (goto-char sldb-restart-list-start-marker)) - ((< pt sldb-backtrace-start-marker) - (goto-char sldb-backtrace-start-marker)) - (t - (goto-char sldb-restart-list-start-marker))))) - -(defun sldb-end-of-backtrace () - "Fetch the entire backtrace and go to the last frame." - (interactive) - (sldb-fetch-all-frames) - (sldb-goto-last-frame)) - -(defun sldb-fetch-all-frames () - (let ((inhibit-read-only t) - (inhibit-point-motion-hooks t)) - (sldb-goto-last-frame) - (let ((last (sldb-frame-number-at-point))) - (goto-char (next-single-char-property-change (point) 'frame)) - (delete-region (point) (point-max)) - (save-excursion - (sldb-insert-frames (slime-eval `(swank:backtrace ,(1+ last) nil)) - nil))))) - - -;;;;;; SLDB show source - -(defun sldb-show-source () - "Highlight the frame at point's expression in a source code buffer." - (interactive) - (sldb-show-frame-source (sldb-frame-number-at-point))) - -(defun sldb-show-frame-source (frame-number) - (slime-eval-async - `(swank:frame-source-location ,frame-number) - (lambda (source-location) - (slime-dcase source-location - ((:error message) - (message "%s" message) - (ding)) - (t - (slime-show-source-location source-location t nil)))))) - -(defun slime-show-source-location (source-location - &optional highlight recenter-arg) - "Go to SOURCE-LOCATION and display the buffer in the other window." - (slime-goto-source-location source-location) - ;; show the location, but don't hijack focus. - (slime--display-position (point) t recenter-arg) - (when highlight (slime-highlight-sexp))) - -(defun slime--display-position (pos other-window recenter-arg) - (with-selected-window (display-buffer (current-buffer) other-window) - (goto-char pos) - (recenter recenter-arg))) - -;; Set window-start so that the region from START to END becomes visible. -;; START is inclusive; END is exclusive. -(defun slime--adjust-window-start (start end) - (let* ((last (max start (1- end))) - (window-height (window-text-height)) - (region-height (count-screen-lines start last t))) - ;; if needed, make the region visible - (when (or (not (pos-visible-in-window-p start)) - (not (pos-visible-in-window-p last))) - (let* ((nlines (cond ((or (< start (window-start)) - (>= region-height window-height)) - 0) - (t - (- region-height))))) - (goto-char start) - (recenter nlines))) - (cl-assert (pos-visible-in-window-p start)) - (cl-assert (or (pos-visible-in-window-p last) - (> region-height window-height))) - (cl-assert (pos-visible-in-window-p (1- (window-end nil t)) nil t)))) - -;; move POS to visible region -(defun slime--adjust-window-point (pos) - (cond ((pos-visible-in-window-p pos) - (goto-char pos)) - ((< pos (window-start)) - (goto-char (window-start))) - (t - (goto-char (1- (window-end nil t))) - (move-to-column 0))) - (cl-assert (pos-visible-in-window-p (point) nil t))) - -(defun slime--display-region (start end) - "Make the region from START to END visible. -Minimize point motion." - (cl-assert (<= start end)) - (cl-assert (eq (window-buffer (selected-window)) - (current-buffer))) - (let ((pos (point))) - (slime--adjust-window-start start end) - (slime--adjust-window-point pos))) - -(defun slime-highlight-sexp (&optional start end) - "Highlight the first sexp after point." - (let ((start (or start (point))) - (end (or end (save-excursion (ignore-errors (forward-sexp)) (point))))) - (slime-flash-region start end))) - -(defun slime-highlight-line (&optional timeout) - (slime-flash-region (+ (line-beginning-position) (current-indentation)) - (line-end-position) - timeout)) - - -;;;;;; SLDB toggle details - -(defun sldb-toggle-details (&optional on) - "Toggle display of details for the current frame. -The details include local variable bindings and CATCH-tags." - (interactive) - (cl-assert (sldb-frame-number-at-point)) - (let ((inhibit-read-only t) - (inhibit-point-motion-hooks t)) - (if (or on (not (sldb-frame-details-visible-p))) - (sldb-show-frame-details) - (sldb-hide-frame-details)))) - -(defun sldb-show-frame-details () - ;; fetch and display info about local variables and catch tags - (cl-destructuring-bind (start end frame locals catches) (sldb-frame-details) - (slime-save-coordinates start - (delete-region start end) - (slime-propertize-region `(frame ,frame details-visible-p t) - (sldb-insert-frame frame (if (sldb-frame-restartable-p frame) - 'sldb-restartable-frame-line-face - ;; FIXME: can we somehow merge the two? - 'sldb-detailed-frame-line-face)) - (let ((indent1 " ") - (indent2 " ")) - (insert indent1 (sldb-in-face section - (if locals "Locals:" "[No Locals]")) "\n") - (sldb-insert-locals locals indent2 frame) - (when catches - (insert indent1 (sldb-in-face section "Catch-tags:") "\n") - (dolist (tag catches) - (slime-propertize-region `(catch-tag ,tag) - (insert indent2 (sldb-in-face catch-tag (format "%s" tag)) - "\n")))) - (setq end (point))))) - (slime--display-region (point) end))) - -(defun sldb-frame-details () - ;; Return a list (START END FRAME LOCALS CATCHES) for frame at point. - (let* ((frame (get-text-property (point) 'frame)) - (num (car frame))) - (cl-destructuring-bind (start end) (sldb-frame-region) - (cl-list* start end frame - (slime-eval `(swank:frame-locals-and-catch-tags ,num)))))) - -(defvar sldb-insert-frame-variable-value-function - 'sldb-insert-frame-variable-value) - -(defun sldb-insert-locals (vars prefix frame) - "Insert VARS and add PREFIX at the beginning of each inserted line. -VAR should be a plist with the keys :name, :id, and :value." - (cl-loop for i from 0 - for var in vars do - (cl-destructuring-bind (&key name id value) var - (slime-propertize-region - (list 'sldb-default-action 'sldb-inspect-var 'var i) - (insert prefix - (sldb-in-face local-name - (concat name (if (zerop id) "" (format "#%d" id)))) - " = ") - (funcall sldb-insert-frame-variable-value-function - value frame i) - (insert "\n"))))) - -(defun sldb-insert-frame-variable-value (value _frame _index) - (insert (sldb-in-face local-value value))) - -(defun sldb-hide-frame-details () - ;; delete locals and catch tags, but keep the function name and args. - (cl-destructuring-bind (start end) (sldb-frame-region) - (let ((frame (get-text-property (point) 'frame))) - (slime-save-coordinates start - (delete-region start end) - (slime-propertize-region '(details-visible-p nil) - (sldb-insert-frame frame)))))) - -(defun sldb-disassemble () - "Disassemble the code for the current frame." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-disassemble ,frame) - (lambda (result) - (slime-show-description result nil))))) - - -;;;;;; SLDB eval and inspect - -(defun sldb-eval-in-frame (frame string package) - "Prompt for an expression and evaluate it in the selected frame." - (interactive (sldb-read-form-for-frame "Eval in frame (%s)> ")) - (slime-eval-async `(swank:eval-string-in-frame ,string ,frame ,package) - (if current-prefix-arg - 'slime-write-string - 'slime-display-eval-result))) - -(defun sldb-pprint-eval-in-frame (frame string package) - "Prompt for an expression, evaluate in selected frame, pretty-print result." - (interactive (sldb-read-form-for-frame "Eval in frame (%s)> ")) - (slime-eval-async - `(swank:pprint-eval-string-in-frame ,string ,frame ,package) - (lambda (result) - (slime-show-description result nil)))) - -(defun sldb-read-form-for-frame (fstring) - (let* ((frame (sldb-frame-number-at-point)) - (pkg (slime-eval `(swank:frame-package-name ,frame)))) - (list frame - (let ((slime-buffer-package pkg)) - (slime-read-from-minibuffer (format fstring pkg))) - pkg))) - -(defun sldb-inspect-in-frame (string) - "Prompt for an expression and inspect it in the selected frame." - (interactive (list (slime-read-from-minibuffer - "Inspect in frame (evaluated): " - (slime-sexp-at-point)))) - (let ((number (sldb-frame-number-at-point))) - (slime-eval-async `(swank:inspect-in-frame ,string ,number) - 'slime-open-inspector))) - -(defun sldb-inspect-var () - (let ((frame (sldb-frame-number-at-point)) - (var (sldb-var-number-at-point))) - (slime-eval-async `(swank:inspect-frame-var ,frame ,var) - 'slime-open-inspector))) - -(defun sldb-inspect-condition () - "Inspect the current debugger condition." - (interactive) - (slime-eval-async '(swank:inspect-current-condition) - 'slime-open-inspector)) - -(defun sldb-print-condition () - (interactive) - (slime-eval-describe `(swank:sdlb-print-condition))) - - -;;;;;; SLDB movement - -(defun sldb-down () - "Select next frame." - (interactive) - (sldb-forward-frame)) - -(defun sldb-up () - "Select previous frame." - (interactive) - (sldb-backward-frame) - (when (= (point) sldb-backtrace-start-marker) - (recenter (1+ (count-lines (point-min) (point)))))) - -(defun sldb-sugar-move (move-fn) - (let ((inhibit-read-only t)) - (when (sldb-frame-details-visible-p) (sldb-hide-frame-details)) - (funcall move-fn) - (sldb-show-source) - (sldb-toggle-details t))) - -(defun sldb-details-up () - "Select previous frame and show details." - (interactive) - (sldb-sugar-move 'sldb-up)) - -(defun sldb-details-down () - "Select next frame and show details." - (interactive) - (sldb-sugar-move 'sldb-down)) - - -;;;;;; SLDB restarts - -(defun sldb-quit () - "Quit to toplevel." - (interactive) - (cl-assert sldb-restarts () "sldb-quit called outside of sldb buffer") - (slime-rex () ('(swank:throw-to-toplevel)) - ((:ok x) (error "sldb-quit returned [%s]" x)) - ((:abort _)))) - -(defun sldb-continue () - "Invoke the \"continue\" restart." - (interactive) - (cl-assert sldb-restarts () "sldb-continue called outside of sldb buffer") - (slime-rex () - ('(swank:sldb-continue)) - ((:ok _) - (message "No restart named continue") - (ding)) - ((:abort _)))) - -(defun sldb-abort () - "Invoke the \"abort\" restart." - (interactive) - (slime-eval-async '(swank:sldb-abort) - (lambda (v) (message "Restart returned: %S" v)))) - -(defun sldb-invoke-restart (&optional number) - "Invoke a restart. -Optional NUMBER (index into `sldb-restarts') specifies the -restart to invoke, otherwise use the restart at point." - (interactive) - (let ((restart (or number (sldb-restart-at-point)))) - (slime-rex () - ((list 'swank:invoke-nth-restart-for-emacs sldb-level restart)) - ((:ok value) (message "Restart returned: %s" value)) - ((:abort _))))) - -(defun sldb-invoke-restart-by-name (restart-name) - (interactive (list (let ((completion-ignore-case t)) - (completing-read "Restart: " sldb-restarts nil t - "" - 'sldb-invoke-restart-by-name)))) - (sldb-invoke-restart (cl-position restart-name sldb-restarts - :test 'string= :key 'first))) - -(defun sldb-break-with-default-debugger (&optional dont-unwind) - "Enter default debugger." - (interactive "P") - (slime-rex () - ((list 'swank:sldb-break-with-default-debugger - (not (not dont-unwind))) - nil slime-current-thread) - ((:abort _)))) - -(defun sldb-break-with-system-debugger (&optional lightweight) - "Enter system debugger (gdb)." - (interactive "P") - (slime-attach-gdb slime-buffer-connection lightweight)) - -(defun slime-attach-gdb (connection &optional lightweight) - "Run `gud-gdb'on the connection with PID `pid'. - -If `lightweight' is given, do not send any request to the -inferior Lisp (e.g. to obtain default gdb config) but only -operate from the Emacs side; intended for cases where the Lisp is -truly screwed up." - (interactive - (list (slime-read-connection "Attach gdb to: " (slime-connection)) "P")) - (let ((pid (slime-pid connection)) - (file (slime-lisp-implementation-program connection)) - (commands (unless lightweight - (let ((slime-dispatching-connection connection)) - (slime-eval `(swank:gdb-initial-commands)))))) - (gud-gdb (format "gdb -p %d %s" pid (or file ""))) - (with-current-buffer gud-comint-buffer - (dolist (cmd commands) - ;; First wait until gdb was initialized, then wait until current - ;; command was processed. - (while (not (looking-back comint-prompt-regexp nil)) - (sit-for 0.01)) - ;; We do not use `gud-call' because we want the initial commands - ;; to be displayed by the user so he knows what he's got. - (insert cmd) - (comint-send-input))))) - -(defun slime-read-connection (prompt &optional initial-value) - "Read a connection from the minibuffer. -Return the net process, or nil." - (cl-assert (memq initial-value slime-net-processes)) - (let* ((to-string (lambda (p) - (format "%s (pid %d)" - (slime-connection-name p) (slime-pid p)))) - (candidates (mapcar (lambda (p) (cons (funcall to-string p) p)) - slime-net-processes))) - (cdr (assoc (completing-read prompt candidates - nil t (funcall to-string initial-value)) - candidates)))) - -(defun sldb-step () - "Step to next basic-block boundary." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-step ,frame)))) - -(defun sldb-next () - "Step over call." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-next ,frame)))) - -(defun sldb-out () - "Resume stepping after returning from this function." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-out ,frame)))) - -(defun sldb-break-on-return () - "Set a breakpoint at the current frame. -The debugger is entered when the frame exits." - (interactive) - (let ((frame (sldb-frame-number-at-point))) - (slime-eval-async `(swank:sldb-break-on-return ,frame) - (lambda (msg) (message "%s" msg))))) - -(defun sldb-break (name) - "Set a breakpoint at the start of the function NAME." - (interactive (list (slime-read-symbol-name "Function: " t))) - (slime-eval-async `(swank:sldb-break ,name) - (lambda (msg) (message "%s" msg)))) - -(defun sldb-return-from-frame (string) - "Reads an expression in the minibuffer and causes the function to -return that value, evaluated in the context of the frame." - (interactive (list (slime-read-from-minibuffer "Return from frame: "))) - (let* ((number (sldb-frame-number-at-point))) - (slime-rex () - ((list 'swank:sldb-return-from-frame number string)) - ((:ok value) (message "%s" value)) - ((:abort _))))) - -(defun sldb-restart-frame () - "Causes the frame to restart execution with the same arguments as it -was called originally." - (interactive) - (let* ((number (sldb-frame-number-at-point))) - (slime-rex () - ((list 'swank:restart-frame number)) - ((:ok value) (message "%s" value)) - ((:abort _))))) - -(defun slime-toggle-break-on-signals () - "Toggle the value of *break-on-signals*." - (interactive) - (slime-eval-async `(swank:toggle-break-on-signals) - (lambda (msg) (message "%s" msg)))) - - -;;;;;; SLDB recompilation commands - -(defun sldb-recompile-frame-source (&optional raw-prefix-arg) - (interactive "P") - (slime-eval-async - `(swank:frame-source-location ,(sldb-frame-number-at-point)) - (lexical-let ((policy (slime-compute-policy raw-prefix-arg))) - (lambda (source-location) - (slime-dcase source-location - ((:error message) - (message "%s" message) - (ding)) - (t - (let ((slime-compilation-policy policy)) - (slime-recompile-location source-location)))))))) - - -;;;; Thread control panel - -(defvar slime-threads-buffer-name (slime-buffer-name :threads)) -(defvar slime-threads-buffer-timer nil) - -(defcustom slime-threads-update-interval nil - "Interval at which the list of threads will be updated." - :type '(choice - (number :value 0.5) - (const nil)) - :group 'slime-ui) - -(defun slime-list-threads () - "Display a list of threads." - (interactive) - (let ((name slime-threads-buffer-name)) - (slime-with-popup-buffer (name :connection t - :mode 'slime-thread-control-mode) - (slime-update-threads-buffer) - (goto-char (point-min)) - (when slime-threads-update-interval - (when slime-threads-buffer-timer - (cancel-timer slime-threads-buffer-timer)) - (setq slime-threads-buffer-timer - (run-with-timer - slime-threads-update-interval - slime-threads-update-interval - 'slime-update-threads-buffer)))))) - -(defun slime-quit-threads-buffer () - (when slime-threads-buffer-timer - (cancel-timer slime-threads-buffer-timer)) - (quit-window t) - (slime-eval-async `(swank:quit-thread-browser))) - -(defun slime-update-threads-buffer () - (interactive) - (with-current-buffer slime-threads-buffer-name - (slime-eval-async '(swank:list-threads) - 'slime-display-threads))) - -(defun slime-move-point (position) - "Move point in the current buffer and in the window the buffer is displayed." - (let ((window (get-buffer-window (current-buffer) t))) - (goto-char position) - (when window - (set-window-point window position)))) - -(defun slime-display-threads (threads) - (with-current-buffer slime-threads-buffer-name - (let* ((inhibit-read-only t) - (old-thread-id (get-text-property (point) 'thread-id)) - (old-line (line-number-at-pos)) - (old-column (current-column))) - (erase-buffer) - (slime-insert-threads threads) - (let ((new-position (cl-position old-thread-id (cdr threads) - :key #'car :test #'equal))) - (goto-char (point-min)) - (forward-line (or new-position (1- old-line))) - (move-to-column old-column) - (slime-move-point (point)))))) - -(defun slime-transpose-lists (list-of-lists) - (let ((ncols (length (car list-of-lists)))) - (cl-loop for col-index below ncols - collect (cl-loop for row in list-of-lists - collect (elt row col-index))))) - -(defun slime-insert-table-row (line line-props col-props col-widths) - (slime-propertize-region line-props - (cl-loop for string in line - for col-prop in col-props - for width in col-widths do - (slime-insert-propertized col-prop string) - (insert-char ?\ (- width (length string)))))) - -(defun slime-insert-table (rows header row-properties column-properties) - "Insert a \"table\" so that the columns are nicely aligned." - (let* ((ncols (length header)) - (lines (cons header rows)) - (widths (cl-loop for columns in (slime-transpose-lists lines) - collect (1+ (cl-loop for cell in columns - maximize (length cell))))) - (header-line (with-temp-buffer - (slime-insert-table-row - header nil (make-list ncols nil) widths) - (buffer-string)))) - (cond ((boundp 'header-line-format) - (setq header-line-format header-line)) - (t (insert header-line "\n"))) - (cl-loop for line in rows for line-props in row-properties do - (slime-insert-table-row line line-props column-properties widths) - (insert "\n")))) - -(defvar slime-threads-table-properties - '(nil (face bold))) - -(defun slime-insert-threads (threads) - (let* ((labels (car threads)) - (threads (cdr threads)) - (header (cl-loop for label in labels collect - (capitalize (substring (symbol-name label) 1)))) - (rows (cl-loop for thread in threads collect - (cl-loop for prop in thread collect - (format "%s" prop)))) - (line-props (cl-loop for (id) in threads for i from 0 - collect `(thread-index ,i thread-id ,id))) - (col-props (cl-loop for nil in labels for i from 0 collect - (nth i slime-threads-table-properties)))) - (slime-insert-table rows header line-props col-props))) - - -;;;;; Major mode - -(define-derived-mode slime-thread-control-mode fundamental-mode - "Threads" - "SLIME Thread Control Panel Mode. - -\\{slime-thread-control-mode-map} -\\{slime-popup-buffer-mode-map}" - (when slime-truncate-lines - (set (make-local-variable 'truncate-lines) t)) - (setq buffer-undo-list t)) - -(slime-define-keys slime-thread-control-mode-map - ("a" 'slime-thread-attach) - ("d" 'slime-thread-debug) - ("g" 'slime-update-threads-buffer) - ("k" 'slime-thread-kill) - ("q" 'slime-quit-threads-buffer)) - -(defun slime-thread-kill () - (interactive) - (slime-eval `(cl:mapc 'swank:kill-nth-thread - ',(slime-get-properties 'thread-index))) - (call-interactively 'slime-update-threads-buffer)) - -(defun slime-get-region-properties (prop start end) - (cl-loop for position = (if (get-text-property start prop) - start - (next-single-property-change start prop)) - then (next-single-property-change position prop) - while (<= position end) - collect (get-text-property position prop))) - -(defun slime-get-properties (prop) - (if (use-region-p) - (slime-get-region-properties prop - (region-beginning) - (region-end)) - (let ((value (get-text-property (point) prop))) - (when value - (list value))))) - -(defun slime-thread-attach () - (interactive) - (let ((id (get-text-property (point) 'thread-index)) - (file (slime-swank-port-file))) - (slime-eval-async `(swank:start-swank-server-in-thread ,id ,file))) - (slime-read-port-and-connect nil)) - -(defun slime-thread-debug () - (interactive) - (let ((id (get-text-property (point) 'thread-index))) - (slime-eval-async `(swank:debug-nth-thread ,id)))) - - -;;;;; Connection listing - -(define-derived-mode slime-connection-list-mode fundamental-mode - "Slime-Connections" - "SLIME Connection List Mode. - -\\{slime-connection-list-mode-map} -\\{slime-popup-buffer-mode-map}" - (when slime-truncate-lines - (set (make-local-variable 'truncate-lines) t))) - -(slime-define-keys slime-connection-list-mode-map - ("d" 'slime-connection-list-make-default) - ("g" 'slime-update-connection-list) - ((kbd "C-k") 'slime-quit-connection-at-point) - ("R" 'slime-restart-connection-at-point)) - -(defun slime-connection-at-point () - (or (get-text-property (point) 'slime-connection) - (error "No connection at point"))) - -(defun slime-quit-connection-at-point (connection) - (interactive (list (slime-connection-at-point))) - (let ((slime-dispatching-connection connection) - (end (time-add (current-time) (seconds-to-time 3)))) - (slime-quit-lisp t) - (while (memq connection slime-net-processes) - (when (time-less-p end (current-time)) - (message "Quit timeout expired. Disconnecting.") - (delete-process connection)) - (sit-for 0 100))) - (slime-update-connection-list)) - -(defun slime-restart-connection-at-point (connection) - (interactive (list (slime-connection-at-point))) - (let ((slime-dispatching-connection connection)) - (slime-restart-inferior-lisp))) - -(defun slime-connection-list-make-default () - "Make the connection at point the default connection." - (interactive) - (slime-select-connection (slime-connection-at-point)) - (slime-update-connection-list)) - -(defvar slime-connections-buffer-name (slime-buffer-name :connections)) - -(defun slime-list-connections () - "Display a list of all connections." - (interactive) - (slime-with-popup-buffer (slime-connections-buffer-name - :mode 'slime-connection-list-mode) - (slime-draw-connection-list))) - -(defun slime-update-connection-list () - "Display a list of all connections." - (interactive) - (let ((pos (point)) - (inhibit-read-only t)) - (erase-buffer) - (slime-draw-connection-list) - (goto-char pos))) - -(defun slime-draw-connection-list () - (let ((default-pos nil) - (default slime-default-connection) - (fstring "%s%2s %-10s %-17s %-7s %-s\n")) - (insert (format fstring " " "Nr" "Name" "Port" "Pid" "Type") - (format fstring " " "--" "----" "----" "---" "----")) - (dolist (p (reverse slime-net-processes)) - (when (eq default p) (setf default-pos (point))) - (slime-insert-propertized - (list 'slime-connection p) - (format fstring - (if (eq default p) "*" " ") - (slime-connection-number p) - (slime-connection-name p) - (or (process-id p) (process-contact p)) - (slime-pid p) - (slime-lisp-implementation-type p)))) - (when default-pos - (goto-char default-pos)))) - - -;;;; Inspector - -(defgroup slime-inspector nil - "Inspector faces." - :prefix "slime-inspector-" - :group 'slime) - -(defface slime-inspector-topline-face - '((t ())) - "Face for top line describing object." - :group 'slime-inspector) - -(defface slime-inspector-label-face - '((t (:inherit font-lock-constant-face))) - "Face for labels in the inspector." - :group 'slime-inspector) - -(defface slime-inspector-value-face - '((t (:inherit font-lock-builtin-face))) - "Face for things which can themselves be inspected." - :group 'slime-inspector) - -(defface slime-inspector-action-face - '((t (:inherit font-lock-warning-face))) - "Face for labels of inspector actions." - :group 'slime-inspector) - -(defface slime-inspector-type-face - '((t (:inherit font-lock-type-face))) - "Face for type description in inspector." - :group 'slime-inspector) - -(defvar slime-inspector-mark-stack '()) - -(defun slime-inspect (string) - "Eval an expression and inspect the result." - (interactive - (list (slime-read-from-minibuffer "Inspect value (evaluated): " - (slime-sexp-at-point)))) - (slime-eval-async `(swank:init-inspector ,string) 'slime-open-inspector)) - -(define-derived-mode slime-inspector-mode fundamental-mode - "Slime-Inspector" - " -\\{slime-inspector-mode-map} -\\{slime-popup-buffer-mode-map}" - (set-syntax-table lisp-mode-syntax-table) - (slime-set-truncate-lines) - (setq buffer-read-only t)) - -(defun slime-inspector-buffer () - (or (get-buffer (slime-buffer-name :inspector)) - (slime-with-popup-buffer ((slime-buffer-name :inspector) - :mode 'slime-inspector-mode) - (setq slime-inspector-mark-stack '()) - (buffer-disable-undo) - (current-buffer)))) - -(defmacro slime-inspector-fontify (face string) - `(slime-add-face ',(intern (format "slime-inspector-%s-face" face)) ,string)) - -(defvar slime-inspector-insert-ispec-function 'slime-inspector-insert-ispec) - -(defun slime-open-inspector (inspected-parts &optional point hook) - "Display INSPECTED-PARTS in a new inspector window. -Optionally set point to POINT. If HOOK is provided, it is added to local -KILL-BUFFER hooks for the inspector buffer." - (with-current-buffer (slime-inspector-buffer) - (when hook - (add-hook 'kill-buffer-hook hook t t)) - (setq slime-buffer-connection (slime-current-connection)) - (let ((inhibit-read-only t)) - (erase-buffer) - (pop-to-buffer (current-buffer)) - (cl-destructuring-bind (&key id title content) inspected-parts - (cl-macrolet ((fontify (face string) - `(slime-inspector-fontify ,face ,string))) - (slime-propertize-region - (list 'slime-part-number id - 'mouse-face 'highlight - 'face 'slime-inspector-value-face) - (insert title)) - (while (eq (char-before) ?\n) - (backward-delete-char 1)) - (insert "\n" (fontify label "--------------------") "\n") - (save-excursion - (slime-inspector-insert-content content)) - (when point - (cl-check-type point cons) - (ignore-errors - (goto-char (point-min)) - (forward-line (1- (car point))) - (move-to-column (cdr point))))))))) - -(defvar slime-inspector-limit 500) - -(defun slime-inspector-insert-content (content) - (slime-inspector-fetch-chunk - content nil - (lambda (chunk) - (let ((inhibit-read-only t)) - (slime-inspector-insert-chunk chunk t t))))) - -(defun slime-inspector-insert-chunk (chunk prev next) - "Insert CHUNK at point. -If PREV resp. NEXT are true insert more-buttons as needed." - (cl-destructuring-bind (ispecs len start end) chunk - (when (and prev (> start 0)) - (slime-inspector-insert-more-button start t)) - (mapc slime-inspector-insert-ispec-function ispecs) - (when (and next (< end len)) - (slime-inspector-insert-more-button end nil)))) - -(defun slime-inspector-insert-ispec (ispec) - (if (stringp ispec) - (insert ispec) - (slime-dcase ispec - ((:value string id) - (slime-propertize-region - (list 'slime-part-number id - 'mouse-face 'highlight - 'face 'slime-inspector-value-face) - (insert string))) - ((:label string) - (insert (slime-inspector-fontify label string))) - ((:action string id) - (slime-insert-propertized (list 'slime-action-number id - 'mouse-face 'highlight - 'face 'slime-inspector-action-face) - string))))) - -(defun slime-inspector-position () - "Return a pair (Y-POSITION X-POSITION) representing the -position of point in the current buffer." - ;; We make sure we return absolute coordinates even if the user has - ;; narrowed the buffer. - ;; FIXME: why would somebody narrow the buffer? - (save-restriction - (widen) - (cons (line-number-at-pos) - (current-column)))) - -(defun slime-inspector-property-at-point () - (let* ((properties '(slime-part-number slime-range-button - slime-action-number)) - (find-property - (lambda (point) - (cl-loop for property in properties - for value = (get-text-property point property) - when value - return (list property value))))) - (or (funcall find-property (point)) - (funcall find-property (1- (point)))))) - -(defun slime-inspector-operate-on-point () - "Invoke the command for the text at point. -1. If point is on a value then recursivly call the inspector on -that value. -2. If point is on an action then call that action. -3. If point is on a range-button fetch and insert the range." - (interactive) - (let ((opener (lexical-let ((point (slime-inspector-position))) - (lambda (parts) - (when parts - (slime-open-inspector parts point))))) - (new-opener (lambda (parts) - (when parts - (slime-open-inspector parts))))) - (cl-destructuring-bind (&optional property value) - (slime-inspector-property-at-point) - (cl-case property - (slime-part-number - (slime-eval-async `(swank:inspect-nth-part ,value) - new-opener) - (push (slime-inspector-position) slime-inspector-mark-stack)) - (slime-range-button - (slime-inspector-fetch-more value)) - (slime-action-number - (slime-eval-async `(swank:inspector-call-nth-action ,value) - opener)) - (t (error "No object at point")))))) - -(defun slime-inspector-operate-on-click (event) - "Move to events' position and operate the part." - (interactive "@e") - (let ((point (posn-point (event-end event)))) - (cond ((and point - (or (get-text-property point 'slime-part-number) - (get-text-property point 'slime-range-button) - (get-text-property point 'slime-action-number))) - (goto-char point) - (slime-inspector-operate-on-point)) - (t - (error "No clickable part here"))))) - -(defun slime-inspector-pop () - "Reinspect the previous object." - (interactive) - (slime-eval-async - `(swank:inspector-pop) - (lambda (result) - (cond (result - (slime-open-inspector result (pop slime-inspector-mark-stack))) - (t - (message "No previous object") - (ding)))))) - -(defun slime-inspector-next () - "Inspect the next object in the history." - (interactive) - (let ((result (slime-eval `(swank:inspector-next)))) - (cond (result - (push (slime-inspector-position) slime-inspector-mark-stack) - (slime-open-inspector result)) - (t (message "No next object") - (ding))))) - -(defun slime-inspector-quit () - "Quit the inspector and kill the buffer." - (interactive) - (slime-eval-async `(swank:quit-inspector)) - (quit-window t)) - -;; FIXME: first return value is just point. -;; FIXME: could probably use slime-search-property. -(defun slime-find-inspectable-object (direction limit) - "Find the next/previous inspectable object. -DIRECTION can be either 'next or 'prev. -LIMIT is the maximum or minimum position in the current buffer. - -Return a list of two values: If an object could be found, the -starting position of the found object and T is returned; -otherwise LIMIT and NIL is returned." - (let ((finder (cl-ecase direction - (next 'next-single-property-change) - (prev 'previous-single-property-change)))) - (let ((prop nil) (curpos (point))) - (while (and (not prop) (not (= curpos limit))) - (let ((newpos (funcall finder curpos 'slime-part-number nil limit))) - (setq prop (get-text-property newpos 'slime-part-number)) - (setq curpos newpos))) - (list curpos (and prop t))))) - -(defun slime-inspector-next-inspectable-object (arg) - "Move point to the next inspectable object. -With optional ARG, move across that many objects. -If ARG is negative, move backwards." - (interactive "p") - (let ((maxpos (point-max)) (minpos (point-min)) - (previously-wrapped-p nil)) - ;; Forward. - (while (> arg 0) - (cl-destructuring-bind (pos foundp) - (slime-find-inspectable-object 'next maxpos) - (if foundp - (progn (goto-char pos) (setq arg (1- arg)) - (setq previously-wrapped-p nil)) - (if (not previously-wrapped-p) ; cycle detection - (progn (goto-char minpos) (setq previously-wrapped-p t)) - (error "No inspectable objects"))))) - ;; Backward. - (while (< arg 0) - (cl-destructuring-bind (pos foundp) - (slime-find-inspectable-object 'prev minpos) - ;; SLIME-OPEN-INSPECTOR inserts the title of an inspector page - ;; as a presentation at the beginning of the buffer; skip - ;; that. (Notice how this problem can not arise in ``Forward.'') - (if (and foundp (/= pos minpos)) - (progn (goto-char pos) (setq arg (1+ arg)) - (setq previously-wrapped-p nil)) - (if (not previously-wrapped-p) ; cycle detection - (progn (goto-char maxpos) (setq previously-wrapped-p t)) - (error "No inspectable objects"))))))) - -(defun slime-inspector-previous-inspectable-object (arg) - "Move point to the previous inspectable object. -With optional ARG, move across that many objects. -If ARG is negative, move forwards." - (interactive "p") - (slime-inspector-next-inspectable-object (- arg))) - -(defun slime-inspector-describe () - (interactive) - (slime-eval-describe `(swank:describe-inspectee))) - -(defun slime-inspector-pprint (part) - (interactive (list (or (get-text-property (point) 'slime-part-number) - (error "No part at point")))) - (slime-eval-describe `(swank:pprint-inspector-part ,part))) - -(defun slime-inspector-eval (string) - "Eval an expression in the context of the inspected object. -The `*' variable will be bound to the inspected object." - (interactive (list (slime-read-from-minibuffer "Inspector eval: "))) - (slime-eval-with-transcript `(swank:inspector-eval ,string))) - -(defun slime-inspector-history () - "Show the previously inspected objects." - (interactive) - (slime-eval-describe `(swank:inspector-history))) - -(defun slime-inspector-show-source (part) - (interactive (list (or (get-text-property (point) 'slime-part-number) - (error "No part at point")))) - (slime-eval-async - `(swank:find-source-location-for-emacs '(:inspector ,part)) - #'slime-show-source-location)) - -(defun slime-inspector-reinspect () - (interactive) - (slime-eval-async `(swank:inspector-reinspect) - (lexical-let ((point (slime-inspector-position))) - (lambda (parts) - (slime-open-inspector parts point))))) - -(defun slime-inspector-toggle-verbose () - (interactive) - (slime-eval-async `(swank:inspector-toggle-verbose) - (lexical-let ((point (slime-inspector-position))) - (lambda (parts) - (slime-open-inspector parts point))))) - -(defun slime-inspector-insert-more-button (index previous) - (slime-insert-propertized - (list 'slime-range-button (list index previous) - 'mouse-face 'highlight - 'face 'slime-inspector-action-face) - (if previous " [--more--]\n" " [--more--]"))) - -(defun slime-inspector-fetch-all () - "Fetch all inspector contents and go to the end." - (interactive) - (goto-char (1- (point-max))) - (let ((button (get-text-property (point) 'slime-range-button))) - (when button - (let (slime-inspector-limit) - (slime-inspector-fetch-more button))))) - -(defun slime-inspector-fetch-more (button) - (cl-destructuring-bind (index prev) button - (slime-inspector-fetch-chunk - (list '() (1+ index) index index) prev - (slime-rcurry - (lambda (chunk prev) - (let ((inhibit-read-only t)) - (apply #'delete-region (slime-property-bounds 'slime-range-button)) - (slime-inspector-insert-chunk chunk prev (not prev)))) - prev)))) - -(defun slime-inspector-fetch-chunk (chunk prev cont) - (slime-inspector-fetch chunk slime-inspector-limit prev cont)) - -(defun slime-inspector-fetch (chunk limit prev cont) - (cl-destructuring-bind (from to) - (slime-inspector-next-range chunk limit prev) - (cond ((and from to) - (slime-eval-async - `(swank:inspector-range ,from ,to) - (slime-rcurry (lambda (chunk2 chunk1 limit prev cont) - (slime-inspector-fetch - (slime-inspector-join-chunks chunk1 chunk2) - limit prev cont)) - chunk limit prev cont))) - (t (funcall cont chunk))))) - -(defun slime-inspector-next-range (chunk limit prev) - (cl-destructuring-bind (_ len start end) chunk - (let ((count (- end start))) - (cond ((and prev (< 0 start) (or (not limit) (< count limit))) - (list (if limit (max (- end limit) 0) 0) start)) - ((and (not prev) (< end len) (or (not limit) (< count limit))) - (list end (if limit (+ start limit) most-positive-fixnum))) - (t '(nil nil)))))) - -(defun slime-inspector-join-chunks (chunk1 chunk2) - (cl-destructuring-bind (i1 _l1 s1 e1) chunk1 - (cl-destructuring-bind (i2 l2 s2 e2) chunk2 - (cond ((= e1 s2) - (list (append i1 i2) l2 s1 e2)) - ((= e2 s1) - (list (append i2 i1) l2 s2 e1)) - (t (error "Invalid chunks")))))) - -(set-keymap-parent slime-inspector-mode-map slime-parent-map) - -(slime-define-keys slime-inspector-mode-map - ([return] 'slime-inspector-operate-on-point) - ("\C-m" 'slime-inspector-operate-on-point) - ([mouse-1] 'slime-inspector-operate-on-click) - ([mouse-2] 'slime-inspector-operate-on-click) - ([mouse-6] 'slime-inspector-pop) - ([mouse-7] 'slime-inspector-next) - ("l" 'slime-inspector-pop) - ("n" 'slime-inspector-next) - (" " 'slime-inspector-next) - ("d" 'slime-inspector-describe) - ("p" 'slime-inspector-pprint) - ("e" 'slime-inspector-eval) - ("h" 'slime-inspector-history) - ("g" 'slime-inspector-reinspect) - ("v" 'slime-inspector-toggle-verbose) - ("\C-i" 'slime-inspector-next-inspectable-object) - ([(shift tab)] - 'slime-inspector-previous-inspectable-object) ; Emacs translates S-TAB - ([backtab] 'slime-inspector-previous-inspectable-object) ; to BACKTAB on X. - ("." 'slime-inspector-show-source) - (">" 'slime-inspector-fetch-all) - ("q" 'slime-inspector-quit)) - - -;;;; Buffer selector - -(defvar slime-selector-methods nil - "List of buffer-selection methods for the `slime-select' command. -Each element is a list (KEY DESCRIPTION FUNCTION). -DESCRIPTION is a one-line description of what the key selects.") - -(defvar slime-selector-other-window nil - "If non-nil use switch-to-buffer-other-window.") - -(defun slime-selector (&optional other-window) - "Select a new buffer by type, indicated by a single character. -The user is prompted for a single character indicating the method by -which to choose a new buffer. The `?' character describes the -available methods. - -See `def-slime-selector-method' for defining new methods." - (interactive) - (message "Select [%s]: " - (apply #'string (mapcar #'car slime-selector-methods))) - (let* ((slime-selector-other-window other-window) - (sequence (save-window-excursion - (select-window (minibuffer-window)) - (key-description (read-key-sequence nil)))) - (ch (cond ((equal sequence "C-g") - (keyboard-quit)) - ((equal sequence "TAB") - ?i) - ((= (length sequence) 1) - (elt sequence 0)) - ((= (length sequence) 3) - (elt sequence 2)))) - (method (cl-find ch slime-selector-methods :key #'car))) - (cond (method - (funcall (cl-third method))) - (t - (message "No method for character: ?\\%c" ch) - (ding) - (sleep-for 1) - (discard-input) - (slime-selector))))) - -(defmacro def-slime-selector-method (key description &rest body) - "Define a new `slime-select' buffer selection method. - -KEY is the key the user will enter to choose this method. - -DESCRIPTION is a one-line sentence describing how the method -selects a buffer. - -BODY is a series of forms which are evaluated when the selector -is chosen. The returned buffer is selected with -switch-to-buffer." - (let ((method `(lambda () - (let ((buffer (progn ,@body))) - (cond ((not (get-buffer buffer)) - (message "No such buffer: %S" buffer) - (ding)) - ((get-buffer-window buffer) - (select-window (get-buffer-window buffer))) - (slime-selector-other-window - (switch-to-buffer-other-window buffer)) - (t - (switch-to-buffer buffer))))))) - `(setq slime-selector-methods - (cl-sort (cons (list ,key ,description ,method) - (cl-remove ,key slime-selector-methods :key #'car)) - #'< :key #'car)))) - -(def-slime-selector-method ?? "Selector help buffer." - (ignore-errors (kill-buffer "*Select Help*")) - (with-current-buffer (get-buffer-create "*Select Help*") - (insert "Select Methods:\n\n") - (cl-loop for (key line nil) in slime-selector-methods - do (insert (format "%c:\t%s\n" key line))) - (goto-char (point-min)) - (help-mode) - (display-buffer (current-buffer) t)) - (slime-selector) - (current-buffer)) - -(cl-pushnew (list ?4 "Select in other window" (lambda () (slime-selector t))) - slime-selector-methods :key #'car) - -(def-slime-selector-method ?q "Abort." - (top-level)) - -(def-slime-selector-method ?i - "*inferior-lisp* buffer." - (cond ((and (slime-connected-p) (slime-process)) - (process-buffer (slime-process))) - (t - "*inferior-lisp*"))) - -(def-slime-selector-method ?v - "*slime-events* buffer." - slime-event-buffer-name) - -(def-slime-selector-method ?l - "most recently visited lisp-mode buffer." - (slime-recently-visited-buffer 'lisp-mode)) - -(def-slime-selector-method ?d - "*sldb* buffer for the current connection." - (or (sldb-get-default-buffer) - (error "No debugger buffer"))) - -(def-slime-selector-method ?e - "most recently visited emacs-lisp-mode buffer." - (slime-recently-visited-buffer 'emacs-lisp-mode)) - -(def-slime-selector-method ?c - "SLIME connections buffer." - (slime-list-connections) - slime-connections-buffer-name) - -(def-slime-selector-method ?n - "Cycle to the next Lisp connection." - (slime-next-connection) - (concat "*slime-repl " - (slime-connection-name (slime-current-connection)) - "*")) - -(def-slime-selector-method ?p - "Cycle to the previous Lisp connection." - (slime-prev-connection) - (concat "*slime-repl " - (slime-connection-name (slime-current-connection)) - "*")) - -(def-slime-selector-method ?t - "SLIME threads buffer." - (slime-list-threads) - slime-threads-buffer-name) - -(defun slime-recently-visited-buffer (mode) - "Return the most recently visited buffer whose major-mode is MODE. -Only considers buffers that are not already visible." - (cl-loop for buffer in (buffer-list) - when (and (with-current-buffer buffer (eq major-mode mode)) - (not (string-match "^ " (buffer-name buffer))) - (null (get-buffer-window buffer 'visible))) - return buffer - finally (error "Can't find unshown buffer in %S" mode))) - - -;;;; Indentation - -(defun slime-update-indentation () - "Update indentation for all macros defined in the Lisp system." - (interactive) - (slime-eval-async '(swank:update-indentation-information))) - -(defvar slime-indentation-update-hooks) - -(defun slime-intern-indentation-spec (spec) - (cond ((consp spec) - (cons (slime-intern-indentation-spec (car spec)) - (slime-intern-indentation-spec (cdr spec)))) - ((stringp spec) - (intern spec)) - (t - spec))) - -;; FIXME: restore the old version without per-package -;; stuff. slime-indentation.el should be able tho disable the simple -;; version if needed. -(defun slime-handle-indentation-update (alist) - "Update Lisp indent information. - -ALIST is a list of (SYMBOL-NAME . INDENT-SPEC) of proposed indentation -settings for `common-lisp-indent-function'. The appropriate property -is setup, unless the user already set one explicitly." - (dolist (info alist) - (let ((symbol (intern (car info))) - (indent (slime-intern-indentation-spec (cl-second info))) - (packages (cl-third info))) - (if (and (boundp 'common-lisp-system-indentation) - (fboundp 'slime-update-system-indentation)) - ;; A table provided by slime-cl-indent.el. - (funcall #'slime-update-system-indentation symbol indent packages) - ;; Does the symbol have an indentation value that we set? - (when (equal (get symbol 'common-lisp-indent-function) - (get symbol 'slime-indent)) - (put symbol 'common-lisp-indent-function indent) - (put symbol 'slime-indent indent))) - (run-hook-with-args 'slime-indentation-update-hooks - symbol indent packages)))) - - -;;;; Contrib modules - -(defun slime-require (module) - (cl-pushnew module slime-required-modules) - (when (slime-connected-p) - (slime-load-contribs))) - -(defun slime-load-contribs () - (let ((needed (cl-remove-if (lambda (s) - (member (cl-subseq (symbol-name s) 1) - (mapcar #'downcase - (slime-lisp-modules)))) - slime-required-modules))) - (when needed - ;; No asynchronous request because with :SPAWN that could result - ;; in the attempt to load modules concurrently which may not be - ;; supported by the host Lisp. - (setf (slime-lisp-modules) - (slime-eval `(swank:swank-require ',needed)))))) - -(cl-defstruct slime-contrib - name - slime-dependencies - swank-dependencies - enable - disable - authors - license) - -(defun slime-contrib--enable-fun (name) - (intern (concat (symbol-name name) "-init"))) - -(defun slime-contrib--disable-fun (name) - (intern (concat (symbol-name name) "-unload"))) - -(defmacro define-slime-contrib (name _docstring &rest clauses) - (declare (indent 1)) - (cl-destructuring-bind (&key slime-dependencies - swank-dependencies - on-load - on-unload - authors - license) - (cl-loop for (key . value) in clauses append `(,key ,value)) - `(progn - ,@(mapcar (lambda (d) `(require ',d)) slime-dependencies) - (defun ,(slime-contrib--enable-fun name) () - (mapc #'funcall ',(mapcar - #'slime-contrib--enable-fun - slime-dependencies)) - (mapc #'slime-require ',swank-dependencies) - ,@on-load) - (defun ,(slime-contrib--disable-fun name) () - ,@on-unload - (mapc #'funcall ',(mapcar - #'slime-contrib--disable-fun - slime-dependencies))) - (put 'slime-contribs ',name - (make-slime-contrib - :name ',name :authors ',authors :license ',license - :slime-dependencies ',slime-dependencies - :swank-dependencies ',swank-dependencies - :enable ',(slime-contrib--enable-fun name) - :disable ',(slime-contrib--disable-fun name)))))) - -(defun slime-all-contribs () - (cl-loop for (nil val) on (symbol-plist 'slime-contribs) by #'cddr - when (slime-contrib-p val) - collect val)) - -(defun slime-contrib-all-dependencies (contrib) - "List all contribs recursively needed by CONTRIB, including self." - (cons contrib - (cl-mapcan #'slime-contrib-all-dependencies - (slime-contrib-slime-dependencies - (slime-find-contrib contrib))))) - -(defun slime-find-contrib (name) - (get 'slime-contribs name)) - -(defun slime-read-contrib-name () - (let ((names (cl-loop for c in (slime-all-contribs) collect - (symbol-name (slime-contrib-name c))))) - (intern (completing-read "Contrib: " names nil t)))) - -(defun slime-enable-contrib (name) - (interactive (list (slime-read-contrib-name))) - (let ((c (or (slime-find-contrib name) - (error "Unknown contrib: %S" name)))) - (funcall (slime-contrib-enable c)))) - -(defun slime-disable-contrib (name) - (interactive (list (slime-read-contrib-name))) - (let ((c (or (slime-find-contrib name) - (error "Unknown contrib: %S" name)))) - (funcall (slime-contrib-disable c)))) - - -;;;;; Pull-down menu - -(defvar slime-easy-menu - (let ((C '(slime-connected-p))) - `("SLIME" - [ "Edit Definition..." slime-edit-definition ,C ] - [ "Return From Definition" slime-pop-find-definition-stack ,C ] - [ "Complete Symbol" completion-at-point ,C ] - "--" - ("Evaluation" - [ "Eval Defun" slime-eval-defun ,C ] - [ "Eval Last Expression" slime-eval-last-expression ,C ] - [ "Eval And Pretty-Print" slime-pprint-eval-last-expression ,C ] - [ "Eval Region" slime-eval-region ,C ] - [ "Eval Region And Pretty-Print" slime-pprint-eval-region ,C ] - [ "Interactive Eval..." slime-interactive-eval ,C ] - [ "Edit Lisp Value..." slime-edit-value ,C ] - [ "Call Defun" slime-call-defun ,C ]) - ("Debugging" - [ "Macroexpand Once..." slime-macroexpand-1 ,C ] - [ "Macroexpand All..." slime-macroexpand-all ,C ] - [ "Create Trace Buffer" slime-redirect-trace-output ,C ] - [ "Toggle Trace..." slime-toggle-trace-fdefinition ,C ] - [ "Untrace All" slime-untrace-all ,C] - [ "Disassemble..." slime-disassemble-symbol ,C ] - [ "Inspect..." slime-inspect ,C ]) - ("Compilation" - [ "Compile Defun" slime-compile-defun ,C ] - [ "Compile/Load File" slime-compile-and-load-file ,C ] - [ "Compile File" slime-compile-file ,C ] - [ "Compile Region" slime-compile-region ,C ] - "--" - [ "Next Note" slime-next-note t ] - [ "Previous Note" slime-previous-note t ] - [ "Remove Notes" slime-remove-notes t ] - [ "List Notes" slime-list-compiler-notes ,C ]) - ("Cross Reference" - [ "Who Calls..." slime-who-calls ,C ] - [ "Who References... " slime-who-references ,C ] - [ "Who Sets..." slime-who-sets ,C ] - [ "Who Binds..." slime-who-binds ,C ] - [ "Who Macroexpands..." slime-who-macroexpands ,C ] - [ "Who Specializes..." slime-who-specializes ,C ] - [ "List Callers..." slime-list-callers ,C ] - [ "List Callees..." slime-list-callees ,C ] - [ "Next Location" slime-next-location t ]) - ("Editing" - [ "Check Parens" check-parens t] - [ "Update Indentation" slime-update-indentation ,C] - [ "Select Buffer" slime-selector t]) - ("Profiling" - [ "Toggle Profiling..." slime-toggle-profile-fdefinition ,C ] - [ "Profile Package" slime-profile-package ,C] - [ "Profile by Substring" slime-profile-by-substring ,C ] - [ "Unprofile All" slime-unprofile-all ,C ] - [ "Show Profiled" slime-profiled-functions ,C ] - "--" - [ "Report" slime-profile-report ,C ] - [ "Reset Counters" slime-profile-reset ,C ]) - ("Documentation" - [ "Describe Symbol..." slime-describe-symbol ,C ] - [ "Lookup Documentation..." slime-documentation-lookup t ] - [ "Apropos..." slime-apropos ,C ] - [ "Apropos all..." slime-apropos-all ,C ] - [ "Apropos Package..." slime-apropos-package ,C ] - [ "Hyperspec..." slime-hyperspec-lookup t ]) - "--" - [ "Interrupt Command" slime-interrupt ,C ] - [ "Abort Async. Command" slime-quit ,C ] - [ "Sync Package & Directory" slime-sync-package-and-default-directory ,C] - ))) - -(defvar slime-sldb-easy-menu - (let ((C '(slime-connected-p))) - `("SLDB" - [ "Next Frame" sldb-down t ] - [ "Previous Frame" sldb-up t ] - [ "Toggle Frame Details" sldb-toggle-details t ] - [ "Next Frame (Details)" sldb-details-down t ] - [ "Previous Frame (Details)" sldb-details-up t ] - "--" - [ "Eval Expression..." slime-interactive-eval ,C ] - [ "Eval in Frame..." sldb-eval-in-frame ,C ] - [ "Eval in Frame (pretty print)..." sldb-pprint-eval-in-frame ,C ] - [ "Inspect In Frame..." sldb-inspect-in-frame ,C ] - [ "Inspect Condition Object" sldb-inspect-condition ,C ] - "--" - [ "Restart Frame" sldb-restart-frame ,C ] - [ "Return from Frame..." sldb-return-from-frame ,C ] - ("Invoke Restart" - [ "Continue" sldb-continue ,C ] - [ "Abort" sldb-abort ,C ] - [ "Step" sldb-step ,C ] - [ "Step next" sldb-next ,C ] - [ "Step out" sldb-out ,C ] - ) - "--" - [ "Quit (throw)" sldb-quit ,C ] - [ "Break With Default Debugger" sldb-break-with-default-debugger ,C ]))) - -(easy-menu-define menubar-slime slime-mode-map "SLIME" slime-easy-menu) - -(defun slime-add-easy-menu () - (easy-menu-add slime-easy-menu 'slime-mode-map)) - -(add-hook 'slime-mode-hook 'slime-add-easy-menu) - -(defun slime-sldb-add-easy-menu () - (easy-menu-define menubar-slime-sldb - sldb-mode-map "SLDB" slime-sldb-easy-menu) - (easy-menu-add slime-sldb-easy-menu 'sldb-mode-map)) - -(add-hook 'sldb-mode-hook 'slime-sldb-add-easy-menu) - - -;;;; Cheat Sheet - -(defvar - slime-cheat-sheet-table - '((:title - "Editing lisp code" - :map slime-mode-map - :bindings ((slime-eval-defun "Evaluate current top level form") - (slime-compile-defun "Compile current top level form") - (slime-interactive-eval "Prompt for form and eval it") - (slime-compile-and-load-file "Compile and load current file") - (slime-sync-package-and-default-directory - "Synch default package and directory with current buffer") - (slime-next-note "Next compiler note") - (slime-previous-note "Previous compiler note") - (slime-remove-notes "Remove notes") - slime-documentation-lookup)) - (:title "Completion" - :map slime-mode-map - :bindings (slime-indent-and-complete-symbol - slime-fuzzy-complete-symbol)) - (:title - "Within SLDB buffers" - :map sldb-mode-map - :bindings ((sldb-default-action "Do 'whatever' with thing at point") - (sldb-toggle-details "Toggle frame details visualization") - (sldb-quit "Quit to REPL") - (sldb-abort "Invoke ABORT restart") - (sldb-continue "Invoke CONTINUE restart (if available)") - (sldb-show-source "Jump to frame's source code") - (sldb-eval-in-frame "Evaluate in frame at point") - (sldb-inspect-in-frame - "Evaluate in frame at point and inspect result"))) - (:title - "Within the Inspector" - :map slime-inspector-mode-map - :bindings ((slime-inspector-next-inspectable-object - "Jump to next inspectable object") - (slime-inspector-operate-on-point - "Inspect object or execute action at point") - (slime-inspector-reinspect "Reinspect current object") - (slime-inspector-pop "Return to previous object") - ;;(slime-inspector-copy-down "Send object at point to REPL") - (slime-inspector-toggle-verbose "Toggle verbose mode") - (slime-inspector-quit "Quit"))) - (:title - "Finding Definitions" - :map slime-mode-map - :bindings (slime-edit-definition - slime-pop-find-definition-stack)))) - -(defun slime-cheat-sheet () - (interactive) - (switch-to-buffer-other-frame - (get-buffer-create (slime-buffer-name :cheat-sheet))) - (setq buffer-read-only nil) - (delete-region (point-min) (point-max)) - (goto-char (point-min)) - (insert - "SLIME: The Superior Lisp Interaction Mode for Emacs (minor-mode).\n\n") - (dolist (mode slime-cheat-sheet-table) - (let ((title (cl-getf mode :title)) - (mode-map (cl-getf mode :map)) - (mode-keys (cl-getf mode :bindings))) - (insert title) - (insert ":\n") - (insert (make-string (1+ (length title)) ?-)) - (insert "\n") - (let ((keys '()) - (descriptions '())) - (dolist (func mode-keys) - ;; func is eithor the function name or a list (NAME DESCRIPTION) - (push (if (symbolp func) - (prin1-to-string func) - (cl-second func)) - descriptions) - (let ((all-bindings (where-is-internal (if (symbolp func) - func - (cl-first func)) - (symbol-value mode-map))) - (key-bindings '())) - (dolist (binding all-bindings) - (when (and (vectorp binding) - (integerp (aref binding 0))) - (push binding key-bindings))) - (push (mapconcat 'key-description key-bindings " or ") keys))) - (cl-loop with desc-length = (apply 'max (mapcar 'length descriptions)) - for key in (nreverse keys) - for desc in (nreverse descriptions) - do (insert desc) - do (insert (make-string (- desc-length (length desc)) ? )) - do (insert " => ") - do (insert (if (string= "" key) - "" - key)) - do (insert "\n") - finally do (insert "\n"))))) - (setq buffer-read-only t) - (goto-char (point-min))) - - -;;;; Utilities (no not Paul Graham style) - -;; XXX: unused function -(defun slime-intersperse (element list) - "Intersperse ELEMENT between each element of LIST." - (if (null list) - '() - (cons (car list) - (cl-mapcan (lambda (x) (list element x)) (cdr list))))) - -;;; FIXME: this looks almost slime `slime-alistify', perhaps the two -;;; functions can be merged. -(defun slime-group-similar (similar-p list) - "Return the list of lists of 'similar' adjacent elements of LIST. -The function SIMILAR-P is used to test for similarity. -The order of the input list is preserved." - (if (null list) - nil - (let ((accumulator (list (list (car list))))) - (dolist (x (cdr list)) - (if (funcall similar-p x (caar accumulator)) - (push x (car accumulator)) - (push (list x) accumulator))) - (reverse (mapcar #'reverse accumulator))))) - -(defun slime-alistify (list key test) - "Partition the elements of LIST into an alist. -KEY extracts the key from an element and TEST is used to compare -keys." - (let ((alist '())) - (dolist (e list) - (let* ((k (funcall key e)) - (probe (cl-assoc k alist :test test))) - (if probe - (push e (cdr probe)) - (push (cons k (list e)) alist)))) - ;; Put them back in order. - (cl-loop for (key . value) in (reverse alist) - collect (cons key (reverse value))))) - -;;;;; Misc. - -(defun slime-length= (seq n) - "Return (= (length SEQ) N)." - (cl-etypecase seq - (list - (cond ((zerop n) (null seq)) - ((let ((tail (nthcdr (1- n) seq))) - (and tail (null (cdr tail))))))) - (sequence - (= (length seq) n)))) - -(defun slime-length> (seq n) - "Return (> (length SEQ) N)." - (cl-etypecase seq - (list (nthcdr n seq)) - (sequence (> (length seq) n)))) - -(defun slime-trim-whitespace (str) - (let ((start (cl-position-if-not (lambda (x) - (memq x '(?\t ?\n ?\s ?\r))) - str)) - - (end (cl-position-if-not (lambda (x) - (memq x '(?\t ?\n ?\s ?\r))) - str - :from-end t))) - (if start - (substring str start (1+ end)) - ""))) - -;;;;; Buffer related - -(defun slime-buffer-narrowed-p (&optional buffer) - "Returns T if BUFFER (or the current buffer respectively) is narrowed." - (with-current-buffer (or buffer (current-buffer)) - (let ((beg (point-min)) - (end (point-max)) - (total (buffer-size))) - (or (/= beg 1) (/= end (1+ total)))))) - -(defun slime-column-max () - (save-excursion - (goto-char (point-min)) - (cl-loop for column = (prog2 (end-of-line) (current-column) (forward-line)) - until (= (point) (point-max)) - maximizing column))) - -;;;;; CL symbols vs. Elisp symbols. - -(defun slime-cl-symbol-name (symbol) - (let ((n (if (stringp symbol) symbol (symbol-name symbol)))) - (if (string-match ":\\([^:]*\\)$" n) - (let ((symbol-part (match-string 1 n))) - (if (string-match "^|\\(.*\\)|$" symbol-part) - (match-string 1 symbol-part) - symbol-part)) - n))) - -(defun slime-cl-symbol-package (symbol &optional default) - (let ((n (if (stringp symbol) symbol (symbol-name symbol)))) - (if (string-match "^\\([^:]*\\):" n) - (match-string 1 n) - default))) - -(defun slime-qualify-cl-symbol-name (symbol-or-name) - "Return a package-qualified string for SYMBOL-OR-NAME. -If SYMBOL-OR-NAME doesn't already have a package prefix the -current package is used." - (let ((s (if (stringp symbol-or-name) - symbol-or-name - (symbol-name symbol-or-name)))) - (if (slime-cl-symbol-package s) - s - (format "%s::%s" - (let* ((package (slime-current-package))) - ;; package is a string like ":cl-user" - ;; or "CL-USER", or "\"CL-USER\"". - (if package - (slime-pretty-package-name package) - "CL-USER")) - (slime-cl-symbol-name s))))) - -;;;;; Moving, CL idiosyncracies aware (reader conditionals &c.) - -(defmacro slime-point-moves-p (&rest body) - "Execute BODY and return true if the current buffer's point moved." - (declare (indent 0)) - (let ((pointvar (cl-gensym "point-"))) - `(let ((,pointvar (point))) - (save-current-buffer ,@body) - (/= ,pointvar (point))))) - -(defun slime-forward-sexp (&optional count) - "Like `forward-sexp', but understands reader-conditionals (#- and #+), -and skips comments." - (dotimes (_i (or count 1)) - (slime-forward-cruft) - (forward-sexp))) - -(defconst slime-reader-conditionals-regexp - ;; #!+, #!- are SBCL specific reader-conditional syntax. - ;; We need this for the source files of SBCL itself. - (regexp-opt '("#+" "#-" "#!+" "#!-"))) - -(defun slime-forward-reader-conditional () - "Move past any reader conditional (#+ or #-) at point." - (when (looking-at slime-reader-conditionals-regexp) - (goto-char (match-end 0)) - (let* ((plus-conditional-p (eq (char-before) ?+)) - (result (slime-eval-feature-expression - (condition-case e - (read (current-buffer)) - (invalid-read-syntax - (signal 'slime-unknown-feature-expression (cdr e))))))) - (unless (if plus-conditional-p result (not result)) - ;; skip this sexp - (slime-forward-sexp))))) - -(defun slime-forward-cruft () - "Move forward over whitespace, comments, reader conditionals." - (while (slime-point-moves-p (skip-chars-forward " \t\n") - (forward-comment (buffer-size)) - (inline (slime-forward-reader-conditional))))) - -(defun slime-keywordify (symbol) - "Make a keyword out of the symbol SYMBOL." - (let ((name (downcase (symbol-name symbol)))) - (intern (if (eq ?: (aref name 0)) - name - (concat ":" name))))) - -(put 'slime-incorrect-feature-expression - 'error-conditions '(slime-incorrect-feature-expression error)) - -(put 'slime-unknown-feature-expression - 'error-conditions '(slime-unknown-feature-expression - slime-incorrect-feature-expression - error)) - -;; FIXME: let it crash -;; FIXME: the length=1 constraint is bogus -(defun slime-eval-feature-expression (e) - "Interpret a reader conditional expression." - (cond ((symbolp e) - (memq (slime-keywordify e) (slime-lisp-features))) - ((and (consp e) (symbolp (car e))) - (funcall (let ((head (slime-keywordify (car e)))) - (cl-case head - (:and #'cl-every) - (:or #'cl-some) - (:not - (lexical-let ((feature-expression e)) - (lambda (f l) - (cond - ((slime-length= l 0) t) - ((slime-length= l 1) (not (apply f l))) - (t (signal 'slime-incorrect-feature-expression - feature-expression)))))) - (t (signal 'slime-unknown-feature-expression head)))) - #'slime-eval-feature-expression - (cdr e))) - (t (signal 'slime-incorrect-feature-expression e)))) - -;;;;; Extracting Lisp forms from the buffer or user - -(defun slime-defun-at-point () - "Return the text of the defun at point." - (apply #'buffer-substring-no-properties - (slime-region-for-defun-at-point))) - -(defun slime-region-for-defun-at-point () - "Return the start and end position of defun at point." - (save-excursion - (save-match-data - (end-of-defun) - (let ((end (point))) - (beginning-of-defun) - (list (point) end))))) - -(defun slime-beginning-of-symbol () - "Move to the beginning of the CL-style symbol at point." - (while (re-search-backward "\\(\\sw\\|\\s_\\|\\s\\.\\|\\s\\\\|[#@|]\\)\\=" - (when (> (point) 2000) (- (point) 2000)) - t)) - (re-search-forward "\\=#[-+.<|]" nil t) - (when (and (looking-at "@") (eq (char-before) ?\,)) - (forward-char))) - -(defun slime-end-of-symbol () - "Move to the end of the CL-style symbol at point." - (re-search-forward "\\=\\(\\sw\\|\\s_\\|\\s\\.\\|#:\\|[@|]\\)*")) - -(put 'slime-symbol 'end-op 'slime-end-of-symbol) -(put 'slime-symbol 'beginning-op 'slime-beginning-of-symbol) - -(defun slime-symbol-start-pos () - "Return the starting position of the symbol under point. -The result is unspecified if there isn't a symbol under the point." - (save-excursion (slime-beginning-of-symbol) (point))) - -(defun slime-symbol-end-pos () - (save-excursion (slime-end-of-symbol) (point))) - -(defun slime-bounds-of-symbol-at-point () - "Return the bounds of the symbol around point. -The returned bounds are either nil or non-empty." - (let ((bounds (bounds-of-thing-at-point 'slime-symbol))) - (if (and bounds - (< (car bounds) - (cdr bounds))) - bounds))) - -(defun slime-symbol-at-point () - "Return the name of the symbol at point, otherwise nil." - ;; (thing-at-point 'symbol) returns "" in empty buffers - (let ((bounds (slime-bounds-of-symbol-at-point))) - (if bounds - (buffer-substring-no-properties (car bounds) - (cdr bounds))))) - -(defun slime-bounds-of-sexp-at-point () - "Return the bounds sexp at point as a pair (or nil)." - (or (slime-bounds-of-symbol-at-point) - (and (equal (char-after) ?\() - (member (char-before) '(?\' ?\, ?\@)) - ;; hide stuff before ( to avoid quirks with '( etc. - (save-restriction - (narrow-to-region (point) (point-max)) - (bounds-of-thing-at-point 'sexp))) - (bounds-of-thing-at-point 'sexp))) - -(defun slime-sexp-at-point () - "Return the sexp at point as a string, otherwise nil." - (let ((bounds (slime-bounds-of-sexp-at-point))) - (if bounds - (buffer-substring-no-properties (car bounds) - (cdr bounds))))) - -(defun slime-sexp-at-point-or-error () - "Return the sexp at point as a string, othwise signal an error." - (or (slime-sexp-at-point) (user-error "No expression at point"))) - -(defun slime-string-at-point () - "Returns the string at point as a string, otherwise nil." - (let ((sexp (slime-sexp-at-point))) - (if (and sexp - (eql (char-syntax (aref sexp 0)) ?\")) - sexp - nil))) - -(defun slime-string-at-point-or-error () - "Return the sexp at point as a string, othwise signal an error." - (or (slime-string-at-point) (error "No string at point."))) - -(defun slime-input-complete-p (start end) - "Return t if the region from START to END contains a complete sexp." - (save-excursion - (goto-char start) - (cond ((looking-at "\\s *['`#]?[(\"]") - (ignore-errors - (save-restriction - (narrow-to-region start end) - ;; Keep stepping over blanks and sexps until the end of - ;; buffer is reached or an error occurs. Tolerate extra - ;; close parens. - (cl-loop do (skip-chars-forward " \t\r\n)") - until (eobp) - do (forward-sexp)) - t))) - (t t)))) - - -;;;; slime.el in pretty colors - -(cl-loop for sym in (list 'slime-def-connection-var - 'slime-define-channel-type - 'slime-define-channel-method - 'define-slime-contrib - 'slime-defun-if-undefined - 'slime-defmacro-if-undefined) - for regexp = (format "(\\(%S\\)\\s +\\(\\(\\w\\|\\s_\\)+\\)" - sym) - do (font-lock-add-keywords - 'emacs-lisp-mode - `((,regexp (1 font-lock-keyword-face) - (2 font-lock-variable-name-face))))) - -;;;; target manipulation (used by slime-presentations, slime-media, -;;;; slime-repl and slime-buffer-streams, at -;;;; least) - -(defvar slime-output-target-to-marker - (make-hash-table) - "Map from TARGET ids to Emacs markers. -The markers indicate where output should be inserted.") - -(defun slime-output-target-marker (target) - "Return the marker where output for TARGET should be inserted." - (gethash target slime-output-target-to-marker)) - -(defun slime-emit-to-target (string target) - "Insert STRING at target TARGET. -See `slime-output-target-to-marker'." - (let* ((marker (slime-output-target-marker target)) - (buffer (and marker (marker-buffer marker)))) - (when buffer - (with-current-buffer buffer - (save-excursion - ;; Insert STRING at MARKER, then move MARKER behind - ;; the insertion. - (goto-char marker) - (insert-before-markers string) - (set-marker marker (point))))))) - -;;;; Finishing up - -(eval-when-compile - (require 'bytecomp)) - -(defun slime--byte-compile (symbol) - (require 'bytecomp) ;; tricky interaction between autoload and let. - (let ((byte-compile-warnings '())) - (byte-compile symbol))) - -(defun slime--compile-hotspots () - (mapc (lambda (sym) - (cond ((fboundp sym) - (unless (byte-code-function-p (symbol-function sym)) - (slime--byte-compile sym))) - (t (error "%S is not fbound" sym)))) - '(slime-alistify - slime-log-event - slime-events-buffer - slime-process-available-input - slime-dispatch-event - slime-net-filter - slime-net-have-input-p - slime-net-decode-length - slime-net-read - slime-print-apropos - slime-insert-propertized - slime-beginning-of-symbol - slime-end-of-symbol - slime-eval-feature-expression - slime-forward-sexp - slime-forward-cruft - slime-forward-reader-conditional))) - -(slime--compile-hotspots) - -(add-to-list 'load-path (expand-file-name "contrib" slime-path)) - -(run-hooks 'slime-load-hook) -(provide 'slime) - -(when (member 'lisp-mode slime-lisp-modes) - (add-hook 'lisp-mode-hook 'slime-lisp-mode-hook)) - -;; Local Variables: -;; outline-regexp: ";;;;+" -;; indent-tabs-mode: nil -;; coding: latin-1-unix -;; End: -;;; slime.el ends here diff --git a/elpa/slime-20200414.1444/slime.elc b/elpa/slime-20200414.1444/slime.elc deleted file mode 100644 index dddc9b867302f3e5404f3e7e02e47f13553e0de6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323201 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 - • Scieneer Common Lisp (SCL), version 1.2.7 or newer - • Embedded Common Lisp (ECL) - - Most features work uniformly across implementations, but some are -prone to variation. These include the precision of placing -compiler-note annotations, XREF support, and fancy debugger commands -(like “restart frameâ€). - - -File: slime.info, Node: Downloading, Next: Installation, Prev: Platforms, Up: Getting started - -2.2 Downloading SLIME -===================== - -You can choose between using a released version of SLIME or accessing -our Git repository directly. You can download the latest released -version from our website: - - - - We recommend that users who participate in the ‘slime-devel’ mailing -list use the Git version of the code. - -* Menu: - -* Git:: -* Git Incantations:: - - -File: slime.info, Node: Git, Next: Git Incantations, Up: Downloading - -2.2.1 Downloading from Git --------------------------- - -SLIME is available from the Git repository on ‘github.com’. You have -the option to use either the very latest code or the tagged -‘FAIRLY-STABLE’ snapshot. - - The latest version tends to have more features and fewer bugs than -the ‘FAIRLY-STABLE’ version, but it can be unstable during times of -major surgery. As a rule-of-thumb recommendation we suggest that if you -follow the ‘slime-devel’ mailing list then you’re better off with the -latest version (we’ll send a note when it’s undergoing major hacking). -If you don’t follow the mailing list you won’t know the status of the -latest code, so tracking ‘FAIRLY-STABLE’ or using a released version is -the safe option. - - If you download from Git then remember to ‘git pull’ occasionally. -Improvements are continually being committed, and the ‘FAIRLY-STABLE’ -tag is moved forward from time to time. - - -File: slime.info, Node: Git Incantations, Prev: Git, Up: Downloading - -2.2.2 Git incantations ----------------------- - -To download the very latest SLIME you first configure your ‘GitROOT’ and -login to the repository. - - git clone https://github.com/slime/slime.git - - You might substitute ‘https’ for ‘http’ if you’re having problems -with that protocol. - - If you want to hack on SLIME, use Github’s _fork_ functionality and -submit a _pull request_. Be sure to first read the CONTRIBUTING.md file -first. - - -File: slime.info, Node: Installation, Next: Running, Prev: Downloading, Up: Getting started - -2.3 Installation -================ - -The easiest way to install and keep SLIME up-to-date is using Emacs’s -built-in package manager. SLIME is available from the MELPA repository. -After setting up the MELPA repository, SLIME can be installed via ‘M-x -package-install RET slime RET’. You should then define your default -Lisp in your ‘.emacs’ as follows: - - (setq inferior-lisp-program "/opt/sbcl/bin/sbcl") - - At this point, you should be ready to start *note running SLIME: -Running. - - This is the minimal configuration with the fewest frills. If the -basic setup is working, you can try additional modules (*note Loading -Contribs::). - -2.3.1 Installing from Git -------------------------- - -If you’d rather install SLIME directly from its git repository, you will -need to add a few extra lines in your ‘.emacs’: - - ;; _Setup load-path, autoloads and your lisp system_ - ;; _Not needed if you install SLIME via MELPA_ - (add-to-list 'load-path "~/dir/to/cloned/slime") - (require 'slime-autoloads) - (setq inferior-lisp-program "/opt/sbcl/bin/sbcl") - - You may optionally byte-compile SLIME using ‘make compile -contrib-compile’. - - -File: slime.info, Node: Running, Next: Setup Tuning, Prev: Installation, Up: Getting started - -2.4 Running SLIME -================= - -SLIME is started with the Emacs command ‘M-x slime’. This uses the -‘inferior-lisp’ package to start a Lisp process, loads and starts the -Lisp-side server (known as “Swankâ€), and establishes a socket connection -between Emacs and Lisp. Finally a REPL buffer is created where you can -enter Lisp expressions for evaluation. - - At this point SLIME is up and running and you can start exploring. - - -File: slime.info, Node: Setup Tuning, Prev: Running, Up: Getting started - -2.5 Setup Tuning -================ - -This section explains ways to perform basic extensions to SLIME, and how -to configure SLIME for multiple Lisp systems and how to reduce SLIME’s -startup time. - - Please proceed with this section only if your basic setup works. If -you are happy with the basic setup, skip this section. - - For contrib modules *note Loading Contribs::. - -* Menu: - -* Basic customization:: -* Multiple Lisps:: -* Loading Swank faster:: - - -File: slime.info, Node: Basic customization, Next: Multiple Lisps, Up: Setup Tuning - -2.5.1 Basic customization -------------------------- - -Once you have the basic no-frills setup working, you can enhance your -SLIME installation with bundled extensions: - - ;; _Setup load-path, autoloads and your lisp system_ - (add-to-list 'load-path "~/dir/to/cloned/slime") - (require 'slime-autoloads) - - See *note Loading Contribs:: for more information on SLIME’s contrib -system. - - To customize a particular binding in one of SLIME’s keymaps, you can -add one of the following to your init file: - - (add-hook 'slime-load-hook - (lambda () - (define-key slime-prefix-map (kbd "M-h") 'slime-documentation-lookup))) - - The former technique works only for SLIME’s core keymaps, not it’s -contribs’. For those you can use the latter form which works for any -Emacs library. See also *note Customization:: for more advanced -configuration options. - - -File: slime.info, Node: Multiple Lisps, Next: Loading Swank faster, Prev: Basic customization, Up: Setup Tuning - -2.5.2 Multiple Lisps --------------------- - -By default, the command ‘M-x slime’ starts the program specified with -‘inferior-lisp-program’. If you invoke ‘M-x slime’ with a prefix -argument, Emacs prompts for the program which should be started instead. -If you need that frequently or if the command involves long filenames -it’s more convenient to set the ‘slime-lisp-implementations’ variable in -your ‘.emacs’. For example here we define two programs: - - (setq slime-lisp-implementations - '((cmucl ("cmucl" "-quiet")) - (sbcl ("/opt/sbcl/bin/sbcl") :coding-system utf-8-unix))) - - This variable holds a list of programs and if you invoke SLIME with a -negative prefix argument, ‘M-- M-x slime’, you can select a program from -that list. When called without a prefix, either the name specified in -‘slime-default-lisp’, or the first item of the list will be used. The -elements of the list should look like - - (NAME (PROGRAM PROGRAM-ARGS...) &key CODING-SYSTEM INIT INIT-FUNCTION ENV) - -‘NAME’ - is a symbol and is used to identify the program. -‘PROGRAM’ - is the filename of the program. Note that the filename can contain - spaces. -‘PROGRAM-ARGS’ - is a list of command line arguments. -‘CODING-SYSTEM’ - the coding system for the connection. (*note - slime-net-coding-system::)x -‘INIT’ - should be a function which takes two arguments: a filename and a - character encoding. The function should return a Lisp expression - as a string which instructs Lisp to start the Swank server and to - write the port number to the file. At startup, SLIME starts the - Lisp process and sends the result of this function to Lisp’s - standard input. As default, ‘slime-init-command’ is used. An - example is shown in *note Loading Swank faster: init-example. -‘INIT-FUNCTION’ - should be a function which takes no arguments. It is called after - the connection is established. (See also *note - slime-connected-hook::.) -‘ENV’ - specifies a list of environment variables for the subprocess. E.g. - (sbcl-cvs ("/home/me/sbcl-cvs/src/runtime/sbcl" - "--core" "/home/me/sbcl-cvs/output/sbcl.core") - :env ("SBCL_HOME=/home/me/sbcl-cvs/contrib/")) - initializes ‘SBCL_HOME’ in the subprocess. - - -File: slime.info, Node: Loading Swank faster, Prev: Multiple Lisps, Up: Setup Tuning - -2.5.3 Loading Swank faster --------------------------- - -For SBCL, we recommend that you create a custom core file with socket -support and POSIX bindings included because those modules take the most -time to load. To create such a core, execute the following steps: - - shell$ sbcl - * (mapc 'require '(sb-bsd-sockets sb-posix sb-introspect sb-cltl2 asdf)) - * (save-lisp-and-die "sbcl.core-for-slime") - - After that, add something like this to your ‘.emacs’: - - (setq slime-lisp-implementations - '((sbcl ("sbcl" "--core" "sbcl.core-for-slime")))) - - For maximum startup speed you can include the Swank server directly -in a core file. The disadvantage of this approach is that the setup is -a bit more involved and that you need to create a new core file when you -want to update SLIME or SBCL. The steps to execute are: - - shell$ sbcl - * (load ".../slime/swank-loader.lisp") - * (swank-loader:dump-image "sbcl.core-with-swank") - -Then add this to your ‘.emacs’: - - (setq slime-lisp-implementations - '((sbcl ("sbcl" "--core" "sbcl.core-with-swank") - :init (lambda (port-file _) - (format "(swank:start-server %S)\n" port-file))))) - -Similar setups should also work for other Lisp implementations. - - -File: slime.info, Node: SLIME mode, Next: Debugger, Prev: Getting started, Up: Top - -3 Using Slime mode -****************** - -SLIME’s commands are provided via ‘slime-mode’, a minor-mode used in -conjunction with Emacs’s ‘lisp-mode’. This chapter describes the -‘slime-mode’ and its relatives. - -* Menu: - -* User-interface conventions:: -* Evaluation:: -* Compilation:: -* Completion:: -* Finding definitions:: -* Documentation:: -* Cross-reference:: -* Macro-expansion:: -* Disassembly:: -* Recovery:: -* Inspector:: -* Profiling:: -* Other:: -* Semantic indentation:: -* Reader conditionals:: - - -File: slime.info, Node: User-interface conventions, Next: Evaluation, Up: SLIME mode - -3.1 User-interface conventions -============================== - -To use SLIME comfortably it is important to understand a few “global†-user-interface characteristics. The most important principles are -described in this section. - -* Menu: - -* Temporary buffers:: -* Inferior-lisp:: -* Multithreading:: -* Key bindings:: - - -File: slime.info, Node: Temporary buffers, Next: Inferior-lisp, Up: User-interface conventions - -3.1.1 Temporary buffers ------------------------ - -Some SLIME commands create temporary buffers to display their results. -Although these buffers usually have their own special-purpose -major-modes, certain conventions are observed throughout. - - Temporary buffers can be dismissed by pressing ‘q’. This kills the -buffer and restores the window configuration as it was before the buffer -was displayed. Temporary buffers can also be killed with the usual -commands like ‘kill-buffer’, in which case the previous window -configuration won’t be restored. - - Pressing ‘RET’ is supposed to “do the most obvious useful thing.†For -instance, in an apropos buffer this prints a full description of the -symbol at point, and in an XREF buffer it displays the source code for -the reference at point. This convention is inherited from Emacs’s own -buffers for apropos listings, compilation results, etc. - - Temporary buffers containing Lisp symbols use ‘slime-mode’ in -addition to any special mode of their own. This makes the usual SLIME -commands available for describing symbols, looking up function -definitions, and so on. - - Initial focus of those “description†buffers depends on the variable -‘slime-description-autofocus’. If ‘nil’ (the default), description -buffers do not receive focus automatically, and vice versa. - - -File: slime.info, Node: Inferior-lisp, Next: Multithreading, Prev: Temporary buffers, Up: User-interface conventions - -3.1.2 ‘*inferior-lisp*’ buffer ------------------------------- - -SLIME internally uses the ‘comint’ package to start Lisp processes. -This has a few user-visible consequences, some good and some -not-so-terribly. To avoid confusion it is useful to understand the -interactions. - - The buffer ‘*inferior-lisp*’ contains the Lisp process’s own -top-level. This direct access to Lisp is useful for troubleshooting, -and some degree of SLIME integration is available using the -inferior-slime-mode. Many people load the better integrated SLIME REPL -contrib module (*note REPL::) and ignore the ‘*inferior-lisp*’ buffer. -(*note Loading Contribs:: for information on how to enable the REPL.) - - -File: slime.info, Node: Multithreading, Next: Key bindings, Prev: Inferior-lisp, Up: User-interface conventions - -3.1.3 Multithreading --------------------- - -If the Lisp system supports multithreading, SLIME spawns a new thread -for each request, e.g., ‘C-x C-e’ creates a new thread to evaluate the -expression. An exception to this rule are requests from the REPL: all -commands entered in the REPL buffer are evaluated in a dedicated REPL -thread. - - Some complications arise with multithreading and special variables. -Non-global special bindings are thread-local, e.g., changing the value -of a let bound special variable in one thread has no effect on the -binding of the variables with the same name in other threads. This -makes it sometimes difficult to change the printer or reader behaviour -for new threads. The variable ‘swank:*default-worker-thread-bindings*’ -was introduced for such situations: instead of modifying the global -value of a variable, add a binding the -‘swank:*default-worker-thread-bindings*’. E.g., with the following -code, new threads will read floating point values as doubles by default: - - (push '(*read-default-float-format* . double-float) - swank:*default-worker-thread-bindings*). - - -File: slime.info, Node: Key bindings, Prev: Multithreading, Up: User-interface conventions - -3.1.4 Key bindings ------------------- - -In general we try to make our key bindings fit with the overall Emacs -style. We also have the following somewhat unusual convention of our -own: when entering a three-key sequence, the final key can be pressed -either with control or unmodified. For example, the -‘slime-describe-symbol’ command is bound to ‘C-c C-d d’, but it also -works to type ‘C-c C-d C-d’. We’re simply binding both key sequences -because some people like to hold control for all three keys and others -don’t, and with the two-key prefix we’re not afraid of running out of -keys. - - There is one exception to this rule, just to trip you up. We never -bind ‘C-h’ anywhere in a key sequence, so ‘C-c C-d C-h’ doesn’t do the -same thing as ‘C-c C-d h’. This is because Emacs has a built-in default -so that typing a prefix followed by ‘C-h’ will display all bindings -starting with that prefix, so ‘C-c C-d C-h’ will actually list the -bindings for all documentation commands. This feature is just a bit too -useful to clobber! - - “Are you deliberately spiting Emacs’s brilliant online help - facilities? The gods will be angry!†- -This is a brilliant piece of advice. The Emacs online help facilities -are your most immediate, up-to-date and complete resource for keybinding -information. They are your friends: - -‘C-h k ’ - ‘describe-key’ “What does this key do?†- Describes current function bound to ‘’ for focus buffer. - -‘C-h b’ - ‘describe-bindings’ “Exactly what bindings are available?†- Lists the current key-bindings for the focus buffer. - -‘C-h m’ - ‘describe-mode’ “Tell me all about this mode†- Shows all the available major mode keys, then the minor mode keys, - for the modes of the focus buffer. - -‘C-h l’ - ‘view-lossage’ “Woah, what key chord did I just do?†- Shows you the literal sequence of keys you’ve pressed in order. - - _Note:_ In this documentation the designation ‘C-h’ is a “canonical -key†which might actually mean Ctrl-h, or F1, or whatever you have -‘help-command’ bound to in your ‘.emacs’. Here is a common situation: - - (global-set-key [f1] 'help-command) - (global-set-key "\C-h" 'delete-backward-char) - -In this situation everywhere you see ‘C-h’ in the documentation you -would substitute ‘F1’. - - You can assign or change default key bindings globally using the -‘global-set-key’ function in your ‘~/.emacs’ file like this: - (global-set-key "\C-c s" 'slime-selector) -which binds ‘C-c s’ to the function ‘slime-selector’. - - Alternatively, if you want to assign or change a key binding in just -a particular slime mode, you can use the ‘define-key’ function in your -‘~/.emacs’ file like this: - (define-key slime-repl-mode-map (kbd "C-c ;") - 'slime-insert-balanced-comments) -which binds ‘C-c ;’ to the function ‘slime-insert-balanced-comments’ in -the REPL buffer. - - -File: slime.info, Node: Evaluation, Next: Compilation, Prev: User-interface conventions, Up: SLIME mode - -3.2 Evaluation commands -======================= - -These commands each evaluate a Common Lisp expression in a different -way. Usually they mimic commands for evaluating Emacs Lisp code. By -default they show their results in the echo area, but a prefix argument -causes the results to be inserted in the current buffer. - -‘C-x C-e’ -‘M-x slime-eval-last-expression’ - - Evaluate the expression before point and show the result in the - echo area. - -‘C-M-x’ -‘M-x slime-eval-defun’ - Evaluate the current toplevel form and show the result in the echo - area. ‘C-M-x’ treats ‘defvar’ expressions specially. Normally, - evaluating a ‘defvar’ expression does nothing if the variable it - defines already has a value. But ‘C-M-x’ unconditionally resets - the variable to the initial value specified in the ‘defvar’ - expression. This special feature is convenient for debugging Lisp - programs. - - If ‘C-M-x’ or ‘C-x C-e’ is given a numeric argument, it inserts the -value into the current buffer, rather than displaying it in the echo -area. - -‘C-c :’ -‘M-x slime-interactive-eval’ - Evaluate an expression read from the minibuffer. - -‘C-c C-r’ -‘M-x slime-eval-region’ - Evaluate the region. - -‘C-c C-p’ -‘M-x slime-pprint-eval-last-expression’ - Evaluate the expression before point and pretty-print the result in - a fresh buffer. - -‘C-c E’ -‘M-x slime-edit-value’ - Edit the value of a setf-able form in a new buffer ‘*Edit
*’. - The value is inserted into a temporary buffer for editing and then - set in Lisp when committed with ‘C-c C-c’. - -‘C-c C-u’ -‘M-x slime-undefine-function’ - Undefine the function, with ‘fmakunbound’, for the symbol at point. - - -File: slime.info, Node: Compilation, Next: Completion, Prev: Evaluation, Up: SLIME mode - -3.3 Compilation commands -======================== - -SLIME has fancy commands for compiling functions, files, and packages. -The fancy part is that notes and warnings offered by the Lisp compiler -are intercepted and annotated directly onto the corresponding -expressions in the Lisp source buffer. (Give it a try to see what this -means.) - -‘C-c C-c’ -‘M-x slime-compile-defun’ - Compile the top-level form at point. The region blinks shortly to - give some feedback which part was chosen. - - With (positive) prefix argument the form is compiled with maximal - debug settings (‘C-u C-c C-c’). With negative prefix argument it - is compiled for speed (‘M-- C-c C-c’). If a numeric argument is - passed set debug or speed settings to it depending on its sign. - - The code for the region is executed after compilation. In - principle, the command writes the region to a file, compiles that - file, and loads the resulting code. - -‘C-c C-k’ -‘M-x slime-compile-and-load-file’ - Compile and load the current buffer’s source file. If the - compilation step fails, the file is not loaded. It’s not always - easy to tell whether the compilation failed: occasionally you may - end up in the debugger during the load step. - - With (positive) prefix argument the file is compiled with maximal - debug settings (‘C-u C-c C-k’). With negative prefix argument it - is compiled for speed (‘M-- C-c C-k’). If a numeric argument is - passed set debug or speed settings to it depending on its sign. - -‘C-c M-k’ -‘M-x slime-compile-file’ - Compile (but don’t load) the current buffer’s source file. - -‘C-c C-l’ -‘M-x slime-load-file’ - Load a Lisp file. This command uses the Common Lisp LOAD function. - -‘M-x slime-compile-region’ - Compile the selected region. - - The annotations are indicated as underlining on source forms. The -compiler message associated with an annotation can be read either by -placing the mouse over the text or with the selection commands below. - -‘M-n’ -‘M-x slime-next-note’ - Move the point to the next compiler note and displays the note. - -‘M-p’ -‘M-x slime-previous-note’ - Move the point to the previous compiler note and displays the note. - -‘C-c M-c’ -‘M-x slime-remove-notes’ - Remove all annotations from the buffer. - -‘C-x `’ -‘M-x next-error’ - Visit the next-error message. This is not actually a SLIME command - but SLIME creates a hidden buffer so that most of the Compilation - mode commands (*note (emacs)Compilation Mode::) work similarly for - Lisp as for batch compilers. - - -File: slime.info, Node: Completion, Next: Finding definitions, Prev: Compilation, Up: SLIME mode - -3.4 Completion commands -======================= - -Completion commands are used to complete a symbol or form based on what -is already present at point. Classical completion assumes an exact -prefix and gives choices only where branches may occur. Fuzzy -completion tries harder. - -‘M-TAB’ -‘M-x slime-complete-symbol’ - Complete the symbol at point. Note that three styles of completion - are available in SLIME; the default is similar to normal Emacs - completion (*note slime-completion-at-point-functions::). - - -File: slime.info, Node: Finding definitions, Next: Documentation, Prev: Completion, Up: SLIME mode - -3.5 Finding definitions (“Meta-Point†commands). -================================================ - -The familiar ‘M-.’ command is provided. For generic functions this -command finds all methods, and with some systems it does other fancy -things (like tracing structure accessors to their ‘DEFSTRUCT’ -definition). - -‘M-.’ -‘M-x slime-edit-definition’ - Go to the definition of the symbol at point. - -‘M-,’ -‘M-*’ -‘M-x slime-pop-find-definition-stack’ - Go back to the point where ‘M-.’ was invoked. This gives - multi-level backtracking when ‘M-.’ has been used several times. - -‘C-x 4 .’ -‘M-x slime-edit-definition-other-window’ - Like ‘slime-edit-definition’ but switches to the other window to - edit the definition in. - -‘C-x 5 .’ -‘M-x slime-edit-definition-other-frame’ - Like ‘slime-edit-definition’ but opens another frame to edit the - definition in. - -‘M-x slime-edit-definition-with-etags’ - Use an ETAGS table to find definition at point. - - -File: slime.info, Node: Documentation, Next: Cross-reference, Prev: Finding definitions, Up: SLIME mode - -3.6 Documentation commands -========================== - -SLIME’s online documentation commands follow the example of Emacs Lisp. -The commands all share the common prefix ‘C-c C-d’ and allow the final -key to be modified or unmodified (*note Key bindings::.) - -‘SPC’ -‘M-x slime-space’ - The space key inserts a space, but also looks up and displays the - argument list for the function at point, if there is one. - -‘C-c C-d d’ -‘M-x slime-describe-symbol’ - Describe the symbol at point. - -‘C-c C-d f’ -‘M-x slime-describe-function’ - Describe the function at point. - -‘C-c C-d A’ -‘M-x slime-apropos’ - Perform an apropos search on Lisp symbol names for a regular - expression match and display their documentation strings. By - default the external symbols of all packages are searched. With a - prefix argument you can choose a specific package and whether to - include unexported symbols. - -‘C-c C-d z’ -‘M-x slime-apropos-all’ - Like ‘slime-apropos’ but also includes internal symbols by default. - -‘C-c C-d p’ -‘M-x slime-apropos-package’ - Show apropos results of all symbols in a package. This command is - for browsing a package at a high-level. With package-name - completion it also serves as a rudimentary Smalltalk-ish - image-browser. - -‘C-c C-d h’ -‘M-x slime-hyperspec-lookup’ - Lookup the symbol at point in the ‘Common Lisp Hyperspec’. This - uses the familiar ‘hyperspec.el’ to show the appropriate section in - a web browser. The Hyperspec is found either on the Web or in - ‘common-lisp-hyperspec-root’, and the browser is selected by - ‘browse-url-browser-function’. - - Note: this is one case where ‘C-c C-d h’ is _not_ the same as ‘C-c - C-d C-h’. - -‘C-c C-d ~’ -‘M-x hyperspec-lookup-format’ - Lookup a _format character_ in the ‘Common Lisp Hyperspec’. - -‘C-c C-d #’ -‘M-x hyperspec-lookup-reader-macro’ - Lookup a _reader macro_ in the ‘Common Lisp Hyperspec’. - - -File: slime.info, Node: Cross-reference, Next: Macro-expansion, Prev: Documentation, Up: SLIME mode - -3.7 Cross-reference commands -============================ - -SLIME’s cross-reference commands are based on the support provided by -the Lisp system, which varies widely between Lisps. For systems with no -built-in XREF support SLIME queries a portable XREF package, which is -taken from the ‘CMU AI Repository’ and bundled with SLIME. - - Each command operates on the symbol at point, or prompts if there is -none. With a prefix argument they always prompt. You can either enter -the key bindings as shown here or with the control modified on the last -key, *Note Key bindings::. - -* Menu: - -* Xref buffer commands:: - -‘C-c C-w c’ -‘M-x slime-who-calls’ - Show function callers. - -‘C-c C-w w’ -‘M-x slime-calls-who’ - Show all known callees. - -‘C-c C-w r’ -‘M-x slime-who-references’ - Show references to global variable. - -‘C-c C-w b’ -‘M-x slime-who-binds’ - Show bindings of a global variable. - -‘C-c C-w s’ -‘M-x slime-who-sets’ - Show assignments to a global variable. - -‘C-c C-w m’ -‘M-x slime-who-macroexpands’ - Show expansions of a macro. - -‘M-x slime-who-specializes’ - Show all known methods specialized on a class. - - There are also “List callers/callees†commands. These operate by -rummaging through function objects on the heap at a low-level to -discover the call graph. They are only available with some Lisp -systems, and are most useful as a fallback when precise XREF information -is unavailable. - -‘C-c <’ -‘M-x slime-list-callers’ - List callers of a function. - -‘C-c >’ -‘M-x slime-list-callees’ - List callees of a function. - - -File: slime.info, Node: Xref buffer commands, Up: Cross-reference - -3.7.1 Xref buffer commands --------------------------- - -Commands available in Xref buffers - -‘RET’ -‘M-x slime-show-xref’ - Show definition at point in the other window. Do not leave Xref - buffer. - -‘Space’ -‘M-x slime-goto-xref’ - Show definition at point in the other window and close Xref buffer. - -‘C-c C-c’ -‘M-x slime-recompile-xref’ - Recompile definition at point. - -‘C-c C-k’ -‘M-x slime-recompile-all-xrefs’ - Recompile all definitions. - - -File: slime.info, Node: Macro-expansion, Next: Disassembly, Prev: Cross-reference, Up: SLIME mode - -3.8 Macro-expansion commands -============================ - -‘C-c C-m’ -‘M-x slime-expand-1’ - Macroexpand (or compiler-macroexpand) the expression starting at - point once. If invoked with a prefix argument use macroexpand - instead or macroexpand-1 (or compiler-macroexpand instead of - compiler-macroexpand-1). - -‘M-x slime-macroexpand-1’ - Macroexpand the expression starting at point once. If invoked with - a prefix argument, use macroexpand instead of macroexpand-1. - -‘C-c M-m’ -‘M-x slime-macroexpand-all’ - Fully macroexpand the expression starting at point. - -‘M-x slime-compiler-macroexpand-1’ - Display the compiler-macro expansion of sexp starting at point. - -‘M-x slime-compiler-macroexpand’ - Repeatedly expand compiler macros of sexp starting at point. - - For additional minor-mode commands and discussion, *note -slime-macroexpansion-minor-mode::. - - -File: slime.info, Node: Disassembly, Next: Recovery, Prev: Macro-expansion, Up: SLIME mode - -3.9 Disassembly commands -======================== - -‘C-c M-d’ -‘M-x slime-disassemble-symbol’ - Disassemble the function definition of the symbol at point. - -‘C-c C-t’ -‘M-x slime-toggle-trace-fdefinition’ - Toggle tracing of the function at point. If invoked with a prefix - argument, read additional information, like which particular method - should be traced. - -‘M-x slime-untrace-all’ - Untrace all functions. - - -File: slime.info, Node: Recovery, Next: Inspector, Prev: Disassembly, Up: SLIME mode - -3.10 Abort/Recovery commands -============================ - -‘C-c C-b’ -‘M-x slime-interrupt’ - Interrupt Lisp (send ‘SIGINT’). - -‘M-x slime-restart-inferior-lisp’ - Restart the ‘inferior-lisp’ process. - -‘C-c ~’ -‘M-x slime-sync-package-and-default-directory’ - Synchronize the current package and working directory from Emacs to - Lisp. - -‘C-c M-p’ -‘M-x slime-repl-set-package’ - Set the current package of the REPL. - -‘M-x slime-cd’ - Set the current directory of the Lisp process. This also changes - the current directory of the REPL buffer. - -‘M-x slime-pwd’ - Print the current directory of the Lisp process. - - -File: slime.info, Node: Inspector, Next: Profiling, Prev: Recovery, Up: SLIME mode - -3.11 Inspector commands -======================= - -The SLIME inspector is a Emacs-based alternative to the standard -‘INSPECT’ function. The inspector presents objects in Emacs buffers -using a combination of plain text, hyperlinks to related objects. - - The inspector can easily be specialized for the objects in your own -programs. For details see the ‘inspect-for-emacs’ generic function in -‘swank/backend.lisp’. - -‘C-c I’ -‘M-x slime-inspect’ - Inspect the value of an expression entered in the minibuffer. - - The standard commands available in the inspector are: - -‘RET’ -‘M-x slime-inspector-operate-on-point’ - If point is on a value then recursively call the inspector on that - value. If point is on an action then call that action. - -‘d’ -‘M-x slime-inspector-describe’ - Describe the slot at point. - -‘e’ -‘M-x slime-inspector-eval’ - Evaluate an expression in the context of the inspected object. The - variable ‘*’ will be bound to the inspected object. - -‘v’ -‘M-x slime-inspector-toggle-verbose’ - Toggle between verbose and terse mode. Default is determined by - ‘swank:*inspector-verbose*’. - -‘l’ -‘M-x slime-inspector-pop’ - Go back to the previous object (return from ‘RET’). - -‘n’ -‘M-x slime-inspector-next’ - The inverse of ‘l’. Also bound to ‘SPC’. - -‘g’ -‘M-x slime-inspector-reinspect’ - Reinspect. - -‘q’ -‘M-x slime-inspector-quit’ - Dismiss the inspector buffer. - -‘p’ -‘M-x slime-inspector-pprint’ - Pretty print in another buffer object at point. - -‘.’ -‘M-x slime-inspector-show-source’ - Find source of object at point. - -‘>’ -‘M-x slime-inspector-fetch-all’ - Fetch all inspector contents and go to the end. - -‘M-RET’ -‘M-x slime-inspector-copy-down’ - Store the value under point in the variable ‘*’. This can then be - used to access the object in the REPL. - -‘TAB, M-x slime-inspector-next-inspectable-object’ -‘S-TAB, M-x slime-inspector-previous-inspectable-object’ - - Jump to the next and previous inspectable object respectively. - - -File: slime.info, Node: Profiling, Next: Other, Prev: Inspector, Up: SLIME mode - -3.12 Profiling commands -======================= - -The profiling commands are based on CMUCL’s profiler. These are simple -wrappers around functions which usually print something to the output -buffer. - -‘M-x slime-toggle-profile-fdefinition’ - Toggle profiling of a function. -‘M-x slime-profile-package’ - Profile all functions in a package. -‘M-x slime-profile-by-substring’ - Profile all functions which names contain a substring. -‘M-x slime-unprofile-all’ - Unprofile all functions. -‘M-x slime-profile-report’ - Report profiler data. -‘M-x slime-profile-reset’ - Reset profiler data. -‘M-x slime-profiled-functions’ - Show list of currently profiled functions. - - -File: slime.info, Node: Other, Next: Semantic indentation, Prev: Profiling, Up: SLIME mode - -3.13 Shadowed Commands -====================== - -‘C-c C-a, M-x slime-nop’ -‘C-c C-v, M-x slime-nop’ - This key-binding is shadowed from inf-lisp. - - -File: slime.info, Node: Semantic indentation, Next: Reader conditionals, Prev: Other, Up: SLIME mode - -3.14 Semantic indentation -========================= - -SLIME automatically discovers how to indent the macros in your Lisp -system. To do this the Lisp side scans all the macros in the system and -reports to Emacs all the ones with ‘&body’ arguments. Emacs then -indents these specially, putting the first arguments four spaces in and -the “body†arguments just two spaces, as usual. - - This should “just work.†If you are a lucky sort of person you -needn’t read the rest of this section. - - To simplify the implementation, SLIME doesn’t distinguish between -macros with the same symbol-name but different packages. This makes it -fit nicely with Emacs’s indentation code. However, if you do have -several macros with the same symbol-name then they will all be indented -the same way, arbitrarily using the style from one of their arglists. -You can find out which symbols are involved in collisions with: - - (swank:print-indentation-lossage) - - If a collision causes you irritation, don’t have a nervous breakdown, -just override the Elisp symbol’s ‘common-lisp-indent-function’ property -to your taste. SLIME won’t override your custom settings, it just tries -to give you good defaults. - - A more subtle issue is that imperfect caching is used for the sake of -performance. (1) - - In an ideal world, Lisp would automatically scan every symbol for -indentation changes after each command from Emacs. However, this is too -expensive to do every time. Instead Lisp usually just scans the symbols -whose home package matches the one used by the Emacs buffer where the -request comes from. That is sufficient to pick up the indentation of -most interactively-defined macros. To catch the rest we make a full -scan of every symbol each time a new Lisp package is created between -commands – that takes care of things like new systems being loaded. - - You can use ‘M-x slime-update-indentation’ to force all symbols to be -scanned for indentation information. - - ---------- Footnotes ---------- - - (1) _Of course_ we made sure it was actually too slow before making -the ugly optimization. - - -File: slime.info, Node: Reader conditionals, Prev: Semantic indentation, Up: SLIME mode - -3.15 Reader conditional fontification -===================================== - -SLIME automatically evaluates reader-conditional expressions, like -‘#+linux’, in source buffers and “grays out†code that will be skipped -for the current Lisp connection. - - -File: slime.info, Node: Debugger, Next: Misc, Prev: SLIME mode, Up: Top - -4 SLDB: the SLIME debugger -************************** - -SLIME has a custom Emacs-based debugger called SLDB. Conditions -signalled in the Lisp system invoke SLDB in Emacs by way of the Lisp -‘*DEBUGGER-HOOK*’. - - SLDB pops up a buffer when a condition is signalled. The buffer -displays a description of the condition, a list of restarts, and a -backtrace. Commands are offered for invoking restarts, examining the -backtrace, and poking around in stack frames. - -* Menu: - -* Examining frames:: -* Restarts:: -* Frame Navigation:: -* Stepping:: -* Miscellaneous:: - - -File: slime.info, Node: Examining frames, Next: Restarts, Up: Debugger - -4.1 Examining frames -==================== - -Commands for examining the stack frame at point. - -‘t’ -‘M-x sldb-toggle-details’ - Toggle display of local variables and ‘CATCH’ tags. - -‘v’ -‘M-x sldb-show-source’ - View the frame’s current source expression. The expression is - presented in the Lisp source file’s buffer. - -‘e’ -‘M-x sldb-eval-in-frame’ - Evaluate an expression in the frame. The expression can refer to - the available local variables in the frame. - -‘d’ -‘M-x sldb-pprint-eval-in-frame’ - Evaluate an expression in the frame and pretty-print the result in - a temporary buffer. - -‘D’ -‘M-x sldb-disassemble’ - Disassemble the frame’s function. Includes information such as the - instruction pointer within the frame. - -‘i’ -‘M-x sldb-inspect-in-frame’ - Inspect the result of evaluating an expression in the frame. - -‘C-c C-c’ -‘M-x sldb-recompile-frame-source’ - Recompile frame. ‘C-u C-c C-c’ for recompiling with maximum debug - settings. - - -File: slime.info, Node: Restarts, Next: Frame Navigation, Prev: Examining frames, Up: Debugger - -4.2 Invoking restarts -===================== - -‘a’ -‘M-x sldb-abort’ - Invoke the ‘ABORT’ restart. - -‘q’ -‘M-x sldb-quit’ - “Quit†– For SLIME evaluation requests, invoke a restart which - restores to a known program state. For errors in other threads, - see *note *SLDB-QUIT-RESTART*::. - -‘c’ -‘M-x sldb-continue’ - Invoke the ‘CONTINUE’ restart. - -‘0 ... 9’ - Invoke a restart by number. - - Restarts can also be invoked by pressing ‘RET’ or ‘Mouse-2’ on them -in the buffer. - - -File: slime.info, Node: Frame Navigation, Next: Stepping, Prev: Restarts, Up: Debugger - -4.3 Navigating between frames -============================= - -‘n, M-x sldb-down’ -‘p, M-x sldb-up’ - Move between frames. - -‘M-n, M-x sldb-details-down’ -‘M-p, M-x sldb-details-up’ - Move between frames “with sugarâ€: hide the details of the original - frame and display the details and source code of the next. Sugared - motion makes you see the details and source code for the current - frame only. - -‘>’ -‘M-x sldb-end-of-backtrace’ - Fetch the entire backtrace and go to the last frame. - -‘<’ -‘M-x sldb-beginning-of-backtrace’ - Goto the first frame. - - -File: slime.info, Node: Stepping, Next: Miscellaneous, Prev: Frame Navigation, Up: Debugger - -4.4 Stepping -============ - -Stepping is not available in all implementations and works very -differently in those in which it is available. - -‘s’ -‘M-x sldb-step’ - Step to the next expression in the frame. For CMUCL that means, - set a breakpoint at all those code locations in the current code - block which are reachable from the current code location. - -‘x’ -‘M-x sldb-next’ - Step to the next form in the current function. - -‘o’ -‘M-x sldb-out’ - Stop single-stepping temporarily, but resume it once the current - function returns. - - -File: slime.info, Node: Miscellaneous, Prev: Stepping, Up: Debugger - -4.5 Miscellaneous Commands -========================== - -‘r’ -‘M-x sldb-restart-frame’ - Restart execution of the frame with the same arguments it was - originally called with. (This command is not available in all - implementations.) - -‘R’ -‘M-x sldb-return-from-frame’ - Return from the frame with a value entered in the minibuffer. - (This command is not available in all implementations.) - -‘B’ -‘M-x sldb-break-with-default-debugger’ - Exit SLDB and debug the condition using the Lisp system’s default - debugger. - -‘C’ -‘M-x sldb-inspect-condition’ - Inspect the condition currently being debugged. - -‘:’ -‘M-x slime-interactive-eval’ - Evaluate an expression entered in the minibuffer. -‘A’ -‘M-x sldb-break-with-system-debugger’ - Attach debugger (e.g. gdb) to the current lisp process. - - -File: slime.info, Node: Misc, Next: Customization, Prev: Debugger, Up: Top - -5 Misc -****** - -* Menu: - -* slime-selector:: -* slime-macroexpansion-minor-mode:: -* Multiple connections:: - - -File: slime.info, Node: slime-selector, Next: slime-macroexpansion-minor-mode, Up: Misc - -5.1 ‘slime-selector’ -==================== - -The ‘slime-selector’ command is for quickly switching to important -buffers: the REPL, SLDB, the Lisp source you were just hacking, etc. -Once invoked the command prompts for a single letter to specify which -buffer it should display. Here are some of the options: - -‘?’ - A help buffer listing all ‘slime-selectors’’s available buffers. -‘r’ - The REPL buffer for the current SLIME connection. -‘d’ - The most recently activated SLDB buffer for the current connection. -‘l’ - The most recently visited ‘lisp-mode’ source buffer. -‘s’ - The ‘*slime-scratch*’ buffer (*note slime-scratch::). -‘c’ - SLIME connections buffer (*note Multiple connections::). -‘n’ - Cycle to the next Lisp connection (*note Multiple connections::). -‘t’ - SLIME threads buffer (*note Multiple connections::). - - ‘slime-selector’ doesn’t have a key binding by default but we suggest -that you assign it a global one. You can bind it to ‘C-c s’ like this: - - (global-set-key "\C-cs" 'slime-selector) - -And then you can switch to the REPL from anywhere with ‘C-c s r’. - - The macro ‘def-slime-selector-method’ can be used to define new -buffers for ‘slime-selector’ to find. - - -File: slime.info, Node: slime-macroexpansion-minor-mode, Next: Multiple connections, Prev: slime-selector, Up: Misc - -5.2 slime-macroexpansion-minor-mode -=================================== - -Within a slime macroexpansion buffer some extra commands are provided -(these commands are always available but are only bound to keys in a -macroexpansion buffer). - -‘C-c C-m’ -‘M-x slime-macroexpand-1-inplace’ - Just like slime-macroexpand-1 but the original form is replaced - with the expansion. - -‘g’ -‘M-x slime-macroexpand-1-inplace’ - The last macroexpansion is performed again, the current contents of - the macroexpansion buffer are replaced with the new expansion. - -‘q’ -‘M-x slime-temp-buffer-quit’ - Close the expansion buffer. - -‘C-_’ -‘M-x slime-macroexpand-undo’ - Undo last macroexpansion operation. - - -File: slime.info, Node: Multiple connections, Prev: slime-macroexpansion-minor-mode, Up: Misc - -5.3 Multiple connections -======================== - -SLIME is able to connect to multiple Lisp processes at the same time. -The ‘M-x slime’ command, when invoked with a prefix argument, will offer -to create an additional Lisp process if one is already running. This is -often convenient, but it requires some understanding to make sure that -your SLIME commands execute in the Lisp that you expect them to. - - Some buffers are tied to specific Lisp processes. Each Lisp -connection has its own REPL buffer, and all expressions entered or SLIME -commands invoked in that buffer are sent to the associated connection. -Other buffers created by SLIME are similarly tied to the connections -they originate from, including SLDB buffers, apropos result listings, -and so on. These buffers are the result of some interaction with a Lisp -process, so commands in them always go back to that same process. - - Commands executed in other places, such as ‘slime-mode’ source -buffers, always use the “default†connection. Usually this is the most -recently established connection, but this can be reassigned via the -“connection list†buffer: - -‘C-c C-x c’ -‘M-x slime-list-connections’ - Pop up a buffer listing the established connections. It is also - available by the typing ‘c’ from the SLIME selector (*note - slime-selector::). - -‘C-c C-x n’ -‘M-x slime-cycle-connections’ - Change current Lisp connection by cycling through all connections. - It is also available by the typing ‘n’ from the SLIME selector - (*note slime-selector::). - -‘C-c C-x t’ -‘M-x slime-list-threads’ - Pop up a buffer listing the current threads. It is also available - by the typing ‘t’ from the SLIME selector (*note slime-selector::). - - The buffer displayed by ‘slime-list-connections’ gives a one-line -summary of each connection. The summary shows the connection’s serial -number, the name of the Lisp implementation, and other details of the -Lisp process. The current “default†connection is indicated with an -asterisk. - - The commands available in the connection-list buffer are: - -‘RET’ -‘M-x slime-goto-connection’ - Pop to the REPL buffer of the connection at point. - -‘d’ -‘M-x slime-connection-list-make-default’ - Make the connection at point the “default†connection. It will - then be used for commands in ‘slime-mode’ source buffers. - -‘g’ -‘M-x slime-update-connection-list’ - Update the connection list in the buffer. - -‘q’ -‘M-x slime-temp-buffer-quit’ - Quit the connection list (kill buffer, restore window - configuration). - -‘R’ -‘M-x slime-restart-connection-at-point’ - Restart the Lisp process for the connection at point. - -‘M-x slime-connect’ - Connect to a running Swank server. - -‘M-x slime-disconnect’ - Disconnect all connections. - -‘M-x slime-abort-connection’ - Abort the current attempt to connect. - - -File: slime.info, Node: Customization, Next: Tips and Tricks, Prev: Misc, Up: Top - -6 Customization -*************** - -* Menu: - -* Emacs-side customization:: -* Lisp-side:: - - -File: slime.info, Node: Emacs-side customization, Next: Lisp-side, Up: Customization - -6.1 Emacs-side -============== - -The Emacs part of SLIME can be configured with the Emacs ‘customize’ -system, just use ‘M-x customize-group slime RET’. Because the customize -system is self-describing, we only cover a few important or obscure -configuration options here in the manual. - -‘slime-truncate-lines’ - The value to use for ‘truncate-lines’ in line-by-line summary - buffers popped up by SLIME. This is ‘t’ by default, which ensures - that lines do not wrap in backtraces, apropos listings, and so on. - It can however cause information to spill off the screen. - -‘slime-completion-at-point-functions’ - A list of functions used for completion of Lisp symbols. This - works as the standard ‘completion-at-point-functions’ (*note - (elisp)Completion in Buffers::). Three completion styles are - available: ‘slime-simple-completion-at-point’, - ‘slime-complete-symbol*’ (*note Compound Completion::), and - ‘slime-fuzzy-complete-symbol’ (*note Fuzzy Completion::). - - The default is ‘slime-simple-completion-at-point’, which completes - in the usual Emacs way. - -‘slime-filename-translations’ - This variable controls filename translation between Emacs and the - Lisp system. It is useful if you run Emacs and Lisp on separate - machines which don’t share a common file system or if they share - the filesystem but have different layouts, as is the case with - SMB-based file sharing. - -‘slime-net-coding-system’ - If you want to transmit Unicode characters between Emacs and the - Lisp system, you should customize this variable. E.g., if you use - SBCL, you can set: - (setq slime-net-coding-system 'utf-8-unix) - To actually display Unicode characters you also need appropriate - fonts, otherwise the characters will be rendered as hollow boxes. - If you are using Allegro CL and GNU Emacs, you can also use - ‘emacs-mule-unix’ as coding system. GNU Emacs has often nicer - fonts for the latter encoding. (Different encodings can be used - for different Lisps, see *note Multiple Lisps::.) - -* Menu: - -* Hooks:: - - -File: slime.info, Node: Hooks, Up: Emacs-side customization - -6.1.1 Hooks ------------ - -‘slime-mode-hook’ - This hook is run each time a buffer enters ‘slime-mode’. It is - most useful for setting buffer-local configuration in your Lisp - source buffers. An example use is to enable ‘slime-autodoc-mode’ - (*note slime-autodoc-mode::). - -‘slime-connected-hook’ - This hook is run when SLIME establishes a connection to a Lisp - server. An example use is to create a Typeout frame (*Note Typeout - frames::.) - -‘sldb-hook’ - This hook is run after SLDB is invoked. The hook functions are - called from the SLDB buffer after it is initialized. An example - use is to add ‘sldb-print-condition’ to this hook, which makes all - conditions debugged with SLDB be recorded in the REPL buffer. - - -File: slime.info, Node: Lisp-side, Prev: Emacs-side customization, Up: Customization - -6.2 Lisp-side (Swank) -===================== - -The Lisp server side of SLIME (known as “Swankâ€) offers several -variables to configure. The initialization file ‘~/.swank.lisp’ is -automatically evaluated at startup and can be used to set these -variables. - -* Menu: - -* Communication style:: -* Other configurables:: - - -File: slime.info, Node: Communication style, Next: Other configurables, Up: Lisp-side - -6.2.1 Communication style -------------------------- - -The most important configurable is ‘SWANK:*COMMUNICATION-STYLE*’, which -specifies the mechanism by which Lisp reads and processes protocol -messages from Emacs. The choice of communication style has a global -influence on SLIME’s operation. - - The available communication styles are: - -‘NIL’ - This style simply loops reading input from the communication socket - and serves SLIME protocol events as they arise. The simplicity - means that the Lisp cannot do any other processing while under - SLIME’s control. - -‘:FD-HANDLER’ - This style uses the classical Unix-style “‘select()’-loop.†Swank - registers the communication socket with an event-dispatching - framework (such as ‘SERVE-EVENT’ in CMUCL and SBCL) and receives a - callback when data is available. In this style requests from Emacs - are only detected and processed when Lisp enters the event-loop. - This style is simple and predictable. - -‘:SIGIO’ - This style uses “signal-driven I/O†with a ‘SIGIO’ signal handler. - Lisp receives requests from Emacs along with a signal, causing it - to interrupt whatever it is doing to serve the request. This style - has the advantage of responsiveness, since Emacs can perform - operations in Lisp even while it is busy doing other things. It - also allows Emacs to issue requests concurrently, e.g. to send one - long-running request (like compilation) and then interrupt that - with several short requests before it completes. The disadvantages - are that it may conflict with other uses of ‘SIGIO’ by Lisp code, - and it may cause untold havoc by interrupting Lisp at an awkward - moment. - -‘:SPAWN’ - This style uses multiprocessing support in the Lisp system to - execute each request in a separate thread. This style has similar - properties to ‘:SIGIO’, but it does not use signals and all - requests issued by Emacs can be executed in parallel. - - The default request handling style is chosen according to the -capabilities of your Lisp system. The general order of preference is -‘:SPAWN’, then ‘:SIGIO’, then ‘:FD-HANDLER’, with ‘NIL’ as a last -resort. You can check the default style by calling -‘SWANK-BACKEND::PREFERRED-COMMUNICATION-STYLE’. You can also override -the default by setting ‘SWANK:*COMMUNICATION-STYLE*’ in your Swank init -file. - - -File: slime.info, Node: Other configurables, Prev: Communication style, Up: Lisp-side - -6.2.2 Other configurables -------------------------- - -These Lisp variables can be configured via your ‘~/.swank.lisp’ file: - -‘SWANK:*CONFIGURE-EMACS-INDENTATION*’ - This variable controls whether indentation styles for - ‘&body’-arguments in macros are discovered and sent to Emacs. It - is enabled by default. - -‘SWANK:*GLOBALLY-REDIRECT-IO*’ - When T this causes the standard streams (‘*standard-output*’, etc) - to be globally redirected to the REPL in Emacs. - - When ‘:STARTED-FROM-EMACS’ (default) redirects the output when the - lisp is launched from emacs (i.e. ‘M-x slime’), but not from ‘M-x - slime-connect’. - - When ‘NIL’ these streams are only temporarily redirected to Emacs - using dynamic bindings while handling requests. Note that - ‘*standard-input*’ is currently never globally redirected into - Emacs, because it can interact badly with the Lisp’s native REPL by - having it try to read from the Emacs one. - -‘SWANK:*GLOBAL-DEBUGGER*’ - When true (the default) this causes ‘*DEBUGGER-HOOK*’ to be - globally set to ‘SWANK:SWANK-DEBUGGER-HOOK’ and thus for SLIME to - handle all debugging in the Lisp image. This is for debugging - multithreaded and callback-driven applications. - -‘SWANK:*SLDB-QUIT-RESTART*’ - This variable names the restart that is invoked when pressing ‘q’ - (*note sldb-quit::) in SLDB. For SLIME evaluation requests this is - _unconditionally_ bound to a restart that returns to a safe point. - This variable is supposed to customize what ‘q’ does if an - application’s thread lands into the debugger (see - ‘SWANK:*GLOBAL-DEBUGGER*’). - (setf swank:*sldb-quit-restart* 'sb-thread:terminate-thread) - -‘SWANK:*BACKTRACE-PRINTER-BINDINGS*’ -‘SWANK:*MACROEXPAND-PRINTER-BINDINGS*’ -‘SWANK:*SLDB-PRINTER-BINDINGS*’ -‘SWANK:*SWANK-PPRINT-BINDINGS*’ - These variables can be used to customize the printer in various - situations. The values of the variables are association lists of - printer variable names with the corresponding value. E.g., to - enable the pretty printer for formatting backtraces in SLDB, you - can use: - (push '(*print-pretty* . t) swank:*sldb-printer-bindings*). - -‘SWANK:*USE-DEDICATED-OUTPUT-STREAM*’ - This variable controls whether to use an unsafe efficiency hack for - sending printed output from Lisp to Emacs. The default is ‘nil’, - don’t use it, and is strongly recommended to keep. - - When ‘t’, a separate socket is established solely for Lisp to send - printed output to Emacs through, which is faster than sending the - output in protocol-messages to Emacs. However, as nothing can be - guaranteed about the timing between the dedicated output stream and - the stream of protocol messages, the output of a Lisp command can - arrive before or after the corresponding REPL results. Thus output - and REPL results can end up in the wrong order, or even - interleaved, in the REPL buffer. Using a dedicated output stream - also makes it more difficult to communicate to a Lisp running on a - remote host via SSH (*note Connecting to a remote lisp::). - -‘SWANK:*DEDICATED-OUTPUT-STREAM-PORT*’ - When ‘*USE-DEDICATED-OUTPUT-STREAM*’ is ‘t’ the stream will be - opened on this port. The default value, ‘0’, means that the stream - will be opened on some random port. - -‘SWANK:*LOG-EVENTS*’ - Setting this variable to ‘t’ causes all protocol messages exchanged - with Emacs to be printed to ‘*TERMINAL-IO*’. This is useful for - low-level debugging and for observing how SLIME works “on the - wire.†The output of ‘*TERMINAL-IO*’ can be found in your Lisp - system’s own listener, usually in the buffer ‘*inferior-lisp*’. - - -File: slime.info, Node: Tips and Tricks, Next: Contributed Packages, Prev: Customization, Up: Top - -7 Tips and Tricks -***************** - -* Menu: - -* Connecting to a remote lisp:: -* Global IO Redirection:: -* Auto-SLIME:: - - -File: slime.info, Node: Connecting to a remote lisp, Next: Global IO Redirection, Up: Tips and Tricks - -7.1 Connecting to a remote lisp -=============================== - -One of the advantages of the way SLIME is implemented is that we can -easily run the Emacs side (slime.el) on one machine and the lisp backend -(swank) on another. The basic idea is to start up lisp on the remote -machine, load swank and wait for incoming SLIME connections. On the -local machine we start up emacs and tell SLIME to connect to the remote -machine. The details are a bit messier but the underlying idea is that -simple. - -* Menu: - -* Setting up the lisp image:: -* Setting up Emacs:: -* Setting up pathname translations:: - - -File: slime.info, Node: Setting up the lisp image, Next: Setting up Emacs, Up: Connecting to a remote lisp - -7.1.1 Setting up the lisp image -------------------------------- - -When you want to load swank without going through the normal, Emacs -based, process just load the ‘swank-loader.lisp’ file. Just execute - - (load "/path/to/swank-loader.lisp") - (swank-loader:init) - - inside a running lisp image(1). Now all we need to do is startup our -swank server. The first example assumes we’re using the default -settings. - - (swank:create-server) - - Since we’re going to be tunneling our connection via ssh(2) and we’ll -only have one port open we want to tell swank to not use an extra -connection for output (this is actually the default in current SLIME): - - (setf swank:*use-dedicated-output-stream* nil) - - If you need to do anything particular (like be able to reconnect to -swank after you’re done), look into ‘swank:create-server’’s other -arguments. Some of these arguments are - -‘:PORT’ - Port number for the server to listen on (default: 4005). -‘:STYLE’ - See *Note Communication style::. -‘:DONT-CLOSE’ - Boolean indicating if the server will continue to accept - connections after the first one (default: ‘NIL’). For - “long-running†lisp processes to which you want to be able to - connect from time to time, specify ‘:dont-close t’ -‘:CODING-SYSTEM’ - String designating the encoding to be used to communicate between - the Emacs and Lisp. - - So the more complete example will be - (swank:create-server :port 4005 :dont-close t :coding-system "utf-8-unix") - On the emacs side you will use something like - (setq slime-net-coding-system 'utf-8-unix) - (slime-connect "localhost" 4005)) - to connect to this lisp image from the same machine. - - ---------- Footnotes ---------- - - (1) SLIME also provides an ASDF system definition which does the same -thing - - (2) there is a way to connect without an ssh tunnel, but it has the -side-effect of giving the entire world access to your lisp image, so -we’re not going to talk about it - - -File: slime.info, Node: Setting up Emacs, Next: Setting up pathname translations, Prev: Setting up the lisp image, Up: Connecting to a remote lisp - -7.1.2 Setting up Emacs ----------------------- - -Now we need to create the tunnel between the local machine and the -remote machine. - - ssh -L4005:localhost:4005 username@remote.example.com - - That ssh invocation creates an ssh tunnel between the port 4005 on -our local machine and the port 4005 on the remote machine(1). - - Finally we can start SLIME: - - M-x slime-connect RET RET - - The ‘RET RET’ sequence just means that we want to use the default -host (‘localhost’) and the default port (‘4005’). Even though we’re -connecting to a remote machine the ssh tunnel fools Emacs into thinking -it’s actually ‘localhost’. - - ---------- Footnotes ---------- - - (1) By default swank listens for incoming connections on port 4005, -had we passed a ‘:port’ parameter to ‘swank:create-server’ we’d be using -that port number instead - - -File: slime.info, Node: Setting up pathname translations, Prev: Setting up Emacs, Up: Connecting to a remote lisp - -7.1.3 Setting up pathname translations --------------------------------------- - -One of the main problems with running swank remotely is that Emacs -assumes the files can be found using normal filenames. if we want -things like ‘slime-compile-and-load-file’ (‘C-c C-k’) and -‘slime-edit-definition’ (‘M-.’) to work correctly we need to find a way -to let our local Emacs refer to remote files. - - There are, mainly, two ways to do this. The first is to mount, using -NFS or similar, the remote machine’s hard disk on the local machine’s -file system in such a fashion that a filename like -‘/opt/project/source.lisp’ refers to the same file on both machines. -Unfortunately NFS is usually slow, often buggy, and not always feasible, -fortunately we have an ssh connection and Emacs’ ‘tramp-mode’ can do the -rest. (See *note TRAMP User Manual: (tramp)Top.) - - What we do is teach Emacs how to take a filename on the remote -machine and translate it into something that tramp can understand and -access (and vice versa). Assuming the remote machine’s host name is -‘remote.example.com’, ‘cl:machine-instance’ returns “remote†and we -login as the user “user†we can use ‘slime-tramp’ contrib to setup the -proper translations by simply doing: - - (add-to-list 'slime-filename-translations - (slime-create-filename-translator - :machine-instance "remote" - :remote-host "remote.example.com" - :username "user")) - - -File: slime.info, Node: Global IO Redirection, Next: Auto-SLIME, Prev: Connecting to a remote lisp, Up: Tips and Tricks - -7.2 Globally redirecting all IO to the REPL -=========================================== - -When connecting via ‘M-x slime-connect’ SLIME does not change -‘*standard-output*’ and friends outside of the REPL. If you have any -other threads which call ‘format’, ‘write-string’, etc. that output -will be seen only in the ‘*inferior-lisp*’ buffer or on the terminal, -more often than not this is inconvenient. So, if you want code such as -this: - - (run-in-new-thread - (lambda () - (write-line "In some random thread.~%" *standard-output*))) - - to send its output to SLIME’s repl buffer, as opposed to -‘*inferior-lisp*’, set ‘swank:*globally-redirect-io*’ to T in -‘~/.swank.lisp’ - - But when started using ‘M-x slime’ the streams are redirected by -default. - - -File: slime.info, Node: Auto-SLIME, Prev: Global IO Redirection, Up: Tips and Tricks - -7.3 Connecting to SLIME automatically -===================================== - -To make SLIME connect to your lisp whenever you open a lisp file just -add this to your ‘.emacs’: - - (add-hook 'slime-mode-hook - (lambda () - (unless (slime-connected-p) - (save-excursion (slime))))) - - -File: slime.info, Node: Contributed Packages, Next: Credits, Prev: Tips and Tricks, Up: Top - -8 Contributed Packages -********************** - -In version 2.1 we moved some functionality to separate packages. This -chapter tells you how to load contrib modules and describes what the -particular packages do. - -* Menu: - -* Loading Contribs:: -* REPL:: -* slime-mrepl:: -* inferior-slime-mode:: -* Compound Completion:: -* Fuzzy Completion:: -* slime-autodoc-mode:: -* ASDF:: -* Banner:: -* Editing Commands:: -* Fancy Inspector:: -* Presentations:: -* Typeout frames:: -* TRAMP:: -* Documentation Links:: -* Xref and Class Browser:: -* Highlight Edits:: -* Scratch Buffer:: -* SLIME Trace Dialog:: -* slime-sprof:: -* SLIME Enhanced M-.:: -* slime-fancy:: -* Quicklisp:: - - -File: slime.info, Node: Loading Contribs, Next: REPL, Up: Contributed Packages - -8.1 Loading Contrib Packages -============================ - -Contrib packages aren’t loaded by default. You have to modify your -setup a bit so that Emacs knows where to find them and which of them to -load. Generally, you set the variable ‘slime-contribs’ with the list of -package-names that you want to use. Its default value is ‘slime-fancy’ -which loads almost everything. For example, a setup to load the -‘slime-scratch’ and ‘slime-editing-commands’ packages looks like: - - ;; _Setup load-path and autoloads_ - (add-to-list 'load-path "~/dir/to/cloned/slime") - (require 'slime-autoloads) - - ;; _Set your lisp system and some contribs_ - (setq inferior-lisp-program "/opt/sbcl/bin/sbcl") - (setq slime-contribs '(slime-scratch slime-editing-commands)) - - After starting SLIME, the commands of both packages should be -available. - -8.1.1 Loading and unloading “on the fly†----------------------------------------- - -We recommend that you setup contribs _before_ starting SLIME via ‘M-x -slime’, but if you want to enable more contribs _after_ you do that, you -can set the ‘slime-contribs’ variable to another value and call ‘M-x -slime-setup’. Note this though: - - • If you’ve removed contribs from the list they won’t be unloaded - automatically. - • If you have more than one SLIME connection currently active, you - must manually repeat the ‘slime-setup’ step for each of them. - - Short of restarting Emacs, a reasonable way of unloading contribs is -by calling an Emacs Lisp function whose name is obtained by adding -‘-unload’ to the contrib’s name, for every contrib you wish to unload. -So, to remove ‘slime-repl’, you must call ‘slime-repl-unload’. Because -the unload function will only, if ever, unload the Emacs Lisp side of -the contrib, you may also need to restart your lisps. - - -File: slime.info, Node: REPL, Next: slime-mrepl, Prev: Loading Contribs, Up: Contributed Packages - -8.2 REPL: the “top level†-========================= - -SLIME uses a custom Read-Eval-Print Loop (REPL, also known as a “top -levelâ€, or listener). The REPL user-interface is written in Emacs Lisp, -which gives more Emacs-integration than the traditional ‘comint’-based -Lisp interaction: - - • Conditions signalled in REPL expressions are debugged with SLDB. - • Return values are distinguished from printed output by separate - Emacs faces (colours). - • Emacs manages the REPL prompt with markers. This ensures that Lisp - output is inserted in the right place, and doesn’t get mixed up - with user input. - - To load the REPL use ‘(add-to-list 'slime-contribs 'slime-repl)’ in -your ‘.emacs’. - -‘C-c C-z’ -‘M-x slime-switch-to-output-buffer’ - Select the output buffer, preferably in a different window. - -‘C-c C-y’ -‘M-x slime-call-defun’ - Insert a call to the function defined around point into the REPL. - -‘C-c C-j’ -‘M-x slime-eval-last-expression-in-repl’ - Inserts the last expression to the REPL and evaluates it there. - Switches to the current package of the source buffer for the - duration. If used with a prefix argument, doesn’t switch back - afterwards. - -* Menu: - -* REPL commands:: -* Input Navigation:: -* Shortcuts:: - - -File: slime.info, Node: REPL commands, Next: Input Navigation, Up: REPL - -8.2.1 REPL commands -------------------- - -‘RET’ -‘M-x slime-repl-return’ - Evaluate the current input in Lisp if it is complete. If - incomplete, open a new line and indent. If a prefix argument is - given then the input is evaluated without checking for - completeness. - -‘C-RET’ -‘M-x slime-repl-closing-return’ - Close any unmatched parenthesis and then evaluate the current input - in Lisp. Also bound to ‘M-RET’. - -‘TAB’ -‘M-x slime-indent-and-complete-symbol’ - Indent the current line and perform symbol completion. - -‘C-j’ -‘M-x slime-repl-newline-and-indent’ - Open and indent a new line. - -‘C-a’ -‘M-x slime-repl-bol’ - Go to the beginning of the line, but stop at the REPL prompt. - -‘C-c C-c’ -‘M-x slime-interrupt’ - Interrupt the Lisp process with ‘SIGINT’. - -‘C-c M-o’ -‘M-x slime-repl-clear-buffer’ - Clear the entire buffer, leaving only a prompt. - -‘C-c C-o’ -‘M-x slime-repl-clear-output’ - Remove the output and result of the previous expression from the - buffer. - - -File: slime.info, Node: Input Navigation, Next: Shortcuts, Prev: REPL commands, Up: REPL - -8.2.2 Input navigation ----------------------- - -The input navigation (a.k.a. history) commands are modelled after -‘coming’-mode. Be careful if you are used to Bash-like keybindings: -‘M-p’ and ‘M-n’ use the current input as search pattern and only work -Bash-like if the current line is empty. ‘C-’ and ‘C-’ work like -the up and down keys in Bash. - -‘C-, M-x slime-repl-forward-input’ -‘C-, M-x slime-repl-backward-input’ - Go to the next/previous history item. - -‘M-n, M-x slime-repl-next-input’ -‘M-p, M-x slime-repl-previous-input’ - Search the next/previous item in the command history using the - current input as search pattern. If ‘M-n’/‘M-n’ is typed two times - in a row, the second invocation uses the same search pattern (even - if the current input has changed). - -‘M-s, M-x slime-repl-next-matching-input’ -‘M-r, M-x slime-repl-previous-matching-input’ - Search forward/reverse through command history with regex - -‘C-c C-n, M-x slime-repl-next-prompt’ -‘C-c C-p, M-x slime-repl-previous-prompt’ - Move between the current and previous prompts in the REPL buffer. - Pressing RET on a line with old input copies that line to the - newest prompt. - - The variable ‘slime-repl-wrap-history’ controls wrap around -behaviour, i.e. whether cycling should restart at the beginning of the -history if the end is reached. - - -File: slime.info, Node: Shortcuts, Prev: Input Navigation, Up: REPL - -8.2.3 Shortcuts ---------------- - -“Shortcuts†are a special set of REPL commands that are invoked by name. -To invoke a shortcut you first press ‘,’ (comma) at the REPL prompt and -then enter the shortcut’s name when prompted. - - Shortcuts deal with things like switching between directories and -compiling and loading Lisp systems. The set of shortcuts is listed -below, and you can also use the ‘help’ shortcut to list them -interactively. - -‘change-directory (aka !d, cd)’ - Change the current directory. - -‘change-package (aka !p, in, in-package)’ - Change the current package. - -‘compile-and-load (aka cl)’ - Compile (if necessary) and load a lisp file. - -‘defparameter (aka !)’ - Define a new global, special, variable. - -‘disconnect’ - Disconnect all connections. - -‘help (aka ?)’ - Display the help. - -‘pop-directory (aka -d)’ - Pop the current directory. - -‘pop-package (aka -p)’ - Pop the top of the package stack. - -‘push-directory (aka +d, pushd)’ - Push a new directory onto the directory stack. - -‘push-package (aka +p)’ - Push a package onto the package stack. - -‘pwd’ - Show the current directory. - -‘quit’ - Quit the current Lisp. - -‘resend-form’ - Resend the last form. - -‘restart-inferior-lisp’ - Restart *inferior-lisp* and reconnect SLIME. - -‘sayoonara’ - Quit all Lisps and close all SLIME buffers. - - -File: slime.info, Node: slime-mrepl, Next: inferior-slime-mode, Prev: REPL, Up: Contributed Packages - -8.3 Multiple REPLs -================== - -The ‘slime-mrepl’ package adds support for multiple listener buffers. -The command ‘M-x slime-new-mrepl’ creates a new buffer. In a -multi-threaded Lisp, each listener is associated with a separate thread. -In a single-threaded Lisp it’s also possible to create multiple listener -buffers but the commands are executed sequentially by the same process. - - -File: slime.info, Node: inferior-slime-mode, Next: Compound Completion, Prev: slime-mrepl, Up: Contributed Packages - -8.4 ‘inferior-slime-mode’ -========================= - -The ‘inferior-slime-mode’ is a minor mode is intended to use with the -‘*inferior-lisp*’ lisp buffer. It provides some of the SLIME commands, -like symbol completion and documentation lookup. It also tracks the -current directory of the Lisp process. To install it, add something -like this to user ‘.emacs’: - - (add-to-list 'slime-contribs 'inferior-slime) - -‘M-x inferior-slime-mode’ - Turns inferior-slime-mode on or off. - - The variable ‘inferior-slime-mode-map’ contains the extra -keybindings. - - -File: slime.info, Node: Compound Completion, Next: Fuzzy Completion, Prev: inferior-slime-mode, Up: Contributed Packages - -8.5 Compound Completion -======================= - -The package ‘slime-c-p-c’ provides a different symbol completion -algorithm, which performs completion “in parallel†over the -hyphen-delimited sub-words of a symbol name. (1) Formally this means -that “‘a-b-c’†can complete to any symbol matching the regular -expression “‘^a.*-b.*-c.*’†(where “dot†matches anything but a hyphen). -Examples give a more intuitive feeling: - • ‘m-v-b’ completes to ‘multiple-value-bind’. - • ‘w-open’ is ambiguous: it completes to either ‘with-open-file’ or - ‘with-open-stream’. The symbol is expanded to the longest common - completion (‘with-open-’) and the point is placed at the first - point of ambiguity, which in this case is the end. - • ‘w--stream’ completes to ‘with-open-stream’. - - The variable ‘slime-c-p-c-unambiguous-prefix-p’ specifies where point -should be placed after completion. E.g. the possible completions for -‘f-o’ are ‘finish-output’ and ‘force-output’. By the default point is -moved after the ‘f’, because that is the unambiguous prefix. If -‘slime-c-p-c-unambiguous-prefix-p’ is nil, point moves to the end of the -inserted text, after the ‘o’ in this case. - - In addition, ‘slime-c-p-c’ provides completion for character names -(mostly useful for Unicode-aware implementations): - - CL-USER> #\Sp - - Here SLIME will usually complete the character to ‘#\Space’, but in a -Unicode-aware implementation, this might provide the following -completions: - Space Space - Sparkle Spherical_Angle - Spherical_Angle_Opening_Left Spherical_Angle_Opening_Up - - The package ‘slime-c-p-c’ also provides context-sensitive completion -for keywords. Example: - - CL-USER> (find 1 '(1 2 3) :s - - Here SLIME will complete ‘:start’, rather than suggesting all -ever-interned keywords starting with ‘:s’. - -‘C-c C-s’ -‘M-x slime-complete-form’ - Looks up and inserts into the current buffer the argument list for - the function at point, if there is one. More generally, the - command completes an incomplete form with a template for the - missing arguments. There is special code for discovering extra - keywords of generic functions and for handling ‘make-instance’, - ‘defmethod’, and many other functions. Examples: - - (subseq "abc" - --inserts--> start [end]) - (find 17 - --inserts--> sequence :from-end from-end :test test - :test-not test-not :start start :end end - :key key) - (find 17 '(17 18 19) :test #'= - --inserts--> :from-end from-end - :test-not test-not :start start :end end - :key key) - (defclass foo () ((bar :initarg :bar))) - (defmethod print-object - --inserts--> (object stream) - body...) - (defmethod initialize-instance :after ((object foo) &key blub)) - (make-instance 'foo - --inserts--> :bar bar :blub blub initargs...) - - ---------- Footnotes ---------- - - (1) This style of completion is modelled on ‘completer.el’ by Chris -McConnell. That package is bundled with ILISP. - - -File: slime.info, Node: Fuzzy Completion, Next: slime-autodoc-mode, Prev: Compound Completion, Up: Contributed Packages - -8.6 Fuzzy Completion -==================== - -The package ‘slime-fuzzy’ implements yet another symbol completion -heuristic. - -‘C-c M-i’ -‘M-x slime-fuzzy-complete-symbol’ - Presents a list of likely completions to choose from for an - abbreviation at point. If you set the variable - ‘slime-complete-symbol-function’ to this command, fuzzy completion - will also be used for ‘M-TAB’. - -8.6.1 The Algorithm -------------------- - -It attempts to complete a symbol all at once, instead of in pieces. For -example, “mvb†will find “‘multiple-value-bind’†and “norm-df†will find -“‘least-positive-normalized-double-float’â€. - - The algorithm tries to expand every character in various ways and -rates the list of possible completions with the following heuristic. - - Letters are given scores based on their position in the string. -Letters at the beginning of a string or after a prefix letter at the -beginning of a string are scored highest. Letters after a word -separator such as #\- are scored next highest. Letters at the end of a -string or before a suffix letter at the end of a string are scored -medium, and letters anywhere else are scored low. - - If a letter is directly after another matched letter, and its -intrinsic value in that position is less than a percentage of the -previous letter’s value, it will use that percentage instead. - - Finally, a small scaling factor is applied to favor shorter matches, -all other things being equal. - -8.6.2 Duplicate Symbols ------------------------ - -In case a symbol is accessible via several packages, duplicate symbol -filter specified via ‘*fuzzy-duplicate-symbol-filter*’ swank variable is -applied. ‘:nearest-package’ value specifies that only symbols in the -package with highest score should be kept. ‘:home-package’ specifies -that only the match that represents the home package of the symbol is -used, and ‘:all’ value specifies that duplicate symbol filter mode -should be turned off. - - To specify a custom filter, set ‘*fuzzy-duplicate-symbol-filter*’ to -a function accepting three arguments: the name of package being -examined, the list of names of all packages being examined with packages -with highest matching score listed first and an ‘equal’ hash-table that -is shared between calls to the function and can be used for -deduplication purposes. The function should return a deduplication -filter function which accepts a symbol and returns true if the symbol -should be kept. - - For example, the effect of ‘:nearest-package’ can be also achieved by -specifying the following custom filter in ‘~/.swank.lisp’: - (setf *fuzzy-duplicate-symbol-filter* - (lambda (cur-package all-packages dedup-table) - (declare (ignore cur-package all-packages)) - (lambda (symbol) - (unless (gethash (symbol-name symbol) dedup-table) - (setf (gethash (symbol-name symbol) dedup-table) t))))) - And instead of ‘:home-package’, the following can be used: - (setf *fuzzy-duplicate-symbol-filter* - (lambda (cur-package all-packages dedup-table) - (declare (ignore dedup-table)) - (let ((packages (mapcar #'find-package - (remove cur-package all-packages)))) - (lambda (symbol) - (not (member (symbol-package symbol) packages)))))) - - -File: slime.info, Node: slime-autodoc-mode, Next: ASDF, Prev: Fuzzy Completion, Up: Contributed Packages - -8.7 ‘slime-autodoc-mode’ -======================== - -Autodoc mode is an additional minor-mode for automatically showing -information about symbols near the point. For function names the -argument list is displayed, and for global variables, the value. -Autodoc is implemented by means of ‘eldoc-mode’ of Emacs. - - The mode can be enabled by default in your ‘~/.emacs’: - (add-to-list 'slime-contribs 'slime-autodoc) - -‘M-x slime-arglist NAME’ - Show the argument list of the function NAME. - -‘M-x slime-autodoc-mode’ - Toggles autodoc-mode on or off according to the argument, and - toggles the mode when invoked without argument. -‘C-c C-d a’ -‘M-x slime-autodoc-manually’ - Like slime-autodoc, but when called twice, or after slime-autodoc - was already automatically called, display multiline arglist. - - If the variable ‘slime-use-autodoc-mode’ is set (default), Emacs -starts a timer, otherwise the information is only displayed after -pressing SPC. - - If ‘slime-autodoc-use-multiline-p’ is set to non-nil, allow long -autodoc messages to resize echo area display. - - ‘slime-autodoc-mode-string’ is a string that will be displayed in the -mode line when autodoc-mode is enabled, or nil, if you prefer no -indication. You can customize this variable. - - -File: slime.info, Node: ASDF, Next: Banner, Prev: slime-autodoc-mode, Up: Contributed Packages - -8.8 ASDF -======== - -ASDF is a popular “system construction toolâ€. The package ‘slime-asdf’ -provides some commands to load and compile such systems from Emacs. -ASDF itself is not included with SLIME; you have to load that yourself -into your Lisp. In particular, you must load ASDF before you connect, -otherwise you will get errors about missing symbols. - -‘M-x slime-load-system NAME’ - Compile and load an ASDF system. The default system name is taken - from the first file matching *.asd in the current directory. -‘M-x slime-reload-system NAME’ - Recompile and load an ASDF system without recompiling its - dependencies. -‘M-x slime-open-system NAME &optional LOAD’ - Open all files in a system, optionally load it if LOAD is non-nil. -‘M-x slime-browse-system NAME’ - Browse files in a system using Dired. -‘M-x slime-delete-system-fasls NAME’ - Delete FASLs produced by compiling a system. -‘M-x slime-rgrep-system NAME REGEXP’ - Run ‘rgrep’ on the base directory of an ASDF system. -‘M-x slime-isearch-system NAME’ - Run ‘isearch-forward’ on the files of an ASDF system. -‘M-x slime-query-replace-system NAME FROM TO &OPTIONAL DELIMITED’ - Run ‘query-replace’ on an ASDF system. - The package also installs some new REPL shortcuts (*note -Shortcuts::): - -‘load-system’ - Compile (as needed) and load an ASDF system. -‘reload-system’ - Recompile and load an ASDF system. -‘compile-system’ - Compile (but not load) an ASDF system. -‘force-compile-system’ - Recompile (but not load) an ASDF system. -‘force-load-system’ - Recompile and load an ASDF system. -‘open-system’ - Open all files in a system. -‘browse-system’ - Browse files in a system using Dired. -‘delete-system-fasls’ - Delete FASLs produced by compiling a system. - - -File: slime.info, Node: Banner, Next: Editing Commands, Prev: ASDF, Up: Contributed Packages - -8.9 Banner -========== - -The package ‘slime-banner’ installs a window header line ( *note -(elisp)Header Lines::.) in the REPL buffer. It also runs an animation -at startup. - - By setting the variable ‘slime-startup-animation’ to nil you can -disable the animation respectively with the variable -‘slime-header-line-p’ the header line. - - -File: slime.info, Node: Editing Commands, Next: Fancy Inspector, Prev: Banner, Up: Contributed Packages - -8.10 Editing Commands -===================== - -The package ‘slime-editing-commands’ provides some commands to edit Lisp -expressions. - -‘C-c M-q’ -‘M-x slime-reindent-defun’ - Re-indents the current defun, or refills the current paragraph. If - point is inside a comment block, the text around point will be - treated as a paragraph and will be filled with ‘fill-paragraph’. - Otherwise, it will be treated as Lisp code, and the current defun - will be reindented. If the current defun has unbalanced parens, an - attempt will be made to fix it before reindenting. - -‘C-c C-]’ -‘M-x slime-close-all-parens-in-sexp’ - Balance parentheses of open s-expressions at point. Insert enough - right parentheses to balance unmatched left parentheses. Delete - extra left parentheses. Reformat trailing parentheses - Lisp-stylishly. - - If REGION is true, operate on the region. Otherwise operate on the - top-level sexp before point. - -‘M-x slime-insert-balanced-comments’ - Insert a set of balanced comments around the s-expression - containing the point. If this command is invoked repeatedly - (without any other command occurring between invocations), the - comment progressively moves outward over enclosing expressions. If - invoked with a positive prefix argument, the s-expression arg - expressions out is enclosed in a set of balanced comments. - -‘M-C-a’ -‘M-x slime-beginning-of-defun’ -‘M-C-e’ -‘M-x slime-end-of-defun’ - - -File: slime.info, Node: Fancy Inspector, Next: Presentations, Prev: Editing Commands, Up: Contributed Packages - -8.11 Fancy Inspector -==================== - -An alternative to default inspector is provided by the package -‘slime-fancy-inspector’. This inspector knows a lot about CLOS objects -and methods. It provides many “actions†that can be selected to invoke -Lisp code on the inspected object. For example, to present a generic -function the inspector shows the documentation in plain text and -presents each method with both a hyperlink to inspect the method object -and a “remove method†action that you can invoke interactively. The -key-bindings are the same as for the basic inspector (*note -Inspector::). - - -File: slime.info, Node: Presentations, Next: Typeout frames, Prev: Fancy Inspector, Up: Contributed Packages - -8.12 Presentations -================== - -A “presentationâ€(1) in SLIME is a region of text associated with a Lisp -object. Right-clicking on the text brings up a menu with operations for -the particular object. Some operations, like inspecting, are available -for all objects, but the object may also have specialized operations. -For instance, pathnames have a dired operation. - - More importantly, it is possible to cut and paste presentations -(i.e., Lisp objects, not just their printed presentation), using all -standard Emacs commands. This way it is possible to cut and paste the -results of previous computations in the REPL. This is of particular -importance for unreadable objects. - - The package ‘slime-presentations’ installs presentations in the REPL, -i.e. the results of evaluation commands become presentations. In this -way, presentations generalize the use of the standard Common Lisp REPL -history variables ‘*’, ‘**’, ‘***’. Example: - - CL-USER> (find-class 'standard-class) - _#_ - CL-USER> - - Presentations appear in red color in the buffer. (In this manual, we -indicate the presentations _like this_.) Using standard Emacs commands, -the presentation can be copied to a new input in the REPL: - - CL-USER> (eql '_#_ - '_#_) - _T_ - - Note that standard evaluation and quoting rules still apply. So if a -presentation is a list, it needs to be quoted in an evaluated context to -avoid treating it as a function call: - - CL-USER> (list (find-class 'standard-class) 2 3 4) - _(# 2 3 4)_ - CL-USER> _(# 2 3 4)_ - ; Funcall of # which is a non-function. - ; Evaluation aborted. - CL-USER> '_(# 2 3 4)_ - (# 2 3 4) - - When you copy an incomplete presentation or edit the text within a -presentation, the presentation changes to plain text, losing the -association with a Lisp object. In the buffer, this is indicated by -changing the color of the text from red to black. This can be undone. - - Presentations are also available in the inspector (all inspectable -parts are presentations) and the debugger (all local variables are -presentations). This makes it possible to evaluate expressions in the -REPL using objects that appear in local variables of some active -debugger frame; this can be more convenient than using ‘M-x -sldb-eval-in-frame’. *Warning:* The presentations that stem from the -inspector and debugger are only valid as long as the corresponding -buffers are open. Using them later can cause errors or confusing -behavior. - - For some Lisp implementations you can also install the package -‘slime-presentation-streams’, which enables presentations on the Lisp -‘*standard-output*’ stream and similar streams. This means that not -only results of computations, but also some objects that are printed to -the standard output (as a side-effect of the computation) are associated -with presentations. Currently, all unreadable objects and pathnames get -printed as presentations. - - CL-USER> (describe (find-class 'standard-object)) - _#_ is an instance of - _#_: - The following slots have :INSTANCE allocation: - PLIST NIL - FLAGS 1 - DIRECT-METHODS ((_#_ - ... - - Again, this makes it possible to inspect and copy-paste these -objects. - - In addition to the standard Emacs commands, there are several -keyboard commands, a menu-bar menu, and a context menu to operate on -presentations. We describe the keyboard commands below; they are also -shown in the menu-bar menu. - -‘C-c C-v SPC’ -‘M-x slime-mark-presentation’ - If point is within a presentation, move point to the beginning of - the presentation and mark to the end of the presentation. This - makes it possible to copy the presentation. - -‘C-c C-v w’ -‘M-x slime-copy-presentation-at-point-to-kill-ring’ - If point is within a presentation, copy the surrounding - presentation to the kill ring. - -‘C-c C-v r’ -‘M-x slime-copy-presentation-at-point-to-repl’ - If point is within a presentation, copy the surrounding - presentation to the REPL. - -‘C-c C-v d’ -‘M-x slime-describe-presentation-at-point’ - If point is within a presentation, describe the associated object. - -‘C-c C-v i’ -‘M-x slime-inspect-presentation-at-point’ - If point is within a presentation, inspect the associated object - with the SLIME inspector. - -‘C-c C-v n’ -‘M-x slime-next-presentation’ - Move point to the next presentation in the buffer. - -‘C-c C-v p’ -‘M-x slime-previous-presentation’ - Move point to the previous presentation in the buffer. - - Similar operations are also possible from the context menu of every -presentation. Using ‘mouse-3’ on a presentation, the context menu opens -and offers various commands. For some objects, specialized commands are -also offered. Users can define additional specialized commands by -defining a method for ‘swank::menu-choices-for-presentation’. - - *Warning:* On Lisp implementations without weak hash tables, all -objects associated with presentations are protected from garbage -collection. If your Lisp image grows too large because of that, use -‘C-c C-v M-o’ (‘slime-clear-presentations’) to remove these -associations. You can also use the command ‘C-c M-o’ -(‘slime-repl-clear-buffer’), which both clears the REPL buffer and -removes all associations of objects with presentations. - - *Warning:* Presentations can confuse new users. - - CL-USER> (cons 1 2) - _(1 . 2)_ - CL-USER> (eq '_(1 . 2)_ '_(1 . 2)_) - _T_ - - One could have expected ‘NIL’ here, because it looks like two fresh -cons cells are compared regarding object identity. However, in the -example the presentation ‘_(1 . 2)_’ was copied twice to the REPL. Thus -‘EQ’ is really invoked with the same object, namely the cons cell that -was returned by the first form entered in the REPL. - - ---------- Footnotes ---------- - - (1) Presentations are a feature originating from the Lisp machines. -It was possible to define ‘present’ methods specialized to various -devices, e.g. to draw an object to bitmapped screen or to write some -text to a character stream. - - -File: slime.info, Node: Typeout frames, Next: TRAMP, Prev: Presentations, Up: Contributed Packages - -8.13 Typeout frames -=================== - -A “typeout frame†is a special Emacs frame which is used instead of the -echo area (minibuffer) to display messages from SLIME commands. This is -an optional feature. The advantage of a typeout frame over the echo -area is that it can hold more text, it can be scrolled, and its contents -don’t disappear when you press a key. All potentially long messages are -sent to the typeout frame, such as argument lists, macro expansions, and -so on. - -‘M-x slime-ensure-typeout-frame’ - Ensure that a typeout frame exists, creating one if necessary. - - If the typeout frame is closed then the echo area will be used again -as usual. - - To have a typeout frame created automatically at startup you should -load the ‘slime-typeout-frame’ package. (*note Loading Contribs::.) - - The variable ‘slime-typeout-frame-properties’ specifies the height -and possibly other properties of the frame. Its value is passed to -‘make-frame’. (*note (elisp)Creating Frames::.) - - -File: slime.info, Node: TRAMP, Next: Documentation Links, Prev: Typeout frames, Up: Contributed Packages - -8.14 TRAMP -========== - -The package ‘slime-tramp’ provides some functions to set up filename -translations for TRAMP. (*note Setting up pathname translations::) - - -File: slime.info, Node: Documentation Links, Next: Xref and Class Browser, Prev: TRAMP, Up: Contributed Packages - -8.15 Documentation Links -======================== - -For certain error messages, SBCL includes references to the ANSI -Standard or the SBCL User Manual. The ‘slime-references’ package turns -those references into clickable links. This makes finding the -referenced section of the HyperSpec much easier. - - -File: slime.info, Node: Xref and Class Browser, Next: Highlight Edits, Prev: Documentation Links, Up: Contributed Packages - -8.16 Xref and Class Browser -=========================== - -A rudimentary class browser is provided by the ‘slime-xref-browser’ -package. - -‘M-x slime-browse-classes’ - This command asks for a class name and displays inheritance tree of - for the class. - -‘M-x slime-browse-xrefs’ - This command prompts for a symbol and the kind of cross reference, - e.g. callers. The cross reference tree rooted at the symbol is - then then displayed. - - -File: slime.info, Node: Highlight Edits, Next: Scratch Buffer, Prev: Xref and Class Browser, Up: Contributed Packages - -8.17 Highlight Edits -==================== - -‘slime-highlight-edits’ is a minor mode to highlight those regions in a -Lisp source file which are modified. This is useful to quickly find -those functions which need to be recompiled (with ‘C-c C-c’) - -‘M-x slime-highlight-edits-mode’ - Turns ‘slime-highlight-edits-mode’ on or off. - - -File: slime.info, Node: Scratch Buffer, Next: SLIME Trace Dialog, Prev: Highlight Edits, Up: Contributed Packages - -8.18 Scratch Buffer -=================== - -The SLIME scratch buffer, in contrib package ‘slime-scratch’, imitates -Emacs’ usual ‘*scratch*’ buffer. If ‘slime-scratch-file’ is set, it is -used to back the scratch buffer, making it persistent. The buffer is -like any other Lisp buffer, except for the command bound to ‘C-j’. - -‘C-j’ -‘M-x slime-eval-print-last-expression’ - Evaluate the expression sexp before point and insert print value - into the current buffer. - -‘M-x slime-scratch’ - Create a ‘*slime-scratch*’ buffer. In this buffer you can enter - Lisp expressions and evaluate them with ‘C-j’, like in Emacs’s - ‘*scratch*’ buffer. - - -File: slime.info, Node: SLIME Trace Dialog, Next: slime-sprof, Prev: Scratch Buffer, Up: Contributed Packages - -8.19 SLIME Trace Dialog -======================= - -The SLIME Trace Dialog, in package ‘slime-trace-dialog’, is a tracing -facility, similar to Common Lisp’s ‘trace’, but interactive rather than -purely textual. It is an Emacs 24-only contrib. - - You use it just like you would regular ‘trace’: after tracing a -function, calling it causes interesting information about that -particular call to be reported. - - However, instead of printing the trace results to the the -‘*trace-output*’ stream (usually the REPL), the SLIME Trace Dialog -collects and stores them in your lisp environment until, on user’s -request, they are fetched into Emacs and displayed in a dialog-like -interactive view. - - After starting up SLIME, SLIME’s Trace Dialog installs a _Trace_ menu -in the menu-bar of any ‘slime-mode’ buffer and adds two new commands, -with respective key-bindings: - -‘C-c M-t’ -‘M-x slime-trace-dialog-toggle-trace’ - If point is on a symbol name, toggle tracing of its function - definition. If point is not on a symbol, prompt user for a - function. - - With a ‘C-u’ prefix argument, and if your lisp implementation - allows it, attempt to decipher lambdas, methods and other - complicated function signatures. - - The function is traced for the SLIME Trace Dialog only, i.e. it is - not found in the list returned by Common Lisp’s ‘trace’. - -‘C-c T’ -‘M-x slime-trace-dialog’ - Pop to the interactive SLIME Trace Dialog buffer associated with - the current connection (*note Multiple connections::). - - Consider the (useless) program: - - (defun foo (n) (if (plusp n) (* n (bar (1- n))) 1)) - (defun bar (n) (if (plusp n) (* n (foo (1- n))) 1)) - - After tracing both ‘foo’ and ‘bar’ with ‘C-c M-t’, calling call ‘(foo -2)’ and moving to the trace dialog with ‘C-c T’, we are presented with -this buffer. - - Traced specs (2) [refresh] - [untrace all] - [untrace] common-lisp-user::bar - [untrace] common-lisp-user::foo - - Trace collection status (3/3) [refresh] - [clear] - - 0 - common-lisp-user::foo - | > 2 - | < 2 - 1 `--- common-lisp-user::bar - | > 1 - | < 1 - 2 `-- common-lisp-user::foo - > 0 - < 1 - - The dialog is divided into sections displaying the functions already -traced, the trace collection progress and the actual trace tree that -follow your program’s logic. The most important key-bindings in this -buffer are: - -‘g’ -‘M-x slime-trace-dialog-fetch-status’ - Update information on the trace collection and traced specs. -‘G’ -‘M-x slime-trace-dialog-fetch-traces’ - Fetch the next batch of outstanding (not fetched yet) traces. With - a ‘C-u’ prefix argument, repeat until no more outstanding traces. -‘C-k’ -‘M-x slime-trace-dialog-clear-fetched-traces’ - Prompt for confirmation, then clear all traces, both fetched and - outstanding. - - The arguments and return values below each entry are interactive -buttons. Clicking them opens the inspector (*note Inspector::). -Invoking ‘M-RET’ (‘slime-trace-dialog-copy-down-to-repl’) returns them -to the REPL for manipulation (*note REPL::). The number left of each -entry indicates its absolute position in the calling order, which might -differ from display order in case multiple threads call the same traced -function. - - ‘slime-trace-dialog-hide-details-mode’ hides arguments and return -values so you can concentrate on the calling logic. Additionally, -‘slime-trace-dialog-autofollow-mode’ will automatically display -additional detail about an entry when the cursor moves over it. - - -File: slime.info, Node: slime-sprof, Next: SLIME Enhanced M-., Prev: SLIME Trace Dialog, Up: Contributed Packages - -8.20 ‘slime-sprof’ -================== - -‘slime-sprof’ is a package for integrating SBCL’s statistical profiler, -sb-sprof. - - The variable ‘slime-sprof-exclude-swank’ controls whether to display -swank functions. The default value is NIL. - -‘M-x slime-sprof-start’ - Start profiling. - -‘M-x slime-sprof-stop’ - Stop profiling. -‘M-x slime-sprof-report’ - Report results of the profiling. - - The following keys are defined in slime-sprof-browser mode: - -‘RET’ -‘M-x slime-sprof-browser-toggle’ - Expand / collapse function details (callers, calls to) -‘v’ -‘M-x slime-sprof-browser-view-source’ - View function sources. -‘d’ -‘M-x slime-sprof-browser-disassemble-function’ - Disassemble function. -‘s’ -‘M-x slime-sprof-toggle-swank-exclusion’ - Toggle exclusion of swank functions from the report. - - -File: slime.info, Node: SLIME Enhanced M-., Next: slime-fancy, Prev: slime-sprof, Up: Contributed Packages - -8.21 SLIME Enhanced M-. -======================= - -‘slime-mdot-fu’ enables meta-point to jump to local variables bound with -‘let’ and ‘let*’, in addition to function bindings declared with ‘flet’ -and ‘labels’, via ‘slime-edit-local-definition’. - - -File: slime.info, Node: slime-fancy, Next: Quicklisp, Prev: SLIME Enhanced M-., Up: Contributed Packages - -8.22 Meta package: ‘slime-fancy’ -================================ - -‘slime-fancy’ is a meta package which loads a combination of the most -popular packages. It is the default value of ‘slime-contribs’, thus it -is loaded by default. - - -File: slime.info, Node: Quicklisp, Prev: slime-fancy, Up: Contributed Packages - -8.23 Quicklisp -============== - -The package ‘slime-quicklisp’ adds support for loading Quicklisp systems -in the REPL buffer. In order for this to work, Quicklisp should have -already been loaded in the Lisp implementation. Refer to - for Quicklisp installation details. - - The package installs the following REPL shortcuts (*note -Shortcuts::): - -‘quicklisp-quickload (aka ql)’ - Load a Quicklisp system. - - -File: slime.info, Node: Credits, Next: Key Index, Prev: Contributed Packages, Up: Top - -9 Credits -********* - -_The soppy ending..._ - -Hackers of the good hack -======================== - -SLIME is an Extension of SLIM by Eric Marsden. At the time of writing, -the authors and code-contributors of SLIME are: - -Helmut Eller Tobias C. Rittweiler Stas Boukarev -Luke Gorrie Matthias Koeppe Luís Oliveira -Nikodemus Siivola Marco Baringer João Távora -Alan Ruttenberg Henry Harrington Mark Evenson -Christophe Rhodes Edi Weitz Martin Simmons -Juho Snellman Attila Lendvai Peter Seibel -Geo Carncross Douglas Crosher Daniel Kochmanski -Gábor Melis Daniel Barlow Wolfgang Jenkner -Stelian Ionescu Michael Weber Didier Verna -Lawrence Mitchell Anton Kovalenko Terje Norderhaug -Jan Moringen Brian Downing Bill Clementson -Andras Simon Adlai Chandrasekhar Zach Beane -Ivan Shvedunov Francois-Rene Rideau Espen Wiborg -António Menezes Leitão Utz-Uwe Haus Thomas Schilling -Thomas F. Burdick Takehiko Abe Sébastien Villemot -Richard M Kreuter Raymond Toy Matthew Danish -Mark Harig James Bielman Harald Hanche-Olsen -Ariel Badichi Andreas Fuchs Willem Broekema -Taylor R. Campbell Phil Hargett Paulo Madeira -Lars Magne John Paul Wallington Joerg Hoehle -Ingebrigtsen -David Reitter Bryan O’Connor Alexander Artemenko -Alan Shutko Ursa americanus Travis Cross - kermodei -Tobias Rittweiler Tiago Maduro-Dias Stefan Kamphausen -Sean O’Rourke Robert Lehr Robert E. Brown -Philipp Marek Peter S. Housel Nathan Trapuzzano -Nathan Bird Luís Borges de Jouni K Seppanen - Oliveira -Jon Oddie Ivan Toshkov Ian Eslick -Geoff Wozniak Gary King Fice T -Eric Blood Eduardo Muñoz Douglas Katzman -Christophe Junke Christian Schafmeister Christian Lynbech -Chris Capel Charles Zhang Bjørn Nordbø -Bart Botta Anton Vodonosov Alexey Dejneka -Alan Caulkins Yu-Chiang Hsu Yaroslav Kavenchuk -YOKOTA Yuki Wolfgang Mederle Wojciech Kaczmarek -William Bland Vitaly Mayatskikh Tomas Zellerin -Tom Pierce Tim Daly Jr. Syohei YOSHIDA -Sven Van Caekenberghe Svein Ove Aas Steve Smith -StanisBaw Halik Sergey Kostyaev Samuel Freilich -Russell McManus Russ Tyndall Rui Patrocínio -Robert P. Goldman Robert Macomber Robert Brown -Reini Urban R. Matthew Emerson Peter Feigl -Peter Pawel Ostrowski Paul Donnelly -Paul Collins Olof-Joachim Frahm Neil Van Dyke -NIIMI Satoshi Mészáros Levente Mikel Bancroft -MichaÅ‚ Herda Michael White Matthew Kennedy -Matthew D. Swank Matt Pillsbury Masayuki Onjo -Mark Wooding Mark Karpov Mark H. David -Marco Monteiro Lynn Quam Levente Mészáros -Leo Liu Lasse Rasinen Knut Olav Bøhmer -Kai Kaminski Julian Stecklina Juergen Gmeiner -Jon Allen Boone John Stracke John Smith -Johan BockgÃ¥rd Joe Robertson Jim Newton -Javier Olaechea Jan Rychter James McIlree -Jack Pugmire Ivan Sokolov Ivan Boldyrev -Ignas Mikalajunas Hannu Koivisto Graham Dobbins -Gerd Flaig Gail Zacharias Frederic Brunel -Eric Timmons Dustin Long Dmitry Igrishin -Deokhwan Kim Denis Budyak Daniel Koning -Daniel KochmaÅ„ski Dan Weinreb Dan Pierson -Cyrus Harmon Chris Schafmeister Cecil Westerhof -Brian Mastenbrook Brandon Bergren Bozhidar Batsov -Bob Halley Barry Fishman B.Scott Michel -Angelo Rossi Andrew Myers Aleksandar Bakic -Alain Picard Adam Bozanich - - ... not counting the bundled code from ‘hyperspec.el’, ‘CLOCC’, and -the ‘CMU AI Repository’. - - Many people on the ‘slime-devel’ mailing list have made non-code -contributions to SLIME. Life is hard though: you gotta send code to get -your name in the manual. ‘:-)’ - -Thanks! -======= - -We’re indebted to the good people of ‘common-lisp.net’ for their hosting -and help, and for rescuing us from “Sourceforge hell.†- - Implementors of the Lisps that we support have been a great help. -We’d like to thank the CMUCL maintainers for their helpful answers, -Craig Norvell and Kevin Layer at Franz providing Allegro CL licenses for -SLIME development, and Peter Graves for his help to get SLIME running -with ABCL. - - Most of all we’re happy to be working with the Lisp implementors -who’ve joined in the SLIME development: Dan Barlow and Christophe Rhodes -of SBCL, Gary Byers of OpenMCL, and Martin Simmons of LispWorks. Thanks -also to Alain Picard and Memetrics for funding Martin’s initial work on -the LispWorks backend! - - -File: slime.info, Node: Key Index, Next: Command Index, Prev: Credits, Up: Top - -Key (Character) Index -********************* - -[index] -* Menu: - -* .: Inspector. (line 61) -* :: Miscellaneous. (line 28) -* <: Frame Navigation. (line 23) -* >: Inspector. (line 65) -* > <1>: Frame Navigation. (line 19) -* a: Restarts. (line 8) -* A: Miscellaneous. (line 31) -* B: Miscellaneous. (line 19) -* c: Restarts. (line 18) -* C: Miscellaneous. (line 24) -* C-: Input Navigation. (line 14) -* C-: Input Navigation. (line 14) -* C-a: REPL commands. (line 28) -* C-c :: Evaluation. (line 33) -* C-c <: Cross-reference. (line 55) -* C-c >: Cross-reference. (line 59) -* C-c C-a: Other. (line 8) -* C-c C-b: Recovery. (line 8) -* C-c C-c: Compilation. (line 14) -* C-c C-c <1>: Xref buffer commands. - (line 19) -* C-c C-c <2>: Examining frames. (line 38) -* C-c C-c <3>: REPL commands. (line 32) -* C-c C-d #: Documentation. (line 59) -* C-c C-d A: Documentation. (line 25) -* C-c C-d a: slime-autodoc-mode. (line 22) -* C-c C-d d: Documentation. (line 17) -* C-c C-d f: Documentation. (line 21) -* C-c C-d h: Documentation. (line 44) -* C-c C-d p: Documentation. (line 37) -* C-c C-d z: Documentation. (line 33) -* C-c C-d ~: Documentation. (line 55) -* C-c C-j: REPL. (line 31) -* C-c C-k: Compilation. (line 28) -* C-c C-k <1>: Xref buffer commands. - (line 23) -* C-c C-l: Compilation. (line 44) -* C-c C-m: Macro-expansion. (line 8) -* C-c C-m <1>: slime-macroexpansion-minor-mode. - (line 12) -* C-c C-n: Input Navigation. (line 29) -* C-c C-o: REPL commands. (line 40) -* C-c C-p: Evaluation. (line 41) -* C-c C-p <1>: Input Navigation. (line 29) -* C-c C-r: Evaluation. (line 37) -* C-c C-s: Compound Completion. (line 48) -* C-c C-t: Disassembly. (line 12) -* C-c C-u: Evaluation. (line 52) -* C-c C-v: Other. (line 8) -* C-c C-v d: Presentations. (line 107) -* C-c C-v i: Presentations. (line 111) -* C-c C-v n: Presentations. (line 116) -* C-c C-v p: Presentations. (line 120) -* C-c C-v r: Presentations. (line 102) -* C-c C-v SPC: Presentations. (line 91) -* C-c C-v w: Presentations. (line 97) -* C-c C-w b: Cross-reference. (line 34) -* C-c C-w c: Cross-reference. (line 22) -* C-c C-w m: Cross-reference. (line 42) -* C-c C-w r: Cross-reference. (line 30) -* C-c C-w s: Cross-reference. (line 38) -* C-c C-w w: Cross-reference. (line 26) -* C-c C-x c: Multiple connections. - (line 27) -* C-c C-x n: Multiple connections. - (line 33) -* C-c C-x t: Multiple connections. - (line 39) -* C-c C-y: REPL. (line 27) -* C-c C-z: REPL. (line 23) -* C-c C-]: Editing Commands. (line 20) -* C-c E: Evaluation. (line 46) -* C-c I: Inspector. (line 16) -* C-c M-c: Compilation. (line 63) -* C-c M-d: Disassembly. (line 8) -* C-c M-i: Fuzzy Completion. (line 11) -* C-c M-k: Compilation. (line 40) -* C-c M-m: Macro-expansion. (line 19) -* C-c M-o: REPL commands. (line 36) -* C-c M-p: Recovery. (line 20) -* C-c M-q: Editing Commands. (line 11) -* C-c M-t: SLIME Trace Dialog. (line 26) -* C-c T: SLIME Trace Dialog. (line 39) -* C-c ~: Recovery. (line 15) -* C-j: REPL commands. (line 24) -* C-j <1>: Scratch Buffer. (line 13) -* C-k: SLIME Trace Dialog. (line 83) -* C-M-x: Evaluation. (line 19) -* C-RET: REPL commands. (line 15) -* C-x 4 .: Finding definitions. (line 23) -* C-x 5 .: Finding definitions. (line 28) -* C-x C-e: Evaluation. (line 13) -* C-x `: Compilation. (line 67) -* C-_: slime-macroexpansion-minor-mode. - (line 26) -* d: Inspector. (line 27) -* d <1>: Examining frames. (line 24) -* D: Examining frames. (line 29) -* d <2>: Multiple connections. - (line 56) -* d <3>: slime-sprof. (line 30) -* e: Inspector. (line 31) -* e <1>: Examining frames. (line 19) -* g: Inspector. (line 49) -* g <1>: slime-macroexpansion-minor-mode. - (line 17) -* g <2>: Multiple connections. - (line 61) -* g <3>: SLIME Trace Dialog. (line 76) -* G: SLIME Trace Dialog. (line 79) -* i: Examining frames. (line 34) -* l: Inspector. (line 41) -* M-,: Finding definitions. (line 18) -* M-.: Finding definitions. (line 13) -* M-C-a: Editing Commands. (line 38) -* M-C-e: Editing Commands. (line 40) -* M-n: Compilation. (line 55) -* M-n <1>: Frame Navigation. (line 12) -* M-n <2>: Input Navigation. (line 18) -* M-p: Compilation. (line 59) -* M-p <1>: Frame Navigation. (line 12) -* M-p <2>: Input Navigation. (line 18) -* M-r: Input Navigation. (line 25) -* M-RET: Inspector. (line 69) -* M-s: Input Navigation. (line 25) -* M-TAB: Completion. (line 13) -* n: Inspector. (line 45) -* n <1>: Frame Navigation. (line 8) -* o: Stepping. (line 21) -* p: Inspector. (line 57) -* p <1>: Frame Navigation. (line 8) -* q: Inspector. (line 53) -* q <1>: Restarts. (line 12) -* q <2>: slime-macroexpansion-minor-mode. - (line 22) -* q <3>: Multiple connections. - (line 65) -* r: Miscellaneous. (line 8) -* R: Miscellaneous. (line 14) -* R <1>: Multiple connections. - (line 70) -* RET: Xref buffer commands. - (line 10) -* RET <1>: Inspector. (line 22) -* RET <2>: Multiple connections. - (line 52) -* RET <3>: REPL commands. (line 8) -* RET <4>: slime-sprof. (line 24) -* s: Stepping. (line 11) -* s <1>: slime-sprof. (line 33) -* S-TAB: Inspector. (line 74) -* Space: Xref buffer commands. - (line 15) -* SPC: Documentation. (line 12) -* t: Examining frames. (line 10) -* TAB: Inspector. (line 74) -* TAB <1>: REPL commands. (line 20) -* v: Inspector. (line 36) -* v <1>: Examining frames. (line 14) -* v <2>: slime-sprof. (line 27) -* x: Stepping. (line 17) - - -File: slime.info, Node: Command Index, Next: Variable Index, Prev: Key Index, Up: Top - -Command and Function Index -************************** - -[index] -* Menu: - -* hyperspec-lookup-format: Documentation. (line 55) -* hyperspec-lookup-reader-macro: Documentation. (line 59) -* inferior-slime-mode: inferior-slime-mode. (line 15) -* next-error: Compilation. (line 67) -* sldb-abort: Restarts. (line 8) -* sldb-beginning-of-backtrace: Frame Navigation. (line 23) -* sldb-break-with-default-debugger: Miscellaneous. (line 19) -* sldb-break-with-system-debugger: Miscellaneous. (line 31) -* sldb-continue: Restarts. (line 18) -* sldb-details-down: Frame Navigation. (line 12) -* sldb-details-up: Frame Navigation. (line 12) -* sldb-disassemble: Examining frames. (line 29) -* sldb-down: Frame Navigation. (line 8) -* sldb-end-of-backtrace: Frame Navigation. (line 19) -* sldb-eval-in-frame: Examining frames. (line 19) -* sldb-inspect-condition: Miscellaneous. (line 24) -* sldb-inspect-in-frame: Examining frames. (line 34) -* sldb-next: Stepping. (line 17) -* sldb-out: Stepping. (line 21) -* sldb-pprint-eval-in-frame: Examining frames. (line 24) -* sldb-quit: Restarts. (line 12) -* sldb-recompile-frame-source: Examining frames. (line 38) -* sldb-restart-frame: Miscellaneous. (line 8) -* sldb-return-from-frame: Miscellaneous. (line 14) -* sldb-show-source: Examining frames. (line 14) -* sldb-step: Stepping. (line 11) -* sldb-toggle-details: Examining frames. (line 10) -* sldb-up: Frame Navigation. (line 8) -* slime-abort-connection: Multiple connections. - (line 79) -* slime-apropos: Documentation. (line 25) -* slime-apropos-all: Documentation. (line 33) -* slime-apropos-package: Documentation. (line 37) -* slime-arglist NAME: slime-autodoc-mode. (line 15) -* slime-autodoc-manually: slime-autodoc-mode. (line 22) -* slime-autodoc-mode: slime-autodoc-mode. (line 18) -* slime-beginning-of-defun: Editing Commands. (line 38) -* slime-browse-classes: Xref and Class Browser. - (line 10) -* slime-browse-system NAME: ASDF. (line 21) -* slime-browse-xrefs: Xref and Class Browser. - (line 14) -* slime-call-defun: REPL. (line 27) -* slime-calls-who: Cross-reference. (line 26) -* slime-cd: Recovery. (line 23) -* slime-close-all-parens-in-sexp: Editing Commands. (line 20) -* slime-compile-and-load-file: Compilation. (line 28) -* slime-compile-defun: Compilation. (line 14) -* slime-compile-file: Compilation. (line 40) -* slime-compile-region: Compilation. (line 47) -* slime-compiler-macroexpand: Macro-expansion. (line 25) -* slime-compiler-macroexpand-1: Macro-expansion. (line 22) -* slime-complete-form: Compound Completion. (line 48) -* slime-complete-symbol: Completion. (line 13) -* slime-connect: Multiple connections. - (line 73) -* slime-connection-list-make-default: Multiple connections. - (line 56) -* slime-copy-presentation-at-point-to-kill-ring: Presentations. - (line 97) -* slime-copy-presentation-at-point-to-repl: Presentations. (line 102) -* slime-cycle-connections: Multiple connections. - (line 33) -* slime-delete-system-fasls NAME: ASDF. (line 23) -* slime-describe-function: Documentation. (line 21) -* slime-describe-presentation-at-point: Presentations. (line 107) -* slime-describe-symbol: Documentation. (line 17) -* slime-disassemble-symbol: Disassembly. (line 8) -* slime-disconnect: Multiple connections. - (line 76) -* slime-edit-definition: Finding definitions. (line 13) -* slime-edit-definition-other-frame: Finding definitions. (line 28) -* slime-edit-definition-other-window: Finding definitions. (line 23) -* slime-edit-definition-with-etags: Finding definitions. (line 32) -* slime-edit-value: Evaluation. (line 46) -* slime-end-of-defun: Editing Commands. (line 40) -* slime-ensure-typeout-frame: Typeout frames. (line 15) -* slime-eval-defun: Evaluation. (line 19) -* slime-eval-last-expression: Evaluation. (line 13) -* slime-eval-last-expression-in-repl: REPL. (line 31) -* slime-eval-print-last-expression: Scratch Buffer. (line 13) -* slime-eval-region: Evaluation. (line 37) -* slime-expand-1: Macro-expansion. (line 8) -* slime-fuzzy-complete-symbol: Fuzzy Completion. (line 11) -* slime-goto-connection: Multiple connections. - (line 52) -* slime-goto-xref: Xref buffer commands. - (line 15) -* slime-highlight-edits-mode: Highlight Edits. (line 11) -* slime-hyperspec-lookup: Documentation. (line 44) -* slime-indent-and-complete-symbol: REPL commands. (line 20) -* slime-insert-balanced-comments: Editing Commands. (line 29) -* slime-inspect: Inspector. (line 16) -* slime-inspect-presentation-at-point: Presentations. (line 111) -* slime-inspector-copy-down: Inspector. (line 69) -* slime-inspector-describe: Inspector. (line 27) -* slime-inspector-eval: Inspector. (line 31) -* slime-inspector-fetch-all: Inspector. (line 65) -* slime-inspector-next: Inspector. (line 45) -* slime-inspector-next-inspectable-object: Inspector. (line 74) -* slime-inspector-operate-on-point: Inspector. (line 22) -* slime-inspector-pop: Inspector. (line 41) -* slime-inspector-pprint: Inspector. (line 57) -* slime-inspector-previous-inspectable-object: Inspector. (line 74) -* slime-inspector-quit: Inspector. (line 53) -* slime-inspector-reinspect: Inspector. (line 49) -* slime-inspector-show-source: Inspector. (line 61) -* slime-inspector-toggle-verbose: Inspector. (line 36) -* slime-interactive-eval: Evaluation. (line 33) -* slime-interactive-eval <1>: Miscellaneous. (line 28) -* slime-interrupt: Recovery. (line 8) -* slime-interrupt <1>: REPL commands. (line 32) -* slime-isearch-system NAME: ASDF. (line 27) -* slime-list-callees: Cross-reference. (line 59) -* slime-list-callers: Cross-reference. (line 55) -* slime-list-connections: Multiple connections. - (line 27) -* slime-list-threads: Multiple connections. - (line 39) -* slime-load-file: Compilation. (line 44) -* slime-load-system NAME: ASDF. (line 13) -* slime-macroexpand-1: Macro-expansion. (line 14) -* slime-macroexpand-1-inplace: slime-macroexpansion-minor-mode. - (line 12) -* slime-macroexpand-1-inplace <1>: slime-macroexpansion-minor-mode. - (line 17) -* slime-macroexpand-all: Macro-expansion. (line 19) -* slime-macroexpand-undo: slime-macroexpansion-minor-mode. - (line 26) -* slime-mark-presentation: Presentations. (line 91) -* slime-next-note: Compilation. (line 55) -* slime-next-presentation: Presentations. (line 116) -* slime-nop: Other. (line 8) -* slime-nop <1>: Other. (line 8) -* slime-open-system NAME &optional LOAD: ASDF. (line 19) -* slime-pop-find-definition-stack: Finding definitions. (line 18) -* slime-pprint-eval-last-expression: Evaluation. (line 41) -* slime-previous-note: Compilation. (line 59) -* slime-previous-presentation: Presentations. (line 120) -* slime-profile-by-substring: Profiling. (line 15) -* slime-profile-package: Profiling. (line 13) -* slime-profile-report: Profiling. (line 19) -* slime-profile-reset: Profiling. (line 21) -* slime-profiled-functions: Profiling. (line 23) -* slime-pwd: Recovery. (line 27) -* slime-query-replace-system NAME FROM TO &OPTIONAL DELIMITED: ASDF. - (line 29) -* slime-recompile-all-xrefs: Xref buffer commands. - (line 23) -* slime-recompile-xref: Xref buffer commands. - (line 19) -* slime-reindent-defun: Editing Commands. (line 11) -* slime-reload-system NAME: ASDF. (line 16) -* slime-remove-notes: Compilation. (line 63) -* slime-repl-backward-input: Input Navigation. (line 14) -* slime-repl-bol: REPL commands. (line 28) -* slime-repl-clear-buffer: REPL commands. (line 36) -* slime-repl-clear-output: REPL commands. (line 40) -* slime-repl-closing-return: REPL commands. (line 15) -* slime-repl-forward-input: Input Navigation. (line 14) -* slime-repl-newline-and-indent: REPL commands. (line 24) -* slime-repl-next-input: Input Navigation. (line 18) -* slime-repl-next-matching-input: Input Navigation. (line 25) -* slime-repl-next-prompt: Input Navigation. (line 29) -* slime-repl-previous-input: Input Navigation. (line 18) -* slime-repl-previous-matching-input: Input Navigation. (line 25) -* slime-repl-previous-prompt: Input Navigation. (line 29) -* slime-repl-return: REPL commands. (line 8) -* slime-repl-set-package: Recovery. (line 20) -* slime-restart-connection-at-point: Multiple connections. - (line 70) -* slime-restart-inferior-lisp: Recovery. (line 11) -* slime-rgrep-system NAME REGEXP: ASDF. (line 25) -* slime-scratch: Scratch Buffer. (line 17) -* slime-show-xref: Xref buffer commands. - (line 10) -* slime-space: Documentation. (line 12) -* slime-sprof-browser-disassemble-function: slime-sprof. (line 30) -* slime-sprof-browser-toggle: slime-sprof. (line 24) -* slime-sprof-browser-view-source: slime-sprof. (line 27) -* slime-sprof-report: slime-sprof. (line 18) -* slime-sprof-start: slime-sprof. (line 13) -* slime-sprof-stop: slime-sprof. (line 16) -* slime-sprof-toggle-swank-exclusion: slime-sprof. (line 33) -* slime-switch-to-output-buffer: REPL. (line 23) -* slime-sync-package-and-default-directory: Recovery. (line 15) -* slime-temp-buffer-quit: slime-macroexpansion-minor-mode. - (line 22) -* slime-temp-buffer-quit <1>: Multiple connections. - (line 65) -* slime-toggle-profile-fdefinition: Profiling. (line 11) -* slime-toggle-trace-fdefinition: Disassembly. (line 12) -* slime-trace-dialog: SLIME Trace Dialog. (line 39) -* slime-trace-dialog-clear-fetched-traces: SLIME Trace Dialog. - (line 83) -* slime-trace-dialog-fetch-status: SLIME Trace Dialog. (line 76) -* slime-trace-dialog-fetch-traces: SLIME Trace Dialog. (line 79) -* slime-trace-dialog-toggle-trace: SLIME Trace Dialog. (line 26) -* slime-undefine-function: Evaluation. (line 52) -* slime-unprofile-all: Profiling. (line 17) -* slime-untrace-all: Disassembly. (line 17) -* slime-update-connection-list: Multiple connections. - (line 61) -* slime-who-binds: Cross-reference. (line 34) -* slime-who-calls: Cross-reference. (line 22) -* slime-who-macroexpands: Cross-reference. (line 42) -* slime-who-references: Cross-reference. (line 30) -* slime-who-sets: Cross-reference. (line 38) -* slime-who-specializes: Cross-reference. (line 45) - - -File: slime.info, Node: Variable Index, Prev: Command Index, Up: Top - -Variable and Concept Index -************************** - -[index] -* Menu: - -* ASCII: Emacs-side customization. - (line 35) -* Character Encoding: Emacs-side customization. - (line 35) -* Compilation: Compilation. (line 6) -* Compiling Functions: Compilation. (line 12) -* Completion: Completion. (line 6) -* Contribs: Loading Contribs. (line 6) -* Contributions: Loading Contribs. (line 6) -* Cross-referencing: Cross-reference. (line 6) -* Debugger: Debugger. (line 6) -* inferior-lisp-program: Installation. (line 27) -* inferior-slime-mode-map: inferior-slime-mode. (line 17) -* Input History: Input Navigation. (line 6) -* LATIN-1: Emacs-side customization. - (line 35) -* Listener: REPL. (line 6) -* load-path: Installation. (line 27) -* Macros: Macro-expansion. (line 6) -* Meta-dot: Finding definitions. (line 6) -* Methods: Fancy Inspector. (line 6) -* Plugins: Loading Contribs. (line 6) -* Presentations: Presentations. (line 6) -* Shortcuts: Shortcuts. (line 6) -* sldb-hook: Hooks. (line 17) -* slime-autodoc-mode-string: slime-autodoc-mode. (line 32) -* slime-autodoc-use-multiline-p: slime-autodoc-mode. (line 29) -* slime-completion-at-point-functions: Emacs-side customization. - (line 17) -* slime-connected-hook: Hooks. (line 12) -* slime-default-lisp: Multiple Lisps. (line 17) -* slime-description-autofocus: Temporary buffers. (line 27) -* slime-filename-translations: Emacs-side customization. - (line 28) -* slime-header-line-p: Banner. (line 10) -* slime-lisp-implementations: Multiple Lisps. (line 13) -* slime-mode-hook: Hooks. (line 6) -* slime-net-coding-system: Emacs-side customization. - (line 35) -* slime-repl-wrap-history: Input Navigation. (line 33) -* slime-startup-animation: Banner. (line 10) -* slime-use-autodoc-mode: slime-autodoc-mode. (line 25) -* Stepping: Stepping. (line 6) -* SWANK:*BACKTRACE-PRINTER-BINDINGS*: Other configurables. (line 42) -* SWANK:*COMMUNICATION-STYLE*: Communication style. (line 6) -* SWANK:*CONFIGURE-EMACS-INDENTATION*: Other configurables. (line 8) -* SWANK:*DEDICATED-OUTPUT-STREAM-PORT*: Other configurables. (line 69) -* SWANK:*GLOBAL-DEBUGGER*: Other configurables. (line 27) -* SWANK:*GLOBALLY-REDIRECT-IO*: Other configurables. (line 13) -* SWANK:*LOG-EVENTS*: Other configurables. (line 74) -* SWANK:*MACROEXPAND-PRINTER-BINDINGS*: Other configurables. (line 42) -* SWANK:*SLDB-PRINTER-BINDINGS*: Other configurables. (line 42) -* SWANK:*SLDB-QUIT-RESTART*: Other configurables. (line 33) -* SWANK:*SWANK-PPRINT-BINDINGS*: Other configurables. (line 42) -* SWANK:*USE-DEDICATED-OUTPUT-STREAM*: Other configurables. (line 53) -* Symbol Completion: Completion. (line 6) -* TAGS: Finding definitions. (line 6) -* TRAMP: TRAMP. (line 6) -* Typeout Frame: Typeout frames. (line 6) -* Unicode: Emacs-side customization. - (line 35) -* UTF-8: Emacs-side customization. - (line 35) -* xref: Cross-reference. (line 6) - - - -Tag Table: -Node: Top285 -Node: Introduction2525 -Node: Getting started3806 -Node: Platforms4080 -Node: Downloading5278 -Node: Git5779 -Node: Git Incantations6797 -Node: Installation7327 -Node: Running8593 -Node: Setup Tuning9136 -Node: Basic customization9667 -Node: Multiple Lisps10640 -Node: Loading Swank faster13134 -Ref: init-example14227 -Node: SLIME mode14516 -Node: User-interface conventions15114 -Node: Temporary buffers15523 -Node: Inferior-lisp16976 -Node: Multithreading17801 -Node: Key bindings19046 -Ref: describe-key20512 -Ref: describe-bindings20655 -Ref: describe-mode20798 -Ref: view-lossage20982 -Node: Evaluation22177 -Node: Compilation24082 -Node: Completion26841 -Node: Finding definitions27472 -Node: Documentation28612 -Node: Cross-reference30779 -Node: Xref buffer commands32516 -Node: Macro-expansion33075 -Node: Disassembly34096 -Node: Recovery34641 -Node: Inspector35410 -Node: Profiling37648 -Node: Other38445 -Node: Semantic indentation38698 -Ref: Semantic indentation-Footnote-140829 -Node: Reader conditionals40924 -Node: Debugger41275 -Node: Examining frames41915 -Node: Restarts43047 -Ref: sldb-quit43261 -Node: Frame Navigation43688 -Node: Stepping44388 -Node: Miscellaneous45060 -Node: Misc45999 -Node: slime-selector46186 -Node: slime-macroexpansion-minor-mode47568 -Node: Multiple connections48423 -Node: Customization51483 -Node: Emacs-side customization51658 -Ref: slime-completion-at-point-functions52351 -Ref: slime-net-coding-system53242 -Node: Hooks53915 -Ref: slime-connected-hook54280 -Node: Lisp-side54764 -Node: Communication style55174 -Node: Other configurables57736 -Ref: *SLDB-QUIT-RESTART*59134 -Node: Tips and Tricks61725 -Node: Connecting to a remote lisp61950 -Node: Setting up the lisp image62655 -Ref: Setting up the lisp image-Footnote-164543 -Ref: Setting up the lisp image-Footnote-264623 -Node: Setting up Emacs64799 -Ref: Setting up Emacs-Footnote-165635 -Node: Setting up pathname translations65815 -Node: Global IO Redirection67456 -Node: Auto-SLIME68389 -Node: Contributed Packages68810 -Node: Loading Contribs69559 -Node: REPL71519 -Node: REPL commands72934 -Node: Input Navigation74095 -Node: Shortcuts75619 -Node: slime-mrepl77115 -Node: inferior-slime-mode77623 -Node: Compound Completion78328 -Ref: slime-complete-symbol*78505 -Ref: Compound Completion-Footnote-181757 -Node: Fuzzy Completion81881 -Ref: slime-fuzzy-complete-symbol82134 -Node: slime-autodoc-mode85426 -Node: ASDF86844 -Node: Banner88802 -Node: Editing Commands89248 -Node: Fancy Inspector90875 -Node: Presentations91606 -Ref: Presentations-Footnote-198162 -Node: Typeout frames98403 -Node: TRAMP99527 -Node: Documentation Links99803 -Node: Xref and Class Browser100228 -Node: Highlight Edits100820 -Node: Scratch Buffer101292 -Ref: slime-scratch101454 -Node: SLIME Trace Dialog102109 -Node: slime-sprof106097 -Node: SLIME Enhanced M-.107085 -Node: slime-fancy107467 -Node: Quicklisp107823 -Node: Credits108351 -Node: Key Index113955 -Node: Command Index125745 -Node: Variable Index140987 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: diff --git a/elpa/slime-20200414.1444/start-swank.lisp b/elpa/slime-20200414.1444/start-swank.lisp deleted file mode 100644 index 340606cc..00000000 --- a/elpa/slime-20200414.1444/start-swank.lisp +++ /dev/null @@ -1,20 +0,0 @@ -;;; This file is intended to be loaded by an implementation to -;;; get a running swank server -;;; e.g. sbcl --load start-swank.lisp -;;; -;;; Default port is 4005 - -;;; For additional swank-side configurations see -;;; 6.2 section of the Slime user manual. - -(load (merge-pathnames "swank-loader.lisp" *load-truename*)) - -(swank-loader:init - :delete nil ; delete any existing SWANK packages - :reload nil ; reload SWANK, even if the SWANK package already exists - :load-contribs nil) ; load all contribs - -(swank:create-server :port 4005 - ;; if non-nil the connection won't be closed - ;; after connecting - :dont-close nil) diff --git a/elpa/slime-20200414.1444/swank-loader.lisp b/elpa/slime-20200414.1444/swank-loader.lisp deleted file mode 100644 index fbd34e15..00000000 --- a/elpa/slime-20200414.1444/swank-loader.lisp +++ /dev/null @@ -1,376 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-loader.lisp --- Compile and load the Slime backend. -;;; -;;; Created 2003, James Bielman -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -;; If you want customize the source- or fasl-directory you can set -;; swank-loader:*source-directory* resp. swank-loader:*fasl-directory* -;; before loading this files. -;; E.g.: -;; -;; (load ".../swank-loader.lisp") -;; (setq swank-loader::*fasl-directory* "/tmp/fasl/") -;; (swank-loader:init) - -(cl:defpackage :swank-loader - (:use :cl) - (:export :init - :dump-image - :list-fasls - :*source-directory* - :*fasl-directory* - :*started-from-emacs*)) - -(cl:in-package :swank-loader) - -(defvar *started-from-emacs* nil) - -(defvar *source-directory* - (make-pathname :name nil :type nil - :defaults (or *load-pathname* *default-pathname-defaults*)) - "The directory where to look for the source.") - -(defparameter *sysdep-files* - #+cmu '((swank source-path-parser) (swank source-file-cache) (swank cmucl) - (swank gray)) - #+scl '((swank source-path-parser) (swank source-file-cache) (swank scl) - (swank gray)) - #+sbcl '((swank source-path-parser) (swank source-file-cache) (swank sbcl) - (swank gray)) - #+clozure '(metering (swank ccl) (swank gray)) - #+lispworks '((swank lispworks) (swank gray)) - #+allegro '((swank allegro) (swank gray)) - #+clisp '(xref metering (swank clisp) (swank gray)) - #+armedbear '((swank abcl)) - #+cormanlisp '((swank corman) (swank gray)) - #+ecl '((swank ecl) (swank gray)) - #+clasp '((swank clasp) (swank gray)) - #+mkcl '((swank mkcl) (swank gray)) - #+mezzano '((swank mezzano) (swank gray)) - ) - -(defparameter *implementation-features* - '(:allegro :lispworks :sbcl :clozure :cmu :clisp :ccl :corman :cormanlisp - :armedbear :gcl :ecl :scl :mkcl :clasp :mezzano)) - -(defparameter *os-features* - '(:macosx :linux :windows :mswindows :win32 :solaris :darwin :sunos :hpux - :unix :mezzano)) - -(defparameter *architecture-features* - '(:powerpc :ppc :ppc64 :x86 :x86-64 :x86_64 :amd64 :i686 :i586 :i486 :pc386 :iapx386 - :sparc64 :sparc :hppa64 :hppa :arm :armv5l :armv6l :armv7l :arm64 :aarch64 - :pentium3 :pentium4 - :mips :mipsel - :java-1.4 :java-1.5 :java-1.6 :java-1.7)) - -(defun q (s) (read-from-string s)) - -#+ecl -(defun ecl-version-string () - (format nil "~A~@[-~A~]" - (lisp-implementation-version) - (when (find-symbol "LISP-IMPLEMENTATION-VCS-ID" :ext) - (let ((vcs-id (funcall (q "ext:lisp-implementation-vcs-id")))) - (when (>= (length vcs-id) 8) - (subseq vcs-id 0 8)))))) - -#+clasp -(defun clasp-version-string () - (format nil "~A~@[-~A~]" - (lisp-implementation-version) - (core:lisp-implementation-id))) - -(defun lisp-version-string () - #+(or clozure cmu) (substitute-if #\_ (lambda (x) (find x " /")) - (lisp-implementation-version)) - #+(or cormanlisp scl mkcl) (lisp-implementation-version) - #+sbcl (format nil "~a~:[~;-no-threads~]" - (lisp-implementation-version) - #+sb-thread nil - #-sb-thread t) - #+lispworks (lisp-implementation-version) - #+allegro (format nil "~@{~a~}" - excl::*common-lisp-version-number* - (if (string= 'lisp "LISP") "A" "M") ; ANSI vs MoDeRn - (if (member :smp *features*) "s" "") - (if (member :64bit *features*) "-64bit" "") - (excl:ics-target-case - (:-ics "") - (:+ics "-ics"))) - #+clisp (let ((s (lisp-implementation-version))) - (subseq s 0 (position #\space s))) - #+armedbear (lisp-implementation-version) - #+ecl (ecl-version-string) - #+clasp (clasp-version-string) - #+mezzano (let ((s (lisp-implementation-version))) - (subseq s 0 (position #\space s)))) - -(defun unique-dir-name () - "Return a name that can be used as a directory name that is -unique to a Lisp implementation, Lisp implementation version, -operating system, and hardware architecture." - (flet ((first-of (features) - (loop for f in features - when (find f *features*) return it)) - (maybe-warn (value fstring &rest args) - (cond (value) - (t (apply #'warn fstring args) - "unknown")))) - (let ((lisp (maybe-warn (first-of *implementation-features*) - "No implementation feature found in ~a." - *implementation-features*)) - (os (maybe-warn (first-of *os-features*) - "No os feature found in ~a." *os-features*)) - (arch (maybe-warn (first-of *architecture-features*) - "No architecture feature found in ~a." - *architecture-features*)) - (version (maybe-warn (lisp-version-string) - "Don't know how to get Lisp ~ - implementation version."))) - (format nil "~(~@{~a~^-~}~)" lisp version os arch)))) - -(defun file-newer-p (new-file old-file) - "Returns true if NEW-FILE is newer than OLD-FILE." - (> (file-write-date new-file) (file-write-date old-file))) - -(defun string-starts-with (string prefix) - (string-equal string prefix :end1 (min (length string) (length prefix)))) - -(defun slime-version-string () - "Return a string identifying the SLIME version. -Return nil if nothing appropriate is available." - (with-open-file (s (merge-pathnames "slime.el" *source-directory*) - :if-does-not-exist nil) - (when s - (loop with prefix = ";; Version: " - for line = (read-line s nil :eof) - until (eq line :eof) - when (string-starts-with line prefix) - return (subseq line (length prefix)))))) - -(defun default-fasl-dir () - (merge-pathnames - (make-pathname - :directory `(:relative ".slime" "fasl" - ,@(if (slime-version-string) (list (slime-version-string))) - ,(unique-dir-name))) - (user-homedir-pathname))) - -(defvar *fasl-directory* (default-fasl-dir) - "The directory where fasl files should be placed.") - -(defun binary-pathname (src-pathname binary-dir) - "Return the pathname where SRC-PATHNAME's binary should be compiled." - (let ((cfp (compile-file-pathname src-pathname))) - (merge-pathnames (make-pathname :name (pathname-name cfp) - :type (pathname-type cfp)) - binary-dir))) - -(defun handle-swank-load-error (condition context pathname) - (fresh-line *error-output*) - (pprint-logical-block (*error-output* () :per-line-prefix ";; ") - (format *error-output* - "~%Error ~A ~A:~% ~A~%" - context pathname condition))) - -(defun compile-files (files fasl-dir load quiet) - "Compile each file in FILES if the source is newer than its -corresponding binary, or the file preceding it was recompiled. -If LOAD is true, load the fasl file." - (let ((needs-recompile nil) - (state :unknown)) - (dolist (src files) - (let ((dest (binary-pathname src fasl-dir))) - (handler-bind - ((error (lambda (c) - (ecase state - (:compile (handle-swank-load-error c "compiling" src)) - (:load (handle-swank-load-error c "loading" dest)) - (:unknown (handle-swank-load-error c "???ing" src)))))) - (when (or needs-recompile - (not (probe-file dest)) - (file-newer-p src dest)) - (ensure-directories-exist dest) - ;; need to recompile SRC, so we'll need to recompile - ;; everything after this too. - (setf needs-recompile t - state :compile) - (or (compile-file src :output-file dest :print nil - :verbose (not quiet)) - ;; An implementation may not necessarily signal a - ;; condition itself when COMPILE-FILE fails (e.g. ECL) - (error "COMPILE-FILE returned NIL."))) - (when load - (setf state :load) - (load dest :verbose (not quiet)))))))) - -#+cormanlisp -(defun compile-files (files fasl-dir load quiet) - "Corman Lisp has trouble with compiled files." - (declare (ignore fasl-dir)) - (when load - (dolist (file files) - (load file :verbose (not quiet) - (force-output))))) - -(defun load-user-init-file () - "Load the user init file, return NIL if it does not exist." - (load (merge-pathnames (user-homedir-pathname) - (make-pathname :name ".swank" :type "lisp")) - :if-does-not-exist nil)) - -(defun load-site-init-file (dir) - (load (make-pathname :name "site-init" :type "lisp" - :defaults dir) - :if-does-not-exist nil)) - -(defun src-files (names src-dir) - (mapcar (lambda (name) - (multiple-value-bind (dirs name) - (etypecase name - (symbol (values '() name)) - (cons (values (butlast name) (car (last name))))) - (make-pathname - :directory (append (or (pathname-directory src-dir) - '(:relative)) - (mapcar #'string-downcase dirs)) - :name (string-downcase name) - :type "lisp" - :defaults src-dir))) - names)) - -(defvar *swank-files* - `(packages - (swank backend) ,@*sysdep-files* (swank match) (swank rpc) - swank)) - -(defvar *contribs* - '(swank-util swank-repl - swank-c-p-c swank-arglists swank-fuzzy - swank-fancy-inspector - swank-presentations swank-presentation-streams - #+(or asdf2 asdf3 sbcl ecl) swank-asdf - swank-package-fu - swank-hyperdoc - #+sbcl swank-sbcl-exts - swank-mrepl - swank-trace-dialog - swank-macrostep - swank-quicklisp) - "List of names for contrib modules.") - -(defun append-dir (absolute name) - (merge-pathnames - (make-pathname :directory `(:relative ,name) :defaults absolute) - absolute)) - -(defun contrib-dir (base-dir) - (append-dir base-dir "contrib")) - -(defun load-swank (&key (src-dir *source-directory*) - (fasl-dir *fasl-directory*) - quiet) - (with-compilation-unit () - (compile-files (src-files *swank-files* src-dir) fasl-dir t quiet)) - (funcall (q "swank::before-init") - (slime-version-string) - (list (contrib-dir fasl-dir) - (contrib-dir src-dir)))) - -(defun delete-stale-contrib-fasl-files (swank-files contrib-files fasl-dir) - (let ((newest (reduce #'max (mapcar #'file-write-date swank-files)))) - (dolist (src contrib-files) - (let ((fasl (binary-pathname src fasl-dir))) - (when (and (probe-file fasl) - (<= (file-write-date fasl) newest)) - (delete-file fasl)))))) - -(defun compile-contribs (&key (src-dir (contrib-dir *source-directory*)) - (fasl-dir (contrib-dir *fasl-directory*)) - (swank-src-dir *source-directory*) - load quiet) - (let* ((swank-src-files (src-files *swank-files* swank-src-dir)) - (contrib-src-files (src-files *contribs* src-dir))) - (delete-stale-contrib-fasl-files swank-src-files contrib-src-files - fasl-dir) - (compile-files contrib-src-files fasl-dir load quiet))) - -(defun loadup () - (load-swank) - (compile-contribs :load t)) - -(defun setup () - (load-site-init-file *source-directory*) - (load-user-init-file) - (when (#-clisp probe-file - #+clisp ext:probe-directory - (contrib-dir *source-directory*)) - (eval `(pushnew 'compile-contribs ,(q "swank::*after-init-hook*")))) - (funcall (q "swank::init"))) - -(defun list-swank-packages () - (remove-if-not (lambda (package) - (let ((name (package-name package))) - (and (string-not-equal name "swank-loader") - (string-starts-with name "swank")))) - (list-all-packages))) - -(defun delete-packages (packages) - (dolist (package packages) - (flet ((handle-package-error (c) - (let ((pkgs (set-difference (package-used-by-list package) - packages))) - (when pkgs - (warn "deleting ~a which is used by ~{~a~^, ~}." - package pkgs)) - (continue c)))) - (handler-bind ((package-error #'handle-package-error)) - (delete-package package))))) - -(defun init (&key delete reload load-contribs (setup t) - (quiet (not *load-verbose*)) - from-emacs) - "Load SWANK and initialize some global variables. -If DELETE is true, delete any existing SWANK packages. -If RELOAD is true, reload SWANK, even if the SWANK package already exists. -If LOAD-CONTRIBS is true, load all contribs -If SETUP is true, load user init files and initialize some -global variabes in SWANK." - (when from-emacs - (setf *started-from-emacs* t)) - (when (and delete (find-package :swank)) - (delete-packages (list-swank-packages))) - (cond ((or (not (find-package :swank)) reload) - (load-swank :quiet quiet)) - (t - (warn "Not reloading SWANK. Package already exists."))) - (when load-contribs - (compile-contribs :load t :quiet quiet)) - (when setup - (setup))) - -(defun dump-image (filename) - (init :setup nil) - (funcall (q "swank/backend:save-image") filename)) - -(defun list-fasls (&key (include-contribs t) (compile t) - (quiet (not *compile-verbose*))) - "List up SWANK's fasls along with their dependencies." - (flet ((collect-fasls (files fasl-dir) - (when compile - (compile-files files fasl-dir nil quiet)) - (loop for src in files - when (probe-file (binary-pathname src fasl-dir)) - collect it))) - (append (collect-fasls (src-files *swank-files* *source-directory*) - *fasl-directory*) - (when include-contribs - (collect-fasls (src-files *contribs* - (contrib-dir *source-directory*)) - (contrib-dir *fasl-directory*)))))) diff --git a/elpa/slime-20200414.1444/swank.asd b/elpa/slime-20200414.1444/swank.asd deleted file mode 100644 index 33e14ff6..00000000 --- a/elpa/slime-20200414.1444/swank.asd +++ /dev/null @@ -1,36 +0,0 @@ -;;; -*- lisp -*- - -;; ASDF system definition for loading the Swank server independently -;; of Emacs. -;; -;; This is only useful if you want to start a Swank server in a Lisp -;; processes that doesn't run under Emacs. Lisp processes created by -;; `M-x slime' automatically start the server. - -;; Usage: -;; -;; (require :swank) -;; (swank:create-swank-server PORT) => ACTUAL-PORT -;; -;; (PORT can be zero to mean "any available port".) -;; Then the Swank server is running on localhost:ACTUAL-PORT. You can -;; use `M-x slime-connect' to connect Emacs to it. -;; -;; This code has been placed in the Public Domain. All warranties -;; are disclaimed. - -(defclass swank-loader-file (asdf:cl-source-file) ()) - -;;;; after loading run init - -(defmethod asdf:perform ((o asdf:load-op) (f swank-loader-file)) - ;; swank-loader computes its own source/fasl relation based on the - ;; TRUENAME of the loader file, so we need a "manual" CL:LOAD - ;; invocation here. - (load (asdf::component-pathname f)) - ;; After loading, run the swank-loader init routines. - (funcall (read-from-string "swank-loader::init") :reload t)) - -(asdf:defsystem :swank - :default-component-class swank-loader-file - :components ((:file "swank-loader"))) diff --git a/elpa/slime-20200414.1444/swank.lisp b/elpa/slime-20200414.1444/swank.lisp deleted file mode 100644 index dfdde579..00000000 --- a/elpa/slime-20200414.1444/swank.lisp +++ /dev/null @@ -1,3800 +0,0 @@ -;;;; swank.lisp --- Server for SLIME commands. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; -;;; This file defines the "Swank" TCP server for Emacs to talk to. The -;;; code in this file is purely portable Common Lisp. We do require a -;;; smattering of non-portable functions in order to write the server, -;;; so we have defined them in `swank/backend.lisp' and implemented -;;; them separately for each Lisp implementation. These extensions are -;;; available to us here via the `SWANK/BACKEND' package. - -(in-package :swank) -;;;; Top-level variables, constants, macros - -(defconstant cl-package (find-package :cl) - "The COMMON-LISP package.") - -(defconstant keyword-package (find-package :keyword) - "The KEYWORD package.") - -(defconstant default-server-port 4005 - "The default TCP port for the server (when started manually).") - -(defvar *swank-debug-p* t - "When true, print extra debugging information.") - -(defvar *backtrace-pprint-dispatch-table* - (let ((table (copy-pprint-dispatch nil))) - (flet ((print-string (stream string) - (cond (*print-escape* - (escape-string string stream - :map '((#\" . "\\\"") - (#\\ . "\\\\") - (#\newline . "\\n") - (#\return . "\\r")))) - (t (write-string string stream))))) - (set-pprint-dispatch 'string #'print-string 0 table) - table))) - -(defvar *backtrace-printer-bindings* - `((*print-pretty* . t) - (*print-readably* . nil) - (*print-level* . 4) - (*print-length* . 6) - (*print-lines* . 1) - (*print-right-margin* . 200) - (*print-pprint-dispatch* . ,*backtrace-pprint-dispatch-table*)) - "Pretter settings for printing backtraces.") - -(defvar *default-worker-thread-bindings* '() - "An alist to initialize dynamic variables in worker threads. -The list has the form ((VAR . VALUE) ...). Each variable VAR will be -bound to the corresponding VALUE.") - -(defun call-with-bindings (alist fun) - "Call FUN with variables bound according to ALIST. -ALIST is a list of the form ((VAR . VAL) ...)." - (if (null alist) - (funcall fun) - (let* ((rlist (reverse alist)) - (vars (mapcar #'car rlist)) - (vals (mapcar #'cdr rlist))) - (progv vars vals - (funcall fun))))) - -(defmacro with-bindings (alist &body body) - "See `call-with-bindings'." - `(call-with-bindings ,alist (lambda () ,@body))) - -;;; The `DEFSLIMEFUN' macro defines a function that Emacs can call via -;;; RPC. - -(defmacro defslimefun (name arglist &body rest) - "A DEFUN for functions that Emacs can call by RPC." - `(progn - (defun ,name ,arglist ,@rest) - ;; see - (eval-when (:compile-toplevel :load-toplevel :execute) - (export ',name (symbol-package ',name))))) - -(defun missing-arg () - "A function that the compiler knows will never to return a value. -You can use (MISSING-ARG) as the initform for defstruct slots that -must always be supplied. This way the :TYPE slot option need not -include some arbitrary initial value like NIL." - (error "A required &KEY or &OPTIONAL argument was not supplied.")) - - -;;;; Hooks -;;; -;;; We use Emacs-like `add-hook' and `run-hook' utilities to support -;;; simple indirection. The interface is more CLish than the Emacs -;;; Lisp one. - -(defmacro add-hook (place function) - "Add FUNCTION to the list of values on PLACE." - `(pushnew ,function ,place)) - -(defun run-hook (functions &rest arguments) - "Call each of FUNCTIONS with ARGUMENTS." - (dolist (function functions) - (apply function arguments))) - -(defun run-hook-until-success (functions &rest arguments) - "Call each of FUNCTIONS with ARGUMENTS, stop if any function returns -a truthy value" - (loop for hook in functions - thereis (apply hook arguments))) - -(defvar *new-connection-hook* '() - "This hook is run each time a connection is established. -The connection structure is given as the argument. -Backend code should treat the connection structure as opaque.") - -(defvar *connection-closed-hook* '() - "This hook is run when a connection is closed. -The connection as passed as an argument. -Backend code should treat the connection structure as opaque.") - -(defvar *pre-reply-hook* '() - "Hook run (without arguments) immediately before replying to an RPC.") - -(defvar *after-init-hook* '() - "Hook run after user init files are loaded.") - - -;;;; Connections -;;; -;;; Connection structures represent the network connections between -;;; Emacs and Lisp. Each has a socket stream, a set of user I/O -;;; streams that redirect to Emacs, and optionally a second socket -;;; used solely to pipe user-output to Emacs (an optimization). This -;;; is also the place where we keep everything that needs to be -;;; freed/closed/killed when we disconnect. - -(defstruct (connection - (:constructor %make-connection) - (:conc-name connection.) - (:print-function print-connection)) - ;; The listening socket. (usually closed) - (socket (missing-arg) :type t :read-only t) - ;; Character I/O stream of socket connection. Read-only to avoid - ;; race conditions during initialization. - (socket-io (missing-arg) :type stream :read-only t) - ;; Optional dedicated output socket (backending `user-output' slot). - ;; Has a slot so that it can be closed with the connection. - (dedicated-output nil :type (or stream null)) - ;; Streams that can be used for user interaction, with requests - ;; redirected to Emacs. - (user-input nil :type (or stream null)) - (user-output nil :type (or stream null)) - (user-io nil :type (or stream null)) - ;; Bindings used for this connection (usually streams) - (env '() :type list) - ;; A stream that we use for *trace-output*; if nil, we user user-output. - (trace-output nil :type (or stream null)) - ;; A stream where we send REPL results. - (repl-results nil :type (or stream null)) - ;; Cache of macro-indentation information that has been sent to Emacs. - ;; This is used for preparing deltas to update Emacs's knowledge. - ;; Maps: symbol -> indentation-specification - (indentation-cache (make-hash-table :test 'eq) :type hash-table) - ;; The list of packages represented in the cache: - (indentation-cache-packages '()) - ;; The communication style used. - (communication-style nil :type (member nil :spawn :sigio :fd-handler)) - ) - -(defun print-connection (conn stream depth) - (declare (ignore depth)) - (print-unreadable-object (conn stream :type t :identity t))) - -(defstruct (singlethreaded-connection (:include connection) - (:conc-name sconn.)) - ;; The SIGINT handler we should restore when the connection is - ;; closed. - saved-sigint-handler - ;; A queue of events. Not all events can be processed in order and - ;; we need a place to stored them. - (event-queue '() :type list) - ;; A counter that is incremented whenever an event is added to the - ;; queue. This is used to detected modifications to the event queue - ;; by interrupts. The counter wraps around. - (events-enqueued 0 :type fixnum)) - -(defstruct (multithreaded-connection (:include connection) - (:conc-name mconn.)) - ;; In multithreaded systems we delegate certain tasks to specific - ;; threads. The `reader-thread' is responsible for reading network - ;; requests from Emacs and sending them to the `control-thread'; the - ;; `control-thread' is responsible for dispatching requests to the - ;; threads that should handle them; the `repl-thread' is the one - ;; that evaluates REPL expressions. The control thread dispatches - ;; all REPL evaluations to the REPL thread and for other requests it - ;; spawns new threads. - reader-thread - control-thread - repl-thread - auto-flush-thread - indentation-cache-thread - ;; List of threads that are currently processing requests. We use - ;; this to find the newest/current thread for an interrupt. In the - ;; future we may store here (thread . request-tag) pairs so that we - ;; can interrupt specific requests. - (active-threads '() :type list) - ) - -(defvar *emacs-connection* nil - "The connection to Emacs currently in use.") - -(defun make-connection (socket stream style) - (let ((conn (funcall (ecase style - (:spawn - #'make-multithreaded-connection) - ((:sigio nil :fd-handler) - #'make-singlethreaded-connection)) - :socket socket - :socket-io stream - :communication-style style))) - (run-hook *new-connection-hook* conn) - (send-to-sentinel `(:add-connection ,conn)) - conn)) - -(defslimefun ping (tag) - tag) - -(defun safe-backtrace () - (ignore-errors - (call-with-debugging-environment - (lambda () (backtrace 0 nil))))) - -(define-condition swank-error (error) - ((backtrace :initarg :backtrace :reader swank-error.backtrace) - (condition :initarg :condition :reader swank-error.condition)) - (:report (lambda (c s) (princ (swank-error.condition c) s))) - (:documentation "Condition which carries a backtrace.")) - -(defun signal-swank-error (condition &optional (backtrace (safe-backtrace))) - (error 'swank-error :condition condition :backtrace backtrace)) - -(defvar *debug-on-swank-protocol-error* nil - "When non-nil invoke the system debugger on errors that were -signalled during decoding/encoding the wire protocol. Do not set this -to T unless you want to debug swank internals.") - -(defmacro with-swank-error-handler ((connection) &body body) - "Close the connection on internal `swank-error's." - (let ((conn (gensym))) - `(let ((,conn ,connection)) - (handler-case - (handler-bind ((swank-error - (lambda (condition) - (when *debug-on-swank-protocol-error* - (invoke-default-debugger condition))))) - (progn . ,body)) - (swank-error (condition) - (close-connection ,conn - (swank-error.condition condition) - (swank-error.backtrace condition))))))) - -(defmacro with-panic-handler ((connection) &body body) - "Close the connection on unhandled `serious-condition's." - (let ((conn (gensym))) - `(let ((,conn ,connection)) - (handler-bind ((serious-condition - (lambda (condition) - (close-connection ,conn condition (safe-backtrace)) - (abort condition)))) - . ,body)))) - -(add-hook *new-connection-hook* 'notify-backend-of-connection) -(defun notify-backend-of-connection (connection) - (declare (ignore connection)) - (emacs-connected)) - - -;;;; Utilities - - -;;;;; Logging - -(defvar *swank-io-package* - (let ((package (make-package :swank-io-package :use '()))) - (import '(nil t quote) package) - package)) - -(defvar *log-events* nil) - -(defun init-log-output () - (unless *log-output* - (setq *log-output* (real-output-stream *error-output*)))) - -(add-hook *after-init-hook* 'init-log-output) - -(defun real-input-stream (stream) - (typecase stream - (synonym-stream - (real-input-stream (symbol-value (synonym-stream-symbol stream)))) - (two-way-stream - (real-input-stream (two-way-stream-input-stream stream))) - (t stream))) - -(defun real-output-stream (stream) - (typecase stream - (synonym-stream - (real-output-stream (symbol-value (synonym-stream-symbol stream)))) - (two-way-stream - (real-output-stream (two-way-stream-output-stream stream))) - (t stream))) - -(defvar *event-history* (make-array 40 :initial-element nil) - "A ring buffer to record events for better error messages.") -(defvar *event-history-index* 0) -(defvar *enable-event-history* t) - -(defun log-event (format-string &rest args) - "Write a message to *terminal-io* when *log-events* is non-nil. -Useful for low level debugging." - (with-standard-io-syntax - (let ((*print-readably* nil) - (*print-pretty* nil) - (*package* *swank-io-package*)) - (when *enable-event-history* - (setf (aref *event-history* *event-history-index*) - (format nil "~?" format-string args)) - (setf *event-history-index* - (mod (1+ *event-history-index*) (length *event-history*)))) - (when *log-events* - (write-string (escape-non-ascii (format nil "~?" format-string args)) - *log-output*) - (force-output *log-output*))))) - -(defun event-history-to-list () - "Return the list of events (older events first)." - (let ((arr *event-history*) - (idx *event-history-index*)) - (concatenate 'list (subseq arr idx) (subseq arr 0 idx)))) - -(defun clear-event-history () - (fill *event-history* nil) - (setq *event-history-index* 0)) - -(defun dump-event-history (stream) - (dolist (e (event-history-to-list)) - (dump-event e stream))) - -(defun dump-event (event stream) - (cond ((stringp event) - (write-string (escape-non-ascii event) stream)) - ((null event)) - (t - (write-string - (escape-non-ascii (format nil "Unexpected event: ~A~%" event)) - stream)))) - -(defun escape-non-ascii (string) - "Return a string like STRING but with non-ascii chars escaped." - (cond ((ascii-string-p string) string) - (t (with-output-to-string (out) - (loop for c across string do - (cond ((ascii-char-p c) (write-char c out)) - (t (format out "\\x~4,'0X" (char-code c))))))))) - -(defun ascii-string-p (o) - (and (stringp o) - (every #'ascii-char-p o))) - -(defun ascii-char-p (c) - (<= (char-code c) 127)) - - -;;;;; Helper macros - -(defmacro dcase (value &body patterns) - "Dispatch VALUE to one of PATTERNS. -A cross between `case' and `destructuring-bind'. -The pattern syntax is: - ((HEAD . ARGS) . BODY) -The list of patterns is searched for a HEAD `eq' to the car of -VALUE. If one is found, the BODY is executed with ARGS bound to the -corresponding values in the CDR of VALUE." - (let ((operator (gensym "op-")) - (operands (gensym "rand-")) - (tmp (gensym "tmp-"))) - `(let* ((,tmp ,value) - (,operator (car ,tmp)) - (,operands (cdr ,tmp))) - (case ,operator - ,@(loop for (pattern . body) in patterns collect - (if (eq pattern t) - `(t ,@body) - (destructuring-bind (op &rest rands) pattern - `(,op (destructuring-bind ,rands ,operands - ,@body))))) - ,@(if (eq (caar (last patterns)) t) - '() - `((t (error "dcase failed: ~S" ,tmp)))))))) - - -;;;; Interrupt handling - -;; Usually we'd like to enter the debugger when an interrupt happens. -;; But for some operations, in particular send&receive, it's crucial -;; that those are not interrupted when the mailbox is in an -;; inconsistent/locked state. Obviously, if send&receive don't work we -;; can't communicate and the debugger will not work. To solve that -;; problem, we try to handle interrupts only at certain safe-points. -;; -;; Whenever an interrupt happens we call the function -;; INVOKE-OR-QUEUE-INTERRUPT. Usually this simply invokes the -;; debugger, but if interrupts are disabled the interrupt is put in a -;; queue for later processing. At safe-points, we call -;; CHECK-SLIME-INTERRUPTS which looks at the queue and invokes the -;; debugger if needed. -;; -;; The queue for interrupts is stored in a thread local variable. -;; WITH-CONNECTION sets it up. WITH-SLIME-INTERRUPTS allows -;; interrupts, i.e. the debugger is entered immediately. When we call -;; "user code" or non-problematic code we allow interrupts. When -;; inside WITHOUT-SLIME-INTERRUPTS, interrupts are queued. When we -;; switch from "user code" to more delicate operations we need to -;; disable interrupts. In particular, interrupts should be disabled -;; for SEND and RECEIVE-IF. - -;; If true execute interrupts, otherwise queue them. -;; Note: `with-connection' binds *pending-slime-interrupts*. -(defvar *slime-interrupts-enabled*) - -(defmacro with-interrupts-enabled% (flag body) - `(progn - ,@(if flag '((check-slime-interrupts))) - (multiple-value-prog1 - (let ((*slime-interrupts-enabled* ,flag)) - ,@body) - ,@(if flag '((check-slime-interrupts)))))) - -(defmacro with-slime-interrupts (&body body) - `(with-interrupts-enabled% t ,body)) - -(defmacro without-slime-interrupts (&body body) - `(with-interrupts-enabled% nil ,body)) - -(defun queue-thread-interrupt (thread function) - (interrupt-thread thread - (lambda () - ;; safely interrupt THREAD - (when (invoke-or-queue-interrupt function) - (wake-thread thread))))) - -(defun invoke-or-queue-interrupt (function) - (log-event "invoke-or-queue-interrupt: ~a~%" function) - (cond ((not (boundp '*slime-interrupts-enabled*)) - (without-slime-interrupts - (funcall function))) - (*slime-interrupts-enabled* - (log-event "interrupts-enabled~%") - (funcall function)) - (t - (setq *pending-slime-interrupts* - (nconc *pending-slime-interrupts* - (list function))) - (cond ((cdr *pending-slime-interrupts*) - (log-event "too many queued interrupts~%") - (with-simple-restart (continue "Continue from interrupt") - (handler-bind ((serious-condition #'invoke-slime-debugger)) - (check-slime-interrupts)))) - (t - (log-event "queue-interrupt: ~a~%" function) - (when *interrupt-queued-handler* - (funcall *interrupt-queued-handler*)) - t))))) - - -;;; FIXME: poor name? -(defmacro with-io-redirection ((connection) &body body) - "Execute BODY I/O redirection to CONNECTION. " - `(with-bindings (connection.env ,connection) - . ,body)) - -;; Thread local variable used for flow-control. -;; It's bound by `with-connection'. -(defvar *send-counter*) - -(defmacro with-connection ((connection) &body body) - "Execute BODY in the context of CONNECTION." - `(let ((connection ,connection) - (function (lambda () . ,body))) - (if (eq *emacs-connection* connection) - (funcall function) - (let ((*emacs-connection* connection) - (*pending-slime-interrupts* '()) - (*send-counter* 0)) - (without-slime-interrupts - (with-swank-error-handler (connection) - (with-io-redirection (connection) - (call-with-debugger-hook #'swank-debugger-hook - function)))))))) - -(defun call-with-retry-restart (msg thunk) - (loop (with-simple-restart (retry "~a" msg) - (return (funcall thunk))))) - -(defmacro with-retry-restart ((&key (msg "Retry.")) &body body) - (check-type msg string) - `(call-with-retry-restart ,msg (lambda () ,@body))) - -(defmacro with-struct* ((conc-name get obj) &body body) - (let ((var (gensym))) - `(let ((,var ,obj)) - (macrolet ((,get (slot) - (let ((getter (intern (concatenate 'string - ',(string conc-name) - (string slot)) - (symbol-package ',conc-name)))) - `(,getter ,',var)))) - ,@body)))) - -(defmacro define-special (name doc) - "Define a special variable NAME with doc string DOC. -This is like defvar, but NAME will not be initialized." - `(progn - (defvar ,name) - (setf (documentation ',name 'variable) ,doc))) - - -;;;;; Sentinel -;;; -;;; The sentinel thread manages some global lists. -;;; FIXME: Overdesigned? - -(defvar *connections* '() - "List of all active connections, with the most recent at the front.") - -(defvar *servers* '() - "A list ((server-socket port thread) ...) describing the listening sockets. -Used to close sockets on server shutdown or restart.") - -;; FIXME: we simply access the global variable here. We could ask the -;; sentinel thread instead but then we still have the problem that the -;; connection could be closed before we use it. -(defun default-connection () - "Return the 'default' Emacs connection. -This connection can be used to talk with Emacs when no specific -connection is in use, i.e. *EMACS-CONNECTION* is NIL. - -The default connection is defined (quite arbitrarily) as the most -recently established one." - (car *connections*)) - -(defun start-sentinel () - (unless (find-registered 'sentinel) - (let ((thread (spawn #'sentinel :name "Swank Sentinel"))) - (register-thread 'sentinel thread)))) - -(defun sentinel () - (catch 'exit-sentinel - (loop (sentinel-serve (receive))))) - -(defun send-to-sentinel (msg) - (let ((sentinel (find-registered 'sentinel))) - (cond (sentinel (send sentinel msg)) - (t (sentinel-serve msg))))) - -(defun sentinel-serve (msg) - (dcase msg - ((:add-connection conn) - (push conn *connections*)) - ((:close-connection connection condition backtrace) - (close-connection% connection condition backtrace) - (sentinel-maybe-exit)) - ((:add-server socket port thread) - (push (list socket port thread) *servers*)) - ((:stop-server key port) - (sentinel-stop-server key port) - (sentinel-maybe-exit)))) - -(defun sentinel-stop-server (key value) - (let ((probe (find value *servers* :key (ecase key - (:socket #'car) - (:port #'cadr))))) - (cond (probe - (setq *servers* (delete probe *servers*)) - (destructuring-bind (socket _port thread) probe - (declare (ignore _port)) - (ignore-errors (close-socket socket)) - (when (and thread - (thread-alive-p thread) - (not (eq thread (current-thread)))) - (ignore-errors (kill-thread thread))))) - (t - (warn "No server for ~s: ~s" key value))))) - -(defun sentinel-maybe-exit () - (when (and (null *connections*) - (null *servers*) - (and (current-thread) - (eq (find-registered 'sentinel) - (current-thread)))) - (register-thread 'sentinel nil) - (throw 'exit-sentinel nil))) - - -;;;;; Misc - -(defun use-threads-p () - (eq (connection.communication-style *emacs-connection*) :spawn)) - -(defun current-thread-id () - (thread-id (current-thread))) - -(declaim (inline ensure-list)) -(defun ensure-list (thing) - (if (listp thing) thing (list thing))) - - -;;;;; Symbols - -;; FIXME: this docstring is more confusing than helpful. -(defun symbol-status (symbol &optional (package (symbol-package symbol))) - "Returns one of - - :INTERNAL if the symbol is _present_ in PACKAGE as an _internal_ symbol, - - :EXTERNAL if the symbol is _present_ in PACKAGE as an _external_ symbol, - - :INHERITED if the symbol is _inherited_ by PACKAGE through USE-PACKAGE, - but is not _present_ in PACKAGE, - - or NIL if SYMBOL is not _accessible_ in PACKAGE. - - -Be aware not to get confused with :INTERNAL and how \"internal -symbols\" are defined in the spec; there is a slight mismatch of -definition with the Spec and what's commonly meant when talking -about internal symbols most times. As the spec says: - - In a package P, a symbol S is - - _accessible_ if S is either _present_ in P itself or was - inherited from another package Q (which implies - that S is _external_ in Q.) - - You can check that with: (AND (SYMBOL-STATUS S P) T) - - - _present_ if either P is the /home package/ of S or S has been - imported into P or exported from P by IMPORT, or - EXPORT respectively. - - Or more simply, if S is not _inherited_. - - You can check that with: (LET ((STATUS (SYMBOL-STATUS S P))) - (AND STATUS - (NOT (EQ STATUS :INHERITED)))) - - - _external_ if S is going to be inherited into any package that - /uses/ P by means of USE-PACKAGE, MAKE-PACKAGE, or - DEFPACKAGE. - - Note that _external_ implies _present_, since to - make a symbol _external_, you'd have to use EXPORT - which will automatically make the symbol _present_. - - You can check that with: (EQ (SYMBOL-STATUS S P) :EXTERNAL) - - - _internal_ if S is _accessible_ but not _external_. - - You can check that with: (LET ((STATUS (SYMBOL-STATUS S P))) - (AND STATUS - (NOT (EQ STATUS :EXTERNAL)))) - - - Notice that this is *different* to - (EQ (SYMBOL-STATUS S P) :INTERNAL) - because what the spec considers _internal_ is split up into two - explicit pieces: :INTERNAL, and :INHERITED; just as, for instance, - CL:FIND-SYMBOL does. - - The rationale is that most times when you speak about \"internal\" - symbols, you're actually not including the symbols inherited - from other packages, but only about the symbols directly specific - to the package in question. -" - (when package ; may be NIL when symbol is completely uninterned. - (check-type symbol symbol) (check-type package package) - (multiple-value-bind (present-symbol status) - (find-symbol (symbol-name symbol) package) - (and (eq symbol present-symbol) status)))) - -(defun symbol-external-p (symbol &optional (package (symbol-package symbol))) - "True if SYMBOL is external in PACKAGE. -If PACKAGE is not specified, the home package of SYMBOL is used." - (eq (symbol-status symbol package) :external)) - - -;;;; TCP Server - -(defvar *communication-style* (preferred-communication-style)) - -(defvar *dont-close* nil - "Default value of :dont-close argument to start-server and - create-server.") - -(defparameter *loopback-interface* "localhost") - -(defun start-server (port-file &key (style *communication-style*) - (dont-close *dont-close*)) - "Start the server and write the listen port number to PORT-FILE. -This is the entry point for Emacs." - (setup-server 0 - (lambda (port) (announce-server-port port-file port)) - style dont-close nil)) - -(defun create-server (&key (port default-server-port) - (style *communication-style*) - (dont-close *dont-close*) - interface - backlog) - "Start a SWANK server on PORT running in STYLE. -If DONT-CLOSE is true then the listen socket will accept multiple -connections, otherwise it will be closed after the first. - -Optionally, an INTERFACE could be specified and swank will bind -the PORT on this interface. By default, interface is \"localhost\"." - (let ((*loopback-interface* (or interface - *loopback-interface*))) - (setup-server port #'simple-announce-function - style dont-close backlog))) - -(defun find-external-format-or-lose (coding-system) - (or (find-external-format coding-system) - (error "Unsupported coding system: ~s" coding-system))) - -(defmacro restart-loop (form &body clauses) - "Executes FORM, with restart-case CLAUSES which have a chance to modify FORM's -environment before trying again (by returning normally) or giving up (through an -explicit transfer of control), all within an implicit block named nil. -e.g.: (restart-loop (http-request url) (use-value (new) (setq url new)))" - `(loop (restart-case (return ,form) ,@clauses))) - -(defun socket-quest (port backlog) - (restart-loop (create-socket *loopback-interface* port :backlog backlog) - (use-value (&optional (new-port (1+ port))) - :report (lambda (stream) (format stream "Try a port other than ~D" port)) - :interactive - (lambda () - (format *query-io* "Enter port (defaults to ~D): " (1+ port)) - (finish-output *query-io*) ; necessary for tunnels - (ignore-errors (list (parse-integer (read-line *query-io*))))) - (setq port new-port)))) - -(defun setup-server (port announce-fn style dont-close backlog) - (init-log-output) - (let* ((socket (socket-quest port backlog)) - (port (local-port socket))) - (funcall announce-fn port) - (labels ((serve () (accept-connections socket style dont-close)) - (note () (send-to-sentinel `(:add-server ,socket ,port - ,(current-thread)))) - (serve-loop () (note) (loop do (serve) while dont-close))) - (ecase style - (:spawn (initialize-multiprocessing - (lambda () - (start-sentinel) - (spawn #'serve-loop :name (format nil "Swank ~s" port))))) - ((:fd-handler :sigio) - (note) - (add-fd-handler socket #'serve)) - ((nil) (serve-loop)))) - port)) - -(defun stop-server (port) - "Stop server running on PORT." - (send-to-sentinel `(:stop-server :port ,port))) - -(defun restart-server (&key (port default-server-port) - (style *communication-style*) - (dont-close *dont-close*)) - "Stop the server listening on PORT, then start a new SWANK server -on PORT running in STYLE. If DONT-CLOSE is true then the listen socket -will accept multiple connections, otherwise it will be closed after the -first." - (stop-server port) - (sleep 5) - (create-server :port port :style style :dont-close dont-close)) - -(defun accept-connections (socket style dont-close) - (unwind-protect - (let ((client (accept-connection socket :external-format nil - :buffering t))) - (authenticate-client client) - (serve-requests (make-connection socket client style))) - (unless dont-close - (send-to-sentinel `(:stop-server :socket ,socket))))) - -(defun authenticate-client (stream) - (let ((secret (slime-secret))) - (when secret - (set-stream-timeout stream 20) - (let ((first-val (read-packet stream))) - (unless (and (stringp first-val) (string= first-val secret)) - (error "Incoming connection doesn't know the password."))) - (set-stream-timeout stream nil)))) - -(defun slime-secret () - "Finds the magic secret from the user's home directory. Returns nil -if the file doesn't exist; otherwise the first line of the file." - (with-open-file (in - (merge-pathnames (user-homedir-pathname) #p".slime-secret") - :if-does-not-exist nil) - (and in (read-line in nil "")))) - -(defun serve-requests (connection) - "Read and process all requests on connections." - (etypecase connection - (multithreaded-connection - (spawn-threads-for-connection connection)) - (singlethreaded-connection - (ecase (connection.communication-style connection) - ((nil) (simple-serve-requests connection)) - (:sigio (install-sigio-handler connection)) - (:fd-handler (install-fd-handler connection)))))) - -(defun stop-serving-requests (connection) - (etypecase connection - (multithreaded-connection - (cleanup-connection-threads connection)) - (singlethreaded-connection - (ecase (connection.communication-style connection) - ((nil)) - (:sigio (deinstall-sigio-handler connection)) - (:fd-handler (deinstall-fd-handler connection)))))) - -(defun announce-server-port (file port) - (with-open-file (s file - :direction :output - :if-exists :error - :if-does-not-exist :create) - (format s "~S~%" port)) - (simple-announce-function port)) - -(defun simple-announce-function (port) - (when *swank-debug-p* - (format *log-output* "~&;; Swank started at port: ~D.~%" port) - (force-output *log-output*))) - - -;;;;; Event Decoding/Encoding - -(defun decode-message (stream) - "Read an S-expression from STREAM using the SLIME protocol." - (log-event "decode-message~%") - (without-slime-interrupts - (handler-bind ((error #'signal-swank-error)) - (handler-case (read-message stream *swank-io-package*) - (swank-reader-error (c) - `(:reader-error ,(swank-reader-error.packet c) - ,(swank-reader-error.cause c))))))) - -(defun encode-message (message stream) - "Write an S-expression to STREAM using the SLIME protocol." - (log-event "encode-message~%") - (without-slime-interrupts - (handler-bind ((error #'signal-swank-error)) - (write-message message *swank-io-package* stream)))) - - -;;;;; Event Processing - -(defvar *sldb-quit-restart* nil - "The restart that will be invoked when the user calls sldb-quit.") - -;; Establish a top-level restart and execute BODY. -;; Execute K if the restart is invoked. -(defmacro with-top-level-restart ((connection k) &body body) - `(with-connection (,connection) - (restart-case - (let ((*sldb-quit-restart* (find-restart 'abort))) - ,@body) - (abort (&optional v) - :report "Return to SLIME's top level." - (declare (ignore v)) - (force-user-output) - ,k)))) - -(defun handle-requests (connection &optional timeout) - "Read and process :emacs-rex requests. -The processing is done in the extent of the toplevel restart." - (with-connection (connection) - (cond (*sldb-quit-restart* - (process-requests timeout)) - (t - (tagbody - start - (with-top-level-restart (connection (go start)) - (process-requests timeout))))))) - -(defun process-requests (timeout) - "Read and process requests from Emacs." - (loop - (multiple-value-bind (event timeout?) - (wait-for-event `(or (:emacs-rex . _) - (:emacs-channel-send . _)) - timeout) - (when timeout? (return)) - (dcase event - ((:emacs-rex &rest args) (apply #'eval-for-emacs args)) - ((:emacs-channel-send channel (selector &rest args)) - (channel-send channel selector args)))))) - -(defun current-socket-io () - (connection.socket-io *emacs-connection*)) - -(defun close-connection (connection condition backtrace) - (send-to-sentinel `(:close-connection ,connection ,condition ,backtrace))) - -(defun close-connection% (c condition backtrace) - (let ((*debugger-hook* nil)) - (log-event "close-connection: ~a ...~%" condition) - (format *log-output* "~&;; swank:close-connection: ~A~%" - (escape-non-ascii (safe-condition-message condition))) - (stop-serving-requests c) - (close (connection.socket-io c)) - (when (connection.dedicated-output c) - (ignore-errors (close (connection.dedicated-output c)))) - (setf *connections* (remove c *connections*)) - (run-hook *connection-closed-hook* c) - (when (and condition (not (typep condition 'end-of-file))) - (finish-output *log-output*) - (format *log-output* "~&;; Event history start:~%") - (dump-event-history *log-output*) - (format *log-output* "~ -;; Event history end.~%~ -;; Backtrace:~%~{~A~%~}~ -;; Connection to Emacs lost. [~%~ -;; condition: ~A~%~ -;; type: ~S~%~ -;; style: ~S]~%" - (loop for (i f) in backtrace collect - (ignore-errors - (format nil "~d: ~a" i (escape-non-ascii f)))) - (escape-non-ascii (safe-condition-message condition) ) - (type-of condition) - (connection.communication-style c))) - (finish-output *log-output*) - (log-event "close-connection ~a ... done.~%" condition))) - -;;;;;; Thread based communication - -(defun read-loop (connection) - (let ((input-stream (connection.socket-io connection)) - (control-thread (mconn.control-thread connection))) - (with-swank-error-handler (connection) - (loop (send control-thread (decode-message input-stream)))))) - -(defun dispatch-loop (connection) - (let ((*emacs-connection* connection)) - (with-panic-handler (connection) - (loop (dispatch-event connection (receive)))))) - -(defgeneric thread-for-evaluation (connection id) - (:documentation "Find or create a thread to evaluate the next request.") - (:method ((connection multithreaded-connection) (id (eql t))) - (spawn-worker-thread connection)) - (:method ((connection multithreaded-connection) (id (eql :find-existing))) - (car (mconn.active-threads connection))) - (:method (connection (id integer)) - (declare (ignorable connection)) - (find-thread id)) - (:method ((connection singlethreaded-connection) id) - (declare (ignorable connection connection id)) - (current-thread))) - -(defun interrupt-worker-thread (connection id) - (let ((thread (thread-for-evaluation connection - (cond ((eq id t) :find-existing) - (t id))))) - (log-event "interrupt-worker-thread: ~a ~a~%" id thread) - (if thread - (etypecase connection - (multithreaded-connection - (queue-thread-interrupt thread #'simple-break)) - (singlethreaded-connection - (simple-break))) - (encode-message (list :debug-condition (current-thread-id) - (format nil "Thread with id ~a not found" - id)) - (current-socket-io))))) - -(defun spawn-worker-thread (connection) - (spawn (lambda () - (with-bindings *default-worker-thread-bindings* - (with-top-level-restart (connection nil) - (apply #'eval-for-emacs - (cdr (wait-for-event `(:emacs-rex . _))))))) - :name "worker")) - -(defun add-active-thread (connection thread) - (etypecase connection - (multithreaded-connection - (push thread (mconn.active-threads connection))) - (singlethreaded-connection))) - -(defun remove-active-thread (connection thread) - (etypecase connection - (multithreaded-connection - (setf (mconn.active-threads connection) - (delete thread (mconn.active-threads connection) :count 1))) - (singlethreaded-connection))) - -(defparameter *event-hook* nil) - -(defun dispatch-event (connection event) - "Handle an event triggered either by Emacs or within Lisp." - (log-event "dispatch-event: ~s~%" event) - (or (run-hook-until-success *event-hook* connection event) - (dcase event - ((:emacs-rex form package thread-id id) - (let ((thread (thread-for-evaluation connection thread-id))) - (cond (thread - (add-active-thread connection thread) - (send-event thread `(:emacs-rex ,form ,package ,id))) - (t - (encode-message - (list :invalid-rpc id - (format nil "Thread not found: ~s" thread-id)) - (current-socket-io)))))) - ((:return thread &rest args) - (remove-active-thread connection thread) - (encode-message `(:return ,@args) (current-socket-io))) - ((:emacs-interrupt thread-id) - (interrupt-worker-thread connection thread-id)) - (((:write-string - :debug :debug-condition :debug-activate :debug-return :channel-send - :presentation-start :presentation-end - :new-package :new-features :ed :indentation-update - :eval :eval-no-wait :background-message :inspect :ping - :y-or-n-p :read-from-minibuffer :read-string :read-aborted :test-delay - :write-image :ed-rpc :ed-rpc-no-wait) - &rest _) - (declare (ignore _)) - (encode-message event (current-socket-io))) - (((:emacs-pong :emacs-return :emacs-return-string :ed-rpc-forbidden) - thread-id &rest args) - (send-event (find-thread thread-id) (cons (car event) args))) - ((:emacs-channel-send channel-id msg) - (let ((ch (find-channel channel-id))) - (send-event (channel-thread ch) `(:emacs-channel-send ,ch ,msg)))) - ((:reader-error packet condition) - (encode-message `(:reader-error ,packet - ,(safe-condition-message condition)) - (current-socket-io)))))) - - -(defun send-event (thread event) - (log-event "send-event: ~s ~s~%" thread event) - (let ((c *emacs-connection*)) - (etypecase c - (multithreaded-connection - (send thread event)) - (singlethreaded-connection - (setf (sconn.event-queue c) (nconc (sconn.event-queue c) (list event))) - (setf (sconn.events-enqueued c) (mod (1+ (sconn.events-enqueued c)) - most-positive-fixnum)))))) - -(defun send-to-emacs (event) - "Send EVENT to Emacs." - ;;(log-event "send-to-emacs: ~a" event) - (without-slime-interrupts - (let ((c *emacs-connection*)) - (etypecase c - (multithreaded-connection - (send (mconn.control-thread c) event)) - (singlethreaded-connection - (dispatch-event c event))) - (maybe-slow-down)))) - - -;;;;;; Flow control - -;; After sending N (usually 100) messages we slow down and ping Emacs -;; to make sure that everything we have sent so far was received. - -(defconstant send-counter-limit 100) - -(defun maybe-slow-down () - (let ((counter (incf *send-counter*))) - (when (< send-counter-limit counter) - (setf *send-counter* 0) - (ping-pong)))) - -(defun ping-pong () - (let* ((tag (make-tag)) - (pattern `(:emacs-pong ,tag))) - (send-to-emacs `(:ping ,(current-thread-id) ,tag)) - (wait-for-event pattern))) - - -(defun wait-for-event (pattern &optional timeout) - "Scan the event queue for PATTERN and return the event. -If TIMEOUT is 'nil wait until a matching event is enqued. -If TIMEOUT is 't only scan the queue without waiting. -The second return value is t if the timeout expired before a matching -event was found." - (log-event "wait-for-event: ~s ~s~%" pattern timeout) - (without-slime-interrupts - (let ((c *emacs-connection*)) - (etypecase c - (multithreaded-connection - (receive-if (lambda (e) (event-match-p e pattern)) timeout)) - (singlethreaded-connection - (wait-for-event/event-loop c pattern timeout)))))) - -(defun wait-for-event/event-loop (connection pattern timeout) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (let ((event (poll-for-event connection pattern))) - (when event (return (car event)))) - (let ((events-enqueued (sconn.events-enqueued connection)) - (ready (wait-for-input (list (current-socket-io)) timeout))) - (cond ((and timeout (not ready)) - (return (values nil t))) - ((or (/= events-enqueued (sconn.events-enqueued connection)) - (eq ready :interrupt)) - ;; rescan event queue, interrupts may enqueue new events - ) - (t - (assert (equal ready (list (current-socket-io)))) - (dispatch-event connection - (decode-message (current-socket-io)))))))) - -(defun poll-for-event (connection pattern) - (let* ((c connection) - (tail (member-if (lambda (e) (event-match-p e pattern)) - (sconn.event-queue c)))) - (when tail - (setf (sconn.event-queue c) - (nconc (ldiff (sconn.event-queue c) tail) (cdr tail))) - tail))) - -;;; FIXME: Make this use SWANK-MATCH. -(defun event-match-p (event pattern) - (cond ((or (keywordp pattern) (numberp pattern) (stringp pattern) - (member pattern '(nil t))) - (equal event pattern)) - ((symbolp pattern) t) - ((consp pattern) - (case (car pattern) - ((or) (some (lambda (p) (event-match-p event p)) (cdr pattern))) - (t (and (consp event) - (and (event-match-p (car event) (car pattern)) - (event-match-p (cdr event) (cdr pattern))))))) - (t (error "Invalid pattern: ~S" pattern)))) - - - -(defun spawn-threads-for-connection (connection) - (setf (mconn.control-thread connection) - (spawn (lambda () (control-thread connection)) - :name "control-thread")) - connection) - -(defun control-thread (connection) - (with-struct* (mconn. @ connection) - (setf (@ control-thread) (current-thread)) - (setf (@ reader-thread) (spawn (lambda () (read-loop connection)) - :name "reader-thread")) - (setf (@ indentation-cache-thread) - (spawn (lambda () (indentation-cache-loop connection)) - :name "swank-indentation-cache-thread")) - (dispatch-loop connection))) - -(defun cleanup-connection-threads (connection) - (let* ((c connection) - (threads (list (mconn.repl-thread c) - (mconn.reader-thread c) - (mconn.control-thread c) - (mconn.auto-flush-thread c) - (mconn.indentation-cache-thread c)))) - (dolist (thread threads) - (when (and thread - (thread-alive-p thread) - (not (equal (current-thread) thread))) - (ignore-errors (kill-thread thread)))))) - -;;;;;; Signal driven IO - -(defun install-sigio-handler (connection) - (add-sigio-handler (connection.socket-io connection) - (lambda () (process-io-interrupt connection))) - (handle-requests connection t)) - -(defvar *io-interupt-level* 0) - -(defun process-io-interrupt (connection) - (log-event "process-io-interrupt ~d ...~%" *io-interupt-level*) - (let ((*io-interupt-level* (1+ *io-interupt-level*))) - (invoke-or-queue-interrupt - (lambda () (handle-requests connection t)))) - (log-event "process-io-interrupt ~d ... done ~%" *io-interupt-level*)) - -(defun deinstall-sigio-handler (connection) - (log-event "deinstall-sigio-handler...~%") - (remove-sigio-handlers (connection.socket-io connection)) - (log-event "deinstall-sigio-handler...done~%")) - -;;;;;; SERVE-EVENT based IO - -(defun install-fd-handler (connection) - (add-fd-handler (connection.socket-io connection) - (lambda () (handle-requests connection t))) - (setf (sconn.saved-sigint-handler connection) - (install-sigint-handler - (lambda () - (invoke-or-queue-interrupt - (lambda () (dispatch-interrupt-event connection)))))) - (handle-requests connection t)) - -(defun dispatch-interrupt-event (connection) - (with-connection (connection) - (dispatch-event connection `(:emacs-interrupt ,(current-thread-id))))) - -(defun deinstall-fd-handler (connection) - (log-event "deinstall-fd-handler~%") - (remove-fd-handlers (connection.socket-io connection)) - (install-sigint-handler (sconn.saved-sigint-handler connection))) - -;;;;;; Simple sequential IO - -(defun simple-serve-requests (connection) - (unwind-protect - (with-connection (connection) - (call-with-user-break-handler - (lambda () - (invoke-or-queue-interrupt - (lambda () (dispatch-interrupt-event connection)))) - (lambda () - (with-simple-restart (close-connection "Close SLIME connection.") - (let* ((stdin (real-input-stream *standard-input*)) - (*standard-input* (make-repl-input-stream connection - stdin))) - (tagbody toplevel - (with-top-level-restart (connection (go toplevel)) - (simple-repl)))))))) - (close-connection connection nil (safe-backtrace)))) - -;; this is signalled when our custom stream thinks the end-of-file is reached. -;; (not when the end-of-file on the socket is reached) -(define-condition end-of-repl-input (end-of-file) ()) - -(defun simple-repl () - (loop - (format t "~a> " (package-string-for-prompt *package*)) - (force-output) - (let ((form (handler-case (read) - (end-of-repl-input () (return))))) - (let ((- form) - (values (multiple-value-list (eval form)))) - (setq *** ** ** * * (car values) - /// // // / / values - +++ ++ ++ + + form) - (cond ((null values) (format t "; No values~&")) - (t (mapc (lambda (v) (format t "~s~&" v)) values))))))) - -(defun make-repl-input-stream (connection stdin) - (make-input-stream - (lambda () (repl-input-stream-read connection stdin)))) - -(defun repl-input-stream-read (connection stdin) - (loop - (let* ((socket (connection.socket-io connection)) - (inputs (list socket stdin)) - (ready (wait-for-input inputs))) - (cond ((eq ready :interrupt) - (check-slime-interrupts)) - ((member socket ready) - ;; A Slime request from Emacs is pending; make sure to - ;; redirect IO to the REPL buffer. - (with-simple-restart (process-input "Continue reading input.") - (let ((*sldb-quit-restart* (find-restart 'process-input))) - (with-io-redirection (connection) - (handle-requests connection t))))) - ((member stdin ready) - ;; User typed something into the *inferior-lisp* buffer, - ;; so do not redirect. - (return (read-non-blocking stdin))) - (t (assert (null ready))))))) - -(defun read-non-blocking (stream) - (with-output-to-string (str) - (handler-case - (loop (let ((c (read-char-no-hang stream))) - (unless c (return)) - (write-char c str))) - (end-of-file () (error 'end-of-repl-input :stream stream))))) - - -;;; Channels - -;; FIXME: should be per connection not global. -(defvar *channels* '()) -(defvar *channel-counter* 0) - -(defclass channel () - ((id :reader channel-id) - (thread :initarg :thread :initform (current-thread) :reader channel-thread) - (name :initarg :name :initform nil))) - -(defmethod initialize-instance :after ((ch channel) &key) - (with-slots (id) ch - (setf id (incf *channel-counter*)) - (push (cons id ch) *channels*))) - -(defmethod print-object ((c channel) stream) - (print-unreadable-object (c stream :type t) - (with-slots (id name) c - (format stream "~d ~a" id name)))) - -(defun find-channel (id) - (cdr (assoc id *channels*))) - -(defgeneric channel-send (channel selector args)) - -(defmacro define-channel-method (selector (channel &rest args) &body body) - `(defmethod channel-send (,channel (selector (eql ',selector)) args) - (destructuring-bind ,args args - . ,body))) - -(defun send-to-remote-channel (channel-id msg) - (send-to-emacs `(:channel-send ,channel-id ,msg))) - - - -(defvar *slime-features* nil - "The feature list that has been sent to Emacs.") - -(defun send-oob-to-emacs (object) - (send-to-emacs object)) - -;; FIXME: belongs to swank-repl.lisp -(defun force-user-output () - (force-output (connection.user-io *emacs-connection*))) - -(add-hook *pre-reply-hook* 'force-user-output) - -;; FIXME: belongs to swank-repl.lisp -(defun clear-user-input () - (clear-input (connection.user-input *emacs-connection*))) - -;; FIXME: not thread save. -(defvar *tag-counter* 0) - -(defun make-tag () - (setq *tag-counter* (mod (1+ *tag-counter*) (expt 2 22)))) - -(defun y-or-n-p-in-emacs (format-string &rest arguments) - "Like y-or-n-p, but ask in the Emacs minibuffer." - (let ((tag (make-tag)) - (question (apply #'format nil format-string arguments))) - (force-output) - (send-to-emacs `(:y-or-n-p ,(current-thread-id) ,tag ,question)) - (third (wait-for-event `(:emacs-return ,tag result))))) - -(defun read-from-minibuffer-in-emacs (prompt &optional initial-value) - "Ask user a question in Emacs' minibuffer. Returns \"\" when user -entered nothing, returns NIL when user pressed C-g." - (check-type prompt string) (check-type initial-value (or null string)) - (let ((tag (make-tag))) - (force-output) - (send-to-emacs `(:read-from-minibuffer ,(current-thread-id) ,tag - ,prompt ,initial-value)) - (third (wait-for-event `(:emacs-return ,tag result))))) - -(defstruct (unreadable-result - (:constructor make-unreadable-result (string)) - (:copier nil) - (:print-object - (lambda (object stream) - (print-unreadable-object (object stream :type t) - (princ (unreadable-result-string object) stream))))) - string) - -(defun symbol-name-for-emacs (symbol) - (check-type symbol symbol) - (let ((name (string-downcase (symbol-name symbol)))) - (if (keywordp symbol) - (concatenate 'string ":" name) - name))) - -(defun process-form-for-emacs (form) - "Returns a string which emacs will read as equivalent to -FORM. FORM can contain lists, strings, characters, symbols and -numbers. - -Characters are converted emacs' ? notaion, strings are left -as they are (except for espacing any nested \" chars, numbers are -printed in base 10 and symbols are printed as their symbol-name -converted to lower case." - (etypecase form - (string (format nil "~S" form)) - (cons (format nil "(~A . ~A)" - (process-form-for-emacs (car form)) - (process-form-for-emacs (cdr form)))) - (character (format nil "?~C" form)) - (symbol (symbol-name-for-emacs form)) - (number (let ((*print-base* 10)) - (princ-to-string form))))) - -(defun wait-for-emacs-return (tag) - (let ((event (caddr (wait-for-event `(:emacs-return ,tag result))))) - (dcase event - ((:unreadable value) (make-unreadable-result value)) - ((:ok value) value) - ((:error kind . data) (error "~a: ~{~a~}" kind data)) - ((:abort) (abort)) - ;; only in reply to :ed-rpc{-no-wait} events. - ((:ed-rpc-forbidden fn) (error "ED-RPC forbidden for ~a" fn))))) - -(defun eval-in-emacs (form &optional nowait) - "Eval FORM in Emacs. -`slime-enable-evaluate-in-emacs' should be set to T on the Emacs side." - (cond (nowait - (send-to-emacs `(:eval-no-wait ,(process-form-for-emacs form)))) - (t - (force-output) - (let ((tag (make-tag))) - (send-to-emacs `(:eval ,(current-thread-id) ,tag - ,(process-form-for-emacs form))) - (wait-for-emacs-return tag))))) - -(defun ed-rpc-no-wait (fn &rest args) - "Invoke FN in Emacs (or some lesser editor) and don't wait for the result." - (send-to-emacs `(:ed-rpc-no-wait ,(symbol-name-for-emacs fn) ,@args)) - (values)) - -(defun ed-rpc (fn &rest args) - "Invoke FN in Emacs (or some lesser editor). FN should be defined in -Emacs Lisp via `defslimefun' or otherwise marked as RPCallable." - (let ((tag (make-tag))) - (send-to-emacs `(:ed-rpc ,(current-thread-id) ,tag - ,(symbol-name-for-emacs fn) - ,@args)) - (wait-for-emacs-return tag))) - -(defvar *swank-wire-protocol-version* nil - "The version of the swank/slime communication protocol.") - -(defslimefun connection-info () - "Return a key-value list of the form: -\(&key PID STYLE LISP-IMPLEMENTATION MACHINE FEATURES PACKAGE VERSION) -PID: is the process-id of Lisp process (or nil, depending on the STYLE) -STYLE: the communication style -LISP-IMPLEMENTATION: a list (&key TYPE NAME VERSION) -FEATURES: a list of keywords -PACKAGE: a list (&key NAME PROMPT) -VERSION: the protocol version" - (let ((c *emacs-connection*)) - (setq *slime-features* *features*) - `(:pid ,(getpid) :style ,(connection.communication-style c) - :encoding (:coding-systems - ,(loop for cs in '("utf-8-unix" "iso-latin-1-unix") - when (find-external-format cs) collect cs)) - :lisp-implementation (:type ,(lisp-implementation-type) - :name ,(lisp-implementation-type-name) - :version ,(lisp-implementation-version) - :program ,(lisp-implementation-program)) - :machine (:instance ,(machine-instance) - :type ,(machine-type) - :version ,(machine-version)) - :features ,(features-for-emacs) - :modules ,*modules* - :package (:name ,(package-name *package*) - :prompt ,(package-string-for-prompt *package*)) - :version ,*swank-wire-protocol-version*))) - -(defun debug-on-swank-error () - (assert (eq *debug-on-swank-protocol-error* *debug-swank-backend*)) - *debug-on-swank-protocol-error*) - -(defun (setf debug-on-swank-error) (new-value) - (setf *debug-on-swank-protocol-error* new-value) - (setf *debug-swank-backend* new-value)) - -(defslimefun toggle-debug-on-swank-error () - (setf (debug-on-swank-error) (not (debug-on-swank-error)))) - - -;;;; Reading and printing - -(define-special *buffer-package* - "Package corresponding to slime-buffer-package. - -EVAL-FOR-EMACS binds *buffer-package*. Strings originating from a slime -buffer are best read in this package. See also FROM-STRING and TO-STRING.") - -(define-special *buffer-readtable* - "Readtable associated with the current buffer") - -(defmacro with-buffer-syntax ((&optional package) &body body) - "Execute BODY with appropriate *package* and *readtable* bindings. - -This should be used for code that is conceptionally executed in an -Emacs buffer." - `(call-with-buffer-syntax ,package (lambda () ,@body))) - -(defun call-with-buffer-syntax (package fun) - (let ((*package* (if package - (guess-buffer-package package) - *buffer-package*))) - ;; Don't shadow *readtable* unnecessarily because that prevents - ;; the user from assigning to it. - (if (eq *readtable* *buffer-readtable*) - (call-with-syntax-hooks fun) - (let ((*readtable* *buffer-readtable*)) - (call-with-syntax-hooks fun))))) - -(defmacro without-printing-errors ((&key object stream - (msg "<>")) - &body body) - "Catches errors during evaluation of BODY and prints MSG instead." - `(handler-case (progn ,@body) - (serious-condition () - ,(cond ((and stream object) - (let ((gstream (gensym "STREAM+"))) - `(let ((,gstream ,stream)) - (print-unreadable-object (,object ,gstream :type t - :identity t) - (write-string ,msg ,gstream))))) - (stream - `(write-string ,msg ,stream)) - (object - `(with-output-to-string (s) - (print-unreadable-object (,object s :type t :identity t) - (write-string ,msg s)))) - (t msg))))) - -(defun to-string (object) - "Write OBJECT in the *BUFFER-PACKAGE*. -The result may not be readable. Handles problems with PRINT-OBJECT methods -gracefully." - (with-buffer-syntax () - (let ((*print-readably* nil)) - (without-printing-errors (:object object :stream nil) - (prin1-to-string object))))) - -(defun from-string (string) - "Read string in the *BUFFER-PACKAGE*" - (with-buffer-syntax () - (let ((*read-suppress* nil)) - (values (read-from-string string))))) - -(defun parse-string (string package) - "Read STRING in PACKAGE." - (with-buffer-syntax (package) - (let ((*read-suppress* nil)) - (read-from-string string)))) - -;; FIXME: deal with #\| etc. hard to do portably. -(defun tokenize-symbol (string) - "STRING is interpreted as the string representation of a symbol -and is tokenized accordingly. The result is returned in three -values: The package identifier part, the actual symbol identifier -part, and a flag if the STRING represents a symbol that is -internal to the package identifier part. (Notice that the flag is -also true with an empty package identifier part, as the STRING is -considered to represent a symbol internal to some current package.)" - (let ((package (let ((pos (position #\: string))) - (if pos (subseq string 0 pos) nil))) - (symbol (let ((pos (position #\: string :from-end t))) - (if pos (subseq string (1+ pos)) string))) - (internp (not (= (count #\: string) 1)))) - (values symbol package internp))) - -(defun tokenize-symbol-thoroughly (string) - "This version of TOKENIZE-SYMBOL handles escape characters." - (let ((package nil) - (token (make-array (length string) :element-type 'character - :fill-pointer 0)) - (backslash nil) - (vertical nil) - (internp nil)) - (loop for char across string do - (cond - (backslash - (vector-push-extend char token) - (setq backslash nil)) - ((char= char #\\) ; Quotes next character, even within |...| - (setq backslash t)) - ((char= char #\|) - (setq vertical (not vertical))) - (vertical - (vector-push-extend char token)) - ((char= char #\:) - (cond ((and package internp) - (return-from tokenize-symbol-thoroughly)) - (package - (setq internp t)) - (t - (setq package token - token (make-array (length string) - :element-type 'character - :fill-pointer 0))))) - (t - (vector-push-extend (casify-char char) token)))) - (unless vertical - (values token package (or (not package) internp))))) - -(defun untokenize-symbol (package-name internal-p symbol-name) - "The inverse of TOKENIZE-SYMBOL. - - (untokenize-symbol \"quux\" nil \"foo\") ==> \"quux:foo\" - (untokenize-symbol \"quux\" t \"foo\") ==> \"quux::foo\" - (untokenize-symbol nil nil \"foo\") ==> \"foo\" -" - (cond ((not package-name) symbol-name) - (internal-p (cat package-name "::" symbol-name)) - (t (cat package-name ":" symbol-name)))) - -(defun casify-char (char) - "Convert CHAR accoring to readtable-case." - (ecase (readtable-case *readtable*) - (:preserve char) - (:upcase (char-upcase char)) - (:downcase (char-downcase char)) - (:invert (if (upper-case-p char) - (char-downcase char) - (char-upcase char))))) - - -(defun find-symbol-with-status (symbol-name status - &optional (package *package*)) - (multiple-value-bind (symbol flag) (find-symbol symbol-name package) - (if (and flag (eq flag status)) - (values symbol flag) - (values nil nil)))) - -(defun parse-symbol (string &optional (package *package*)) - "Find the symbol named STRING. -Return the symbol and a flag indicating whether the symbols was found." - (multiple-value-bind (sname pname internalp) - (tokenize-symbol-thoroughly string) - (when sname - (let ((package (cond ((string= pname "") keyword-package) - (pname (find-package pname)) - (t package)))) - (if package - (multiple-value-bind (symbol flag) - (if internalp - (find-symbol sname package) - (find-symbol-with-status sname ':external package)) - (values symbol flag sname package)) - (values nil nil nil nil)))))) - -(defun parse-symbol-or-lose (string &optional (package *package*)) - (multiple-value-bind (symbol status) (parse-symbol string package) - (if status - (values symbol status) - (error "Unknown symbol: ~A [in ~A]" string package)))) - -(defun parse-package (string) - "Find the package named STRING. -Return the package or nil." - ;; STRING comes usually from a (in-package STRING) form. - (ignore-errors - (find-package (let ((*package* *swank-io-package*)) - (read-from-string string))))) - -(defun unparse-name (string) - "Print the name STRING according to the current printer settings." - ;; this is intended for package or symbol names - (subseq (prin1-to-string (make-symbol string)) 2)) - -(defun guess-package (string) - "Guess which package corresponds to STRING. -Return nil if no package matches." - (when string - (or (find-package string) - (parse-package string) - (if (find #\! string) ; for SBCL - (guess-package (substitute #\- #\! string)))))) - -(defvar *readtable-alist* (default-readtable-alist) - "An alist mapping package names to readtables.") - -(defun guess-buffer-readtable (package-name) - (let ((package (guess-package package-name))) - (or (and package - (cdr (assoc (package-name package) *readtable-alist* - :test #'string=))) - *readtable*))) - - -;;;; Evaluation - -(defvar *pending-continuations* '() - "List of continuations for Emacs. (thread local)") - -(defun guess-buffer-package (string) - "Return a package for STRING. -Fall back to the current if no such package exists." - (or (and string (guess-package string)) - *package*)) - -(defun eval-for-emacs (form buffer-package id) - "Bind *BUFFER-PACKAGE* to BUFFER-PACKAGE and evaluate FORM. -Return the result to the continuation ID. -Errors are trapped and invoke our debugger." - (let (ok result condition) - (unwind-protect - (let ((*buffer-package* (guess-buffer-package buffer-package)) - (*buffer-readtable* (guess-buffer-readtable buffer-package)) - (*pending-continuations* (cons id *pending-continuations*))) - (check-type *buffer-package* package) - (check-type *buffer-readtable* readtable) - ;; APPLY would be cleaner than EVAL. - ;; (setq result (apply (car form) (cdr form))) - (handler-bind ((t (lambda (c) (setf condition c)))) - (setq result (with-slime-interrupts (eval form)))) - (run-hook *pre-reply-hook*) - (setq ok t)) - (send-to-emacs `(:return ,(current-thread) - ,(if ok - `(:ok ,result) - `(:abort ,(prin1-to-string condition))) - ,id))))) - -(defvar *echo-area-prefix* "=> " - "A prefix that `format-values-for-echo-area' should use.") - -(defun format-values-for-echo-area (values) - (with-buffer-syntax () - (let ((*print-readably* nil)) - (cond ((null values) "; No value") - ((and (integerp (car values)) (null (cdr values))) - (let ((i (car values))) - (format nil "~A~D (~a bit~:p, #x~X, #o~O, #b~B)" - *echo-area-prefix* - i (integer-length i) i i i))) - ((and (typep (car values) 'ratio) - (null (cdr values)) - (ignore-errors - ;; The ratio may be to large to be represented as a single float - (format nil "~A~D (~:*~f)" - *echo-area-prefix* - (car values))))) - (t (format nil "~a~{~S~^, ~}" *echo-area-prefix* values)))))) - -(defmacro values-to-string (values) - `(format-values-for-echo-area (multiple-value-list ,values))) - -(defslimefun interactive-eval (string) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME interactive evaluation request.") - (let ((values (multiple-value-list (eval (from-string string))))) - (finish-output) - (format-values-for-echo-area values))))) - -(defslimefun eval-and-grab-output (string) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME evaluation request.") - (let* ((s (make-string-output-stream)) - (*standard-output* s) - (values (multiple-value-list (eval (from-string string))))) - (list (get-output-stream-string s) - (format nil "~{~S~^~%~}" values)))))) - -(defun eval-region (string) - "Evaluate STRING. -Return the results of the last form as a list and as secondary value the -last form." - (with-input-from-string (stream string) - (let (- values) - (loop - (let ((form (read stream nil stream))) - (when (eq form stream) - (finish-output) - (return (values values -))) - (setq - form) - (setq values (multiple-value-list (eval form))) - (finish-output)))))) - -(defslimefun interactive-eval-region (string) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME interactive evaluation request.") - (format-values-for-echo-area (eval-region string))))) - -(defslimefun re-evaluate-defvar (form) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME evaluation request.") - (let ((form (read-from-string form))) - (destructuring-bind (dv name &optional value doc) form - (declare (ignore value doc)) - (assert (eq dv 'defvar)) - (makunbound name) - (prin1-to-string (eval form))))))) - -(defvar *swank-pprint-bindings* - `((*print-pretty* . t) - (*print-level* . nil) - (*print-length* . nil) - (*print-circle* . t) - (*print-gensym* . t) - (*print-readably* . nil)) - "A list of variables bindings during pretty printing. -Used by pprint-eval.") - -(defun swank-pprint (values) - "Bind some printer variables and pretty print each object in VALUES." - (with-buffer-syntax () - (with-bindings *swank-pprint-bindings* - (cond ((null values) "; No value") - (t (with-output-to-string (*standard-output*) - (dolist (o values) - (pprint o) - (terpri)))))))) - -(defslimefun pprint-eval (string) - (with-buffer-syntax () - (let* ((s (make-string-output-stream)) - (values - (let ((*standard-output* s) - (*trace-output* s)) - (multiple-value-list (eval (read-from-string string)))))) - (cat (get-output-stream-string s) - (swank-pprint values))))) - -(defslimefun set-package (name) - "Set *package* to the package named NAME. -Return the full package-name and the string to use in the prompt." - (let ((p (guess-package name))) - (assert (packagep p) nil "Package ~a doesn't exist." name) - (setq *package* p) - (list (package-name p) (package-string-for-prompt p)))) - -(defun cat (&rest strings) - "Concatenate all arguments and make the result a string." - (with-output-to-string (out) - (dolist (s strings) - (etypecase s - (string (write-string s out)) - (character (write-char s out)))))) - -(defun truncate-string (string width &optional ellipsis) - (let ((len (length string))) - (cond ((< len width) string) - (ellipsis (cat (subseq string 0 width) ellipsis)) - (t (subseq string 0 width))))) - -(defun call/truncated-output-to-string (length function - &optional (ellipsis "..")) - "Call FUNCTION with a new stream, return the output written to the stream. -If FUNCTION tries to write more than LENGTH characters, it will be -aborted and return immediately with the output written so far." - (let ((buffer (make-string (+ length (length ellipsis)))) - (fill-pointer 0)) - (block buffer-full - (flet ((write-output (string) - (let* ((free (- length fill-pointer)) - (count (min free (length string)))) - (replace buffer string :start1 fill-pointer :end2 count) - (incf fill-pointer count) - (when (> (length string) free) - (replace buffer ellipsis :start1 fill-pointer) - (return-from buffer-full buffer))))) - (let ((stream (make-output-stream #'write-output))) - (funcall function stream) - (finish-output stream) - (subseq buffer 0 fill-pointer)))))) - -(defmacro with-string-stream ((var &key length bindings) - &body body) - (cond ((and (not bindings) (not length)) - `(with-output-to-string (,var) . ,body)) - ((not bindings) - `(call/truncated-output-to-string - ,length (lambda (,var) . ,body))) - (t - `(with-bindings ,bindings - (with-string-stream (,var :length ,length) - . ,body))))) - -(defun to-line (object &optional width) - "Print OBJECT to a single line. Return the string." - (let ((width (or width 512))) - (without-printing-errors (:object object :stream nil) - (with-string-stream (stream :length width) - (write object :stream stream :right-margin width :lines 1))))) - -(defun escape-string (string stream &key length (map '((#\" . "\\\"") - (#\\ . "\\\\")))) - "Write STRING to STREAM surronded by double-quotes. -LENGTH -- if non-nil truncate output after LENGTH chars. -MAP -- rewrite the chars in STRING according to this alist." - (let ((limit (or length array-dimension-limit))) - (write-char #\" stream) - (loop for c across string - for i from 0 do - (when (= i limit) - (write-string "..." stream) - (return)) - (let ((probe (assoc c map))) - (cond (probe (write-string (cdr probe) stream)) - (t (write-char c stream))))) - (write-char #\" stream))) - - -;;;; Prompt - -;; FIXME: do we really need 45 lines of code just to figure out the -;; prompt? - -(defvar *canonical-package-nicknames* - `((:common-lisp-user . :cl-user)) - "Canonical package names to use instead of shortest name/nickname.") - -(defvar *auto-abbreviate-dotted-packages* t - "Abbreviate dotted package names to their last component if T.") - -(defun package-string-for-prompt (package) - "Return the shortest nickname (or canonical name) of PACKAGE." - (unparse-name - (or (canonical-package-nickname package) - (auto-abbreviated-package-name package) - (shortest-package-nickname package)))) - -(defun canonical-package-nickname (package) - "Return the canonical package nickname, if any, of PACKAGE." - (let ((name (cdr (assoc (package-name package) *canonical-package-nicknames* - :test #'string=)))) - (and name (string name)))) - -(defun auto-abbreviated-package-name (package) - "Return an abbreviated 'name' for PACKAGE. - -N.B. this is not an actual package name or nickname." - (when *auto-abbreviate-dotted-packages* - (loop with package-name = (package-name package) - with offset = nil - do (let ((last-dot-pos (position #\. package-name :end offset - :from-end t))) - (unless last-dot-pos - (return nil)) - ;; If a dot chunk contains only numbers, that chunk most - ;; likely represents a version number; so we collect the - ;; next chunks, too, until we find one with meat. - (let ((name (subseq package-name (1+ last-dot-pos) offset))) - (if (notevery #'digit-char-p name) - (return (subseq package-name (1+ last-dot-pos))) - (setq offset last-dot-pos))))))) - -(defun shortest-package-nickname (package) - "Return the shortest nickname of PACKAGE." - (loop for name in (cons (package-name package) (package-nicknames package)) - for shortest = name then (if (< (length name) (length shortest)) - name - shortest) - finally (return shortest))) - - - -(defslimefun ed-in-emacs (&optional what) - "Edit WHAT in Emacs. - -WHAT can be: - A pathname or a string, - A list (PATHNAME-OR-STRING &key LINE COLUMN POSITION), - A function name (symbol or cons), - NIL. " - (flet ((canonicalize-filename (filename) - (pathname-to-filename (or (probe-file filename) filename)))) - (let ((target - (etypecase what - (null nil) - ((or string pathname) - `(:filename ,(canonicalize-filename what))) - ((cons (or string pathname) *) - `(:filename ,(canonicalize-filename (car what)) ,@(cdr what))) - ((or symbol cons) - `(:function-name ,(prin1-to-string what)))))) - (cond (*emacs-connection* (send-oob-to-emacs `(:ed ,target))) - ((default-connection) - (with-connection ((default-connection)) - (send-oob-to-emacs `(:ed ,target)))) - (t (error "No connection")))))) - -(defslimefun inspect-in-emacs (what &key wait) - "Inspect WHAT in Emacs. If WAIT is true (default NIL) blocks until the -inspector has been closed in Emacs." - (flet ((send-it () - (let ((tag (when wait (make-tag))) - (thread (when wait (current-thread-id)))) - (with-buffer-syntax () - (reset-inspector) - (send-oob-to-emacs `(:inspect ,(inspect-object what) - ,thread - ,tag))) - (when wait - (wait-for-event `(:emacs-return ,tag result)))))) - (cond - (*emacs-connection* - (send-it)) - ((default-connection) - (with-connection ((default-connection)) - (send-it)))) - what)) - -(defslimefun value-for-editing (form) - "Return a readable value of FORM for editing in Emacs. -FORM is expected, but not required, to be SETF'able." - ;; FIXME: Can we check FORM for setfability? -luke (12/Mar/2005) - (with-buffer-syntax () - (let* ((value (eval (read-from-string form))) - (*print-length* nil)) - (prin1-to-string value)))) - -(defslimefun commit-edited-value (form value) - "Set the value of a setf'able FORM to VALUE. -FORM and VALUE are both strings from Emacs." - (with-buffer-syntax () - (eval `(setf ,(read-from-string form) - ,(read-from-string (concatenate 'string "`" value)))) - t)) - -(defun background-message (format-string &rest args) - "Display a message in Emacs' echo area. - -Use this function for informative messages only. The message may even -be dropped if we are too busy with other things." - (when *emacs-connection* - (send-to-emacs `(:background-message - ,(apply #'format nil format-string args))))) - -;; This is only used by the test suite. -(defun sleep-for (seconds) - "Sleep for at least SECONDS seconds. -This is just like cl:sleep but guarantees to sleep -at least SECONDS." - (let* ((start (get-internal-real-time)) - (end (+ start - (* seconds internal-time-units-per-second)))) - (loop - (let ((now (get-internal-real-time))) - (cond ((< end now) (return)) - (t (sleep (/ (- end now) - internal-time-units-per-second)))))))) - - -;;;; Debugger - -(defun invoke-slime-debugger (condition) - "Sends a message to Emacs declaring that the debugger has been entered, -then waits to handle further requests from Emacs. Eventually returns -after Emacs causes a restart to be invoked." - (without-slime-interrupts - (cond (*emacs-connection* - (debug-in-emacs condition)) - ((default-connection) - (with-connection ((default-connection)) - (debug-in-emacs condition)))))) - -(define-condition invoke-default-debugger () ()) - -(defun swank-debugger-hook (condition hook) - "Debugger function for binding *DEBUGGER-HOOK*." - (declare (ignore hook)) - (handler-case - (call-with-debugger-hook #'swank-debugger-hook - (lambda () (invoke-slime-debugger condition))) - (invoke-default-debugger () - (invoke-default-debugger condition)))) - -(defun invoke-default-debugger (condition) - (call-with-debugger-hook nil (lambda () (invoke-debugger condition)))) - -(defvar *global-debugger* t - "Non-nil means the Swank debugger hook will be installed globally.") - -(add-hook *new-connection-hook* 'install-debugger) -(defun install-debugger (connection) - (declare (ignore connection)) - (when *global-debugger* - (install-debugger-globally #'swank-debugger-hook))) - -;;;;; Debugger loop -;;; -;;; These variables are dynamically bound during debugging. -;;; -(defvar *swank-debugger-condition* nil - "The condition being debugged.") - -(defvar *sldb-level* 0 - "The current level of recursive debugging.") - -(defvar *sldb-initial-frames* 20 - "The initial number of backtrace frames to send to Emacs.") - -(defvar *sldb-restarts* nil - "The list of currenlty active restarts.") - -(defvar *sldb-stepping-p* nil - "True during execution of a step command.") - -(defun debug-in-emacs (condition) - (let ((*swank-debugger-condition* condition) - (*sldb-restarts* (compute-restarts condition)) - (*sldb-quit-restart* (and *sldb-quit-restart* - (find-restart *sldb-quit-restart*))) - (*package* (or (and (boundp '*buffer-package*) - (symbol-value '*buffer-package*)) - *package*)) - (*sldb-level* (1+ *sldb-level*)) - (*sldb-stepping-p* nil)) - (force-user-output) - (call-with-debugging-environment - (lambda () - (sldb-loop *sldb-level*))))) - -(defun sldb-loop (level) - (unwind-protect - (loop - (with-simple-restart (abort "Return to sldb level ~D." level) - (send-to-emacs - (list* :debug (current-thread-id) level - (debugger-info-for-emacs 0 *sldb-initial-frames*))) - (send-to-emacs - (list :debug-activate (current-thread-id) level nil)) - (loop - (handler-case - (dcase (wait-for-event - `(or (:emacs-rex . _) - (:sldb-return ,(1+ level)))) - ((:emacs-rex &rest args) (apply #'eval-for-emacs args)) - ((:sldb-return _) (declare (ignore _)) (return nil))) - (sldb-condition (c) - (handle-sldb-condition c)))))) - (send-to-emacs `(:debug-return - ,(current-thread-id) ,level ,*sldb-stepping-p*)) - (wait-for-event `(:sldb-return ,(1+ level)) t) ; clean event-queue - (when (> level 1) - (send-event (current-thread) `(:sldb-return ,level))))) - -(defun handle-sldb-condition (condition) - "Handle an internal debugger condition. -Rather than recursively debug the debugger (a dangerous idea!), these -conditions are simply reported." - (let ((real-condition (original-condition condition))) - (send-to-emacs `(:debug-condition ,(current-thread-id) - ,(princ-to-string real-condition))))) - -(defun %%condition-message (condition) - (let ((limit (ash 1 16))) - (with-string-stream (stream :length limit) - (handler-case - (let ((*print-readably* nil) - (*print-pretty* t) - (*print-right-margin* 65) - (*print-circle* t) - (*print-length* (or *print-length* limit)) - (*print-level* (or *print-level* limit)) - (*print-lines* (or *print-lines* limit))) - (print-condition condition stream)) - (serious-condition (c) - (ignore-errors - (with-standard-io-syntax - (let ((*print-readably* nil)) - (format stream "~&Error (~a) during printing: " (type-of c)) - (print-unreadable-object (condition stream :type t - :identity t)))))))))) - -(defun %condition-message (condition) - (string-trim #(#\newline #\space #\tab) - (%%condition-message condition))) - -(defvar *sldb-condition-printer* #'%condition-message - "Function called to print a condition to an SLDB buffer.") - -(defun safe-condition-message (condition) - "Print condition to a string, handling any errors during printing." - (funcall *sldb-condition-printer* condition)) - -(defun debugger-condition-for-emacs () - (list (safe-condition-message *swank-debugger-condition*) - (format nil " [Condition of type ~S]" - (type-of *swank-debugger-condition*)) - (condition-extras *swank-debugger-condition*))) - -(defun format-restarts-for-emacs () - "Return a list of restarts for *swank-debugger-condition* in a -format suitable for Emacs." - (let ((*print-right-margin* most-positive-fixnum)) - (loop for restart in *sldb-restarts* collect - (list (format nil "~:[~;*~]~a" - (eq restart *sldb-quit-restart*) - (restart-name restart)) - (with-output-to-string (stream) - (without-printing-errors (:object restart - :stream stream - :msg "<>") - (princ restart stream))))))) - -;;;;; SLDB entry points - -(defslimefun sldb-break-with-default-debugger (dont-unwind) - "Invoke the default debugger." - (cond (dont-unwind - (invoke-default-debugger *swank-debugger-condition*)) - (t - (signal 'invoke-default-debugger)))) - -(defslimefun backtrace (start end) - "Return a list ((I FRAME PLIST) ...) of frames from START to END. - -I is an integer, and can be used to reference the corresponding frame -from Emacs; FRAME is a string representation of an implementation's -frame." - (loop for frame in (compute-backtrace start end) - for i from start collect - (list* i (frame-to-string frame) - (ecase (frame-restartable-p frame) - ((nil) nil) - ((t) `((:restartable t))))))) - -(defun frame-to-string (frame) - (with-string-stream (stream :length (* (or *print-lines* 1) - (or *print-right-margin* 100)) - :bindings *backtrace-printer-bindings*) - (handler-case (print-frame frame stream) - (serious-condition () - (format stream "[error printing frame]"))))) - -(defslimefun debugger-info-for-emacs (start end) - "Return debugger state, with stack frames from START to END. -The result is a list: - (condition ({restart}*) ({stack-frame}*) (cont*)) -where - condition ::= (description type [extra]) - restart ::= (name description) - stack-frame ::= (number description [plist]) - extra ::= (:references and other random things) - cont ::= continutation - plist ::= (:restartable {nil | t | :unknown}) - -condition---a pair of strings: message, and type. If show-source is -not nil it is a frame number for which the source should be displayed. - -restart---a pair of strings: restart name, and description. - -stack-frame---a number from zero (the top), and a printed -representation of the frame's call. - -continutation---the id of a pending Emacs continuation. - -Below is an example return value. In this case the condition was a -division by zero (multi-line description), and only one frame is being -fetched (start=0, end=1). - - ((\"Arithmetic error DIVISION-BY-ZERO signalled. -Operation was KERNEL::DIVISION, operands (1 0).\" - \"[Condition of type DIVISION-BY-ZERO]\") - ((\"ABORT\" \"Return to Slime toplevel.\") - (\"ABORT\" \"Return to Top-Level.\")) - ((0 \"(KERNEL::INTEGER-/-INTEGER 1 0)\" (:restartable nil))) - (4))" - (list (debugger-condition-for-emacs) - (format-restarts-for-emacs) - (backtrace start end) - *pending-continuations*)) - -(defun nth-restart (index) - (nth index *sldb-restarts*)) - -(defslimefun invoke-nth-restart (index) - (let ((restart (nth-restart index))) - (when restart - (invoke-restart-interactively restart)))) - -(defslimefun sldb-abort () - (invoke-restart (find 'abort *sldb-restarts* :key #'restart-name))) - -(defslimefun sldb-continue () - (continue)) - -(defun coerce-to-condition (datum args) - (etypecase datum - (string (make-condition 'simple-error :format-control datum - :format-arguments args)) - (symbol (apply #'make-condition datum args)))) - -(defslimefun simple-break (&optional (datum "Interrupt from Emacs") &rest args) - (with-simple-restart (continue "Continue from break.") - (invoke-slime-debugger (coerce-to-condition datum args)))) - -;; FIXME: (last (compute-restarts)) looks dubious. -(defslimefun throw-to-toplevel () - "Invoke the ABORT-REQUEST restart abort an RPC from Emacs. -If we are not evaluating an RPC then ABORT instead." - (let ((restart (or (and *sldb-quit-restart* - (find-restart *sldb-quit-restart*)) - (car (last (compute-restarts)))))) - (cond (restart (invoke-restart restart)) - (t (format nil "Restart not active [~s]" *sldb-quit-restart*))))) - -(defslimefun invoke-nth-restart-for-emacs (sldb-level n) - "Invoke the Nth available restart. -SLDB-LEVEL is the debug level when the request was made. If this -has changed, ignore the request." - (when (= sldb-level *sldb-level*) - (invoke-nth-restart n))) - -(defun wrap-sldb-vars (form) - `(let ((*sldb-level* ,*sldb-level*)) - ,form)) - -(defun eval-in-frame-aux (frame string package print) - (let* ((form (wrap-sldb-vars (parse-string string package))) - (values (multiple-value-list (eval-in-frame form frame)))) - (with-buffer-syntax (package) - (funcall print values)))) - -(defslimefun eval-string-in-frame (string frame package) - (eval-in-frame-aux frame string package #'format-values-for-echo-area)) - -(defslimefun pprint-eval-string-in-frame (string frame package) - (eval-in-frame-aux frame string package #'swank-pprint)) - -(defslimefun frame-package-name (frame) - (let ((pkg (frame-package frame))) - (cond (pkg (package-name pkg)) - (t (with-buffer-syntax () (package-name *package*)))))) - -(defslimefun frame-locals-and-catch-tags (index) - "Return a list (LOCALS TAGS) for vars and catch tags in the frame INDEX. -LOCALS is a list of the form ((&key NAME ID VALUE) ...). -TAGS has is a list of strings." - (list (frame-locals-for-emacs index) - (mapcar #'to-string (frame-catch-tags index)))) - -(defun frame-locals-for-emacs (index) - (with-bindings *backtrace-printer-bindings* - (loop for var in (frame-locals index) collect - (destructuring-bind (&key name id value) var - (list :name (let ((*package* (or (frame-package index) *package*))) - (prin1-to-string name)) - :id id - :value (to-line value *print-right-margin*)))))) - -(defslimefun sldb-disassemble (index) - (with-output-to-string (*standard-output*) - (disassemble-frame index))) - -(defslimefun sldb-return-from-frame (index string) - (let ((form (from-string string))) - (to-string (multiple-value-list (return-from-frame index form))))) - -(defslimefun sldb-break (name) - (with-buffer-syntax () - (sldb-break-at-start (read-from-string name)))) - -(defmacro define-stepper-function (name backend-function-name) - `(defslimefun ,name (frame) - (cond ((sldb-stepper-condition-p *swank-debugger-condition*) - (setq *sldb-stepping-p* t) - (,backend-function-name)) - ((find-restart 'continue) - (activate-stepping frame) - (setq *sldb-stepping-p* t) - (continue)) - (t - (error "Not currently single-stepping, ~ -and no continue restart available."))))) - -(define-stepper-function sldb-step sldb-step-into) -(define-stepper-function sldb-next sldb-step-next) -(define-stepper-function sldb-out sldb-step-out) - -(defslimefun toggle-break-on-signals () - (setq *break-on-signals* (not *break-on-signals*)) - (format nil "*break-on-signals* = ~a" *break-on-signals*)) - -(defslimefun sdlb-print-condition () - (princ-to-string *swank-debugger-condition*)) - - -;;;; Compilation Commands. - -(defstruct (compilation-result (:type list)) - (type :compilation-result) - notes - (successp nil :type boolean) - (duration 0.0 :type float) - (loadp nil :type boolean) - (faslfile nil :type (or null string))) - -(defun measure-time-interval (fun) - "Call FUN and return the first return value and the elapsed time. -The time is measured in seconds." - (declare (type function fun)) - (let ((before (get-internal-real-time))) - (values - (funcall fun) - (/ (- (get-internal-real-time) before) - (coerce internal-time-units-per-second 'float))))) - -(defun make-compiler-note (condition) - "Make a compiler note data structure from a compiler-condition." - (declare (type compiler-condition condition)) - (list* :message (message condition) - :severity (severity condition) - :location (location condition) - :references (references condition) - (let ((s (source-context condition))) - (if s (list :source-context s))))) - -(defun collect-notes (function) - (let ((notes '())) - (multiple-value-bind (result seconds) - (handler-bind ((compiler-condition - (lambda (c) (push (make-compiler-note c) notes)))) - (measure-time-interval - (lambda () - ;; To report location of error-signaling toplevel forms - ;; for errors in EVAL-WHEN or during macroexpansion. - (restart-case (multiple-value-list (funcall function)) - (abort () :report "Abort compilation." (list nil)))))) - (destructuring-bind (successp &optional loadp faslfile) result - (let ((faslfile (etypecase faslfile - (null nil) - (pathname (pathname-to-filename faslfile))))) - (make-compilation-result :notes (reverse notes) - :duration seconds - :successp (if successp t) - :loadp (if loadp t) - :faslfile faslfile)))))) - -(defun swank-compile-file* (pathname load-p &rest options &key policy - &allow-other-keys) - (multiple-value-bind (output-pathname warnings? failure?) - (swank-compile-file pathname - (fasl-pathname pathname options) - nil - (or (guess-external-format pathname) - :default) - :policy policy) - (declare (ignore warnings?)) - (values t (not failure?) load-p output-pathname))) - -(defvar *compile-file-for-emacs-hook* '(swank-compile-file*)) - -(defslimefun compile-file-for-emacs (filename load-p &rest options) - "Compile FILENAME and, when LOAD-P, load the result. -Record compiler notes signalled as `compiler-condition's." - (with-buffer-syntax () - (collect-notes - (lambda () - (let ((pathname (filename-to-pathname filename)) - (*compile-print* nil) - (*compile-verbose* t)) - (loop for hook in *compile-file-for-emacs-hook* - do - (multiple-value-bind (tried success load? output-pathname) - (apply hook pathname load-p options) - (when tried - (return (values success load? output-pathname)))))))))) - -;; FIXME: now that *compile-file-for-emacs-hook* is there this is -;; redundant and confusing. -(defvar *fasl-pathname-function* nil - "In non-nil, use this function to compute the name for fasl-files.") - -(defun pathname-as-directory (pathname) - (append (pathname-directory pathname) - (when (pathname-name pathname) - (list (file-namestring pathname))))) - -(defun compile-file-output (file directory) - (make-pathname :directory (pathname-as-directory directory) - :defaults (compile-file-pathname file))) - -(defun fasl-pathname (input-file options) - (cond (*fasl-pathname-function* - (funcall *fasl-pathname-function* input-file options)) - ((getf options :fasl-directory) - (let ((dir (getf options :fasl-directory))) - (assert (char= (aref dir (1- (length dir))) #\/)) - (compile-file-output input-file dir))) - (t - (compile-file-pathname input-file)))) - -(defslimefun compile-string-for-emacs (string buffer position filename policy) - "Compile STRING (exerpted from BUFFER at POSITION). -Record compiler notes signalled as `compiler-condition's." - (let* ((offset (cadr (assoc :position position))) - (line-column (cdr (assoc :line position))) - (line (first line-column)) - (column (second line-column))) - (with-buffer-syntax () - (collect-notes - (lambda () - (let ((*compile-print* t) (*compile-verbose* nil)) - (swank-compile-string string - :buffer buffer - :position offset - :filename filename - :line line - :column column - :policy policy))))))) - -(defslimefun compile-multiple-strings-for-emacs (strings policy) - "Compile STRINGS (exerpted from BUFFER at POSITION). -Record compiler notes signalled as `compiler-condition's." - (loop for (string buffer package position filename) in strings collect - (collect-notes - (lambda () - (with-buffer-syntax (package) - (let ((*compile-print* t) (*compile-verbose* nil)) - (swank-compile-string string - :buffer buffer - :position position - :filename filename - :policy policy))))))) - -(defun file-newer-p (new-file old-file) - "Returns true if NEW-FILE is newer than OLD-FILE." - (> (file-write-date new-file) (file-write-date old-file))) - -(defun requires-compile-p (source-file) - (let ((fasl-file (probe-file (compile-file-pathname source-file)))) - (or (not fasl-file) - (file-newer-p source-file fasl-file)))) - -(defslimefun compile-file-if-needed (filename loadp) - (let ((pathname (filename-to-pathname filename))) - (cond ((requires-compile-p pathname) - (compile-file-for-emacs pathname loadp)) - (t - (collect-notes - (lambda () - (or (not loadp) - (load (compile-file-pathname pathname))))))))) - - -;;;; Loading - -(defslimefun load-file (filename) - (to-string (load (filename-to-pathname filename)))) - - -;;;;; swank-require - -(defslimefun swank-require (modules &optional filename) - "Load the module MODULE." - (dolist (module (ensure-list modules)) - (unless (member (string module) *modules* :test #'string=) - (require module (if filename - (filename-to-pathname filename) - (module-filename module))) - (assert (member (string module) *modules* :test #'string=) - () "Required module ~s was not provided" module))) - *modules*) - -(defvar *find-module* 'find-module - "Pluggable function to locate modules. -The function receives a module name as argument and should return -the filename of the module (or nil if the file doesn't exist).") - -(defun module-filename (module) - "Return the filename for the module MODULE." - (or (funcall *find-module* module) - (error "Can't locate module: ~s" module))) - -;;;;;; Simple *find-module* function. - -(defun merged-directory (dirname defaults) - (pathname-directory - (merge-pathnames - (make-pathname :directory `(:relative ,dirname) :defaults defaults) - defaults))) - -(defvar *load-path* '() - "A list of directories to search for modules.") - -(defun module-candidates (name dir) - (list (compile-file-pathname (make-pathname :name name :defaults dir)) - (make-pathname :name name :type "lisp" :defaults dir))) - -(defun find-module (module) - (let ((name (string-downcase module))) - (some (lambda (dir) (some #'probe-file (module-candidates name dir))) - *load-path*))) - - -;;;; Macroexpansion - -(defvar *macroexpand-printer-bindings* - '((*print-circle* . nil) - (*print-pretty* . t) - (*print-escape* . t) - (*print-lines* . nil) - (*print-level* . nil) - (*print-length* . nil))) - -(defun apply-macro-expander (expander string) - (with-buffer-syntax () - (with-bindings *macroexpand-printer-bindings* - (prin1-to-string (funcall expander (from-string string)))))) - -(defslimefun swank-macroexpand-1 (string) - (apply-macro-expander #'macroexpand-1 string)) - -(defslimefun swank-macroexpand (string) - (apply-macro-expander #'macroexpand string)) - -(defslimefun swank-macroexpand-all (string) - (apply-macro-expander #'macroexpand-all string)) - -(defslimefun swank-compiler-macroexpand-1 (string) - (apply-macro-expander #'compiler-macroexpand-1 string)) - -(defslimefun swank-compiler-macroexpand (string) - (apply-macro-expander #'compiler-macroexpand string)) - -(defslimefun swank-expand-1 (string) - (apply-macro-expander #'expand-1 string)) - -(defslimefun swank-expand (string) - (apply-macro-expander #'expand string)) - -(defun expand-1 (form) - (multiple-value-bind (expansion expanded?) (macroexpand-1 form) - (if expanded? - (values expansion t) - (compiler-macroexpand-1 form)))) - -(defun expand (form) - (expand-repeatedly #'expand-1 form)) - -(defun expand-repeatedly (expander form) - (loop - (multiple-value-bind (expansion expanded?) (funcall expander form) - (unless expanded? (return expansion)) - (setq form expansion)))) - -(defslimefun swank-format-string-expand (string) - (apply-macro-expander #'format-string-expand string)) - -(defslimefun disassemble-form (form) - (with-buffer-syntax () - (with-output-to-string (*standard-output*) - (let ((*print-readably* nil)) - (disassemble (eval (read-from-string form))))))) - - -;;;; Simple completion - -(defslimefun simple-completions (prefix package) - "Return a list of completions for the string PREFIX." - (let ((strings (all-completions prefix package))) - (list strings (longest-common-prefix strings)))) - -(defun all-completions (prefix package) - (multiple-value-bind (name pname intern) (tokenize-symbol prefix) - (let* ((extern (and pname (not intern))) - (pkg (cond ((equal pname "") keyword-package) - ((not pname) (guess-buffer-package package)) - (t (guess-package pname)))) - (test (lambda (sym) (prefix-match-p name (symbol-name sym)))) - (syms (and pkg (matching-symbols pkg extern test))) - (strings (loop for sym in syms - for str = (unparse-symbol sym) - when (prefix-match-p name str) ; remove |Foo| - collect str))) - (format-completion-set strings intern pname)))) - -(defun matching-symbols (package external test) - (let ((test (if external - (lambda (s) - (and (symbol-external-p s package) - (funcall test s))) - test)) - (result '())) - (do-symbols (s package) - (when (funcall test s) - (push s result))) - (remove-duplicates result))) - -(defun unparse-symbol (symbol) - (let ((*print-case* (case (readtable-case *readtable*) - (:downcase :upcase) - (t :downcase)))) - (unparse-name (symbol-name symbol)))) - -(defun prefix-match-p (prefix string) - "Return true if PREFIX is a prefix of STRING." - (not (mismatch prefix string :end2 (min (length string) (length prefix)) - :test #'char-equal))) - -(defun longest-common-prefix (strings) - "Return the longest string that is a common prefix of STRINGS." - (if (null strings) - "" - (flet ((common-prefix (s1 s2) - (let ((diff-pos (mismatch s1 s2))) - (if diff-pos (subseq s1 0 diff-pos) s1)))) - (reduce #'common-prefix strings)))) - -(defun format-completion-set (strings internal-p package-name) - "Format a set of completion strings. -Returns a list of completions with package qualifiers if needed." - (mapcar (lambda (string) (untokenize-symbol package-name internal-p string)) - (sort strings #'string<))) - - -;;;; Simple arglist display - -(defslimefun operator-arglist (name package) - (ignore-errors - (let ((args (arglist (parse-symbol name (guess-buffer-package package))))) - (cond ((eq args :not-available) nil) - (t (princ-to-string (cons name args))))))) - - -;;;; Documentation - -(defslimefun apropos-list-for-emacs (name &optional external-only - case-sensitive package) - "Make an apropos search for Emacs. -The result is a list of property lists." - (let ((package (if package - (or (parse-package package) - (error "No such package: ~S" package))))) - ;; The MAPCAN will filter all uninteresting symbols, i.e. those - ;; who cannot be meaningfully described. - (mapcan (listify #'briefly-describe-symbol-for-emacs) - (sort (remove-duplicates - (apropos-symbols name external-only case-sensitive package)) - #'present-symbol-before-p)))) - -(defun briefly-describe-symbol-for-emacs (symbol) - "Return a property list describing SYMBOL. -Like `describe-symbol-for-emacs' but with at most one line per item." - (flet ((first-line (string) - (let ((pos (position #\newline string))) - (if (null pos) string (subseq string 0 pos))))) - (let ((desc (map-if #'stringp #'first-line - (describe-symbol-for-emacs symbol)))) - (if desc - (list* :designator (to-string symbol) desc))))) - -(defun map-if (test fn &rest lists) - "Like (mapcar FN . LISTS) but only call FN on objects satisfying TEST. -Example: -\(map-if #'oddp #'- '(1 2 3 4 5)) => (-1 2 -3 4 -5)" - (apply #'mapcar - (lambda (x) (if (funcall test x) (funcall fn x) x)) - lists)) - -(defun listify (f) - "Return a function like F, but which returns any non-null value -wrapped in a list." - (lambda (x) - (let ((y (funcall f x))) - (and y (list y))))) - -(defun present-symbol-before-p (x y) - "Return true if X belongs before Y in a printed summary of symbols. -Sorted alphabetically by package name and then symbol name, except -that symbols accessible in the current package go first." - (declare (type symbol x y)) - (flet ((accessible (s) - ;; Test breaks on NIL for package that does not inherit it - (eq (find-symbol (symbol-name s) *buffer-package*) s))) - (let ((ax (accessible x)) (ay (accessible y))) - (cond ((and ax ay) (string< (symbol-name x) (symbol-name y))) - (ax t) - (ay nil) - (t (let ((px (symbol-package x)) (py (symbol-package y))) - (if (eq px py) - (string< (symbol-name x) (symbol-name y)) - (string< (package-name px) (package-name py))))))))) - -(defun make-apropos-matcher (pattern case-sensitive) - (let ((chr= (if case-sensitive #'char= #'char-equal))) - (lambda (symbol) - (search pattern (string symbol) :test chr=)))) - -(defun apropos-symbols (string external-only case-sensitive package) - (let ((packages (or package (remove (find-package :keyword) - (list-all-packages)))) - (matcher (make-apropos-matcher string case-sensitive)) - (result)) - (with-package-iterator (next packages :external :internal) - (loop (multiple-value-bind (morep symbol) (next) - (cond ((not morep) (return)) - ((and (if external-only (symbol-external-p symbol) t) - (funcall matcher symbol)) - (push symbol result)))))) - result)) - -(defun call-with-describe-settings (fn) - (let ((*print-readably* nil)) - (funcall fn))) - -(defmacro with-describe-settings ((&rest _) &body body) - (declare (ignore _)) - `(call-with-describe-settings (lambda () ,@body))) - -(defun describe-to-string (object) - (with-describe-settings () - (with-output-to-string (*standard-output*) - (describe object)))) - -(defslimefun describe-symbol (symbol-name) - (with-buffer-syntax () - (describe-to-string (parse-symbol-or-lose symbol-name)))) - -(defslimefun describe-function (name) - (with-buffer-syntax () - (let ((symbol (parse-symbol-or-lose name))) - (describe-to-string (or (macro-function symbol) - (symbol-function symbol)))))) - -(defslimefun describe-definition-for-emacs (name kind) - (with-buffer-syntax () - (with-describe-settings () - (with-output-to-string (*standard-output*) - (describe-definition (parse-symbol-or-lose name) kind))))) - -(defslimefun documentation-symbol (symbol-name) - (with-buffer-syntax () - (multiple-value-bind (sym foundp) (parse-symbol symbol-name) - (if foundp - (let ((vdoc (documentation sym 'variable)) - (fdoc (documentation sym 'function))) - (with-output-to-string (string) - (format string "Documentation for the symbol ~a:~2%" sym) - (unless (or vdoc fdoc) - (format string "Not documented." )) - (when vdoc - (format string "Variable:~% ~a~2%" vdoc)) - (when fdoc - (format string "Function:~% Arglist: ~a~2% ~a" - (arglist sym) - fdoc)))) - (format nil "No such symbol, ~a." symbol-name))))) - - -;;;; Package Commands - -(defslimefun list-all-package-names (&optional nicknames) - "Return a list of all package names. -Include the nicknames if NICKNAMES is true." - (mapcar #'unparse-name - (if nicknames - (mapcan #'package-names (list-all-packages)) - (mapcar #'package-name (list-all-packages))))) - - -;;;; Tracing - -;; Use eval for the sake of portability... -(defun tracedp (fspec) - (member fspec (eval '(trace)))) - -(defvar *after-toggle-trace-hook* nil - "Hook called whenever a SPEC is traced or untraced. - -If non-nil, called with two arguments SPEC and TRACED-P." ) -(defslimefun swank-toggle-trace (spec-string) - (let* ((spec (from-string spec-string)) - (retval (cond ((consp spec) ; handle complicated cases in the backend - (toggle-trace spec)) - ((tracedp spec) - (eval `(untrace ,spec)) - (format nil "~S is now untraced." spec)) - (t - (eval `(trace ,spec)) - (format nil "~S is now traced." spec)))) - (traced-p (let* ((tosearch "is now traced.") - (start (- (length retval) - (length tosearch))) - (end (+ start (length tosearch)))) - (search tosearch (subseq retval start end)))) - (hook-msg (when *after-toggle-trace-hook* - (funcall *after-toggle-trace-hook* - spec - traced-p)))) - (if hook-msg - (format nil "~a~%(also ~a)" retval hook-msg) - retval))) - -(defslimefun untrace-all () - (untrace)) - - -;;;; Undefing - -(defslimefun undefine-function (fname-string) - (let ((fname (from-string fname-string))) - (format nil "~S" (fmakunbound fname)))) - -(defslimefun unintern-symbol (name package) - (let ((pkg (guess-package package))) - (cond ((not pkg) (format nil "No such package: ~s" package)) - (t - (multiple-value-bind (sym found) (parse-symbol name pkg) - (case found - ((nil) (format nil "~s not in package ~s" name package)) - (t - (unintern sym pkg) - (format nil "Uninterned symbol: ~s" sym)))))))) - -(defslimefun swank-delete-package (package-name) - (let ((pkg (or (guess-package package-name) - (error "No such package: ~s" package-name)))) - (delete-package pkg) - nil)) - - -;;;; Profiling - -(defun profiledp (fspec) - (member fspec (profiled-functions))) - -(defslimefun toggle-profile-fdefinition (fname-string) - (let ((fname (from-string fname-string))) - (cond ((profiledp fname) - (unprofile fname) - (format nil "~S is now unprofiled." fname)) - (t - (profile fname) - (format nil "~S is now profiled." fname))))) - -(defslimefun profile-by-substring (substring package) - (let ((count 0)) - (flet ((maybe-profile (symbol) - (when (and (fboundp symbol) - (not (profiledp symbol)) - (search substring (symbol-name symbol) :test #'equalp)) - (handler-case (progn - (profile symbol) - (incf count)) - (error (condition) - (warn "~a" condition)))))) - (if package - (do-symbols (symbol (parse-package package)) - (maybe-profile symbol)) - (do-all-symbols (symbol) - (maybe-profile symbol)))) - (format nil "~a function~:p ~:*~[are~;is~:;are~] now profiled" count))) - -(defslimefun swank-profile-package (package-name callersp methodsp) - (let ((pkg (or (guess-package package-name) - (error "Not a valid package name: ~s" package-name)))) - (check-type callersp boolean) - (check-type methodsp boolean) - (profile-package pkg callersp methodsp))) - - -;;;; Source Locations - -(defslimefun find-definition-for-thing (thing) - (find-source-location thing)) - -(defslimefun find-source-location-for-emacs (spec) - (find-source-location (value-spec-ref spec))) - -(defun value-spec-ref (spec) - (dcase spec - ((:string string package) - (with-buffer-syntax (package) - (eval (read-from-string string)))) - ((:inspector part) - (inspector-nth-part part)) - ((:sldb frame var) - (frame-var-value frame var)))) - -(defvar *find-definitions-right-trim* ",:.>") -(defvar *find-definitions-left-trim* "#:<") - -(defun find-definitions-find-symbol-or-package (name) - (flet ((do-find (name) - (multiple-value-bind (symbol found name) - (with-buffer-syntax () - (parse-symbol name)) - (cond (found - (return-from find-definitions-find-symbol-or-package - (values symbol found))) - ;; Packages are not named by symbols, so - ;; not-interned symbols can refer to packages - ((find-package name) - (return-from find-definitions-find-symbol-or-package - (values (make-symbol name) t))))))) - (do-find name) - (do-find (string-right-trim *find-definitions-right-trim* name)) - (do-find (string-left-trim *find-definitions-left-trim* name)) - (do-find (string-left-trim *find-definitions-left-trim* - (string-right-trim - *find-definitions-right-trim* name))) - ;; Not exactly robust - (when (and (eql (search "(setf " name :test #'char-equal) 0) - (char= (char name (1- (length name))) #\))) - (multiple-value-bind (symbol found) - (with-buffer-syntax () - (parse-symbol (subseq name (length "(setf ") - (1- (length name))))) - (when found - (values `(setf ,symbol) t)))))) - -(defslimefun find-definitions-for-emacs (name) - "Return a list ((DSPEC LOCATION) ...) of definitions for NAME. -DSPEC is a string and LOCATION a source location. NAME is a string." - (multiple-value-bind (symbol found) - (find-definitions-find-symbol-or-package name) - (when found - (mapcar #'xref>elisp (find-definitions symbol))))) - -;;; Generic function so contribs can extend it. -(defgeneric xref-doit (type thing) - (:method (type thing) - (declare (ignore type thing)) - :not-implemented)) - -(macrolet ((define-xref-action (xref-type handler) - `(defmethod xref-doit ((type (eql ,xref-type)) thing) - (declare (ignorable type)) - (funcall ,handler thing)))) - (define-xref-action :calls #'who-calls) - (define-xref-action :calls-who #'calls-who) - (define-xref-action :references #'who-references) - (define-xref-action :binds #'who-binds) - (define-xref-action :sets #'who-sets) - (define-xref-action :macroexpands #'who-macroexpands) - (define-xref-action :specializes #'who-specializes) - (define-xref-action :callers #'list-callers) - (define-xref-action :callees #'list-callees)) - -(defslimefun xref (type name) - (multiple-value-bind (sexp error) (ignore-errors (from-string name)) - (unless error - (let ((xrefs (xref-doit type sexp))) - (if (eq xrefs :not-implemented) - :not-implemented - (mapcar #'xref>elisp xrefs)))))) - -(defslimefun xrefs (types name) - (loop for type in types - for xrefs = (xref type name) - when (and (not (eq :not-implemented xrefs)) - (not (null xrefs))) - collect (cons type xrefs))) - -(defun xref>elisp (xref) - (destructuring-bind (name loc) xref - (list (to-string name) loc))) - - -;;;;; Lazy lists - -(defstruct (lcons (:constructor %lcons (car %cdr)) - (:predicate lcons?)) - car - (%cdr nil :type (or null lcons function)) - (forced? nil)) - -(defmacro lcons (car cdr) - `(%lcons ,car (lambda () ,cdr))) - -(defmacro lcons* (car cdr &rest more) - (cond ((null more) `(lcons ,car ,cdr)) - (t `(lcons ,car (lcons* ,cdr ,@more))))) - -(defun lcons-cdr (lcons) - (with-struct* (lcons- @ lcons) - (cond ((@ forced?) - (@ %cdr)) - (t - (let ((value (funcall (@ %cdr)))) - (setf (@ forced?) t - (@ %cdr) value)))))) - -(defun llist-range (llist start end) - (llist-take (llist-skip llist start) (- end start))) - -(defun llist-skip (lcons index) - (do ((i 0 (1+ i)) - (l lcons (lcons-cdr l))) - ((or (= i index) (null l)) - l))) - -(defun llist-take (lcons count) - (let ((result '())) - (do ((i 0 (1+ i)) - (l lcons (lcons-cdr l))) - ((or (= i count) - (null l))) - (push (lcons-car l) result)) - (nreverse result))) - -(defun iline (label value) - `(:line ,label ,value)) - - -;;;; Inspecting - -(defvar *inspector-verbose* nil) - -(defvar *inspector-printer-bindings* - '((*print-lines* . 1) - (*print-right-margin* . 75) - (*print-pretty* . t) - (*print-readably* . nil))) - -(defvar *inspector-verbose-printer-bindings* - '((*print-escape* . t) - (*print-circle* . t) - (*print-array* . nil))) - -(defstruct inspector-state) -(defstruct (istate (:conc-name istate.) (:include inspector-state)) - object - (verbose *inspector-verbose*) - (parts (make-array 10 :adjustable t :fill-pointer 0)) - (actions (make-array 10 :adjustable t :fill-pointer 0)) - metadata-plist - content - next previous) - -(defvar *istate* nil) -(defvar *inspector-history*) - -(defun reset-inspector () - (setq *istate* nil - *inspector-history* (make-array 10 :adjustable t :fill-pointer 0))) - -(defslimefun init-inspector (string) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME inspection request.") - (reset-inspector) - (inspect-object (eval (read-from-string string)))))) - -(defun ensure-istate-metadata (o indicator default) - (with-struct (istate. object metadata-plist) *istate* - (assert (eq object o)) - (let ((data (getf metadata-plist indicator default))) - (setf (getf metadata-plist indicator) data) - data))) - -(defun inspect-object (o) - (let* ((prev *istate*) - (istate (make-istate :object o :previous prev - :verbose (cond (prev (istate.verbose prev)) - (t *inspector-verbose*))))) - (setq *istate* istate) - (setf (istate.content istate) (emacs-inspect/istate istate)) - (unless (find o *inspector-history*) - (vector-push-extend o *inspector-history*)) - (let ((previous (istate.previous istate))) - (if previous (setf (istate.next previous) istate))) - (istate>elisp istate))) - -(defun emacs-inspect/istate (istate) - (with-bindings (if (istate.verbose istate) - *inspector-verbose-printer-bindings* - *inspector-printer-bindings*) - (emacs-inspect (istate.object istate)))) - -(defun istate>elisp (istate) - (list :title (prepare-title istate) - :id (assign-index (istate.object istate) (istate.parts istate)) - :content (prepare-range istate 0 500))) - -(defun prepare-title (istate) - (if (istate.verbose istate) - (with-bindings *inspector-verbose-printer-bindings* - (to-string (istate.object istate))) - (with-string-stream (stream :length 200 - :bindings *inspector-printer-bindings*) - (print-unreadable-object - ((istate.object istate) stream :type t :identity t))))) - -(defun prepare-range (istate start end) - (let* ((range (content-range (istate.content istate) start end)) - (ps (loop for part in range append (prepare-part part istate)))) - (list ps - (if (< (length ps) (- end start)) - (+ start (length ps)) - (+ end 1000)) - start end))) - -(defun prepare-part (part istate) - (let ((newline '#.(string #\newline))) - (etypecase part - (string (list part)) - (cons (dcase part - ((:newline) (list newline)) - ((:value obj &optional str) - (list (value-part obj str (istate.parts istate)))) - ((:label &rest strs) - (list (list :label (apply #'cat (mapcar #'string strs))))) - ((:action label lambda &key (refreshp t)) - (list (action-part label lambda refreshp - (istate.actions istate)))) - ((:line label value) - (list (princ-to-string label) ": " - (value-part value nil (istate.parts istate)) - newline))))))) - -(defun value-part (object string parts) - (list :value - (or string (print-part-to-string object)) - (assign-index object parts))) - -(defun action-part (label lambda refreshp actions) - (list :action label (assign-index (list lambda refreshp) actions))) - -(defun assign-index (object vector) - (let ((index (fill-pointer vector))) - (vector-push-extend object vector) - index)) - -(defun print-part-to-string (value) - (let* ((*print-readably* nil) - (string (to-line value)) - (pos (position value *inspector-history*))) - (if pos - (format nil "@~D=~A" pos string) - string))) - -(defun content-range (list start end) - (typecase list - (list (let ((len (length list))) - (subseq list start (min len end)))) - (lcons (llist-range list start end)))) - -(defslimefun inspector-nth-part (index) - "Return the current inspector's INDEXth part. -The second value indicates if that part exists at all." - (let* ((parts (istate.parts *istate*)) - (foundp (< index (length parts)))) - (values (and foundp (aref parts index)) - foundp))) - -(defslimefun inspect-nth-part (index) - (with-buffer-syntax () - (inspect-object (inspector-nth-part index)))) - -(defslimefun inspector-range (from to) - (prepare-range *istate* from to)) - -(defslimefun inspector-call-nth-action (index &rest args) - (destructuring-bind (fun refreshp) (aref (istate.actions *istate*) index) - (apply fun args) - (if refreshp - (inspector-reinspect) - ;; tell emacs that we don't want to refresh the inspector buffer - nil))) - -(defslimefun inspector-pop () - "Inspect the previous object. -Return nil if there's no previous object." - (with-buffer-syntax () - (cond ((istate.previous *istate*) - (setq *istate* (istate.previous *istate*)) - (istate>elisp *istate*)) - (t nil)))) - -(defslimefun inspector-next () - "Inspect the next element in the history of inspected objects.." - (with-buffer-syntax () - (cond ((istate.next *istate*) - (setq *istate* (istate.next *istate*)) - (istate>elisp *istate*)) - (t nil)))) - -(defslimefun inspector-reinspect () - (let ((istate *istate*)) - (setf (istate.content istate) (emacs-inspect/istate istate)) - (istate>elisp istate))) - -(defslimefun inspector-toggle-verbose () - "Toggle verbosity of inspected object." - (setf (istate.verbose *istate*) (not (istate.verbose *istate*))) - (istate>elisp *istate*)) - -(defslimefun inspector-eval (string) - (let* ((obj (istate.object *istate*)) - (context (eval-context obj)) - (form (with-buffer-syntax ((cdr (assoc '*package* context))) - (read-from-string string))) - (ignorable (remove-if #'boundp (mapcar #'car context)))) - (to-string (eval `(let ((* ',obj) (- ',form) - . ,(loop for (var . val) in context - unless (constantp var) collect - `(,var ',val))) - (declare (ignorable . ,ignorable)) - ,form))))) - -(defslimefun inspector-history () - (with-output-to-string (out) - (let ((newest (loop for s = *istate* then next - for next = (istate.next s) - if (not next) return s))) - (format out "--- next/prev chain ---") - (loop for s = newest then (istate.previous s) while s do - (let ((val (istate.object s))) - (format out "~%~:[ ~; *~]@~d " - (eq s *istate*) - (position val *inspector-history*)) - (print-unreadable-object (val out :type t :identity t))))) - (format out "~%~%--- all visited objects ---") - (loop for val across *inspector-history* for i from 0 do - (format out "~%~2,' d " i) - (print-unreadable-object (val out :type t :identity t))))) - -(defslimefun quit-inspector () - (reset-inspector) - nil) - -(defslimefun describe-inspectee () - "Describe the currently inspected object." - (with-buffer-syntax () - (describe-to-string (istate.object *istate*)))) - -(defslimefun pprint-inspector-part (index) - "Pretty-print the currently inspected object." - (with-buffer-syntax () - (swank-pprint (list (inspector-nth-part index))))) - -(defslimefun inspect-in-frame (string index) - (with-buffer-syntax () - (with-retry-restart (:msg "Retry SLIME inspection request.") - (reset-inspector) - (inspect-object (eval-in-frame (from-string string) index))))) - -(defslimefun inspect-current-condition () - (with-buffer-syntax () - (reset-inspector) - (inspect-object *swank-debugger-condition*))) - -(defslimefun inspect-frame-var (frame var) - (with-buffer-syntax () - (reset-inspector) - (inspect-object (frame-var-value frame var)))) - -;;;;; Lists - -(defmethod emacs-inspect ((o cons)) - (if (listp (cdr o)) - (inspect-list o) - (inspect-cons o))) - -(defun inspect-cons (cons) - (label-value-line* - ('car (car cons)) - ('cdr (cdr cons)))) - -(defun inspect-list (list) - (multiple-value-bind (length tail) (safe-length list) - (flet ((frob (title list) - (list* title '(:newline) (inspect-list-aux list)))) - (cond ((not length) - (frob "A circular list:" - (cons (car list) - (ldiff (cdr list) list)))) - ((not tail) - (frob "A proper list:" list)) - (t - (frob "An improper list:" list)))))) - -(defun inspect-list-aux (list) - (loop for i from 0 for rest on list while (consp rest) append - (if (listp (cdr rest)) - (label-value-line i (car rest)) - (label-value-line* (i (car rest)) (:tail (cdr rest)))))) - -(defun safe-length (list) - "Similar to `list-length', but avoid errors on improper lists. -Return two values: the length of the list and the last cdr. -Return NIL if LIST is circular." - (do ((n 0 (+ n 2)) ;Counter. - (fast list (cddr fast)) ;Fast pointer: leaps by 2. - (slow list (cdr slow))) ;Slow pointer: leaps by 1. - (nil) - (cond ((null fast) (return (values n nil))) - ((not (consp fast)) (return (values n fast))) - ((null (cdr fast)) (return (values (1+ n) (cdr fast)))) - ((and (eq fast slow) (> n 0)) (return nil)) - ((not (consp (cdr fast))) (return (values (1+ n) (cdr fast))))))) - -;;;;; Hashtables - -(defun hash-table-to-alist (ht) - (let ((result '())) - (maphash (lambda (key value) - (setq result (acons key value result))) - ht) - result)) - -(defmethod emacs-inspect ((ht hash-table)) - (append - (label-value-line* - ("Count" (hash-table-count ht)) - ("Size" (hash-table-size ht)) - ("Test" (hash-table-test ht)) - ("Rehash size" (hash-table-rehash-size ht)) - ("Rehash threshold" (hash-table-rehash-threshold ht))) - (let ((weakness (hash-table-weakness ht))) - (when weakness - (label-value-line "Weakness:" weakness))) - (unless (zerop (hash-table-count ht)) - `((:action "[clear hashtable]" - ,(lambda () (clrhash ht))) (:newline) - "Contents: " (:newline))) - (let ((content (hash-table-to-alist ht))) - (cond ((every (lambda (x) (typep (first x) '(or string symbol))) content) - (setf content (sort content 'string< :key #'first))) - ((every (lambda (x) (typep (first x) 'real)) content) - (setf content (sort content '< :key #'first)))) - (loop for (key . value) in content appending - `((:value ,key) " = " (:value ,value) - " " (:action "[remove entry]" - ,(let ((key key)) - (lambda () (remhash key ht)))) - (:newline)))))) - -;;;;; Arrays - -(defmethod emacs-inspect ((array array)) - (lcons* - (iline "Dimensions" (array-dimensions array)) - (iline "Element type" (array-element-type array)) - (iline "Total size" (array-total-size array)) - (iline "Adjustable" (adjustable-array-p array)) - (iline "Fill pointer" (if (array-has-fill-pointer-p array) - (fill-pointer array))) - "Contents:" '(:newline) - (labels ((k (i max) - (cond ((= i max) '()) - (t (lcons (iline i (row-major-aref array i)) - (k (1+ i) max)))))) - (k 0 (array-total-size array))))) - -;;;;; Chars - -(defmethod emacs-inspect ((char character)) - (append - (label-value-line* - ("Char code" (char-code char)) - ("Lower cased" (char-downcase char)) - ("Upper cased" (char-upcase char))) - (if (get-macro-character char) - `("In the current readtable (" - (:value ,*readtable*) ") it is a macro character: " - (:value ,(get-macro-character char)))))) - -;;;; Thread listing - -(defvar *thread-list* () - "List of threads displayed in Emacs. We don't care a about -synchronization issues (yet). There can only be one thread listing at -a time.") - -(defslimefun list-threads () - "Return a list (LABELS (ID NAME STATUS ATTRS ...) ...). -LABELS is a list of attribute names and the remaining lists are the -corresponding attribute values per thread. -Example: - ((:id :name :status :priority) - (6 \"swank-indentation-cache-thread\" \"Semaphore timed wait\" 0) - (5 \"reader-thread\" \"Active\" 0) - (4 \"control-thread\" \"Semaphore timed wait\" 0) - (2 \"Swank Sentinel\" \"Semaphore timed wait\" 0) - (1 \"listener\" \"Active\" 0) - (0 \"Initial\" \"Sleep\" 0))" - (setq *thread-list* (all-threads)) - (when (and *emacs-connection* - (use-threads-p) - (equalp (thread-name (current-thread)) "worker")) - (setf *thread-list* (delete (current-thread) *thread-list*))) - (let* ((plist (thread-attributes (car *thread-list*))) - (labels (loop for (key) on plist by #'cddr - collect key))) - `((:id :name :status ,@labels) - ,@(loop for thread in *thread-list* - for name = (thread-name thread) - for attributes = (thread-attributes thread) - collect (list* (thread-id thread) - (string name) - (thread-status thread) - (loop for label in labels - collect (getf attributes label))))))) - -(defslimefun quit-thread-browser () - (setq *thread-list* nil)) - -(defun nth-thread (index) - (nth index *thread-list*)) - -(defslimefun debug-nth-thread (index) - (let ((connection *emacs-connection*)) - (queue-thread-interrupt - (nth-thread index) - (lambda () - (with-connection (connection) - (simple-break)))))) - -(defslimefun kill-nth-thread (index) - (kill-thread (nth-thread index))) - -(defslimefun start-swank-server-in-thread (index port-file-name) - "Interrupt the INDEXth thread and make it start a swank server. -The server port is written to PORT-FILE-NAME." - (interrupt-thread (nth-thread index) - (lambda () - (start-server port-file-name :style nil)))) - -;;;; Class browser - -(defun mop-helper (class-name fn) - (let ((class (find-class class-name nil))) - (if class - (mapcar (lambda (x) (to-string (class-name x))) - (funcall fn class))))) - -(defslimefun mop (type symbol-name) - "Return info about classes using mop. - - When type is: - :subclasses - return the list of subclasses of class. - :superclasses - return the list of superclasses of class." - (let ((symbol (parse-symbol symbol-name *buffer-package*))) - (ecase type - (:subclasses - (mop-helper symbol #'swank-mop:class-direct-subclasses)) - (:superclasses - (mop-helper symbol #'swank-mop:class-direct-superclasses))))) - - -;;;; Automatically synchronized state -;;; -;;; Here we add hooks to push updates of relevant information to -;;; Emacs. - -;;;;; *FEATURES* - -(defun sync-features-to-emacs () - "Update Emacs if any relevant Lisp state has changed." - ;; FIXME: *slime-features* should be connection-local - (unless (eq *slime-features* *features*) - (setq *slime-features* *features*) - (send-to-emacs (list :new-features (features-for-emacs))))) - -(defun features-for-emacs () - "Return `*slime-features*' in a format suitable to send it to Emacs." - *slime-features*) - -(add-hook *pre-reply-hook* 'sync-features-to-emacs) - - -;;;;; Indentation of macros -;;; -;;; This code decides how macros should be indented (based on their -;;; arglists) and tells Emacs. A per-connection cache is used to avoid -;;; sending redundant information to Emacs -- we just say what's -;;; changed since last time. -;;; -;;; The strategy is to scan all symbols, pick out the macros, and look -;;; for &body-arguments. - -(defvar *configure-emacs-indentation* t - "When true, automatically send indentation information to Emacs -after each command.") - -(defslimefun update-indentation-information () - (send-to-indentation-cache `(:update-indentation-information)) - nil) - -;; This function is for *PRE-REPLY-HOOK*. -(defun sync-indentation-to-emacs () - "Send any indentation updates to Emacs via CONNECTION." - (when *configure-emacs-indentation* - (send-to-indentation-cache `(:sync-indentation ,*buffer-package*)))) - -;; Send REQUEST to the cache. If we are single threaded perform the -;; request right away, otherwise delegate the request to the -;; indentation-cache-thread. -(defun send-to-indentation-cache (request) - (let ((c *emacs-connection*)) - (etypecase c - (singlethreaded-connection - (handle-indentation-cache-request c request)) - (multithreaded-connection - (without-slime-interrupts - (send (mconn.indentation-cache-thread c) request)))))) - -(defun indentation-cache-loop (connection) - (with-connection (connection) - (loop - (restart-case - (handle-indentation-cache-request connection (receive)) - (abort () - :report "Return to the indentation cache request handling loop."))))) - -(defun handle-indentation-cache-request (connection request) - (dcase request - ((:sync-indentation package) - (let ((fullp (need-full-indentation-update-p connection))) - (perform-indentation-update connection fullp package))) - ((:update-indentation-information) - (perform-indentation-update connection t nil)))) - -(defun need-full-indentation-update-p (connection) - "Return true if the whole indentation cache should be updated. -This is a heuristic to avoid scanning all symbols all the time: -instead, we only do a full scan if the set of packages has changed." - (set-difference (list-all-packages) - (connection.indentation-cache-packages connection))) - -(defun perform-indentation-update (connection force package) - "Update the indentation cache in CONNECTION and update Emacs. -If FORCE is true then start again without considering the old cache." - (let ((cache (connection.indentation-cache connection))) - (when force (clrhash cache)) - (let ((delta (update-indentation/delta-for-emacs cache force package))) - (setf (connection.indentation-cache-packages connection) - (list-all-packages)) - (unless (null delta) - (setf (connection.indentation-cache connection) cache) - (send-to-emacs (list :indentation-update delta)))))) - -(defun update-indentation/delta-for-emacs (cache force package) - "Update the cache and return the changes in a (SYMBOL INDENT PACKAGES) list. -If FORCE is true then check all symbols, otherwise only check symbols -belonging to PACKAGE." - (let ((alist '())) - (flet ((consider (symbol) - (let ((indent (symbol-indentation symbol))) - (when indent - (unless (equal (gethash symbol cache) indent) - (setf (gethash symbol cache) indent) - (let ((pkgs (mapcar #'package-name - (symbol-packages symbol))) - (name (string-downcase symbol))) - (push (list name indent pkgs) alist))))))) - (cond (force - (do-all-symbols (symbol) - (consider symbol))) - ((package-name package) ; don't try to iterate over a - ; deleted package. - (do-symbols (symbol package) - (when (eq (symbol-package symbol) package) - (consider symbol))))) - alist))) - -(defun package-names (package) - "Return the name and all nicknames of PACKAGE in a fresh list." - (cons (package-name package) (copy-list (package-nicknames package)))) - -(defun symbol-packages (symbol) - "Return the packages where SYMBOL can be found." - (let ((string (string symbol))) - (loop for p in (list-all-packages) - when (eq symbol (find-symbol string p)) - collect p))) - -(defun cl-symbol-p (symbol) - "Is SYMBOL a symbol in the COMMON-LISP package?" - (eq (symbol-package symbol) cl-package)) - -(defun known-to-emacs-p (symbol) - "Return true if Emacs has special rules for indenting SYMBOL." - (cl-symbol-p symbol)) - -(defun symbol-indentation (symbol) - "Return a form describing the indentation of SYMBOL. -The form is to be used as the `common-lisp-indent-function' property -in Emacs." - (if (and (macro-function symbol) - (not (known-to-emacs-p symbol))) - (let ((arglist (arglist symbol))) - (etypecase arglist - ((member :not-available) - nil) - (list - (macro-indentation arglist)))) - nil)) - -(defun macro-indentation (arglist) - (if (well-formed-list-p arglist) - (position '&body (remove '&optional (clean-arglist arglist))) - nil)) - -(defun clean-arglist (arglist) - "Remove &whole, &enviroment, and &aux elements from ARGLIST." - (cond ((null arglist) '()) - ((member (car arglist) '(&whole &environment)) - (clean-arglist (cddr arglist))) - ((eq (car arglist) '&aux) - '()) - (t (cons (car arglist) (clean-arglist (cdr arglist)))))) - -(defun well-formed-list-p (list) - "Is LIST a proper list terminated by NIL?" - (typecase list - (null t) - (cons (well-formed-list-p (cdr list))) - (t nil))) - -(defun print-indentation-lossage (&optional (stream *standard-output*)) - "Return the list of symbols whose indentation styles collide incompatibly. -Collisions are caused because package information is ignored." - (let ((table (make-hash-table :test 'equal))) - (flet ((name (s) (string-downcase (symbol-name s)))) - (do-all-symbols (s) - (setf (gethash (name s) table) - (cons s (symbol-indentation s)))) - (let ((collisions '())) - (do-all-symbols (s) - (let* ((entry (gethash (name s) table)) - (owner (car entry)) - (indent (cdr entry))) - (unless (or (eq s owner) - (equal (symbol-indentation s) indent) - (and (not (fboundp s)) - (null (macro-function s)))) - (pushnew owner collisions) - (pushnew s collisions)))) - (if (null collisions) - (format stream "~&No worries!~%") - (format stream "~&Symbols with collisions:~%~{ ~S~%~}" - collisions)))))) - -;;; FIXME: it's too slow on CLASP right now, remove once it's fast enough. -#-clasp -(add-hook *pre-reply-hook* 'sync-indentation-to-emacs) - -(defun make-output-function-for-target (connection target) - "Create a function to send user output to a specific TARGET in Emacs." - (lambda (string) - (swank::with-connection (connection) - (with-simple-restart - (abort "Abort sending output to Emacs.") - (swank::send-to-emacs `(:write-string ,string ,target)))))) - -(defun make-output-stream-for-target (connection target) - "Create a stream that sends output to a specific TARGET in Emacs." - (make-output-stream (make-output-function-for-target connection target))) - - -;;;; Testing - -(defslimefun io-speed-test (&optional (n 1000) (m 1)) - (let* ((s *standard-output*) - (*trace-output* (make-broadcast-stream s *log-output*))) - (time (progn - (dotimes (i n) - (format s "~D abcdefghijklm~%" i) - (when (zerop (mod n m)) - (finish-output s))) - (finish-output s) - (when *emacs-connection* - (eval-in-emacs '(message "done."))))) - (terpri *trace-output*) - (finish-output *trace-output*) - nil)) - -(defslimefun flow-control-test (n delay) - (let ((stream (make-output-stream - (let ((conn *emacs-connection*)) - (lambda (string) - (declare (ignore string)) - (with-connection (conn) - (send-to-emacs `(:test-delay ,delay)))))))) - (dotimes (i n) - (print i stream) - (force-output stream) - (background-message "flow-control-test: ~d" i)))) - - -(defun before-init (version load-path) - (pushnew :swank *features*) - (setq *swank-wire-protocol-version* version) - (setq *load-path* load-path)) - -(defun init () - (run-hook *after-init-hook*)) - -;; Local Variables: -;; coding: latin-1-unix -;; indent-tabs-mode: nil -;; outline-regexp: ";;;;;*" -;; End: - -;;; swank.lisp ends here diff --git a/elpa/slime-20200414.1444/swank/abcl.lisp b/elpa/slime-20200414.1444/swank/abcl.lisp deleted file mode 100644 index fec2032f..00000000 --- a/elpa/slime-20200414.1444/swank/abcl.lisp +++ /dev/null @@ -1,1532 +0,0 @@ -;;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;;*"; -*- -;;; -;;; swank-abcl.lisp --- Armedbear CL specific code for SLIME. -;;; -;;; Adapted from swank-acl.lisp, Andras Simon, 2004 -;;; New work by Alan Ruttenberg, 2016-7 -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(defpackage swank/abcl - (:use cl swank/backend) - (:import-from :java - #:jcall #:jstatic - #:jmethod - #:jfield - #:jconstructor - #:jnew-array #:jarray-length #:jarray-ref #:jnew-array-from-array - #:jclass #:jnew #:java-object - ;; be conservative and add any import java functions only for later lisps - #+#.(swank/backend:with-symbol 'jfield-name 'java) #:jfield-name - #+#.(swank/backend:with-symbol 'jinstance-of-p 'java) #:jinstance-of-p - #+#.(swank/backend:with-symbol 'jclass-superclass 'java) #:jclass-superclass - #+#.(swank/backend:with-symbol 'jclass-interfaces 'java) #:jclass-interfaces - #+#.(swank/backend:with-symbol 'java-exception 'java) #:java-exception - #+#.(swank/backend:with-symbol 'jobject-class 'java) #:jobject-class - #+#.(swank/backend:with-symbol 'jclass-name 'java) #:jclass-name - #+#.(swank/backend:with-symbol 'java-object-p 'java) #:java-object-p)) - -(in-package swank/abcl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :collect) ;just so that it doesn't spoil the flying letters - (require :pprint) - (require :gray-streams) - (require :abcl-contrib) - - ;;; Probe and load ABCL-INTROSPECT pushing to *FEATURES* on success - ;;; allowing us to conditionalize usage via `#+abcl-introspect` forms. - (when (ignore-errors (and - (fboundp '(setf sys::function-plist)) - (progn - (require :abcl-introspect) - (find "ABCL-INTROSPECT" *modules* :test - 'equal)))) - (pushnew :abcl-introspect *features*))) - -(defimplementation gray-package-name () - "GRAY-STREAMS") - -;; FIXME: switch to shared Gray stream implementation when the -;; architecture for booting streams allows us to replace the Java-side -;; implementation of a Slime{Input,Output}Stream.java classes are -;; subsumed . -(progn - (defimplementation make-output-stream (write-string) - (ext:make-slime-output-stream write-string)) - - (defimplementation make-input-stream (read-string) - (ext:make-slime-input-stream read-string - (make-synonym-stream '*standard-output*)))) - -;;; Have CL:INSPECT use SLIME -;;; -;;; Since Swank may also be run in a server not running under Emacs -;;; and potentially with other REPLs, we export a functional toggle -;;; for the user to call after loading these definitions. -(defun enable-cl-inspect-in-emacs () - (swank::wrap 'cl:inspect :use-slime :replace 'swank::inspect-in-emacs)) - -;; ??? repair bare print object so inspector titles show java class -(defun %print-unreadable-object-java-too (object stream type identity body) - (setf stream (sys::out-synonym-of stream)) - (when *print-readably* - (error 'print-not-readable :object object)) - (format stream "#<") - (when type - (if (java-object-p object) - ;; Special handling for java objects - (if (jinstance-of-p object "java.lang.Class") - (progn - (write-string "jclass " stream) - (format stream "~a" (jclass-name object))) - (format stream "~a" (jclass-name (jobject-class object)))) - ;; usual handling - (format stream "~S" (type-of object))) - (format stream " ")) - (when body - (funcall body)) - (when identity - (when (or body (not type)) - (format stream " ")) - (format stream "{~X}" (sys::identity-hash-code object))) - (format stream ">") - nil) - -(wrap 'sys::%print-unreadable-object :more-informative :replace '%print-unreadable-object-java-too) - -(defimplementation call-with-compilation-hooks (function) - (funcall function)) - - -;;;; MOP - -;;dummies and definition - -(defclass standard-slot-definition ()()) - -(defun slot-definition-documentation (slot) - (declare (ignore slot)) - #+abcl-introspect - (documentation slot 't)) - -(defun slot-definition-type (slot) - (declare (ignore slot)) - t) - -(defun class-prototype (class) - (declare (ignore class)) - nil) - -(defun generic-function-declarations (gf) - (declare (ignore gf)) - nil) - -(defun specializer-direct-methods (spec) - (mop:class-direct-methods spec)) - -(defun slot-definition-name (slot) - (mop:slot-definition-name slot)) - -(defun class-slots (class) - (mop:class-slots class)) - -(defun method-generic-function (method) - (mop:method-generic-function method)) - -(defun method-function (method) - (mop:method-function method)) - -(defun slot-boundp-using-class (class object slotdef) - (declare (ignore class)) - (system::slot-boundp object (slot-definition-name slotdef))) - -(defun slot-value-using-class (class object slotdef) - (declare (ignore class)) - (system::slot-value object (slot-definition-name slotdef))) - -(defun (setf slot-value-using-class) (new class object slotdef ) - (declare (ignore class)) - (mop::%set-slot-value object (slot-definition-name slotdef) new)) - -(import-to-swank-mop - '( ;; classes - cl:standard-generic-function - standard-slot-definition ;;dummy - cl:method - cl:standard-class - #+#.(swank/backend:with-symbol - 'compute-applicable-methods-using-classes 'mop) - mop:compute-applicable-methods-using-classes - ;; standard-class readers - mop:class-default-initargs - mop:class-direct-default-initargs - mop:class-direct-slots - mop:class-direct-subclasses - mop:class-direct-superclasses - mop:eql-specializer - mop:class-finalized-p - mop:finalize-inheritance - cl:class-name - mop:class-precedence-list - class-prototype ;;dummy - class-slots - specializer-direct-methods - ;; eql-specializer accessors - mop::eql-specializer-object - ;; generic function readers - mop:generic-function-argument-precedence-order - generic-function-declarations ;;dummy - mop:generic-function-lambda-list - mop:generic-function-methods - mop:generic-function-method-class - mop:generic-function-method-combination - mop:generic-function-name - ;; method readers - method-generic-function - method-function - mop:method-lambda-list - mop:method-specializers - mop:method-qualifiers - ;; slot readers - mop:slot-definition-allocation - slot-definition-documentation ;;dummy - mop:slot-definition-initargs - mop:slot-definition-initform - mop:slot-definition-initfunction - slot-definition-name - slot-definition-type ;;dummy - mop:slot-definition-readers - mop:slot-definition-writers - slot-boundp-using-class - slot-value-using-class - set-slot-value-using-class - #+#.(swank/backend:with-symbol - 'slot-makunbound-using-class 'mop) - mop:slot-makunbound-using-class)) - -;;;; TCP Server - -(defimplementation preferred-communication-style () - :spawn) - -(defimplementation create-socket (host port &key backlog) - (ext:make-server-socket port)) - -(defimplementation local-port (socket) - (jcall (jmethod "java.net.ServerSocket" "getLocalPort") socket)) - -(defimplementation close-socket (socket) - (ext:server-socket-close socket)) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (declare (ignore buffering timeout)) - (ext:get-socket-stream (ext:socket-accept socket) - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format (or external-format :default))) - -;;;; UTF8 - -;; faster please! -(defimplementation string-to-utf8 (s) - (jbytes-to-octets - (java:jcall - (java:jmethod "java.lang.String" "getBytes" "java.lang.String") - s - "UTF8"))) - -(defimplementation utf8-to-string (u) - (java:jnew - (java:jconstructor "org.armedbear.lisp.SimpleString" - "java.lang.String") - (java:jnew (java:jconstructor "java.lang.String" "[B" "java.lang.String") - (octets-to-jbytes u) - "UTF8"))) - -(defun octets-to-jbytes (octets) - (declare (type octets (simple-array (unsigned-byte 8) (*)))) - (let* ((len (length octets)) - (bytes (java:jnew-array "byte" len))) - (loop for byte across octets - for i from 0 - do (java:jstatic (java:jmethod "java.lang.reflect.Array" "setByte" - "java.lang.Object" "int" "byte") - "java.lang.reflect.Array" - bytes i byte)) - bytes)) - -(defun jbytes-to-octets (jbytes) - (let* ((len (java:jarray-length jbytes)) - (octets (make-array len :element-type '(unsigned-byte 8)))) - (loop for i from 0 below len - for jbyte = (java:jarray-ref jbytes i) - do (setf (aref octets i) jbyte)) - octets)) - -;;;; External formats - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 "latin-1" "iso-latin-1" "iso-8859-1") - ((:iso-8859-1 :eol-style :lf) - "latin-1-unix" "iso-latin-1-unix" "iso-8859-1-unix") - (:utf-8 "utf-8") - ((:utf-8 :eol-style :lf) "utf-8-unix") - (:euc-jp "euc-jp") - ((:euc-jp :eol-style :lf) "euc-jp-unix") - (:us-ascii "us-ascii") - ((:us-ascii :eol-style :lf) "us-ascii-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) - (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -;;;; Unix signals - -(defimplementation getpid () - (if (fboundp 'ext::get-pid) - (ext::get-pid) ;;; Introduced with abcl-1.5.0 - (handler-case - (let* ((runtime - (java:jstatic "getRuntime" "java.lang.Runtime")) - (command - (java:jnew-array-from-array - "java.lang.String" #("sh" "-c" "echo $PPID"))) - (runtime-exec-jmethod - ;; Complicated because java.lang.Runtime.exec() is - ;; overloaded on a non-primitive type (array of - ;; java.lang.String), so we have to use the actual - ;; parameter instance to get java.lang.Class - (java:jmethod "java.lang.Runtime" "exec" - (java:jcall - (java:jmethod "java.lang.Object" "getClass") - command))) - (process - (java:jcall runtime-exec-jmethod runtime command)) - (output - (java:jcall (java:jmethod "java.lang.Process" "getInputStream") - process))) - (java:jcall (java:jmethod "java.lang.Process" "waitFor") - process) - (loop :with b :do - (setq b - (java:jcall (java:jmethod "java.io.InputStream" "read") - output)) - :until (member b '(-1 #x0a)) ; Either EOF or LF - :collecting (code-char b) :into result - :finally (return - (parse-integer (coerce result 'string))))) - (t () 0)))) - -(defimplementation lisp-implementation-type-name () - "armedbear") - -(defimplementation set-default-directory (directory) - (let ((dir (sys::probe-directory directory))) - (when dir (setf *default-pathname-defaults* dir)) - (namestring dir))) - - -;;;; Misc - -(defimplementation arglist (fun) - (cond ((symbolp fun) - (multiple-value-bind (arglist present) - (sys::arglist fun) - (when (and (not present) - (fboundp fun) - (typep (symbol-function fun) - 'standard-generic-function)) - (setq arglist - (mop::generic-function-lambda-list (symbol-function fun)) - present - t)) - (if present arglist :not-available))) - (t :not-available))) - -(defimplementation function-name (function) - (if (fboundp 'sys::any-function-name) - ;; abcl-1.5.0 - (sys::any-function-name function) - ;; pre abcl-1.5.0 - (nth-value 2 (function-lambda-expression function)))) - -(defimplementation macroexpand-all (form &optional env) - (ext:macroexpand-all form env)) - -(defimplementation collect-macro-forms (form &optional env) - ;; Currently detects only normal macros, not compiler macros. - (declare (ignore env)) - (with-collected-macro-forms (macro-forms) - (handler-bind ((warning #'muffle-warning)) - (ignore-errors - (compile nil `(lambda () ,(macroexpand-all form env))))) - (values macro-forms nil))) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind &optional (sym symbol)) - (or (documentation sym kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (when (fboundp symbol) - (maybe-push - (cond ((macro-function symbol) :macro) - ((special-operator-p symbol) :special-operator) - ((typep (fdefinition symbol) 'generic-function) - :generic-function) - (t :function)) - (doc 'function))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - ((:variable :macro) - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:class - (describe (find-class symbol))))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:class - (describe (find-class symbol))))) - -;;;; Debugger - -;; Copied from swank-sbcl.lisp. -#+abcl-introspect -(defvar sys::*caught-frames*) -;; -;; Notice that *INVOKE-DEBUGGER-HOOK* is tried before *DEBUGGER-HOOK*, -;; so we have to make sure that the latter gets run when it was -;; established locally by a user (i.e. changed meanwhile.) -(defun make-invoke-debugger-hook (hook) - (lambda (condition old-hook) - (prog1 (let (#+abcl-introspect - (sys::*caught-frames* nil)) - ;; the next might be the right thing for earlier lisps but I don't know - ;;; XXX probably doesn't work in absence of ABCL-INTROSPECT on abcl-1.4 and earlier - (let (#+abcl-introspect - (sys::*saved-backtrace* - (if (fboundp 'sys::new-backtrace) - (sys::new-backtrace condition) - (sys::backtrace)))) - (if *debugger-hook* - (funcall *debugger-hook* condition old-hook) - (funcall hook condition old-hook))))))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (sys::*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - (funcall fun))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setq sys::*invoke-debugger-hook* (make-invoke-debugger-hook function))) - -(defvar *sldb-topframe*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let* ((magic-token (intern "SWANK-DEBUGGER-HOOK" 'swank)) - (*sldb-topframe* - (or - (second (member magic-token - #+abcl-introspect sys::*saved-backtrace* - #-abcl-introspect (sys:backtrace) - :key (lambda (frame) - (first (sys:frame-to-list frame))))) - (car sys::*saved-backtrace*))) - #+#.(swank/backend:with-symbol *debug-condition* 'ext) - (ext::*debug-condition* swank::*swank-debugger-condition*)) - (funcall debugger-loop-fn))) - -(defun backtrace (start end) - "A backtrace without initial SWANK frames." - (let ((backtrace - #+abcl-introspect sys::*saved-backtrace* - #-abcl-introspect (sys:backtrace))) - (subseq (or (member *sldb-topframe* backtrace) backtrace) start end))) - -(defun nth-frame (index) - (nth index (backtrace 0 nil))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum))) - (backtrace start end))) - -;; Don't count on JSS being loaded, but if it is then there's some more stuff we can do -+#+#.(swank/backend:with-symbol 'invoke-restargs 'jss) -(defun jss-p () - (and (member "JSS" *modules* :test 'string=) (intern "INVOKE-RESTARGS" "JSS"))) - -+#+#.(swank/backend:with-symbol 'invoke-restargs 'jss) -(defun matches-jss-call (form) - (flet ((gensymp (s) (and (symbolp s) (null (symbol-package s)))) - (invokep (s) (and (symbolp s) (eq s (jss-p))))) - (let ((method - (swank/match::select-match - form - (((LAMBDA ((#'gensymp a) &REST (#'gensymp b)) - ((#'invokep fun) (#'stringp c) (#'gensymp d) (#'gensymp e) . args)) . args) '=> c) - (other nil)))) - method))) - -#-abcl-introspect -(defimplementation print-frame (frame stream) - (write-string (sys:frame-to-string frame) - stream)) - -;; Use princ cs write-string for lisp frames as it respects (print-object (function t)) -;; Rewrite jss expansions to their unexpanded state -;; Show java exception frames up to where a java exception happened with a "!" -;; Check if a java class corresponds to a lisp function and tell us if to -(defvar *debugger-package* (find-package 'cl-user)) - -#+abcl-introspect -(defimplementation print-frame (frame stream) - ;; make clear which functions aren't Common Lisp. Otherwise uses - ;; default package, which is invisible - (let ((*package* (or *debugger-package* *package*))) - (if (typep frame 'sys::lisp-stack-frame) - (if (not (jss-p)) - (princ (system:frame-to-list frame) stream) - ;; rewrite jss forms as they would be written - (let ((form (system:frame-to-list frame))) - (if (eq (car form) (jss-p)) - (format stream "(#~s ~{~s~^~})" (second form) (list* (third form) (fourth form))) - (loop initially (write-char #\( stream) - for (el . rest) on form - for method = (swank/abcl::matches-jss-call el) - do - (cond (method - (format stream "(#~s ~{~s~^~})" method (cdr el))) - (t - (prin1 el stream))) - (unless (null rest) (write-char #\space stream)) - finally (write-char #\) stream))))) - (let ((classname (getf (sys:frame-to-list frame) :class))) - (if (and (fboundp 'sys::javaframe) - (member (sys::javaframe frame) sys::*caught-frames* :test 'equal)) - (write-string "! " stream)) - (write-string (sys:frame-to-string frame) stream) - (if (and classname (sys::java-class-lisp-function classname)) - (format stream " = ~a" (sys::java-class-lisp-function classname))))))) - -;;; Machinery for DEFIMPLEMENTATION -;;; FIXME can't seem to use FLET forms with DEFIMPLEMENTATION --ME 20150403 -(defun nth-frame-list (index) - (jcall "toLispList" (nth-frame index))) - -(defun match-lambda (operator values) - (jvm::match-lambda-list - (multiple-value-list - (jvm::parse-lambda-list (ext:arglist operator))) - values)) - -(defimplementation frame-locals (index) - (let ((frame (nth-frame index))) - ;; FIXME introspect locals in SYS::JAVA-STACK-FRAME - (when (typep frame 'sys::lisp-stack-frame) - (loop - :for id :upfrom 0 - :with frame = (nth-frame-list index) - :with operator = (first frame) - :with values = (rest frame) - :with arglist = (if (and operator (consp values) (not (null values))) - (handler-case (match-lambda operator values) - (jvm::lambda-list-mismatch (e) (declare(ignore e)) - :lambda-list-mismatch)) - :not-available) - :for value :in values - :collecting (list - :name (if (not (keywordp arglist)) - (first (nth id arglist)) - (format nil "arg~A" id)) - :id id - :value value))))) - -(defimplementation frame-var-value (index id) - (elt (rest (jcall "toLispList" (nth-frame index))) id)) - -#+abcl-introspect -(defimplementation disassemble-frame (index) - (sys::disassemble (frame-function (nth-frame index)))) - -(defun frame-function (frame) - (let ((list (sys::frame-to-list frame))) - (cond - ((keywordp (car list)) - (find (getf list :method) - (jcall "getDeclaredMethods" (jclass (getf list :class))) - :key (lambda(e)(jcall "getName" e)) :test 'equal)) - (t (car list) )))) - -(defimplementation frame-source-location (index) - (let ((frame (nth-frame index))) - (or (source-location (nth-frame index)) - `(:error ,(format nil "No source for frame: ~a" frame))))) - - -;;;; Compiler hooks - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) -(defvar *buffer-string*) -(defvar *compile-filename*) - -(defvar *abcl-signaled-conditions*) - -(defun handle-compiler-warning (condition) - (let ((loc (when (and jvm::*compile-file-pathname* - system::*source-position*) - (cons jvm::*compile-file-pathname* system::*source-position*)))) - ;; filter condition signaled more than once. - (unless (member condition *abcl-signaled-conditions*) - (push condition *abcl-signaled-conditions*) - (signal 'compiler-condition - :original-condition condition - :severity :warning - :message (format nil "~A" condition) - :location (cond (*buffer-name* - (make-location - (list :buffer *buffer-name*) - (list :offset *buffer-start-position* 0))) - (loc - (destructuring-bind (file . pos) loc - (make-location - (list :file (namestring (truename file))) - (list :position (1+ pos))))) - (t - (make-location - (list :file (namestring *compile-filename*)) - (list :position 1)))))))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore external-format policy)) - (let ((jvm::*resignal-compiler-warnings* t) - (*abcl-signaled-conditions* nil)) - (handler-bind ((warning #'handle-compiler-warning)) - (let ((*buffer-name* nil) - (*compile-filename* input-file)) - (multiple-value-bind (fn warn fail) - (compile-file input-file :output-file output-file) - (values fn warn - (and fn load-p - (not (load fn))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore filename line column policy)) - (let ((jvm::*resignal-compiler-warnings* t) - (*abcl-signaled-conditions* nil)) - (handler-bind ((warning #'handle-compiler-warning)) - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-string* string) - (sys::*source* (make-pathname :device "emacs-buffer" :name buffer)) - (sys::*source-position* position)) - (funcall (compile nil (read-from-string - (format nil "(~S () ~A)" 'lambda string)))) - t)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; source location and users of it - -(defgeneric source-location (object)) - -;; try to find some kind of source for internals -#+abcl-introspect -(defun implementation-source-location (arg) - (let ((function (cond ((functionp arg) - arg) - ((and (symbolp arg) (fboundp arg)) - (or (symbol-function arg) (macro-function arg)))))) - (when (typep function 'generic-function) - (setf function (mop::funcallable-instance-function function))) - ;; functions are execute methods of class - (when (or (functionp function) (special-operator-p arg)) - (let ((fclass (jcall "getClass" function))) - (let ((classname (jcall "getName" fclass))) - (destructuring-bind (class local) - (if (find #\$ classname) - (split-string classname "\\$") - (list classname (jcall "replaceFirst" classname "([^.]*\\.)*" ""))) - (unless (member local '("MacroObject" "CompiledClosure" "Closure") :test 'equal) - ;; look for java source - (let* ((partial-path (substitute #\/ #\. class)) - (java-path (concatenate 'string partial-path ".java")) - (found-in-source-path (find-file-in-path java-path *source-path*))) - ;; snippet for finding the internal class within the file - (if found-in-source-path - `((:primitive ,local) - (:location ,found-in-source-path - (:line 0) - (:snippet ,(format nil "class ~a" local)))) - ;; if not, look for the class file, and hope that - ;; emacs is configured to disassemble class entries - ;; in jars. - - ;; Alan uses jdc.el - ;; - ;; with jad - ;; Also (setq sys::*disassembler* "jad -a -p") - (let ((class-in-source-path - (find-file-in-path (concatenate 'string partial-path ".class") *source-path*))) - ;; no snippet, since internal class is in its own file - (when class-in-source-path - `(:primitive (:location ,class-in-source-path (:line 0) nil))))))))))))) - -#+abcl-introspect -(defun get-declared-field (class fieldname) - (find fieldname (jcall "getDeclaredFields" class) :key 'jfield-name :test 'equal)) - -#+abcl-introspect -(defun symbol-defined-in-java (symbol) - (loop with internal-name1 = (jcall "replaceAll" (jcall "replaceAll" (string symbol) "\\*" "") "-" "_") - with internal-name2 = (jcall "replaceAll" (jcall "replaceAll" (string symbol) "\\*" "_") "-" "_") - for class in - (load-time-value (mapcar - 'jclass - '("org.armedbear.lisp.Package" - "org.armedbear.lisp.Symbol" - "org.armedbear.lisp.Debug" - "org.armedbear.lisp.Extensions" - "org.armedbear.lisp.JavaObject" - "org.armedbear.lisp.Lisp" - "org.armedbear.lisp.Pathname" - "org.armedbear.lisp.Site"))) - thereis - (or (get-declared-field class internal-name1) - (get-declared-field class internal-name2)))) - -#+abcl-introspect -(defun maybe-implementation-variable (s) - (let ((field (symbol-defined-in-java s))) - (and field - (let ((class (jcall "getName" (jcall "getDeclaringClass" field)))) - (let* ((partial-path (substitute #\/ #\. class)) - (java-path (concatenate 'string partial-path ".java")) - (found-in-source-path (find-file-in-path java-path *source-path*))) - (when found-in-source-path - `(symbol (:location ,found-in-source-path (:line 0) - (:snippet ,(format nil "~s" (string s))))))))))) - -#+abcl-introspect -(defun if-we-have-to-choose-one-choose-the-function (sources) - (or (loop for spec in sources - for (dspec) = spec - when (and (consp dspec) (eq (car dspec) :function)) - when (and (consp dspec) (member (car dspec) '(:swank-implementation :function))) - do (return-from if-we-have-to-choose-one-choose-the-function spec)) - (car sources))) - -(defmethod source-location ((symbol symbol)) - (or #+abcl-introspect - (let ((maybe (if-we-have-to-choose-one-choose-the-function (get symbol 'sys::source)))) - (and maybe (second (slime-location-from-source-annotation symbol maybe)))) - ;; This below should be obsolete - it uses the old sys:%source - ;; leave it here for now just in case - (and (pathnamep (ext:source-pathname symbol)) - (let ((pos (ext:source-file-position symbol)) - (path (namestring (ext:source-pathname symbol)))) - ; boot.lisp gets recorded wrong - (when (equal path "boot.lisp") - (setq path (second (find-file-in-path "org/armedbear/lisp/boot.lisp" *source-path*)))) - (cond ((ext:pathname-jar-p path) - `(:location - ;; strip off "jar:file:" = 9 characters - (:zip ,@(split-string (subseq path (length "jar:file:")) "!/")) - ;; pos never seems right. Use function name. - (:function-name ,(string symbol)) - (:align t))) - ((equal (pathname-device (ext:source-pathname symbol)) "emacs-buffer") - ;; conspire with swank-compile-string to keep the buffer - ;; name in a pathname whose device is "emacs-buffer". - `(:location - (:buffer ,(pathname-name (ext:source-pathname symbol))) - (:function-name ,(string symbol)) - (:align t))) - (t - `(:location - (:file ,path) - ,(if pos - (list :position (1+ pos)) - (list :function-name (string symbol))) - (:align t)))))) - #+abcl-introspect - (second (implementation-source-location symbol)))) - -(defmethod source-location ((frame sys::java-stack-frame)) - (destructuring-bind (&key class method file line) (sys:frame-to-list frame) - (declare (ignore method)) - (let ((file (or (find-file-in-path file *source-path*) - (let ((f (format nil "~{~a/~}~a" - (butlast (split-string class "\\.")) - file))) - (find-file-in-path f *source-path*))))) - (and file - `(:location ,file (:line ,line) ()))))) - -(defmethod source-location ((frame sys::lisp-stack-frame)) - (destructuring-bind (operator &rest args) (sys:frame-to-list frame) - (declare (ignore args)) - (etypecase operator - (function (source-location operator)) - (list nil) - (symbol (source-location operator))))) - -(defmethod source-location ((fun function)) - (if #+abcl-introspect - (sys::local-function-p fun) - #-abcl-introspect - nil - (source-location (sys::local-function-owner fun)) - (let ((name (function-name fun))) - (and name (source-location name))))) - -(defmethod source-location ((method method)) - #+abcl-introspect - (let ((found - (find `(:method ,@(sys::method-spec-list method)) - (get (function-name method) 'sys::source) - :key 'car :test 'equalp))) - (and found (second (slime-location-from-source-annotation (function-name method) found)))) - #-abcl-introspect - (let ((name (function-name fun))) - (and name (source-location name)))) - -(defun system-property (name) - (jstatic "getProperty" "java.lang.System" name)) - -(defun pathname-parent (pathname) - (make-pathname :directory (butlast (pathname-directory pathname)))) - -(defun pathname-absolute-p (pathname) - (eq (car (pathname-directory pathname)) ':absolute)) - -(defun split-string (string regexp) - (coerce - (jcall (jmethod "java.lang.String" "split" "java.lang.String") - string regexp) - 'list)) - -(defun path-separator () - (jfield "java.io.File" "pathSeparator")) - -(defun search-path-property (prop-name) - (let ((string (system-property prop-name))) - (and string - (remove nil - (mapcar #'truename - (split-string string (path-separator))))))) - -(defun jdk-source-path () - (let* ((jre-home (truename (system-property "java.home"))) - (src-zip (merge-pathnames "src.zip" (pathname-parent jre-home))) - (truename (probe-file src-zip))) - (and truename (list truename)))) - -(defun class-path () - (append (search-path-property "java.class.path") - (search-path-property "sun.boot.class.path"))) - -(defvar *source-path* - (remove nil - (append (search-path-property "user.dir") - (jdk-source-path) - ;; include lib jar files. contrib has lisp code. Would be good to build abcl.jar with source code as well - #+abcl-introspect - (list (sys::find-system-jar) - (sys::find-contrib-jar)))) - ;; you should tell slime where the abcl sources are. In .swank.lisp I have: - ;; (push (probe-file "/Users/alanr/repos/abcl/src/") *SOURCE-PATH*) -"List of directories to search for source files.") - -(defun zipfile-contains-p (zipfile-name entry-name) - (let ((zipfile (jnew (jconstructor "java.util.zip.ZipFile" - "java.lang.String") - zipfile-name))) - (jcall - (jmethod "java.util.zip.ZipFile" "getEntry" "java.lang.String") - zipfile entry-name))) - -;; Try to find FILENAME in PATH. If found, return a file spec as -;; needed by Emacs. We also look in zip files. -(defun find-file-in-path (filename path) - (labels ((try (dir) - (cond ((not (pathname-type dir)) - (let ((f (probe-file (merge-pathnames filename dir)))) - (and f `(:file ,(namestring f))))) - ((member (pathname-type dir) '("zip" "jar") :test 'equal) - (try-zip dir)) - (t (error "strange path element: ~s" path)))) - (try-zip (zip) - (let* ((zipfile-name (namestring (truename zip)))) - (and (zipfile-contains-p zipfile-name filename) - `(#+abcl-introspect - :zip - #-abcl-introspect - :dir - ,zipfile-name ,filename))))) - (cond ((pathname-absolute-p filename) (probe-file filename)) - (t - (loop for dir in path - if (try dir) return it))))) - -(defparameter *definition-types* - '(:variable defvar - :constant defconstant - :type deftype - :symbol-macro define-symbol-macro - :macro defmacro - :compiler-macro define-compiler-macro - :function defun - :generic-function defgeneric - :method defmethod - :setf-expander define-setf-expander - :structure defstruct - :condition define-condition - :class defclass - :method-combination define-method-combination - :package defpackage - :transform :deftransform - :optimizer :defoptimizer - :vop :define-vop - :source-transform :define-source-transform - :ir1-convert :def-ir1-translator - :declaration declaim - :alien-type :define-alien-type) - "Map SB-INTROSPECT definition type names to Slime-friendly forms") - -(defun definition-specifier (type) - "Return a pretty specifier for NAME representing a definition of type TYPE." - (or (if (and (consp type) (getf *definition-types* (car type))) - `(,(getf *definition-types* (car type)) ,(second type) ,@(third type) ,@(cdddr type)) - (getf *definition-types* type)) - type)) - -(defun stringify-method-specs (type) - "return a (:method ..) location for slime" - (let ((*print-case* :downcase)) - (flet ((p (a) (princ-to-string a))) - (destructuring-bind (name qualifiers specializers) (cdr type) - `(,(car type) ,(p name) ,(mapcar #'p specializers) ,@(mapcar #'p qualifiers)))))) - -;; for abcl source, check if it is still there, and if not, look in abcl jar instead -(defun maybe-redirect-to-jar (path) - (setq path (namestring path)) - (if (probe-file path) - path - (if (search "/org/armedbear/lisp" path :test 'string=) - (let ((jarpath (format nil "jar:file:~a!~a" (namestring (sys::find-system-jar)) - (subseq path (search "/org/armedbear/lisp" path))))) - (if (probe-file jarpath) - jarpath - path)) - path))) - -#-abcl-introspect -(defimplementation find-definitions (symbol) - (ext:resolve symbol) - (let ((srcloc (source-location symbol))) - (and srcloc `((,symbol ,srcloc))))) - -#+abcl-introspect -(defimplementation find-definitions (symbol) - (when (stringp symbol) - ;; allow a string to be passed. If it is package prefixed, remove the prefix - (setq symbol (intern (string-upcase - (subseq symbol (1+ (or (position #\: symbol :from-end t) -1)))) - 'keyword))) - (let ((sources nil) - (implementation-variables nil) - (implementation-functions nil)) - (loop for package in (list-all-packages) - for sym = (find-symbol (string symbol) package) - when (and sym (equal (symbol-package sym) package)) - do - (when (sys::autoloadp symbol) - (sys::resolve symbol)) - (let ((source (or (get sym 'ext::source) (get sym 'sys::source))) - (i-var (maybe-implementation-variable sym)) - (i-fun (implementation-source-location sym))) - (when source - (setq sources (append sources (or (get sym 'ext::source) (get sym 'sys::source))))) - (when i-var - (push i-var implementation-variables)) - (when i-fun - (push i-fun implementation-functions)))) - (setq sources (remove-duplicates sources :test 'equalp)) - (append (remove-duplicates implementation-functions :test 'equalp) - (mapcar (lambda(s) (slime-location-from-source-annotation symbol s)) sources) - (remove-duplicates implementation-variables :test 'equalp)))) - -(defun slime-location-from-source-annotation (sym it) - (destructuring-bind (what path pos) it - - (let* ((isfunction - ;; all of these are (defxxx forms, which is what :function locations look for in slime - (and (consp what) (member (car what) - '(:function :generic-function :macro :class :compiler-macro - :type :constant :variable :package :structure :condition)))) - (ismethod (and (consp what) (eq (car what) :method))) - ( (cond (isfunction (list :function-name (princ-to-string (second what)))) - (ismethod (stringify-method-specs what)) - (t (list :position (1+ (or pos 0)))))) - - (path2 (if (eq path :top-level) - ;; this is bogus - figure out some way to guess which is the repl associated with :toplevel - ;; or get rid of this - "emacs-buffer:*slime-repl*" - (maybe-redirect-to-jar path)))) - (when (atom what) - (setq what (list what sym))) - (list (definition-specifier what) - (if (ext:pathname-jar-p path2) - `(:location - (:zip ,@(split-string (subseq path2 (length "jar:file:")) "!/")) - ;; pos never seems right. Use function name. - , - (:align t)) - ;; conspire with swank-compile-string to keep the - ;; buffer name in a pathname whose device is - ;; "emacs-buffer". - (if (eql 0 (search "emacs-buffer:" path2)) - `(:location - (:buffer ,(subseq path2 (load-time-value (length "emacs-buffer:")))) - , - (:align t)) - `(:location - (:file ,path2) - , - (:align t)))))))) - -#+abcl-introspect -(defimplementation list-callers (thing) - (loop for caller in (sys::callers thing) - when (typep caller 'method) - append (let ((name (mop:generic-function-name - (mop:method-generic-function caller)))) - (mapcar (lambda(s) (slime-location-from-source-annotation thing s)) - (remove `(:method ,@(sys::method-spec-list caller)) - (get - (if (consp name) (second name) name) - 'sys::source) - :key 'car :test-not 'equalp))) - when (symbolp caller) - append (mapcar (lambda(s) (slime-location-from-source-annotation caller s)) - (get caller 'sys::source)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Inspecting - -;;; BEGIN FIXME move into generalized Swank infrastructure, or add to contrib mechanism -;; this is only for hyperspec request in an inspector window -;; TODO have slime-hyperspec-lookup respect this variable too -(defvar *slime-inspector-hyperspec-in-browser* t - "If t then invoking hyperspec within the inspector browses the hyperspec in an emacs buffer, otherwise respecting the value of browse-url-browser-function") - -(defun hyperspec-do (name) - (let ((form `(let ((browse-url-browser-function - ,(if *slime-inspector-hyperspec-in-browser* - '(lambda(a v) (eww a)) - 'browse-url-browser-function))) - (slime-hyperdoc-lookup ,name)))) - (swank::eval-in-emacs form t))) -;;; END FIXME move into generalized Swank infrastructure, or add to contrib mechanism - -;;; Although by convention toString() is supposed to be a -;;; non-computationally expensive operation this isn't always the -;;; case, so make its computation a user interaction. -(defparameter *to-string-hashtable* (make-hash-table :weakness :key)) - -(defmethod emacs-inspect ((o t)) - (let* ((type (type-of o)) - (class (ignore-errors (find-class type))) - (jclass (and (typep class 'sys::built-in-class) - (jcall "getClass" o)))) - (let ((parts (sys:inspected-parts o))) - `((:label "Type: ") (:value ,(or class type)) (:Newline) - ,@(if jclass - `((:label "Java type: ") (:value ,jclass) (:newline))) - ,@(if parts - (loop :for (label . value) :in parts - :appending (list - (list :label (string-capitalize label)) - ": " - (list :value value (princ-to-string value)) '(:newline))) - (list '(:label "No inspectable parts, dumping output of CL:DESCRIBE:") - '(:newline) - (with-output-to-string (desc) (describe o desc)))))))) - -(defmethod emacs-inspect ((string string)) - (swank::lcons* - '(:label "Value: ") `(:value ,string ,(concatenate 'string "\"" string "\"")) '(:newline) - #+abcl-introspect ;; ??? This doesn't appear depend on ABCL-INTROSPECT. Why disable? - `(:action "[Edit in emacs buffer]" ,(lambda() (swank::ed-in-emacs `(:string ,string)))) - '(:newline) - (if (ignore-errors (jclass string)) - `(:line "Names java class" ,(jclass string)) - "") - #+abcl-introspect - (if (and (jss-p) - (stringp (funcall (intern "LOOKUP-CLASS-NAME" :jss) string :return-ambiguous t :muffle-warning t))) - `(:multiple - (:label "Abbreviates java class: ") - ,(let ((it (funcall (intern "LOOKUP-CLASS-NAME" :jss) string :return-ambiguous t :muffle-warning t))) - `(:value ,(jclass it))) - (:newline)) - "") - (if (ignore-errors (find-package (string-upcase string))) - `(:line "Names package" ,(find-package (string-upcase string))) - "") - (let ((symbols (loop for p in (list-all-packages) - for found = (find-symbol (string-upcase string)) - when (and found (eq (symbol-package found) p) - (or (fboundp found) - (boundp found) - (symbol-plist found) - (ignore-errors (find-class found)))) - collect found))) - (if symbols - `(:multiple (:label "Names symbols: ") - ,@(loop for s in symbols - collect - (Let ((*package* (find-package :keyword))) - `(:value ,s ,(prin1-to-string s))) collect " ") (:newline)) - "")) - (call-next-method))) - -#+#.(swank/backend:with-symbol 'java-exception 'java) -(defmethod emacs-inspect ((o java:java-exception)) - (append (call-next-method) - (list '(:newline) '(:label "Stack trace") - '(:newline) - (let ((w (jnew "java.io.StringWriter"))) - (jcall "printStackTrace" (java:java-exception-cause o) (jnew "java.io.PrintWriter" w)) - (jcall "toString" w))))) - -(defmethod emacs-inspect ((slot mop::slot-definition)) - `("Name: " - (:value ,(mop:slot-definition-name slot)) - (:newline) - "Documentation:" (:newline) - ,@(when (slot-definition-documentation slot) - `((:value ,(slot-definition-documentation slot)) (:newline))) - "Initialization:" (:newline) - (:label " Args: ") (:value ,(mop:slot-definition-initargs slot)) (:newline) - (:label " Form: ") ,(if (mop:slot-definition-initfunction slot) - `(:value ,(mop:slot-definition-initform slot)) - "#") (:newline) - (:label " Function: ") - (:value ,(mop:slot-definition-initfunction slot)) - (:newline))) - -(defmethod emacs-inspect ((f function)) - `(,@(when (function-name f) - `((:label "Name: ") - ,(princ-to-string (sys::any-function-name f)) (:newline))) - ,@(multiple-value-bind (args present) (sys::arglist f) - (when present - `((:label "Argument list: ") - ,(princ-to-string args) - (:newline)))) - #+abcl-introspect - ,@(when (documentation f t) - `("Documentation:" (:newline) - ,(documentation f t) (:newline))) - ,@(when (function-lambda-expression f) - `((:label "Lambda expression:") - (:newline) ,(princ-to-string - (function-lambda-expression f)) (:newline))) - (:label "Function java class: ") (:value ,(jcall "getClass" f)) (:newline) - #+abcl-introspect - ,@(when (jcall "isInstance" (java::jclass "org.armedbear.lisp.CompiledClosure") f) - `((:label "Closed over: ") - ,@(loop - for el in (sys::compiled-closure-context f) - collect `(:value ,el) - collect " ") - (:newline))) - #+abcl-introspect - ,@(when (sys::get-loaded-from f) - (list `(:label "Defined in: ") - `(:value ,(sys::get-loaded-from f) ,(namestring (sys::get-loaded-from f))) - '(:newline))) - ;; I think this should work in older lisps too -- alanr - ,@(let ((fields (jcall "getDeclaredFields" (jcall "getClass" f)))) - (when (plusp (length fields)) - (list* '(:label "Internal fields: ") '(:newline) - (loop for field across fields - do (jcall "setAccessible" field t) ;;; not a great idea esp. wrt. Java9 - append - (let ((value (jcall "get" field f))) - (list " " - `(:label ,(jcall "getName" field)) - ": " - `(:value ,value ,(princ-to-string value)) - '(:newline))))))) - #+abcl-introspect - ,@(when (and (function-name f) (symbolp (function-name f)) - (eq (symbol-package (function-name f)) (find-package :cl))) - (list '(:newline) (list :action "Lookup in hyperspec" - (lambda () (hyperspec-do (symbol-name (function-name f)))) - :refreshp nil) - '(:newline))))) - -(defmethod emacs-inspect ((o java:java-object)) - (if (jinstance-of-p o (jclass "java.lang.Class")) - (emacs-inspect-java-class o) - (emacs-inspect-java-object o))) - -(defvar *slime-tostring-on-demand* nil - "Set to t if you don't want to automatically show toString() for java objects and instead have inspector action to compute") - -(defun static-field? (field) - ;; (plusp (logand #"reflect.Modifier.STATIC" (jcall "getModifiers" field))) - ;; ugly replace with answer to avoid using jss - (plusp (logand 8 (jcall "getModifiers" field)))) - -(defun inspector-java-object-fields (object) - (loop - for super = (java::jobject-class object) then (jclass-superclass super) - while super - ;;; NOTE: In the next line, if I write #'(lambda.... then I - ;;; get an error compiling "Attempt to throw to the - ;;; nonexistent tag DUPLICATABLE-CODE-P.". WTF - for fields - = (sort (jcall "getDeclaredFields" super) 'string-lessp :key (lambda(x) (jcall "getName" x))) - for fromline - = nil then (list `(:label "From: ") `(:value ,super ,(jcall "getName" super)) '(:newline)) - when (and (plusp (length fields)) fromline) - append fromline - append - (loop for this across fields - for value = (jcall "get" (progn (jcall "setAccessible" this t) this) object) - for line = `(" " (:label ,(jcall "getName" this)) ": " (:value ,value) (:newline)) - if (static-field? this) - append line into statics - else append line into members - finally (return (append - (if members `((:label "Member fields: ") (:newline) ,@members)) - (if statics `((:label "Static fields: ") (:newline) ,@statics))))))) - -(defun emacs-inspect-java-object (object) - (let ((to-string (lambda () - (handler-case - (setf (gethash object *to-string-hashtable*) - (jcall "toString" object)) - (t (e) - (setf (gethash object *to-string-hashtable*) - (format nil - "Could not invoke toString(): ~A" - e)))))) - (intended-class (cdr (assoc "intendedClass" (sys::inspected-parts object) - :test 'equal)))) - `((:label "Class: ") - (:value ,(jcall "getClass" object) ,(jcall "getName" (jcall "getClass" object) )) (:newline) - ,@(if (and intended-class (not (equal intended-class (jcall "getName" (jcall "getClass" object))))) - `((:label "Intended Class: ") - (:value ,(jclass intended-class) ,intended-class) (:newline))) - ,@(if (or (gethash object *to-string-hashtable*) (not *slime-tostring-on-demand*)) - (label-value-line "toString()" (funcall to-string)) - `((:action "[compute toString()]" ,to-string) (:newline))) - ,@(inspector-java-object-fields object)))) - -(defmethod emacs-inspect ((slot mop::slot-definition)) - `("Name: " - (:value ,(mop:slot-definition-name slot)) - (:newline) - "Documentation:" (:newline) - ,@(when (slot-definition-documentation slot) - `((:value ,(slot-definition-documentation slot)) (:newline))) - (:label "Initialization:") (:newline) - (:label " Args: ") (:value ,(mop:slot-definition-initargs slot)) (:newline) - (:label " Form: ") - ,(if (mop:slot-definition-initfunction slot) - `(:value ,(mop:slot-definition-initform slot)) - "#") (:newline) - " Function: " - (:value ,(mop:slot-definition-initfunction slot)) - (:newline))) - -(defun inspector-java-fields (class) - (loop - for super - = class then (jclass-superclass super) - while super - for fields - = (jcall "getDeclaredFields" super) - for fromline - = nil then (list `(:label "From: ") `(:value ,super ,(jcall "getName" super)) '(:newline)) - when (and (plusp (length fields)) fromline) - append fromline - append - (loop for this across fields - for pre = (subseq (jcall "toString" this) - 0 - (1+ (position #\. (jcall "toString" this) :from-end t))) - collect " " - collect (list :value this pre) - collect (list :value this (jcall "getName" this) ) - collect '(:newline)))) - -(defun inspector-java-methods (class) - (loop - for super - = class then (jclass-superclass super) - while super - for methods - = (jcall "getDeclaredMethods" super) - for fromline - = nil then (list `(:label "From: ") `(:value ,super ,(jcall "getName" super)) '(:newline)) - when (and (plusp (length methods)) fromline) - append fromline - append - (loop for this across methods - for desc = (jcall "toString" this) - for paren = (position #\( desc) - for dot = (position #\. (subseq desc 0 paren) :from-end t) - for pre = (subseq desc 0 dot) - for name = (subseq desc dot paren) - for after = (subseq desc paren) - collect " " - collect (list :value this pre) - collect (list :value this name) - collect (list :value this after) - collect '(:newline)))) - -(defun emacs-inspect-java-class (class) - (let ((has-superclasses (jclass-superclass class)) - (has-interfaces (plusp (length (jclass-interfaces class)))) - (fields (inspector-java-fields class)) - (path (jcall "replaceFirst" - (jcall "replaceFirst" - (jcall "toString" (jcall "getResource" - class - (concatenate 'string - "/" (substitute #\/ #\. (jcall "getName" class)) - ".class"))) - "jar:file:" "") "!.*" ""))) - `((:label ,(format nil "Java Class: ~a" (jcall "getName" class) )) - (:newline) - ,@(when path (list `(:label ,"Loaded from: ") - `(:value ,path) - " " - `(:action "[open in emacs buffer]" ,(lambda() (swank::ed-in-emacs `( ,path)))) '(:newline))) - ,@(if has-superclasses - (list* '(:label "Superclasses: ") (butlast (loop for super = (jclass-superclass class) then (jclass-superclass super) - while super collect (list :value super (jcall "getName" super)) collect ", ")))) - ,@(if has-interfaces - (list* '(:newline) '(:label "Implements Interfaces: ") - (butlast (loop for i across (jclass-interfaces class) collect (list :value i (jcall "getName" i)) collect ", ")))) - (:newline) (:label "Methods:") (:newline) - ,@(inspector-java-methods class) - ,@(if fields - (list* - '(:newline) '(:label "Fields:") '(:newline) - fields))))) - -(defmethod emacs-inspect ((object sys::structure-object)) - (let ((structure-def (get (type-of object) 'system::structure-definition ))) - `((:label "Type: ") (:value ,(type-of object)) (:newline) - (:label "Class: ") (:value ,(class-of object)) (:newline) - ,@(inspector-structure-slot-names-and-values object)))) - -(defun inspector-structure-slot-names-and-values (structure) - (let ((structure-def (get (type-of structure) 'system::structure-definition))) - `((:label "Slots: ") (:newline) - ,@(loop for slotdef in (sys::dd-slots structure-def) - for name = (sys::dsd-name slotdef) - for reader = (sys::dsd-reader slotdef) - for value = (eval `(,reader ,structure)) - append - `(" " (:label ,(string-downcase (string name))) ": " (:value ,value) (:newline)))))) - -(defmethod emacs-inspect ((object sys::structure-class)) - (let* ((name (jss::get-java-field object "name" t)) - (def (get name 'system::structure-definition))) - `((:label "Class: ") (:value ,object) (:newline) - (:label "Raw defstruct definition: ") (:value ,def ,(let ((*print-array* nil)) (prin1-to-string def))) (:newline) - ,@(parts-for-structure-def name) - ;; copy-paste from swank fancy inspector - ,@(when (swank-mop:specializer-direct-methods object) - `((:label "It is used as a direct specializer in the following methods:") - (:newline) - ,@(loop - for method in (specializer-direct-methods object) - for method-spec = (swank::method-for-inspect-value method) - collect " " - collect `(:value ,method ,(string-downcase (string (car method-spec)))) - collect `(:value ,method ,(format nil " (~{~a~^ ~})" (cdr method-spec))) - append (let ((method method)) - `(" " (:action "[remove]" - ,(lambda () (remove-method (swank-mop::method-generic-function method) method))))) - collect '(:newline) - if (documentation method t) - collect " Documentation: " and - collect (swank::abbrev-doc (documentation method t)) and - collect '(:newline))))))) - -(defun parts-for-structure-def-slot (def) - `((:label ,(string-downcase (sys::dsd-name def))) " reader: " (:value ,(sys::dsd-reader def) ,(string-downcase (string (sys::dsdreader def)))) - ", index: " (:value ,(sys::dsd-index def)) - ,@(if (sys::dsd-initform def) - `(", initform: " (:value ,(sys::dsd-initform def)))) - ,@(if (sys::dsd-read-only def) - '(", Read only")))) - -(defun parts-for-structure-def (name) - (let ((structure-def (get name 'system::structure-definition ))) - (append - (loop for accessor in '(dd-name dd-conc-name dd-default-constructor dd-constructors dd-copier dd-include dd-type - dd-named dd-initial-offset dd-predicate dd-print-function dd-print-object - dd-inherited-accessors) - for key = (intern (subseq (string accessor) 3) 'keyword) - for fsym = (find-symbol (string accessor) 'system) - for value = (eval `(,fsym ,structure-def)) - append `((:label ,(string-capitalize (string key))) ": " (:value ,value) (:newline))) - (let* ((direct (sys::dd-direct-slots structure-def) ) - (all (sys::dd-slots structure-def)) - (inherited (set-difference all direct))) - `((:label "Direct slots: ") (:newline) - ,@(loop for slotdef in direct - append `(" " ,@(parts-for-structure-def-slot slotdef) - (:newline))) - ,@(if inherited - (append '((:label "Inherited slots: ") (:newline)) - (loop for slotdef in inherited - append `(" " (:label ,(string-downcase (string (sys::dsd-name slotdef)))) - (:value ,slotdef "slot definition") - (:newline)))))))))) - -;;;; Multithreading - -(defimplementation spawn (fn &key name) - (threads:make-thread (lambda () (funcall fn)) :name name)) - -(defvar *thread-plists* (make-hash-table) ; should be a weak table - "A hashtable mapping threads to a plist.") - -(defvar *thread-id-counter* 0) - -(defimplementation thread-id (thread) - (threads:synchronized-on *thread-plists* - (or (getf (gethash thread *thread-plists*) 'id) - (setf (getf (gethash thread *thread-plists*) 'id) - (incf *thread-id-counter*))))) - -(defimplementation find-thread (id) - (find id (all-threads) - :key (lambda (thread) - (getf (gethash thread *thread-plists*) 'id)))) - -(defimplementation thread-name (thread) - (threads:thread-name thread)) - -(defimplementation thread-status (thread) - (format nil "Thread is ~:[dead~;alive~]" (threads:thread-alive-p thread))) - -(defimplementation make-lock (&key name) - (declare (ignore name)) - (threads:make-thread-lock)) - -(defimplementation call-with-lock-held (lock function) - (threads:with-thread-lock (lock) (funcall function))) - -(defimplementation current-thread () - (threads:current-thread)) - -(defimplementation all-threads () - (copy-list (threads:mapcar-threads #'identity))) - -(defimplementation thread-alive-p (thread) - (member thread (all-threads))) - -(defimplementation interrupt-thread (thread fn) - (threads:interrupt-thread thread fn)) - -(defimplementation kill-thread (thread) - (threads:destroy-thread thread)) - -(defstruct mailbox - (queue '())) - -(defun mailbox (thread) - "Return THREAD's mailbox." - (threads:synchronized-on *thread-plists* - (or (getf (gethash thread *thread-plists*) 'mailbox) - (setf (getf (gethash thread *thread-plists*) 'mailbox) - (make-mailbox))))) - -(defimplementation send (thread message) - (let ((mbox (mailbox thread))) - (threads:synchronized-on mbox - (setf (mailbox-queue mbox) - (nconc (mailbox-queue mbox) (list message))) - (threads:object-notify-all mbox)))) - -(defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread)))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (threads:synchronized-on mbox - (let* ((q (mailbox-queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox-queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail))) - (when (eq timeout t) (return (values nil t))) - (threads:object-wait mbox 0.3)))))) - -(defimplementation quit-lisp () - (ext:exit)) - -;; FIXME probably should be promoted to other lisps but I don't want to mess with them -(defvar *inspector-print-case* *print-case*) - -(defimplementation call-with-syntax-hooks (fn) - (let ((*print-case* *inspector-print-case*)) - (funcall fn))) - -;;; -#+#.(swank/backend:with-symbol 'package-local-nicknames 'ext) -(defimplementation package-local-nicknames (package) - (ext:package-local-nicknames package)) - -;; all the defimplentations aren't compiled. Compile them. Set their -;; function name to be the same as the implementation name so -;; meta-. works. - -#+abcl-introspect -(eval-when (:load-toplevel :execute) - (loop for s in swank-backend::*interface-functions* - for impl = (get s 'swank-backend::implementation) - do (when (and impl (not (compiled-function-p impl))) - (let ((name (gensym))) - (compile name impl) - (let ((compiled (symbol-function name))) - (system::%set-lambda-name compiled (second (sys::lambda-name impl))) - (setf (get s 'swank-backend::implementation) compiled)))))) - diff --git a/elpa/slime-20200414.1444/swank/allegro.lisp b/elpa/slime-20200414.1444/swank/allegro.lisp deleted file mode 100644 index 942764cd..00000000 --- a/elpa/slime-20200414.1444/swank/allegro.lisp +++ /dev/null @@ -1,1086 +0,0 @@ -;;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;;* "; -*- -;;; -;;; swank-allegro.lisp --- Allegro CL specific code for SLIME. -;;; -;;; Created 2003 -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(defpackage swank/allegro - (:use cl swank/backend)) - -(in-package swank/allegro) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require :sock) - (require :process) - #+(version>= 8 2) - (require 'lldb)) - -(defimplementation gray-package-name () - '#:excl) - -;;; swank-mop - -(import-swank-mop-symbols :clos '(:slot-definition-documentation)) - -(defun swank-mop:slot-definition-documentation (slot) - (documentation slot t)) - - -;;;; UTF8 - -(define-symbol-macro utf8-ef - (load-time-value - (excl:crlf-base-ef (excl:find-external-format :utf-8)) - t)) - -(defimplementation string-to-utf8 (s) - (excl:string-to-octets s :external-format utf8-ef - :null-terminate nil)) - -(defimplementation utf8-to-string (u) - (excl:octets-to-string u :external-format utf8-ef)) - - -;;;; TCP Server - -(defimplementation preferred-communication-style () - :spawn) - -(defimplementation create-socket (host port &key backlog) - (socket:make-socket :connect :passive :local-port port - :local-host host :reuse-address t - :backlog (or backlog 5))) - -(defimplementation local-port (socket) - (socket:local-port socket)) - -(defimplementation close-socket (socket) - (close socket)) - -(defimplementation accept-connection (socket &key external-format buffering - timeout) - (declare (ignore buffering timeout)) - (let ((s (socket:accept-connection socket :wait t))) - (when external-format - (setf (stream-external-format s) external-format)) - s)) - -(defimplementation socket-fd (stream) - (excl::stream-input-handle stream)) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix") - (:euc-jp "euc-jp" "euc-jp-unix") - (:us-ascii "us-ascii" "us-ascii-unix") - (:emacs-mule "emacs-mule" "emacs-mule-unix"))) - -(defimplementation find-external-format (coding-system) - (let ((e (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - (and e (excl:crlf-base-ef - (excl:find-external-format (car e) - :try-variant t))))) - -;;;; Unix signals - -(defimplementation getpid () - (excl::getpid)) - -(defimplementation lisp-implementation-type-name () - "allegro") - -(defimplementation set-default-directory (directory) - (let* ((dir (namestring (truename (merge-pathnames directory))))) - (setf *default-pathname-defaults* (pathname (excl:chdir dir))) - dir)) - -(defimplementation default-directory () - (namestring (excl:current-directory))) - -;;;; Misc - -(defimplementation arglist (symbol) - (handler-case (excl:arglist symbol) - (simple-error () :not-available))) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - #+(version>= 8 0) - (excl::walk-form form) - #-(version>= 8 0) - (excl::walk form)) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind &optional (sym symbol)) - (or (documentation sym kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (maybe-push - :function (if (fboundp symbol) - (doc 'function))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:class - (describe (find-class symbol))))) - -(defimplementation type-specifier-p (symbol) - (or (ignore-errors - (subtypep nil symbol)) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(defimplementation function-name (f) - (check-type f function) - (cross-reference::object-to-function-name f)) - -;;;; Debugger - -(defvar *sldb-topframe*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let ((*sldb-topframe* (find-topframe)) - (excl::*break-hook* nil)) - (funcall debugger-loop-fn))) - -(defimplementation sldb-break-at-start (fname) - ;; :print-before is kind of mis-used but we just want to stuff our - ;; break form somewhere. This does not work for setf, :before and - ;; :after methods, which need special syntax in the trace call, see - ;; ACL's doc/debugging.htm chapter 10. - (eval `(trace (,fname - :print-before - ((break "Function start breakpoint of ~A" ',fname))))) - `(:ok ,(format nil "Set breakpoint at start of ~S" fname))) - -(defun find-topframe () - (let ((magic-symbol (intern (symbol-name :swank-debugger-hook) - (find-package :swank))) - (top-frame (excl::int-newest-frame (excl::current-thread)))) - (loop for frame = top-frame then (next-frame frame) - for i from 0 - while (and frame (< i 30)) - when (eq (debugger:frame-name frame) magic-symbol) - return (next-frame frame) - finally (return top-frame)))) - -(defun next-frame (frame) - (let ((next (excl::int-next-older-frame frame))) - (cond ((not next) nil) - ((debugger:frame-visible-p next) next) - (t (next-frame next))))) - -(defun nth-frame (index) - (do ((frame *sldb-topframe* (next-frame frame)) - (i index (1- i))) - ((zerop i) frame))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum))) - (loop for f = (nth-frame start) then (next-frame f) - for i from start below end - while f collect f))) - -(defimplementation print-frame (frame stream) - (debugger:output-frame stream frame :moderate)) - -(defimplementation frame-locals (index) - (let ((frame (nth-frame index))) - (loop for i from 0 below (debugger:frame-number-vars frame) - collect (list :name (debugger:frame-var-name frame i) - :id 0 - :value (debugger:frame-var-value frame i))))) - -(defimplementation frame-var-value (frame var) - (let ((frame (nth-frame frame))) - (debugger:frame-var-value frame var))) - -(defimplementation disassemble-frame (index) - (let ((frame (nth-frame index))) - (multiple-value-bind (x fun xx xxx pc) (debugger::dyn-fd-analyze frame) - (format t "pc: ~d (~s ~s ~s)~%fun: ~a~%" pc x xx xxx fun) - (disassemble (debugger:frame-function frame))))) - -(defimplementation frame-source-location (index) - (let* ((frame (nth-frame index))) - (multiple-value-bind (x fun xx xxx pc) (debugger::dyn-fd-analyze frame) - (declare (ignore x xx xxx)) - (cond ((and pc - #+(version>= 8 2) - (pc-source-location fun pc) - #-(version>= 8 2) - (function-source-location fun))) - (t ; frames for unbound functions etc end up here - (cadr (car (fspec-definition-locations - (car (debugger:frame-expression frame)))))))))) - -(defun function-source-location (fun) - (cadr (car (fspec-definition-locations - (xref::object-to-function-name fun))))) - -#+(version>= 8 2) -(defun pc-source-location (fun pc) - (let* ((debug-info (excl::function-source-debug-info fun))) - (cond ((not debug-info) - (function-source-location fun)) - (t - (let* ((code-loc (find-if (lambda (c) - (<= (- pc (sys::natural-width)) - (let ((x (excl::ldb-code-pc c))) - (or x -1)) - pc)) - debug-info))) - (cond ((not code-loc) - (ldb-code-to-src-loc (aref debug-info 0))) - (t - (ldb-code-to-src-loc code-loc)))))))) - -#+(version>= 8 2) -(defun ldb-code-to-src-loc (code) - (declare (optimize debug)) - (let* ((func (excl::ldb-code-func code)) - (debug-info (excl::function-source-debug-info func)) - (start (loop for i from (excl::ldb-code-index code) downto 0 - for bpt = (aref debug-info i) - for start = (excl::ldb-code-start-char bpt) - when start - return (if (listp start) - (first start) - start))) - (src-file (excl:source-file func))) - (cond (start - (buffer-or-file-location src-file start)) - (func - (let* ((debug-info (excl::function-source-debug-info func)) - (whole (aref debug-info 0)) - (paths (source-paths-of (excl::ldb-code-source whole) - (excl::ldb-code-source code))) - (path (if paths (longest-common-prefix paths) '())) - (start 0)) - (buffer-or-file - src-file - (lambda (file) - (make-location `(:file ,file) - `(:source-path (0 . ,path) ,start))) - (lambda (buffer bstart) - (make-location `(:buffer ,buffer) - `(:source-path (0 . ,path) - ,(+ bstart start))))))) - (t - nil)))) - -(defun longest-common-prefix (sequences) - (assert sequences) - (flet ((common-prefix (s1 s2) - (let ((diff-pos (mismatch s1 s2))) - (if diff-pos (subseq s1 0 diff-pos) s1)))) - (reduce #'common-prefix sequences))) - -(defun source-paths-of (whole part) - (let ((result '())) - (labels ((walk (form path) - (cond ((eq form part) - (push (reverse path) result)) - ((consp form) - (loop for i from 0 while (consp form) do - (walk (pop form) (cons i path))))))) - (walk whole '()) - (reverse result)))) - -(defimplementation eval-in-frame (form frame-number) - (let ((frame (nth-frame frame-number))) - ;; let-bind lexical variables - (let ((vars (loop for i below (debugger:frame-number-vars frame) - for name = (debugger:frame-var-name frame i) - if (typep name '(and symbol (not null) (not keyword))) - collect `(,name ',(debugger:frame-var-value frame i))))) - (debugger:eval-form-in-context - `(let* ,vars ,form) - (debugger:environment-of-frame frame))))) - -(defimplementation frame-package (frame-number) - (let* ((frame (nth-frame frame-number)) - (exp (debugger:frame-expression frame))) - (typecase exp - ((cons symbol) (symbol-package (car exp))) - ((cons (cons (eql :internal) (cons symbol))) - (symbol-package (cadar exp)))))) - -(defimplementation return-from-frame (frame-number form) - (let ((frame (nth-frame frame-number))) - (multiple-value-call #'debugger:frame-return - frame (debugger:eval-form-in-context - form - (debugger:environment-of-frame frame))))) - -(defimplementation frame-restartable-p (frame) - (handler-case (debugger:frame-retryable-p frame) - (serious-condition (c) - (funcall (read-from-string "swank::background-message") - "~a ~a" frame (princ-to-string c)) - nil))) - -(defimplementation restart-frame (frame-number) - (let ((frame (nth-frame frame-number))) - (cond ((debugger:frame-retryable-p frame) - (apply #'debugger:frame-retry frame (debugger:frame-function frame) - (cdr (debugger:frame-expression frame)))) - (t "Frame is not retryable")))) - -;;;; Compiler hooks - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) -(defvar *buffer-string*) -(defvar *compile-filename* nil) - -(defun compiler-note-p (object) - (member (type-of object) '(excl::compiler-note compiler::compiler-note))) - -(defun redefinition-p (condition) - (and (typep condition 'style-warning) - (every #'char-equal "redefin" (princ-to-string condition)))) - -(defun compiler-undefined-functions-called-warning-p (object) - (typep object 'excl:compiler-undefined-functions-called-warning)) - -(deftype compiler-note () - `(satisfies compiler-note-p)) - -(deftype redefinition () - `(satisfies redefinition-p)) - -(defun signal-compiler-condition (&rest args) - (apply #'signal 'compiler-condition args)) - -(defun handle-compiler-warning (condition) - (declare (optimize (debug 3) (speed 0) (space 0))) - (cond ((and #-(version>= 10 0) (not *buffer-name*) - (compiler-undefined-functions-called-warning-p condition)) - (handle-undefined-functions-warning condition)) - ((and (typep condition 'excl::compiler-note) - (let ((format (slot-value condition 'excl::format-control))) - (and (search "Closure" format) - (search "will be stack allocated" format)))) - ;; Ignore "Closure will be stack allocated" notes. - ;; That occurs often but is usually uninteresting. - ) - (t - (signal-compiler-condition - :original-condition condition - :severity (etypecase condition - (redefinition :redefinition) - (style-warning :style-warning) - (warning :warning) - (compiler-note :note) - (reader-error :read-error) - (error :error)) - :message (format nil "~A" condition) - :location (compiler-warning-location condition))))) - -(defun condition-pathname-and-position (condition) - (let* ((context #+(version>= 10 0) - (getf (slot-value condition 'excl::plist) - :source-context)) - (location-available (and context - (excl::source-context-start-char context)))) - (cond (location-available - (values (excl::source-context-pathname context) - (when-let (start-char (excl::source-context-start-char context)) - (let ((position (if (listp start-char) ; HACK - (first start-char) - start-char))) - (if (typep condition 'excl::compiler-free-reference-warning) - position - (1+ position)))))) - ((typep condition 'reader-error) - (let ((pos (car (last (slot-value condition 'excl::format-arguments)))) - (file (pathname (stream-error-stream condition)))) - (when (integerp pos) - (values file pos)))) - (t - (let ((loc (getf (slot-value condition 'excl::plist) :loc))) - (when loc - (destructuring-bind (file . pos) loc - (let ((start (if (consp pos) ; 8.2 and newer - #+(version>= 10 1) - (if (typep condition 'excl::compiler-inconsistent-name-usage-warning) - (second pos) - (first pos)) - #-(version>= 10 1) - (first pos) - pos))) - (values file start))))))))) - -(defun compiler-warning-location (condition) - (multiple-value-bind (pathname position) - (condition-pathname-and-position condition) - (cond (*buffer-name* - (make-location - (list :buffer *buffer-name*) - (if position - (list :offset 1 (1- position)) - (list :offset *buffer-start-position* 0)))) - (pathname - (make-location - (list :file (namestring (truename pathname))) - #+(version>= 10 1) - (list :offset 1 position) - #-(version>= 10 1) - (list :position (1+ position)))) - (t - (make-error-location "No error location available."))))) - -;; TODO: report it as a bug to Franz that the condition's plist -;; slot contains (:loc nil). -(defun handle-undefined-functions-warning (condition) - (let ((fargs (slot-value condition 'excl::format-arguments))) - (loop for (fname . locs) in (car fargs) do - (dolist (loc locs) - (multiple-value-bind (pos file) (ecase (length loc) - (2 (values-list loc)) - (3 (destructuring-bind - (start end file) loc - (declare (ignore end)) - (values start file)))) - (signal-compiler-condition - :original-condition condition - :severity :warning - :message (format nil "Undefined function referenced: ~S" - fname) - :location (make-location (list :file file) - #+(version>= 9 0) - (list :offset 1 pos) - #-(version>= 9 0) - (list :position (1+ pos))))))))) - -(defimplementation call-with-compilation-hooks (function) - (handler-bind ((warning #'handle-compiler-warning) - (compiler-note #'handle-compiler-warning) - (reader-error #'handle-compiler-warning)) - (funcall function))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (handler-case - (with-compilation-hooks () - (let ((*buffer-name* nil) - (*compile-filename* input-file) - #+(version>= 8 2) - (compiler:save-source-level-debug-info-switch t) - (excl:*load-source-file-info* t) - #+(version>= 8 2) - (excl:*load-source-debug-info* t)) - (compile-file *compile-filename* - :output-file output-file - :load-after-compile load-p - :external-format external-format))) - (reader-error () (values nil nil t)))) - -(defun call-with-temp-file (fn) - (let ((tmpname (system:make-temp-file-name))) - (unwind-protect - (with-open-file (file tmpname :direction :output :if-exists :error) - (funcall fn file tmpname)) - (delete-file tmpname)))) - -(defvar *temp-file-map* (make-hash-table :test #'equal) - "A mapping from tempfile names to Emacs buffer names.") - -(defun write-tracking-preamble (stream file file-offset) - "Instrument the top of the temporary file to be compiled. - -The header tells allegro that any definitions compiled in the temp -file should be found in FILE exactly at FILE-OFFSET. To get Allegro -to do this, this factors in the length of the inserted header itself." - (with-standard-io-syntax - (let* ((*package* (find-package :keyword)) - (source-pathname-form - `(cl:eval-when (:compile-toplevel :load-toplevel :execute) - (cl:setq excl::*source-pathname* - (pathname ,(sys::frob-source-file file))))) - (source-pathname-string (write-to-string source-pathname-form)) - (position-form-length-bound 160) ; should be enough for everyone - (header-length (+ (length source-pathname-string) - position-form-length-bound)) - (position-form - `(cl:eval-when (:compile-toplevel :load-toplevel :execute) - (cl:setq excl::*partial-source-file-p* ,(- file-offset - header-length - 1 ; for the newline - )))) - (position-form-string (write-to-string position-form)) - (padding-string (make-string (- position-form-length-bound - (length position-form-string)) - :initial-element #\;))) - (write-string source-pathname-string stream) - (write-string position-form-string stream) - (write-string padding-string stream) - (write-char #\newline stream)))) - -(defun compile-from-temp-file (string buffer offset file) - (call-with-temp-file - (lambda (stream filename) - (when (and file offset (probe-file file)) - (write-tracking-preamble stream file offset)) - (write-string string stream) - (finish-output stream) - (multiple-value-bind (binary-filename warnings? failure?) - (let ((sys:*source-file-types* '(nil)) ; suppress .lisp extension - #+(version>= 8 2) - (compiler:save-source-level-debug-info-switch t) - (excl:*redefinition-warnings* nil)) - (compile-file filename)) - (declare (ignore warnings?)) - (when binary-filename - (let ((excl:*load-source-file-info* t) - #+(version>= 8 2) - (excl:*load-source-debug-info* t)) - excl::*source-pathname* - (load binary-filename)) - (when (and buffer offset (or (not file) - (not (probe-file file)))) - (setf (gethash (pathname stream) *temp-file-map*) - (list buffer offset))) - (delete-file binary-filename)) - (not failure?))))) - -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore line column policy)) - (handler-case - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-string* string)) - (compile-from-temp-file string buffer position filename))) - (reader-error () nil))) - -;;;; Definition Finding - -(defun buffer-or-file (file file-fun buffer-fun) - (let* ((probe (gethash file *temp-file-map*))) - (cond (probe - (destructuring-bind (buffer start) probe - (funcall buffer-fun buffer start))) - (t (funcall file-fun (namestring (truename file))))))) - -(defun buffer-or-file-location (file offset) - (buffer-or-file file - (lambda (filename) - (make-location `(:file ,filename) - `(:position ,(1+ offset)))) - (lambda (buffer start) - (make-location `(:buffer ,buffer) - `(:offset ,start ,offset))))) - -(defun fspec-primary-name (fspec) - (etypecase fspec - (symbol fspec) - (list (fspec-primary-name (second fspec))))) - -(defun find-definition-in-file (fspec type file top-level) - (let* ((part - (or (scm::find-definition-in-definition-group - fspec type (scm:section-file :file file) - :top-level top-level) - (scm::find-definition-in-definition-group - (fspec-primary-name fspec) - type (scm:section-file :file file) - :top-level top-level))) - (start (and part - (scm::source-part-start part))) - (pos (if start - (list :offset 1 start) - (list :function-name (string (fspec-primary-name fspec)))))) - (make-location (list :file (namestring (truename file))) - pos))) - -(defun find-fspec-location (fspec type file top-level) - (handler-case - (etypecase file - (pathname - (let ((probe (gethash file *temp-file-map*))) - (cond (probe - (destructuring-bind (buffer offset) probe - (make-location `(:buffer ,buffer) - `(:offset ,offset 0)))) - (t - (find-definition-in-file fspec type file top-level))))) - ((member :top-level) - (make-error-location "Defined at toplevel: ~A" - (fspec->string fspec)))) - (error (e) - (make-error-location "Error: ~A" e)))) - -(defun fspec->string (fspec) - (typecase fspec - (symbol (let ((*package* (find-package :keyword))) - (prin1-to-string fspec))) - (list (format nil "(~A ~A)" - (prin1-to-string (first fspec)) - (let ((*package* (find-package :keyword))) - (prin1-to-string (second fspec))))) - (t (princ-to-string fspec)))) - -(defun fspec-definition-locations (fspec) - (cond - ((and (listp fspec) (eq (car fspec) :internal)) - (destructuring-bind (_internal next _n) fspec - (declare (ignore _internal _n)) - (fspec-definition-locations next))) - (t - (let ((defs (excl::find-source-file fspec))) - (when (and (null defs) - (listp fspec) - (string= (car fspec) '#:method)) - ;; If methods are defined in a defgeneric form, the source location is - ;; recorded for the gf but not for the methods. Therefore fall back to - ;; the gf as the likely place of definition. - (setq defs (excl::find-source-file (second fspec)))) - (if (null defs) - (list - (list fspec - (make-error-location "Unknown source location for ~A" - (fspec->string fspec)))) - (loop for (fspec type file top-level) in defs collect - (list (list type fspec) - (find-fspec-location fspec type file top-level)))))))) - -(defimplementation find-definitions (symbol) - (fspec-definition-locations symbol)) - -(defimplementation find-source-location (obj) - (first (rest (first (fspec-definition-locations obj))))) - -;;;; XREF - -(defmacro defxref (name relation name1 name2) - `(defimplementation ,name (x) - (xref-result (xref:get-relation ,relation ,name1 ,name2)))) - -(defxref who-calls :calls :wild x) -(defxref calls-who :calls x :wild) -(defxref who-references :uses :wild x) -(defxref who-binds :binds :wild x) -(defxref who-macroexpands :macro-calls :wild x) -(defxref who-sets :sets :wild x) - -(defun xref-result (fspecs) - (loop for fspec in fspecs - append (fspec-definition-locations fspec))) - -;; list-callers implemented by groveling through all fbound symbols. -;; Only symbols are considered. Functions in the constant pool are -;; searched recursively. Closure environments are ignored at the -;; moment (constants in methods are therefore not found). - -(defun map-function-constants (function fn depth) - "Call FN with the elements of FUNCTION's constant pool." - (do ((i 0 (1+ i)) - (max (excl::function-constant-count function))) - ((= i max)) - (let ((c (excl::function-constant function i))) - (cond ((and (functionp c) - (not (eq c function)) - (plusp depth)) - (map-function-constants c fn (1- depth))) - (t - (funcall fn c)))))) - -(defun in-constants-p (fun symbol) - (map-function-constants fun - (lambda (c) - (when (eq c symbol) - (return-from in-constants-p t))) - 3)) - -(defun function-callers (name) - (let ((callers '())) - (do-all-symbols (sym) - (when (fboundp sym) - (let ((fn (fdefinition sym))) - (when (in-constants-p fn name) - (push sym callers))))) - callers)) - -(defimplementation list-callers (name) - (xref-result (function-callers name))) - -(defimplementation list-callees (name) - (let ((result '())) - (map-function-constants (fdefinition name) - (lambda (c) - (when (fboundp c) - (push c result))) - 2) - (xref-result result))) - -;;;; Profiling - -;; Per-function profiling based on description in -;; http://www.franz.com/support/documentation/8.0/\ -;; doc/runtime-analyzer.htm#data-collection-control-2 - -(defvar *profiled-functions* ()) -(defvar *profile-depth* 0) - -(defmacro with-redirected-y-or-n-p (&body body) - ;; If the profiler is restarted when the data from the previous - ;; session is not reported yet, the user is warned via Y-OR-N-P. - ;; As the CL:Y-OR-N-P question is (for some reason) not directly - ;; sent to the Slime user, the function CL:Y-OR-N-P is temporarily - ;; overruled. - `(let* ((pkg (find-package :common-lisp)) - (saved-pdl (excl::package-definition-lock pkg)) - (saved-ynp (symbol-function 'cl:y-or-n-p))) - (setf (excl::package-definition-lock pkg) nil - (symbol-function 'cl:y-or-n-p) - (symbol-function (read-from-string "swank:y-or-n-p-in-emacs"))) - (unwind-protect - (progn ,@body) - (setf (symbol-function 'cl:y-or-n-p) saved-ynp - (excl::package-definition-lock pkg) saved-pdl)))) - -(defun start-acl-profiler () - (with-redirected-y-or-n-p - (prof:start-profiler :type :time :count t - :start-sampling-p nil :verbose nil))) -(defun acl-profiler-active-p () - (not (eq (prof:profiler-status :verbose nil) :inactive))) - -(defun stop-acl-profiler () - (prof:stop-profiler :verbose nil)) - -(excl:def-fwrapper profile-fwrapper (&rest args) - ;; Ensures sampling is done during the execution of the function, - ;; taking into account recursion. - (declare (ignore args)) - (cond ((zerop *profile-depth*) - (let ((*profile-depth* (1+ *profile-depth*))) - (prof:start-sampling) - (unwind-protect (excl:call-next-fwrapper) - (prof:stop-sampling)))) - (t - (excl:call-next-fwrapper)))) - -(defimplementation profile (fname) - (unless (acl-profiler-active-p) - (start-acl-profiler)) - (excl:fwrap fname 'profile-fwrapper 'profile-fwrapper) - (push fname *profiled-functions*)) - -(defimplementation profiled-functions () - *profiled-functions*) - -(defimplementation unprofile (fname) - (excl:funwrap fname 'profile-fwrapper) - (setq *profiled-functions* (remove fname *profiled-functions*))) - -(defimplementation profile-report () - (prof:show-flat-profile :verbose nil) - (when *profiled-functions* - (start-acl-profiler))) - -(defimplementation profile-reset () - (when (acl-profiler-active-p) - (stop-acl-profiler) - (start-acl-profiler)) - "Reset profiling counters.") - -;;;; Inspecting - -(excl:without-redefinition-warnings -(defmethod emacs-inspect ((o t)) - (allegro-inspect o))) - -(defmethod emacs-inspect ((o function)) - (allegro-inspect o)) - -(defmethod emacs-inspect ((o standard-object)) - (allegro-inspect o)) - -(defun allegro-inspect (o) - (loop for (d dd) on (inspect::inspect-ctl o) - append (frob-allegro-field-def o d) - until (eq d dd))) - -(defun frob-allegro-field-def (object def) - (with-struct (inspect::field-def- name type access) def - (ecase type - ((:unsigned-word :unsigned-byte :unsigned-natural - :unsigned-long :unsigned-half-long - :unsigned-3byte :unsigned-long32) - (label-value-line name (inspect::component-ref-v object access type))) - ((:lisp :value :func) - (label-value-line name (inspect::component-ref object access))) - (:indirect - (destructuring-bind (prefix count ref set) access - (declare (ignore set prefix)) - (loop for i below (funcall count object) - append (label-value-line (format nil "~A-~D" name i) - (funcall ref object i)))))))) - -;;;; Multithreading - -(defimplementation initialize-multiprocessing (continuation) - (mp:start-scheduler) - (funcall continuation)) - -(defimplementation spawn (fn &key name) - (mp:process-run-function name fn)) - -(defvar *id-lock* (mp:make-process-lock :name "id lock")) -(defvar *thread-id-counter* 0) - -(defimplementation thread-id (thread) - (mp:with-process-lock (*id-lock*) - (or (getf (mp:process-property-list thread) 'id) - (setf (getf (mp:process-property-list thread) 'id) - (incf *thread-id-counter*))))) - -(defimplementation find-thread (id) - (find id mp:*all-processes* - :key (lambda (p) (getf (mp:process-property-list p) 'id)))) - -(defimplementation thread-name (thread) - (mp:process-name thread)) - -(defimplementation thread-status (thread) - (princ-to-string (mp:process-whostate thread))) - -(defimplementation thread-attributes (thread) - (list :priority (mp:process-priority thread) - :times-resumed (mp:process-times-resumed thread))) - -(defimplementation make-lock (&key name) - (mp:make-process-lock :name name)) - -(defimplementation call-with-lock-held (lock function) - (mp:with-process-lock (lock) (funcall function))) - -(defimplementation current-thread () - mp:*current-process*) - -(defimplementation all-threads () - (copy-list mp:*all-processes*)) - -(defimplementation interrupt-thread (thread fn) - (mp:process-interrupt thread fn)) - -(defimplementation kill-thread (thread) - (mp:process-kill thread)) - -(defvar *mailbox-lock* (mp:make-process-lock :name "mailbox lock")) - -(defstruct (mailbox (:conc-name mailbox.)) - (lock (mp:make-process-lock :name "process mailbox")) - (queue '() :type list) - (gate (mp:make-gate nil))) - -(defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-process-lock (*mailbox-lock*) - (or (getf (mp:process-property-list thread) 'mailbox) - (setf (getf (mp:process-property-list thread) 'mailbox) - (make-mailbox))))) - -(defimplementation send (thread message) - (let* ((mbox (mailbox thread))) - (mp:with-process-lock ((mailbox.lock mbox)) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (mp:open-gate (mailbox.gate mbox))))) - -(defimplementation wake-thread (thread) - (let* ((mbox (mailbox thread))) - (mp:open-gate (mailbox.gate mbox)))) - -(defimplementation receive-if (test &optional timeout) - (let ((mbox (mailbox mp:*current-process*))) - (flet ((open-mailbox () - ;; this opens the mailbox and returns if has the message - ;; we are expecting. But first, check for interrupts. - (check-slime-interrupts) - (mp:with-process-lock ((mailbox.lock mbox)) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return-from receive-if (car tail))) - ;; ...if it doesn't, we close the gate (even if it - ;; was already closed) - (mp:close-gate (mailbox.gate mbox)))))) - (cond (timeout - ;; open the mailbox and return asap - (open-mailbox) - (return-from receive-if (values nil t))) - (t - ;; wait until gate open, then open mailbox. If there's - ;; no message there, repeat forever. - (loop - (mp:process-wait - "receive-if (waiting on gate)" - #'mp:gate-open-p (mailbox.gate mbox)) - (open-mailbox))))))) - -(let ((alist '()) - (lock (mp:make-process-lock :name "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (mp:with-process-lock (lock) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (mp:process - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (mp:with-process-lock (lock) - (cdr (assoc name alist))))) - -(defimplementation set-default-initial-binding (var form) - (push (cons var form) - #+(version>= 9 0) - excl:*required-thread-bindings* - #-(version>= 9 0) - excl::required-thread-bindings)) - -(defimplementation quit-lisp () - (excl:exit 0 :quiet t)) - - -;;Trace implementations -;;In Allegro 7.0, we have: -;; (trace ) -;; (trace ((method ? (+)))) -;; (trace ((labels ))) -;; (trace ((labels (method (+)) ))) -;; can be a normal name or a (setf name) - -(defimplementation toggle-trace (spec) - (ecase (car spec) - ((setf) - (toggle-trace-aux spec)) - (:defgeneric (toggle-trace-generic-function-methods (second spec))) - ((setf :defmethod :labels :flet) - (toggle-trace-aux (process-fspec-for-allegro spec))) - (:call - (destructuring-bind (caller callee) (cdr spec) - (toggle-trace-aux callee - :inside (list (process-fspec-for-allegro caller))))))) - -(defun tracedp (fspec) - (member fspec (eval '(trace)) :test #'equal)) - -(defun toggle-trace-aux (fspec &rest args) - (cond ((tracedp fspec) - (eval `(untrace ,fspec)) - (format nil "~S is now untraced." fspec)) - (t - (eval `(trace (,fspec ,@args))) - (format nil "~S is now traced." fspec)))) - -(defun toggle-trace-generic-function-methods (name) - (let ((methods (mop:generic-function-methods (fdefinition name)))) - (cond ((tracedp name) - (eval `(untrace ,name)) - (dolist (method methods (format nil "~S is now untraced." name)) - (excl:funtrace (mop:method-function method)))) - (t - (eval `(trace (,name))) - (dolist (method methods (format nil "~S is now traced." name)) - (excl:ftrace (mop:method-function method))))))) - -(defun process-fspec-for-allegro (fspec) - (cond ((consp fspec) - (ecase (first fspec) - ((setf) fspec) - ((:defun :defgeneric) (second fspec)) - ((:defmethod) `(method ,@(rest fspec))) - ((:labels) `(labels ,(process-fspec-for-allegro (second fspec)) - ,(third fspec))) - ((:flet) `(flet ,(process-fspec-for-allegro (second fspec)) - ,(third fspec))))) - (t - fspec))) - - -;;;; Weak hashtables - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak-keys t args)) - -(defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :values :weak args)) - -(defimplementation hash-table-weakness (hashtable) - (cond ((excl:hash-table-weak-keys hashtable) :key) - ((eq (excl:hash-table-values hashtable) :weak) :value))) - - - -;;;; Character names - -(defimplementation character-completion-set (prefix matchp) - (loop for name being the hash-keys of excl::*name-to-char-table* - when (funcall matchp prefix name) - collect (string-capitalize name))) - - -;;;; wrap interface implementation - -(defimplementation wrap (spec indicator &key before after replace) - (let ((allegro-spec (process-fspec-for-allegro spec))) - (excl:fwrap allegro-spec - indicator - (excl:def-fwrapper allegro-wrapper (&rest args) - (let (retlist completed) - (unwind-protect - (progn - (when before - (funcall before args)) - (setq retlist (multiple-value-list - (if replace - (funcall replace args) - (excl:call-next-fwrapper)))) - (setq completed t) - (values-list retlist)) - (when after - (funcall after (if completed - retlist - :exited-non-locally))))))) - allegro-spec)) - -(defimplementation unwrap (spec indicator) - (let ((allegro-spec (process-fspec-for-allegro spec))) - (excl:funwrap allegro-spec indicator) - allegro-spec)) - -(defimplementation wrapped-p (spec indicator) - (getf (excl:fwrap-order (process-fspec-for-allegro spec)) indicator)) diff --git a/elpa/slime-20200414.1444/swank/backend.lisp b/elpa/slime-20200414.1444/swank/backend.lisp deleted file mode 100644 index e2bd26d3..00000000 --- a/elpa/slime-20200414.1444/swank/backend.lisp +++ /dev/null @@ -1,1581 +0,0 @@ -;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;;*" -*- -;;; -;;; slime-backend.lisp --- SLIME backend interface. -;;; -;;; Created by James Bielman in 2003. Released into the public domain. -;;; -;;;; Frontmatter -;;; -;;; This file defines the functions that must be implemented -;;; separately for each Lisp. Each is declared as a generic function -;;; for which swank-.lisp provides methods. - -(in-package swank/backend) - - -;;;; Metacode - -(defparameter *debug-swank-backend* nil - "If this is true, backends should not catch errors but enter the -debugger where appropriate. Also, they should not perform backtrace -magic but really show every frame including SWANK related ones.") - -(defparameter *interface-functions* '() - "The names of all interface functions.") - -(defparameter *unimplemented-interfaces* '() - "List of interface functions that are not implemented. -DEFINTERFACE adds to this list and DEFIMPLEMENTATION removes.") - -(defvar *log-output* nil) ; should be nil for image dumpers - -(defmacro definterface (name args documentation &rest default-body) - "Define an interface function for the backend to implement. -A function is defined with NAME, ARGS, and DOCUMENTATION. This -function first looks for a function to call in NAME's property list -that is indicated by 'IMPLEMENTATION; failing that, it looks for a -function indicated by 'DEFAULT. If neither is present, an error is -signaled. - -If a DEFAULT-BODY is supplied, then a function with the same body and -ARGS will be added to NAME's property list as the property indicated -by 'DEFAULT. - -Backends implement these functions using DEFIMPLEMENTATION." - (check-type documentation string "a documentation string") - (assert (every #'symbolp args) () - "Complex lambda-list not supported: ~S ~S" name args) - (labels ((gen-default-impl () - `(setf (get ',name 'default) (lambda ,args ,@default-body))) - (args-as-list (args) - (destructuring-bind (req opt key rest) (parse-lambda-list args) - `(,@req ,@opt - ,@(loop for k in key append `(,(kw k) ,k)) - ,@(or rest '(()))))) - (parse-lambda-list (args) - (parse args '(&optional &key &rest) - (make-array 4 :initial-element nil))) - (parse (args keywords vars) - (cond ((null args) - (reverse (map 'list #'reverse vars))) - ((member (car args) keywords) - (parse (cdr args) (cdr (member (car args) keywords)) vars)) - (t (push (car args) (aref vars (length keywords))) - (parse (cdr args) keywords vars)))) - (kw (s) (intern (string s) :keyword))) - `(progn - (defun ,name ,args - ,documentation - (let ((f (or (get ',name 'implementation) - (get ',name 'default)))) - (cond (f (apply f ,@(args-as-list args))) - (t (error "~S not implemented" ',name))))) - (pushnew ',name *interface-functions*) - ,(if (null default-body) - `(pushnew ',name *unimplemented-interfaces*) - (gen-default-impl)) - (eval-when (:compile-toplevel :load-toplevel :execute) - (export ',name :swank/backend)) - ',name))) - -(defmacro defimplementation (name args &body body) - (assert (every #'symbolp args) () - "Complex lambda-list not supported: ~S ~S" name args) - `(progn - (setf (get ',name 'implementation) - ;; For implicit BLOCK. FLET because of interplay w/ decls. - (flet ((,name ,args ,@body)) #',name)) - (if (member ',name *interface-functions*) - (setq *unimplemented-interfaces* - (remove ',name *unimplemented-interfaces*)) - (warn "DEFIMPLEMENTATION of undefined interface (~S)" ',name)) - ',name)) - -(defun warn-unimplemented-interfaces () - "Warn the user about unimplemented backend features. -The portable code calls this function at startup." - (let ((*print-pretty* t)) - (warn "These Swank interfaces are unimplemented:~% ~:<~{~A~^ ~:_~}~:>" - (list (sort (copy-list *unimplemented-interfaces*) #'string<))))) - -(defun import-to-swank-mop (symbol-list) - (dolist (sym symbol-list) - (let* ((swank-mop-sym (find-symbol (symbol-name sym) :swank-mop))) - (when swank-mop-sym - (unintern swank-mop-sym :swank-mop)) - (import sym :swank-mop) - (export sym :swank-mop)))) - -(defun import-swank-mop-symbols (package except) - "Import the mop symbols from PACKAGE to SWANK-MOP. -EXCEPT is a list of symbol names which should be ignored." - (do-symbols (s :swank-mop) - (unless (member s except :test #'string=) - (let ((real-symbol (find-symbol (string s) package))) - (assert real-symbol () "Symbol ~A not found in package ~A" s package) - (unintern s :swank-mop) - (import real-symbol :swank-mop) - (export real-symbol :swank-mop))))) - -(definterface gray-package-name () - "Return a package-name that contains the Gray stream symbols. -This will be used like so: - (defpackage foo - (:import-from #.(gray-package-name) . #.*gray-stream-symbols*)") - - -;;;; Utilities - -(defmacro with-struct ((conc-name &rest names) obj &body body) - "Like with-slots but works only for structs." - (check-type conc-name symbol) - (flet ((reader (slot) - (intern (concatenate 'string - (symbol-name conc-name) - (symbol-name slot)) - (symbol-package conc-name)))) - (let ((tmp (gensym "OO-"))) - ` (let ((,tmp ,obj)) - (symbol-macrolet - ,(loop for name in names collect - (typecase name - (symbol `(,name (,(reader name) ,tmp))) - (cons `(,(first name) (,(reader (second name)) ,tmp))) - (t (error "Malformed syntax in WITH-STRUCT: ~A" name)))) - ,@body))))) - -(defmacro when-let ((var value) &body body) - `(let ((,var ,value)) - (when ,var ,@body))) - -(defun boolean-to-feature-expression (value) - "Converts a boolean VALUE to a form suitable for testing with #+." - (if value - '(:and) - '(:or))) - -(defun with-symbol (name package) - "Check if a symbol with a given NAME exists in PACKAGE and returns a -form suitable for testing with #+." - (boolean-to-feature-expression - (and (find-package package) - (find-symbol (string name) package)))) - -(defun choose-symbol (package name alt-package alt-name) - "If symbol package:name exists return that symbol, otherwise alt-package:alt-name. - Suitable for use with #." - (or (and (find-package package) - (find-symbol (string name) package)) - (find-symbol (string alt-name) alt-package))) - - -;;;; UFT8 - -(deftype octet () '(unsigned-byte 8)) -(deftype octets () '(simple-array octet (*))) - -;; Helper function. Decode the next N bytes starting from INDEX. -;; Return the decoded char and the new index. -(defun utf8-decode-aux (buffer index limit byte0 n) - (declare (type octets buffer) (fixnum index limit byte0 n)) - (if (< (- limit index) n) - (values nil index) - (do ((i 0 (1+ i)) - (code byte0 (let ((byte (aref buffer (+ index i)))) - (cond ((= (ldb (byte 2 6) byte) #b10) - (+ (ash code 6) (ldb (byte 6 0) byte))) - (t - #xFFFD))))) ;; Replacement_Character - ((= i n) - (values (cond ((<= code #xff) (code-char code)) - ((<= #xd800 code #xdfff) - (code-char #xFFFD)) ;; Replacement_Character - ((and (< code char-code-limit) - (code-char code))) - (t - (code-char #xFFFD))) ;; Replacement_Character - (+ index n)))))) - -;; Decode one character in BUFFER starting at INDEX. -;; Return 2 values: the character and the new index. -;; If there aren't enough bytes between INDEX and LIMIT return nil. -(defun utf8-decode (buffer index limit) - (declare (type octets buffer) (fixnum index limit)) - (if (= index limit) - (values nil index) - (let ((b (aref buffer index))) - (if (<= b #x7f) - (values (code-char b) (1+ index)) - (macrolet ((try (marker else) - (let* ((l (integer-length marker)) - (n (- l 2))) - `(if (= (ldb (byte ,l ,(- 8 l)) b) ,marker) - (utf8-decode-aux buffer (1+ index) limit - (ldb (byte ,(- 8 l) 0) b) - ,n) - ,else)))) - (try #b110 - (try #b1110 - (try #b11110 - (try #b111110 - (try #b1111110 - (error "Invalid encoding"))))))))))) - -;; Decode characters from BUFFER and write them to STRING. -;; Return 2 values: LASTINDEX and LASTSTART where -;; LASTINDEX is the last index in BUFFER that was not decoded -;; and LASTSTART is the last index in STRING not written. -(defun utf8-decode-into (buffer index limit string start end) - (declare (string string) (fixnum index limit start end) (type octets buffer)) - (loop - (cond ((= start end) - (return (values index start))) - (t - (multiple-value-bind (c i) (utf8-decode buffer index limit) - (cond (c - (setf (aref string start) c) - (setq index i) - (setq start (1+ start))) - (t - (return (values index start))))))))) - -(defun default-utf8-to-string (octets) - (let* ((limit (length octets)) - (str (make-string limit))) - (multiple-value-bind (i s) (utf8-decode-into octets 0 limit str 0 limit) - (if (= i limit) - (if (= limit s) - str - (adjust-array str s)) - (loop - (let ((end (+ (length str) (- limit i)))) - (setq str (adjust-array str end)) - (multiple-value-bind (i2 s2) - (utf8-decode-into octets i limit str s end) - (cond ((= i2 limit) - (return (adjust-array str s2))) - (t - (setq i i2) - (setq s s2)))))))))) - -(defmacro utf8-encode-aux (code buffer start end n) - `(cond ((< (- ,end ,start) ,n) - ,start) - (t - (setf (aref ,buffer ,start) - (dpb (ldb (byte ,(- 7 n) ,(* 6 (1- n))) ,code) - (byte ,(- 7 n) 0) - ,(dpb 0 (byte 1 (- 7 n)) #xff))) - ,@(loop for i from 0 upto (- n 2) collect - `(setf (aref ,buffer (+ ,start ,(- n 1 i))) - (dpb (ldb (byte 6 ,(* 6 i)) ,code) - (byte 6 0) - #b10111111))) - (+ ,start ,n)))) - -(defun %utf8-encode (code buffer start end) - (declare (type (unsigned-byte 31) code) (type octets buffer) - (type (and fixnum unsigned-byte) start end)) - (cond ((<= code #x7f) - (cond ((< start end) - (setf (aref buffer start) code) - (1+ start)) - (t start))) - ((<= code #x7ff) (utf8-encode-aux code buffer start end 2)) - ((<= #xd800 code #xdfff) - (%utf8-encode (code-char #xFFFD) ;; Replacement_Character - buffer start end)) - ((<= code #xffff) (utf8-encode-aux code buffer start end 3)) - ((<= code #x1fffff) (utf8-encode-aux code buffer start end 4)) - ((<= code #x3ffffff) (utf8-encode-aux code buffer start end 5)) - (t (utf8-encode-aux code buffer start end 6)))) - -(defun utf8-encode (char buffer start end) - (declare (type character char) (type octets buffer) - (type (and fixnum unsigned-byte) start end)) - (%utf8-encode (char-code char) buffer start end)) - -(defun utf8-encode-into (string start end buffer index limit) - (declare (string string) (type octets buffer) (fixnum start end index limit)) - (loop - (cond ((= start end) - (return (values start index))) - ((= index limit) - (return (values start index))) - (t - (let ((i2 (utf8-encode (char string start) buffer index limit))) - (cond ((= i2 index) - (return (values start index))) - (t - (setq index i2) - (incf start)))))))) - -(defun default-string-to-utf8 (string) - (let* ((len (length string)) - (b (make-array len :element-type 'octet))) - (multiple-value-bind (s i) (utf8-encode-into string 0 len b 0 len) - (if (= s len) - b - (loop - (let ((limit (+ (length b) (- len s)))) - (setq b (coerce (adjust-array b limit) 'octets)) - (multiple-value-bind (s2 i2) - (utf8-encode-into string s len b i limit) - (cond ((= s2 len) - (return (coerce (adjust-array b i2) 'octets))) - (t - (setq i i2) - (setq s s2)))))))))) - -(definterface string-to-utf8 (string) - "Convert the string STRING to a (simple-array (unsigned-byte 8))" - (default-string-to-utf8 string)) - -(definterface utf8-to-string (octets) - "Convert the (simple-array (unsigned-byte 8)) OCTETS to a string." - (default-utf8-to-string octets)) - - -;;;; TCP server - -(definterface create-socket (host port &key backlog) - "Create a listening TCP socket on interface HOST and port PORT. -BACKLOG queue length for incoming connections.") - -(definterface local-port (socket) - "Return the local port number of SOCKET.") - -(definterface close-socket (socket) - "Close the socket SOCKET.") - -(definterface accept-connection (socket &key external-format - buffering timeout) - "Accept a client connection on the listening socket SOCKET. -Return a stream for the new connection. -If EXTERNAL-FORMAT is nil return a binary stream -otherwise create a character stream. -BUFFERING can be one of: - nil ... no buffering - t ... enable buffering - :line ... enable buffering with automatic flushing on eol.") - -(definterface add-sigio-handler (socket fn) - "Call FN whenever SOCKET is readable.") - -(definterface remove-sigio-handlers (socket) - "Remove all sigio handlers for SOCKET.") - -(definterface add-fd-handler (socket fn) - "Call FN when Lisp is waiting for input and SOCKET is readable.") - -(definterface remove-fd-handlers (socket) - "Remove all fd-handlers for SOCKET.") - -(definterface preferred-communication-style () - "Return one of the symbols :spawn, :sigio, :fd-handler, or NIL." - nil) - -(definterface set-stream-timeout (stream timeout) - "Set the 'stream 'timeout. The timeout is either the real number - specifying the timeout in seconds or 'nil for no timeout." - (declare (ignore stream timeout)) - nil) - -;;; Base condition for networking errors. -(define-condition network-error (simple-error) ()) - -(definterface emacs-connected () - "Hook called when the first connection from Emacs is established. -Called from the INIT-FN of the socket server that accepts the -connection. - -This is intended for setting up extra context, e.g. to discover -that the calling thread is the one that interacts with Emacs." - nil) - - -;;;; Unix signals - -(defconstant +sigint+ 2) - -(definterface getpid () - "Return the (Unix) process ID of this superior Lisp.") - -(definterface install-sigint-handler (function) - "Call FUNCTION on SIGINT (instead of invoking the debugger). -Return old signal handler." - (declare (ignore function)) - nil) - -(definterface call-with-user-break-handler (handler function) - "Install the break handler HANDLER while executing FUNCTION." - (let ((old-handler (install-sigint-handler handler))) - (unwind-protect (funcall function) - (install-sigint-handler old-handler)))) - -(definterface quit-lisp () - "Exit the current lisp image.") - -(definterface lisp-implementation-type-name () - "Return a short name for the Lisp implementation." - (lisp-implementation-type)) - -(definterface lisp-implementation-program () - "Return the argv[0] of the running Lisp process, or NIL." - (let ((file (car (command-line-args)))) - (when (and file (probe-file file)) - (namestring (truename file))))) - -(definterface socket-fd (socket-stream) - "Return the file descriptor for SOCKET-STREAM.") - -(definterface make-fd-stream (fd external-format) - "Create a character stream for the file descriptor FD.") - -(definterface dup (fd) - "Duplicate a file descriptor. -If the syscall fails, signal a condition. -See dup(2).") - -(definterface exec-image (image-file args) - "Replace the current process with a new process image. -The new image is created by loading the previously dumped -core file IMAGE-FILE. -ARGS is a list of strings passed as arguments to -the new image. -This is thin wrapper around exec(3).") - -(definterface command-line-args () - "Return a list of strings as passed by the OS." - nil) - - -;; pathnames are sooo useless - -(definterface filename-to-pathname (filename) - "Return a pathname for FILENAME. -A filename in Emacs may for example contain asterisks which should not -be translated to wildcards." - (parse-namestring filename)) - -(definterface pathname-to-filename (pathname) - "Return the filename for PATHNAME." - (namestring pathname)) - -(definterface default-directory () - "Return the default directory." - (directory-namestring (truename *default-pathname-defaults*))) - -(definterface set-default-directory (directory) - "Set the default directory. -This is used to resolve filenames without directory component." - (setf *default-pathname-defaults* (truename (merge-pathnames directory))) - (default-directory)) - - -(definterface call-with-syntax-hooks (fn) - "Call FN with hooks to handle special syntax." - (funcall fn)) - -(definterface default-readtable-alist () - "Return a suitable initial value for SWANK:*READTABLE-ALIST*." - '()) - - -;;;; Packages - -(definterface package-local-nicknames (package) - "Returns an alist of (local-nickname . actual-package) describing the -nicknames local to the designated package." - (declare (ignore package)) - nil) - -(definterface find-locally-nicknamed-package (name base-package) - "Return the package whose local nickname in BASE-PACKAGE matches NAME. -Return NIL if local nicknames are not implemented or if there is no -such package." - (cdr (assoc name (package-local-nicknames base-package) :test #'string-equal))) - - -;;;; Compilation - -(definterface call-with-compilation-hooks (func) - "Call FUNC with hooks to record compiler conditions.") - -(defmacro with-compilation-hooks ((&rest ignore) &body body) - "Execute BODY as in CALL-WITH-COMPILATION-HOOKS." - (declare (ignore ignore)) - `(call-with-compilation-hooks (lambda () (progn ,@body)))) - -(definterface swank-compile-string (string &key buffer position filename - line column policy) - "Compile source from STRING. -During compilation, compiler conditions must be trapped and -resignalled as COMPILER-CONDITIONs. - -If supplied, BUFFER and POSITION specify the source location in Emacs. - -Additionally, if POSITION is supplied, it must be added to source -positions reported in compiler conditions. - -If FILENAME is specified it may be used by certain implementations to -rebind *DEFAULT-PATHNAME-DEFAULTS* which may improve the recording of -source information. - -If POLICY is supplied, and non-NIL, it may be used by certain -implementations to compile with optimization qualities of its -value. - -If LINE and COLUMN are supplied, and non-NIL, they may be used -by certain implementations as the line and column of the start of -the string in FILENAME. Both LINE and COLUMN are 1-based. - -Should return T on successful compilation, NIL otherwise. -") - -(definterface swank-compile-file (input-file output-file load-p - external-format - &key policy) - "Compile INPUT-FILE signalling COMPILE-CONDITIONs. -If LOAD-P is true, load the file after compilation. -EXTERNAL-FORMAT is a value returned by find-external-format or -:default. - -If POLICY is supplied, and non-NIL, it may be used by certain -implementations to compile with optimization qualities of its -value. - -Should return OUTPUT-TRUENAME, WARNINGS-P and FAILURE-p -like `compile-file'") - -(deftype severity () - '(member :error :read-error :warning :style-warning :note :redefinition)) - -;; Base condition type for compiler errors, warnings and notes. -(define-condition compiler-condition (condition) - ((original-condition - ;; The original condition thrown by the compiler if appropriate. - ;; May be NIL if a compiler does not report using conditions. - :type (or null condition) - :initarg :original-condition - :accessor original-condition) - - (severity :type severity - :initarg :severity - :accessor severity) - - (message :initarg :message - :accessor message) - - ;; Macro expansion history etc. which may be helpful in some cases - ;; but is often very verbose. - (source-context :initarg :source-context - :type (or null string) - :initform nil - :accessor source-context) - - (references :initarg :references - :initform nil - :accessor references) - - (location :initarg :location - :accessor location))) - -(definterface find-external-format (coding-system) - "Return a \"external file format designator\" for CODING-SYSTEM. -CODING-SYSTEM is Emacs-style coding system name (a string), -e.g. \"latin-1-unix\"." - (if (equal coding-system "iso-latin-1-unix") - :default - nil)) - -(definterface guess-external-format (pathname) - "Detect the external format for the file with name pathname. -Return nil if the file contains no special markers." - ;; Look for a Emacs-style -*- coding: ... -*- or Local Variable: section. - (with-open-file (s pathname :if-does-not-exist nil - :external-format (or (find-external-format "latin-1-unix") - :default)) - (if s - (or (let* ((line (read-line s nil)) - (p (search "-*-" line))) - (when p - (let* ((start (+ p (length "-*-"))) - (end (search "-*-" line :start2 start))) - (when end - (%search-coding line start end))))) - (let* ((len (file-length s)) - (buf (make-string (min len 3000)))) - (file-position s (- len (length buf))) - (read-sequence buf s) - (let ((start (search "Local Variables:" buf :from-end t)) - (end (search "End:" buf :from-end t))) - (and start end (< start end) - (%search-coding buf start end)))))))) - -(defun %search-coding (str start end) - (let ((p (search "coding:" str :start2 start :end2 end))) - (when p - (incf p (length "coding:")) - (loop while (and (< p end) - (member (aref str p) '(#\space #\tab))) - do (incf p)) - (let ((end (position-if (lambda (c) (find c '(#\space #\tab #\newline #\;))) - str :start p))) - (find-external-format (subseq str p end)))))) - - -;;;; Streams - -(definterface make-output-stream (write-string) - "Return a new character output stream. -The stream calls WRITE-STRING when output is ready.") - -(definterface make-input-stream (read-string) - "Return a new character input stream. -The stream calls READ-STRING when input is needed.") - -(defvar *auto-flush-interval* 0.2) - -(defun auto-flush-loop (stream interval &optional receive) - (loop - (when (not (and (open-stream-p stream) - (output-stream-p stream))) - (return nil)) - (force-output stream) - (when receive - (receive-if #'identity)) - (sleep interval))) - -(definterface make-auto-flush-thread (stream) - "Make an auto-flush thread" - (spawn (lambda () (auto-flush-loop stream *auto-flush-interval* nil)) - :name "auto-flush-thread")) - - -;;;; Documentation - -(definterface arglist (name) - "Return the lambda list for the symbol NAME. NAME can also be -a lisp function object, on lisps which support this. - -The result can be a list or the :not-available keyword if the -arglist cannot be determined." - (declare (ignore name)) - :not-available) - -(defgeneric declaration-arglist (decl-identifier) - (:documentation - "Return the argument list of the declaration specifier belonging to the -declaration identifier DECL-IDENTIFIER. If the arglist cannot be determined, -the keyword :NOT-AVAILABLE is returned. - -The different SWANK backends can specialize this generic function to -include implementation-dependend declaration specifiers, or to provide -additional information on the specifiers defined in ANSI Common Lisp.") - (:method (decl-identifier) - (case decl-identifier - (dynamic-extent '(&rest variables)) - (ignore '(&rest variables)) - (ignorable '(&rest variables)) - (special '(&rest variables)) - (inline '(&rest function-names)) - (notinline '(&rest function-names)) - (declaration '(&rest names)) - (optimize '(&any compilation-speed debug safety space speed)) - (type '(type-specifier &rest args)) - (ftype '(type-specifier &rest function-names)) - (otherwise - (flet ((typespec-p (symbol) - (member :type (describe-symbol-for-emacs symbol)))) - (cond ((and (symbolp decl-identifier) (typespec-p decl-identifier)) - '(&rest variables)) - ((and (listp decl-identifier) - (typespec-p (first decl-identifier))) - '(&rest variables)) - (t :not-available))))))) - -(defgeneric type-specifier-arglist (typespec-operator) - (:documentation - "Return the argument list of the type specifier belonging to -TYPESPEC-OPERATOR.. If the arglist cannot be determined, the keyword -:NOT-AVAILABLE is returned. - -The different SWANK backends can specialize this generic function to -include implementation-dependend declaration specifiers, or to provide -additional information on the specifiers defined in ANSI Common Lisp.") - (:method (typespec-operator) - (declare (special *type-specifier-arglists*)) ; defined at end of file. - (typecase typespec-operator - (symbol (or (cdr (assoc typespec-operator *type-specifier-arglists*)) - :not-available)) - (t :not-available)))) - -(definterface type-specifier-p (symbol) - "Determine if SYMBOL is a type-specifier." - (or (documentation symbol 'type) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(definterface function-name (function) - "Return the name of the function object FUNCTION. - -The result is either a symbol, a list, or NIL if no function name is -available." - (declare (ignore function)) - nil) - -(definterface valid-function-name-p (form) - "Is FORM syntactically valid to name a function? - If true, FBOUNDP should not signal a type-error for FORM." - (flet ((length=2 (list) - (and (not (null (cdr list))) (null (cddr list))))) - (or (symbolp form) - (and (consp form) (length=2 form) - (eq (first form) 'setf) (symbolp (second form)))))) - -(definterface macroexpand-all (form &optional env) - "Recursively expand all macros in FORM. -Return the resulting form.") - -(definterface compiler-macroexpand-1 (form &optional env) - "Call the compiler-macro for form. -If FORM is a function call for which a compiler-macro has been -defined, invoke the expander function using *macroexpand-hook* and -return the results and T. Otherwise, return the original form and -NIL." - (let ((fun (and (consp form) - (valid-function-name-p (car form)) - (compiler-macro-function (car form) env)))) - (if fun - (let ((result (funcall *macroexpand-hook* fun form env))) - (values result (not (eq result form)))) - (values form nil)))) - -(definterface compiler-macroexpand (form &optional env) - "Repetitively call `compiler-macroexpand-1'." - (labels ((frob (form expanded) - (multiple-value-bind (new-form newly-expanded) - (compiler-macroexpand-1 form env) - (if newly-expanded - (frob new-form t) - (values new-form expanded))))) - (frob form env))) - -(defmacro with-collected-macro-forms - ((forms &optional result) instrumented-form &body body) - "Collect macro forms by locally binding *MACROEXPAND-HOOK*. - -Evaluates INSTRUMENTED-FORM and collects any forms which undergo -macro-expansion into a list. Then evaluates BODY with FORMS bound to -the list of forms, and RESULT (optionally) bound to the value of -INSTRUMENTED-FORM." - (assert (and (symbolp forms) (not (null forms)))) - (assert (symbolp result)) - (let ((result-symbol (or result (gensym)))) - `(call-with-collected-macro-forms - (lambda (,forms ,result-symbol) - (declare (ignore ,@(and (not result) - `(,result-symbol)))) - ,@body) - (lambda () ,instrumented-form)))) - -(defun call-with-collected-macro-forms (body-fn instrumented-fn) - (let ((return-value nil) - (collected-forms '())) - (let* ((real-macroexpand-hook *macroexpand-hook*) - (*macroexpand-hook* - (lambda (macro-function form environment) - (let ((result (funcall real-macroexpand-hook - macro-function form environment))) - (unless (eq result form) - (push form collected-forms)) - result)))) - (setf return-value (funcall instrumented-fn))) - (funcall body-fn collected-forms return-value))) - -(definterface collect-macro-forms (form &optional env) - "Collect subforms of FORM which undergo (compiler-)macro expansion. -Returns two values: a list of macro forms and a list of compiler macro -forms." - (with-collected-macro-forms (macro-forms expansion) - (ignore-errors (macroexpand-all form env)) - (with-collected-macro-forms (compiler-macro-forms) - (handler-bind ((warning #'muffle-warning)) - (ignore-errors - (compile nil `(lambda () ,expansion)))) - (values macro-forms compiler-macro-forms)))) - -(definterface format-string-expand (control-string) - "Expand the format string CONTROL-STRING." - (macroexpand `(formatter ,control-string))) - -(definterface describe-symbol-for-emacs (symbol) - "Return a property list describing SYMBOL. - -The property list has an entry for each interesting aspect of the -symbol. The recognised keys are: - - :VARIABLE :FUNCTION :SETF :SPECIAL-OPERATOR :MACRO :COMPILER-MACRO - :TYPE :CLASS :ALIEN-TYPE :ALIEN-STRUCT :ALIEN-UNION :ALIEN-ENUM - -The value of each property is the corresponding documentation string, -or NIL (or the obsolete :NOT-DOCUMENTED). It is legal to include keys -not listed here (but slime-print-apropos in Emacs must know about -them). - -Properties should be included if and only if they are applicable to -the symbol. For example, only (and all) fbound symbols should include -the :FUNCTION property. - -Example: -\(describe-symbol-for-emacs 'vector) - => (:CLASS :NOT-DOCUMENTED - :TYPE :NOT-DOCUMENTED - :FUNCTION \"Constructs a simple-vector from the given objects.\")") - -(definterface describe-definition (name type) - "Describe the definition NAME of TYPE. -TYPE can be any value returned by DESCRIBE-SYMBOL-FOR-EMACS. - -Return a documentation string, or NIL if none is available.") - - -;;;; Debugging - -(definterface install-debugger-globally (function) - "Install FUNCTION as the debugger for all threads/processes. This -usually involves setting *DEBUGGER-HOOK* and, if the implementation -permits, hooking into BREAK as well." - (setq *debugger-hook* function)) - -(definterface call-with-debugging-environment (debugger-loop-fn) - "Call DEBUGGER-LOOP-FN in a suitable debugging environment. - -This function is called recursively at each debug level to invoke the -debugger loop. The purpose is to setup any necessary environment for -other debugger callbacks that will be called within the debugger loop. - -For example, this is a reasonable place to compute a backtrace, switch -to safe reader/printer settings, and so on.") - -(definterface call-with-debugger-hook (hook fun) - "Call FUN and use HOOK as debugger hook. HOOK can be NIL. - -HOOK should be called for both BREAK and INVOKE-DEBUGGER." - (let ((*debugger-hook* hook)) - (funcall fun))) - -(define-condition sldb-condition (condition) - ((original-condition - :initarg :original-condition - :accessor original-condition)) - (:report (lambda (condition stream) - (format stream "Condition in debugger code~@[: ~A~]" - (original-condition condition)))) - (:documentation - "Wrapper for conditions that should not be debugged. - -When a condition arises from the internals of the debugger, it is not -desirable to debug it -- we'd risk entering an endless loop trying to -debug the debugger! Instead, such conditions can be reported to the -user without (re)entering the debugger by wrapping them as -`sldb-condition's.")) - -;;; The following functions in this section are supposed to be called -;;; within the dynamic contour of CALL-WITH-DEBUGGING-ENVIRONMENT only. - -(definterface compute-backtrace (start end) - "Returns a backtrace of the condition currently being debugged, -that is an ordered list consisting of frames. ``Ordered list'' -means that an integer I can be mapped back to the i-th frame of this -backtrace. - -START and END are zero-based indices constraining the number of frames -returned. Frame zero is defined as the frame which invoked the -debugger. If END is nil, return the frames from START to the end of -the stack.") - -(definterface print-frame (frame stream) - "Print frame to stream.") - -(definterface frame-restartable-p (frame) - "Is the frame FRAME restartable?. -Return T if `restart-frame' can safely be called on the frame." - (declare (ignore frame)) - nil) - -(definterface frame-source-location (frame-number) - "Return the source location for the frame associated to FRAME-NUMBER.") - -(definterface frame-catch-tags (frame-number) - "Return a list of catch tags for being printed in a debugger stack -frame." - (declare (ignore frame-number)) - '()) - -(definterface frame-locals (frame-number) - "Return a list of ((&key NAME ID VALUE) ...) where each element of -the list represents a local variable in the stack frame associated to -FRAME-NUMBER. - -NAME, a symbol; the name of the local variable. - -ID, an integer; used as primary key for the local variable, unique -relatively to the frame under operation. - -value, an object; the value of the local variable.") - -(definterface frame-var-value (frame-number var-id) - "Return the value of the local variable associated to VAR-ID -relatively to the frame associated to FRAME-NUMBER.") - -(definterface disassemble-frame (frame-number) - "Disassemble the code for the FRAME-NUMBER. -The output should be written to standard output. -FRAME-NUMBER is a non-negative integer.") - -(definterface eval-in-frame (form frame-number) - "Evaluate a Lisp form in the lexical context of a stack frame -in the debugger. - -FRAME-NUMBER must be a positive integer with 0 indicating the -frame which invoked the debugger. - -The return value is the result of evaulating FORM in the -appropriate context.") - -(definterface frame-package (frame-number) - "Return the package corresponding to the frame at FRAME-NUMBER. -Return nil if the backend can't figure it out." - (declare (ignore frame-number)) - nil) - -(definterface frame-call (frame-number) - "Return a string representing a call to the entry point of a frame.") - -(definterface return-from-frame (frame-number form) - "Unwind the stack to the frame FRAME-NUMBER and return the value(s) -produced by evaluating FORM in the frame context to its caller. - -Execute any clean-up code from unwind-protect forms above the frame -during unwinding. - -Return a string describing the error if it's not possible to return -from the frame.") - -(definterface restart-frame (frame-number) - "Restart execution of the frame FRAME-NUMBER with the same arguments -as it was called originally.") - -(definterface print-condition (condition stream) - "Print a condition for display in SLDB." - (princ condition stream)) - -(definterface condition-extras (condition) - "Return a list of extra for the debugger. -The allowed elements are of the form: - (:SHOW-FRAME-SOURCE frame-number) - (:REFERENCES &rest refs) -" - (declare (ignore condition)) - '()) - -(definterface gdb-initial-commands () - "List of gdb commands supposed to be executed first for the - ATTACH-GDB restart." - nil) - -(definterface activate-stepping (frame-number) - "Prepare the frame FRAME-NUMBER for stepping.") - -(definterface sldb-break-on-return (frame-number) - "Set a breakpoint in the frame FRAME-NUMBER.") - -(definterface sldb-break-at-start (symbol) - "Set a breakpoint on the beginning of the function for SYMBOL.") - -(definterface sldb-stepper-condition-p (condition) - "Return true if SLDB was invoked due to a single-stepping condition, -false otherwise. " - (declare (ignore condition)) - nil) - -(definterface sldb-step-into () - "Step into the current single-stepper form.") - -(definterface sldb-step-next () - "Step to the next form in the current function.") - -(definterface sldb-step-out () - "Stop single-stepping temporarily, but resume it once the current function -returns.") - - -;;;; Definition finding - -(defstruct (location (:type list) - (:constructor make-location - (buffer position &optional hints))) - (type :location) - buffer position - ;; Hints is a property list optionally containing: - ;; :snippet SOURCE-TEXT - ;; This is a snippet of the actual source text at the start of - ;; the definition, which could be used in a text search. - hints) - -(defmacro converting-errors-to-error-location (&body body) - "Catches errors during BODY and converts them to an error location." - (let ((gblock (gensym "CONVERTING-ERRORS+"))) - `(block ,gblock - (handler-bind ((error - #'(lambda (e) - (if *debug-swank-backend* - nil ;decline - (return-from ,gblock - (make-error-location e)))))) - ,@body)))) - -(defun make-error-location (datum &rest args) - (cond ((typep datum 'condition) - `(:error ,(format nil "Error: ~A" datum))) - ((symbolp datum) - `(:error ,(format nil "Error: ~A" - (apply #'make-condition datum args)))) - (t - (assert (stringp datum)) - `(:error ,(apply #'format nil datum args))))) - -(definterface find-definitions (name) - "Return a list ((DSPEC LOCATION) ...) for NAME's definitions. - -NAME is a \"definition specifier\". - -DSPEC is a \"definition specifier\" describing the -definition, e.g., FOO or (METHOD FOO (STRING NUMBER)) or -\(DEFVAR FOO). - -LOCATION is the source location for the definition.") - -(definterface find-source-location (object) - "Returns the source location of OBJECT, or NIL. - -That is the source location of the underlying datastructure of -OBJECT. E.g. on a STANDARD-OBJECT, the source location of the -respective DEFCLASS definition is returned, on a STRUCTURE-CLASS the -respective DEFSTRUCT definition, and so on." - ;; This returns one source location and not a list of locations. It's - ;; supposed to return the location of the DEFGENERIC definition on - ;; #'SOME-GENERIC-FUNCTION. - (declare (ignore object)) - (make-error-location "FIND-SOURCE-LOCATION is not yet implemented on ~ - this implementation.")) - -(definterface buffer-first-change (filename) - "Called for effect the first time FILENAME's buffer is modified. -CMUCL/SBCL use this to cache the unmodified file and use the -unmodified text to improve the precision of source locations." - (declare (ignore filename)) - nil) - - - -;;;; XREF - -(definterface who-calls (function-name) - "Return the call sites of FUNCTION-NAME (a symbol). -The results is a list ((DSPEC LOCATION) ...)." - (declare (ignore function-name)) - :not-implemented) - -(definterface calls-who (function-name) - "Return the call sites of FUNCTION-NAME (a symbol). -The results is a list ((DSPEC LOCATION) ...)." - (declare (ignore function-name)) - :not-implemented) - -(definterface who-references (variable-name) - "Return the locations where VARIABLE-NAME (a symbol) is referenced. -See WHO-CALLS for a description of the return value." - (declare (ignore variable-name)) - :not-implemented) - -(definterface who-binds (variable-name) - "Return the locations where VARIABLE-NAME (a symbol) is bound. -See WHO-CALLS for a description of the return value." - (declare (ignore variable-name)) - :not-implemented) - -(definterface who-sets (variable-name) - "Return the locations where VARIABLE-NAME (a symbol) is set. -See WHO-CALLS for a description of the return value." - (declare (ignore variable-name)) - :not-implemented) - -(definterface who-macroexpands (macro-name) - "Return the locations where MACRO-NAME (a symbol) is expanded. -See WHO-CALLS for a description of the return value." - (declare (ignore macro-name)) - :not-implemented) - -(definterface who-specializes (class-name) - "Return the locations where CLASS-NAME (a symbol) is specialized. -See WHO-CALLS for a description of the return value." - (declare (ignore class-name)) - :not-implemented) - -;;; Simpler variants. - -(definterface list-callers (function-name) - "List the callers of FUNCTION-NAME. -This function is like WHO-CALLS except that it is expected to use -lower-level means. Whereas WHO-CALLS is usually implemented with -special compiler support, LIST-CALLERS is usually implemented by -groveling for constants in function objects throughout the heap. - -The return value is as for WHO-CALLS.") - -(definterface list-callees (function-name) - "List the functions called by FUNCTION-NAME. -See LIST-CALLERS for a description of the return value.") - - -;;;; Profiling - -;;; The following functions define a minimal profiling interface. - -(definterface profile (fname) - "Marks symbol FNAME for profiling.") - -(definterface profiled-functions () - "Returns a list of profiled functions.") - -(definterface unprofile (fname) - "Marks symbol FNAME as not profiled.") - -(definterface unprofile-all () - "Marks all currently profiled functions as not profiled." - (dolist (f (profiled-functions)) - (unprofile f))) - -(definterface profile-report () - "Prints profile report.") - -(definterface profile-reset () - "Resets profile counters.") - -(definterface profile-package (package callers-p methods) - "Wrap profiling code around all functions in PACKAGE. If a function -is already profiled, then unprofile and reprofile (useful to notice -function redefinition.) - -If CALLERS-P is T names have counts of the most common calling -functions recorded. - -When called with arguments :METHODS T, profile all methods of all -generic functions having names in the given package. Generic functions -themselves, that is, their dispatch functions, are left alone.") - - -;;;; Trace - -(definterface toggle-trace (spec) - "Toggle tracing of the function(s) given with SPEC. -SPEC can be: - (setf NAME) ; a setf function - (:defmethod NAME QUALIFIER... (SPECIALIZER...)) ; a specific method - (:defgeneric NAME) ; a generic function with all methods - (:call CALLER CALLEE) ; trace calls from CALLER to CALLEE. - (:labels TOPLEVEL LOCAL) - (:flet TOPLEVEL LOCAL) ") - - -;;;; Inspector - -(defgeneric emacs-inspect (object) - (:documentation - "Explain to Emacs how to inspect OBJECT. - -Returns a list specifying how to render the object for inspection. - -Every element of the list must be either a string, which will be -inserted into the buffer as is, or a list of the form: - - (:value object &optional format) - Render an inspectable - object. If format is provided it must be a string and will be - rendered in place of the value, otherwise use princ-to-string. - - (:newline) - Render a \\n - - (:action label lambda &key (refresh t)) - Render LABEL (a text - string) which when clicked will call LAMBDA. If REFRESH is - non-NIL the currently inspected object will be re-inspected - after calling the lambda. -")) - -(defmethod emacs-inspect ((object t)) - "Generic method for inspecting any kind of object. - -Since we don't know how to deal with OBJECT we simply dump the -output of CL:DESCRIBE." - `("Type: " (:value ,(type-of object)) (:newline) - "Don't know how to inspect the object, dumping output of CL:DESCRIBE:" - (:newline) (:newline) - ,(with-output-to-string (desc) (describe object desc)))) - -(definterface eval-context (object) - "Return a list of bindings corresponding to OBJECT's slots." - (declare (ignore object)) - '()) - -;;; Utilities for inspector methods. -;;; - -(defun label-value-line (label value &key (newline t)) - "Create a control list which prints \"LABEL: VALUE\" in the inspector. -If NEWLINE is non-NIL a `(:newline)' is added to the result." - (list* (princ-to-string label) ": " `(:value ,value) - (if newline '((:newline)) nil))) - -(defmacro label-value-line* (&rest label-values) - ` (append ,@(loop for (label value) in label-values - collect `(label-value-line ,label ,value)))) - -(definterface describe-primitive-type (object) - "Return a string describing the primitive type of object." - (declare (ignore object)) - "N/A") - - -;;;; Multithreading -;;; -;;; The default implementations are sufficient for non-multiprocessing -;;; implementations. - -(definterface initialize-multiprocessing (continuation) - "Initialize multiprocessing, if necessary and then invoke CONTINUATION. - -Depending on the impleimentaion, this function may never return." - (funcall continuation)) - -(definterface spawn (fn &key name) - "Create a new thread to call FN.") - -(definterface thread-id (thread) - "Return an Emacs-parsable object to identify THREAD. - -Ids should be comparable with equal, i.e.: - (equal (thread-id ) (thread-id )) <==> (eq )" - thread) - -(definterface find-thread (id) - "Return the thread for ID. -ID should be an id previously obtained with THREAD-ID. -Can return nil if the thread no longer exists." - (declare (ignore id)) - (current-thread)) - -(definterface thread-name (thread) - "Return the name of THREAD. -Thread names are short strings meaningful to the user. They do not -have to be unique." - (declare (ignore thread)) - "The One True Thread") - -(definterface thread-status (thread) - "Return a string describing THREAD's state." - (declare (ignore thread)) - "") - -(definterface thread-attributes (thread) - "Return a plist of implementation-dependent attributes for THREAD" - (declare (ignore thread)) - '()) - -(definterface current-thread () - "Return the currently executing thread." - 0) - -(definterface all-threads () - "Return a fresh list of all threads." - '()) - -(definterface thread-alive-p (thread) - "Test if THREAD is termintated." - (member thread (all-threads))) - -(definterface interrupt-thread (thread fn) - "Cause THREAD to execute FN.") - -(definterface kill-thread (thread) - "Terminate THREAD immediately. -Don't execute unwind-protected sections, don't raise conditions. -(Do not pass go, do not collect $200.)" - (declare (ignore thread)) - nil) - -(definterface send (thread object) - "Send OBJECT to thread THREAD." - (declare (ignore thread)) - object) - -(definterface receive (&optional timeout) - "Return the next message from current thread's mailbox." - (receive-if (constantly t) timeout)) - -(definterface receive-if (predicate &optional timeout) - "Return the first message satisfiying PREDICATE.") - -(definterface wake-thread (thread) - "Trigger a call to CHECK-SLIME-INTERRUPTS in THREAD without using -asynchronous interrupts." - (declare (ignore thread)) - ;; Doesn't have to implement this if RECEIVE-IF periodically calls - ;; CHECK-SLIME-INTERRUPTS, but that's energy inefficient - nil) - -(definterface register-thread (name thread) - "Associate the thread THREAD with the symbol NAME. -The thread can then be retrieved with `find-registered'. -If THREAD is nil delete the association." - (declare (ignore name thread)) - nil) - -(definterface find-registered (name) - "Find the thread that was registered for the symbol NAME. -Return nil if the no thread was registred or if the tread is dead." - (declare (ignore name)) - nil) - -(definterface set-default-initial-binding (var form) - "Initialize special variable VAR by default with FORM. - -Some implementations initialize certain variables in each newly -created thread. This function sets the form which is used to produce -the initial value." - (set var (eval form))) - -;; List of delayed interrupts. -;; This should only have thread-local bindings, so no init form. -(defvar *pending-slime-interrupts*) - -(defun check-slime-interrupts () - "Execute pending interrupts if any. -This should be called periodically in operations which -can take a long time to complete. -Return a boolean indicating whether any interrupts was processed." - (when (and (boundp '*pending-slime-interrupts*) - *pending-slime-interrupts*) - (funcall (pop *pending-slime-interrupts*)) - t)) - -(defvar *interrupt-queued-handler* nil - "Function to call on queued interrupts. -Interrupts get queued when an interrupt occurs while interrupt -handling is disabled. - -Backends can use this function to abort slow operations.") - -(definterface wait-for-input (streams &optional timeout) - "Wait for input on a list of streams. Return those that are ready. -STREAMS is a list of streams -TIMEOUT nil, t, or real number. If TIMEOUT is t, return those streams -which are ready (or have reached end-of-file) without waiting. -If TIMEOUT is a number and no streams is ready after TIMEOUT seconds, -return nil. - -Return :interrupt if an interrupt occurs while waiting." - (declare (ignore streams timeout)) - ;; Invoking the slime debugger will just endlessly loop. - (call-with-debugger-hook - nil - (lambda () - (error "~s not implemented. Check if ~s = ~s is supported by the implementation." - 'wait-for-input 'swank:*communication-style* swank:*communication-style*)))) - - -;;;; Locks - -;; Please use locks only in swank-gray.lisp. Locks are too low-level -;; for our taste. - -(definterface make-lock (&key name) - "Make a lock for thread synchronization. -Only one thread may hold the lock (via CALL-WITH-LOCK-HELD) at a time -but that thread may hold it more than once." - (declare (ignore name)) - :null-lock) - -(definterface call-with-lock-held (lock function) - "Call FUNCTION with LOCK held, queueing if necessary." - (declare (ignore lock) - (type function function)) - (funcall function)) - - -;;;; Weak datastructures - -(definterface make-weak-key-hash-table (&rest args) - "Like MAKE-HASH-TABLE, but weak w.r.t. the keys." - (apply #'make-hash-table args)) - -(definterface make-weak-value-hash-table (&rest args) - "Like MAKE-HASH-TABLE, but weak w.r.t. the values." - (apply #'make-hash-table args)) - -(definterface hash-table-weakness (hashtable) - "Return nil or one of :key :value :key-or-value :key-and-value" - (declare (ignore hashtable)) - nil) - - -;;;; Floating point - -(definterface float-nan-p (float) - "Return true if FLOAT is a NaN value (Not a Number)." - ;; When the float type implements IEEE-754 floats, two NaN values - ;; are never equal; when the implementation does not support NaN, - ;; the predicate should return false. An implementation can - ;; implement comparison with "unordered-signaling predicates", which - ;; emit floating point exceptions. - (handler-case (not (= float float)) - ;; Comparisons never signal an exception other than the invalid - ;; operation exception (5.11 Details of comparison predicates). - (floating-point-invalid-operation () t))) - -(definterface float-infinity-p (float) - "Return true if FLOAT is positive or negative infinity." - (not (< most-negative-long-float - float - most-positive-long-float))) - - -;;;; Character names - -(definterface character-completion-set (prefix matchp) - "Return a list of names of characters that match PREFIX." - ;; Handle the standard and semi-standard characters. - (loop for name in '("Newline" "Space" "Tab" "Page" "Rubout" - "Linefeed" "Return" "Backspace") - when (funcall matchp prefix name) - collect name)) - - -(defparameter *type-specifier-arglists* - '((and . (&rest type-specifiers)) - (array . (&optional element-type dimension-spec)) - (base-string . (&optional size)) - (bit-vector . (&optional size)) - (complex . (&optional type-specifier)) - (cons . (&optional car-typespec cdr-typespec)) - (double-float . (&optional lower-limit upper-limit)) - (eql . (object)) - (float . (&optional lower-limit upper-limit)) - (function . (&optional arg-typespec value-typespec)) - (integer . (&optional lower-limit upper-limit)) - (long-float . (&optional lower-limit upper-limit)) - (member . (&rest eql-objects)) - (mod . (n)) - (not . (type-specifier)) - (or . (&rest type-specifiers)) - (rational . (&optional lower-limit upper-limit)) - (real . (&optional lower-limit upper-limit)) - (satisfies . (predicate-symbol)) - (short-float . (&optional lower-limit upper-limit)) - (signed-byte . (&optional size)) - (simple-array . (&optional element-type dimension-spec)) - (simple-base-string . (&optional size)) - (simple-bit-vector . (&optional size)) - (simple-string . (&optional size)) - (single-float . (&optional lower-limit upper-limit)) - (simple-vector . (&optional size)) - (string . (&optional size)) - (unsigned-byte . (&optional size)) - (values . (&rest typespecs)) - (vector . (&optional element-type size)) - )) - -;;; Heap dumps - -(definterface save-image (filename &optional restart-function) - "Save a heap image to the file FILENAME. -RESTART-FUNCTION, if non-nil, should be called when the image is loaded.") - -(definterface background-save-image (filename &key restart-function - completion-function) - "Request saving a heap image to the file FILENAME. -RESTART-FUNCTION, if non-nil, should be called when the image is loaded. -COMPLETION-FUNCTION, if non-nil, should be called after saving the image.") - -(defun deinit-log-output () - ;; Can't hang on to an fd-stream from a previous session. - (setf *log-output* nil)) - - -;;;; Wrapping - -(definterface wrap (spec indicator &key before after replace) - "Intercept future calls to SPEC and surround them in callbacks. - -INDICATOR is a symbol identifying a particular wrapping, and is used -to differentiate between multiple wrappings. - -Implementations intercept calls to SPEC and call, in this order: - -* the BEFORE callback, if it's provided, with a single argument set to - the list of arguments passed to the intercepted call; - -* the original definition of SPEC recursively honouring any wrappings - previously established under different values of INDICATOR. If the - compatible function REPLACE is provided, call that instead. - -* the AFTER callback, if it's provided, with a single set to the list - of values returned by the previous call, or, if that call exited - non-locally, a single descriptive symbol, like :EXITED-NON-LOCALLY." - (declare (ignore indicator)) - (assert (symbolp spec) nil - "The default implementation for WRAP allows only simple names") - (assert (null (get spec 'slime-wrap)) nil - "The default implementation for WRAP allows a single wrapping") - (let* ((saved (symbol-function spec)) - (replacement (lambda (&rest args) - (let (retlist completed) - (unwind-protect - (progn - (when before - (funcall before args)) - (setq retlist (multiple-value-list - (apply (or replace - saved) args))) - (setq completed t) - (values-list retlist)) - (when after - (funcall after (if completed - retlist - :exited-non-locally)))))))) - (setf (get spec 'slime-wrap) (list saved replacement)) - (setf (symbol-function spec) replacement)) - spec) - -(definterface unwrap (spec indicator) - "Remove from SPEC any wrappings tagged with INDICATOR." - (if (wrapped-p spec indicator) - (setf (symbol-function spec) (first (get spec 'slime-wrap))) - (cerror "All right, so I did" - "Hmmm, ~a is not correctly wrapped, you probably redefined it" - spec)) - (setf (get spec 'slime-wrap) nil) - spec) - -(definterface wrapped-p (spec indicator) - "Returns true if SPEC is wrapped with INDICATOR." - (declare (ignore indicator)) - (and (symbolp spec) - (let ((prop-value (get spec 'slime-wrap))) - (cond ((and prop-value - (not (eq (second prop-value) - (symbol-function spec)))) - (warn "~a appears to be incorrectly wrapped" spec) - nil) - (prop-value t) - (t nil))))) diff --git a/elpa/slime-20200414.1444/swank/ccl.lisp b/elpa/slime-20200414.1444/swank/ccl.lisp deleted file mode 100644 index 5518f568..00000000 --- a/elpa/slime-20200414.1444/swank/ccl.lisp +++ /dev/null @@ -1,868 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-ccl.lisp --- SLIME backend for Clozure CL. -;;; -;;; Copyright (C) 2003, James Bielman -;;; -;;; This program is licensed under the terms of the Lisp Lesser GNU -;;; Public License, known as the LLGPL, and distributed with Clozure CL -;;; as the file "LICENSE". The LLGPL consists of a preamble and the -;;; LGPL, which is distributed with Clozure CL as the file "LGPL". Where -;;; these conflict, the preamble takes precedence. -;;; -;;; The LLGPL is also available online at -;;; http://opensource.franz.com/preamble.html - -(defpackage swank/ccl - (:use cl swank/backend)) - -(in-package swank/ccl) - -(eval-when (:compile-toplevel :execute :load-toplevel) - (assert (and (= ccl::*openmcl-major-version* 1) - (>= ccl::*openmcl-minor-version* 4)) - () "This file needs CCL version 1.4 or newer")) - -(defimplementation gray-package-name () - "CCL") - -(eval-when (:compile-toplevel :load-toplevel :execute) - (multiple-value-bind (ok err) (ignore-errors (require 'xref)) - (unless ok - (warn "~a~%" err)))) - -;;; swank-mop - -(import-to-swank-mop - '( ;; classes - cl:standard-generic-function - ccl:standard-slot-definition - cl:method - cl:standard-class - ccl:eql-specializer - openmcl-mop:finalize-inheritance - openmcl-mop:compute-applicable-methods-using-classes - ;; standard-class readers - openmcl-mop:class-default-initargs - openmcl-mop:class-direct-default-initargs - openmcl-mop:class-direct-slots - openmcl-mop:class-direct-subclasses - openmcl-mop:class-direct-superclasses - openmcl-mop:class-finalized-p - cl:class-name - openmcl-mop:class-precedence-list - openmcl-mop:class-prototype - openmcl-mop:class-slots - openmcl-mop:specializer-direct-methods - ;; eql-specializer accessors - openmcl-mop:eql-specializer-object - ;; generic function readers - openmcl-mop:generic-function-argument-precedence-order - openmcl-mop:generic-function-declarations - openmcl-mop:generic-function-lambda-list - openmcl-mop:generic-function-methods - openmcl-mop:generic-function-method-class - openmcl-mop:generic-function-method-combination - openmcl-mop:generic-function-name - ;; method readers - openmcl-mop:method-generic-function - openmcl-mop:method-function - openmcl-mop:method-lambda-list - openmcl-mop:method-specializers - openmcl-mop:method-qualifiers - ;; slot readers - openmcl-mop:slot-definition-allocation - openmcl-mop:slot-definition-documentation - openmcl-mop:slot-value-using-class - openmcl-mop:slot-definition-initargs - openmcl-mop:slot-definition-initform - openmcl-mop:slot-definition-initfunction - openmcl-mop:slot-definition-name - openmcl-mop:slot-definition-type - openmcl-mop:slot-definition-readers - openmcl-mop:slot-definition-writers - openmcl-mop:slot-boundp-using-class - openmcl-mop:slot-makunbound-using-class)) - -;;; UTF8 - -(defimplementation string-to-utf8 (string) - (ccl:encode-string-to-octets string :external-format :utf-8)) - -(defimplementation utf8-to-string (octets) - (ccl:decode-string-from-octets octets :external-format :utf-8)) - -;;; TCP Server - -(defimplementation preferred-communication-style () - :spawn) - -(defimplementation create-socket (host port &key backlog) - (ccl:make-socket :connect :passive :local-port port - :local-host host :reuse-address t - :backlog (or backlog 5))) - -(defimplementation local-port (socket) - (ccl:local-port socket)) - -(defimplementation close-socket (socket) - (close socket)) - -(defimplementation accept-connection (socket &key external-format - buffering timeout) - (declare (ignore buffering timeout)) - (let ((stream-args (and external-format - `(:external-format ,external-format)))) - (ccl:accept-connection socket :wait t :stream-args stream-args))) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -(defimplementation socket-fd (stream) - (ccl::ioblock-device (ccl::stream-ioblock stream t))) - -;;; Unix signals - -(defimplementation getpid () - (ccl::getpid)) - -(defimplementation lisp-implementation-type-name () - "ccl") - -;;; Arglist - -(defimplementation arglist (fname) - (multiple-value-bind (arglist binding) (let ((*break-on-signals* nil)) - (ccl:arglist fname)) - (if binding - arglist - :not-available))) - -(defimplementation function-name (function) - (ccl:function-name function)) - -(defmethod declaration-arglist ((decl-identifier (eql 'optimize))) - (let ((flags (ccl:declaration-information decl-identifier))) - (if flags - `(&any ,flags) - (call-next-method)))) - -;;; Compilation - -(defun handle-compiler-warning (condition) - "Resignal a ccl:compiler-warning as swank/backend:compiler-warning." - (signal 'compiler-condition - :original-condition condition - :message (compiler-warning-short-message condition) - :source-context nil - :severity (compiler-warning-severity condition) - :location (source-note-to-source-location - (ccl:compiler-warning-source-note condition) - (lambda () "Unknown source") - (ccl:compiler-warning-function-name condition)))) - -(defgeneric compiler-warning-severity (condition)) -(defmethod compiler-warning-severity ((c ccl:compiler-warning)) :warning) -(defmethod compiler-warning-severity ((c ccl:style-warning)) :style-warning) - -(defgeneric compiler-warning-short-message (condition)) - -;; Pretty much the same as ccl:report-compiler-warning but -;; without the source position and function name stuff. -(defmethod compiler-warning-short-message ((c ccl:compiler-warning)) - (with-output-to-string (stream) - (ccl:report-compiler-warning c stream :short t))) - -;; Needed because `ccl:report-compiler-warning' would return -;; "Nonspecific warning". -(defmethod compiler-warning-short-message ((c ccl::shadowed-typecase-clause)) - (princ-to-string c)) - -(defimplementation call-with-compilation-hooks (function) - (handler-bind ((ccl:compiler-warning 'handle-compiler-warning)) - (let ((ccl:*merge-compiler-warnings* nil)) - (funcall function)))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (compile-file input-file - :output-file output-file - :load load-p - :external-format external-format))) - -;; Use a temp file rather than in-core compilation in order to handle -;; eval-when's as compile-time. -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore line column policy)) - (with-compilation-hooks () - (let ((temp-file-name (ccl:temp-pathname)) - (ccl:*save-source-locations* t)) - (unwind-protect - (progn - (with-open-file (s temp-file-name :direction :output - :if-exists :error :external-format :utf-8) - (write-string string s)) - (let ((binary-filename (compile-temp-file - temp-file-name filename buffer position))) - (delete-file binary-filename))) - (delete-file temp-file-name))))) - -(defvar *temp-file-map* (make-hash-table :test #'equal) - "A mapping from tempfile names to Emacs buffer names.") - -(defun compile-temp-file (temp-file-name buffer-file-name buffer-name offset) - (compile-file temp-file-name - :load t - :compile-file-original-truename - (or buffer-file-name - (progn - (setf (gethash temp-file-name *temp-file-map*) - buffer-name) - temp-file-name)) - :compile-file-original-buffer-offset (1- offset) - :external-format :utf-8)) - -(defimplementation save-image (filename &optional restart-function) - (ccl:save-application filename :toplevel-function restart-function)) - -;;; Cross-referencing - -(defun xref-locations (relation name &optional inverse) - (delete-duplicates - (mapcan #'find-definitions - (if inverse - (ccl::get-relation relation name :wild :exhaustive t) - (ccl::get-relation relation :wild name :exhaustive t))) - :test 'equal)) - -(defimplementation who-binds (name) - (xref-locations :binds name)) - -(defimplementation who-macroexpands (name) - (xref-locations :macro-calls name t)) - -(defimplementation who-references (name) - (remove-duplicates - (append (xref-locations :references name) - (xref-locations :sets name) - (xref-locations :binds name)) - :test 'equal)) - -(defimplementation who-sets (name) - (xref-locations :sets name)) - -(defimplementation who-calls (name) - (remove-duplicates - (append - (xref-locations :direct-calls name) - (xref-locations :indirect-calls name) - (xref-locations :macro-calls name t)) - :test 'equal)) - -(defimplementation who-specializes (class) - (when (symbolp class) - (setq class (find-class class nil))) - (when class - (delete-duplicates - (mapcar (lambda (m) - (car (find-definitions m))) - (ccl:specializer-direct-methods class)) - :test 'equal))) - -(defimplementation list-callees (name) - (remove-duplicates - (append - (xref-locations :direct-calls name t) - (xref-locations :macro-calls name nil)) - :test 'equal)) - -(defimplementation list-callers (symbol) - (delete-duplicates - (mapcan #'find-definitions (ccl:caller-functions symbol)) - :test #'equal)) - -;;; Profiling (alanr: lifted from swank-clisp) - -(defimplementation profile (fname) - (eval `(swank-monitor:monitor ,fname))) ;monitor is a macro - -(defimplementation profiled-functions () - swank-monitor:*monitored-functions*) - -(defimplementation unprofile (fname) - (eval `(swank-monitor:unmonitor ,fname))) ;unmonitor is a macro - -(defimplementation unprofile-all () - (swank-monitor:unmonitor)) - -(defimplementation profile-report () - (swank-monitor:report-monitoring)) - -(defimplementation profile-reset () - (swank-monitor:reset-all-monitoring)) - -(defimplementation profile-package (package callers-p methods) - (declare (ignore callers-p methods)) - (swank-monitor:monitor-all package)) - -;;; Debugging - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let* (;;(*debugger-hook* nil) - ;; don't let error while printing error take us down - (ccl:*signal-printing-errors* nil)) - (funcall debugger-loop-fn))) - -;; This is called for an async interrupt and is running in a random -;; thread not selected by the user, so don't use thread-local vars -;; such as *emacs-connection*. -(defun find-repl-thread () - (let* ((*break-on-signals* nil) - (conn (swank::default-connection))) - (and (swank::multithreaded-connection-p conn) - (swank::mconn.repl-thread conn)))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (ccl:*break-hook* hook) - (ccl:*select-interactive-process-hook* 'find-repl-thread)) - (funcall fun))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setq ccl:*break-hook* function) - (setq ccl:*select-interactive-process-hook* 'find-repl-thread) - ) - -(defun map-backtrace (function &optional - (start-frame-number 0) - end-frame-number) - "Call FUNCTION passing information about each stack frame - from frames START-FRAME-NUMBER to END-FRAME-NUMBER." - (let ((end-frame-number (or end-frame-number most-positive-fixnum))) - (ccl:map-call-frames function - :origin ccl:*top-error-frame* - :start-frame-number start-frame-number - :count (- end-frame-number start-frame-number)))) - -(defimplementation compute-backtrace (start-frame-number end-frame-number) - (let (result) - (map-backtrace (lambda (p context) - (push (list :frame p context) result)) - start-frame-number end-frame-number) - (nreverse result))) - -(defimplementation print-frame (frame stream) - (assert (eq (first frame) :frame)) - (destructuring-bind (p context) (rest frame) - (let ((lfun (ccl:frame-function p context))) - (format stream "(~S" (or (ccl:function-name lfun) lfun)) - (let* ((unavailable (cons nil nil)) - (args (ccl:frame-supplied-arguments p context - :unknown-marker unavailable))) - (declare (dynamic-extent unavailable)) - (if (eq args unavailable) - (format stream " #") - (dolist (arg args) - (if (eq arg unavailable) - (format stream " #") - (format stream " ~s" arg))))) - (format stream ")")))) - -(defmacro with-frame ((p context) frame-number &body body) - `(call/frame ,frame-number (lambda (,p ,context) . ,body))) - -(defun call/frame (frame-number if-found) - (map-backtrace - (lambda (p context) - (return-from call/frame - (funcall if-found p context))) - frame-number)) - -(defimplementation frame-call (frame-number) - (with-frame (p context) frame-number - (with-output-to-string (stream) - (print-frame (list :frame p context) stream)))) - -(defimplementation frame-var-value (frame var) - (with-frame (p context) frame - (cdr (nth var (ccl:frame-named-variables p context))))) - -(defimplementation frame-locals (index) - (with-frame (p context) index - (loop for (name . value) in (ccl:frame-named-variables p context) - collect (list :name name :value value :id 0)))) - -(defimplementation frame-source-location (index) - (with-frame (p context) index - (multiple-value-bind (lfun pc) (ccl:frame-function p context) - (if pc - (pc-source-location lfun pc) - (function-source-location lfun))))) - -(defun function-name-package (name) - (etypecase name - (null nil) - (symbol (symbol-package name)) - ((cons (eql ccl::traced)) (function-name-package (second name))) - ((cons (eql setf)) (symbol-package (second name))) - ((cons (eql :internal)) (function-name-package (car (last name)))) - ((cons (and symbol (not keyword)) (or (cons list null) - (cons keyword (cons list null)))) - (symbol-package (car name))) - (standard-method (function-name-package (ccl:method-name name))))) - -(defimplementation frame-package (frame-number) - (with-frame (p context) frame-number - (let* ((lfun (ccl:frame-function p context)) - (name (ccl:function-name lfun))) - (function-name-package name)))) - -(defimplementation eval-in-frame (form index) - (with-frame (p context) index - (let ((vars (ccl:frame-named-variables p context))) - (eval `(let ,(loop for (var . val) in vars collect `(,var ',val)) - (declare (ignorable ,@(mapcar #'car vars))) - ,form))))) - -(defimplementation return-from-frame (index form) - (let ((values (multiple-value-list (eval-in-frame form index)))) - (with-frame (p context) index - (declare (ignore context)) - (ccl:apply-in-frame p #'values values)))) - -(defimplementation restart-frame (index) - (with-frame (p context) index - (ccl:apply-in-frame p - (ccl:frame-function p context) - (ccl:frame-supplied-arguments p context)))) - -(defimplementation disassemble-frame (the-frame-number) - (with-frame (p context) the-frame-number - (multiple-value-bind (lfun pc) (ccl:frame-function p context) - (format t "LFUN: ~a~%PC: ~a FP: #x~x CONTEXT: ~a~%" lfun pc p context) - (disassemble lfun)))) - -;; CCL commit r11373 | gz | 2008-11-16 16:35:28 +0100 (Sun, 16 Nov 2008) -;; contains some interesting details: -;; -;; Source location are recorded in CCL:SOURCE-NOTE's, which are objects -;; with accessors CCL:SOURCE-NOTE-FILENAME, CCL:SOURCE-NOTE-START-POS, -;; CCL:SOURCE-NOTE-END-POS and CCL:SOURCE-NOTE-TEXT. The start and end -;; positions are file positions (not character positions). The text will -;; be NIL unless text recording was on at read-time. If the original -;; file is still available, you can force missing source text to be read -;; from the file at runtime via CCL:ENSURE-SOURCE-NOTE-TEXT. -;; -;; Source-note's are associated with definitions (via record-source-file) -;; and also stored in function objects (including anonymous and nested -;; functions). The former can be retrieved via -;; CCL:FIND-DEFINITION-SOURCES, the latter via CCL:FUNCTION-SOURCE-NOTE. -;; -;; The recording behavior is controlled by the new variable -;; CCL:*SAVE-SOURCE-LOCATIONS*: -;; -;; If NIL, don't store source-notes in function objects, and store only -;; the filename for definitions (the latter only if -;; *record-source-file* is true). -;; -;; If T, store source-notes, including a copy of the original source -;; text, for function objects and definitions (the latter only if -;; *record-source-file* is true). -;; -;; If :NO-TEXT, store source-notes, but without saved text, for -;; function objects and defintions (the latter only if -;; *record-source-file* is true). This is the default. -;; -;; PC to source mapping is controlled by the new variable -;; CCL:*RECORD-PC-MAPPING*. If true (the default), functions store a -;; compressed table mapping pc offsets to corresponding source locations. -;; This can be retrieved by (CCL:FIND-SOURCE-NOTE-AT-PC function pc) -;; which returns a source-note for the source at offset pc in the -;; function. - -(defun function-source-location (function) - (source-note-to-source-location - (or (ccl:function-source-note function) - (function-name-source-note function)) - (lambda () - (format nil "Function has no source note: ~A" function)) - (ccl:function-name function))) - -(defun pc-source-location (function pc) - (source-note-to-source-location - (or (ccl:find-source-note-at-pc function pc) - (ccl:function-source-note function) - (function-name-source-note function)) - (lambda () - (format nil "No source note at PC: ~a[~d]" function pc)) - (ccl:function-name function))) - -(defun function-name-source-note (fun) - (let ((defs (ccl:find-definition-sources (ccl:function-name fun) 'function))) - (and defs - (destructuring-bind ((type . name) srcloc . srclocs) (car defs) - (declare (ignore type name srclocs)) - srcloc)))) - -(defun source-note-to-source-location (source if-nil-thunk &optional name) - (labels ((filename-to-buffer (filename) - (cond ((gethash filename *temp-file-map*) - (list :buffer (gethash filename *temp-file-map*))) - ((probe-file filename) - (list :file (ccl:native-translated-namestring - (truename filename)))) - (t (error "File ~s doesn't exist" filename))))) - (handler-case - (cond ((ccl:source-note-p source) - (let* ((full-text (ccl:source-note-text source)) - (file-name (ccl:source-note-filename source)) - (start-pos (ccl:source-note-start-pos source))) - (make-location - (when file-name (filename-to-buffer (pathname file-name))) - (when start-pos (list :position (1+ start-pos))) - (when full-text - (list :snippet (subseq full-text 0 - (min 40 (length full-text)))))))) - ((and source name) - ;; This branch is probably never used - (make-location - (filename-to-buffer source) - (list :function-name (princ-to-string - (if (functionp name) - (ccl:function-name name) - name))))) - (t `(:error ,(funcall if-nil-thunk)))) - (error (c) `(:error ,(princ-to-string c)))))) - -(defun alphatizer-definitions (name) - (let ((alpha (gethash name ccl::*nx1-alphatizers*))) - (and alpha (ccl:find-definition-sources alpha)))) - -(defun p2-definitions (name) - (let ((nx1-op (gethash name ccl::*nx1-operators*))) - (and nx1-op - (let ((dispatch (ccl::backend-p2-dispatch ccl::*target-backend*)) ) - (and (array-in-bounds-p dispatch nx1-op) - (let ((p2 (aref dispatch nx1-op))) - (and p2 - (ccl:find-definition-sources p2)))))))) - -(defimplementation find-definitions (name) - (let ((defs (append (or (ccl:find-definition-sources name) - (and (symbolp name) - (fboundp name) - (ccl:find-definition-sources - (symbol-function name)))) - (alphatizer-definitions name) - (p2-definitions name)))) - (loop for ((type . name) . sources) in defs - collect (list (definition-name type name) - (source-note-to-source-location - (find-if-not #'null sources) - (lambda () "No source-note available") - name))))) - -(defimplementation find-source-location (obj) - (let* ((defs (ccl:find-definition-sources obj)) - (best-def (or (find (ccl:name-of obj) defs :key #'cdar :test #'equal) - (car defs))) - (note (find-if-not #'null (cdr best-def)))) - (when note - (source-note-to-source-location - note - (lambda () "No source note available"))))) - -(defun definition-name (type object) - (case (ccl:definition-type-name type) - (method (ccl:name-of object)) - (t (list (ccl:definition-type-name type) (ccl:name-of object))))) - -;;; Utilities - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind &optional (sym symbol)) - (or (documentation sym kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (maybe-push - :function (if (fboundp symbol) - (doc 'function))) - (maybe-push - :setf (let ((setf-function-name (ccl:setf-function-spec-name - `(setf ,symbol)))) - (when (fboundp setf-function-name) - (doc 'function setf-function-name)))) - (maybe-push - :type (when (ccl:type-specifier-p symbol) - (doc 'type))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:setf - (describe (ccl:setf-function-spec-name `(setf ,symbol)))) - (:class - (describe (find-class symbol))) - (:type - (describe (or (find-class symbol nil) symbol))))) - -;; spec ::= (:defmethod {}* ({}*)) -(defun parse-defmethod-spec (spec) - (values (second spec) - (subseq spec 2 (position-if #'consp spec)) - (find-if #'consp (cddr spec)))) - -(defimplementation toggle-trace (spec) - "We currently ignore just about everything." - (let ((what (ecase (first spec) - ((setf) - spec) - ((:defgeneric) - (second spec)) - ((:defmethod) - (multiple-value-bind (name qualifiers specializers) - (parse-defmethod-spec spec) - (find-method (fdefinition name) - qualifiers - specializers)))))) - (cond ((member what (trace) :test #'equal) - (ccl::%untrace what) - (format nil "~S is now untraced." what)) - (t - (ccl:trace-function what) - (format nil "~S is now traced." what))))) - -;;; Macroexpansion - -(defimplementation macroexpand-all (form &optional env) - (ccl:macroexpand-all form env)) - -;;;; Inspection - -(defun comment-type-p (type) - (or (eq type :comment) - (and (consp type) (eq (car type) :comment)))) - -(defmethod emacs-inspect ((o t)) - (let* ((inspector:*inspector-disassembly* t) - (i (inspector:make-inspector o)) - (count (inspector:compute-line-count i))) - (loop for l from 0 below count append - (multiple-value-bind (value label type) (inspector:line-n i l) - (etypecase type - ((member nil :normal) - `(,(or label "") (:value ,value) (:newline))) - ((member :colon) - (label-value-line label value)) - ((member :static) - (list (princ-to-string label) " " `(:value ,value) '(:newline))) - ((satisfies comment-type-p) - (list (princ-to-string label) '(:newline)))))))) - -(defmethod emacs-inspect :around ((o t)) - (if (or (uvector-inspector-p o) - (not (ccl:uvectorp o))) - (call-next-method) - (let ((value (call-next-method))) - (cond ((listp value) - (append value - `((:newline) - (:value ,(make-instance 'uvector-inspector :object o) - "Underlying UVECTOR")))) - (t value))))) - -(defmethod emacs-inspect ((f function)) - (append - (label-value-line "Name" (function-name f)) - `("Its argument list is: " - ,(princ-to-string (arglist f)) (:newline)) - (label-value-line "Documentation" (documentation f t)) - (when (function-lambda-expression f) - (label-value-line "Lambda Expression" - (function-lambda-expression f))) - (when (ccl:function-source-note f) - (label-value-line "Source note" - (ccl:function-source-note f))) - (when (typep f 'ccl:compiled-lexical-closure) - (append - (label-value-line "Inner function" (ccl::closure-function f)) - '("Closed over values:" (:newline)) - (loop for (name value) in (ccl::closure-closed-over-values f) - append (label-value-line (format nil " ~a" name) - value)))))) - -(defclass uvector-inspector () - ((object :initarg :object))) - -(defgeneric uvector-inspector-p (object) - (:method ((object t)) nil) - (:method ((object uvector-inspector)) t)) - -(defmethod emacs-inspect ((uv uvector-inspector)) - (with-slots (object) uv - (loop for i below (ccl:uvsize object) append - (label-value-line (princ-to-string i) (ccl:uvref object i))))) - -(defimplementation type-specifier-p (symbol) - (or (ccl:type-specifier-p symbol) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -;;; Multiprocessing - -(defvar *known-processes* - (make-hash-table :size 20 :weak :key :test #'eq) - "A map from threads to mailboxes.") - -(defvar *known-processes-lock* (ccl:make-lock "*known-processes-lock*")) - -(defstruct (mailbox (:conc-name mailbox.)) - (mutex (ccl:make-lock "thread mailbox")) - (semaphore (ccl:make-semaphore)) - (queue '() :type list)) - -(defimplementation spawn (fun &key name) - (ccl:process-run-function (or name "Anonymous (Swank)") - fun)) - -(defimplementation thread-id (thread) - (ccl:process-serial-number thread)) - -(defimplementation find-thread (id) - (find id (ccl:all-processes) :key #'ccl:process-serial-number)) - -(defimplementation thread-name (thread) - (ccl:process-name thread)) - -(defimplementation thread-status (thread) - (format nil "~A" (ccl:process-whostate thread))) - -(defimplementation thread-attributes (thread) - (list :priority (ccl:process-priority thread))) - -(defimplementation make-lock (&key name) - (ccl:make-lock name)) - -(defimplementation call-with-lock-held (lock function) - (ccl:with-lock-grabbed (lock) - (funcall function))) - -(defimplementation current-thread () - ccl:*current-process*) - -(defimplementation all-threads () - (ccl:all-processes)) - -(defimplementation kill-thread (thread) - ;;(ccl:process-kill thread) ; doesn't cut it - (ccl::process-initial-form-exited thread :kill)) - -(defimplementation thread-alive-p (thread) - (not (ccl:process-exhausted-p thread))) - -(defimplementation interrupt-thread (thread function) - (ccl:process-interrupt - thread - (lambda () - (let ((ccl:*top-error-frame* (ccl::%current-exception-frame))) - (funcall function))))) - -(defun mailbox (thread) - (ccl:with-lock-grabbed (*known-processes-lock*) - (or (gethash thread *known-processes*) - (setf (gethash thread *known-processes*) (make-mailbox))))) - -(defimplementation send (thread message) - (assert message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (ccl:with-lock-grabbed (mutex) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (ccl:signal-semaphore (mailbox.semaphore mbox))))) - -(defimplementation wake-thread (thread) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (ccl:with-lock-grabbed (mutex) - (ccl:signal-semaphore (mailbox.semaphore mbox))))) - -(defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox ccl:*current-process*)) - (mutex (mailbox.mutex mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (ccl:with-lock-grabbed (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) - (nconc (ldiff q tail) (cdr tail))) - (return (car tail))))) - (when (eq timeout t) (return (values nil t))) - (ccl:wait-on-semaphore (mailbox.semaphore mbox))))) - -(let ((alist '()) - (lock (ccl:make-lock "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (ccl:with-lock-grabbed (lock) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (ccl:process - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (ccl:with-lock-grabbed (lock) - (cdr (assoc name alist))))) - -(defimplementation set-default-initial-binding (var form) - (eval `(ccl::def-standard-initial-binding ,var ,form))) - -(defimplementation quit-lisp () - (ccl:quit)) - -(defimplementation set-default-directory (directory) - (let ((dir (truename (merge-pathnames directory)))) - (setf *default-pathname-defaults* (truename (merge-pathnames directory))) - (ccl:cwd dir) - (default-directory))) - -;;; Weak datastructures - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak :key args)) - -(defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :weak :value args)) - -(defimplementation hash-table-weakness (hashtable) - (ccl:hash-table-weak-p hashtable)) - -(pushnew 'deinit-log-output ccl:*save-exit-functions*) diff --git a/elpa/slime-20200414.1444/swank/clasp.lisp b/elpa/slime-20200414.1444/swank/clasp.lisp deleted file mode 100644 index 3677caba..00000000 --- a/elpa/slime-20200414.1444/swank/clasp.lisp +++ /dev/null @@ -1,716 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-clasp.lisp --- SLIME backend for CLASP. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -;;; Administrivia - -(defpackage swank/clasp - (:use cl swank/backend)) - -(in-package swank/clasp) - -#+(or) -(eval-when (:compile-toplevel :load-toplevel :execute) - (setq swank::*log-output* (open "/tmp/slime.log" :direction :output)) - (setq swank:*log-events* t)) - -(defmacro slime-dbg (fmt &rest args) - `(swank::log-event "slime-dbg ~a ~a~%" mp:*current-process* (apply #'format nil ,fmt ,args))) - -;; Hard dependencies. -(eval-when (:compile-toplevel :load-toplevel :execute) - (require 'sockets)) - -;; Soft dependencies. -(eval-when (:compile-toplevel :load-toplevel :execute) - (when (probe-file "sys:profile.fas") - (require :profile) - (pushnew :profile *features*)) - (when (probe-file "sys:serve-event") - (require :serve-event) - (pushnew :serve-event *features*))) - -(declaim (optimize (debug 3))) - -;;; Swank-mop - -(eval-when (:compile-toplevel :load-toplevel :execute) - (import-swank-mop-symbols :clos nil)) - -(defimplementation gray-package-name () - "GRAY") - - -;;;; TCP Server - -(defimplementation preferred-communication-style () - :spawn -#| #+threads :spawn - #-threads nil -|# - ) - -(defun resolve-hostname (name) - (car (sb-bsd-sockets:host-ent-addresses - (sb-bsd-sockets:get-host-by-name name)))) - -(defimplementation create-socket (host port &key backlog) - (let ((socket (make-instance 'sb-bsd-sockets:inet-socket - :type :stream - :protocol :tcp))) - (setf (sb-bsd-sockets:sockopt-reuse-address socket) t) - (sb-bsd-sockets:socket-bind socket (resolve-hostname host) port) - (sb-bsd-sockets:socket-listen socket (or backlog 5)) - socket)) - -(defimplementation local-port (socket) - (nth-value 1 (sb-bsd-sockets:socket-name socket))) - -(defimplementation close-socket (socket) - (sb-bsd-sockets:socket-close socket)) - -(defimplementation accept-connection (socket - &key external-format - buffering timeout) - (declare (ignore timeout)) - (sb-bsd-sockets:socket-make-stream (accept socket) - :output t - :input t - :buffering (ecase buffering - ((t) :full) - ((nil) :none) - (:line :line)) - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format external-format)) -(defun accept (socket) - "Like socket-accept, but retry on EAGAIN." - (loop (handler-case - (return (sb-bsd-sockets:socket-accept socket)) - (sb-bsd-sockets:interrupted-error ())))) - -(defimplementation socket-fd (socket) - (etypecase socket - (fixnum socket) - (two-way-stream (socket-fd (two-way-stream-input-stream socket))) - (sb-bsd-sockets:socket (sb-bsd-sockets:socket-file-descriptor socket)) - (file-stream (si:file-stream-fd socket)))) - -(defvar *external-format-to-coding-system* - '((:latin-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix"))) - -(defun external-format (coding-system) - (or (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*)) - (find coding-system (ext:all-encodings) :test #'string-equal))) - -(defimplementation find-external-format (coding-system) - #+unicode (external-format coding-system) - ;; Without unicode support, CLASP uses the one-byte encoding of the - ;; underlying OS, and will barf on anything except :DEFAULT. We - ;; return NIL here for known multibyte encodings, so - ;; SWANK:CREATE-SERVER will barf. - #-unicode (let ((xf (external-format coding-system))) - (if (member xf '(:utf-8)) - nil - :default))) - - -;;;; Unix Integration - -;;; If CLASP is built with thread support, it'll spawn a helper thread -;;; executing the SIGINT handler. We do not want to BREAK into that -;;; helper but into the main thread, though. This is coupled with the -;;; current choice of NIL as communication-style in so far as CLASP's -;;; main-thread is also the Slime's REPL thread. - -#+clasp-working -(defimplementation call-with-user-break-handler (real-handler function) - (let ((old-handler #'si:terminal-interrupt)) - (setf (symbol-function 'si:terminal-interrupt) - (make-interrupt-handler real-handler)) - (unwind-protect (funcall function) - (setf (symbol-function 'si:terminal-interrupt) old-handler)))) - -#+threads -(defun make-interrupt-handler (real-handler) - (let ((main-thread (find 'si:top-level (mp:all-processes) - :key #'mp:process-name))) - #'(lambda (&rest args) - (declare (ignore args)) - (mp:interrupt-process main-thread real-handler)))) - -#-threads -(defun make-interrupt-handler (real-handler) - #'(lambda (&rest args) - (declare (ignore args)) - (funcall real-handler))) - - -(defimplementation getpid () - (si:getpid)) - -(defimplementation set-default-directory (directory) - (ext:chdir (namestring directory)) ; adapts *DEFAULT-PATHNAME-DEFAULTS*. - (default-directory)) - -(defimplementation default-directory () - (namestring (ext:getcwd))) - -(defimplementation quit-lisp () - (core:quit)) - - - -;;; Instead of busy waiting with communication-style NIL, use select() -;;; on the sockets' streams. -#+serve-event -(progn - (defun poll-streams (streams timeout) - (let* ((serve-event::*descriptor-handlers* - (copy-list serve-event::*descriptor-handlers*)) - (active-fds '()) - (fd-stream-alist - (loop for s in streams - for fd = (socket-fd s) - collect (cons fd s) - do (serve-event:add-fd-handler fd :input - #'(lambda (fd) - (push fd active-fds)))))) - (serve-event:serve-event timeout) - (loop for fd in active-fds collect (cdr (assoc fd fd-stream-alist))))) - - (defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout (return (poll-streams streams 0))) - (t - (when-let (ready (poll-streams streams 0.2)) - (return ready)))))) - -) ; #+serve-event (progn ... - -#-serve-event -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout (return (remove-if-not #'listen streams))) - (t - (let ((ready (remove-if-not #'listen streams))) - (if ready (return ready)) - (sleep 0.1)))))) - - -;;;; Compilation - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) - -(defun condition-severity (condition) - (etypecase condition - (cmp:redefined-function-warning :redefinition) - (style-warning :style-warning) - (warning :warning) - (reader-error :read-error) - (error :error))) - -(defun condition-location (origin) - (if (null origin) - (make-error-location "No error location available") - ;; NOTE: If we're compiling in a buffer, the origin - ;; will already be set up with the offset correctly - ;; due to the :source-debug parameters from - ;; swank-compile-string (below). - (make-file-location - (core:file-scope-pathname - (core:file-scope origin)) - (core:source-pos-info-filepos origin)))) - -(defun signal-compiler-condition (condition origin) - (signal 'compiler-condition - :original-condition condition - :severity (condition-severity condition) - :message (princ-to-string condition) - :location (condition-location origin))) - -(defun handle-compiler-condition (condition) - ;; First resignal warnings, so that outer handlers - which may choose to - ;; muffle this - get a chance to run. - (when (typep condition 'warning) - (signal condition)) - (signal-compiler-condition (cmp:deencapsulate-compiler-condition condition) - (cmp:compiler-condition-origin condition))) - -(defimplementation call-with-compilation-hooks (function) - (handler-bind - (((or error warning) #'handle-compiler-condition)) - (funcall function))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (format t "Compiling file input-file = ~a output-file = ~a~%" input-file output-file) - ;; Ignore the output-file and generate our own - (let ((tmp-output-file (compile-file-pathname (si:mkstemp "TMP:clasp-swank-compile-file-")))) - (format t "Using tmp-output-file: ~a~%" tmp-output-file) - (multiple-value-bind (fasl warnings-p failure-p) - (with-compilation-hooks () - (compile-file input-file :output-file tmp-output-file - :external-format external-format)) - (values fasl warnings-p - (or failure-p - (when load-p - (not (load fasl)))))))) - -(defvar *tmpfile-map* (make-hash-table :test #'equal)) - -(defun note-buffer-tmpfile (tmp-file buffer-name) - ;; EXT:COMPILED-FUNCTION-FILE below will return a namestring. - (let ((tmp-namestring (namestring (truename tmp-file)))) - (setf (gethash tmp-namestring *tmpfile-map*) buffer-name) - tmp-namestring)) - -(defun tmpfile-to-buffer (tmp-file) - (gethash tmp-file *tmpfile-map*)) - -(defimplementation swank-compile-string (string &key buffer position filename line column policy) - (declare (ignore column policy)) ;; We may use column in the future - (with-compilation-hooks () - (let ((*buffer-name* buffer) ; for compilation hooks - (*buffer-start-position* position)) - (let ((tmp-file (si:mkstemp "TMP:clasp-swank-tmpfile-")) - (fasl-file) - (warnings-p) - (failure-p)) - (unwind-protect - (with-open-file (tmp-stream tmp-file :direction :output - :if-exists :supersede) - (write-string string tmp-stream) - (finish-output tmp-stream) - (multiple-value-setq (fasl-file warnings-p failure-p) - (let ((truename (or filename (note-buffer-tmpfile tmp-file buffer)))) - (compile-file tmp-file - :source-debug-pathname (pathname truename) - ;; emacs numbers are 1-based instead of 0-based, - ;; so we have to subtract - :source-debug-lineno (1- line) - :source-debug-offset (1- position))))) - (when fasl-file (load fasl-file)) - (when (probe-file tmp-file) - (delete-file tmp-file)) - (when fasl-file - (delete-file fasl-file))) - (not failure-p))))) - -;;;; Documentation - -(defimplementation arglist (name) - (multiple-value-bind (arglist foundp) - (core:function-lambda-list name) ;; Uses bc-split - (if foundp arglist :not-available))) - -(defimplementation function-name (f) - (typecase f - (generic-function (clos::generic-function-name f)) - (function (ext:compiled-function-name f)))) - -;; FIXME -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (macroexpand form)) - -;;; modified from sbcl.lisp -(defimplementation collect-macro-forms (form &optional environment) - (let ((macro-forms '()) - (compiler-macro-forms '()) - (function-quoted-forms '())) - (format t "In collect-macro-forms~%") - (cmp:code-walk - (lambda (form environment) - (when (and (consp form) - (symbolp (car form))) - (cond ((eq (car form) 'function) - (push (cadr form) function-quoted-forms)) - ((member form function-quoted-forms) - nil) - ((macro-function (car form) environment) - (push form macro-forms)) - ((not (eq form (core:compiler-macroexpand-1 form environment))) - (push form compiler-macro-forms)))) - form) - form environment) - (values macro-forms compiler-macro-forms))) - - - - - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((frob (type boundp) - (when (funcall boundp symbol) - (let ((doc (describe-definition symbol type))) - (setf result (list* type doc result)))))) - (frob :VARIABLE #'boundp) - (frob :FUNCTION #'fboundp) - (frob :CLASS (lambda (x) (find-class x nil)))) - result)) - -(defimplementation describe-definition (name type) - (case type - (:variable (documentation name 'variable)) - (:function (documentation name 'function)) - (:class (documentation name 'class)) - (t nil))) - -(defimplementation type-specifier-p (symbol) - (or (subtypep nil symbol) - (not (eq (type-specifier-arglist symbol) :not-available)))) - - -;;; Debugging - -(defun make-invoke-debugger-hook (hook) - (when hook - #'(lambda (condition old-hook) - ;; Regard *debugger-hook* if set by user. - (if *debugger-hook* - nil ; decline, *DEBUGGER-HOOK* will be tried next. - (funcall hook condition old-hook))))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setq ext:*invoke-debugger-hook* (make-invoke-debugger-hook function))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (ext:*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - (funcall fun))) - -(defvar *backtrace* '()) - -;;; Commented out; it's not clear this is a good way of doing it. In -;;; particular because it makes errors stemming from this file harder -;;; to debug, and given the "young" age of CLASP's swank backend, that's -;;; a bad idea. - -;; (defun in-swank-package-p (x) -;; (and -;; (symbolp x) -;; (member (symbol-package x) -;; (list #.(find-package :swank) -;; #.(find-package :swank/backend) -;; #.(ignore-errors (find-package :swank-mop)) -;; #.(ignore-errors (find-package :swank-loader)))) -;; t)) - -;; (defun is-swank-source-p (name) -;; (setf name (pathname name)) -;; (pathname-match-p -;; name -;; (make-pathname :defaults swank-loader::*source-directory* -;; :name (pathname-name name) -;; :type (pathname-type name) -;; :version (pathname-version name)))) - -;; (defun is-ignorable-fun-p (x) -;; (or -;; (in-swank-package-p (frame-name x)) -;; (multiple-value-bind (file position) -;; (ignore-errors (si::bc-file (car x))) -;; (declare (ignore position)) -;; (if file (is-swank-source-p file))))) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (declare (type function debugger-loop-fn)) - (clasp-debug:with-stack (stack) - (let ((*backtrace* (clasp-debug:list-stack stack))) - (funcall debugger-loop-fn)))) - -(defimplementation compute-backtrace (start end) - (subseq *backtrace* start - (and (numberp end) - (min end (length *backtrace*))))) - -(defun frame-from-number (frame-number) - (elt *backtrace* frame-number)) - -(defimplementation print-frame (frame stream) - (clasp-debug:prin1-frame-call frame stream)) - -(defimplementation frame-source-location (frame-number) - (let ((csl (clasp-debug:frame-source-position (frame-from-number frame-number)))) - (if (clasp-debug:code-source-line-pathname csl) - (make-location (list :file (namestring (clasp-debug:code-source-line-pathname csl))) - (list :line (clasp-debug:code-source-line-line-number csl)) - '(:align t)) - `(:error ,(format nil "No source for frame: ~a" frame-number))))) - -(defimplementation frame-locals (frame-number) - (loop for (var . value) - in (clasp-debug:frame-locals (frame-from-number frame-number)) - for i from 0 - collect (list :name var :id i :value value))) - -(defimplementation frame-var-value (frame-number var-number) - (let* ((frame (frame-from-number frame-number)) - (locals (clasp-debug:frame-locals frame))) - (cdr (nth var-number locals)))) - -(defimplementation disassemble-frame (frame-number) - (clasp-debug:disassemble-frame (frame-from-number frame-number))) - -(defimplementation eval-in-frame (form frame-number) - (let* ((frame (frame-from-number frame-number))) - (eval - `(let (,@(loop for (var . value) - in (clasp-debug:frame-locals frame) - collect `(,var ',value))) - (progn ,form))))) - -#+clasp-working -(defimplementation gdb-initial-commands () - ;; These signals are used by the GC. - #+linux '("handle SIGPWR noprint nostop" - "handle SIGXCPU noprint nostop")) - -#+clasp-working -(defimplementation command-line-args () - (loop for n from 0 below (si:argc) collect (si:argv n))) - - -;;;; Inspector - -;;; FIXME: Would be nice if it was possible to inspect objects -;;; implemented in C. - - -;;;; Definitions - -(defun make-file-location (file file-position) - ;; File positions in CL start at 0, but Emacs' buffer positions - ;; start at 1. We specify (:ALIGN T) because the positions comming - ;; from CLASP point at right after the toplevel form appearing before - ;; the actual target toplevel form; (:ALIGN T) will DTRT in that case. - (make-location `(:file ,(namestring (translate-logical-pathname file))) - `(:position ,(1+ file-position)) - `(:align t))) - -(defun make-buffer-location (buffer-name start-position &optional (offset 0)) - (make-location `(:buffer ,buffer-name) - `(:offset ,start-position ,offset) - `(:align t))) - -(defun translate-location (location) - (make-location (list :file (namestring (ext:source-location-pathname location))) - (list :position (ext:source-location-offset location)) - '(:align t))) - -(defun make-dspec (name location) - (list* (ext:source-location-definer location) - name - (ext:source-location-description location))) - -(defimplementation find-definitions (name) - (loop for kind in ext:*source-location-kinds* - for locations = (ext:source-location name kind) - when locations - nconc (loop for location in locations - collect (list (make-dspec name location) - (translate-location location))))) - -(defun source-location (object) - (let ((location (ext:source-location object t))) - (when location - (translate-location (car location))))) - -(defimplementation find-source-location (object) - (or (source-location object) - (make-error-location "Source definition of ~S not found." object))) - - -;;;; Profiling - -#+profile -(progn - -(defimplementation profile (fname) - (when fname (eval `(profile:profile ,fname)))) - -(defimplementation unprofile (fname) - (when fname (eval `(profile:unprofile ,fname)))) - -(defimplementation unprofile-all () - (profile:unprofile-all) - "All functions unprofiled.") - -(defimplementation profile-report () - (profile:report)) - -(defimplementation profile-reset () - (profile:reset) - "Reset profiling counters.") - -(defimplementation profiled-functions () - (profile:profile)) - -(defimplementation profile-package (package callers methods) - (declare (ignore callers methods)) - (eval `(profile:profile ,(package-name (find-package package))))) -) ; #+profile (progn ... - - -;;;; Threads - -#+threads -(progn - (defvar *thread-id-counter* 0) - - (defparameter *thread-id-map* (make-hash-table)) - - (defvar *thread-id-map-lock* - (mp:make-lock :name "thread id map lock")) - - (defimplementation spawn (fn &key name) - (mp:process-run-function name fn)) - - (defimplementation thread-id (target-thread) - (block thread-id - (mp:with-lock (*thread-id-map-lock*) - ;; Does TARGET-THREAD have an id already? - (maphash (lambda (id thread-pointer) - (let ((thread (si:weak-pointer-value thread-pointer))) - (cond ((not thread) - (remhash id *thread-id-map*)) - ((eq thread target-thread) - (return-from thread-id id))))) - *thread-id-map*) - ;; TARGET-THREAD not found in *THREAD-ID-MAP* - (let ((id (incf *thread-id-counter*)) - (thread-pointer (si:make-weak-pointer target-thread))) - (setf (gethash id *thread-id-map*) thread-pointer) - id)))) - - (defimplementation find-thread (id) - (mp:with-lock (*thread-id-map-lock*) - (let* ((thread-ptr (gethash id *thread-id-map*)) - (thread (and thread-ptr (si:weak-pointer-value thread-ptr)))) - (unless thread - (remhash id *thread-id-map*)) - thread))) - - (defimplementation thread-name (thread) - (mp:process-name thread)) - - (defimplementation thread-status (thread) - (if (mp:process-active-p thread) - "RUNNING" - "STOPPED")) - - (defimplementation make-lock (&key name) - (mp:make-recursive-mutex name)) - - (defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (mp:with-lock (lock) (funcall function))) - - (defimplementation current-thread () - mp:*current-process*) - - (defimplementation all-threads () - (mp:all-processes)) - - (defimplementation interrupt-thread (thread fn) - (mp:interrupt-process thread fn)) - - (defimplementation kill-thread (thread) - (mp:process-kill thread)) - - (defimplementation thread-alive-p (thread) - (mp:process-active-p thread)) - - (defvar *mailbox-lock* (mp:make-lock :name "mailbox lock")) - (defvar *mailboxes* (list)) - (declaim (type list *mailboxes*)) - - (defstruct (mailbox (:conc-name mailbox.)) - thread - (mutex (mp:make-lock :name "SLIMELCK")) - (cvar (mp:make-condition-variable)) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-lock (*mailbox-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - - (defimplementation wake-thread (thread) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (format t "About to with-lock in wake-thread~%") - (mp:with-lock (mutex) - (format t "In wake-thread~%") - (mp:condition-variable-broadcast (mailbox.cvar mbox))))) - - (defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (swank::log-event "clasp.lisp: send message ~a mutex: ~a~%" message mutex) - (swank::log-event "clasp.lisp: (lock-owner mutex) -> ~a~%" (mp:lock-owner mutex)) - (swank::log-event "clasp.lisp: (lock-count mutex) -> ~a~%" (mp:lock-count mutex)) - (mp:with-lock (mutex) - (swank::log-event "clasp.lisp: in with-lock (lock-owner mutex) -> ~a~%" (mp:lock-owner mutex)) - (swank::log-event "clasp.lisp: in with-lock (lock-count mutex) -> ~a~%" (mp:lock-count mutex)) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (swank::log-event "clasp.lisp: send about to broadcast~%") - (mp:condition-variable-broadcast (mailbox.cvar mbox))))) - - - (defimplementation receive-if (test &optional timeout) - (slime-dbg "Entered receive-if") - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox))) - (slime-dbg "receive-if assert") - (assert (or (not timeout) (eq timeout t))) - (loop - (slime-dbg "receive-if check-slime-interrupts") - (check-slime-interrupts) - (slime-dbg "receive-if with-lock") - (mp:with-lock (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (slime-dbg "receive-if when (eq") - (when (eq timeout t) (return (values nil t))) - (slime-dbg "receive-if condition-variable-timedwait") - (mp:condition-variable-wait (mailbox.cvar mbox) mutex) ; timedwait 0.2 - (slime-dbg "came out of condition-variable-timedwait") - (core:check-pending-interrupts))))) - - ) ; #+threads (progn ... - - -(defmethod emacs-inspect ((object core:cxx-object)) - (let ((encoded (core:encode object))) - (loop for (key . value) in encoded - append (list (string key) ": " (list :value value) (list :newline))))) - -(defmethod emacs-inspect ((object core:va-list)) - (emacs-inspect (core:list-from-va-list object))) diff --git a/elpa/slime-20200414.1444/swank/clisp.lisp b/elpa/slime-20200414.1444/swank/clisp.lisp deleted file mode 100644 index 6e23b801..00000000 --- a/elpa/slime-20200414.1444/swank/clisp.lisp +++ /dev/null @@ -1,930 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- - -;;;; SWANK support for CLISP. - -;;;; Copyright (C) 2003, 2004 W. Jenkner, V. Sedach - -;;;; This program is free software; you can redistribute it and/or -;;;; modify it under the terms of the GNU General Public License as -;;;; published by the Free Software Foundation; either version 2 of -;;;; the License, or (at your option) any later version. - -;;;; This program is distributed in the hope that it will be useful, -;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;;; GNU General Public License for more details. - -;;;; You should have received a copy of the GNU General Public -;;;; License along with this program; if not, write to the Free -;;;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -;;;; MA 02111-1307, USA. - -;;; This is work in progress, but it's already usable. Many things -;;; are adapted from other swank-*.lisp, in particular from -;;; swank-allegro (I don't use allegro at all, but it's the shortest -;;; one and I found Helmut Eller's code there enlightening). - -;;; This code will work better with recent versions of CLISP (say, the -;;; last release or CVS HEAD) while it may not work at all with older -;;; versions. It is reasonable to expect it to work on platforms with -;;; a "SOCKET" package, in particular on GNU/Linux or Unix-like -;;; systems, but also on Win32. This backend uses the portable xref -;;; from the CMU AI repository and metering.lisp from CLOCC [1], which -;;; are conveniently included in SLIME. - -;;; [1] http://cvs.sourceforge.net/viewcvs.py/clocc/clocc/src/tools/metering/ - -(defpackage swank/clisp - (:use cl swank/backend)) - -(in-package swank/clisp) - -(eval-when (:compile-toplevel) - (unless (string< "2.44" (lisp-implementation-version)) - (error "Need at least CLISP version 2.44"))) - -(defimplementation gray-package-name () - "GRAY") - -;;;; if this lisp has the complete CLOS then we use it, otherwise we -;;;; build up a "fake" swank-mop and then override the methods in the -;;;; inspector. - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defvar *have-mop* - (and (find-package :clos) - (eql :external - (nth-value 1 (find-symbol (string ':standard-slot-definition) - :clos)))) - "True in those CLISP images which have a complete MOP implementation.")) - -#+#.(cl:if swank/clisp::*have-mop* '(cl:and) '(cl:or)) -(progn - (import-swank-mop-symbols :clos '(:slot-definition-documentation)) - - (defun swank-mop:slot-definition-documentation (slot) - (clos::slot-definition-documentation slot))) - -#-#.(cl:if swank/clisp::*have-mop* '(and) '(or)) -(defclass swank-mop:standard-slot-definition () - () - (:documentation - "Dummy class created so that swank.lisp will compile and load.")) - -(let ((getpid (or (find-symbol "PROCESS-ID" :system) - ;; old name prior to 2005-03-01, clisp <= 2.33.2 - (find-symbol "PROGRAM-ID" :system) - #+win32 ; integrated into the above since 2005-02-24 - (and (find-package :win32) ; optional modules/win32 - (find-symbol "GetCurrentProcessId" :win32))))) - (defimplementation getpid () ; a required interface - (cond - (getpid (funcall getpid)) - #+win32 ((ext:getenv "PID")) ; where does that come from? - (t -1)))) - -(defimplementation call-with-user-break-handler (handler function) - (handler-bind ((system::simple-interrupt-condition - (lambda (c) - (declare (ignore c)) - (funcall handler) - (when (find-restart 'socket-status) - (invoke-restart (find-restart 'socket-status))) - (continue)))) - (funcall function))) - -(defimplementation lisp-implementation-type-name () - "clisp") - -(defimplementation set-default-directory (directory) - (setf (ext:default-directory) directory) - (namestring (setf *default-pathname-defaults* (ext:default-directory)))) - -(defimplementation filename-to-pathname (string) - (cond ((member :cygwin *features*) - (parse-cygwin-filename string)) - (t (parse-namestring string)))) - -(defun parse-cygwin-filename (string) - (multiple-value-bind (match _ drive absolute) - (regexp:match "^(([a-zA-Z\\]+):)?([\\/])?" string :extended t) - (declare (ignore _)) - (assert (and match (if drive absolute t)) () - "Invalid filename syntax: ~a" string) - (let* ((sans-prefix (subseq string (regexp:match-end match))) - (path (remove "" (regexp:regexp-split "[\\/]" sans-prefix))) - (path (loop for name in path collect - (cond ((equal name "..") ':back) - (t name)))) - (directoryp (or (equal string "") - (find (aref string (1- (length string))) "\\/")))) - (multiple-value-bind (file type) - (cond ((and (not directoryp) (last path)) - (let* ((file (car (last path))) - (pos (position #\. file :from-end t))) - (cond ((and pos (> pos 0)) - (values (subseq file 0 pos) - (subseq file (1+ pos)))) - (t file))))) - (make-pathname :host nil - :device nil - :directory (cons - (if absolute :absolute :relative) - (let ((path (if directoryp - path - (butlast path)))) - (if drive - (cons - (regexp:match-string string drive) - path) - path))) - :name file - :type type))))) - -;;;; UTF - -(defimplementation string-to-utf8 (string) - (let ((enc (load-time-value - (ext:make-encoding :charset "utf-8" :line-terminator :unix) - t))) - (ext:convert-string-to-bytes string enc))) - -(defimplementation utf8-to-string (octets) - (let ((enc (load-time-value - (ext:make-encoding :charset "utf-8" :line-terminator :unix) - t))) - (ext:convert-string-from-bytes octets enc))) - -;;;; TCP Server - -(defimplementation create-socket (host port &key backlog) - (socket:socket-server port :interface host :backlog (or backlog 5))) - -(defimplementation local-port (socket) - (socket:socket-server-port socket)) - -(defimplementation close-socket (socket) - (socket:socket-server-close socket)) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (declare (ignore buffering timeout)) - (socket:socket-accept socket - :buffered buffering ;; XXX may not work if t - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format (or external-format :default))) - -#-win32 -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (let ((streams (mapcar (lambda (s) (list* s :input nil)) streams))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout - (socket:socket-status streams 0 0) - (return (loop for (s nil . x) in streams - if x collect s))) - (t - (with-simple-restart (socket-status "Return from socket-status.") - (socket:socket-status streams 0 500000)) - (let ((ready (loop for (s nil . x) in streams - if x collect s))) - (when ready (return ready)))))))) - -#+win32 -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (t - (let ((ready (remove-if-not #'input-available-p streams))) - (when ready (return ready))) - (when timeout (return nil)) - (sleep 0.1))))) - -#+win32 -;; Some facts to remember (for the next time we need to debug this): -;; - interactive-sream-p returns t for socket-streams -;; - listen returns nil for socket-streams -;; - (type-of ) is 'stream -;; - (type-of *terminal-io*) is 'two-way-stream -;; - stream-element-type on our sockets is usually (UNSIGNED-BYTE 8) -;; - calling socket:socket-status on non sockets signals an error, -;; but seems to mess up something internally. -;; - calling read-char-no-hang on sockets does not signal an error, -;; but seems to mess up something internally. -(defun input-available-p (stream) - (case (stream-element-type stream) - (character - (let ((c (read-char-no-hang stream nil nil))) - (cond ((not c) - nil) - (t - (unread-char c stream) - t)))) - (t - (eq (socket:socket-status (cons stream :input) 0 0) - :input)))) - -;;;; Coding systems - -(defvar *external-format-to-coding-system* - '(((:charset "iso-8859-1" :line-terminator :unix) - "latin-1-unix" "iso-latin-1-unix" "iso-8859-1-unix") - ((:charset "iso-8859-1") - "latin-1" "iso-latin-1" "iso-8859-1") - ((:charset "utf-8") "utf-8") - ((:charset "utf-8" :line-terminator :unix) "utf-8-unix") - ((:charset "euc-jp") "euc-jp") - ((:charset "euc-jp" :line-terminator :unix) "euc-jp-unix") - ((:charset "us-ascii") "us-ascii") - ((:charset "us-ascii" :line-terminator :unix) "us-ascii-unix"))) - -(defimplementation find-external-format (coding-system) - (let ((args (car (rassoc-if (lambda (x) - (member coding-system x :test #'equal)) - *external-format-to-coding-system*)))) - (and args (apply #'ext:make-encoding args)))) - - -;;;; Swank functions - -(defimplementation arglist (fname) - (block nil - (or (ignore-errors - (let ((exp (function-lambda-expression fname))) - (and exp (return (second exp))))) - (ignore-errors - (return (ext:arglist fname))) - :not-available))) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (ext:expand-form form)) - -(defimplementation collect-macro-forms (form &optional env) - ;; Currently detects only normal macros, not compiler macros. - (declare (ignore env)) - (with-collected-macro-forms (macro-forms) - (handler-bind ((warning #'muffle-warning)) - (ignore-errors - (compile nil `(lambda () ,form)))) - (values macro-forms nil))) - -(defimplementation describe-symbol-for-emacs (symbol) - "Return a plist describing SYMBOL. -Return NIL if the symbol is unbound." - (let ((result ())) - (flet ((doc (kind) - (or (documentation symbol kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push :variable (when (boundp symbol) (doc 'variable))) - (when (fboundp symbol) - (maybe-push - ;; Report WHEN etc. as macros, even though they may be - ;; implemented as special operators. - (if (macro-function symbol) :macro - (typecase (fdefinition symbol) - (generic-function :generic-function) - (function :function) - ;; (type-of 'progn) -> ext:special-operator - (t :special-operator))) - (doc 'function))) - (when (or (get symbol 'system::setf-function) ; e.g. #'(setf elt) - (get symbol 'system::setf-expander)); defsetf - (maybe-push :setf (doc 'setf))) - (when (or (get symbol 'system::type-symbol); cf. clisp/src/describe.lisp - (get symbol 'system::defstruct-description) - (get symbol 'system::deftype-expander)) - (maybe-push :type (doc 'type))) ; even for 'structure - (when (find-class symbol nil) - (maybe-push :class (doc 'type))) - ;; Let this code work compiled in images without FFI - (let ((types (load-time-value - (and (find-package "FFI") - (symbol-value - (find-symbol "*C-TYPE-TABLE*" "FFI")))))) - ;; Use ffi::*c-type-table* so as not to suffer the overhead of - ;; (ignore-errors (ffi:parse-c-type symbol)) for 99.9% of symbols - ;; which are not FFI type names. - (when (and types (nth-value 1 (gethash symbol types))) - ;; Maybe use (case (head (ffi:deparse-c-type))) - ;; to distinguish struct and union types? - (maybe-push :alien-type :not-documented))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable (describe symbol)) - (:macro (describe (macro-function symbol))) - (:function (describe (symbol-function symbol))) - (:class (describe (find-class symbol))))) - -(defimplementation type-specifier-p (symbol) - (or (ignore-errors - (subtypep nil symbol)) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(defun fspec-pathname (spec) - (let ((path spec) - type - lines) - (when (consp path) - (psetq type (car path) - path (cadr path) - lines (cddr path))) - (when (and path - (member (pathname-type path) - custom:*compiled-file-types* :test #'equal)) - (setq path - (loop for suffix in custom:*source-file-types* - thereis (probe-file (make-pathname :defaults path - :type suffix))))) - (values path type lines))) - -(defun fspec-location (name fspec) - (multiple-value-bind (file type lines) - (fspec-pathname fspec) - (list (if type (list name type) name) - (cond (file - (multiple-value-bind (truename c) - (ignore-errors (truename file)) - (cond (truename - (make-location - (list :file (namestring truename)) - (if (consp lines) - (list* :line lines) - (list :function-name (string name))) - (when (consp type) - (list :snippet (format nil "~A" type))))) - (t (list :error (princ-to-string c)))))) - (t (list :error - (format nil "No source information available for: ~S" - fspec))))))) - -(defimplementation find-definitions (name) - (mapcar #'(lambda (e) (fspec-location name e)) - (documentation name 'sys::file))) - -(defun trim-whitespace (string) - (string-trim #(#\newline #\space #\tab) string)) - -(defvar *sldb-backtrace*) - -(defun sldb-backtrace () - "Return a list ((ADDRESS . DESCRIPTION) ...) of frames." - (let* ((modes '((:all-stack-elements 1) - (:all-frames 2) - (:only-lexical-frames 3) - (:only-eval-and-apply-frames 4) - (:only-apply-frames 5))) - (mode (cadr (assoc :all-stack-elements modes)))) - (do ((frames '()) - (last nil frame) - (frame (sys::the-frame) - (sys::frame-up 1 frame mode))) - ((eq frame last) (nreverse frames)) - (unless (boring-frame-p frame) - (push frame frames))))) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let* (;;(sys::*break-count* (1+ sys::*break-count*)) - ;;(sys::*driver* debugger-loop-fn) - ;;(sys::*fasoutput-stream* nil) - (*sldb-backtrace* - (let* ((f (sys::the-frame)) - (bt (sldb-backtrace)) - (rest (member f bt))) - (if rest (nthcdr 8 rest) bt)))) - (funcall debugger-loop-fn))) - -(defun nth-frame (index) - (nth index *sldb-backtrace*)) - -(defun boring-frame-p (frame) - (member (frame-type frame) '(stack-value bind-var bind-env - compiled-tagbody compiled-block))) - -(defun frame-to-string (frame) - (with-output-to-string (s) - (sys::describe-frame s frame))) - -(defun frame-type (frame) - ;; FIXME: should bind *print-length* etc. to small values. - (frame-string-type (frame-to-string frame))) - -;; FIXME: they changed the layout in 2.44 and not all patterns have -;; been updated. -(defvar *frame-prefixes* - '(("\\[[0-9]\\+\\] frame binding variables" bind-var) - ("<1> # # # " fun) - ("<2> " 2nd-frame) - )) - -(defun frame-string-type (string) - (cadr (assoc-if (lambda (pattern) (is-prefix-p pattern string)) - *frame-prefixes*))) - -(defimplementation compute-backtrace (start end) - (let* ((bt *sldb-backtrace*) - (len (length bt))) - (loop for f in (subseq bt start (min (or end len) len)) - collect f))) - -(defimplementation print-frame (frame stream) - (let* ((str (frame-to-string frame))) - (write-string (extract-frame-line str) - stream))) - -(defun extract-frame-line (frame-string) - (let ((s frame-string)) - (trim-whitespace - (case (frame-string-type s) - ((eval special-op) - (string-match "EVAL frame .*for form \\(.*\\)" s 1)) - (apply - (string-match "APPLY frame for call \\(.*\\)" s 1)) - ((compiled-fun sys-fun fun) - (extract-function-name s)) - (t s))))) - -(defun extract-function-name (string) - (let ((1st (car (split-frame-string string)))) - (or (string-match (format nil "^<1>[ ~%]*#<[-A-Za-z]* \\(.*\\)>") - 1st - 1) - (string-match (format nil "^<1>[ ~%]*\\(.*\\)") 1st 1) - 1st))) - -(defun split-frame-string (string) - (let ((rx (format nil "~%\\(~{~A~^\\|~}\\)" - (mapcar #'car *frame-prefixes*)))) - (loop for pos = 0 then (1+ (regexp:match-start match)) - for match = (regexp:match rx string :start pos) - if match collect (subseq string pos (regexp:match-start match)) - else collect (subseq string pos) - while match))) - -(defun string-match (pattern string n) - (let* ((match (nth-value n (regexp:match pattern string)))) - (if match (regexp:match-string string match)))) - -(defimplementation eval-in-frame (form frame-number) - (sys::eval-at (nth-frame frame-number) form)) - -(defimplementation frame-locals (frame-number) - (let ((frame (nth-frame frame-number))) - (loop for i below (%frame-count-vars frame) - collect (list :name (%frame-var-name frame i) - :value (%frame-var-value frame i) - :id 0)))) - -(defimplementation frame-var-value (frame var) - (%frame-var-value (nth-frame frame) var)) - -;;; Interpreter-Variablen-Environment has the shape -;;; NIL or #(v1 val1 ... vn valn NEXT-ENV). - -(defun %frame-count-vars (frame) - (cond ((sys::eval-frame-p frame) - (do ((venv (frame-venv frame) (next-venv venv)) - (count 0 (+ count (/ (1- (length venv)) 2)))) - ((not venv) count))) - ((member (frame-type frame) '(compiled-fun sys-fun fun special-op)) - (length (%parse-stack-values frame))) - (t 0))) - -(defun %frame-var-name (frame i) - (cond ((sys::eval-frame-p frame) - (nth-value 0 (venv-ref (frame-venv frame) i))) - (t (format nil "~D" i)))) - -(defun %frame-var-value (frame i) - (cond ((sys::eval-frame-p frame) - (let ((name (venv-ref (frame-venv frame) i))) - (multiple-value-bind (v c) (ignore-errors (sys::eval-at frame name)) - (if c - (format-sldb-condition c) - v)))) - ((member (frame-type frame) '(compiled-fun sys-fun fun special-op)) - (let ((str (nth i (%parse-stack-values frame)))) - (trim-whitespace (subseq str 2)))) - (t (break "Not implemented")))) - -(defun frame-venv (frame) - (let ((env (sys::eval-at frame '(sys::the-environment)))) - (svref env 0))) - -(defun next-venv (venv) (svref venv (1- (length venv)))) - -(defun venv-ref (env i) - "Reference the Ith binding in ENV. -Return two values: NAME and VALUE" - (let ((idx (* i 2))) - (if (< idx (1- (length env))) - (values (svref env idx) (svref env (1+ idx))) - (venv-ref (next-venv env) (- i (/ (1- (length env)) 2)))))) - -(defun %parse-stack-values (frame) - (labels ((next (fp) (sys::frame-down 1 fp 1)) - (parse (fp accu) - (let ((str (frame-to-string fp))) - (cond ((is-prefix-p "- " str) - (parse (next fp) (cons str accu))) - ((is-prefix-p "<1> " str) - ;;(when (eq (frame-type frame) 'compiled-fun) - ;; (pop accu)) - (dolist (str (cdr (split-frame-string str))) - (when (is-prefix-p "- " str) - (push str accu))) - (nreverse accu)) - (t (parse (next fp) accu)))))) - (parse (next frame) '()))) - -(defun is-prefix-p (regexp string) - (if (regexp:match (concatenate 'string "^" regexp) string) t)) - -(defimplementation return-from-frame (index form) - (sys::return-from-eval-frame (nth-frame index) form)) - -(defimplementation restart-frame (index) - (sys::redo-eval-frame (nth-frame index))) - -(defimplementation frame-source-location (index) - `(:error - ,(format nil "frame-source-location not implemented. (frame: ~A)" - (nth-frame index)))) - -;;;; Profiling - -(defimplementation profile (fname) - (eval `(swank-monitor:monitor ,fname))) ;monitor is a macro - -(defimplementation profiled-functions () - swank-monitor:*monitored-functions*) - -(defimplementation unprofile (fname) - (eval `(swank-monitor:unmonitor ,fname))) ;unmonitor is a macro - -(defimplementation unprofile-all () - (swank-monitor:unmonitor)) - -(defimplementation profile-report () - (swank-monitor:report-monitoring)) - -(defimplementation profile-reset () - (swank-monitor:reset-all-monitoring)) - -(defimplementation profile-package (package callers-p methods) - (declare (ignore callers-p methods)) - (swank-monitor:monitor-all package)) - -;;;; Handle compiler conditions (find out location of error etc.) - -(defmacro compile-file-frobbing-notes ((&rest args) &body body) - "Pass ARGS to COMPILE-FILE, send the compiler notes to -*STANDARD-INPUT* and frob them in BODY." - `(let ((*error-output* (make-string-output-stream)) - (*compile-verbose* t)) - (multiple-value-prog1 - (compile-file ,@args) - (handler-case - (with-input-from-string - (*standard-input* (get-output-stream-string *error-output*)) - ,@body) - (sys::simple-end-of-file () nil))))) - -(defvar *orig-c-warn* (symbol-function 'system::c-warn)) -(defvar *orig-c-style-warn* (symbol-function 'system::c-style-warn)) -(defvar *orig-c-error* (symbol-function 'system::c-error)) -(defvar *orig-c-report-problems* (symbol-function 'system::c-report-problems)) - -(defmacro dynamic-flet (names-functions &body body) - "(dynamic-flet ((NAME FUNCTION) ...) BODY ...) -Execute BODY with NAME's function slot set to FUNCTION." - `(ext:letf* ,(loop for (name function) in names-functions - collect `((symbol-function ',name) ,function)) - ,@body)) - -(defvar *buffer-name* nil) -(defvar *buffer-offset*) - -(defun compiler-note-location () - "Return the current compiler location." - (let ((lineno1 sys::*compile-file-lineno1*) - (lineno2 sys::*compile-file-lineno2*) - (file sys::*compile-file-truename*)) - (cond ((and file lineno1 lineno2) - (make-location (list ':file (namestring file)) - (list ':line lineno1))) - (*buffer-name* - (make-location (list ':buffer *buffer-name*) - (list ':offset *buffer-offset* 0))) - (t - (list :error "No error location available"))))) - -(defun signal-compiler-warning (cstring args severity orig-fn) - (signal 'compiler-condition - :severity severity - :message (apply #'format nil cstring args) - :location (compiler-note-location)) - (apply orig-fn cstring args)) - -(defun c-warn (cstring &rest args) - (signal-compiler-warning cstring args :warning *orig-c-warn*)) - -(defun c-style-warn (cstring &rest args) - (dynamic-flet ((sys::c-warn *orig-c-warn*)) - (signal-compiler-warning cstring args :style-warning *orig-c-style-warn*))) - -(defun c-error (&rest args) - (signal 'compiler-condition - :severity :error - :message (apply #'format nil - (if (= (length args) 3) - (cdr args) - args)) - :location (compiler-note-location)) - (apply *orig-c-error* args)) - -(defimplementation call-with-compilation-hooks (function) - (handler-bind ((warning #'handle-notification-condition)) - (dynamic-flet ((system::c-warn #'c-warn) - (system::c-style-warn #'c-style-warn) - (system::c-error #'c-error)) - (funcall function)))) - -(defun handle-notification-condition (condition) - "Handle a condition caused by a compiler warning." - (signal 'compiler-condition - :original-condition condition - :severity :warning - :message (princ-to-string condition) - :location (compiler-note-location))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (with-compilation-unit () - (multiple-value-bind (fasl-file warningsp failurep) - (compile-file input-file - :output-file output-file - :external-format external-format) - (values fasl-file warningsp - (or failurep - (and load-p - (not (load fasl-file))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore filename line column policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-offset* position)) - (funcall (compile nil (read-from-string - (format nil "(~S () ~A)" 'lambda string)))) - t))) - -;;;; Portable XREF from the CMU AI repository. - -(setq pxref::*handle-package-forms* '(cl:in-package)) - -(defmacro defxref (name function) - `(defimplementation ,name (name) - (xref-results (,function name)))) - -(defxref who-calls pxref:list-callers) -(defxref who-references pxref:list-readers) -(defxref who-binds pxref:list-setters) -(defxref who-sets pxref:list-setters) -(defxref list-callers pxref:list-callers) -(defxref list-callees pxref:list-callees) - -(defun xref-results (symbols) - (let ((xrefs '())) - (dolist (symbol symbols) - (push (fspec-location symbol symbol) xrefs)) - xrefs)) - -(when (find-package :swank-loader) - (setf (symbol-function (intern "USER-INIT-FILE" :swank-loader)) - (lambda () - (let ((home (user-homedir-pathname))) - (and (ext:probe-directory home) - (probe-file (format nil "~A/.swank.lisp" - (namestring (truename home))))))))) - -;;; Don't set *debugger-hook* to nil on break. -(ext:without-package-lock () - (defun break (&optional (format-string "Break") &rest args) - (if (not sys::*use-clcs*) - (progn - (terpri *error-output*) - (apply #'format *error-output* - (concatenate 'string "*** - " format-string) - args) - (funcall ext:*break-driver* t)) - (let ((condition - (make-condition 'simple-condition - :format-control format-string - :format-arguments args)) - ;;(*debugger-hook* nil) - ;; Issue 91 - ) - (ext:with-restarts - ((continue - :report (lambda (stream) - (format stream (sys::text "Return from ~S loop") - 'break)) - ())) - (with-condition-restarts condition (list (find-restart 'continue)) - (invoke-debugger condition))))) - nil)) - -;;;; Inspecting - -(defmethod emacs-inspect ((o t)) - (let* ((*print-array* nil) (*print-pretty* t) - (*print-circle* t) (*print-escape* t) - (*print-lines* custom:*inspect-print-lines*) - (*print-level* custom:*inspect-print-level*) - (*print-length* custom:*inspect-print-length*) - (sys::*inspect-all* (make-array 10 :fill-pointer 0 :adjustable t)) - (tmp-pack (make-package (gensym "INSPECT-TMP-PACKAGE-"))) - (*package* tmp-pack) - (sys::*inspect-unbound-value* (intern "#" tmp-pack))) - (let ((inspection (sys::inspect-backend o))) - (append (list - (format nil "~S~% ~A~{~%~A~}~%" o - (sys::insp-title inspection) - (sys::insp-blurb inspection))) - (loop with count = (sys::insp-num-slots inspection) - for i below count - append (multiple-value-bind (value name) - (funcall (sys::insp-nth-slot inspection) - i) - `((:value ,name) " = " (:value ,value) - (:newline)))))))) - -(defimplementation quit-lisp () - #+lisp=cl (ext:quit) - #-lisp=cl (lisp:quit)) - - -(defimplementation preferred-communication-style () - nil) - -;;; FIXME -;;; -;;; Clisp 2.48 added experimental support for threads. Basically, you -;;; can use :SPAWN now, BUT: -;;; -;;; - there are problems with GC, and threads stuffed into weak -;;; hash-tables as is the case for *THREAD-PLIST-TABLE*. -;;; -;;; See test case at -;;; http://thread.gmane.org/gmane.lisp.clisp.devel/20429 -;;; -;;; Even though said to be fixed, it's not: -;;; -;;; http://thread.gmane.org/gmane.lisp.clisp.devel/20429/focus=20443 -;;; -;;; - The DYNAMIC-FLET above is an implementation technique that's -;;; probably not sustainable in light of threads. This got to be -;;; rewritten. -;;; -;;; TCR (2009-07-30) - -#+#.(cl:if (cl:find-package "MP") '(:and) '(:or)) -(progn - (defimplementation spawn (fn &key name) - (mp:make-thread fn :name name)) - - (defvar *thread-plist-table-lock* - (mp:make-mutex :name "THREAD-PLIST-TABLE-LOCK")) - - (defvar *thread-plist-table* (make-hash-table :weak :key) - "A hashtable mapping threads to a plist.") - - (defvar *thread-id-counter* 0) - - (defimplementation thread-id (thread) - (mp:with-mutex-lock (*thread-plist-table-lock*) - (or (getf (gethash thread *thread-plist-table*) 'thread-id) - (setf (getf (gethash thread *thread-plist-table*) 'thread-id) - (incf *thread-id-counter*))))) - - (defimplementation find-thread (id) - (find id (all-threads) - :key (lambda (thread) - (getf (gethash thread *thread-plist-table*) 'thread-id)))) - - (defimplementation thread-name (thread) - ;; To guard against returning #. - (princ-to-string (mp:thread-name thread))) - - (defimplementation thread-status (thread) - (if (thread-alive-p thread) - "RUNNING" - "STOPPED")) - - (defimplementation make-lock (&key name) - (mp:make-mutex :name name :recursive-p t)) - - (defimplementation call-with-lock-held (lock function) - (mp:with-mutex-lock (lock) - (funcall function))) - - (defimplementation current-thread () - (mp:current-thread)) - - (defimplementation all-threads () - (mp:list-threads)) - - (defimplementation interrupt-thread (thread fn) - (mp:thread-interrupt thread :function fn)) - - (defimplementation kill-thread (thread) - (mp:thread-interrupt thread :function t)) - - (defimplementation thread-alive-p (thread) - (mp:thread-active-p thread)) - - (defvar *mailboxes-lock* (make-lock :name "MAILBOXES-LOCK")) - (defvar *mailboxes* (list)) - - (defstruct (mailbox (:conc-name mailbox.)) - thread - (lock (make-lock :name "MAILBOX.LOCK")) - (waitqueue (mp:make-exemption :name "MAILBOX.WAITQUEUE")) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-mutex-lock (*mailboxes-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - - (defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (lock (mailbox.lock mbox))) - (mp:with-mutex-lock (lock) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (mp:exemption-broadcast (mailbox.waitqueue mbox))))) - - (defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread))) - (lock (mailbox.lock mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mp:with-mutex-lock (lock) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (when (eq timeout t) (return (values nil t))) - (mp:exemption-wait (mailbox.waitqueue mbox) lock :timeout 0.2)))))) - - -;;;; Weak hashtables - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak :key args)) - -(defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :weak :value args)) - -(defimplementation save-image (filename &optional restart-function) - (let ((args `(,filename - ,@(if restart-function - `((:init-function ,restart-function)))))) - (apply #'ext:saveinitmem args))) diff --git a/elpa/slime-20200414.1444/swank/cmucl.lisp b/elpa/slime-20200414.1444/swank/cmucl.lisp deleted file mode 100644 index 8b3d947d..00000000 --- a/elpa/slime-20200414.1444/swank/cmucl.lisp +++ /dev/null @@ -1,2470 +0,0 @@ -;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;+" -*- -;;; -;;; License: Public Domain -;;; -;;;; Introduction -;;; -;;; This is the CMUCL implementation of the `swank/backend' package. - -(defpackage swank/cmucl - (:use cl swank/backend swank/source-path-parser swank/source-file-cache - fwrappers)) - -(in-package swank/cmucl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - - (let ((min-version #x20c)) - (assert (>= c:byte-fasl-file-version min-version) - () "This file requires CMUCL version ~x or newer" min-version)) - - (require 'gray-streams)) - - -(import-swank-mop-symbols :pcl '(:slot-definition-documentation)) - -(defun swank-mop:slot-definition-documentation (slot) - (documentation slot t)) - -;;; UTF8 - -(locally (declare (optimize (ext:inhibit-warnings 3))) - ;; Compile and load the utf8 format, if not already loaded. - (stream::find-external-format :utf-8)) - -(defimplementation string-to-utf8 (string) - (let ((ef (load-time-value (stream::find-external-format :utf-8) t))) - (stream:string-to-octets string :external-format ef))) - -(defimplementation utf8-to-string (octets) - (let ((ef (load-time-value (stream::find-external-format :utf-8) t))) - (stream:octets-to-string octets :external-format ef))) - - -;;;; TCP server -;;; -;;; In CMUCL we support all communication styles. By default we use -;;; `:SIGIO' because it is the most responsive, but it's somewhat -;;; dangerous: CMUCL is not in general "signal safe", and you don't -;;; know for sure what you'll be interrupting. Both `:FD-HANDLER' and -;;; `:SPAWN' are reasonable alternatives. - -(defimplementation preferred-communication-style () - :sigio) - -#-(or darwin mips) -(defimplementation create-socket (host port &key backlog) - (let* ((addr (resolve-hostname host)) - (addr (if (not (find-symbol "SOCKET-ERROR" :ext)) - (ext:htonl addr) - addr))) - (ext:create-inet-listener port :stream :reuse-address t :host addr - :backlog (or backlog 5)))) - -;; There seems to be a bug in create-inet-listener on Mac/OSX and Irix. -#+(or darwin mips) -(defimplementation create-socket (host port &key backlog) - (declare (ignore host)) - (ext:create-inet-listener port :stream :reuse-address t)) - -(defimplementation local-port (socket) - (nth-value 1 (ext::get-socket-host-and-port (socket-fd socket)))) - -(defimplementation close-socket (socket) - (let ((fd (socket-fd socket))) - (sys:invalidate-descriptor fd) - (ext:close-socket fd))) - -(defimplementation accept-connection (socket &key - external-format buffering timeout) - (declare (ignore timeout)) - (make-socket-io-stream (ext:accept-tcp-connection socket) - (ecase buffering - ((t) :full) - (:line :line) - ((nil) :none)) - external-format)) - -;;;;; Sockets - -(defimplementation socket-fd (socket) - "Return the filedescriptor for the socket represented by SOCKET." - (etypecase socket - (fixnum socket) - (sys:fd-stream (sys:fd-stream-fd socket)))) - -(defun resolve-hostname (hostname) - "Return the IP address of HOSTNAME as an integer (in host byte-order)." - (let ((hostent (ext:lookup-host-entry hostname))) - (car (ext:host-entry-addr-list hostent)))) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 "iso-latin-1-unix") - #+unicode - (:utf-8 "utf-8-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -(defun make-socket-io-stream (fd buffering external-format) - "Create a new input/output fd-stream for FD." - (cond (external-format - (sys:make-fd-stream fd :input t :output t - :element-type 'character - :buffering buffering - :external-format external-format)) - (t - (sys:make-fd-stream fd :input t :output t - :element-type '(unsigned-byte 8) - :buffering buffering)))) - -(defimplementation make-fd-stream (fd external-format) - (make-socket-io-stream fd :full external-format)) - -(defimplementation dup (fd) - (multiple-value-bind (clone error) (unix:unix-dup fd) - (unless clone (error "dup failed: ~a" (unix:get-unix-error-msg error))) - clone)) - -(defimplementation command-line-args () - ext:*command-line-strings*) - -(defimplementation exec-image (image-file args) - (multiple-value-bind (ok error) - (unix:unix-execve (car (command-line-args)) - (list* (car (command-line-args)) - "-core" image-file - "-noinit" - args)) - (error "~a" (unix:get-unix-error-msg error)) - ok)) - -;;;;; Signal-driven I/O - -(defimplementation install-sigint-handler (function) - (sys:enable-interrupt :sigint (lambda (signal code scp) - (declare (ignore signal code scp)) - (funcall function)))) - -(defvar *sigio-handlers* '() - "List of (key . function) pairs. -All functions are called on SIGIO, and the key is used for removing -specific functions.") - -(defun reset-sigio-handlers () (setq *sigio-handlers* '())) -;; All file handlers are invalid afer reload. -(pushnew 'reset-sigio-handlers ext:*after-save-initializations*) - -(defun set-sigio-handler () - (sys:enable-interrupt :sigio (lambda (signal code scp) - (sigio-handler signal code scp)))) - -(defun sigio-handler (signal code scp) - (declare (ignore signal code scp)) - (mapc #'funcall (mapcar #'cdr *sigio-handlers*))) - -(defun fcntl (fd command arg) - "fcntl(2) - manipulate a file descriptor." - (multiple-value-bind (ok error) (unix:unix-fcntl fd command arg) - (cond (ok) - (t (error "fcntl: ~A" (unix:get-unix-error-msg error)))))) - -(defimplementation add-sigio-handler (socket fn) - (set-sigio-handler) - (let ((fd (socket-fd socket))) - (fcntl fd unix:f-setown (unix:unix-getpid)) - (let ((old-flags (fcntl fd unix:f-getfl 0))) - (fcntl fd unix:f-setfl (logior old-flags unix:fasync))) - (assert (not (assoc fd *sigio-handlers*))) - (push (cons fd fn) *sigio-handlers*))) - -(defimplementation remove-sigio-handlers (socket) - (let ((fd (socket-fd socket))) - (when (assoc fd *sigio-handlers*) - (setf *sigio-handlers* (remove fd *sigio-handlers* :key #'car)) - (let ((old-flags (fcntl fd unix:f-getfl 0))) - (fcntl fd unix:f-setfl (logandc2 old-flags unix:fasync))) - (sys:invalidate-descriptor fd)) - (assert (not (assoc fd *sigio-handlers*))) - (when (null *sigio-handlers*) - (sys:default-interrupt :sigio)))) - -;;;;; SERVE-EVENT - -(defimplementation add-fd-handler (socket fn) - (let ((fd (socket-fd socket))) - (sys:add-fd-handler fd :input (lambda (_) _ (funcall fn))))) - -(defimplementation remove-fd-handlers (socket) - (sys:invalidate-descriptor (socket-fd socket))) - -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (let ((ready (remove-if-not #'listen streams))) - (when ready (return ready))) - (when timeout (return nil)) - (multiple-value-bind (in out) (make-pipe) - (let* ((f (constantly t)) - (handlers (loop for s in (cons in (mapcar #'to-fd-stream streams)) - collect (add-one-shot-handler s f)))) - (unwind-protect - (let ((*interrupt-queued-handler* (lambda () - (write-char #\! out)))) - (when (check-slime-interrupts) (return :interrupt)) - (sys:serve-event)) - (mapc #'sys:remove-fd-handler handlers) - (close in) - (close out)))))) - -(defun to-fd-stream (stream) - (etypecase stream - (sys:fd-stream stream) - (synonym-stream - (to-fd-stream - (symbol-value (synonym-stream-symbol stream)))) - (two-way-stream - (to-fd-stream (two-way-stream-input-stream stream))))) - -(defun add-one-shot-handler (stream function) - (let (handler) - (setq handler (sys:add-fd-handler (sys:fd-stream-fd stream) :input - (lambda (fd) - (declare (ignore fd)) - (sys:remove-fd-handler handler) - (funcall function stream)))))) - -(defun make-pipe () - (multiple-value-bind (in out) (unix:unix-pipe) - (values (sys:make-fd-stream in :input t :buffering :none) - (sys:make-fd-stream out :output t :buffering :none)))) - - -;;;; Stream handling - -(defimplementation gray-package-name () - "EXT") - - -;;;; Compilation Commands - -(defvar *previous-compiler-condition* nil - "Used to detect duplicates.") - -(defvar *previous-context* nil - "Previous compiler error context.") - -(defvar *buffer-name* nil - "The name of the Emacs buffer we are compiling from. -NIL if we aren't compiling from a buffer.") - -(defvar *buffer-start-position* nil) -(defvar *buffer-substring* nil) - -(defimplementation call-with-compilation-hooks (function) - (let ((*previous-compiler-condition* nil) - (*previous-context* nil) - (*print-readably* nil)) - (handler-bind ((c::compiler-error #'handle-notification-condition) - (c::style-warning #'handle-notification-condition) - (c::warning #'handle-notification-condition)) - (funcall function)))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (clear-xref-info input-file) - (with-compilation-hooks () - (let ((*buffer-name* nil) - (ext:*ignore-extra-close-parentheses* nil)) - (multiple-value-bind (output-file warnings-p failure-p) - (compile-file input-file :output-file output-file - :external-format external-format) - (values output-file warnings-p - (or failure-p - (when load-p - ;; Cache the latest source file for definition-finding. - (source-cache-get input-file - (file-write-date input-file)) - (not (load output-file))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore filename line column policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-substring* string) - (source-info (list :emacs-buffer buffer - :emacs-buffer-offset position - :emacs-buffer-string string))) - (with-input-from-string (stream string) - (let ((failurep (ext:compile-from-stream stream :source-info - source-info))) - (not failurep)))))) - - -;;;;; Trapping notes -;;; -;;; We intercept conditions from the compiler and resignal them as -;;; `SWANK:COMPILER-CONDITION's. - -(defun handle-notification-condition (condition) - "Handle a condition caused by a compiler warning." - (unless (eq condition *previous-compiler-condition*) - (let ((context (c::find-error-context nil))) - (setq *previous-compiler-condition* condition) - (setq *previous-context* context) - (signal-compiler-condition condition context)))) - -(defun signal-compiler-condition (condition context) - (signal 'compiler-condition - :original-condition condition - :severity (severity-for-emacs condition) - :message (compiler-condition-message condition) - :source-context (compiler-error-context context) - :location (if (read-error-p condition) - (read-error-location condition) - (compiler-note-location context)))) - -(defun severity-for-emacs (condition) - "Return the severity of CONDITION." - (etypecase condition - ((satisfies read-error-p) :read-error) - (c::compiler-error :error) - (c::style-warning :note) - (c::warning :warning))) - -(defun read-error-p (condition) - (eq (type-of condition) 'c::compiler-read-error)) - -(defun compiler-condition-message (condition) - "Briefly describe a compiler error for Emacs. -When Emacs presents the message it already has the source popped up -and the source form highlighted. This makes much of the information in -the error-context redundant." - (princ-to-string condition)) - -(defun compiler-error-context (error-context) - "Describe context information for Emacs." - (declare (type (or c::compiler-error-context null) error-context)) - (multiple-value-bind (enclosing source) - (if error-context - (values (c::compiler-error-context-enclosing-source error-context) - (c::compiler-error-context-source error-context))) - (if (or enclosing source) - (format nil "~@[--> ~{~<~%--> ~1:;~A ~>~}~%~]~ - ~@[==>~{~&~A~}~]" - enclosing source)))) - -(defun read-error-location (condition) - (let* ((finfo (car (c::source-info-current-file c::*source-info*))) - (file (c::file-info-name finfo)) - (pos (c::compiler-read-error-position condition))) - (cond ((and (eq file :stream) *buffer-name*) - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* pos))) - ((and (pathnamep file) (not *buffer-name*)) - (make-location (list :file (unix-truename file)) - (list :position (1+ pos)))) - (t (break))))) - -(defun compiler-note-location (context) - "Derive the location of a complier message from its context. -Return a `location' record, or (:error REASON) on failure." - (if (null context) - (note-error-location) - (with-struct (c::compiler-error-context- file-name - original-source - original-source-path) context - (or (locate-compiler-note file-name original-source - (reverse original-source-path)) - (note-error-location))))) - -(defun note-error-location () - "Pseudo-location for notes that can't be located." - (cond (*compile-file-truename* - (make-location (list :file (unix-truename *compile-file-truename*)) - (list :eof))) - (*buffer-name* - (make-location (list :buffer *buffer-name*) - (list :position *buffer-start-position*))) - (t (list :error "No error location available.")))) - -(defun locate-compiler-note (file source source-path) - (cond ((and (eq file :stream) *buffer-name*) - ;; Compiling from a buffer - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* - (source-path-string-position - source-path *buffer-substring*)))) - ((and (pathnamep file) (null *buffer-name*)) - ;; Compiling from a file - (make-location (list :file (unix-truename file)) - (list :position (1+ (source-path-file-position - source-path file))))) - ((and (eq file :lisp) (stringp source)) - ;; No location known, but we have the source form. - ;; XXX How is this case triggered? -luke (16/May/2004) - ;; This can happen if the compiler needs to expand a macro - ;; but the macro-expander is not yet compiled. Calling the - ;; (interpreted) macro-expander triggers IR1 conversion of - ;; the lambda expression for the expander and invokes the - ;; compiler recursively. - (make-location (list :source-form source) - (list :position 1))))) - -(defun unix-truename (pathname) - (ext:unix-namestring (truename pathname))) - - -;;;; XREF -;;; -;;; Cross-reference support is based on the standard CMUCL `XREF' -;;; package. This package has some caveats: XREF information is -;;; recorded during compilation and not preserved in fasl files, and -;;; XREF recording is disabled by default. Redefining functions can -;;; also cause duplicate references to accumulate, but -;;; `swank-compile-file' will automatically clear out any old records -;;; from the same filename. -;;; -;;; To enable XREF recording, set `c:*record-xref-info*' to true. To -;;; clear out the XREF database call `xref:init-xref-database'. - -(defmacro defxref (name function) - `(defimplementation ,name (name) - (xref-results (,function name)))) - -(defxref who-calls xref:who-calls) -(defxref who-references xref:who-references) -(defxref who-binds xref:who-binds) -(defxref who-sets xref:who-sets) - -;;; More types of XREF information were added since 18e: -;;; - -(defxref who-macroexpands xref:who-macroexpands) -;; XXX -(defimplementation who-specializes (symbol) - (let* ((methods (xref::who-specializes (find-class symbol))) - (locations (mapcar #'method-location methods))) - (mapcar #'list methods locations))) - -(defun xref-results (contexts) - (mapcar (lambda (xref) - (list (xref:xref-context-name xref) - (resolve-xref-location xref))) - contexts)) - -(defun resolve-xref-location (xref) - (let ((name (xref:xref-context-name xref)) - (file (xref:xref-context-file xref)) - (source-path (xref:xref-context-source-path xref))) - (cond ((and file source-path) - (let ((position (source-path-file-position source-path file))) - (make-location (list :file (unix-truename file)) - (list :position (1+ position))))) - (file - (make-location (list :file (unix-truename file)) - (list :function-name (string name)))) - (t - `(:error ,(format nil "Unknown source location: ~S ~S ~S " - name file source-path)))))) - -(defun clear-xref-info (namestring) - "Clear XREF notes pertaining to NAMESTRING. -This is a workaround for a CMUCL bug: XREF records are cumulative." - (when c:*record-xref-info* - (let ((filename (truename namestring))) - (dolist (db (list xref::*who-calls* - xref::*who-is-called* - xref::*who-macroexpands* - xref::*who-references* - xref::*who-binds* - xref::*who-sets*)) - (maphash (lambda (target contexts) - ;; XXX update during traversal? - (setf (gethash target db) - (delete filename contexts - :key #'xref:xref-context-file - :test #'equalp))) - db))))) - - -;;;; Find callers and callees -;;; -;;; Find callers and callees by looking at the constant pool of -;;; compiled code objects. We assume every fdefn object in the -;;; constant pool corresponds to a call to that function. A better -;;; strategy would be to use the disassembler to find actual -;;; call-sites. - -(labels ((make-stack () (make-array 100 :fill-pointer 0 :adjustable t)) - (map-cpool (code fun) - (declare (type kernel:code-component code) (type function fun)) - (loop for i from vm:code-constants-offset - below (kernel:get-header-data code) - do (funcall fun (kernel:code-header-ref code i)))) - - (callees (fun) - (let ((callees (make-stack))) - (map-cpool (vm::find-code-object fun) - (lambda (o) - (when (kernel:fdefn-p o) - (vector-push-extend (kernel:fdefn-function o) - callees)))) - (coerce callees 'list))) - - (callers (fun) - (declare (function fun)) - (let ((callers (make-stack))) - (ext:gc :full t) - ;; scan :dynamic first to avoid the need for even more gcing - (dolist (space '(:dynamic :read-only :static)) - (vm::map-allocated-objects - (lambda (obj header size) - (declare (type fixnum header) (ignore size)) - (when (= vm:code-header-type header) - (map-cpool obj - (lambda (c) - (when (and (kernel:fdefn-p c) - (eq (kernel:fdefn-function c) fun)) - (vector-push-extend obj callers)))))) - space) - (ext:gc)) - (coerce callers 'list))) - - (entry-points (code) - (loop for entry = (kernel:%code-entry-points code) - then (kernel::%function-next entry) - while entry - collect entry)) - - (guess-main-entry-point (entry-points) - (or (find-if (lambda (fun) - (ext:valid-function-name-p - (kernel:%function-name fun))) - entry-points) - (car entry-points))) - - (fun-dspec (fun) - (list (kernel:%function-name fun) (function-location fun))) - - (code-dspec (code) - (let ((eps (entry-points code)) - (di (kernel:%code-debug-info code))) - (cond (eps (fun-dspec (guess-main-entry-point eps))) - (di (list (c::debug-info-name di) - (debug-info-function-name-location di))) - (t (list (princ-to-string code) - `(:error "No src-loc available"))))))) - (declare (inline map-cpool)) - - (defimplementation list-callers (symbol) - (mapcar #'code-dspec (callers (coerce symbol 'function) ))) - - (defimplementation list-callees (symbol) - (mapcar #'fun-dspec (callees symbol)))) - -(defun test-list-callers (count) - (let ((funsyms '())) - (do-all-symbols (s) - (when (and (fboundp s) - (functionp (symbol-function s)) - (not (macro-function s)) - (not (special-operator-p s))) - (push s funsyms))) - (let ((len (length funsyms))) - (dotimes (i count) - (let ((sym (nth (random len) funsyms))) - (format t "~s -> ~a~%" sym (mapcar #'car (list-callers sym)))))))) - -;; (test-list-callers 100) - - -;;;; Resolving source locations -;;; -;;; Our mission here is to "resolve" references to code locations into -;;; actual file/buffer names and character positions. The references -;;; we work from come out of the compiler's statically-generated debug -;;; information, such as `code-location''s and `debug-source''s. For -;;; more details, see the "Debugger Programmer's Interface" section of -;;; the CMUCL manual. -;;; -;;; The first step is usually to find the corresponding "source-path" -;;; for the location. Once we have the source-path we can pull up the -;;; source file and `READ' our way through to the right position. The -;;; main source-code groveling work is done in -;;; `source-path-parser.lisp'. - -(defvar *debug-definition-finding* nil - "When true don't handle errors while looking for definitions. -This is useful when debugging the definition-finding code.") - -(defmacro safe-definition-finding (&body body) - "Execute BODY and return the source-location it returns. -If an error occurs and `*debug-definition-finding*' is false, then -return an error pseudo-location. - -The second return value is NIL if no error occurs, otherwise it is the -condition object." - `(flet ((body () ,@body)) - (if *debug-definition-finding* - (body) - (handler-case (values (progn ,@body) nil) - (error (c) (values `(:error ,(trim-whitespace (princ-to-string c))) - c)))))) - -(defun trim-whitespace (string) - (string-trim #(#\newline #\space #\tab) string)) - -(defun code-location-source-location (code-location) - "Safe wrapper around `code-location-from-source-location'." - (safe-definition-finding - (source-location-from-code-location code-location))) - -(defun source-location-from-code-location (code-location) - "Return the source location for CODE-LOCATION." - (let ((debug-fun (di:code-location-debug-function code-location))) - (when (di::bogus-debug-function-p debug-fun) - ;; Those lousy cheapskates! They've put in a bogus debug source - ;; because the code was compiled at a low debug setting. - (error "Bogus debug function: ~A" debug-fun))) - (let* ((debug-source (di:code-location-debug-source code-location)) - (from (di:debug-source-from debug-source)) - (name (di:debug-source-name debug-source))) - (ecase from - (:file - (location-in-file name code-location debug-source)) - (:stream - (location-in-stream code-location debug-source)) - (:lisp - ;; The location comes from a form passed to `compile'. - ;; The best we can do is return the form itself for printing. - (make-location - (list :source-form (with-output-to-string (*standard-output*) - (debug::print-code-location-source-form - code-location 100 t))) - (list :position 1)))))) - -(defun location-in-file (filename code-location debug-source) - "Resolve the source location for CODE-LOCATION in FILENAME." - (let* ((code-date (di:debug-source-created debug-source)) - (root-number (di:debug-source-root-number debug-source)) - (source-code (get-source-code filename code-date))) - (with-input-from-string (s source-code) - (make-location (list :file (unix-truename filename)) - (list :position (1+ (code-location-stream-position - code-location s root-number))) - `(:snippet ,(read-snippet s)))))) - -(defun location-in-stream (code-location debug-source) - "Resolve the source location for a CODE-LOCATION from a stream. -This only succeeds if the code was compiled from an Emacs buffer." - (unless (debug-source-info-from-emacs-buffer-p debug-source) - (error "The code is compiled from a non-SLIME stream.")) - (let* ((info (c::debug-source-info debug-source)) - (string (getf info :emacs-buffer-string)) - (position (code-location-string-offset - code-location - string))) - (make-location - (list :buffer (getf info :emacs-buffer)) - (list :offset (getf info :emacs-buffer-offset) position) - (list :snippet (with-input-from-string (s string) - (file-position s position) - (read-snippet s)))))) - -;;;;; Function-name locations -;;; -(defun debug-info-function-name-location (debug-info) - "Return a function-name source-location for DEBUG-INFO. -Function-name source-locations are a fallback for when precise -positions aren't available." - (with-struct (c::debug-info- (fname name) source) debug-info - (with-struct (c::debug-source- info from name) (car source) - (ecase from - (:file - (make-location (list :file (namestring (truename name))) - (list :function-name (string fname)))) - (:stream - (assert (debug-source-info-from-emacs-buffer-p (car source))) - (make-location (list :buffer (getf info :emacs-buffer)) - (list :function-name (string fname)))) - (:lisp - (make-location (list :source-form (princ-to-string (aref name 0))) - (list :position 1))))))) - -(defun debug-source-info-from-emacs-buffer-p (debug-source) - "Does the `info' slot of DEBUG-SOURCE contain an Emacs buffer location? -This is true for functions that were compiled directly from buffers." - (info-from-emacs-buffer-p (c::debug-source-info debug-source))) - -(defun info-from-emacs-buffer-p (info) - (and info - (consp info) - (eq :emacs-buffer (car info)))) - - -;;;;; Groveling source-code for positions - -(defun code-location-stream-position (code-location stream root) - "Return the byte offset of CODE-LOCATION in STREAM. Extract the -toplevel-form-number and form-number from CODE-LOCATION and use that -to find the position of the corresponding form. - -Finish with STREAM positioned at the start of the code location." - (let* ((location (debug::maybe-block-start-location code-location)) - (tlf-offset (- (di:code-location-top-level-form-offset location) - root)) - (form-number (di:code-location-form-number location))) - (let ((pos (form-number-stream-position tlf-offset form-number stream))) - (file-position stream pos) - pos))) - -(defun form-number-stream-position (tlf-number form-number stream) - "Return the starting character position of a form in STREAM. -TLF-NUMBER is the top-level-form number. -FORM-NUMBER is an index into a source-path table for the TLF." - (multiple-value-bind (tlf position-map) (read-source-form tlf-number stream) - (let* ((path-table (di:form-number-translations tlf 0)) - (source-path - (if (<= (length path-table) form-number) ; source out of sync? - (list 0) ; should probably signal a condition - (reverse (cdr (aref path-table form-number)))))) - (source-path-source-position source-path tlf position-map)))) - -(defun code-location-string-offset (code-location string) - "Return the byte offset of CODE-LOCATION in STRING. -See CODE-LOCATION-STREAM-POSITION." - (with-input-from-string (s string) - (code-location-stream-position code-location s 0))) - - -;;;; Finding definitions - -;;; There are a great many different types of definition for us to -;;; find. We search for definitions of every kind and return them in a -;;; list. - -(defimplementation find-definitions (name) - (append (function-definitions name) - (setf-definitions name) - (variable-definitions name) - (class-definitions name) - (type-definitions name) - (compiler-macro-definitions name) - (source-transform-definitions name) - (function-info-definitions name) - (ir1-translator-definitions name) - (template-definitions name) - (primitive-definitions name) - (vm-support-routine-definitions name) - )) - -;;;;; Functions, macros, generic functions, methods -;;; -;;; We make extensive use of the compile-time debug information that -;;; CMUCL records, in particular "debug functions" and "code -;;; locations." Refer to the "Debugger Programmer's Interface" section -;;; of the CMUCL manual for more details. - -(defun function-definitions (name) - "Return definitions for NAME in the \"function namespace\", i.e., -regular functions, generic functions, methods and macros. -NAME can any valid function name (e.g, (setf car))." - (let ((macro? (and (symbolp name) (macro-function name))) - (function? (and (ext:valid-function-name-p name) - (ext:info :function :definition name) - (if (symbolp name) (fboundp name) t)))) - (cond (macro? - (list `((defmacro ,name) - ,(function-location (macro-function name))))) - (function? - (let ((function (fdefinition name))) - (if (genericp function) - (gf-definitions name function) - (list (list `(function ,name) - (function-location function))))))))) - -;;;;;; Ordinary (non-generic/macro/special) functions -;;; -;;; First we test if FUNCTION is a closure created by defstruct, and -;;; if so extract the defstruct-description (`dd') from the closure -;;; and find the constructor for the struct. Defstruct creates a -;;; defun for the default constructor and we use that as an -;;; approximation to the source location of the defstruct. -;;; -;;; For an ordinary function we return the source location of the -;;; first code-location we find. -;;; -(defun function-location (function) - "Return the source location for FUNCTION." - (cond ((struct-closure-p function) - (struct-closure-location function)) - ((c::byte-function-or-closure-p function) - (byte-function-location function)) - (t - (compiled-function-location function)))) - -(defun compiled-function-location (function) - "Return the location of a regular compiled function." - (multiple-value-bind (code-location error) - (safe-definition-finding (function-first-code-location function)) - (cond (error (list :error (princ-to-string error))) - (t (code-location-source-location code-location))))) - -(defun function-first-code-location (function) - "Return the first code-location we can find for FUNCTION." - (and (function-has-debug-function-p function) - (di:debug-function-start-location - (di:function-debug-function function)))) - -(defun function-has-debug-function-p (function) - (di:function-debug-function function)) - -(defun function-code-object= (closure function) - (and (eq (vm::find-code-object closure) - (vm::find-code-object function)) - (not (eq closure function)))) - -(defun byte-function-location (fun) - "Return the location of the byte-compiled function FUN." - (etypecase fun - ((or c::hairy-byte-function c::simple-byte-function) - (let* ((di (kernel:%code-debug-info (c::byte-function-component fun)))) - (if di - (debug-info-function-name-location di) - `(:error - ,(format nil "Byte-function without debug-info: ~a" fun))))) - (c::byte-closure - (byte-function-location (c::byte-closure-function fun))))) - -;;; Here we deal with structure accessors. Note that `dd' is a -;;; "defstruct descriptor" structure in CMUCL. A `dd' describes a -;;; `defstruct''d structure. - -(defun struct-closure-p (function) - "Is FUNCTION a closure created by defstruct?" - (or (function-code-object= function #'kernel::structure-slot-accessor) - (function-code-object= function #'kernel::structure-slot-setter) - (function-code-object= function #'kernel::%defstruct))) - -(defun struct-closure-location (function) - "Return the location of the structure that FUNCTION belongs to." - (assert (struct-closure-p function)) - (safe-definition-finding - (dd-location (struct-closure-dd function)))) - -(defun struct-closure-dd (function) - "Return the defstruct-definition (dd) of FUNCTION." - (assert (= (kernel:get-type function) vm:closure-header-type)) - (flet ((find-layout (function) - (sys:find-if-in-closure - (lambda (x) - (let ((value (if (di::indirect-value-cell-p x) - (c:value-cell-ref x) - x))) - (when (kernel::layout-p value) - (return-from find-layout value)))) - function))) - (kernel:layout-info (find-layout function)))) - -(defun dd-location (dd) - "Return the location of a `defstruct'." - (let ((ctor (struct-constructor dd))) - (cond (ctor - (function-location (coerce ctor 'function))) - (t - (let ((name (kernel:dd-name dd))) - (multiple-value-bind (location foundp) - (ext:info :source-location :defvar name) - (cond (foundp - (resolve-source-location location)) - (t - (error "No location for defstruct: ~S" name))))))))) - -(defun struct-constructor (dd) - "Return the name of the constructor from a defstruct definition." - (let* ((constructor (or (kernel:dd-default-constructor dd) - (car (kernel::dd-constructors dd))))) - (if (consp constructor) (car constructor) constructor))) - -;;;;;; Generic functions and methods - -(defun gf-definitions (name function) - "Return the definitions of a generic function and its methods." - (cons (list `(defgeneric ,name) (gf-location function)) - (gf-method-definitions function))) - -(defun gf-location (gf) - "Return the location of the generic function GF." - (definition-source-location gf (pcl::generic-function-name gf))) - -(defun gf-method-definitions (gf) - "Return the locations of all methods of the generic function GF." - (mapcar #'method-definition (pcl::generic-function-methods gf))) - -(defun method-definition (method) - (list (method-dspec method) - (method-location method))) - -(defun method-dspec (method) - "Return a human-readable \"definition specifier\" for METHOD." - (let* ((gf (pcl:method-generic-function method)) - (name (pcl:generic-function-name gf)) - (specializers (pcl:method-specializers method)) - (qualifiers (pcl:method-qualifiers method))) - `(method ,name ,@qualifiers ,(pcl::unparse-specializers specializers)))) - -(defun method-location (method) - (typecase method - (pcl::standard-accessor-method - (definition-source-location - (cond ((pcl::definition-source method) - method) - (t - (pcl::slot-definition-class - (pcl::accessor-method-slot-definition method)))) - (pcl::accessor-method-slot-name method))) - (t - (function-location (or (pcl::method-fast-function method) - (pcl:method-function method)))))) - -(defun genericp (fn) - (typep fn 'generic-function)) - -;;;;;; Types and classes - -(defun type-definitions (name) - "Return `deftype' locations for type NAME." - (maybe-make-definition (ext:info :type :expander name) 'deftype name)) - -(defun maybe-make-definition (function kind name) - "If FUNCTION is non-nil then return its definition location." - (if function - (list (list `(,kind ,name) (function-location function))))) - -(defun class-definitions (name) - "Return the definition locations for the class called NAME." - (if (symbolp name) - (let ((class (kernel::find-class name nil))) - (etypecase class - (null '()) - (kernel::structure-class - (list (list `(defstruct ,name) (dd-location (find-dd name))))) - #+(or) - (conditions::condition-class - (list (list `(define-condition ,name) - (condition-class-location class)))) - (kernel::standard-class - (list (list `(defclass ,name) - (pcl-class-location (find-class name))))) - ((or kernel::built-in-class - conditions::condition-class - kernel:funcallable-structure-class) - (list (list `(class ,name) (class-location class)))))))) - -(defun pcl-class-location (class) - "Return the `defclass' location for CLASS." - (definition-source-location class (pcl:class-name class))) - -;; FIXME: eval used for backward compatibility. -(defun class-location (class) - (declare (type kernel::class class)) - (let ((name (kernel:%class-name class))) - (multiple-value-bind (loc found?) - (let ((x (ignore-errors - (multiple-value-list - (eval `(ext:info :source-location :class ',name)))))) - (values-list x)) - (cond (found? (resolve-source-location loc)) - (`(:error - ,(format nil "No location recorded for class: ~S" name))))))) - -(defun find-dd (name) - "Find the defstruct-definition by the name of its structure-class." - (let ((layout (ext:info :type :compiler-layout name))) - (if layout - (kernel:layout-info layout)))) - -(defun condition-class-location (class) - (let ((slots (conditions::condition-class-slots class)) - (name (conditions::condition-class-name class))) - (cond ((null slots) - `(:error ,(format nil "No location info for condition: ~A" name))) - (t - ;; Find the class via one of its slot-reader methods. - (let* ((slot (first slots)) - (gf (fdefinition - (first (conditions::condition-slot-readers slot))))) - (method-location - (first - (pcl:compute-applicable-methods-using-classes - gf (list (find-class name)))))))))) - -(defun make-name-in-file-location (file string) - (multiple-value-bind (filename c) - (ignore-errors - (unix-truename (merge-pathnames (make-pathname :type "lisp") - file))) - (cond (filename (make-location `(:file ,filename) - `(:function-name ,(string string)))) - (t (list :error (princ-to-string c)))))) - -(defun source-location-form-numbers (location) - (c::decode-form-numbers (c::form-numbers-form-numbers location))) - -(defun source-location-tlf-number (location) - (nth-value 0 (source-location-form-numbers location))) - -(defun source-location-form-number (location) - (nth-value 1 (source-location-form-numbers location))) - -(defun resolve-file-source-location (location) - (let ((filename (c::file-source-location-pathname location)) - (tlf-number (source-location-tlf-number location)) - (form-number (source-location-form-number location))) - (with-open-file (s filename) - (let ((pos (form-number-stream-position tlf-number form-number s))) - (make-location `(:file ,(unix-truename filename)) - `(:position ,(1+ pos))))))) - -(defun resolve-stream-source-location (location) - (let ((info (c::stream-source-location-user-info location)) - (tlf-number (source-location-tlf-number location)) - (form-number (source-location-form-number location))) - ;; XXX duplication in frame-source-location - (assert (info-from-emacs-buffer-p info)) - (destructuring-bind (&key emacs-buffer emacs-buffer-string - emacs-buffer-offset) info - (with-input-from-string (s emacs-buffer-string) - (let ((pos (form-number-stream-position tlf-number form-number s))) - (make-location `(:buffer ,emacs-buffer) - `(:offset ,emacs-buffer-offset ,pos))))))) - -;; XXX predicates for 18e backward compatibilty. Remove them when -;; we're 19a only. -(defun file-source-location-p (object) - (when (fboundp 'c::file-source-location-p) - (c::file-source-location-p object))) - -(defun stream-source-location-p (object) - (when (fboundp 'c::stream-source-location-p) - (c::stream-source-location-p object))) - -(defun source-location-p (object) - (or (file-source-location-p object) - (stream-source-location-p object))) - -(defun resolve-source-location (location) - (etypecase location - ((satisfies file-source-location-p) - (resolve-file-source-location location)) - ((satisfies stream-source-location-p) - (resolve-stream-source-location location)))) - -(defun definition-source-location (object name) - (let ((source (pcl::definition-source object))) - (etypecase source - (null - `(:error ,(format nil "No source info for: ~A" object))) - ((satisfies source-location-p) - (resolve-source-location source)) - (pathname - (make-name-in-file-location source name)) - (cons - (destructuring-bind ((dg name) pathname) source - (declare (ignore dg)) - (etypecase pathname - (pathname (make-name-in-file-location pathname (string name))) - (null `(:error ,(format nil "Cannot resolve: ~S" source))))))))) - -(defun setf-definitions (name) - (let ((f (or (ext:info :setf :inverse name) - (ext:info :setf :expander name) - (and (symbolp name) - (fboundp `(setf ,name)) - (fdefinition `(setf ,name)))))) - (if f - `(((setf ,name) ,(function-location (cond ((functionp f) f) - ((macro-function f)) - ((fdefinition f))))))))) - -(defun variable-location (symbol) - (multiple-value-bind (location foundp) - ;; XXX for 18e compatibilty. rewrite this when we drop 18e - ;; support. - (ignore-errors (eval `(ext:info :source-location :defvar ',symbol))) - (if (and foundp location) - (resolve-source-location location) - `(:error ,(format nil "No source info for variable ~S" symbol))))) - -(defun variable-definitions (name) - (if (symbolp name) - (multiple-value-bind (kind recorded-p) (ext:info :variable :kind name) - (if recorded-p - (list (list `(variable ,kind ,name) - (variable-location name))))))) - -(defun compiler-macro-definitions (symbol) - (maybe-make-definition (compiler-macro-function symbol) - 'define-compiler-macro - symbol)) - -(defun source-transform-definitions (name) - (maybe-make-definition (ext:info :function :source-transform name) - 'c:def-source-transform - name)) - -(defun function-info-definitions (name) - (let ((info (ext:info :function :info name))) - (if info - (append (loop for transform in (c::function-info-transforms info) - collect (list `(c:deftransform ,name - ,(c::type-specifier - (c::transform-type transform))) - (function-location (c::transform-function - transform)))) - (maybe-make-definition (c::function-info-derive-type info) - 'c::derive-type name) - (maybe-make-definition (c::function-info-optimizer info) - 'c::optimizer name) - (maybe-make-definition (c::function-info-ltn-annotate info) - 'c::ltn-annotate name) - (maybe-make-definition (c::function-info-ir2-convert info) - 'c::ir2-convert name) - (loop for template in (c::function-info-templates info) - collect (list `(,(type-of template) - ,(c::template-name template)) - (function-location - (c::vop-info-generator-function - template)))))))) - -(defun ir1-translator-definitions (name) - (maybe-make-definition (ext:info :function :ir1-convert name) - 'c:def-ir1-translator name)) - -(defun template-definitions (name) - (let* ((templates (c::backend-template-names c::*backend*)) - (template (gethash name templates))) - (etypecase template - (null) - (c::vop-info - (maybe-make-definition (c::vop-info-generator-function template) - (type-of template) name))))) - -;; for cases like: (%primitive NAME ...) -(defun primitive-definitions (name) - (let ((csym (find-symbol (string name) 'c))) - (and csym - (not (eq csym name)) - (template-definitions csym)))) - -(defun vm-support-routine-definitions (name) - (let ((sr (c::backend-support-routines c::*backend*)) - (name (find-symbol (string name) 'c))) - (and name - (slot-exists-p sr name) - (maybe-make-definition (slot-value sr name) - (find-symbol (string 'vm-support-routine) 'c) - name)))) - - -;;;; Documentation. - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind) - (or (documentation symbol kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (multiple-value-bind (kind recorded-p) - (ext:info variable kind symbol) - (declare (ignore kind)) - (if (or (boundp symbol) recorded-p) - (doc 'variable)))) - (when (fboundp symbol) - (maybe-push - (cond ((macro-function symbol) :macro) - ((special-operator-p symbol) :special-operator) - ((genericp (fdefinition symbol)) :generic-function) - (t :function)) - (doc 'function))) - (maybe-push - :setf (if (or (ext:info setf inverse symbol) - (ext:info setf expander symbol)) - (doc 'setf))) - (maybe-push - :type (if (ext:info type kind symbol) - (doc 'type))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - (maybe-push - :alien-type (if (not (eq (ext:info alien-type kind symbol) :unknown)) - (doc 'alien-type))) - (maybe-push - :alien-struct (if (ext:info alien-type struct symbol) - (doc nil))) - (maybe-push - :alien-union (if (ext:info alien-type union symbol) - (doc nil))) - (maybe-push - :alien-enum (if (ext:info alien-type enum symbol) - (doc nil))) - result))) - -(defimplementation describe-definition (symbol namespace) - (describe (ecase namespace - (:variable - symbol) - ((:function :generic-function) - (symbol-function symbol)) - (:setf - (or (ext:info setf inverse symbol) - (ext:info setf expander symbol))) - (:type - (kernel:values-specifier-type symbol)) - (:class - (find-class symbol)) - (:alien-struct - (ext:info :alien-type :struct symbol)) - (:alien-union - (ext:info :alien-type :union symbol)) - (:alien-enum - (ext:info :alien-type :enum symbol)) - (:alien-type - (ecase (ext:info :alien-type :kind symbol) - (:primitive - (let ((alien::*values-type-okay* t)) - (funcall (ext:info :alien-type :translator symbol) - (list symbol)))) - ((:defined) - (ext:info :alien-type :definition symbol)) - (:unknown :unkown)))))) - -;;;;; Argument lists - -(defimplementation arglist (fun) - (etypecase fun - (function (function-arglist fun)) - (symbol (function-arglist (or (macro-function fun) - (symbol-function fun)))))) - -(defun function-arglist (fun) - (let ((arglist - (cond ((eval:interpreted-function-p fun) - (eval:interpreted-function-arglist fun)) - ((pcl::generic-function-p fun) - (pcl:generic-function-lambda-list fun)) - ((c::byte-function-or-closure-p fun) - (byte-code-function-arglist fun)) - ((kernel:%function-arglist (kernel:%function-self fun)) - (handler-case (read-arglist fun) - (error () :not-available))) - ;; this should work both for compiled-debug-function - ;; and for interpreted-debug-function - (t - (handler-case (debug-function-arglist - (di::function-debug-function fun)) - (di:unhandled-condition () :not-available)))))) - (check-type arglist (or list (member :not-available))) - arglist)) - -(defimplementation function-name (function) - (cond ((eval:interpreted-function-p function) - (eval:interpreted-function-name function)) - ((pcl::generic-function-p function) - (pcl::generic-function-name function)) - ((c::byte-function-or-closure-p function) - (c::byte-function-name function)) - (t (kernel:%function-name (kernel:%function-self function))))) - -;;; A simple case: the arglist is available as a string that we can -;;; `read'. - -(defun read-arglist (fn) - "Parse the arglist-string of the function object FN." - (let ((string (kernel:%function-arglist - (kernel:%function-self fn))) - (package (find-package - (c::compiled-debug-info-package - (kernel:%code-debug-info - (vm::find-code-object fn)))))) - (with-standard-io-syntax - (let ((*package* (or package *package*))) - (read-from-string string))))) - -;;; A harder case: an approximate arglist is derived from available -;;; debugging information. - -(defun debug-function-arglist (debug-function) - "Derive the argument list of DEBUG-FUNCTION from debug info." - (let ((args (di::debug-function-lambda-list debug-function)) - (required '()) - (optional '()) - (rest '()) - (key '())) - ;; collect the names of debug-vars - (dolist (arg args) - (etypecase arg - (di::debug-variable - (push (di::debug-variable-symbol arg) required)) - ((member :deleted) - (push ':deleted required)) - (cons - (ecase (car arg) - (:keyword - (push (second arg) key)) - (:optional - (push (debug-variable-symbol-or-deleted (second arg)) optional)) - (:rest - (push (debug-variable-symbol-or-deleted (second arg)) rest)))))) - ;; intersperse lambda keywords as needed - (append (nreverse required) - (if optional (cons '&optional (nreverse optional))) - (if rest (cons '&rest (nreverse rest))) - (if key (cons '&key (nreverse key)))))) - -(defun debug-variable-symbol-or-deleted (var) - (etypecase var - (di:debug-variable - (di::debug-variable-symbol var)) - ((member :deleted) - '#:deleted))) - -(defun symbol-debug-function-arglist (fname) - "Return FNAME's debug-function-arglist and %function-arglist. -A utility for debugging DEBUG-FUNCTION-ARGLIST." - (let ((fn (fdefinition fname))) - (values (debug-function-arglist (di::function-debug-function fn)) - (kernel:%function-arglist (kernel:%function-self fn))))) - -;;; Deriving arglists for byte-compiled functions: -;;; -(defun byte-code-function-arglist (fn) - ;; There doesn't seem to be much arglist information around for - ;; byte-code functions. Use the arg-count and return something like - ;; (arg0 arg1 ...) - (etypecase fn - (c::simple-byte-function - (loop for i from 0 below (c::simple-byte-function-num-args fn) - collect (make-arg-symbol i))) - (c::hairy-byte-function - (hairy-byte-function-arglist fn)) - (c::byte-closure - (byte-code-function-arglist (c::byte-closure-function fn))))) - -(defun make-arg-symbol (i) - (make-symbol (format nil "~A~D" (string 'arg) i))) - -;;; A "hairy" byte-function is one that takes a variable number of -;;; arguments. `hairy-byte-function' is a type from the bytecode -;;; interpreter. -;;; -(defun hairy-byte-function-arglist (fn) - (let ((counter -1)) - (flet ((next-arg () (make-arg-symbol (incf counter)))) - (with-struct (c::hairy-byte-function- min-args max-args rest-arg-p - keywords-p keywords) fn - (let ((arglist '()) - (optional (- max-args min-args))) - ;; XXX isn't there a better way to write this? - ;; (Looks fine to me. -luke) - (dotimes (i min-args) - (push (next-arg) arglist)) - (when (plusp optional) - (push '&optional arglist) - (dotimes (i optional) - (push (next-arg) arglist))) - (when rest-arg-p - (push '&rest arglist) - (push (next-arg) arglist)) - (when keywords-p - (push '&key arglist) - (loop for (key _ __) in keywords - do (push key arglist)) - (when (eq keywords-p :allow-others) - (push '&allow-other-keys arglist))) - (nreverse arglist)))))) - - -;;;; Miscellaneous. - -(defimplementation macroexpand-all (form &optional env) - (walker:macroexpand-all form env)) - -(defimplementation compiler-macroexpand-1 (form &optional env) - (ext:compiler-macroexpand-1 form env)) - -(defimplementation compiler-macroexpand (form &optional env) - (ext:compiler-macroexpand form env)) - -(defimplementation set-default-directory (directory) - (setf (ext:default-directory) (namestring directory)) - ;; Setting *default-pathname-defaults* to an absolute directory - ;; makes the behavior of MERGE-PATHNAMES a bit more intuitive. - (setf *default-pathname-defaults* (pathname (ext:default-directory))) - (default-directory)) - -(defimplementation default-directory () - (namestring (ext:default-directory))) - -(defimplementation getpid () - (unix:unix-getpid)) - -(defimplementation lisp-implementation-type-name () - "cmucl") - -(defimplementation quit-lisp () - (ext::quit)) - -;;; source-path-{stream,file,string,etc}-position moved into -;;; source-path-parser - - -;;;; Debugging - -(defvar *sldb-stack-top*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (unix:unix-sigsetmask 0) - (let* ((*sldb-stack-top* (or debug:*stack-top-hint* (di:top-frame))) - (debug:*stack-top-hint* nil) - (kernel:*current-level* 0)) - (handler-bind ((di::unhandled-condition - (lambda (condition) - (error 'sldb-condition - :original-condition condition)))) - (unwind-protect - (progn - #+(or)(sys:scrub-control-stack) - (funcall debugger-loop-fn)) - #+(or)(sys:scrub-control-stack) - )))) - -(defun frame-down (frame) - (handler-case (di:frame-down frame) - (di:no-debug-info () nil))) - -(defun nth-frame (index) - (do ((frame *sldb-stack-top* (frame-down frame)) - (i index (1- i))) - ((zerop i) frame))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum))) - (loop for f = (nth-frame start) then (frame-down f) - for i from start below end - while f collect f))) - -(defimplementation print-frame (frame stream) - (let ((*standard-output* stream)) - (handler-case - (debug::print-frame-call frame :verbosity 1 :number nil) - (error (e) - (ignore-errors (princ e stream)))))) - -(defimplementation frame-source-location (index) - (let ((frame (nth-frame index))) - (cond ((foreign-frame-p frame) (foreign-frame-source-location frame)) - ((code-location-source-location (di:frame-code-location frame)))))) - -(defimplementation eval-in-frame (form index) - (di:eval-in-frame (nth-frame index) form)) - -(defun frame-debug-vars (frame) - "Return a vector of debug-variables in frame." - (let ((loc (di:frame-code-location frame))) - (remove-if - (lambda (v) - (not (eq (di:debug-variable-validity v loc) :valid))) - (di::debug-function-debug-variables (di:frame-debug-function frame))))) - -(defun debug-var-value (var frame) - (let* ((loc (di:frame-code-location frame)) - (validity (di:debug-variable-validity var loc))) - (ecase validity - (:valid (di:debug-variable-value var frame)) - ((:invalid :unknown) (make-symbol (string validity)))))) - -(defimplementation frame-locals (index) - (let ((frame (nth-frame index))) - (loop for v across (frame-debug-vars frame) - collect (list :name (di:debug-variable-symbol v) - :id (di:debug-variable-id v) - :value (debug-var-value v frame))))) - -(defimplementation frame-var-value (frame var) - (let* ((frame (nth-frame frame)) - (dvar (aref (frame-debug-vars frame) var))) - (debug-var-value dvar frame))) - -(defimplementation frame-catch-tags (index) - (mapcar #'car (di:frame-catches (nth-frame index)))) - -(defimplementation frame-package (frame-number) - (let* ((frame (nth-frame frame-number)) - (dbg-fun (di:frame-debug-function frame))) - (typecase dbg-fun - (di::compiled-debug-function - (let* ((comp (di::compiled-debug-function-component dbg-fun)) - (dbg-info (kernel:%code-debug-info comp))) - (typecase dbg-info - (c::compiled-debug-info - (find-package (c::compiled-debug-info-package dbg-info))))))))) - -(defimplementation return-from-frame (index form) - (let ((sym (find-symbol (string 'find-debug-tag-for-frame) - :debug-internals))) - (if sym - (let* ((frame (nth-frame index)) - (probe (funcall sym frame))) - (cond (probe (throw (car probe) (eval-in-frame form index))) - (t (format nil "Cannot return from frame: ~S" frame)))) - "return-from-frame is not implemented in this version of CMUCL."))) - -(defimplementation activate-stepping (frame) - (set-step-breakpoints (nth-frame frame))) - -(defimplementation sldb-break-on-return (frame) - (break-on-return (nth-frame frame))) - -;;; We set the breakpoint in the caller which might be a bit confusing. -;;; -(defun break-on-return (frame) - (let* ((caller (di:frame-down frame)) - (cl (di:frame-code-location caller))) - (flet ((hook (frame bp) - (when (frame-pointer= frame caller) - (di:delete-breakpoint bp) - (signal-breakpoint bp frame)))) - (let* ((info (ecase (di:code-location-kind cl) - ((:single-value-return :unknown-return) nil) - (:known-return (debug-function-returns - (di:frame-debug-function frame))))) - (bp (di:make-breakpoint #'hook cl :kind :code-location - :info info))) - (di:activate-breakpoint bp) - `(:ok ,(format nil "Set breakpoint in ~A" caller)))))) - -(defun frame-pointer= (frame1 frame2) - "Return true if the frame pointers of FRAME1 and FRAME2 are the same." - (sys:sap= (di::frame-pointer frame1) (di::frame-pointer frame2))) - -;;; The PC in escaped frames at a single-return-value point is -;;; actually vm:single-value-return-byte-offset bytes after the -;;; position given in the debug info. Here we try to recognize such -;;; cases. -;;; -(defun next-code-locations (frame code-location) - "Like `debug::next-code-locations' but be careful in escaped frames." - (let ((next (debug::next-code-locations code-location))) - (flet ((adjust-pc () - (let ((cl (di::copy-compiled-code-location code-location))) - (incf (di::compiled-code-location-pc cl) - vm:single-value-return-byte-offset) - cl))) - (cond ((and (di::compiled-frame-escaped frame) - (eq (di:code-location-kind code-location) - :single-value-return) - (= (length next) 1) - (di:code-location= (car next) (adjust-pc))) - (debug::next-code-locations (car next))) - (t - next))))) - -(defun set-step-breakpoints (frame) - (let ((cl (di:frame-code-location frame))) - (when (di:debug-block-elsewhere-p (di:code-location-debug-block cl)) - (error "Cannot step in elsewhere code")) - (let* ((debug::*bad-code-location-types* - (remove :call-site debug::*bad-code-location-types*)) - (next (next-code-locations frame cl))) - (cond (next - (let ((steppoints '())) - (flet ((hook (bp-frame bp) - (signal-breakpoint bp bp-frame) - (mapc #'di:delete-breakpoint steppoints))) - (dolist (code-location next) - (let ((bp (di:make-breakpoint #'hook code-location - :kind :code-location))) - (di:activate-breakpoint bp) - (push bp steppoints)))))) - (t - (break-on-return frame)))))) - - -;; XXX the return values at return breakpoints should be passed to the -;; user hooks. debug-int.lisp should be changed to do this cleanly. - -;;; The sigcontext and the PC for a breakpoint invocation are not -;;; passed to user hook functions, but we need them to extract return -;;; values. So we advice di::handle-breakpoint and bind the values to -;;; special variables. -;;; -(defvar *breakpoint-sigcontext*) -(defvar *breakpoint-pc*) - -(define-fwrapper bind-breakpoint-sigcontext (offset c sigcontext) - (let ((*breakpoint-sigcontext* sigcontext) - (*breakpoint-pc* offset)) - (call-next-function))) -(set-fwrappers 'di::handle-breakpoint '()) -(fwrap 'di::handle-breakpoint #'bind-breakpoint-sigcontext) - -(defun sigcontext-object (sc index) - "Extract the lisp object in sigcontext SC at offset INDEX." - (kernel:make-lisp-obj (vm:sigcontext-register sc index))) - -(defun known-return-point-values (sigcontext sc-offsets) - (let ((fp (system:int-sap (vm:sigcontext-register sigcontext - vm::cfp-offset)))) - (system:without-gcing - (loop for sc-offset across sc-offsets - collect (di::sub-access-debug-var-slot fp sc-offset sigcontext))))) - -;;; CMUCL returns the first few values in registers and the rest on -;;; the stack. In the multiple value case, the number of values is -;;; stored in a dedicated register. The values of the registers can be -;;; accessed in the sigcontext for the breakpoint. There are 3 kinds -;;; of return conventions: :single-value-return, :unknown-return, and -;;; :known-return. -;;; -;;; The :single-value-return convention returns the value in a -;;; register without setting the nargs registers. -;;; -;;; The :unknown-return variant is used for multiple values. A -;;; :unknown-return point consists actually of 2 breakpoints: one for -;;; the single value case and one for the general case. The single -;;; value breakpoint comes vm:single-value-return-byte-offset after -;;; the multiple value breakpoint. -;;; -;;; The :known-return convention is used by local functions. -;;; :known-return is currently not supported because we don't know -;;; where the values are passed. -;;; -(defun breakpoint-values (breakpoint) - "Return the list of return values for a return point." - (flet ((1st (sc) (sigcontext-object sc (car vm::register-arg-offsets)))) - (let ((sc (locally (declare (optimize (speed 0))) - (alien:sap-alien *breakpoint-sigcontext* (* unix:sigcontext)))) - (cl (di:breakpoint-what breakpoint))) - (ecase (di:code-location-kind cl) - (:single-value-return - (list (1st sc))) - (:known-return - (let ((info (di:breakpoint-info breakpoint))) - (if (vectorp info) - (known-return-point-values sc info) - (progn - ;;(break) - (list "<>" info))))) - (:unknown-return - (let ((mv-return-pc (di::compiled-code-location-pc cl))) - (if (= mv-return-pc *breakpoint-pc*) - (mv-function-end-breakpoint-values sc) - (list (1st sc))))))))) - -;; XXX: di::get-function-end-breakpoint-values takes 2 arguments in -;; newer versions of CMUCL (after ~March 2005). -(defun mv-function-end-breakpoint-values (sigcontext) - (let ((sym (find-symbol "FUNCTION-END-BREAKPOINT-VALUES/STANDARD" :di))) - (cond (sym (funcall sym sigcontext)) - (t (funcall 'di::get-function-end-breakpoint-values sigcontext))))) - -(defun debug-function-returns (debug-fun) - "Return the return style of DEBUG-FUN." - (let* ((cdfun (di::compiled-debug-function-compiler-debug-fun debug-fun))) - (c::compiled-debug-function-returns cdfun))) - -(define-condition breakpoint (simple-condition) - ((message :initarg :message :reader breakpoint.message) - (values :initarg :values :reader breakpoint.values)) - (:report (lambda (c stream) (princ (breakpoint.message c) stream)))) - -(defimplementation condition-extras (condition) - (typecase condition - (breakpoint - ;; pop up the source buffer - `((:show-frame-source 0))) - (t '()))) - -(defun signal-breakpoint (breakpoint frame) - "Signal a breakpoint condition for BREAKPOINT in FRAME. -Try to create a informative message." - (flet ((brk (values fstring &rest args) - (let ((msg (apply #'format nil fstring args)) - (debug:*stack-top-hint* frame)) - (break 'breakpoint :message msg :values values)))) - (with-struct (di::breakpoint- kind what) breakpoint - (case kind - (:code-location - (case (di:code-location-kind what) - ((:single-value-return :known-return :unknown-return) - (let ((values (breakpoint-values breakpoint))) - (brk values "Return value: ~{~S ~}" values))) - (t - #+(or) - (when (eq (di:code-location-kind what) :call-site) - (call-site-function breakpoint frame)) - (brk nil "Breakpoint: ~S ~S" - (di:code-location-kind what) - (di::compiled-code-location-pc what))))) - (:function-start - (brk nil "Function start breakpoint")) - (t (brk nil "Breakpoint: ~A in ~A" breakpoint frame)))))) - -(defimplementation sldb-break-at-start (fname) - (let ((debug-fun (di:function-debug-function (coerce fname 'function)))) - (cond ((not debug-fun) - `(:error ,(format nil "~S has no debug-function" fname))) - (t - (flet ((hook (frame bp &optional args cookie) - (declare (ignore args cookie)) - (signal-breakpoint bp frame))) - (let ((bp (di:make-breakpoint #'hook debug-fun - :kind :function-start))) - (di:activate-breakpoint bp) - `(:ok ,(format nil "Set breakpoint in ~S" fname)))))))) - -(defun frame-cfp (frame) - "Return the Control-Stack-Frame-Pointer for FRAME." - (etypecase frame - (di::compiled-frame (di::frame-pointer frame)) - ((or di::interpreted-frame null) -1))) - -(defun frame-ip (frame) - "Return the (absolute) instruction pointer and the relative pc of FRAME." - (if (not frame) - -1 - (let ((debug-fun (di::frame-debug-function frame))) - (etypecase debug-fun - (di::compiled-debug-function - (let* ((code-loc (di:frame-code-location frame)) - (component (di::compiled-debug-function-component debug-fun)) - (pc (di::compiled-code-location-pc code-loc)) - (ip (sys:without-gcing - (sys:sap-int - (sys:sap+ (kernel:code-instructions component) pc))))) - (values ip pc))) - (di::interpreted-debug-function -1) - (di::bogus-debug-function - #-x86 - (let* ((real (di::frame-real-frame (di::frame-up frame))) - (fp (di::frame-pointer real))) - ;;#+(or) - (progn - (format *debug-io* "Frame-real-frame = ~S~%" real) - (format *debug-io* "fp = ~S~%" fp) - (format *debug-io* "lra = ~S~%" - (kernel:stack-ref fp vm::lra-save-offset))) - (values - (sys:int-sap - (- (kernel:get-lisp-obj-address - (kernel:stack-ref fp vm::lra-save-offset)) - (- (ash vm:function-code-offset vm:word-shift) - vm:function-pointer-type))) - 0)) - #+x86 - (let ((fp (di::frame-pointer (di:frame-up frame)))) - (multiple-value-bind (ra ofp) (di::x86-call-context fp) - (declare (ignore ofp)) - (values ra 0)))))))) - -(defun frame-registers (frame) - "Return the lisp registers CSP, CFP, IP, OCFP, LRA for FRAME-NUMBER." - (let* ((cfp (frame-cfp frame)) - (csp (frame-cfp (di::frame-up frame))) - (ip (frame-ip frame)) - (ocfp (frame-cfp (di::frame-down frame))) - (lra (frame-ip (di::frame-down frame)))) - (values csp cfp ip ocfp lra))) - -(defun print-frame-registers (frame-number) - (let ((frame (di::frame-real-frame (nth-frame frame-number)))) - (flet ((fixnum (p) (etypecase p - (integer p) - (sys:system-area-pointer (sys:sap-int p))))) - (apply #'format t "~ -~8X Stack Pointer -~8X Frame Pointer -~8X Instruction Pointer -~8X Saved Frame Pointer -~8X Saved Instruction Pointer~%" (mapcar #'fixnum - (multiple-value-list (frame-registers frame))))))) - -(defvar *gdb-program-name* - (ext:enumerate-search-list (p "path:gdb") - (when (probe-file p) - (return p)))) - -(defimplementation disassemble-frame (frame-number) - (print-frame-registers frame-number) - (terpri) - (let* ((frame (di::frame-real-frame (nth-frame frame-number))) - (debug-fun (di::frame-debug-function frame))) - (etypecase debug-fun - (di::compiled-debug-function - (let* ((component (di::compiled-debug-function-component debug-fun)) - (fun (di:debug-function-function debug-fun))) - (if fun - (disassemble fun) - (disassem:disassemble-code-component component)))) - (di::bogus-debug-function - (cond ((probe-file *gdb-program-name*) - (let ((ip (sys:sap-int (frame-ip frame)))) - (princ (gdb-command "disas 0x~x" ip)))) - (t - (format t "~%[Disassembling bogus frames not implemented]"))))))) - -(defmacro with-temporary-file ((stream filename) &body body) - `(call/temporary-file (lambda (,stream ,filename) . ,body))) - -(defun call/temporary-file (fun) - (let ((name (system::pick-temporary-file-name))) - (unwind-protect - (with-open-file (stream name :direction :output :if-exists :supersede) - (funcall fun stream name)) - (delete-file name)))) - -(defun gdb-command (format-string &rest args) - (let ((str (gdb-exec (format nil - "interpreter-exec mi2 \"attach ~d\"~%~ - interpreter-exec console ~s~%detach" - (getpid) - (apply #'format nil format-string args)))) - (prompt (format nil - #-(and darwin x86) "~%^done~%(gdb) ~%" - #+(and darwin x86) -"~%^done,thread-id=\"1\"~%(gdb) ~%"))) - (subseq str (+ (or (search prompt str) 0) (length prompt))))) - -(defun gdb-exec (cmd) - (with-temporary-file (file filename) - (write-string cmd file) - (force-output file) - (let* ((output (make-string-output-stream)) - ;; gdb on sparc needs to know the executable to find the - ;; symbols. Without this, gdb can't disassemble anything. - ;; NOTE: We assume that the first entry in - ;; lisp::*cmucl-lib* is the bin directory where lisp is - ;; located. If this is not true, we'll have to do - ;; something better to find the lisp executable. - (lisp-path - #+sparc - (list - (namestring - (probe-file - (merge-pathnames "lisp" (car (lisp::parse-unix-search-path - lisp::*cmucl-lib*)))))) - #-sparc - nil) - (proc (ext:run-program *gdb-program-name* - `(,@lisp-path "-batch" "-x" ,filename) - :wait t - :output output))) - (assert (eq (ext:process-status proc) :exited)) - (assert (eq (ext:process-exit-code proc) 0)) - (get-output-stream-string output)))) - -(defun foreign-frame-p (frame) - #-x86 - (let ((ip (frame-ip frame))) - (and (sys:system-area-pointer-p ip) - (typep (di::frame-debug-function frame) 'di::bogus-debug-function))) - #+x86 - (let ((ip (frame-ip frame))) - (and (sys:system-area-pointer-p ip) - (multiple-value-bind (pc code) - (di::compute-lra-data-from-pc ip) - (declare (ignore pc)) - (not code))))) - -(defun foreign-frame-source-location (frame) - (let ((ip (sys:sap-int (frame-ip frame)))) - (cond ((probe-file *gdb-program-name*) - (parse-gdb-line-info (gdb-command "info line *0x~x" ip))) - (t `(:error "no srcloc available for ~a" frame))))) - -;; The output of gdb looks like: -;; Line 215 of "../../src/lisp/x86-assem.S" -;; starts at address 0x805318c -;; and ends at 0x805318e . -;; The ../../ are fixed up with the "target:" search list which might -;; be wrong sometimes. -(defun parse-gdb-line-info (string) - (with-input-from-string (*standard-input* string) - (let ((w1 (read-word))) - (cond ((equal w1 "Line") - (let ((line (read-word))) - (assert (equal (read-word) "of")) - (let* ((file (read-from-string (read-word))) - (pathname - (or (probe-file file) - (probe-file (format nil "target:lisp/~a" file)) - file))) - (make-location (list :file (unix-truename pathname)) - (list :line (parse-integer line)))))) - (t - `(:error ,string)))))) - -(defun read-word (&optional (stream *standard-input*)) - (peek-char t stream) - (concatenate 'string (loop until (whitespacep (peek-char nil stream)) - collect (read-char stream)))) - -(defun whitespacep (char) - (member char '(#\space #\newline))) - - -;;;; Inspecting - -(defconstant +lowtag-symbols+ - '(vm:even-fixnum-type - vm:function-pointer-type - vm:other-immediate-0-type - vm:list-pointer-type - vm:odd-fixnum-type - vm:instance-pointer-type - vm:other-immediate-1-type - vm:other-pointer-type) - "Names of the constants that specify type tags. -The `symbol-value' of each element is a type tag.") - -(defconstant +header-type-symbols+ - (labels ((suffixp (suffix string) - (and (>= (length string) (length suffix)) - (string= string suffix :start1 (- (length string) - (length suffix))))) - (header-type-symbol-p (x) - (and (suffixp "-TYPE" (symbol-name x)) - (not (member x +lowtag-symbols+)) - (boundp x) - (typep (symbol-value x) 'fixnum)))) - (remove-if-not #'header-type-symbol-p - (append (apropos-list "-TYPE" "VM") - (apropos-list "-TYPE" "BIGNUM")))) - "A list of names of the type codes in boxed objects.") - -(defimplementation describe-primitive-type (object) - (with-output-to-string (*standard-output*) - (let* ((lowtag (kernel:get-lowtag object)) - (lowtag-symbol (find lowtag +lowtag-symbols+ :key #'symbol-value))) - (format t "lowtag: ~A" lowtag-symbol) - (when (member lowtag (list vm:other-pointer-type - vm:function-pointer-type - vm:other-immediate-0-type - vm:other-immediate-1-type - )) - (let* ((type (kernel:get-type object)) - (type-symbol (find type +header-type-symbols+ - :key #'symbol-value))) - (format t ", type: ~A" type-symbol)))))) - -(defmethod emacs-inspect ((o t)) - (cond ((di::indirect-value-cell-p o) - `("Value: " (:value ,(c:value-cell-ref o)))) - ((alien::alien-value-p o) - (inspect-alien-value o)) - (t - (cmucl-inspect o)))) - -(defun cmucl-inspect (o) - (destructuring-bind (text labeledp . parts) (inspect::describe-parts o) - (list* (format nil "~A~%" text) - (if labeledp - (loop for (label . value) in parts - append (label-value-line label value)) - (loop for value in parts for i from 0 - append (label-value-line i value)))))) - -(defmethod emacs-inspect ((o function)) - (let ((header (kernel:get-type o))) - (cond ((= header vm:function-header-type) - (append (label-value-line* - ("Self" (kernel:%function-self o)) - ("Next" (kernel:%function-next o)) - ("Name" (kernel:%function-name o)) - ("Arglist" (kernel:%function-arglist o)) - ("Type" (kernel:%function-type o)) - ("Code" (kernel:function-code-header o))) - (list - (with-output-to-string (s) - (disassem:disassemble-function o :stream s))))) - ((= header vm:closure-header-type) - (list* (format nil "~A is a closure.~%" o) - (append - (label-value-line "Function" (kernel:%closure-function o)) - `("Environment:" (:newline)) - (loop for i from 0 below (1- (kernel:get-closure-length o)) - append (label-value-line - i (kernel:%closure-index-ref o i)))))) - ((eval::interpreted-function-p o) - (cmucl-inspect o)) - (t - (call-next-method))))) - -(defmethod emacs-inspect ((o kernel:funcallable-instance)) - (append (label-value-line* - (:function (kernel:%funcallable-instance-function o)) - (:lexenv (kernel:%funcallable-instance-lexenv o)) - (:layout (kernel:%funcallable-instance-layout o))) - (cmucl-inspect o))) - -(defmethod emacs-inspect ((o kernel:code-component)) - (append - (label-value-line* - ("code-size" (kernel:%code-code-size o)) - ("entry-points" (kernel:%code-entry-points o)) - ("debug-info" (kernel:%code-debug-info o)) - ("trace-table-offset" (kernel:code-header-ref - o vm:code-trace-table-offset-slot))) - `("Constants:" (:newline)) - (loop for i from vm:code-constants-offset - below (kernel:get-header-data o) - append (label-value-line i (kernel:code-header-ref o i))) - `("Code:" - (:newline) - , (with-output-to-string (*standard-output*) - (cond ((c::compiled-debug-info-p (kernel:%code-debug-info o)) - (disassem:disassemble-code-component o)) - ((or - (c::debug-info-p (kernel:%code-debug-info o)) - (consp (kernel:code-header-ref - o vm:code-trace-table-offset-slot))) - (c:disassem-byte-component o)) - (t - (disassem:disassemble-memory - (disassem::align - (+ (logandc2 (kernel:get-lisp-obj-address o) - vm:lowtag-mask) - (* vm:code-constants-offset vm:word-bytes)) - (ash 1 vm:lowtag-bits)) - (ash (kernel:%code-code-size o) vm:word-shift)))))))) - -(defmethod emacs-inspect ((o kernel:fdefn)) - (label-value-line* - ("name" (kernel:fdefn-name o)) - ("function" (kernel:fdefn-function o)) - ("raw-addr" (sys:sap-ref-32 - (sys:int-sap (kernel:get-lisp-obj-address o)) - (* vm:fdefn-raw-addr-slot vm:word-bytes))))) - -#+(or) -(defmethod emacs-inspect ((o array)) - (if (typep o 'simple-array) - (call-next-method) - (label-value-line* - (:header (describe-primitive-type o)) - (:rank (array-rank o)) - (:fill-pointer (kernel:%array-fill-pointer o)) - (:fill-pointer-p (kernel:%array-fill-pointer-p o)) - (:elements (kernel:%array-available-elements o)) - (:data (kernel:%array-data-vector o)) - (:displacement (kernel:%array-displacement o)) - (:displaced-p (kernel:%array-displaced-p o)) - (:dimensions (array-dimensions o))))) - -(defmethod emacs-inspect ((o simple-vector)) - (append - (label-value-line* - (:header (describe-primitive-type o)) - (:length (c::vector-length o))) - (loop for i below (length o) - append (label-value-line i (aref o i))))) - -(defun inspect-alien-record (alien) - (with-struct (alien::alien-value- sap type) alien - (with-struct (alien::alien-record-type- kind name fields) type - (append - (label-value-line* - (:sap sap) - (:kind kind) - (:name name)) - (loop for field in fields - append (let ((slot (alien::alien-record-field-name field))) - (declare (optimize (speed 0))) - (label-value-line slot (alien:slot alien slot)))))))) - -(defun inspect-alien-pointer (alien) - (with-struct (alien::alien-value- sap type) alien - (label-value-line* - (:sap sap) - (:type type) - (:to (alien::deref alien))))) - -(defun inspect-alien-value (alien) - (typecase (alien::alien-value-type alien) - (alien::alien-record-type (inspect-alien-record alien)) - (alien::alien-pointer-type (inspect-alien-pointer alien)) - (t (cmucl-inspect alien)))) - -(defimplementation eval-context (obj) - (cond ((typep (class-of obj) 'structure-class) - (let* ((dd (kernel:layout-info (kernel:layout-of obj))) - (slots (kernel:dd-slots dd))) - (list* (cons '*package* - (symbol-package (if slots - (kernel:dsd-name (car slots)) - (kernel:dd-name dd)))) - (loop for slot in slots collect - (cons (kernel:dsd-name slot) - (funcall (kernel:dsd-accessor slot) obj)))))))) - - -;;;; Profiling -(defimplementation profile (fname) - (eval `(profile:profile ,fname))) - -(defimplementation unprofile (fname) - (eval `(profile:unprofile ,fname))) - -(defimplementation unprofile-all () - (eval `(profile:unprofile)) - "All functions unprofiled.") - -(defimplementation profile-report () - (eval `(profile:report-time))) - -(defimplementation profile-reset () - (eval `(profile:reset-time)) - "Reset profiling counters.") - -(defimplementation profiled-functions () - profile:*timed-functions*) - -(defimplementation profile-package (package callers methods) - (profile:profile-all :package package - :callers-p callers - :methods methods)) - - -;;;; Multiprocessing - -#+mp -(progn - (defimplementation initialize-multiprocessing (continuation) - (mp::init-multi-processing) - (mp:make-process continuation :name "swank") - ;; Threads magic: this never returns! But top-level becomes - ;; available again. - (unless mp::*idle-process* - (mp::startup-idle-and-top-level-loops))) - - (defimplementation spawn (fn &key name) - (mp:make-process fn :name (or name "Anonymous"))) - - (defvar *thread-id-counter* 0) - - (defimplementation thread-id (thread) - (or (getf (mp:process-property-list thread) 'id) - (setf (getf (mp:process-property-list thread) 'id) - (incf *thread-id-counter*)))) - - (defimplementation find-thread (id) - (find id (all-threads) - :key (lambda (p) (getf (mp:process-property-list p) 'id)))) - - (defimplementation thread-name (thread) - (mp:process-name thread)) - - (defimplementation thread-status (thread) - (mp:process-whostate thread)) - - (defimplementation current-thread () - mp:*current-process*) - - (defimplementation all-threads () - (copy-list mp:*all-processes*)) - - (defimplementation interrupt-thread (thread fn) - (mp:process-interrupt thread fn)) - - (defimplementation kill-thread (thread) - (mp:destroy-process thread)) - - (defvar *mailbox-lock* (mp:make-lock "mailbox lock")) - - (defstruct (mailbox (:conc-name mailbox.)) - (mutex (mp:make-lock "process mailbox")) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-lock-held (*mailbox-lock*) - (or (getf (mp:process-property-list thread) 'mailbox) - (setf (getf (mp:process-property-list thread) 'mailbox) - (make-mailbox))))) - - (defimplementation send (thread message) - (check-slime-interrupts) - (let* ((mbox (mailbox thread))) - (mp:with-lock-held ((mailbox.mutex mbox)) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message)))))) - - (defimplementation receive-if (test &optional timeout) - (let ((mbox (mailbox mp:*current-process*))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mp:with-lock-held ((mailbox.mutex mbox)) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) - (nconc (ldiff q tail) (cdr tail))) - (return (car tail))))) - (when (eq timeout t) (return (values nil t))) - (mp:process-wait-with-timeout - "receive-if" 0.5 - (lambda () (some test (mailbox.queue mbox))))))) - - - ) ;; #+mp - - - -;;;; GC hooks -;;; -;;; Display GC messages in the echo area to avoid cluttering the -;;; normal output. -;;; - -;; this should probably not be here, but where else? -(defun background-message (message) - (swank::background-message message)) - -(defun print-bytes (nbytes &optional stream) - "Print the number NBYTES to STREAM in KB, MB, or GB units." - (let ((names '((0 bytes) (10 kb) (20 mb) (30 gb) (40 tb) (50 eb)))) - (multiple-value-bind (power name) - (loop for ((p1 n1) (p2 n2)) on names - while n2 do - (when (<= (expt 2 p1) nbytes (1- (expt 2 p2))) - (return (values p1 n1)))) - (cond (name - (format stream "~,1F ~A" (/ nbytes (expt 2 power)) name)) - (t - (format stream "~:D bytes" nbytes)))))) - -(defconstant gc-generations 6) - -#+gencgc -(defun generation-stats () - "Return a string describing the size distribution among the generations." - (let* ((alloc (loop for i below gc-generations - collect (lisp::gencgc-stats i))) - (sum (coerce (reduce #'+ alloc) 'float))) - (format nil "~{~3F~^/~}" - (mapcar (lambda (size) (/ size sum)) - alloc)))) - -(defvar *gc-start-time* 0) - -(defun pre-gc-hook (bytes-in-use) - (setq *gc-start-time* (get-internal-real-time)) - (let ((msg (format nil "[Commencing GC with ~A in use.]" - (print-bytes bytes-in-use)))) - (background-message msg))) - -(defun post-gc-hook (bytes-retained bytes-freed trigger) - (declare (ignore trigger)) - (let* ((seconds (/ (- (get-internal-real-time) *gc-start-time*) - internal-time-units-per-second)) - (msg (format nil "[GC done. ~A freed ~A retained ~A ~4F sec]" - (print-bytes bytes-freed) - (print-bytes bytes-retained) - #+gencgc(generation-stats) - #-gencgc"" - seconds))) - (background-message msg))) - -(defun install-gc-hooks () - (setq ext:*gc-notify-before* #'pre-gc-hook) - (setq ext:*gc-notify-after* #'post-gc-hook)) - -(defun remove-gc-hooks () - (setq ext:*gc-notify-before* #'lisp::default-gc-notify-before) - (setq ext:*gc-notify-after* #'lisp::default-gc-notify-after)) - -(defvar *install-gc-hooks* t - "If non-nil install GC hooks") - -(defimplementation emacs-connected () - (when *install-gc-hooks* - (install-gc-hooks))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;Trace implementations -;;In CMUCL, we have: -;; (trace ) -;; (trace (method ? (+))) -;; (trace :methods t ') ;;to trace all methods of the gf -;; can be a normal name or a (setf name) - -(defun tracedp (spec) - (member spec (eval '(trace)) :test #'equal)) - -(defun toggle-trace-aux (spec &rest options) - (cond ((tracedp spec) - (eval `(untrace ,spec)) - (format nil "~S is now untraced." spec)) - (t - (eval `(trace ,spec ,@options)) - (format nil "~S is now traced." spec)))) - -(defimplementation toggle-trace (spec) - (ecase (car spec) - ((setf) - (toggle-trace-aux spec)) - ((:defgeneric) - (let ((name (second spec))) - (toggle-trace-aux name :methods name))) - ((:defmethod) - (cond ((fboundp `(method ,@(cdr spec))) - (toggle-trace-aux `(method ,(cdr spec)))) - ;; Man, is this ugly - ((fboundp `(pcl::fast-method ,@(cdr spec))) - (toggle-trace-aux `(pcl::fast-method ,@(cdr spec)))) - (t - (error 'undefined-function :name (cdr spec))))) - ((:call) - (destructuring-bind (caller callee) (cdr spec) - (toggle-trace-aux (process-fspec callee) - :wherein (list (process-fspec caller))))) - ;; doesn't work properly - ;; ((:labels :flet) (toggle-trace-aux (process-fspec spec))) - )) - -(defun process-fspec (fspec) - (cond ((consp fspec) - (ecase (first fspec) - ((:defun :defgeneric) (second fspec)) - ((:defmethod) - `(method ,(second fspec) ,@(third fspec) ,(fourth fspec))) - ((:labels) `(labels ,(third fspec) ,(process-fspec (second fspec)))) - ((:flet) `(flet ,(third fspec) ,(process-fspec (second fspec)))))) - (t - fspec))) - -;;; Weak datastructures - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak-p t args)) - - -;;; Save image - -(defimplementation save-image (filename &optional restart-function) - (multiple-value-bind (pid error) (unix:unix-fork) - (when (not pid) (error "fork: ~A" (unix:get-unix-error-msg error))) - (cond ((= pid 0) - (apply #'ext:save-lisp - filename - (if restart-function - `(:init-function ,restart-function)))) - (t - (let ((status (waitpid pid))) - (destructuring-bind (&key exited? status &allow-other-keys) status - (assert (and exited? (equal status 0)) () - "Invalid exit status: ~a" status))))))) - -(defun waitpid (pid) - (alien:with-alien ((status c-call:int)) - (let ((code (alien:alien-funcall - (alien:extern-alien - waitpid (alien:function c-call:int c-call:int - (* c-call:int) c-call:int)) - pid (alien:addr status) 0))) - (cond ((= code -1) (error "waitpid: ~A" (unix:get-unix-error-msg))) - (t (assert (= code pid)) - (decode-wait-status status)))))) - -(defun decode-wait-status (status) - (let ((output (with-output-to-string (s) - (call-program (list (process-status-program) - (format nil "~d" status)) - :output s)))) - (read-from-string output))) - -(defun call-program (args &key output) - (destructuring-bind (program &rest args) args - (let ((process (ext:run-program program args :output output))) - (when (not program) (error "fork failed")) - (unless (and (eq (ext:process-status process) :exited) - (= (ext:process-exit-code process) 0)) - (error "Non-zero exit status"))))) - -(defvar *process-status-program* nil) - -(defun process-status-program () - (or *process-status-program* - (setq *process-status-program* - (compile-process-status-program)))) - -(defun compile-process-status-program () - (let ((infile (system::pick-temporary-file-name - "/tmp/process-status~d~c.c"))) - (with-open-file (stream infile :direction :output :if-exists :supersede) - (format stream " -#include -#include -#include -#include -#include - -#define FLAG(value) (value ? \"t\" : \"nil\") - -int main (int argc, char** argv) { - assert (argc == 2); - { - char* endptr = NULL; - char* arg = argv[1]; - long int status = strtol (arg, &endptr, 10); - assert (endptr != arg && *endptr == '\\0'); - printf (\"(:exited? %s :status %d :signal? %s :signal %d :coredump? %s\" - \" :stopped? %s :stopsig %d)\\n\", - FLAG(WIFEXITED(status)), WEXITSTATUS(status), - FLAG(WIFSIGNALED(status)), WTERMSIG(status), - FLAG(WCOREDUMP(status)), - FLAG(WIFSTOPPED(status)), WSTOPSIG(status)); - fflush (NULL); - return 0; - } -} -") - (finish-output stream)) - (let* ((outfile (system::pick-temporary-file-name)) - (args (list "cc" "-o" outfile infile))) - (warn "Running cc: ~{~a ~}~%" args) - (call-program args :output t) - (delete-file infile) - outfile))) - -;; FIXME: lisp:unicode-complete introduced in version 20d. -#+#.(swank/backend:with-symbol 'unicode-complete 'lisp) -(defun match-semi-standard (prefix matchp) - ;; Handle the CMUCL's short character names. - (loop for name in lisp::char-name-alist - when (funcall matchp prefix (car name)) - collect (car name))) - -#+#.(swank/backend:with-symbol 'unicode-complete 'lisp) -(defimplementation character-completion-set (prefix matchp) - (let ((names (lisp::unicode-complete prefix))) - ;; Match prefix against semistandard names. If there's a match, - ;; add it to our list of matches. - (let ((semi-standard (match-semi-standard prefix matchp))) - (when semi-standard - (setf names (append semi-standard names)))) - (setf names (mapcar #'string-capitalize names)) - (loop for n in names - when (funcall matchp prefix n) - collect n))) diff --git a/elpa/slime-20200414.1444/swank/corman.lisp b/elpa/slime-20200414.1444/swank/corman.lisp deleted file mode 100644 index 3e34f19a..00000000 --- a/elpa/slime-20200414.1444/swank/corman.lisp +++ /dev/null @@ -1,583 +0,0 @@ -;;; -;;; swank-corman.lisp --- Corman Lisp specific code for SLIME. -;;; -;;; Copyright (C) 2004, 2005 Espen Wiborg (espenhw@grumblesmurf.org) -;;; -;;; License -;;; ======= -;;; This software is provided 'as-is', without any express or implied -;;; warranty. In no event will the author be held liable for any damages -;;; arising from the use of this software. -;;; -;;; Permission is granted to anyone to use this software for any purpose, -;;; including commercial applications, and to alter it and redistribute -;;; it freely, subject to the following restrictions: -;;; -;;; 1. The origin of this software must not be misrepresented; you must -;;; not claim that you wrote the original software. If you use this -;;; software in a product, an acknowledgment in the product documentation -;;; would be appreciated but is not required. -;;; -;;; 2. Altered source versions must be plainly marked as such, and must -;;; not be misrepresented as being the original software. -;;; -;;; 3. This notice may not be removed or altered from any source -;;; distribution. -;;; -;;; Notes -;;; ===== -;;; You will need CCL 2.51, and you will *definitely* need to patch -;;; CCL with the patches at -;;; http://www.grumblesmurf.org/lisp/corman-patches, otherwise SLIME -;;; will blow up in your face. You should also follow the -;;; instructions on http://www.grumblesmurf.org/lisp/corman-slime. -;;; -;;; The only communication style currently supported is NIL. -;;; -;;; Starting CCL inside emacs (with M-x slime) seems to work for me -;;; with Corman Lisp 2.51, but I have seen random failures with 2.5 -;;; (sometimes it works, other times it hangs on start or hangs when -;;; initializing WinSock) - starting CCL externally and using M-x -;;; slime-connect always works fine. -;;; -;;; Sometimes CCL gets confused and starts giving you random memory -;;; access violation errors on startup; if this happens, try redumping -;;; your image. -;;; -;;; What works -;;; ========== -;;; * Basic editing and evaluation -;;; * Arglist display -;;; * Compilation -;;; * Loading files -;;; * apropos/describe -;;; * Debugger -;;; * Inspector -;;; -;;; TODO -;;; ==== -;;; * More debugger functionality (missing bits: restart-frame, -;;; return-from-frame, disassemble-frame, activate-stepping, -;;; toggle-trace) -;;; * XREF -;;; * Profiling -;;; * More sophisticated communication styles than NIL -;;; - -(in-package :swank/backend) - -;;; Pull in various needed bits -(require :composite-streams) -(require :sockets) -(require :winbase) -(require :lp) - -(use-package :gs) - -;; MOP stuff - -(defclass swank-mop:standard-slot-definition () - () - (:documentation - "Dummy class created so that swank.lisp will compile and load.")) - -(defun named-by-gensym-p (c) - (null (symbol-package (class-name c)))) - -(deftype swank-mop:eql-specializer () - '(satisfies named-by-gensym-p)) - -(defun swank-mop:eql-specializer-object (specializer) - (with-hash-table-iterator (next-entry cl::*clos-singleton-specializers*) - (loop (multiple-value-bind (more key value) - (next-entry) - (unless more (return nil)) - (when (eq specializer value) - (return key)))))) - -(defun swank-mop:class-finalized-p (class) - (declare (ignore class)) - t) - -(defun swank-mop:class-prototype (class) - (make-instance class)) - -(defun swank-mop:specializer-direct-methods (obj) - (declare (ignore obj)) - nil) - -(defun swank-mop:generic-function-argument-precedence-order (gf) - (generic-function-lambda-list gf)) - -(defun swank-mop:generic-function-method-combination (gf) - (declare (ignore gf)) - :standard) - -(defun swank-mop:generic-function-declarations (gf) - (declare (ignore gf)) - nil) - -(defun swank-mop:slot-definition-documentation (slot) - (declare (ignore slot)) - (getf slot :documentation nil)) - -(defun swank-mop:slot-definition-type (slot) - (declare (ignore slot)) - t) - -(import-swank-mop-symbols :cl '(;; classes - :standard-slot-definition - :eql-specializer - :eql-specializer-object - ;; standard class readers - :class-default-initargs - :class-direct-default-initargs - :class-finalized-p - :class-prototype - :specializer-direct-methods - ;; gf readers - :generic-function-argument-precedence-order - :generic-function-declarations - :generic-function-method-combination - ;; method readers - ;; slot readers - :slot-definition-documentation - :slot-definition-type)) - -;;;; swank implementations - -;;; Debugger - -(defvar *stack-trace* nil) -(defvar *frame-trace* nil) - -(defstruct frame - name function address debug-info variables) - -(defimplementation call-with-debugging-environment (fn) - (let* ((real-stack-trace (cl::stack-trace)) - (*stack-trace* (cdr (member 'cl:invoke-debugger real-stack-trace - :key #'car))) - (*frame-trace* - (let* ((db::*debug-level* (1+ db::*debug-level*)) - (db::*debug-frame-pointer* (db::stash-ebp - (ct:create-foreign-ptr))) - (db::*debug-max-level* (length real-stack-trace)) - (db::*debug-min-level* 1)) - (cdr (member #'cl:invoke-debugger - (cons - (make-frame :function nil) - (loop for i from db::*debug-min-level* - upto db::*debug-max-level* - until (eq (db::get-frame-function i) - cl::*top-level*) - collect - (make-frame - :function (db::get-frame-function i) - :address (db::get-frame-address i)))) - :key #'frame-function))))) - (funcall fn))) - -(defimplementation compute-backtrace (start end) - (loop for f in (subseq *stack-trace* start (min end (length *stack-trace*))) - collect f)) - -(defimplementation print-frame (frame stream) - (format stream "~S" frame)) - -(defun get-frame-debug-info (frame) - (or (frame-debug-info frame) - (setf (frame-debug-info frame) - (db::prepare-frame-debug-info (frame-function frame) - (frame-address frame))))) - -(defimplementation frame-locals (frame-number) - (let* ((frame (elt *frame-trace* frame-number)) - (info (get-frame-debug-info frame))) - (let ((var-list - (loop for i from 4 below (length info) by 2 - collect `(list :name ',(svref info i) :id 0 - :value (db::debug-filter ,(svref info i)))))) - (let ((vars (eval-in-frame `(list ,@var-list) frame-number))) - (setf (frame-variables frame) vars))))) - -(defimplementation eval-in-frame (form frame-number) - (let ((frame (elt *frame-trace* frame-number))) - (let ((cl::*compiler-environment* (get-frame-debug-info frame))) - (eval form)))) - -(defimplementation frame-var-value (frame-number var) - (let ((vars (frame-variables (elt *frame-trace* frame-number)))) - (when vars - (second (elt vars var))))) - -(defimplementation frame-source-location (frame-number) - (fspec-location (frame-function (elt *frame-trace* frame-number)))) - -(defun break (&optional (format-control "Break") &rest format-arguments) - (with-simple-restart (continue "Return from BREAK.") - (let ();(*debugger-hook* nil)) - (let ((condition - (make-condition 'simple-condition - :format-control format-control - :format-arguments format-arguments))) - ;;(format *debug-io* ";;; User break: ~A~%" condition) - (invoke-debugger condition)))) - nil) - -;;; Socket communication - -(defimplementation create-socket (host port &key backlog) - (sockets:start-sockets) - (sockets:make-server-socket :host host :port port)) - -(defimplementation local-port (socket) - (sockets:socket-port socket)) - -(defimplementation close-socket (socket) - (close socket)) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (declare (ignore buffering timeout external-format)) - (sockets:make-socket-stream (sockets:accept-socket socket))) - -;;; Misc - -(defimplementation preferred-communication-style () - nil) - -(defimplementation getpid () - ccl:*current-process-id*) - -(defimplementation lisp-implementation-type-name () - "cormanlisp") - -(defimplementation quit-lisp () - (sockets:stop-sockets) - (win32:exitprocess 0)) - -(defimplementation set-default-directory (directory) - (setf (ccl:current-directory) directory) - (directory-namestring (setf *default-pathname-defaults* - (truename (merge-pathnames directory))))) - -(defimplementation default-directory () - (directory-namestring (ccl:current-directory))) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (ccl:macroexpand-all form)) - -;;; Documentation - -(defun fspec-location (fspec) - (when (symbolp fspec) - (setq fspec (symbol-function fspec))) - (let ((file (ccl::function-source-file fspec))) - (if file - (handler-case - (let ((truename (truename - (merge-pathnames file - ccl:*cormanlisp-directory*)))) - (make-location (list :file (namestring truename)) - (if (ccl::function-source-line fspec) - (list :line - (1+ (ccl::function-source-line fspec))) - (list :function-name - (princ-to-string - (function-name fspec)))))) - (error (c) (list :error (princ-to-string c)))) - (list :error (format nil "No source information available for ~S" - fspec))))) - -(defimplementation find-definitions (name) - (list (list name (fspec-location name)))) - -(defimplementation arglist (name) - (handler-case - (cond ((and (symbolp name) - (macro-function name)) - (ccl::macro-lambda-list (symbol-function name))) - (t - (when (symbolp name) - (setq name (symbol-function name))) - (if (eq (class-of name) cl::the-class-standard-gf) - (generic-function-lambda-list name) - (ccl:function-lambda-list name)))) - (error () :not-available))) - -(defimplementation function-name (fn) - (handler-case (getf (cl::function-info-list fn) 'cl::function-name) - (error () nil))) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind &optional (sym symbol)) - (or (documentation sym kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (maybe-push - :function (if (fboundp symbol) - (doc 'function))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - result))) - -(defimplementation describe-definition (symbol namespace) - (ecase namespace - (:variable - (describe symbol)) - ((:function :generic-function) - (describe (symbol-function symbol))) - (:class - (describe (find-class symbol))))) - -;;; Compiler - -(defvar *buffer-name* nil) -(defvar *buffer-position*) -(defvar *buffer-string*) -(defvar *compile-filename* nil) - -;; FIXME -(defimplementation call-with-compilation-hooks (FN) - (handler-bind ((error (lambda (c) - (signal 'compiler-condition - :original-condition c - :severity :warning - :message (format nil "~A" c) - :location - (cond (*buffer-name* - (make-location - (list :buffer *buffer-name*) - (list :offset *buffer-position* 0))) - (*compile-filename* - (make-location - (list :file *compile-filename*) - (list :position 1))) - (t - (list :error "No location"))))))) - (funcall fn))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore external-format policy)) - (with-compilation-hooks () - (let ((*buffer-name* nil) - (*compile-filename* input-file)) - (multiple-value-bind (output-file warnings? failure?) - (compile-file input-file :output-file output-file) - (values output-file warnings? - (or failure? (and load-p (load output-file)))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore filename line column policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-position* position) - (*buffer-string* string)) - (funcall (compile nil (read-from-string - (format nil "(~S () ~A)" 'lambda string)))) - t))) - -;;;; Inspecting - -;; Hack to make swank.lisp load, at least -(defclass file-stream ()) - -(defun comma-separated (list &optional (callback (lambda (v) - `(:value ,v)))) - (butlast (loop for e in list - collect (funcall callback e) - collect ", "))) - -(defmethod emacs-inspect ((class standard-class)) - `("Name: " - (:value ,(class-name class)) - (:newline) - "Super classes: " - ,@(comma-separated (swank-mop:class-direct-superclasses class)) - (:newline) - "Direct Slots: " - ,@(comma-separated - (swank-mop:class-direct-slots class) - (lambda (slot) - `(:value ,slot - ,(princ-to-string - (swank-mop:slot-definition-name slot))))) - (:newline) - "Effective Slots: " - ,@(if (swank-mop:class-finalized-p class) - (comma-separated - (swank-mop:class-slots class) - (lambda (slot) - `(:value ,slot ,(princ-to-string - (swank-mop:slot-definition-name slot))))) - '("#")) - (:newline) - ,@(when (documentation class t) - `("Documentation:" (:newline) ,(documentation class t) (:newline))) - "Sub classes: " - ,@(comma-separated (swank-mop:class-direct-subclasses class) - (lambda (sub) - `(:value ,sub ,(princ-to-string (class-name sub))))) - (:newline) - "Precedence List: " - ,@(if (swank-mop:class-finalized-p class) - (comma-separated - (swank-mop:class-precedence-list class) - (lambda (class) - `(:value ,class - ,(princ-to-string (class-name class))))) - '("#")) - (:newline))) - -(defmethod emacs-inspect ((slot cons)) - ;; Inspects slot definitions - (if (eq (car slot) :name) - `("Name: " (:value ,(swank-mop:slot-definition-name slot)) - (:newline) - ,@(when (swank-mop:slot-definition-documentation slot) - `("Documentation:" - (:newline) - (:value - ,(swank-mop:slot-definition-documentation slot)) - (:newline))) - "Init args: " (:value - ,(swank-mop:slot-definition-initargs slot)) - (:newline) - "Init form: " - ,(if (swank-mop:slot-definition-initfunction slot) - `(:value ,(swank-mop:slot-definition-initform slot)) - "#") (:newline) - "Init function: " - (:value ,(swank-mop:slot-definition-initfunction slot)) - (:newline)) - (call-next-method))) - -(defmethod emacs-inspect ((pathname pathnames::pathname-internal)) - (list* (if (wild-pathname-p pathname) - "A wild pathname." - "A pathname.") - '(:newline) - (append (label-value-line* - ("Namestring" (namestring pathname)) - ("Host" (pathname-host pathname)) - ("Device" (pathname-device pathname)) - ("Directory" (pathname-directory pathname)) - ("Name" (pathname-name pathname)) - ("Type" (pathname-type pathname)) - ("Version" (pathname-version pathname))) - (unless (or (wild-pathname-p pathname) - (not (probe-file pathname))) - (label-value-line "Truename" (truename pathname)))))) - -(defmethod emacs-inspect ((o t)) - (cond ((cl::structurep o) (inspect-structure o)) - (t (call-next-method)))) - -(defun inspect-structure (o) - (let* ((template (cl::uref o 1)) - (num-slots (cl::struct-template-num-slots template))) - (cond ((symbolp template) - (loop for i below num-slots - append (label-value-line i (cl::uref o (+ 2 i))))) - (t - (loop for i below num-slots - append (label-value-line (elt template (+ 6 (* i 5))) - (cl::uref o (+ 2 i)))))))) - - -;;; Threads - -(require 'threads) - -(defstruct (mailbox (:conc-name mailbox.)) - thread - (lock (make-instance 'threads:critical-section)) - (queue '() :type list)) - -(defvar *mailbox-lock* (make-instance 'threads:critical-section)) -(defvar *mailboxes* (list)) - -(defmacro with-lock (lock &body body) - `(threads:with-synchronization (threads:cs ,lock) - ,@body)) - -(defimplementation spawn (fun &key name) - (declare (ignore name)) - (th:create-thread - (lambda () - (handler-bind ((serious-condition #'invoke-debugger)) - (unwind-protect (funcall fun) - (with-lock *mailbox-lock* - (setq *mailboxes* (remove cormanlisp:*current-thread-id* - *mailboxes* :key #'mailbox.thread)))))))) - -(defimplementation thread-id (thread) - thread) - -(defimplementation find-thread (thread) - (if (thread-alive-p thread) - thread)) - -(defimplementation thread-alive-p (thread) - (if (threads:thread-handle thread) t nil)) - -(defimplementation current-thread () - cormanlisp:*current-thread-id*) - -;; XXX implement it -(defimplementation all-threads () - '()) - -;; XXX something here is broken -(defimplementation kill-thread (thread) - (threads:terminate-thread thread 'killed)) - -(defun mailbox (thread) - (with-lock *mailbox-lock* - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - -(defimplementation send (thread message) - (let ((mbox (mailbox thread))) - (with-lock (mailbox.lock mbox) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message)))))) - -(defimplementation receive () - (let ((mbox (mailbox cormanlisp:*current-thread-id*))) - (loop - (with-lock (mailbox.lock mbox) - (when (mailbox.queue mbox) - (return (pop (mailbox.queue mbox))))) - (sleep 0.1)))) - - -;;; This is probably not good, but it WFM -(in-package :common-lisp) - -(defvar *old-documentation* #'documentation) -(defun documentation (thing &optional (type 'function)) - (if (symbolp thing) - (funcall *old-documentation* thing type) - (values))) - -(defmethod print-object ((restart restart) stream) - (if (or *print-escape* - *print-readably*) - (print-unreadable-object (restart stream :type t :identity t) - (princ (restart-name restart) stream)) - (when (functionp (restart-report-function restart)) - (funcall (restart-report-function restart) stream)))) diff --git a/elpa/slime-20200414.1444/swank/ecl.lisp b/elpa/slime-20200414.1444/swank/ecl.lisp deleted file mode 100644 index 0c5bb1ce..00000000 --- a/elpa/slime-20200414.1444/swank/ecl.lisp +++ /dev/null @@ -1,1098 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-ecl.lisp --- SLIME backend for ECL. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -;;; Administrivia - -(defpackage swank/ecl - (:use cl swank/backend)) - -(in-package swank/ecl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun ecl-version () - (let ((version (find-symbol "+ECL-VERSION-NUMBER+" :EXT))) - (if version - (symbol-value version) - 0))) - (when (< (ecl-version) 100301) - (error "~&IMPORTANT:~% ~ - The version of ECL you're using (~A) is too old.~% ~ - Please upgrade to at least 10.3.1.~% ~ - Sorry for the inconvenience.~%~%" - (lisp-implementation-version)))) - -;; Hard dependencies. -(eval-when (:compile-toplevel :load-toplevel :execute) - (require 'sockets)) - -;; Soft dependencies. -(eval-when (:compile-toplevel :load-toplevel :execute) - (when (probe-file "sys:profile.fas") - (require :profile) - (pushnew :profile *features*)) - (when (probe-file "sys:serve-event.fas") - (require :serve-event) - (pushnew :serve-event *features*))) - -(declaim (optimize (debug 3))) - -;;; Swank-mop - -(eval-when (:compile-toplevel :load-toplevel :execute) - (import-swank-mop-symbols - :clos - (and (< (ecl-version) 121201) - `(:eql-specializer - :eql-specializer-object - :generic-function-declarations - :specializer-direct-methods - ,@(unless (fboundp 'clos:compute-applicable-methods-using-classes) - '(:compute-applicable-methods-using-classes)))))) - -(defimplementation gray-package-name () - "GRAY") - - -;;;; UTF8 - -;;; Convert the string STRING to a (simple-array (unsigned-byte 8)). -;;; -;;; string-to-utf8 (string) - -;;; Convert the (simple-array (unsigned-byte 8)) OCTETS to a string. -;;; -;;; utf8-to-string (octets) - - -;;;; TCP Server - -(defun resolve-hostname (name) - (car (sb-bsd-sockets:host-ent-addresses - (sb-bsd-sockets:get-host-by-name name)))) - -(defimplementation create-socket (host port &key backlog) - (let ((socket (make-instance 'sb-bsd-sockets:inet-socket - :type :stream - :protocol :tcp))) - (setf (sb-bsd-sockets:sockopt-reuse-address socket) t) - (sb-bsd-sockets:socket-bind socket (resolve-hostname host) port) - (sb-bsd-sockets:socket-listen socket (or backlog 5)) - socket)) - -(defimplementation local-port (socket) - (nth-value 1 (sb-bsd-sockets:socket-name socket))) - -(defimplementation close-socket (socket) - (sb-bsd-sockets:socket-close socket)) - -(defun accept (socket) - "Like socket-accept, but retry on EAGAIN." - (loop (handler-case - (return (sb-bsd-sockets:socket-accept socket)) - (sb-bsd-sockets:interrupted-error ())))) - -(defimplementation accept-connection (socket - &key external-format - buffering timeout) - (declare (ignore timeout)) - (sb-bsd-sockets:socket-make-stream (accept socket) - :output t - :input t - :buffering (ecase buffering - ((t) :full) - ((nil) :none) - (:line :line)) - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format external-format)) - -;;; Call FN whenever SOCKET is readable. -;;; -;;; add-sigio-handler (socket fn) - -;;; Remove all sigio handlers for SOCKET. -;;; -;;; remove-sigio-handlers (socket) - -;;; Call FN when Lisp is waiting for input and SOCKET is readable. -;;; -;;; add-fd-handler (socket fn) - -;;; Remove all fd-handlers for SOCKET. -;;; -;;; remove-fd-handlers (socket) - -(defimplementation preferred-communication-style () - (cond - ((member :threads *features*) :spawn) - ((member :windows *features*) nil) - (t #|:fd-handler|# nil))) - -;;; Set the 'stream 'timeout. The timeout is either the real number -;;; specifying the timeout in seconds or 'nil for no timeout. -;;; -;;; set-stream-timeout (stream timeout) - - -;;; Hook called when the first connection from Emacs is established. -;;; Called from the INIT-FN of the socket server that accepts the -;;; connection. -;;; -;;; This is intended for setting up extra context, e.g. to discover -;;; that the calling thread is the one that interacts with Emacs. -;;; -;;; emacs-connected () - - -;;;; Unix Integration - -(defimplementation getpid () - (si:getpid)) - -;;; Call FUNCTION on SIGINT (instead of invoking the debugger). -;;; Return old signal handler. -;;; -;;; install-sigint-handler (function) - -;;; XXX! -;;; If ECL is built with thread support, it'll spawn a helper thread -;;; executing the SIGINT handler. We do not want to BREAK into that -;;; helper but into the main thread, though. This is coupled with the -;;; current choice of NIL as communication-style in so far as ECL's -;;; main-thread is also the Slime's REPL thread. - -(defun make-interrupt-handler (real-handler) - #+threads - (let ((main-thread (find 'si:top-level (mp:all-processes) - :key #'mp:process-name))) - #'(lambda (&rest args) - (declare (ignore args)) - (mp:interrupt-process main-thread real-handler))) - #-threads - #'(lambda (&rest args) - (declare (ignore args)) - (funcall real-handler))) - -(defimplementation call-with-user-break-handler (real-handler function) - (let ((old-handler #'si:terminal-interrupt)) - (setf (symbol-function 'si:terminal-interrupt) - (make-interrupt-handler real-handler)) - (unwind-protect (funcall function) - (setf (symbol-function 'si:terminal-interrupt) old-handler)))) - -(defimplementation quit-lisp () - (ext:quit)) - -;;; Default implementation is fine. -;;; -;;; lisp-implementation-type-name -;;; lisp-implementation-program - -(defimplementation socket-fd (socket) - (etypecase socket - (fixnum socket) - (two-way-stream (socket-fd (two-way-stream-input-stream socket))) - (sb-bsd-sockets:socket (sb-bsd-sockets:socket-file-descriptor socket)) - (file-stream (si:file-stream-fd socket)))) - -;;; Create a character stream for the file descriptor FD. This -;;; interface implementation requires either `ffi:c-inline' or has to -;;; wait for the exported interface. -;;; -;;; make-fd-stream (socket-stream) - -;;; Duplicate a file descriptor. If the syscall fails, signal a -;;; condition. See dup(2). This interface requiers `ffi:c-inline' or -;;; has to wait for the exported interface. -;;; -;;; dup (fd) - -;;; Does not apply to ECL which doesn't dump images. -;;; -;;; exec-image (image-file args) - -(defimplementation command-line-args () - (ext:command-args)) - - -;;;; pathnames - -;;; Return a pathname for FILENAME. -;;; A filename in Emacs may for example contain asterisks which should not -;;; be translated to wildcards. -;;; -;;; filename-to-pathname (filename) - -;;; Return the filename for PATHNAME. -;;; -;;; pathname-to-filename (pathname) - -(defimplementation default-directory () - (namestring (ext:getcwd))) - -(defimplementation set-default-directory (directory) - (ext:chdir (namestring directory)) ; adapts *DEFAULT-PATHNAME-DEFAULTS*. - (default-directory)) - - -;;; Call FN with hooks to handle special syntax. Can we use it for -;;; `ffi:c-inline' to be handled as C/C++ code? -;;; -;;; call-with-syntax-hooks - -;;; Return a suitable initial value for SWANK:*READTABLE-ALIST*. -;;; -;;; default-readtable-alist - - -;;;; Packages - -#+package-local-nicknames -(defimplementation package-local-nicknames (package) - (ext:package-local-nicknames package)) - - -;;;; Compilation - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) - -(defun signal-compiler-condition (&rest args) - (apply #'signal 'compiler-condition args)) - -#-ecl-bytecmp -(defun handle-compiler-message (condition) - ;; ECL emits lots of noise in compiler-notes, like "Invoking - ;; external command". - (unless (typep condition 'c::compiler-note) - (signal-compiler-condition - :original-condition condition - :message (princ-to-string condition) - :severity (etypecase condition - (c:compiler-fatal-error :error) - (c:compiler-error :error) - (error :error) - (style-warning :style-warning) - (warning :warning)) - :location (condition-location condition)))) - -#-ecl-bytecmp -(defun condition-location (condition) - (let ((file (c:compiler-message-file condition)) - (position (c:compiler-message-file-position condition))) - (if (and position (not (minusp position))) - (if *buffer-name* - (make-buffer-location *buffer-name* - *buffer-start-position* - position) - (make-file-location file position)) - (make-error-location "No location found.")))) - -(defimplementation call-with-compilation-hooks (function) - #+ecl-bytecmp - (funcall function) - #-ecl-bytecmp - (handler-bind ((c:compiler-message #'handle-compiler-message)) - (funcall function))) - -(defvar *tmpfile-map* (make-hash-table :test #'equal)) - -(defun note-buffer-tmpfile (tmp-file buffer-name) - ;; EXT:COMPILED-FUNCTION-FILE below will return a namestring. - (let ((tmp-namestring (namestring (truename tmp-file)))) - (setf (gethash tmp-namestring *tmpfile-map*) buffer-name) - tmp-namestring)) - -(defun tmpfile-to-buffer (tmp-file) - (gethash tmp-file *tmpfile-map*)) - -(defimplementation swank-compile-string - (string &key buffer position filename line column policy) - (declare (ignore line column policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) ; for compilation hooks - (*buffer-start-position* position)) - (let ((tmp-file (si:mkstemp "TMP:ecl-swank-tmpfile-")) - (fasl-file) - (warnings-p) - (failure-p)) - (unwind-protect - (with-open-file (tmp-stream tmp-file :direction :output - :if-exists :supersede) - (write-string string tmp-stream) - (finish-output tmp-stream) - (multiple-value-setq (fasl-file warnings-p failure-p) - (compile-file tmp-file - :load t - :source-truename (or filename - (note-buffer-tmpfile tmp-file buffer)) - :source-offset (1- position)))) - (when (probe-file tmp-file) - (delete-file tmp-file)) - (when fasl-file - (delete-file fasl-file))) - (not failure-p))))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (compile-file input-file :output-file output-file - :load load-p - :external-format external-format))) - -(defvar *external-format-to-coding-system* - '((:latin-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix"))) - -(defun external-format (coding-system) - (or (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*)) - (find coding-system (ext:all-encodings) :test #'string-equal))) - -(defimplementation find-external-format (coding-system) - #+unicode (external-format coding-system) - ;; Without unicode support, ECL uses the one-byte encoding of the - ;; underlying OS, and will barf on anything except :DEFAULT. We - ;; return NIL here for known multibyte encodings, so - ;; SWANK:CREATE-SERVER will barf. - #-unicode (let ((xf (external-format coding-system))) - (if (member xf '(:utf-8)) - nil - :default))) - - -;;; Default implementation is fine -;;; -;;; guess-external-format - - -;;;; Streams - -;;; Implemented in `gray' -;;; -;;; make-output-stream -;;; make-input-stream - - -;;;; Documentation - -(defimplementation arglist (name) - (multiple-value-bind (arglist foundp) - (ext:function-lambda-list name) - (if foundp arglist :not-available))) - -(defimplementation type-specifier-p (symbol) - (or (subtypep nil symbol) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(defimplementation function-name (f) - (typecase f - (generic-function (clos:generic-function-name f)) - (function (si:compiled-function-name f)))) - -;;; Default implementation is fine (CL). -;;; -;;; valid-function-name-p (form) - -#+walker -(defimplementation macroexpand-all (form &optional env) - (walker:macroexpand-all form env)) - -;;; Default implementation is fine. -;;; -;;; compiler-macroexpand-1 -;;; compiler-macroexpand - -(defimplementation collect-macro-forms (form &optional env) - ;; Currently detects only normal macros, not compiler macros. - (declare (ignore env)) - (with-collected-macro-forms (macro-forms) - (handler-bind ((warning #'muffle-warning)) - (ignore-errors - (compile nil `(lambda () ,form)))) - (values macro-forms nil))) - -;;; Expand the format string CONTROL-STRING. -;;; Default implementation is fine. -;;; -;;; format-string-expand - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((frob (type boundp) - (when (funcall boundp symbol) - (let ((doc (describe-definition symbol type))) - (setf result (list* type doc result)))))) - (frob :VARIABLE #'boundp) - (frob :FUNCTION #'fboundp) - (frob :CLASS (lambda (x) (find-class x nil)))) - result)) - -(defimplementation describe-definition (name type) - (case type - (:variable (documentation name 'variable)) - (:function (documentation name 'function)) - (:class (documentation name 'class)) - (t nil))) - - -;;;; Debugging - -(eval-when (:compile-toplevel :load-toplevel :execute) - (import - '(si::*break-env* - si::*ihs-top* - si::*ihs-current* - si::*ihs-base* - si::*frs-base* - si::*frs-top* - si::*tpl-commands* - si::*tpl-level* - si::frs-top - si::ihs-top - si::ihs-fun - si::ihs-env - si::sch-frs-base - si::set-break-env - si::set-current-ihs - si::tpl-commands))) - -(defun make-invoke-debugger-hook (hook) - (when hook - #'(lambda (condition old-hook) - ;; Regard *debugger-hook* if set by user. - (if *debugger-hook* - nil ; decline, *DEBUGGER-HOOK* will be tried next. - (funcall hook condition old-hook))))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setq ext:*invoke-debugger-hook* (make-invoke-debugger-hook function))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (ext:*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - (funcall fun))) - -(defvar *backtrace* '()) - -(defun in-swank-package-p (x) - (and - (symbolp x) - (member (symbol-package x) - (list #.(find-package :swank) - #.(find-package :swank/backend) - #.(ignore-errors (find-package :swank-mop)) - #.(ignore-errors (find-package :swank-loader)))) - t)) - -(defun is-swank-source-p (name) - (setf name (pathname name)) - (pathname-match-p - name - (make-pathname :defaults swank-loader::*source-directory* - :name (pathname-name name) - :type (pathname-type name) - :version (pathname-version name)))) - -(defun is-ignorable-fun-p (x) - (or - (in-swank-package-p (frame-name x)) - (multiple-value-bind (file position) - (ignore-errors (si::bc-file (car x))) - (declare (ignore position)) - (if file (is-swank-source-p file))))) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (declare (type function debugger-loop-fn)) - (let* ((*ihs-top* (ihs-top)) - (*ihs-current* *ihs-top*) - (*frs-base* (or (sch-frs-base *frs-top* *ihs-base*) (1+ (frs-top)))) - (*frs-top* (frs-top)) - (*tpl-level* (1+ *tpl-level*)) - (*backtrace* (loop for ihs from 0 below *ihs-top* - collect (list (si::ihs-fun ihs) - (si::ihs-env ihs) - nil)))) - (declare (special *ihs-current*)) - (loop for f from *frs-base* until *frs-top* - do (let ((i (- (si::frs-ihs f) *ihs-base* 1))) - (when (plusp i) - (let* ((x (elt *backtrace* i)) - (name (si::frs-tag f))) - (unless (si::fixnump name) - (push name (third x))))))) - (setf *backtrace* (remove-if #'is-ignorable-fun-p (nreverse *backtrace*))) - (set-break-env) - (set-current-ihs) - (let ((*ihs-base* *ihs-top*)) - (funcall debugger-loop-fn)))) - -(defimplementation compute-backtrace (start end) - (subseq *backtrace* start - (and (numberp end) - (min end (length *backtrace*))))) - -(defun frame-name (frame) - (let ((x (first frame))) - (if (symbolp x) - x - (function-name x)))) - -(defun function-position (fun) - (multiple-value-bind (file position) - (si::bc-file fun) - (when file - (make-file-location file position)))) - -(defun frame-function (frame) - (let* ((x (first frame)) - fun position) - (etypecase x - (symbol (and (fboundp x) - (setf fun (fdefinition x) - position (function-position fun)))) - (function (setf fun x position (function-position x)))) - (values fun position))) - -(defun frame-decode-env (frame) - (let ((functions '()) - (blocks '()) - (variables '())) - (setf frame (si::decode-ihs-env (second frame))) - (dolist (record (remove-if-not #'consp frame)) - (let* ((record0 (car record)) - (record1 (cdr record))) - (cond ((or (symbolp record0) (stringp record0)) - (setq variables (acons record0 record1 variables))) - ((not (si::fixnump record0)) - (push record1 functions)) - ((symbolp record1) - (push record1 blocks)) - (t - )))) - (values functions blocks variables))) - -(defimplementation print-frame (frame stream) - (format stream "~A" (first frame))) - -;;; Is the frame FRAME restartable?. -;;; Return T if `restart-frame' can safely be called on the frame. -;;; -;;; frame-restartable-p (frame) - -(defimplementation frame-source-location (frame-number) - (let ((frame (elt *backtrace* frame-number))) - (or (nth-value 1 (frame-function frame)) - (make-error-location "Unknown source location for ~A." (car frame))))) - -(defimplementation frame-catch-tags (frame-number) - (third (elt *backtrace* frame-number))) - -(defimplementation frame-locals (frame-number) - (loop for (name . value) in (nth-value 2 (frame-decode-env - (elt *backtrace* frame-number))) - collect (list :name name :id 0 :value value))) - -(defimplementation frame-var-value (frame-number var-number) - (destructuring-bind (name . value) - (elt - (nth-value 2 (frame-decode-env (elt *backtrace* frame-number))) - var-number) - (declare (ignore name)) - value)) - -(defimplementation disassemble-frame (frame-number) - (let ((fun (frame-function (elt *backtrace* frame-number)))) - (disassemble fun))) - -(defimplementation eval-in-frame (form frame-number) - (let ((env (second (elt *backtrace* frame-number)))) - (si:eval-with-env form env))) - -;;; frame-package -;;; frame-call -;;; return-from-frame -;;; restart-frame -;;; print-condition -;;; condition-extras - -(defimplementation gdb-initial-commands () - ;; These signals are used by the GC. - #+linux '("handle SIGPWR noprint nostop" - "handle SIGXCPU noprint nostop")) - -;;; active-stepping -;;; sldb-break-on-return -;;; sldb-break-at-start -;;; sldb-stepper-condition-p -;;; sldb-setp-into -;;; sldb-step-next -;;; sldb-step-out - - -;;;; Definition finding - -(defvar +TAGS+ (namestring - (merge-pathnames "TAGS" (translate-logical-pathname "SYS:")))) - -(defun make-file-location (file file-position) - ;; File positions in CL start at 0, but Emacs' buffer positions - ;; start at 1. We specify (:ALIGN T) because the positions comming - ;; from ECL point at right after the toplevel form appearing before - ;; the actual target toplevel form; (:ALIGN T) will DTRT in that case. - (make-location `(:file ,(namestring (translate-logical-pathname file))) - `(:position ,(1+ file-position)) - `(:align t))) - -(defun make-buffer-location (buffer-name start-position &optional (offset 0)) - (make-location `(:buffer ,buffer-name) - `(:offset ,start-position ,offset) - `(:align t))) - -(defun make-TAGS-location (&rest tags) - (make-location `(:etags-file ,+TAGS+) - `(:tag ,@tags))) - -(defimplementation find-definitions (name) - (let ((annotations (ext:get-annotation name 'si::location :all))) - (cond (annotations - (loop for annotation in annotations - collect (destructuring-bind (dspec file . pos) annotation - `(,dspec ,(make-file-location file pos))))) - (t - (mapcan #'(lambda (type) (find-definitions-by-type name type)) - (classify-definition-name name)))))) - -(defun classify-definition-name (name) - (let ((types '())) - (when (fboundp name) - (cond ((special-operator-p name) - (push :special-operator types)) - ((macro-function name) - (push :macro types)) - ((typep (fdefinition name) 'generic-function) - (push :generic-function types)) - ((si:mangle-name name t) - (push :c-function types)) - (t - (push :lisp-function types)))) - (when (boundp name) - (cond ((constantp name) - (push :constant types)) - (t - (push :global-variable types)))) - types)) - -(defun find-definitions-by-type (name type) - (ecase type - (:lisp-function - (when-let (loc (source-location (fdefinition name))) - (list `((defun ,name) ,loc)))) - (:c-function - (when-let (loc (source-location (fdefinition name))) - (list `((c-source ,name) ,loc)))) - (:generic-function - (loop for method in (clos:generic-function-methods (fdefinition name)) - for specs = (clos:method-specializers method) - for loc = (source-location method) - when loc - collect `((defmethod ,name ,specs) ,loc))) - (:macro - (when-let (loc (source-location (macro-function name))) - (list `((defmacro ,name) ,loc)))) - (:constant - (when-let (loc (source-location name)) - (list `((defconstant ,name) ,loc)))) - (:global-variable - (when-let (loc (source-location name)) - (list `((defvar ,name) ,loc)))) - (:special-operator))) - -;;; FIXME: There ought to be a better way. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun c-function-name-p (name) - (and (symbolp name) (si:mangle-name name t) t)) - (defun c-function-p (object) - (and (functionp object) - (let ((fn-name (function-name object))) - (and fn-name (c-function-name-p fn-name)))))) - -(deftype c-function () - `(satisfies c-function-p)) - -(defun assert-source-directory () - (unless (probe-file #P"SRC:") - (error "ECL's source directory ~A does not exist. ~ - You can specify a different location via the environment ~ - variable `ECLSRCDIR'." - (namestring (translate-logical-pathname #P"SYS:"))))) - -(defun assert-TAGS-file () - (unless (probe-file +TAGS+) - (error "No TAGS file ~A found. It should have been installed with ECL." - +TAGS+))) - -(defun package-names (package) - (cons (package-name package) (package-nicknames package))) - -(defun source-location (object) - (converting-errors-to-error-location - (typecase object - (c-function - (assert-source-directory) - (assert-TAGS-file) - (let ((lisp-name (function-name object))) - (assert lisp-name) - (multiple-value-bind (flag c-name) (si:mangle-name lisp-name t) - (assert flag) - ;; In ECL's code base sometimes the mangled name is used - ;; directly, sometimes ECL's DPP magic of @SI::SYMBOL or - ;; @EXT::SYMBOL is used. We cannot predict here, so we just - ;; provide several candidates. - (apply #'make-TAGS-location - c-name - (loop with s = (symbol-name lisp-name) - for p in (package-names (symbol-package lisp-name)) - collect (format nil "~A::~A" p s) - collect (format nil "~(~A::~A~)" p s)))))) - (function - (multiple-value-bind (file pos) (ext:compiled-function-file object) - (cond ((not file) - (return-from source-location nil)) - ((tmpfile-to-buffer file) - (make-buffer-location (tmpfile-to-buffer file) pos)) - (t - (assert (probe-file file)) - (assert (not (minusp pos))) - (make-file-location file pos))))) - (method - ;; FIXME: This will always return NIL at the moment; ECL does not - ;; store debug information for methods yet. - (source-location (clos:method-function object))) - ((member nil t) - (multiple-value-bind (flag c-name) (si:mangle-name object) - (assert flag) - (make-TAGS-location c-name)))))) - -(defimplementation find-source-location (object) - (or (source-location object) - (make-error-location "Source definition of ~S not found." object))) - -;;; buffer-first-change - - -;;;; XREF - -;;; who-calls -;;; calls-who -;;; who-references -;;; who-binds -;;; who-sets -;;; who-macroexpands -;;; who-specializes -;;; list-callers -;;; list-callees - - -;;;; Profiling - -;;; XXX: use monitor.lisp (ccl,clisp) - -#+profile -(progn - -(defimplementation profile (fname) - (when fname (eval `(profile:profile ,fname)))) - -(defimplementation unprofile (fname) - (when fname (eval `(profile:unprofile ,fname)))) - -(defimplementation unprofile-all () - (profile:unprofile-all) - "All functions unprofiled.") - -(defimplementation profile-report () - (profile:report)) - -(defimplementation profile-reset () - (profile:reset) - "Reset profiling counters.") - -(defimplementation profiled-functions () - (profile:profile)) - -(defimplementation profile-package (package callers methods) - (declare (ignore callers methods)) - (eval `(profile:profile ,(package-name (find-package package))))) -) ; #+profile (progn ... - - -;;;; Trace - -;;; Toggle tracing of the function(s) given with SPEC. -;;; SPEC can be: -;;; (setf NAME) ; a setf function -;;; (:defmethod NAME QUALIFIER... (SPECIALIZER...)) ; a specific method -;;; (:defgeneric NAME) ; a generic function with all methods -;;; (:call CALLER CALLEE) ; trace calls from CALLER to CALLEE. -;;; (:labels TOPLEVEL LOCAL) -;;; (:flet TOPLEVEL LOCAL) -;;; -;;; toggle-trace (spec) - - -;;;; Inspector - -;;; FIXME: Would be nice if it was possible to inspect objects -;;; implemented in C. - -;;; Return a list of bindings corresponding to OBJECT's slots. -;;; eval-context (object) - -;;; Return a string describing the primitive type of object. -;;; describe-primitive-type (object) - - -;;;; Multithreading - -;;; Not needed in ECL -;;; -;;; initialize-multiprocessing - -#+threads -(progn - (defvar *thread-id-counter* 0) - - (defparameter *thread-id-map* (make-hash-table)) - - (defvar *thread-id-map-lock* - (mp:make-lock :name "thread id map lock")) - - (defimplementation spawn (fn &key name) - (mp:process-run-function name fn)) - - (defimplementation thread-id (target-thread) - (block thread-id - (mp:with-lock (*thread-id-map-lock*) - ;; Does TARGET-THREAD have an id already? - (maphash (lambda (id thread-pointer) - (let ((thread (si:weak-pointer-value thread-pointer))) - (cond ((not thread) - (remhash id *thread-id-map*)) - ((eq thread target-thread) - (return-from thread-id id))))) - *thread-id-map*) - ;; TARGET-THREAD not found in *THREAD-ID-MAP* - (let ((id (incf *thread-id-counter*)) - (thread-pointer (si:make-weak-pointer target-thread))) - (setf (gethash id *thread-id-map*) thread-pointer) - id)))) - - (defimplementation find-thread (id) - (mp:with-lock (*thread-id-map-lock*) - (let* ((thread-ptr (gethash id *thread-id-map*)) - (thread (and thread-ptr (si:weak-pointer-value thread-ptr)))) - (unless thread - (remhash id *thread-id-map*)) - thread))) - - (defimplementation thread-name (thread) - (mp:process-name thread)) - - (defimplementation thread-status (thread) - (if (mp:process-active-p thread) - "RUNNING" - "STOPPED")) - - ;; thread-attributes - - (defimplementation current-thread () - mp:*current-process*) - - (defimplementation all-threads () - (mp:all-processes)) - - (defimplementation thread-alive-p (thread) - (mp:process-active-p thread)) - - (defimplementation interrupt-thread (thread fn) - (mp:interrupt-process thread fn)) - - (defimplementation kill-thread (thread) - (mp:process-kill thread)) - - (defvar *mailbox-lock* (mp:make-lock :name "mailbox lock")) - (defvar *mailboxes* (list)) - (declaim (type list *mailboxes*)) - - (defstruct (mailbox (:conc-name mailbox.)) - thread - (mutex (mp:make-lock)) - (cvar (mp:make-condition-variable)) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (mp:with-lock (*mailbox-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - - (defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (mp:with-lock (mutex) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (mp:condition-variable-broadcast (mailbox.cvar mbox))))) - - ;; receive - - (defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mp:with-lock (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (when (eq timeout t) (return (values nil t))) - (mp:condition-variable-wait (mailbox.cvar mbox) mutex))))) - - ;; Trigger a call to CHECK-SLIME-INTERRUPTS in THREAD without using - ;; asynchronous interrupts. - ;; - ;; Doesn't have to implement this if RECEIVE-IF periodically calls - ;; CHECK-SLIME-INTERRUPTS, but that's energy inefficient. - ;; - ;; wake-thread (thread) - - ;; Copied from sbcl.lisp and adjusted to ECL. - (let ((alist '()) - (mutex (mp:make-lock :name "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (mp:with-lock (mutex) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (mp:process - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (mp:with-lock (mutex) - (cdr (assoc name alist))))) - - ;; Not needed in ECL (?). - ;; - ;; set-default-initial-binding (var form) - - ) ; #+threads - -;;; Instead of busy waiting with communication-style NIL, use select() -;;; on the sockets' streams. -#+serve-event -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (flet ((poll-streams (streams timeout) - (let* ((serve-event::*descriptor-handlers* - (copy-list serve-event::*descriptor-handlers*)) - (active-fds '()) - (fd-stream-alist - (loop for s in streams - for fd = (socket-fd s) - collect (cons fd s) - do (serve-event:add-fd-handler fd :input - #'(lambda (fd) - (push fd active-fds)))))) - (serve-event:serve-event timeout) - (loop for fd in active-fds collect (cdr (assoc fd fd-stream-alist)))))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout (return (poll-streams streams 0))) - (t - (when-let (ready (poll-streams streams 0.2)) - (return ready))))))) - -#-serve-event -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (loop - (cond ((check-slime-interrupts) (return :interrupt)) - (timeout (return (remove-if-not #'listen streams))) - (t - (let ((ready (remove-if-not #'listen streams))) - (if ready (return ready)) - (sleep 0.1)))))) - - -;;;; Locks - -#+threads -(defimplementation make-lock (&key name) - (mp:make-lock :name name :recursive t)) - -(defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (mp:with-lock (lock) (funcall function))) - - -;;;; Weak datastructures - -;;; XXX: this should work but causes SLIME REPL hang at some point of time. May -;;; be ECL or SLIME bug - disabling for now. -#+(and ecl-weak-hash (or)) -(progn - (defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weakness :key args)) - - (defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :weakness :value args)) - - (defimplementation hash-table-weakness (hashtable) - (ext:hash-table-weakness hashtable))) - - -;;;; Character names - -;;; Default implementation is fine. -;;; -;;; character-completion-set (prefix matchp) - - -;;;; Heap dumps - -;;; Doesn't apply to ECL. -;;; -;;; save-image (filename &optional restart-function) -;;; background-save-image (filename &key restart-function completion-function) - - -;;;; Wrapping - -;;; Intercept future calls to SPEC and surround them in callbacks. -;;; Very much similar to so-called advices for normal functions. -;;; -;;; wrap (spec indicator &key before after replace) -;;; unwrap (spec indicator) -;;; wrapped-p (spec indicator) diff --git a/elpa/slime-20200414.1444/swank/gray.lisp b/elpa/slime-20200414.1444/swank/gray.lisp deleted file mode 100644 index 3c6c6976..00000000 --- a/elpa/slime-20200414.1444/swank/gray.lisp +++ /dev/null @@ -1,207 +0,0 @@ -;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- -;;; -;;; swank-gray.lisp --- Gray stream based IO redirection. -;;; -;;; Created 2003 -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(in-package swank/backend) - -#.(progn - (defvar *gray-stream-symbols* - '(fundamental-character-output-stream - stream-write-char - stream-write-string - stream-fresh-line - stream-force-output - stream-finish-output - - fundamental-character-input-stream - stream-read-char - stream-peek-char - stream-read-line - stream-listen - stream-unread-char - stream-clear-input - stream-line-column - stream-read-char-no-hang)) - nil) - -(defpackage swank/gray - (:use cl swank/backend) - (:import-from #.(gray-package-name) . #.*gray-stream-symbols*) - (:export . #.*gray-stream-symbols*)) - -(in-package swank/gray) - -(defclass slime-output-stream (fundamental-character-output-stream) - ((output-fn :initarg :output-fn) - (buffer :initform (make-string 8000)) - (fill-pointer :initform 0) - (column :initform 0) - (lock :initform (make-lock :name "buffer write lock")) - (flush-thread :initarg :flush-thread - :initform nil - :accessor flush-thread) - (flush-scheduled :initarg :flush-scheduled - :initform nil - :accessor flush-scheduled))) - -(defun maybe-schedule-flush (stream) - (when (and (flush-thread stream) - (not (flush-scheduled stream))) - (setf (flush-scheduled stream) t) - (send (flush-thread stream) t))) - -(defmacro with-slime-output-stream (stream &body body) - `(with-slots (lock output-fn buffer fill-pointer column) ,stream - (call-with-lock-held lock (lambda () ,@body)))) - -(defmethod stream-write-char ((stream slime-output-stream) char) - (with-slime-output-stream stream - (setf (schar buffer fill-pointer) char) - (incf fill-pointer) - (incf column) - (when (char= #\newline char) - (setf column 0)) - (if (= fill-pointer (length buffer)) - (finish-output stream) - (maybe-schedule-flush stream))) - char) - -(defmethod stream-write-string ((stream slime-output-stream) string - &optional start end) - (with-slime-output-stream stream - (let* ((start (or start 0)) - (end (or end (length string))) - (len (length buffer)) - (count (- end start)) - (free (- len fill-pointer))) - (when (>= count free) - (stream-finish-output stream)) - (cond ((< count len) - (replace buffer string :start1 fill-pointer - :start2 start :end2 end) - (incf fill-pointer count) - (maybe-schedule-flush stream)) - (t - (funcall output-fn (subseq string start end)))) - (let ((last-newline (position #\newline string :from-end t - :start start :end end))) - (setf column (if last-newline - (- end last-newline 1) - (+ column count)))))) - string) - -(defmethod stream-line-column ((stream slime-output-stream)) - (with-slime-output-stream stream column)) - -(defmethod stream-finish-output ((stream slime-output-stream)) - (with-slime-output-stream stream - (unless (zerop fill-pointer) - (funcall output-fn (subseq buffer 0 fill-pointer)) - (setf fill-pointer 0)) - (setf (flush-scheduled stream) nil)) - nil) - -#+(and sbcl sb-thread) -(defmethod stream-force-output :around ((stream slime-output-stream)) - ;; Workaround for deadlocks between the world-lock and auto-flush-thread - ;; buffer write lock. - ;; - ;; Another alternative would be to grab the world-lock here, but that's less - ;; future-proof, and could introduce other lock-ordering issues in the - ;; future. - (handler-case - (sb-sys:with-deadline (:seconds 0.1) - (call-next-method)) - (sb-sys:deadline-timeout () - nil))) - -(defmethod stream-force-output ((stream slime-output-stream)) - (stream-finish-output stream)) - -(defmethod stream-fresh-line ((stream slime-output-stream)) - (with-slime-output-stream stream - (cond ((zerop column) nil) - (t (terpri stream) t)))) - -(defclass slime-input-stream (fundamental-character-input-stream) - ((input-fn :initarg :input-fn) - (buffer :initform "") (index :initform 0) - (lock :initform (make-lock :name "buffer read lock")))) - -(defmethod stream-read-char ((s slime-input-stream)) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index input-fn) s - (when (= index (length buffer)) - (let ((string (funcall input-fn))) - (cond ((zerop (length string)) - (return-from stream-read-char :eof)) - (t - (setf buffer string) - (setf index 0))))) - (assert (plusp (length buffer))) - (prog1 (aref buffer index) (incf index)))))) - -(defmethod stream-listen ((s slime-input-stream)) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index) s - (< index (length buffer)))))) - -(defmethod stream-unread-char ((s slime-input-stream) char) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index) s - (decf index) - (cond ((eql (aref buffer index) char) - (setf (aref buffer index) char)) - (t - (warn "stream-unread-char: ignoring ~S (expected ~S)" - char (aref buffer index))))))) - nil) - -(defmethod stream-clear-input ((s slime-input-stream)) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index) s - (setf buffer "" - index 0)))) - nil) - -(defmethod stream-line-column ((s slime-input-stream)) - nil) - -(defmethod stream-read-char-no-hang ((s slime-input-stream)) - (call-with-lock-held - (slot-value s 'lock) - (lambda () - (with-slots (buffer index) s - (when (< index (length buffer)) - (prog1 (aref buffer index) (incf index))))))) - - -;;; - -(defimplementation make-auto-flush-thread (stream) - (if (typep stream 'slime-output-stream) - (setf (flush-thread stream) - (spawn (lambda () (auto-flush-loop stream 0.08 t)) - :name "auto-flush-thread")) - (spawn (lambda () (auto-flush-loop stream *auto-flush-interval*)) - :name "auto-flush-thread"))) - -(defimplementation make-output-stream (write-string) - (make-instance 'slime-output-stream :output-fn write-string)) - -(defimplementation make-input-stream (read-string) - (make-instance 'slime-input-stream :input-fn read-string)) diff --git a/elpa/slime-20200414.1444/swank/lispworks.lisp b/elpa/slime-20200414.1444/swank/lispworks.lisp deleted file mode 100644 index b9d82188..00000000 --- a/elpa/slime-20200414.1444/swank/lispworks.lisp +++ /dev/null @@ -1,1020 +0,0 @@ -;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-lispworks.lisp --- LispWorks specific code for SLIME. -;;; -;;; Created 2003, Helmut Eller -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(defpackage swank/lispworks - (:use cl swank/backend)) - -(in-package swank/lispworks) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require "comm")) - -(defimplementation gray-package-name () - "STREAM") - -(import-swank-mop-symbols :clos '(:slot-definition-documentation - :slot-boundp-using-class - :slot-value-using-class - :slot-makunbound-using-class - :eql-specializer - :eql-specializer-object - :compute-applicable-methods-using-classes)) - -(defun swank-mop:slot-definition-documentation (slot) - (documentation slot t)) - -(defun swank-mop:slot-boundp-using-class (class object slotd) - (clos:slot-boundp-using-class class object - (clos:slot-definition-name slotd))) - -(defun swank-mop:slot-value-using-class (class object slotd) - (clos:slot-value-using-class class object - (clos:slot-definition-name slotd))) - -(defun (setf swank-mop:slot-value-using-class) (value class object slotd) - (setf (clos:slot-value-using-class class object - (clos:slot-definition-name slotd)) - value)) - -(defun swank-mop:slot-makunbound-using-class (class object slotd) - (clos:slot-makunbound-using-class class object - (clos:slot-definition-name slotd))) - -(defun swank-mop:compute-applicable-methods-using-classes (gf classes) - (clos::compute-applicable-methods-from-classes gf classes)) - -;; lispworks doesn't have the eql-specializer class, it represents -;; them as a list of `(EQL ,OBJECT) -(deftype swank-mop:eql-specializer () 'cons) - -(defun swank-mop:eql-specializer-object (eql-spec) - (second eql-spec)) - -(eval-when (:compile-toplevel :execute :load-toplevel) - (defvar *original-defimplementation* (macro-function 'defimplementation)) - (defmacro defimplementation (&whole whole name args &body body - &environment env) - (declare (ignore args body)) - `(progn - (dspec:record-definition '(defun ,name) (dspec:location) - :check-redefinition-p nil) - ,(funcall *original-defimplementation* whole env)))) - -;;; UTF8 - -(defimplementation string-to-utf8 (string) - (ef:encode-lisp-string string '(:utf-8 :eol-style :lf))) - -(defimplementation utf8-to-string (octets) - (ef:decode-external-string octets '(:utf-8 :eol-style :lf))) - -;;; TCP server - -(defimplementation preferred-communication-style () - :spawn) - -(defun socket-fd (socket) - (etypecase socket - (fixnum socket) - (comm:socket-stream (comm:socket-stream-socket socket)))) - -(defimplementation create-socket (host port &key backlog) - (multiple-value-bind (socket where errno) - #-(or lispworks4.1 (and macosx lispworks4.3)) - (comm::create-tcp-socket-for-service port :address host - :backlog (or backlog 5)) - #+(or lispworks4.1 (and macosx lispworks4.3)) - (comm::create-tcp-socket-for-service port) - (cond (socket socket) - (t (error 'network-error - :format-control "~A failed: ~A (~D)" - :format-arguments (list where - (list #+unix (lw:get-unix-error errno)) - errno)))))) - -(defimplementation local-port (socket) - (nth-value 1 (comm:get-socket-address (socket-fd socket)))) - -(defimplementation close-socket (socket) - (comm::close-socket (socket-fd socket))) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (declare (ignore buffering)) - (let* ((fd (comm::get-fd-from-socket socket))) - (assert (/= fd -1)) - (cond ((not external-format) - (make-instance 'comm:socket-stream - :socket fd - :direction :io - :read-timeout timeout - :element-type '(unsigned-byte 8))) - (t - (assert (valid-external-format-p external-format)) - (ecase (first external-format) - ((:latin-1 :ascii) - (make-instance 'comm:socket-stream - :socket fd - :direction :io - :read-timeout timeout - :element-type 'base-char)) - (:utf-8 - (make-flexi-stream - (make-instance 'comm:socket-stream - :socket fd - :direction :io - :read-timeout timeout - :element-type '(unsigned-byte 8)) - external-format))))))) - -(defun make-flexi-stream (stream external-format) - (unless (member :flexi-streams *features*) - (error "Cannot use external format ~A~ - without having installed flexi-streams in the inferior-lisp." - external-format)) - (funcall (read-from-string "FLEXI-STREAMS:MAKE-FLEXI-STREAM") - stream - :external-format - (apply (read-from-string "FLEXI-STREAMS:MAKE-EXTERNAL-FORMAT") - external-format))) - -;;; Coding Systems - -(defun valid-external-format-p (external-format) - (member external-format *external-format-to-coding-system* - :test #'equal :key #'car)) - -(defvar *external-format-to-coding-system* - '(((:latin-1 :eol-style :lf) - "latin-1-unix" "iso-latin-1-unix" "iso-8859-1-unix") - ;;((:latin-1) "latin-1" "iso-latin-1" "iso-8859-1") - ;;((:utf-8) "utf-8") - ((:utf-8 :eol-style :lf) "utf-8-unix") - ;;((:euc-jp) "euc-jp") - ((:euc-jp :eol-style :lf) "euc-jp-unix") - ;;((:ascii) "us-ascii") - ((:ascii :eol-style :lf) "us-ascii-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -;;; Unix signals - -(defun sigint-handler () - (with-simple-restart (continue "Continue from SIGINT handler.") - (invoke-debugger "SIGINT"))) - -(defun make-sigint-handler (process) - (lambda (&rest args) - (declare (ignore args)) - (mp:process-interrupt process #'sigint-handler))) - -(defun set-sigint-handler () - ;; Set SIGINT handler on Swank request handler thread. - #-win32 - (sys::set-signal-handler +sigint+ - (make-sigint-handler mp:*current-process*))) - -#-win32 -(defimplementation install-sigint-handler (handler) - (sys::set-signal-handler +sigint+ - (let ((self mp:*current-process*)) - (lambda (&rest args) - (declare (ignore args)) - (mp:process-interrupt self handler))))) - -(defimplementation getpid () - #+win32 (win32:get-current-process-id) - #-win32 (system::getpid)) - -(defimplementation lisp-implementation-type-name () - "lispworks") - -(defimplementation set-default-directory (directory) - (namestring (hcl:change-directory directory))) - -;;;; Documentation - -(defun map-list (function list) - "Map over proper and not proper lists." - (loop for (car . cdr) on list - collect (funcall function car) into result - when (null cdr) return result - when (atom cdr) return (nconc result (funcall function cdr)))) - -(defun replace-strings-with-symbols (tree) - (map-list - (lambda (x) - (typecase x - (list - (replace-strings-with-symbols x)) - (symbol - x) - (string - (intern x)) - (t - (intern (write-to-string x))))) - tree)) - -(defimplementation arglist (symbol-or-function) - (let ((arglist (lw:function-lambda-list symbol-or-function))) - (etypecase arglist - ((member :dont-know) - :not-available) - (list - (replace-strings-with-symbols arglist))))) - -(defimplementation function-name (function) - (nth-value 2 (function-lambda-expression function))) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (walker:walk-form form)) - -(defun generic-function-p (object) - (typep object 'generic-function)) - -(defimplementation describe-symbol-for-emacs (symbol) - "Return a plist describing SYMBOL. -Return NIL if the symbol is unbound." - (let ((result '())) - (labels ((first-line (string) - (let ((pos (position #\newline string))) - (if (null pos) string (subseq string 0 pos)))) - (doc (kind &optional (sym symbol)) - (let ((string (or (documentation sym kind)))) - (if string - (first-line string) - :not-documented))) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (when (boundp symbol) - (doc 'variable))) - (maybe-push - :generic-function (if (and (fboundp symbol) - (generic-function-p (fdefinition symbol))) - (doc 'function))) - (maybe-push - :function (if (and (fboundp symbol) - (not (generic-function-p (fdefinition symbol)))) - (doc 'function))) - (maybe-push - :setf (let ((setf-name (sys:underlying-setf-name `(setf ,symbol)))) - (if (fboundp setf-name) - (doc 'setf)))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - result))) - -(defimplementation describe-definition (symbol type) - (ecase type - (:variable (describe-symbol symbol)) - (:class (describe (find-class symbol))) - ((:function :generic-function) (describe-function symbol)) - (:setf (describe-function (sys:underlying-setf-name `(setf ,symbol)))))) - -(defun describe-function (symbol) - (cond ((fboundp symbol) - (format t "(~A ~/pprint-fill/)~%~%~:[(not documented)~;~:*~A~]~%" - symbol - (lispworks:function-lambda-list symbol) - (documentation symbol 'function)) - (describe (fdefinition symbol))) - (t (format t "~S is not fbound" symbol)))) - -(defun describe-symbol (sym) - (format t "~A is a symbol in package ~A." sym (symbol-package sym)) - (when (boundp sym) - (format t "~%~%Value: ~A" (symbol-value sym))) - (let ((doc (documentation sym 'variable))) - (when doc - (format t "~%~%Variable documentation:~%~A" doc))) - (when (fboundp sym) - (describe-function sym))) - -(defimplementation type-specifier-p (symbol) - (or (ignore-errors - (subtypep nil symbol)) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -;;; Debugging - -(defclass slime-env (env:environment) - ((debugger-hook :initarg :debugger-hoook))) - -(defun slime-env (hook io-bindings) - (make-instance 'slime-env :name "SLIME Environment" - :io-bindings io-bindings - :debugger-hoook hook)) - -(defmethod env-internals:environment-display-notifier - ((env slime-env) &key restarts condition) - (declare (ignore restarts condition)) - (swank:swank-debugger-hook condition *debugger-hook*)) - -(defmethod env-internals:environment-display-debugger ((env slime-env)) - *debug-io*) - -(defmethod env-internals:confirm-p ((e slime-env) &optional msg &rest args) - (apply #'swank:y-or-n-p-in-emacs msg args)) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook)) - (env:with-environment ((slime-env hook '())) - (funcall fun)))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (setf (env:environment) (slime-env function '()))) - -(defvar *sldb-top-frame*) - -(defun interesting-frame-p (frame) - (cond ((or (dbg::call-frame-p frame) - (dbg::derived-call-frame-p frame) - (dbg::foreign-frame-p frame) - (dbg::interpreted-call-frame-p frame)) - t) - ((dbg::catch-frame-p frame) dbg:*print-catch-frames*) - ((dbg::binding-frame-p frame) dbg:*print-binding-frames*) - ((dbg::handler-frame-p frame) dbg:*print-handler-frames*) - ((dbg::restart-frame-p frame) dbg:*print-restart-frames*) - (t nil))) - -(defun nth-next-frame (frame n) - "Unwind FRAME N times." - (do ((frame frame (dbg::frame-next frame)) - (i n (if (interesting-frame-p frame) (1- i) i))) - ((or (not frame) - (and (interesting-frame-p frame) (zerop i))) - frame))) - -(defun nth-frame (index) - (nth-next-frame *sldb-top-frame* index)) - -(defun find-top-frame () - "Return the most suitable top-frame for the debugger." - (flet ((find-named-frame (name) - (do ((frame (dbg::debugger-stack-current-frame - dbg::*debugger-stack*) - (nth-next-frame frame 1))) - ((or (null frame) ; no frame found! - (and (dbg::call-frame-p frame) - (eq (dbg::call-frame-function-name frame) - name))) - (nth-next-frame frame 1))))) - (or (find-named-frame 'invoke-debugger) - (find-named-frame 'swank::safe-backtrace) - ;; if we can't find a likely top frame, take any old frame - ;; at the top - (dbg::debugger-stack-current-frame dbg::*debugger-stack*)))) - -(defimplementation call-with-debugging-environment (fn) - (dbg::with-debugger-stack () - (let ((*sldb-top-frame* (find-top-frame))) - (funcall fn)))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum)) - (backtrace '())) - (do ((frame (nth-frame start) (dbg::frame-next frame)) - (i start)) - ((or (not frame) (= i end)) (nreverse backtrace)) - (when (interesting-frame-p frame) - (incf i) - (push frame backtrace))))) - -(defun frame-actual-args (frame) - (let ((*break-on-signals* nil) - (kind nil)) - (loop for arg in (dbg::call-frame-arglist frame) - if (eq kind '&rest) - nconc (handler-case - (dbg::dbg-eval arg frame) - (error (e) (list (format nil "<~A>" arg)))) - and do (loop-finish) - else - if (member arg '(&rest &optional &key)) - do (setq kind arg) - else - nconc - (handler-case - (nconc (and (eq kind '&key) - (list (cond ((symbolp arg) - (intern (symbol-name arg) :keyword)) - ((and (consp arg) (symbolp (car arg))) - (intern (symbol-name (car arg)) - :keyword)) - (t (caar arg))))) - (list (dbg::dbg-eval - (cond ((symbolp arg) arg) - ((and (consp arg) (symbolp (car arg))) - (car arg)) - (t (cadar arg))) - frame))) - (error (e) (list (format nil "<~A>" arg))))))) - -(defimplementation print-frame (frame stream) - (cond ((dbg::call-frame-p frame) - (prin1 (cons (dbg::call-frame-function-name frame) - (frame-actual-args frame)) - stream)) - (t (princ frame stream)))) - -(defun frame-vars (frame) - (first (dbg::frame-locals-format-list frame #'list 75 0))) - -(defimplementation frame-locals (n) - (let ((frame (nth-frame n))) - (if (dbg::call-frame-p frame) - (mapcar (lambda (var) - (destructuring-bind (name value symbol location) var - (declare (ignore name location)) - (list :name symbol :id 0 - :value value))) - (frame-vars frame))))) - -(defimplementation frame-var-value (frame var) - (let ((frame (nth-frame frame))) - (destructuring-bind (_n value _s _l) (nth var (frame-vars frame)) - (declare (ignore _n _s _l)) - value))) - -(defimplementation frame-source-location (frame) - (let ((frame (nth-frame frame)) - (callee (if (plusp frame) (nth-frame (1- frame))))) - (if (dbg::call-frame-p frame) - (let ((dspec (dbg::call-frame-function-name frame)) - (cname (and (dbg::call-frame-p callee) - (dbg::call-frame-function-name callee))) - (path (and (dbg::call-frame-p frame) - (dbg::call-frame-edit-path frame)))) - (if dspec - (frame-location dspec cname path)))))) - -(defimplementation eval-in-frame (form frame-number) - (let ((frame (nth-frame frame-number))) - (dbg::dbg-eval form frame))) - -(defun function-name-package (name) - (typecase name - (null nil) - (symbol (symbol-package name)) - ((cons (eql hcl:subfunction)) - (destructuring-bind (name parent) (cdr name) - (declare (ignore name)) - (function-name-package parent))) - ((cons (eql lw:top-level-form)) nil) - (t nil))) - -(defimplementation frame-package (frame-number) - (let ((frame (nth-frame frame-number))) - (if (dbg::call-frame-p frame) - (function-name-package (dbg::call-frame-function-name frame))))) - -(defimplementation return-from-frame (frame-number form) - (let* ((frame (nth-frame frame-number)) - (return-frame (dbg::find-frame-for-return frame))) - (dbg::dbg-return-from-call-frame frame form return-frame - dbg::*debugger-stack*))) - -(defimplementation restart-frame (frame-number) - (let ((frame (nth-frame frame-number))) - (dbg::restart-frame frame :same-args t))) - -(defimplementation disassemble-frame (frame-number) - (let* ((frame (nth-frame frame-number))) - (when (dbg::call-frame-p frame) - (let ((function (dbg::get-call-frame-function frame))) - (disassemble function))))) - -;;; Definition finding - -(defun frame-location (dspec callee-name edit-path) - (let ((infos (dspec:find-dspec-locations dspec))) - (cond (infos - (destructuring-bind ((rdspec location) &rest _) infos - (declare (ignore _)) - (let ((name (and callee-name (symbolp callee-name) - (string callee-name))) - (path (edit-path-to-cmucl-source-path edit-path))) - (make-dspec-location rdspec location - `(:call-site ,name :edit-path ,path))))) - (t - (list :error (format nil "Source location not available for: ~S" - dspec)))))) - -;; dbg::call-frame-edit-path is not documented but lets assume the -;; binary representation of the integer EDIT-PATH should be -;; interpreted as a sequence of CAR or CDR. #b1111010 is roughly the -;; same as cadadddr. Something is odd with the highest bit. -(defun edit-path-to-cmucl-source-path (edit-path) - (and edit-path - (cons 0 - (let ((n -1)) - (loop for i from (1- (integer-length edit-path)) downto 0 - if (logbitp i edit-path) do (incf n) - else collect (prog1 n (setq n 0))))))) - -;; (edit-path-to-cmucl-source-path #b1111010) => (0 3 1) - -(defimplementation find-definitions (name) - (let ((locations (dspec:find-name-locations dspec:*dspec-classes* name))) - (loop for (dspec location) in locations - collect (list dspec (make-dspec-location dspec location))))) - - -;;; Compilation - -(defmacro with-swank-compilation-unit ((location &rest options) &body body) - (lw:rebinding (location) - `(let ((compiler::*error-database* '())) - (with-compilation-unit ,options - (multiple-value-prog1 (progn ,@body) - (signal-error-data-base compiler::*error-database* - ,location) - (signal-undefined-functions compiler::*unknown-functions* - ,location)))))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-swank-compilation-unit (input-file) - (compile-file input-file - :output-file output-file - :load load-p - :external-format external-format))) - -(defvar *within-call-with-compilation-hooks* nil - "Whether COMPILE-FILE was called from within CALL-WITH-COMPILATION-HOOKS.") - -(defvar *undefined-functions-hash* nil - "Hash table to map info about undefined functions to pathnames.") - -(lw:defadvice (compile-file compile-file-and-collect-notes :around) - (pathname &rest rest) - (multiple-value-prog1 (apply #'lw:call-next-advice pathname rest) - (when *within-call-with-compilation-hooks* - (maphash (lambda (unfun dspecs) - (dolist (dspec dspecs) - (let ((unfun-info (list unfun dspec))) - (unless (gethash unfun-info *undefined-functions-hash*) - (setf (gethash unfun-info *undefined-functions-hash*) - pathname))))) - compiler::*unknown-functions*)))) - -(defimplementation call-with-compilation-hooks (function) - (let ((compiler::*error-database* '()) - (*undefined-functions-hash* (make-hash-table :test 'equal)) - (*within-call-with-compilation-hooks* t)) - (with-compilation-unit () - (prog1 (funcall function) - (signal-error-data-base compiler::*error-database*) - (signal-undefined-functions compiler::*unknown-functions*))))) - -(defun map-error-database (database fn) - (loop for (filename . defs) in database do - (loop for (dspec . conditions) in defs do - (dolist (c conditions) - (multiple-value-bind (condition path) - (if (consp c) (values (car c) (cdr c)) (values c nil)) - (funcall fn filename dspec condition path)))))) - -(defun lispworks-severity (condition) - (cond ((not condition) :warning) - (t (etypecase condition - #-(or lispworks4 lispworks5) - (conditions:compiler-note :note) - (error :error) - (style-warning :warning) - (warning :warning))))) - -(defun signal-compiler-condition (message location condition) - (check-type message string) - (signal - (make-instance 'compiler-condition :message message - :severity (lispworks-severity condition) - :location location - :original-condition condition))) - -(defvar *temp-file-format* '(:utf-8 :eol-style :lf)) - -(defun compile-from-temp-file (string filename) - (unwind-protect - (progn - (with-open-file (s filename :direction :output - :if-exists :supersede - :external-format *temp-file-format*) - - (write-string string s) - (finish-output s)) - (multiple-value-bind (binary-filename warnings? failure?) - (compile-file filename :load t - :external-format *temp-file-format*) - (declare (ignore warnings?)) - (when binary-filename - (delete-file binary-filename)) - (not failure?))) - (delete-file filename))) - -(defun dspec-function-name-position (dspec fallback) - (etypecase dspec - (cons (let ((name (dspec:dspec-primary-name dspec))) - (typecase name - ((or symbol string) - (list :function-name (string name))) - (t fallback)))) - (null fallback) - (symbol (list :function-name (string dspec))))) - -(defmacro with-fairly-standard-io-syntax (&body body) - "Like WITH-STANDARD-IO-SYNTAX but preserve *PACKAGE* and *READTABLE*." - (let ((package (gensym)) - (readtable (gensym))) - `(let ((,package *package*) - (,readtable *readtable*)) - (with-standard-io-syntax - (let ((*package* ,package) - (*readtable* ,readtable)) - ,@body))))) - -(defun skip-comments (stream) - (let ((pos0 (file-position stream))) - (cond ((equal (ignore-errors (list (read-delimited-list #\( stream))) - '(())) - (file-position stream (1- (file-position stream)))) - (t (file-position stream pos0))))) - -#-(or lispworks4.1 lispworks4.2) ; no dspec:parse-form-dspec prior to 4.3 -(defun dspec-stream-position (stream dspec) - (with-fairly-standard-io-syntax - (loop (let* ((pos (progn (skip-comments stream) (file-position stream))) - (form (read stream nil '#1=#:eof))) - (when (eq form '#1#) - (return nil)) - (labels ((check-dspec (form) - (when (consp form) - (let ((operator (car form))) - (case operator - ((progn) - (mapcar #'check-dspec - (cdr form))) - ((eval-when locally macrolet symbol-macrolet) - (mapcar #'check-dspec - (cddr form))) - ((in-package) - (let ((package (find-package (second form)))) - (when package - (setq *package* package)))) - (otherwise - (let ((form-dspec (dspec:parse-form-dspec form))) - (when (dspec:dspec-equal dspec form-dspec) - (return pos))))))))) - (check-dspec form)))))) - -(defun dspec-file-position (file dspec) - (let* ((*compile-file-pathname* (pathname file)) - (*compile-file-truename* (truename *compile-file-pathname*)) - (*load-pathname* *compile-file-pathname*) - (*load-truename* *compile-file-truename*)) - (with-open-file (stream file) - (let ((pos - #-(or lispworks4.1 lispworks4.2) - (ignore-errors (dspec-stream-position stream dspec)))) - (if pos - (list :position (1+ pos)) - (dspec-function-name-position dspec `(:position 1))))))) - -(defun emacs-buffer-location-p (location) - (and (consp location) - (eq (car location) :emacs-buffer))) - -(defun make-dspec-location (dspec location &optional hints) - (etypecase location - ((or pathname string) - (multiple-value-bind (file err) - (ignore-errors (namestring (truename location))) - (if err - (list :error (princ-to-string err)) - (make-location `(:file ,file) - (dspec-file-position file dspec) - hints)))) - (symbol - `(:error ,(format nil "Cannot resolve location: ~S" location))) - ((satisfies emacs-buffer-location-p) - (destructuring-bind (_ buffer offset) location - (declare (ignore _)) - (make-location `(:buffer ,buffer) - (dspec-function-name-position dspec `(:offset ,offset 0)) - hints))))) - -(defun make-dspec-progenitor-location (dspec location edit-path) - (let ((canon-dspec (dspec:canonicalize-dspec dspec))) - (make-dspec-location - (if canon-dspec - (if (dspec:local-dspec-p canon-dspec) - (dspec:dspec-progenitor canon-dspec) - canon-dspec) - nil) - location - (if edit-path - (list :edit-path (edit-path-to-cmucl-source-path edit-path)))))) - -(defun signal-error-data-base (database &optional location) - (map-error-database - database - (lambda (filename dspec condition edit-path) - (signal-compiler-condition - (format nil "~A" condition) - (make-dspec-progenitor-location dspec (or location filename) edit-path) - condition)))) - -(defun unmangle-unfun (symbol) - "Converts symbols like 'SETF::|\"CL-USER\" \"GET\"| to -function names like \(SETF GET)." - (cond ((sys::setf-symbol-p symbol) - (sys::setf-pair-from-underlying-name symbol)) - (t symbol))) - -(defun signal-undefined-functions (htab &optional filename) - (maphash (lambda (unfun dspecs) - (dolist (dspec dspecs) - (signal-compiler-condition - (format nil "Undefined function ~A" (unmangle-unfun unfun)) - (make-dspec-progenitor-location - dspec - (or filename - (gethash (list unfun dspec) *undefined-functions-hash*)) - nil) - nil))) - htab)) - -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore filename line column policy)) - (assert buffer) - (assert position) - (let* ((location (list :emacs-buffer buffer position)) - (tmpname (hcl:make-temp-file nil "lisp"))) - (with-swank-compilation-unit (location) - (compile-from-temp-file - (with-output-to-string (s) - (let ((*print-radix* t)) - (print `(eval-when (:compile-toplevel) - (setq dspec::*location* (list ,@location))) - s)) - (write-string string s)) - tmpname)))) - -;;; xref - -(defmacro defxref (name function) - `(defimplementation ,name (name) - (xref-results (,function name)))) - -(defxref who-calls hcl:who-calls) -(defxref who-macroexpands hcl:who-calls) ; macros are in the calls table too -(defxref calls-who hcl:calls-who) -(defxref list-callers list-callers-internal) -(defxref list-callees list-callees-internal) - -(defun list-callers-internal (name) - (let ((callers (make-array 100 - :fill-pointer 0 - :adjustable t))) - (hcl:sweep-all-objects - #'(lambda (object) - (when (and #+Harlequin-PC-Lisp (low:compiled-code-p object) - #+Harlequin-Unix-Lisp (sys:callablep object) - #-(or Harlequin-PC-Lisp Harlequin-Unix-Lisp) - (sys:compiled-code-p object) - (system::find-constant$funcallable name object)) - (vector-push-extend object callers)))) - ;; Delay dspec:object-dspec until after sweep-all-objects - ;; to reduce allocation problems. - (loop for object across callers - collect (if (symbolp object) - (list 'function object) - (or (dspec:object-dspec object) object))))) - -(defun list-callees-internal (name) - (let ((callees '())) - (system::find-constant$funcallable - 'junk name - :test #'(lambda (junk constant) - (declare (ignore junk)) - (when (and (symbolp constant) - (fboundp constant)) - (pushnew (list 'function constant) callees :test 'equal)) - ;; Return nil so we iterate over all constants. - nil)) - callees)) - -;; only for lispworks 4.2 and above -#-lispworks4.1 -(progn - (defxref who-references hcl:who-references) - (defxref who-binds hcl:who-binds) - (defxref who-sets hcl:who-sets)) - -(defimplementation who-specializes (classname) - (let ((class (find-class classname nil))) - (when class - (let ((methods (clos:class-direct-methods class))) - (xref-results (mapcar #'dspec:object-dspec methods)))))) - -(defun xref-results (dspecs) - (flet ((frob-locs (dspec locs) - (cond (locs - (loop for (name loc) in locs - collect (list name (make-dspec-location name loc)))) - (t `((,dspec (:error "Source location not available"))))))) - (loop for dspec in dspecs - append (frob-locs dspec (dspec:dspec-definition-locations dspec))))) - -;;; Inspector - -(defmethod emacs-inspect ((o t)) - (lispworks-inspect o)) - -(defmethod emacs-inspect ((o function)) - (lispworks-inspect o)) - -;; FIXME: slot-boundp-using-class in LW works with names so we can't -;; use our method in swank.lisp. -(defmethod emacs-inspect ((o standard-object)) - (lispworks-inspect o)) - -(defun lispworks-inspect (o) - (multiple-value-bind (names values _getter _setter type) - (lw:get-inspector-values o nil) - (declare (ignore _getter _setter)) - (append - (label-value-line "Type" type) - (loop for name in names - for value in values - append (label-value-line name value))))) - -;;; Miscellaneous - -(defimplementation quit-lisp () - (lispworks:quit)) - -;;; Tracing - -(defun parse-fspec (fspec) - "Return a dspec for FSPEC." - (ecase (car fspec) - ((:defmethod) `(method ,(cdr fspec))))) - -(defun tracedp (dspec) - (member dspec (eval '(trace)) :test #'equal)) - -(defun toggle-trace-aux (dspec) - (cond ((tracedp dspec) - (eval `(untrace ,dspec)) - (format nil "~S is now untraced." dspec)) - (t - (eval `(trace (,dspec))) - (format nil "~S is now traced." dspec)))) - -(defimplementation toggle-trace (fspec) - (toggle-trace-aux (parse-fspec fspec))) - -;;; Multithreading - -(defimplementation initialize-multiprocessing (continuation) - (cond ((not mp::*multiprocessing*) - (push (list "Initialize SLIME" '() continuation) - mp:*initial-processes*) - (mp:initialize-multiprocessing)) - (t (funcall continuation)))) - -(defimplementation spawn (fn &key name) - (mp:process-run-function name () fn)) - -(defvar *id-lock* (mp:make-lock)) -(defvar *thread-id-counter* 0) - -(defimplementation thread-id (thread) - (mp:with-lock (*id-lock*) - (or (getf (mp:process-plist thread) 'id) - (setf (getf (mp:process-plist thread) 'id) - (incf *thread-id-counter*))))) - -(defimplementation find-thread (id) - (find id (mp:list-all-processes) - :key (lambda (p) (getf (mp:process-plist p) 'id)))) - -(defimplementation thread-name (thread) - (mp:process-name thread)) - -(defimplementation thread-status (thread) - (format nil "~A ~D" - (mp:process-whostate thread) - (mp:process-priority thread))) - -(defimplementation make-lock (&key name) - (mp:make-lock :name name)) - -(defimplementation call-with-lock-held (lock function) - (mp:with-lock (lock) (funcall function))) - -(defimplementation current-thread () - mp:*current-process*) - -(defimplementation all-threads () - (mp:list-all-processes)) - -(defimplementation interrupt-thread (thread fn) - (mp:process-interrupt thread fn)) - -(defimplementation kill-thread (thread) - (mp:process-kill thread)) - -(defimplementation thread-alive-p (thread) - (mp:process-alive-p thread)) - -(defstruct (mailbox (:conc-name mailbox.)) - (mutex (mp:make-lock :name "thread mailbox")) - (queue '() :type list)) - -(defvar *mailbox-lock* (mp:make-lock)) - -(defun mailbox (thread) - (mp:with-lock (*mailbox-lock*) - (or (getf (mp:process-plist thread) 'mailbox) - (setf (getf (mp:process-plist thread) 'mailbox) - (make-mailbox))))) - -(defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox mp:*current-process*)) - (lock (mailbox.mutex mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mp:with-lock (lock "receive-if/try") - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail))))) - (when (eq timeout t) (return (values nil t))) - (mp:process-wait-with-timeout - "receive-if" 0.3 (lambda () (some test (mailbox.queue mbox))))))) - -(defimplementation send (thread message) - (let ((mbox (mailbox thread))) - (mp:with-lock ((mailbox.mutex mbox)) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message)))))) - -(let ((alist '()) - (lock (mp:make-lock :name "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (mp:with-lock (lock) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (mp:process - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (mp:with-lock (lock) - (cdr (assoc name alist))))) - - -(defimplementation set-default-initial-binding (var form) - (setq mp:*process-initial-bindings* - (acons var `(eval (quote ,form)) - mp:*process-initial-bindings* ))) - -(defimplementation thread-attributes (thread) - (list :priority (mp:process-priority thread) - :idle (mp:process-idle-time thread))) - - -;;;; Weak hashtables - -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak-kind :key args)) - -(defimplementation make-weak-value-hash-table (&rest args) - (apply #'make-hash-table :weak-kind :value args)) diff --git a/elpa/slime-20200414.1444/swank/match.lisp b/elpa/slime-20200414.1444/swank/match.lisp deleted file mode 100644 index d6200db5..00000000 --- a/elpa/slime-20200414.1444/swank/match.lisp +++ /dev/null @@ -1,242 +0,0 @@ -;; -;; SELECT-MATCH macro (and IN macro) -;; -;; Copyright 1990 Stephen Adams -;; -;; You are free to copy, distribute and make derivative works of this -;; source provided that this copyright notice is displayed near the -;; beginning of the file. No liability is accepted for the -;; correctness or performance of the code. If you modify the code -;; please indicate this fact both at the place of modification and in -;; this copyright message. -;; -;; Stephen Adams -;; Department of Electronics and Computer Science -;; University of Southampton -;; SO9 5NH, UK -;; -;; sra@ecs.soton.ac.uk -;; - -;; -;; Synopsis: -;; -;; (select-match expression -;; (pattern action+)*) -;; -;; --- or --- -;; -;; (select-match expression -;; pattern => expression -;; pattern => expression -;; ...) -;; -;; pattern -> constant ;egs 1, #\x, #c(1.0 1.1) -;; | symbol ;matches anything -;; | 'anything ;must be EQUAL -;; | (pattern = pattern) ;both patterns must match -;; | (#'function pattern) ;predicate test -;; | (pattern . pattern) ;cons cell -;; - -;; Example -;; -;; (select-match item -;; (('if e1 e2 e3) 'if-then-else) ;(1) -;; ((#'oddp k) 'an-odd-integer) ;(2) -;; (((#'treep tree) = (hd . tl)) 'something-else) ;(3) -;; (other 'anything-else)) ;(4) -;; -;; Notes -;; -;; . Each pattern is tested in turn. The first match is taken. -;; -;; . If no pattern matches, an error is signalled. -;; -;; . Constant patterns (things X for which (CONSTANTP X) is true, i.e. -;; numbers, strings, characters, etc.) match things which are EQUAL. -;; -;; . Quoted patterns (which are CONSTANTP) are constants. -;; -;; . Symbols match anything. The symbol is bound to the matched item -;; for the execution of the actions. -;; For example, (SELECT-MATCH '(1 2 3) -;; (1 . X) => X) -;; returns (2 3) because X is bound to the cdr of the candidate. -;; -;; . The two pattern match (p1 = p2) can be used to name parts -;; of the matched structure. For example, (ALL = (HD . TL)) -;; matches a cons cell. ALL is bound to the cons cell, HD to its car -;; and TL to its tail. -;; -;; . A predicate test applies the predicate to the item being matched. -;; If the predicate returns NIL then the match fails. -;; If it returns truth, then the nested pattern is matched. This is -;; often just a symbol like K in the example. -;; -;; . Care should be taken with the domain values for predicate matches. -;; If, in the above eg, item is not an integer, an error would occur -;; during the test. A safer pattern would be -;; (#'integerp (#'oddp k)) -;; This would only test for oddness of the item was an integer. -;; -;; . A single symbol will match anything so it can be used as a default -;; case, like OTHER above. -;; - -(in-package swank/match) - -(defmacro match (expression &body patterns) - `(select-match ,expression ,@patterns)) - -(defmacro select-match (expression &rest patterns) - (let* ((do-let (not (atom expression))) - (key (if do-let (gensym) expression)) - (cbody (expand-select-patterns key patterns)) - (cform `(cond . ,cbody))) - (if do-let - `(let ((,key ,expression)) ,cform) - cform))) - -(defun expand-select-patterns (key patterns) - (if (eq (second patterns) '=>) - (expand-select-patterns-style-2 key patterns) - (expand-select-patterns-style-1 key patterns))) - -(defun expand-select-patterns-style-1 (key patterns) - (if (null patterns) - `((t (error "Case select pattern match failure on ~S" ,key))) - (let* ((pattern (caar patterns)) - (actions (cdar patterns)) - (rest (cdr patterns)) - (test (compile-select-test key pattern)) - (bindings (compile-select-bindings key pattern actions))) - `(,(if bindings `(,test (let ,bindings . ,actions)) - `(,test . ,actions)) - . ,(unless (eq test t) - (expand-select-patterns-style-1 key rest)))))) - -(defun expand-select-patterns-style-2 (key patterns) - (cond ((null patterns) - `((t (error "Case select pattern match failure on ~S" ,key)))) - (t (when (or (< (length patterns) 3) - (not (eq (second patterns) '=>))) - (error "Illegal patterns: ~S" patterns)) - (let* ((pattern (first patterns)) - (actions (list (third patterns))) - (rest (cdddr patterns)) - (test (compile-select-test key pattern)) - (bindings (compile-select-bindings key pattern actions))) - `(,(if bindings `(,test (let ,bindings . ,actions)) - `(,test . ,actions)) - . ,(unless (eq test t) - (expand-select-patterns-style-2 key rest))))))) - -(defun compile-select-test (key pattern) - (let ((tests (remove t (compile-select-tests key pattern)))) - (cond - ;; note AND does this anyway, but this allows us to tell if - ;; the pattern will always match. - ((null tests) t) - ((= (length tests) 1) (car tests)) - (t `(and . ,tests))))) - -(defun compile-select-tests (key pattern) - (cond ((constantp pattern) `((,(cond ((numberp pattern) 'eql) - ((symbolp pattern) 'eq) - (t 'equal)) - ,key ,pattern))) - ((symbolp pattern) '(t)) - ((select-double-match? pattern) - (append - (compile-select-tests key (first pattern)) - (compile-select-tests key (third pattern)))) - ((select-predicate? pattern) - (append - `((,(second (first pattern)) ,key)) - (compile-select-tests key (second pattern)))) - ((consp pattern) - (append - `((consp ,key)) - (compile-select-tests (cs-car key) (car - pattern)) - (compile-select-tests (cs-cdr key) (cdr - pattern)))) - (t (error "Illegal select pattern: ~S" pattern)))) - - -(defun compile-select-bindings (key pattern action) - (cond ((constantp pattern) '()) - ((symbolp pattern) - (if (select-in-tree pattern action) - `((,pattern ,key)) - '())) - ((select-double-match? pattern) - (append - (compile-select-bindings key (first pattern) action) - (compile-select-bindings key (third pattern) action))) - ((select-predicate? pattern) - (compile-select-bindings key (second pattern) action)) - ((consp pattern) - (append - (compile-select-bindings (cs-car key) (car pattern) - action) - (compile-select-bindings (cs-cdr key) (cdr pattern) - action))))) - -(defun select-in-tree (atom tree) - (or (eq atom tree) - (if (consp tree) - (or (select-in-tree atom (car tree)) - (select-in-tree atom (cdr tree)))))) - -(defun select-double-match? (pattern) - ;; ( = ) - (and (consp pattern) (consp (cdr pattern)) (consp (cddr pattern)) - (null (cdddr pattern)) - (eq (second pattern) '=))) - -(defun select-predicate? (pattern) - ;; ((function ) ) - (and (consp pattern) - (consp (cdr pattern)) - (null (cddr pattern)) - (consp (first pattern)) - (consp (cdr (first pattern))) - (null (cddr (first pattern))) - (eq (caar pattern) 'function))) - -(defun cs-car (exp) - (cs-car/cdr 'car exp - '((car . caar) (cdr . cadr) (caar . caaar) (cadr . caadr) - (cdar . cadar) (cddr . caddr) - (caaar . caaaar) (caadr . caaadr) (cadar . caadar) - (caddr . caaddr) (cdaar . cadaar) (cdadr . cadadr) - (cddar . caddar) (cdddr . cadddr)))) - -(defun cs-cdr (exp) - (cs-car/cdr 'cdr exp - '((car . cdar) (cdr . cddr) (caar . cdaar) (cadr . cdadr) - (cdar . cddar) (cddr . cdddr) - (caaar . cdaaar) (caadr . cdaadr) (cadar . cdadar) - (caddr . cdaddr) (cdaar . cddaar) (cdadr . cddadr) - (cddar . cdddar) (cdddr . cddddr)))) - -(defun cs-car/cdr (op exp table) - (if (and (consp exp) (= (length exp) 2)) - (let ((replacement (assoc (car exp) table))) - (if replacement - `(,(cdr replacement) ,(second exp)) - `(,op ,exp))) - `(,op ,exp))) - -;; (setf c1 '(select-match x (a 1) (b 2 3 4))) -;; (setf c2 '(select-match (car y) -;; (1 (print 100) 101) (2 200) ("hello" 5) (:x 20) (else (1+ -;; else)))) -;; (setf c3 '(select-match (caddr y) -;; ((all = (x y)) (list x y all)) -;; ((a '= b) (list 'assign a b)) -;; ((#'oddp k) (1+ k))))) - - diff --git a/elpa/slime-20200414.1444/swank/mezzano.lisp b/elpa/slime-20200414.1444/swank/mezzano.lisp deleted file mode 100644 index df9fadbb..00000000 --- a/elpa/slime-20200414.1444/swank/mezzano.lisp +++ /dev/null @@ -1,700 +0,0 @@ -;;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-mezzano.lisp --- SLIME backend for Mezzano -;;; -;;; This code has been placed in the Public Domain. All warranties are -;;; disclaimed. -;;; - -;;; Administrivia - -(defpackage swank/mezzano - (:use cl swank/backend)) - -(in-package swank/mezzano) - -;;; swank-mop - -(import-swank-mop-symbols :mezzano.clos '(:class-default-initargs - :class-direct-default-initargs - :specializer-direct-methods - :generic-function-declarations)) - -(defun swank-mop:specializer-direct-methods (obj) - (declare (ignore obj)) - '()) - -(defun swank-mop:generic-function-declarations (gf) - (declare (ignore gf)) - '()) - -(defimplementation gray-package-name () - "MEZZANO.GRAY") - -;;;; TCP server - -(defclass listen-socket () - ((%listener :initarg :listener))) - -(defimplementation create-socket (host port &key backlog) - (make-instance 'listen-socket - :listener (mezzano.network.tcp:tcp-listen - host - port - :backlog (or backlog 10)))) - -(defimplementation local-port (socket) - (mezzano.network.tcp:tcp-listener-local-port (slot-value socket '%listener))) - -(defimplementation close-socket (socket) - (mezzano.network.tcp:close-tcp-listener (slot-value socket '%listener))) - -(defimplementation accept-connection (socket &key external-format - buffering timeout) - (declare (ignore external-format buffering timeout)) - (loop - (let ((value (mezzano.network.tcp:tcp-accept (slot-value socket '%listener) - :wait-p nil))) - (if value - (return value) - ;; Poke standard-input every now and then to keep the console alive. - (progn (listen) - (sleep 0.05)))))) - -(defimplementation preferred-communication-style () - :spawn) - -;;;; Unix signals -;;;; ???? - -(defimplementation getpid () - 0) - -;;;; Compilation - -(defun signal-compiler-condition (condition severity) - (signal 'compiler-condition - :original-condition condition - :severity severity - :message (format nil "~A" condition) - :location nil)) - -(defimplementation call-with-compilation-hooks (func) - (handler-bind - ((error - (lambda (c) - (signal-compiler-condition c :error))) - (warning - (lambda (c) - (signal-compiler-condition c :warning))) - (style-warning - (lambda (c) - (signal-compiler-condition c :style-warning)))) - (funcall func))) - -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore buffer line column policy)) - (let* ((*load-pathname* (ignore-errors (pathname filename))) - (*load-truename* (when *load-pathname* - (ignore-errors (truename *load-pathname*)))) - (sys.int::*top-level-form-number* `(:position ,position))) - (with-compilation-hooks () - (eval (read-from-string (concatenate 'string "(progn " string " )"))))) - t) - -(defimplementation swank-compile-file (input-file output-file load-p - external-format - &key policy) - (with-compilation-hooks () - (multiple-value-prog1 - (compile-file input-file - :output-file output-file - :external-format external-format) - (when load-p - (load output-file))))) - -(defimplementation find-external-format (coding-system) - (if (or (equal coding-system "utf-8") - (equal coding-system "utf-8-unix")) - :default - nil)) - -;;;; Debugging - -;; Definitely don't allow this. -(defimplementation install-debugger-globally (function) - (declare (ignore function)) - nil) - -(defvar *current-backtrace*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let ((*current-backtrace* '())) - (let ((prev-fp nil)) - (sys.int::map-backtrace - (lambda (i fp) - (push (list (1- i) fp prev-fp) *current-backtrace*) - (setf prev-fp fp)))) - (setf *current-backtrace* (reverse *current-backtrace*)) - ;; Drop the topmost frame, which is finished call to MAP-BACKTRACE. - (pop *current-backtrace*) - ;; And the next one for good measure. - (pop *current-backtrace*) - (funcall debugger-loop-fn))) - -(defimplementation compute-backtrace (start end) - (subseq *current-backtrace* start end)) - -(defimplementation print-frame (frame stream) - (format stream "~S" (sys.int::function-from-frame frame))) - -(defimplementation frame-source-location (frame-number) - (let* ((frame (nth frame-number *current-backtrace*)) - (fn (sys.int::function-from-frame frame))) - (function-location fn))) - -(defimplementation frame-locals (frame-number) - (loop - with frame = (nth frame-number *current-backtrace*) - for (name id location repr) in (sys.int::frame-locals frame) - collect (list :name name - :id id - :value (sys.int::read-frame-slot frame location repr)))) - -(defimplementation frame-var-value (frame-number var-id) - (let* ((frame (nth frame-number *current-backtrace*)) - (locals (sys.int::frame-locals frame)) - (info (nth var-id locals))) - (if info - (destructuring-bind (name id location repr) - info - (declare (ignore id)) - (values (sys.int::read-frame-slot frame location repr) name)) - (error "Invalid variable id ~D for frame number ~D." - var-id frame-number)))) - -;;;; Definition finding - -(defun top-level-form-position (pathname tlf) - (ignore-errors - (with-open-file (s pathname) - (loop - repeat tlf - do (with-standard-io-syntax - (let ((*read-suppress* t) - (*read-eval* nil)) - (read s nil)))) - (let ((default (make-pathname :host (pathname-host s)))) - (make-location `(:file ,(enough-namestring s default)) - `(:position ,(1+ (file-position s)))))))) - -(defun function-location (function) - "Return a location object for FUNCTION." - (let* ((info (sys.int::function-debug-info function)) - (pathname (sys.int::debug-info-source-pathname info)) - (tlf (sys.int::debug-info-source-top-level-form-number info))) - (cond ((and (consp tlf) - (eql (first tlf) :position)) - (let ((default (make-pathname :host (pathname-host pathname)))) - (make-location `(:file ,(enough-namestring pathname default)) - `(:position ,(second tlf))))) - (t - (top-level-form-position pathname tlf))))) - -(defun method-definition-name (name method) - `(defmethod ,name - ,@(mezzano.clos:method-qualifiers method) - ,(mapcar (lambda (x) - (typecase x - (mezzano.clos:class - (mezzano.clos:class-name x)) - (mezzano.clos:eql-specializer - `(eql ,(mezzano.clos:eql-specializer-object x))) - (t x))) - (mezzano.clos:method-specializers method)))) - -(defimplementation find-definitions (name) - (let ((result '())) - (labels - ((frob-fn (dspec fn) - (let ((loc (function-location fn))) - (when loc - (push (list dspec loc) result)))) - (try-fn (name) - (when (valid-function-name-p name) - (when (and (fboundp name) - (not (and (symbolp name) - (or (special-operator-p name) - (macro-function name))))) - (let ((fn (fdefinition name))) - (cond ((typep fn 'mezzano.clos:standard-generic-function) - (dolist (m (mezzano.clos:generic-function-methods fn)) - (frob-fn (method-definition-name name m) - (mezzano.clos:method-function m)))) - (t - (frob-fn `(defun ,name) fn))))) - (when (compiler-macro-function name) - (frob-fn `(define-compiler-macro ,name) - (compiler-macro-function name)))))) - (try-fn name) - (try-fn `(setf name)) - (try-fn `(sys.int::cas name)) - (when (and (symbolp name) - (get name 'sys.int::setf-expander)) - (frob-fn `(define-setf-expander ,name) - (get name 'sys.int::setf-expander))) - (when (and (symbolp name) - (macro-function name)) - (frob-fn `(defmacro ,name) - (macro-function name)))) - result)) - -;;;; XREF -;;; Simpler variants. - -(defun find-all-frefs () - (let ((frefs (make-array 500 :adjustable t :fill-pointer 0)) - (keep-going t)) - (loop - (when (not keep-going) - (return)) - (adjust-array frefs (* (array-dimension frefs 0) 2)) - (setf keep-going nil - (fill-pointer frefs) 0) - ;; Walk the wired area looking for FREFs. - (sys.int::walk-area - :wired - (lambda (object address size) - (when (sys.int::function-reference-p object) - (when (not (vector-push object frefs)) - (setf keep-going t)))))) - (remove-duplicates (coerce frefs 'list)))) - -(defimplementation list-callers (function-name) - (let ((fref-for-fn (sys.int::function-reference function-name)) - (callers '())) - (loop - for fref in (find-all-frefs) - for fn = (sys.int::function-reference-function fref) - for name = (sys.int::function-reference-name fref) - when fn - do - (cond ((typep fn 'standard-generic-function) - (dolist (m (mezzano.clos:generic-function-methods fn)) - (let* ((mf (mezzano.clos:method-function m)) - (mf-frefs (get-all-frefs-in-function mf))) - (when (member fref-for-fn mf-frefs) - (push `((defmethod ,name - ,@(mezzano.clos:method-qualifiers m) - ,(mapcar #'specializer-name - (mezzano.clos:method-specializers m))) - ,(function-location mf)) - callers))))) - ((member fref-for-fn - (get-all-frefs-in-function fn)) - (push `((defun ,name) ,(function-location fn)) callers)))) - callers)) - -(defun specializer-name (specializer) - (if (typep specializer 'standard-class) - (mezzano.clos:class-name specializer) - specializer)) - -(defun get-all-frefs-in-function (function) - (when (sys.int::funcallable-std-instance-p function) - (setf function (sys.int::funcallable-std-instance-function function))) - (when (sys.int::closure-p function) - (setf function (sys.int::%closure-function function))) - (loop - for i below (sys.int::function-pool-size function) - for entry = (sys.int::function-pool-object function i) - when (sys.int::function-reference-p entry) - collect entry - when (compiled-function-p entry) ; closures - append (get-all-frefs-in-function entry))) - -(defimplementation list-callees (function-name) - (let* ((fn (fdefinition function-name)) - ;; Grovel around in the function's constant pool looking for - ;; function-references. These may be for #', but they're - ;; probably going to be for normal calls. - ;; TODO: This doesn't work well on interpreted functions or - ;; funcallable instances. - (callees (remove-duplicates (get-all-frefs-in-function fn)))) - (loop - for fref in callees - for name = (sys.int::function-reference-name fref) - for fn = (sys.int::function-reference-function fref) - when fn - collect `((defun ,name) ,(function-location fn))))) - -;;;; Documentation - -(defimplementation arglist (name) - (let ((macro (when (symbolp name) - (macro-function name))) - (fn (if (functionp name) - name - (ignore-errors (fdefinition name))))) - (cond - (macro - (get name 'sys.int::macro-lambda-list)) - (fn - (cond - ((typep fn 'mezzano.clos:standard-generic-function) - (mezzano.clos:generic-function-lambda-list fn)) - (t - (function-lambda-list fn)))) - (t :not-available)))) - -(defun function-lambda-list (function) - (sys.int::debug-info-lambda-list - (sys.int::function-debug-info function))) - -(defimplementation type-specifier-p (symbol) - (cond - ((or (get symbol 'sys.int::type-expander) - (get symbol 'sys.int::compound-type) - (get symbol 'sys.int::type-symbol)) - t) - (t :not-available))) - -(defimplementation function-name (function) - (sys.int::function-name function)) - -(defimplementation valid-function-name-p (form) - "Is FORM syntactically valid to name a function? - If true, FBOUNDP should not signal a type-error for FORM." - (flet ((length=2 (list) - (and (not (null (cdr list))) (null (cddr list))))) - (or (symbolp form) - (and (consp form) (length=2 form) - (or (eq (first form) 'setf) - (eq (first form) 'sys.int::cas)) - (symbolp (second form)))))) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (when (boundp symbol) - (setf (getf result :variable) nil)) - (when (and (fboundp symbol) - (not (macro-function symbol))) - (setf (getf result :function) - (function-docstring symbol))) - (when (fboundp `(setf ,symbol)) - (setf (getf result :setf) - (function-docstring `(setf ,symbol)))) - (when (get symbol 'sys.int::setf-expander) - (setf (getf result :setf) nil)) - (when (special-operator-p symbol) - (setf (getf result :special-operator) nil)) - (when (macro-function symbol) - (setf (getf result :macro) nil)) - (when (compiler-macro-function symbol) - (setf (getf result :compiler-macro) nil)) - (when (type-specifier-p symbol) - (setf (getf result :type) nil)) - (when (find-class symbol nil) - (setf (getf result :class) nil)) - result)) - -(defun function-docstring (function-name) - (let* ((definition (fdefinition function-name)) - (debug-info (sys.int::function-debug-info definition))) - (sys.int::debug-info-docstring debug-info))) - -;;;; Multithreading - -;; FIXME: This should be a weak table. -(defvar *thread-ids-for-emacs* (make-hash-table)) -(defvar *next-thread-id-for-emacs* 0) -(defvar *thread-id-for-emacs-lock* (mezzano.supervisor:make-mutex - "SWANK thread ID table")) - -(defimplementation spawn (fn &key name) - (mezzano.supervisor:make-thread fn :name name)) - -(defimplementation thread-id (thread) - (mezzano.supervisor:with-mutex (*thread-id-for-emacs-lock*) - (let ((id (gethash thread *thread-ids-for-emacs*))) - (when (null id) - (setf id (incf *next-thread-id-for-emacs*) - (gethash thread *thread-ids-for-emacs*) id - (gethash id *thread-ids-for-emacs*) thread)) - id))) - -(defimplementation find-thread (id) - (mezzano.supervisor:with-mutex (*thread-id-for-emacs-lock*) - (gethash id *thread-ids-for-emacs*))) - -(defimplementation thread-name (thread) - (mezzano.supervisor:thread-name thread)) - -(defimplementation thread-status (thread) - (format nil "~:(~A~)" (mezzano.supervisor:thread-state thread))) - -(defimplementation current-thread () - (mezzano.supervisor:current-thread)) - -(defimplementation all-threads () - (mezzano.supervisor:all-threads)) - -(defimplementation thread-alive-p (thread) - (not (eql (mezzano.supervisor:thread-state thread) :dead))) - -(defimplementation interrupt-thread (thread fn) - (mezzano.supervisor:establish-thread-foothold thread fn)) - -(defimplementation kill-thread (thread) - ;; Documentation says not to execute unwind-protected sections, but there's - ;; no way to do that. - ;; And killing threads at arbitrary points without unwinding them is a good - ;; way to hose the system. - (mezzano.supervisor:terminate-thread thread)) - -(defvar *mailbox-lock* (mezzano.supervisor:make-mutex "mailbox lock")) -(defvar *mailboxes* (list)) - -(defstruct (mailbox (:conc-name mailbox.)) - thread - (mutex (mezzano.supervisor:make-mutex)) - (queue '() :type list)) - -(defun mailbox (thread) - "Return THREAD's mailbox." - ;; Use weak pointers to avoid holding on to dead threads forever. - (mezzano.supervisor:with-mutex (*mailbox-lock*) - ;; Flush forgotten threads. - (setf *mailboxes* - (remove-if-not #'sys.int::weak-pointer-value *mailboxes*)) - (loop - for entry in *mailboxes* - do - (multiple-value-bind (key value livep) - (sys.int::weak-pointer-pair entry) - (when (eql key thread) - (return value))) - finally - (let ((mb (make-mailbox :thread thread))) - (push (sys.int::make-weak-pointer thread mb) *mailboxes*) - (return mb))))) - -(defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (mezzano.supervisor:with-mutex (mutex) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message)))))) - -(defvar *receive-if-sleep-time* 0.02) - -(defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (mezzano.supervisor:with-mutex (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (when (eq timeout t) (return (values nil t)))) - (sleep *receive-if-sleep-time*)))) - -(defvar *registered-threads* (make-hash-table)) -(defvar *registered-threads-lock* - (mezzano.supervisor:make-mutex "registered threads lock")) - -(defimplementation register-thread (name thread) - (declare (type symbol name)) - (mezzano.supervisor:with-mutex (*registered-threads-lock*) - (etypecase thread - (null - (remhash name *registered-threads*)) - (mezzano.supervisor:thread - (setf (gethash name *registered-threads*) thread)))) - nil) - -(defimplementation find-registered (name) - (mezzano.supervisor:with-mutex (*registered-threads-lock*) - (values (gethash name *registered-threads*)))) - -(defimplementation wait-for-input (streams &optional timeout) - (loop - (let ((ready '())) - (dolist (s streams) - (when (or (listen s) - (and (typep s 'mezzano.network.tcp::tcp-stream) - (mezzano.network.tcp::tcp-connection-closed-p s))) - (push s ready))) - (when ready - (return ready)) - (when (check-slime-interrupts) - (return :interrupt)) - (when timeout - (return '())) - (sleep 1) - (when (numberp timeout) - (decf timeout 1) - (when (not (plusp timeout)) - (return '())))))) - -;;;; Locks - -(defstruct recursive-lock - mutex - (depth 0)) - -(defimplementation make-lock (&key name) - (make-recursive-lock - :mutex (mezzano.supervisor:make-mutex name))) - -(defimplementation call-with-lock-held (lock function) - (cond ((mezzano.supervisor:mutex-held-p - (recursive-lock-mutex lock)) - (unwind-protect - (progn (incf (recursive-lock-depth lock)) - (funcall function)) - (decf (recursive-lock-depth lock)))) - (t - (mezzano.supervisor:with-mutex ((recursive-lock-mutex lock)) - (multiple-value-prog1 - (funcall function) - (assert (eql (recursive-lock-depth lock) 0))))))) - -;;;; Character names - -(defimplementation character-completion-set (prefix matchp) - ;; TODO: Unicode characters too. - (loop - for names in sys.int::*char-name-alist* - append - (loop - for name in (rest names) - when (funcall matchp prefix name) - collect name))) - -;;;; Inspector - -(defmethod emacs-inspect ((o function)) - (case (sys.int::%object-tag o) - (#.sys.int::+object-tag-function+ - (label-value-line* - (:name (sys.int::function-name o)) - (:arglist (arglist o)) - (:debug-info (sys.int::function-debug-info o)))) - (#.sys.int::+object-tag-closure+ - (append - (label-value-line :function (sys.int::%closure-function o)) - `("Closed over values:" (:newline)) - (loop - for i below (sys.int::%closure-length o) - append (label-value-line i (sys.int::%closure-value o i))))) - (t - (call-next-method)))) - -(defmethod emacs-inspect ((o sys.int::weak-pointer)) - (label-value-line* - (:key (sys.int::weak-pointer-key o)) - (:value (sys.int::weak-pointer-value o)))) - -(defmethod emacs-inspect ((o sys.int::function-reference)) - (label-value-line* - (:name (sys.int::function-reference-name o)) - (:function (sys.int::function-reference-function o)))) - -(defmethod emacs-inspect ((object structure-object)) - (let ((class (class-of object))) - `("Class: " (:value ,class) (:newline) - ,@(swank::all-slots-for-inspector object)))) - -(in-package :swank) - -(defmethod all-slots-for-inspector ((object structure-object)) - (let* ((class (class-of object)) - (direct-slots (swank-mop:class-direct-slots class)) - (effective-slots (swank-mop:class-slots class)) - (longest-slot-name-length - (loop for slot :in effective-slots - maximize (length (symbol-name - (swank-mop:slot-definition-name slot))))) - (checklist - (reinitialize-checklist - (ensure-istate-metadata object :checklist - (make-checklist (length effective-slots))))) - (grouping-kind - ;; We box the value so we can re-set it. - (ensure-istate-metadata object :grouping-kind - (box *inspector-slots-default-grouping*))) - (sort-order - (ensure-istate-metadata object :sort-order - (box *inspector-slots-default-order*))) - (sort-predicate (ecase (ref sort-order) - (:alphabetically #'string<) - (:unsorted (constantly nil)))) - (sorted-slots (sort (copy-seq effective-slots) - sort-predicate - :key #'swank-mop:slot-definition-name)) - (effective-slots - (ecase (ref grouping-kind) - (:all sorted-slots) - (:inheritance (stable-sort-by-inheritance sorted-slots - class sort-predicate))))) - `("--------------------" - (:newline) - " Group slots by inheritance " - (:action ,(ecase (ref grouping-kind) - (:all "[ ]") - (:inheritance "[X]")) - ,(lambda () - ;; We have to do this as the order of slots will - ;; be sorted differently. - (fill (checklist.buttons checklist) nil) - (setf (ref grouping-kind) - (ecase (ref grouping-kind) - (:all :inheritance) - (:inheritance :all)))) - :refreshp t) - (:newline) - " Sort slots alphabetically " - (:action ,(ecase (ref sort-order) - (:unsorted "[ ]") - (:alphabetically "[X]")) - ,(lambda () - (fill (checklist.buttons checklist) nil) - (setf (ref sort-order) - (ecase (ref sort-order) - (:unsorted :alphabetically) - (:alphabetically :unsorted)))) - :refreshp t) - (:newline) - ,@ (case (ref grouping-kind) - (:all - `((:newline) - "All Slots:" - (:newline) - ,@(make-slot-listing checklist object class - effective-slots direct-slots - longest-slot-name-length))) - (:inheritance - (list-all-slots-by-inheritance checklist object class - effective-slots direct-slots - longest-slot-name-length))) - (:newline) - (:action "[set value]" - ,(lambda () - (do-checklist (idx checklist) - (query-and-set-slot class object - (nth idx effective-slots)))) - :refreshp t) - " " - (:action "[make unbound]" - ,(lambda () - (do-checklist (idx checklist) - (swank-mop:slot-makunbound-using-class - class object (nth idx effective-slots)))) - :refreshp t) - (:newline)))) diff --git a/elpa/slime-20200414.1444/swank/mkcl.lisp b/elpa/slime-20200414.1444/swank/mkcl.lisp deleted file mode 100644 index 3b9df978..00000000 --- a/elpa/slime-20200414.1444/swank/mkcl.lisp +++ /dev/null @@ -1,933 +0,0 @@ -;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-mkcl.lisp --- SLIME backend for MKCL. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -;;; Administrivia - -(defpackage swank/mkcl - (:use cl swank/backend)) - -(in-package swank/mkcl) - -;;(declaim (optimize (debug 3))) - -(defvar *tmp*) - -(defimplementation gray-package-name () - '#:gray) - -(eval-when (:compile-toplevel :load-toplevel) - - (swank/backend::import-swank-mop-symbols :clos - ;; '(:eql-specializer - ;; :eql-specializer-object - ;; :generic-function-declarations - ;; :specializer-direct-methods - ;; :compute-applicable-methods-using-classes) - nil - )) - - -;;; UTF8 - -(defimplementation string-to-utf8 (string) - (mkcl:octets (si:utf-8 string))) - -(defimplementation utf8-to-string (octets) - (string (si:utf-8 octets))) - - -;;;; TCP Server - -(eval-when (:compile-toplevel :load-toplevel) - ;; At compile-time we need access to the sb-bsd-sockets package for the - ;; the following code to be read properly. - ;; It is a bit a shame we have to load the entire module to get that. - (require 'sockets)) - - -(defun resolve-hostname (name) - (car (sb-bsd-sockets:host-ent-addresses - (sb-bsd-sockets:get-host-by-name name)))) - -(defimplementation create-socket (host port &key backlog) - (let ((socket (make-instance 'sb-bsd-sockets:inet-socket - :type :stream - :protocol :tcp))) - (setf (sb-bsd-sockets:sockopt-reuse-address socket) t) - (sb-bsd-sockets:socket-bind socket (resolve-hostname host) port) - (sb-bsd-sockets:socket-listen socket (or backlog 5)) - socket)) - -(defimplementation local-port (socket) - (nth-value 1 (sb-bsd-sockets:socket-name socket))) - -(defimplementation close-socket (socket) - (sb-bsd-sockets:socket-close socket)) - -(defun accept (socket) - "Like socket-accept, but retry on EINTR." - (loop (handler-case - (return (sb-bsd-sockets:socket-accept socket)) - (sb-bsd-sockets:interrupted-error ())))) - -(defimplementation accept-connection (socket - &key external-format - buffering timeout) - (declare (ignore timeout)) - (sb-bsd-sockets:socket-make-stream (accept socket) - :output t ;; bogus - :input t ;; bogus - :buffering buffering ;; bogus - :element-type (if external-format - 'character - '(unsigned-byte 8)) - :external-format external-format - )) - -(defimplementation preferred-communication-style () - :spawn - ) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix"))) - -(defun external-format (coding-system) - (or (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*)) - (find coding-system (si:all-encodings) :test #'string-equal))) - -(defimplementation find-external-format (coding-system) - #+unicode (external-format coding-system) - ;; Without unicode support, MKCL uses the one-byte encoding of the - ;; underlying OS, and will barf on anything except :DEFAULT. We - ;; return NIL here for known multibyte encodings, so - ;; SWANK:CREATE-SERVER will barf. - #-unicode (let ((xf (external-format coding-system))) - (if (member xf '(:utf-8)) - nil - :default))) - - - -;;;; Unix signals - -(defimplementation install-sigint-handler (handler) - (let ((old-handler (symbol-function 'si:terminal-interrupt))) - (setf (symbol-function 'si:terminal-interrupt) - (if (consp handler) - (car handler) - (lambda (&rest args) - (declare (ignore args)) - (funcall handler) - (continue)))) - (list old-handler))) - - -(defimplementation getpid () - (mkcl:getpid)) - -(defimplementation set-default-directory (directory) - (mk-ext::chdir (namestring directory)) - (default-directory)) - -(defimplementation default-directory () - (namestring (mk-ext:getcwd))) - -(defmacro progf (plist &rest forms) - `(let (_vars _vals) - (do ((p ,plist (cddr p))) - ((endp p)) - (push (car p) _vars) - (push (cadr p) _vals)) - (progv _vars _vals ,@forms) - ) - ) - -(defvar *inferior-lisp-sleeping-post* nil) - -(defimplementation quit-lisp () - (progf (ignore-errors (eval (read-from-string "swank::*saved-global-streams*"))) ;; restore original IO streams. - (when *inferior-lisp-sleeping-post* (mt:semaphore-signal *inferior-lisp-sleeping-post*)) - ;;(mk-ext:quit :verbose t) - )) - - -;;;; Compilation - -(defvar *buffer-name* nil) -(defvar *buffer-start-position*) -(defvar *buffer-string*) -(defvar *compile-filename*) - -(defun signal-compiler-condition (&rest args) - (signal (apply #'make-condition 'compiler-condition args))) - -#| -(defun handle-compiler-warning (condition) - (signal-compiler-condition - :original-condition condition - :message (format nil "~A" condition) - :severity :warning - :location - (if *buffer-name* - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* 0)) - ;; ;; compiler::*current-form* - ;; (if compiler::*current-function* - ;; (make-location (list :file *compile-filename*) - ;; (list :function-name - ;; (symbol-name - ;; (slot-value compiler::*current-function* - ;; 'compiler::name)))) - (list :error "No location found.") - ;; ) - ))) -|# - -#| -(defun condition-location (condition) - (let ((file (compiler:compiler-message-file condition)) - (position (compiler:compiler-message-file-position condition))) - (if (and position (not (minusp position))) - (if *buffer-name* - (make-buffer-location *buffer-name* - *buffer-start-position* - position) - (make-file-location file position)) - (make-error-location "No location found.")))) -|# - -(defun condition-location (condition) - (if *buffer-name* - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* 0)) - ;; ;; compiler::*current-form* ; - ;; (if compiler::*current-function* ; - ;; (make-location (list :file *compile-filename*) ; - ;; (list :function-name ; - ;; (symbol-name ; - ;; (slot-value compiler::*current-function* ; - ;; 'compiler::name)))) ; - (if (typep condition 'compiler::compiler-message) - (make-location (list :file (namestring (compiler:compiler-message-file condition))) - (list :end-position (compiler:compiler-message-file-end-position condition))) - (list :error "No location found.")) - ) - ) - -(defun handle-compiler-message (condition) - (unless (typep condition 'compiler::compiler-note) - (signal-compiler-condition - :original-condition condition - :message (princ-to-string condition) - :severity (etypecase condition - (compiler:compiler-fatal-error :error) - (compiler:compiler-error :error) - (error :error) - (style-warning :style-warning) - (warning :warning)) - :location (condition-location condition)))) - -(defimplementation call-with-compilation-hooks (function) - (handler-bind ((compiler:compiler-message #'handle-compiler-message)) - (funcall function))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (let ((*buffer-name* nil) - (*compile-filename* input-file)) - (handler-bind (#| - (compiler::compiler-note - #'(lambda (n) - (format t "~%swank saw a compiler note: ~A~%" n) (finish-output) nil)) - (compiler::compiler-warning - #'(lambda (w) - (format t "~%swank saw a compiler warning: ~A~%" w) (finish-output) nil)) - (compiler::compiler-error - #'(lambda (e) - (format t "~%swank saw a compiler error: ~A~%" e) (finish-output) nil)) - |# - ) - (multiple-value-bind (output-truename warnings-p failure-p) - (compile-file input-file :output-file output-file :external-format external-format) - (values output-truename warnings-p - (or failure-p - (and load-p (not (load output-truename)))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename line column policy) - (declare (ignore filename line column policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-string* string)) - (with-input-from-string (s string) - (when position (file-position position)) - (compile-from-stream s))))) - -(defun compile-from-stream (stream) - (let ((file (mkcl:mkstemp "TMP:MKCL-SWANK-TMPXXXXXX")) - output-truename - warnings-p - failure-p - ) - (with-open-file (s file :direction :output :if-exists :overwrite) - (do ((line (read-line stream nil) (read-line stream nil))) - ((not line)) - (write-line line s))) - (unwind-protect - (progn - (multiple-value-setq (output-truename warnings-p failure-p) - (compile-file file)) - (and (not failure-p) (load output-truename))) - (when (probe-file file) (delete-file file)) - (when (probe-file output-truename) (delete-file output-truename))))) - - -;;;; Documentation - -(defun grovel-docstring-for-arglist (name type) - (flet ((compute-arglist-offset (docstring) - (when docstring - (let ((pos1 (search "Args: " docstring))) - (if pos1 - (+ pos1 6) - (let ((pos2 (search "Syntax: " docstring))) - (when pos2 - (+ pos2 8)))))))) - (let* ((docstring (si::get-documentation name type)) - (pos (compute-arglist-offset docstring))) - (if pos - (multiple-value-bind (arglist errorp) - (ignore-errors - (values (read-from-string docstring t nil :start pos))) - (if (or errorp (not (listp arglist))) - :not-available - arglist - )) - :not-available )))) - -(defimplementation arglist (name) - (cond ((and (symbolp name) (special-operator-p name)) - (let ((arglist (grovel-docstring-for-arglist name 'function))) - (if (consp arglist) (cdr arglist) arglist))) - ((and (symbolp name) (macro-function name)) - (let ((arglist (grovel-docstring-for-arglist name 'function))) - (if (consp arglist) (cdr arglist) arglist))) - ((or (functionp name) (fboundp name)) - (multiple-value-bind (name fndef) - (if (functionp name) - (values (function-name name) name) - (values name (fdefinition name))) - (let ((fle (function-lambda-expression fndef))) - (case (car fle) - (si:lambda-block (caddr fle)) - (t (typecase fndef - (generic-function (clos::generic-function-lambda-list fndef)) - (compiled-function (grovel-docstring-for-arglist name 'function)) - (function :not-available))))))) - (t :not-available))) - -(defimplementation function-name (f) - (si:compiled-function-name f) - ) - -(eval-when (:compile-toplevel :load-toplevel) - ;; At compile-time we need access to the walker package for the - ;; the following code to be read properly. - ;; It is a bit a shame we have to load the entire module to get that. - (require 'walker)) - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (walker:macroexpand-all form)) - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (dolist (type '(:VARIABLE :FUNCTION :CLASS)) - (let ((doc (describe-definition symbol type))) - (when doc - (setf result (list* type doc result))))) - result)) - -(defimplementation describe-definition (name type) - (case type - (:variable (documentation name 'variable)) - (:function (documentation name 'function)) - (:class (documentation name 'class)) - (t nil))) - -;;; Debugging - -(eval-when (:compile-toplevel :load-toplevel) - (import - '(si::*break-env* - si::*ihs-top* - si::*ihs-current* - si::*ihs-base* - si::*frs-base* - si::*frs-top* - si::*tpl-commands* - si::*tpl-level* - si::frs-top - si::ihs-top - si::ihs-fun - si::ihs-env - si::sch-frs-base - si::set-break-env - si::set-current-ihs - si::tpl-commands))) - -(defvar *backtrace* '()) - -(defun in-swank-package-p (x) - (and - (symbolp x) - (member (symbol-package x) - (list #.(find-package :swank) - #.(find-package :swank/backend) - #.(ignore-errors (find-package :swank-mop)) - #.(ignore-errors (find-package :swank-loader)))) - t)) - -(defun is-swank-source-p (name) - (setf name (pathname name)) - #+(or) - (pathname-match-p - name - (make-pathname :defaults swank-loader::*source-directory* - :name (pathname-name name) - :type (pathname-type name) - :version (pathname-version name))) - nil) - -(defun is-ignorable-fun-p (x) - (or - (in-swank-package-p (frame-name x)) - (multiple-value-bind (file position) - (ignore-errors (si::compiled-function-file (car x))) - (declare (ignore position)) - (if file (is-swank-source-p file))))) - -(defmacro find-ihs-top (x) - (declare (ignore x)) - '(si::ihs-top)) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (declare (type function debugger-loop-fn)) - (let* (;;(*tpl-commands* si::tpl-commands) - (*ihs-base* 0) - (*ihs-top* (find-ihs-top 'call-with-debugging-environment)) - (*ihs-current* *ihs-top*) - (*frs-base* (or (sch-frs-base 0 #|*frs-top*|# *ihs-base*) (1+ (frs-top)))) - (*frs-top* (frs-top)) - (*read-suppress* nil) - ;;(*tpl-level* (1+ *tpl-level*)) - (*backtrace* (loop for ihs from 0 below *ihs-top* - collect (list (si::ihs-fun ihs) - (si::ihs-env ihs) - nil)))) - (declare (special *ihs-current*)) - (loop for f from *frs-base* to *frs-top* - do (let ((i (- (si::frs-ihs f) *ihs-base* 1))) - (when (plusp i) - (let* ((x (elt *backtrace* i)) - (name (si::frs-tag f))) - (unless (mkcl:fixnump name) - (push name (third x))))))) - (setf *backtrace* (remove-if #'is-ignorable-fun-p (nreverse *backtrace*))) - (setf *tmp* *backtrace*) - (set-break-env) - (set-current-ihs) - (let ((*ihs-base* *ihs-top*)) - (funcall debugger-loop-fn)))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - (*ihs-base* (find-ihs-top 'call-with-debugger-hook))) - (funcall fun))) - -(defimplementation compute-backtrace (start end) - (when (numberp end) - (setf end (min end (length *backtrace*)))) - (loop for f in (subseq *backtrace* start end) - collect f)) - -(defimplementation format-sldb-condition (condition) - "Format a condition for display in SLDB." - ;;(princ-to-string condition) - (format nil "~A~%In thread: ~S" condition mt:*thread*) - ) - -(defun frame-name (frame) - (let ((x (first frame))) - (if (symbolp x) - x - (function-name x)))) - -(defun function-position (fun) - (multiple-value-bind (file position) - (si::compiled-function-file fun) - (and file (make-location - `(:file ,(if (stringp file) file (namestring file))) - ;;`(:position ,position) - `(:end-position , position))))) - -(defun frame-function (frame) - (let* ((x (first frame)) - fun position) - (etypecase x - (symbol (and (fboundp x) - (setf fun (fdefinition x) - position (function-position fun)))) - (function (setf fun x position (function-position x)))) - (values fun position))) - -(defun frame-decode-env (frame) - (let ((functions '()) - (blocks '()) - (variables '())) - (setf frame (si::decode-ihs-env (second frame))) - (dolist (record frame) - (let* ((record0 (car record)) - (record1 (cdr record))) - (cond ((or (symbolp record0) (stringp record0)) - (setq variables (acons record0 record1 variables))) - ((not (mkcl:fixnump record0)) - (push record1 functions)) - ((symbolp record1) - (push record1 blocks)) - (t - )))) - (values functions blocks variables))) - -(defimplementation print-frame (frame stream) - (let ((function (first frame))) - (let ((fname -;;; (cond ((symbolp function) function) -;;; ((si:instancep function) (slot-value function 'name)) -;;; ((compiled-function-p function) -;;; (or (si::compiled-function-name function) 'lambda)) -;;; (t :zombi)) - (si::get-fname function) - )) - (if (eq fname 'si::bytecode) - (format stream "~A [Evaluation of: ~S]" - fname (function-lambda-expression function)) - (format stream "~A" fname) - ) - (when (si::closurep function) - (format stream - ", closure generated from ~A" - (si::get-fname (si:closure-producer function))) - ) - ) - ) - ) - -(defimplementation frame-source-location (frame-number) - (nth-value 1 (frame-function (elt *backtrace* frame-number)))) - -(defimplementation frame-catch-tags (frame-number) - (third (elt *backtrace* frame-number))) - -(defimplementation frame-locals (frame-number) - (loop for (name . value) in (nth-value 2 (frame-decode-env (elt *backtrace* frame-number))) - with i = 0 - collect (list :name name :id (prog1 i (incf i)) :value value))) - -(defimplementation frame-var-value (frame-number var-id) - (cdr (elt (nth-value 2 (frame-decode-env (elt *backtrace* frame-number))) var-id))) - -(defimplementation disassemble-frame (frame-number) - (let ((fun (frame-fun (elt *backtrace* frame-number)))) - (disassemble fun))) - -(defimplementation eval-in-frame (form frame-number) - (let ((env (second (elt *backtrace* frame-number)))) - (si:eval-in-env form env))) - -#| -(defimplementation gdb-initial-commands () - ;; These signals are used by the GC. - #+linux '("handle SIGPWR noprint nostop" - "handle SIGXCPU noprint nostop")) - -(defimplementation command-line-args () - (loop for n from 0 below (si:argc) collect (si:argv n))) -|# - -;;;; Inspector - -(defmethod emacs-inspect ((o t)) - ; ecl clos support leaves some to be desired - (cond - ((streamp o) - (list* - (format nil "~S is an ordinary stream~%" o) - (append - (list - "Open for " - (cond - ((ignore-errors (interactive-stream-p o)) "Interactive") - ((and (input-stream-p o) (output-stream-p o)) "Input and output") - ((input-stream-p o) "Input") - ((output-stream-p o) "Output")) - `(:newline) `(:newline)) - (label-value-line* - ("Element type" (stream-element-type o)) - ("External format" (stream-external-format o))) - (ignore-errors (label-value-line* - ("Broadcast streams" (broadcast-stream-streams o)))) - (ignore-errors (label-value-line* - ("Concatenated streams" (concatenated-stream-streams o)))) - (ignore-errors (label-value-line* - ("Echo input stream" (echo-stream-input-stream o)))) - (ignore-errors (label-value-line* - ("Echo output stream" (echo-stream-output-stream o)))) - (ignore-errors (label-value-line* - ("Output String" (get-output-stream-string o)))) - (ignore-errors (label-value-line* - ("Synonym symbol" (synonym-stream-symbol o)))) - (ignore-errors (label-value-line* - ("Input stream" (two-way-stream-input-stream o)))) - (ignore-errors (label-value-line* - ("Output stream" (two-way-stream-output-stream o))))))) - ((si:instancep o) ;;t - (let* ((cl (si:instance-class o)) - (slots (clos::class-slots cl))) - (list* (format nil "~S is an instance of class ~A~%" - o (clos::class-name cl)) - (loop for x in slots append - (let* ((name (clos::slot-definition-name x)) - (value (if (slot-boundp o name) - (clos::slot-value o name) - "Unbound" - ))) - (list - (format nil "~S: " name) - `(:value ,value) - `(:newline))))))) - (t (list (format nil "~A" o))))) - -;;;; Definitions - -(defimplementation find-definitions (name) - (if (fboundp name) - (let ((tmp (find-source-location (symbol-function name)))) - `(((defun ,name) ,tmp))))) - -(defimplementation find-source-location (obj) - (setf *tmp* obj) - (or - (typecase obj - (function - (multiple-value-bind (file pos) (ignore-errors (si::compiled-function-file obj)) - (if (and file pos) - (make-location - `(:file ,(if (stringp file) file (namestring file))) - `(:end-position ,pos) ;; `(:position ,pos) - `(:snippet - ,(with-open-file (s file) - (file-position s pos) - (skip-comments-and-whitespace s) - (read-snippet s)))))))) - `(:error (format nil "Source definition of ~S not found" obj)))) - -;;;; Profiling - - -(eval-when (:compile-toplevel :load-toplevel) - ;; At compile-time we need access to the profile package for the - ;; the following code to be read properly. - ;; It is a bit a shame we have to load the entire module to get that. - (require 'profile)) - - -(defimplementation profile (fname) - (when fname (eval `(profile:profile ,fname)))) - -(defimplementation unprofile (fname) - (when fname (eval `(profile:unprofile ,fname)))) - -(defimplementation unprofile-all () - (profile:unprofile-all) - "All functions unprofiled.") - -(defimplementation profile-report () - (profile:report)) - -(defimplementation profile-reset () - (profile:reset) - "Reset profiling counters.") - -(defimplementation profiled-functions () - (profile:profile)) - -(defimplementation profile-package (package callers methods) - (declare (ignore callers methods)) - (eval `(profile:profile ,(package-name (find-package package))))) - - -;;;; Threads - -(defvar *thread-id-counter* 0) - -(defvar *thread-id-counter-lock* - (mt:make-lock :name "thread id counter lock")) - -(defun next-thread-id () - (mt:with-lock (*thread-id-counter-lock*) - (incf *thread-id-counter*)) - ) - -(defparameter *thread-id-map* (make-hash-table)) -(defparameter *id-thread-map* (make-hash-table)) - -(defvar *thread-id-map-lock* - (mt:make-lock :name "thread id map lock")) - -(defparameter +default-thread-local-variables+ - '(*macroexpand-hook* - *default-pathname-defaults* - *readtable* - *random-state* - *compile-print* - *compile-verbose* - *load-print* - *load-verbose* - *print-array* - *print-base* - *print-case* - *print-circle* - *print-escape* - *print-gensym* - *print-length* - *print-level* - *print-lines* - *print-miser-width* - *print-pprint-dispatch* - *print-pretty* - *print-radix* - *print-readably* - *print-right-margin* - *read-base* - *read-default-float-format* - *read-eval* - *read-suppress* - )) - -(defun thread-local-default-bindings () - (let (local) - (dolist (var +default-thread-local-variables+ local) - (setq local (acons var (symbol-value var) local)) - ))) - -;; mkcl doesn't have weak pointers -(defimplementation spawn (fn &key name initial-bindings) - (let* ((local-defaults (thread-local-default-bindings)) - (thread - ;;(mt:make-thread :name name) - (mt:make-thread :name name - :initial-bindings (nconc initial-bindings - local-defaults)) - ) - (id (next-thread-id))) - (mt:with-lock (*thread-id-map-lock*) - (setf (gethash id *thread-id-map*) thread) - (setf (gethash thread *id-thread-map*) id)) - (mt:thread-preset - thread - #'(lambda () - (unwind-protect - (progn - ;;(format t "~&Starting thread: ~S.~%" name) (finish-output) - (mt:thread-detach nil) - (funcall fn)) - (progn - ;;(format t "~&Wrapping up thread: ~S.~%" name) (finish-output) - (mt:with-lock (*thread-id-map-lock*) - (remhash thread *id-thread-map*) - (remhash id *thread-id-map*)) - ;;(format t "~&Finished thread: ~S~%" name) (finish-output) - )))) - (mt:thread-enable thread) - (mt:thread-yield) - thread - )) - -(defimplementation thread-id (thread) - (block thread-id - (mt:with-lock (*thread-id-map-lock*) - (or (gethash thread *id-thread-map*) - (let ((id (next-thread-id))) - (setf (gethash id *thread-id-map*) thread) - (setf (gethash thread *id-thread-map*) id) - id))))) - -(defimplementation find-thread (id) - (mt:with-lock (*thread-id-map-lock*) - (gethash id *thread-id-map*))) - -(defimplementation thread-name (thread) - (mt:thread-name thread)) - -(defimplementation thread-status (thread) - (if (mt:thread-active-p thread) - "RUNNING" - "STOPPED")) - -(defimplementation make-lock (&key name) - (mt:make-lock :name name :recursive t)) - -(defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (mt:with-lock (lock) (funcall function))) - -(defimplementation current-thread () - mt:*thread*) - -(defimplementation all-threads () - (mt:all-threads)) - -(defimplementation interrupt-thread (thread fn) - (mt:interrupt-thread thread fn)) - -(defimplementation kill-thread (thread) - (mt:interrupt-thread thread #'mt:terminate-thread) - ) - -(defimplementation thread-alive-p (thread) - (mt:thread-active-p thread)) - -(defvar *mailbox-lock* (mt:make-lock :name "mailbox lock")) -(defvar *mailboxes* (list)) -(declaim (type list *mailboxes*)) - -(defstruct (mailbox (:conc-name mailbox.)) - thread - locked-by - (mutex (mt:make-lock :name "thread mailbox")) - (semaphore (mt:make-semaphore)) - (queue '() :type list)) - -(defun mailbox (thread) - "Return THREAD's mailbox." - (mt:with-lock (*mailbox-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - -(defimplementation send (thread message) - (handler-case - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) -;; (mt:interrupt-thread -;; thread -;; (lambda () -;; (mt:with-lock (mutex) -;; (setf (mailbox.queue mbox) -;; (nconc (mailbox.queue mbox) (list message)))))) - -;; (format t "~&! thread = ~S~% thread = ~S~% message = ~S~%" -;; mt:*thread* thread message) (finish-output) - (mt:with-lock (mutex) - (setf (mailbox.locked-by mbox) mt:*thread*) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - ;;(format t "*") (finish-output) - (handler-case - (mt:semaphore-signal (mailbox.semaphore mbox)) - (condition (condition) - (format t "Something went bad with semaphore-signal ~A" condition) (finish-output) - ;;(break) - )) - (setf (mailbox.locked-by mbox) nil) - ) - ;;(format t "+") (finish-output) - ) - (condition (condition) - (format t "~&Error in send: ~S~%" condition) (finish-output)) - ) - ) - -;; (defimplementation receive () -;; (block got-mail -;; (let* ((mbox (mailbox mt:*thread*)) -;; (mutex (mailbox.mutex mbox))) -;; (loop -;; (mt:with-lock (mutex) -;; (if (mailbox.queue mbox) -;; (return-from got-mail (pop (mailbox.queue mbox))))) -;; ;;interrupt-thread will halt this if it takes longer than 1sec -;; (sleep 1))))) - - -(defimplementation receive-if (test &optional timeout) - (handler-case - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox)) - got-one) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - ;;(format t "~&: ~S~%" mt:*thread*) (finish-output) - (handler-case - (setq got-one (mt:semaphore-wait (mailbox.semaphore mbox) 2)) - (condition (condition) - (format t "~&In (swank-mkcl) receive-if: Something went bad with semaphore-wait ~A~%" condition) - (finish-output) - nil - ) - ) - (mt:with-lock (mutex) - (setf (mailbox.locked-by mbox) mt:*thread*) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (setf (mailbox.locked-by mbox) nil) - ;;(format t "~&thread ~S received: ~S~%" mt:*thread* (car tail)) - (return (car tail)))) - (setf (mailbox.locked-by mbox) nil) - ) - - ;;(format t "/ ~S~%" mt:*thread*) (finish-output) - (when (eq timeout t) (return (values nil t))) -;; (unless got-one -;; (format t "~&In (swank-mkcl) receive-if: semaphore-wait timed out!~%")) - ) - ) - (condition (condition) - (format t "~&Error in (swank-mkcl) receive-if: ~S, ~A~%" condition condition) (finish-output) - nil - ) - ) - ) - - -(defmethod stream-finish-output ((stream stream)) - (finish-output stream)) - - -;; - -;;#+windows -(defimplementation doze-in-repl () - (setq *inferior-lisp-sleeping-post* (mt:make-semaphore)) - ;;(loop (sleep 1)) - (mt:semaphore-wait *inferior-lisp-sleeping-post*) - (mk-ext:quit :verbose t) - ) - diff --git a/elpa/slime-20200414.1444/swank/rpc.lisp b/elpa/slime-20200414.1444/swank/rpc.lisp deleted file mode 100644 index e30cc2cc..00000000 --- a/elpa/slime-20200414.1444/swank/rpc.lisp +++ /dev/null @@ -1,162 +0,0 @@ -;;; -*- indent-tabs-mode: nil; coding: latin-1-unix -*- -;;; -;;; swank-rpc.lisp -- Pass remote calls and responses between lisp systems. -;;; -;;; Created 2010, Terje Norderhaug -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(in-package swank/rpc) - - -;;;;; Input - -(define-condition swank-reader-error (reader-error) - ((packet :type string :initarg :packet - :reader swank-reader-error.packet) - (cause :type reader-error :initarg :cause - :reader swank-reader-error.cause))) - -(defun read-message (stream package) - (let ((packet (read-packet stream))) - (handler-case (values (read-form packet package)) - (reader-error (c) - (error 'swank-reader-error - :packet packet :cause c))))) - -(defun read-packet (stream) - (let* ((length (parse-header stream)) - (octets (read-chunk stream length))) - (handler-case (swank/backend:utf8-to-string octets) - (error (c) - (error 'swank-reader-error - :packet (asciify octets) - :cause c))))) - -(defun asciify (packet) - (with-output-to-string (*standard-output*) - (loop for code across (etypecase packet - (string (map 'vector #'char-code packet)) - (vector packet)) - do (cond ((<= code #x7f) (write-char (code-char code))) - (t (format t "\\x~x" code)))))) - -(defun parse-header (stream) - (parse-integer (map 'string #'code-char (read-chunk stream 6)) - :radix 16)) - -(defun read-chunk (stream length) - (let* ((buffer (make-array length :element-type '(unsigned-byte 8))) - (count (read-sequence buffer stream))) - (cond ((= count length) - buffer) - ((zerop count) - (error 'end-of-file :stream stream)) - (t - (error "Short read: length=~D count=~D" length count))))) - -(defparameter *validate-input* nil - "Set to true to require input that more strictly conforms to the protocol") - -(defun read-form (string package) - (with-standard-io-syntax - (let ((*package* package)) - (if *validate-input* - (validating-read string) - (read-from-string string))))) - -(defun validating-read (string) - (with-input-from-string (*standard-input* string) - (simple-read))) - -(defun simple-read () - "Read a form that conforms to the protocol, otherwise signal an error." - (let ((c (read-char))) - (case c - (#\( (loop collect (simple-read) - while (ecase (read-char) - (#\) nil) - (#\space t)))) - (#\' `(quote ,(simple-read))) - (t - (cond - ((digit-char-p c) - (parse-integer - (map 'simple-string #'identity - (loop for ch = c then (read-char nil nil) - while (and ch (digit-char-p ch)) - collect ch - finally (unread-char ch))))) - ((or (member c '(#\: #\")) (alpha-char-p c)) - (unread-char c) - (read-preserving-whitespace)) - (t (error "Invalid character ~:c" c))))))) - - -;;;;; Output - -(defun write-message (message package stream) - (let* ((string (prin1-to-string-for-emacs message package)) - (octets (handler-case (swank/backend:string-to-utf8 string) - (error (c) (encoding-error c string)))) - (length (length octets))) - (write-header stream length) - (write-sequence octets stream) - (finish-output stream))) - -;; FIXME: for now just tell emacs that we and an encoding problem. -(defun encoding-error (condition string) - (swank/backend:string-to-utf8 - (prin1-to-string-for-emacs - `(:reader-error - ,(asciify string) - ,(format nil "Error during string-to-utf8: ~a" - (or (ignore-errors (asciify (princ-to-string condition))) - (asciify (princ-to-string (type-of condition)))))) - (find-package :cl)))) - -(defun write-header (stream length) - (declare (type (unsigned-byte 24) length)) - ;;(format *trace-output* "length: ~d (#x~x)~%" length length) - (loop for c across (format nil "~6,'0x" length) - do (write-byte (char-code c) stream))) - -(defun switch-to-double-floats (x) - (typecase x - (double-float x) - (float (coerce x 'double-float)) - (null x) - (list (loop for (x . cdr) on x - collect (switch-to-double-floats x) into result - until (atom cdr) - finally (return (append result (switch-to-double-floats cdr))))) - (t x))) - -(defun prin1-to-string-for-emacs (object package) - (with-standard-io-syntax - (let ((*print-case* :downcase) - (*print-readably* nil) - (*print-pretty* nil) - (*package* package) - ;; Emacs has only double floats. - (*read-default-float-format* 'double-float)) - (prin1-to-string (switch-to-double-floats object))))) - - -#| TEST/DEMO: - -(defparameter *transport* - (with-output-to-string (out) - (write-message '(:message (hello "world")) *package* out) - (write-message '(:return 5) *package* out) - (write-message '(:emacs-rex NIL) *package* out))) - -*transport* - -(with-input-from-string (in *transport*) - (loop while (peek-char T in NIL) - collect (read-message in *package*))) - -|# diff --git a/elpa/slime-20200414.1444/swank/sbcl.lisp b/elpa/slime-20200414.1444/swank/sbcl.lisp deleted file mode 100644 index 2bc0ec22..00000000 --- a/elpa/slime-20200414.1444/swank/sbcl.lisp +++ /dev/null @@ -1,2037 +0,0 @@ -;;;;; -*- indent-tabs-mode: nil -*- -;;; -;;; swank-sbcl.lisp --- SLIME backend for SBCL. -;;; -;;; Created 2003, Daniel Barlow -;;; -;;; This code has been placed in the Public Domain. All warranties are -;;; disclaimed. - -;;; Requires the SB-INTROSPECT contrib. - -;;; Administrivia - -(defpackage swank/sbcl - (:use cl swank/backend swank/source-path-parser swank/source-file-cache)) - -(in-package swank/sbcl) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (require 'sb-bsd-sockets) - (require 'sb-introspect) - (require 'sb-posix) - (require 'sb-cltl2)) - -(declaim (optimize (debug 2) - (sb-c::insert-step-conditions 0) - (sb-c::insert-debug-catch 0))) - -;;; backwards compability tests - -(eval-when (:compile-toplevel :load-toplevel :execute) - ;; Generate a form suitable for testing for stepper support (0.9.17) - ;; with #+. - (defun sbcl-with-new-stepper-p () - (with-symbol 'enable-stepping 'sb-impl)) - ;; Ditto for weak hash-tables - (defun sbcl-with-weak-hash-tables () - (with-symbol 'hash-table-weakness 'sb-ext)) - ;; And for xref support (1.0.1) - (defun sbcl-with-xref-p () - (with-symbol 'who-calls 'sb-introspect)) - ;; ... for restart-frame support (1.0.2) - (defun sbcl-with-restart-frame () - (with-symbol 'frame-has-debug-tag-p 'sb-debug)) - ;; ... for :setf :inverse info (1.1.17) - (defun sbcl-with-setf-inverse-meta-info () - (boolean-to-feature-expression - ;; going through FIND-SYMBOL since META-INFO was renamed from - ;; TYPE-INFO in 1.2.10. - (let ((sym (find-symbol "META-INFO" "SB-C"))) - (and sym - (fboundp sym) - (funcall sym :setf :inverse ())))))) - -;;; swank-mop - -(import-swank-mop-symbols :sb-mop '(:slot-definition-documentation)) - -(defun swank-mop:slot-definition-documentation (slot) - (sb-pcl::documentation slot t)) - -;; stream support - -(defimplementation gray-package-name () - "SB-GRAY") - -;; Pretty printer calls this, apparently -(defmethod sb-gray:stream-line-length - ((s sb-gray:fundamental-character-input-stream)) - nil) - -;;; Connection info - -(defimplementation lisp-implementation-type-name () - "sbcl") - -;; Declare return type explicitly to shut up STYLE-WARNINGS about -;; %SAP-ALIEN in ENABLE-SIGIO-ON-FD below. -(declaim (ftype (function () (values (signed-byte 32) &optional)) getpid)) -(defimplementation getpid () - (sb-posix:getpid)) - -;;; UTF8 - -(defimplementation string-to-utf8 (string) - (sb-ext:string-to-octets string :external-format '(:utf8 :replacement - #+sb-unicode #\Replacement_Character - #-sb-unicode #\? ))) - -(defimplementation utf8-to-string (octets) - (sb-ext:octets-to-string octets :external-format '(:utf8 :replacement - #+sb-unicode #\Replacement_Character - #-sb-unicode #\? ))) - -;;; TCP Server - -(defimplementation preferred-communication-style () - (cond - ;; fixme: when SBCL/win32 gains better select() support, remove - ;; this. - ((member :sb-thread *features*) :spawn) - ((member :win32 *features*) nil) - (t :fd-handler))) - - -(defun resolve-hostname (host) - "Returns valid IPv4 or IPv6 address for the host." - ;; get all IPv4 and IPv6 addresses as a list - (let* ((host-ents (multiple-value-list (sb-bsd-sockets:get-host-by-name host))) - ;; remove protocols for which we don't have an address - (addresses (remove-if-not #'sb-bsd-sockets:host-ent-address host-ents))) - ;; Return the first one or nil, - ;; but actually, it shouln't return nil, because - ;; get-host-by-name will signal NAME-SERVICE-ERROR condition - ;; if there isn't any address for the host. - (first addresses))) - - -(defimplementation create-socket (host port &key backlog) - (let* ((host-ent (resolve-hostname host)) - (socket (make-instance (cond #+#.(swank/backend:with-symbol 'inet6-socket 'sb-bsd-sockets) - ((eql (sb-bsd-sockets:host-ent-address-type host-ent) 10) - 'sb-bsd-sockets:inet6-socket) - (t - 'sb-bsd-sockets:inet-socket)) - :type :stream - :protocol :tcp))) - (setf (sb-bsd-sockets:sockopt-reuse-address socket) t) - (sb-bsd-sockets:socket-bind socket (sb-bsd-sockets:host-ent-address host-ent) port) - - (sb-bsd-sockets:socket-listen socket (or backlog 5)) - socket)) - -(defimplementation local-port (socket) - (nth-value 1 (sb-bsd-sockets:socket-name socket))) - -(defimplementation close-socket (socket) - (sb-sys:invalidate-descriptor (socket-fd socket)) - (sb-bsd-sockets:socket-close socket)) - -(defimplementation accept-connection (socket &key - external-format - buffering timeout) - (declare (ignore timeout)) - (make-socket-io-stream (accept socket) external-format - (ecase buffering - ((t :full) :full) - ((nil :none) :none) - ((:line) :line)))) - - -;; The SIGIO stuff should probably be removed as it's unlikey that -;; anybody uses it. -#-win32 -(progn - (defimplementation install-sigint-handler (function) - (sb-sys:enable-interrupt sb-unix:sigint - (lambda (&rest args) - (declare (ignore args)) - (sb-sys:invoke-interruption - (lambda () - (sb-sys:with-interrupts - (funcall function))))))) - - (defvar *sigio-handlers* '() - "List of (key . fn) pairs to be called on SIGIO.") - - (defun sigio-handler (signal code scp) - (declare (ignore signal code scp)) - (sb-sys:with-interrupts - (mapc (lambda (handler) - (funcall (the function (cdr handler)))) - *sigio-handlers*))) - - (defun set-sigio-handler () - (sb-sys:enable-interrupt sb-unix:sigio #'sigio-handler)) - - (defun enable-sigio-on-fd (fd) - (sb-posix::fcntl fd sb-posix::f-setfl sb-posix::o-async) - (sb-posix::fcntl fd sb-posix::f-setown (getpid)) - (values)) - - (defimplementation add-sigio-handler (socket fn) - (set-sigio-handler) - (let ((fd (socket-fd socket))) - (enable-sigio-on-fd fd) - (push (cons fd fn) *sigio-handlers*))) - - (defimplementation remove-sigio-handlers (socket) - (let ((fd (socket-fd socket))) - (setf *sigio-handlers* (delete fd *sigio-handlers* :key #'car)) - (sb-sys:invalidate-descriptor fd)) - (close socket))) - - -(defimplementation add-fd-handler (socket fun) - (let ((fd (socket-fd socket)) - (handler nil)) - (labels ((add () - (setq handler (sb-sys:add-fd-handler fd :input #'run))) - (run (fd) - (sb-sys:remove-fd-handler handler) ; prevent recursion - (unwind-protect - (funcall fun) - (when (sb-unix:unix-fstat fd) ; still open? - (add))))) - (add)))) - -(defimplementation remove-fd-handlers (socket) - (sb-sys:invalidate-descriptor (socket-fd socket))) - -(defimplementation socket-fd (socket) - (etypecase socket - (fixnum socket) - (sb-bsd-sockets:socket (sb-bsd-sockets:socket-file-descriptor socket)) - (file-stream (sb-sys:fd-stream-fd socket)))) - -(defimplementation command-line-args () - sb-ext:*posix-argv*) - -(defimplementation dup (fd) - (sb-posix:dup fd)) - -(defvar *wait-for-input-called*) - -(defimplementation wait-for-input (streams &optional timeout) - (assert (member timeout '(nil t))) - (when (boundp '*wait-for-input-called*) - (setq *wait-for-input-called* t)) - (let ((*wait-for-input-called* nil)) - (loop - (let ((ready (remove-if-not #'input-ready-p streams))) - (when ready (return ready))) - (when (check-slime-interrupts) - (return :interrupt)) - (when *wait-for-input-called* - (return :interrupt)) - (when timeout - (return nil)) - (sleep 0.1)))) - -(defun fd-stream-input-buffer-empty-p (stream) - (let ((buffer (sb-impl::fd-stream-ibuf stream))) - (or (not buffer) - (= (sb-impl::buffer-head buffer) - (sb-impl::buffer-tail buffer))))) - -#-win32 -(defun input-ready-p (stream) - (or (not (fd-stream-input-buffer-empty-p stream)) - #+#.(swank/backend:with-symbol 'fd-stream-fd-type 'sb-impl) - (eq :regular (sb-impl::fd-stream-fd-type stream)) - (not (sb-impl::sysread-may-block-p stream)))) - -#+win32 -(progn - (defun input-ready-p (stream) - (or (not (fd-stream-input-buffer-empty-p stream)) - (handle-listen (sockint::fd->handle (sb-impl::fd-stream-fd stream))))) - - (sb-alien:define-alien-routine ("WSACreateEvent" wsa-create-event) - sb-win32:handle) - - (sb-alien:define-alien-routine ("WSACloseEvent" wsa-close-event) - sb-alien:int - (event sb-win32:handle)) - - (defconstant +fd-read+ #.(ash 1 0)) - (defconstant +fd-close+ #.(ash 1 5)) - - (sb-alien:define-alien-routine ("WSAEventSelect" wsa-event-select) - sb-alien:int - (fd sb-alien:int) - (handle sb-win32:handle) - (mask sb-alien:long)) - - (sb-alien:load-shared-object "kernel32.dll") - (sb-alien:define-alien-routine ("WaitForSingleObjectEx" - wait-for-single-object-ex) - sb-alien:int - (event sb-win32:handle) - (milliseconds sb-alien:long) - (alertable sb-alien:int)) - - ;; see SB-WIN32:HANDLE-LISTEN - (defun handle-listen (handle) - (sb-alien:with-alien ((avail sb-win32:dword) - (buf (array char #.sb-win32::input-record-size))) - (unless (zerop (sb-win32:peek-named-pipe handle nil 0 nil - (sb-alien:alien-sap - (sb-alien:addr avail)) - nil)) - (return-from handle-listen (plusp avail))) - - (unless (zerop (sb-win32:peek-console-input handle - (sb-alien:alien-sap buf) - sb-win32::input-record-size - (sb-alien:alien-sap - (sb-alien:addr avail)))) - (return-from handle-listen (plusp avail)))) - - (let ((event (wsa-create-event))) - (wsa-event-select handle event (logior +fd-read+ +fd-close+)) - (let ((val (wait-for-single-object-ex event 0 0))) - (wsa-close-event event) - (unless (= val -1) - (return-from handle-listen (zerop val))))) - - nil) - - ) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix") - (:euc-jp "euc-jp" "euc-jp-unix") - (:us-ascii "us-ascii" "us-ascii-unix"))) - -;; C.f. R.M.Kreuter in <20536.1219412774@progn.net> on sbcl-general, -;; 2008-08-22. -(defvar *physical-pathname-host* (pathname-host (user-homedir-pathname))) - -(defimplementation filename-to-pathname (filename) - (sb-ext:parse-native-namestring filename *physical-pathname-host*)) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -(defimplementation set-default-directory (directory) - (let ((directory (truename (merge-pathnames directory)))) - (sb-posix:chdir directory) - (setf *default-pathname-defaults* directory) - (default-directory))) - -(defun make-socket-io-stream (socket external-format buffering) - (let ((args `(:output t - :input t - :element-type ,(if external-format - 'character - '(unsigned-byte 8)) - :buffering ,buffering - ,@(cond ((and external-format (sb-int:featurep :sb-unicode)) - `(:external-format ,external-format)) - (t '())) - :serve-events ,(eq :fd-handler swank:*communication-style*) - ;; SBCL < 1.0.42.43 doesn't support :SERVE-EVENTS - ;; argument. - :allow-other-keys t))) - (apply #'sb-bsd-sockets:socket-make-stream socket args))) - -(defun accept (socket) - "Like socket-accept, but retry on EAGAIN." - (loop (handler-case - (return (sb-bsd-sockets:socket-accept socket)) - (sb-bsd-sockets:interrupted-error ())))) - - -;;;; Support for SBCL syntax - -;;; SBCL's source code is riddled with #! reader macros. Also symbols -;;; containing `!' have special meaning. We have to work long and -;;; hard to be able to read the source. To deal with #! reader -;;; macros, we use a special readtable. The special symbols are -;;; converted by a condition handler. - -(defun feature-in-list-p (feature list) - (etypecase feature - (symbol (member feature list :test #'eq)) - (cons (flet ((subfeature-in-list-p (subfeature) - (feature-in-list-p subfeature list))) - ;; Don't use ECASE since SBCL also has :host-feature, - ;; don't need to handle it or anything else appearing in - ;; the future or in erronous code. - (case (first feature) - (:or (some #'subfeature-in-list-p (rest feature))) - (:and (every #'subfeature-in-list-p (rest feature))) - (:not (destructuring-bind (e) (cdr feature) - (not (subfeature-in-list-p e))))))))) - -(defun shebang-reader (stream sub-character infix-parameter) - (declare (ignore sub-character)) - (when infix-parameter - (error "illegal read syntax: #~D!" infix-parameter)) - (let ((next-char (read-char stream))) - (unless (find next-char "+-") - (error "illegal read syntax: #!~C" next-char)) - ;; When test is not satisfied - ;; FIXME: clearer if order of NOT-P and (NOT NOT-P) were reversed? then - ;; would become "unless test is satisfied".. - (when (let* ((*package* (find-package "KEYWORD")) - (*read-suppress* nil) - (not-p (char= next-char #\-)) - (feature (read stream))) - (if (feature-in-list-p feature *features*) - not-p - (not not-p))) - ;; Read (and discard) a form from input. - (let ((*read-suppress* t)) - (read stream t nil t)))) - (values)) - -(defvar *shebang-readtable* - (let ((*readtable* (copy-readtable nil))) - (set-dispatch-macro-character #\# #\! - (lambda (s c n) (shebang-reader s c n)) - *readtable*) - *readtable*)) - -(defun shebang-readtable () - *shebang-readtable*) - -(defun sbcl-package-p (package) - (let ((name (package-name package))) - (eql (mismatch "SB-" name) 3))) - -(defun sbcl-source-file-p (filename) - (when filename - (loop for (nil pattern) in (logical-pathname-translations "SYS") - thereis (pathname-match-p filename pattern)))) - -(defun guess-readtable-for-filename (filename) - (if (sbcl-source-file-p filename) - (shebang-readtable) - *readtable*)) - -(defvar *debootstrap-packages* t) - -(defun call-with-debootstrapping (fun) - (handler-bind ((sb-int:bootstrap-package-not-found - #'sb-int:debootstrap-package)) - (funcall fun))) - -(defmacro with-debootstrapping (&body body) - `(call-with-debootstrapping (lambda () ,@body))) - -(defimplementation call-with-syntax-hooks (fn) - (cond ((and *debootstrap-packages* - (sbcl-package-p *package*)) - (with-debootstrapping (funcall fn))) - (t - (funcall fn)))) - -(defimplementation default-readtable-alist () - (let ((readtable (shebang-readtable))) - (loop for p in (remove-if-not #'sbcl-package-p (list-all-packages)) - collect (cons (package-name p) readtable)))) - -;;; Packages - -#+#.(swank/backend:with-symbol 'package-local-nicknames 'sb-ext) -(defimplementation package-local-nicknames (package) - (sb-ext:package-local-nicknames package)) - -;;; Utilities - -#+#.(swank/backend:with-symbol 'function-lambda-list 'sb-introspect) -(defimplementation arglist (fname) - (sb-introspect:function-lambda-list fname)) - -#-#.(swank/backend:with-symbol 'function-lambda-list 'sb-introspect) -(defimplementation arglist (fname) - (sb-introspect:function-arglist fname)) - -(defimplementation function-name (f) - (check-type f function) - (sb-impl::%fun-name f)) - -(defmethod declaration-arglist ((decl-identifier (eql 'optimize))) - (flet ((ensure-list (thing) (if (listp thing) thing (list thing)))) - (let* ((flags (sb-cltl2:declaration-information decl-identifier))) - (if flags - ;; Symbols aren't printed with package qualifiers, but the - ;; FLAGS would have to be fully qualified when used inside a - ;; declaration. So we strip those as long as there's no - ;; better way. (FIXME) - `(&any ,@(remove-if-not - #'(lambda (qualifier) - (find-symbol (symbol-name (first qualifier)) :cl)) - flags :key #'ensure-list)) - (call-next-method))))) - -#+#.(swank/backend:with-symbol 'deftype-lambda-list 'sb-introspect) -(defmethod type-specifier-arglist :around (typespec-operator) - (multiple-value-bind (arglist foundp) - (sb-introspect:deftype-lambda-list typespec-operator) - (if foundp arglist (call-next-method)))) - -(defimplementation type-specifier-p (symbol) - (or (sb-ext:valid-type-specifier-p symbol) - (not (eq (type-specifier-arglist symbol) :not-available)))) - -(defvar *buffer-name* nil) -(defvar *buffer-tmpfile* nil) -(defvar *buffer-offset*) -(defvar *buffer-substring* nil) - -(defvar *previous-compiler-condition* nil - "Used to detect duplicates.") - -(defun handle-notification-condition (condition) - "Handle a condition caused by a compiler warning. -This traps all compiler conditions at a lower-level than using -C:*COMPILER-NOTIFICATION-FUNCTION*. The advantage is that we get to -craft our own error messages, which can omit a lot of redundant -information." - (unless (or (eq condition *previous-compiler-condition*)) - ;; First resignal warnings, so that outer handlers -- which may choose to - ;; muffle this -- get a chance to run. - (when (typep condition 'warning) - (signal condition)) - (setq *previous-compiler-condition* condition) - (signal-compiler-condition (real-condition condition) - (sb-c::find-error-context nil)))) - -(defun signal-compiler-condition (condition context) - (signal 'compiler-condition - :original-condition condition - :severity (etypecase condition - (sb-ext:compiler-note :note) - (sb-c:compiler-error :error) - (reader-error :read-error) - (error :error) - #+#.(swank/backend:with-symbol early-deprecation-warning sb-ext) - (sb-ext::early-deprecation-warning :early-deprecation-warning) - #+#.(swank/backend:with-symbol late-deprecation-warning sb-ext) - (sb-ext::late-deprecation-warning :late-deprecation-warning) - #+#.(swank/backend:with-symbol final-deprecation-warning sb-ext) - (sb-ext::final-deprecation-warning :final-deprecation-warning) - #+#.(swank/backend:with-symbol redefinition-warning - sb-kernel) - (sb-kernel:redefinition-warning - :redefinition) - (style-warning :style-warning) - (warning :warning)) - :references (condition-references condition) - :message (brief-compiler-message-for-emacs condition) - :source-context (compiler-error-context context) - :location (compiler-note-location condition context))) - -(defun real-condition (condition) - "Return the encapsulated condition or CONDITION itself." - (typecase condition - (sb-int:encapsulated-condition (sb-int:encapsulated-condition condition)) - (t condition))) - -(defun condition-references (condition) - (if (typep condition 'sb-int:reference-condition) - (externalize-reference - (sb-int:reference-condition-references condition)))) - -(defun compiler-note-location (condition context) - (flet ((bailout () - (return-from compiler-note-location - (make-error-location "No error location available")))) - (cond (context - (locate-compiler-note - (sb-c::compiler-error-context-file-name context) - (compiler-source-path context) - (sb-c::compiler-error-context-original-source context))) - ((typep condition 'reader-error) - (let* ((stream (stream-error-stream condition)) - ;; If STREAM is, for example, a STRING-INPUT-STREAM, - ;; an error will be signaled since PATHNAME only - ;; accepts a "stream associated with a file" which - ;; is a complicated predicate and hard to test - ;; portably. - (file (ignore-errors (pathname stream)))) - (unless (and file (open-stream-p stream)) - (bailout)) - (if (compiling-from-buffer-p file) - ;; The stream position for e.g. "comma not inside - ;; backquote" is at the character following the - ;; comma, :offset is 0-based, hence the 1-. - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-offset* - (1- (file-position stream)))) - (progn - (assert (compiling-from-file-p file)) - ;; No 1- because :position is 1-based. - (make-location (list :file (namestring file)) - (list :position (file-position stream))))))) - (t (bailout))))) - -(defun compiling-from-buffer-p (filename) - (and *buffer-name* - ;; The following is to trigger COMPILING-FROM-GENERATED-CODE-P - ;; in LOCATE-COMPILER-NOTE, and allows handling nested - ;; compilation from eg. hitting C-C on (eval-when ... (require ..))). - ;; - ;; PROBE-FILE to handle tempfile directory being a symlink. - (pathnamep filename) - (let ((true1 (probe-file filename)) - (true2 (probe-file *buffer-tmpfile*))) - (and true1 (equal true1 true2))))) - -(defun compiling-from-file-p (filename) - (and (pathnamep filename) - (or (null *buffer-name*) - (null *buffer-tmpfile*) - (let ((true1 (probe-file filename)) - (true2 (probe-file *buffer-tmpfile*))) - (not (and true1 (equal true1 true2))))))) - -(defun compiling-from-generated-code-p (filename source) - (and (eq filename :lisp) (stringp source))) - -(defun locate-compiler-note (file source-path source) - (cond ((compiling-from-buffer-p file) - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-offset* - (source-path-string-position - source-path *buffer-substring*)))) - ((compiling-from-file-p file) - (let ((position (source-path-file-position source-path file))) - (make-location (list :file (namestring file)) - (list :position (and position - (1+ position)))))) - ((compiling-from-generated-code-p file source) - (make-location (list :source-form source) - (list :position 1))) - (t - (error "unhandled case in compiler note ~S ~S ~S" - file source-path source)))) - -(defun brief-compiler-message-for-emacs (condition) - "Briefly describe a compiler error for Emacs. -When Emacs presents the message it already has the source popped up -and the source form highlighted. This makes much of the information in -the error-context redundant." - (let ((sb-int:*print-condition-references* nil)) - (princ-to-string condition))) - -(defun compiler-error-context (error-context) - "Describe a compiler error for Emacs including context information." - (declare (type (or sb-c::compiler-error-context null) error-context)) - (multiple-value-bind (enclosing source) - (if error-context - (values (sb-c::compiler-error-context-enclosing-source error-context) - (sb-c::compiler-error-context-source error-context))) - (and (or enclosing source) - (format nil "~@[--> ~{~<~%--> ~1:;~A~> ~}~%~]~@[~{==>~%~A~%~}~]" - enclosing source)))) - -(defun compiler-source-path (context) - "Return the source-path for the current compiler error. -Returns NIL if this cannot be determined by examining internal -compiler state." - (cond ((sb-c::node-p context) - (reverse - (sb-c::source-path-original-source - (sb-c::node-source-path context)))) - ((sb-c::compiler-error-context-p context) - (reverse - (sb-c::compiler-error-context-original-source-path context))))) - -(defimplementation call-with-compilation-hooks (function) - (declare (type function function)) - (handler-bind - ;; N.B. Even though these handlers are called HANDLE-FOO they - ;; actually decline, i.e. the signalling of the original - ;; condition continues upward. - ((sb-c:fatal-compiler-error #'handle-notification-condition) - (sb-c:compiler-error #'handle-notification-condition) - (sb-ext:compiler-note #'handle-notification-condition) - (error #'handle-notification-condition) - (warning #'handle-notification-condition)) - (funcall function))) - -;;; HACK: SBCL 1.2.12 shipped with a bug where -;;; SB-EXT:RESTRICT-COMPILER-POLICY would signal an error when there -;;; were no policy restrictions in place. This workaround ensures the -;;; existence of at least one dummy restriction. -(handler-case (sb-ext:restrict-compiler-policy) - (error () (sb-ext:restrict-compiler-policy 'debug))) - -(defun compiler-policy (qualities) - "Return compiler policy qualities present in the QUALITIES alist. -QUALITIES is an alist with (quality . value)" - #+#.(swank/backend:with-symbol 'restrict-compiler-policy 'sb-ext) - (loop with policy = (sb-ext:restrict-compiler-policy) - for (quality) in qualities - collect (cons quality - (or (cdr (assoc quality policy)) - 0)))) - -(defun (setf compiler-policy) (policy) - (declare (ignorable policy)) - #+#.(swank/backend:with-symbol 'restrict-compiler-policy 'sb-ext) - (loop for (qual . value) in policy - do (sb-ext:restrict-compiler-policy qual value))) - -(defmacro with-compiler-policy (policy &body body) - (let ((current-policy (gensym))) - `(let ((,current-policy (compiler-policy ,policy))) - (setf (compiler-policy) ,policy) - (unwind-protect (progn ,@body) - (setf (compiler-policy) ,current-policy))))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (multiple-value-bind (output-file warnings-p failure-p) - (with-compiler-policy policy - (with-compilation-hooks () - (compile-file input-file :output-file output-file - :external-format external-format))) - (values output-file warnings-p - (or failure-p - (when load-p - ;; Cache the latest source file for definition-finding. - (source-cache-get input-file - (file-write-date input-file)) - (not (load output-file))))))) - -;;;; compile-string - -;;; We copy the string to a temporary file in order to get adequate -;;; semantics for :COMPILE-TOPLEVEL and :LOAD-TOPLEVEL EVAL-WHEN forms -;;; which the previous approach using -;;; (compile nil `(lambda () ,(read-from-string string))) -;;; did not provide. - -(locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) - -(sb-alien:define-alien-routine (#-win32 "tempnam" #+win32 "_tempnam" tempnam) - sb-alien:c-string - (dir sb-alien:c-string) - (prefix sb-alien:c-string))) - -(defun temp-file-name () - "Return a temporary file name to compile strings into." - (tempnam nil "slime")) - -(defvar *trap-load-time-warnings* t) - -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore line column)) - (let ((*buffer-name* buffer) - (*buffer-offset* position) - (*buffer-substring* string) - (*buffer-tmpfile* (temp-file-name))) - (labels ((load-it (filename) - (cond (*trap-load-time-warnings* - (with-compilation-hooks () (load filename))) - (t (load filename)))) - (cf () - (with-compiler-policy policy - (with-compilation-unit - (:source-plist (list :emacs-buffer buffer - :emacs-filename filename - :emacs-package (package-name *package*) - :emacs-position position - :emacs-string string) - :source-namestring filename - :allow-other-keys t) - (compile-file *buffer-tmpfile* :external-format :utf-8))))) - (with-open-file (s *buffer-tmpfile* :direction :output :if-exists :error - :external-format :utf-8) - (write-string string s)) - (unwind-protect - (multiple-value-bind (output-file warningsp failurep) - (with-compilation-hooks () (cf)) - (declare (ignore warningsp)) - (when output-file - (load-it output-file)) - (not failurep)) - (ignore-errors - (delete-file *buffer-tmpfile*) - (delete-file (compile-file-pathname *buffer-tmpfile*))))))) - -;;;; Definitions - -(defparameter *definition-types* - '(:variable defvar - :constant defconstant - :type deftype - :symbol-macro define-symbol-macro - :macro defmacro - :compiler-macro define-compiler-macro - :function defun - :generic-function defgeneric - :method defmethod - :setf-expander define-setf-expander - :structure defstruct - :condition define-condition - :class defclass - :method-combination define-method-combination - :package defpackage - :transform :deftransform - :optimizer :defoptimizer - :vop :define-vop - :source-transform :define-source-transform - :ir1-convert :def-ir1-translator - :declaration declaim - :alien-type :define-alien-type) - "Map SB-INTROSPECT definition type names to Slime-friendly forms") - -(defun definition-specifier (type) - "Return a pretty specifier for NAME representing a definition of type TYPE." - (getf *definition-types* type)) - -(defun make-dspec (type name source-location) - (list* (definition-specifier type) - name - (sb-introspect::definition-source-description source-location))) - -(defimplementation find-definitions (name) - (loop for type in *definition-types* by #'cddr - for defsrcs = (sb-introspect:find-definition-sources-by-name name type) - for filtered-defsrcs = (if (eq type :generic-function) - (remove :invalid defsrcs - :key #'categorize-definition-source) - defsrcs) - append (loop for defsrc in filtered-defsrcs collect - (list (make-dspec type name defsrc) - (converting-errors-to-error-location - (definition-source-for-emacs defsrc - type name)))))) - -(defimplementation find-source-location (obj) - (flet ((general-type-of (obj) - (typecase obj - (method :method) - (generic-function :generic-function) - (function :function) - (structure-class :structure-class) - (class :class) - (method-combination :method-combination) - (package :package) - (condition :condition) - (structure-object :structure-object) - (standard-object :standard-object) - (t :thing))) - (to-string (obj) - (typecase obj - ;; Packages are possibly named entities. - (package (princ-to-string obj)) - ((or structure-object standard-object condition) - (with-output-to-string (s) - (print-unreadable-object (obj s :type t :identity t)))) - (t (princ-to-string obj))))) - (converting-errors-to-error-location - (let ((defsrc (sb-introspect:find-definition-source obj))) - (definition-source-for-emacs defsrc - (general-type-of obj) - (to-string obj)))))) - -(defmacro with-definition-source ((&rest names) obj &body body) - "Like with-slots but works only for structs." - (flet ((reader (slot) - ;; Use read-from-string instead of intern so that - ;; conc-name can be a string such as ext:struct- and not - ;; cause errors and not force interning ext::struct- - (read-from-string - (concatenate 'string "sb-introspect:definition-source-" - (string slot))))) - (let ((tmp (gensym "OO-"))) - ` (let ((,tmp ,obj)) - (symbol-macrolet - ,(loop for name in names collect - (typecase name - (symbol `(,name (,(reader name) ,tmp))) - (cons `(,(first name) (,(reader (second name)) ,tmp))) - (t (error "Malformed syntax in WITH-STRUCT: ~A" name)))) - ,@body))))) - -(defun categorize-definition-source (definition-source) - (with-definition-source (pathname form-path character-offset plist) - definition-source - (let ((file-p (and pathname (probe-file pathname) - (or form-path character-offset)))) - (cond ((and (getf plist :emacs-buffer) file-p) :buffer-and-file) - ((getf plist :emacs-buffer) :buffer) - (file-p :file) - (pathname :file-without-position) - (t :invalid))))) - -#+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) -(defun form-number-position (definition-source stream) - (let* ((tlf-number (car (sb-introspect:definition-source-form-path definition-source))) - (form-number (sb-introspect:definition-source-form-number definition-source))) - (multiple-value-bind (tlf pos-map) (read-source-form tlf-number stream) - (let* ((path-table (sb-di::form-number-translations tlf 0)) - (path (cond ((<= (length path-table) form-number) - (warn "inconsistent form-number-translations") - (list 0)) - (t - (reverse (cdr (aref path-table form-number))))))) - (source-path-source-position path tlf pos-map))))) - -#+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) -(defun file-form-number-position (definition-source) - (let* ((code-date (sb-introspect:definition-source-file-write-date definition-source)) - (filename (sb-introspect:definition-source-pathname definition-source)) - (*readtable* (guess-readtable-for-filename filename)) - (source-code (get-source-code filename code-date))) - (with-debootstrapping - (with-input-from-string (s source-code) - (form-number-position definition-source s))))) - -#+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) -(defun string-form-number-position (definition-source string) - (with-input-from-string (s string) - (form-number-position definition-source s))) - -(defun definition-source-buffer-location (definition-source) - (with-definition-source (form-path character-offset plist) definition-source - (destructuring-bind (&key emacs-buffer emacs-position emacs-directory - emacs-string &allow-other-keys) - plist - (let ((*readtable* (guess-readtable-for-filename emacs-directory)) - start - end) - (with-debootstrapping - (or - (and form-path - (or - #+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) - (setf (values start end) - (and (sb-introspect:definition-source-form-number definition-source) - (string-form-number-position definition-source emacs-string))) - (setf (values start end) - (source-path-string-position form-path emacs-string)))) - (setf start character-offset - end most-positive-fixnum))) - (make-location - `(:buffer ,emacs-buffer) - `(:offset ,emacs-position ,start) - `(:snippet - ,(subseq emacs-string - start - (min end (+ start *source-snippet-size*))))))))) - -(defun definition-source-file-location (definition-source) - (with-definition-source (pathname form-path character-offset plist - file-write-date) definition-source - (let* ((namestring (namestring (translate-logical-pathname pathname))) - (pos (or (and form-path - (or - #+#.(swank/backend:with-symbol 'definition-source-form-number 'sb-introspect) - (and (sb-introspect:definition-source-form-number definition-source) - (ignore-errors (file-form-number-position definition-source))) - (ignore-errors - (source-file-position namestring file-write-date - form-path)))) - character-offset)) - (snippet (source-hint-snippet namestring file-write-date pos))) - (make-location `(:file ,namestring) - ;; /file positions/ in Common Lisp start from - ;; 0, buffer positions in Emacs start from 1. - `(:position ,(1+ pos)) - `(:snippet ,snippet))))) - -(defun definition-source-buffer-and-file-location (definition-source) - (let ((buffer (definition-source-buffer-location definition-source))) - (make-location (list :buffer-and-file - (cadr (location-buffer buffer)) - (namestring (sb-introspect:definition-source-pathname - definition-source))) - (location-position buffer) - (location-hints buffer)))) - -(defun definition-source-for-emacs (definition-source type name) - (with-definition-source (pathname form-path character-offset plist - file-write-date) - definition-source - (ecase (categorize-definition-source definition-source) - (:buffer-and-file - (definition-source-buffer-and-file-location definition-source)) - (:buffer - (definition-source-buffer-location definition-source)) - (:file - (definition-source-file-location definition-source)) - (:file-without-position - (make-location `(:file ,(namestring - (translate-logical-pathname pathname))) - '(:position 1) - (when (eql type :function) - `(:snippet ,(format nil "(defun ~a " - (symbol-name name)))))) - (:invalid - (error "DEFINITION-SOURCE of ~(~A~) ~A did not contain ~ - meaningful information." - type name))))) - -(defun source-file-position (filename write-date form-path) - (let ((source (get-source-code filename write-date)) - (*readtable* (guess-readtable-for-filename filename))) - (with-debootstrapping - (source-path-string-position form-path source)))) - -(defun source-hint-snippet (filename write-date position) - (read-snippet-from-string (get-source-code filename write-date) position)) - -(defun function-source-location (function &optional name) - (declare (type function function)) - (definition-source-for-emacs (sb-introspect:find-definition-source function) - :function - (or name (function-name function)))) - -(defun setf-expander (symbol) - (or - #+#.(swank/sbcl::sbcl-with-setf-inverse-meta-info) - (sb-int:info :setf :inverse symbol) - (sb-int:info :setf :expander symbol))) - -(defimplementation describe-symbol-for-emacs (symbol) - "Return a plist describing SYMBOL. -Return NIL if the symbol is unbound." - (let ((result '())) - (flet ((doc (kind) - (or (documentation symbol kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (multiple-value-bind (kind recorded-p) - (sb-int:info :variable :kind symbol) - (declare (ignore kind)) - (if (or (boundp symbol) recorded-p) - (doc 'variable)))) - (when (fboundp symbol) - (maybe-push - (cond ((macro-function symbol) :macro) - ((special-operator-p symbol) :special-operator) - ((typep (fdefinition symbol) 'generic-function) - :generic-function) - (t :function)) - (doc 'function))) - (maybe-push - :setf (and (setf-expander symbol) - (doc 'setf))) - (maybe-push - :type (if (sb-int:info :type :kind symbol) - (doc 'type))) - result))) - -(defimplementation describe-definition (symbol type) - (case type - (:variable - (describe symbol)) - (:function - (describe (symbol-function symbol))) - (:setf - (describe (setf-expander symbol))) - (:class - (describe (find-class symbol))) - (:type - (describe (sb-kernel:values-specifier-type symbol))))) - -#+#.(swank/sbcl::sbcl-with-xref-p) -(progn - (defmacro defxref (name &optional fn-name) - `(defimplementation ,name (what) - (sanitize-xrefs - (mapcar #'source-location-for-xref-data - (,(find-symbol (symbol-name (if fn-name - fn-name - name)) - "SB-INTROSPECT") - what))))) - (defxref who-calls) - (defxref who-binds) - (defxref who-sets) - (defxref who-references) - (defxref who-macroexpands) - #+#.(swank/backend:with-symbol 'who-specializes-directly 'sb-introspect) - (defxref who-specializes who-specializes-directly)) - -(defun source-location-for-xref-data (xref-data) - (destructuring-bind (name . defsrc) xref-data - (list name (converting-errors-to-error-location - (definition-source-for-emacs defsrc 'function name))))) - -(defimplementation list-callers (symbol) - (let ((fn (fdefinition symbol))) - (sanitize-xrefs - (mapcar #'function-dspec (sb-introspect:find-function-callers fn))))) - -(defimplementation list-callees (symbol) - (let ((fn (fdefinition symbol))) - (sanitize-xrefs - (mapcar #'function-dspec (sb-introspect:find-function-callees fn))))) - -(defun sanitize-xrefs (xrefs) - (remove-duplicates - (remove-if (lambda (f) - (member f (ignored-xref-function-names))) - (loop for entry in xrefs - for name = (car entry) - collect (if (and (consp name) - (member (car name) - '(sb-pcl::fast-method - sb-pcl::slow-method - sb-pcl::method))) - (cons (cons 'defmethod (cdr name)) - (cdr entry)) - entry)) - :key #'car) - :test (lambda (a b) - (and (eq (first a) (first b)) - (equal (second a) (second b)))))) - -(defun ignored-xref-function-names () - #-#.(swank/sbcl::sbcl-with-new-stepper-p) - '(nil sb-c::step-form sb-c::step-values) - #+#.(swank/sbcl::sbcl-with-new-stepper-p) - '(nil)) - -(defun function-dspec (fn) - "Describe where the function FN was defined. -Return a list of the form (NAME LOCATION)." - (let ((name (function-name fn))) - (list name (converting-errors-to-error-location - (function-source-location fn name))))) - -;;; macroexpansion - -(defimplementation macroexpand-all (form &optional env) - (sb-cltl2:macroexpand-all form env)) - -(defimplementation collect-macro-forms (form &optional environment) - (let ((macro-forms '()) - (compiler-macro-forms '()) - (function-quoted-forms '())) - (sb-walker:walk-form - form environment - (lambda (form context environment) - (declare (ignore context)) - (when (and (consp form) - (symbolp (car form))) - (cond ((eq (car form) 'function) - (push (cadr form) function-quoted-forms)) - ((member form function-quoted-forms) - nil) - ((macro-function (car form) environment) - (push form macro-forms)) - ((not (eq form (compiler-macroexpand-1 form environment))) - (push form compiler-macro-forms)))) - form)) - (values macro-forms compiler-macro-forms))) - - -;;; Debugging - -;;; Notice that SB-EXT:*INVOKE-DEBUGGER-HOOK* is slightly stronger -;;; than just a hook into BREAK. In particular, it'll make -;;; (LET ((*DEBUGGER-HOOK* NIL)) ..error..) drop into SLDB rather -;;; than the native debugger. That should probably be considered a -;;; feature. - -(defun make-invoke-debugger-hook (hook) - (when hook - #'(sb-int:named-lambda swank-invoke-debugger-hook - (condition old-hook) - (if *debugger-hook* - nil ; decline, *DEBUGGER-HOOK* will be tried next. - (funcall hook condition old-hook))))) - -(defun set-break-hook (hook) - (setq sb-ext:*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - -(defun call-with-break-hook (hook continuation) - (let ((sb-ext:*invoke-debugger-hook* (make-invoke-debugger-hook hook))) - (funcall continuation))) - -(defimplementation install-debugger-globally (function) - (setq *debugger-hook* function) - (set-break-hook function)) - -(defimplementation condition-extras (condition) - (cond #+#.(swank/sbcl::sbcl-with-new-stepper-p) - ((typep condition 'sb-impl::step-form-condition) - `((:show-frame-source 0))) - ((typep condition 'sb-int:reference-condition) - (let ((refs (sb-int:reference-condition-references condition))) - (if refs - `((:references ,(externalize-reference refs)))))))) - -(defun externalize-reference (ref) - (etypecase ref - (null nil) - (cons (cons (externalize-reference (car ref)) - (externalize-reference (cdr ref)))) - ((or string number) ref) - (symbol - (cond ((eq (symbol-package ref) (symbol-package :test)) - ref) - (t (symbol-name ref)))))) - -(defvar *sldb-stack-top*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (declare (type function debugger-loop-fn)) - (let ((*sldb-stack-top* - (if (and (not *debug-swank-backend*) - sb-debug:*stack-top-hint*) - #+#.(swank/backend:with-symbol 'resolve-stack-top-hint 'sb-debug) - (sb-debug::resolve-stack-top-hint) - #-#.(swank/backend:with-symbol 'resolve-stack-top-hint 'sb-debug) - sb-debug:*stack-top-hint* - (sb-di:top-frame))) - (sb-debug:*stack-top-hint* nil)) - (handler-bind ((sb-di:debug-condition - (lambda (condition) - (signal 'sldb-condition - :original-condition condition)))) - (funcall debugger-loop-fn)))) - -#+#.(swank/sbcl::sbcl-with-new-stepper-p) -(progn - (defimplementation activate-stepping (frame) - (declare (ignore frame)) - (sb-impl::enable-stepping)) - (defimplementation sldb-stepper-condition-p (condition) - (typep condition 'sb-ext:step-form-condition)) - (defimplementation sldb-step-into () - (invoke-restart 'sb-ext:step-into)) - (defimplementation sldb-step-next () - (invoke-restart 'sb-ext:step-next)) - (defimplementation sldb-step-out () - (invoke-restart 'sb-ext:step-out))) - -(defimplementation call-with-debugger-hook (hook fun) - (let ((*debugger-hook* hook) - #+#.(swank/sbcl::sbcl-with-new-stepper-p) - (sb-ext:*stepper-hook* - (lambda (condition) - (typecase condition - (sb-ext:step-form-condition - (let ((sb-debug:*stack-top-hint* (sb-di::find-stepped-frame))) - (sb-impl::invoke-debugger condition))))))) - (handler-bind (#+#.(swank/sbcl::sbcl-with-new-stepper-p) - (sb-ext:step-condition #'sb-impl::invoke-stepper)) - (call-with-break-hook hook fun)))) - -(defun nth-frame (index) - (do ((frame *sldb-stack-top* (sb-di:frame-down frame)) - (i index (1- i))) - ((zerop i) frame))) - -(defimplementation compute-backtrace (start end) - "Return a list of frames starting with frame number START and -continuing to frame number END or, if END is nil, the last frame on the -stack." - (let ((end (or end most-positive-fixnum))) - (loop for f = (nth-frame start) then (sb-di:frame-down f) - for i from start below end - while f collect f))) - -(defimplementation print-frame (frame stream) - (sb-debug::print-frame-call frame stream - :allow-other-keys t - :emergency-best-effort t)) - -(defimplementation frame-restartable-p (frame) - #+#.(swank/sbcl::sbcl-with-restart-frame) - (not (null (sb-debug:frame-has-debug-tag-p frame)))) - -(defimplementation frame-call (frame-number) - (multiple-value-bind (name args) - (sb-debug::frame-call (nth-frame frame-number)) - (with-output-to-string (stream) - (locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) - (pprint-logical-block (stream nil :prefix "(" :suffix ")") - (locally (declare (sb-ext:unmuffle-conditions sb-ext:compiler-note)) - (let ((*print-length* nil) - (*print-level* nil)) - (prin1 (sb-debug::ensure-printable-object name) stream)) - (let ((args (sb-debug::ensure-printable-object args))) - (if (listp args) - (format stream "~{ ~_~S~}" args) - (format stream " ~S" args))))))))) - -;;;; Code-location -> source-location translation - -;;; If debug-block info is avaibale, we determine the file position of -;;; the source-path for a code-location. If the code was compiled -;;; with C-c C-c, we have to search the position in the source string. -;;; If there's no debug-block info, we return the (less precise) -;;; source-location of the corresponding function. - -(defun code-location-source-location (code-location) - (let* ((dsource (sb-di:code-location-debug-source code-location)) - (plist (sb-c::debug-source-plist dsource)) - (package (getf plist :emacs-package)) - (*package* (or (and package - (find-package package)) - *package*))) - (if (getf plist :emacs-buffer) - (emacs-buffer-source-location code-location plist) - #+#.(swank/backend:with-symbol 'debug-source-from 'sb-di) - (ecase (sb-di:debug-source-from dsource) - (:file (file-source-location code-location)) - (:lisp (lisp-source-location code-location))) - #-#.(swank/backend:with-symbol 'debug-source-from 'sb-di) - (if (sb-di:debug-source-namestring dsource) - (file-source-location code-location) - (lisp-source-location code-location))))) - -;;; FIXME: The naming policy of source-location functions is a bit -;;; fuzzy: we have FUNCTION-SOURCE-LOCATION which returns the -;;; source-location for a function, and we also have FILE-SOURCE-LOCATION &co -;;; which returns the source location for a _code-location_. -;;; -;;; Maybe these should be named code-location-file-source-location, -;;; etc, turned into generic functions, or something. In the very -;;; least the names should indicate the main entry point vs. helper -;;; status. - -(defun file-source-location (code-location) - (if (code-location-has-debug-block-info-p code-location) - (source-file-source-location code-location) - (fallback-source-location code-location))) - -(defun fallback-source-location (code-location) - (let ((fun (code-location-debug-fun-fun code-location))) - (cond (fun (function-source-location fun)) - (t (error "Cannot find source location for: ~A " code-location))))) - -(defun lisp-source-location (code-location) - (let ((source (prin1-to-string - (sb-debug::code-location-source-form code-location 100))) - (condition swank:*swank-debugger-condition*)) - (if (and (typep condition 'sb-impl::step-form-condition) - (search "SB-IMPL::WITH-STEPPING-ENABLED" source - :test #'char-equal) - (search "SB-IMPL::STEP-FINISHED" source :test #'char-equal)) - ;; The initial form is utterly uninteresting -- and almost - ;; certainly right there in the REPL. - (make-error-location "Stepping...") - (make-location `(:source-form ,source) '(:position 1))))) - -(defun emacs-buffer-source-location (code-location plist) - (if (code-location-has-debug-block-info-p code-location) - (destructuring-bind (&key emacs-buffer emacs-position emacs-string - &allow-other-keys) - plist - (let* ((pos (string-source-position code-location emacs-string)) - (snipped (read-snippet-from-string emacs-string pos))) - (make-location `(:buffer ,emacs-buffer) - `(:offset ,emacs-position ,pos) - `(:snippet ,snipped)))) - (fallback-source-location code-location))) - -(defun source-file-source-location (code-location) - (let* ((code-date (code-location-debug-source-created code-location)) - (filename (code-location-debug-source-name code-location)) - (*readtable* (guess-readtable-for-filename filename)) - (source-code (get-source-code filename code-date))) - (with-debootstrapping - (with-input-from-string (s source-code) - (let* ((pos (stream-source-position code-location s)) - (snippet (read-snippet s pos))) - (make-location `(:file ,filename) - `(:position ,pos) - `(:snippet ,snippet))))))) - -(defun code-location-debug-source-name (code-location) - (namestring (truename (#.(swank/backend:choose-symbol - 'sb-c 'debug-source-name - 'sb-c 'debug-source-namestring) - (sb-di::code-location-debug-source code-location))))) - -(defun code-location-debug-source-created (code-location) - (sb-c::debug-source-created - (sb-di::code-location-debug-source code-location))) - -(defun code-location-debug-fun-fun (code-location) - (sb-di:debug-fun-fun (sb-di:code-location-debug-fun code-location))) - -(defun code-location-has-debug-block-info-p (code-location) - (handler-case - (progn (sb-di:code-location-debug-block code-location) - t) - (sb-di:no-debug-blocks () nil))) - -(defun stream-source-position (code-location stream) - (let* ((cloc (sb-debug::maybe-block-start-location code-location)) - (tlf-number (sb-di::code-location-toplevel-form-offset cloc)) - (form-number (sb-di::code-location-form-number cloc))) - (multiple-value-bind (tlf pos-map) (read-source-form tlf-number stream) - (let* ((path-table (sb-di::form-number-translations tlf 0)) - (path (cond ((<= (length path-table) form-number) - (warn "inconsistent form-number-translations") - (list 0)) - (t - (reverse (cdr (aref path-table form-number))))))) - (source-path-source-position path tlf pos-map))))) - -(defun string-source-position (code-location string) - (with-input-from-string (s string) - (stream-source-position code-location s))) - -;;; source-path-file-position and friends are in source-path-parser - -(defimplementation frame-source-location (index) - (converting-errors-to-error-location - (code-location-source-location - (sb-di:frame-code-location (nth-frame index))))) - -(defvar *keep-non-valid-locals* nil) - -(defun frame-debug-vars (frame) - "Return a vector of debug-variables in frame." - (let* ((all-vars (sb-di::debug-fun-debug-vars (sb-di:frame-debug-fun frame))) - (loc (sb-di:frame-code-location frame)) - (vars (if *keep-non-valid-locals* - all-vars - (remove-if (lambda (var) - (ecase (sb-di:debug-var-validity var loc) - (:valid nil) - ((:invalid :unknown) t))) - all-vars))) - more-context - more-count) - (values (loop for v across vars - unless - (case (debug-var-info v) - (:more-context - (setf more-context (debug-var-value v frame loc)) - t) - (:more-count - (setf more-count (debug-var-value v frame loc)) - t)) - collect v) - more-context more-count))) - -(defun debug-var-value (var frame location) - (ecase (sb-di:debug-var-validity var location) - (:valid (sb-di:debug-var-value var frame)) - ((:invalid :unknown) ':))) - -(defun debug-var-info (var) - ;; Introduced by SBCL 1.0.49.76. - (let ((s (find-symbol "DEBUG-VAR-INFO" :sb-di))) - (when (and s (fboundp s)) - (funcall s var)))) - -(defimplementation frame-locals (index) - (let* ((frame (nth-frame index)) - (loc (sb-di:frame-code-location frame))) - (multiple-value-bind (vars more-context more-count) - (frame-debug-vars frame) - (let ((locals - (loop for v in vars - collect - (list :name (sb-di:debug-var-symbol v) - :id (sb-di:debug-var-id v) - :value (debug-var-value v frame loc))))) - (if (and more-context more-count) - (append locals - (list - (list :name - ;; Since SBCL 1.0.49.76 PREPROCESS-FOR-EVAL understands SB-DEBUG::MORE - ;; specially. - (or (find-symbol "MORE" :sb-debug) 'more) - :id 0 - :value (multiple-value-list - (sb-c:%more-arg-values - more-context - 0 more-count))))) - locals))))) - -(defimplementation frame-var-value (frame var) - (let ((frame (nth-frame frame))) - (multiple-value-bind (vars more-context more-count) - (frame-debug-vars frame) - (let* ((loc (sb-di:frame-code-location frame)) - (dvar (if (= var (length vars)) - ;; If VAR is out of bounds, it must be the fake var - ;; we made up for &MORE. - (return-from frame-var-value - (multiple-value-list (sb-c:%more-arg-values - more-context - 0 more-count))) - (nth var vars)))) - (debug-var-value dvar frame loc))))) - -(defimplementation frame-catch-tags (index) - (mapcar #'car (sb-di:frame-catches (nth-frame index)))) - -(defimplementation eval-in-frame (form index) - (let ((frame (nth-frame index))) - (funcall (the function - (sb-di:preprocess-for-eval form - (sb-di:frame-code-location frame))) - frame))) - -(defimplementation frame-package (frame-number) - (let* ((frame (nth-frame frame-number)) - (fun (sb-di:debug-fun-fun (sb-di:frame-debug-fun frame)))) - (when fun - (let ((name (function-name fun))) - (typecase name - (null nil) - (symbol (symbol-package name)) - ((cons (eql setf) (cons symbol)) (symbol-package (cadr name)))))))) - -#+#.(swank/sbcl::sbcl-with-restart-frame) -(progn - (defimplementation return-from-frame (index form) - (let* ((frame (nth-frame index))) - (cond ((sb-debug:frame-has-debug-tag-p frame) - (let ((values (multiple-value-list (eval-in-frame form index)))) - (sb-debug:unwind-to-frame-and-call frame - (lambda () - (values-list values))))) - (t (format nil "Cannot return from frame: ~S" frame))))) - - (defimplementation restart-frame (index) - (let ((frame (nth-frame index))) - (when (sb-debug:frame-has-debug-tag-p frame) - (multiple-value-bind (fname args) (sb-debug::frame-call frame) - (multiple-value-bind (fun arglist) - (if (and (sb-int:legal-fun-name-p fname) (fboundp fname)) - (values (fdefinition fname) args) - (values (sb-di:debug-fun-fun (sb-di:frame-debug-fun frame)) - (sb-debug::frame-args-as-list frame))) - (when (functionp fun) - (sb-debug:unwind-to-frame-and-call - frame - (lambda () - ;; Ensure TCO. - (declare (optimize (debug 0))) - (apply fun arglist))))))) - (format nil "Cannot restart frame: ~S" frame)))) - -;; FIXME: this implementation doesn't unwind the stack before -;; re-invoking the function, but it's better than no implementation at -;; all. -#-#.(swank/sbcl::sbcl-with-restart-frame) -(progn - (defun sb-debug-catch-tag-p (tag) - (and (symbolp tag) - (not (symbol-package tag)) - (string= tag :sb-debug-catch-tag))) - - (defimplementation return-from-frame (index form) - (let* ((frame (nth-frame index)) - (probe (assoc-if #'sb-debug-catch-tag-p - (sb-di::frame-catches frame)))) - (cond (probe (throw (car probe) (eval-in-frame form index))) - (t (format nil "Cannot return from frame: ~S" frame))))) - - (defimplementation restart-frame (index) - (let ((frame (nth-frame index))) - (return-from-frame index (sb-debug::frame-call-as-list frame))))) - -;;;;; reference-conditions - -(defimplementation print-condition (condition stream) - (let ((sb-int:*print-condition-references* nil)) - (princ condition stream))) - - -;;;; Profiling - -(defimplementation profile (fname) - (when fname (eval `(sb-profile:profile ,fname)))) - -(defimplementation unprofile (fname) - (when fname (eval `(sb-profile:unprofile ,fname)))) - -(defimplementation unprofile-all () - (sb-profile:unprofile) - "All functions unprofiled.") - -(defimplementation profile-report () - (sb-profile:report)) - -(defimplementation profile-reset () - (sb-profile:reset) - "Reset profiling counters.") - -(defimplementation profiled-functions () - (sb-profile:profile)) - -(defimplementation profile-package (package callers methods) - (declare (ignore callers methods)) - (eval `(sb-profile:profile ,(package-name (find-package package))))) - - -;;;; Inspector - -(defmethod emacs-inspect ((o t)) - (cond ((sb-di::indirect-value-cell-p o) - (label-value-line* (:value (sb-kernel:value-cell-ref o)))) - (t - (multiple-value-bind (text label parts) (sb-impl::inspected-parts o) - (list* (string-right-trim '(#\Newline) text) - '(:newline) - (if label - (loop for (l . v) in parts - append (label-value-line l v)) - (loop for value in parts - for i from 0 - append (label-value-line i value)))))))) - -(defmethod emacs-inspect ((o function)) - (cond ((sb-kernel:simple-fun-p o) - (label-value-line* - (:name (sb-kernel:%simple-fun-name o)) - (:arglist (sb-kernel:%simple-fun-arglist o)) - (:next (sb-kernel:%simple-fun-next o)) - (:type (sb-kernel:%simple-fun-type o)) - (:code (sb-kernel:fun-code-header o)))) - ((sb-kernel:closurep o) - (append - (label-value-line :function (sb-kernel:%closure-fun o)) - `("Closed over values:" (:newline)) - (loop for i below (1- (sb-kernel:get-closure-length o)) - append (label-value-line - i (sb-kernel:%closure-index-ref o i))))) - (t (call-next-method o)))) - -(defmethod emacs-inspect ((o sb-kernel:code-component)) - (append - (label-value-line* - (:code-size (sb-kernel:%code-code-size o)) - (:entry-points (sb-kernel:%code-entry-points o)) - (:debug-info (sb-kernel:%code-debug-info o))) - `("Constants:" (:newline)) - (loop for i from sb-vm:code-constants-offset - below - (#.(swank/backend:choose-symbol 'sb-kernel 'code-header-words - 'sb-kernel 'get-header-data) - o) - append (label-value-line i (sb-kernel:code-header-ref o i))) - `("Code:" (:newline) - ,(with-output-to-string (s) - (sb-disassem:disassemble-code-component o :stream s))))) - -(defmethod emacs-inspect ((o sb-ext:weak-pointer)) - (label-value-line* - (:value (sb-ext:weak-pointer-value o)))) - -(defmethod emacs-inspect ((o sb-kernel:fdefn)) - (label-value-line* - (:name (sb-kernel:fdefn-name o)) - (:function (sb-kernel:fdefn-fun o)))) - -(defmethod emacs-inspect :around ((o generic-function)) - (append - (call-next-method) - (label-value-line* - (:pretty-arglist (sb-pcl::generic-function-pretty-arglist o)) - (:initial-methods (sb-pcl::generic-function-initial-methods o)) - ))) - - -;;;; Multiprocessing - -#+(and sb-thread - #.(swank/backend:with-symbol "THREAD-NAME" "SB-THREAD")) -(progn - (defvar *thread-id-counter* 0) - - (defvar *thread-id-counter-lock* - (sb-thread:make-mutex :name "thread id counter lock")) - - (defun next-thread-id () - (sb-thread:with-mutex (*thread-id-counter-lock*) - (incf *thread-id-counter*))) - - (defparameter *thread-id-map* (make-hash-table)) - - ;; This should be a thread -> id map but as weak keys are not - ;; supported it is id -> map instead. - (defvar *thread-id-map-lock* - (sb-thread:make-mutex :name "thread id map lock")) - - (defimplementation spawn (fn &key name) - (sb-thread:make-thread fn :name name)) - - (defimplementation thread-id (thread) - (block thread-id - (sb-thread:with-mutex (*thread-id-map-lock*) - (loop for id being the hash-key in *thread-id-map* - using (hash-value thread-pointer) - do - (let ((maybe-thread (sb-ext:weak-pointer-value thread-pointer))) - (cond ((null maybe-thread) - ;; the value is gc'd, remove it manually - (remhash id *thread-id-map*)) - ((eq thread maybe-thread) - (return-from thread-id id))))) - ;; lazy numbering - (let ((id (next-thread-id))) - (setf (gethash id *thread-id-map*) (sb-ext:make-weak-pointer thread)) - id)))) - - (defimplementation find-thread (id) - (sb-thread:with-mutex (*thread-id-map-lock*) - (let ((thread-pointer (gethash id *thread-id-map*))) - (if thread-pointer - (let ((maybe-thread (sb-ext:weak-pointer-value thread-pointer))) - (if maybe-thread - maybe-thread - ;; the value is gc'd, remove it manually - (progn - (remhash id *thread-id-map*) - nil))) - nil)))) - - (defimplementation thread-name (thread) - ;; sometimes the name is not a string (e.g. NIL) - (princ-to-string (sb-thread:thread-name thread))) - - (defimplementation thread-status (thread) - (if (sb-thread:thread-alive-p thread) - "Running" - "Stopped")) - - (defimplementation make-lock (&key name) - (sb-thread:make-mutex :name name)) - - (defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (sb-thread:with-recursive-lock (lock) (funcall function))) - - (defimplementation current-thread () - sb-thread:*current-thread*) - - (defimplementation all-threads () - (sb-thread:list-all-threads)) - - (defimplementation interrupt-thread (thread fn) - (sb-thread:interrupt-thread thread fn)) - - (defimplementation kill-thread (thread) - (sb-thread:terminate-thread thread)) - - (defimplementation thread-alive-p (thread) - (sb-thread:thread-alive-p thread)) - - (defvar *mailbox-lock* (sb-thread:make-mutex :name "mailbox lock")) - (defvar *mailboxes* (list)) - (declaim (type list *mailboxes*)) - - (defstruct (mailbox (:conc-name mailbox.)) - thread - (mutex (sb-thread:make-mutex)) - (waitqueue (sb-thread:make-waitqueue)) - (queue '() :type list)) - - (defun mailbox (thread) - "Return THREAD's mailbox." - (sb-thread:with-mutex (*mailbox-lock*) - (or (find thread *mailboxes* :key #'mailbox.thread) - (let ((mb (make-mailbox :thread thread))) - (push mb *mailboxes*) - mb)))) - - (defimplementation wake-thread (thread) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (sb-thread:with-recursive-lock (mutex) - (sb-thread:condition-broadcast (mailbox.waitqueue mbox))))) - - (defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (mutex (mailbox.mutex mbox))) - (sb-thread:with-mutex (mutex) - (setf (mailbox.queue mbox) - (nconc (mailbox.queue mbox) (list message))) - (sb-thread:condition-broadcast (mailbox.waitqueue mbox))))) - - (defimplementation receive-if (test &optional timeout) - (let* ((mbox (mailbox (current-thread))) - (mutex (mailbox.mutex mbox)) - (waitq (mailbox.waitqueue mbox))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (sb-thread:with-mutex (mutex) - (let* ((q (mailbox.queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox.queue mbox) (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))) - (when (eq timeout t) (return (values nil t))) - (sb-thread:condition-wait waitq mutex))))) - - (let ((alist '()) - (mutex (sb-thread:make-mutex :name "register-thread"))) - - (defimplementation register-thread (name thread) - (declare (type symbol name)) - (sb-thread:with-mutex (mutex) - (etypecase thread - (null - (setf alist (delete name alist :key #'car))) - (sb-thread:thread - (let ((probe (assoc name alist))) - (cond (probe (setf (cdr probe) thread)) - (t (setf alist (acons name thread alist)))))))) - nil) - - (defimplementation find-registered (name) - (sb-thread:with-mutex (mutex) - (cdr (assoc name alist)))))) - -(defimplementation quit-lisp () - #+#.(swank/backend:with-symbol 'exit 'sb-ext) - (sb-ext:exit) - #-#.(swank/backend:with-symbol 'exit 'sb-ext) - (progn - #+sb-thread - (dolist (thread (remove (current-thread) (all-threads))) - (ignore-errors (sb-thread:terminate-thread thread))) - (sb-ext:quit))) - - - -;;Trace implementations -;;In SBCL, we have: -;; (trace ) -;; (trace :methods ') ;to trace all methods of the gf -;; (trace (method ? (+))) -;; can be a normal name or a (setf name) - -(defun toggle-trace-aux (fspec &rest args) - (cond ((member fspec (eval '(trace)) :test #'equal) - (eval `(untrace ,fspec)) - (format nil "~S is now untraced." fspec)) - (t - (eval `(trace ,@(if args `(:encapsulate nil) (list)) ,fspec ,@args)) - (format nil "~S is now traced." fspec)))) - -(defun process-fspec (fspec) - (cond ((consp fspec) - (ecase (first fspec) - ((:defun :defgeneric) (second fspec)) - ((:defmethod) `(method ,@(rest fspec))) - ((:labels) `(labels ,(process-fspec (second fspec)) ,(third fspec))) - ((:flet) `(flet ,(process-fspec (second fspec)) ,(third fspec))))) - (t - fspec))) - -(defimplementation toggle-trace (spec) - (ecase (car spec) - ((setf) - (toggle-trace-aux spec)) - ((:defmethod) - (toggle-trace-aux `(sb-pcl::fast-method ,@(rest (process-fspec spec))))) - ((:defgeneric) - (toggle-trace-aux (second spec) :methods t)) - ((:call) - (destructuring-bind (caller callee) (cdr spec) - (toggle-trace-aux callee :wherein (list (process-fspec caller))))))) - -;;; Weak datastructures - -(defimplementation make-weak-key-hash-table (&rest args) - #+#.(swank/sbcl::sbcl-with-weak-hash-tables) - (apply #'make-hash-table :weakness :key args) - #-#.(swank/sbcl::sbcl-with-weak-hash-tables) - (apply #'make-hash-table args)) - -(defimplementation make-weak-value-hash-table (&rest args) - #+#.(swank/sbcl::sbcl-with-weak-hash-tables) - (apply #'make-hash-table :weakness :value args) - #-#.(swank/sbcl::sbcl-with-weak-hash-tables) - (apply #'make-hash-table args)) - -(defimplementation hash-table-weakness (hashtable) - #+#.(swank/sbcl::sbcl-with-weak-hash-tables) - (sb-ext:hash-table-weakness hashtable)) - -;;; Floating point - -(defimplementation float-nan-p (float) - (sb-ext:float-nan-p float)) - -(defimplementation float-infinity-p (float) - (sb-ext:float-infinity-p float)) - -#-win32 -(defimplementation save-image (filename &optional restart-function) - (flet ((restart-sbcl () - (sb-debug::enable-debugger) - (setf sb-impl::*descriptor-handlers* nil) - (funcall restart-function))) - (let ((pid (sb-posix:fork))) - (cond ((= pid 0) - (sb-debug::disable-debugger) - (apply #'sb-ext:save-lisp-and-die filename - (when restart-function - (list :toplevel #'restart-sbcl)))) - (t - (multiple-value-bind (rpid status) (sb-posix:waitpid pid 0) - (assert (= pid rpid)) - (assert (and (sb-posix:wifexited status) - (zerop (sb-posix:wexitstatus status)))))))))) - -#+unix -(progn - (sb-alien:define-alien-routine ("execv" sys-execv) sb-alien:int - (program sb-alien:c-string) - (argv (* sb-alien:c-string))) - - (defun execv (program args) - "Replace current executable with another one." - (let ((a-args (sb-alien:make-alien sb-alien:c-string - (+ 1 (length args))))) - (unwind-protect - (progn - (loop for index from 0 by 1 - and item in (append args '(nil)) - do (setf (sb-alien:deref a-args index) - item)) - (when (minusp - (sys-execv program a-args)) - (error "execv(3) returned."))) - (sb-alien:free-alien a-args)))) - - (defun runtime-pathname () - #+#.(swank/backend:with-symbol - '*runtime-pathname* 'sb-ext) - sb-ext:*runtime-pathname* - #-#.(swank/backend:with-symbol - '*runtime-pathname* 'sb-ext) - (car sb-ext:*posix-argv*)) - - (defimplementation exec-image (image-file args) - (loop with fd-arg = - (loop for arg in args - and key = "" then arg - when (string-equal key "--swank-fd") - return (parse-integer arg)) - for my-fd from 3 to 1024 - when (/= my-fd fd-arg) - do (ignore-errors (sb-posix:fcntl my-fd sb-posix:f-setfd 1))) - (let* ((self-string (pathname-to-filename (runtime-pathname)))) - (execv - self-string - (apply 'list self-string "--core" image-file args))))) - -(defimplementation make-fd-stream (fd external-format) - (sb-sys:make-fd-stream fd :input t :output t - :element-type 'character - :buffering :full - :dual-channel-p t - :external-format external-format)) - -#-win32 -(defimplementation background-save-image (filename &key restart-function - completion-function) - (flet ((restart-sbcl () - (sb-debug::enable-debugger) - (setf sb-impl::*descriptor-handlers* nil) - (funcall restart-function))) - (multiple-value-bind (pipe-in pipe-out) (sb-posix:pipe) - (let ((pid (sb-posix:fork))) - (cond ((= pid 0) - (sb-posix:close pipe-in) - (sb-debug::disable-debugger) - (apply #'sb-ext:save-lisp-and-die filename - (when restart-function - (list :toplevel #'restart-sbcl)))) - (t - (sb-posix:close pipe-out) - (sb-sys:add-fd-handler - pipe-in :input - (lambda (fd) - (sb-sys:invalidate-descriptor fd) - (sb-posix:close fd) - (multiple-value-bind (rpid status) (sb-posix:waitpid pid 0) - (assert (= pid rpid)) - (assert (sb-posix:wifexited status)) - (funcall completion-function - (zerop (sb-posix:wexitstatus status)))))))))))) - -(pushnew 'deinit-log-output sb-ext:*save-hooks*) - - -;;;; wrap interface implementation - -(defun sbcl-version>= (&rest subversions) - #+#.(swank/backend:with-symbol 'assert-version->= 'sb-ext) - (values (ignore-errors (apply #'sb-ext:assert-version->= subversions) t)) - #-#.(swank/backend:with-symbol 'assert-version->= 'sb-ext) - nil) - -(defimplementation wrap (spec indicator &key before after replace) - (when (wrapped-p spec indicator) - (warn "~a already wrapped with indicator ~a, unwrapping first" - spec indicator) - (sb-int:unencapsulate spec indicator)) - (sb-int:encapsulate spec indicator - #-#.(swank/backend:with-symbol 'arg-list 'sb-int) - (lambda (function &rest args) - (sbcl-wrap spec before after replace function args)) - #+#.(swank/backend:with-symbol 'arg-list 'sb-int) - (if (sbcl-version>= 1 1 16) - (lambda () - (sbcl-wrap spec before after replace - (symbol-value 'sb-int:basic-definition) - (symbol-value 'sb-int:arg-list))) - `(sbcl-wrap ',spec ,before ,after ,replace - (symbol-value 'sb-int:basic-definition) - (symbol-value 'sb-int:arg-list))))) - -(defimplementation unwrap (spec indicator) - (sb-int:unencapsulate spec indicator)) - -(defimplementation wrapped-p (spec indicator) - (sb-int:encapsulated-p spec indicator)) - -(defun sbcl-wrap (spec before after replace function args) - (declare (ignore spec)) - (let (retlist completed) - (unwind-protect - (progn - (when before - (funcall before args)) - (setq retlist (multiple-value-list (if replace - (funcall replace - args) - (apply function args)))) - (setq completed t) - (values-list retlist)) - (when after - (funcall after (if completed retlist :exited-non-locally)))))) - -#+#.(swank/backend:with-symbol 'comma-expr 'sb-impl) -(progn - (defmethod sexp-in-bounds-p ((s sb-impl::comma) i) - (sexp-in-bounds-p (sb-impl::comma-expr s) i)) - - (defmethod sexp-ref ((s sb-impl::comma) i) - (sexp-ref (sb-impl::comma-expr s) i))) diff --git a/elpa/slime-20200414.1444/swank/scl.lisp b/elpa/slime-20200414.1444/swank/scl.lisp deleted file mode 100644 index ac68c8e5..00000000 --- a/elpa/slime-20200414.1444/swank/scl.lisp +++ /dev/null @@ -1,1726 +0,0 @@ -;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;+" -*- -;;; -;;; Scieneer Common Lisp code for SLIME. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. -;;; - -(defpackage swank/scl - (:use cl swank/backend swank/source-path-parser swank/source-file-cache)) - -(in-package swank/scl) - - - -;;; swank-mop - -(import-swank-mop-symbols :clos '(:slot-definition-documentation)) - -(defun swank-mop:slot-definition-documentation (slot) - (documentation slot t)) - - -;;;; TCP server -;;; -;;; SCL only supports the :spawn communication style. -;;; - -(defimplementation preferred-communication-style () - :spawn) - -(defimplementation create-socket (host port &key backlog) - (let ((addr (resolve-hostname host))) - (ext:create-inet-listener port :stream :host addr :reuse-address t - :backlog (or backlog 5)))) - -(defimplementation local-port (socket) - (nth-value 1 (ext::get-socket-host-and-port (socket-fd socket)))) - -(defimplementation close-socket (socket) - (ext:close-socket (socket-fd socket))) - -(defimplementation accept-connection (socket - &key external-format buffering timeout) - (let ((buffering (or buffering :full)) - (fd (socket-fd socket))) - (loop - (let ((ready (sys:wait-until-fd-usable fd :input timeout))) - (unless ready - (error "Timeout accepting connection on socket: ~S~%" socket))) - (let ((new-fd (ignore-errors (ext:accept-tcp-connection fd)))) - (when new-fd - (return (make-socket-io-stream new-fd external-format - (ecase buffering - ((t) :full) - ((nil) :none) - (:line :line))))))))) - -(defimplementation set-stream-timeout (stream timeout) - (check-type timeout (or null real)) - (if (fboundp 'ext::stream-timeout) - (setf (ext::stream-timeout stream) timeout) - (setf (slot-value (slot-value stream 'lisp::stream) 'lisp::timeout) - timeout))) - -;;;;; Sockets - -(defun socket-fd (socket) - "Return the file descriptor for the socket represented by 'socket." - (etypecase socket - (fixnum socket) - (stream (sys:fd-stream-fd socket)))) - -(defun resolve-hostname (hostname) - "Return the IP address of 'hostname as an integer (in host byte-order)." - (let ((hostent (ext:lookup-host-entry hostname))) - (car (ext:host-entry-addr-list hostent)))) - -(defvar *external-format-to-coding-system* - '((:iso-8859-1 - "latin-1" "latin-1-unix" "iso-latin-1-unix" - "iso-8859-1" "iso-8859-1-unix") - (:utf-8 "utf-8" "utf-8-unix") - (:euc-jp "euc-jp" "euc-jp-unix"))) - -(defimplementation find-external-format (coding-system) - (car (rassoc-if (lambda (x) (member coding-system x :test #'equal)) - *external-format-to-coding-system*))) - -(defun make-socket-io-stream (fd external-format buffering) - "Create a new input/output fd-stream for 'fd." - (cond ((not external-format) - (sys:make-fd-stream fd :input t :output t :buffering buffering - :element-type '(unsigned-byte 8))) - (t - (let* ((stream (sys:make-fd-stream fd :input t :output t - :element-type 'base-char - :buffering buffering - :external-format external-format))) - ;; Ignore character conversion errors. Without this the - ;; communication channel is prone to lockup if a character - ;; conversion error occurs. - (setf (lisp::character-conversion-stream-input-error-value stream) - #\?) - (setf (lisp::character-conversion-stream-output-error-value stream) - #\?) - stream)))) - - -;;;; Stream handling - -(defimplementation gray-package-name () - '#:ext) - - -;;;; Compilation Commands - -(defvar *previous-compiler-condition* nil - "Used to detect duplicates.") - -(defvar *previous-context* nil - "Previous compiler error context.") - -(defvar *buffer-name* nil - "The name of the Emacs buffer we are compiling from. - Nil if we aren't compiling from a buffer.") - -(defvar *buffer-start-position* nil) -(defvar *buffer-substring* nil) - -(defimplementation call-with-compilation-hooks (function) - (let ((*previous-compiler-condition* nil) - (*previous-context* nil) - (*print-readably* nil)) - (handler-bind ((c::compiler-error #'handle-notification-condition) - (c::style-warning #'handle-notification-condition) - (c::warning #'handle-notification-condition)) - (funcall function)))) - -(defimplementation swank-compile-file (input-file output-file - load-p external-format - &key policy) - (declare (ignore policy)) - (with-compilation-hooks () - (let ((*buffer-name* nil) - (ext:*ignore-extra-close-parentheses* nil)) - (multiple-value-bind (output-file warnings-p failure-p) - (compile-file input-file - :output-file output-file - :external-format external-format) - (values output-file warnings-p - (or failure-p - (when load-p - ;; Cache the latest source file for definition-finding. - (source-cache-get input-file - (file-write-date input-file)) - (not (load output-file))))))))) - -(defimplementation swank-compile-string (string &key buffer position filename - line column policy) - (declare (ignore filename line column policy)) - (with-compilation-hooks () - (let ((*buffer-name* buffer) - (*buffer-start-position* position) - (*buffer-substring* string)) - (with-input-from-string (stream string) - (ext:compile-from-stream - stream - :source-info `(:emacs-buffer ,buffer - :emacs-buffer-offset ,position - :emacs-buffer-string ,string)))))) - - -;;;;; Trapping notes -;;; -;;; We intercept conditions from the compiler and resignal them as -;;; `swank:compiler-condition's. - -(defun handle-notification-condition (condition) - "Handle a condition caused by a compiler warning." - (unless (eq condition *previous-compiler-condition*) - (let ((context (c::find-error-context nil))) - (setq *previous-compiler-condition* condition) - (setq *previous-context* context) - (signal-compiler-condition condition context)))) - -(defun signal-compiler-condition (condition context) - (signal 'compiler-condition - :original-condition condition - :severity (severity-for-emacs condition) - :message (brief-compiler-message-for-emacs condition) - :source-context (compiler-error-context context) - :location (if (read-error-p condition) - (read-error-location condition) - (compiler-note-location context)))) - -(defun severity-for-emacs (condition) - "Return the severity of 'condition." - (etypecase condition - ((satisfies read-error-p) :read-error) - (c::compiler-error :error) - (c::style-warning :note) - (c::warning :warning))) - -(defun read-error-p (condition) - (eq (type-of condition) 'c::compiler-read-error)) - -(defun brief-compiler-message-for-emacs (condition) - "Briefly describe a compiler error for Emacs. - When Emacs presents the message it already has the source popped up - and the source form highlighted. This makes much of the information in - the error-context redundant." - (princ-to-string condition)) - -(defun compiler-error-context (error-context) - "Describe a compiler error for Emacs including context information." - (declare (type (or c::compiler-error-context null) error-context)) - (multiple-value-bind (enclosing source) - (if error-context - (values (c::compiler-error-context-enclosing-source error-context) - (c::compiler-error-context-source error-context))) - (if (and enclosing source) - (format nil "~@[--> ~{~<~%--> ~1:;~A~> ~}~%~]~@[~{==>~%~A~^~%~}~]" - enclosing source)))) - -(defun read-error-location (condition) - (let* ((finfo (car (c::source-info-current-file c::*source-info*))) - (file (c::file-info-name finfo)) - (pos (c::compiler-read-error-position condition))) - (cond ((and (eq file :stream) *buffer-name*) - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* pos))) - ((and (pathnamep file) (not *buffer-name*)) - (make-location (list :file (unix-truename file)) - (list :position (1+ pos)))) - (t (break))))) - -(defun compiler-note-location (context) - "Derive the location of a complier message from its context. - Return a `location' record, or (:error ) on failure." - (if (null context) - (note-error-location) - (let ((file (c::compiler-error-context-file-name context)) - (source (c::compiler-error-context-original-source context)) - (path - (reverse - (c::compiler-error-context-original-source-path context)))) - (or (locate-compiler-note file source path) - (note-error-location))))) - -(defun note-error-location () - "Pseudo-location for notes that can't be located." - (list :error "No error location available.")) - -(defun locate-compiler-note (file source source-path) - (cond ((and (eq file :stream) *buffer-name*) - ;; Compiling from a buffer - (make-location (list :buffer *buffer-name*) - (list :offset *buffer-start-position* - (source-path-string-position - source-path *buffer-substring*)))) - ((and (pathnamep file) (null *buffer-name*)) - ;; Compiling from a file - (make-location (list :file (unix-truename file)) - (list :position (1+ (source-path-file-position - source-path file))))) - ((and (eq file :lisp) (stringp source)) - ;; No location known, but we have the source form. - ;; XXX How is this case triggered? -luke (16/May/2004) - ;; This can happen if the compiler needs to expand a macro - ;; but the macro-expander is not yet compiled. Calling the - ;; (interpreted) macro-expander triggers IR1 conversion of - ;; the lambda expression for the expander and invokes the - ;; compiler recursively. - (make-location (list :source-form source) - (list :position 1))))) - -(defun unix-truename (pathname) - (ext:unix-namestring (truename pathname))) - - - -;;; TODO -(defimplementation who-calls (name) nil) -(defimplementation who-references (name) nil) -(defimplementation who-binds (name) nil) -(defimplementation who-sets (name) nil) -(defimplementation who-specializes (symbol) nil) -(defimplementation who-macroexpands (name) nil) - - -;;;; Find callers and callees -;;; -;;; Find callers and callees by looking at the constant pool of -;;; compiled code objects. We assume every fdefn object in the -;;; constant pool corresponds to a call to that function. A better -;;; strategy would be to use the disassembler to find actual -;;; call-sites. - -(declaim (inline map-code-constants)) -(defun map-code-constants (code fn) - "Call 'fn for each constant in 'code's constant pool." - (check-type code kernel:code-component) - (loop for i from vm:code-constants-offset below (kernel:get-header-data code) - do (funcall fn (kernel:code-header-ref code i)))) - -(defun function-callees (function) - "Return 'function's callees as a list of functions." - (let ((callees '())) - (map-code-constants - (vm::find-code-object function) - (lambda (obj) - (when (kernel:fdefn-p obj) - (push (kernel:fdefn-function obj) callees)))) - callees)) - -(declaim (ext:maybe-inline map-allocated-code-components)) -(defun map-allocated-code-components (spaces fn) - "Call FN for each allocated code component in one of 'spaces. FN - receives the object as argument. 'spaces should be a list of the - symbols :dynamic, :static, or :read-only." - (dolist (space spaces) - (declare (inline vm::map-allocated-objects) - (optimize (ext:inhibit-warnings 3))) - (vm::map-allocated-objects - (lambda (obj header size) - (declare (type fixnum size) (ignore size)) - (when (= vm:code-header-type header) - (funcall fn obj))) - space))) - -(declaim (ext:maybe-inline map-caller-code-components)) -(defun map-caller-code-components (function spaces fn) - "Call 'fn for each code component with a fdefn for 'function in its - constant pool." - (let ((function (coerce function 'function))) - (declare (inline map-allocated-code-components)) - (map-allocated-code-components - spaces - (lambda (obj) - (map-code-constants - obj - (lambda (constant) - (when (and (kernel:fdefn-p constant) - (eq (kernel:fdefn-function constant) - function)) - (funcall fn obj)))))))) - -(defun function-callers (function &optional (spaces '(:read-only :static - :dynamic))) - "Return 'function's callers. The result is a list of code-objects." - (let ((referrers '())) - (declare (inline map-caller-code-components)) - (map-caller-code-components function spaces - (lambda (code) (push code referrers))) - referrers)) - -(defun debug-info-definitions (debug-info) - "Return the defintions for a debug-info. This should only be used - for code-object without entry points, i.e., byte compiled - code (are theree others?)" - ;; This mess has only been tested with #'ext::skip-whitespace, a - ;; byte-compiled caller of #'read-char . - (check-type debug-info (and (not c::compiled-debug-info) c::debug-info)) - (let ((name (c::debug-info-name debug-info)) - (source (c::debug-info-source debug-info))) - (destructuring-bind (first) source - (ecase (c::debug-source-from first) - (:file - (list (list name - (make-location - (list :file (unix-truename (c::debug-source-name first))) - (list :function-name (string name)))))))))) - -(defun valid-function-name-p (name) - (or (symbolp name) (and (consp name) - (eq (car name) 'setf) - (symbolp (cadr name)) - (not (cddr name))))) - -(defun code-component-entry-points (code) - "Return a list ((name location) ...) of function definitons for - the code omponent 'code." - (let ((names '())) - (do ((f (kernel:%code-entry-points code) (kernel::%function-next f))) - ((not f)) - (let ((name (kernel:%function-name f))) - (when (valid-function-name-p name) - (push (list name (function-location f)) names)))) - names)) - -(defimplementation list-callers (symbol) - "Return a list ((name location) ...) of callers." - (let ((components (function-callers symbol)) - (xrefs '())) - (dolist (code components) - (let* ((entry (kernel:%code-entry-points code)) - (defs (if entry - (code-component-entry-points code) - ;; byte compiled stuff - (debug-info-definitions - (kernel:%code-debug-info code))))) - (setq xrefs (nconc defs xrefs)))) - xrefs)) - -(defimplementation list-callees (symbol) - (let ((fns (function-callees symbol))) - (mapcar (lambda (fn) - (list (kernel:%function-name fn) - (function-location fn))) - fns))) - - -;;;; Resolving source locations -;;; -;;; Our mission here is to "resolve" references to code locations into -;;; actual file/buffer names and character positions. The references -;;; we work from come out of the compiler's statically-generated debug -;;; information, such as `code-location''s and `debug-source''s. For -;;; more details, see the "Debugger Programmer's Interface" section of -;;; the SCL manual. -;;; -;;; The first step is usually to find the corresponding "source-path" -;;; for the location. Once we have the source-path we can pull up the -;;; source file and `READ' our way through to the right position. The -;;; main source-code groveling work is done in -;;; `source-path-parser.lisp'. - -(defvar *debug-definition-finding* nil - "When true don't handle errors while looking for definitions. - This is useful when debugging the definition-finding code.") - -(defmacro safe-definition-finding (&body body) - "Execute 'body and return the source-location it returns. - If an error occurs and `*debug-definition-finding*' is false, then - return an error pseudo-location. - - The second return value is 'nil if no error occurs, otherwise it is the - condition object." - `(flet ((body () ,@body)) - (if *debug-definition-finding* - (body) - (handler-case (values (progn ,@body) nil) - (error (c) (values (list :error (princ-to-string c)) c)))))) - -(defun code-location-source-location (code-location) - "Safe wrapper around `code-location-from-source-location'." - (safe-definition-finding - (source-location-from-code-location code-location))) - -(defun source-location-from-code-location (code-location) - "Return the source location for 'code-location." - (let ((debug-fun (di:code-location-debug-function code-location))) - (when (di::bogus-debug-function-p debug-fun) - ;; Those lousy cheapskates! They've put in a bogus debug source - ;; because the code was compiled at a low debug setting. - (error "Bogus debug function: ~A" debug-fun))) - (let* ((debug-source (di:code-location-debug-source code-location)) - (from (di:debug-source-from debug-source)) - (name (di:debug-source-name debug-source))) - (ecase from - (:file - (location-in-file name code-location debug-source)) - (:stream - (location-in-stream code-location debug-source)) - (:lisp - ;; The location comes from a form passed to `compile'. - ;; The best we can do is return the form itself for printing. - (make-location - (list :source-form (with-output-to-string (*standard-output*) - (debug::print-code-location-source-form - code-location 100 t))) - (list :position 1)))))) - -(defun location-in-file (filename code-location debug-source) - "Resolve the source location for 'code-location in 'filename." - (let* ((code-date (di:debug-source-created debug-source)) - (source-code (get-source-code filename code-date))) - (with-input-from-string (s source-code) - (make-location (list :file (unix-truename filename)) - (list :position (1+ (code-location-stream-position - code-location s))) - `(:snippet ,(read-snippet s)))))) - -(defun location-in-stream (code-location debug-source) - "Resolve the source location for a 'code-location from a stream. - This only succeeds if the code was compiled from an Emacs buffer." - (unless (debug-source-info-from-emacs-buffer-p debug-source) - (error "The code is compiled from a non-SLIME stream.")) - (let* ((info (c::debug-source-info debug-source)) - (string (getf info :emacs-buffer-string)) - (position (code-location-string-offset - code-location - string))) - (make-location - (list :buffer (getf info :emacs-buffer)) - (list :offset (getf info :emacs-buffer-offset) position) - (list :snippet (with-input-from-string (s string) - (file-position s position) - (read-snippet s)))))) - -;;;;; Function-name locations -;;; -(defun debug-info-function-name-location (debug-info) - "Return a function-name source-location for 'debug-info. - Function-name source-locations are a fallback for when precise - positions aren't available." - (with-struct (c::debug-info- (fname name) source) debug-info - (with-struct (c::debug-source- info from name) (car source) - (ecase from - (:file - (make-location (list :file (namestring (truename name))) - (list :function-name (string fname)))) - (:stream - (assert (debug-source-info-from-emacs-buffer-p (car source))) - (make-location (list :buffer (getf info :emacs-buffer)) - (list :function-name (string fname)))) - (:lisp - (make-location (list :source-form (princ-to-string (aref name 0))) - (list :position 1))))))) - -(defun debug-source-info-from-emacs-buffer-p (debug-source) - "Does the `info' slot of 'debug-source contain an Emacs buffer location? - This is true for functions that were compiled directly from buffers." - (info-from-emacs-buffer-p (c::debug-source-info debug-source))) - -(defun info-from-emacs-buffer-p (info) - (and info - (consp info) - (eq :emacs-buffer (car info)))) - - -;;;;; Groveling source-code for positions - -(defun code-location-stream-position (code-location stream) - "Return the byte offset of 'code-location in 'stream. Extract the - toplevel-form-number and form-number from 'code-location and use that - to find the position of the corresponding form. - - Finish with 'stream positioned at the start of the code location." - (let* ((location (debug::maybe-block-start-location code-location)) - (tlf-offset (di:code-location-top-level-form-offset location)) - (form-number (di:code-location-form-number location))) - (let ((pos (form-number-stream-position tlf-offset form-number stream))) - (file-position stream pos) - pos))) - -(defun form-number-stream-position (tlf-number form-number stream) - "Return the starting character position of a form in 'stream. - 'tlf-number is the top-level-form number. - 'form-number is an index into a source-path table for the TLF." - (multiple-value-bind (tlf position-map) (read-source-form tlf-number stream) - (let* ((path-table (di:form-number-translations tlf 0)) - (source-path - (if (<= (length path-table) form-number) ; source out of sync? - (list 0) ; should probably signal a condition - (reverse (cdr (aref path-table form-number)))))) - (source-path-source-position source-path tlf position-map)))) - -(defun code-location-string-offset (code-location string) - "Return the byte offset of 'code-location in 'string. - See 'code-location-stream-position." - (with-input-from-string (s string) - (code-location-stream-position code-location s))) - - -;;;; Finding definitions - -;;; There are a great many different types of definition for us to -;;; find. We search for definitions of every kind and return them in a -;;; list. - -(defimplementation find-definitions (name) - (append (function-definitions name) - (setf-definitions name) - (variable-definitions name) - (class-definitions name) - (type-definitions name) - (compiler-macro-definitions name) - (source-transform-definitions name) - (function-info-definitions name) - (ir1-translator-definitions name))) - -;;;;; Functions, macros, generic functions, methods -;;; -;;; We make extensive use of the compile-time debug information that -;;; SCL records, in particular "debug functions" and "code -;;; locations." Refer to the "Debugger Programmer's Interface" section -;;; of the SCL manual for more details. - -(defun function-definitions (name) - "Return definitions for 'name in the \"function namespace\", i.e., - regular functions, generic functions, methods and macros. - 'name can any valid function name (e.g, (setf car))." - (let ((macro? (and (symbolp name) (macro-function name))) - (special? (and (symbolp name) (special-operator-p name))) - (function? (and (valid-function-name-p name) - (ext:info :function :definition name) - (if (symbolp name) (fboundp name) t)))) - (cond (macro? - (list `((defmacro ,name) - ,(function-location (macro-function name))))) - (special? - (list `((:special-operator ,name) - (:error ,(format nil "Special operator: ~S" name))))) - (function? - (let ((function (fdefinition name))) - (if (genericp function) - (generic-function-definitions name function) - (list (list `(function ,name) - (function-location function))))))))) - -;;;;;; Ordinary (non-generic/macro/special) functions -;;; -;;; First we test if FUNCTION is a closure created by defstruct, and -;;; if so extract the defstruct-description (`dd') from the closure -;;; and find the constructor for the struct. Defstruct creates a -;;; defun for the default constructor and we use that as an -;;; approximation to the source location of the defstruct. -;;; -;;; For an ordinary function we return the source location of the -;;; first code-location we find. -;;; -(defun function-location (function) - "Return the source location for FUNCTION." - (cond ((struct-closure-p function) - (struct-closure-location function)) - ((c::byte-function-or-closure-p function) - (byte-function-location function)) - (t - (compiled-function-location function)))) - -(defun compiled-function-location (function) - "Return the location of a regular compiled function." - (multiple-value-bind (code-location error) - (safe-definition-finding (function-first-code-location function)) - (cond (error (list :error (princ-to-string error))) - (t (code-location-source-location code-location))))) - -(defun function-first-code-location (function) - "Return the first code-location we can find for 'function." - (and (function-has-debug-function-p function) - (di:debug-function-start-location - (di:function-debug-function function)))) - -(defun function-has-debug-function-p (function) - (di:function-debug-function function)) - -(defun function-code-object= (closure function) - (and (eq (vm::find-code-object closure) - (vm::find-code-object function)) - (not (eq closure function)))) - - -(defun byte-function-location (fn) - "Return the location of the byte-compiled function 'fn." - (etypecase fn - ((or c::hairy-byte-function c::simple-byte-function) - (let* ((component (c::byte-function-component fn)) - (debug-info (kernel:%code-debug-info component))) - (debug-info-function-name-location debug-info))) - (c::byte-closure - (byte-function-location (c::byte-closure-function fn))))) - -;;; Here we deal with structure accessors. Note that `dd' is a -;;; "defstruct descriptor" structure in SCL. A `dd' describes a -;;; `defstruct''d structure. - -(defun struct-closure-p (function) - "Is 'function a closure created by defstruct?" - (or (function-code-object= function #'kernel::structure-slot-accessor) - (function-code-object= function #'kernel::structure-slot-setter) - (function-code-object= function #'kernel::%defstruct))) - -(defun struct-closure-location (function) - "Return the location of the structure that 'function belongs to." - (assert (struct-closure-p function)) - (safe-definition-finding - (dd-location (struct-closure-dd function)))) - -(defun struct-closure-dd (function) - "Return the defstruct-definition (dd) of FUNCTION." - (assert (= (kernel:get-type function) vm:closure-header-type)) - (flet ((find-layout (function) - (sys:find-if-in-closure - (lambda (x) - (let ((value (if (di::indirect-value-cell-p x) - (c:value-cell-ref x) - x))) - (when (kernel::layout-p value) - (return-from find-layout value)))) - function))) - (kernel:layout-info (find-layout function)))) - -(defun dd-location (dd) - "Return the location of a `defstruct'." - ;; Find the location in a constructor. - (function-location (struct-constructor dd))) - -(defun struct-constructor (dd) - "Return a constructor function from a defstruct definition. -Signal an error if no constructor can be found." - (let ((constructor (or (kernel:dd-default-constructor dd) - (car (kernel::dd-constructors dd))))) - (when (or (null constructor) - (and (consp constructor) (null (car constructor)))) - (error "Cannot find structure's constructor: ~S" - (kernel::dd-name dd))) - (coerce (if (consp constructor) (first constructor) constructor) - 'function))) - -;;;;;; Generic functions and methods - -(defun generic-function-definitions (name function) - "Return the definitions of a generic function and its methods." - (cons (list `(defgeneric ,name) (gf-location function)) - (gf-method-definitions function))) - -(defun gf-location (gf) - "Return the location of the generic function GF." - (definition-source-location gf (clos:generic-function-name gf))) - -(defun gf-method-definitions (gf) - "Return the locations of all methods of the generic function GF." - (mapcar #'method-definition (clos:generic-function-methods gf))) - -(defun method-definition (method) - (list (method-dspec method) - (method-location method))) - -(defun method-dspec (method) - "Return a human-readable \"definition specifier\" for METHOD." - (let* ((gf (clos:method-generic-function method)) - (name (clos:generic-function-name gf)) - (specializers (clos:method-specializers method)) - (qualifiers (clos:method-qualifiers method))) - `(method ,name ,@qualifiers ,specializers - #+nil (clos::unparse-specializers specializers)))) - -;; XXX maybe special case setters/getters -(defun method-location (method) - (function-location (clos:method-function method))) - -(defun genericp (fn) - (typep fn 'generic-function)) - -;;;;;; Types and classes - -(defun type-definitions (name) - "Return `deftype' locations for type NAME." - (maybe-make-definition (ext:info :type :expander name) 'deftype name)) - -(defun maybe-make-definition (function kind name) - "If FUNCTION is non-nil then return its definition location." - (if function - (list (list `(,kind ,name) (function-location function))))) - -(defun class-definitions (name) - "Return the definition locations for the class called NAME." - (if (symbolp name) - (let ((class (find-class name nil))) - (etypecase class - (null '()) - (structure-class - (list (list `(defstruct ,name) - (dd-location (find-dd name))))) - (standard-class - (list (list `(defclass ,name) - (class-location (find-class name))))) - ((or built-in-class - kernel:funcallable-structure-class) - (list (list `(kernel::define-type-class ,name) - `(:error - ,(format nil "No source info for ~A" name))))))))) - -(defun class-location (class) - "Return the `defclass' location for CLASS." - (definition-source-location class (class-name class))) - -(defun find-dd (name) - "Find the defstruct-definition by the name of its structure-class." - (let ((layout (ext:info :type :compiler-layout name))) - (if layout - (kernel:layout-info layout)))) - -(defun condition-class-location (class) - (let ((name (class-name class))) - `(:error ,(format nil "No location info for condition: ~A" name)))) - -(defun make-name-in-file-location (file string) - (multiple-value-bind (filename c) - (ignore-errors - (unix-truename (merge-pathnames (make-pathname :type "lisp") - file))) - (cond (filename (make-location `(:file ,filename) - `(:function-name ,(string string)))) - (t (list :error (princ-to-string c)))))) - -(defun definition-source-location (object name) - `(:error ,(format nil "No source info for: ~A" object))) - -(defun setf-definitions (name) - (let ((function (or (ext:info :setf :inverse name) - (ext:info :setf :expander name)))) - (if function - (list (list `(setf ,name) - (function-location (coerce function 'function))))))) - - -(defun variable-location (symbol) - `(:error ,(format nil "No source info for variable ~S" symbol))) - -(defun variable-definitions (name) - (if (symbolp name) - (multiple-value-bind (kind recorded-p) (ext:info :variable :kind name) - (if recorded-p - (list (list `(variable ,kind ,name) - (variable-location name))))))) - -(defun compiler-macro-definitions (symbol) - (maybe-make-definition (compiler-macro-function symbol) - 'define-compiler-macro - symbol)) - -(defun source-transform-definitions (name) - (maybe-make-definition (ext:info :function :source-transform name) - 'c:def-source-transform - name)) - -(defun function-info-definitions (name) - (let ((info (ext:info :function :info name))) - (if info - (append (loop for transform in (c::function-info-transforms info) - collect (list `(c:deftransform ,name - ,(c::type-specifier - (c::transform-type transform))) - (function-location (c::transform-function - transform)))) - (maybe-make-definition (c::function-info-derive-type info) - 'c::derive-type name) - (maybe-make-definition (c::function-info-optimizer info) - 'c::optimizer name) - (maybe-make-definition (c::function-info-ltn-annotate info) - 'c::ltn-annotate name) - (maybe-make-definition (c::function-info-ir2-convert info) - 'c::ir2-convert name) - (loop for template in (c::function-info-templates info) - collect (list `(c::vop ,(c::template-name template)) - (function-location - (c::vop-info-generator-function - template)))))))) - -(defun ir1-translator-definitions (name) - (maybe-make-definition (ext:info :function :ir1-convert name) - 'c:def-ir1-translator name)) - - -;;;; Documentation. - -(defimplementation describe-symbol-for-emacs (symbol) - (let ((result '())) - (flet ((doc (kind) - (or (documentation symbol kind) :not-documented)) - (maybe-push (property value) - (when value - (setf result (list* property value result))))) - (maybe-push - :variable (multiple-value-bind (kind recorded-p) - (ext:info variable kind symbol) - (declare (ignore kind)) - (if (or (boundp symbol) recorded-p) - (doc 'variable)))) - (when (fboundp symbol) - (maybe-push - (cond ((macro-function symbol) :macro) - ((special-operator-p symbol) :special-operator) - ((genericp (fdefinition symbol)) :generic-function) - (t :function)) - (doc 'function))) - (maybe-push - :setf (if (or (ext:info setf inverse symbol) - (ext:info setf expander symbol)) - (doc 'setf))) - (maybe-push - :type (if (ext:info type kind symbol) - (doc 'type))) - (maybe-push - :class (if (find-class symbol nil) - (doc 'class))) - (maybe-push - :alien-type (if (not (eq (ext:info alien-type kind symbol) :unknown)) - (doc 'alien-type))) - (maybe-push - :alien-struct (if (ext:info alien-type struct symbol) - (doc nil))) - (maybe-push - :alien-union (if (ext:info alien-type union symbol) - (doc nil))) - (maybe-push - :alien-enum (if (ext:info alien-type enum symbol) - (doc nil))) - result))) - -(defimplementation describe-definition (symbol namespace) - (describe (ecase namespace - (:variable - symbol) - ((:function :generic-function) - (symbol-function symbol)) - (:setf - (or (ext:info setf inverse symbol) - (ext:info setf expander symbol))) - (:type - (kernel:values-specifier-type symbol)) - (:class - (find-class symbol)) - (:alien-struct - (ext:info :alien-type :struct symbol)) - (:alien-union - (ext:info :alien-type :union symbol)) - (:alien-enum - (ext:info :alien-type :enum symbol)) - (:alien-type - (ecase (ext:info :alien-type :kind symbol) - (:primitive - (let ((alien::*values-type-okay* t)) - (funcall (ext:info :alien-type :translator symbol) - (list symbol)))) - ((:defined) - (ext:info :alien-type :definition symbol)) - (:unknown :unknown)))))) - -;;;;; Argument lists - -(defimplementation arglist (fun) - (multiple-value-bind (args winp) - (ext:function-arglist fun) - (if winp args :not-available))) - -(defimplementation function-name (function) - (cond ((eval:interpreted-function-p function) - (eval:interpreted-function-name function)) - ((typep function 'generic-function) - (clos:generic-function-name function)) - ((c::byte-function-or-closure-p function) - (c::byte-function-name function)) - (t (kernel:%function-name (kernel:%function-self function))))) - - -;;; A harder case: an approximate arglist is derived from available -;;; debugging information. - -(defun debug-function-arglist (debug-function) - "Derive the argument list of DEBUG-FUNCTION from debug info." - (let ((args (di::debug-function-lambda-list debug-function)) - (required '()) - (optional '()) - (rest '()) - (key '())) - ;; collect the names of debug-vars - (dolist (arg args) - (etypecase arg - (di::debug-variable - (push (di::debug-variable-symbol arg) required)) - ((member :deleted) - (push ':deleted required)) - (cons - (ecase (car arg) - (:keyword - (push (second arg) key)) - (:optional - (push (debug-variable-symbol-or-deleted (second arg)) optional)) - (:rest - (push (debug-variable-symbol-or-deleted (second arg)) rest)))))) - ;; intersperse lambda keywords as needed - (append (nreverse required) - (if optional (cons '&optional (nreverse optional))) - (if rest (cons '&rest (nreverse rest))) - (if key (cons '&key (nreverse key)))))) - -(defun debug-variable-symbol-or-deleted (var) - (etypecase var - (di:debug-variable - (di::debug-variable-symbol var)) - ((member :deleted) - '#:deleted))) - -(defun symbol-debug-function-arglist (fname) - "Return FNAME's debug-function-arglist and %function-arglist. - A utility for debugging DEBUG-FUNCTION-ARGLIST." - (let ((fn (fdefinition fname))) - (values (debug-function-arglist (di::function-debug-function fn)) - (kernel:%function-arglist (kernel:%function-self fn))))) - - -;;;; Miscellaneous. - -(defimplementation macroexpand-all (form &optional env) - (declare (ignore env)) - (macroexpand form)) - -(defimplementation set-default-directory (directory) - (setf (ext:default-directory) (namestring directory)) - ;; Setting *default-pathname-defaults* to an absolute directory - ;; makes the behavior of MERGE-PATHNAMES a bit more intuitive. - (setf *default-pathname-defaults* (pathname (ext:default-directory))) - (default-directory)) - -(defimplementation default-directory () - (namestring (ext:default-directory))) - -(defimplementation pathname-to-filename (pathname) - (ext:unix-namestring pathname nil)) - -(defimplementation getpid () - (unix:unix-getpid)) - -(defimplementation lisp-implementation-type-name () - (if (eq ext:*case-mode* :upper) "scl" "scl-lower")) - -(defimplementation quit-lisp () - (ext:quit)) - -;;; source-path-{stream,file,string,etc}-position moved into -;;; source-path-parser - - -;;;; Debugging - -(defvar *sldb-stack-top*) - -(defimplementation call-with-debugging-environment (debugger-loop-fn) - (let* ((*sldb-stack-top* (or debug:*stack-top-hint* (di:top-frame))) - (debug:*stack-top-hint* nil) - (kernel:*current-level* 0)) - (handler-bind ((di::unhandled-condition - (lambda (condition) - (error 'sldb-condition - :original-condition condition)))) - (funcall debugger-loop-fn)))) - -(defun frame-down (frame) - (handler-case (di:frame-down frame) - (di:no-debug-info () nil))) - -(defun nth-frame (index) - (do ((frame *sldb-stack-top* (frame-down frame)) - (i index (1- i))) - ((zerop i) frame))) - -(defimplementation compute-backtrace (start end) - (let ((end (or end most-positive-fixnum))) - (loop for f = (nth-frame start) then (frame-down f) - for i from start below end - while f collect f))) - -(defimplementation print-frame (frame stream) - (let ((*standard-output* stream)) - (handler-case - (debug::print-frame-call frame :verbosity 1 :number nil) - (error (e) - (ignore-errors (princ e stream)))))) - -(defimplementation frame-source-location (index) - (code-location-source-location (di:frame-code-location (nth-frame index)))) - -(defimplementation eval-in-frame (form index) - (di:eval-in-frame (nth-frame index) form)) - -(defun frame-debug-vars (frame) - "Return a vector of debug-variables in frame." - (di::debug-function-debug-variables (di:frame-debug-function frame))) - -(defun debug-var-value (var frame location) - (let ((validity (di:debug-variable-validity var location))) - (ecase validity - (:valid (di:debug-variable-value var frame)) - ((:invalid :unknown) (make-symbol (string validity)))))) - -(defimplementation frame-locals (index) - (let* ((frame (nth-frame index)) - (loc (di:frame-code-location frame)) - (vars (frame-debug-vars frame))) - (loop for v across vars collect - (list :name (di:debug-variable-symbol v) - :id (di:debug-variable-id v) - :value (debug-var-value v frame loc))))) - -(defimplementation frame-var-value (frame var) - (let* ((frame (nth-frame frame)) - (dvar (aref (frame-debug-vars frame) var))) - (debug-var-value dvar frame (di:frame-code-location frame)))) - -(defimplementation frame-catch-tags (index) - (mapcar #'car (di:frame-catches (nth-frame index)))) - -(defimplementation return-from-frame (index form) - (let ((sym (find-symbol (symbol-name '#:find-debug-tag-for-frame) - :debug-internals))) - (if sym - (let* ((frame (nth-frame index)) - (probe (funcall sym frame))) - (cond (probe (throw (car probe) (eval-in-frame form index))) - (t (format nil "Cannot return from frame: ~S" frame)))) - "return-from-frame is not implemented in this version of SCL."))) - -(defimplementation activate-stepping (frame) - (set-step-breakpoints (nth-frame frame))) - -(defimplementation sldb-break-on-return (frame) - (break-on-return (nth-frame frame))) - -;;; We set the breakpoint in the caller which might be a bit confusing. -;;; -(defun break-on-return (frame) - (let* ((caller (di:frame-down frame)) - (cl (di:frame-code-location caller))) - (flet ((hook (frame bp) - (when (frame-pointer= frame caller) - (di:delete-breakpoint bp) - (signal-breakpoint bp frame)))) - (let* ((info (ecase (di:code-location-kind cl) - ((:single-value-return :unknown-return) nil) - (:known-return (debug-function-returns - (di:frame-debug-function frame))))) - (bp (di:make-breakpoint #'hook cl :kind :code-location - :info info))) - (di:activate-breakpoint bp) - `(:ok ,(format nil "Set breakpoint in ~A" caller)))))) - -(defun frame-pointer= (frame1 frame2) - "Return true if the frame pointers of FRAME1 and FRAME2 are the same." - (sys:sap= (di::frame-pointer frame1) (di::frame-pointer frame2))) - -;;; The PC in escaped frames at a single-return-value point is -;;; actually vm:single-value-return-byte-offset bytes after the -;;; position given in the debug info. Here we try to recognize such -;;; cases. -;;; -(defun next-code-locations (frame code-location) - "Like `debug::next-code-locations' but be careful in escaped frames." - (let ((next (debug::next-code-locations code-location))) - (flet ((adjust-pc () - (let ((cl (di::copy-compiled-code-location code-location))) - (incf (di::compiled-code-location-pc cl) - vm:single-value-return-byte-offset) - cl))) - (cond ((and (di::compiled-frame-escaped frame) - (eq (di:code-location-kind code-location) - :single-value-return) - (= (length next) 1) - (di:code-location= (car next) (adjust-pc))) - (debug::next-code-locations (car next))) - (t - next))))) - -(defun set-step-breakpoints (frame) - (let ((cl (di:frame-code-location frame))) - (when (di:debug-block-elsewhere-p (di:code-location-debug-block cl)) - (error "Cannot step in elsewhere code")) - (let* ((debug::*bad-code-location-types* - (remove :call-site debug::*bad-code-location-types*)) - (next (next-code-locations frame cl))) - (cond (next - (let ((steppoints '())) - (flet ((hook (bp-frame bp) - (signal-breakpoint bp bp-frame) - (mapc #'di:delete-breakpoint steppoints))) - (dolist (code-location next) - (let ((bp (di:make-breakpoint #'hook code-location - :kind :code-location))) - (di:activate-breakpoint bp) - (push bp steppoints)))))) - (t - (break-on-return frame)))))) - - -;; XXX the return values at return breakpoints should be passed to the -;; user hooks. debug-int.lisp should be changed to do this cleanly. - -;;; The sigcontext and the PC for a breakpoint invocation are not -;;; passed to user hook functions, but we need them to extract return -;;; values. So we advice di::handle-breakpoint and bind the values to -;;; special variables. -;;; -(defvar *breakpoint-sigcontext*) -(defvar *breakpoint-pc*) - -(defun sigcontext-object (sc index) - "Extract the lisp object in sigcontext SC at offset INDEX." - (kernel:make-lisp-obj (vm:ucontext-register sc index))) - -(defun known-return-point-values (sigcontext sc-offsets) - (let ((fp (system:int-sap (vm:ucontext-register sigcontext - vm::cfp-offset)))) - (system:without-gcing - (loop for sc-offset across sc-offsets - collect (di::sub-access-debug-var-slot fp sc-offset sigcontext))))) - -;;; SCL returns the first few values in registers and the rest on -;;; the stack. In the multiple value case, the number of values is -;;; stored in a dedicated register. The values of the registers can be -;;; accessed in the sigcontext for the breakpoint. There are 3 kinds -;;; of return conventions: :single-value-return, :unknown-return, and -;;; :known-return. -;;; -;;; The :single-value-return convention returns the value in a -;;; register without setting the nargs registers. -;;; -;;; The :unknown-return variant is used for multiple values. A -;;; :unknown-return point consists actually of 2 breakpoints: one for -;;; the single value case and one for the general case. The single -;;; value breakpoint comes vm:single-value-return-byte-offset after -;;; the multiple value breakpoint. -;;; -;;; The :known-return convention is used by local functions. -;;; :known-return is currently not supported because we don't know -;;; where the values are passed. -;;; -(defun breakpoint-values (breakpoint) - "Return the list of return values for a return point." - (flet ((1st (sc) (sigcontext-object sc (car vm::register-arg-offsets)))) - (let ((sc (locally (declare (optimize (ext:inhibit-warnings 3))) - (alien:sap-alien *breakpoint-sigcontext* (* unix:ucontext)))) - (cl (di:breakpoint-what breakpoint))) - (ecase (di:code-location-kind cl) - (:single-value-return - (list (1st sc))) - (:known-return - (let ((info (di:breakpoint-info breakpoint))) - (if (vectorp info) - (known-return-point-values sc info) - (progn - ;;(break) - (list "<>" info))))) - (:unknown-return - (let ((mv-return-pc (di::compiled-code-location-pc cl))) - (if (= mv-return-pc *breakpoint-pc*) - (mv-function-end-breakpoint-values sc) - (list (1st sc))))))))) - -(defun mv-function-end-breakpoint-values (sigcontext) - (let ((sym (find-symbol - (symbol-name '#:function-end-breakpoint-values/standard) - :debug-internals))) - (cond (sym (funcall sym sigcontext)) - (t (di::get-function-end-breakpoint-values sigcontext))))) - -(defun debug-function-returns (debug-fun) - "Return the return style of DEBUG-FUN." - (let* ((cdfun (di::compiled-debug-function-compiler-debug-fun debug-fun))) - (c::compiled-debug-function-returns cdfun))) - -(define-condition breakpoint (simple-condition) - ((message :initarg :message :reader breakpoint.message) - (values :initarg :values :reader breakpoint.values)) - (:report (lambda (c stream) (princ (breakpoint.message c) stream)))) - -#+nil -(defimplementation condition-extras ((c breakpoint)) - ;; simply pop up the source buffer - `((:short-frame-source 0))) - -(defun signal-breakpoint (breakpoint frame) - "Signal a breakpoint condition for BREAKPOINT in FRAME. -Try to create a informative message." - (flet ((brk (values fstring &rest args) - (let ((msg (apply #'format nil fstring args)) - (debug:*stack-top-hint* frame)) - (break 'breakpoint :message msg :values values)))) - (with-struct (di::breakpoint- kind what) breakpoint - (case kind - (:code-location - (case (di:code-location-kind what) - ((:single-value-return :known-return :unknown-return) - (let ((values (breakpoint-values breakpoint))) - (brk values "Return value: ~{~S ~}" values))) - (t - #+(or) - (when (eq (di:code-location-kind what) :call-site) - (call-site-function breakpoint frame)) - (brk nil "Breakpoint: ~S ~S" - (di:code-location-kind what) - (di::compiled-code-location-pc what))))) - (:function-start - (brk nil "Function start breakpoint")) - (t (brk nil "Breakpoint: ~A in ~A" breakpoint frame)))))) - -#+nil -(defimplementation sldb-break-at-start (fname) - (let ((debug-fun (di:function-debug-function (coerce fname 'function)))) - (cond ((not debug-fun) - `(:error ,(format nil "~S has no debug-function" fname))) - (t - (flet ((hook (frame bp &optional args cookie) - (declare (ignore args cookie)) - (signal-breakpoint bp frame))) - (let ((bp (di:make-breakpoint #'hook debug-fun - :kind :function-start))) - (di:activate-breakpoint bp) - `(:ok ,(format nil "Set breakpoint in ~S" fname)))))))) - -(defun frame-cfp (frame) - "Return the Control-Stack-Frame-Pointer for FRAME." - (etypecase frame - (di::compiled-frame (di::frame-pointer frame)) - ((or di::interpreted-frame null) -1))) - -(defun frame-ip (frame) - "Return the (absolute) instruction pointer and the relative pc of FRAME." - (if (not frame) - -1 - (let ((debug-fun (di::frame-debug-function frame))) - (etypecase debug-fun - (di::compiled-debug-function - (let* ((code-loc (di:frame-code-location frame)) - (component (di::compiled-debug-function-component debug-fun)) - (pc (di::compiled-code-location-pc code-loc)) - (ip (sys:without-gcing - (sys:sap-int - (sys:sap+ (kernel:code-instructions component) pc))))) - (values ip pc))) - ((or di::bogus-debug-function di::interpreted-debug-function) - -1))))) - -(defun frame-registers (frame) - "Return the lisp registers CSP, CFP, IP, OCFP, LRA for FRAME-NUMBER." - (let* ((cfp (frame-cfp frame)) - (csp (frame-cfp (di::frame-up frame))) - (ip (frame-ip frame)) - (ocfp (frame-cfp (di::frame-down frame))) - (lra (frame-ip (di::frame-down frame)))) - (values csp cfp ip ocfp lra))) - -(defun print-frame-registers (frame-number) - (let ((frame (di::frame-real-frame (nth-frame frame-number)))) - (flet ((fixnum (p) (etypecase p - (integer p) - (sys:system-area-pointer (sys:sap-int p))))) - (apply #'format t "~ -CSP = ~X -CFP = ~X -IP = ~X -OCFP = ~X -LRA = ~X~%" (mapcar #'fixnum - (multiple-value-list (frame-registers frame))))))) - - -(defimplementation disassemble-frame (frame-number) - "Return a string with the disassembly of frames code." - (print-frame-registers frame-number) - (terpri) - (let* ((frame (di::frame-real-frame (nth-frame frame-number))) - (debug-fun (di::frame-debug-function frame))) - (etypecase debug-fun - (di::compiled-debug-function - (let* ((component (di::compiled-debug-function-component debug-fun)) - (fun (di:debug-function-function debug-fun))) - (if fun - (disassemble fun) - (disassem:disassemble-code-component component)))) - (di::bogus-debug-function - (format t "~%[Disassembling bogus frames not implemented]"))))) - - -;;;; Inspecting - -(defconstant +lowtag-symbols+ - '(vm:even-fixnum-type - vm:instance-pointer-type - vm:other-immediate-0-type - vm:list-pointer-type - vm:odd-fixnum-type - vm:function-pointer-type - vm:other-immediate-1-type - vm:other-pointer-type) - "Names of the constants that specify type tags. -The `symbol-value' of each element is a type tag.") - -(defconstant +header-type-symbols+ - (labels ((suffixp (suffix string) - (and (>= (length string) (length suffix)) - (string= string suffix :start1 (- (length string) - (length suffix))))) - (header-type-symbol-p (x) - (and (suffixp (symbol-name '#:-type) (symbol-name x)) - (not (member x +lowtag-symbols+)) - (boundp x) - (typep (symbol-value x) 'fixnum)))) - (remove-if-not #'header-type-symbol-p - (append (apropos-list (symbol-name '#:-type) :vm) - (apropos-list (symbol-name '#:-type) :bignum)))) - "A list of names of the type codes in boxed objects.") - -(defimplementation describe-primitive-type (object) - (with-output-to-string (*standard-output*) - (let* ((lowtag (kernel:get-lowtag object)) - (lowtag-symbol (find lowtag +lowtag-symbols+ :key #'symbol-value))) - (format t "lowtag: ~A" lowtag-symbol) - (when (member lowtag (list vm:other-pointer-type - vm:function-pointer-type - vm:other-immediate-0-type - vm:other-immediate-1-type - )) - (let* ((type (kernel:get-type object)) - (type-symbol (find type +header-type-symbols+ - :key #'symbol-value))) - (format t ", type: ~A" type-symbol)))))) - -(defmethod emacs-inspect ((o t)) - (cond ((di::indirect-value-cell-p o) - `("Value: " (:value ,(c:value-cell-ref o)))) - ((alien::alien-value-p o) - (inspect-alien-value o)) - (t - (scl-inspect o)))) - -(defun scl-inspect (o) - (destructuring-bind (text labeledp . parts) - (inspect::describe-parts o) - (list* (format nil "~A~%" text) - (if labeledp - (loop for (label . value) in parts - append (label-value-line label value)) - (loop for value in parts for i from 0 - append (label-value-line i value)))))) - -(defmethod emacs-inspect ((o function)) - (let ((header (kernel:get-type o))) - (cond ((= header vm:function-header-type) - (list* (format nil "~A is a function.~%" o) - (append (label-value-line* - ("Self" (kernel:%function-self o)) - ("Next" (kernel:%function-next o)) - ("Name" (kernel:%function-name o)) - ("Arglist" (kernel:%function-arglist o)) - ("Type" (kernel:%function-type o)) - ("Code" (kernel:function-code-header o))) - (list - (with-output-to-string (s) - (disassem:disassemble-function o :stream s)))))) - ((= header vm:closure-header-type) - (list* (format nil "~A is a closure.~%" o) - (append - (label-value-line "Function" (kernel:%closure-function o)) - `("Environment:" (:newline)) - (loop for i from 0 below (- (kernel:get-closure-length o) - (1- vm:closure-info-offset)) - append (label-value-line - i (kernel:%closure-index-ref o i)))))) - ((eval::interpreted-function-p o) - (scl-inspect o)) - (t - (call-next-method))))) - - -(defmethod emacs-inspect ((o kernel:code-component)) - (append - (label-value-line* - ("code-size" (kernel:%code-code-size o)) - ("entry-points" (kernel:%code-entry-points o)) - ("debug-info" (kernel:%code-debug-info o)) - ("trace-table-offset" (kernel:code-header-ref - o vm:code-trace-table-offset-slot))) - `("Constants:" (:newline)) - (loop for i from vm:code-constants-offset - below (kernel:get-header-data o) - append (label-value-line i (kernel:code-header-ref o i))) - `("Code:" (:newline) - , (with-output-to-string (s) - (cond ((kernel:%code-debug-info o) - (disassem:disassemble-code-component o :stream s)) - (t - (disassem:disassemble-memory - (disassem::align - (+ (logandc2 (kernel:get-lisp-obj-address o) - vm:lowtag-mask) - (* vm:code-constants-offset vm:word-bytes)) - (ash 1 vm:lowtag-bits)) - (ash (kernel:%code-code-size o) vm:word-shift) - :stream s))))))) - -(defmethod emacs-inspect ((o kernel:fdefn)) - (label-value-line* - ("name" (kernel:fdefn-name o)) - ("function" (kernel:fdefn-function o)) - ("raw-addr" (sys:sap-ref-32 - (sys:int-sap (kernel:get-lisp-obj-address o)) - (* vm:fdefn-raw-addr-slot vm:word-bytes))))) - -(defmethod emacs-inspect ((o array)) - (cond ((kernel:array-header-p o) - (list* (format nil "~A is an array.~%" o) - (label-value-line* - (:header (describe-primitive-type o)) - (:rank (array-rank o)) - (:fill-pointer (kernel:%array-fill-pointer o)) - (:fill-pointer-p (kernel:%array-fill-pointer-p o)) - (:elements (kernel:%array-available-elements o)) - (:data (kernel:%array-data-vector o)) - (:displacement (kernel:%array-displacement o)) - (:displaced-p (kernel:%array-displaced-p o)) - (:dimensions (array-dimensions o))))) - (t - (list* (format nil "~A is an simple-array.~%" o) - (label-value-line* - (:header (describe-primitive-type o)) - (:length (length o))))))) - -(defmethod emacs-inspect ((o simple-vector)) - (list* (format nil "~A is a vector.~%" o) - (append - (label-value-line* - (:header (describe-primitive-type o)) - (:length (c::vector-length o))) - (unless (eq (array-element-type o) 'nil) - (loop for i below (length o) - append (label-value-line i (aref o i))))))) - -(defun inspect-alien-record (alien) - (with-struct (alien::alien-value- sap type) alien - (with-struct (alien::alien-record-type- kind name fields) type - (append - (label-value-line* - (:sap sap) - (:kind kind) - (:name name)) - (loop for field in fields - append (let ((slot (alien::alien-record-field-name field))) - (label-value-line slot (alien:slot alien slot)))))))) - -(defun inspect-alien-pointer (alien) - (with-struct (alien::alien-value- sap type) alien - (label-value-line* - (:sap sap) - (:type type) - (:to (alien::deref alien))))) - -(defun inspect-alien-value (alien) - (typecase (alien::alien-value-type alien) - (alien::alien-record-type (inspect-alien-record alien)) - (alien::alien-pointer-type (inspect-alien-pointer alien)) - (t (scl-inspect alien)))) - -;;;; Profiling -(defimplementation profile (fname) - (eval `(profile:profile ,fname))) - -(defimplementation unprofile (fname) - (eval `(profile:unprofile ,fname))) - -(defimplementation unprofile-all () - (eval `(profile:unprofile)) - "All functions unprofiled.") - -(defimplementation profile-report () - (eval `(profile:report-time))) - -(defimplementation profile-reset () - (eval `(profile:reset-time)) - "Reset profiling counters.") - -(defimplementation profiled-functions () - profile:*timed-functions*) - -(defimplementation profile-package (package callers methods) - (profile:profile-all :package package - :callers-p callers - #+nil :methods #+nil methods)) - - -;;;; Multiprocessing - -(defimplementation spawn (fn &key name) - (thread:thread-create fn :name (or name "Anonymous"))) - -(defvar *thread-id-counter* 0) -(defvar *thread-id-counter-lock* (thread:make-lock "Thread ID counter")) - -(defimplementation thread-id (thread) - (thread:with-lock-held (*thread-id-counter-lock*) - (or (getf (thread:thread-plist thread) 'id) - (setf (getf (thread:thread-plist thread) 'id) - (incf *thread-id-counter*))))) - -(defimplementation find-thread (id) - (block find-thread - (thread:map-over-threads - #'(lambda (thread) - (when (eql (getf (thread:thread-plist thread) 'id) id) - (return-from find-thread thread)))))) - -(defimplementation thread-name (thread) - (princ-to-string (thread:thread-name thread))) - -(defimplementation thread-status (thread) - (let ((dynamic-values (thread::thread-dynamic-values thread))) - (if (zerop dynamic-values) "Exited" "Running"))) - -(defimplementation make-lock (&key name) - (thread:make-lock name)) - -(defimplementation call-with-lock-held (lock function) - (declare (type function function)) - (thread:with-lock-held (lock) (funcall function))) - -(defimplementation current-thread () - thread:*thread*) - -(defimplementation all-threads () - (let ((all-threads nil)) - (thread:map-over-threads #'(lambda (thread) (push thread all-threads))) - all-threads)) - -(defimplementation interrupt-thread (thread fn) - (thread:thread-interrupt thread #'(lambda () - (sys:with-interrupts - (funcall fn))))) - -(defimplementation kill-thread (thread) - (thread:destroy-thread thread)) - -(defimplementation thread-alive-p (thread) - (not (zerop (thread::thread-dynamic-values thread)))) - -(defvar *mailbox-lock* (thread:make-lock "Mailbox lock" :interruptible nil)) - -(defstruct (mailbox) - (lock (thread:make-lock "Thread mailbox" :type :error-check - :interruptible nil) - :type thread:error-check-lock) - (queue '() :type list)) - -(defun mailbox (thread) - "Return 'thread's mailbox." - (sys:without-interrupts - (thread:with-lock-held (*mailbox-lock*) - (or (getf (thread:thread-plist thread) 'mailbox) - (setf (getf (thread:thread-plist thread) 'mailbox) - (make-mailbox)))))) - -(defimplementation send (thread message) - (let* ((mbox (mailbox thread)) - (lock (mailbox-lock mbox))) - (sys:without-interrupts - (thread:with-lock-held (lock "Mailbox Send") - (setf (mailbox-queue mbox) (nconc (mailbox-queue mbox) - (list message))))) - (mp:process-wakeup thread))) - -#+nil -(defimplementation receive () - (receive-if (constantly t))) - -(defimplementation receive-if (test &optional timeout) - (let ((mbox (mailbox thread:*thread*))) - (assert (or (not timeout) (eq timeout t))) - (loop - (check-slime-interrupts) - (sys:without-interrupts - (mp:with-lock-held ((mailbox-lock mbox)) - (let* ((q (mailbox-queue mbox)) - (tail (member-if test q))) - (when tail - (setf (mailbox-queue mbox) - (nconc (ldiff q tail) (cdr tail))) - (return (car tail)))))) - (when (eq timeout t) (return (values nil t))) - (mp:process-wait-with-timeout - "Mailbox read wait" 0.5 (lambda () (some test (mailbox-queue mbox))))))) - - - -(defimplementation emacs-connected ()) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;Trace implementations -;; In SCL, we have: -;; (trace ) -;; (trace (method ? (+))) -;; (trace :methods t ') ;;to trace all methods of the gf -;; can be a normal name or a (setf name) - -(defun tracedp (spec) - (member spec (eval '(trace)) :test #'equal)) - -(defun toggle-trace-aux (spec &rest options) - (cond ((tracedp spec) - (eval `(untrace ,spec)) - (format nil "~S is now untraced." spec)) - (t - (eval `(trace ,spec ,@options)) - (format nil "~S is now traced." spec)))) - -(defimplementation toggle-trace (spec) - (ecase (car spec) - ((setf) - (toggle-trace-aux spec)) - ((:defgeneric) - (let ((name (second spec))) - (toggle-trace-aux name :methods name))) - ((:defmethod) - nil) - ((:call) - (destructuring-bind (caller callee) (cdr spec) - (toggle-trace-aux (process-fspec callee) - :wherein (list (process-fspec caller))))))) - -(defun process-fspec (fspec) - (cond ((consp fspec) - (ecase (first fspec) - ((:defun :defgeneric) (second fspec)) - ((:defmethod) - `(method ,(second fspec) ,@(third fspec) ,(fourth fspec))) - ;; this isn't actually supported - ((:labels) `(labels ,(process-fspec (second fspec)) ,(third fspec))) - ((:flet) `(flet ,(process-fspec (second fspec)) ,(third fspec))))) - (t - fspec))) - -;;; Weak datastructures - -;;; Not implemented in SCL. -(defimplementation make-weak-key-hash-table (&rest args) - (apply #'make-hash-table :weak-p t args)) diff --git a/elpa/slime-20200414.1444/swank/source-file-cache.lisp b/elpa/slime-20200414.1444/swank/source-file-cache.lisp deleted file mode 100644 index e639ea11..00000000 --- a/elpa/slime-20200414.1444/swank/source-file-cache.lisp +++ /dev/null @@ -1,136 +0,0 @@ -;;;; Source-file cache -;;; -;;; To robustly find source locations in CMUCL and SBCL it's useful to -;;; have the exact source code that the loaded code was compiled from. -;;; In this source we can accurately find the right location, and from -;;; that location we can extract a "snippet" of code to show what the -;;; definition looks like. Emacs can use this snippet in a best-match -;;; search to locate the right definition, which works well even if -;;; the buffer has been modified. -;;; -;;; The idea is that if a definition previously started with -;;; `(define-foo bar' then it probably still does. -;;; -;;; Whenever we see that the file on disk has the same -;;; `file-write-date' as a location we're looking for we cache the -;;; whole file inside Lisp. That way we will still have the matching -;;; version even if the file is later modified on disk. If the file is -;;; later recompiled and reloaded then we replace our cache entry. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. - -(defpackage swank/source-file-cache - (:use cl) - (:import-from swank/backend - defimplementation buffer-first-change - guess-external-format - find-external-format) - (:export - get-source-code - source-cache-get ;FIXME: isn't it odd that both are exported? - - *source-snippet-size* - read-snippet - read-snippet-from-string - )) - -(in-package swank/source-file-cache) - -(defvar *cache-sourcecode* t - "When true complete source files are cached. -The cache is used to keep known good copies of the source text which -correspond to the loaded code. Finding definitions is much more -reliable when the exact source is available, so we cache it in case it -gets edited on disk later.") - -(defvar *source-file-cache* (make-hash-table :test 'equal) - "Cache of source file contents. -Maps from truename to source-cache-entry structure.") - -(defstruct (source-cache-entry - (:conc-name source-cache-entry.) - (:constructor make-source-cache-entry (text date))) - text date) - -(defimplementation buffer-first-change (filename) - "Load a file into the cache when the user modifies its buffer. -This is a win if the user then saves the file and tries to M-. into it." - (unless (source-cached-p filename) - (ignore-errors - (source-cache-get filename (file-write-date filename)))) - nil) - -(defun get-source-code (filename code-date) - "Return the source code for FILENAME as written on DATE in a string. -If the exact version cannot be found then return the current one from disk." - (or (source-cache-get filename code-date) - (read-file filename))) - -(defun source-cache-get (filename date) - "Return the source code for FILENAME as written on DATE in a string. -Return NIL if the right version cannot be found." - (when *cache-sourcecode* - (let ((entry (gethash filename *source-file-cache*))) - (cond ((and entry (equal date (source-cache-entry.date entry))) - ;; Cache hit. - (source-cache-entry.text entry)) - ((or (null entry) - (not (equal date (source-cache-entry.date entry)))) - ;; Cache miss. - (if (equal (file-write-date filename) date) - ;; File on disk has the correct version. - (let ((source (read-file filename))) - (setf (gethash filename *source-file-cache*) - (make-source-cache-entry source date)) - source) - nil)))))) - -(defun source-cached-p (filename) - "Is any version of FILENAME in the source cache?" - (if (gethash filename *source-file-cache*) t)) - -(defun read-file (filename) - "Return the entire contents of FILENAME as a string." - (with-open-file (s filename :direction :input - :external-format (or (guess-external-format filename) - (find-external-format "latin-1") - :default)) - (let* ((string (make-string (file-length s))) - (length (read-sequence string s))) - (subseq string 0 length)))) - -;;;; Snippets - -(defvar *source-snippet-size* 256 - "Maximum number of characters in a snippet of source code. -Snippets at the beginning of definitions are used to tell Emacs what -the definitions looks like, so that it can accurately find them by -text search.") - -(defun read-snippet (stream &optional position) - "Read a string of upto *SOURCE-SNIPPET-SIZE* characters from STREAM. -If POSITION is given, set the STREAM's file position first." - (when position - (file-position stream position)) - #+sbcl (skip-comments-and-whitespace stream) - (read-upto-n-chars stream *source-snippet-size*)) - -(defun read-snippet-from-string (string &optional position) - (with-input-from-string (s string) - (read-snippet s position))) - -(defun skip-comments-and-whitespace (stream) - (case (peek-char nil stream nil nil) - ((#\Space #\Tab #\Newline #\Linefeed #\Page) - (read-char stream) - (skip-comments-and-whitespace stream)) - (#\; - (read-line stream) - (skip-comments-and-whitespace stream)))) - -(defun read-upto-n-chars (stream n) - "Return a string of upto N chars from STREAM." - (let* ((string (make-string n)) - (chars (read-sequence string stream))) - (subseq string 0 chars))) diff --git a/elpa/slime-20200414.1444/swank/source-path-parser.lisp b/elpa/slime-20200414.1444/swank/source-path-parser.lisp deleted file mode 100644 index f7f29f13..00000000 --- a/elpa/slime-20200414.1444/swank/source-path-parser.lisp +++ /dev/null @@ -1,242 +0,0 @@ -;;;; Source-paths - -;;; CMUCL/SBCL use a data structure called "source-path" to locate -;;; subforms. The compiler assigns a source-path to each form in a -;;; compilation unit. Compiler notes usually contain the source-path -;;; of the error location. -;;; -;;; Compiled code objects don't contain source paths, only the -;;; "toplevel-form-number" and the (sub-) "form-number". To get from -;;; the form-number to the source-path we need the entire toplevel-form -;;; (i.e. we have to read the source code). CMUCL has already some -;;; utilities to do this translation, but we use some extended -;;; versions, because we need more exact position info. Apparently -;;; Hemlock is happy with the position of the toplevel-form; we also -;;; need the position of subforms. -;;; -;;; We use a special readtable to get the positions of the subforms. -;;; The readtable stores the start and end position for each subform in -;;; hashtable for later retrieval. -;;; -;;; This code has been placed in the Public Domain. All warranties -;;; are disclaimed. - -;;; Taken from swank-cmucl.lisp, by Helmut Eller - -(defpackage swank/source-path-parser - (:use cl) - (:export - read-source-form - source-path-string-position - source-path-file-position - source-path-source-position - - sexp-in-bounds-p - sexp-ref) - (:shadow ignore-errors)) - -(in-package swank/source-path-parser) - -;; Some test to ensure the required conformance -(let ((rt (copy-readtable nil))) - (assert (or (not (get-macro-character #\space rt)) - (nth-value 1 (get-macro-character #\space rt)))) - (assert (not (get-macro-character #\\ rt)))) - -(eval-when (:compile-toplevel) - (defmacro ignore-errors (&rest forms) - ;;`(progn . ,forms) ; for debugging - `(cl:ignore-errors . ,forms))) - -(defun make-sharpdot-reader (orig-sharpdot-reader) - (lambda (s c n) - ;; We want things like M-. to work regardless of any #.-fu in - ;; the source file that is to be visited. (For instance, when a - ;; file contains #. forms referencing constants that do not - ;; currently exist in the image.) - (ignore-errors (funcall orig-sharpdot-reader s c n)))) - -(defun make-source-recorder (fn source-map) - "Return a macro character function that does the same as FN, but -additionally stores the result together with the stream positions -before and after of calling FN in the hashtable SOURCE-MAP." - (lambda (stream char) - (let ((start (1- (file-position stream))) - (values (multiple-value-list (funcall fn stream char))) - (end (file-position stream))) - #+(or) - (format t "[~D \"~{~A~^, ~}\" ~D ~D ~S]~%" - start values end (char-code char) char) - (when values - (destructuring-bind (&optional existing-start &rest existing-end) - (car (gethash (car values) source-map)) - ;; Some macros may return what a sub-call to another macro - ;; produced, e.g. "#+(and) (a)" may end up saving (a) twice, - ;; once from #\# and once from #\(. If the saved form - ;; is a subform, don't save it again. - (unless (and existing-start existing-end - (<= start existing-start end) - (<= start existing-end end)) - (push (cons start end) (gethash (car values) source-map))))) - (values-list values)))) - -(defun make-source-recording-readtable (readtable source-map) - (declare (type readtable readtable) (type hash-table source-map)) - "Return a source position recording copy of READTABLE. -The source locations are stored in SOURCE-MAP." - (flet ((install-special-sharpdot-reader (rt) - (let ((fun (ignore-errors - (get-dispatch-macro-character #\# #\. rt)))) - (when fun - (let ((wrapper (make-sharpdot-reader fun))) - (set-dispatch-macro-character #\# #\. wrapper rt))))) - (install-wrappers (rt) - (dotimes (code 128) - (let ((char (code-char code))) - (multiple-value-bind (fun nt) (get-macro-character char rt) - (when fun - (let ((wrapper (make-source-recorder fun source-map))) - (set-macro-character char wrapper nt rt)))))))) - (let ((rt (copy-readtable readtable))) - (install-special-sharpdot-reader rt) - (install-wrappers rt) - rt))) - -;; FIXME: try to do this with *READ-SUPPRESS* = t to avoid interning. -;; Should be possible as we only need the right "list structure" and -;; not the right atoms. -(defun read-and-record-source-map (stream) - "Read the next object from STREAM. -Return the object together with a hashtable that maps -subexpressions of the object to stream positions." - (let* ((source-map (make-hash-table :test #'eq)) - (*readtable* (make-source-recording-readtable *readtable* source-map)) - (*read-suppress* nil) - (start (file-position stream)) - (form (ignore-errors (read stream))) - (end (file-position stream))) - ;; ensure that at least FORM is in the source-map - (unless (gethash form source-map) - (push (cons start end) (gethash form source-map))) - (values form source-map))) - -(defun starts-with-p (string prefix) - (declare (type string string prefix)) - (not (mismatch string prefix - :end1 (min (length string) (length prefix)) - :test #'char-equal))) - -(defun extract-package (line) - (declare (type string line)) - (let ((name (cadr (read-from-string line)))) - (find-package name))) - -#+(or) -(progn - (assert (extract-package "(in-package cl)")) - (assert (extract-package "(cl:in-package cl)")) - (assert (extract-package "(in-package \"CL\")")) - (assert (extract-package "(in-package #:cl)"))) - -;; FIXME: do something cleaner than this. -(defun readtable-for-package (package) - ;; KLUDGE: due to the load order we can't reference the swank - ;; package. - (funcall (read-from-string "swank::guess-buffer-readtable") - (string-upcase (package-name package)))) - -;; Search STREAM for a "(in-package ...)" form. Use that to derive -;; the values for *PACKAGE* and *READTABLE*. -;; -;; IDEA: move GUESS-READER-STATE to swank.lisp so that all backends -;; use the same heuristic and to avoid the need to access -;; swank::guess-buffer-readtable from here. -(defun guess-reader-state (stream) - (let* ((point (file-position stream)) - (pkg *package*)) - (file-position stream 0) - (loop for line = (read-line stream nil nil) do - (when (not line) (return)) - (when (or (starts-with-p line "(in-package ") - (starts-with-p line "(cl:in-package ")) - (let ((p (extract-package line))) - (when p (setf pkg p))) - (return))) - (file-position stream point) - (values (readtable-for-package pkg) pkg))) - -(defun skip-whitespace (stream) - (peek-char t stream nil nil)) - -;; Skip over N toplevel forms. -(defun skip-toplevel-forms (n stream) - (let ((*read-suppress* t)) - (dotimes (i n) - (read stream)) - (skip-whitespace stream))) - -(defun read-source-form (n stream) - "Read the Nth toplevel form number with source location recording. -Return the form and the source-map." - (multiple-value-bind (*readtable* *package*) (guess-reader-state stream) - (let (#+sbcl - (*features* (append *features* - (symbol-value (find-symbol "+INTERNAL-FEATURES+" 'sb-impl))))) - (skip-toplevel-forms n stream) - (read-and-record-source-map stream)))) - -(defun source-path-stream-position (path stream) - "Search the source-path PATH in STREAM and return its position." - (check-source-path path) - (destructuring-bind (tlf-number . path) path - (multiple-value-bind (form source-map) (read-source-form tlf-number stream) - (source-path-source-position (cons 0 path) form source-map)))) - -(defun check-source-path (path) - (unless (and (consp path) - (every #'integerp path)) - (error "The source-path ~S is not valid." path))) - -(defun source-path-string-position (path string) - (with-input-from-string (s string) - (source-path-stream-position path s))) - -(defun source-path-file-position (path filename) - ;; We go this long way round, and don't directly operate on the file - ;; stream because FILE-POSITION (used above) is not totally savy even - ;; on file character streams; on SBCL, FILE-POSITION returns the binary - ;; offset, and not the character offset---screwing up on Unicode. - (let ((toplevel-number (first path)) - (buffer)) - (with-open-file (file filename) - (skip-toplevel-forms (1+ toplevel-number) file) - (let ((endpos (file-position file))) - (setq buffer (make-array (list endpos) :element-type 'character - :initial-element #\Space)) - (assert (file-position file 0)) - (read-sequence buffer file :end endpos))) - (source-path-string-position path buffer))) - -(defgeneric sexp-in-bounds-p (sexp i) - (:method ((list list) i) - (< i (loop for e on list - count t))) - (:method ((sexp t) i) nil)) - -(defgeneric sexp-ref (sexp i) - (:method ((s list) i) (elt s i))) - -(defun source-path-source-position (path form source-map) - "Return the start position of PATH from FORM and SOURCE-MAP. All -subforms along the path are considered and the start and end position -of the deepest (i.e. smallest) possible form is returned." - ;; compute all subforms along path - (let ((forms (loop for i in path - for f = form then (if (sexp-in-bounds-p f i) - (sexp-ref f i)) - collect f))) - ;; select the first subform present in source-map - (loop for form in (nreverse forms) - for ((start . end) . rest) = (gethash form source-map) - when (and start end (not rest)) - return (return (values start end))))) diff --git a/elpa/slime-20200414.1444/xref.lisp b/elpa/slime-20200414.1444/xref.lisp deleted file mode 100644 index e09a1504..00000000 --- a/elpa/slime-20200414.1444/xref.lisp +++ /dev/null @@ -1,2906 +0,0 @@ -;;; -*- Mode: LISP; Package: XREF; Syntax: Common-lisp; -*- -;;; Mon Jan 21 16:21:20 1991 by Mark Kantrowitz -;;; xref.lisp - -;;; **************************************************************** -;;; List Callers: A Static Analysis Cross Referencing Tool for Lisp -;;; **************************************************************** -;;; -;;; The List Callers system is a portable Common Lisp cross referencing -;;; utility. It grovels over a set of files and compiles a database of the -;;; locations of all references for each symbol used in the files. -;;; List Callers is similar to the Symbolics Who-Calls and the -;;; Xerox Masterscope facilities. -;;; -;;; When you change a function or variable definition, it can be useful -;;; to know its callers, in order to update each of them to the new -;;; definition. Similarly, having a graphic display of the structure -;;; (e.g., call graph) of a program can help make undocumented code more -;;; understandable. This static code analyzer facilitates both capabilities. -;;; The database compiled by xref is suitable for viewing by a graphical -;;; browser. (Note: the reference graph is not necessarily a DAG. Since many -;;; graphical browsers assume a DAG, this will lead to infinite loops. -;;; Some code which is useful in working around this problem is included, -;;; as well as a sample text-indenting outliner and an interface to Bates' -;;; PSGraph Postscript Graphing facility.) -;;; -;;; Written by Mark Kantrowitz, July 1990. -;;; -;;; Address: School of Computer Science -;;; Carnegie Mellon University -;;; Pittsburgh, PA 15213 -;;; -;;; Copyright (c) 1990. All rights reserved. -;;; -;;; See general license below. -;;; - -;;; **************************************************************** -;;; General License Agreement and Lack of Warranty ***************** -;;; **************************************************************** -;;; -;;; This software is distributed in the hope that it will be useful (both -;;; in and of itself and as an example of lisp programming), but WITHOUT -;;; ANY WARRANTY. The author(s) do not accept responsibility to anyone for -;;; the consequences of using it or for whether it serves any particular -;;; purpose or works at all. No warranty is made about the software or its -;;; performance. -;;; -;;; Use and copying of this software and the preparation of derivative -;;; works based on this software are permitted, so long as the following -;;; conditions are met: -;;; o The copyright notice and this entire notice are included intact -;;; and prominently carried on all copies and supporting documentation. -;;; o No fees or compensation are charged for use, copies, or -;;; access to this software. You may charge a nominal -;;; distribution fee for the physical act of transferring a -;;; copy, but you may not charge for the program itself. -;;; o If you modify this software, you must cause the modified -;;; file(s) to carry prominent notices (a Change Log) -;;; describing the changes, who made the changes, and the date -;;; of those changes. -;;; o Any work distributed or published that in whole or in part -;;; contains or is a derivative of this software or any part -;;; thereof is subject to the terms of this agreement. The -;;; aggregation of another unrelated program with this software -;;; or its derivative on a volume of storage or distribution -;;; medium does not bring the other program under the scope -;;; of these terms. -;;; o Permission is granted to manufacturers and distributors of -;;; lisp compilers and interpreters to include this software -;;; with their distribution. -;;; -;;; This software is made available AS IS, and is distributed without -;;; warranty of any kind, either expressed or implied. -;;; -;;; In no event will the author(s) or their institutions be liable to you -;;; for damages, including lost profits, lost monies, or other special, -;;; incidental or consequential damages arising out of or in connection -;;; with the use or inability to use (including but not limited to loss of -;;; data or data being rendered inaccurate or losses sustained by third -;;; parties or a failure of the program to operate as documented) the -;;; program, even if you have been advised of the possibility of such -;;; damanges, or for any claim by any other party, whether in an action of -;;; contract, negligence, or other tortious action. -;;; -;;; The current version of this software and a variety of related utilities -;;; may be obtained by anonymous ftp from ftp.cs.cmu.edu in the directory -;;; user/ai/lang/lisp/code/tools/xref/ -;;; -;;; Please send bug reports, comments, questions and suggestions to -;;; mkant@cs.cmu.edu. We would also appreciate receiving any changes -;;; or improvements you may make. -;;; -;;; If you wish to be added to the Lisp-Utilities@cs.cmu.edu mailing list, -;;; send email to Lisp-Utilities-Request@cs.cmu.edu with your name, email -;;; address, and affiliation. This mailing list is primarily for -;;; notification about major updates, bug fixes, and additions to the lisp -;;; utilities collection. The mailing list is intended to have low traffic. -;;; - -;;; ******************************** -;;; Change Log ********************* -;;; ******************************** -;;; -;;; 27-FEB-91 mk Added insert arg to psgraph-xref to allow the postscript -;;; graphs to be inserted in Scribe documents. -;;; 21-FEB-91 mk Added warning if not compiled. -;;; 07-FEB-91 mk Fixed bug in record-callers with regard to forms at -;;; toplevel. -;;; 21-JAN-91 mk Added file xref-test.lisp to test xref. -;;; 16-JAN-91 mk Added definition WHO-CALLS to parallel the Symbolics syntax. -;;; 16-JAN-91 mk Added macroexpansion capability to record-callers. Also -;;; added parameter *handle-macro-forms*, defaulting to T. -;;; 16-JAN-91 mk Modified print-caller-tree and related functions -;;; to allow the user to specify root nodes. If the user -;;; doesn't specify them, it will default to all root -;;; nodes, as before. -;;; 16-JAN-91 mk Added parameter *default-graphing-mode* to specify -;;; the direction of the graphing. Either :call-graph, -;;; where the children of a node are those functions called -;;; by the node, or :caller-graph where the children of a -;;; node are the callers of the node. :call-graph is the -;;; default. -;;; 16-JAN-91 mk Added parameter *indent-amount* to control the indentation -;;; in print-indented-tree. -;;; 16-JUL-90 mk Functions with argument lists of () were being ignored -;;; because of a (when form) wrapped around the body of -;;; record-callers. Then intent of (when form) was as an extra -;;; safeguard against infinite looping. This wasn't really -;;; necessary, so it has been removed. -;;; 16-JUL-90 mk PSGraph-XREF now has keyword arguments, instead of -;;; optionals. -;;; 16-JUL-90 mk Added PRINT-CLASS-HIERARCHY to use psgraph to graph the -;;; CLOS class hierarchy. This really doesn't belong here, -;;; and should be moved to psgraph.lisp as an example of how -;;; to use psgraph. -;;; 16-JUL-90 mk Fixed several caller patterns. The pattern for member -;;; had an error which caused many references to be missed. -;;; 16-JUL-90 mk Added ability to save/load processed databases. -;;; 5-JUL-91 mk Fixed warning of needing compilation to occur only when the -;;; source is loaded. -;;; 20-SEP-93 mk Added fix from Peter Norvig to allow Xref to xref itself. -;;; The arg to macro-function must be a symbol. -;;; 7-APR-12 heller Break lines at 80 columns. - -;;; ******************************** -;;; To Do ************************** -;;; ******************************** -;;; -;;; Verify that: -;;; o null forms don't cause it to infinite loop. -;;; o nil matches against null argument lists. -;;; o declarations and doc are being ignored. -;;; -;;; Would be nice if in addition to showing callers of a function, it -;;; displayed the context of the calls to the function (e.g., the -;;; immediately surrounding form). This entails storing entries of -;;; the form (symbol context*) in the database and augmenting -;;; record-callers to keep the context around. The only drawbacks is -;;; that it would cons a fair bit. If we do this, we should store -;;; additional information as well in the database, such as the caller -;;; pattern type (e.g., variable vs. function). -;;; -;;; Write a translator from BNF (at least as much of BNF as is used -;;; in CLtL2), to the format used here. -;;; -;;; Should automatically add new patterns for new functions and macros -;;; based on their arglists. Probably requires much more than this -;;; simple code walker, so there isn't much we can do. -;;; -;;; Defmacro is a problem, because it often hides internal function -;;; calls within backquote and quote, which we normally ignore. If -;;; we redefine QUOTE's pattern so that it treats the arg like a FORM, -;;; we'll probably get them (though maybe the syntax will be mangled), -;;; but most likely a lot of spurious things as well. -;;; -;;; Define an operation for Defsystem which will run XREF-FILE on the -;;; files of the system. Or yet simpler, when XREF sees a LOAD form -;;; for which the argument is a string, tries to recursively call -;;; XREF-FILE on the specified file. Then one could just XREF-FILE -;;; the file which loads the system. (This should be a program -;;; parameter.) -;;; -;;; Have special keywords which the user may place in a file to have -;;; XREF-FILE ignore a region. -;;; -;;; Should we distinguish flet and labels from defun? I.e., note that -;;; flet's definitions are locally defined, instead of just lumping -;;; them in with regular definitions. -;;; -;;; Add patterns for series, loop macro. -;;; -;;; Need to integrate the variable reference database with the other -;;; databases, yet maintain separation. So we can distinguish all -;;; the different types of variable and function references, without -;;; multiplying databases. -;;; -;;; Would pay to comment record-callers and record-callers* in more -;;; depth. -;;; -;;; (&OPTIONAL &REST &KEY &AUX &BODY &WHOLE &ALLOW-OTHER-KEYS &ENVIRONMENT) - -;;; ******************************** -;;; Notes ************************** -;;; ******************************** -;;; -;;; XREF has been tested (successfully) in the following lisps: -;;; CMU Common Lisp (M2.9 15-Aug-90, Compiler M1.8 15-Aug-90) -;;; Macintosh Allegro Common Lisp (1.3.2) -;;; ExCL (Franz Allegro CL 3.1.12 [DEC 3100] 3/30/90) -;;; Lucid CL (Version 2.1 6-DEC-87) -;;; -;;; XREF has been tested (unsuccessfully) in the following lisps: -;;; Ibuki Common Lisp (01/01, October 15, 1987) -;;; - if interpreted, runs into stack overflow -;;; - does not compile (tried ibcl on Suns, PMAXes and RTs) -;;; seems to be due to a limitation in the c compiler. -;;; -;;; XREF needs to be tested in the following lisps: -;;; Symbolics Common Lisp (8.0) -;;; Lucid Common Lisp (3.0, 4.0) -;;; KCL (June 3, 1987 or later) -;;; AKCL (1.86, June 30, 1987 or later) -;;; TI (Release 4.1 or later) -;;; Golden Common Lisp (3.1 IBM-PC) -;;; VAXLisp (2.0, 3.1) -;;; HP Common Lisp (same as Lucid?) -;;; Procyon Common Lisp - - -;;; **************************************************************** -;;; Documentation ************************************************** -;;; **************************************************************** -;;; -;;; XREF analyzes a user's program, determining which functions call a -;;; given function, and the location of where variables are bound/assigned -;;; and used. The user may retrieve this information for either a single -;;; symbol, or display the call graph of portions of the program -;;; (including the entire program). This allows the programmer to debug -;;; and document the program's structure. -;;; -;;; XREF is primarily intended for analyzing large programs, where it is -;;; difficult, if not impossible, for the programmer to grasp the structure -;;; of the whole program. Nothing precludes using XREF for smaller programs, -;;; where it can be useful for inspecting the relationships between pieces -;;; of the program and for documenting the program. -;;; -;;; Two aspects of the Lisp programming language greatly simplify the -;;; analysis of Lisp programs: -;;; o Lisp programs are naturally represented as data. -;;; Successive definitions from a file are easily read in -;;; as list structure. -;;; o The basic syntax of Lisp is uniform. A list program -;;; consists of a set of nested forms, where each form is -;;; a list whose car is a tag (e.g., function name) that -;;; specifies the structure of the rest of the form. -;;; Thus Lisp programs, when represented as data, can be considered to be -;;; parse trees. Given a grammar of syntax patterns for the language, XREF -;;; recursively descends the parse tree for a given definition, computing -;;; a set of relations that hold for the definition at each node in the -;;; tree. For example, one kind of relation is that the function defined -;;; by the definition calls the functions in its body. The relations are -;;; stored in a database for later examination by the user. -;;; -;;; While XREF currently only works for programs written in Lisp, it could -;;; be extended to other programming languages by writing a function to -;;; generate parse trees for definitions in that language, and a core -;;; set of patterns for the language's syntax. -;;; -;;; Since XREF normally does a static syntactic analysis of the program, -;;; it does not detect references due to the expansion of a macro definition. -;;; To do this in full generality XREF would have to have knowledge about the -;;; semantics of the program (e.g., macros which call other functions to -;;; do the expansion). This entails either modifying the compiler to -;;; record the relationships (e.g., Symbolics Who-Calls Database) or doing -;;; a walk of loaded code and macroexpanding as needed (PCL code walker). -;;; The former is not portable, while the latter requires that the code -;;; used by macros be loaded and in working order. On the other hand, then -;;; we would need no special knowledge about macros (excluding the 24 special -;;; forms of Lisp). -;;; -;;; Parameters may be set to enable macro expansion in XREF. Then XREF -;;; will expand any macros for which it does not have predefined patterns. -;;; (For example, most Lisps will implement dolist as a macro. Since XREF -;;; has a pattern defined for dolist, it will not call macroexpand-1 on -;;; a form whose car is dolist.) For this to work properly, the code must -;;; be loaded before being processed by XREF, and XREF's parameters should -;;; be set so that it processes forms in their proper packages. -;;; -;;; If macro expansion is disabled, the default rules for handling macro -;;; references may not be sufficient for some user-defined macros, because -;;; macros allow a variety of non-standard syntactic extensions to the -;;; language. In this case, the user may specify additional templates in -;;; a manner similar to that in which the core Lisp grammar was specified. -;;; - - -;;; ******************************** -;;; User Guide ********************* -;;; ******************************** -;;; ----- -;;; The following functions are called to cross reference the source files. -;;; -;;; XREF-FILES (&rest files) [FUNCTION] -;;; Grovels over the lisp code located in source file FILES, using -;;; xref-file. -;;; -;;; XREF-FILE (filename &optional clear-tables verbose) [Function] -;;; Cross references the function and variable calls in FILENAME by -;;; walking over the source code located in the file. Defaults type of -;;; filename to ".lisp". Chomps on the code using record-callers and -;;; record-callers*. If CLEAR-TABLES is T (the default), it clears the -;;; callers database before processing the file. Specify CLEAR-TABLES as -;;; nil to append to the database. If VERBOSE is T (the default), prints -;;; out the name of the file, one progress dot for each form processed, -;;; and the total number of forms. -;;; -;;; ----- -;;; The following functions display information about the uses of the -;;; specified symbol as a function, variable, or constant. -;;; -;;; LIST-CALLERS (symbol) [FUNCTION] -;;; Lists all functions which call SYMBOL as a function (function -;;; invocation). -;;; -;;; LIST-READERS (symbol) [FUNCTION] -;;; Lists all functions which refer to SYMBOL as a variable -;;; (variable reference). -;;; -;;; LIST-SETTERS (symbol) [FUNCTION] -;;; Lists all functions which bind/set SYMBOL as a variable -;;; (variable mutation). -;;; -;;; LIST-USERS (symbol) [FUNCTION] -;;; Lists all functions which use SYMBOL as a variable or function. -;;; -;;; WHO-CALLS (symbol &optional how) [FUNCTION] -;;; Lists callers of symbol. HOW may be :function, :reader, :setter, -;;; or :variable." -;;; -;;; WHAT-FILES-CALL (symbol) [FUNCTION] -;;; Lists names of files that contain uses of SYMBOL -;;; as a function, variable, or constant. -;;; -;;; SOURCE-FILE (symbol) [FUNCTION] -;;; Lists the names of files in which SYMBOL is defined/used. -;;; -;;; LIST-CALLEES (symbol) [FUNCTION] -;;; Lists names of functions and variables called by SYMBOL. -;;; -;;; ----- -;;; The following functions may be useful for viewing the database and -;;; debugging the calling patterns. -;;; -;;; *LAST-FORM* () [VARIABLE] -;;; The last form read from the file. Useful for figuring out what went -;;; wrong when xref-file drops into the debugger. -;;; -;;; *XREF-VERBOSE* t [VARIABLE] -;;; When T, xref-file(s) prints out the names of the files it looks at, -;;; progress dots, and the number of forms read. -;;; -;;; *TYPES-TO-IGNORE* (quote (:lisp :lisp2)) [VARIABLE] -;;; Default set of caller types (as specified in the patterns) to ignore -;;; in the database handling functions. :lisp is CLtL 1st edition, -;;; :lisp2 is additional patterns from CLtL 2nd edition. -;;; -;;; *HANDLE-PACKAGE-FORMS* () [VARIABLE] -;;; When non-NIL, and XREF-FILE sees a package-setting form like -;;; IN-PACKAGE, sets the current package to the specified package by -;;; evaluating the form. When done with the file, xref-file resets the -;;; package to its original value. In some of the displaying functions, -;;; when this variable is non-NIL one may specify that all symbols from a -;;; particular set of packages be ignored. This is only useful if the -;;; files use different packages with conflicting names. -;;; -;;; *HANDLE-FUNCTION-FORMS* t [VARIABLE] -;;; When T, XREF-FILE tries to be smart about forms which occur in -;;; a function position, such as lambdas and arbitrary Lisp forms. -;;; If so, it recursively calls record-callers with pattern 'FORM. -;;; If the form is a lambda, makes the caller a caller of -;;; :unnamed-lambda. -;;; -;;; *HANDLE-MACRO-FORMS* t [VARIABLE] -;;; When T, if the file was loaded before being processed by XREF, and -;;; the car of a form is a macro, it notes that the parent calls the -;;; macro, and then calls macroexpand-1 on the form. -;;; -;;; *DEFAULT-GRAPHING-MODE* :call-graph [VARIABLE] -;;; Specifies whether we graph up or down. If :call-graph, the children -;;; of a node are the functions it calls. If :caller-graph, the -;;; children of a node are the functions that call it. -;;; -;;; *INDENT-AMOUNT* 3 [VARIABLE] -;;; Number of spaces to indent successive levels in PRINT-INDENTED-TREE. -;;; -;;; DISPLAY-DATABASE (&optional database types-to-ignore) [FUNCTION] -;;; Prints out the name of each symbol and all its callers. Specify -;;; database :callers (the default) to get function call references, -;;; :file to the get files in which the symbol is called, :readers to get -;;; variable references, and :setters to get variable binding and -;;; assignments. Ignores functions of types listed in types-to-ignore. -;;; -;;; PRINT-CALLER-TREES (&key (mode *default-graphing-mode*) [FUNCTION] -;;; (types-to-ignore *types-to-ignore*) -;;; compact root-nodes) -;;; Prints the calling trees (which may actually be a full graph and not -;;; necessarily a DAG) as indented text trees using -;;; PRINT-INDENTED-TREE. MODE is :call-graph for trees where the children -;;; of a node are the functions called by the node, or :caller-graph for -;;; trees where the children of a node are the functions the node calls. -;;; TYPES-TO-IGNORE is a list of funcall types (as specified in the -;;; patterns) to ignore in printing out the database. For example, -;;; '(:lisp) would ignore all calls to common lisp functions. COMPACT is -;;; a flag to tell the program to try to compact the trees a bit by not -;;; printing trees if they have already been seen. ROOT-NODES is a list -;;; of root nodes of trees to display. If ROOT-NODES is nil, tries to -;;; find all root nodes in the database. -;;; -;;; MAKE-CALLER-TREE (&optional (mode *default-graphing-mode*) [FUNCTION] -;;; (types-to-ignore *types-to-ignore*) -;;; compact) -;;; Outputs list structure of a tree which roughly represents the -;;; possibly cyclical structure of the caller database. -;;; If mode is :call-graph, the children of a node are the functions -;;; it calls. If mode is :caller-graph, the children of a node are the -;;; functions that call it. -;;; If compact is T, tries to eliminate the already-seen nodes, so -;;; that the graph for a node is printed at most once. Otherwise it will -;;; duplicate the node's tree (except for cycles). This is usefull -;;; because the call tree is actually a directed graph, so we can either -;;; duplicate references or display only the first one. -;;; -;;; DETERMINE-FILE-DEPENDENCIES (&optional database) [FUNCTION] -;;; Makes a hash table of file dependencies for the references listed in -;;; DATABASE. This function may be useful for automatically resolving -;;; file references for automatic creation of a system definition -;;; (defsystem). -;;; -;;; PRINT-FILE-DEPENDENCIES (&optional database) [FUNCTION] -;;; Prints a list of file dependencies for the references listed in -;;; DATABASE. This function may be useful for automatically computing -;;; file loading constraints for a system definition tool. -;;; -;;; WRITE-CALLERS-DATABASE-TO-FILE (filename) [FUNCTION] -;;; Saves the contents of the current callers database to a file. This -;;; file can be loaded to restore the previous contents of the -;;; database. (For large systems it can take a long time to crunch -;;; through the code, so this can save some time.) -;;; -;;; ----- -;;; The following macros define new function and macro call patterns. -;;; They may be used to extend the static analysis tool to handle -;;; new def forms, extensions to Common Lisp, and program defs. -;;; -;;; DEFINE-PATTERN-SUBSTITUTION (name pattern) [MACRO] -;;; Defines NAME to be equivalent to the specified pattern. Useful for -;;; making patterns more readable. For example, the LAMBDA-LIST is -;;; defined as a pattern substitution, making the definition of the -;;; DEFUN caller-pattern simpler. -;;; -;;; DEFINE-CALLER-PATTERN (name pattern &optional caller-type) [MACRO] -;;; Defines NAME as a function/macro call with argument structure -;;; described by PATTERN. CALLER-TYPE, if specified, assigns a type to -;;; the pattern, which may be used to exclude references to NAME while -;;; viewing the database. For example, all the Common Lisp definitions -;;; have a caller-type of :lisp or :lisp2, so that you can exclude -;;; references to common lisp functions from the calling tree. -;;; -;;; DEFINE-VARIABLE-PATTERN (name &optional caller-type) [MACRO] -;;; Defines NAME as a variable reference of type CALLER-TYPE. This is -;;; mainly used to establish the caller-type of the variable. -;;; -;;; DEFINE-CALLER-PATTERN-SYNONYMS (source destinations) [MACRO] -;;; For defining function caller pattern syntax synonyms. For each name -;;; in DESTINATIONS, defines its pattern as a copy of the definition -;;; of SOURCE. Allows a large number of identical patterns to be defined -;;; simultaneously. Must occur after the SOURCE has been defined. -;;; -;;; ----- -;;; This system includes pattern definitions for the latest -;;; common lisp specification, as published in Guy Steele, -;;; Common Lisp: The Language, 2nd Edition. -;;; -;;; Patterns may be either structures to match, or a predicate -;;; like symbolp/numberp/stringp. The pattern specification language -;;; is similar to the notation used in CLtL2, but in a more lisp-like -;;; form: -;;; (:eq name) The form element must be eq to the symbol NAME. -;;; (:test test) TEST must be true when applied to the form element. -;;; (:typep type) The form element must be of type TYPE. -;;; (:or pat1 pat2 ...) Tries each of the patterns in left-to-right order, -;;; until one succeeds. -;;; Equivalent to { pat1 | pat2 | ... } -;;; (:rest pattern) The remaining form elements are grouped into a -;;; list which is matched against PATTERN. -;;; (:optional pat1 ...) The patterns may optionally match against the -;;; form element. -;;; Equivalent to [ pat1 ... ]. -;;; (:star pat1 ...) The patterns may match against the patterns -;;; any number of times, including 0. -;;; Equivalent to { pat1 ... }*. -;;; (:plus pat1 ...) The patterns may match against the patterns -;;; any number of times, but at least once. -;;; Equivalent to { pat1 ... }+. -;;; &optional, &key, Similar in behavior to the corresponding -;;; &rest lambda-list keywords. -;;; FORM A random lisp form. If a cons, assumes the -;;; car is a function or macro and tries to -;;; match the args against that symbol's pattern. -;;; If a symbol, assumes it's a variable reference. -;;; :ignore Ignores the corresponding form element. -;;; NAME The corresponding form element should be -;;; the name of a new definition (e.g., the -;;; first arg in a defun pattern is NAME. -;;; FUNCTION, MACRO The corresponding form element should be -;;; a function reference not handled by FORM. -;;; Used in the definition of apply and funcall. -;;; VAR The corresponding form element should be -;;; a variable definition or mutation. Used -;;; in the definition of let, let*, etc. -;;; VARIABLE The corresponding form element should be -;;; a variable reference. -;;; -;;; In all other pattern symbols, it looks up the symbols pattern substitution -;;; and recursively matches against the pattern. Automatically destructures -;;; list structure that does not include consing dots. -;;; -;;; Among the pattern substitution names defined are: -;;; STRING, SYMBOL, NUMBER Appropriate :test patterns. -;;; LAMBDA-LIST Matches against a lambda list. -;;; BODY Matches against a function body definition. -;;; FN Matches against #'function, 'function, -;;; and lambdas. This is used in the definition -;;; of apply, funcall, and the mapping patterns. -;;; and others... -;;; -;;; Here's some sample pattern definitions: -;;; (define-caller-pattern defun -;;; (name lambda-list -;;; (:star (:or documentation-string declaration)) -;;; (:star form)) -;;; :lisp) -;;; (define-caller-pattern funcall (fn (:star form)) :lisp) -;;; -;;; In general, the system is intelligent enough to handle any sort of -;;; simple funcall. One only need specify the syntax for functions and -;;; macros which use optional arguments, keyword arguments, or some -;;; argument positions are special, such as in apply and funcall, or -;;; to indicate that the function is of the specified caller type. -;;; -;;; -;;; NOTES: -;;; -;;; XRef assumes syntactically correct lisp code. -;;; -;;; This is by no means perfect. For example, let and let* are treated -;;; identically, instead of differentiating between serial and parallel -;;; binding. But it's still a useful tool. It can be helpful in -;;; maintaining code, debugging problems with patch files, determining -;;; whether functions are multiply defined, and help you remember where -;;; a function is defined or called. -;;; -;;; XREF runs best when compiled. - -;;; ******************************** -;;; References ********************* -;;; ******************************** -;;; -;;; Xerox Interlisp Masterscope Program: -;;; Larry M Masinter, Global program analysis in an interactive environment -;;; PhD Thesis, Stanford University, 1980. -;;; -;;; Symbolics Who-Calls Database: -;;; User's Guide to Symbolics Computers, Volume 1, Cambridge, MA, July 1986 -;;; Genera 7.0, pp 183-185. -;;; - -;;; ******************************** -;;; Example ************************ -;;; ******************************** -;;; -;;; Here is an example of running XREF on a short program. -;;; [In Scribe documentation, give a simple short program and resulting -;;; XREF output, including postscript call graphs.] -#| - (xref:xref-file "/afs/cs/user/mkant/Lisp/Graph-Dag/graph-dag.lisp") -Cross-referencing file /afs/cs/user/mkant/Lisp/Graph-Dag/graph-dag.lisp. -................................................ -48 forms processed. - (xref:display-database :readers) - -*DISPLAY-CUTOFF-DEPTH* is referenced by CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE CALCULATE-POSITION-IN-LEVEL. -*OFFSET-FROM-EDGE-OF-PANE* is referenced by CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE. -*WITHIN-LEVEL-SPACING* is referenced by BREADTH CALCULATE-POSITION-INFO. -*DIRECTION* is referenced by CREATE-POSITION-INFO. -*LINK-OFFSET* is referenced by OFFSET-OF-LINK-FROM-ATTACHMENT-POINT. -*ROOT-IS-SEQUENCE* is referenced by GRAPH. -*LEVEL-SPACING* is referenced by CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE. -*ORIENTATION* is referenced by BREADTH CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE CALCULATE-POSITION-IN-LEVEL. -*DEFAULT-GRAPH-POSITION* is referenced by CREATE-POSITION-INFO. -*GRAPHING-CUTOFF-DEPTH* is referenced by CREATE-NODE-STRUCTURE. -*LIST-OF-NODES* is referenced by CALCULATE-LEVEL-POSITION -CALCULATE-LEVEL-POSITION-BEFORE CREATE-NODE FIND-NODE. -*GRAPH-TYPE* is referenced by CREATE-NODE-STRUCTURE. - (xref:print-caller-trees :root-nodes '(display-graph)) - -Rooted calling trees: - DISPLAY-GRAPH - CREATE-POSITION-INFO - CALCULATE-POSITION-INFO - CALCULATE-POSITION - NODE-POSITION-ALREADY-SET-FLAG - NODE-LEVEL-ALREADY-SET-FLAG - CALCULATE-POSITION-IN-LEVEL - NODE-CHILDREN - NODE-LEVEL - CALCULATE-POSITION - NEW-CALCULATE-BREADTH - NODE-CHILDREN - BREADTH - OPPOSITE-DIMENSION - NODE-HEIGHT - NODE-WIDTH - NEW-CALCULATE-BREADTH - NODE-PARENTS - OPPOSITE-DIMENSION - NODE-HEIGHT - NODE-WIDTH - OPPOSITE-POSITION - NODE-Y - NODE-X - NODE-LEVEL - CALCULATE-LEVEL-POSITION - NODE-LEVEL - NODE-POSITION - NODE-X - NODE-Y - DIMENSION - NODE-WIDTH - NODE-HEIGHT - CALCULATE-LEVEL-POSITION-BEFORE - NODE-LEVEL - NODE-POSITION - NODE-X - NODE-Y - NODE-WIDTH - NODE-HEIGHT - DIMENSION - NODE-WIDTH - NODE-HEIGHT -|# - -;;; **************************************************************** -;;; List Callers *************************************************** -;;; **************************************************************** - -(defpackage :pxref - (:use :common-lisp) - (:export #:list-callers - #:list-users - #:list-readers - #:list-setters - #:what-files-call - #:who-calls - #:list-callees - #:source-file - #:clear-tables - #:define-pattern-substitution - #:define-caller-pattern - #:define-variable-pattern - #:define-caller-pattern-synonyms - #:clear-patterns - #:*last-form* - #:*xref-verbose* - #:*handle-package-forms* - #:*handle-function-forms* - #:*handle-macro-forms* - #:*types-to-ignore* - #:*last-caller-tree* - #:*default-graphing-mode* - #:*indent-amount* - #:xref-file - #:xref-files - #:write-callers-database-to-file - #:display-database - #:print-caller-trees - #:make-caller-tree - #:print-indented-tree - #:determine-file-dependencies - #:print-file-dependencies - #:psgraph-xref - )) - -(in-package "PXREF") - -;;; Warn user if they're loading the source instead of compiling it first. -;(eval-when (compile load eval) -; (defvar compiled-p nil)) -;(eval-when (compile load) -; (setq compiled-p t)) -;(eval-when (load eval) -; (unless compiled-p -; (warn "This file should be compiled before loading for best results."))) -(eval-when (eval) - (warn "This file should be compiled before loading for best results.")) - - -;;; ******************************** -;;; Primitives ********************* -;;; ******************************** -(defun lookup (symbol environment) - (dolist (frame environment) - (when (member symbol frame) - (return symbol)))) - -(defun car-eq (list item) - (and (consp list) - (eq (car list) item))) - -;;; ******************************** -;;; Callers Database *************** -;;; ******************************** -(defvar *file-callers-database* (make-hash-table :test #'equal) - "Contains name and list of file callers (files which call) for that name.") -(defvar *callers-database* (make-hash-table :test #'equal) - "Contains name and list of callers (function invocation) for that name.") -(defvar *readers-database* (make-hash-table :test #'equal) - "Contains name and list of readers (variable use) for that name.") -(defvar *setters-database* (make-hash-table :test #'equal) - "Contains name and list of setters (variable mutation) for that name.") -(defvar *callees-database* (make-hash-table :test #'equal) - "Contains name and list of functions and variables it calls.") -(defun callers-list (name &optional (database :callers)) - (case database - (:file (gethash name *file-callers-database*)) - (:callees (gethash name *callees-database*)) - (:callers (gethash name *callers-database*)) - (:readers (gethash name *readers-database*)) - (:setters (gethash name *setters-database*)))) -(defsetf callers-list (name &optional (database :callers)) (caller) - `(setf (gethash ,name (case ,database - (:file *file-callers-database*) - (:callees *callees-database*) - (:callers *callers-database*) - (:readers *readers-database*) - (:setters *setters-database*))) - ,caller)) - -(defun list-callers (symbol) - "Lists all functions which call SYMBOL as a function (function invocation)." - (callers-list symbol :callers)) -(defun list-readers (symbol) - "Lists all functions which refer to SYMBOL as a variable - (variable reference)." - (callers-list symbol :readers)) -(defun list-setters (symbol) - "Lists all functions which bind/set SYMBOL as a variable - (variable mutation)." - (callers-list symbol :setters)) -(defun list-users (symbol) - "Lists all functions which use SYMBOL as a variable or function." - (values (list-callers symbol) - (list-readers symbol) - (list-setters symbol))) -(defun who-calls (symbol &optional how) - "Lists callers of symbol. HOW may be :function, :reader, :setter, - or :variable." - ;; would be nice to have :macro and distinguish variable - ;; binding from assignment. (i.e., variable binding, assignment, and use) - (case how - (:function (list-callers symbol)) - (:reader (list-readers symbol)) - (:setter (list-setters symbol)) - (:variable (append (list-readers symbol) - (list-setters symbol))) - (otherwise (append (list-callers symbol) - (list-readers symbol) - (list-setters symbol))))) -(defun what-files-call (symbol) - "Lists names of files that contain uses of SYMBOL - as a function, variable, or constant." - (callers-list symbol :file)) -(defun list-callees (symbol) - "Lists names of functions and variables called by SYMBOL." - (callers-list symbol :callees)) - -(defvar *source-file* (make-hash-table :test #'equal) - "Contains function name and source file for that name.") -(defun source-file (symbol) - "Lists the names of files in which SYMBOL is defined/used." - (gethash symbol *source-file*)) -(defsetf source-file (name) (value) - `(setf (gethash ,name *source-file*) ,value)) - -(defun clear-tables () - (clrhash *file-callers-database*) - (clrhash *callers-database*) - (clrhash *callees-database*) - (clrhash *readers-database*) - (clrhash *setters-database*) - (clrhash *source-file*)) - - -;;; ******************************** -;;; Pattern Database *************** -;;; ******************************** -;;; Pattern Types -(defvar *pattern-caller-type* (make-hash-table :test #'equal)) -(defun pattern-caller-type (name) - (gethash name *pattern-caller-type*)) -(defsetf pattern-caller-type (name) (value) - `(setf (gethash ,name *pattern-caller-type*) ,value)) - -;;; Pattern Substitutions -(defvar *pattern-substitution-table* (make-hash-table :test #'equal) - "Stores general patterns for function destructuring.") -(defun lookup-pattern-substitution (name) - (gethash name *pattern-substitution-table*)) -(defmacro define-pattern-substitution (name pattern) - "Defines NAME to be equivalent to the specified pattern. Useful for - making patterns more readable. For example, the LAMBDA-LIST is - defined as a pattern substitution, making the definition of the - DEFUN caller-pattern simpler." - `(setf (gethash ',name *pattern-substitution-table*) - ',pattern)) - -;;; Function/Macro caller patterns: -;;; The car of the form is skipped, so we don't need to specify -;;; (:eq function-name) like we would for a substitution. -;;; -;;; Patterns must be defined in the XREF package because the pattern -;;; language is tested by comparing symbols (using #'equal) and not -;;; their printreps. This is fine for the lisp grammer, because the XREF -;;; package depends on the LISP package, so a symbol like 'xref::cons is -;;; translated automatically into 'lisp::cons. However, since -;;; (equal 'foo::bar 'baz::bar) returns nil unless both 'foo::bar and -;;; 'baz::bar are inherited from the same package (e.g., LISP), -;;; if package handling is turned on the user must specify package -;;; names in the caller pattern definitions for functions that occur -;;; in packages other than LISP, otherwise the symbols will not match. -;;; -;;; Perhaps we should enforce the definition of caller patterns in the -;;; XREF package by wrapping the body of define-caller-pattern in -;;; the XREF package: -;;; (defmacro define-caller-pattern (name value &optional caller-type) -;;; (let ((old-package *package*)) -;;; (setf *package* (find-package "XREF")) -;;; (prog1 -;;; `(progn -;;; (when ',caller-type -;;; (setf (pattern-caller-type ',name) ',caller-type)) -;;; (when ',value -;;; (setf (gethash ',name *caller-pattern-table*) -;;; ',value))) -;;; (setf *package* old-package)))) -;;; Either that, or for the purpose of pattern testing we should compare -;;; printreps. [The latter makes the primitive patterns like VAR -;;; reserved words.] -(defvar *caller-pattern-table* (make-hash-table :test #'equal) - "Stores patterns for function destructuring.") -(defun lookup-caller-pattern (name) - (gethash name *caller-pattern-table*)) -(defmacro define-caller-pattern (name pattern &optional caller-type) - "Defines NAME as a function/macro call with argument structure - described by PATTERN. CALLER-TYPE, if specified, assigns a type to - the pattern, which may be used to exclude references to NAME while - viewing the database. For example, all the Common Lisp definitions - have a caller-type of :lisp or :lisp2, so that you can exclude - references to common lisp functions from the calling tree." - `(progn - (when ',caller-type - (setf (pattern-caller-type ',name) ',caller-type)) - (when ',pattern - (setf (gethash ',name *caller-pattern-table*) - ',pattern)))) - -;;; For defining variables -(defmacro define-variable-pattern (name &optional caller-type) - "Defines NAME as a variable reference of type CALLER-TYPE. This is - mainly used to establish the caller-type of the variable." - `(progn - (when ',caller-type - (setf (pattern-caller-type ',name) ',caller-type)))) - -;;; For defining synonyms. Means much less space taken up by the patterns. -(defmacro define-caller-pattern-synonyms (source destinations) - "For defining function caller pattern syntax synonyms. For each name - in DESTINATIONS, defines its pattern as a copy of the definition of SOURCE. - Allows a large number of identical patterns to be defined simultaneously. - Must occur after the SOURCE has been defined." - `(let ((source-type (pattern-caller-type ',source)) - (source-pattern (gethash ',source *caller-pattern-table*))) - (when source-type - (dolist (dest ',destinations) - (setf (pattern-caller-type dest) source-type))) - (when source-pattern - (dolist (dest ',destinations) - (setf (gethash dest *caller-pattern-table*) - source-pattern))))) - -(defun clear-patterns () - (clrhash *pattern-substitution-table*) - (clrhash *caller-pattern-table*) - (clrhash *pattern-caller-type*)) - -;;; ******************************** -;;; Cross Reference Files ********** -;;; ******************************** -(defvar *last-form* () - "The last form read from the file. Useful for figuring out what went wrong - when xref-file drops into the debugger.") - -(defvar *xref-verbose* t - "When T, xref-file(s) prints out the names of the files it looks at, - progress dots, and the number of forms read.") - -;;; This needs to first clear the tables? -(defun xref-files (&rest files) - "Grovels over the lisp code located in source file FILES, using xref-file." - ;; If the arg is a list, use it. - (when (listp (car files)) (setq files (car files))) - (dolist (file files) - (xref-file file nil)) - (values)) - -(defvar *handle-package-forms* nil ;'(lisp::in-package) - "When non-NIL, and XREF-FILE sees a package-setting form like IN-PACKAGE, - sets the current package to the specified package by evaluating the - form. When done with the file, xref-file resets the package to its - original value. In some of the displaying functions, when this variable - is non-NIL one may specify that all symbols from a particular set of - packages be ignored. This is only useful if the files use different - packages with conflicting names.") - -(defvar *normal-readtable* (copy-readtable nil) - "Normal, unadulterated CL readtable.") - -(defun xref-file (filename &optional (clear-tables t) (verbose *xref-verbose*)) - "Cross references the function and variable calls in FILENAME by - walking over the source code located in the file. Defaults type of - filename to \".lisp\". Chomps on the code using record-callers and - record-callers*. If CLEAR-TABLES is T (the default), it clears the callers - database before processing the file. Specify CLEAR-TABLES as nil to - append to the database. If VERBOSE is T (the default), prints out the - name of the file, one progress dot for each form processed, and the - total number of forms." - ;; Default type to "lisp" - (when (and (null (pathname-type filename)) - (not (probe-file filename))) - (cond ((stringp filename) - (setf filename (concatenate 'string filename ".lisp"))) - ((pathnamep filename) - (setf filename (merge-pathnames filename - (make-pathname :type "lisp")))))) - (when clear-tables (clear-tables)) - (let ((count 0) - (old-package *package*) - (*readtable* *normal-readtable*)) - (when verbose - (format t "~&Cross-referencing file ~A.~&" filename)) - (with-open-file (stream filename :direction :input) - (do ((form (read stream nil :eof) (read stream nil :eof))) - ((eq form :eof)) - (incf count) - (when verbose - (format *standard-output* ".") - (force-output *standard-output*)) - (setq *last-form* form) - (record-callers filename form) - ;; Package Magic. - (when (and *handle-package-forms* - (consp form) - (member (car form) *handle-package-forms*)) - (eval form)))) - (when verbose - (format t "~&~D forms processed." count)) - (setq *package* old-package) - (values))) - -(defvar *handle-function-forms* t - "When T, XREF-FILE tries to be smart about forms which occur in - a function position, such as lambdas and arbitrary Lisp forms. - If so, it recursively calls record-callers with pattern 'FORM. - If the form is a lambda, makes the caller a caller of :unnamed-lambda.") - -(defvar *handle-macro-forms* t - "When T, if the file was loaded before being processed by XREF, and the - car of a form is a macro, it notes that the parent calls the macro, - and then calls macroexpand-1 on the form.") - -(defvar *callees-database-includes-variables* nil) - -(defun record-callers (filename form - &optional pattern parent (environment nil) - funcall) - "RECORD-CALLERS is the main routine used to walk down the code. It matches - the PATTERN against the FORM, possibly adding statements to the database. - PARENT is the name defined by the current outermost definition; it is - the caller of the forms in the body (e.g., FORM). ENVIRONMENT is used - to keep track of the scoping of variables. FUNCALL deals with the type - of variable assignment and hence how the environment should be modified. - RECORD-CALLERS handles atomic patterns and simple list-structure patterns. - For complex list-structure pattern destructuring, it calls RECORD-CALLERS*." -; (when form) - (unless pattern (setq pattern 'FORM)) - (cond ((symbolp pattern) - (case pattern - (:IGNORE - ;; Ignores the rest of the form. - (values t parent environment)) - (NAME - ;; This is the name of a new definition. - (push filename (source-file form)) - (values t form environment)) - ((FUNCTION MACRO) - ;; This is the name of a call. - (cond ((and *handle-function-forms* (consp form)) - ;; If we're a cons and special handling is on, - (when (eq (car form) 'lambda) - (pushnew filename (callers-list :unnamed-lambda :file)) - (when parent - (pushnew parent (callers-list :unnamed-lambda - :callers)) - (pushnew :unnamed-lambda (callers-list parent - :callees)))) - (record-callers filename form 'form parent environment)) - (t - ;; If we're just a regular function name call. - (pushnew filename (callers-list form :file)) - (when parent - (pushnew parent (callers-list form :callers)) - (pushnew form (callers-list parent :callees))) - (values t parent environment)))) - (VAR - ;; This is the name of a new variable definition. - ;; Includes arglist parameters. - (when (and (symbolp form) (not (keywordp form)) - (not (member form lambda-list-keywords))) - (pushnew form (car environment)) - (pushnew filename (callers-list form :file)) - (when parent -; (pushnew form (callers-list parent :callees)) - (pushnew parent (callers-list form :setters))) - (values t parent environment))) - (VARIABLE - ;; VAR reference - (pushnew filename (callers-list form :file)) - (when (and parent (not (lookup form environment))) - (pushnew parent (callers-list form :readers)) - (when *callees-database-includes-variables* - (pushnew form (callers-list parent :callees)))) - (values t parent environment)) - (FORM - ;; A random form (var or funcall). - (cond ((consp form) - ;; Get new pattern from TAG. - (let ((new-pattern (lookup-caller-pattern (car form)))) - (pushnew filename (callers-list (car form) :file)) - (when parent - (pushnew parent (callers-list (car form) :callers)) - (pushnew (car form) (callers-list parent :callees))) - (cond ((and new-pattern (cdr form)) - ;; Special Pattern and there's stuff left - ;; to be processed. Note that we check if - ;; a pattern is defined for the form before - ;; we check to see if we can macroexpand it. - (record-callers filename (cdr form) new-pattern - parent environment :funcall)) - ((and *handle-macro-forms* - (symbolp (car form)) ; pnorvig 9/9/93 - (macro-function (car form))) - ;; The car of the form is a macro and - ;; macro processing is turned on. Macroexpand-1 - ;; the form and try again. - (record-callers filename - (macroexpand-1 form) - 'form parent environment - :funcall)) - ((null (cdr form)) - ;; No more left to be processed. Note that - ;; this must occur after the macros clause, - ;; since macros can expand into more code. - (values t parent environment)) - (t - ;; Random Form. We assume it is a function call. - (record-callers filename (cdr form) - '((:star FORM)) - parent environment :funcall))))) - (t - (when (and (not (lookup form environment)) - (not (numberp form)) - ;; the following line should probably be - ;; commented out? - (not (keywordp form)) - (not (stringp form)) - (not (eq form t)) - (not (eq form nil))) - (pushnew filename (callers-list form :file)) - ;; ??? :callers - (when parent - (pushnew parent (callers-list form :readers)) - (when *callees-database-includes-variables* - (pushnew form (callers-list parent :callees))))) - (values t parent environment)))) - (otherwise - ;; Pattern Substitution - (let ((new-pattern (lookup-pattern-substitution pattern))) - (if new-pattern - (record-callers filename form new-pattern - parent environment) - (when (eq pattern form) - (values t parent environment))))))) - ((consp pattern) - (case (car pattern) - (:eq (when (eq (second pattern) form) - (values t parent environment))) - (:test (when (funcall (eval (second pattern)) form) - (values t parent environment))) - (:typep (when (typep form (second pattern)) - (values t parent environment))) - (:or (dolist (subpat (rest pattern)) - (multiple-value-bind (processed parent environment) - (record-callers filename form subpat - parent environment) - (when processed - (return (values processed parent environment)))))) - (:rest ; (:star :plus :optional :rest) - (record-callers filename form (second pattern) - parent environment)) - (otherwise - (multiple-value-bind (d p env) - (record-callers* filename form pattern - parent (cons nil environment)) - (values d p (if funcall environment env)))))))) - -(defun record-callers* (filename form pattern parent environment - &optional continuation - in-optionals in-keywords) - "RECORD-CALLERS* handles complex list-structure patterns, such as - ordered lists of subpatterns, patterns involving :star, :plus, - &optional, &key, &rest, and so on. CONTINUATION is a stack of - unprocessed patterns, IN-OPTIONALS and IN-KEYWORDS are corresponding - stacks which determine whether &rest or &key has been seen yet in - the current pattern." - ;; form must be a cons or nil. -; (when form) - (if (null pattern) - (if (null continuation) - (values t parent environment) - (record-callers* filename form (car continuation) parent environment - (cdr continuation) - (cdr in-optionals) - (cdr in-keywords))) - (let ((pattern-elt (car pattern))) - (cond ((car-eq pattern-elt :optional) - (if (null form) - (values t parent environment) - (multiple-value-bind (processed par env) - (record-callers* filename form (cdr pattern-elt) - parent environment - (cons (cdr pattern) continuation) - (cons (car in-optionals) in-optionals) - (cons (car in-keywords) in-keywords)) - (if processed - (values processed par env) - (record-callers* filename form (cdr pattern) - parent environment continuation - in-optionals in-keywords))))) - ((car-eq pattern-elt :star) - (if (null form) - (values t parent environment) - (multiple-value-bind (processed par env) - (record-callers* filename form (cdr pattern-elt) - parent environment - (cons pattern continuation) - (cons (car in-optionals) in-optionals) - (cons (car in-keywords) in-keywords)) - (if processed - (values processed par env) - (record-callers* filename form (cdr pattern) - parent environment continuation - in-optionals in-keywords))))) - ((car-eq pattern-elt :plus) - (record-callers* filename form (cdr pattern-elt) - parent environment - (cons (cons (cons :star (cdr pattern-elt)) - (cdr pattern)) - continuation) - (cons (car in-optionals) in-optionals) - (cons (car in-keywords) in-keywords))) - ((car-eq pattern-elt :rest) - (record-callers filename form pattern-elt parent environment)) - ((eq pattern-elt '&optional) - (record-callers* filename form (cdr pattern) - parent environment continuation - (cons t in-optionals) - (cons (car in-keywords) in-keywords))) - ((eq pattern-elt '&rest) - (record-callers filename form (second pattern) - parent environment)) - ((eq pattern-elt '&key) - (record-callers* filename form (cdr pattern) - parent environment continuation - (cons (car in-optionals) in-optionals) - (cons t in-keywords))) - ((null form) - (when (or (car in-keywords) (car in-optionals)) - (values t parent environment))) - ((consp form) - (multiple-value-bind (processed parent environment) - (record-callers filename (if (car in-keywords) - (cadr form) - (car form)) - pattern-elt - parent environment) - (cond (processed - (record-callers* filename (if (car in-keywords) - (cddr form) - (cdr form)) - (cdr pattern) - parent environment - continuation - in-optionals in-keywords)) - ((or (car in-keywords) - (car in-optionals)) - (values t parent environment))))))))) - - -;;; ******************************** -;;; Misc Utilities ***************** -;;; ******************************** -(defvar *types-to-ignore* - '(:lisp ; CLtL 1st Edition - :lisp2 ; CLtL 2nd Edition additional patterns - ) - "Default set of caller types (as specified in the patterns) to ignore - in the database handling functions. :lisp is CLtL 1st edition, - :lisp2 is additional patterns from CLtL 2nd edition.") - -(defun display-database (&optional (database :callers) - (types-to-ignore *types-to-ignore*)) - "Prints out the name of each symbol and all its callers. Specify database - :callers (the default) to get function call references, :fill to the get - files in which the symbol is called, :readers to get variable references, - and :setters to get variable binding and assignments. Ignores functions - of types listed in types-to-ignore." - (maphash #'(lambda (name callers) - (unless (or (member (pattern-caller-type name) - types-to-ignore) - ;; When we're doing fancy package crap, - ;; allow us to ignore symbols based on their - ;; packages. - (when *handle-package-forms* - (member (symbol-package name) - types-to-ignore - :key #'find-package))) - (format t "~&~S is referenced by~{ ~S~}." - name callers))) - (ecase database - (:file *file-callers-database*) - (:callers *callers-database*) - (:readers *readers-database*) - (:setters *setters-database*)))) - -(defun write-callers-database-to-file (filename) - "Saves the contents of the current callers database to a file. This - file can be loaded to restore the previous contents of the - database. (For large systems it can take a long time to crunch - through the code, so this can save some time.)" - (with-open-file (stream filename :direction :output) - (format stream "~&(clear-tables)") - (maphash #'(lambda (x y) - (format stream "~&(setf (source-file '~S) '~S)" - x y)) - *source-file*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :file) '~S)" - x y)) - *file-callers-database*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :callers) '~S)" - x y)) - *callers-database*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :callees) '~S)" - x y)) - *callees-database*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :readers) '~S)" - x y)) - *readers-database*) - (maphash #'(lambda (x y) - (format stream "~&(setf (callers-list '~S :setters) '~S)" - x y)) - *setters-database*))) - - -;;; ******************************** -;;; Print Caller Trees ************* -;;; ******************************** -;;; The following function is useful for reversing a caller table into -;;; a callee table. Possibly later we'll extend xref to create two -;;; such database hash tables. Needs to include vars as well. -(defun invert-hash-table (table &optional (types-to-ignore *types-to-ignore*)) - "Makes a copy of the hash table in which (name value*) pairs - are inverted to (value name*) pairs." - (let ((target (make-hash-table :test #'equal))) - (maphash #'(lambda (key values) - (dolist (value values) - (unless (member (pattern-caller-type key) - types-to-ignore) - (pushnew key (gethash value target))))) - table) - target)) - -;;; Resolve file references for automatic creation of a defsystem file. -(defun determine-file-dependencies (&optional (database *callers-database*)) - "Makes a hash table of file dependencies for the references listed in - DATABASE. This function may be useful for automatically resolving - file references for automatic creation of a system definition (defsystem)." - (let ((file-ref-ht (make-hash-table :test #'equal))) - (maphash #'(lambda (key values) - (let ((key-file (source-file key))) - (when key - (dolist (value values) - (let ((value-file (source-file value))) - (when value-file - (dolist (s key-file) - (dolist (d value-file) - (pushnew d (gethash s file-ref-ht)))))))))) - database) - file-ref-ht)) - -(defun print-file-dependencies (&optional (database *callers-database*)) - "Prints a list of file dependencies for the references listed in DATABASE. - This function may be useful for automatically computing file loading - constraints for a system definition tool." - (maphash #'(lambda (key value) (format t "~&~S --> ~S" key value)) - (determine-file-dependencies database))) - -;;; The following functions demonstrate a possible way to interface -;;; xref to a graphical browser such as psgraph to mimic the capabilities -;;; of Masterscope's graphical browser. - -(defvar *last-caller-tree* nil) - -(defvar *default-graphing-mode* :call-graph - "Specifies whether we graph up or down. If :call-graph, the children - of a node are the functions it calls. If :caller-graph, the children - of a node are the functions that call it.") - -(defun gather-tree (parents &optional already-seen - (mode *default-graphing-mode*) - (types-to-ignore *types-to-ignore*) compact) - "Extends the tree, copying it into list structure, until it repeats - a reference (hits a cycle)." - (let ((*already-seen* nil) - (database (case mode - (:call-graph *callees-database*) - (:caller-graph *callers-database*)))) - (declare (special *already-seen*)) - (labels - ((amass-tree - (parents &optional already-seen) - (let (result this-item) - (dolist (parent parents) - (unless (member (pattern-caller-type parent) - types-to-ignore) - (pushnew parent *already-seen*) - (if (member parent already-seen) - (setq this-item nil) ; :ignore - (if compact - (multiple-value-setq (this-item already-seen) - (amass-tree (gethash parent database) - (cons parent already-seen))) - (setq this-item - (amass-tree (gethash parent database) - (cons parent already-seen))))) - (setq parent (format nil "~S" parent)) - (when (consp parent) (setq parent (cons :xref-list parent))) - (unless (eq this-item :ignore) - (push (if this-item - (list parent this-item) - parent) - result)))) - (values result ;(reverse result) - already-seen)))) - (values (amass-tree parents already-seen) - *already-seen*)))) - -(defun find-roots-and-cycles (&optional (mode *default-graphing-mode*) - (types-to-ignore *types-to-ignore*)) - "Returns a list of uncalled callers (roots) and called callers (potential - cycles)." - (let ((uncalled-callers nil) - (called-callers nil) - (database (ecase mode - (:call-graph *callers-database*) - (:caller-graph *callees-database*))) - (other-database (ecase mode - (:call-graph *callees-database*) - (:caller-graph *callers-database*)))) - (maphash #'(lambda (name value) - (declare (ignore value)) - (unless (member (pattern-caller-type name) - types-to-ignore) - (if (gethash name database) - (push name called-callers) - (push name uncalled-callers)))) - other-database) - (values uncalled-callers called-callers))) - -(defun make-caller-tree (&optional (mode *default-graphing-mode*) - (types-to-ignore *types-to-ignore*) compact) - "Outputs list structure of a tree which roughly represents the possibly - cyclical structure of the caller database. - If mode is :call-graph, the children of a node are the functions it calls. - If mode is :caller-graph, the children of a node are the functions that - call it. - If compact is T, tries to eliminate the already-seen nodes, so that - the graph for a node is printed at most once. Otherwise it will duplicate - the node's tree (except for cycles). This is usefull because the call tree - is actually a directed graph, so we can either duplicate references or - display only the first one." - ;; Would be nice to print out line numbers and whenever we skip a duplicated - ;; reference, print the line number of the full reference after the node. - (multiple-value-bind (uncalled-callers called-callers) - (find-roots-and-cycles mode types-to-ignore) - (multiple-value-bind (trees already-seen) - (gather-tree uncalled-callers nil mode types-to-ignore compact) - (setq *last-caller-tree* trees) - (let ((more-trees (gather-tree (set-difference called-callers - already-seen) - already-seen - mode types-to-ignore compact))) - (values trees more-trees))))) - -(defvar *indent-amount* 3 - "Number of spaces to indent successive levels in PRINT-INDENTED-TREE.") - -(defun print-indented-tree (trees &optional (indent 0)) - "Simple code to print out a list-structure tree (such as those created - by make-caller-tree) as indented text." - (when trees - (dolist (tree trees) - (cond ((and (listp tree) (eq (car tree) :xref-list)) - (format t "~&~VT~A" indent (cdr tree))) - ((listp tree) - (format t "~&~VT~A" indent (car tree)) - (print-indented-tree (cadr tree) (+ indent *indent-amount*))) - (t - (format t "~&~VT~A" indent tree)))))) - -(defun print-caller-trees (&key (mode *default-graphing-mode*) - (types-to-ignore *types-to-ignore*) - compact - root-nodes) - "Prints the calling trees (which may actually be a full graph and not - necessarily a DAG) as indented text trees using PRINT-INDENTED-TREE. - MODE is :call-graph for trees where the children of a node are the - functions called by the node, or :caller-graph for trees where the - children of a node are the functions the node calls. TYPES-TO-IGNORE - is a list of funcall types (as specified in the patterns) to ignore - in printing out the database. For example, '(:lisp) would ignore all - calls to common lisp functions. COMPACT is a flag to tell the program - to try to compact the trees a bit by not printing trees if they have - already been seen. ROOT-NODES is a list of root nodes of trees to - display. If ROOT-NODES is nil, tries to find all root nodes in the - database." - (multiple-value-bind (rooted cycles) - (if root-nodes - (values (gather-tree root-nodes nil mode types-to-ignore compact)) - (make-caller-tree mode types-to-ignore compact)) - (when rooted - (format t "~&Rooted calling trees:") - (print-indented-tree rooted 2)) - (when cycles - (when rooted - (format t "~2%")) - (format t "~&Cyclic calling trees:") - (print-indented-tree cycles 2)))) - - -;;; ******************************** -;;; Interface to PSGraph *********** -;;; ******************************** -#| -;;; Interface to Bates' PostScript Graphing Utility -(load "/afs/cs/user/mkant/Lisp/PSGraph/psgraph") - -(defparameter *postscript-output-directory* "") -(defun psgraph-xref (&key (mode *default-graphing-mode*) - (output-directory *postscript-output-directory*) - (types-to-ignore *types-to-ignore*) - (compact t) - (shrink t) - root-nodes - insert) - ;; If root-nodes is a non-nil list, uses that list as the starting - ;; position. Otherwise tries to find all roots in the database. - (multiple-value-bind (rooted cycles) - (if root-nodes - (values (gather-tree root-nodes nil mode types-to-ignore compact)) - (make-caller-tree mode types-to-ignore compact)) - (psgraph-output (append rooted cycles) output-directory shrink insert))) - -(defun psgraph-output (list-of-trees directory shrink &optional insert) - (let ((psgraph:*fontsize* 9) - (psgraph:*second-fontsize* 7) -; (psgraph:*boxkind* "fill") - (psgraph:*boxgray* "0") ; .8 - (psgraph:*edgewidth* "1") - (psgraph:*edgegray* "0")) - (labels ((stringify (thing) - (cond ((stringp thing) (string-downcase thing)) - ((symbolp thing) (string-downcase (symbol-name thing))) - ((and (listp thing) (eq (car thing) :xref-list)) - (stringify (cdr thing))) - ((listp thing) (stringify (car thing))) - (t (string thing))))) - (dolist (item list-of-trees) - (let* ((fname (stringify item)) - (filename (concatenate 'string directory - (string-trim '(#\: #\|) fname) - ".ps"))) - (format t "~&Creating PostScript file ~S." filename) - (with-open-file (*standard-output* filename - :direction :output - :if-does-not-exist :create - :if-exists :supersede) - ;; Note that the #'eq prints the DAG as a tree. If - ;; you replace it with #'equal, it will print it as - ;; a DAG, which I think is slightly ugly. - (psgraph:psgraph item - #'caller-tree-children #'caller-info shrink - insert #'eq))))))) - -(defun caller-tree-children (tree) - (when (and tree (listp tree) (not (eq (car tree) :xref-list))) - (cadr tree))) - -(defun caller-tree-node (tree) - (when tree - (cond ((and (listp tree) (eq (car tree) :xref-list)) - (cdr tree)) - ((listp tree) - (car tree)) - (t - tree)))) - -(defun caller-info (tree) - (let ((node (caller-tree-node tree))) - (list node))) -|# -#| -;;; Code to print out graphical trees of CLOS class hierarchies. -(defun print-class-hierarchy (&optional (start-class 'anything) - (file "classes.ps")) - (let ((start (find-class start-class))) - (when start - (with-open-file (*standard-output* file :direction :output) - (psgraph:psgraph start - #'clos::class-direct-subclasses - #'(lambda (x) - (list (format nil "~A" (clos::class-name x)))) - t nil #'eq))))) - -|# - - -;;; **************************************************************** -;;; Cross Referencing Patterns for Common Lisp ********************* -;;; **************************************************************** -(clear-patterns) - -;;; ******************************** -;;; Pattern Substitutions ********** -;;; ******************************** -(define-pattern-substitution integer (:test #'integerp)) -(define-pattern-substitution rational (:test #'rationalp)) -(define-pattern-substitution symbol (:test #'symbolp)) -(define-pattern-substitution string (:test #'stringp)) -(define-pattern-substitution number (:test #'numberp)) -(define-pattern-substitution lambda-list - ((:star var) - (:optional (:eq &optional) - (:star (:or var - (var (:optional form (:optional var)))))) - (:optional (:eq &rest) var) - (:optional (:eq &key) (:star (:or var - ((:or var - (keyword var)) - (:optional form (:optional var))))) - (:optional &allow-other-keys)) - (:optional (:eq &aux) - (:star (:or var - (var (:optional form))))))) -(define-pattern-substitution test form) -(define-pattern-substitution body - ((:star (:or declaration documentation-string)) - (:star form))) -(define-pattern-substitution documentation-string string) -(define-pattern-substitution initial-value form) -(define-pattern-substitution tag symbol) -(define-pattern-substitution declaration ((:eq declare)(:rest :ignore))) -(define-pattern-substitution destination form) -(define-pattern-substitution control-string string) -(define-pattern-substitution format-arguments - ((:star form))) -(define-pattern-substitution fn - (:or ((:eq quote) function) - ((:eq function) function) - function)) - -;;; ******************************** -;;; Caller Patterns **************** -;;; ******************************** - -;;; Types Related -(define-caller-pattern coerce (form :ignore) :lisp) -(define-caller-pattern type-of (form) :lisp) -(define-caller-pattern upgraded-array-element-type (:ignore) :lisp2) -(define-caller-pattern upgraded-complex-part-type (:ignore) :lisp2) - -;;; Lambdas and Definitions -(define-variable-pattern lambda-list-keywords :lisp) -(define-variable-pattern lambda-parameters-limit :lisp) -(define-caller-pattern lambda (lambda-list (:rest body)) :lisp) - -(define-caller-pattern defun - (name lambda-list - (:star (:or documentation-string declaration)) - (:star form)) - :lisp) - -;;; perhaps this should use VAR, instead of NAME -(define-caller-pattern defvar - (var (:optional initial-value (:optional documentation-string))) - :lisp) -(define-caller-pattern defparameter - (var initial-value (:optional documentation-string)) - :lisp) -(define-caller-pattern defconstant - (var initial-value (:optional documentation-string)) - :lisp) - -(define-caller-pattern eval-when - (:ignore ; the situations - (:star form)) - :lisp) - -;;; Logical Values -(define-variable-pattern nil :lisp) -(define-variable-pattern t :lisp) - -;;; Predicates -(define-caller-pattern typep (form form) :lisp) -(define-caller-pattern subtypep (form form) :lisp) - -(define-caller-pattern null (form) :lisp) -(define-caller-pattern symbolp (form) :lisp) -(define-caller-pattern atom (form) :lisp) -(define-caller-pattern consp (form) :lisp) -(define-caller-pattern listp (form) :lisp) -(define-caller-pattern numberp (form) :lisp) -(define-caller-pattern integerp (form) :lisp) -(define-caller-pattern rationalp (form) :lisp) -(define-caller-pattern floatp (form) :lisp) -(define-caller-pattern realp (form) :lisp2) -(define-caller-pattern complexp (form) :lisp) -(define-caller-pattern characterp (form) :lisp) -(define-caller-pattern stringp (form) :lisp) -(define-caller-pattern bit-vector-p (form) :lisp) -(define-caller-pattern vectorp (form) :lisp) -(define-caller-pattern simple-vector-p (form) :lisp) -(define-caller-pattern simple-string-p (form) :lisp) -(define-caller-pattern simple-bit-vector-p (form) :lisp) -(define-caller-pattern arrayp (form) :lisp) -(define-caller-pattern packagep (form) :lisp) -(define-caller-pattern functionp (form) :lisp) -(define-caller-pattern compiled-function-p (form) :lisp) -(define-caller-pattern commonp (form) :lisp) - -;;; Equality Predicates -(define-caller-pattern eq (form form) :lisp) -(define-caller-pattern eql (form form) :lisp) -(define-caller-pattern equal (form form) :lisp) -(define-caller-pattern equalp (form form) :lisp) - -;;; Logical Operators -(define-caller-pattern not (form) :lisp) -(define-caller-pattern or ((:star form)) :lisp) -(define-caller-pattern and ((:star form)) :lisp) - -;;; Reference - -;;; Quote is a problem. In Defmacro & friends, we'd like to actually -;;; look at the argument, 'cause it hides internal function calls -;;; of the defmacro. -(define-caller-pattern quote (:ignore) :lisp) - -(define-caller-pattern function ((:or fn form)) :lisp) -(define-caller-pattern symbol-value (form) :lisp) -(define-caller-pattern symbol-function (form) :lisp) -(define-caller-pattern fdefinition (form) :lisp2) -(define-caller-pattern boundp (form) :lisp) -(define-caller-pattern fboundp (form) :lisp) -(define-caller-pattern special-form-p (form) :lisp) - -;;; Assignment -(define-caller-pattern setq ((:star var form)) :lisp) -(define-caller-pattern psetq ((:star var form)) :lisp) -(define-caller-pattern set (form form) :lisp) -(define-caller-pattern makunbound (form) :lisp) -(define-caller-pattern fmakunbound (form) :lisp) - -;;; Generalized Variables -(define-caller-pattern setf ((:star form form)) :lisp) -(define-caller-pattern psetf ((:star form form)) :lisp) -(define-caller-pattern shiftf ((:plus form) form) :lisp) -(define-caller-pattern rotatef ((:star form)) :lisp) -(define-caller-pattern define-modify-macro - (name - lambda-list - fn - (:optional documentation-string)) - :lisp) -(define-caller-pattern defsetf - (:or (name name (:optional documentation-string)) - (name lambda-list (var) - (:star (:or declaration documentation-string)) - (:star form))) - :lisp) -(define-caller-pattern define-setf-method - (name lambda-list - (:star (:or declaration documentation-string)) - (:star form)) - :lisp) -(define-caller-pattern get-setf-method (form) :lisp) -(define-caller-pattern get-setf-method-multiple-value (form) :lisp) - - -;;; Function invocation -(define-caller-pattern apply (fn form (:star form)) :lisp) -(define-caller-pattern funcall (fn (:star form)) :lisp) - - -;;; Simple sequencing -(define-caller-pattern progn ((:star form)) :lisp) -(define-caller-pattern prog1 (form (:star form)) :lisp) -(define-caller-pattern prog2 (form form (:star form)) :lisp) - -;;; Variable bindings -(define-caller-pattern let - (((:star (:or var (var &optional form)))) - (:star declaration) - (:star form)) - :lisp) -(define-caller-pattern let* - (((:star (:or var (var &optional form)))) - (:star declaration) - (:star form)) - :lisp) -(define-caller-pattern compiler-let - (((:star (:or var (var form)))) - (:star form)) - :lisp) -(define-caller-pattern progv - (form form (:star form)) :lisp) -(define-caller-pattern flet - (((:star (name lambda-list - (:star (:or declaration - documentation-string)) - (:star form)))) - (:star form)) - :lisp) -(define-caller-pattern labels - (((:star (name lambda-list - (:star (:or declaration - documentation-string)) - (:star form)))) - (:star form)) - :lisp) -(define-caller-pattern macrolet - (((:star (name lambda-list - (:star (:or declaration - documentation-string)) - (:star form)))) - (:star form)) - :lisp) -(define-caller-pattern symbol-macrolet - (((:star (var form))) (:star declaration) (:star form)) - :lisp2) - -;;; Conditionals -(define-caller-pattern if (test form (:optional form)) :lisp) -(define-caller-pattern when (test (:star form)) :lisp) -(define-caller-pattern unless (test (:star form)) :lisp) -(define-caller-pattern cond ((:star (test (:star form)))) :lisp) -(define-caller-pattern case - (form - (:star ((:or symbol - ((:star symbol))) - (:star form)))) - :lisp) -(define-caller-pattern typecase (form (:star (symbol (:star form)))) - :lisp) - -;;; Blocks and Exits -(define-caller-pattern block (name (:star form)) :lisp) -(define-caller-pattern return-from (function (:optional form)) :lisp) -(define-caller-pattern return ((:optional form)) :lisp) - -;;; Iteration -(define-caller-pattern loop ((:star form)) :lisp) -(define-caller-pattern do - (((:star (:or var - (var (:optional form (:optional form)))))) ; init step - (form (:star form)) ; end-test result - (:star declaration) - (:star (:or tag form))) ; statement - :lisp) -(define-caller-pattern do* - (((:star (:or var - (var (:optional form (:optional form)))))) - (form (:star form)) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern dolist - ((var form (:optional form)) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern dotimes - ((var form (:optional form)) - (:star declaration) - (:star (:or tag form))) - :lisp) - -;;; Mapping -(define-caller-pattern mapcar (fn form (:star form)) :lisp) -(define-caller-pattern maplist (fn form (:star form)) :lisp) -(define-caller-pattern mapc (fn form (:star form)) :lisp) -(define-caller-pattern mapl (fn form (:star form)) :lisp) -(define-caller-pattern mapcan (fn form (:star form)) :lisp) -(define-caller-pattern mapcon (fn form (:star form)) :lisp) - -;;; The "Program Feature" -(define-caller-pattern tagbody ((:star (:or tag form))) :lisp) -(define-caller-pattern prog - (((:star (:or var (var (:optional form))))) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern prog* - (((:star (:or var (var (:optional form))))) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern go (tag) :lisp) - -;;; Multiple Values -(define-caller-pattern values ((:star form)) :lisp) -(define-variable-pattern multiple-values-limit :lisp) -(define-caller-pattern values-list (form) :lisp) -(define-caller-pattern multiple-value-list (form) :lisp) -(define-caller-pattern multiple-value-call (fn (:star form)) :lisp) -(define-caller-pattern multiple-value-prog1 (form (:star form)) :lisp) -(define-caller-pattern multiple-value-bind - (((:star var)) form - (:star declaration) - (:star form)) - :lisp) -(define-caller-pattern multiple-value-setq (((:star var)) form) :lisp) -(define-caller-pattern nth-value (form form) :lisp2) - -;;; Dynamic Non-Local Exits -(define-caller-pattern catch (tag (:star form)) :lisp) -(define-caller-pattern throw (tag form) :lisp) -(define-caller-pattern unwind-protect (form (:star form)) :lisp) - -;;; Macros -(define-caller-pattern macro-function (form) :lisp) -(define-caller-pattern defmacro - (name - lambda-list - (:star (:or declaration documentation-string)) - (:star form)) - :lisp) -(define-caller-pattern macroexpand (form (:optional :ignore)) :lisp) -(define-caller-pattern macroexpand-1 (form (:optional :ignore)) :lisp) -(define-variable-pattern *macroexpand-hook* :lisp) - -;;; Destructuring -(define-caller-pattern destructuring-bind - (lambda-list form - (:star declaration) - (:star form)) - :lisp2) - -;;; Compiler Macros -(define-caller-pattern define-compiler-macro - (name lambda-list - (:star (:or declaration documentation-string)) - (:star form)) - :lisp2) -(define-caller-pattern compiler-macro-function (form) :lisp2) -(define-caller-pattern compiler-macroexpand (form (:optional :ignore)) :lisp2) -(define-caller-pattern compiler-macroexpand-1 (form (:optional :ignore)) - :lisp2) - -;;; Environments -(define-caller-pattern variable-information (form &optional :ignore) - :lisp2) -(define-caller-pattern function-information (fn &optional :ignore) :lisp2) -(define-caller-pattern declaration-information (form &optional :ignore) :lisp2) -(define-caller-pattern augment-environment (form &key (:star :ignore)) :lisp2) -(define-caller-pattern define-declaration - (name - lambda-list - (:star form)) - :lisp2) -(define-caller-pattern parse-macro (name lambda-list form) :lisp2) -(define-caller-pattern enclose (form &optional :ignore) :lisp2) - - -;;; Declarations -(define-caller-pattern declare ((:rest :ignore)) :lisp) -(define-caller-pattern proclaim ((:rest :ignore)) :lisp) -(define-caller-pattern locally ((:star declaration) (:star form)) :lisp) -(define-caller-pattern declaim ((:rest :ignore)) :lisp2) -(define-caller-pattern the (form form) :lisp) - -;;; Symbols -(define-caller-pattern get (form form (:optional form)) :lisp) -(define-caller-pattern remprop (form form) :lisp) -(define-caller-pattern symbol-plist (form) :lisp) -(define-caller-pattern getf (form form (:optional form)) :lisp) -(define-caller-pattern remf (form form) :lisp) -(define-caller-pattern get-properties (form form) :lisp) - -(define-caller-pattern symbol-name (form) :lisp) -(define-caller-pattern make-symbol (form) :lisp) -(define-caller-pattern copy-symbol (form (:optional :ignore)) :lisp) -(define-caller-pattern gensym ((:optional :ignore)) :lisp) -(define-variable-pattern *gensym-counter* :lisp2) -(define-caller-pattern gentemp ((:optional :ignore :ignore)) :lisp) -(define-caller-pattern symbol-package (form) :lisp) -(define-caller-pattern keywordp (form) :lisp) - -;;; Packages -(define-variable-pattern *package* :lisp) -(define-caller-pattern make-package ((:rest :ignore)) :lisp) -(define-caller-pattern in-package ((:rest :ignore)) :lisp) -(define-caller-pattern find-package ((:rest :ignore)) :lisp) -(define-caller-pattern package-name ((:rest :ignore)) :lisp) -(define-caller-pattern package-nicknames ((:rest :ignore)) :lisp) -(define-caller-pattern rename-package ((:rest :ignore)) :lisp) -(define-caller-pattern package-use-list ((:rest :ignore)) :lisp) -(define-caller-pattern package-used-by-list ((:rest :ignore)) :lisp) -(define-caller-pattern package-shadowing-symbols ((:rest :ignore)) :lisp) -(define-caller-pattern list-all-packages () :lisp) -(define-caller-pattern delete-package ((:rest :ignore)) :lisp2) -(define-caller-pattern intern (form &optional :ignore) :lisp) -(define-caller-pattern find-symbol (form &optional :ignore) :lisp) -(define-caller-pattern unintern (form &optional :ignore) :lisp) - -(define-caller-pattern export ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) -(define-caller-pattern unexport ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) -(define-caller-pattern import ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) -(define-caller-pattern shadowing-import ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) -(define-caller-pattern shadow ((:or symbol ((:star symbol))) - &optional :ignore) :lisp) - -(define-caller-pattern use-package ((:rest :ignore)) :lisp) -(define-caller-pattern unuse-package ((:rest :ignore)) :lisp) -(define-caller-pattern defpackage (name (:rest :ignore)) :lisp2) -(define-caller-pattern find-all-symbols (form) :lisp) -(define-caller-pattern do-symbols - ((var (:optional form (:optional form))) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern do-external-symbols - ((var (:optional form (:optional form))) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern do-all-symbols - ((var (:optional form)) - (:star declaration) - (:star (:or tag form))) - :lisp) -(define-caller-pattern with-package-iterator - ((name form (:plus :ignore)) - (:star form)) - :lisp2) - -;;; Modules -(define-variable-pattern *modules* :lisp) -(define-caller-pattern provide (form) :lisp) -(define-caller-pattern require (form &optional :ignore) :lisp) - - -;;; Numbers -(define-caller-pattern zerop (form) :lisp) -(define-caller-pattern plusp (form) :lisp) -(define-caller-pattern minusp (form) :lisp) -(define-caller-pattern oddp (form) :lisp) -(define-caller-pattern evenp (form) :lisp) - -(define-caller-pattern = (form (:star form)) :lisp) -(define-caller-pattern /= (form (:star form)) :lisp) -(define-caller-pattern > (form (:star form)) :lisp) -(define-caller-pattern < (form (:star form)) :lisp) -(define-caller-pattern <= (form (:star form)) :lisp) -(define-caller-pattern >= (form (:star form)) :lisp) - -(define-caller-pattern max (form (:star form)) :lisp) -(define-caller-pattern min (form (:star form)) :lisp) - -(define-caller-pattern - (form (:star form)) :lisp) -(define-caller-pattern + (form (:star form)) :lisp) -(define-caller-pattern * (form (:star form)) :lisp) -(define-caller-pattern / (form (:star form)) :lisp) -(define-caller-pattern 1+ (form) :lisp) -(define-caller-pattern 1- (form) :lisp) - -(define-caller-pattern incf (form form) :lisp) -(define-caller-pattern decf (form form) :lisp) - -(define-caller-pattern conjugate (form) :lisp) - -(define-caller-pattern gcd ((:star form)) :lisp) -(define-caller-pattern lcm ((:star form)) :lisp) - -(define-caller-pattern exp (form) :lisp) -(define-caller-pattern expt (form form) :lisp) -(define-caller-pattern log (form (:optional form)) :lisp) -(define-caller-pattern sqrt (form) :lisp) -(define-caller-pattern isqrt (form) :lisp) - -(define-caller-pattern abs (form) :lisp) -(define-caller-pattern phase (form) :lisp) -(define-caller-pattern signum (form) :lisp) -(define-caller-pattern sin (form) :lisp) -(define-caller-pattern cos (form) :lisp) -(define-caller-pattern tan (form) :lisp) -(define-caller-pattern cis (form) :lisp) -(define-caller-pattern asin (form) :lisp) -(define-caller-pattern acos (form) :lisp) -(define-caller-pattern atan (form &optional form) :lisp) -(define-variable-pattern pi :lisp) - -(define-caller-pattern sinh (form) :lisp) -(define-caller-pattern cosh (form) :lisp) -(define-caller-pattern tanh (form) :lisp) -(define-caller-pattern asinh (form) :lisp) -(define-caller-pattern acosh (form) :lisp) -(define-caller-pattern atanh (form) :lisp) - -;;; Type Conversions and Extractions -(define-caller-pattern float (form (:optional form)) :lisp) -(define-caller-pattern rational (form) :lisp) -(define-caller-pattern rationalize (form) :lisp) -(define-caller-pattern numerator (form) :lisp) -(define-caller-pattern denominator (form) :lisp) - -(define-caller-pattern floor (form (:optional form)) :lisp) -(define-caller-pattern ceiling (form (:optional form)) :lisp) -(define-caller-pattern truncate (form (:optional form)) :lisp) -(define-caller-pattern round (form (:optional form)) :lisp) - -(define-caller-pattern mod (form form) :lisp) -(define-caller-pattern rem (form form) :lisp) - -(define-caller-pattern ffloor (form (:optional form)) :lisp) -(define-caller-pattern fceiling (form (:optional form)) :lisp) -(define-caller-pattern ftruncate (form (:optional form)) :lisp) -(define-caller-pattern fround (form (:optional form)) :lisp) - -(define-caller-pattern decode-float (form) :lisp) -(define-caller-pattern scale-float (form form) :lisp) -(define-caller-pattern float-radix (form) :lisp) -(define-caller-pattern float-sign (form (:optional form)) :lisp) -(define-caller-pattern float-digits (form) :lisp) -(define-caller-pattern float-precision (form) :lisp) -(define-caller-pattern integer-decode-float (form) :lisp) - -(define-caller-pattern complex (form (:optional form)) :lisp) -(define-caller-pattern realpart (form) :lisp) -(define-caller-pattern imagpart (form) :lisp) - -(define-caller-pattern logior ((:star form)) :lisp) -(define-caller-pattern logxor ((:star form)) :lisp) -(define-caller-pattern logand ((:star form)) :lisp) -(define-caller-pattern logeqv ((:star form)) :lisp) - -(define-caller-pattern lognand (form form) :lisp) -(define-caller-pattern lognor (form form) :lisp) -(define-caller-pattern logandc1 (form form) :lisp) -(define-caller-pattern logandc2 (form form) :lisp) -(define-caller-pattern logorc1 (form form) :lisp) -(define-caller-pattern logorc2 (form form) :lisp) - -(define-caller-pattern boole (form form form) :lisp) -(define-variable-pattern boole-clr :lisp) -(define-variable-pattern boole-set :lisp) -(define-variable-pattern boole-1 :lisp) -(define-variable-pattern boole-2 :lisp) -(define-variable-pattern boole-c1 :lisp) -(define-variable-pattern boole-c2 :lisp) -(define-variable-pattern boole-and :lisp) -(define-variable-pattern boole-ior :lisp) -(define-variable-pattern boole-xor :lisp) -(define-variable-pattern boole-eqv :lisp) -(define-variable-pattern boole-nand :lisp) -(define-variable-pattern boole-nor :lisp) -(define-variable-pattern boole-andc1 :lisp) -(define-variable-pattern boole-andc2 :lisp) -(define-variable-pattern boole-orc1 :lisp) -(define-variable-pattern boole-orc2 :lisp) - -(define-caller-pattern lognot (form) :lisp) -(define-caller-pattern logtest (form form) :lisp) -(define-caller-pattern logbitp (form form) :lisp) -(define-caller-pattern ash (form form) :lisp) -(define-caller-pattern logcount (form) :lisp) -(define-caller-pattern integer-length (form) :lisp) - -(define-caller-pattern byte (form form) :lisp) -(define-caller-pattern byte-size (form) :lisp) -(define-caller-pattern byte-position (form) :lisp) -(define-caller-pattern ldb (form form) :lisp) -(define-caller-pattern ldb-test (form form) :lisp) -(define-caller-pattern mask-field (form form) :lisp) -(define-caller-pattern dpb (form form form) :lisp) -(define-caller-pattern deposit-field (form form form) :lisp) - -;;; Random Numbers -(define-caller-pattern random (form (:optional form)) :lisp) -(define-variable-pattern *random-state* :lisp) -(define-caller-pattern make-random-state ((:optional form)) :lisp) -(define-caller-pattern random-state-p (form) :lisp) - -;;; Implementation Parameters -(define-variable-pattern most-positive-fixnum :lisp) -(define-variable-pattern most-negative-fixnum :lisp) -(define-variable-pattern most-positive-short-float :lisp) -(define-variable-pattern least-positive-short-float :lisp) -(define-variable-pattern least-negative-short-float :lisp) -(define-variable-pattern most-negative-short-float :lisp) -(define-variable-pattern most-positive-single-float :lisp) -(define-variable-pattern least-positive-single-float :lisp) -(define-variable-pattern least-negative-single-float :lisp) -(define-variable-pattern most-negative-single-float :lisp) -(define-variable-pattern most-positive-double-float :lisp) -(define-variable-pattern least-positive-double-float :lisp) -(define-variable-pattern least-negative-double-float :lisp) -(define-variable-pattern most-negative-double-float :lisp) -(define-variable-pattern most-positive-long-float :lisp) -(define-variable-pattern least-positive-long-float :lisp) -(define-variable-pattern least-negative-long-float :lisp) -(define-variable-pattern most-negative-long-float :lisp) -(define-variable-pattern least-positive-normalized-short-float :lisp2) -(define-variable-pattern least-negative-normalized-short-float :lisp2) -(define-variable-pattern least-positive-normalized-single-float :lisp2) -(define-variable-pattern least-negative-normalized-single-float :lisp2) -(define-variable-pattern least-positive-normalized-double-float :lisp2) -(define-variable-pattern least-negative-normalized-double-float :lisp2) -(define-variable-pattern least-positive-normalized-long-float :lisp2) -(define-variable-pattern least-negative-normalized-long-float :lisp2) -(define-variable-pattern short-float-epsilon :lisp) -(define-variable-pattern single-float-epsilon :lisp) -(define-variable-pattern double-float-epsilon :lisp) -(define-variable-pattern long-float-epsilon :lisp) -(define-variable-pattern short-float-negative-epsilon :lisp) -(define-variable-pattern single-float-negative-epsilon :lisp) -(define-variable-pattern double-float-negative-epsilon :lisp) -(define-variable-pattern long-float-negative-epsilon :lisp) - -;;; Characters -(define-variable-pattern char-code-limit :lisp) -(define-variable-pattern char-font-limit :lisp) -(define-variable-pattern char-bits-limit :lisp) -(define-caller-pattern standard-char-p (form) :lisp) -(define-caller-pattern graphic-char-p (form) :lisp) -(define-caller-pattern string-char-p (form) :lisp) -(define-caller-pattern alpha-char-p (form) :lisp) -(define-caller-pattern upper-case-p (form) :lisp) -(define-caller-pattern lower-case-p (form) :lisp) -(define-caller-pattern both-case-p (form) :lisp) -(define-caller-pattern digit-char-p (form (:optional form)) :lisp) -(define-caller-pattern alphanumericp (form) :lisp) - -(define-caller-pattern char= ((:star form)) :lisp) -(define-caller-pattern char/= ((:star form)) :lisp) -(define-caller-pattern char< ((:star form)) :lisp) -(define-caller-pattern char> ((:star form)) :lisp) -(define-caller-pattern char<= ((:star form)) :lisp) -(define-caller-pattern char>= ((:star form)) :lisp) - -(define-caller-pattern char-equal ((:star form)) :lisp) -(define-caller-pattern char-not-equal ((:star form)) :lisp) -(define-caller-pattern char-lessp ((:star form)) :lisp) -(define-caller-pattern char-greaterp ((:star form)) :lisp) -(define-caller-pattern char-not-greaterp ((:star form)) :lisp) -(define-caller-pattern char-not-lessp ((:star form)) :lisp) - -(define-caller-pattern char-code (form) :lisp) -(define-caller-pattern char-bits (form) :lisp) -(define-caller-pattern char-font (form) :lisp) -(define-caller-pattern code-char (form (:optional form form)) :lisp) -(define-caller-pattern make-char (form (:optional form form)) :lisp) -(define-caller-pattern characterp (form) :lisp) -(define-caller-pattern char-upcase (form) :lisp) -(define-caller-pattern char-downcase (form) :lisp) -(define-caller-pattern digit-char (form (:optional form form)) :lisp) -(define-caller-pattern char-int (form) :lisp) -(define-caller-pattern int-char (form) :lisp) -(define-caller-pattern char-name (form) :lisp) -(define-caller-pattern name-char (form) :lisp) -(define-variable-pattern char-control-bit :lisp) -(define-variable-pattern char-meta-bit :lisp) -(define-variable-pattern char-super-bit :lisp) -(define-variable-pattern char-hyper-bit :lisp) -(define-caller-pattern char-bit (form form) :lisp) -(define-caller-pattern set-char-bit (form form form) :lisp) - -;;; Sequences -(define-caller-pattern complement (fn) :lisp2) -(define-caller-pattern elt (form form) :lisp) -(define-caller-pattern subseq (form form &optional form) :lisp) -(define-caller-pattern copy-seq (form) :lisp) -(define-caller-pattern length (form) :lisp) -(define-caller-pattern reverse (form) :lisp) -(define-caller-pattern nreverse (form) :lisp) -(define-caller-pattern make-sequence (form form &key form) :lisp) - -(define-caller-pattern concatenate (form (:star form)) :lisp) -(define-caller-pattern map (form fn form (:star form)) :lisp) -(define-caller-pattern map-into (form fn (:star form)) :lisp2) - -(define-caller-pattern some (fn form (:star form)) :lisp) -(define-caller-pattern every (fn form (:star form)) :lisp) -(define-caller-pattern notany (fn form (:star form)) :lisp) -(define-caller-pattern notevery (fn form (:star form)) :lisp) - -(define-caller-pattern reduce (fn form &key (:star form)) :lisp) -(define-caller-pattern fill (form form &key (:star form)) :lisp) -(define-caller-pattern replace (form form &key (:star form)) :lisp) -(define-caller-pattern remove (form form &key (:star form)) :lisp) -(define-caller-pattern remove-if (fn form &key (:star form)) :lisp) -(define-caller-pattern remove-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern delete (form form &key (:star form)) :lisp) -(define-caller-pattern delete-if (fn form &key (:star form)) :lisp) -(define-caller-pattern delete-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern remove-duplicates (form &key (:star form)) :lisp) -(define-caller-pattern delete-duplicates (form &key (:star form)) :lisp) -(define-caller-pattern substitute (form form form &key (:star form)) :lisp) -(define-caller-pattern substitute-if (form fn form &key (:star form)) :lisp) -(define-caller-pattern substitute-if-not (form fn form &key (:star form)) - :lisp) -(define-caller-pattern nsubstitute (form form form &key (:star form)) :lisp) -(define-caller-pattern nsubstitute-if (form fn form &key (:star form)) :lisp) -(define-caller-pattern nsubstitute-if-not (form fn form &key (:star form)) - :lisp) -(define-caller-pattern find (form form &key (:star form)) :lisp) -(define-caller-pattern find-if (fn form &key (:star form)) :lisp) -(define-caller-pattern find-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern position (form form &key (:star form)) :lisp) -(define-caller-pattern position-if (fn form &key (:star form)) :lisp) -(define-caller-pattern position-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern count (form form &key (:star form)) :lisp) -(define-caller-pattern count-if (fn form &key (:star form)) :lisp) -(define-caller-pattern count-if-not (fn form &key (:star form)) :lisp) -(define-caller-pattern mismatch (form form &key (:star form)) :lisp) -(define-caller-pattern search (form form &key (:star form)) :lisp) -(define-caller-pattern sort (form fn &key (:star form)) :lisp) -(define-caller-pattern stable-sort (form fn &key (:star form)) :lisp) -(define-caller-pattern merge (form form form fn &key (:star form)) :lisp) - -;;; Lists -(define-caller-pattern car (form) :lisp) -(define-caller-pattern cdr (form) :lisp) -(define-caller-pattern caar (form) :lisp) -(define-caller-pattern cadr (form) :lisp) -(define-caller-pattern cdar (form) :lisp) -(define-caller-pattern cddr (form) :lisp) -(define-caller-pattern caaar (form) :lisp) -(define-caller-pattern caadr (form) :lisp) -(define-caller-pattern cadar (form) :lisp) -(define-caller-pattern caddr (form) :lisp) -(define-caller-pattern cdaar (form) :lisp) -(define-caller-pattern cdadr (form) :lisp) -(define-caller-pattern cddar (form) :lisp) -(define-caller-pattern cdddr (form) :lisp) -(define-caller-pattern caaaar (form) :lisp) -(define-caller-pattern caaadr (form) :lisp) -(define-caller-pattern caadar (form) :lisp) -(define-caller-pattern caaddr (form) :lisp) -(define-caller-pattern cadaar (form) :lisp) -(define-caller-pattern cadadr (form) :lisp) -(define-caller-pattern caddar (form) :lisp) -(define-caller-pattern cadddr (form) :lisp) -(define-caller-pattern cdaaar (form) :lisp) -(define-caller-pattern cdaadr (form) :lisp) -(define-caller-pattern cdadar (form) :lisp) -(define-caller-pattern cdaddr (form) :lisp) -(define-caller-pattern cddaar (form) :lisp) -(define-caller-pattern cddadr (form) :lisp) -(define-caller-pattern cdddar (form) :lisp) -(define-caller-pattern cddddr (form) :lisp) - -(define-caller-pattern cons (form form) :lisp) -(define-caller-pattern tree-equal (form form &key (:star fn)) :lisp) -(define-caller-pattern endp (form) :lisp) -(define-caller-pattern list-length (form) :lisp) -(define-caller-pattern nth (form form) :lisp) - -(define-caller-pattern first (form) :lisp) -(define-caller-pattern second (form) :lisp) -(define-caller-pattern third (form) :lisp) -(define-caller-pattern fourth (form) :lisp) -(define-caller-pattern fifth (form) :lisp) -(define-caller-pattern sixth (form) :lisp) -(define-caller-pattern seventh (form) :lisp) -(define-caller-pattern eighth (form) :lisp) -(define-caller-pattern ninth (form) :lisp) -(define-caller-pattern tenth (form) :lisp) - -(define-caller-pattern rest (form) :lisp) -(define-caller-pattern nthcdr (form form) :lisp) -(define-caller-pattern last (form (:optional form)) :lisp) -(define-caller-pattern list ((:star form)) :lisp) -(define-caller-pattern list* ((:star form)) :lisp) -(define-caller-pattern make-list (form &key (:star form)) :lisp) -(define-caller-pattern append ((:star form)) :lisp) -(define-caller-pattern copy-list (form) :lisp) -(define-caller-pattern copy-alist (form) :lisp) -(define-caller-pattern copy-tree (form) :lisp) -(define-caller-pattern revappend (form form) :lisp) -(define-caller-pattern nconc ((:star form)) :lisp) -(define-caller-pattern nreconc (form form) :lisp) -(define-caller-pattern push (form form) :lisp) -(define-caller-pattern pushnew (form form &key (:star form)) :lisp) -(define-caller-pattern pop (form) :lisp) -(define-caller-pattern butlast (form (:optional form)) :lisp) -(define-caller-pattern nbutlast (form (:optional form)) :lisp) -(define-caller-pattern ldiff (form form) :lisp) -(define-caller-pattern rplaca (form form) :lisp) -(define-caller-pattern rplacd (form form) :lisp) - -(define-caller-pattern subst (form form form &key (:star form)) :lisp) -(define-caller-pattern subst-if (form fn form &key (:star form)) :lisp) -(define-caller-pattern subst-if-not (form fn form &key (:star form)) :lisp) -(define-caller-pattern nsubst (form form form &key (:star form)) :lisp) -(define-caller-pattern nsubst-if (form fn form &key (:star form)) :lisp) -(define-caller-pattern nsubst-if-not (form fn form &key (:star form)) :lisp) -(define-caller-pattern sublis (form form &key (:star form)) :lisp) -(define-caller-pattern nsublis (form form &key (:star form)) :lisp) -(define-caller-pattern member (form form &key (:star form)) :lisp) -(define-caller-pattern member-if (fn form &key (:star form)) :lisp) -(define-caller-pattern member-if-not (fn form &key (:star form)) :lisp) - -(define-caller-pattern tailp (form form) :lisp) -(define-caller-pattern adjoin (form form &key (:star form)) :lisp) -(define-caller-pattern union (form form &key (:star form)) :lisp) -(define-caller-pattern nunion (form form &key (:star form)) :lisp) -(define-caller-pattern intersection (form form &key (:star form)) :lisp) -(define-caller-pattern nintersection (form form &key (:star form)) :lisp) -(define-caller-pattern set-difference (form form &key (:star form)) :lisp) -(define-caller-pattern nset-difference (form form &key (:star form)) :lisp) -(define-caller-pattern set-exclusive-or (form form &key (:star form)) :lisp) -(define-caller-pattern nset-exclusive-or (form form &key (:star form)) :lisp) -(define-caller-pattern subsetp (form form &key (:star form)) :lisp) - -(define-caller-pattern acons (form form form) :lisp) -(define-caller-pattern pairlis (form form (:optional form)) :lisp) -(define-caller-pattern assoc (form form &key (:star form)) :lisp) -(define-caller-pattern assoc-if (fn form) :lisp) -(define-caller-pattern assoc-if-not (fn form) :lisp) -(define-caller-pattern rassoc (form form &key (:star form)) :lisp) -(define-caller-pattern rassoc-if (fn form &key (:star form)) :lisp) -(define-caller-pattern rassoc-if-not (fn form &key (:star form)) :lisp) - -;;; Hash Tables -(define-caller-pattern make-hash-table (&key (:star form)) :lisp) -(define-caller-pattern hash-table-p (form) :lisp) -(define-caller-pattern gethash (form form (:optional form)) :lisp) -(define-caller-pattern remhash (form form) :lisp) -(define-caller-pattern maphash (fn form) :lisp) -(define-caller-pattern clrhash (form) :lisp) -(define-caller-pattern hash-table-count (form) :lisp) -(define-caller-pattern with-hash-table-iterator - ((name form) (:star form)) :lisp2) -(define-caller-pattern hash-table-rehash-size (form) :lisp2) -(define-caller-pattern hash-table-rehash-threshold (form) :lisp2) -(define-caller-pattern hash-table-size (form) :lisp2) -(define-caller-pattern hash-table-test (form) :lisp2) -(define-caller-pattern sxhash (form) :lisp) - -;;; Arrays -(define-caller-pattern make-array (form &key (:star form)) :lisp) -(define-variable-pattern array-rank-limit :lisp) -(define-variable-pattern array-dimension-limit :lisp) -(define-variable-pattern array-total-size-limit :lisp) -(define-caller-pattern vector ((:star form)) :lisp) -(define-caller-pattern aref (form (:star form)) :lisp) -(define-caller-pattern svref (form form) :lisp) -(define-caller-pattern array-element-type (form) :lisp) -(define-caller-pattern array-rank (form) :lisp) -(define-caller-pattern array-dimension (form form) :lisp) -(define-caller-pattern array-dimensions (form) :lisp) -(define-caller-pattern array-total-size (form) :lisp) -(define-caller-pattern array-in-bounds-p (form (:star form)) :lisp) -(define-caller-pattern array-row-major-index (form (:star form)) :lisp) -(define-caller-pattern row-major-aref (form form) :lisp2) -(define-caller-pattern adjustable-array-p (form) :lisp) - -(define-caller-pattern bit (form (:star form)) :lisp) -(define-caller-pattern sbit (form (:star form)) :lisp) - -(define-caller-pattern bit-and (form form (:optional form)) :lisp) -(define-caller-pattern bit-ior (form form (:optional form)) :lisp) -(define-caller-pattern bit-xor (form form (:optional form)) :lisp) -(define-caller-pattern bit-eqv (form form (:optional form)) :lisp) -(define-caller-pattern bit-nand (form form (:optional form)) :lisp) -(define-caller-pattern bit-nor (form form (:optional form)) :lisp) -(define-caller-pattern bit-andc1 (form form (:optional form)) :lisp) -(define-caller-pattern bit-andc2 (form form (:optional form)) :lisp) -(define-caller-pattern bit-orc1 (form form (:optional form)) :lisp) -(define-caller-pattern bit-orc2 (form form (:optional form)) :lisp) -(define-caller-pattern bit-not (form (:optional form)) :lisp) - -(define-caller-pattern array-has-fill-pointer-p (form) :lisp) -(define-caller-pattern fill-pointer (form) :lisp) -(define-caller-pattern vector-push (form form) :lisp) -(define-caller-pattern vector-push-extend (form form (:optional form)) :lisp) -(define-caller-pattern vector-pop (form) :lisp) -(define-caller-pattern adjust-array (form form &key (:star form)) :lisp) - -;;; Strings -(define-caller-pattern char (form form) :lisp) -(define-caller-pattern schar (form form) :lisp) -(define-caller-pattern string= (form form &key (:star form)) :lisp) -(define-caller-pattern string-equal (form form &key (:star form)) :lisp) -(define-caller-pattern string< (form form &key (:star form)) :lisp) -(define-caller-pattern string> (form form &key (:star form)) :lisp) -(define-caller-pattern string<= (form form &key (:star form)) :lisp) -(define-caller-pattern string>= (form form &key (:star form)) :lisp) -(define-caller-pattern string/= (form form &key (:star form)) :lisp) -(define-caller-pattern string-lessp (form form &key (:star form)) :lisp) -(define-caller-pattern string-greaterp (form form &key (:star form)) :lisp) -(define-caller-pattern string-not-greaterp (form form &key (:star form)) :lisp) -(define-caller-pattern string-not-lessp (form form &key (:star form)) :lisp) -(define-caller-pattern string-not-equal (form form &key (:star form)) :lisp) - -(define-caller-pattern make-string (form &key (:star form)) :lisp) -(define-caller-pattern string-trim (form form) :lisp) -(define-caller-pattern string-left-trim (form form) :lisp) -(define-caller-pattern string-right-trim (form form) :lisp) -(define-caller-pattern string-upcase (form &key (:star form)) :lisp) -(define-caller-pattern string-downcase (form &key (:star form)) :lisp) -(define-caller-pattern string-capitalize (form &key (:star form)) :lisp) -(define-caller-pattern nstring-upcase (form &key (:star form)) :lisp) -(define-caller-pattern nstring-downcase (form &key (:star form)) :lisp) -(define-caller-pattern nstring-capitalize (form &key (:star form)) :lisp) -(define-caller-pattern string (form) :lisp) - -;;; Structures -(define-caller-pattern defstruct - ((:or name (name (:rest :ignore))) - (:optional documentation-string) - (:plus :ignore)) - :lisp) - -;;; The Evaluator -(define-caller-pattern eval (form) :lisp) -(define-variable-pattern *evalhook* :lisp) -(define-variable-pattern *applyhook* :lisp) -(define-caller-pattern evalhook (form fn fn &optional :ignore) :lisp) -(define-caller-pattern applyhook (fn form fn fn &optional :ignore) :lisp) -(define-caller-pattern constantp (form) :lisp) - -;;; Streams -(define-variable-pattern *standard-input* :lisp) -(define-variable-pattern *standard-output* :lisp) -(define-variable-pattern *error-output* :lisp) -(define-variable-pattern *query-io* :lisp) -(define-variable-pattern *debug-io* :lisp) -(define-variable-pattern *terminal-io* :lisp) -(define-variable-pattern *trace-output* :lisp) -(define-caller-pattern make-synonym-stream (symbol) :lisp) -(define-caller-pattern make-broadcast-stream ((:star form)) :lisp) -(define-caller-pattern make-concatenated-stream ((:star form)) :lisp) -(define-caller-pattern make-two-way-stream (form form) :lisp) -(define-caller-pattern make-echo-stream (form form) :lisp) -(define-caller-pattern make-string-input-stream (form &optional form form) - :lisp) -(define-caller-pattern make-string-output-stream (&key (:star form)) :lisp) -(define-caller-pattern get-output-stream-string (form) :lisp) - -(define-caller-pattern with-open-stream - ((var form) - (:star declaration) - (:star form)) - :lisp) - -(define-caller-pattern with-input-from-string - ((var form &key (:star form)) - (:star declaration) - (:star form)) - :lisp) - -(define-caller-pattern with-output-to-string - ((var (:optional form)) - (:star declaration) - (:star form)) - :lisp) -(define-caller-pattern streamp (form) :lisp) -(define-caller-pattern open-stream-p (form) :lisp2) -(define-caller-pattern input-stream-p (form) :lisp) -(define-caller-pattern output-stream-p (form) :lisp) -(define-caller-pattern stream-element-type (form) :lisp) -(define-caller-pattern close (form (:rest :ignore)) :lisp) -(define-caller-pattern broadcast-stream-streams (form) :lisp2) -(define-caller-pattern concatenated-stream-streams (form) :lisp2) -(define-caller-pattern echo-stream-input-stream (form) :lisp2) -(define-caller-pattern echo-stream-output-stream (form) :lisp2) -(define-caller-pattern synonym-stream-symbol (form) :lisp2) -(define-caller-pattern two-way-stream-input-stream (form) :lisp2) -(define-caller-pattern two-way-stream-output-stream (form) :lisp2) -(define-caller-pattern interactive-stream-p (form) :lisp2) -(define-caller-pattern stream-external-format (form) :lisp2) - -;;; Reader -(define-variable-pattern *read-base* :lisp) -(define-variable-pattern *read-suppress* :lisp) -(define-variable-pattern *read-eval* :lisp2) -(define-variable-pattern *readtable* :lisp) -(define-caller-pattern copy-readtable (&optional form form) :lisp) -(define-caller-pattern readtablep (form) :lisp) -(define-caller-pattern set-syntax-from-char (form form &optional form form) - :lisp) -(define-caller-pattern set-macro-character (form fn &optional form) :lisp) -(define-caller-pattern get-macro-character (form (:optional form)) :lisp) -(define-caller-pattern make-dispatch-macro-character (form &optional form form) - :lisp) -(define-caller-pattern set-dispatch-macro-character - (form form fn (:optional form)) :lisp) -(define-caller-pattern get-dispatch-macro-character - (form form (:optional form)) :lisp) -(define-caller-pattern readtable-case (form) :lisp2) -(define-variable-pattern *print-readably* :lisp2) -(define-variable-pattern *print-escape* :lisp) -(define-variable-pattern *print-pretty* :lisp) -(define-variable-pattern *print-circle* :lisp) -(define-variable-pattern *print-base* :lisp) -(define-variable-pattern *print-radix* :lisp) -(define-variable-pattern *print-case* :lisp) -(define-variable-pattern *print-gensym* :lisp) -(define-variable-pattern *print-level* :lisp) -(define-variable-pattern *print-length* :lisp) -(define-variable-pattern *print-array* :lisp) -(define-caller-pattern with-standard-io-syntax - ((:star declaration) - (:star form)) - :lisp2) - -(define-caller-pattern read (&optional form form form form) :lisp) -(define-variable-pattern *read-default-float-format* :lisp) -(define-caller-pattern read-preserving-whitespace - (&optional form form form form) :lisp) -(define-caller-pattern read-delimited-list (form &optional form form) :lisp) -(define-caller-pattern read-line (&optional form form form form) :lisp) -(define-caller-pattern read-char (&optional form form form form) :lisp) -(define-caller-pattern unread-char (form (:optional form)) :lisp) -(define-caller-pattern peek-char (&optional form form form form) :lisp) -(define-caller-pattern listen ((:optional form)) :lisp) -(define-caller-pattern read-char-no-hang ((:star form)) :lisp) -(define-caller-pattern clear-input ((:optional form)) :lisp) -(define-caller-pattern read-from-string (form (:star form)) :lisp) -(define-caller-pattern parse-integer (form &rest :ignore) :lisp) -(define-caller-pattern read-byte ((:star form)) :lisp) - -(define-caller-pattern write (form &key (:star form)) :lisp) -(define-caller-pattern prin1 (form (:optional form)) :lisp) -(define-caller-pattern print (form (:optional form)) :lisp) -(define-caller-pattern pprint (form (:optional form)) :lisp) -(define-caller-pattern princ (form (:optional form)) :lisp) -(define-caller-pattern write-to-string (form &key (:star form)) :lisp) -(define-caller-pattern prin1-to-string (form) :lisp) -(define-caller-pattern princ-to-string (form) :lisp) -(define-caller-pattern write-char (form (:optional form)) :lisp) -(define-caller-pattern write-string (form &optional form &key (:star form)) - :lisp) -(define-caller-pattern write-line (form &optional form &key (:star form)) - :lisp) -(define-caller-pattern terpri ((:optional form)) :lisp) -(define-caller-pattern fresh-line ((:optional form)) :lisp) -(define-caller-pattern finish-output ((:optional form)) :lisp) -(define-caller-pattern force-output ((:optional form)) :lisp) -(define-caller-pattern clear-output ((:optional form)) :lisp) -(define-caller-pattern print-unreadable-object - ((form form &key (:star form)) - (:star declaration) - (:star form)) - :lisp2) -(define-caller-pattern write-byte (form form) :lisp) -(define-caller-pattern format - (destination - control-string - (:rest format-arguments)) - :lisp) - -(define-caller-pattern y-or-n-p (control-string (:star form)) :lisp) -(define-caller-pattern yes-or-no-p (control-string (:star form)) :lisp) - -;;; Pathnames -(define-caller-pattern wild-pathname-p (form &optional form) :lisp2) -(define-caller-pattern pathname-match-p (form form) :lisp2) -(define-caller-pattern translate-pathname (form form form &key (:star form)) - :lisp2) - -(define-caller-pattern logical-pathname (form) :lisp2) -(define-caller-pattern translate-logical-pathname (form &key (:star form)) - :lisp2) -(define-caller-pattern logical-pathname-translations (form) :lisp2) -(define-caller-pattern load-logical-pathname-translations (form) :lisp2) -(define-caller-pattern compile-file-pathname (form &key form) :lisp2) - -(define-caller-pattern pathname (form) :lisp) -(define-caller-pattern truename (form) :lisp) -(define-caller-pattern parse-namestring ((:star form)) :lisp) -(define-caller-pattern merge-pathnames ((:star form)) :lisp) -(define-variable-pattern *default-pathname-defaults* :lisp) -(define-caller-pattern make-pathname ((:star form)) :lisp) -(define-caller-pattern pathnamep (form) :lisp) -(define-caller-pattern pathname-host (form) :lisp) -(define-caller-pattern pathname-device (form) :lisp) -(define-caller-pattern pathname-directory (form) :lisp) -(define-caller-pattern pathname-name (form) :lisp) -(define-caller-pattern pathname-type (form) :lisp) -(define-caller-pattern pathname-version (form) :lisp) -(define-caller-pattern namestring (form) :lisp) -(define-caller-pattern file-namestring (form) :lisp) -(define-caller-pattern directory-namestring (form) :lisp) -(define-caller-pattern host-namestring (form) :lisp) -(define-caller-pattern enough-namestring (form (:optional form)) :lisp) -(define-caller-pattern user-homedir-pathname (&optional form) :lisp) -(define-caller-pattern open (form &key (:star form)) :lisp) -(define-caller-pattern with-open-file - ((var form (:rest :ignore)) - (:star declaration) - (:star form)) - :lisp) - -(define-caller-pattern rename-file (form form) :lisp) -(define-caller-pattern delete-file (form) :lisp) -(define-caller-pattern probe-file (form) :lisp) -(define-caller-pattern file-write-date (form) :lisp) -(define-caller-pattern file-author (form) :lisp) -(define-caller-pattern file-position (form (:optional form)) :lisp) -(define-caller-pattern file-length (form) :lisp) -(define-caller-pattern file-string-length (form form) :lisp2) -(define-caller-pattern load (form &key (:star form)) :lisp) -(define-variable-pattern *load-verbose* :lisp) -(define-variable-pattern *load-print* :lisp2) -(define-variable-pattern *load-pathname* :lisp2) -(define-variable-pattern *load-truename* :lisp2) -(define-caller-pattern make-load-form (form) :lisp2) -(define-caller-pattern make-load-form-saving-slots (form &optional form) - :lisp2) -(define-caller-pattern directory (form &key (:star form)) :lisp) - -;;; Errors -(define-caller-pattern error (form (:star form)) :lisp) -(define-caller-pattern cerror (form form (:star form)) :lisp) -(define-caller-pattern warn (form (:star form)) :lisp) -(define-variable-pattern *break-on-warnings* :lisp) -(define-caller-pattern break (&optional form (:star form)) :lisp) -(define-caller-pattern check-type (form form (:optional form)) :lisp) -(define-caller-pattern assert - (form - (:optional ((:star var)) - (:optional form (:star form)))) - :lisp) -(define-caller-pattern etypecase (form (:star (symbol (:star form)))) :lisp) -(define-caller-pattern ctypecase (form (:star (symbol (:star form)))) :lisp) -(define-caller-pattern ecase - (form - (:star ((:or symbol ((:star symbol))) - (:star form)))) - :lisp) -(define-caller-pattern ccase - (form - (:star ((:or symbol ((:star symbol))) - (:star form)))) - :lisp) - -;;; The Compiler -(define-caller-pattern compile (form (:optional form)) :lisp) -(define-caller-pattern compile-file (form &key (:star form)) :lisp) -(define-variable-pattern *compile-verbose* :lisp2) -(define-variable-pattern *compile-print* :lisp2) -(define-variable-pattern *compile-file-pathname* :lisp2) -(define-variable-pattern *compile-file-truename* :lisp2) -(define-caller-pattern load-time-value (form (:optional form)) :lisp2) -(define-caller-pattern disassemble (form) :lisp) -(define-caller-pattern function-lambda-expression (fn) :lisp2) -(define-caller-pattern with-compilation-unit (((:star :ignore)) (:star form)) - :lisp2) - -;;; Documentation -(define-caller-pattern documentation (form form) :lisp) -(define-caller-pattern trace ((:star form)) :lisp) -(define-caller-pattern untrace ((:star form)) :lisp) -(define-caller-pattern step (form) :lisp) -(define-caller-pattern time (form) :lisp) -(define-caller-pattern describe (form &optional form) :lisp) -(define-caller-pattern describe-object (form &optional form) :lisp2) -(define-caller-pattern inspect (form) :lisp) -(define-caller-pattern room ((:optional form)) :lisp) -(define-caller-pattern ed ((:optional form)) :lisp) -(define-caller-pattern dribble ((:optional form)) :lisp) -(define-caller-pattern apropos (form (:optional form)) :lisp) -(define-caller-pattern apropos-list (form (:optional form)) :lisp) -(define-caller-pattern get-decoded-time () :lisp) -(define-caller-pattern get-universal-time () :lisp) -(define-caller-pattern decode-universal-time (form &optional form) :lisp) -(define-caller-pattern encode-universal-time - (form form form form form form &optional form) :lisp) -(define-caller-pattern get-internal-run-time () :lisp) -(define-caller-pattern get-internal-real-time () :lisp) -(define-caller-pattern sleep (form) :lisp) - -(define-caller-pattern lisp-implementation-type () :lisp) -(define-caller-pattern lisp-implementation-version () :lisp) -(define-caller-pattern machine-type () :lisp) -(define-caller-pattern machine-version () :lisp) -(define-caller-pattern machine-instance () :lisp) -(define-caller-pattern software-type () :lisp) -(define-caller-pattern software-version () :lisp) -(define-caller-pattern short-site-name () :lisp) -(define-caller-pattern long-site-name () :lisp) -(define-variable-pattern *features* :lisp) - -(define-caller-pattern identity (form) :lisp) - -;;; Pretty Printing -(define-variable-pattern *print-pprint-dispatch* :lisp2) -(define-variable-pattern *print-right-margin* :lisp2) -(define-variable-pattern *print-miser-width* :lisp2) -(define-variable-pattern *print-lines* :lisp2) -(define-caller-pattern pprint-newline (form &optional form) :lisp2) -(define-caller-pattern pprint-logical-block - ((var form &key (:star form)) - (:star form)) - :lisp2) -(define-caller-pattern pprint-exit-if-list-exhausted () :lisp2) -(define-caller-pattern pprint-pop () :lisp2) -(define-caller-pattern pprint-indent (form form &optional form) :lisp2) -(define-caller-pattern pprint-tab (form form form &optional form) :lisp2) -(define-caller-pattern pprint-fill (form form &optional form form) :lisp2) -(define-caller-pattern pprint-linear (form form &optional form form) :lisp2) -(define-caller-pattern pprint-tabular (form form &optional form form form) - :lisp2) -(define-caller-pattern formatter (control-string) :lisp2) -(define-caller-pattern copy-pprint-dispatch (&optional form) :lisp2) -(define-caller-pattern pprint-dispatch (form &optional form) :lisp2) -(define-caller-pattern set-pprint-dispatch (form form &optional form form) - :lisp2) - -;;; CLOS -(define-caller-pattern add-method (fn form) :lisp2) -(define-caller-pattern call-method (form form) :lisp2) -(define-caller-pattern call-next-method ((:star form)) :lisp2) -(define-caller-pattern change-class (form form) :lisp2) -(define-caller-pattern class-name (form) :lisp2) -(define-caller-pattern class-of (form) :lisp2) -(define-caller-pattern compute-applicable-methods (fn (:star form)) :lisp2) -(define-caller-pattern defclass (name &rest :ignore) :lisp2) -(define-caller-pattern defgeneric (name lambda-list &rest :ignore) :lisp2) -(define-caller-pattern define-method-combination - (name lambda-list ((:star :ignore)) - (:optional ((:eq :arguments) :ignore)) - (:optional ((:eq :generic-function) :ignore)) - (:star (:or declaration documentation-string)) - (:star form)) - :lisp2) -(define-caller-pattern defmethod - (name (:star symbol) lambda-list - (:star (:or declaration documentation-string)) - (:star form)) - :lisp2) -(define-caller-pattern ensure-generic-function (name &key (:star form)) :lisp2) -(define-caller-pattern find-class (form &optional form form) :lisp2) -(define-caller-pattern find-method (fn &rest :ignore) :lisp2) -(define-caller-pattern function-keywords (&rest :ignore) :lisp2) -(define-caller-pattern generic-flet (((:star (name lambda-list))) (:star form)) - :lisp2) -(define-caller-pattern generic-labels - (((:star (name lambda-list))) (:star form)) - :lisp2) -(define-caller-pattern generic-function (lambda-list) :lisp2) -(define-caller-pattern initialize-instance (form &key (:star form)) :lisp2) -(define-caller-pattern invalid-method-error (fn form (:star form)) :lisp2) -(define-caller-pattern make-instance (fn (:star form)) :lisp2) -(define-caller-pattern make-instances-obsolete (fn) :lisp2) -(define-caller-pattern method-combination-error (form (:star form)) :lisp2) -(define-caller-pattern method-qualifiers (fn) :lisp2) -(define-caller-pattern next-method-p () :lisp2) -(define-caller-pattern no-applicable-method (fn (:star form)) :lisp2) -(define-caller-pattern no-next-method (fn (:star form)) :lisp2) -(define-caller-pattern print-object (form form) :lisp2) -(define-caller-pattern reinitialize-instance (form (:star form)) :lisp2) -(define-caller-pattern remove-method (fn form) :lisp2) -(define-caller-pattern shared-initialize (form form (:star form)) :lisp2) -(define-caller-pattern slot-boundp (form form) :lisp2) -(define-caller-pattern slot-exists-p (form form) :lisp2) -(define-caller-pattern slot-makeunbound (form form) :lisp2) -(define-caller-pattern slot-missing (fn form form form &optional form) :lisp2) -(define-caller-pattern slot-unbound (fn form form) :lisp2) -(define-caller-pattern slot-value (form form) :lisp2) -(define-caller-pattern update-instance-for-different-class - (form form (:star form)) :lisp2) -(define-caller-pattern update-instance-for-redefined-class - (form form (:star form)) :lisp2) -(define-caller-pattern with-accessors - (((:star :ignore)) form - (:star declaration) - (:star form)) - :lisp2) -(define-caller-pattern with-added-methods - ((name lambda-list) form - (:star form)) - :lisp2) -(define-caller-pattern with-slots - (((:star :ignore)) form - (:star declaration) - (:star form)) - :lisp2) - -;;; Conditions -(define-caller-pattern signal (form (:star form)) :lisp2) -(define-variable-pattern *break-on-signals* :lisp2) -(define-caller-pattern handler-case (form (:star (form ((:optional var)) - (:star form)))) - :lisp2) -(define-caller-pattern ignore-errors ((:star form)) :lisp2) -(define-caller-pattern handler-bind (((:star (form form))) - (:star form)) - :lisp2) -(define-caller-pattern define-condition (name &rest :ignore) :lisp2) -(define-caller-pattern make-condition (form &rest :ignore) :lisp2) -(define-caller-pattern with-simple-restart - ((name form (:star form)) (:star form)) :lisp2) -(define-caller-pattern restart-case - (form - (:star (form form (:star form)))) - :lisp2) -(define-caller-pattern restart-bind - (((:star (name fn &key (:star form)))) - (:star form)) - :lisp2) -(define-caller-pattern with-condition-restarts - (form form - (:star declaration) - (:star form)) - :lisp2) -(define-caller-pattern compute-restarts (&optional form) :lisp2) -(define-caller-pattern restart-name (form) :lisp2) -(define-caller-pattern find-restart (form &optional form) :lisp2) -(define-caller-pattern invoke-restart (form (:star form)) :lisp2) -(define-caller-pattern invoke-restart-interactively (form) :lisp2) -(define-caller-pattern abort (&optional form) :lisp2) -(define-caller-pattern continue (&optional form) :lisp2) -(define-caller-pattern muffle-warning (&optional form) :lisp2) -(define-caller-pattern store-value (form &optional form) :lisp2) -(define-caller-pattern use-value (form &optional form) :lisp2) -(define-caller-pattern invoke-debugger (form) :lisp2) -(define-variable-pattern *debugger-hook* :lisp2) -(define-caller-pattern simple-condition-format-string (form) :lisp2) -(define-caller-pattern simple-condition-format-arguments (form) :lisp2) -(define-caller-pattern type-error-datum (form) :lisp2) -(define-caller-pattern type-error-expected-type (form) :lisp2) -(define-caller-pattern package-error-package (form) :lisp2) -(define-caller-pattern stream-error-stream (form) :lisp2) -(define-caller-pattern file-error-pathname (form) :lisp2) -(define-caller-pattern cell-error-name (form) :lisp2) -(define-caller-pattern arithmetic-error-operation (form) :lisp2) -(define-caller-pattern arithmetic-error-operands (form) :lisp2) - -;;; For ZetaLisp Flavors -(define-caller-pattern send (form fn (:star form)) :flavors) diff --git a/elpa/spacemacs-theme-20200324.1107/spacemacs-common.el b/elpa/spacemacs-theme-20200324.1107/spacemacs-common.el deleted file mode 100644 index 6008787c..00000000 --- a/elpa/spacemacs-theme-20200324.1107/spacemacs-common.el +++ /dev/null @@ -1,1019 +0,0 @@ -;;; spacemacs-common.el --- Color theme with a dark and light versions. - -;; Copyright (C) 2015-2018 Nasser Alshammari - -;; Author: Nasser Alshammari -;; URL: -;; -;; Version: 0.1 -;; Keywords: color, theme -;; Package-Requires: ((emacs "24")) - -;; Initially created with the help of emacs-theme-generator, . - -;; 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 . - -;; This file is not part of Emacs. - -;;; Commentary: - -;; This is a color theme for spacemacs . -;; It comes with two versions, dark and light and should work well in -;; a 256 color terminal. - -;;; Code: - -(defgroup spacemacs-theme nil - "Spacemacs-theme options." - :group 'faces) - -(defcustom spacemacs-theme-comment-bg t - "Use a background for comment lines." - :type 'boolean - :group 'spacemacs-theme) - -(defcustom spacemacs-theme-comment-italic nil - "Enable italics for comments and also disable background." - :type 'boolean - :group 'spacemacs-theme) - -(defcustom spacemacs-theme-keyword-italic nil - "Enable italics for keywords." - :type 'boolean - :group 'spacemacs-theme) - -(defcustom spacemacs-theme-org-agenda-height nil - "If non-nil, use varying text heights for agenda items. - -Note that if you change this to a non-nil value, you may want to -also adjust the value of `org-agenda-tags-column'. If that is set -to 'auto, tags may not be properly aligned. " - :type 'boolean - :group 'spacemacs-theme) - -(defcustom spacemacs-theme-org-height t - "Use varying text heights for org headings." - :type 'boolean - :group 'spacemacs-theme) - -(defcustom spacemacs-theme-org-bold t - "Inherit text bold for org headings" - :type 'boolean - :group 'spacemacs-theme) - -(defcustom spacemacs-theme-org-priority-bold t - "Inherit text bold for priority items in agenda view" - :type 'boolean - :group 'spacemacs-theme) - -(defcustom spacemacs-theme-org-highlight nil - "Highlight org headings." - :type 'boolean - :group 'spacemacs-theme) - -(defcustom spacemacs-theme-custom-colors nil - "Specify a list of custom colors." - :type 'alist - :group 'spacemacs-theme) - -(defcustom spacemacs-theme-underline-parens t - "If non-nil, underline matching parens when using `show-paren-mode' or similar." - :type 'boolean - :group 'spacemacs-theme) - -(defun true-color-p () - (or - (display-graphic-p) - (= (tty-display-color-cells) 16777216))) - -(defun create-spacemacs-theme (variant theme-name) - (let ((class '((class color) (min-colors 89))) ;; ~~ Dark ~~ ~~ Light ~~ - ;; GUI TER GUI TER - ;; generic - (act1 (if (eq variant 'dark) (if (true-color-p) "#222226" "#121212") (if (true-color-p) "#e7e5eb" "#d7dfff"))) - (act2 (if (eq variant 'dark) (if (true-color-p) "#5d4d7a" "#444444") (if (true-color-p) "#d3d3e7" "#afafd7"))) - (base (if (eq variant 'dark) (if (true-color-p) "#b2b2b2" "#b2b2b2") (if (true-color-p) "#655370" "#5f5f87"))) - (base-dim (if (eq variant 'dark) (if (true-color-p) "#686868" "#585858") (if (true-color-p) "#a094a2" "#afafd7"))) - (bg1 (if (eq variant 'dark) (if (true-color-p) "#292b2e" "#262626") (if (true-color-p) "#fbf8ef" "#ffffff"))) - (bg2 (if (eq variant 'dark) (if (true-color-p) "#212026" "#1c1c1c") (if (true-color-p) "#efeae9" "#e4e4e4"))) - (bg3 (if (eq variant 'dark) (if (true-color-p) "#100a14" "#121212") (if (true-color-p) "#e3dedd" "#d0d0d0"))) - (bg4 (if (eq variant 'dark) (if (true-color-p) "#0a0814" "#080808") (if (true-color-p) "#d2ceda" "#bcbcbc"))) - (border (if (eq variant 'dark) (if (true-color-p) "#5d4d7a" "#111111") (if (true-color-p) "#b3b9be" "#b3b9be"))) - (cblk (if (eq variant 'dark) (if (true-color-p) "#cbc1d5" "#b2b2b2") (if (true-color-p) "#655370" "#5f5f87"))) - (cblk-bg (if (eq variant 'dark) (if (true-color-p) "#2f2b33" "#262626") (if (true-color-p) "#e8e3f0" "#ffffff"))) - (cblk-ln (if (eq variant 'dark) (if (true-color-p) "#827591" "#af5faf") (if (true-color-p) "#9380b2" "#af5fdf"))) - (cblk-ln-bg (if (eq variant 'dark) (if (true-color-p) "#373040" "#333333") (if (true-color-p) "#ddd8eb" "#dfdfff"))) - (cursor (if (eq variant 'dark) (if (true-color-p) "#e3dedd" "#d0d0d0") (if (true-color-p) "#100a14" "#121212"))) - (const (if (eq variant 'dark) (if (true-color-p) "#a45bad" "#d75fd7") (if (true-color-p) "#4e3163" "#8700af"))) - (comment (if (eq variant 'dark) (if (true-color-p) "#2aa1ae" "#008787") (if (true-color-p) "#2aa1ae" "#008787"))) - (comment-light (if (eq variant 'dark) (if (true-color-p) "#2aa1ae" "#008787") (if (true-color-p) "#a49da5" "#008787"))) - (comment-bg (if (eq variant 'dark) (if (true-color-p) "#292e34" "#262626") (if (true-color-p) "#ecf3ec" "#ffffff"))) - (comp (if (eq variant 'dark) (if (true-color-p) "#c56ec3" "#d75fd7") (if (true-color-p) "#6c4173" "#8700af"))) - (err (if (eq variant 'dark) (if (true-color-p) "#e0211d" "#e0211d") (if (true-color-p) "#e0211d" "#e0211d"))) - (func (if (eq variant 'dark) (if (true-color-p) "#bc6ec5" "#d75fd7") (if (true-color-p) "#6c3163" "#8700af"))) - (head1 (if (eq variant 'dark) (if (true-color-p) "#4f97d7" "#268bd2") (if (true-color-p) "#3a81c3" "#268bd2"))) - (head1-bg (if (eq variant 'dark) (if (true-color-p) "#293239" "#262626") (if (true-color-p) "#edf1ed" "#ffffff"))) - (head2 (if (eq variant 'dark) (if (true-color-p) "#2d9574" "#2aa198") (if (true-color-p) "#2d9574" "#2aa198"))) - (head2-bg (if (eq variant 'dark) (if (true-color-p) "#293235" "#262626") (if (true-color-p) "#edf2e9" "#ffffff"))) - (head3 (if (eq variant 'dark) (if (true-color-p) "#67b11d" "#67b11d") (if (true-color-p) "#67b11d" "#5faf00"))) - (head3-bg (if (eq variant 'dark) (if (true-color-p) "#293235" "#262626") (if (true-color-p) "#edf2e9" "#ffffff"))) - (head4 (if (eq variant 'dark) (if (true-color-p) "#b1951d" "#875f00") (if (true-color-p) "#b1951d" "#875f00"))) - (head4-bg (if (eq variant 'dark) (if (true-color-p) "#32322c" "#262626") (if (true-color-p) "#f6f1e1" "#ffffff"))) - (highlight (if (eq variant 'dark) (if (true-color-p) "#444155" "#444444") (if (true-color-p) "#d3d3e7" "#d7d7ff"))) - (highlight-dim (if (eq variant 'dark) (if (true-color-p) "#3b314d" "#444444") (if (true-color-p) "#e7e7fc" "#d7d7ff"))) - (keyword (if (eq variant 'dark) (if (true-color-p) "#4f97d7" "#268bd2") (if (true-color-p) "#3a81c3" "#268bd2"))) - (lnum (if (eq variant 'dark) (if (true-color-p) "#44505c" "#444444") (if (true-color-p) "#a8a8bf" "#af87af"))) - (mat (if (eq variant 'dark) (if (true-color-p) "#86dc2f" "#86dc2f") (if (true-color-p) "#ba2f59" "#af005f"))) - (meta (if (eq variant 'dark) (if (true-color-p) "#9f8766" "#af875f") (if (true-color-p) "#da8b55" "#df5f5f"))) - (str (if (eq variant 'dark) (if (true-color-p) "#2d9574" "#2aa198") (if (true-color-p) "#2d9574" "#2aa198"))) - (suc (if (eq variant 'dark) (if (true-color-p) "#86dc2f" "#86dc2f") (if (true-color-p) "#42ae2c" "#00af00"))) - (ttip (if (eq variant 'dark) (if (true-color-p) "#9a9aba" "#888888") (if (true-color-p) "#8c799f" "#5f5f87"))) - (ttip-sl (if (eq variant 'dark) (if (true-color-p) "#5e5079" "#333333") (if (true-color-p) "#c8c6dd" "#afafff"))) - (ttip-bg (if (eq variant 'dark) (if (true-color-p) "#34323e" "#444444") (if (true-color-p) "#e2e0ea" "#dfdfff"))) - (type (if (eq variant 'dark) (if (true-color-p) "#ce537a" "#df005f") (if (true-color-p) "#ba2f59" "#af005f"))) - (var (if (eq variant 'dark) (if (true-color-p) "#7590db" "#8787d7") (if (true-color-p) "#715ab1" "#af5fd7"))) - (war (if (eq variant 'dark) (if (true-color-p) "#dc752f" "#dc752f") (if (true-color-p) "#dc752f" "#dc752f"))) - - ;; colors - (aqua (if (eq variant 'dark) (if (true-color-p) "#2d9574" "#2aa198") (if (true-color-p) "#2d9574" "#2aa198"))) - (aqua-bg (if (eq variant 'dark) (if (true-color-p) "#293235" "#262626") (if (true-color-p) "#edf2e9" "#ffffff"))) - (green (if (eq variant 'dark) (if (true-color-p) "#67b11d" "#67b11d") (if (true-color-p) "#67b11d" "#5faf00"))) - (green-bg (if (eq variant 'dark) (if (true-color-p) "#293235" "#262626") (if (true-color-p) "#edf2e9" "#ffffff"))) - (green-bg-s (if (eq variant 'dark) (if (true-color-p) "#29422d" "#262626") (if (true-color-p) "#dae6d0" "#ffffff"))) - (cyan (if (eq variant 'dark) (if (true-color-p) "#28def0" "#00ffff") (if (true-color-p) "#21b8c7" "#008080"))) - (red (if (eq variant 'dark) (if (true-color-p) "#f2241f" "#d70000") (if (true-color-p) "#f2241f" "#d70008"))) - (red-bg (if (eq variant 'dark) (if (true-color-p) "#3c2a2c" "#262626") (if (true-color-p) "#faede4" "#ffffff"))) - (red-bg-s (if (eq variant 'dark) (if (true-color-p) "#512e31" "#262626") (if (true-color-p) "#eed9d2" "#ffffff"))) - (blue (if (eq variant 'dark) (if (true-color-p) "#4f97d7" "#268bd2") (if (true-color-p) "#3a81c3" "#268bd2"))) - (blue-bg (if (eq variant 'dark) (if (true-color-p) "#293239" "#262626") (if (true-color-p) "#edf1ed" "#d7d7ff"))) - (blue-bg-s (if (eq variant 'dark) (if (true-color-p) "#2d4252" "#262626") (if (true-color-p) "#d1dcdf" "#d7d7ff"))) - (magenta (if (eq variant 'dark) (if (true-color-p) "#a31db1" "#af00df") (if (true-color-p) "#a31db1" "#800080"))) - (yellow (if (eq variant 'dark) (if (true-color-p) "#b1951d" "#875f00") (if (true-color-p) "#b1951d" "#875f00"))) - (yellow-bg (if (eq variant 'dark) (if (true-color-p) "#32322c" "#262626") (if (true-color-p) "#f6f1e1" "#ffffff")))) - - (cl-loop for (cvar . val) in spacemacs-theme-custom-colors - do (set cvar val)) - - (custom-theme-set-faces - theme-name - -;;;;; basics - `(cursor ((,class (:background ,cursor)))) - `(custom-button ((,class :background ,bg2 :foreground ,base :box (:line-width 2 :style released-button)))) - `(default ((,class (:background ,bg1 :foreground ,base)))) - `(default-italic ((,class (:italic t)))) - `(error ((,class (:foreground ,err)))) - `(eval-sexp-fu-flash ((,class (:background ,suc :foreground ,bg1)))) - `(eval-sexp-fu-flash-error ((,class (:background ,err :foreground ,bg1)))) - `(font-lock-builtin-face ((,class (:foreground ,keyword)))) - `(font-lock-comment-face ((,class (:foreground ,(if spacemacs-theme-comment-italic comment-light comment) :background ,(when spacemacs-theme-comment-bg comment-bg) :slant ,(if spacemacs-theme-comment-italic 'italic 'normal))))) - `(font-lock-constant-face ((,class (:foreground ,const)))) - `(font-lock-doc-face ((,class (:foreground ,meta)))) - `(font-lock-function-name-face ((,class (:foreground ,func :inherit bold)))) - `(font-lock-keyword-face ((,class (:inherit bold :foreground ,keyword :slant ,(if spacemacs-theme-keyword-italic 'italic 'normal))))) - `(font-lock-negation-char-face ((,class (:foreground ,const)))) - `(font-lock-preprocessor-face ((,class (:foreground ,func)))) - `(font-lock-reference-face ((,class (:foreground ,const)))) - `(font-lock-string-face ((,class (:foreground ,str)))) - `(font-lock-type-face ((,class (:foreground ,type :inherit bold)))) - `(font-lock-variable-name-face ((,class (:foreground ,var)))) - `(font-lock-warning-face ((,class (:foreground ,war :background ,bg1)))) - `(fringe ((,class (:background ,bg1 :foreground ,base)))) - `(header-line ((,class :background ,bg2))) - `(highlight ((,class (:foreground ,base :background ,highlight)))) - `(hl-line ((,class (:background ,bg2 :extend t)))) - `(isearch ((,class (:foreground ,bg1 :background ,mat)))) - `(lazy-highlight ((,class (:background ,green-bg-s :weight normal)))) - `(link ((,class (:foreground ,comment :underline t)))) - `(link-visited ((,class (:foreground ,comp :underline t)))) - `(match ((,class (:background ,highlight :foreground ,mat)))) - `(minibuffer-prompt ((,class (:inherit bold :foreground ,keyword)))) - `(page-break-lines ((,class (:foreground ,act2)))) - `(region ((,class (:background ,highlight :extend t)))) - `(secondary-selection ((,class (:background ,bg3)))) - `(shadow ((,class (:foreground ,base-dim)))) - `(success ((,class (:foreground ,suc)))) - `(tooltip ((,class (:background ,ttip-sl :foreground ,base :bold nil :italic nil :underline nil)))) - `(vertical-border ((,class (:foreground ,border)))) - `(warning ((,class (:foreground ,war)))) - `(widget-button-pressed ((,class (:foreground ,green)))) - -;;;;; ace-window - `(aw-leading-char-face ((,class (:foreground ,func :weight bold :height 2.0 :box (:line-width 1 :color ,keyword :style released-button))))) - -;;;;; ahs - `(ahs-face ((,class (:background ,highlight)))) - `(ahs-plugin-whole-buffer-face ((,class (:background ,mat :foreground ,bg1)))) - -;;;;; anzu-mode - `(anzu-mode-line ((,class (:foreground ,yellow :inherit bold)))) - -;;;;; auto-complete - `(ac-completion-face ((,class (:background ,ttip-bg :foreground ,ttip)))) - -;;;;; avy - `(avy-lead-face ((,class (:background ,green-bg :foreground ,green)))) - `(avy-lead-face-0 ((,class (:background ,green-bg :foreground ,yellow)))) - `(avy-lead-face-1 ((,class (:background ,green-bg :foreground ,magenta)))) - `(avy-lead-face-2 ((,class (:background ,green-bg :foreground ,blue)))) - -;;;;; calfw - `(cfw:face-title ((,class (:foreground ,head1 :height 2.0 :weight bold :inherit variable-pitch)))) - `(cfw:face-header ((,class (:foreground ,base :weight bold)))) - `(cfw:face-saturday ((,class (:foreground ,base :weight bold)))) - `(cfw:face-sunday ((,class (:foreground ,base :weight bold)))) - `(cfw:face-holiday ((,class (:foreground ,head1 :weight bold)))) - `(cfw:face-grid ((,class (:foreground ,border)))) - `(cfw:face-default-content ((,class (:foreground ,green)))) - `(cfw:face-periods ((,class (:foreground ,cyan)))) - `(cfw:face-day-title ((,class (:background ,head1-bg)))) - `(cfw:face-default-day ((,class (:foreground ,base :weight bold)))) - `(cfw:face-annotation ((,class (:foreground ,aqua)))) - `(cfw:face-disable ((,class (:foreground ,base-dim)))) - `(cfw:face-today-title ((,class (:background ,blue :weight bold)))) - `(cfw:face-today ((,class (:background ,head1-bg :weight bold)))) - `(cfw:face-select ((,class (:background ,magenta :weight bold)))) - `(cfw:face-toolbar ((,class (:foreground ,base :background ,bg1)))) - `(cfw:face-toolbar-button-off ((,class (:foreground ,base :weight bold)))) - `(cfw:face-toolbar-button-on ((,class (:foreground ,base :weight bold)))) - -;;;;; centaur-tabs - `(centaur-tabs-default ((,class (:background ,bg1 :foreground ,bg1)))) - `(centaur-tabs-selected ((,class (:background ,bg1 :foreground ,base :weight bold)))) - `(centaur-tabs-unselected ((,class (:background ,bg2 :foreground ,base-dim :weight light)))) - `(centaur-tabs-selected-modified ((,class (:background ,bg1 - :foreground ,blue :weight bold)))) - `(centaur-tabs-unselected-modified ((,class (:background ,bg2 :weight light - :foreground ,blue)))) - `(centaur-tabs-active-bar-face ((,class (:background ,keyword)))) - `(centaur-tabs-modified-marker-selected ((,class (:inherit 'centaur-tabs-selected :foreground,keyword)))) - `(centaur-tabs-modified-marker-unselected ((,class (:inherit 'centaur-tabs-unselected :foreground,keyword)))) - -;;;;; cider - `(cider-enlightened ((,class (:background nil :box (:color ,yellow :line-width -1 :style nil) :foreground ,yellow)))) - `(cider-enlightened-local ((,class (:foreground ,yellow)))) - `(cider-instrumented-face ((,class (:background nil :box (:color ,red :line-width -1 :style nil) :foreground ,red)))) - `(cider-result-overlay-face ((,class (:background nil :box (:color ,blue :line-width -1 :style nil) :foreground ,blue)))) - `(cider-test-error-face ((,class (:background ,war :foreground ,bg1)))) - `(cider-test-failure-face ((,class (:background ,err :foreground ,bg1)))) - `(cider-test-success-face ((,class (:background ,suc :foreground ,bg1)))) - `(cider-traced-face ((,class :box (:color ,cyan :line-width -1 :style nil)))) - -;;;;; company - `(company-echo-common ((,class (:background ,base :foreground ,bg1)))) - `(company-preview ((,class (:background ,ttip-bg :foreground ,ttip)))) - `(company-preview-common ((,class (:background ,ttip-bg :foreground ,base)))) - `(company-preview-search ((,class (:inherit match)))) - `(company-scrollbar-bg ((,class (:background ,bg2)))) - `(company-scrollbar-fg ((,class (:background ,act2)))) - `(company-template-field ((,class (:inherit region)))) - `(company-tooltip ((,class (:background ,ttip-bg :foreground ,ttip)))) - `(company-tooltip-annotation ((,class (:foreground ,type)))) - `(company-tooltip-common ((,class (:background ,ttip-bg :foreground ,keyword)))) - `(company-tooltip-common-selection ((,class (:foreground ,keyword)))) - `(company-tooltip-mouse ((,class (:inherit highlight)))) - `(company-tooltip-search ((,class (:inherit match)))) - `(company-tooltip-selection ((,class (:background ,ttip-sl :foreground ,base)))) - -;;;;; diff - `(diff-added ((,class :background nil :foreground ,green :extend t))) - `(diff-changed ((,class :background nil :foreground ,blue))) - `(diff-header ((,class :background ,cblk-ln-bg :foreground ,func :extend t))) - `(diff-file-header ((,class :background ,cblk-ln-bg :foreground ,cblk :extend t))) - `(diff-indicator-added ((,class :background nil :foreground ,green :extend t))) - `(diff-indicator-changed ((,class :background nil :foreground ,blue))) - `(diff-indicator-removed ((,class :background nil :foreground ,red))) - `(diff-refine-added ((,class :background ,green :foreground ,bg1))) - `(diff-refine-changed ((,class :background ,blue :foreground ,bg1))) - `(diff-refine-removed ((,class :background ,red :foreground ,bg1))) - `(diff-removed ((,class :background nil :foreground ,red :extend t))) - -;;;;; diff-hl - `(diff-hl-change ((,class :background ,blue-bg-s :foreground ,blue))) - `(diff-hl-delete ((,class :background ,red-bg-s :foreground ,red))) - `(diff-hl-insert ((,class :background ,green-bg-s :foreground ,green))) - -;;;;; dired - `(dired-directory ((,class (:foreground ,keyword :background ,bg1 :inherit bold)))) - `(dired-flagged ((,class (:foreground ,red)))) - `(dired-header ((,class (:foreground ,comp :inherit bold)))) - `(dired-ignored ((,class (:inherit shadow)))) - `(dired-mark ((,class (:foreground ,comp :inherit bold)))) - `(dired-marked ((,class (:foreground ,magenta :inherit bold)))) - `(dired-perm-write ((,class (:foreground ,base :underline t)))) - `(dired-symlink ((,class (:foreground ,cyan :background ,bg1 :inherit bold)))) - `(dired-warning ((,class (:foreground ,war)))) - -;;;;; doom-modeline - `(doom-modeline-bar ((,class (:background ,keyword)))) - -;;;;; ediff - `(ediff-current-diff-A ((,class(:background ,red-bg :foreground ,red :extend t)))) - `(ediff-current-diff-Ancestor ((,class(:background ,aqua-bg :foreground ,aqua :extend t)))) - `(ediff-current-diff-B ((,class(:background ,green-bg :foreground ,green :extend t)))) - `(ediff-current-diff-C ((,class(:background ,blue-bg :foreground ,blue :extend t)))) - `(ediff-even-diff-A ((,class(:background ,bg3 :extend t)))) - `(ediff-even-diff-Ancestor ((,class(:background ,bg3 :extend t)))) - `(ediff-even-diff-B ((,class(:background ,bg3 :extend t)))) - `(ediff-even-diff-C ((,class(:background ,bg3 :extend t)))) - `(ediff-fine-diff-A ((,class(:background ,red :foreground ,bg1 :extend t)))) - `(ediff-fine-diff-Ancestor ((,class(:background nil :inherit bold :extend t)))) - `(ediff-fine-diff-B ((,class(:background ,green :foreground ,bg1)))) - `(ediff-fine-diff-C ((,class(:background ,blue :foreground ,bg1)))) - `(ediff-odd-diff-A ((,class(:background ,bg4 :extend t)))) - `(ediff-odd-diff-Ancestor ((,class(:background ,bg4 :extend t)))) - `(ediff-odd-diff-B ((,class(:background ,bg4 :extend t)))) - `(ediff-odd-diff-C ((,class(:background ,bg4 :extend t)))) - -;;;;; ein - `(ein:cell-input-area((,class (:background ,bg2)))) - `(ein:cell-input-prompt ((,class (:foreground ,suc)))) - `(ein:cell-output-prompt ((,class (:foreground ,err)))) - `(ein:notification-tab-normal ((,class (:foreground ,keyword)))) - `(ein:notification-tab-selected ((,class (:foreground ,suc :inherit bold)))) - -;;;;; eldoc - `(eldoc-highlight-function-argument ((,class (:foreground ,mat :inherit bold)))) - -;;;;; elfeed - `(elfeed-search-date-face ((,class (:foreground ,head2)))) - `(elfeed-search-feed-face ((,class (:foreground ,blue)))) - `(elfeed-search-tag-face ((,class (:foreground ,func)))) - `(elfeed-search-title-face ((,class (:foreground ,var)))) - `(elfeed-search-unread-title-face ((,class (:foreground ,base)))) - -;;;;; enh-ruby - `(enh-ruby-op-face ((,class (:background ,bg1 :foreground ,base)))) - `(enh-ruby-string-delimiter-face ((,class (:foreground ,str)))) - -;;;;; erc - `(erc-input-face ((,class (:foreground ,func)))) - `(erc-my-nick-face ((,class (:foreground ,keyword)))) - `(erc-nick-default-face ((,class (:foreground ,keyword)))) - `(erc-nick-prefix-face ((,class (:foreground ,yellow)))) - `(erc-notice-face ((,class (:foreground ,str)))) - `(erc-prompt-face ((,class (:foreground ,mat :inherit bold)))) - `(erc-timestamp-face ((,class (:foreground ,keyword)))) - -;;;;; eshell - `(eshell-ls-archive ((,class (:foreground ,red :inherit bold)))) - `(eshell-ls-backup ((,class (:inherit font-lock-comment-face)))) - `(eshell-ls-clutter ((,class (:inherit font-lock-comment-face)))) - `(eshell-ls-directory ((,class (:foreground ,keyword :inherit bold)))) - `(eshell-ls-executable ((,class (:foreground ,suc :inherit bold)))) - `(eshell-ls-missing ((,class (:inherit font-lock-warning-face)))) - `(eshell-ls-product ((,class (:inherit font-lock-doc-face)))) - `(eshell-ls-special ((,class (:foreground ,yellow :inherit bold)))) - `(eshell-ls-symlink ((,class (:foreground ,cyan :inherit bold)))) - `(eshell-ls-unreadable ((,class (:foreground ,base)))) - `(eshell-prompt ((,class (:foreground ,keyword :inherit bold)))) - -;;;;; ESS - `(ess-assignment-face ((,class (:foreground ,type :inherit bold)))) - `(ess-backquoted-face ((,class (:foreground ,var)))) - `(ess-constant-face ((,class (:inherit font-lock-constant-face)))) - `(ess-f-t-face ((,class (:inherit font-lock-constant-face)))) - `(ess-function-call-face ((,class (:foreground ,func)))) - `(ess-keyword-face ((,class (:inherit font-lock-keyword-face)))) - `(ess-matrix-face ((,class (:foreground ,base-dim)))) - `(ess-modifiers-face ((,class (:foreground ,keyword)))) - `(ess-numbers-face ((,class (:inherit font-lock-constant-face)))) - `(ess-operator-face ((,class (:foreground ,var)))) - `(ess-paren-face ((,class (:foreground ,blue)))) - `(ess-r-control-flow-keyword-face ((,class (:foreground ,keyword)))) - `(ess-r-signal-keyword-face ((,class (:foreground ,war)))) - -;;;;; evil - `(evil-ex-lazy-highlight ((,class (:background ,mat :foreground ,bg1)))) - `(evil-ex-substitute-matches ((,class (:background ,red-bg :foreground ,red)))) - `(evil-ex-substitute-replacement ((,class (:background ,green-bg :foreground ,green)))) - -;;;;; evil-goggles - `(evil-goggles--pulse-face ((,class (:background ,yellow-bg :foreground ,yellow)))) - `(evil-goggles-change-face ((,class (:background ,blue-bg-s :foreground ,blue)))) - `(evil-goggles-commentary-face ((,class (:background ,aqua-bg :foreground ,aqua)))) - `(evil-goggles-delete-face ((,class (:background ,red-bg-s :foreground ,red)))) - `(evil-goggles-fill-and-move-face ((,class (:background ,green-bg-s :foreground ,green)))) - `(evil-goggles-indent-face ((,class (:background ,green-bg-s :foreground ,green)))) - `(evil-goggles-join-face ((,class (:background ,green-bg-s :foreground ,green)))) - `(evil-goggles-nerd-commenter-face ((,class (:background ,aqua-bg :foreground ,aqua)))) - `(evil-goggles-paste-face ((,class (:background ,green-bg-s :foreground ,green)))) - `(evil-goggles-record-macro-face ((,class (:background ,blue-bg-s :foreground ,blue)))) - `(evil-goggles-replace-with-register-face ((,class (:background ,yellow-bg :foreground ,yellow)))) - `(evil-goggles-set-marker-face ((,class (:background ,blue-bg-s :foreground ,blue)))) - `(evil-goggles-shift-face ((,class (:background ,blue-bg-s :foreground ,blue)))) - `(evil-goggles-surround-face ((,class (:background ,blue-bg-s :foreground ,blue)))) - `(evil-goggles-yank-face ((,class (:background ,blue-bg-s :foreground ,blue)))) - `(evil-goggles-undo-redo-add-face ((,class (:background ,green-bg-s :foreground ,green)))) - `(evil-goggles-undo-redo-change-face ((,class (:background ,blue-bg-s :foreground ,blue)))) - `(evil-goggles-undo-redo-remove-face ((,class (:background ,red-bg-s :foreground ,red)))) - -;;;;; evil-mc - `(evil-mc-cursor-bar-face ((,class (:foreground ,aqua)))) - `(evil-mc-cursor-default-face ((,class (:background ,aqua :foreground ,bg4)))) - `(evil-mc-cursor-hbar-face ((,class (:foreground ,aqua)))) - `(evil-mc-region-face ((,class (:inherit highlight)))) - -;;;;; flycheck - `(flycheck-error - ((,(append '((supports :underline (:style line))) class) - (:underline (:style line :color ,err))) - (,class (:foreground ,base :background ,err :inherit bold :underline t)))) - `(flycheck-error-list-checker-name ((,class (:foreground ,keyword)))) - `(flycheck-fringe-error ((,class (:foreground ,err :inherit bold)))) - `(flycheck-fringe-info ((,class (:foreground ,keyword :inherit bold)))) - `(flycheck-fringe-warning ((,class (:foreground ,war :inherit bold)))) - `(flycheck-info - ((,(append '((supports :underline (:style line))) class) - (:underline (:style line :color ,keyword))) - (,class (:foreground ,base :background ,keyword :inherit bold :underline t)))) - `(flycheck-warning - ((,(append '((supports :underline (:style line))) class) - (:underline (:style line :color ,war))) - (,class (:foreground ,base :background ,war :inherit bold :underline t)))) - -;;;;; flymake - `(flymake-error ((,(append '((supports :underline (:style line))) class) - (:underline (:style line :color ,err))) - (,class (:foreground ,base :background ,err :inherit bold :underline t)))) - `(flymake-note ((,(append '((supports :underline (:style line))) class) - (:underline (:style wave :color ,keyword))) - (,class (:foreground ,base :background ,keyword :inherit bold :underline t)))) - `(flymake-warning ((,(append '((supports :underline (:style line))) class) - (:underline (:style line :color ,war))) - (,class (:foreground ,base :background ,war :inherit bold :underline t)))) - -;;;;; flyspell - `(flyspell-incorrect ((,(append '((supports :underline (:style line))) class) - (:underline (:style wave :color ,war))) - (,class (:foreground ,base :background ,war :inherit bold :underline t)))) - `(flyspell-duplicate ((,(append '((supports :underline (:style line))) class) - (:underline (:style wave :color ,keyword))) - (,class (:foreground ,base :background ,keyword :inherit bold :underline t)))) - -;;;;; jabber - `(jabber-activity-face ((,class (:inherit bold :foreground ,red)))) - `(jabber-activity-personal-face ((,class (:inherit bold :foreground ,blue)))) - `(jabber-chat-error ((,class (:inherit bold :foreground ,red)))) - `(jabber-chat-prompt-foreign ((,class (:inherit bold :foreground ,red)))) - `(jabber-chat-prompt-local ((,class (:inherit bold :foreground ,blue)))) - `(jabber-chat-prompt-system ((,class (:inherit bold :foreground ,green)))) - `(jabber-chat-text-foreign ((,class (:foreground ,base)))) - `(jabber-chat-text-local ((,class (:foreground ,base)))) - `(jabber-rare-time-face ((,class (:foreground ,green)))) - `(jabber-roster-user-away ((,class (:foreground ,yellow)))) - `(jabber-roster-user-chatty ((,class (:inherit bold :foreground ,green)))) - `(jabber-roster-user-dnd ((,class (:foreground ,red)))) - `(jabber-roster-user-error ((,class (:foreground ,err)))) - `(jabber-roster-user-offline ((,class (:foreground ,base)))) - `(jabber-roster-user-online ((,class (:inherit bold :foreground ,green)))) - `(jabber-roster-user-xa ((,class (:foreground ,aqua)))) - -;;;;; git-gutter-fr - `(git-gutter-fr:added ((,class (:foreground ,green :inherit bold)))) - `(git-gutter-fr:deleted ((,class (:foreground ,war :inherit bold)))) - `(git-gutter-fr:modified ((,class (:foreground ,keyword :inherit bold)))) - -;;;;; git-timemachine - `(git-timemachine-minibuffer-detail-face ((,class (:foreground ,blue :inherit bold :background ,blue-bg)))) - -;;;;; gnus - `(gnus-emphasis-highlight-words ((,class (:background ,suc :foreground ,bg1)))) - `(gnus-header-content ((,class (:foreground ,keyword)))) - `(gnus-header-from ((,class (:foreground ,var)))) - `(gnus-header-name ((,class (:foreground ,comp)))) - `(gnus-header-subject ((,class (:foreground ,func :inherit bold)))) - `(gnus-summary-cancelled ((,class (:background ,war :foreground ,bg1)))) - -;;;;; guide-key - `(guide-key/highlight-command-face ((,class (:foreground ,base)))) - `(guide-key/key-face ((,class (:foreground ,keyword)))) - `(guide-key/prefix-command-face ((,class (:foreground ,keyword :inherit bold)))) - -;;;;; helm - `(helm-bookmark-directory ((,class (:inherit helm-ff-directory)))) - `(helm-bookmark-file ((,class (:foreground ,base)))) - `(helm-bookmark-gnus ((,class (:foreground ,comp)))) - `(helm-bookmark-info ((,class (:foreground ,comp)))) - `(helm-bookmark-man ((,class (:foreground ,comp)))) - `(helm-bookmark-w3m ((,class (:foreground ,comp)))) - `(helm-buffer-directory ((,class (:foreground ,base :background ,bg1)))) - `(helm-buffer-file ((,class (:foreground ,base :background ,bg1)))) - `(helm-buffer-not-saved ((,class (:foreground ,comp :background ,bg1)))) - `(helm-buffer-process ((,class (:foreground ,keyword :background ,bg1)))) - `(helm-buffer-saved-out ((,class (:foreground ,base :background ,bg1)))) - `(helm-buffer-size ((,class (:foreground ,base :background ,bg1)))) - `(helm-candidate-number ((,class (:background ,bg1 :foreground ,keyword :inherit bold)))) - `(helm-ff-directory ((,class (:foreground ,keyword :background ,bg1 :inherit bold)))) - `(helm-ff-dotted-directory ((,class (:foreground ,keyword :background ,bg1 :inherit bold)))) - `(helm-ff-dotted-symlink-directory ((,class (:foreground ,cyan :background ,bg1 :inherit bold)))) - `(helm-ff-executable ((,class (:foreground ,suc :background ,bg1 :weight normal)))) - `(helm-ff-file ((,class (:foreground ,base :background ,bg1 :weight normal)))) - `(helm-ff-invalid-symlink ((,class (:foreground ,red :background ,bg1 :inherit bold)))) - `(helm-ff-prefix ((,class (:foreground ,bg1 :background ,keyword :weight normal)))) - `(helm-ff-symlink ((,class (:foreground ,cyan :background ,bg1 :inherit bold)))) - `(helm-grep-cmd-line ((,class (:foreground ,base :background ,bg1)))) - `(helm-grep-file ((,class (:foreground ,base :background ,bg1)))) - `(helm-grep-finish ((,class (:foreground ,base :background ,bg1)))) - `(helm-grep-lineno ((,class (:foreground ,type :background ,bg1 :inherit bold)))) - `(helm-grep-match ((,class (:foreground nil :background nil :inherit helm-match)))) - `(helm-header ((,class (:foreground ,base :background ,bg1 :underline nil :box nil)))) - `(helm-header-line-left-margin ((,class (:foreground ,keyword :background ,nil)))) - `(helm-match ((,class (:background ,head1-bg :foreground ,head1)))) - `(helm-match-item ((,class (:background ,head1-bg :foreground ,head1)))) - `(helm-moccur-buffer ((,class (:foreground ,var :background ,bg1)))) - `(helm-selection ((,class (:background ,highlight)))) - `(helm-selection-line ((,class (:background ,bg2)))) - `(helm-separator ((,class (:foreground ,comp :background ,bg1)))) - `(helm-source-header ((,class (:background ,comp :foreground ,bg1 :inherit bold)))) - `(helm-time-zone-current ((,class (:foreground ,keyword :background ,bg1)))) - `(helm-time-zone-home ((,class (:foreground ,comp :background ,bg1)))) - `(helm-visible-mark ((,class (:foreground ,keyword :background ,bg3)))) - -;;;;; helm-swoop - `(helm-swoop-target-line-block-face ((,class (:foreground ,base :background ,highlight)))) - `(helm-swoop-target-line-face ((,class (:background ,highlight)))) - `(helm-swoop-target-word-face ((,class (:background ,highlight :foreground ,mat)))) - -;;;;; highlights - `(hi-green ((,class (:foreground ,green :background ,green-bg)))) - `(hi-yellow ((,class (:foreground ,yellow :background ,yellow-bg)))) - -;;;;; highlight-indentation - `(highlight-indentation-face ((,class (:background ,comment-bg)))) - -;;;;; highlight-symbol - `(highlight-symbol-face ((,class (:background ,bg2)))) - -;;;;; hydra - `(hydra-face-blue ((,class (:foreground ,blue)))) - `(hydra-face-red ((,class (:foreground ,red)))) - -;;;;; ido - `(ido-first-match ((,class (:foreground ,comp :inherit bold)))) - `(ido-only-match ((,class (:foreground ,mat :inherit bold)))) - `(ido-subdir ((,class (:foreground ,keyword)))) - `(ido-vertical-match-face ((,class (:foreground ,comp :underline nil)))) - -;;;;; info - `(info-header-xref ((,class (:foreground ,func :underline t)))) - `(info-menu ((,class (:foreground ,suc)))) - `(info-node ((,class (:foreground ,func :inherit bold)))) - `(info-quoted-name ((,class (:foreground ,keyword)))) - `(info-reference-item ((,class (:background nil :underline t :inherit bold)))) - `(info-string ((,class (:foreground ,str)))) - `(info-title-1 ((,class (:height 1.4 :inherit bold)))) - `(info-title-2 ((,class (:height 1.3 :inherit bold)))) - `(info-title-3 ((,class (:height 1.3)))) - `(info-title-4 ((,class (:height 1.2)))) - -;;;;; ivy - `(ivy-current-match ((,class (:background ,highlight :inherit bold)))) - `(ivy-minibuffer-match-face-1 ((,class (:inherit bold)))) - `(ivy-minibuffer-match-face-2 ((,class (:foreground ,head1 :underline t)))) - `(ivy-minibuffer-match-face-3 ((,class (:foreground ,head4 :underline t)))) - `(ivy-minibuffer-match-face-4 ((,class (:foreground ,head3 :underline t)))) - `(ivy-remote ((,class (:foreground ,cyan)))) - -;;;;; ivy-posframe - `(ivy-posframe ((,class (:background ,bg3)))) - -;;;;; latex - `(font-latex-bold-face ((,class (:foreground ,comp)))) - `(font-latex-italic-face ((,class (:foreground ,keyword :italic t)))) - `(font-latex-match-reference-keywords ((,class (:foreground ,const)))) - `(font-latex-match-variable-keywords ((,class (:foreground ,var)))) - `(font-latex-sectioning-0-face ((,class (:inherit bold :foreground ,head3 :height ,(if spacemacs-theme-org-height 1.3 1.0) :background ,(when spacemacs-theme-org-highlight head3-bg))))) - `(font-latex-sectioning-1-face ((,class (:inherit bold :foreground ,head4 :height ,(if spacemacs-theme-org-height 1.3 1.0) :background ,(when spacemacs-theme-org-highlight head4-bg))))) - `(font-latex-sectioning-2-face ((,class (:inherit bold :foreground ,head1 :height ,(if spacemacs-theme-org-height 1.3 1.0) :background ,(when spacemacs-theme-org-highlight head1-bg))))) - `(font-latex-sectioning-3-face ((,class (:inherit bold :foreground ,head2 :height ,(if spacemacs-theme-org-height 1.2 1.0) :background ,(when spacemacs-theme-org-highlight head2-bg))))) - `(font-latex-sectioning-4-face ((,class (:bold nil :foreground ,head3 :height ,(if spacemacs-theme-org-height 1.1 1.0) :background ,(when spacemacs-theme-org-highlight head3-bg))))) - `(font-latex-sectioning-5-face ((,class (:bold nil :foreground ,head4 :background ,(when spacemacs-theme-org-highlight head4-bg))))) - `(font-latex-string-face ((,class (:foreground ,str)))) - `(font-latex-warning-face ((,class (:foreground ,war)))) - -;;;;; ledger-mode - `(ledger-font-directive-face ((,class (:foreground ,meta)))) - `(ledger-font-posting-amount-face ((,class (:foreground ,yellow)))) - `(ledger-font-posting-date-face ((,class (:foreground ,head1)))) - `(ledger-occur-xact-face ((,class (:background ,bg2)))) - -;;;;; linum-mode - `(linum ((,class (:foreground ,lnum :background ,bg2 :inherit default)))) - -;;;;; line-numbers - `(line-number ((,class (:foreground ,lnum :background ,bg2 :inherit default)))) - `(line-number-current-line ((,class (:foreground ,base :background ,bg2 :inherit line-number)))) - -;;;;; linum-relative - `(linum-relative-current-face ((,class (:foreground ,comp)))) - -;;;;; magit - `(magit-blame-culprit ((,class :background ,yellow-bg :foreground ,yellow))) - `(magit-blame-date ((,class :background ,yellow-bg :foreground ,green))) - `(magit-blame-hash ((,class :background ,yellow-bg :foreground ,func))) - `(magit-blame-header ((,class :background ,yellow-bg :foreground ,green))) - `(magit-blame-heading ((,class :background ,yellow-bg :foreground ,green))) - `(magit-blame-name ((,class :background ,yellow-bg :foreground ,yellow))) - `(magit-blame-sha1 ((,class :background ,yellow-bg :foreground ,func))) - `(magit-blame-subject ((,class :background ,yellow-bg :foreground ,yellow))) - `(magit-blame-summary ((,class :background ,yellow-bg :foreground ,yellow :extend t))) - `(magit-blame-time ((,class :background ,yellow-bg :foreground ,green))) - `(magit-branch ((,class (:foreground ,const :inherit bold)))) - `(magit-branch-current ((,class (:background ,blue-bg :foreground ,blue :inherit bold :box t)))) - `(magit-branch-local ((,class (:background ,blue-bg :foreground ,blue :inherit bold)))) - `(magit-branch-remote ((,class (:background ,aqua-bg :foreground ,aqua :inherit bold)))) - `(magit-diff-context-highlight ((,class (:background ,bg2 :foreground ,base :extend t)))) - `(magit-diff-hunk-heading ((,class (:background ,ttip-bg :foreground ,ttip :extend t)))) - `(magit-diff-hunk-heading-highlight ((,class (:background ,ttip-sl :foreground ,base :extend t)))) - `(magit-hash ((,class (:foreground ,var)))) - `(magit-hunk-heading ((,class (:background ,bg3 :extend t)))) - `(magit-hunk-heading-highlight ((,class (:background ,bg3 :extend t)))) - `(magit-item-highlight ((,class :background ,bg2 :extend t))) - `(magit-log-author ((,class (:foreground ,func)))) - `(magit-log-head-label-head ((,class (:background ,yellow :foreground ,bg1 :inherit bold)))) - `(magit-log-head-label-local ((,class (:background ,keyword :foreground ,bg1 :inherit bold)))) - `(magit-log-head-label-remote ((,class (:background ,suc :foreground ,bg1 :inherit bold)))) - `(magit-log-head-label-tags ((,class (:background ,magenta :foreground ,bg1 :inherit bold)))) - `(magit-log-head-label-wip ((,class (:background ,cyan :foreground ,bg1 :inherit bold)))) - `(magit-log-sha1 ((,class (:foreground ,str)))) - `(magit-process-ng ((,class (:foreground ,war :inherit bold)))) - `(magit-process-ok ((,class (:foreground ,func :inherit bold)))) - `(magit-reflog-amend ((,class (:foreground ,magenta)))) - `(magit-reflog-checkout ((,class (:foreground ,blue)))) - `(magit-reflog-cherry-pick ((,class (:foreground ,green)))) - `(magit-reflog-commit ((,class (:foreground ,green)))) - `(magit-reflog-merge ((,class (:foreground ,green)))) - `(magit-reflog-other ((,class (:foreground ,cyan)))) - `(magit-reflog-rebase ((,class (:foreground ,magenta)))) - `(magit-reflog-remote ((,class (:foreground ,cyan)))) - `(magit-reflog-reset ((,class (:foreground ,red)))) - `(magit-section-heading ((,class (:foreground ,keyword :inherit bold :extend t)))) - `(magit-section-highlight ((,class (:background ,bg2 :extend t)))) - `(magit-section-title ((,class (:background ,bg1 :foreground ,keyword :inherit bold)))) - -;;;;; man - `(Man-overstrike ((,class (:foreground ,head1 :inherit bold)))) - `(Man-reverse ((,class (:foreground ,highlight)))) - `(Man-underline ((,class (:foreground ,comp :underline t)))) - -;;;;; markdown - `(markdown-header-face-1 ((,class (:inherit bold :foreground ,head1 :height ,(if spacemacs-theme-org-height 1.3 1.0) :background ,(when spacemacs-theme-org-highlight head1-bg))))) - `(markdown-header-face-2 ((,class (:inherit bold :foreground ,head2 :height ,(if spacemacs-theme-org-height 1.2 1.0) :background ,(when spacemacs-theme-org-highlight head2-bg))))) - `(markdown-header-face-3 ((,class (:bold nil :foreground ,head3 :height ,(if spacemacs-theme-org-height 1.1 1.0) :background ,(when spacemacs-theme-org-highlight head3-bg))))) - `(markdown-header-face-4 ((,class (:bold nil :foreground ,head4 :background ,(when spacemacs-theme-org-highlight head4-bg))))) - `(markdown-header-face-5 ((,class (:bold nil :foreground ,head1)))) - `(markdown-header-face-6 ((,class (:bold nil :foreground ,head2)))) - `(markdown-table-face ((,class (:foreground ,base :background ,head1-bg)))) - -;;;;; mode-line - `(mode-line ((,class (:foreground ,base :background ,act1 :box (:color ,border :line-width 1))))) - `(mode-line-buffer-id ((,class (:inherit bold :foreground ,func)))) - `(mode-line-inactive ((,class (:foreground ,base :background ,bg1 :box (:color ,border :line-width 1))))) - -;;;;; mu4e - `(mu4e-attach-number-face ((,class (:foreground ,var)))) - `(mu4e-cited-1-face ((,class (:foreground ,head1)))) - `(mu4e-cited-2-face ((,class (:foreground ,head2)))) - `(mu4e-cited-3-face ((,class (:foreground ,head3)))) - `(mu4e-cited-4-face ((,class (:foreground ,head4)))) - `(mu4e-cited-5-face ((,class (:foreground ,head1)))) - `(mu4e-cited-6-face ((,class (:foreground ,head2)))) - `(mu4e-cited-7-face ((,class (:foreground ,head3)))) - `(mu4e-contact-face ((,class (:foreground ,func)))) - `(mu4e-draft-face ((,class (:foreground ,var)))) - `(mu4e-flagged-face ((,class (:foreground ,yellow :inherit bold)))) - `(mu4e-header-key-face ((,class (:foreground ,meta :inherit bold)))) - `(mu4e-header-title-face ((,class (:foreground ,keyword :inherit bold)))) - `(mu4e-header-marks-face ((,class (:foreground ,comp)))) - `(mu4e-header-value-face ((,class (:foreground ,keyword :inherit bold)))) - `(mu4e-header-highlight-face ((,class (:background ,highlight)))) - `(mu4e-highlight-face ((,class (:foreground ,comp)))) - `(mu4e-title-face ((,class (:foreground ,head2 :inherit bold)))) - `(mu4e-replied-face ((,class (:foreground ,green)))) - `(mu4e-modeline-face ((,class (:foreground ,yellow)))) - `(mu4e-special-header-value-face ((,class (:foreground ,green)))) - `(mu4e-unread-face ((,class (:foreground ,head1 :inherit bold)))) - `(mu4e-view-url-number-face ((,class (:foreground ,comp)))) - -;;;;; mu4e-maildirs - `(mu4e-maildirs-extension-maildir-hl-face ((,class (:foreground ,head1 :inherit bold)))) - -;;;;; notmuch - `(notmuch-search-date ((,class (:foreground ,func)))) - `(notmuch-search-flagged-face ((,class (:weight extra-bold)))) - `(notmuch-search-non-matching-authors ((,class (:foreground ,base-dim)))) - `(notmuch-search-unread-face ((,class (:background ,highlight-dim)))) - `(notmuch-tag-face ((,class (:foreground ,keyword)))) - `(notmuch-tag-flagged ((,class (:foreground ,war)))) - -;;;;; neotree - `(neo-dir-link-face ((,class (:foreground ,keyword :inherit bold)))) - `(neo-expand-btn-face ((,class (:foreground ,base)))) - `(neo-file-link-face ((,class (:foreground ,base)))) - `(neo-root-dir-face ((,class (:foreground ,func :inherit bold)))) - -;;;;; org - `(org-agenda-clocking ((,class (:background ,highlight :foreground ,comp)))) - `(org-agenda-date ((,class (:foreground ,var :height ,(if spacemacs-theme-org-agenda-height 1.1 1.0))))) - `(org-agenda-date-today ((,class (:foreground ,keyword :inherit bold :height ,(if spacemacs-theme-org-agenda-height 1.3 1.0))))) - `(org-agenda-date-weekend ((,class (:inherit bold :foreground ,var)))) - `(org-agenda-done ((,class (:foreground ,suc :height ,(if spacemacs-theme-org-agenda-height 1.2 1.0))))) - `(org-agenda-structure ((,class (:inherit bold :foreground ,comp)))) - `(org-block ((,class (:background ,cblk-bg :foreground ,cblk :extend t)))) - `(org-block-begin-line ((,class (:background ,cblk-ln-bg :foreground ,cblk-ln :extend t)))) - `(org-block-end-line ((,class (:background ,cblk-ln-bg :foreground ,cblk-ln :extend t)))) - `(org-clock-overlay ((,class (:foreground ,comp)))) - `(org-code ((,class (:foreground ,cyan)))) - `(org-column ((,class (:background ,highlight)))) - `(org-column-title ((,class (:background ,highlight)))) - `(org-date ((,class (:underline t :foreground ,var)))) - `(org-date-selected ((,class (:background ,func :foreground ,bg1)))) - `(org-document-info-keyword ((,class (:foreground ,meta)))) - `(org-document-title ((,class (:foreground ,func :inherit bold :height ,(if spacemacs-theme-org-height 1.4 1.0) :underline t)))) - `(org-done ((,class (:foreground ,suc :inherit bold :background ,green-bg)))) - `(org-ellipsis ((,class (:foreground ,keyword)))) - `(org-footnote ((,class (:underline t :foreground ,base)))) - `(org-hide ((,class (:foreground ,base)))) - `(org-kbd ((,class (:inherit region :foreground ,base :box (:line-width 1 :style released-button))))) - `(org-level-1 ((,class (:inherit bold :bold ,(if spacemacs-theme-org-bold 'unspecified nil) :foreground ,head1 :height ,(if spacemacs-theme-org-height 1.3 1.0) :background ,(when spacemacs-theme-org-highlight head1-bg))))) - `(org-level-2 ((,class (:inherit bold :bold ,(if spacemacs-theme-org-bold 'unspecified nil) :foreground ,head2 :height ,(if spacemacs-theme-org-height 1.2 1.0) :background ,(when spacemacs-theme-org-highlight head2-bg))))) - `(org-level-3 ((,class (:bold nil :foreground ,head3 :height ,(if spacemacs-theme-org-height 1.1 1.0) :background ,(when spacemacs-theme-org-highlight head3-bg))))) - `(org-level-4 ((,class (:bold nil :foreground ,head4 :background ,(when spacemacs-theme-org-highlight head4-bg))))) - `(org-level-5 ((,class (:bold nil :foreground ,head1)))) - `(org-level-6 ((,class (:bold nil :foreground ,head2)))) - `(org-level-7 ((,class (:bold nil :foreground ,head3)))) - `(org-level-8 ((,class (:bold nil :foreground ,head4)))) - `(org-link ((,class (:underline t :foreground ,comment)))) - `(org-meta-line ((,class (:foreground ,meta)))) - `(org-mode-line-clock-overrun ((,class (:foreground ,err)))) - `(org-priority ((,class (:foreground ,war :inherit bold :bold ,(if spacemacs-theme-org-priority-bold 'unspecified nil))))) - `(org-quote ((,class (:inherit org-block :slant italic)))) - `(org-scheduled ((,class (:foreground ,comp)))) - `(org-scheduled-today ((,class (:foreground ,func :height ,(if spacemacs-theme-org-agenda-height 1.2 1.0))))) - `(org-scheduled-previously ((,class (:foreground ,base :slant italic)))) - `(org-sexp-date ((,class (:foreground ,base)))) - `(org-special-keyword ((,class (:foreground ,func)))) - `(org-table ((,class (:foreground ,base :background ,head1-bg)))) - `(org-tag ((,class (:foreground ,meta)))) - `(org-time-grid ((,class (:foreground ,str)))) - `(org-todo ((,class (:foreground ,war :inherit bold :background ,yellow-bg)))) - `(org-upcoming-deadline ((,class (:foreground ,war :inherit org-priority)))) - `(org-upcoming-distant-deadline ((,class (:foreground ,suc :inherit org-priority)))) - `(org-verbatim ((,class (:foreground ,keyword)))) - `(org-verse ((,class (:inherit org-block :slant italic)))) - `(org-warning ((,class (:foreground ,err :inherit org-priority)))) - -;;;;; outline - `(outline-1 ((,class (:inherit org-level-1)))) - `(outline-2 ((,class (:inherit org-level-2)))) - `(outline-3 ((,class (:inherit org-level-3)))) - `(outline-4 ((,class (:inherit org-level-4)))) - `(outline-5 ((,class (:inherit org-level-5)))) - `(outline-6 ((,class (:inherit org-level-6)))) - `(outline-7 ((,class (:inherit org-level-7)))) - `(outline-8 ((,class (:inherit org-level-8)))) - -;;;;; perspective - `(persp-selected-face ((,class (:inherit bold :foreground ,func)))) - -;;;;; popup - `(popup-enu-selection-face ((,class (:background ,ttip-sl :foreground ,base)))) - `(popup-face ((,class (:background ,ttip-bg :foreground ,ttip)))) - `(popup-isearch-match ((,class (:inherit match)))) - `(popup-menu-face ((,class (:background ,ttip-bg :foreground ,base)))) - `(popup-menu-mouse-face ((,class (:inherit highlight)))) - `(popup-scroll-bar-background-face ((,class (:background ,bg2)))) - `(popup-scroll-bar-foreground-face ((,class (:background ,act2)))) - `(popup-tip-face ((,class (:background ,ttip-sl :foreground ,base :bold nil :italic nil :underline nil)))) - -;;;;; powerline - `(powerline-active1 ((,class (:background ,act2 :foreground ,base)))) - `(powerline-active2 ((,class (:background ,act2 :foreground ,base)))) - `(powerline-inactive1 ((,class (:background ,bg2 :foreground ,base)))) - `(powerline-inactive2 ((,class (:background ,bg2 :foreground ,base)))) - -;;;;; rainbow-delimiters - `(rainbow-delimiters-depth-1-face ((,class :foreground ,keyword))) - `(rainbow-delimiters-depth-2-face ((,class :foreground ,func))) - `(rainbow-delimiters-depth-3-face ((,class :foreground ,str))) - `(rainbow-delimiters-depth-4-face ((,class :foreground ,green))) - `(rainbow-delimiters-depth-5-face ((,class :foreground ,yellow))) - `(rainbow-delimiters-depth-6-face ((,class :foreground ,keyword))) - `(rainbow-delimiters-depth-7-face ((,class :foreground ,func))) - `(rainbow-delimiters-depth-8-face ((,class :foreground ,str))) - `(rainbow-delimiters-mismatched-face ((,class :foreground ,err :overline t))) - `(rainbow-delimiters-unmatched-face ((,class :foreground ,err :overline t))) - -;;;;; rcirc - `(rcirc-bright-nick ((,class (:background ,aqua-bg :foreground ,cyan)))) - `(rcirc-dim-nick ((,class (:foreground ,base-dim)))) - `(rcirc-keyword ((,class (:background ,green-bg-s :foreground ,green)))) - `(rcirc-timestamp ((,class (:foreground ,keyword)))) - `(rcirc-track-keyword ((,class (:background ,green :foreground ,bg1)))) - `(rcirc-url ((,class (:inherit link)))) - -;;;;; shm - `(shm-current-face ((,class (:background ,green-bg-s)))) - `(shm-quarantine-face ((,class (:background ,red-bg-s)))) - -;;;;; show-paren - `(show-paren-match ((,class (:foreground ,mat :inherit bold :underline ,(when spacemacs-theme-underline-parens t))))) - `(show-paren-match-expression ((,class (:background ,green-bg-s)))) - `(show-paren-mismatch ((,class (:foreground ,err :inherit bold :underline ,(when spacemacs-theme-underline-parens t))))) - -;;;;; smartparens - `(sp-pair-overlay-face ((,class (:background ,highlight :foreground nil)))) - `(sp-show-pair-match-face ((,class (:foreground ,mat :inherit bold :underline ,(when spacemacs-theme-underline-parens t))))) - -;;;;; smerge - `(smerge-base ((,class (:background ,yellow-bg :extend t)))) - `(smerge-markers ((,class (:background ,ttip-bg :foreground ,ttip :extend t)))) - `(smerge-mine ((,class (:background ,red-bg)))) - `(smerge-other ((,class (:background ,green-bg)))) - `(smerge-refined-added ((,class (:background ,green-bg-s :foreground ,green)))) - `(smerge-refined-changed ((,class (:background ,blue-bg-s :foreground ,blue)))) - `(smerge-refined-removed ((,class (:background ,red-bg-s :foreground ,red)))) - -;;;;; solaire - `(solaire-default-face ((,class (:inherit default :background ,bg2)))) - `(solaire-minibuffer-face ((,class (:inherit default :background ,bg2)))) - `(solaire-hl-line-face ((,class (:inherit hl-line :background ,bg2)))) - `(solaire-org-hide-face ((,class (:inherit org-hide :background ,bg2)))) - -;;;;; spaceline - `(spaceline-flycheck-error ((,class (:foreground ,err)))) - `(spaceline-flycheck-info ((,class (:foreground ,keyword)))) - `(spaceline-flycheck-warning((,class (:foreground ,war)))) - `(spaceline-python-venv ((,class (:foreground ,comp)))) - -;;;;; spacemacs-specific - `(spacemacs-transient-state-title-face ((,class (:background nil :foreground ,comp :box nil :inherit bold)))) - -;;;;; swiper - `(swiper-line-face ((,class (:background ,highlight :inherit bold)))) - `(swiper-match-face-1 ((,class (:inherit bold)))) - `(swiper-match-face-2 ((,class (:foreground ,head1 :underline t)))) - `(swiper-match-face-3 ((,class (:foreground ,head4 :underline t)))) - `(swiper-match-face-4 ((,class (:foreground ,head3 :underline t)))) - -;;;;; tabbar - `(tabbar-button ((,class (:inherit tabbar-default )))) - `(tabbar-button-highlight ((,class (:inherit tabbar-default)))) - `(tabbar-default ((,class (:background ,bg1 :foreground ,head1 :height 0.9)))) - `(tabbar-highlight ((,class (:underline t)))) - `(tabbar-selected ((,class (:inherit tabbar-default :foreground ,func :weight bold)))) - `(tabbar-selected-modified ((,class (:inherit tabbar-default :foreground ,red :weight bold)))) - `(tabbar-separator ((,class (:inherit tabbar-default)))) - `(tabbar-unselected ((,class (:inherit tabbar-default :background ,bg1 :slant italic :weight light)))) - `(tabbar-unselected-modified ((,class (:inherit tabbar-unselected :background ,bg1 :foreground ,red)))) - -;;;;; term - `(term ((,class (:foreground ,base :background ,bg1)))) - `(term-color-black ((,class (:foreground ,bg4 :background ,bg4)))) - `(term-color-blue ((,class (:foreground ,keyword :background ,keyword)))) - `(term-color-cyan ((,class (:foreground ,cyan :background ,cyan)))) - `(term-color-green ((,class (:foreground ,green :background ,green)))) - `(term-color-magenta ((,class (:foreground ,magenta :background ,magenta)))) - `(term-color-red ((,class (:foreground ,red :background ,red)))) - `(term-color-white ((,class (:foreground ,base :background ,base)))) - `(term-color-yellow ((,class (:foreground ,yellow :background ,yellow)))) - -;;;;; vterm - `(vterm-color-default ((,class (:foreground ,base :background ,bg1)))) - ;; vterm-color-black used to render black color code. - ;; The foreground color is used as ANSI color 0 and the background - ;; color is used as ANSI color 8. - `(vterm-color-black ((,class (:foreground ,bg4 :background ,bg4)))) - `(vterm-color-blue ((,class (:foreground ,blue :background ,blue)))) - `(vterm-color-cyan ((,class (:foreground ,cyan :background ,cyan)))) - `(vterm-color-green ((,class (:foreground ,green :background ,green)))) - `(vterm-color-magenta ((,class (:foreground ,magenta :background ,magenta)))) - `(vterm-color-red ((,class (:foreground ,red :background ,red)))) - `(vterm-color-white ((,class (:foreground ,base :background ,base)))) - `(vterm-color-yellow ((,class (:foreground ,yellow :background ,yellow)))) - -;;;;; tide - `(tide-hl-identifier-face ((,class (:foreground ,yellow :background ,yellow-bg)))) - -;;;;; treemacs - `(treemacs-git-added-face ((,class (:foreground ,green :background ,green-bg)))) - `(treemacs-git-conflict-face ((,class (:foreground ,red :background ,red-bg)))) - `(treemacs-git-ignored-face ((,class (:foreground ,yellow)))) - `(treemacs-git-modified-face ((,class (:foreground ,blue :background ,blue-bg)))) - `(treemacs-git-untracked-face ((,class (:foreground ,aqua :background ,aqua-bg)))) - -;;;;; web-mode - `(web-mode-builtin-face ((,class (:inherit ,font-lock-builtin-face)))) - `(web-mode-comment-face ((,class (:inherit ,font-lock-comment-face)))) - `(web-mode-constant-face ((,class (:inherit ,font-lock-constant-face)))) - `(web-mode-current-element-highlight-face ((,class (:background ,bg3)))) - `(web-mode-doctype-face ((,class (:inherit ,font-lock-comment-face)))) - `(web-mode-function-name-face ((,class (:inherit ,font-lock-function-name-face)))) - `(web-mode-html-attr-name-face ((,class (:foreground ,func)))) - `(web-mode-html-attr-value-face ((,class (:foreground ,keyword)))) - `(web-mode-html-tag-face ((,class (:foreground ,keyword)))) - `(web-mode-keyword-face ((,class (:foreground ,keyword)))) - `(web-mode-string-face ((,class (:foreground ,str)))) - `(web-mode-symbol-face ((,class (:foreground ,type)))) - `(web-mode-type-face ((,class (:inherit ,font-lock-type-face)))) - `(web-mode-warning-face ((,class (:inherit ,font-lock-warning-face)))) - -;;;;; which-key - `(which-key-command-description-face ((,class (:foreground ,base)))) - `(which-key-group-description-face ((,class (:foreground ,keyword)))) - `(which-key-key-face ((,class (:foreground ,func :inherit bold)))) - `(which-key-separator-face ((,class (:background nil :foreground ,str)))) - `(which-key-special-key-face ((,class (:background ,func :foreground ,bg1)))) - -;;;;; which-function-mode - `(which-func ((,class (:foreground ,func)))) - -;;;;; whitespace-mode - `(whitespace-empty ((,class (:background nil :foreground ,yellow)))) - `(whitespace-indentation ((,class (:background nil :foreground ,war)))) - `(whitespace-line ((,class (:background nil :foreground ,comp)))) - `(whitespace-newline ((,class (:background nil :foreground ,comp)))) - `(whitespace-space ((,class (:background nil :foreground ,act2)))) - `(whitespace-space-after-tab ((,class (:background nil :foreground ,yellow)))) - `(whitespace-space-before-tab ((,class (:background nil :foreground ,yellow)))) - `(whitespace-tab ((,class (:background nil :foreground ,act2)))) - `(whitespace-trailing ((,class (:background ,err :foreground ,war)))) - -;;;;; other, need more work - `(ac-completion-face ((,class (:underline t :foreground ,keyword)))) - `(ffap ((,class (:foreground ,base)))) - `(flx-highlight-face ((,class (:foreground ,comp :underline nil)))) - `(icompletep-determined ((,class :foreground ,keyword))) - `(js2-external-variable ((,class (:foreground ,comp)))) - `(js2-function-param ((,class (:foreground ,const)))) - `(js2-jsdoc-html-tag-delimiter ((,class (:foreground ,str)))) - `(js2-jsdoc-html-tag-name ((,class (:foreground ,keyword)))) - `(js2-jsdoc-value ((,class (:foreground ,str)))) - `(js2-private-function-call ((,class (:foreground ,const)))) - `(js2-private-member ((,class (:foreground ,base)))) - `(js3-error-face ((,class (:underline ,war)))) - `(js3-external-variable-face ((,class (:foreground ,var)))) - `(js3-function-param-face ((,class (:foreground ,keyword)))) - `(js3-instance-member-face ((,class (:foreground ,const)))) - `(js3-jsdoc-tag-face ((,class (:foreground ,keyword)))) - `(js3-warning-face ((,class (:underline ,keyword)))) - `(slime-repl-inputed-output-face ((,class (:foreground ,comp)))) - `(trailing-whitespace ((,class :foreground nil :background ,err))) - `(undo-tree-visualizer-current-face ((,class :foreground ,keyword))) - `(undo-tree-visualizer-default-face ((,class :foreground ,base))) - `(undo-tree-visualizer-register-face ((,class :foreground ,comp))) - `(undo-tree-visualizer-unmodified-face ((,class :foreground ,var)))) - - (custom-theme-set-variables - theme-name - -;;;;; ansi-color-names - `(ansi-color-names-vector [,bg4 ,red ,green ,yellow ,blue ,magenta ,cyan ,base]) - -;;;;; hl-todo - `(hl-todo-keyword-faces '(("TODO" . ,war) - ("NEXT" . ,war) - ("THEM" . ,aqua) - ("PROG" . ,blue) - ("OKAY" . ,blue) - ("DONT" . ,red) - ("FAIL" . ,red) - ("DONE" . ,suc) - ("NOTE" . ,yellow) - ("KLUDGE" . ,yellow) - ("HACK" . ,yellow) - ("TEMP" . ,yellow) - ("FIXME" . ,war) - ("XXX+" . ,war) - ("\\?\\?\\?+" . ,war))) - - -;;;;; pdf-tools - `(pdf-view-midnight-colors '(,base . ,bg1))) - )) - - -;;;###autoload -(when load-file-name - (add-to-list 'custom-theme-load-path - (file-name-as-directory (file-name-directory load-file-name)))) - -(provide 'spacemacs-common) - -;; Local Variables: -;; no-byte-compile: t -;; End: - -;;; spacemacs-common.el ends here diff --git a/elpa/spacemacs-theme-20200324.1107/spacemacs-dark-theme.el b/elpa/spacemacs-theme-20200324.1107/spacemacs-dark-theme.el deleted file mode 100644 index 7b5e33f3..00000000 --- a/elpa/spacemacs-theme-20200324.1107/spacemacs-dark-theme.el +++ /dev/null @@ -1,7 +0,0 @@ -(require 'spacemacs-common) - -(deftheme spacemacs-dark "Spacemacs theme, the dark version") - -(create-spacemacs-theme 'dark 'spacemacs-dark) - -(provide-theme 'spacemacs-dark) diff --git a/elpa/spacemacs-theme-20200324.1107/spacemacs-dark-theme.elc b/elpa/spacemacs-theme-20200324.1107/spacemacs-dark-theme.elc deleted file mode 100644 index f35e636c8f8cb27caaccdae03af0b5a007996064..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 647 zcmbtRu};G<5bc~FU_HVDQd6}Fv{ac;)u9qw*(k%+z7mVr4z^QNzMhL4pop=SPWIh< z_nv(&mye5!!C;V-WeE$b8xi88R%C_L=Rd1Vdc(@_zT4;3oFx(3?>rPU_}hW#js z;8UeM>{ta_PafpKpjHB;6+Sp+Uj2|!=L4XWB;m(pG9Tshe;U%VhOq&JH36C2hFx~g z6_Y)z7poPB3LT2TR~$xrG!nc8fd;k&wZ%Us{Zl*;x>}KgP%$wtj=nsCvsQP3b61ii z*V{v&Ojt>fZi?}kV{*C4C*2|EC^&98?ymacl#^Km(qko33+@@uQh0Xs-YQ4n8x++2 zC~IrYA1YcOtj;8f8XaY!B7Mq|=-y76y0qt{>u)I@AU6%W4I;mva09F# diff --git a/elpa/spacemacs-theme-20200324.1107/spacemacs-light-theme.el b/elpa/spacemacs-theme-20200324.1107/spacemacs-light-theme.el deleted file mode 100644 index 4b68588d..00000000 --- a/elpa/spacemacs-theme-20200324.1107/spacemacs-light-theme.el +++ /dev/null @@ -1,7 +0,0 @@ -(require 'spacemacs-common) - -(deftheme spacemacs-light "Spacemacs theme, the light version") - -(create-spacemacs-theme 'light 'spacemacs-light) - -(provide-theme 'spacemacs-light) diff --git a/elpa/spacemacs-theme-20200324.1107/spacemacs-light-theme.elc b/elpa/spacemacs-theme-20200324.1107/spacemacs-light-theme.elc deleted file mode 100644 index 06e314caf26c8186edff276508d9fb07b3bc97e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmbtRJ#WG=5M|CE=z2|;Rw4)z3PqVJ#DLU|Zl%LvAH-5@r?x{ye|;|>EmR$`bh7W> zyZ7vKzIs{S3U8#~}nU;o{k|g}POctYb@lQiq)-X1JuqGgr>#$Fr zxMGs$&2qg4QJ_N+_=>~U9*qQVL7;&hL22=iN&gfNgsxQNAQVhYv(A@CaMfxqaP5ks z=zez!ln5&c;%zn_b4+fx>7+TN92v)y - -;; Author: Vineet Naik -;; URL: https://github.com/naiquevin/sphinx-doc.el -;; Package-Version: 20160116.1117 -;; Version: 0.3.0 -;; Keywords: Sphinx, Python -;; Package-Requires: ((s "1.9.0") (cl-lib "0.5") (dash "2.10.0")) - -;; This program is *not* a part of emacs and is provided under the MIT -;; License (MIT) -;; -;; Copyright (c) 2013 -;; -;; Permission is hereby granted, free of charge, to any person -;; obtaining a copy of this software and associated documentation -;; files (the "Software"), to deal in the Software without -;; restriction, including without limitation the rights to use, copy, -;; modify, merge, publish, distribute, sublicense, and/or sell copies -;; of the Software, and to permit persons to whom the Software is -;; furnished to do so, subject to the following conditions: -;; -;; The above copyright notice and this permission notice shall be -;; included in all copies or substantial portions of the Software. -;; -;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -;; BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -;; ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -;; CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -;; SOFTWARE. - -;;; Commentary: -;; -;; This file provides a minor mode for inserting docstring skeleton -;; for Python functions and methods. The structure of the docstring is -;; as per the requirements of the Sphinx documentation generator -;; - -;;; Code: - -(require 'cl-lib) -(require 'dash) -(require 's) - - -(defun sphinx-doc-current-line () - "Return current line as string." - (buffer-substring-no-properties (point-at-bol) (point-at-eol))) - - -;; regular expression to identify a valid function definition in -;; python and match it's name and arguments -(defconst sphinx-doc-fun-regex "^ *def \\([a-zA-Z0-9_]+\\)(\\(\\(?:.\\|\n\\)*\\)):$") - -;; regexes for beginning and end of python function definitions -(defconst sphinx-doc-fun-beg-regex "def") -(defconst sphinx-doc-fun-end-regex ":\\(?:\n\\)?") - -;; Variations for some field keys recognized by Sphinx -(defconst sphinx-doc-param-variants '("param" "parameter" "arg" "argument" - "key" "keyword")) -(defconst sphinx-doc-raises-variants '("raises" "raise" "except" "exception")) -(defconst sphinx-doc-returns-variants '("returns" "return")) - -(defvar sphinx-doc-python-indent) - -;; struct definitions - -(cl-defstruct sphinx-doc-arg - name ; name of the arg - default) ; optional default value if specified - - -(cl-defstruct sphinx-doc-fndef - name ; name of the function - args) ; list of arg objects - - -(cl-defstruct sphinx-doc-field - key ; one of the allowed field name keyword - type ; optional datatype - arg ; optional argument - (desc "")) ; description - -;; Note about various types of reST fields recognized by Sphinx and -;; how they are represented using the `sphinx-doc-field` struct -;; above. The `key` should be non-nil in all since that's how they are -;; identified: -;; -;; 1. param: All params must have a valid `arg` whereas `type` is -;; optional and `desc` will initially be an empty string -;; 2. type: Must have valid `arg` -;; 3. rtype: Must NOT have `type` or `arg` -;; 4. returns: Must NOT have `type` or `arg` -;; 5. raises: Must have a valid `arg` -;; -;; See Also: http://sphinx-doc.org/domains.html#info-field-lists - - -(cl-defstruct sphinx-doc-doc - (summary "FIXME! briefly describe function") ; summary line that fits on the first line - before-fields ; list of comments before fields - after-fields ; list of comments after fields - fields) ; list of field objects - - -(defun sphinx-doc-str->arg (s) - "Build an arg object from string S." - (let ((parts (mapcar #'s-trim (split-string s "=")))) - (if (cdr parts) - (make-sphinx-doc-arg :name (car parts) - :default (cadr parts)) - (make-sphinx-doc-arg :name (car parts))))) - - -(defun sphinx-doc-fndef->doc (f) - "Build a doc object solely from fndef F." - (make-sphinx-doc-doc - :fields (append - (mapcar (lambda (a) - (make-sphinx-doc-field - :key "param" - :arg (sphinx-doc-arg-name a))) - (sphinx-doc-fndef-args f)) - (list (make-sphinx-doc-field :key "returns") - (make-sphinx-doc-field :key "rtype"))))) - - -(defun sphinx-doc-fun-args (argstrs) - "Extract list of arg objects from string ARGSTRS. -ARGSTRS is the string representing function definition in Python. -Note that the arguments self, *args and **kwargs are ignored." - (when (not (string= argstrs "")) - (mapcar #'sphinx-doc-str->arg - (-filter - (lambda (str) - (and (not (string= (substring str 0 1) "*")) - (not (string= str "self")))) - (mapcar #'s-trim - (split-string argstrs ",")))))) - - -(defun sphinx-doc-str->fndef (s) - "Build a fndef object from string S. -S is a string representation of the python function definition -Returns nil if string is not a function definition." - (when (string-match sphinx-doc-fun-regex s) - (make-sphinx-doc-fndef - :name (match-string 1 s) - :args (sphinx-doc-fun-args (match-string 2 s))))) - - -(defun sphinx-doc-field->str (f) - "Convert a field object F to it's string representation." - (cond ((and (stringp (sphinx-doc-field-arg f)) - (stringp (sphinx-doc-field-type f))) - (s-format ":${key} ${type} ${arg}: ${desc}" - 'aget - `(("key" . ,(sphinx-doc-field-key f)) - ("type" . ,(sphinx-doc-field-type f)) - ("arg" . ,(sphinx-doc-field-arg f)) - ("desc" . ,(sphinx-doc-field-desc f))))) - ((stringp (sphinx-doc-field-arg f)) - (s-format ":${key} ${arg}: ${desc}" - 'aget - `(("key" . ,(sphinx-doc-field-key f)) - ("arg" . ,(sphinx-doc-field-arg f)) - ("desc" . ,(sphinx-doc-field-desc f))))) - (t (s-format ":${key}: ${desc}" - 'aget - `(("key" . ,(sphinx-doc-field-key f)) - ("desc" . ,(sphinx-doc-field-desc f))))))) - - -(defun sphinx-doc-doc->str (ds) - "Convert a doc object DS into string representation." - (s-join - "\n" - (-filter - (lambda (x) (not (equal x nil))) - (list (s-format "\"\"\"$0\n" 'elt (list (sphinx-doc-doc-summary ds))) - (when (and (sphinx-doc-doc-before-fields ds) - (not (string= (sphinx-doc-doc-before-fields ds) ""))) - (concat (sphinx-doc-doc-before-fields ds) "\n")) - (s-join "\n" (mapcar #'sphinx-doc-field->str - (sphinx-doc-doc-fields ds))) - "" - (when (and (sphinx-doc-doc-after-fields ds) - (not (string= (sphinx-doc-doc-after-fields ds) ""))) - (concat (sphinx-doc-doc-after-fields ds) "\n")) - "\"\"\"")))) - - -(defun sphinx-doc-parse (docstr indent) - "Parse docstring DOCSTR into it's equivalent doc object. -INDENT is the current indentation level of the Python function." - (let* ((lines (mapcar (lambda (line) - (s-chop-prefix (make-string indent 32) line)) - (split-string docstr "\n"))) - (paras (sphinx-doc-lines->paras lines)) - (field-para? #'(lambda (p) (s-starts-with? ":" (car p)))) - (comment? #'(lambda (p) (not (funcall field-para? p))))) - (progn - (make-sphinx-doc-doc - :summary (caar paras) - :before-fields (sphinx-doc-paras->str - (-take-while comment? (cdr paras))) - :after-fields (sphinx-doc-paras->str - (cdr (-drop-while comment? (cdr paras)))) - :fields (sphinx-doc-parse-fields - (car (-filter field-para? paras))))))) - - -(defun sphinx-doc-paras->str (paras) - "Convert PARAS to string. -PARAS are list of paragraphs (which in turn are list of lines). -This is done by adding a newline between two lines of each para -and a blank line between each para." - (s-join - "" - (apply #'append - (-interpose '("\n\n") - (mapcar (lambda (p) - (-interpose "\n" p)) - paras))))) - - -(defun sphinx-doc-lines->paras (lines) - "Group LINES which are list of strings into paragraphs." - (reverse - (mapcar - #'reverse - (car - (cl-reduce (lambda (acc x) - (let ((paras (car acc)) - (prev-blank? (cdr acc))) - (cond ((string= x "") (cons paras t)) - (prev-blank? (cons (cons (list x) paras) nil)) - (t (cons (cons (cons x (car paras)) (cdr paras)) nil))))) - (cdr lines) - :initial-value (cons (list (list (car lines))) nil)))))) - - -(defun sphinx-doc-str->field (s) - "Parse a single field into field object. -Argument S represents a single field in the fields paragraph of -the docstring." - (cond ((string-match "^:\\([a-z]+\\) \\([a-z.]+\\) \\([a-zA-Z0-9_]+\\):\s?\\(.*\\(?:\n\s*.*\\)*\\)$" s) - (make-sphinx-doc-field :key (match-string 1 s) - :type (match-string 2 s) - :arg (match-string 3 s) - :desc (match-string 4 s))) - ((string-match "^:\\([a-z]+\\) \\([a-zA-Z0-9_]+\\):\s?\\(.*\\(?:\n\s*.*\\)*\\)$" s) - (make-sphinx-doc-field :key (match-string 1 s) - :arg (match-string 2 s) - :desc (match-string 3 s))) - ((string-match "^:\\([a-z]+\\):\s?\\(.*\\(?:\n\s*.*\\)*\\)$" s) - (make-sphinx-doc-field :key (match-string 1 s) - :desc (match-string 2 s))))) - - -(defun sphinx-doc-parse-fields (fields-para) - "Parse FIELDS-PARA into list of field objects. -FIELDS-PARA is the fields section of the docstring." - (when fields-para - (mapcar #'sphinx-doc-str->field - (mapcar (lambda (s) - (if (s-starts-with? ":" s) s (concat ":" s))) - (split-string (s-join "\n" fields-para) "\n:"))))) - - -(defun sphinx-doc-merge-docs (old new) - "Merge OLD and NEW doc objects. -Effectively, only the fields field of new doc are merged whereas -the remaining fields of the old object stay as they are." - (make-sphinx-doc-doc - :summary (sphinx-doc-doc-summary old) - :before-fields (sphinx-doc-doc-before-fields old) - :after-fields (sphinx-doc-doc-after-fields old) - :fields (sphinx-doc-merge-fields - (sphinx-doc-doc-fields old) - (sphinx-doc-doc-fields new)))) - - -(defun sphinx-doc-select-fields (keys fields) - "Return subset of fields with select keys. -KEYS is a list of strings and FIELDS is a list of field objects." - (-filter (lambda (f) - (member (sphinx-doc-field-key f) keys)) - fields)) - - -(defun sphinx-doc-field-map (fields) - "Create a mapping of field arg with the field for all FIELDS." - (mapcar (lambda (f) (cons (sphinx-doc-field-arg f) f)) fields)) - - -(defun sphinx-doc-field-map-get (key mapping) - "Return the value in the field mapping for the key or nil. -KEY is a string and MAPPING is an associative list." - (cdr (assoc key mapping))) - - -(defun sphinx-doc-merge-fields (old new) - "Merge old and new fields together. -OLD is the list of old field objects, NEW is the list of new -field objects." - (let ((param-map (sphinx-doc-field-map - (sphinx-doc-select-fields sphinx-doc-param-variants old))) - (type-map (sphinx-doc-field-map - (sphinx-doc-select-fields '("type") old))) - (fixed-fields (sphinx-doc-select-fields - (cons "rtype" (append sphinx-doc-returns-variants - sphinx-doc-raises-variants)) - old))) - (append (-mapcat - (lambda (f) - (let* ((key (sphinx-doc-field-arg f)) - (param (sphinx-doc-field-map-get key param-map)) - (type (sphinx-doc-field-map-get key type-map))) - (cond ((and param type) (list param type)) - (param (list param)) - (t (list f))))) - (sphinx-doc-select-fields sphinx-doc-param-variants new)) - fixed-fields))) - - -;; Note: Following few functions (those using `save-excursion`) must -;; be invoked only when the cursor is on the function definition line. - -(defun sphinx-doc-get-region (srch-beg srch-end) - "Return the beginning and end points of a region by searching. -SRCH-BEG and SRCH-END are the chars to search for." - (save-excursion - (search-forward-regexp srch-beg) - (let ((beg (point))) - (search-forward-regexp srch-end) - (vector beg (point))))) - - -(defun sphinx-doc-current-indent () - "Return the indentation level of the current line. -ie. by how many number of spaces the current line is indented" - (save-excursion - (let ((bti (progn (back-to-indentation) (point))) - (bol (progn (beginning-of-line) (point)))) - (- bti bol)))) - - -(defun sphinx-doc-fndef-str () - "Return the Python function definition as a string." - (save-excursion - (let ((ps (sphinx-doc-get-region sphinx-doc-fun-beg-regex - sphinx-doc-fun-end-regex))) - (buffer-substring-no-properties (- (elt ps 0) 3) (- (elt ps 1) 1))))) - - -(defun sphinx-doc-exists? () - "Return whether the docstring already exists for a function." - (save-excursion - (search-forward-regexp sphinx-doc-fun-end-regex) - (s-starts-with? "\"\"\"" (s-trim (sphinx-doc-current-line))))) - - -(defun sphinx-doc-existing () - "Return docstring of the function if it exists else nil." - (when (sphinx-doc-exists?) - (let* ((ps (sphinx-doc-get-region "\"\"\"" "\"\"\"")) - (docstr (buffer-substring-no-properties (elt ps 0) - (- (elt ps 1) 3))) - (indent (save-excursion - (search-forward-regexp sphinx-doc-fun-end-regex) - (sphinx-doc-current-indent)))) - (sphinx-doc-parse docstr indent)))) - - -(defun sphinx-doc-kill-old-doc (indent) - "Kill the old docstring for the current Python function. -INDENT is an integer representing the number of spaces the -function body is indented from the beginning of the line" - (save-excursion - (let ((ps (sphinx-doc-get-region "\"\"\"" "\"\"\"\\(?:\n\\)?"))) - (kill-region (- (elt ps 0) 3) (+ (elt ps 1) indent))))) - - -(defun sphinx-doc-insert-doc (doc) - "Insert the DOC as string for the current Python function." - (save-excursion - (search-forward-regexp sphinx-doc-fun-end-regex) - (forward-line -1) - (move-end-of-line nil) - (newline-and-indent) - (insert (sphinx-doc-doc->str doc)))) - - -(defun sphinx-doc-indent-doc (indent) - "Indent docstring for the current function. -INDENT is the level of indentation" - (save-excursion - (let ((ps (sphinx-doc-get-region "\"\"\"" "\"\"\""))) - (indent-rigidly (elt ps 0) (elt ps 1) indent)))) - - -(defun sphinx-doc () - "Insert docstring for the Python function definition at point. -This is an interactive function and the docstring generated is as -per the requirement of Sphinx documentation generator." - (interactive) - (if (string= (thing-at-point 'word) "def") - (back-to-indentation) - (search-backward-regexp sphinx-doc-fun-beg-regex)) - (let ((fd (sphinx-doc-str->fndef (sphinx-doc-fndef-str)))) - (if fd - (let ((indent (+ (sphinx-doc-current-indent) sphinx-doc-python-indent)) - (old-ds (sphinx-doc-existing)) - (new-ds (sphinx-doc-fndef->doc fd))) - (progn - (when old-ds (sphinx-doc-kill-old-doc indent)) - (sphinx-doc-insert-doc - (if old-ds - (sphinx-doc-merge-docs old-ds new-ds) - new-ds)) - (sphinx-doc-indent-doc indent) - (search-forward "\"\"\"")))))) - - -(defvar sphinx-doc-mode-map - (let ((m (make-sparse-keymap))) - (define-key m (kbd "C-c M-d") 'sphinx-doc) - m)) - - -;;;###autoload -(define-minor-mode sphinx-doc-mode - "Sphinx friendly docstring generation for Python code." - :init-value nil - :lighter " Spnxd" - :keymap sphinx-doc-mode-map - (when sphinx-doc-mode ; ON - (set (make-local-variable 'sphinx-doc-python-indent) - (cond ((boundp 'python-indent-offset) - python-indent-offset) - ((boundp 'python-indent) - python-indent) - (t 4))))) - - -(provide 'sphinx-doc) - -;;; sphinx-doc.el ends here diff --git a/elpa/sphinx-doc-20160116.1117/sphinx-doc.elc b/elpa/sphinx-doc-20160116.1117/sphinx-doc.elc deleted file mode 100644 index 41e21598ce48e235395707330b0fe9357ee19f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32908 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 diff --git a/elpa/sphinx-frontend-20161025.758/sphinx-frontend-autoloads.el b/elpa/sphinx-frontend-20161025.758/sphinx-frontend-autoloads.el deleted file mode 100644 index 245f1865..00000000 --- a/elpa/sphinx-frontend-20161025.758/sphinx-frontend-autoloads.el +++ /dev/null @@ -1,50 +0,0 @@ -;;; sphinx-frontend-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "sphinx-frontend" "sphinx-frontend.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from sphinx-frontend.el - -(autoload 'sphinx-build-html "sphinx-frontend" "\ -Compiles the rst file to html via sphinx and shows the output in a buffer. -Without `arg' saves current file. - -\(fn ARG)" t nil) - -(autoload 'sphinx-build-latex "sphinx-frontend" "\ -Compiles the rst file to latex via sphinx and shows the output in a buffer. -Without `arg' saves current file. - -\(fn ARG)" t nil) - -(autoload 'sphinx-run-pdflatex "sphinx-frontend" "\ -Ad-hoc call pdflatex for LaTeX-builded documentation. - -\(fn)" t nil) - -(autoload 'sphinx-clean-html "sphinx-frontend" "\ -Removes `sphinx-output-dir-html' dir. - -\(fn)" t nil) - -(autoload 'sphinx-clean-pdf "sphinx-frontend" "\ -Removes `sphinx-output-dir-pdf' dir. - -\(fn)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "sphinx-frontend" '("sphinx-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; sphinx-frontend-autoloads.el ends here diff --git a/elpa/sphinx-frontend-20161025.758/sphinx-frontend-pkg.el b/elpa/sphinx-frontend-20161025.758/sphinx-frontend-pkg.el deleted file mode 100644 index 5d82ced6..00000000 --- a/elpa/sphinx-frontend-20161025.758/sphinx-frontend-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "sphinx-frontend" "20161025.758" "Launch build process for rst documents via sphinx." 'nil :commit "0cbb03361c245382d3e679dded30c4fc1713c252" :keywords '("compile" "sphinx" "restructuredtext") :authors '(("Kostafey" . "kostafey@gmail.com")) :maintainer '("Kostafey" . "kostafey@gmail.com") :url "https://github.com/kostafey/sphinx-frontend") diff --git a/elpa/sphinx-frontend-20161025.758/sphinx-frontend.el b/elpa/sphinx-frontend-20161025.758/sphinx-frontend.el deleted file mode 100644 index fc3cc7b9..00000000 --- a/elpa/sphinx-frontend-20161025.758/sphinx-frontend.el +++ /dev/null @@ -1,123 +0,0 @@ -;;; sphinx-frontend.el --- Launch build process for rst documents via sphinx. - -;; Copyright © 2012-2016 - Kostafey - -;; Author: Kostafey -;; URL: https://github.com/kostafey/sphinx-frontend -;; Package-Version: 20161025.758 -;; Keywords: compile, sphinx, reStructuredText -;; Version: 0.1 - -;; This file is not part of GNU Emacs. - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with this program; if not, write to the Free Software Foundation, -;; Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - -(defvar sphinx-build-command "sphinx-build -b " - "Runs `sphinx-build-script.py'. --b -- builder to use; default is html") - -(defvar sphinx-output-dir-html "build-html" - "Relative to current document's root output directory for html format.") - -(defvar sphinx-output-dir-pdf "build-pdf" - "Relative to current document's root output directory for pdf format.") - -(defvar sphinx-conf-file-name "conf.py" - "Document's root configuration file.") - -(defun sphinx-get-root-document-dir () - "Recursively searches current document's tree root. -The root sign is the location in the directory `sphinx-conf-file-name' file. -Returns current document's tree root directory." - (or (locate-dominating-file default-directory sphinx-conf-file-name) - (error (concat "Can't find file " sphinx-conf-file-name)))) - -(defun sphinx-get-build-command (output-format output-dir) - "Returns sphinx build command according to `output-format'." - (let ((current-dir (sphinx-get-root-document-dir))) - (concat sphinx-build-command " " output-format " " - ;; sourcedir - (shell-quote-argument (file-name-as-directory (expand-file-name current-dir))) " " - ;; outdir - (shell-quote-argument (file-name-as-directory - (expand-file-name output-dir current-dir)))))) - -(defun sphinx-get-build-command-html () - (sphinx-get-build-command "html" sphinx-output-dir-html)) - -(defun sphinx-get-build-command-latex () - (sphinx-get-build-command "latex" sphinx-output-dir-pdf)) - -(defun sphinx-build (save-without-query command) - "Compiles the rst file via sphinx and shows the output in a buffer. -`command' is a full sphinx build command with params, input and output -directories. -If `save-without-query' is t, saves current file without query." - (let (rst-buffer (current-buffer)) - (progn - (if (and save-without-query (buffer-modified-p rst-buffer)) - (save-buffer rst-buffer)) - (compile command)))) - -;;;###autoload -(defun sphinx-build-html (arg) - "Compiles the rst file to html via sphinx and shows the output in a buffer. -Without `arg' saves current file." - (interactive "P") - (sphinx-build (not arg) (sphinx-get-build-command-html))) - -;;;###autoload -(defun sphinx-build-latex (arg) - "Compiles the rst file to latex via sphinx and shows the output in a buffer. -Without `arg' saves current file." - (interactive "P") - (sphinx-build (not arg) (sphinx-get-build-command-latex))) - -;;;###autoload -(defun sphinx-run-pdflatex () - "Ad-hoc call pdflatex for LaTeX-builded documentation." - (interactive) - (cd (expand-file-name sphinx-output-dir-pdf (sphinx-get-root-document-dir))) - (compile "pdflatex -interaction=nonstopmode *.tex")) - -(defun sphinx--clean (sphinx-output-dir) - "Removes directory `sphinx-output-dir' in the documentation root path." - (delete-directory - (file-name-as-directory - (expand-file-name sphinx-output-dir - (sphinx-get-root-document-dir))) t t)) - -;;;###autoload -(defun sphinx-clean-html () - "Removes `sphinx-output-dir-html' dir." - (interactive) - (sphinx--clean sphinx-output-dir-html)) - -;;;###autoload -(defun sphinx-clean-pdf () - "Removes `sphinx-output-dir-pdf' dir." - (interactive) - (sphinx--clean sphinx-output-dir-pdf)) - -(require 'rst) - -(define-key rst-mode-map (kbd "C-c h") 'sphinx-build-html) -(define-key rst-mode-map (kbd "C-c l") 'sphinx-build-latex) -(define-key rst-mode-map (kbd "C-c p") 'sphinx-run-pdflatex) - - -(provide 'sphinx-frontend) - -;;; sphinx-frontend.el ends here diff --git a/elpa/sphinx-frontend-20161025.758/sphinx-frontend.elc b/elpa/sphinx-frontend-20161025.758/sphinx-frontend.elc deleted file mode 100644 index beb0557b67c00e068191070f834850dfb16acc19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3916 zcmcgvOK;pZ5H^rQ?ai&1rl*eO0_zRJ#Y);I+*jb{5Fm#jHP8ZH1EwX)BC1y?%E|WE zcZQ_)y-wN`HL!-3B8M~IeDlrh#j7`$-y9tsbuKP0;IhmsnTgnZkp;ZUc~rxLP_--z z2*&-uy!jw?3Ovi8thCJKUtHtsy5BJ`uTohxlZMGf(y;JJ(-E~8p2S=`qz@U5yf z@HiGREN}5={b06ZBQDWKQEG_FLUY{Q=!8virC=|AyL|l`qLeEhX>{?0xt

)Fni` zfI9(M$u}->q0}I_%A`=BQ`{JY_FjbGi~h)gFa7IuI%mI3eR$UtHQd%!DvOWou8~>H z>PX2-_p3#>4;^*~KbU2qegek8J%cU@_X~(c!kbJ3CL`5(_Fd;3S01>64U6GO^y%U8dQl{DjQujxGa^3bg34Q zl*-&s4>{NU9Y5>|h9?;L37(CWo?9PAqoMU-@b7)7;^cE&pl!|rd~6*UPshfAa00(> z1&p*zW_?de=@=N5ZM|*&K6K3N23(!zXxos zgfNKrJ6EZFf?D1elx~d+Ss7W6uwv-@Dj_YUHl6BP*E{coZWI#lu`5@`T&O&gyoRo$ z(7n)%xWHO&P;TMux{#RMc{m7;Pv+h{7>wu15q=HvGdy{FiYpTjt{rXZjAM{9yXmhD zP~aW8EHKjI-T(|jDI}bC$&0SWkdWC%iM$&K9ieCbpm#%z9uu2vwDt;HLMSx0BzP2+ zDn`r1_ghC(%i`|Az%6-O6KB`w8|PekP;fni#SosIVEm(bVg82*N;sIzLw|65dV0FO z_Vjq};c74*eARPsxjY$&*GrhSE*!eQm4W@)^05BvRAd=@-;`P~uI^2l8#E1z8L!uJ zBtBNCA}fyHfbToJ{a`XCz)5~~iL!y06@V2}d;}oCm|d(czHPy9%M{3lHSmmvVCFyb zc2qaj}5bb3^>SK4Yyo_ZcMa(LDz#T?pY4*8+pk?lKHnURU`-20? zLuoKw>mMcYcMCJzVp($#nc{NuwkFgoLI zvB0gQDhy}-DrMpHF}IKqpYnRdd)~EBk1*Rk-w$TV^I%~^*n_FBR zVNQ+Kn-wz&t*_84lXvrgtnkAYENTHnWtQ^_lz89Z@JM}uegw%vus_8DyeBEnH0wX7 n44~c<{F$+_Y-`?oQZ3gvYPnM7gTy%8nMC35Qc=WMKE2N0wqyFG diff --git a/elpa/sphinx-mode-20180620.915/sphinx-mode-autoloads.el b/elpa/sphinx-mode-20180620.915/sphinx-mode-autoloads.el deleted file mode 100644 index 85a207d7..00000000 --- a/elpa/sphinx-mode-20180620.915/sphinx-mode-autoloads.el +++ /dev/null @@ -1,38 +0,0 @@ -;;; sphinx-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "sphinx-mode" "sphinx-mode.el" (0 0 0 0)) -;;; Generated autoloads from sphinx-mode.el - -(autoload 'sphinx-mode "sphinx-mode" "\ -Sphinx minor mode. - -\(fn &optional ARG)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "sphinx-mode" '("sphinx-"))) - -;;;*** - -;;;### (autoloads nil "sphinx-src" "sphinx-src.el" (0 0 0 0)) -;;; Generated autoloads from sphinx-src.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "sphinx-src" '("sphinx-src-"))) - -;;;*** - -;;;### (autoloads nil nil ("sphinx-mode-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; sphinx-mode-autoloads.el ends here diff --git a/elpa/sphinx-mode-20180620.915/sphinx-mode-pkg.el b/elpa/sphinx-mode-20180620.915/sphinx-mode-pkg.el deleted file mode 100644 index f2a41867..00000000 --- a/elpa/sphinx-mode-20180620.915/sphinx-mode-pkg.el +++ /dev/null @@ -1,6 +0,0 @@ -(define-package "sphinx-mode" "20180620.915" "Minor mode providing sphinx support." - '((f "0.20.0") - (dash "2.14.1"))) -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/sphinx-mode-20180620.915/sphinx-mode.el b/elpa/sphinx-mode-20180620.915/sphinx-mode.el deleted file mode 100644 index 20b7f1fb..00000000 --- a/elpa/sphinx-mode-20180620.915/sphinx-mode.el +++ /dev/null @@ -1,166 +0,0 @@ -;;; sphinx-mode.el --- Minor mode providing sphinx support. - -;; Copyright (C) 2016 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Created: 11th September 2016 -;; Keywords: languages -;; Package-requires: ((dash "2.14.0") (f "0.20")) - - -;; 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 . - -;;; Commentary: - -;;; Code: - -(require 'f) -(require 'dash) -(require 'sphinx-src) - -(defgroup sphinx () - "Sphinx group." - :group 'editing - :prefix "sphinx-") - -(defface sphinx-code-block-face - '((t (:inherit fixed-pitch))) - "Face used for code blocks.") - -(defun sphinx-fontify-code-block (limit) - "Fontify code blocks from point to LIMIT." - (condition-case nil - (while (re-search-forward "\.\. code-block:: \\(.*?\\)\n\n\\( +\\)" limit t) - (let* ((block-start (match-end 0)) - (block-highlight-start (match-beginning 2)) - (lang (match-string 1)) - (prefix (match-string 2)) - (prefix-search (concat "^" prefix)) - block-end) - (while (progn - (forward-line) - (looking-at prefix-search))) - (setq block-end (point)) - (sphinx-src-font-lock-fontify-block lang block-start block-end) - (add-face-text-property - block-highlight-start block-end - 'sphinx-code-block-face 'append))) - (error nil))) - - -(defun sphinx--get-refs-from-buffer (&optional buffer) - "Get all refs from BUFFER. - -If BUFFER is not given use the `current-buffer'." - (setq buffer (current-buffer)) - (let (re) - (with-current-buffer buffer - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (while (re-search-forward "^.. _\\(.*\\):\\s-*$" nil t) - (push (list :name (match-string-no-properties 1) - :file (buffer-file-name) - :point (point)) re))))) - (nreverse re))) - -;; TODO: add caching -(defun sphinx--get-refs () - "Get all available refs in the project." - (let* ((root (locate-dominating-file (buffer-file-name) "conf.py")) - (sources (f-entries root (lambda (file) (f-ext-p file "rst")))) - (re)) - (-each sources - (lambda (source) - (when (file-exists-p source) - (if (get-file-buffer source) - (with-current-buffer (find-file-noselect source) - (push (sphinx--get-refs-from-buffer) re)) - (with-temp-buffer - (insert-file-contents-literally source) - (push (sphinx--get-refs-from-buffer) re)))))) - (apply '-concat (nreverse re)))) - -(defun sphinx-insert-ref (ref &optional title) - "Insert a REF with a TITLE." - (interactive - (let ((ref (completing-read - "Ref: " (-map (lambda (r) - (plist-get r :name)) - (sphinx--get-refs))))) - (list ref (read-from-minibuffer "Title: " nil nil nil nil ref)))) - (insert (if (and (stringp title) - (not (equal title ""))) - (format ":ref:`%s<%s>`" title ref) - (format ":ref:`%s`" ref)))) - -;; TODO: add better default -(defun sphinx-goto-ref (ref) - (interactive - (let ((ref (completing-read - (format "Ref [default %s]: " - (symbol-at-point)) - (-map (lambda (r) - (plist-get r :name)) - (sphinx--get-refs)) - nil nil nil nil (symbol-at-point)))) - (list ref))) - (-when-let (target (--first (equal (plist-get it :name) ref) (sphinx--get-refs))) - (find-file (plist-get target :file)) - (goto-char (plist-get target :point)))) - -(defun sphinx-compile () - "Run 'make' in project root directory and prompt user for target format. - -Return absolute path of compiled version of current source file. - -To see list of target formats, run 'make help' in a shell." - (interactive) - (let ((buffer-name-base (file-name-base (buffer-file-name))) - (project-root-dir (locate-dominating-file buffer-file-name "Makefile")) - (target-format (read-string "Make (default html): " nil nil "html" nil))) - (let* ((file-rel-path (file-relative-name buffer-file-name project-root-dir)) -(build-directory (expand-file-name (concat project-root-dir "_build/" target-format "/")))) - (shell-command (concat "make -C " project-root-dir " " target-format)) - (concat build-directory (file-name-directory file-rel-path) (car (file-name-all-completions (file-name-base file-rel-path) (concat build-directory (file-name-directory file-rel-path)))))))) - -(defun sphinx-compile-and-view () - "Run ‘sphinx-compile’ and view compiled version of current source file with 'xdg-open'." - (interactive) - (shell-command (concat "xdg-open " (sphinx-compile)))) - -(defvar sphinx-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "M-'") 'sphinx-goto-ref) - (define-key map (kbd "C-c TAB") 'sphinx-insert-ref) - (define-key map (kbd "C-c C-x C-c") 'sphinx-compile) - (define-key map (kbd "C-c C-x C-v") 'sphinx-compile-and-view) - map) - "Sphinx-mode keymap.") - -;;;###autoload -(define-minor-mode sphinx-mode - "Sphinx minor mode." - :init-value nil - :lighter "sphinx " - :keymap 'sphinx-mode-map - ;; add native fontification support - (if sphinx-mode - (font-lock-add-keywords nil '((sphinx-fontify-code-block))) - (font-lock-remove-keywords nil '((sphinx-fontify-code-block))))) - -(provide 'sphinx-mode) -;;; sphinx-mode.el ends here diff --git a/elpa/sphinx-mode-20180620.915/sphinx-mode.elc b/elpa/sphinx-mode-20180620.915/sphinx-mode.elc deleted file mode 100644 index 7dcad0277aeb405acc4d229b94e938794c302b90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6046 zcmbtYZFAek5!OsPsU(k`q?x?fdFcwYBGL{R;J_D4P8vI|-KtG8j;!>Hp+q2Y5K)5w z1AwyF51sss_V4wV^x3@wCCW;sGnIxUaJW0%?LPZFyLbQb*N@&?TU*<_fB!x`DyFkE z)3My7IX#|6%y)>~6MsNPASw^LR!(nwRO?Wp*}+|Jt8ZJ1TWTD-WsdyVTBfeu5pWJn3{g^yR~5 za8;LSe&S}js%ESG$WejQbkk*tRXNAo)egOkD(u+Uj}kN+yITB@{>1gsRyj&ClGb9MgDS)y33}^*Dnu-IKDI&+K!` z(~O*F(wF2x*P%VrL&s?i`_bME9!Sr~u~RyiCrqNTZr;Zmc1Kw;e&I@UyIoUzFU=>q zOlu(OOvmmlt;Z8~mGgv0&MTmVZ7s%B%YrLKf?LS&;Y`qS1`fSerL$tx> zO7(BzBEUuO7B0l@TOZh~VCzF%4Z`HMRL10VyJA*jn!P;=!*=)1mtoimbNq*Gx{GUvYVt_Y zG=ksoHjXOt$@#$%_+&-#g5xZz8xR0=ctu{j1_#y$vTTatSdih?`mAW zhEFt`X^@23F|LlNPwm!i>e4U>I!BC<;gJ5MYhg0r6s*P2`0D#7PaYqD%=Qy|O&~NT zrjztk=Zrb3Cz_7O^Rm=f>1duLy4<-EMDB^MU7p+Jxoua*(I-ruMIL2jh67TwH-RQ~ zvt0j4+^85ue(#@rqesTG9{lccpd+ZgKI1KDGX|G2zXc#k&=W3#<52a7uWx+y7DMEX zwYwXk3WgmE4)b1kRy=WqgMWaBe-y96k$YiSxp!`}Klk!zs#iSf=0)RhjM51qxO0#GL{Sco(h1lBg_TTlm{&ge6utG|(h!_e+ z03|x_vxN|$h!2N@(&K>iH}IuG#~2oY$}yU=fkNl5HBni>>s2u?$JiAN1x$j+-ME;h zIW!Nzy?UPxlrQPd77isY5K^*H;B)S5sKe*g$jc>8WfpX0RFhLyH7G1N62G`QLKtGO zS%w)NtTRLOKV#STvaB|zEx2VsmpTHsA7B=8sO?Up8MSuW zSu`ER5w%NxKvD@ zAb|wmLFimZ^s@t)QtoYSCrR?~KMBnYS$(@~K@pk3i^cIy8DiWMKr!d{vG zB5VW!tq1<@E*;Es+L=Z#^bUf#Q3Dc!j*+^K>!Mr`7X=WC>8xgzE+sQGhOhwwRX@=6 zyv!*YRYf+hAuJIpfg(9i-J5EM+l<0n36P=&GaMFFX@~)18=Y2OP<={evr?MqY$nT% zsKRx2B}>?n;R406n0o{z_lBHSdeA5<>i9)MDFV;X3$}0G;*7Gt4v0G@qs(zXgtRH| zU<hzc->%^;C!#dJ0&G$1fS6nHsxaUGBL$2D^R#e0$2LXQp(V za_#y;FCZTl^runT%)$?aLoU_1J~4?amO>FfTl1I}f$B<&)VLR0OyVmo%+#_a)-QIX zTg{@f(ymz(f#uR%?&!H6^prmw4u(g~0+$Noytc92`vo<3UVHzwWxF*oq4C|zjZ3>j zd_kO2eDwTb4~GD)2fIFfixUxM!8EakBQYGx4V`la9CtUrx77w-Bd|QSuHcS4T)^Ti zB|qVc1fyW&l*e6dbE5=i5xwC6i)f2!no%}k;>rtUNmB;%i+H)pTdpz9QE_wom4qf+ zSgCLzMMkB2^ggJ`>wf|71UDeeU*bYZx--}i!uuQ38%uLQEU+Tx_-*oZ^xo!n&epli z=`Hhj-~+j=C_SgeK9|7C!2%f?28(@iPjCq^lvFTM8Cnrb` zZ1tVbr#SQ&yQfixejsMk{x65Ws-TB zpk!Y#Frws&0XH=mdA`Js+Z`SSR}ggf0Z|F&QuM#xXOK&@B|K_)9?(41b#VJU_jGlY0| zI~2`vxQ7L>rxr9qVp<_V?c(rM4spRKbqV~z+HyuBCTTWMbvs;B2sI4pufp}xb9IU4 zWbLwXnU*h^)i>lX;R(ZXrmj9%TmKxtfvJC_@pV&G9J0f+HFZJxybvdC=MXFRdLt`v3p{ diff --git a/elpa/sphinx-mode-20180620.915/sphinx-src.el b/elpa/sphinx-mode-20180620.915/sphinx-src.el deleted file mode 100644 index 379c23f8..00000000 --- a/elpa/sphinx-mode-20180620.915/sphinx-src.el +++ /dev/null @@ -1,90 +0,0 @@ -;;; sphinx-src.el --- Native code block support. - -;; Copyright (C) 2016 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Created: 11th September 2016 -;; Keywords: languages - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;;; Code: - -;; This is copy-pasted from org-src.el -(defcustom sphinx-src-lang-modes - '(("ocaml" . tuareg) ("elisp" . emacs-lisp) ("ditaa" . artist) - ("asymptote" . asy) ("dot" . fundamental) ("sqlite" . sql) - ("calc" . fundamental) ("C" . c) ("cpp" . c++) ("C++" . c++) - ("screen" . shell-script) ("shell" . sh) ("bash" . sh)) - "Alist mapping languages to their major mode. -The key is the language name, the value is the string that should -be inserted as the name of the major mode. For many languages this is -simple, but for language where this is not the case, this variable -provides a way to simplify things on the user side. -For example, there is no ocaml-mode in Emacs, but the mode to use is -`tuareg-mode'." - :group 'sphinx - :type '(repeat - (cons - (string "Language name") - (symbol "Major mode")))) - -;; This is copy-pasted from org-src.el -(defun sphinx-src--get-lang-mode (lang) - "Return major mode that should be used for LANG. -LANG is a string, and the returned major mode is a symbol." - (intern - (concat - (let ((l (or (cdr (assoc lang sphinx-src-lang-modes)) lang))) - (if (symbolp l) (symbol-name l) l)) - "-mode"))) - -;; This is copy-pasted from org-src.el -(defun sphinx-src-font-lock-fontify-block (lang start end) - "Fontify code block. - -LANG is the language used in the block. - -START and END specify the block position." - (let ((lang-mode (sphinx-src--get-lang-mode lang))) - (when (fboundp lang-mode) - (let ((string (buffer-substring-no-properties start end)) - (modified (buffer-modified-p)) - (org-buffer (current-buffer)) pos next) - (remove-text-properties start end '(face nil)) - (with-current-buffer - (get-buffer-create - (concat " org-src-fontification:" (symbol-name lang-mode))) - (delete-region (point-min) (point-max)) - (insert string " ") ;; so there's a final property change - (unless (eq major-mode lang-mode) (funcall lang-mode)) - ;; Avoid `font-lock-ensure', which does not display fonts in - ;; source block. - (font-lock-fontify-buffer) - (setq pos (point-min)) - (while (setq next (next-single-property-change pos 'face)) - (put-text-property - (+ start (1- pos)) (1- (+ start next)) 'face - (get-text-property pos 'face) org-buffer) - (setq pos next))) - (add-text-properties - start end - '(font-lock-fontified t fontified t font-lock-multiline t)) - (set-buffer-modified-p modified))))) - -(provide 'sphinx-src) -;;; sphinx-src.el ends here diff --git a/elpa/sphinx-mode-20180620.915/sphinx-src.elc b/elpa/sphinx-mode-20180620.915/sphinx-src.elc deleted file mode 100644 index 4c9fe073653ee065e7641d64a1285d988f486213..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2386 zcmbtW-*4MC5H|MIcxay1745q0qHKtbM20OV&MypGkak0Xt|*$kRRKmzl+BeURgp^S zVSoI-qio0Nx~B@T!u!Fy<98oVIeYQy;&H3hYM-5*(S@CrO3OS5%Fv6M$Q<3s$|-9o z8TFE2xmA8jLTj?6S2Oju@G!exI~cE~%29zRR6FS?pBph#8Ra%}zEWo5_F=7@Cz0ne zr&X50NiRA1PmJ6mhOwS9YrKGS?Th#r8WW#iUc7us*;G^_^C)pYq!%V9XDJhg#*(xZ z_mV7*;z){0D_N1B!Z8^(c>%!}JzT(-KJ9jU=hxx!h|aYFNHbBE0FAUTlUhswhPNnM zstTsREZ#Pkz4p~q(t9~4Ko8@}n}EIC52_oXYq_*Ho#4ZJa#LIDybZ9FakBF0iD;tm zX0k=tzLt#WH_j`}e3gg&ky^R7Q?pVd<+%1#z-?JK-A-jCmu{h>Txcd-s1KWOM5V-7 z%XV4W8eO41QIx@%gzT`B5~vVM8i}G?r{8W;$k&R!nP( z;{ZX8_z1+c|LJQ{$w~0u?fua1WVQ2l7Uwe4FvQCWY1fq~$2cbh8nWHJ(e!^_JXC6TvkbGSmCBp>lm^sLq$Pu47_bD+;kyz zX}7cUBeop$Pr7tEscc;?k)cyRFC`o*SxRuMgWKz%GX>^_@{ZVRK57J~XczOb9_-zZu z!_;g;NFKLR(}g^G!{Sjy?>Gp3o=X~Z#ZWW2i_T`$02GHC83npU*K|lt0|tZRqwaNs z)*&vZ@qAY@=KNUO>^+9t5)uZ1v+^iuV8cjd<iq3h!0W~9=cr9)&AnTAP-&gw zY5%`a6-Xa*)|gk=9EZ?L%+M0houtVd^hOW1p8%7i4aVfK1YU!FYQ9c^>|j78-U-9` z?E9@JTTi#XgFIyOaB#2#eZRu$5Wf+Ai1B9o18Zge5C7SOd(uyn(cr5fKHK;iNe+H# zZ4k>a4#Gk{!ZLY?*ARJ;?HjlabJUU?q~_senx-Z#()2QT43oo!>*kZ6LY(3e{FCP` zG&cbOP+f8qs!NB%{^rx|xC{HL-wb~t)XQ--LTUe9F$J zDRETd4-PZ#Zr$*3R%@@cGWhy*$=#iE4I@5jb9(+JG$9tlDol#duWLG5Ubutf6TWbr M#iwe0R&?9{0@(NP1ONa4 diff --git a/elpa/transient-20200226.1612/dir b/elpa/transient-20200226.1612/dir deleted file mode 100644 index 4d6ad7f3..00000000 --- a/elpa/transient-20200226.1612/dir +++ /dev/null @@ -1,18 +0,0 @@ -This is the file .../info/dir, which contains the -topmost node of the Info hierarchy, called (dir)Top. -The first time you invoke Info you start off looking at this node. - -File: dir, Node: Top This is the top of the INFO tree - - This (the Directory node) gives a menu of major topics. - Typing "q" exits, "H" lists all Info commands, "d" returns here, - "h" gives a primer for first-timers, - "mEmacs" visits the Emacs manual, etc. - - In Emacs, you can click mouse button 2 on a menu item or cross reference - to select it. - -* Menu: - -Emacs -* Transient: (transient). Transient Commands. diff --git a/elpa/transient-20200226.1612/transient-autoloads.el b/elpa/transient-20200226.1612/transient-autoloads.el deleted file mode 100644 index 3114fc1e..00000000 --- a/elpa/transient-20200226.1612/transient-autoloads.el +++ /dev/null @@ -1,26 +0,0 @@ -;;; transient-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "transient" "transient.el" (0 0 0 0)) -;;; Generated autoloads from transient.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "transient" '("transient-" "post-transient-hook" "current-transient-" "define-"))) - -;;;*** - -;;;### (autoloads nil nil ("transient-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; transient-autoloads.el ends here diff --git a/elpa/transient-20200226.1612/transient-pkg.el b/elpa/transient-20200226.1612/transient-pkg.el deleted file mode 100644 index e506c580..00000000 --- a/elpa/transient-20200226.1612/transient-pkg.el +++ /dev/null @@ -1,12 +0,0 @@ -(define-package "transient" "20200226.1612" "Transient commands" - '((emacs "25.1")) - :keywords - '("bindings") - :authors - '(("Jonas Bernoulli" . "jonas@bernoul.li")) - :maintainer - '("Jonas Bernoulli" . "jonas@bernoul.li") - :url "https://github.com/magit/transient") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/transient-20200226.1612/transient.el b/elpa/transient-20200226.1612/transient.el deleted file mode 100644 index 4c7367d2..00000000 --- a/elpa/transient-20200226.1612/transient.el +++ /dev/null @@ -1,3198 +0,0 @@ -;;; transient.el --- Transient commands -*- lexical-binding: t; -*- - -;; Copyright (C) 2018-2020 Jonas Bernoulli - -;; Author: Jonas Bernoulli -;; Homepage: https://github.com/magit/transient -;; Package-Requires: ((emacs "25.1")) -;; Keywords: bindings - -;; This file is not part of GNU Emacs. - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published -;; by the Free Software Foundation; either version 3 of the License, -;; or (at your option) any later version. - -;; This file is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; For a full copy of the GNU GPL see http://www.gnu.org/licenses. - -;;; Commentary: - -;; Taking inspiration from prefix keys and prefix arguments, Transient -;; implements a similar abstraction involving a prefix command, infix -;; arguments and suffix commands. We could call this abstraction a -;; "transient command", but because it always involves at least two -;; commands (a prefix and a suffix) we prefer to call it just a -;; "transient". - -;; When the user calls a transient prefix command, then a transient -;; (temporary) keymap is activated, which binds the transient's infix -;; and suffix commands, and functions that control the transient state -;; are added to `pre-command-hook' and `post-command-hook'. The -;; available suffix and infix commands and their state are shown in -;; the echo area until the transient is exited by invoking a suffix -;; command. - -;; Calling an infix command causes its value to be changed, possibly -;; by reading a new value in the minibuffer. - -;; Calling a suffix command usually causes the transient to be exited -;; but suffix commands can also be configured to not exit the -;; transient state. - -;;; Code: - -(require 'cl-lib) -(require 'eieio) -(require 'format-spec) -(require 'seq) - -(eval-when-compile - (require 'subr-x)) - -(declare-function info 'info) -(declare-function Man-find-section 'man) -(declare-function Man-next-section 'man) -(declare-function Man-getpage-in-background 'man) - -(defvar Man-notify-method) - -;;; Options - -(defgroup transient nil - "Transient commands." - :group 'extensions) - -(defcustom transient-show-popup t - "Whether to show the current transient in a popup buffer. - -- If t, then show the popup as soon as a transient prefix command - is invoked. - -- If nil, then do not show the popup unless the user explicitly - requests it, by pressing an incomplete prefix key sequence. - -- If a number, then delay displaying the popup and instead show - a brief one-line summary. If zero or negative, then suppress - even showing that summary and display the pressed key only. - - Show the popup when the user explicitly requests it by pressing - an incomplete prefix key sequence. Unless zero, then also show - the popup after that many seconds of inactivity (using the - absolute value)." - :package-version '(transient . "0.1.0") - :group 'transient - :type '(choice (const :tag "instantly" t) - (const :tag "on demand" nil) - (const :tag "on demand (no summary)" 0) - (number :tag "after delay" 1))) - -(defcustom transient-enable-popup-navigation nil - "Whether navigation commands are enabled in the transient popup. - -While a transient is active the transient popup buffer is not the -current buffer, making it necessary to use dedicated commands to -act on that buffer itself. If this non-nil, then the following -features are available: - -- \"\" moves the cursor to the previous suffix. - \"\" moves the cursor to the next suffix. - \"RET\" invokes the suffix the cursor is on. -- \"\" invokes the clicked on suffix. -- \"C-s\" and \"C-r\" start isearch in the popup buffer." - :package-version '(transient . "0.2.0") - :group 'transient - :type 'boolean) - -(defcustom transient-display-buffer-action - '(display-buffer-in-side-window (side . bottom)) - "The action used to display the transient popup buffer. - -The transient popup buffer is displayed in a window using - - \(display-buffer buf transient-display-buffer-action) - -The value of this option has the form (FUNCTION . ALIST), -where FUNCTION is a function or a list of functions. Each such -function should accept two arguments: a buffer to display and -an alist of the same form as ALIST. See `display-buffer' for -details. - -The default is (display-buffer-in-side-window (side . bottom)). -This displays the window at the bottom of the selected frame. -Another useful value is (display-buffer-below-selected). This -is what `magit-popup' used by default. For more alternatives -see info node `(elisp)Display Action Functions'. - -It may be possible to display the window in another frame, but -whether that works in practice depends on the window-manager. -If the window manager selects the new window (Emacs frame), -then it doesn't work. - -If you change the value of this option, then you might also -want to change the value of `transient-mode-line-format'." - :package-version '(transient . "0.2.0") - :group 'transient - :type '(cons (choice function (repeat :tag "Functions" function)) - alist)) - -(defcustom transient-mode-line-format 'line - "The mode-line format for the transient popup buffer. - -If nil, then the buffer has no mode-line. If the buffer is not -displayed right above the echo area, then this probably is not -a good value. - -If `line' (the default), then the buffer also has no mode-line, -but a thin line is drawn instead, using the background color of -the face `transient-separator'. Termcap frames cannot display -thin lines and therefore fallback to treating `line' like nil. - -Otherwise this can be any mode-line format. -See `mode-line-format' for details." - :package-version '(transient . "0.2.0") - :group 'transient - :type '(choice (const :tag "hide mode-line" nil) - (const :tag "substitute thin line" line) - (const :tag "name of prefix command" - ("%e" mode-line-front-space - mode-line-buffer-identification)) - (sexp :tag "custom mode-line format"))) - -(defcustom transient-show-common-commands nil - "Whether to show common transient suffixes in the popup buffer. - -These commands are always shown after typing the prefix key -\"C-x\" when a transient command is active. To toggle the value -of this variable use \"C-x t\" when a transient is active." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'boolean) - -(defcustom transient-read-with-initial-input nil - "Whether to use the last history element as initial minibuffer input." - :package-version '(transient . "0.2.0") - :group 'transient - :type 'boolean) - -(defcustom transient-highlight-mismatched-keys nil - "Whether to highlight keys that do not match their argument. - -This only affects infix arguments that represent command-line -arguments. When this option is non-nil, then the key binding -for infix argument are highlighted when only a long argument -\(e.g. \"--verbose\") is specified but no shor-thand (e.g \"-v\"). -In the rare case that a short-hand is specified but does not -match the key binding, then it is highlighed differently. - -The highlighting is done using using `transient-mismatched-key' -and `transient-nonstandard-key'." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'boolean) - -(defcustom transient-substitute-key-function nil - "Function used to modify key bindings. - -This function is called with one argument, the prefix object, -and must return a key binding description, either the existing -key description it finds in the `key' slot, or a substitution. - -This is intended to let users replace certain prefix keys. It -could also be used to make other substitutions, but that is -discouraged. - -For example, \"=\" is hard to reach using my custom keyboard -layout, so I substitute \"(\" for that, which is easy to reach -using a layout optimized for lisp. - - (setq transient-substitute-key-function - (lambda (obj) - (let ((key (oref obj key))) - (if (string-match \"\\\\`\\\\(=\\\\)[a-zA-Z]\" key) - (replace-match \"(\" t t key 1) - key)))))" - :package-version '(transient . "0.1.0") - :group 'transient - :type '(choice (const :tag "Transform no keys (nil)" nil) function)) - -(defcustom transient-detect-key-conflicts nil - "Whether to detect key binding conflicts. - -Conflicts are detected when a transient prefix command is invoked -and results in an error, which prevents the transient from being -used." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'boolean) - -(defcustom transient-force-fixed-pitch nil - "Whether to force used of monospaced font in popup buffer. - -Even if you use a proportional font for the `default' face, -you might still want to use a monospaced font in transient's -popup buffer. Setting this option to t causes `default' to -be remapped to `fixed-pitch' in that buffer." - :package-version '(transient . "0.2.0") - :group 'transient - :type 'boolean) - -(defcustom transient-default-level 4 - "Control what suffix levels are made available by default. - -Each suffix command is placed on a level and each prefix command -has a level, which controls which suffix commands are available. -Integers between 1 and 7 (inclusive) are valid levels. - -The levels of individual transients and/or their individual -suffixes can be changed individually, by invoking the prefix and -then pressing \"C-x l\". - -The default level for both transients and their suffixes is 4. -This option only controls the default for transients. The default -suffix level is always 4. The author of a transient should place -certain suffixes on a higher level if they expect that it won't be -of use to most users, and they should place very important suffixes -on a lower level so that they remain available even if the user -lowers the transient level. - -\(Magit currently places nearly all suffixes on level 4 and lower -levels are not used at all yet. So for the time being you should -not set a lower level here and using a higher level might not -give you as many additional suffixes as you hoped.)" - :package-version '(transient . "0.1.0") - :group 'transient - :type '(choice (const :tag "1 - fewest suffixes" 1) - (const 2) - (const 3) - (const :tag "4 - default" 4) - (const 5) - (const 6) - (const :tag "7 - most suffixes" 7))) - -(defcustom transient-levels-file - (locate-user-emacs-file (convert-standard-filename "transient/levels.el")) - "File used to save levels of transients and their suffixes." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'file) - -(defcustom transient-values-file - (locate-user-emacs-file (convert-standard-filename "transient/values.el")) - "File used to save values of transients." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'file) - -(defcustom transient-history-file - (locate-user-emacs-file (convert-standard-filename "transient/history.el")) - "File used to save history of transients and their infixes." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'file) - -(defcustom transient-history-limit 10 - "Number of history elements to keep when saving to file." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'integer) - -(defcustom transient-save-history t - "Whether to save history of transient commands when exiting Emacs." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'boolean) - -;;; Faces - -(defgroup transient-faces nil - "Faces used by Transient." - :group 'transient) - -(defface transient-heading '((t :inherit font-lock-keyword-face)) - "Face used for headings." - :group 'transient-faces) - -(defface transient-key '((t :inherit font-lock-builtin-face)) - "Face used for keys." - :group 'transient-faces) - -(defface transient-argument '((t :inherit font-lock-warning-face)) - "Face used for enabled arguments." - :group 'transient-faces) - -(defface transient-value '((t :inherit font-lock-string-face)) - "Face used for values." - :group 'transient-faces) - -(defface transient-inactive-argument '((t :inherit shadow)) - "Face used for inactive arguments." - :group 'transient-faces) - -(defface transient-inactive-value '((t :inherit shadow)) - "Face used for inactive values." - :group 'transient-faces) - -(defface transient-unreachable '((t :inherit shadow)) - "Face used for suffixes unreachable from the current prefix sequence." - :group 'transient-faces) - -(defface transient-active-infix '((t :inherit secondary-selection)) - "Face used for the infix for which the value is being read." - :group 'transient-faces) - -(defface transient-unreachable-key '((t :inherit shadow)) - "Face used for keys unreachable from the current prefix sequence." - :group 'transient-faces) - -(defface transient-nonstandard-key '((t :underline t)) - "Face optionally used to highlight keys conflicting with short-argument. -Also see option `transient-highlight-mismatched-keys'." - :group 'transient-faces) - -(defface transient-mismatched-key '((t :underline t)) - "Face optionally used to highlight keys without a short-argument. -Also see option `transient-highlight-mismatched-keys'." - :group 'transient-faces) - -(defface transient-enabled-suffix - '((t :background "green" :foreground "black" :weight bold)) - "Face used for enabled levels while editing suffix levels. -See info node `(transient)Enabling and Disabling Suffixes'." - :group 'transient-faces) - -(defface transient-disabled-suffix - '((t :background "red" :foreground "black" :weight bold)) - "Face used for disabled levels while editing suffix levels. -See info node `(transient)Enabling and Disabling Suffixes'." - :group 'transient-faces) - -(defface transient-separator - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey80") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey30")) - "Face used to draw line below transient popup window. -This is only used if `transient-mode-line-format' is `line'. -Only the background color is significant." - :group 'transient-faces) - -;;; Persistence - -(defun transient--read-file-contents (file) - (with-demoted-errors "Transient error: %S" - (and (file-exists-p file) - (with-temp-buffer - (insert-file-contents file) - (read (current-buffer)))))) - -(defun transient--pp-to-file (object file) - (make-directory (file-name-directory file) t) - (setq object (cl-sort object #'string< :key #'car)) - (with-temp-file file - (let ((print-level nil) - (print-length nil)) - (pp object (current-buffer))))) - -(defvar transient-values - (transient--read-file-contents transient-values-file) - "Values of transient commands. -The value of this variable persists between Emacs sessions -and you usually should not change it manually.") - -(defun transient-save-values () - (transient--pp-to-file transient-values transient-values-file)) - -(defvar transient-levels - (transient--read-file-contents transient-levels-file) - "Levels of transient commands. -The value of this variable persists between Emacs sessions -and you usually should not change it manually.") - -(defun transient-save-levels () - (transient--pp-to-file transient-levels transient-levels-file)) - -(defvar transient-history - (transient--read-file-contents transient-history-file) - "History of transient commands and infix arguments. -The value of this variable persists between Emacs sessions -\(unless `transient-save-history' is nil) and you usually -should not change it manually.") - -(defun transient-save-history () - (setq transient-history - (cl-sort (mapcar (pcase-lambda (`(,key . ,val)) - (cons key (seq-take (delete-dups val) - transient-history-limit))) - transient-history) - #'string< :key #'car)) - (transient--pp-to-file transient-history transient-history-file)) - -(defun transient-maybe-save-history () - "Save the value of `transient-history'. -If `transient-save-history' is nil, then do nothing." - (when transient-save-history - (transient-save-history))) - -(unless noninteractive - (add-hook 'kill-emacs-hook 'transient-maybe-save-history)) - -;;; Classes -;;;; Prefix - -(defclass transient-prefix () - ((prototype :initarg :prototype) - (command :initarg :command) - (level :initarg :level) - (variable :initarg :variable :initform nil) - (value) (default-value :initarg :value) - (scope :initarg :scope :initform nil) - (history :initarg :history :initform nil) - (history-pos :initarg :history-pos :initform 0) - (history-key :initarg :history-key :initform nil) - (man-page :initarg :man-page :initform nil) - (info-manual :initarg :info-manual :initform nil) - (transient-suffix :initarg :transient-suffix :initform nil) - (transient-non-suffix :initarg :transient-non-suffix :initform nil) - (incompatible :initarg :incompatible :initform nil)) - "Transient prefix command. - -Each transient prefix command consists of a command, which is -stored in a symbol's function slot and an object, which is -stored in the `transient--prefix' property of the same symbol. - -When a transient prefix command is invoked, then a clone of that -object is stored in the global variable `transient--prefix' and -the prototype is stored in the clone's `prototype' slot.") - -;;;; Suffix - -(defclass transient-child () - ((level - :initarg :level - :initform 1 - :documentation "Enable if level of prefix is equal or greater.") - (if - :initarg :if - :initform nil - :documentation "Enable if predicate returns non-nil.") - (if-not - :initarg :if-not - :initform nil - :documentation "Enable if predicate returns nil.") - (if-non-nil - :initarg :if-non-nil - :initform nil - :documentation "Enable if variable's value is non-nil.") - (if-nil - :initarg :if-nil - :initform nil - :documentation "Enable if variable's value is nil.") - (if-mode - :initarg :if-mode - :initform nil - :documentation "Enable if major-mode matches value.") - (if-not-mode - :initarg :if-not-mode - :initform nil - :documentation "Enable if major-mode does not match value.") - (if-derived - :initarg :if-derived - :initform nil - :documentation "Enable if major-mode derives from value.") - (if-not-derived - :initarg :if-not-derived - :initform nil - :documentation "Enable if major-mode does not derive from value.")) - "Abstract superclass for group and and suffix classes. - -It is undefined what happens if more than one `if*' predicate -slot is non-nil." - :abstract t) - -(defclass transient-suffix (transient-child) - ((key :initarg :key) - (command :initarg :command) - (transient :initarg :transient) - (format :initarg :format :initform " %k %d") - (description :initarg :description :initform nil)) - "Superclass for suffix command.") - -(defclass transient-infix (transient-suffix) - ((transient :initform t) - (argument :initarg :argument) - (shortarg :initarg :shortarg) - (value :initform nil) - (multi-value :initarg :multi-value :initform nil) - (allow-empty :initarg :allow-empty :initform nil) - (history-key :initarg :history-key :initform nil) - (reader :initarg :reader :initform nil) - (prompt :initarg :prompt :initform nil) - (choices :initarg :choices :initform nil) - (format :initform " %k %d (%v)")) - "Transient infix command." - :abstract t) - -(defclass transient-argument (transient-infix) () - "Abstract superclass for infix arguments." - :abstract t) - -(defclass transient-switch (transient-argument) () - "Class used for command-line argument that can be turned on and off.") - -(defclass transient-option (transient-argument) () - "Class used for command-line argument that can take a value.") - -(defclass transient-variable (transient-infix) - ((variable :initarg :variable) - (format :initform " %k %d %v")) - "Abstract superclass for infix commands that set a variable." - :abstract t) - -(defclass transient-switches (transient-argument) - ((argument-format :initarg :argument-format) - (argument-regexp :initarg :argument-regexp)) - "Class used for sets of mutually exclusive command-line switches.") - -(defclass transient-files (transient-infix) () - "Class used for the \"--\" argument. -All remaining arguments are treated as files. -They become the value of this this argument.") - -;;;; Group - -(defclass transient-group (transient-child) - ((suffixes :initarg :suffixes :initform nil) - (hide :initarg :hide :initform nil) - (description :initarg :description :initform nil)) - "Abstract superclass of all group classes." - :abstract t) - -(defclass transient-column (transient-group) () - "Group class that displays each element on a separate line.") - -(defclass transient-row (transient-group) () - "Group class that displays all elements on a single line.") - -(defclass transient-columns (transient-group) () - "Group class that displays elements organized in columns. -Direct elements have to be groups whose elements have to be -commands or string. Each subgroup represents a column. This -class takes care of inserting the subgroups' elements.") - -(defclass transient-subgroups (transient-group) () - "Group class that wraps other groups. - -Direct elements have to be groups whose elements have to be -commands or strings. This group inserts an empty line between -subgroups. The subgroups are responsible for displaying their -elements themselves.") - -;;; Define - -(defmacro define-transient-command (name arglist &rest args) - "Define NAME as a transient prefix command. - -ARGLIST are the arguments that command takes. -DOCSTRING is the documentation string and is optional. - -These arguments can optionally be followed by key-value pairs. -Each key has to be a keyword symbol, either `:class' or a keyword -argument supported by the constructor of that class. The -`transient-prefix' class is used if the class is not specified -explicitly. - -GROUPs add key bindings for infix and suffix commands and specify -how these bindings are presented in the popup buffer. At least -one GROUP has to be specified. See info node `(transient)Binding -Suffix and Infix Commands'. - -The BODY is optional. If it is omitted, then ARGLIST is also -ignored and the function definition becomes: - - (lambda () - (interactive) - (transient-setup \\='NAME)) - -If BODY is specified, then it must begin with an `interactive' -form that matches ARGLIST, and it must call `transient-setup'. -It may however call that function only when some condition is -satisfied; that is one of the reason why you might want to use -an explicit BODY. - -All transients have a (possibly nil) value, which is exported -when suffix commands are called, so that they can consume that -value. For some transients it might be necessary to have a sort -of secondary value, called a scope. Such a scope would usually -be set in the commands `interactive' form and has to be passed -to the setup function: - - (transient-setup \\='NAME nil nil :scope SCOPE) - -\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... GROUP... [BODY...])" - (declare (debug (&define name lambda-list - [&optional lambda-doc] - [&rest keywordp sexp] - [&rest vectorp] - [&optional ("interactive" interactive) def-body])) - (doc-string 3)) - (pcase-let ((`(,class ,slots ,suffixes ,docstr ,body) - (transient--expand-define-args args))) - `(progn - (defalias ',name - ,(if body - `(lambda ,arglist ,@body) - `(lambda () - (interactive) - (transient-setup ',name)))) - (put ',name 'interactive-only t) - (put ',name 'function-documentation ,docstr) - (put ',name 'transient--prefix - (,(or class 'transient-prefix) :command ',name ,@slots)) - (put ',name 'transient--layout - ',(cl-mapcan (lambda (s) (transient--parse-child name s)) - suffixes))))) - -(defmacro define-suffix-command (name arglist &rest args) - "Define NAME as a transient suffix command. - -ARGLIST are the arguments that the command takes. -DOCSTRING is the documentation string and is optional. - -These arguments can optionally be followed by key-value pairs. -Each key has to be a keyword symbol, either `:class' or a -keyword argument supported by the constructor of that class. -The `transient-suffix' class is used if the class is not -specified explicitly. - -The BODY must begin with an `interactive' form that matches -ARGLIST. The infix arguments are usually accessed by using -`transient-args' inside `interactive'. - -\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... BODY...)" - (declare (debug (&define name lambda-list - [&optional lambda-doc] - [&rest keywordp sexp] - ("interactive" interactive) - def-body)) - (doc-string 3)) - (pcase-let ((`(,class ,slots ,_ ,docstr ,body) - (transient--expand-define-args args))) - `(progn - (defalias ',name (lambda ,arglist ,@body)) - (put ',name 'interactive-only t) - (put ',name 'function-documentation ,docstr) - (put ',name 'transient--suffix - (,(or class 'transient-suffix) :command ',name ,@slots))))) - -(defmacro define-infix-command (name _arglist &rest args) - "Define NAME as a transient infix command. - -ARGLIST is always ignored and reserved for future use. -DOCSTRING is the documentation string and is optional. - -The key-value pairs are mandatory. All transient infix commands -are equal to each other (but not eq), so it is meaningless to -define an infix command without also setting at least `:class' -and one other keyword (which it is depends on the used class, -usually `:argument' or `:variable'). - -Each key has to be a keyword symbol, either `:class' or a keyword -argument supported by the constructor of that class. The -`transient-switch' class is used if the class is not specified -explicitly. - -The function definitions is always: - - (lambda () - (interactive) - (let ((obj (transient-suffix-object))) - (transient-infix-set obj (transient-infix-read obj))) - (transient--show)) - -`transient-infix-read' and `transient-infix-set' are generic -functions. Different infix commands behave differently because -the concrete methods are different for different infix command -classes. In rare case the above command function might not be -suitable, even if you define your own infix command class. In -that case you have to use `transient-suffix-command' to define -the infix command and use t as the value of the `:transient' -keyword. - -\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]...)" - (declare (debug (&define name lambda-list - [&optional lambda-doc] - [&rest keywordp sexp])) - (doc-string 3)) - (pcase-let ((`(,class ,slots ,_ ,docstr ,_) - (transient--expand-define-args args))) - `(progn - (defalias ',name ,(transient--default-infix-command)) - (put ',name 'interactive-only t) - (put ',name 'function-documentation ,docstr) - (put ',name 'transient--suffix - (,(or class 'transient-switch) :command ',name ,@slots))))) - -(defalias 'define-infix-argument 'define-infix-command - "Define NAME as a transient infix command. - -Only use this alias to define an infix command that actually -sets an infix argument. To define a infix command that, for -example, sets a variable use `define-infix-command' instead. - -\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]...)") - -(defun transient--expand-define-args (args) - (let (class keys suffixes docstr) - (when (stringp (car args)) - (setq docstr (pop args))) - (while (keywordp (car args)) - (let ((k (pop args)) - (v (pop args))) - (if (eq k :class) - (setq class v) - (push k keys) - (push v keys)))) - (while (vectorp (car args)) - (push (pop args) suffixes)) - (list (if (eq (car-safe class) 'quote) - (cadr class) - class) - (nreverse keys) - (nreverse suffixes) - docstr - args))) - -(defun transient--parse-child (prefix spec) - (cl-etypecase spec - (vector (when-let ((c (transient--parse-group prefix spec))) (list c))) - (list (when-let ((c (transient--parse-suffix prefix spec))) (list c))) - (string (list spec)))) - -(defun transient--parse-group (prefix spec) - (setq spec (append spec nil)) - (cl-symbol-macrolet - ((car (car spec)) - (pop (pop spec))) - (let (level class args) - (when (integerp car) - (setq level pop)) - (when (stringp car) - (setq args (plist-put args :description pop))) - (while (keywordp car) - (let ((k pop)) - (if (eq k :class) - (setq class pop) - (setq args (plist-put args k pop))))) - (vector (or level (oref-default 'transient-child level)) - (or class - (if (vectorp car) - 'transient-columns - 'transient-column)) - args - (cl-mapcan (lambda (s) (transient--parse-child prefix s)) spec))))) - -(defun transient--parse-suffix (prefix spec) - (let (level class args) - (cl-symbol-macrolet - ((car (car spec)) - (pop (pop spec))) - (when (integerp car) - (setq level pop)) - (when (or (stringp car) - (vectorp car)) - (setq args (plist-put args :key pop))) - (when (or (stringp car) - (eq (car-safe car) 'lambda) - (and (symbolp car) - (not (commandp car)) - (commandp (cadr spec)))) - (setq args (plist-put args :description pop))) - (cond - ((keywordp car) - (error "Need command, got %S" car)) - ((symbolp car) - (setq args (plist-put args :command pop))) - ((or (stringp car) - (and car (listp car))) - (let ((arg pop)) - (cl-typecase arg - (list - (setq args (plist-put args :shortarg (car arg))) - (setq args (plist-put args :argument (cadr arg))) - (setq arg (cadr arg))) - (string - (when-let ((shortarg (transient--derive-shortarg arg))) - (setq args (plist-put args :shortarg shortarg))) - (setq args (plist-put args :argument arg)))) - (setq args (plist-put args :command - (intern (format "transient:%s:%s" - prefix arg)))) - (cond ((and car (not (keywordp car))) - (setq class 'transient-option) - (setq args (plist-put args :reader pop))) - ((not (string-suffix-p "=" arg)) - (setq class 'transient-switch)) - (t - (setq class 'transient-option) - (setq args (plist-put args :reader 'read-string)))))) - (t - (error "Needed command or argument, got %S" car))) - (while (keywordp car) - (let ((k pop)) - (cl-case k - (:class (setq class pop)) - (:level (setq level pop)) - (t (setq args (plist-put args k pop))))))) - (unless (plist-get args :key) - (when-let ((shortarg (plist-get args :shortarg))) - (setq args (plist-put args :key shortarg)))) - (list (or level (oref-default 'transient-child level)) - (or class 'transient-suffix) - args))) - -(defun transient--default-infix-command () - (cons 'lambda - '(() - (interactive) - (let ((obj (transient-suffix-object))) - (transient-infix-set obj (transient-infix-read obj))) - (transient--show)))) - -(defun transient--ensure-infix-command (obj) - (let ((cmd (oref obj command))) - (unless (or (commandp cmd) - (get cmd 'transient--infix-command)) - (if (or (cl-typep obj 'transient-switch) - (cl-typep obj 'transient-option)) - (put cmd 'transient--infix-command - (transient--default-infix-command)) - ;; This is not an anonymous infix argument. - (error "Suffix %s is not defined or autoloaded as a command" cmd))))) - -(defun transient--derive-shortarg (arg) - (save-match-data - (and (string-match "\\`\\(-[a-zA-Z]\\)\\(\\'\\|=\\)" arg) - (match-string 1 arg)))) - -;;; Edit - -(defun transient--insert-suffix (prefix loc suffix action) - (let* ((suf (cl-etypecase suffix - (vector (transient--parse-group prefix suffix)) - (list (transient--parse-suffix prefix suffix)) - (string suffix))) - (mem (transient--layout-member loc prefix)) - (elt (car mem))) - (cond - ((not mem) - (message "Cannot insert %S into %s; %s not found" - suffix prefix loc)) - ((or (and (vectorp suffix) (not (vectorp elt))) - (and (listp suffix) (vectorp elt)) - (and (stringp suffix) (vectorp elt))) - (message "Cannot place %S into %s at %s; %s" - suffix prefix loc - "suffixes and groups cannot be siblings")) - (t - (when (and (listp suffix) - (listp elt)) - (let ((key (transient--spec-key suf))) - (if (equal (transient--kbd key) - (transient--kbd (transient--spec-key elt))) - (setq action 'replace) - (transient-remove-suffix prefix key)))) - (cl-ecase action - (insert (setcdr mem (cons elt (cdr mem))) - (setcar mem suf)) - (append (setcdr mem (cons suf (cdr mem)))) - (replace (setcar mem suf))))))) - -(defun transient-insert-suffix (prefix loc suffix) - "Insert a SUFFIX into PREFIX before LOC. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `define-transient-command'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (declare (indent defun)) - (transient--insert-suffix prefix loc suffix 'insert)) - -(defun transient-append-suffix (prefix loc suffix) - "Insert a SUFFIX into PREFIX after LOC. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `define-transient-command'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (declare (indent defun)) - (transient--insert-suffix prefix loc suffix 'append)) - -(defun transient-replace-suffix (prefix loc suffix) - "Replace the suffix at LOC in PREFIX with SUFFIX. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `define-transient-command'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (declare (indent defun)) - (transient--insert-suffix prefix loc suffix 'replace)) - -(defun transient-remove-suffix (prefix loc) - "Remove the suffix or group at LOC in PREFIX. -PREFIX is a prefix command, a symbol. -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (declare (indent defun)) - (transient--layout-member loc prefix 'remove)) - -(defun transient-get-suffix (prefix loc) - "Return the suffix or group at LOC in PREFIX. -PREFIX is a prefix command, a symbol. -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (if-let ((mem (transient--layout-member loc prefix))) - (car mem) - (error "%s not found in %s" loc prefix))) - -(defun transient-suffix-put (prefix loc prop value) - "Edit the suffix at LOC in PREFIX, setting PROP to VALUE. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `define-transient-command'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (let ((suf (transient-get-suffix prefix loc))) - (setf (elt suf 2) - (plist-put (elt suf 2) prop value)))) - -(defun transient--layout-member (loc prefix &optional remove) - (let ((val (or (get prefix 'transient--layout) - (error "%s is not a transient command" prefix)))) - (when (listp loc) - (while (integerp (car loc)) - (let* ((children (if (vectorp val) (aref val 3) val)) - (mem (transient--nthcdr (pop loc) children))) - (if (and remove (not loc)) - (let ((rest (delq (car mem) children))) - (if (vectorp val) - (aset val 3 rest) - (put prefix 'transient--layout rest)) - (setq val nil)) - (setq val (if loc (car mem) mem))))) - (setq loc (car loc))) - (if loc - (transient--layout-member-1 (transient--kbd loc) val remove) - val))) - -(defun transient--layout-member-1 (loc layout remove) - (cond ((listp layout) - (seq-some (lambda (elt) (transient--layout-member-1 loc elt remove)) - layout)) - ((vectorp (car (aref layout 3))) - (seq-some (lambda (elt) (transient--layout-member-1 loc elt remove)) - (aref layout 3))) - (remove - (aset layout 3 - (delq (car (transient--group-member loc layout)) - (aref layout 3))) - nil) - (t (transient--group-member loc layout)))) - -(defun transient--group-member (loc group) - (cl-member-if (lambda (suffix) - (and (listp suffix) - (let* ((def (nth 2 suffix)) - (cmd (plist-get def :command))) - (if (symbolp loc) - (eq cmd loc) - (equal (transient--kbd - (or (plist-get def :key) - (transient--command-key cmd))) - loc))))) - (aref group 3))) - -(defun transient--kbd (keys) - (when (vectorp keys) - (setq keys (key-description keys))) - (when (stringp keys) - (setq keys (kbd keys))) - keys) - -(defun transient--spec-key (spec) - (let ((plist (nth 2 spec))) - (or (plist-get plist :key) - (transient--command-key - (plist-get plist :command))))) - -(defun transient--command-key (cmd) - (when-let ((obj (get cmd 'transient--suffix))) - (cond ((slot-boundp obj 'key) - (oref obj key)) - ((slot-exists-p obj 'shortarg) - (if (slot-boundp obj 'shortarg) - (oref obj shortarg) - (transient--derive-shortarg (oref obj argument))))))) - -(defun transient--nthcdr (n list) - (nthcdr (if (< n 0) (- (length list) (abs n)) n) list)) - -;;; Variables - -(defvar current-transient-prefix nil - "The transient from which this suffix command was invoked. -This is an object representing that transient, use -`current-transient-command' to get the respective command.") - -(defvar current-transient-command nil - "The transient from which this suffix command was invoked. -This is a symbol representing that transient, use -`current-transient-object' to get the respective object.") - -(defvar current-transient-suffixes nil - "The suffixes of the transient from which this suffix command was invoked. -This is a list of objects. Usually it is sufficient to instead -use the function `transient-args', which returns a list of -values. In complex cases it might be necessary to use this -variable instead.") - -(defvar post-transient-hook nil - "Hook run after exiting a transient.") - -(defvar transient--prefix nil) -(defvar transient--layout nil) -(defvar transient--suffixes nil) - -(defconst transient--stay t "Do not exit the transient.") -(defconst transient--exit nil "Do exit the transient.") - -(defvar transient--exitp nil "Whether to exit the transient.") -(defvar transient--showp nil "Whether the transient is show in a popup buffer.") -(defvar transient--helpp nil "Whether help-mode is active.") -(defvar transient--editp nil "Whether edit-mode is active.") - -(defvar transient--active-infix nil "The active infix awaiting user input.") - -(defvar transient--timer nil) - -(defvar transient--stack nil) - -(defvar transient--buffer-name " *transient*" - "Name of the transient buffer.") - -(defvar transient--window nil - "The window used to display the transient popup.") - -(defvar transient--original-window nil - "The window that was selected before the transient was invoked. -Usually it remains selected while the transient is active.") - -(define-obsolete-variable-alias 'transient--source-buffer - 'transient--original-buffer "Transient 0.2.0") - -(defvar transient--original-buffer nil - "The buffer that was current before the transient was invoked. -Usually it remains current while the transient is active.") - -(defvar transient--debug nil "Whether put debug information into *Messages*.") - -(defvar transient--history nil) - -;;; Identities - -(defun transient-suffix-object (&optional command) - "Return the object associated with the current suffix command. - -Each suffix commands is associated with an object, which holds -additional information about the suffix, such as its value (in -the case of an infix command, which is a kind of suffix command). - -This function is intended to be called by infix commands, whose -command definition usually (at least when defined using -`define-infix-command') is this: - - (lambda () - (interactive) - (let ((obj (transient-suffix-object))) - (transient-infix-set obj (transient-infix-read obj))) - (transient--show)) - -\(User input is read outside of `interactive' to prevent the -command from being added to `command-history'. See #23.) - -Such commands need to be able to access their associated object -to guide how `transient-infix-read' reads the new value and to -store the read value. Other suffix commands (including non-infix -commands) may also need the object to guide their behavior. - -This function attempts to return the object associated with the -current suffix command even if the suffix command was not invoked -from a transient. (For some suffix command that is a valid thing -to do, for others it is not.) In that case nil may be returned -if the command was not defined using one of the macros intended -to define such commands. - -The optional argument COMMAND is intended for internal use. If -you are contemplating using it in your own code, then you should -probably use this instead: - - (get COMMAND 'transient--suffix)" - (if transient--prefix - (cl-find-if (lambda (obj) - (eq (transient--suffix-command obj) - (or command this-original-command))) - transient--suffixes) - (when-let ((obj (get (or command this-command) 'transient--suffix)) - (obj (clone obj))) - (transient-init-scope obj) - (transient-init-value obj) - obj))) - -(defun transient--suffix-command (arg) - "Return the command specified by ARG. - -Given a suffix specified by ARG, this function returns the -respective command or a symbol that represents it. It could -therefore be considered the inverse of `transient-suffix-object'. - -Unlike that function it is only intended for internal use though, -and it is more complicated to describe because of some internal -tricks it has to account for. You do not actually have to know -any of this. - -ARG can be a `transient-suffix' object, a symbol representing a -command, or a command (which can be either a fbound symbol or a -lambda expression). - -If it is an object, then the value of its `command' slot is used -as follows. If ARG satisfies `commandp', then that is returned. -Otherwise it is assumed to be a symbol that merely represents the -command. In that case the lambda expression that is stored in -the symbols `transient--infix-command' property is returned. - -Therefore, if ARG is an object, then this function always returns -something that is callable as a command. - -ARG can also be something that is callable as a function. If it -is a symbol, then that is returned. Otherwise it is a lambda -expression and a symbol that merely representing that command is -returned. - -Therefore, if ARG is something that is callable as a command, -then this function always returns a symbol that is, or merely -represents that command. - -The reason that there are \"symbols that merely represent a -command\" is that by avoiding binding a symbol as a command we -can prevent it from being offered as a completion candidate for -`execute-extended-command'. That is useful for infix arguments, -which usually do not work correctly unless called from a -transient. Unfortunately this only works for infix arguments -that are defined inline in the definition of a transient prefix -command; explicitly defined infix arguments continue to pollute -the command namespace. It would be better if all this were made -unnecessary by a `execute-extended-command-ignore' symbol property -but unfortunately that does not exist (yet?)." - (if (transient-suffix--eieio-childp arg) - (let ((sym (oref arg command))) - (if (commandp sym) - sym - (get sym 'transient--infix-command))) - (if (symbolp arg) - arg - ;; ARG is an interactive lambda. The symbol returned by this - ;; is not actually a command, just a symbol representing it - ;; for purposes other than invoking it as a command. - (oref (transient-suffix-object) command)))) - -;;; Keymaps - -(defvar transient-base-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "ESC ESC ESC") 'transient-quit-all) - (define-key map (kbd "C-g") 'transient-quit-one) - (define-key map (kbd "C-q") 'transient-quit-all) - (define-key map (kbd "C-z") 'transient-suspend) - (define-key map (kbd "C-v") 'transient-scroll-up) - (define-key map (kbd "M-v") 'transient-scroll-down) - (define-key map [next] 'transient-scroll-up) - (define-key map [prior] 'transient-scroll-down) - map) - "Parent of other keymaps used by Transient. - -This is the parent keymap of all the keymaps that are used in -all transients: `transient-map' (which in turn is the parent -of the transient-specific keymaps), `transient-edit-map' and -`transient-sticky-map'. - -If you change a binding here, then you might also have to edit -`transient-sticky-map' and `transient-common-commands'. While -the latter isn't a proper transient prefix command, it can be -edited using the same functions as used for transients.") - -(defvar transient-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map transient-base-map) - (define-key map (kbd "C-p") 'universal-argument) - (define-key map (kbd "C--") 'negative-argument) - (define-key map (kbd "C-t") 'transient-show) - (define-key map (kbd "?") 'transient-help) - (define-key map (kbd "C-h") 'transient-help) - (define-key map (kbd "M-p") 'transient-history-prev) - (define-key map (kbd "M-n") 'transient-history-next) - map) - "Top-level keymap used by all transients.") - -(defvar transient-edit-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map transient-base-map) - (define-key map (kbd "?") 'transient-help) - (define-key map (kbd "C-h") 'transient-help) - (define-key map (kbd "C-x l") 'transient-set-level) - map) - "Keymap that is active while a transient in is in \"edit mode\".") - -(defvar transient-sticky-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map transient-base-map) - (define-key map (kbd "C-g") 'transient-quit-seq) - map) - "Keymap that is active while an incomplete key sequence is active.") - -(defvar transient--common-command-prefixes '(?\C-x)) - -(put 'transient-common-commands - 'transient--layout - (cl-mapcan - (lambda (s) (transient--parse-child 'transient-common-commands s)) - '([:hide (lambda () - (and (not (memq (car transient--redisplay-key) - transient--common-command-prefixes)) - (not transient-show-common-commands))) - ["Value commands" - ("C-x s " "Set" transient-set) - ("C-x C-s" "Save" transient-save) - ("M-p " "Previous value" transient-history-prev) - ("M-n " "Next value" transient-history-next)] - ["Sticky commands" - ;; Like `transient-sticky-map' except that - ;; "C-g" has to be bound to a different command. - ("C-g" "Quit prefix or transient" transient-quit-one) - ("C-q" "Quit transient stack" transient-quit-all) - ("C-z" "Suspend transient stack" transient-suspend)] - ["Customize" - ("C-x t" transient-toggle-common - :description (lambda () - (if transient-show-common-commands - "Hide common commands" - "Show common permanently"))) - ("C-x l" "Show/hide suffixes" transient-set-level)]]))) - -(defvar transient-predicate-map - (let ((map (make-sparse-keymap))) - (define-key map [handle-switch-frame] 'transient--do-suspend) - (define-key map [transient-suspend] 'transient--do-suspend) - (define-key map [transient-help] 'transient--do-stay) - (define-key map [transient-set-level] 'transient--do-stay) - (define-key map [transient-history-prev] 'transient--do-stay) - (define-key map [transient-history-next] 'transient--do-stay) - (define-key map [universal-argument] 'transient--do-stay) - (define-key map [negative-argument] 'transient--do-stay) - (define-key map [digit-argument] 'transient--do-stay) - (define-key map [transient-quit-all] 'transient--do-quit-all) - (define-key map [transient-quit-one] 'transient--do-quit-one) - (define-key map [transient-quit-seq] 'transient--do-stay) - (define-key map [transient-show] 'transient--do-stay) - (define-key map [transient-update] 'transient--do-stay) - (define-key map [transient-toggle-common] 'transient--do-stay) - (define-key map [transient-set] 'transient--do-call) - (define-key map [transient-save] 'transient--do-call) - (define-key map [describe-key-briefly] 'transient--do-stay) - (define-key map [describe-key] 'transient--do-stay) - (define-key map [transient-scroll-up] 'transient--do-stay) - (define-key map [transient-scroll-down] 'transient--do-stay) - (define-key map [mwheel-scroll] 'transient--do-stay) - (define-key map [transient-noop] 'transient--do-noop) - (define-key map [transient-mouse-push-button] 'transient--do-move) - (define-key map [transient-push-button] 'transient--do-move) - (define-key map [transient-backward-button] 'transient--do-move) - (define-key map [transient-forward-button] 'transient--do-move) - (define-key map [transient-isearch-backward] 'transient--do-move) - (define-key map [transient-isearch-forward] 'transient--do-move) - map) - "Base keymap used to map common commands to their transient behavior. - -The \"transient behavior\" of a command controls, among other -things, whether invoking the command causes the transient to be -exited or not and whether infix arguments are exported before -doing so. - -Each \"key\" is a command that is common to all transients and -that is bound in `transient-map', `transient-edit-map', -`transient-sticky-map' and/or `transient-common-command'. - -Each binding is a \"pre-command\", a function that controls the -transient behavior of the respective command. - -For transient commands that are bound in individual transients, -the transient behavior is specified using the `:transient' slot -of the corresponding object.") - -(defvar transient-popup-navigation-map) - -(defvar transient--transient-map nil) -(defvar transient--predicate-map nil) -(defvar transient--redisplay-map nil) -(defvar transient--redisplay-key nil) - -(defun transient--push-keymap (map) - (transient--debug " push %s%s" map (if (symbol-value map) "" " VOID")) - (with-demoted-errors "transient--push-keymap: %S" - (internal-push-keymap (symbol-value map) 'overriding-terminal-local-map))) - -(defun transient--pop-keymap (map) - (transient--debug " pop %s%s" map (if (symbol-value map) "" " VOID")) - (with-demoted-errors "transient--pop-keymap: %S" - (internal-pop-keymap (symbol-value map) 'overriding-terminal-local-map))) - -(defun transient--make-transient-map () - (let ((map (make-sparse-keymap))) - (set-keymap-parent map (if transient--editp - transient-edit-map - transient-map)) - (dolist (obj transient--suffixes) - (let ((key (oref obj key))) - (when (vectorp key) - (setq key (key-description key)) - (oset obj key key)) - (when transient-substitute-key-function - (setq key (save-match-data - (funcall transient-substitute-key-function obj))) - (oset obj key key)) - (let ((kbd (kbd key)) - (cmd (transient--suffix-command obj))) - (when-let ((conflict (and transient-detect-key-conflicts - (transient--lookup-key map kbd)))) - (unless (eq cmd conflict) - (transient--emergency-exit) - (error "Cannot bind %S to %s and also %s" - (string-trim key) - cmd conflict))) - (define-key map kbd cmd)))) - (when transient-enable-popup-navigation - (setq map - (make-composed-keymap (list map transient-popup-navigation-map)))) - map)) - -(defun transient--make-predicate-map () - (let ((map (make-sparse-keymap))) - (set-keymap-parent map transient-predicate-map) - (dolist (obj transient--suffixes) - (let* ((cmd (transient--suffix-command obj)) - (sub-prefix (and (symbolp cmd) (get cmd 'transient--prefix)))) - (if (slot-boundp obj 'transient) - (define-key map (vector cmd) - (let ((do (oref obj transient))) - (pcase do - (`t (if sub-prefix - 'transient--do-replace - 'transient--do-stay)) - (`nil 'transient--do-exit) - (_ do)))) - (unless (lookup-key transient-predicate-map (vector cmd)) - (define-key map (vector cmd) - (if sub-prefix - 'transient--do-replace - (or (oref transient--prefix transient-suffix) - 'transient--do-exit))))))) - map)) - -(defun transient--make-redisplay-map () - (setq transient--redisplay-key - (cl-case this-command - (transient-update - (setq transient--showp t) - (setq unread-command-events - (listify-key-sequence (this-single-command-raw-keys)))) - (transient-quit-seq - (setq unread-command-events - (butlast (listify-key-sequence - (this-single-command-raw-keys)) - 2)) - (butlast transient--redisplay-key)) - (t nil))) - (let ((topmap (make-sparse-keymap)) - (submap (make-sparse-keymap))) - (when transient--redisplay-key - (define-key topmap (vconcat transient--redisplay-key) submap) - (set-keymap-parent submap transient-sticky-map)) - (map-keymap-internal - (lambda (key def) - (when (and (not (eq key ?\e)) - (listp def) - (keymapp def)) - (define-key topmap (vconcat transient--redisplay-key (list key)) - 'transient-update))) - (if transient--redisplay-key - (lookup-key transient--transient-map (vconcat transient--redisplay-key)) - transient--transient-map)) - topmap)) - -;;; Setup - -(defun transient-setup (&optional name layout edit &rest params) - "Setup the transient specified by NAME. - -This function is called by transient prefix commands to setup the -transient. In that case NAME is mandatory, LAYOUT and EDIT must -be nil and PARAMS may be (but usually is not) used to set e.g. the -\"scope\" of the transient (see `transient-define-prefix'). - -This function is also called internally in which case LAYOUT and -EDIT may be non-nil." - (transient--debug 'setup) - (cond - ((not name) - ;; Switching between regular and edit mode. - (transient--pop-keymap 'transient--transient-map) - (transient--pop-keymap 'transient--redisplay-map) - (setq name (oref transient--prefix command)) - (setq params (list :scope (oref transient--prefix scope)))) - ((not (or layout ; resuming parent/suspended prefix - current-transient-command)) ; entering child prefix - (transient--stack-zap)) ; replace suspended prefix, if any - (edit - ;; Returning from help to edit. - (setq transient--editp t))) - (transient--init-objects name layout params) - (transient--history-init transient--prefix) - (setq transient--predicate-map (transient--make-predicate-map)) - (setq transient--transient-map (transient--make-transient-map)) - (setq transient--redisplay-map (transient--make-redisplay-map)) - (setq transient--original-window (selected-window)) - (setq transient--original-buffer (current-buffer)) - (transient--redisplay) - (transient--init-transient) - (transient--suspend-which-key-mode)) - -(defun transient--init-objects (name layout params) - (setq transient--prefix - (let ((proto (get name 'transient--prefix))) - (apply #'clone proto - :prototype proto - :level (or (alist-get - t (alist-get name transient-levels)) - transient-default-level) - params))) - (transient-init-value transient--prefix) - (setq transient--layout - (or layout - (let ((levels (alist-get name transient-levels))) - (cl-mapcan (lambda (c) (transient--init-child levels c)) - (append (get name 'transient--layout) - (and (not transient--editp) - (get 'transient-common-commands - 'transient--layout))))))) - (setq transient--suffixes - (cl-labels ((s (def) - (cond - ((stringp def) nil) - ((listp def) (cl-mapcan #'s def)) - ((transient-group--eieio-childp def) - (cl-mapcan #'s (oref def suffixes))) - ((transient-suffix--eieio-childp def) - (list def))))) - (cl-mapcan #'s transient--layout)))) - -(defun transient--init-child (levels spec) - (cl-etypecase spec - (vector (transient--init-group levels spec)) - (list (transient--init-suffix levels spec)) - (string (list spec)))) - -(defun transient--init-group (levels spec) - (pcase-let ((`(,level ,class ,args ,children) (append spec nil))) - (when (transient--use-level-p level) - (let ((obj (apply class :level level args))) - (when (transient--use-suffix-p obj) - (when-let ((suffixes - (cl-mapcan (lambda (c) (transient--init-child levels c)) - children))) - (oset obj suffixes suffixes) - (list obj))))))) - -(defun transient--init-suffix (levels spec) - (pcase-let* ((`(,level ,class ,args) spec) - (cmd (plist-get args :command)) - (level (or (alist-get (transient--suffix-command cmd) levels) - level))) - (let ((fn (and (symbolp cmd) - (symbol-function cmd)))) - (when (autoloadp fn) - (transient--debug " autoload %s" cmd) - (autoload-do-load fn))) - (when (transient--use-level-p level) - (let ((obj (if-let ((proto (and cmd - (symbolp cmd) - (get cmd 'transient--suffix)))) - (apply #'clone proto :level level args) - (apply class :level level args)))) - (transient--init-suffix-key obj) - (transient--ensure-infix-command obj) - (when (transient--use-suffix-p obj) - (transient-init-scope obj) - (transient-init-value obj) - (list obj)))))) - -(cl-defmethod transient--init-suffix-key ((obj transient-suffix)) - (unless (slot-boundp obj 'key) - (error "No key for %s" (oref obj command)))) - -(cl-defmethod transient--init-suffix-key ((obj transient-argument)) - (if (transient-switches--eieio-childp obj) - (cl-call-next-method obj) - (unless (slot-boundp obj 'shortarg) - (when-let ((shortarg (transient--derive-shortarg (oref obj argument)))) - (oset obj shortarg shortarg))) - (unless (slot-boundp obj 'key) - (if (slot-boundp obj 'shortarg) - (oset obj key (oref obj shortarg)) - (error "No key for %s" (oref obj command)))))) - -(defun transient--use-level-p (level &optional edit) - (or (and transient--editp (not edit)) - (and (>= level 1) - (<= level (oref transient--prefix level))))) - -(defun transient--use-suffix-p (obj) - (with-slots - (if if-not if-nil if-non-nil if-mode if-not-mode if-derived if-not-derived) - obj - (cond - (if (funcall if)) - (if-not (not (funcall if-not))) - (if-non-nil (symbol-value if-non-nil)) - (if-nil (not (symbol-value if-nil))) - (if-mode (if (atom if-mode) - (eq major-mode if-mode) - (memq major-mode if-mode))) - (if-not-mode (not (if (atom if-not-mode) - (eq major-mode if-not-mode) - (memq major-mode if-not-mode)))) - (if-derived (if (atom if-derived) - (derived-mode-p if-derived) - (apply #'derived-mode-p if-derived))) - (if-not-derived (not (if (atom if-not-derived) - (derived-mode-p if-not-derived) - (apply #'derived-mode-p if-not-derived)))) - (t)))) - -;;; Flow-Control - -(defun transient--init-transient () - (transient--debug 'init-transient) - (transient--push-keymap 'transient--transient-map) - (transient--push-keymap 'transient--redisplay-map) - (add-hook 'pre-command-hook #'transient--pre-command) - (add-hook 'minibuffer-setup-hook #'transient--minibuffer-setup) - (add-hook 'minibuffer-exit-hook #'transient--minibuffer-exit) - (add-hook 'post-command-hook #'transient--post-command) - (advice-add 'abort-recursive-edit :after #'transient--minibuffer-exit) - (when transient--exitp - ;; This prefix command was invoked as the suffix of another. - ;; Prevent `transient--post-command' from removing the hooks - ;; that we just added. - (setq transient--exitp 'replace))) - -(defun transient--pre-command () - (transient--debug 'pre-command) - (cond - ((memq this-command '(transient-update transient-quit-seq)) - (transient--pop-keymap 'transient--redisplay-map)) - ((and transient--helpp - (not (memq this-command '(transient-quit-one - transient-quit-all)))) - (cond - ((transient-help) - (transient--do-suspend) - (setq this-command 'transient-suspend) - (transient--pre-exit)) - ((not (transient--edebug-command-p)) - (setq this-command 'transient-undefined)))) - ((and transient--editp - (transient-suffix-object) - (not (memq this-command '(transient-quit-one - transient-quit-all - transient-help)))) - (setq this-command 'transient-set-level)) - (t - (setq transient--exitp nil) - (when (eq (if-let ((fn (or (lookup-key transient--predicate-map - (vector this-original-command)) - (oref transient--prefix transient-non-suffix)))) - (let ((action (funcall fn))) - (when (eq action transient--exit) - (setq transient--exitp (or transient--exitp t))) - action) - (if (let ((keys (this-command-keys-vector))) - (eq (aref keys (1- (length keys))) ?\C-g)) - (setq this-command 'transient-noop) - (unless (transient--edebug-command-p) - (setq this-command 'transient-undefined))) - transient--stay) - transient--exit) - (transient--pre-exit))))) - -(defun transient--pre-exit () - (transient--debug 'pre-exit) - (transient--delete-window) - (transient--timer-cancel) - (transient--pop-keymap 'transient--transient-map) - (transient--pop-keymap 'transient--redisplay-map) - (remove-hook 'pre-command-hook #'transient--pre-command) - (unless transient--showp - (message "")) - (setq transient--transient-map nil) - (setq transient--predicate-map nil) - (setq transient--redisplay-map nil) - (setq transient--redisplay-key nil) - (setq transient--showp nil) - (setq transient--helpp nil) - (setq transient--editp nil) - (setq transient--prefix nil) - (setq transient--layout nil) - (setq transient--suffixes nil) - (setq transient--original-window nil) - (setq transient--original-buffer nil) - (setq transient--window nil)) - -(defun transient--delete-window () - (when (window-live-p transient--window) - (let ((buf (window-buffer transient--window))) - (with-demoted-errors "Error while exiting transient: %S" - (delete-window transient--window)) - (kill-buffer buf)))) - -(defun transient--export () - (setq current-transient-prefix transient--prefix) - (setq current-transient-command (oref transient--prefix command)) - (setq current-transient-suffixes transient--suffixes) - (transient--history-push transient--prefix)) - -(defun transient--minibuffer-setup () - (transient--debug 'minibuffer-setup) - (unless (> (minibuffer-depth) 1) - (unless transient--exitp - (transient--pop-keymap 'transient--transient-map) - (transient--pop-keymap 'transient--redisplay-map) - (remove-hook 'pre-command-hook #'transient--pre-command)) - (remove-hook 'post-command-hook #'transient--post-command))) - -(defun transient--minibuffer-exit () - (transient--debug 'minibuffer-exit) - (unless (> (minibuffer-depth) 1) - (unless transient--exitp - (transient--push-keymap 'transient--transient-map) - (transient--push-keymap 'transient--redisplay-map) - (add-hook 'pre-command-hook #'transient--pre-command)) - (add-hook 'post-command-hook #'transient--post-command))) - -(defun transient--suspend-override (&optional minibuffer-hooks) - (transient--debug 'suspend-override) - (transient--pop-keymap 'transient--transient-map) - (transient--pop-keymap 'transient--redisplay-map) - (remove-hook 'pre-command-hook #'transient--pre-command) - (remove-hook 'post-command-hook #'transient--post-command) - (when minibuffer-hooks - (remove-hook 'minibuffer-setup-hook #'transient--minibuffer-setup) - (remove-hook 'minibuffer-exit-hook #'transient--minibuffer-exit) - (advice-remove 'abort-recursive-edit #'transient--minibuffer-exit))) - -(defun transient--resume-override (&optional minibuffer-hooks) - (transient--debug 'resume-override) - (transient--push-keymap 'transient--transient-map) - (transient--push-keymap 'transient--redisplay-map) - (add-hook 'pre-command-hook #'transient--pre-command) - (add-hook 'post-command-hook #'transient--post-command) - (when minibuffer-hooks - (add-hook 'minibuffer-setup-hook #'transient--minibuffer-setup) - (add-hook 'minibuffer-exit-hook #'transient--minibuffer-exit) - (advice-add 'abort-recursive-edit :after #'transient--minibuffer-exit))) - -(defun transient--post-command () - (transient--debug 'post-command) - (if transient--exitp - (progn - (unless (and (eq transient--exitp 'replace) - (or transient--prefix - ;; The current command could act as a prefix, - ;; but decided not to call `transient-setup'. - (prog1 nil (transient--stack-zap)))) - (remove-hook 'minibuffer-setup-hook #'transient--minibuffer-setup) - (remove-hook 'minibuffer-exit-hook #'transient--minibuffer-exit) - (advice-remove 'abort-recursive-edit #'transient--minibuffer-exit) - (remove-hook 'post-command-hook #'transient--post-command)) - (setq current-transient-prefix nil) - (setq current-transient-command nil) - (setq current-transient-suffixes nil) - (let ((resume (and transient--stack - (not (memq transient--exitp '(replace suspend)))))) - (setq transient--exitp nil) - (setq transient--helpp nil) - (setq transient--editp nil) - (run-hooks 'post-transient-hook) - (when resume - (transient--stack-pop)))) - (transient--pop-keymap 'transient--redisplay-map) - (setq transient--redisplay-map (transient--make-redisplay-map)) - (transient--push-keymap 'transient--redisplay-map) - (unless (eq this-command (oref transient--prefix command)) - (transient--redisplay)))) - -(defun transient--stack-push () - (transient--debug 'stack-push) - (push (list (oref transient--prefix command) - transient--layout - transient--editp - :scope (oref transient--prefix scope)) - transient--stack)) - -(defun transient--stack-pop () - (transient--debug 'stack-pop) - (and transient--stack - (prog1 t (apply #'transient-setup (pop transient--stack))))) - -(defun transient--stack-zap () - (transient--debug 'stack-zap) - (setq transient--stack nil)) - -(defun transient--redisplay () - (if (or (eq transient-show-popup t) - transient--showp) - (unless (memq this-command '(transient-scroll-up - transient-scroll-down - mwheel-scroll)) - (transient--show)) - (when (and (numberp transient-show-popup) - (not (zerop transient-show-popup)) - (not transient--timer)) - (transient--timer-start)) - (transient--show-brief))) - -(defun transient--timer-start () - (setq transient--timer - (run-at-time (abs transient-show-popup) nil - (lambda () - (transient--timer-cancel) - (transient--show) - (let ((message-log-max nil)) - (message "")))))) - -(defun transient--timer-cancel () - (when transient--timer - (cancel-timer transient--timer) - (setq transient--timer nil))) - -(defun transient--debug (arg &rest args) - (when transient--debug - (if (symbolp arg) - (message "-- %-16s (cmd: %s, exit: %s)" - arg this-command transient--exitp) - (apply #'message arg args)))) - -(defun transient--emergency-exit () - "Exit the current transient command after an error occurred. - -Beside being used with `condition-case', this function also has -to be a member of `debugger-mode-hook', else the debugger would -be unusable and exiting it by pressing \"q\" would fail because -the transient command would still be active and that key would -either be unbound or do something else. - -When no transient is active (i.e. when `transient--prefix') is -nil, then do nothing." - (when transient--prefix - (setq transient--stack nil) - (setq transient--exitp t) - (transient--pre-exit) - (transient--post-command))) - -(add-hook 'debugger-mode-hook 'transient--emergency-exit) - -(defmacro transient--with-emergency-exit (&rest body) - (declare (indent defun)) - `(condition-case nil - ,(macroexp-progn body) - (error (transient--emergency-exit)))) - -;;; Pre-Commands - -(defun transient--do-stay () - "Call the command without exporting variables and stay transient." - transient--stay) - -(defun transient--do-noop () - "Call `transient-noop' and stay transient." - (setq this-command 'transient-noop) - transient--stay) - -(defun transient--do-warn () - "Call `transient-undefined' and stay transient." - (setq this-command 'transient-undefined) - transient--stay) - -(defun transient--do-call () - "Call the command after exporting variables and stay transient." - (transient--export) - transient--stay) - -(defun transient--do-exit () - "Call the command after exporting variables and exit the transient." - (transient--export) - (transient--stack-zap) - transient--exit) - -(defun transient--do-replace () - "Call the transient prefix command, replacing the active transient." - (transient--export) - (transient--stack-push) - (setq transient--exitp 'replace) - transient--exit) - -(defun transient--do-suspend () - "Suspend the active transient, saving the transient stack." - (transient--stack-push) - (setq transient--exitp 'suspend) - transient--exit) - -(defun transient--do-quit-one () - "If active, quit help or edit mode, else exit the active transient." - (cond (transient--helpp - (setq transient--helpp nil) - transient--stay) - (transient--editp - (setq transient--editp nil) - (transient-setup) - transient--stay) - (t transient--exit))) - -(defun transient--do-quit-all () - "Exit all transients without saving the transient stack." - (transient--stack-zap) - transient--exit) - -(defun transient--do-move () - "Call the command if `transient-enable-popup-navigation' is non-nil. -In that case behave like `transient--do-stay', otherwise similar -to `transient--do-warn'." - (unless transient-enable-popup-navigation - (setq this-command 'transient-popup-navigation-help)) - transient--stay) - -;;; Commands - -(defun transient-noop () - "Do nothing at all." - (interactive)) - -(defun transient-undefined () - "Warn the user that the pressed key is not bound to any suffix." - (interactive) - (ding) - (message "Unbound suffix: `%s' (Use `%s' to abort, `%s' for help) [%s]" - (propertize (key-description (this-single-command-keys)) - 'face 'font-lock-warning-face) - (propertize "C-g" 'face 'transient-key) - (propertize "?" 'face 'transient-key) - this-original-command)) - -(defun transient-toggle-common () - "Toggle whether common commands are always shown." - (interactive) - (setq transient-show-common-commands (not transient-show-common-commands))) - -(defun transient-suspend () - "Suspend the current transient. -It can later be resumed using `transient-resume' while no other -transient is active." - (interactive)) - -(defun transient-quit-all () - "Exit all transients without saving the transient stack." - (interactive)) - -(defun transient-quit-one () - "Exit the current transients, possibly returning to the previous." - (interactive)) - -(defun transient-quit-seq () - "Abort the current incomplete key sequence." - (interactive)) - -(defun transient-update () - "Redraw the transient's state in the popup buffer." - (interactive)) - -(defun transient-show () - "Show the transient's state in the popup buffer." - (interactive) - (setq transient--showp t)) - -(defvar-local transient--restore-winconf nil) - -(defvar transient-resume-mode) - -(defun transient-help () - "Show help for the active transient or one of its suffixes." - (interactive) - (if (called-interactively-p 'any) - (setq transient--helpp t) - (with-demoted-errors "transient-help: %S" - (when (lookup-key transient--transient-map - (this-single-command-raw-keys)) - (setq transient--helpp nil) - (let ((winconf (current-window-configuration))) - (transient-show-help - (if (eq this-original-command 'transient-help) - transient--prefix - (or (transient-suffix-object) - this-original-command))) - (setq transient--restore-winconf winconf)) - (fit-window-to-buffer nil (frame-height) (window-height)) - (transient-resume-mode) - (message "Type \"q\" to resume transient command.") - t)))) - -(defun transient-set-level (&optional command level) - "Set the level of the transient or one of its suffix commands." - (interactive - (let ((command this-original-command) - (prefix (oref transient--prefix command))) - (and (or (not (eq command 'transient-set-level)) - (and transient--editp - (setq command prefix))) - (list command - (let ((keys (this-single-command-raw-keys))) - (and (lookup-key transient--transient-map keys) - (string-to-number - (let ((transient--active-infix - (transient-suffix-object))) - (transient--show) - (transient--read-number-N - (format "Set level for `%s': " - (transient--suffix-command command)) - nil nil (not (eq command prefix))))))))))) - (cond - ((not command) - (setq transient--editp t) - (transient-setup)) - (level - (let* ((prefix (oref transient--prefix command)) - (alist (alist-get prefix transient-levels)) - (key (transient--suffix-command command))) - (if (eq command prefix) - (progn (oset transient--prefix level level) - (setq key t)) - (oset (transient-suffix-object command) level level)) - (setf (alist-get key alist) level) - (setf (alist-get prefix transient-levels) alist)) - (transient-save-levels)) - (t - (transient-undefined)))) - -(defun transient-set () - "Save the value of the active transient for this Emacs session." - (interactive) - (transient-set-value (or transient--prefix current-transient-prefix))) - -(defun transient-save () - "Save the value of the active transient persistenly across Emacs sessions." - (interactive) - (transient-save-value (or transient--prefix current-transient-prefix))) - -(defun transient-history-next () - "Switch to the next value used for the active transient." - (interactive) - (let* ((obj transient--prefix) - (pos (1- (oref obj history-pos))) - (hst (oref obj history))) - (if (< pos 0) - (user-error "End of history") - (oset obj history-pos pos) - (oset obj value (nth pos hst)) - (mapc #'transient-init-value transient--suffixes)))) - -(defun transient-history-prev () - "Switch to the previous value used for the active transient." - (interactive) - (let* ((obj transient--prefix) - (pos (1+ (oref obj history-pos))) - (hst (oref obj history)) - (len (length hst))) - (if (> pos (1- len)) - (user-error "End of history") - (oset obj history-pos pos) - (oset obj value (nth pos hst)) - (mapc #'transient-init-value transient--suffixes)))) - -(defun transient-scroll-up (&optional arg) - "Scroll text of transient popup window upward ARG lines. -If ARG is nil scroll near full screen. This is a wrapper -around `scroll-up-command' (which see)." - (interactive "^P") - (with-selected-window transient--window - (scroll-up-command arg))) - -(defun transient-scroll-down (&optional arg) - "Scroll text of transient popup window down ARG lines. -If ARG is nil scroll near full screen. This is a wrapper -around `scroll-down-command' (which see)." - (interactive "^P") - (with-selected-window transient--window - (scroll-down-command arg))) - -(defun transient-resume () - "Resume a previously suspended stack of transients." - (interactive) - (cond (transient--stack - (let ((winconf transient--restore-winconf)) - (kill-local-variable 'transient--restore-winconf) - (when transient-resume-mode - (transient-resume-mode -1) - (quit-window)) - (when winconf - (set-window-configuration winconf))) - (transient--stack-pop)) - (transient-resume-mode - (kill-local-variable 'transient--restore-winconf) - (transient-resume-mode -1) - (quit-window)) - (t - (message "No suspended transient command")))) - -;;; Value -;;;; Init - -(cl-defgeneric transient-init-scope (obj) - "Set the scope of the suffix object OBJ. - -The scope is actually a property of the transient prefix, not of -individual suffixes. However it is possible to invoke a suffix -command directly instead of from a transient. In that case, if -the suffix expects a scope, then it has to determine that itself -and store it in its `scope' slot. - -This function is called for all suffix commands, but unless a -concrete method is implemented this falls through to the default -implementation, which is a noop.") - -(cl-defmethod transient-init-scope ((_ transient-suffix)) - "Noop." nil) - -(cl-defgeneric transient-init-value (_) - "Set the initial value of the object OBJ. - -This function is called for all prefix and suffix commands. - -For suffix commands (including infix argument commands) the -default implementation is a noop. Classes derived from the -abstract `transient-infix' class must implement this function. -Non-infix suffix commands usually don't have a value." - nil) - -(cl-defmethod transient-init-value ((obj transient-prefix)) - (if (slot-boundp obj 'value) - (oref obj value) - (oset obj value - (if-let ((saved (assq (oref obj command) transient-values))) - (cdr saved) - (if-let ((default (and (slot-boundp obj 'default-value) - (oref obj default-value)))) - (if (functionp default) - (funcall default) - default) - nil))))) - -(cl-defmethod transient-init-value ((obj transient-switch)) - (oset obj value - (car (member (oref obj argument) - (oref transient--prefix value))))) - -(cl-defmethod transient-init-value ((obj transient-option)) - (oset obj value - (transient--value-match (format "\\`%s\\(.*\\)" (oref obj argument))))) - -(cl-defmethod transient-init-value ((obj transient-switches)) - (oset obj value - (transient--value-match (oref obj argument-regexp)))) - -(defun transient--value-match (re) - (when-let ((match (cl-find-if (lambda (v) - (and (stringp v) - (string-match re v))) - (oref transient--prefix value)))) - (match-string 1 match))) - -(cl-defmethod transient-init-value ((obj transient-files)) - (oset obj value - (cdr (assoc "--" (oref transient--prefix value))))) - -;;;; Read - -(cl-defgeneric transient-infix-read (obj) - "Determine the new value of the infix object OBJ. - -This function merely determines the value; `transient-infix-set' -is used to actually store the new value in the object. - -For most infix classes this is done by reading a value from the -user using the reader specified by the `reader' slot (using the -`transient-infix' method described below). - -For some infix classes the value is changed without reading -anything in the minibuffer, i.e. the mere act of invoking the -infix command determines what the new value should be, based -on the previous value.") - -(cl-defmethod transient-infix-read :around ((obj transient-infix)) - "Highlight the infix in the popup buffer. - -Also arrange for the transient to be exited in case of an error -because otherwise Emacs would get stuck in an inconsistent state, -which might make it necessary to kill it from the outside." - (let ((transient--active-infix obj)) - (transient--show)) - (transient--with-emergency-exit - (cl-call-next-method obj))) - -(cl-defmethod transient-infix-read ((obj transient-infix)) - "Read a value while taking care of history. - -This method is suitable for a wide variety of infix commands, -including but not limitted to inline arguments and variables. - -If you do not use this method for your own infix class, then -you should likely replicate a lot of the behavior of this -method. If you fail to do so, then users might not appreciate -the lack of history, for example. - -Only for very simple classes that toggle or cycle through a very -limited number of possible values should you replace this with a -simple method that does not handle history. (E.g. for a command -line switch the only possible values are \"use it\" and \"don't use -it\", in which case it is pointless to preserve history.)" - (with-slots (value multi-value allow-empty choices) obj - (if (and value - (not multi-value) - transient--prefix) - (oset obj value nil) - (let* ((overriding-terminal-local-map nil) - (reader (oref obj reader)) - (prompt (transient-prompt obj)) - (value (if multi-value (mapconcat #'identity value ",") value)) - (history-key (or (oref obj history-key) - (oref obj command))) - (transient--history (alist-get history-key transient-history)) - (transient--history (if (or (null value) - (eq value (car transient--history))) - transient--history - (cons value transient--history))) - (initial-input (and transient-read-with-initial-input - (car transient--history))) - (history (if initial-input - (cons 'transient--history 1) - 'transient--history)) - (value - (cond - (reader (funcall reader prompt initial-input history)) - (multi-value - (completing-read-multiple prompt choices nil nil - initial-input history)) - (choices - (completing-read prompt choices nil t initial-input history)) - (t (read-string prompt initial-input history))))) - (cond ((and (equal value "") (not allow-empty)) - (setq value nil)) - ((and (equal value "\"\"") allow-empty) - (setq value ""))) - (when value - (when (bound-and-true-p ivy-mode) - (set-text-properties 0 (length (car transient--history)) nil - (car transient--history))) - (setf (alist-get history-key transient-history) - (delete-dups transient--history))) - value)))) - -(cl-defmethod transient-infix-read ((obj transient-switch)) - "Toggle the switch on or off." - (if (oref obj value) nil (oref obj argument))) - -(cl-defmethod transient-infix-read ((obj transient-switches)) - "Cycle through the mutually exclusive switches. -The last value is \"don't use any of these switches\"." - (let ((choices (mapcar (apply-partially #'format (oref obj argument-format)) - (oref obj choices)))) - (if-let ((value (oref obj value))) - (cadr (member value choices)) - (car choices)))) - -;;;; Readers - -(defun transient-read-directory (prompt _initial-input _history) - "Read a directory." - (expand-file-name (read-directory-name prompt))) - -(defun transient-read-existing-directory (prompt _initial-input _history) - "Read an existing directory." - (expand-file-name (read-directory-name prompt nil nil t))) - -(defun transient-read-number-N0 (prompt initial-input history) - "Read a natural number (including zero) and return it as a string." - (transient--read-number-N prompt initial-input history t)) - -(defun transient-read-number-N+ (prompt initial-input history) - "Read a natural number (excluding zero) and return it as a string." - (transient--read-number-N prompt initial-input history nil)) - -(defun transient--read-number-N (prompt initial-input history include-zero) - (save-match-data - (cl-block nil - (while t - (let ((str (read-from-minibuffer prompt initial-input nil nil history))) - (cond ((string-equal str "") - (cl-return nil)) - ((string-match-p (if include-zero - "\\`\\(0\\|[1-9][0-9]*\\)\\'" - "\\`[1-9][0-9]*\\'") - str) - (cl-return str)))) - (message "Please enter a natural number (%s zero)." - (if include-zero "including" "excluding")) - (sit-for 1))))) - -(defun transient-read-date (prompt default-time _history) - "Read a date using `org-read-date' (which see)." - (require 'org) - (when (fboundp 'org-read-date) - (org-read-date 'with-time nil nil prompt default-time))) - -;;;; Prompt - -(cl-defgeneric transient-prompt (obj) - "Return the prompt to be used to read infix object OBJ's value.") - -(cl-defmethod transient-prompt ((obj transient-infix)) - "Return the prompt to be used to read infix object OBJ's value. - -This implementation should be suitable for almost all infix -commands. - -If the value of OBJ's `prompt' slot is non-nil, then it must be -a string or a function. If it is a string, then use that. If -it is a function, then call that with OBJ as the only argument. -That function must return a string, which is then used as the -prompt. - -Otherwise, if the value of either the `argument' or `variable' -slot of OBJ is a string, then base the prompt on that (preferring -the former), appending either \"=\" (if it appears to be a -command-line option) or \": \". - -Finally fall through to using \"(BUG: no prompt): \" as the -prompt." - (if-let ((prompt (oref obj prompt))) - (let ((prompt (if (functionp prompt) - (funcall prompt obj) - prompt))) - (if (stringp prompt) - prompt - "(BUG: no prompt): ")) - (or (when-let ((arg (and (slot-boundp obj 'argument) (oref obj argument)))) - (if (and (stringp arg) (string-suffix-p "=" arg)) - arg - (concat arg ": "))) - (when-let ((var (and (slot-boundp obj 'variable) (oref obj variable)))) - (and (stringp var) - (concat var ": "))) - "(BUG: no prompt): "))) - -;;;; Set - -(defvar transient--unset-incompatible t) - -(cl-defgeneric transient-infix-set (obj value) - "Set the value of infix object OBJ to value.") - -(cl-defmethod transient-infix-set ((obj transient-infix) value) - "Set the value of infix object OBJ to value. - -This implementation should be suitable for almost all infix -commands." - (oset obj value value)) - -(cl-defmethod transient-infix-set :around ((obj transient-argument) value) - "Unset incompatible infix arguments." - (let ((arg (if (slot-boundp obj 'argument) - (oref obj argument) - (oref obj argument-regexp)))) - (if-let ((sic (and value arg transient--unset-incompatible)) - (spec (oref transient--prefix incompatible)) - (incomp (remove arg (cl-find-if (lambda (elt) (member arg elt)) spec)))) - (progn - (cl-call-next-method obj value) - (dolist (arg incomp) - (when-let ((obj (cl-find-if (lambda (obj) - (and (slot-boundp obj 'argument) - (equal (oref obj argument) arg))) - transient--suffixes))) - (let ((transient--unset-incompatible nil)) - (transient-infix-set obj nil))))) - (cl-call-next-method obj value)))) - -(cl-defmethod transient-set-value ((obj transient-prefix)) - (oset (oref obj prototype) value (transient-get-value)) - (transient--history-push obj)) - -;;;; Save - -(cl-defmethod transient-save-value ((obj transient-prefix)) - (let ((value (transient-get-value))) - (oset (oref obj prototype) value value) - (setf (alist-get (oref obj command) transient-values) value) - (transient-save-values)) - (transient--history-push obj)) - -;;;; Get - -(defun transient-args (prefix) - "Return the value of the transient prefix command PREFIX. -If the current command was invoked from the transient prefix -command PREFIX, then return the active infix arguments. If -the current command was not invoked from PREFIX, then return -the set, saved or default value for PREFIX." - (if (eq current-transient-command prefix) - (delq nil (mapcar 'transient-infix-value current-transient-suffixes)) - (let ((transient--prefix nil) - (transient--layout nil) - (transient--suffixes nil)) - (transient--init-objects prefix nil nil) - (delq nil (mapcar 'transient-infix-value transient--suffixes))))) - -(defun transient-get-value () - (delq nil (mapcar 'transient-infix-value current-transient-suffixes))) - -(cl-defgeneric transient-infix-value (obj) - "Return the value of the suffix object OBJ. - -This function is called by `transient-args' (which see), meaning -this function is how the value of a transient is determined so -that the invoked suffix command can use it. - -Currently most values are strings, but that is not set in stone. -Nil is not a value, it means \"no value\". - -Usually only infixes have a value, but see the method for -`transient-suffix'.") - -(cl-defmethod transient-infix-value ((_ transient-suffix)) - "Return nil, which means \"no value\". - -Infix arguments contribute the the transient's value while suffix -commands consume it. This function is called for suffixes anyway -because a command that both contributes to the transient's value -and also consumes it is not completely unconceivable. - -If you define such a command, then you must define a derived -class and implement this function because this default method -does nothing." nil) - -(cl-defmethod transient-infix-value ((obj transient-infix)) - "Return the value of OBJ's `value' slot." - (oref obj value)) - -(cl-defmethod transient-infix-value ((obj transient-option)) - "Return (concat ARGUMENT VALUE) or nil. - -ARGUMENT and VALUE are the values of the respective slots of OBJ. -If VALUE is nil, then return nil. VALUE may be the empty string, -which is not the same as nil." - (when-let ((value (oref obj value))) - (concat (oref obj argument) value))) - -(cl-defmethod transient-infix-value ((_ transient-variable)) - "Return nil, which means \"no value\". - -Setting the value of a variable is done by, well, setting the -value of the variable. I.e. this is a side-effect and does not -contribute to the value of the transient." - nil) - -(cl-defmethod transient-infix-value ((obj transient-files)) - "Return (concat ARGUMENT VALUE) or nil. - -ARGUMENT and VALUE are the values of the respective slots of OBJ. -If VALUE is nil, then return nil. VALUE may be the empty string, -which is not the same as nil." - (when-let ((value (oref obj value))) - (cons (oref obj argument) value))) - -;;; History - -(cl-defgeneric transient--history-key (obj) - "Return OBJ's history key. -If the value of the `history-key' slot is non-nil, then return -that. Otherwise return the value of the `command' slot." - (or (oref obj history-key) - (oref obj command))) - -(cl-defgeneric transient--history-push (obj) - "Push the current value of OBJ to its entry in `transient-history'." - (let ((key (transient--history-key obj))) - (setf (alist-get key transient-history) - (let ((args (transient-get-value))) - (cons args (delete args (alist-get key transient-history))))))) - -(cl-defgeneric transient--history-init (obj) - "Initialize OBJ's `history' slot. -This is the transient-wide history; many individual infixes also -have a history of their own.") - -(cl-defmethod transient--history-init ((obj transient-prefix)) - "Initialize OBJ's `history' slot from the variable `transient-history'." - (let ((val (oref obj value))) - (oset obj history - (cons val (delete val (alist-get (transient--history-key obj) - transient-history)))))) - -;;; Draw - -(defun transient--show-brief () - (let ((message-log-max nil)) - (if (and transient-show-popup (<= transient-show-popup 0)) - (message "%s-" (key-description (this-command-keys))) - (message - "%s- [%s] %s" - (key-description (this-command-keys)) - (oref transient--prefix command) - (mapconcat - #'identity - (sort - (cl-mapcan - (lambda (suffix) - (let ((key (kbd (oref suffix key)))) - ;; Don't list any common commands. - (and (not (memq (oref suffix command) - `(,(lookup-key transient-map key) - ,(lookup-key transient-sticky-map key) - ;; From transient-common-commands: - transient-set - transient-save - transient-history-prev - transient-history-next - transient-quit-one - transient-toggle-common - transient-set-level))) - (list (propertize (oref suffix key) 'face 'transient-key))))) - transient--suffixes) - #'string<) - (propertize "|" 'face 'transient-unreachable-key)))))) - -(defun transient--show () - (transient--timer-cancel) - (setq transient--showp t) - (let ((buf (get-buffer-create transient--buffer-name)) - (focus nil)) - (unless (window-live-p transient--window) - (setq transient--window - (display-buffer buf transient-display-buffer-action))) - (with-selected-window transient--window - (when transient-enable-popup-navigation - (setq focus (button-get (point) 'command))) - (erase-buffer) - (set-window-hscroll transient--window 0) - (set-window-dedicated-p transient--window t) - (set-window-parameter transient--window 'no-other-window t) - (setq window-size-fixed t) - (when (bound-and-true-p tab-line-format) - (setq tab-line-format nil)) - (setq mode-line-format (if (eq transient-mode-line-format 'line) - nil - transient-mode-line-format)) - (setq mode-line-buffer-identification - (symbol-name (oref transient--prefix command))) - (if transient-enable-popup-navigation - (setq-local cursor-in-non-selected-windows 'box) - (setq cursor-type nil)) - (setq display-line-numbers nil) - (setq show-trailing-whitespace nil) - (transient--insert-groups) - (when (or transient--helpp transient--editp) - (transient--insert-help)) - (when (and (eq transient-mode-line-format 'line) - window-system) - (insert (propertize "__" 'face 'transient-separator - 'display '(space :height (1)))) - (insert (propertize "\n" 'face 'transient-separator 'line-height t))) - (let ((window-resize-pixelwise t) - (window-size-fixed nil)) - (fit-window-to-buffer nil nil 1)) - (goto-char (point-min)) - (when transient-force-fixed-pitch - (transient--force-fixed-pitch)) - (when transient-enable-popup-navigation - (transient--goto-button focus))))) - -(defun transient--insert-groups () - (let ((groups (cl-mapcan (lambda (group) - (let ((hide (oref group hide))) - (and (not (and (functionp hide) - (funcall hide))) - (list group)))) - transient--layout)) - group) - (while (setq group (pop groups)) - (transient--insert-group group) - (when groups - (insert ?\n))))) - -(cl-defgeneric transient--insert-group (group) - "Format GROUP and its elements and insert the result.") - -(cl-defmethod transient--insert-group :before ((group transient-group)) - "Insert GROUP's description, if any." - (when-let ((desc (transient-format-description group))) - (insert desc ?\n))) - -(cl-defmethod transient--insert-group ((group transient-row)) - (dolist (suffix (oref group suffixes)) - (insert (transient-format suffix)) - (insert " ")) - (insert ?\n)) - -(cl-defmethod transient--insert-group ((group transient-column)) - (dolist (suffix (oref group suffixes)) - (let ((str (transient-format suffix))) - (insert str) - (unless (string-match-p ".\n\\'" str) - (insert ?\n))))) - -(cl-defmethod transient--insert-group ((group transient-columns)) - (let* ((columns - (mapcar - (lambda (column) - (let ((rows (mapcar 'transient-format (oref column suffixes)))) - (when-let ((desc (transient-format-description column))) - (push desc rows)) - rows)) - (oref group suffixes))) - (rs (apply #'max (mapcar #'length columns))) - (cs (length columns)) - (cw (mapcar (lambda (col) (apply #'max (mapcar #'length col))) - columns)) - (cc (transient--seq-reductions-from (apply-partially #'+ 3) cw 0))) - (dotimes (r rs) - (dotimes (c cs) - (insert (make-string (- (nth c cc) (current-column)) ?\s)) - (when-let ((cell (nth r (nth c columns)))) - (insert cell)) - (when (= c (1- cs)) - (insert ?\n)))))) - -(cl-defmethod transient--insert-group ((group transient-subgroups)) - (let* ((subgroups (oref group suffixes)) - (n (length subgroups))) - (dotimes (s n) - (transient--insert-group (nth s subgroups)) - (when (< s (1- n)) - (insert ?\n))))) - -(cl-defgeneric transient-format (obj) - "Format and return OBJ for display. - -When this function is called, then the current buffer is some -temporary buffer. If you need the buffer from which the prefix -command was invoked to be current, then do so by temporarily -making `transient--original-buffer' current.") - -(cl-defmethod transient-format ((arg string)) - "Return the string ARG after applying the `transient-heading' face." - (propertize arg 'face 'transient-heading)) - -(cl-defmethod transient-format ((_ null)) - "Return a string containing just the newline character." - "\n") - -(cl-defmethod transient-format ((arg integer)) - "Return a string containing just the ARG character." - (char-to-string arg)) - -(cl-defmethod transient-format :around ((obj transient-infix)) - "When reading user input for this infix, then highlight it." - (let ((str (cl-call-next-method obj))) - (when (eq obj transient--active-infix) - (setq str (concat str "\n")) - (add-face-text-property - (if (eq this-command 'transient-set-level) 3 0) - (length str) - 'transient-active-infix nil str)) - str)) - -(cl-defmethod transient-format :around ((obj transient-suffix)) - "When edit-mode is enabled, then prepend the level information. -Optional support for popup buttons is also implemented here." - (let ((str (concat - (and transient--editp - (let ((level (oref obj level))) - (propertize (format " %s " level) - 'face (if (transient--use-level-p level t) - 'transient-enabled-suffix - 'transient-disabled-suffix)))) - (cl-call-next-method obj)))) - (if transient-enable-popup-navigation - (make-text-button str nil - 'type 'transient-button - 'command (transient--suffix-command obj)) - str))) - -(cl-defmethod transient-format ((obj transient-infix)) - "Return a string generated using OBJ's `format'. -%k is formatted using `transient-format-key'. -%d is formatted using `transient-format-description'. -%f is formatted using `transient-format-value'." - (format-spec (oref obj format) - `((?k . ,(transient-format-key obj)) - (?d . ,(transient-format-description obj)) - (?v . ,(transient-format-value obj))))) - -(cl-defmethod transient-format ((obj transient-suffix)) - "Return a string generated using OBJ's `format'. -%k is formatted using `transient-format-key'. -%d is formatted using `transient-format-description'." - (format-spec (oref obj format) - `((?k . ,(transient-format-key obj)) - (?d . ,(transient-format-description obj))))) - -(cl-defgeneric transient-format-key (obj) - "Format OBJ's `key' for display and return the result.") - -(cl-defmethod transient-format-key ((obj transient-suffix)) - "Format OBJ's `key' for display and return the result." - (let ((key (oref obj key))) - (if transient--redisplay-key - (let ((len (length transient--redisplay-key)) - (seq (cl-coerce (edmacro-parse-keys key t) 'list))) - (cond - ((equal (seq-take seq len) transient--redisplay-key) - (let ((pre (key-description (vconcat (seq-take seq len)))) - (suf (key-description (vconcat (seq-drop seq len))))) - (setq pre (replace-regexp-in-string "RET" "C-m" pre t)) - (setq pre (replace-regexp-in-string "TAB" "C-i" pre t)) - (setq suf (replace-regexp-in-string "RET" "C-m" suf t)) - (setq suf (replace-regexp-in-string "TAB" "C-i" suf t)) - ;; We use e.g. "-k" instead of the more correct "- k", - ;; because the former is prettier. If we did that in - ;; the definition, then we want to drop the space that - ;; is reinserted above. False-positives are possible - ;; for silly bindings like "-C-c C-c". - (unless (string-match-p " " key) - (setq pre (replace-regexp-in-string " " "" pre)) - (setq suf (replace-regexp-in-string " " "" suf))) - (concat (propertize pre 'face 'default) - (and (string-prefix-p (concat pre " ") key) " ") - (propertize suf 'face 'transient-key) - (save-excursion - (when (string-match " +\\'" key) - (match-string 0 key)))))) - ((transient--lookup-key transient-sticky-map (kbd key)) - (propertize key 'face 'transient-key)) - (t - (propertize key 'face 'transient-unreachable-key)))) - (propertize key 'face 'transient-key)))) - -(cl-defmethod transient-format-key :around ((obj transient-argument)) - (let ((key (cl-call-next-method obj))) - (cond ((not transient-highlight-mismatched-keys)) - ((not (slot-boundp obj 'shortarg)) - (add-face-text-property - 0 (length key) 'transient-nonstandard-key nil key)) - ((not (string-equal key (oref obj shortarg))) - (add-face-text-property - 0 (length key) 'transient-mismatched-key nil key))) - key)) - -(cl-defgeneric transient-format-description (obj) - "Format OBJ's `description' for display and return the result.") - -(cl-defmethod transient-format-description ((obj transient-child)) - "The `description' slot may be a function, in which case that is -called inside the correct buffer (see `transient-insert-group') -and its value is returned to the caller." - (when-let ((desc (oref obj description))) - (if (functionp desc) - (with-current-buffer transient--original-buffer - (funcall desc)) - desc))) - -(cl-defmethod transient-format-description ((obj transient-group)) - "Format the description by calling the next method. If the result -doesn't use the `face' property at all, then apply the face -`transient-heading' to the complete string." - (when-let ((desc (cl-call-next-method obj))) - (if (text-property-not-all 0 (length desc) 'face nil desc) - desc - (propertize desc 'face 'transient-heading)))) - -(cl-defmethod transient-format-description :around ((obj transient-suffix)) - "Format the description by calling the next method. If the result -is nil, then use \"(BUG: no description)\" as the description. -If the OBJ's `key' is currently unreachable, then apply the face -`transient-unreachable' to the complete string." - (let ((desc (or (cl-call-next-method obj) - (propertize "(BUG: no description)" 'face 'error)))) - (if (transient--key-unreachable-p obj) - (propertize desc 'face 'transient-unreachable) - desc))) - -(cl-defgeneric transient-format-value (obj) - "Format OBJ's value for display and return the result.") - -(cl-defmethod transient-format-value ((obj transient-suffix)) - (propertize (oref obj argument) - 'face (if (oref obj value) - 'transient-argument - 'transient-inactive-argument))) - -(cl-defmethod transient-format-value ((obj transient-option)) - (let ((value (oref obj value))) - (propertize (concat (oref obj argument) - (if (listp value) - (mapconcat #'identity value ",") - value)) - 'face (if value - 'transient-value - 'transient-inactive-value)))) - -(cl-defmethod transient-format-value ((obj transient-switches)) - (with-slots (value argument-format choices) obj - (format (propertize argument-format - 'face (if value - 'transient-value - 'transient-inactive-value)) - (concat - (propertize "[" 'face 'transient-inactive-value) - (mapconcat - (lambda (choice) - (propertize choice 'face - (if (equal (format argument-format choice) value) - 'transient-value - 'transient-inactive-value))) - choices - (propertize "|" 'face 'transient-inactive-value)) - (propertize "]" 'face 'transient-inactive-value))))) - -(cl-defmethod transient-format-value ((obj transient-files)) - (let ((argument (oref obj argument))) - (if-let ((value (oref obj value))) - (propertize (concat argument " " - (mapconcat (lambda (f) (format "%S" f)) - (oref obj value) " ")) - 'face 'transient-argument) - (propertize argument 'face 'transient-inactive-argument)))) - -(defun transient--key-unreachable-p (obj) - (and transient--redisplay-key - (let ((key (oref obj key))) - (not (or (equal (seq-take (cl-coerce (edmacro-parse-keys key t) 'list) - (length transient--redisplay-key)) - transient--redisplay-key) - (transient--lookup-key transient-sticky-map (kbd key))))))) - -(defun transient--lookup-key (keymap key) - (let ((val (lookup-key keymap key))) - (and val (not (integerp val)) val))) - -;;; Help - -(cl-defgeneric transient-show-help (obj) - "Show help for OBJ's command.") - -(cl-defmethod transient-show-help ((obj transient-prefix)) - "Show the info manual, manpage or command doc-string. -Show the first one that is specified." - (if-let ((manual (oref obj info-manual))) - (info manual) - (if-let ((manpage (oref obj man-page))) - (transient--show-manpage manpage) - (transient--describe-function (oref obj command))))) - -(cl-defmethod transient-show-help ((_ transient-suffix)) - "Show the command doc-string." - (if (eq this-original-command 'transient-help) - (if-let ((manpage (oref transient--prefix man-page))) - (transient--show-manpage manpage) - (transient--describe-function (oref transient--prefix command))) - (transient--describe-function this-original-command))) - -(cl-defmethod transient-show-help ((obj transient-infix)) - "Show the manpage if defined or the command doc-string. -If the manpage is specified, then try to jump to the correct -location." - (if-let ((manpage (oref transient--prefix man-page))) - (transient--show-manpage manpage (ignore-errors (oref obj argument))) - (transient--describe-function this-original-command))) - -;; `cl-generic-generalizers' doesn't support `command' et al. -(cl-defmethod transient-show-help (cmd) - "Show the command doc-string." - (transient--describe-function cmd)) - -(defun transient--show-manpage (manpage &optional argument) - (require 'man) - (let* ((Man-notify-method 'meek) - (buf (Man-getpage-in-background manpage)) - (proc (get-buffer-process buf))) - (while (and proc (eq (process-status proc) 'run)) - (accept-process-output proc)) - (switch-to-buffer buf) - (when argument - (transient--goto-argument-description argument)))) - -(defun transient--describe-function (fn) - (describe-function fn) - (select-window (get-buffer-window (help-buffer)))) - -(defun transient--goto-argument-description (arg) - (goto-char (point-min)) - (let ((case-fold-search nil) - ;; This matches preceding/proceeding options. Options - ;; such as "-a", "-S[]", and "--grep=" - ;; are matched by this regex without the shy group. - ;; The ". " in the shy group is for options such as - ;; "-m parent-number", and the "-[^[:space:]]+ " is - ;; for options such as "--mainline parent-number" - (others "-\\(?:. \\|-[^[:space:]]+ \\)?[^[:space:]]+")) - (when (re-search-forward - (if (equal arg "--") - ;; Special case. - "^[\t\s]+\\(--\\(?: \\|$\\)\\|\\[--\\]\\)" - ;; Should start with whitespace and may have - ;; any number of options before and/or after. - (format - "^[\t\s]+\\(?:%s, \\)*?\\(?1:%s\\)%s\\(?:, %s\\)*$" - others - ;; Options don't necessarily end in an "=" - ;; (e.g., "--gpg-sign[=]") - (string-remove-suffix "=" arg) - ;; Simple options don't end in an "=". Splitting this - ;; into 2 cases should make getting false positives - ;; less likely. - (if (string-suffix-p "=" arg) - ;; "[^[:space:]]*[^.[:space:]]" matches the option - ;; value, which is usually after the option name - ;; and either '=' or '[='. The value can't end in - ;; a period, as that means it's being used at the - ;; end of a sentence. The space is for options - ;; such as '--mainline parent-number'. - "\\(?: \\|\\[?=\\)[^[:space:]]*[^.[:space:]]" - ;; Either this doesn't match anything (e.g., "-a"), - ;; or the option is followed by a value delimited - ;; by a "[", "<", or ":". A space might appear - ;; before this value, as in "-f ". The - ;; space alternative is for options such as - ;; "-m parent-number". - "\\(?:\\(?: \\| ?[\\[<:]\\)[^[:space:]]*[^.[:space:]]\\)?") - others)) - nil t) - (goto-char (match-beginning 1))))) - -(defun transient--insert-help () - (unless (looking-back "\n\n" 2) - (insert "\n")) - (when transient--helpp - (insert - (format (propertize "\ -Type a %s to show help for that suffix command, or %s to show manual. -Type %s to exit help.\n" - 'face 'transient-heading) - (propertize "" 'face 'transient-key) - (propertize "?" 'face 'transient-key) - (propertize "C-g" 'face 'transient-key)))) - (when transient--editp - (unless transient--helpp - (insert - (format (propertize "\ -Type a %s to set level for that suffix command. -Type %s to set what levels are available for this prefix command.\n" - 'face 'transient-heading) - (propertize "" 'face 'transient-key) - (propertize "C-x l" 'face 'transient-key)))) - (with-slots (level) transient--prefix - (insert - (format (propertize " -Suffixes on levels %s are available. -Suffixes on levels %s and %s are unavailable.\n" - 'face 'transient-heading) - (propertize (format "1-%s" level) - 'face 'transient-enabled-suffix) - (propertize " 0 " - 'face 'transient-disabled-suffix) - (propertize (format ">=%s" (1+ level)) - 'face 'transient-disabled-suffix)))))) - -(defvar transient-resume-mode-map - (let ((map (make-sparse-keymap))) - (define-key map [remap Man-quit] 'transient-resume) - (define-key map [remap Info-exit] 'transient-resume) - (define-key map [remap quit-window] 'transient-resume) - map) - "Keymap for `transient-resume-mode'. - -This keymap remaps every command that would usually just quit the -documentation buffer to `transient-resume', which additionally -resumes the suspended transient.") - -(define-minor-mode transient-resume-mode - "Auxiliary minor-mode used to resume a transient after viewing help.") - -;;; Compatibility -;;;; Popup Navigation - -(defun transient-popup-navigation-help () - "Inform the user how to enable popup navigation commands." - (interactive) - (message "This command is only available if `%s' is non-nil" - 'transient-enable-popup-navigation)) - -(define-button-type 'transient-button - 'face nil - 'action (lambda (button) - (let ((command (button-get button 'command))) - ;; Yes, I know that this is wrong(tm). - ;; Unfortunately it is also necessary. - (setq this-original-command command) - (call-interactively command)))) - -(defvar transient-popup-navigation-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "") 'transient-noop) - (define-key map (kbd "") 'transient-mouse-push-button) - (define-key map (kbd "RET") 'transient-push-button) - (define-key map (kbd "") 'transient-backward-button) - (define-key map (kbd "C-p") 'transient-backward-button) - (define-key map (kbd "") 'transient-forward-button) - (define-key map (kbd "C-n") 'transient-forward-button) - (define-key map (kbd "C-r") 'transient-isearch-backward) - (define-key map (kbd "C-s") 'transient-isearch-forward) - map)) - -(defun transient-mouse-push-button (&optional pos) - "Invoke the suffix the user clicks on." - (interactive (list last-command-event)) - (push-button pos)) - -(defun transient-push-button () - "Invoke the selected suffix command." - (interactive) - (with-selected-window transient--window - (push-button))) - -(defun transient-backward-button (n) - "Move to the previous button in the transient popup buffer. -See `backward-button' for information about N." - (interactive "p") - (with-selected-window transient--window - (backward-button n t))) - -(defun transient-forward-button (n) - "Move to the next button in the transient popup buffer. -See `forward-button' for information about N." - (interactive "p") - (with-selected-window transient--window - (forward-button n t))) - -(defun transient--goto-button (command) - (if (not command) - (forward-button 1) - (while (and (ignore-errors (forward-button 1)) - (not (eq (button-get (button-at (point)) 'command) command)))) - (unless (eq (button-get (button-at (point)) 'command) command) - (goto-char (point-min)) - (forward-button 1)))) - -;;;; Popup Isearch - -(defvar transient--isearch-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map isearch-mode-map) - (define-key map [remap isearch-exit] 'transient-isearch-exit) - (define-key map [remap isearch-cancel] 'transient-isearch-cancel) - (define-key map [remap isearch-abort] 'transient-isearch-abort) - map)) - -(defun transient-isearch-backward (&optional regexp-p) - "Do incremental search backward. -With a prefix argument, do an incremental regular expression -search instead." - (interactive "P") - (transient--isearch-setup) - (let ((isearch-mode-map transient--isearch-mode-map)) - (isearch-mode nil regexp-p))) - -(defun transient-isearch-forward (&optional regexp-p) - "Do incremental search forward. -With a prefix argument, do an incremental regular expression -search instead." - (interactive "P") - (transient--isearch-setup) - (let ((isearch-mode-map transient--isearch-mode-map)) - (isearch-mode t regexp-p))) - -(defun transient-isearch-exit () - "Like `isearch-exit' but adapted for `transient'." - (interactive) - (isearch-exit) - (transient--isearch-exit)) - -(defun transient-isearch-cancel () - "Like `isearch-cancel' but adapted for `transient'." - (interactive) - (condition-case nil (isearch-cancel) (quit)) - (transient--isearch-exit)) - -(defun transient-isearch-abort () - "Like `isearch-abort' but adapted for `transient'." - (interactive) - (condition-case nil (isearch-abort) (quit)) - (transient--isearch-exit)) - -(defun transient--isearch-setup () - (select-window transient--window) - (transient--suspend-override)) - -(defun transient--isearch-exit () - (select-window transient--original-window) - (transient--resume-override)) - -;;;; Edebug - -(defun transient--edebug--recursive-edit (fn arg-mode) - (transient--debug 'edebug--recursive-edit) - (if (not transient--prefix) - (funcall fn arg-mode) - (transient--suspend-override t) - (funcall fn arg-mode) - (transient--resume-override t))) - -(advice-add 'edebug--recursive-edit :around 'transient--edebug--recursive-edit) - -(defun transient--abort-edebug () - (when (bound-and-true-p edebug-active) - (transient--emergency-exit))) - -(advice-add 'abort-recursive-edit :before 'transient--abort-edebug) -(advice-add 'top-level :before 'transient--abort-edebug) - -(defun transient--edebug-command-p () - (and (bound-and-true-p edebug-active) - (or (memq this-command '(top-level abort-recursive-edit)) - (string-prefix-p "edebug" (symbol-name this-command))))) - -;;;; Miscellaneous - -(declare-function which-key-mode "which-key" (&optional arg)) - -(defun transient--suspend-which-key-mode () - (when (bound-and-true-p which-key-mode) - (which-key-mode -1) - (add-hook 'post-transient-hook 'transient--resume-which-key-mode))) - -(defun transient--resume-which-key-mode () - (unless transient--prefix - (which-key-mode 1) - (remove-hook 'post-transient-hook 'transient--resume-which-key-mode))) - -(defun transient-bind-q-to-quit () - "Modify some keymaps to bind \"q\" to the appropriate quit command. - -\"C-g\" is the default binding for such commands now, but Transient's -predecessor Magit-Popup used \"q\" instead. If you would like to get -that binding back, then call this function in your init file like so: - - (with-eval-after-load \\='transient - (transient-bind-q-to-quit)) - -Individual transients may already bind \"q\" to something else -and such a binding would shadow the quit binding. If that is the -case then \"Q\" is bound to whatever \"q\" would have been bound -to by setting `transient-substitute-key-function' to a function -that does that. Of course \"Q\" may already be bound to something -else, so that function binds \"M-q\" to that command instead. -Of course \"M-q\" may already be bound to something else, but -we stop there." - (define-key transient-base-map "q" 'transient-quit-one) - (define-key transient-sticky-map "q" 'transient-quit-seq) - (setq transient-substitute-key-function - 'transient-rebind-quit-commands)) - -(defun transient-rebind-quit-commands (obj) - "See `transient-bind-q-to-quit'." - (let ((key (oref obj key))) - (cond ((string-equal key "q") "Q") - ((string-equal key "Q") "M-q") - (t key)))) - -(defun transient--force-fixed-pitch () - (require 'face-remap) - (face-remap-reset-base 'default) - (face-remap-add-relative 'default 'fixed-pitch)) - -;;;; Missing from Emacs - -(defun transient--seq-reductions-from (function sequence initial-value) - (let ((acc (list initial-value))) - (seq-doseq (elt sequence) - (push (funcall function (car acc) elt) acc)) - (nreverse acc))) - -;;; Font-Lock - -(defconst transient-font-lock-keywords - (eval-when-compile - `((,(concat "(" - (regexp-opt (list "define-transient-command" - "define-infix-command" - "define-infix-argument" - "define-suffix-command") - t) - "\\_>[ \t'\(]*" - "\\(\\(?:\\sw\\|\\s_\\)+\\)?") - (1 'font-lock-keyword-face) - (2 'font-lock-function-name-face nil t))))) - -(font-lock-add-keywords 'emacs-lisp-mode transient-font-lock-keywords) - -;;; _ -(provide 'transient) -;; Local Variables: -;; indent-tabs-mode: nil -;; End: -;;; transient.el ends here diff --git a/elpa/transient-20200226.1612/transient.elc b/elpa/transient-20200226.1612/transient.elc deleted file mode 100644 index 2b97687ac12b4ebdf2fdeff3b4b50bc5a315c99c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127025 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 diff --git a/elpa/transient-20200226.1612/transient.info b/elpa/transient-20200226.1612/transient.info deleted file mode 100644 index ce283861..00000000 --- a/elpa/transient-20200226.1612/transient.info +++ /dev/null @@ -1,2441 +0,0 @@ -This is transient.info, produced by makeinfo version 6.5 from -transient.texi. - - Copyright (C) 2018-2020 Jonas Bernoulli - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -INFO-DIR-SECTION Emacs -START-INFO-DIR-ENTRY -* Transient: (transient). Transient Commands. -END-INFO-DIR-ENTRY - - -File: transient.info, Node: Top, Next: Introduction, Up: (dir) - -Transient User and Developer Manual -*********************************** - -Taking inspiration from prefix keys and prefix arguments, Transient -implements a similar abstraction involving a prefix command, infix -arguments and suffix commands. We could call this abstraction a -"transient command", but because it always involves at least two -commands (a prefix and a suffix) we prefer to call it just a -"transient". - - When the user calls a transient prefix command, then a transient -(temporary) keymap is activated, which binds the transient’s infix and -suffix commands, and functions that control the transient state are -added to ‘pre-command-hook’ and ‘post-command-hook’. The available -suffix and infix commands and their state are shown in a popup buffer -until the transient is exited by invoking a suffix command. - - Calling an infix command causes its value to be changed, possibly by -reading a new value in the minibuffer. - - Calling a suffix command usually causes the transient to be exited -but suffix commands can also be configured to not exit the transient. - -This manual is for Transient version 0.2.0. - - Copyright (C) 2018-2020 Jonas Bernoulli - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -* Menu: - -* Introduction:: -* Usage:: -* Other Options:: -* Modifying Existing Transients:: -* Defining New Commands:: -* Classes and Methods:: -* Related Abstractions and Packages:: -* FAQ:: -* Keystroke Index:: -* Command Index:: -* Function Index:: -* Variable Index:: - -— The Detailed Node Listing — - -Usage - -* Invoking Transients:: -* Aborting and Resuming Transients:: -* Common Suffix Commands:: -* Saving Values:: -* Using History:: -* Getting Help for Suffix Commands:: -* Enabling and Disabling Suffixes:: -* Other Commands:: - -Defining New Commands - -* Defining Transients:: -* Binding Suffix and Infix Commands:: -* Defining Suffix and Infix Commands:: -* Using Infix Arguments:: -* Transient State:: - -Binding Suffix and Infix Commands - -* Group Specifications:: -* Suffix Specifications:: - - -Classes and Methods - -* Group Classes:: -* Group Methods:: -* Prefix Classes:: -* Suffix Classes:: -* Suffix Methods:: -* Prefix Slots:: -* Suffix Slots:: -* Predicate Slots:: - -Suffix Methods - -* Suffix Value Methods:: -* Suffix Format Methods:: - - -Related Abstractions and Packages - -* Comparison With Prefix Keys and Prefix Arguments:: -* Comparison With Other Packages:: - - - -File: transient.info, Node: Introduction, Next: Usage, Prev: Top, Up: Top - -1 Introduction -************** - -Taking inspiration from prefix keys and prefix arguments, Transient -implements a similar abstraction involving a prefix command, infix -arguments and suffix commands. We could call this abstraction a -"transient command", but because it always involves at least two -commands (a prefix and a suffix) we prefer to call it just a -"transient". - - Transient keymaps are a feature provided by Emacs. Transients as - implemented by this package involve the use of transient keymaps. - - Emacs provides a feature that it calls "prefix commands". When we - talk about "prefix commands" in this manual, then we mean our own - kind of "prefix commands", unless specified otherwise. To avoid - ambiguity we sometimes use the terms "transient prefix command" for - our kind and "regular prefix command" for Emacs’ kind. - - When the user calls a transient prefix command, then a transient -(temporary) keymap is activated, which binds the transient’s infix and -suffix commands, and functions that control the transient state are -added to ‘pre-command-hook’ and ‘post-command-hook’. The available -suffix and infix commands and their state are shown in a popup buffer -until the transient state is exited by invoking a suffix command. - - Calling an infix command causes its value to be changed. How that is -done depends on the type of the infix command. The simplest case is an -infix command that represents a command-line argument that does not take -a value. Invoking such an infix command causes the switch to be toggled -on or off. More complex infix commands may read a value from the user, -using the minibuffer. - - Calling a suffix command usually causes the transient to be exited; -the transient keymaps and hook functions are removed, the popup buffer -no longer shows information about the (no longer bound) suffix commands, -the values of some public global variables are set, while some internal -global variables are unset, and finally the command is actually called. -Suffix commands can also be configured to not exit the transient. - - A suffix command can, but does not have to, use the infix arguments -in much the same way it can choose to use or ignore the prefix -arguments. For a suffix command that was invoked from a transient the -variable ‘current-transient-suffixes’ and the function ‘transient-args’ -serve about the same purpose as the variables ‘prefix-arg’ and -‘current-prefix-arg’ do for any command that was called after the prefix -arguments have been set using a command such as ‘universal-argument’. - - The information shown in the popup buffer while a transient is active -looks a bit like this: - - ,----------------------------------------- - |Arguments - | -f Force (--force) - | -a Annotate (--annotate) - | - |Create - | t tag - | r release - `----------------------------------------- - - This is a simplified version of ‘magit-tag’. Info manuals do not - support images or colored text, so the above "screenshot" lacks - some information; in practice you would be able to tell whether the - arguments ‘--force’ and ‘--annotate’ are enabled or not based on - their color. - - Transient can be used to implement simple "command dispatchers". The -main benefit then is that the user can see all the available commands in -a popup buffer. That is useful by itself because it frees the user from -having to remember all the keys that are valid after a certain prefix -key or command. Magit’s ‘magit-dispatch’ command is an example of using -Transient to merely implement a command dispatcher. - - In addition to that, Transient also allows users to interactively -pass arguments to commands. These arguments can be much more complex -than what is reasonable when using prefix arguments. There is a limit -to how many aspects of a command can be controlled using prefix -arguments. Furthermore what a certain prefix argument means for -different commands can be completely different, and users have to read -documentation to learn and then commit to memory what a certain prefix -argument means to a certain command. - - Transient suffix commands on the other hand can accept dozens of -different arguments without the user having to remember anything. When -using Transient, then one can call a command with arguments that are -just as complex as when calling the same function non-interactively -using code. - - Invoking a transient command with arguments is similar to invoking a -command in a shell with command-line completion and history enabled. -One benefit of the Transient interface is that it remembers history not -only on a global level ("this command was invoked using these arguments -and previously it was invoked using those other arguments"), but also -remembers the values of individual arguments independently. See *note -Using History::. - - After a transient prefix command is invoked ‘C-h ’ can be used -to show the documentation for the infix or suffix command that ‘’ -is bound to (see *note Getting Help for Suffix Commands::) and infixes -and suffixes can be removed from the transient using ‘C-x l ’. -Infixes and suffixes that are disabled by default can be enabled the -same way. See *note Enabling and Disabling Suffixes::. - - Transient ships with support for a few different types of specialized -infix commands. A command that sets a command line option for example -has different needs than a command that merely toggles a boolean flag. -Additionally Transient provides abstractions for defining new types, -which the author of Transient did not anticipate (or didn’t get around -to implementing yet). - - -File: transient.info, Node: Usage, Next: Other Options, Prev: Introduction, Up: Top - -2 Usage -******* - -* Menu: - -* Invoking Transients:: -* Aborting and Resuming Transients:: -* Common Suffix Commands:: -* Saving Values:: -* Using History:: -* Getting Help for Suffix Commands:: -* Enabling and Disabling Suffixes:: -* Other Commands:: - - -File: transient.info, Node: Invoking Transients, Next: Aborting and Resuming Transients, Up: Usage - -2.1 Invoking Transients -======================= - -A transient prefix command is invoked like any other command by pressing -the key that is bound to that command. The main difference to other -commands is that a transient prefix command activates a transient -keymap, which temporarily binds the transient’s infix and suffix -commands. Bindings from other keymaps may, or may not, be disabled -while the transient state is in effect. - - There are two kinds of commands that are available after invoking a -transient prefix command; infix and suffix commands. Infix commands set -some value (which is then shown in a popup buffer), without leaving the -transient. Suffix commands on the other hand usually quit the transient -and they may use the values set by the infix commands, i.e. the infix -*arguments*. - - Instead of setting arguments to be used by a suffix command, infix -commands may also set some value by side-effect. - - -File: transient.info, Node: Aborting and Resuming Transients, Next: Common Suffix Commands, Prev: Invoking Transients, Up: Usage - -2.2 Aborting and Resuming Transients -==================================== - -To quit the transient without invoking a suffix command press ‘C-g’. - - Key bindings in transient keymaps may be longer than a single event. -After pressing a valid prefix key, all commands whose bindings do not -begin with that prefix key are temporarily unavailable and grayed out. -To abort the prefix key press ‘C-g’ (which in this case only quits the -prefix key, but not the complete transient). - - A transient prefix command can be bound as a suffix of another -transient. Invoking such a suffix replaces the current transient state -with a new transient state, i.e. the available bindings change and the -information displayed in the popup buffer is updated accordingly. -Pressing ‘C-g’ while a nested transient is active only quits the -innermost transient, causing a return to the previous transient. - - ‘C-q’ or ‘C-z’ on the other hand always exits all transients. If you -use the latter, then you can later resume the stack of transients using -‘M-x transient-resume’. - -‘C-g’ (‘transient-quit-seq’) -‘C-g’ (‘transient-quit-one’) - - This key quits the currently active incomplete key sequence, if - any, or else the current transient. When quitting the current - transient, then it returns to the previous transient, if any. - - Transient’s predecessor bound ‘q’ instead of ‘C-g’ to the quit -command. To learn how to get that binding back see -‘transient-bind-q-to-quit’’s doc string. - -‘C-q’ (‘transient-quit-all’) - - This command quits the currently active incomplete key sequence, if - any, and all transients, including the active transient and all - suspended transients, if any. - -‘C-z’ (‘transient-suspend’) - - Like ‘transient-quit-all’, this command quits an incomplete key - sequence, if any, and all transients. Additionally it saves the - stack of transients so that it can easily be resumed (which is - particularly useful if you quickly need to do "something else" and - the stack is deeper than a single transient and/or you have already - changed the values of some infix arguments). - - Note that only a single stack of transients can be saved at a time. - If another stack is already saved, then saving a new stack discards - the previous stack. - -‘M-x transient-resume’ (‘transient-resume’) - - This command resumes the previously suspended stack of transients, - if any. - - -File: transient.info, Node: Common Suffix Commands, Next: Saving Values, Prev: Aborting and Resuming Transients, Up: Usage - -2.3 Common Suffix Commands -========================== - -A few shared suffix commands are available in all transients. These -suffix commands are not shown in the popup buffer by default. - - Most of these commands are bound to ‘C-x ’ and after pressing -‘C-x’ a section featuring all common commands is temporarily shown in -the popup buffer. After invoking one of these commands, that section -disappears again. Note however that one of these commands is described -as "Show common permanently"; invoke that if you want the common -commands to always be shown for all transients. - -‘C-x t’ (‘transient-toggle-common’) - - This command toggles whether the generic commands that are common - to all transients are always displayed or only after typing the - incomplete prefix key sequence ‘C-x’. This only affects the - current Emacs session. - - -- User Option: transient-show-common-commands - - This option controls whether shared suffix commands are shown - alongside the transient-specific infix and suffix commands. By - default the shared commands are not shown to avoid overwhelming the - user with to many options. - - While a transient is active, pressing ‘C-x’ always shows the common - command. The value of this option can be changed for the current - Emacs session by typing ‘C-x t’ while a transient is active. - - The other common commands are described in either the previous node -or in one of the following nodes. - - Some of Transient’s key bindings differ from the respective bindings -of Magit-Popup; see *note FAQ:: for more information. - - -File: transient.info, Node: Saving Values, Next: Using History, Prev: Common Suffix Commands, Up: Usage - -2.4 Saving Values -================= - -After setting the infix arguments in a transient, the user can save -those arguments for future invocations. - - Most transients will start out with the saved arguments when they are -invoked. There are a few exceptions though. Some transients are -designed so that the value that they use is stored externally as the -buffer-local value of some variable. Invoking such a transient again -uses the buffer-local value. (1) - - If the user does not save the value and just exits using a regular -suffix command, then the value is merely saved to the transient’s -history. That value won’t be used when the transient is next invoked -but it is easily accessible (see *note Using History::). - -‘C-x s’ (‘transient-set’) - - This command saves the value of the active transient for this Emacs - session. - -‘C-x C-s’ (‘transient-save’) - - Save the value of the active transient persistently across Emacs - sessions. - - -- User Option: transient-values-file - - This file is used to persist the values of transients between Emacs - sessions. - - ---------- Footnotes ---------- - - (1) ‘magit-diff’ and ‘magit-log’ are two prominent examples, and -their handling of buffer-local values is actually a bit more complicated -than outlined above and even customizable. This is something I am -rethinking, but I don’t want to rush any changes.) - - -File: transient.info, Node: Using History, Next: Getting Help for Suffix Commands, Prev: Saving Values, Up: Usage - -2.5 Using History -================= - -Every time the user invokes a suffix command the transient’s current -value is saved to its history. These values can be cycled through the -same way one can cycle through the history of commands that read -user-input in the minibuffer. - -‘M-p’ (‘transient-history-prev’) - - This command switches to the previous value used for the active - transient. - -‘M-n’ (‘transient-history-next’) - - This command switches to the next value used for the active - transient. - - In addition to the transient-wide history, Transient of course -supports per-infix history. When an infix reads user-input using the -minibuffer, then the user can use the regular minibuffer history -commands to cycle through previously used values. Usually the same keys -as those mentioned above are bound to those commands. - - Authors of transients should arrange for different infix commands -that read the same kind of value to also use the same history key (see -*note Suffix Slots::). - - Both kinds of history are saved to a file when Emacs is exited. - - -- User Option: transient-history-file - - This file is used to persist the history of transients and their - infixes between Emacs sessions. - - -- User Option: transient-history-limit - - This option controls how many history elements are kept at the time - the history is saved in ‘transient-history-file’. - - -File: transient.info, Node: Getting Help for Suffix Commands, Next: Enabling and Disabling Suffixes, Prev: Using History, Up: Usage - -2.6 Getting Help for Suffix Commands -==================================== - -Transients can have many suffixes and infixes that the user might not be -familiar with. To make it trivial to get help for these, Transient -provides access to the documentation directly from the active transient. - -‘C-h’ (‘transient-help’) - - This command enters help mode. When help mode is active, then - typing ‘’ shows information about the suffix command that - ‘’ normally is bound to (instead of invoking it). Pressing - ‘C-h’ a second time shows information about the _prefix_ command. - - After typing ‘’ the stack of transient states is suspended and - information about the suffix command is shown instead. Typing ‘q’ - in the help buffer buries that buffer and resumes the transient - state. - - What sort of documentation is shown depends on how the transient was -defined. For infix commands that represent command-line arguments this -ideally shows the appropriate manpage. ‘transient-help’ then tries to -jump to the correct location within that. Info manuals are also -supported. The fallback is to show the command’s doc string, for -non-infix suffixes this is usually appropriate. - - -File: transient.info, Node: Enabling and Disabling Suffixes, Next: Other Commands, Prev: Getting Help for Suffix Commands, Up: Usage - -2.7 Enabling and Disabling Suffixes -=================================== - -The user base of a package that uses transients can be very diverse. -This is certainly the case for Magit; some users have been using it and -Git for a decade, while others are just getting started now. - - For that reason a mechanism is needed that authors can use to -classify a transient’s infixes and suffixes along the -essentials...everything spectrum. We use the term "levels" to describe -that mechanism. - - Each suffix command is placed on a level and each transient has a -level (called transient-level), which controls which suffix commands are -available. Integers between 1 and 7 (inclusive) are valid levels. For -suffixes, 0 is also valid; it means that the suffix is not displayed at -any level. - - The levels of individual transients and/or their individual suffixes -can be changed interactively, by invoking the transient and then -pressing ‘C-x l’ to enter the "edit" mode, see below. - - The default level for both transients and their suffixes is 4. The -‘transient-default-level’ option only controls the default for -transients. The default suffix level is always 4. The authors of -transients should place certain suffixes on a higher level, if they -expect that it won’t be of use to most users, and they should place very -important suffixes on a lower level, so that they remain available even -if the user lowers the transient level. - - (Magit currently places nearly all suffixes on level 4 and lower -levels are not used at all yet. So for the time being you should not -set a lower default level and using a higher level might not give you as -many additional suffixes as you hoped.) - - -- User Option: transient-default-level - - This option controls which suffix levels are made available by - default. It sets the transient-level for transients for which the - user has not set that individually. - - -- User Option: transient-levels-file - - This file is used to persist the levels of transients and their - suffixes between Emacs sessions. - -‘C-x l’ (‘transient-set-level’) - - This command enters edit mode. When edit mode is active, then all - infixes and suffixes that are currently usable are displayed along - with their levels. The colors of the levels indicate whether they - are enabled or not. The level of the transient is also displayed - along with some usage information. - - In edit mode, pressing the key that would usually invoke a certain - suffix instead prompts the user for the level that suffix should be - placed on. - - Help mode is available in edit mode. - - To change the transient level press ‘C-x l’ again. - - To exit edit mode press ‘C-g’. - - Note that edit mode does not display any suffixes that are not - currently usable. ‘magit-rebase’ for example shows different - suffixes depending on whether a rebase is already in progress or - not. The predicates also apply in edit mode. - - Therefore, to control which suffixes are available given a certain - state, you have to make sure that that state is currently active. - - -File: transient.info, Node: Other Commands, Prev: Enabling and Disabling Suffixes, Up: Usage - -2.8 Other Commands -================== - -When invoking a transient in a small frame, the transient window may not -show the complete buffer, making it necessary to scroll, using the -following commands. These commands are never shown in the transient -window, and the key bindings are the same as for ‘scroll-up-command’ and -‘scroll-down-command’ in other buffers. - - -- Command: transient-scroll-up arg - - This command scrolls text of transient popup window upward ARG - lines. If ARG is ‘nil’, then it scrolls near full screen. This is - a wrapper around ‘scroll-up-command’ (which see). - - -- Command: transient-scroll-down arg - - This command scrolls text of transient popup window down ARG lines. - If ARG is ‘nil’, then it scrolls near full screen. This is a - wrapper around ‘scroll-down-command’ (which see). - - -File: transient.info, Node: Other Options, Next: Modifying Existing Transients, Prev: Usage, Up: Top - -3 Other Options -*************** - - -- User Option: transient-show-popup - - This option controls whether the current transient’s infix and - suffix commands are shown in the popup buffer. - - • If ‘t’ (the default) then the popup buffer is shown as soon as - a transient prefix command is invoked. - - • If ‘nil’, then the popup buffer is not shown unless the user - explicitly requests it, by pressing an incomplete prefix key - sequence. - - • If a number, then the a brief one-line summary is shown - instead of the popup buffer. If zero or negative, then not - even that summary is shown; only the pressed key itself is - shown. - - The popup is shown when the user explicitly requests it by - pressing an incomplete prefix key sequence. Unless this is - zero, then the popup is shown after that many seconds of - inactivity (using the absolute value). - - -- User Option: transient-enable-popup-navigation - - This option controls whether navigation commands are enabled in the - transient popup. - - While a transient is active the transient popup buffer is not the - current buffer, making it necessary to use dedicated commands to - act on that buffer itself. This is disabled by default. If this - option is non-nil, then the following features are available: - - • ‘’ moves the cursor to the previous suffix. ‘’ - moves the cursor to the next suffix. ‘RET’ invokes the suffix - the cursor is on. - - • ‘’ invokes the clicked on suffix. - - • ‘C-s’ and ‘C-r’ start isearch in the popup buffer. - - -- User Option: transient-display-buffer-action - - This option specifies the action used to display the transient - popup buffer. The transient popup buffer is displayed in a window - using ‘(display-buffer buf transient-display-buffer-action)’. - - The value of this option has the form ‘(FUNCTION . ALIST)’, where - FUNCTION is a function or a list of functions. Each such function - should accept two arguments: a buffer to display and an alist of - the same form as ALIST. See *note (elisp)Choosing Window::. - - The default is ‘(display-buffer-in-side-window (side . bottom))’. - This displays the window at the bottom of the selected frame. - Another useful value is ‘(display-buffer-below-selected)’. This is - what ‘magit-popup’ used by default. For more alternatives see - *note (elisp)Display Action Functions::. - - It may be possible to display the window in another frame, but - whether that works in practice depends on the window-manager. If - the window manager selects the new window (Emacs frame), then it - doesn’t work. - - If you change the value of this option, then you might also want to - change the value of ‘transient-mode-line-format’. - - -- User Option: transient-mode-line-format - - This option controls whether the transient popup buffer has a - mode-line, separator line, or neither. - - If ‘nil’, then the buffer has no mode-line. If the buffer is not - displayed right above the echo area, then this probably is not a - good value. - - If ‘line’ (the default), then the buffer also has no mode-line, but - a thin line is drawn instead, using the background color of the - face ‘transient-separator’. Termcap frames cannot display thin - lines and therefore fallback to treating ‘line’ like ‘nil’. - - Otherwise this can be any mode-line format. See *note (elisp)Mode - Line Format:: for details. - - -- User Option: transient-read-with-initial-input - - This option controls whether the last history element is used as - the initial minibuffer input when reading the value of an infix - argument from the user. If ‘nil’, then there is no initial input - and the first element has to be accessed the same way as the older - elements. - - -- User Option: transient-highlight-mismatched-keys - - This option controls whether key bindings of infix commands that do - not match the respective command-line argument should be - highlighted. For other infix commands this option has no effect. - - When this option is non-nil, then the key binding for an infix - argument is highlighted when only a long argument (e.g. - ‘--verbose’) is specified but no shorthand (e.g ‘-v’). In the rare - case that a shorthand is specified but the key binding does not - match, then it is highlighted differently. - - Highlighting mismatched key bindings is useful when learning the - arguments of the underlying command-line tool; you wouldn’t want to - learn any short-hands that do not actually exist. - - The highlighting is done using one of the faces - ‘transient-mismatched-key’ and ‘transient-nonstandard-key’. - - -- User Option: transient-substitute-key-function - - This function is used to modify key bindings. If the value of this - option is nil (the default), then no substitution is performed. - - This function is called with one argument, the prefix object, and - must return a key binding description, either the existing key - description it finds in the ‘key’ slot, or the key description that - replaces the prefix key. It could be used to make other - substitutions, but that is discouraged. - - For example, ‘=’ is hard to reach using my custom keyboard layout, - so I substitute ‘(’ for that, which is easy to reach using a layout - optimized for lisp. - - (setq transient-substitute-key-function - (lambda (obj) - (let ((key (oref obj key))) - (if (string-match "\\`\\(=\\)[a-zA-Z]" key) - (replace-match "(" t t key 1) - key)))) - - -- User Option: transient-detect-key-conflicts - - This option controls whether key binding conflicts should be - detected at the time the transient is invoked. If so, then this - results in an error, which prevents the transient from being used. - Because of that, conflicts are ignored by default. - - Conflicts cannot be determined earlier, i.e. when the transient is - being defined and when new suffixes are being added, because at - that time there can be false-positives. It is actually valid for - multiple suffixes to share a common key binding, provided the - predicates of those suffixes prevent that more than one of them is - enabled at a time. - - -- User Option: transient-force-fixed-pitch - - This option controls whether to force the use of a monospaced font - in popup buffer. Even if you use a proportional font for the - ‘default’ face, you might still want to use a monospaced font in - transient’s popup buffer. Setting this option to t causes - ‘default’ to be remapped to ‘fixed-pitch’ in that buffer. - - -File: transient.info, Node: Modifying Existing Transients, Next: Defining New Commands, Prev: Other Options, Up: Top - -4 Modifying Existing Transients -******************************* - -To an extent transients can be customized interactively, see *note -Enabling and Disabling Suffixes::. This section explains how existing -transients can be further modified non-interactively. - - The following functions share a few arguments: - - • PREFIX is a transient prefix command, a symbol. - - • SUFFIX is a transient infix or suffix specification in the same - form as expected by ‘define-transient-command’. Note that an infix - is a special kind of suffix. Depending on context "suffixes" means - "suffixes (including infixes)" or "non-infix suffixes". Here it - means the former. See *note Suffix Specifications::. - - SUFFIX may also be a group in the same form as expected by - ‘define-transient-command’. See *note Group Specifications::. - - • LOC is a command, a key vector, a key description (a string as - returned by ‘key-description’), or a list specifying coordinates - (the last element may also be a command or key). For example ‘(1 0 - -1)’ identifies the last suffix (‘-1’) of the first subgroup (‘0’) - of the second group (‘1’). - - If LOC is a list of coordinates, then it can be used to identify a - group, not just an individual suffix command. - - The function ‘transient-get-suffix’ can be useful to determine - whether a certain coordination list identifies the suffix or group - that you expect it to identify. In hairy cases it may be necessary - to look at the definition of the transient prefix command. - - These functions operate on the information stored in the -‘transient--layout’ property of the PREFIX symbol. Suffix entries in -that tree are not objects but have the form ‘(LEVEL CLASS PLIST)’, where -plist should set at least ‘:key’, ‘:description’ and ‘:command’. - - -- Function: transient-insert-suffix prefix loc suffix - - This function inserts suffix or group SUFFIX into PREFIX before - LOC. - - -- Function: transient-append-suffix prefix loc suffix - - This function inserts suffix or group SUFFIX into PREFIX after LOC. - - -- Function: transient-replace-suffix prefix loc suffix - - This function replaces the suffix or group at LOC in PREFIX with - suffix or group SUFFIX. - - -- Function: transient-remove-suffix prefix loc - - This function removes the suffix or group at LOC in PREFIX. - - -- Function: transient-get-suffix prefix loc - - This function returns the suffix or group at LOC in PREFIX. The - returned value has the form mentioned above. - - -- Function: transient-suffix-put prefix loc prop value - - This function edits the suffix or group at LOC in PREFIX, by - setting the PROP of its plist to VALUE. - - Most of these functions do not signal an error if they cannot perform -the requested modification. The functions that insert new suffixes show -a warning if LOC cannot be found in PREFIX, without signaling an error. -The reason for doing it like this is that establishing a key binding -(and that is what we essentially are trying to do here) should not -prevent the rest of the configuration from loading. Among these -functions only ‘transient-get-suffix’ and ‘transient-suffix-put’ may -signal an error. - - -File: transient.info, Node: Defining New Commands, Next: Classes and Methods, Prev: Modifying Existing Transients, Up: Top - -5 Defining New Commands -*********************** - -* Menu: - -* Defining Transients:: -* Binding Suffix and Infix Commands:: -* Defining Suffix and Infix Commands:: -* Using Infix Arguments:: -* Transient State:: - - -File: transient.info, Node: Defining Transients, Next: Binding Suffix and Infix Commands, Up: Defining New Commands - -5.1 Defining Transients -======================= - -A transient consists of a prefix command and at least one suffix -command, though usually a transient has several infix and suffix -commands. The below macro defines the transient prefix command *and* -binds the transient’s infix and suffix commands. In other words, it -defines the complete transient, not just the transient prefix command -that is used to invoke that transient. - - -- Macro: define-transient-command name arglist [docstring] [keyword - value]... group... [body...] - - This macro defines NAME as a transient prefix command and binds the - transient’s infix and suffix commands. - - ARGLIST are the arguments that the prefix command takes. DOCSTRING - is the documentation string and is optional. - - These arguments can optionally be followed by keyword-value pairs. - Each key has to be a keyword symbol, either ‘:class’ or a keyword - argument supported by the constructor of that class. The - ‘transient-prefix’ class is used if the class is not specified - explicitly. - - GROUPs add key bindings for infix and suffix commands and specify - how these bindings are presented in the popup buffer. At least one - GROUP has to be specified. See *note Binding Suffix and Infix - Commands::. - - The BODY is optional. If it is omitted, then ARGLIST is ignored - and the function definition becomes: - - (lambda () - (interactive) - (transient-setup 'NAME)) - - If BODY is specified, then it must begin with an ‘interactive’ form - that matches ARGLIST, and it must call ‘transient-setup’. It may - however call that function only when some condition is satisfied. - - All transients have a (possibly ‘nil’) value, which is exported - when suffix commands are called, so that they can consume that - value. For some transients it might be necessary to have a sort of - secondary value, called a "scope". Such a scope would usually be - set in the command’s ‘interactive’ form and has to be passed to the - setup function: - - (transient-setup 'NAME nil nil :scope SCOPE) - - For example, the scope of the ‘magit-branch-configure’ transient is - the branch whose variables are being configured. - - -File: transient.info, Node: Binding Suffix and Infix Commands, Next: Defining Suffix and Infix Commands, Prev: Defining Transients, Up: Defining New Commands - -5.2 Binding Suffix and Infix Commands -===================================== - -The macro ‘define-transient-command’ is used to define a transient. -This defines the actual transient prefix command (see *note Defining -Transients::) and adds the transient’s infix and suffix bindings, as -described below. - - Users and third-party packages can add additional bindings using -functions such as ‘transient-insert-suffix’ (See *note Modifying -Existing Transients::). These functions take a "suffix specification" -as one of their arguments, which has the same form as the specifications -used in ‘define-transient-command’. - -* Menu: - -* Group Specifications:: -* Suffix Specifications:: - - -File: transient.info, Node: Group Specifications, Next: Suffix Specifications, Up: Binding Suffix and Infix Commands - -5.2.1 Group Specifications --------------------------- - -The suffix and infix commands of a transient are organized in groups. -The grouping controls how the descriptions of the suffixes are outlined -visually but also makes it possible to set certain properties for a set -of suffixes. - - Several group classes exist, some of which organize suffixes in -subgroups. In most cases the class does not have to be specified -explicitly, but see *note Group Classes::. - - Groups are specified in the call to ‘define-transient-command’, using -vectors. Because groups are represented using vectors, we cannot use -square brackets to indicate an optional element and instead use curly -brackets to do the latter. - - Group specifications then have this form: - - [{LEVEL} {DESCRIPTION} {KEYWORD VALUE}... ELEMENT...] - - The LEVEL is optional and defaults to 4. See *note Enabling and -Disabling Suffixes::. - - The DESCRIPTION is optional. If present it is used as the heading of -the group. - - The KEYWORD-VALUE pairs are optional. Each keyword has to be a -keyword symbol, either ‘:class’ or a keyword argument supported by the -constructor of that class. - - • One of these keywords, ‘:description’, is equivalent to specifying - DESCRIPTION at the very beginning of the vector. The - recommendation is to use ‘:description’ if some other keyword is - also used, for consistency, or DESCRIPTION otherwise, because it - looks better. - - • Likewise ‘:level’ is equivalent to LEVEL. - - • Other important keywords include the ‘:if...’ keywords. These - keywords control whether the group is available in a certain - situation. - - For example, one group of the ‘magit-rebase’ transient uses ‘:if - magit-rebase-in-progress-p’, which contains the suffixes that are - useful while rebase is already in progress; and another that uses - ‘:if-not magit-rebase-in-progress-p’, which contains the suffixes - that initiate a rebase. - - These predicates can also be used on individual suffixes and are - only documented once, see *note Predicate Slots::. - - • Finally the value of ‘:hide’, if non-nil, is a predicate that - controls whether the group is hidden by default. The key bindings - for suffixes of a hidden group should all use the same prefix key. - Pressing that prefix key should temporarily show the group and its - suffixes, which assumes that a predicate like this is used: - - (lambda () - (eq (car transient--redisplay-key) - ?\C-c)) ; the prefix key shared by all bindings - - The ELEMENTs are either all subgroups (vectors), or all suffixes -(lists) and strings. (At least currently no group type exists that -would allow mixing subgroups with commands at the same level, though in -principle there is nothing that prevents that.) - - If the ELEMENTs are not subgroups, then they can be a mixture of -lists that specify commands and strings. Strings are inserted verbatim. -The empty string can be used to insert gaps between suffixes, which is -particularly useful if the suffixes are outlined as a table. - - The form of suffix specifications is documented in the next node. - - -File: transient.info, Node: Suffix Specifications, Prev: Group Specifications, Up: Binding Suffix and Infix Commands - -5.2.2 Suffix Specifications ---------------------------- - -A transient’s suffix and infix commands are bound when the transient -prefix command is defined using ‘define-transient-command’, see *note -Defining Transients::. The commands are organized into groups, see -*note Group Specifications::. Here we describe the form used to bind an -individual suffix command. - - The same form is also used when later binding additional commands -using functions such as ‘transient-insert-suffix’, see *note Modifying -Existing Transients::. - - Note that an infix is a special kind of suffix. Depending on context -"suffixes" means "suffixes (including infixes)" or "non-infix suffixes". -Here it means the former. - - Suffix specifications have this form: - - ([LEVEL] [KEY] [DESCRIPTION] COMMAND|ARGUMENT [KEYWORD VALUE]...) - - LEVEL, KEY and DESCRIPTION can also be specified using the KEYWORDs -‘:level’, ‘:key’ and ‘:description’. If the object that is associated -with COMMAND sets these properties, then they do not have to be -specified here. You can however specify them here anyway, possibly -overriding the object’s values just for the binding inside this -transient. - - • LEVEL is the suffix level, an integer between 1 and 7. See *note - Enabling and Disabling Suffixes::. - - • KEY is the key binding, either a vector or key description string. - - • DESCRIPTION is the description, either a string or a function that - returns a string. The function should be a lambda expression to - avoid ambiguity. In some cases a symbol that is bound as a - function would also work but to be safe you should use - ‘:description’ in that case. - - The next element is either a command or an argument. This is the -only argument that is mandatory in all cases. - - • COMMAND is a symbol that is bound as a function, which has to be a - command. Any command will do; it does not need to have an object - associated with it (as would be the case if ‘define-suffix-command’ - or ‘define-infix-command’ were used to define it). - - As mentioned above, the object that is associated with a command - can be used to set the default for certain values that otherwise - have to be set in the suffix specification. Therefore if there is - no object, then you have to make sure to specify the KEY and the - DESCRIPTION. - - • The mandatory argument can also be a command-line argument, a - string. In that case an anonymous command is defined and bound. - - Instead of a string, this can also be a list of two strings, in - which case the first string is used as the short argument (which - can also be specified using ‘:shortarg’) and the second as the long - argument (which can also be specified using ‘:argument’). - - Only the long argument is displayed in the popup buffer. See - ‘transient-detect-key-conflicts’ for how the short argument may be - used. - - Unless the class is specified explicitly, the appropriate class is - guessed based on the long argument. If the argument ends with "=​" - (e.g. "–format=") then ‘transient-option’ is used, otherwise - ‘transient-switch’. - - Finally, details can be specified using optional KEYWORD-VALUE pairs. -Each keyword has to be a keyword symbol, either ‘:class’ or a keyword -argument supported by the constructor of that class. See *note Suffix -Slots::. - - -File: transient.info, Node: Defining Suffix and Infix Commands, Next: Using Infix Arguments, Prev: Binding Suffix and Infix Commands, Up: Defining New Commands - -5.3 Defining Suffix and Infix Commands -====================================== - -Note that an infix is a special kind of suffix. Depending on context -"suffixes" means "suffixes (including infixes)" or "non-infix suffixes". - - -- Macro: define-suffix-command name arglist [docstring] [keyword - value]... body... - - This macro defines NAME as a transient suffix command. - - ARGLIST are the arguments that the command takes. DOCSTRING is the - documentation string and is optional. - - These arguments can optionally be followed by keyword-value pairs. - Each keyword has to be a keyword symbol, either ‘:class’ or a - keyword argument supported by the constructor of that class. The - ‘transient-suffix’ class is used if the class is not specified - explicitly. - - The BODY must begin with an ‘interactive’ form that matches - ARGLIST. The infix arguments are usually accessed by using - ‘transient-args’ inside ‘interactive’. - - -- Macro: define-infix-command name arglist [docstring] [keyword - value]... - - This macro defines NAME as a transient infix command. - - ARGLIST is always ignored (but mandatory never-the-less) and - reserved for future use. DOCSTRING is the documentation string and - is optional. - - The keyword-value pairs are mandatory. All transient infix - commands are ‘equal’ to each other (but not ‘eq’), so it is - meaningless to define an infix command without also setting at - least ‘:class’ and one other keyword (which it is depends on the - used class, usually ‘:argument’ or ‘:variable’). - - Each keyword has to be a keyword symbol, either ‘:class’ or a - keyword argument supported by the constructor of that class. The - ‘transient-switch’ class is used if the class is not specified - explicitly. - - The function definition is always: - - (lambda () - (interactive) - (let ((obj (transient-suffix-object))) - (transient-infix-set obj (transient-infix-read obj))) - (transient--show)) - - ‘transient-infix-read’ and ‘transient-infix-set’ are generic - functions. Different infix commands behave differently because the - concrete methods are different for different infix command classes. - In rare cases the above command function might not be suitable, - even if you define your own infix command class. In that case you - have to use ‘transient-suffix-command’ to define the infix command - and use ‘t’ as the value of the ‘:transient’ keyword. - - -- Macro: define-infix-argument name arglist [docstring] [keyword - value]... - - This macro defines NAME as a transient infix command. - - It is an alias for ‘define-infix-command’. Only use this alias to - define an infix command that actually sets an infix argument. To - define an infix command that, for example, sets a variable, use - ‘define-infix-command’ instead. - - -File: transient.info, Node: Using Infix Arguments, Next: Transient State, Prev: Defining Suffix and Infix Commands, Up: Defining New Commands - -5.4 Using Infix Arguments -========================= - -The function and the variables described below allow suffix commands to -access the value of the transient from which they were invoked; which is -the value of its infix arguments. These variables are set when the user -invokes a suffix command that exits the transient, but before actually -calling the command. - - When returning to the command-loop after calling the suffix command, -the arguments are reset to ‘nil’ (which causes the function to return -‘nil’ too). - - Like for Emacs’ prefix arguments it is advisable, but not mandatory, -to access the infix arguments inside the command’s ‘interactive’ form. -The preferred way of doing that is to call the ‘transient-args’ -function, which for infix arguments serves about the same purpose as -‘prefix-arg’ serves for prefix arguments. - - -- Function: transient-args &optional prefix - - This function returns the value of the transient prefix command - PREFIX. - - If the current command was invoked from the transient prefix - command PREFIX, then it returns the active infix arguments. If the - current command was not invoked from PREFIX, then it returns the - set, saved or default value for PREFIX. - - -- Variable: current-transient-suffixes - - The suffixes of the transient from which this suffix command was - invoked. This is a list of objects. Usually it is sufficient to - instead use the function ‘transient-args’, which returns a list of - values. In complex cases it might be necessary to use this - variable instead, i.e. if you need access to information beside - the value. - - -- Variable: current-transient-prefix - - The transient from which this suffix command was invoked. The - returned value is a ‘transient-prefix’ object, which holds - information associated with the transient prefix command. - - -- Variable: current-transient-command - - The transient from which this suffix command was invoked. The - returned value is a symbol, the transient prefix command. - - -File: transient.info, Node: Transient State, Prev: Using Infix Arguments, Up: Defining New Commands - -5.5 Transient State -=================== - -Invoking a transient prefix command "activates" the respective -transient, i.e. it puts a transient keymap into effect, which binds the -transient’s infix and suffix commands. - - The default behavior while a transient is active is as follows: - - • Invoking an infix command does not affect the transient state; the - transient remains active. - - • Invoking a (non-infix) suffix command "deactivates" the transient - state by removing the transient keymap and performing some - additional cleanup. - - • Invoking a command that is bound in a keymap other than the - transient keymap is disallowed and trying to do so results in a - warning. This does not "deactivate" the transient. - - But these are just the defaults. Whether a certain command -deactivates or "exits" the transient is configurable. There is more -than one way in which a command can be "transient" or "non-transient"; -the exact behavior is implemented by calling a so-called "pre-command" -function. Whether non-suffix commands are allowed to be called is -configurable per transient. - - • The transient-ness of suffix commands (including infix commands) is - controlled by the value of their ‘transient’ slot, which can be set - either when defining the command or when adding a binding to a - transient while defining the respective transient prefix command. - - Valid values are booleans and the pre-commands described below. - - • ‘t’ is equivalent to ‘transient--do-stay’. - - • ‘nil’ is equivalent to ‘transient--do-exit’. - - • If ‘transient’ is unbound (and that is actually the default - for non-infix suffixes) then the value of the prefix’s - ‘transient-suffix’ slot is used instead. The default value of - that slot is ‘nil’, so the suffix’s ‘transient’ slot being - unbound is essentially equivalent to it being ‘nil’. - - • A suffix command can be a prefix command itself, i.e. a - "sub-prefix". While a sub-prefix is active we nearly always want - ‘C-g’ to take the user back to the "super-prefix". However in rare - cases this may not be desirable, and that makes the following - complication necessary: - - For ‘transient-suffix’ objects the ‘transient’ slot is unbound. We - can ignore that for the most part because, as stated above, ‘nil’ - and the slot being unbound are equivalent, and mean "do exit". - That isn’t actually true for suffixes that are sub-prefixes though. - For such suffixes unbound means "do exit but allow going back", - which is the default, while ‘nil’ means "do exit permanently", - which requires that slot to be explicitly set to that value. - - • The transient-ness of certain built-in suffix commands is specified - using ‘transient-predicate-map’. This is a special keymap, which - binds commands to pre-commands (as opposed to keys to commands) and - takes precedence over the ‘transient’ slot. - - The available pre-command functions are documented below. They are -called by ‘transient--pre-command’, a function on ‘pre-command-hook’ and -the value that they return determines whether the transient is exited. -To do so the value of one of the constants ‘transient--exit’ or -‘transient--stay’ is used (that way we don’t have to remember if ‘t’ -means "exit" or "stay"). - - Additionally these functions may change the value of ‘this-command’ -(which explains why they have to be called using ‘pre-command-hook’), -call ‘transient-export’, ‘transient--stack-zap’ or -‘transient--stack-push’; and set the values of ‘transient--exitp’, -‘transient--helpp’ or ‘transient--editp’. - -5.5.1 Pre-commands for Infixes ------------------------------- - -The default for infixes is ‘transient--do-stay’. This is also the only -function that makes sense for infixes. - - -- Function: transient--do-stay - - Call the command without exporting variables and stay transient. - -5.5.2 Pre-commands for Suffixes -------------------------------- - -The default for suffixes is ‘transient--do-exit’. - - -- Function: transient--do-exit - - Call the command after exporting variables and exit the transient. - - -- Function: transient--do-call - - Call the command after exporting variables and stay transient. - - -- Function: transient--do-replace - - Call the transient prefix command, replacing the active transient. - - This is used for suffixes that are prefixes themselves, i.e. for - sub-prefixes. - -5.5.3 Pre-commands for Non-Suffixes ------------------------------------ - -The default for non-suffixes, i.e commands that are bound in other -keymaps beside the transient keymap, is ‘transient--do-warn’. Silently -ignoring the user-error is also an option, though probably not a good -one. - - If you want to let the user invoke non-suffix commands, then use -‘transient--do-stay’ as the value of the prefix’s ‘transient-non-suffix’ -slot. - - -- Function: transient--do-warn - - Call ‘transient-undefined’ and stay transient. - - -- Function: transient--do-noop - - Call ‘transient-noop’ and stay transient. - -5.5.4 Special Pre-Commands --------------------------- - - -- Function: transient--do-quit-one - - If active, quit help or edit mode, else exit the active transient. - - This is used when the user pressed ‘C-g’. - - -- Function: transient--do-quit-all - - Exit all transients without saving the transient stack. - - This is used when the user pressed ‘C-q’. - - -- Function: transient--do-suspend - - Suspend the active transient, saving the transient stack. - - This is used when the user pressed ‘C-z’. - - -File: transient.info, Node: Classes and Methods, Next: Related Abstractions and Packages, Prev: Defining New Commands, Up: Top - -6 Classes and Methods -********************* - -Transient uses classes and generic functions to make it possible to -define new types of suffix commands that are similar to existing types, -but behave differently in some aspects. It does the same for groups and -prefix commands, though at least for prefix commands that *currently* -appears to be less important. - - Every prefix, infix and suffix command is associated with an object, -which holds information that controls certain aspects of its behavior. -This happens in two ways. - - • Associating a command with a certain class gives the command a - type. This makes it possible to use generic functions to do - certain things that have to be done differently depending on what - type of command it acts on. - - That in turn makes it possible for third-parties to add new types - without having to convince the maintainer of Transient that that - new type is important enough to justify adding a special case to a - dozen or so functions. - - • Associating a command with an object makes it possible to easily - store information that is specific to that particular command. - - Two commands may have the same type, but obviously their key - bindings and descriptions still have to be different, for example. - - The values of some slots are functions. The ‘reader’ slot for - example holds a function that is used to read a new value for an - infix command. The values of such slots are regular functions. - - Generic functions are used when a function should do something - different based on the type of the command, i.e. when all commands - of a certain type should behave the same way but different from the - behavior for other types. Object slots that hold a regular - function as value are used when the task that they perform is - likely to differ even between different commands of the same type. - -* Menu: - -* Group Classes:: -* Group Methods:: -* Prefix Classes:: -* Suffix Classes:: -* Suffix Methods:: -* Prefix Slots:: -* Suffix Slots:: -* Predicate Slots:: - - -File: transient.info, Node: Group Classes, Next: Group Methods, Up: Classes and Methods - -6.1 Group Classes -================= - -The type of a group can be specified using the ‘:class’ property at the -beginning of the class specification, e.g. ‘[:class transient-columns -...]’ in a call to ‘define-transient-command’. - - • The abstract ‘transient-child’ class is the base class of both - ‘transient-group’ (and therefore all groups) as well as of - ‘transient-suffix’ (and therefore all suffix and infix commands). - - This class exists because the elements (aka "children") of certain - groups can be other groups instead of suffix and infix commands. - - • The abstract ‘transient-group’ class is the superclass of all other - group classes. - - • The ‘transient-column’ class is the simplest group. - - This is the default "flat" group. If the class is not specified - explicitly and the first element is not a vector (i.e. not a - group), then this class is used. - - This class displays each element on a separate line. - - • The ‘transient-row’ class displays all elements on a single line. - - • The ‘transient-columns’ class displays commands organized in - columns. - - Direct elements have to be groups whose elements have to be - commands or strings. Each subgroup represents a column. This - class takes care of inserting the subgroups’ elements. - - This is the default "nested" group. If the class is not specified - explicitly and the first element is a vector (i.e. a group), then - this class is used. - - • The ‘transient-subgroups’ class wraps other groups. - - Direct elements have to be groups whose elements have to be - commands or strings. This group inserts an empty line between - subgroups. The subgroups themselves are responsible for displaying - their elements. - - -File: transient.info, Node: Group Methods, Next: Prefix Classes, Prev: Group Classes, Up: Classes and Methods - -6.2 Group Methods -================= - - -- Function: transient--insert-group group - - This generic function formats the group and its elements and - inserts the result into the current buffer, which is a temporary - buffer. The contents of that buffer are later inserted into the - popup buffer. - - Functions that are called by this function may need to operate in - the buffer from which the transient was called. To do so they can - temporally make the ‘transient--source-buffer’ the current buffer. - - -File: transient.info, Node: Prefix Classes, Next: Suffix Classes, Prev: Group Methods, Up: Classes and Methods - -6.3 Prefix Classes -================== - -Currently the ‘transient-prefix’ class is being used for all prefix -commands and there is only a single generic function that can be -specialized based on the class of a prefix command. - - -- Function: transient--history-init obj - - This generic function is called while setting up the transient and - is responsible for initializing the ‘history’ slot. This is the - transient-wide history; many individual infixes also have a history - of their own. - - The default (and currently only) method extracts the value from the - global variable ‘transient-history’. - - A transient prefix command’s object is stored in the -‘transient--prefix’ property of the command symbol. While a transient -is active, a clone of that object is stored in the variable -‘transient--prefix’. A clone is used because some changes that are made -to the active transient’s object should not affect later invocations. - - -File: transient.info, Node: Suffix Classes, Next: Suffix Methods, Prev: Prefix Classes, Up: Classes and Methods - -6.4 Suffix Classes -================== - - • All suffix and infix classes derive from ‘transient-suffix’, which - in turn derives from ‘transient-child’, from which - ‘transient-group’ also derives (see *note Group Classes::). - - • All infix classes derive from the abstract ‘transient-infix’ class, - which in turn derives from the ‘transient-suffix’ class. - - Infixes are a special type of suffixes. The primary difference is - that infixes always use the ‘transient--do-stay’ pre-command, while - non-infix suffixes use a variety of pre-commands (see *note - Transient State::). Doing that is most easily achieved by using - this class, though theoretically it would be possible to define an - infix class that does not do so. If you do that then you get to - implement many methods. - - Also, infixes and non-infix suffixes are usually defined using - different macros (see *note Defining Suffix and Infix Commands::). - - • Classes used for infix commands that represent arguments should be - derived from the abstract ‘transient-argument’ class. - - • The ‘transient-switch’ class (or a derived class) is used for infix - arguments that represent command-line switches (arguments that do - not take a value). - - • The ‘transient-option’ class (or a derived class) is used for infix - arguments that represent command-line options (arguments that do - take a value). - - • The ‘transient-switches’ class can be used for a set of mutually - exclusive command-line switches. - - • The ‘transient-files’ class can be used for a "–" argument that - indicates that all remaining arguments are files. - - • Classes used for infix commands that represent variables should - derived from the abstract ‘transient-variables’ class. - - Magit defines additional classes, which can serve as examples for the -fancy things you can do without modifying Transient. Some of these -classes will likely get generalized and added to Transient. For now -they are very much subject to change and not documented. - - -File: transient.info, Node: Suffix Methods, Next: Prefix Slots, Prev: Suffix Classes, Up: Classes and Methods - -6.5 Suffix Methods -================== - -To get information about the methods implementing these generic -functions use ‘describe-function’. - -* Menu: - -* Suffix Value Methods:: -* Suffix Format Methods:: - - -File: transient.info, Node: Suffix Value Methods, Next: Suffix Format Methods, Up: Suffix Methods - -6.5.1 Suffix Value Methods --------------------------- - - -- Function: transient-init-value obj - - This generic function sets the initial value of the object OBJ. - - This function is called for all suffix commands, but unless a - concrete method is implemented this falls through to the default - implementation, which is a noop. In other words this usually only - does something for infix commands, but note that this is not - implemented for the abstract class ‘transient-infix’, so if your - class derives from that directly, then you must implement a method. - - -- Function: transient-infix-read obj - - This generic function determines the new value of the infix object - OBJ. - - This function merely determines the value; ‘transient-infix-set’ is - used to actually store the new value in the object. - - For most infix classes this is done by reading a value from the - user using the reader specified by the ‘reader’ slot (using the - ‘transient-infix-value’ method described below). - - For some infix classes the value is changed without reading - anything in the minibuffer, i.e. the mere act of invoking the - infix command determines what the new value should be, based on the - previous value. - - -- Function: transient-prompt obj - - This generic function returns the prompt to be used to read infix - object OBJ’s value. - - -- Function: transient-infix-set obj value - - This generic function sets the value of infix object OBJ to VALUE. - - -- Function: transient-infix-value obj - - This generic function returns the value of the suffix object OBJ. - - This function is called by ‘transient-args’ (which see), meaning - this function is how the value of a transient is determined so that - the invoked suffix command can use it. - - Currently most values are strings, but that is not set in stone. - ‘nil’ is not a value, it means "no value". - - Usually only infixes have a value, but see the method for - ‘transient-suffix’. - - -- Function: transient-init-scope obj - - This generic function sets the scope of the suffix object OBJ. - - The scope is actually a property of the transient prefix, not of - individual suffixes. However it is possible to invoke a suffix - command directly instead of from a transient. In that case, if the - suffix expects a scope, then it has to determine that itself and - store it in its ‘scope’ slot. - - This function is called for all suffix commands, but unless a - concrete method is implemented this falls through to the default - implementation, which is a noop. - - -File: transient.info, Node: Suffix Format Methods, Prev: Suffix Value Methods, Up: Suffix Methods - -6.5.2 Suffix Format Methods ---------------------------- - - -- Function: transient-format obj - - This generic function formats and returns OBJ for display. - - When this function is called, then the current buffer is some - temporary buffer. If you need the buffer from which the prefix - command was invoked to be current, then do so by temporarily making - ‘transient--source-buffer’ current. - - -- Function: transient-format-key obj - - This generic function formats OBJ’s ‘key’ for display and returns - the result. - - -- Function: transient-format-description obj - - This generic function formats OBJ’s ‘description’ for display and - returns the result. - - -- Function: transient-format-value obj - - This generic function formats OBJ’s value for display and returns - the result. - - -- Function: transient-show-help obj - - Show help for the prefix, infix or suffix command represented by - OBJ. - - For prefixes, show the info manual, if that is specified using the - ‘info-manual’ slot. Otherwise show the manpage if that is - specified using the ‘man-page’ slot. Otherwise show the command’s - doc string. - - For suffixes, show the command’s doc string. - - For infixes, show the manpage if that is specified. Otherwise show - the command’s doc string. - - -File: transient.info, Node: Prefix Slots, Next: Suffix Slots, Prev: Suffix Methods, Up: Classes and Methods - -6.6 Prefix Slots -================ - - • ‘man-page’ or ‘info-manual’ can be used to specify the - documentation for the prefix and its suffixes. The command - ‘transient-help’ uses the method ‘transient-show-help’ (which see) - to lookup and use these values. - - • ‘history-key’ If multiple prefix commands should share a single - value, then this slot has to be set to the same value for all of - them. You probably don’t want that. - - • ‘transient-suffix’ and ‘transient-non-suffix’ play a part when - determining whether the currently active transient prefix command - remains active/transient when a suffix or abitrary non-suffix - command is invoked. See *note Transient State::. - - • ‘incompatible’ A list of lists. Each sub-list specifies a set of - mutually exclusive arguments. Enabling one of these arguments - causes the others to be disabled. - - • ‘scope’ For some transients it might be necessary to have a sort of - secondary value, called a "scope". See ‘define-transient-command’. - -6.6.1 Internal Prefix Slots ---------------------------- - -These slots are mostly intended for internal use. They should not be -set in calls to ‘define-transient-command’. - - • ‘prototype’ When a transient prefix command is invoked, then a - clone of that object is stored in the global variable - ‘transient--prefix’ and the prototype is stored in the clone’s - ‘prototype’ slot. - - • ‘command’ The command, a symbol. Each transient prefix command - consists of a command, which is stored in a symbol’s function slot - and an object, which is stored in the ‘transient--prefix’ property - of the same symbol. - - • ‘level’ The level of the prefix commands. The suffix commands - whose layer is equal or lower are displayed. See *note Enabling - and Disabling Suffixes::. - - • ‘value’ The likely outdated value of the prefix. Instead of - accessing this slot directly you should use the function - ‘transient-get-value’, which is guaranteed to return the up-to-date - value. - - • ‘history’ and ‘history-pos’ are used to keep track of historic - values. Unless you implement your own ‘transient-infix-read’ - method you should not have to deal with these slots. - - -File: transient.info, Node: Suffix Slots, Next: Predicate Slots, Prev: Prefix Slots, Up: Classes and Methods - -6.7 Suffix Slots -================ - -Here we document most of the slots that are only available for suffix -objects. Some slots are shared by suffix and group objects, they are -documented in *note Predicate Slots::. - - Also see *note Suffix Classes::. - -6.7.1 Slots of ‘transient-suffix’ ---------------------------------- - - • ‘key’ The key, a key vector or a key description string. - - • ‘command’ The command, a symbol. - - • ‘transient’ Whether to stay transient. See *note Transient - State::. - - • ‘format’ The format used to display the suffix in the popup buffer. - It must contain the following %-placeholders: - - • ‘%k’ For the key. - - • ‘%d’ For the description. - - • ‘%v’ For the infix value. Non-infix suffixes don’t have a - value. - - • ‘description’ The description, either a string or a function that - is called with no argument and returns a string. - -6.7.2 Slots of ‘transient-infix’ --------------------------------- - -Some of these slots are only meaningful for some of the subclasses. -They are defined here anyway to allow sharing certain methods. - - • ‘argument’ The long argument, e.g. ‘--verbose’. - - • ‘shortarg’ The short argument, e.g. ‘-v’. - - • ‘multi-value’ For options, whether the option can have multiple - values. If non-nil, then default to use - ‘completing-read-multiple’. - - • ‘allow-empty’ For options, whether the empty string is a valid - value. - - • ‘history-key’ The key used to store the history. This defaults to - the command name. This is useful when multiple infixes should - share the same history because their values are of the same kind. - - • ‘reader’ The function used to read the value of an infix. Not used - for switches. The function takes three arguments, PROMPT, - INITIAL-INPUT and HISTORY, and must return a string. - - • ‘prompt’ The prompt used when reading the value, either a string or - a function that takes the object as the only argument and which - returns a prompt string. - - • ‘choices’ A list of valid values. How exactly that is used depends - on the class of the object. - -6.7.3 Slots of ‘transient-variable’ ------------------------------------ - - • ‘variable’ The variable. - -6.7.4 Slots of ‘transient-switches’ ------------------------------------ - - • ‘argument-format’ The display format. Must contain ‘%s’, one of - the ‘choices’ is substituted for that. E.g. ‘--%s-order’. - - • ‘argument-regexp’ The regexp used to match any one of the switches. - E.g. ‘\\(--\\(topo\\|author-date\\|date\\)-order\\)’. - - -File: transient.info, Node: Predicate Slots, Prev: Suffix Slots, Up: Classes and Methods - -6.8 Predicate Slots -=================== - -Suffix and group objects share some predicate slots that control whether -a group or suffix should be available depending on some state. Only one -of these slots can be used at the same time. It is undefined what -happens if you use more than one. - - • ‘if’ Enable if predicate returns non-nil. - - • ‘if-not’ Enable if predicate returns nil. - - • ‘if-non-nil’ Enable if variable’s value is non-nil. - - • ‘if-nil’ Enable if variable’s value is nil. - - • ‘if-mode’ Enable if major-mode matches value. - - • ‘if-not-mode’ Enable if major-mode does not match value. - - • ‘if-derived’ Enable if major-mode derives from value. - - • ‘if-not-derived’ Enable if major-mode does not derive from value. - - One more slot is shared between group and suffix classes, ‘level’. -Like the slots documented above, it is a predicate, but it is used for a -different purpose. The value has to be an integer between 1 and 7. -‘level’ controls whether a suffix or a group should be available -depending on user preference. See *note Enabling and Disabling -Suffixes::. - - -File: transient.info, Node: Related Abstractions and Packages, Next: FAQ, Prev: Classes and Methods, Up: Top - -7 Related Abstractions and Packages -*********************************** - -* Menu: - -* Comparison With Prefix Keys and Prefix Arguments:: -* Comparison With Other Packages:: - - -File: transient.info, Node: Comparison With Prefix Keys and Prefix Arguments, Next: Comparison With Other Packages, Up: Related Abstractions and Packages - -7.1 Comparison With Prefix Keys and Prefix Arguments -==================================================== - -While transient commands were inspired by regular prefix keys and prefix -arguments, they are also quite different and much more complex. - - The following diagrams illustrate some of the differences. - - • ‘(c)’ represents a return to the command loop. - - • ‘(+)’ represents the user’s choice to press one key or another. - - • ‘{WORD}’ are possible behaviors. - - • ‘{NUMBER}’ is a footnote. - -7.1.1 Regular Prefix Commands ------------------------------ - -See *note (elisp)Prefix Keys::. - - ,--> command1 --> (c) - | - (c)-(+)-> prefix command or key --+--> command2 --> (c) - | - `--> command3 --> (c) - -7.1.2 Regular Prefix Arguments ------------------------------- - -See *note (elisp)Prefix Command Arguments::. - - ,----------------------------------, - | | - v | - (c)-(+)---> prefix argument command --(c)-(+)-> any command --> (c) - | ^ | - | | | - `-- sets or changes --, ,-- maybe used --' | - | | | - v | | - prefix argument state | - ^ | - | | - `-------- discards --------' - -7.1.3 Transients ----------------- - -(∩`-´)⊃â”☆゚.*・。゚ - - This diagram ignores the infix value and external state: - - (c) - | ,- {stay} ------<-,-<------------<-,-<---, - (+) | | | | - | | | | | - | | ,--> infix1 --| | | - | | | | | | - | | |--> infix2 --| | | - v v | | | | - prefix -(c)-(+)-> infix3 --' ^ | - | | | - |---------------> suffix1 -->--| | - | | | - |---------------> suffix2 ----{1}------> {exit} --> (c) - | | - |---------------> suffix3 -------------> {exit} --> (c) - | | - `--> any command --{2}-> {warn} -->--| - | | - |--> {noop} -->--| - | | - |--> {call} -->--' - | - `------------------> {exit} --> (c) - - This diagram takes the infix value into account to an extend, while -still ignoring external state: - - (c) - | ,- {stay} ------<-,-<------------<-,-<---, - (+) | | | | - | | | | | - | | ,--> infix1 --| | | - | | | | | | | - | | ,--> infix2 --| | | - v v | | | | | - prefix -(c)-(+)-> infix3 --' | | - | | ^ | - | | | | - |---------------> suffix1 -->--| | - | | ^ | | - | | | | | - |---------------> suffix2 ----{1}------> {exit} --> (c) - | | ^ | | - | | | | v - | | | | | - |---------------> suffix3 -------------> {exit} --> (c) - | | ^ | | - | sets | | v - | | maybe | | - | | used | | - | | | | | - | | infix --' | | - | `---> value | | - | ^ | | - | | | | - | hides | | - | | | | - | `--------------------------<---| - | | | - `--> any command --{2}-> {warn} -->--| | - | | | - |--> {noop} -->--| | - | | | - |--> {call} -->--' ^ - | | - `------------------> {exit} --> (c) - - This diagram provides more information about the infix value and also -takes external state into account. - - ,----sets--- "anything" - | - v - ,---------> external - | state - | | | - | initialized | ☉‿⚆ - sets from | - | | maybe - | ,----------' used - | | | - (c) | | v - | ,- {stay} --|---<-,-<------|-----<-,-<---, - (+) | | | | | | | - | | | v | | | | - | | ,--> infix1 --| | | | - | | | | | | | | | - | | | | v | | | | - | | ,--> infix2 --| | | | - | | | | ^ | | | | - v v | | | | | | | - prefix -(c)-(+)-> infix3 --' | | | - | | ^ | ^ | - | | | v | | - |---------------> suffix1 -->--| | - | | | ^ | | | - | | | | v | | - |---------------> suffix2 ----{1}------> {exit} --> (c) - | | | ^ | | | - | | | | | | v - | | | | v | | - |---------------> suffix3 -------------> {exit} --> (c) - | | | ^ | | - | sets | | | v - | | initialized maybe | | - | | from used | | - | | | | | | - | | `-- infix ---' | | - | `---> value -----------------------------> persistent - | ^ ^ | | across - | | | | | invocations -, - | hides | | | | - | | `----------------------------------------------' - | | | | - | `--------------------------<---| - | | | - `--> any command --{2}-> {warn} -->--| | - | | | - |--> {noop} -->--| | - | | | - |--> {call} -->--' ^ - | | - `------------------> {exit} --> (c) - - • ‘{1}’ Transients can be configured to be exited when a suffix - command is invoked. The default is to do so for all suffixes - except for those that are common to all transients and which are - used to perform tasks such as providing help and saving the value - of the infix arguments for future invocations. The behavior can - also be specified for individual suffix commands and may even - depend on state. - - • ‘{2}’ Transients can be configured to allow the user to invoke - non-suffix commands. The default is to not allow that and instead - warn the user. - - Despite already being rather complex, even the last diagram leaves -out many details. Most importantly it implies that the decision whether -to remain transient is made later than it actually is made (for the most -part a function on ‘pre-command-hook’ is responsible). But such -implementation details are of little relevance to users and are covered -elsewhere. - - -File: transient.info, Node: Comparison With Other Packages, Prev: Comparison With Prefix Keys and Prefix Arguments, Up: Related Abstractions and Packages - -7.2 Comparison With Other Packages -================================== - -7.2.1 Magit-Popup ------------------ - -Transient is the successor to Magit-Popup (see *note -(magit-popup)Top::). - - One major difference between these two implementations of the same -ideas is that while Transient uses transient keymaps and embraces the -command-loop, Magit-Popup implemented an inferior mechanism that does -not use transient keymaps and that instead of using the command-loop -implements a naive alternative based on ‘read-char’. - - Magit-Popup does not use classes and generic functions and defining a -new command type is near impossible as it involves adding hard-coded -special-cases to many functions. Because of that only a single new type -was added, which was not already part of Magit-Popup’s initial release. - - A lot of things are hard-coded in Magit-Popup. One random example is -that the key bindings for switches must begin with "-" and those for -options must begin with "=". - -7.2.2 Hydra ------------ - -Hydra (see ) is another package that -provides features similar to those of Transient. - - Both packages use transient keymaps to make a set of commands -temporarily available and show the available commands in a popup buffer. - - A Hydra "body" is equivalent to a Transient "prefix" and a Hydra -"head" is equivalent to a Transient "suffix". Hydra has no equivalent -of a Transient "infix". - - Both hydras and transients can be used as simple command dispatchers. -Used like this they are similar to regular prefix commands and prefix -keys, except that the available commands are shown in the popup buffer. - - (Another package that does this is ‘which-key’. It does so -automatically for any incomplete key sequence. The advantage of that -approach is that no additional work is necessary; the disadvantage is -that the available commands are not organized semantically.) - - Both Hydra and Transient provide features that go beyond simple -command dispatchers: - - • Invoking a command from a hydra does not necessarily exit the - hydra. That makes it possible to invoke the same command again, - but using a shorter key sequence (i.e. the key that was used to - enter the hydra does not have to be pressed again). - - Transient supports that too, but for now this feature is not a - focus and the interface is a bit more complicated. A very basic - example using the current interface: - - (define-transient-command outline-navigate () - :transient-suffix 'transient--do-stay - :transient-non-suffix 'transient--do-warn - [("p" "previous visible heading" outline-previous-visible-heading) - ("n" "next visible heading" outline-next-visible-heading)]) - - • Transient supports infix arguments; values that are set by infix - commands and then consumed by the invoked suffix command(s). - - To my knowledge, Hydra does not support that. - - Both packages make it possible to specify how exactly the available -commands are outlined: - - • With Hydra this is often done using an explicit format string, - which gives authors a lot of flexibility and makes it possible to - do fancy things. - - The downside of this is that it becomes harder for a user to add - additional commands to an existing hydra and to change key - bindings. - - • Transient allows the author of a transient to organize the commands - into groups and the use of generic functions allows authors of - transients to control exactly how a certain command type is - displayed. - - However while Transient supports giving sections a heading it does - not currently support giving the displayed information more - structure by, for example, using box-drawing characters. - - That could be implemented by defining a new group class, which lets - the author specify a format string. It should be possible to - implement that without modifying any existing code, but it does not - currently exist. - - -File: transient.info, Node: FAQ, Next: Keystroke Index, Prev: Related Abstractions and Packages, Up: Top - -Appendix A FAQ -************** - -A.1 Can I control how the popup buffer is displayed? -==================================================== - -Yes, see ‘transient-display-buffer-action’ in *note Other Options::. - -A.2 Why did some of the key bindings change? -============================================ - -You may have noticed that the bindings for some of the common commands -do *not* have the prefix ‘C-x’ and that furthermore some of these -commands are grayed out while others are not. That unfortunately is a -bit confusing if the section of common commands is not shown -permanently, making the following explanation necessary. - - The purpose of usually hiding that section but showing it after the -user pressed the respective prefix key is to conserve space and not -overwhelm users with too much noise, while allowing the user to quickly -list common bindings on demand. - - That however should not keep us from using the best possible key -bindings. The bindings that do use a prefix do so to avoid wasting too -many non-prefix bindings, keeping them available for use in individual -transients. The bindings that do not use a prefix and that are *not* -grayed out are very important bindings that are *always* available, even -when invoking the "common command key prefix" or *any other* -transient-specific prefix. The non-prefix keys that *are* grayed out -however, are not available when any incomplete prefix key sequence is -active. They do not use the "common command key prefix" because it is -likely that users want to invoke them several times in a row and e.g. -‘M-p M-p M-p’ is much more convenient than ‘C-x M-p C-x M-p C-x M-p’. - - You may also have noticed that the "Set" command is bound to ‘C-x s’, -while Magit-Popup used to bind ‘C-c C-c’ instead. I have seen several -users praise the latter binding (sic), so I did not change it -willy-nilly. The reason that I changed it is that using different -prefix keys for different common commands, would have made the temporary -display of the common commands even more confusing, i.e. after pressing -‘C-c’ all the ‘C-x ...’ bindings would be grayed out. - - Using a single prefix for common commands key means that all other -potential prefix keys can be used for transient-specific commands -*without* the section of common commands also popping up. ‘C-c’ in -particular is a prefix that I want to (and already do) use for Magit, -and also using that for a common command would prevent me from doing so. - - (Also see the next question.) - -A.3 Why does ‘q’ not quit popups anymore? -========================================= - -I agree that ‘q’ is a good binding for commands that quit something. -This includes quitting whatever transient is currently active, but it -also includes quitting whatever it is that some specific transient is -controlling. The transient ‘magit-blame’ for example binds ‘q’ to the -command that turns ‘magit-blame-mode’ off. - - So I had to decide if ‘q’ should quit the active transient (like -Magit-Popup used to) or whether ‘C-g’ should do that instead, so that -‘q’ could be bound in individual transient to whatever commands make -sense for them. Because all other letters are already reserved for use -by individual transients, I have decided to no longer make an exception -for ‘q’. - - If you want to get ‘q’’s old binding back then you can do so. Doing -that is a bit more complicated than changing a single key binding, so I -have implemented a function, ‘transient-bind-q-to-quit’ that makes the -necessary changes. See its doc string for more information. - - -File: transient.info, Node: Keystroke Index, Next: Command Index, Prev: FAQ, Up: Top - -Appendix B Keystroke Index -************************** - -[index] -* Menu: - -* C-g: Aborting and Resuming Transients. - (line 25) -* C-g <1>: Aborting and Resuming Transients. - (line 26) -* C-h: Getting Help for Suffix Commands. - (line 10) -* C-q: Aborting and Resuming Transients. - (line 36) -* C-x C-s: Saving Values. (line 25) -* C-x l: Enabling and Disabling Suffixes. - (line 49) -* C-x s: Saving Values. (line 20) -* C-x t: Common Suffix Commands. - (line 16) -* C-z: Aborting and Resuming Transients. - (line 42) -* M-n: Using History. (line 16) -* M-p: Using History. (line 11) -* M-x transient-resume: Aborting and Resuming Transients. - (line 55) - - -File: transient.info, Node: Command Index, Next: Function Index, Prev: Keystroke Index, Up: Top - -Appendix C Command Index -************************ - -[index] -* Menu: - -* transient-help: Getting Help for Suffix Commands. - (line 10) -* transient-history-next: Using History. (line 16) -* transient-history-prev: Using History. (line 11) -* transient-quit-all: Aborting and Resuming Transients. - (line 36) -* transient-quit-one: Aborting and Resuming Transients. - (line 26) -* transient-quit-seq: Aborting and Resuming Transients. - (line 25) -* transient-resume: Aborting and Resuming Transients. - (line 55) -* transient-save: Saving Values. (line 25) -* transient-scroll-down arg: Other Commands. (line 18) -* transient-scroll-up arg: Other Commands. (line 12) -* transient-set: Saving Values. (line 20) -* transient-set-level: Enabling and Disabling Suffixes. - (line 49) -* transient-suspend: Aborting and Resuming Transients. - (line 42) -* transient-toggle-common: Common Suffix Commands. - (line 16) - - -File: transient.info, Node: Function Index, Next: Variable Index, Prev: Command Index, Up: Top - -Appendix D Function Index -************************* - -[index] -* Menu: - -* define-infix-argument: Defining Suffix and Infix Commands. - (line 63) -* define-infix-command: Defining Suffix and Infix Commands. - (line 27) -* define-suffix-command: Defining Suffix and Infix Commands. - (line 9) -* define-transient-command: Defining Transients. (line 13) -* transient--do-call: Transient State. (line 98) -* transient--do-exit: Transient State. (line 94) -* transient--do-noop: Transient State. (line 125) -* transient--do-quit-all: Transient State. (line 138) -* transient--do-quit-one: Transient State. (line 132) -* transient--do-replace: Transient State. (line 102) -* transient--do-stay: Transient State. (line 85) -* transient--do-suspend: Transient State. (line 144) -* transient--do-warn: Transient State. (line 121) -* transient--history-init: Prefix Classes. (line 10) -* transient--insert-group: Group Methods. (line 6) -* transient-append-suffix: Modifying Existing Transients. - (line 47) -* transient-args: Using Infix Arguments. - (line 22) -* transient-format: Suffix Format Methods. - (line 6) -* transient-format-description: Suffix Format Methods. - (line 20) -* transient-format-key: Suffix Format Methods. - (line 15) -* transient-format-value: Suffix Format Methods. - (line 25) -* transient-get-suffix: Modifying Existing Transients. - (line 60) -* transient-infix-read: Suffix Value Methods. - (line 17) -* transient-infix-set: Suffix Value Methods. - (line 39) -* transient-infix-value: Suffix Value Methods. - (line 43) -* transient-init-scope: Suffix Value Methods. - (line 57) -* transient-init-value: Suffix Value Methods. - (line 6) -* transient-insert-suffix: Modifying Existing Transients. - (line 42) -* transient-prompt: Suffix Value Methods. - (line 34) -* transient-remove-suffix: Modifying Existing Transients. - (line 56) -* transient-replace-suffix: Modifying Existing Transients. - (line 51) -* transient-scroll-down: Other Commands. (line 18) -* transient-scroll-up: Other Commands. (line 12) -* transient-show-help: Suffix Format Methods. - (line 30) -* transient-suffix-put: Modifying Existing Transients. - (line 65) - - -File: transient.info, Node: Variable Index, Prev: Function Index, Up: Top - -Appendix E Variable Index -************************* - -[index] -* Menu: - -* current-transient-command: Using Infix Arguments. - (line 47) -* current-transient-prefix: Using Infix Arguments. - (line 41) -* current-transient-suffixes: Using Infix Arguments. - (line 32) -* transient-default-level: Enabling and Disabling Suffixes. - (line 38) -* transient-detect-key-conflicts: Other Options. (line 137) -* transient-display-buffer-action: Other Options. (line 46) -* transient-enable-popup-navigation: Other Options. (line 28) -* transient-force-fixed-pitch: Other Options. (line 151) -* transient-highlight-mismatched-keys: Other Options. (line 96) -* transient-history-file: Using History. (line 33) -* transient-history-limit: Using History. (line 38) -* transient-levels-file: Enabling and Disabling Suffixes. - (line 44) -* transient-mode-line-format: Other Options. (line 71) -* transient-read-with-initial-input: Other Options. (line 88) -* transient-show-common-commands: Common Suffix Commands. - (line 23) -* transient-show-popup: Other Options. (line 6) -* transient-substitute-key-function: Other Options. (line 115) -* transient-values-file: Saving Values. (line 30) - - - -Tag Table: -Node: Top751 -Node: Introduction3651 -Node: Usage9438 -Node: Invoking Transients9772 -Node: Aborting and Resuming Transients10804 -Node: Common Suffix Commands13463 -Node: Saving Values15217 -Ref: Saving Values-Footnote-116475 -Node: Using History16745 -Node: Getting Help for Suffix Commands18286 -Node: Enabling and Disabling Suffixes19679 -Node: Other Commands22969 -Node: Other Options23925 -Node: Modifying Existing Transients31049 -Node: Defining New Commands34453 -Node: Defining Transients34789 -Node: Binding Suffix and Infix Commands37221 -Node: Group Specifications38076 -Node: Suffix Specifications41409 -Node: Defining Suffix and Infix Commands44976 -Node: Using Infix Arguments48161 -Node: Transient State50381 -Node: Classes and Methods56254 -Node: Group Classes58468 -Node: Group Methods60385 -Node: Prefix Classes61030 -Node: Suffix Classes62122 -Node: Suffix Methods64366 -Node: Suffix Value Methods64687 -Node: Suffix Format Methods67447 -Node: Prefix Slots68899 -Node: Suffix Slots71376 -Node: Predicate Slots74227 -Node: Related Abstractions and Packages75475 -Node: Comparison With Prefix Keys and Prefix Arguments75762 -Node: Comparison With Other Packages86074 -Node: FAQ90265 -Node: Keystroke Index93999 -Node: Command Index95633 -Node: Function Index97420 -Node: Variable Index101577 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: diff --git a/elpa/typescript-mode-20200303.1301/typescript-mode-autoloads.el b/elpa/typescript-mode-20200303.1301/typescript-mode-autoloads.el deleted file mode 100644 index 4b2a7e12..00000000 --- a/elpa/typescript-mode-20200303.1301/typescript-mode-autoloads.el +++ /dev/null @@ -1,49 +0,0 @@ -;;; typescript-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "typescript-mode" "typescript-mode.el" (0 0 -;;;;;; 0 0)) -;;; Generated autoloads from typescript-mode.el -(put 'typescript-indent-level 'safe-local-variable #'integerp) - -(autoload 'typescript-mode "typescript-mode" "\ -Major mode for editing typescript. - -Key bindings: - -\\{typescript-mode-map} - -\(fn)" t nil) - -(eval-after-load 'folding '(when (fboundp 'folding-add-to-marks-list) (folding-add-to-marks-list 'typescript-mode "// {{{" "// }}}"))) - -(add-to-list 'auto-mode-alist '("\\.ts$" . typescript-mode)) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "typescript-mode" '("typescript-"))) - -;;;*** - -;;;### (autoloads nil "typescript-mode-test-utilities" "typescript-mode-test-utilities.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from typescript-mode-test-utilities.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "typescript-mode-test-utilities" '("font-lock-test" "get-face-at" "test-with-"))) - -;;;*** - -;;;### (autoloads nil nil ("typescript-mode-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; typescript-mode-autoloads.el ends here diff --git a/elpa/typescript-mode-20200303.1301/typescript-mode-pkg.el b/elpa/typescript-mode-20200303.1301/typescript-mode-pkg.el deleted file mode 100644 index 1fa09188..00000000 --- a/elpa/typescript-mode-20200303.1301/typescript-mode-pkg.el +++ /dev/null @@ -1,8 +0,0 @@ -(define-package "typescript-mode" "20200303.1301" "Major mode for editing typescript" - '((emacs "24.3")) - :keywords - '("typescript" "languages") - :url "http://github.com/ananthakumaran/typescript.el") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/typescript-mode-20200303.1301/typescript-mode-test-utilities.el b/elpa/typescript-mode-20200303.1301/typescript-mode-test-utilities.el deleted file mode 100644 index faa6c116..00000000 --- a/elpa/typescript-mode-20200303.1301/typescript-mode-test-utilities.el +++ /dev/null @@ -1,63 +0,0 @@ -;;; typescript-mode-test-utilities --- This file contains test utilities for typescript-mode.el - -;;; Commentary: -;; See typescript-mode-tests.el and typescript-mode-jsdoc-tests.el - -;;; Code: - -(require 'ert) -(require 'typescript-mode) - -;; Adapted from jdee-mode's test suite. -(defmacro test-with-temp-buffer (content &rest body) - "Fill a temporary buffer with `CONTENT' and eval `BODY' in it." - (declare (debug t) - (indent 1)) - `(with-temp-buffer - (insert ,content) - (typescript-mode) - (goto-char (point-min)) - ;; We need this so that tests that simulate user actions operate on the right buffer. - (switch-to-buffer (current-buffer)) - ,@body)) - -(defmacro test-with-fontified-buffer (content &rest body) - "Fill a temporary buffer with `CONTENT' and eval `BODY' in it." - (declare (debug t) - (indent 1)) - `(test-with-temp-buffer - ,content - (font-lock-fontify-buffer) - ,@body)) - -(defun get-face-at (loc) - "Get the face at `LOC'. -If it is not a number, then we `re-search-forward' with `LOC' -as the search pattern." - (when (not (numberp loc)) - (save-excursion - (re-search-forward loc) - (setq loc (match-beginning 0)))) - (get-text-property loc 'face)) - -(defun font-lock-test (contents expected) - "Perform a test on our template. -`CONTENTS' is the string to put in the temporary buffer. -`EXPECTED' is the expected results. -It should be a list of (LOCATION . FACE) pairs, where -LOCATION can be either a single location, or list of locations, -that are all expected to have the same face." - (test-with-fontified-buffer - contents - ;; Make sure our propertize function has been applied to the whole - ;; buffer. - (syntax-propertize (point-max)) - (dolist (spec expected) - (if (listp (car spec)) - (dolist (source (car spec)) - (should (eq (get-face-at source) (cdr spec)))) - (should (eq (get-face-at (car spec)) (cdr spec))))))) - -(provide 'typescript-mode-test-utilities) - -;;; typescript-mode-test-utilities.el ends here diff --git a/elpa/typescript-mode-20200303.1301/typescript-mode-test-utilities.elc b/elpa/typescript-mode-20200303.1301/typescript-mode-test-utilities.elc deleted file mode 100644 index fa9ddb1eff3eaf39845e4d53c8e24f0af59b4665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3504 zcmcgu`)k`)6!wpa!@{6lH`>%au|^|xxj`?#nvErO(h(?Wq4{B>GDMcHVo_OgujC}| zU%&6jvh(a1w3|WZzR!1F-#NR7Z~8yhYPI_A?k@GS@gz=USWe=U4#$3w)45c6oTX&9 zcbszPA}&VcCkbVfA|A(|{Q}$hPQBbb8O1q8c!j39%qg6u{x}XO%!0g7ae9_-V^`$` z`C%wST1v5cJ9h8R8)1ew(yX8$OA8-|r$r>XSV_hH`~J}p1tVYiK>>){rFcILDbFbI zQyNN2GXI8YHJ9D`(!B_nlz}Noj^}0Ts6;cFQD5>c=ristm^lXa< z{Mne8ohE%y^3ya{lB6oAm`!9JsCZI{F>VgXHtO15+o9Jn9OY9X$CFI?YDU9p6hZUS ziKqRy$0vu!CtJjJljnXyr?1`~{I$h?iHn_Qbv=}kpTvGnTZPOE!Pf*oCaQO~bOedY zXos{9I(tc`1wB_dOT#Rj8Kn+3U^^=Z_;>NO@U>T8@vqWkagT45$Zm*;)0|b*Z|P`| zewG!P;1D2vlEo=>k5dEdIba6BnJrN2!Bi5+&w%ZAEn{F9_nI9*OXyl< zenxLCG|(_GD+MM~xZqy<$WRWaXClhfSmYBKP(jf&4LD^4-%8?qBH}b;aElGH2IT&S z{)^zIIErPsFwehp;tCXY*l+iF?SAcb7A2A__y`NI(AmNR(6Dkq&+dI|2i#HctGr;D zJ^Dk!!6QkLA4u{GI(_rDzqM08ijXD*#$%51DV>goQf>3elrAKlDk*Ys4Pp@iaN(

z-y7^I_Lu85D{tW{-GM_Uv4lci7Gk2Z3G!@K>Np^$a*yTMCj0|7vAaEbCl!Zs$tXy1 zl!a^x8U-OFej#`23r2Yl3aPX!X`hOWINZT2tnzI-!o|Zs-yQZ(4iA2E}%O!6K3i^!vb7;a2^vCnaxaqsA*yrT9#*e5! zm2Pu-Y{OBV&7aiDr#a7n>TRpN8dNijcp!(>)Sgtnww!Xqb1XNUFQpi_p5UCd0k4B+ z?N-f;_ITmJ-mh44cvxH8<8x0J=dfs&=YGI)yYU$R9qU~Ux6Q^A{9E5`uI(EK%yssl z*4V(3{pj)f#@_k{mK#qocNz_TvhfUK7w+ zVC!36TJ199S4PqT(-sF8;vs!DbUh@EMb=`-Uw!LU+H3xX2RP;!5G4j<}E-aI@ z7A6c%3d. -;; ------------------------------------------------------------------------------------------- - -;; URL: http://github.com/ananthakumaran/typescript.el -;; Version: 0.1 -;; Keywords: typescript languages -;; Package-Requires: ((emacs "24.3")) - -;; This file is not part of GNU Emacs. - -;;; Commentary: - -;; This is based on Karl Landstrom's barebones typescript-mode. This -;; is much more robust and works with cc-mode's comment filling -;; (mostly). -;; The modifications to the original javascript.el mode mainly consisted in -;; replacing "javascript" with "typescript" -;; -;; The main features of this typescript mode are syntactic -;; highlighting (enabled with `font-lock-mode' or -;; `global-font-lock-mode'), automatic indentation and filling of -;; comments. -;; -;; -;; General Remarks: -;; -;; XXX: This mode assumes that block comments are not nested inside block -;; XXX: comments -;; -;; Exported names start with "typescript-"; private names start with -;; "typescript--". - -;;; Code: - -(eval-and-compile - (require 'compile) - (require 'cc-mode) - (require 'font-lock) - (require 'rx) - (require 'newcomment)) - -(eval-when-compile - (require 'cl-lib)) - -;;; Constants - -(defconst typescript--name-start-re "[a-zA-Z_$]" - "Regexp matching the start of a typescript identifier, without grouping.") - -(defconst typescript--name-re (concat typescript--name-start-re - "\\(?:\\s_\\|\\sw\\)*") - "Regexp matching a typescript identifier, without grouping.") - -(defconst typescript--objfield-re (concat typescript--name-re ":") - "Regexp matching the start of a typescript object field.") - -(defconst typescript--dotted-name-re - (concat typescript--name-re "\\(?:\\." typescript--name-re "\\)*") - "Regexp matching a dot-separated sequence of typescript names.") - -(defconst typescript--plain-method-re - (concat "^\\s-*?\\(" typescript--dotted-name-re "\\)\\.prototype" - "\\.\\(" typescript--name-re "\\)\\s-*?=\\s-*?\\(function\\)\\_>") - "Regexp matching an explicit typescript prototype \"method\" declaration. -Group 1 is a (possibly-dotted) class name, group 2 is a method name, -and group 3 is the 'function' keyword.") - -(defconst typescript--plain-class-re - (concat "^\\s-*\\(" typescript--dotted-name-re "\\)\\.prototype" - "\\s-*=\\s-*{") - "Regexp matching a typescript explicit prototype \"class\" declaration. -An example of this is \"Class.prototype = { method1: ...}\".") - -(defconst typescript--module-declaration-re - "^\\s-*\\(?:declare\\|\\(?:export\\(?:\\s-+default\\)?\\)\\)?" - "Regexp matching ambient declaration modifier or export declaration.") - -;; var NewClass = BaseClass.extend( -(defconst typescript--mp-class-decl-re - (concat "^\\s-*var\\s-+" - "\\(" typescript--name-re "\\)" - "\\s-*=\\s-*" - "\\(" typescript--dotted-name-re - "\\)\\.extend\\(?:Final\\)?\\s-*(\\s-*{?\\s-*$")) - -;; var NewClass = Class.create() -(defconst typescript--prototype-obsolete-class-decl-re - (concat "^\\s-*\\(?:var\\s-+\\)?" - "\\(" typescript--dotted-name-re "\\)" - "\\s-*=\\s-*Class\\.create()")) - -(defconst typescript--prototype-objextend-class-decl-re-1 - (concat "^\\s-*Object\\.extend\\s-*(" - "\\(" typescript--dotted-name-re "\\)" - "\\s-*,\\s-*{")) - -(defconst typescript--prototype-objextend-class-decl-re-2 - (concat "^\\s-*\\(?:var\\s-+\\)?" - "\\(" typescript--dotted-name-re "\\)" - "\\s-*=\\s-*Object\\.extend\\s-*\(")) - -;; var NewClass = Class.create({ -(defconst typescript--prototype-class-decl-re - (concat "^\\s-*\\(?:var\\s-+\\)?" - "\\(" typescript--name-re "\\)" - "\\s-*=\\s-*Class\\.create\\s-*(\\s-*" - "\\(?:\\(" typescript--dotted-name-re "\\)\\s-*,\\s-*\\)?{?")) - -;; Parent class name(s) (yes, multiple inheritance in typescript) are -;; matched with dedicated font-lock matchers -(defconst typescript--dojo-class-decl-re - (concat "^\\s-*dojo\\.declare\\s-*(\"\\(" typescript--dotted-name-re "\\)")) - -(defconst typescript--exttypescript-class-decl-re-1 - (concat "^\\s-*Ext\\.extend\\s-*(" - "\\s-*\\(" typescript--dotted-name-re "\\)" - "\\s-*,\\s-*\\(" typescript--dotted-name-re "\\)") - "Regexp matching an ExtTYPESCRIPT class declaration (style 1).") - -(defconst typescript--exttypescript-class-decl-re-2 - (concat "^\\s-*\\(?:var\\s-+\\)?" - "\\(" typescript--name-re "\\)" - "\\s-*=\\s-*Ext\\.extend\\s-*(\\s-*" - "\\(" typescript--dotted-name-re "\\)") - "Regexp matching an ExtTYPESCRIPT class declaration (style 2).") - -(defconst typescript--mochikit-class-re - (concat "^\\s-*MochiKit\\.Base\\.update\\s-*(\\s-*" - "\\(" typescript--dotted-name-re "\\)") - "Regexp matching a MochiKit class declaration.") - -(defconst typescript--dummy-class-style - '(:name "[Automatically Generated Class]")) - -(defconst typescript--class-styles - `((:name "Plain" - :class-decl ,typescript--plain-class-re - :prototype t - :contexts (toplevel) - :framework typescript) - - (:name "MochiKit" - :class-decl ,typescript--mochikit-class-re - :prototype t - :contexts (toplevel) - :framework mochikit) - - (:name "Prototype (Obsolete)" - :class-decl ,typescript--prototype-obsolete-class-decl-re - :contexts (toplevel) - :framework prototype) - - (:name "Prototype (Modern)" - :class-decl ,typescript--prototype-class-decl-re - :contexts (toplevel) - :framework prototype) - - (:name "Prototype (Object.extend)" - :class-decl ,typescript--prototype-objextend-class-decl-re-1 - :prototype t - :contexts (toplevel) - :framework prototype) - - (:name "Prototype (Object.extend) 2" - :class-decl ,typescript--prototype-objextend-class-decl-re-2 - :prototype t - :contexts (toplevel) - :framework prototype) - - (:name "Dojo" - :class-decl ,typescript--dojo-class-decl-re - :contexts (toplevel) - :framework dojo) - - (:name "ExtTYPESCRIPT (style 1)" - :class-decl ,typescript--exttypescript-class-decl-re-1 - :prototype t - :contexts (toplevel) - :framework exttypescript) - - (:name "ExtTYPESCRIPT (style 2)" - :class-decl ,typescript--exttypescript-class-decl-re-2 - :contexts (toplevel) - :framework exttypescript) - - (:name "Merrill Press" - :class-decl ,typescript--mp-class-decl-re - :contexts (toplevel) - :framework merrillpress)) - - "List of typescript class definition styles. - -A class definition style is a plist with the following keys: - -:name is a human-readable name of the class type - -:class-decl is a regular expression giving the start of the -class. Its first group must match the name of its class. If there -is a parent class, the second group should match, and it should be -the name of the class. - -If :prototype is present and non-nil, the parser will merge -declarations for this constructs with others at the same lexical -level that have the same name. Otherwise, multiple definitions -will create multiple top-level entries. Don't use :prototype -unnecessarily: it has an associated cost in performance. - -If :strip-prototype is present and non-nil, then if the class -name as matched contains") - -(defconst typescript--available-frameworks - (cl-loop with available-frameworks - for style in typescript--class-styles - for framework = (plist-get style :framework) - unless (memq framework available-frameworks) - collect framework into available-frameworks - finally return available-frameworks) - "List of available typescript frameworks symbols.") - -(defconst typescript--function-heading-1-re - (concat - typescript--module-declaration-re - "\\s-*function\\s-+\\(" typescript--name-re "\\)") - "Regexp matching the start of a typescript function header. -Match group 1 is the name of the function.") - -(defconst typescript--function-heading-2-re - (concat - "^\\s-*\\(" typescript--name-re "\\)\\s-*:\\s-*function\\_>") - "Regexp matching the start of a function entry in an associative array. -Match group 1 is the name of the function.") - -(defconst typescript--function-heading-3-re - (concat - "^\\s-*\\(?:var\\s-+\\)?\\(" typescript--dotted-name-re "\\)" - "\\s-*=\\s-*function\\_>") - "Regexp matching a line in the typescript form \"var MUMBLE = function\". -Match group 1 is MUMBLE.") - -(defun typescript--regexp-opt-symbol (list) - "Like `regexp-opt', but surround the result with `\\\\_<' and `\\\\_>'." - (concat "\\_<" (regexp-opt list t) "\\_>")) - -(defconst typescript--keyword-re - (typescript--regexp-opt-symbol - '("abstract" "any" "as" "async" "await" "boolean" "bigint" "break" "case" "catch" "class" "const" - "constructor" "continue" "declare" "default" "delete" "do" "else" - "enum" "export" "extends" "extern" "false" "finally" "for" - "function" "from" "get" "goto" "if" "implements" "import" "in" "instanceof" - "interface" "keyof" "let" "module" "namespace" "never" "new" "null" "number" "object" "of" - "private" "protected" "public" "readonly" "return" "set" "static" "string" - "super" "switch" "this" "throw" "true" - "try" "type" "typeof" "unknown" "var" "void" - "while")) ; yield is handled separately - "Regexp matching any typescript keyword.") - -(defconst typescript--basic-type-re - (typescript--regexp-opt-symbol - '("any" "bool" "boolean" "bigint" "never" "number" "string" "unknown" "void")) - "Regular expression matching any predefined type in typescript.") - -(defconst typescript--access-modifier-re - (typescript--regexp-opt-symbol - '("private" "protected" "public" "readonly" "static" "extends" "implements")) - "Regular expression matching access modifiers.") - -(defconst typescript--decorator-re - (concat "\\(@" typescript--name-re "\\)")) - -(defconst typescript--constant-re - (typescript--regexp-opt-symbol '("false" "null" "undefined" - "Infinity" "NaN" - "true" "arguments" "this")) - "Regular expression matching any future reserved words in typescript.") - -(defconst typescript--builtin-re - (typescript--regexp-opt-symbol - '("console")) - "Regular expression matching builtins.") - -(defconst typescript--function-call-re "\\(\\(?:\\w\\|\\s_\\)+\\)\\(<.+>\\)?\s*(" - "Regular expression matching function calls.") - -(defconst typescript--font-lock-keywords-1 - (list - "\\_" - (list typescript--function-heading-1-re 1 font-lock-function-name-face) - (list typescript--function-heading-2-re 1 font-lock-function-name-face)) - "Level one font lock keywords for `typescript-mode'.") - -(defconst typescript--font-lock-keywords-2 - (append typescript--font-lock-keywords-1 - (list (list typescript--keyword-re 1 font-lock-keyword-face) - (list "\\_" - "\\s-+\\(each\\)\\_>" nil nil - (list 1 'font-lock-keyword-face)) - (cons "\\_\\)" 'font-lock-keyword-face) - (cons typescript--basic-type-re font-lock-type-face) - (cons typescript--constant-re font-lock-constant-face))) - "Level two font lock keywords for `typescript-mode'.") - -;; typescript--pitem is the basic building block of the lexical -;; database. When one refers to a real part of the buffer, the region -;; of text to which it refers is split into a conceptual header and -;; body. Consider the (very short) block described by a hypothetical -;; typescript--pitem: -;; -;; function foo(a,b,c) { return 42; } -;; ^ ^ ^ -;; | | | -;; +- h-begin +- h-end +- b-end -;; -;; (Remember that these are buffer positions, and therefore point -;; between characters, not at them. An arrow drawn to a character -;; indicates the corresponding position is between that character and -;; the one immediately preceding it.) -;; -;; The header is the region of text [h-begin, h-end], and is -;; the text needed to unambiguously recognize the start of the -;; construct. If the entire header is not present, the construct is -;; not recognized at all. No other pitems may be nested inside the -;; header. -;; -;; The body is the region [h-end, b-end]. It may contain nested -;; typescript--pitem instances. The body of a pitem may be empty: in -;; that case, b-end is equal to header-end. -;; -;; The three points obey the following relationship: -;; -;; h-begin < h-end <= b-end -;; -;; We put a text property in the buffer on the character *before* -;; h-end, and if we see it, on the character *before* b-end. -;; -;; The text property for h-end, typescript--pstate, is actually a list -;; of all typescript--pitem instances open after the marked character. -;; -;; The text property for b-end, typescript--pend, is simply the -;; typescript--pitem that ends after the marked character. (Because -;; pitems always end when the paren-depth drops below a critical -;; value, and because we can only drop one level per character, only -;; one pitem may end at a given character.) -;; -;; In the structure below, we only store h-begin and (sometimes) -;; b-end. We can trivially and quickly find h-end by going to h-begin -;; and searching for an typescript--pstate text property. Since no other -;; typescript--pitem instances can be nested inside the header of a -;; pitem, the location after the character with this text property -;; must be h-end. -;; -;; typescript--pitem instances are never modified (with the exception -;; of the b-end field). Instead, modified copies are added at subseqnce parse points. -;; (The exception for b-end and its caveats is described below.) -;; - -(cl-defstruct (typescript--pitem (:type list)) - ;; IMPORTANT: Do not alter the position of fields within the list. - ;; Various bits of code depend on their positions, particularly - ;; anything that manipulates the list of children. - - ;; List of children inside this pitem's body - (children nil :read-only t) - - ;; When we reach this paren depth after h-end, the pitem ends - (paren-depth nil :read-only t) - - ;; Symbol or class-style plist if this is a class - (type nil :read-only t) - - ;; See above - (h-begin nil :read-only t) - - ;; List of strings giving the parts of the name of this pitem (e.g., - ;; '("MyClass" "myMethod"), or t if this pitem is anonymous - (name nil :read-only t) - - ;; THIS FIELD IS MUTATED, and its value is shared by all copies of - ;; this pitem: when we copy-and-modify pitem instances, we share - ;; their tail structures, so all the copies actually have the same - ;; terminating cons cell. We modify that shared cons cell directly. - ;; - ;; The field value is either a number (buffer location) or nil if - ;; unknown. - ;; - ;; If the field's value is greater than `typescript--cache-end', the - ;; value is stale and must be treated as if it were nil. Conversely, - ;; if this field is nil, it is guaranteed that this pitem is open up - ;; to at least `typescript--cache-end'. (This property is handy when - ;; computing whether we're inside a given pitem.) - ;; - (b-end nil)) - -;; The pitem we start parsing with. -(defconst typescript--initial-pitem - (make-typescript--pitem - :paren-depth most-negative-fixnum - :type 'toplevel)) - -;; When we say "jsdoc" here, we mean "jsdoc 3". There exist multiple dialects of -;; "jsdoc documentation". - -;; Note that all typedoc/jsdoc regexp by themselves would match occurrences that appear outside -;; documentation comments. The logic that uses these regexps must guard against it. -(defconst typescript-typedoc-link-tag-regexp - "\\[\\[.*?\\]\\]" - "Matches a typedoc link.") - -(defconst typescript-typedoc-literal-markup-regexp - "\\(`+\\).*?\\1" - "Matches a typedoc keyword markup.") - -(defconst typescript-jsdoc-before-tag-regexp - "\\(?:^\\s-*\\*+\\|/\\*\\*\\)\\s-*" - "Matches everything we allow before the @ of a jsdoc tag.") - -;; This was taken from js2-mode. -(defconst typescript-jsdoc-param-tag-regexp - (concat typescript-jsdoc-before-tag-regexp - "\\(@" - (regexp-opt - '("arg" - "argument" - "param" - "prop" - "property" - "typedef")) - "\\)" - "\\s-*\\({[^}]+}\\)?" ; optional type - "\\s-*\\[?\\([[:alnum:]_$\.]+\\)?\\]?" ; name - "\\_>") - "Matches jsdoc tags with optional type and optional param name.") - -;; This was taken from js2-mode. -;; and extended with tags in http://usejsdoc.org/ -(defconst typescript-jsdoc-typed-tag-regexp - (concat typescript-jsdoc-before-tag-regexp - "\\(@" - (regexp-opt - '("enum" - "extends" - "field" - "id" - "implements" - "lends" - "mods" - "requires" - "return" - "returns" - "throw" - "throws" - "type" - "yield" - "yields")) - "\\)\\s-*\\({[^}]+}\\)?") - "Matches jsdoc tags with optional type.") - -;; This was taken from js2-mode. -;; and extended with tags in http://usejsdoc.org/ -(defconst typescript-jsdoc-arg-tag-regexp - (concat typescript-jsdoc-before-tag-regexp - "\\(@" - (regexp-opt - '("access" - "alias" - "augments" - "base" - "borrows" - "bug" - "callback" - "config" - "default" - "define" - "emits" - "exception" - "extends" - "external" - "fires" - "func" - "function" - "host" - "kind" - "listens" - "member" - "memberof" - "method" - "mixes" - "module" - "name" - "namespace" - "requires" - "since" - "suppress" - "this" - "throws" - "var" - "variation" - "version")) - "\\)\\s-+\\([^ \t]+\\)") - "Matches jsdoc tags with a single argument.") - -;; This was taken from js2-mode -;; and extended with tags in http://usejsdoc.org/ -(defconst typescript-jsdoc-empty-tag-regexp - (concat typescript-jsdoc-before-tag-regexp - "\\(@" - (regexp-opt - '("abstract" - "addon" - "async" - "author" - "class" - "classdesc" - "const" - "constant" - "constructor" - "constructs" - "copyright" - "default" - "defaultvalue" - "deprecated" - "desc" - "description" - "event" - "example" - "exec" - "export" - "exports" - "file" - "fileoverview" - "final" - "func" - "function" - "generator" - "global" - "hidden" - "hideconstructor" - "ignore" - "implicitcast" - "inheritdoc" - "inner" - "instance" - "interface" - "license" - "method" - "mixin" - "noalias" - "noshadow" - "notypecheck" - "override" - "overview" - "owner" - "package" - "preserve" - "preservetry" - "private" - "protected" - "public" - "readonly" - "static" - "summary" - "supported" - "todo" - "tutorial" - "virtual")) - "\\)\\s-*") - "Matches empty jsdoc tags.") - -;; Note that this regexp by itself would match tslint flags that appear inside -;; strings. The logic using this regexp must guard against it. -(defconst typescript-tslint-flag-regexp - "\\(?://\\|/\\*\\)\\s-*\\(tslint:.*?\\)\\(?:\\*/\\|$\\)" - "Matches tslint flags.") - -;;; Faces - -(defface typescript-jsdoc-tag - '((t :foreground "SlateGray")) - "Face used to highlight @whatever tags in jsdoc comments." - :group 'typescript) - -(defface typescript-jsdoc-type - '((t :foreground "SteelBlue")) - "Face used to highlight {FooBar} types in jsdoc comments." - :group 'typescript) - -(defface typescript-jsdoc-value - '((t :foreground "gold4")) - "Face used to highlight tag values in jsdoc comments." - :group 'typescript) - -(defface typescript-access-modifier-face - '((t (:inherit font-lock-keyword-face))) - "Face used to highlight access modifiers." - :group 'typescript) - -(defface typescript-this-face - '((t (:inherit font-lock-keyword-face))) - "Face used to highlight 'this' keyword." - :group 'typescript) - -(defface typescript-primitive-face - '((t (:inherit font-lock-keyword-face))) - "Face used to highlight builtin types." - :group 'typescript) - -;;; User Customization - -(defgroup typescript nil - "Customization variables for typescript mode." - :tag "typescript" - :group 'languages) - -(defcustom typescript-indent-level 4 - "Number of spaces for each indentation step in `typescript-mode'." - :type 'integer - :safe 'integerp - :group 'typescript) -;;;###autoload(put 'typescript-indent-level 'safe-local-variable #'integerp) - -(defcustom typescript-expr-indent-offset 0 - "Number of additional spaces used for indentation of continued expressions. -The value must be no less than minus `typescript-indent-level'." - :type 'integer - :safe 'integerp - :group 'typescript) - -(defcustom typescript-indent-switch-clauses t - "Enable indenting of switch case and default clauses to -replicate tsserver behaviour. Indent level is taken to be -`typescript-indent-level'." - :type 'boolean - :group 'typescript) - -(defcustom typescript-auto-indent-flag t - "Whether to automatically indent when typing punctuation characters. -If non-nil, the characters {}();,: also indent the current line -in typescript mode." - :type 'boolean - :group 'typescript) - -(defcustom typescript-flat-functions nil - "Treat nested functions as top-level functions in `typescript-mode'. -This applies to function movement, marking, and so on." - :type 'boolean - :group 'typescript) - -(defcustom typescript-comment-lineup-func #'c-lineup-C-comments - "Lineup function for `cc-mode-style', for C comments in `typescript-mode'." - :type 'function - :group 'typescript) - -(defcustom typescript-enabled-frameworks typescript--available-frameworks - "Frameworks recognized by `typescript-mode'. -To improve performance, you may turn off some frameworks you -seldom use, either globally or on a per-buffer basis." - :type (cons 'set (mapcar (lambda (x) - (list 'const x)) - typescript--available-frameworks)) - :group 'typescript) - -(defcustom typescript-mode-hook nil - "*Hook called by `typescript-mode'." - :type 'hook - :group 'typescript) - -(defcustom typescript-autoconvert-to-template-flag nil - "Non-nil means automatically convert plain strings to templates. - -When the flag is non-nil the `typescript-autoconvert-to-template' -is called whenever a plain string delimiter is typed in the buffer." - :type 'boolean - :group 'typescript) - -;;; Public utilities - -(defun typescript-convert-to-template () - "Convert the string at point to a template string." - (interactive) - (save-restriction - (widen) - (save-excursion - (let* ((syntax (syntax-ppss)) - (str-terminator (nth 3 syntax)) - (string-start (or (and str-terminator (nth 8 syntax)) - ;; We have to consider the case that we're on the start delimiter of a string. - ;; We tentatively take (point) as string-start. If it turns out we're - ;; wrong, then typescript--move-to-end-of-plain-string will fail anway, - ;; and we won't use the bogus value. - (progn - (forward-char) - (point))))) - (when (typescript--move-to-end-of-plain-string) - (let ((end-start (or (nth 8 (syntax-ppss)) -1))) - (undo-boundary) - (when (= end-start string-start) - (delete-char 1) - (insert "`"))) - (goto-char string-start) - (delete-char 1) - (insert "`")))))) - -(defun typescript-autoconvert-to-template () - "Automatically convert a plain string to a teplate string, if needed. - -This function is meant to be automatically invoked when the user -enters plain string delimiters. It checks whether the character -before point is the end of a string. If it is, then it checks -whether the string contains ${...}. If it does, then it converts -the string from a plain string to a template." - (interactive) - (save-restriction - (widen) - (save-excursion - (backward-char) - (when (and (memq (char-after) '(?' ?\")) - (not (eq (char-before) ?\\))) - (let* ((string-start (nth 8 (syntax-ppss)))) - (when (and string-start - (save-excursion - (re-search-backward "\\${.*?}" string-start t))) - (typescript-convert-to-template))))))) - -;;; KeyMap - -(defvar typescript-mode-map - (let ((keymap (make-sparse-keymap))) - (define-key keymap (kbd "C-c '") #'typescript-convert-to-template) - keymap) - "Keymap for `typescript-mode'.") - -(defun typescript--post-self-insert-function () - (when (and (derived-mode-p 'typescript-mode) - typescript-autoconvert-to-template-flag - (or (eq last-command-event ?\') - (eq last-command-event ?\"))) - (typescript-autoconvert-to-template))) - -;;; Syntax table and parsing - -(defvar typescript-mode-syntax-table - (let ((table (make-syntax-table))) - (c-populate-syntax-table table) - (modify-syntax-entry ?$ "_" table) - (modify-syntax-entry ?` "\"" table) - table) - "Syntax table for `typescript-mode'.") - -(defvar typescript--quick-match-re nil - "Autogenerated regexp used by `typescript-mode' to match buffer constructs.") - -(defvar typescript--quick-match-re-func nil - "Autogenerated regexp used by `typescript-mode' to match constructs and functions.") - -(make-variable-buffer-local 'typescript--quick-match-re) -(make-variable-buffer-local 'typescript--quick-match-re-func) - -(defvar typescript--cache-end 1 - "Last valid buffer position for the `typescript-mode' function cache.") -(make-variable-buffer-local 'typescript--cache-end) - -(defvar typescript--last-parse-pos nil - "Latest parse position reached by `typescript--ensure-cache'.") -(make-variable-buffer-local 'typescript--last-parse-pos) - -(defvar typescript--state-at-last-parse-pos nil - "Parse state at `typescript--last-parse-pos'.") -(make-variable-buffer-local 'typescript--state-at-last-parse-pos) - -(defun typescript--flatten-list (list) - (cl-loop for item in list - nconc (cond ((consp item) - (typescript--flatten-list item)) - (item (list item))))) - -(defun typescript--maybe-join (prefix separator suffix &rest list) - "Helper function for `typescript--update-quick-match-re'. -If LIST contains any element that is not nil, return its non-nil -elements, separated by SEPARATOR, prefixed by PREFIX, and ended -with SUFFIX as with `concat'. Otherwise, if LIST is empty, return -nil. If any element in LIST is itself a list, flatten that -element." - (setq list (typescript--flatten-list list)) - (when list - (concat prefix (mapconcat #'identity list separator) suffix))) - -(defun typescript--update-quick-match-re () - "Internal function used by `typescript-mode' for caching buffer constructs. -This updates `typescript--quick-match-re', based on the current set of -enabled frameworks." - (setq typescript--quick-match-re - (typescript--maybe-join - "^[ \t]*\\(?:" "\\|" "\\)" - - ;; #define mumble - "#define[ \t]+[a-zA-Z_]" - - (when (memq 'exttypescript typescript-enabled-frameworks) - "Ext\\.extend") - - (when (memq 'prototype typescript-enabled-frameworks) - "Object\\.extend") - - ;; var mumble = THING ( - (typescript--maybe-join - "\\(?:var[ \t]+\\)?[a-zA-Z_$0-9.]+[ \t]*=[ \t]*\\(?:" - "\\|" - "\\)[ \t]*\(" - - (when (memq 'prototype typescript-enabled-frameworks) - "Class\\.create") - - (when (memq 'exttypescript typescript-enabled-frameworks) - "Ext\\.extend") - - (when (memq 'merrillpress typescript-enabled-frameworks) - "[a-zA-Z_$0-9]+\\.extend\\(?:Final\\)?")) - - (when (memq 'dojo typescript-enabled-frameworks) - "dojo\\.declare[ \t]*\(") - - (when (memq 'mochikit typescript-enabled-frameworks) - "MochiKit\\.Base\\.update[ \t]*\(") - - ;; mumble.prototypeTHING - (typescript--maybe-join - "[a-zA-Z_$0-9.]+\\.prototype\\(?:" "\\|" "\\)" - - (when (memq 'typescript typescript-enabled-frameworks) - '( ;; foo.prototype.bar = function( - "\\.[a-zA-Z_$0-9]+[ \t]*=[ \t]*function[ \t]*\(" - - ;; mumble.prototype = { - "[ \t]*=[ \t]*{"))))) - - (setq typescript--quick-match-re-func - (concat "function\\|" typescript--quick-match-re))) - -(defun typescript--forward-text-property (propname) - "Move over the next value of PROPNAME in the buffer. -If found, return that value and leave point after the character -having that value; otherwise, return nil and leave point at EOB." - (let ((next-value (get-text-property (point) propname))) - (if next-value - (forward-char) - - (goto-char (next-single-property-change - (point) propname nil (point-max))) - (unless (eobp) - (setq next-value (get-text-property (point) propname)) - (forward-char))) - - next-value)) - -(defun typescript--backward-text-property (propname) - "Move over the previous value of PROPNAME in the buffer. -If found, return that value and leave point just before the -character that has that value, otherwise return nil and leave -point at BOB." - (unless (bobp) - (let ((prev-value (get-text-property (1- (point)) propname))) - (if prev-value - (backward-char) - - (goto-char (previous-single-property-change - (point) propname nil (point-min))) - - (unless (bobp) - (backward-char) - (setq prev-value (get-text-property (point) propname)))) - - prev-value))) - -(defsubst typescript--forward-pstate () - (typescript--forward-text-property 'typescript--pstate)) - -(defsubst typescript--backward-pstate () - (typescript--backward-text-property 'typescript--pstate)) - -(defun typescript--pitem-goto-h-end (pitem) - (goto-char (typescript--pitem-h-begin pitem)) - (typescript--forward-pstate)) - -(defun typescript--re-search-forward-inner (regexp &optional bound count) - "Helper function for `typescript--re-search-forward'." - (let ((parse) - str-terminator) - (while (> count 0) - (re-search-forward regexp bound) - (setq parse (syntax-ppss)) - (cond ((setq str-terminator (nth 3 parse)) - (when (eq str-terminator t) - (setq str-terminator ?/)) - (re-search-forward - (concat "\\([^\\]\\|^\\)" (string str-terminator)) - (save-excursion (end-of-line) (point)) t)) - ((nth 7 parse) - (forward-line)) - ((or (nth 4 parse) - (and (eq (char-before) ?\/) (eq (char-after) ?\*))) - (re-search-forward "\\*/")) - (t - (setq count (1- count)))))) - (point)) - - -(defun typescript--re-search-forward (regexp &optional bound noerror count) - "Search forward, ignoring strings and comments. -This function invokes `re-search-forward', but treats the buffer -as if strings and comments have been removed." - (let ((saved-point (point)) - (search-expr - (cond ((null count) - '(typescript--re-search-forward-inner regexp bound 1)) - ((< count 0) - '(typescript--re-search-backward-inner regexp bound (- count))) - ((> count 0) - '(typescript--re-search-forward-inner regexp bound count))))) - (condition-case err - (eval search-expr) - (search-failed - (goto-char saved-point) - (unless noerror - (error (error-message-string err))))))) - - -(defun typescript--re-search-backward-inner (regexp &optional bound count) - "Auxiliary function for `typescript--re-search-backward'." - (let ((parse)) - (while (> count 0) - (re-search-backward regexp bound) - (when (and (> (point) (point-min)) - (save-excursion (backward-char) (looking-at "/[/*]"))) - (forward-char)) - (setq parse (syntax-ppss)) - (cond - ;; If we are in a comment or a string, jump back to the start - ;; of the comment or string. - ((nth 8 parse) - (goto-char (nth 8 parse))) - ((and (eq (char-before) ?/) (eq (char-after) ?*)) - (re-search-backward "/\\*")) - (t - (setq count (1- count)))))) - (point)) - - -(defun typescript--re-search-backward (regexp &optional bound noerror count) - "Search backward, ignoring strings, and comments. - -This function invokes `re-search-backward' but treats the buffer -as if strings and comments have been removed. - -IMPORTANT NOTE: searching for \"\\n\" with this function to find -line breaks will generally not work, because the final newline of -a one-line comment is considered to be part of the comment and -will be skipped. Take the following code: - - let a = 1; - let b = 2; // Foo - let c = 3; - -If the point is in the last line, searching back for \"\\n\" will -skip over the line with \"let b\". The newline found will be the -one at the end of the line with \"let a\"." - (let ((saved-point (point)) - (search-expr - (cond ((null count) - '(typescript--re-search-backward-inner regexp bound 1)) - ((< count 0) - '(typescript--re-search-forward-inner regexp bound (- count))) - ((> count 0) - '(typescript--re-search-backward-inner regexp bound count))))) - (condition-case err - (eval search-expr) - (search-failed - (goto-char saved-point) - (unless noerror - (error (error-message-string err))))))) - -(defun typescript--forward-expression () - "Move forward over a whole typescript expression. -This function doesn't move over expressions continued across -lines." - (cl-loop - do (progn - (forward-comment most-positive-fixnum) - (cl-loop until (or (eolp) - (progn - (forward-comment most-positive-fixnum) - (memq (char-after) '(?\, ?\; ?\] ?\) ?\})))) - do (forward-sexp))) - while (and (eq (char-after) ?\n) - (save-excursion - (forward-char) - (typescript--continued-expression-p))))) - -(defun typescript--forward-function-decl () - "Move forward over a typescript function declaration. -This puts point at the 'function' keyword. - -If this is a syntactically-correct non-expression function, -return the name of the function, or t if the name could not be -determined. Otherwise, return nil." - (cl-assert (looking-at "\\_")) - (let ((name t)) - (forward-word) - (forward-comment most-positive-fixnum) - (when (looking-at typescript--name-re) - (setq name (match-string-no-properties 0)) - (goto-char (match-end 0))) - (forward-comment most-positive-fixnum) - (and (eq (char-after) ?\( ) - (ignore-errors (forward-list) t) - (progn (forward-comment most-positive-fixnum) - (and (eq (char-after) ?{) - name))))) - -(defun typescript--function-prologue-beginning (&optional pos) - "Return the start of the typescript function prologue containing POS. -A function prologue is everything from start of the definition up -to and including the opening brace. POS defaults to point. -If POS is not in a function prologue, return nil." - (let (prologue-begin) - (save-excursion - (if pos - (goto-char pos) - (setq pos (point))) - - (when (save-excursion - (forward-line 0) - (or (looking-at typescript--function-heading-2-re) - (looking-at typescript--function-heading-3-re))) - - (setq prologue-begin (match-beginning 1)) - (when (<= prologue-begin pos) - (goto-char (match-end 0)))) - - (skip-syntax-backward "w_") - (and (or (looking-at "\\_") - (typescript--re-search-backward "\\_" nil t)) - - (save-match-data (goto-char (match-beginning 0)) - (typescript--forward-function-decl)) - - (<= pos (point)) - (or prologue-begin (match-beginning 0)))))) - -(defun typescript--beginning-of-defun-raw () - "Helper function for `typescript-beginning-of-defun'. -Go to previous defun-beginning and return the parse state for it, -or nil if we went all the way back to bob and don't find -anything." - (typescript--ensure-cache) - (let (pstate) - (while (and (setq pstate (typescript--backward-pstate)) - (not (eq 'function (typescript--pitem-type (car pstate)))))) - (and (not (bobp)) pstate))) - -(defun typescript--pstate-is-toplevel-defun (pstate) - "Helper function for `typescript--beginning-of-defun-nested'. -If PSTATE represents a non-empty top-level defun, return the -top-most pitem. Otherwise, return nil." - (cl-loop for pitem in pstate - with func-depth = 0 - with func-pitem - if (eq 'function (typescript--pitem-type pitem)) - do (cl-incf func-depth) - and do (setq func-pitem pitem) - finally return (if (eq func-depth 1) func-pitem))) - -(defun typescript--beginning-of-defun-nested () - "Helper function for `typescript--beginning-of-defun'. -Return the pitem of the function we went to the beginning of." - (or - ;; Look for the smallest function that encloses point... - (cl-loop for pitem in (typescript--parse-state-at-point) - if (and (eq 'function (typescript--pitem-type pitem)) - (typescript--inside-pitem-p pitem)) - do (goto-char (typescript--pitem-h-begin pitem)) - and return pitem) - - ;; ...and if that isn't found, look for the previous top-level - ;; defun - (cl-loop for pstate = (typescript--backward-pstate) - while pstate - if (typescript--pstate-is-toplevel-defun pstate) - do (goto-char (typescript--pitem-h-begin it)) - and return it))) - -(defun typescript--beginning-of-defun-flat () - "Helper function for `typescript-beginning-of-defun'." - (let ((pstate (typescript--beginning-of-defun-raw))) - (when pstate - (goto-char (typescript--pitem-h-begin (car pstate)))))) - -(defun typescript-beginning-of-defun (&optional arg) - "Value of `beginning-of-defun-function' for `typescript-mode'." - (setq arg (or arg 1)) - (while (and (not (eobp)) (< arg 0)) - (cl-incf arg) - (when (and (not typescript-flat-functions) - (or (eq (typescript-syntactic-context) 'function) - (typescript--function-prologue-beginning))) - (typescript-end-of-defun)) - - (if (typescript--re-search-forward - "\\_" nil t) - (goto-char (typescript--function-prologue-beginning)) - (goto-char (point-max)))) - - (while (> arg 0) - (cl-decf arg) - ;; If we're just past the end of a function, the user probably wants - ;; to go to the beginning of *that* function - (when (eq (char-before) ?}) - (backward-char)) - - (let ((prologue-begin (typescript--function-prologue-beginning))) - (cond ((and prologue-begin (< prologue-begin (point))) - (goto-char prologue-begin)) - - (typescript-flat-functions - (typescript--beginning-of-defun-flat)) - (t - (typescript--beginning-of-defun-nested)))))) - -(defun typescript--flush-caches (&optional beg ignored) - "Flush the `typescript-mode' syntax cache after position BEG. -BEG defaults to `point-min', meaning to flush the entire cache." - (interactive) - (setq beg (or beg (save-restriction (widen) (point-min)))) - (setq typescript--cache-end (min typescript--cache-end beg))) - -(defmacro typescript--debug (&rest arguments) - ;; `(message ,@arguments) - ) - -(defun typescript--ensure-cache--pop-if-ended (open-items paren-depth) - (let ((top-item (car open-items))) - (when (<= paren-depth (typescript--pitem-paren-depth top-item)) - (cl-assert (not (get-text-property (1- (point)) 'typescript-pend))) - (put-text-property (1- (point)) (point) 'typescript--pend top-item) - (setf (typescript--pitem-b-end top-item) (point)) - (setq open-items - ;; open-items must contain at least two items for this to - ;; work, but because we push a dummy item to start with, - ;; that assumption holds. - (cons (typescript--pitem-add-child (cl-second open-items) top-item) - (cddr open-items))))) - open-items) - -(defmacro typescript--ensure-cache--update-parse () - "Helper function for `typescript--ensure-cache'. -Update parsing information up to point, referring to parse, -prev-parse-point, goal-point, and open-items bound lexically in -the body of `typescript--ensure-cache'." - `(progn - (setq goal-point (point)) - (goto-char prev-parse-point) - (while (progn - (setq open-items (typescript--ensure-cache--pop-if-ended - open-items (car parse))) - ;; Make sure parse-partial-sexp doesn't stop because we *entered* - ;; the given depth -- i.e., make sure we're deeper than the target - ;; depth. - (cl-assert (> (nth 0 parse) - (typescript--pitem-paren-depth (car open-items)))) - (setq parse (parse-partial-sexp - prev-parse-point goal-point - (typescript--pitem-paren-depth (car open-items)) - nil parse)) - -;; (let ((overlay (make-overlay prev-parse-point (point)))) -;; (overlay-put overlay 'face '(:background "red")) -;; (unwind-protect -;; (progn -;; (typescript--debug "parsed: %S" parse) -;; (sit-for 1)) -;; (delete-overlay overlay))) - - (setq prev-parse-point (point)) - (< (point) goal-point))) - - (setq open-items (typescript--ensure-cache--pop-if-ended - open-items (car parse))))) - -(defun typescript--show-cache-at-point () - (interactive) - (require 'pp) - (let ((prop (get-text-property (point) 'typescript--pstate))) - (with-output-to-temp-buffer "*Help*" - (pp prop)))) - -(defun typescript--split-name (string) - "Split a typescript name into its dot-separated parts. -This also removes any prototype parts from the split name -\(unless the name is just \"prototype\" to start with)." - (let ((name (save-match-data - (split-string string "\\." t)))) - (unless (and (= (length name) 1) - (equal (car name) "prototype")) - - (setq name (remove "prototype" name))))) - -(defvar typescript--guess-function-name-start nil) - -(defun typescript--guess-function-name (position) - "Guess the name of the typescript function at POSITION. -POSITION should be just after the end of the word \"function\". -Return the name of the function, or nil if the name could not be -guessed. - -This function clobbers match data. If we find the preamble -begins earlier than expected while guessing the function name, -set `typescript--guess-function-name-start' to that position; otherwise, -set that variable to nil." - (setq typescript--guess-function-name-start nil) - (save-excursion - (goto-char position) - (forward-line 0) - (cond - ((looking-at typescript--function-heading-3-re) - (and (eq (match-end 0) position) - (setq typescript--guess-function-name-start (match-beginning 1)) - (match-string-no-properties 1))) - - ((looking-at typescript--function-heading-2-re) - (and (eq (match-end 0) position) - (setq typescript--guess-function-name-start (match-beginning 1)) - (match-string-no-properties 1)))))) - -(defun typescript--clear-stale-cache () - ;; Clear any endings that occur after point - (let (end-prop) - (save-excursion - (while (setq end-prop (typescript--forward-text-property - 'typescript--pend)) - (setf (typescript--pitem-b-end end-prop) nil)))) - - ;; Remove any cache properties after this point - (remove-text-properties (point) (point-max) - '(typescript--pstate t typescript--pend t))) - -(defun typescript--ensure-cache (&optional limit) - "Ensures brace cache is valid up to the character before LIMIT. -LIMIT defaults to point." - (setq limit (or limit (point))) - (when (< typescript--cache-end limit) - - (c-save-buffer-state - (open-items - orig-match-start - orig-match-end - orig-depth - parse - prev-parse-point - name - case-fold-search - filtered-class-styles - new-item - goal-point - end-prop) - - ;; Figure out which class styles we need to look for - (setq filtered-class-styles - (cl-loop for style in typescript--class-styles - if (memq (plist-get style :framework) - typescript-enabled-frameworks) - collect style)) - - (save-excursion - (save-restriction - (widen) - - ;; Find last known good position - (goto-char typescript--cache-end) - (unless (bobp) - (setq open-items (get-text-property - (1- (point)) 'typescript--pstate)) - - (unless open-items - (goto-char (previous-single-property-change - (point) 'typescript--pstate nil (point-min))) - - (unless (bobp) - (setq open-items (get-text-property (1- (point)) - 'typescript--pstate)) - (cl-assert open-items)))) - - (unless open-items - ;; Make a placeholder for the top-level definition - (setq open-items (list typescript--initial-pitem))) - - (setq parse (syntax-ppss)) - (setq prev-parse-point (point)) - - (typescript--clear-stale-cache) - - (narrow-to-region (point-min) limit) - - (cl-loop while (re-search-forward typescript--quick-match-re-func nil t) - for orig-match-start = (goto-char (match-beginning 0)) - for orig-match-end = (match-end 0) - do (typescript--ensure-cache--update-parse) - for orig-depth = (nth 0 parse) - - ;; Each of these conditions should return non-nil if - ;; we should add a new item and leave point at the end - ;; of the new item's header (h-end in the - ;; typescript--pitem diagram). This point is the one - ;; after the last character we need to unambiguously - ;; detect this construct. If one of these evaluates to - ;; nil, the location of the point is ignored. - if (cond - ;; In comment or string - ((nth 8 parse) nil) - - ;; Regular function declaration - ((and (looking-at "\\_") - (setq name (typescript--forward-function-decl))) - - (when (eq name t) - (setq name (typescript--guess-function-name orig-match-end)) - (if name - (when typescript--guess-function-name-start - (setq orig-match-start - typescript--guess-function-name-start)) - - (setq name t))) - - (cl-assert (eq (char-after) ?{)) - (forward-char) - (make-typescript--pitem - :paren-depth orig-depth - :h-begin orig-match-start - :type 'function - :name (if (eq name t) - name - (typescript--split-name name)))) - - ;; "Prototype function" declaration - ((looking-at typescript--plain-method-re) - (goto-char (match-beginning 3)) - (when (save-match-data - (typescript--forward-function-decl)) - (forward-char) - (make-typescript--pitem - :paren-depth orig-depth - :h-begin orig-match-start - :type 'function - :name (nconc (typescript--split-name - (match-string-no-properties 1)) - (list (match-string-no-properties 2)))))) - - ;; Class definition - ((cl-loop with syntactic-context = - (typescript--syntactic-context-from-pstate open-items) - for class-style in filtered-class-styles - if (and (memq syntactic-context - (plist-get class-style :contexts)) - (looking-at (plist-get class-style - :class-decl))) - do (goto-char (match-end 0)) - and return - (make-typescript--pitem - :paren-depth orig-depth - :h-begin orig-match-start - :type class-style - :name (typescript--split-name - (match-string-no-properties 1)))))) - - do (typescript--ensure-cache--update-parse) - and do (push it open-items) - and do (put-text-property - (1- (point)) (point) 'typescript--pstate open-items) - else do (goto-char orig-match-end)) - - (goto-char limit) - (typescript--ensure-cache--update-parse) - (setq typescript--cache-end limit) - (setq typescript--last-parse-pos limit) - (setq typescript--state-at-last-parse-pos open-items)))))) - -(defun typescript--end-of-defun-flat () - "Helper function for `typescript-end-of-defun'." - (cl-loop while (typescript--re-search-forward "}" nil t) - do (typescript--ensure-cache) - if (get-text-property (1- (point)) 'typescript--pend) - if (eq 'function (typescript--pitem-type it)) - return t - finally do (goto-char (point-max)))) - -(defun typescript--end-of-defun-nested () - "Helper function for `typescript-end-of-defun'." - (message "test") - (let* (pitem - (this-end (save-excursion - (and (setq pitem (typescript--beginning-of-defun-nested)) - (typescript--pitem-goto-h-end pitem) - (progn (backward-char) - (forward-list) - (point))))) - found) - - (if (and this-end (< (point) this-end)) - ;; We're already inside a function; just go to its end. - (goto-char this-end) - - ;; Otherwise, go to the end of the next function... - (while (and (typescript--re-search-forward "\\_" nil t) - (not (setq found (progn - (goto-char (match-beginning 0)) - (typescript--forward-function-decl)))))) - - (if found (forward-list) - ;; ... or eob. - (goto-char (point-max)))))) - -(defun typescript-end-of-defun (&optional arg) - "Value of `end-of-defun-function' for `typescript-mode'." - (setq arg (or arg 1)) - (while (and (not (bobp)) (< arg 0)) - (cl-incf arg) - (typescript-beginning-of-defun) - (typescript-beginning-of-defun) - (unless (bobp) - (typescript-end-of-defun))) - - (while (> arg 0) - (cl-decf arg) - ;; look for function backward. if we're inside it, go to that - ;; function's end. otherwise, search for the next function's end and - ;; go there - (if typescript-flat-functions - (typescript--end-of-defun-flat) - - ;; if we're doing nested functions, see whether we're in the - ;; prologue. If we are, go to the end of the function; otherwise, - ;; call typescript--end-of-defun-nested to do the real work - (let ((prologue-begin (typescript--function-prologue-beginning))) - (cond ((and prologue-begin (<= prologue-begin (point))) - (goto-char prologue-begin) - (re-search-forward "\\_" - (1 font-lock-constant-face)) - - (,(rx symbol-start "class" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - (,(rx symbol-start "extends" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - (,(rx symbol-start "implements" (+ space)) - (,(rx symbol-start (+ (syntax word))) nil nil (0 font-lock-type-face))) - - (,(rx symbol-start "interface" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - (,(rx symbol-start "type" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - (,(rx symbol-start "enum" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - ;; Highlights class being declared, in parts - (typescript--class-decl-matcher - ,(concat "\\(" typescript--name-re "\\)\\(?:\\.\\|.*$\\)") - (goto-char (match-beginning 1)) - nil - (1 font-lock-type-face)) - - ;; Highlights parent class, in parts, if available - (typescript--class-decl-matcher - ,(concat "\\(" typescript--name-re "\\)\\(?:\\.\\|.*$\\)") - (if (match-beginning 2) - (progn - (setq typescript--tmp-location (match-end 2)) - (goto-char typescript--tmp-location) - (insert "=") - (goto-char (match-beginning 2))) - (setq typescript--tmp-location nil) - (goto-char (point-at-eol))) - (when typescript--tmp-location - (save-excursion - (goto-char typescript--tmp-location) - (delete-char 1))) - (1 font-lock-type-face)) - - ;; Highlights parent class - (typescript--class-decl-matcher - (2 font-lock-type-face nil t)) - - ;; Dojo needs its own matcher to override the string highlighting - (,(typescript--make-framework-matcher - 'dojo - "^\\s-*dojo\\.declare\\s-*(\"" - "\\(" typescript--dotted-name-re "\\)" - "\\(?:\"\\s-*,\\s-*\\(" typescript--dotted-name-re "\\)\\)?") - (1 font-lock-type-face t) - (2 font-lock-type-face nil t)) - - ;; Match Dojo base classes. Of course Mojo has to be different - ;; from everything else under the sun... - (,(typescript--make-framework-matcher - 'dojo - "^\\s-*dojo\\.declare\\s-*(\"" - "\\(" typescript--dotted-name-re "\\)\"\\s-*,\\s-*\\[") - ,(concat "[[,]\\s-*\\(" typescript--dotted-name-re "\\)\\s-*" - "\\(?:\\].*$\\)?") - (backward-char) - (end-of-line) - (1 font-lock-type-face)) - - ;; continued Dojo base-class list - (,(typescript--make-framework-matcher - 'dojo - "^\\s-*" typescript--dotted-name-re "\\s-*[],]") - ,(concat "\\(" typescript--dotted-name-re "\\)" - "\\s-*\\(?:\\].*$\\)?") - (if (save-excursion (backward-char) - (typescript--inside-dojo-class-list-p)) - (forward-symbol -1) - (end-of-line)) - (end-of-line) - (1 font-lock-type-face)) - - ;; variable declarations - ,(list - (concat "\\_<\\(const\\|var\\|let\\)\\_>\\|" typescript--basic-type-re) - (list #'typescript--variable-decl-matcher nil nil nil)) - - ;; class instantiation - ,(list - (concat "\\_\\s-+\\(" typescript--dotted-name-re "\\)") - (list 1 'font-lock-type-face)) - - ;; instanceof - ,(list - (concat "\\_\\s-+\\(" typescript--dotted-name-re "\\)") - (list 1 'font-lock-type-face)) - - ;; formal parameters - ,(list - (concat - "\\_\\(\\s-+" typescript--name-re "\\)?\\s-*\\(<.*>\\)?\\s-*(\\s-*" - typescript--name-start-re) - (list (concat "\\(" typescript--name-re "\\)\\(\\s-*).*\\)?") - '(backward-char) - '(end-of-line) - '(1 font-lock-variable-name-face))) - - ;; continued formal parameter list - ,(list - (concat - "^\\s-*" typescript--name-re "\\s-*[,)]") - (list typescript--name-re - '(if (save-excursion (backward-char) - (typescript--inside-param-list-p)) - (forward-symbol -1) - (end-of-line)) - '(end-of-line) - '(0 font-lock-variable-name-face)))) - "Level three font lock for `typescript-mode'.") - -(defun typescript--flyspell-mode-predicate () - "A custom predicate to help `flyspell-prog-mode' determine whether a word should be checked." - ;; We depend on fontification for our results. font-lock-ensure is defined on - ;; Emacs 25 and over. Earlier versions use font-lock-fontify-buffer. - (if (fboundp 'font-lock-ensure) - (font-lock-ensure) - (font-lock-fontify-buffer)) - (and - ;; Check with the default method that flyspell provides. - (flyspell-generic-progmode-verify) - - ;; - ;; And eliminate cases specific to our mode we don't want to have - ;; spell-checked. - ;; - - ;; Don't check the module names in import statements. - (save-excursion - (not (let* ((parse (syntax-ppss (1- (point)))) - (string-start-pos (and (nth 3 parse) - (nth 8 parse)))) - (and string-start-pos - (save-match-data - ;; Move to back to the start of the string, then past any ws - ;; and then past any non-ws to see if we have "from" or "import". - (goto-char string-start-pos) - (typescript--backward-syntactic-ws) - (skip-syntax-backward "^-" (point-at-bol)) - (looking-at "from\\|import\\s-")))))))) - -(defun typescript--inside-pitem-p (pitem) - "Return whether point is inside the given pitem's header or body." - (typescript--ensure-cache) - (cl-assert (typescript--pitem-h-begin pitem)) - (cl-assert (typescript--pitem-paren-depth pitem)) - - (and (> (point) (typescript--pitem-h-begin pitem)) - (or (null (typescript--pitem-b-end pitem)) - (> (typescript--pitem-b-end pitem) (point))))) - -(defun typescript--parse-state-at-point () - "Parse the typescript program state at point. -Return a list of `typescript--pitem' instances that apply to point, most -specific first. In the worst case, the current toplevel instance -will be returned." - (save-excursion - (save-restriction - (widen) - (typescript--ensure-cache) - (let* ((bound (if (eobp) (point) (1+ (point)))) - (pstate (or (save-excursion - (typescript--backward-pstate)) - (list typescript--initial-pitem)))) - - ;; Loop until we either hit a pitem at BOB or pitem ends after - ;; point (or at point if we're at eob) - (cl-loop for pitem = (car pstate) - until (or (eq (typescript--pitem-type pitem) - 'toplevel) - (typescript--inside-pitem-p pitem)) - do (pop pstate)) - - pstate)))) - -(defun typescript--syntactic-context-from-pstate (pstate) - "Return the typescript syntactic context corresponding to PSTATE." - (let ((type (typescript--pitem-type (car pstate)))) - (cond ((memq type '(function macro)) - type) - ((consp type) - 'class) - (t 'toplevel)))) - -(defun typescript-syntactic-context () - "Return the typescript syntactic context at point. -When called interatively, also display a message with that -context." - (interactive) - (let* ((syntactic-context (typescript--syntactic-context-from-pstate - (typescript--parse-state-at-point)))) - - (when (called-interactively-p 'interactive) - (message "Syntactic context: %s" syntactic-context)) - - syntactic-context)) - -(defun typescript--class-decl-matcher (limit) - "Font lock function used by `typescript-mode'. -This performs fontification according to `typescript--class-styles'." - (cl-loop initially (typescript--ensure-cache limit) - while (re-search-forward typescript--quick-match-re limit t) - for orig-end = (match-end 0) - do (goto-char (match-beginning 0)) - if (cl-loop for style in typescript--class-styles - for decl-re = (plist-get style :class-decl) - if (and (memq (plist-get style :framework) - typescript-enabled-frameworks) - (memq (typescript-syntactic-context) - (plist-get style :contexts)) - decl-re - (looking-at decl-re)) - do (goto-char (match-end 0)) - and return t) - return t - else do (goto-char orig-end))) - -(defconst typescript--font-lock-keywords-4 - `( - ;; highlights that override previous levels - ;; - - ;; special highlight for `this' keyword - ("\\(this\\)\\." - (1 'typescript-this-face)) - - (,typescript--access-modifier-re (1 'typescript-access-modifier-face)) - (,typescript--basic-type-re (1 'typescript-primitive-face)) - - ;; generics support - ,(list - (concat typescript--name-re "\\s-*" "<\\s-*" typescript--name-start-re) - (list (concat "\\(" typescript--name-re "\\)\\(\\s-*>[^<]*\\)?") - '(backward-char) - '(end-of-line) - '(1 font-lock-type-face))) - - ;; highlights that append to previous levels - ;; - ,@typescript--font-lock-keywords-3 - - (,typescript--decorator-re (1 font-lock-function-name-face)) - (,typescript--function-call-re (1 font-lock-function-name-face)) - (,typescript--builtin-re (1 font-lock-type-face)) - - ;; arrow function - ("\\(=>\\)" - (1 font-lock-keyword-face))) - "Level four font lock for `typescript-mode'.") - -(defconst typescript--font-lock-keywords - '(typescript--font-lock-keywords-4 typescript--font-lock-keywords-1 - typescript--font-lock-keywords-2 - typescript--font-lock-keywords-3 - typescript--font-lock-keywords-4) - "Font lock keywords for `typescript-mode'. See `font-lock-keywords'.") - -;;; Propertize - -;; -;; The propertize code was adapted from: -;; https://github.com/emacs-mirror/emacs/blob/489d6466372f488adc53897435fff290394b62f7/lisp/progmodes/js.el -;; - -(defconst typescript--syntax-propertize-regexp-regexp - (rx - ;; Start of regexp. - "/" - (0+ (or - ;; Match characters outside of a character class. - (not (any ?\[ ?/ ?\\)) - ;; Match backslash quoted characters. - (and "\\" not-newline) - ;; Match character class. - (and - "[" - (0+ (or - (not (any ?\] ?\\)) - (and "\\" not-newline))) - "]"))) - (group (zero-or-one "/"))) - "Regular expression matching a JavaScript regexp literal.") - -(defun typescript-syntax-propertize-regexp (end) - (let ((ppss (syntax-ppss))) - (when (eq (nth 3 ppss) ?/) - ;; A /.../ regexp. - (goto-char (nth 8 ppss)) - (when (looking-at typescript--syntax-propertize-regexp-regexp) - ;; Don't touch text after END. - (when (> end (match-end 1)) - (setq end (match-end 1))) - (put-text-property (match-beginning 1) end - 'syntax-table (string-to-syntax "\"/")) - (goto-char end))))) - -(defun typescript-syntax-propertize (start end) - ;; JavaScript allows immediate regular expression objects, written /.../. - (funcall - (syntax-propertize-rules - ;; Distinguish /-division from /-regexp chars (and from /-comment-starter). - ;; FIXME: Allow regexps after infix ops like + ... - ;; https://developer.mozilla.org/en/JavaScript/Reference/Operators - ;; We can probably just add +, -, <, >, %, ^, ~, ?, : at which - ;; point I think only * and / would be missing which could also be added, - ;; but need care to avoid affecting the // and */ comment markers. - ("\\(?:^\\|[=([{,:;|&!]\\|\\_\\)\\(?:[ \t]\\)*\\(/\\)[^/*]" - (1 (ignore - (forward-char -1) - (when (or (not (memq (char-after (match-beginning 0)) '(?\s ?\t))) - ;; If the / is at the beginning of line, we have to check - ;; the end of the previous text. - (save-excursion - (goto-char (match-beginning 0)) - (forward-comment (- (point))) - (memq (char-before) - (eval-when-compile (append "=({[,:;" '(nil)))))) - (put-text-property (match-beginning 1) (match-end 1) - 'syntax-table (string-to-syntax "\"/")) - (typescript-syntax-propertize-regexp end))))) - ;; Hash-bang at beginning of buffer. - ("\\`\\(#\\)!" (1 "< b"))) - start end)) - -;;; Indentation - -(defconst typescript--possibly-braceless-keyword-re - (typescript--regexp-opt-symbol - '("catch" "do" "else" "finally" "for" "if" "try" "while" "with")) - "Regexp matching keywords optionally followed by an opening brace.") - -(defconst typescript--indent-keyword-re - (typescript--regexp-opt-symbol '("in" "instanceof")) - "Regexp matching keywords that affect indentation of continued expressions.") - -(defconst typescript--indent-operator-re - (concat "[-+*/%<>=&^|?:.]\\([^-+*/]\\|$\\)\\|" typescript--indent-keyword-re) - "Regexp matching operators that affect indentation of continued expressions.") - -;; -;; We purposely do not allow the plus symbol as a prefix here, as this -;; regex is used to check number literal in type annotations, and TS -;; does not allow to use a plus symbol to prefix numbers there: you -;; can use 1, but not +1 in a type annotation. -;; -;; This is meant to match NaN, floats, decimals, the two infinities -;; and numbers recorded in binary, octal and hex. -;; -;; This regular expression was derived from: -;; https://stackoverflow.com/a/30987109/ -;; -(defconst typescript--number-literal-re - "\\(?:NaN\\|-?\\(?:0[Bb][01]+\\|0[Oo][0-7]+\\|0[Xx][0-9a-fA-F]+\\|Infinity\\|\\(?:[[:digit:]]*\\.[[:digit:]]+\\|[[:digit:]]+\\)\\(?:[Ee][+-]?[[:digit:]]+\\)?\\)\\)" - "Regexp that matches number literals.") - -(defconst typescript--reserved-start-keywords - '("const" "export" "function" "let" "var") - "These keywords cannot be variable or type names and start a new sentence. -Note that the \"import\" keyword can be a type import since TS2.9, so it might -not start a sentence!") - -(defconst typescript--reserved-start-keywords-re - (typescript--regexp-opt-symbol '("const" "export" "function" "let" "var")) - "A regular expression matching `typescript--reserved-start-keywords'.") - -(defconst typescript--type-vs-ternary-re - (concat "[?]\\|" (typescript--regexp-opt-symbol - (append typescript--reserved-start-keywords - '("as" "class" "interface" "private" "public" "readonly")))) - "Keywords/Symbols that help tell apart colon for types vs ternary operators.") - -(defun typescript--search-backward-matching-angle-bracket-inner (depth) - "Auxiliary function for `typescript--search-backward-matching-angle-bracket'. -DEPTH indicates how nested we think we are: it increases when we cross closing -brackets, and decreases when we cross opening brackets." - ;; We look backwards for a "<" that would correspond to the ">" we started - ;; from. However, there is no guarantee that it exists, since our ">" could - ;; be a greater-than operation. Some symbols will make it clear that we are - ;; *not* in a type annotation, so we can return nil. Otherwise, we keep - ;; looking for the matching one. - (or (<= depth 0) - (and - ;; If we cross over a reserved start keyword, we abandon hope of finding - ;; a matching angle bracket. This prevents extreme recursion depths. - (typescript--re-search-backward (concat "[<>]\\|" typescript--reserved-start-keywords-re) nil t) - (cl-case (char-after) - (?< (typescript--search-backward-matching-angle-bracket-inner (- depth 1))) - (?> (typescript--search-backward-matching-angle-bracket-inner (+ depth 1))))))) - -(defun typescript--search-backward-matching-angle-bracket () - "Search for matching \"<\" preceding a starting \">\". -DEPTH indicates how nested we think we are. Assumes the starting position is -right before the closing \">\". Returns nil when a match was not found, -otherwise returns t and the current position is right before the matching -\"<\"." - (typescript--search-backward-matching-angle-bracket-inner 1)) - -(defun typescript--re-search-backward-ignoring-angle-brackets () - "Search backwards, jumping over text within angle brackets. -Searches specifically for any of \"=\", \"}\", and \"type\"." - (and - (typescript--re-search-backward "[>=}]\\|\\_" nil t) - (or (not (looking-at ">")) - (and - (typescript--search-backward-matching-angle-bracket) - (typescript--re-search-backward-ignoring-angle-brackets))))) - -(defun typescript--looking-at-operator-p () - "Return non-nil if point is on a typescript operator, other than a comma." - (save-match-data - (and (looking-at typescript--indent-operator-re) - (or (not (looking-at ":")) - (save-excursion - (backward-sexp) - (and - (typescript--re-search-backward "[?:{]\\|\\_" nil t) - (looking-at "?")))) - ;; Do not identify forward slashes appearing in a "list" as - ;; an operator. The lists are: arrays, or lists of - ;; arguments. In this context, they must be part of regular - ;; expressions, and not math operators. - (not (and (looking-at "/") - (save-excursion - (typescript--backward-syntactic-ws) - (memq (char-before) '(?, ?\[ ?\())))) - ;; Do not identify methods, or fields, that are named "in" or - ;; "instanceof" as being operator keywords. - (not (and - (looking-at typescript--indent-keyword-re) - (save-excursion - (typescript--backward-syntactic-ws) - (memq (char-before) '(?, ?{ ?} ?\;))))) - ;; Do not identify the symbol > if it is likely part of a type argument - ;; T, but identify it if it is likely a greater-than symbol. This is - ;; a hard problem in the absence of semicolons, see: - ;; https://github.com/ananthakumaran/typescript.el/issues/81 - (not (and - (looking-at ">") - (save-excursion - (and - (typescript--search-backward-matching-angle-bracket) - ;; If we made it here, we found a candidate matching opening - ;; angle bracket. We still need to guess whether it actually - ;; is one, and not a spurious less-than operator! - - ;; Look backwards for the first of: - ;; - one of the symbols: = : - ;; - or a TypeScript keyword - ;; Depending on what comes first, we can make an educated - ;; guess on the nature of our ">" of interest. - (typescript--re-search-backward (concat "[=:]\\|" typescript--keyword-re) nil t) - (or - ;; If the previous keyword is "as", definitely a type. - (looking-at "\\_") - ;; Same goes for type imports. - (looking-at "\\_") - ;; A colon could be either a type symbol, or a ternary - ;; operator, try to guess which. - (and (looking-at ":") - (typescript--re-search-backward typescript--type-vs-ternary-re nil t) - (not (looking-at "?"))) - ;; This final check lets us distinguish between a - ;; 2-argument type "t < a , b > ..." and a use of the "," - ;; operator between two comparisons "t < a , b > ...". - ;; Looking back a little more lets us guess. - (and (looking-at "=") - (typescript--re-search-backward-ignoring-angle-brackets) - (looking-at "\\_"))))))) - (not (and - (looking-at "*") - ;; Generator method (possibly using computed property). - (looking-at (concat "\\* *\\(?:\\[\\|" typescript--name-re - " *(\\)")) - (save-excursion - (typescript--backward-syntactic-ws) - ;; We might misindent some expressions that would - ;; return NaN anyway. Shouldn't be a problem. - (memq (char-before) '(?, ?} ?{ ?\;)))))))) - - -(defun typescript--continued-expression-p () - "Return non-nil if the current line continues an expression." - (save-excursion - (back-to-indentation) - (let ((list-start (nth 1 (syntax-ppss)))) - (and - ;; This not clause is there to eliminate degenerate cases where we have - ;; something that looks like a continued expression but we are in fact at - ;; the beginning of the expression. Example: in `if (a) { .q(1)` when the - ;; point is on the dot, the expression that follows looks like a member - ;; expression but the object on which it is a member is missing. If we - ;; naively treat this as a continued expression, we run into trouble - ;; later. (An infinite loop.) - (not (and list-start - (save-excursion - (typescript--backward-syntactic-ws) - (backward-char) - (eq (point) list-start)))) - ;; Don't identify the spread syntax or rest operator as a "continuation". - (not (looking-at "\\.\\.\\.")) - (or (typescript--looking-at-operator-p) - (and (progn - (typescript--backward-syntactic-ws) - (or (bobp) (backward-char)) - (and (> (point) (point-min)) - (save-excursion (backward-char) (not (looking-at "[/*]/"))) - (typescript--looking-at-operator-p) - (and (progn (backward-char) - (not (looking-at "++\\|--\\|/[/*]")))))))))))) - -(cl-defun typescript--compute-member-expression-indent () - "Determine the indent of a member expression. - -This function must be called with point located at the dot that -starts the member expression. -" - ;; Find the line that has the object from which we are getting thismember. - ;; And set an indent relative to that. - (while (looking-at "\\.") - (typescript--backward-syntactic-ws) - (while (eq (char-before) ?\;) - (backward-char)) - (while (memq (char-before) '(?\] ?} ?\) ?>)) - (if (not (eq (char-before) ?>)) - (backward-list) - (backward-char) - (typescript--backward-over-generic-parameter-list)) - (typescript--backward-syntactic-ws)) - (if (looking-back typescript--dotted-name-re nil) - (back-to-indentation) - (typescript--forward-syntactic-ws))) - (+ (current-column) typescript-indent-level)) - -(defun typescript--end-of-do-while-loop-p () - "Return non-nil if point is on the \"while\" of a do-while statement. -Otherwise, return nil. A braceless do-while statement spanning -several lines requires that the start of the loop is indented to -the same column as the current line." - (interactive) - (save-excursion - (save-match-data - (when (looking-at "\\s-*\\_") - (if (save-excursion - (skip-chars-backward "[ \t\n]*}") - (looking-at "[ \t\n]*}")) - (save-excursion - (backward-list) (forward-symbol -1) (looking-at "\\_")) - (typescript--re-search-backward "\\_" (point-at-bol) t) - (or (looking-at "\\_") - (let ((saved-indent (current-indentation))) - (while (and (typescript--re-search-backward "^\\s-*\\_<" nil t) - (/= (current-indentation) saved-indent))) - (and (looking-at "\\s-*\\_") - (not (typescript--re-search-forward - "\\_" (point-at-eol) t)) - (= (current-indentation) saved-indent))))))))) - - -(defun typescript--ctrl-statement-indentation () - "Helper function for `typescript--proper-indentation'. -Return the proper indentation of the current line if it starts -the body of a control statement without braces; otherwise, return -nil." - (save-excursion - (back-to-indentation) - (when (save-excursion - (and (not (eq (point-at-bol) (point-min))) - (not (looking-at "[{]")) - (progn - (typescript--re-search-backward "[[:graph:]]" nil t) - (or (eobp) (forward-char)) - (when (= (char-before) ?\)) (backward-list)) - (skip-syntax-backward " ") - (skip-syntax-backward "w_") - (and - (looking-at typescript--possibly-braceless-keyword-re) - ;; If preceded by period, it's a method call. - (not (= (char-before) ?.)))) - (not (typescript--end-of-do-while-loop-p)))) - (save-excursion - (goto-char (match-beginning 0)) - (+ (current-indentation) typescript-indent-level))))) - -(defun typescript--get-c-offset (symbol anchor) - (let ((c-offsets-alist - (list (cons 'c typescript-comment-lineup-func)))) - (c-get-syntactic-indentation (list (cons symbol anchor))))) - -(defun typescript--backward-over-generic-parameter-list () - "Search backward for the start of a generic's parameter list and move to it. - -This is a utility function for -`typescript--backward-to-parameter-list'. - -This function must be called with the point placed on the final > -of the generic's parameter list. It will scan backwards to find -the start. If successful, it will move the point to the start of -the list. If not, it does not move the point. - -Returns nil on failure, or the position to which the point was -moved on success." - (when (eq (char-after) ?>) - (let ((depth 1)) - (cl-loop named search-loop - while (> depth 0) - do (progn - (unless (re-search-backward "[<>]" nil t) - (cl-return-from search-loop nil)) - (cond - ((looking-at ">") - (unless (eq (char-before) ?=) - (setq depth (1+ depth)))) - ((looking-at "<") (setq depth (1- depth))))) - finally return (point))))) - -(defun typescript--backward-to-parameter-list () - "Search backward for the end of a parameter list and move to it. - -This is a utility function for `typescript--proper-indentation'. - -This function must be called with the point placed before an -opening curly brace. It will try to skip over the type -annotation that would mark the return value of a function and -move to the end of the parameter list. If it is unsuccessful, it -does not move the point. \"Unsuccessful\" here also means that -the position at which we started did not in fact mark the -beginning of a function. The curly brace belonged to some other -syntactic construct than a function. - -Returns nil on failure, or the position to which the point was -moved on success." - (let ((location - (or - ;; This handles the case of a function with return type annotation. - (save-excursion - (cl-loop named search-loop - do - (typescript--backward-syntactic-ws) - ;; Check whether we are at "):". - (when (and (eq (char-before) ?\:) - (progn - (backward-char) - (skip-syntax-backward " ") - (eq (char-before) ?\)))) - ;; Success! This the end of the parameter list. - (cl-return-from search-loop (point))) - ;; If we recognize a structure that belongs in a return type annotation, - ;; skip back over it, or fail. - (cond - ;; Arrow of a function definition, or typeguard (eg. foo is SomeClass) - ((looking-back "=>\\|is" (- (point) 2)) - (backward-char 2)) - ;; End of the parameters list of a generic. - ((eq (char-before) ?>) - (backward-char) - (typescript--backward-over-generic-parameter-list)) - ;; Union of types, or a dot in a dotted name. - ((memq (char-before) '(?| ?.)) - (backward-char)) - ((or - ;; End-delimiter of a delimited construct, for constructs - ;; not handled above. - (memq (char-before) '(?\) ?} ?\" ?\])) - ;; This is also dealing with dotted names. This may come - ;; into play if a jump back moves over an entire dotted - ;; name at once. - ;; - ;; The earlier test for dotted names comes into play if the - ;; logic moves over one part of a dotted name at a time (which - ;; is what `backward-sexp` normally does). - (and (looking-back typescript--dotted-name-re nil) - ;; We don't want the loop to walk over constructs like switch (...) or for (...), etc. - (not (save-excursion - (backward-word) - (looking-at "\\_<\\(switch\\|if\\|while\\|until\\|for\\)\\_>\\(?:\\s-\\|\n\\)*("))))) - (condition-case nil - (backward-sexp) - (scan-error (cl-return-from search-loop nil)))) - ((looking-back typescript--number-literal-re - ;; We limit the search back to the previous space or end of line (if possible) - ;; to prevent the search from going over the whole buffer. - (save-excursion (re-search-backward "\\(?:\\s-\\|\n\\)" nil t)) t) - (goto-char (match-beginning 0))) - ;; Otherwise, we failed to find a location. - (t - (cl-return-from search-loop nil))))) - ;; This handles the case of a function without return type annotation. - (progn - (typescript--backward-syntactic-ws) - (when (eq (char-before) ?\)) - (point)))))) - (when location - (goto-char location)))) - -(defun typescript--proper-indentation (parse-status) - "Return the proper indentation for the current line." - (save-excursion - (back-to-indentation) - (let ((member-expr-p (looking-at "\\."))) - (cond ((nth 4 parse-status) ;; Inside a comment. - (typescript--get-c-offset 'c (nth 8 parse-status))) - ((nth 8 parse-status) 0) ;; Inside a string. - ((typescript--ctrl-statement-indentation)) ;; Control statements. - ((eq (char-after) ?#) 0) ;; Looking at a pragma. - ;; Inside a list of things. Note that in the TS contents, the curly braces - ;; marking code blocks are "list of things". - ((nth 1 parse-status) - (let ((indent-start (point)) - (same-indent-p (looking-at "[]})]")) - (switch-keyword-p (looking-at "\\_\\|\\_[^:]")) - (continued-expr-p (typescript--continued-expression-p)) - (list-start (nth 1 parse-status))) - (goto-char list-start) - (if (looking-at "[({[]\\s-*\\(/[/*]\\|$\\)") - (progn - (skip-syntax-backward " ") - (cond - ((or (typescript--backward-to-parameter-list) - (eq (char-before) ?\))) - ;; Take the curly brace as marking off the body of a function. - ;; In that case, we want the code that follows to see the indentation - ;; that was in effect at the beginning of the function declaration, and thus - ;; we want to move back over the list of function parameters. - (condition-case nil - (backward-list) - (error nil))) - ((looking-back "," nil) - ;; If we get here, we have a comma, spaces and an opening curly brace. (And - ;; (point) is just after the comma.) We don't want to move from the current position - ;; so that object literals in parameter lists are properly indented. - nil) - (t - ;; In all other cases, we don't want to move from the curly brace. - (goto-char list-start))) - (back-to-indentation) - (let* ((in-switch-p (unless same-indent-p - (looking-at "\\_"))) - (same-indent-p (or same-indent-p - (and switch-keyword-p - in-switch-p))) - (indent - (cond (same-indent-p - (current-column)) - (continued-expr-p - (if (not member-expr-p) - (+ (current-column) (* 2 typescript-indent-level) - typescript-expr-indent-offset) - (goto-char indent-start) - (typescript--compute-member-expression-indent))) - (t - (+ (current-column) typescript-indent-level))))) - (if (and in-switch-p typescript-indent-switch-clauses) - (+ indent typescript-indent-level) - indent))) - (unless same-indent-p - (forward-char) - (skip-chars-forward " \t")) - (if continued-expr-p - (if (not member-expr-p) - (progn (back-to-indentation) - (+ (current-column) typescript-indent-level - typescript-expr-indent-offset)) - (goto-char indent-start) - (typescript--compute-member-expression-indent)) - (current-column))))) - - ((typescript--continued-expression-p) ;; Inside a continued expression. - (if member-expr-p - (typescript--compute-member-expression-indent) - (+ typescript-indent-level typescript-expr-indent-offset))) - (t 0))))) - -(defun typescript-indent-line () - "Indent the current line as typescript." - (interactive) - (save-restriction - (widen) - (let* ((parse-status - (save-excursion (syntax-ppss (point-at-bol)))) - (offset (- (current-column) (current-indentation)))) - (indent-line-to (typescript--proper-indentation parse-status)) - (when (> offset 0) (move-to-column (+ offset (current-indentation))))))) - -;;; Filling - -(defun typescript-c-fill-paragraph (&optional justify) - "Fill the paragraph with `c-fill-paragraph'." - (interactive "*P") - ;; Dynamically replace functions using the lexically scoped cl-letf. - ;; See below for more details: - ;; http://endlessparentheses.com/understanding-letf-and-how-it-replaces-flet.html - (cl-letf (((symbol-function 'c-forward-sws) - (lambda (&optional limit) - (typescript--forward-syntactic-ws limit))) - ((symbol-function 'c-backward-sws) - (lambda (&optional limit) - (typescript--backward-syntactic-ws limit)))) - (let ((fill-paragraph-function 'c-fill-paragraph)) - (c-fill-paragraph justify)))) - -;; We maintain a cache of semantic information, i.e., the classes and -;; functions we've encountered so far. In order to avoid having to -;; re-parse the buffer on every change, we cache the parse state at -;; each interesting point in the buffer. Each parse state is a -;; modified copy of the previous one, or in the case of the first -;; parse state, the empty state. -;; -;; The parse state itself is just a stack of typescript--pitem -;; instances. It starts off containing one element that is never -;; closed, that is initially typescript--initial-pitem. -;; - - -(defun typescript--pitem-format (pitem) - (let ((name (typescript--pitem-name pitem)) - (type (typescript--pitem-type pitem))) - - (format "name:%S type:%S" - name - (if (atom type) - type - (plist-get type :name))))) - -(defun typescript--make-merged-item (item child name-parts) - "Helper function for `typescript--splice-into-items'. -Return a new item that is the result of merging CHILD into -ITEM. NAME-PARTS is a list of parts of the name of CHILD -that we haven't consumed yet." - (typescript--debug "typescript--make-merged-item: {%s} into {%s}" - (typescript--pitem-format child) - (typescript--pitem-format item)) - - ;; If the item we're merging into isn't a class, make it into one - (unless (consp (typescript--pitem-type item)) - (typescript--debug "typescript--make-merged-item: changing dest into class") - (setq item (make-typescript--pitem - :children (list item) - - ;; Use the child's class-style if it's available - :type (if (atom (typescript--pitem-type child)) - typescript--dummy-class-style - (typescript--pitem-type child)) - - :name (typescript--pitem-strname item)))) - - ;; Now we can merge either a function or a class into a class - (cons (cond - ((cdr name-parts) - (typescript--debug "typescript--make-merged-item: recursing") - ;; if we have more name-parts to go before we get to the - ;; bottom of the class hierarchy, call the merger - ;; recursively - (typescript--splice-into-items (car item) child - (cdr name-parts))) - - ((atom (typescript--pitem-type child)) - (typescript--debug "typescript--make-merged-item: straight merge") - ;; Not merging a class, but something else, so just prepend - ;; it - (cons child (car item))) - - (t - ;; Otherwise, merge the new child's items into those - ;; of the new class - (typescript--debug "typescript--make-merged-item: merging class contents") - (append (car child) (car item)))) - (cdr item))) - -(defun typescript--pitem-strname (pitem) - "Last part of the name of PITEM, as a string or symbol." - (let ((name (typescript--pitem-name pitem))) - (if (consp name) - (car (last name)) - name))) - -(defun typescript--splice-into-items (items child name-parts) - "Splice CHILD into the `typescript--pitem' ITEMS at NAME-PARTS. -If a class doesn't exist in the tree, create it. Return -the new items list. NAME-PARTS is a list of strings given -the broken-down class name of the item to insert." - - (let ((top-name (car name-parts)) - (item-ptr items) - new-items last-new-item new-cons item) - - (typescript--debug "typescript--splice-into-items: name-parts: %S items:%S" - name-parts - (mapcar #'typescript--pitem-name items)) - - (cl-assert (stringp top-name)) - (cl-assert (> (length top-name) 0)) - - ;; If top-name isn't found in items, then we build a copy of items - ;; and throw it away. But that's okay, since most of the time, we - ;; *will* find an instance. - - (while (and item-ptr - (cond ((equal (typescript--pitem-strname (car item-ptr)) top-name) - ;; Okay, we found an entry with the right name. Splice - ;; the merged item into the list... - (setq new-cons (cons (typescript--make-merged-item - (car item-ptr) child - name-parts) - (cdr item-ptr))) - - (if last-new-item - (setcdr last-new-item new-cons) - (setq new-items new-cons)) - - ;; ...and terminate the loop - nil) - - (t - ;; Otherwise, copy the current cons and move onto the - ;; text. This is tricky; we keep track of the tail of - ;; the list that begins with new-items in - ;; last-new-item. - (setq new-cons (cons (car item-ptr) nil)) - (if last-new-item - (setcdr last-new-item new-cons) - (setq new-items new-cons)) - (setq last-new-item new-cons) - - ;; Go to the next cell in items - (setq item-ptr (cdr item-ptr)))))) - - (if item-ptr - ;; Yay! We stopped because we found something, not because - ;; we ran out of items to search. Just return the new - ;; list. - (progn - (typescript--debug "search succeeded: %S" name-parts) - new-items) - - ;; We didn't find anything. If the child is a class and we don't - ;; have any classes to drill down into, just push that class; - ;; otherwise, make a fake class and carry on. - (typescript--debug "search failed: %S" name-parts) - (cons (if (cdr name-parts) - ;; We have name-parts left to process. Make a fake - ;; class for this particular part... - (make-typescript--pitem - ;; ...and recursively digest the rest of the name - :children (typescript--splice-into-items - nil child (cdr name-parts)) - :type typescript--dummy-class-style - :name top-name) - - ;; Otherwise, this is the only name we have, so stick - ;; the item on the front of the list - child) - items)))) - -(defun typescript--pitem-add-child (pitem child) - "Copy `typescript--pitem' PITEM, and push CHILD onto its list of children." - (cl-assert (integerp (typescript--pitem-h-begin child))) - (cl-assert (if (consp (typescript--pitem-name child)) - (cl-loop for part in (typescript--pitem-name child) - always (stringp part)) - t)) - - ;; This trick works because we know (based on our cl-defstructs) that - ;; the child list is always the first element, and so the second - ;; element and beyond can be shared when we make our "copy". - (cons - - (let ((name (typescript--pitem-name child)) - (type (typescript--pitem-type child))) - - (cond ((cdr-safe name) ; true if a list of at least two elements - ;; Use slow path because we need class lookup - (typescript--splice-into-items (car pitem) child name)) - - ((and (consp type) - (plist-get type :prototype)) - - ;; Use slow path because we need class merging. We know - ;; name is a list here because down in - ;; `typescript--ensure-cache', we made sure to only add - ;; class entries with lists for :name - (cl-assert (consp name)) - (typescript--splice-into-items (car pitem) child name)) - - (t - ;; Fast path - (cons child (car pitem))))) - - (cdr pitem))) - -;;; compilation-mode support - -;; tsc supports formatting errors in two general ways: plain and -;; pretty. ("Plain" is our term for "not pretty".) In tsc versions -;; prior to 2.7, the plain and pretty formats both used the same -;; format for references into files. `typescript-tsc-error-regexp` -;; covers both plain and pretty for those versions. -;; -;; Version 2.7 changed the pretty format so as to format source code -;; references differently. This required the introduction of -;; `typescript-tsc-pretty-error-regexp`. The format of plain error -;; messages did not change. So from that version onwards, -;; `typescript-tsc-error-regexp` covers plain error messages and -;; `typescript-tsc-pretty-error-regexp` covers pretty error messages. - -;; handle plain compiler-errors like the following when doing M-x compiletsc -;; -;; greeter.ts(24,9): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. -;; greeter.ts(30,12): error TS2339: Property 'indexOf' does not exist on type 'number'. -(defconst typescript-tsc-error-regexp - (concat - "^[[:blank:]]*" - "\\([^(\r\n)]+\\)(\\([0-9]+\\),\\([0-9]+\\)):[[:blank:]]+" - "error [[:alnum:]]+: [^\r\n]+$") - "Regexp to match errors generated by tsc.") - -;; handle pretty compiler-errors like the following when doing M-x compiletsc -;; test.ts:2:7 - error TS2322: Type '2' is not assignable to type 'string'. -(defconst typescript-tsc-pretty-error-regexp - (concat - "^[[:blank:]]*" - "\\([^(\r\n)]+\\):\\([0-9]+\\):\\([0-9]+\\) - [[:blank:]]*" - "error [[:alnum:]]+: [^\r\n]+$") - "Regexp to match errors generated by tsc.") - -;; -;; Should handle output like: -;; src/modules/authenticator.ts[1, 83]: ' should be " -;; (quotemarks) src/modules/authenticator.ts[2, 26]: ' should be " -;; ERROR: (quotemarks) src/modules/authenticator.ts[2, 26]: ' should be " -;; WARNING: src/modules/authenticator.ts[2, 26]: ' should be " -;; -;; "(quotemarks)" it the rule name. It is produced when using the -;; "verbose" formatter. The "verbose" formatter is identical to the -;; default ("prose") formatter, except for the additional rule name. -;; -;; "ERROR:" and "WARNING:" are the severity. This was added in tslint -;; 5.0. Prior versions have no notion of severity and simply omit this -;; part. -;; -(defconst typescript-tslint-report-regexp - (concat - "^[[:blank:]]*" - ;; severity ("type" in Emacs' parlance) - "\\(?:\\(?:ERROR\\|\\(WARNING\\)\\):[[:blank:]]+\\)?" - ;; rule name - "\\((.*)[[:blank:]]+\\)?" - ;; filename - "\\([^(\r\n)]+\\)" - "\\[" - ;; line - "\\([[:digit:]]+\\)" - ", " - ;; column - "\\([[:digit:]]+\\)" - "\\]: " - ;; message - ".*$") - "Regexp to match reports generated by tslint.") - -(dolist - (regexp - `((typescript-tsc - ,typescript-tsc-error-regexp - 1 2 3 2) - - (typescript-tsc-pretty - ,typescript-tsc-pretty-error-regexp - 1 2 3 2) - - (typescript-tslint - ,typescript-tslint-report-regexp - 3 4 5 (1)))) - (add-to-list 'compilation-error-regexp-alist-alist regexp) - (add-to-list 'compilation-error-regexp-alist (car regexp))) - -;;; Main Function - -;;;###autoload -(define-derived-mode typescript-mode prog-mode "typescript" - "Major mode for editing typescript. - -Key bindings: - -\\{typescript-mode-map}" - - :group 'typescript - :syntax-table typescript-mode-syntax-table - - (setq-local indent-line-function 'typescript-indent-line) - (setq-local beginning-of-defun-function 'typescript-beginning-of-defun) - (setq-local end-of-defun-function 'typescript-end-of-defun) - (setq-local open-paren-in-column-0-is-defun-start nil) - (setq-local font-lock-defaults (list typescript--font-lock-keywords)) - (setq-local syntax-propertize-function #'typescript-syntax-propertize) - (setq-local parse-sexp-ignore-comments t) - (setq-local parse-sexp-lookup-properties t) - - ;; Comments - (setq-local comment-start "// ") - (setq-local comment-end "") - (setq-local fill-paragraph-function 'typescript-c-fill-paragraph) - - ;; Parse cache - (add-hook 'before-change-functions #'typescript--flush-caches t t) - - ;; Frameworks - (typescript--update-quick-match-re) - - ;; for filling, pretend we're cc-mode - (setq c-comment-prefix-regexp "//+\\|\\**" - c-paragraph-start "$" - c-paragraph-separate "$" - c-block-comment-prefix "* " - c-line-comment-starter "//" - c-comment-start-regexp "/[*/]\\|\\s!" - comment-start-skip "\\(//+\\|/\\*+\\)\\s *") - - (setq-local electric-indent-chars - (append "{}():;," electric-indent-chars)) - (setq-local electric-layout-rules - '((?\; . after) (?\{ . after) (?\} . before))) - - (let ((c-buffer-is-cc-mode t)) - ;; FIXME: These are normally set by `c-basic-common-init'. Should - ;; we call it instead? (Bug#6071) - (make-local-variable 'paragraph-start) - (make-local-variable 'paragraph-separate) - (make-local-variable 'paragraph-ignore-fill-prefix) - (make-local-variable 'adaptive-fill-mode) - (make-local-variable 'adaptive-fill-regexp) - (c-setup-paragraph-variables)) - - (add-hook 'post-self-insert-hook - #'typescript--post-self-insert-function) - - (setq-local syntax-begin-function #'typescript--syntax-begin-function)) - -;; Set our custom predicate for flyspell prog mode -(put 'typescript-mode 'flyspell-mode-predicate - 'typescript--flyspell-mode-predicate) - -;;;###autoload -(eval-after-load 'folding - '(when (fboundp 'folding-add-to-marks-list) - (folding-add-to-marks-list 'typescript-mode "// {{{" "// }}}" ))) - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.ts$" . typescript-mode)) - -(provide 'typescript-mode) - -;;; typescript-mode.el ends here diff --git a/elpa/typescript-mode-20200303.1301/typescript-mode.elc b/elpa/typescript-mode-20200303.1301/typescript-mode.elc deleted file mode 100644 index f0fa76b583ace76c80483f3fe0902808d76dc10a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80265 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 DZXpy> diff --git a/elpa/typescript-mode-20200312.2235/typescript-mode.el b/elpa/typescript-mode-20200312.2235/typescript-mode.el deleted file mode 100644 index fa9ed241..00000000 --- a/elpa/typescript-mode-20200312.2235/typescript-mode.el +++ /dev/null @@ -1,2935 +0,0 @@ -;;; typescript-mode.el --- Major mode for editing typescript - -;; ----------------------------------------------------------------------------------- -;; TypeScript support for Emacs -;; Unmodified original sourve available at http://www.karllandstrom.se/downloads/emacs/javascript.el -;; Copyright (c) 2008 Free Software Foundation -;; Portions Copyright (C) Microsoft Open Technologies, Inc. All rights reserved. -;; -;; 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 . -;; ------------------------------------------------------------------------------------------- - -;; URL: http://github.com/ananthakumaran/typescript.el -;; Version: 0.1 -;; Keywords: typescript languages -;; Package-Requires: ((emacs "24.3")) - -;; This file is not part of GNU Emacs. - -;;; Commentary: - -;; This is based on Karl Landstrom's barebones typescript-mode. This -;; is much more robust and works with cc-mode's comment filling -;; (mostly). -;; The modifications to the original javascript.el mode mainly consisted in -;; replacing "javascript" with "typescript" -;; -;; The main features of this typescript mode are syntactic -;; highlighting (enabled with `font-lock-mode' or -;; `global-font-lock-mode'), automatic indentation and filling of -;; comments. -;; -;; -;; General Remarks: -;; -;; XXX: This mode assumes that block comments are not nested inside block -;; XXX: comments -;; -;; Exported names start with "typescript-"; private names start with -;; "typescript--". - -;;; Code: - -(eval-and-compile - (require 'compile) - (require 'cc-mode) - (require 'font-lock) - (require 'rx) - (require 'newcomment)) - -(eval-when-compile - (require 'cl-lib)) - -;;; Constants - -(defconst typescript--type-name-re "\\(?:[A-Z][A-Za-z0-9]+\\.\\)\\{0,\\}\\(?:[A-Z][A-Za-z0-9]+\\)" - "Regexp matching a conventional TypeScript type-name. Must start with upper-case letter!") - -(defconst typescript--name-start-re "[a-zA-Z_$]" - "Regexp matching the start of a typescript identifier, without grouping.") - -(defconst typescript--name-re (concat typescript--name-start-re - "\\(?:\\s_\\|\\sw\\)*") - "Regexp matching a typescript identifier, without grouping.") - -(defconst typescript--objfield-re (concat typescript--name-re ":") - "Regexp matching the start of a typescript object field.") - -(defconst typescript--dotted-name-re - (concat typescript--name-re "\\(?:\\." typescript--name-re "\\)*") - "Regexp matching a dot-separated sequence of typescript names.") - -(defconst typescript--plain-method-re - (concat "^\\s-*?\\(" typescript--dotted-name-re "\\)\\.prototype" - "\\.\\(" typescript--name-re "\\)\\s-*?=\\s-*?\\(function\\)\\_>") - "Regexp matching an explicit typescript prototype \"method\" declaration. -Group 1 is a (possibly-dotted) class name, group 2 is a method name, -and group 3 is the 'function' keyword.") - -(defconst typescript--plain-class-re - (concat "^\\s-*\\(" typescript--dotted-name-re "\\)\\.prototype" - "\\s-*=\\s-*{") - "Regexp matching a typescript explicit prototype \"class\" declaration. -An example of this is \"Class.prototype = { method1: ...}\".") - -(defconst typescript--module-declaration-re - "^\\s-*\\(?:declare\\|\\(?:export\\(?:\\s-+default\\)?\\)\\)?" - "Regexp matching ambient declaration modifier or export declaration.") - -;; var NewClass = BaseClass.extend( -(defconst typescript--mp-class-decl-re - (concat "^\\s-*var\\s-+" - "\\(" typescript--name-re "\\)" - "\\s-*=\\s-*" - "\\(" typescript--dotted-name-re - "\\)\\.extend\\(?:Final\\)?\\s-*(\\s-*{?\\s-*$")) - -;; var NewClass = Class.create() -(defconst typescript--prototype-obsolete-class-decl-re - (concat "^\\s-*\\(?:var\\s-+\\)?" - "\\(" typescript--dotted-name-re "\\)" - "\\s-*=\\s-*Class\\.create()")) - -(defconst typescript--prototype-objextend-class-decl-re-1 - (concat "^\\s-*Object\\.extend\\s-*(" - "\\(" typescript--dotted-name-re "\\)" - "\\s-*,\\s-*{")) - -(defconst typescript--prototype-objextend-class-decl-re-2 - (concat "^\\s-*\\(?:var\\s-+\\)?" - "\\(" typescript--dotted-name-re "\\)" - "\\s-*=\\s-*Object\\.extend\\s-*\(")) - -;; var NewClass = Class.create({ -(defconst typescript--prototype-class-decl-re - (concat "^\\s-*\\(?:var\\s-+\\)?" - "\\(" typescript--name-re "\\)" - "\\s-*=\\s-*Class\\.create\\s-*(\\s-*" - "\\(?:\\(" typescript--dotted-name-re "\\)\\s-*,\\s-*\\)?{?")) - -;; Parent class name(s) (yes, multiple inheritance in typescript) are -;; matched with dedicated font-lock matchers -(defconst typescript--dojo-class-decl-re - (concat "^\\s-*dojo\\.declare\\s-*(\"\\(" typescript--dotted-name-re "\\)")) - -(defconst typescript--exttypescript-class-decl-re-1 - (concat "^\\s-*Ext\\.extend\\s-*(" - "\\s-*\\(" typescript--dotted-name-re "\\)" - "\\s-*,\\s-*\\(" typescript--dotted-name-re "\\)") - "Regexp matching an ExtTYPESCRIPT class declaration (style 1).") - -(defconst typescript--exttypescript-class-decl-re-2 - (concat "^\\s-*\\(?:var\\s-+\\)?" - "\\(" typescript--name-re "\\)" - "\\s-*=\\s-*Ext\\.extend\\s-*(\\s-*" - "\\(" typescript--dotted-name-re "\\)") - "Regexp matching an ExtTYPESCRIPT class declaration (style 2).") - -(defconst typescript--mochikit-class-re - (concat "^\\s-*MochiKit\\.Base\\.update\\s-*(\\s-*" - "\\(" typescript--dotted-name-re "\\)") - "Regexp matching a MochiKit class declaration.") - -(defconst typescript--dummy-class-style - '(:name "[Automatically Generated Class]")) - -(defconst typescript--class-styles - `((:name "Plain" - :class-decl ,typescript--plain-class-re - :prototype t - :contexts (toplevel) - :framework typescript) - - (:name "MochiKit" - :class-decl ,typescript--mochikit-class-re - :prototype t - :contexts (toplevel) - :framework mochikit) - - (:name "Prototype (Obsolete)" - :class-decl ,typescript--prototype-obsolete-class-decl-re - :contexts (toplevel) - :framework prototype) - - (:name "Prototype (Modern)" - :class-decl ,typescript--prototype-class-decl-re - :contexts (toplevel) - :framework prototype) - - (:name "Prototype (Object.extend)" - :class-decl ,typescript--prototype-objextend-class-decl-re-1 - :prototype t - :contexts (toplevel) - :framework prototype) - - (:name "Prototype (Object.extend) 2" - :class-decl ,typescript--prototype-objextend-class-decl-re-2 - :prototype t - :contexts (toplevel) - :framework prototype) - - (:name "Dojo" - :class-decl ,typescript--dojo-class-decl-re - :contexts (toplevel) - :framework dojo) - - (:name "ExtTYPESCRIPT (style 1)" - :class-decl ,typescript--exttypescript-class-decl-re-1 - :prototype t - :contexts (toplevel) - :framework exttypescript) - - (:name "ExtTYPESCRIPT (style 2)" - :class-decl ,typescript--exttypescript-class-decl-re-2 - :contexts (toplevel) - :framework exttypescript) - - (:name "Merrill Press" - :class-decl ,typescript--mp-class-decl-re - :contexts (toplevel) - :framework merrillpress)) - - "List of typescript class definition styles. - -A class definition style is a plist with the following keys: - -:name is a human-readable name of the class type - -:class-decl is a regular expression giving the start of the -class. Its first group must match the name of its class. If there -is a parent class, the second group should match, and it should be -the name of the class. - -If :prototype is present and non-nil, the parser will merge -declarations for this constructs with others at the same lexical -level that have the same name. Otherwise, multiple definitions -will create multiple top-level entries. Don't use :prototype -unnecessarily: it has an associated cost in performance. - -If :strip-prototype is present and non-nil, then if the class -name as matched contains") - -(defconst typescript--available-frameworks - (cl-loop with available-frameworks - for style in typescript--class-styles - for framework = (plist-get style :framework) - unless (memq framework available-frameworks) - collect framework into available-frameworks - finally return available-frameworks) - "List of available typescript frameworks symbols.") - -(defconst typescript--function-heading-1-re - (concat - typescript--module-declaration-re - "\\s-*function\\s-+\\(" typescript--name-re "\\)") - "Regexp matching the start of a typescript function header. -Match group 1 is the name of the function.") - -(defconst typescript--function-heading-2-re - (concat - "^\\s-*\\(" typescript--name-re "\\)\\s-*:\\s-*function\\_>") - "Regexp matching the start of a function entry in an associative array. -Match group 1 is the name of the function.") - -(defconst typescript--function-heading-3-re - (concat - "^\\s-*\\(?:var\\s-+\\)?\\(" typescript--dotted-name-re "\\)" - "\\s-*=\\s-*function\\_>") - "Regexp matching a line in the typescript form \"var MUMBLE = function\". -Match group 1 is MUMBLE.") - -(defun typescript--regexp-opt-symbol (list) - "Like `regexp-opt', but surround the result with `\\\\_<' and `\\\\_>'." - (concat "\\_<" (regexp-opt list t) "\\_>")) - -(defconst typescript--keyword-re - (typescript--regexp-opt-symbol - '("abstract" "any" "as" "async" "await" "boolean" "bigint" "break" "case" "catch" "class" "const" - "constructor" "continue" "declare" "default" "delete" "do" "else" - "enum" "export" "extends" "extern" "false" "finally" "for" - "function" "from" "get" "goto" "if" "implements" "import" "in" "instanceof" - "interface" "keyof" "let" "module" "namespace" "never" "new" "null" "number" "object" "of" - "private" "protected" "public" "readonly" "return" "set" "static" "string" - "super" "switch" "this" "throw" "true" - "try" "type" "typeof" "unknown" "var" "void" - "while")) ; yield is handled separately - "Regexp matching any typescript keyword.") - -(defconst typescript--basic-type-re - (typescript--regexp-opt-symbol - '("any" "bool" "boolean" "bigint" "never" "number" "string" "unknown" "void")) - "Regular expression matching any predefined type in typescript.") - -(defconst typescript--access-modifier-re - (typescript--regexp-opt-symbol - '("private" "protected" "public" "readonly" "static" "extends" "implements")) - "Regular expression matching access modifiers.") - -(defconst typescript--decorator-re - (concat "\\(@" typescript--name-re "\\)")) - -(defconst typescript--constant-re - (typescript--regexp-opt-symbol '("false" "null" "undefined" - "Infinity" "NaN" - "true" "arguments" "this")) - "Regular expression matching any future reserved words in typescript.") - -(defconst typescript--builtin-re - (typescript--regexp-opt-symbol - '("console")) - "Regular expression matching builtins.") - -(defconst typescript--function-call-re "\\(\\(?:\\w\\|\\s_\\)+\\)\\(<.+>\\)?\s*(" - "Regular expression matching function calls.") - -(defconst typescript--font-lock-keywords-1 - (list - "\\_" - (list typescript--function-heading-1-re 1 font-lock-function-name-face) - (list typescript--function-heading-2-re 1 font-lock-function-name-face)) - "Level one font lock keywords for `typescript-mode'.") - -(defconst typescript--font-lock-keywords-2 - (append typescript--font-lock-keywords-1 - (list (list typescript--keyword-re 1 font-lock-keyword-face) - (list "\\_" - "\\s-+\\(each\\)\\_>" nil nil - (list 1 'font-lock-keyword-face)) - (cons "\\_\\)" 'font-lock-keyword-face) - (cons typescript--basic-type-re font-lock-type-face) - (cons typescript--constant-re font-lock-constant-face))) - "Level two font lock keywords for `typescript-mode'.") - -;; typescript--pitem is the basic building block of the lexical -;; database. When one refers to a real part of the buffer, the region -;; of text to which it refers is split into a conceptual header and -;; body. Consider the (very short) block described by a hypothetical -;; typescript--pitem: -;; -;; function foo(a,b,c) { return 42; } -;; ^ ^ ^ -;; | | | -;; +- h-begin +- h-end +- b-end -;; -;; (Remember that these are buffer positions, and therefore point -;; between characters, not at them. An arrow drawn to a character -;; indicates the corresponding position is between that character and -;; the one immediately preceding it.) -;; -;; The header is the region of text [h-begin, h-end], and is -;; the text needed to unambiguously recognize the start of the -;; construct. If the entire header is not present, the construct is -;; not recognized at all. No other pitems may be nested inside the -;; header. -;; -;; The body is the region [h-end, b-end]. It may contain nested -;; typescript--pitem instances. The body of a pitem may be empty: in -;; that case, b-end is equal to header-end. -;; -;; The three points obey the following relationship: -;; -;; h-begin < h-end <= b-end -;; -;; We put a text property in the buffer on the character *before* -;; h-end, and if we see it, on the character *before* b-end. -;; -;; The text property for h-end, typescript--pstate, is actually a list -;; of all typescript--pitem instances open after the marked character. -;; -;; The text property for b-end, typescript--pend, is simply the -;; typescript--pitem that ends after the marked character. (Because -;; pitems always end when the paren-depth drops below a critical -;; value, and because we can only drop one level per character, only -;; one pitem may end at a given character.) -;; -;; In the structure below, we only store h-begin and (sometimes) -;; b-end. We can trivially and quickly find h-end by going to h-begin -;; and searching for an typescript--pstate text property. Since no other -;; typescript--pitem instances can be nested inside the header of a -;; pitem, the location after the character with this text property -;; must be h-end. -;; -;; typescript--pitem instances are never modified (with the exception -;; of the b-end field). Instead, modified copies are added at subseqnce parse points. -;; (The exception for b-end and its caveats is described below.) -;; - -(cl-defstruct (typescript--pitem (:type list)) - ;; IMPORTANT: Do not alter the position of fields within the list. - ;; Various bits of code depend on their positions, particularly - ;; anything that manipulates the list of children. - - ;; List of children inside this pitem's body - (children nil :read-only t) - - ;; When we reach this paren depth after h-end, the pitem ends - (paren-depth nil :read-only t) - - ;; Symbol or class-style plist if this is a class - (type nil :read-only t) - - ;; See above - (h-begin nil :read-only t) - - ;; List of strings giving the parts of the name of this pitem (e.g., - ;; '("MyClass" "myMethod"), or t if this pitem is anonymous - (name nil :read-only t) - - ;; THIS FIELD IS MUTATED, and its value is shared by all copies of - ;; this pitem: when we copy-and-modify pitem instances, we share - ;; their tail structures, so all the copies actually have the same - ;; terminating cons cell. We modify that shared cons cell directly. - ;; - ;; The field value is either a number (buffer location) or nil if - ;; unknown. - ;; - ;; If the field's value is greater than `typescript--cache-end', the - ;; value is stale and must be treated as if it were nil. Conversely, - ;; if this field is nil, it is guaranteed that this pitem is open up - ;; to at least `typescript--cache-end'. (This property is handy when - ;; computing whether we're inside a given pitem.) - ;; - (b-end nil)) - -;; The pitem we start parsing with. -(defconst typescript--initial-pitem - (make-typescript--pitem - :paren-depth most-negative-fixnum - :type 'toplevel)) - -;; When we say "jsdoc" here, we mean "jsdoc 3". There exist multiple dialects of -;; "jsdoc documentation". - -;; Note that all typedoc/jsdoc regexp by themselves would match occurrences that appear outside -;; documentation comments. The logic that uses these regexps must guard against it. -(defconst typescript-typedoc-link-tag-regexp - "\\[\\[.*?\\]\\]" - "Matches a typedoc link.") - -(defconst typescript-typedoc-literal-markup-regexp - "\\(`+\\).*?\\1" - "Matches a typedoc keyword markup.") - -(defconst typescript-jsdoc-before-tag-regexp - "\\(?:^\\s-*\\*+\\|/\\*\\*\\)\\s-*" - "Matches everything we allow before the @ of a jsdoc tag.") - -;; This was taken from js2-mode. -(defconst typescript-jsdoc-param-tag-regexp - (concat typescript-jsdoc-before-tag-regexp - "\\(@" - (regexp-opt - '("arg" - "argument" - "param" - "prop" - "property" - "typedef")) - "\\)" - "\\s-*\\({[^}]+}\\)?" ; optional type - "\\s-*\\[?\\([[:alnum:]_$\.]+\\)?\\]?" ; name - "\\_>") - "Matches jsdoc tags with optional type and optional param name.") - -;; This was taken from js2-mode. -;; and extended with tags in http://usejsdoc.org/ -(defconst typescript-jsdoc-typed-tag-regexp - (concat typescript-jsdoc-before-tag-regexp - "\\(@" - (regexp-opt - '("enum" - "extends" - "field" - "id" - "implements" - "lends" - "mods" - "requires" - "return" - "returns" - "throw" - "throws" - "type" - "yield" - "yields")) - "\\)\\s-*\\({[^}]+}\\)?") - "Matches jsdoc tags with optional type.") - -;; This was taken from js2-mode. -;; and extended with tags in http://usejsdoc.org/ -(defconst typescript-jsdoc-arg-tag-regexp - (concat typescript-jsdoc-before-tag-regexp - "\\(@" - (regexp-opt - '("access" - "alias" - "augments" - "base" - "borrows" - "bug" - "callback" - "config" - "default" - "define" - "emits" - "exception" - "extends" - "external" - "fires" - "func" - "function" - "host" - "kind" - "listens" - "member" - "memberof" - "method" - "mixes" - "module" - "name" - "namespace" - "requires" - "since" - "suppress" - "this" - "throws" - "var" - "variation" - "version")) - "\\)\\s-+\\([^ \t]+\\)") - "Matches jsdoc tags with a single argument.") - -;; This was taken from js2-mode -;; and extended with tags in http://usejsdoc.org/ -(defconst typescript-jsdoc-empty-tag-regexp - (concat typescript-jsdoc-before-tag-regexp - "\\(@" - (regexp-opt - '("abstract" - "addon" - "async" - "author" - "class" - "classdesc" - "const" - "constant" - "constructor" - "constructs" - "copyright" - "default" - "defaultvalue" - "deprecated" - "desc" - "description" - "event" - "example" - "exec" - "export" - "exports" - "file" - "fileoverview" - "final" - "func" - "function" - "generator" - "global" - "hidden" - "hideconstructor" - "ignore" - "implicitcast" - "inheritdoc" - "inner" - "instance" - "interface" - "license" - "method" - "mixin" - "noalias" - "noshadow" - "notypecheck" - "override" - "overview" - "owner" - "package" - "preserve" - "preservetry" - "private" - "protected" - "public" - "readonly" - "static" - "summary" - "supported" - "todo" - "tutorial" - "virtual")) - "\\)\\s-*") - "Matches empty jsdoc tags.") - -;; Note that this regexp by itself would match tslint flags that appear inside -;; strings. The logic using this regexp must guard against it. -(defconst typescript-tslint-flag-regexp - "\\(?://\\|/\\*\\)\\s-*\\(tslint:.*?\\)\\(?:\\*/\\|$\\)" - "Matches tslint flags.") - -;;; Faces - -(defface typescript-jsdoc-tag - '((t :foreground "SlateGray")) - "Face used to highlight @whatever tags in jsdoc comments." - :group 'typescript) - -(defface typescript-jsdoc-type - '((t :foreground "SteelBlue")) - "Face used to highlight {FooBar} types in jsdoc comments." - :group 'typescript) - -(defface typescript-jsdoc-value - '((t :foreground "gold4")) - "Face used to highlight tag values in jsdoc comments." - :group 'typescript) - -(defface typescript-access-modifier-face - '((t (:inherit font-lock-keyword-face))) - "Face used to highlight access modifiers." - :group 'typescript) - -(defface typescript-this-face - '((t (:inherit font-lock-keyword-face))) - "Face used to highlight 'this' keyword." - :group 'typescript) - -(defface typescript-primitive-face - '((t (:inherit font-lock-keyword-face))) - "Face used to highlight builtin types." - :group 'typescript) - -;;; User Customization - -(defgroup typescript nil - "Customization variables for typescript mode." - :tag "typescript" - :group 'languages) - -(defcustom typescript-indent-level 4 - "Number of spaces for each indentation step in `typescript-mode'." - :type 'integer - :safe 'integerp - :group 'typescript) -;;;###autoload(put 'typescript-indent-level 'safe-local-variable #'integerp) - -(defcustom typescript-expr-indent-offset 0 - "Number of additional spaces used for indentation of continued expressions. -The value must be no less than minus `typescript-indent-level'." - :type 'integer - :safe 'integerp - :group 'typescript) - -(defcustom typescript-indent-switch-clauses t - "Enable indenting of switch case and default clauses to -replicate tsserver behaviour. Indent level is taken to be -`typescript-indent-level'." - :type 'boolean - :group 'typescript) - -(defcustom typescript-auto-indent-flag t - "Whether to automatically indent when typing punctuation characters. -If non-nil, the characters {}();,: also indent the current line -in typescript mode." - :type 'boolean - :group 'typescript) - -(defcustom typescript-flat-functions nil - "Treat nested functions as top-level functions in `typescript-mode'. -This applies to function movement, marking, and so on." - :type 'boolean - :group 'typescript) - -(defcustom typescript-comment-lineup-func #'c-lineup-C-comments - "Lineup function for `cc-mode-style', for C comments in `typescript-mode'." - :type 'function - :group 'typescript) - -(defcustom typescript-enabled-frameworks typescript--available-frameworks - "Frameworks recognized by `typescript-mode'. -To improve performance, you may turn off some frameworks you -seldom use, either globally or on a per-buffer basis." - :type (cons 'set (mapcar (lambda (x) - (list 'const x)) - typescript--available-frameworks)) - :group 'typescript) - -(defcustom typescript-mode-hook nil - "*Hook called by `typescript-mode'." - :type 'hook - :group 'typescript) - -(defcustom typescript-autoconvert-to-template-flag nil - "Non-nil means automatically convert plain strings to templates. - -When the flag is non-nil the `typescript-autoconvert-to-template' -is called whenever a plain string delimiter is typed in the buffer." - :type 'boolean - :group 'typescript) - -;;; Public utilities - -(defun typescript-convert-to-template () - "Convert the string at point to a template string." - (interactive) - (save-restriction - (widen) - (save-excursion - (let* ((syntax (syntax-ppss)) - (str-terminator (nth 3 syntax)) - (string-start (or (and str-terminator (nth 8 syntax)) - ;; We have to consider the case that we're on the start delimiter of a string. - ;; We tentatively take (point) as string-start. If it turns out we're - ;; wrong, then typescript--move-to-end-of-plain-string will fail anway, - ;; and we won't use the bogus value. - (progn - (forward-char) - (point))))) - (when (typescript--move-to-end-of-plain-string) - (let ((end-start (or (nth 8 (syntax-ppss)) -1))) - (undo-boundary) - (when (= end-start string-start) - (delete-char 1) - (insert "`"))) - (goto-char string-start) - (delete-char 1) - (insert "`")))))) - -(defun typescript-autoconvert-to-template () - "Automatically convert a plain string to a teplate string, if needed. - -This function is meant to be automatically invoked when the user -enters plain string delimiters. It checks whether the character -before point is the end of a string. If it is, then it checks -whether the string contains ${...}. If it does, then it converts -the string from a plain string to a template." - (interactive) - (save-restriction - (widen) - (save-excursion - (backward-char) - (when (and (memq (char-after) '(?' ?\")) - (not (eq (char-before) ?\\))) - (let* ((string-start (nth 8 (syntax-ppss)))) - (when (and string-start - (save-excursion - (re-search-backward "\\${.*?}" string-start t))) - (typescript-convert-to-template))))))) - -;;; KeyMap - -(defvar typescript-mode-map - (let ((keymap (make-sparse-keymap))) - (define-key keymap (kbd "C-c '") #'typescript-convert-to-template) - keymap) - "Keymap for `typescript-mode'.") - -(defun typescript--post-self-insert-function () - (when (and (derived-mode-p 'typescript-mode) - typescript-autoconvert-to-template-flag - (or (eq last-command-event ?\') - (eq last-command-event ?\"))) - (typescript-autoconvert-to-template))) - -;;; Syntax table and parsing - -(defvar typescript-mode-syntax-table - (let ((table (make-syntax-table))) - (c-populate-syntax-table table) - (modify-syntax-entry ?$ "_" table) - (modify-syntax-entry ?` "\"" table) - table) - "Syntax table for `typescript-mode'.") - -(defvar typescript--quick-match-re nil - "Autogenerated regexp used by `typescript-mode' to match buffer constructs.") - -(defvar typescript--quick-match-re-func nil - "Autogenerated regexp used by `typescript-mode' to match constructs and functions.") - -(make-variable-buffer-local 'typescript--quick-match-re) -(make-variable-buffer-local 'typescript--quick-match-re-func) - -(defvar typescript--cache-end 1 - "Last valid buffer position for the `typescript-mode' function cache.") -(make-variable-buffer-local 'typescript--cache-end) - -(defvar typescript--last-parse-pos nil - "Latest parse position reached by `typescript--ensure-cache'.") -(make-variable-buffer-local 'typescript--last-parse-pos) - -(defvar typescript--state-at-last-parse-pos nil - "Parse state at `typescript--last-parse-pos'.") -(make-variable-buffer-local 'typescript--state-at-last-parse-pos) - -(defun typescript--flatten-list (list) - (cl-loop for item in list - nconc (cond ((consp item) - (typescript--flatten-list item)) - (item (list item))))) - -(defun typescript--maybe-join (prefix separator suffix &rest list) - "Helper function for `typescript--update-quick-match-re'. -If LIST contains any element that is not nil, return its non-nil -elements, separated by SEPARATOR, prefixed by PREFIX, and ended -with SUFFIX as with `concat'. Otherwise, if LIST is empty, return -nil. If any element in LIST is itself a list, flatten that -element." - (setq list (typescript--flatten-list list)) - (when list - (concat prefix (mapconcat #'identity list separator) suffix))) - -(defun typescript--update-quick-match-re () - "Internal function used by `typescript-mode' for caching buffer constructs. -This updates `typescript--quick-match-re', based on the current set of -enabled frameworks." - (setq typescript--quick-match-re - (typescript--maybe-join - "^[ \t]*\\(?:" "\\|" "\\)" - - ;; #define mumble - "#define[ \t]+[a-zA-Z_]" - - (when (memq 'exttypescript typescript-enabled-frameworks) - "Ext\\.extend") - - (when (memq 'prototype typescript-enabled-frameworks) - "Object\\.extend") - - ;; var mumble = THING ( - (typescript--maybe-join - "\\(?:var[ \t]+\\)?[a-zA-Z_$0-9.]+[ \t]*=[ \t]*\\(?:" - "\\|" - "\\)[ \t]*\(" - - (when (memq 'prototype typescript-enabled-frameworks) - "Class\\.create") - - (when (memq 'exttypescript typescript-enabled-frameworks) - "Ext\\.extend") - - (when (memq 'merrillpress typescript-enabled-frameworks) - "[a-zA-Z_$0-9]+\\.extend\\(?:Final\\)?")) - - (when (memq 'dojo typescript-enabled-frameworks) - "dojo\\.declare[ \t]*\(") - - (when (memq 'mochikit typescript-enabled-frameworks) - "MochiKit\\.Base\\.update[ \t]*\(") - - ;; mumble.prototypeTHING - (typescript--maybe-join - "[a-zA-Z_$0-9.]+\\.prototype\\(?:" "\\|" "\\)" - - (when (memq 'typescript typescript-enabled-frameworks) - '( ;; foo.prototype.bar = function( - "\\.[a-zA-Z_$0-9]+[ \t]*=[ \t]*function[ \t]*\(" - - ;; mumble.prototype = { - "[ \t]*=[ \t]*{"))))) - - (setq typescript--quick-match-re-func - (concat "function\\|" typescript--quick-match-re))) - -(defun typescript--forward-text-property (propname) - "Move over the next value of PROPNAME in the buffer. -If found, return that value and leave point after the character -having that value; otherwise, return nil and leave point at EOB." - (let ((next-value (get-text-property (point) propname))) - (if next-value - (forward-char) - - (goto-char (next-single-property-change - (point) propname nil (point-max))) - (unless (eobp) - (setq next-value (get-text-property (point) propname)) - (forward-char))) - - next-value)) - -(defun typescript--backward-text-property (propname) - "Move over the previous value of PROPNAME in the buffer. -If found, return that value and leave point just before the -character that has that value, otherwise return nil and leave -point at BOB." - (unless (bobp) - (let ((prev-value (get-text-property (1- (point)) propname))) - (if prev-value - (backward-char) - - (goto-char (previous-single-property-change - (point) propname nil (point-min))) - - (unless (bobp) - (backward-char) - (setq prev-value (get-text-property (point) propname)))) - - prev-value))) - -(defsubst typescript--forward-pstate () - (typescript--forward-text-property 'typescript--pstate)) - -(defsubst typescript--backward-pstate () - (typescript--backward-text-property 'typescript--pstate)) - -(defun typescript--pitem-goto-h-end (pitem) - (goto-char (typescript--pitem-h-begin pitem)) - (typescript--forward-pstate)) - -(defun typescript--re-search-forward-inner (regexp &optional bound count) - "Helper function for `typescript--re-search-forward'." - (let ((parse) - str-terminator) - (while (> count 0) - (re-search-forward regexp bound) - (setq parse (syntax-ppss)) - (cond ((setq str-terminator (nth 3 parse)) - (when (eq str-terminator t) - (setq str-terminator ?/)) - (re-search-forward - (concat "\\([^\\]\\|^\\)" (string str-terminator)) - (save-excursion (end-of-line) (point)) t)) - ((nth 7 parse) - (forward-line)) - ((or (nth 4 parse) - (and (eq (char-before) ?\/) (eq (char-after) ?\*))) - (re-search-forward "\\*/")) - (t - (setq count (1- count)))))) - (point)) - - -(defun typescript--re-search-forward (regexp &optional bound noerror count) - "Search forward, ignoring strings and comments. -This function invokes `re-search-forward', but treats the buffer -as if strings and comments have been removed." - (let ((saved-point (point)) - (search-expr - (cond ((null count) - '(typescript--re-search-forward-inner regexp bound 1)) - ((< count 0) - '(typescript--re-search-backward-inner regexp bound (- count))) - ((> count 0) - '(typescript--re-search-forward-inner regexp bound count))))) - (condition-case err - (eval search-expr) - (search-failed - (goto-char saved-point) - (unless noerror - (error (error-message-string err))))))) - - -(defun typescript--re-search-backward-inner (regexp &optional bound count) - "Auxiliary function for `typescript--re-search-backward'." - (let ((parse)) - (while (> count 0) - (re-search-backward regexp bound) - (when (and (> (point) (point-min)) - (save-excursion (backward-char) (looking-at "/[/*]"))) - (forward-char)) - (setq parse (syntax-ppss)) - (cond - ;; If we are in a comment or a string, jump back to the start - ;; of the comment or string. - ((nth 8 parse) - (goto-char (nth 8 parse))) - ((and (eq (char-before) ?/) (eq (char-after) ?*)) - (re-search-backward "/\\*")) - (t - (setq count (1- count)))))) - (point)) - - -(defun typescript--re-search-backward (regexp &optional bound noerror count) - "Search backward, ignoring strings, and comments. - -This function invokes `re-search-backward' but treats the buffer -as if strings and comments have been removed. - -IMPORTANT NOTE: searching for \"\\n\" with this function to find -line breaks will generally not work, because the final newline of -a one-line comment is considered to be part of the comment and -will be skipped. Take the following code: - - let a = 1; - let b = 2; // Foo - let c = 3; - -If the point is in the last line, searching back for \"\\n\" will -skip over the line with \"let b\". The newline found will be the -one at the end of the line with \"let a\"." - (let ((saved-point (point)) - (search-expr - (cond ((null count) - '(typescript--re-search-backward-inner regexp bound 1)) - ((< count 0) - '(typescript--re-search-forward-inner regexp bound (- count))) - ((> count 0) - '(typescript--re-search-backward-inner regexp bound count))))) - (condition-case err - (eval search-expr) - (search-failed - (goto-char saved-point) - (unless noerror - (error (error-message-string err))))))) - -(defun typescript--forward-expression () - "Move forward over a whole typescript expression. -This function doesn't move over expressions continued across -lines." - (cl-loop - do (progn - (forward-comment most-positive-fixnum) - (cl-loop until (or (eolp) - (progn - (forward-comment most-positive-fixnum) - (memq (char-after) '(?\, ?\; ?\] ?\) ?\})))) - do (forward-sexp))) - while (and (eq (char-after) ?\n) - (save-excursion - (forward-char) - (typescript--continued-expression-p))))) - -(defun typescript--forward-function-decl () - "Move forward over a typescript function declaration. -This puts point at the 'function' keyword. - -If this is a syntactically-correct non-expression function, -return the name of the function, or t if the name could not be -determined. Otherwise, return nil." - (cl-assert (looking-at "\\_")) - (let ((name t)) - (forward-word) - (forward-comment most-positive-fixnum) - (when (looking-at typescript--name-re) - (setq name (match-string-no-properties 0)) - (goto-char (match-end 0))) - (forward-comment most-positive-fixnum) - (and (eq (char-after) ?\( ) - (ignore-errors (forward-list) t) - (progn (forward-comment most-positive-fixnum) - (and (eq (char-after) ?{) - name))))) - -(defun typescript--function-prologue-beginning (&optional pos) - "Return the start of the typescript function prologue containing POS. -A function prologue is everything from start of the definition up -to and including the opening brace. POS defaults to point. -If POS is not in a function prologue, return nil." - (let (prologue-begin) - (save-excursion - (if pos - (goto-char pos) - (setq pos (point))) - - (when (save-excursion - (forward-line 0) - (or (looking-at typescript--function-heading-2-re) - (looking-at typescript--function-heading-3-re))) - - (setq prologue-begin (match-beginning 1)) - (when (<= prologue-begin pos) - (goto-char (match-end 0)))) - - (skip-syntax-backward "w_") - (and (or (looking-at "\\_") - (typescript--re-search-backward "\\_" nil t)) - - (save-match-data (goto-char (match-beginning 0)) - (typescript--forward-function-decl)) - - (<= pos (point)) - (or prologue-begin (match-beginning 0)))))) - -(defun typescript--beginning-of-defun-raw () - "Helper function for `typescript-beginning-of-defun'. -Go to previous defun-beginning and return the parse state for it, -or nil if we went all the way back to bob and don't find -anything." - (typescript--ensure-cache) - (let (pstate) - (while (and (setq pstate (typescript--backward-pstate)) - (not (eq 'function (typescript--pitem-type (car pstate)))))) - (and (not (bobp)) pstate))) - -(defun typescript--pstate-is-toplevel-defun (pstate) - "Helper function for `typescript--beginning-of-defun-nested'. -If PSTATE represents a non-empty top-level defun, return the -top-most pitem. Otherwise, return nil." - (cl-loop for pitem in pstate - with func-depth = 0 - with func-pitem - if (eq 'function (typescript--pitem-type pitem)) - do (cl-incf func-depth) - and do (setq func-pitem pitem) - finally return (if (eq func-depth 1) func-pitem))) - -(defun typescript--beginning-of-defun-nested () - "Helper function for `typescript--beginning-of-defun'. -Return the pitem of the function we went to the beginning of." - (or - ;; Look for the smallest function that encloses point... - (cl-loop for pitem in (typescript--parse-state-at-point) - if (and (eq 'function (typescript--pitem-type pitem)) - (typescript--inside-pitem-p pitem)) - do (goto-char (typescript--pitem-h-begin pitem)) - and return pitem) - - ;; ...and if that isn't found, look for the previous top-level - ;; defun - (cl-loop for pstate = (typescript--backward-pstate) - while pstate - if (typescript--pstate-is-toplevel-defun pstate) - do (goto-char (typescript--pitem-h-begin it)) - and return it))) - -(defun typescript--beginning-of-defun-flat () - "Helper function for `typescript-beginning-of-defun'." - (let ((pstate (typescript--beginning-of-defun-raw))) - (when pstate - (goto-char (typescript--pitem-h-begin (car pstate)))))) - -(defun typescript-beginning-of-defun (&optional arg) - "Value of `beginning-of-defun-function' for `typescript-mode'." - (setq arg (or arg 1)) - (while (and (not (eobp)) (< arg 0)) - (cl-incf arg) - (when (and (not typescript-flat-functions) - (or (eq (typescript-syntactic-context) 'function) - (typescript--function-prologue-beginning))) - (typescript-end-of-defun)) - - (if (typescript--re-search-forward - "\\_" nil t) - (goto-char (typescript--function-prologue-beginning)) - (goto-char (point-max)))) - - (while (> arg 0) - (cl-decf arg) - ;; If we're just past the end of a function, the user probably wants - ;; to go to the beginning of *that* function - (when (eq (char-before) ?}) - (backward-char)) - - (let ((prologue-begin (typescript--function-prologue-beginning))) - (cond ((and prologue-begin (< prologue-begin (point))) - (goto-char prologue-begin)) - - (typescript-flat-functions - (typescript--beginning-of-defun-flat)) - (t - (typescript--beginning-of-defun-nested)))))) - -(defun typescript--flush-caches (&optional beg ignored) - "Flush the `typescript-mode' syntax cache after position BEG. -BEG defaults to `point-min', meaning to flush the entire cache." - (interactive) - (setq beg (or beg (save-restriction (widen) (point-min)))) - (setq typescript--cache-end (min typescript--cache-end beg))) - -(defmacro typescript--debug (&rest arguments) - ;; `(message ,@arguments) - ) - -(defun typescript--ensure-cache--pop-if-ended (open-items paren-depth) - (let ((top-item (car open-items))) - (when (<= paren-depth (typescript--pitem-paren-depth top-item)) - (cl-assert (not (get-text-property (1- (point)) 'typescript-pend))) - (put-text-property (1- (point)) (point) 'typescript--pend top-item) - (setf (typescript--pitem-b-end top-item) (point)) - (setq open-items - ;; open-items must contain at least two items for this to - ;; work, but because we push a dummy item to start with, - ;; that assumption holds. - (cons (typescript--pitem-add-child (cl-second open-items) top-item) - (cddr open-items))))) - open-items) - -(defmacro typescript--ensure-cache--update-parse () - "Helper function for `typescript--ensure-cache'. -Update parsing information up to point, referring to parse, -prev-parse-point, goal-point, and open-items bound lexically in -the body of `typescript--ensure-cache'." - `(progn - (setq goal-point (point)) - (goto-char prev-parse-point) - (while (progn - (setq open-items (typescript--ensure-cache--pop-if-ended - open-items (car parse))) - ;; Make sure parse-partial-sexp doesn't stop because we *entered* - ;; the given depth -- i.e., make sure we're deeper than the target - ;; depth. - (cl-assert (> (nth 0 parse) - (typescript--pitem-paren-depth (car open-items)))) - (setq parse (parse-partial-sexp - prev-parse-point goal-point - (typescript--pitem-paren-depth (car open-items)) - nil parse)) - -;; (let ((overlay (make-overlay prev-parse-point (point)))) -;; (overlay-put overlay 'face '(:background "red")) -;; (unwind-protect -;; (progn -;; (typescript--debug "parsed: %S" parse) -;; (sit-for 1)) -;; (delete-overlay overlay))) - - (setq prev-parse-point (point)) - (< (point) goal-point))) - - (setq open-items (typescript--ensure-cache--pop-if-ended - open-items (car parse))))) - -(defun typescript--show-cache-at-point () - (interactive) - (require 'pp) - (let ((prop (get-text-property (point) 'typescript--pstate))) - (with-output-to-temp-buffer "*Help*" - (pp prop)))) - -(defun typescript--split-name (string) - "Split a typescript name into its dot-separated parts. -This also removes any prototype parts from the split name -\(unless the name is just \"prototype\" to start with)." - (let ((name (save-match-data - (split-string string "\\." t)))) - (unless (and (= (length name) 1) - (equal (car name) "prototype")) - - (setq name (remove "prototype" name))))) - -(defvar typescript--guess-function-name-start nil) - -(defun typescript--guess-function-name (position) - "Guess the name of the typescript function at POSITION. -POSITION should be just after the end of the word \"function\". -Return the name of the function, or nil if the name could not be -guessed. - -This function clobbers match data. If we find the preamble -begins earlier than expected while guessing the function name, -set `typescript--guess-function-name-start' to that position; otherwise, -set that variable to nil." - (setq typescript--guess-function-name-start nil) - (save-excursion - (goto-char position) - (forward-line 0) - (cond - ((looking-at typescript--function-heading-3-re) - (and (eq (match-end 0) position) - (setq typescript--guess-function-name-start (match-beginning 1)) - (match-string-no-properties 1))) - - ((looking-at typescript--function-heading-2-re) - (and (eq (match-end 0) position) - (setq typescript--guess-function-name-start (match-beginning 1)) - (match-string-no-properties 1)))))) - -(defun typescript--clear-stale-cache () - ;; Clear any endings that occur after point - (let (end-prop) - (save-excursion - (while (setq end-prop (typescript--forward-text-property - 'typescript--pend)) - (setf (typescript--pitem-b-end end-prop) nil)))) - - ;; Remove any cache properties after this point - (remove-text-properties (point) (point-max) - '(typescript--pstate t typescript--pend t))) - -(defun typescript--ensure-cache (&optional limit) - "Ensures brace cache is valid up to the character before LIMIT. -LIMIT defaults to point." - (setq limit (or limit (point))) - (when (< typescript--cache-end limit) - - (c-save-buffer-state - (open-items - orig-match-start - orig-match-end - orig-depth - parse - prev-parse-point - name - case-fold-search - filtered-class-styles - new-item - goal-point - end-prop) - - ;; Figure out which class styles we need to look for - (setq filtered-class-styles - (cl-loop for style in typescript--class-styles - if (memq (plist-get style :framework) - typescript-enabled-frameworks) - collect style)) - - (save-excursion - (save-restriction - (widen) - - ;; Find last known good position - (goto-char typescript--cache-end) - (unless (bobp) - (setq open-items (get-text-property - (1- (point)) 'typescript--pstate)) - - (unless open-items - (goto-char (previous-single-property-change - (point) 'typescript--pstate nil (point-min))) - - (unless (bobp) - (setq open-items (get-text-property (1- (point)) - 'typescript--pstate)) - (cl-assert open-items)))) - - (unless open-items - ;; Make a placeholder for the top-level definition - (setq open-items (list typescript--initial-pitem))) - - (setq parse (syntax-ppss)) - (setq prev-parse-point (point)) - - (typescript--clear-stale-cache) - - (narrow-to-region (point-min) limit) - - (cl-loop while (re-search-forward typescript--quick-match-re-func nil t) - for orig-match-start = (goto-char (match-beginning 0)) - for orig-match-end = (match-end 0) - do (typescript--ensure-cache--update-parse) - for orig-depth = (nth 0 parse) - - ;; Each of these conditions should return non-nil if - ;; we should add a new item and leave point at the end - ;; of the new item's header (h-end in the - ;; typescript--pitem diagram). This point is the one - ;; after the last character we need to unambiguously - ;; detect this construct. If one of these evaluates to - ;; nil, the location of the point is ignored. - if (cond - ;; In comment or string - ((nth 8 parse) nil) - - ;; Regular function declaration - ((and (looking-at "\\_") - (setq name (typescript--forward-function-decl))) - - (when (eq name t) - (setq name (typescript--guess-function-name orig-match-end)) - (if name - (when typescript--guess-function-name-start - (setq orig-match-start - typescript--guess-function-name-start)) - - (setq name t))) - - (cl-assert (eq (char-after) ?{)) - (forward-char) - (make-typescript--pitem - :paren-depth orig-depth - :h-begin orig-match-start - :type 'function - :name (if (eq name t) - name - (typescript--split-name name)))) - - ;; "Prototype function" declaration - ((looking-at typescript--plain-method-re) - (goto-char (match-beginning 3)) - (when (save-match-data - (typescript--forward-function-decl)) - (forward-char) - (make-typescript--pitem - :paren-depth orig-depth - :h-begin orig-match-start - :type 'function - :name (nconc (typescript--split-name - (match-string-no-properties 1)) - (list (match-string-no-properties 2)))))) - - ;; Class definition - ((cl-loop with syntactic-context = - (typescript--syntactic-context-from-pstate open-items) - for class-style in filtered-class-styles - if (and (memq syntactic-context - (plist-get class-style :contexts)) - (looking-at (plist-get class-style - :class-decl))) - do (goto-char (match-end 0)) - and return - (make-typescript--pitem - :paren-depth orig-depth - :h-begin orig-match-start - :type class-style - :name (typescript--split-name - (match-string-no-properties 1)))))) - - do (typescript--ensure-cache--update-parse) - and do (push it open-items) - and do (put-text-property - (1- (point)) (point) 'typescript--pstate open-items) - else do (goto-char orig-match-end)) - - (goto-char limit) - (typescript--ensure-cache--update-parse) - (setq typescript--cache-end limit) - (setq typescript--last-parse-pos limit) - (setq typescript--state-at-last-parse-pos open-items)))))) - -(defun typescript--end-of-defun-flat () - "Helper function for `typescript-end-of-defun'." - (cl-loop while (typescript--re-search-forward "}" nil t) - do (typescript--ensure-cache) - if (get-text-property (1- (point)) 'typescript--pend) - if (eq 'function (typescript--pitem-type it)) - return t - finally do (goto-char (point-max)))) - -(defun typescript--end-of-defun-nested () - "Helper function for `typescript-end-of-defun'." - (let* (pitem - (this-end (save-excursion - (and (setq pitem (typescript--beginning-of-defun-nested)) - (typescript--pitem-goto-h-end pitem) - (progn (backward-char) - (forward-list) - (point))))) - found) - - (if (and this-end (< (point) this-end)) - ;; We're already inside a function; just go to its end. - (goto-char this-end) - - ;; Otherwise, go to the end of the next function... - (while (and (typescript--re-search-forward "\\_" nil t) - (not (setq found (progn - (goto-char (match-beginning 0)) - (typescript--forward-function-decl)))))) - - (if found (forward-list) - ;; ... or eob. - (goto-char (point-max)))))) - -(defun typescript-end-of-defun (&optional arg) - "Value of `end-of-defun-function' for `typescript-mode'." - (setq arg (or arg 1)) - (while (and (not (bobp)) (< arg 0)) - (cl-incf arg) - (typescript-beginning-of-defun) - (typescript-beginning-of-defun) - (unless (bobp) - (typescript-end-of-defun))) - - (while (> arg 0) - (cl-decf arg) - ;; look for function backward. if we're inside it, go to that - ;; function's end. otherwise, search for the next function's end and - ;; go there - (if typescript-flat-functions - (typescript--end-of-defun-flat) - - ;; if we're doing nested functions, see whether we're in the - ;; prologue. If we are, go to the end of the function; otherwise, - ;; call typescript--end-of-defun-nested to do the real work - (let ((prologue-begin (typescript--function-prologue-beginning))) - (cond ((and prologue-begin (<= prologue-begin (point))) - (goto-char prologue-begin) - (re-search-forward "\\_" - (1 font-lock-constant-face)) - - (,(rx symbol-start "class" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - (,(rx symbol-start "extends" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - (,(rx symbol-start "implements" (+ space)) - (,(rx symbol-start (+ (syntax word))) nil nil (0 font-lock-type-face))) - - (,(rx symbol-start "interface" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - (,(rx symbol-start "type" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - (,(rx symbol-start "enum" (+ space) (group (+ (or (syntax word) (syntax symbol))))) - (1 font-lock-type-face)) - - ;; Highlights class being declared, in parts - (typescript--class-decl-matcher - ,(concat "\\(" typescript--name-re "\\)\\(?:\\.\\|.*$\\)") - (goto-char (match-beginning 1)) - nil - (1 font-lock-type-face)) - - ;; Highlights parent class, in parts, if available - (typescript--class-decl-matcher - ,(concat "\\(" typescript--name-re "\\)\\(?:\\.\\|.*$\\)") - (if (match-beginning 2) - (progn - (setq typescript--tmp-location (match-end 2)) - (goto-char typescript--tmp-location) - (insert "=") - (goto-char (match-beginning 2))) - (setq typescript--tmp-location nil) - (goto-char (point-at-eol))) - (when typescript--tmp-location - (save-excursion - (goto-char typescript--tmp-location) - (delete-char 1))) - (1 font-lock-type-face)) - - ;; Highlights parent class - (typescript--class-decl-matcher - (2 font-lock-type-face nil t)) - - ;; Dojo needs its own matcher to override the string highlighting - (,(typescript--make-framework-matcher - 'dojo - "^\\s-*dojo\\.declare\\s-*(\"" - "\\(" typescript--dotted-name-re "\\)" - "\\(?:\"\\s-*,\\s-*\\(" typescript--dotted-name-re "\\)\\)?") - (1 font-lock-type-face t) - (2 font-lock-type-face nil t)) - - ;; Match Dojo base classes. Of course Mojo has to be different - ;; from everything else under the sun... - (,(typescript--make-framework-matcher - 'dojo - "^\\s-*dojo\\.declare\\s-*(\"" - "\\(" typescript--dotted-name-re "\\)\"\\s-*,\\s-*\\[") - ,(concat "[[,]\\s-*\\(" typescript--dotted-name-re "\\)\\s-*" - "\\(?:\\].*$\\)?") - (backward-char) - (end-of-line) - (1 font-lock-type-face)) - - ;; continued Dojo base-class list - (,(typescript--make-framework-matcher - 'dojo - "^\\s-*" typescript--dotted-name-re "\\s-*[],]") - ,(concat "\\(" typescript--dotted-name-re "\\)" - "\\s-*\\(?:\\].*$\\)?") - (if (save-excursion (backward-char) - (typescript--inside-dojo-class-list-p)) - (forward-symbol -1) - (end-of-line)) - (end-of-line) - (1 font-lock-type-face)) - - ;; variable declarations - ,(list - (concat "\\_<\\(const\\|var\\|let\\)\\_>\\|" typescript--basic-type-re) - (list #'typescript--variable-decl-matcher nil nil nil)) - - ;; class instantiation - ,(list - (concat "\\_\\s-+\\(" typescript--dotted-name-re "\\)") - (list 1 'font-lock-type-face)) - - ;; instanceof - ,(list - (concat "\\_\\s-+\\(" typescript--dotted-name-re "\\)") - (list 1 'font-lock-type-face)) - - ;; formal parameters - ,(list - (concat - "\\_\\(\\s-+" typescript--name-re "\\)?\\s-*\\(<.*>\\)?\\s-*(\\s-*" - typescript--name-start-re) - (list (concat "\\(" typescript--name-re "\\)\\(\\s-*).*\\)?") - '(backward-char) - '(end-of-line) - '(1 font-lock-variable-name-face))) - - ;; continued formal parameter list - ,(list - (concat - "^\\s-*" typescript--name-re "\\s-*[,)]") - (list typescript--name-re - '(if (save-excursion (backward-char) - (typescript--inside-param-list-p)) - (forward-symbol -1) - (end-of-line)) - '(end-of-line) - '(0 font-lock-variable-name-face)))) - "Level three font lock for `typescript-mode'.") - -(defun typescript--flyspell-mode-predicate () - "A custom predicate to help `flyspell-prog-mode' determine whether a word should be checked." - ;; We depend on fontification for our results. font-lock-ensure is defined on - ;; Emacs 25 and over. Earlier versions use font-lock-fontify-buffer. - (if (fboundp 'font-lock-ensure) - (font-lock-ensure) - (font-lock-fontify-buffer)) - (and - ;; Check with the default method that flyspell provides. - (flyspell-generic-progmode-verify) - - ;; - ;; And eliminate cases specific to our mode we don't want to have - ;; spell-checked. - ;; - - ;; Don't check the module names in import statements. - (save-excursion - (not (let* ((parse (syntax-ppss (1- (point)))) - (string-start-pos (and (nth 3 parse) - (nth 8 parse)))) - (and string-start-pos - (save-match-data - ;; Move to back to the start of the string, then past any ws - ;; and then past any non-ws to see if we have "from" or "import". - (goto-char string-start-pos) - (typescript--backward-syntactic-ws) - (skip-syntax-backward "^-" (point-at-bol)) - (looking-at "from\\|import\\s-")))))))) - -(defun typescript--inside-pitem-p (pitem) - "Return whether point is inside the given pitem's header or body." - (typescript--ensure-cache) - (cl-assert (typescript--pitem-h-begin pitem)) - (cl-assert (typescript--pitem-paren-depth pitem)) - - (and (> (point) (typescript--pitem-h-begin pitem)) - (or (null (typescript--pitem-b-end pitem)) - (> (typescript--pitem-b-end pitem) (point))))) - -(defun typescript--parse-state-at-point () - "Parse the typescript program state at point. -Return a list of `typescript--pitem' instances that apply to point, most -specific first. In the worst case, the current toplevel instance -will be returned." - (save-excursion - (save-restriction - (widen) - (typescript--ensure-cache) - (let* ((bound (if (eobp) (point) (1+ (point)))) - (pstate (or (save-excursion - (typescript--backward-pstate)) - (list typescript--initial-pitem)))) - - ;; Loop until we either hit a pitem at BOB or pitem ends after - ;; point (or at point if we're at eob) - (cl-loop for pitem = (car pstate) - until (or (eq (typescript--pitem-type pitem) - 'toplevel) - (typescript--inside-pitem-p pitem)) - do (pop pstate)) - - pstate)))) - -(defun typescript--syntactic-context-from-pstate (pstate) - "Return the typescript syntactic context corresponding to PSTATE." - (let ((type (typescript--pitem-type (car pstate)))) - (cond ((memq type '(function macro)) - type) - ((consp type) - 'class) - (t 'toplevel)))) - -(defun typescript-syntactic-context () - "Return the typescript syntactic context at point. -When called interatively, also display a message with that -context." - (interactive) - (let* ((syntactic-context (typescript--syntactic-context-from-pstate - (typescript--parse-state-at-point)))) - - (when (called-interactively-p 'interactive) - (message "Syntactic context: %s" syntactic-context)) - - syntactic-context)) - -(defun typescript--class-decl-matcher (limit) - "Font lock function used by `typescript-mode'. -This performs fontification according to `typescript--class-styles'." - (cl-loop initially (typescript--ensure-cache limit) - while (re-search-forward typescript--quick-match-re limit t) - for orig-end = (match-end 0) - do (goto-char (match-beginning 0)) - if (cl-loop for style in typescript--class-styles - for decl-re = (plist-get style :class-decl) - if (and (memq (plist-get style :framework) - typescript-enabled-frameworks) - (memq (typescript-syntactic-context) - (plist-get style :contexts)) - decl-re - (looking-at decl-re)) - do (goto-char (match-end 0)) - and return t) - return t - else do (goto-char orig-end))) - -(defconst typescript--font-lock-keywords-4 - `( - ;; highlights that override previous levels - ;; - - ;; special highlight for `this' keyword - ("\\(this\\)\\." - (1 'typescript-this-face)) - - (,typescript--access-modifier-re (1 'typescript-access-modifier-face)) - (,typescript--basic-type-re (1 'typescript-primitive-face)) - - ;; generics support - ,(list - (concat typescript--name-re "\\s-*" "<\\s-*" typescript--name-start-re) - (list (concat "\\(" typescript--name-re "\\)\\(\\s-*>[^<]*\\)?") - '(backward-char) - '(end-of-line) - '(1 font-lock-type-face))) - - ;; type-highlighting in variable/parameter declarations - ;; supports a small variety of common declarations: - ;; - let a: SomeType; - ;; - private b: SomeType; - ;; - private someFunc(var: SomeType) { - ;; - private array: SomeType[] - ;; - private generic: SomeType - ;; - private genericArray: SomeType[] - ;; - function testFunc(): SomeType<> { - ;; TODO: namespaced classes! - ,(list - (concat ":\\s-\\(" typescript--type-name-re "\\)\\(<" typescript--type-name-re ">\\)?\\(\[\]\\)?\\([,;]\\)?\\s-*{?") - '(1 'font-lock-type-face)) - - ;; type-casts - ,(list - (concat "<\\(" typescript--type-name-re "\\)>") - '(1 'font-lock-type-face)) - - ;; highlights that append to previous levels - ;; - ,@typescript--font-lock-keywords-3 - - (,typescript--decorator-re (1 font-lock-function-name-face)) - (,typescript--function-call-re (1 font-lock-function-name-face)) - (,typescript--builtin-re (1 font-lock-type-face)) - - ;; arrow function - ("\\(=>\\)" - (1 font-lock-keyword-face))) - "Level four font lock for `typescript-mode'.") - -(defconst typescript--font-lock-keywords - '(typescript--font-lock-keywords-4 typescript--font-lock-keywords-1 - typescript--font-lock-keywords-2 - typescript--font-lock-keywords-3 - typescript--font-lock-keywords-4) - "Font lock keywords for `typescript-mode'. See `font-lock-keywords'.") - -;;; Propertize - -;; -;; The propertize code was adapted from: -;; https://github.com/emacs-mirror/emacs/blob/489d6466372f488adc53897435fff290394b62f7/lisp/progmodes/js.el -;; - -(defconst typescript--syntax-propertize-regexp-regexp - (rx - ;; Start of regexp. - "/" - (0+ (or - ;; Match characters outside of a character class. - (not (any ?\[ ?/ ?\\)) - ;; Match backslash quoted characters. - (and "\\" not-newline) - ;; Match character class. - (and - "[" - (0+ (or - (not (any ?\] ?\\)) - (and "\\" not-newline))) - "]"))) - (group (zero-or-one "/"))) - "Regular expression matching a JavaScript regexp literal.") - -(defun typescript-syntax-propertize-regexp (end) - (let ((ppss (syntax-ppss))) - (when (eq (nth 3 ppss) ?/) - ;; A /.../ regexp. - (goto-char (nth 8 ppss)) - (when (looking-at typescript--syntax-propertize-regexp-regexp) - ;; Don't touch text after END. - (when (> end (match-end 1)) - (setq end (match-end 1))) - (put-text-property (match-beginning 1) end - 'syntax-table (string-to-syntax "\"/")) - (goto-char end))))) - -(defun typescript-syntax-propertize (start end) - ;; JavaScript allows immediate regular expression objects, written /.../. - (funcall - (syntax-propertize-rules - ;; Distinguish /-division from /-regexp chars (and from /-comment-starter). - ;; FIXME: Allow regexps after infix ops like + ... - ;; https://developer.mozilla.org/en/JavaScript/Reference/Operators - ;; We can probably just add +, -, <, >, %, ^, ~, ?, : at which - ;; point I think only * and / would be missing which could also be added, - ;; but need care to avoid affecting the // and */ comment markers. - ("\\(?:^\\|[=([{,:;|&!]\\|\\_\\)\\(?:[ \t]\\)*\\(/\\)[^/*]" - (1 (ignore - (forward-char -1) - (when (or (not (memq (char-after (match-beginning 0)) '(?\s ?\t))) - ;; If the / is at the beginning of line, we have to check - ;; the end of the previous text. - (save-excursion - (goto-char (match-beginning 0)) - (forward-comment (- (point))) - (memq (char-before) - (eval-when-compile (append "=({[,:;" '(nil)))))) - (put-text-property (match-beginning 1) (match-end 1) - 'syntax-table (string-to-syntax "\"/")) - (typescript-syntax-propertize-regexp end))))) - ;; Hash-bang at beginning of buffer. - ("\\`\\(#\\)!" (1 "< b"))) - start end)) - -;;; Indentation - -(defconst typescript--possibly-braceless-keyword-re - (typescript--regexp-opt-symbol - '("catch" "do" "else" "finally" "for" "if" "try" "while" "with")) - "Regexp matching keywords optionally followed by an opening brace.") - -(defconst typescript--indent-keyword-re - (typescript--regexp-opt-symbol '("in" "instanceof")) - "Regexp matching keywords that affect indentation of continued expressions.") - -(defconst typescript--indent-operator-re - (concat "[-+*/%<>=&^|?:.]\\([^-+*/]\\|$\\)\\|" typescript--indent-keyword-re) - "Regexp matching operators that affect indentation of continued expressions.") - -;; -;; We purposely do not allow the plus symbol as a prefix here, as this -;; regex is used to check number literal in type annotations, and TS -;; does not allow to use a plus symbol to prefix numbers there: you -;; can use 1, but not +1 in a type annotation. -;; -;; This is meant to match NaN, floats, decimals, the two infinities -;; and numbers recorded in binary, octal and hex. -;; -;; This regular expression was derived from: -;; https://stackoverflow.com/a/30987109/ -;; -(defconst typescript--number-literal-re - "\\(?:NaN\\|-?\\(?:0[Bb][01]+\\|0[Oo][0-7]+\\|0[Xx][0-9a-fA-F]+\\|Infinity\\|\\(?:[[:digit:]]*\\.[[:digit:]]+\\|[[:digit:]]+\\)\\(?:[Ee][+-]?[[:digit:]]+\\)?\\)\\)" - "Regexp that matches number literals.") - -(defconst typescript--reserved-start-keywords - '("const" "export" "function" "let" "var") - "These keywords cannot be variable or type names and start a new sentence. -Note that the \"import\" keyword can be a type import since TS2.9, so it might -not start a sentence!") - -(defconst typescript--reserved-start-keywords-re - (typescript--regexp-opt-symbol '("const" "export" "function" "let" "var")) - "A regular expression matching `typescript--reserved-start-keywords'.") - -(defconst typescript--type-vs-ternary-re - (concat "[?]\\|" (typescript--regexp-opt-symbol - (append typescript--reserved-start-keywords - '("as" "class" "interface" "private" "public" "readonly")))) - "Keywords/Symbols that help tell apart colon for types vs ternary operators.") - -(defun typescript--search-backward-matching-angle-bracket-inner (depth) - "Auxiliary function for `typescript--search-backward-matching-angle-bracket'. -DEPTH indicates how nested we think we are: it increases when we cross closing -brackets, and decreases when we cross opening brackets." - ;; We look backwards for a "<" that would correspond to the ">" we started - ;; from. However, there is no guarantee that it exists, since our ">" could - ;; be a greater-than operation. Some symbols will make it clear that we are - ;; *not* in a type annotation, so we can return nil. Otherwise, we keep - ;; looking for the matching one. - (or (<= depth 0) - (and - ;; If we cross over a reserved start keyword, we abandon hope of finding - ;; a matching angle bracket. This prevents extreme recursion depths. - (typescript--re-search-backward (concat "[<>]\\|" typescript--reserved-start-keywords-re) nil t) - (cl-case (char-after) - (?< (typescript--search-backward-matching-angle-bracket-inner (- depth 1))) - (?> (typescript--search-backward-matching-angle-bracket-inner (+ depth 1))))))) - -(defun typescript--search-backward-matching-angle-bracket () - "Search for matching \"<\" preceding a starting \">\". -DEPTH indicates how nested we think we are. Assumes the starting position is -right before the closing \">\". Returns nil when a match was not found, -otherwise returns t and the current position is right before the matching -\"<\"." - (typescript--search-backward-matching-angle-bracket-inner 1)) - -(defun typescript--re-search-backward-ignoring-angle-brackets () - "Search backwards, jumping over text within angle brackets. -Searches specifically for any of \"=\", \"}\", and \"type\"." - (and - (typescript--re-search-backward "[>=}]\\|\\_" nil t) - (or (not (looking-at ">")) - (and - (typescript--search-backward-matching-angle-bracket) - (typescript--re-search-backward-ignoring-angle-brackets))))) - -(defun typescript--looking-at-operator-p () - "Return non-nil if point is on a typescript operator, other than a comma." - (save-match-data - (and (looking-at typescript--indent-operator-re) - (or (not (looking-at ":")) - (save-excursion - (backward-sexp) - (and - (typescript--re-search-backward "[?:{]\\|\\_" nil t) - (looking-at "?")))) - ;; Do not identify forward slashes appearing in a "list" as - ;; an operator. The lists are: arrays, or lists of - ;; arguments. In this context, they must be part of regular - ;; expressions, and not math operators. - (not (and (looking-at "/") - (save-excursion - (typescript--backward-syntactic-ws) - (memq (char-before) '(?, ?\[ ?\())))) - ;; Do not identify methods, or fields, that are named "in" or - ;; "instanceof" as being operator keywords. - (not (and - (looking-at typescript--indent-keyword-re) - (save-excursion - (typescript--backward-syntactic-ws) - (memq (char-before) '(?, ?{ ?} ?\;))))) - ;; Do not identify the symbol > if it is likely part of a type argument - ;; T, but identify it if it is likely a greater-than symbol. This is - ;; a hard problem in the absence of semicolons, see: - ;; https://github.com/ananthakumaran/typescript.el/issues/81 - (not (and - (looking-at ">") - (save-excursion - (and - (typescript--search-backward-matching-angle-bracket) - ;; If we made it here, we found a candidate matching opening - ;; angle bracket. We still need to guess whether it actually - ;; is one, and not a spurious less-than operator! - - ;; Look backwards for the first of: - ;; - one of the symbols: = : - ;; - or a TypeScript keyword - ;; Depending on what comes first, we can make an educated - ;; guess on the nature of our ">" of interest. - (typescript--re-search-backward (concat "[=:]\\|" typescript--keyword-re) nil t) - (or - ;; If the previous keyword is "as", definitely a type. - (looking-at "\\_") - ;; Same goes for type imports. - (looking-at "\\_") - ;; A colon could be either a type symbol, or a ternary - ;; operator, try to guess which. - (and (looking-at ":") - (typescript--re-search-backward typescript--type-vs-ternary-re nil t) - (not (looking-at "?"))) - ;; This final check lets us distinguish between a - ;; 2-argument type "t < a , b > ..." and a use of the "," - ;; operator between two comparisons "t < a , b > ...". - ;; Looking back a little more lets us guess. - (and (looking-at "=") - (typescript--re-search-backward-ignoring-angle-brackets) - (looking-at "\\_"))))))) - (not (and - (looking-at "*") - ;; Generator method (possibly using computed property). - (looking-at (concat "\\* *\\(?:\\[\\|" typescript--name-re - " *(\\)")) - (save-excursion - (typescript--backward-syntactic-ws) - ;; We might misindent some expressions that would - ;; return NaN anyway. Shouldn't be a problem. - (memq (char-before) '(?, ?} ?{ ?\;)))))))) - - -(defun typescript--continued-expression-p () - "Return non-nil if the current line continues an expression." - (save-excursion - (back-to-indentation) - (let ((list-start (nth 1 (syntax-ppss)))) - (and - ;; This not clause is there to eliminate degenerate cases where we have - ;; something that looks like a continued expression but we are in fact at - ;; the beginning of the expression. Example: in `if (a) { .q(1)` when the - ;; point is on the dot, the expression that follows looks like a member - ;; expression but the object on which it is a member is missing. If we - ;; naively treat this as a continued expression, we run into trouble - ;; later. (An infinite loop.) - (not (and list-start - (save-excursion - (typescript--backward-syntactic-ws) - (backward-char) - (eq (point) list-start)))) - ;; Don't identify the spread syntax or rest operator as a "continuation". - (not (looking-at "\\.\\.\\.")) - (or (typescript--looking-at-operator-p) - (and (progn - (typescript--backward-syntactic-ws) - (or (bobp) (backward-char)) - (and (> (point) (point-min)) - (save-excursion (backward-char) (not (looking-at "[/*]/"))) - (typescript--looking-at-operator-p) - (and (progn (backward-char) - (not (looking-at "++\\|--\\|/[/*]")))))))))))) - -(cl-defun typescript--compute-member-expression-indent () - "Determine the indent of a member expression. - -This function must be called with point located at the dot that -starts the member expression. -" - ;; Find the line that has the object from which we are getting thismember. - ;; And set an indent relative to that. - (while (looking-at "\\.") - (typescript--backward-syntactic-ws) - (while (eq (char-before) ?\;) - (backward-char)) - (while (memq (char-before) '(?\] ?} ?\) ?>)) - (if (not (eq (char-before) ?>)) - (backward-list) - (backward-char) - (typescript--backward-over-generic-parameter-list)) - (typescript--backward-syntactic-ws)) - (if (looking-back typescript--dotted-name-re nil) - (back-to-indentation) - (typescript--forward-syntactic-ws))) - (+ (current-column) typescript-indent-level)) - -(defun typescript--end-of-do-while-loop-p () - "Return non-nil if point is on the \"while\" of a do-while statement. -Otherwise, return nil. A braceless do-while statement spanning -several lines requires that the start of the loop is indented to -the same column as the current line." - (interactive) - (save-excursion - (save-match-data - (when (looking-at "\\s-*\\_") - (if (save-excursion - (skip-chars-backward "[ \t\n]*}") - (looking-at "[ \t\n]*}")) - (save-excursion - (backward-list) (forward-symbol -1) (looking-at "\\_")) - (typescript--re-search-backward "\\_" (point-at-bol) t) - (or (looking-at "\\_") - (let ((saved-indent (current-indentation))) - (while (and (typescript--re-search-backward "^\\s-*\\_<" nil t) - (/= (current-indentation) saved-indent))) - (and (looking-at "\\s-*\\_") - (not (typescript--re-search-forward - "\\_" (point-at-eol) t)) - (= (current-indentation) saved-indent))))))))) - - -(defun typescript--ctrl-statement-indentation () - "Helper function for `typescript--proper-indentation'. -Return the proper indentation of the current line if it starts -the body of a control statement without braces; otherwise, return -nil." - (save-excursion - (back-to-indentation) - (when (save-excursion - (and (not (eq (point-at-bol) (point-min))) - (not (looking-at "[{]")) - (progn - (typescript--re-search-backward "[[:graph:]]" nil t) - (or (eobp) (forward-char)) - (when (= (char-before) ?\)) (backward-list)) - (skip-syntax-backward " ") - (skip-syntax-backward "w_") - (and - (looking-at typescript--possibly-braceless-keyword-re) - ;; If preceded by period, it's a method call. - (not (= (char-before) ?.)))) - (not (typescript--end-of-do-while-loop-p)))) - (save-excursion - (goto-char (match-beginning 0)) - (+ (current-indentation) typescript-indent-level))))) - -(defun typescript--get-c-offset (symbol anchor) - (let ((c-offsets-alist - (list (cons 'c typescript-comment-lineup-func)))) - (c-get-syntactic-indentation (list (cons symbol anchor))))) - -(defun typescript--backward-over-generic-parameter-list () - "Search backward for the start of a generic's parameter list and move to it. - -This is a utility function for -`typescript--backward-to-parameter-list'. - -This function must be called with the point placed on the final > -of the generic's parameter list. It will scan backwards to find -the start. If successful, it will move the point to the start of -the list. If not, it does not move the point. - -Returns nil on failure, or the position to which the point was -moved on success." - (when (eq (char-after) ?>) - (let ((depth 1)) - (cl-loop named search-loop - while (> depth 0) - do (progn - (unless (re-search-backward "[<>]" nil t) - (cl-return-from search-loop nil)) - (cond - ((looking-at ">") - (unless (eq (char-before) ?=) - (setq depth (1+ depth)))) - ((looking-at "<") (setq depth (1- depth))))) - finally return (point))))) - -(defun typescript--backward-to-parameter-list () - "Search backward for the end of a parameter list and move to it. - -This is a utility function for `typescript--proper-indentation'. - -This function must be called with the point placed before an -opening curly brace. It will try to skip over the type -annotation that would mark the return value of a function and -move to the end of the parameter list. If it is unsuccessful, it -does not move the point. \"Unsuccessful\" here also means that -the position at which we started did not in fact mark the -beginning of a function. The curly brace belonged to some other -syntactic construct than a function. - -Returns nil on failure, or the position to which the point was -moved on success." - (let ((location - (or - ;; This handles the case of a function with return type annotation. - (save-excursion - (cl-loop named search-loop - do - (typescript--backward-syntactic-ws) - ;; Check whether we are at "):". - (when (and (eq (char-before) ?\:) - (progn - (backward-char) - (skip-syntax-backward " ") - (eq (char-before) ?\)))) - ;; Success! This the end of the parameter list. - (cl-return-from search-loop (point))) - ;; If we recognize a structure that belongs in a return type annotation, - ;; skip back over it, or fail. - (cond - ;; Arrow of a function definition, or typeguard (eg. foo is SomeClass) - ((looking-back "=>\\|is" (- (point) 2)) - (backward-char 2)) - ;; End of the parameters list of a generic. - ((eq (char-before) ?>) - (backward-char) - (typescript--backward-over-generic-parameter-list)) - ;; Union of types, or a dot in a dotted name. - ((memq (char-before) '(?| ?.)) - (backward-char)) - ((or - ;; End-delimiter of a delimited construct, for constructs - ;; not handled above. - (memq (char-before) '(?\) ?} ?\" ?\])) - ;; This is also dealing with dotted names. This may come - ;; into play if a jump back moves over an entire dotted - ;; name at once. - ;; - ;; The earlier test for dotted names comes into play if the - ;; logic moves over one part of a dotted name at a time (which - ;; is what `backward-sexp` normally does). - (and (looking-back typescript--dotted-name-re nil) - ;; We don't want the loop to walk over constructs like switch (...) or for (...), etc. - (not (save-excursion - (backward-word) - (looking-at "\\_<\\(switch\\|if\\|while\\|until\\|for\\)\\_>\\(?:\\s-\\|\n\\)*("))))) - (condition-case nil - (backward-sexp) - (scan-error (cl-return-from search-loop nil)))) - ((looking-back typescript--number-literal-re - ;; We limit the search back to the previous space or end of line (if possible) - ;; to prevent the search from going over the whole buffer. - (save-excursion (re-search-backward "\\(?:\\s-\\|\n\\)" nil t)) t) - (goto-char (match-beginning 0))) - ;; Otherwise, we failed to find a location. - (t - (cl-return-from search-loop nil))))) - ;; This handles the case of a function without return type annotation. - (progn - (typescript--backward-syntactic-ws) - (when (eq (char-before) ?\)) - (point)))))) - (when location - (goto-char location)))) - -(defun typescript--proper-indentation (parse-status) - "Return the proper indentation for the current line." - (save-excursion - (back-to-indentation) - (let ((member-expr-p (looking-at "\\."))) - (cond ((nth 4 parse-status) ;; Inside a comment. - (typescript--get-c-offset 'c (nth 8 parse-status))) - ((nth 8 parse-status) 0) ;; Inside a string. - ((typescript--ctrl-statement-indentation)) ;; Control statements. - ((eq (char-after) ?#) 0) ;; Looking at a pragma. - ;; Inside a list of things. Note that in the TS contents, the curly braces - ;; marking code blocks are "list of things". - ((nth 1 parse-status) - (let ((indent-start (point)) - (same-indent-p (looking-at "[]})]")) - (switch-keyword-p (looking-at "\\_\\|\\_[^:]")) - (continued-expr-p (typescript--continued-expression-p)) - (list-start (nth 1 parse-status))) - (goto-char list-start) - (if (looking-at "[({[]\\s-*\\(/[/*]\\|$\\)") - (progn - (skip-syntax-backward " ") - (cond - ((or (typescript--backward-to-parameter-list) - (eq (char-before) ?\))) - ;; Take the curly brace as marking off the body of a function. - ;; In that case, we want the code that follows to see the indentation - ;; that was in effect at the beginning of the function declaration, and thus - ;; we want to move back over the list of function parameters. - (condition-case nil - (backward-list) - (error nil))) - ((looking-back "," nil) - ;; If we get here, we have a comma, spaces and an opening curly brace. (And - ;; (point) is just after the comma.) We don't want to move from the current position - ;; so that object literals in parameter lists are properly indented. - nil) - (t - ;; In all other cases, we don't want to move from the curly brace. - (goto-char list-start))) - (back-to-indentation) - (let* ((in-switch-p (unless same-indent-p - (looking-at "\\_"))) - (same-indent-p (or same-indent-p - (and switch-keyword-p - in-switch-p))) - (indent - (cond (same-indent-p - (current-column)) - (continued-expr-p - (if (not member-expr-p) - (+ (current-column) (* 2 typescript-indent-level) - typescript-expr-indent-offset) - (goto-char indent-start) - (typescript--compute-member-expression-indent))) - (t - (+ (current-column) typescript-indent-level))))) - (if (and in-switch-p typescript-indent-switch-clauses) - (+ indent typescript-indent-level) - indent))) - (unless same-indent-p - (forward-char) - (skip-chars-forward " \t")) - (if continued-expr-p - (if (not member-expr-p) - (progn (back-to-indentation) - (+ (current-column) typescript-indent-level - typescript-expr-indent-offset)) - (goto-char indent-start) - (typescript--compute-member-expression-indent)) - (current-column))))) - - ((typescript--continued-expression-p) ;; Inside a continued expression. - (if member-expr-p - (typescript--compute-member-expression-indent) - (+ typescript-indent-level typescript-expr-indent-offset))) - (t 0))))) - -(defun typescript-indent-line () - "Indent the current line as typescript." - (interactive) - (save-restriction - (widen) - (let* ((parse-status - (save-excursion (syntax-ppss (point-at-bol)))) - (offset (- (current-column) (current-indentation)))) - (indent-line-to (typescript--proper-indentation parse-status)) - (when (> offset 0) (move-to-column (+ offset (current-indentation))))))) - -;;; Filling - -(defun typescript-c-fill-paragraph (&optional justify) - "Fill the paragraph with `c-fill-paragraph'." - (interactive "*P") - ;; Dynamically replace functions using the lexically scoped cl-letf. - ;; See below for more details: - ;; http://endlessparentheses.com/understanding-letf-and-how-it-replaces-flet.html - (cl-letf (((symbol-function 'c-forward-sws) - (lambda (&optional limit) - (typescript--forward-syntactic-ws limit))) - ((symbol-function 'c-backward-sws) - (lambda (&optional limit) - (typescript--backward-syntactic-ws limit)))) - (let ((fill-paragraph-function 'c-fill-paragraph)) - (c-fill-paragraph justify)))) - -;; We maintain a cache of semantic information, i.e., the classes and -;; functions we've encountered so far. In order to avoid having to -;; re-parse the buffer on every change, we cache the parse state at -;; each interesting point in the buffer. Each parse state is a -;; modified copy of the previous one, or in the case of the first -;; parse state, the empty state. -;; -;; The parse state itself is just a stack of typescript--pitem -;; instances. It starts off containing one element that is never -;; closed, that is initially typescript--initial-pitem. -;; - - -(defun typescript--pitem-format (pitem) - (let ((name (typescript--pitem-name pitem)) - (type (typescript--pitem-type pitem))) - - (format "name:%S type:%S" - name - (if (atom type) - type - (plist-get type :name))))) - -(defun typescript--make-merged-item (item child name-parts) - "Helper function for `typescript--splice-into-items'. -Return a new item that is the result of merging CHILD into -ITEM. NAME-PARTS is a list of parts of the name of CHILD -that we haven't consumed yet." - (typescript--debug "typescript--make-merged-item: {%s} into {%s}" - (typescript--pitem-format child) - (typescript--pitem-format item)) - - ;; If the item we're merging into isn't a class, make it into one - (unless (consp (typescript--pitem-type item)) - (typescript--debug "typescript--make-merged-item: changing dest into class") - (setq item (make-typescript--pitem - :children (list item) - - ;; Use the child's class-style if it's available - :type (if (atom (typescript--pitem-type child)) - typescript--dummy-class-style - (typescript--pitem-type child)) - - :name (typescript--pitem-strname item)))) - - ;; Now we can merge either a function or a class into a class - (cons (cond - ((cdr name-parts) - (typescript--debug "typescript--make-merged-item: recursing") - ;; if we have more name-parts to go before we get to the - ;; bottom of the class hierarchy, call the merger - ;; recursively - (typescript--splice-into-items (car item) child - (cdr name-parts))) - - ((atom (typescript--pitem-type child)) - (typescript--debug "typescript--make-merged-item: straight merge") - ;; Not merging a class, but something else, so just prepend - ;; it - (cons child (car item))) - - (t - ;; Otherwise, merge the new child's items into those - ;; of the new class - (typescript--debug "typescript--make-merged-item: merging class contents") - (append (car child) (car item)))) - (cdr item))) - -(defun typescript--pitem-strname (pitem) - "Last part of the name of PITEM, as a string or symbol." - (let ((name (typescript--pitem-name pitem))) - (if (consp name) - (car (last name)) - name))) - -(defun typescript--splice-into-items (items child name-parts) - "Splice CHILD into the `typescript--pitem' ITEMS at NAME-PARTS. -If a class doesn't exist in the tree, create it. Return -the new items list. NAME-PARTS is a list of strings given -the broken-down class name of the item to insert." - - (let ((top-name (car name-parts)) - (item-ptr items) - new-items last-new-item new-cons item) - - (typescript--debug "typescript--splice-into-items: name-parts: %S items:%S" - name-parts - (mapcar #'typescript--pitem-name items)) - - (cl-assert (stringp top-name)) - (cl-assert (> (length top-name) 0)) - - ;; If top-name isn't found in items, then we build a copy of items - ;; and throw it away. But that's okay, since most of the time, we - ;; *will* find an instance. - - (while (and item-ptr - (cond ((equal (typescript--pitem-strname (car item-ptr)) top-name) - ;; Okay, we found an entry with the right name. Splice - ;; the merged item into the list... - (setq new-cons (cons (typescript--make-merged-item - (car item-ptr) child - name-parts) - (cdr item-ptr))) - - (if last-new-item - (setcdr last-new-item new-cons) - (setq new-items new-cons)) - - ;; ...and terminate the loop - nil) - - (t - ;; Otherwise, copy the current cons and move onto the - ;; text. This is tricky; we keep track of the tail of - ;; the list that begins with new-items in - ;; last-new-item. - (setq new-cons (cons (car item-ptr) nil)) - (if last-new-item - (setcdr last-new-item new-cons) - (setq new-items new-cons)) - (setq last-new-item new-cons) - - ;; Go to the next cell in items - (setq item-ptr (cdr item-ptr)))))) - - (if item-ptr - ;; Yay! We stopped because we found something, not because - ;; we ran out of items to search. Just return the new - ;; list. - (progn - (typescript--debug "search succeeded: %S" name-parts) - new-items) - - ;; We didn't find anything. If the child is a class and we don't - ;; have any classes to drill down into, just push that class; - ;; otherwise, make a fake class and carry on. - (typescript--debug "search failed: %S" name-parts) - (cons (if (cdr name-parts) - ;; We have name-parts left to process. Make a fake - ;; class for this particular part... - (make-typescript--pitem - ;; ...and recursively digest the rest of the name - :children (typescript--splice-into-items - nil child (cdr name-parts)) - :type typescript--dummy-class-style - :name top-name) - - ;; Otherwise, this is the only name we have, so stick - ;; the item on the front of the list - child) - items)))) - -(defun typescript--pitem-add-child (pitem child) - "Copy `typescript--pitem' PITEM, and push CHILD onto its list of children." - (cl-assert (integerp (typescript--pitem-h-begin child))) - (cl-assert (if (consp (typescript--pitem-name child)) - (cl-loop for part in (typescript--pitem-name child) - always (stringp part)) - t)) - - ;; This trick works because we know (based on our cl-defstructs) that - ;; the child list is always the first element, and so the second - ;; element and beyond can be shared when we make our "copy". - (cons - - (let ((name (typescript--pitem-name child)) - (type (typescript--pitem-type child))) - - (cond ((cdr-safe name) ; true if a list of at least two elements - ;; Use slow path because we need class lookup - (typescript--splice-into-items (car pitem) child name)) - - ((and (consp type) - (plist-get type :prototype)) - - ;; Use slow path because we need class merging. We know - ;; name is a list here because down in - ;; `typescript--ensure-cache', we made sure to only add - ;; class entries with lists for :name - (cl-assert (consp name)) - (typescript--splice-into-items (car pitem) child name)) - - (t - ;; Fast path - (cons child (car pitem))))) - - (cdr pitem))) - -;;; compilation-mode support - -;; tsc supports formatting errors in two general ways: plain and -;; pretty. ("Plain" is our term for "not pretty".) In tsc versions -;; prior to 2.7, the plain and pretty formats both used the same -;; format for references into files. `typescript-tsc-error-regexp` -;; covers both plain and pretty for those versions. -;; -;; Version 2.7 changed the pretty format so as to format source code -;; references differently. This required the introduction of -;; `typescript-tsc-pretty-error-regexp`. The format of plain error -;; messages did not change. So from that version onwards, -;; `typescript-tsc-error-regexp` covers plain error messages and -;; `typescript-tsc-pretty-error-regexp` covers pretty error messages. - -;; handle plain compiler-errors like the following when doing M-x compiletsc -;; -;; greeter.ts(24,9): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. -;; greeter.ts(30,12): error TS2339: Property 'indexOf' does not exist on type 'number'. -(defconst typescript-tsc-error-regexp - (concat - "^[[:blank:]]*" - "\\([^(\r\n)]+\\)(\\([0-9]+\\),\\([0-9]+\\)):[[:blank:]]+" - "error [[:alnum:]]+: [^\r\n]+$") - "Regexp to match errors generated by tsc.") - -;; handle pretty compiler-errors like the following when doing M-x compiletsc -;; test.ts:2:7 - error TS2322: Type '2' is not assignable to type 'string'. -(defconst typescript-tsc-pretty-error-regexp - (concat - "^[[:blank:]]*" - "\\([^(\r\n)]+\\):\\([0-9]+\\):\\([0-9]+\\) - [[:blank:]]*" - "error [[:alnum:]]+: [^\r\n]+$") - "Regexp to match errors generated by tsc.") - -;; -;; Should handle output like: -;; src/modules/authenticator.ts[1, 83]: ' should be " -;; (quotemarks) src/modules/authenticator.ts[2, 26]: ' should be " -;; ERROR: (quotemarks) src/modules/authenticator.ts[2, 26]: ' should be " -;; WARNING: src/modules/authenticator.ts[2, 26]: ' should be " -;; -;; "(quotemarks)" it the rule name. It is produced when using the -;; "verbose" formatter. The "verbose" formatter is identical to the -;; default ("prose") formatter, except for the additional rule name. -;; -;; "ERROR:" and "WARNING:" are the severity. This was added in tslint -;; 5.0. Prior versions have no notion of severity and simply omit this -;; part. -;; -(defconst typescript-tslint-report-regexp - (concat - "^[[:blank:]]*" - ;; severity ("type" in Emacs' parlance) - "\\(?:\\(?:ERROR\\|\\(WARNING\\)\\):[[:blank:]]+\\)?" - ;; rule name - "\\((.*)[[:blank:]]+\\)?" - ;; filename - "\\([^(\r\n)]+\\)" - "\\[" - ;; line - "\\([[:digit:]]+\\)" - ", " - ;; column - "\\([[:digit:]]+\\)" - "\\]: " - ;; message - ".*$") - "Regexp to match reports generated by tslint.") - -(dolist - (regexp - `((typescript-tsc - ,typescript-tsc-error-regexp - 1 2 3 2) - - (typescript-tsc-pretty - ,typescript-tsc-pretty-error-regexp - 1 2 3 2) - - (typescript-tslint - ,typescript-tslint-report-regexp - 3 4 5 (1)))) - (add-to-list 'compilation-error-regexp-alist-alist regexp) - (add-to-list 'compilation-error-regexp-alist (car regexp))) - -;;; Main Function - -;;;###autoload -(define-derived-mode typescript-mode prog-mode "typescript" - "Major mode for editing typescript. - -Key bindings: - -\\{typescript-mode-map}" - - :group 'typescript - :syntax-table typescript-mode-syntax-table - - (setq-local indent-line-function 'typescript-indent-line) - (setq-local beginning-of-defun-function 'typescript-beginning-of-defun) - (setq-local end-of-defun-function 'typescript-end-of-defun) - (setq-local open-paren-in-column-0-is-defun-start nil) - (setq-local font-lock-defaults (list typescript--font-lock-keywords)) - (setq-local syntax-propertize-function #'typescript-syntax-propertize) - (setq-local parse-sexp-ignore-comments t) - (setq-local parse-sexp-lookup-properties t) - - ;; Comments - (setq-local comment-start "// ") - (setq-local comment-end "") - (setq-local fill-paragraph-function 'typescript-c-fill-paragraph) - - ;; Parse cache - (add-hook 'before-change-functions #'typescript--flush-caches t t) - - ;; Frameworks - (typescript--update-quick-match-re) - - ;; for filling, pretend we're cc-mode - (setq c-comment-prefix-regexp "//+\\|\\**" - c-paragraph-start "$" - c-paragraph-separate "$" - c-block-comment-prefix "* " - c-line-comment-starter "//" - c-comment-start-regexp "/[*/]\\|\\s!" - comment-start-skip "\\(//+\\|/\\*+\\)\\s *") - - (setq-local electric-indent-chars - (append "{}():;," electric-indent-chars)) - (setq-local electric-layout-rules - '((?\; . after) (?\{ . after) (?\} . before))) - - (let ((c-buffer-is-cc-mode t)) - ;; FIXME: These are normally set by `c-basic-common-init'. Should - ;; we call it instead? (Bug#6071) - (make-local-variable 'paragraph-start) - (make-local-variable 'paragraph-separate) - (make-local-variable 'paragraph-ignore-fill-prefix) - (make-local-variable 'adaptive-fill-mode) - (make-local-variable 'adaptive-fill-regexp) - (c-setup-paragraph-variables)) - - (add-hook 'post-self-insert-hook - #'typescript--post-self-insert-function) - - (setq-local syntax-begin-function #'typescript--syntax-begin-function)) - -;; Set our custom predicate for flyspell prog mode -(put 'typescript-mode 'flyspell-mode-predicate - 'typescript--flyspell-mode-predicate) - -;;;###autoload -(eval-after-load 'folding - '(when (fboundp 'folding-add-to-marks-list) - (folding-add-to-marks-list 'typescript-mode "// {{{" "// }}}" ))) - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.ts$" . typescript-mode)) - -(provide 'typescript-mode) - -;;; typescript-mode.el ends here diff --git a/elpa/typescript-mode-20200312.2235/typescript-mode.elc b/elpa/typescript-mode-20200312.2235/typescript-mode.elc deleted file mode 100644 index c47ffc5856716ab382bb86d6e4c0f8bdd192067d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80634 zcmeIb342`CmG`Ukke0=R8bWX2KN1U@yD1+uIyvPx=R=!Ei5Ybgne*&C|i*qpY{HlMVL|2fKs+?j7=abY;O_-g`6{ zW!uz}9gX^;ov34LNF95_ z!)$Z7ci5xw(cyM=g(rK}>vwP7zMXA8>K*hp59#7%YreO)m5qkkW^XUs=w~~_Ua65V zlu_329qbJH2if5x3O1VFE>rNM{-+N7*#9joEG%t2JM33ChgS?KTgpQ1@+~~DydfUTB`K6vbMJL z!PWcMtN-;tKfUUI*Q%=z-dbC`vbMIow)So9^4i+>v&t-2vZV{JXIHXztG2Asbej{S zIegR)-5hQ+w4x)~U`u1%20kv^5QayG*~5e3(LR%KWme}k`l=1vdVik|)9tTce-OLU zZFQ_GooN&MleEsPEitQ`z4Ek<^~~mMZEf`R+S+&gdCGKNsw{{3T3KmZC)?fUn6Kf+ zU;3Mepml#|Yv%k=$O>q7X7*C+el_n*z1H^C>rAd*4~lYF9rgD?|3m1=2q5q8ZT2%3 zGnq_{eKfOARKd3fxF>ciOxu-8Qhhc56lhImv0h(o*fiExrY!be23GA1HV5f4W%~!i z!=ZYfRd)M_kA_>7Y^%Syqv3&WR~9}N0A}?J>e|be_J^a6ihqXU8{l|2Z?VPWG<5?@8&fD~UHOBk((@fp;(Ve27KYm$fgKK#` zZSEWZecC^`Isy7q=H5Q@i5Fmf`@!tl-x~g9SO$af$yNzKAV+&ciPJ$Ub9v#~v`ron z$oq)j&WETD$?QcOcCs3@su}s0P zd`oV2+v2LHZ)jUbySvXqZyc5{E?pJgXO;Wcj}C`OUxQ7A?PuA?{k^_3yN3J^gsez5 zh&G=Nkfh3tZ=8|s!QMdJ9ik3+A|d^HK3nB?&Mv~3QkMyC;tscmJ3GUt68>NgM^_gX zylcjUK04a%?Xh9?wt5?&p!L~UB}7f*Mum2KVK=tBc@qcyhezWl(!G1Q;^ocxz}CEm?oFnH?ipf#qv+YwDk}A3)WY}1TjAL^0K$nM^uX3 z@aWO-XlKi7yqt+k2B^ZrjsAlA72D9Yx3RErdpo;_D852 zo(|BO?Dh{H_7@T&#@JxKjKwse_~2-hf!G=hH3m3-LmL^e2- zHYXYE!qMJdf0Nbg9SnA!UDb3w>e0`=3{GaaIWU=QbI2;8vqAo6fB?&8ANbRxNfoqT zJ=N6hWdmDDpY#P=23oSkNA6?7q!${^;!|y@kjn-9*_dXfgEFPN)~wg&`KjOFe>~t} zy`hI^_-Q5&TY9**$8S4%s^Ya5_~{l88)#`Ly1fQXPo7$>FY+*{wPCd`{+_2vtqrSn z@n3nGRNJ&_7tgIVn@P1zt9J38oAQ(GpQi-{#9Si(#E! z*k?Yn>C?+db71`R#J>D|T*YVT?GE;SL

v20q>D$y>@! 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 )CB0rN4@R* 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")) :maintainer '("François-Xavier Bois") :url "http://web-mode.org") diff --git a/elpa/web-mode-20200418.2218/web-mode.el b/elpa/web-mode-20200418.2218/web-mode.el deleted file mode 100644 index d9728b41..00000000 --- a/elpa/web-mode-20200418.2218/web-mode.el +++ /dev/null @@ -1,14226 +0,0 @@ -;;; web-mode.el --- major mode for editing web templates -;;; -*- coding: utf-8; lexical-binding: t; -*- - -;; Copyright 2011-2020 François-Xavier Bois - -;; Version: 16.0.31 -;; Package-Version: 20200418.2218 -;; Author: François-Xavier Bois -;; Maintainer: François-Xavier Bois -;; Package-Requires: ((emacs "23.1")) -;; URL: http://web-mode.org -;; Repository: http://github.com/fxbois/web-mode -;; Created: July 2011 -;; Keywords: languages -;; License: GNU General Public License >= 2 -;; Distribution: This file is not part of Emacs - -;;; Commentary: - -;;============================================================================== -;; WEB-MODE is sponsored by ** Kernix ** Best Digital Factory & Data Lab (Paris) -;;============================================================================== - -;;; Code: - -;;---- CONSTS ------------------------------------------------------------------ - -(defconst web-mode-version "16.0.31" - "Web Mode version.") - -;;---- GROUPS ------------------------------------------------------------------ - -(defgroup web-mode nil - "Major mode for editing web templates" - :group 'languages - :prefix "web-" - :link '(url-link :tag "Site" "http://web-mode.org") - :link '(url-link :tag "Repository" "https://github.com/fxbois/web-mode")) - -(defgroup web-mode-faces nil - "Faces for syntax highlighting." - :group 'web-mode - :group 'faces) - -;;---- CUSTOMS ----------------------------------------------------------------- - -(defcustom web-mode-block-padding 0 - "Multi-line block (php, ruby, java, python, asp, etc.) left padding. - -1 to have to code aligned on the column 0." - :type '(choice (integer :tags "Number of spaces") - (const :tags "No indent" nil)) - :group 'web-mode) - -(defcustom web-mode-part-padding 1 - "Part elements (script, style) left padding." - :type '(choice (integer :tags "Number of spaces") - (const :tags "No indent" nil)) - :group 'web-mode) - -(defcustom web-mode-script-padding web-mode-part-padding - "Script element left padding." - :type '(choice (integer :tags "Number of spaces") - (const :tags "No indent" nil)) - :group 'web-mode) - -(defcustom web-mode-style-padding web-mode-part-padding - "Style element left padding." - :type '(choice (integer :tags "Number of spaces") - (const :tags "No indent" nil)) - :group 'web-mode) - -(defcustom web-mode-attr-indent-offset nil - "Html attribute indentation level." - :type '(choice (integer :tags "Number of spaces") - (const :tags "Default" nil)) - :safe #'(lambda (v) (or (integerp v) (booleanp v))) - :group 'web-mode) - -(defcustom web-mode-attr-value-indent-offset nil - "Html attribute value indentation level." - :type '(choice (integer :tags "Number of spaces") - (const :tags "Default" nil)) - :safe #'(lambda (v) (or (integerp v) (booleanp v))) - :group 'web-mode) - -(defcustom web-mode-markup-indent-offset - (if (and (boundp 'standard-indent) standard-indent) standard-indent 2) - "Html indentation level." - :type 'integer - :safe #'integerp - :group 'web-mode) - -(defcustom web-mode-css-indent-offset - (if (and (boundp 'standard-indent) standard-indent) standard-indent 2) - "CSS indentation level." - :type 'integer - :safe #'integerp - :group 'web-mode) - -(defcustom web-mode-code-indent-offset - (if (and (boundp 'standard-indent) standard-indent) standard-indent 2) - "Code (javascript, php, etc.) indentation level." - :type 'integer - :safe #'integerp - :group 'web-mode) - -(defcustom web-mode-sql-indent-offset 4 - "Sql (inside strings) indentation level." - :type 'integer - :safe #'integerp - :group 'web-mode) - -(defcustom web-mode-enable-css-colorization (display-graphic-p) - "In a CSS part, set background according to the color: #xxx, rgb(x,x,x)." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-comment-interpolation nil - "Enable highlight of keywords like FIXME, TODO, etc. in comments." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-comment-annotation nil - "Enable annotation in comments (jsdoc, phpdoc, etc.)." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-auto-indentation (display-graphic-p) - "Auto-indentation." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-auto-closing (display-graphic-p) - "Auto-closing." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-auto-pairing (display-graphic-p) - "Auto-pairing." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-auto-opening (display-graphic-p) - "Html element auto-opening." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-auto-quoting (display-graphic-p) - "Add double quotes after the character = in a tag." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-auto-expanding nil - "e.g. s/ expands to |." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-control-block-indentation t - "Control blocks increase indentation." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-current-element-highlight nil - "Enable current element highlight." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-current-column-highlight nil - "Show column for current element." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-whitespace-fontification nil - "Enable whitespaces." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-html-entities-fontification nil - "Enable html entities fontification." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-block-face nil - "Enable block face (useful for setting a background for example). -See web-mode-block-face." - :type 'boolean - :group 'web-mode) - -(defcustom web-mode-enable-part-face nil - "Enable part face (useful for setting background of ") - (cond - ((string-match-p " lang[ ]*=[ ]*[\"']stylus" style) - (setq element-content-type "stylus")) - ((string-match-p " lang[ ]*=[ ]*[\"']sass" style) - (setq element-content-type "sass")) - (t - (setq element-content-type "css")) - ) ;cond - ) ;let - ) ;style - ((string= tname "script") - (let (script) - (setq script (buffer-substring-no-properties tbeg tend) - part-close-tag "") - (cond - ((string-match-p " type[ ]*=[ ]*[\"']text/\\(jsx\\|babel\\)" script) - (setq element-content-type "jsx")) - ((string-match-p " type[ ]*=[ ]*[\"']text/\\(markdown\\|template\\)" script) - (setq element-content-type "markdown")) - ((string-match-p " type[ ]*=[ ]*[\"']text/ruby" script) - (setq element-content-type "ruby")) - ((seq-some (lambda (x) - (string-match-p (concat "type[ ]*=[ ]*[\"']" x) script)) - web-mode-script-template-types) - (setq element-content-type "html" - part-close-tag nil)) - ((string-match-p " type[ ]*=[ ]*[\"']application/\\(ld\\+json\\|json\\)" script) - (setq element-content-type "json")) - ((string-match-p " lang[ ]*=[ ]*[\"']\\(typescript\\|ts\\)" script) - (setq element-content-type "typescript")) - (t - (setq element-content-type "javascript")) - ) ;cond - ) ;let - ) ;script - ((and (string= tname "template") (string-match-p " lang" (buffer-substring-no-properties tbeg tend))) - (let (template) - (setq template (buffer-substring-no-properties tbeg tend) - part-close-tag "") - (cond - ((string-match-p " lang[ ]*=[ ]*[\"']pug" template) - (setq element-content-type "pug")) - (t - (setq element-content-type "html")) - ) ;cond - ) ;let - ) ;style - ((and (string= web-mode-engine "archibus") - (string= tname "sql")) - (setq element-content-type "sql" - part-close-tag "")) - ) - - (add-text-properties tbeg tend props) - (put-text-property tbeg (1+ tbeg) 'tag-beg flags) - (put-text-property (1- tend) tend 'tag-end t) - - (when (and part-close-tag - (web-mode-dom-sf part-close-tag reg-end t) - (setq part-beg tend) - (setq part-end (match-beginning 0)) - (> part-end part-beg)) - (put-text-property part-beg part-end 'part-side - (intern element-content-type web-mode-obarray)) - (setq tend part-end) - ) ;when - - (goto-char tend) - - ) ;while - - ))) - -;; FLAGS: tag -;; (1)attrs (2)custom (4)slash-beg (8)slash-end (16)bracket-end -;; (32)namespaced - -;; FLAGS: attr -;; (1)custom-attr (2)engine-attr (4)spread-attr[jsx] (8)code-value - -;; STATES: attr -;; (0)nil (1)space (2)name (3)space-before (4)equal (5)space-after -;; (6)value-uq (7)value-sq (8)value-dq (9)value-bq : jsx attr={} - -(defun web-mode-attr-skip (limit) - - (let ((tag-flags 0) (attr-flags 0) (continue t) (attrs 0) (counter 0) (brace-depth 0) - (pos-ori (point)) (state 0) (equal-offset 0) (go-back nil) - (is-jsx (or (string= web-mode-content-type "jsx") (eq (get-text-property (point) 'part-type) 'jsx))) - attr name-beg name-end val-beg char pos escaped spaced quoted) - - (while continue - - (setq pos (point) - char (char-after) - ;;spaced (eq char ?\s) - spaced (member char '(?\s ?\n)) - ) - - (when quoted (setq quoted (1+ quoted))) - - (cond - - ((>= pos limit) - (setq continue nil) - (setq go-back t) - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset))) - ) - - ((or (and (= state 8) (not (member char '(?\" ?\\)))) - (and (= state 7) (not (member char '(?\' ?\\)))) - (and (= state 9) (not (member char '(?} ?\\)))) - ) - (when (and (= state 9) (eq char ?\{)) - (setq brace-depth (1+ brace-depth))) - ) - - ((and (= state 9) (eq char ?\}) (> brace-depth 1)) - (setq brace-depth (1- brace-depth))) - - ((get-text-property pos 'block-side) - (when (= state 2) - (setq name-end pos)) - ) - - ((and (= state 2) is-jsx (eq char ?\}) (eq attr-flags 4)) - (setq name-end pos) - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset))) - (setq state 0 - attr-flags 0 - equal-offset 0 - name-beg nil - name-end nil - val-beg nil) - ) - - ((or (and (= state 8) (eq ?\" char) (not escaped)) - (and (= state 7) (eq ?\' char) (not escaped)) - (and (= state 9) (eq ?\} char) (= brace-depth 1)) - ) - - ;;(message "%S %S" (point) attr-flags) - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset))) - (setq state 0 - attr-flags 0 - equal-offset 0 - name-beg nil - name-end nil - val-beg nil) - ) - - ((and (member state '(4 5)) (member char '(?\' ?\" ?\{))) - (setq val-beg pos) - (setq quoted 1) - (setq state (cond ((eq ?\' char) 7) - ((eq ?\" char) 8) - (t 9))) - (when (= state 9) - (setq brace-depth 1)) - ) - - ((and (eq ?\= char) (member state '(2 3))) - (setq equal-offset (- pos name-beg) - name-end (1- pos)) - (setq state 4) - (setq attr (buffer-substring-no-properties name-beg (1+ name-end))) - (when (and web-mode-indentless-attributes (member (downcase attr) web-mode-indentless-attributes)) - ;;(message "onclick") - (setq attr-flags (logior attr-flags 8))) - ) - - ((and spaced (= state 0)) - (setq state 1) - ) - - ((and (eq char ?\<) (not (member state '(7 8 9)))) - (setq continue nil) - (setq go-back t) - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset))) - ) - - ((and (eq char ?\>) (not (member state '(7 8 9)))) - (setq tag-flags (logior tag-flags 16)) - (when (eq (char-before) ?\/) - (setq tag-flags (logior tag-flags 8)) - ) - (setq continue nil) - (when name-beg - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset)))) - ) - - ((and spaced (member state '(1 3 5))) - ) - - ((and spaced (= state 2)) - (setq state 3) - ) - - ((and (eq char ?\/) (member state '(4 5))) - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset))) - (setq state 1 - attr-flags 0 - equal-offset 0 - name-beg nil - name-end nil - val-beg nil) - ) - - ((and (eq char ?\/) (member state '(0 1))) - ) - - ((and spaced (= state 4)) - (setq state 5) - ) - - ((and (= state 3) - (or (and (>= char 97) (<= char 122)) ;a - z - (and (>= char 65) (<= char 90)) ;A - Z - (eq char ?\-))) - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset))) - (setq state 2 - attr-flags 0 - equal-offset 0 - name-beg pos - name-end pos - val-beg nil) - ) - - ((and (eq char ?\n) (not (member state '(7 8 9)))) - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset))) - (setq state 1 - attr-flags 0 - equal-offset 0 - name-beg nil - name-end nil - val-beg nil) - ) - - ((and (= state 6) (member char '(?\s ?\n ?\/))) - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset))) - (setq state 1 - attr-flags 0 - equal-offset 0 - name-beg nil - name-end nil - val-beg nil) - ) - - ((and quoted (= quoted 2) (member char '(?\s ?\n ?\>))) - (when (eq char ?\>) - (setq tag-flags (logior tag-flags 16)) - (setq continue nil)) - (setq state 6) - (setq attrs (+ attrs (web-mode-attr-scan state char name-beg name-end val-beg attr-flags equal-offset))) - (setq state 1 - attr-flags 0 - equal-offset 0 - name-beg nil - name-end nil - val-beg nil) - ) - - ((and (not spaced) (= state 1)) - (when (and is-jsx (eq char ?\{)) - (setq attr-flags 4)) - (setq state 2) - (setq name-beg pos - name-end pos) - ) - - ((member state '(4 5)) - (setq val-beg pos) - (setq state 6) - ) - - ((= state 1) - (setq state 2) - ) - - ;;((= state 2) - ((= state 2) - (setq name-end pos) - (when (and nil (= attr-flags 0) (member char '(?\- ?\:))) - (let (attr) - (setq attr (buffer-substring-no-properties name-beg (1+ name-end))) - (cond - ((member attr '("http-equiv")) - (setq attr-flags (1- attr-flags)) - ) - ;;((and web-mode-engine-attr-regexp - ;; (string-match-p web-mode-engine-attr-regexp attr)) - ;; (setq attr-flags (logior attr-flags 2)) - ;; ) - ((and (eq char ?\-) (not (string= attr "http-"))) - (setq attr-flags (logior attr-flags 1))) - ) ;cond - ) ;let - ) ;when attr-flags = 1 - ) ;state=2 - - ) ;cond - - ;;(message "point(%S) end(%S) state(%S) c(%S) name-beg(%S) name-end(%S) val-beg(%S) attr-flags(%S) equal-offset(%S)" pos end state char name-beg name-end val-beg attr-flags equal-offset) - - (when (and quoted (>= quoted 2)) - (setq quoted nil)) - - (setq escaped (eq ?\\ char)) - (when (null go-back) - (forward-char)) - - ) ;while - - (when (> attrs 0) (setq tag-flags (logior tag-flags 1))) - - tag-flags)) - -(defun web-mode-attr-scan (state char name-beg name-end val-beg flags equal-offset) - ;;(message "point(%S) state(%S) c(%c) name-beg(%S) name-end(%S) val-beg(%S) flags(%S) equal-offset(%S)" - ;; (point) state char name-beg name-end val-beg flags equal-offset) - (when (null flags) (setq flags 0)) - (when (and name-beg name-end web-mode-engine-attr-regexp) - (let (name) - (setq name (buffer-substring-no-properties name-beg (1+ name-end))) - ;;(message "%S" name) - (cond - ((string-match-p "^data[-]" name) - (setq flags (logior flags 1)) - ) - ((string-match-p web-mode-engine-attr-regexp name) - (setq flags (logior flags 2)) - ) - ) - ) ;name - ) - ;;(message "%S" name) - (cond - ((null name-beg) - ;; (message "name-beg is null (%S)" (point)) - 0) - ((or (and (= state 8) (not (eq ?\" char))) - (and (= state 7) (not (eq ?\' char)))) - (put-text-property name-beg (1+ name-beg) 'tag-attr-beg flags) - (put-text-property name-beg val-beg 'tag-attr t) - (put-text-property (1- val-beg) val-beg 'tag-attr-end equal-offset) - 1) - ((and (member state '(4 5)) (null val-beg)) - (put-text-property name-beg (1+ name-beg) 'tag-attr-beg flags) - (put-text-property name-beg (+ name-beg equal-offset 1) 'tag-attr t) - (put-text-property (+ name-beg equal-offset) (+ name-beg equal-offset 1) 'tag-attr-end equal-offset) - 1) - (t - (let (val-end) - (if (null val-beg) - (setq val-end name-end) - (setq val-end (point)) - (when (or (null char) (member char '(?\s ?\n ?\> ?\/))) - (setq val-end (1- val-end)) - ) - ) ;if - (put-text-property name-beg (1+ name-beg) 'tag-attr-beg flags) - (put-text-property name-beg (1+ val-end) 'tag-attr t) - (put-text-property val-end (1+ val-end) 'tag-attr-end equal-offset) - ) ;let - 1) ;t - ) ;cond - ) - -(defun web-mode-process-parts (reg-beg reg-end func) - (let ((i 0) (continue t) (part-beg reg-beg) (part-end nil)) - (while continue - (setq part-end nil) - (unless (get-text-property part-beg 'part-side) - (setq part-beg (web-mode-part-next-position part-beg))) - (when (and part-beg (< part-beg reg-end)) - (setq part-end (web-mode-part-end-position part-beg))) - (cond - ((> (setq i (1+ i)) 100) - (message "process-parts ** warning (%S) **" (point)) - (setq continue nil)) - ((or (null part-end) (> part-end reg-end)) - (setq continue nil)) - (t - (setq part-end (1+ part-end)) - (funcall func part-beg part-end) - (setq part-beg part-end)) - ) ;cond - ) ;while - )) - -(defun web-mode-part-scan (reg-beg reg-end &optional content-type depth) - (save-excursion - (let (token-re ch-before ch-at ch-next token-type beg continue) - ;;(message "%S %S" reg-beg reg-end) - (cond - (content-type - ) - ((member web-mode-content-type web-mode-part-content-types) - (setq content-type web-mode-content-type)) - (t - (setq content-type (symbol-name (get-text-property reg-beg 'part-side)))) - ) ;cond - - (goto-char reg-beg) - - (cond - ((member content-type '("javascript" "json")) - (setq token-re "/\\|\"\\|'\\|`")) - ((member content-type '("jsx")) - (setq token-re "/\\|\"\\|'\\|`\\|]")) - ((string= web-mode-content-type "css") - (setq token-re "\"\\|'\\|/\\*\\|//")) - ((string= content-type "css") - (setq token-re "\"\\|'\\|/\\*")) - (t - (setq token-re "/\\*\\|\"\\|'")) - ) - - (while (and token-re (< (point) reg-end) (web-mode-dom-rsf token-re reg-end t)) - - (setq beg (match-beginning 0) - token-type nil - continue t - ch-at (char-after beg) - ch-next (or (char-after (1+ beg)) ?\d) - ch-before (or (char-before beg) ?\d)) - - ;;(message "[%S>%S|%S] %S %c %c %c" reg-beg reg-end depth beg ch-before ch-at ch-next) - - (cond - - ((eq ?\' ch-at) - (while (and continue (search-forward "'" reg-end t)) - (cond - ((get-text-property (1- (point)) 'block-side) - (setq continue t)) - (t - (setq continue (web-mode-string-continue-p reg-beg))) - ) - ) ;while - (setq token-type 'string)) - - ((eq ?\` ch-at) - (while (and continue (search-forward "`" reg-end t)) - (cond - ((get-text-property (1- (point)) 'block-side) - (setq continue t)) - (t - (setq continue (web-mode-string-continue-p reg-beg))) - ) - ) ;while - (setq token-type 'string)) - - ((eq ?\" ch-at) - (while (and continue (search-forward "\"" reg-end t)) - (cond - ((get-text-property (1- (point)) 'block-side) - (setq continue t)) - (t - (setq continue (web-mode-string-continue-p reg-beg))) - ) ;cond - ) ;while - (cond - ((string= content-type "json") - (if (looking-at-p "[ ]*:") - (cond - ((eq ?\@ (char-after (1+ beg))) - (setq token-type 'context)) - (t - (setq token-type 'key)) - ) - (setq token-type 'string)) - ) ;json - (t - (setq token-type 'string)) - ) ;cond - ) - - ((and (eq ?\< ch-at) - (not (or (and (>= ch-before 97) (<= ch-before 122)) - (and (>= ch-before 65) (<= ch-before 90))))) - ;;(message "before [%S>%S|%S] pt=%S" reg-beg reg-end depth (point)) - (search-backward "<") - (if (web-mode-jsx-skip reg-end) - (web-mode-jsx-scan-element beg (point) depth) - (forward-char)) - ;;(message "after [%S>%S|%S] pt=%S" reg-beg reg-end depth (point)) - ) - - ((and (eq ?\/ ch-at) (member content-type '("javascript" "jsx"))) - (cond - ((eq ?\\ ch-before) - ) - ((eq ?\* ch-next) - ;;(message "--> %S %S" (point) reg-end) - (when (search-forward "*/" reg-end t) - (setq token-type 'comment)) - ) - ((eq ?\/ ch-next) - (setq token-type 'comment) - (goto-char (if (< reg-end (line-end-position)) reg-end (line-end-position))) - ) - ((and (looking-at-p ".*/") - (looking-back "\\(^\\|case\\|[[(,=:!&|?{};]\\)[ ]*/" (point-min))) - ;;(re-search-forward "/[gimyu]*" reg-end t)) - (let ((eol (line-end-position))) - (while (and continue (search-forward "/" eol t)) - (cond - ((get-text-property (1- (point)) 'block-side) - (setq continue t)) - ((looking-back "\\\\+/" reg-beg t) - (setq continue (= (mod (- (point) (match-beginning 0)) 2) 0))) - (t - (re-search-forward "[gimyu]*" eol t) - (setq token-type 'string) - (setq continue nil)) - ) - ) ;while - ) ;let - ) - ) ;cond - ) - - ((eq ?\/ ch-next) - ;;(message "%S" (point)) - (cond - ((and (string= content-type "css") - (eq ?/ ch-at) - (eq ?: ch-before)) - ) - (t - (unless (eq ?\\ ch-before) - (setq token-type 'comment) - (goto-char (if (< reg-end (line-end-position)) reg-end (line-end-position))) - ) - ) - ) - - ) - - ((eq ?\* ch-next) - (cond - ((search-forward "*/" reg-end t) - (setq token-type 'comment)) - ((not (eobp)) - (forward-char)) - ) ;cond - ) - - ) ;cond - - (when (and beg (>= reg-end (point)) token-type) - (put-text-property beg (point) 'part-token token-type) - (cond - ((eq token-type 'comment) - (put-text-property beg (1+ beg) 'syntax-table (string-to-syntax "<")) - (when (< (point) (point-max)) - (if (< (point) (line-end-position)) - (put-text-property (1- (point)) (point) 'syntax-table (string-to-syntax ">")) ;#445 - (put-text-property (point) (1+ (point)) 'syntax-table (string-to-syntax ">")) ;#377 - ) - ) ;when - ) ;comment - ((eq token-type 'string) - (put-text-property beg (1+ beg) 'syntax-table (string-to-syntax "|")) - (when (< (point) (point-max)) - (if (< (point) (line-end-position)) - (put-text-property (1- (point)) (point) 'syntax-table (string-to-syntax "|")) - (put-text-property (point) (1+ (point)) 'syntax-table (string-to-syntax "|")) - ) - ) ;when - ) ;string - ) ;cond - ) ;when - - (when (> (point) reg-end) - (message "reg-beg(%S) reg-end(%S) token-type(%S) point(%S)" reg-beg reg-end token-type (point))) - - ;;(message "#[%S>%S|%S] %S %c %c %c | (%S)" reg-beg reg-end depth beg ch-before ch-at ch-next (point)) - - ) ;while - - ))) - -(defun web-mode-string-continue-p (reg-beg) - "Is `point' preceeded by an odd number of backslashes?" - (let ((p (1- (point)))) - (while (and (< reg-beg p) (eq ?\\ (char-before p))) - (setq p (1- p))) - (= (mod (- (point) p) 2) 0))) - -(defun web-mode-jsx-skip (reg-end) - (let ((continue t) (pos nil) (i 0) tag) - (looking-at "<\\([[:alpha:]][[:alnum:]:-]*\\)") - (setq tag (match-string-no-properties 1)) - ;;(message "point=%S tag=%S" (point) tag) - (save-excursion - (while continue - (cond - ((> (setq i (1+ i)) 1000) - (message "jsx-skip ** warning **") - (setq continue nil)) - ((looking-at "<[[:alpha:]][[:alnum:]:-]*[ ]*/>") - (goto-char (match-end 0)) - (setq pos (point)) - (setq continue nil)) - ((not (web-mode-dom-rsf ">\\([ \t\n]*[\];,)':}|&]\\)\\|{" reg-end)) - (setq continue nil) - ) - ((eq (char-before) ?\{) - (backward-char) - (web-mode-closing-paren reg-end) - (forward-char) - ) - (t - (setq continue nil) - (setq pos (match-beginning 1)) - ) ;t - ) ;cond - ) ;while - ) ;save-excursion - (when pos (goto-char pos)) - ;;(message "jsx-skip: %S" pos) - pos)) - -;; (defun web-mode-jsx-skip2 (reg-end) -;; (let ((continue t) (pos nil) (i 0) (tag nil) (regexp nil) (counter 1)) -;; (looking-at "<\\([[:alpha:]][[:alnum:]:-]*\\)") -;; (setq tag (match-string-no-properties 1)) -;; (setq regexp (concat " (setq i (1+ i)) 100) -;; (message "jsx-skip ** warning **") -;; (setq continue nil)) -;; ((looking-at "<[[:alpha:]][[:alnum:]:-]*[ ]*/>") -;; (goto-char (match-end 0)) -;; (setq pos (point)) -;; (setq continue nil)) -;; ((not (web-mode-dom-rsf ">\\([ \t\n]*[\];,)':}]\\)\\|{" reg-end)) -;; (setq continue nil) -;; ) -;; ((eq (char-before) ?\{) -;; (backward-char) -;; (web-mode-closing-paren reg-end) -;; (forward-char) -;; ) -;; (t -;; (setq continue nil) -;; (setq pos (match-beginning 1)) -;; ) ;t -;; ) ;cond -;; ) ;while -;; ) ;save-excursion -;; (when pos (goto-char pos)) -;; ;;(message "jsx-skip: %S" pos) -;; pos)) - -;; http://facebook.github.io/jsx/ -;; https://github.com/facebook/jsx/blob/master/AST.md -(defun web-mode-jsx-scan-element (reg-beg reg-end depth) - (unless depth (setq depth 1)) - (save-excursion - (let (token-beg token-end regexp) - (goto-char reg-beg) - (put-text-property reg-beg (1+ reg-beg) 'jsx-beg depth) - (put-text-property (1- reg-end) reg-end 'jsx-end depth) - (put-text-property reg-beg reg-end 'jsx-depth depth) - (goto-char reg-beg) - (web-mode-scan-elements reg-beg reg-end) - (web-mode-jsx-scan-expression reg-beg reg-end (1+ depth)) - ))) - -(defun web-mode-jsx-scan-expression (reg-beg reg-end depth) - (let ((continue t) beg end) - (save-excursion - (goto-char reg-beg) - ;;(message "reg-beg=%S reg-end=%S" reg-beg reg-end) - (while (and continue (search-forward "{" reg-end t)) - (backward-char) - (setq beg (point) - end (web-mode-closing-paren reg-end)) - (cond - ((eq (get-text-property beg 'part-token) 'comment) - (forward-char)) - ((not end) - (setq continue nil)) - (t - (setq end (1+ end)) - (put-text-property beg end 'jsx-depth depth) - (put-text-property beg (1+ beg) 'jsx-beg depth) - (put-text-property (1- end) end 'jsx-end depth) - (web-mode-part-scan beg end "jsx" (1+ depth)) - ) ;t - ) ;cond - ) ;while - ) ;save-excursion - )) - -(defun web-mode-jsx-is-html (&optional pos) - (interactive) - (unless pos (setq pos (point))) - (let (ret (depth (get-text-property pos 'jsx-depth))) - (cond - ((or (null depth) (<= pos 2)) - (setq pos nil)) - ((and (= depth 1) (get-text-property pos 'jsx-beg)) - (setq pos nil)) - ((get-text-property pos 'tag-end) - (setq pos nil)) - ((get-text-property pos 'tag-attr-beg) - (setq pos nil)) - ((get-text-property pos 'jsx-beg) - (setq pos (null (get-text-property pos 'tag-beg)))) - ((setq pos (web-mode-jsx-depth-beginning-position pos)) - (setq pos (not (null (get-text-property pos 'tag-beg))))) - (t - (setq pos nil)) - ) ;cond - ;;(message "is-html: %S (depth=%S)" pos depth) - pos)) - -(defun web-mode-jsx-is-expr (&optional pos) - (cond - ((and (get-text-property pos 'jsx-beg) - (not (get-text-property pos 'tag-beg))) - nil) - (t - (setq pos (web-mode-jsx-depth-beginning-position pos)) - (null (get-text-property pos 'tag-beg))) - ) ;cond - ) - -(defun web-mode-jsx-depth-beginning-position (&optional pos target-depth) - (interactive) - (unless pos (setq pos (point))) - (unless target-depth (setq target-depth (get-text-property pos 'jsx-depth))) - (cond - ((or (null target-depth) (bobp)) - (setq pos nil)) - ((and (get-text-property pos 'jsx-beg) (= target-depth (get-text-property pos 'jsx-depth))) - ) - (t - (let ((continue t) depth) - (while continue - (setq pos (previous-single-property-change pos 'jsx-depth)) - (cond - ((or (null pos) - (null (setq depth (get-text-property pos 'jsx-depth)))) - (setq continue nil - pos nil)) - ((and (get-text-property pos 'jsx-beg) (= target-depth depth)) - (setq continue nil)) - ) ;cond - ) ;while - ) ;let - ) ;t - ) ;cond - ;;(message "beg: %S" pos) - pos) - -(defun web-mode-jsx-element-next (reg-end) - (let (continue beg end) - (setq beg (point)) - (unless (get-text-property beg 'jsx-depth) - (setq beg (next-single-property-change beg 'jsx-beg))) - (setq continue (and beg (< beg reg-end)) - end beg) - (while continue - (setq end (next-single-property-change end 'jsx-end)) - (cond - ((or (null end) (> end reg-end)) - (setq continue nil - end nil)) - ((eq (get-text-property end 'jsx-depth) 1) - (setq continue nil)) - (t - (setq end (1+ end))) - ) ;cond - ) ;while - ;;(message "beg=%S end=%S" beg end) - (if (and beg end (< beg end)) (cons beg end) nil))) - -(defun web-mode-jsx-expression-next (reg-end) - (let (beg end depth continue pos) - (setq beg (point)) - ;;(message "pt=%S" beg) - (unless (and (get-text-property beg 'jsx-beg) (null (get-text-property beg 'tag-beg))) - ;;(setq beg (next-single-property-change beg 'jsx-beg)) - (setq continue t - pos (1+ beg)) - (while continue - (setq pos (next-single-property-change pos 'jsx-beg)) - (cond - ((null pos) - (setq continue nil - beg nil)) - ((> pos reg-end) - (setq continue nil - beg nil)) - ((null (get-text-property pos 'jsx-beg)) - ) - ((null (get-text-property pos 'tag-beg)) - (setq continue nil - beg pos)) - ;;(t - ;; (setq pos (1+ pos))) - ) ;cond - ) ;while - ) ;unless - ;;(message "beg=%S" beg) - (when (and beg (< beg reg-end)) - (setq depth (get-text-property beg 'jsx-beg) - continue (not (null depth)) - pos beg) - ;;(message "beg=%S" beg) - (while continue - (setq pos (next-single-property-change pos 'jsx-end)) - ;;(message "pos=%S" pos) - (cond - ((null pos) - (setq continue nil)) - ((> pos reg-end) - (setq continue nil)) - ((eq depth (get-text-property pos 'jsx-end)) - (setq continue nil - end pos)) - (t - ;;(setq pos (1+ pos)) - ) - ) ;cond - ) ;while - ) ;when - ;;(message "%S > %S" beg end) - (if (and beg end) (cons beg end) nil))) - -(defun web-mode-jsx-depth-next (reg-end) - (let (beg end depth continue pos) - (setq beg (point)) - ;;(message "pt=%S" beg) - (unless (get-text-property beg 'jsx-beg) - ;;(setq beg (next-single-property-change beg 'jsx-beg)) - ;;(setq pos (1+ beg)) - (setq pos (next-single-property-change (1+ beg) 'jsx-beg)) - (cond - ((null pos) - (setq beg nil)) - ((>= pos reg-end) - (setq beg nil)) - (t - (setq beg pos)) - ) ;cond - ) ;unless - ;;(message "beg=%S" beg) - (when beg - (setq depth (get-text-property beg 'jsx-beg) - continue (not (null depth)) - pos beg) - ;;(message "beg=%S" beg) - (while continue - (setq pos (next-single-property-change pos 'jsx-end)) - ;;(message "pos=%S" pos) - (cond - ((null pos) - (setq continue nil)) - ((> pos reg-end) - (setq continue nil)) - ((eq depth (get-text-property pos 'jsx-end)) - (setq continue nil - end pos)) - (t - ;;(setq pos (1+ pos)) - ) - ) ;cond - ) ;while - ) ;when - ;;(message "%S > %S" beg end) - (if (and beg end) (cons beg end) nil))) - -(defun web-mode-jsx-beginning () - (interactive) - (let (depth (continue t) (reg-beg (point-min)) (pos (point))) - (setq depth (get-text-property pos 'jsx-depth)) - (cond - ((not depth) - ) - ((get-text-property (1- pos) 'jsx-beg) - (goto-char (1- pos))) - (t - (while continue - (setq pos (previous-single-property-change pos 'jsx-beg)) - ;;(message "pos=%S" pos) - (cond - ((null pos) - (setq continue nil)) - ((<= pos reg-beg) - (setq continue nil)) - ((eq depth (get-text-property pos 'jsx-beg)) - (setq continue nil)) - ) ;cond - ) ;while - (web-mode-go pos) - ) ;t - ) ;cond - )) - -(defun web-mode-jsx-end () - (interactive) - (let (depth (continue t) (reg-end (point-max)) (pos (point))) - (setq depth (get-text-property pos 'jsx-depth)) - (cond - ((not depth) - ) - ((get-text-property pos 'jsx-end) - (goto-char (+ pos 1))) - (t - (while continue - (setq pos (next-single-property-change pos 'jsx-end)) - ;;(message "pos=%S" pos) - (cond - ((null pos) - (setq continue nil)) - ((> pos reg-end) - (setq continue nil)) - ((eq depth (get-text-property pos 'jsx-end)) - (setq continue nil)) - ) ;cond - ) ;while - (web-mode-go pos 1) - ) ;t - ) ;cond - )) - -;; css rule = selector(s) + declaration (properties) -(defun web-mode-css-rule-next (limit) - (let (at-rule var-rule sel-beg sel-end dec-beg dec-end chunk) - (skip-chars-forward "\n\t ") - (setq sel-beg (point)) - (when (and (< (point) limit) - (web-mode-part-rsf "[{;]" limit)) - (setq sel-end (1- (point))) - (cond - ((eq (char-before) ?\{) - (setq dec-beg (point)) - (setq dec-end (web-mode-closing-paren-position (1- dec-beg) limit)) - (if dec-end - (progn - (goto-char dec-end) - (forward-char)) - (setq dec-end limit) - (goto-char limit)) - ) - (t - ) - ) ;cond - (setq chunk (buffer-substring-no-properties sel-beg sel-end)) - (cond - ((string-match "@\\([[:alpha:]-]+\\)" chunk) - (setq at-rule (match-string-no-properties 1 chunk))) - ((string-match "\\$\\([[:alpha:]-]+\\)" chunk) - (setq var-rule (match-string-no-properties 1 chunk))) - ) ;cond - ) ;when - (if (not sel-end) - (progn (goto-char limit) nil) - (list :at-rule at-rule - :var-rule var-rule - :sel-beg sel-beg - :sel-end sel-end - :dec-beg dec-beg - :dec-end dec-end) - ) ;if - )) - -(defun web-mode-css-rule-current (&optional pos part-beg part-end) - "Current CSS rule boundaries." - (unless pos (setq pos (point))) - (unless part-beg (setq part-beg (web-mode-part-beginning-position pos))) - (unless part-end (setq part-end (web-mode-part-end-position pos))) - (save-excursion - (let (beg end) - (goto-char pos) - (if (not (web-mode-part-sb "{" part-beg)) - (progn - (setq beg part-beg) - (if (web-mode-part-sf ";" part-end) - (setq end (1+ (point))) - (setq end part-end)) - ) ;progn - (setq beg (point)) - (setq end (web-mode-closing-paren-position beg part-end)) - (if end - (setq end (1+ end)) - (setq end (line-end-position))) -;; (message "%S >>beg%S >>end%S" pos beg end) - (if (> pos end) - - ;;selectors - (progn - (goto-char pos) - (if (web-mode-part-rsb "[};]" part-beg) - (setq beg (1+ (point))) - (setq beg part-beg) - ) ;if - (goto-char pos) - (if (web-mode-part-rsf "[{;]" part-end) - (cond - ((eq (char-before) ?\;) - (setq end (point)) - ) - (t - (setq end (web-mode-closing-paren-position (1- (point)) part-end)) - (if end - (setq end (1+ end)) - (setq end part-end)) - ) - ) ;cond - (setq end part-end) - ) - ) ;progn selectors - - ;; declaration - (goto-char beg) - (if (web-mode-part-rsb "[}{;]" part-beg) - (setq beg (1+ (point))) - (setq beg part-beg) - ) ;if - ) ;if > pos end - ) -;; (message "beg(%S) end(%S)" beg end) - (when (eq (char-after beg) ?\n) - (setq beg (1+ beg))) - (cons beg end) - ))) - -(defun web-mode-scan-engine-comments (reg-beg reg-end tag-start tag-end) - "Scan engine comments (mako, django)." - (save-excursion - (let (beg end (continue t)) - (goto-char reg-beg) - (while (and continue - (< (point) reg-end) - (re-search-forward tag-start reg-end t)) - (goto-char (match-beginning 0)) - (setq beg (point)) - (if (not (re-search-forward tag-end reg-end t)) - (setq continue nil) - (setq end (point)) - (remove-list-of-text-properties beg end web-mode-scan-properties) - (add-text-properties beg end '(block-side t block-token comment)) - (put-text-property beg (1+ beg) 'block-beg 0) - (put-text-property (1- end) end 'block-end t) - ) ;if - ) ;while - ))) - -(defun web-mode-propertize (&optional beg end) - (unless beg (setq beg web-mode-change-beg)) - (unless end (setq end web-mode-change-end)) - ;;(message "%S %S" web-mode-content-type (get-text-property beg 'part-side)) - ;;(message "propertize: beg(%S) end(%S)" web-mode-change-beg web-mode-change-end) - ;;(message "%S %S" (get-text-property beg 'part-side) (get-text-property end 'part-side)) - (when (and end (> end (point-max))) - (setq end (point-max))) - ;;(message "propertize: reset web-mode-change-beg|end") - (setq web-mode-change-beg nil - web-mode-change-end nil) - (cond - ((or (null beg) (null end)) - nil) - ((and (member web-mode-engine '("php" "asp")) - (get-text-property beg 'block-side) - (get-text-property end 'block-side) - (> beg (point-min)) - (not (eq (get-text-property (1- beg) 'block-token) 'delimiter-beg)) - (not (eq (get-text-property end 'block-token) 'delimiter-end))) - ;;(message "invalidate block") - (web-mode-invalidate-block-region beg end)) - ((and (or (member web-mode-content-type '("css" "jsx" "javascript")) - (and (get-text-property beg 'part-side) - (get-text-property end 'part-side) - (> beg (point-min)) - (get-text-property (1- beg) 'part-side)) - )) - ;;(message "invalidate part (%S > %S)" beg end) - (web-mode-invalidate-part-region beg end)) - (t - ;;(message "invalidate default (%S > %S)" beg end) - (web-mode-invalidate-region beg end)) - ) ;cond - ) - -;; NOTE: il est important d'identifier des caractères en fin de ligne -;; web-mode-block-tokenize travaille en effet sur les fins de lignes pour -;; les commentaires de type // -(defun web-mode-invalidate-block-region (pos-beg pos-end) - ;; (message "pos-beg(%S) pos-end(%S)" pos-beg pos-end) - (save-excursion - (let (beg end code-beg code-end) - ;;(message "invalidate-block-region: pos-beg(%S)=%S" pos-beg (get-text-property pos 'block-side)) - ;;(message "code-beg(%S) code-end(%S) pos-beg(%S) pos-end(%S)" code-beg code-end pos-beg pos-end) - (cond - ((not (and (setq code-beg (web-mode-block-code-beginning-position pos-beg)) - (setq code-end (web-mode-block-code-end-position pos-beg)) - (>= pos-beg code-beg) - (<= pos-end code-end) - (> code-end code-beg))) - (web-mode-invalidate-region pos-beg pos-end)) - ((member web-mode-engine '("asp")) - (goto-char pos-beg) - (forward-line -1) - (setq beg (line-beginning-position)) - (when (> code-beg beg) - (setq beg code-beg)) - (goto-char pos-beg) - (forward-line) - (setq end (line-end-position)) - (when (< code-end end) - (setq end code-end)) - ;; ?? pas de (web-mode-block-tokenize beg end) ? - (cons beg end) - ) ;asp - (t - (goto-char pos-beg) - (when (string= web-mode-engine "php") - (cond - ((and (looking-back "\*" (point-min)) - (looking-at-p "/")) - (search-backward "/*" code-beg)) - ) ;cond - ) - (if (web-mode-block-rsb "[;{}(][ ]*\n" code-beg) - (setq beg (match-end 0)) - (setq beg code-beg)) - (goto-char pos-end) - (if (web-mode-block-rsf "[;{})][ ]*\n" code-end) - (setq end (1- (match-end 0))) - (setq end code-end)) - (web-mode-block-tokenize beg end) - ;;(message "beg(%S) end(%S)" beg end) - (cons beg end) - ) - ) ;cond - ))) - -(defun web-mode-invalidate-part-region (pos-beg pos-end) - (save-excursion - (let (beg end part-beg part-end language) - (if (member web-mode-content-type web-mode-part-content-types) - (setq language web-mode-content-type) - (setq language (symbol-name (get-text-property pos-beg 'part-side)))) - (setq part-beg (web-mode-part-beginning-position pos-beg) - part-end (web-mode-part-end-position pos-beg)) - ;;(message "language(%S) pos-beg(%S) pos-end(%S) part-beg(%S) part-end(%S)" - ;; language pos-beg pos-end part-beg part-end) - (goto-char pos-beg) - (cond - ((not (and part-beg part-end - (>= pos-beg part-beg) - (<= pos-end part-end) - (> part-end part-beg))) - (web-mode-invalidate-region pos-beg pos-end)) - ((member language '("javascript" "json" "jsx")) - (if (web-mode-javascript-rsb "[;{}(][ ]*\n" part-beg) - (setq beg (match-end 0)) - (setq beg part-beg)) - (goto-char pos-end) - (if (web-mode-javascript-rsf "[;{})][ ]*\n" part-end) - (setq end (match-end 0)) - (setq end part-end)) - (web-mode-scan-region beg end language)) - ((string= language "css") - (let (rule1 rule2) - (setq rule1 (web-mode-css-rule-current pos-beg)) - (setq rule2 rule1) - (when (> pos-end (cdr rule1)) - (setq rule2 (web-mode-css-rule-current pos-end))) - (setq beg (car rule1) - end (cdr rule2)) - ) - (web-mode-scan-region beg end language)) - (t - (setq beg part-beg - end part-end) - (web-mode-scan-region beg end language)) - ) ;cond - ))) - -(defun web-mode-invalidate-region (reg-beg reg-end) - ;;(message "%S | reg-beg(%S) reg-end(%S)" (point) reg-beg reg-end) - (setq reg-beg (web-mode-invalidate-region-beginning-position reg-beg) - reg-end (web-mode-invalidate-region-end-position reg-end)) - ;;(message "invalidate-region: reg-beg(%S) reg-end(%S)" reg-beg reg-end) - (web-mode-scan-region reg-beg reg-end)) - -(defun web-mode-invalidate-region-beginning-position (pos) - (save-excursion - (goto-char pos) - (when (and (bolp) (not (bobp))) - (backward-char)) - (beginning-of-line) - ;;(message "pos=%S %S" (point) (text-properties-at (point))) - (setq pos (point-min)) - (let ((continue (not (bobp)))) - (while continue - (cond - ((bobp) - (setq continue nil)) - ;; NOTE: Going back to the previous start tag is necessary - ;; when inserting a part endtag (e.g. ). - ;; Indeed, parts must be identified asap. - ((and (progn (back-to-indentation) t) - (get-text-property (point) 'tag-beg) - (eq (get-text-property (point) 'tag-type) 'start)) - (setq pos (point) - continue nil)) - (t - (forward-line -1)) - ) ;cond - ) ;while - ;;(message "pos=%S" pos) - pos))) - -(defun web-mode-invalidate-region-end-position (pos) - (save-excursion - (goto-char pos) - ;;(message "pos=%S %S" pos (get-text-property pos 'block-token)) - (when (string= web-mode-engine "jsp") - (cond - ((and (looking-back "<%" (point-min)) - (looking-at-p "--")) - (search-forward "--%>")) - ((and (looking-back "-- %" (point-min)) - (looking-at-p ">")) - (search-forward "--%>")) - ) ;cond - ) ;when - (setq pos (point-max)) - (let ((continue (not (eobp)))) - (while continue - (end-of-line) - ;;(message "%S %S" (point) (get-text-property (point) 'block-token)) - (cond - ((eobp) - (setq continue nil)) - ((and (not (get-text-property (point) 'tag-type)) - (not (get-text-property (point) 'part-side)) - (not (get-text-property (point) 'block-side))) - (setq pos (point) - continue nil)) - (t - (forward-line)) - ) ;cond - ) ;while - pos))) - -(defun web-mode-buffer-scan () - "Scan entine buffer." - (interactive) - (web-mode-scan-region (point-min) (point-max))) - -;;---- FONTIFICATION ----------------------------------------------------------- - -;; 1/ after-change -;; 2/ extend-region -;; 3/ propertize -;; 4/ font-lock-highlight -;; 5/ highlight-region -;; 6/ post-command - -(defun web-mode-font-lock-highlight (limit) - ;;(message "font-lock-highlight: point(%S) limit(%S) change-beg(%S) change-end(%S)" (point) limit web-mode-change-beg web-mode-change-end) - (cond - (web-mode-fontification-off - nil) - (t - (web-mode-highlight-region (point) limit) - nil) - )) - -(defun web-mode-buffer-highlight () - (interactive) - (cond - ((and (fboundp 'font-lock-flush) global-font-lock-mode) - (font-lock-flush) - (font-lock-ensure)) - (t ;emacs 24 - ;;(font-lock-fontify-buffer) - (and global-font-lock-mode - (font-lock-fontify-region (point-min) (point-max)))) - ) ;cond - ) - -(defun web-mode-extend-region () - ;;(message "extend-region: flb(%S) fle(%S) wmcb(%S) wmce(%S)" font-lock-beg font-lock-end web-mode-change-beg web-mode-change-end) - (cond - (web-mode-fontification-off - nil) - (t - (when (or (null web-mode-change-beg) (< font-lock-beg web-mode-change-beg)) - ;;(message "font-lock-beg(%S) < web-mode-change-beg(%S)" font-lock-beg web-mode-change-beg) - (setq web-mode-change-beg font-lock-beg)) - (when (or (null web-mode-change-end) (> font-lock-end web-mode-change-end)) - ;;(message "font-lock-end(%S) > web-mode-change-end(%S)" font-lock-end web-mode-change-end) - (setq web-mode-change-end font-lock-end)) - (let ((region (web-mode-propertize web-mode-change-beg web-mode-change-end))) - (when region - ;;(message "region: %S" region) - (setq font-lock-beg (car region) - font-lock-end (cdr region)) - ) ;when - ) ;let - nil) ;t - )) - -(defun web-mode-unfontify-region (beg end) - ;;(message "unfontify: %S %S" beg end) - ) - -(defun web-mode-highlight-region (&optional beg end) - ;;(message "highlight-region: beg(%S) end(%S)" beg end) - (web-mode-with-silent-modifications - (save-excursion - (save-restriction - (save-match-data - (let ((buffer-undo-list t) - (inhibit-point-motion-hooks t) - (inhibit-quit t)) - ;;(message "web-mode-highlight-region=%S" (point)) - (remove-list-of-text-properties beg end '(font-lock-face face)) - (cond - ((and (get-text-property beg 'block-side) - (not (get-text-property beg 'block-beg))) - (web-mode-block-highlight beg end)) - ((or (member web-mode-content-type web-mode-part-content-types) - (get-text-property beg 'part-side)) - (web-mode-part-highlight beg end) - (web-mode-process-blocks beg end 'web-mode-block-highlight)) - ((string= web-mode-engine "none") - (web-mode-highlight-tags beg end) - (web-mode-process-parts beg end 'web-mode-part-highlight)) - (t - (web-mode-highlight-tags beg end) - (web-mode-process-parts beg end 'web-mode-part-highlight) - (web-mode-process-blocks beg end 'web-mode-block-highlight)) - ) ;cond - (when web-mode-enable-element-content-fontification - (web-mode-highlight-elements beg end)) - (when web-mode-enable-whitespace-fontification - (web-mode-highlight-whitespaces beg end)) - ) ;let - ))))) - -(defun web-mode-highlight-tags (reg-beg reg-end &optional depth) - (let ((continue t)) - (goto-char reg-beg) - (when (and (not (get-text-property (point) 'tag-beg)) - (not (web-mode-tag-next))) - (setq continue nil)) - (when (and continue (>= (point) reg-end)) - (setq continue nil)) - (while continue - (cond - (depth - (when (eq depth (get-text-property (point) 'jsx-depth)) - (web-mode-tag-highlight)) - ) - (t - (web-mode-tag-highlight)) - ) ;cond - (when (or (not (web-mode-tag-next)) - (>= (point) reg-end)) - (setq continue nil)) - ) ;while - (when web-mode-enable-inlays - (when (null web-mode-inlay-regexp) - (setq web-mode-inlay-regexp (regexp-opt '("\\[" "\\(" "\\begin{align}")))) - (let (beg end expr) - (goto-char reg-beg) - (while (web-mode-dom-rsf web-mode-inlay-regexp reg-end) - (setq beg (match-beginning 0) - end nil - expr (substring (match-string-no-properties 0) 0 2)) - (setq expr (cond - ((string= expr "\\[") "\\]") - ((string= expr "\\(") "\\)") - (t "\\end{align}"))) - (when (and (web-mode-dom-sf expr reg-end) - (setq end (match-end 0)) - (not (text-property-any beg end 'tag-end t))) - (font-lock-append-text-property beg end 'font-lock-face 'web-mode-inlay-face) - ) ;when - ) ;while - ) ;let - ) ;when - (when web-mode-enable-html-entities-fontification - (let (beg end) - (goto-char reg-beg) - (while (web-mode-dom-rsf "&\\([#]?[[:alnum:]]\\{2,8\\}\\);" reg-end) - (setq beg (match-beginning 0) - end (match-end 0)) - (when (not (text-property-any beg end 'tag-end t)) - (font-lock-append-text-property beg end 'font-lock-face 'web-mode-html-entity-face) - ) ;when - ) ;while - ) ;let - ) ;when - )) - -(defun web-mode-tag-highlight (&optional beg end) - (unless beg (setq beg (point))) - (unless end (setq end (1+ (web-mode-tag-end-position beg)))) - (let (name type face flags slash-beg slash-end bracket-end) - (setq flags (get-text-property beg 'tag-beg) - type (get-text-property beg 'tag-type) - name (get-text-property beg 'tag-name)) - (setq bracket-end (> (logand flags 16) 0)) - (cond - ((eq type 'comment) - (put-text-property beg end 'font-lock-face 'web-mode-comment-face) - (when (and web-mode-enable-comment-interpolation (> (- end beg) 5)) - (web-mode-interpolate-comment beg end nil))) - ((eq type 'cdata) - (put-text-property beg end 'font-lock-face 'web-mode-doctype-face)) - ((eq type 'doctype) - (put-text-property beg end 'font-lock-face 'web-mode-doctype-face)) - ((eq type 'declaration) - (put-text-property beg end 'font-lock-face 'web-mode-doctype-face)) - (name - (setq slash-beg (> (logand flags 4) 0) - slash-end (> (logand flags 8) 0) - bracket-end (> (logand flags 16) 0)) - (setq face (cond - ((not bracket-end) 'web-mode-html-tag-unclosed-face) - ((and web-mode-enable-element-tag-fontification - (setq face (cdr (assoc name web-mode-element-tag-faces)))) - face) - ((> (logand flags 32) 0) 'web-mode-html-tag-namespaced-face) - ((> (logand flags 2) 0) 'web-mode-html-tag-custom-face) - (t 'web-mode-html-tag-face))) - (put-text-property beg (+ beg (if slash-beg 2 1)) - 'font-lock-face 'web-mode-html-tag-bracket-face) - (unless (string= name "_fragment_") - (put-text-property (+ beg (if slash-beg 2 1)) - (+ beg (if slash-beg 2 1) (length name)) - 'font-lock-face face)) - (when (or slash-end bracket-end) - (put-text-property (- end (if slash-end 2 1)) end 'font-lock-face 'web-mode-html-tag-bracket-face) - ) ;when - (when (> (logand flags 1) 0) - ;;(message "%S>%S" beg end) - (web-mode-highlight-attrs beg end)) - ) ;case name - ) ;cond - )) - -(defun web-mode-highlight-attrs (reg-beg reg-end) - (let ((continue t) (pos reg-beg) beg end flags offset face) - ;;(message "highlight-attrs %S>%S" reg-beg reg-end) - (while continue - (setq beg (web-mode-attribute-next-position pos reg-end)) - (cond - ((or (null beg) (>= beg reg-end)) - (setq continue nil)) - (t - (setq flags (or (get-text-property beg 'tag-attr-beg) 0)) - (setq face (cond - ((= (logand flags 1) 1) 'web-mode-html-attr-custom-face) - ((= (logand flags 2) 2) 'web-mode-html-attr-engine-face) - ((= (logand flags 4) 4) nil) - (t 'web-mode-html-attr-name-face))) - ;;(setq end (if (get-text-property beg 'tag-attr-end) beg (web-mode-attribute-end-position beg))) - (setq end (web-mode-attribute-end-position beg)) - ;;(message "beg=%S end=%S" beg end) - (cond - ((or (null end) (>= end reg-end)) - (setq continue nil)) - (t - (setq offset (get-text-property end 'tag-attr-end)) - (if (= offset 0) - (put-text-property beg (1+ end) 'font-lock-face face) - (put-text-property beg (+ beg offset) 'font-lock-face face) - (put-text-property (+ beg offset) (+ beg offset 1) - 'font-lock-face - 'web-mode-html-attr-equal-face) - (when (not (get-text-property (+ beg offset 1) 'jsx-beg)) - (put-text-property (+ beg offset 1) (1+ end) - 'font-lock-face - 'web-mode-html-attr-value-face) - ) - ) ;if offset - (setq pos (1+ end)) - ) ;t - ) ;cond - ) ;t - );cond - ) ;while - )) - -(defun web-mode-block-highlight (reg-beg reg-end) - (let (sub1 sub2 sub3 continue char keywords token-type face beg end (buffer (current-buffer))) - ;;(message "reg-beg=%S reg-end=%S" reg-beg reg-end) - - ;; NOTE: required for blocks inside tag attrs - (remove-list-of-text-properties reg-beg reg-end '(font-lock-face)) - - (goto-char reg-beg) - - (when (null web-mode-engine-font-lock-keywords) - (setq sub1 (buffer-substring-no-properties - reg-beg (+ reg-beg 1)) - sub2 (buffer-substring-no-properties - reg-beg (+ reg-beg 2)) - sub3 (buffer-substring-no-properties - reg-beg (+ reg-beg (if (>= (point-max) (+ reg-beg 3)) 3 2)))) - ) - - (cond - - ((and (get-text-property reg-beg 'block-beg) - (eq (get-text-property reg-beg 'block-token) 'comment)) - (put-text-property reg-beg reg-end 'font-lock-face 'web-mode-comment-face) - ) ;comment block - - (web-mode-engine-font-lock-keywords - (setq keywords web-mode-engine-font-lock-keywords) - ) - - ((string= web-mode-engine "django") - (cond - ((string= sub2 "{{") - (setq keywords web-mode-django-expr-font-lock-keywords)) - ((string= sub2 "{%") - (setq keywords web-mode-django-code-font-lock-keywords)) - )) ;django - - ((string= web-mode-engine "mako") - (cond - ((member sub3 '("<% " "<%\n" "<%!")) - (setq keywords web-mode-mako-block-font-lock-keywords)) - ((eq (aref sub2 0) ?\%) - (setq keywords web-mode-mako-block-font-lock-keywords)) - ((member sub2 '("<%" " %S face(%S)" beg end face) - (remove-list-of-text-properties beg end '(face)) - (put-text-property beg end 'font-lock-face face) - ) - (setq continue nil - end nil) - ) ;if end - ) ;progn beg - (setq continue nil - end nil) - ) ;if beg - (when (and beg end) - (save-match-data - (when (and web-mode-enable-heredoc-fontification - (eq char ?\<) - (> (- end beg) 8) - ;;(progn (message "%S" (buffer-substring-no-properties beg end)) t) - (string-match-p "JS\\|JAVASCRIPT\\|HTM\\|CSS" (buffer-substring-no-properties beg end))) - (setq keywords - (cond - ((string-match-p "H" (buffer-substring-no-properties beg (+ beg 8))) - web-mode-html-font-lock-keywords) - (t - web-mode-javascript-font-lock-keywords) - )) - (web-mode-fontify-region beg end keywords) - )) -;; (message "%S %c %S beg=%S end=%S" web-mode-enable-string-interpolation char web-mode-engine beg end) - (when (and web-mode-enable-string-interpolation - (member char '(?\" ?\<)) - (member web-mode-engine '("php" "erb")) - (> (- end beg) 4)) - (web-mode-interpolate-block-string beg end) - ) ;when - (when (and web-mode-enable-comment-interpolation - (eq token-type 'comment) - (> (- end beg) 3)) - (web-mode-interpolate-comment beg end t) - ) ;when - (when (and web-mode-enable-comment-annotation - (eq token-type 'comment) - (> (- end beg) 3)) - (web-mode-annotate-comment beg end) - ) ;when - (when (and web-mode-enable-sql-detection - (eq token-type 'string) - (> (- end beg) 6) - ;;(eq char ?\<) - ;;(web-mode-looking-at-p (concat "[ \n]*" web-mode-sql-queries) (1+ beg)) - (web-mode-looking-at-p (concat "\\(.\\|<<<[[:alnum:]]+\\)[ \n]*" web-mode-sql-queries) beg) - ) - (web-mode-interpolate-sql-string beg end) - ) ;when - ) ;when beg end - ) ;while continue - ) ;when keywords - - ;;(when (and (member web-mode-engine '("jsp" "mako")) - (when (and (member web-mode-engine '("mako")) - (> (- reg-end reg-beg) 12) - (eq ?\< (char-after reg-beg))) - (web-mode-interpolate-block-tag reg-beg reg-end)) - - (when web-mode-enable-block-face -;; (message "block-face %S %S" reg-beg reg-end) - (font-lock-append-text-property reg-beg reg-end 'face 'web-mode-block-face)) - - )) - -(defun web-mode-part-highlight (reg-beg reg-end &optional depth) - (save-excursion - (let (start continue token-type face pos beg end string-face comment-face content-type) - ;;(message "part-highlight: reg-beg(%S) reg-end(%S)" reg-beg reg-end) - (if (member web-mode-content-type web-mode-part-content-types) - (setq content-type web-mode-content-type) - (setq content-type (symbol-name (get-text-property reg-beg 'part-side)))) - ;;(message "content-type=%S" content-type) - (unless depth - (when (string= content-type "jsx") (setq depth 0)) - ) - (setq string-face 'web-mode-part-string-face - comment-face 'web-mode-part-comment-face) - (cond - ((member content-type '("javascript" "jsx")) - (setq string-face 'web-mode-javascript-string-face - comment-face 'web-mode-javascript-comment-face) - (web-mode-fontify-region reg-beg reg-end web-mode-javascript-font-lock-keywords)) - ((string= content-type "json") - (setq string-face 'web-mode-json-string-face - comment-face 'web-mode-json-comment-face) - (web-mode-fontify-region reg-beg reg-end web-mode-javascript-font-lock-keywords)) - ((string= content-type "css") - (setq string-face 'web-mode-css-string-face - comment-face 'web-mode-css-comment-face) - (web-mode-css-rules-highlight reg-beg reg-end)) - ((string= content-type "sql") - (web-mode-fontify-region reg-beg reg-end web-mode-sql-font-lock-keywords)) - ((string= content-type "stylus") - (web-mode-fontify-region reg-beg reg-end web-mode-stylus-font-lock-keywords)) - ((string= content-type "sass") - (web-mode-fontify-region reg-beg reg-end web-mode-sass-font-lock-keywords)) - ((string= content-type "pug") - (web-mode-fontify-region reg-beg reg-end web-mode-pug-font-lock-keywords)) - ((string= content-type "markdown") - (web-mode-fontify-region reg-beg reg-end web-mode-markdown-font-lock-keywords)) - ((string= content-type "ruby") - (web-mode-fontify-region reg-beg reg-end web-mode-erb-font-lock-keywords)) - ((string= content-type "typescript") - (web-mode-fontify-region reg-beg reg-end web-mode-javascript-font-lock-keywords)) - ) ;cond - - (goto-char reg-beg) - - ;;(when (string= content-type "jsx") (web-mode-highlight-tags reg-beg reg-end)) - ;;(setq continue (and pos (< pos reg-end))) - (setq continue t - pos reg-beg) - (while continue - (if (get-text-property pos 'part-token) - (setq beg pos) - (setq beg (next-single-property-change pos 'part-token))) - (cond - ((or (null beg) (>= beg reg-end)) - (setq continue nil - end nil)) - ((and (eq depth 0) (get-text-property beg 'jsx-depth)) - (setq pos (or (next-single-property-change beg 'jsx-depth) (point-max)))) - (t - ;;(message "%c" (char-after beg)) - (setq token-type (get-text-property beg 'part-token)) - (setq face (cond - ((eq token-type 'string) string-face) - ((eq token-type 'comment) comment-face) - ((eq token-type 'context) 'web-mode-json-context-face) - ((eq token-type 'key) 'web-mode-json-key-face) - (t nil))) - (setq end (or (next-single-property-change beg 'part-token) (point-max)) - pos end) - (cond - ((or (null end) (> end reg-end)) - (setq continue nil - end nil)) - (t - (when face - (remove-list-of-text-properties beg end '(face)) - (put-text-property beg end 'font-lock-face face)) - (cond - ((< (- end beg) 6) - ) - ((eq token-type 'string) - (cond - ((and (eq (char-after beg) ?\`) - web-mode-enable-literal-interpolation - (member content-type '("javascript" "jsx"))) - (web-mode-interpolate-javascript-literal beg end) - ) - ((and (eq (char-after beg) ?\") - web-mode-enable-string-interpolation - (member content-type '("javascript" "jsx"))) - (web-mode-interpolate-javascript-string beg end)) - ) ;cond - ) ;case string - ((eq token-type 'comment) - (when web-mode-enable-comment-interpolation - (web-mode-interpolate-comment beg end t)) - (when web-mode-enable-comment-annotation - (web-mode-annotate-comment beg end)) - ) - ) ;cond - ) ;t - ) ;cond - ) ;t - ) ;cond - ) ;while - - (when (and (string= web-mode-content-type "html") web-mode-enable-part-face) - (font-lock-append-text-property reg-beg reg-end 'face - (cond - ((string= content-type "javascript") - 'web-mode-script-face) - ((string= content-type "css") - 'web-mode-style-face) - (t - 'web-mode-part-face))) - ) - - (when (and web-mode-enable-css-colorization (string= content-type "stylus")) - (goto-char reg-beg) - (while (and (re-search-forward "#[0-9a-fA-F]\\{6\\}\\|#[0-9a-fA-F]\\{3\\}\\|rgba?([ ]*\\([[:digit:]]\\{1,3\\}\\)[ ]*,[ ]*\\([[:digit:]]\\{1,3\\}\\)[ ]*,[ ]*\\([[:digit:]]\\{1,3\\}\\)\\(.*?\\))" end t) - (<= (point) reg-end)) - (web-mode-colorize (match-beginning 0) (match-end 0)) - ) - ) - - (when (and (eq depth 0) (string= content-type "jsx")) - (let (pair elt-beg elt-end exp-beg exp-end exp-depth) - (goto-char reg-beg) - (while (setq pair (web-mode-jsx-element-next reg-end)) - ;;(message "elt-pair=%S" pair) - (setq elt-beg (car pair) - elt-end (cdr pair)) - (remove-list-of-text-properties elt-beg (1+ elt-end) '(face)) - (web-mode-highlight-tags elt-beg elt-end 1) - (goto-char elt-beg) - (while (setq pair (web-mode-jsx-expression-next elt-end)) - ;;(message "exp-pair=%S elt-end=%S" pair elt-end) - (setq exp-beg (car pair) - exp-end (cdr pair)) - (when (eq (char-after exp-beg) ?\{) - ;;(message "%S : %c %c" exp-beg (char-after (+ exp-beg 1)) (char-after (+ exp-beg 2))) - (cond - ;;((and (eq (char-after (+ exp-beg 1)) ?\/) (eq (char-after (+ exp-beg 2)) ?\*)) - ;; (put-text-property exp-beg (1+ exp-end) 'font-lock-face 'web-mode-part-comment-face) - ;; ) - (t - (setq exp-depth (get-text-property exp-beg 'jsx-depth)) - (remove-list-of-text-properties exp-beg exp-end '(font-lock-face)) - (put-text-property exp-beg (1+ exp-beg) 'font-lock-face 'web-mode-block-delimiter-face) - (when (and (eq (get-text-property exp-beg 'tag-attr-beg) 4) (web-mode-looking-at-p "\.\.\." (1+ exp-beg))) - (put-text-property exp-beg (+ exp-beg 4) 'font-lock-face 'web-mode-block-delimiter-face)) - (put-text-property exp-end (1+ exp-end) 'font-lock-face 'web-mode-block-delimiter-face) - (web-mode-highlight-tags (1+ exp-beg) exp-end (1+ exp-depth)) - (web-mode-part-highlight (1+ exp-beg) exp-end exp-depth) - (web-mode-fontify-region (1+ exp-beg) exp-end web-mode-javascript-font-lock-keywords) - ) ;t - ) ;cond - ) ;when - (goto-char (1+ exp-beg)) - ) ;while exp - - (when (and elt-beg web-mode-jsx-depth-faces) - (let (depth-beg depth-end jsx-face) - (goto-char elt-beg) - (while (setq pair (web-mode-jsx-depth-next reg-end)) - ;;(message "depth-pair=%S" pair) - (setq depth-beg (car pair) - depth-end (cdr pair) - depth (get-text-property depth-beg 'jsx-depth) - jsx-face (elt web-mode-jsx-depth-faces (1- depth))) - ;;(message "%S" jsx-face) - (font-lock-prepend-text-property depth-beg (1+ depth-end) 'face jsx-face) - (goto-char (+ depth-beg 2)) - ) - ) ;let - ) - - (goto-char (1+ elt-end)) - ) ;while elt - ) ;let - ) ;when - - ) ;let - ) ;save-excursion - ) - -(defun web-mode-css-rules-highlight (part-beg part-end) - (save-excursion - (goto-char part-beg) - (let (rule (continue t) (i 0) (at-rule nil) (var-rule nil)) - (while continue - (setq rule (web-mode-css-rule-next part-end)) - ;;(message "rule=%S" rule) - (cond - ((> (setq i (1+ i)) 1000) - (message "css-rules-highlight ** too much rules **") - (setq continue nil)) - ((null rule) - (setq continue nil)) - ((and (setq at-rule (plist-get rule :at-rule)) - (not (member at-rule '("charset" "font-face" "import" "viewport"))) - (plist-get rule :dec-end)) - (web-mode-css-rule-highlight (plist-get rule :sel-beg) - (plist-get rule :sel-end) - nil nil) - (web-mode-css-rules-highlight (plist-get rule :dec-beg) - (plist-get rule :dec-end))) - (t - (web-mode-css-rule-highlight (plist-get rule :sel-beg) - (plist-get rule :sel-end) - (plist-get rule :dec-beg) - (plist-get rule :dec-end))) - ) ;cond - ) ;while - ) ;let - )) - -(defun web-mode-css-rule-highlight (sel-beg sel-end dec-beg dec-end) - (save-excursion - ;;(let ((end sel-end)) - ;;(message "sel-beg=%S sel-end=%S dec-beg=%S dec-end=%S" sel-beg sel-end dec-beg dec-end) - (web-mode-fontify-region sel-beg sel-end web-mode-selector-font-lock-keywords) - (when (and dec-beg dec-end) - ;;(setq end dec-end) - (web-mode-fontify-region dec-beg dec-end web-mode-declaration-font-lock-keywords) - ) ;when - (when (and dec-beg dec-end) - (goto-char dec-beg) - (while (and web-mode-enable-css-colorization - (re-search-forward "#[0-9a-fA-F]\\{6\\}\\|#[0-9a-fA-F]\\{3\\}\\|rgba?([ ]*\\([[:digit:]]\\{1,3\\}\\)[ ]*,[ ]*\\([[:digit:]]\\{1,3\\}\\)[ ]*,[ ]*\\([[:digit:]]\\{1,3\\}\\)\\(.*?\\))" dec-end t) - ;;(progn (message "%S %S" end (point)) t) - (<= (point) dec-end)) - (web-mode-colorize (match-beginning 0) (match-end 0)) - ) ;while - ) ;when - ;;) ;let - )) - -(defun web-mode-fontify-region (beg end keywords) -;; (message "beg=%S end=%S" beg end);; (symbol-name keywords)) - (save-excursion - (let ((font-lock-keywords keywords) - (font-lock-multiline nil) - (font-lock-keywords-case-fold-search - (member web-mode-engine '("archibus" "asp" "template-toolkit"))) - (font-lock-keywords-only t) - (font-lock-extend-region-functions nil)) - ;; (message "%S" keywords) - (when (and (listp font-lock-keywords) global-font-lock-mode) - (font-lock-fontify-region beg end) - ) - ) - )) - -(defun web-mode-colorize-foreground (color) - (let* ((values (x-color-values color)) - (r (car values)) - (g (cadr values)) - (b (car (cdr (cdr values))))) - (if (> 128.0 (floor (+ (* .3 r) (* .59 g) (* .11 b)) 256)) - "white" "black"))) - -(defun web-mode-colorize (beg end) - (let (str plist len) - (setq str (buffer-substring-no-properties beg end)) - (setq len (length str)) - (cond - ((string= (substring str 0 1) "#") - (setq plist (list :background str - :foreground (web-mode-colorize-foreground str))) - (put-text-property beg end 'face plist)) - ((or (string= (substring str 0 4) "rgb(") (string= (substring str 0 5) "rgba(")) - (setq str (format "#%02X%02X%02X" - (string-to-number (match-string-no-properties 1)) - (string-to-number (match-string-no-properties 2)) - (string-to-number (match-string-no-properties 3)))) - (setq plist (list :background str - :foreground (web-mode-colorize-foreground str))) - (put-text-property beg end 'face plist)) - ) ;cond - )) - -(defun web-mode-interpolate-block-tag (beg end) - (save-excursion - (goto-char (+ 4 beg)) - (setq end (1- end)) - (while (re-search-forward "${.*?}" end t) - (remove-list-of-text-properties (match-beginning 0) (match-end 0) '(face)) - (web-mode-fontify-region (match-beginning 0) (match-end 0) - web-mode-uel-font-lock-keywords)) - )) - -(defun web-mode-interpolate-javascript-string (beg end) - (save-excursion - (goto-char (1+ beg)) - (setq end (1- end)) - (while (re-search-forward "${.*?}" end t) - (put-text-property (match-beginning 0) (match-end 0) - 'font-lock-face - 'web-mode-variable-name-face) - ) - )) - -(defun web-mode-interpolate-javascript-literal (beg end) - (save-excursion - (goto-char (1+ beg)) - (setq end (1- end)) - (while (re-search-forward "${.*?}" end t) - (put-text-property (match-beginning 0) (match-end 0) - 'font-lock-face - 'web-mode-variable-name-face) - ) - (cond - ((web-mode-looking-back "\\(css\\|styled[[:alnum:].]+\\)" beg) - (goto-char (1+ beg)) - (while (re-search-forward ".*?:" end t) - (put-text-property (match-beginning 0) (match-end 0) - 'font-lock-face - 'web-mode-interpolate-color1-face) - ) - ) ;case css - ((web-mode-looking-back "\\(template\\|html\\)" beg) - (goto-char (1+ beg)) - (while (re-search-forward web-mode-tag-regexp end t) - (put-text-property (match-beginning 1) (match-end 1) - 'font-lock-face - 'web-mode-interpolate-color1-face) - ) - ) ;case html - ) ;cond - )) - -;; todo : parsing plus compliqué: {$obj->values[3]->name} -(defun web-mode-interpolate-block-string (beg end) - (save-excursion - (goto-char (1+ beg)) - (setq end (1- end)) - (cond - ((string= web-mode-engine "php") - (while (re-search-forward "$[[:alnum:]_]+\\(->[[:alnum:]_]+\\)*\\|{[ ]*$.+?}" end t) -;; (message "%S > %S" (match-beginning 0) (match-end 0)) - (remove-list-of-text-properties (match-beginning 0) (match-end 0) '(font-lock-face)) - (web-mode-fontify-region (match-beginning 0) (match-end 0) - web-mode-php-var-interpolation-font-lock-keywords) - )) - ((string= web-mode-engine "erb") - (while (re-search-forward "#{.*?}" end t) - (remove-list-of-text-properties (match-beginning 0) (match-end 0) '(font-lock-face)) - (put-text-property (match-beginning 0) (match-end 0) - 'font-lock-face 'web-mode-variable-name-face) - )) - ) ;cond - )) - -(defun web-mode-interpolate-comment (beg end block-side) - (save-excursion - (let ((regexp (concat "\\_<\\(" web-mode-comment-keywords "\\)\\_>"))) - (goto-char beg) - (while (re-search-forward regexp end t) - (font-lock-prepend-text-property (match-beginning 1) (match-end 1) - 'font-lock-face - 'web-mode-comment-keyword-face) - ) ;while - ))) - -(defun web-mode-annotate-comment (beg end) - (save-excursion - ;;(message "beg=%S end=%S" beg end) - (goto-char beg) - (when (looking-at-p "/\\*\\*") - (while (re-search-forward "\\(.+\\)" end t) - (font-lock-prepend-text-property (match-beginning 1) (match-end 1) - 'font-lock-face - 'web-mode-annotation-face)) - (goto-char beg) - (while (re-search-forward "[ ]+\\({[^}]+}\\)" end t) - (font-lock-prepend-text-property (match-beginning 1) (match-end 1) - 'font-lock-face - 'web-mode-annotation-type-face)) - (goto-char beg) - (while (re-search-forward "\\(@[[:alnum:]]+\\)" end t) - (font-lock-prepend-text-property (match-beginning 1) (match-end 1) - 'font-lock-face - 'web-mode-annotation-tag-face)) - (goto-char beg) - (while (re-search-forward "}[[:blank:]]+\\([[:graph:]]+\\)" end t) - (font-lock-prepend-text-property (match-beginning 1) (match-end 1) - 'font-lock-face - 'web-mode-annotation-value-face)) - (goto-char beg) - (while (re-search-forward "@see[[:blank:]]+\\([[:graph:]]+\\)" end t) - (font-lock-prepend-text-property (match-beginning 1) (match-end 1) - 'font-lock-face - 'web-mode-annotation-value-face)) - (goto-char beg) - (while (re-search-forward "{\\(@\\(?:link\\|code\\)\\)\\s-+\\([^}\n]+\\)\\(#.+\\)?}" end t) - (font-lock-prepend-text-property (match-beginning 2) (match-end 2) - 'font-lock-face - 'web-mode-annotation-value-face)) - (goto-char beg) - (while (re-search-forward "\\(\\)" end t) - (font-lock-prepend-text-property (match-beginning 1) (match-end 1) - 'font-lock-face - 'web-mode-annotation-html-face) - (font-lock-prepend-text-property (match-beginning 2) (match-end 2) - 'font-lock-face - 'web-mode-annotation-html-face) - (font-lock-prepend-text-property (match-beginning 3) (match-end 3) - 'font-lock-face - 'web-mode-annotation-html-face)) - ) ;when - )) - -(defun web-mode-interpolate-sql-string (beg end) - (save-excursion - (let ((case-fold-search t) - (regexp (concat "\\_<\\(" web-mode-sql-keywords "\\)\\_>"))) - (goto-char beg) - (while (re-search-forward regexp end t) - (font-lock-prepend-text-property (match-beginning 1) (match-end 1) - 'font-lock-face - 'web-mode-sql-keyword-face) - ) ;while - ))) - -(defun web-mode-fill-paragraph (&optional justify) - (save-excursion - (let ((pos (point)) fill-coll - prop pair beg end delim-beg delim-end chunk fill-col) - (cond - ((or (eq (get-text-property pos 'part-token) 'comment) - (eq (get-text-property pos 'block-token) 'comment)) - (setq prop - (if (get-text-property pos 'part-token) 'part-token 'block-token)) - (setq pair (web-mode-property-boundaries prop pos)) - (when (and pair (> (- (cdr pair) (car pair)) 6)) - (setq fill-coll (if (< fill-column 10) 70 fill-column)) - (setq beg (car pair) - end (cdr pair)) - (goto-char beg) - (setq chunk (buffer-substring-no-properties beg (+ beg 2))) - (cond - ((string= chunk "//") - (setq delim-beg "//" - delim-end "EOL")) - ((string= chunk "/*") - (setq delim-beg "/*" - delim-end "*/")) - ((string= chunk "{#") - (setq delim-beg "{#" - delim-end "#}")) - ((string= chunk "")) - ) - ) - ) ;comment - case - ((web-mode-is-content) - (setq pair (web-mode-content-boundaries pos)) - (setq beg (car pair) - end (cdr pair)) - ) - ) ;cond - ;;(message "beg(%S) end(%S)" beg end) - (when (and beg end) - (fill-region beg end)) - t))) - -(defun web-mode-property-boundaries (prop &optional pos) - "property boundaries (cdr is 1+)" - (unless pos (setq pos (point))) - (let (beg end val) - (setq val (get-text-property pos prop)) - (if (null val) - val - (if (or (bobp) - (not (eq (get-text-property (1- pos) prop) val))) - (setq beg pos) - (setq beg (previous-single-property-change pos prop)) - (when (null beg) (setq beg (point-min)))) - (if (or (eobp) - (not (eq (get-text-property (1+ pos) prop) val))) - (setq end pos) - (setq end (next-single-property-change pos prop)) - (when (null end) (setq end (point-min)))) - (cons beg end)))) - -(defun web-mode-content-boundaries (&optional pos) - (unless pos (setq pos (point))) - (let (beg end) - (setq beg (or (previous-property-change pos (current-buffer)) - (point-max))) - (setq end (or (next-property-change pos (current-buffer)) - (point-min))) - (while (and (< beg end) (member (char-after beg) '(?\s ?\n))) - (setq beg (1+ beg))) - (while (and (> end beg) (member (char-after (1- end)) '(?\s ?\n))) - (setq end (1- end))) -;; (message "beg(%S) end(%S)" beg end) - (cons beg end) - )) - -(defun web-mode-engine-syntax-check () - (interactive) - (let ((proc nil) (errors nil) - (file (concat temporary-file-directory "emacs-web-mode-tmp"))) - (write-region (point-min) (point-max) file) - (cond - ;; ((null (buffer-file-name)) - ;; ) - ((string= web-mode-engine "php") - (setq proc (start-process "php-proc" nil "php" "-l" file)) - (set-process-filter - proc - (lambda (proc output) - (cond - ((string-match-p "No syntax errors" output) - (message "No syntax errors") - ) - (t - ;; (setq output (replace-regexp-in-string temporary-file-directory "" output)) - ;; (message output) - (message "Syntax error") - (setq errors t)) - ) ;cond - ;; (delete-file file) - ) ;lambda - ) - ) ;php - (t - (message "no syntax checker found") - ) ;t - ) ;cond - errors)) - -(defun web-mode-jshint () - "Run JSHint on all the JavaScript parts." - (interactive) - (let (proc lines) - (when (buffer-file-name) - (setq proc (start-process - "jshint-proc" - nil - (or (executable-find "jshint") "/usr/local/bin/jshint") - "--extract=auto" - (buffer-file-name))) - (setq web-mode-jshint-errors 0) - (set-process-filter proc - (lambda (proc output) - (let ((offset 0) overlay pos (old 0) msg) - (remove-overlays (point-min) (point-max) 'font-lock-face 'web-mode-error-face) - (while (string-match - "line \\([[:digit:]]+\\), col \\([[:digit:]]+\\), \\(.+\\)\\.$" - output offset) - (setq web-mode-jshint-errors (1+ web-mode-jshint-errors)) - (setq offset (match-end 0)) - (setq pos (web-mode-coord-position - (match-string-no-properties 1 output) - (match-string-no-properties 2 output))) - (when (get-text-property pos 'tag-beg) - (setq pos (1- pos))) - (when (not (= pos old)) - (setq old pos) - (setq overlay (make-overlay pos (1+ pos))) - (overlay-put overlay 'font-lock-face 'web-mode-error-face) - ) - (setq msg (or (overlay-get overlay 'help-echo) - (concat "line=" - (match-string-no-properties 1 output) - " column=" - (match-string-no-properties 2 output) - ))) - (overlay-put overlay 'help-echo - (concat msg " ## " (match-string-no-properties 3 output))) - ) ;while - )) - ) - ) ;when - )) - -(defun web-mode-dom-errors-show () - "Show unclosed tags." - (interactive) - (let (beg end tag pos l n tags i cont cell overlay overlays first - (ori (point)) - (errors 0) - (continue t) - ) - (setq overlays (overlays-in (point-min) (point-max))) - (when overlays - (dolist (overlay overlays) - (when (eq (overlay-get overlay 'face) 'web-mode-warning-face) - (delete-overlay overlay) - ) - ) - ) - (goto-char (point-min)) - (when (not (or (get-text-property (point) 'tag-beg) - (web-mode-tag-next))) - (setq continue nil)) - (while continue - (setq pos (point)) - (setq tag (get-text-property pos 'tag-name)) - (cond - ((eq (get-text-property (point) 'tag-type) 'start) - (setq tags (add-to-list 'tags (list tag pos))) -;; (message "(%S) opening %S" pos tag) - ) - ((eq (get-text-property (point) 'tag-type) 'end) - (setq i 0 - l (length tags) - cont t) - (while (and (< i l) cont) - (setq cell (nth i tags)) -;; (message "cell=%S" cell) - (setq i (1+ i)) - (cond - ((string= tag (nth 0 cell)) - (setq cont nil) - ) - (t - (setq errors (1+ errors)) - (setq beg (nth 1 cell)) - (setq end (web-mode-tag-end-position beg)) - (unless first - (setq first beg)) - (setq overlay (make-overlay beg (1+ end))) - (overlay-put overlay 'font-lock-face 'web-mode-warning-face) -;; (message "invalid <%S> at %S" (nth 0 cell) (nth 1 cell)) - ) - ) ;cond - ) ;while - - (dotimes (i i) - (setq tags (cdr tags))) - - ) - ) ;cond - (when (not (web-mode-tag-next)) - (setq continue nil)) - ) ;while - (message "%S error(s) detected" errors) - (if (< errors 1) - (goto-char ori) - (goto-char first) - (recenter)) - ;; (message "%S" tags) - )) - -(defun web-mode-highlight-elements (beg end) - (save-excursion - (goto-char beg) - (let ((continue (or (get-text-property (point) 'tag-beg) (web-mode-tag-next))) - (i 0) (ctx nil) (face nil)) - (while continue - (cond - ((> (setq i (1+ i)) 1000) - (message "highlight-elements ** too much tags **") - (setq continue nil)) - ((> (point) end) - (setq continue nil)) - ((not (get-text-property (point) 'tag-beg)) - (setq continue nil)) - ((eq (get-text-property (point) 'tag-type) 'start) - (when (and (setq ctx (web-mode-element-boundaries (point))) - (<= (car (cdr ctx)) end) - (setq face (cdr (assoc (get-text-property (point) 'tag-name) web-mode-element-content-faces)))) - (font-lock-prepend-text-property (1+ (cdr (car ctx))) (car (cdr ctx)) - 'font-lock-face face)) - ) - ) ;cond - (when (not (web-mode-tag-next)) - (setq continue nil)) - ) ;while - ))) - -(defun web-mode-enable (feature) - "Enable one feature." - (interactive - (list (completing-read - "Feature: " - (let (features) - (dolist (elt web-mode-features) - (setq features (append features (list (car elt))))) - features)))) - (when (and (or (not feature) (< (length feature) 1)) web-mode-last-enabled-feature) - (setq feature web-mode-last-enabled-feature)) - (when feature - (setq web-mode-last-enabled-feature feature) - (setq feature (cdr (assoc feature web-mode-features))) - (cond - ((eq feature 'web-mode-enable-current-column-highlight) - (web-mode-column-show)) - ((eq feature 'web-mode-enable-current-element-highlight) - (when (not web-mode-enable-current-element-highlight) - (web-mode-toggle-current-element-highlight)) - ) - ((eq feature 'web-mode-enable-whitespace-fontification) - (web-mode-whitespaces-on)) - (t - (set feature t) - (web-mode-buffer-highlight)) - ) - ) ;when - ) - -(defun web-mode-disable (feature) - "Disable one feature." - (interactive - (list (completing-read - "Feature: " - (let (features) - (dolist (elt web-mode-features) - (setq features (append features (list (car elt))))) - features)))) - (when (and (or (not feature) (< (length feature) 1)) web-mode-last-enabled-feature) - (setq feature web-mode-last-enabled-feature)) - (when feature - (setq feature (cdr (assoc feature web-mode-features))) - (cond - ((eq feature 'web-mode-enable-current-column-highlight) - (web-mode-column-hide)) - ((eq feature 'web-mode-enable-current-element-highlight) - (when web-mode-enable-current-element-highlight - (web-mode-toggle-current-element-highlight)) - ) - ((eq feature 'web-mode-enable-whitespace-fontification) - (web-mode-whitespaces-off)) - (t - (set feature nil) - (web-mode-buffer-highlight)) - ) - ) ;when - ) - -(defun web-mode-make-tag-overlays () - (unless web-mode-overlay-tag-start - (setq web-mode-overlay-tag-start (make-overlay 1 1) - web-mode-overlay-tag-end (make-overlay 1 1)) - (overlay-put web-mode-overlay-tag-start - 'font-lock-face - 'web-mode-current-element-highlight-face) - (overlay-put web-mode-overlay-tag-end - 'font-lock-face - 'web-mode-current-element-highlight-face))) - -(defun web-mode-delete-tag-overlays () - (when web-mode-overlay-tag-start - (delete-overlay web-mode-overlay-tag-start) - (delete-overlay web-mode-overlay-tag-end))) - -(defun web-mode-column-overlay-factory (index) - (let (overlay) - (when (null web-mode-column-overlays) - (dotimes (i 100) - (setq overlay (make-overlay 1 1)) - (overlay-put overlay 'font-lock-face 'web-mode-current-column-highlight-face) - (setq web-mode-column-overlays (append web-mode-column-overlays (list overlay))) - ) - ) ;when - (setq overlay (nth index web-mode-column-overlays)) - (when (null overlay) - (setq overlay (make-overlay 1 1)) - (overlay-put overlay 'font-lock-face 'web-mode-current-column-highlight-face) - (setq web-mode-column-overlays (append web-mode-column-overlays (list overlay))) - ) ;when - overlay)) - -(defun web-mode-column-hide () - (setq web-mode-enable-current-column-highlight nil) - (remove-overlays (point-min) (point-max) - 'font-lock-face - 'web-mode-current-column-highlight-face)) - -(defun web-mode-column-show () - (let ((index 0) overlay diff column line-to line-from) - (web-mode-column-hide) - (setq web-mode-enable-current-column-highlight t) - (save-excursion - (back-to-indentation) - (setq column (current-column) - line-to (web-mode-line-number)) - (when (and (get-text-property (point) 'tag-beg) - (member (get-text-property (point) 'tag-type) '(start end)) - (web-mode-tag-match) - (setq line-from (web-mode-line-number)) - (not (= line-from line-to))) - (when (> line-from line-to) - (let (tmp) - (setq tmp line-from) - (setq line-from line-to) - (setq line-to tmp)) - ) ;when - ;;(message "column(%S) line-from(%S) line-to(%S)" column line-from line-to) - (goto-char (point-min)) - (when (> line-from 1) - (forward-line (1- line-from))) - (while (<= line-from line-to) - (setq overlay (web-mode-column-overlay-factory index)) - (setq diff (- (line-end-position) (point))) - (cond - ((or (and (= column 0) (= diff 0)) - (> column diff)) - (end-of-line) - (move-overlay overlay (point) (point)) - (overlay-put overlay - 'after-string - (concat - (if (> column diff) (make-string (- column diff) ?\s) "") - (propertize " " - 'font-lock-face - 'web-mode-current-column-highlight-face) - ) ;concat - ) - ) - (t - (move-to-column column) - (overlay-put overlay 'after-string nil) - (move-overlay overlay (point) (1+ (point))) - ) - ) ;cond - (setq line-from (1+ line-from)) - (forward-line) - (setq index (1+ index)) - ) ;while - ) ;when - ) ;save-excursion - ) ;let - ) - -(defun web-mode-highlight-current-element () - (let ((ctx (web-mode-element-boundaries)) len) - (cond - ((null ctx) - (web-mode-delete-tag-overlays)) - ((eq (get-text-property (caar ctx) 'tag-type) 'void) ;; #1046 - (web-mode-make-tag-overlays) - (setq len (length (get-text-property (caar ctx) 'tag-name))) - (move-overlay web-mode-overlay-tag-start (+ (caar ctx) 1) (+ (caar ctx) 1 len)) - ) - (t - (web-mode-make-tag-overlays) - (setq len (length (get-text-property (caar ctx) 'tag-name))) - (move-overlay web-mode-overlay-tag-start (+ (caar ctx) 1) (+ (caar ctx) 1 len)) - (move-overlay web-mode-overlay-tag-end (+ (cadr ctx) 2) (+ (cadr ctx) 2 len)) - ) ;t - ) ;cond - )) - -(defun web-mode-highlight-whitespaces (beg end) - (save-excursion - (goto-char beg) - (while (re-search-forward web-mode-whitespaces-regexp end t) - (add-text-properties (match-beginning 0) (match-end 0) - '(face web-mode-whitespace-face)) - ) ;while - )) - -(defun web-mode-whitespaces-show () - "Toggle whitespaces." - (interactive) - (if web-mode-enable-whitespace-fontification - (web-mode-whitespaces-off) - (web-mode-whitespaces-on))) - -(defun web-mode-whitespaces-on () - "Show whitespaces." - (interactive) - (when web-mode-display-table - (setq buffer-display-table web-mode-display-table)) - (setq web-mode-enable-whitespace-fontification t)) - -(defun web-mode-whitespaces-off () - (setq buffer-display-table nil) - (setq web-mode-enable-whitespace-fontification nil)) - -(defun web-mode-use-tabs () - "Tweaks vars to be compatible with TAB indentation." - (let (offset) - (setq web-mode-block-padding 0) - (setq web-mode-script-padding 0) - (setq web-mode-style-padding 0) - (setq offset - (cond - ((and (boundp 'tab-width) tab-width) tab-width) - ((and (boundp 'standard-indent) standard-indent) standard-indent) - (t 4))) - ;; (message "offset(%S)" offset) - (setq web-mode-attr-indent-offset offset) - (setq web-mode-code-indent-offset offset) - (setq web-mode-css-indent-offset offset) - (setq web-mode-markup-indent-offset offset) - (setq web-mode-sql-indent-offset offset) - (add-to-list 'web-mode-indentation-params '("lineup-args" . nil)) - (add-to-list 'web-mode-indentation-params '("lineup-calls" . nil)) - (add-to-list 'web-mode-indentation-params '("lineup-concats" . nil)) - (add-to-list 'web-mode-indentation-params '("lineup-ternary" . nil)) - )) - -(defun web-mode-buffer-indent () - "Indent all buffer." - (interactive) - (let ((debug t) (ts (current-time)) (sub nil)) - (indent-region (point-min) (point-max)) - (when debug - (setq sub (time-subtract (current-time) ts)) - (message "buffer-indent: time elapsed = %Ss %9Sµs" (nth 1 sub) (nth 2 sub))) - (delete-trailing-whitespace))) - -(defun web-mode-buffer-change-tag-case (&optional type) - "Change html tag case." - (interactive) - (save-excursion - (goto-char (point-min)) - (let ((continue t) f) - (setq f (if (member type '("upper" "uppercase" "upper-case")) 'uppercase 'downcase)) - (when (and (not (get-text-property (point) 'tag-beg)) - (not (web-mode-tag-next))) - (setq continue nil)) - (while continue - (skip-chars-forward " depth 1)) - (when (get-text-property pos 'jsx-beg) - (setq depth (1- depth))) - (setq reg-beg (web-mode-jsx-depth-beginning-position pos depth)) - (setq reg-beg (1+ reg-beg)) - ;;(message "%S" (point)) - (save-excursion - (goto-char reg-beg) - ;;(message "pt=%S" reg-beg) - (cond - ((and (not (looking-at-p "[ ]*$")) - (looking-back "^[[:space:]]*{" (point-min))) - (setq reg-col (+ (current-indentation) ;; #1027 - (cond - ((looking-at "[ ]+") (1+ (length (match-string-no-properties 0)))) - (t 0)) - )) - ) - ((looking-at-p "[ ]*\\[[ ]*$") ;; #0659 - (setq reg-col (current-indentation)) - ) - ((and (looking-back "=[ ]*{" (point-min)) ;; #0739 #1022 - (not (looking-at-p "[[:space:]]*<"))) - (setq reg-col (current-indentation)) - ) - ;;((and (looking-back "=[ ]*{" (point-min)) ;; #0739 - ;; (looking-at-p "{[ ]*")) - ;; (setq reg-col (current-indentation)) - ;; ) - ((get-text-property (1- (point)) 'tag-beg) - ;;(message "point=%S" (point)) - (setq reg-col (current-indentation)) - ) - (t - (message "%S : %S %S" (point) (current-indentation) web-mode-code-indent-offset) - ;;(setq reg-col (+ (current-indentation) web-mode-code-indent-offset web-mode-jsx-expression-padding))) - (setq reg-col (+ (current-indentation) web-mode-code-indent-offset))) - ) - - ;;(message "%S %S %S" (point) (current-indentation) reg-col) - ) ;save-excursion - ) - ((string= web-mode-content-type "jsx") - (setq reg-beg (point-min))) - (t - (setq reg-beg (or (web-mode-part-beginning-position pos) (point-min))) - (save-excursion - (goto-char reg-beg) - (search-backward "<" nil t) - (setq reg-col (current-column)) - ) ;save-excursion - ) - ) ;cond - ;;(message "jsx reg-beg=%S" reg-beg) - ) ;jsx - - ((string= web-mode-content-type "php") - (setq language "php" - curr-indentation web-mode-code-indent-offset)) - - ((or (string= web-mode-content-type "xml")) - (setq language "xml" - curr-indentation web-mode-markup-indent-offset)) - - ;; TODO: est ce util ? - ((and (get-text-property pos 'tag-beg) - (get-text-property pos 'tag-name) - ;;(not (get-text-property pos 'part-side)) - ) - (setq language "html" - curr-indentation web-mode-markup-indent-offset)) - - ((and (get-text-property pos 'block-side) - (not (get-text-property pos 'block-beg))) - - (setq reg-beg (or (web-mode-block-beginning-position pos) (point-min))) - (goto-char reg-beg) - (setq reg-col (current-column)) - (setq language web-mode-engine) - (setq curr-indentation web-mode-code-indent-offset) - - (cond - ((string= web-mode-engine "blade") - (save-excursion - (when (web-mode-rsf "{[{!]+[ ]*") - (setq reg-col (current-column)))) - (setq reg-beg (+ reg-beg 2)) - ) - ((string= web-mode-engine "razor") - (setq reg-beg (+ reg-beg 2)) - ) - ;; tests/demo.chtml - ((string= web-mode-engine "ctemplate") - (save-excursion - (when (web-mode-rsf "{{#?") - (setq reg-col (current-column)))) - ) - ((string= web-mode-engine "dust") - (save-excursion - (when (web-mode-rsf "{@") - (setq reg-col (current-column)))) - ) - ((string= web-mode-engine "svelte") - (save-excursion - (when (web-mode-rsf "{@") - (setq reg-col (current-column)))) - ) - ((string= web-mode-engine "template-toolkit") - (setq reg-beg (+ reg-beg 3) - reg-col (+ reg-col 3)) - ) - ((and (string= web-mode-engine "jsp") - (web-mode-looking-at "<%@" reg-beg)) - (save-excursion - (goto-char reg-beg) - (looking-at "<%@[ ]*[[:alpha:]]+[ ]+\\| pos (point-min)) - (eq (get-text-property pos 'part-token) 'comment) - (eq (get-text-property (1- pos) 'part-token) 'comment) - (progn - (setq reg-beg (previous-single-property-change pos 'part-token)) - t)) - (and (> pos (point-min)) - (eq (get-text-property pos 'block-token) 'comment) - (eq (get-text-property (1- pos) 'block-token) 'comment) - (progn - (setq reg-beg (previous-single-property-change pos 'block-token)) - t)) - (and (> pos (point-min)) - (eq (get-text-property pos 'tag-type) 'comment) - (not (get-text-property pos 'tag-beg)) - (progn - (setq reg-beg (web-mode-tag-beginning-position pos)) - t)) - ) - (setq token "comment")) - ((or (and (> pos (point-min)) - (member (get-text-property pos 'part-token) - '(string context key)) - (member (get-text-property (1- pos) 'part-token) - '(string context key))) - (and (eq (get-text-property pos 'block-token) 'string) - (eq (get-text-property (1- pos) 'block-token) 'string))) - (setq token "string")) - ) - - (goto-char pos) - (setq curr-line (web-mode-trim - (buffer-substring-no-properties - (line-beginning-position) - (line-end-position)))) - (setq curr-char (if (string= curr-line "") 0 (aref curr-line 0))) - - (when (or (member language '("php" "blade" "javascript" "jsx" "razor" "css")) - (and (member language '("html" "xml")) - (not (eq ?\< curr-char)))) - (let (prev) - (cond - ((member language '("html" "xml" "javascript" "jsx" "css")) - (when (setq prev (web-mode-part-previous-live-line reg-beg)) - (setq prev-line (nth 0 prev) - prev-indentation (nth 1 prev) - prev-pos (nth 2 prev)) - ) - ) - ((setq prev (web-mode-block-previous-live-line)) - (setq prev-line (car prev) - prev-indentation (cdr prev)) - (setq prev-line (web-mode-clean-block-line prev-line))) - ) ;cond - ) ;let - (when (>= (length prev-line) 1) - (setq prev-char (aref prev-line (1- (length prev-line)))) - (setq prev-line (substring-no-properties prev-line)) - ) - ) - - (cond - ((not (member web-mode-content-type '("html" "xml"))) - ) - ((member language '("javascript" "jsx" "ruby")) - (setq reg-col (if web-mode-script-padding (+ reg-col web-mode-script-padding) 0))) - ((member language '("css" "sql" "markdown" "pug" "sass" "stylus")) - (setq reg-col (if web-mode-style-padding (+ reg-col web-mode-style-padding) 0))) - ((not (member language '("html" "xml" "razor"))) - (setq reg-col - (cond - ((not web-mode-block-padding) reg-col) - ((eq web-mode-block-padding -1) 0) - (t (+ reg-col web-mode-block-padding)) - ) ;cond - ) ;setq - ) - ) - - (list :curr-char curr-char - :curr-indentation curr-indentation - :curr-line curr-line - :language language - :options options - :prev-char prev-char - :prev-indentation prev-indentation - :prev-line prev-line - :prev-pos prev-pos - :reg-beg reg-beg - :reg-col reg-col - :token token) - ))) - -(defun web-mode-indent-line () - - (web-mode-propertize) - - (let ((offset nil) - (char nil) - (debug nil) - (inhibit-modification-hooks nil) - (adjust t)) - - (save-excursion - (back-to-indentation) - (setq char (char-after)) - (let* ((pos (point)) - (ctx (web-mode-point-context pos)) - (curr-char (plist-get ctx :curr-char)) - (curr-indentation (plist-get ctx :curr-indentation)) - (curr-line (plist-get ctx :curr-line)) - (language (plist-get ctx :language)) - (prev-char (plist-get ctx :prev-char)) - (prev-indentation (plist-get ctx :prev-indentation)) - (prev-line (plist-get ctx :prev-line)) - (prev-pos (plist-get ctx :prev-pos)) - (reg-beg (plist-get ctx :reg-beg)) - (reg-col (plist-get ctx :reg-col)) - (token (plist-get ctx :token)) - (options (plist-get ctx :options)) - (chars (list curr-char prev-char)) - (tmp nil) - (is-js (member language '("javascript" "jsx" "ejs")))) - - ;;(message "%S" language) - ;;(message "curr-char=[%c] prev-char=[%c]\n%S" curr-char prev-char ctx) - ;;(message "options=%S" ctx) - - (cond - - ((or (bobp) (= (line-number-at-pos pos) 1)) - (when debug (message "I100(%S) first line" pos)) - (setq offset 0)) - - ;; #1073 - ((get-text-property pos 'invisible) - (when debug (message "I110(%S) invible" pos)) - (setq offset nil)) - - ((string= token "string") - (when debug (message "I120(%S) string" pos)) - (cond - ((web-mode-is-token-end pos) - (if (get-text-property pos 'block-side) - (web-mode-block-token-beginning) - (web-mode-part-token-beginning)) - (setq offset (current-indentation)) - ) - ((and web-mode-enable-sql-detection - (web-mode-block-token-starts-with (concat "[ \n]*" web-mode-sql-queries))) - (save-excursion - (let (col) - (web-mode-block-string-beginning) - (skip-chars-forward "[ \"'\n]") - (setq col (current-column)) - (goto-char pos) - (if (looking-at-p "\\(SELECT\\|INSERT\\|DELETE\\|UPDATE\\|FROM\\|LEFT\\|JOIN\\|WHERE\\|GROUP BY\\|LIMIT\\|HAVING\\|\)\\)") - (setq offset col) - (setq offset (+ col web-mode-sql-indent-offset))) - ) - ) ;save-excursion - ) - ((and is-js - (web-mode-is-ql-string pos "Relay\.QL")) - (setq offset (web-mode-relayql-indentation pos)) - ) - ((and is-js - (web-mode-is-ql-string pos "gql")) - (setq offset (web-mode-relayql-indentation pos "gql")) - ) - ((and is-js - (web-mode-is-ql-string pos "graphql")) - (setq offset (web-mode-relayql-indentation pos "graphql")) - ) - ((and is-js - (web-mode-is-css-string pos)) - (when debug (message "I127(%S) css string" pos)) - (setq offset (web-mode-token-css-indentation pos)) - ) - ((and is-js - (web-mode-is-html-string pos)) - (when debug (message "I128(%S) html string" pos)) - (setq offset (web-mode-token-html-indentation pos)) - ) - (t - (setq offset nil)) - ) ;cond - ) ;case string - - ((string= token "comment") - (when debug (message "I130(%S) comment" pos)) - (if (eq (get-text-property pos 'tag-type) 'comment) - (web-mode-tag-beginning) - (goto-char (car - (web-mode-property-boundaries - (if (eq (get-text-property pos 'part-token) 'comment) - 'part-token - 'block-token) - pos)))) - (setq offset (current-column)) - (cond - ((string= web-mode-engine "freemarker") - (setq offset (+ (current-indentation) 2))) - ((member (buffer-substring-no-properties (point) (+ (point) 2)) '("/*" "{*" "@*")) - (cond - ((eq ?\* curr-char) - (setq offset (+ offset 1))) - (t - (setq offset (+ offset 3))) - ) ;cond - ) - ((string= (buffer-substring-no-properties (point) (+ (point) 4)) "" curr-line) - (setq offset offset)) - ((string-match-p "^-" curr-line) - (setq offset (+ offset 3))) - (t - (setq offset (+ offset 5))) - ) ;cond - ) - ((and (string= web-mode-engine "django") (looking-back "{% comment %}" (point-min))) - (setq offset (- offset 12))) - ((and (string= web-mode-engine "mako") (looking-back "<%doc%>" (point-min))) - (setq offset (- offset 6))) - ((and (string= web-mode-engine "mason") (looking-back "<%doc%>" (point-min))) - (setq offset (- offset 6))) - ) ;cond - ) ;case comment - - ((and (string= web-mode-engine "mason") - (string-match-p "^%" curr-line)) - (when debug (message "I140(%S) mason" pos)) - (setq offset 0)) - - ((and (get-text-property pos 'block-beg) - (or (web-mode-block-is-close pos) - (web-mode-block-is-inside pos))) - (when debug (message "I150(%S) block-match" pos)) - (cond - ((not (web-mode-block-match)) - ) - ((and (string= web-mode-engine "closure") - (string-match-p "{\\(case\\|default\\)" curr-line)) - (setq offset (+ (current-indentation) web-mode-markup-indent-offset))) - (t - (setq offset (current-indentation)) - (if (and (string= web-mode-engine "blade") - (string-match-p "@break" curr-line)) - (setq offset (+ (current-indentation) offset))) - ) - ) ;cond - ) - - ((eq (get-text-property pos 'block-token) 'delimiter-end) - (when debug (message "I160(%S) block-beginning" pos)) - (when (web-mode-block-beginning) - (setq reg-col (current-indentation)) - (setq offset (current-column)))) - - ((or (and (get-text-property pos 'tag-beg) - (eq (get-text-property pos 'tag-type) 'end)) - (and (eq (get-text-property pos 'tag-type) 'comment) - (string-match-p "" (point)) - (web-mode-insert-text-at-pos "" (point)) - (web-mode-insert-text-at-pos "") - (search-backward " -->") - ) ;case html - ) ;cond - )) - -(defun web-mode-comment (pos) - (let (ctx language col sel beg end tmp block-side single-line-block pos-after content) - - (setq pos-after pos) - - (setq block-side (get-text-property pos 'block-side)) - (setq single-line-block (web-mode-is-single-line-block pos)) - - (cond - - ((and block-side (string= web-mode-engine "erb")) - (web-mode-comment-erb-block pos) - ) - - ((and block-side (string= web-mode-engine "artanis")) - (web-mode-comment-artanis-block pos) - ) - - ((and single-line-block block-side - (intern-soft (concat "web-mode-comment-" web-mode-engine "-block"))) - (funcall (intern (concat "web-mode-comment-" web-mode-engine "-block")) pos) - ) - - (t - (setq ctx (web-mode-point-context - (if mark-active (region-beginning) (line-beginning-position)))) - (setq language (plist-get ctx :language)) - (setq col (current-column)) - (cond - (mark-active - ;;(message "%S %S" (point) col) - ) - ((and (member language '("html" "xml")) - (get-text-property (progn (back-to-indentation) (point)) 'tag-beg)) - (web-mode-element-select)) - (t - (end-of-line) - (set-mark (line-beginning-position))) - ) ;cond - - (setq beg (region-beginning) - end (region-end)) - - (when (> (point) (mark)) - (exchange-point-and-mark)) - - (if (and (eq (char-before end) ?\n) - (not (eq (char-after end) ?\n))) - (setq end (1- end))) - - (setq sel (buffer-substring-no-properties beg end)) - - (cond - - ((member language '("html" "xml")) - (cond - ((and (= web-mode-comment-style 2) (string= web-mode-engine "django")) - (setq content (concat "{# " sel " #}"))) - ((and (= web-mode-comment-style 2) (member web-mode-engine '("ejs" "erb"))) - (setq content (concat "<%# " sel " %>"))) - ((and (= web-mode-comment-style 2) (string= web-mode-engine "artanis")) - (setq content (concat "<%; " sel " %>"))) - ((and (= web-mode-comment-style 2) (string= web-mode-engine "aspx")) - (setq content (concat "<%-- " sel " --%>"))) - ((and (= web-mode-comment-style 2) (string= web-mode-engine "smarty")) - (setq content (concat "{* " sel " *}"))) - ((and (= web-mode-comment-style 2) (string= web-mode-engine "expressionengine")) - (setq content (concat "{!-- " sel " --}"))) - ((and (= web-mode-comment-style 2) (string= web-mode-engine "xoops")) - (setq content (concat "<{* " sel " *}>"))) - ((and (= web-mode-comment-style 2) (string= web-mode-engine "hero")) - (setq content (concat "<%# " sel " %>"))) - ((and (= web-mode-comment-style 2) (string= web-mode-engine "blade")) - (setq content (concat "{{-- " sel " --}}"))) - ((and (= web-mode-comment-style 2) (string= web-mode-engine "ctemplate")) - (setq content (concat "{{!-- " sel " --}}"))) - ((and (= web-mode-comment-style 2) (string= web-mode-engine "razor")) - (setq content (concat "@* " sel " *@"))) - (t - (setq content (concat "")) - (when (< (length sel) 1) - (search-backward " -->") - (setq pos-after nil)) - )) - ) ;case html - - ((member language '("php" "javascript" "java" "jsx")) - (let (alt) - (setq alt (cdr (assoc language web-mode-comment-formats))) - ;;(message "alt=%S sel=%S col=%S" alt sel col) - (cond - ((and alt (string= alt "//")) - (setq content (replace-regexp-in-string (concat "\n[ ]\\{" (number-to-string col) "\\}") "\n" sel)) - (setq content (replace-regexp-in-string (concat "\n") "\n// " content)) - (setq content (concat "// " content))) - ((get-text-property pos 'jsx-depth) - (setq content (concat "{/* " sel " */}"))) - (web-mode-comment-prefixing - (setq content (replace-regexp-in-string (concat "\n[ ]\\{" (number-to-string col) "\\}") "\n* " sel)) - (setq content (concat "/* " content " */"))) - (t - (setq content (concat "/* " sel " */"))) - ) ;cond - ) ;let - ) - - ((member language '("erb")) - (setq content (replace-regexp-in-string "^[ ]*" "#" sel))) - - ((member language '("asp")) - (setq content (replace-regexp-in-string "^[ ]*" "''" sel))) - - (t - (setq content (concat "/* " sel " */"))) - - ) ;cond - - (when content - (delete-region beg end) - (deactivate-mark) - (let (beg end) - (setq beg (point-at-bol)) - (insert content) - (setq end (point-at-eol)) - (indent-region beg end) - ) - ) ;when - - ) ;t - ) ;cond - - (when pos-after (goto-char pos-after)) - - )) - -(defun web-mode-comment-ejs-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos "//" (+ beg 2)))) - -(defun web-mode-comment-erb-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos "#" (+ beg 2)))) - -(defun web-mode-comment-artanis-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos ";" (+ beg 2)))) - -(defun web-mode-comment-django-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos "#" end) - (web-mode-insert-text-at-pos "#" (1+ beg)))) - -(defun web-mode-comment-dust-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos "!" end) - (web-mode-insert-text-at-pos "!" (1+ beg)))) - -(defun web-mode-comment-aspx-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos "#" end) - (web-mode-insert-text-at-pos "#" (1+ beg)))) - -(defun web-mode-comment-jsp-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos "--" (+ beg 2)))) - -(defun web-mode-comment-go-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos "*/" (1- end)) - (web-mode-insert-text-at-pos "/*" (+ beg (if (web-mode-looking-at "{{" beg) 2 0))))) - -(defun web-mode-comment-php-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos "*/" (- end 2)) - (web-mode-insert-text-at-pos "/*" (+ beg 1 (if (web-mode-looking-at "<\\?php" beg) 5 3))))) - -(defun web-mode-comment-svelte-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-insert-text-at-pos "!" end) - (web-mode-insert-text-at-pos "!" (1+ beg)))) - -(defun web-mode-comment-boundaries (&optional pos) - (interactive) - (unless pos (setq pos (point))) - (let ((beg pos) (end pos) prop) - (save-excursion - (goto-char pos) - (setq prop - (cond - ((eq (get-text-property pos 'block-token) 'comment) 'block-token) - ((eq (get-text-property pos 'tag-type) 'comment) 'tag-type) - ((eq (get-text-property pos 'part-token) 'comment) 'part-token) - (t nil) - )) - (if (null prop) - (setq beg nil - end nil) - (when (and (not (bobp)) - (eq (get-text-property pos prop) (get-text-property (1- pos) prop))) - (setq beg (or (previous-single-property-change pos prop) (point-min)))) - (when (and (not (eobp)) - (eq (get-text-property pos prop) (get-text-property (1+ pos) prop))) - (setq end (or (next-single-property-change pos prop) (point-max))))) - (message "beg(%S) end(%S) point-max(%S)" beg end (point-max)) - (when (and beg (string= (buffer-substring-no-properties beg (+ beg 2)) "//")) - (goto-char end) - (while (and (looking-at-p "\n[ ]*//") - (not (eobp))) - (search-forward "//") - (backward-char 2) - ;;(message "%S" (point)) - (setq end (next-single-property-change (point) prop)) - (goto-char end) - ;;(message "%S" (point)) - ) ;while - ) ;when - ;;(when end (setq end (1- end))) ;; #1021 - ) ;save-excursion - ;;(message "beg=%S end=%S" beg end) - (if (and beg end) (cons beg end) nil) - )) - -(defun web-mode-uncomment (pos) - (let ((beg pos) (end pos) (sub2 "") comment boundaries) - (save-excursion - (cond - ((and (get-text-property pos 'block-side) - (intern-soft (concat "web-mode-uncomment-" web-mode-engine "-block"))) - (funcall (intern (concat "web-mode-uncomment-" web-mode-engine "-block")) pos)) - ((and (setq boundaries (web-mode-comment-boundaries pos)) - (setq beg (car boundaries)) - (setq end (1+ (cdr boundaries))) - (> (- end beg) 4)) - (message "%S" boundaries) - ;;(message "beg(%S) end(%S)" beg end) - (setq comment (buffer-substring-no-properties beg end)) - (setq sub2 (substring comment 0 2)) - (cond - ((member sub2 '("$\\)" "" comment))) - ((string= sub2 "{#") - (setq comment (replace-regexp-in-string "\\(^{#[ ]?\\|[ ]?#}$\\)" "" comment))) - ((string= sub2 "{/") ;jsx comments - (setq comment (replace-regexp-in-string "\\(^{/\\*[ ]?\\|[ ]?\\*/}$\\)" "" comment))) - ((string= sub2 "/*") - ;;(message "%S" comment) - ;;(setq comment (replace-regexp-in-string "\\(\\*/\\|^/\\*[ ]?\\|^[ \t]*\\*\\)" "" comment)) - (setq comment (replace-regexp-in-string "\\([ ]?\\*/$\\|^/\\*[ ]?\\)" "" comment)) - (setq comment (replace-regexp-in-string "\\(^[ \t]*\\*\\)" "" comment)) - ;;(message "%S" comment) - ) - ((string= sub2 "//") - (setq comment (replace-regexp-in-string "^ *//" "" comment))) - ) ;cond - (delete-region beg end) - (web-mode-insert-and-indent comment) - (goto-char beg) - ) - ) ;cond - (indent-according-to-mode) - ))) - -(defun web-mode-uncomment-erb-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (cond - ((string= (buffer-substring-no-properties beg (+ beg 4)) "<%#=") - (web-mode-remove-text-at-pos 1 (+ beg 2))) - ((string-match-p "<[%[:alpha:]]" (buffer-substring-no-properties (+ beg 2) (- end 2))) - (web-mode-remove-text-at-pos 2 (1- end)) - (web-mode-remove-text-at-pos 3 beg)) - (t - (web-mode-remove-text-at-pos 1 (+ beg 2))) - ) ;cond - ) - ) - -(defun web-mode-uncomment-artanis-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (cond - ((string= (buffer-substring-no-properties beg (+ beg 4)) "<%;=") - (web-mode-remove-text-at-pos 1 (+ beg 2))) - ((string-match-p "<[%[:alpha:]]" (buffer-substring-no-properties (+ beg 2) (- end 2))) - (web-mode-remove-text-at-pos 2 (1- end)) - (web-mode-remove-text-at-pos 3 beg)) - (t - (web-mode-remove-text-at-pos 1 (+ beg 2))) - ) ;cond - ) - ) - -(defun web-mode-uncomment-ejs-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-remove-text-at-pos 1 (+ beg 2)))) - -(defun web-mode-uncomment-django-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (cond - ((web-mode-looking-at-p "{#[{%]" beg) - (web-mode-remove-text-at-pos 1 (1- end)) - (web-mode-remove-text-at-pos 1 (1+ beg)) - ) - (t - (web-mode-remove-text-at-pos 2 (1- end)) - (web-mode-remove-text-at-pos 2 beg)) - ) ;cond - )) - -(defun web-mode-uncomment-ctemplate-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-remove-text-at-pos 5 (- end 4)) - (web-mode-remove-text-at-pos 5 beg))) - -(defun web-mode-uncomment-dust-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-remove-text-at-pos 1 (1- end)) - (web-mode-remove-text-at-pos 1 (1+ beg)))) - -(defun web-mode-uncomment-aspx-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-remove-text-at-pos 1 (1- end)) - (web-mode-remove-text-at-pos 1 (1+ beg)))) - -(defun web-mode-uncomment-jsp-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-remove-text-at-pos 2 (+ beg 2)))) - -(defun web-mode-uncomment-go-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-remove-text-at-pos 2 (+ beg 2)) - (web-mode-remove-text-at-pos 2 (- end 5)))) - -(defun web-mode-uncomment-svelte-block (pos) - (let (beg end) - (setq beg (web-mode-block-beginning-position pos) - end (web-mode-block-end-position pos)) - (web-mode-remove-text-at-pos 1 (1- end)) - (web-mode-remove-text-at-pos 1 (1+ beg)))) - -(defun web-mode-snippet-names () - (let (codes) - (dolist (snippet web-mode-snippets) - (add-to-list 'codes (car snippet) t)) - codes)) - -(defun web-mode-snippet-insert (code) - "Insert a snippet." - (interactive - (list (completing-read "Snippet: " (web-mode-snippet-names)))) - (let (beg - (continue t) - (counter 0) - end - sel - snippet - (l (length web-mode-snippets)) - pos) - (when mark-active - (setq sel (web-mode-trim (buffer-substring-no-properties - (region-beginning) (region-end)))) - (delete-region (region-beginning) (region-end))) - (while (and continue (< counter l)) - (setq snippet (nth counter web-mode-snippets)) - (when (string= (car snippet) code) - (setq continue nil)) - (setq counter (1+ counter))) - (when snippet - (setq snippet (cdr snippet)) - (setq beg (point-at-bol)) - (insert snippet) - (setq pos (point) - end (point)) - (cond - ((string-match-p "¦" snippet) - (search-backward "¦") - (delete-char 1) - (setq pos (point) - end (1- end))) - ((string-match-p "|" snippet) - (search-backward "|") - (delete-char 1) - (setq pos (point) - end (1- end))) - ) ;cond - (when sel - (insert sel) - (setq pos (point) - end (+ end (length sel)))) - (goto-char end) - (setq end (point-at-eol)) - (unless sel (goto-char pos)) - (indent-region beg end)) - )) - -(defun web-mode-looking-at (regexp pos) - (save-excursion - (goto-char pos) - (looking-at regexp))) - -(defun web-mode-looking-at-p (regexp pos) - (save-excursion - (goto-char pos) - (looking-at-p regexp))) - -(defun web-mode-looking-back (regexp pos &optional limit greedy) - (save-excursion - (goto-char pos) - (if limit - (looking-back regexp limit greedy) - (looking-back regexp (point-min))))) - -(defun web-mode-insert-text-at-pos (text pos) - (let ((mem web-mode-enable-auto-pairing)) - (setq web-mode-enable-auto-pairing nil) - (save-excursion - (goto-char pos) - (insert text) - (setq web-mode-enable-auto-pairing mem) - ))) - -(defun web-mode-remove-text-at-pos (n &optional pos) - (unless pos (setq pos (point))) - (delete-region pos (+ pos n))) - -(defun web-mode-insert-and-indent (text) - (let (beg end) - (setq beg (point-at-bol)) - (insert text) - (setq end (point-at-eol)) - (indent-region beg end) - )) - -(defun web-mode-column-at-pos (pos) - (save-excursion - (goto-char pos) - (current-column))) - -(defun web-mode-indentation-at-pos (pos) - (save-excursion - (goto-char pos) - (current-indentation))) - -(defun web-mode-navigate (&optional pos) - "Move point to the matching opening/closing tag/block." - (interactive) - (unless pos (setq pos (point))) - (let (init) - (goto-char pos) - (setq init (point)) - (when (> (current-indentation) (current-column)) - (back-to-indentation)) - (setq pos (point)) - (cond - ((and (get-text-property pos 'block-side) - (web-mode-block-beginning) - (web-mode-block-controls-get (point))) - (web-mode-block-match)) - ((member (get-text-property pos 'tag-type) '(start end)) - (web-mode-tag-beginning) - (web-mode-tag-match)) - (t - (goto-char init)) - ) - )) - -(defun web-mode-block-match (&optional pos) - (unless pos (setq pos (point))) - (let (pos-ori controls control (counter 1) type (continue t) pair) - (setq pos-ori pos) - (goto-char pos) - (setq controls (web-mode-block-controls-get pos)) - ;;(message "controls=%S" controls) - (cond - (controls - (setq pair (car controls)) - (setq control (cdr pair)) - (setq type (car pair)) - (when (eq type 'inside) (setq type 'close)) - (while continue - (cond - ((and (> pos-ori 1) (bobp)) - (setq continue nil)) - ((or (and (eq type 'open) (not (web-mode-block-next))) - (and (eq type 'close) (not (web-mode-block-previous)))) - (setq continue nil) - ) - ((null (setq controls (web-mode-block-controls-get (point)))) - ) - (t - ;;TODO : est il nécessaire de faire un reverse sur controls si on doit matcher backward - (dolist (pair controls) - (cond - ((not (string= (cdr pair) control)) - ) - ((eq (car pair) 'inside) - ) - ((eq (car pair) type) - (setq counter (1+ counter))) - (t - (setq counter (1- counter))) - ) - ) ;dolist - (when (= counter 0) - (setq continue nil)) - ) ;t - ) ;cond - ) ;while - (if (= counter 0) (point) nil) - ) ;controls - (t - (goto-char pos-ori) - nil - ) ;controls = nul - ) ;conf - )) - -(defun web-mode-tag-match (&optional pos) - "Move point to the matching opening/closing tag." - (interactive) - (unless pos (setq pos (point))) - (let (regexp name) - (cond - ((eq (get-text-property pos 'tag-type) 'void) - (web-mode-tag-beginning)) - ((and (eq (get-text-property pos 'tag-type) 'comment) - (web-mode-looking-at-p " %S %S" pos (get-text-property pos 'jsx-depth)) - ) - ((and blockside - (member (get-text-property pos 'block-token) '(string comment)) - (eq (get-text-property pos 'block-token) (get-text-property (1- pos) 'block-token))) - (setq pos (web-mode-block-token-beginning-position pos))) - ((and (not blockside) - (member (get-text-property pos 'part-token) '(string comment)) - (eq (get-text-property pos 'part-token) (get-text-property (1- pos) 'part-token))) - (setq pos (web-mode-part-token-beginning-position pos))) - ((and (not blockside) - (get-text-property pos 'block-side)) - (when (setq pos (web-mode-block-beginning-position pos)) - (setq pos (1- pos)))) - ((member char '(?\) ?\] ?\})) - (setq pos (web-mode-part-opening-paren-position pos reg-beg)) - (setq pos (1- pos))) - ((and (eq char ?\=) - (web-mode-looking-back "[<>!=]+" pos reg-beg t)) - (setq pos (- pos 1 (length (match-string-no-properties 0))))) - ((member char '(?\( ?\{ ?\[ ?\= ?\< ?\>)) - (web-mode-looking-at ".[ \t\n]*" pos) - (setq continue nil - pos (+ pos (length (match-string-no-properties 0))))) - - ((web-mode-looking-at "\\(return\\)[ \n]" pos) - (setq continue nil - pos (+ pos (length (match-string-no-properties 0))))) - ((and (eq char ?\:) - (web-mode-looking-back "[{,][ \t\n]*[[:alnum:]_]+[ ]*" pos)) - (web-mode-looking-at ".[ \t\n]*" pos) - (setq continue nil - pos (+ pos (length (match-string-no-properties 0))))) - (t - (setq pos (web-mode-rsb-position pos regexp reg-beg)) - (when (not pos) - (cond - (is-jsx - (when (web-mode-looking-at "[ \n]*" reg-beg) - (setq pos (+ reg-beg (length (match-string-no-properties 0))))) - (setq continue nil)) - (t - (message "javascript-statement-beginning-position ** search failure **") - (setq continue nil - pos reg-beg)) - ) ;cond - ) - ) ;t - ) ;cond - ) ;while - ;;(message "%S -------" pos) - pos)) - -(defun web-mode-javascript-args-beginning-position (pos &optional reg-beg) - (unless pos (setq pos (point))) - (setq pos (1- pos)) - (let ((char nil) - (blockside (get-text-property pos 'block-side)) - (i 0) - (continue (not (null pos)))) - (unless reg-beg - (if blockside - (setq reg-beg (web-mode-block-beginning-position pos)) - (setq reg-beg (web-mode-part-beginning-position pos))) - ) - (while continue - (setq char (char-after pos)) - ;;(message "pos(%S) char(%c)" pos char) - (cond - ((> (setq i (1+ i)) 20000) - (message "javascript-args-beginning-position ** warning (%S) **" pos) - (setq continue nil - pos nil)) - ((null pos) - (message "javascript-args-beginning-position ** invalid pos **") - (setq continue nil)) - ((< pos reg-beg) - (message "javascript-args-beginning-position ** failure(position) **") - (setq continue nil - pos reg-beg)) - ((and blockside - (member (get-text-property pos 'block-token) '(string comment)) - (eq (get-text-property pos 'block-token) (get-text-property (1- pos) 'block-token))) - (setq pos (web-mode-block-token-beginning-position pos))) - ((and (not blockside) - (member (get-text-property pos 'part-token) '(string comment)) - (eq (get-text-property pos 'part-token) (get-text-property (1- pos) 'part-token))) - (setq pos (web-mode-part-token-beginning-position pos))) - ((and (not blockside) - (get-text-property pos 'block-side)) - (when (setq pos (web-mode-block-beginning-position pos)) - (setq pos (1- pos))) - ) - ((member char '(?\) ?\] ?\})) - (when (setq pos (web-mode-part-opening-paren-position pos reg-beg)) - (setq pos (1- pos)))) - ((member char '(?\( ?\[ ?\{)) - (web-mode-looking-at ".[ ]*" pos) - (setq pos (+ pos (length (match-string-no-properties 0))) - continue nil) - ) - ((web-mode-looking-at "\\(var\\|let\\|return\\|const\\)[ \n]" pos) - (setq pos (+ pos (length (match-string-no-properties 0))) - continue nil)) - (t - (setq pos (web-mode-rsb-position pos "[\]\[}{)(]\\|\\(var\\|let\\|return\\|const\\)" reg-beg)) - (when (not pos) - (message "javascript-args-beginning-position ** search failure **") - (setq continue nil - pos reg-beg))) - ) ;cond - ) ;while - ;;(message "=%S" pos) - pos)) - -(defun web-mode-javascript-calls-beginning-position (pos &optional reg-beg) - (unless pos (setq pos (point))) - ;;(message "pos=%S" pos) - (let ((char nil) - (dot-pos nil) - (blockside (get-text-property pos 'block-side)) - (i 0) - (continue (not (null pos)))) - (unless reg-beg - (setq reg-beg (if blockside - (web-mode-block-beginning-position pos) - (web-mode-part-beginning-position pos)))) - (while continue - (setq char (char-after pos)) - ;;(message "%S| %S=%c" reg-beg pos char) - (cond - ((> (setq i (1+ i)) 20000) - (message "javascript-calls-beginning-position ** warning (%S) **" pos) - (setq continue nil - pos nil)) - ((null pos) - (message "javascript-calls-beginning-position ** invalid pos **") - (setq continue nil)) - ((< pos reg-beg) - (setq continue nil - pos reg-beg)) - ((and blockside - (member (get-text-property pos 'block-token) '(string comment)) - (eq (get-text-property pos 'block-token) (get-text-property (1- pos) 'block-token))) - (setq pos (web-mode-block-token-beginning-position pos))) - ((and (not blockside) - (member (get-text-property pos 'part-token) '(string comment)) - (eq (get-text-property pos 'part-token) (get-text-property (1- pos) 'part-token))) - (setq pos (web-mode-part-token-beginning-position pos))) - ((and (not blockside) - (get-text-property pos 'block-side)) - (when (setq pos (web-mode-block-beginning-position pos)) - (setq pos (1- pos)))) - ((and (member char '(?\.)) (> i 1)) - (setq dot-pos pos - pos (1- pos))) - ((member char '(?\) ?\])) - (when (setq pos (web-mode-part-opening-paren-position pos reg-beg)) - (setq pos (1- pos))) - ) - ((member char '(?\( ?\{ ?\} ?\[ ?\= ?\? ?\: ?\; ?\, ?\& ?\| ?\>)) - (web-mode-looking-at ".[ \t\n]*" pos) - (setq pos (+ pos (length (match-string-no-properties 0))) - continue nil)) - ((web-mode-looking-at "\\(return\\|else\\|const\\)[ \n]" pos) - (setq pos (+ pos (length (match-string-no-properties 0))) - continue nil)) - (t - (setq pos (web-mode-rsb-position pos "[\]\[}{)(=?:;,&|>.]\\|\\(return\\|else\\|const\\)" reg-beg)) - (when (not pos) - (message "javascript-calls-beginning-position ** search failure **") - (setq pos reg-beg - continue nil)) - ) ;t - ) ;cond - ) ;while - ;;(message "pos=%S dot-pos=%S" pos dot-pos) - (if (null pos) pos (cons pos dot-pos)) - )) - -(defun web-mode-is-css-string (pos) - (let (beg) - (cond - ((and (setq beg (web-mode-part-token-beginning-position pos)) - (web-mode-looking-at-p "`" beg) - (web-mode-looking-back "\\(styled[[:alnum:].]+\\|css\\)" beg)) - beg) - (t - nil) - ) ;cond - )) - -;; Relay.QL , gql, graphql -(defun web-mode-is-ql-string (pos prefix-regexp) - (let (beg) - (cond - ((and (setq beg (web-mode-part-token-beginning-position pos)) - (web-mode-looking-back prefix-regexp beg)) - beg) - (t - nil) - ) ;cond - )) - -(defun web-mode-is-html-string (pos) - (let (beg) - (cond - ((and (setq beg (web-mode-part-token-beginning-position pos)) - (web-mode-looking-at-p "`[ \t\n]*<[a-zA-Z]" beg) - (web-mode-looking-back "\\(template\\|html\\)\\([ ]*[=:][ ]*\\)?" beg)) - beg) - (t - nil) - ) ;cond - )) - -(defun web-mode-part-token-beginning-position (&optional pos) - (unless pos (setq pos (point))) - (cond - ((not (get-text-property pos 'part-token)) - nil) - ((or (= pos (point-min)) - (and (> pos (point-min)) - (not (get-text-property (1- pos) 'part-token)))) - pos) - (t - (setq pos (previous-single-property-change pos 'part-token)) - (if (and pos (> pos (point-min))) pos (point-min))) - )) - -(defun web-mode-part-token-end-position (&optional pos) - (unless pos (setq pos (point))) - (cond - ((not (get-text-property pos 'part-token)) - nil) - ((or (= pos (point-max)) - (not (get-text-property (1+ pos) 'part-token))) - pos) - (t - (1- (next-single-property-change pos 'part-token))) - )) - -(defun web-mode-block-token-beginning-position (&optional pos) - (unless pos (setq pos (point))) - (cond - ((not (get-text-property pos 'block-token)) - nil) - ((or (= pos (point-min)) - (and (> pos (point-min)) - (not (get-text-property (1- pos) 'block-token)))) - pos) - (t - (setq pos (previous-single-property-change pos 'block-token)) - (if (and pos (> pos (point-min))) pos (point-min))) - )) - -(defun web-mode-block-token-end-position (&optional pos) - (unless pos (setq pos (point))) - (cond - ((not (get-text-property pos 'block-token)) - nil) - ((or (= pos (point-max)) - (not (get-text-property (1+ pos) 'block-token))) - pos) - (t - (1- (next-single-property-change pos 'block-token))) - )) - -(defun web-mode-block-code-end-position (&optional pos) - (unless pos (setq pos (point))) - (setq pos (web-mode-block-end-position pos)) - (cond - ((not pos) - nil) - ((and (eq (get-text-property pos 'block-token) 'delimiter-end) - (eq (get-text-property (1- pos) 'block-token) 'delimiter-end)) - (previous-single-property-change pos 'block-token)) - ((= pos (1- (point-max))) ;; TODO: comparer plutot avec line-end-position - (point-max)) - (t - pos) - )) - -(defun web-mode-block-end-position (&optional pos) - (unless pos (setq pos (point))) - (cond - ((get-text-property pos 'block-end) - pos) - ((get-text-property pos 'block-side) - (or (next-single-property-change pos 'block-end) - (point-max))) - (t - nil) - )) - -(defun web-mode-block-previous-position (&optional pos) - (unless pos (setq pos (point))) - (cond - ((= pos (point-min)) - (setq pos nil)) - ((get-text-property pos 'block-side) - (setq pos (web-mode-block-beginning-position pos)) - (cond - ((or (null pos) (= pos (point-min))) - (setq pos nil) - ) - ((and (setq pos (previous-single-property-change pos 'block-beg)) - (> pos (point-min))) - (setq pos (1- pos)) - ) - ) - ) ;block-side - ((get-text-property (1- pos) 'block-side) - (setq pos (web-mode-block-beginning-position (1- pos))) - ) - (t - (setq pos (previous-single-property-change pos 'block-side)) - (cond - ((and (null pos) (get-text-property (point-min) 'block-beg)) - (setq pos (point-min))) - ((and pos (> pos (point-min))) - (setq pos (web-mode-block-beginning-position (1- pos)))) - ) - ) - ) ;conf - pos) - -(defun web-mode-block-next-position (&optional pos limit) - (unless pos (setq pos (point))) - (unless limit (setq limit (point-max))) - (cond - ((and (get-text-property pos 'block-side) - (setq pos (web-mode-block-end-position pos)) - (< pos (point-max)) - (setq pos (1+ pos))) - (unless (get-text-property pos 'block-beg) - (setq pos (next-single-property-change pos 'block-side))) - ) - (t - (setq pos (next-single-property-change pos 'block-side))) - ) ;cond - (if (and pos (<= pos limit)) pos nil)) - -;;---- EXCURSION --------------------------------------------------------------- - -(defun web-mode-backward-sexp (n) - (interactive "p") - (if (< n 0) (web-mode-forward-sexp (- n)) - (let (pos) - (dotimes (_ n) - (skip-chars-backward "[:space:]") - (setq pos (point)) - (cond - ((bobp) nil) - ((get-text-property (1- pos) 'block-end) - (backward-char 1) - (web-mode-block-beginning)) - ((get-text-property (1- pos) 'block-token) - (backward-char 1) - (web-mode-block-token-beginning)) - ((get-text-property (1- pos) 'part-token) - (backward-char 1) - (web-mode-part-token-beginning)) - ((get-text-property (1- pos) 'tag-end) - (backward-char 1) - (web-mode-element-beginning)) - ((get-text-property (1- pos) 'tag-attr) - (backward-char 1) - (web-mode-attribute-beginning)) - ((get-text-property (1- pos) 'tag-type) - (backward-char 1) - (web-mode-tag-beginning)) - ((get-text-property (1- pos) 'jsx-end) - (backward-char 1) - (web-mode-jsx-beginning)) - (t - (let ((forward-sexp-function nil)) - (backward-sexp)) - ) ;case t - ) ;cond - ) ;dotimes - ))) ;let if defun - -(defun web-mode-forward-sexp (n) - (interactive "p") - (if (< n 0) (web-mode-backward-sexp (- n)) - (let (pos) - (dotimes (_ n) - (skip-chars-forward "[:space:]") - (setq pos (point)) - (cond - ((eobp) nil) - ((get-text-property pos 'block-beg) - (web-mode-block-end)) - ((get-text-property pos 'block-token) - (web-mode-block-token-end)) - ((get-text-property pos 'part-token) - (web-mode-part-token-end)) - ((get-text-property pos 'tag-beg) - (web-mode-element-end)) - ((get-text-property pos 'tag-attr) - (web-mode-attribute-end)) - ((get-text-property pos 'tag-type) - (web-mode-tag-end)) - ((get-text-property pos 'jsx-beg) - (web-mode-jsx-end)) - (t - (let ((forward-sexp-function nil)) - (forward-sexp)) - ) ;case t - ) ;cond - ) ;dotimes - ))) ;let if defun - -(defun web-mode-comment-beginning () - "Fetch current comment beg." - (interactive) - (web-mode-go (web-mode-comment-beginning-position (point)))) - -(defun web-mode-comment-end () - "Fetch current comment end." - (interactive) - (web-mode-go (web-mode-comment-end-position (point)) 1)) - -(defun web-mode-tag-beginning () - "Fetch current html tag beg." - (interactive) - (web-mode-go (web-mode-tag-beginning-position (point)))) - -(defun web-mode-tag-end () - "Fetch current html tag end." - (interactive) - (web-mode-go (web-mode-tag-end-position (point)) 1)) - -(defun web-mode-tag-previous () - "Fetch previous tag." - (interactive) - (web-mode-go (web-mode-tag-previous-position (point)))) - -(defun web-mode-tag-next () - "Fetch next tag. Might be html comment or server tag (e.g. jsp)." - (interactive) - (web-mode-go (web-mode-tag-next-position (point)))) - -(defun web-mode-attribute-beginning () - "Fetch html attribute beginning." - (interactive) - (web-mode-go (web-mode-attribute-beginning-position (point)))) - -(defun web-mode-attribute-end () - "Fetch html attribute end." - (interactive) - (web-mode-go (web-mode-attribute-end-position (point)) 1)) - -(defun web-mode-attribute-next (&optional arg) - "Fetch next attribute." - (interactive "p") - (unless arg (setq arg 1)) - (cond - ((= arg 1) (web-mode-go (web-mode-attribute-next-position (point)))) - ((< arg 1) (web-mode-element-previous (* arg -1))) - (t - (while (>= arg 1) - (setq arg (1- arg)) - (web-mode-go (web-mode-attribute-next-position (point))) - ) - ) - ) - ) - -(defun web-mode-attribute-previous (&optional arg) - "Fetch previous attribute." - (interactive "p") - (unless arg (setq arg 1)) - (unless arg (setq arg 1)) - (cond - ((= arg 1) (web-mode-go (web-mode-attribute-previous-position (point)))) - ((< arg 1) (web-mode-element-next (* arg -1))) - (t - (while (>= arg 1) - (setq arg (1- arg)) - (web-mode-go (web-mode-attribute-previous-position (point))) - ) - ) - ) - ) - -(defun web-mode-element-previous (&optional arg) - "Fetch previous element." - (interactive "p") - (unless arg (setq arg 1)) - (cond - ((= arg 1) (web-mode-go (web-mode-element-previous-position (point)))) - ((< arg 1) (web-mode-element-next (* arg -1))) - (t - (while (>= arg 1) - (setq arg (1- arg)) - (web-mode-go (web-mode-element-previous-position (point))) - ) ;while - ) ;t - ) ;cond - ) - -(defun web-mode-element-next (&optional arg) - "Fetch next element." - (interactive "p") - (unless arg (setq arg 1)) - (cond - ((= arg 1) (web-mode-go (web-mode-element-next-position (point)))) - ((< arg 1) (web-mode-element-previous (* arg -1))) - (t - (while (>= arg 1) - (setq arg (1- arg)) - (web-mode-go (web-mode-element-next-position (point))) - ) ;while - ) ;t - ) ;cond - ) - -(defun web-mode-element-sibling-next () - "Fetch next sibling element." - (interactive) - (let ((pos (point))) - (save-excursion - (cond - ((not (get-text-property pos 'tag-type)) - (if (and (web-mode-element-parent) - (web-mode-tag-match) - (web-mode-tag-next) - (member (get-text-property (point) 'tag-type) '(start void comment))) - (setq pos (point)) - (setq pos nil)) - ) - ((member (get-text-property pos 'tag-type) '(start void)) - (if (and (web-mode-tag-match) - (web-mode-tag-next) - (member (get-text-property (point) 'tag-type) '(start void comment))) - (setq pos (point)) - (setq pos nil)) - ) - ((and (web-mode-tag-next) - (member (get-text-property (point) 'tag-type) '(start void comment))) - (setq pos (point))) - (t - (setq pos nil)) - ) ;cond - ) ;save-excursion - (web-mode-go pos))) - -(defun web-mode-element-sibling-previous () - "Fetch previous sibling element." - (interactive) - (let ((pos (point))) - (save-excursion - (cond - ((not (get-text-property pos 'tag-type)) - (if (and (web-mode-element-parent) - (web-mode-tag-previous) - (web-mode-element-beginning)) - (setq pos (point)) - (setq pos nil)) - ) - ((eq (get-text-property pos 'tag-type) 'start) - (if (and (web-mode-tag-beginning) - (web-mode-tag-previous) - (web-mode-element-beginning)) - (setq pos (point)) - (setq pos nil)) - ) - ((and (web-mode-element-beginning) - (web-mode-tag-previous) - (web-mode-element-beginning)) - (setq pos (point))) - (t - (setq pos nil)) - ) ;cond - ) ;save-excursion - (web-mode-go pos))) - -(defun web-mode-element-beginning () - "Move to beginning of element." - (interactive) - (web-mode-go (web-mode-element-beginning-position (point)))) - -(defun web-mode-element-end () - "Move to end of element." - (interactive) - (web-mode-go (web-mode-element-end-position (point)) 1)) - -(defun web-mode-element-parent () - "Fetch parent element." - (interactive) - (web-mode-go (web-mode-element-parent-position (point)))) - -(defun web-mode-element-child () - "Fetch child element." - (interactive) - (web-mode-go (web-mode-element-child-position (point)))) - -(defun web-mode-dom-traverse () - "Traverse html dom tree." - (interactive) - (cond - ((web-mode-element-child) - ) - ((web-mode-element-sibling-next) - ) - ((and (web-mode-element-parent) - (not (web-mode-element-sibling-next))) - (goto-char (point-min))) - (t - (goto-char (point-min))) - ) ;cond - ) - -(defun web-mode-closing-paren (limit) - (let ((pos (web-mode-closing-paren-position (point) limit))) - (if (or (null pos) (> pos limit)) - nil - (goto-char pos) - pos) - )) - -(defun web-mode-part-next () - "Move point to the beginning of the next part." - (interactive) - (web-mode-go (web-mode-part-next-position (point)))) - -(defun web-mode-part-beginning () - "Move point to the beginning of the current part." - (interactive) - (web-mode-go (web-mode-part-beginning-position (point)))) - -(defun web-mode-part-end () - "Move point to the end of the current part." - (interactive) - (web-mode-go (web-mode-part-end-position (point)) 1)) - -(defun web-mode-block-previous () - "Move point to the beginning of the previous block." - (interactive) - (web-mode-go (web-mode-block-previous-position (point)))) - -(defun web-mode-block-next () - "Move point to the beginning of the next block." - (interactive) - (web-mode-go (web-mode-block-next-position (point)))) - -(defun web-mode-block-beginning () - "Move point to the beginning of the current block." - (interactive) - (web-mode-go (web-mode-block-beginning-position (point)))) - -(defun web-mode-block-end () - "Move point to the end of the current block." - (interactive) - (web-mode-go (web-mode-block-end-position (point)) 1)) - -(defun web-mode-block-token-beginning () - (web-mode-go (web-mode-block-token-beginning-position (point)))) - -(defun web-mode-block-token-end () - (web-mode-go (web-mode-block-token-end-position (point)) 1)) - -(defun web-mode-part-token-beginning () - (web-mode-go (web-mode-part-token-beginning-position (point)))) - -(defun web-mode-part-token-end () - (web-mode-go (web-mode-part-token-end-position (point)) 1)) - -(defun web-mode-block-opening-paren (limit) - (web-mode-go (web-mode-block-opening-paren-position (point) limit))) - -(defun web-mode-block-string-beginning (&optional pos block-beg) - (unless pos (setq pos (point))) - (unless block-beg (setq block-beg (web-mode-block-beginning-position pos))) - (web-mode-go (web-mode-block-string-beginning-position pos block-beg))) - -(defun web-mode-block-statement-beginning (pos block-beg is-ternary) - (unless pos (setq pos (point))) - (unless block-beg (setq block-beg (web-mode-block-beginning-position pos))) - (web-mode-go (web-mode-block-statement-beginning-position pos block-beg is-ternary))) - -(defun web-mode-block-args-beginning (&optional pos block-beg) - (unless pos (setq pos (point))) - (unless block-beg (setq block-beg (web-mode-block-beginning-position pos))) - (web-mode-go (web-mode-block-args-beginning-position pos block-beg))) - -(defun web-mode-block-calls-beginning (&optional pos block-beg) - (unless pos (setq pos (point))) - (unless block-beg (setq block-beg (web-mode-block-beginning-position pos))) - (web-mode-go (web-mode-block-calls-beginning-position pos block-beg))) - -(defun web-mode-javascript-string-beginning (&optional pos reg-beg) - (unless pos (setq pos (point))) - (unless reg-beg - (if (get-text-property pos 'block-side) - (setq reg-beg (web-mode-block-beginning-position pos)) - (setq reg-beg (web-mode-part-beginning-position pos)))) - (web-mode-go (web-mode-javascript-string-beginning-position pos reg-beg))) - -(defun web-mode-javascript-statement-beginning (pos reg-beg is-ternary) - (unless pos (setq pos (point))) - (unless reg-beg - (if (get-text-property pos 'block-side) - (setq reg-beg (web-mode-block-beginning-position pos)) - (setq reg-beg (web-mode-part-beginning-position pos)))) - (web-mode-go (web-mode-javascript-statement-beginning-position pos reg-beg is-ternary))) - -(defun web-mode-javascript-args-beginning (&optional pos reg-beg) - (unless pos (setq pos (point))) - (unless reg-beg - (setq reg-beg (if (get-text-property pos 'block-side) - (web-mode-block-beginning-position pos) - (web-mode-part-beginning-position pos)))) - ;;(message "reg-beg%S" reg-beg) - (web-mode-go (web-mode-javascript-args-beginning-position pos reg-beg))) - -(defun web-mode-javascript-calls-beginning (&optional pos reg-beg) - (unless pos (setq pos (point))) - (unless reg-beg - (if (get-text-property pos 'block-side) - (setq reg-beg (web-mode-block-beginning-position pos)) - (setq reg-beg (web-mode-part-beginning-position pos)))) - (let (pair) - (setq pair (web-mode-javascript-calls-beginning-position pos reg-beg)) - (when pair (web-mode-go (car pair))) - )) - -(defun web-mode-go (pos &optional offset) - (unless offset (setq offset 0)) - (when pos - (cond - ((and (> offset 0) (<= (+ pos offset) (point-max))) - (setq pos (+ pos offset))) - ((and (< offset 0) (>= (+ pos offset) (point-min))) - (setq pos (+ pos offset))) - ) ;cond - (goto-char pos)) - pos) - -;;---- SEARCH ------------------------------------------------------------------ - -(defun web-mode-rsf-balanced (regexp-open regexp-close &optional limit noerror) - (unless noerror (setq noerror t)) - (let ((continue t) - (level 1) - (pos (point)) - ret - (regexp (concat regexp-open "\\|" regexp-close))) - (while continue - (setq ret (re-search-forward regexp limit noerror)) - (cond - ((null ret) - (setq continue nil) - ) - (t - (if (string-match-p regexp-open (match-string-no-properties 0)) - (setq level (1+ level)) - (setq level (1- level))) - (when (< level 1) - (setq continue nil) - ) - ) ;t - ) ;cond - ) ;while - (when (not (= level 0)) (goto-char pos)) - ret)) - -(defun web-mode-block-sb (expr &optional limit noerror) - (unless limit (setq limit (web-mode-block-beginning-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (search-backward expr limit noerror)) - (when (or (null ret) - (not (get-text-property (point) 'block-token))) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-block-sf (expr &optional limit noerror) - (unless limit (setq limit (web-mode-block-end-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (search-forward expr limit noerror)) - (when (or (null ret) - (not (get-text-property (point) 'block-token))) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-block-rsb (regexp &optional limit noerror) - (unless limit (setq limit (web-mode-block-beginning-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (re-search-backward regexp limit noerror)) - (when (or (null ret) - (not (get-text-property (point) 'block-token))) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-block-rsf (regexp &optional limit noerror) - (unless limit (setq limit (web-mode-block-end-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (re-search-forward regexp limit noerror)) - (when (or (null ret) - (not (get-text-property (point) 'block-token))) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-part-sb (expr &optional limit noerror) - (unless limit (setq limit (web-mode-part-beginning-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (search-backward expr limit noerror)) - (when (or (null ret) - (and (not (get-text-property (point) 'part-token)) - (not (get-text-property (point) 'block-side))) - ) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-part-sf (expr &optional limit noerror) - (unless limit (setq limit (web-mode-part-end-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (search-forward expr limit noerror)) - (when (or (null ret) - (and (not (get-text-property (point) 'part-token)) - (not (get-text-property (point) 'block-side))) - ) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-part-rsb (regexp &optional limit noerror) - (unless limit (setq limit (web-mode-part-beginning-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (re-search-backward regexp limit noerror)) - (when (or (null ret) - (and (not (get-text-property (point) 'part-token)) - (not (get-text-property (point) 'block-side))) - ) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-part-rsf (regexp &optional limit noerror) - (unless limit (setq limit (web-mode-part-end-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (re-search-forward regexp limit t)) - (when (or (null ret) - (and (not (get-text-property (point) 'part-token)) - (not (get-text-property (point) 'block-side))) - ) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-javascript-rsb (regexp &optional limit noerror) - (unless limit (setq limit (web-mode-part-beginning-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (re-search-backward regexp limit noerror)) - (when (or (null ret) - (and (not (get-text-property (point) 'part-token)) - (not (get-text-property (point) 'block-side)) - (not (get-text-property (point) 'jsx-depth))) - ) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-javascript-rsf (regexp &optional limit noerror) - (unless limit (setq limit (web-mode-part-end-position (point)))) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (re-search-forward regexp limit t)) - (when (or (null ret) - (and (not (get-text-property (point) 'part-token)) - (not (get-text-property (point) 'block-side)) - (not (get-text-property (point) 'jsx-depth))) - ) - (setq continue nil) - ) ;when - ) ;while - ret)) - -(defun web-mode-dom-sf (expr &optional limit noerror) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (search-forward expr limit noerror)) - (if (or (null ret) - (not (get-text-property (- (point) (length expr)) 'block-side))) - (setq continue nil)) - ) - ret)) - -(defun web-mode-dom-rsf (regexp &optional limit noerror) - (unless noerror (setq noerror t)) - (let ((continue t) (ret nil)) - (while continue - (setq ret (re-search-forward regexp limit noerror)) - ;; (message "ret=%S point=%S limit=%S i=%S" ret (point) limit 0) - (cond - ((null ret) - (setq continue nil)) - ((or (get-text-property (match-beginning 0) 'block-side) - (get-text-property (match-beginning 0) 'part-token)) - ) - (t - (setq continue nil)) - ) ;cond - ) ;while - ret)) - -(defun web-mode-rsb-position (pos regexp &optional limit noerror) - (unless noerror (setq noerror t)) - (save-excursion - (goto-char pos) - (if (re-search-backward regexp limit noerror) (point) nil) - )) - -(defun web-mode-rsb (regexp &optional limit noerror) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (re-search-backward regexp limit noerror)) - (if (or (null ret) - (not (web-mode-is-comment-or-string))) - (setq continue nil))) - ret)) - -(defun web-mode-rsf (regexp &optional limit noerror) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (re-search-forward regexp limit noerror)) - (if (or (null ret) - (not (web-mode-is-comment-or-string))) - (setq continue nil)) - ) - ret)) - -(defun web-mode-sb (expr &optional limit noerror) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (search-backward expr limit noerror)) - (if (or (null ret) - (not (web-mode-is-comment-or-string))) - (setq continue nil))) - ret)) - -(defun web-mode-sf (expr &optional limit noerror) - (unless noerror (setq noerror t)) - (let ((continue t) ret) - (while continue - (setq ret (search-forward expr limit noerror)) - (if (or (null ret) - (not (web-mode-is-comment-or-string))) - (setq continue nil))) - ret)) - -(defun web-mode-content-rsf (regexp &optional limit noerror) - (unless noerror (setq noerror t)) - (let ((continue t) ret beg end) - (while continue - (setq ret (re-search-forward regexp limit noerror) - beg (if (null ret) (point) (match-beginning 0)) - end (if (null ret) (point) (1- (match-end 0)))) - (if (or (null ret) - (and (web-mode-is-content beg) - (web-mode-is-content end))) - (setq continue nil))) - ret)) - -;;---- ADVICES ----------------------------------------------------------------- - -(defadvice ac-start (before web-mode-set-up-ac-sources activate) - "Set `ac-sources' based on current language before running auto-complete." - (when (equal major-mode 'web-mode) - ;; set ignore each time to nil. User has to implement a hook to change it - ;; for each completion - (setq web-mode-ignore-ac-start-advice nil) - (run-hooks 'web-mode-before-auto-complete-hooks) - (unless web-mode-ignore-ac-start-advice - (when web-mode-ac-sources-alist - (let ((new-web-mode-ac-sources - (assoc (web-mode-language-at-pos) - web-mode-ac-sources-alist))) - (setq ac-sources (cdr new-web-mode-ac-sources))))))) - -;;---- MINOR MODE ADDONS ------------------------------------------------------- - -(defun web-mode-yasnippet-exit-hook () - "Yasnippet exit hook" - (when (and (boundp 'yas-snippet-beg) (boundp 'yas-snippet-end)) - (indent-region yas-snippet-beg yas-snippet-end))) - -(defun web-mode-imenu-index () - (interactive) - "Returns imenu items." - (let (toc-index - line) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (setq line (buffer-substring-no-properties - (line-beginning-position) - (line-end-position))) - (let (found - (i 0) - item - regexp - type - type-idx - content - content-idx - content-regexp - close-tag-regexp - concat-str - jumpto - str) - (while (and (not found ) (< i (length web-mode-imenu-regexp-list))) - (setq item (nth i web-mode-imenu-regexp-list)) - (setq regexp (nth 0 item)) - (setq type-idx (nth 1 item)) - (setq content-idx (nth 2 item)) - (setq concat-str (nth 3 item)) - (when (not (numberp content-idx)) - (setq content-regexp (nth 2 item) - close-tag-regexp (nth 4 item) - content-idx nil)) - - (when (string-match regexp line) - - (cond - (content-idx - (setq type (match-string type-idx line)) - (setq content (match-string content-idx line)) - (setq str (concat type concat-str content)) - (setq jumpto (line-beginning-position))) - (t - (let (limit) - (setq type (match-string type-idx line)) - (goto-char (line-beginning-position)) - (save-excursion - (setq limit (re-search-forward close-tag-regexp (point-max) t))) - - (when limit - (when (re-search-forward content-regexp limit t) - (setq content (match-string 1)) - (setq str (concat type concat-str content)) - (setq jumpto (line-beginning-position)) - ) - ))) - ) - (when str (setq toc-index - (cons (cons str jumpto) - toc-index) - ) - (setq found t)) - ) - (setq i (1+ i)))) - (forward-line) - (goto-char (line-end-position)) ;; make sure we are at eobp - )) - (nreverse toc-index))) - -;;---- UNIT TESTING ------------------------------------------------------------ - -(defun web-mode-test () - "Executes web-mode unit tests. See `web-mode-tests-directory'." - (interactive) - (let (files ret regexp) - (setq regexp "^[[:alnum:]][[:alnum:]._]+\\'") - (setq files (directory-files web-mode-tests-directory t regexp)) - (dolist (file files) - (cond - ((eq (string-to-char (file-name-nondirectory file)) ?\_) - (delete-file file)) - (t - (setq ret (web-mode-test-process file))) - ) ;cond - ) ;dolist - )) - -(defun web-mode-test-process (file) - (with-temp-buffer - (let (out sig1 sig2 success err) - (setq-default indent-tabs-mode nil) - (if (string-match-p "sql" file) - (setq web-mode-enable-sql-detection t) - (setq web-mode-enable-sql-detection nil)) - (insert-file-contents file) - (set-visited-file-name file) - (web-mode) - (setq sig1 (md5 (current-buffer))) - (delete-horizontal-space) - (while (not (eobp)) - (forward-line) - (delete-horizontal-space) - (end-of-line)) - (web-mode-buffer-indent) - (setq sig2 (md5 (current-buffer))) - (setq success (string= sig1 sig2)) - (setq out (concat (if success "ok" "ko") " : " (file-name-nondirectory file) "\n")) - (princ out) - (setq err (concat (file-name-directory file) "_err." (file-name-nondirectory file))) - (if success - (when (file-readable-p err) - (delete-file err)) - (write-file err) - (message "[%s]" (buffer-string)) - ) ;if - out))) - -;;---- MISC -------------------------------------------------------------------- - -(defun web-mode-set-engine (engine) - "Set the engine for the current buffer." - (interactive - (list (completing-read - "Engine: " - (let (engines) - (dolist (elt web-mode-engines) - (setq engines (append engines (list (car elt))))) - engines)))) - (setq web-mode-content-type "html" - web-mode-engine (web-mode-engine-canonical-name engine) - web-mode-minor-engine engine) - (web-mode-on-engine-setted) - (web-mode-buffer-highlight)) - -(defun web-mode-set-content-type (content-type) - "Set the content-type for the current buffer" - (interactive (list (completing-read "Content-type: " web-mode-part-content-types))) - (setq web-mode-content-type content-type) - (when (called-interactively-p 'any) - ) - (web-mode-buffer-highlight)) - -(defun web-mode-on-engine-setted () - (let (elt elts engines) - - (when (string= web-mode-engine "razor") (setq web-mode-enable-block-face t)) - ;;(setq web-mode-engine-attr-regexp (cdr (assoc web-mode-engine web-mode-engine-attr-regexps))) - (setq web-mode-engine-token-regexp (cdr (assoc web-mode-engine web-mode-engine-token-regexps))) - - ;;(message "%S %S %S" web-mode-engine web-mode-engine-attr-regexp web-mode-engine-token-regexp) - - (when (null web-mode-minor-engine) - (setq web-mode-minor-engine "none")) - - (setq elt (assoc web-mode-engine web-mode-engine-open-delimiter-regexps)) - (cond - (elt - (setq web-mode-block-regexp (cdr elt))) - ((string= web-mode-engine "archibus") - (setq web-mode-block-regexp nil)) - (t - (setq web-mode-engine "none")) - ) - - (unless (boundp 'web-mode-extra-auto-pairs) - (setq web-mode-extra-auto-pairs nil)) - - (setq web-mode-auto-pairs - (append - (cdr (assoc web-mode-engine web-mode-engines-auto-pairs)) - (cdr (assoc nil web-mode-engines-auto-pairs)) - (cdr (assoc web-mode-engine web-mode-extra-auto-pairs)) - (cdr (assoc nil web-mode-extra-auto-pairs)))) - - (unless (boundp 'web-mode-extra-snippets) - (setq web-mode-extra-snippets nil)) - - (setq elts - (append - (cdr (assoc web-mode-engine web-mode-extra-snippets)) - (cdr (assoc nil web-mode-extra-snippets)) - (cdr (assoc web-mode-engine web-mode-engines-snippets)) - (cdr (assoc nil web-mode-engines-snippets)))) - - ;;(message "%S" elts) - - (dolist (elt elts) - (unless (assoc (car elt) web-mode-snippets) - (setq web-mode-snippets (append (list elt) web-mode-snippets))) - ) - - (setq web-mode-engine-font-lock-keywords - (symbol-value (cdr (assoc web-mode-engine web-mode-engines-font-lock-keywords)))) - - (when (and (string= web-mode-minor-engine "jinja") - (not (member "endtrans" web-mode-django-control-blocks))) - (add-to-list 'web-mode-django-control-blocks "endtrans") - (setq web-mode-django-control-blocks-regexp - (regexp-opt web-mode-django-control-blocks t)) - ) - - (when (string= web-mode-engine "spip") - (modify-syntax-entry ?# "w" (syntax-table))) - -;; (message "%S" (symbol-value (cdr (assoc web-mode-engine web-mode-engines-font-lock-keywords)))) - - )) - -(defun web-mode-detect-engine () - (save-excursion - (goto-char (point-min)) - (when (re-search-forward "-\\*- engine:[ ]*\\([[:alnum:]-]+\\)[ ]*-\\*-" web-mode-chunk-length t) - (setq web-mode-minor-engine (match-string-no-properties 1)) - (setq web-mode-engine (web-mode-engine-canonical-name web-mode-minor-engine))) - web-mode-minor-engine)) - -(defun web-mode-guess-engine-and-content-type () - (let (buff-name elt found) - - (setq buff-name (buffer-file-name)) - (unless buff-name (setq buff-name (buffer-name))) - (setq web-mode-is-scratch (string= buff-name "*scratch*")) - (setq web-mode-content-type nil) - - (when (boundp 'web-mode-content-types-alist) - (setq found nil) - (dolist (elt web-mode-content-types-alist) - (when (and (not found) (string-match-p (cdr elt) buff-name)) - (setq web-mode-content-type (car elt) - found t)) - ) ;dolist - ) ;when - - (unless web-mode-content-type - (setq found nil) - (dolist (elt web-mode-content-types) - (when (and (not found) (string-match-p (cdr elt) buff-name)) - (setq web-mode-content-type (car elt) - found t)) - ) ;dolist - ) ;unless - - (when (boundp 'web-mode-engines-alist) - (setq found nil) - (dolist (elt web-mode-engines-alist) - (cond - ((stringp (cdr elt)) - (when (string-match-p (cdr elt) buff-name) - (setq web-mode-engine (car elt)))) - ((functionp (cdr elt)) - (when (funcall (cdr elt)) - (setq web-mode-engine (car elt)))) - ) ;cond - ) ;dolist - ) ;when - - (unless web-mode-engine - (setq found nil) - (dolist (elt web-mode-engine-file-regexps) - ;;(message "%S %S" (cdr elt) buff-name) - (when (and (not found) (string-match-p (cdr elt) buff-name)) - (setq web-mode-engine (car elt) - found t)) - ) - ) - - (when (and (or (null web-mode-engine) (string= web-mode-engine "none")) - (string-match-p "php" (buffer-substring-no-properties - (line-beginning-position) - (line-end-position)))) - (setq web-mode-engine "php")) - - (when (and (string= web-mode-content-type "javascript") - (string-match-p "@jsx" - (buffer-substring-no-properties - (point-min) - (if (< (point-max) web-mode-chunk-length) - (point-max) - web-mode-chunk-length) - ))) - (setq web-mode-content-type "jsx")) - - (when web-mode-engine - (setq web-mode-minor-engine web-mode-engine - web-mode-engine (web-mode-engine-canonical-name web-mode-engine)) - ) - - (when (and (or (null web-mode-engine) - (string= web-mode-engine "none")) - web-mode-enable-engine-detection) - (web-mode-detect-engine)) - - (web-mode-on-engine-setted) - - )) - -(defun web-mode-engine-canonical-name (name) - (let (engine) - (cond - ((null name) - nil) - ((assoc name web-mode-engines) - name) - (t - (dolist (elt web-mode-engines) - (when (and (null engine) (member name (cdr elt))) - (setq engine (car elt))) - ) ;dolist - engine) - ))) - -(defun web-mode-on-after-save () - (when web-mode-is-scratch - (web-mode-guess-engine-and-content-type) - (web-mode-buffer-highlight)) - nil) - -(defun web-mode-on-exit () - (web-mode-with-silent-modifications - (put-text-property (point-min) (point-max) 'invisible nil) - (remove-overlays) - (remove-hook 'change-major-mode-hook 'web-mode-on-exit t) - )) - -(defun web-mode-file-link (file) - "Insert a link to a file in html document. This function can be -extended to support more filetypes by customizing -`web-mode-links'." - (interactive - (list (file-relative-name (read-file-name "Link file: ")))) - (let ((matched nil) - (point-line (line-number-at-pos)) - (point-column (current-column))) - (dolist (type web-mode-links) - (when (string-match (car type) file) - (setq matched t) - (when (nth 2 type) - (goto-char (point-min)) - (search-forward "") - (backward-char 7) - (open-line 1)) - (insert (format (cadr type) file)) - (indent-for-tab-command) - (when (nth 2 type) - ;; return point where it was and fix indentation - (forward-line) - (indent-for-tab-command) - (if (> point-line (- (line-number-at-pos) 2)) - (forward-line (+ (- point-line (line-number-at-pos)) 1)) - (forward-line (- point-line (line-number-at-pos)))) - (move-to-column point-column)) - ;; move point back if needed - (backward-char (nth 3 type)))) - (when (not matched) - (user-error "Unknown file type")))) - -(defun web-mode-reload () - "Reload web-mode." - (interactive) - (web-mode-with-silent-modifications - (put-text-property (point-min) (point-max) 'invisible nil) - (remove-overlays) - (setq font-lock-unfontify-region-function 'font-lock-default-unfontify-region) - (load "web-mode.el") - (setq web-mode-change-beg nil - web-mode-change-end nil) - (web-mode) - )) - -(defun web-mode-trace (msg) - (let (sub) - (when (null web-mode-time) (setq web-mode-time (current-time))) - (setq sub (time-subtract (current-time) web-mode-time)) - (when nil - (save-excursion - (let ((n 0)) - (goto-char (point-min)) - (while (web-mode-tag-next) - (setq n (1+ n)) - ) - (message "%S tags found" n) - ))) - (message "%18s: time elapsed = %Ss %9Sµs" msg (nth 1 sub) (nth 2 sub)) - )) - -(defun web-mode-reveal () - "Display text properties at point." - (interactive) - (let (symbols out) - (setq out (format - "[point=%S engine=%S minor=%S content-type=%S language-at-pos=%S]\n" - (point) - web-mode-engine - web-mode-minor-engine - web-mode-content-type - (web-mode-language-at-pos (point)))) - (setq symbols (append web-mode-scan-properties '(font-lock-face face))) - (dolist (symbol symbols) - (when symbol - (setq out (concat out (format "%s(%S) " (symbol-name symbol) (get-text-property (point) symbol))))) - ) - (message "%s\n" out) - ;;(message "syntax-class=%S" (syntax-class (syntax-after (point)))) - (message nil))) - -(defun web-mode-debug () - "Display informations useful for debugging." - (interactive) - (let ((modes nil) - (customs '(web-mode-enable-current-column-highlight web-mode-enable-current-element-highlight indent-tabs-mode)) - (ignore '(abbrev-mode auto-composition-mode auto-compression-mode auto-encryption-mode auto-insert-mode blink-cursor-mode column-number-mode delete-selection-mode display-time-mode electric-indent-mode file-name-shadow-mode font-lock-mode global-font-lock-mode global-hl-line-mode line-number-mode menu-bar-mode mouse-wheel-mode recentf-mode show-point-mode tool-bar-mode tooltip-mode transient-mark-mode))) - (message "\n") - (message "--- WEB-MODE DEBUG BEG ---") - (message "versions: emacs(%S.%S) web-mode(%S)" - emacs-major-version emacs-minor-version web-mode-version) - (message "vars: engine(%S) minor(%S) content-type(%S) file(%S)" - web-mode-engine - web-mode-minor-engine - web-mode-content-type - (or (buffer-file-name) (buffer-name))) - (message "system: window(%S) config(%S)" window-system system-configuration) - (message "colors: fg(%S) bg(%S) " - (cdr (assoc 'foreground-color default-frame-alist)) - (cdr (assoc 'background-color default-frame-alist))) - (mapc (lambda (mode) - (condition-case nil - (if (and (symbolp mode) (symbol-value mode) (not (member mode ignore))) - (add-to-list 'modes mode)) - (error nil)) - ) ;lambda - minor-mode-list) - (message "minor modes: %S" modes) - (message "vars:") - (dolist (custom customs) - (message (format "%s=%S " (symbol-name custom) (symbol-value custom)))) - (message "--- WEB-MODE DEBUG END ---") - (switch-to-buffer "*Messages*") - (goto-char (point-max)) - (recenter) - )) - -(provide 'web-mode) - -;;; web-mode.el ends here - -;; Local Variables: -;; coding: utf-8 -;; indent-tabs-mode: nil -;; End: diff --git a/elpa/web-mode-20200418.2218/web-mode.elc b/elpa/web-mode-20200418.2218/web-mode.elc deleted file mode 100644 index b8d15fa6bec05c27dffd9945b2f3907559ea210c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328392 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 diff --git a/elpa/websocket-20200102.637/websocket-autoloads.el b/elpa/websocket-20200102.637/websocket-autoloads.el deleted file mode 100644 index 63674c3d..00000000 --- a/elpa/websocket-20200102.637/websocket-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; websocket-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "websocket" "websocket.el" (0 0 0 0)) -;;; Generated autoloads from websocket.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "websocket" '("websocket-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; websocket-autoloads.el ends here diff --git a/elpa/websocket-20200102.637/websocket-pkg.el b/elpa/websocket-20200102.637/websocket-pkg.el deleted file mode 100644 index c0ecc6dc..00000000 --- a/elpa/websocket-20200102.637/websocket-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "websocket" "20200102.637" "Emacs WebSocket client and server" '((cl-lib "0.5")) :commit "ee44af2cc55415591e7ccb1007193294c702affd" :keywords '("communication" "websocket" "server") :authors '(("Andrew Hyatt" . "ahyatt@gmail.com")) :maintainer '("Andrew Hyatt" . "ahyatt@gmail.com")) diff --git a/elpa/websocket-20200102.637/websocket.el b/elpa/websocket-20200102.637/websocket.el deleted file mode 100644 index 53217ab0..00000000 --- a/elpa/websocket-20200102.637/websocket.el +++ /dev/null @@ -1,1067 +0,0 @@ -;;; websocket.el --- Emacs WebSocket client and server -*- lexical-binding:t -*- - -;; Copyright (c) 2013, 2016-2017 Free Software Foundation, Inc. - -;; Author: Andrew Hyatt -;; Keywords: Communication, Websocket, Server -;; Package-Version: 20200102.637 -;; Version: 1.12 -;; Package-Requires: ((cl-lib "0.5")) -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2 of the -;; License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: -;; This implements RFC 6455, which can be found at -;; http://tools.ietf.org/html/rfc6455. -;; -;; This library contains code to connect Emacs as a client to a -;; websocket server, and for Emacs to act as a server for websocket -;; connections. -;; -;; Websockets clients are created by calling `websocket-open', which -;; returns a `websocket' struct. Users of this library use the -;; websocket struct, and can call methods `websocket-send-text', which -;; sends text over the websocket, or `websocket-send', which sends a -;; `websocket-frame' struct, enabling finer control of what is sent. -;; A callback is passed to `websocket-open' that will retrieve -;; websocket frames called from the websocket. Websockets are -;; eventually closed with `websocket-close'. -;; -;; Server functionality is similar. A server is started with -;; `websocket-server' called with a port and the callbacks to use, -;; which returns a process. The process can later be closed with -;; `websocket-server-close'. A `websocket' struct is also created -;; for every connection, and is exposed through the callbacks. - -(require 'bindat) -(require 'url-parse) -(require 'url-cookie) -(require 'seq) -(eval-when-compile (require 'cl-lib)) - -;;; Code: - -(cl-defstruct (websocket - (:constructor nil) - (:constructor websocket-inner-create)) - "A websocket structure. -This follows the W3C Websocket API, except translated to elisp -idioms. The API is implemented in both the websocket struct and -additional methods. Due to how defstruct slots are accessed, all -API methods are prefixed with \"websocket-\" and take a websocket -as an argument, so the distrinction between the struct API and -the additional helper APIs are not visible to the caller. - -A websocket struct is created with `websocket-open'. - -`ready-state' contains one of `connecting', `open', or -`closed', depending on the state of the websocket. - -The W3C API \"bufferedAmount\" call is not currently implemented, -since there is no elisp API to get the buffered amount from the -subprocess. There may, in fact, be output data buffered, -however, when the `on-message' or `on-close' callbacks are -called. - -`on-open', `on-message', `on-close', and `on-error' are described -in `websocket-open'. - -The `negotiated-extensions' slot lists the extensions accepted by -both the client and server, and `negotiated-protocols' does the -same for the protocols." - ;; API - (ready-state 'connecting) - client-data - on-open - on-message - on-close - on-error - negotiated-protocols - negotiated-extensions - (server-p nil :read-only t) - - ;; Other data - clients should not have to access this. - (url (cl-assert nil) :read-only t) - (protocols nil :read-only t) - (extensions nil :read-only t) - (conn (cl-assert nil) :read-only t) - ;; Only populated for servers, this is the server connection. - server-conn - accept-string - (inflight-input nil)) - -(defvar websocket-version "1.12" - "Version numbers of this version of websocket.el.") - -(defvar websocket-debug nil - "Set to true to output debugging info to a per-websocket buffer. -The buffer is ` *websocket URL debug*' where URL is the -URL of the connection.") - -(defconst websocket-guid "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - "The websocket GUID as defined in RFC 6455. -Do not change unless the RFC changes.") - -(defvar websocket-callback-debug-on-error nil - "If true, when an error happens in a client callback, invoke the debugger. -Having this on can cause issues with missing frames if the debugger is -exited by quitting instead of continuing, so it's best to have this set -to nil unless it is especially needed.") - -(defmacro websocket-document-function (function docstring) - "Document FUNCTION with DOCSTRING. Use this for defstruct accessor etc." - (declare (indent defun) - (doc-string 2)) - `(put ',function 'function-documentation ,docstring)) - -(websocket-document-function websocket-on-open - "Accessor for websocket on-open callback. -See `websocket-open' for details. - -\(fn WEBSOCKET)") - -(websocket-document-function websocket-on-message - "Accessor for websocket on-message callback. -See `websocket-open' for details. - -\(fn WEBSOCKET)") - -(websocket-document-function websocket-on-close - "Accessor for websocket on-close callback. -See `websocket-open' for details. - -\(fn WEBSOCKET)") - -(websocket-document-function websocket-on-error - "Accessor for websocket on-error callback. -See `websocket-open' for details. - -\(fn WEBSOCKET)") - -(defun websocket-genbytes (nbytes) - "Generate NBYTES random bytes." - (let ((s (make-string nbytes ?\s))) - (dotimes (i nbytes) - (aset s i (random 256))) - s)) - -(defun websocket-try-callback (websocket-callback callback-type websocket - &rest rest) - "Invoke function WEBSOCKET-CALLBACK with WEBSOCKET and REST args. -If an error happens, it is handled according to -`websocket-callback-debug-on-error'." - ;; This looks like it should be able to done more efficiently, but - ;; I'm not sure that's the case. We can't do it as a macro, since - ;; we want it to change whenever websocket-callback-debug-on-error - ;; changes. - (let ((args rest) - (debug-on-error websocket-callback-debug-on-error)) - (push websocket args) - (if websocket-callback-debug-on-error - (condition-case err - (apply (funcall websocket-callback websocket) args) - ((debug error) (funcall (websocket-on-error websocket) - websocket callback-type err))) - (condition-case err - (apply (funcall websocket-callback websocket) args) - (error (funcall (websocket-on-error websocket) websocket - callback-type err)))))) - -(defun websocket-genkey () - "Generate a key suitable for the websocket handshake." - (base64-encode-string (websocket-genbytes 16))) - -(defun websocket-calculate-accept (key) - "Calculate the expect value of the accept header. -This is based on the KEY from the Sec-WebSocket-Key header." - (base64-encode-string - (sha1 (concat key websocket-guid) nil nil t))) - -(defun websocket-get-bytes (s n) - "From string S, retrieve the value of N bytes. -Return the value as an unsigned integer. The value N must be a -power of 2, up to 8. - -We support getting frames up to 536870911 bytes (2^29 - 1), -approximately 537M long." - (if (= n 8) - (let* ((32-bit-parts - (bindat-get-field (bindat-unpack '((:val vec 2 u32)) s) :val)) - (cval - (logior (lsh (aref 32-bit-parts 0) 32) (aref 32-bit-parts 1)))) - (if (and (= (aref 32-bit-parts 0) 0) - (= (lsh (aref 32-bit-parts 1) -29) 0)) - cval - (signal 'websocket-unparseable-frame - (list "Frame value found too large to parse!")))) - ;; n is not 8 - (bindat-get-field - (condition-case _ - (bindat-unpack - `((:val - ,(cond ((= n 1) 'u8) - ((= n 2) 'u16) - ((= n 4) 'u32) - ;; This is an error with the library, - ;; not a user-facing, meaningful error. - (t (error - "websocket-get-bytes: Unknown N: %S" n))))) - s) - (args-out-of-range (signal 'websocket-unparseable-frame - (list (format "Frame unexpectedly short: %s" s))))) - :val))) - -(defun websocket-to-bytes (val nbytes) - "Encode the integer VAL in NBYTES of data. -NBYTES much be a power of 2, up to 8. - -This supports encoding values up to 536870911 bytes (2^29 - 1), -approximately 537M long." - (when (and (< nbytes 8) - (> val (expt 2 (* 8 nbytes)))) - ;; not a user-facing error, this must be caused from an error in - ;; this library - (error "websocket-to-bytes: Value %d could not be expressed in %d bytes" - val nbytes)) - (if (= nbytes 8) - (progn - (let* ((hi-32bits (lsh val -32)) - ;; This is just VAL on systems that don't have >= 32 bits. - (low-32bits (- val (lsh hi-32bits 32)))) - (when (or (> hi-32bits 0) (> (lsh low-32bits -29) 0)) - (signal 'websocket-frame-too-large (list val))) - (bindat-pack `((:val vec 2 u32)) - `((:val . [,hi-32bits ,low-32bits]))))) - (bindat-pack - `((:val ,(cond ((= nbytes 1) 'u8) - ((= nbytes 2) 'u16) - ((= nbytes 4) 'u32) - ;; Library error, not system error - (t (error "websocket-to-bytes: Unknown NBYTES: %S" nbytes))))) - `((:val . ,val))))) - -(defun websocket-get-opcode (s) - "Retrieve the opcode from first byte of string S." - (websocket-ensure-length s 1) - (let ((opcode (logand #xf (aref s 0)))) - (cond ((= opcode 0) 'continuation) - ((= opcode 1) 'text) - ((= opcode 2) 'binary) - ((= opcode 8) 'close) - ((= opcode 9) 'ping) - ((= opcode 10) 'pong)))) - -(defun websocket-get-payload-len (s) - "Parse out the payload length from the string S. -We start at position 0, and return a cons of the payload length and how -many bytes were consumed from the string." - (websocket-ensure-length s 1) - (let* ((initial-val (logand 127 (aref s 0)))) - (cond ((= initial-val 127) - (websocket-ensure-length s 9) - (cons (websocket-get-bytes (substring s 1) 8) 9)) - ((= initial-val 126) - (websocket-ensure-length s 3) - (cons (websocket-get-bytes (substring s 1) 2) 3)) - (t (cons initial-val 1))))) - -(cl-defstruct websocket-frame opcode payload length completep) - -(defun websocket-frame-text (frame) - "Given FRAME, return the payload as a utf-8 encoded string." - (cl-assert (websocket-frame-p frame)) - (decode-coding-string (websocket-frame-payload frame) 'utf-8)) - -(defun websocket-mask (key data) - "Using string KEY, mask string DATA according to the RFC. -This is used to both mask and unmask data." - ;; Returning the string as unibyte is important here. Because we set the - ;; string byte by byte, this results in a unibyte string. - (cl-loop - with result = (make-string (length data) ?x) - for i from 0 below (length data) - do (setf (seq-elt result i) (logxor (aref key (mod i 4)) (seq-elt data i))) - finally return result)) - -(defun websocket-ensure-length (s n) - "Ensure the string S has at most N bytes. -Otherwise we throw the error `websocket-incomplete-frame'." - (when (< (length s) n) - (throw 'websocket-incomplete-frame nil))) - -(defun websocket-encode-frame (frame should-mask) - "Encode the FRAME struct to the binary representation. -We mask the frame or not, depending on SHOULD-MASK." - (let* ((opcode (websocket-frame-opcode frame)) - (payload (websocket-frame-payload frame)) - (fin (websocket-frame-completep frame)) - (payloadp (and payload - (memq opcode '(continuation ping pong text binary)))) - (mask-key (when should-mask (websocket-genbytes 4)))) - (apply #'unibyte-string - (let ((val (append (list - (logior (pcase opcode - (`continuation 0) - (`text 1) - (`binary 2) - (`close 8) - (`ping 9) - (`pong 10)) - (if fin 128 0))) - (when payloadp - (list - (logior - (if should-mask 128 0) - (cond ((< (length payload) 126) (length payload)) - ((< (length payload) 65536) 126) - (t 127))))) - (when (and payloadp (>= (length payload) 126)) - (append (websocket-to-bytes - (length payload) - (cond ((< (length payload) 126) 1) - ((< (length payload) 65536) 2) - (t 8))) nil)) - (when (and payloadp should-mask) - (append mask-key nil)) - (when payloadp - (append (if should-mask (websocket-mask mask-key payload) - payload) - nil))))) - ;; We have to make sure the non-payload data is a full 32-bit frame - (if (= 1 (length val)) - (append val '(0)) val))))) - -(defun websocket-read-frame (s) - "Read from string S a `websocket-frame' struct with the contents. -This only gets complete frames. Partial frames need to wait until -the frame finishes. If the frame is not completed, return NIL." - (catch 'websocket-incomplete-frame - (websocket-ensure-length s 1) - (let* ((opcode (websocket-get-opcode s)) - (fin (logand 128 (aref s 0))) - (payloadp (memq opcode '(continuation text binary ping pong))) - (payload-len (when payloadp - (websocket-get-payload-len (substring s 1)))) - (maskp (and - payloadp - (= 128 (logand 128 (aref s 1))))) - (payload-start (when payloadp (+ (if maskp 5 1) (cdr payload-len)))) - (payload-end (when payloadp (+ payload-start (car payload-len)))) - (unmasked-payload (when payloadp - (websocket-ensure-length s payload-end) - (substring s payload-start payload-end)))) - (make-websocket-frame - :opcode opcode - :payload - (if maskp - (let ((masking-key (substring s (+ 1 (cdr payload-len)) - (+ 5 (cdr payload-len))))) - (websocket-mask masking-key unmasked-payload)) - unmasked-payload) - :length (if payloadp payload-end 1) - :completep (> fin 0))))) - -(defun websocket-format-error (err) - "Format an error message like command level does. -ERR should be a cons of error symbol and error data." - - ;; Formatting code adapted from `edebug-report-error' - (concat (or (get (car err) 'error-message) - (format "peculiar error (%s)" (car err))) - (when (cdr err) - (format ": %s" - (mapconcat #'prin1-to-string - (cdr err) ", "))))) - -(defun websocket-default-error-handler (_websocket type err) - "The default error handler used to handle errors in callbacks." - (display-warning 'websocket - (format "in callback `%S': %s" - type - (websocket-format-error err)) - :error)) - -;; Error symbols in use by the library -(put 'websocket-unsupported-protocol 'error-conditions - '(error websocket-error websocket-unsupported-protocol)) -(put 'websocket-unsupported-protocol 'error-message "Unsupported websocket protocol") -(put 'websocket-wss-needs-emacs-24 'error-conditions - '(error websocket-error websocket-unsupported-protocol - websocket-wss-needs-emacs-24)) -(put 'websocket-wss-needs-emacs-24 'error-message - "wss protocol is not supported for Emacs before version 24.") -(put 'websocket-received-error-http-response 'error-conditions - '(error websocket-error websocket-received-error-http-response)) -(put 'websocket-received-error-http-response 'error-message - "Error response received from websocket server") -(put 'websocket-invalid-header 'error-conditions - '(error websocket-error websocket-invalid-header)) -(put 'websocket-invalid-header 'error-message - "Invalid HTTP header sent") -(put 'websocket-illegal-frame 'error-conditions - '(error websocket-error websocket-illegal-frame)) -(put 'websocket-illegal-frame 'error-message - "Cannot send illegal frame to websocket") -(put 'websocket-closed 'error-conditions - '(error websocket-error websocket-closed)) -(put 'websocket-closed 'error-message - "Cannot send message to a closed websocket") -(put 'websocket-unparseable-frame 'error-conditions - '(error websocket-error websocket-unparseable-frame)) -(put 'websocket-unparseable-frame 'error-message - "Received an unparseable frame") -(put 'websocket-frame-too-large 'error-conditions - '(error websocket-error websocket-frame-too-large)) -(put 'websocket-frame-too-large 'error-message - "The frame being sent is too large for this emacs to handle") - -(defun websocket-intersect (a b) - "Simple list intersection, should function like Common Lisp's `intersection'." - (let ((result)) - (dolist (elem a (nreverse result)) - (when (member elem b) - (push elem result))))) - -(defun websocket-get-debug-buffer-create (websocket) - "Get or create the buffer corresponding to WEBSOCKET." - (let ((buf (get-buffer-create (format "*websocket %s debug*" - (websocket-url websocket))))) - (when (= 0 (buffer-size buf)) - (buffer-disable-undo buf)) - buf)) - -(defun websocket-debug (websocket msg &rest args) - "In the WEBSOCKET's debug buffer, send MSG, with format ARGS." - (when websocket-debug - (let ((buf (websocket-get-debug-buffer-create websocket))) - (save-excursion - (with-current-buffer buf - (goto-char (point-max)) - (insert "[WS] ") - (insert (apply #'format (append (list msg) args))) - (insert "\n")))))) - -(defun websocket-verify-response-code (output) - "Verify that OUTPUT contains a valid HTTP response code. -The only acceptable one to websocket is responce code 101. -A t value will be returned on success, and an error thrown -if not." - (unless (string-match "^HTTP/1.1 \\([[:digit:]]+\\)" output) - (signal 'websocket-invalid-header (list "Invalid HTTP status line"))) - (unless (equal "101" (match-string 1 output)) - (signal 'websocket-received-error-http-response - (list (string-to-number (match-string 1 output))))) - t) - -(defun websocket-parse-repeated-field (output field) - "From header-containing OUTPUT, parse out the list from a -possibly repeated field." - (let ((pos 0) - (extensions)) - (while (and pos - (string-match (format "\r\n%s: \\(.*\\)\r\n" field) - output pos)) - (when (setq pos (match-end 1)) - (setq extensions (append extensions (split-string - (match-string 1 output) ", ?"))))) - extensions)) - -(defun websocket-process-frame (websocket frame) - "Using the WEBSOCKET's filter and connection, process the FRAME. -This returns a lambda that should be executed when all frames have -been processed. If the frame has a payload, the lambda has the frame -passed to the filter slot of WEBSOCKET. If the frame is a ping, -the lambda has a reply with a pong. If the frame is a close, the lambda -has connection termination." - (let ((opcode (websocket-frame-opcode frame))) - (cond ((memq opcode '(continuation text binary)) - (lambda () (websocket-try-callback 'websocket-on-message 'on-message - websocket frame))) - ((eq opcode 'ping) - (lambda () (websocket-send websocket - (make-websocket-frame - :opcode 'pong - :payload (websocket-frame-payload frame) - :completep t)))) - ((eq opcode 'close) - (lambda () (delete-process (websocket-conn websocket)))) - (t (lambda ()))))) - -(defun websocket-process-input-on-open-ws (websocket text) - "This handles input processing for both the client and server filters." - (let ((current-frame) - (processing-queue) - (start-point 0)) - (while (setq current-frame (websocket-read-frame - (substring text start-point))) - (push (websocket-process-frame websocket current-frame) processing-queue) - (cl-incf start-point (websocket-frame-length current-frame))) - (when (> (length text) start-point) - (setf (websocket-inflight-input websocket) - (substring text start-point))) - (dolist (to-process (nreverse processing-queue)) - (funcall to-process)))) - -(defun websocket-send-text (websocket text) - "To the WEBSOCKET, send TEXT as a complete frame." - (websocket-send - websocket - (make-websocket-frame :opcode 'text - :payload (encode-coding-string - text 'raw-text) - :completep t))) - -(defun websocket-check (frame) - "Check FRAME for correctness, returning true if correct." - (or - ;; Text, binary, and continuation frames need payloads - (and (memq (websocket-frame-opcode frame) '(text binary continuation)) - (websocket-frame-payload frame)) - ;; Pings and pongs may optionally have them - (memq (websocket-frame-opcode frame) '(ping pong)) - ;; And close shouldn't have any payload, and should always be complete. - (and (eq (websocket-frame-opcode frame) 'close) - (not (websocket-frame-payload frame)) - (websocket-frame-completep frame)))) - -(defun websocket-send (websocket frame) - "To the WEBSOCKET server, send the FRAME. -This will raise an error if the frame is illegal. - -The error signaled may be of type `websocket-illegal-frame' if -the frame is malformed in some way, also having the condition -type of `websocket-error'. The data associated with the signal -is the frame being sent. - -If the websocket is closed a signal `websocket-closed' is sent, -also with `websocket-error' condition. The data in the signal is -also the frame. - -The frame may be too large for this buid of Emacs, in which case -`websocket-frame-too-large' is returned, with the data of the -size of the frame which was too large to process. This also has -the `websocket-error' condition." - (unless (websocket-check frame) - (signal 'websocket-illegal-frame (list frame))) - (websocket-debug websocket "Sending frame, opcode: %s payload: %s" - (websocket-frame-opcode frame) - (websocket-frame-payload frame)) - (websocket-ensure-connected websocket) - (unless (websocket-openp websocket) - (signal 'websocket-closed (list frame))) - (process-send-string (websocket-conn websocket) - ;; We mask only when we're a client, following the spec. - (websocket-encode-frame frame (not (websocket-server-p websocket))))) - -(defun websocket-openp (websocket) - "Check WEBSOCKET and return non-nil if the connection is open." - (and websocket - (not (eq 'close (websocket-ready-state websocket))) - (member (process-status (websocket-conn websocket)) '(open run)))) - -(defun websocket-close (websocket) - "Close WEBSOCKET and erase all the old websocket data." - (websocket-debug websocket "Closing websocket") - (websocket-try-callback 'websocket-on-close 'on-close websocket) - (when (websocket-openp websocket) - (websocket-send websocket - (make-websocket-frame :opcode 'close - :completep t)) - (setf (websocket-ready-state websocket) 'closed)) - (delete-process (websocket-conn websocket))) - -(defun websocket-ensure-connected (websocket) - "If the WEBSOCKET connection is closed, open it." - (unless (and (websocket-conn websocket) - (cl-ecase (process-status (websocket-conn websocket)) - ((run open listen) t) - ((stop exit signal closed connect failed nil) nil))) - (websocket-close websocket) - (websocket-open (websocket-url websocket) - :protocols (websocket-protocols websocket) - :extensions (websocket-extensions websocket) - :on-open (websocket-on-open websocket) - :on-message (websocket-on-message websocket) - :on-close (websocket-on-close websocket) - :on-error (websocket-on-error websocket)))) - -;;;;;;;;;;;;;;;;;;;;;; -;; Websocket client ;; -;;;;;;;;;;;;;;;;;;;;;; - -(cl-defun websocket-open (url &key protocols extensions (on-open 'identity) - (on-message (lambda (_w _f))) (on-close 'identity) - (on-error 'websocket-default-error-handler) - (nowait nil) (custom-header-alist nil)) - "Open a websocket connection to URL, returning the `websocket' struct. -The PROTOCOL argument is optional, and setting it will declare to -the server that this client supports the protocols in the list -given. We will require that the server also has to support that -protocols. - -Similar logic applies to EXTENSIONS, which is a list of conses, -the car of which is a string naming the extension, and the cdr of -which is the list of parameter strings to use for that extension. -The parameter strings are of the form \"key=value\" or \"value\". -EXTENSIONS can be NIL if none are in use. An example value would -be (\"deflate-stream\" . (\"mux\" \"max-channels=4\")). - -Cookies that are set via `url-cookie-store' will be used during -communication with the server, and cookies received from the -server will be stored in the same cookie storage that the -`url-cookie' package uses. - -Optionally you can specify -ON-OPEN, ON-MESSAGE and ON-CLOSE callbacks as well. - -The ON-OPEN callback is called after the connection is -established with the websocket as the only argument. The return -value is unused. - -The ON-MESSAGE callback is called after receiving a frame, and is -called with the websocket as the first argument and -`websocket-frame' struct as the second. The return value is -unused. - -The ON-CLOSE callback is called after the connection is closed, or -failed to open. It is called with the websocket as the only -argument, and the return value is unused. - -The ON-ERROR callback is called when any of the other callbacks -have an error. It takes the websocket as the first argument, and -a symbol as the second argument either `on-open', `on-message', -or `on-close', and the error as the third argument. Do NOT -rethrow the error, or else you may miss some websocket messages. -You similarly must not generate any other errors in this method. -If you want to debug errors, set -`websocket-callback-debug-on-error' to t, but this also can be -dangerous is the debugger is quit out of. If not specified, -`websocket-default-error-handler' is used. - -For each of these event handlers, the client code can store -arbitrary data in the `client-data' slot in the returned -websocket. - -The following errors might be thrown in this method or in -websocket processing, all of them having the error-condition -`websocket-error' in addition to their own symbol: - -`websocket-unsupported-protocol': Data in the error signal is the -protocol that is unsupported. For example, giving a URL starting -with http by mistake raises this error. - -`websocket-wss-needs-emacs-24': Trying to connect wss protocol -using Emacs < 24 raises this error. You can catch this error -also by `websocket-unsupported-protocol'. - -`websocket-received-error-http-response': Data in the error -signal is the integer error number. - -`websocket-invalid-header': Data in the error is a string -describing the invalid header received from the server. - -`websocket-unparseable-frame': Data in the error is a string -describing the problem with the frame. - -`nowait': If NOWAIT is true, return without waiting for the -connection to complete. - -`custom-headers-alist': An alist of custom headers to pass to the -server. The car is the header name, the cdr is the header value. -These are different from the extensions because it is not related -to the websocket protocol. -" - (let* ((name (format "websocket to %s" url)) - (url-struct (url-generic-parse-url url)) - (key (websocket-genkey)) - (coding-system-for-read 'binary) - (coding-system-for-write 'binary) - (conn (if (member (url-type url-struct) '("ws" "wss")) - (let* ((type (if (equal (url-type url-struct) "ws") - 'plain 'tls)) - (port (if (= 0 (url-port url-struct)) - (if (eq type 'tls) 443 80) - (url-port url-struct))) - (host (url-host url-struct))) - (if (eq type 'plain) - (make-network-process :name name :buffer nil :host host - :service port :nowait nowait) - (condition-case-unless-debug nil - (open-network-stream name nil host port :type type :nowait nowait) - (wrong-number-of-arguments - (signal 'websocket-wss-needs-emacs-24 (list "wss")))))) - (signal 'websocket-unsupported-protocol (list (url-type url-struct))))) - (websocket (websocket-inner-create - :conn conn - :url url - :on-open on-open - :on-message on-message - :on-close on-close - :on-error on-error - :protocols protocols - :extensions (mapcar 'car extensions) - :accept-string - (websocket-calculate-accept key)))) - (unless conn (error "Could not establish the websocket connection to %s" url)) - (process-put conn :websocket websocket) - (set-process-filter conn - (lambda (process output) - (let ((websocket (process-get process :websocket))) - (websocket-outer-filter websocket output)))) - (set-process-sentinel - conn - (websocket-sentinel url conn key protocols extensions custom-header-alist nowait)) - (set-process-query-on-exit-flag conn nil) - (websocket-ensure-handshake url conn key protocols extensions custom-header-alist nowait) - websocket)) - -(defun websocket-sentinel (url conn key protocols extensions custom-header-alist nowait) - #'(lambda (process change) - (let ((websocket (process-get process :websocket))) - (websocket-debug websocket "State change to %s" change) - (let ((status (process-status process))) - (when (and nowait (eq status 'open)) - (websocket-ensure-handshake url conn key protocols extensions custom-header-alist nowait)) - - (when (and (member status '(closed failed exit signal)) - (not (eq 'closed (websocket-ready-state websocket)))) - (websocket-try-callback 'websocket-on-close 'on-close websocket)))))) - -(defun websocket-ensure-handshake (url conn key protocols extensions custom-header-alist nowait) - (let ((url-struct (url-generic-parse-url url)) - (websocket (process-get conn :websocket))) - (when (and (eq 'connecting (websocket-ready-state websocket)) - (memq (process-status conn) - (list 'run (if nowait 'connect 'open)))) - (process-send-string conn - (format "GET %s HTTP/1.1\r\n" - (let ((path (url-filename url-struct))) - (if (> (length path) 0) path "/")))) - (websocket-debug websocket "Sending handshake, key: %s, acceptance: %s" - key (websocket-accept-string websocket)) - (process-send-string conn - (websocket-create-headers - url key protocols extensions custom-header-alist))))) - -(defun websocket-process-headers (url headers) - "On opening URL, process the HEADERS sent from the server." - (when (string-match "Set-Cookie: \(.*\)\r\n" headers) - ;; The url-current-object is assumed to be set by - ;; url-cookie-handle-set-cookie. - (let ((url-current-object (url-generic-parse-url url))) - (url-cookie-handle-set-cookie (match-string 1 headers))))) - -(defun websocket-outer-filter (websocket output) - "Filter the WEBSOCKET server's OUTPUT. -This will parse headers and process frames repeatedly until there -is no more output or the connection closes. If the websocket -connection is invalid, the connection will be closed." - (websocket-debug websocket "Received: %s" output) - (let ((start-point) - (text (concat (websocket-inflight-input websocket) output)) - (header-end-pos)) - (setf (websocket-inflight-input websocket) nil) - ;; If we've received the complete header, check to see if we've - ;; received the desired handshake. - (when (and (eq 'connecting (websocket-ready-state websocket))) - (if (and (setq header-end-pos (string-match "\r\n\r\n" text)) - (setq start-point (+ 4 header-end-pos))) - (progn - (condition-case err - (progn - (websocket-verify-response-code text) - (websocket-verify-headers websocket text) - (websocket-process-headers (websocket-url websocket) text)) - (error - (websocket-close websocket) - (funcall (websocket-on-error websocket) - websocket 'on-open err))) - (setf (websocket-ready-state websocket) 'open) - (websocket-try-callback 'websocket-on-open 'on-open websocket)) - (setf (websocket-inflight-input websocket) text))) - (when (eq 'open (websocket-ready-state websocket)) - (websocket-process-input-on-open-ws - websocket (substring text (or start-point 0)))))) - -(defun websocket-verify-headers (websocket output) - "Based on WEBSOCKET's data, ensure the headers in OUTPUT are valid. -The output is assumed to have complete headers. This function -will either return t or call `error'. This has the side-effect -of populating the list of server extensions to WEBSOCKET." - (let ((accept-regexp - (concat "Sec-Web[Ss]ocket-Accept: " (regexp-quote (websocket-accept-string websocket))))) - (websocket-debug websocket "Checking for accept header regexp: %s" accept-regexp) - (unless (string-match accept-regexp output) - (signal 'websocket-invalid-header - (list "Incorrect handshake from websocket: is this really a websocket connection?")))) - (let ((case-fold-search t)) - (websocket-debug websocket "Checking for upgrade header") - (unless (string-match "\r\nUpgrade: websocket\r\n" output) - (signal 'websocket-invalid-header - (list "No 'Upgrade: websocket' header found"))) - (websocket-debug websocket "Checking for connection header") - (unless (string-match "\r\nConnection: upgrade\r\n" output) - (signal 'websocket-invalid-header - (list "No 'Connection: upgrade' header found"))) - (when (websocket-protocols websocket) - (dolist (protocol (websocket-protocols websocket)) - (websocket-debug websocket "Checking for protocol match: %s" - protocol) - (let ((protocols - (if (string-match (format "\r\nSec-Websocket-Protocol: %s\r\n" - protocol) - output) - (list protocol) - (signal 'websocket-invalid-header - (list "Incorrect or missing protocol returned by the server."))))) - (setf (websocket-negotiated-protocols websocket) protocols)))) - (let* ((extensions (websocket-parse-repeated-field - output - "Sec-WebSocket-Extensions")) - (extra-extensions)) - (dolist (ext extensions) - (let ((x (cl-first (split-string ext "; ?")))) - (unless (or (member x (websocket-extensions websocket)) - (member x extra-extensions)) - (push x extra-extensions)))) - (when extra-extensions - (signal 'websocket-invalid-header - (list (format "Non-requested extensions returned by server: %S" - extra-extensions)))) - (setf (websocket-negotiated-extensions websocket) extensions))) - t) - -;;;;;;;;;;;;;;;;;;;;;; -;; Websocket server ;; -;;;;;;;;;;;;;;;;;;;;;; - -(defvar websocket-server-websockets nil - "A list of current websockets live on any server.") - -(cl-defun websocket-server (port &rest plist) - "Open a websocket server on PORT. -If the plist contains a `:host' HOST pair, this value will be -used to configure the addresses the socket listens on. The symbol -`local' specifies the local host. If unspecified or nil, the -socket will listen on all addresses. - -This also takes a plist of callbacks: `:on-open', `:on-message', -`:on-close' and `:on-error', which operate exactly as documented -in the websocket client function `websocket-open'. Returns the -connection, which should be kept in order to pass to -`websocket-server-close'." - (let* ((conn (make-network-process - :name (format "websocket server on port %s" port) - :server t - :family 'ipv4 - :noquery t - :filter 'websocket-server-filter - :log 'websocket-server-accept - :filter-multibyte nil - :plist plist - :host (plist-get plist :host) - :service port))) - conn)) - -(defun websocket-server-close (conn) - "Closes the websocket, as well as all open websockets for this server." - (let ((to-delete)) - (dolist (ws websocket-server-websockets) - (when (eq (websocket-server-conn ws) conn) - (if (eq (websocket-ready-state ws) 'closed) - (unless (member ws to-delete) - (push ws to-delete)) - (websocket-close ws)))) - (dolist (ws to-delete) - (setq websocket-server-websockets (remove ws websocket-server-websockets)))) - (delete-process conn)) - -(defun websocket-server-accept (server client _message) - "Accept a new websocket connection from a client." - (let ((ws (websocket-inner-create - :server-conn server - :conn client - :url client - :server-p t - :on-open (or (process-get server :on-open) 'identity) - :on-message (or (process-get server :on-message) (lambda (_ws _frame))) - :on-close (let ((user-method - (or (process-get server :on-close) 'identity))) - (lambda (ws) - (setq websocket-server-websockets - (remove ws websocket-server-websockets)) - (funcall user-method ws))) - :on-error (or (process-get server :on-error) - 'websocket-default-error-handler) - :protocols (process-get server :protocol) - :extensions (mapcar 'car (process-get server :extensions))))) - (unless (member ws websocket-server-websockets) - (push ws websocket-server-websockets)) - (process-put client :websocket ws) - (set-process-coding-system client 'binary 'binary) - (set-process-sentinel client - (lambda (process change) - (let ((websocket (process-get process :websocket))) - (websocket-debug websocket "State change to %s" change) - (when (and - (member (process-status process) '(closed failed exit signal)) - (not (eq 'closed (websocket-ready-state websocket)))) - (websocket-try-callback 'websocket-on-close 'on-close websocket))))))) - -(defun websocket-create-headers (url key protocol extensions custom-headers-alist) - "Create connections headers for the given URL, KEY, PROTOCOL, and EXTENSIONS. -Additionally, the CUSTOM-HEADERS-ALIST is passed from the client. -All these parameters are defined as in `websocket-open'." - (let* ((parsed-url (url-generic-parse-url url)) - (host-port (if (url-port-if-non-default parsed-url) - (format "%s:%s" (url-host parsed-url) (url-port parsed-url)) - (url-host parsed-url))) - (cookie-header (url-cookie-generate-header-lines - host-port (car (url-path-and-query parsed-url)) - (equal (url-type parsed-url) "wss")))) - (format (concat "Host: %s\r\n" - "Upgrade: websocket\r\n" - "Connection: Upgrade\r\n" - "Sec-WebSocket-Key: %s\r\n" - "Sec-WebSocket-Version: 13\r\n" - (when protocol - (concat - (mapconcat - (lambda (protocol) - (format "Sec-WebSocket-Protocol: %s" protocol)) - protocol "\r\n") - "\r\n")) - (when extensions - (format "Sec-WebSocket-Extensions: %s\r\n" - (mapconcat - (lambda (ext) - (concat - (car ext) - (when (cdr ext) "; ") - (when (cdr ext) - (mapconcat 'identity (cdr ext) "; ")))) - extensions ", "))) - (when cookie-header cookie-header) - (concat (mapconcat (lambda (cons) (format "%s: %s" (car cons) (cdr cons))) - custom-headers-alist "\r\n") - (when custom-headers-alist "\r\n")) - "\r\n") - host-port - key - protocol))) - -(defun websocket-get-server-response (websocket client-protocols client-extensions) - "Get the websocket response from client WEBSOCKET." - (let ((separator "\r\n")) - (concat "HTTP/1.1 101 Switching Protocols" separator - "Upgrade: websocket" separator - "Connection: Upgrade" separator - "Sec-WebSocket-Accept: " - (websocket-accept-string websocket) separator - (let ((protocols - (websocket-intersect client-protocols - (websocket-protocols websocket)))) - (when protocols - (concat - (mapconcat - (lambda (protocol) (format "Sec-WebSocket-Protocol: %s" - protocol)) protocols separator) - separator))) - (let ((extensions (websocket-intersect - client-extensions - (websocket-extensions websocket)))) - (when extensions - (concat - (mapconcat - (lambda (extension) (format "Sec-Websocket-Extensions: %s" - extension)) extensions separator) - separator))) - separator))) - -(defun websocket-server-filter (process output) - "This acts on all OUTPUT from websocket clients PROCESS." - (let* ((ws (process-get process :websocket)) - (text (concat (websocket-inflight-input ws) output))) - (setf (websocket-inflight-input ws) nil) - (cond ((eq (websocket-ready-state ws) 'connecting) - ;; check for connection string - (let ((end-of-header-pos - (let ((pos (string-match "\r\n\r\n" text))) - (when pos (+ 4 pos))))) - (if end-of-header-pos - (progn - (let ((header-info (websocket-verify-client-headers text))) - (if header-info - (progn (setf (websocket-accept-string ws) - (websocket-calculate-accept - (plist-get header-info :key))) - (process-send-string - process - (websocket-get-server-response - ws (plist-get header-info :protocols) - (plist-get header-info :extensions))) - (setf (websocket-ready-state ws) 'open) - (websocket-try-callback 'websocket-on-open - 'on-open ws)) - (message "Invalid client headers found in: %s" output) - (process-send-string process "HTTP/1.1 400 Bad Request\r\n\r\n") - (websocket-close ws))) - (when (> (length text) (+ 1 end-of-header-pos)) - (websocket-server-filter process (substring - text - end-of-header-pos)))) - (setf (websocket-inflight-input ws) text)))) - ((eq (websocket-ready-state ws) 'open) - (websocket-process-input-on-open-ws ws text)) - ((eq (websocket-ready-state ws) 'closed) - (message "WARNING: Should not have received further input on closed websocket"))))) - -(defun websocket-verify-client-headers (output) - "Verify the headers from the WEBSOCKET client connection in OUTPUT. -Unlike `websocket-verify-headers', this is a quieter routine. We -don't want to error due to a bad client, so we just print out -messages and a plist containing `:key', the websocket key, -`:protocols' and `:extensions'." - (cl-block nil - (let ((case-fold-search t) - (plist)) - (unless (string-match "HTTP/1.1" output) - (message "Websocket client connection: HTTP/1.1 not found") - (cl-return nil)) - (unless (string-match "^Host: " output) - (message "Websocket client connection: Host header not found") - (cl-return nil)) - (unless (string-match "^Upgrade: websocket\r\n" output) - (message "Websocket client connection: Upgrade: websocket not found") - (cl-return nil)) - (if (string-match "^Sec-WebSocket-Key: \\([[:graph:]]+\\)\r\n" output) - (setq plist (plist-put plist :key (match-string 1 output))) - (message "Websocket client connect: No key sent") - (cl-return nil)) - (unless (string-match "^Sec-WebSocket-Version: 13" output) - (message "Websocket client connect: Websocket version 13 not found") - (cl-return nil)) - (when (string-match "^Sec-WebSocket-Protocol:" output) - (setq plist (plist-put plist :protocols (websocket-parse-repeated-field - output - "Sec-Websocket-Protocol")))) - (when (string-match "^Sec-WebSocket-Extensions:" output) - (setq plist (plist-put plist :extensions (websocket-parse-repeated-field - output - "Sec-Websocket-Extensions")))) - plist))) - -(provide 'websocket) - -;;; websocket.el ends here diff --git a/elpa/websocket-20200102.637/websocket.elc b/elpa/websocket-20200102.637/websocket.elc deleted file mode 100644 index 9e53e65f96b34fcc3af4a6a1a45f208231b32605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63033 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�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 diff --git a/elpa/websocket-20200321.102/websocket-autoloads.el b/elpa/websocket-20200321.102/websocket-autoloads.el deleted file mode 100644 index 63674c3d..00000000 --- a/elpa/websocket-20200321.102/websocket-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; websocket-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "websocket" "websocket.el" (0 0 0 0)) -;;; Generated autoloads from websocket.el - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "websocket" '("websocket-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; websocket-autoloads.el ends here diff --git a/elpa/websocket-20200321.102/websocket-pkg.el b/elpa/websocket-20200321.102/websocket-pkg.el deleted file mode 100644 index 44d2f748..00000000 --- a/elpa/websocket-20200321.102/websocket-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "websocket" "20200321.102" "Emacs WebSocket client and server" '((cl-lib "0.5")) :commit "31e122a9d7a1ae092e8f970df718fb8256e16574" :keywords '("communication" "websocket" "server") :authors '(("Andrew Hyatt" . "ahyatt@gmail.com")) :maintainer '("Andrew Hyatt" . "ahyatt@gmail.com") :url "https://github.com/ahyatt/emacs-websocket") diff --git a/elpa/websocket-20200321.102/websocket.el b/elpa/websocket-20200321.102/websocket.el deleted file mode 100644 index 4888fc7c..00000000 --- a/elpa/websocket-20200321.102/websocket.el +++ /dev/null @@ -1,1068 +0,0 @@ -;;; websocket.el --- Emacs WebSocket client and server -*- lexical-binding:t -*- - -;; Copyright (c) 2013, 2016-2017 Free Software Foundation, Inc. - -;; Author: Andrew Hyatt -;; Homepage: https://github.com/ahyatt/emacs-websocket -;; Keywords: Communication, Websocket, Server -;; Package-Version: 20200321.102 -;; Version: 1.12 -;; Package-Requires: ((cl-lib "0.5")) -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2 of the -;; License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see . - -;;; Commentary: -;; This implements RFC 6455, which can be found at -;; http://tools.ietf.org/html/rfc6455. -;; -;; This library contains code to connect Emacs as a client to a -;; websocket server, and for Emacs to act as a server for websocket -;; connections. -;; -;; Websockets clients are created by calling `websocket-open', which -;; returns a `websocket' struct. Users of this library use the -;; websocket struct, and can call methods `websocket-send-text', which -;; sends text over the websocket, or `websocket-send', which sends a -;; `websocket-frame' struct, enabling finer control of what is sent. -;; A callback is passed to `websocket-open' that will retrieve -;; websocket frames called from the websocket. Websockets are -;; eventually closed with `websocket-close'. -;; -;; Server functionality is similar. A server is started with -;; `websocket-server' called with a port and the callbacks to use, -;; which returns a process. The process can later be closed with -;; `websocket-server-close'. A `websocket' struct is also created -;; for every connection, and is exposed through the callbacks. - -(require 'bindat) -(require 'url-parse) -(require 'url-cookie) -(require 'seq) -(eval-when-compile (require 'cl-lib)) - -;;; Code: - -(cl-defstruct (websocket - (:constructor nil) - (:constructor websocket-inner-create)) - "A websocket structure. -This follows the W3C Websocket API, except translated to elisp -idioms. The API is implemented in both the websocket struct and -additional methods. Due to how defstruct slots are accessed, all -API methods are prefixed with \"websocket-\" and take a websocket -as an argument, so the distrinction between the struct API and -the additional helper APIs are not visible to the caller. - -A websocket struct is created with `websocket-open'. - -`ready-state' contains one of `connecting', `open', or -`closed', depending on the state of the websocket. - -The W3C API \"bufferedAmount\" call is not currently implemented, -since there is no elisp API to get the buffered amount from the -subprocess. There may, in fact, be output data buffered, -however, when the `on-message' or `on-close' callbacks are -called. - -`on-open', `on-message', `on-close', and `on-error' are described -in `websocket-open'. - -The `negotiated-extensions' slot lists the extensions accepted by -both the client and server, and `negotiated-protocols' does the -same for the protocols." - ;; API - (ready-state 'connecting) - client-data - on-open - on-message - on-close - on-error - negotiated-protocols - negotiated-extensions - (server-p nil :read-only t) - - ;; Other data - clients should not have to access this. - (url (cl-assert nil) :read-only t) - (protocols nil :read-only t) - (extensions nil :read-only t) - (conn (cl-assert nil) :read-only t) - ;; Only populated for servers, this is the server connection. - server-conn - accept-string - (inflight-input nil)) - -(defvar websocket-version "1.12" - "Version numbers of this version of websocket.el.") - -(defvar websocket-debug nil - "Set to true to output debugging info to a per-websocket buffer. -The buffer is ` *websocket URL debug*' where URL is the -URL of the connection.") - -(defconst websocket-guid "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - "The websocket GUID as defined in RFC 6455. -Do not change unless the RFC changes.") - -(defvar websocket-callback-debug-on-error nil - "If true, when an error happens in a client callback, invoke the debugger. -Having this on can cause issues with missing frames if the debugger is -exited by quitting instead of continuing, so it's best to have this set -to nil unless it is especially needed.") - -(defmacro websocket-document-function (function docstring) - "Document FUNCTION with DOCSTRING. Use this for defstruct accessor etc." - (declare (indent defun) - (doc-string 2)) - `(put ',function 'function-documentation ,docstring)) - -(websocket-document-function websocket-on-open - "Accessor for websocket on-open callback. -See `websocket-open' for details. - -\(fn WEBSOCKET)") - -(websocket-document-function websocket-on-message - "Accessor for websocket on-message callback. -See `websocket-open' for details. - -\(fn WEBSOCKET)") - -(websocket-document-function websocket-on-close - "Accessor for websocket on-close callback. -See `websocket-open' for details. - -\(fn WEBSOCKET)") - -(websocket-document-function websocket-on-error - "Accessor for websocket on-error callback. -See `websocket-open' for details. - -\(fn WEBSOCKET)") - -(defun websocket-genbytes (nbytes) - "Generate NBYTES random bytes." - (let ((s (make-string nbytes ?\s))) - (dotimes (i nbytes) - (aset s i (random 256))) - s)) - -(defun websocket-try-callback (websocket-callback callback-type websocket - &rest rest) - "Invoke function WEBSOCKET-CALLBACK with WEBSOCKET and REST args. -If an error happens, it is handled according to -`websocket-callback-debug-on-error'." - ;; This looks like it should be able to done more efficiently, but - ;; I'm not sure that's the case. We can't do it as a macro, since - ;; we want it to change whenever websocket-callback-debug-on-error - ;; changes. - (let ((args rest) - (debug-on-error websocket-callback-debug-on-error)) - (push websocket args) - (if websocket-callback-debug-on-error - (condition-case err - (apply (funcall websocket-callback websocket) args) - ((debug error) (funcall (websocket-on-error websocket) - websocket callback-type err))) - (condition-case err - (apply (funcall websocket-callback websocket) args) - (error (funcall (websocket-on-error websocket) websocket - callback-type err)))))) - -(defun websocket-genkey () - "Generate a key suitable for the websocket handshake." - (base64-encode-string (websocket-genbytes 16))) - -(defun websocket-calculate-accept (key) - "Calculate the expect value of the accept header. -This is based on the KEY from the Sec-WebSocket-Key header." - (base64-encode-string - (sha1 (concat key websocket-guid) nil nil t))) - -(defun websocket-get-bytes (s n) - "From string S, retrieve the value of N bytes. -Return the value as an unsigned integer. The value N must be a -power of 2, up to 8. - -We support getting frames up to 536870911 bytes (2^29 - 1), -approximately 537M long." - (if (= n 8) - (let* ((32-bit-parts - (bindat-get-field (bindat-unpack '((:val vec 2 u32)) s) :val)) - (cval - (logior (lsh (aref 32-bit-parts 0) 32) (aref 32-bit-parts 1)))) - (if (and (= (aref 32-bit-parts 0) 0) - (= (lsh (aref 32-bit-parts 1) -29) 0)) - cval - (signal 'websocket-unparseable-frame - (list "Frame value found too large to parse!")))) - ;; n is not 8 - (bindat-get-field - (condition-case _ - (bindat-unpack - `((:val - ,(cond ((= n 1) 'u8) - ((= n 2) 'u16) - ((= n 4) 'u32) - ;; This is an error with the library, - ;; not a user-facing, meaningful error. - (t (error - "websocket-get-bytes: Unknown N: %S" n))))) - s) - (args-out-of-range (signal 'websocket-unparseable-frame - (list (format "Frame unexpectedly short: %s" s))))) - :val))) - -(defun websocket-to-bytes (val nbytes) - "Encode the integer VAL in NBYTES of data. -NBYTES much be a power of 2, up to 8. - -This supports encoding values up to 536870911 bytes (2^29 - 1), -approximately 537M long." - (when (and (< nbytes 8) - (> val (expt 2 (* 8 nbytes)))) - ;; not a user-facing error, this must be caused from an error in - ;; this library - (error "websocket-to-bytes: Value %d could not be expressed in %d bytes" - val nbytes)) - (if (= nbytes 8) - (progn - (let* ((hi-32bits (lsh val -32)) - ;; This is just VAL on systems that don't have >= 32 bits. - (low-32bits (- val (lsh hi-32bits 32)))) - (when (or (> hi-32bits 0) (> (lsh low-32bits -29) 0)) - (signal 'websocket-frame-too-large (list val))) - (bindat-pack `((:val vec 2 u32)) - `((:val . [,hi-32bits ,low-32bits]))))) - (bindat-pack - `((:val ,(cond ((= nbytes 1) 'u8) - ((= nbytes 2) 'u16) - ((= nbytes 4) 'u32) - ;; Library error, not system error - (t (error "websocket-to-bytes: Unknown NBYTES: %S" nbytes))))) - `((:val . ,val))))) - -(defun websocket-get-opcode (s) - "Retrieve the opcode from first byte of string S." - (websocket-ensure-length s 1) - (let ((opcode (logand #xf (aref s 0)))) - (cond ((= opcode 0) 'continuation) - ((= opcode 1) 'text) - ((= opcode 2) 'binary) - ((= opcode 8) 'close) - ((= opcode 9) 'ping) - ((= opcode 10) 'pong)))) - -(defun websocket-get-payload-len (s) - "Parse out the payload length from the string S. -We start at position 0, and return a cons of the payload length and how -many bytes were consumed from the string." - (websocket-ensure-length s 1) - (let* ((initial-val (logand 127 (aref s 0)))) - (cond ((= initial-val 127) - (websocket-ensure-length s 9) - (cons (websocket-get-bytes (substring s 1) 8) 9)) - ((= initial-val 126) - (websocket-ensure-length s 3) - (cons (websocket-get-bytes (substring s 1) 2) 3)) - (t (cons initial-val 1))))) - -(cl-defstruct websocket-frame opcode payload length completep) - -(defun websocket-frame-text (frame) - "Given FRAME, return the payload as a utf-8 encoded string." - (cl-assert (websocket-frame-p frame)) - (decode-coding-string (websocket-frame-payload frame) 'utf-8)) - -(defun websocket-mask (key data) - "Using string KEY, mask string DATA according to the RFC. -This is used to both mask and unmask data." - ;; Returning the string as unibyte is important here. Because we set the - ;; string byte by byte, this results in a unibyte string. - (cl-loop - with result = (make-string (length data) ?x) - for i from 0 below (length data) - do (setf (seq-elt result i) (logxor (aref key (mod i 4)) (seq-elt data i))) - finally return result)) - -(defun websocket-ensure-length (s n) - "Ensure the string S has at most N bytes. -Otherwise we throw the error `websocket-incomplete-frame'." - (when (< (length s) n) - (throw 'websocket-incomplete-frame nil))) - -(defun websocket-encode-frame (frame should-mask) - "Encode the FRAME struct to the binary representation. -We mask the frame or not, depending on SHOULD-MASK." - (let* ((opcode (websocket-frame-opcode frame)) - (payload (websocket-frame-payload frame)) - (fin (websocket-frame-completep frame)) - (payloadp (and payload - (memq opcode '(continuation ping pong text binary)))) - (mask-key (when should-mask (websocket-genbytes 4)))) - (apply #'unibyte-string - (let ((val (append (list - (logior (pcase opcode - (`continuation 0) - (`text 1) - (`binary 2) - (`close 8) - (`ping 9) - (`pong 10)) - (if fin 128 0))) - (when payloadp - (list - (logior - (if should-mask 128 0) - (cond ((< (length payload) 126) (length payload)) - ((< (length payload) 65536) 126) - (t 127))))) - (when (and payloadp (>= (length payload) 126)) - (append (websocket-to-bytes - (length payload) - (cond ((< (length payload) 126) 1) - ((< (length payload) 65536) 2) - (t 8))) nil)) - (when (and payloadp should-mask) - (append mask-key nil)) - (when payloadp - (append (if should-mask (websocket-mask mask-key payload) - payload) - nil))))) - ;; We have to make sure the non-payload data is a full 32-bit frame - (if (= 1 (length val)) - (append val '(0)) val))))) - -(defun websocket-read-frame (s) - "Read from string S a `websocket-frame' struct with the contents. -This only gets complete frames. Partial frames need to wait until -the frame finishes. If the frame is not completed, return NIL." - (catch 'websocket-incomplete-frame - (websocket-ensure-length s 1) - (let* ((opcode (websocket-get-opcode s)) - (fin (logand 128 (aref s 0))) - (payloadp (memq opcode '(continuation text binary ping pong))) - (payload-len (when payloadp - (websocket-get-payload-len (substring s 1)))) - (maskp (and - payloadp - (= 128 (logand 128 (aref s 1))))) - (payload-start (when payloadp (+ (if maskp 5 1) (cdr payload-len)))) - (payload-end (when payloadp (+ payload-start (car payload-len)))) - (unmasked-payload (when payloadp - (websocket-ensure-length s payload-end) - (substring s payload-start payload-end)))) - (make-websocket-frame - :opcode opcode - :payload - (if maskp - (let ((masking-key (substring s (+ 1 (cdr payload-len)) - (+ 5 (cdr payload-len))))) - (websocket-mask masking-key unmasked-payload)) - unmasked-payload) - :length (if payloadp payload-end 1) - :completep (> fin 0))))) - -(defun websocket-format-error (err) - "Format an error message like command level does. -ERR should be a cons of error symbol and error data." - - ;; Formatting code adapted from `edebug-report-error' - (concat (or (get (car err) 'error-message) - (format "peculiar error (%s)" (car err))) - (when (cdr err) - (format ": %s" - (mapconcat #'prin1-to-string - (cdr err) ", "))))) - -(defun websocket-default-error-handler (_websocket type err) - "The default error handler used to handle errors in callbacks." - (display-warning 'websocket - (format "in callback `%S': %s" - type - (websocket-format-error err)) - :error)) - -;; Error symbols in use by the library -(put 'websocket-unsupported-protocol 'error-conditions - '(error websocket-error websocket-unsupported-protocol)) -(put 'websocket-unsupported-protocol 'error-message "Unsupported websocket protocol") -(put 'websocket-wss-needs-emacs-24 'error-conditions - '(error websocket-error websocket-unsupported-protocol - websocket-wss-needs-emacs-24)) -(put 'websocket-wss-needs-emacs-24 'error-message - "wss protocol is not supported for Emacs before version 24.") -(put 'websocket-received-error-http-response 'error-conditions - '(error websocket-error websocket-received-error-http-response)) -(put 'websocket-received-error-http-response 'error-message - "Error response received from websocket server") -(put 'websocket-invalid-header 'error-conditions - '(error websocket-error websocket-invalid-header)) -(put 'websocket-invalid-header 'error-message - "Invalid HTTP header sent") -(put 'websocket-illegal-frame 'error-conditions - '(error websocket-error websocket-illegal-frame)) -(put 'websocket-illegal-frame 'error-message - "Cannot send illegal frame to websocket") -(put 'websocket-closed 'error-conditions - '(error websocket-error websocket-closed)) -(put 'websocket-closed 'error-message - "Cannot send message to a closed websocket") -(put 'websocket-unparseable-frame 'error-conditions - '(error websocket-error websocket-unparseable-frame)) -(put 'websocket-unparseable-frame 'error-message - "Received an unparseable frame") -(put 'websocket-frame-too-large 'error-conditions - '(error websocket-error websocket-frame-too-large)) -(put 'websocket-frame-too-large 'error-message - "The frame being sent is too large for this emacs to handle") - -(defun websocket-intersect (a b) - "Simple list intersection, should function like Common Lisp's `intersection'." - (let ((result)) - (dolist (elem a (nreverse result)) - (when (member elem b) - (push elem result))))) - -(defun websocket-get-debug-buffer-create (websocket) - "Get or create the buffer corresponding to WEBSOCKET." - (let ((buf (get-buffer-create (format "*websocket %s debug*" - (websocket-url websocket))))) - (when (= 0 (buffer-size buf)) - (buffer-disable-undo buf)) - buf)) - -(defun websocket-debug (websocket msg &rest args) - "In the WEBSOCKET's debug buffer, send MSG, with format ARGS." - (when websocket-debug - (let ((buf (websocket-get-debug-buffer-create websocket))) - (save-excursion - (with-current-buffer buf - (goto-char (point-max)) - (insert "[WS] ") - (insert (apply #'format (append (list msg) args))) - (insert "\n")))))) - -(defun websocket-verify-response-code (output) - "Verify that OUTPUT contains a valid HTTP response code. -The only acceptable one to websocket is responce code 101. -A t value will be returned on success, and an error thrown -if not." - (unless (string-match "^HTTP/1.1 \\([[:digit:]]+\\)" output) - (signal 'websocket-invalid-header (list "Invalid HTTP status line"))) - (unless (equal "101" (match-string 1 output)) - (signal 'websocket-received-error-http-response - (list (string-to-number (match-string 1 output))))) - t) - -(defun websocket-parse-repeated-field (output field) - "From header-containing OUTPUT, parse out the list from a -possibly repeated field." - (let ((pos 0) - (extensions)) - (while (and pos - (string-match (format "\r\n%s: \\(.*\\)\r\n" field) - output pos)) - (when (setq pos (match-end 1)) - (setq extensions (append extensions (split-string - (match-string 1 output) ", ?"))))) - extensions)) - -(defun websocket-process-frame (websocket frame) - "Using the WEBSOCKET's filter and connection, process the FRAME. -This returns a lambda that should be executed when all frames have -been processed. If the frame has a payload, the lambda has the frame -passed to the filter slot of WEBSOCKET. If the frame is a ping, -the lambda has a reply with a pong. If the frame is a close, the lambda -has connection termination." - (let ((opcode (websocket-frame-opcode frame))) - (cond ((memq opcode '(continuation text binary)) - (lambda () (websocket-try-callback 'websocket-on-message 'on-message - websocket frame))) - ((eq opcode 'ping) - (lambda () (websocket-send websocket - (make-websocket-frame - :opcode 'pong - :payload (websocket-frame-payload frame) - :completep t)))) - ((eq opcode 'close) - (lambda () (delete-process (websocket-conn websocket)))) - (t (lambda ()))))) - -(defun websocket-process-input-on-open-ws (websocket text) - "This handles input processing for both the client and server filters." - (let ((current-frame) - (processing-queue) - (start-point 0)) - (while (setq current-frame (websocket-read-frame - (substring text start-point))) - (push (websocket-process-frame websocket current-frame) processing-queue) - (cl-incf start-point (websocket-frame-length current-frame))) - (when (> (length text) start-point) - (setf (websocket-inflight-input websocket) - (substring text start-point))) - (dolist (to-process (nreverse processing-queue)) - (funcall to-process)))) - -(defun websocket-send-text (websocket text) - "To the WEBSOCKET, send TEXT as a complete frame." - (websocket-send - websocket - (make-websocket-frame :opcode 'text - :payload (encode-coding-string - text 'raw-text) - :completep t))) - -(defun websocket-check (frame) - "Check FRAME for correctness, returning true if correct." - (or - ;; Text, binary, and continuation frames need payloads - (and (memq (websocket-frame-opcode frame) '(text binary continuation)) - (websocket-frame-payload frame)) - ;; Pings and pongs may optionally have them - (memq (websocket-frame-opcode frame) '(ping pong)) - ;; And close shouldn't have any payload, and should always be complete. - (and (eq (websocket-frame-opcode frame) 'close) - (not (websocket-frame-payload frame)) - (websocket-frame-completep frame)))) - -(defun websocket-send (websocket frame) - "To the WEBSOCKET server, send the FRAME. -This will raise an error if the frame is illegal. - -The error signaled may be of type `websocket-illegal-frame' if -the frame is malformed in some way, also having the condition -type of `websocket-error'. The data associated with the signal -is the frame being sent. - -If the websocket is closed a signal `websocket-closed' is sent, -also with `websocket-error' condition. The data in the signal is -also the frame. - -The frame may be too large for this buid of Emacs, in which case -`websocket-frame-too-large' is returned, with the data of the -size of the frame which was too large to process. This also has -the `websocket-error' condition." - (unless (websocket-check frame) - (signal 'websocket-illegal-frame (list frame))) - (websocket-debug websocket "Sending frame, opcode: %s payload: %s" - (websocket-frame-opcode frame) - (websocket-frame-payload frame)) - (websocket-ensure-connected websocket) - (unless (websocket-openp websocket) - (signal 'websocket-closed (list frame))) - (process-send-string (websocket-conn websocket) - ;; We mask only when we're a client, following the spec. - (websocket-encode-frame frame (not (websocket-server-p websocket))))) - -(defun websocket-openp (websocket) - "Check WEBSOCKET and return non-nil if the connection is open." - (and websocket - (not (eq 'close (websocket-ready-state websocket))) - (member (process-status (websocket-conn websocket)) '(open run)))) - -(defun websocket-close (websocket) - "Close WEBSOCKET and erase all the old websocket data." - (websocket-debug websocket "Closing websocket") - (websocket-try-callback 'websocket-on-close 'on-close websocket) - (when (websocket-openp websocket) - (websocket-send websocket - (make-websocket-frame :opcode 'close - :completep t)) - (setf (websocket-ready-state websocket) 'closed)) - (delete-process (websocket-conn websocket))) - -(defun websocket-ensure-connected (websocket) - "If the WEBSOCKET connection is closed, open it." - (unless (and (websocket-conn websocket) - (cl-ecase (process-status (websocket-conn websocket)) - ((run open listen) t) - ((stop exit signal closed connect failed nil) nil))) - (websocket-close websocket) - (websocket-open (websocket-url websocket) - :protocols (websocket-protocols websocket) - :extensions (websocket-extensions websocket) - :on-open (websocket-on-open websocket) - :on-message (websocket-on-message websocket) - :on-close (websocket-on-close websocket) - :on-error (websocket-on-error websocket)))) - -;;;;;;;;;;;;;;;;;;;;;; -;; Websocket client ;; -;;;;;;;;;;;;;;;;;;;;;; - -(cl-defun websocket-open (url &key protocols extensions (on-open 'identity) - (on-message (lambda (_w _f))) (on-close 'identity) - (on-error 'websocket-default-error-handler) - (nowait nil) (custom-header-alist nil)) - "Open a websocket connection to URL, returning the `websocket' struct. -The PROTOCOL argument is optional, and setting it will declare to -the server that this client supports the protocols in the list -given. We will require that the server also has to support that -protocols. - -Similar logic applies to EXTENSIONS, which is a list of conses, -the car of which is a string naming the extension, and the cdr of -which is the list of parameter strings to use for that extension. -The parameter strings are of the form \"key=value\" or \"value\". -EXTENSIONS can be NIL if none are in use. An example value would -be (\"deflate-stream\" . (\"mux\" \"max-channels=4\")). - -Cookies that are set via `url-cookie-store' will be used during -communication with the server, and cookies received from the -server will be stored in the same cookie storage that the -`url-cookie' package uses. - -Optionally you can specify -ON-OPEN, ON-MESSAGE and ON-CLOSE callbacks as well. - -The ON-OPEN callback is called after the connection is -established with the websocket as the only argument. The return -value is unused. - -The ON-MESSAGE callback is called after receiving a frame, and is -called with the websocket as the first argument and -`websocket-frame' struct as the second. The return value is -unused. - -The ON-CLOSE callback is called after the connection is closed, or -failed to open. It is called with the websocket as the only -argument, and the return value is unused. - -The ON-ERROR callback is called when any of the other callbacks -have an error. It takes the websocket as the first argument, and -a symbol as the second argument either `on-open', `on-message', -or `on-close', and the error as the third argument. Do NOT -rethrow the error, or else you may miss some websocket messages. -You similarly must not generate any other errors in this method. -If you want to debug errors, set -`websocket-callback-debug-on-error' to t, but this also can be -dangerous is the debugger is quit out of. If not specified, -`websocket-default-error-handler' is used. - -For each of these event handlers, the client code can store -arbitrary data in the `client-data' slot in the returned -websocket. - -The following errors might be thrown in this method or in -websocket processing, all of them having the error-condition -`websocket-error' in addition to their own symbol: - -`websocket-unsupported-protocol': Data in the error signal is the -protocol that is unsupported. For example, giving a URL starting -with http by mistake raises this error. - -`websocket-wss-needs-emacs-24': Trying to connect wss protocol -using Emacs < 24 raises this error. You can catch this error -also by `websocket-unsupported-protocol'. - -`websocket-received-error-http-response': Data in the error -signal is the integer error number. - -`websocket-invalid-header': Data in the error is a string -describing the invalid header received from the server. - -`websocket-unparseable-frame': Data in the error is a string -describing the problem with the frame. - -`nowait': If NOWAIT is true, return without waiting for the -connection to complete. - -`custom-headers-alist': An alist of custom headers to pass to the -server. The car is the header name, the cdr is the header value. -These are different from the extensions because it is not related -to the websocket protocol. -" - (let* ((name (format "websocket to %s" url)) - (url-struct (url-generic-parse-url url)) - (key (websocket-genkey)) - (coding-system-for-read 'binary) - (coding-system-for-write 'binary) - (conn (if (member (url-type url-struct) '("ws" "wss")) - (let* ((type (if (equal (url-type url-struct) "ws") - 'plain 'tls)) - (port (if (= 0 (url-port url-struct)) - (if (eq type 'tls) 443 80) - (url-port url-struct))) - (host (url-host url-struct))) - (if (eq type 'plain) - (make-network-process :name name :buffer nil :host host - :service port :nowait nowait) - (condition-case-unless-debug nil - (open-network-stream name nil host port :type type :nowait nowait) - (wrong-number-of-arguments - (signal 'websocket-wss-needs-emacs-24 (list "wss")))))) - (signal 'websocket-unsupported-protocol (list (url-type url-struct))))) - (websocket (websocket-inner-create - :conn conn - :url url - :on-open on-open - :on-message on-message - :on-close on-close - :on-error on-error - :protocols protocols - :extensions (mapcar 'car extensions) - :accept-string - (websocket-calculate-accept key)))) - (unless conn (error "Could not establish the websocket connection to %s" url)) - (process-put conn :websocket websocket) - (set-process-filter conn - (lambda (process output) - (let ((websocket (process-get process :websocket))) - (websocket-outer-filter websocket output)))) - (set-process-sentinel - conn - (websocket-sentinel url conn key protocols extensions custom-header-alist nowait)) - (set-process-query-on-exit-flag conn nil) - (websocket-ensure-handshake url conn key protocols extensions custom-header-alist nowait) - websocket)) - -(defun websocket-sentinel (url conn key protocols extensions custom-header-alist nowait) - #'(lambda (process change) - (let ((websocket (process-get process :websocket))) - (websocket-debug websocket "State change to %s" change) - (let ((status (process-status process))) - (when (and nowait (eq status 'open)) - (websocket-ensure-handshake url conn key protocols extensions custom-header-alist nowait)) - - (when (and (member status '(closed failed exit signal)) - (not (eq 'closed (websocket-ready-state websocket)))) - (websocket-try-callback 'websocket-on-close 'on-close websocket)))))) - -(defun websocket-ensure-handshake (url conn key protocols extensions custom-header-alist nowait) - (let ((url-struct (url-generic-parse-url url)) - (websocket (process-get conn :websocket))) - (when (and (eq 'connecting (websocket-ready-state websocket)) - (memq (process-status conn) - (list 'run (if nowait 'connect 'open)))) - (process-send-string conn - (format "GET %s HTTP/1.1\r\n" - (let ((path (url-filename url-struct))) - (if (> (length path) 0) path "/")))) - (websocket-debug websocket "Sending handshake, key: %s, acceptance: %s" - key (websocket-accept-string websocket)) - (process-send-string conn - (websocket-create-headers - url key protocols extensions custom-header-alist))))) - -(defun websocket-process-headers (url headers) - "On opening URL, process the HEADERS sent from the server." - (when (string-match "Set-Cookie: \(.*\)\r\n" headers) - ;; The url-current-object is assumed to be set by - ;; url-cookie-handle-set-cookie. - (let ((url-current-object (url-generic-parse-url url))) - (url-cookie-handle-set-cookie (match-string 1 headers))))) - -(defun websocket-outer-filter (websocket output) - "Filter the WEBSOCKET server's OUTPUT. -This will parse headers and process frames repeatedly until there -is no more output or the connection closes. If the websocket -connection is invalid, the connection will be closed." - (websocket-debug websocket "Received: %s" output) - (let ((start-point) - (text (concat (websocket-inflight-input websocket) output)) - (header-end-pos)) - (setf (websocket-inflight-input websocket) nil) - ;; If we've received the complete header, check to see if we've - ;; received the desired handshake. - (when (and (eq 'connecting (websocket-ready-state websocket))) - (if (and (setq header-end-pos (string-match "\r\n\r\n" text)) - (setq start-point (+ 4 header-end-pos))) - (progn - (condition-case err - (progn - (websocket-verify-response-code text) - (websocket-verify-headers websocket text) - (websocket-process-headers (websocket-url websocket) text)) - (error - (websocket-close websocket) - (funcall (websocket-on-error websocket) - websocket 'on-open err))) - (setf (websocket-ready-state websocket) 'open) - (websocket-try-callback 'websocket-on-open 'on-open websocket)) - (setf (websocket-inflight-input websocket) text))) - (when (eq 'open (websocket-ready-state websocket)) - (websocket-process-input-on-open-ws - websocket (substring text (or start-point 0)))))) - -(defun websocket-verify-headers (websocket output) - "Based on WEBSOCKET's data, ensure the headers in OUTPUT are valid. -The output is assumed to have complete headers. This function -will either return t or call `error'. This has the side-effect -of populating the list of server extensions to WEBSOCKET." - (let ((accept-regexp - (concat "Sec-Web[Ss]ocket-Accept: " (regexp-quote (websocket-accept-string websocket))))) - (websocket-debug websocket "Checking for accept header regexp: %s" accept-regexp) - (unless (string-match accept-regexp output) - (signal 'websocket-invalid-header - (list "Incorrect handshake from websocket: is this really a websocket connection?")))) - (let ((case-fold-search t)) - (websocket-debug websocket "Checking for upgrade header") - (unless (string-match "\r\nUpgrade: websocket\r\n" output) - (signal 'websocket-invalid-header - (list "No 'Upgrade: websocket' header found"))) - (websocket-debug websocket "Checking for connection header") - (unless (string-match "\r\nConnection: upgrade\r\n" output) - (signal 'websocket-invalid-header - (list "No 'Connection: upgrade' header found"))) - (when (websocket-protocols websocket) - (dolist (protocol (websocket-protocols websocket)) - (websocket-debug websocket "Checking for protocol match: %s" - protocol) - (let ((protocols - (if (string-match (format "\r\nSec-Websocket-Protocol: %s\r\n" - protocol) - output) - (list protocol) - (signal 'websocket-invalid-header - (list "Incorrect or missing protocol returned by the server."))))) - (setf (websocket-negotiated-protocols websocket) protocols)))) - (let* ((extensions (websocket-parse-repeated-field - output - "Sec-WebSocket-Extensions")) - (extra-extensions)) - (dolist (ext extensions) - (let ((x (cl-first (split-string ext "; ?")))) - (unless (or (member x (websocket-extensions websocket)) - (member x extra-extensions)) - (push x extra-extensions)))) - (when extra-extensions - (signal 'websocket-invalid-header - (list (format "Non-requested extensions returned by server: %S" - extra-extensions)))) - (setf (websocket-negotiated-extensions websocket) extensions))) - t) - -;;;;;;;;;;;;;;;;;;;;;; -;; Websocket server ;; -;;;;;;;;;;;;;;;;;;;;;; - -(defvar websocket-server-websockets nil - "A list of current websockets live on any server.") - -(cl-defun websocket-server (port &rest plist) - "Open a websocket server on PORT. -If the plist contains a `:host' HOST pair, this value will be -used to configure the addresses the socket listens on. The symbol -`local' specifies the local host. If unspecified or nil, the -socket will listen on all addresses. - -This also takes a plist of callbacks: `:on-open', `:on-message', -`:on-close' and `:on-error', which operate exactly as documented -in the websocket client function `websocket-open'. Returns the -connection, which should be kept in order to pass to -`websocket-server-close'." - (let* ((conn (make-network-process - :name (format "websocket server on port %s" port) - :server t - :family 'ipv4 - :noquery t - :filter 'websocket-server-filter - :log 'websocket-server-accept - :filter-multibyte nil - :plist plist - :host (plist-get plist :host) - :service port))) - conn)) - -(defun websocket-server-close (conn) - "Closes the websocket, as well as all open websockets for this server." - (let ((to-delete)) - (dolist (ws websocket-server-websockets) - (when (eq (websocket-server-conn ws) conn) - (if (eq (websocket-ready-state ws) 'closed) - (unless (member ws to-delete) - (push ws to-delete)) - (websocket-close ws)))) - (dolist (ws to-delete) - (setq websocket-server-websockets (remove ws websocket-server-websockets)))) - (delete-process conn)) - -(defun websocket-server-accept (server client _message) - "Accept a new websocket connection from a client." - (let ((ws (websocket-inner-create - :server-conn server - :conn client - :url client - :server-p t - :on-open (or (process-get server :on-open) 'identity) - :on-message (or (process-get server :on-message) (lambda (_ws _frame))) - :on-close (let ((user-method - (or (process-get server :on-close) 'identity))) - (lambda (ws) - (setq websocket-server-websockets - (remove ws websocket-server-websockets)) - (funcall user-method ws))) - :on-error (or (process-get server :on-error) - 'websocket-default-error-handler) - :protocols (process-get server :protocol) - :extensions (mapcar 'car (process-get server :extensions))))) - (unless (member ws websocket-server-websockets) - (push ws websocket-server-websockets)) - (process-put client :websocket ws) - (set-process-coding-system client 'binary 'binary) - (set-process-sentinel client - (lambda (process change) - (let ((websocket (process-get process :websocket))) - (websocket-debug websocket "State change to %s" change) - (when (and - (member (process-status process) '(closed failed exit signal)) - (not (eq 'closed (websocket-ready-state websocket)))) - (websocket-try-callback 'websocket-on-close 'on-close websocket))))))) - -(defun websocket-create-headers (url key protocol extensions custom-headers-alist) - "Create connections headers for the given URL, KEY, PROTOCOL, and EXTENSIONS. -Additionally, the CUSTOM-HEADERS-ALIST is passed from the client. -All these parameters are defined as in `websocket-open'." - (let* ((parsed-url (url-generic-parse-url url)) - (host-port (if (url-port-if-non-default parsed-url) - (format "%s:%s" (url-host parsed-url) (url-port parsed-url)) - (url-host parsed-url))) - (cookie-header (url-cookie-generate-header-lines - host-port (car (url-path-and-query parsed-url)) - (equal (url-type parsed-url) "wss")))) - (format (concat "Host: %s\r\n" - "Upgrade: websocket\r\n" - "Connection: Upgrade\r\n" - "Sec-WebSocket-Key: %s\r\n" - "Sec-WebSocket-Version: 13\r\n" - (when protocol - (concat - (mapconcat - (lambda (protocol) - (format "Sec-WebSocket-Protocol: %s" protocol)) - protocol "\r\n") - "\r\n")) - (when extensions - (format "Sec-WebSocket-Extensions: %s\r\n" - (mapconcat - (lambda (ext) - (concat - (car ext) - (when (cdr ext) "; ") - (when (cdr ext) - (mapconcat 'identity (cdr ext) "; ")))) - extensions ", "))) - (when cookie-header cookie-header) - (concat (mapconcat (lambda (cons) (format "%s: %s" (car cons) (cdr cons))) - custom-headers-alist "\r\n") - (when custom-headers-alist "\r\n")) - "\r\n") - host-port - key - protocol))) - -(defun websocket-get-server-response (websocket client-protocols client-extensions) - "Get the websocket response from client WEBSOCKET." - (let ((separator "\r\n")) - (concat "HTTP/1.1 101 Switching Protocols" separator - "Upgrade: websocket" separator - "Connection: Upgrade" separator - "Sec-WebSocket-Accept: " - (websocket-accept-string websocket) separator - (let ((protocols - (websocket-intersect client-protocols - (websocket-protocols websocket)))) - (when protocols - (concat - (mapconcat - (lambda (protocol) (format "Sec-WebSocket-Protocol: %s" - protocol)) protocols separator) - separator))) - (let ((extensions (websocket-intersect - client-extensions - (websocket-extensions websocket)))) - (when extensions - (concat - (mapconcat - (lambda (extension) (format "Sec-Websocket-Extensions: %s" - extension)) extensions separator) - separator))) - separator))) - -(defun websocket-server-filter (process output) - "This acts on all OUTPUT from websocket clients PROCESS." - (let* ((ws (process-get process :websocket)) - (text (concat (websocket-inflight-input ws) output))) - (setf (websocket-inflight-input ws) nil) - (cond ((eq (websocket-ready-state ws) 'connecting) - ;; check for connection string - (let ((end-of-header-pos - (let ((pos (string-match "\r\n\r\n" text))) - (when pos (+ 4 pos))))) - (if end-of-header-pos - (progn - (let ((header-info (websocket-verify-client-headers text))) - (if header-info - (progn (setf (websocket-accept-string ws) - (websocket-calculate-accept - (plist-get header-info :key))) - (process-send-string - process - (websocket-get-server-response - ws (plist-get header-info :protocols) - (plist-get header-info :extensions))) - (setf (websocket-ready-state ws) 'open) - (websocket-try-callback 'websocket-on-open - 'on-open ws)) - (message "Invalid client headers found in: %s" output) - (process-send-string process "HTTP/1.1 400 Bad Request\r\n\r\n") - (websocket-close ws))) - (when (> (length text) (+ 1 end-of-header-pos)) - (websocket-server-filter process (substring - text - end-of-header-pos)))) - (setf (websocket-inflight-input ws) text)))) - ((eq (websocket-ready-state ws) 'open) - (websocket-process-input-on-open-ws ws text)) - ((eq (websocket-ready-state ws) 'closed) - (message "WARNING: Should not have received further input on closed websocket"))))) - -(defun websocket-verify-client-headers (output) - "Verify the headers from the WEBSOCKET client connection in OUTPUT. -Unlike `websocket-verify-headers', this is a quieter routine. We -don't want to error due to a bad client, so we just print out -messages and a plist containing `:key', the websocket key, -`:protocols' and `:extensions'." - (cl-block nil - (let ((case-fold-search t) - (plist)) - (unless (string-match "HTTP/1.1" output) - (message "Websocket client connection: HTTP/1.1 not found") - (cl-return nil)) - (unless (string-match "^Host: " output) - (message "Websocket client connection: Host header not found") - (cl-return nil)) - (unless (string-match "^Upgrade: websocket\r\n" output) - (message "Websocket client connection: Upgrade: websocket not found") - (cl-return nil)) - (if (string-match "^Sec-WebSocket-Key: \\([[:graph:]]+\\)\r\n" output) - (setq plist (plist-put plist :key (match-string 1 output))) - (message "Websocket client connect: No key sent") - (cl-return nil)) - (unless (string-match "^Sec-WebSocket-Version: 13" output) - (message "Websocket client connect: Websocket version 13 not found") - (cl-return nil)) - (when (string-match "^Sec-WebSocket-Protocol:" output) - (setq plist (plist-put plist :protocols (websocket-parse-repeated-field - output - "Sec-Websocket-Protocol")))) - (when (string-match "^Sec-WebSocket-Extensions:" output) - (setq plist (plist-put plist :extensions (websocket-parse-repeated-field - output - "Sec-Websocket-Extensions")))) - plist))) - -(provide 'websocket) - -;;; websocket.el ends here diff --git a/elpa/websocket-20200321.102/websocket.elc b/elpa/websocket-20200321.102/websocket.elc deleted file mode 100644 index 9e53e65f96b34fcc3af4a6a1a45f208231b32605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63033 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�sS9O7LaneMS7eYVp1=(f#n&)PC{-Pm;zU!KXux5biRj}e(jy^_ zX>wVp*hn^&x9kE-n$m6p6)NQU6wHEEgndxqu0u{KA2a>r=kk_B-8o=_qLmf^Qn2-N z!~r)$UK2f1V&u6t2qq+l%;3pgaxFX`jc9Bp4XHzbkWpR6K-`XF)iNw*CD=s^kH0kK z^hgqDhGjvrM9KPG25d>H);zqSb@Z7x4^oarHNw{TF(7^{QNby@Ko> zJzVAd_Ne;Zu#0o+=?HWv{~DSvF$F|%8ZlL1_NG{Nq|Bg1%RP-Pn|_(=$wUB(r-P_U z)XM0ptf+YsR0o>m1ITidogx2(+%d@O#27(4xZ%-$5BGkX(Lw(QcJf@Gt$4C8Jf`xb z8{HazcgxO9t}R9jrS=2umJ(I%V$F$xE4bKKhT!{{@N%>hxRaLq0Y4ElJ=Aot@9Xl~ z;}2RkJCBI5Zy|F(HHBGByY)+q4WmB}*T=PKok8fwK%#99BNf~;?zX_FVy!%FGHF@%08ZMJlhgqBrc%XFDTX6Y&b7P8GI{xxB=7gQLEkKX#wD@ z&Sd7K07nlj2beV~?zQ)Ac5ZmWAQcXL6?Jc9i)GeWYV@q;eRYhPe|gY_jux&y$Qap1 zt`w~!4{^t9e{hEm3Q!Q6*N`@l$hv(XXP0?}9(CI!--gpM7Z0r84FQZ=BnI)1QYSTJ z(6CJ2dRHNt$x9k6C==1wEHG)n*-XBQoOMe)&E&hv7S>}I6?;^$!D)48Ky-&3)ZG!E zN4P8*ryjR~upqVNFg@%@!m!ZQMTP)5=b2oDE6Wia-)w(Ap~<%e?texH$eTbfP3KP$ z`o(@(Ha#^YqEhe=z)sd_?rO*1BNC(?~5AmXP=r^>8hQ52`oCkij*H zR`%c?ja_LUy@oe?rz=WuJk_(iYXoeGX#uS+e+AiQ$C1u34^z2%hmn-ej`t)$&{_ka<|*23!^>S6Nqr^U?1<^>^iW(Ru3VHfni9C77SzvXowT&|Zx z0@GVad;P{kfjfwT?unlhGc}U77--mBfA;12vuN${qxC0Sk?}z~20RRe`)s$Opkpcx zlj>IOEul^qfjCI$z;l6k1v$j8iI;$ePSyV>z`~J&n)nP*Rz{r#z9F$7(GUV*$-~v_ zBn*_O=`4_Buz+nJC5N7e_6UfAg^Ni*wd|4J&_3FEo!fxCwO#}MJW1sdhXgp~ozBi6^3|pZ^Dem! zj9AEQ%Ejd3Pn(sWV@qomS*B+j8lSO3H7|<~dWZSkI|TSOvBqj)rY_HN=y2dfzA#uR zu>9J!p++>Yr-mlak{gG$!iNO{o1--ns@jt914@WrnKcsDa%&`1``+(K>k!_jnmK07 zlfyNEIVlrM1hV5{rWQU{^UzLEn|*Y$)0}EHwswN!&3u0gX1o^=)E#t;8SB6%ZD3hm zuiG5pNnVfEaGIhS(;Zfz)q$rD(i>UtRC+#xO^Oji?%A<+X$=zaAxOy0xU1PMcs^5I zc*$J7Y5XR^U`;|d=SXTv>?$NpNYC&%bwN>J)pS0U`=1axBhLRXJ;1AU=Zz+zwQf$kkwJLFhih-oCBHQ}JO6dcm%n(!A;tPm?1-o&GnL!CTu|%x-uZ# zL;~i68fopReT}K7qo8>?(sJQhYL3BzCN( zH8svMf=_X`%G92SX5h$LgI84;#h~_qn~HH1syxIw&}#<96&|WFSaU>SB{F67g;6z_ z6F;2Dd|TyLUxJQ66|jP=6;jh*RN!T099nEHRq|PT5GgnGG*D-N;Rc-0QX{$~P_qN& zOS!67NVrkj&Z$DASX;}l5teF~F0qq6zrP{j|tiNH2^fIXz zM}m77KsPM^*ExQEdDXHdJ4+`01avTKprhV6Z)~Cs&}^G{EN?7Z4-4i}eE_M2Dh5Xc zp%OFM-i4r=v+#7)x(csVyL6jInyq?TK8-ShTUz1X^*JKelDVfObaLeiq)K?Ueqe}^ z+)OIsBnU@5_n}qC!pj8Q{h>JFrU-49N*|d@LQQ<7pW8}6=Qu-dYID@m8>&R!y)^gX zjkyn=8p#$89j3*PO^XmsDP0@EV(u5VMLOUjEZ?=r>@}1rpw*xI*$uR!O_BnEUhIug z3b!FjFAO+Zp9F-9$I&KYKz3eH^=3gDw4pMNfmAY%qu&^Cd+qKC=!+X(RB~wWdC;M9 z^x!=Ty-ql{uvW{%*cpN0IDcNZ1E)nEk6?_qZz+>dk;Mmy zi~&Cv-2}*r?F;gQP=)E;Q6^~EE@*DoQ|sKEo;byJ)!+m)2m*bXPINdpikR;yl4}~( zNbTZ-i(7Qs0!heV{J|Oa>Sa*6xTZ#PNHOvl1Onk^J-4;;Sa5YACm zgnrt+g!ew9VJ5+VZfDXE#m_a=%4)b{5~Ch#=Q}5hhET8xe_z=rs5Ap}2e#LDHZhGp+>N)|Lj^VFy z*ISi_Y;6=4c>x=G|eHu89;R@~(swim3s_g1!J!o~lG1AY;-6QN@Tfi-+a% zh**^JOSXJAyL_(Y(=SjS_u}CfBr;>dK=={pv@jq^SuO)eW)C2-1CUIL7;rLs0Ery{ zoDFmU=Bx>}Lq(?kVqu%&b-+_AQXLA}G{qNX)HqKn0Ub5Z<0f`r%sR$oHivP18$9wgC4}j*)1?i zMUf|Lr1F<>xl~VBGg}+4RBp5^H_GWz@3er8{OFar(?a@D$}NgWQtq+?>GV0RL@?vC z0@aY1`(MgEf&$q?>5PS00i7_4W_RyaoX(nwlYpU_byyxS2n}SKVm&v~u5Dv{)PWp~ i_C3*X$K5e`8ARCTnXAWjO@6+BfxX7THIQBx=l?JG6!NM7 diff --git a/elpa/with-editor-20200217.1015/dir b/elpa/with-editor-20200217.1015/dir deleted file mode 100644 index c5810e07..00000000 --- a/elpa/with-editor-20200217.1015/dir +++ /dev/null @@ -1,18 +0,0 @@ -This is the file .../info/dir, which contains the -topmost node of the Info hierarchy, called (dir)Top. -The first time you invoke Info you start off looking at this node. - -File: dir, Node: Top This is the top of the INFO tree - - This (the Directory node) gives a menu of major topics. - Typing "q" exits, "H" lists all Info commands, "d" returns here, - "h" gives a primer for first-timers, - "mEmacs" visits the Emacs manual, etc. - - In Emacs, you can click mouse button 2 on a menu item or cross reference - to select it. - -* Menu: - -Emacs -* With-Editor: (with-editor). Using the Emacsclient as $EDITOR. diff --git a/elpa/with-editor-20200217.1015/with-editor-autoloads.el b/elpa/with-editor-20200217.1015/with-editor-autoloads.el deleted file mode 100644 index cdfafa8e..00000000 --- a/elpa/with-editor-20200217.1015/with-editor-autoloads.el +++ /dev/null @@ -1,99 +0,0 @@ -;;; with-editor-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "with-editor" "with-editor.el" (0 0 0 0)) -;;; Generated autoloads from with-editor.el - -(autoload 'with-editor-export-editor "with-editor" "\ -Teach subsequent commands to use current Emacs instance as editor. - -Set and export the environment variable ENVVAR, by default -\"EDITOR\". The value is automatically generated to teach -commands to use the current Emacs instance as \"the editor\". - -This works in `shell-mode', `term-mode' and `eshell-mode'. - -\(fn &optional (ENVVAR \"EDITOR\"))" t nil) - -(autoload 'with-editor-export-git-editor "with-editor" "\ -Like `with-editor-export-editor' but always set `$GIT_EDITOR'. - -\(fn)" t nil) - -(autoload 'with-editor-export-hg-editor "with-editor" "\ -Like `with-editor-export-editor' but always set `$HG_EDITOR'. - -\(fn)" t nil) - -(defvar shell-command-with-editor-mode nil "\ -Non-nil if Shell-Command-With-Editor mode is enabled. -See the `shell-command-with-editor-mode' command -for a description of this minor mode.") - -(custom-autoload 'shell-command-with-editor-mode "with-editor" nil) - -(autoload 'shell-command-with-editor-mode "with-editor" "\ -Teach `shell-command' to use current Emacs instance as editor. - -Teach `shell-command', and all commands that ultimately call that -command, to use the current Emacs instance as editor by executing -\"EDITOR=CLIENT COMMAND&\" instead of just \"COMMAND&\". - -CLIENT is automatically generated; EDITOR=CLIENT instructs -COMMAND to use to the current Emacs instance as \"the editor\", -assuming no other variable overrides the effect of \"$EDITOR\". -CLIENT may be the path to an appropriate emacsclient executable -with arguments, or a script which also works over Tramp. - -Alternatively you can use the `with-editor-async-shell-command', -which also allows the use of another variable instead of -\"EDITOR\". - -\(fn &optional ARG)" t nil) - -(autoload 'with-editor-async-shell-command "with-editor" "\ -Like `async-shell-command' but with `$EDITOR' set. - -Execute string \"ENVVAR=CLIENT COMMAND\" in an inferior shell; -display output, if any. With a prefix argument prompt for an -environment variable, otherwise the default \"EDITOR\" variable -is used. With a negative prefix argument additionally insert -the COMMAND's output at point. - -CLIENT is automatically generated; ENVVAR=CLIENT instructs -COMMAND to use to the current Emacs instance as \"the editor\", -assuming it respects ENVVAR as an \"EDITOR\"-like variable. -CLIENT may be the path to an appropriate emacsclient executable -with arguments, or a script which also works over Tramp. - -Also see `async-shell-command' and `shell-command'. - -\(fn COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER ENVVAR)" t nil) - -(autoload 'with-editor-shell-command "with-editor" "\ -Like `shell-command' or `with-editor-async-shell-command'. -If COMMAND ends with \"&\" behave like the latter, -else like the former. - -\(fn COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER ENVVAR)" t nil) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "with-editor" '("with-editor" "start-file-process--with-editor-process-filter" "server-" "shell-command--shell-command-with-editor-mode"))) - -;;;*** - -;;;### (autoloads nil nil ("with-editor-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; with-editor-autoloads.el ends here diff --git a/elpa/with-editor-20200217.1015/with-editor-pkg.el b/elpa/with-editor-20200217.1015/with-editor-pkg.el deleted file mode 100644 index 121c91f8..00000000 --- a/elpa/with-editor-20200217.1015/with-editor-pkg.el +++ /dev/null @@ -1,13 +0,0 @@ -(define-package "with-editor" "20200217.1015" "Use the Emacsclient as $EDITOR" - '((emacs "24.4") - (async "1.9")) - :keywords - '("tools") - :authors - '(("Jonas Bernoulli" . "jonas@bernoul.li")) - :maintainer - '("Jonas Bernoulli" . "jonas@bernoul.li") - :url "https://github.com/magit/with-editor") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/with-editor-20200217.1015/with-editor.el b/elpa/with-editor-20200217.1015/with-editor.el deleted file mode 100644 index aae15596..00000000 --- a/elpa/with-editor-20200217.1015/with-editor.el +++ /dev/null @@ -1,874 +0,0 @@ -;;; with-editor.el --- Use the Emacsclient as $EDITOR -*- lexical-binding: t -*- - -;; Copyright (C) 2014-2020 The Magit Project Contributors -;; -;; You should have received a copy of the AUTHORS.md file. If not, -;; see https://github.com/magit/with-editor/blob/master/AUTHORS.md. - -;; Author: Jonas Bernoulli -;; Maintainer: Jonas Bernoulli - -;; Package-Requires: ((emacs "24.4") (async "1.9")) -;; Keywords: tools -;; Homepage: https://github.com/magit/with-editor - -;; This file is not part of GNU Emacs. - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with Magit. If not, see http://www.gnu.org/licenses. - -;;; Commentary: - -;; This library makes it possible to reliably use the Emacsclient as -;; the `$EDITOR' of child processes. It makes sure that they know how -;; to call home. For remote processes a substitute is provided, which -;; communicates with Emacs on standard output/input instead of using a -;; socket as the Emacsclient does. - -;; It provides the commands `with-editor-async-shell-command' and -;; `with-editor-shell-command', which are intended as replacements -;; for `async-shell-command' and `shell-command'. They automatically -;; export `$EDITOR' making sure the executed command uses the current -;; Emacs instance as "the editor". With a prefix argument these -;; commands prompt for an alternative environment variable such as -;; `$GIT_EDITOR'. To always use these variants add this to your init -;; file: -;; -;; (define-key (current-global-map) -;; [remap async-shell-command] 'with-editor-async-shell-command) -;; (define-key (current-global-map) -;; [remap shell-command] 'with-editor-shell-command) - -;; Alternatively use the global `shell-command-with-editor-mode', -;; which always sets `$EDITOR' for all Emacs commands which ultimately -;; use `shell-command' to asynchronously run some shell command. - -;; The command `with-editor-export-editor' exports `$EDITOR' or -;; another such environment variable in `shell-mode', `term-mode' and -;; `eshell-mode' buffers. Use this Emacs command before executing a -;; shell command which needs the editor set, or always arrange for the -;; current Emacs instance to be used as editor by adding it to the -;; appropriate mode hooks: -;; -;; (add-hook 'shell-mode-hook 'with-editor-export-editor) -;; (add-hook 'term-exec-hook 'with-editor-export-editor) -;; (add-hook 'eshell-mode-hook 'with-editor-export-editor) - -;; Some variants of this function exist, these two forms are -;; equivalent: -;; -;; (add-hook 'shell-mode-hook -;; (apply-partially 'with-editor-export-editor "GIT_EDITOR")) -;; (add-hook 'shell-mode-hook 'with-editor-export-git-editor) - -;; This library can also be used by other packages which need to use -;; the current Emacs instance as editor. In fact this library was -;; written for Magit and its `git-commit-mode' and `git-rebase-mode'. -;; Consult `git-rebase.el' and the related code in `magit-sequence.el' -;; for a simple example. - -;;; Code: - -(require 'cl-lib) -;; `pcase-dolist' is not autoloaded on Emacs 24. -(eval-when-compile (require 'pcase)) -(require 'server) -(require 'shell) - -(and (require 'async-bytecomp nil t) - (let ((pkgs (bound-and-true-p async-bytecomp-allowed-packages))) - (if (consp pkgs) - (cl-intersection '(all magit) pkgs) - (memq pkgs '(all t)))) - (fboundp 'async-bytecomp-package-mode) - (async-bytecomp-package-mode 1)) - -(eval-when-compile - (progn (require 'dired nil t) - (require 'eshell nil t) - (require 'term nil t) - (require 'warnings nil t))) -(declare-function dired-get-filename 'dired) -(declare-function term-emulate-terminal 'term) -(defvar eshell-preoutput-filter-functions) -(defvar git-commit-post-finish-hook) - -;;; Options - -(defgroup with-editor nil - "Use the Emacsclient as $EDITOR." - :group 'external - :group 'server) - -(defun with-editor-locate-emacsclient () - "Search for a suitable Emacsclient executable." - (or (with-editor-locate-emacsclient-1 - (with-editor-emacsclient-path) - (length (split-string emacs-version "\\."))) - (prog1 nil (display-warning 'with-editor "\ -Cannot determine a suitable Emacsclient - -Determining an Emacsclient executable suitable for the -current Emacs instance failed. For more information -please see https://github.com/magit/magit/wiki/Emacsclient.")))) - -(defun with-editor-locate-emacsclient-1 (path depth) - (let* ((version-lst (cl-subseq (split-string emacs-version "\\.") 0 depth)) - (version-reg (concat "^" (mapconcat #'identity version-lst "\\.")))) - (or (locate-file-internal - (if (equal (downcase invocation-name) "remacs") - "remacsclient" - "emacsclient") - path - (cl-mapcan - (lambda (v) (cl-mapcar (lambda (e) (concat v e)) exec-suffixes)) - (nconc (and (boundp 'debian-emacs-flavor) - (list (format ".%s" debian-emacs-flavor))) - (cl-mapcon (lambda (v) - (setq v (mapconcat #'identity (reverse v) ".")) - (list v (concat "-" v) (concat ".emacs" v))) - (reverse version-lst)) - (list "" "-snapshot" ".emacs-snapshot"))) - (lambda (exec) - (ignore-errors - (string-match-p version-reg - (with-editor-emacsclient-version exec))))) - (and (> depth 1) - (with-editor-locate-emacsclient-1 path (1- depth)))))) - -(defun with-editor-emacsclient-version (exec) - (let ((default-directory (file-name-directory exec))) - (ignore-errors - (cadr (split-string (car (process-lines exec "--version"))))))) - -(defun with-editor-emacsclient-path () - (let ((path exec-path)) - (when invocation-directory - (push (directory-file-name invocation-directory) path) - (let* ((linkname (expand-file-name invocation-name invocation-directory)) - (truename (file-chase-links linkname))) - (unless (equal truename linkname) - (push (directory-file-name (file-name-directory truename)) path))) - (when (eq system-type 'darwin) - (let ((dir (expand-file-name "bin" invocation-directory))) - (when (file-directory-p dir) - (push dir path))) - (when (string-match-p "Cellar" invocation-directory) - (let ((dir (expand-file-name "../../../bin" invocation-directory))) - (when (file-directory-p dir) - (push dir path)))))) - (cl-remove-duplicates path :test 'equal))) - -(defcustom with-editor-emacsclient-executable (with-editor-locate-emacsclient) - "The Emacsclient executable used by the `with-editor' macro." - :group 'with-editor - :type '(choice (string :tag "Executable") - (const :tag "Don't use Emacsclient" nil))) - -(defcustom with-editor-sleeping-editor "\ -sh -c '\ -printf \"WITH-EDITOR: $$ OPEN $0\\037 IN $(pwd)\\n\"; \ -sleep 604800 & sleep=$!; \ -trap \"kill $sleep; exit 0\" USR1; \ -trap \"kill $sleep; exit 1\" USR2; \ -wait $sleep'" - "The sleeping editor, used when the Emacsclient cannot be used. - -This fallback is used for asynchronous processes started inside -the macro `with-editor', when the process runs on a remote machine -or for local processes when `with-editor-emacsclient-executable' -is nil (i.e. when no suitable Emacsclient was found, or the user -decided not to use it). - -Where the latter uses a socket to communicate with Emacs' server, -this substitute prints edit requests to its standard output on -which a process filter listens for such requests. As such it is -not a complete substitute for a proper Emacsclient, it can only -be used as $EDITOR of child process of the current Emacs instance. - -Some shells do not execute traps immediately when waiting for a -child process, but by default we do use such a blocking child -process. - -If you use such a shell (e.g. `csh' on FreeBSD, but not Debian), -then you have to edit this option. You can either replace \"sh\" -with \"bash\" (and install that), or you can use the older, less -performant implementation: - - \"sh -c '\\ - echo \\\"WITH-EDITOR: $$ OPEN $0 IN $(pwd)\\\"; \\ - trap \\\"exit 0\\\" USR1; \\ - trap \\\"exit 1\" USR2; \\ - while true; do sleep 1; done'\" - -Note that the unit separator character () right after the file -name ($0) is required. - -Also note that using this alternative implementation leads to a -delay of up to a second. The delay can be shortened by replacing -\"sleep 1\" with \"sleep 0.01\", or if your implementation does -not support floats, then by using \"nanosleep\" instead." - :package-version '(with-editor . "2.8.0") - :group 'with-editor - :type 'string) - -(defcustom with-editor-finish-query-functions nil - "List of functions called to query before finishing session. - -The buffer in question is current while the functions are called. -If any of them returns nil, then the session is not finished and -the buffer is not killed. The user should then fix the issue and -try again. The functions are called with one argument. If it is -non-nil then that indicates that the user used a prefix argument -to force finishing the session despite issues. Functions should -usually honor that and return non-nil." - :group 'with-editor - :type 'hook) -(put 'with-editor-finish-query-functions 'permanent-local t) - -(defcustom with-editor-cancel-query-functions nil - "List of functions called to query before canceling session. - -The buffer in question is current while the functions are called. -If any of them returns nil, then the session is not canceled and -the buffer is not killed. The user should then fix the issue and -try again. The functions are called with one argument. If it is -non-nil then that indicates that the user used a prefix argument -to force canceling the session despite issues. Functions should -usually honor that and return non-nil." - :group 'with-editor - :type 'hook) -(put 'with-editor-cancel-query-functions 'permanent-local t) - -(defcustom with-editor-mode-lighter " WE" - "The mode-line lighter of the With-Editor mode." - :group 'with-editor - :type '(choice (const :tag "No lighter" "") string)) - -(defvar with-editor-server-window-alist nil - "Alist of filename patterns vs corresponding `server-window'. - -Each element looks like (REGEXP . FUNCTION). Files matching -REGEXP are selected using FUNCTION instead of the default in -`server-window'. - -Note that when a package adds an entry here then it probably -has a reason to disrespect `server-window' and it likely is -not a good idea to change such entries.") - -(defvar with-editor-file-name-history-exclude nil - "List of regexps for filenames `server-visit' should not remember. -When a filename matches any of the regexps, then `server-visit' -does not add it to the variable `file-name-history', which is -used when reading a filename in the minibuffer.") - -(defcustom with-editor-shell-command-use-emacsclient t - "Whether to use the emacsclient when running shell commands. - -This affects `with-editor-shell-command-async' and, if the input -ends with \"&\" `with-editor-shell-command' . - -If `shell-command-with-editor-mode' is enabled, then it also -affects `shell-command-async' and, if the input ends with \"&\" -`shell-command'. - -This is a temporary kludge that lets you choose between two -possible defects, the ones described in the issues #23 and #40. - -When t, then use the emacsclient. This has the disadvantage that -`with-editor-mode' won't be enabled because we don't know whether -this package was involved at all in the call to the emacsclient, -and when it is not, then we really should. The problem is that -the emacsclient doesn't pass a long any environment variables to -the server. This will hopefully be fixed in Emacs eventually. - -When nil, then use the sleeping editor. Because in this case we -know that this package is involved, we can enable the mode. But -this makes it necessary that you invoke $EDITOR in shell scripts -like so: - - eval \"$EDITOR\" file - -And some tools that do not handle $EDITOR properly also break." - :package-version '(with-editor . "2.7.1") - :group 'with-editor - :type 'boolean) - -;;; Mode Commands - -(defvar with-editor-pre-finish-hook nil) -(defvar with-editor-pre-cancel-hook nil) -(defvar with-editor-post-finish-hook nil) -(defvar with-editor-post-finish-hook-1 nil) -(defvar with-editor-post-cancel-hook nil) -(defvar with-editor-post-cancel-hook-1 nil) -(defvar with-editor-cancel-alist nil) -(put 'with-editor-pre-finish-hook 'permanent-local t) -(put 'with-editor-pre-cancel-hook 'permanent-local t) -(put 'with-editor-post-finish-hook 'permanent-local t) -(put 'with-editor-post-cancel-hook 'permanent-local t) - -(defvar with-editor-show-usage t) -(defvar with-editor-cancel-message nil) -(defvar with-editor-previous-winconf nil) -(make-variable-buffer-local 'with-editor-show-usage) -(make-variable-buffer-local 'with-editor-cancel-message) -(make-variable-buffer-local 'with-editor-previous-winconf) -(put 'with-editor-cancel-message 'permanent-local t) -(put 'with-editor-previous-winconf 'permanent-local t) - -(defvar-local with-editor--pid nil "For internal use.") -(put 'with-editor--pid 'permanent-local t) - -(defun with-editor-finish (force) - "Finish the current edit session." - (interactive "P") - (when (run-hook-with-args-until-failure - 'with-editor-finish-query-functions force) - (let ((post-finish-hook with-editor-post-finish-hook) - (post-commit-hook (bound-and-true-p git-commit-post-finish-hook)) - (dir default-directory)) - (run-hooks 'with-editor-pre-finish-hook) - (with-editor-return nil) - (accept-process-output nil 0.1) - (with-temp-buffer - (setq default-directory dir) - (setq-local with-editor-post-finish-hook post-finish-hook) - (when post-commit-hook - (setq-local git-commit-post-finish-hook post-commit-hook)) - (run-hooks 'with-editor-post-finish-hook))))) - -(defun with-editor-cancel (force) - "Cancel the current edit session." - (interactive "P") - (when (run-hook-with-args-until-failure - 'with-editor-cancel-query-functions force) - (let ((message with-editor-cancel-message)) - (when (functionp message) - (setq message (funcall message))) - (let ((post-cancel-hook with-editor-post-cancel-hook) - (with-editor-cancel-alist nil) - (dir default-directory)) - (run-hooks 'with-editor-pre-cancel-hook) - (with-editor-return t) - (accept-process-output nil 0.1) - (with-temp-buffer - (setq default-directory dir) - (setq-local with-editor-post-cancel-hook post-cancel-hook) - (run-hooks 'with-editor-post-cancel-hook))) - (message (or message "Canceled by user"))))) - -(defun with-editor-return (cancel) - (let ((winconf with-editor-previous-winconf) - (clients server-buffer-clients) - (dir default-directory) - (pid with-editor--pid)) - (remove-hook 'kill-buffer-query-functions - 'with-editor-kill-buffer-noop t) - (cond (cancel - (save-buffer) - (if clients - (dolist (client clients) - (ignore-errors - (server-send-string client "-error Canceled by user")) - (delete-process client)) - ;; Fallback for when emacs was used as $EDITOR - ;; instead of emacsclient or the sleeping editor. - ;; See https://github.com/magit/magit/issues/2258. - (ignore-errors (delete-file buffer-file-name)) - (kill-buffer))) - (t - (save-buffer) - (if clients - ;; Don't use `server-edit' because we do not want to - ;; show another buffer belonging to another client. - ;; See https://github.com/magit/magit/issues/2197. - (server-done) - (kill-buffer)))) - (when pid - (let ((default-directory dir)) - (process-file "kill" nil nil nil - "-s" (if cancel "USR2" "USR1") pid))) - (when (and winconf (eq (window-configuration-frame winconf) - (selected-frame))) - (set-window-configuration winconf)))) - -;;; Mode - -(defvar with-editor-mode-map - (let ((map (make-sparse-keymap))) - (define-key map "\C-c\C-c" 'with-editor-finish) - (define-key map [remap server-edit] 'with-editor-finish) - (define-key map [remap evil-save-and-close] 'with-editor-finish) - (define-key map [remap evil-save-modified-and-close] 'with-editor-finish) - (define-key map "\C-c\C-k" 'with-editor-cancel) - (define-key map [remap kill-buffer] 'with-editor-cancel) - (define-key map [remap ido-kill-buffer] 'with-editor-cancel) - (define-key map [remap iswitchb-kill-buffer] 'with-editor-cancel) - (define-key map [remap evil-quit] 'with-editor-cancel) - map)) - -(define-minor-mode with-editor-mode - "Edit a file as the $EDITOR of an external process." - :lighter with-editor-mode-lighter - ;; Protect the user from killing the buffer without using - ;; either `with-editor-finish' or `with-editor-cancel', - ;; and from removing the key bindings for these commands. - (unless with-editor-mode - (user-error "With-Editor mode cannot be turned off")) - (add-hook 'kill-buffer-query-functions - 'with-editor-kill-buffer-noop nil t) - ;; `server-execute' displays a message which is not - ;; correct when using this mode. - (when with-editor-show-usage - (with-editor-usage-message))) - -(put 'with-editor-mode 'permanent-local t) - -(defun with-editor-kill-buffer-noop () - ;; We started doing this in response to #64, but it is not safe - ;; to do so, because the client has already been killed, causing - ;; `with-editor-return' (called by `with-editor-cancel') to delete - ;; the file, see #66. The reason we delete the file in the first - ;; place are https://github.com/magit/magit/issues/2258 and - ;; https://github.com/magit/magit/issues/2248. - ;; (if (memq this-command '(save-buffers-kill-terminal - ;; save-buffers-kill-emacs)) - ;; (let ((with-editor-cancel-query-functions nil)) - ;; (with-editor-cancel nil) - ;; t) - ;; ...) - ;; So go back to always doing this instead: - (user-error (substitute-command-keys (format "\ -Don't kill this buffer %S. Instead cancel using \\[with-editor-cancel]" - (current-buffer))))) - -(defvar-local with-editor-usage-message "\ -Type \\[with-editor-finish] to finish, \ -or \\[with-editor-cancel] to cancel") - -(defun with-editor-usage-message () - ;; Run after `server-execute', which is run using - ;; a timer which starts immediately. - (let ((buffer (current-buffer))) - (run-with-timer - 0.05 nil - (lambda () - (with-current-buffer buffer - (message (substitute-command-keys with-editor-usage-message))))))) - -;;; Wrappers - -(defvar with-editor--envvar nil "For internal use.") - -(defmacro with-editor (&rest body) - "Use the Emacsclient as $EDITOR while evaluating BODY. -Modify the `process-environment' for processes started in BODY, -instructing them to use the Emacsclient as $EDITOR. If optional -ENVVAR is a literal string then bind that environment variable -instead. -\n(fn [ENVVAR] BODY...)" - (declare (indent defun) (debug (body))) - `(let ((with-editor--envvar ,(if (stringp (car body)) - (pop body) - '(or with-editor--envvar "EDITOR"))) - (process-environment process-environment)) - (with-editor--setup) - ,@body)) - -(defmacro with-editor* (envvar &rest body) - "Use the Emacsclient as the editor while evaluating BODY. -Modify the `process-environment' for processes started in BODY, -instructing them to use the Emacsclient as editor. ENVVAR is the -environment variable that is exported to do so, it is evaluated -at run-time. -\n(fn [ENVVAR] BODY...)" - (declare (indent defun) (debug (sexp body))) - `(let ((with-editor--envvar ,envvar) - (process-environment process-environment)) - (with-editor--setup) - ,@body)) - -(defun with-editor--setup () - (if (or (not with-editor-emacsclient-executable) - (file-remote-p default-directory)) - (push (concat with-editor--envvar "=" with-editor-sleeping-editor) - process-environment) - ;; Make sure server-use-tcp's value is valid. - (unless (featurep 'make-network-process '(:family local)) - (setq server-use-tcp t)) - ;; Make sure the server is running. - (unless (process-live-p server-process) - (when (server-running-p server-name) - (setq server-name (format "server%s" (emacs-pid))) - (when (server-running-p server-name) - (server-force-delete server-name))) - (server-start)) - ;; Tell $EDITOR to use the Emacsclient. - (push (concat with-editor--envvar "=" - (shell-quote-argument with-editor-emacsclient-executable) - ;; Tell the process where the server file is. - (and (not server-use-tcp) - (concat " --socket-name=" - (shell-quote-argument - (expand-file-name server-name - server-socket-dir))))) - process-environment) - (when server-use-tcp - (push (concat "EMACS_SERVER_FILE=" - (expand-file-name server-name server-auth-dir)) - process-environment)) - ;; As last resort fallback to the sleeping editor. - (push (concat "ALTERNATE_EDITOR=" with-editor-sleeping-editor) - process-environment))) - -(defun with-editor-server-window () - (or (and buffer-file-name - (cdr (cl-find-if (lambda (cons) - (string-match-p (car cons) buffer-file-name)) - with-editor-server-window-alist))) - server-window)) - -(defun server-switch-buffer--with-editor-server-window-alist - (fn &optional next-buffer killed-one filepos) - "Honor `with-editor-server-window-alist' (which see)." - (let ((server-window (with-current-buffer - (or next-buffer (current-buffer)) - (when with-editor-mode - (setq with-editor-previous-winconf - (current-window-configuration))) - (with-editor-server-window)))) - (funcall fn next-buffer killed-one filepos))) - -(advice-add 'server-switch-buffer :around - 'server-switch-buffer--with-editor-server-window-alist) - -(defun start-file-process--with-editor-process-filter - (fn name buffer program &rest program-args) - "When called inside a `with-editor' form and the Emacsclient -cannot be used, then give the process the filter function -`with-editor-process-filter'. To avoid overriding the filter -being added here you should use `with-editor-set-process-filter' -instead of `set-process-filter' inside `with-editor' forms. - -When the `default-directory' is located on a remote machine, -then also manipulate PROGRAM and PROGRAM-ARGS in order to set -the appropriate editor environment variable." - (if (not with-editor--envvar) - (apply fn name buffer program program-args) - (when (file-remote-p default-directory) - (unless (equal program "env") - (push program program-args) - (setq program "env")) - (push (concat with-editor--envvar "=" with-editor-sleeping-editor) - program-args)) - (let ((process (apply fn name buffer program program-args))) - (set-process-filter process 'with-editor-process-filter) - (process-put process 'default-dir default-directory) - process))) - -(advice-add 'start-file-process :around - 'start-file-process--with-editor-process-filter) - -(defun with-editor-set-process-filter (process filter) - "Like `set-process-filter' but keep `with-editor-process-filter'. -Give PROCESS the new FILTER but keep `with-editor-process-filter' -if that was added earlier by the advised `start-file-process'. - -Do so by wrapping the two filter functions using a lambda, which -becomes the actual filter. It calls `with-editor-process-filter' -first, passing t as NO-STANDARD-FILTER. Then it calls FILTER, -which may or may not insert the text into the PROCESS' buffer." - (set-process-filter - process - (if (eq (process-filter process) 'with-editor-process-filter) - `(lambda (proc str) - (,filter proc str) - (with-editor-process-filter proc str t)) - filter))) - -(defvar with-editor-filter-visit-hook nil) - -(defun with-editor-output-filter (string) - (save-match-data - (if (string-match "^WITH-EDITOR: \ -\\([0-9]+\\) OPEN \\([^]+?\\)\ -\\(?: IN \\([^\r]+?\\)\\)?\r?$" string) - (let ((pid (match-string 1 string)) - (file (match-string 2 string)) - (dir (match-string 3 string))) - (unless (file-name-absolute-p file) - (setq file (expand-file-name file dir))) - (when default-directory - (setq file (concat (file-remote-p default-directory) file))) - (with-current-buffer (find-file-noselect file) - (with-editor-mode 1) - (setq with-editor--pid pid) - (run-hooks 'with-editor-filter-visit-hook) - (funcall (or (with-editor-server-window) 'switch-to-buffer) - (current-buffer)) - (kill-local-variable 'server-window)) - nil) - string))) - -(defun with-editor-process-filter - (process string &optional no-default-filter) - "Listen for edit requests by child processes." - (let ((default-directory (process-get process 'default-dir))) - (with-editor-output-filter string)) - (unless no-default-filter - (internal-default-process-filter process string))) - -(advice-add 'server-visit-files :after - 'server-visit-files--with-editor-file-name-history-exclude) - -(defun server-visit-files--with-editor-file-name-history-exclude - (files _proc &optional _nowait) - (pcase-dolist (`(,file . ,_) files) - (when (cl-find-if (lambda (regexp) - (string-match-p regexp file)) - with-editor-file-name-history-exclude) - (setq file-name-history (delete file file-name-history))))) - -;;; Augmentations - -;;;###autoload -(cl-defun with-editor-export-editor (&optional (envvar "EDITOR")) - "Teach subsequent commands to use current Emacs instance as editor. - -Set and export the environment variable ENVVAR, by default -\"EDITOR\". The value is automatically generated to teach -commands to use the current Emacs instance as \"the editor\". - -This works in `shell-mode', `term-mode' and `eshell-mode'." - (interactive (list (with-editor-read-envvar))) - (cond - ((derived-mode-p 'comint-mode 'term-mode) - (let ((process (get-buffer-process (current-buffer)))) - (goto-char (process-mark process)) - (process-send-string - process (format " export %s=%s\n" envvar - (shell-quote-argument with-editor-sleeping-editor))) - (while (accept-process-output process 0.1)) - (if (derived-mode-p 'term-mode) - (with-editor-set-process-filter process 'with-editor-emulate-terminal) - (add-hook 'comint-output-filter-functions 'with-editor-output-filter - nil t)))) - ((derived-mode-p 'eshell-mode) - (add-to-list 'eshell-preoutput-filter-functions - 'with-editor-output-filter) - (setenv envvar with-editor-sleeping-editor)) - (t - (error "Cannot export environment variables in this buffer"))) - (message "Successfully exported %s" envvar)) - -;;;###autoload -(defun with-editor-export-git-editor () - "Like `with-editor-export-editor' but always set `$GIT_EDITOR'." - (interactive) - (with-editor-export-editor "GIT_EDITOR")) - -;;;###autoload -(defun with-editor-export-hg-editor () - "Like `with-editor-export-editor' but always set `$HG_EDITOR'." - (interactive) - (with-editor-export-editor "HG_EDITOR")) - -(defun with-editor-emulate-terminal (process string) - "Like `term-emulate-terminal' but also handle edit requests." - (when (with-editor-output-filter string) - (term-emulate-terminal process string))) - -(defvar with-editor-envvars '("EDITOR" "GIT_EDITOR" "HG_EDITOR")) - -(cl-defun with-editor-read-envvar - (&optional (prompt "Set environment variable") - (default "EDITOR")) - (let ((reply (completing-read (if default - (format "%s (%s): " prompt default) - (concat prompt ": ")) - with-editor-envvars nil nil nil nil default))) - (if (string= reply "") (user-error "Nothing selected") reply))) - -;;;###autoload -(define-minor-mode shell-command-with-editor-mode - "Teach `shell-command' to use current Emacs instance as editor. - -Teach `shell-command', and all commands that ultimately call that -command, to use the current Emacs instance as editor by executing -\"EDITOR=CLIENT COMMAND&\" instead of just \"COMMAND&\". - -CLIENT is automatically generated; EDITOR=CLIENT instructs -COMMAND to use to the current Emacs instance as \"the editor\", -assuming no other variable overrides the effect of \"$EDITOR\". -CLIENT may be the path to an appropriate emacsclient executable -with arguments, or a script which also works over Tramp. - -Alternatively you can use the `with-editor-async-shell-command', -which also allows the use of another variable instead of -\"EDITOR\"." - :global t) - -;;;###autoload -(defun with-editor-async-shell-command - (command &optional output-buffer error-buffer envvar) - "Like `async-shell-command' but with `$EDITOR' set. - -Execute string \"ENVVAR=CLIENT COMMAND\" in an inferior shell; -display output, if any. With a prefix argument prompt for an -environment variable, otherwise the default \"EDITOR\" variable -is used. With a negative prefix argument additionally insert -the COMMAND's output at point. - -CLIENT is automatically generated; ENVVAR=CLIENT instructs -COMMAND to use to the current Emacs instance as \"the editor\", -assuming it respects ENVVAR as an \"EDITOR\"-like variable. -CLIENT may be the path to an appropriate emacsclient executable -with arguments, or a script which also works over Tramp. - -Also see `async-shell-command' and `shell-command'." - (interactive (with-editor-shell-command-read-args "Async shell command: " t)) - (let ((with-editor--envvar envvar)) - (with-editor - (async-shell-command command output-buffer error-buffer)))) - -;;;###autoload -(defun with-editor-shell-command - (command &optional output-buffer error-buffer envvar) - "Like `shell-command' or `with-editor-async-shell-command'. -If COMMAND ends with \"&\" behave like the latter, -else like the former." - (interactive (with-editor-shell-command-read-args "Shell command: ")) - (if (string-match "&[ \t]*\\'" command) - (with-editor-async-shell-command - command output-buffer error-buffer envvar) - (shell-command command output-buffer error-buffer))) - -(defun with-editor-shell-command-read-args (prompt &optional async) - (let ((command (read-shell-command - prompt nil nil - (let ((filename (or buffer-file-name - (and (eq major-mode 'dired-mode) - (dired-get-filename nil t))))) - (and filename (file-relative-name filename)))))) - (list command - (if (or async (setq async (string-match-p "&[ \t]*\\'" command))) - (< (prefix-numeric-value current-prefix-arg) 0) - current-prefix-arg) - shell-command-default-error-buffer - (and async current-prefix-arg (with-editor-read-envvar))))) - -(defun shell-command--shell-command-with-editor-mode - (fn command &optional output-buffer error-buffer) - ;; `shell-mode' and its hook are intended for buffers in which an - ;; interactive shell is running, but `shell-command' also turns on - ;; that mode, even though it only runs the shell to run a single - ;; command. The `with-editor-export-editor' hook function is only - ;; intended to be used in buffers in which an interactive shell is - ;; running, so it has to be remove here. - (let ((shell-mode-hook (remove 'with-editor-export-editor shell-mode-hook))) - (cond ((or (not (or with-editor--envvar shell-command-with-editor-mode)) - (not (string-match-p "&\\'" command))) - (funcall fn command output-buffer error-buffer)) - ((and with-editor-shell-command-use-emacsclient - with-editor-emacsclient-executable - (not (file-remote-p default-directory))) - (with-editor (funcall fn command output-buffer error-buffer))) - (t - (apply fn (format "%s=%s %s" - (or with-editor--envvar "EDITOR") - (shell-quote-argument with-editor-sleeping-editor) - command) - output-buffer error-buffer) - (ignore-errors - (let ((process (get-buffer-process - (or output-buffer - (get-buffer "*Async Shell Command*"))))) - (set-process-filter - process (lambda (proc str) - (comint-output-filter proc str) - (with-editor-process-filter proc str t))) - process)))))) - -(advice-add 'shell-command :around - 'shell-command--shell-command-with-editor-mode) - -;;; _ - -(defun with-editor-debug () - "Debug configuration issues. -See info node `(with-editor)Debugging' for instructions." - (interactive) - (with-current-buffer (get-buffer-create "*with-editor-debug*") - (pop-to-buffer (current-buffer)) - (erase-buffer) - (ignore-errors (with-editor)) - (insert - (format "with-editor: %s\n" (locate-library "with-editor.el")) - (format "emacs: %s (%s)\n" - (expand-file-name invocation-name invocation-directory) - emacs-version) - "system:\n" - (format " system-type: %s\n" system-type) - (format " system-configuration: %s\n" system-configuration) - (format " system-configuration-options: %s\n" system-configuration-options) - "server:\n" - (format " server-running-p: %s\n" (server-running-p)) - (format " server-process: %S\n" server-process) - (format " server-use-tcp: %s\n" server-use-tcp) - (format " server-name: %s\n" server-name) - (format " server-socket-dir: %s\n" server-socket-dir)) - (if (and server-socket-dir (file-accessible-directory-p server-socket-dir)) - (dolist (file (directory-files server-socket-dir nil "^[^.]")) - (insert (format " %s\n" file))) - (insert (format " %s: not an accessible directory\n" - (if server-use-tcp "WARNING" "ERROR")))) - (insert (format " server-auth-dir: %s\n" server-auth-dir)) - (if (file-accessible-directory-p server-auth-dir) - (dolist (file (directory-files server-auth-dir nil "^[^.]")) - (insert (format " %s\n" file))) - (insert (format " %s: not an accessible directory\n" - (if server-use-tcp "ERROR" "WARNING")))) - (let ((val with-editor-emacsclient-executable) - (def (default-value 'with-editor-emacsclient-executable)) - (fun (let ((warning-minimum-level :error) - (warning-minimum-log-level :error)) - (with-editor-locate-emacsclient)))) - (insert "with-editor-emacsclient-executable:\n" - (format " value: %s (%s)\n" val - (and val (with-editor-emacsclient-version val))) - (format " default: %s (%s)\n" def - (and def (with-editor-emacsclient-version def))) - (format " funcall: %s (%s)\n" fun - (and fun (with-editor-emacsclient-version fun))))) - (insert "path:\n" - (format " $PATH: %S\n" (getenv "PATH")) - (format " exec-path: %s\n" exec-path)) - (insert (format " with-editor-emacsclient-path:\n")) - (dolist (dir (with-editor-emacsclient-path)) - (insert (format " %s (%s)\n" dir (car (file-attributes dir)))) - (when (file-directory-p dir) - ;; Don't match emacsclientw.exe, it makes popup windows. - (dolist (exec (directory-files dir t "emacsclient\\(?:[^w]\\|\\'\\)")) - (insert (format " %s (%s)\n" exec - (with-editor-emacsclient-version exec)))))))) - -(defconst with-editor-font-lock-keywords - '(("(\\(with-\\(?:git-\\)?editor\\)\\_>" (1 'font-lock-keyword-face)))) -(font-lock-add-keywords 'emacs-lisp-mode with-editor-font-lock-keywords) - -(provide 'with-editor) -;; Local Variables: -;; indent-tabs-mode: nil -;; End: -;;; with-editor.el ends here diff --git a/elpa/with-editor-20200217.1015/with-editor.elc b/elpa/with-editor-20200217.1015/with-editor.elc deleted file mode 100644 index 5ab86d7efa5cfe8d417808ff613f325824e3cec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31929 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

G7{dM89ARp}xm0V~5N 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 diff --git a/elpa/with-editor-20200217.1015/with-editor.info b/elpa/with-editor-20200217.1015/with-editor.info deleted file mode 100644 index d3ac1ad6..00000000 --- a/elpa/with-editor-20200217.1015/with-editor.info +++ /dev/null @@ -1,343 +0,0 @@ -This is with-editor.info, produced by makeinfo version 6.5 from -with-editor.texi. - - Copyright (C) 2015-2020 Jonas Bernoulli - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -INFO-DIR-SECTION Emacs -START-INFO-DIR-ENTRY -* With-Editor: (with-editor). Using the Emacsclient as $EDITOR. -END-INFO-DIR-ENTRY - - -File: with-editor.info, Node: Top, Next: Using the With-Editor package, Up: (dir) - -With-Editor User Manual -*********************** - -The library ‘with-editor’ makes it easy to use the Emacsclient as the -‘$EDITOR’ of child processes, making sure they know how to call home. -For remote processes a substitute is provided, which communicates with -Emacs on standard output instead of using a socket as the Emacsclient -does. - - This library was written because Magit has to be able to do the above -to allow the user to edit commit messages gracefully and to edit rebase -sequences, which wouldn’t be possible at all otherwise. - - Because other packages can benefit from such functionality, this -library is made available as a separate package. It also defines some -additional functionality which makes it useful even for end-users, who -don’t use Magit or another package which uses it internally. - -This manual is for With-Editor version 2.9.1. - - Copyright (C) 2015-2020 Jonas Bernoulli - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -* Menu: - -* Using the With-Editor package:: -* Using With-Editor as a library:: -* Debugging:: - -— The Detailed Node Listing — - -Using the With-Editor package - -* Configuring With-Editor:: -* Using With-Editor commands:: - - - -File: with-editor.info, Node: Using the With-Editor package, Next: Using With-Editor as a library, Prev: Top, Up: Top - -1 Using the With-Editor package -******************************* - -The ‘With-Editor’ package is used internally by Magit when editing -commit messages and rebase sequences. It also provides some commands -and features which are useful by themselves, even if you don’t use -Magit. - - For information about using this library in you own package, see -*note Using With-Editor as a library::. - -* Menu: - -* Configuring With-Editor:: -* Using With-Editor commands:: - - -File: with-editor.info, Node: Configuring With-Editor, Next: Using With-Editor commands, Up: Using the With-Editor package - -1.1 Configuring With-Editor -=========================== - -With-Editor tries very hard to locate a suitable ‘emacsclient’ -executable, so ideally you should never have to customize the option -‘with-editor-emacsclient-executable’. When it fails to do so, then the -most likely reason is that someone found yet another way to package -Emacs (most likely on macOS) without putting the executable on ‘$PATH’, -and we have to add another kludge to find it anyway. - - -- User Option: with-editor-emacsclient-executable - - The ‘emacsclient’ executable used as the editor by child process of - this Emacs instance. By using this executable, child processes can - call home to their parent process. - - This option is automatically set at startup by looking in - ‘exec-path’, and other places where the executable could be - installed, to find the ‘emacsclient’ executable most suitable for - the current Emacs instance. - - You should *not* customize this option permanently. If you have to - do it, then you should consider that a temporary kludge and inform - the Magit maintainer as described in *note Debugging::. - - If With-Editor fails to find a suitable ‘emacsclient’ on you - system, then this should be fixed for all users at once, by - teaching ‘with-editor-locate-emacsclient’ how to do so on your - system and system like yours. Doing it this way has the advantage, - that you won’t have do it again every time you update Emacs, and - that other users who have installed Emacs the same way as you have, - won’t have to go through the same trouble. - - Note that there also is a nuclear option; setting this variable to - ‘nil’ causes the "sleeping editor" described below to be used even - for local child processes. Obviously we don’t recommend that you - use this except in "emergencies", i.e. before we had a change to - add a kludge appropriate for you setup. - - -- Function: with-editor-locate-emacsclient - - The function used to set the initial value of the option - ‘with-editor-emacsclient-executable’. There’s a lot of voodoo - here. - - The ‘emacsclient’ cannot be used when using Tramp to run a process on -a remote machine. (Theoretically it could, but that would be hard to -setup, very fragile, and rather insecure). - - With-Editor provides an alternative "editor" which can be used by -remote processes in much the same way as local processes use an -‘emacsclient’ executable. This alternative is known as the "sleeping -editor" because it is implemented as a shell script which sleeps until -it receives a signal. - - -- User Option: with-editor-sleeping-editor - - The sleeping editor is a shell script used as the editor of child - processes when the ‘emacsclient’ executable cannot be used. - - This fallback is used for asynchronous process started inside the - macro ‘with-editor’, when the process runs on a remote machine or - for local processes when ‘with-editor-emacsclient-executable’ is - ‘nil’. - - Where the latter uses a socket to communicate with Emacs’ server, - this substitute prints edit requests to its standard output on - which a process filter listens for such requests. As such it is - not a complete substitute for a proper ‘emacsclient’, it can only - be used as ‘$EDITOR’ of child process of the current Emacs - instance. - - Some shells do not execute traps immediately when waiting for a - child process, but by default we do use such a blocking child - process. - - If you use such a shell (e.g. ‘csh’ on FreeBSD, but not Debian), - then you have to edit this option. You can either replace ‘sh’ - with ‘bash’ (and install that), or you can use the older, less - performant implementation: - - "sh -c '\ - echo \"WITH-EDITOR: $$ OPEN $0 IN $(pwd)\"; \ - trap \"exit 0\" USR1; \ - trap \"exit 1\" USR2; \ - while true; do sleep 1; done'" - - Note that the unit separator character () right after the file name - ($0) is required. - - Also note that using this alternative implementation leads to a - delay of up to a second. The delay can be shortened by replacing - ‘sleep 1’ with ‘sleep 0.01’, or if your implementation does not - support floats, then by using ‘nanosleep’ instead. - - -File: with-editor.info, Node: Using With-Editor commands, Prev: Configuring With-Editor, Up: Using the With-Editor package - -1.2 Using With-Editor commands -============================== - -This section describes how to use the ‘with-editor’ library _outside_ of -Magit. You don’t need to know any of this just to create commits using -Magit. - - The commands ‘with-editor-async-shell-command’ and -‘with-editor-shell-command’ are intended as drop in replacements for -‘async-shell-command’ and ‘shell-command’. They automatically export -‘$EDITOR’ making sure the executed command uses the current Emacs -instance as "the editor". With a prefix argument these commands prompt -for an alternative environment variable such as ‘$GIT_EDITOR’. - - -- Command: with-editor-async-shell-command - - This command is like ‘async-shell-command’, but it runs the shell - command with the current Emacs instance exported as ‘$EDITOR’. - - -- Command: with-editor-shell-command - - This command is like ‘shell-command’, but if the shell command ends - with ‘&’ and is therefore run asynchronously, then the current - Emacs instance is exported as ‘$EDITOR’. - - To always use these variants add this to you init file: - - (define-key (current-global-map) - [remap async-shell-command] 'with-editor-async-shell-command) - (define-key (current-global-map) - [remap shell-command] 'with-editor-shell-command) - - Alternatively use the global ‘shell-command-with-editor-mode’. - - -- Variable: shell-command-with-editor-mode - - When this mode is active, then ‘$EDITOR’ is exported whenever - ultimately ‘shell-command’ is called to asynchronously run some - shell command. This affects most variants of that command, whether - they are defined in Emacs or in some third-party package. - - The command ‘with-editor-export-editor’ exports ‘$EDITOR’ or another -such environment variable in ‘shell-mode’, ‘term-mode’ and ‘eshell-mode’ -buffers. Use this Emacs command before executing a shell command which -needs the editor set, or always arrange for the current Emacs instance -to be used as editor by adding it to the appropriate mode hooks: - - (add-hook 'shell-mode-hook 'with-editor-export-editor) - (add-hook 'term-exec-hook 'with-editor-export-editor) - (add-hook 'eshell-mode-hook 'with-editor-export-editor) - - Some variants of this function exist; these two forms are equivalent: - - (add-hook 'shell-mode-hook - (apply-partially 'with-editor-export-editor "GIT_EDITOR")) - (add-hook 'shell-mode-hook 'with-editor-export-git-editor) - - -- Command: with-editor-export-editor - - When invoked in a ‘shell-mode’, ‘term-mode’, or ‘eshell-mode’ - buffer, this command teaches shell commands to use the current - Emacs instance as the editor, by exporting ‘$EDITOR’. - - -- Command: with-editor-export-git-editor - - This command is like ‘with-editor-export-editor’ but exports - ‘$GIT_EDITOR’. - - -- Command: with-editor-export-hg-editor - - This command is like ‘with-editor-export-editor’ but exports - ‘$HG_EDITOR’. - - -File: with-editor.info, Node: Using With-Editor as a library, Next: Debugging, Prev: Using the With-Editor package, Up: Top - -2 Using With-Editor as a library -******************************** - -This section describes how to use the ‘with-editor’ library _outside_ of -Magit to teach another package how to have its child processes call -home, just like Magit does. You don’t need to know any of this just to -create commits using Magit. You can also ignore this if you use -‘with-editor’ outside of Magit, but only as an end-user. - - For information about interactive use and options that affect both -interactive and non-interactive use, see *note Using the With-Editor -package::. - - -- Macro: with-editor &rest body - - This macro arranges for the ‘emacsclient’ or the sleeping editor to - be used as the editor of child processes, effectively teaching them - to call home to the current Emacs instance when they require that - the user edits a file. - - This is done by establishing a local binding for - ‘process-environment’ and changing the value of the ‘EDITOR’ - environment variable in that scope. This affects all - (asynchronous) processes started by forms (dynamically) inside - BODY. - - If BODY begins with a literal string, then that variable is set - instead of ‘EDITOR’. - - -- Macro: with-editor envvar &rest body - - This macro is like ‘with-editor’ instead that the ENVVAR argument - is required and that it is evaluated at run-time. - - -- Function: with-editor-set-process-filter process filter - - This function is like ‘set-process-filter’ but ensures that adding - the new FILTER does not remove the ‘with-editor-process-filter’. - This is done by wrapping the two filter functions using a lambda, - which becomes the actual filter. It calls - ‘with-editor-process-filter’ first, passing ‘t’ as - NO-STANDARD-FILTER. Then it calls FILTER. - - -File: with-editor.info, Node: Debugging, Prev: Using With-Editor as a library, Up: Top - -3 Debugging -*********** - -With-Editor tries very hard to locate a suitable ‘emacsclient’ -executable, and then sets option ‘with-editor-emacsclient-executable’ -accordingly. In very rare cases this fails. When it does fail, then -the most likely reason is that someone found yet another way to package -Emacs (most likely on macOS) without putting the executable on ‘$PATH’, -and we have to add another kludge to find it anyway. - - If you are having problems using ‘with-editor’, e.g. you cannot -commit in Magit, then please open a new issue at - and provide information -about your Emacs installation. Most importantly how did you install -Emacs and what is the output of ‘M-x with-editor-debug RET’. - - - -Tag Table: -Node: Top773 -Node: Using the With-Editor package2513 -Node: Configuring With-Editor3099 -Node: Using With-Editor commands7648 -Node: Using With-Editor as a library10843 -Node: Debugging12806 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: diff --git a/elpa/yaml-mode-20191127.2314/yaml-mode-autoloads.el b/elpa/yaml-mode-20191127.2314/yaml-mode-autoloads.el deleted file mode 100644 index fa9bb779..00000000 --- a/elpa/yaml-mode-20191127.2314/yaml-mode-autoloads.el +++ /dev/null @@ -1,33 +0,0 @@ -;;; yaml-mode-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "yaml-mode" "yaml-mode.el" (0 0 0 0)) -;;; Generated autoloads from yaml-mode.el - -(let ((loads (get 'yaml 'custom-loads))) (if (member '"yaml-mode" loads) nil (put 'yaml 'custom-loads (cons '"yaml-mode" loads)))) - -(autoload 'yaml-mode "yaml-mode" "\ -Simple mode to edit YAML. - -\\{yaml-mode-map} - -\(fn)" t nil) - -(add-to-list 'auto-mode-alist '("\\.\\(e?ya?\\|ra\\)ml\\'" . yaml-mode)) - -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "yaml-mode" '("yaml-"))) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; yaml-mode-autoloads.el ends here diff --git a/elpa/yaml-mode-20191127.2314/yaml-mode-pkg.el b/elpa/yaml-mode-20191127.2314/yaml-mode-pkg.el deleted file mode 100644 index 9e2c320a..00000000 --- a/elpa/yaml-mode-20191127.2314/yaml-mode-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; -*- no-byte-compile: t -*- -(define-package "yaml-mode" "20191127.2314" "Major mode for editing YAML files" '((emacs "24.1")) :commit "cecf4b106b0c4236931b14919fdf87ff3546e2c9" :keywords '("data" "yaml") :authors '(("Yoshiki Kurihara" . "clouder@gmail.com") ("Marshall T. Vandegrift" . "llasram@gmail.com")) :maintainer '("Vasilij Schneidermann" . "v.schneidermann@gmail.com")) diff --git a/elpa/yaml-mode-20191127.2314/yaml-mode.el b/elpa/yaml-mode-20191127.2314/yaml-mode.el deleted file mode 100644 index 054a4263..00000000 --- a/elpa/yaml-mode-20191127.2314/yaml-mode.el +++ /dev/null @@ -1,472 +0,0 @@ -;;; yaml-mode.el --- Major mode for editing YAML files - -;; Copyright (C) 2010-2014 Yoshiki Kurihara - -;; Author: Yoshiki Kurihara -;; Marshall T. Vandegrift -;; Maintainer: Vasilij Schneidermann -;; Package-Requires: ((emacs "24.1")) -;; Package-Version: 20191127.2314 -;; Keywords: data yaml -;; Version: 0.0.14 - -;; This file is not part of Emacs - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License along -;; with this program; if not, write to the Free Software Foundation, Inc., -;; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -;;; Commentary: - -;; This is a major mode for editing files in the YAML data -;; serialization format. It was initially developed by Yoshiki -;; Kurihara and many features were added by Marshall Vandegrift. As -;; YAML and Python share the fact that indentation determines -;; structure, this mode provides indentation and indentation command -;; behavior very similar to that of python-mode. - -;;; Installation: - -;; To install, just drop this file into a directory in your -;; `load-path' and (optionally) byte-compile it. To automatically -;; handle files ending in '.yml', add something like: -;; -;; (require 'yaml-mode) -;; (add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode)) -;; -;; to your .emacs file. -;; -;; Unlike python-mode, this mode follows the Emacs convention of not -;; binding the ENTER key to `newline-and-indent'. To get this -;; behavior, add the key definition to `yaml-mode-hook': -;; -;; (add-hook 'yaml-mode-hook -;; '(lambda () -;; (define-key yaml-mode-map "\C-m" 'newline-and-indent))) - -;;; Known Bugs: - -;; YAML is easy to write but complex to parse, and this mode doesn't -;; even really try. Indentation and highlighting will break on -;; abnormally complicated structures. - -;;; Code: - - -;; User definable variables - -;;;###autoload -(defgroup yaml nil - "Support for the YAML serialization format" - :group 'languages - :prefix "yaml-") - -(defcustom yaml-mode-hook nil - "*Hook run by `yaml-mode'." - :type 'hook - :group 'yaml) - -(defcustom yaml-indent-offset 2 - "*Amount of offset per level of indentation." - :type 'integer - :safe 'natnump - :group 'yaml) - -(defcustom yaml-backspace-function 'backward-delete-char-untabify - "*Function called by `yaml-electric-backspace' when deleting backwards. -It will receive one argument, the numeric prefix value." - :type 'function - :group 'yaml) - -(defcustom yaml-block-literal-search-lines 100 - "*Maximum number of lines to search for start of block literals." - :type 'integer - :group 'yaml) - -(defcustom yaml-block-literal-electric-alist - '((?| . "") (?> . "-")) - "*Characters for which to provide electric behavior. -The association list key should be a key code and the associated value -should be a string containing additional characters to insert when -that key is pressed to begin a block literal." - :type 'alist - :group 'yaml) - -(defface yaml-tab-face - '((((class color)) (:background "red" :foreground "red" :bold t)) - (t (:reverse-video t))) - "Face to use for highlighting tabs in YAML files." - :group 'faces - :group 'yaml) - -(defcustom yaml-imenu-generic-expression - '((nil "^\\(:?[a-zA-Z_-]+\\):" 1)) - "The imenu regex to parse an outline of the yaml file." - :type 'string - :group 'yaml) - - -;; Constants - -(defconst yaml-mode-version "0.0.14" "Version of `yaml-mode'.") - -(defconst yaml-blank-line-re "^ *$" - "Regexp matching a line containing only (valid) whitespace.") - -(defconst yaml-directive-re "^\\(?:--- \\)? *%\\(\\w+\\)" - "Regexp matching a line contatining a YAML directive.") - -(defconst yaml-document-delimiter-re "^\\(?:---\\|[.][.][.]\\)" - "Rexexp matching a YAML document delimiter line.") - -(defconst yaml-node-anchor-alias-re "[&*][a-zA-Z0-9_-]+" - "Regexp matching a YAML node anchor or alias.") - -(defconst yaml-tag-re "!!?[^ \n]+" - "Rexexp matching a YAML tag.") - -(defconst yaml-bare-scalar-re - "\\(?:[^-:,#!\n{\\[ ]\\|[^#!\n{\\[ ]\\S-\\)[^#\n]*?" - "Rexexp matching a YAML bare scalar.") - -(defconst yaml-hash-key-re - (concat "\\(?:^\\(?:--- \\)?\\|{\\|\\(?:[-,] +\\)+\\) *" - "\\(?:" yaml-tag-re " +\\)?" - "\\(" yaml-bare-scalar-re "\\) *:" - "\\(?: +\\|$\\)") - "Regexp matching a single YAML hash key.") - -(defconst yaml-scalar-context-re - (concat "\\(?:^\\(?:--- \\)?\\|{\\|\\(?: *[-,] +\\)+\\) *" - "\\(?:" yaml-bare-scalar-re " *: \\)?") - "Regexp indicating the beginning of a scalar context.") - -(defconst yaml-nested-map-re - (concat ".*: *\\(?:&.*\\|{ *\\|" yaml-tag-re " *\\)?$") - "Regexp matching a line beginning a YAML nested structure.") - -(defconst yaml-block-literal-base-re " *[>|][-+0-9]* *\\(?:\n\\|\\'\\)" - "Regexp matching the substring start of a block literal.") - -(defconst yaml-block-literal-re - (concat yaml-scalar-context-re - "\\(?:" yaml-tag-re "\\)?" - yaml-block-literal-base-re) - "Regexp matching a line beginning a YAML block literal.") - -(defconst yaml-nested-sequence-re - (concat "^\\(?:\\(?: *- +\\)+\\|\\(:? *-$\\)\\)" - "\\(?:" yaml-bare-scalar-re " *:\\(?: +.*\\)?\\)?$") - "Regexp matching a line containing one or more nested YAML sequences.") - -(defconst yaml-constant-scalars-re - (concat "\\(?:^\\|\\(?::\\|-\\|,\\|{\\|\\[\\) +\\) *" - (regexp-opt - '("~" "null" "Null" "NULL" - ".nan" ".NaN" ".NAN" - ".inf" ".Inf" ".INF" - "-.inf" "-.Inf" "-.INF" - "y" "Y" "yes" "Yes" "YES" "n" "N" "no" "No" "NO" - "true" "True" "TRUE" "false" "False" "FALSE" - "on" "On" "ON" "off" "Off" "OFF") t) - " *$") - "Regexp matching certain scalar constants in scalar context.") - - -;; Mode setup - -(defvar yaml-mode-map - (let ((map (make-sparse-keymap))) - (define-key map "|" 'yaml-electric-bar-and-angle) - (define-key map ">" 'yaml-electric-bar-and-angle) - (define-key map "-" 'yaml-electric-dash-and-dot) - (define-key map "." 'yaml-electric-dash-and-dot) - (define-key map (kbd "DEL") 'yaml-electric-backspace) - map) - "Keymap used in `yaml-mode' buffers.") - -(defvar yaml-mode-syntax-table - (let ((syntax-table (make-syntax-table))) - (modify-syntax-entry ?\' "\"" syntax-table) - (modify-syntax-entry ?\" "\"" syntax-table) - (modify-syntax-entry ?# "<" syntax-table) - (modify-syntax-entry ?\n ">" syntax-table) - (modify-syntax-entry ?\\ "\\" syntax-table) - (modify-syntax-entry ?- "_" syntax-table) - (modify-syntax-entry ?_ "_" syntax-table) - (modify-syntax-entry ?& "." syntax-table) - (modify-syntax-entry ?* "." syntax-table) - (modify-syntax-entry ?\( "." syntax-table) - (modify-syntax-entry ?\) "." syntax-table) - (modify-syntax-entry ?\{ "(}" syntax-table) - (modify-syntax-entry ?\} "){" syntax-table) - (modify-syntax-entry ?\[ "(]" syntax-table) - (modify-syntax-entry ?\] ")[" syntax-table) - syntax-table) - "Syntax table in use in `yaml-mode' buffers.") - -;;;###autoload -(define-derived-mode yaml-mode text-mode "YAML" - "Simple mode to edit YAML. - -\\{yaml-mode-map}" - :syntax-table yaml-mode-syntax-table - (set (make-local-variable 'comment-start) "# ") - (set (make-local-variable 'comment-start-skip) "#+ *") - (set (make-local-variable 'indent-line-function) 'yaml-indent-line) - (set (make-local-variable 'indent-tabs-mode) nil) - (set (make-local-variable 'fill-paragraph-function) 'yaml-fill-paragraph) - - (set (make-local-variable 'syntax-propertize-function) - 'yaml-mode-syntax-propertize-function) - (setq font-lock-defaults '(yaml-font-lock-keywords))) - - -;; Font-lock support - -(defvar yaml-font-lock-keywords - `((yaml-font-lock-block-literals 0 font-lock-string-face) - (,yaml-constant-scalars-re . (1 font-lock-constant-face)) - (,yaml-tag-re . (0 font-lock-type-face)) - (,yaml-node-anchor-alias-re . (0 font-lock-function-name-face)) - (,yaml-hash-key-re . (1 font-lock-variable-name-face)) - (,yaml-document-delimiter-re . (0 font-lock-comment-face)) - (,yaml-directive-re . (1 font-lock-builtin-face)) - ("^[\t]+" 0 'yaml-tab-face t)) - "Additional expressions to highlight in YAML mode.") - -(defun yaml-mode-syntax-propertize-function (beg end) - "Override buffer's syntax table for special syntactic constructs." - ;; Unhighlight foo#bar tokens between BEG and END. - (save-excursion - (goto-char beg) - (while (search-forward "#" end t) - (save-excursion - (forward-char -1) - ;; both ^# and [ \t]# are comments - (when (and (not (bolp)) - (not (memq (preceding-char) '(?\s ?\t)))) - (put-text-property (point) (1+ (point)) - 'syntax-table (string-to-syntax "_")))))) - - ;; If quote is detected as a syntactic string start but appeared - ;; after a non-whitespace character, then mark it as syntactic word. - (save-excursion - (goto-char beg) - (while (re-search-forward "['\"]" end t) - (when (get-text-property (point) 'yaml-block-literal) - (put-text-property (1- (point)) (point) - 'syntax-table (string-to-syntax "w"))) - (when (nth 8 (syntax-ppss)) - (save-excursion - (forward-char -1) - (cond ((and (char-equal ?' (char-before (point))) - (char-equal ?' (char-after (point))) - (put-text-property (1- (point)) (1+ (point)) - 'syntax-table (string-to-syntax "w")))) - ((and (not (bolp)) - (char-equal ?w (char-syntax (char-before (point))))) - (put-text-property (point) (1+ (point)) - 'syntax-table (string-to-syntax "w"))))))))) - -(defun yaml-font-lock-block-literals (bound) - "Find lines within block literals. -Find the next line of the first (if any) block literal after point and -prior to BOUND. Returns the beginning and end of the block literal -line in the match data, as consumed by `font-lock-keywords' matcher -functions. The function begins by searching backwards to determine -whether or not the current line is within a block literal. This could -be time-consuming in large buffers, so the number of lines searched is -artificially limited to the value of -`yaml-block-literal-search-lines'." - (if (eolp) (goto-char (1+ (point)))) - (unless (or (eobp) (>= (point) bound)) - (let ((begin (point)) - (end (min (1+ (point-at-eol)) bound))) - (goto-char (point-at-bol)) - (while (and (looking-at yaml-blank-line-re) - (not (bobp))) - (forward-line -1)) - (let ((nlines yaml-block-literal-search-lines) - (min-level (current-indentation))) - (forward-line -1) - (while (and (/= nlines 0) - (/= min-level 0) - (not (looking-at yaml-block-literal-re)) - (not (bobp))) - (setq nlines (1- nlines)) - (unless (looking-at yaml-blank-line-re) - (setq min-level (min min-level (current-indentation)))) - (forward-line -1)) - (cond - ((and (< (current-indentation) min-level) - (looking-at yaml-block-literal-re)) - (goto-char end) - (put-text-property begin end 'yaml-block-literal t) - (set-match-data (list begin end)) - t) - ((progn - (goto-char begin) - (re-search-forward (concat yaml-block-literal-re - " *\\(.*\\)\n") - bound t)) - (let ((range (nthcdr 2 (match-data)))) - (put-text-property (car range) (cadr range) 'yaml-block-literal t) - (set-match-data range)) - t)))))) - - -;; Indentation and electric keys - -(defun yaml-compute-indentation () - "Calculate the maximum sensible indentation for the current line." - (save-excursion - (beginning-of-line) - (if (looking-at yaml-document-delimiter-re) 0 - (forward-line -1) - (while (and (looking-at yaml-blank-line-re) - (> (point) (point-min))) - (forward-line -1)) - (+ (current-indentation) - (if (looking-at yaml-nested-map-re) yaml-indent-offset 0) - (if (looking-at yaml-nested-sequence-re) yaml-indent-offset 0) - (if (looking-at yaml-block-literal-re) yaml-indent-offset 0))))) - -(defun yaml-indent-line () - "Indent the current line. -The first time this command is used, the line will be indented to the -maximum sensible indentation. Each immediately subsequent usage will -back-dent the line by `yaml-indent-offset' spaces. On reaching column -0, it will cycle back to the maximum sensible indentation." - (interactive "*") - (let ((ci (current-indentation)) - (cc (current-column)) - (need (yaml-compute-indentation))) - (save-excursion - (beginning-of-line) - (delete-horizontal-space) - (if (and (equal last-command this-command) (/= ci 0)) - (indent-to (* (/ (- ci 1) yaml-indent-offset) yaml-indent-offset)) - (indent-to need))) - (if (< (current-column) (current-indentation)) - (forward-to-indentation 0)))) - -(defun yaml-electric-backspace (arg) - "Delete characters or back-dent the current line. -If invoked following only whitespace on a line, will back-dent to the -immediately previous multiple of `yaml-indent-offset' spaces." - (interactive "*p") - (if (or (/= (current-indentation) (current-column)) (bolp)) - (funcall yaml-backspace-function arg) - (let ((ci (current-column))) - (beginning-of-line) - (delete-horizontal-space) - (indent-to (* (/ (- ci (* arg yaml-indent-offset)) - yaml-indent-offset) - yaml-indent-offset))))) - -(defun yaml-electric-bar-and-angle (arg) - "Insert the bound key and possibly begin a block literal. -Inserts the bound key. If inserting the bound key causes the current -line to match the initial line of a block literal, then inserts the -matching string from `yaml-block-literal-electric-alist', a newline, -and indents appropriately." - (interactive "*P") - (self-insert-command (prefix-numeric-value arg)) - (let ((extra-chars - (assoc last-command-event - yaml-block-literal-electric-alist))) - (cond - ((and extra-chars (not arg) (eolp) - (save-excursion - (beginning-of-line) - (looking-at yaml-block-literal-re))) - (insert (cdr extra-chars)) - (newline-and-indent))))) - -(defun yaml-electric-dash-and-dot (arg) - "Insert the bound key and possibly de-dent line. -Inserts the bound key. If inserting the bound key causes the current -line to match a document delimiter, de-dent the line to the left -margin." - (interactive "*P") - (self-insert-command (prefix-numeric-value arg)) - (save-excursion - (beginning-of-line) - (when (and (not arg) (looking-at yaml-document-delimiter-re)) - (delete-horizontal-space)))) - -(defun yaml-narrow-to-block-literal () - "Narrow the buffer to block literal if the point is in it, -otherwise do nothing." - (interactive) - (save-excursion - (goto-char (point-at-bol)) - (while (and (looking-at-p yaml-blank-line-re) (not (bobp))) - (forward-line -1)) - (let ((nlines yaml-block-literal-search-lines) - (min-level (current-indentation)) - beg) - (forward-line -1) - (while (and (/= nlines 0) - (/= min-level 0) - (not (looking-at-p yaml-block-literal-re)) - (not (bobp))) - (setq nlines (1- nlines)) - (unless (looking-at-p yaml-blank-line-re) - (setq min-level (min min-level (current-indentation)))) - (forward-line -1)) - (when (and (< (current-indentation) min-level) - (looking-at-p yaml-block-literal-re)) - (setq min-level (current-indentation)) - (forward-line) - (setq beg (point)) - (while (and (not (eobp)) - (or (looking-at-p yaml-blank-line-re) - (> (current-indentation) min-level))) - (forward-line)) - (narrow-to-region beg (point)))))) - -(defun yaml-fill-paragraph (&optional justify region) - "Fill paragraph. -Outside of comments, this behaves as `fill-paragraph' except that -filling does not cross boundaries of block literals. Inside comments, -this will do usual adaptive fill behaviors." - (interactive "*P") - (save-restriction - (yaml-narrow-to-block-literal) - (let ((fill-paragraph-function nil)) - (or (fill-comment-paragraph justify) - (fill-paragraph justify region))))) - -(defun yaml-set-imenu-generic-expression () - (make-local-variable 'imenu-generic-expression) - (make-local-variable 'imenu-create-index-function) - (setq imenu-create-index-function 'imenu-default-create-index-function) - (setq imenu-generic-expression yaml-imenu-generic-expression)) - -(add-hook 'yaml-mode-hook 'yaml-set-imenu-generic-expression) - - -(defun yaml-mode-version () - "Display version of `yaml-mode'." - (interactive) - (message "yaml-mode %s" yaml-mode-version) - yaml-mode-version) - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.\\(e?ya?\\|ra\\)ml\\'" . yaml-mode)) - -(provide 'yaml-mode) - -;;; yaml-mode.el ends here diff --git a/elpa/yaml-mode-20191127.2314/yaml-mode.elc b/elpa/yaml-mode-20191127.2314/yaml-mode.elc deleted file mode 100644 index 5cfd6f8d742e6217b3ee556ab7ef1a8cf37aba0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14096 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, -;; João Távora , -;; Noam Postavsky -;; Maintainer: Noam Postavsky -;; Version: 0.14.0 -;; Package-Version: 20200413.2221 -;; X-URL: http://github.com/joaotavora/yasnippet -;; Keywords: convenience, emulation -;; URL: http://github.com/joaotavora/yasnippet -;; Package-Requires: ((cl-lib "0.5")) -;; EmacsWiki: YaSnippetMode - -;; 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 . - -;;; Commentary: -;; -;; Basic steps to setup: -;; -;; (add-to-list 'load-path -;; "~/path-to-yasnippet") -;; (require 'yasnippet) -;; (yas-global-mode 1) -;; -;; -;; Interesting variables are: -;; -;; `yas-snippet-dirs' -;; -;; The directory where user-created snippets are to be -;; stored. Can also be a list of directories. In that case, -;; when used for bulk (re)loading of snippets (at startup or -;; via `yas-reload-all'), directories appearing earlier in -;; the list override other dir's snippets. Also, the first -;; directory is taken as the default for storing the user's -;; new snippets. -;; -;; The deprecated `yas/root-directory' aliases this variable -;; for backward-compatibility. -;; -;; -;; Major commands are: -;; -;; M-x yas-expand -;; -;; Try to expand snippets before point. In `yas-minor-mode', -;; this is normally bound to TAB, but you can customize it in -;; `yas-minor-mode-map'. -;; -;; M-x yas-load-directory -;; -;; Prompts you for a directory hierarchy of snippets to load. -;; -;; M-x yas-activate-extra-mode -;; -;; Prompts you for an extra mode to add snippets for in the -;; current buffer. -;; -;; M-x yas-insert-snippet -;; -;; Prompts you for possible snippet expansion if that is -;; possible according to buffer-local and snippet-local -;; expansion conditions. With prefix argument, ignore these -;; conditions. -;; -;; M-x yas-visit-snippet-file -;; -;; Prompts you for possible snippet expansions like -;; `yas-insert-snippet', but instead of expanding it, takes -;; you directly to the snippet definition's file, if it -;; exists. -;; -;; M-x yas-new-snippet -;; -;; Lets you create a new snippet file in the correct -;; subdirectory of `yas-snippet-dirs', according to the -;; active major mode. -;; -;; M-x yas-load-snippet-buffer -;; -;; When editing a snippet, this loads the snippet. This is -;; bound to "C-c C-c" while in the `snippet-mode' editing -;; mode. -;; -;; M-x yas-tryout-snippet -;; -;; When editing a snippet, this opens a new empty buffer, -;; sets it to the appropriate major mode and inserts the -;; snippet there, so you can see what it looks like. This is -;; bound to "C-c C-t" while in `snippet-mode'. -;; -;; M-x yas-describe-tables -;; -;; Lists known snippets in a separate buffer. User is -;; prompted as to whether only the currently active tables -;; are to be displayed, or all the tables for all major -;; modes. -;; -;; If you have `dropdown-list' installed, you can optionally use it -;; as the preferred "prompting method", putting in your .emacs file, -;; for example: -;; -;; (require 'dropdown-list) -;; (setq yas-prompt-functions '(yas-dropdown-prompt -;; yas-ido-prompt -;; yas-completing-prompt)) -;; -;; Also check out the customization group -;; -;; M-x customize-group RET yasnippet RET -;; -;; If you use the customization group to set variables -;; `yas-snippet-dirs' or `yas-global-mode', make sure the path to -;; "yasnippet.el" is present in the `load-path' *before* the -;; `custom-set-variables' is executed in your .emacs file. -;; -;; For more information and detailed usage, refer to the project page: -;; http://github.com/joaotavora/yasnippet - -;;; Code: - -(require 'cl-lib) -(require 'eldoc) ; Needed for 24. -(declare-function cl-progv-after "cl-extra") ; Needed for 23.4. -(require 'easymenu) -(require 'help-mode) - -(defvar yas--editing-template) -(defvar yas--guessed-modes) -(defvar yas--indent-original-column) -(defvar yas--scheduled-jit-loads) -(defvar yas-keymap) -(defvar yas-selected-text) -(defvar yas-verbosity) -(defvar yas--current-template) - - -;;; User customizable variables - -(defgroup yasnippet nil - "Yet Another Snippet extension" - :prefix "yas-" - :group 'editing) - -(defconst yas--loaddir - (file-name-directory (or load-file-name buffer-file-name)) - "Directory that yasnippet was loaded from.") - -(defconst yas-installed-snippets-dir (expand-file-name "snippets" yas--loaddir)) -(make-obsolete-variable 'yas-installed-snippets-dir "\ -Yasnippet no longer comes with installed snippets" "0.14") - -(defconst yas--default-user-snippets-dir - (expand-file-name "snippets" user-emacs-directory)) - -(defcustom yas-snippet-dirs (list yas--default-user-snippets-dir) - "List of top-level snippet directories. - -Each element, a string or a symbol whose value is a string, -designates a top-level directory where per-mode snippet -directories can be found. - -Elements appearing earlier in the list override later elements' -snippets. - -The first directory is taken as the default for storing snippet's -created with `yas-new-snippet'. " - :type '(choice (directory :tag "Single directory") - (repeat :tag "List of directories" - (choice (directory) (variable)))) - :set #'(lambda (symbol new) - (let ((old (and (boundp symbol) - (symbol-value symbol)))) - (set-default symbol new) - (unless (or (not (fboundp 'yas-reload-all)) - (equal old new)) - (yas-reload-all))))) - -(defun yas-snippet-dirs () - "Return variable `yas-snippet-dirs' as list of strings." - (cl-loop for e in (if (listp yas-snippet-dirs) - yas-snippet-dirs - (list yas-snippet-dirs)) - collect - (cond ((stringp e) e) - ((and (symbolp e) - (boundp e) - (stringp (symbol-value e))) - (symbol-value e)) - (t - (error "[yas] invalid element %s in `yas-snippet-dirs'" e))))) - -(defcustom yas-new-snippet-default "\ -# -*- mode: snippet -*- -# name: $1 -# key: ${2:${1:$(yas--key-from-desc yas-text)}} -# -- -$0`(yas-escape-text yas-selected-text)`" - "Default snippet to use when creating a new snippet. -If nil, don't use any snippet." - :type 'string) - -(defcustom yas-prompt-functions '(yas-dropdown-prompt - yas-completing-prompt - yas-maybe-ido-prompt - yas-no-prompt) - "Functions to prompt for keys, templates, etc interactively. - -These functions are called with the following arguments: - -- PROMPT: A string to prompt the user - -- CHOICES: a list of strings or objects. - -- optional DISPLAY-FN : A function that, when applied to each of -the objects in CHOICES will return a string. - -The return value of any function you put here should be one of -the objects in CHOICES, properly formatted with DISPLAY-FN (if -that is passed). - -- To signal that your particular style of prompting is -unavailable at the moment, you can also have the function return -nil. - -- To signal that the user quit the prompting process, you can -signal `quit' with - - (signal \\='quit \"user quit!\")" - :type '(repeat function)) - -(defcustom yas-indent-line 'auto - "Controls indenting applied to a recent snippet expansion. - -The following values are possible: - -- `fixed' Indent the snippet to the current column; - -- `auto' Indent each line of the snippet with `indent-according-to-mode' - -Every other value means don't apply any snippet-side indentation -after expansion (the manual per-line \"$>\" indentation still -applies)." - :type '(choice (const :tag "Nothing" nothing) - (const :tag "Fixed" fixed) - (const :tag "Auto" auto))) - -(defcustom yas-also-auto-indent-first-line nil - "Non-nil means also auto indent first line according to mode. - -Naturally this is only valid when `yas-indent-line' is `auto'." - :type 'boolean) - -(defcustom yas-also-indent-empty-lines nil - "Non-nil means also indent empty lines according to mode." - :type 'boolean) - -(defcustom yas-snippet-revival t - "Non-nil means re-activate snippet fields after undo/redo." - :type 'boolean) - -(defcustom yas-triggers-in-field nil - "If non-nil, allow stacked expansions (snippets inside snippets). - -Otherwise `yas-next-field-or-maybe-expand' just moves on to the -next field" - :type 'boolean) - -(defcustom yas-fallback-behavior 'return-nil - "This option is obsolete. -Now that the conditional keybinding `yas-maybe-expand' is -available, there's no more need for it." - :type '(choice (const :tag "Call previous command" call-other-command) - (const :tag "Do nothing" return-nil))) - -(make-obsolete-variable - 'yas-fallback-behavior - "For `call-other-command' behavior bind to the conditional -command value `yas-maybe-expand', for `return-nil' behavior bind -directly to `yas-expand'." - "0.12") - -(defcustom yas-choose-keys-first nil - "If non-nil, prompt for snippet key first, then for template. - -Otherwise prompts for all possible snippet names. - -This affects `yas-insert-snippet' and `yas-visit-snippet-file'." - :type 'boolean) - -(defcustom yas-choose-tables-first nil - "If non-nil, and multiple eligible snippet tables, prompts user for tables first. - -Otherwise, user chooses between the merging together of all -eligible tables. - -This affects `yas-insert-snippet', `yas-visit-snippet-file'" - :type 'boolean) - -(defcustom yas-use-menu 'abbreviate - "Display a YASnippet menu in the menu bar. - -When non-nil, submenus for each snippet table will be listed -under the menu \"Yasnippet\". - -- If set to `abbreviate', only the current major-mode -menu and the modes set in `yas--extra-modes' are listed. - -- If set to `full', every submenu is listed - -- If set to nil, hide the menu. - -Any other non-nil value, every submenu is listed." - :type '(choice (const :tag "Full" full) - (const :tag "Abbreviate" abbreviate) - (const :tag "No menu" nil))) - -(defcustom yas-trigger-symbol (or (and (eq window-system 'mac) - (ignore-errors - (char-to-string ?\x21E5))) ;; little ->| sign - " =>") - "The text that will be used in menu to represent the trigger." - :type 'string) - -(defcustom yas-wrap-around-region nil - "What to insert for snippet's $0 field. - -If set to a character, insert contents of corresponding register. -If non-nil insert region contents. This can be overridden on a -per-snippet basis. A value of `cua' is considered equivalent to -`?0' for backwards compatibility." - :type '(choice (character :tag "Insert from register") - (const t :tag "Insert region contents") - (const nil :tag "Don't insert anything") - (const cua))) ; backwards compat - -(defcustom yas-good-grace t - "If non-nil, don't raise errors in elisp evaluation. - -This affects both the inline elisp in snippets and the hook -variables such as `yas-after-exit-snippet-hook'. - -If this variable's value is `inline', an error string \"[yas] -error\" is returned instead of raising the error. If this -variable's value is `hooks', a message is output to according to -`yas-verbosity-level'. If this variable's value is t, both are -active." - :type 'boolean) - -(defcustom yas-visit-from-menu nil - "If non-nil visit snippets's files from menu, instead of expanding them. - -This can only work when snippets are loaded from files." - :type 'boolean) - -(defcustom yas-expand-only-for-last-commands nil - "List of `last-command' values to restrict tab-triggering to, or nil. - -Leave this set at nil (the default) to be able to trigger an -expansion simply by placing the cursor after a valid tab trigger, -using whichever commands. - -Optionally, set this to something like (self-insert-command) if -you to wish restrict expansion to only happen when the last -letter of the snippet tab trigger was typed immediately before -the trigger key itself." - :type '(repeat function)) - -(defcustom yas-alias-to-yas/prefix-p t - "If non-nil make aliases for the old style yas/ prefixed symbols. -It must be set to nil before loading yasnippet to take effect." - :type 'boolean) - -;; Only two faces, and one of them shouldn't even be used... -;; -(defface yas-field-highlight-face - '((t (:inherit region))) - "The face used to highlight the currently active field of a snippet") - -(defface yas--field-debug-face - '() - "The face used for debugging some overlays normally hidden") - - -;;; User-visible variables - -(defconst yas-maybe-skip-and-clear-field - '(menu-item "" yas-skip-and-clear-field - :filter yas--maybe-clear-field-filter) - "A conditional key definition. -This can be used as a key definition in keymaps to bind a key to -`yas-skip-and-clear-field' only when at the beginning of an -unmodified snippet field.") - -(defconst yas-maybe-clear-field - '(menu-item "" yas-clear-field - :filter yas--maybe-clear-field-filter) - "A conditional key definition. -This can be used as a key definition in keymaps to bind a key to -`yas-clear-field' only when at the beginning of an -unmodified snippet field.") - -(defun yas-filtered-definition (def) - "Return a condition key definition. -The condition will respect the value of `yas-keymap-disable-hook'." - `(menu-item "" ,def - :filter ,(lambda (cmd) (unless (run-hook-with-args-until-success - 'yas-keymap-disable-hook) - cmd)))) - -(defvar yas-keymap - (let ((map (make-sparse-keymap))) - (define-key map [(tab)] (yas-filtered-definition 'yas-next-field-or-maybe-expand)) - (define-key map (kbd "TAB") (yas-filtered-definition 'yas-next-field-or-maybe-expand)) - (define-key map [(shift tab)] (yas-filtered-definition 'yas-prev-field)) - (define-key map [backtab] (yas-filtered-definition 'yas-prev-field)) - (define-key map (kbd "C-g") (yas-filtered-definition 'yas-abort-snippet)) - ;; Yes, filters can be chained! - (define-key map (kbd "C-d") (yas-filtered-definition yas-maybe-skip-and-clear-field)) - (define-key map (kbd "DEL") (yas-filtered-definition yas-maybe-clear-field)) - map) - "The active keymap while a snippet expansion is in progress.") - -(defvar yas-key-syntaxes (list #'yas-try-key-from-whitespace - "w_.()" "w_." "w_" "w") - "Syntaxes and functions to help look for trigger keys before point. - -Each element in this list specifies how to skip buffer positions -backwards and look for the start of a trigger key. - -Each element can be either a string or a function receiving the -original point as an argument. A string element is simply passed -to `skip-syntax-backward' whereas a function element is called -with no arguments and should also place point before the original -position. - -The string between the resulting buffer position and the original -point is matched against the trigger keys in the active snippet -tables. - -If no expandable snippets are found, the next element is the list -is tried, unless a function element returned the symbol `again', -in which case it is called again from the previous position and -may once more reposition point. - -For example, if `yas-key-syntaxes' has the value (\"w\" \"w_\"), -trigger keys composed exclusively of \"word\"-syntax characters -are looked for first. Failing that, longer keys composed of -\"word\" or \"symbol\" syntax are looked for. Therefore, -triggering after - -foo-barbaz - -will, according to the \"w\" element first try \"barbaz\". If -that isn't a trigger key, \"foo-barbaz\" is tried, respecting the -second \"w_\" element. Notice that even if \"baz\" is a trigger -key for an active snippet, it won't be expanded, unless a -function is added to `yas-key-syntaxes' that eventually places -point between \"bar\" and \"baz\". - -See also Info node `(elisp) Syntax Descriptors'.") - -(defvar yas-after-exit-snippet-hook - '() - "Hooks to run after a snippet exited. - -The hooks will be run in an environment where some variables bound to -proper values: - -`yas-snippet-beg' : The beginning of the region of the snippet. - -`yas-snippet-end' : Similar to beg. - -Attention: These hooks are not run when exiting nested/stacked snippet expansion!") - -(defvar yas-before-expand-snippet-hook - '() - "Hooks to run just before expanding a snippet.") - -(defconst yas-not-string-or-comment-condition - '(if (let ((ppss (syntax-ppss))) - (or (nth 3 ppss) (nth 4 ppss))) - '(require-snippet-condition . force-in-comment) - t) - "Disables snippet expansion in strings and comments. -To use, set `yas-buffer-local-condition' to this value.") - -(defcustom yas-buffer-local-condition t - "Snippet expanding condition. - -This variable is a Lisp form which is evaluated every time a -snippet expansion is attempted: - - * If it evaluates to nil, no snippets can be expanded. - - * If it evaluates to the a cons (require-snippet-condition - . REQUIREMENT) - - * Snippets bearing no \"# condition:\" directive are not - considered - - * Snippets bearing conditions that evaluate to nil (or - produce an error) won't be considered. - - * If the snippet has a condition that evaluates to non-nil - RESULT: - - * If REQUIREMENT is t, the snippet is considered - - * If REQUIREMENT is `eq' RESULT, the snippet is - considered - - * Otherwise, the snippet is not considered. - - * If it evaluates to the symbol `always', all snippets are - considered for expansion, regardless of any conditions. - - * If it evaluates to t or some other non-nil value - - * Snippet bearing no conditions, or conditions that - evaluate to non-nil, are considered for expansion. - - * Otherwise, the snippet is not considered. - -Here's an example preventing snippets from being expanded from -inside comments, in `python-mode' only, with the exception of -snippets returning the symbol `force-in-comment' in their -conditions. - - (add-hook \\='python-mode-hook - (lambda () - (setq yas-buffer-local-condition - \\='(if (python-syntax-comment-or-string-p) - \\='(require-snippet-condition . force-in-comment) - t))))" - :type - `(choice - (const :tag "Disable snippet expansion inside strings and comments" - ,yas-not-string-or-comment-condition) - (const :tag "Expand all snippets regardless of conditions" always) - (const :tag "Expand snippets unless their condition is nil" t) - (const :tag "Disable all snippet expansion" nil) - sexp)) - -(defcustom yas-keymap-disable-hook nil - "The `yas-keymap' bindings are disabled if any function in this list returns non-nil. -This is useful to control whether snippet navigation bindings -override bindings from other packages (e.g., `company-mode')." - :type 'hook) - -(defcustom yas-overlay-priority 100 - "Priority to use for yasnippets overlays. -This is useful to control whether snippet navigation bindings -override `keymap' overlay property bindings from other packages." - :type 'integer) - -(defcustom yas-inhibit-overlay-modification-protection nil - "If nil, changing text outside the active field aborts the snippet. -This protection is intended to prevent yasnippet from ending up -in an inconsistent state. However, some packages (e.g., the -company completion package) may trigger this protection when it -is not needed. In that case, setting this variable to non-nil -can be useful." - ;; See also `yas--on-protection-overlay-modification'. - :type 'boolean) - - -;;; Internal variables - -(defconst yas--version "0.14.0") - -(defvar yas--menu-table (make-hash-table) - "A hash table of MAJOR-MODE symbols to menu keymaps.") - -(defvar yas--escaped-characters - '(?\\ ?` ?\" ?' ?$ ?} ?{ ?\( ?\)) - "List of characters which *might* need to be escaped.") - -(defconst yas--field-regexp - "${\\([0-9]+:\\)?\\([^}]*\\)}" - "A regexp to *almost* recognize a field.") - -(defconst yas--multi-dollar-lisp-expression-regexp - "$+[ \t\n]*\\(([^)]*)\\)" - "A regexp to *almost* recognize a \"$(...)\" expression.") - -(defconst yas--backquote-lisp-expression-regexp - "`\\([^`]*\\)`" - "A regexp to recognize a \"\\=`lisp-expression\\=`\" expression." ) - -(defconst yas--transform-mirror-regexp - "${\\(?:\\([0-9]+\\):\\)?$\\([ \t\n]*([^}]*\\)" - "A regexp to *almost* recognize a mirror with a transform.") - -(defconst yas--simple-mirror-regexp - "$\\([0-9]+\\)" - "A regexp to recognize a simple mirror.") - -(defvar yas--snippet-id-seed 0 - "Contains the next id for a snippet.") - -(defvar yas--original-auto-fill-function nil - "The original value of `auto-fill-function'.") -(make-variable-buffer-local 'yas--original-auto-fill-function) - -(defvar yas--watch-auto-fill-backtrace nil) - -(defun yas--watch-auto-fill (sym newval op _where) - (when (and (or (and (eq sym 'yas--original-auto-fill-function) - (null newval) - (eq auto-fill-function 'yas--auto-fill)) - (and (eq sym 'auto-fill-function) - (eq newval 'yas--auto-fill) - (null yas--original-auto-fill-function))) - (null yas--watch-auto-fill-backtrace) - (fboundp 'backtrace-frames) ; Suppress compiler warning. - ;; If we're about to change `auto-fill-function' too, - ;; it's okay (probably). - (not (and (eq op 'makunbound) - (not (eq (default-value 'auto-fill-function) 'yas--auto-fill)) - (cl-member 'kill-all-local-variables - (backtrace-frames 'yas--watch-auto-fill) - :key (lambda (frame) (nth 1 frame)))))) - (setq yas--watch-auto-fill-backtrace - (backtrace-frames 'yas--watch-auto-fill)))) - -;; Try to get more info on #873/919 (this only works for Emacs 26+). -(when (fboundp 'add-variable-watcher) - (add-variable-watcher 'yas--original-auto-fill-function - #'yas--watch-auto-fill) - (add-variable-watcher 'auto-fill-function - #'yas--watch-auto-fill)) - -(defun yas--snippet-next-id () - (let ((id yas--snippet-id-seed)) - (cl-incf yas--snippet-id-seed) - id)) - - -;;; Minor mode stuff - -(defvar yas--minor-mode-menu nil - "Holds the YASnippet menu.") - -(defvar yas--condition-cache-timestamp nil) - -(defun yas-maybe-expand-abbrev-key-filter (cmd) - "Return CMD if there is an expandable snippet at point. -This function is useful as a `:filter' to a conditional key -definition." - (when (let ((yas--condition-cache-timestamp (current-time))) - (yas--templates-for-key-at-point)) - cmd)) - -(define-obsolete-function-alias 'yas--maybe-expand-key-filter - #'yas-maybe-expand-abbrev-key-filter "0.14") - -(defconst yas-maybe-expand - '(menu-item "" yas-expand :filter yas-maybe-expand-abbrev-key-filter) - "A conditional key definition. -This can be used as a key definition in keymaps to bind a key to -`yas-expand' only when there is a snippet available to be -expanded.") - -(defvar yas-minor-mode-map - (let ((map (make-sparse-keymap))) - (define-key map [(tab)] yas-maybe-expand) - (define-key map (kbd "TAB") yas-maybe-expand) - (define-key map "\C-c&\C-s" 'yas-insert-snippet) - (define-key map "\C-c&\C-n" 'yas-new-snippet) - (define-key map "\C-c&\C-v" 'yas-visit-snippet-file) - map) - "The keymap used when `yas-minor-mode' is active.") - -(easy-menu-define yas--minor-mode-menu - yas-minor-mode-map - "Menu used when `yas-minor-mode' is active." - '("YASnippet" :visible yas-use-menu - "----" - ["Expand trigger" yas-expand - :help "Possibly expand tab trigger before point"] - ["Insert at point..." yas-insert-snippet - :help "Prompt for an expandable snippet and expand it at point"] - ["New snippet..." yas-new-snippet - :help "Create a new snippet in an appropriate directory"] - ["Visit snippet file..." yas-visit-snippet-file - :help "Prompt for an expandable snippet and find its file"] - "----" - ("Snippet menu behaviour" - ["Visit snippets" (setq yas-visit-from-menu t) - :help "Visit snippets from the menu" - :active t :style radio :selected yas-visit-from-menu] - ["Expand snippets" (setq yas-visit-from-menu nil) - :help "Expand snippets from the menu" - :active t :style radio :selected (not yas-visit-from-menu)] - "----" - ["Show all known modes" (setq yas-use-menu 'full) - :help "Show one snippet submenu for each loaded table" - :active t :style radio :selected (eq yas-use-menu 'full)] - ["Abbreviate according to current mode" (setq yas-use-menu 'abbreviate) - :help "Show only snippet submenus for the current active modes" - :active t :style radio :selected (eq yas-use-menu 'abbreviate)]) - ("Indenting" - ["Auto" (setq yas-indent-line 'auto) - :help "Indent each line of the snippet with `indent-according-to-mode'" - :active t :style radio :selected (eq yas-indent-line 'auto)] - ["Fixed" (setq yas-indent-line 'fixed) - :help "Indent the snippet to the current column" - :active t :style radio :selected (eq yas-indent-line 'fixed)] - ["None" (setq yas-indent-line 'none) - :help "Don't apply any particular snippet indentation after expansion" - :active t :style radio :selected (not (member yas-indent-line '(fixed auto)))] - "----" - ["Also auto indent first line" (setq yas-also-auto-indent-first-line - (not yas-also-auto-indent-first-line)) - :help "When auto-indenting also, auto indent the first line menu" - :active (eq yas-indent-line 'auto) - :style toggle :selected yas-also-auto-indent-first-line] - ) - ("Prompting method" - ["System X-widget" (setq yas-prompt-functions - (cons #'yas-x-prompt - (remove #'yas-x-prompt - yas-prompt-functions))) - :help "Use your windowing system's (gtk, mac, windows, etc...) default menu" - :active t :style radio :selected (eq (car yas-prompt-functions) - #'yas-x-prompt)] - ["Dropdown-list" (setq yas-prompt-functions - (cons #'yas-dropdown-prompt - (remove #'yas-dropdown-prompt - yas-prompt-functions))) - :help "Use a special dropdown list" - :active t :style radio :selected (eq (car yas-prompt-functions) - #'yas-dropdown-prompt)] - ["Ido" (setq yas-prompt-functions - (cons #'yas-ido-prompt - (remove #'yas-ido-prompt - yas-prompt-functions))) - :help "Use an ido-style minibuffer prompt" - :active t :style radio :selected (eq (car yas-prompt-functions) - #'yas-ido-prompt)] - ["Completing read" (setq yas-prompt-functions - (cons #'yas-completing-prompt - (remove #'yas-completing-prompt - yas-prompt-functions))) - :help "Use a normal minibuffer prompt" - :active t :style radio :selected (eq (car yas-prompt-functions) - #'yas-completing-prompt)] - ) - ("Misc" - ["Wrap region in exit marker" - (setq yas-wrap-around-region - (not yas-wrap-around-region)) - :help "If non-nil automatically wrap the selected text in the $0 snippet exit" - :style toggle :selected yas-wrap-around-region] - ["Allow stacked expansions " - (setq yas-triggers-in-field - (not yas-triggers-in-field)) - :help "If non-nil allow snippets to be triggered inside other snippet fields" - :style toggle :selected yas-triggers-in-field] - ["Revive snippets on undo " - (setq yas-snippet-revival - (not yas-snippet-revival)) - :help "If non-nil allow snippets to become active again after undo" - :style toggle :selected yas-snippet-revival] - ["Good grace " - (setq yas-good-grace - (not yas-good-grace)) - :help "If non-nil don't raise errors in bad embedded elisp in snippets" - :style toggle :selected yas-good-grace] - ) - "----" - ["Load snippets..." yas-load-directory - :help "Load snippets from a specific directory"] - ["Reload everything" yas-reload-all - :help "Cleanup stuff, reload snippets, rebuild menus"] - ["About" yas-about - :help "Display some information about YASnippet"])) - -(define-obsolete-variable-alias 'yas-extra-modes 'yas--extra-modes "0.9.1") -(defvar yas--extra-modes nil - "An internal list of modes for which to also lookup snippets. - -This variable probably makes more sense as buffer-local, so -ensure your use `make-local-variable' when you set it.") - -(defvar yas--tables (make-hash-table) - "A hash table of mode symbols to `yas--table' objects.") - -(defvar yas--parents (make-hash-table) - "A hash table of mode symbols do lists of direct parent mode symbols. - -This list is populated when reading the \".yas-parents\" files -found when traversing snippet directories with -`yas-load-directory'. - -There might be additional parenting information stored in the -`derived-mode-parent' property of some mode symbols, but that is -not recorded here.") - -(defvar yas--direct-keymaps (list) - "Keymap alist supporting direct snippet keybindings. - -This variable is placed in `emulation-mode-map-alists'. - -Its elements looks like (TABLE-NAME . KEYMAP). They're -instantiated on `yas-reload-all' but KEYMAP is added to only when -loading snippets. `yas--direct-TABLE-NAME' is then a variable -set buffer-locally when entering `yas-minor-mode'. KEYMAP binds -all defined direct keybindings to `yas-maybe-expand-from-keymap' -which decides on the snippet to expand.") - -(defun yas-direct-keymaps-reload () - "Force reload the direct keybinding for active snippet tables." - (interactive) - (setq yas--direct-keymaps nil) - (maphash #'(lambda (name table) - (push (cons (intern (format "yas--direct-%s" name)) - (yas--table-direct-keymap table)) - yas--direct-keymaps)) - yas--tables)) - -(defun yas--modes-to-activate (&optional mode) - "Compute list of mode symbols that are active for `yas-expand' and friends." - (defvar yas--dfs) ;We rely on dynbind. We could use `letrec' instead! - (let* ((explored (if mode (list mode) ; Building up list in reverse. - (cons major-mode (reverse yas--extra-modes)))) - (yas--dfs - (lambda (mode) - (cl-loop for neighbour - in (cl-list* (or (get mode 'derived-mode-parent) - ;; Consider `fundamental-mode' - ;; as ultimate ancestor. - 'fundamental-mode) - ;; NOTE: `fboundp' check is redundant - ;; since Emacs 24.4. - (and (fboundp mode) (symbol-function mode)) - (gethash mode yas--parents)) - when (and neighbour - (not (memq neighbour explored)) - (symbolp neighbour)) - do (push neighbour explored) - (funcall yas--dfs neighbour))))) - (mapc yas--dfs explored) - (nreverse explored))) - -(defvar yas-minor-mode-hook nil - "Hook run when `yas-minor-mode' is turned on.") - -(defun yas--auto-fill-wrapper () - (when (and auto-fill-function - (not (eq auto-fill-function #'yas--auto-fill))) - (setq yas--original-auto-fill-function auto-fill-function) - (setq auto-fill-function #'yas--auto-fill))) - -;;;###autoload -(define-minor-mode yas-minor-mode - "Toggle YASnippet mode. - -When YASnippet mode is enabled, `yas-expand', normally bound to -the TAB key, expands snippets of code depending on the major -mode. - -With no argument, this command toggles the mode. -positive prefix argument turns on the mode. -Negative prefix argument turns off the mode. - -Key bindings: -\\{yas-minor-mode-map}" - :lighter " yas" ;; The indicator for the mode line. - (cond ((and yas-minor-mode (featurep 'yasnippet)) - ;; Install the direct keymaps in `emulation-mode-map-alists' - ;; (we use `add-hook' even though it's not technically a hook, - ;; but it works). Then define variables named after modes to - ;; index `yas--direct-keymaps'. - ;; - ;; Also install the post-command-hook. - ;; - (cl-pushnew 'yas--direct-keymaps emulation-mode-map-alists) - (add-hook 'post-command-hook #'yas--post-command-handler nil t) - ;; Set the `yas--direct-%s' vars for direct keymap expansion - ;; - (dolist (mode (yas--modes-to-activate)) - (let ((name (intern (format "yas--direct-%s" mode)))) - (set-default name nil) - (set (make-local-variable name) t))) - ;; Perform JIT loads - (yas--load-pending-jits) - ;; Install auto-fill handler. - (yas--auto-fill-wrapper) ; Now... - (add-hook 'auto-fill-mode-hook #'yas--auto-fill-wrapper)) ; or later. - (t - ;; Uninstall the direct keymaps, post-command hook, and - ;; auto-fill handler. - (remove-hook 'post-command-hook #'yas--post-command-handler t) - (remove-hook 'auto-fill-mode-hook #'yas--auto-fill-wrapper) - (when (local-variable-p 'yas--original-auto-fill-function) - (setq auto-fill-function yas--original-auto-fill-function)) - (setq emulation-mode-map-alists - (remove 'yas--direct-keymaps emulation-mode-map-alists))))) - -(defun yas-activate-extra-mode (mode) - "Activates the snippets for the given `mode' in the buffer. - -The function can be called in the hook of a minor mode to -activate snippets associated with that mode." - (interactive - (let (modes - symbol) - (maphash (lambda (k _) - (setq modes (cons (list k) modes))) - yas--parents) - (setq symbol (completing-read - "Activate mode: " modes nil t)) - (list - (when (not (string= "" symbol)) - (intern symbol))))) - (when mode - (add-to-list (make-local-variable 'yas--extra-modes) mode) - (yas--load-pending-jits))) - -(defun yas-deactivate-extra-mode (mode) - "Deactivates the snippets for the given `mode' in the buffer." - (interactive - (list (intern - (completing-read - "Deactivate mode: " (mapcar #'list yas--extra-modes) nil t)))) - (set (make-local-variable 'yas--extra-modes) - (remove mode - yas--extra-modes))) - -(defun yas-temp-buffer-p (&optional buffer) - (eq (aref (buffer-name buffer) 0) ?\s)) - -(define-obsolete-variable-alias 'yas-dont-activate - 'yas-dont-activate-functions "0.9.2") -(defvar yas-dont-activate-functions (list #'minibufferp #'yas-temp-buffer-p) - "Special hook to control which buffers `yas-global-mode' affects. -Functions are called with no argument, and should return non-nil to prevent -`yas-global-mode' from enabling yasnippet in this buffer. - -In Emacsen < 24, this variable is buffer-local. Because -`yas-minor-mode-on' is called by `yas-global-mode' after -executing the buffer's major mode hook, setting this variable -there is an effective way to define exceptions to the \"global\" -activation behaviour. - -In Emacsen >= 24, only the global value is used. To define -per-mode exceptions to the \"global\" activation behaviour, call -`yas-minor-mode' with a negative argument directily in the major -mode's hook.") -(unless (> emacs-major-version 23) - (with-no-warnings - (make-variable-buffer-local 'yas-dont-activate))) - - -(defun yas-minor-mode-on () - "Turn on YASnippet minor mode. - -Honour `yas-dont-activate-functions', which see." - (interactive) - (unless (or - ;; The old behavior used for Emacs<24 was to set - ;; `yas-dont-activate-functions' to t buffer-locally. - (not (or (listp yas-dont-activate-functions) - (functionp yas-dont-activate-functions))) - (run-hook-with-args-until-success 'yas-dont-activate-functions)) - (yas-minor-mode 1))) - -;;;###autoload -(define-globalized-minor-mode yas-global-mode yas-minor-mode yas-minor-mode-on) - -(defun yas--global-mode-reload-with-jit-maybe () - "Run `yas-reload-all' when `yas-global-mode' is on." - (when yas-global-mode (yas-reload-all))) - -(add-hook 'yas-global-mode-hook #'yas--global-mode-reload-with-jit-maybe) - - -;;; Major mode stuff - -(defvar yas--font-lock-keywords - (append '(("^#.*$" . font-lock-comment-face)) - (with-temp-buffer - (let ((prog-mode-hook nil) - (emacs-lisp-mode-hook nil)) - (ignore-errors (emacs-lisp-mode))) - (font-lock-set-defaults) - (if (eq t (car-safe font-lock-keywords)) - ;; They're "compiled", so extract the source. - (cadr font-lock-keywords) - font-lock-keywords)) - '(("\\$\\([0-9]+\\)" - (0 font-lock-keyword-face) - (1 font-lock-string-face t)) - ("\\${\\([0-9]+\\):?" - (0 font-lock-keyword-face) - (1 font-lock-warning-face t)) - ("\\(\\$(\\)" 1 font-lock-preprocessor-face) - ("}" - (0 font-lock-keyword-face))))) - -(defvar snippet-mode-map - (let ((map (make-sparse-keymap))) - (easy-menu-define nil - map - "Menu used when snippet-mode is active." - (cons "Snippet" - (mapcar #'(lambda (ent) - (when (nth 2 ent) - (define-key map (nth 2 ent) (nth 1 ent))) - (vector (nth 0 ent) (nth 1 ent) t)) - '(("Load this snippet" yas-load-snippet-buffer "\C-c\C-l") - ("Load and quit window" yas-load-snippet-buffer-and-close "\C-c\C-c") - ("Try out this snippet" yas-tryout-snippet "\C-c\C-t"))))) - map) - "The keymap used when `snippet-mode' is active.") - - - -;;;###autoload(autoload 'snippet-mode "yasnippet" "A mode for editing yasnippets" t nil) -(eval-and-compile - (if (fboundp 'prog-mode) - ;; `prog-mode' is new in 24.1. - (define-derived-mode snippet-mode prog-mode "Snippet" - "A mode for editing yasnippets" - (setq font-lock-defaults '(yas--font-lock-keywords)) - (set (make-local-variable 'require-final-newline) nil) - (set (make-local-variable 'comment-start) "#") - (set (make-local-variable 'comment-start-skip) "#+[\t ]*") - (add-hook 'after-save-hook #'yas-maybe-load-snippet-buffer nil t)) - (define-derived-mode snippet-mode fundamental-mode "Snippet" - "A mode for editing yasnippets" - (setq font-lock-defaults '(yas--font-lock-keywords)) - (set (make-local-variable 'require-final-newline) nil) - (set (make-local-variable 'comment-start) "#") - (set (make-local-variable 'comment-start-skip) "#+[\t ]*") - (add-hook 'after-save-hook #'yas-maybe-load-snippet-buffer nil t)))) - -(defun yas-snippet-mode-buffer-p () - "Return non-nil if current buffer should be in `snippet-mode'. -Meaning it's visiting a file under one of the mode directories in -`yas-snippet-dirs'." - (when buffer-file-name - (cl-member buffer-file-name (yas-snippet-dirs) - :test #'file-in-directory-p))) - -;; We're abusing `magic-fallback-mode-alist' here because -;; `auto-mode-alist' doesn't support function matchers. -(add-to-list 'magic-fallback-mode-alist - `(yas-snippet-mode-buffer-p . snippet-mode)) - - -;;; Internal structs for template management - -(cl-defstruct (yas--template - (:constructor yas--make-template) - ;; Handles `yas-define-snippets' format, plus the - ;; initial TABLE argument. - (:constructor - yas--define-snippets-2 - (table - key content - &optional xname condition group - expand-env load-file xkeybinding xuuid save-file - &aux - (name (or xname - ;; A little redundant: we always get a name - ;; from `yas--parse-template' except when - ;; there isn't a file. - (and load-file (file-name-nondirectory load-file)) - (and save-file (file-name-nondirectory save-file)) - key)) - (keybinding (yas--read-keybinding xkeybinding)) - (uuid (or xuuid name)) - (old (gethash uuid (yas--table-uuidhash table))) - (menu-binding-pair - (and old (yas--template-menu-binding-pair old))) - (perm-group - (and old (yas--template-perm-group old)))))) - "A template for a snippet." - key - content - name - condition - expand-env - load-file - save-file - keybinding - uuid - menu-binding-pair - group ;; as dictated by the #group: directive or .yas-make-groups - perm-group ;; as dictated by `yas-define-menu' - table - ) - -(cl-defstruct (yas--table (:constructor yas--make-snippet-table (name))) - "A table to store snippets for a particular mode. - -Has the following fields: - -`yas--table-name' - - A symbol name normally corresponding to a major mode, but can - also be a pseudo major-mode to be used in - `yas-activate-extra-mode', for example. - -`yas--table-hash' - - A hash table (KEY . NAMEHASH), known as the \"keyhash\". KEY is - a string or a vector, where the former is the snippet's trigger - and the latter means it's a direct keybinding. NAMEHASH is yet - another hash of (NAME . TEMPLATE) where NAME is the snippet's - name and TEMPLATE is a `yas--template' object. - -`yas--table-direct-keymap' - - A keymap for the snippets in this table that have direct - keybindings. This is kept in sync with the keyhash, i.e., all - the elements of the keyhash that are vectors appear here as - bindings to `yas-maybe-expand-from-keymap'. - -`yas--table-uuidhash' - - A hash table mapping snippets uuid's to the same `yas--template' - objects. A snippet uuid defaults to the snippet's name." - name - (hash (make-hash-table :test 'equal)) - (uuidhash (make-hash-table :test 'equal)) - (parents nil) - (direct-keymap (make-sparse-keymap))) - -(defun yas--get-template-by-uuid (mode uuid) - "Find the snippet template in MODE by its UUID." - (let* ((table (gethash mode yas--tables mode))) - (when table - (gethash uuid (yas--table-uuidhash table))))) - -;; Apropos storing/updating in TABLE, this works in two steps: -;; -;; 1. `yas--remove-template-by-uuid' removes any -;; keyhash-namehash-template mappings from TABLE, grabbing the -;; snippet by its uuid. Also removes mappings from TABLE's -;; `yas--table-direct-keymap' (FIXME: and should probably take care -;; of potentially stale menu bindings right?.) -;; -;; 2. `yas--add-template' adds this all over again. -;; -;; Create a new or add to an existing keyhash-namehash mapping. -;; -;; For reference on understanding this, consider three snippet -;; definitions: -;; -;; A: # name: The Foo -;; # key: foo -;; # binding: C-c M-l -;; -;; B: # name: Mrs Foo -;; # key: foo -;; -;; C: # name: The Bar -;; # binding: C-c M-l -;; -;; D: # name: Baz -;; # key: baz -;; -;; keyhash namehashes(3) yas--template structs(4) -;; ----------------------------------------------------- -;; __________ -;; / \ -;; "foo" ---> "The Foo" ---> [yas--template A] | -;; "Mrs Foo" ---> [yas--template B] | -;; | -;; [C-c M-l] ---> "The Foo" -------------------------/ -;; "The Bar" ---> [yas--template C] -;; -;; "baz" ---> "Baz" ---> [yas--template D] -;; -;; Additionally, since uuid defaults to the name, we have a -;; `yas--table-uuidhash' for TABLE -;; -;; uuidhash yas--template structs -;; ------------------------------- -;; "The Foo" ---> [yas--template A] -;; "Mrs Foo" ---> [yas--template B] -;; "The Bar" ---> [yas--template C] -;; "Baz" ---> [yas--template D] -;; -;; FIXME: the more I look at this data-structure the more I think I'm -;; stupid. There has to be an easier way (but beware lots of code -;; depends on this). -;; -(defun yas--remove-template-by-uuid (table uuid) - "Remove from TABLE a template identified by UUID." - (let ((template (gethash uuid (yas--table-uuidhash table)))) - (when template - (let* ((name (yas--template-name template)) - (empty-keys nil)) - ;; Remove the name from each of the targeted namehashes - ;; - (maphash #'(lambda (k v) - (let ((template (gethash name v))) - (when (and template - (equal uuid (yas--template-uuid template))) - (remhash name v) - (when (zerop (hash-table-count v)) - (push k empty-keys))))) - (yas--table-hash table)) - ;; Remove the namehash themselves if they've become empty - ;; - (dolist (key empty-keys) - (when (vectorp key) - (define-key (yas--table-direct-keymap table) key nil)) - (remhash key (yas--table-hash table))) - - ;; Finally, remove the uuid from the uuidhash - ;; - (remhash uuid (yas--table-uuidhash table)))))) - -(defconst yas-maybe-expand-from-keymap - '(menu-item "" yas-expand-from-keymap - :filter yas--maybe-expand-from-keymap-filter)) - -(defun yas--add-template (table template) - "Store in TABLE the snippet template TEMPLATE. - -KEY can be a string (trigger key) of a vector (direct -keybinding)." - (let ((name (yas--template-name template)) - (key (yas--template-key template)) - (keybinding (yas--template-keybinding template)) - (_menu-binding-pair (yas--template-menu-binding-pair-get-create template))) - (dolist (k (remove nil (list key keybinding))) - (puthash name - template - (or (gethash k - (yas--table-hash table)) - (puthash k - (make-hash-table :test 'equal) - (yas--table-hash table)))) - (when (vectorp k) - (define-key (yas--table-direct-keymap table) k yas-maybe-expand-from-keymap))) - - ;; Update TABLE's `yas--table-uuidhash' - (puthash (yas--template-uuid template) - template - (yas--table-uuidhash table)))) - -(defun yas--update-template (table template) - "Add or update TEMPLATE in TABLE. - -Also takes care of adding and updating to the associated menu. -Return TEMPLATE." - ;; Remove from table by uuid - ;; - (yas--remove-template-by-uuid table (yas--template-uuid template)) - ;; Add to table again - ;; - (yas--add-template table template) - ;; Take care of the menu - ;; - (yas--update-template-menu table template) - template) - -(defun yas--update-template-menu (table template) - "Update every menu-related for TEMPLATE." - (let ((menu-binding-pair (yas--template-menu-binding-pair-get-create template)) - (key (yas--template-key template)) - (keybinding (yas--template-keybinding template))) - ;; The snippet might have changed name or keys, so update - ;; user-visible strings - ;; - (unless (eq (cdr menu-binding-pair) :none) - ;; the menu item name - ;; - (setf (cl-cadar menu-binding-pair) (yas--template-name template)) - ;; the :keys information (also visible to the user) - (setf (cl-getf (cdr (car menu-binding-pair)) :keys) - (or (and keybinding (key-description keybinding)) - (and key (concat key yas-trigger-symbol)))))) - (unless (yas--template-menu-managed-by-yas-define-menu template) - (let ((menu-keymap - (yas--menu-keymap-get-create (yas--table-mode table) - (mapcar #'yas--table-mode - (yas--table-parents table)))) - (group (yas--template-group template))) - ;; Remove from menu keymap - ;; - (cl-assert menu-keymap) - (yas--delete-from-keymap menu-keymap (yas--template-uuid template)) - - ;; Add necessary subgroups as necessary. - ;; - (dolist (subgroup group) - (let ((subgroup-keymap (lookup-key menu-keymap (vector (make-symbol subgroup))))) - (unless (and subgroup-keymap - (keymapp subgroup-keymap)) - (setq subgroup-keymap (make-sparse-keymap)) - (define-key menu-keymap (vector (make-symbol subgroup)) - `(menu-item ,subgroup ,subgroup-keymap))) - (setq menu-keymap subgroup-keymap))) - - ;; Add this entry to the keymap - ;; - (define-key menu-keymap - (vector (make-symbol (yas--template-uuid template))) - (car (yas--template-menu-binding-pair template)))))) - -(defun yas--namehash-templates-alist (namehash) - "Return NAMEHASH as an alist." - (let (alist) - (maphash #'(lambda (k v) - (push (cons k v) alist)) - namehash) - alist)) - -(defun yas--fetch (table key) - "Fetch templates in TABLE by KEY. - -Return a list of cons (NAME . TEMPLATE) where NAME is a -string and TEMPLATE is a `yas--template' structure." - (let* ((keyhash (yas--table-hash table)) - (namehash (and keyhash (gethash key keyhash)))) - (when namehash - (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash))))) - - -;;; Filtering/condition logic - -(defun yas--eval-condition (condition) - (condition-case err - (save-excursion - (save-restriction - (save-match-data - (eval condition)))) - (error (progn - (yas--message 1 "Error in condition evaluation: %s" (error-message-string err)) - nil)))) - - -(defun yas--filter-templates-by-condition (templates) - "Filter the templates using the applicable condition. - -TEMPLATES is a list of cons (NAME . TEMPLATE) where NAME is a -string and TEMPLATE is a `yas--template' structure. - -This function implements the rules described in -`yas-buffer-local-condition'. See that variables documentation." - (let ((requirement (yas--require-template-specific-condition-p))) - (if (eq requirement 'always) - templates - (cl-remove-if-not (lambda (pair) - (yas--template-can-expand-p - (yas--template-condition (cdr pair)) requirement)) - templates)))) - -(defun yas--require-template-specific-condition-p () - "Decide if this buffer requests/requires snippet-specific -conditions to filter out potential expansions." - (if (eq 'always yas-buffer-local-condition) - 'always - (let ((local-condition (or (and (consp yas-buffer-local-condition) - (yas--eval-condition yas-buffer-local-condition)) - yas-buffer-local-condition))) - (when local-condition - (if (eq local-condition t) - t - (and (consp local-condition) - (eq 'require-snippet-condition (car local-condition)) - (symbolp (cdr local-condition)) - (cdr local-condition))))))) - -(defun yas--template-can-expand-p (condition requirement) - "Evaluate CONDITION and REQUIREMENT and return a boolean." - (let* ((result (or (null condition) - (yas--eval-condition condition)))) - (cond ((eq requirement t) - result) - (t - (eq requirement result))))) - -(defun yas--table-templates (table) - (when table - (let ((acc (list))) - (maphash #'(lambda (_key namehash) - (maphash #'(lambda (name template) - (push (cons name template) acc)) - namehash)) - (yas--table-hash table)) - (maphash #'(lambda (uuid template) - (push (cons uuid template) acc)) - (yas--table-uuidhash table)) - (yas--filter-templates-by-condition acc)))) - -(defun yas--templates-for-key-at-point () - "Find `yas--template' objects for any trigger keys preceding point. -Returns (TEMPLATES START END). This function respects -`yas-key-syntaxes', which see." - (save-excursion - (let ((original (point)) - (methods yas-key-syntaxes) - (templates) - (method)) - (while (and methods - (not templates)) - (unless (eq method (car methods)) - ;; TRICKY: `eq'-ness test means we can only be here if - ;; `method' is a function that returned `again', and hence - ;; don't revert back to original position as per - ;; `yas-key-syntaxes'. - (goto-char original)) - (setq method (car methods)) - (cond ((stringp method) - (skip-syntax-backward method) - (setq methods (cdr methods))) - ((functionp method) - (unless (eq (funcall method original) - 'again) - (setq methods (cdr methods)))) - (t - (setq methods (cdr methods)) - (yas--warning "Invalid element `%s' in `yas-key-syntaxes'" method))) - (let ((possible-key (buffer-substring-no-properties (point) original))) - (save-excursion - (goto-char original) - (setq templates - (cl-mapcan (lambda (table) - (yas--fetch table possible-key)) - (yas--get-snippet-tables)))))) - (when templates - (list templates (point) original))))) - -(defun yas--table-all-keys (table) - "Get trigger keys of all active snippets in TABLE." - (let ((acc)) - (maphash #'(lambda (key namehash) - (when (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash)) - (push key acc))) - (yas--table-hash table)) - acc)) - -(defun yas--table-mode (table) - (intern (yas--table-name table))) - - -;;; Internal functions and macros: - -(defun yas--remove-misc-free-from-undo (old-undo-list) - "Tries to work around Emacs Bug#30931. -Helper function for `yas--save-restriction-and-widen'." - ;; If Bug#30931 is unfixed, we get (# . INTEGER) - ;; entries in the undo list. If we call `type-of' on the - ;; Lisp_Misc_Free object then Emacs aborts, so try to find it by - ;; checking that its type is none of the expected ones. - (when (consp buffer-undo-list) - (let* ((prev buffer-undo-list) - (undo-list prev)) - (while (and (consp undo-list) - ;; Only check new entries. - (not (eq undo-list old-undo-list))) - (let ((entry (pop undo-list))) - (when (consp entry) - (let ((head (car entry))) - (unless (or (stringp head) - (markerp head) - (integerp head) - (symbolp head) - (not (integerp (cdr entry)))) - ;; (message "removing misc free %S" entry) - (setcdr prev undo-list))))) - (setq prev undo-list))))) - -(defmacro yas--save-restriction-and-widen (&rest body) - "Equivalent to (save-restriction (widen) BODY). -Also tries to work around Emacs Bug#30931." - (declare (debug (body)) (indent 0)) - ;; Disable garbage collection, since it could cause an abort. - `(let ((gc-cons-threshold most-positive-fixnum) - (old-undo-list buffer-undo-list)) - (prog1 (save-restriction - (widen) - ,@body) - (yas--remove-misc-free-from-undo old-undo-list)))) - -(defun yas--eval-for-string (form) - "Evaluate FORM and convert the result to string." - (let ((debug-on-error (and (not (memq yas-good-grace '(t inline))) - debug-on-error))) - (condition-case oops - (save-excursion - (yas--save-restriction-and-widen - (save-match-data - (let ((result (eval form))) - (when result - (format "%s" result)))))) - ((debug error) (cdr oops))))) - -(defun yas--eval-for-effect (form) - (yas--safely-call-fun (apply-partially #'eval form))) - -(defun yas--read-lisp (string &optional nil-on-error) - "Read STRING as a elisp expression and return it. - -In case STRING in an invalid expression and NIL-ON-ERROR is nil, -return an expression that when evaluated will issue an error." - (condition-case err - (read string) - (error (and (not nil-on-error) - `(error (error-message-string ,err)))))) - -(defun yas--read-keybinding (keybinding) - "Read KEYBINDING as a snippet keybinding, return a vector." - (when (and keybinding - (not (string-match "keybinding" keybinding))) - (condition-case err - (let ((res (or (and (string-match "^\\[.*\\]$" keybinding) - (read keybinding)) - (read-kbd-macro keybinding 'need-vector)))) - res) - (error - (yas--message 2 "warning: keybinding \"%s\" invalid since %s." - keybinding (error-message-string err)) - nil)))) - -(defun yas--table-get-create (mode) - "Get or create the snippet table corresponding to MODE." - (let ((table (gethash mode - yas--tables))) - (unless table - (setq table (yas--make-snippet-table (symbol-name mode))) - (puthash mode table yas--tables) - (push (cons (intern (format "yas--direct-%s" mode)) - (yas--table-direct-keymap table)) - yas--direct-keymaps)) - table)) - -(defun yas--get-snippet-tables (&optional mode) - "Get snippet tables for MODE. - -MODE defaults to the current buffer's `major-mode'. - -Return a list of `yas--table' objects. The list of modes to -consider is returned by `yas--modes-to-activate'" - (remove nil - (mapcar #'(lambda (name) - (gethash name yas--tables)) - (yas--modes-to-activate mode)))) - -(defun yas--menu-keymap-get-create (mode &optional parents) - "Get or create the menu keymap for MODE and its PARENTS. - -This may very well create a plethora of menu keymaps and arrange -them all in `yas--menu-table'" - (let* ((menu-keymap (or (gethash mode yas--menu-table) - (puthash mode (make-sparse-keymap) yas--menu-table)))) - (mapc #'yas--menu-keymap-get-create parents) - (define-key yas--minor-mode-menu (vector mode) - `(menu-item ,(symbol-name mode) ,menu-keymap - :visible (yas--show-menu-p ',mode))) - menu-keymap)) - - -;;; Template-related and snippet loading functions - -(defun yas--parse-template (&optional file) - "Parse the template in the current buffer. - -Optional FILE is the absolute file name of the file being -parsed. - -Optional GROUP is the group where the template is to go, -otherwise we attempt to calculate it from FILE. - -Return a snippet-definition, i.e. a list - - (KEY TEMPLATE NAME CONDITION GROUP VARS LOAD-FILE KEYBINDING UUID) - -If the buffer contains a line of \"# --\" then the contents above -this line are ignored. Directives can set most of these with the syntax: - -# directive-name : directive-value - -Here's a list of currently recognized directives: - - * type - * name - * contributor - * condition - * group - * key - * expand-env - * binding - * uuid" - (goto-char (point-min)) - (let* ((type 'snippet) - (name (and file - (file-name-nondirectory file))) - (key nil) - template - bound - condition - (group (and file - (yas--calculate-group file))) - expand-env - binding - uuid) - (if (re-search-forward "^# --\\s-*\n" nil t) - (progn (setq template - (buffer-substring-no-properties (point) - (point-max))) - (setq bound (point)) - (goto-char (point-min)) - (while (re-search-forward "^# *\\([^ ]+?\\) *: *\\(.*?\\)[[:space:]]*$" bound t) - (when (string= "uuid" (match-string-no-properties 1)) - (setq uuid (match-string-no-properties 2))) - (when (string= "type" (match-string-no-properties 1)) - (setq type (if (string= "command" (match-string-no-properties 2)) - 'command - 'snippet))) - (when (string= "key" (match-string-no-properties 1)) - (setq key (match-string-no-properties 2))) - (when (string= "name" (match-string-no-properties 1)) - (setq name (match-string-no-properties 2))) - (when (string= "condition" (match-string-no-properties 1)) - (setq condition (yas--read-lisp (match-string-no-properties 2)))) - (when (string= "group" (match-string-no-properties 1)) - (setq group (match-string-no-properties 2))) - (when (string= "expand-env" (match-string-no-properties 1)) - (setq expand-env (yas--read-lisp (match-string-no-properties 2) - 'nil-on-error))) - (when (string= "binding" (match-string-no-properties 1)) - (setq binding (match-string-no-properties 2))))) - (setq template - (buffer-substring-no-properties (point-min) (point-max)))) - (unless (or key binding) - (setq key (and file (file-name-nondirectory file)))) - (when (eq type 'command) - (setq template (yas--read-lisp (concat "(progn" template ")")))) - (when group - (setq group (split-string group "\\."))) - (list key template name condition group expand-env file binding uuid))) - -(defun yas--calculate-group (file) - "Calculate the group for snippet file path FILE." - (let* ((dominating-dir (locate-dominating-file file - ".yas-make-groups")) - (extra-path (and dominating-dir - (file-relative-name file dominating-dir))) - (extra-dir (and extra-path - (file-name-directory extra-path))) - (group (and extra-dir - (replace-regexp-in-string "/" - "." - (directory-file-name extra-dir))))) - group)) - -(defun yas--subdirs (directory &optional filep) - "Return subdirs or files of DIRECTORY according to FILEP." - (cl-remove-if (lambda (file) - (or (string-match "\\`\\." - (file-name-nondirectory file)) - (string-match "\\`#.*#\\'" - (file-name-nondirectory file)) - (string-match "~\\'" - (file-name-nondirectory file)) - (if filep - (file-directory-p file) - (not (file-directory-p file))))) - (directory-files directory t))) - -(defun yas--make-menu-binding (template) - (let ((mode (yas--table-mode (yas--template-table template)))) - `(lambda () (interactive) (yas--expand-or-visit-from-menu ',mode ,(yas--template-uuid template))))) - -(defun yas--expand-or-visit-from-menu (mode uuid) - (let* ((table (yas--table-get-create mode)) - (yas--current-template (and table - (gethash uuid (yas--table-uuidhash table))))) - (when yas--current-template - (if yas-visit-from-menu - (yas--visit-snippet-file-1 yas--current-template) - (let ((where (if (region-active-p) - (cons (region-beginning) (region-end)) - (cons (point) (point))))) - (yas-expand-snippet yas--current-template - (car where) (cdr where))))))) - -(defun yas--key-from-desc (text) - "Return a yasnippet key from a description string TEXT." - (replace-regexp-in-string "\\(\\w+\\).*" "\\1" text)) - - -;;; Popping up for keys and templates - -(defun yas--prompt-for-template (templates &optional prompt) - "Interactively choose a template from the list TEMPLATES. - -TEMPLATES is a list of `yas--template'. - -Optional PROMPT sets the prompt to use." - (when templates - (setq templates - (sort templates #'(lambda (t1 t2) - (< (length (yas--template-name t1)) - (length (yas--template-name t2)))))) - (cl-some (lambda (fn) - (funcall fn (or prompt "Choose a snippet: ") - templates - #'yas--template-name)) - yas-prompt-functions))) - -(defun yas--prompt-for-keys (keys &optional prompt) - "Interactively choose a template key from the list KEYS. - -Optional PROMPT sets the prompt to use." - (when keys - (cl-some (lambda (fn) - (funcall fn (or prompt "Choose a snippet key: ") keys)) - yas-prompt-functions))) - -(defun yas--prompt-for-table (tables &optional prompt) - "Interactively choose a table from the list TABLES. - -Optional PROMPT sets the prompt to use." - (when tables - (cl-some (lambda (fn) - (funcall fn (or prompt "Choose a snippet table: ") - tables - #'yas--table-name)) - yas-prompt-functions))) - -(defun yas-x-prompt (prompt choices &optional display-fn) - "Display choices in a x-window prompt." - (when (and window-system choices) - ;; Let window position be recalculated to ensure that - ;; `posn-at-point' returns non-nil. - (redisplay) - (or - (x-popup-menu - (if (fboundp 'posn-at-point) - (let ((x-y (posn-x-y (posn-at-point (point))))) - (list (list (+ (car x-y) 10) - (+ (cdr x-y) 20)) - (selected-window))) - t) - `(,prompt ("title" - ,@(cl-mapcar (lambda (c d) `(,(concat " " d) . ,c)) - choices - (if display-fn (mapcar display-fn choices) - choices))))) - (keyboard-quit)))) - -(defun yas-maybe-ido-prompt (prompt choices &optional display-fn) - (when (bound-and-true-p ido-mode) - (yas-ido-prompt prompt choices display-fn))) - -(defun yas-ido-prompt (prompt choices &optional display-fn) - (require 'ido) - (yas-completing-prompt prompt choices display-fn #'ido-completing-read)) - -(defun yas-dropdown-prompt (_prompt choices &optional display-fn) - (when (fboundp 'dropdown-list) - (let* ((formatted-choices - (if display-fn (mapcar display-fn choices) choices)) - (n (dropdown-list formatted-choices))) - (if n (nth n choices) - (keyboard-quit))))) - -(defun yas-completing-prompt (prompt choices &optional display-fn completion-fn) - (let* ((formatted-choices - (if display-fn (mapcar display-fn choices) choices)) - (chosen (funcall (or completion-fn #'completing-read) - prompt formatted-choices - nil 'require-match nil nil))) - (if (eq choices formatted-choices) - chosen - (nth (or (cl-position chosen formatted-choices :test #'string=) 0) - choices)))) - -(defun yas-no-prompt (_prompt choices &optional _display-fn) - (cl-first choices)) - - -;;; Defining snippets -;; This consists of creating and registering `yas--template' objects in the -;; correct tables. -;; - -(defvar yas--creating-compiled-snippets nil) - -(defun yas--define-snippets-1 (snippet snippet-table) - "Helper for `yas-define-snippets'." - ;; Update the appropriate table. Also takes care of adding the - ;; key indicators in the templates menu entry, if any. - (yas--update-template - snippet-table (apply #'yas--define-snippets-2 snippet-table snippet))) - -(defun yas-define-snippets (mode snippets) - "Define SNIPPETS for MODE. - -SNIPPETS is a list of snippet definitions, each taking the -following form - - (KEY TEMPLATE NAME CONDITION GROUP EXPAND-ENV LOAD-FILE KEYBINDING UUID SAVE-FILE) - -Within these, only KEY and TEMPLATE are actually mandatory. - -TEMPLATE might be a Lisp form or a string, depending on whether -this is a snippet or a snippet-command. - -CONDITION, EXPAND-ENV and KEYBINDING are Lisp forms, they have -been `yas--read-lisp'-ed and will eventually be -`yas--eval-for-string'-ed. - -The remaining elements are strings. - -FILE is probably of very little use if you're programatically -defining snippets. - -UUID is the snippet's \"unique-id\". Loading a second snippet -file with the same uuid would replace the previous snippet. - -You can use `yas--parse-template' to return such lists based on -the current buffers contents." - (if yas--creating-compiled-snippets - (let ((print-length nil)) - (insert ";;; Snippet definitions:\n;;;\n") - (dolist (snippet snippets) - ;; Fill in missing elements with nil. - (setq snippet (append snippet (make-list (- 10 (length snippet)) nil))) - ;; Move LOAD-FILE to SAVE-FILE because we will load from the - ;; compiled file, not LOAD-FILE. - (let ((load-file (nth 6 snippet))) - (setcar (nthcdr 6 snippet) nil) - (setcar (nthcdr 9 snippet) load-file))) - (insert (pp-to-string - `(yas-define-snippets ',mode ',snippets))) - (insert "\n\n")) - ;; Normal case. - (let ((snippet-table (yas--table-get-create mode)) - (template nil)) - (dolist (snippet snippets) - (setq template (yas--define-snippets-1 snippet - snippet-table))) - template))) - - -;;; Loading snippets from files - -(defun yas--template-get-file (template) - "Return TEMPLATE's LOAD-FILE or SAVE-FILE." - (or (yas--template-load-file template) - (let ((file (yas--template-save-file template))) - (when file - (yas--message 3 "%s has no load file, using save file, %s, instead." - (yas--template-name template) file)) - file))) - -(defun yas--load-yas-setup-file (file) - (if (not yas--creating-compiled-snippets) - ;; Normal case. - (load file 'noerror (<= yas-verbosity 4)) - (let ((elfile (concat file ".el"))) - (when (file-exists-p elfile) - (insert ";;; contents of the .yas-setup.el support file:\n;;;\n") - (insert-file-contents elfile) - (goto-char (point-max)))))) - -(defun yas--define-parents (mode parents) - "Add PARENTS to the list of MODE's parents." - (puthash mode (cl-remove-duplicates - (append parents - (gethash mode yas--parents))) - yas--parents)) - -(defun yas-load-directory (top-level-dir &optional use-jit interactive) - "Load snippets in directory hierarchy TOP-LEVEL-DIR. - -Below TOP-LEVEL-DIR each directory should be a mode name. - -With prefix argument USE-JIT do jit-loading of snippets." - (interactive - (list (read-directory-name "Select the root directory: " nil nil t) - current-prefix-arg t)) - (unless yas-snippet-dirs - (setq yas-snippet-dirs top-level-dir)) - (let ((impatient-buffers)) - (dolist (dir (yas--subdirs top-level-dir)) - (let* ((major-mode-and-parents (yas--compute-major-mode-and-parents - (concat dir "/dummy"))) - (mode-sym (car major-mode-and-parents)) - (parents (cdr major-mode-and-parents))) - ;; Attention: The parents and the menus are already defined - ;; here, even if the snippets are later jit-loaded. - ;; - ;; * We need to know the parents at this point since entering a - ;; given mode should jit load for its parents - ;; immediately. This could be reviewed, the parents could be - ;; discovered just-in-time-as well - ;; - ;; * We need to create the menus here to support the `full' - ;; option to `yas-use-menu' (all known snippet menus are shown to the user) - ;; - (yas--define-parents mode-sym parents) - (yas--menu-keymap-get-create mode-sym) - (let ((fun (apply-partially #'yas--load-directory-1 dir mode-sym))) - (if use-jit - (yas--schedule-jit mode-sym fun) - (funcall fun))) - ;; Look for buffers that are already in `mode-sym', and so - ;; need the new snippets immediately... - ;; - (when use-jit - (cl-loop for buffer in (buffer-list) - do (with-current-buffer buffer - (when (eq major-mode mode-sym) - (yas--message 4 "Discovered there was already %s in %s" buffer mode-sym) - (push buffer impatient-buffers))))))) - ;; ...after TOP-LEVEL-DIR has been completely loaded, call - ;; `yas--load-pending-jits' in these impatient buffers. - ;; - (cl-loop for buffer in impatient-buffers - do (with-current-buffer buffer (yas--load-pending-jits)))) - (when interactive - (yas--message 3 "Loaded snippets from %s." top-level-dir))) - -(defun yas--load-directory-1 (directory mode-sym) - "Recursively load snippet templates from DIRECTORY." - (if yas--creating-compiled-snippets - (let ((output-file (expand-file-name ".yas-compiled-snippets.el" - directory))) - (with-temp-file output-file - (insert (format ";;; Compiled snippets and support files for `%s'\n" - mode-sym)) - (yas--load-directory-2 directory mode-sym) - (insert (format ";;; Do not edit! File generated at %s\n" - (current-time-string))))) - ;; Normal case. - (unless (file-exists-p (expand-file-name ".yas-skip" directory)) - (unless (and (load (expand-file-name ".yas-compiled-snippets" directory) 'noerror (<= yas-verbosity 3)) - (progn (yas--message 4 "Loaded compiled snippets from %s" directory) t)) - (yas--message 4 "Loading snippet files from %s" directory) - (yas--load-directory-2 directory mode-sym))))) - -(defun yas--load-directory-2 (directory mode-sym) - ;; Load .yas-setup.el files wherever we find them - ;; - (yas--load-yas-setup-file (expand-file-name ".yas-setup" directory)) - (let* ((default-directory directory) - (snippet-defs nil)) - ;; load the snippet files - ;; - (with-temp-buffer - (dolist (file (yas--subdirs directory 'no-subdirs-just-files)) - (when (file-readable-p file) - ;; Erase the buffer instead of passing non-nil REPLACE to - ;; `insert-file-contents' (avoids Emacs bug #23659). - (erase-buffer) - (insert-file-contents file) - (push (yas--parse-template file) - snippet-defs)))) - (when snippet-defs - (yas-define-snippets mode-sym - snippet-defs)) - ;; now recurse to a lower level - ;; - (dolist (subdir (yas--subdirs directory)) - (yas--load-directory-2 subdir - mode-sym)))) - -(defun yas--load-snippet-dirs (&optional nojit) - "Reload the directories listed in `yas-snippet-dirs' or -prompt the user to select one." - (let (errors) - (if (null yas-snippet-dirs) - (call-interactively 'yas-load-directory) - (when (member yas--default-user-snippets-dir yas-snippet-dirs) - (make-directory yas--default-user-snippets-dir t)) - (dolist (directory (reverse (yas-snippet-dirs))) - (cond ((file-directory-p directory) - (yas-load-directory directory (not nojit)) - (if nojit - (yas--message 4 "Loaded %s" directory) - (yas--message 4 "Prepared just-in-time loading for %s" directory))) - (t - (push (yas--message 1 "Check your `yas-snippet-dirs': %s is not a directory" directory) errors))))) - errors)) - -(defun yas-reload-all (&optional no-jit interactive) - "Reload all snippets and rebuild the YASnippet menu. - -When NO-JIT is non-nil force immediate reload of all known -snippets under `yas-snippet-dirs', otherwise use just-in-time -loading. - -When called interactively, use just-in-time loading when given a -prefix argument." - (interactive (list (not current-prefix-arg) t)) - (catch 'abort - (let ((errors) - (snippet-editing-buffers - (cl-remove-if-not (lambda (buffer) - (with-current-buffer buffer - yas--editing-template)) - (buffer-list)))) - ;; Warn if there are buffers visiting snippets, since reloading will break - ;; any on-line editing of those buffers. - ;; - (when snippet-editing-buffers - (if interactive - (if (y-or-n-p "Some buffers editing live snippets, close them and proceed with reload? ") - (mapc #'kill-buffer snippet-editing-buffers) - (yas--message 1 "Aborted reload...") - (throw 'abort nil)) - ;; in a non-interactive use, at least set - ;; `yas--editing-template' to nil, make it guess it next time around - (mapc #'(lambda (buffer) - (with-current-buffer buffer - (kill-local-variable 'yas--editing-template))) - (buffer-list)))) - - ;; Empty all snippet tables and parenting info - ;; - (setq yas--tables (make-hash-table)) - (setq yas--parents (make-hash-table)) - - ;; Before killing `yas--menu-table' use its keys to cleanup the - ;; mode menu parts of `yas--minor-mode-menu' (thus also cleaning - ;; up `yas-minor-mode-map', which points to it) - ;; - (maphash #'(lambda (menu-symbol _keymap) - (define-key yas--minor-mode-menu (vector menu-symbol) nil)) - yas--menu-table) - ;; Now empty `yas--menu-table' as well - (setq yas--menu-table (make-hash-table)) - - ;; Cancel all pending 'yas--scheduled-jit-loads' - ;; - (setq yas--scheduled-jit-loads (make-hash-table)) - - ;; Reload the directories listed in `yas-snippet-dirs' or prompt - ;; the user to select one. - ;; - (setq errors (yas--load-snippet-dirs no-jit)) - ;; Reload the direct keybindings - ;; - (yas-direct-keymaps-reload) - - (run-hooks 'yas-after-reload-hook) - (let ((no-snippets - (cl-every (lambda (table) (= (hash-table-count table) 0)) - (list yas--scheduled-jit-loads - yas--parents yas--tables)))) - (yas--message (if (or no-snippets errors) 2 3) - (if no-jit "Snippets loaded %s." - "Prepared just-in-time loading of snippets %s.") - (cond (errors - "with some errors. Check *Messages*") - (no-snippets - "(but no snippets found)") - (t - "successfully"))))))) - -(defvar yas-after-reload-hook nil - "Hooks run after `yas-reload-all'.") - -(defun yas--load-pending-jits () - (dolist (mode (yas--modes-to-activate)) - (let ((funs (reverse (gethash mode yas--scheduled-jit-loads)))) - ;; must reverse to maintain coherence with `yas-snippet-dirs' - (dolist (fun funs) - (yas--message 4 "Loading for `%s', just-in-time: %s!" mode fun) - (funcall fun)) - (remhash mode yas--scheduled-jit-loads)))) - -(defun yas-escape-text (text) - "Escape TEXT for snippet." - (when text - (replace-regexp-in-string "[\\$]" "\\\\\\&" text))) - - -;;; Snippet compilation function - -(defun yas-compile-directory (top-level-dir) - "Create .yas-compiled-snippets.el files under subdirs of TOP-LEVEL-DIR. - -This works by stubbing a few functions, then calling -`yas-load-directory'." - (interactive "DTop level snippet directory?") - (let ((yas--creating-compiled-snippets t)) - (yas-load-directory top-level-dir nil))) - -(defun yas-recompile-all () - "Compile every dir in `yas-snippet-dirs'." - (interactive) - (mapc #'yas-compile-directory (yas-snippet-dirs))) - - -;;; JIT loading -;;; - -(defvar yas--scheduled-jit-loads (make-hash-table) - "Alist of mode-symbols to forms to be evaled when `yas-minor-mode' kicks in.") - -(defun yas--schedule-jit (mode fun) - (push fun (gethash mode yas--scheduled-jit-loads))) - - - -;;; Some user level functions - -(defun yas-about () - (interactive) - (message "yasnippet (version %s) -- pluskid/joaotavora/npostavs" - (or (ignore-errors (car (let ((default-directory yas--loaddir)) - (process-lines "git" "describe" - "--tags" "--dirty")))) - (when (and (featurep 'package) - (fboundp 'package-desc-version) - (fboundp 'package-version-join)) - (defvar package-alist) - (ignore-errors - (let* ((yas-pkg (cdr (assq 'yasnippet package-alist))) - (version (package-version-join - (package-desc-version (car yas-pkg))))) - ;; Special case for MELPA's bogus version numbers. - (if (string-match "\\`20..[01][0-9][0-3][0-9][.][0-9]\\{3,4\\}\\'" - version) - (concat yas--version "-snapshot" version) - version)))) - yas--version))) - - -;;; Apropos snippet menu: -;; -;; The snippet menu keymaps are stored by mode in hash table called -;; `yas--menu-table'. They are linked to the main menu in -;; `yas--menu-keymap-get-create' and are initially created empty, -;; reflecting the table hierarchy. -;; -;; They can be populated in two mutually exclusive ways: (1) by -;; reading `yas--template-group', which in turn is populated by the "# -;; group:" directives of the snippets or the ".yas-make-groups" file -;; or (2) by using a separate `yas-define-menu' call, which declares a -;; menu structure based on snippets uuids. -;; -;; Both situations are handled in `yas--update-template-menu', which -;; uses the predicate `yas--template-menu-managed-by-yas-define-menu' -;; that can tell between the two situations. -;; -;; Note: -;; -;; * if `yas-define-menu' is used it must run before -;; `yas-define-snippets' and the UUIDS must match, otherwise we get -;; duplicate entries. The `yas--template' objects are created in -;; `yas-define-menu', holding nothing but the menu entry, -;; represented by a pair of ((menu-item NAME :keys KEYS) TYPE) and -;; stored in `yas--template-menu-binding-pair'. The (menu-item ...) -;; part is then stored in the menu keymap itself which make the item -;; appear to the user. These limitations could probably be revised. -;; -;; * The `yas--template-perm-group' slot is only used in -;; `yas-describe-tables'. -;; -(defun yas--template-menu-binding-pair-get-create (template &optional type) - "Get TEMPLATE's menu binding or assign it a new one. - -TYPE may be `:stay', signaling this menu binding should be -static in the menu." - (or (yas--template-menu-binding-pair template) - (let (;; (key (yas--template-key template)) - ;; (keybinding (yas--template-keybinding template)) - ) - (setf (yas--template-menu-binding-pair template) - (cons `(menu-item ,(or (yas--template-name template) - (yas--template-uuid template)) - ,(yas--make-menu-binding template) - :keys ,nil) - type))))) -(defun yas--template-menu-managed-by-yas-define-menu (template) - "Non-nil if TEMPLATE's menu entry was included in a `yas-define-menu' call." - (cdr (yas--template-menu-binding-pair template))) - - -(defun yas--show-menu-p (mode) - (cond ((eq yas-use-menu 'abbreviate) - (cl-find mode - (mapcar #'yas--table-mode - (yas--get-snippet-tables)))) - (yas-use-menu t))) - -(defun yas--delete-from-keymap (keymap uuid) - "Recursively delete items with UUID from KEYMAP and its submenus." - - ;; XXX: This used to skip any submenus named \"parent mode\" - ;; - ;; First of all, recursively enter submenus, i.e. the tree is - ;; searched depth first so that stale submenus can be found in the - ;; higher passes. - ;; - (mapc #'(lambda (item) - (when (and (consp (cdr-safe item)) - (keymapp (nth 2 (cdr item)))) - (yas--delete-from-keymap (nth 2 (cdr item)) uuid))) - (cdr keymap)) - ;; Set the uuid entry to nil - ;; - (define-key keymap (vector (make-symbol uuid)) nil) - ;; Destructively modify keymap - ;; - (setcdr keymap (cl-delete-if (lambda (item) - (cond ((not (listp item)) nil) - ((null (cdr item))) - ((and (keymapp (nth 2 (cdr item))) - (null (cdr (nth 2 (cdr item)))))))) - (cdr keymap)))) - -(defun yas-define-menu (mode menu &optional omit-items) - "Define a snippet menu for MODE according to MENU, omitting OMIT-ITEMS. - -MENU is a list, its elements can be: - -- (yas-item UUID) : Creates an entry the snippet identified with - UUID. The menu entry for a snippet thus identified is - permanent, i.e. it will never move (be reordered) in the menu. - -- (yas-separator) : Creates a separator - -- (yas-submenu NAME SUBMENU) : Creates a submenu with NAME, - SUBMENU has the same form as MENU. NAME is also added to the - list of groups of the snippets defined thereafter. - -OMIT-ITEMS is a list of snippet uuids that will always be -omitted from MODE's menu, even if they're manually loaded." - (let* ((table (yas--table-get-create mode)) - (hash (yas--table-uuidhash table))) - (yas--define-menu-1 table - (yas--menu-keymap-get-create mode) - menu - hash) - (dolist (uuid omit-items) - (let ((template (or (gethash uuid hash) - (puthash uuid - (yas--make-template :table table - :uuid uuid) - hash)))) - (setf (yas--template-menu-binding-pair template) (cons nil :none)))))) - -(defun yas--define-menu-1 (table menu-keymap menu uuidhash &optional group-list) - "Helper for `yas-define-menu'." - (cl-loop - for (type name submenu) in (reverse menu) - collect (cond - ((or (eq type 'yas-item) - (and yas-alias-to-yas/prefix-p - (eq type 'yas/item))) - (let ((template (or (gethash name uuidhash) - (puthash name - (yas--make-template - :table table - :perm-group group-list - :uuid name) - uuidhash)))) - (car (yas--template-menu-binding-pair-get-create - template :stay)))) - ((or (eq type 'yas-submenu) - (and yas-alias-to-yas/prefix-p - (eq type 'yas/submenu))) - (let ((subkeymap (make-sparse-keymap))) - (yas--define-menu-1 table subkeymap submenu uuidhash - (append group-list (list name))) - `(menu-item ,name ,subkeymap))) - ((or (eq type 'yas-separator) - (and yas-alias-to-yas/prefix-p - (eq type 'yas/separator))) - '(menu-item "----")) - (t (yas--message 1 "Don't know anything about menu entry %s" type) - nil)) - into menu-entries - finally do (push (apply #'vector menu-entries) (cdr menu-keymap)))) - -(defun yas--define (mode key template &optional name condition group) - "Define a snippet. Expanding KEY into TEMPLATE. - -NAME is a description to this template. Also update the menu if -`yas-use-menu' is t. CONDITION is the condition attached to -this snippet. If you attach a condition to a snippet, then it -will only be expanded when the condition evaluated to non-nil." - (yas-define-snippets mode - (list (list key template name condition group)))) - -(defun yas-hippie-try-expand (first-time?) - "Integrate with hippie expand. - -Just put this function in `hippie-expand-try-functions-list'." - (when yas-minor-mode - (if (not first-time?) - (let ((yas-fallback-behavior 'return-nil)) - (yas-expand)) - (undo 1) - nil))) - - -;;; Apropos condition-cache: -;;; -;;; -;;; -;;; -(defmacro yas-define-condition-cache (func doc &rest body) - "Define a function FUNC with doc DOC and body BODY. -BODY is executed at most once every snippet expansion attempt, to check -expansion conditions. - -It doesn't make any sense to call FUNC programatically." - `(defun ,func () ,(if (and doc - (stringp doc)) - (concat doc -"\n\nFor use in snippets' conditions. Within each -snippet-expansion routine like `yas-expand', computes actual -value for the first time then always returns a cached value.") - (setq body (cons doc body)) - nil) - (let ((timestamp-and-value (get ',func 'yas--condition-cache))) - (if (equal (car timestamp-and-value) yas--condition-cache-timestamp) - (cdr timestamp-and-value) - (let ((new-value (progn - ,@body - ))) - (put ',func 'yas--condition-cache (cons yas--condition-cache-timestamp new-value)) - new-value))))) - -(defalias 'yas-expand 'yas-expand-from-trigger-key) -(defun yas-expand-from-trigger-key (&optional field) - "Expand a snippet before point. - -If no snippet expansion is possible, fall back to the behaviour -defined in `yas-fallback-behavior'. - -Optional argument FIELD is for non-interactive use and is an -object satisfying `yas--field-p' to restrict the expansion to." - (interactive) - (setq yas--condition-cache-timestamp (current-time)) - (let (templates-and-pos) - (unless (and yas-expand-only-for-last-commands - (not (member last-command yas-expand-only-for-last-commands))) - (setq templates-and-pos (if field - (save-restriction - (narrow-to-region (yas--field-start field) - (yas--field-end field)) - (yas--templates-for-key-at-point)) - (yas--templates-for-key-at-point)))) - (if templates-and-pos - (yas--expand-or-prompt-for-template - (nth 0 templates-and-pos) - ;; Delete snippet key and active region when expanding. - (min (if (use-region-p) (region-beginning) most-positive-fixnum) - (nth 1 templates-and-pos)) - (max (if (use-region-p) (region-end) most-negative-fixnum) - (nth 2 templates-and-pos))) - (yas--fallback)))) - -(defun yas--maybe-expand-from-keymap-filter (cmd) - "Check whether a snippet may be expanded. -If there are expandable snippets, return CMD (this is useful for -conditional keybindings) or the list of expandable snippet -template objects if CMD is nil (this is useful as a more general predicate)." - (let* ((yas--condition-cache-timestamp (current-time)) - (vec (cl-subseq (this-command-keys-vector) - (if current-prefix-arg - (length (this-command-keys)) - 0))) - (templates (cl-mapcan (lambda (table) - (yas--fetch table vec)) - (yas--get-snippet-tables)))) - (if templates (or cmd templates)))) - -(defun yas-expand-from-keymap () - "Directly expand some snippets, searching `yas--direct-keymaps'." - (interactive) - (setq yas--condition-cache-timestamp (current-time)) - (let* ((templates (yas--maybe-expand-from-keymap-filter nil))) - (when templates - (yas--expand-or-prompt-for-template templates)))) - -(defun yas--expand-or-prompt-for-template (templates &optional start end) - "Expand one of TEMPLATES from START to END. - -Prompt the user if TEMPLATES has more than one element, else -expand immediately. Common gateway for -`yas-expand-from-trigger-key' and `yas-expand-from-keymap'." - (let ((yas--current-template - (or (and (cl-rest templates) ;; more than one - (yas--prompt-for-template (mapcar #'cdr templates))) - (cdar templates)))) - (when yas--current-template - (yas-expand-snippet yas--current-template start end)))) - -;; Apropos the trigger key and the fallback binding: -;; -;; When `yas-minor-mode-map' binds , that correctly overrides -;; org-mode's , for example and searching for fallbacks correctly -;; returns `org-cycle'. However, most other modes bind "TAB". TODO, -;; improve this explanation. -;; -(defun yas--fallback () - "Fallback after expansion has failed. - -Common gateway for `yas-expand-from-trigger-key' and -`yas-expand-from-keymap'." - (cond ((eq yas-fallback-behavior 'return-nil) - ;; return nil - nil) - ((eq yas-fallback-behavior 'yas--fallback) - (error (concat "yasnippet fallback loop!\n" - "This can happen when you bind `yas-expand' " - "outside of the `yas-minor-mode-map'."))) - ((eq yas-fallback-behavior 'call-other-command) - (let* ((yas-fallback-behavior 'yas--fallback) - ;; Also bind `yas-minor-mode' to prevent fallback - ;; loops when other extensions use mechanisms similar - ;; to `yas--keybinding-beyond-yasnippet'. (github #525 - ;; and #526) - ;; - (yas-minor-mode nil) - (beyond-yasnippet (yas--keybinding-beyond-yasnippet))) - (yas--message 4 "Falling back to %s" beyond-yasnippet) - (cl-assert (or (null beyond-yasnippet) (commandp beyond-yasnippet))) - (setq this-command beyond-yasnippet) - (when beyond-yasnippet - (call-interactively beyond-yasnippet)))) - ((and (listp yas-fallback-behavior) - (cdr yas-fallback-behavior) - (eq 'apply (car yas-fallback-behavior))) - (let ((command-or-fn (cadr yas-fallback-behavior)) - (args (cddr yas-fallback-behavior)) - (yas-fallback-behavior 'yas--fallback) - (yas-minor-mode nil)) - (if args - (apply command-or-fn args) - (when (commandp command-or-fn) - (setq this-command command-or-fn) - (call-interactively command-or-fn))))) - (t - ;; also return nil if all the other fallbacks have failed - nil))) - -(defun yas--keybinding-beyond-yasnippet () - "Get current keys's binding as if YASsnippet didn't exist." - (let* ((yas-minor-mode nil) - (yas--direct-keymaps nil) - (keys (this-single-command-keys))) - (or (key-binding keys t) - (key-binding (yas--fallback-translate-input keys) t)))) - -(defun yas--fallback-translate-input (keys) - "Emulate `read-key-sequence', at least what I think it does. - -Keys should be an untranslated key vector. Returns a translated -vector of keys. FIXME not thoroughly tested." - (let ((retval []) - (i 0)) - (while (< i (length keys)) - (let ((j i) - (translated local-function-key-map)) - (while (and (< j (length keys)) - translated - (keymapp translated)) - (setq translated (cdr (assoc (aref keys j) (remove 'keymap translated))) - j (1+ j))) - (setq retval (vconcat retval (cond ((symbolp translated) - `[,translated]) - ((vectorp translated) - translated) - (t - (substring keys i j))))) - (setq i j))) - retval)) - - -;;; Utils for snippet development: - -(defun yas--all-templates (tables) - "Get `yas--template' objects in TABLES, applicable for buffer and point. - -Honours `yas-choose-tables-first', `yas-choose-keys-first' and -`yas-buffer-local-condition'" - (when yas-choose-tables-first - (setq tables (list (yas--prompt-for-table tables)))) - (mapcar #'cdr - (if yas-choose-keys-first - (let ((key (yas--prompt-for-keys - (cl-mapcan #'yas--table-all-keys tables)))) - (when key - (cl-mapcan (lambda (table) - (yas--fetch table key)) - tables))) - (cl-remove-duplicates (cl-mapcan #'yas--table-templates tables) - :test #'equal)))) - -(defun yas--lookup-snippet-1 (name mode) - "Get the snippet called NAME in MODE's tables." - (let ((yas-choose-tables-first nil) ; avoid prompts - (yas-choose-keys-first nil)) - (cl-find name (yas--all-templates - (yas--get-snippet-tables mode)) - :key #'yas--template-name :test #'string=))) - -(defun yas-lookup-snippet (name &optional mode noerror) - "Get the snippet named NAME in MODE's tables. - -MODE defaults to the current buffer's `major-mode'. If NOERROR -is non-nil, then don't signal an error if there isn't any snippet -called NAME. - -Honours `yas-buffer-local-condition'." - (cond - ((yas--lookup-snippet-1 name mode)) - (noerror nil) - (t (error "No snippet named: %s" name)))) - -(defun yas-insert-snippet (&optional no-condition) - "Choose a snippet to expand, pop-up a list of choices according -to `yas-prompt-functions'. - -With prefix argument NO-CONDITION, bypass filtering of snippets -by condition." - (interactive "P") - (setq yas--condition-cache-timestamp (current-time)) - (let* ((yas-buffer-local-condition (or (and no-condition - 'always) - yas-buffer-local-condition)) - (templates (yas--all-templates (yas--get-snippet-tables))) - (yas--current-template (and templates - (or (and (cl-rest templates) ;; more than one template for same key - (yas--prompt-for-template templates)) - (car templates)))) - (where (if (region-active-p) - (cons (region-beginning) (region-end)) - (cons (point) (point))))) - (if yas--current-template - (yas-expand-snippet yas--current-template (car where) (cdr where)) - (yas--message 1 "No snippets can be inserted here!")))) - -(defun yas-visit-snippet-file () - "Choose a snippet to edit, selection like `yas-insert-snippet'. - -Only success if selected snippet was loaded from a file. Put the -visited file in `snippet-mode'." - (interactive) - (let* ((yas-buffer-local-condition 'always) - (templates (yas--all-templates (yas--get-snippet-tables))) - (template (and templates - (or (yas--prompt-for-template templates - "Choose a snippet template to edit: ") - (car templates))))) - - (if template - (yas--visit-snippet-file-1 template) - (message "No snippets tables active!")))) - -(defun yas--visit-snippet-file-1 (template) - "Helper for `yas-visit-snippet-file'." - (let ((file (yas--template-get-file template))) - (cond ((and file (file-readable-p file)) - (find-file-other-window file) - (snippet-mode) - (set (make-local-variable 'yas--editing-template) template)) - (file - (message "Original file %s no longer exists!" file)) - (t - (switch-to-buffer (format "*%s*"(yas--template-name template))) - (let ((type 'snippet)) - (when (listp (yas--template-content template)) - (insert (format "# type: command\n")) - (setq type 'command)) - (insert (format "# key: %s\n" (yas--template-key template))) - (insert (format "# name: %s\n" (yas--template-name template))) - (when (yas--template-keybinding template) - (insert (format "# binding: %s\n" (yas--template-keybinding template)))) - (when (yas--template-expand-env template) - (insert (format "# expand-env: %s\n" (yas--template-expand-env template)))) - (when (yas--template-condition template) - (insert (format "# condition: %s\n" (yas--template-condition template)))) - (insert "# --\n") - (insert (if (eq type 'command) - (pp-to-string (yas--template-content template)) - (yas--template-content template)))) - (snippet-mode) - (set (make-local-variable 'yas--editing-template) template) - (set (make-local-variable 'default-directory) - (car (cdr (car (yas--guess-snippet-directories (yas--template-table template)))))))))) - -(defun yas--guess-snippet-directories-1 (table) - "Guess possible snippet subdirectories for TABLE." - (cons (file-name-as-directory (yas--table-name table)) - (cl-mapcan #'yas--guess-snippet-directories-1 - (yas--table-parents table)))) - -(defun yas--guess-snippet-directories (&optional table) - "Try to guess suitable directories based on the current active -tables (or optional TABLE). - -Returns a list of elements (TABLE . DIRS) where TABLE is a -`yas--table' object and DIRS is a list of all possible directories -where snippets of table might exist." - (let ((main-dir (car (or (yas-snippet-dirs) - (setq yas-snippet-dirs - (list yas--default-user-snippets-dir))))) - (tables (if table (list table) - (yas--get-snippet-tables)))) - ;; HACK! the snippet table created here is actually registered! - (unless table - ;; The major mode is probably the best guess, put it first. - (let ((major-mode-table (yas--table-get-create major-mode))) - (cl-callf2 delq major-mode-table tables) - (push major-mode-table tables))) - - (mapcar #'(lambda (table) - (cons table - (mapcar #'(lambda (subdir) - (expand-file-name subdir main-dir)) - (yas--guess-snippet-directories-1 table)))) - tables))) - -(defun yas--make-directory-maybe (table-and-dirs &optional main-table-string) - "Return a dir inside TABLE-AND-DIRS, prompts for creation if none exists." - (or (cl-some (lambda (dir) (when (file-directory-p dir) dir)) - (cdr table-and-dirs)) - (let ((candidate (cl-first (cdr table-and-dirs)))) - (unless (file-writable-p (file-name-directory candidate)) - (error (yas--format "%s is not writable." candidate))) - (if (y-or-n-p (format "Guessed directory (%s) for%s%s table \"%s\" does not exist! Create? " - candidate - (if (gethash (yas--table-mode (car table-and-dirs)) - yas--tables) - "" - " brand new") - (or main-table-string - "") - (yas--table-name (car table-and-dirs)))) - (progn - (make-directory candidate 'also-make-parents) - ;; create the .yas-parents file here... - candidate))))) - -;; NOTE: Using the traditional "*new snippet*" stops whitespace mode -;; from activating (it doesn't like the leading "*"). -(defconst yas-new-snippet-buffer-name "+new-snippet+") - -(defun yas-new-snippet (&optional no-template) - "Pops a new buffer for writing a snippet. - -Expands a snippet-writing snippet, unless the optional prefix arg -NO-TEMPLATE is non-nil." - (interactive "P") - (let ((guessed-directories (yas--guess-snippet-directories)) - (yas-selected-text (or yas-selected-text - (and (region-active-p) - (buffer-substring-no-properties - (region-beginning) (region-end)))))) - - (switch-to-buffer yas-new-snippet-buffer-name) - (erase-buffer) - (kill-all-local-variables) - (snippet-mode) - (yas-minor-mode 1) - (set (make-local-variable 'yas--guessed-modes) - (mapcar (lambda (d) (yas--table-mode (car d))) - guessed-directories)) - (set (make-local-variable 'default-directory) - (car (cdr (car guessed-directories)))) - (if (and (not no-template) yas-new-snippet-default) - (yas-expand-snippet yas-new-snippet-default)))) - -(defun yas--compute-major-mode-and-parents (file) - "Given FILE, find the nearest snippet directory for a given mode. - -Returns a list (MODE-SYM PARENTS), the mode's symbol and a list -representing one or more of the mode's parents. - -Note that MODE-SYM need not be the symbol of a real major mode, -neither do the elements of PARENTS." - (let* ((file-dir (and file - (directory-file-name - (or (cl-some (lambda (special) - (locate-dominating-file file special)) - '(".yas-setup.el" - ".yas-make-groups" - ".yas-parents")) - (directory-file-name (file-name-directory file)))))) - (parents-file-name (concat file-dir "/.yas-parents")) - (major-mode-name (and file-dir - (file-name-nondirectory file-dir))) - (major-mode-sym (or (and major-mode-name - (intern major-mode-name)))) - (parents (when (file-readable-p parents-file-name) - (mapcar #'intern - (split-string - (with-temp-buffer - (insert-file-contents parents-file-name) - (buffer-substring-no-properties (point-min) - (point-max)))))))) - (when major-mode-sym - (cons major-mode-sym (remove major-mode-sym parents))))) - -(defvar yas--editing-template nil - "Supporting variable for `yas-load-snippet-buffer' and `yas--visit-snippet'.") - -(defvar yas--current-template nil - "Holds the current template being expanded into a snippet.") - -(defvar yas--guessed-modes nil - "List of guessed modes supporting `yas-load-snippet-buffer'.") - -(defun yas--read-table () - "Ask user for a snippet table, help with some guessing." - (let ((prompt (if (and (featurep 'ido) - ido-mode) - 'ido-completing-read 'completing-read))) - (unless yas--guessed-modes - (set (make-local-variable 'yas--guessed-modes) - (or (yas--compute-major-mode-and-parents buffer-file-name)))) - (intern - (funcall prompt (format "Choose or enter a table (yas guesses %s): " - (if yas--guessed-modes - (cl-first yas--guessed-modes) - "nothing")) - (mapcar #'symbol-name yas--guessed-modes) - nil - nil - nil - nil - (if (cl-first yas--guessed-modes) - (symbol-name (cl-first yas--guessed-modes))))))) - -(defun yas-load-snippet-buffer (table &optional interactive) - "Parse and load current buffer's snippet definition into TABLE. -TABLE is a symbol name passed to `yas--table-get-create'. When -called interactively, prompt for the table name. -Return the `yas--template' object created" - (interactive (list (yas--read-table) t)) - (cond - ;; We have `yas--editing-template', this buffer's content comes from a - ;; template which is already loaded and neatly positioned,... - ;; - (yas--editing-template - (yas--define-snippets-1 (yas--parse-template (yas--template-load-file yas--editing-template)) - (yas--template-table yas--editing-template))) - ;; Try to use `yas--guessed-modes'. If we don't have that use the - ;; value from `yas--compute-major-mode-and-parents' - ;; - (t - (unless yas--guessed-modes - (set (make-local-variable 'yas--guessed-modes) (or (yas--compute-major-mode-and-parents buffer-file-name)))) - (let* ((table (yas--table-get-create table))) - (set (make-local-variable 'yas--editing-template) - (yas--define-snippets-1 (yas--parse-template buffer-file-name) - table))))) - (when interactive - (yas--message 3 "Snippet \"%s\" loaded for %s." - (yas--template-name yas--editing-template) - (yas--table-name (yas--template-table yas--editing-template)))) - yas--editing-template) - -(defun yas-maybe-load-snippet-buffer () - "Added to `after-save-hook' in `snippet-mode'." - (let* ((mode (intern (file-name-sans-extension - (file-name-nondirectory - (directory-file-name default-directory))))) - (current-snippet - (apply #'yas--define-snippets-2 (yas--table-get-create mode) - (yas--parse-template buffer-file-name))) - (uuid (yas--template-uuid current-snippet))) - (unless (equal current-snippet - (if uuid (yas--get-template-by-uuid mode uuid) - (yas--lookup-snippet-1 - (yas--template-name current-snippet) mode))) - (yas-load-snippet-buffer mode t)))) - -(defun yas-load-snippet-buffer-and-close (table &optional kill) - "Load and save the snippet, then `quit-window' if saved. -Loading is performed by `yas-load-snippet-buffer'. If the -snippet is new, ask the user whether (and where) to save it. If -the snippet already has a file, just save it. - -The prefix argument KILL is passed to `quit-window'. - -Don't use this from a Lisp program, call `yas-load-snippet-buffer' -and `kill-buffer' instead." - (interactive (list (yas--read-table) current-prefix-arg)) - (let ((template (yas-load-snippet-buffer table t))) - (when (and (buffer-modified-p) - (y-or-n-p - (format "[yas] Loaded for %s. Also save snippet buffer?" - (yas--table-name (yas--template-table template))))) - (let ((default-directory (car (cdr (car (yas--guess-snippet-directories - (yas--template-table template)))))) - (default-file-name (yas--template-name template))) - (unless (or buffer-file-name (not default-file-name)) - (setq buffer-file-name - (read-file-name "File to save snippet in: " - nil nil nil default-file-name)) - (rename-buffer (file-name-nondirectory buffer-file-name) t)) - (save-buffer))) - (quit-window kill))) - -(declare-function yas-debug-snippets "yasnippet-debug") - -(defun yas-tryout-snippet (&optional debug) - "Test current buffer's snippet template in other buffer. -DEBUG is for debugging the YASnippet engine itself." - (interactive "P") - (let* ((major-mode-and-parent (yas--compute-major-mode-and-parents buffer-file-name)) - (parsed (yas--parse-template)) - (test-mode (or (and (car major-mode-and-parent) - (fboundp (car major-mode-and-parent)) - (car major-mode-and-parent)) - (cl-first yas--guessed-modes) - (intern (read-from-minibuffer (yas--format "Please input a mode: "))))) - (yas--current-template - (and parsed - (fboundp test-mode) - (yas--make-template :table nil ;; no tables for ephemeral snippets - :key (nth 0 parsed) - :content (nth 1 parsed) - :name (nth 2 parsed) - :expand-env (nth 5 parsed))))) - (cond (yas--current-template - (let ((buffer-name - (format "*testing snippet: %s*" - (yas--template-name yas--current-template)))) - (kill-buffer (get-buffer-create buffer-name)) - (switch-to-buffer (get-buffer-create buffer-name)) - (setq buffer-undo-list nil) - (condition-case nil (funcall test-mode) (error nil)) - (yas-minor-mode 1) - (setq buffer-read-only nil) - (yas-expand-snippet yas--current-template - (point-min) (point-max)) - (when (and debug - (require 'yasnippet-debug nil t)) - (yas-debug-snippets "*YASnippet trace*" 'snippet-navigation) - (display-buffer "*YASnippet trace*")))) - (t - (yas--message 1 "Cannot test snippet for unknown major mode"))))) - -(defun yas-active-keys () - "Return all active trigger keys for current buffer and point." - (cl-remove-duplicates - (cl-remove-if-not #'stringp (cl-mapcan #'yas--table-all-keys - (yas--get-snippet-tables))) - :test #'string=)) - -(defun yas--template-fine-group (template) - (car (last (or (yas--template-group template) - (yas--template-perm-group template))))) - -(defun yas-describe-table-by-namehash () - "Display snippet tables by NAMEHASH." - (interactive) - (with-current-buffer (get-buffer-create "*YASnippet Tables by NAMEHASH*") - (let ((inhibit-read-only t)) - (erase-buffer) - (insert "YASnippet tables by NAMEHASH: \n") - (maphash - (lambda (_mode table) - (insert (format "\nSnippet table `%s':\n\n" (yas--table-name table))) - (maphash - (lambda (key _v) - (insert (format " key %s maps snippets: %s\n" key - (let ((names)) - (maphash #'(lambda (k _v) - (push k names)) - (gethash key (yas--table-hash table))) - names)))) - (yas--table-hash table))) - yas--tables)) - (view-mode +1) - (goto-char 1) - (display-buffer (current-buffer)))) - -(defun yas-describe-tables (&optional with-nonactive) - "Display snippets for each table." - (interactive "P") - (let ((original-buffer (current-buffer)) - (tables (yas--get-snippet-tables))) - (with-current-buffer (get-buffer-create "*YASnippet Tables*") - (let ((inhibit-read-only t)) - (when with-nonactive - (maphash #'(lambda (_k v) - (cl-pushnew v tables)) - yas--tables)) - (erase-buffer) - (insert "YASnippet tables:\n") - (dolist (table tables) - (yas--describe-pretty-table table original-buffer)) - (yas--create-snippet-xrefs)) - (help-mode) - (goto-char 1) - (display-buffer (current-buffer))))) - -(defun yas--describe-pretty-table (table &optional original-buffer) - (insert (format "\nSnippet table `%s'" - (yas--table-name table))) - (if (yas--table-parents table) - (insert (format " parents: %s\n" - (mapcar #'yas--table-name - (yas--table-parents table)))) - (insert "\n")) - (insert (make-string 100 ?-) "\n") - (insert "group state name key binding\n") - (let ((groups-hash (make-hash-table :test #'equal))) - (maphash #'(lambda (_k v) - (let ((group (or (yas--template-fine-group v) - "(top level)"))) - (when (yas--template-name v) - (puthash group - (cons v (gethash group groups-hash)) - groups-hash)))) - (yas--table-uuidhash table)) - (maphash - #'(lambda (group templates) - (setq group (truncate-string-to-width group 25 0 ? "...")) - (insert (make-string 100 ?-) "\n") - (dolist (p templates) - (let* ((name (truncate-string-to-width (propertize (format "\\\\snippet `%s'" (yas--template-name p)) - 'yasnippet p) - 50 0 ? "...")) - (group (prog1 group - (setq group (make-string (length group) ? )))) - (condition-string (let ((condition (yas--template-condition p))) - (if (and condition - original-buffer) - (with-current-buffer original-buffer - (if (yas--eval-condition condition) - "(y)" - "(s)")) - "(a)"))) - (key-description-string (key-description (yas--template-keybinding p))) - (template-key-padding (if (string= key-description-string "") nil ? ))) - (insert group " " - condition-string " " - name (if (string-match "\\.\\.\\.$" name) - "'" " ") - " " - (truncate-string-to-width (or (yas--template-key p) "") - 15 0 template-key-padding "...") - (or template-key-padding "") - (truncate-string-to-width key-description-string - 15 0 nil "...") - "\n")))) - groups-hash))) - - - -;;; User convenience functions, for using in `yas-key-syntaxes' - -(defun yas-try-key-from-whitespace (_start-point) - "As `yas-key-syntaxes' element, look for whitespace delimited key. - -A newline will be considered whitespace even if the mode syntax -marks it as something else (typically comment ender)." - (skip-chars-backward "^[:space:]\n")) - -(defun yas-shortest-key-until-whitespace (_start-point) - "Like `yas-longest-key-from-whitespace' but take the shortest key." - (when (/= (skip-chars-backward "^[:space:]\n" (1- (point))) 0) - 'again)) - -(defun yas-longest-key-from-whitespace (start-point) - "As `yas-key-syntaxes' element, look for longest key between point and whitespace. - -A newline will be considered whitespace even if the mode syntax -marks it as something else (typically comment ender)." - (if (= (point) start-point) - (yas-try-key-from-whitespace start-point) - (forward-char)) - (unless (<= start-point (1+ (point))) - 'again)) - - - -;;; User convenience functions, for using in snippet definitions - -(defvar yas-modified-p nil - "Non-nil if field has been modified by user or transformation.") - -(defvar yas-moving-away-p nil - "Non-nil if user is about to exit field.") - -(defvar yas-text nil - "Contains current field text.") - -(defun yas-substr (str pattern &optional subexp) - "Search PATTERN in STR and return SUBEXPth match. - -If found, the content of subexp group SUBEXP (default 0) is - returned, or else the original STR will be returned." - (let ((grp (or subexp 0))) - (save-match-data - (if (string-match pattern str) - (match-string-no-properties grp str) - str)))) - -(defun yas-choose-value (&rest possibilities) - "Prompt for a string in POSSIBILITIES and return it. - -The last element of POSSIBILITIES may be a list of strings." - (unless (or yas-moving-away-p - yas-modified-p) - (let* ((last-link (last possibilities)) - (last-elem (car last-link))) - (when (listp last-elem) - (setcar last-link (car last-elem)) - (setcdr last-link (cdr last-elem)))) - (cl-some (lambda (fn) - (funcall fn "Choose: " possibilities)) - yas-prompt-functions))) - -(defun yas-completing-read (&rest args) - "A snippet-aware version of `completing-read'. -This can be used to query the user for the initial value of a -snippet field. The arguments are the same as `completing-read'. - -\(fn PROMPT COLLECTION &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)" - (unless (or yas-moving-away-p - yas-modified-p) - (apply #'completing-read args))) - -(defun yas--auto-next () - "Helper for `yas-auto-next'." - (cl-loop - do (progn (remove-hook 'post-command-hook #'yas--auto-next t) - (yas-next-field)) - ;; The transform in the next field may have requested auto-next as - ;; well. Call it ourselves, since the command loop itself won't - ;; recheck the value of post-command-hook while running it. - while (memq #'yas--auto-next post-command-hook))) - -(defmacro yas-auto-next (&rest body) - "Automatically advance to next field after eval'ing BODY." - (declare (indent 0) (debug t)) - `(unless yas-moving-away-p - (prog1 ,@body - (add-hook 'post-command-hook #'yas--auto-next nil t)))) - -(defun yas-key-to-value (alist) - (unless (or yas-moving-away-p - yas-modified-p) - (let ((key (read-key-sequence ""))) - (when (stringp key) - (or (cdr (cl-find key alist :key #'car :test #'string=)) - key))))) - -(defun yas-throw (text) - "Signal `yas-exception' with TEXT as the reason." - (signal 'yas-exception (list text))) -(put 'yas-exception 'error-conditions '(error yas-exception)) -(put 'yas-exception 'error-message "[yas] Exception") - -(defun yas-verify-value (possibilities) - "Verify that the current field value is in POSSIBILITIES. -Otherwise signal `yas-exception'." - (when (and yas-moving-away-p (not (member yas-text possibilities))) - (yas-throw (format "Field only allows %s" possibilities)))) - -(defun yas-field-value (number) - "Get the string for field with NUMBER. - -Use this in primary and mirror transformations to get the text of -other fields." - (let* ((snippet (car (yas-active-snippets))) - (field (and snippet - (yas--snippet-find-field snippet number)))) - (when field - (yas--field-text-for-display field)))) - -(defun yas-text () - "Return `yas-text' if that exists and is non-empty, else nil." - (if (and yas-text - (not (string= "" yas-text))) - yas-text)) - -(defun yas-selected-text () - "Return `yas-selected-text' if that exists and is non-empty, else nil." - (if (and yas-selected-text - (not (string= "" yas-selected-text))) - yas-selected-text)) - -(defun yas--get-field-once (number &optional transform-fn) - (unless yas-modified-p - (if transform-fn - (funcall transform-fn (yas-field-value number)) - (yas-field-value number)))) - -(defun yas-default-from-field (number) - (unless yas-modified-p - (yas-field-value number))) - -(defun yas-inside-string () - "Return non-nil if the point is inside a string according to font-lock." - (equal 'font-lock-string-face (get-char-property (1- (point)) 'face))) - -(defun yas-unimplemented (&optional missing-feature) - (if yas--current-template - (if (y-or-n-p (format "This snippet is unimplemented (missing %s) Visit the snippet definition? " - (or missing-feature - "something"))) - (yas--visit-snippet-file-1 yas--current-template)) - (message "No implementation. Missing %s" (or missing-feature "something")))) - - -;;; Snippet expansion and field management - -(defvar yas--active-field-overlay nil - "Overlays the currently active field.") - -(defvar yas--active-snippets nil - "List of currently active snippets") -(make-variable-buffer-local 'yas--active-snippets) - -(defvar yas--field-protection-overlays nil - "Two overlays protect the current active field.") - -(defvar yas-selected-text nil - "The selected region deleted on the last snippet expansion.") - -(defvar yas--start-column nil - "The column where the snippet expansion started.") - -(make-variable-buffer-local 'yas--active-field-overlay) -(make-variable-buffer-local 'yas--field-protection-overlays) -(put 'yas--active-field-overlay 'permanent-local t) -(put 'yas--field-protection-overlays 'permanent-local t) - -(cl-defstruct (yas--snippet (:constructor yas--make-snippet (expand-env))) - "A snippet. - -..." - expand-env - (fields '()) - (exit nil) - (id (yas--snippet-next-id) :read-only t) - (control-overlay nil) - active-field - ;; stacked expansion: the `previous-active-field' slot saves the - ;; active field where the child expansion took place - previous-active-field - force-exit) - -(cl-defstruct (yas--field (:constructor yas--make-field (number start end parent-field))) - "A field. - -NUMBER is the field number. -START and END are mostly buffer markers, but see \"apropos markers-to-points\". -PARENT-FIELD is a `yas--field' this field is nested under, or nil. -MIRRORS is a list of `yas--mirror's -TRANSFORM is a lisp form. -MODIFIED-P is a boolean set to true once user inputs text. -NEXT is another `yas--field' or `yas--mirror' or `yas--exit'. -" - number - start end - parent-field - (mirrors '()) - (transform nil) - (modified-p nil) - next) - - -(cl-defstruct (yas--mirror (:constructor yas--make-mirror (start end transform))) - "A mirror. - -START and END are mostly buffer markers, but see \"apropos markers-to-points\". -TRANSFORM is a lisp form. -PARENT-FIELD is a `yas--field' this mirror is nested under, or nil. -NEXT is another `yas--field' or `yas--mirror' or `yas--exit' -DEPTH is a count of how many nested mirrors can affect this mirror" - start end - (transform nil) - parent-field - next - depth) - -(cl-defstruct (yas--exit (:constructor yas--make-exit (marker))) - marker - next) - -(defmacro yas--letenv (env &rest body) - "Evaluate BODY with bindings from ENV. -ENV is a lisp expression that evaluates to list of elements with -the form (VAR FORM), where VAR is a symbol and FORM is a lisp -expression that evaluates to its value." - (declare (debug (form body)) (indent 1)) - (let ((envvar (make-symbol "envvar"))) - `(let ((,envvar ,env)) - (cl-progv - (mapcar #'car ,envvar) - (mapcar (lambda (v-f) (eval (cadr v-f))) ,envvar) - ,@body)))) - -(defun yas--snippet-map-markers (fun snippet) - "Apply FUN to all marker (sub)fields in SNIPPET. -Update each field with the result of calling FUN." - (dolist (field (yas--snippet-fields snippet)) - (setf (yas--field-start field) (funcall fun (yas--field-start field))) - (setf (yas--field-end field) (funcall fun (yas--field-end field))) - (dolist (mirror (yas--field-mirrors field)) - (setf (yas--mirror-start mirror) (funcall fun (yas--mirror-start mirror))) - (setf (yas--mirror-end mirror) (funcall fun (yas--mirror-end mirror))))) - (let ((snippet-exit (yas--snippet-exit snippet))) - (when snippet-exit - (setf (yas--exit-marker snippet-exit) - (funcall fun (yas--exit-marker snippet-exit)))))) - -(defun yas--snippet-live-p (snippet) - "Return non-nil if SNIPPET hasn't been committed." - (catch 'live - (yas--snippet-map-markers (lambda (m) - (if (markerp m) m - (throw 'live nil))) - snippet) - t)) - -(defun yas--apply-transform (field-or-mirror field &optional empty-on-nil-p) - "Calculate transformed string for FIELD-OR-MIRROR from FIELD. - -If there is no transform for ht field, return nil. - -If there is a transform but it returns nil, return the empty -string iff EMPTY-ON-NIL-P is true." - (let* ((yas-text (yas--field-text-for-display field)) - (yas-modified-p (yas--field-modified-p field)) - (transform (if (yas--mirror-p field-or-mirror) - (yas--mirror-transform field-or-mirror) - (yas--field-transform field-or-mirror))) - (start-point (if (yas--mirror-p field-or-mirror) - (yas--mirror-start field-or-mirror) - (yas--field-start field-or-mirror))) - (transformed (and transform - (save-excursion - (goto-char start-point) - (let ((ret (yas--eval-for-string transform))) - (or ret (and empty-on-nil-p ""))))))) - transformed)) - -(defsubst yas--replace-all (from to &optional text) - "Replace all occurrences from FROM to TO. - -With optional string TEXT do it in that string." - (if text - (replace-regexp-in-string (regexp-quote from) to text t t) - (goto-char (point-min)) - (while (search-forward from nil t) - (replace-match to t t text)))) - -(defun yas--snippet-find-field (snippet number) - (cl-find-if (lambda (field) - (eq number (yas--field-number field))) - (yas--snippet-fields snippet))) - -(defun yas--snippet-sort-fields (snippet) - "Sort the fields of SNIPPET in navigation order." - (setf (yas--snippet-fields snippet) - (sort (yas--snippet-fields snippet) - #'yas--snippet-field-compare))) - -(defun yas--snippet-field-compare (field1 field2) - "Compare FIELD1 and FIELD2. - -The field with a number is sorted first. If they both have a -number, compare through the number. If neither have, compare -through the field's start point" - (let ((n1 (yas--field-number field1)) - (n2 (yas--field-number field2))) - (if n1 - (if n2 - (or (zerop n2) (and (not (zerop n1)) - (< n1 n2))) - (not (zerop n1))) - (if n2 - (zerop n2) - (< (yas--field-start field1) - (yas--field-start field2)))))) - -(defun yas--field-probably-deleted-p (snippet field) - "Guess if SNIPPET's FIELD should be skipped." - (and - ;; field must be zero length - ;; - (zerop (- (yas--field-start field) (yas--field-end field))) - ;; field must have been modified - ;; - (yas--field-modified-p field) - ;; either: - (or - ;; 1) it's a nested field - ;; - (yas--field-parent-field field) - ;; 2) ends just before the snippet end - ;; - (and (eq field (car (last (yas--snippet-fields snippet)))) - (= (yas--field-start field) (overlay-end (yas--snippet-control-overlay snippet))))) - ;; the field numbered 0, just before the exit marker, should - ;; never be skipped - ;; - (not (and (yas--field-number field) - (zerop (yas--field-number field)))))) - -(defun yas-active-snippets (&optional beg end) - "Return a sorted list of active snippets. -The most recently-inserted snippets are returned first. - -Only snippets overlapping the region BEG ... END are returned. -Overlapping has the same meaning as described in `overlays-in'. -If END is omitted, it defaults to (1+ BEG). If BEG is omitted, -it defaults to point. A non-nil, non-buffer position BEG is -equivalent to a range covering the whole buffer." - (unless beg - (setq beg (point))) - (cond ((not (or (integerp beg) (markerp beg))) - (setq beg (point-min) end (point-max))) - ((not end) - (setq end (1+ beg)))) - (if (and (eq beg (point-min)) - (eq end (point-max))) - yas--active-snippets - ;; Note: don't use `mapcar' here, since it would allocate in - ;; proportion to the amount of overlays, even though the list of - ;; active snippets should be very small. - (let ((snippets nil)) - (dolist (ov (overlays-in beg end)) - (let ((snippet (overlay-get ov 'yas--snippet))) - ;; Snippets have multiple overlays, so check for dups. - (when (and snippet (not (memq snippet snippets))) - (push snippet snippets)))) - (cl-sort snippets #'>= :key #'yas--snippet-id)))) - -(define-obsolete-function-alias 'yas--snippets-at-point - 'yas-active-snippets "0.12") - -(defun yas-next-field-or-maybe-expand () - "Try to expand a snippet at a key before point. - -Otherwise delegate to `yas-next-field'." - (interactive) - (if yas-triggers-in-field - (let ((yas-fallback-behavior 'return-nil) - (active-field (overlay-get yas--active-field-overlay 'yas--field))) - (when active-field - (unless (yas-expand-from-trigger-key active-field) - (yas-next-field)))) - (yas-next-field))) - -(defun yas-next-field-will-exit-p (&optional arg) - "Return non-nil if (yas-next-field ARG) would exit the current snippet." - (let ((snippet (car (yas-active-snippets))) - (active (overlay-get yas--active-field-overlay 'yas--field))) - (when snippet - (not (yas--find-next-field arg snippet active))))) - -(defun yas--find-next-field (n snippet active) - "Return the Nth field after the ACTIVE one in SNIPPET." - (let ((live-fields (cl-remove-if - (lambda (field) - (and (not (eq field active)) - (yas--field-probably-deleted-p snippet field))) - (yas--snippet-fields snippet)))) - (nth (abs n) (memq active (if (>= n 0) live-fields (reverse live-fields)))))) - -(defun yas-next-field (&optional arg) - "Navigate to the ARGth next field. - -If there's none, exit the snippet." - (interactive) - (unless arg (setq arg 1)) - (let* ((active-field (overlay-get yas--active-field-overlay 'yas--field)) - (snippet (car (yas-active-snippets (yas--field-start active-field) - (yas--field-end active-field)))) - (target-field (yas--find-next-field arg snippet active-field))) - (yas--letenv (yas--snippet-expand-env snippet) - ;; Apply transform to active field. - (when active-field - (let ((yas-moving-away-p t)) - (when (yas--field-update-display active-field) - (yas--update-mirrors snippet)))) - ;; Now actually move... - (if target-field - (yas--move-to-field snippet target-field) - (yas-exit-snippet snippet))))) - -(defun yas--place-overlays (snippet field) - "Correctly place overlays for SNIPPET's FIELD." - (yas--make-move-field-protection-overlays snippet field) - ;; Only move active field overlays if this is field is from the - ;; innermost snippet. - (when (eq snippet (car (yas-active-snippets (1- (yas--field-start field)) - (1+ (yas--field-end field))))) - (yas--make-move-active-field-overlay snippet field))) - -(defun yas--move-to-field (snippet field) - "Update SNIPPET to move to field FIELD. - -Also create some protection overlays" - (goto-char (yas--field-start field)) - (yas--place-overlays snippet field) - (overlay-put yas--active-field-overlay 'yas--snippet snippet) - (overlay-put yas--active-field-overlay 'yas--field field) - (let ((number (yas--field-number field))) - ;; check for the special ${0: ...} field - (if (and number (zerop number)) - (progn - (set-mark (yas--field-end field)) - (setf (yas--snippet-force-exit snippet) - (or (yas--field-transform field) - t))) - ;; make this field active - (setf (yas--snippet-active-field snippet) field) - ;; primary field transform: first call to snippet transform - (unless (yas--field-modified-p field) - (if (yas--field-update-display field) - (yas--update-mirrors snippet) - (setf (yas--field-modified-p field) nil)))))) - -(defun yas-prev-field () - "Navigate to prev field. If there's none, exit the snippet." - (interactive) - (yas-next-field -1)) - -(defun yas-abort-snippet (&optional snippet) - (interactive) - (let ((snippet (or snippet - (car (yas-active-snippets))))) - (when snippet - (setf (yas--snippet-force-exit snippet) t)))) - -(defun yas-exit-snippet (snippet) - "Goto exit-marker of SNIPPET." - (interactive (list (cl-first (yas-active-snippets)))) - (when snippet - (setf (yas--snippet-force-exit snippet) t) - (goto-char (if (yas--snippet-exit snippet) - (yas--exit-marker (yas--snippet-exit snippet)) - (overlay-end (yas--snippet-control-overlay snippet)))))) - -(defun yas-exit-all-snippets () - "Exit all snippets." - (interactive) - (mapc #'(lambda (snippet) - (yas-exit-snippet snippet) - (yas--check-commit-snippet)) - (yas-active-snippets 'all))) - - -;;; Some low level snippet-routines: - -(defvar yas--inhibit-overlay-hooks nil - "Bind this temporarily to non-nil to prevent running `yas--on-*-modification'.") - -(defvar yas-snippet-beg nil "Beginning position of the last snippet committed.") -(defvar yas-snippet-end nil "End position of the last snippet committed.") - -(defun yas--commit-snippet (snippet) - "Commit SNIPPET, but leave point as it is. - -This renders the snippet as ordinary text." - - (let ((control-overlay (yas--snippet-control-overlay snippet))) - ;; - ;; Save the end of the moribund snippet in case we need to revive it - ;; its original expansion. - ;; - (when (and control-overlay - (overlay-buffer control-overlay)) - (setq yas-snippet-beg (overlay-start control-overlay)) - (setq yas-snippet-end (overlay-end control-overlay)) - (delete-overlay control-overlay) - (setf (yas--snippet-control-overlay snippet) nil)) - - (let ((yas--inhibit-overlay-hooks t)) - (when yas--active-field-overlay - (delete-overlay yas--active-field-overlay)) - (when yas--field-protection-overlays - (mapc #'delete-overlay yas--field-protection-overlays))) - - ;; stacked expansion: if the original expansion took place from a - ;; field, make sure we advance it here at least to - ;; `yas-snippet-end'... - ;; - (let ((previous-field (yas--snippet-previous-active-field snippet))) - (when (and yas-snippet-end previous-field) - (yas--advance-end-maybe-previous-fields - previous-field yas-snippet-end (cdr yas--active-snippets)))) - - ;; Convert all markers to points, - ;; - (yas--markers-to-points snippet) - - ;; It's no longer an active snippet. - (cl-callf2 delq snippet yas--active-snippets) - - ;; Take care of snippet revival on undo. - (if (and yas-snippet-revival (listp buffer-undo-list)) - (push `(apply yas--snippet-revive ,yas-snippet-beg ,yas-snippet-end ,snippet) - buffer-undo-list) - ;; Dismember the snippet... this is useful if we get called - ;; again from `yas--take-care-of-redo'.... - (setf (yas--snippet-fields snippet) nil))) - - (yas--message 4 "Snippet %s exited." (yas--snippet-id snippet))) - -(defvar yas--snippets-to-move nil) -(make-variable-buffer-local 'yas--snippets-to-move) - -(defun yas--prepare-snippets-for-move (beg end buf pos) - "Gather snippets in BEG..END for moving to POS in BUF." - (let ((to-move nil) - (snippets (yas-active-snippets beg end)) - (dst-base-line (with-current-buffer buf - (count-lines (point-min) pos)))) - (when snippets - (dolist (snippet snippets) - (yas--snippet-map-markers - (lambda (m) - (prog1 (cons m (yas--snapshot-line-location m)) - (set-marker m nil))) - snippet) - (let ((ctrl-ov (yas--snapshot-overlay-line-location - (yas--snippet-control-overlay snippet)))) - (push (list ctrl-ov dst-base-line snippet) to-move) - (delete-overlay (car ctrl-ov)))) - (with-current-buffer buf - (cl-callf2 nconc to-move yas--snippets-to-move))))) - -(defun yas--on-buffer-kill () - ;; Org mode uses temp buffers for fontification and "native tab", - ;; move all the snippets to the original org-mode buffer when it's - ;; killed. - (let ((org-marker nil) - (org-buffer nil)) - (when (and yas-minor-mode - (or (bound-and-true-p org-edit-src-from-org-mode) - (bound-and-true-p org-src--from-org-mode)) - (markerp - (setq org-marker - (or (bound-and-true-p org-edit-src-beg-marker) - (bound-and-true-p org-src--beg-marker)))) - ;; If the org source buffer is killed before the temp - ;; fontification one, org-marker might point nowhere. - (setq org-buffer (marker-buffer org-marker))) - (yas--prepare-snippets-for-move - (point-min) (point-max) - org-buffer org-marker)))) - -(add-hook 'kill-buffer-hook #'yas--on-buffer-kill) - -(defun yas--finish-moving-snippets () - "Finish job started in `yas--prepare-snippets-for-move'." - (cl-loop for (ctrl-ov base-line snippet) in yas--snippets-to-move - for base-pos = (progn (goto-char (point-min)) - (forward-line base-line) (point)) - do (yas--snippet-map-markers - (lambda (saved-location) - (let ((m (pop saved-location))) - (set-marker m (yas--goto-saved-line-location - base-pos saved-location)) - m)) - snippet) - (goto-char base-pos) - (yas--restore-overlay-line-location base-pos ctrl-ov) - (yas--maybe-move-to-active-field snippet) - (push snippet yas--active-snippets)) - (setq yas--snippets-to-move nil)) - -(defun yas--safely-call-fun (fun) - "Call FUN and catch any errors." - (condition-case error - (funcall fun) - ((debug error) - (yas--message 2 "Error running %s: %s" fun - (error-message-string error))))) - -(defun yas--safely-run-hook (hook) - "Call HOOK's functions. -HOOK should be a symbol, a hook variable, as in `run-hooks'." - (let ((debug-on-error (and (not (memq yas-good-grace '(t hooks))) - debug-on-error))) - (yas--safely-call-fun (apply-partially #'run-hooks hook)))) - -(defun yas--check-commit-snippet () - "Check if point exited the currently active field of the snippet. - -If so cleans up the whole snippet up." - (let* ((snippet-exit-transform nil) - (exited-snippets-p nil) - ;; Record the custom snippet `yas-after-exit-snippet-hook' - ;; set in the expand-env field. - (snippet-exit-hook yas-after-exit-snippet-hook)) - (dolist (snippet yas--active-snippets) - (let ((active-field (yas--snippet-active-field snippet))) - (yas--letenv (yas--snippet-expand-env snippet) - ;; Note: the `force-exit' field could be a transform in case of - ;; ${0: ...}, see `yas--move-to-field'. - (setq snippet-exit-transform (yas--snippet-force-exit snippet)) - (cond ((or snippet-exit-transform - (not (and active-field (yas--field-contains-point-p active-field)))) - (setf (yas--snippet-force-exit snippet) nil) - (setq snippet-exit-hook yas-after-exit-snippet-hook) - (yas--commit-snippet snippet) - (setq exited-snippets-p t)) - ((and active-field - (or (not yas--active-field-overlay) - (not (overlay-buffer yas--active-field-overlay)))) - ;; - ;; stacked expansion: this case is mainly for recent - ;; snippet exits that place us back int the field of - ;; another snippet - ;; - (save-excursion - (yas--move-to-field snippet active-field) - (yas--update-mirrors snippet))) - (t - nil))))) - (unless (or yas--active-snippets (not exited-snippets-p)) - (when snippet-exit-transform - (yas--eval-for-effect snippet-exit-transform)) - (let ((yas-after-exit-snippet-hook snippet-exit-hook)) - (yas--safely-run-hook 'yas-after-exit-snippet-hook))))) - -;; Apropos markers-to-points: -;; -;; This was found useful for performance reasons, so that an excessive -;; number of live markers aren't kept around in the -;; `buffer-undo-list'. We don't reuse the original marker object -;; because that leaves an unreadable object in the history list and -;; undo-tree persistence has trouble with that. -;; -;; This shouldn't bring horrible problems with undo/redo, but you -;; never know. -;; -(defun yas--markers-to-points (snippet) - "Save all markers of SNIPPET as positions." - (yas--snippet-map-markers (lambda (m) - (prog1 (marker-position m) - (set-marker m nil))) - snippet)) - -(defun yas--points-to-markers (snippet) - "Restore SNIPPET's marker positions, saved by `yas--markers-to-points'." - (yas--snippet-map-markers #'copy-marker snippet)) - -(defun yas--maybe-move-to-active-field (snippet) - "Try to move to SNIPPET's active (or first) field and return it if found." - (let ((target-field (or (yas--snippet-active-field snippet) - (car (yas--snippet-fields snippet))))) - (when target-field - (yas--move-to-field snippet target-field) - target-field))) - -(defun yas--field-contains-point-p (field &optional point) - (let ((point (or point - (point)))) - (and (>= point (yas--field-start field)) - (<= point (yas--field-end field))))) - -(defun yas--field-text-for-display (field) - "Return the propertized display text for field FIELD." - (buffer-substring (yas--field-start field) (yas--field-end field))) - -(defun yas--undo-in-progress () - "True if some kind of undo is in progress." - (or undo-in-progress - (eq this-command 'undo) - (eq this-command 'redo))) - -(defun yas--make-control-overlay (snippet start end) - "Create the control overlay that surrounds the snippet and -holds the keymap." - (let ((overlay (make-overlay start - end - nil - nil - t))) - (overlay-put overlay 'keymap yas-keymap) - (overlay-put overlay 'priority yas-overlay-priority) - (overlay-put overlay 'yas--snippet snippet) - overlay)) - -(defun yas-current-field () - "Return the currently active field." - (and yas--active-field-overlay - (overlay-buffer yas--active-field-overlay) - (overlay-get yas--active-field-overlay 'yas--field))) - -(defun yas--maybe-clear-field-filter (cmd) - "Return CMD if at start of unmodified snippet field. -Use as a `:filter' argument for a conditional keybinding." - (let ((field (yas-current-field))) - (when (and field - (not (yas--field-modified-p field)) - (eq (point) (marker-position (yas--field-start field)))) - cmd))) - -(defun yas-skip-and-clear-field (&optional field) - "Clears unmodified FIELD if at field start, skips to next tab." - (interactive) - (yas--skip-and-clear (or field (yas-current-field))) - (yas-next-field 1)) - -(defun yas-clear-field (&optional field) - "Clears unmodified FIELD if at field start." - (interactive) - (yas--skip-and-clear (or field (yas-current-field)))) - -(defun yas-skip-and-clear-or-delete-char (&optional field) - "Clears unmodified field if at field start, skips to next tab. - -Otherwise deletes a character normally by calling `delete-char'." - (interactive) - (declare (obsolete "Bind to `yas-maybe-skip-and-clear-field' instead." "0.13")) - (cond ((yas--maybe-clear-field-filter t) - (yas--skip-and-clear (or field (yas-current-field))) - (yas-next-field 1)) - (t (call-interactively 'delete-char)))) - -(defun yas--skip-and-clear (field &optional from) - "Deletes the region of FIELD and sets it's modified state to t. -If given, FROM indicates position to start at instead of FIELD's beginning." - ;; Just before skipping-and-clearing the field, mark its children - ;; fields as modified, too. If the children have mirrors-in-fields - ;; this prevents them from updating erroneously (we're skipping and - ;; deleting!). - ;; - (yas--mark-this-and-children-modified field) - (unless (= (yas--field-start field) (yas--field-end field)) - (delete-region (or from (yas--field-start field)) (yas--field-end field)))) - -(defun yas--mark-this-and-children-modified (field) - (setf (yas--field-modified-p field) t) - (let ((fom (yas--field-next field))) - (while (and fom - (yas--fom-parent-field fom)) - (when (and (eq (yas--fom-parent-field fom) field) - (yas--field-p fom)) - (yas--mark-this-and-children-modified fom)) - (setq fom (yas--fom-next fom))))) - -(defun yas--make-move-active-field-overlay (snippet field) - "Place the active field overlay in SNIPPET's FIELD. - -Move the overlay, or create it if it does not exit." - (if (and yas--active-field-overlay - (overlay-buffer yas--active-field-overlay)) - (move-overlay yas--active-field-overlay - (yas--field-start field) - (yas--field-end field)) - (setq yas--active-field-overlay - (make-overlay (yas--field-start field) - (yas--field-end field) - nil nil t)) - (overlay-put yas--active-field-overlay 'priority yas-overlay-priority) - (overlay-put yas--active-field-overlay 'face 'yas-field-highlight-face) - (overlay-put yas--active-field-overlay 'yas--snippet snippet) - (overlay-put yas--active-field-overlay 'modification-hooks '(yas--on-field-overlay-modification)) - (overlay-put yas--active-field-overlay 'insert-in-front-hooks - '(yas--on-field-overlay-modification)) - (overlay-put yas--active-field-overlay 'insert-behind-hooks - '(yas--on-field-overlay-modification)))) - -(defun yas--skip-and-clear-field-p (field beg _end length) - "Tell if newly modified FIELD should be cleared and skipped. -BEG, END and LENGTH like overlay modification hooks." - (and (= length 0) ; A 0 pre-change length indicates insertion. - (= beg (yas--field-start field)) ; Insertion at field start? - (not (yas--field-modified-p field)))) - - -(defun yas--merge-and-drop-dups (list1 list2 cmp key) - ;; `delete-consecutive-dups' + `cl-merge'. - (funcall (if (fboundp 'delete-consecutive-dups) - #'delete-consecutive-dups ; 24.4 - #'delete-dups) - (cl-merge 'list list1 list2 cmp :key key))) - -(defvar yas--before-change-modified-snippets nil) -(make-variable-buffer-local 'yas--before-change-modified-snippets) - -(defun yas--gather-active-snippets (overlay beg end then-delete) - ;; Add active snippets in BEG..END into an OVERLAY keyed entry of - ;; `yas--before-change-modified-snippets'. Return accumulated list. - ;; If THEN-DELETE is non-nil, delete the entry. - (let ((new (yas-active-snippets beg end)) - (old (assq overlay yas--before-change-modified-snippets))) - (prog1 (cond ((and new old) - (setf (cdr old) - (yas--merge-and-drop-dups - (cdr old) new - ;; Sort like `yas-active-snippets'. - #'>= #'yas--snippet-id))) - (new (unless then-delete - ;; Don't add new entry if we're about to - ;; remove it anyway. - (push (cons overlay new) - yas--before-change-modified-snippets)) - new) - (old (cdr old)) - (t nil)) - (when then-delete - (cl-callf2 delq old yas--before-change-modified-snippets))))) - -(defvar yas--todo-snippet-indent nil nil) -(make-variable-buffer-local 'yas--todo-snippet-indent) - -(defun yas--on-field-overlay-modification (overlay after? beg end &optional length) - "Clears the field and updates mirrors, conditionally. - -Only clears the field if it hasn't been modified and point is at -field start. This hook does nothing if an undo is in progress." - (unless (or yas--inhibit-overlay-hooks - (not (overlayp yas--active-field-overlay)) ; Avoid Emacs bug #21824. - ;; If a single change hits multiple overlays of the same - ;; snippet, then we delete the snippet the first time, - ;; and then subsequent calls get a deleted overlay. - ;; Don't delete the snippet again! - (not (overlay-buffer overlay)) - (yas--undo-in-progress)) - (let* ((inhibit-modification-hooks nil) - (yas--inhibit-overlay-hooks t) - (field (overlay-get overlay 'yas--field)) - (snippet (overlay-get yas--active-field-overlay 'yas--snippet))) - (if (yas--snippet-live-p snippet) - (if after? - (save-match-data - (yas--letenv (yas--snippet-expand-env snippet) - (when (yas--skip-and-clear-field-p field beg end length) - ;; We delete text starting from the END of insertion. - (yas--skip-and-clear field end)) - (setf (yas--field-modified-p field) t) - ;; Adjust any pending active fields in case of stacked - ;; expansion. - (yas--advance-end-maybe-previous-fields - field (overlay-end overlay) - (yas--gather-active-snippets overlay beg end t)) - ;; Update fields now, but delay auto indentation until - ;; post-command. We don't want to run indentation on - ;; the intermediate state where field text might be - ;; removed (and hence the field could be deleted along - ;; with leading indentation). - (let ((yas-indent-line nil)) - (save-excursion - (yas--field-update-display field)) - (yas--update-mirrors snippet)) - (unless (or (not (eq yas-indent-line 'auto)) - (memq snippet yas--todo-snippet-indent)) - (push snippet yas--todo-snippet-indent)))) - ;; Remember active snippets to use for after the change. - (yas--gather-active-snippets overlay beg end nil)) - (lwarn '(yasnippet zombie) :warning "Killing zombie snippet!") - (delete-overlay overlay))))) - -(defun yas--do-todo-snippet-indent () - ;; Do pending indentation of snippet fields, called from - ;; `yas--post-command-handler'. - (when yas--todo-snippet-indent - (save-excursion - (cl-loop for snippet in yas--todo-snippet-indent - do (yas--indent-mirrors-of-snippet - snippet (yas--snippet-field-mirrors snippet))) - (setq yas--todo-snippet-indent nil)))) - -(defun yas--auto-fill () - ;; Preserve snippet markers during auto-fill. - (let* ((orig-point (point)) - (end (progn (forward-paragraph) (point))) - (beg (progn (backward-paragraph) (point))) - (snippets (yas-active-snippets beg end)) - (remarkers nil) - (reoverlays nil)) - (dolist (snippet snippets) - (dolist (m (yas--collect-snippet-markers snippet)) - (when (and (<= beg m) (<= m end)) - (push (cons m (yas--snapshot-location m beg end)) remarkers))) - (push (yas--snapshot-overlay-location - (yas--snippet-control-overlay snippet) beg end) - reoverlays)) - (goto-char orig-point) - (let ((yas--inhibit-overlay-hooks t)) - (if yas--original-auto-fill-function - (funcall yas--original-auto-fill-function) - ;; Shouldn't happen, gather more info about it (see #873/919). - (let ((yas--fill-fun-values `((t ,(default-value 'yas--original-auto-fill-function)))) - (fill-fun-values `((t ,(default-value 'auto-fill-function)))) - ;; Listing 2 buffers with the same value is enough - (print-length 3)) - (save-current-buffer - (dolist (buf (let ((bufs (buffer-list))) - ;; List the current buffer first. - (setq bufs (cons (current-buffer) - (remq (current-buffer) bufs))))) - (set-buffer buf) - (let* ((yf-cell (assq yas--original-auto-fill-function - yas--fill-fun-values)) - (af-cell (assq auto-fill-function fill-fun-values))) - (when (local-variable-p 'yas--original-auto-fill-function) - (if yf-cell (setcdr yf-cell (cons buf (cdr yf-cell))) - (push (list yas--original-auto-fill-function buf) yas--fill-fun-values))) - (when (local-variable-p 'auto-fill-function) - (if af-cell (setcdr af-cell (cons buf (cdr af-cell))) - (push (list auto-fill-function buf) fill-fun-values)))))) - (lwarn '(yasnippet auto-fill bug) :error - "`yas--original-auto-fill-function' unexpectedly nil in %S! Disabling auto-fill. - %S - `auto-fill-function': %S\n%s" - (current-buffer) yas--fill-fun-values fill-fun-values - (if (fboundp 'backtrace--print-frame) - (with-output-to-string - (mapc (lambda (frame) - (apply #'backtrace--print-frame frame)) - yas--watch-auto-fill-backtrace)) - "")) - ;; Try to avoid repeated triggering of this bug. - (auto-fill-mode -1) - ;; Don't pop up more than once in a session (still log though). - (defvar warning-suppress-types) ; `warnings' is autoloaded by `lwarn'. - (add-to-list 'warning-suppress-types '(yasnippet auto-fill bug))))) - (save-excursion - (setq end (progn (forward-paragraph) (point))) - (setq beg (progn (backward-paragraph) (point)))) - (save-excursion - (save-restriction - (narrow-to-region beg end) - (dolist (remarker remarkers) - (set-marker (car remarker) - (yas--goto-saved-location (cdr remarker)))) - (mapc #'yas--restore-overlay-location reoverlays)) - (mapc (lambda (snippet) - (yas--letenv (yas--snippet-expand-env snippet) - (yas--update-mirrors snippet))) - snippets)))) - - -;;; Apropos protection overlays: -;; -;; These exist for nasty users who will try to delete parts of the -;; snippet outside the active field. Actual protection happens in -;; `yas--on-protection-overlay-modification'. -;; -;; As of github #537 this no longer inhibits the command by issuing an -;; error: all the snippets at point, including nested snippets, are -;; automatically commited and the current command can proceed. -;; -(defun yas--make-move-field-protection-overlays (snippet field) - "Place protection overlays surrounding SNIPPET's FIELD. - -Move the overlays, or create them if they do not exit." - (let ((start (yas--field-start field)) - (end (yas--field-end field))) - ;; First check if the (1+ end) is contained in the buffer, - ;; otherwise we'll have to do a bit of cheating and silently - ;; insert a newline. the `(1+ (buffer-size))' should prevent this - ;; when using stacked expansion - ;; - (when (< (buffer-size) end) - (save-excursion - (let ((yas--inhibit-overlay-hooks t)) - (goto-char (point-max)) - (newline)))) - ;; go on to normal overlay creation/moving - ;; - (cond ((and yas--field-protection-overlays - (cl-every #'overlay-buffer yas--field-protection-overlays)) - (move-overlay (nth 0 yas--field-protection-overlays) - (1- start) start) - (move-overlay (nth 1 yas--field-protection-overlays) end (1+ end))) - (t - (setq yas--field-protection-overlays - (list (make-overlay (1- start) start nil t nil) - (make-overlay end (1+ end) nil t nil))) - (dolist (ov yas--field-protection-overlays) - (overlay-put ov 'face 'yas--field-debug-face) - (overlay-put ov 'yas--snippet snippet) - ;; (overlay-put ov 'evaporate t) - (overlay-put ov 'modification-hooks '(yas--on-protection-overlay-modification))))))) - -(defun yas--on-protection-overlay-modification (_overlay after? beg end &optional length) - "Commit the snippet if the protection overlay is being killed." - (unless (or yas--inhibit-overlay-hooks - yas-inhibit-overlay-modification-protection - (not after?) - (= length (- end beg)) ; deletion or insertion - (yas--undo-in-progress)) - (let ((snippets (yas-active-snippets))) - (yas--message 2 "Committing snippets. Action would destroy a protection overlay.") - (cl-loop for snippet in snippets - do (yas--commit-snippet snippet))))) - -(add-to-list 'debug-ignored-errors "^Exit the snippet first!$") - - -;;; Snippet expansion and "stacked" expansion: -;; -;; Stacked expansion is when you try to expand a snippet when already -;; inside a snippet expansion. -;; -;; The parent snippet does not run its fields modification hooks -;; (`yas--on-field-overlay-modification' and -;; `yas--on-protection-overlay-modification') while the child snippet -;; is active. This means, among other things, that the mirrors of the -;; parent snippet are not updated, this only happening when one exits -;; the child snippet. -;; -;; Unfortunately, this also puts some ugly (and not fully-tested) -;; bits of code in `yas-expand-snippet' and -;; `yas--commit-snippet'. I've tried to mark them with "stacked -;; expansion:". -;; -;; This was thought to be safer in an undo/redo perspective, but -;; maybe the correct implementation is to make the globals -;; `yas--active-field-overlay' and `yas--field-protection-overlays' be -;; snippet-local and be active even while the child snippet is -;; running. This would mean a lot of overlay modification hooks -;; running, but if managed correctly (including overlay priorities) -;; they should account for all situations... - -(defun yas-expand-snippet (snippet &optional start end expand-env) - "Expand SNIPPET at current point. - -Text between START and END will be deleted before inserting -template. EXPAND-ENV is a list of (SYM VALUE) let-style dynamic -bindings considered when expanding the snippet. If omitted, use -SNIPPET's expand-env field. - -SNIPPET may be a snippet structure (e.g., as returned by -`yas-lookup-snippet'), or just a snippet body (which is a string -for normal snippets, and a list for command snippets)." - (cl-assert (and yas-minor-mode - (memq 'yas--post-command-handler post-command-hook)) - nil - "[yas] `yas-expand-snippet' needs properly setup `yas-minor-mode'") - (run-hooks 'yas-before-expand-snippet-hook) - - (let* ((clear-field - (let ((field (and yas--active-field-overlay - (overlay-buffer yas--active-field-overlay) - (overlay-get yas--active-field-overlay 'yas--field)))) - (and field (yas--skip-and-clear-field-p - field (point) (point) 0) - field))) - (start (cond (start) - ((region-active-p) - (region-beginning)) - (clear-field - (yas--field-start clear-field)) - (t (point)))) - (end (cond (end) - ((region-active-p) - (region-end)) - (clear-field - (yas--field-end clear-field)) - (t (point)))) - (to-delete (and (> end start) - (buffer-substring-no-properties start end))) - (yas-selected-text - (cond (yas-selected-text) - ((and (region-active-p) - (not clear-field)) - to-delete)))) - (goto-char start) - (setq yas--indent-original-column (current-column)) - ;; Delete the region to delete, this *does* get undo-recorded. - (when to-delete - (delete-region start end)) - - (let ((content (if (yas--template-p snippet) - (yas--template-content snippet) - snippet))) - (when (and (not expand-env) (yas--template-p snippet)) - (setq expand-env (yas--template-expand-env snippet))) - (cond ((listp content) - ;; x) This is a snippet-command. - (yas--eval-for-effect content)) - (t - ;; x) This is a snippet-snippet :-) - (setq yas--start-column (current-column)) - ;; Stacked expansion: also shoosh the overlay modification hooks. - (let ((yas--inhibit-overlay-hooks t)) - (setq snippet - (yas--snippet-create content expand-env start (point)))) - - ;; Stacked-expansion: This checks for stacked expansion, save the - ;; `yas--previous-active-field' and advance its boundary. - (let ((existing-field (and yas--active-field-overlay - (overlay-buffer yas--active-field-overlay) - (overlay-get yas--active-field-overlay 'yas--field)))) - (when existing-field - (setf (yas--snippet-previous-active-field snippet) existing-field) - (yas--advance-end-maybe-previous-fields - existing-field (overlay-end yas--active-field-overlay) - (cdr yas--active-snippets)))) - - ;; Exit the snippet immediately if no fields. - (unless (yas--snippet-fields snippet) - (yas-exit-snippet snippet)) - - ;; Now, schedule a move to the first field. - (let ((first-field (car (yas--snippet-fields snippet)))) - (when first-field - (sit-for 0) ;; fix issue 125 - (yas--letenv (yas--snippet-expand-env snippet) - (yas--move-to-field snippet first-field)) - (when (and (eq (yas--field-number first-field) 0) - (> (length (yas--field-text-for-display - first-field)) - 0)) - ;; Keep region for ${0:exit text}. - (setq deactivate-mark nil)))) - (yas--message 4 "snippet %d expanded." (yas--snippet-id snippet)) - t))))) - -(defun yas--take-care-of-redo (snippet) - "Commits SNIPPET, which in turn pushes an undo action for reviving it. - -Meant to exit in the `buffer-undo-list'." - ;; slightly optimize: this action is only needed for snippets with - ;; at least one field - (when (yas--snippet-fields snippet) - (yas--commit-snippet snippet))) - -(defun yas--snippet-revive (beg end snippet) - "Revives SNIPPET and creates a control overlay from BEG to END. - -BEG and END are, we hope, the original snippets boundaries. -All the markers/points exiting existing inside SNIPPET should point -to their correct locations *at the time the snippet is revived*. - -After revival, push the `yas--take-care-of-redo' in the -`buffer-undo-list'" - ;; Reconvert all the points to markers - (yas--points-to-markers snippet) - ;; When at least one editable field existed in the zombie snippet, - ;; try to revive the whole thing... - (when (yas--maybe-move-to-active-field snippet) - (setf (yas--snippet-control-overlay snippet) (yas--make-control-overlay snippet beg end)) - (overlay-put (yas--snippet-control-overlay snippet) 'yas--snippet snippet) - (push snippet yas--active-snippets) - (when (listp buffer-undo-list) - (push `(apply yas--take-care-of-redo ,snippet) - buffer-undo-list)))) - -(defun yas--snippet-create (content expand-env begin end) - "Create a snippet from a template inserted at BEGIN to END. - -Returns the newly created snippet." - (save-restriction - (let ((snippet (yas--make-snippet expand-env))) - (yas--letenv expand-env - ;; Put a single undo action for the expanded snippet's - ;; content. - (let ((buffer-undo-list t)) - (goto-char begin) - ;; Call before and after change functions manually, - ;; otherwise cc-mode's cache can get messed up. Don't use - ;; `inhibit-modification-hooks' for that, that blocks - ;; overlay and text property hooks as well! FIXME: Maybe - ;; use `combine-change-calls'? (Requires Emacs 27+ though.) - (run-hook-with-args 'before-change-functions begin end) - (let ((before-change-functions nil) - (after-change-functions nil)) - ;; Some versions of cc-mode (might be the one with Emacs - ;; 24.3 only) fail when inserting snippet content in a - ;; narrowed buffer, so make sure to insert before - ;; narrowing. - (insert content) - (narrow-to-region begin (point)) - (goto-char (point-min)) - (yas--snippet-parse-create snippet)) - (run-hook-with-args 'after-change-functions - (point-min) (point-max) - (- (point-max) (point-min)))) - (when (listp buffer-undo-list) - (push (cons (point-min) (point-max)) - buffer-undo-list)) - - ;; Indent, collecting undo information normally. - (yas--indent snippet) - - ;; Follow up with `yas--take-care-of-redo' on the newly - ;; inserted snippet boundaries. - (when (listp buffer-undo-list) - (push `(apply yas--take-care-of-redo ,snippet) - buffer-undo-list)) - - ;; Sort and link each field - (yas--snippet-sort-fields snippet) - - ;; Create keymap overlay for snippet - (setf (yas--snippet-control-overlay snippet) - (yas--make-control-overlay snippet (point-min) (point-max))) - - ;; Move to end - (goto-char (point-max)) - - (push snippet yas--active-snippets) - snippet)))) - - -;;; Apropos adjacencies and "fom's": -;; -;; Once the $-constructs bits like "$n" and "${:n" are deleted in the -;; recently expanded snippet, we might actually have many fields, -;; mirrors (and the snippet exit) in the very same position in the -;; buffer. Therefore we need to single-link the -;; fields-or-mirrors-or-exit (which I have abbreviated to "fom") -;; according to their original positions in the buffer. -;; -;; Then we have operation `yas--advance-end-maybe' and -;; `yas--advance-start-maybe', which conditionally push the starts and -;; ends of these foms down the chain. -;; -;; This allows for like the printf with the magic ",": -;; -;; printf ("${1:%s}\\n"${1:$(if (string-match "%" text) "," "\);")} \ -;; $2${1:$(if (string-match "%" text) "\);" "")}$0 -;; -(defun yas--fom-start (fom) - (cond ((yas--field-p fom) - (yas--field-start fom)) - ((yas--mirror-p fom) - (yas--mirror-start fom)) - (t - (yas--exit-marker fom)))) - -(defun yas--fom-end (fom) - (cond ((yas--field-p fom) - (yas--field-end fom)) - ((yas--mirror-p fom) - (yas--mirror-end fom)) - (t - (yas--exit-marker fom)))) - -(defun yas--fom-next (fom) - (cond ((yas--field-p fom) - (yas--field-next fom)) - ((yas--mirror-p fom) - (yas--mirror-next fom)) - (t - (yas--exit-next fom)))) - -(defun yas--fom-parent-field (fom) - (cond ((yas--field-p fom) - (yas--field-parent-field fom)) - ((yas--mirror-p fom) - (yas--mirror-parent-field fom)) - (t - nil))) - -(defun yas--calculate-adjacencies (snippet) - "Calculate adjacencies for fields or mirrors of SNIPPET. - -This is according to their relative positions in the buffer, and -has to be called before the $-constructs are deleted." - (let* ((fom-set-next-fom - (lambda (fom nextfom) - (cond ((yas--field-p fom) - (setf (yas--field-next fom) nextfom)) - ((yas--mirror-p fom) - (setf (yas--mirror-next fom) nextfom)) - (t - (setf (yas--exit-next fom) nextfom))))) - (compare-fom-begs - (lambda (fom1 fom2) - (if (= (yas--fom-start fom2) (yas--fom-start fom1)) - (yas--mirror-p fom2) - (>= (yas--fom-start fom2) (yas--fom-start fom1))))) - (link-foms fom-set-next-fom)) - ;; make some yas--field, yas--mirror and yas--exit soup - (let ((soup)) - (when (yas--snippet-exit snippet) - (push (yas--snippet-exit snippet) soup)) - (dolist (field (yas--snippet-fields snippet)) - (push field soup) - (dolist (mirror (yas--field-mirrors field)) - (push mirror soup))) - (setq soup - (sort soup compare-fom-begs)) - (when soup - (cl-reduce link-foms soup))))) - -(defun yas--calculate-simple-fom-parentage (snippet fom) - "Discover if FOM is parented by some field in SNIPPET. - -Use the tightest containing field if more than one field contains -the mirror. Intended to be called *before* the dollar-regions are -deleted." - (let ((min (point-min)) - (max (point-max))) - (dolist (field (remq fom (yas--snippet-fields snippet))) - (when (and (<= (yas--field-start field) (yas--fom-start fom)) - (<= (yas--fom-end fom) (yas--field-end field)) - (< min (yas--field-start field)) - (< (yas--field-end field) max)) - (setq min (yas--field-start field) - max (yas--field-end field)) - (cond ((yas--field-p fom) - (setf (yas--field-parent-field fom) field)) - ((yas--mirror-p fom) - (setf (yas--mirror-parent-field fom) field)) - (t ; it's an exit, so noop - nil )))))) - -(defun yas--advance-end-maybe (fom newend) - "Maybe advance FOM's end to NEWEND if it needs it. - -If it does, also: - -* call `yas--advance-start-maybe' on FOM's next fom. - -* in case FOM is field call `yas--advance-end-maybe' on its parent - field - -Also, if FOM is an exit-marker, always call -`yas--advance-start-maybe' on its next fom. This is because -exit-marker have identical start and end markers." - (cond ((and fom (< (yas--fom-end fom) newend)) - (set-marker (yas--fom-end fom) newend) - (yas--advance-start-maybe (yas--fom-next fom) newend) - (yas--advance-end-of-parents-maybe (yas--fom-parent-field fom) newend)) - ((yas--exit-p fom) - (yas--advance-start-maybe (yas--fom-next fom) newend)))) - -(defun yas--advance-end-maybe-previous-fields (field end snippets) - "Call `yas--advance-end-maybe' on FIELD, and previous fields on SNIPPETS." - (dolist (snippet snippets) - (cl-assert (memq field (yas--snippet-fields snippet))) - (yas--advance-end-maybe field end) - (setq field (yas--snippet-previous-active-field snippet)))) - -(defun yas--advance-start-maybe (fom newstart) - "Maybe advance FOM's start to NEWSTART if it needs it. - -If it does, also call `yas--advance-end-maybe' on FOM." - (when (and fom (< (yas--fom-start fom) newstart)) - (set-marker (yas--fom-start fom) newstart) - (yas--advance-end-maybe fom newstart))) - -(defun yas--advance-end-of-parents-maybe (field newend) - "Like `yas--advance-end-maybe' but for parent fields. - -Only works for fields and doesn't care about the start of the -next FOM. Works its way up recursively for parents of parents." - (when (and field - (< (yas--field-end field) newend)) - (set-marker (yas--field-end field) newend) - (yas--advance-end-of-parents-maybe (yas--field-parent-field field) newend))) - -(defvar yas--dollar-regions nil - "When expanding the snippet the \"parse-create\" functions add -cons cells to this var.") - -(defvar yas--indent-markers nil - "List of markers for manual indentation.") - -(defun yas--snippet-parse-create (snippet) - "Parse a recently inserted snippet template, creating all -necessary fields, mirrors and exit points. - -Meant to be called in a narrowed buffer, does various passes" - (let ((saved-quotes nil) - (parse-start (point))) - ;; Avoid major-mode's syntax propertizing function, since we - ;; change the syntax-table while calling `scan-sexps'. - (let ((syntax-propertize-function nil)) - (setq yas--dollar-regions nil) ; Reset the yas--dollar-regions. - (yas--protect-escapes nil '(?`)) ; Protect just the backquotes. - (goto-char parse-start) - (setq saved-quotes (yas--save-backquotes)) ; `expressions`. - (yas--protect-escapes) ; Protect escaped characters. - (goto-char parse-start) - (yas--indent-parse-create) ; Parse indent markers: `$>'. - (goto-char parse-start) - (yas--field-parse-create snippet) ; Parse fields with {}. - (goto-char parse-start) - (yas--simple-fom-create snippet) ; Parse simple mirrors & fields. - (goto-char parse-start) - (yas--transform-mirror-parse-create snippet) ; Parse mirror transforms. - ;; Invalidate any syntax-propertizing done while - ;; `syntax-propertize-function' was nil. - (syntax-ppss-flush-cache parse-start)) - ;; Set "next" links of fields & mirrors. - (yas--calculate-adjacencies snippet) - (yas--save-restriction-and-widen ; Delete $-constructs. - (yas--delete-regions yas--dollar-regions)) - ;; Make sure to do this insertion *after* deleting the dollar - ;; regions, otherwise we invalidate the calculated positions of - ;; all the fields following $0. - (let ((exit (yas--snippet-exit snippet))) - (goto-char (if exit (yas--exit-marker exit) (point-max)))) - (when (eq yas-wrap-around-region 'cua) - (setq yas-wrap-around-region ?0)) - (cond ((and yas-wrap-around-region yas-selected-text) - (insert yas-selected-text)) - ((and (characterp yas-wrap-around-region) - (get-register yas-wrap-around-region)) - (insert (prog1 (get-register yas-wrap-around-region) - (set-register yas-wrap-around-region nil))))) - (yas--restore-backquotes saved-quotes) ; Restore `expression` values. - (goto-char parse-start) - (yas--restore-escapes) ; Restore escapes. - (yas--update-mirrors snippet) ; Update mirrors for the first time. - (goto-char parse-start))) - -;; HACK: Some implementations of `indent-line-function' (called via -;; `indent-according-to-mode') delete text before they insert (like -;; cc-mode), some make complicated regexp replacements (looking at -;; you, org-mode). To find place where the marker "should" go after -;; indentation, we create a regexp based on what the line looks like -;; before, putting a capture group where the marker is. The regexp -;; matches any whitespace with [[:space:]]* to allow for the -;; indentation changing whitespace. Additionally, we try to preserve -;; the amount of whitespace *following* the marker, because -;; indentation generally affects whitespace at the beginning, not the -;; end. -;; -;; Two other cases where we apply a similar strategy: -;; -;; 1. Handling `auto-fill-mode', in this case we need to use the -;; current paragraph instead of line. -;; -;; 2. Moving snippets from an `org-src' temp buffer into the main org -;; buffer, in this case we need to count the relative line number -;; (because org may add indentation on each line making character -;; positions unreliable). -;; -;; Data formats: -;; (LOCATION) = (REGEXP WS-COUNT) -;; MARKER -> (MARKER . (LOCATION)) -;; OVERLAY -> (OVERLAY LOCATION-BEG LOCATION-END) -;; -;; For `org-src' temp buffer, add a line number to format: -;; (LINE-LOCATION) = (LINE . (LOCATION)) -;; MARKER@LINE -> (MARKER . (LINE-LOCATION)) -;; OVERLAY@LINE -> (OVERLAY LINE-LOCATION-BEG LINE-LOCATION-END) -;; -;; This is all best-effort heuristic stuff, but it should cover 99% of -;; use-cases. - -(defun yas--snapshot-location (position &optional beg end) - "Returns info for restoring POSITIONS's location after indent. -The returned value is a list of the form (REGEXP WS-COUNT). -POSITION may be either a marker or just a buffer position. The -REGEXP matches text between BEG..END which default to the current -line if omitted." - (goto-char position) - (unless beg (setq beg (line-beginning-position))) - (unless end (setq end (line-end-position))) - (let ((before (split-string (buffer-substring-no-properties beg position) - "[[:space:]\n]+" t)) - (after (split-string (buffer-substring-no-properties position end) - "[[:space:]\n]+" t))) - (list (concat "[[:space:]\n]*" - (mapconcat (lambda (s) - (if (eq s position) "\\(\\)" - (regexp-quote s))) - (nconc before (list position) after) - "[[:space:]\n]*")) - (progn (skip-chars-forward "[:space:]\n" end) - (- (point) position))))) - -(defun yas--snapshot-line-location (position &optional beg end) - "Like `yas--snapshot-location', but return also line number. -Returned format is (LINE REGEXP WS-COUNT)." - (goto-char position) - (cons (count-lines (point-min) (line-beginning-position)) - (yas--snapshot-location position beg end))) - -(defun yas--snapshot-overlay-location (overlay beg end) - "Like `yas--snapshot-location' for overlays. -The returned format is (OVERLAY (RE WS) (RE WS)). Either of -the (RE WS) lists may be nil if the start or end, respectively, -of the overlay is outside the range BEG .. END." - (let ((obeg (overlay-start overlay)) - (oend (overlay-end overlay))) - (list overlay - (when (and (<= beg obeg) (< obeg end)) - (yas--snapshot-location obeg beg end)) - (when (and (<= beg oend) (< oend end)) - (yas--snapshot-location oend beg end))))) - -(defun yas--snapshot-overlay-line-location (overlay) - "Return info for restoring OVERLAY's line based location. -The returned format is (OVERLAY (LINE RE WS) (LINE RE WS))." - (list overlay - (yas--snapshot-line-location (overlay-start overlay)) - (yas--snapshot-line-location (overlay-end overlay)))) - -(defun yas--goto-saved-location (re-count) - "Move to and return point saved by `yas--snapshot-location'. -Buffer must be narrowed to BEG..END used to create the snapshot info." - (let ((regexp (pop re-count)) - (ws-count (pop re-count))) - (goto-char (point-min)) - (if (not (looking-at regexp)) - (lwarn '(yasnippet re-marker) :warning - "Couldn't find: %S" regexp) - (goto-char (match-beginning 1)) - (skip-chars-forward "[:space:]\n") - (skip-chars-backward "[:space:]\n" (- (point) ws-count))) - (point))) - -(defun yas--restore-overlay-location (ov-locations) - "Restores marker based on info from `yas--snapshot-overlay-location'. -Buffer must be narrowed to BEG..END used to create the snapshot info." - (cl-destructuring-bind (overlay loc-beg loc-end) ov-locations - (move-overlay overlay - (if (not loc-beg) (overlay-start overlay) - (yas--goto-saved-location loc-beg)) - (if (not loc-end) (overlay-end overlay) - (yas--goto-saved-location loc-end))))) - -(defun yas--goto-saved-line-location (base-pos l-re-count) - "Move to and return point saved by `yas--snapshot-line-location'. -Additionally requires BASE-POS to tell where the line numbers are -relative to." - (goto-char base-pos) - (forward-line (pop l-re-count)) - (save-restriction - (narrow-to-region (line-beginning-position) - (line-end-position)) - (yas--goto-saved-location l-re-count))) - -(defun yas--restore-overlay-line-location (base-pos ov-locations) - "Restores marker based on info from `yas--snapshot-overlay-line-location'." - (cl-destructuring-bind (overlay beg-l-r-w end-l-r-w) - ov-locations - (move-overlay overlay - (yas--goto-saved-line-location base-pos beg-l-r-w) - (yas--goto-saved-line-location base-pos end-l-r-w)))) - -(defun yas--indent-region (from to snippet) - "Indent the lines between FROM and TO with `indent-according-to-mode'. -The SNIPPET's markers are preserved." - (save-excursion - (yas--save-restriction-and-widen - (let* ((snippet-markers (yas--collect-snippet-markers snippet)) - (to (set-marker (make-marker) to))) - (goto-char from) - (cl-loop for bol = (line-beginning-position) - for eol = (line-end-position) - if (or yas-also-indent-empty-lines - (/= bol eol)) - do - ;; Indent each non-empty line. - (let ((remarkers nil)) - (dolist (m snippet-markers) - (when (and (<= bol m) (<= m eol)) - (push (cons m (yas--snapshot-location m bol eol)) - remarkers))) - (unwind-protect - (progn (back-to-indentation) - (indent-according-to-mode)) - (save-restriction - (narrow-to-region bol (line-end-position)) - (dolist (remarker remarkers) - (set-marker (car remarker) - (yas--goto-saved-location (cdr remarker))))))) - while (and (zerop (forward-line 1)) - (< (point) to))))))) - -(defvar yas--indent-original-column nil) -(defun yas--indent (snippet) - ;; Indent lines that had indent markers (`$>') on them. - (save-excursion - (dolist (marker yas--indent-markers) - (unless (eq yas-indent-line 'auto) - (goto-char marker) - (yas--indent-region (line-beginning-position) - (line-end-position) - snippet)) - ;; Finished with this marker. - (set-marker marker nil)) - (setq yas--indent-markers nil)) - ;; Now do stuff for `fixed' and `auto'. - (save-excursion - ;; We need to be at end of line, so that `forward-line' will only - ;; report 0 if it actually moves over a newline. - (end-of-line) - (cond ((eq yas-indent-line 'fixed) - (when (= (forward-line 1) 0) - (let ((indent-line-function - (lambda () - ;; We need to be at beginning of line in order to - ;; indent existing whitespace correctly. - (beginning-of-line) - (indent-to-column yas--indent-original-column)))) - (yas--indent-region (line-beginning-position) - (point-max) - snippet)))) - ((eq yas-indent-line 'auto) - (when (or yas-also-auto-indent-first-line - (= (forward-line 1) 0)) - (yas--indent-region (line-beginning-position) - (point-max) - snippet)))))) - -(defun yas--collect-snippet-markers (snippet) - "Make a list of all the markers used by SNIPPET." - (let (markers) - (yas--snippet-map-markers (lambda (m) (push m markers) m) snippet) - markers)) - -(defun yas--escape-string (escaped) - (concat "YASESCAPE" (format "%d" escaped) "PROTECTGUARD")) - -(defun yas--protect-escapes (&optional text escaped) - "Protect all escaped characters with their numeric ASCII value. - -With optional string TEXT do it in string instead of buffer." - (let ((changed-text text) - (text-provided-p text)) - (mapc #'(lambda (escaped) - (setq changed-text - (yas--replace-all (concat "\\" (char-to-string escaped)) - (yas--escape-string escaped) - (when text-provided-p changed-text)))) - (or escaped yas--escaped-characters)) - changed-text)) - -(defun yas--restore-escapes (&optional text escaped) - "Restore all escaped characters from their numeric ASCII value. - -With optional string TEXT do it in string instead of the buffer." - (let ((changed-text text) - (text-provided-p text)) - (mapc #'(lambda (escaped) - (setq changed-text - (yas--replace-all (yas--escape-string escaped) - (char-to-string escaped) - (when text-provided-p changed-text)))) - (or escaped yas--escaped-characters)) - changed-text)) - -(defun yas--save-backquotes () - "Save all \"\\=`(lisp-expression)\\=`\"-style expressions. -Return a list of (MARKER . STRING) entires for each backquoted -Lisp expression." - (let* ((saved-quotes nil) - (yas--snippet-buffer (current-buffer)) - (yas--change-detected nil) - (detect-change (lambda (_beg _end) - (when (eq (current-buffer) yas--snippet-buffer) - (setq yas--change-detected t))))) - (while (re-search-forward yas--backquote-lisp-expression-regexp nil t) - (let ((current-string (match-string-no-properties 1)) transformed) - (yas--save-restriction-and-widen - (delete-region (match-beginning 0) (match-end 0))) - (let ((before-change-functions - (cons detect-change before-change-functions))) - (setq transformed (yas--eval-for-string (yas--read-lisp - (yas--restore-escapes - current-string '(?`)))))) - (goto-char (match-beginning 0)) - (when transformed - (let ((marker (make-marker))) - (yas--save-restriction-and-widen - (insert "Y") ;; quite horrendous, I love it :) - (set-marker marker (point)) - (insert "Y")) - (push (cons marker transformed) saved-quotes))))) - (when yas--change-detected - (lwarn '(yasnippet backquote-change) :warning - "`%s' modified buffer in a backquote expression. - To hide this warning, add (yasnippet backquote-change) to `warning-suppress-types'." - (if yas--current-template - (yas--template-name yas--current-template) - "Snippet"))) - saved-quotes)) - -(defun yas--restore-backquotes (saved-quotes) - "Replace markers in SAVED-QUOTES with their values. -SAVED-QUOTES is the in format returned by `yas--save-backquotes'." - (cl-loop for (marker . string) in saved-quotes do - (save-excursion - (goto-char marker) - (yas--save-restriction-and-widen - (delete-char -1) - (insert string) - (delete-char 1)) - (set-marker marker nil)))) - -(defun yas--scan-sexps (from count) - (ignore-errors - (save-match-data ; `scan-sexps' may modify match data. - ;; Parse using the syntax table corresponding to the yasnippet syntax. - (with-syntax-table (standard-syntax-table) - ;; And ignore syntax-table properties that may have been placed by the - ;; major mode since these aren't related to the yasnippet syntax. - (let ((parse-sexp-lookup-properties nil)) - (scan-sexps from count)))))) - -(defun yas--make-marker (pos) - "Create a marker at POS with nil `marker-insertion-type'." - (let ((marker (set-marker (make-marker) pos))) - (set-marker-insertion-type marker nil) - marker)) - -(defun yas--indent-parse-create () - "Parse the \"$>\" indentation markers just inserted." - (setq yas--indent-markers ()) - (while (search-forward "$>" nil t) - (delete-region (match-beginning 0) (match-end 0)) - ;; Mark the beginning of the line. - (push (yas--make-marker (line-beginning-position)) - yas--indent-markers)) - (setq yas--indent-markers (nreverse yas--indent-markers))) - -(defun yas--scan-for-field-end () - (while (progn (re-search-forward "\\${\\|}") - (when (eq (char-before) ?\{) - ;; Nested field. - (yas--scan-for-field-end)))) - (point)) - -(defun yas--field-parse-create (snippet &optional parent-field) - "Parse most field expressions in SNIPPET, except for the simple one \"$n\". - -The following count as a field: - -* \"${n: text}\", for a numbered field with default text, as long as N is not 0; - -* \"${n: text$(expression)}, the same with a Lisp expression; - this is caught with the curiously named `yas--multi-dollar-lisp-expression-regexp' - -* the same as above but unnumbered, (no N:) and number is calculated automatically. - -When multiple expressions are found, only the last one counts." - ;; - (save-excursion - (while (re-search-forward yas--field-regexp nil t) - (let* ((brace-scan (save-match-data - (goto-char (match-beginning 2)) - (yas--scan-for-field-end))) - ;; if the `brace-scan' didn't reach a brace, we have a - ;; snippet with invalid escaping, probably a closing - ;; brace escaped with two backslashes (github#979). But - ;; be lenient, because we can. - (real-match-end-0 (if (eq ?} (char-before brace-scan)) - brace-scan - (point))) - (number (and (match-string-no-properties 1) - (string-to-number (match-string-no-properties 1)))) - (brand-new-field (and real-match-end-0 - ;; break if on "$(" immediately - ;; after the ":", this will be - ;; caught as a mirror with - ;; transform later. - (not (string-match-p "\\`\\$[ \t\n]*(" - (match-string-no-properties 2))) - ;; allow ${0: some exit text} - ;; (not (and number (zerop number))) - (yas--make-field number - (yas--make-marker (match-beginning 2)) - (yas--make-marker (1- real-match-end-0)) - parent-field)))) - (when brand-new-field - (goto-char real-match-end-0) - (push (cons (1- real-match-end-0) real-match-end-0) - yas--dollar-regions) - (push (cons (match-beginning 0) (match-beginning 2)) - yas--dollar-regions) - (push brand-new-field (yas--snippet-fields snippet)) - (save-excursion - (save-restriction - (narrow-to-region (yas--field-start brand-new-field) (yas--field-end brand-new-field)) - (goto-char (point-min)) - (yas--field-parse-create snippet brand-new-field))))))) - ;; if we entered from a parent field, now search for the - ;; `yas--multi-dollar-lisp-expression-regexp'. This is used for - ;; primary field transformations - ;; - (when parent-field - (save-excursion - (while (re-search-forward yas--multi-dollar-lisp-expression-regexp nil t) - (let* ((real-match-end-1 (yas--scan-sexps (match-beginning 1) 1))) - ;; commit the primary field transformation if: - ;; - ;; 1. we don't find it in yas--dollar-regions (a subnested - ;; field) might have already caught it. - ;; - ;; 2. we really make sure we have either two '$' or some - ;; text and a '$' after the colon ':'. This is a FIXME: work - ;; my regular expressions and end these ugly hacks. - ;; - (when (and real-match-end-1 - (not (member (cons (match-beginning 0) - real-match-end-1) - yas--dollar-regions)) - (not (eq ?: - (char-before (1- (match-beginning 1)))))) - (let ((lisp-expression-string (buffer-substring-no-properties (match-beginning 1) - real-match-end-1))) - (setf (yas--field-transform parent-field) - (yas--read-lisp (yas--restore-escapes lisp-expression-string)))) - (push (cons (match-beginning 0) real-match-end-1) - yas--dollar-regions))))))) - -(defun yas--transform-mirror-parse-create (snippet) - "Parse the \"${n:$(lisp-expression)}\" mirror transformations in SNIPPET." - (while (re-search-forward yas--transform-mirror-regexp nil t) - (let* ((real-match-end-0 (yas--scan-sexps (1+ (match-beginning 0)) 1)) - (number (string-to-number (match-string-no-properties 1))) - (field (and number - (not (zerop number)) - (yas--snippet-find-field snippet number))) - (brand-new-mirror - (and real-match-end-0 - field - (yas--make-mirror (yas--make-marker (match-beginning 0)) - (yas--make-marker (match-beginning 0)) - (yas--read-lisp - (yas--restore-escapes - (buffer-substring-no-properties (match-beginning 2) - (1- real-match-end-0)))))))) - (when brand-new-mirror - (push brand-new-mirror - (yas--field-mirrors field)) - (yas--calculate-simple-fom-parentage snippet brand-new-mirror) - (push (cons (match-beginning 0) real-match-end-0) yas--dollar-regions))))) - -(defun yas--simple-fom-create (snippet) - "Parse the simple \"$n\" fields/mirrors/exitmarkers in SNIPPET." - (while (re-search-forward yas--simple-mirror-regexp nil t) - (let ((number (string-to-number (match-string-no-properties 1)))) - (cond ((zerop number) - (setf (yas--snippet-exit snippet) - (yas--make-exit (yas--make-marker (match-end 0)))) - (push (cons (match-beginning 0) (yas--exit-marker (yas--snippet-exit snippet))) - yas--dollar-regions)) - (t - (let ((field (yas--snippet-find-field snippet number)) - (fom)) - (if field - (push - (setq fom (yas--make-mirror - (yas--make-marker (match-beginning 0)) - (yas--make-marker (match-beginning 0)) - nil)) - (yas--field-mirrors field)) - (push - (setq fom (yas--make-field number - (yas--make-marker (match-beginning 0)) - (yas--make-marker (match-beginning 0)) - nil)) - (yas--snippet-fields snippet))) - (yas--calculate-simple-fom-parentage snippet fom)) - (push (cons (match-beginning 0) (match-end 0)) - yas--dollar-regions)))))) - -(defun yas--delete-regions (regions) - "Sort disjuct REGIONS by start point, then delete from the back." - (mapc #'(lambda (reg) - (delete-region (car reg) (cdr reg))) - (sort regions - #'(lambda (r1 r2) - (>= (car r1) (car r2)))))) - -(defun yas--calculate-mirror-depth (mirror &optional traversed) - (let* ((parent (yas--mirror-parent-field mirror)) - (parents-mirrors (and parent - (yas--field-mirrors parent)))) - (or (yas--mirror-depth mirror) - (setf (yas--mirror-depth mirror) - (cond ((memq mirror traversed) 0) - ((and parent parents-mirrors) - (1+ (cl-reduce - #'max parents-mirrors - :key (lambda (m) - (yas--calculate-mirror-depth - m (cons mirror traversed)))))) - (parent 1) - (t 0)))))) - -(defun yas--snippet-field-mirrors (snippet) - ;; Make a list of (FIELD . MIRROR). - (cl-sort - (cl-mapcan (lambda (field) - (mapcar (lambda (mirror) - (cons field mirror)) - (yas--field-mirrors field))) - (yas--snippet-fields snippet)) - ;; Then sort this list so that entries with mirrors with - ;; parent fields appear before. This was important for - ;; fixing #290, and also handles the case where a mirror in - ;; a field causes another mirror to need reupdating. - #'> :key (lambda (fm) (yas--calculate-mirror-depth (cdr fm))))) - -(defun yas--indent-mirrors-of-snippet (snippet &optional f-ms) - ;; Indent mirrors of SNIPPET. F-MS is the return value of - ;; (yas--snippet-field-mirrors SNIPPET). - (when (eq yas-indent-line 'auto) - (let ((yas--inhibit-overlay-hooks t)) - (cl-loop for (beg . end) in - (cl-sort (mapcar (lambda (f-m) - (let ((mirror (cdr f-m))) - (cons (yas--mirror-start mirror) - (yas--mirror-end mirror)))) - (or f-ms - (yas--snippet-field-mirrors snippet))) - #'< :key #'car) - do (yas--indent-region beg end snippet))))) - -(defun yas--update-mirrors (snippet) - "Update all the mirrors of SNIPPET." - (yas--save-restriction-and-widen - (save-excursion - (let ((f-ms (yas--snippet-field-mirrors snippet))) - (cl-loop - for (field . mirror) in f-ms - ;; Before updating a mirror with a parent-field, maybe advance - ;; its start (#290). - do (let ((parent-field (yas--mirror-parent-field mirror))) - (when parent-field - (yas--advance-start-maybe mirror (yas--fom-start parent-field)))) - ;; Update this mirror. - do (yas--mirror-update-display mirror field) - ;; `yas--place-overlays' is needed since the active field and - ;; protected overlays might have been changed because of insertions - ;; in `yas--mirror-update-display'. - do (let ((active-field (yas--snippet-active-field snippet))) - (when active-field (yas--place-overlays snippet active-field)))) - ;; Delay indenting until we're done all mirrors. We must do - ;; this to avoid losing whitespace between fields that are - ;; still empty (i.e., they will be non-empty after updating). - (yas--indent-mirrors-of-snippet snippet f-ms))))) - -(defun yas--mirror-update-display (mirror field) - "Update MIRROR according to FIELD (and mirror transform)." - - (let* ((mirror-parent-field (yas--mirror-parent-field mirror)) - (reflection (and (not (and mirror-parent-field - (yas--field-modified-p mirror-parent-field))) - (or (yas--apply-transform mirror field 'empty-on-nil) - (yas--field-text-for-display field))))) - (when (and reflection - (not (string= reflection (buffer-substring-no-properties (yas--mirror-start mirror) - (yas--mirror-end mirror))))) - (goto-char (yas--mirror-start mirror)) - (let ((yas--inhibit-overlay-hooks t)) - (insert reflection)) - (if (> (yas--mirror-end mirror) (point)) - (delete-region (point) (yas--mirror-end mirror)) - (set-marker (yas--mirror-end mirror) (point)) - (yas--advance-start-maybe (yas--mirror-next mirror) (point)) - ;; super-special advance - (yas--advance-end-of-parents-maybe mirror-parent-field (point)))))) - -(defun yas--field-update-display (field) - "Much like `yas--mirror-update-display', but for fields." - (when (yas--field-transform field) - (let ((transformed (and (not (eq (yas--field-number field) 0)) - (yas--apply-transform field field)))) - (when (and transformed - (not (string= transformed (buffer-substring-no-properties (yas--field-start field) - (yas--field-end field))))) - (setf (yas--field-modified-p field) t) - (goto-char (yas--field-start field)) - (let ((yas--inhibit-overlay-hooks t)) - (insert transformed) - (if (> (yas--field-end field) (point)) - (delete-region (point) (yas--field-end field)) - (set-marker (yas--field-end field) (point)) - (yas--advance-start-maybe (yas--field-next field) (point))) - t))))) - - -;;; Post-command hook: -;; -(defun yas--post-command-handler () - "Handles various yasnippet conditions after each command." - (when (and yas--watch-auto-fill-backtrace - (fboundp 'backtrace--print-frame) - (null yas--original-auto-fill-function) - (eq auto-fill-function 'yas--auto-fill)) - (lwarn '(yasnippet auto-fill bug) :error - "`yas--original-auto-fill-function' unexpectedly nil! Please report this backtrace\n%S" - (with-output-to-string - (mapc #'backtrace--print-frame - yas--watch-auto-fill-backtrace))) - ;; Don't pop up more than once in a session (still log though). - (defvar warning-suppress-types) ; `warnings' is autoloaded by `lwarn'. - (add-to-list 'warning-suppress-types '(yasnippet auto-fill bug))) - (yas--do-todo-snippet-indent) - (condition-case err - (progn (yas--finish-moving-snippets) - (cond ((eq 'undo this-command) - ;; - ;; After undo revival the correct field is sometimes not - ;; restored correctly, this condition handles that - ;; - (let* ((snippet (car (yas-active-snippets))) - (target-field - (and snippet - (cl-find-if-not - (lambda (field) - (yas--field-probably-deleted-p snippet field)) - (remq nil - (cons (yas--snippet-active-field snippet) - (yas--snippet-fields snippet))))))) - (when target-field - (yas--move-to-field snippet target-field)))) - ((not (yas--undo-in-progress)) - ;; When not in an undo, check if we must commit the snippet - ;; (user exited it). - (yas--check-commit-snippet)))) - ((debug error) (signal (car err) (cdr err))))) - -;;; Fancy docs: -;; -;; The docstrings for some functions are generated dynamically -;; depending on the context. -;; -(put 'yas-expand 'function-documentation - '(yas--expand-from-trigger-key-doc t)) -(defun yas--expand-from-trigger-key-doc (context) - "A doc synthesizer for `yas--expand-from-trigger-key-doc'." - (let* ((yas-fallback-behavior (and context yas-fallback-behavior)) - (fallback-description - (cond ((eq yas-fallback-behavior 'call-other-command) - (let* ((fallback (yas--keybinding-beyond-yasnippet))) - (or (and fallback - (format "call command `%s'." - (pp-to-string fallback))) - "do nothing (`yas-expand' doesn't override\nanything)."))) - ((eq yas-fallback-behavior 'return-nil) - "do nothing.") - (t "defer to `yas-fallback-behavior' (which see).")))) - (concat "Expand a snippet before point. If no snippet -expansion is possible, " - fallback-description - "\n\nOptional argument FIELD is for non-interactive use and is an -object satisfying `yas--field-p' to restrict the expansion to."))) - -(put 'yas-expand-from-keymap 'function-documentation - '(yas--expand-from-keymap-doc t)) -(defun yas--expand-from-keymap-doc (context) - "A doc synthesizer for `yas--expand-from-keymap-doc'." - (add-hook 'temp-buffer-show-hook #'yas--snippet-description-finish-runonce) - (concat "Expand/run snippets from keymaps, possibly falling back to original binding.\n" - (when (and context (eq this-command 'describe-key)) - (let* ((vec (this-single-command-keys)) - (templates (cl-mapcan (lambda (table) - (yas--fetch table vec)) - (yas--get-snippet-tables))) - (yas--direct-keymaps nil) - (fallback (key-binding vec))) - (concat "In this case, " - (when templates - (concat "these snippets are bound to this key:\n" - (yas--template-pretty-list templates) - "\n\nIf none of these expands, ")) - (or (and fallback - (format "fallback `%s' will be called." (pp-to-string fallback))) - "no fallback keybinding is called.")))))) - -(defun yas--template-pretty-list (templates) - (let ((acc) - (yas-buffer-local-condition 'always)) - (dolist (plate templates) - (setq acc (concat acc "\n*) " - (propertize (concat "\\\\snippet `" (car plate) "'") - 'yasnippet (cdr plate))))) - acc)) - -(define-button-type 'help-snippet-def - :supertype 'help-xref - 'help-function (lambda (template) (yas--visit-snippet-file-1 template)) - 'help-echo (purecopy "mouse-2, RET: find snippets's definition")) - -(defun yas--snippet-description-finish-runonce () - "Final adjustments for the help buffer when snippets are concerned." - (yas--create-snippet-xrefs) - (remove-hook 'temp-buffer-show-hook - #'yas--snippet-description-finish-runonce)) - -(defun yas--create-snippet-xrefs () - (save-excursion - (goto-char (point-min)) - (while (search-forward-regexp "\\\\\\\\snippet[ \s\t]+`\\([^']+\\)'" nil t) - (let ((template (get-text-property (match-beginning 1) - 'yasnippet))) - (when template - (help-xref-button 1 'help-snippet-def template) - (delete-region (match-end 1) (match-end 0)) - (delete-region (match-beginning 0) (match-beginning 1))))))) - -;;; Eldoc configuration. -(eldoc-add-command 'yas-next-field-or-maybe-expand - 'yas-next-field 'yas-prev-field - 'yas-expand 'yas-expand-from-keymap - 'yas-expand-from-trigger-key) - -;;; Utils - -(defvar yas-verbosity 3 - "Log level for `yas--message' 4 means trace most anything, 0 means nothing.") - -(defun yas--message (level message &rest args) - "When LEVEL is at or below `yas-verbosity', log MESSAGE and ARGS." - (when (>= yas-verbosity level) - (message "%s" (apply #'yas--format message args)))) - -(defun yas--warning (format-control &rest format-args) - (let ((msg (apply #'format format-control format-args))) - (display-warning 'yasnippet msg :warning) - (yas--message 1 msg))) - -(defun yas--format (format-control &rest format-args) - (apply #'format (concat "[yas] " format-control) format-args)) - - -;;; Unloading - -(defvar unload-function-defs-list) ; loadhist.el - -(defun yasnippet-unload-function () - "Disable minor modes when calling `unload-feature'." - ;; Disable `yas-minor-mode' everywhere it's enabled. - (yas-global-mode -1) - (save-current-buffer - (dolist (buffer (buffer-list)) - (set-buffer buffer) - (when yas-minor-mode - (yas-minor-mode -1)))) - ;; Remove symbol properties of all our functions, this avoids - ;; Bug#25088 in Emacs 25.1, where the compiler macro on - ;; `cl-defstruct' created functions hang around in the symbol plist - ;; and cause errors when loading again (we don't *need* to clean - ;; *all* symbol plists, but it's easier than being precise). - (dolist (def unload-function-defs-list) - (when (eq (car-safe def) 'defun) - (setplist (cdr def) nil))) - ;; Return nil so that `unload-feature' will take of undefining - ;; functions, and changing any buffers using `snippet-mode'. - nil) - - -;;; Backward compatibility to yasnippet <= 0.7 - -(defun yas-initialize () - "For backward compatibility, enable `yas-minor-mode' globally." - (declare (obsolete "Use (yas-global-mode 1) instead." "0.8")) - (yas-global-mode 1)) - -(defvar yas--backported-syms '(;; `defcustom's - ;; - yas-snippet-dirs - yas-prompt-functions - yas-indent-line - yas-also-auto-indent-first-line - yas-snippet-revival - yas-triggers-in-field - yas-fallback-behavior - yas-choose-keys-first - yas-choose-tables-first - yas-use-menu - yas-trigger-symbol - yas-wrap-around-region - yas-good-grace - yas-visit-from-menu - yas-expand-only-for-last-commands - yas-field-highlight-face - - ;; these vars can be customized as well - ;; - yas-keymap - yas-verbosity - yas-extra-modes - yas-key-syntaxes - yas-after-exit-snippet-hook - yas-before-expand-snippet-hook - yas-buffer-local-condition - yas-dont-activate - - ;; prompting functions - ;; - yas-x-prompt - yas-ido-prompt - yas-no-prompt - yas-completing-prompt - yas-dropdown-prompt - - ;; interactive functions - ;; - yas-expand - yas-minor-mode - yas-global-mode - yas-direct-keymaps-reload - yas-minor-mode-on - yas-load-directory - yas-reload-all - yas-compile-directory - yas-recompile-all - yas-about - yas-expand-from-trigger-key - yas-expand-from-keymap - yas-insert-snippet - yas-visit-snippet-file - yas-new-snippet - yas-load-snippet-buffer - yas-tryout-snippet - yas-describe-tables - yas-next-field-or-maybe-expand - yas-next-field - yas-prev-field - yas-abort-snippet - yas-exit-snippet - yas-exit-all-snippets - yas-skip-and-clear-or-delete-char - yas-initialize - - ;; symbols that I "exported" for use - ;; in snippets and hookage - ;; - yas-expand-snippet - yas-define-snippets - yas-define-menu - yas-snippet-beg - yas-snippet-end - yas-modified-p - yas-moving-away-p - yas-substr - yas-choose-value - yas-key-to-value - yas-throw - yas-verify-value - yas-field-value - yas-text - yas-selected-text - yas-default-from-field - yas-inside-string - yas-unimplemented - yas-define-condition-cache - yas-hippie-try-expand - - ;; debug definitions - ;; yas-debug-snippet-vars - ;; yas-exterminate-package - ;; yas-debug-test - - ;; testing definitions - ;; yas-should-expand - ;; yas-should-not-expand - ;; yas-mock-insert - ;; yas-make-file-or-dirs - ;; yas-variables - ;; yas-saving-variables - ;; yas-call-with-snippet-dirs - ;; yas-with-snippet-dirs -) - "Backported yasnippet symbols. - -They are mapped to \"yas/*\" variants.") - -(when yas-alias-to-yas/prefix-p - (dolist (sym yas--backported-syms) - (let ((backported (intern (replace-regexp-in-string "\\`yas-" "yas/" (symbol-name sym))))) - (when (boundp sym) - (make-obsolete-variable backported sym "yasnippet 0.8") - (defvaralias backported sym)) - (when (fboundp sym) - (make-obsolete backported sym "yasnippet 0.8") - (defalias backported sym)))) - (make-obsolete 'yas/root-directory 'yas-snippet-dirs "yasnippet 0.8") - (defvaralias 'yas/root-directory 'yas-snippet-dirs)) - -(defvar yas--exported-syms - (let (exported) - (mapatoms (lambda (atom) - (if (and (or (and (boundp atom) - (not (get atom 'byte-obsolete-variable))) - (and (fboundp atom) - (not (get atom 'byte-obsolete-info)))) - (string-match-p "\\`yas-[^-]" (symbol-name atom))) - (push atom exported)))) - exported) - "Exported yasnippet symbols. - -i.e. the ones with \"yas-\" single dash prefix. I will try to -keep them in future yasnippet versions and other elisp libraries -can more or less safely rely upon them.") - - -(provide 'yasnippet) -;; Local Variables: -;; coding: utf-8 -;; indent-tabs-mode: nil -;; End: -;;; yasnippet.el ends here diff --git a/elpa/yasnippet-20200413.2221/yasnippet.elc b/elpa/yasnippet-20200413.2221/yasnippet.elc deleted file mode 100644 index b17ccbb9f6a99f04ae128505c87a8ca3a4f44517..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234854 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

v4nllAZc+=yTG5kP5JVmID7x58`R!?~Sg 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 CMF%th From 3cb275697f8ffb64467fe6b9df00f4ef6abcb299 Mon Sep 17 00:00:00 2001 From: Marcus Kammer <2262664-marcuskammer@users.noreply.gitlab.com> Date: Mon, 20 Apr 2020 19:40:04 +0200 Subject: [PATCH 4/4] Add direnv settings --- .bashrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.bashrc b/.bashrc index c1a51d0b..bacf3596 100644 --- a/.bashrc +++ b/.bashrc @@ -31,3 +31,4 @@ export EDITOR="emacsclient -t" # $EDITOR opens in terminal export TERM="screen-256color" test -s ~/.alias && . ~/.alias || true +eval "$(direnv hook bash)"